ZGlmZiAtLWdpdCBhL2RvY3MvbGFuZ3VhZ2UvZGFydExhbmdTcGVjLnRleCBiL2RvY3MvbGFuZ3VhZ2UvZGFydExhbmdTcGVjLnRleAppbmRleCA5Y2JlYmY3Li5kMzAxYjA3IDEwMDY0NAotLS0gYS9kb2NzL2xhbmd1YWdlL2RhcnRMYW5nU3BlYy50ZXgKKysrIGIvZG9jcy9sYW5ndWFnZS9kYXJ0TGFuZ1NwZWMudGV4CkBAIC01LDcgKzUsNyBAQAogXHVzZXBhY2thZ2V7aHlwZXJyZWZ9CiBcbmV3Y29tbWFuZHtcY29kZX1bMV17e1xzZiAjMX19CiBcdGl0bGV7RGFydCBQcm9ncmFtbWluZyBMYW5ndWFnZSAgU3BlY2lmaWNhdGlvbiBcXAote1xsYXJnZSBWZXJzaW9uIDEuNH19Cit7XGxhcmdlIFZlcnNpb24gMS42fX0KICVcYXV0aG9ye1RoZSBEYXJ0IFRlYW19CiBcYmVnaW57ZG9jdW1lbnR9CiBcbWFrZXRpdGxlCkBAIC0xMjUzLDcgKzEyNTMsNyBAQAogRGVmYXVsdCB2YWx1ZXMgc3BlY2lmaWVkIGluICRrJCB3b3VsZCBiZSBpZ25vcmVkLCBzaW5jZSBpdCBpcyB0aGUge1xlbSBhY3R1YWx9IHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHRvICRrXlxwcmltZSQuIEhlbmNlLCBkZWZhdWx0IHZhbHVlcyBhcmUgZGlzYWxsb3dlZC4KIH0KIAotSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIHJlZGlyZWN0cyB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHZpYSBhIHNlcXVlbmNlIG9mIHJlZGlyZWN0aW9ucy4gJWRvZXMgbm90IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb3IgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGluIGEgZmluaXRlIG51bWJlciBvZiBzdGVwcy4KK0l0IGlzIGEgcnVuLXRpbWUgZXJyb3IgaWYgYSByZWRpcmVjdGluZyBmYWN0b3J5IGNvbnN0cnVjdG9yIHJlZGlyZWN0cyB0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHZpYSBhIHNlcXVlbmNlIG9mIHJlZGlyZWN0aW9ucy4gJWRvZXMgbm90IHJlZGlyZWN0IHRvIGEgbm9uLXJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb3IgdG8gYSBnZW5lcmF0aXZlIGNvbnN0cnVjdG9yIGluIGEgZmluaXRlIG51bWJlciBvZiBzdGVwcy4KIAogJSBNYWtlIHRoaXMgYSBydW50aW1lIGVycm9yIHNvIGRlZmVycmVkIGxvYWRpbmcgd29ya3MKIApAQCAtMTMzMiwxMiArMTMzMiwxOCBAQAogCiBcY29tbWVudGFyeXtBbGwgdGhlIHdvcmsgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IGJlIGhhbmRsZWQgdmlhIGl0cyBpbml0aWFsaXplcnMufQogCi1JdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIGNvbnN0YW50IGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIGJ5IGEgY2xhc3MgdGhhdCBoYXMgYSBub24tZmluYWwgaW5zdGFuY2UgdmFyaWFibGUuIAorSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBpcyBkZWNsYXJlZCBieSBhIGNsYXNzIHRoYXQgaGFzIGEgbm9uLWZpbmFsIGluc3RhbmNlIHZhcmlhYmxlLiAgCiAKIFxjb21tZW50YXJ5ewogVGhlIGFib3ZlIHJlZmVycyB0byBib3RoIGxvY2FsbHkgZGVjbGFyZWQgYW5kIGluaGVyaXRlZCBpbnN0YW5jZSB2YXJpYWJsZXMuCiB9CiAKK0l0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIGEgY29uc3RhbnQgY29uc3RydWN0b3IgaXMgZGVjbGFyZWQgYnkgYSBjbGFzcyAkQyQgaWYgYW55IGluc3RhbmNlIHZhcmlhYmxlIGRlY2xhcmVkIGluICRDJCBpcyBpbml0aWFsaXplZCB3aXRoIGFuIGV4cHJlc3Npb24gdGhhdCBpcyBub3QgYSBjb25zdGFudCBleHByZXNzaW9uLgorCitcY29tbWVudGFyeSB7CitBIHN1cGVyY2xhc3Mgb2YgJEMkIGNhbm5vdCBkZWNsYXJlIHN1Y2ggYW4gaW5pdGlhbGl6ZXIgZWl0aGVyLCBiZWNhdXNlIGl0IG11c3QgbmVjZXNzYXJpbHkgZGVjbGFyZSBjb25zdGFudCBjb25zdHJ1Y3RvciBhcyB3ZWxsICh1bmxlc3MgaXQgaXMgXGNvZGV7T2JqZWN0fSwgd2hpY2ggZGVjbGFyZXMgbm8gaW5zdGFuY2UgdmFyaWFibGVzKS4KK30KKwogVGhlIHN1cGVyaW5pdGlhbGl6ZXIgdGhhdCBhcHBlYXJzLCBleHBsaWNpdGx5IG9yIGltcGxpY2l0bHksIGluIHRoZSBpbml0aWFsaXplciBsaXN0IG9mIGEgY29uc3RhbnQgY29uc3RydWN0b3IgbXVzdCBzcGVjaWZ5IGEgY29uc3RhbnQgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyY2xhc3Mgb2YgdGhlIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjbGFzcyBvciBhIGNvbXBpbGUtdGltZSBlcnJvciBvY2N1cnMuCiAKIEFueSBleHByZXNzaW9uIHRoYXQgYXBwZWFycyB3aXRoaW4gdGhlIGluaXRpYWxpemVyIGxpc3Qgb2YgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBtdXN0IGJlIGEgcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbiwgb3IgYSBjb21waWxlLXRpbWUgZXJyb3Igb2NjdXJzLiAKQEAgLTEzNDUsNyArMTM1MSw3IEBACiBBIHtcZW0gcG90ZW50aWFsbHkgY29uc3RhbnQgZXhwcmVzc2lvbn0gaXMgYW4gZXhwcmVzc2lvbiAkZSQgdGhhdCB3b3VsZCBiZSBhIHZhbGlkIGNvbnN0YW50IGV4cHJlc3Npb24gaWYgYWxsIGZvcm1hbCBwYXJhbWV0ZXJzIG9mICRlJCdzIGltbWVkaWF0ZWx5IGVuY2xvc2luZyBjb25zdGFudCBjb25zdHJ1Y3RvciB3ZXJlIHRyZWF0ZWQgYXMgY29tcGlsZS10aW1lIGNvbnN0YW50cyB0aGF0IHdlcmUgZ3VhcmFudGVlZCB0byBldmFsdWF0ZSB0byBhbiBpbnRlZ2VyLCBib29sZWFuIG9yIHN0cmluZyB2YWx1ZSBhcyByZXF1aXJlZCBieSB0aGVpciBpbW1lZGlhdGVseSBlbmNsb3Npbmcgc3VwZXJleHByZXNzaW9uLgogCiBcY29tbWVudGFyeXsKLU5vdGUgdGhhdCBhIHBhcmFtZXRlciB0aGF0IGlzIG5vdCB1c2VkIGluIGFuIHN1cGVyZXhwcmVzc2lvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gY2VydGFpbiB0eXBlcyBjYW4gYmUgYSBjb25zdGFudCBvZiBhbnkgdHlwZS4gRm9yIGV4YW1wbGV9CitOb3RlIHRoYXQgYSBwYXJhbWV0ZXIgdGhhdCBpcyBub3QgdXNlZCBpbiBhIHN1cGVyZXhwcmVzc2lvbiB0aGF0IGlzIHJlc3RyaWN0ZWQgdG8gY2VydGFpbiB0eXBlcyBjYW4gYmUgYSBjb25zdGFudCBvZiBhbnkgdHlwZS4gRm9yIGV4YW1wbGV9CiAKIFxiZWdpbntkYXJ0Q29kZX0KIFxDTEFTU3t9IEEgXHsKQEAgLTE0NzksNyArMTQ4NSw3IEBACiBcc3Vic2VjdGlvbntTdXBlcmNsYXNzZXN9CiBcbGFiZWx7c3VwZXJjbGFzc2VzfQogCi1UaGUgc3VwZXJjbGFzcyBvZiBhIGNsYXNzICRDJCB0aGF0IGhhcyBhIHdpdGggY2xhdXNlIFxjb2Rle1xXSVRIe30gJE1fMSwgXGxkb3RzLCBNX2skfSBhbmQgYW4gZXh0ZW5kcyBjbGF1c2UgXGNvZGV7XEVYVEVORFN7fSBTfSBpcyB0aGUgYXBwbGljYXRpb24gb2YgbWl4aW4gKFxyZWZ7bWl4aW5zfSkgJE1fayogXGNkb3RzICogTV8xJCAgdG8gUy4gIElmIG5vIHdpdGggY2xhdXNlIGlzIHNwZWNpZmllZCB0aGVuICB0aGUgXEVYVEVORFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIGl0cyBzdXBlcmNsYXNzLiBJZiBubyBcRVhURU5EU3t9IGNsYXVzZSBpcyBzcGVjaWZpZWQsIHRoZW4gZWl0aGVyOgorVGhlIHN1cGVyY2xhc3Mgb2YgYSBjbGFzcyAkQyQgdGhhdCBoYXMgYSB3aXRoIGNsYXVzZSBcY29kZXtcV0lUSHt9ICRNXzEsIFxsZG90cywgTV9rJH0gYW5kIGFuIGV4dGVuZHMgY2xhdXNlIFxjb2Rle1xFWFRFTkRTe30gU30gaXMgdGhlIGFwcGxpY2F0aW9uIG9mIG1peGluIChccmVme21peGluc30pICRNX2sqIFxjZG90cyAqIE1fMSQgIHRvIFMuICBJZiBubyBcV0lUSHt9IGNsYXVzZSBpcyBzcGVjaWZpZWQgdGhlbiAgdGhlIFxFWFRFTkRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyBpdHMgc3VwZXJjbGFzcy4gSWYgbm8gXEVYVEVORFN7fSBjbGF1c2UgaXMgc3BlY2lmaWVkLCB0aGVuIGVpdGhlcjoKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gJEMkIGlzIFxjb2Rle09iamVjdH0sIHdoaWNoIGhhcyBubyBzdXBlcmNsYXNzLiBPUgogXGl0ZW0gQ2xhc3MgJEMkIGlzICBkZWVtZWQgdG8gaGF2ZSBhbiBcRVhURU5EU3t9IGNsYXVzZSBvZiB0aGUgZm9ybSBcY29kZXtcRVhURU5EU3t9IE9iamVjdH0sIGFuZCB0aGUgcnVsZXMgYWJvdmUgYXBwbHkuIApAQCAtMTQ5OSw3ICsxNTA1LDcgQEAKICV9IAogCiAlSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBcRVhURU5EU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBpbmNsdWRlcyBhIHR5cGUgZXhwcmVzc2lvbiB0aGF0IGRvZXMgbm90IGRlbm90ZSBhIGNsYXNzIGF2YWlsYWJsZSBpbiB0aGUgbGV4aWNhbCBzY29wZSBvZiAkQyQuIAotSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBcRVhURU5EU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgYSBtYWxmb3JtZWQgIHR5cGUgYXMgYSBzdXBlcmNsYXNzLgorSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBcRVhURU5EU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgYSBtYWxmb3JtZWQgIHR5cGUgb3IgYSBkZWZlcnJlZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkgYXMgYSBzdXBlcmNsYXNzLgogJSB0b28gc3RyaWN0PyBEbyB3ZSBlIHdhbnQgZXh0ZW5kcyBMaXN0PFVuZGVjbGFyZWQ+IHRvIHdvcmsgYXMgTGlzdDxkeW5hbWljPj8gCiAKIFxjb21tZW50YXJ5eyBUaGUgdHlwZSBwYXJhbWV0ZXJzIG9mIGEgZ2VuZXJpYyBjbGFzcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBsZXhpY2FsIHNjb3BlIG9mIHRoZSBzdXBlcmNsYXNzIGNsYXVzZSwgcG90ZW50aWFsbHkgc2hhZG93aW5nIGNsYXNzZXMgaW4gdGhlIHN1cnJvdW5kaW5nIHNjb3BlLiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdGhlcmVmb3JlIGlsbGVnYWwgYW5kIHNob3VsZCBjYXVzZSBhIGNvbXBpbGUtdGltZSBlcnJvcjoKQEAgLTE2MjIsNyArMTYyOCw3IEBACiAgICAgLgogXGVuZHtncmFtbWFyfQogCi1JdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlIFxJTVBMRU1FTlRTe30gIGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgYSB0eXBlIHZhcmlhYmxlIGFzIGEgc3VwZXJpbnRlcmZhY2UuIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgIFxJTVBMRU1FTlRTe30gY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyAgYSBtYWxmb3JtZWQgdHlwZSBhcyBhIHN1cGVyaW50ZXJmYWNlICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgXElNUExFTUVOVFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIHR5cGUgXERZTkFNSUN7fSBhcyBhIHN1cGVyaW50ZXJmYWNlLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlICBcSU1QTEVNRU5UU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgIGEgdHlwZSAkVCQgYXMgYSBzdXBlcmludGVyZmFjZSBtb3JlIHRoYW4gb25jZS4KK0l0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmICB0aGUgXElNUExFTUVOVFN7fSAgY2xhdXNlIG9mIGEgY2xhc3MgJEMkIHNwZWNpZmllcyBhIHR5cGUgdmFyaWFibGUgYXMgYSBzdXBlcmludGVyZmFjZS4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSAgXElNUExFTUVOVFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzICBhIG1hbGZvcm1lZCB0eXBlIG9yIGRlZmVycmVkIHR5cGUgKFxyZWZ7c3RhdGljVHlwZXN9KSBhcyBhIHN1cGVyaW50ZXJmYWNlICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiB0aGUgXElNUExFTUVOVFN7fSBjbGF1c2Ugb2YgYSBjbGFzcyAkQyQgc3BlY2lmaWVzIHR5cGUgXERZTkFNSUN7fSBhcyBhIHN1cGVyaW50ZXJmYWNlLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAgdGhlICBcSU1QTEVNRU5UU3t9IGNsYXVzZSBvZiBhIGNsYXNzICRDJCBzcGVjaWZpZXMgIGEgdHlwZSAkVCQgYXMgYSBzdXBlcmludGVyZmFjZSBtb3JlIHRoYW4gb25jZS4KIEl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBzdXBlcmNsYXNzIG9mIGEgY2xhc3MgJEMkIGlzIHNwZWNpZmllZCBhcyBhIHN1cGVyaW50ZXJmYWNlIG9mICRDJC4KIAogXHJhdGlvbmFsZXsKQEAgLTE3ODgsNyArMTc5NCw4IEBACiBcc3Vic2VjdGlvbntNaXhpbiBBcHBsaWNhdGlvbn0KIFxsYWJlbHttaXhpbkFwcGxpY2F0aW9ufQogCi1BIG1peGluIG1heSBiZSBhcHBsaWVkIHRvIGEgc3VwZXJjbGFzcywgeWllbGRpbmcgYSBuZXcgY2xhc3MuIE1peGluIGFwcGxpY2F0aW9uIG9jY3VycyB3aGVuIGEgbWl4aW4gaXMgbWl4ZWQgaW50byBhIGNsYXNzIGRlY2xhcmF0aW9uIHZpYSBpdHMgXFdJVEh7fSBjbGF1c2UuICBUaGUgbWl4aW4gYXBwbGljYXRpb24gbWF5IGJlIHVzZWQgdG8gZXh0ZW5kIGEgY2xhc3MgcGVyIHNlY3Rpb24gKFxyZWZ7Y2xhc3Nlc30pOyBhbHRlcm5hdGVseSwgYSBjbGFzcyBtYXkgYmUgZGVmaW5lZCBhcyBhIG1peGluIGFwcGxpY2F0aW9uIGFzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24uCitBIG1peGluIG1heSBiZSBhcHBsaWVkIHRvIGEgc3VwZXJjbGFzcywgeWllbGRpbmcgYSBuZXcgY2xhc3MuIE1peGluIGFwcGxpY2F0aW9uIG9jY3VycyB3aGVuIGEgbWl4aW4gaXMgbWl4ZWQgaW50byBhIGNsYXNzIGRlY2xhcmF0aW9uIHZpYSBpdHMgXFdJVEh7fSBjbGF1c2UuICBUaGUgbWl4aW4gYXBwbGljYXRpb24gbWF5IGJlIHVzZWQgdG8gZXh0ZW5kIGEgY2xhc3MgcGVyIHNlY3Rpb24gKFxyZWZ7Y2xhc3Nlc30pOyBhbHRlcm5hdGVseSwgYSBjbGFzcyBtYXkgYmUgZGVmaW5lZCBhcyBhIG1peGluIGFwcGxpY2F0aW9uIGFzIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24uICAgSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgdGhlIFxXSVRIe30gY2xhdXNlIG9mIGEgbWl4aW4gYXBwbGljYXRpb24gJEMkIGluY2x1ZGVzIGEgZGVmZXJyZWQgdHlwZSBleHByZXNzaW9uLgorCiAKIFxiZWdpbntncmFtbWFyfQoge1xiZiAgbWl4aW5BcHBsaWNhdGlvbkNsYXNzOn0KQEAgLTIxMTIsMTcgKzIxMTksMTcgQEAKIFxyYXRpb25hbGV7SXQgd291bGQgYmUgdGVtcHRpbmcgdG8gYWxsb3cgc3RyaW5nIGludGVycG9sYXRpb24gd2hlcmUgdGhlIGludGVycG9sYXRlZCB2YWx1ZSBpcyBhbnkgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgSG93ZXZlciwgdGhpcyB3b3VsZCByZXF1aXJlIHJ1bm5pbmcgdGhlIFxjb2Rle3RvU3RyaW5nKCl9IG1ldGhvZCBmb3IgY29uc3RhbnQgb2JqZWN0cywgd2hpY2ggY291bGQgY29udGFpbiBhcmJpdHJhcnkgY29kZS59CiBcaXRlbSBBIGxpdGVyYWwgc3ltYm9sIChccmVme3N5bWJvbHN9KS4KIFxpdGVtIFxOVUxMe30gKFxyZWZ7bnVsbH0pLgotXGl0ZW0gQSBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgc3RhdGljIGNvbnN0YW50IHZhcmlhYmxlIChccmVme3ZhcmlhYmxlc30pLiAKLVxjb21tZW50YXJ5IHtGb3IgZXhhbXBsZSwgSWYgY2xhc3MgQyBkZWNsYXJlcyBhIGNvbnN0YW50IHN0YXRpYyB2YXJpYWJsZSB2LCBDLnYgaXMgYSBjb25zdGFudC4gVGhlIHNhbWUgaXMgdHJ1ZSBpZiBDIGlzIGFjY2Vzc2VkIHZpYSBhIHByZWZpeCBwOyBwLkMudiBpcyBhIGNvbnN0YW50LgorXGl0ZW0gQSBxdWFsaWZpZWQgcmVmZXJlbmNlIHRvIGEgc3RhdGljIGNvbnN0YW50IHZhcmlhYmxlIChccmVme3ZhcmlhYmxlc30pIHRoYXQgaXMgbm90IHF1YWxpZmllZCBieSBhIGRlZmVycmVkIHByZWZpeC4gCitcY29tbWVudGFyeSB7Rm9yIGV4YW1wbGUsIElmIGNsYXNzIEMgZGVjbGFyZXMgYSBjb25zdGFudCBzdGF0aWMgdmFyaWFibGUgdiwgQy52IGlzIGEgY29uc3RhbnQuIFRoZSBzYW1lIGlzIHRydWUgaWYgQyBpcyBhY2Nlc3NlZCB2aWEgYSBwcmVmaXggcDsgcC5DLnYgaXMgYSBjb25zdGFudCAgdW5sZXNzIHAgaXMgYSBkZWZlcnJlZCBwcmVmaXguCiB9CiBcaXRlbSBBbiBpZGVudGlmaWVyIGV4cHJlc3Npb24gdGhhdCBkZW5vdGVzIGEgY29uc3RhbnQgdmFyaWFibGUuICVDSEFOR0UgaW4gZ29vZ2xlZG9jCiBcaXRlbSBBIHNpbXBsZSBvciBxdWFsaWZpZWQgaWRlbnRpZmllciBkZW5vdGluZyBhIGNsYXNzIG9yIGEgdHlwZSBhbGlhcy4gCiBcY29tbWVudGFyeSB7Rm9yIGV4YW1wbGUsIGlmIEMgaXMgYSBjbGFzcyBvciB0eXBlZGVmIEMgaXMgYSBjb25zdGFudCwgYW5kIGlmIEMgaXMgaW1wb3J0ZWQgd2l0aCBhIHByZWZpeCBwLCAgcC5DIGlzIGEgY29uc3RhbnQuCiB9Ci1caXRlbSBBIGNvbnN0YW50IGNvbnN0cnVjdG9yIGludm9jYXRpb24gKFxyZWZ7Y29uc3R9KS4gIAorXGl0ZW0gQSBjb25zdGFudCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uIChccmVme2NvbnN0fSkgdGhhdCBpcyBub3QgcXVhbGlmaWVkIGJ5IGEgZGVmZXJyZWQgcHJlZml4LiAgCiBcaXRlbSBBIGNvbnN0YW50IGxpc3QgbGl0ZXJhbCAoXHJlZntsaXN0c30pLgogXGl0ZW0gQSBjb25zdGFudCBtYXAgbGl0ZXJhbCAoXHJlZnttYXBzfSkuCi1caXRlbSBBIHNpbXBsZSBvciBxdWFsaWZpZWQgaWRlbnRpZmllciBkZW5vdGluZyBhIHRvcC1sZXZlbCBmdW5jdGlvbiAoXHJlZntmdW5jdGlvbnN9KSBvciBhIHN0YXRpYyBtZXRob2QgKFxyZWZ7c3RhdGljTWV0aG9kc30pLgorXGl0ZW0gQSBzaW1wbGUgb3IgcXVhbGlmaWVkIGlkZW50aWZpZXIgZGVub3RpbmcgYSB0b3AtbGV2ZWwgZnVuY3Rpb24gKFxyZWZ7ZnVuY3Rpb25zfSkgb3IgYSBzdGF0aWMgbWV0aG9kIChccmVme3N0YXRpY01ldGhvZHN9KSB0aGF0IGlzIG5vdCBxdWFsaWZpZWQgYnkgYSBkZWZlcnJlZCBwcmVmaXguCiBcaXRlbSBBIHBhcmVudGhlc2l6ZWQgZXhwcmVzc2lvbiBcY29kZXsoJGUkKX0gd2hlcmUgJGUkIGlzIGEgY29uc3RhbnQgZXhwcmVzc2lvbi4KIFxpdGVtIEFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gXGNvZGV7aWRlbnRpY2FsKCRlXzEkLCAkZV8yJCl9IHdoZXJlICRlXzEkIGFuZCAkZV8yJCBhcmUgY29uc3RhbnQgZXhwcmVzc2lvbnMgIGFuZCBcY29kZXtpZGVudGljYWwoKX0gaXMgc3RhdGljYWxseSBib3VuZCB0byB0aGUgcHJlZGVmaW5lZCBkYXJ0IGZ1bmN0aW9uICAgXGNvZGV7aWRlbnRpY2FsKCl9IGRpc2N1c3NlZCBhYm92ZSAoXHJlZntvYmplY3RJZGVudGl0eX0pLgogXGl0ZW0gQW4gZXhwcmVzc2lvbiBvZiBvbmUgb2YgdGhlIGZvcm1zICBcY29kZXskZV8xJCA9PSAkZV8yJH0gb3IgIFxjb2RleyRlXzEkICE9ICRlXzIkfSB3aGVyZSAkZV8xJCBhbmQgJGVfMiQgYXJlIGNvbnN0YW50IGV4cHJlc3Npb25zIHRoYXQgZXZhbHVhdGUgdG8gYSBudW1lcmljLCBzdHJpbmcgb3IgYm9vbGVhbiB2YWx1ZSBvciB0byBcTlVMTHt9LgpAQCAtMjgxNyw2ICsyODI0LDggQEAKIAogRmlyc3QsIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBldmFsdWF0ZWQuIAogCitJZiAkVCQgaXMgYSBkZWZlcnJlZCB0eXBlIHdpdGggcHJlZml4ICRwJCwgdGhlbiBpZiAkcCQgaGFzIG5vdCBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIGEgZHluYW1pYyBlcnJvciBvY2N1cnMuCisKIFRoZW4sIGlmICRxJCBpcyBhIG5vbi1mYWN0b3J5IGNvbnN0cnVjdG9yIG9mIGFuIGFic3RyYWN0IGNsYXNzIHRoZW4gYW4gXGNvZGV7QWJzdHJhY3RDbGFzc0luc3RhbnRpYXRpb25FcnJvcn0gaXMgdGhyb3duLgogCiBJZiAkVCQgIGlzIG1hbGZvcm1lZCBvciBpZiAkVCQgaXMgYSB0eXBlIHZhcmlhYmxlIGEgZHluYW1pYyBlcnJvciBvY2N1cnMuIEluIGNoZWNrZWQgbW9kZSwgaWYgJFQkIG9yIGFueSBvZiBpdHMgc3VwZXJjbGFzc2VzIGlzIG1hbGJvdW5kZWQgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4KQEAgLTI4MzgsNyArMjg0Nyw4IEBACiAKIElmICRxJCBpcyBhIHJlZGlyZWN0aW5nIGZhY3RvcnkgY29uc3RydWN0b3Igb2YgdGhlIGZvcm0gJFQocF8xLCBcbGRvdHMsIHBfe24ra30pID0gYzskIG9yIG9mIHRoZSBmb3JtICAkVC5pZChwXzEsIFxsZG90cywgcF97bitrfSkgPSBjOyQgdGhlbiB0aGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG9mICRlJCBpcyBlcXVpdmFsZW50IHRvIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gCiAKLSRbVl8xLCAgXGxkb3RzLCBWX20vVF8xLCAgXGxkb3RzLCBUX21dKCRcY29kZXtcTkVXe30gJGMoYV8xLCBcbGRvdHMsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzLCB4X3tuK2t9OiBhX3tuK2t9KSkkfS4KKyRbVl8xLCAgXGxkb3RzLCBWX20vVF8xLCAgXGxkb3RzLCBUX21dKCRcY29kZXtcTkVXe30gJGMoYV8xLCBcbGRvdHMsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzLCB4X3tuK2t9OiBhX3tuK2t9KSkkfS4gIElmIGV2YWx1YXRpb24gb2YgJHEkIGNhdXNlcyAkcSQgdG8gYmUgcmUtZXZhbHVhdGVkIGN5Y2xpY2FsbHksIGEgcnVudGltZSBlcnJvciBvY2N1cnMuCisKIAogT3RoZXJ3aXNlLCB0aGUgYm9keSBvZiAkcSQgaXMgZXhlY3V0ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiaW5kaW5ncyB0aGF0IHJlc3VsdGVkIGZyb20gdGhlIGV2YWx1YXRpb24gb2YgdGhlIGFyZ3VtZW50IGxpc3QgYW5kIHRoZSB0eXBlIHBhcmFtZXRlcnMgKGlmIGFueSkgb2YgJHEkIGJvdW5kIHRvIHRoZSBhY3R1YWwgdHlwZSBhcmd1bWVudHMgJFZfMSwgXGxkb3RzLCBWX2wkIHJlc3VsdGluZyBpbiBhbiBvYmplY3QgJGkkLiBUaGUgcmVzdWx0IG9mIHRoZSBldmFsdWF0aW9uIG9mICRlJCBpcyAkaSQuCiAKQEAgLTI4NzksNyArMjg4OSw3IEBACiAKIFxDT05TVHt9ICRULmlkKGFfMSwgXGxkb3RzICwgYV9uLCB4X3tuKzF9OiBhX3tuKzF9LCBcbGRvdHMgLCB4X3tuK2t9OiBhX3tuK2t9KSQgCiAKLW9yIHRoZSBmb3JtICBcQ09OU1R7fSAkVChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgZG9lcyBub3QgZGVub3RlIGEgY2xhc3MgYWNjZXNzaWJsZSBpbiB0aGUgY3VycmVudCBzY29wZS4gCitvciB0aGUgZm9ybSAgXENPTlNUe30gJFQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgJFQkIGRvZXMgbm90IGRlbm90ZSBhIGNsYXNzIGFjY2Vzc2libGUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiAkVCQgaXMgYSBkZWZlcnJlZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkuCiAKIFxjb21tZW50YXJ5e0luIHBhcnRpY3VsYXIsICRUJCBtYXkgbm90IGJlIGEgdHlwZSB2YXJpYWJsZS59CiAKQEAgLTMxNDgsNiArMzE1OCwxNCBAQAogCiB3aGVyZSAkaWQkIGlzIGFuIGlkZW50aWZpZXIgb3IgYW4gaWRlbnRpZmllciBxdWFsaWZpZWQgd2l0aCBhIGxpYnJhcnkgcHJlZml4LiAKIAorSWYgJGlkJCBpcyBxdWFsaWZpZWQgd2l0aCBhIGRlZmVycmVkIHByZWZpeCAkcCQgYW5kICRwJCBoYXMgbm90IGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgdGhlbjoKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0KK0lmIHRoZSBpbnZvY2F0aW9uIGhhcyB0aGUgZm9ybSAkcCRcY29kZXsubG9hZExpYnJhcnkoKX0gdGhlbiBhbiBhdHRlbXB0IHRvIGxvYWQgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgdGhlIHByZWZpeCAkcCQgaXMgaW5pdGlhdGVkIGFzIGRpc2N1c3NlZCBpbiBzZWN0aW9uIFxyZWZ7aW1wb3J0c30uIAorXGl0ZW0KKyBPdGhlcndpc2UsIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4KKyBcZW5ke2l0ZW1pemV9CisKIElmIHRoZXJlIGV4aXN0cyBhIGxleGljYWxseSB2aXNpYmxlIGRlY2xhcmF0aW9uIG5hbWVkICRpZCQsIGxldCAkZl97aWR9JCBiZSB0aGUgaW5uZXJtb3N0IHN1Y2ggZGVjbGFyYXRpb24uIFRoZW46CiBcYmVnaW57aXRlbWl6ZX0KIFxpdGVtCkBAIC0zMzA1LDcgKzMzMjMsOCBAQAogCiBFdmFsdWF0aW9uIG9mICRpJCBwcm9jZWVkcyBhcyBmb2xsb3dzOgogCi1JZiAkQyQgZG9lcyBub3QgZGVjbGFyZSBhIHN0YXRpYyBtZXRob2Qgb3IgZ2V0dGVyICRtJCB0aGVuIHRoZSBhcmd1bWVudCBsaXN0ICQoYV8xLCBcbGRvdHMgLCBhX24sIHhfe24rMX06IGFfe24rMX0sIFxsZG90cyAsIHhfe24ra306IGFfe24ra30pJCBpcyBldmFsdWF0ZWQsIGFmdGVyIHdoaWNoIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4gCitJZiAkQyQgaXMgYSBkZWZlcnJlZCB0eXBlICAoXHJlZntzdGF0aWNUeXBlc30pIHdpdGggcHJlZml4ICRwJCwgYW5kICRwJCBoYXMgbm90IGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgb3IKK2lmICRDJCBkb2VzIG5vdCBkZWNsYXJlIGEgc3RhdGljIG1ldGhvZCBvciBnZXR0ZXIgJG0kIHRoZW4gdGhlIGFyZ3VtZW50IGxpc3QgJChhXzEsIFxsZG90cyAsIGFfbiwgeF97bisxfTogYV97bisxfSwgXGxkb3RzICwgeF97bitrfTogYV97bitrfSkkIGlzIGV2YWx1YXRlZCwgYWZ0ZXIgd2hpY2ggYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLiAKIAogT3RoZXJ3aXNlLCBldmFsdWF0aW9uIHByb2NlZWRzIGFzIGZvbGxvd3M6CiBcYmVnaW57aXRlbWl6ZX0KQEAgLTM0MzEsOCArMzQ1MCwxOCBAQAogXGVuZHtpdGVtaXplfQogVGhlbiB0aGUgbWV0aG9kIFxjb2Rle25vU3VjaE1ldGhvZCgpfSBpcyBsb29rZWQgdXAgaW4gJFMkIGFuZCBpbnZva2VkICB3aXRoIGFyZ3VtZW50ICRpbSQsIGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgaW52b2NhdGlvbiBpcyB0aGUgcmVzdWx0IG9mIGV2YWx1YXRpbmcgJGkkLgogCisKKwogSXQgaXMgYSBzdGF0aWMgdHlwZSB3YXJuaW5nIGlmICRTJCBkb2VzIG5vdCBoYXZlIGEgZ2V0dGVyIG5hbWVkICRtJC4gIFRoZSBzdGF0aWMgdHlwZSBvZiAkaSQgaXMgdGhlIGRlY2xhcmVkIHJldHVybiB0eXBlIG9mICRTLm0kLCBpZiAkUy5tJCBleGlzdHM7IG90aGVyd2lzZSB0aGUgc3RhdGljIHR5cGUgb2YgJGkkICBpcyAgXERZTkFNSUN7fS4gCiAKK0V2YWx1YXRpb24gb2YgYSBnZXR0ZXIgaW52b2NhdGlvbiBvZiB0aGUgZm9ybSAkcC5DLnYkLCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXgsIHByb2NlZWRzIGFzIGZvbGxvd3M6CisKK0lmICRwJCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLCB0aGUgYXNzaWdubWVudCBpcyBldmFsdWF0ZWQgZXhhY3RseSBsaWtlIHRoZSBpbnZvY2F0aW9uICRLLnYkLCB3aGVyZSAkSyQgZGVub3RlcyB0aGUgdG9wIGxldmVsIG1lbWJlciAkQyQgb2YgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgJHAkLiBPdGhlcndpc2UgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLgorCisKK0V2YWx1YXRpb24gb2YgYSB0b3AtbGV2ZWwgZ2V0dGVyIGludm9jYXRpb24gJGkkIG9mIHRoZSBmb3JtICRwLm0kLCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXggYW5kICAkbSQgaXMgYW4gaWRlbnRpZmllciwgcHJvY2VlZHMgYXMgZm9sbG93czoKKworSWYgJHAkIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBpbnZvY2F0aW9uIGlzIGV2YWx1YXRlZCBleGFjdGx5IGxpa2UgdGhlIGludm9jYXRpb24gJHckLCB3aGVyZSAkdyQgZGVub3RlcyB0aGUgdG9wIGxldmVsIG1lbWJlciBuYW1lZCAkbSQgb2YgdGhlIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgJHAkLiBPdGhlcndpc2UgYSBcY29kZXtOb1N1Y2hNZXRob2RFcnJvcn0gaXMgdGhyb3duLgogIAogCiAKQEAgLTM1MDcsNiArMzUzNiwxNCBAQAogCiBUaGVuIHRoZSBtZXRob2QgXGNvZGV7bm9TdWNoTWV0aG9kKCl9IGlzIGxvb2tlZCB1cCBpbiAkb18xJCBhbmQgaW52b2tlZCAgd2l0aCBhcmd1bWVudCAkaW0kLiBUaGUgdmFsdWUgb2YgdGhlIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBpcyAkb18yJCBpcnJlc3BlY3RpdmUgb2Ygd2hldGhlciBzZXR0ZXIgbG9va3VwIGhhcyBmYWlsZWQgb3Igc3VjY2VlZGVkLgogCitFdmFsdWF0aW9uIG9mIGFuIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJHAudiBcY29kZXs9fSBlJCwgd2hlcmUgJHAkIGlzIGEgZGVmZXJyZWQgcHJlZml4LCBwcm9jZWVkcyBhcyBmb2xsb3dzOgorCitJZiAkcCQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgdGhlIGFzc2lnbm1lbnQgaXMgZXZhbHVhdGVkIGV4YWN0bHkgbGlrZSB0aGUgYXNzaWdubWVudCAkdyBcY29kZXs9fSBlJCwgd2hlcmUgJHckIGRlbm90ZXMgdGhlIHRvcCBsZXZlbCBtZW1iZXIgbmFtZWQgJHYkIG9mIHRoZSBsaWJyYXJ5IHJlcHJlc2VudGVkIGJ5ICRwJC4gT3RoZXJ3aXNlLCAkZSQgaXMgZXZhbHVhdGVkIGFuZCB0aGVuIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4KKworRXZhbHVhdGlvbiBvZiBhbiBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLkMudiBcY29kZXs9fSBlJCwgd2hlcmUgJHAkIGlzIGEgZGVmZXJyZWQgcHJlZml4LCBwcm9jZWVkcyBhcyBmb2xsb3dzOgorCitJZiAkcCQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZCwgdGhlIGFzc2lnbm1lbnQgaXMgZXZhbHVhdGVkIGV4YWN0bHkgbGlrZSB0aGUgYXNzaWdubWVudCAkSy52ID0gZSQsIHdoZXJlICRLJCBkZW5vdGVzIHRoZSB0b3AgbGV2ZWwgbWVtYmVyICRDJCBvZiB0aGUgbGlicmFyeSByZXByZXNlbnRlZCBieSAkcCQuIE90aGVyd2lzZSAkZSQgaXMgZXZhbHVhdGVkIGFuZCB0aGVuIGEgXGNvZGV7Tm9TdWNoTWV0aG9kRXJyb3J9IGlzIHRocm93bi4KKwogSW4gY2hlY2tlZCBtb2RlLCBpdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiAkb18yJCBpcyBub3QgXE5VTEx7fSBhbmQgdGhlIGludGVyZmFjZSBvZiB0aGUgY2xhc3Mgb2YgJG9fMiQgaXMgbm90IGEgc3VidHlwZSBvZiB0aGUgYWN0dWFsIHR5cGUgb2YgJGVfMS52JC4KIAogTGV0ICRUJCBiZSB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMSQuIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiAkVCQgZG9lcyBub3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIGluc3RhbmNlIHNldHRlciBuYW1lZCAkdj0kIHVubGVzcyAkVCQgb3IgYSBzdXBlcmludGVyZmFjZSBvZiAkVCQgaXMgYW5ub3RhdGVkIHdpdGggYW4gYW5ub3RhdGlvbiBkZW5vdGluZyBhIGNvbnN0YW50IGlkZW50aWNhbCB0byB0aGUgY29uc3RhbnQgXGNvZGV7QHByb3h5fSBkZWZpbmVkIGluIFxjb2Rle2RhcnQ6Y29yZX0uIEl0IGlzIGEgc3RhdGljIHR5cGUgd2FybmluZyBpZiB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQgbWF5IG5vdCBiZSBhc3NpZ25lZCB0byAkVCQuICAgVGhlIHN0YXRpYyB0eXBlIG9mIHRoZSBleHByZXNzaW9uICRlXzF2JCBcY29kZXs9fSAkZV8yJCBpcyB0aGUgc3RhdGljIHR5cGUgb2YgJGVfMiQuCkBAIC0zNTIzLDcgKzM1NjAsOCBAQAogXGxhYmVse2NvbXBvdW5kQXNzaWdubWVudH0KIAogQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICR2JCAkb3BcY29kZXs9fSBlJCBpcyBlcXVpdmFsZW50IHRvICR2IFxjb2Rlez19IHYkICRvcCQgJGUkLiBBIGNvbXBvdW5kIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJEMudiQgJG9wIFxjb2Rlez19IGUkIGlzIGVxdWl2YWxlbnQgdG8gJEMudiBcY29kZXs9fSBDLnYkICRvcCQgJGUkLiBBIGNvbXBvdW5kIGFzc2lnbm1lbnQgb2YgdGhlIGZvcm0gJGVfMS52JCAkb3AgPSBlXzIkIGlzIGVxdWl2YWxlbnQgdG8gXGNvZGV7KCh4KSAkPT4kIHgudiA9IHgudiAkb3AkICRlXzIkKSgkZV8xJCl9IHdoZXJlICR4JCBpcyBhIHZhcmlhYmxlIHRoYXQgaXMgbm90IHVzZWQgaW4gJGVfMiQuIEEgY29tcG91bmQgYXNzaWdubWVudCBvZiB0aGUgZm9ybSAgJGVfMVtlXzJdJCAkb3BcY29kZXs9fSBlXzMkIGlzIGVxdWl2YWxlbnQgdG8gCi1cY29kZXsoKGEsIGkpICQ9PiQgYVtpXSA9IGFbaV0gJG9wJCAkZV8zJCkoJGVfMSwgZV8yJCl9IHdoZXJlICRhJCBhbmQgJGkkIGFyZSBhIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiAkZV8zJC4gCitcY29kZXsoKGEsIGkpICQ9PiQgYVtpXSA9IGFbaV0gJG9wJCAkZV8zJCkoJGVfMSwgZV8yJCl9IHdoZXJlICRhJCBhbmQgJGkkIGFyZSBhIHZhcmlhYmxlcyB0aGF0IGFyZSBub3QgdXNlZCBpbiAkZV8zJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLnYkICRvcFxjb2Rlez19IGUkLCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXgsICBpcyBlcXVpdmFsZW50IHRvICRwLnYgXGNvZGV7PX0gcC52JCAkb3AkICRlJC4gQSBjb21wb3VuZCBhc3NpZ25tZW50IG9mIHRoZSBmb3JtICRwLkMudiQgJG9wXGNvZGV7PX0gZSQsIHdoZXJlICRwJCBpcyBhIGRlZmVycmVkIHByZWZpeCwgIGlzIGVxdWl2YWxlbnQgdG8gJHAuQy52IFxjb2Rlez19IHAuQy52JCAkb3AkICRlJC4KKwogCiBcYmVnaW57Z3JhbW1hcn0KIHtcYmYgY29tcG91bmRBc3NpZ25tZW50T3BlcmF0b3I6fWAqPSc7CkBAIC00MDcyLDcgKzQxMTAsNyBAQAogIAogIEV2YWx1YXRpb24gb2YgdGhlIGlzLWV4cHJlc3Npb24gXGNvZGV7JGUkIFxJU3t9ICRUJH0gcHJvY2VlZHMgYXMgZm9sbG93czoKIAotVGhlIGV4cHJlc3Npb24gJGUkIGlzIGV2YWx1YXRlZCB0byBhIHZhbHVlICR2JC4gVGhlbiwgaWYgJFQkIGlzIG1hbGZvcm1lZCwgYSBkeW5hbWljIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCBpZiB0aGUgaW50ZXJmYWNlIG9mIHRoZSBjbGFzcyBvZiAkdiQgaXMgYSBzdWJ0eXBlIG9mICRUJCwgdGhlIGlzLWV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUuIE90aGVyd2lzZSBpdCBldmFsdWF0ZXMgdG8gZmFsc2UuCitUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGEgdmFsdWUgJHYkLiBUaGVuLCBpZiAkVCQgaXMgYSBtYWxmb3JtZWQgb3IgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIGlmIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICR2JCBpcyBhIHN1YnR5cGUgb2YgJFQkLCB0aGUgaXMtZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4gT3RoZXJ3aXNlIGl0IGV2YWx1YXRlcyB0byBmYWxzZS4KIAogXGNvbW1lbnRhcnl7SXQgZm9sbG93cyB0aGF0IFxjb2RleyRlJCBcSVN7fSBPYmplY3R9IGlzIGFsd2F5cyB0cnVlLiBUaGlzIG1ha2VzIHNlbnNlIGluIGEgbGFuZ3VhZ2Ugd2hlcmUgZXZlcnl0aGluZyBpcyBhbiBvYmplY3QuIAogCkBAIC00MTE3LDcgKzQxNTUsNyBAQAogIAogIEV2YWx1YXRpb24gb2YgdGhlIGNhc3QgZXhwcmVzc2lvbiBcY29kZXskZSQgXEFTe30gJFQkfSBwcm9jZWVkcyBhcyBmb2xsb3dzOgogCi1UaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGEgdmFsdWUgJHYkLiBUaGVuLCBpZiAkVCQgaXMgbWFsZm9ybWVkLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIGlmIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICR2JCBpcyBhIHN1YnR5cGUgb2YgJFQkLCB0aGUgY2FzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAkdiQuIE90aGVyd2lzZSwgaWYgJHYkIGlzIFxOVUxMe30sIHRoZSBjYXN0IGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvICR2JC4gCitUaGUgZXhwcmVzc2lvbiAkZSQgaXMgZXZhbHVhdGVkIHRvIGEgdmFsdWUgJHYkLiBUaGVuLCBpZiAkVCQgaXMgYSBtYWxmb3JtZWQgb3IgZGVmZXJyZWQgdHlwZSAoXHJlZntzdGF0aWNUeXBlc30pLCBhIGR5bmFtaWMgZXJyb3Igb2NjdXJzLiBPdGhlcndpc2UsIGlmIHRoZSBpbnRlcmZhY2Ugb2YgdGhlIGNsYXNzIG9mICR2JCBpcyBhIHN1YnR5cGUgb2YgJFQkLCB0aGUgY2FzdCBleHByZXNzaW9uIGV2YWx1YXRlcyB0byAkdiQuIE90aGVyd2lzZSwgaWYgJHYkIGlzIFxOVUxMe30sIHRoZSBjYXN0IGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvICR2JC4gCiBJbiBhbGwgb3RoZXIgY2FzZXMsICBhIFxjb2Rle0Nhc3RFcnJvcn0gaXMgdGhyb3duLgogIAogVGhlIHN0YXRpYyB0eXBlIG9mIGEgY2FzdCBleHByZXNzaW9uICBcY29kZXskZSQgXEFTe30gJFQkfSAgaXMgJFQkLiAKQEAgLTQ1MDUsNyArNDU0Myw3IEBACiBcY29tbWVudGFyeXtJbiBvdGhlciB3b3JkcywgIGFsbCB0aGUgZXhwcmVzc2lvbnMgaW4gdGhlIGNhc2VzIGV2YWx1YXRlIHRvIGNvbnN0YW50cyBvZiB0aGUgZXhhY3Qgc2FtZSB1c2VyIGRlZmluZWQgY2xhc3Mgb3IgYXJlIG9mIGNlcnRhaW4ga25vd24gdHlwZXMuICBOb3RlIHRoYXQgdGhlIHZhbHVlcyBvZiB0aGUgZXhwcmVzc2lvbnMgYXJlIGtub3duIGF0IGNvbXBpbGUtdGltZSwgYW5kIGFyZSBpbmRlcGVuZGVudCBvZiBhbnkgc3RhdGljIHR5cGUgYW5ub3RhdGlvbnMuCiB9CiAKLUl0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBjbGFzcyAkQyQgaGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVyYXRvciAkPT0kIG90aGVyIHRoYW4gdGhlIG9uZSBpbmhlcml0ZWQgZnJvbSBcY29kZXtPYmplY3R9IHVubGVzcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgYSBzdHJpbmcsIGFuIGludGVnZXIsIGxpdGVyYWwgc3ltYm9sIG9yIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBjbGFzcyBcY2R7U3ltYm9sfS4KK0l0IGlzIGEgY29tcGlsZS10aW1lIGVycm9yIGlmIHRoZSBjbGFzcyAkQyQgaGFzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVyYXRvciAkPT0kIG90aGVyIHRoYW4gdGhlIG9uZSBpbmhlcml0ZWQgZnJvbSBcY29kZXtPYmplY3R9IHVubGVzcyB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gaXMgYSBzdHJpbmcsIGFuIGludGVnZXIsIGxpdGVyYWwgc3ltYm9sIG9yIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgYSBjb25zdGFudCBjb25zdHJ1Y3RvciBvZiBjbGFzcyBcY2R7U3ltYm9sfS4KICAKICBccmF0aW9uYWxlewogIFRoZSBwcm9oaWJpdGlvbiBvbiB1c2VyIGRlZmluZWQgZXF1YWxpdHkgYWxsb3dzIHVzIHRvIGltcGxlbWVudCB0aGUgc3dpdGNoIGVmZmljaWVudGx5IGZvciB1c2VyIGRlZmluZWQgdHlwZXMuIFdlIGNvdWxkIGZvcm11bGF0ZSBtYXRjaGluZyBpbiB0ZXJtcyBvZiBpZGVudGl0eSBpbnN0ZWFkIHdpdGggdGhlIHNhbWUgZWZmaWNpZW5jeS4gSG93ZXZlciwgaWYgYSB0eXBlIGRlZmluZXMgYW4gZXF1YWxpdHkgb3BlcmF0b3IsIHByb2dyYW1tZXJzIHdvdWxkIGZpbmQgaXQgcXVpdGUgc3VycHJpc2luZyB0aGF0IGVxdWFsIG9iamVjdHMgZGlkIG5vdCBtYXRjaC4KQEAgLTQ2NjQsMTAgKzQ3MDIsMTAgQEAKIFRoZSBzeW50YXggaXMgZGVzaWduZWQgdG8gYmUgdXB3YXJkIGNvbXBhdGlibGUgd2l0aCBleGlzdGluZyBKYXZhc2NyaXB0IHByb2dyYW1zLiBUaGUgXE9Oe30gY2xhdXNlIGNhbiBiZSBvbWl0dGVkLCBsZWF2aW5nIHdoYXQgbG9va3MgbGlrZSBhIEphdmFzY3JpcHQgY2F0Y2ggY2xhdXNlLgogfQogCi1BbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2Ugb2YgdGhlIGZvcm0gICBcY29kZXtcT057fSAkVCQgXENBVENIe30gKCRwXzEsIHBfMiQpICRzJH0gIHtcZW0gbWF0Y2hlc30gYW4gb2JqZWN0ICRvJCAgaWYgdGhlIHR5cGUgb2YgJG8kIGlzIGEgc3VidHlwZSBvZiAkVCQuICBJZiAkVCQgaXMgYSBtYWxmb3JtZWQgdHlwZSwgdGhlbiBwZXJmb3JtaW5nIGEgbWF0Y2ggY2F1c2VzIGEgcnVuIHRpbWUgZXJyb3IuCitBbiBcT057fS1cQ0FUQ0h7fSBjbGF1c2Ugb2YgdGhlIGZvcm0gICBcY29kZXtcT057fSAkVCQgXENBVENIe30gKCRwXzEsIHBfMiQpICRzJH0gIHtcZW0gbWF0Y2hlc30gYW4gb2JqZWN0ICRvJCAgaWYgdGhlIHR5cGUgb2YgJG8kIGlzIGEgc3VidHlwZSBvZiAkVCQuICBJZiAkVCQgaXMgYSBtYWxmb3JtZWQgb3IgZGVmZXJyZWQgdHlwZSAgKFxyZWZ7c3RhdGljVHlwZXN9KSwgdGhlbiBwZXJmb3JtaW5nIGEgbWF0Y2ggY2F1c2VzIGEgcnVuIHRpbWUgZXJyb3IuCiAKIFxjb21tZW50YXJ5IHsKLUl0IGlzIG9mIGNvdXJzZSBhIHN0YXRpYyB3YXJuaW5nIGlmICRUJCBpcyBhIG1hbGZvcm1lZCB0eXBlIChccmVme3N0YXRpY1R5cGVzfSkuCitJdCBpcyBvZiBjb3Vyc2UgYSBzdGF0aWMgd2FybmluZyBpZiAkVCQgaXMgYSBkZWZlcnJlZCBvciBtYWxmb3JtZWQgdHlwZS4KIH0KIAogQW4gXE9Oe30tXENBVENIe30gY2xhdXNlIG9mIHRoZSBmb3JtICAgXGNvZGV7XE9Oe30gJFQkIFxDQVRDSHt9ICgkcF8xLCBwXzIkKSAkcyR9IGludHJvZHVjZXMgYSBuZXcgc2NvcGUgJENTJCBpbiB3aGljaCBsb2NhbCB2YXJpYWJsZXMgc3BlY2lmaWVkIGJ5ICRwXzEkIGFuZCAkcF8yJCBhcmUgZGVmaW5lZC4gVGhlIHN0YXRlbWVudCAkcyQgaXMgZW5jbG9zZWQgd2l0aGluICRDUyQuCkBAIC01MDAyLDkgKzUwNDAsMTQgQEAKIEFuIHtcZW0gaW1wb3J0fSBzcGVjaWZpZXMgYSBsaWJyYXJ5IHRvIGJlIHVzZWQgaW4gdGhlIHNjb3BlIG9mIGFub3RoZXIgbGlicmFyeS4gCiBcYmVnaW57Z3JhbW1hcn0KIHtcYmYgbGlicmFyeUltcG9ydDp9Ci0gICBtZXRhZGF0YSBcSU1QT1JUe30gIHVyaSAoXEFTe30gaWRlbnRpZmllcik/ICBjb21iaW5hdG9yKiBge1xlc2NhcGVncmFtbWFyIDt9JworICAgbWV0YWRhdGEgaW1wb3J0U3BlY2lmaWNhdGlvbgogICAgIC4KLSAgICAKKyAKKyB7XGJmIGltcG9ydFNwZWNpZmljYXRpb246fQorICAgIFxJTVBPUlR7fSAgdXJpIChcQVN7fSBpZGVudGlmaWVyKT8gIGNvbWJpbmF0b3IqIGB7XGVzY2FwZWdyYW1tYXIgO30nOworICAgICBcSU1QT1JUe30gIHVyaSBcREVGRVJSRUR7fSBcQVN7fSBpZGVudGlmaWVyICBjb21iaW5hdG9yKiBge1xlc2NhcGVncmFtbWFyIDt9JworICAgIC4KKyAgICAgICAKIHtcYmYgY29tYmluYXRvcjp9XFNIT1d7fSBpZGVudGlmaWVyTGlzdDsKIFxISURFe30gaWRlbnRpZmllckxpc3QKICAgICAuCkBAIC01MDE0LDE5ICs1MDU3LDYxIEBACiAgXGVuZHtncmFtbWFyfQogIAogCi1BbiBpbXBvcnQgc3BlY2lmaWVzIGEgVVJJICR4JCB3aGVyZSB0aGUgZGVjbGFyYXRpb24gb2YgYW4gaW1wb3J0ZWQgbGlicmFyeSBpcyB0byBiZSBmb3VuZC4gSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBzcGVjaWZpZWQgVVJJIGRvZXMgbm90IHJlZmVyIHRvIGEgbGlicmFyeSBkZWNsYXJhdGlvbi4gIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBVUklzIGlzIGRlc2NyaWJlZCBpbiBzZWN0aW9uIFxyZWZ7dXJpc30gYmVsb3cuCitBbiBpbXBvcnQgc3BlY2lmaWVzIGEgVVJJICR4JCB3aGVyZSB0aGUgZGVjbGFyYXRpb24gb2YgYW4gaW1wb3J0ZWQgbGlicmFyeSBpcyB0byBiZSBmb3VuZC4gCisKK0ltcG9ydHMgbWF5IGJlIHtcZW0gZGVmZXJyZWR9IG9yIHtcZW0gaW1tZWRpYXRlfS4gQSBkZWZlcnJlZCBpbXBvcnQgaXMgZGlzdGluZ3Vpc2hlZCBieSB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgYnVpbHQtaW4gaWRlbnRpZmllciBcREVGRVJSRUR7fSBhZnRlciB0aGUgVVJJLiBBbnkgaW1wb3J0IHRoYXQgaXMgbm90IGRlZmVycmVkIGlzIGltbWVkaWF0ZS4KKworSXQgaXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgIHRoZSBzcGVjaWZpZWQgVVJJIG9mIGFuIGltbWVkaWF0ZSBpbXBvcnQgZG9lcyBub3QgcmVmZXIgdG8gYSBsaWJyYXJ5IGRlY2xhcmF0aW9uLiAgVGhlIGludGVycHJldGF0aW9uIG9mIFVSSXMgaXMgZGVzY3JpYmVkIGluIHNlY3Rpb24gXHJlZnt1cmlzfSBiZWxvdy4KKworSXQgaXMgYSBzdGF0aWMgd2FybmluZyBpZiB0aGUgc3BlY2lmaWVkIFVSSSBvZiBhIGRlZmVycmVkIGltcG9ydCBkb2VzIG5vdCByZWZlciB0byBhIGxpYnJhcnkgZGVjbGFyYXRpb24uCisKK1xyYXRpb25hbGV7CisgT25lIGNhbm5vdCBkZXRlY3QgdGhlIHByb2JsZW0gYXQgY29tcGlsZSB0aW1lIGJlY2F1c2UgY29tcGlsYXRpb24gb2Z0ZW4gb2NjdXJzIGR1cmluZyBleGVjdXRpb24gYW5kICBvbmUgZG9lcyBub3Qga25vdyB3aGF0IHRoZSBVUkkgcmVmZXJzIHRvLiAgSG93ZXZlciB0aGUgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgc2hvdWxkIGRldGVjdCB0aGUgcHJvYmxlbS4KKyB9CisKICAKIFRoZSB7XGVtIGN1cnJlbnQgbGlicmFyeX0gaXMgdGhlIGxpYnJhcnkgY3VycmVudGx5IGJlaW5nIGNvbXBpbGVkLiBUaGUgaW1wb3J0IG1vZGlmaWVzIHRoZSAgbmFtZXNwYWNlIG9mIHRoZSBjdXJyZW50IGxpYnJhcnkgaW4gYSBtYW5uZXIgdGhhdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpbXBvcnRlZCBsaWJyYXJ5IGFuZCBieSB0aGUgb3B0aW9uYWwgZWxlbWVudHMgb2YgIHRoZSBpbXBvcnQuCiAgICAgIAotQW4gaW1wb3J0IGRpcmVjdGl2ZSAkSSQgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZToKLVxiZWdpbntpdGVtaXplfQotXGl0ZW0gQSBwcmVmaXggY2xhdXNlIG9mIHRoZSBmb3JtIFxBU3t9IFxjb2Rle0lkfSB1c2VkIHRvIHByZWZpeCBuYW1lcyBpbXBvcnRlZCBieSAkSSQuCi1caXRlbSBOYW1lc3BhY2UgY29tYmluYXRvciBjbGF1c2VzIHVzZWQgdG8gcmVzdHJpY3QgdGhlIHNldCBvZiBuYW1lcyBpbXBvcnRlZCBieSAkSSQuIEN1cnJlbnRseSwgdHdvIG5hbWVzcGFjZSBjb21iaW5hdG9ycyBhcmUgc3VwcG9ydGVkOiBcSElERXt9IGFuZCBcU0hPV3t9LgotXGVuZHtpdGVtaXplfQorQW4gaW1tZWRpYXRlIGltcG9ydCBkaXJlY3RpdmUgJEkkIG1heSBvcHRpb25hbGx5IGluY2x1ZGUgYSBwcmVmaXggY2xhdXNlIG9mIHRoZSBmb3JtIFxBU3t9IFxjb2Rle0lkfSB1c2VkIHRvIHByZWZpeCBuYW1lcyBpbXBvcnRlZCBieSAkSSQuIEEgZGVmZXJyZWQgaW1wb3J0IG11c3QgaW5jbHVkZSBhIHByZWZpeCBjbGF1c2Ugb3IgYSBjb21waWxlIHRpbWUgZXJyb3Igb2NjdXJzLiBJdCBpcyBhIGNvbXBpbGUtdGltZSBlcnJvciBpZiBhIHByZWZpeCB1c2VkIGluIGEgZGVmZXJyZWQgaW1wb3J0IGlzIHVzZWQgaW4gYW5vdGhlciBpbXBvcnQgY2xhdXNlLgorCitBbiBpbXBvcnQgZGlyZWN0aXZlICRJJCBtYXkgb3B0aW9uYWxseSBpbmNsdWRlIGEgbmFtZXNwYWNlIGNvbWJpbmF0b3IgY2xhdXNlcyB1c2VkIHRvIHJlc3RyaWN0IHRoZSBzZXQgb2YgbmFtZXMgaW1wb3J0ZWQgYnkgJEkkLiBDdXJyZW50bHksIHR3byBuYW1lc3BhY2UgY29tYmluYXRvcnMgYXJlIHN1cHBvcnRlZDogXEhJREV7fSBhbmQgXFNIT1d7fS4KIAogTGV0ICRJJCBiZSBhbiBpbXBvcnQgZGlyZWN0aXZlIHRoYXQgcmVmZXJzIHRvIGEgVVJJIHZpYSB0aGUgc3RyaW5nICRzXzEkLiBFdmFsdWF0aW9uIG9mICRJJCAgcHJvY2VlZHMgYXMgZm9sbG93czoKIAotRmlyc3QsCitJZiAkSSQgaXMgYSBkZWZlcnJlZCBpbXBvcnQsIG5vIGV2YWx1YXRpb24gdGFrZXMgcGxhY2UuIEluc3RlYWQsIHRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGFkZGVkIHRvIHRoZSBzY29wZSBvZiAkTCQ6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtCitUaGUgbmFtZSBvZiB0aGUgcHJlZml4LCAkcCQgZGVub3RpbmcgYSBkZWZlcnJlZCBwcmVmaXggZGVjbGFyYXRpb24uCitcaXRlbQorVGhlIG5hbWUgXGNvZGV7JHAkLmxvYWRMaWJyYXJ5fSwgZGVub3RpbmcgYSB0b3AgbGV2ZWwgZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHMsIHdob3NlIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGJlbG93LgorXGVuZHtpdGVtaXplfQorIAorQSBkZWZlcnJlZCBwcmVmaXggJHAkIG1heSBiZSBsb2FkZWQgZXhwbGljaXRseSB2aWEgdGhlIGZ1bmN0aW9uIGNhbGwgXGNvZGV7JHAkLmxvYWRMaWJyYXJ5fSwgd2hpY2ggcmV0dXJucyBhIGZ1dHVyZSAkZiQuIFRoZSBlZmZlY3Qgb2YgdGhlIGNhbGwgaXMgdG8gY2F1c2UgYW4gaW1tZWRpYXRlIGltcG9ydCAkSdUkIHRvIGJlIGV4ZWN1dGVkIGF0IHNvbWUgZnV0dXJlIHRpbWUsIHdoZXJlICRJ1SQgaXMgaXMgZGVyaXZlZCBmcm9tICRJJCBieSBlbGlkaW5nIHRoZSB3b3JkIFxERUZFUlJFRHt9IGFuZCBhZGRpbmcgYSBcSElERXt9IFxjb2Rle2xvYWRMaWJyYXJ5fSAgY29tYmluYXRvciBjbGF1c2UuIFdoZW4gJEnVJCBleGVjdXRlcyB3aXRob3V0IGVycm9yLCAkZiQgY29tcGxldGVzIHN1Y2Nlc3NmdWxseS4gSWYgJEnVJCBleGVjdXRlcyB3aXRob3V0IGVycm9yLCB3ZSBzYXkgdGhhdCB0aGUgY2FsbCB0byBcY29kZXskcCQubG9hZExpYnJhcnl9IGhhcyBzdWNjZWVkZWQsIG90aGVyd2lzZSB3ZSBzYXkgdGhlIGNhbGwgaGFzIGZhaWxlZC4KKworQWZ0ZXIgYSBjYWxsIHN1Y2NlZWRzLCB0aGUgbmFtZXMgJHAkIGFuZCBcY29kZXskcCQubG9hZExpYnJhcnl9IHJlbWFpbiBpbiB0aGUgdG9wLWxldmVsIHNjb3BlIG9mICRMJCwgYW5kIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGNhbGwgXGNvZGV7bG9hZExpYnJhcnl9IGFnYWluLiBJZiBhIGNhbGwgZmFpbHMsIG5vdGhpbmcgaGFwcGVucywgYW5kIG9uZSBhZ2FpbiBoYXMgdGhlIG9wdGlvbiB0byBjYWxsIFxjb2Rle2xvYWRMaWJyYXJ5fSBhZ2Fpbi4gV2hldGhlciBhIHJlcGVhdGVkIGNhbGwgdG8gXGNvZGV7bG9hZExpYnJhcnl9IHN1Y2NlZWRzIHdpbGwgdmFyeSBhcyBkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBlZmZlY3Qgb2YgYSByZXBlYXRlZCBjYWxsIHRvIFxjb2RleyRwJC5sb2FkTGlicmFyeX0gaXMgYXMgZm9sbG93czoKK1xiZWdpbntpdGVtaXplfQorXGl0ZW0KK0lmIGFub3RoZXIgY2FsbCB0byBcY29kZXskcCQubG9hZExpYnJhcnl9IGhhcyBhbHJlYWR5IHN1Y2NlZWRlZCwgdGhlIHJlcGVhdGVkIGNhbGwgYWxzbyBzdWNjZWVkcy4gCitPdGhlcndpc2UsCitcaXRlbQorSWYgYW5vdGhlciBjYWxsIHRvICB0byBcY29kZXskcCQubG9hZExpYnJhcnl9IGhhcyBmYWlsZWQ6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtCitJZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gYSBjb21waWxhdGlvbiBlcnJvciwgdGhlIHJlcGVhdGVkIGNhbGwgZmFpbHMgZm9yIHRoZSBzYW1lIHJlYXNvbi4KK1xpdGVtCitJZiB0aGUgZmFpbHVyZSBpcyBkdWUgdG8gb3RoZXIgY2F1c2VzLCB0aGUgcmVwZWF0ZWQgY2FsbCBiZWhhdmVzIGFzIGlmIG5vIHByZXZpb3VzIGNhbGwgaGFkIGJlZW4gbWFkZS4KK1xlbmR7aXRlbWl6ZX0KK1xlbmR7aXRlbWl6ZX0KKworXGNvbW1lbnRhcnl7CitJbiBvdGhlciB3b3Jkcywgb25lIGNhbiByZXRyeSBhIGRlZmVycmVkIGxvYWQgYWZ0ZXIgYSBuZXR3b3JrIGZhaWx1cmUgb3IgYmVjYXVzZSBhIGZpbGUgaXMgYWJzZW50LCBidXQgb25jZSBvbmUgZmluZHMgc29tZSBjb250ZW50IGFuZCBsb2FkcyBpdCwgb25lIGNhbiBubyBsb25nZXIgcmVsb2FkLgorCitXZSBkbyBub3Qgc3BlY2lmeSB3aGF0IHZhbHVlIHRoZSBmdXR1cmUgcmV0dXJuZWQgcmVzb2x2ZXMgdG8uCit9CisKK0lmICRJJCBpcyBhbiBpbW1lZGlhdGUgaW1wb3J0IHRoZW4sIGZpcnN0CiAKICBcYmVnaW57aXRlbWl6ZX0KICBcaXRlbQpAQCAtNTMzOCw4ICs1NDIzLDExIEBACiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgZGV2ZWxvcGVyIGlzIHNwYXJlZCBhIHNlcmllcyBvZiBjYXNjYWRpbmcgd2FybmluZ3MgYXMgdGhlIG1hbGZvcm1lZCB0eXBlIGludGVyYWN0cyB3aXRoIG90aGVyIHR5cGVzLgogfQogCitBIHR5cGUgJFQkIGlzIHtcZW0gZGVmZXJyZWR9IGlmZiBpdCBpcyBvZiB0aGUgZm9ybSAkcC5UJCB3aGVyZSAkcCQgaXMgYSBkZWZlcnJlZCBwcmVmaXguCitJdCBpcyBhIHN0YXRpYyB3YXJuaW5nIHRvIHVzZSBhIGRlZmVycmVkIHR5cGUgaW4gYSB0eXBlIGFubm90YXRpb24sIHR5cGUgdGVzdCwgdHlwZSBjYXN0IG9yIGFzIGEgdHlwZSBwYXJhbWV0ZXIuIEhvd2V2ZXIsIGFsbCBvdGhlciBzdGF0aWMgd2FybmluZ3MgbXVzdCBiZSBpc3N1ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgZGVmZXJyZWQgbGlicmFyaWVzIGhhdmUgc3VjY2Vzc2Z1bGx5IGJlZW4gbG9hZGVkLgogCi1cc3Vic3Vic2VjdGlvbntUeXBlIFByb21vdGlvbn0KKworXHN1YnN1YnNlY3Rpb257VHlwZSBQcm9tb3Rpb259ICAgCiBcbGFiZWx7dHlwZVByb21vdGlvbn0KIAogVGhlIHN0YXRpYyB0eXBlIHN5c3RlbSBhc2NyaWJlcyBhIHN0YXRpYyB0eXBlIHRvIGV2ZXJ5IGV4cHJlc3Npb24uICBJbiBzb21lIGNhc2VzLCB0aGUgdHlwZXMgb2YgbG9jYWwgdmFyaWFibGVzIGFuZCBmb3JtYWwgcGFyYW1ldGVycyBtYXkgYmUgcHJvbW90ZWQgZnJvbSB0aGVpciBkZWNsYXJlZCB0eXBlcyBiYXNlZCBvbiBjb250cm9sIGZsb3cuIApAQCAtNTM1NCwxMCArNTQ0MiwxOSBAQAogCiBBIERhcnQgaW1wbGVtZW50YXRpb24gbXVzdCBzdXBwb3J0IGV4ZWN1dGlvbiBpbiBib3RoIHtcZW0gcHJvZHVjdGlvbiBtb2RlfSBhbmQge1xlbSBjaGVja2VkIG1vZGV9LiAgVGhvc2UgZHluYW1pYyBjaGVja3Mgc3BlY2lmaWVkIGFzIG9jY3VycmluZyBzcGVjaWZpY2FsbHkgaW4gY2hlY2tlZCBtb2RlIG11c3QgYmUgcGVyZm9ybWVkIGlmZiB0aGUgY29kZSBpcyBleGVjdXRlZCBpbiBjaGVja2VkIG1vZGUuCiAKK1xjb21tZW50YXJ5eworTm90ZSB0aGF0IHRoaXMgaXMgdGhlIGNhc2UgZXZlbiBpZiB0aGUgZGVmZXJyZWQgdHlwZSBiZWxvbmdzIHRvIGEgcHJlZml4IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQuIFRoaXMgaXMgcmVncmV0dGFibGUsIHNpbmNlIGl0IHN0cm9uZ2x5IGRpc2NvdXJhZ2VzIHRoZSB1c2Ugb2YgdHlwZSBhbm5vdGF0aW9ucyB0aGF0IGludm9sdmUgZGVmZXJyZWQgdHlwZXMgYmVjYXVzZSBEYXJ0IHByb2dyYW1tZXJzIHVzZSBjaGVja2VkIG1vZGUgbXVjaCBvZiB0aGUgdGltZS4KKworSW4gcHJhY3RpY2UsIG1hbnkgc2NlbmFyaW9zIGludm9sdmluZyBkZWZlcnJlZCBsb2FkaW5nIGludm9sdmUgZGVmZXJyZWQgbG9hZGluZyBvZiBjbGFzc2VzIHRoYXQgaW1wbGVtZW50IGVhZ2VybHkgbG9hZGVkIGludGVyZmFjZXMsIHNvIHRoZSBzaXR1YXRpb24gaXMgb2Z0ZW4gbGVzcyBvbmVyb3VzIHRoYW4gaXQgc2VlbXMuIFRoZSBjdXJyZW50IHNlbWFudGljcyB3ZXJlIGFkb3B0ZWQgYmFzZWQgb24gY29uc2lkZXJhdGlvbnMgb2YgZWFzZSBvZiBpbXBsZW1lbnRhdGlvbi4KKworQ2xlYXJseSwgaWYgYSBkZWZlcnJlZCB0eXBlIGhhcyBub3QgeWV0IGJlZW4gbG9hZGVkLCBpdCBpcyBpbXBvc3NpYmxlIHRvIGRvIGEgY29ycmVjdCBzdWJ0eXBlIHRlc3QgaW52b2x2aW5nIGl0LCBhbmQgb25lIHdvdWxkIGV4cGVjdCBhIGR5bmFtaWMgZmFpbHVyZSwgYXMgaXMgdGhlIGNhc2Ugd2l0aCB0eXBlIHRlc3RzIGFuZCBjYXN0cy4gQnkgdGhlIHNhbWUgdG9rZW4sIG9uZSB3b3VsZCBleHBlY3QgY2hlY2tlZCBtb2RlIHRvIHdvcmsgc2VhbWxlc3NseSBvbmNlIGEgdHlwZSBoYWQgYmVlbiBsb2FkZWQuIFdlIGhvcGUgdG8gYWRvcHQgdGhlc2Ugc2VtYW50aWNzIGluIHRoZSBmdXR1cmU7IHN1Y2ggYSBjaGFuZ2Ugd291bGQgYmUgdXB3YXJkbHkgY29tcGF0aWJsZS4KKworfQorCiAlSXQgaXMgYSBydW4tdGltZSB0eXBlIGVycm9yIHRvIGFjY2VzcyBhbiB1bmRlY2xhcmVkIHR5cGUgb3V0c2lkZSAuCiAKICVJdCBpcyBhIGR5bmFtaWMgdHlwZSBlcnJvciBpZiBhIG1hbGZvcm1lZCB0eXBlIGlzIHVzZWQgaW4gYSBzdWJ0eXBlIHRlc3QuICAKLUluIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgYSBtYWxmb3JtZWQgb3IgbWFsYm91bmRlZCAoXHJlZntwYXJhbWV0ZXJpemVkVHlwZXN9KSAKK0luIGNoZWNrZWQgbW9kZSwgaXQgaXMgYSBkeW5hbWljIHR5cGUgZXJyb3IgaWYgYSBkZWZlcnJlZCwgbWFsZm9ybWVkIG9yIG1hbGJvdW5kZWQgKFxyZWZ7cGFyYW1ldGVyaXplZFR5cGVzfSkgCiB0eXBlIGlzIHVzZWQgaW4gYSBzdWJ0eXBlIHRlc3QuICAKIAogJUluIHByb2R1Y3Rpb24gbW9kZSwgYW4gdW5kZWNsYXJlZCB0eXBlIGlzIHRyZWF0ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgdHlwZSBcRFlOQU1JQ3t9LiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc2VhcmNoL3NlYXJjaF9lbmdpbmUuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc2VhcmNoL3NlYXJjaF9lbmdpbmUuZGFydAppbmRleCBhMjU3OWRkLi4zYWFjOGJhIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL2xpYi9zZWFyY2gvc2VhcmNoX2VuZ2luZS5kYXJ0CkBAIC05LDYgKzksOCBAQAogCiBpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmljZXMvaW5kZXgvaW5kZXguZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmljZXMvc3JjL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2phdmFfY29yZS5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKQEAgLTI3LDI3OCArMjksMjcxIEBACiAKIAogLyoqCisgKiBSZXR1cm5zIGEgbmV3IFtTZWFyY2hFbmdpbmVdIGluc3RhbmNlIGJhc2VkIG9uIHRoZSBnaXZlbiBbSW5kZXhdLgorICovCitTZWFyY2hFbmdpbmUgY3JlYXRlU2VhcmNoRW5naW5lKEluZGV4IGluZGV4KSB7CisgIHJldHVybiBuZXcgU2VhcmNoRW5naW5lSW1wbChpbmRleCk7Cit9CisKKworLyoqCiAgKiBJbnN0YW5jZXMgb2YgdGhlIGVudW0gW01hdGNoS2luZF0gcmVwcmVzZW50IHRoZSBraW5kIG9mIHJlZmVyZW5jZSB0aGF0IHdhcwogICogZm91bmQgd2hlbiBhIG1hdGNoIHJlcHJlc2VudHMgYSByZWZlcmVuY2UgdG8gYW4gZWxlbWVudC4KICAqLwotY2xhc3MgTWF0Y2hLaW5kIGV4dGVuZHMgRW51bTxNYXRjaEtpbmQ+IHsKK2NsYXNzIE1hdGNoS2luZCB7CiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhbiBBbmd1bGFyIGVsZW1lbnQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEFOR1VMQVJfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0FOR1VMQVJfUkVGRVJFTkNFJywgMCk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQU5HVUxBUl9SRUZFUkVOQ0UgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdBTkdVTEFSX1JFRkVSRU5DRScpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhbiBBbmd1bGFyIGVsZW1lbnQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEFOR1VMQVJfQ0xPU0lOR19UQUdfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0FOR1VMQVJfQ0xPU0lOR19UQUdfUkVGRVJFTkNFJywgMSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQU5HVUxBUl9DTE9TSU5HX1RBR19SRUZFUkVOQ0UgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdBTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRScpOwogCiAgIC8qKgogICAgKiBBIGRlY2xhcmF0aW9uIG9mIGEgY2xhc3MuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIENMQVNTX0RFQ0xBUkFUSU9OID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0NMQVNTX0RFQ0xBUkFUSU9OJywgMik7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQ0xBU1NfREVDTEFSQVRJT04gPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdDTEFTU19ERUNMQVJBVElPTicpOwogCiAgIC8qKgogICAgKiBBIGRlY2xhcmF0aW9uIG9mIGEgY2xhc3MgYWxpYXMuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIENMQVNTX0FMSUFTX0RFQ0xBUkFUSU9OID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0NMQVNTX0FMSUFTX0RFQ0xBUkFUSU9OJywgMyk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQ0xBU1NfQUxJQVNfREVDTEFSQVRJT04gPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdDTEFTU19BTElBU19ERUNMQVJBVElPTicpOwogCiAgIC8qKgogICAgKiBBIGRlY2xhcmF0aW9uIG9mIGEgY29uc3RydWN0b3IuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIENPTlNUUlVDVE9SX0RFQ0xBUkFUSU9OID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0NPTlNUUlVDVE9SX0RFQ0xBUkFUSU9OJywgNCk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQ09OU1RSVUNUT1JfREVDTEFSQVRJT04gPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdDT05TVFJVQ1RPUl9ERUNMQVJBVElPTicpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIGNvbnN0cnVjdG9yIGluIHdoaWNoIHRoZSBjb25zdHJ1Y3RvciBpcyBiZWluZyByZWZlcmVuY2VkLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBDT05TVFJVQ1RPUl9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnQ09OU1RSVUNUT1JfUkVGRVJFTkNFJywgNSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgQ09OU1RSVUNUT1JfUkVGRVJFTkNFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnQ09OU1RSVUNUT1JfUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBpbiB3aGljaCB0aGUgdHlwZSB3YXMgZXh0ZW5kZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEVYVEVORFNfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0VYVEVORFNfUkVGRVJFTkNFJywgNik7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRVhURU5EU19SRUZFUkVOQ0UgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdFWFRFTkRTX1JFRkVSRU5DRScpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIGZpZWxkIGluIHdoaWNoIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGJlaW5nIGludm9rZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZJRUxEX0lOVk9DQVRJT04gPSBjb25zdCBNYXRjaEtpbmQoJ0ZJRUxEX0lOVk9DQVRJT04nLAotICAgICAgNyk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRklFTERfSU5WT0NBVElPTiA9IGNvbnN0IE1hdGNoS2luZCgnRklFTERfSU5WT0NBVElPTicpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIGZpZWxkIChmcm9tIGZpZWxkIGZvcm1hbCBwYXJhbWV0ZXIpLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGSUVMRF9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ0ZJRUxEX1JFRkVSRU5DRScsCi0gICAgICA4KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGSUVMRF9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ0ZJRUxEX1JFRkVSRU5DRScpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIGZpZWxkIGluIHdoaWNoIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGJlaW5nIHJlYWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZJRUxEX1JFQUQgPSBjb25zdCBNYXRjaEtpbmQoJ0ZJRUxEX1JFQUQnLCA5KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGSUVMRF9SRUFEID0gY29uc3QgTWF0Y2hLaW5kKCdGSUVMRF9SRUFEJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgZmllbGQgaW4gd2hpY2ggdGhlIGZpZWxkJ3MgdmFsdWUgaXMgYmVpbmcgd3JpdHRlbi4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRklFTERfV1JJVEUgPSBjb25zdCBNYXRjaEtpbmQoJ0ZJRUxEX1dSSVRFJywgMTApOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZJRUxEX1dSSVRFID0gY29uc3QgTWF0Y2hLaW5kKCdGSUVMRF9XUklURScpOwogCiAgIC8qKgogICAgKiBBIGRlY2xhcmF0aW9uIG9mIGEgZnVuY3Rpb24uCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZVTkNUSU9OX0RFQ0xBUkFUSU9OID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0ZVTkNUSU9OX0RFQ0xBUkFUSU9OJywgMTEpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZVTkNUSU9OX0RFQ0xBUkFUSU9OID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnRlVOQ1RJT05fREVDTEFSQVRJT04nKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZVTkNUSU9OX0VYRUNVVElPTiA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdGVU5DVElPTl9FWEVDVVRJT04nLCAxMik7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRlVOQ1RJT05fRVhFQ1VUSU9OID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnRlVOQ1RJT05fRVhFQ1VUSU9OJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgZnVuY3Rpb24gaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJlZmVyZW5jZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIEZVTkNUSU9OX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdGVU5DVElPTl9SRUZFUkVOQ0UnLCAxMyk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRlVOQ1RJT05fUkVGRVJFTkNFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnRlVOQ1RJT05fUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgZGVjbGFyYXRpb24gb2YgYSBmdW5jdGlvbiB0eXBlLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGVU5DVElPTl9UWVBFX0RFQ0xBUkFUSU9OID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0ZVTkNUSU9OX1RZUEVfREVDTEFSQVRJT04nLCAxNCk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgRlVOQ1RJT05fVFlQRV9ERUNMQVJBVElPTiA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ0ZVTkNUSU9OX1RZUEVfREVDTEFSQVRJT04nKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBmdW5jdGlvbiB0eXBlLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGVU5DVElPTl9UWVBFX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdGVU5DVElPTl9UWVBFX1JFRkVSRU5DRScsIDE1KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBGVU5DVElPTl9UWVBFX1JFRkVSRU5DRSA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ0ZVTkNUSU9OX1RZUEVfUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBpbiB3aGljaCB0aGUgdHlwZSB3YXMgaW1wbGVtZW50ZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIElNUExFTUVOVFNfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0lNUExFTUVOVFNfUkVGRVJFTkNFJywgMTYpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIElNUExFTUVOVFNfUkVGRVJFTkNFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnSU1QTEVNRU5UU19SRUZFUkVOQ0UnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBbSW1wb3J0RWxlbWVudF0uCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIElNUE9SVF9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ0lNUE9SVF9SRUZFUkVOQ0UnLAotICAgICAgMTcpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIElNUE9SVF9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ0lNUE9SVF9SRUZFUkVOQ0UnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBjbGFzcyB0aGF0IGlzIGltcGxlbWVudGluZyBhIHNwZWNpZmllZCB0eXBlLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBJTlRFUkZBQ0VfSU1QTEVNRU5URUQgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnSU5URVJGQUNFX0lNUExFTUVOVEVEJywgMTgpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIElOVEVSRkFDRV9JTVBMRU1FTlRFRCA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ0lOVEVSRkFDRV9JTVBMRU1FTlRFRCcpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIFtMaWJyYXJ5RWxlbWVudF0uCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIExJQlJBUllfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ0xJQlJBUllfUkVGRVJFTkNFJywgMTkpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIExJQlJBUllfUkVGRVJFTkNFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnTElCUkFSWV9SRUZFUkVOQ0UnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBtZXRob2QgaW4gd2hpY2ggdGhlIG1ldGhvZCBpcyBiZWluZyBpbnZva2VkLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBNRVRIT0RfSU5WT0NBVElPTiA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdNRVRIT0RfSU5WT0NBVElPTicsIDIwKTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBNRVRIT0RfSU5WT0NBVElPTiA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ01FVEhPRF9JTlZPQ0FUSU9OJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgbWV0aG9kIGluIHdoaWNoIHRoZSBtZXRob2QgaXMgYmVpbmcgcmVmZXJlbmNlZC4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTUVUSE9EX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgnTUVUSE9EX1JFRkVSRU5DRScsCi0gICAgICAyMSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTUVUSE9EX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgnTUVUSE9EX1JFRkVSRU5DRScpOwogCiAgIC8qKgogICAgKiBBIGRlY2xhcmF0aW9uIG9mIGEgbmFtZS4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9ERUNMQVJBVElPTiA9IGNvbnN0IE1hdGNoS2luZCgnTkFNRV9ERUNMQVJBVElPTicsCi0gICAgICAyMik7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9ERUNMQVJBVElPTiA9IGNvbnN0IE1hdGNoS2luZCgnTkFNRV9ERUNMQVJBVElPTicpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIG5hbWUsIHJlc29sdmVkLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1JFRkVSRU5DRV9SRVNPTFZFRCA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdOQU1FX1JFRkVSRU5DRV9SRVNPTFZFRCcsIDIzKTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1JFRkVSRU5DRV9SRVNPTFZFRCA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ05BTUVfUkVGRVJFTkNFX1JFU09MVkVEJyk7CiAKICAgLyoqCiAgICAqIEFuIGludm9jYXRpb24gb2YgYSBuYW1lLCByZXNvbHZlZC4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9JTlZPQ0FUSU9OX1JFU09MVkVEID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ05BTUVfSU5WT0NBVElPTl9SRVNPTFZFRCcsIDI0KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX0lOVk9DQVRJT05fUkVTT0xWRUQgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdOQU1FX0lOVk9DQVRJT05fUkVTT0xWRUQnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBuYW1lIGluIHdoaWNoIHRoZSBuYW1lJ3MgdmFsdWUgaXMgYmVpbmcgcmVhZC4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9SRUFEX1JFU09MVkVEID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ05BTUVfUkVBRF9SRVNPTFZFRCcsIDI1KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1JFQURfUkVTT0xWRUQgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdOQU1FX1JFQURfUkVTT0xWRUQnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBuYW1lIGluIHdoaWNoIHRoZSBuYW1lJ3MgdmFsdWUgaXMgYmVpbmcgcmVhZCBhbmQgd3JpdHRlbi4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9SRUFEX1dSSVRFX1JFU09MVkVEID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ05BTUVfUkVBRF9XUklURV9SRVNPTFZFRCcsIDI2KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1JFQURfV1JJVEVfUkVTT0xWRUQgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdOQU1FX1JFQURfV1JJVEVfUkVTT0xWRUQnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBuYW1lIGluIHdoaWNoIHRoZSBuYW1lJ3MgdmFsdWUgaXMgYmVpbmcgd3JpdHRlbi4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9XUklURV9SRVNPTFZFRCA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdOQU1FX1dSSVRFX1JFU09MVkVEJywgMjcpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIE5BTUVfV1JJVEVfUkVTT0xWRUQgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdOQU1FX1dSSVRFX1JFU09MVkVEJyk7CiAKICAgLyoqCiAgICAqIEFuIGludm9jYXRpb24gb2YgYSBuYW1lLCB1bnJlc29sdmVkLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX0lOVk9DQVRJT05fVU5SRVNPTFZFRCA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdOQU1FX0lOVk9DQVRJT05fVU5SRVNPTFZFRCcsIDI4KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX0lOVk9DQVRJT05fVU5SRVNPTFZFRCA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ05BTUVfSU5WT0NBVElPTl9VTlJFU09MVkVEJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgbmFtZSBpbiB3aGljaCB0aGUgbmFtZSdzIHZhbHVlIGlzIGJlaW5nIHJlYWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIE5BTUVfUkVBRF9VTlJFU09MVkVEID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ05BTUVfUkVBRF9VTlJFU09MVkVEJywgMjkpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIE5BTUVfUkVBRF9VTlJFU09MVkVEID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnTkFNRV9SRUFEX1VOUkVTT0xWRUQnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBuYW1lIGluIHdoaWNoIHRoZSBuYW1lJ3MgdmFsdWUgaXMgYmVpbmcgcmVhZCBhbmQgd3JpdHRlbi4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9SRUFEX1dSSVRFX1VOUkVTT0xWRUQgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnTkFNRV9SRUFEX1dSSVRFX1VOUkVTT0xWRUQnLCAzMCk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRV9SRUFEX1dSSVRFX1VOUkVTT0xWRUQgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdOQU1FX1JFQURfV1JJVEVfVU5SRVNPTFZFRCcpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIG5hbWUgaW4gd2hpY2ggdGhlIG5hbWUncyB2YWx1ZSBpcyBiZWluZyB3cml0dGVuLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1dSSVRFX1VOUkVTT0xWRUQgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnTkFNRV9XUklURV9VTlJFU09MVkVEJywgMzEpOworICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIE5BTUVfV1JJVEVfVU5SRVNPTFZFRCA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ05BTUVfV1JJVEVfVU5SRVNPTFZFRCcpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIG5hbWUsIHVucmVzb2x2ZWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIE5BTUVfUkVGRVJFTkNFX1VOUkVTT0xWRUQgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnTkFNRV9SRUZFUkVOQ0VfVU5SRVNPTFZFRCcsIDMyKTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FX1JFRkVSRU5DRV9VTlJFU09MVkVEID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnTkFNRV9SRUZFUkVOQ0VfVU5SRVNPTFZFRCcpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIG5hbWVkIHBhcmFtZXRlciBpbiBpbnZvY2F0aW9uLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBOQU1FRF9QQVJBTUVURVJfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ05BTUVEX1BBUkFNRVRFUl9SRUZFUkVOQ0UnLCAzMyk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgTkFNRURfUEFSQU1FVEVSX1JFRkVSRU5DRSA9CisgICAgICBjb25zdCBNYXRjaEtpbmQoJ05BTUVEX1BBUkFNRVRFUl9SRUZFUkVOQ0UnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSBwcm9wZXJ0eSBhY2Nlc3Nvci4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgUFJPUEVSVFlfQUNDRVNTT1JfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKAotICAgICAgJ1BST1BFUlRZX0FDQ0VTU09SX1JFRkVSRU5DRScsIDM0KTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBQUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UgPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdQUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UnKTsKIAogICAvKioKICAgICogQSByZWZlcmVuY2UgdG8gYSB0eXBlLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBUWVBFX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgnVFlQRV9SRUZFUkVOQ0UnLCAzNSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVFlQRV9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ1RZUEVfUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBwYXJhbWV0ZXIuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIFRZUEVfUEFSQU1FVEVSX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgKLSAgICAgICdUWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0UnLCAzNik7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgW0NvbXBpbGF0aW9uVW5pdEVsZW1lbnRdLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBVTklUX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgnVU5JVF9SRUZFUkVOQ0UnLCAzNyk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVU5JVF9SRUZFUkVOQ0UgPSBjb25zdCBNYXRjaEtpbmQoJ1VOSVRfUkVGRVJFTkNFJyk7CiAKICAgLyoqCiAgICAqIEEgZGVjbGFyYXRpb24gb2YgYSB2YXJpYWJsZS4KICAgICovCi0gIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVkFSSUFCTEVfREVDTEFSQVRJT04gPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnVkFSSUFCTEVfREVDTEFSQVRJT04nLCAzOCk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVkFSSUFCTEVfREVDTEFSQVRJT04gPQorICAgICAgY29uc3QgTWF0Y2hLaW5kKCdWQVJJQUJMRV9ERUNMQVJBVElPTicpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGluIHdoaWNoIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGlzIGJlaW5nIHJlYWQuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIFZBUklBQkxFX1JFQUQgPSBjb25zdCBNYXRjaEtpbmQoJ1ZBUklBQkxFX1JFQUQnLCAzOSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVkFSSUFCTEVfUkVBRCA9IGNvbnN0IE1hdGNoS2luZCgnVkFSSUFCTEVfUkVBRCcpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGluIHdoaWNoIHRoZSB2YXJpYWJsZSdzIHZhbHVlIGlzIGJlaW5nIGJvdGggcmVhZAogICAgKiBhbmQgd3JpdGUuCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIFZBUklBQkxFX1JFQURfV1JJVEUgPSBjb25zdCBNYXRjaEtpbmQoCi0gICAgICAnVkFSSUFCTEVfUkVBRF9XUklURScsIDQwKTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBWQVJJQUJMRV9SRUFEX1dSSVRFID0KKyAgICAgIGNvbnN0IE1hdGNoS2luZCgnVkFSSUFCTEVfUkVBRF9XUklURScpOwogCiAgIC8qKgogICAgKiBBIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGluIHdoaWNoIHRoZSB2YXJpYWJsZXMncyB2YWx1ZSBpcyBiZWluZyB3cml0dGVuLgogICAgKi8KLSAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBWQVJJQUJMRV9XUklURSA9IGNvbnN0IE1hdGNoS2luZCgnVkFSSUFCTEVfV1JJVEUnLCA0MSk7CisgIHN0YXRpYyBjb25zdCBNYXRjaEtpbmQgVkFSSUFCTEVfV1JJVEUgPSBjb25zdCBNYXRjaEtpbmQoJ1ZBUklBQkxFX1dSSVRFJyk7CiAKICAgLyoqCiAgICAqIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBpbiB3aGljaCB0aGUgdHlwZSB3YXMgbWl4ZWQgaW4uCiAgICAqLwotICBzdGF0aWMgY29uc3QgTWF0Y2hLaW5kIFdJVEhfUkVGRVJFTkNFID0gY29uc3QgTWF0Y2hLaW5kKCdXSVRIX1JFRkVSRU5DRScsIDQyKTsKKyAgc3RhdGljIGNvbnN0IE1hdGNoS2luZCBXSVRIX1JFRkVSRU5DRSA9IGNvbnN0IE1hdGNoS2luZCgnV0lUSF9SRUZFUkVOQ0UnKTsKIAotICBzdGF0aWMgY29uc3QgTGlzdDxNYXRjaEtpbmQ+IHZhbHVlcyA9IGNvbnN0IFtBTkdVTEFSX1JFRkVSRU5DRSwKLSAgICAgIEFOR1VMQVJfQ0xPU0lOR19UQUdfUkVGRVJFTkNFLCBDTEFTU19ERUNMQVJBVElPTiwgQ0xBU1NfQUxJQVNfREVDTEFSQVRJT04sCi0gICAgICBDT05TVFJVQ1RPUl9ERUNMQVJBVElPTiwgQ09OU1RSVUNUT1JfUkVGRVJFTkNFLCBFWFRFTkRTX1JFRkVSRU5DRSwKLSAgICAgIEZJRUxEX0lOVk9DQVRJT04sIEZJRUxEX1JFRkVSRU5DRSwgRklFTERfUkVBRCwgRklFTERfV1JJVEUsCi0gICAgICBGVU5DVElPTl9ERUNMQVJBVElPTiwgRlVOQ1RJT05fRVhFQ1VUSU9OLCBGVU5DVElPTl9SRUZFUkVOQ0UsCi0gICAgICBGVU5DVElPTl9UWVBFX0RFQ0xBUkFUSU9OLCBGVU5DVElPTl9UWVBFX1JFRkVSRU5DRSwgSU1QTEVNRU5UU19SRUZFUkVOQ0UsCi0gICAgICBJTVBPUlRfUkVGRVJFTkNFLCBJTlRFUkZBQ0VfSU1QTEVNRU5URUQsIExJQlJBUllfUkVGRVJFTkNFLCBNRVRIT0RfSU5WT0NBVElPTiwKLSAgICAgIE1FVEhPRF9SRUZFUkVOQ0UsIE5BTUVfREVDTEFSQVRJT04sIE5BTUVfUkVGRVJFTkNFX1JFU09MVkVELAotICAgICAgTkFNRV9JTlZPQ0FUSU9OX1JFU09MVkVELCBOQU1FX1JFQURfUkVTT0xWRUQsIE5BTUVfUkVBRF9XUklURV9SRVNPTFZFRCwKLSAgICAgIE5BTUVfV1JJVEVfUkVTT0xWRUQsIE5BTUVfSU5WT0NBVElPTl9VTlJFU09MVkVELCBOQU1FX1JFQURfVU5SRVNPTFZFRCwKLSAgICAgIE5BTUVfUkVBRF9XUklURV9VTlJFU09MVkVELCBOQU1FX1dSSVRFX1VOUkVTT0xWRUQsIE5BTUVfUkVGRVJFTkNFX1VOUkVTT0xWRUQsCi0gICAgICBOQU1FRF9QQVJBTUVURVJfUkVGRVJFTkNFLCBQUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIFRZUEVfUkVGRVJFTkNFLAotICAgICAgVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFLCBVTklUX1JFRkVSRU5DRSwgVkFSSUFCTEVfREVDTEFSQVRJT04sIFZBUklBQkxFX1JFQUQsCi0gICAgICBWQVJJQUJMRV9SRUFEX1dSSVRFLCBWQVJJQUJMRV9XUklURSwgV0lUSF9SRUZFUkVOQ0VdOworICBmaW5hbCBTdHJpbmcgbmFtZTsKIAotICBjb25zdCBNYXRjaEtpbmQoU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsKSA6IHN1cGVyKG5hbWUsIG9yZGluYWwpOworICBjb25zdCBNYXRjaEtpbmQodGhpcy5uYW1lKTsKKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gbmFtZTsKIH0KIAogCkBAIC0zMDcsMTMgKzMwMiw2IEBACiAgKiB0byBzZWFyY2ggZm9yIHZhcmlvdXMgcGllY2VzIG9mIGluZm9ybWF0aW9uLgogICovCiBhYnN0cmFjdCBjbGFzcyBTZWFyY2hFbmdpbmUgewotLy8gIC8qKgotLy8gICAqIFJldHVybnMgdHlwZXMgYXNzaWduZWQgdG8gdGhlIGdpdmVuIGZpZWxkIG9yIHRvcC1sZXZlbCB2YXJpYWJsZS4KLS8vICAgKgotLy8gICAqIFt2YXJpYWJsZV0gLSB0aGUgZmllbGQgb3IgdG9wLWxldmVsIHZhcmlhYmxlIHRvIGZpbmQgYXNzaWduZWQgdHlwZXMgZm9yLgotLy8gICAqLwotLy8gIEZ1dHVyZTxTZXQ8RGFydFR5cGU+PiBzZWFyY2hBc3NpZ25lZFR5cGVzKFByb3BlcnR5SW5kdWNpbmdFbGVtZW50IHZhcmlhYmxlKTsKLQogICAvKioKICAgICogUmV0dXJucyBkZWNsYXJhdGlvbnMgb2YgY2xhc3MgbWVtYmVycyB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICAgKgpAQCAtMzgwLDkgKzM2OCwxMCBAQAogICAvKioKICAgICogSXMgYHRydWVgIGlmIGZpZWxkIG9yIG1ldGhvZCBhY2Nlc3MgaXMgZG9uZSB1c2luZyBxdWFsaWZpZXIuCiAgICAqLwotICBib29sIHF1YWxpZmllZCA9IGZhbHNlOworICBmaW5hbCBib29sIGlzUXVhbGlmaWVkOwogCi0gIFNlYXJjaE1hdGNoKHRoaXMua2luZCwgdGhpcy5lbGVtZW50LCB0aGlzLnNvdXJjZVJhbmdlLCB0aGlzLmlzUmVzb2x2ZWQpOworICBTZWFyY2hNYXRjaCh0aGlzLmtpbmQsIHRoaXMuZWxlbWVudCwgdGhpcy5zb3VyY2VSYW5nZSwgdGhpcy5pc1Jlc29sdmVkLAorICAgICAgdGhpcy5pc1F1YWxpZmllZCk7CiAKICAgQG92ZXJyaWRlCiAgIGludCBnZXQgaGFzaENvZGUgPT4gSmF2YUFycmF5cy5tYWtlSGFzaENvZGUoW2VsZW1lbnQsIHNvdXJjZVJhbmdlLCBraW5kXSk7CkBAIC0zOTMsOSArMzgyLDExIEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKG9iamVjdCBpcyBTZWFyY2hNYXRjaCkgewotICAgICAgcmV0dXJuIGtpbmQgPT0gb2JqZWN0LmtpbmQgJiYgaXNSZXNvbHZlZCA9PSBvYmplY3QuaXNSZXNvbHZlZCAmJiBxdWFsaWZpZWQKLSAgICAgICAgICA9PSBvYmplY3QucXVhbGlmaWVkICYmIHNvdXJjZVJhbmdlID09IG9iamVjdC5zb3VyY2VSYW5nZSAmJiBlbGVtZW50ID09Ci0gICAgICAgICAgb2JqZWN0LmVsZW1lbnQ7CisgICAgICByZXR1cm4ga2luZCA9PSBvYmplY3Qua2luZCAmJgorICAgICAgICAgIGlzUmVzb2x2ZWQgPT0gb2JqZWN0LmlzUmVzb2x2ZWQgJiYKKyAgICAgICAgICBpc1F1YWxpZmllZCA9PSBvYmplY3QuaXNRdWFsaWZpZWQgJiYKKyAgICAgICAgICBzb3VyY2VSYW5nZSA9PSBvYmplY3Quc291cmNlUmFuZ2UgJiYKKyAgICAgICAgICBlbGVtZW50ID09IG9iamVjdC5lbGVtZW50OwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTQwNSwxNCArMzk2LDE0IEBACiAgICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICBidWZmZXIud3JpdGUoIlNlYXJjaE1hdGNoKGtpbmQ9Iik7CiAgICAgYnVmZmVyLndyaXRlKGtpbmQpOwotICAgIGJ1ZmZlci53cml0ZSgiLCBpc1Jlc29sdmVkPSIpOwotICAgIGJ1ZmZlci53cml0ZShpc1Jlc29sdmVkKTsKICAgICBidWZmZXIud3JpdGUoIiwgZWxlbWVudD0iKTsKICAgICBidWZmZXIud3JpdGUoZWxlbWVudC5kaXNwbGF5TmFtZSk7CiAgICAgYnVmZmVyLndyaXRlKCIsIHJhbmdlPSIpOwogICAgIGJ1ZmZlci53cml0ZShzb3VyY2VSYW5nZSk7Ci0gICAgYnVmZmVyLndyaXRlKCIsIHF1YWxpZmllZD0iKTsKLSAgICBidWZmZXIud3JpdGUocXVhbGlmaWVkKTsKKyAgICBidWZmZXIud3JpdGUoIiwgaXNSZXNvbHZlZD0iKTsKKyAgICBidWZmZXIud3JpdGUoaXNSZXNvbHZlZCk7CisgICAgYnVmZmVyLndyaXRlKCIsIGlzUXVhbGlmaWVkPSIpOworICAgIGJ1ZmZlci53cml0ZShpc1F1YWxpZmllZCk7CiAgICAgYnVmZmVyLndyaXRlKCIpIik7CiAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwogICB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NyYy9pbmRleC9pbmRleF9jb250cmlidXRvci5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL2xpYi9zcmMvaW5kZXgvaW5kZXhfY29udHJpYnV0b3IuZGFydAppbmRleCAwNDQ0MTgzLi4zYTFjOTdlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NyYy9pbmRleC9pbmRleF9jb250cmlidXRvci5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc3JjL2luZGV4L2luZGV4X2NvbnRyaWJ1dG9yLmRhcnQKQEAgLTY1Niw2ICs2NTYsMTAgQEAKICAgICB9CiAgICAgLy8gcHJlcGFyZSBpbmZvcm1hdGlvbgogICAgIEVsZW1lbnQgZWxlbWVudCA9IG5vZGUuYmVzdEVsZW1lbnQ7CisgICAgLy8gVE9ETyhzY2hlZ2xvdikgZml4IHJlc29sdmVyIHRvIHJlc29sdmUgdG8gRmllbGQsIG5vdCBhbiBhY2Nlc3NvcgorICAgIGlmIChub2RlLnBhcmVudCBpcyBDb21iaW5hdG9yICYmIGVsZW1lbnQgaXMgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQpIHsKKyAgICAgIGVsZW1lbnQgPSAoZWxlbWVudCBhcyBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCkudmFyaWFibGU7CisgICAgfQogICAgIC8vIHF1YWxpZmllZCBuYW1lIHJlZmVyZW5jZQogICAgIF9yZWNvcmRRdWFsaWZpZWRNZW1iZXJSZWZlcmVuY2Uobm9kZSwgZWxlbWVudCwgbmFtZUVsZW1lbnQsIGxvY2F0aW9uKTsKICAgICAvLyBzdG9wIGlmIGFscmVhZHkgaGFuZGxlZApAQCAtNjg4LDkgKzY5MiwxMSBAQAogICAgICAgICBGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgfHwgZWxlbWVudCBpcyBMYWJlbEVsZW1lbnQgfHwgZWxlbWVudCBpcwogICAgICAgICBUeXBlUGFyYW1ldGVyRWxlbWVudCkgewogICAgICAgcmVjb3JkUmVsYXRpb25zaGlwKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKLSAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRmllbGRFbGVtZW50KSB7CisgICAgfSBlbHNlIGlmIChlbGVtZW50IGlzIFByb3BlcnR5SW5kdWNpbmdFbGVtZW50KSB7CiAgICAgICBsb2NhdGlvbiA9IF9nZXRMb2NhdGlvbldpdGhJbml0aWFsaXplclR5cGUobm9kZSwgbG9jYXRpb24pOwotICAgICAgcmVjb3JkUmVsYXRpb25zaGlwKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKKyAgICAgIHJlY29yZFJlbGF0aW9uc2hpcChlbGVtZW50LAorICAgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICAgIGxvY2F0aW9uKTsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaXMgRmllbGRGb3JtYWxQYXJhbWV0ZXJFbGVtZW50KSB7CiAgICAgICBGaWVsZEZvcm1hbFBhcmFtZXRlckVsZW1lbnQgZmllbGRQYXJhbWV0ZXIgPSBlbGVtZW50OwogICAgICAgRmllbGRFbGVtZW50IGZpZWxkID0gZmllbGRQYXJhbWV0ZXIuZmllbGQ7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NyYy9pbmRleC9zdG9yZS9jb2RlYy5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL2xpYi9zcmMvaW5kZXgvc3RvcmUvY29kZWMuZGFydAppbmRleCA5MTUzZTY5Li4xMDhmOTM2IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NyYy9pbmRleC9zdG9yZS9jb2RlYy5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc3JjL2luZGV4L3N0b3JlL2NvZGVjLmRhcnQKQEAgLTE5LDE0ICsxOSwxNCBAQAogICAvKioKICAgICogQSB0YWJsZSBtYXBwaW5nIGNvbnRleHRzIHRvIHRoZWlyIHVuaXF1ZSBpbmRpY2VzLgogICAgKi8KLSAgTWFwPEFuYWx5c2lzQ29udGV4dCwgaW50PiBfY29udGV4dFRvSW5kZXggPSBuZXcgSGFzaE1hcDxBbmFseXNpc0NvbnRleHQsIGludD4oCi0gICAgICApOworICBNYXA8QW5hbHlzaXNDb250ZXh0LCBpbnQ+IF9jb250ZXh0VG9JbmRleCA9CisgICAgICBuZXcgSGFzaE1hcDxBbmFseXNpc0NvbnRleHQsIGludD4oKTsKIAogICAvKioKICAgICogQSB0YWJsZSBtYXBwaW5nIGluZGljZXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY29udGV4dHMuCiAgICAqLwotICBNYXA8aW50LCBBbmFseXNpc0NvbnRleHQ+IF9pbmRleFRvQ29udGV4dCA9IG5ldyBIYXNoTWFwPGludCwgQW5hbHlzaXNDb250ZXh0PigKLSAgICAgICk7CisgIE1hcDxpbnQsIEFuYWx5c2lzQ29udGV4dD4gX2luZGV4VG9Db250ZXh0ID0KKyAgICAgIG5ldyBIYXNoTWFwPGludCwgQW5hbHlzaXNDb250ZXh0PigpOwogCiAgIC8qKgogICAgKiBUaGUgbmV4dCBpZCB0byBhc3NpZ24uCkBAIC05Miw3ICs5Miw4IEBACiAgICAgTGlzdDxpbnQ+IHBhdGggPSBfaW5kZXhUb1BhdGhbaW5kZXhdOwogICAgIExpc3Q8U3RyaW5nPiBjb21wb25lbnRzID0gX2dldExvY2F0aW9uQ29tcG9uZW50cyhwYXRoKTsKICAgICBFbGVtZW50TG9jYXRpb24gbG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uSW1wbC5jb24zKGNvbXBvbmVudHMpOwotICAgIHJldHVybiBjb250ZXh0LmdldEVsZW1lbnQobG9jYXRpb24pOworICAgIEVsZW1lbnQgZWxlbWVudCA9IGNvbnRleHQuZ2V0RWxlbWVudChsb2NhdGlvbik7CisgICAgcmV0dXJuIGVsZW1lbnQ7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc3JjL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvbGliL3NyYy9zZWFyY2gvc2VhcmNoX2VuZ2luZS5kYXJ0CmluZGV4IGI5NDE5YjkuLmRlZjVlMzIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9saWIvc3JjL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL2xpYi9zcmMvc2VhcmNoL3NlYXJjaF9lbmdpbmUuZGFydApAQCAtNywxMjIyICs3LDQ1MSBAQAogCiBsaWJyYXJ5IHNlcnZpY2VzLnNyYy5zZWFyY2guc2VhcmNoX2VuZ2luZTsKIAotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5BbmRTZWFyY2hQYXR0ZXJuPC9jb2RlPiBpbXBsZW1lbnQgYSBzZWFyY2ggcGF0dGVybiB0aGF0IG1hdGNoZXMKLS8vICogZWxlbWVudHMgdGhhdCBtYXRjaCBhbGwgb2Ygc2V2ZXJhbCBvdGhlciBzZWFyY2ggcGF0dGVybnMuCi0vLyAqLwotLy9jbGFzcyBBbmRTZWFyY2hQYXR0ZXJuIGltcGxlbWVudHMgU2VhcmNoUGF0dGVybiB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIHBhdHRlcm5zIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXR0ZXJuIG1hdGNoZXMgYW4gZWxlbWVudC4KLS8vICAgKi8KLS8vICBmaW5hbCBMaXN0PFNlYXJjaFBhdHRlcm4+IF9wYXR0ZXJuczsKLS8vCi0vLyAgLyoqCi0vLyAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2VhcmNoIHBhdHRlcm4gdG8gbWF0Y2ggZWxlbWVudHMgdGhhdCBtYXRjaCBhbGwgb2Ygc2V2ZXJhbCBvdGhlcgotLy8gICAqIHNlYXJjaCBwYXR0ZXJucy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwYXR0ZXJucyB0aGUgcGF0dGVybnMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdHRlcm4gbWF0Y2hlcyBhbiBlbGVtZW50Ci0vLyAgICovCi0vLyAgQW5kU2VhcmNoUGF0dGVybih0aGlzLl9wYXR0ZXJucyk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIE1hdGNoUXVhbGl0eSBtYXRjaGVzKEVsZW1lbnQgZWxlbWVudCkgewotLy8gICAgTWF0Y2hRdWFsaXR5IGhpZ2hlc3RRdWFsaXR5ID0gbnVsbDsKLS8vICAgIGZvciAoU2VhcmNoUGF0dGVybiBwYXR0ZXJuIGluIF9wYXR0ZXJucykgewotLy8gICAgICBNYXRjaFF1YWxpdHkgcXVhbGl0eSA9IHBhdHRlcm4ubWF0Y2hlcyhlbGVtZW50KTsKLS8vICAgICAgaWYgKHF1YWxpdHkgPT0gbnVsbCkgewotLy8gICAgICAgIHJldHVybiBudWxsOwotLy8gICAgICB9Ci0vLyAgICAgIGlmIChoaWdoZXN0UXVhbGl0eSA9PSBudWxsKSB7Ci0vLyAgICAgICAgaGlnaGVzdFF1YWxpdHkgPSBxdWFsaXR5OwotLy8gICAgICB9IGVsc2UgewotLy8gICAgICAgIGhpZ2hlc3RRdWFsaXR5ID0gaGlnaGVzdFF1YWxpdHkubWF4KHF1YWxpdHkpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gaGlnaGVzdFF1YWxpdHk7Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5DYW1lbENhc2VTZWFyY2hQYXR0ZXJuPC9jb2RlPiBpbXBsZW1lbnQgYSBzZWFyY2ggcGF0dGVybiB0aGF0Ci0vLyAqIG1hdGNoZXMgZWxlbWVudHMgd2hvc2UgbmFtZSBtYXRjaGVzIGEgcGFydGlhbCBpZGVudGlmaWVyIHdoZXJlIGNhbWVsIGNhc2UgY29udmVudGlvbnMgYXJlIHVzZWQgdG8KLS8vICogcGVyZm9ybSB3aGF0IGlzIGVzc2VudGlhbGx5IG11bHRpcGxlIHByZWZpeCBtYXRjaGVzLgotLy8gKi8KLS8vY2xhc3MgQ2FtZWxDYXNlU2VhcmNoUGF0dGVybiBpbXBsZW1lbnRzIFNlYXJjaFBhdHRlcm4gewotLy8gIC8qKgotLy8gICAqIFRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBtYXRjaC4KLS8vICAgKi8KLS8vICBMaXN0PGludD4gX3BhdHRlcm47Ci0vLwotLy8gIC8qKgotLy8gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhdHRlcm4gYW5kIHRoZSBuYW1lIGJlaW5nIG1hdGNoZWQgbXVzdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUKLS8vICAgKiBudW1iZXIgb2YgcGFydHMgKGkuZS4gdGhlIHNhbWUgbnVtYmVyIG9mIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKS4KLS8vICAgKi8KLS8vICBmaW5hbCBib29sIF9zYW1lUGFydENvdW50OwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgZ2l2ZW4KLS8vICAgKiBjYW1lbC1jYXNlIHBhdHRlcm4uCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB0aGF0IG1hdGNoaW5nIGVsZW1lbnRzIG11c3QgbWF0Y2gKLS8vICAgKiBAcGFyYW0gc2FtZVBhcnRDb3VudCBgdHJ1ZWAgaWYgdGhlIHBhdHRlcm4gYW5kIHRoZSBuYW1lIGJlaW5nIG1hdGNoZWQgbXVzdCBoYXZlCi0vLyAgICogICAgICAgICAgZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgcGFydHMgKGkuZS4gdGhlIHNhbWUgbnVtYmVyIG9mIHVwcGVyY2FzZSBjaGFyYWN0ZXJzKQotLy8gICAqLwotLy8gIENhbWVsQ2FzZVNlYXJjaFBhdHRlcm4oU3RyaW5nIHBhdHRlcm4sIHRoaXMuX3NhbWVQYXJ0Q291bnQpIHsKLS8vICAgIHRoaXMuX3BhdHRlcm4gPSBwYXR0ZXJuLnRvQ2hhckFycmF5KCk7Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBNYXRjaFF1YWxpdHkgbWF0Y2hlcyhFbGVtZW50IGVsZW1lbnQpIHsKLS8vICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5kaXNwbGF5TmFtZTsKLS8vICAgIGlmIChuYW1lID09IG51bGwpIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLyAgICBpZiAoQ2hhck9wZXJhdGlvbi5jYW1lbENhc2VNYXRjaChfcGF0dGVybiwgbmFtZS50b0NoYXJBcnJheSgpLCBfc2FtZVBhcnRDb3VudCkpIHsKLS8vICAgICAgcmV0dXJuIE1hdGNoUXVhbGl0eS5FWEFDVDsKLS8vICAgIH0KLS8vICAgIHJldHVybiBudWxsOwotLy8gIH0KLS8vfQotLy8KLS8vLyoqCi0vLyAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYENvdW50aW5nU2VhcmNoTGlzdGVuZXJgIGxpc3RlbiBmb3Igc2VhcmNoIHJlc3VsdHMsIHBhc3NpbmcgdGhvc2UKLS8vICogcmVzdWx0cyBvbiB0byBhIHdyYXBwZWQgbGlzdGVuZXIsIGJ1dCBlbnN1cmUgdGhhdCB0aGUgd3JhcHBlZCBzZWFyY2ggbGlzdGVuZXIgcmVjZWl2ZXMgb25seSBvbmUKLS8vICogbm90aWZpY2F0aW9uIHRoYXQgdGhlIHNlYXJjaCBpcyBjb21wbGV0ZS4KLS8vICovCi0vL2NsYXNzIENvdW50aW5nU2VhcmNoTGlzdGVuZXIgaW1wbGVtZW50cyBTZWFyY2hMaXN0ZW5lciB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoaXMgbGlzdGVuZXIgZXhwZWN0cyB0byBiZSB0b2xkIHRoYXQgdGhlIHNlYXJjaCBpcyBjb21wbGV0ZSBiZWZvcmUKLS8vICAgKiBwYXNzaW5nIHRoZSBpbmZvcm1hdGlvbiBhbG9uZyB0byB0aGUgd3JhcHBlZCBsaXN0ZW5lci4KLS8vICAgKi8KLS8vICBpbnQgX2NvbXBsZXRpb25Db3VudCA9IDA7Ci0vLwotLy8gIC8qKgotLy8gICAqIFRoZSBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgbm90aWZpZWQgYXMgcmVzdWx0cyBhcmUgcmVjZWl2ZWQgYW5kIHdoZW4gdGhlIGdpdmVuIG51bWJlciBvZiBzZWFyY2gKLS8vICAgKiBjb21wbGV0ZSBub3RpZmljYXRpb25zIGhhdmUgYmVlbiByZWNlaXZlZC4KLS8vICAgKi8KLS8vICBmaW5hbCBTZWFyY2hMaXN0ZW5lciBfd3JhcHBlZExpc3RlbmVyOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggbGlzdGVuZXIgdG8gcGFzcyBzZWFyY2ggcmVzdWx0cyBvbiB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIgYW5kCi0vLyAgICogdG8gbm90aWZ5IHRoZSBnaXZlbiBsaXN0ZW5lciB0aGF0IHRoZSBzZWFyY2ggaXMgY29tcGxldGUgYWZ0ZXIgZ2V0dGluZyB0aGUgZ2l2ZW4gbnVtYmVyIG9mCi0vLyAgICogbm90aWZpY2F0aW9ucy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBjb21wbGV0aW9uQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoaXMgbGlzdGVuZXIgZXhwZWN0cyB0byBiZSB0b2xkIHRoYXQgdGhlCi0vLyAgICogICAgICAgICAgc2VhcmNoIGlzIGNvbXBsZXRlCi0vLyAgICogQHBhcmFtIHdyYXBwZWRMaXN0ZW5lciB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIG5vdGlmaWVkIGFzIHJlc3VsdHMgYXJlIHJlY2VpdmVkCi0vLyAgICovCi0vLyAgQ291bnRpbmdTZWFyY2hMaXN0ZW5lcihpbnQgY29tcGxldGlvbkNvdW50LCB0aGlzLl93cmFwcGVkTGlzdGVuZXIpIHsKLS8vICAgIHRoaXMuX2NvbXBsZXRpb25Db3VudCA9IGNvbXBsZXRpb25Db3VudDsKLS8vICAgIGlmIChjb21wbGV0aW9uQ291bnQgPT0gMCkgewotLy8gICAgICBfd3JhcHBlZExpc3RlbmVyLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIG1hdGNoRm91bmQoU2VhcmNoTWF0Y2ggbWF0Y2gpIHsKLS8vICAgIF93cmFwcGVkTGlzdGVuZXIubWF0Y2hGb3VuZChtYXRjaCk7Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHNlYXJjaENvbXBsZXRlKCkgewotLy8gICAgX2NvbXBsZXRpb25Db3VudC0tOwotLy8gICAgaWYgKF9jb21wbGV0aW9uQ291bnQgPD0gMCkgewotLy8gICAgICBfd3JhcHBlZExpc3RlbmVyLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICB9Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5FeGFjdFNlYXJjaFBhdHRlcm48L2NvZGU+IGltcGxlbWVudCBhIHNlYXJjaCBwYXR0ZXJuIHRoYXQgbWF0Y2hlcwotLy8gKiBlbGVtZW50cyB3aG9zZSBuYW1lIG1hdGNoZXMgYSBzcGVjaWZpZWQgaWRlbnRpZmllciBleGFjdGx5LgotLy8gKi8KLS8vY2xhc3MgRXhhY3RTZWFyY2hQYXR0ZXJuIGltcGxlbWVudHMgU2VhcmNoUGF0dGVybiB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIGlkZW50aWZpZXIgdGhhdCBtYXRjaGluZyBlbGVtZW50cyBtdXN0IGJlIGVxdWFsIHRvLgotLy8gICAqLwotLy8gIGZpbmFsIFN0cmluZyBfaWRlbnRpZmllcjsKLS8vCi0vLyAgLyoqCi0vLyAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZC4KLS8vICAgKi8KLS8vICBmaW5hbCBib29sIF9jYXNlU2Vuc2l0aXZlOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZSBnaXZlbgotLy8gICAqIHByZWZpeC4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBpZGVudGlmaWVyIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBiZSBlcXVhbCB0bwotLy8gICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIGB0cnVlYCBpZiBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZAotLy8gICAqLwotLy8gIEV4YWN0U2VhcmNoUGF0dGVybih0aGlzLl9pZGVudGlmaWVyLCB0aGlzLl9jYXNlU2Vuc2l0aXZlKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgTWF0Y2hRdWFsaXR5IG1hdGNoZXMoRWxlbWVudCBlbGVtZW50KSB7Ci0vLyAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZGlzcGxheU5hbWU7Ci0vLyAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0vLyAgICAgIHJldHVybiBudWxsOwotLy8gICAgfQotLy8gICAgaWYgKF9jYXNlU2Vuc2l0aXZlICYmIG5hbWUgPT0gX2lkZW50aWZpZXIpIHsKLS8vICAgICAgcmV0dXJuIE1hdGNoUXVhbGl0eS5FWEFDVDsKLS8vICAgIH0KLS8vICAgIGlmICghX2Nhc2VTZW5zaXRpdmUgJiYgamF2YVN0cmluZ0VxdWFsc0lnbm9yZUNhc2UobmFtZSwgX2lkZW50aWZpZXIpKSB7Ci0vLyAgICAgIHJldHVybiBNYXRjaFF1YWxpdHkuRVhBQ1Q7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbnVsbDsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPkZpbHRlcmVkU2VhcmNoTGlzdGVuZXI8L2NvZGU+IGltcGxlbWVudCBhIHNlYXJjaCBsaXN0ZW5lciB0aGF0Ci0vLyAqIGRlbGVnYXRlcyB0byBhbm90aGVyIHNlYXJjaCBsaXN0ZW5lciBhZnRlciByZW1vdmluZyBtYXRjaGVzIHRoYXQgZG8gbm90IHBhc3MgYSBnaXZlbiBmaWx0ZXIuCi0vLyAqLwotLy9jbGFzcyBGaWx0ZXJlZFNlYXJjaExpc3RlbmVyIGV4dGVuZHMgV3JhcHBlZFNlYXJjaExpc3RlbmVyIHsKLS8vICAvKioKLS8vICAgKiBUaGUgZmlsdGVyIHVzZWQgdG8gZmlsdGVyIHRoZSBtYXRjaGVzLgotLy8gICAqLwotLy8gIGZpbmFsIFNlYXJjaEZpbHRlciBfZmlsdGVyOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggbGlzdGVuZXIgdG8gcGFzcyBvbiBhbnkgbWF0Y2hlcyB0aGF0IHBhc3MgdGhlIGdpdmVuIGZpbHRlciB0bwotLy8gICAqIHRoZSBnaXZlbiBsaXN0ZW5lci4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBmaWx0ZXIgdGhlIGZpbHRlciB1c2VkIHRvIGZpbHRlciB0aGUgbWF0Y2hlcwotLy8gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgc2VhcmNoIGxpc3RlbmVyIGJlaW5nIHdyYXBwZWQKLS8vICAgKi8KLS8vICBGaWx0ZXJlZFNlYXJjaExpc3RlbmVyKHRoaXMuX2ZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIDogc3VwZXIobGlzdGVuZXIpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIG1hdGNoRm91bmQoU2VhcmNoTWF0Y2ggbWF0Y2gpIHsKLS8vICAgIGlmIChfZmlsdGVyLnBhc3NlcyhtYXRjaCkpIHsKLS8vICAgICAgcHJvcGFnYXRlTWF0Y2gobWF0Y2gpOwotLy8gICAgfQotLy8gIH0KLS8vfQotLy8KLS8vLyoqCi0vLyAqIFtTZWFyY2hMaXN0ZW5lcl0gdXNlZCBieSBbU2VhcmNoRW5naW5lSW1wbF0gaW50ZXJuYWxseSB0byBnYXRoZXIgYXN5bmNocm9ub3VzIHJlc3VsdHMKLS8vICogYW5kIHJldHVybiB0aGVtIHN5bmNocm9ub3VzbHkuCi0vLyAqLwotLy9jbGFzcyBHYXRoZXJpbmdTZWFyY2hMaXN0ZW5lciBpbXBsZW1lbnRzIFNlYXJjaExpc3RlbmVyIHsKLS8vICAvKioKLS8vICAgKiBBIGxpc3QgY29udGFpbmluZyB0aGUgbWF0Y2hlcyB0aGF0IGhhdmUgYmVlbiBmb3VuZCBzbyBmYXIuCi0vLyAgICovCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gX21hdGNoZXMgPSBbXTsKLS8vCi0vLyAgLyoqCi0vLyAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgc2VhcmNoIGlzIGNvbXBsZXRlLgotLy8gICAqLwotLy8gIGJvb2wgX2lzQ29tcGxldGUgPSBmYWxzZTsKLS8vCi0vLyAgLyoqCi0vLyAgICogQHJldHVybiB0aGUgdGhlIG1hdGNoZXMgdGhhdCBoYXZlIGJlZW4gZm91bmQuCi0vLyAgICovCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gZ2V0IG1hdGNoZXMgewotLy8gICAgX21hdGNoZXMuc29ydChTZWFyY2hNYXRjaC5TT1JUX0JZX0VMRU1FTlRfTkFNRSk7Ci0vLyAgICByZXR1cm4gX21hdGNoZXM7Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBzZWFyY2ggaXMgY29tcGxldGUuCi0vLyAgICoKLS8vICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgc2VhcmNoIGlzIGNvbXBsZXRlCi0vLyAgICovCi0vLyAgYm9vbCBnZXQgaXNDb21wbGV0ZSA9PiBfaXNDb21wbGV0ZTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBtYXRjaEZvdW5kKFNlYXJjaE1hdGNoIG1hdGNoKSB7Ci0vLyAgICBfbWF0Y2hlcy5hZGQobWF0Y2gpOwotLy8gIH0KLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZWFyY2hDb21wbGV0ZSgpIHsKLS8vICAgIF9pc0NvbXBsZXRlID0gdHJ1ZTsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPkxpYnJhcnlTZWFyY2hTY29wZTwvY29kZT4gaW1wbGVtZW50IGEgc2VhcmNoIHNjb3BlIHRoYXQgZW5jb21wYXNzZXMKLS8vICogZXZlcnl0aGluZyBpbiBhIGdpdmVuIGNvbGxlY3Rpb24gb2YgbGlicmFyaWVzLgotLy8gKi8KLS8vY2xhc3MgTGlicmFyeVNlYXJjaFNjb3BlIGltcGxlbWVudHMgU2VhcmNoU2NvcGUgewotLy8gIC8qKgotLy8gICAqIFRoZSBsaWJyYXJpZXMgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgYXJlIGluY2x1ZGVkIGluIHRoZSBzY29wZS4KLS8vICAgKi8KLS8vICBmaW5hbCBMaXN0PExpYnJhcnlFbGVtZW50PiBsaWJyYXJpZXM7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHNlYXJjaCBzY29wZSB0aGF0IGVuY29tcGFzc2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIGdpdmVuIGxpYnJhcmllcy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBsaWJyYXJpZXMgdGhlIGxpYnJhcmllcyBkZWZpbmluZyB3aGljaCBlbGVtZW50cyBhcmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlCi0vLyAgICovCi0vLyAgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjEoSXRlcmFibGU8TGlicmFyeUVsZW1lbnQ+IGxpYnJhcmllcykgOiB0aGlzLmNvbjIobmV3IExpc3QuZnJvbShsaWJyYXJpZXMpKTsKLS8vCi0vLyAgLyoqCi0vLyAgICogQ3JlYXRlIGEgc2VhcmNoIHNjb3BlIHRoYXQgZW5jb21wYXNzZXMgZXZlcnl0aGluZyBpbiB0aGUgZ2l2ZW4gbGlicmFyaWVzLgotLy8gICAqCi0vLyAgICogQHBhcmFtIGxpYnJhcmllcyB0aGUgbGlicmFyaWVzIGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUKLS8vICAgKi8KLS8vICBMaWJyYXJ5U2VhcmNoU2NvcGUuY29uMih0aGlzLmxpYnJhcmllcyk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIGJvb2wgZW5jbG9zZXMoRWxlbWVudCBlbGVtZW50KSB7Ci0vLyAgICBMaWJyYXJ5RWxlbWVudCBlbGVtZW50TGlicmFyeSA9IGVsZW1lbnQuZ2V0QW5jZXN0b3IoKGVsZW1lbnQpID0+IGVsZW1lbnQgaXMgTGlicmFyeUVsZW1lbnQpOwotLy8gICAgcmV0dXJuIEFycmF5VXRpbHMuY29udGFpbnMobGlicmFyaWVzLCBlbGVtZW50TGlicmFyeSk7Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5OYW1lTWF0Y2hpbmdTZWFyY2hMaXN0ZW5lcjwvY29kZT4gaW1wbGVtZW50IGEgc2VhcmNoIGxpc3RlbmVyIHRoYXQKLS8vICogZGVsZWdhdGVzIHRvIGFub3RoZXIgc2VhcmNoIGxpc3RlbmVyIGFmdGVyIHJlbW92aW5nIG1hdGNoZXMgdGhhdCBkbyBub3QgbWF0Y2ggYSBnaXZlbiBwYXR0ZXJuLgotLy8gKi8KLS8vY2xhc3MgTmFtZU1hdGNoaW5nU2VhcmNoTGlzdGVuZXIgZXh0ZW5kcyBXcmFwcGVkU2VhcmNoTGlzdGVuZXIgewotLy8gIC8qKgotLy8gICAqIFRoZSBwYXR0ZXJuIHVzZWQgdG8gZmlsdGVyIHRoZSBtYXRjaGVzLgotLy8gICAqLwotLy8gIGZpbmFsIFNlYXJjaFBhdHRlcm4gX3BhdHRlcm47Ci0vLwotLy8gIC8qKgotLy8gICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIHNlYXJjaCBsaXN0ZW5lciB0byBwYXNzIG9uIGFueSBtYXRjaGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4KLS8vICAgKiB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gcGF0dGVybiB0aGUgcGF0dGVybiB1c2VkIHRvIGZpbHRlciB0aGUgbWF0Y2hlcwotLy8gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgc2VhcmNoIGxpc3RlbmVyIGJlaW5nIHdyYXBwZWQKLS8vICAgKi8KLS8vICBOYW1lTWF0Y2hpbmdTZWFyY2hMaXN0ZW5lcih0aGlzLl9wYXR0ZXJuLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgOiBzdXBlcihsaXN0ZW5lcik7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgbWF0Y2hGb3VuZChTZWFyY2hNYXRjaCBtYXRjaCkgewotLy8gICAgaWYgKF9wYXR0ZXJuLm1hdGNoZXMobWF0Y2guZWxlbWVudCkgIT0gbnVsbCkgewotLy8gICAgICBwcm9wYWdhdGVNYXRjaChtYXRjaCk7Ci0vLyAgICB9Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5PclNlYXJjaFBhdHRlcm48L2NvZGU+IGltcGxlbWVudCBhIHNlYXJjaCBwYXR0ZXJuIHRoYXQgbWF0Y2hlcwotLy8gKiBlbGVtZW50cyB0aGF0IG1hdGNoIGFueSBvbmUgb2Ygc2V2ZXJhbCBvdGhlciBzZWFyY2ggcGF0dGVybnMuCi0vLyAqLwotLy9jbGFzcyBPclNlYXJjaFBhdHRlcm4gaW1wbGVtZW50cyBTZWFyY2hQYXR0ZXJuIHsKLS8vICAvKioKLS8vICAgKiBUaGUgcGF0dGVybnMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdHRlcm4gbWF0Y2hlcyBhbiBlbGVtZW50LgotLy8gICAqLwotLy8gIGZpbmFsIExpc3Q8U2VhcmNoUGF0dGVybj4gX3BhdHRlcm5zOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB0aGF0IG1hdGNoIGFueSBvbmUgb2Ygc2V2ZXJhbCBvdGhlcgotLy8gICAqIHNlYXJjaCBwYXR0ZXJucy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwYXR0ZXJucyB0aGUgcGF0dGVybnMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdHRlcm4gbWF0Y2hlcyBhbiBlbGVtZW50Ci0vLyAgICovCi0vLyAgT3JTZWFyY2hQYXR0ZXJuKHRoaXMuX3BhdHRlcm5zKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgTWF0Y2hRdWFsaXR5IG1hdGNoZXMoRWxlbWVudCBlbGVtZW50KSB7Ci0vLyAgICAvLyBEbyB3ZSB3YW50IHRvIHJldHVybiB0aGUgaGlnaGVzdCBxdWFsaXR5IG9mIG1hdGNoIHJhdGhlciB0aGFuIHN0b3BwaW5nCi0vLyAgICAvLyBhZnRlciB0aGUgZmlyc3QgbWF0Y2g/IERvaW5nIHNvIHdvdWxkIGJlIG1vcmUgYWNjdXJhdGUsIGJ1dCBzbG93ZXIuCi0vLyAgICBmb3IgKFNlYXJjaFBhdHRlcm4gcGF0dGVybiBpbiBfcGF0dGVybnMpIHsKLS8vICAgICAgTWF0Y2hRdWFsaXR5IHF1YWxpdHkgPSBwYXR0ZXJuLm1hdGNoZXMoZWxlbWVudCk7Ci0vLyAgICAgIGlmIChxdWFsaXR5ICE9IG51bGwpIHsKLS8vICAgICAgICByZXR1cm4gcXVhbGl0eTsKLS8vICAgICAgfQotLy8gICAgfQotLy8gICAgcmV0dXJuIG51bGw7Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5QcmVmaXhTZWFyY2hQYXR0ZXJuPC9jb2RlPiBpbXBsZW1lbnQgYSBzZWFyY2ggcGF0dGVybiB0aGF0IG1hdGNoZXMKLS8vICogZWxlbWVudHMgd2hvc2UgbmFtZSBoYXMgYSBnaXZlbiBwcmVmaXguCi0vLyAqLwotLy9jbGFzcyBQcmVmaXhTZWFyY2hQYXR0ZXJuIGltcGxlbWVudHMgU2VhcmNoUGF0dGVybiB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIHByZWZpeCB0aGF0IG1hdGNoaW5nIGVsZW1lbnRzIG11c3Qgc3RhcnQgd2l0aC4KLS8vICAgKi8KLS8vICBmaW5hbCBTdHJpbmcgX3ByZWZpeDsKLS8vCi0vLyAgLyoqCi0vLyAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZC4KLS8vICAgKi8KLS8vICBmaW5hbCBib29sIF9jYXNlU2Vuc2l0aXZlOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZSBnaXZlbgotLy8gICAqIHByZWZpeC4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCB0aGF0IG1hdGNoaW5nIGVsZW1lbnRzIG11c3Qgc3RhcnQgd2l0aAotLy8gICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIGB0cnVlYCBpZiBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZAotLy8gICAqLwotLy8gIFByZWZpeFNlYXJjaFBhdHRlcm4odGhpcy5fcHJlZml4LCB0aGlzLl9jYXNlU2Vuc2l0aXZlKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgTWF0Y2hRdWFsaXR5IG1hdGNoZXMoRWxlbWVudCBlbGVtZW50KSB7Ci0vLyAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0vLyAgICAgIHJldHVybiBudWxsOwotLy8gICAgfQotLy8gICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50LmRpc3BsYXlOYW1lOwotLy8gICAgaWYgKG5hbWUgPT0gbnVsbCkgewotLy8gICAgICByZXR1cm4gbnVsbDsKLS8vICAgIH0KLS8vICAgIGlmIChfY2FzZVNlbnNpdGl2ZSAmJiBzdGFydHNXaXRoKG5hbWUsIF9wcmVmaXgpKSB7Ci0vLyAgICAgIHJldHVybiBNYXRjaFF1YWxpdHkuRVhBQ1Q7Ci0vLyAgICB9Ci0vLyAgICBpZiAoIV9jYXNlU2Vuc2l0aXZlICYmIHN0YXJ0c1dpdGhJZ25vcmVDYXNlKG5hbWUsIF9wcmVmaXgpKSB7Ci0vLyAgICAgIHJldHVybiBNYXRjaFF1YWxpdHkuRVhBQ1Q7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbnVsbDsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPlJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybjwvY29kZT4gaW1wbGVtZW50IGEgc2VhcmNoIHBhdHRlcm4KLS8vICogdGhhdCBtYXRjaGVzIGVsZW1lbnRzIHdob3NlIG5hbWUgbWF0Y2hlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLS8vICovCi0vL2NsYXNzIFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybiBpbXBsZW1lbnRzIFNlYXJjaFBhdHRlcm4gewotLy8gIC8qKgotLy8gICAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0aGF0IG1hdGNoaW5nIGVsZW1lbnRzIG11c3QgbWF0Y2guCi0vLyAgICovCi0vLyAgUmVnRXhwIF9wYXR0ZXJuOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZSBnaXZlbgotLy8gICAqIHByZWZpeC4KLS8vICAgKgotLy8gICAqIEBwYXJhbSByZWd1bGFyRXhwcmVzc2lvbiB0aGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBtYXRjaAotLy8gICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIGB0cnVlYCBpZiBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZAotLy8gICAqLwotLy8gIFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybihTdHJpbmcgcmVndWxhckV4cHJlc3Npb24sIGJvb2wgY2FzZVNlbnNpdGl2ZSkgewotLy8gICAgX3BhdHRlcm4gPSBuZXcgUmVnRXhwKHJlZ3VsYXJFeHByZXNzaW9uKTsKLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIE1hdGNoUXVhbGl0eSBtYXRjaGVzKEVsZW1lbnQgZWxlbWVudCkgewotLy8gICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotLy8gICAgICByZXR1cm4gbnVsbDsKLS8vICAgIH0KLS8vICAgIFN0cmluZyBuYW1lID0gZWxlbWVudC5kaXNwbGF5TmFtZTsKLS8vICAgIGlmIChuYW1lID09IG51bGwpIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLyAgICBpZiAobmV3IEphdmFQYXR0ZXJuTWF0Y2hlcihfcGF0dGVybiwgbmFtZSkubWF0Y2hlcygpKSB7Ci0vLyAgICAgIHJldHVybiBNYXRjaFF1YWxpdHkuRVhBQ1Q7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbnVsbDsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBGYWN0b3J5IGZvciBbU2VhcmNoRW5naW5lXS4KLS8vICovCi0vL2NsYXNzIFNlYXJjaEVuZ2luZUZhY3RvcnkgewotLy8gIC8qKgotLy8gICAqIEByZXR1cm4gdGhlIG5ldyBbU2VhcmNoRW5naW5lXSBpbnN0YW5jZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gW0luZGV4XS4KLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoRW5naW5lIGNyZWF0ZVNlYXJjaEVuZ2luZShJbmRleCBpbmRleCkgPT4gbmV3IFNlYXJjaEVuZ2luZUltcGwoaW5kZXgpOwotLy99CitpbXBvcnQgJ2RhcnQ6YXN5bmMnOwogCi0vLy8qKgotLy8gKiBJbXBsZW1lbnRhdGlvbiBvZiBbU2VhcmNoRW5naW5lXS4KLS8vICovCi0vL2NsYXNzIFNlYXJjaEVuZ2luZUltcGwgaW1wbGVtZW50cyBTZWFyY2hFbmdpbmUgewotLy8gIC8qKgotLy8gICAqIEFwcGx5IHRoZSBnaXZlbiBmaWx0ZXIgdG8gdGhlIGdpdmVuIGxpc3RlbmVyLgotLy8gICAqCi0vLyAgICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIGJlIHVzZWQgYmVmb3JlIHBhc3NpbmcgbWF0Y2hlcyBvbiB0byB0aGUgbGlzdGVuZXIsIG9yIGBudWxsYAotLy8gICAqICAgICAgICAgIGlmIGFsbCBtYXRjaGVzIHNob3VsZCBiZSBwYXNzZWQgb24KLS8vICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRoYXQgd2lsbCBvbmx5IGJlIGdpdmVuIG1hdGNoZXMgdGhhdCBwYXNzIHRoZSBmaWx0ZXIKLS8vICAgKiBAcmV0dXJuIGEgc2VhcmNoIGxpc3RlbmVyIHRoYXQgd2lsbCBwYXNzIHRvIHRoZSBnaXZlbiBsaXN0ZW5lciBhbnkgbWF0Y2hlcyB0aGF0IHBhc3MgdGhlIGdpdmVuCi0vLyAgICogICAgICAgICBmaWx0ZXIKLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoTGlzdGVuZXIgX2FwcGx5RmlsdGVyKFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBpZiAoZmlsdGVyID09IG51bGwpIHsKLS8vICAgICAgcmV0dXJuIGxpc3RlbmVyOwotLy8gICAgfQotLy8gICAgcmV0dXJuIG5ldyBGaWx0ZXJlZFNlYXJjaExpc3RlbmVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gIH0KLS8vCi0vLyAgLyoqCi0vLyAgICogQXBwbHkgdGhlIGdpdmVuIHBhdHRlcm4gdG8gdGhlIGdpdmVuIGxpc3RlbmVyLgotLy8gICAqCi0vLyAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdG8gYmUgdXNlZCBiZWZvcmUgcGFzc2luZyBtYXRjaGVzIG9uIHRvIHRoZSBsaXN0ZW5lciwgb3IKLS8vICAgKiAgICAgICAgICBgbnVsbGAgaWYgYWxsIG1hdGNoZXMgc2hvdWxkIGJlIHBhc3NlZCBvbgotLy8gICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgbGlzdGVuZXIgdGhhdCB3aWxsIG9ubHkgYmUgZ2l2ZW4gbWF0Y2hlcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuCi0vLyAgICogQHJldHVybiBhIHNlYXJjaCBsaXN0ZW5lciB0aGF0IHdpbGwgcGFzcyB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIgYW55IG1hdGNoZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4KLS8vICAgKiAgICAgICAgIHBhdHRlcm4KLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoTGlzdGVuZXIgX2FwcGx5UGF0dGVybihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBpZiAocGF0dGVybiA9PSBudWxsKSB7Ci0vLyAgICAgIHJldHVybiBsaXN0ZW5lcjsKLS8vICAgIH0KLS8vICAgIHJldHVybiBuZXcgTmFtZU1hdGNoaW5nU2VhcmNoTGlzdGVuZXIocGF0dGVybiwgbGlzdGVuZXIpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIExpc3Q8RWxlbWVudD4gX2NyZWF0ZUVsZW1lbnRzKFNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0vLyAgICBpZiAoc2NvcGUgaXMgTGlicmFyeVNlYXJjaFNjb3BlKSB7Ci0vLyAgICAgIHJldHVybiBzY29wZS5saWJyYXJpZXM7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gPEVsZW1lbnQ+IFtJbmRleENvbnN0YW50cy5VTklWRVJTRV07Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgUmVsYXRpb25zaGlwQ2FsbGJhY2sgX25ld0NhbGxiYWNrKE1hdGNoS2luZCBtYXRjaEtpbmQsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgPT4gbmV3IFNlYXJjaEVuZ2luZUltcGxfUmVsYXRpb25zaGlwQ2FsbGJhY2tJbXBsKHNjb3BlLCBtYXRjaEtpbmQsIGxpc3RlbmVyKTsKLS8vCi0vLyAgLyoqCi0vLyAgICogVGhlIGluZGV4IHVzZWQgdG8gcmVzcG9uZCB0byB0aGUgc2VhcmNoIHJlcXVlc3RzLgotLy8gICAqLwotLy8gIGZpbmFsIEluZGV4IF9pbmRleDsKLS8vCi0vLyAgLyoqCi0vLyAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2VhcmNoIGVuZ2luZSB0byB1c2UgdGhlIGdpdmVuIGluZGV4LgotLy8gICAqCi0vLyAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCB1c2VkIHRvIHJlc3BvbmQgdG8gdGhlIHNlYXJjaCByZXF1ZXN0cwotLy8gICAqLwotLy8gIFNlYXJjaEVuZ2luZUltcGwodGhpcy5faW5kZXgpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBTZXQ8RGFydFR5cGU+IHNlYXJjaEFzc2lnbmVkVHlwZXMoUHJvcGVydHlJbmR1Y2luZ0VsZW1lbnQgdmFyaWFibGUsIFNlYXJjaFNjb3BlIHNjb3BlKSB7Ci0vLyAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBzZXR0ZXIgPSB2YXJpYWJsZS5zZXR0ZXI7Ci0vLyAgICBpbnQgbnVtUmVxdWVzdHMgPSAoc2V0dGVyICE9IG51bGwgPyAyIDogMCkgKyAyOwotLy8gICAgLy8gZmluZCBsb2NhdGlvbnMKLS8vICAgIExpc3Q8TG9jYXRpb24+IGxvY2F0aW9ucyA9IFtdOwotLy8gICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2gobnVtUmVxdWVzdHMpOwotLy8gICAgaWYgKHNldHRlciAhPSBudWxsKSB7Ci0vLyAgICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHNldHRlciwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIG5ldyBDYWxsYmFjaygpKTsKLS8vICAgICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoc2V0dGVyLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELCBuZXcgQ2FsbGJhY2soKSk7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyh2YXJpYWJsZSwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbmV3IENhbGxiYWNrKCkpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModmFyaWFibGUsIEluZGV4Q29uc3RhbnRzLklTX0RFRklORURfQlksIG5ldyBDYWxsYmFjaygpKTsKLS8vICAgIFVuaW50ZXJydXB0aWJsZXMuYXdhaXRVbmludGVycnVwdGlibHkobGF0Y2gpOwotLy8gICAgLy8gZ2V0IHR5cGVzIGZyb20gbG9jYXRpb25zCi0vLyAgICBTZXQ8RGFydFR5cGU+IHR5cGVzID0gbmV3IFNldCgpOwotLy8gICAgZm9yIChMb2NhdGlvbiBsb2NhdGlvbiBpbiBsb2NhdGlvbnMpIHsKLS8vICAgICAgLy8gY2hlY2sgc2NvcGUKLS8vICAgICAgaWYgKHNjb3BlICE9IG51bGwpIHsKLS8vICAgICAgICBFbGVtZW50IHRhcmdldEVsZW1lbnQgPSBsb2NhdGlvbi5lbGVtZW50OwotLy8gICAgICAgIGlmICghc2NvcGUuZW5jbG9zZXModGFyZ2V0RWxlbWVudCkpIHsKLS8vICAgICAgICAgIGNvbnRpbnVlOwotLy8gICAgICAgIH0KLS8vICAgICAgfQotLy8gICAgICAvLyB3ZSBuZWVkIGRhdGEKLS8vICAgICAgaWYgKGxvY2F0aW9uIGlzISBMb2NhdGlvbldpdGhEYXRhKSB7Ci0vLyAgICAgICAgY29udGludWU7Ci0vLyAgICAgIH0KLS8vICAgICAgTG9jYXRpb25XaXRoRGF0YSBsb2NhdGlvbldpdGhEYXRhID0gbG9jYXRpb24gYXMgTG9jYXRpb25XaXRoRGF0YTsKLS8vICAgICAgLy8gYWRkIHR5cGUKLS8vICAgICAgT2JqZWN0IGRhdGEgPSBsb2NhdGlvbldpdGhEYXRhLmRhdGE7Ci0vLyAgICAgIGlmIChkYXRhIGlzIERhcnRUeXBlKSB7Ci0vLyAgICAgICAgRGFydFR5cGUgdHlwZSA9IGRhdGEgYXMgRGFydFR5cGU7Ci0vLyAgICAgICAgdHlwZXMuYWRkKHR5cGUpOwotLy8gICAgICB9Ci0vLyAgICB9Ci0vLyAgICAvLyBkb25lCi0vLyAgICByZXR1cm4gdHlwZXM7Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBzZWFyY2hEZWNsYXJhdGlvbnMoU3RyaW5nIG5hbWUsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyKSA9PiBfZ2F0aGVyUmVzdWx0cyhuZXcgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoRGVjbGFyYXRpb25zKHRoaXMsIG5hbWUsIHNjb3BlLCBmaWx0ZXIpKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZWFyY2hEZWNsYXJhdGlvbnMyKFN0cmluZyBuYW1lLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMobmV3IE5hbWVFbGVtZW50SW1wbChuYW1lKSwgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5OQU1FX0RFQ0xBUkFUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHNlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zKFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaEZpbHRlciBmaWx0ZXIpID0+IF9nYXRoZXJSZXN1bHRzKG5ldyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9ucyh0aGlzLCBzY29wZSwgcGF0dGVybiwgZmlsdGVyKSk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnMyKFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzID0gX2NyZWF0ZUVsZW1lbnRzKHNjb3BlKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5UGF0dGVybihwYXR0ZXJuLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIGxpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoZWxlbWVudHMubGVuZ3RoLCBsaXN0ZW5lcik7Ci0vLyAgICBmb3IgKEVsZW1lbnQgZWxlbWVudCBpbiBlbGVtZW50cykgewotLy8gICAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhlbGVtZW50LCBJbmRleENvbnN0YW50cy5ERUZJTkVTX0ZVTkNUSU9OLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIH0KLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHNlYXJjaFF1YWxpZmllZE1lbWJlclJlZmVyZW5jZXMoU3RyaW5nIG5hbWUsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyKSA9PiBfZ2F0aGVyUmVzdWx0cyhuZXcgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoUXVhbGlmaWVkTWVtYmVyUmVmZXJlbmNlcyh0aGlzLCBuYW1lLCBzY29wZSwgZmlsdGVyKSk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgc2VhcmNoUXVhbGlmaWVkTWVtYmVyUmVmZXJlbmNlczIoU3RyaW5nIG5hbWUsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyKDEwLCBsaXN0ZW5lcik7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhuZXcgTmFtZUVsZW1lbnRJbXBsKG5hbWUpLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5OQU1FX1JFRkVSRU5DRV9SRVNPTFZFRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhuZXcgTmFtZUVsZW1lbnRJbXBsKG5hbWUpLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk5BTUVfUkVGRVJFTkNFX1VOUkVTT0xWRUQsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgLy8gZ3JhbnVsYXIgcmVzb2x2ZWQgb3BlcmF0aW9ucwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMobmV3IE5hbWVFbGVtZW50SW1wbChuYW1lKSwgSW5kZXhDb25zdGFudHMuTkFNRV9JU19JTlZPS0VEX0JZX1JFU09MVkVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk5BTUVfSU5WT0NBVElPTl9SRVNPTFZFRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhuZXcgTmFtZUVsZW1lbnRJbXBsKG5hbWUpLCBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfUkVTT0xWRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTkFNRV9SRUFEX1JFU09MVkVELCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKG5ldyBOYW1lRWxlbWVudEltcGwobmFtZSksIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1JFU09MVkVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk5BTUVfUkVBRF9XUklURV9SRVNPTFZFRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhuZXcgTmFtZUVsZW1lbnRJbXBsKG5hbWUpLCBJbmRleENvbnN0YW50cy5OQU1FX0lTX1dSSVRURU5fQllfUkVTT0xWRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTkFNRV9XUklURV9SRVNPTFZFRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICAvLyBncmFudWxhciB1bnJlc29sdmVkIG9wZXJhdGlvbnMKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKG5ldyBOYW1lRWxlbWVudEltcGwobmFtZSksIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfSU5WT0tFRF9CWV9VTlJFU09MVkVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk5BTUVfSU5WT0NBVElPTl9VTlJFU09MVkVELCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKG5ldyBOYW1lRWxlbWVudEltcGwobmFtZSksIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9CWV9VTlJFU09MVkVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk5BTUVfUkVBRF9VTlJFU09MVkVELCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKG5ldyBOYW1lRWxlbWVudEltcGwobmFtZSksIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1VOUkVTT0xWRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTkFNRV9SRUFEX1dSSVRFX1VOUkVTT0xWRUQsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMobmV3IE5hbWVFbGVtZW50SW1wbChuYW1lKSwgSW5kZXhDb25zdGFudHMuTkFNRV9JU19XUklUVEVOX0JZX1VOUkVTT0xWRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTkFNRV9XUklURV9VTlJFU09MVkVELCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHNlYXJjaFJlZmVyZW5jZXMoRWxlbWVudCBlbGVtZW50LCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlcikgPT4gX2dhdGhlclJlc3VsdHMobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaFJlZmVyZW5jZXModGhpcywgZWxlbWVudCwgc2NvcGUsIGZpbHRlcikpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHNlYXJjaFJlZmVyZW5jZXMyKEVsZW1lbnQgZWxlbWVudCwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0vLyAgICAgIGxpc3RlbmVyLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICAgIHJldHVybjsKLS8vICAgIH0KLS8vICAgIGlmIChlbGVtZW50IGlzIE1lbWJlcikgewotLy8gICAgICBlbGVtZW50ID0gKGVsZW1lbnQgYXMgTWVtYmVyKS5iYXNlRWxlbWVudDsKLS8vICAgIH0KLS8vICAgIHdoaWxlICh0cnVlKSB7Ci0vLyAgICAgIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9DT01QT05FTlQgfHwgZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkFOR1VMQVJfQ09OVFJPTExFUiB8fCBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9GT1JNQVRURVIgfHwgZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkFOR1VMQVJfUFJPUEVSVFkgfHwgZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkFOR1VMQVJfU0NPUEVfUFJPUEVSVFkgfHwgZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkFOR1VMQVJfU0VMRUNUT1IpIHsKLS8vICAgICAgICBfc2VhcmNoUmVmZXJlbmNlcyhlbGVtZW50IGFzIEFuZ3VsYXJFbGVtZW50LCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5DTEFTUykgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzMihlbGVtZW50IGFzIENsYXNzRWxlbWVudCwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQ09NUElMQVRJT05fVU5JVCkgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzMyhlbGVtZW50IGFzIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgICAgICByZXR1cm47Ci0vLyAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkNPTlNUUlVDVE9SKSB7Ci0vLyAgICAgICAgX3NlYXJjaFJlZmVyZW5jZXM0KGVsZW1lbnQgYXMgQ29uc3RydWN0b3JFbGVtZW50LCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5GSUVMRCB8fCBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuVE9QX0xFVkVMX1ZBUklBQkxFKSB7Ci0vLyAgICAgICAgX3NlYXJjaFJlZmVyZW5jZXMxMihlbGVtZW50IGFzIFByb3BlcnR5SW5kdWNpbmdFbGVtZW50LCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5GVU5DVElPTikgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzNShlbGVtZW50IGFzIEZ1bmN0aW9uRWxlbWVudCwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuR0VUVEVSIHx8IGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5TRVRURVIpIHsKLS8vICAgICAgICBfc2VhcmNoUmVmZXJlbmNlczExKGVsZW1lbnQgYXMgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgICAgICByZXR1cm47Ci0vLyAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLklNUE9SVCkgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzNyhlbGVtZW50IGFzIEltcG9ydEVsZW1lbnQsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgICAgICByZXR1cm47Ci0vLyAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkxJQlJBUlkpIHsKLS8vICAgICAgICBfc2VhcmNoUmVmZXJlbmNlczgoZWxlbWVudCBhcyBMaWJyYXJ5RWxlbWVudCwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuTE9DQUxfVkFSSUFCTEUpIHsKLS8vICAgICAgICBfc2VhcmNoUmVmZXJlbmNlczE0KGVsZW1lbnQgYXMgTG9jYWxWYXJpYWJsZUVsZW1lbnQsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgICAgICByZXR1cm47Ci0vLyAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLk1FVEhPRCkgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzOShlbGVtZW50IGFzIE1ldGhvZEVsZW1lbnQsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgICAgICByZXR1cm47Ci0vLyAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLlBBUkFNRVRFUikgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzMTAoZWxlbWVudCBhcyBQYXJhbWV0ZXJFbGVtZW50LCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5GVU5DVElPTl9UWVBFX0FMSUFTKSB7Ci0vLyAgICAgICAgX3NlYXJjaFJlZmVyZW5jZXM2KGVsZW1lbnQgYXMgRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50LCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICAgICAgcmV0dXJuOwotLy8gICAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5UWVBFX1BBUkFNRVRFUikgewotLy8gICAgICAgIF9zZWFyY2hSZWZlcmVuY2VzMTMoZWxlbWVudCBhcyBUeXBlUGFyYW1ldGVyRWxlbWVudCwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfSBlbHNlIHsKLS8vICAgICAgICBsaXN0ZW5lci5zZWFyY2hDb21wbGV0ZSgpOwotLy8gICAgICAgIHJldHVybjsKLS8vICAgICAgfQotLy8gICAgICBicmVhazsKLS8vICAgIH0KLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHNlYXJjaFN1YnR5cGVzKENsYXNzRWxlbWVudCB0eXBlLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlcikgPT4gX2dhdGhlclJlc3VsdHMobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaFN1YnR5cGVzKHRoaXMsIHR5cGUsIHNjb3BlLCBmaWx0ZXIpKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZWFyY2hTdWJ0eXBlczIoQ2xhc3NFbGVtZW50IHR5cGUsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyKDMsIGxpc3RlbmVyKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHR5cGUsIEluZGV4Q29uc3RhbnRzLklTX0VYVEVOREVEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkVYVEVORFNfUkVGRVJFTkNFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHR5cGUsIEluZGV4Q29uc3RhbnRzLklTX01JWEVEX0lOX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLldJVEhfUkVGRVJFTkNFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHR5cGUsIEluZGV4Q29uc3RhbnRzLklTX0lNUExFTUVOVEVEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLklNUExFTUVOVFNfUkVGRVJFTkNFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHNlYXJjaFR5cGVEZWNsYXJhdGlvbnMoU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU2VhcmNoRmlsdGVyIGZpbHRlcikgPT4gX2dhdGhlclJlc3VsdHMobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaFR5cGVEZWNsYXJhdGlvbnModGhpcywgc2NvcGUsIHBhdHRlcm4sIGZpbHRlcikpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHNlYXJjaFR5cGVEZWNsYXJhdGlvbnMyKFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBMaXN0PEVsZW1lbnQ+IGVsZW1lbnRzID0gX2NyZWF0ZUVsZW1lbnRzKHNjb3BlKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5UGF0dGVybihwYXR0ZXJuLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIGxpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoZWxlbWVudHMubGVuZ3RoICogMywgbGlzdGVuZXIpOwotLy8gICAgZm9yIChFbGVtZW50IGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKLS8vICAgICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoZWxlbWVudCwgSW5kZXhDb25zdGFudHMuREVGSU5FU19DTEFTUywgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5DTEFTU19ERUNMQVJBVElPTiwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLkRFRklORVNfQ0xBU1NfQUxJQVMsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuQ0xBU1NfQUxJQVNfREVDTEFSQVRJT04sIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhlbGVtZW50LCBJbmRleENvbnN0YW50cy5ERUZJTkVTX0ZVTkNUSU9OX1RZUEUsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRlVOQ1RJT05fVFlQRV9ERUNMQVJBVElPTiwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBzZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9ucyhTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hGaWx0ZXIgZmlsdGVyKSA9PiBfZ2F0aGVyUmVzdWx0cyhuZXcgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnModGhpcywgc2NvcGUsIHBhdHRlcm4sIGZpbHRlcikpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHNlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zMihTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgTGlzdDxFbGVtZW50PiBlbGVtZW50cyA9IF9jcmVhdGVFbGVtZW50cyhzY29wZSk7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseVBhdHRlcm4ocGF0dGVybiwgbGlzdGVuZXIpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyKGVsZW1lbnRzLmxlbmd0aCwgbGlzdGVuZXIpOwotLy8gICAgZm9yIChFbGVtZW50IGVsZW1lbnQgaW4gZWxlbWVudHMpIHsKLS8vICAgICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoZWxlbWVudCwgSW5kZXhDb25zdGFudHMuREVGSU5FU19WQVJJQUJMRSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5WQVJJQUJMRV9ERUNMQVJBVElPTiwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBVc2UgdGhlIGdpdmVuIHJ1bm5lciB0byBwZXJmb3JtIHRoZSBnaXZlbiBudW1iZXIgb2YgYXN5bmNocm9ub3VzIHNlYXJjaGVzLCB0aGVuIHdhaXQgdW50aWwgdGhlCi0vLyAgICogc2VhcmNoIGhhcyBjb21wbGV0ZWQgYW5kIHJldHVybiB0aGUgcmVzdWx0cyB0aGF0IHdlcmUgcHJvZHVjZWQuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gcnVubmVyIHRoZSBydW5uZXIgdXNlZCB0byBwZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBzZWFyY2gKLS8vICAgKiBAcmV0dXJuIHRoZSByZXN1bHRzIHRoYXQgd2VyZSBwcm9kdWNlZCBAIGlmIHRoZSByZXN1bHRzIG9mIGF0IGxlYXN0IG9uZSBvZiB0aGUgc2VhcmNoZWQgY291bGQKLS8vICAgKiAgICAgICAgIG5vdCBiZSBjb21wdXRlZAotLy8gICAqLwotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IF9nYXRoZXJSZXN1bHRzKFNlYXJjaEVuZ2luZUltcGxfU2VhcmNoUnVubmVyIHJ1bm5lcikgewotLy8gICAgR2F0aGVyaW5nU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgR2F0aGVyaW5nU2VhcmNoTGlzdGVuZXIoKTsKLS8vICAgIHJ1bm5lci5wZXJmb3JtU2VhcmNoKGxpc3RlbmVyKTsKLS8vICAgIHdoaWxlICghbGlzdGVuZXIuaXNDb21wbGV0ZSkgewotLy8gICAgICBUaHJlYWQueWllbGQoKTsKLS8vICAgIH0KLS8vICAgIHJldHVybiBsaXN0ZW5lci5tYXRjaGVzOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlcyhBbmd1bGFyRWxlbWVudCBlbGVtZW50LCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgbGlzdGVuZXIgPSBuZXcgQ291bnRpbmdTZWFyY2hMaXN0ZW5lcigyLCBsaXN0ZW5lcik7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhlbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5BTkdVTEFSX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhlbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5BTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIF9zZWFyY2hSZWZlcmVuY2VzMihDbGFzc0VsZW1lbnQgdHlwZSwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHR5cGUsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuVFlQRV9SRUZFUkVOQ0UsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczMoQ29tcGlsYXRpb25Vbml0RWxlbWVudCB1bml0LCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModW5pdCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5VTklUX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIF9zZWFyY2hSZWZlcmVuY2VzNChDb25zdHJ1Y3RvckVsZW1lbnQgY29uc3RydWN0b3IsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyKDIsIGxpc3RlbmVyKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGNvbnN0cnVjdG9yLCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkNPTlNUUlVDVE9SX0RFQ0xBUkFUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGNvbnN0cnVjdG9yLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkNPTlNUUlVDVE9SX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIF9zZWFyY2hSZWZlcmVuY2VzNShGdW5jdGlvbkVsZW1lbnQgZnVuY3Rpb24sIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBsaXN0ZW5lciA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyKDIsIGxpc3RlbmVyKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGZ1bmN0aW9uLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZVTkNUSU9OX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhmdW5jdGlvbiwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5GVU5DVElPTl9FWEVDVVRJT04sIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczYoRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50IGFsaWFzLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoYWxpYXMsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRlVOQ1RJT05fVFlQRV9SRUZFUkVOQ0UsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczcoSW1wb3J0RWxlbWVudCBpbXAsIFNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hGaWx0ZXIgZmlsdGVyLCBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgYXNzZXJ0KGxpc3RlbmVyICE9IG51bGwpOwotLy8gICAgbGlzdGVuZXIgPSBfYXBwbHlGaWx0ZXIoZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhpbXAsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuSU1QT1JUX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIF9zZWFyY2hSZWZlcmVuY2VzOChMaWJyYXJ5RWxlbWVudCBsaWJyYXJ5LCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMobGlicmFyeSwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5MSUJSQVJZX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIF9zZWFyY2hSZWZlcmVuY2VzOShNZXRob2RFbGVtZW50IG1ldGhvZCwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIC8vIFRPRE8oc2NoZWdsb3YpIHVzZSAiNSIgd2hlbiBhZGQgbmFtZWQgbWF0Y2hlcwotLy8gICAgbGlzdGVuZXIgPSBuZXcgQ291bnRpbmdTZWFyY2hMaXN0ZW5lcig0LCBsaXN0ZW5lcik7Ci0vLyAgICAvLyBleGFjdCBtYXRjaGVzCi0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhtZXRob2QsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfVU5RVUFMSUZJRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTUVUSE9EX0lOVk9DQVRJT04sIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMobWV0aG9kLCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5NRVRIT0RfSU5WT0NBVElPTiwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhtZXRob2QsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTUVUSE9EX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhtZXRob2QsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLk1FVEhPRF9SRUZFUkVOQ0UsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczEwKFBhcmFtZXRlckVsZW1lbnQgcGFyYW1ldGVyLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgbGlzdGVuZXIgPSBuZXcgQ291bnRpbmdTZWFyY2hMaXN0ZW5lcig1LCBsaXN0ZW5lcik7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhwYXJhbWV0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuVkFSSUFCTEVfUkVBRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhwYXJhbWV0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfV1JJVFRFTl9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5WQVJJQUJMRV9SRUFEX1dSSVRFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKHBhcmFtZXRlciwgSW5kZXhDb25zdGFudHMuSVNfV1JJVFRFTl9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5WQVJJQUJMRV9XUklURSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhwYXJhbWV0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuTkFNRURfUEFSQU1FVEVSX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhwYXJhbWV0ZXIsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgX3NlYXJjaFJlZmVyZW5jZXMxMShQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBhY2Nlc3NvciwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIGxpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoMiwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoYWNjZXNzb3IsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLlBST1BFUlRZX0FDQ0VTU09SX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhhY2Nlc3NvciwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczEyKFByb3BlcnR5SW5kdWNpbmdFbGVtZW50IGZpZWxkLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGdldHRlciA9IGZpZWxkLmdldHRlcjsKLS8vICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IHNldHRlciA9IGZpZWxkLnNldHRlcjsKLS8vICAgIGludCBudW1SZXF1ZXN0cyA9IChnZXR0ZXIgIT0gbnVsbCA/IDQgOiAwKSArIChzZXR0ZXIgIT0gbnVsbCA/IDIgOiAwKSArIDI7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIGxpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIobnVtUmVxdWVzdHMsIGxpc3RlbmVyKTsKLS8vICAgIGlmIChnZXR0ZXIgIT0gbnVsbCkgewotLy8gICAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhnZXR0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZJRUxEX1JFQUQsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhnZXR0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRklFTERfUkVBRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGdldHRlciwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRklFTERfSU5WT0NBVElPTiwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGdldHRlciwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9VTlFVQUxJRklFRCwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5GSUVMRF9JTlZPQ0FUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIH0KLS8vICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgewotLy8gICAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhzZXR0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZJRUxEX1dSSVRFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHMoc2V0dGVyLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZJRUxEX1dSSVRFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleC5nZXRSZWxhdGlvbnNoaXBzKGZpZWxkLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLkZJRUxEX1JFRkVSRU5DRSwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhmaWVsZCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRklFTERfUkVGRVJFTkNFLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgX3NlYXJjaFJlZmVyZW5jZXMxMyhUeXBlUGFyYW1ldGVyRWxlbWVudCB0eXBlUGFyYW1ldGVyLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoRmlsdGVyIGZpbHRlciwgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIGFzc2VydChsaXN0ZW5lciAhPSBudWxsKTsKLS8vICAgIGxpc3RlbmVyID0gX2FwcGx5RmlsdGVyKGZpbHRlciwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModHlwZVBhcmFtZXRlciwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgX25ld0NhbGxiYWNrKE1hdGNoS2luZC5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0UsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCBfc2VhcmNoUmVmZXJlbmNlczE0KFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZSwgU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaEZpbHRlciBmaWx0ZXIsIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBhc3NlcnQobGlzdGVuZXIgIT0gbnVsbCk7Ci0vLyAgICBsaXN0ZW5lciA9IF9hcHBseUZpbHRlcihmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICAgIGxpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoNCwgbGlzdGVuZXIpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModmFyaWFibGUsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuVkFSSUFCTEVfUkVBRCwgc2NvcGUsIGxpc3RlbmVyKSk7Ci0vLyAgICBfaW5kZXguZ2V0UmVsYXRpb25zaGlwcyh2YXJpYWJsZSwgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9XUklUVEVOX0JZLCBfbmV3Q2FsbGJhY2soTWF0Y2hLaW5kLlZBUklBQkxFX1JFQURfV1JJVEUsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModmFyaWFibGUsIEluZGV4Q29uc3RhbnRzLklTX1dSSVRURU5fQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuVkFSSUFCTEVfV1JJVEUsIHNjb3BlLCBsaXN0ZW5lcikpOwotLy8gICAgX2luZGV4LmdldFJlbGF0aW9uc2hpcHModmFyaWFibGUsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksIF9uZXdDYWxsYmFjayhNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCBzY29wZSwgbGlzdGVuZXIpKTsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPlJlbGF0aW9uc2hpcENhbGxiYWNrSW1wbDwvY29kZT4gaW1wbGVtZW50IGEgY2FsbGJhY2sgdGhhdCBjYW4gYmUKLS8vICogdXNlZCB0byByZXBvcnQgcmVzdWx0cyB0byBhIHNlYXJjaCBsaXN0ZW5lci4KLS8vICovCi0vL2NsYXNzIFNlYXJjaEVuZ2luZUltcGxfUmVsYXRpb25zaGlwQ2FsbGJhY2tJbXBsIGltcGxlbWVudHMgUmVsYXRpb25zaGlwQ2FsbGJhY2sgewotLy8gIGZpbmFsIFNlYXJjaFNjb3BlIF9zY29wZTsKLS8vCi0vLyAgLyoqCi0vLyAgICogVGhlIGtpbmQgb2YgbWF0Y2hlcyB0aGF0IGFyZSByZXByZXNlbnRlZCBieSB0aGUgcmVzdWx0cyB0aGF0IHdpbGwgYmUgcHJvdmlkZWQgdG8gdGhpcwotLy8gICAqIGNhbGxiYWNrLgotLy8gICAqLwotLy8gIGZpbmFsIE1hdGNoS2luZCBfbWF0Y2hLaW5kOwotLy8KLS8vICAvKioKLS8vICAgKiBUaGUgc2VhcmNoIGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gcmVzdWx0cyBhcmUgZm91bmQuCi0vLyAgICovCi0vLyAgZmluYWwgU2VhcmNoTGlzdGVuZXIgX2xpc3RlbmVyOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBjYWxsYmFjayB0byByZXBvcnQgbWF0Y2hlcyBvZiB0aGUgZ2l2ZW4ga2luZCB0byB0aGUgZ2l2ZW4gbGlzdGVuZXIKLS8vICAgKiB3aGVuIHJlc3VsdHMgYXJlIGZvdW5kLgotLy8gICAqCi0vLyAgICogQHBhcmFtIHNjb3BlIHRoZSBbU2VhcmNoU2NvcGVdIHRvIHJldHVybiBtYXRjaGVzIGZyb20sIG1heSBiZSBgbnVsbGAgdG8gcmV0dXJuCi0vLyAgICogICAgICAgICAgYWxsIG1hdGNoZXMKLS8vICAgKiBAcGFyYW0gbWF0Y2hLaW5kIHRoZSBraW5kIG9mIG1hdGNoZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlIHJlc3VsdHMKLS8vICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHNlYXJjaCBsaXN0ZW5lciB0aGF0IHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHJlc3VsdHMgYXJlIGZvdW5kCi0vLyAgICovCi0vLyAgU2VhcmNoRW5naW5lSW1wbF9SZWxhdGlvbnNoaXBDYWxsYmFja0ltcGwodGhpcy5fc2NvcGUsIHRoaXMuX21hdGNoS2luZCwgdGhpcy5fbGlzdGVuZXIpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIGhhc1JlbGF0aW9uc2hpcHMoRWxlbWVudCBlbGVtZW50LCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCBMaXN0PExvY2F0aW9uPiBsb2NhdGlvbnMpIHsKLS8vICAgIGZvciAoTG9jYXRpb24gbG9jYXRpb24gaW4gbG9jYXRpb25zKSB7Ci0vLyAgICAgIEVsZW1lbnQgdGFyZ2V0RWxlbWVudCA9IGxvY2F0aW9uLmVsZW1lbnQ7Ci0vLyAgICAgIC8vIGNoZWNrIHNjb3BlCi0vLyAgICAgIGlmIChfc2NvcGUgIT0gbnVsbCAmJiAhX3Njb3BlLmVuY2xvc2VzKHRhcmdldEVsZW1lbnQpKSB7Ci0vLyAgICAgICAgY29udGludWU7Ci0vLyAgICAgIH0KLS8vICAgICAgU291cmNlUmFuZ2UgcmFuZ2UgPSBuZXcgU291cmNlUmFuZ2UobG9jYXRpb24ub2Zmc2V0LCBsb2NhdGlvbi5sZW5ndGgpOwotLy8gICAgICAvLyBUT0RPKHNjaGVnbG92KSBJbmRleENvbnN0YW50cy5EWU5BTUlDIGZvciBNYXRjaFF1YWxpdHkuTkFNRQotLy8gICAgICBNYXRjaFF1YWxpdHkgcXVhbGl0eSA9IE1hdGNoUXVhbGl0eS5FWEFDVDsKLS8vICAgICAgLy8gICAgICAgICAgTWF0Y2hRdWFsaXR5IHF1YWxpdHkgPSBlbGVtZW50LmdldFJlc291cmNlKCkgIT0gSW5kZXhDb25zdGFudHMuRFlOQU1JQwotLy8gICAgICAvLyAgICAgICAgICAgICAgPyBNYXRjaFF1YWxpdHkuRVhBQ1QgOiBNYXRjaFF1YWxpdHkuTkFNRTsKLS8vICAgICAgU2VhcmNoTWF0Y2ggbWF0Y2ggPSBuZXcgU2VhcmNoTWF0Y2gocXVhbGl0eSwgX21hdGNoS2luZCwgdGFyZ2V0RWxlbWVudCwgcmFuZ2UpOwotLy8gICAgICBtYXRjaC5xdWFsaWZpZWQgPSBpZGVudGljYWwocmVsYXRpb25zaGlwLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCkgfHwgaWRlbnRpY2FsKHJlbGF0aW9uc2hpcCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQpOwotLy8gICAgICBfbGlzdGVuZXIubWF0Y2hGb3VuZChtYXRjaCk7Ci0vLyAgICB9Ci0vLyAgICBfbGlzdGVuZXIuc2VhcmNoQ29tcGxldGUoKTsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBUaGUgaW50ZXJmYWNlIDxjb2RlPlNlYXJjaFJ1bm5lcjwvY29kZT4gZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2Ygb2JqZWN0cyB0aGF0IGNhbiBiZSB1c2VkIHRvCi0vLyAqIHBlcmZvcm0gYW4gYXN5bmNocm9ub3VzIHNlYXJjaC4KLS8vICovCi0vL2Fic3RyYWN0IGNsYXNzIFNlYXJjaEVuZ2luZUltcGxfU2VhcmNoUnVubmVyIHsKLS8vICAvKioKLS8vICAgKiBQZXJmb3JtIGFuIGFzeW5jaHJvbm91cyBzZWFyY2gsIHBhc3NpbmcgdGhlIHJlc3VsdHMgdG8gdGhlIGdpdmVuIGxpc3RlbmVyLgotLy8gICAqCi0vLyAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBsaXN0ZW5lciB0byB3aGljaCBzZWFyY2ggcmVzdWx0cyBzaG91bGQgYmUgcGFzc2VkIEAgaWYgdGhlIHJlc3VsdHMgY291bGQKLS8vICAgKiAgICAgICAgICBub3QgYmUgY29tcHV0ZWQKLS8vICAgKi8KLS8vICB2b2lkIHBlcmZvcm1TZWFyY2goU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpOwotLy99Ci0vLwotLy8vKioKLS8vICogVGhlIGludGVyZmFjZSA8Y29kZT5TZWFyY2hMaXN0ZW5lcjwvY29kZT4gZGVmaW5lcyB0aGUgYmVoYXZpb3Igb2Ygb2JqZWN0cyB0aGF0IGFyZSBsaXN0ZW5pbmcgZm9yCi0vLyAqIHRoZSByZXN1bHRzIG9mIGEgc2VhcmNoLgotLy8gKi8KLS8vYWJzdHJhY3QgY2xhc3MgU2VhcmNoTGlzdGVuZXIgewotLy8gIC8qKgotLy8gICAqIFJlY29yZCB0aGUgZmFjdCB0aGF0IHRoZSBnaXZlbiBtYXRjaCB3YXMgZm91bmQuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gbWF0Y2ggdGhlIG1hdGNoIHRoYXQgd2FzIGZvdW5kCi0vLyAgICovCi0vLyAgdm9pZCBtYXRjaEZvdW5kKFNlYXJjaE1hdGNoIG1hdGNoKTsKLS8vCi0vLyAgLyoqCi0vLyAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIHRoZSBzZWFyY2ggaXMgY29tcGxldGUgYW5kIG5vIGFkZGl0aW9uYWwgbWF0Y2hlcyB3aWxsIGJlIGZvdW5kLgotLy8gICAqLwotLy8gIHZvaWQgc2VhcmNoQ29tcGxldGUoKTsKLS8vfQoraW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL2luZGV4L2luZGV4LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL3NvdXJjZS5kYXJ0JzsKIAotLy8vKioKLS8vICogVGhlIGNsYXNzIDxjb2RlPlNlYXJjaFBhdHRlcm5GYWN0b3J5PC9jb2RlPiBkZWZpbmVzIHV0aWxpdHkgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQotLy8gKiBzZWFyY2ggcGF0dGVybnMuCi0vLyAqLwotLy9jbGFzcyBTZWFyY2hQYXR0ZXJuRmFjdG9yeSB7Ci0vLyAgLyoqCi0vLyAgICogQ3JlYXRlIGEgcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2ggYW55IGVsZW1lbnQgdGhhdCBpcyBtYXRjaGVkIGJ5IGFsbCBvZiB0aGUgZ2l2ZW4gcGF0dGVybnMuIElmCi0vLyAgICogbm8gcGF0dGVybnMgYXJlIGdpdmVuLCB0aGVuIHRoZSByZXN1bHRpbmcgcGF0dGVybiB3aWxsIG5vdCBtYXRjaCBhbnkgZWxlbWVudHMuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gcGF0dGVybnMgdGhlIHBhdHRlcm5zIHRoYXQgbXVzdCBhbGwgYmUgbWF0Y2hlZCBpbiBvcmRlciBmb3IgdGhlIG5ldyBwYXR0ZXJuIHRvIGJlCi0vLyAgICogICAgICAgICAgbWF0Y2hlZAotLy8gICAqIEByZXR1cm4gdGhlIHBhdHRlcm4gdGhhdCB3YXMgY3JlYXRlZAotLy8gICAqLwotLy8gIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZUFuZFBhdHRlcm4oTGlzdDxTZWFyY2hQYXR0ZXJuPiBwYXR0ZXJucykgewotLy8gICAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PSAxKSB7Ci0vLyAgICAgIHJldHVybiBwYXR0ZXJuc1swXTsKLS8vICAgIH0KLS8vICAgIHJldHVybiBuZXcgQW5kU2VhcmNoUGF0dGVybihwYXR0ZXJucyk7Ci0vLyAgfQotLy8KLS8vICAvKioKLS8vICAgKiBDcmVhdGUgYSBwYXR0ZXJuIHRoYXQgd2lsbCBtYXRjaCBhbnkgZWxlbWVudCB3aG9zZSBuYW1lIG1hdGNoZXMgYSBwYXJ0aWFsIGlkZW50aWZpZXIgd2hlcmUKLS8vICAgKiBjYW1lbCBjYXNlIGNvbnZlbnRpb25zIGFyZSB1c2VkIHRvIHBlcmZvcm0gd2hhdCBpcyBlc3NlbnRpYWxseSBtdWx0aXBsZSBwcmVmaXggbWF0Y2hlcy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBtYXRjaAotLy8gICAqIEBwYXJhbSBzYW1lUGFydENvdW50IGB0cnVlYCBpZiB0aGUgcGF0dGVybiBhbmQgdGhlIG5hbWUgYmVpbmcgbWF0Y2hlZCBtdXN0IGhhdmUKLS8vICAgKiAgICAgICAgICBleGFjdGx5IHRoZSBzYW1lIG51bWJlciBvZiBwYXJ0cyAoaS5lLiB0aGUgc2FtZSBudW1iZXIgb2YgdXBwZXJjYXNlIGNoYXJhY3RlcnMpCi0vLyAgICogQHJldHVybiB0aGUgcGF0dGVybiB0aGF0IHdhcyBjcmVhdGVkCi0vLyAgICovCi0vLyAgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlQ2FtZWxDYXNlUGF0dGVybihTdHJpbmcgcHJlZml4LCBib29sIHNhbWVQYXJ0Q291bnQpID0+IG5ldyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuKHByZWZpeCwgc2FtZVBhcnRDb3VudCk7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoIGFueSBlbGVtZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBhIHNwZWNpZmllZCBpZGVudGlmaWVyIGV4YWN0bHkuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gaWRlbnRpZmllciB0aGUgaWRlbnRpZmllciB0aGF0IG1hdGNoaW5nIGVsZW1lbnRzIG11c3QgYmUgZXF1YWwgdG8KLS8vICAgKiBAcGFyYW0gY2FzZVNlbnNpdGl2ZSBgdHJ1ZWAgaWYgYSBjYXNlIHNlbnNpdGl2ZSBtYXRjaCBpcyB0byBiZSBwZXJmb3JtZWQKLS8vICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuIHRoYXQgd2FzIGNyZWF0ZWQKLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVFeGFjdFBhdHRlcm4oU3RyaW5nIGlkZW50aWZpZXIsIGJvb2wgY2FzZVNlbnNpdGl2ZSkgPT4gbmV3IEV4YWN0U2VhcmNoUGF0dGVybihpZGVudGlmaWVyLCBjYXNlU2Vuc2l0aXZlKTsKLS8vCi0vLyAgLyoqCi0vLyAgICogQ3JlYXRlIGEgcGF0dGVybiB0aGF0IHdpbGwgbWF0Y2ggYW55IGVsZW1lbnQgdGhhdCBpcyBtYXRjaGVkIGJ5IGF0IGxlYXN0IG9uZSBvZiB0aGUgZ2l2ZW4KLS8vICAgKiBwYXR0ZXJucy4gSWYgbm8gcGF0dGVybnMgYXJlIGdpdmVuLCB0aGVuIHRoZSByZXN1bHRpbmcgcGF0dGVybiB3aWxsIG5vdCBtYXRjaCBhbnkgZWxlbWVudHMuCi0vLyAgICoKLS8vICAgKiBAcGFyYW0gcGF0dGVybnMgdGhlIHBhdHRlcm5zIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5ldyBwYXR0ZXJuIGlzIG1hdGNoZWQKLS8vICAgKiBAcmV0dXJuIHRoZSBwYXR0ZXJuIHRoYXQgd2FzIGNyZWF0ZWQKLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoUGF0dGVybiBjcmVhdGVPclBhdHRlcm4oTGlzdDxTZWFyY2hQYXR0ZXJuPiBwYXR0ZXJucykgewotLy8gICAgaWYgKHBhdHRlcm5zLmxlbmd0aCA9PSAxKSB7Ci0vLyAgICAgIHJldHVybiBwYXR0ZXJuc1swXTsKLS8vICAgIH0KLS8vICAgIHJldHVybiBuZXcgT3JTZWFyY2hQYXR0ZXJuKHBhdHRlcm5zKTsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoIGFueSBlbGVtZW50IHdob3NlIG5hbWUgc3RhcnRzIHdpdGggdGhlIGdpdmVuIHByZWZpeC4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwcmVmaXggdGhlIHByZWZpeCBvZiBuYW1lcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuCi0vLyAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgYHRydWVgIGlmIGEgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgdG8gYmUgcGVyZm9ybWVkCi0vLyAgICogQHJldHVybiB0aGUgcGF0dGVybiB0aGF0IHdhcyBjcmVhdGVkCi0vLyAgICovCi0vLyAgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlUHJlZml4UGF0dGVybihTdHJpbmcgcHJlZml4LCBib29sIGNhc2VTZW5zaXRpdmUpID0+IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuKHByZWZpeCwgY2FzZVNlbnNpdGl2ZSk7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoIGFueSBlbGVtZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4KLS8vICAgKgotLy8gICAqIEBwYXJhbSByZWd1bGFyRXhwcmVzc2lvbiB0aGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBtYXRjaAotLy8gICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIGB0cnVlYCBpZiBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZAotLy8gICAqIEByZXR1cm4gdGhlIHBhdHRlcm4gdGhhdCB3YXMgY3JlYXRlZAotLy8gICAqLwotLy8gIHN0YXRpYyBTZWFyY2hQYXR0ZXJuIGNyZWF0ZVJlZ3VsYXJFeHByZXNzaW9uUGF0dGVybihTdHJpbmcgcmVndWxhckV4cHJlc3Npb24sIGJvb2wgY2FzZVNlbnNpdGl2ZSkgPT4gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybihyZWd1bGFyRXhwcmVzc2lvbiwgY2FzZVNlbnNpdGl2ZSk7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHBhdHRlcm4gdGhhdCB3aWxsIG1hdGNoIGFueSBlbGVtZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBhIHBhdHRlcm4gY29udGFpbmluZyB3aWxkY2FyZAotLy8gICAqIGNoYXJhY3RlcnMuIFRoZSB3aWxkY2FyZCBjaGFyYWN0ZXJzIHRoYXQgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlICc/JyAodG8gbWF0Y2ggYW55IHNpbmdsZQotLy8gICAqIGNoYXJhY3RlcikgYW5kICcqJyAodG8gbWF0Y2ggemVybyBvciBtb3JlIGNoYXJhY3RlcnMpLgotLy8gICAqCi0vLyAgICogQHBhcmFtIHBhdHRlcm4gdGhlIHBhdHRlcm4gdGhhdCBtYXRjaGluZyBlbGVtZW50cyBtdXN0IG1hdGNoCi0vLyAgICogQHBhcmFtIGNhc2VTZW5zaXRpdmUgYHRydWVgIGlmIGEgY2FzZSBzZW5zaXRpdmUgbWF0Y2ggaXMgdG8gYmUgcGVyZm9ybWVkCi0vLyAgICogQHJldHVybiB0aGUgcGF0dGVybiB0aGF0IHdhcyBjcmVhdGVkCi0vLyAgICovCi0vLyAgc3RhdGljIFNlYXJjaFBhdHRlcm4gY3JlYXRlV2lsZGNhcmRQYXR0ZXJuKFN0cmluZyBwYXR0ZXJuLCBib29sIGNhc2VTZW5zaXRpdmUpID0+IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm4ocGF0dGVybiwgY2FzZVNlbnNpdGl2ZSk7Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaERlY2xhcmF0aW9ucyBpbXBsZW1lbnRzIFNlYXJjaEVuZ2luZUltcGxfU2VhcmNoUnVubmVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsIFNlYXJjaEVuZ2luZUltcGxfdGhpczsKLS8vCi0vLyAgU3RyaW5nIG5hbWU7Ci0vLwotLy8gIFNlYXJjaFNjb3BlIHNjb3BlOwotLy8KLS8vICBTZWFyY2hGaWx0ZXIgZmlsdGVyOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hEZWNsYXJhdGlvbnModGhpcy5TZWFyY2hFbmdpbmVJbXBsX3RoaXMsIHRoaXMubmFtZSwgdGhpcy5zY29wZSwgdGhpcy5maWx0ZXIpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHBlcmZvcm1TZWFyY2goU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIFNlYXJjaEVuZ2luZUltcGxfdGhpcy5zZWFyY2hEZWNsYXJhdGlvbnMyKG5hbWUsIHNjb3BlLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGwgU2VhcmNoRW5naW5lSW1wbF90aGlzOwotLy8KLS8vICBTZWFyY2hTY29wZSBzY29wZTsKLS8vCi0vLyAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotLy8KLS8vICBTZWFyY2hGaWx0ZXIgZmlsdGVyOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9ucyh0aGlzLlNlYXJjaEVuZ2luZUltcGxfdGhpcywgdGhpcy5zY29wZSwgdGhpcy5wYXR0ZXJuLCB0aGlzLmZpbHRlcik7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgcGVyZm9ybVNlYXJjaChTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgU2VhcmNoRW5naW5lSW1wbF90aGlzLnNlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zMihzY29wZSwgcGF0dGVybiwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hRdWFsaWZpZWRNZW1iZXJSZWZlcmVuY2VzIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGwgU2VhcmNoRW5naW5lSW1wbF90aGlzOwotLy8KLS8vICBTdHJpbmcgbmFtZTsKLS8vCi0vLyAgU2VhcmNoU2NvcGUgc2NvcGU7Ci0vLwotLy8gIFNlYXJjaEZpbHRlciBmaWx0ZXI7Ci0vLwotLy8gIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaFF1YWxpZmllZE1lbWJlclJlZmVyZW5jZXModGhpcy5TZWFyY2hFbmdpbmVJbXBsX3RoaXMsIHRoaXMubmFtZSwgdGhpcy5zY29wZSwgdGhpcy5maWx0ZXIpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHBlcmZvcm1TZWFyY2goU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIFNlYXJjaEVuZ2luZUltcGxfdGhpcy5zZWFyY2hRdWFsaWZpZWRNZW1iZXJSZWZlcmVuY2VzMihuYW1lLCBzY29wZSwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hSZWZlcmVuY2VzIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGwgU2VhcmNoRW5naW5lSW1wbF90aGlzOwotLy8KLS8vICBFbGVtZW50IGVsZW1lbnQ7Ci0vLwotLy8gIFNlYXJjaFNjb3BlIHNjb3BlOwotLy8KLS8vICBTZWFyY2hGaWx0ZXIgZmlsdGVyOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hSZWZlcmVuY2VzKHRoaXMuU2VhcmNoRW5naW5lSW1wbF90aGlzLCB0aGlzLmVsZW1lbnQsIHRoaXMuc2NvcGUsIHRoaXMuZmlsdGVyKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBwZXJmb3JtU2VhcmNoKFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0vLyAgICBTZWFyY2hFbmdpbmVJbXBsX3RoaXMuc2VhcmNoUmVmZXJlbmNlczIoZWxlbWVudCwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoU3VidHlwZXMgaW1wbGVtZW50cyBTZWFyY2hFbmdpbmVJbXBsX1NlYXJjaFJ1bm5lciB7Ci0vLyAgZmluYWwgU2VhcmNoRW5naW5lSW1wbCBTZWFyY2hFbmdpbmVJbXBsX3RoaXM7Ci0vLwotLy8gIENsYXNzRWxlbWVudCB0eXBlOwotLy8KLS8vICBTZWFyY2hTY29wZSBzY29wZTsKLS8vCi0vLyAgU2VhcmNoRmlsdGVyIGZpbHRlcjsKLS8vCi0vLyAgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoU3VidHlwZXModGhpcy5TZWFyY2hFbmdpbmVJbXBsX3RoaXMsIHRoaXMudHlwZSwgdGhpcy5zY29wZSwgdGhpcy5maWx0ZXIpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHBlcmZvcm1TZWFyY2goU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIpIHsKLS8vICAgIFNlYXJjaEVuZ2luZUltcGxfdGhpcy5zZWFyY2hTdWJ0eXBlczIodHlwZSwgc2NvcGUsIGZpbHRlciwgbGlzdGVuZXIpOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoVHlwZURlY2xhcmF0aW9ucyBpbXBsZW1lbnRzIFNlYXJjaEVuZ2luZUltcGxfU2VhcmNoUnVubmVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsIFNlYXJjaEVuZ2luZUltcGxfdGhpczsKLS8vCi0vLyAgU2VhcmNoU2NvcGUgc2NvcGU7Ci0vLwotLy8gIFNlYXJjaFBhdHRlcm4gcGF0dGVybjsKLS8vCi0vLyAgU2VhcmNoRmlsdGVyIGZpbHRlcjsKLS8vCi0vLyAgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxfc2VhcmNoVHlwZURlY2xhcmF0aW9ucyh0aGlzLlNlYXJjaEVuZ2luZUltcGxfdGhpcywgdGhpcy5zY29wZSwgdGhpcy5wYXR0ZXJuLCB0aGlzLmZpbHRlcik7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgcGVyZm9ybVNlYXJjaChTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgU2VhcmNoRW5naW5lSW1wbF90aGlzLnNlYXJjaFR5cGVEZWNsYXJhdGlvbnMyKHNjb3BlLCBwYXR0ZXJuLCBmaWx0ZXIsIGxpc3RlbmVyKTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsX3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGwgU2VhcmNoRW5naW5lSW1wbF90aGlzOwotLy8KLS8vICBTZWFyY2hTY29wZSBzY29wZTsKLS8vCi0vLyAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotLy8KLS8vICBTZWFyY2hGaWx0ZXIgZmlsdGVyOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbF9zZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9ucyh0aGlzLlNlYXJjaEVuZ2luZUltcGxfdGhpcywgdGhpcy5zY29wZSwgdGhpcy5wYXR0ZXJuLCB0aGlzLmZpbHRlcik7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgcGVyZm9ybVNlYXJjaChTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgU2VhcmNoRW5naW5lSW1wbF90aGlzLnNlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zMihzY29wZSwgcGF0dGVybiwgZmlsdGVyLCBsaXN0ZW5lcik7Ci0vLyAgfQotLy99Ci0vLwotLy8vKioKLS8vICogVGhlIGNsYXNzIDxjb2RlPlNlYXJjaFNjb3BlRmFjdG9yeTwvY29kZT4gZGVmaW5lcyB1dGlsaXR5IG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUKLS8vICogc2VhcmNoIHNjb3Blcy4KLS8vICovCi0vL2NsYXNzIFNlYXJjaFNjb3BlRmFjdG9yeSB7Ci0vLyAgLyoqCi0vLyAgICogQSBzZWFyY2ggc2NvcGUgdGhhdCBlbmNvbXBhc3NlcyBldmVyeXRoaW5nIGluIHRoZSAidW5pdmVyc2UiLiBCZWNhdXNlIGl0IGRvZXMgbm90IGhvbGQgYW55Ci0vLyAgICogc3RhdGUgdGhlcmUgaXMgbm8gcmVhc29uIG5vdCB0byBzaGFyZSBhIHNpbmdsZSBpbnN0YW5jZS4KLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoU2NvcGUgX1VOSVZFUlNFX1NDT1BFID0gbmV3IFVuaXZlcnNlU2VhcmNoU2NvcGUoKTsKLS8vCi0vLyAgLyoqCi0vLyAgICogQ3JlYXRlIGEgc2VhcmNoIHNjb3BlIHRoYXQgZW5jb21wYXNzZXMgZXZlcnl0aGluZyBpbiB0aGUgZ2l2ZW4gbGlicmFyeS4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBsaWJyYXJ5IHRoZSBsaWJyYXJ5IGRlZmluaW5nIHdoaWNoIGVsZW1lbnRzIGFyZSBpbmNsdWRlZCBpbiB0aGUgc2NvcGUKLS8vICAgKiBAcmV0dXJuIHRoZSBzZWFyY2ggc2NvcGUgdGhhdCB3YXMgY3JlYXRlZAotLy8gICAqLwotLy8gIHN0YXRpYyBTZWFyY2hTY29wZSBjcmVhdGVMaWJyYXJ5U2NvcGUoSXRlcmFibGU8TGlicmFyeUVsZW1lbnQ+IGxpYnJhcmllcykgPT4gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24xKGxpYnJhcmllcyk7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHNlYXJjaCBzY29wZSB0aGF0IGVuY29tcGFzc2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIGdpdmVuIGxpYnJhcmllcy4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBsaWJyYXJpZXMgdGhlIGxpYnJhcmllcyBkZWZpbmluZyB3aGljaCBlbGVtZW50cyBhcmUgaW5jbHVkZWQgaW4gdGhlIHNjb3BlCi0vLyAgICogQHJldHVybiB0aGUgc2VhcmNoIHNjb3BlIHRoYXQgd2FzIGNyZWF0ZWQKLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoU2NvcGUgY3JlYXRlTGlicmFyeVNjb3BlMihMaXN0PExpYnJhcnlFbGVtZW50PiBsaWJyYXJpZXMpID0+IG5ldyBMaWJyYXJ5U2VhcmNoU2NvcGUuY29uMihsaWJyYXJpZXMpOwotLy8KLS8vICAvKioKLS8vICAgKiBDcmVhdGUgYSBzZWFyY2ggc2NvcGUgdGhhdCBlbmNvbXBhc3NlcyBldmVyeXRoaW5nIGluIHRoZSBnaXZlbiBsaWJyYXJ5LgotLy8gICAqCi0vLyAgICogQHBhcmFtIGxpYnJhcnkgdGhlIGxpYnJhcnkgZGVmaW5pbmcgd2hpY2ggZWxlbWVudHMgYXJlIGluY2x1ZGVkIGluIHRoZSBzY29wZQotLy8gICAqIEByZXR1cm4gdGhlIHNlYXJjaCBzY29wZSB0aGF0IHdhcyBjcmVhdGVkCi0vLyAgICovCi0vLyAgc3RhdGljIFNlYXJjaFNjb3BlIGNyZWF0ZUxpYnJhcnlTY29wZTMoTGlicmFyeUVsZW1lbnQgbGlicmFyeSkgPT4gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLwotLy8gIC8qKgotLy8gICAqIENyZWF0ZSBhIHNlYXJjaCBzY29wZSB0aGF0IGVuY29tcGFzc2VzIGV2ZXJ5dGhpbmcgaW4gdGhlIHVuaXZlcnNlLgotLy8gICAqCi0vLyAgICogQHJldHVybiB0aGUgc2VhcmNoIHNjb3BlIHRoYXQgd2FzIGNyZWF0ZWQKLS8vICAgKi8KLS8vICBzdGF0aWMgU2VhcmNoU2NvcGUgY3JlYXRlVW5pdmVyc2VTY29wZSgpID0+IF9VTklWRVJTRV9TQ09QRTsKLS8vfQotLy8KLS8vLyoqCi0vLyAqIFRoZSBbU2VhcmNoU2NvcGVdIHRoYXQgZW5jb21wYXNzZXMgZXZlcnl0aGluZyBpbiB0aGUgdW5pdmVyc2UuCi0vLyAqLwotLy9jbGFzcyBVbml2ZXJzZVNlYXJjaFNjb3BlIGltcGxlbWVudHMgU2VhcmNoU2NvcGUgewotLy8gIEBvdmVycmlkZQotLy8gIGJvb2wgZW5jbG9zZXMoRWxlbWVudCBlbGVtZW50KSA9PiB0cnVlOwotLy99Ci0vLwotLy8vKioKLS8vICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyA8Y29kZT5XaWxkY2FyZFNlYXJjaFBhdHRlcm48L2NvZGU+IGltcGxlbWVudCBhIHNlYXJjaCBwYXR0ZXJuIHRoYXQgbWF0Y2hlcwotLy8gKiBlbGVtZW50cyB3aG9zZSBuYW1lIG1hdGNoZXMgYSBwYXR0ZXJuIHdpdGggd2lsZGNhcmQgY2hhcmFjdGVycy4gVGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgdGhhdCBhcmUKLS8vICogY3VycmVudGx5IHN1cHBvcnRlZCBhcmUgJz8nICh0byBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlcikgYW5kICcqJyAodG8gbWF0Y2ggemVybyBvciBtb3JlCi0vLyAqIGNoYXJhY3RlcnMpLgotLy8gKi8KLS8vY2xhc3MgV2lsZGNhcmRTZWFyY2hQYXR0ZXJuIGltcGxlbWVudHMgU2VhcmNoUGF0dGVybiB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIHBhdHRlcm4gdGhhdCBtYXRjaGluZyBlbGVtZW50cyBtdXN0IG1hdGNoLgotLy8gICAqLwotLy8gIExpc3Q8aW50PiBfcGF0dGVybjsKLS8vCi0vLyAgLyoqCi0vLyAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZC4KLS8vICAgKi8KLS8vICBmaW5hbCBib29sIF9jYXNlU2Vuc2l0aXZlOwotLy8KLS8vICAvKioKLS8vICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBzZWFyY2ggcGF0dGVybiB0byBtYXRjaCBlbGVtZW50cyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZSBnaXZlbgotLy8gICAqIHByZWZpeC4KLS8vICAgKgotLy8gICAqIEBwYXJhbSBwYXR0ZXJuIHRoZSBwYXR0ZXJuIHRoYXQgbWF0Y2hpbmcgZWxlbWVudHMgbXVzdCBtYXRjaAotLy8gICAqIEBwYXJhbSBjYXNlU2Vuc2l0aXZlIGB0cnVlYCBpZiBhIGNhc2Ugc2Vuc2l0aXZlIG1hdGNoIGlzIHRvIGJlIHBlcmZvcm1lZAotLy8gICAqLwotLy8gIFdpbGRjYXJkU2VhcmNoUGF0dGVybihTdHJpbmcgcGF0dGVybiwgdGhpcy5fY2FzZVNlbnNpdGl2ZSkgewotLy8gICAgdGhpcy5fcGF0dGVybiA9IF9jYXNlU2Vuc2l0aXZlID8gcGF0dGVybi50b0NoYXJBcnJheSgpIDogcGF0dGVybi50b0xvd2VyQ2FzZSgpLnRvQ2hhckFycmF5KCk7Ci0vLyAgfQotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBNYXRjaFF1YWxpdHkgbWF0Y2hlcyhFbGVtZW50IGVsZW1lbnQpIHsKLS8vICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLS8vICAgICAgcmV0dXJuIG51bGw7Ci0vLyAgICB9Ci0vLyAgICBTdHJpbmcgbmFtZSA9IGVsZW1lbnQuZGlzcGxheU5hbWU7Ci0vLyAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0vLyAgICAgIHJldHVybiBudWxsOwotLy8gICAgfQotLy8gICAgaWYgKENoYXJPcGVyYXRpb24ubWF0Y2goX3BhdHRlcm4sIG5hbWUudG9DaGFyQXJyYXkoKSwgX2Nhc2VTZW5zaXRpdmUpKSB7Ci0vLyAgICAgIHJldHVybiBNYXRjaFF1YWxpdHkuRVhBQ1Q7Ci0vLyAgICB9Ci0vLyAgICByZXR1cm4gbnVsbDsKLS8vICB9Ci0vL30KLS8vCi0vLy8qKgotLy8gKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIDxjb2RlPlNjb3BlZFNlYXJjaExpc3RlbmVyPC9jb2RlPiBpbXBsZW1lbnQgYSBzZWFyY2ggbGlzdGVuZXIgdGhhdAotLy8gKiBkZWxlZ2F0ZXMgdG8gYW5vdGhlciBzZWFyY2ggbGlzdGVuZXIgYWZ0ZXIgcmVtb3ZpbmcgbWF0Y2hlcyB0aGF0IGFyZSBvdXRzaWRlIGEgZ2l2ZW4gc2NvcGUuCi0vLyAqLwotLy9hYnN0cmFjdCBjbGFzcyBXcmFwcGVkU2VhcmNoTGlzdGVuZXIgaW1wbGVtZW50cyBTZWFyY2hMaXN0ZW5lciB7Ci0vLyAgLyoqCi0vLyAgICogVGhlIGxpc3RlbmVyIGJlaW5nIHdyYXBwZWQuCi0vLyAgICovCi0vLyAgU2VhcmNoTGlzdGVuZXIgX2Jhc2VMaXN0ZW5lcjsKLS8vCi0vLyAgLyoqCi0vLyAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgc2VhcmNoIGxpc3RlbmVyIHRvIHdyYXAgdGhlIGdpdmVuIGxpc3RlbmVyLgotLy8gICAqCi0vLyAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBzZWFyY2ggbGlzdGVuZXIgYmVpbmcgd3JhcHBlZAotLy8gICAqLwotLy8gIFdyYXBwZWRTZWFyY2hMaXN0ZW5lcihTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lcikgewotLy8gICAgX2Jhc2VMaXN0ZW5lciA9IGxpc3RlbmVyOwotLy8gIH0KLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZWFyY2hDb21wbGV0ZSgpIHsKLS8vICAgIF9iYXNlTGlzdGVuZXIuc2VhcmNoQ29tcGxldGUoKTsKLS8vICB9Ci0vLwotLy8gIC8qKgotLy8gICAqIFBhc3MgdGhlIGdpdmVuIG1hdGNoIG9uIHRvIHRoZSB3cmFwcGVkIGxpc3RlbmVyLgotLy8gICAqCi0vLyAgICogQHBhcmFtIG1hdGNoIHRoZSBtYXRjaCB0byBiZSBwcm9wYWdhdGVkCi0vLyAgICovCi0vLyAgdm9pZCBwcm9wYWdhdGVNYXRjaChTZWFyY2hNYXRjaCBtYXRjaCkgewotLy8gICAgX2Jhc2VMaXN0ZW5lci5tYXRjaEZvdW5kKG1hdGNoKTsKLS8vICB9Ci0vL30KKworLyoqCisgKiBBIFtTZWFyY2hFbmdpbmVdIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBTZWFyY2hFbmdpbmVJbXBsIGltcGxlbWVudHMgU2VhcmNoRW5naW5lIHsKKyAgZmluYWwgSW5kZXggX2luZGV4OworCisgIFNlYXJjaEVuZ2luZUltcGwodGhpcy5faW5kZXgpOworCisgIEBvdmVycmlkZQorICBGdXR1cmU8TGlzdDxTZWFyY2hNYXRjaD4+IHNlYXJjaE1lbWJlckRlY2xhcmF0aW9ucyhTdHJpbmcgbmFtZSkgeworICAgIE5hbWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgTmFtZUVsZW1lbnQobmFtZSk7CisgICAgX1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgX1JlcXVlc3RvcihfaW5kZXgpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0RFRklORURfQlksCisgICAgICAgIE1hdGNoS2luZC5OQU1FX0RFQ0xBUkFUSU9OKTsKKyAgICByZXR1cm4gcmVxdWVzdG9yLm1lcmdlKCkudGhlbigobWF0Y2hlcykgeworICAgICAgcmV0dXJuIG1hdGNoZXMud2hlcmUoKG1hdGNoKSB7CisgICAgICAgIHJldHVybiBtYXRjaC5lbGVtZW50LmVuY2xvc2luZ0VsZW1lbnQgaXMgQ2xhc3NFbGVtZW50OworICAgICAgfSkudG9MaXN0KCk7CisgICAgfSk7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PiBzZWFyY2hNZW1iZXJSZWZlcmVuY2VzKFN0cmluZyBuYW1lKSB7CisgICAgTmFtZUVsZW1lbnQgZWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudChuYW1lKTsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgLy8gcm91Z2h0CisvLyAgICByZXF1ZXN0b3IuYWRkKAorLy8gICAgICAgIGVsZW1lbnQsCisvLyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsCisvLyAgICAgICAgTWF0Y2hLaW5kLk5BTUVfUkVGRVJFTkNFX1JFU09MVkVEKTsKKy8vICAgIHJlcXVlc3Rvci5hZGQoCisvLyAgICAgICAgZWxlbWVudCwKKy8vICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorLy8gICAgICAgIE1hdGNoS2luZC5OQU1FX1JFRkVSRU5DRV9VTlJFU09MVkVELAorLy8gICAgICAgIGlzUmVzb2x2ZWQ6IGZhbHNlKTsKKyAgICAvLyBncmFudWxhciByZXNvbHZlZCBvcGVyYXRpb25zCisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19JTlZPS0VEX0JZX1JFU09MVkVELAorICAgICAgICBNYXRjaEtpbmQuTkFNRV9JTlZPQ0FUSU9OX1JFU09MVkVEKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfUkVTT0xWRUQsCisgICAgICAgIE1hdGNoS2luZC5OQU1FX1JFQURfUkVTT0xWRUQpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1JFU09MVkVELAorICAgICAgICBNYXRjaEtpbmQuTkFNRV9SRUFEX1dSSVRFX1JFU09MVkVEKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1dSSVRURU5fQllfUkVTT0xWRUQsCisgICAgICAgIE1hdGNoS2luZC5OQU1FX1dSSVRFX1JFU09MVkVEKTsKKyAgICAvLyBncmFudWxhciB1bnJlc29sdmVkIG9wZXJhdGlvbnMKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX0lOVk9LRURfQllfVU5SRVNPTFZFRCwKKyAgICAgICAgTWF0Y2hLaW5kLk5BTUVfSU5WT0NBVElPTl9VTlJFU09MVkVELAorICAgICAgICBpc1Jlc29sdmVkOiBmYWxzZSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19SRUFEX0JZX1VOUkVTT0xWRUQsCisgICAgICAgIE1hdGNoS2luZC5OQU1FX1JFQURfVU5SRVNPTFZFRCwKKyAgICAgICAgaXNSZXNvbHZlZDogZmFsc2UpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1VOUkVTT0xWRUQsCisgICAgICAgIE1hdGNoS2luZC5OQU1FX1JFQURfV1JJVEVfVU5SRVNPTFZFRCwKKyAgICAgICAgaXNSZXNvbHZlZDogZmFsc2UpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfV1JJVFRFTl9CWV9VTlJFU09MVkVELAorICAgICAgICBNYXRjaEtpbmQuTkFNRV9XUklURV9VTlJFU09MVkVELAorICAgICAgICBpc1Jlc29sdmVkOiBmYWxzZSk7CisgICAgLy8gZG9uZQorICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEBvdmVycmlkZQorICBGdXR1cmU8TGlzdDxTZWFyY2hNYXRjaD4+IHNlYXJjaFJlZmVyZW5jZXMoRWxlbWVudCBlbGVtZW50KSB7CisgICAgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5BTkdVTEFSX0NPTVBPTkVOVCB8fAorICAgICAgICBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9DT05UUk9MTEVSIHx8CisgICAgICAgIGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5BTkdVTEFSX0ZPUk1BVFRFUiB8fAorICAgICAgICBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9QUk9QRVJUWSB8fAorICAgICAgICBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9TQ09QRV9QUk9QRVJUWSB8fAorICAgICAgICBlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQU5HVUxBUl9TRUxFQ1RPUikgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXIoZWxlbWVudCBhcyBBbmd1bGFyRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQ0xBU1MpIHsKKyAgICAgIHJldHVybiBfc2VhcmNoUmVmZXJlbmNlc19DbGFzcyhlbGVtZW50IGFzIENsYXNzRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuQ09NUElMQVRJT05fVU5JVCkgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX0NvbXBpbGF0aW9uVW5pdCgKKyAgICAgICAgICBlbGVtZW50IGFzIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkNPTlNUUlVDVE9SKSB7CisgICAgICByZXR1cm4gX3NlYXJjaFJlZmVyZW5jZXNfQ29uc3RydWN0b3IoZWxlbWVudCBhcyBDb25zdHJ1Y3RvckVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkZJRUxEIHx8CisgICAgICAgIGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5UT1BfTEVWRUxfVkFSSUFCTEUpIHsKKyAgICAgIHJldHVybiBfc2VhcmNoUmVmZXJlbmNlc19GaWVsZChlbGVtZW50IGFzIFByb3BlcnR5SW5kdWNpbmdFbGVtZW50KTsKKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5GVU5DVElPTikgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX0Z1bmN0aW9uKGVsZW1lbnQgYXMgRnVuY3Rpb25FbGVtZW50KTsKKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQua2luZCA9PSBFbGVtZW50S2luZC5HRVRURVIgfHwKKyAgICAgICAgZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLlNFVFRFUikgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3IoCisgICAgICAgICAgZWxlbWVudCBhcyBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuSU1QT1JUKSB7CisgICAgICByZXR1cm4gX3NlYXJjaFJlZmVyZW5jZXNfSW1wb3J0KGVsZW1lbnQgYXMgSW1wb3J0RWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuTElCUkFSWSkgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX0xpYnJhcnkoZWxlbWVudCBhcyBMaWJyYXJ5RWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuTE9DQUxfVkFSSUFCTEUpIHsKKyAgICAgIHJldHVybiBfc2VhcmNoUmVmZXJlbmNlc19Mb2NhbFZhcmlhYmxlKGVsZW1lbnQgYXMgTG9jYWxWYXJpYWJsZUVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLk1FVEhPRCkgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX01ldGhvZChlbGVtZW50IGFzIE1ldGhvZEVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLlBBUkFNRVRFUikgeworICAgICAgcmV0dXJuIF9zZWFyY2hSZWZlcmVuY2VzX1BhcmFtZXRlcihlbGVtZW50IGFzIFBhcmFtZXRlckVsZW1lbnQpOworICAgIH0gZWxzZSBpZiAoZWxlbWVudC5raW5kID09IEVsZW1lbnRLaW5kLkZVTkNUSU9OX1RZUEVfQUxJQVMpIHsKKyAgICAgIHJldHVybiBfc2VhcmNoUmVmZXJlbmNlc19GdW5jdGlvblR5cGVBbGlhcygKKyAgICAgICAgICBlbGVtZW50IGFzIEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCk7CisgICAgfSBlbHNlIGlmIChlbGVtZW50LmtpbmQgPT0gRWxlbWVudEtpbmQuVFlQRV9QQVJBTUVURVIpIHsKKyAgICAgIHJldHVybiBfc2VhcmNoUmVmZXJlbmNlc19UeXBlUGFyYW1ldGVyKGVsZW1lbnQgYXMgVHlwZVBhcmFtZXRlckVsZW1lbnQpOworICAgIH0KKyAgICByZXR1cm4gbmV3IEZ1dHVyZS52YWx1ZSg8U2VhcmNoTWF0Y2g+W10pOworICB9CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4gc2VhcmNoU3VidHlwZXMoQ2xhc3NFbGVtZW50IHR5cGUpIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgdHlwZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfRVhURU5ERURfQlksCisgICAgICAgIE1hdGNoS2luZC5FWFRFTkRTX1JFRkVSRU5DRSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgdHlwZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfTUlYRURfSU5fQlksCisgICAgICAgIE1hdGNoS2luZC5XSVRIX1JFRkVSRU5DRSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgdHlwZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU1QTEVNRU5URURfQlksCisgICAgICAgIE1hdGNoS2luZC5JTVBMRU1FTlRTX1JFRkVSRU5DRSk7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgQG92ZXJyaWRlCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4gc2VhcmNoVG9wTGV2ZWxEZWNsYXJhdGlvbnMoU3RyaW5nIHBhdHRlcm4pIHsKKyAgICBVbml2ZXJzZUVsZW1lbnQgdW5pdmVyc2UgPSBVbml2ZXJzZUVsZW1lbnQuSU5TVEFOQ0U7CisgICAgX1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgX1JlcXVlc3RvcihfaW5kZXgpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHVuaXZlcnNlLAorICAgICAgICBJbmRleENvbnN0YW50cy5ERUZJTkVTX0NMQVNTLAorICAgICAgICBNYXRjaEtpbmQuQ0xBU1NfREVDTEFSQVRJT04pOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHVuaXZlcnNlLAorICAgICAgICBJbmRleENvbnN0YW50cy5ERUZJTkVTX0NMQVNTX0FMSUFTLAorICAgICAgICBNYXRjaEtpbmQuQ0xBU1NfQUxJQVNfREVDTEFSQVRJT04pOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHVuaXZlcnNlLAorICAgICAgICBJbmRleENvbnN0YW50cy5ERUZJTkVTX0ZVTkNUSU9OX1RZUEUsCisgICAgICAgIE1hdGNoS2luZC5GVU5DVElPTl9UWVBFX0RFQ0xBUkFUSU9OKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICB1bml2ZXJzZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTiwKKyAgICAgICAgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICB1bml2ZXJzZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19WQVJJQUJMRSwKKyAgICAgICAgTWF0Y2hLaW5kLlZBUklBQkxFX0RFQ0xBUkFUSU9OKTsKKyAgICBSZWdFeHAgcmVnRXhwID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTsKKyAgICByZXR1cm4gcmVxdWVzdG9yLm1lcmdlKCkudGhlbigoTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcykgeworICAgICAgcmV0dXJuIG1hdGNoZXMud2hlcmUoKFNlYXJjaE1hdGNoIG1hdGNoKSB7CisgICAgICAgIFN0cmluZyBuYW1lID0gbWF0Y2guZWxlbWVudC5kaXNwbGF5TmFtZTsKKyAgICAgICAgcmV0dXJuIHJlZ0V4cC5oYXNNYXRjaChuYW1lKTsKKyAgICAgIH0pLnRvTGlzdCgpOworICAgIH0pOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PiBfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyKEFuZ3VsYXJFbGVtZW50IGVsZW1lbnQpIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuQU5HVUxBUl9SRUZFUkVOQ0UsCisgICAgICAgIE1hdGNoS2luZC5BTkdVTEFSX1JFRkVSRU5DRSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuQU5HVUxBUl9DTE9TSU5HX1RBR19SRUZFUkVOQ0UsCisgICAgICAgIE1hdGNoS2luZC5BTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRSk7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PiBfc2VhcmNoUmVmZXJlbmNlc19DbGFzcyhDbGFzc0VsZW1lbnQgY2xhenopIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgY2xhenosCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICAgIE1hdGNoS2luZC5UWVBFX1JFRkVSRU5DRSk7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PgorICAgICAgX3NlYXJjaFJlZmVyZW5jZXNfQ29tcGlsYXRpb25Vbml0KENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgdW5pdCkgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICB1bml0LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgICAgICBNYXRjaEtpbmQuVU5JVF9SRUZFUkVOQ0UpOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX0NvbnN0cnVjdG9yKENvbnN0cnVjdG9yRWxlbWVudCBjb25zdHJ1Y3RvcikgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBjb25zdHJ1Y3RvciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkNPTlNUUlVDVE9SX0RFQ0xBUkFUSU9OKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBjb25zdHJ1Y3RvciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkNPTlNUUlVDVE9SX1JFRkVSRU5DRSk7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PgorICAgICAgX3NlYXJjaFJlZmVyZW5jZXNfRmllbGQoUHJvcGVydHlJbmR1Y2luZ0VsZW1lbnQgZmllbGQpIHsKKyAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBnZXR0ZXIgPSBmaWVsZC5nZXR0ZXI7CisgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgc2V0dGVyID0gZmllbGQuc2V0dGVyOworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICAvLyBmaWVsZCBpdHNlbGYKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBmaWVsZCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkZJRUxEX1JFRkVSRU5DRSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZmllbGQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICBNYXRjaEtpbmQuRklFTERfUkVGRVJFTkNFKTsKKyAgICAvLyBnZXR0ZXIKKyAgICBpZiAoZ2V0dGVyICE9IG51bGwpIHsKKyAgICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgICAgZ2V0dGVyLAorICAgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICAgIE1hdGNoS2luZC5GSUVMRF9SRUFEKTsKKyAgICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgICAgZ2V0dGVyLAorICAgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsCisgICAgICAgICAgTWF0Y2hLaW5kLkZJRUxEX1JFQUQpOworICAgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgICBnZXR0ZXIsCisgICAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsCisgICAgICAgICAgTWF0Y2hLaW5kLkZJRUxEX0lOVk9DQVRJT04pOworICAgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgICBnZXR0ZXIsCisgICAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgICBNYXRjaEtpbmQuRklFTERfSU5WT0NBVElPTik7CisgICAgfQorICAgIC8vIHNldHRlcgorICAgIGlmIChzZXR0ZXIgIT0gbnVsbCkgeworICAgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgICBzZXR0ZXIsCisgICAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsCisgICAgICAgICAgTWF0Y2hLaW5kLkZJRUxEX1dSSVRFKTsKKyAgICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgICAgc2V0dGVyLAorICAgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsCisgICAgICAgICAgTWF0Y2hLaW5kLkZJRUxEX1dSSVRFKTsKKyAgICB9CisgICAgLy8gZG9uZQorICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX0Z1bmN0aW9uKEZ1bmN0aW9uRWxlbWVudCBmdW5jdGlvbikgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBmdW5jdGlvbiwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkZVTkNUSU9OX1JFRkVSRU5DRSk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgZnVuY3Rpb24sCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksCisgICAgICAgIE1hdGNoS2luZC5GVU5DVElPTl9FWEVDVVRJT04pOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX0Z1bmN0aW9uVHlwZUFsaWFzKEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCBhbGlhcykgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBhbGlhcywKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfUkVGRVJFTkNFKTsKKyAgICByZXR1cm4gcmVxdWVzdG9yLm1lcmdlKCk7CisgIH0KKworICBGdXR1cmU8TGlzdDxTZWFyY2hNYXRjaD4+IF9zZWFyY2hSZWZlcmVuY2VzX0ltcG9ydChJbXBvcnRFbGVtZW50IGltcCkgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBpbXAsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICAgIE1hdGNoS2luZC5JTVBPUlRfUkVGRVJFTkNFKTsKKyAgICByZXR1cm4gcmVxdWVzdG9yLm1lcmdlKCk7CisgIH0KKworICBGdXR1cmU8TGlzdDxTZWFyY2hNYXRjaD4+IF9zZWFyY2hSZWZlcmVuY2VzX0xpYnJhcnkoTGlicmFyeUVsZW1lbnQgbGlicmFyeSkgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBsaWJyYXJ5LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgICAgICBNYXRjaEtpbmQuTElCUkFSWV9SRUZFUkVOQ0UpOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX0xvY2FsVmFyaWFibGUoTG9jYWxWYXJpYWJsZUVsZW1lbnQgdmFyaWFibGUpIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgcmVxdWVzdG9yLmFkZCh2YXJpYWJsZSwgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9CWSwgTWF0Y2hLaW5kLlZBUklBQkxFX1JFQUQpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHZhcmlhYmxlLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUFEX1dSSVRURU5fQlksCisgICAgICAgIE1hdGNoS2luZC5WQVJJQUJMRV9SRUFEX1dSSVRFKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICB2YXJpYWJsZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfV1JJVFRFTl9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLlZBUklBQkxFX1dSSVRFKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICB2YXJpYWJsZSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLkZVTkNUSU9OX0VYRUNVVElPTik7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PiBfc2VhcmNoUmVmZXJlbmNlc19NZXRob2QoTWV0aG9kRWxlbWVudCBtZXRob2QpIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgaWYgKG1ldGhvZCBpcyBNZXRob2RNZW1iZXIpIHsKKyAgICAgIG1ldGhvZCA9IChtZXRob2QgYXMgTWV0aG9kTWVtYmVyKS5iYXNlRWxlbWVudDsKKyAgICB9CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgbWV0aG9kLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKKyAgICAgICAgTWF0Y2hLaW5kLk1FVEhPRF9SRUZFUkVOQ0UpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIG1ldGhvZCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgTWF0Y2hLaW5kLk1FVEhPRF9SRUZFUkVOQ0UpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIG1ldGhvZCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsCisgICAgICAgIE1hdGNoS2luZC5NRVRIT0RfSU5WT0NBVElPTik7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgbWV0aG9kLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1VOUVVBTElGSUVELAorICAgICAgICBNYXRjaEtpbmQuTUVUSE9EX0lOVk9DQVRJT04pOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX1BhcmFtZXRlcihQYXJhbWV0ZXJFbGVtZW50IHBhcmFtZXRlcikgeworICAgIF9SZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IF9SZXF1ZXN0b3IoX2luZGV4KTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBwYXJhbWV0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFQURfQlksCisgICAgICAgIE1hdGNoS2luZC5WQVJJQUJMRV9SRUFEKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBwYXJhbWV0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFQURfV1JJVFRFTl9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLlZBUklBQkxFX1JFQURfV1JJVEUpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHBhcmFtZXRlciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfV1JJVFRFTl9CWSwKKyAgICAgICAgTWF0Y2hLaW5kLlZBUklBQkxFX1dSSVRFKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBwYXJhbWV0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICAgIE1hdGNoS2luZC5OQU1FRF9QQVJBTUVURVJfUkVGRVJFTkNFKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBwYXJhbWV0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksCisgICAgICAgIE1hdGNoS2luZC5GVU5DVElPTl9FWEVDVVRJT04pOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorCisgIEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4KKyAgICAgIF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3IoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgYWNjZXNzb3IpIHsKKyAgICBfUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBfUmVxdWVzdG9yKF9pbmRleCk7CisgICAgcmVxdWVzdG9yLmFkZCgKKyAgICAgICAgYWNjZXNzb3IsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICBNYXRjaEtpbmQuUFJPUEVSVFlfQUNDRVNTT1JfUkVGRVJFTkNFKTsKKyAgICByZXF1ZXN0b3IuYWRkKAorICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgTWF0Y2hLaW5kLlBST1BFUlRZX0FDQ0VTU09SX1JFRkVSRU5DRSk7CisgICAgcmV0dXJuIHJlcXVlc3Rvci5tZXJnZSgpOworICB9CisKKyAgRnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+PgorICAgICAgX3NlYXJjaFJlZmVyZW5jZXNfVHlwZVBhcmFtZXRlcihUeXBlUGFyYW1ldGVyRWxlbWVudCB0eXBlUGFyYW1ldGVyKSB7CisgICAgX1JlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgX1JlcXVlc3RvcihfaW5kZXgpOworICAgIHJlcXVlc3Rvci5hZGQoCisgICAgICAgIHR5cGVQYXJhbWV0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICAgIE1hdGNoS2luZC5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0UpOworICAgIHJldHVybiByZXF1ZXN0b3IubWVyZ2UoKTsKKyAgfQorfQorCisKK2NsYXNzIF9SZXF1ZXN0b3IgeworICBmaW5hbCBMaXN0PEZ1dHVyZTxMaXN0PFNlYXJjaE1hdGNoPj4+IGZ1dHVyZXMgPSA8RnV0dXJlPExpc3Q8U2VhcmNoTWF0Y2g+Pj5bXTsKKyAgZmluYWwgSW5kZXggaW5kZXg7CisKKyAgX1JlcXVlc3Rvcih0aGlzLmluZGV4KTsKKworICB2b2lkIGFkZChFbGVtZW50IGVsZW1lbnQyLCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLCBNYXRjaEtpbmQga2luZCwKKyAgICAgIHtib29sIGlzUmVzb2x2ZWQ6IHRydWV9KSB7CisgICAgRnV0dXJlIHJlbGF0aW9uc0Z1dHVyZSA9IGluZGV4LmdldFJlbGF0aW9uc2hpcHMoZWxlbWVudDIsIHJlbGF0aW9uc2hpcCk7CisgICAgRnV0dXJlIG1hdGNoZXNGdXR1cmUgPSByZWxhdGlvbnNGdXR1cmUudGhlbigoTGlzdDxMb2NhdGlvbj4gbG9jYXRpb25zKSB7CisgICAgICBib29sIGlzUXVhbGlmaWVkID0KKyAgICAgICAgICByZWxhdGlvbnNoaXAgPT0gSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQgfHwKKyAgICAgICAgICByZWxhdGlvbnNoaXAgPT0gSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQ7CisgICAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gPFNlYXJjaE1hdGNoPltdOworICAgICAgZm9yIChMb2NhdGlvbiBsb2NhdGlvbiBpbiBsb2NhdGlvbnMpIHsKKyAgICAgICAgRWxlbWVudCBlbGVtZW50ID0gbG9jYXRpb24uZWxlbWVudDsKKyAgICAgICAgbWF0Y2hlcy5hZGQoCisgICAgICAgICAgICBuZXcgU2VhcmNoTWF0Y2goCisgICAgICAgICAgICAgICAga2luZCwKKyAgICAgICAgICAgICAgICBlbGVtZW50LAorICAgICAgICAgICAgICAgIG5ldyBTb3VyY2VSYW5nZShsb2NhdGlvbi5vZmZzZXQsIGxvY2F0aW9uLmxlbmd0aCksCisgICAgICAgICAgICAgICAgaXNSZXNvbHZlZCwKKyAgICAgICAgICAgICAgICBpc1F1YWxpZmllZCkpOworICAgICAgfQorICAgICAgcmV0dXJuIG1hdGNoZXM7CisgICAgfSk7CisgICAgZnV0dXJlcy5hZGQobWF0Y2hlc0Z1dHVyZSk7CisgIH0KKworICBGdXR1cmU8TGlzdDxTZWFyY2hNYXRjaD4+IG1lcmdlKCkgeworICAgIHJldHVybiBGdXR1cmUud2FpdChmdXR1cmVzKS50aGVuKChMaXN0PExpc3Q8U2VhcmNoTWF0Y2g+PiBtYXRjaGVzTGlzdCkgeworICAgICAgcmV0dXJuIG1hdGNoZXNMaXN0LmV4cGFuZCgobWF0Y2hlcykgPT4gbWF0Y2hlcykudG9MaXN0KCk7CisgICAgfSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9wdWJzcGVjLnlhbWwgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvcHVic3BlYy55YW1sCmluZGV4IDY2ZTlhYzIuLjE5NGNhZjIgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy9wdWJzcGVjLnlhbWwKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3B1YnNwZWMueWFtbApAQCAtMSwxMiArMSwxMiBAQAogbmFtZTogYW5hbHlzaXNfc2VydmljZXMKLXZlcnNpb246IDAuMS4wCit2ZXJzaW9uOiAwLjIuMAogYXV0aG9yOiBEYXJ0IFRlYW0gPG1pc2NAZGFydGxhbmcub3JnPgogZGVzY3JpcHRpb246IEEgc2V0IG9mIHNlcnZpY2VzIG9uIHRvcCBvZiBBbmFseXNpcyBFbmdpbmUKIGhvbWVwYWdlOiBodHRwOi8vd3d3LmRhcnRsYW5nLm9yZwogZW52aXJvbm1lbnQ6CiAgIHNkazogJz49MS4wLjAgPDIuMC4wJwogZGVwZW5kZW5jaWVzOgotICBhbmFseXplcjogJz49MC4yMS4wIDwxLjAuMCcKKyAgYW5hbHl6ZXI6ICc+PTAuMjEuMSA8MS4wLjAnCiBkZXZfZGVwZW5kZW5jaWVzOgotICBhbmFseXNpc190ZXN0aW5nOiAnPj0wLjIuMCA8MS4wLjAnCisgIGFuYWx5c2lzX3Rlc3Rpbmc6ICc+PTAuMy4wIDwxLjAuMCcKICAgdW5pdHRlc3Q6ICc+PTAuMTAuMCA8MC4xMi4wJwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3QvaW5kZXgvYWJzdHJhY3Rfc2luZ2xlX3VuaXQuZGFydCBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy90ZXN0L2luZGV4L2Fic3RyYWN0X3NpbmdsZV91bml0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMTEyZAotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy90ZXN0L2luZGV4L2Fic3RyYWN0X3NpbmdsZV91bml0LmRhcnQKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IHRlc3Quc2VydmljZXMuc3JjLmluZGV4LmFic3RyYWN0X3NpbmdsZV9maWxlOworCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfdGVzdGluZy9hYnN0cmFjdF9jb250ZXh0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvYXN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2Vycm9yLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dW5pdHRlc3QvdW5pdHRlc3QuZGFydCc7CisKKworY2xhc3MgQWJzdHJhY3RTaW5nbGVVbml0VGVzdCBleHRlbmRzIEFic3RyYWN0Q29udGV4dFRlc3QgeworICBib29sIHZlcmlmeU5vVGVzdFVuaXRFcnJvcnMgPSB0cnVlOworCisgIFN0cmluZyB0ZXN0Q29kZTsKKyAgU291cmNlIHRlc3RTb3VyY2U7CisgIENvbXBpbGF0aW9uVW5pdCB0ZXN0VW5pdDsKKyAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCB0ZXN0VW5pdEVsZW1lbnQ7CisgIExpYnJhcnlFbGVtZW50IHRlc3RMaWJyYXJ5RWxlbWVudDsKKworICB2b2lkIGFzc2VydE5vRXJyb3JzSW5Tb3VyY2UoU291cmNlIHNvdXJjZSkgeworICAgIExpc3Q8QW5hbHlzaXNFcnJvcj4gZXJyb3JzID0gY29udGV4dC5nZXRFcnJvcnMoc291cmNlKS5lcnJvcnM7CisgICAgZXhwZWN0KGVycm9ycywgaXNFbXB0eSk7CisgIH0KKworICBFbGVtZW50IGZpbmRFbGVtZW50KFN0cmluZyBuYW1lLCBbRWxlbWVudEtpbmQga2luZF0pIHsKKyAgICByZXR1cm4gZmluZENoaWxkRWxlbWVudCh0ZXN0VW5pdEVsZW1lbnQsIG5hbWUsIGtpbmQpOworICB9CisKKyAgQXN0Tm9kZSBmaW5kTm9kZUF0T2Zmc2V0KGludCBvZmZzZXQsIFtQcmVkaWNhdGU8QXN0Tm9kZT4gcHJlZGljYXRlXSkgeworICAgIEFzdE5vZGUgcmVzdWx0ID0gbmV3IE5vZGVMb2NhdG9yLmNvbjEob2Zmc2V0KS5zZWFyY2hXaXRoaW4odGVzdFVuaXQpOworICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiBwcmVkaWNhdGUgIT0gbnVsbCkgeworICAgICAgcmVzdWx0ID0gcmVzdWx0LmdldEFuY2VzdG9yKHByZWRpY2F0ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBBc3ROb2RlIGZpbmROb2RlQXRTdHJpbmcoU3RyaW5nIHNlYXJjaCwgW1ByZWRpY2F0ZTxBc3ROb2RlPiBwcmVkaWNhdGVdKSB7CisgICAgaW50IG9mZnNldCA9IGZpbmRPZmZzZXQoc2VhcmNoKTsKKyAgICByZXR1cm4gZmluZE5vZGVBdE9mZnNldChvZmZzZXQsIHByZWRpY2F0ZSk7CisgIH0KKworICBFbGVtZW50IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKFN0cmluZyBzZWFyY2gsCisgICAgICBbUHJlZGljYXRlPEFzdE5vZGU+IHByZWRpY2F0ZV0pIHsKKyAgICBBc3ROb2RlIG5vZGUgPSBmaW5kTm9kZUF0U3RyaW5nKHNlYXJjaCwgcHJlZGljYXRlKTsKKyAgICBpZiAobm9kZSA9PSBudWxsKSB7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgcmV0dXJuIEVsZW1lbnRMb2NhdG9yLmxvY2F0ZShub2RlKTsKKyAgfQorCisgIGludCBmaW5kT2Zmc2V0KFN0cmluZyBzZWFyY2gpIHsKKyAgICBpbnQgb2Zmc2V0ID0gdGVzdENvZGUuaW5kZXhPZihzZWFyY2gpOworICAgIGV4cGVjdChvZmZzZXQsIGlzTm9uTmVnYXRpdmUsIHJlYXNvbjogIk5vdCBmb3VuZCAnJHNlYXJjaCcgaW5cbiR0ZXN0Q29kZSIpOworICAgIHJldHVybiBvZmZzZXQ7CisgIH0KKworICBpbnQgZ2V0TGVhZGluZ0lkZW50aWZpZXJMZW5ndGgoU3RyaW5nIHNlYXJjaCkgeworICAgIGludCBsZW5ndGggPSAwOworICAgIHdoaWxlIChsZW5ndGggPCBzZWFyY2gubGVuZ3RoKSB7CisgICAgICBpbnQgYyA9IHNlYXJjaC5jb2RlVW5pdEF0KGxlbmd0aCk7CisgICAgICBpZiAoYyA+PSAnYScuY29kZVVuaXRBdCgwKSAmJiBjIDw9ICd6Jy5jb2RlVW5pdEF0KDApKSB7CisgICAgICAgIGxlbmd0aCsrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjID49ICdBJy5jb2RlVW5pdEF0KDApICYmIGMgPD0gJ1onLmNvZGVVbml0QXQoMCkpIHsKKyAgICAgICAgbGVuZ3RoKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGMgPj0gJzAnLmNvZGVVbml0QXQoMCkgJiYgYyA8PSAnOScuY29kZVVuaXRBdCgwKSkgeworICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGxlbmd0aDsKKyAgfQorCisgIHZvaWQgcmVzb2x2ZVRlc3RVbml0KFN0cmluZyBjb2RlKSB7CisgICAgdGVzdENvZGUgPSBjb2RlOworICAgIHRlc3RTb3VyY2UgPSBhZGRTb3VyY2UoJy90ZXN0LmRhcnQnLCBjb2RlKTsKKyAgICB0ZXN0VW5pdCA9IHJlc29sdmVMaWJyYXJ5VW5pdCh0ZXN0U291cmNlKTsKKyAgICBpZiAodmVyaWZ5Tm9UZXN0VW5pdEVycm9ycykgeworICAgICAgYXNzZXJ0Tm9FcnJvcnNJblNvdXJjZSh0ZXN0U291cmNlKTsKKyAgICB9CisgICAgdGVzdFVuaXRFbGVtZW50ID0gdGVzdFVuaXQuZWxlbWVudDsKKyAgICB0ZXN0TGlicmFyeUVsZW1lbnQgPSB0ZXN0VW5pdEVsZW1lbnQubGlicmFyeTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3QvaW5kZXgvZGFydF9pbmRleF9jb250cmlidXRvcl90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9pbmRleC9kYXJ0X2luZGV4X2NvbnRyaWJ1dG9yX3Rlc3QuZGFydAppbmRleCAzODkyZDVkLi5iNTA4N2I2IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9pbmRleC9kYXJ0X2luZGV4X2NvbnRyaWJ1dG9yX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9pbmRleC9kYXJ0X2luZGV4X2NvbnRyaWJ1dG9yX3Rlc3QuZGFydApAQCAtNywxNiArNywxNSBAQAogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL2luZGV4L2luZGV4LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL2luZGV4L2luZGV4X3N0b3JlLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL3NyYy9pbmRleC9pbmRleF9jb250cmlidXRvci5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXNpc190ZXN0aW5nL2Fic3RyYWN0X2NvbnRleHQuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfdGVzdGluZy9yZWZsZWN0aXZlX3Rlc3RzLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvYXN0LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0JzsKLWltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2Vycm9yLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvamF2YV9lbmdpbmUuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6dHlwZWRfbW9jay90eXBlZF9tb2NrLmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOnVuaXR0ZXN0L3VuaXR0ZXN0LmRhcnQnOwogCitpbXBvcnQgJ2Fic3RyYWN0X3NpbmdsZV91bml0LmRhcnQnOworCiAKIG1haW4oKSB7CiAgIGdyb3VwU2VwID0gJyB8ICc7CkBAIC0zMCw3ICsyOSwxMCBAQAogICogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIFthY3R1YWxdIGxvY2F0aW9uIHRoZSBzYW1lIHByb3BlcnRpZXMgYXMgW2V4cGVjdGVkXS4KICAqLwogYm9vbCBfZXF1YWxzTG9jYXRpb24oTG9jYXRpb24gYWN0dWFsLCBFeHBlY3RlZExvY2F0aW9uIGV4cGVjdGVkKSB7Ci0gIHJldHVybiBfZXF1YWxzTG9jYXRpb25Qcm9wZXJ0aWVzKGFjdHVhbCwgZXhwZWN0ZWQuZWxlbWVudCwgZXhwZWN0ZWQub2Zmc2V0LAorICByZXR1cm4gX2VxdWFsc0xvY2F0aW9uUHJvcGVydGllcygKKyAgICAgIGFjdHVhbCwKKyAgICAgIGV4cGVjdGVkLmVsZW1lbnQsCisgICAgICBleHBlY3RlZC5vZmZzZXQsCiAgICAgICBleHBlY3RlZC5sZW5ndGgpOwogfQogCkBAIC00MCw3ICs0Miw4IEBACiAgKi8KIGJvb2wgX2VxdWFsc0xvY2F0aW9uUHJvcGVydGllcyhMb2NhdGlvbiBhY3R1YWwsIEVsZW1lbnQgZXhwZWN0ZWRFbGVtZW50LAogICAgIGludCBleHBlY3RlZE9mZnNldCwgaW50IGV4cGVjdGVkTGVuZ3RoKSB7Ci0gIHJldHVybiBleHBlY3RlZEVsZW1lbnQgPT0gYWN0dWFsLmVsZW1lbnQgJiYgZXhwZWN0ZWRPZmZzZXQgPT0gYWN0dWFsLm9mZnNldCAmJgorICByZXR1cm4gZXhwZWN0ZWRFbGVtZW50ID09IGFjdHVhbC5lbGVtZW50ICYmCisgICAgICBleHBlY3RlZE9mZnNldCA9PSBhY3R1YWwub2Zmc2V0ICYmCiAgICAgICBleHBlY3RlZExlbmd0aCA9PSBhY3R1YWwubGVuZ3RoOwogfQogCkBAIC00OCw1MyArNTEsMjkgQEAKIGJvb2wgX2VxdWFsc1JlY29yZGVkUmVsYXRpb24oUmVjb3JkZWRSZWxhdGlvbiByZWNvcmRlZFJlbGF0aW9uLAogICAgIEVsZW1lbnQgZXhwZWN0ZWRFbGVtZW50LCBSZWxhdGlvbnNoaXAgZXhwZWN0ZWRSZWxhdGlvbnNoaXAsCiAgICAgRXhwZWN0ZWRMb2NhdGlvbiBleHBlY3RlZExvY2F0aW9uKSB7Ci0gIHJldHVybiBleHBlY3RlZEVsZW1lbnQgPT0gcmVjb3JkZWRSZWxhdGlvbi5lbGVtZW50ICYmIGV4cGVjdGVkUmVsYXRpb25zaGlwID09Ci0gICAgICByZWNvcmRlZFJlbGF0aW9uLnJlbGF0aW9uc2hpcCAmJiAoZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsIHx8IF9lcXVhbHNMb2NhdGlvbigKLSAgICAgIHJlY29yZGVkUmVsYXRpb24ubG9jYXRpb24sIGV4cGVjdGVkTG9jYXRpb24pKTsKKyAgcmV0dXJuIGV4cGVjdGVkRWxlbWVudCA9PSByZWNvcmRlZFJlbGF0aW9uLmVsZW1lbnQgJiYKKyAgICAgIGV4cGVjdGVkUmVsYXRpb25zaGlwID09IHJlY29yZGVkUmVsYXRpb24ucmVsYXRpb25zaGlwICYmCisgICAgICAoZXhwZWN0ZWRMb2NhdGlvbiA9PSBudWxsIHx8CisgICAgICAgICAgX2VxdWFsc0xvY2F0aW9uKHJlY29yZGVkUmVsYXRpb24ubG9jYXRpb24sIGV4cGVjdGVkTG9jYXRpb24pKTsKIH0KIAogCi1pbnQgX2dldExlYWRpbmdJZGVudGlmaWVyTGVuZ3RoKFN0cmluZyBzZWFyY2gpIHsKLSAgaW50IGxlbmd0aCA9IDA7Ci0gIHdoaWxlIChsZW5ndGggPCBzZWFyY2gubGVuZ3RoKSB7Ci0gICAgaW50IGMgPSBzZWFyY2guY29kZVVuaXRBdChsZW5ndGgpOwotICAgIGlmIChjID49ICdhJy5jb2RlVW5pdEF0KDApICYmIGMgPD0gJ3onLmNvZGVVbml0QXQoMCkpIHsKLSAgICAgIGxlbmd0aCsrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChjID49ICdBJy5jb2RlVW5pdEF0KDApICYmIGMgPD0gJ1onLmNvZGVVbml0QXQoMCkpIHsKLSAgICAgIGxlbmd0aCsrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChjID49ICcwJy5jb2RlVW5pdEF0KDApICYmIGMgPD0gJzknLmNvZGVVbml0QXQoMCkpIHsKLSAgICAgIGxlbmd0aCsrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBsZW5ndGg7Ci19Ci0KIEBSZWZsZWN0aXZlVGVzdENhc2UoKQotY2xhc3MgRGFydFVuaXRDb250cmlidXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbnRleHRUZXN0IHsKK2NsYXNzIERhcnRVbml0Q29udHJpYnV0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW5nbGVVbml0VGVzdCB7CiAgIEluZGV4U3RvcmUgc3RvcmUgPSBuZXcgTW9ja0luZGV4U3RvcmUoKTsKICAgTGlzdDxSZWNvcmRlZFJlbGF0aW9uPiByZWNvcmRlZFJlbGF0aW9ucyA9IDxSZWNvcmRlZFJlbGF0aW9uPltdOwogCi0gIGJvb2wgdmVyaWZ5Tm9UZXN0VW5pdEVycm9ycyA9IHRydWU7Ci0KLSAgU3RyaW5nIHRlc3RDb2RlOwotICBTb3VyY2UgdGVzdFNvdXJjZTsKLSAgQ29tcGlsYXRpb25Vbml0IHRlc3RVbml0OwotICBDb21waWxhdGlvblVuaXRFbGVtZW50IHRlc3RVbml0RWxlbWVudDsKLSAgTGlicmFyeUVsZW1lbnQgdGVzdExpYnJhcnlFbGVtZW50OwotCiAgIHZvaWQgc2V0VXAoKSB7CiAgICAgc3VwZXIuc2V0VXAoKTsKICAgICB3aGVuKHN0b3JlLmFib3V0VG9JbmRleERhcnQoY29udGV4dCwgYW55T2JqZWN0KSkudGhlblJldHVybih0cnVlKTsKLSAgICB3aGVuKHN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChhbnlPYmplY3QsIGFueU9iamVjdCwgYW55T2JqZWN0KSkudGhlbkludm9rZSgKLSAgICAgICAgKEVsZW1lbnQgZWxlbWVudCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwgTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgIHJlY29yZGVkUmVsYXRpb25zLmFkZChuZXcgUmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCByZWxhdGlvbnNoaXAsCi0gICAgICAgICAgbG9jYXRpb24pKTsKKyAgICB3aGVuKAorICAgICAgICBzdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoCisgICAgICAgICAgICBhbnlPYmplY3QsCisgICAgICAgICAgICBhbnlPYmplY3QsCisgICAgICAgICAgICBhbnlPYmplY3QpKS50aGVuSW52b2tlKAorICAgICAgICAgICAgICAgIChFbGVtZW50IGVsZW1lbnQsIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsIExvY2F0aW9uIGxvY2F0aW9uKSB7CisgICAgICByZWNvcmRlZFJlbGF0aW9ucy5hZGQoCisgICAgICAgICAgbmV3IFJlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgcmVsYXRpb25zaGlwLCBsb2NhdGlvbikpOwogICAgIH0pOwogICB9CiAKQEAgLTEwNywyMSArODYsMjMgQEAKICAgfQogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJteUZpZWxkIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IGZpbmRFbGVtZW50KCJteUZpZWxkIik7CiAgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZ2V0dGVyRWxlbWVudCA9IGZpZWxkRWxlbWVudC5nZXR0ZXI7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZ2V0dGVyRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICdteUZpZWxkKTsnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGdldHRlckVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnbXlGaWVsZCk7JykpOwogICB9CiAKICAgdm9pZCB0ZXN0X2RlZmluZXNDbGFzcygpIHsKICAgICBfaW5kZXhUZXN0VW5pdCgnY2xhc3MgQSB7fScpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJBIik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudCA9IGZpbmRFbGVtZW50KCJBIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydERlZmluZXNUb3BMZXZlbEVsZW1lbnQoSW5kZXhDb25zdGFudHMuREVGSU5FU19DTEFTUywKKyAgICBfYXNzZXJ0RGVmaW5lc1RvcExldmVsRWxlbWVudCgKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19DTEFTUywKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oY2xhc3NFbGVtZW50LCAnQSB7fScpKTsKICAgfQogCkBAIC0xMzAsMjcgKzExMSwzMCBAQAogY2xhc3MgTWl4IHt9CiBjbGFzcyBNeUNsYXNzID0gT2JqZWN0IHdpdGggTWl4OycnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgY2xhc3NFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJNeUNsYXNzIik7CisgICAgRWxlbWVudCBjbGFzc0VsZW1lbnQgPSBmaW5kRWxlbWVudCgiTXlDbGFzcyIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnREZWZpbmVzVG9wTGV2ZWxFbGVtZW50KEluZGV4Q29uc3RhbnRzLkRFRklORVNfQ0xBU1NfQUxJQVMsCisgICAgX2Fzc2VydERlZmluZXNUb3BMZXZlbEVsZW1lbnQoCisgICAgICAgIEluZGV4Q29uc3RhbnRzLkRFRklORVNfQ0xBU1NfQUxJQVMsCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNsYXNzRWxlbWVudCwgJ015Q2xhc3MgPScpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9kZWZpbmVzRnVuY3Rpb24oKSB7CiAgICAgX2luZGV4VGVzdFVuaXQoJ215RnVuY3Rpb24oKSB7fScpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBGdW5jdGlvbkVsZW1lbnQgZnVuY3Rpb25FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJteUZ1bmN0aW9uIik7CisgICAgRnVuY3Rpb25FbGVtZW50IGZ1bmN0aW9uRWxlbWVudCA9IGZpbmRFbGVtZW50KCJteUZ1bmN0aW9uIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydERlZmluZXNUb3BMZXZlbEVsZW1lbnQoSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTiwKKyAgICBfYXNzZXJ0RGVmaW5lc1RvcExldmVsRWxlbWVudCgKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTiwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oZnVuY3Rpb25FbGVtZW50LCAnbXlGdW5jdGlvbigpIHt9JykpOwogICB9CiAKICAgdm9pZCB0ZXN0X2RlZmluZXNGdW5jdGlvblR5cGUoKSB7CiAgICAgX2luZGV4VGVzdFVuaXQoJ3R5cGVkZWYgTXlGdW5jdGlvbihpbnQgcCk7Jyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCB0eXBlQWxpYXNFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJNeUZ1bmN0aW9uIik7CisgICAgRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50IHR5cGVBbGlhc0VsZW1lbnQgPSBmaW5kRWxlbWVudCgiTXlGdW5jdGlvbiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnREZWZpbmVzVG9wTGV2ZWxFbGVtZW50KEluZGV4Q29uc3RhbnRzLkRFRklORVNfRlVOQ1RJT05fVFlQRSwKKyAgICBfYXNzZXJ0RGVmaW5lc1RvcExldmVsRWxlbWVudCgKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTl9UWVBFLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih0eXBlQWxpYXNFbGVtZW50LCAnTXlGdW5jdGlvbihpbnQgcCk7JykpOwogICB9CiAKQEAgLTE1OCw5ICsxNDIsMTAgQEAKICAgdm9pZCB0ZXN0X2RlZmluZXNWYXJpYWJsZSgpIHsKICAgICBfaW5kZXhUZXN0VW5pdCgndmFyIG15VmFyID0gNDI7Jyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIFZhcmlhYmxlRWxlbWVudCB2YXJFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJteVZhciIpOworICAgIFZhcmlhYmxlRWxlbWVudCB2YXJFbGVtZW50ID0gZmluZEVsZW1lbnQoIm15VmFyIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydERlZmluZXNUb3BMZXZlbEVsZW1lbnQoSW5kZXhDb25zdGFudHMuREVGSU5FU19WQVJJQUJMRSwKKyAgICBfYXNzZXJ0RGVmaW5lc1RvcExldmVsRWxlbWVudCgKKyAgICAgICAgSW5kZXhDb25zdGFudHMuREVGSU5FU19WQVJJQUJMRSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odmFyRWxlbWVudCwgJ215VmFyID0gNDI7JykpOwogICB9CiAKQEAgLTE3MSwxMCArMTU2LDEyIEBACiAgIH0KIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7Ci0gICAgVmFyaWFibGVFbGVtZW50IHZhcmlhYmxlRWxlbWVudCA9IF9maW5kRWxlbWVudCgidiIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBmaW5kRWxlbWVudCgidiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24odmFyaWFibGVFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUFEX0JZLAorICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgIHZhcmlhYmxlRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd2IGluIFtdJykpOwogICB9CiAKQEAgLTE4NSwxNSArMTcyLDE5IEBACiAgIEEuZm9vKCkge30KIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NBID0gX2ZpbmRFbGVtZW50KCJBIik7Ci0gICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnNBID0gX2ZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJBKCkiLCAobm9kZSkgPT4gbm9kZSBpcwotICAgICAgICBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKLSAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0FfZm9vID0gX2ZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJBLmZvbygpIiwgKG5vZGUpID0+Ci0gICAgICAgIG5vZGUgaXMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzQSA9IGZpbmRFbGVtZW50KCJBIik7CisgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnNBID0KKyAgICAgICAgZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsIChub2RlKSA9PiBub2RlIGlzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOworICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQV9mb28gPQorICAgICAgICBmaW5kTm9kZUVsZW1lbnRBdFN0cmluZygiQS5mb28oKSIsIChub2RlKSA9PiBub2RlIGlzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNvbnNBLCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjb25zQSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oY2xhc3NBLCAnKCkge30nKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY29uc0FfZm9vLCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjb25zQV9mb28sCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0RFRklORURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNsYXNzQSwgJy5mb28oKSB7fScsICcuZm9vJy5sZW5ndGgpKTsKICAgfQogCkBAIC0yMDMsMTAgKzE5NCwxMiBAQAogICBtKCkge30KIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm0iKTsKKyAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgibSIpOwogICAgIEVsZW1lbnQgbmFtZUVsZW1lbnQgPSBuZXcgTmFtZUVsZW1lbnQoIm0iKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuYW1lRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmFtZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0RFRklORURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1ldGhvZEVsZW1lbnQsICdtKCkge30nKSk7CiAgIH0KIApAQCAtMjE3LDEwICsyMTAsMTIgQEAKICAgb3BlcmF0b3IgKyhvKSB7fQogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IF9maW5kRWxlbWVudCgiKyIpOworICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGZpbmRFbGVtZW50KCIrIik7CiAgICAgRWxlbWVudCBuYW1lRWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudCgiKyIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWV0aG9kRWxlbWVudCwgJysobykge30nLCAxKSk7CiAgIH0KIApAQCAtMjMwLDEwICsyMjUsMTIgQEAKIGNsYXNzIEIgZXh0ZW5kcyBBIHt9IC8vIDIKICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRBID0gX2ZpbmRFbGVtZW50KCJBIik7Ci0gICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEIgPSBfZmluZEVsZW1lbnQoIkIiKTsKKyAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QSA9IGZpbmRFbGVtZW50KCJBIik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEIgPSBmaW5kRWxlbWVudCgiQiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNsYXNzRWxlbWVudEEsIEluZGV4Q29uc3RhbnRzLklTX0VYVEVOREVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjbGFzc0VsZW1lbnRBLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19FWFRFTkRFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oY2xhc3NFbGVtZW50QiwgJ0Ege30gLy8gMicpKTsKICAgfQogCkBAIC0yNDIsMTAgKzIzOSwxMiBAQAogY2xhc3MgQSB7fSAvLyAxCiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QSA9IF9maW5kRWxlbWVudCgiQSIpOworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRBID0gZmluZEVsZW1lbnQoIkEiKTsKICAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50T2JqZWN0ID0gY2xhc3NFbGVtZW50QS5zdXBlcnR5cGUuZWxlbWVudDsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihjbGFzc0VsZW1lbnRPYmplY3QsIEluZGV4Q29uc3RhbnRzLklTX0VYVEVOREVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjbGFzc0VsZW1lbnRPYmplY3QsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0VYVEVOREVEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihjbGFzc0VsZW1lbnRBLCAnQSB7fScsIDApKTsKICAgfQogCkBAIC0yNTYsMTAgKzI1NSwxMiBAQAogY2xhc3MgQyA9IEEgd2l0aCBCOyAvLyAzCiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QSA9IF9maW5kRWxlbWVudCgiQSIpOwotICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRDID0gX2ZpbmRFbGVtZW50KCJDIik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEEgPSBmaW5kRWxlbWVudCgiQSIpOworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRDID0gZmluZEVsZW1lbnQoIkMiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihjbGFzc0VsZW1lbnRBLCBJbmRleENvbnN0YW50cy5JU19FWFRFTkRFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgY2xhc3NFbGVtZW50QSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfRVhURU5ERURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNsYXNzRWxlbWVudEMsICdBIHdpdGgnKSk7CiAgIH0KIApAQCAtMjY5LDEwICsyNzAsMTIgQEAKIGNsYXNzIEIgaW1wbGVtZW50cyBBIHt9IC8vIDIKICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRBID0gX2ZpbmRFbGVtZW50KCJBIik7Ci0gICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEIgPSBfZmluZEVsZW1lbnQoIkIiKTsKKyAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QSA9IGZpbmRFbGVtZW50KCJBIik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEIgPSBmaW5kRWxlbWVudCgiQiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNsYXNzRWxlbWVudEEsIEluZGV4Q29uc3RhbnRzLklTX0lNUExFTUVOVEVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjbGFzc0VsZW1lbnRBLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTVBMRU1FTlRFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oY2xhc3NFbGVtZW50QiwgJ0Ege30gLy8gMicpKTsKICAgfQogCkBAIC0yODMsMTAgKzI4NiwxMiBAQAogY2xhc3MgQyA9IE9iamVjdCB3aXRoIEEgaW1wbGVtZW50cyBCOyAvLyAzCiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QiA9IF9maW5kRWxlbWVudCgiQiIpOwotICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRDID0gX2ZpbmRFbGVtZW50KCJDIik7CisgICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEIgPSBmaW5kRWxlbWVudCgiQiIpOworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRDID0gZmluZEVsZW1lbnQoIkMiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihjbGFzc0VsZW1lbnRCLCBJbmRleENvbnN0YW50cy5JU19JTVBMRU1FTlRFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgY2xhc3NFbGVtZW50QiwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU1QTEVNRU5URURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNsYXNzRWxlbWVudEMsICdCOyAvLyAzJykpOwogICB9CiAKQEAgLTMwMCwxMyArMzA1LDE0IEBACiAgIH0KIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7Ci0gICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IF9maW5kRWxlbWVudCgiZmllbGQiKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gZmluZEVsZW1lbnQoImZpZWxkIik7CiAgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZ2V0dGVyRWxlbWVudCA9IGZpZWxkRWxlbWVudC5nZXR0ZXI7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZ2V0dGVyRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAnZmllbGQoKTsnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGdldHRlckVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZpZWxkKCk7JykpOwogICB9CiAKIApAQCAtMzE5LDE0ICszMjUsMTggQEAKICAgfQogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZvbyIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGZpbmRFbGVtZW50KCJmb28iKTsKICAgICAvLyB2ZXJpZnkKICAgICB2YXIgbG9jYXRpb24gPSBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZvbygpOycpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG1ldGhvZEVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0gICAgX2Fzc2VydE5vUmVjb3JkZWRSZWxhdGlvbihtZXRob2RFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgbG9jYXRpb24pOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBtZXRob2RFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKKyAgICAgICAgbG9jYXRpb24pOworICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG1ldGhvZEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICBsb2NhdGlvbik7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNJbnZva2VkQnlRdWFsaWZpZWRfTWV0aG9kRWxlbWVudF9wcm9wYWdhdGVkVHlwZSgpIHsKQEAgLTM0MCwxMiArMzUwLDEzIEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7Ci0gICAgRWxlbWVudCBtZXRob2RFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJmb28iKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgiZm9vIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obWV0aG9kRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAnZm9vKCk7JykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBtZXRob2RFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdmb28oKTsnKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNJbnZva2VkQnlVbnF1YWxpZmllZF9NZXRob2RFbGVtZW50KCkgewpAQCAtMzU3LDEyICszNjgsMTMgQEAKICAgfQogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZvbyIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGZpbmRFbGVtZW50KCJmb28iKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihtZXRob2RFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1VOUVVBTElGSUVELCBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwKLSAgICAgICAgJ2ZvbygpOycpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbWV0aG9kRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdmb28oKTsnKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNJbnZva2VkQnlfRnVuY3Rpb25FbGVtZW50KCkgewpAQCAtMzcyLDEwICszODQsMTIgQEAKICAgZm9vKCk7CiB9JycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIEZ1bmN0aW9uRWxlbWVudCBmdW5jdGlvbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZvbyIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIEZ1bmN0aW9uRWxlbWVudCBmdW5jdGlvbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgiZm9vIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZnVuY3Rpb25FbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBmdW5jdGlvbkVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnZm9vKCk7JykpOwogICB9CiAKQEAgLTM4NiwxMCArNDAwLDEyIEBACiAgIHYoKTsKIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJ2Iik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoInYiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3YoKTsnKSk7CiAgIH0KIApAQCAtMzk5LDEwICs0MTUsMTIgQEAKICAgcCgpOwogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBfZmluZEVsZW1lbnQoInAiKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgicCIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncCgpOycpKTsKICAgfQogCkBAIC00MTIsMTAgKzQzMCwxMiBAQAogY2xhc3MgQiBleHRlbmRzIE9iamVjdCB3aXRoIEEge30gLy8gMgogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEEgPSBfZmluZEVsZW1lbnQoIkEiKTsKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QiA9IF9maW5kRWxlbWVudCgiQiIpOworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRBID0gZmluZEVsZW1lbnQoIkEiKTsKKyAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QiA9IGZpbmRFbGVtZW50KCJCIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY2xhc3NFbGVtZW50QSwgSW5kZXhDb25zdGFudHMuSVNfTUlYRURfSU5fQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGNsYXNzRWxlbWVudEEsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX01JWEVEX0lOX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihjbGFzc0VsZW1lbnRCLCAnQSB7fSAvLyAyJykpOwogICB9CiAKQEAgLTQyNSwxMCArNDQ1LDEyIEBACiBjbGFzcyBCID0gT2JqZWN0IHdpdGggQTsgLy8gMgogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgQ2xhc3NFbGVtZW50IGNsYXNzRWxlbWVudEEgPSBfZmluZEVsZW1lbnQoIkEiKTsKLSAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QiA9IF9maW5kRWxlbWVudCgiQiIpOworICAgIENsYXNzRWxlbWVudCBjbGFzc0VsZW1lbnRBID0gZmluZEVsZW1lbnQoIkEiKTsKKyAgICBDbGFzc0VsZW1lbnQgY2xhc3NFbGVtZW50QiA9IGZpbmRFbGVtZW50KCJCIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY2xhc3NFbGVtZW50QSwgSW5kZXhDb25zdGFudHMuSVNfTUlYRURfSU5fQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGNsYXNzRWxlbWVudEEsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX01JWEVEX0lOX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihjbGFzc0VsZW1lbnRCLCAnQTsgLy8gMicpKTsKICAgfQogCkBAIC00MzksMTAgKzQ2MSwxMiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IF9maW5kRWxlbWVudCgicCIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIEVsZW1lbnQgcGFyYW1ldGVyRWxlbWVudCA9IGZpbmRFbGVtZW50KCJwIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24ocGFyYW1ldGVyRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgcGFyYW1ldGVyRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdwKTsnKSk7CiAgIH0KIApAQCAtNDU0LDEwICs0NzgsMTIgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBFbGVtZW50IHZhcmlhYmxlRWxlbWVudCA9IF9maW5kRWxlbWVudCgidiIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIEVsZW1lbnQgdmFyaWFibGVFbGVtZW50ID0gZmluZEVsZW1lbnQoInYiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbih2YXJpYWJsZUVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIHZhcmlhYmxlRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd2KTsnKSk7CiAgIH0KIApAQCAtNDY4LDEwICs0OTQsMTIgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSBfZmluZEVsZW1lbnQoInAiKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBFbGVtZW50IHBhcmFtZXRlckVsZW1lbnQgPSBmaW5kRWxlbWVudCgicCIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHBhcmFtZXRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfV1JJVFRFTl9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgcGFyYW1ldGVyRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9XUklUVEVOX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3AgKz0gMScpKTsKICAgfQogCkBAIC00ODMsMTAgKzUxMSwxMiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIEVsZW1lbnQgdmFyaWFibGVFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJ2Iik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBmaW5kRWxlbWVudCgidiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHZhcmlhYmxlRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9XUklUVEVOX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB2YXJpYWJsZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFQURfV1JJVFRFTl9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd2ICs9IDEnKSk7CiAgIH0KIApAQCAtNTAwLDEyICs1MzAsMTMgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKICAgICBFbGVtZW50IG5hbWVFbGVtZW50ID0gbmV3IE5hbWVFbGVtZW50KCdmaWVsZCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnZmllbGQpOycpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmFtZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZpZWxkKTsnKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNSZWZlcmVuY2VkQnlRdWFsaWZpZWRSZXNvbHZlZF9OYW1lRWxlbWVudF9tZXRob2QoKSB7CkBAIC01MTgsMTIgKzU0OSwxMyBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIEVsZW1lbnQgbmFtZUVsZW1lbnQgPSBuZXcgTmFtZUVsZW1lbnQoJ21ldGhvZCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnbWV0aG9kKCk7JykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnbWV0aG9kKCk7JykpOwogICB9CiAKICAgdm9pZCB0ZXN0X2lzUmVmZXJlbmNlZEJ5UXVhbGlmaWVkUmVzb2x2ZWRfTmFtZUVsZW1lbnRfb3BlcmF0b3IoKSB7CkBAIC01NDYsMzQgKzU3OCw0MiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIGJpbmFyeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5ldyBOYW1lRWxlbWVudCgnKycpLAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnKyA1JywgJysnLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5ldyBOYW1lRWxlbWVudCgnKycpLAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnKz0gNScsICcrPScubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmV3IE5hbWVFbGVtZW50KCc9PScpLAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnPT0gNScsICc9PScubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnKycpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICcrIDUnLCAnKycubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnKycpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICcrPSA1JywgJys9Jy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCc9PScpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICc9PSA1JywgJz09Jy5sZW5ndGgpKTsKICAgICAvLyBwcmVmaXgKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJysnKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKAotICAgICAgICBtYWluRWxlbWVudCwgJysrYScsICcrKycubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmV3IE5hbWVFbGVtZW50KCctJyksCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1JFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbigKLSAgICAgICAgbWFpbkVsZW1lbnQsICctLWEnLCAnLS0nLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5ldyBOYW1lRWxlbWVudCgnficpLAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnfmEnLCAnficubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnKycpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICcrK2EnLCAnKysnLmxlbmd0aCkpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuZXcgTmFtZUVsZW1lbnQoJy0nKSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnLS1hJywgJy0tJy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCd+JyksCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ35hJywgJ34nLmxlbmd0aCkpOwogICAgIC8vIHBvc3RmaXgKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJysnKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKAotICAgICAgICBtYWluRWxlbWVudCwgJysrOycsICcrKycubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmV3IE5hbWVFbGVtZW50KCctJyksCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1JFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbigKLSAgICAgICAgbWFpbkVsZW1lbnQsICctLTsnLCAnLS0nLmxlbmd0aCkpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuZXcgTmFtZUVsZW1lbnQoJysnKSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnKys7JywgJysrJy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCctJyksCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJy0tOycsICctLScubGVuZ3RoKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNSZWZlcmVuY2VkQnlRdWFsaWZpZWRVbnJlc29sdmVkX05hbWVFbGVtZW50X2ZpZWxkKCkgewpAQCAtNTg2LDE1ICs2MjYsMTggQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ21haW4nKTsKLSAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdmaWVsZCcpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgnZmllbGQnKTsKICAgICBFbGVtZW50IG5hbWVFbGVtZW50ID0gbmV3IE5hbWVFbGVtZW50KCdmaWVsZCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oZmllbGRFbGVtZW50LCAnZmllbGQ7JykpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbigKLSAgICAgICAgbWFpbkVsZW1lbnQsICdmaWVsZCk7JykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdmaWVsZCk7JykpOwogICB9CiAKICAgdm9pZCB0ZXN0X2lzUmVmZXJlbmNlZEJ5UXVhbGlmaWVkVW5yZXNvbHZlZF9OYW1lRWxlbWVudF9tZXRob2QoKSB7CkBAIC02MDcsMTUgKzY1MCwxOCBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOwotICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWV0aG9kJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgTWV0aG9kRWxlbWVudCBtZXRob2RFbGVtZW50ID0gZmluZEVsZW1lbnQoJ21ldGhvZCcpOwogICAgIEVsZW1lbnQgbmFtZUVsZW1lbnQgPSBuZXcgTmFtZUVsZW1lbnQoJ21ldGhvZCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWV0aG9kRWxlbWVudCwgJ21ldGhvZCgpIHt9JykpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbigKLSAgICAgICAgbWFpbkVsZW1lbnQsICdtZXRob2QoKTsnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5hbWVFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ21ldGhvZCgpOycpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9pc1JlZmVyZW5jZWRCeVF1YWxpZmllZFVucmVzb2x2ZWRfTmFtZUVsZW1lbnRfb3BlcmF0b3IoKSB7CkBAIC02MzgsMzQgKzY4NCw0MiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIGJpbmFyeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5ldyBOYW1lRWxlbWVudCgnKycpLAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbigKLSAgICAgICAgbWFpbkVsZW1lbnQsICcrIDUnLCAnKycubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmV3IE5hbWVFbGVtZW50KCcrJyksCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1VOUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKAotICAgICAgICBtYWluRWxlbWVudCwgJys9IDUnLCAnKz0nLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5ldyBOYW1lRWxlbWVudCgnPT0nKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnPT0gNScsICc9PScubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnKycpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJysgNScsICcrJy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCcrJyksCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1VOUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnKz0gNScsICcrPScubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnPT0nKSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICc9PSA1JywgJz09Jy5sZW5ndGgpKTsKICAgICAvLyBwcmVmaXgKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJysnKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnKythJywgJysrJy5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJy0nKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnLS1hJywgJy0tJy5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJ34nKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnfmEnLCAnficubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnKycpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJysrYScsICcrKycubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnLScpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJy0tYScsICctLScubGVuZ3RoKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5ldyBOYW1lRWxlbWVudCgnficpLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ35hJywgJ34nLmxlbmd0aCkpOwogICAgIC8vIHBvc3RmaXgKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJysnKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnKys7JywgJysrJy5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuZXcgTmFtZUVsZW1lbnQoJy0nKSwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRURfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIG1haW5FbGVtZW50LCAnLS07JywgJy0tJy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCcrJyksCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1VOUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnKys7JywgJysrJy5sZW5ndGgpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmV3IE5hbWVFbGVtZW50KCctJyksCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVEX1VOUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnLS07JywgJy0tJy5sZW5ndGgpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9pc1JlZmVyZW5jZWRCeVF1YWxpZmllZF9Db25zdHJ1Y3RvckVsZW1lbnQoKSB7CkBAIC02ODUsMjcgKzczOSwzNyBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIHZhciBpc0NvbnN0cnVjdG9yID0gKG5vZGUpID0+IG5vZGUgaXMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKLSAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0EgPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsIGlzQ29uc3RydWN0b3IpOwotICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQV9mb28gPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEuZm9vKCkiLAotICAgICAgICBpc0NvbnN0cnVjdG9yKTsKLSAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0IgPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkIoKSIsIGlzQ29uc3RydWN0b3IpOwotICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQl9mb28gPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkIuZm9vKCkiLAotICAgICAgICBpc0NvbnN0cnVjdG9yKTsKLSAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0JfYmFyID0gX2ZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJCLmJhcigpIiwKLSAgICAgICAgaXNDb25zdHJ1Y3Rvcik7CisgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnNBID0gZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsIGlzQ29uc3RydWN0b3IpOworICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQV9mb28gPQorICAgICAgICBmaW5kTm9kZUVsZW1lbnRBdFN0cmluZygiQS5mb28oKSIsIGlzQ29uc3RydWN0b3IpOworICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQiA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJCKCkiLCBpc0NvbnN0cnVjdG9yKTsKKyAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0JfZm9vID0KKyAgICAgICAgZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkIuZm9vKCkiLCBpc0NvbnN0cnVjdG9yKTsKKyAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0JfYmFyID0KKyAgICAgICAgZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkIuYmFyKCkiLCBpc0NvbnN0cnVjdG9yKTsKICAgICAvLyBBKCkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihjb25zQSwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgY29uc0EsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNvbnNCLCAnKCk7IC8vIG1hcmtlci0xJywgMCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNvbnNBLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjb25zQSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICcoKTsgLy8gbWFya2VyLW1haW4tMScsIDApKTsKICAgICAvLyBBLmZvbygpCi0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY29uc0FfZm9vLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjb25zQV9mb28sCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNvbnNCX2ZvbywgJy5mb28oKTsgLy8gbWFya2VyLTInLCAnLmZvbycubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY29uc0FfZm9vLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBjb25zQV9mb28sCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGNvbnNCX2JhciwgJy5mb287IC8vIG1hcmtlci0zJywgJy5mb28nLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNvbnNBX2ZvbywgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgY29uc0FfZm9vLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJy5mb28oKTsgLy8gbWFya2VyLW1haW4tMicsICcuZm9vJy5sZW5ndGgpKTsKICAgfQogCkBAIC03MjMsMTUgKzc4NywxOSBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIHZhciBpc0NvbnN0cnVjdG9yID0gKG5vZGUpID0+IG5vZGUgaXMgQ29uc3RydWN0b3JEZWNsYXJhdGlvbjsKLSAgICBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc0EgPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsIGlzQ29uc3RydWN0b3IpOwotICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQV9uYW1lZCA9IF9maW5kTm9kZUVsZW1lbnRBdFN0cmluZygiQS5uYW1lZCgpIiwKLSAgICAgICAgaXNDb25zdHJ1Y3Rvcik7CisgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnNBID0gZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsIGlzQ29uc3RydWN0b3IpOworICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zQV9uYW1lZCA9CisgICAgICAgIGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJBLm5hbWVkKCkiLCBpc0NvbnN0cnVjdG9yKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihjb25zQSwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgY29uc0EsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnKCk7IC8vIG1hcmtlci1tYWluLTEnLCAwKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oY29uc0FfbmFtZWQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGNvbnNBX25hbWVkLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJy5uYW1lZCgpOyAvLyBtYXJrZXItbWFpbi0yJywgJy5uYW1lZCcubGVuZ3RoKSk7CiAgIH0KIApAQCAtNzQ1LDEzICs4MTMsMTQgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ21haW4nKTsKLSAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdmaWVsZCcpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgnZmllbGQnKTsKICAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBzZXR0ZXJFbGVtZW50ID0gZmllbGRFbGVtZW50LnNldHRlcjsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihzZXR0ZXJFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICdmaWVsZCA9IDEnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIHNldHRlckVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZpZWxkID0gMScpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9pc1JlZmVyZW5jZWRCeVF1YWxpZmllZF9NZXRob2RFbGVtZW50KCkgewpAQCAtNzY0LDEyICs4MzMsMTMgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgZm9vRWxlbWVudCA9IF9maW5kRWxlbWVudCgnZm9vJyk7Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgZm9vRWxlbWVudCA9IGZpbmRFbGVtZW50KCdmb28nKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihmb29FbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICdmb28pOycpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgZm9vRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnZm9vKTsnKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNSZWZlcmVuY2VkQnlRdWFsaWZpZWRfTWV0aG9kRWxlbWVudF9vcGVyYXRvcl9iaW5hcnkoKSB7CkBAIC03ODUsMTYgKzg1NSwyNCBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBlbGVtZW50ID0gX2ZpbmRFbGVtZW50KCcrJyk7Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KCcrJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJysgMScsICIrIi5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnKz0gMicsICIrPSIubGVuZ3RoKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJysrYTsnLCAiKysiLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICcrKzsnLCAiKysiLmxlbmd0aCkpOwogICB9CiAKQEAgLTgxMCwxNSArODg4LDE4IEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBNZXRob2RFbGVtZW50IHJlYWRFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJbXSIpOwotICAgIE1ldGhvZEVsZW1lbnQgd3JpdGVFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJbXT0iKTsKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgTWV0aG9kRWxlbWVudCByZWFkRWxlbWVudCA9IGZpbmRFbGVtZW50KCJbXSIpOworICAgIE1ldGhvZEVsZW1lbnQgd3JpdGVFbGVtZW50ID0gZmluZEVsZW1lbnQoIltdPSIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHJlYWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgcmVhZEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ1swXScsICJbIi5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbih3cml0ZUVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELCBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ1sxXSA9JywKLSAgICAgICAgIlsiLmxlbmd0aCkpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB3cml0ZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ1sxXSA9JywgIlsiLmxlbmd0aCkpOwogICB9CiAKICAgdm9pZCB0ZXN0X2lzUmVmZXJlbmNlZEJ5UXVhbGlmaWVkX01ldGhvZEVsZW1lbnRfb3BlcmF0b3JfcHJlZml4KCkgewpAQCAtODMxLDEwICs5MTIsMTIgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIE1ldGhvZEVsZW1lbnQgZWxlbWVudCA9IF9maW5kRWxlbWVudCgifiIpOwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICBNZXRob2RFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgifiIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1FVQUxJRklFRCwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd+YScsICJ+Ii5sZW5ndGgpKTsKICAgfQogCkBAIC04NDgsMTAgKzkzMSwxMiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCA9IF9maW5kTm9kZUVsZW1lbnRBdFN0cmluZygnZm9vID0+Jyk7Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGVsZW1lbnQgPSBmaW5kTm9kZUVsZW1lbnRBdFN0cmluZygnZm9vID0+Jyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2Zvbyk7JykpOwogICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbnVsbCk7CiAgIH0KQEAgLTg2NiwxMCArOTUxLDEyIEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBlbGVtZW50ID0gX2ZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdmb28oeCknKTsKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdmb28oeCknKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnZm9vID0gNDI7JykpOwogICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbnVsbCk7CiAgIH0KQEAgLTg4Nyw3ICs5NzQsNyBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIEltcG9ydEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5pbXBvcnRzWzBdOwogICAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgaW1wVW5pdCA9CiAgICAgICAgIGltcG9ydEVsZW1lbnQuaW1wb3J0ZWRMaWJyYXJ5LmRlZmluaW5nQ29tcGlsYXRpb25Vbml0OwpAQCAtODk1LDkgKzk4MiwxMyBAQAogICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGdldHRlciA9IG15VmFyLmdldHRlcjsKICAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBzZXR0ZXIgPSBteVZhci5zZXR0ZXI7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oc2V0dGVyLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgc2V0dGVyLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdteVZhciA9IDEnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZ2V0dGVyLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgZ2V0dGVyLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdteVZhcik7JykpOwogICB9CiAKQEAgLTkxMSwxNCArMTAwMiwxOCBAQAogICB9CiB9JycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZpZWxkIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IGZpbmRFbGVtZW50KCJmaWVsZCIpOwogICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGdldHRlciA9IGZpZWxkRWxlbWVudC5nZXR0ZXI7CiAgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgc2V0dGVyID0gZmllbGRFbGVtZW50LnNldHRlcjsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihzZXR0ZXIsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIHNldHRlciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdmaWVsZCA9IDUnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZ2V0dGVyLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBnZXR0ZXIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnZmllbGQpOycpKTsKICAgfQogCkBAIC05MzEsMTMgKzEwMjYsMTYgQEAKICAgfQogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBNZXRob2RFbGVtZW50IG1ldGhvZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1ldGhvZCIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIE1ldGhvZEVsZW1lbnQgbWV0aG9kRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtZXRob2QiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihtZXRob2RFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELCBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwKLSAgICAgICAgJ21ldGhvZCk7JykpOwotICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24obWV0aG9kRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbWV0aG9kRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdtZXRob2QpOycpKTsKKyAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBtZXRob2RFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBudWxsKTsKICAgfQogCkBAIC05NDksMTUgKzEwNDcsMTcgQEAKICAgcHJpbnQodG9wVmFyaWFibGUpOwogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBUb3BMZXZlbFZhcmlhYmxlRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBfZmluZEVsZW1lbnQoInRvcFZhcmlhYmxlIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQgdmFyaWFibGVFbGVtZW50ID0gZmluZEVsZW1lbnQoInRvcFZhcmlhYmxlIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24odmFyaWFibGVFbGVtZW50LnNldHRlciwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICd0b3BWYXJpYWJsZSA9IDUnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24odmFyaWFibGVFbGVtZW50LmdldHRlciwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICd0b3BWYXJpYWJsZSk7JykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB2YXJpYWJsZUVsZW1lbnQuc2V0dGVyLAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3RvcFZhcmlhYmxlID0gNScpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgdmFyaWFibGVFbGVtZW50LmdldHRlciwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd0b3BWYXJpYWJsZSk7JykpOwogICB9CiAKICAgdm9pZCB0ZXN0X2lzUmVmZXJlbmNlZEJ5X0NsYXNzRWxlbWVudCgpIHsKQEAgLTk3MywyMCArMTA3MywzMCBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgQ2xhc3NFbGVtZW50IGFFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJBIik7Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIFBhcmFtZXRlckVsZW1lbnQgcEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoInAiKTsKLSAgICBWYXJpYWJsZUVsZW1lbnQgdkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoInYiKTsKKyAgICBDbGFzc0VsZW1lbnQgYUVsZW1lbnQgPSBmaW5kRWxlbWVudCgiQSIpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgibWFpbiIpOworICAgIFBhcmFtZXRlckVsZW1lbnQgcEVsZW1lbnQgPSBmaW5kRWxlbWVudCgicCIpOworICAgIFZhcmlhYmxlRWxlbWVudCB2RWxlbWVudCA9IGZpbmRFbGVtZW50KCJ2Iik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oYUVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGFFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihwRWxlbWVudCwgJ0EgcCkgeycpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihhRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgYUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKHZFbGVtZW50LCAnQSB2OycpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihhRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgYUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnQSgpOyAvLyAyJykpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGFFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBhRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdBLmZpZWxkID0gMTsnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oYUVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGFFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ0EuZmllbGQpOyAvLyAzJykpOwogICB9CiAKQEAgLTk5OSwxMyArMTEwOSwxNyBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgQ2xhc3NFbGVtZW50IGJFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJCIik7Ci0gICAgUGFyYW1ldGVyRWxlbWVudCBwRWxlbWVudCA9IF9maW5kRWxlbWVudCgicCIpOwotICAgIFZhcmlhYmxlRWxlbWVudCB2RWxlbWVudCA9IF9maW5kRWxlbWVudCgidiIpOworICAgIENsYXNzRWxlbWVudCBiRWxlbWVudCA9IGZpbmRFbGVtZW50KCJCIik7CisgICAgUGFyYW1ldGVyRWxlbWVudCBwRWxlbWVudCA9IGZpbmRFbGVtZW50KCJwIik7CisgICAgVmFyaWFibGVFbGVtZW50IHZFbGVtZW50ID0gZmluZEVsZW1lbnQoInYiKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihiRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgYkVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKHBFbGVtZW50LCAnQiBwKSB7JykpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGJFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBiRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odkVsZW1lbnQsICdCIHY7JykpOwogICB9CiAKQEAgLTEwMTgsNyArMTEzMiw5IEBACiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwogICAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgbXlVbml0RWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5wYXJ0c1swXTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihteVVuaXRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBteVVuaXRFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih0ZXN0VW5pdEVsZW1lbnQsICInbXlfdW5pdC5kYXJ0JzsiLCAiJ215X3VuaXQuZGFydCciLmxlbmd0aCkpOwogICB9CiAKQEAgLTEwMzAsMTEgKzExNDYsMTMgQEAKIH0KICcnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIENvbnN0cnVjdG9yRWxlbWVudCBjb25zdHJ1Y3RvckVsZW1lbnQgPSBfZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoIkEoKSIsCi0gICAgICAgIChub2RlKSA9PiBub2RlIGlzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pOwotICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZpZWxkIik7CisgICAgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yRWxlbWVudCA9CisgICAgICAgIGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJBKCkiLCAobm9kZSkgPT4gbm9kZSBpcyBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKTsKKyAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gZmluZEVsZW1lbnQoImZpZWxkIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZmllbGRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBmaWVsZEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihjb25zdHJ1Y3RvckVsZW1lbnQsICdmaWVsZCA9IDUnKSk7CiAgIH0KIApAQCAtMTA0NiwxMiArMTE2NCwzMiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IF9maW5kRWxlbWVudCgiZmllbGQiKTsKLSAgICBFbGVtZW50IGZpZWxkUGFyYW1ldGVyRWxlbWVudCA9IF9maW5kTm9kZUVsZW1lbnRBdFN0cmluZygiZmllbGQpOyIpOworICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBmaW5kRWxlbWVudCgiZmllbGQiKTsKKyAgICBFbGVtZW50IGZpZWxkUGFyYW1ldGVyRWxlbWVudCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCJmaWVsZCk7Iik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZmllbGRFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgX2V4cGVjdGVkTG9jYXRpb24oCi0gICAgICAgIGZpZWxkUGFyYW1ldGVyRWxlbWVudCwgJ2ZpZWxkKTsnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGZpZWxkRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKGZpZWxkUGFyYW1ldGVyRWxlbWVudCwgJ2ZpZWxkKTsnKSk7CisgIH0KKworICB2b2lkIHRlc3RfaXNSZWZlcmVuY2VkQnlfVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQoKSB7CisgICAgYWRkU291cmNlKCcvbGliLmRhcnQnLCAnJycKK2xpYnJhcnkgbGliOwordmFyIFY7CisnJycpOworICAgIF9pbmRleFRlc3RVbml0KCcnJworaW1wb3J0ICdsaWIuZGFydCcgc2hvdyBWOyAvLyBpbXAKKycnJyk7CisgICAgLy8gcHJlcGFyZSBlbGVtZW50cworICAgIHZhciBsaWJFbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF0uaW1wb3J0ZWRMaWJyYXJ5OworICAgIHZhciBsaWJVbml0ID0gbGliRWxlbWVudC5kZWZpbmluZ0NvbXBpbGF0aW9uVW5pdDsKKyAgICBUb3BMZXZlbFZhcmlhYmxlRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBsaWJVbml0LnRvcExldmVsVmFyaWFibGVzWzBdOworICAgIC8vIHZlcmlmeQorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBmaWVsZEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih0ZXN0VW5pdEVsZW1lbnQsICdWOyAvLyBpbXAnKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfaXNSZWZlcmVuY2VkQnlfRnVuY3Rpb25FbGVtZW50KCkgewpAQCAtMTA2MywxNiArMTIwMSwyMiBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRnVuY3Rpb25FbGVtZW50IGVsZW1lbnQgPSBfZmluZEVsZW1lbnQoImZvbyIpOwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBGdW5jdGlvbkVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KCJmb28iKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKICAgICAvLyAicmVmZXJlbmNlZCIgaGVyZQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnZm9vKTsnKSk7CiAgICAgLy8gb25seSAiaW52b2tlZCIsIGJ1dCBub3QgInJlZmVyZW5jZWQiCiAgICAgewotICAgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oZWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWSwKKyAgICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICAgIGVsZW1lbnQsCisgICAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWSwKICAgICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZvbygpKTsnKSk7Ci0gICAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKGVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICAgIGVsZW1lbnQsCisgICAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ2ZvbygpKTsnKSk7CiAgICAgfQogICB9CkBAIC0xMDg0LDEwICsxMjI4LDEyIEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IGFFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdBJyk7Ci0gICAgRWxlbWVudCBwRWxlbWVudCA9IF9maW5kRWxlbWVudCgncCcpOworICAgIEVsZW1lbnQgYUVsZW1lbnQgPSBmaW5kRWxlbWVudCgnQScpOworICAgIEVsZW1lbnQgcEVsZW1lbnQgPSBmaW5kRWxlbWVudCgncCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGFFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBhRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24ocEVsZW1lbnQsICdBIHApIHsnKSk7CiAgIH0KIApAQCAtMTEwOCwyMCArMTI1NCwzMiBAQAogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCiAgICAgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF07Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGltcG9ydEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAnbXlWYXIgPSAxOycsIDApKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihpbXBvcnRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBpbXBvcnRFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ215RnVuY3Rpb24oKTsnLCAwKSk7Ci0gICAgX2Fzc2VydE5vUmVjb3JkZWRSZWxhdGlvbihpbXBvcnRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGltcG9ydEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncHJpbnQoMCk7JywgMCkpOwogICAgIC8vIG5vIHJlZmVyZW5jZXMgZnJvbSBpbXBvcnQgY29tYmluYXRvcnMKLSAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydE5vUmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgaW1wb3J0RWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odGVzdFVuaXRFbGVtZW50LCAnbXlWYXIsICcsIDApKTsKLSAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydE5vUmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgaW1wb3J0RWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odGVzdFVuaXRFbGVtZW50LCAnbXlGdW5jdGlvbiBoaWRlJywgMCkpOwotICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oaW1wb3J0RWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBpbXBvcnRFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih0ZXN0VW5pdEVsZW1lbnQsICdteVRvSGlkZTsnLCAwKSk7CiAgIH0KIApAQCAtMTE0NSwxMSArMTMwMywxNSBAQAogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKICAgICBJbXBvcnRFbGVtZW50IGltcG9ydEVsZW1lbnRBID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF07CiAgICAgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50QiA9IHRlc3RMaWJyYXJ5RWxlbWVudC5pbXBvcnRzWzFdOwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihpbXBvcnRFbGVtZW50QSwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgaW1wb3J0RWxlbWVudEEsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncHJlZi5teVZhciA9IDE7JywgJ3ByZWYuJy5sZW5ndGgpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihpbXBvcnRFbGVtZW50QiwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgaW1wb3J0RWxlbWVudEIsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncHJlZi5NeUNsYXNzKCk7JywgJ3ByZWYuJy5sZW5ndGgpKTsKICAgfQogCkBAIC0xMTcyLDExICsxMzM0LDE1IEBACiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwogICAgIEltcG9ydEVsZW1lbnQgaW1wb3J0RWxlbWVudEEgPSB0ZXN0TGlicmFyeUVsZW1lbnQuaW1wb3J0c1swXTsKICAgICBJbXBvcnRFbGVtZW50IGltcG9ydEVsZW1lbnRCID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMV07Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnRBLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBpbXBvcnRFbGVtZW50QSwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdwcmVmLkEoKTsnLCAncHJlZi4nLmxlbmd0aCkpOwotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnRCLCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBpbXBvcnRFbGVtZW50QiwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICdwcmVmLkIoKTsnLCAncHJlZi4nLmxlbmd0aCkpOwogICB9CiAKQEAgLTExOTMsOSArMTM1OSwxMSBAQAogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCiAgICAgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF07Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGltcG9ydEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncHJlZi5teUZ1bmMoKTsnLCAncHJlZi4nLmxlbmd0aCkpOwogICB9CiAKQEAgLTEyMTMsOSArMTM4MSwxMSBAQAogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCiAgICAgSW1wb3J0RWxlbWVudCBpbXBvcnRFbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF07Ci0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGltcG9ydEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGltcG9ydEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAncHJlZi5BKCk7JywgJ3ByZWYuJy5sZW5ndGgpKTsKICAgfQogCkBAIC0xMjYwLDEwICsxNDMwLDEyIEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdtYWluJyk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdMJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ0wnKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ0w7JykpOwogICB9CiAKQEAgLTEyNzgsNyArMTQ1MCw5IEBACiAgICAgTGlicmFyeUVsZW1lbnQgbGliRWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5leHBvcnRlZExpYnJhcmllc1swXTsKICAgICBDb21waWxhdGlvblVuaXRFbGVtZW50IGxpYlVuaXRFbGVtZW50ID0gbGliRWxlbWVudC5kZWZpbmluZ0NvbXBpbGF0aW9uVW5pdDsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihsaWJVbml0RWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbGliVW5pdEVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKHRlc3RVbml0RWxlbWVudCwgIidsaWIuZGFydCciLCAiJ2xpYi5kYXJ0JyIubGVuZ3RoKSk7CiAgIH0KIApAQCAtMTI5Myw3ICsxNDY3LDkgQEAKICAgICBMaWJyYXJ5RWxlbWVudCBsaWJFbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LmltcG9ydHNbMF0uaW1wb3J0ZWRMaWJyYXJ5OwogICAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgbGliVW5pdEVsZW1lbnQgPSBsaWJFbGVtZW50LmRlZmluaW5nQ29tcGlsYXRpb25Vbml0OwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGxpYlVuaXRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBsaWJVbml0RWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odGVzdFVuaXRFbGVtZW50LCAiJ2xpYi5kYXJ0JyIsICInbGliLmRhcnQnIi5sZW5ndGgpKTsKICAgfQogCkBAIC0xMzA1LDEwICsxNDgxLDEyIEBACiB9CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdtYWluJyk7Ci0gICAgRWxlbWVudCBlbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdwJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ3AnKTsKICAgICAvLyB2ZXJpZnkKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihlbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3A6IDEnKSk7CiAgIH0KIApAQCAtMTMyMiwxNyArMTUwMCwyMyBAQAogfQogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCB0eXBlUGFyYW1ldGVyRWxlbWVudCA9IF9maW5kRWxlbWVudCgnVCcpOwotICAgIEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdmJyk7Ci0gICAgRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdwJyk7Ci0gICAgRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBfZmluZEVsZW1lbnQoJ3YnKTsKKyAgICBFbGVtZW50IHR5cGVQYXJhbWV0ZXJFbGVtZW50ID0gZmluZEVsZW1lbnQoJ1QnKTsKKyAgICBFbGVtZW50IGZpZWxkRWxlbWVudCA9IGZpbmRFbGVtZW50KCdmJyk7CisgICAgRWxlbWVudCBwYXJhbWV0ZXJFbGVtZW50ID0gZmluZEVsZW1lbnQoJ3AnKTsKKyAgICBFbGVtZW50IHZhcmlhYmxlRWxlbWVudCA9IGZpbmRFbGVtZW50KCd2Jyk7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24odHlwZVBhcmFtZXRlckVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIF9leHBlY3RlZExvY2F0aW9uKGZpZWxkRWxlbWVudCwgJ1QgZicpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbih0eXBlUGFyYW1ldGVyRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgX2V4cGVjdGVkTG9jYXRpb24ocGFyYW1ldGVyRWxlbWVudCwgJ1QgcCcpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbih0eXBlUGFyYW1ldGVyRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgX2V4cGVjdGVkTG9jYXRpb24odmFyaWFibGVFbGVtZW50LCAnVCB2JykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB0eXBlUGFyYW1ldGVyRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24oZmllbGRFbGVtZW50LCAnVCBmJykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB0eXBlUGFyYW1ldGVyRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24ocGFyYW1ldGVyRWxlbWVudCwgJ1QgcCcpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgdHlwZVBhcmFtZXRlckVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKHZhcmlhYmxlRWxlbWVudCwgJ1QgdicpKTsKICAgfQogCiAgIC8qKgpAQCAtMTM0OSwxMiArMTUzMywxNiBAQAogdmFyIG15VmFyaWFibGUgPSBudWxsOwogJycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBhRWxlbWVudCA9IF9maW5kRWxlbWVudCgnQScpOwotICAgIEVsZW1lbnQgdmFyaWFibGVFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCdteVZhcmlhYmxlJyk7CisgICAgRWxlbWVudCBhRWxlbWVudCA9IGZpbmRFbGVtZW50KCdBJyk7CisgICAgRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbXlWYXJpYWJsZScpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGFFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBhRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24odGVzdFVuaXRFbGVtZW50LCAnQV0gdGV4dCcpKTsKLSAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKGFFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAorICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGFFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih2YXJpYWJsZUVsZW1lbnQsICdBXSB0ZXh0JykpOwogICB9CiAKQEAgLTEzNzAsNyArMTU1OCw5IEBACiAgICAgdGVzdExpYnJhcnlFbGVtZW50ID0gdGVzdFVuaXRFbGVtZW50LmxpYnJhcnk7CiAgICAgaW5kZXhEYXJ0VW5pdChzdG9yZSwgY29udGV4dCwgdGVzdFVuaXQpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHRlc3RMaWJyYXJ5RWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgdGVzdExpYnJhcnlFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbih0ZXN0VW5pdEVsZW1lbnQsICJsaWI7IikpOwogICB9CiAKQEAgLTEzODAsMTAgKzE1NzAsMTIgQEAKIEEgbXlWYXJpYWJsZSA9IG51bGw7CiAnJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IGNsYXNzRWxlbWVudEEgPSBfZmluZEVsZW1lbnQoJ0EnKTsKLSAgICBFbGVtZW50IHZhcmlhYmxlRWxlbWVudCA9IF9maW5kRWxlbWVudCgnbXlWYXJpYWJsZScpOworICAgIEVsZW1lbnQgY2xhc3NFbGVtZW50QSA9IGZpbmRFbGVtZW50KCdBJyk7CisgICAgRWxlbWVudCB2YXJpYWJsZUVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbXlWYXJpYWJsZScpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKGNsYXNzRWxlbWVudEEsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIGNsYXNzRWxlbWVudEEsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksCiAgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKHZhcmlhYmxlRWxlbWVudCwgJ0EgbXlWYXJpYWJsZScpKTsKICAgfQogCkBAIC0xMzkzLDEwICsxNTg1LDEyIEBACiAgIHAgPSAxOwogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKLSAgICBQYXJhbWV0ZXJFbGVtZW50IHBFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJwIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgUGFyYW1ldGVyRWxlbWVudCBwRWxlbWVudCA9IGZpbmRFbGVtZW50KCJwIik7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24ocEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1dSSVRURU5fQlksCisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIHBFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5JU19XUklUVEVOX0JZLAogICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3AgPSAxJykpOwogICB9CiAKQEAgLTE0MDcsMTAgKzE2MDEsMTIgQEAKICAgdiA9IDE7CiB9JycnKTsKICAgICAvLyBwcmVwYXJlIGVsZW1lbnRzCi0gICAgRWxlbWVudCBtYWluRWxlbWVudCA9IF9maW5kRWxlbWVudCgibWFpbiIpOwotICAgIExvY2FsVmFyaWFibGVFbGVtZW50IHZFbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJ2Iik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CisgICAgTG9jYWxWYXJpYWJsZUVsZW1lbnQgdkVsZW1lbnQgPSBmaW5kRWxlbWVudCgidiIpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHZFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19XUklUVEVOX0JZLAorICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICB2RWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuSVNfV1JJVFRFTl9CWSwKICAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd2ID0gMScpKTsKICAgfQogCkBAIC0xNDI0LDE4ICsxNjIwLDIxIEBACiAgIHAudGVzdCgyKTsKIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CiAgICAgRWxlbWVudCBuYW1lRWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudCgndGVzdCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX0lOVk9LRURfQllfUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAndGVzdCgxKScpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuYW1lRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19JTlZPS0VEX0JZX1VOUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAndGVzdCgyKScpKTsKLSAgICBfYXNzZXJ0Tm9SZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfVU5SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICd0ZXN0KDIpJykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19JTlZPS0VEX0JZX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3Rlc3QoMSknKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5hbWVFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX0lOVk9LRURfQllfVU5SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd0ZXN0KDIpJykpOworICAgIF9hc3NlcnROb1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5hbWVFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfVU5SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd0ZXN0KDIpJykpOwogICB9CiAKICAgdm9pZCB0ZXN0X25hbWVJc1JlYWRCeSgpIHsKQEAgLTE0NDgsMTUgKzE2NDcsMTcgQEAKICAgcHJpbnQocC50ZXN0KTsgLy8gcAogfScnJyk7CiAgICAgLy8gcHJlcGFyZSBlbGVtZW50cwotICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBfZmluZEVsZW1lbnQoIm1haW4iKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoIm1haW4iKTsKICAgICBFbGVtZW50IG5hbWVFbGVtZW50ID0gbmV3IE5hbWVFbGVtZW50KCd0ZXN0Jyk7CiAgICAgLy8gdmVyaWZ5Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmFtZUVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9CWV9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICd0ZXN0KTsgLy8gYScpKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihuYW1lRWxlbWVudCwKLSAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19SRUFEX0JZX1VOUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAndGVzdCk7IC8vIHAnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5hbWVFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAndGVzdCk7IC8vIGEnKSk7CisgICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oCisgICAgICAgIG5hbWVFbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfQllfVU5SRVNPTFZFRCwKKyAgICAgICAgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsICd0ZXN0KTsgLy8gcCcpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9uYW1lSXNSZWFkV3JpdHRlbkJ5KCkgewpAQCAtMTQ2OSwxNSArMTY3MCwxNyBAQAogICBwLnRlc3QgKz0gMjsKIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CiAgICAgRWxlbWVudCBuYW1lRWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudCgndGVzdCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1JFQURfV1JJVFRFTl9CWV9SRVNPTFZFRCwgX2V4cGVjdGVkTG9jYXRpb24obWFpbkVsZW1lbnQsCi0gICAgICAgICd0ZXN0ICs9IDEnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmFtZUVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1VOUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKAotICAgICAgICBtYWluRWxlbWVudCwgJ3Rlc3QgKz0gMicpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmFtZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3Rlc3QgKz0gMScpKTsKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgbmFtZUVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfUkVBRF9XUklUVEVOX0JZX1VOUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAndGVzdCArPSAyJykpOwogICB9CiAKICAgdm9pZCB0ZXN0X25hbWVJc1dyaXR0ZW5CeSgpIHsKQEAgLTE0OTAsMTUgKzE2OTMsMTcgQEAKICAgcC50ZXN0ID0gMjsKIH0nJycpOwogICAgIC8vIHByZXBhcmUgZWxlbWVudHMKLSAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gX2ZpbmRFbGVtZW50KCJtYWluIik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCJtYWluIik7CiAgICAgRWxlbWVudCBuYW1lRWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudCgndGVzdCcpOwogICAgIC8vIHZlcmlmeQotICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKG5hbWVFbGVtZW50LAotICAgICAgICBJbmRleENvbnN0YW50cy5OQU1FX0lTX1dSSVRURU5fQllfUkVTT0xWRUQsIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LAotICAgICAgICAndGVzdCA9IDEnKSk7Ci0gICAgX2Fzc2VydFJlY29yZGVkUmVsYXRpb24obmFtZUVsZW1lbnQsCi0gICAgICAgIEluZGV4Q29uc3RhbnRzLk5BTUVfSVNfV1JJVFRFTl9CWV9VTlJFU09MVkVELCBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwKLSAgICAgICAgJ3Rlc3QgPSAyJykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19XUklUVEVOX0JZX1JFU09MVkVELAorICAgICAgICBfZXhwZWN0ZWRMb2NhdGlvbihtYWluRWxlbWVudCwgJ3Rlc3QgPSAxJykpOworICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICBuYW1lRWxlbWVudCwKKyAgICAgICAgSW5kZXhDb25zdGFudHMuTkFNRV9JU19XUklUVEVOX0JZX1VOUkVTT0xWRUQsCisgICAgICAgIF9leHBlY3RlZExvY2F0aW9uKG1haW5FbGVtZW50LCAndGVzdCA9IDInKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfbnVsbFVuaXQoKSB7CkBAIC0xNTEzLDI1ICsxNzE4LDI1IEBACiAgIHZvaWQgX2Fzc2VydERlZmluZXNUb3BMZXZlbEVsZW1lbnQoUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwKICAgICAgIEV4cGVjdGVkTG9jYXRpb24gZXhwZWN0ZWRMb2NhdGlvbikgewogICAgIF9hc3NlcnRSZWNvcmRlZFJlbGF0aW9uKHRlc3RMaWJyYXJ5RWxlbWVudCwgcmVsYXRpb25zaGlwLCBleHBlY3RlZExvY2F0aW9uKTsKLSAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbihVbml2ZXJzZUVsZW1lbnQuSU5TVEFOQ0UsIHJlbGF0aW9uc2hpcCwKKyAgICBfYXNzZXJ0UmVjb3JkZWRSZWxhdGlvbigKKyAgICAgICAgVW5pdmVyc2VFbGVtZW50LklOU1RBTkNFLAorICAgICAgICByZWxhdGlvbnNoaXAsCiAgICAgICAgIGV4cGVjdGVkTG9jYXRpb24pOwogICB9CiAKLSAgdm9pZCBfYXNzZXJ0Tm9FcnJvcnNJblNvdXJjZSgpIHsKLSAgICBMaXN0PEFuYWx5c2lzRXJyb3I+IGVycm9ycyA9IGNvbnRleHQuZ2V0RXJyb3JzKHRlc3RTb3VyY2UpLmVycm9yczsKLSAgICBleHBlY3QoZXJyb3JzLCBpc0VtcHR5KTsKLSAgfQotCiAgIC8qKgogICAgKiBBc3NlcnRzIHRoYXQgW3JlY29yZGVkUmVsYXRpb25zXSBoYXMgbm8gaXRlbSB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4KICAgICovCiAgIHZvaWQgX2Fzc2VydE5vUmVjb3JkZWRSZWxhdGlvbihFbGVtZW50IGVsZW1lbnQsIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsCiAgICAgICBFeHBlY3RlZExvY2F0aW9uIGxvY2F0aW9uKSB7CiAgICAgZm9yIChSZWNvcmRlZFJlbGF0aW9uIHJlY29yZGVkUmVsYXRpb24gaW4gcmVjb3JkZWRSZWxhdGlvbnMpIHsKLSAgICAgIGlmIChfZXF1YWxzUmVjb3JkZWRSZWxhdGlvbihyZWNvcmRlZFJlbGF0aW9uLCBlbGVtZW50LCByZWxhdGlvbnNoaXAsCisgICAgICBpZiAoX2VxdWFsc1JlY29yZGVkUmVsYXRpb24oCisgICAgICAgICAgcmVjb3JkZWRSZWxhdGlvbiwKKyAgICAgICAgICBlbGVtZW50LAorICAgICAgICAgIHJlbGF0aW9uc2hpcCwKICAgICAgICAgICBsb2NhdGlvbikpIHsKLSAgICAgICAgZmFpbCgnbm90IGV4cGVjdGVkOiAke3JlY29yZGVkUmVsYXRpb259IGluXG4nICsgcmVjb3JkZWRSZWxhdGlvbnMuam9pbigKLSAgICAgICAgICAgICdcbicpKTsKKyAgICAgICAgZmFpbCgKKyAgICAgICAgICAgICdub3QgZXhwZWN0ZWQ6ICR7cmVjb3JkZWRSZWxhdGlvbn0gaW5cbicgKyByZWNvcmRlZFJlbGF0aW9ucy5qb2luKCdcbicpKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE1NDIsNjYgKzE3NDcsMzIgQEAKICAgTG9jYXRpb24gX2Fzc2VydFJlY29yZGVkUmVsYXRpb24oRWxlbWVudCBleHBlY3RlZEVsZW1lbnQsCiAgICAgICBSZWxhdGlvbnNoaXAgZXhwZWN0ZWRSZWxhdGlvbnNoaXAsIEV4cGVjdGVkTG9jYXRpb24gZXhwZWN0ZWRMb2NhdGlvbikgewogICAgIGZvciAoUmVjb3JkZWRSZWxhdGlvbiByZWNvcmRlZFJlbGF0aW9uIGluIHJlY29yZGVkUmVsYXRpb25zKSB7Ci0gICAgICBpZiAoX2VxdWFsc1JlY29yZGVkUmVsYXRpb24ocmVjb3JkZWRSZWxhdGlvbiwgZXhwZWN0ZWRFbGVtZW50LAotICAgICAgICAgIGV4cGVjdGVkUmVsYXRpb25zaGlwLCBleHBlY3RlZExvY2F0aW9uKSkgeworICAgICAgaWYgKF9lcXVhbHNSZWNvcmRlZFJlbGF0aW9uKAorICAgICAgICAgIHJlY29yZGVkUmVsYXRpb24sCisgICAgICAgICAgZXhwZWN0ZWRFbGVtZW50LAorICAgICAgICAgIGV4cGVjdGVkUmVsYXRpb25zaGlwLAorICAgICAgICAgIGV4cGVjdGVkTG9jYXRpb24pKSB7CiAgICAgICAgIHJldHVybiByZWNvcmRlZFJlbGF0aW9uLmxvY2F0aW9uOwogICAgICAgfQogICAgIH0KLSAgICBmYWlsKCJub3QgZm91bmRcbiRleHBlY3RlZEVsZW1lbnQgJGV4cGVjdGVkUmVsYXRpb25zaGlwICIKLSAgICAgICAgImluICRleHBlY3RlZExvY2F0aW9uIGluXG4iICsgcmVjb3JkZWRSZWxhdGlvbnMuam9pbignXG4nKSk7CisgICAgZmFpbCgKKyAgICAgICAgIm5vdCBmb3VuZFxuJGV4cGVjdGVkRWxlbWVudCAkZXhwZWN0ZWRSZWxhdGlvbnNoaXAgIiAiaW4gJGV4cGVjdGVkTG9jYXRpb24gaW5cbiIKKyAgICAgICAgICAgICsKKyAgICAgICAgICAgIHJlY29yZGVkUmVsYXRpb25zLmpvaW4oJ1xuJykpOwogICAgIHJldHVybiBudWxsOwogICB9CiAKICAgRXhwZWN0ZWRMb2NhdGlvbiBfZXhwZWN0ZWRMb2NhdGlvbihFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBzZWFyY2gsIFtpbnQgbGVuZ3RoCiAgICAgICA9IC0xXSkgewotICAgIGludCBvZmZzZXQgPSBfZmluZE9mZnNldChzZWFyY2gpOworICAgIGludCBvZmZzZXQgPSBmaW5kT2Zmc2V0KHNlYXJjaCk7CiAgICAgaWYgKGxlbmd0aCA9PSAtMSkgewotICAgICAgbGVuZ3RoID0gX2dldExlYWRpbmdJZGVudGlmaWVyTGVuZ3RoKHNlYXJjaCk7CisgICAgICBsZW5ndGggPSBnZXRMZWFkaW5nSWRlbnRpZmllckxlbmd0aChzZWFyY2gpOwogICAgIH0KICAgICByZXR1cm4gbmV3IEV4cGVjdGVkTG9jYXRpb24oZWxlbWVudCwgb2Zmc2V0LCBsZW5ndGgpOwogICB9CiAKLSAgRWxlbWVudCBfZmluZEVsZW1lbnQoU3RyaW5nIG5hbWUsIFtFbGVtZW50S2luZCBraW5kXSkgewotICAgIHJldHVybiBmaW5kQ2hpbGRFbGVtZW50KHRlc3RVbml0RWxlbWVudCwgbmFtZSwga2luZCk7Ci0gIH0KLQotICBBc3ROb2RlIF9maW5kTm9kZUF0T2Zmc2V0KGludCBvZmZzZXQsIFtQcmVkaWNhdGU8QXN0Tm9kZT4gcHJlZGljYXRlXSkgewotICAgIEFzdE5vZGUgcmVzdWx0ID0gbmV3IE5vZGVMb2NhdG9yLmNvbjEob2Zmc2V0KS5zZWFyY2hXaXRoaW4odGVzdFVuaXQpOwotICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiBwcmVkaWNhdGUgIT0gbnVsbCkgewotICAgICAgcmVzdWx0ID0gcmVzdWx0LmdldEFuY2VzdG9yKHByZWRpY2F0ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBBc3ROb2RlIF9maW5kTm9kZUF0U3RyaW5nKFN0cmluZyBzZWFyY2gsIFtQcmVkaWNhdGU8QXN0Tm9kZT4gcHJlZGljYXRlXSkgewotICAgIGludCBvZmZzZXQgPSBfZmluZE9mZnNldChzZWFyY2gpOwotICAgIHJldHVybiBfZmluZE5vZGVBdE9mZnNldChvZmZzZXQsIHByZWRpY2F0ZSk7Ci0gIH0KLQotICBFbGVtZW50IF9maW5kTm9kZUVsZW1lbnRBdFN0cmluZyhTdHJpbmcgc2VhcmNoLAotICAgICAgW1ByZWRpY2F0ZTxBc3ROb2RlPiBwcmVkaWNhdGVdKSB7Ci0gICAgQXN0Tm9kZSBub2RlID0gX2ZpbmROb2RlQXRTdHJpbmcoc2VhcmNoLCBwcmVkaWNhdGUpOwotICAgIGlmIChub2RlID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICByZXR1cm4gRWxlbWVudExvY2F0b3IubG9jYXRlKG5vZGUpOwotICB9Ci0KLSAgaW50IF9maW5kT2Zmc2V0KFN0cmluZyBzZWFyY2gpIHsKLSAgICBpbnQgb2Zmc2V0ID0gdGVzdENvZGUuaW5kZXhPZihzZWFyY2gpOwotICAgIGV4cGVjdChvZmZzZXQsIGlzTm9uTmVnYXRpdmUsIHJlYXNvbjogIk5vdCBmb3VuZCAnJHNlYXJjaCcgaW5cbiR0ZXN0Q29kZSIpOwotICAgIHJldHVybiBvZmZzZXQ7Ci0gIH0KLQogICB2b2lkIF9pbmRleFRlc3RVbml0KFN0cmluZyBjb2RlKSB7Ci0gICAgdGVzdENvZGUgPSBjb2RlOwotICAgIHRlc3RTb3VyY2UgPSBhZGRTb3VyY2UoJy90ZXN0LmRhcnQnLCBjb2RlKTsKLSAgICB0ZXN0VW5pdCA9IHJlc29sdmVMaWJyYXJ5VW5pdCh0ZXN0U291cmNlKTsKLSAgICBpZiAodmVyaWZ5Tm9UZXN0VW5pdEVycm9ycykgewotICAgICAgX2Fzc2VydE5vRXJyb3JzSW5Tb3VyY2UoKTsKLSAgICB9Ci0gICAgdGVzdFVuaXRFbGVtZW50ID0gdGVzdFVuaXQuZWxlbWVudDsKLSAgICB0ZXN0TGlicmFyeUVsZW1lbnQgPSB0ZXN0VW5pdEVsZW1lbnQubGlicmFyeTsKKyAgICByZXNvbHZlVGVzdFVuaXQoY29kZSk7CiAgICAgaW5kZXhEYXJ0VW5pdChzdG9yZSwgY29udGV4dCwgdGVzdFVuaXQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9pbmRleC9zdG9yZS9jb2RlY190ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9pbmRleC9zdG9yZS9jb2RlY190ZXN0LmRhcnQKaW5kZXggMWI0ZGM2YS4uYzcyY2I2MCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3QvaW5kZXgvc3RvcmUvY29kZWNfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy90ZXN0L2luZGV4L3N0b3JlL2NvZGVjX3Rlc3QuZGFydApAQCAtMTAsOSArMTAsMTAgQEAKIGltcG9ydCAncGFja2FnZTphbmFseXNpc190ZXN0aW5nL3JlZmxlY3RpdmVfdGVzdHMuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOmFuYWx5emVyL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOnR5cGVkX21vY2svdHlwZWRfbW9jay5kYXJ0JzsKIGltcG9ydCAncGFja2FnZTp1bml0dGVzdC91bml0dGVzdC5kYXJ0JzsKIAoraW1wb3J0ICcuLi9hYnN0cmFjdF9zaW5nbGVfdW5pdC5kYXJ0JzsKKwogCiBtYWluKCkgewogICBncm91cFNlcCA9ICcgfCAnOwpAQCAtNzEsNzggKzcyLDExNSBAQAogCiAKIEBSZWZsZWN0aXZlVGVzdENhc2UoKQotY2xhc3MgX0VsZW1lbnRDb2RlY1Rlc3QgeworY2xhc3MgX0VsZW1lbnRDb2RlY1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbmdsZVVuaXRUZXN0IHsKICAgRWxlbWVudENvZGVjIGNvZGVjOwogICBBbmFseXNpc0NvbnRleHQgY29udGV4dCA9IG5ldyBNb2NrQW5hbHlzaXNDb250ZXh0KCdjb250ZXh0Jyk7CiAgIFN0cmluZ0NvZGVjIHN0cmluZ0NvZGVjID0gbmV3IFN0cmluZ0NvZGVjKCk7CiAKICAgdm9pZCBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpOwogICAgIGNvZGVjID0gbmV3IEVsZW1lbnRDb2RlYyhzdHJpbmdDb2RlYyk7CiAgIH0KIAorICB2b2lkIHRlc3RfZmllbGQoKSB7CisgICAgcmVzb2x2ZVRlc3RVbml0KCcnJworY2xhc3MgQSB7CisgIGludCBmaWVsZDsKK30KKycnJyk7CisgICAgRmllbGRFbGVtZW50IGZpZWxkID0gZmluZEVsZW1lbnQoJ2ZpZWxkJywgRWxlbWVudEtpbmQuRklFTEQpOworICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGdldHRlciA9IGZpZWxkLmdldHRlcjsKKyAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBzZXR0ZXIgPSBmaWVsZC5zZXR0ZXI7CisgICAgeworICAgICAgaW50IGlkID0gY29kZWMuZW5jb2RlKGdldHRlcik7CisgICAgICBleHBlY3QoY29kZWMuZGVjb2RlKGNvbnRleHQsIGlkKSwgZ2V0dGVyKTsKKyAgICB9CisgICAgeworICAgICAgaW50IGlkID0gY29kZWMuZW5jb2RlKHNldHRlcik7CisgICAgICBleHBlY3QoY29kZWMuZGVjb2RlKGNvbnRleHQsIGlkKSwgc2V0dGVyKTsKKyAgICB9CisgICAgeworICAgICAgaW50IGlkID0gY29kZWMuZW5jb2RlKGZpZWxkKTsKKyAgICAgIGV4cGVjdChjb2RlYy5kZWNvZGUoY29udGV4dCwgaWQpLCBmaWVsZCk7CisgICAgfQorICB9CisKICAgdm9pZCB0ZXN0X2xvY2FsTG9jYWxWYXJpYWJsZSgpIHsKKyAgICByZXNvbHZlVGVzdFVuaXQoJycnCittYWluKCkgeworICB7CisgICAgZm9vKCkgeworICAgICAgaW50IGJhcjsgLy8gQQorICAgIH0KKyAgfQorICB7CisgICAgZm9vKCkgeworICAgICAgaW50IGJhcjsgLy8gQgorICAgIH0KKyAgfQorfQorJycnKTsKICAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuZXcgTW9ja0VsZW1lbnQoKTsKLSAgICAgIEVsZW1lbnRMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBFbGVtZW50TG9jYXRpb25JbXBsLmNvbjMoWydtYWluJywgJ2Zvb0AxJywKLSAgICAgICAgICAnYmFyQDInXSk7Ci0gICAgICB3aGVuKGNvbnRleHQuZ2V0RWxlbWVudChsb2NhdGlvbikpLnRoZW5SZXR1cm4oZWxlbWVudCk7Ci0gICAgICB3aGVuKGVsZW1lbnQubG9jYXRpb24pLnRoZW5SZXR1cm4obG9jYXRpb24pOworICAgICAgTG9jYWxWYXJpYWJsZUVsZW1lbnQgZWxlbWVudCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdiYXI7IC8vIEEnLCBudWxsKTsKICAgICAgIGludCBpZCA9IGNvZGVjLmVuY29kZShlbGVtZW50KTsKICAgICAgIGV4cGVjdChjb2RlYy5kZWNvZGUoY29udGV4dCwgaWQpLCBlbGVtZW50KTsKICAgICB9CiAgICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmV3IE1vY2tFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50TG9jYXRpb24gbG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uSW1wbC5jb24zKFsnbWFpbicsICdmb29AMTAnLAotICAgICAgICAgICdiYXJAMjAnXSk7Ci0gICAgICB3aGVuKGNvbnRleHQuZ2V0RWxlbWVudChsb2NhdGlvbikpLnRoZW5SZXR1cm4oZWxlbWVudCk7Ci0gICAgICB3aGVuKGVsZW1lbnQubG9jYXRpb24pLnRoZW5SZXR1cm4obG9jYXRpb24pOworICAgICAgTG9jYWxWYXJpYWJsZUVsZW1lbnQgZWxlbWVudCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdiYXI7IC8vIEInLCBudWxsKTsKICAgICAgIGludCBpZCA9IGNvZGVjLmVuY29kZShlbGVtZW50KTsKICAgICAgIGV4cGVjdChjb2RlYy5kZWNvZGUoY29udGV4dCwgaWQpLCBlbGVtZW50KTsKICAgICB9Ci0gICAgLy8gY2hlY2sgc3RyaW5ncywgImZvbyIgYXMgYSBzaW5nbGUgc3RyaW5nLCBubyAiZm9vQDEiIG9yICJmb29AMTAiCi0gICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBoYXNMZW5ndGgoMykpOwotICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdtYWluJywgMCkpOwotICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdmb28nLCAxKSk7Ci0gICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ2JhcicsIDIpKTsKKyAgICAvLyBjaGVjayBzdHJpbmdzLCAiZm9vIiBhcyBhIHNpbmdsZSBzdHJpbmcsIG5vICJmb29AMTciIG9yICJiYXJAMzUiCisgICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBoYXNMZW5ndGgoNCkpOworICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdmL3Rlc3QuZGFydCcsIDApKTsKKyAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGNvbnRhaW5zUGFpcignbWFpbicsIDEpKTsKKyAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGNvbnRhaW5zUGFpcignZm9vJywgMikpOworICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdiYXInLCAzKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfbG9jYWxWYXJpYWJsZSgpIHsKKyAgICByZXNvbHZlVGVzdFVuaXQoJycnCittYWluKCkgeworICB7CisgICAgaW50IGZvbzsgLy8gQQorICB9CisgIHsKKyAgICBpbnQgZm9vOyAvLyBCCisgIH0KK30KKycnJyk7CiAgICAgewotICAgICAgRWxlbWVudCBlbGVtZW50ID0gbmV3IE1vY2tFbGVtZW50KCk7Ci0gICAgICBFbGVtZW50TG9jYXRpb24gbG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uSW1wbC5jb24zKFsnbWFpbicsCi0gICAgICAgICAgJ2Zvb0A0MiddKTsKLSAgICAgIHdoZW4oY29udGV4dC5nZXRFbGVtZW50KGxvY2F0aW9uKSkudGhlblJldHVybihlbGVtZW50KTsKLSAgICAgIHdoZW4oZWxlbWVudC5sb2NhdGlvbikudGhlblJldHVybihsb2NhdGlvbik7CisgICAgICBMb2NhbFZhcmlhYmxlRWxlbWVudCBlbGVtZW50ID0gZmluZE5vZGVFbGVtZW50QXRTdHJpbmcoJ2ZvbzsgLy8gQScsIG51bGwpOwogICAgICAgaW50IGlkID0gY29kZWMuZW5jb2RlKGVsZW1lbnQpOwogICAgICAgZXhwZWN0KGNvZGVjLmRlY29kZShjb250ZXh0LCBpZCksIGVsZW1lbnQpOwogICAgIH0KICAgICB7Ci0gICAgICBFbGVtZW50IGVsZW1lbnQgPSBuZXcgTW9ja0VsZW1lbnQoKTsKLSAgICAgIEVsZW1lbnRMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBFbGVtZW50TG9jYXRpb25JbXBsLmNvbjMoWydtYWluJywKLSAgICAgICAgICAnZm9vQDQyMDAnXSk7Ci0gICAgICB3aGVuKGNvbnRleHQuZ2V0RWxlbWVudChsb2NhdGlvbikpLnRoZW5SZXR1cm4oZWxlbWVudCk7Ci0gICAgICB3aGVuKGVsZW1lbnQubG9jYXRpb24pLnRoZW5SZXR1cm4obG9jYXRpb24pOworICAgICAgTG9jYWxWYXJpYWJsZUVsZW1lbnQgZWxlbWVudCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdmb287IC8vIEInLCBudWxsKTsKICAgICAgIGludCBpZCA9IGNvZGVjLmVuY29kZShlbGVtZW50KTsKICAgICAgIGV4cGVjdChjb2RlYy5kZWNvZGUoY29udGV4dCwgaWQpLCBlbGVtZW50KTsKICAgICB9Ci0gICAgLy8gY2hlY2sgc3RyaW5ncywgImZvbyIgYXMgYSBzaW5nbGUgc3RyaW5nLCBubyAiZm9vQDQyIiBvciAiZm9vQDQyMDAiCi0gICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBoYXNMZW5ndGgoMikpOwotICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdtYWluJywgMCkpOwotICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgY29udGFpbnNQYWlyKCdmb28nLCAxKSk7CisgICAgLy8gY2hlY2sgc3RyaW5ncywgImZvbyIgYXMgYSBzaW5nbGUgc3RyaW5nLCBubyAiZm9vQDIxIiBvciAiZm9vQDQ3IgorICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgaGFzTGVuZ3RoKDMpKTsKKyAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGNvbnRhaW5zUGFpcignZi90ZXN0LmRhcnQnLCAwKSk7CisgICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ21haW4nLCAxKSk7CisgICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ2ZvbycsIDIpKTsKICAgfQogCiAgIHZvaWQgdGVzdF9ub3RMb2NhbCgpIHsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBuZXcgTW9ja0VsZW1lbnQoKTsKLSAgICBFbGVtZW50TG9jYXRpb24gbG9jYXRpb24gPSBuZXcgRWxlbWVudExvY2F0aW9uSW1wbC5jb24zKFsnZm9vJywgJ2JhciddKTsKLSAgICB3aGVuKGVsZW1lbnQubG9jYXRpb24pLnRoZW5SZXR1cm4obG9jYXRpb24pOwotICAgIHdoZW4oY29udGV4dC5nZXRFbGVtZW50KGxvY2F0aW9uKSkudGhlblJldHVybihlbGVtZW50KTsKKyAgICByZXNvbHZlVGVzdFVuaXQoJycnCittYWluKCkgeworICBpbnQgZm9vOworfQorJycnKTsKKyAgICBMb2NhbFZhcmlhYmxlRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ2ZvbycpOwogICAgIGludCBpZCA9IGNvZGVjLmVuY29kZShlbGVtZW50KTsKICAgICBleHBlY3QoY29kZWMuZW5jb2RlKGVsZW1lbnQpLCBpZCk7CiAgICAgZXhwZWN0KGNvZGVjLmRlY29kZShjb250ZXh0LCBpZCksIGVsZW1lbnQpOwogICAgIC8vIGNoZWNrIHN0cmluZ3MKLSAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGhhc0xlbmd0aCgyKSk7Ci0gICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ2ZvbycsIDApKTsKLSAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGNvbnRhaW5zUGFpcignYmFyJywgMSkpOworICAgIGV4cGVjdChzdHJpbmdDb2RlYy5uYW1lVG9JbmRleCwgaGFzTGVuZ3RoKDMpKTsKKyAgICBleHBlY3Qoc3RyaW5nQ29kZWMubmFtZVRvSW5kZXgsIGNvbnRhaW5zUGFpcignZi90ZXN0LmRhcnQnLCAwKSk7CisgICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ21haW4nLCAxKSk7CisgICAgZXhwZWN0KHN0cmluZ0NvZGVjLm5hbWVUb0luZGV4LCBjb250YWluc1BhaXIoJ2ZvbycsIDIpKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9zZWFyY2gvc2VhcmNoX2VuZ2luZV90ZXN0LmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9zZWFyY2gvc2VhcmNoX2VuZ2luZV90ZXN0LmRhcnQKaW5kZXggZGI4OTZjOS4uZjZkMDJkZTkgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc19zZXJ2aWNlcy90ZXN0L3NlYXJjaC9zZWFyY2hfZW5naW5lX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9zZWFyY2gvc2VhcmNoX2VuZ2luZV90ZXN0LmRhcnQKQEAgLTUsMjE0NCArNSw2NTkgQEAKIC8vIFRoaXMgY29kZSB3YXMgYXV0by1nZW5lcmF0ZWQsIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBlZGl0ZWQsIGFuZCBpcyBzdWJqZWN0IHRvCiAvLyBzaWduaWZpY2FudCBjaGFuZ2UuIFBsZWFzZSBzZWUgdGhlIFJFQURNRSBmaWxlIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCi1saWJyYXJ5IGVuZ2luZS5zZWFyY2hfZW5naW5lX3Rlc3Q7CitsaWJyYXJ5IHNlcnZpY2VzLnNyYy5zZWFyY2guc2VhcmNoX2VuZ2luZV90ZXN0OworCitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmljZXMvaW5kZXgvaW5kZXguZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHlzaXNfc2VydmljZXMvaW5kZXgvbG9jYWxfbWVtb3J5X2luZGV4LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL3NlYXJjaC9zZWFyY2hfZW5naW5lLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3NlcnZpY2VzL3NyYy9zZWFyY2gvc2VhcmNoX2VuZ2luZS5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXNpc190ZXN0aW5nL21vY2tzLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFuYWx5c2lzX3Rlc3RpbmcvcmVmbGVjdGl2ZV90ZXN0cy5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTphbmFseXplci9zcmMvZ2VuZXJhdGVkL2VsZW1lbnQuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YW5hbHl6ZXIvc3JjL2dlbmVyYXRlZC9zb3VyY2UuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dHlwZWRfbW9jay90eXBlZF9tb2NrLmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOnVuaXR0ZXN0L3VuaXR0ZXN0LmRhcnQnOworCitpbXBvcnQgJy4uL2luZGV4L2Fic3RyYWN0X3NpbmdsZV91bml0LmRhcnQnOwogCiAKIG1haW4oKSB7CisgIGdyb3VwU2VwID0gJyB8ICc7CisgIGdyb3VwKCdTZWFyY2hFbmdpbmVJbXBsVGVzdCcsICgpIHsKKyAgICBydW5SZWZsZWN0aXZlVGVzdHMoU2VhcmNoRW5naW5lSW1wbFRlc3QpOworICB9KTsKK30KKworY2xhc3MgRXhwZWN0ZWRNYXRjaCB7CisgIGZpbmFsIEVsZW1lbnQgZWxlbWVudDsKKyAgZmluYWwgTWF0Y2hLaW5kIGtpbmQ7CisgIFNvdXJjZVJhbmdlIHJhbmdlOworICBmaW5hbCBib29sIGlzUmVzb2x2ZWQ7CisgIGZpbmFsIGJvb2wgaXNRdWFsaWZpZWQ7CisKKyAgRXhwZWN0ZWRNYXRjaCh0aGlzLmVsZW1lbnQsIHRoaXMua2luZCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwKKyAgICAgIHt0aGlzLmlzUmVzb2x2ZWQ6IHRydWUsIHRoaXMuaXNRdWFsaWZpZWQ6IGZhbHNlfSkgeworICAgIHRoaXMucmFuZ2UgPSBuZXcgU291cmNlUmFuZ2Uob2Zmc2V0LCBsZW5ndGgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvciA9PShTZWFyY2hNYXRjaCBtYXRjaCkgeworICAgIHJldHVybiBtYXRjaC5lbGVtZW50ID09IHRoaXMuZWxlbWVudCAmJgorICAgICAgICBtYXRjaC5raW5kID09IHRoaXMua2luZCAmJgorICAgICAgICBtYXRjaC5pc1Jlc29sdmVkID09IHRoaXMuaXNSZXNvbHZlZCAmJgorICAgICAgICBtYXRjaC5pc1F1YWxpZmllZCA9PSB0aGlzLmlzUXVhbGlmaWVkICYmCisgICAgICAgIG1hdGNoLnNvdXJjZVJhbmdlID09IHRoaXMucmFuZ2U7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgYnVmZmVyLndyaXRlKCJFeHBlY3RlZE1hdGNoKGtpbmQ9Iik7CisgICAgYnVmZmVyLndyaXRlKGtpbmQpOworICAgIGJ1ZmZlci53cml0ZSgiLCBlbGVtZW50PSIpOworICAgIGJ1ZmZlci53cml0ZShlbGVtZW50ICE9IG51bGwgPyBlbGVtZW50LmRpc3BsYXlOYW1lIDogJ251bGwnKTsKKyAgICBidWZmZXIud3JpdGUoIiwgcmFuZ2U9Iik7CisgICAgYnVmZmVyLndyaXRlKHJhbmdlKTsKKyAgICBidWZmZXIud3JpdGUoIiwgaXNSZXNvbHZlZD0iKTsKKyAgICBidWZmZXIud3JpdGUoaXNSZXNvbHZlZCk7CisgICAgYnVmZmVyLndyaXRlKCIsIGlzUXVhbGlmaWVkPSIpOworICAgIGJ1ZmZlci53cml0ZShpc1F1YWxpZmllZCk7CisgICAgYnVmZmVyLndyaXRlKCIpIik7CisgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICB9CiB9CiAKIAotLy9jbGFzcyBBbmRTZWFyY2hQYXR0ZXJuVGVzdCBleHRlbmRzIEVuZ2luZVRlc3RDYXNlIHsKLS8vICBFbGVtZW50IF9lbGVtZW50ID0gbW9jayhFbGVtZW50KTsKLS8vCi0vLyAgU2VhcmNoUGF0dGVybiBfcGF0dGVybkEgPSBtb2NrKFNlYXJjaFBhdHRlcm4pOwotLy8KLS8vICBTZWFyY2hQYXR0ZXJuIF9wYXR0ZXJuQiA9IG1vY2soU2VhcmNoUGF0dGVybik7Ci0vLwotLy8gIEFuZFNlYXJjaFBhdHRlcm4gX3BhdHRlcm4gPSBuZXcgQW5kU2VhcmNoUGF0dGVybihbX3BhdHRlcm5BLCBfcGF0dGVybkJdKTsKLS8vCi0vLyAgdm9pZCB0ZXN0X2FsbEV4YWN0KCkgewotLy8gICAgd2hlbihfcGF0dGVybkEubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIHdoZW4oX3BhdHRlcm5CLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKE1hdGNoUXVhbGl0eS5FWEFDVCk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKE1hdGNoUXVhbGl0eS5FWEFDVCwgX3BhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOworY2xhc3MgTW9ja0FuZ3VsYXJDb21wb25lbnRFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMKKyAgICBBbmd1bGFyQ29tcG9uZW50RWxlbWVudCB7CisgIGZpbmFsIGtpbmQgPSBFbGVtZW50S2luZC5BTkdVTEFSX0NPTVBPTkVOVDsKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworfQorCisKK2NsYXNzIE1vY2tBbmd1bGFyQ29udHJvbGxlckVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cworICAgIEFuZ3VsYXJDb250cm9sbGVyRWxlbWVudCB7CisgIGZpbmFsIGtpbmQgPSBFbGVtZW50S2luZC5BTkdVTEFSX0NPTlRST0xMRVI7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworCitjbGFzcyBNb2NrQW5ndWxhckZvcm1hdHRlckVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cworICAgIEFuZ3VsYXJGb3JtYXR0ZXJFbGVtZW50IHsKKyAgZmluYWwga2luZCA9IEVsZW1lbnRLaW5kLkFOR1VMQVJfRk9STUFUVEVSOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKworY2xhc3MgTW9ja0luZGV4IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgSW5kZXggeworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKworQFJlZmxlY3RpdmVUZXN0Q2FzZSgpCitjbGFzcyBTZWFyY2hFbmdpbmVJbXBsVGVzdCBleHRlbmRzIEFic3RyYWN0U2luZ2xlVW5pdFRlc3QgeworICBJbmRleCBpbmRleDsKKyAgU2VhcmNoRW5naW5lSW1wbCBzZWFyY2hFbmdpbmU7CisKKy8vICB2b2lkIG1vY2tMb2NhdGlvbihFbGVtZW50IGVsZW1lbnQsIFJlbGF0aW9uc2hpcCByZWxhdGlvbnNoaXAsCisvLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uKSB7CisvLyAgICBtb2NrTG9jYXRpb25zKGVsZW1lbnQsIHJlbGF0aW9uc2hpcCwgW2xvY2F0aW9uXSk7CiAvLyAgfQogLy8KLS8vICB2b2lkIHRlc3RfRXhhY3ROYW1lKCkgewotLy8gICAgd2hlbihfcGF0dGVybkEubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIHdoZW4oX3BhdHRlcm5CLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKE1hdGNoUXVhbGl0eS5OQU1FKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBfcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7CisvLyAgdm9pZCBtb2NrTG9jYXRpb25zKEVsZW1lbnQgZWxlbWVudCwgUmVsYXRpb25zaGlwIHJlbGF0aW9uc2hpcCwKKy8vICAgICAgTGlzdDxMb2NhdGlvbj4gbG9jYXRpb25zKSB7CisvLyAgICBpbmRleC5nZXRSZWxhdGlvbnNoaXBzKGVsZW1lbnQsIHJlbGF0aW9uc2hpcCk7CisvLyAgICB3aGVuKG51bGwpLnRoZW5SZXR1cm4obmV3IEZ1dHVyZS52YWx1ZShsb2NhdGlvbnMpKTsKIC8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9OYW1lRXhhY3QoKSB7Ci0vLyAgICB3aGVuKF9wYXR0ZXJuQS5tYXRjaGVzKF9lbGVtZW50KSkudGhlblJldHVybihNYXRjaFF1YWxpdHkuTkFNRSk7Ci0vLyAgICB3aGVuKF9wYXR0ZXJuQi5tYXRjaGVzKF9lbGVtZW50KSkudGhlblJldHVybihNYXRjaFF1YWxpdHkuRVhBQ1QpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIF9wYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9vbmVOdWxsKCkgewotLy8gICAgd2hlbihfcGF0dGVybkEubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIHdoZW4oX3BhdHRlcm5CLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKG51bGwpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBfcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgZGFydFN1aXRlKCkgewotLy8gICAgX3V0Lmdyb3VwKCdBbmRTZWFyY2hQYXR0ZXJuVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfRXhhY3ROYW1lJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBBbmRTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X0V4YWN0TmFtZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9OYW1lRXhhY3QnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEFuZFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfTmFtZUV4YWN0KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2FsbEV4YWN0JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBBbmRTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2FsbEV4YWN0KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X29uZU51bGwnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEFuZFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfb25lTnVsbCk7Ci0vLyAgICAgIH0pOwotLy8gICAgfSk7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuVGVzdCBleHRlbmRzIEVuZ2luZVRlc3RDYXNlIHsKLS8vICB2b2lkIHRlc3RfbWF0Y2hFeGFjdF9zYW1lUGFydENvdW50KCkgewotLy8gICAgRWxlbWVudCBlbGVtZW50ID0gbW9jayhFbGVtZW50KTsKLS8vICAgIHdoZW4oZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hcCIpOwotLy8gICAgLy8KLS8vICAgIENhbWVsQ2FzZVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuKCJITSIsIHRydWUpOwotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKE1hdGNoUXVhbGl0eS5FWEFDVCwgcGF0dGVybi5tYXRjaGVzKGVsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9tYXRjaEV4YWN0X3dpdGhMb3dlckNhc2UoKSB7Ci0vLyAgICBFbGVtZW50IGVsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8gICAgd2hlbihlbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJIYXNoTWFwIik7Ci0vLyAgICAvLwotLy8gICAgQ2FtZWxDYXNlU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IENhbWVsQ2FzZVNlYXJjaFBhdHRlcm4oIkhhTWEiLCB0cnVlKTsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhlbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hOb3RfbnVsbE5hbWUoKSB7Ci0vLyAgICBFbGVtZW50IGVsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8gICAgd2hlbihlbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKG51bGwpOwotLy8gICAgLy8KLS8vICAgIENhbWVsQ2FzZVNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuKCJITSIsIHRydWUpOwotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhlbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hOb3Rfc2FtZVBhcnRDb3VudCgpIHsKLS8vICAgIEVsZW1lbnQgZWxlbWVudCA9IG1vY2soRWxlbWVudCk7Ci0vLyAgICB3aGVuKGVsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkxpbmtlZEhhc2hNYXAiKTsKLS8vICAgIC8vCi0vLyAgICBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgQ2FtZWxDYXNlU2VhcmNoUGF0dGVybigiTEgiLCB0cnVlKTsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBwYXR0ZXJuLm1hdGNoZXMoZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X21hdGNoTm90X3dpdGhMb3dlckNhc2UoKSB7Ci0vLyAgICBFbGVtZW50IGVsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8gICAgd2hlbihlbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJIYXNoTWFwIik7Ci0vLyAgICAvLwotLy8gICAgQ2FtZWxDYXNlU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IENhbWVsQ2FzZVNlYXJjaFBhdHRlcm4oIkhhTXUiLCB0cnVlKTsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBwYXR0ZXJuLm1hdGNoZXMoZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnQ2FtZWxDYXNlU2VhcmNoUGF0dGVyblRlc3QnLCAoKSB7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X21hdGNoRXhhY3Rfc2FtZVBhcnRDb3VudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgQ2FtZWxDYXNlU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9tYXRjaEV4YWN0X3NhbWVQYXJ0Q291bnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbWF0Y2hFeGFjdF93aXRoTG93ZXJDYXNlJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21hdGNoRXhhY3Rfd2l0aExvd2VyQ2FzZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9tYXRjaE5vdF9udWxsTmFtZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgQ2FtZWxDYXNlU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9tYXRjaE5vdF9udWxsTmFtZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9tYXRjaE5vdF9zYW1lUGFydENvdW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21hdGNoTm90X3NhbWVQYXJ0Q291bnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbWF0Y2hOb3Rfd2l0aExvd2VyQ2FzZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgQ2FtZWxDYXNlU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9tYXRjaE5vdF93aXRoTG93ZXJDYXNlKTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIENvdW50aW5nU2VhcmNoTGlzdGVuZXJUZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIHZvaWQgdGVzdF9tYXRjaEZvdW5kKCkgewotLy8gICAgU2VhcmNoTGlzdGVuZXIgbGlzdGVuZXIgPSBtb2NrKFNlYXJjaExpc3RlbmVyKTsKLS8vICAgIFNlYXJjaE1hdGNoIG1hdGNoID0gbW9jayhTZWFyY2hNYXRjaCk7Ci0vLyAgICBTZWFyY2hMaXN0ZW5lciBjb3VudGluZ0xpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoMiwgbGlzdGVuZXIpOwotLy8gICAgLy8gIm1hdGNoIiBzaG91bGQgYmUgcGFzc2VkIHRvICJsaXN0ZW5lciIKLS8vICAgIGNvdW50aW5nTGlzdGVuZXIubWF0Y2hGb3VuZChtYXRjaCk7Ci0vLyAgICB2ZXJpZnkobGlzdGVuZXIpLm1hdGNoRm91bmQobWF0Y2gpOwotLy8gICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKGxpc3RlbmVyKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hDb21wbGV0ZSgpIHsKLS8vICAgIFNlYXJjaExpc3RlbmVyIGxpc3RlbmVyID0gbW9jayhTZWFyY2hMaXN0ZW5lcik7Ci0vLyAgICBTZWFyY2hMaXN0ZW5lciBjb3VudGluZ0xpc3RlbmVyID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoMiwgbGlzdGVuZXIpOwotLy8gICAgLy8gY29tcGxldGUgMiAtPiAxCi0vLyAgICBjb3VudGluZ0xpc3RlbmVyLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICB2ZXJpZnlaZXJvSW50ZXJhY3Rpb25zKGxpc3RlbmVyKTsKLS8vICAgIC8vIGNvbXBsZXRlIDIgLT4gMAotLy8gICAgY291bnRpbmdMaXN0ZW5lci5zZWFyY2hDb21wbGV0ZSgpOwotLy8gICAgdmVyaWZ5KGxpc3RlbmVyKS5zZWFyY2hDb21wbGV0ZSgpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaENvbXBsZXRlX3plcm8oKSB7Ci0vLyAgICBTZWFyY2hMaXN0ZW5lciBsaXN0ZW5lciA9IG1vY2soU2VhcmNoTGlzdGVuZXIpOwotLy8gICAgbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXIoMCwgbGlzdGVuZXIpOwotLy8gICAgLy8gY29tcGxldGUgYXQgMAotLy8gICAgdmVyaWZ5KGxpc3RlbmVyKS5zZWFyY2hDb21wbGV0ZSgpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnQ291bnRpbmdTZWFyY2hMaXN0ZW5lclRlc3QnLCAoKSB7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X21hdGNoRm91bmQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IENvdW50aW5nU2VhcmNoTGlzdGVuZXJUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfbWF0Y2hGb3VuZCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hDb21wbGV0ZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgQ291bnRpbmdTZWFyY2hMaXN0ZW5lclRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hDb21wbGV0ZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hDb21wbGV0ZV96ZXJvJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBDb3VudGluZ1NlYXJjaExpc3RlbmVyVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaENvbXBsZXRlX3plcm8pOwotLy8gICAgICB9KTsKLS8vICAgIH0pOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgRXhhY3RTZWFyY2hQYXR0ZXJuVGVzdCBleHRlbmRzIEVuZ2luZVRlc3RDYXNlIHsKLS8vICBFbGVtZW50IF9lbGVtZW50ID0gbW9jayhFbGVtZW50KTsKLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VJbnNlbnNpdGl2ZV9mYWxzZSgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBFeGFjdFNlYXJjaFBhdHRlcm4oIkhhc2hNYSIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWUoKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgRXhhY3RTZWFyY2hQYXR0ZXJuKCJIYXNoTWFwIiwgZmFsc2UpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hUCIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VTZW5zaXRpdmVfZmFsc2UoKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgRXhhY3RTZWFyY2hQYXR0ZXJuKCJIYXNoTWEiLCB0cnVlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfY2FzZVNlbnNpdGl2ZV90cnVlKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVybigiSGFzaE1hcCIsIHRydWUpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hcCIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X251bGxOYW1lKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVybigiSGFzaE1hcCIsIHRydWUpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybihudWxsKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgZGFydFN1aXRlKCkgewotLy8gICAgX3V0Lmdyb3VwKCdFeGFjdFNlYXJjaFBhdHRlcm5UZXN0JywgKCkgewotLy8gICAgICBfdXQudGVzdCgndGVzdF9jYXNlSW5zZW5zaXRpdmVfZmFsc2UnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlSW5zZW5zaXRpdmVfZmFsc2UpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlSW5zZW5zaXRpdmVfdHJ1ZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9jYXNlU2Vuc2l0aXZlX2ZhbHNlJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBFeGFjdFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbnVsbE5hbWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEV4YWN0U2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9udWxsTmFtZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgfSk7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBGaWx0ZXJTZWFyY2hMaXN0ZW5lclRlc3QgZXh0ZW5kcyBFbmdpbmVUZXN0Q2FzZSB7Ci0vLyAgU2VhcmNoTGlzdGVuZXIgX2xpc3RlbmVyID0gbW9jayhTZWFyY2hMaXN0ZW5lcik7Ci0vLwotLy8gIFNlYXJjaE1hdGNoIF9tYXRjaCA9IG1vY2soU2VhcmNoTWF0Y2gpOwotLy8KLS8vICBTZWFyY2hGaWx0ZXIgX2ZpbHRlciA9IG1vY2soU2VhcmNoRmlsdGVyKTsKLS8vCi0vLyAgU2VhcmNoTGlzdGVuZXIgX2ZpbHRlcmVkTGlzdGVuZXIgPSBuZXcgRmlsdGVyZWRTZWFyY2hMaXN0ZW5lcihfZmlsdGVyLCBfbGlzdGVuZXIpOwotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hGb3VuZF9maWx0ZXJGYWxzZSgpIHsKLS8vICAgIHdoZW4oX2ZpbHRlci5wYXNzZXMoX21hdGNoKSkudGhlblJldHVybihmYWxzZSk7Ci0vLyAgICAvLyAibWF0Y2giIHNob3VsZCBiZSBwYXNzZWQgdG8gImxpc3RlbmVyIgotLy8gICAgX2ZpbHRlcmVkTGlzdGVuZXIubWF0Y2hGb3VuZChfbWF0Y2gpOwotLy8gICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKF9saXN0ZW5lcik7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hGb3VuZF9maWx0ZXJUcnVlKCkgewotLy8gICAgd2hlbihfZmlsdGVyLnBhc3NlcyhfbWF0Y2gpKS50aGVuUmV0dXJuKHRydWUpOwotLy8gICAgLy8gIm1hdGNoIiBzaG91bGQgYmUgcGFzc2VkIHRvICJsaXN0ZW5lciIKLS8vICAgIF9maWx0ZXJlZExpc3RlbmVyLm1hdGNoRm91bmQoX21hdGNoKTsKLS8vICAgIHZlcmlmeShfbGlzdGVuZXIpLm1hdGNoRm91bmQoX21hdGNoKTsKLS8vICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhfbGlzdGVuZXIpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaENvbXBsZXRlKCkgewotLy8gICAgX2ZpbHRlcmVkTGlzdGVuZXIuc2VhcmNoQ29tcGxldGUoKTsKLS8vICAgIHZlcmlmeShfbGlzdGVuZXIpLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICB2ZXJpZnlOb01vcmVJbnRlcmFjdGlvbnMoX2xpc3RlbmVyKTsKLS8vICB9Ci0vLwotLy8gIHN0YXRpYyBkYXJ0U3VpdGUoKSB7Ci0vLyAgICBfdXQuZ3JvdXAoJ0ZpbHRlclNlYXJjaExpc3RlbmVyVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbWF0Y2hGb3VuZF9maWx0ZXJGYWxzZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgRmlsdGVyU2VhcmNoTGlzdGVuZXJUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfbWF0Y2hGb3VuZF9maWx0ZXJGYWxzZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9tYXRjaEZvdW5kX2ZpbHRlclRydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEZpbHRlclNlYXJjaExpc3RlbmVyVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21hdGNoRm91bmRfZmlsdGVyVHJ1ZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hDb21wbGV0ZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgRmlsdGVyU2VhcmNoTGlzdGVuZXJUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoQ29tcGxldGUpOwotLy8gICAgICB9KTsKLS8vICAgIH0pOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgR2F0aGVyaW5nU2VhcmNoTGlzdGVuZXJUZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIFNlYXJjaE1hdGNoIF9tYXRjaEEgPSBtb2NrKFNlYXJjaE1hdGNoKTsKLS8vCi0vLyAgU2VhcmNoTWF0Y2ggX21hdGNoQiA9IG1vY2soU2VhcmNoTWF0Y2gpOwotLy8KLS8vICBHYXRoZXJpbmdTZWFyY2hMaXN0ZW5lciBfZ2F0aGVyaW5nTGlzdGVuZXIgPSBuZXcgR2F0aGVyaW5nU2VhcmNoTGlzdGVuZXIoKTsKLS8vCi0vLyAgdm9pZCB0ZXN0X21hdGNoRm91bmQoKSB7Ci0vLyAgICBFbGVtZW50IGVsZW1lbnRBID0gbW9jayhFbGVtZW50KTsKLS8vICAgIEVsZW1lbnQgZWxlbWVudEIgPSBtb2NrKEVsZW1lbnQpOwotLy8gICAgd2hlbihlbGVtZW50QS5kaXNwbGF5TmFtZSkudGhlblJldHVybigiQSIpOwotLy8gICAgd2hlbihlbGVtZW50Qi5kaXNwbGF5TmFtZSkudGhlblJldHVybigiQiIpOwotLy8gICAgd2hlbihfbWF0Y2hBLmVsZW1lbnQpLnRoZW5SZXR1cm4oZWxlbWVudEEpOwotLy8gICAgd2hlbihfbWF0Y2hCLmVsZW1lbnQpLnRoZW5SZXR1cm4oZWxlbWVudEIpOwotLy8gICAgLy8gbWF0Y2hCCi0vLyAgICBfZ2F0aGVyaW5nTGlzdGVuZXIubWF0Y2hGb3VuZChfbWF0Y2hCKTsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RmFsc2UoX2dhdGhlcmluZ0xpc3RlbmVyLmlzQ29tcGxldGUpOwotLy8gICAgYXNzZXJ0VGhhdChfZ2F0aGVyaW5nTGlzdGVuZXIubWF0Y2hlcykuY29udGFpbnNFeGFjdGx5KF9tYXRjaEIpOwotLy8gICAgLy8gbWF0Y2hBCi0vLyAgICBfZ2F0aGVyaW5nTGlzdGVuZXIubWF0Y2hGb3VuZChfbWF0Y2hBKTsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RmFsc2UoX2dhdGhlcmluZ0xpc3RlbmVyLmlzQ29tcGxldGUpOwotLy8gICAgYXNzZXJ0VGhhdChfZ2F0aGVyaW5nTGlzdGVuZXIubWF0Y2hlcykuY29udGFpbnNFeGFjdGx5KF9tYXRjaEEsIF9tYXRjaEIpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaENvbXBsZXRlKCkgewotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRGYWxzZShfZ2F0aGVyaW5nTGlzdGVuZXIuaXNDb21wbGV0ZSk7Ci0vLyAgICAvLyBjb21wbGV0ZQotLy8gICAgX2dhdGhlcmluZ0xpc3RlbmVyLnNlYXJjaENvbXBsZXRlKCk7Ci0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFRydWUoX2dhdGhlcmluZ0xpc3RlbmVyLmlzQ29tcGxldGUpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnR2F0aGVyaW5nU2VhcmNoTGlzdGVuZXJUZXN0JywgKCkgewotLy8gICAgICBfdXQudGVzdCgndGVzdF9tYXRjaEZvdW5kJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBHYXRoZXJpbmdTZWFyY2hMaXN0ZW5lclRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9tYXRjaEZvdW5kKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaENvbXBsZXRlJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBHYXRoZXJpbmdTZWFyY2hMaXN0ZW5lclRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hDb21wbGV0ZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgfSk7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBMaWJyYXJ5U2VhcmNoU2NvcGVUZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIExpYnJhcnlFbGVtZW50IF9saWJyYXJ5QSA9IG1vY2soTGlicmFyeUVsZW1lbnQpOwotLy8KLS8vICBMaWJyYXJ5RWxlbWVudCBfbGlicmFyeUIgPSBtb2NrKExpYnJhcnlFbGVtZW50KTsKLS8vCi0vLyAgRWxlbWVudCBfZWxlbWVudCA9IG1vY2soRWxlbWVudCk7Ci0vLwotLy8gIHZvaWQgdGVzdF9hcnJheUNvbnN0cnVjdG9yX2luQV9mYWxzZSgpIHsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZ2V0QW5jZXN0b3IoKGVsZW1lbnQpID0+IGVsZW1lbnQgaXMgTGlicmFyeUVsZW1lbnQpKS50aGVuUmV0dXJuKF9saWJyYXJ5Qik7Ci0vLyAgICBMaWJyYXJ5U2VhcmNoU2NvcGUgc2NvcGUgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjIoW19saWJyYXJ5QV0pOwotLy8gICAgYXNzZXJ0VGhhdChzY29wZS5saWJyYXJpZXMpLmNvbnRhaW5zT25seShfbGlicmFyeUEpOwotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRGYWxzZShzY29wZS5lbmNsb3NlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2FycmF5Q29uc3RydWN0b3JfaW5BX3RydWUoKSB7Ci0vLyAgICB3aGVuKF9lbGVtZW50LmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihfbGlicmFyeUEpOwotLy8gICAgTGlicmFyeVNlYXJjaFNjb3BlIHNjb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtfbGlicmFyeUEsIF9saWJyYXJ5Ql0pOwotLy8gICAgYXNzZXJ0VGhhdChzY29wZS5saWJyYXJpZXMpLmNvbnRhaW5zT25seShfbGlicmFyeUEsIF9saWJyYXJ5Qik7Ci0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFRydWUoc2NvcGUuZW5jbG9zZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jb2xsZWN0aW9uQ29uc3RydWN0b3JfaW5CKCkgewotLy8gICAgd2hlbihfZWxlbWVudC5nZXRBbmNlc3RvcigoZWxlbWVudCkgPT4gZWxlbWVudCBpcyBMaWJyYXJ5RWxlbWVudCkpLnRoZW5SZXR1cm4oX2xpYnJhcnlCKTsKLS8vICAgIExpYnJhcnlTZWFyY2hTY29wZSBzY29wZSA9IG5ldyBMaWJyYXJ5U2VhcmNoU2NvcGUuY29uMShJbW11dGFibGVTZXQub2YoX2xpYnJhcnlBLCBfbGlicmFyeUIpKTsKLS8vICAgIGFzc2VydFRoYXQoc2NvcGUubGlicmFyaWVzKS5jb250YWluc09ubHkoX2xpYnJhcnlBLCBfbGlicmFyeUIpOwotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRUcnVlKHNjb3BlLmVuY2xvc2VzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgZGFydFN1aXRlKCkgewotLy8gICAgX3V0Lmdyb3VwKCdMaWJyYXJ5U2VhcmNoU2NvcGVUZXN0JywgKCkgewotLy8gICAgICBfdXQudGVzdCgndGVzdF9hcnJheUNvbnN0cnVjdG9yX2luQV9mYWxzZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2FycmF5Q29uc3RydWN0b3JfaW5BX2ZhbHNlKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2FycmF5Q29uc3RydWN0b3JfaW5BX3RydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZVRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9hcnJheUNvbnN0cnVjdG9yX2luQV90cnVlKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2NvbGxlY3Rpb25Db25zdHJ1Y3Rvcl9pbkInLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZVRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jb2xsZWN0aW9uQ29uc3RydWN0b3JfaW5CKTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIE5hbWVNYXRjaGluZ1NlYXJjaExpc3RlbmVyVGVzdCBleHRlbmRzIEVuZ2luZVRlc3RDYXNlIHsKLS8vICBTZWFyY2hMaXN0ZW5lciBfbGlzdGVuZXIgPSBtb2NrKFNlYXJjaExpc3RlbmVyKTsKLS8vCi0vLyAgRWxlbWVudCBfZWxlbWVudCA9IG1vY2soRWxlbWVudCk7Ci0vLwotLy8gIFNlYXJjaE1hdGNoIF9tYXRjaCA9IG1vY2soU2VhcmNoTWF0Y2gpOwotLy8KLS8vICBTZWFyY2hQYXR0ZXJuIF9wYXR0ZXJuID0gbW9jayhTZWFyY2hQYXR0ZXJuKTsKLS8vCi0vLyAgU2VhcmNoTGlzdGVuZXIgX25hbWVNYXRjaGluZ0xpc3RlbmVyID0gbmV3IE5hbWVNYXRjaGluZ1NlYXJjaExpc3RlbmVyKF9wYXR0ZXJuLCBfbGlzdGVuZXIpOwotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hGb3VuZF9wYXR0ZXJuRmFsc2UoKSB7Ci0vLyAgICB3aGVuKF9wYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKG51bGwpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfbmFtZU1hdGNoaW5nTGlzdGVuZXIubWF0Y2hGb3VuZChfbWF0Y2gpOwotLy8gICAgdmVyaWZ5Tm9Nb3JlSW50ZXJhY3Rpb25zKF9saXN0ZW5lcik7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbWF0Y2hGb3VuZF9wYXR0ZXJuVHJ1ZSgpIHsKLS8vICAgIHdoZW4oX3BhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIC8vIHZlcmlmeQotLy8gICAgX25hbWVNYXRjaGluZ0xpc3RlbmVyLm1hdGNoRm91bmQoX21hdGNoKTsKLS8vICAgIHZlcmlmeShfbGlzdGVuZXIpLm1hdGNoRm91bmQoX21hdGNoKTsKLS8vICAgIHZlcmlmeU5vTW9yZUludGVyYWN0aW9ucyhfbGlzdGVuZXIpOwotLy8gIH0KLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZXRVcCgpIHsKLS8vICAgIHN1cGVyLnNldFVwKCk7Ci0vLyAgICB3aGVuKF9tYXRjaC5lbGVtZW50KS50aGVuUmV0dXJuKF9lbGVtZW50KTsKLS8vICB9Ci0vLwotLy8gIHN0YXRpYyBkYXJ0U3VpdGUoKSB7Ci0vLyAgICBfdXQuZ3JvdXAoJ05hbWVNYXRjaGluZ1NlYXJjaExpc3RlbmVyVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbWF0Y2hGb3VuZF9wYXR0ZXJuRmFsc2UnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5hbWVNYXRjaGluZ1NlYXJjaExpc3RlbmVyVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21hdGNoRm91bmRfcGF0dGVybkZhbHNlKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X21hdGNoRm91bmRfcGF0dGVyblRydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5hbWVNYXRjaGluZ1NlYXJjaExpc3RlbmVyVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21hdGNoRm91bmRfcGF0dGVyblRydWUpOwotLy8gICAgICB9KTsKLS8vICAgIH0pOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgT3JTZWFyY2hQYXR0ZXJuVGVzdCBleHRlbmRzIEVuZ2luZVRlc3RDYXNlIHsKLS8vICBFbGVtZW50IF9lbGVtZW50ID0gbW9jayhFbGVtZW50KTsKLS8vCi0vLyAgU2VhcmNoUGF0dGVybiBfcGF0dGVybkEgPSBtb2NrKFNlYXJjaFBhdHRlcm4pOwotLy8KLS8vICBTZWFyY2hQYXR0ZXJuIF9wYXR0ZXJuQiA9IG1vY2soU2VhcmNoUGF0dGVybik7Ci0vLwotLy8gIFNlYXJjaFBhdHRlcm4gX3BhdHRlcm4gPSBuZXcgT3JTZWFyY2hQYXR0ZXJuKFtfcGF0dGVybkEsIF9wYXR0ZXJuQl0pOwotLy8KLS8vICB2b2lkIHRlc3RfYWxsRXhhY3QoKSB7Ci0vLyAgICB3aGVuKF9wYXR0ZXJuQS5tYXRjaGVzKF9lbGVtZW50KSkudGhlblJldHVybihNYXRjaFF1YWxpdHkuRVhBQ1QpOwotLy8gICAgd2hlbihfcGF0dGVybkIubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBfcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfRXhhY3ROYW1lKCkgewotLy8gICAgd2hlbihfcGF0dGVybkEubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIHdoZW4oX3BhdHRlcm5CLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKE1hdGNoUXVhbGl0eS5OQU1FKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBfcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfTmFtZUV4YWN0KCkgewotLy8gICAgd2hlbihfcGF0dGVybkEubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5Lk5BTUUpOwotLy8gICAgd2hlbihfcGF0dGVybkIubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4oTWF0Y2hRdWFsaXR5LkVYQUNUKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5Lk5BTUUsIF9wYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9OdWxsTnVsbCgpIHsKLS8vICAgIHdoZW4oX3BhdHRlcm5BLm1hdGNoZXMoX2VsZW1lbnQpKS50aGVuUmV0dXJuKG51bGwpOwotLy8gICAgd2hlbihfcGF0dGVybkIubWF0Y2hlcyhfZWxlbWVudCkpLnRoZW5SZXR1cm4obnVsbCk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIF9wYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHN0YXRpYyBkYXJ0U3VpdGUoKSB7Ci0vLyAgICBfdXQuZ3JvdXAoJ09yU2VhcmNoUGF0dGVyblRlc3QnLCAoKSB7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X0V4YWN0TmFtZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgT3JTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X0V4YWN0TmFtZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9OYW1lRXhhY3QnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE9yU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9OYW1lRXhhY3QpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfTnVsbE51bGwnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE9yU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9OdWxsTnVsbCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9hbGxFeGFjdCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgT3JTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2FsbEV4YWN0KTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFByZWZpeFNlYXJjaFBhdHRlcm5UZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIEVsZW1lbnQgX2VsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8KLS8vICB2b2lkIHRlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNYXRjaF9jYXNlTWF0Y2goKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUHJlZml4U2VhcmNoUGF0dGVybigiSGFzaE1hIiwgZmFsc2UpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hcCIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VJbnNlbnNpdGl2ZV9jb250ZW50TWF0Y2hfY2FzZU1pc21hdGNoKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFByZWZpeFNlYXJjaFBhdHRlcm4oIkhhU0hNYSIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oImhhc2hNYVAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlSW5zZW5zaXRpdmVfY29udGVudE1pc21hdGNoKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFByZWZpeFNlYXJjaFBhdHRlcm4oIkhhc2hNYSIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hUYWJsZSIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlU2Vuc2l0aXZlX2NvbnRlbnRNYXRjaCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuKCJIYXNoTWEiLCB0cnVlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlU2Vuc2l0aXZlX2NvbnRlbnRNaXNtYXRjaCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuKCJIYXNoTWEiLCB0cnVlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hUYWJsZSIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9udWxsRWxlbWVudCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuKCJIYXNoTWEiLCBmYWxzZSk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhudWxsKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbnVsbE5hbWUoKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUHJlZml4U2VhcmNoUGF0dGVybigiSGFzaE1hIiwgZmFsc2UpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybihudWxsKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICBzdGF0aWMgZGFydFN1aXRlKCkgewotLy8gICAgX3V0Lmdyb3VwKCdQcmVmaXhTZWFyY2hQYXR0ZXJuVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNYXRjaF9jYXNlTWF0Y2gnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFByZWZpeFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNYXRjaF9jYXNlTWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNYXRjaF9jYXNlTWlzbWF0Y2gnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFByZWZpeFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNYXRjaF9jYXNlTWlzbWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX2NvbnRlbnRNaXNtYXRjaCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgUHJlZml4U2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlSW5zZW5zaXRpdmVfY29udGVudE1pc21hdGNoKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2Nhc2VTZW5zaXRpdmVfY29udGVudE1hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2Nhc2VTZW5zaXRpdmVfY29udGVudE1hdGNoKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2Nhc2VTZW5zaXRpdmVfY29udGVudE1pc21hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2Nhc2VTZW5zaXRpdmVfY29udGVudE1pc21hdGNoKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X251bGxFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X251bGxFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X251bGxOYW1lJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBQcmVmaXhTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X251bGxOYW1lKTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVyblRlc3QgZXh0ZW5kcyBFbmdpbmVUZXN0Q2FzZSB7Ci0vLyAgRWxlbWVudCBfZWxlbWVudCA9IG1vY2soRWxlbWVudCk7Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlSW5zZW5zaXRpdmVfZmFsc2VfY29udGVudE1pc21hdGNoKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybigiSFthLXpdKk1hcCIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIk1hcHMiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWVfY2FzZU1pc21hdGNoKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybigiSFthLXpdKk1hUCIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlU2Vuc2l0aXZlX2ZhbHNlX2Nhc2VNaXNtYXRjaCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvblNlYXJjaFBhdHRlcm4oIkhbYS16XSpNYVAiLCB0cnVlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUobnVsbCwgcGF0dGVybi5tYXRjaGVzKF9lbGVtZW50KSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZV9jb250ZW50TWlzbWF0Y2goKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuKCJIW2Etel0qTWFwIiwgdHJ1ZSk7Ci0vLyAgICB3aGVuKF9lbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJNYXBzIik7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VTZW5zaXRpdmVfdHJ1ZSgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvblNlYXJjaFBhdHRlcm4oIkguKk1hcCIsIHRydWUpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hcCIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X251bGxFbGVtZW50KCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVybigiSC4qTWFwIiwgdHJ1ZSk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhudWxsKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbnVsbE5hbWUoKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuKCJILipNYXAiLCB0cnVlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4obnVsbCk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX2ZhbHNlX2NvbnRlbnRNaXNtYXRjaCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2Nhc2VJbnNlbnNpdGl2ZV9mYWxzZV9jb250ZW50TWlzbWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWVfY2FzZU1pc21hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvblNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWVfY2FzZU1pc21hdGNoKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2Nhc2VTZW5zaXRpdmVfZmFsc2VfY2FzZU1pc21hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBSZWd1bGFyRXhwcmVzc2lvblNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZV9jYXNlTWlzbWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZV9jb250ZW50TWlzbWF0Y2gnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlU2Vuc2l0aXZlX2ZhbHNlX2NvbnRlbnRNaXNtYXRjaCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbnVsbEVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFJlZ3VsYXJFeHByZXNzaW9uU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9udWxsRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9udWxsTmFtZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X251bGxOYW1lKTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaEVuZ2luZUltcGxUZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIHN0YXRpYyB2b2lkIF9hc3NlcnRNYXRjaGVzKExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMsIExpc3Q8U2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaD4gZXhwZWN0ZWRNYXRjaGVzKSB7Ci0vLyAgICBhc3NlcnRUaGF0KG1hdGNoZXMpLmhhc1NpemUoZXhwZWN0ZWRNYXRjaGVzLmxlbmd0aCk7Ci0vLyAgICBmb3IgKFNlYXJjaE1hdGNoIG1hdGNoIGluIG1hdGNoZXMpIHsKLS8vICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotLy8gICAgICBTdHJpbmcgbXNnID0gbWF0Y2gudG9TdHJpbmcoKTsKLS8vICAgICAgZm9yIChTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoIGV4cGVjdGVkTWF0Y2ggaW4gZXhwZWN0ZWRNYXRjaGVzKSB7Ci0vLyAgICAgICAgaWYgKG1hdGNoLmVsZW1lbnQgPT0gZXhwZWN0ZWRNYXRjaC5fZWxlbWVudCAmJiBtYXRjaC5raW5kID09IGV4cGVjdGVkTWF0Y2guX2tpbmQgJiYgbWF0Y2gucXVhbGl0eSA9PSBleHBlY3RlZE1hdGNoLl9xdWFsaXR5ICYmIG1hdGNoLnNvdXJjZVJhbmdlID09IGV4cGVjdGVkTWF0Y2guX3JhbmdlICYmIG1hdGNoLmlzUXVhbGlmaWVkID09IGV4cGVjdGVkTWF0Y2guX3F1YWxpZmllZCkgewotLy8gICAgICAgICAgZm91bmQgPSB0cnVlOwotLy8gICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0vLyAgICAgIGlmICghZm91bmQpIHsKLS8vICAgICAgICBKVW5pdFRlc3RDYXNlLmZhaWwoIk5vdCBmb3VuZDogJHttc2d9Iik7Ci0vLyAgICAgIH0KLS8vICAgIH0KLS8vICB9Ci0vLwotLy8gIEluZGV4U3RvcmUgX2luZGV4U3RvcmUgPSBJbmRleEZhY3RvcnkubmV3U3BsaXRJbmRleFN0b3JlKG5ldyBNZW1vcnlOb2RlTWFuYWdlcigpKTsKLS8vCi0vLyAgc3RhdGljIEFuYWx5c2lzQ29udGV4dCBfQ09OVEVYVCA9IG1vY2soQW5hbHlzaXNDb250ZXh0KTsKLS8vCi0vLyAgaW50IF9uZXh0TG9jYXRpb25JZCA9IDA7Ci0vLwotLy8gIFNlYXJjaFNjb3BlIF9zY29wZTsKLS8vCi0vLyAgU2VhcmNoUGF0dGVybiBfcGF0dGVybiA9IG51bGw7Ci0vLwotLy8gIFNlYXJjaEZpbHRlciBfZmlsdGVyID0gbnVsbDsKLS8vCi0vLyAgU291cmNlIF9zb3VyY2UgPSBtb2NrKFNvdXJjZSk7Ci0vLwotLy8gIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgX3VuaXRFbGVtZW50ID0gbW9jayhDb21waWxhdGlvblVuaXRFbGVtZW50KTsKLS8vCi0vLyAgTGlicmFyeUVsZW1lbnQgX2xpYnJhcnlFbGVtZW50ID0gbW9jayhMaWJyYXJ5RWxlbWVudCk7Ci0vLwotLy8gIEVsZW1lbnQgX2VsZW1lbnRBID0gX21vY2tFbGVtZW50KEVsZW1lbnQsIEVsZW1lbnRLaW5kLkNMQVNTKTsKLS8vCi0vLyAgRWxlbWVudCBfZWxlbWVudEIgPSBfbW9ja0VsZW1lbnQoRWxlbWVudCwgRWxlbWVudEtpbmQuQ0xBU1MpOwotLy8KLS8vICBFbGVtZW50IF9lbGVtZW50QyA9IF9tb2NrRWxlbWVudChFbGVtZW50LCBFbGVtZW50S2luZC5DTEFTUyk7Ci0vLwotLy8gIEVsZW1lbnQgX2VsZW1lbnREID0gX21vY2tFbGVtZW50KEVsZW1lbnQsIEVsZW1lbnRLaW5kLkNMQVNTKTsKLS8vCi0vLyAgRWxlbWVudCBfZWxlbWVudEUgPSBfbW9ja0VsZW1lbnQoRWxlbWVudCwgRWxlbWVudEtpbmQuQ0xBU1MpOwotLy8KLS8vICB2b2lkIGZhaWxfc2VhcmNoQXNzaWduZWRUeXBlc19hc3NpZ25tZW50cygpIHsKLS8vICAgIC8vIFRPRE8oc2NoZWdsb3YpIGRvZXMgbm90IHdvcmsgLSBuZXcgc3BsaXQgaW5kZXggc3RvcmUgY2Fubm90IHN0b3JlIHR5cGVzICh5ZXQ/KQotLy8gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgc2V0dGVyRWxlbWVudCA9IF9tb2NrRWxlbWVudChQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCwgRWxlbWVudEtpbmQuU0VUVEVSKTsKLS8vICAgIEZpZWxkRWxlbWVudCBmaWVsZEVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoRmllbGRFbGVtZW50LCBFbGVtZW50S2luZC5GSUVMRCk7Ci0vLyAgICB3aGVuKGZpZWxkRWxlbWVudC5zZXR0ZXIpLnRoZW5SZXR1cm4oc2V0dGVyRWxlbWVudCk7Ci0vLyAgICBEYXJ0VHlwZSB0eXBlQSA9IG1vY2soRGFydFR5cGUpOwotLy8gICAgRGFydFR5cGUgdHlwZUIgPSBtb2NrKERhcnRUeXBlKTsKLS8vICAgIERhcnRUeXBlIHR5cGVDID0gbW9jayhEYXJ0VHlwZSk7Ci0vLyAgICBfaW5kZXhTdG9yZS5hYm91dFRvSW5kZXhEYXJ0KF9DT05URVhULCBfdW5pdEVsZW1lbnQpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDEwKTsKLS8vICAgICAgbG9jYXRpb24gPSBuZXcgTG9jYXRpb25XaXRoRGF0YTxEYXJ0VHlwZT4uY29uMShsb2NhdGlvbiwgdHlwZUEpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoc2V0dGVyRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uV2l0aERhdGE8RGFydFR5cGU+LmNvbjEobG9jYXRpb24sIHR5cGVCKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHNldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIC8vIHdpbGwgYmUgZmlsdGVyZWQgYnkgc2NvcGUKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRDLCAzLCAzMCk7Ci0vLyAgICAgIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uV2l0aERhdGE8RGFydFR5cGU+LmNvbjEobG9jYXRpb24sIHR5cGVDKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHNldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICAvLyBub3QgTG9jYXRpb25XaXRoRGF0YQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEQsIDQsIDQwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHNldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICAgIC8vIGFzayB0eXBlcwotLy8gICAgU2V0PERhcnRUeXBlPiB0eXBlcyA9IF9ydW5TZWFyY2gobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF9mYWlsX3NlYXJjaEFzc2lnbmVkVHlwZXNfYXNzaWdubWVudHMoZmllbGRFbGVtZW50KSk7Ci0vLyAgICBhc3NlcnRUaGF0KHR5cGVzKS5jb250YWluc09ubHkodHlwZUEsIHR5cGVCKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgZmFpbF9zZWFyY2hBc3NpZ25lZFR5cGVzX2luaXRpYWxpemVycygpIHsKLS8vICAgIC8vIFRPRE8oc2NoZWdsb3YpIGRvZXMgbm90IHdvcmsgLSBuZXcgc3BsaXQgaW5kZXggc3RvcmUgY2Fubm90IHN0b3JlIHR5cGVzICh5ZXQ/KQotLy8gICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IF9tb2NrRWxlbWVudChGaWVsZEVsZW1lbnQsIEVsZW1lbnRLaW5kLkZJRUxEKTsKLS8vICAgIERhcnRUeXBlIHR5cGVBID0gbW9jayhEYXJ0VHlwZSk7Ci0vLyAgICBEYXJ0VHlwZSB0eXBlQiA9IG1vY2soRGFydFR5cGUpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEwLCAxKTsKLS8vICAgICAgbG9jYXRpb24gPSBuZXcgTG9jYXRpb25XaXRoRGF0YTxEYXJ0VHlwZT4uY29uMShsb2NhdGlvbiwgdHlwZUEpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoZmllbGRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMjAsIDEpOwotLy8gICAgICBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbldpdGhEYXRhPERhcnRUeXBlPi5jb24xKGxvY2F0aW9uLCB0eXBlQik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChmaWVsZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gYXNrIHR5cGVzCi0vLyAgICBTZXQ8RGFydFR5cGU+IHR5cGVzID0gX3J1blNlYXJjaChuZXcgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X2ZhaWxfc2VhcmNoQXNzaWduZWRUeXBlc19pbml0aWFsaXplcnMoZmllbGRFbGVtZW50KSk7Ci0vLyAgICBhc3NlcnRUaGF0KHR5cGVzKS5jb250YWluc09ubHkodHlwZUEsIHR5cGVCKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNfU3RyaW5nKCkgewotLy8gICAgRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IG5ldyBOYW1lRWxlbWVudEltcGwoInRlc3QiKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19ERUZJTkVEX0JZLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9ydW5TZWFyY2gobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF90ZXN0X3NlYXJjaERlY2xhcmF0aW9uc19TdHJpbmcodGhpcykpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5OQU1FX0RFQ0xBUkFUSU9OLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLk5BTUVfREVDTEFSQVRJT04sIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9ucygpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZUZ1bmN0aW9uc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc1N5bmMoKTsKLS8vICAgIC8vIHZlcmlmeQotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuRlVOQ1RJT05fREVDTEFSQVRJT04sIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuRlVOQ1RJT05fREVDTEFSQVRJT04sIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc19hc3luYygpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZUZ1bmN0aW9uc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc0FzeW5jKCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfaW5Vbml2ZXJzZSgpIHsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChJbmRleENvbnN0YW50cy5VTklWRVJTRSwgSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTiwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKEluZGV4Q29uc3RhbnRzLlVOSVZFUlNFLCBJbmRleENvbnN0YW50cy5ERUZJTkVTX0ZVTkNUSU9OLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICBfc2NvcGUgPSBTZWFyY2hTY29wZUZhY3RvcnkuY3JlYXRlVW5pdmVyc2VTY29wZSgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlRmlsdGVyKCkgewotLy8gICAgTGlicmFyeUVsZW1lbnQgbGlicmFyeSA9IF9tb2NrRWxlbWVudChMaWJyYXJ5RWxlbWVudCwgRWxlbWVudEtpbmQuTElCUkFSWSk7Ci0vLyAgICBfZGVmaW5lRnVuY3Rpb25zQUIobGlicmFyeSk7Ci0vLyAgICBfc2NvcGUgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjIoW2xpYnJhcnldKTsKLS8vICAgIC8vIHNlYXJjaCAiZWxlbWVudEEiCi0vLyAgICB7Ci0vLyAgICAgIF9maWx0ZXIgPSBuZXcgU2VhcmNoRmlsdGVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3Rlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlRmlsdGVyXzIodGhpcyk7Ci0vLyAgICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxLCAyKV0pOwotLy8gICAgfQotLy8gICAgLy8gc2VhcmNoICJlbGVtZW50QiIKLS8vICAgIHsKLS8vICAgICAgX2ZpbHRlciA9IG5ldyBTZWFyY2hGaWx0ZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc191c2VGaWx0ZXIodGhpcyk7Ci0vLyAgICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxMCwgMjApXSk7Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlUGF0dGVybigpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZUZ1bmN0aW9uc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggIkEiCi0vLyAgICB7Ci0vLyAgICAgIF9wYXR0ZXJuID0gU2VhcmNoUGF0dGVybkZhY3RvcnkuY3JlYXRlRXhhY3RQYXR0ZXJuKCJBIiwgdHJ1ZSk7Ci0vLyAgICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX0RFQ0xBUkFUSU9OLCAxLCAyKV0pOwotLy8gICAgfQotLy8gICAgLy8gc2VhcmNoICJCIgotLy8gICAgewotLy8gICAgICBfcGF0dGVybiA9IFNlYXJjaFBhdHRlcm5GYWN0b3J5LmNyZWF0ZUV4YWN0UGF0dGVybigiQiIsIHRydWUpOwotLy8gICAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zU3luYygpOwotLy8gICAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEIsIE1hdGNoS2luZC5GVU5DVElPTl9ERUNMQVJBVElPTiwgMTAsIDIwKV0pOwotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhckNvbXBvbmVudEVsZW1lbnQoKSB7Ci0vLyAgICBBbmd1bGFyQ29tcG9uZW50RWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChBbmd1bGFyQ29tcG9uZW50RWxlbWVudCwgRWxlbWVudEtpbmQuQU5HVUxBUl9DT01QT05FTlQpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQU5HVUxBUl9DTE9TSU5HX1RBR19SRUZFUkVOQ0UsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJDb250cm9sbGVyRWxlbWVudCgpIHsKLS8vICAgIEFuZ3VsYXJDb250cm9sbGVyRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChBbmd1bGFyQ29udHJvbGxlckVsZW1lbnQsIEVsZW1lbnRLaW5kLkFOR1VMQVJfQ09OVFJPTExFUik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLkFOR1VMQVJfUkVGRVJFTkNFLCBsb2NhdGlvbkEpOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkIgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAxMCwgMjApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLkFOR1VMQVJfUkVGRVJFTkNFLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5BTkdVTEFSX1JFRkVSRU5DRSwgMSwgMiksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEIsIE1hdGNoS2luZC5BTkdVTEFSX1JFRkVSRU5DRSwgMTAsIDIwKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhckZpbHRlckVsZW1lbnQoKSB7Ci0vLyAgICBBbmd1bGFyRm9ybWF0dGVyRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChBbmd1bGFyRm9ybWF0dGVyRWxlbWVudCwgRWxlbWVudEtpbmQuQU5HVUxBUl9GT1JNQVRURVIpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJQcm9wZXJ0eUVsZW1lbnQoKSB7Ci0vLyAgICBBbmd1bGFyUHJvcGVydHlFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KEFuZ3VsYXJQcm9wZXJ0eUVsZW1lbnQsIEVsZW1lbnRLaW5kLkFOR1VMQVJfUFJPUEVSVFkpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJTY29wZVByb3BlcnR5RWxlbWVudCgpIHsKLS8vICAgIEFuZ3VsYXJTY29wZVByb3BlcnR5RWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChBbmd1bGFyU2NvcGVQcm9wZXJ0eUVsZW1lbnQsIEVsZW1lbnRLaW5kLkFOR1VMQVJfU0NPUEVfUFJPUEVSVFkpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJTZWxlY3RvckVsZW1lbnQoKSB7Ci0vLyAgICBBbmd1bGFyU2VsZWN0b3JFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KEFuZ3VsYXJTZWxlY3RvckVsZW1lbnQsIEVsZW1lbnRLaW5kLkFOR1VMQVJfU0VMRUNUT1IpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5BTkdVTEFSX1JFRkVSRU5DRSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQU5HVUxBUl9SRUZFUkVOQ0UsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudCgpIHsKLS8vICAgIENsYXNzRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChDbGFzc0VsZW1lbnQsIEVsZW1lbnRLaW5kLkNMQVNTKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLlRZUEVfUkVGRVJFTkNFLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLlRZUEVfUkVGRVJFTkNFLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19DbGFzc0VsZW1lbnRfdXNlU2NvcGUoKSB7Ci0vLyAgICBMaWJyYXJ5RWxlbWVudCBsaWJyYXJ5QSA9IF9tb2NrRWxlbWVudChMaWJyYXJ5RWxlbWVudCwgRWxlbWVudEtpbmQuTElCUkFSWSk7Ci0vLyAgICBMaWJyYXJ5RWxlbWVudCBsaWJyYXJ5QiA9IF9tb2NrRWxlbWVudChMaWJyYXJ5RWxlbWVudCwgRWxlbWVudEtpbmQuTElCUkFSWSk7Ci0vLyAgICBDbGFzc0VsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoQ2xhc3NFbGVtZW50LCBFbGVtZW50S2luZC5DTEFTUyk7Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRBLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5QSk7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uQSk7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRCLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5Qik7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEIsIDEwLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMsIGluICJsaWJyYXJ5QSIKLS8vICAgIF9zY29wZSA9IFNlYXJjaFNjb3BlRmFjdG9yeS5jcmVhdGVMaWJyYXJ5U2NvcGUzKGxpYnJhcnlBKTsKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5UWVBFX1JFRkVSRU5DRSwgMSwgMildKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NvbXBpbGF0aW9uVW5pdEVsZW1lbnQoKSB7Ci0vLyAgICBDb21waWxhdGlvblVuaXRFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KENvbXBpbGF0aW9uVW5pdEVsZW1lbnQsIEVsZW1lbnRLaW5kLkNPTVBJTEFUSU9OX1VOSVQpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5VTklUX1JFRkVSRU5DRSwgMSwgMildKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NvbnN0cnVjdG9yRWxlbWVudCgpIHsKLS8vICAgIENvbnN0cnVjdG9yRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChDb25zdHJ1Y3RvckVsZW1lbnQsIEVsZW1lbnRLaW5kLkNPTlNUUlVDVE9SKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxMCwgMSk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfREVGSU5FRF9CWSwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEIsIDIwLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QywgMzAsIDMpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5DT05TVFJVQ1RPUl9ERUNMQVJBVElPTiwgMTAsIDEpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuQ09OU1RSVUNUT1JfUkVGRVJFTkNFLCAyMCwgMiksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEMsIE1hdGNoS2luZC5DT05TVFJVQ1RPUl9SRUZFUkVOQ0UsIDMwLCAzKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRWxlbWVudF91bmtub3duKCkgewotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCBudWxsKTsKLS8vICAgIGFzc2VydFRoYXQobWF0Y2hlcykuaXNFbXB0eSgpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRmllbGRFbGVtZW50KCkgewotLy8gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZ2V0dGVyRWxlbWVudCA9IF9tb2NrRWxlbWVudChQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCwgRWxlbWVudEtpbmQuR0VUVEVSKTsKLS8vICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IHNldHRlckVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsIEVsZW1lbnRLaW5kLlNFVFRFUik7Ci0vLyAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX21vY2tFbGVtZW50KEZpZWxkRWxlbWVudCwgRWxlbWVudEtpbmQuRklFTEQpOwotLy8gICAgd2hlbihmaWVsZEVsZW1lbnQuZ2V0dGVyKS50aGVuUmV0dXJuKGdldHRlckVsZW1lbnQpOwotLy8gICAgd2hlbihmaWVsZEVsZW1lbnQuc2V0dGVyKS50aGVuUmV0dXJuKHNldHRlckVsZW1lbnQpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDEwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGdldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChnZXR0ZXJFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEMsIDMsIDMwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHNldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRELCA0LCA0MCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChzZXR0ZXJFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCBmaWVsZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5GSUVMRF9SRUFELCAxLCAxMCwgZmFsc2UpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjIoX2VsZW1lbnRCLCBNYXRjaEtpbmQuRklFTERfUkVBRCwgMiwgMjAsIHRydWUpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjIoX2VsZW1lbnRDLCBNYXRjaEtpbmQuRklFTERfV1JJVEUsIDMsIDMwLCBmYWxzZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEQsIE1hdGNoS2luZC5GSUVMRF9XUklURSwgNCwgNDAsIHRydWUpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19GaWVsZEVsZW1lbnRfaW52b2NhdGlvbigpIHsKLS8vICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGdldHRlckVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsIEVsZW1lbnRLaW5kLkdFVFRFUik7Ci0vLyAgICBGaWVsZEVsZW1lbnQgZmllbGRFbGVtZW50ID0gX21vY2tFbGVtZW50KEZpZWxkRWxlbWVudCwgRWxlbWVudEtpbmQuRklFTEQpOwotLy8gICAgd2hlbihmaWVsZEVsZW1lbnQuZ2V0dGVyKS50aGVuUmV0dXJuKGdldHRlckVsZW1lbnQpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDEwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGdldHRlckVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMiwgMjApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoZ2V0dGVyRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9VTlFVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCBmaWVsZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5GSUVMRF9JTlZPQ0FUSU9OLCAxLCAxMCwgdHJ1ZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEIsIE1hdGNoS2luZC5GSUVMRF9JTlZPQ0FUSU9OLCAyLCAyMCwgZmFsc2UpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19GaWVsZEVsZW1lbnQyKCkgewotLy8gICAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudCA9IF9tb2NrRWxlbWVudChGaWVsZEVsZW1lbnQsIEVsZW1lbnRLaW5kLkZJRUxEKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAxMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChmaWVsZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChmaWVsZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFJlZmVyZW5jZXNTeW5jKEVsZW1lbnQsIGZpZWxkRWxlbWVudCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZJRUxEX1JFRkVSRU5DRSwgMSwgMTAsIGZhbHNlKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKF9lbGVtZW50QiwgTWF0Y2hLaW5kLkZJRUxEX1JFRkVSRU5DRSwgMiwgMjAsIHRydWUpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19GdW5jdGlvbkVsZW1lbnQoKSB7Ci0vLyAgICBGdW5jdGlvbkVsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoRnVuY3Rpb25FbGVtZW50LCBFbGVtZW50S2luZC5GVU5DVElPTik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMTApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX0VYRUNVVElPTiwgMSwgMTApLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuRlVOQ1RJT05fUkVGRVJFTkNFLCAyLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ltcG9ydEVsZW1lbnQoKSB7Ci0vLyAgICBJbXBvcnRFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KEltcG9ydEVsZW1lbnQsIEVsZW1lbnRLaW5kLklNUE9SVCk7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uQSk7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEIsIDEwLCAwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLklNUE9SVF9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuSU1QT1JUX1JFRkVSRU5DRSwgMTAsIDApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19MaWJyYXJ5RWxlbWVudCgpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KExpYnJhcnlFbGVtZW50LCBFbGVtZW50S2luZC5MSUJSQVJZKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFJlZmVyZW5jZXNTeW5jKEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KTsKLS8vICAgIC8vIHZlcmlmeQotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgW25ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuTElCUkFSWV9SRUZFUkVOQ0UsIDEsIDIpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19NZXRob2RFbGVtZW50KCkgewotLy8gICAgTWV0aG9kRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChNZXRob2RFbGVtZW50LCBFbGVtZW50S2luZC5NRVRIT0QpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDEwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZX1VOUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMiwgMjApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QywgMywgMzApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRELCA0LCA0MCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5NRVRIT0RfSU5WT0NBVElPTiwgMSwgMTAsIGZhbHNlKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKF9lbGVtZW50QiwgTWF0Y2hLaW5kLk1FVEhPRF9JTlZPQ0FUSU9OLCAyLCAyMCwgdHJ1ZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEMsIE1hdGNoS2luZC5NRVRIT0RfUkVGRVJFTkNFLCAzLCAzMCwgZmFsc2UpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjIoX2VsZW1lbnRELCBNYXRjaEtpbmQuTUVUSE9EX1JFRkVSRU5DRSwgNCwgNDAsIHRydWUpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19NZXRob2RNZW1iZXIoKSB7Ci0vLyAgICBNZXRob2RFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KE1ldGhvZEVsZW1lbnQsIEVsZW1lbnRLaW5kLk1FVEhPRCk7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMTApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfSU5WT0tFRF9CWV9RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRDLCAzLCAzMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEQsIDQsIDQwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTWV0aG9kTWVtYmVyIHJlZmVyZW5jZWRNZW1iZXIgPSBuZXcgTWV0aG9kTWVtYmVyKHJlZmVyZW5jZWRFbGVtZW50LCBudWxsKTsKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZE1lbWJlcik7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKF9lbGVtZW50QSwgTWF0Y2hLaW5kLk1FVEhPRF9JTlZPQ0FUSU9OLCAxLCAxMCwgZmFsc2UpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjIoX2VsZW1lbnRCLCBNYXRjaEtpbmQuTUVUSE9EX0lOVk9DQVRJT04sIDIsIDIwLCB0cnVlKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKF9lbGVtZW50QywgTWF0Y2hLaW5kLk1FVEhPRF9SRUZFUkVOQ0UsIDMsIDMwLCBmYWxzZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEQsIE1hdGNoS2luZC5NRVRIT0RfUkVGRVJFTkNFLCA0LCA0MCwgdHJ1ZSldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX25vdFN1cHBvcnRlZCgpIHsKLS8vICAgIEVsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoRWxlbWVudCwgRWxlbWVudEtpbmQuVU5JVkVSU0UpOwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICBhc3NlcnRUaGF0KG1hdGNoZXMpLmlzRW1wdHkoKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX1BhcmFtZXRlckVsZW1lbnQoKSB7Ci0vLyAgICBQYXJhbWV0ZXJFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KFBhcmFtZXRlckVsZW1lbnQsIEVsZW1lbnRLaW5kLlBBUkFNRVRFUik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMTApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFQURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfV1JJVFRFTl9CWSwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEMsIDMsIDMwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUFEX1dSSVRURU5fQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRELCA0LCA0MCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEQsIDUsIDUwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTlZPS0VEX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFJlZmVyZW5jZXNTeW5jKEVsZW1lbnQsIHJlZmVyZW5jZWRFbGVtZW50KTsKLS8vICAgIC8vIHZlcmlmeQotLy8gICAgLy8gVE9ETyhzY2hlZ2xvdikgd2h5IG5vIE1hdGNoS2luZC5GSUVMRF9SRUFEX1dSSVRFID8KLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLlZBUklBQkxFX1JFQUQsIDEsIDEwKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLlZBUklBQkxFX1dSSVRFLCAyLCAyMCksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEMsIE1hdGNoS2luZC5WQVJJQUJMRV9SRUFEX1dSSVRFLCAzLCAzMCksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEQsIE1hdGNoS2luZC5OQU1FRF9QQVJBTUVURVJfUkVGRVJFTkNFLCA0LCA0MCksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEQsIE1hdGNoS2luZC5GVU5DVElPTl9FWEVDVVRJT04sIDUsIDUwKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfUHJvcGVydHlBY2Nlc3NvckVsZW1lbnRfZ2V0dGVyKCkgewotLy8gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgYWNjZXNzb3IgPSBfbW9ja0VsZW1lbnQoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsIEVsZW1lbnRLaW5kLkdFVFRFUik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMTApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoYWNjZXNzb3IsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChhY2Nlc3NvciwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgYWNjZXNzb3IpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIDEsIDEwLCBmYWxzZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEIsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIDIsIDIwLCB0cnVlKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfUHJvcGVydHlBY2Nlc3NvckVsZW1lbnRfc2V0dGVyKCkgewotLy8gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgYWNjZXNzb3IgPSBfbW9ja0VsZW1lbnQoUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQsIEVsZW1lbnRLaW5kLlNFVFRFUik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMTApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoYWNjZXNzb3IsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQllfVU5RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChhY2Nlc3NvciwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9RVUFMSUZJRUQsIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgYWNjZXNzb3IpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIDEsIDEwLCBmYWxzZSksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEIsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsIDIsIDIwLCB0cnVlKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQoKSB7Ci0vLyAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCBnZXR0ZXJFbGVtZW50ID0gX21vY2tFbGVtZW50KFByb3BlcnR5QWNjZXNzb3JFbGVtZW50LCBFbGVtZW50S2luZC5HRVRURVIpOwotLy8gICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgc2V0dGVyRWxlbWVudCA9IF9tb2NrRWxlbWVudChQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCwgRWxlbWVudEtpbmQuU0VUVEVSKTsKLS8vICAgIFRvcExldmVsVmFyaWFibGVFbGVtZW50IHRvcFZhcmlhYmxlRWxlbWVudCA9IF9tb2NrRWxlbWVudChUb3BMZXZlbFZhcmlhYmxlRWxlbWVudCwgRWxlbWVudEtpbmQuVE9QX0xFVkVMX1ZBUklBQkxFKTsKLS8vICAgIHdoZW4odG9wVmFyaWFibGVFbGVtZW50LmdldHRlcikudGhlblJldHVybihnZXR0ZXJFbGVtZW50KTsKLS8vICAgIHdoZW4odG9wVmFyaWFibGVFbGVtZW50LnNldHRlcikudGhlblJldHVybihzZXR0ZXJFbGVtZW50KTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAxMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChnZXR0ZXJFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1VOUVVBTElGSUVELCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QywgMiwgMjApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAoc2V0dGVyRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWV9VTlFVQUxJRklFRCwgbG9jYXRpb24pOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCB0b3BWYXJpYWJsZUVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMihfZWxlbWVudEEsIE1hdGNoS2luZC5GSUVMRF9SRUFELCAxLCAxMCwgZmFsc2UpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjIoX2VsZW1lbnRDLCBNYXRjaEtpbmQuRklFTERfV1JJVEUsIDIsIDIwLCBmYWxzZSldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX1R5cGVBbGlhc0VsZW1lbnQoKSB7Ci0vLyAgICBGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBfbW9ja0VsZW1lbnQoRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50LCBFbGVtZW50S2luZC5GVU5DVElPTl9UWVBFX0FMSUFTKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZLCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYyhFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfUkVGRVJFTkNFLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfUkVGRVJFTkNFLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19UeXBlUGFyYW1ldGVyRWxlbWVudCgpIHsKLS8vICAgIFR5cGVQYXJhbWV0ZXJFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gX21vY2tFbGVtZW50KFR5cGVQYXJhbWV0ZXJFbGVtZW50LCBFbGVtZW50S2luZC5UWVBFX1BBUkFNRVRFUik7Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1JFRkVSRU5DRURfQlksIGxvY2F0aW9uQSk7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEIsIDEwLCAyMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVGRVJFTkNFRF9CWSwgbG9jYXRpb25CKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0UsIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19WYXJpYWJsZUVsZW1lbnQoKSB7Ci0vLyAgICBMb2NhbFZhcmlhYmxlRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChMb2NhbFZhcmlhYmxlRWxlbWVudCwgRWxlbWVudEtpbmQuTE9DQUxfVkFSSUFCTEUpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDEwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUFEX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMiwgMjApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX1dSSVRURU5fQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRDLCAzLCAzMCk7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfUkVBRF9XUklUVEVOX0JZLCBsb2NhdGlvbik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbmV3IExvY2F0aW9uKF9lbGVtZW50RCwgNCwgNDApOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0lOVk9LRURfQlksIGxvY2F0aW9uKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoRWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5WQVJJQUJMRV9SRUFELCAxLCAxMCksCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEIsIE1hdGNoS2luZC5WQVJJQUJMRV9XUklURSwgMiwgMjApLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRDLCBNYXRjaEtpbmQuVkFSSUFCTEVfUkVBRF9XUklURSwgMywgMzApLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRELCBNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCA0LCA0MCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hTdWJ0eXBlcygpIHsKLS8vICAgIENsYXNzRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudCA9IF9tb2NrRWxlbWVudChDbGFzc0VsZW1lbnQsIEVsZW1lbnRLaW5kLkNMQVNTKTsKLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMTAsIDEpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAocmVmZXJlbmNlZEVsZW1lbnQsIEluZGV4Q29uc3RhbnRzLklTX0VYVEVOREVEX0JZLCBsb2NhdGlvbkEpOwotLy8gICAgfQotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkIgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRCLCAyMCwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChyZWZlcmVuY2VkRWxlbWVudCwgSW5kZXhDb25zdGFudHMuSVNfTUlYRURfSU5fQlksIGxvY2F0aW9uQik7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQyA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEMsIDMwLCAzKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19JTVBMRU1FTlRFRF9CWSwgbG9jYXRpb25DKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgLy8gc2VhcmNoIG1hdGNoZXMKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfcnVuU2VhcmNoKG5ldyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hTdWJ0eXBlcyh0aGlzLCByZWZlcmVuY2VkRWxlbWVudCkpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbCi0vLyAgICAgICAgbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5FWFRFTkRTX1JFRkVSRU5DRSwgMTAsIDEpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuV0lUSF9SRUZFUkVOQ0UsIDIwLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QywgTWF0Y2hLaW5kLklNUExFTUVOVFNfUkVGRVJFTkNFLCAzMCwgMyldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zX2FzeW5jKCkgewotLy8gICAgTGlicmFyeUVsZW1lbnQgbGlicmFyeSA9IF9tb2NrRWxlbWVudChMaWJyYXJ5RWxlbWVudCwgRWxlbWVudEtpbmQuTElCUkFSWSk7Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRBLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5KTsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChsaWJyYXJ5LCBJbmRleENvbnN0YW50cy5ERUZJTkVTX0NMQVNTLCBsb2NhdGlvbkEpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICBfc2NvcGUgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjIoW2xpYnJhcnldKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNBc3luYygpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5DTEFTU19ERUNMQVJBVElPTiwgMSwgMildKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zX2NsYXNzKCkgewotLy8gICAgTGlicmFyeUVsZW1lbnQgbGlicmFyeSA9IF9tb2NrRWxlbWVudChMaWJyYXJ5RWxlbWVudCwgRWxlbWVudEtpbmQuTElCUkFSWSk7Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRBLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5KTsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25BID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QSwgMSwgMik7Ci0vLyAgICAgIF9pbmRleFN0b3JlLnJlY29yZFJlbGF0aW9uc2hpcChsaWJyYXJ5LCBJbmRleENvbnN0YW50cy5ERUZJTkVTX0NMQVNTLCBsb2NhdGlvbkEpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICBfc2NvcGUgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjIoW2xpYnJhcnldKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkNMQVNTX0RFQ0xBUkFUSU9OLCAxLCAyKV0pOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNfY2xhc3NBbGlhcygpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgewotLy8gICAgICB3aGVuKF9lbGVtZW50QS5nZXRBbmNlc3RvcigoZWxlbWVudCkgPT4gZWxlbWVudCBpcyBMaWJyYXJ5RWxlbWVudCkpLnRoZW5SZXR1cm4obGlicmFyeSk7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAobGlicmFyeSwgSW5kZXhDb25zdGFudHMuREVGSU5FU19DTEFTU19BTElBUywgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIF9pbmRleFN0b3JlLmRvbmVJbmRleCgpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zU3luYygpOwotLy8gICAgLy8gdmVyaWZ5Ci0vLyAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEEsIE1hdGNoS2luZC5DTEFTU19BTElBU19ERUNMQVJBVElPTiwgMSwgMildKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zX2Z1bmN0aW9uVHlwZSgpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgewotLy8gICAgICB3aGVuKF9lbGVtZW50QS5nZXRBbmNlc3RvcigoZWxlbWVudCkgPT4gZWxlbWVudCBpcyBMaWJyYXJ5RWxlbWVudCkpLnRoZW5SZXR1cm4obGlicmFyeSk7Ci0vLyAgICAgIExvY2F0aW9uIGxvY2F0aW9uQSA9IG5ldyBMb2NhdGlvbihfZWxlbWVudEEsIDEsIDIpOwotLy8gICAgICBfaW5kZXhTdG9yZS5yZWNvcmRSZWxhdGlvbnNoaXAobGlicmFyeSwgSW5kZXhDb25zdGFudHMuREVGSU5FU19GVU5DVElPTl9UWVBFLCBsb2NhdGlvbkEpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICBfc2NvcGUgPSBuZXcgTGlicmFyeVNlYXJjaFNjb3BlLmNvbjIoW2xpYnJhcnldKTsKLS8vICAgIC8vIHNlYXJjaCBtYXRjaGVzCi0vLyAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfREVDTEFSQVRJT04sIDEsIDIpXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoVW5yZXNvbHZlZFF1YWxpZmllZFJlZmVyZW5jZXMoKSB7Ci0vLyAgICBFbGVtZW50IHJlZmVyZW5jZWRFbGVtZW50ID0gbmV3IE5hbWVFbGVtZW50SW1wbCgidGVzdCIpOwotLy8gICAgewotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9SRVNPTFZFRCwgbG9jYXRpb25BKTsKLS8vICAgIH0KLS8vICAgIHsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKHJlZmVyZW5jZWRFbGVtZW50LCBJbmRleENvbnN0YW50cy5JU19SRUZFUkVOQ0VEX0JZX1FVQUxJRklFRF9VTlJFU09MVkVELCBsb2NhdGlvbkIpOwotLy8gICAgfQotLy8gICAgX2luZGV4U3RvcmUuZG9uZUluZGV4KCk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hSZWZlcmVuY2VzU3luYzIoInNlYXJjaFF1YWxpZmllZE1lbWJlclJlZmVyZW5jZXMiLCBTdHJpbmcsICJ0ZXN0Iik7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLk5BTUVfUkVGRVJFTkNFX1JFU09MVkVELCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLk5BTUVfUkVGRVJFTkNFX1VOUkVTT0xWRUQsIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9ucygpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZVZhcmlhYmxlc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9uc1N5bmMoKTsKLS8vICAgIC8vIHZlcmlmeQotLy8gICAgX2Fzc2VydE1hdGNoZXMobWF0Y2hlcywgWwotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRBLCBNYXRjaEtpbmQuVkFSSUFCTEVfREVDTEFSQVRJT04sIDEsIDIpLAotLy8gICAgICAgIG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjEoX2VsZW1lbnRCLCBNYXRjaEtpbmQuVkFSSUFCTEVfREVDTEFSQVRJT04sIDEwLCAyMCldKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9zZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9uc19hc3luYygpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZVZhcmlhYmxlc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggbWF0Y2hlcwotLy8gICAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcyA9IF9zZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9uc0FzeW5jKCk7Ci0vLyAgICAvLyB2ZXJpZnkKLS8vICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFsKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLlZBUklBQkxFX0RFQ0xBUkFUSU9OLCAxLCAyKSwKLS8vICAgICAgICBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QiwgTWF0Y2hLaW5kLlZBUklBQkxFX0RFQ0xBUkFUSU9OLCAxMCwgMjApXSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3Rfc2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnNfdXNlUGF0dGVybigpIHsKLS8vICAgIExpYnJhcnlFbGVtZW50IGxpYnJhcnkgPSBfbW9ja0VsZW1lbnQoTGlicmFyeUVsZW1lbnQsIEVsZW1lbnRLaW5kLkxJQlJBUlkpOwotLy8gICAgX2RlZmluZVZhcmlhYmxlc0FCKGxpYnJhcnkpOwotLy8gICAgX3Njb3BlID0gbmV3IExpYnJhcnlTZWFyY2hTY29wZS5jb24yKFtsaWJyYXJ5XSk7Ci0vLyAgICAvLyBzZWFyY2ggIkEiCi0vLyAgICB7Ci0vLyAgICAgIF9wYXR0ZXJuID0gU2VhcmNoUGF0dGVybkZhY3RvcnkuY3JlYXRlRXhhY3RQYXR0ZXJuKCJBIiwgdHJ1ZSk7Ci0vLyAgICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBfc2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnNTeW5jKCk7Ci0vLyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIFtuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24xKF9lbGVtZW50QSwgTWF0Y2hLaW5kLlZBUklBQkxFX0RFQ0xBUkFUSU9OLCAxLCAyKV0pOwotLy8gICAgfQotLy8gICAgLy8gc2VhcmNoICJCIgotLy8gICAgewotLy8gICAgICBfcGF0dGVybiA9IFNlYXJjaFBhdHRlcm5GYWN0b3J5LmNyZWF0ZUV4YWN0UGF0dGVybigiQiIsIHRydWUpOwotLy8gICAgICBMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzID0gX3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zU3luYygpOwotLy8gICAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBbbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShfZWxlbWVudEIsIE1hdGNoS2luZC5WQVJJQUJMRV9ERUNMQVJBVElPTiwgMTAsIDIwKV0pOwotLy8gICAgfQotLy8gIH0KLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZXRVcCgpIHsKLS8vICAgIHN1cGVyLnNldFVwKCk7Ci0vLyAgICAvLyBsaWJyYXJ5Ci0vLyAgICB3aGVuKF91bml0RWxlbWVudC5saWJyYXJ5KS50aGVuUmV0dXJuKF9saWJyYXJ5RWxlbWVudCk7Ci0vLyAgICB3aGVuKF9saWJyYXJ5RWxlbWVudC5kZWZpbmluZ0NvbXBpbGF0aW9uVW5pdCkudGhlblJldHVybihfdW5pdEVsZW1lbnQpOwotLy8gICAgd2hlbihfdW5pdEVsZW1lbnQuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfbGlicmFyeUVsZW1lbnQuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfbGlicmFyeUVsZW1lbnQucGFydHMpLnRoZW5SZXR1cm4obmV3IExpc3Q8Q29tcGlsYXRpb25Vbml0RWxlbWVudD4oMCkpOwotLy8gICAgLy8gZWxlbWVudHMKLS8vICAgIHdoZW4oX2VsZW1lbnRBLnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4oIkEiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRCLnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4oIkIiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRDLnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4oIkMiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRELnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4oIkQiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRFLnRvU3RyaW5nKCkpLnRoZW5SZXR1cm4oIkUiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRBLmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJBIik7Ci0vLyAgICB3aGVuKF9lbGVtZW50Qi5kaXNwbGF5TmFtZSkudGhlblJldHVybigiQiIpOwotLy8gICAgd2hlbihfZWxlbWVudEMuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkMiKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRELmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJEIik7Ci0vLyAgICB3aGVuKF9lbGVtZW50RS5kaXNwbGF5TmFtZSkudGhlblJldHVybigiRSIpOwotLy8gICAgd2hlbihfZWxlbWVudEEuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfZWxlbWVudEIuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfZWxlbWVudEMuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfZWxlbWVudEQuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfZWxlbWVudEUuc291cmNlKS50aGVuUmV0dXJuKF9zb3VyY2UpOwotLy8gICAgd2hlbihfZWxlbWVudEEuY29udGV4dCkudGhlblJldHVybihfQ09OVEVYVCk7Ci0vLyAgICB3aGVuKF9lbGVtZW50Qi5jb250ZXh0KS50aGVuUmV0dXJuKF9DT05URVhUKTsKLS8vICAgIHdoZW4oX2VsZW1lbnRDLmNvbnRleHQpLnRoZW5SZXR1cm4oX0NPTlRFWFQpOwotLy8gICAgd2hlbihfZWxlbWVudEQuY29udGV4dCkudGhlblJldHVybihfQ09OVEVYVCk7Ci0vLyAgICB3aGVuKF9lbGVtZW50RS5jb250ZXh0KS50aGVuUmV0dXJuKF9DT05URVhUKTsKLS8vICAgIHdoZW4oX0NPTlRFWFQuZ2V0RWxlbWVudChfZWxlbWVudEEubG9jYXRpb24pKS50aGVuUmV0dXJuKF9lbGVtZW50QSk7Ci0vLyAgICB3aGVuKF9DT05URVhULmdldEVsZW1lbnQoX2VsZW1lbnRCLmxvY2F0aW9uKSkudGhlblJldHVybihfZWxlbWVudEIpOwotLy8gICAgd2hlbihfQ09OVEVYVC5nZXRFbGVtZW50KF9lbGVtZW50Qy5sb2NhdGlvbikpLnRoZW5SZXR1cm4oX2VsZW1lbnRDKTsKLS8vICAgIHdoZW4oX0NPTlRFWFQuZ2V0RWxlbWVudChfZWxlbWVudEQubG9jYXRpb24pKS50aGVuUmV0dXJuKF9lbGVtZW50RCk7Ci0vLyAgICB3aGVuKF9DT05URVhULmdldEVsZW1lbnQoX2VsZW1lbnRFLmxvY2F0aW9uKSkudGhlblJldHVybihfZWxlbWVudEUpOwotLy8gICAgLy8gc3RhcnQgaW5kZXhpbmcKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0VHJ1ZShfaW5kZXhTdG9yZS5hYm91dFRvSW5kZXhEYXJ0KF9DT05URVhULCBfdW5pdEVsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgX2RlZmluZUZ1bmN0aW9uc0FCKExpYnJhcnlFbGVtZW50IGxpYnJhcnkpIHsKLS8vICAgIHsKLS8vICAgICAgd2hlbihfZWxlbWVudEEuZ2V0QW5jZXN0b3IoKGVsZW1lbnQpID0+IGVsZW1lbnQgaXMgTGlicmFyeUVsZW1lbnQpKS50aGVuUmV0dXJuKGxpYnJhcnkpOwotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGxpYnJhcnksIEluZGV4Q29uc3RhbnRzLkRFRklORVNfRlVOQ1RJT04sIGxvY2F0aW9uQSk7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRCLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5KTsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGxpYnJhcnksIEluZGV4Q29uc3RhbnRzLkRFRklORVNfRlVOQ1RJT04sIGxvY2F0aW9uQik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgX2RlZmluZVZhcmlhYmxlc0FCKExpYnJhcnlFbGVtZW50IGxpYnJhcnkpIHsKLS8vICAgIHsKLS8vICAgICAgd2hlbihfZWxlbWVudEEuZ2V0QW5jZXN0b3IoKGVsZW1lbnQpID0+IGVsZW1lbnQgaXMgTGlicmFyeUVsZW1lbnQpKS50aGVuUmV0dXJuKGxpYnJhcnkpOwotLy8gICAgICBMb2NhdGlvbiBsb2NhdGlvbkEgPSBuZXcgTG9jYXRpb24oX2VsZW1lbnRBLCAxLCAyKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGxpYnJhcnksIEluZGV4Q29uc3RhbnRzLkRFRklORVNfVkFSSUFCTEUsIGxvY2F0aW9uQSk7Ci0vLyAgICB9Ci0vLyAgICB7Ci0vLyAgICAgIHdoZW4oX2VsZW1lbnRCLmdldEFuY2VzdG9yKChlbGVtZW50KSA9PiBlbGVtZW50IGlzIExpYnJhcnlFbGVtZW50KSkudGhlblJldHVybihsaWJyYXJ5KTsKLS8vICAgICAgTG9jYXRpb24gbG9jYXRpb25CID0gbmV3IExvY2F0aW9uKF9lbGVtZW50QiwgMTAsIDIwKTsKLS8vICAgICAgX2luZGV4U3RvcmUucmVjb3JkUmVsYXRpb25zaGlwKGxpYnJhcnksIEluZGV4Q29uc3RhbnRzLkRFRklORVNfVkFSSUFCTEUsIGxvY2F0aW9uQik7Ci0vLyAgICB9Ci0vLyAgICBfaW5kZXhTdG9yZS5kb25lSW5kZXgoKTsKLS8vICB9Ci0vLwotLy8gIEVsZW1lbnQgX21vY2tFbGVtZW50KFR5cGUgY2xhenosIEVsZW1lbnRLaW5kIGtpbmQpIHsKLS8vICAgIEVsZW1lbnQgZWxlbWVudCA9IG1vY2soY2xhenopOwotLy8gICAgd2hlbihlbGVtZW50LmNvbnRleHQpLnRoZW5SZXR1cm4oX0NPTlRFWFQpOwotLy8gICAgd2hlbihlbGVtZW50LnNvdXJjZSkudGhlblJldHVybihfc291cmNlKTsKLS8vICAgIHdoZW4oZWxlbWVudC5raW5kKS50aGVuUmV0dXJuKGtpbmQpOwotLy8gICAgRWxlbWVudExvY2F0aW9uIGVsZW1lbnRMb2NhdGlvbiA9IG5ldyBFbGVtZW50TG9jYXRpb25JbXBsLmNvbjIoIm1vY2tMb2NhdGlvbiR7X25leHRMb2NhdGlvbklkKyt9Iik7Ci0vLyAgICB3aGVuKGVsZW1lbnQubG9jYXRpb24pLnRoZW5SZXR1cm4oZWxlbWVudExvY2F0aW9uKTsKLS8vICAgIHdoZW4oX0NPTlRFWFQuZ2V0RWxlbWVudChlbGVtZW50LmxvY2F0aW9uKSkudGhlblJldHVybihlbGVtZW50KTsKLS8vICAgIHJldHVybiBlbGVtZW50OwotLy8gIH0KLS8vCi0vLyAgT2JqZWN0IF9ydW5TZWFyY2goU2VhcmNoRW5naW5lSW1wbFRlc3RfU2VhcmNoUnVubmVyIHJ1bm5lcikgewotLy8gICAgT3BlcmF0aW9uUXVldWUgcXVldWUgPSBuZXcgT3BlcmF0aW9uUXVldWUoKTsKLS8vICAgIE9wZXJhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgT3BlcmF0aW9uUHJvY2Vzc29yKHF1ZXVlKTsKLS8vICAgIEluZGV4IGluZGV4ID0gbmV3IEluZGV4SW1wbChfaW5kZXhTdG9yZSwgcXVldWUsIHByb2Nlc3Nvcik7Ci0vLyAgICBTZWFyY2hFbmdpbmUgZW5naW5lID0gU2VhcmNoRW5naW5lRmFjdG9yeS5jcmVhdGVTZWFyY2hFbmdpbmUoaW5kZXgpOwotLy8gICAgdHJ5IHsKLS8vICAgICAgbmV3IFRocmVhZF9TZWFyY2hFbmdpbmVJbXBsVGVzdF9ydW5TZWFyY2gocHJvY2Vzc29yKS5zdGFydCgpOwotLy8gICAgICBwcm9jZXNzb3Iud2FpdEZvclJ1bm5pbmcoKTsKLS8vICAgICAgcmV0dXJuIHJ1bm5lci5ydW4ocXVldWUsIHByb2Nlc3NvciwgaW5kZXgsIGVuZ2luZSk7Ci0vLyAgICB9IGZpbmFsbHkgewotLy8gICAgICBwcm9jZXNzb3Iuc3RvcChmYWxzZSk7Ci0vLyAgICB9Ci0vLyAgfQotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoRGVjbGFyYXRpb25zQXN5bmMoU3RyaW5nIG1ldGhvZE5hbWUpID0+IF9ydW5TZWFyY2gobmV3IFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNBc3luYyh0aGlzLCBtZXRob2ROYW1lLCB0aGlzLCBtYXRjaGVzLCBsYXRjaCkpOwotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoRGVjbGFyYXRpb25zU3luYyhTdHJpbmcgbWV0aG9kTmFtZSkgPT4gX3J1blNlYXJjaChuZXcgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3NlYXJjaERlY2xhcmF0aW9uc1N5bmModGhpcywgbWV0aG9kTmFtZSkpOwotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNBc3luYygpID0+IF9zZWFyY2hEZWNsYXJhdGlvbnNBc3luYygic2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnMiKTsKLS8vCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gX3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zU3luYygpID0+IF9zZWFyY2hEZWNsYXJhdGlvbnNTeW5jKCJzZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9ucyIpOwotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoUmVmZXJlbmNlc1N5bmMoVHlwZSBjbGF6eiwgT2JqZWN0IGVsZW1lbnQpID0+IF9zZWFyY2hSZWZlcmVuY2VzU3luYzIoInNlYXJjaFJlZmVyZW5jZXMiLCBjbGF6eiwgZWxlbWVudCk7Ci0vLwotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IF9zZWFyY2hSZWZlcmVuY2VzU3luYzIoU3RyaW5nIG1ldGhvZE5hbWUsIFR5cGUgY2xhenosIE9iamVjdCBlbGVtZW50KSA9PiBfcnVuU2VhcmNoKG5ldyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3Rfc2VhcmNoUmVmZXJlbmNlc1N5bmModGhpcywgbWV0aG9kTmFtZSwgY2xhenosIGVsZW1lbnQpKTsKLS8vCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gX3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNBc3luYygpID0+IF9zZWFyY2hEZWNsYXJhdGlvbnNBc3luYygic2VhcmNoVHlwZURlY2xhcmF0aW9ucyIpOwotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoVHlwZURlY2xhcmF0aW9uc1N5bmMoKSA9PiBfc2VhcmNoRGVjbGFyYXRpb25zU3luYygic2VhcmNoVHlwZURlY2xhcmF0aW9ucyIpOwotLy8KLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBfc2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnNBc3luYygpID0+IF9zZWFyY2hEZWNsYXJhdGlvbnNBc3luYygic2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnMiKTsKLS8vCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gX3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zU3luYygpID0+IF9zZWFyY2hEZWNsYXJhdGlvbnNTeW5jKCJzZWFyY2hWYXJpYWJsZURlY2xhcmF0aW9ucyIpOwotLy8KLS8vICBzdGF0aWMgZGFydFN1aXRlKCkgewotLy8gICAgX3V0Lmdyb3VwKCdTZWFyY2hFbmdpbmVJbXBsVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoRGVjbGFyYXRpb25zX1N0cmluZycsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNfU3RyaW5nKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zX2FzeW5jJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zX2FzeW5jKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zX2luVW5pdmVyc2UnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfaW5Vbml2ZXJzZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc191c2VGaWx0ZXInLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlRmlsdGVyKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zX3VzZVBhdHRlcm4nLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlUGF0dGVybik7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJDb21wb25lbnRFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhckNvbXBvbmVudEVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyQ29udHJvbGxlckVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyQ29udHJvbGxlckVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyRmlsdGVyRWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJGaWx0ZXJFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhclByb3BlcnR5RWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0FuZ3VsYXJQcm9wZXJ0eUVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyU2NvcGVQcm9wZXJ0eUVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyU2NvcGVQcm9wZXJ0eUVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19Bbmd1bGFyU2VsZWN0b3JFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhclNlbGVjdG9yRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudF91c2VTY29wZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudF91c2VTY29wZSk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NvbXBpbGF0aW9uVW5pdEVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19Db21waWxhdGlvblVuaXRFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQ29uc3RydWN0b3JFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQ29uc3RydWN0b3JFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRWxlbWVudF91bmtub3duJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRWxlbWVudF91bmtub3duKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRmllbGRFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRmllbGRFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRmllbGRFbGVtZW50MicsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ZpZWxkRWxlbWVudDIpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19GaWVsZEVsZW1lbnRfaW52b2NhdGlvbicsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ZpZWxkRWxlbWVudF9pbnZvY2F0aW9uKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRnVuY3Rpb25FbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRnVuY3Rpb25FbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfSW1wb3J0RWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ltcG9ydEVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19MaWJyYXJ5RWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX0xpYnJhcnlFbGVtZW50KTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfTWV0aG9kRWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX01ldGhvZEVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19NZXRob2RNZW1iZXInLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19NZXRob2RNZW1iZXIpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19QYXJhbWV0ZXJFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfUGFyYW1ldGVyRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50X2dldHRlcicsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50X2dldHRlcik7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50X3NldHRlcicsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50X3NldHRlcik7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX1RvcExldmVsVmFyaWFibGVFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19UeXBlQWxpYXNFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfVHlwZUFsaWFzRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hSZWZlcmVuY2VzX1R5cGVQYXJhbWV0ZXJFbGVtZW50JywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFJlZmVyZW5jZXNfVHlwZVBhcmFtZXRlckVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19WYXJpYWJsZUVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19WYXJpYWJsZUVsZW1lbnQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoUmVmZXJlbmNlc19ub3RTdXBwb3J0ZWQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoUmVmZXJlbmNlc19ub3RTdXBwb3J0ZWQpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoU3VidHlwZXMnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoU3VidHlwZXMpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2VhcmNoVHlwZURlY2xhcmF0aW9uc19hc3luYycsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2VhcmNoRW5naW5lSW1wbFRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zX2FzeW5jKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNfY2xhc3MnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoVHlwZURlY2xhcmF0aW9uc19jbGFzcyk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9zZWFyY2hUeXBlRGVjbGFyYXRpb25zX2NsYXNzQWxpYXMnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoVHlwZURlY2xhcmF0aW9uc19jbGFzc0FsaWFzKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNfZnVuY3Rpb25UeXBlJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFR5cGVEZWNsYXJhdGlvbnNfZnVuY3Rpb25UeXBlKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFVucmVzb2x2ZWRRdWFsaWZpZWRSZWZlcmVuY2VzJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFVucmVzb2x2ZWRRdWFsaWZpZWRSZWZlcmVuY2VzKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zX2FzeW5jJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zX2FzeW5jKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X3NlYXJjaFZhcmlhYmxlRGVjbGFyYXRpb25zX3VzZVBhdHRlcm4nLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNlYXJjaEVuZ2luZUltcGxUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3Rfc2VhcmNoVmFyaWFibGVEZWNsYXJhdGlvbnNfdXNlUGF0dGVybik7Ci0vLyAgICAgIH0pOwotLy8gICAgfSk7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoIHsKLS8vICBmaW5hbCBFbGVtZW50IF9lbGVtZW50OwotLy8KLS8vICBmaW5hbCBNYXRjaEtpbmQgX2tpbmQ7Ci0vLwotLy8gIGZpbmFsIE1hdGNoUXVhbGl0eSBfcXVhbGl0eTsKLS8vCi0vLyAgU291cmNlUmFuZ2UgX3JhbmdlOwotLy8KLS8vICBmaW5hbCBib29sIF9xdWFsaWZpZWQ7Ci0vLwotLy8gIFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uMShFbGVtZW50IGVsZW1lbnQsIE1hdGNoS2luZCBraW5kLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSA6IHRoaXMuY29uMyhlbGVtZW50LCBraW5kLCBNYXRjaFF1YWxpdHkuRVhBQ1QsIG9mZnNldCwgbGVuZ3RoKTsKLS8vCi0vLyAgU2VhcmNoRW5naW5lSW1wbFRlc3RfRXhwZWN0ZWRNYXRjaC5jb24yKEVsZW1lbnQgZWxlbWVudCwgTWF0Y2hLaW5kIGtpbmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2wgcXVhbGlmaWVkKSA6IHRoaXMuY29uNChlbGVtZW50LCBraW5kLCBNYXRjaFF1YWxpdHkuRVhBQ1QsIG9mZnNldCwgbGVuZ3RoLCBxdWFsaWZpZWQpOwotLy8KLS8vICBTZWFyY2hFbmdpbmVJbXBsVGVzdF9FeHBlY3RlZE1hdGNoLmNvbjMoRWxlbWVudCBlbGVtZW50LCBNYXRjaEtpbmQga2luZCwgTWF0Y2hRdWFsaXR5IHF1YWxpdHksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIDogdGhpcy5jb240KGVsZW1lbnQsIGtpbmQsIHF1YWxpdHksIG9mZnNldCwgbGVuZ3RoLCBmYWxzZSk7Ci0vLwotLy8gIFNlYXJjaEVuZ2luZUltcGxUZXN0X0V4cGVjdGVkTWF0Y2guY29uNCh0aGlzLl9lbGVtZW50LCB0aGlzLl9raW5kLCB0aGlzLl9xdWFsaXR5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCB0aGlzLl9xdWFsaWZpZWQpIHsKLS8vICAgIHRoaXMuX3JhbmdlID0gbmV3IFNvdXJjZVJhbmdlKG9mZnNldCwgbGVuZ3RoKTsKLS8vICB9Ci0vL30KLS8vCi0vL2Fic3RyYWN0IGNsYXNzIFNlYXJjaEVuZ2luZUltcGxUZXN0X1NlYXJjaFJ1bm5lcjxUPiB7Ci0vLyAgVCBydW4oT3BlcmF0aW9uUXVldWUgcXVldWUsIE9wZXJhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IsIEluZGV4IGluZGV4LCBTZWFyY2hFbmdpbmUgZW5naW5lKTsKLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoRmlsdGVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3Rlc3Rfc2VhcmNoRnVuY3Rpb25EZWNsYXJhdGlvbnNfdXNlRmlsdGVyIGltcGxlbWVudHMgU2VhcmNoRmlsdGVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsVGVzdCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzOwotLy8KLS8vICBTZWFyY2hGaWx0ZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc191c2VGaWx0ZXIodGhpcy5TZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzKTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgYm9vbCBwYXNzZXMoU2VhcmNoTWF0Y2ggbWF0Y2gpID0+IGlkZW50aWNhbChtYXRjaC5lbGVtZW50LCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLl9lbGVtZW50Qik7Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaEZpbHRlcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF90ZXN0X3NlYXJjaEZ1bmN0aW9uRGVjbGFyYXRpb25zX3VzZUZpbHRlcl8yIGltcGxlbWVudHMgU2VhcmNoRmlsdGVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsVGVzdCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzOwotLy8KLS8vICBTZWFyY2hGaWx0ZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hGdW5jdGlvbkRlY2xhcmF0aW9uc191c2VGaWx0ZXJfMih0aGlzLlNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBib29sIHBhc3NlcyhTZWFyY2hNYXRjaCBtYXRjaCkgPT4gaWRlbnRpY2FsKG1hdGNoLmVsZW1lbnQsIFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMuX2VsZW1lbnRBKTsKLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoTGlzdGVuZXJfU2VhcmNoUnVubmVyXzExN19ydW4gaW1wbGVtZW50cyBTZWFyY2hMaXN0ZW5lciB7Ci0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlczsKLS8vCi0vLyAgQ291bnREb3duTGF0Y2ggbGF0Y2g7Ci0vLwotLy8gIFNlYXJjaExpc3RlbmVyX1NlYXJjaFJ1bm5lcl8xMTdfcnVuKHRoaXMubWF0Y2hlcywgdGhpcy5sYXRjaCk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIHZvaWQgbWF0Y2hGb3VuZChTZWFyY2hNYXRjaCBtYXRjaCkgewotLy8gICAgbWF0Y2hlcy5hZGQobWF0Y2gpOwotLy8gIH0KLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgdm9pZCBzZWFyY2hDb21wbGV0ZSgpIHsKLS8vICAgIGxhdGNoLmNvdW50RG93bigpOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X2ZhaWxfc2VhcmNoQXNzaWduZWRUeXBlc19hc3NpZ25tZW50cyBpbXBsZW1lbnRzIFNlYXJjaEVuZ2luZUltcGxUZXN0X1NlYXJjaFJ1bm5lciB7Ci0vLyAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudDsKLS8vCi0vLyAgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X2ZhaWxfc2VhcmNoQXNzaWduZWRUeXBlc19hc3NpZ25tZW50cyh0aGlzLmZpZWxkRWxlbWVudCwgdGhpcy5maWVsZEVsZW1lbnQpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBTZXQ8RGFydFR5cGU+IHJ1bihPcGVyYXRpb25RdWV1ZSBxdWV1ZSwgT3BlcmF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciwgSW5kZXggaW5kZXgsIFNlYXJjaEVuZ2luZSBlbmdpbmUpID0+IGVuZ2luZS5zZWFyY2hBc3NpZ25lZFR5cGVzKGZpZWxkRWxlbWVudCwgbmV3IFNlYXJjaFNjb3BlX1NlYXJjaFJ1bm5lcl8xMDlfcnVuKCkpOwotLy99Ci0vLwotLy9jbGFzcyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfZmFpbF9zZWFyY2hBc3NpZ25lZFR5cGVzX2luaXRpYWxpemVycyBpbXBsZW1lbnRzIFNlYXJjaEVuZ2luZUltcGxUZXN0X1NlYXJjaFJ1bm5lciB7Ci0vLyAgRmllbGRFbGVtZW50IGZpZWxkRWxlbWVudDsKLS8vCi0vLyAgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X2ZhaWxfc2VhcmNoQXNzaWduZWRUeXBlc19pbml0aWFsaXplcnModGhpcy5maWVsZEVsZW1lbnQpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBTZXQ8RGFydFR5cGU+IHJ1bihPcGVyYXRpb25RdWV1ZSBxdWV1ZSwgT3BlcmF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciwgSW5kZXggaW5kZXgsIFNlYXJjaEVuZ2luZSBlbmdpbmUpID0+IGVuZ2luZS5zZWFyY2hBc3NpZ25lZFR5cGVzKGZpZWxkRWxlbWVudCwgbnVsbCk7Ci0vL30KLS8vCi0vL2NsYXNzIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNBc3luYyBpbXBsZW1lbnRzIFNlYXJjaEVuZ2luZUltcGxUZXN0X1NlYXJjaFJ1bm5lciB7Ci0vLyAgZmluYWwgU2VhcmNoRW5naW5lSW1wbFRlc3QgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpczsKLS8vCi0vLyAgU3RyaW5nIG1ldGhvZE5hbWU7Ci0vLwotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGxUZXN0IFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXM7Ci0vLwotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXM7Ci0vLwotLy8gIENvdW50RG93bkxhdGNoIGxhdGNoOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3Rfc2VhcmNoRGVjbGFyYXRpb25zQXN5bmModGhpcy5TZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLCB0aGlzLm1ldGhvZE5hbWUsIHRoaXMuU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcywgdGhpcy5tYXRjaGVzLCB0aGlzLmxhdGNoLCB0aGlzLlNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMsIHRoaXMubWV0aG9kTmFtZSwgdGhpcy5TZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLCB0aGlzLm1hdGNoZXMsIHRoaXMubGF0Y2gpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICBMaXN0PFNlYXJjaE1hdGNoPiBydW4oT3BlcmF0aW9uUXVldWUgcXVldWUsIE9wZXJhdGlvblByb2Nlc3NvciBwcm9jZXNzb3IsIEluZGV4IGluZGV4LCBTZWFyY2hFbmdpbmUgZW5naW5lKSB7Ci0vLyAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKLS8vICAgIExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMgPSBbXTsKLS8vICAgIGVuZ2luZS5ydW50aW1lVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgW1NlYXJjaFNjb3BlLCBTZWFyY2hQYXR0ZXJuLCBTZWFyY2hGaWx0ZXIsIFNlYXJjaExpc3RlbmVyXSkuaW52b2tlKGVuZ2luZSwgWwotLy8gICAgICAgIFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMuX3Njb3BlLAotLy8gICAgICAgIFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMuX3BhdHRlcm4sCi0vLyAgICAgICAgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcy5fZmlsdGVyLAotLy8gICAgICAgIG5ldyBTZWFyY2hMaXN0ZW5lcl9TZWFyY2hSdW5uZXJfMTE3X3J1bihtYXRjaGVzLCBsYXRjaCldKTsKLS8vICAgIGxhdGNoLmF3YWl0KDMwLCBUaW1lVW5pdC5TRUNPTkRTKTsKLS8vICAgIHJldHVybiBtYXRjaGVzOwotLy8gIH0KLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3NlYXJjaERlY2xhcmF0aW9uc1N5bmMgaW1wbGVtZW50cyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGxUZXN0IFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXM7Ci0vLwotLy8gIFN0cmluZyBtZXRob2ROYW1lOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3Rfc2VhcmNoRGVjbGFyYXRpb25zU3luYyh0aGlzLlNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMsIHRoaXMubWV0aG9kTmFtZSk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHJ1bihPcGVyYXRpb25RdWV1ZSBxdWV1ZSwgT3BlcmF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciwgSW5kZXggaW5kZXgsIFNlYXJjaEVuZ2luZSBlbmdpbmUpID0+IGVuZ2luZS5ydW50aW1lVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgW1NlYXJjaFNjb3BlLCBTZWFyY2hQYXR0ZXJuLCBTZWFyY2hGaWx0ZXJdKS5pbnZva2UoZW5naW5lLCBbCi0vLyAgICAgIFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMuX3Njb3BlLAotLy8gICAgICBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLl9wYXR0ZXJuLAotLy8gICAgICBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLl9maWx0ZXJdKSBhcyBMaXN0PFNlYXJjaE1hdGNoPjsKLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3NlYXJjaFJlZmVyZW5jZXNTeW5jIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbFRlc3RfU2VhcmNoUnVubmVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsVGVzdCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzOwotLy8KLS8vICBTdHJpbmcgbWV0aG9kTmFtZTsKLS8vCi0vLyAgVHlwZSBjbGF6ejsKLS8vCi0vLyAgT2JqZWN0IGVsZW1lbnQ7Ci0vLwotLy8gIFNlYXJjaFJ1bm5lcl9TZWFyY2hFbmdpbmVJbXBsVGVzdF9zZWFyY2hSZWZlcmVuY2VzU3luYyh0aGlzLlNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXMsIHRoaXMubWV0aG9kTmFtZSwgdGhpcy5jbGF6eiwgdGhpcy5lbGVtZW50KTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gcnVuKE9wZXJhdGlvblF1ZXVlIHF1ZXVlLCBPcGVyYXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yLCBJbmRleCBpbmRleCwgU2VhcmNoRW5naW5lIGVuZ2luZSkgewotLy8gICAgLy8gcGFzcyBzb21lIG9wZXJhdGlvbiB0byB3YWl0IGlmIHNlYXJjaCB3aWxsIG5vdCBjYWxsIHByb2Nlc3NvcgotLy8gICAgcXVldWUuZW5xdWV1ZShtb2NrKEluZGV4T3BlcmF0aW9uKSk7Ci0vLyAgICAvLyBydW4gYWN0dWFsIHNlYXJjaAotLy8gICAgcmV0dXJuIGVuZ2luZS5ydW50aW1lVHlwZS5nZXRNZXRob2QobWV0aG9kTmFtZSwgW2NsYXp6LCBTZWFyY2hTY29wZSwgU2VhcmNoRmlsdGVyXSkuaW52b2tlKGVuZ2luZSwgWwotLy8gICAgICAgIGVsZW1lbnQsCi0vLyAgICAgICAgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcy5fc2NvcGUsCi0vLyAgICAgICAgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcy5fZmlsdGVyXSkgYXMgTGlzdDxTZWFyY2hNYXRjaD47Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNfU3RyaW5nIGltcGxlbWVudHMgU2VhcmNoRW5naW5lSW1wbFRlc3RfU2VhcmNoUnVubmVyIHsKLS8vICBmaW5hbCBTZWFyY2hFbmdpbmVJbXBsVGVzdCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzOwotLy8KLS8vICBTZWFyY2hSdW5uZXJfU2VhcmNoRW5naW5lSW1wbFRlc3RfdGVzdF9zZWFyY2hEZWNsYXJhdGlvbnNfU3RyaW5nKHRoaXMuU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcyk7Ci0vLwotLy8gIEBvdmVycmlkZQotLy8gIExpc3Q8U2VhcmNoTWF0Y2g+IHJ1bihPcGVyYXRpb25RdWV1ZSBxdWV1ZSwgT3BlcmF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvciwgSW5kZXggaW5kZXgsIFNlYXJjaEVuZ2luZSBlbmdpbmUpID0+IGVuZ2luZS5zZWFyY2hEZWNsYXJhdGlvbnMoInRlc3QiLCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLl9zY29wZSwgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcy5fZmlsdGVyKTsKLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3Rlc3Rfc2VhcmNoU3VidHlwZXMgaW1wbGVtZW50cyBTZWFyY2hFbmdpbmVJbXBsVGVzdF9TZWFyY2hSdW5uZXIgewotLy8gIGZpbmFsIFNlYXJjaEVuZ2luZUltcGxUZXN0IFNlYXJjaEVuZ2luZUltcGxUZXN0X3RoaXM7Ci0vLwotLy8gIENsYXNzRWxlbWVudCByZWZlcmVuY2VkRWxlbWVudDsKLS8vCi0vLyAgU2VhcmNoUnVubmVyX1NlYXJjaEVuZ2luZUltcGxUZXN0X3Rlc3Rfc2VhcmNoU3VidHlwZXModGhpcy5TZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLCB0aGlzLnJlZmVyZW5jZWRFbGVtZW50KTsKLS8vCi0vLyAgQG92ZXJyaWRlCi0vLyAgTGlzdDxTZWFyY2hNYXRjaD4gcnVuKE9wZXJhdGlvblF1ZXVlIHF1ZXVlLCBPcGVyYXRpb25Qcm9jZXNzb3IgcHJvY2Vzc29yLCBJbmRleCBpbmRleCwgU2VhcmNoRW5naW5lIGVuZ2luZSkgPT4gZW5naW5lLnNlYXJjaFN1YnR5cGVzKHJlZmVyZW5jZWRFbGVtZW50LCBTZWFyY2hFbmdpbmVJbXBsVGVzdF90aGlzLl9zY29wZSwgU2VhcmNoRW5naW5lSW1wbFRlc3RfdGhpcy5fZmlsdGVyKTsKLS8vfQotLy8KLS8vY2xhc3MgU2VhcmNoU2NvcGVfU2VhcmNoUnVubmVyXzEwOV9ydW4gaW1wbGVtZW50cyBTZWFyY2hTY29wZSB7Ci0vLyAgQG92ZXJyaWRlCi0vLyAgYm9vbCBlbmNsb3NlcyhFbGVtZW50IGVsZW1lbnQpID0+ICFpZGVudGljYWwoZWxlbWVudCwgX2VsZW1lbnRDKTsKLS8vfQotLy8KLS8vY2xhc3MgVGhyZWFkX1NlYXJjaEVuZ2luZUltcGxUZXN0X3J1blNlYXJjaCBleHRlbmRzIFRocmVhZCB7Ci0vLyAgT3BlcmF0aW9uUHJvY2Vzc29yIHByb2Nlc3NvcjsKLS8vCi0vLyAgVGhyZWFkX1NlYXJjaEVuZ2luZUltcGxUZXN0X3J1blNlYXJjaCh0aGlzLnByb2Nlc3NvcikgOiBzdXBlcigpOwotLy8KLS8vICBAb3ZlcnJpZGUKLS8vICB2b2lkIHJ1bigpIHsKLS8vICAgIHByb2Nlc3Nvci5ydW4oKTsKLS8vICB9Ci0vL30KLS8vCi0vL2NsYXNzIFVuaXZlcnNlU2VhcmNoU2NvcGVUZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIFNlYXJjaFNjb3BlIF9zY29wZSA9IG5ldyBVbml2ZXJzZVNlYXJjaFNjb3BlKCk7Ci0vLwotLy8gIEVsZW1lbnQgX2VsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8KLS8vICB2b2lkIHRlc3RfYW55RWxlbWVudCgpIHsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0VHJ1ZShfc2NvcGUuZW5jbG9zZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9udWxsRWxlbWVudCgpIHsKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0VHJ1ZShfc2NvcGUuZW5jbG9zZXMobnVsbCkpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnVW5pdmVyc2VTZWFyY2hTY29wZVRlc3QnLCAoKSB7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2FueUVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFVuaXZlcnNlU2VhcmNoU2NvcGVUZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfYW55RWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9udWxsRWxlbWVudCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVW5pdmVyc2VTZWFyY2hTY29wZVRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9udWxsRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgfSk7Ci0vLyAgfQotLy99Ci0vLwotLy9jbGFzcyBXaWxkY2FyZFNlYXJjaFBhdHRlcm5UZXN0IGV4dGVuZHMgRW5naW5lVGVzdENhc2UgewotLy8gIEVsZW1lbnQgX2VsZW1lbnQgPSBtb2NrKEVsZW1lbnQpOwotLy8KLS8vICB2b2lkIHRlc3RfY2FzZUluc2Vuc2l0aXZlX2ZhbHNlX2NvbnRlbnRNaXNtYXRjaCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm4oIkgqTWFwIiwgZmFsc2UpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiTWFwcyIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShudWxsLCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlSW5zZW5zaXRpdmVfdHJ1ZV9jYXNlTWlzbWF0Y2goKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgV2lsZGNhcmRTZWFyY2hQYXR0ZXJuKCJIKk1hUCIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4oIkhhc2hNYXAiKTsKLS8vICAgIC8vIHZhbGlkYXRlCi0vLyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFNhbWUoTWF0Y2hRdWFsaXR5LkVYQUNULCBwYXR0ZXJuLm1hdGNoZXMoX2VsZW1lbnQpKTsKLS8vICB9Ci0vLwotLy8gIHZvaWQgdGVzdF9jYXNlU2Vuc2l0aXZlX2ZhbHNlX2Nhc2VNaXNtYXRjaCgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm4oIkgqTWFQIiwgdHJ1ZSk7Ci0vLyAgICB3aGVuKF9lbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJIYXNoTWFwIik7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VTZW5zaXRpdmVfZmFsc2VfY29udGVudE1pc21hdGNoKCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFdpbGRjYXJkU2VhcmNoUGF0dGVybigiSCpNYXAiLCBmYWxzZSk7Ci0vLyAgICB3aGVuKF9lbGVtZW50LmRpc3BsYXlOYW1lKS50aGVuUmV0dXJuKCJNYXBzIik7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X2Nhc2VTZW5zaXRpdmVfdHJ1ZSgpIHsKLS8vICAgIFNlYXJjaFBhdHRlcm4gcGF0dGVybiA9IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm4oIkgqTWE/IiwgZmFsc2UpOwotLy8gICAgd2hlbihfZWxlbWVudC5kaXNwbGF5TmFtZSkudGhlblJldHVybigiSGFzaE1hcCIpOwotLy8gICAgLy8gdmFsaWRhdGUKLS8vICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0U2FtZShNYXRjaFF1YWxpdHkuRVhBQ1QsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgdm9pZCB0ZXN0X251bGxFbGVtZW50KCkgewotLy8gICAgU2VhcmNoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFdpbGRjYXJkU2VhcmNoUGF0dGVybigiSCpNYXAiLCBmYWxzZSk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhudWxsKSk7Ci0vLyAgfQotLy8KLS8vICB2b2lkIHRlc3RfbnVsbE5hbWUoKSB7Ci0vLyAgICBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgV2lsZGNhcmRTZWFyY2hQYXR0ZXJuKCJIKk1hcCIsIGZhbHNlKTsKLS8vICAgIHdoZW4oX2VsZW1lbnQuZGlzcGxheU5hbWUpLnRoZW5SZXR1cm4obnVsbCk7Ci0vLyAgICAvLyB2YWxpZGF0ZQotLy8gICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRTYW1lKG51bGwsIHBhdHRlcm4ubWF0Y2hlcyhfZWxlbWVudCkpOwotLy8gIH0KLS8vCi0vLyAgc3RhdGljIGRhcnRTdWl0ZSgpIHsKLS8vICAgIF91dC5ncm91cCgnV2lsZGNhcmRTZWFyY2hQYXR0ZXJuVGVzdCcsICgpIHsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX2ZhbHNlX2NvbnRlbnRNaXNtYXRjaCcsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgV2lsZGNhcmRTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2Nhc2VJbnNlbnNpdGl2ZV9mYWxzZV9jb250ZW50TWlzbWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWVfY2FzZU1pc21hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZUluc2Vuc2l0aXZlX3RydWVfY2FzZU1pc21hdGNoKTsKLS8vICAgICAgfSk7Ci0vLyAgICAgIF91dC50ZXN0KCd0ZXN0X2Nhc2VTZW5zaXRpdmVfZmFsc2VfY2FzZU1pc21hdGNoJywgKCkgewotLy8gICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBXaWxkY2FyZFNlYXJjaFBhdHRlcm5UZXN0KCk7Ci0vLyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZV9jYXNlTWlzbWF0Y2gpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfY2FzZVNlbnNpdGl2ZV9mYWxzZV9jb250ZW50TWlzbWF0Y2gnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFdpbGRjYXJkU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlU2Vuc2l0aXZlX2ZhbHNlX2NvbnRlbnRNaXNtYXRjaCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFdpbGRjYXJkU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9jYXNlU2Vuc2l0aXZlX3RydWUpOwotLy8gICAgICB9KTsKLS8vICAgICAgX3V0LnRlc3QoJ3Rlc3RfbnVsbEVsZW1lbnQnLCAoKSB7Ci0vLyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFdpbGRjYXJkU2VhcmNoUGF0dGVyblRlc3QoKTsKLS8vICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9udWxsRWxlbWVudCk7Ci0vLyAgICAgIH0pOwotLy8gICAgICBfdXQudGVzdCgndGVzdF9udWxsTmFtZScsICgpIHsKLS8vICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgV2lsZGNhcmRTZWFyY2hQYXR0ZXJuVGVzdCgpOwotLy8gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X251bGxOYW1lKTsKLS8vICAgICAgfSk7Ci0vLyAgICB9KTsKLS8vICB9Ci0vL30KLS8vCi0vL21haW4oKSB7Ci0vLyAgQ291bnRpbmdTZWFyY2hMaXN0ZW5lclRlc3QuZGFydFN1aXRlKCk7Ci0vLyAgRmlsdGVyU2VhcmNoTGlzdGVuZXJUZXN0LmRhcnRTdWl0ZSgpOwotLy8gIEdhdGhlcmluZ1NlYXJjaExpc3RlbmVyVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBOYW1lTWF0Y2hpbmdTZWFyY2hMaXN0ZW5lclRlc3QuZGFydFN1aXRlKCk7Ci0vLyAgTGlicmFyeVNlYXJjaFNjb3BlVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBVbml2ZXJzZVNlYXJjaFNjb3BlVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBTZWFyY2hFbmdpbmVJbXBsVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBBbmRTZWFyY2hQYXR0ZXJuVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBDYW1lbENhc2VTZWFyY2hQYXR0ZXJuVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBFeGFjdFNlYXJjaFBhdHRlcm5UZXN0LmRhcnRTdWl0ZSgpOwotLy8gIE9yU2VhcmNoUGF0dGVyblRlc3QuZGFydFN1aXRlKCk7Ci0vLyAgUHJlZml4U2VhcmNoUGF0dGVyblRlc3QuZGFydFN1aXRlKCk7Ci0vLyAgUmVndWxhckV4cHJlc3Npb25TZWFyY2hQYXR0ZXJuVGVzdC5kYXJ0U3VpdGUoKTsKLS8vICBXaWxkY2FyZFNlYXJjaFBhdHRlcm5UZXN0LmRhcnRTdWl0ZSgpOwotLy99CisKKyAgdm9pZCBzZXRVcCgpIHsKKyAgICBzdXBlci5zZXRVcCgpOworICAgIGluZGV4ID0gY3JlYXRlTG9jYWxNZW1vcnlJbmRleCgpOworICAgIHNlYXJjaEVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmVJbXBsKGluZGV4KTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaE1lbWJlckRlY2xhcmF0aW9ucygpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIEEgeworICB0ZXN0KCkge30KK30KK2NsYXNzIEIgeworICBpbnQgdGVzdCA9IDQyOworfQorJycnKTsKKyAgICBOYW1lRWxlbWVudCBlbGVtZW50ID0gbmV3IE5hbWVFbGVtZW50KCd0ZXN0Jyk7CisgICAgQ2xhc3NFbGVtZW50IGVsZW1lbnRBID0gZmluZEVsZW1lbnQoJ0EnKTsKKyAgICBDbGFzc0VsZW1lbnQgZWxlbWVudEIgPSBmaW5kRWxlbWVudCgnQicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKGVsZW1lbnRBLm1ldGhvZHNbMF0sIE1hdGNoS2luZC5OQU1FX0RFQ0xBUkFUSU9OLCAndGVzdCgpIHt9JyksCisgICAgICAgIF9leHBlY3RJZChlbGVtZW50Qi5maWVsZHNbMF0sIE1hdGNoS2luZC5OQU1FX0RFQ0xBUkFUSU9OLCAndGVzdCA9IDQyOycpXTsKKyAgICByZXR1cm4gc2VhcmNoRW5naW5lLnNlYXJjaE1lbWJlckRlY2xhcmF0aW9ucygndGVzdCcpLnRoZW4oKG1hdGNoZXMpIHsKKyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQW5ndWxhckNvbXBvbmVudEVsZW1lbnQoKSB7CisgICAgLy8gdXNlIG1vY2tzCisgICAgaW5kZXggPSBuZXcgTW9ja0luZGV4KCk7CisgICAgc2VhcmNoRW5naW5lID0gbmV3IFNlYXJjaEVuZ2luZUltcGwoaW5kZXgpOworICAgIEVsZW1lbnQgZWxlbWVudEEgPSBuZXcgTW9ja0VsZW1lbnQoJ0EnKTsKKyAgICBFbGVtZW50IGVsZW1lbnRCID0gbmV3IE1vY2tFbGVtZW50KCdCJyk7CisgICAgLy8gZmlsbCBtb2NrcworICAgIEFuZ3VsYXJDb21wb25lbnRFbGVtZW50IGVsZW1lbnQgPSBuZXcgTW9ja0FuZ3VsYXJDb21wb25lbnRFbGVtZW50KCk7CisgICAgdm9pZCBtb2NrTG9jYXRpb24oRWxlbWVudCBlbGVtZW50LCBSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwLAorICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbikgeworICAgICAgaW5kZXguZ2V0UmVsYXRpb25zaGlwcyhlbGVtZW50LCByZWxhdGlvbnNoaXApOworICAgICAgd2hlbihudWxsKS50aGVuUmV0dXJuKG5ldyBGdXR1cmUudmFsdWUoW2xvY2F0aW9uXSkpOworICAgIH0KKyAgICBtb2NrTG9jYXRpb24oCisgICAgICAgIGVsZW1lbnQsCisgICAgICAgIEluZGV4Q29uc3RhbnRzLkFOR1VMQVJfUkVGRVJFTkNFLAorICAgICAgICBuZXcgTG9jYXRpb24oZWxlbWVudEEsIDEsIDEwKSk7CisgICAgbW9ja0xvY2F0aW9uKAorICAgICAgICBlbGVtZW50LAorICAgICAgICBJbmRleENvbnN0YW50cy5BTkdVTEFSX0NMT1NJTkdfVEFHX1JFRkVSRU5DRSwKKyAgICAgICAgbmV3IExvY2F0aW9uKGVsZW1lbnRCLCAyLCAyMCkpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgbmV3IEV4cGVjdGVkTWF0Y2goZWxlbWVudEEsIE1hdGNoS2luZC5BTkdVTEFSX1JFRkVSRU5DRSwgMSwgMTApLAorICAgICAgICBuZXcgRXhwZWN0ZWRNYXRjaChlbGVtZW50QiwgTWF0Y2hLaW5kLkFOR1VMQVJfQ0xPU0lOR19UQUdfUkVGRVJFTkNFLCAyLCAyMCldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0NsYXNzRWxlbWVudCgpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIEEge30KK21haW4oQSBwKSB7CisgIEEgdjsKK30KKycnJyk7CisgICAgQ2xhc3NFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgnQScpOworICAgIEVsZW1lbnQgcEVsZW1lbnQgPSBmaW5kRWxlbWVudCgncCcpOworICAgIEVsZW1lbnQgdkVsZW1lbnQgPSBmaW5kRWxlbWVudCgndicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKHBFbGVtZW50LCBNYXRjaEtpbmQuVFlQRV9SRUZFUkVOQ0UsICdBIHAnKSwKKyAgICAgICAgX2V4cGVjdElkKHZFbGVtZW50LCBNYXRjaEtpbmQuVFlQRV9SRUZFUkVOQ0UsICdBIHYnKV07CisgICAgcmV0dXJuIF92ZXJpZnlSZWZlcmVuY2VzKGVsZW1lbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfQ29tcGlsYXRpb25Vbml0RWxlbWVudCgpIHsKKyAgICBhZGRTb3VyY2UoJy9teV9wYXJ0LmRhcnQnLCAnJycKK3BhcnQgb2YgbGliOworJycnKTsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2xpYnJhcnkgbGliOworcGFydCAnbXlfcGFydC5kYXJ0JzsKKycnJyk7CisgICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBlbGVtZW50ID0gdGVzdExpYnJhcnlFbGVtZW50LnBhcnRzWzBdOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKAorICAgICAgICAgICAgdGVzdFVuaXRFbGVtZW50LAorICAgICAgICAgICAgTWF0Y2hLaW5kLlVOSVRfUkVGRVJFTkNFLAorICAgICAgICAgICAgIidteV9wYXJ0LmRhcnQnIiwKKyAgICAgICAgICAgIGxlbmd0aDogIidteV9wYXJ0LmRhcnQnIi5sZW5ndGgpXTsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXMoZWxlbWVudCwgZXhwZWN0ZWQpOworICB9CisKKyAgRnV0dXJlIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19Db25zdHJ1Y3RvckVsZW1lbnQoKSB7CisgICAgX2luZGV4VGVzdFVuaXQoJycnCitjbGFzcyBBIHsKKyAgQS5uYW1lZCgpIHt9Cit9CittYWluKCkgeworICBuZXcgQS5uYW1lZCgpOworfQorJycnKTsKKyAgICBDb25zdHJ1Y3RvckVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KCduYW1lZCcpOworICAgIENsYXNzRWxlbWVudCBlbGVtZW50QSA9IGZpbmRFbGVtZW50KCdBJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgdmFyIGV4cGVjdGVkID0gWworICAgICAgICBfZXhwZWN0SWQoCisgICAgICAgICAgICBlbGVtZW50QSwKKyAgICAgICAgICAgIE1hdGNoS2luZC5DT05TVFJVQ1RPUl9ERUNMQVJBVElPTiwKKyAgICAgICAgICAgICcubmFtZWQoKSB7fScsCisgICAgICAgICAgICBsZW5ndGg6IDYpLAorICAgICAgICBfZXhwZWN0SWQoCisgICAgICAgICAgICBtYWluRWxlbWVudCwKKyAgICAgICAgICAgIE1hdGNoS2luZC5DT05TVFJVQ1RPUl9SRUZFUkVOQ0UsCisgICAgICAgICAgICAnLm5hbWVkKCk7JywKKyAgICAgICAgICAgIGxlbmd0aDogNildOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0VsZW1lbnRfdW5rbm93bigpIHsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXMoVW5pdmVyc2VFbGVtZW50LklOU1RBTkNFLCBbXSk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ZpZWxkRWxlbWVudCgpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIEEgeworICB2YXIgZmllbGQ7CisgIEEoe3RoaXMuZmllbGR9KTsKKyAgbWFpbigpIHsKKyAgICBuZXcgQShmaWVsZDogMSk7CisgICAgLy8gZ2V0dGVyCisgICAgcHJpbnQoZmllbGQpOyAvLyByZWYtbnEKKyAgICBwcmludCh0aGlzLmZpZWxkKTsgLy8gcmVmLXEKKyAgICBmaWVsZCgpOyAvLyBpbnYtbnEKKyAgICB0aGlzLmZpZWxkKCk7IC8vIGludi1xCisgICAgLy8gc2V0dGVyCisgICAgZmllbGQgPSAyOyAvLyByZWYtbnE7CisgICAgdGhpcy5maWVsZCA9IDM7IC8vIHJlZi1xOworICB9Cit9CisnJycpOworICAgIEZpZWxkRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ2ZpZWxkJyk7CisgICAgRWxlbWVudCBtYWluID0gZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICBFbGVtZW50IGZpZWxkUGFyYW1ldGVyID0gZmluZEVsZW1lbnQoJ2ZpZWxkJywgRWxlbWVudEtpbmQuUEFSQU1FVEVSKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIF9leHBlY3RJZFEoZmllbGRQYXJhbWV0ZXIsIE1hdGNoS2luZC5GSUVMRF9SRUZFUkVOQ0UsICdmaWVsZH0nKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluLCBNYXRjaEtpbmQuRklFTERfUkVGRVJFTkNFLCAnZmllbGQ6IDEnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW4sIE1hdGNoS2luZC5GSUVMRF9SRUFELCAnZmllbGQpOyAvLyByZWYtbnEnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluLCBNYXRjaEtpbmQuRklFTERfUkVBRCwgJ2ZpZWxkKTsgLy8gcmVmLXEnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW4sIE1hdGNoS2luZC5GSUVMRF9JTlZPQ0FUSU9OLCAnZmllbGQoKTsgLy8gaW52LW5xJyksCisgICAgICAgIF9leHBlY3RJZFEobWFpbiwgTWF0Y2hLaW5kLkZJRUxEX0lOVk9DQVRJT04sICdmaWVsZCgpOyAvLyBpbnYtcScpLAorICAgICAgICBfZXhwZWN0SWQobWFpbiwgTWF0Y2hLaW5kLkZJRUxEX1dSSVRFLCAnZmllbGQgPSAyOyAvLyByZWYtbnEnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluLCBNYXRjaEtpbmQuRklFTERfV1JJVEUsICdmaWVsZCA9IDM7IC8vIHJlZi1xJyldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0Z1bmN0aW9uRWxlbWVudCgpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK3Rlc3QoKSB7fQorbWFpbigpIHsKKyAgdGVzdCgpOworICBwcmludCh0ZXN0KTsKK30KKycnJyk7CisgICAgRnVuY3Rpb25FbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgndGVzdCcpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKG1haW5FbGVtZW50LCBNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCAndGVzdCgpOycpLAorICAgICAgICBfZXhwZWN0SWQobWFpbkVsZW1lbnQsIE1hdGNoS2luZC5GVU5DVElPTl9SRUZFUkVOQ0UsICd0ZXN0KTsnKV07CisgICAgcmV0dXJuIF92ZXJpZnlSZWZlcmVuY2VzKGVsZW1lbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50KCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJwordHlwZWRlZiBUZXN0KCk7CittYWluKCkgeworICBUZXN0IGE7CisgIFRlc3QgYjsKK30KKycnJyk7CisgICAgRnVuY3Rpb25UeXBlQWxpYXNFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgnVGVzdCcpOworICAgIEVsZW1lbnQgYUVsZW1lbnQgPSBmaW5kRWxlbWVudCgnYScpOworICAgIEVsZW1lbnQgYkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnYicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKGFFbGVtZW50LCBNYXRjaEtpbmQuRlVOQ1RJT05fVFlQRV9SRUZFUkVOQ0UsICdUZXN0IGE7JyksCisgICAgICAgIF9leHBlY3RJZChiRWxlbWVudCwgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfUkVGRVJFTkNFLCAnVGVzdCBiOycpXTsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXMoZWxlbWVudCwgZXhwZWN0ZWQpOworICB9CisKKyAgRnV0dXJlIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19JbXBvcnRFbGVtZW50X25vUHJlZml4KCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJworaW1wb3J0ICdkYXJ0Om1hdGgnOworbWFpbigpIHsKKyAgcHJpbnQoRSk7Cit9CisnJycpOworICAgIEltcG9ydEVsZW1lbnQgZWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5pbXBvcnRzWzBdOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBraW5kID0gTWF0Y2hLaW5kLklNUE9SVF9SRUZFUkVOQ0U7CisgICAgdmFyIGV4cGVjdGVkID0gW19leHBlY3RJZChtYWluRWxlbWVudCwga2luZCwgJ0UpOycsIGxlbmd0aDogMCldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX0ltcG9ydEVsZW1lbnRfd2l0aFByZWZpeCgpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2ltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOworbWFpbigpIHsKKyAgcHJpbnQobWF0aC5QSSk7Cit9CisnJycpOworICAgIEltcG9ydEVsZW1lbnQgZWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5pbXBvcnRzWzBdOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBraW5kID0gTWF0Y2hLaW5kLklNUE9SVF9SRUZFUkVOQ0U7CisgICAgdmFyIGV4cGVjdGVkID0gWworICAgICAgICBfZXhwZWN0SWQobWFpbkVsZW1lbnQsIGtpbmQsICdtYXRoLlBJKTsnLCBsZW5ndGg6ICdtYXRoLicubGVuZ3RoKV07CisgICAgcmV0dXJuIF92ZXJpZnlSZWZlcmVuY2VzKGVsZW1lbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfTGlicmFyeUVsZW1lbnQoKSB7CisgICAgdmFyIGNvZGVBID0gJ3BhcnQgb2YgbGliOyAvLyBBJzsKKyAgICB2YXIgY29kZUIgPSAncGFydCBvZiBsaWI7IC8vIEInOworICAgIHZhciBzb3VyY2VBID0gYWRkU291cmNlKCcvdW5pdEEuZGFydCcsIGNvZGVBKTsKKyAgICB2YXIgc291cmNlQiA9IGFkZFNvdXJjZSgnL3VuaXRCLmRhcnQnLCBjb2RlQik7CisgICAgX2luZGV4VGVzdFVuaXQoJycnCitsaWJyYXJ5IGxpYjsKK3BhcnQgJ3VuaXRBLmRhcnQnOworcGFydCAndW5pdEIuZGFydCc7CisnJycpOworICAgIExpYnJhcnlFbGVtZW50IGVsZW1lbnQgPSB0ZXN0TGlicmFyeUVsZW1lbnQ7CisgICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBlbGVtZW50QSA9IGVsZW1lbnQucGFydHNbMF07CisgICAgQ29tcGlsYXRpb25Vbml0RWxlbWVudCBlbGVtZW50QiA9IGVsZW1lbnQucGFydHNbMV07CisgICAgaW5kZXguaW5kZXhVbml0KGNvbnRleHQsIGVsZW1lbnRBLm5vZGUpOworICAgIGluZGV4LmluZGV4VW5pdChjb250ZXh0LCBlbGVtZW50Qi5ub2RlKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIG5ldyBFeHBlY3RlZE1hdGNoKAorICAgICAgICAgICAgZWxlbWVudEEsCisgICAgICAgICAgICBNYXRjaEtpbmQuTElCUkFSWV9SRUZFUkVOQ0UsCisgICAgICAgICAgICBjb2RlQS5pbmRleE9mKCdsaWI7IC8vIEEnKSwKKyAgICAgICAgICAgICdsaWInLmxlbmd0aCksCisgICAgICAgIG5ldyBFeHBlY3RlZE1hdGNoKAorICAgICAgICAgICAgZWxlbWVudEIsCisgICAgICAgICAgICBNYXRjaEtpbmQuTElCUkFSWV9SRUZFUkVOQ0UsCisgICAgICAgICAgICBjb2RlQi5pbmRleE9mKCdsaWI7IC8vIEInKSwKKyAgICAgICAgICAgICdsaWInLmxlbmd0aCksXTsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXMoZWxlbWVudCwgZXhwZWN0ZWQpOworICB9CisKKyAgRnV0dXJlIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19Mb2NhbFZhcmlhYmxlRWxlbWVudCgpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK21haW4oKSB7CisgIHZhciB2OworICB2ID0gMTsKKyAgdiArPSAyOworICBwcmludCh2KTsKKyAgdigpOworfQorJycnKTsKKyAgICBMb2NhbFZhcmlhYmxlRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ3YnKTsKKyAgICBFbGVtZW50IG1haW5FbGVtZW50ID0gZmluZEVsZW1lbnQoJ21haW4nKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIF9leHBlY3RJZChtYWluRWxlbWVudCwgTWF0Y2hLaW5kLlZBUklBQkxFX1dSSVRFLCAndiA9IDE7JyksCisgICAgICAgIF9leHBlY3RJZChtYWluRWxlbWVudCwgTWF0Y2hLaW5kLlZBUklBQkxFX1JFQURfV1JJVEUsICd2ICs9IDI7JyksCisgICAgICAgIF9leHBlY3RJZChtYWluRWxlbWVudCwgTWF0Y2hLaW5kLlZBUklBQkxFX1JFQUQsICd2KTsnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW5FbGVtZW50LCBNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCAndigpOycpXTsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXMoZWxlbWVudCwgZXhwZWN0ZWQpOworICB9CisKKyAgRnV0dXJlIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19NZXRob2RFbGVtZW50KCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJworY2xhc3MgQSB7CisgIG0oKSB7fQorICBtYWluKCkgeworICAgIG0oKTsgLy8gMQorICAgIHRoaXMubSgpOyAvLyAyCisgICAgcHJpbnQobSk7IC8vIDMKKyAgICBwcmludCh0aGlzLm0pOyAvLyA0CisgIH0KK30KKycnJyk7CisgICAgTWV0aG9kRWxlbWVudCBtZXRob2QgPSBmaW5kRWxlbWVudCgnbScpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKG1haW5FbGVtZW50LCBNYXRjaEtpbmQuTUVUSE9EX0lOVk9DQVRJT04sICdtKCk7IC8vIDEnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluRWxlbWVudCwgTWF0Y2hLaW5kLk1FVEhPRF9JTlZPQ0FUSU9OLCAnbSgpOyAvLyAyJyksCisgICAgICAgIF9leHBlY3RJZChtYWluRWxlbWVudCwgTWF0Y2hLaW5kLk1FVEhPRF9SRUZFUkVOQ0UsICdtKTsgLy8gMycpLAorICAgICAgICBfZXhwZWN0SWRRKG1haW5FbGVtZW50LCBNYXRjaEtpbmQuTUVUSE9EX1JFRkVSRU5DRSwgJ20pOyAvLyA0JyldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhtZXRob2QsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfTWV0aG9kTWVtYmVyKCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJworY2xhc3MgQTxUPiB7CisgIFQgbSgpID0+IG51bGw7Cit9CittYWluKEE8aW50PiBhKSB7CisgIGEubSgpOyAvLyByZWYKK30KKycnJyk7CisgICAgTWV0aG9kTWVtYmVyIG1ldGhvZCA9IGZpbmROb2RlRWxlbWVudEF0U3RyaW5nKCdtKCk7IC8vIHJlZicpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkUShtYWluRWxlbWVudCwgTWF0Y2hLaW5kLk1FVEhPRF9JTlZPQ0FUSU9OLCAnbSgpOyAvLyByZWYnKV07CisgICAgcmV0dXJuIF92ZXJpZnlSZWZlcmVuY2VzKG1ldGhvZCwgZXhwZWN0ZWQpOworICB9CisKKyAgRnV0dXJlIHRlc3Rfc2VhcmNoUmVmZXJlbmNlc19QYXJhbWV0ZXJFbGVtZW50KCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJworZm9vKHtwfSkgeworICBwID0gMTsKKyAgcCArPSAyOworICBwcmludChwKTsKKyAgcCgpOworfQorbWFpbigpIHsKKyAgZm9vKHA6IDQyKTsKK30KKycnJyk7CisgICAgUGFyYW1ldGVyRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ3AnKTsKKyAgICBFbGVtZW50IGZvb0VsZW1lbnQgPSBmaW5kRWxlbWVudCgnZm9vJyk7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgdmFyIGV4cGVjdGVkID0gWworICAgICAgICBfZXhwZWN0SWQoZm9vRWxlbWVudCwgTWF0Y2hLaW5kLlZBUklBQkxFX1dSSVRFLCAncCA9IDE7JyksCisgICAgICAgIF9leHBlY3RJZChmb29FbGVtZW50LCBNYXRjaEtpbmQuVkFSSUFCTEVfUkVBRF9XUklURSwgJ3AgKz0gMjsnKSwKKyAgICAgICAgX2V4cGVjdElkKGZvb0VsZW1lbnQsIE1hdGNoS2luZC5WQVJJQUJMRV9SRUFELCAncCk7JyksCisgICAgICAgIF9leHBlY3RJZChmb29FbGVtZW50LCBNYXRjaEtpbmQuRlVOQ1RJT05fRVhFQ1VUSU9OLCAncCgpOycpLAorICAgICAgICBfZXhwZWN0SWQobWFpbkVsZW1lbnQsIE1hdGNoS2luZC5OQU1FRF9QQVJBTUVURVJfUkVGRVJFTkNFLCAncDogNDInKV07CisgICAgcmV0dXJuIF92ZXJpZnlSZWZlcmVuY2VzKGVsZW1lbnQsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfUHJvcGVydHlBY2Nlc3NvckVsZW1lbnRfZ2V0dGVyKCkgeworICAgIF9pbmRleFRlc3RVbml0KCcnJworY2xhc3MgQSB7CisgIGdldCBnID0+IG51bGw7CisgIG1haW4oKSB7CisgICAgZzsgLy8gMQorICAgIHRoaXMuZzsgLy8gMgorICB9Cit9CisnJycpOworICAgIFByb3BlcnR5QWNjZXNzb3JFbGVtZW50IGVsZW1lbnQgPSBmaW5kRWxlbWVudCgnZycsIEVsZW1lbnRLaW5kLkdFVFRFUik7CisgICAgRWxlbWVudCBtYWluRWxlbWVudCA9IGZpbmRFbGVtZW50KCdtYWluJyk7CisgICAgdmFyIGV4cGVjdGVkID0gWworICAgICAgICBfZXhwZWN0SWQobWFpbkVsZW1lbnQsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsICdnOyAvLyAxJyksCisgICAgICAgIF9leHBlY3RJZFEobWFpbkVsZW1lbnQsIE1hdGNoS2luZC5QUk9QRVJUWV9BQ0NFU1NPUl9SRUZFUkVOQ0UsICdnOyAvLyAyJyldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50X3NldHRlcigpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIEEgeworICBzZXQgcyh4KSB7fQorICBtYWluKCkgeworICAgIHMgPSAxOworICAgIHRoaXMucyA9IDI7CisgIH0KK30KKycnJyk7CisgICAgUHJvcGVydHlBY2Nlc3NvckVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KCdzPScpOworICAgIEVsZW1lbnQgbWFpbkVsZW1lbnQgPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKG1haW5FbGVtZW50LCBNYXRjaEtpbmQuUFJPUEVSVFlfQUNDRVNTT1JfUkVGRVJFTkNFLCAncyA9IDEnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluRWxlbWVudCwgTWF0Y2hLaW5kLlBST1BFUlRZX0FDQ0VTU09SX1JFRkVSRU5DRSwgJ3MgPSAyJyldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hSZWZlcmVuY2VzX1RvcExldmVsVmFyaWFibGVFbGVtZW50KCkgeworICAgIGFkZFNvdXJjZSgnL2xpYi5kYXJ0JywgJycnCitsaWJyYXJ5IGxpYjsKK3ZhciBWOworJycnKTsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2ltcG9ydCAnbGliLmRhcnQnIHNob3cgVjsgLy8gaW1wCitpbXBvcnQgJ2xpYi5kYXJ0JyBhcyBwcmVmOworbWFpbigpIHsKKyAgViA9IDE7CisgIHByaW50KFYpOworICBWKCk7Cit9CittYWluUSgpIHsKKyAgcHJlZi5WID0gMTsgLy8gUQorICBwcmludChwcmVmLlYpOyAvLyBRCisgIHByZWYuVigpOyAvLyBRCit9CisnJycpOworICAgIEltcG9ydEVsZW1lbnQgaW1wb3J0RWxlbWVudCA9IHRlc3RMaWJyYXJ5RWxlbWVudC5pbXBvcnRzWzBdOworICAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgaW1wVW5pdCA9CisgICAgICAgIGltcG9ydEVsZW1lbnQuaW1wb3J0ZWRMaWJyYXJ5LmRlZmluaW5nQ29tcGlsYXRpb25Vbml0OworICAgIFRvcExldmVsVmFyaWFibGVFbGVtZW50IHZhcmlhYmxlID0gaW1wVW5pdC50b3BMZXZlbFZhcmlhYmxlc1swXTsKKyAgICBFbGVtZW50IG1haW4gPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIEVsZW1lbnQgbWFpblEgPSBmaW5kRWxlbWVudCgnbWFpblEnKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIF9leHBlY3RJZFEodGVzdFVuaXRFbGVtZW50LCBNYXRjaEtpbmQuRklFTERfUkVGRVJFTkNFLCAnVjsgLy8gaW1wJyksCisgICAgICAgIF9leHBlY3RJZChtYWluLCBNYXRjaEtpbmQuRklFTERfV1JJVEUsICdWID0gMTsnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW4sIE1hdGNoS2luZC5GSUVMRF9SRUFELCAnVik7JyksCisgICAgICAgIF9leHBlY3RJZChtYWluLCBNYXRjaEtpbmQuRklFTERfSU5WT0NBVElPTiwgJ1YoKTsnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluUSwgTWF0Y2hLaW5kLkZJRUxEX1dSSVRFLCAnViA9IDE7IC8vIFEnKSwKKyAgICAgICAgX2V4cGVjdElkUShtYWluUSwgTWF0Y2hLaW5kLkZJRUxEX1JFQUQsICdWKTsgLy8gUScpLAorICAgICAgICBfZXhwZWN0SWRRKG1haW5RLCBNYXRjaEtpbmQuRklFTERfSU5WT0NBVElPTiwgJ1YoKTsgLy8gUScpXTsKKyAgICByZXR1cm4gX3ZlcmlmeVJlZmVyZW5jZXModmFyaWFibGUsIGV4cGVjdGVkKTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaFJlZmVyZW5jZXNfVHlwZVBhcmFtZXRlckVsZW1lbnQoKSB7CisgICAgX2luZGV4VGVzdFVuaXQoJycnCitjbGFzcyBBPFQ+IHsKKyAgbWFpbihUIGEsIFQgYikge30KK30KKycnJyk7CisgICAgVHlwZVBhcmFtZXRlckVsZW1lbnQgZWxlbWVudCA9IGZpbmRFbGVtZW50KCdUJyk7CisgICAgRWxlbWVudCBhRWxlbWVudCA9IGZpbmRFbGVtZW50KCdhJyk7CisgICAgRWxlbWVudCBiRWxlbWVudCA9IGZpbmRFbGVtZW50KCdiJyk7CisgICAgdmFyIGV4cGVjdGVkID0gWworICAgICAgICBfZXhwZWN0SWQoYUVsZW1lbnQsIE1hdGNoS2luZC5UWVBFX1BBUkFNRVRFUl9SRUZFUkVOQ0UsICdUIGEnKSwKKyAgICAgICAgX2V4cGVjdElkKGJFbGVtZW50LCBNYXRjaEtpbmQuVFlQRV9QQVJBTUVURVJfUkVGRVJFTkNFLCAnVCBiJyldOworICAgIHJldHVybiBfdmVyaWZ5UmVmZXJlbmNlcyhlbGVtZW50LCBleHBlY3RlZCk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hTdWJ0eXBlcygpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIFQge30KK2NsYXNzIEEgZXh0ZW5kcyBUIHt9IC8vIEEKK2NsYXNzIEIgPSBPYmplY3Qgd2l0aCBUOyAvLyBCCitjbGFzcyBDIGltcGxlbWVudHMgVCB7fSAvLyBDCisnJycpOworICAgIENsYXNzRWxlbWVudCBlbGVtZW50ID0gZmluZEVsZW1lbnQoJ1QnKTsKKyAgICBDbGFzc0VsZW1lbnQgZWxlbWVudEEgPSBmaW5kRWxlbWVudCgnQScpOworICAgIENsYXNzRWxlbWVudCBlbGVtZW50QiA9IGZpbmRFbGVtZW50KCdCJyk7CisgICAgQ2xhc3NFbGVtZW50IGVsZW1lbnRDID0gZmluZEVsZW1lbnQoJ0MnKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIF9leHBlY3RJZChlbGVtZW50QSwgTWF0Y2hLaW5kLkVYVEVORFNfUkVGRVJFTkNFLCAnVCB7fSAvLyBBJyksCisgICAgICAgIF9leHBlY3RJZChlbGVtZW50QiwgTWF0Y2hLaW5kLldJVEhfUkVGRVJFTkNFLCAnVDsgLy8gQicpLAorICAgICAgICBfZXhwZWN0SWQoZWxlbWVudEMsIE1hdGNoS2luZC5JTVBMRU1FTlRTX1JFRkVSRU5DRSwgJ1Qge30gLy8gQycpXTsKKyAgICByZXR1cm4gc2VhcmNoRW5naW5lLnNlYXJjaFN1YnR5cGVzKGVsZW1lbnQpLnRoZW4oKG1hdGNoZXMpIHsKKyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIGV4cGVjdGVkKTsKKyAgICB9KTsKKyAgfQorCisgIEZ1dHVyZSB0ZXN0X3NlYXJjaE1lbWJlclJlZmVyZW5jZXMoKSB7CisgICAgX2luZGV4VGVzdFVuaXQoJycnCitjbGFzcyBBIHsKKyAgdmFyIHRlc3Q7IC8vIEEKKyAgbWFpbkEoKSB7CisgICAgdGVzdCgpOyAvLyBhLWludi1yLW5xCisgICAgdGVzdCA9IDE7IC8vIGEtd3JpdGUtci1ucQorICAgIHRlc3QgKz0gMjsgLy8gYS1yZWFkLXdyaXRlLXItbnEKKyAgICBwcmludCh0ZXN0KTsgLy8gYS1yZWFkLXItbnEKKyAgfQorfQorbWFpbihBIGEsIHApIHsKKyAgYS50ZXN0KCk7IC8vIGEtaW52LXItcQorICBhLnRlc3QgPSAxOyAvLyBhLXdyaXRlLXItcQorICBhLnRlc3QgKz0gMjsgLy8gYS1yZWFkLXdyaXRlLXItcQorICBwcmludChhLnRlc3QpOyAvLyBhLXJlYWQtci1xCisgIHAudGVzdCgpOyAvLyBwLWludi11ci1xCisgIHAudGVzdCA9IDE7IC8vIHAtd3JpdGUtdXItcQorICBwLnRlc3QgKz0gMjsgLy8gcC1yZWFkLXdyaXRlLXVyLXEKKyAgcHJpbnQocC50ZXN0KTsgLy8gcC1yZWFkLXVyLXEKK30KKycnJyk7CisgICAgQ2xhc3NFbGVtZW50IGVsZW1lbnRBID0gZmluZEVsZW1lbnQoJ0EnKTsKKyAgICBDbGFzc0VsZW1lbnQgZWxlbWVudEIgPSBmaW5kRWxlbWVudCgnQicpOworICAgIEVsZW1lbnQgbWFpbkEgPSBmaW5kRWxlbWVudCgnbWFpbkEnKTsKKyAgICBFbGVtZW50IG1haW4gPSBmaW5kRWxlbWVudCgnbWFpbicpOworICAgIHZhciBleHBlY3RlZCA9IFsKKyAgICAgICAgX2V4cGVjdElkKG1haW5BLCBNYXRjaEtpbmQuTkFNRV9JTlZPQ0FUSU9OX1JFU09MVkVELCAndGVzdCgpOyAvLyBhLWludi1yLW5xJyksCisgICAgICAgIF9leHBlY3RJZChtYWluQSwgTWF0Y2hLaW5kLk5BTUVfV1JJVEVfUkVTT0xWRUQsICd0ZXN0ID0gMTsgLy8gYS13cml0ZS1yLW5xJyksCisgICAgICAgIF9leHBlY3RJZChtYWluQSwgTWF0Y2hLaW5kLk5BTUVfUkVBRF9XUklURV9SRVNPTFZFRCwgJ3Rlc3QgKz0gMjsgLy8gYS1yZWFkLXdyaXRlLXItbnEnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW5BLCBNYXRjaEtpbmQuTkFNRV9SRUFEX1JFU09MVkVELCAndGVzdCk7IC8vIGEtcmVhZC1yLW5xJyksCisgICAgICAgIF9leHBlY3RJZChtYWluLCBNYXRjaEtpbmQuTkFNRV9JTlZPQ0FUSU9OX1JFU09MVkVELCAndGVzdCgpOyAvLyBhLWludi1yLXEnKSwKKyAgICAgICAgX2V4cGVjdElkKG1haW4sIE1hdGNoS2luZC5OQU1FX1dSSVRFX1JFU09MVkVELCAndGVzdCA9IDE7IC8vIGEtd3JpdGUtci1xJyksCisgICAgICAgIF9leHBlY3RJZChtYWluLCBNYXRjaEtpbmQuTkFNRV9SRUFEX1dSSVRFX1JFU09MVkVELCAndGVzdCArPSAyOyAvLyBhLXJlYWQtd3JpdGUtci1xJyksCisgICAgICAgIF9leHBlY3RJZChtYWluLCBNYXRjaEtpbmQuTkFNRV9SRUFEX1JFU09MVkVELCAndGVzdCk7IC8vIGEtcmVhZC1yLXEnKSwKKyAgICAgICAgX2V4cGVjdElkVShtYWluLCBNYXRjaEtpbmQuTkFNRV9JTlZPQ0FUSU9OX1VOUkVTT0xWRUQsICd0ZXN0KCk7IC8vIHAtaW52LXVyLXEnKSwKKyAgICAgICAgX2V4cGVjdElkVShtYWluLCBNYXRjaEtpbmQuTkFNRV9XUklURV9VTlJFU09MVkVELCAndGVzdCA9IDE7IC8vIHAtd3JpdGUtdXItcScpLAorICAgICAgICBfZXhwZWN0SWRVKG1haW4sIE1hdGNoS2luZC5OQU1FX1JFQURfV1JJVEVfVU5SRVNPTFZFRCwgJ3Rlc3QgKz0gMjsgLy8gcC1yZWFkLXdyaXRlLXVyLXEnKSwKKyAgICAgICAgX2V4cGVjdElkVShtYWluLCBNYXRjaEtpbmQuTkFNRV9SRUFEX1VOUkVTT0xWRUQsICd0ZXN0KTsgLy8gcC1yZWFkLXVyLXEnKSwKKyAgICAgICAgXTsKKyAgICByZXR1cm4gc2VhcmNoRW5naW5lLnNlYXJjaE1lbWJlclJlZmVyZW5jZXMoJ3Rlc3QnKS50aGVuKChtYXRjaGVzKSB7CisgICAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBleHBlY3RlZCk7CisgICAgfSk7CisgIH0KKworICBGdXR1cmUgdGVzdF9zZWFyY2hUb3BMZXZlbERlY2xhcmF0aW9ucygpIHsKKyAgICBfaW5kZXhUZXN0VW5pdCgnJycKK2NsYXNzIEEge30gLy8gQQorY2xhc3MgQiA9IE9iamVjdCB3aXRoIEE7Cit0eXBlZGVmIEMoKTsKK0QoKSB7fQordmFyIEUgPSBudWxsOworY2xhc3MgTm9NYXRjaEFCQ0RFIHt9CisnJycpOworICAgIE5hbWVFbGVtZW50IGVsZW1lbnQgPSBuZXcgTmFtZUVsZW1lbnQoJ3Rlc3QnKTsKKyAgICBFbGVtZW50IHRvcEEgPSBmaW5kRWxlbWVudCgnQScpOworICAgIEVsZW1lbnQgdG9wQiA9IGZpbmRFbGVtZW50KCdCJyk7CisgICAgRWxlbWVudCB0b3BDID0gZmluZEVsZW1lbnQoJ0MnKTsKKyAgICBFbGVtZW50IHRvcEQgPSBmaW5kRWxlbWVudCgnRCcpOworICAgIEVsZW1lbnQgdG9wRSA9IGZpbmRFbGVtZW50KCdFJyk7CisgICAgRWxlbWVudCB0b3BOb01hdGNoID0gbmV3IE1vY2tFbGVtZW50KCdOb01hdGNoQUJDREUnKTsKKyAgICB2YXIgZXhwZWN0ZWQgPSBbCisgICAgICAgIF9leHBlY3RJZCh0b3BBLCBNYXRjaEtpbmQuQ0xBU1NfREVDTEFSQVRJT04sICdBIHt9IC8vIEEnKSwKKyAgICAgICAgX2V4cGVjdElkKHRvcEIsIE1hdGNoS2luZC5DTEFTU19BTElBU19ERUNMQVJBVElPTiwgJ0IgPScpLAorICAgICAgICBfZXhwZWN0SWQodG9wQywgTWF0Y2hLaW5kLkZVTkNUSU9OX1RZUEVfREVDTEFSQVRJT04sICdDKCknKSwKKyAgICAgICAgX2V4cGVjdElkKHRvcEQsIE1hdGNoS2luZC5GVU5DVElPTl9ERUNMQVJBVElPTiwgJ0QoKSB7fScpLAorICAgICAgICBfZXhwZWN0SWQodG9wRSwgTWF0Y2hLaW5kLlZBUklBQkxFX0RFQ0xBUkFUSU9OLCAnRSA9IG51bGwnKV07CisgICAgcmV0dXJuIF92ZXJpZnlUb3BMZXZlbERlY2xhcmF0aW9ucygnXltBLUVdXCQnLCBleHBlY3RlZCk7CisgIH0KKworICBFeHBlY3RlZE1hdGNoIF9leHBlY3RJZChFbGVtZW50IGVsZW1lbnQsIE1hdGNoS2luZCBraW5kLCBTdHJpbmcgc2VhcmNoLAorICAgICAge2ludCBsZW5ndGgsIGJvb2wgaXNSZXNvbHZlZDogdHJ1ZSwgYm9vbCBpc1F1YWxpZmllZDogZmFsc2V9KSB7CisgICAgaW50IG9mZnNldCA9IGZpbmRPZmZzZXQoc2VhcmNoKTsKKyAgICBpZiAobGVuZ3RoID09IG51bGwpIHsKKyAgICAgIGxlbmd0aCA9IGdldExlYWRpbmdJZGVudGlmaWVyTGVuZ3RoKHNlYXJjaCk7CisgICAgfQorICAgIHJldHVybiBuZXcgRXhwZWN0ZWRNYXRjaCgKKyAgICAgICAgZWxlbWVudCwKKyAgICAgICAga2luZCwKKyAgICAgICAgb2Zmc2V0LAorICAgICAgICBsZW5ndGgsCisgICAgICAgIGlzUmVzb2x2ZWQ6IGlzUmVzb2x2ZWQsCisgICAgICAgIGlzUXVhbGlmaWVkOiBpc1F1YWxpZmllZCk7CisgIH0KKworICBFeHBlY3RlZE1hdGNoIF9leHBlY3RJZFEoRWxlbWVudCBlbGVtZW50LCBNYXRjaEtpbmQga2luZCwgU3RyaW5nIHNlYXJjaCkgeworICAgIHJldHVybiBfZXhwZWN0SWQoZWxlbWVudCwga2luZCwgc2VhcmNoLCBpc1F1YWxpZmllZDogdHJ1ZSk7CisgIH0KKworICBFeHBlY3RlZE1hdGNoIF9leHBlY3RJZFUoRWxlbWVudCBlbGVtZW50LCBNYXRjaEtpbmQga2luZCwgU3RyaW5nIHNlYXJjaCkgeworICAgIHJldHVybiBfZXhwZWN0SWQoZWxlbWVudCwga2luZCwgc2VhcmNoLCBpc1Jlc29sdmVkOiBmYWxzZSk7CisgIH0KKworICB2b2lkIF9pbmRleFRlc3RVbml0KFN0cmluZyBjb2RlKSB7CisgICAgcmVzb2x2ZVRlc3RVbml0KGNvZGUpOworICAgIGluZGV4LmluZGV4VW5pdChjb250ZXh0LCB0ZXN0VW5pdCk7CisgIH0KKworICBGdXR1cmUgX3ZlcmlmeVJlZmVyZW5jZXMoRWxlbWVudCBlbGVtZW50LAorICAgICAgTGlzdDxFeHBlY3RlZE1hdGNoPiBleHBlY3RlZE1hdGNoZXMpIHsKKyAgICByZXR1cm4gc2VhcmNoRW5naW5lLnNlYXJjaFJlZmVyZW5jZXMoCisgICAgICAgIGVsZW1lbnQpLnRoZW4oKExpc3Q8U2VhcmNoTWF0Y2g+IG1hdGNoZXMpIHsKKyAgICAgIF9hc3NlcnRNYXRjaGVzKG1hdGNoZXMsIGV4cGVjdGVkTWF0Y2hlcyk7CisgICAgfSk7CisgIH0KKworICBGdXR1cmUgX3ZlcmlmeVRvcExldmVsRGVjbGFyYXRpb25zKFN0cmluZyBwYXR0ZXJuLAorICAgICAgTGlzdDxFeHBlY3RlZE1hdGNoPiBleHBlY3RlZE1hdGNoZXMpIHsKKyAgICByZXR1cm4gc2VhcmNoRW5naW5lLnNlYXJjaFRvcExldmVsRGVjbGFyYXRpb25zKAorICAgICAgICBwYXR0ZXJuKS50aGVuKChMaXN0PFNlYXJjaE1hdGNoPiBtYXRjaGVzKSB7CisgICAgICBfYXNzZXJ0TWF0Y2hlcyhtYXRjaGVzLCBleHBlY3RlZE1hdGNoZXMpOworICAgIH0pOworICB9CisKKyAgc3RhdGljIHZvaWQgX2Fzc2VydE1hdGNoZXMoTGlzdDxTZWFyY2hNYXRjaD4gbWF0Y2hlcywKKyAgICAgIExpc3Q8RXhwZWN0ZWRNYXRjaD4gZXhwZWN0ZWRNYXRjaGVzKSB7CisgICAgZXhwZWN0KG1hdGNoZXMsIHVub3JkZXJlZEVxdWFscyhleHBlY3RlZE1hdGNoZXMpKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3Qvc2VhcmNoL3Rlc3RfYWxsLmRhcnQgYi9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC9zZWFyY2gvdGVzdF9hbGwuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQyNzJkCi0tLSAvZGV2L251bGwKKysrIGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3Qvc2VhcmNoL3Rlc3RfYWxsLmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IHRlc3Quc2VydmljZXMuc3JjLnNjaGVnbG92LmFsbDsKKworaW1wb3J0ICdwYWNrYWdlOnVuaXR0ZXN0L3VuaXR0ZXN0LmRhcnQnOworCitpbXBvcnQgJ3NlYXJjaF9lbmdpbmVfdGVzdC5kYXJ0JyBhcyBzZWFyY2hfZW5naW5lX3Rlc3Q7CisKKworLyoqCisgKiBVdGlsaXR5IGZvciBtYW51YWxseSBydW5uaW5nIGFsbCB0ZXN0cy4KKyAqLworbWFpbigpIHsKKyAgZ3JvdXBTZXAgPSAnIHwgJzsKKyAgZ3JvdXAoJ3NlYXJjaCcsICgpIHsKKyAgICBzZWFyY2hfZW5naW5lX3Rlc3QubWFpbigpOworICB9KTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC90ZXN0X2FsbC5kYXJ0IGIvcGtnL2FuYWx5c2lzX3NlcnZpY2VzL3Rlc3QvdGVzdF9hbGwuZGFydAppbmRleCBlZThiNDE1Li42ZjBkZjI4IDEwMDY0NAotLS0gYS9wa2cvYW5hbHlzaXNfc2VydmljZXMvdGVzdC90ZXN0X2FsbC5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc19zZXJ2aWNlcy90ZXN0L3Rlc3RfYWxsLmRhcnQKQEAgLTUsOSArNSwxMSBAQAogaW1wb3J0ICdwYWNrYWdlOnVuaXR0ZXN0L3VuaXR0ZXN0LmRhcnQnOwogCiBpbXBvcnQgJ2luZGV4L3Rlc3RfYWxsLmRhcnQnIGFzIGluZGV4X2FsbDsKK2ltcG9ydCAnc2VhcmNoL3Rlc3RfYWxsLmRhcnQnIGFzIHNlYXJjaF9hbGw7CiAKIC8vLyBVdGlsaXR5IGZvciBtYW51YWxseSBydW5uaW5nIGFsbCB0ZXN0cy4KIG1haW4oKSB7CiAgIGdyb3VwU2VwID0gJyB8ICc7CiAgIGluZGV4X2FsbC5tYWluKCk7CisgIHNlYXJjaF9hbGwubWFpbigpOwogfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXNpc190ZXN0aW5nL2xpYi9tb2NrX3Nkay5kYXJ0IGIvcGtnL2FuYWx5c2lzX3Rlc3RpbmcvbGliL21vY2tfc2RrLmRhcnQKaW5kZXggMDUyNTFhYi4uODlkZTliNiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3Rlc3RpbmcvbGliL21vY2tfc2RrLmRhcnQKKysrIGIvcGtnL2FuYWx5c2lzX3Rlc3RpbmcvbGliL21vY2tfc2RrLmRhcnQKQEAgLTY0LDYgKzY0LDggQEAKIAogICAgICAgIi9saWIvbWF0aC9tYXRoLmRhcnQiOiAnJycKICAgICAgICAgICBsaWJyYXJ5IGRhcnQubWF0aDsKKyAgICAgICAgICBjb25zdCBkb3VibGUgRSA9IDIuNzE4MjgxODI4NDU5MDQ1OworICAgICAgICAgIGNvbnN0IGRvdWJsZSBQSSA9IDMuMTQxNTkyNjUzNTg5NzkzMjsKICAgICAgICAgICAnJycKICAgICB9OwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfdGVzdGluZy9saWIvbW9ja3MuZGFydCBiL3BrZy9hbmFseXNpc190ZXN0aW5nL2xpYi9tb2Nrcy5kYXJ0CmluZGV4IDgwYWVkODYuLmFhMWVkZWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXNpc190ZXN0aW5nL2xpYi9tb2Nrcy5kYXJ0CisrKyBiL3BrZy9hbmFseXNpc190ZXN0aW5nL2xpYi9tb2Nrcy5kYXJ0CkBAIC0xNiwyNCArMTYsNzggQEAKIH0KIAogCitjbGFzcyBNb2NrQ2xhc3NFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgQ2xhc3NFbGVtZW50IHsKKyAgZmluYWwgRWxlbWVudEtpbmQga2luZCA9IEVsZW1lbnRLaW5kLkNMQVNTOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKwogY2xhc3MgTW9ja0NvbXBpbGF0aW9uVW5pdEVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cwogICAgIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQgeworICBmaW5hbCBFbGVtZW50S2luZCBraW5kID0gRWxlbWVudEtpbmQuQ09NUElMQVRJT05fVU5JVDsKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworfQorCisKK2NsYXNzIE1vY2tDb25zdHJ1Y3RvckVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cyBDb25zdHJ1Y3RvckVsZW1lbnQgeworICBmaW5hbCBraW5kID0gRWxlbWVudEtpbmQuQ09OU1RSVUNUT1I7CiAgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKIH0KIAogCiBjbGFzcyBNb2NrRWxlbWVudCBleHRlbmRzIFN0cmluZ1R5cGVkTW9jayBpbXBsZW1lbnRzIEVsZW1lbnQgewogICBNb2NrRWxlbWVudChbU3RyaW5nIG5hbWUgPSAnPGVsZW1lbnQ+J10pIDogc3VwZXIobmFtZSk7CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyBnZXQgZGlzcGxheU5hbWUgPT4gX3RvU3RyaW5nOworCisgIEBvdmVycmlkZQorICBTdHJpbmcgZ2V0IG5hbWUgPT4gX3RvU3RyaW5nOworCisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworCitjbGFzcyBNb2NrRmllbGRFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgRmllbGRFbGVtZW50IHsKKyAgZmluYWwgRWxlbWVudEtpbmQga2luZCA9IEVsZW1lbnRLaW5kLkZJRUxEOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKworY2xhc3MgTW9ja0Z1bmN0aW9uRWxlbWVudCBleHRlbmRzIFR5cGVkTW9jayBpbXBsZW1lbnRzIEZ1bmN0aW9uRWxlbWVudCB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQgPSBFbGVtZW50S2luZC5GVU5DVElPTjsKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworfQorCisKK2NsYXNzIE1vY2tGdW5jdGlvblR5cGVBbGlhc0VsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cworICAgIEZ1bmN0aW9uVHlwZUFsaWFzRWxlbWVudCB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQgPSBFbGVtZW50S2luZC5GVU5DVElPTl9UWVBFX0FMSUFTOwogICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7CiB9CiAKIAogY2xhc3MgTW9ja0h0bWxFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgSHRtbEVsZW1lbnQgeworICBmaW5hbCBFbGVtZW50S2luZCBraW5kID0gRWxlbWVudEtpbmQuSFRNTDsKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworfQorCisKK2NsYXNzIE1vY2tJbXBvcnRFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgSW1wb3J0RWxlbWVudCB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQgPSBFbGVtZW50S2luZC5JTVBPUlQ7CiAgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKIH0KIAogCiBjbGFzcyBNb2NrTGlicmFyeUVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cyBMaWJyYXJ5RWxlbWVudCB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQgPSBFbGVtZW50S2luZC5MSUJSQVJZOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKworY2xhc3MgTW9ja0xvY2FsVmFyaWFibGVFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMgTG9jYWxWYXJpYWJsZUVsZW1lbnQKKyAgICB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQgPSBFbGVtZW50S2luZC5MT0NBTF9WQVJJQUJMRTsKICAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOwogfQogCkBAIC00MywxMiArOTcsNDcgQEAKIH0KIAogCitjbGFzcyBNb2NrTWV0aG9kRWxlbWVudCBleHRlbmRzIFN0cmluZ1R5cGVkTW9jayBpbXBsZW1lbnRzIE1ldGhvZEVsZW1lbnQgeworICBmaW5hbCBraW5kID0gRWxlbWVudEtpbmQuTUVUSE9EOworICBNb2NrTWV0aG9kRWxlbWVudChbU3RyaW5nIG5hbWUgPSAnbWV0aG9kJ10pIDogc3VwZXIobmFtZSk7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworCitjbGFzcyBNb2NrUGFyYW1ldGVyRWxlbWVudCBleHRlbmRzIFR5cGVkTW9jayBpbXBsZW1lbnRzIFBhcmFtZXRlckVsZW1lbnQgeworICBmaW5hbCBFbGVtZW50S2luZCBraW5kID0gRWxlbWVudEtpbmQuUEFSQU1FVEVSOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKworY2xhc3MgTW9ja1Byb3BlcnR5QWNjZXNzb3JFbGVtZW50IGV4dGVuZHMgVHlwZWRNb2NrIGltcGxlbWVudHMKKyAgICBQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCB7CisgIGZpbmFsIEVsZW1lbnRLaW5kIGtpbmQ7CisgIE1vY2tQcm9wZXJ0eUFjY2Vzc29yRWxlbWVudCh0aGlzLmtpbmQpOworICBub1N1Y2hNZXRob2QoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSA9PiBzdXBlci5ub1N1Y2hNZXRob2QoaW52b2NhdGlvbik7Cit9CisKKwogY2xhc3MgTW9ja1NvdXJjZSBleHRlbmRzIFN0cmluZ1R5cGVkTW9jayBpbXBsZW1lbnRzIFNvdXJjZSB7CiAgIE1vY2tTb3VyY2UoW1N0cmluZyBuYW1lID0gJ21vY2tlZC5kYXJ0J10pIDogc3VwZXIobmFtZSk7CiAgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKIH0KIAogCitjbGFzcyBNb2NrVG9wTGV2ZWxWYXJpYWJsZUVsZW1lbnQgZXh0ZW5kcyBUeXBlZE1vY2sgaW1wbGVtZW50cworICAgIFRvcExldmVsVmFyaWFibGVFbGVtZW50IHsKKyAgZmluYWwgRWxlbWVudEtpbmQga2luZCA9IEVsZW1lbnRLaW5kLlRPUF9MRVZFTF9WQVJJQUJMRTsKKyAgbm9TdWNoTWV0aG9kKEludm9jYXRpb24gaW52b2NhdGlvbikgPT4gc3VwZXIubm9TdWNoTWV0aG9kKGludm9jYXRpb24pOworfQorCisKK2NsYXNzIE1vY2tUeXBlUGFyYW1ldGVyRWxlbWVudCBleHRlbmRzIFR5cGVkTW9jayBpbXBsZW1lbnRzIFR5cGVQYXJhbWV0ZXJFbGVtZW50CisgICAgeworICBmaW5hbCBFbGVtZW50S2luZCBraW5kID0gRWxlbWVudEtpbmQuVFlQRV9QQVJBTUVURVI7CisgIG5vU3VjaE1ldGhvZChJbnZvY2F0aW9uIGludm9jYXRpb24pID0+IHN1cGVyLm5vU3VjaE1ldGhvZChpbnZvY2F0aW9uKTsKK30KKworCiBjbGFzcyBTdHJpbmdUeXBlZE1vY2sgZXh0ZW5kcyBUeXBlZE1vY2sgewogICBTdHJpbmcgX3RvU3RyaW5nOwogCmRpZmYgLS1naXQgYS9wa2cvYW5hbHlzaXNfdGVzdGluZy9wdWJzcGVjLnlhbWwgYi9wa2cvYW5hbHlzaXNfdGVzdGluZy9wdWJzcGVjLnlhbWwKaW5kZXggZjA2NDc4OC4uODRjNjYzMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5c2lzX3Rlc3RpbmcvcHVic3BlYy55YW1sCisrKyBiL3BrZy9hbmFseXNpc190ZXN0aW5nL3B1YnNwZWMueWFtbApAQCAtMSwxMSArMSwxMSBAQAogbmFtZTogYW5hbHlzaXNfdGVzdGluZwotdmVyc2lvbjogMC4yLjAKK3ZlcnNpb246IDAuMy4wCiBhdXRob3I6IERhcnQgVGVhbSA8bWlzY0BkYXJ0bGFuZy5vcmc+CiBkZXNjcmlwdGlvbjogQSBzZXQgb2YgbGlicmFyaWVzIGZvciB0ZXN0aW5nIEFuYWx5c2lzIHNlcnZpY2VzIGFuZCBzZXJ2ZXIKIGhvbWVwYWdlOiBodHRwOi8vd3d3LmRhcnRsYW5nLm9yZwogZW52aXJvbm1lbnQ6CiAgIHNkazogJz49MS4wLjAgPDIuMC4wJwogZGVwZW5kZW5jaWVzOgotICBhbmFseXplcjogJz49MC4yMS4wIDwxLjAuMCcKKyAgYW5hbHl6ZXI6ICc+PTAuMjEuMSA8MS4wLjAnCiAgIHR5cGVkX21vY2s6ICc+PTAuMC40IDwxLjAuMCcKICAgdW5pdHRlc3Q6ICc+PTAuMTAuMCA8MC4xMi4wJwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2FzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2FzdC5kYXJ0CmluZGV4IGRiMjgyZDkuLjQ5NWY2MTggMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9hc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvYXN0LmRhcnQKQEAgLTE3LDYgKzE3LDcgQEAKIGltcG9ydCAndXRpbGl0aWVzX2NvbGxlY3Rpb24uZGFydCcgc2hvdyBUb2tlbk1hcDsKIGltcG9ydCAnZWxlbWVudC5kYXJ0JzsKIGltcG9ydCAnY29uc3RhbnQuZGFydCc7CitpbXBvcnQgJ3BhcnNlci5kYXJ0JzsKIAogLyoqCiAgKiBJbnN0YW5jZXMgb2YgdGhlIGNsYXNzIGBBZGphY2VudFN0cmluZ3NgIHJlcHJlc2VudHMgdHdvIG9yIG1vcmUgc3RyaW5nIGxpdGVyYWxzIHRoYXQgYXJlCkBAIC05OTEsMTMgKzk5MiwxNiBAQAogICBBc3NpZ25tZW50RXhwcmVzc2lvbiB2aXNpdEFzc2lnbm1lbnRFeHByZXNzaW9uKEFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUpID0+IG5ldyBBc3NpZ25tZW50RXhwcmVzc2lvbihjbG9uZU5vZGUobm9kZS5sZWZ0SGFuZFNpZGUpLCBub2RlLm9wZXJhdG9yLCBjbG9uZU5vZGUobm9kZS5yaWdodEhhbmRTaWRlKSk7CiAKICAgQG92ZXJyaWRlCisgIEF3YWl0RXhwcmVzc2lvbiB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgPT4gbmV3IEF3YWl0RXhwcmVzc2lvbihub2RlLmF3YWl0S2V5d29yZCwgbm9kZS5leHByZXNzaW9uLCBub2RlLnNlbWljb2xvbik7CisKKyAgQG92ZXJyaWRlCiAgIEJpbmFyeUV4cHJlc3Npb24gdmlzaXRCaW5hcnlFeHByZXNzaW9uKEJpbmFyeUV4cHJlc3Npb24gbm9kZSkgPT4gbmV3IEJpbmFyeUV4cHJlc3Npb24oY2xvbmVOb2RlKG5vZGUubGVmdE9wZXJhbmQpLCBub2RlLm9wZXJhdG9yLCBjbG9uZU5vZGUobm9kZS5yaWdodE9wZXJhbmQpKTsKIAogICBAb3ZlcnJpZGUKICAgQmxvY2sgdmlzaXRCbG9jayhCbG9jayBub2RlKSA9PiBuZXcgQmxvY2sobm9kZS5sZWZ0QnJhY2tldCwgY2xvbmVOb2RlTGlzdChub2RlLnN0YXRlbWVudHMpLCBub2RlLnJpZ2h0QnJhY2tldCk7CiAKICAgQG92ZXJyaWRlCi0gIEJsb2NrRnVuY3Rpb25Cb2R5IHZpc2l0QmxvY2tGdW5jdGlvbkJvZHkoQmxvY2tGdW5jdGlvbkJvZHkgbm9kZSkgPT4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KGNsb25lTm9kZShub2RlLmJsb2NrKSk7CisgIEJsb2NrRnVuY3Rpb25Cb2R5IHZpc2l0QmxvY2tGdW5jdGlvbkJvZHkoQmxvY2tGdW5jdGlvbkJvZHkgbm9kZSkgPT4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KG5vZGUua2V5d29yZCwgbm9kZS5zdGFyLCBjbG9uZU5vZGUobm9kZS5ibG9jaykpOwogCiAgIEBvdmVycmlkZQogICBCb29sZWFuTGl0ZXJhbCB2aXNpdEJvb2xlYW5MaXRlcmFsKEJvb2xlYW5MaXRlcmFsIG5vZGUpID0+IG5ldyBCb29sZWFuTGl0ZXJhbChub2RlLmxpdGVyYWwsIG5vZGUudmFsdWUpOwpAQCAtMTA4Myw3ICsxMDg3LDcgQEAKICAgfQogCiAgIEBvdmVycmlkZQotICBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IHZpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keShFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IG5vZGUpID0+IG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5vZGUuZnVuY3Rpb25EZWZpbml0aW9uLCBjbG9uZU5vZGUobm9kZS5leHByZXNzaW9uKSwgbm9kZS5zZW1pY29sb24pOworICBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IHZpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keShFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IG5vZGUpID0+IG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG5vZGUua2V5d29yZCwgbm9kZS5mdW5jdGlvbkRlZmluaXRpb24sIGNsb25lTm9kZShub2RlLmV4cHJlc3Npb24pLCBub2RlLnNlbWljb2xvbik7CiAKICAgQG92ZXJyaWRlCiAgIEV4cHJlc3Npb25TdGF0ZW1lbnQgdmlzaXRFeHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSkgPT4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoY2xvbmVOb2RlKG5vZGUuZXhwcmVzc2lvbiksIG5vZGUuc2VtaWNvbG9uKTsKQEAgLTExMDEsOSArMTEwNSw5IEBACiAgIEZvckVhY2hTdGF0ZW1lbnQgdmlzaXRGb3JFYWNoU3RhdGVtZW50KEZvckVhY2hTdGF0ZW1lbnQgbm9kZSkgewogICAgIERlY2xhcmVkSWRlbnRpZmllciBsb29wVmFyaWFibGUgPSBub2RlLmxvb3BWYXJpYWJsZTsKICAgICBpZiAobG9vcFZhcmlhYmxlID09IG51bGwpIHsKLSAgICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKG5vZGUuZm9yS2V5d29yZCwgbm9kZS5sZWZ0UGFyZW50aGVzaXMsIGNsb25lTm9kZShub2RlLmlkZW50aWZpZXIpLCBub2RlLmluS2V5d29yZCwgY2xvbmVOb2RlKG5vZGUuaXRlcmF0b3IpLCBub2RlLnJpZ2h0UGFyZW50aGVzaXMsIGNsb25lTm9kZShub2RlLmJvZHkpKTsKKyAgICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKG5vZGUuYXdhaXRLZXl3b3JkLCBub2RlLmZvcktleXdvcmQsIG5vZGUubGVmdFBhcmVudGhlc2lzLCBjbG9uZU5vZGUobm9kZS5pZGVudGlmaWVyKSwgbm9kZS5pbktleXdvcmQsIGNsb25lTm9kZShub2RlLml0ZXJhdG9yKSwgbm9kZS5yaWdodFBhcmVudGhlc2lzLCBjbG9uZU5vZGUobm9kZS5ib2R5KSk7CiAgICAgfQotICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24xKG5vZGUuZm9yS2V5d29yZCwgbm9kZS5sZWZ0UGFyZW50aGVzaXMsIGNsb25lTm9kZShsb29wVmFyaWFibGUpLCBub2RlLmluS2V5d29yZCwgY2xvbmVOb2RlKG5vZGUuaXRlcmF0b3IpLCBub2RlLnJpZ2h0UGFyZW50aGVzaXMsIGNsb25lTm9kZShub2RlLmJvZHkpKTsKKyAgICByZXR1cm4gbmV3IEZvckVhY2hTdGF0ZW1lbnQuY29uMShub2RlLmF3YWl0S2V5d29yZCwgbm9kZS5mb3JLZXl3b3JkLCBub2RlLmxlZnRQYXJlbnRoZXNpcywgY2xvbmVOb2RlKGxvb3BWYXJpYWJsZSksIG5vZGUuaW5LZXl3b3JkLCBjbG9uZU5vZGUobm9kZS5pdGVyYXRvciksIG5vZGUucmlnaHRQYXJlbnRoZXNpcywgY2xvbmVOb2RlKG5vZGUuYm9keSkpOwogICB9CiAKICAgQG92ZXJyaWRlCkBAIC0xMzIxLDYgKzEzMjUsOSBAQAogICBAb3ZlcnJpZGUKICAgV2l0aENsYXVzZSB2aXNpdFdpdGhDbGF1c2UoV2l0aENsYXVzZSBub2RlKSA9PiBuZXcgV2l0aENsYXVzZShub2RlLndpdGhLZXl3b3JkLCBjbG9uZU5vZGVMaXN0KG5vZGUubWl4aW5UeXBlcykpOwogCisgIEBvdmVycmlkZQorICBZaWVsZFN0YXRlbWVudCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IG5ldyBZaWVsZFN0YXRlbWVudChub2RlLnlpZWxkS2V5d29yZCwgbm9kZS5zdGFyLCBub2RlLmV4cHJlc3Npb24sIG5vZGUuc2VtaWNvbG9uKTsKKwogICBBc3ROb2RlIGNsb25lTm9kZShBc3ROb2RlIG5vZGUpIHsKICAgICBpZiAobm9kZSA9PSBudWxsKSB7CiAgICAgICByZXR1cm4gbnVsbDsKQEAgLTEzODksNiArMTM5NiwxMiBAQAogICB9CiAKICAgQG92ZXJyaWRlCisgIGJvb2wgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKKyAgICBBd2FpdEV4cHJlc3Npb24gb3RoZXIgPSB0aGlzLl9vdGhlciBhcyBBd2FpdEV4cHJlc3Npb247CisgICAgcmV0dXJuIF9pc0VxdWFsVG9rZW5zKG5vZGUuYXdhaXRLZXl3b3JkLCBvdGhlci5hd2FpdEtleXdvcmQpICYmIF9pc0VxdWFsTm9kZXMobm9kZS5leHByZXNzaW9uLCBvdGhlci5leHByZXNzaW9uKSAmJiBfaXNFcXVhbFRva2Vucyhub2RlLnNlbWljb2xvbiwgb3RoZXIuc2VtaWNvbG9uKTsKKyAgfQorCisgIEBvdmVycmlkZQogICBib29sIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKICAgICBCaW5hcnlFeHByZXNzaW9uIG90aGVyID0gdGhpcy5fb3RoZXIgYXMgQmluYXJ5RXhwcmVzc2lvbjsKICAgICByZXR1cm4gX2lzRXF1YWxOb2Rlcyhub2RlLmxlZnRPcGVyYW5kLCBvdGhlci5sZWZ0T3BlcmFuZCkgJiYgX2lzRXF1YWxUb2tlbnMobm9kZS5vcGVyYXRvciwgb3RoZXIub3BlcmF0b3IpICYmIF9pc0VxdWFsTm9kZXMobm9kZS5yaWdodE9wZXJhbmQsIG90aGVyLnJpZ2h0T3BlcmFuZCk7CkBAIC0xOTY0LDYgKzE5NzcsMTIgQEAKICAgICByZXR1cm4gX2lzRXF1YWxUb2tlbnMobm9kZS53aXRoS2V5d29yZCwgb3RoZXIud2l0aEtleXdvcmQpICYmIF9pc0VxdWFsTm9kZUxpc3RzKG5vZGUubWl4aW5UeXBlcywgb3RoZXIubWl4aW5UeXBlcyk7CiAgIH0KIAorICBAb3ZlcnJpZGUKKyAgYm9vbCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKKyAgICBZaWVsZFN0YXRlbWVudCBvdGhlciA9IHRoaXMuX290aGVyIGFzIFlpZWxkU3RhdGVtZW50OworICAgIHJldHVybiBfaXNFcXVhbFRva2Vucyhub2RlLnlpZWxkS2V5d29yZCwgb3RoZXIueWllbGRLZXl3b3JkKSAmJiBfaXNFcXVhbE5vZGVzKG5vZGUuZXhwcmVzc2lvbiwgb3RoZXIuZXhwcmVzc2lvbikgJiYgX2lzRXF1YWxUb2tlbnMobm9kZS5zZW1pY29sb24sIG90aGVyLnNlbWljb2xvbik7CisgIH0KKwogICAvKioKICAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gbGlzdHMgb2YgQVNUIG5vZGVzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhbmQgY29ycmVzcG9uZGluZwogICAgKiBlbGVtZW50cyBhcmUgZXF1YWwuCkBAIC0yMzAzLDYgKzIzMjIsOCBAQAogCiAgIFIgdmlzaXRBc3NpZ25tZW50RXhwcmVzc2lvbihBc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlKTsKIAorICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKTsKKwogICBSIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpOwogCiAgIFIgdmlzaXRCbG9jayhCbG9jayBub2RlKTsKQEAgLTI0OTQsNiArMjUxNSw4MiBAQAogICBSIHZpc2l0V2hpbGVTdGF0ZW1lbnQoV2hpbGVTdGF0ZW1lbnQgbm9kZSk7CiAKICAgUiB2aXNpdFdpdGhDbGF1c2UoV2l0aENsYXVzZSBub2RlKTsKKworICBSIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSk7Cit9CisKKy8qKgorICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyBgQXdhaXRFeHByZXNzaW9uYCBpbXBsZW1lbnQgYW4gYXdhaXQgZXhwcmVzc2lvbi4KKyAqLworY2xhc3MgQXdhaXRFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgIC8qKgorICAgKiBUaGUgJ2F3YWl0JyBrZXl3b3JkLgorICAgKi8KKyAgVG9rZW4gYXdhaXRLZXl3b3JkOworCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBiZWluZyB3YWl0ZWQgb24uCisgICAqLworICBFeHByZXNzaW9uIF9leHByZXNzaW9uOworCisgIC8qKgorICAgKiBUaGUgc2VtaWNvbG9uIGZvbGxvd2luZyB0aGUgZXhwcmVzc2lvbi4KKyAgICovCisgIFRva2VuIHNlbWljb2xvbjsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgYXdhaXQgZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQHBhcmFtIGF3YWl0S2V5d29yZCB0aGUgJ2F3YWl0JyBrZXl3b3JkCisgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGJlaW5nIHdhaXRlZCBvbgorICAgKiBAcGFyYW0gc2VtaWNvbG9uIHRoZSBzZW1pY29sb24gZm9sbG93aW5nIHRoZSBleHByZXNzaW9uCisgICAqLworICBBd2FpdEV4cHJlc3Npb24odGhpcy5hd2FpdEtleXdvcmQsIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgdGhpcy5zZW1pY29sb24pIHsKKyAgICB0aGlzLl9leHByZXNzaW9uID0gYmVjb21lUGFyZW50T2YoZXhwcmVzc2lvbik7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgYWNjZXB0KEFzdFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdEF3YWl0RXhwcmVzc2lvbih0aGlzKTsKKworICBAb3ZlcnJpZGUKKyAgVG9rZW4gZ2V0IGJlZ2luVG9rZW4geworICAgIGlmIChhd2FpdEtleXdvcmQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIGF3YWl0S2V5d29yZDsKKyAgICB9CisgICAgcmV0dXJuIF9leHByZXNzaW9uLmJlZ2luVG9rZW47CisgIH0KKworICBAb3ZlcnJpZGUKKyAgVG9rZW4gZ2V0IGVuZFRva2VuIHsKKyAgICBpZiAoc2VtaWNvbG9uICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBzZW1pY29sb247CisgICAgfQorICAgIHJldHVybiBfZXhwcmVzc2lvbi5lbmRUb2tlbjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgaXMgYmVpbmcgd2FpdGVkIG9uLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGJlaW5nIHdhaXRlZCBvbgorICAgKi8KKyAgRXhwcmVzc2lvbiBnZXQgZXhwcmVzc2lvbiA9PiBfZXhwcmVzc2lvbjsKKworICBAb3ZlcnJpZGUKKyAgaW50IGdldCBwcmVjZWRlbmNlID0+IDA7CisKKyAgLyoqCisgICAqIFNldCB0aGUgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSBpcyBiZWluZyB3YWl0ZWQgb24gdG8gdGhlIGdpdmVuIGV4cHJlc3Npb24uCisgICAqCisgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIGlzIGJlaW5nIHdhaXRlZCBvbgorICAgKi8KKyAgdm9pZCBzZXQgZXhwcmVzc2lvbihFeHByZXNzaW9uIGV4cHJlc3Npb24pIHsKKyAgICB0aGlzLl9leHByZXNzaW9uID0gYmVjb21lUGFyZW50T2YoZXhwcmVzc2lvbik7CisgIH0KKworICBAb3ZlcnJpZGUKKyAgdm9pZCB2aXNpdENoaWxkcmVuKEFzdFZpc2l0b3IgdmlzaXRvcikgeworICAgIHNhZmVseVZpc2l0Q2hpbGQoX2V4cHJlc3Npb24sIHZpc2l0b3IpOworICB9CiB9CiAKIC8qKgpAQCAtMjc1OSwxMSArMjg1NiwyMiBAQAogICoKICAqIDxwcmU+CiAgKiBibG9ja0Z1bmN0aW9uQm9keSA6Oj0KLSAqICAgICBbQmxvY2tdCisgKiAgICAgKCdhc3luYycgfCAnYXN5bmMnICcqJyB8ICdzeW5jJyAnKicpPyBbQmxvY2tdCiAgKiA8L3ByZT4KICAqLwogY2xhc3MgQmxvY2tGdW5jdGlvbkJvZHkgZXh0ZW5kcyBGdW5jdGlvbkJvZHkgewogICAvKioKKyAgICogVGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2FzeW5jJyBvciAnc3luYycga2V5d29yZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2gKKyAgICoga2V5d29yZC4KKyAgICovCisgIFRva2VuIGtleXdvcmQ7CisKKyAgLyoqCisgICAqIFRoZSBzdGFyIG9wdGlvbmFsbHkgZm9sbG93aW5nIHRoZSAnYXN5bmMnIG9yIGZvbGxvd2luZyB0aGUgJ3N5bmMnIGtleXdvcmQuCisgICAqLworICBUb2tlbiBzdGFyOworCisgIC8qKgogICAgKiBUaGUgYmxvY2sgcmVwcmVzZW50aW5nIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4KICAgICovCiAgIEJsb2NrIF9ibG9jazsKQEAgLTI3NzEsOSArMjg3OSwxMSBAQAogICAvKioKICAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZnVuY3Rpb24gYm9keSBjb25zaXN0aW5nIG9mIGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KICAgICoKKyAgICogQHBhcmFtIGtleXdvcmQgdGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2FzeW5jJyBvciAnc3luYycga2V5d29yZAorICAgKiBAcGFyYW0gc3RhciB0aGUgc3RhciBmb2xsb3dpbmcgdGhlICdhc3luYycgb3IgJ3N5bmMnIGtleXdvcmQKICAgICogQHBhcmFtIGJsb2NrIHRoZSBibG9jayByZXByZXNlbnRpbmcgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uCiAgICAqLwotICBCbG9ja0Z1bmN0aW9uQm9keShCbG9jayBibG9jaykgeworICBCbG9ja0Z1bmN0aW9uQm9keSh0aGlzLmtleXdvcmQsIHRoaXMuc3RhciwgQmxvY2sgYmxvY2spIHsKICAgICB0aGlzLl9ibG9jayA9IGJlY29tZVBhcmVudE9mKGJsb2NrKTsKICAgfQogCkBAIC0yNzkzLDYgKzI5MDMsMjEgQEAKICAgQG92ZXJyaWRlCiAgIFRva2VuIGdldCBlbmRUb2tlbiA9PiBfYmxvY2suZW5kVG9rZW47CiAKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzQXN5bmNocm9ub3VzIHsKKyAgICBpZiAoa2V5d29yZCA9PSBudWxsKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0cmluZyBrZXl3b3JkVmFsdWUgPSBrZXl3b3JkLmxleGVtZTsKKyAgICByZXR1cm4ga2V5d29yZFZhbHVlID09IFBhcnNlci5BU1lOQzsKKyAgfQorCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc0dlbmVyYXRvciA9PiBzdGFyICE9IG51bGw7CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzU3luY2hyb25vdXMgPT4ga2V5d29yZCA9PSBudWxsIHx8IGtleXdvcmQubGV4ZW1lICE9IFBhcnNlci5BU1lOQzsKKwogICAvKioKICAgICogU2V0IHRoZSBibG9jayByZXByZXNlbnRpbmcgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uIHRvIHRoZSBnaXZlbiBibG9jay4KICAgICoKQEAgLTYyMjEsMTEgKzYzNDYsMTYgQEAKICAqCiAgKiA8cHJlPgogICogZXhwcmVzc2lvbkZ1bmN0aW9uQm9keSA6Oj0KLSAqICAgICAnPT4nIFtFeHByZXNzaW9uXSAnOycKKyAqICAgICAnYXN5bmMnPyAnPT4nIFtFeHByZXNzaW9uXSAnOycKICAqIDwvcHJlPgogICovCiBjbGFzcyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IGV4dGVuZHMgRnVuY3Rpb25Cb2R5IHsKICAgLyoqCisgICAqIFRoZSB0b2tlbiByZXByZXNlbnRpbmcgdGhlICdhc3luYycga2V5d29yZCwgb3IgYG51bGxgIGlmIHRoZXJlIGlzIG5vIHN1Y2gga2V5d29yZC4KKyAgICovCisgIFRva2VuIGtleXdvcmQ7CisKKyAgLyoqCiAgICAqIFRoZSB0b2tlbiBpbnRyb2R1Y2luZyB0aGUgZXhwcmVzc2lvbiB0aGF0IHJlcHJlc2VudHMgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgogICAgKi8KICAgVG9rZW4gZnVuY3Rpb25EZWZpbml0aW9uOwpAQCAtNjI0MywxMiArNjM3MywxMyBAQAogICAvKioKICAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgZnVuY3Rpb24gYm9keSBjb25zaXN0aW5nIG9mIGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KICAgICoKKyAgICogQHBhcmFtIGtleXdvcmQgdGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2FzeW5jJyBrZXl3b3JkCiAgICAqIEBwYXJhbSBmdW5jdGlvbkRlZmluaXRpb24gdGhlIHRva2VuIGludHJvZHVjaW5nIHRoZSBleHByZXNzaW9uIHRoYXQgcmVwcmVzZW50cyB0aGUgYm9keSBvZiB0aGUKICAgICogICAgICAgICAgZnVuY3Rpb24KICAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbgogICAgKiBAcGFyYW0gc2VtaWNvbG9uIHRoZSBzZW1pY29sb24gdGVybWluYXRpbmcgdGhlIHN0YXRlbWVudAogICAgKi8KLSAgRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSh0aGlzLmZ1bmN0aW9uRGVmaW5pdGlvbiwgRXhwcmVzc2lvbiBleHByZXNzaW9uLCB0aGlzLnNlbWljb2xvbikgeworICBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KHRoaXMua2V5d29yZCwgdGhpcy5mdW5jdGlvbkRlZmluaXRpb24sIEV4cHJlc3Npb24gZXhwcmVzc2lvbiwgdGhpcy5zZW1pY29sb24pIHsKICAgICB0aGlzLl9leHByZXNzaW9uID0gYmVjb21lUGFyZW50T2YoZXhwcmVzc2lvbik7CiAgIH0KIApAQCAtNjI3Myw2ICs2NDA0LDEyIEBACiAgICAqLwogICBFeHByZXNzaW9uIGdldCBleHByZXNzaW9uID0+IF9leHByZXNzaW9uOwogCisgIEBvdmVycmlkZQorICBib29sIGdldCBpc0FzeW5jaHJvbm91cyA9PiBrZXl3b3JkICE9IG51bGw7CisKKyAgQG92ZXJyaWRlCisgIGJvb2wgZ2V0IGlzU3luY2hyb25vdXMgPT4ga2V5d29yZCA9PSBudWxsOworCiAgIC8qKgogICAgKiBTZXQgdGhlIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiB0byB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KICAgICoKQEAgLTY2MjksMTIgKzY3NjYsMTcgQEAKICAqCiAgKiA8cHJlPgogICogZm9yRWFjaFN0YXRlbWVudCA6Oj0KLSAqICAgICAnZm9yJyAnKCcgW0RlY2xhcmVkSWRlbnRpZmllcl0gJ2luJyBbRXhwcmVzc2lvbl0gJyknIFtCbG9ja10KLSAqICAgfCAnZm9yJyAnKCcgW1NpbXBsZUlkZW50aWZpZXJdICdpbicgW0V4cHJlc3Npb25dICcpJyBbQmxvY2tdCisgKiAgICAgJ2F3YWl0Jz8gJ2ZvcicgJygnIFtEZWNsYXJlZElkZW50aWZpZXJdICdpbicgW0V4cHJlc3Npb25dICcpJyBbQmxvY2tdCisgKiAgIHwgJ2F3YWl0Jz8gJ2ZvcicgJygnIFtTaW1wbGVJZGVudGlmaWVyXSAnaW4nIFtFeHByZXNzaW9uXSAnKScgW0Jsb2NrXQogICogPC9wcmU+CiAgKi8KIGNsYXNzIEZvckVhY2hTdGF0ZW1lbnQgZXh0ZW5kcyBTdGF0ZW1lbnQgewogICAvKioKKyAgICogVGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2F3YWl0JyBrZXl3b3JkLCBvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gJ2F3YWl0JyBrZXl3b3JkLgorICAgKi8KKyAgVG9rZW4gYXdhaXRLZXl3b3JkOworCisgIC8qKgogICAgKiBUaGUgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSAnZm9yJyBrZXl3b3JkLgogICAgKi8KICAgVG9rZW4gZm9yS2V5d29yZDsKQEAgLTY2NzgsNiArNjgyMCw3IEBACiAgIC8qKgogICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBmb3ItZWFjaCBzdGF0ZW1lbnQuCiAgICAqCisgICAqIEBwYXJhbSBhd2FpdEtleXdvcmQgdGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2F3YWl0JyBrZXl3b3JkCiAgICAqIEBwYXJhbSBmb3JLZXl3b3JkIHRoZSB0b2tlbiByZXByZXNlbnRpbmcgdGhlICdmb3InIGtleXdvcmQKICAgICogQHBhcmFtIGxlZnRQYXJlbnRoZXNpcyB0aGUgbGVmdCBwYXJlbnRoZXNpcwogICAgKiBAcGFyYW0gbG9vcFZhcmlhYmxlIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgbG9vcCB2YXJpYWJsZQpAQCAtNjY4NSw3ICs2ODI4LDcgQEAKICAgICogQHBhcmFtIHJpZ2h0UGFyZW50aGVzaXMgdGhlIHJpZ2h0IHBhcmVudGhlc2lzCiAgICAqIEBwYXJhbSBib2R5IHRoZSBib2R5IG9mIHRoZSBsb29wCiAgICAqLwotICBGb3JFYWNoU3RhdGVtZW50LmNvbjEodGhpcy5mb3JLZXl3b3JkLCB0aGlzLmxlZnRQYXJlbnRoZXNpcywgRGVjbGFyZWRJZGVudGlmaWVyIGxvb3BWYXJpYWJsZSwgdGhpcy5pbktleXdvcmQsIEV4cHJlc3Npb24gaXRlcmF0b3IsIHRoaXMucmlnaHRQYXJlbnRoZXNpcywgU3RhdGVtZW50IGJvZHkpIHsKKyAgRm9yRWFjaFN0YXRlbWVudC5jb24xKHRoaXMuYXdhaXRLZXl3b3JkLCB0aGlzLmZvcktleXdvcmQsIHRoaXMubGVmdFBhcmVudGhlc2lzLCBEZWNsYXJlZElkZW50aWZpZXIgbG9vcFZhcmlhYmxlLCB0aGlzLmluS2V5d29yZCwgRXhwcmVzc2lvbiBpdGVyYXRvciwgdGhpcy5yaWdodFBhcmVudGhlc2lzLCBTdGF0ZW1lbnQgYm9keSkgewogICAgIHRoaXMuX2xvb3BWYXJpYWJsZSA9IGJlY29tZVBhcmVudE9mKGxvb3BWYXJpYWJsZSk7CiAgICAgdGhpcy5faXRlcmF0b3IgPSBiZWNvbWVQYXJlbnRPZihpdGVyYXRvcik7CiAgICAgdGhpcy5fYm9keSA9IGJlY29tZVBhcmVudE9mKGJvZHkpOwpAQCAtNjY5NCw2ICs2ODM3LDcgQEAKICAgLyoqCiAgICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGZvci1lYWNoIHN0YXRlbWVudC4KICAgICoKKyAgICogQHBhcmFtIGF3YWl0S2V5d29yZCB0aGUgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSAnYXdhaXQnIGtleXdvcmQKICAgICogQHBhcmFtIGZvcktleXdvcmQgdGhlIHRva2VuIHJlcHJlc2VudGluZyB0aGUgJ2Zvcicga2V5d29yZAogICAgKiBAcGFyYW0gbGVmdFBhcmVudGhlc2lzIHRoZSBsZWZ0IHBhcmVudGhlc2lzCiAgICAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBsb29wIHZhcmlhYmxlCkBAIC02NzAxLDcgKzY4NDUsNyBAQAogICAgKiBAcGFyYW0gcmlnaHRQYXJlbnRoZXNpcyB0aGUgcmlnaHQgcGFyZW50aGVzaXMKICAgICogQHBhcmFtIGJvZHkgdGhlIGJvZHkgb2YgdGhlIGxvb3AKICAgICovCi0gIEZvckVhY2hTdGF0ZW1lbnQuY29uMih0aGlzLmZvcktleXdvcmQsIHRoaXMubGVmdFBhcmVudGhlc2lzLCBTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIsIHRoaXMuaW5LZXl3b3JkLCBFeHByZXNzaW9uIGl0ZXJhdG9yLCB0aGlzLnJpZ2h0UGFyZW50aGVzaXMsIFN0YXRlbWVudCBib2R5KSB7CisgIEZvckVhY2hTdGF0ZW1lbnQuY29uMih0aGlzLmF3YWl0S2V5d29yZCwgdGhpcy5mb3JLZXl3b3JkLCB0aGlzLmxlZnRQYXJlbnRoZXNpcywgU2ltcGxlSWRlbnRpZmllciBpZGVudGlmaWVyLCB0aGlzLmluS2V5d29yZCwgRXhwcmVzc2lvbiBpdGVyYXRvciwgdGhpcy5yaWdodFBhcmVudGhlc2lzLCBTdGF0ZW1lbnQgYm9keSkgewogICAgIHRoaXMuX2lkZW50aWZpZXIgPSBiZWNvbWVQYXJlbnRPZihpZGVudGlmaWVyKTsKICAgICB0aGlzLl9pdGVyYXRvciA9IGJlY29tZVBhcmVudE9mKGl0ZXJhdG9yKTsKICAgICB0aGlzLl9ib2R5ID0gYmVjb21lUGFyZW50T2YoYm9keSk7CkBAIC03MjI2LDYgKzczNzAsMjYgQEAKICAqIDwvcHJlPgogICovCiBhYnN0cmFjdCBjbGFzcyBGdW5jdGlvbkJvZHkgZXh0ZW5kcyBBc3ROb2RlIHsKKyAgLyoqCisgICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBmdW5jdGlvbiBib2R5IGlzIGFzeW5jaHJvbm91cy4KKyAgICoKKyAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhpcyBmdW5jdGlvbiBib2R5IGlzIGFzeW5jaHJvbm91cworICAgKi8KKyAgYm9vbCBnZXQgaXNBc3luY2hyb25vdXMgPT4gZmFsc2U7CisKKyAgLyoqCisgICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhpcyBmdW5jdGlvbiBib2R5IGlzIGEgZ2VuZXJhdG9yLgorICAgKgorICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIGZ1bmN0aW9uIGJvZHkgaXMgYSBnZW5lcmF0b3IKKyAgICovCisgIGJvb2wgZ2V0IGlzR2VuZXJhdG9yID0+IGZhbHNlOworCisgIC8qKgorICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgZnVuY3Rpb24gYm9keSBpcyBzeW5jaHJvbm91cy4KKyAgICoKKyAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhpcyBmdW5jdGlvbiBib2R5IGlzIHN5bmNocm9ub3VzCisgICAqLworICBib29sIGdldCBpc1N5bmNocm9ub3VzID0+IHRydWU7CiB9CiAKIC8qKgpAQCAtNzkzOCw2ICs4MTAyLDkgQEAKICAgUiB2aXNpdEFzc2lnbm1lbnRFeHByZXNzaW9uKEFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKIAogICBAb3ZlcnJpZGUKKyAgUiB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOworCisgIEBvdmVycmlkZQogICBSIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKIAogICBAb3ZlcnJpZGUKQEAgLTgyNjksNiArODQzNiw5IEBACiAKICAgQG92ZXJyaWRlCiAgIFIgdmlzaXRXaXRoQ2xhdXNlKFdpdGhDbGF1c2Ugbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOworCisgIEBvdmVycmlkZQorICBSIHZpc2l0WWllbGRTdGF0ZW1lbnQoWWllbGRTdGF0ZW1lbnQgbm9kZSkgPT4gdmlzaXRTdGF0ZW1lbnQobm9kZSk7CiB9CiAKIGNsYXNzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3JfQnJlYWR0aEZpcnN0VmlzaXRvciBleHRlbmRzIEdlbmVyYWxpemluZ0FzdFZpc2l0b3I8T2JqZWN0PiB7CkBAIC04ODE5LDYgKzg5ODksOSBAQAogICB9CiAKICAgQG92ZXJyaWRlCisgIEF3YWl0RXhwcmVzc2lvbiB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgPT4gbmV3IEF3YWl0RXhwcmVzc2lvbihfbWFwVG9rZW4obm9kZS5hd2FpdEtleXdvcmQpLCBfY2xvbmVOb2RlKG5vZGUuZXhwcmVzc2lvbiksIF9tYXBUb2tlbihub2RlLnNlbWljb2xvbikpOworCisgIEBvdmVycmlkZQogICBCaW5hcnlFeHByZXNzaW9uIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKICAgICBCaW5hcnlFeHByZXNzaW9uIGNvcHkgPSBuZXcgQmluYXJ5RXhwcmVzc2lvbihfY2xvbmVOb2RlKG5vZGUubGVmdE9wZXJhbmQpLCBfbWFwVG9rZW4obm9kZS5vcGVyYXRvciksIF9jbG9uZU5vZGUobm9kZS5yaWdodE9wZXJhbmQpKTsKICAgICBjb3B5LnByb3BhZ2F0ZWRFbGVtZW50ID0gbm9kZS5wcm9wYWdhdGVkRWxlbWVudDsKQEAgLTg4MzIsNyArOTAwNSw3IEBACiAgIEJsb2NrIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgPT4gbmV3IEJsb2NrKF9tYXBUb2tlbihub2RlLmxlZnRCcmFja2V0KSwgX2Nsb25lTm9kZUxpc3Qobm9kZS5zdGF0ZW1lbnRzKSwgX21hcFRva2VuKG5vZGUucmlnaHRCcmFja2V0KSk7CiAKICAgQG92ZXJyaWRlCi0gIEJsb2NrRnVuY3Rpb25Cb2R5IHZpc2l0QmxvY2tGdW5jdGlvbkJvZHkoQmxvY2tGdW5jdGlvbkJvZHkgbm9kZSkgPT4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KF9jbG9uZU5vZGUobm9kZS5ibG9jaykpOworICBCbG9ja0Z1bmN0aW9uQm9keSB2aXNpdEJsb2NrRnVuY3Rpb25Cb2R5KEJsb2NrRnVuY3Rpb25Cb2R5IG5vZGUpID0+IG5ldyBCbG9ja0Z1bmN0aW9uQm9keShfbWFwVG9rZW4obm9kZS5rZXl3b3JkKSwgX21hcFRva2VuKG5vZGUuc3RhciksIF9jbG9uZU5vZGUobm9kZS5ibG9jaykpOwogCiAgIEBvdmVycmlkZQogICBCb29sZWFuTGl0ZXJhbCB2aXNpdEJvb2xlYW5MaXRlcmFsKEJvb2xlYW5MaXRlcmFsIG5vZGUpIHsKQEAgLTg5NDYsNyArOTExOSw3IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKLSAgRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSB2aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHkoRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSBub2RlKSA9PiBuZXcgRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShfbWFwVG9rZW4obm9kZS5mdW5jdGlvbkRlZmluaXRpb24pLCBfY2xvbmVOb2RlKG5vZGUuZXhwcmVzc2lvbiksIF9tYXBUb2tlbihub2RlLnNlbWljb2xvbikpOworICBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IHZpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keShFeHByZXNzaW9uRnVuY3Rpb25Cb2R5IG5vZGUpID0+IG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KF9tYXBUb2tlbihub2RlLmtleXdvcmQpLCBfbWFwVG9rZW4obm9kZS5mdW5jdGlvbkRlZmluaXRpb24pLCBfY2xvbmVOb2RlKG5vZGUuZXhwcmVzc2lvbiksIF9tYXBUb2tlbihub2RlLnNlbWljb2xvbikpOwogCiAgIEBvdmVycmlkZQogICBFeHByZXNzaW9uU3RhdGVtZW50IHZpc2l0RXhwcmVzc2lvblN0YXRlbWVudChFeHByZXNzaW9uU3RhdGVtZW50IG5vZGUpID0+IG5ldyBFeHByZXNzaW9uU3RhdGVtZW50KF9jbG9uZU5vZGUobm9kZS5leHByZXNzaW9uKSwgX21hcFRva2VuKG5vZGUuc2VtaWNvbG9uKSk7CkBAIC04OTY0LDkgKzkxMzcsOSBAQAogICBGb3JFYWNoU3RhdGVtZW50IHZpc2l0Rm9yRWFjaFN0YXRlbWVudChGb3JFYWNoU3RhdGVtZW50IG5vZGUpIHsKICAgICBEZWNsYXJlZElkZW50aWZpZXIgbG9vcFZhcmlhYmxlID0gbm9kZS5sb29wVmFyaWFibGU7CiAgICAgaWYgKGxvb3BWYXJpYWJsZSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gbmV3IEZvckVhY2hTdGF0ZW1lbnQuY29uMihfbWFwVG9rZW4obm9kZS5mb3JLZXl3b3JkKSwgX21hcFRva2VuKG5vZGUubGVmdFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShub2RlLmlkZW50aWZpZXIpLCBfbWFwVG9rZW4obm9kZS5pbktleXdvcmQpLCBfY2xvbmVOb2RlKG5vZGUuaXRlcmF0b3IpLCBfbWFwVG9rZW4obm9kZS5yaWdodFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShub2RlLmJvZHkpKTsKKyAgICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKF9tYXBUb2tlbihub2RlLmF3YWl0S2V5d29yZCksIF9tYXBUb2tlbihub2RlLmZvcktleXdvcmQpLCBfbWFwVG9rZW4obm9kZS5sZWZ0UGFyZW50aGVzaXMpLCBfY2xvbmVOb2RlKG5vZGUuaWRlbnRpZmllciksIF9tYXBUb2tlbihub2RlLmluS2V5d29yZCksIF9jbG9uZU5vZGUobm9kZS5pdGVyYXRvciksIF9tYXBUb2tlbihub2RlLnJpZ2h0UGFyZW50aGVzaXMpLCBfY2xvbmVOb2RlKG5vZGUuYm9keSkpOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEZvckVhY2hTdGF0ZW1lbnQuY29uMShfbWFwVG9rZW4obm9kZS5mb3JLZXl3b3JkKSwgX21hcFRva2VuKG5vZGUubGVmdFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShsb29wVmFyaWFibGUpLCBfbWFwVG9rZW4obm9kZS5pbktleXdvcmQpLCBfY2xvbmVOb2RlKG5vZGUuaXRlcmF0b3IpLCBfbWFwVG9rZW4obm9kZS5yaWdodFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShub2RlLmJvZHkpKTsKKyAgICByZXR1cm4gbmV3IEZvckVhY2hTdGF0ZW1lbnQuY29uMShfbWFwVG9rZW4obm9kZS5hd2FpdEtleXdvcmQpLCBfbWFwVG9rZW4obm9kZS5mb3JLZXl3b3JkKSwgX21hcFRva2VuKG5vZGUubGVmdFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShsb29wVmFyaWFibGUpLCBfbWFwVG9rZW4obm9kZS5pbktleXdvcmQpLCBfY2xvbmVOb2RlKG5vZGUuaXRlcmF0b3IpLCBfbWFwVG9rZW4obm9kZS5yaWdodFBhcmVudGhlc2lzKSwgX2Nsb25lTm9kZShub2RlLmJvZHkpKTsKICAgfQogCiAgIEBvdmVycmlkZQpAQCAtOTM0MCw2ICs5NTEzLDkgQEAKICAgQG92ZXJyaWRlCiAgIFdpdGhDbGF1c2UgdmlzaXRXaXRoQ2xhdXNlKFdpdGhDbGF1c2Ugbm9kZSkgPT4gbmV3IFdpdGhDbGF1c2UoX21hcFRva2VuKG5vZGUud2l0aEtleXdvcmQpLCBfY2xvbmVOb2RlTGlzdChub2RlLm1peGluVHlwZXMpKTsKIAorICBAb3ZlcnJpZGUKKyAgWWllbGRTdGF0ZW1lbnQgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSA9PiBuZXcgWWllbGRTdGF0ZW1lbnQoX21hcFRva2VuKG5vZGUueWllbGRLZXl3b3JkKSwgX21hcFRva2VuKG5vZGUuc3RhciksIF9jbG9uZU5vZGUobm9kZS5leHByZXNzaW9uKSwgX21hcFRva2VuKG5vZGUuc2VtaWNvbG9uKSk7CisKICAgQXN0Tm9kZSBfY2xvbmVOb2RlKEFzdE5vZGUgbm9kZSkgewogICAgIGlmIChub2RlID09IG51bGwpIHsKICAgICAgIHJldHVybiBudWxsOwpAQCAtMTE2NDAsNiArMTE4MTYsMTQgQEAKICAgfQogCiAgIEBvdmVycmlkZQorICBib29sIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CisgICAgaWYgKGlkZW50aWNhbChub2RlLmV4cHJlc3Npb24sIF9vbGROb2RlKSkgeworICAgICAgbm9kZS5leHByZXNzaW9uID0gX25ld05vZGUgYXMgRXhwcmVzc2lvbjsKKyAgICB9CisgICAgcmV0dXJuIHZpc2l0Tm9kZShub2RlKTsKKyAgfQorCisgIEBvdmVycmlkZQogICBib29sIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKICAgICBpZiAoaWRlbnRpY2FsKG5vZGUubGVmdE9wZXJhbmQsIF9vbGROb2RlKSkgewogICAgICAgbm9kZS5sZWZ0T3BlcmFuZCA9IF9uZXdOb2RlIGFzIEV4cHJlc3Npb247CkBAIC0xMjYzNCw2ICsxMjgxOCwxNCBAQAogICAgIHJldHVybiB2aXNpdE5vZGUobm9kZSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKKyAgYm9vbCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKKyAgICBpZiAoaWRlbnRpY2FsKG5vZGUuZXhwcmVzc2lvbiwgX29sZE5vZGUpKSB7CisgICAgICBub2RlLmV4cHJlc3Npb24gPSBfbmV3Tm9kZSBhcyBFeHByZXNzaW9uOworICAgIH0KKyAgICByZXR1cm4gdmlzaXROb2RlKG5vZGUpOworICB9CisKICAgYm9vbCBfcmVwbGFjZUluTGlzdChOb2RlTGlzdCBsaXN0KSB7CiAgICAgaW50IGNvdW50ID0gbGlzdC5sZW5ndGg7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CkBAIC0xMzcyMiw2ICsxMzkxNCwxMiBAQAogICB9CiAKICAgQG92ZXJyaWRlCisgIFIgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKKyAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKworICBAb3ZlcnJpZGUKICAgUiB2aXNpdEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgbm9kZS52aXNpdENoaWxkcmVuKHRoaXMpOwogICAgIHJldHVybiBudWxsOwpAQCAtMTQyOTYsNiArMTQ0OTQsMTIgQEAKICAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CiAgICAgcmV0dXJuIG51bGw7CiAgIH0KKworICBAb3ZlcnJpZGUKKyAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKKyAgICBub2RlLnZpc2l0Q2hpbGRyZW4odGhpcyk7CisgICAgcmV0dXJuIG51bGw7CisgIH0KIH0KIAogLyoqCkBAIC0xNDc5Myw2ICsxNDk5Nyw5IEBACiAgIFIgdmlzaXRBc3NpZ25tZW50RXhwcmVzc2lvbihBc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlKSA9PiBudWxsOwogCiAgIEBvdmVycmlkZQorICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSA9PiBudWxsOworCisgIEBvdmVycmlkZQogICBSIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpID0+IG51bGw7CiAKICAgQG92ZXJyaWRlCkBAIC0xNTA3OSw2ICsxNTI4Niw5IEBACiAKICAgQG92ZXJyaWRlCiAgIFIgdmlzaXRXaXRoQ2xhdXNlKFdpdGhDbGF1c2Ugbm9kZSkgPT4gbnVsbDsKKworICBAb3ZlcnJpZGUKKyAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IG51bGw7CiB9CiAKIC8qKgpAQCAtMTYzMzAsNiArMTY1NDAsMTQgQEAKICAgfQogCiAgIEBvdmVycmlkZQorICBPYmplY3QgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKKyAgICBfd3JpdGVyLnByaW50KCJhd2FpdCAiKTsKKyAgICBfdmlzaXROb2RlKG5vZGUuZXhwcmVzc2lvbik7CisgICAgX3dyaXRlci5wcmludCgiOyIpOworICAgIHJldHVybiBudWxsOworICB9CisKKyAgQG92ZXJyaWRlCiAgIE9iamVjdCB2aXNpdEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgX3Zpc2l0Tm9kZShub2RlLmxlZnRPcGVyYW5kKTsKICAgICBfd3JpdGVyLnByaW50KCcgJyk7CkBAIC0xNjM0OSw2ICsxNjU2NywxNCBAQAogCiAgIEBvdmVycmlkZQogICBPYmplY3QgdmlzaXRCbG9ja0Z1bmN0aW9uQm9keShCbG9ja0Z1bmN0aW9uQm9keSBub2RlKSB7CisgICAgVG9rZW4ga2V5d29yZCA9IG5vZGUua2V5d29yZDsKKyAgICBpZiAoa2V5d29yZCAhPSBudWxsKSB7CisgICAgICBfd3JpdGVyLnByaW50KGtleXdvcmQubGV4ZW1lKTsKKyAgICAgIGlmIChub2RlLnN0YXIgIT0gbnVsbCkgeworICAgICAgICBfd3JpdGVyLnByaW50KCcqJyk7CisgICAgICB9CisgICAgICBfd3JpdGVyLnByaW50KCcgJyk7CisgICAgfQogICAgIF92aXNpdE5vZGUobm9kZS5ibG9jayk7CiAgICAgcmV0dXJuIG51bGw7CiAgIH0KQEAgLTE2NTUyLDYgKzE2Nzc4LDExIEBACiAKICAgQG92ZXJyaWRlCiAgIE9iamVjdCB2aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHkoRXhwcmVzc2lvbkZ1bmN0aW9uQm9keSBub2RlKSB7CisgICAgVG9rZW4ga2V5d29yZCA9IG5vZGUua2V5d29yZDsKKyAgICBpZiAoa2V5d29yZCAhPSBudWxsKSB7CisgICAgICBfd3JpdGVyLnByaW50KGtleXdvcmQubGV4ZW1lKTsKKyAgICAgIF93cml0ZXIucHJpbnQoJyAnKTsKKyAgICB9CiAgICAgX3dyaXRlci5wcmludCgiPT4gIik7CiAgICAgX3Zpc2l0Tm9kZShub2RlLmV4cHJlc3Npb24pOwogICAgIGlmIChub2RlLnNlbWljb2xvbiAhPSBudWxsKSB7CkBAIC0xNjU5Niw2ICsxNjgyNyw5IEBACiAgIEBvdmVycmlkZQogICBPYmplY3QgdmlzaXRGb3JFYWNoU3RhdGVtZW50KEZvckVhY2hTdGF0ZW1lbnQgbm9kZSkgewogICAgIERlY2xhcmVkSWRlbnRpZmllciBsb29wVmFyaWFibGUgPSBub2RlLmxvb3BWYXJpYWJsZTsKKyAgICBpZiAobm9kZS5hd2FpdEtleXdvcmQgIT0gbnVsbCkgeworICAgICAgX3dyaXRlci5wcmludCgiYXdhaXQgIik7CisgICAgfQogICAgIF93cml0ZXIucHJpbnQoImZvciAoIik7CiAgICAgaWYgKGxvb3BWYXJpYWJsZSA9PSBudWxsKSB7CiAgICAgICBfdmlzaXROb2RlKG5vZGUuaWRlbnRpZmllcik7CkBAIC0xNzIwMyw2ICsxNzQzNywxOCBAQAogICAgIHJldHVybiBudWxsOwogICB9CiAKKyAgQG92ZXJyaWRlCisgIE9iamVjdCB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpIHsKKyAgICBpZiAobm9kZS5zdGFyICE9IG51bGwpIHsKKyAgICAgIF93cml0ZXIucHJpbnQoInlpZWxkKiAiKTsKKyAgICB9IGVsc2UgeworICAgICAgX3dyaXRlci5wcmludCgieWllbGQgIik7CisgICAgfQorICAgIF92aXNpdE5vZGUobm9kZS5leHByZXNzaW9uKTsKKyAgICBfd3JpdGVyLnByaW50KCI7Iik7CisgICAgcmV0dXJuIG51bGw7CisgIH0KKwogICAvKioKICAgICogVmlzaXQgdGhlIGdpdmVuIGZ1bmN0aW9uIGJvZHksIHByaW50aW5nIHRoZSBwcmVmaXggYmVmb3JlIGlmIGdpdmVuIGJvZHkgaXMgbm90IGVtcHR5LgogICAgKgpAQCAtMTc5NzgsNiArMTgyMjQsOSBAQAogICBSIHZpc2l0QXNzaWdubWVudEV4cHJlc3Npb24oQXNzaWdubWVudEV4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwogCiAgIEBvdmVycmlkZQorICBSIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSA9PiB2aXNpdE5vZGUobm9kZSk7CisKKyAgQG92ZXJyaWRlCiAgIFIgdmlzaXRCaW5hcnlFeHByZXNzaW9uKEJpbmFyeUV4cHJlc3Npb24gbm9kZSkgPT4gdmlzaXROb2RlKG5vZGUpOwogCiAgIEBvdmVycmlkZQpAQCAtMTgyNjksNiArMTg1MTgsOSBAQAogCiAgIEBvdmVycmlkZQogICBSIHZpc2l0V2l0aENsYXVzZShXaXRoQ2xhdXNlIG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKKworICBAb3ZlcnJpZGUKKyAgUiB2aXNpdFlpZWxkU3RhdGVtZW50KFlpZWxkU3RhdGVtZW50IG5vZGUpID0+IHZpc2l0Tm9kZShub2RlKTsKIH0KIAogLyoqCkBAIC0xODg2NSw2ICsxOTExNyw4MyBAQAogICAgIF9taXhpblR5cGVzLmFjY2VwdCh2aXNpdG9yKTsKICAgfQogfQorCisvKioKKyAqIEluc3RhbmNlcyBvZiB0aGUgY2xhc3MgYFlpZWxkU3RhdGVtZW50YCBpbXBsZW1lbnQgYSB5aWVsZCBzdGF0ZW1lbnQuCisgKi8KK2NsYXNzIFlpZWxkU3RhdGVtZW50IGV4dGVuZHMgU3RhdGVtZW50IHsKKyAgLyoqCisgICAqIFRoZSAneWllbGQnIGtleXdvcmQuCisgICAqLworICBUb2tlbiB5aWVsZEtleXdvcmQ7CisKKyAgLyoqCisgICAqIFRoZSBzdGFyIG9wdGlvbmFsbHkgZm9sbG93aW5nIHRoZSAneWllbGQnIGtleXdvcmQuCisgICAqLworICBUb2tlbiBzdGFyOworCisgIC8qKgorICAgKiBUaGUgZXhwcmVzc2lvbiB3aG9zZSB2YWx1ZSB3aWxsIGJlIHlpZWxkZWQuCisgICAqLworICBFeHByZXNzaW9uIF9leHByZXNzaW9uOworCisgIC8qKgorICAgKiBUaGUgc2VtaWNvbG9uIGZvbGxvd2luZyB0aGUgZXhwcmVzc2lvbi4KKyAgICovCisgIFRva2VuIHNlbWljb2xvbjsKKworICAvKioKKyAgICogSW5pdGlhbGl6ZSBhIG5ld2x5IGNyZWF0ZWQgeWllbGQgZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQHBhcmFtIHlpZWxkS2V5d29yZCB0aGUgJ3lpZWxkJyBrZXl3b3JkCisgICAqIEBwYXJhbSBzdGFyIHRoZSBzdGFyIGZvbGxvd2luZyB0aGUgJ3lpZWxkJyBrZXl3b3JkCisgICAqIEBwYXJhbSBleHByZXNzaW9uIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIHdpbGwgYmUgeWllbGRlZAorICAgKiBAcGFyYW0gc2VtaWNvbG9uIHRoZSBzZW1pY29sb24gZm9sbG93aW5nIHRoZSBleHByZXNzaW9uCisgICAqLworICBZaWVsZFN0YXRlbWVudCh0aGlzLnlpZWxkS2V5d29yZCwgdGhpcy5zdGFyLCBFeHByZXNzaW9uIGV4cHJlc3Npb24sIHRoaXMuc2VtaWNvbG9uKSB7CisgICAgdGhpcy5fZXhwcmVzc2lvbiA9IGJlY29tZVBhcmVudE9mKGV4cHJlc3Npb24pOworICB9CisKKyAgQG92ZXJyaWRlCisgIGFjY2VwdChBc3RWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRZaWVsZFN0YXRlbWVudCh0aGlzKTsKKworICBAb3ZlcnJpZGUKKyAgVG9rZW4gZ2V0IGJlZ2luVG9rZW4geworICAgIGlmICh5aWVsZEtleXdvcmQgIT0gbnVsbCkgeworICAgICAgcmV0dXJuIHlpZWxkS2V5d29yZDsKKyAgICB9CisgICAgcmV0dXJuIF9leHByZXNzaW9uLmJlZ2luVG9rZW47CisgIH0KKworICBAb3ZlcnJpZGUKKyAgVG9rZW4gZ2V0IGVuZFRva2VuIHsKKyAgICBpZiAoc2VtaWNvbG9uICE9IG51bGwpIHsKKyAgICAgIHJldHVybiBzZW1pY29sb247CisgICAgfQorICAgIHJldHVybiBfZXhwcmVzc2lvbi5lbmRUb2tlbjsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgd2lsbCBiZSB5aWVsZGVkLgorICAgKgorICAgKiBAcmV0dXJuIHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIHdpbGwgYmUgeWllbGRlZAorICAgKi8KKyAgRXhwcmVzc2lvbiBnZXQgZXhwcmVzc2lvbiA9PiBfZXhwcmVzc2lvbjsKKworICAvKioKKyAgICogU2V0IHRoZSBleHByZXNzaW9uIHdob3NlIHZhbHVlIHdpbGwgYmUgeWllbGRlZCB0byB0aGUgZ2l2ZW4gZXhwcmVzc2lvbi4KKyAgICoKKyAgICogQHBhcmFtIGV4cHJlc3Npb24gdGhlIGV4cHJlc3Npb24gd2hvc2UgdmFsdWUgd2lsbCBiZSB5aWVsZGVkCisgICAqLworICB2b2lkIHNldCBleHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgeworICAgIHRoaXMuX2V4cHJlc3Npb24gPSBiZWNvbWVQYXJlbnRPZihleHByZXNzaW9uKTsKKyAgfQorCisgIEBvdmVycmlkZQorICB2b2lkIHZpc2l0Q2hpbGRyZW4oQXN0VmlzaXRvciB2aXNpdG9yKSB7CisgICAgc2FmZWx5VmlzaXRDaGlsZChfZXhwcmVzc2lvbiwgdmlzaXRvcik7CisgIH0KK30KIC8qKgogICogSW5zdGFuY2VzIG9mIHRoZSBjbGFzcyB7QGNvZGUgTm9kZUxpc3R9IHJlcHJlc2VudCBhIGxpc3Qgb2YgQVNUIG5vZGVzIHRoYXQgaGF2ZSBhIGNvbW1vbiBwYXJlbnQuCiAgKi8KZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9jb25zdGFudC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQKaW5kZXggYzkxMWE3Ni4uOTI1OGE1NyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2NvbnN0YW50LmRhcnQKQEAgLTI4Nyw2ICsyODcsMTEgQEAKICAqLwogY2xhc3MgQ29uc3RhbnRWYWx1ZUNvbXB1dGVyIHsKICAgLyoqCisgICAqIFBhcmFtZXRlciB0byAiZnJvbUVudmlyb25tZW50IiBtZXRob2RzIHRoYXQgZGVub3RlcyB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICovCisgIHN0YXRpYyBTdHJpbmcgX0RFRkFVTFRfVkFMVUVfUEFSQU0gPSAiZGVmYXVsdFZhbHVlIjsKKworICAvKioKICAgICogVGhlIHR5cGUgcHJvdmlkZXIgdXNlZCB0byBhY2Nlc3MgdGhlIGtub3duIHR5cGVzLgogICAgKi8KICAgVHlwZVByb3ZpZGVyIHR5cGVQcm92aWRlcjsKQEAgLTMxOSwxMSArMzI0LDE3IEBACiAgIExpc3Q8SW5zdGFuY2VDcmVhdGlvbkV4cHJlc3Npb24+IF9jb25zdHJ1Y3Rvckludm9jYXRpb25zOwogCiAgIC8qKgorICAgKiBUaGUgc2V0IG9mIHZhcmlhYmxlcyBkZWNsYXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nICctRCcuCisgICAqLworICBmaW5hbCBEZWNsYXJlZFZhcmlhYmxlcyBfZGVjbGFyZWRWYXJpYWJsZXM7CisKKyAgLyoqCiAgICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGNvbnN0YW50IHZhbHVlIGNvbXB1dGVyLgogICAgKgogICAgKiBAcGFyYW0gdHlwZVByb3ZpZGVyIHRoZSB0eXBlIHByb3ZpZGVyIHVzZWQgdG8gYWNjZXNzIGtub3duIHR5cGVzCisgICAqIEBwYXJhbSBkZWNsYXJlZFZhcmlhYmxlcyB0aGUgc2V0IG9mIHZhcmlhYmxlcyBkZWNsYXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHVzaW5nICctRCcKICAgICovCi0gIENvbnN0YW50VmFsdWVDb21wdXRlcihUeXBlUHJvdmlkZXIgdHlwZVByb3ZpZGVyKSB7CisgIENvbnN0YW50VmFsdWVDb21wdXRlcihUeXBlUHJvdmlkZXIgdHlwZVByb3ZpZGVyLCB0aGlzLl9kZWNsYXJlZFZhcmlhYmxlcykgewogICAgIHRoaXMudHlwZVByb3ZpZGVyID0gdHlwZVByb3ZpZGVyOwogICB9CiAKQEAgLTQ0NSw2ICs0NTYsNDIgQEAKICAgQ29uc3RydWN0b3JEZWNsYXJhdGlvbiBmaW5kQ29uc3RydWN0b3JEZWNsYXJhdGlvbihDb25zdHJ1Y3RvckVsZW1lbnQgY29uc3RydWN0b3IpID0+IGNvbnN0cnVjdG9yRGVjbGFyYXRpb25NYXBbX2dldENvbnN0cnVjdG9yQmFzZShjb25zdHJ1Y3RvcildOwogCiAgIC8qKgorICAgKiBDaGVjayB0aGF0IHRoZSBhcmd1bWVudHMgdG8gYSBjYWxsIHRvIGZyb21FbnZpcm9ubWVudCgpIGFyZSBjb3JyZWN0LgorICAgKgorICAgKiBAcGFyYW0gYXJndW1lbnRzIHRoZSBBU1Qgbm9kZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWVzIHRoZSB2YWx1ZXMgb2YgdGhlIHVubmFtZWQgYXJndW1lbnRzLgorICAgKiBAcGFyYW0gbmFtZWRBcmd1bWVudFZhbHVlcyB0aGUgdmFsdWVzIG9mIHRoZSBuYW1lZCBhcmd1bWVudHMuCisgICAqIEBwYXJhbSBleHBlY3RlZERlZmF1bHRWYWx1ZVR5cGUgdGhlIGFsbG93ZWQgdHlwZSBvZiB0aGUgImRlZmF1bHRWYWx1ZSIgcGFyYW1ldGVyIChpZiBwcmVzZW50KS4KKyAgICogICAgICAgICAgTm90ZTogImRlZmF1bHRWYWx1ZSIgaXMgYWx3YXlzIGFsbG93ZWQgdG8gYmUgbnVsbC4KKyAgICogQHJldHVybiB0cnVlIGlmIHRoZSBhcmd1bWVudHMgYXJlIGNvcnJlY3QsIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICAgKi8KKyAgYm9vbCBfY2hlY2tGcm9tRW52aXJvbm1lbnRBcmd1bWVudHMoTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBMaXN0PERhcnRPYmplY3RJbXBsPiBhcmd1bWVudFZhbHVlcywgSGFzaE1hcDxTdHJpbmcsIERhcnRPYmplY3RJbXBsPiBuYW1lZEFyZ3VtZW50VmFsdWVzLCBJbnRlcmZhY2VUeXBlIGV4cGVjdGVkRGVmYXVsdFZhbHVlVHlwZSkgeworICAgIGludCBhcmd1bWVudENvdW50ID0gYXJndW1lbnRzLmxlbmd0aDsKKyAgICBpZiAoYXJndW1lbnRDb3VudCA8IDEgfHwgYXJndW1lbnRDb3VudCA+IDIpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGFyZ3VtZW50c1swXSBpcyBOYW1lZEV4cHJlc3Npb24pIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFpZGVudGljYWwoYXJndW1lbnRWYWx1ZXNbMF0udHlwZSwgdHlwZVByb3ZpZGVyLnN0cmluZ1R5cGUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChhcmd1bWVudENvdW50ID09IDIpIHsKKyAgICAgIGlmIChhcmd1bWVudHNbMV0gaXMhIE5hbWVkRXhwcmVzc2lvbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoISgoYXJndW1lbnRzWzFdIGFzIE5hbWVkRXhwcmVzc2lvbikubmFtZS5sYWJlbC5uYW1lID09IF9ERUZBVUxUX1ZBTFVFX1BBUkFNKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBJbnRlcmZhY2VUeXBlIGRlZmF1bHRWYWx1ZVR5cGUgPSBuYW1lZEFyZ3VtZW50VmFsdWVzW19ERUZBVUxUX1ZBTFVFX1BBUkFNXS50eXBlOworICAgICAgaWYgKCEoaWRlbnRpY2FsKGRlZmF1bHRWYWx1ZVR5cGUsIGV4cGVjdGVkRGVmYXVsdFZhbHVlVHlwZSkgfHwgaWRlbnRpY2FsKGRlZmF1bHRWYWx1ZVR5cGUsIHR5cGVQcm92aWRlci5udWxsVHlwZSkpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvKioKICAgICogQ29tcHV0ZSBhIHZhbHVlIGZvciB0aGUgZ2l2ZW4gY29uc3RhbnQuCiAgICAqCiAgICAqIEBwYXJhbSBjb25zdE5vZGUgdGhlIGNvbnN0YW50IGZvciB3aGljaCBhIHZhbHVlIGlzIHRvIGJlIGNvbXB1dGVkCkBAIC00NjUsNyArNTEyLDcgQEAKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgQ29uc3RhbnRWaXNpdG9yIGNvbnN0YW50VmlzaXRvciA9IGNyZWF0ZUNvbnN0YW50VmlzaXRvcigpOwotICAgICAgVmFsaWRSZXN1bHQgcmVzdWx0ID0gX2V2YWx1YXRlQ29uc3RydWN0b3JDYWxsKGV4cHJlc3Npb24uYXJndW1lbnRMaXN0LmFyZ3VtZW50cywgY29uc3RydWN0b3IsIGNvbnN0YW50VmlzaXRvcik7CisgICAgICBFdmFsdWF0aW9uUmVzdWx0SW1wbCByZXN1bHQgPSBfZXZhbHVhdGVDb25zdHJ1Y3RvckNhbGwoY29uc3ROb2RlLCBleHByZXNzaW9uLmFyZ3VtZW50TGlzdC5hcmd1bWVudHMsIGNvbnN0cnVjdG9yLCBjb25zdGFudFZpc2l0b3IpOwogICAgICAgZXhwcmVzc2lvbi5ldmFsdWF0aW9uUmVzdWx0ID0gcmVzdWx0OwogICAgIH0gZWxzZSBpZiAoY29uc3ROb2RlIGlzIENvbnN0cnVjdG9yRGVjbGFyYXRpb24pIHsKICAgICAgIENvbnN0cnVjdG9yRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBjb25zdE5vZGU7CkBAIC00ODksNyArNTM2LDM0IEBACiAgICAgfQogICB9CiAKLSAgVmFsaWRSZXN1bHQgX2V2YWx1YXRlQ29uc3RydWN0b3JDYWxsKE5vZGVMaXN0PEV4cHJlc3Npb24+IGFyZ3VtZW50cywgQ29uc3RydWN0b3JFbGVtZW50IGNvbnN0cnVjdG9yLCBDb25zdGFudFZpc2l0b3IgY29uc3RhbnRWaXNpdG9yKSB7CisgIC8qKgorICAgKiBFdmFsdWF0ZSBhIGNhbGwgdG8gZnJvbUVudmlyb25tZW50KCkgb24gdGhlIGJvb2wsIGludCwgb3IgU3RyaW5nIGNsYXNzLgorICAgKgorICAgKiBAcGFyYW0gZW52aXJvbm1lbnRWYWx1ZSBWYWx1ZSBmZXRjaGVkIGZyb20gdGhlIGVudmlyb25tZW50CisgICAqIEBwYXJhbSBidWlsdEluRGVmYXVsdFZhbHVlIFZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgaWYgbm8gImRlZmF1bHRWYWx1ZSIKKyAgICogICAgICAgICAgYXJndW1lbnQgYXBwZWFycyBpbiBbbmFtZWRBcmd1bWVudFZhbHVlc10uCisgICAqIEBwYXJhbSBuYW1lZEFyZ3VtZW50VmFsdWVzIE5hbWVkIHBhcmFtZXRlcnMgcGFzc2VkIHRvIGZyb21FbnZpcm9ubWVudCgpCisgICAqIEByZXR1cm4gQSBbVmFsaWRSZXN1bHRdIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBldmFsdWF0ZWQgcmVzdWx0CisgICAqLworICBWYWxpZFJlc3VsdCBfY29tcHV0ZVZhbHVlRnJvbUVudmlyb25tZW50KERhcnRPYmplY3QgZW52aXJvbm1lbnRWYWx1ZSwgRGFydE9iamVjdEltcGwgYnVpbHRJbkRlZmF1bHRWYWx1ZSwgSGFzaE1hcDxTdHJpbmcsIERhcnRPYmplY3RJbXBsPiBuYW1lZEFyZ3VtZW50VmFsdWVzKSB7CisgICAgRGFydE9iamVjdEltcGwgdmFsdWUgPSBlbnZpcm9ubWVudFZhbHVlIGFzIERhcnRPYmplY3RJbXBsOworICAgIGlmICh2YWx1ZS5pc1Vua25vd24gfHwgdmFsdWUuaXNOdWxsKSB7CisgICAgICAvLyBUaGUgbmFtZSBlaXRoZXIgZG9lc24ndCBleGlzdCBpbiB0aGUgZW52aXJvbm1lbnQgb3Igd2UgY291bGRuJ3QgcGFyc2UgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgIC8vIHZhbHVlLiAgSWYgdGhlIGNvZGUgc3VwcGxpZWQgYW4gZXhwbGljaXQgZGVmYXVsdCwgdXNlIGl0LgorICAgICAgaWYgKG5hbWVkQXJndW1lbnRWYWx1ZXMuY29udGFpbnNLZXkoX0RFRkFVTFRfVkFMVUVfUEFSQU0pKSB7CisgICAgICAgIHZhbHVlID0gbmFtZWRBcmd1bWVudFZhbHVlc1tfREVGQVVMVF9WQUxVRV9QQVJBTV07CisgICAgICB9IGVsc2UgaWYgKHZhbHVlLmlzTnVsbCkgeworICAgICAgICAvLyBUaGUgY29kZSBkaWRuJ3Qgc3VwcGx5IGFuIGV4cGxpY2l0IGRlZmF1bHQuICBUaGUgbmFtZSBleGlzdHMgaW4gdGhlIGVudmlyb25tZW50IGJ1dAorICAgICAgICAvLyB3ZSBjb3VsZG4ndCBwYXJzZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4gIFNvIHVzZSB0aGUgYnVpbHQtaW4gZGVmYXVsdCB2YWx1ZSwgYmVjYXVzZQorICAgICAgICAvLyB0aGlzIGlzIHdoYXQgdGhlIFZNIGRvZXMuCisgICAgICAgIHZhbHVlID0gYnVpbHRJbkRlZmF1bHRWYWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBuZXcgVmFsaWRSZXN1bHQodmFsdWUpOworICB9CisKKyAgRXZhbHVhdGlvblJlc3VsdEltcGwgX2V2YWx1YXRlQ29uc3RydWN0b3JDYWxsKEFzdE5vZGUgbm9kZSwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gYXJndW1lbnRzLCBDb25zdHJ1Y3RvckVsZW1lbnQgY29uc3RydWN0b3IsIENvbnN0YW50VmlzaXRvciBjb25zdGFudFZpc2l0b3IpIHsKICAgICBpbnQgYXJndW1lbnRDb3VudCA9IGFyZ3VtZW50cy5sZW5ndGg7CiAgICAgTGlzdDxEYXJ0T2JqZWN0SW1wbD4gYXJndW1lbnRWYWx1ZXMgPSBuZXcgTGlzdDxEYXJ0T2JqZWN0SW1wbD4oYXJndW1lbnRDb3VudCk7CiAgICAgSGFzaE1hcDxTdHJpbmcsIERhcnRPYmplY3RJbXBsPiBuYW1lZEFyZ3VtZW50VmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEYXJ0T2JqZWN0SW1wbD4oKTsKQEAgLTUwOSwxMCArNTgzLDI1IEBACiAgICAgaWYgKGNvbnN0cnVjdG9yLmlzRmFjdG9yeSkgewogICAgICAgLy8gV2UgY291bGRuJ3QgZmluZCBhIG5vbi1mYWN0b3J5IGNvbnN0cnVjdG9yLiAgU2VlIGlmIGl0J3MgYmVjYXVzZSB3ZSByZWFjaGVkIGFuIGV4dGVybmFsCiAgICAgICAvLyBjb25zdCBmYWN0b3J5IGNvbnN0cnVjdG9yIHRoYXQgd2UgY2FuIGVtdWxhdGUuCi0gICAgICAvLyBUT0RPKHBhdWxiZXJyeSk6IGlmIHRoZSBjb25zdHJ1Y3RvciBpcyBvbmUgb2Yge2Jvb2wsaW50LFN0cmluZ30uZnJvbUVudmlyb25tZW50KCksCi0gICAgICAvLyB3ZSBtYXkgYmUgYWJsZSB0byBpbmZlciB0aGUgdmFsdWUgYmFzZWQgb24gLUQgZmxhZ3MgcHJvdmlkZWQgdG8gdGhlIGFuYWx5emVyIChzZWUKLSAgICAgIC8vIGRhcnRidWcuY29tLzE3MjM0KS4KLSAgICAgIGlmIChpZGVudGljYWwoZGVmaW5pbmdDbGFzcywgdHlwZVByb3ZpZGVyLnN5bWJvbFR5cGUpICYmIGFyZ3VtZW50Q291bnQgPT0gMSkgeworICAgICAgaWYgKGNvbnN0cnVjdG9yLm5hbWUgPT0gImZyb21FbnZpcm9ubWVudCIpIHsKKyAgICAgICAgaWYgKCFfY2hlY2tGcm9tRW52aXJvbm1lbnRBcmd1bWVudHMoYXJndW1lbnRzLCBhcmd1bWVudFZhbHVlcywgbmFtZWRBcmd1bWVudFZhbHVlcywgZGVmaW5pbmdDbGFzcykpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEVycm9yUmVzdWx0LmNvbjEobm9kZSwgQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFyaWFibGVOYW1lID0gYXJndW1lbnRDb3VudCA8IDEgPyBudWxsIDogYXJndW1lbnRWYWx1ZXNbMF0uc3RyaW5nVmFsdWU7CisgICAgICAgIGlmIChpZGVudGljYWwoZGVmaW5pbmdDbGFzcywgdHlwZVByb3ZpZGVyLmJvb2xUeXBlKSkgeworICAgICAgICAgIERhcnRPYmplY3QgdmFsdWVGcm9tRW52aXJvbm1lbnQ7CisgICAgICAgICAgdmFsdWVGcm9tRW52aXJvbm1lbnQgPSBfZGVjbGFyZWRWYXJpYWJsZXMuZ2V0Qm9vbCh0eXBlUHJvdmlkZXIsIHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgcmV0dXJuIF9jb21wdXRlVmFsdWVGcm9tRW52aXJvbm1lbnQodmFsdWVGcm9tRW52aXJvbm1lbnQsIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIuYm9vbFR5cGUsIEJvb2xTdGF0ZS5GQUxTRV9TVEFURSksIG5hbWVkQXJndW1lbnRWYWx1ZXMpOworICAgICAgICB9IGVsc2UgaWYgKGlkZW50aWNhbChkZWZpbmluZ0NsYXNzLCB0eXBlUHJvdmlkZXIuaW50VHlwZSkpIHsKKyAgICAgICAgICBEYXJ0T2JqZWN0IHZhbHVlRnJvbUVudmlyb25tZW50OworICAgICAgICAgIHZhbHVlRnJvbUVudmlyb25tZW50ID0gX2RlY2xhcmVkVmFyaWFibGVzLmdldEludCh0eXBlUHJvdmlkZXIsIHZhcmlhYmxlTmFtZSk7CisgICAgICAgICAgcmV0dXJuIF9jb21wdXRlVmFsdWVGcm9tRW52aXJvbm1lbnQodmFsdWVGcm9tRW52aXJvbm1lbnQsIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIubnVsbFR5cGUsIE51bGxTdGF0ZS5OVUxMX1NUQVRFKSwgbmFtZWRBcmd1bWVudFZhbHVlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoaWRlbnRpY2FsKGRlZmluaW5nQ2xhc3MsIHR5cGVQcm92aWRlci5zdHJpbmdUeXBlKSkgeworICAgICAgICAgIERhcnRPYmplY3QgdmFsdWVGcm9tRW52aXJvbm1lbnQ7CisgICAgICAgICAgdmFsdWVGcm9tRW52aXJvbm1lbnQgPSBfZGVjbGFyZWRWYXJpYWJsZXMuZ2V0U3RyaW5nKHR5cGVQcm92aWRlciwgdmFyaWFibGVOYW1lKTsKKyAgICAgICAgICByZXR1cm4gX2NvbXB1dGVWYWx1ZUZyb21FbnZpcm9ubWVudCh2YWx1ZUZyb21FbnZpcm9ubWVudCwgbmV3IERhcnRPYmplY3RJbXBsKHR5cGVQcm92aWRlci5udWxsVHlwZSwgTnVsbFN0YXRlLk5VTExfU1RBVEUpLCBuYW1lZEFyZ3VtZW50VmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChjb25zdHJ1Y3Rvci5uYW1lID09ICIiICYmIGlkZW50aWNhbChkZWZpbmluZ0NsYXNzLCB0eXBlUHJvdmlkZXIuc3ltYm9sVHlwZSkgJiYgYXJndW1lbnRDb3VudCA9PSAxKSB7CiAgICAgICAgIFN0cmluZyBhcmd1bWVudFZhbHVlID0gYXJndW1lbnRWYWx1ZXNbMF0uc3RyaW5nVmFsdWU7CiAgICAgICAgIGlmIChhcmd1bWVudFZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICByZXR1cm4gY29uc3RhbnRWaXNpdG9yLl92YWxpZChkZWZpbmluZ0NsYXNzLCBuZXcgU3ltYm9sU3RhdGUoYXJndW1lbnRWYWx1ZSkpOwpAQCAtNjA1LDE2ICs2OTQsMTkgQEAKICAgICAgICAgaWYgKHN1cGVyQXJndW1lbnRzID09IG51bGwpIHsKICAgICAgICAgICBzdXBlckFyZ3VtZW50cyA9IG5ldyBOb2RlTGlzdDxFeHByZXNzaW9uPihudWxsKTsKICAgICAgICAgfQotICAgICAgICBfZXZhbHVhdGVTdXBlckNvbnN0cnVjdG9yQ2FsbChmaWVsZE1hcCwgc3VwZXJDb25zdHJ1Y3Rvciwgc3VwZXJBcmd1bWVudHMsIGluaXRpYWxpemVyVmlzaXRvcik7CisgICAgICAgIF9ldmFsdWF0ZVN1cGVyQ29uc3RydWN0b3JDYWxsKG5vZGUsIGZpZWxkTWFwLCBzdXBlckNvbnN0cnVjdG9yLCBzdXBlckFyZ3VtZW50cywgaW5pdGlhbGl6ZXJWaXNpdG9yKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGNvbnN0YW50VmlzaXRvci5fdmFsaWQoZGVmaW5pbmdDbGFzcywgbmV3IEdlbmVyaWNTdGF0ZShmaWVsZE1hcCkpOwogICB9CiAKLSAgdm9pZCBfZXZhbHVhdGVTdXBlckNvbnN0cnVjdG9yQ2FsbChIYXNoTWFwPFN0cmluZywgRGFydE9iamVjdEltcGw+IGZpZWxkTWFwLCBDb25zdHJ1Y3RvckVsZW1lbnQgc3VwZXJDb25zdHJ1Y3RvciwgTm9kZUxpc3Q8RXhwcmVzc2lvbj4gc3VwZXJBcmd1bWVudHMsIENvbnN0YW50VmlzaXRvciBpbml0aWFsaXplclZpc2l0b3IpIHsKKyAgdm9pZCBfZXZhbHVhdGVTdXBlckNvbnN0cnVjdG9yQ2FsbChBc3ROb2RlIG5vZGUsIEhhc2hNYXA8U3RyaW5nLCBEYXJ0T2JqZWN0SW1wbD4gZmllbGRNYXAsIENvbnN0cnVjdG9yRWxlbWVudCBzdXBlckNvbnN0cnVjdG9yLCBOb2RlTGlzdDxFeHByZXNzaW9uPiBzdXBlckFyZ3VtZW50cywgQ29uc3RhbnRWaXNpdG9yIGluaXRpYWxpemVyVmlzaXRvcikgewogICAgIGlmIChzdXBlckNvbnN0cnVjdG9yICE9IG51bGwgJiYgc3VwZXJDb25zdHJ1Y3Rvci5pc0NvbnN0KSB7Ci0gICAgICBWYWxpZFJlc3VsdCBldmFsdWF0aW9uUmVzdWx0ID0gX2V2YWx1YXRlQ29uc3RydWN0b3JDYWxsKHN1cGVyQXJndW1lbnRzLCBzdXBlckNvbnN0cnVjdG9yLCBpbml0aWFsaXplclZpc2l0b3IpOwotICAgICAgZmllbGRNYXBbR2VuZXJpY1N0YXRlLlNVUEVSQ0xBU1NfRklFTERdID0gZXZhbHVhdGlvblJlc3VsdC52YWx1ZTsKKyAgICAgIEV2YWx1YXRpb25SZXN1bHRJbXBsIGV2YWx1YXRpb25SZXN1bHQgPSBfZXZhbHVhdGVDb25zdHJ1Y3RvckNhbGwobm9kZSwgc3VwZXJBcmd1bWVudHMsIHN1cGVyQ29uc3RydWN0b3IsIGluaXRpYWxpemVyVmlzaXRvcik7CisgICAgICBpZiAoZXZhbHVhdGlvblJlc3VsdCBpcyBWYWxpZFJlc3VsdCkgeworICAgICAgICBWYWxpZFJlc3VsdCB2YWxpZFJlc3VsdCA9IGV2YWx1YXRpb25SZXN1bHQ7CisgICAgICAgIGZpZWxkTWFwW0dlbmVyaWNTdGF0ZS5TVVBFUkNMQVNTX0ZJRUxEXSA9IHZhbGlkUmVzdWx0LnZhbHVlOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xNzQzLDggKzE4MzUsMTAgQEAKICAgfQogCiAgIC8qKgotICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGludGVycHJldGVkIGFzIGEgYm9vbGVhbiB2YWx1ZSwgb3IKLSAgICogYG51bGxgIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4KKyAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbnRlcnByZXRlZCBhcyBhIGJvb2xlYW4gdmFsdWUuIElmIHRoZQorICAgKiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCAob3IgW3ZhcmlhYmxlTmFtZV0gaXMgbnVsbCksIGEgRGFydE9iamVjdCByZXByZXNlbnRpbmcgInVua25vd24iCisgICAqIGlzIHJldHVybmVkLiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgcGFyc2VkIGFzIGEgYm9vbGVhbiwgYSBEYXJ0T2JqZWN0IHJlcHJlc2VudGluZyBudWxsIGlzCisgICAqIHJldHVybmVkLgogICAgKgogICAgKiBAcGFyYW0gdHlwZVByb3ZpZGVyIHRoZSB0eXBlIHByb3ZpZGVyIHVzZWQgdG8gZmluZCB0aGUgdHlwZSAnYm9vbCcKICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQKQEAgLTE3NTIsMzUgKzE4NDYsNDQgQEAKICAgRGFydE9iamVjdCBnZXRCb29sKFR5cGVQcm92aWRlciB0eXBlUHJvdmlkZXIsIFN0cmluZyB2YXJpYWJsZU5hbWUpIHsKICAgICBTdHJpbmcgdmFsdWUgPSBfZGVjbGFyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXTsKICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIG51bGw7CisgICAgICByZXR1cm4gbmV3IERhcnRPYmplY3RJbXBsKHR5cGVQcm92aWRlci5ib29sVHlwZSwgQm9vbFN0YXRlLlVOS05PV05fVkFMVUUpOwogICAgIH0KICAgICBpZiAodmFsdWUgPT0gInRydWUiKSB7Ci0gICAgICByZXR1cm4gbmV3IERhcnRPYmplY3RJbXBsKHR5cGVQcm92aWRlci5ib29sVHlwZSwgQm9vbFN0YXRlLmZyb20odHJ1ZSkpOworICAgICAgcmV0dXJuIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIuYm9vbFR5cGUsIEJvb2xTdGF0ZS5UUlVFX1NUQVRFKTsKICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIpIHsKLSAgICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLmJvb2xUeXBlLCBCb29sU3RhdGUuZnJvbShmYWxzZSkpOworICAgICAgcmV0dXJuIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIuYm9vbFR5cGUsIEJvb2xTdGF0ZS5GQUxTRV9TVEFURSk7CiAgICAgfQotICAgIHJldHVybiBudWxsOworICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLm51bGxUeXBlLCBOdWxsU3RhdGUuTlVMTF9TVEFURSk7CiAgIH0KIAogICAvKioKLSAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbnRlcnByZXRlZCBhcyBhbiBpbnRlZ2VyIHZhbHVlLCBvcgotICAgKiBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkLgorICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgdmFsdWUuIElmIHRoZQorICAgKiB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZCAob3IgW3ZhcmlhYmxlTmFtZV0gaXMgbnVsbCksIGEgRGFydE9iamVjdCByZXByZXNlbnRpbmcgInVua25vd24iCisgICAqIGlzIHJldHVybmVkLiBJZiB0aGUgdmFsdWUgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIGludGVnZXIsIGEgRGFydE9iamVjdCByZXByZXNlbnRpbmcgbnVsbCBpcworICAgKiByZXR1cm5lZC4KICAgICoKICAgICogQHBhcmFtIHR5cGVQcm92aWRlciB0aGUgdHlwZSBwcm92aWRlciB1c2VkIHRvIGZpbmQgdGhlIHR5cGUgJ2ludCcKICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQKLSAgICogQHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWYgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyIHZhbHVlCiAgICAqLwogICBEYXJ0T2JqZWN0IGdldEludChUeXBlUHJvdmlkZXIgdHlwZVByb3ZpZGVyLCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7CiAgICAgU3RyaW5nIHZhbHVlID0gX2RlY2xhcmVkVmFyaWFibGVzW3ZhcmlhYmxlTmFtZV07CiAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIuaW50VHlwZSwgSW50U3RhdGUuVU5LTk9XTl9WQUxVRSk7CiAgICAgfQotICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLmludFR5cGUsIG5ldyBJbnRTdGF0ZShpbnQucGFyc2UodmFsdWUpKSk7CisgICAgaW50IGJpZ0ludGVnZXI7CisgICAgdHJ5IHsKKyAgICAgIGJpZ0ludGVnZXIgPSBpbnQucGFyc2UodmFsdWUpOworICAgIH0gb24gRm9ybWF0RXhjZXB0aW9uIGNhdGNoIChleGNlcHRpb24pIHsKKyAgICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLm51bGxUeXBlLCBOdWxsU3RhdGUuTlVMTF9TVEFURSk7CisgICAgfQorICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLmludFR5cGUsIG5ldyBJbnRTdGF0ZShiaWdJbnRlZ2VyKSk7CiAgIH0KIAogICAvKioKICAgICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbnRlcnByZXRlZCBhcyBhIFN0cmluZyB2YWx1ZSwgb3IKLSAgICogYG51bGxgIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4KKyAgICogYG51bGxgIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgZGVmaW5lZC4gUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2l0aCB0aGUgZ2l2ZW4KKyAgICogbmFtZSBpbnRlcnByZXRlZCBhcyBhIFN0cmluZyB2YWx1ZS4gSWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBkZWZpbmVkIChvciBbdmFyaWFibGVOYW1lXSBpcworICAgKiBudWxsKSwgYSBEYXJ0T2JqZWN0IHJlcHJlc2VudGluZyAidW5rbm93biIgaXMgcmV0dXJuZWQuCiAgICAqCiAgICAqIEBwYXJhbSB0eXBlUHJvdmlkZXIgdGhlIHR5cGUgcHJvdmlkZXIgdXNlZCB0byBmaW5kIHRoZSB0eXBlICdTdHJpbmcnCiAgICAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHdob3NlIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkCkBAIC0xNzg4LDcgKzE4OTEsNyBAQAogICBEYXJ0T2JqZWN0IGdldFN0cmluZyhUeXBlUHJvdmlkZXIgdHlwZVByb3ZpZGVyLCBTdHJpbmcgdmFyaWFibGVOYW1lKSB7CiAgICAgU3RyaW5nIHZhbHVlID0gX2RlY2xhcmVkVmFyaWFibGVzW3ZhcmlhYmxlTmFtZV07CiAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgIHJldHVybiBudWxsOworICAgICAgcmV0dXJuIG5ldyBEYXJ0T2JqZWN0SW1wbCh0eXBlUHJvdmlkZXIuaW50VHlwZSwgSW50U3RhdGUuVU5LTk9XTl9WQUxVRSk7CiAgICAgfQogICAgIHJldHVybiBuZXcgRGFydE9iamVjdEltcGwodHlwZVByb3ZpZGVyLnN0cmluZ1R5cGUsIG5ldyBTdHJpbmdTdGF0ZSh2YWx1ZSkpOwogICB9CkBAIC0xOTg2LDYgKzIwODksOSBAQAogICBib29sIGdldCBpc0Jvb2xOdW1TdHJpbmdPck51bGwgPT4gdHJ1ZTsKIAogICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNVbmtub3duID0+IHZhbHVlID09IG51bGw7CisKKyAgQG92ZXJyaWRlCiAgIEJvb2xTdGF0ZSBsZXNzVGhhbihJbnN0YW5jZVN0YXRlIHJpZ2h0T3BlcmFuZCkgewogICAgIGFzc2VydE51bU9yTnVsbChyaWdodE9wZXJhbmQpOwogICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CkBAIC0zNTY1LDYgKzM2NzEsOSBAQAogICBib29sIGdldCBpc0Jvb2xOdW1TdHJpbmdPck51bGwgPT4gdHJ1ZTsKIAogICBAb3ZlcnJpZGUKKyAgYm9vbCBnZXQgaXNVbmtub3duID0+IHZhbHVlID09IG51bGw7CisKKyAgQG92ZXJyaWRlCiAgIEJvb2xTdGF0ZSBsZXNzVGhhbihJbnN0YW5jZVN0YXRlIHJpZ2h0T3BlcmFuZCkgewogICAgIGFzc2VydE51bU9yTnVsbChyaWdodE9wZXJhbmQpOwogICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0IGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VsZW1lbnQuZGFydAppbmRleCBhNWZlMmQwLi5mYzA5OGY3IDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZWxlbWVudC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbGVtZW50LmRhcnQKQEAgLTE4LDYgKzE4LDcgQEAKIGltcG9ydCAnaHRtbC5kYXJ0JyBzaG93IFhtbEF0dHJpYnV0ZU5vZGUsIFhtbFRhZ05vZGU7CiBpbXBvcnQgJ2VuZ2luZS5kYXJ0JyBzaG93IEFuYWx5c2lzQ29udGV4dCwgQW5hbHlzaXNFbmdpbmUsIEFuYWx5c2lzRXhjZXB0aW9uOwogaW1wb3J0ICdjb25zdGFudC5kYXJ0JyBzaG93IEV2YWx1YXRpb25SZXN1bHRJbXBsOworaW1wb3J0ICdyZXNvbHZlci5kYXJ0JzsKIGltcG9ydCAndXRpbGl0aWVzX2RhcnQuZGFydCc7CiAKIC8qKgpAQCAtNTQ4Niw2ICs1NDg3LDE2IEBACiAgICAgcmV0dXJuIHNSZXRUeXBlLmlzVm9pZCB8fCAodFJldFR5cGUgYXMgVHlwZUltcGwpLmlzTW9yZVNwZWNpZmljVGhhbjIoc1JldFR5cGUsIHdpdGhEeW5hbWljLCB2aXNpdGVkVHlwZVBhaXJzKTsKICAgfQogCisgIC8qKgorICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhc3NpZ25hYmxlIHRvIHRoZSBnaXZlbiB0eXBlLiBBIGZ1bmN0aW9uIHR5cGUgPGk+VDwvaT4gbWF5CisgICAqIGJlIGFzc2lnbmVkIHRvIGEgZnVuY3Rpb24gdHlwZSA8aT5TPC9pPiwgd3JpdHRlbiA8aT5UPC9pPiAmaEFycjsgPGk+UzwvaT4sIGlmZiA8aT5UPC9pPiA8OgorICAgKiA8aT5TPC9pPiAoRnVuY3Rpb24gVHlwZXMgc2VjdGlvbiBvZiBzcGVjKS4gTm90ZSB0aGF0IHRoaXMgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZQorICAgKiAibWF5IGJlIGFzc2lnbmVkIHRvIiBydWxlIGZvciBpbnRlcmZhY2UgdHlwZXMuCisgICAqCisgICAqCisgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGJlaW5nIGNvbXBhcmVkIHdpdGggdGhpcyB0eXBlCisgICAqIEByZXR1cm4gYHRydWVgIGlmIHRoaXMgdHlwZSBpcyBhc3NpZ25hYmxlIHRvIHRoZSBnaXZlbiB0eXBlCisgICAqLwogICBAb3ZlcnJpZGUKICAgYm9vbCBpc0Fzc2lnbmFibGVUbyhEYXJ0VHlwZSB0eXBlKSA9PiBpc1N1YnR5cGVPZjIodHlwZSwgbmV3IEhhc2hTZXQ8VHlwZUltcGxfVHlwZVBhaXI+KCkpOwogCkBAIC03MTY2LDEwICs3MTc3LDU3IEBACiAgICAgfSBlbHNlIGlmICh0eXBlIGlzIFR5cGVQYXJhbWV0ZXJUeXBlKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfSBlbHNlIGlmICh0eXBlIGlzIEZ1bmN0aW9uVHlwZSkgeworICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRyYW5zaXRpdml0eQorICAgICAgLy8gZm9yIGZ1bmN0aW9uIHR5cGUgc3VidHlwaW5nIG9uIHRoZSBSSFMsIGJ1dCBhIGxpdGVyYWwgcmVhZGluZworICAgICAgLy8gb2YgdGhlIHNwZWMgZG9lcyBub3Qgc3BlY2lmeSB0aGlzLiBNb3JlIHByZWNpc2VseTogaWYgVCA8OiBGMSBhbmQgRjEgPDogRjIgYW5kCisgICAgICAvLyBGMSBhbmQgRjIgYXJlIGZ1bmN0aW9uIHR5cGVzLCB0aGVuIHdlIGFzc3VtZSBUIDw6IEYyLgorICAgICAgLy8KKyAgICAgIC8vIEZyb20gdGhlIEZ1bmN0aW9uIFR5cGVzIHNlY3Rpb24gb2YgdGhlIHNwZWM6CisgICAgICAvLworICAgICAgLy8gICBJZiBhIHR5cGUgSSBpbmNsdWRlcyBhbiBpbnN0YW5jZSBtZXRob2QgbmFtZWQgY2FsbCgpLCBhbmQgdGhlIHR5cGUgb2YgY2FsbCgpCisgICAgICAvLyAgIGlzIHRoZSBmdW5jdGlvbiB0eXBlIEYsIHRoZW4gSSBpcyBjb25zaWRlcmVkIHRvIGJlIGEgc3VidHlwZSBvZiBGLgorICAgICAgLy8KKyAgICAgIC8vIEhvd2V2ZXIsIHRoZSBzZWN0aW9uIG9uIEludGVyZmFjZSBUeXBlcyBzYXlzCisgICAgICAvLworICAgICAgLy8gICBUIGlzIGEgc3VidHlwZSBvZiBTLCB3cml0dGVuIFQgPDogUywgaWZmIFtib3R0b20vZHluYW1pY11UIDw8IFMuCisgICAgICAvLworICAgICAgLy8gYWZ0ZXIgZ2l2aW5nIHJ1bGVzIGZvciA8PCAocHJvbm91bmNlZCAibW9yZSBzcGVjaWZpYyB0aGFuIikuIEhvd2V2ZXIsIHRoZSAib25seSBpZiIKKyAgICAgIC8vIGRpcmVjdGlvbiBvZiB0aGUgImlmZiIKKyAgICAgIC8vIGluIHRoZSBkZWZpbml0aW9uIG9mIDw6IHNlZW1zIHRvIGJlIGNvbnRyYWRpY3RlZCBieSB0aGUgc3BlY2lhbCBjYXNlIDw6IHJ1bGUKKyAgICAgIC8vIHF1b3RlZCBmcm9tIHRoZSBGdW5jdGlvbiBUeXBlcyBzZWN0aW9uOiBJIHNlZSBubyBydWxlIGZvciA8PCB3aGljaCB0ZWxscyB1cyB0aGF0CisgICAgICAvLyBJIDw8IEYgaWYgSSBoYXMgY2FsbCgpIGF0IHR5cGUgRi4KKyAgICAgIC8vCisgICAgICAvLyBBZnRlciBkZWZpbmluZyA8OiAsIHRoZSBzcGVjIHRoZW4KKyAgICAgIC8vIGVtcGhhc2l6ZXMgdGhhdCB1bmxpa2UgdGhlIHJlbGF0aW9uIDw8LCB0aGUgcmVsYXRpb24gPDogaXMgbm90IHRyYW5zaXRpdmUgaW4gZ2VuZXJhbDoKKyAgICAgIC8vCisgICAgICAvLyAgIE5vdGUgdGhhdCA8OiBpcyBub3QgYSBwYXJ0aWFsIG9yZGVyIG9uIHR5cGVzLCBpdCBpcyBvbmx5IGJpbmFyeSByZWxhdGlvbiBvbiB0eXBlcy4KKyAgICAgIC8vICAgVGhpcyBpcyBiZWNhdXNlIDw6IGlzIG5vdCB0cmFuc2l0aXZlLiBJZiBpdCB3YXMsIHRoZSBzdWJ0eXBlIHJ1bGUgd291bGQgaGF2ZSBhIGN5Y2xlLgorICAgICAgLy8gICBGb3IgZXhhbXBsZTogTGlzdCA8OiBMaXN0PFN0cmluZz4gYW5kIExpc3Q8aW50PiA8OiBMaXN0LCBidXQgTGlzdDxpbnQ+IGlzIG5vdCBhIHN1YnR5cGUKKyAgICAgIC8vICAgb2YgTGlzdDxTdHJpbmc+LiBBbHRob3VnaCA8OiBpcyBub3QgYSBwYXJ0aWFsIG9yZGVyIG9uIHR5cGVzLCBpdCBkb2VzIGNvbnRhaW4gYSBwYXJ0aWFsCisgICAgICAvLyAgIG9yZGVyLCBuYW1lbHkgPDwuIFRoaXMgbWVhbnMgdGhhdCwgYmFycmluZyByYXcgdHlwZXMsIGludHVpdGlvbiBhYm91dCBjbGFzc2ljYWwgc3VidHlwZQorICAgICAgLy8gICBydWxlcyBkb2VzIGFwcGx5LgorICAgICAgLy8KKyAgICAgIC8vIFRoZXJlIGlzIG5vIG90aGVyIG9jY3VycmVuY2Ugb2YgdGhlIHdvcmQgInJhdyIgaW4gcmVsYXRpb24gdG8gdHlwZXMgaW4gdGhlIHNwZWMgdGhhdCBJIGNhbgorICAgICAgLy8gZmluZCwgYnV0IHByZXN1bWFibHkgaXQncyBhIHJlZmVyZW5jZSB0bworICAgICAgLy8KKyAgICAgIC8vICAgaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvdHV0b3JpYWwvamF2YS9nZW5lcmljcy9yYXdUeXBlcy5odG1sCisgICAgICAvLworICAgICAgLy8gc28gZS5nLiBub24tZ2VuZXJpYyB0eXBlcyBhcmUgbmV2ZXIgcmF3LiBBcyBwb2ludGVkIG91dCBieSBwYXVsYmVycnksIGl0J3Mgbm90IGNsZWFyCisgICAgICAvLyB3aGV0aGVyIGEgdHlwZSBsaWtlIFQ8aW50LCBkeW5hbWljPiBzaG91bGQgYmUgY29uc2lkZXJlZCByYXcgb3Igbm90LiBPbiB0aGUgb25lIGhhbmQsIGl0CisgICAgICAvLyBkb2Vzbid0IGNvcnJlc3BvbmQgdG8gYSAicmF3Ii1pbi10aGUtSmF2YS1zZW5zZSBvY2N1cnJlbmNlIG9mIFQsIHdoaWNoIHdvdWxkIGluc3RlYWQKKyAgICAgIC8vIGJlIFQ8ZHluYW1pYywgZHluYW1pYz47IG9uIHRoZSBvdGhlciBoYW5kLCBpdCdzIHRyZWF0ZWQgZGlmZmVyZW50bHkgYnkgPDogYW5kIDw8IHdoZW4KKyAgICAgIC8vIG9jY3VycmluZyBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuCiAgICAgICBDbGFzc0VsZW1lbnQgZWxlbWVudCA9IHRoaXMuZWxlbWVudDsKLSAgICAgIE1ldGhvZEVsZW1lbnQgY2FsbE1ldGhvZCA9IGVsZW1lbnQubG9va1VwTWV0aG9kKCJjYWxsIiwgZWxlbWVudC5saWJyYXJ5KTsKLSAgICAgIGlmIChjYWxsTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxNZXRob2QudHlwZS5pc1N1YnR5cGVPZih0eXBlKTsKKyAgICAgIEluaGVyaXRhbmNlTWFuYWdlciBtYW5hZ2VyID0gbmV3IEluaGVyaXRhbmNlTWFuYWdlcihlbGVtZW50LmxpYnJhcnkpOworICAgICAgRnVuY3Rpb25UeXBlIGNhbGxUeXBlID0gbWFuYWdlci5sb29rdXBNZW1iZXJUeXBlKHRoaXMsICJjYWxsIik7CisgICAgICBpZiAoY2FsbFR5cGUgIT0gbnVsbCkgeworICAgICAgICAvLyBBIG1vcmUgbGl0ZXJhbCByZWFkaW5nIG9mIHRoZSBzcGVjIHdvdWxkIGdpdmUgc29tZXRoaW5nIGxpa2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gIHJldHVybiBjYWxsVHlwZS5lcXVhbHModHlwZSkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gaGVyZSwgYnV0IHRoYXQgY2F1c2VzIDEwMSBlcnJvcnMgaW4gdGhlIGV4dGVybmFsIHRlc3RzCisgICAgICAgIC8vICh0b29scy90ZXN0LnB5IC0tbW9kZSByZWxlYXNlIC0tY29tcGlsZXIgZGFydGFuYWx5emVyIC0tcnVudGltZSBub25lKS4KKyAgICAgICAgcmV0dXJuIGNhbGxUeXBlLmlzU3VidHlwZU9mKHR5cGUpOwogICAgICAgfQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSBpZiAodHlwZSBpcyEgSW50ZXJmYWNlVHlwZSkgewpAQCAtOTc1MSw2ICs5ODA5LDEzIEBACiAgICAgYnVpbGRlci5hcHBlbmQodmFyaWFibGUuZGlzcGxheU5hbWUpOwogICAgIHN1cGVyLmFwcGVuZFRvKGJ1aWxkZXIpOwogICB9CisKKyAgQG92ZXJyaWRlCisgIFN0cmluZyBnZXQgaWRlbnRpZmllciB7CisgICAgU3RyaW5nIG5hbWUgPSBkaXNwbGF5TmFtZTsKKyAgICBTdHJpbmcgc3VmZml4ID0gaXNHZXR0ZXIgPyAiPyIgOiAiPSI7CisgICAgcmV0dXJuICIke25hbWV9JHtzdWZmaXh9IjsKKyAgfQogfQogCiAvKioKQEAgLTEwNDgzLDE0ICsxMDU0OCwxNCBAQAogICAvKioKICAgICogUmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYXNzaWduYWJsZSB0byB0aGUgZ2l2ZW4gdHlwZS4gQSB0eXBlIDxpPlQ8L2k+IG1heSBiZQogICAgKiBhc3NpZ25lZCB0byBhIHR5cGUgPGk+UzwvaT4sIHdyaXR0ZW4gPGk+VDwvaT4gJmhBcnI7IDxpPlM8L2k+LCBpZmYgZWl0aGVyIDxpPlQ8L2k+IDw6IDxpPlM8L2k+Ci0gICAqIG9yIDxpPlM8L2k+IDw6IDxpPlQ8L2k+LgorICAgKiBvciA8aT5TPC9pPiA8OiA8aT5UPC9pPiAoSW50ZXJmYWNlIFR5cGVzIHNlY3Rpb24gb2Ygc3BlYykuCiAgICAqCiAgICAqIFRoZSBnaXZlbiBzZXQgb2YgcGFpcnMgb2YgdHlwZXMgKFQxLCBUMiksIHdoZXJlIGVhY2ggcGFpciBpbmRpY2F0ZXMgdGhhdCB3ZSBpbnZva2VkIHRoaXMgbWV0aG9kCiAgICAqIGJlY2F1c2Ugd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGFuc3dlcmluZyB0aGUgcXVlc3Rpb24gb2Ygd2hldGhlciBUMSBpcyBhIHN1YnR5cGUgb2YgVDIsIGlzCiAgICAqIHVzZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcy4KICAgICoKICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgYmVpbmcgY29tcGFyZWQgd2l0aCB0aGlzIHR5cGUKLSAgICogQHBhcmFtIHZpc2l0ZWRQYWlycyB0aGUgc2V0IG9mIHBhaXJzIG9mIHR5cGVzIHVzZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcworICAgKiBAcGFyYW0gdmlzaXRlZFR5cGVQYWlycyB0aGUgc2V0IG9mIHBhaXJzIG9mIHR5cGVzIHVzZWQgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wcwogICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGlzIHR5cGUgaXMgYXNzaWduYWJsZSB0byB0aGUgZ2l2ZW4gdHlwZQogICAgKi8KICAgYm9vbCBpc0Fzc2lnbmFibGVUbzIoRGFydFR5cGUgdHlwZSwgU2V0PFR5cGVJbXBsX1R5cGVQYWlyPiB2aXNpdGVkVHlwZVBhaXJzKSA9PiBpc1N1YnR5cGVPZjIodHlwZSwgdmlzaXRlZFR5cGVQYWlycykgfHwgKHR5cGUgYXMgVHlwZUltcGwpLmlzU3VidHlwZU9mMih0aGlzLCB2aXNpdGVkVHlwZVBhaXJzKTsKQEAgLTEwNTE2LDcgKzEwNTgxLDcgQEAKICAgICoKICAgICogQHBhcmFtIHR5cGUgdGhlIHR5cGUgYmVpbmcgY29tcGFyZWQgd2l0aCB0aGlzIHR5cGUKICAgICogQHBhcmFtIHdpdGhEeW5hbWljIGB0cnVlYCBpZiAiZHluYW1pYyIgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYSBzdWJ0eXBlIG9mIGFueSB0eXBlCi0gICAqIEBwYXJhbSB2aXNpdGVkUGFpcnMgdGhlIHNldCBvZiBwYWlycyBvZiB0eXBlcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKKyAgICogQHBhcmFtIHZpc2l0ZWRUeXBlUGFpcnMgdGhlIHNldCBvZiBwYWlycyBvZiB0eXBlcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKICAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZ2l2ZW4gdHlwZQogICAgKi8KICAgYm9vbCBpc01vcmVTcGVjaWZpY1RoYW4yKERhcnRUeXBlIHR5cGUsIGJvb2wgd2l0aER5bmFtaWMsIFNldDxUeXBlSW1wbF9UeXBlUGFpcj4gdmlzaXRlZFR5cGVQYWlycykgewpAQCAtMTA1NDQsNyArMTA2MDksNyBAQAogICAgKiB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuCiAgICAqCiAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIGJlaW5nIGNvbXBhcmVkIHdpdGggdGhpcyB0eXBlCi0gICAqIEBwYXJhbSB2aXNpdGVkUGFpcnMgdGhlIHNldCBvZiBwYWlycyBvZiB0eXBlcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKKyAgICogQHBhcmFtIHZpc2l0ZWRUeXBlUGFpcnMgdGhlIHNldCBvZiBwYWlycyBvZiB0eXBlcyB1c2VkIHRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMKICAgICogQHJldHVybiBgdHJ1ZWAgaWYgdGhpcyB0eXBlIGlzIGEgc3VidHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZQogICAgKi8KICAgYm9vbCBpc1N1YnR5cGVPZjIoRGFydFR5cGUgdHlwZSwgU2V0PFR5cGVJbXBsX1R5cGVQYWlyPiB2aXNpdGVkVHlwZVBhaXJzKSB7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvZW5naW5lLmRhcnQKaW5kZXggYzc0NDJiOC4uOWZjYWRjNyAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL2VuZ2luZS5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9lbmdpbmUuZGFydApAQCAtNTYwMSw4ICs1NjAxLDI2IEBACiAgIH0KIAogICAvKioKKyAgICogRW5zdXJlIHRoYXQgdGhlIGdpdmVuIGxpYnJhcnkgaGFzIGFuIGVsZW1lbnQgbW9kZWwgYnVpbHQgZm9yIGl0LiBJZiBhbm90aGVyIHRhc2sgbmVlZHMgdG8gYmUKKyAgICogZXhlY3V0ZWQgZmlyc3QgaW4gb3JkZXIgdG8gYnVpbGQgdGhlIGVsZW1lbnQgbW9kZWwsIHRoYXQgdGFzayBpcyBwbGFjZWQgaW4gW3Rhc2tEYXRhXS4KKyAgICoKKyAgICogQHBhcmFtIGxpYnJhcnkgdGhlIGxpYnJhcnkgd2hpY2ggbmVlZHMgYW4gZWxlbWVudCBtb2RlbC4KKyAgICovCisgIHZvaWQgX2Vuc3VyZUVsZW1lbnRNb2RlbChSZXNvbHZhYmxlTGlicmFyeSBsaWJyYXJ5KSB7CisgICAgU291cmNlIGxpYnJhcnlTb3VyY2UgPSBsaWJyYXJ5LmxpYnJhcnlTb3VyY2U7CisgICAgRGFydEVudHJ5IGxpYnJhcnlFbnRyeSA9IEFuYWx5c2lzQ29udGV4dEltcGxfdGhpcy5fZ2V0UmVhZGFibGVEYXJ0RW50cnkobGlicmFyeVNvdXJjZSk7CisgICAgaWYgKGxpYnJhcnlFbnRyeSAhPSBudWxsICYmIGxpYnJhcnlFbnRyeS5nZXRTdGF0ZShEYXJ0RW50cnkuUEFSU0VEX1VOSVQpICE9IENhY2hlU3RhdGUuRVJST1IpIHsKKyAgICAgIEFuYWx5c2lzQ29udGV4dEltcGxfdGhpcy5fd29ya01hbmFnZXIuYWRkRmlyc3QobGlicmFyeVNvdXJjZSwgU291cmNlUHJpb3JpdHkuTElCUkFSWSk7CisgICAgICBpZiAoX3Rhc2tEYXRhID09IG51bGwpIHsKKyAgICAgICAgX3Rhc2tEYXRhID0gQW5hbHlzaXNDb250ZXh0SW1wbF90aGlzLl9jcmVhdGVSZXNvbHZlRGFydExpYnJhcnlUYXNrKGxpYnJhcnlTb3VyY2UsIGxpYnJhcnlFbnRyeSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLyoqCiAgICAqIEVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgYXJlIGV4cG9ydGVkIGJ5IHRoZSBnaXZlbiBsaWJyYXJ5IChidXQgYXJlIG5vdAotICAgKiB0aGVtc2VsdmVzIGluIHRoZSBjeWNsZSkgaGF2ZSBlbGVtZW50IG1vZGVscyBidWlsdCBmb3IgdGhlbS4KKyAgICogdGhlbXNlbHZlcyBpbiB0aGUgY3ljbGUpIGhhdmUgZWxlbWVudCBtb2RlbHMgYnVpbHQgZm9yIHRoZW0uIElmIGFub3RoZXIgdGFzayBuZWVkcyB0byBiZQorICAgKiBleGVjdXRlZCBmaXJzdCBpbiBvcmRlciB0byBidWlsZCB0aGUgZWxlbWVudCBtb2RlbCwgdGhhdCB0YXNrIGlzIHBsYWNlZCBpbiBbdGFza0RhdGFdLgogICAgKgogICAgKiBAcGFyYW0gbGlicmFyeSB0aGUgbGlicmFyeSBiZWluZyB0ZXN0ZWQKICAgICovCkBAIC01NjEzLDE3ICs1NjMxLDEyIEBACiAgICAgICBSZXNvbHZhYmxlTGlicmFyeSBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVzW2ldOwogICAgICAgaWYgKCFfbGlicmFyaWVzSW5DeWNsZS5jb250YWlucyhkZXBlbmRlbmN5KSAmJiB2aXNpdGVkTGlicmFyaWVzLmFkZChkZXBlbmRlbmN5LmxpYnJhcnlTb3VyY2UpKSB7CiAgICAgICAgIGlmIChkZXBlbmRlbmN5LmxpYnJhcnlFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgICBTb3VyY2UgZGVwZW5kZW5jeVNvdXJjZSA9IGRlcGVuZGVuY3kubGlicmFyeVNvdXJjZTsKLSAgICAgICAgICBBbmFseXNpc0NvbnRleHRJbXBsX3RoaXMuX3dvcmtNYW5hZ2VyLmFkZEZpcnN0KGRlcGVuZGVuY3lTb3VyY2UsIFNvdXJjZVByaW9yaXR5LkxJQlJBUlkpOwotICAgICAgICAgIGlmIChfdGFza0RhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgX3Rhc2tEYXRhID0gQW5hbHlzaXNDb250ZXh0SW1wbF90aGlzLl9jcmVhdGVSZXNvbHZlRGFydExpYnJhcnlUYXNrKGRlcGVuZGVuY3lTb3VyY2UsIEFuYWx5c2lzQ29udGV4dEltcGxfdGhpcy5fZ2V0UmVhZGFibGVEYXJ0RW50cnkoZGVwZW5kZW5jeVNvdXJjZSkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KKyAgICAgICAgICBfZW5zdXJlRWxlbWVudE1vZGVsKGRlcGVuZGVuY3kpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIF9lbnN1cmVFeHBvcnRzKGRlcGVuZGVuY3ksIHZpc2l0ZWRMaWJyYXJpZXMpOwotICAgICAgICAgIGlmIChfdGFza0RhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX3Rhc2tEYXRhICE9IG51bGwpIHsKKyAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC01NjMxLDExICs1NjQ0LDEwIEBACiAKICAgLyoqCiAgICAqIEVuc3VyZSB0aGF0IGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgYXJlIGV4cG9ydGVkIGJ5IHRoZSBnaXZlbiBsaWJyYXJ5IChidXQgYXJlIG5vdAotICAgKiB0aGVtc2VsdmVzIGluIHRoZSBjeWNsZSkgaGF2ZSBlbGVtZW50IG1vZGVscyBidWlsdCBmb3IgdGhlbS4KKyAgICogdGhlbXNlbHZlcyBpbiB0aGUgY3ljbGUpIGhhdmUgZWxlbWVudCBtb2RlbHMgYnVpbHQgZm9yIHRoZW0uIElmIGFub3RoZXIgdGFzayBuZWVkcyB0byBiZQorICAgKiBleGVjdXRlZCBmaXJzdCBpbiBvcmRlciB0byBidWlsZCB0aGUgZWxlbWVudCBtb2RlbCwgdGhhdCB0YXNrIGlzIHBsYWNlZCBpbiBbdGFza0RhdGFdLgogICAgKgogICAgKiBAcGFyYW0gbGlicmFyeSB0aGUgbGlicmFyeSBiZWluZyB0ZXN0ZWQKLSAgICogQHRocm93cyBNaXNzaW5nRGF0YUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgbGlicmFyeSBiZWluZyBkZXBlbmRlZCBvbiB0aGF0IGRvZXMgbm90Ci0gICAqICAgICAgICAgICBoYXZlIGFuIGVsZW1lbnQgbW9kZWwgYnVpbHQgZm9yIGl0CiAgICAqLwogICB2b2lkIF9lbnN1cmVJbXBvcnRzKFJlc29sdmFibGVMaWJyYXJ5IGxpYnJhcnkpIHsKICAgICBMaXN0PFJlc29sdmFibGVMaWJyYXJ5PiBkZXBlbmRlbmNpZXMgPSBsaWJyYXJ5LmltcG9ydHM7CkBAIC01NjQzLDEwICs1NjU1LDggQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lDb3VudDsgaSsrKSB7CiAgICAgICBSZXNvbHZhYmxlTGlicmFyeSBkZXBlbmRlbmN5ID0gZGVwZW5kZW5jaWVzW2ldOwogICAgICAgaWYgKCFfbGlicmFyaWVzSW5DeWNsZS5jb250YWlucyhkZXBlbmRlbmN5KSAmJiBkZXBlbmRlbmN5LmxpYnJhcnlFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgU291cmNlIGRlcGVuZGVuY3lTb3VyY2UgPSBkZXBlbmRlbmN5LmxpYnJhcnlTb3VyY2U7Ci0gICAgICAgIEFuYWx5c2lzQ29udGV4dEltcGxfdGhpcy5fd29ya01hbmFnZXIuYWRkRmlyc3QoZGVwZW5kZW5jeVNvdXJjZSwgU291cmNlUHJpb3JpdHkuTElCUkFSWSk7Ci0gICAgICAgIGlmIChfdGFza0RhdGEgPT0gbnVsbCkgewotICAgICAgICAgIF90YXNrRGF0YSA9IEFuYWx5c2lzQ29udGV4dEltcGxfdGhpcy5fY3JlYXRlUmVzb2x2ZURhcnRMaWJyYXJ5VGFzayhkZXBlbmRlbmN5U291cmNlLCBBbmFseXNpc0NvbnRleHRJbXBsX3RoaXMuX2dldFJlYWRhYmxlRGFydEVudHJ5KGRlcGVuZGVuY3lTb3VyY2UpKTsKKyAgICAgICAgX2Vuc3VyZUVsZW1lbnRNb2RlbChkZXBlbmRlbmN5KTsKKyAgICAgICAgaWYgKF90YXNrRGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICB9CkBAIC02MzYxLDYgKzYzNzEsMTEgQEAKICAgc3RhdGljIGJvb2wgREVGQVVMVF9FTkFCTEVfREVGRVJSRURfTE9BRElORyA9IHRydWU7CiAKICAgLyoqCisgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlbmFibGluZyBhc3luYyBzdXBwb3J0LgorICAgKi8KKyAgc3RhdGljIGJvb2wgREVGQVVMVF9FTkFCTEVfQVNZTkMgPSBmYWxzZTsKKworICAvKioKICAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhbmFseXNpcyBpcyB0byBhbmFseXplIEFuZ3VsYXIuCiAgICAqLwogICBib29sIGFuYWx5emVBbmd1bGFyID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9wYXJzZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9wYXJzZXIuZGFydAppbmRleCA4ZmZjODc1Li5mZmRmZTBlIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcGFyc2VyLmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3BhcnNlci5kYXJ0CkBAIC0xNTcsNiArMTU3LDE1IEBACiAgIH0KIAogICBAb3ZlcnJpZGUKKyAgQXN0Tm9kZSB2aXNpdEF3YWl0RXhwcmVzc2lvbihBd2FpdEV4cHJlc3Npb24gbm9kZSkgeworICAgIGlmIChpZGVudGljYWwoX29sZE5vZGUsIG5vZGUuZXhwcmVzc2lvbikpIHsKKyAgICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIERlcGVuZGluZyBvbiBwcmVjZWRlbmNlLCB0aGlzIG1pZ2h0IG5vdCBiZSBzdWZmaWNpZW50LgorICAgICAgcmV0dXJuIF9wYXJzZXIucGFyc2VFeHByZXNzaW9uMigpOworICAgIH0KKyAgICByZXR1cm4gX25vdEFDaGlsZChub2RlKTsKKyAgfQorCisgIEBvdmVycmlkZQogICBBc3ROb2RlIHZpc2l0QmluYXJ5RXhwcmVzc2lvbihCaW5hcnlFeHByZXNzaW9uIG5vZGUpIHsKICAgICBpZiAoaWRlbnRpY2FsKF9vbGROb2RlLCBub2RlLmxlZnRPcGVyYW5kKSkgewogICAgICAgdGhyb3cgbmV3IEluc3VmZmljaWVudENvbnRleHRFeGNlcHRpb24oKTsKQEAgLTEwOTIsNiArMTEwMSwxNCBAQAogICAgIHJldHVybiBfbm90QUNoaWxkKG5vZGUpOwogICB9CiAKKyAgQG92ZXJyaWRlCisgIEFzdE5vZGUgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CisgICAgaWYgKGlkZW50aWNhbChfb2xkTm9kZSwgbm9kZS5leHByZXNzaW9uKSkgeworICAgICAgcmV0dXJuIF9wYXJzZXIucGFyc2VFeHByZXNzaW9uMigpOworICAgIH0KKyAgICByZXR1cm4gX25vdEFDaGlsZChub2RlKTsKKyAgfQorCiAgIC8qKgogICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiBhc3NpZ25tZW50IGV4cHJlc3Npb24gY2FuIGhhdmUgYSBjYXNjYWRlIGV4cHJlc3Npb24gb24gdGhlCiAgICAqIHJpZ2h0LWhhbmQgc2lkZS4KQEAgLTE0MzcsMTEgKzE0NTQsMTYgQEAKICAgYm9vbCBfcGFyc2VGdW5jdGlvbkJvZGllcyA9IHRydWU7CiAKICAgLyoqCi0gICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgcGFyc2VyIGlzIHRvIHBhcnNlIGRlZmVycmVkIGxpYnJhcmllcy4KKyAgICogQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvIHBhcnNlIGRlZmVycmVkIGxpYnJhcmllcy4KICAgICovCiAgIGJvb2wgX3BhcnNlRGVmZXJyZWRMaWJyYXJpZXMgPSBBbmFseXNpc09wdGlvbnNJbXBsLkRFRkFVTFRfRU5BQkxFX0RFRkVSUkVEX0xPQURJTkc7CiAKICAgLyoqCisgICAqIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHBhcnNlciBpcyB0byBwYXJzZSB0aGUgYXN5bmMgc3VwcG9ydC4KKyAgICovCisgIGJvb2wgX3BhcnNlQXN5bmMgPSBBbmFseXNpc09wdGlvbnNJbXBsLkRFRkFVTFRfRU5BQkxFX0FTWU5DOworCisgIC8qKgogICAgKiBUaGUgbmV4dCB0b2tlbiB0byBiZSBwYXJzZWQuCiAgICAqLwogICBUb2tlbiBfY3VycmVudFRva2VuOwpAQCAtMTQ2Miw2ICsxNDg0LDEwIEBACiAgICAqLwogICBib29sIF9pbkluaXRpYWxpemVyID0gZmFsc2U7CiAKKyAgc3RhdGljIFN0cmluZyBBU1lOQyA9ICJhc3luYyI7CisKKyAgc3RhdGljIFN0cmluZyBfQVdBSVQgPSAiYXdhaXQiOworCiAgIHN0YXRpYyBTdHJpbmcgX0hJREUgPSAiaGlkZSI7CiAKICAgc3RhdGljIFN0cmluZyBfT0YgPSAib2YiOwpAQCAtMTQ3Miw2ICsxNDk4LDEwIEBACiAKICAgc3RhdGljIFN0cmluZyBfU0hPVyA9ICJzaG93IjsKIAorICBzdGF0aWMgU3RyaW5nIFNZTkMgPSAic3luYyI7CisKKyAgc3RhdGljIFN0cmluZyBfWUlFTEQgPSAieWllbGQiOworCiAgIC8qKgogICAgKiBJbml0aWFsaXplIGEgbmV3bHkgY3JlYXRlZCBwYXJzZXIuCiAgICAqCkBAIC0xNTY3LDYgKzE1OTcsMTUgQEAKICAgfQogCiAgIC8qKgorICAgKiBTZXQgd2hldGhlciB0aGUgcGFyc2VyIGlzIHRvIHBhcnNlIHRoZSBhc3luYyBzdXBwb3J0LgorICAgKgorICAgKiBAcGFyYW0gcGFyc2VBc3luYyBgdHJ1ZWAgaWYgdGhlIHBhcnNlciBpcyB0byBwYXJzZSB0aGUgYXN5bmMgc3VwcG9ydAorICAgKi8KKyAgdm9pZCBzZXQgcGFyc2VBc3luYyhib29sIHBhcnNlQXN5bmMpIHsKKyAgICB0aGlzLl9wYXJzZUFzeW5jID0gcGFyc2VBc3luYzsKKyAgfQorCisgIC8qKgogICAgKiBTZXQgd2hldGhlciBwYXJzZXIgaXMgdG8gcGFyc2UgZGVmZXJyZWQgbGlicmFyaWVzLgogICAgKgogICAgKiBAcGFyYW0gcGFyc2VEZWZlcnJlZExpYnJhcmllcyBgdHJ1ZWAgaWYgcGFyc2VyIGlzIHRvIHBhcnNlIGRlZmVycmVkIGxpYnJhcmllcwpAQCAtMjA2NSw3ICsyMTA0LDEwIEBACiAgICAgaWYgKF9tYXRjaGVzS2V5d29yZChLZXl3b3JkLlRIUk9XKSkgewogICAgICAgcmV0dXJuIF9wYXJzZVRocm93RXhwcmVzc2lvbigpOwogICAgIH0gZWxzZSBpZiAoX21hdGNoZXNLZXl3b3JkKEtleXdvcmQuUkVUSFJPVykpIHsKKyAgICAgIC8vIFRPRE8oYnJpYW53aWxrZXJzb24pIFJldGhyb3cgaXMgYSBzdGF0ZW1lbnQgYWdhaW4uCiAgICAgICByZXR1cm4gX3BhcnNlUmV0aHJvd0V4cHJlc3Npb24oKTsKKyAgICB9IGVsc2UgaWYgKF9wYXJzZUFzeW5jICYmIF9tYXRjaGVzU3RyaW5nKF9BV0FJVCkpIHsKKyAgICAgIHJldHVybiBfcGFyc2VBd2FpdEV4cHJlc3Npb24oKTsKICAgICB9CiAgICAgLy8KICAgICAvLyBhc3NpZ25hYmxlRXhwcmVzc2lvbiBpcyBhIHN1YnNldCBvZiBjb25kaXRpb25hbEV4cHJlc3Npb24sIHNvIHdlIGNhbiBwYXJzZSBhIGNvbmRpdGlvbmFsCkBAIC0zNTU4LDYgKzM2MDAsMjMgQEAKICAgfQogCiAgIC8qKgorICAgKiBQYXJzZSBhIGF3YWl0IGV4cHJlc3Npb24uCisgICAqCisgICAqIDxwcmU+CisgICAqIGF3YWl0RXhwcmVzc2lvbiA6Oj0KKyAgICogICAgICdhd2FpdCcgZXhwcmVzc2lvbiAnOycKKyAgICogPC9wcmU+CisgICAqCisgICAqIEByZXR1cm4gdGhlIGF3YWl0IGV4cHJlc3Npb24gdGhhdCB3YXMgcGFyc2VkCisgICAqLworICBBd2FpdEV4cHJlc3Npb24gX3BhcnNlQXdhaXRFeHByZXNzaW9uKCkgeworICAgIFRva2VuIGF3YWl0VG9rZW4gPSBhbmRBZHZhbmNlOworICAgIEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IHBhcnNlRXhwcmVzc2lvbjIoKTsKKyAgICBUb2tlbiBzZW1pY29sb24gPSBfZXhwZWN0KFRva2VuVHlwZS5TRU1JQ09MT04pOworICAgIHJldHVybiBuZXcgQXdhaXRFeHByZXNzaW9uKGF3YWl0VG9rZW4sIGV4cHJlc3Npb24sIHNlbWljb2xvbik7CisgIH0KKworICAvKioKICAgICogUGFyc2UgYSBiaXR3aXNlIGFuZCBleHByZXNzaW9uLgogICAgKgogICAgKiA8cHJlPgpAQCAtNDYzNyw2ICs0Njk2LDEwIEBACiAgICAgYm9vbCB3YXNJbkxvb3AgPSBfaW5Mb29wOwogICAgIF9pbkxvb3AgPSB0cnVlOwogICAgIHRyeSB7CisgICAgICBUb2tlbiBhd2FpdEtleXdvcmQgPSBudWxsOworICAgICAgaWYgKF9tYXRjaGVzU3RyaW5nKF9BV0FJVCkpIHsKKyAgICAgICAgYXdhaXRLZXl3b3JkID0gYW5kQWR2YW5jZTsKKyAgICAgIH0KICAgICAgIFRva2VuIGZvcktleXdvcmQgPSBfZXhwZWN0S2V5d29yZChLZXl3b3JkLkZPUik7CiAgICAgICBUb2tlbiBsZWZ0UGFyZW50aGVzaXMgPSBfZXhwZWN0KFRva2VuVHlwZS5PUEVOX1BBUkVOKTsKICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0IHZhcmlhYmxlTGlzdCA9IG51bGw7CkBAIC00NjgzLDExICs0NzQ2LDE0IEBACiAgICAgICAgICAgVG9rZW4gcmlnaHRQYXJlbnRoZXNpcyA9IF9leHBlY3QoVG9rZW5UeXBlLkNMT1NFX1BBUkVOKTsKICAgICAgICAgICBTdGF0ZW1lbnQgYm9keSA9IHBhcnNlU3RhdGVtZW50MigpOwogICAgICAgICAgIGlmIChsb29wVmFyaWFibGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JFYWNoU3RhdGVtZW50LmNvbjIoZm9yS2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBpZGVudGlmaWVyLCBpbktleXdvcmQsIGl0ZXJhdG9yLCByaWdodFBhcmVudGhlc2lzLCBib2R5KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKGF3YWl0S2V5d29yZCwgZm9yS2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBpZGVudGlmaWVyLCBpbktleXdvcmQsIGl0ZXJhdG9yLCByaWdodFBhcmVudGhlc2lzLCBib2R5KTsKICAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIG5ldyBGb3JFYWNoU3RhdGVtZW50LmNvbjEoZm9yS2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBsb29wVmFyaWFibGUsIGluS2V5d29yZCwgaXRlcmF0b3IsIHJpZ2h0UGFyZW50aGVzaXMsIGJvZHkpOworICAgICAgICAgIHJldHVybiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24xKGF3YWl0S2V5d29yZCwgZm9yS2V5d29yZCwgbGVmdFBhcmVudGhlc2lzLCBsb29wVmFyaWFibGUsIGluS2V5d29yZCwgaXRlcmF0b3IsIHJpZ2h0UGFyZW50aGVzaXMsIGJvZHkpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAoYXdhaXRLZXl3b3JkICE9IG51bGwpIHsKKyAgICAgICAgX3JlcG9ydEVycm9yRm9yVG9rZW4oUGFyc2VyRXJyb3JDb2RlLklOVkFMSURfQVdBSVRfSU5fRk9SLCBhd2FpdEtleXdvcmQsIFtdKTsKKyAgICAgIH0KICAgICAgIFRva2VuIGxlZnRTZXBhcmF0b3IgPSBfZXhwZWN0KFRva2VuVHlwZS5TRU1JQ09MT04pOwogICAgICAgRXhwcmVzc2lvbiBjb25kaXRpb24gPSBudWxsOwogICAgICAgaWYgKCFfbWF0Y2hlcyhUb2tlblR5cGUuU0VNSUNPTE9OKSkgewpAQCAtNDczNiw3ICs0ODAyLDM4IEBACiAgICAgICAgICAgX3JlcG9ydEVycm9yRm9yQ3VycmVudFRva2VuKGVtcHR5RXJyb3JDb2RlLCBbXSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUZ1bmN0aW9uQm9keShhbmRBZHZhbmNlKTsKLSAgICAgIH0gZWxzZSBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLkZVTkNUSU9OKSkgeworICAgICAgfSBlbHNlIGlmIChfbWF0Y2hlc1N0cmluZyhfTkFUSVZFKSkgeworICAgICAgICBUb2tlbiBuYXRpdmVUb2tlbiA9IGFuZEFkdmFuY2U7CisgICAgICAgIFN0cmluZ0xpdGVyYWwgc3RyaW5nTGl0ZXJhbCA9IG51bGw7CisgICAgICAgIGlmIChfbWF0Y2hlcyhUb2tlblR5cGUuU1RSSU5HKSkgeworICAgICAgICAgIHN0cmluZ0xpdGVyYWwgPSBwYXJzZVN0cmluZ0xpdGVyYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUZ1bmN0aW9uQm9keShuYXRpdmVUb2tlbiwgc3RyaW5nTGl0ZXJhbCwgX2V4cGVjdChUb2tlblR5cGUuU0VNSUNPTE9OKSk7CisgICAgICB9CisgICAgICBUb2tlbiBrZXl3b3JkID0gbnVsbDsKKyAgICAgIFRva2VuIHN0YXIgPSBudWxsOworICAgICAgaWYgKF9wYXJzZUFzeW5jKSB7CisgICAgICAgIGlmIChfbWF0Y2hlc1N0cmluZyhBU1lOQykpIHsKKyAgICAgICAgICBrZXl3b3JkID0gYW5kQWR2YW5jZTsKKyAgICAgICAgICBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLlNUQVIpKSB7CisgICAgICAgICAgICBzdGFyID0gYW5kQWR2YW5jZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoX21hdGNoZXNTdHJpbmcoU1lOQykpIHsKKyAgICAgICAgICBrZXl3b3JkID0gYW5kQWR2YW5jZTsKKyAgICAgICAgICBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLlNUQVIpKSB7CisgICAgICAgICAgICBzdGFyID0gYW5kQWR2YW5jZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChfbWF0Y2hlcyhUb2tlblR5cGUuRlVOQ1RJT04pKSB7CisgICAgICAgIGlmIChrZXl3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICBpZiAoIV90b2tlbk1hdGNoZXNTdHJpbmcoa2V5d29yZCwgQVNZTkMpKSB7CisgICAgICAgICAgICBfcmVwb3J0RXJyb3JGb3JUb2tlbihQYXJzZXJFcnJvckNvZGUuSU5WQUxJRF9TWU5DLCBrZXl3b3JkLCBbXSk7CisgICAgICAgICAgICBrZXl3b3JkID0gbnVsbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKHN0YXIgIT0gbnVsbCkgeworICAgICAgICAgICAgX3JlcG9ydEVycm9yRm9yVG9rZW4oUGFyc2VyRXJyb3JDb2RlLklOVkFMSURfU1RBUl9BRlRFUl9BU1lOQywgc3RhciwgW10pOworICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBUb2tlbiBmdW5jdGlvbkRlZmluaXRpb24gPSBhbmRBZHZhbmNlOwogICAgICAgICBFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZUV4cHJlc3Npb24yKCk7CiAgICAgICAgIFRva2VuIHNlbWljb2xvbiA9IG51bGw7CkBAIC00NzQ2LDIwICs0ODQzLDE4IEBACiAgICAgICAgIGlmICghX3BhcnNlRnVuY3Rpb25Cb2RpZXMpIHsKICAgICAgICAgICByZXR1cm4gbmV3IEVtcHR5RnVuY3Rpb25Cb2R5KF9jcmVhdGVTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OKSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KGZ1bmN0aW9uRGVmaW5pdGlvbiwgZXhwcmVzc2lvbiwgc2VtaWNvbG9uKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KGtleXdvcmQsIGZ1bmN0aW9uRGVmaW5pdGlvbiwgZXhwcmVzc2lvbiwgc2VtaWNvbG9uKTsKICAgICAgIH0gZWxzZSBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCkpIHsKKyAgICAgICAgaWYgKGtleXdvcmQgIT0gbnVsbCkgeworICAgICAgICAgIGlmIChfdG9rZW5NYXRjaGVzU3RyaW5nKGtleXdvcmQsIFNZTkMpICYmIHN0YXIgPT0gbnVsbCkgeworICAgICAgICAgICAgX3JlcG9ydEVycm9yRm9yVG9rZW4oUGFyc2VyRXJyb3JDb2RlLk1JU1NJTkdfU1RBUl9BRlRFUl9TWU5DLCBrZXl3b3JkLCBbXSk7CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmICghX3BhcnNlRnVuY3Rpb25Cb2RpZXMpIHsKICAgICAgICAgICBfc2tpcEJsb2NrKCk7CiAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUZ1bmN0aW9uQm9keShfY3JlYXRlU3ludGhldGljVG9rZW4oVG9rZW5UeXBlLlNFTUlDT0xPTikpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgQmxvY2tGdW5jdGlvbkJvZHkocGFyc2VCbG9jaygpKTsKLSAgICAgIH0gZWxzZSBpZiAoX21hdGNoZXNTdHJpbmcoX05BVElWRSkpIHsKLSAgICAgICAgVG9rZW4gbmF0aXZlVG9rZW4gPSBhbmRBZHZhbmNlOwotICAgICAgICBTdHJpbmdMaXRlcmFsIHN0cmluZ0xpdGVyYWwgPSBudWxsOwotICAgICAgICBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLlNUUklORykpIHsKLSAgICAgICAgICBzdHJpbmdMaXRlcmFsID0gcGFyc2VTdHJpbmdMaXRlcmFsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGdW5jdGlvbkJvZHkobmF0aXZlVG9rZW4sIHN0cmluZ0xpdGVyYWwsIF9leHBlY3QoVG9rZW5UeXBlLlNFTUlDT0xPTikpOworICAgICAgICByZXR1cm4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KGtleXdvcmQsIHN0YXIsIHBhcnNlQmxvY2soKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBJbnZhbGlkIGZ1bmN0aW9uIGJvZHkKICAgICAgICAgX3JlcG9ydEVycm9yRm9yQ3VycmVudFRva2VuKGVtcHR5RXJyb3JDb2RlLCBbXSk7CkBAIC01NTQ5LDYgKzU2NDQsMTAgQEAKICAgICAgICAgX3JlcG9ydEVycm9yRm9yQ3VycmVudFRva2VuKFBhcnNlckVycm9yQ29kZS5NSVNTSU5HX1NUQVRFTUVOVCwgW10pOwogICAgICAgICByZXR1cm4gbmV3IEVtcHR5U3RhdGVtZW50KF9jcmVhdGVTeW50aGV0aWNUb2tlbihUb2tlblR5cGUuU0VNSUNPTE9OKSk7CiAgICAgICB9CisgICAgfSBlbHNlIGlmIChfcGFyc2VBc3luYyAmJiBfbWF0Y2hlc1N0cmluZyhfWUlFTEQpKSB7CisgICAgICByZXR1cm4gX3BhcnNlWWllbGRTdGF0ZW1lbnQoKTsKKyAgICB9IGVsc2UgaWYgKF9wYXJzZUFzeW5jICYmIF9tYXRjaGVzU3RyaW5nKF9BV0FJVCkgJiYgX3Rva2VuTWF0Y2hlc0tleXdvcmQoX3BlZWsoKSwgS2V5d29yZC5GT1IpKSB7CisgICAgICByZXR1cm4gX3BhcnNlRm9yU3RhdGVtZW50KCk7CiAgICAgfSBlbHNlIGlmIChfbWF0Y2hlcyhUb2tlblR5cGUuU0VNSUNPTE9OKSkgewogICAgICAgcmV0dXJuIF9wYXJzZUVtcHR5U3RhdGVtZW50KCk7CiAgICAgfSBlbHNlIGlmIChfaXNJbml0aWFsaXplZFZhcmlhYmxlRGVjbGFyYXRpb24oKSkgewpAQCAtNjUwMSw2ICs2NjAwLDI3IEBACiAgIH0KIAogICAvKioKKyAgICogUGFyc2UgYSB5aWVsZCBzdGF0ZW1lbnQuCisgICAqCisgICAqIDxwcmU+CisgICAqIHlpZWxkU3RhdGVtZW50IDo6PQorICAgKiAgICAgJ3lpZWxkJyAnKic/IGV4cHJlc3Npb24gJzsnCisgICAqIDwvcHJlPgorICAgKgorICAgKiBAcmV0dXJuIHRoZSB5aWVsZCBzdGF0ZW1lbnQgdGhhdCB3YXMgcGFyc2VkCisgICAqLworICBZaWVsZFN0YXRlbWVudCBfcGFyc2VZaWVsZFN0YXRlbWVudCgpIHsKKyAgICBUb2tlbiB5aWVsZFRva2VuID0gYW5kQWR2YW5jZTsKKyAgICBUb2tlbiBzdGFyID0gbnVsbDsKKyAgICBpZiAoX21hdGNoZXMoVG9rZW5UeXBlLlNUQVIpKSB7CisgICAgICBzdGFyID0gYW5kQWR2YW5jZTsKKyAgICB9CisgICAgRXhwcmVzc2lvbiBleHByZXNzaW9uID0gcGFyc2VFeHByZXNzaW9uMigpOworICAgIFRva2VuIHNlbWljb2xvbiA9IF9leHBlY3QoVG9rZW5UeXBlLlNFTUlDT0xPTik7CisgICAgcmV0dXJuIG5ldyBZaWVsZFN0YXRlbWVudCh5aWVsZFRva2VuLCBzdGFyLCBleHByZXNzaW9uLCBzZW1pY29sb24pOworICB9CisKKyAgLyoqCiAgICAqIFJldHVybiB0aGUgdG9rZW4gdGhhdCBpcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgY3VycmVudCB0b2tlbi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgICAqIFtwZWVrQXRdLgogICAgKgpAQCAtNjU2NCw2ICs2Njg0LDkgQEAKICAgICogQHBhcmFtIGFyZ3VtZW50cyB0aGUgYXJndW1lbnRzIHRvIHRoZSBlcnJvciwgdXNlZCB0byBjb21wb3NlIHRoZSBlcnJvciBtZXNzYWdlCiAgICAqLwogICB2b2lkIF9yZXBvcnRFcnJvckZvclRva2VuKFBhcnNlckVycm9yQ29kZSBlcnJvckNvZGUsIFRva2VuIHRva2VuLCBMaXN0PE9iamVjdD4gYXJndW1lbnRzKSB7CisgICAgaWYgKHRva2VuLnR5cGUgPT0gVG9rZW5UeXBlLkVPRikgeworICAgICAgdG9rZW4gPSB0b2tlbi5wcmV2aW91czsKKyAgICB9CiAgICAgX3JlcG9ydEVycm9yKG5ldyBBbmFseXNpc0Vycm9yLmNvbjIoX3NvdXJjZSwgdG9rZW4ub2Zmc2V0LCBNYXRoLm1heCh0b2tlbi5sZW5ndGgsIDEpLCBlcnJvckNvZGUsIGFyZ3VtZW50cykpOwogICB9CiAKQEAgLTcwMzYsNiArNzE1OSwxNSBAQAogICBib29sIF90b2tlbk1hdGNoZXNLZXl3b3JkKFRva2VuIHRva2VuLCBLZXl3b3JkIGtleXdvcmQpID0+IHRva2VuLnR5cGUgPT0gVG9rZW5UeXBlLktFWVdPUkQgJiYgKHRva2VuIGFzIEtleXdvcmRUb2tlbikua2V5d29yZCA9PSBrZXl3b3JkOwogCiAgIC8qKgorICAgKiBSZXR1cm4gYHRydWVgIGlmIHRoZSBnaXZlbiB0b2tlbiBtYXRjaGVzIHRoZSBnaXZlbiBpZGVudGlmaWVyLgorICAgKgorICAgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIGJlaW5nIHRlc3RlZAorICAgKiBAcGFyYW0gaWRlbnRpZmllciB0aGUgaWRlbnRpZmllciB0aGF0IGNhbiBvcHRpb25hbGx5IGFwcGVhciBpbiB0aGUgY3VycmVudCBsb2NhdGlvbgorICAgKiBAcmV0dXJuIGB0cnVlYCBpZiB0aGUgY3VycmVudCB0b2tlbiBtYXRjaGVzIHRoZSBnaXZlbiBpZGVudGlmaWVyCisgICAqLworICBib29sIF90b2tlbk1hdGNoZXNTdHJpbmcoVG9rZW4gdG9rZW4sIFN0cmluZyBpZGVudGlmaWVyKSA9PiB0b2tlbi50eXBlID09IFRva2VuVHlwZS5JREVOVElGSUVSICYmIHRva2VuLmxleGVtZSA9PSBpZGVudGlmaWVyOworCisgIC8qKgogICAgKiBUcmFuc2xhdGUgdGhlIGNoYXJhY3RlcnMgYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBnaXZlbiBzdHJpbmcsIGFwcGVuZGluZyB0aGUgdHJhbnNsYXRlZAogICAgKiBjaGFyYWN0ZXIgdG8gdGhlIGdpdmVuIGJ1aWxkZXIuIFRoZSBpbmRleCBpcyBhc3N1bWVkIHRvIGJlIHZhbGlkLgogICAgKgpAQCAtNzU3MSwxNTEgKzc3MDMsMTU5IEBACiAKICAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTklUSUFMSVpFRF9WQVJJQUJMRV9JTl9GT1JfRUFDSCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdJTklUSUFMSVpFRF9WQVJJQUJMRV9JTl9GT1JfRUFDSCcsIDYwLCAiVGhlIGxvb3AgdmFyaWFibGUgaW4gYSBmb3ItZWFjaCBsb29wIGNhbm5vdCBiZSBpbml0aWFsaXplZCIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9DT0RFX1BPSU5UID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0lOVkFMSURfQ09ERV9QT0lOVCcsIDYxLCAiVGhlIGVzY2FwZSBzZXF1ZW5jZSAnJXMnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTlZBTElEX0FXQUlUX0lOX0ZPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb240KCdJTlZBTElEX0FXQUlUX0lOX0ZPUicsIDYxLCAiVGhlIG1vZGlmaWVyICdhd2FpdCcgaXMgbm90IGFsbG93ZWQgZm9yIGEgbm9ybWFsICdmb3InIHN0YXRlbWVudCIsICJSZW1vdmUgdGhlIGtleXdvcmQgb3IgdXNlIGEgZm9yLWVhY2ggc3RhdGVtZW50LiIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9DT01NRU5UX1JFRkVSRU5DRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdJTlZBTElEX0NPTU1FTlRfUkVGRVJFTkNFJywgNjIsICJDb21tZW50IHJlZmVyZW5jZXMgc2hvdWxkIGNvbnRhaW4gYSBwb3NzaWJseSBwcmVmaXhlZCBpZGVudGlmaWVyIGFuZCBjYW4gc3RhcnQgd2l0aCAnbmV3JywgYnV0IHNob3VsZCBub3QgY29udGFpbiBhbnl0aGluZyBlbHNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9DT0RFX1BPSU5UID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0lOVkFMSURfQ09ERV9QT0lOVCcsIDYyLCAiVGhlIGVzY2FwZSBzZXF1ZW5jZSAnJXMnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIElOVkFMSURfSEVYX0VTQ0FQRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdJTlZBTElEX0hFWF9FU0NBUEUnLCA2MywgIkFuIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcXHgnIG11c3QgYmUgZm9sbG93ZWQgYnkgMiBoZXhpZGVjaW1hbCBkaWdpdHMiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTlZBTElEX0NPTU1FTlRfUkVGRVJFTkNFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0lOVkFMSURfQ09NTUVOVF9SRUZFUkVOQ0UnLCA2MywgIkNvbW1lbnQgcmVmZXJlbmNlcyBzaG91bGQgY29udGFpbiBhIHBvc3NpYmx5IHByZWZpeGVkIGlkZW50aWZpZXIgYW5kIGNhbiBzdGFydCB3aXRoICduZXcnLCBidXQgc2hvdWxkIG5vdCBjb250YWluIGFueXRoaW5nIGVsc2UiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIElOVkFMSURfT1BFUkFUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnSU5WQUxJRF9PUEVSQVRPUicsIDY0LCAiVGhlIHN0cmluZyAnJXMnIGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9IRVhfRVNDQVBFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0lOVkFMSURfSEVYX0VTQ0FQRScsIDY0LCAiQW4gZXNjYXBlIHNlcXVlbmNlIHN0YXJ0aW5nIHdpdGggJ1xceCcgbXVzdCBiZSBmb2xsb3dlZCBieSAyIGhleGlkZWNpbWFsIGRpZ2l0cyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9PUEVSQVRPUl9GT1JfU1VQRVIgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnSU5WQUxJRF9PUEVSQVRPUl9GT1JfU1VQRVInLCA2NSwgIlRoZSBvcGVyYXRvciAnJXMnIGNhbm5vdCBiZSB1c2VkIHdpdGggJ3N1cGVyJyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIElOVkFMSURfT1BFUkFUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnSU5WQUxJRF9PUEVSQVRPUicsIDY1LCAiVGhlIHN0cmluZyAnJXMnIGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTlZBTElEX1VOSUNPREVfRVNDQVBFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0lOVkFMSURfVU5JQ09ERV9FU0NBUEUnLCA2NiwgIkFuIGVzY2FwZSBzZXF1ZW5jZSBzdGFydGluZyB3aXRoICdcXHUnIG11c3QgYmUgZm9sbG93ZWQgYnkgNCBoZXhpZGVjaW1hbCBkaWdpdHMgb3IgZnJvbSAxIHRvIDYgZGlnaXRzIGJldHdlZW4gJ3snIGFuZCAnfSciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTlZBTElEX09QRVJBVE9SX0ZPUl9TVVBFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdJTlZBTElEX09QRVJBVE9SX0ZPUl9TVVBFUicsIDY2LCAiVGhlIG9wZXJhdG9yICclcycgY2Fubm90IGJlIHVzZWQgd2l0aCAnc3VwZXInIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBMSUJSQVJZX0RJUkVDVElWRV9OT1RfRklSU1QgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTElCUkFSWV9ESVJFQ1RJVkVfTk9UX0ZJUlNUJywgNjcsICJUaGUgbGlicmFyeSBkaXJlY3RpdmUgbXVzdCBhcHBlYXIgYmVmb3JlIGFsbCBvdGhlciBkaXJlY3RpdmVzIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9TVEFSX0FGVEVSX0FTWU5DID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjQoJ0lOVkFMSURfU1RBUl9BRlRFUl9BU1lOQycsIDY3LCAiVGhlIG1vZGlmaWVyICdhc3luYyonIGlzIG5vdCBhbGxvd2VkIGZvciBhbiBleHByZXNzaW9uIGZ1bmN0aW9uIGJvZHkiLCAiQ29udmVydCB0aGUgYm9keSB0byBhIGJsb2NrLiIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTE9DQUxfRlVOQ1RJT05fREVDTEFSQVRJT05fTU9ESUZJRVIgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTE9DQUxfRlVOQ1RJT05fREVDTEFSQVRJT05fTU9ESUZJRVInLCA2OCwgIkxvY2FsIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucyBjYW5ub3Qgc3BlY2lmeSBhbnkgbW9kaWZpZXIiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBJTlZBTElEX1NZTkMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uNCgnSU5WQUxJRF9TWU5DJywgNjgsICJUaGUgbW9kaWZpZXIgJ3N5bmMnIGlzIG5vdCBhbGxvd2VkIGZvciBhbiBleHJwcmVzc2lvbiBmdW5jdGlvbiBib2R5IiwgIkNvbnZlcnQgdGhlIGJvZHkgdG8gYSBibG9jay4iKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1InLCA2OSwgIk1pc3Npbmcgc2VsZWN0b3Igc3VjaCBhcyBcIi48aWRlbnRpZmllcj5cIiBvciBcIlswXVwiIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgSU5WQUxJRF9VTklDT0RFX0VTQ0FQRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdJTlZBTElEX1VOSUNPREVfRVNDQVBFJywgNjksICJBbiBlc2NhcGUgc2VxdWVuY2Ugc3RhcnRpbmcgd2l0aCAnXFx1JyBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4aWRlY2ltYWwgZGlnaXRzIG9yIGZyb20gMSB0byA2IGRpZ2l0cyBiZXR3ZWVuICd7JyBhbmQgJ30nIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX0NBVENIX09SX0ZJTkFMTFkgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19DQVRDSF9PUl9GSU5BTExZJywgNzAsICJBIHRyeSBzdGF0ZW1lbnQgbXVzdCBoYXZlIGVpdGhlciBhIGNhdGNoIG9yIGZpbmFsbHkgY2xhdXNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTElCUkFSWV9ESVJFQ1RJVkVfTk9UX0ZJUlNUID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ0xJQlJBUllfRElSRUNUSVZFX05PVF9GSVJTVCcsIDcwLCAiVGhlIGxpYnJhcnkgZGlyZWN0aXZlIG11c3QgYXBwZWFyIGJlZm9yZSBhbGwgb3RoZXIgZGlyZWN0aXZlcyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19DTEFTU19CT0RZID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfQ0xBU1NfQk9EWScsIDcxLCAiQSBjbGFzcyBkZWZpbml0aW9uIG11c3QgaGF2ZSBhIGJvZHksIGV2ZW4gaWYgaXQgaXMgZW1wdHkiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBMT0NBTF9GVU5DVElPTl9ERUNMQVJBVElPTl9NT0RJRklFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdMT0NBTF9GVU5DVElPTl9ERUNMQVJBVElPTl9NT0RJRklFUicsIDcxLCAiTG9jYWwgZnVuY3Rpb24gZGVjbGFyYXRpb25zIGNhbm5vdCBzcGVjaWZ5IGFueSBtb2RpZmllciIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19DTE9TSU5HX1BBUkVOVEhFU0lTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfQ0xPU0lOR19QQVJFTlRIRVNJUycsIDcyLCAiVGhlIGNsb3NpbmcgcGFyZW50aGVzaXMgaXMgbWlzc2luZyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfQVNTSUdOQUJMRV9TRUxFQ1RPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0FTU0lHTkFCTEVfU0VMRUNUT1InLCA3MiwgIk1pc3Npbmcgc2VsZWN0b3Igc3VjaCBhcyBcIi48aWRlbnRpZmllcj5cIiBvciBcIlswXVwiIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX0NPTlNUX0ZJTkFMX1ZBUl9PUl9UWVBFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfQ09OU1RfRklOQUxfVkFSX09SX1RZUEUnLCA3MywgIlZhcmlhYmxlcyBtdXN0IGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBrZXl3b3JkcyAnY29uc3QnLCAnZmluYWwnLCAndmFyJyBvciBhIHR5cGUgbmFtZSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfQ0FUQ0hfT1JfRklOQUxMWSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0NBVENIX09SX0ZJTkFMTFknLCA3MywgIkEgdHJ5IHN0YXRlbWVudCBtdXN0IGhhdmUgZWl0aGVyIGEgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfRVhQUkVTU0lPTl9JTl9USFJPVyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0VYUFJFU1NJT05fSU5fVEhST1cnLCA3NCwgIlRocm93IGV4cHJlc3Npb25zIG11c3QgY29tcHV0ZSB0aGUgb2JqZWN0IHRvIGJlIHRocm93biIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfQ0xBU1NfQk9EWSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0NMQVNTX0JPRFknLCA3NCwgIkEgY2xhc3MgZGVmaW5pdGlvbiBtdXN0IGhhdmUgYSBib2R5LCBldmVuIGlmIGl0IGlzIGVtcHR5Iik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX0ZVTkNUSU9OX0JPRFkgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19GVU5DVElPTl9CT0RZJywgNzUsICJBIGZ1bmN0aW9uIGJvZHkgbXVzdCBiZSBwcm92aWRlZCIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfQ0xPU0lOR19QQVJFTlRIRVNJUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0NMT1NJTkdfUEFSRU5USEVTSVMnLCA3NSwgIlRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIGlzIG1pc3NpbmciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0ZVTkNUSU9OX1BBUkFNRVRFUlMnLCA3NiwgIkZ1bmN0aW9ucyBtdXN0IGhhdmUgYW4gZXhwbGljaXQgbGlzdCBvZiBwYXJhbWV0ZXJzIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19DT05TVF9GSU5BTF9WQVJfT1JfVFlQRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0NPTlNUX0ZJTkFMX1ZBUl9PUl9UWVBFJywgNzYsICJWYXJpYWJsZXMgbXVzdCBiZSBkZWNsYXJlZCB1c2luZyB0aGUga2V5d29yZHMgJ2NvbnN0JywgJ2ZpbmFsJywgJ3Zhcicgb3IgYSB0eXBlIG5hbWUiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfR0VUID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfR0VUJywgNzcsICJHZXR0ZXJzIG11c3QgaGF2ZSB0aGUga2V5d29yZCAnZ2V0JyBiZWZvcmUgdGhlIGdldHRlciBuYW1lIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19FWFBSRVNTSU9OX0lOX1RIUk9XID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfRVhQUkVTU0lPTl9JTl9USFJPVycsIDc3LCAiVGhyb3cgZXhwcmVzc2lvbnMgbXVzdCBjb21wdXRlIHRoZSBvYmplY3QgdG8gYmUgdGhyb3duIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX0lERU5USUZJRVIgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19JREVOVElGSUVSJywgNzgsICJFeHBlY3RlZCBhbiBpZGVudGlmaWVyIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19GVU5DVElPTl9CT0RZID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfRlVOQ1RJT05fQk9EWScsIDc4LCAiQSBmdW5jdGlvbiBib2R5IG11c3QgYmUgcHJvdmlkZWQiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfS0VZV09SRF9PUEVSQVRPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0tFWVdPUkRfT1BFUkFUT1InLCA3OSwgIk9wZXJhdG9yIGRlY2xhcmF0aW9ucyBtdXN0IGJlIHByZWNlZWRlZCBieSB0aGUga2V5d29yZCAnb3BlcmF0b3InIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19GVU5DVElPTl9QQVJBTUVURVJTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfRlVOQ1RJT05fUEFSQU1FVEVSUycsIDc5LCAiRnVuY3Rpb25zIG11c3QgaGF2ZSBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfTkFNRV9JTl9MSUJSQVJZX0RJUkVDVElWRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX05BTUVfSU5fTElCUkFSWV9ESVJFQ1RJVkUnLCA4MCwgIkxpYnJhcnkgZGlyZWN0aXZlcyBtdXN0IGluY2x1ZGUgYSBsaWJyYXJ5IG5hbWUiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX0dFVCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0dFVCcsIDgwLCAiR2V0dGVycyBtdXN0IGhhdmUgdGhlIGtleXdvcmQgJ2dldCcgYmVmb3JlIHRoZSBnZXR0ZXIgbmFtZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19OQU1FX0lOX1BBUlRfT0ZfRElSRUNUSVZFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfTkFNRV9JTl9QQVJUX09GX0RJUkVDVElWRScsIDgxLCAiTGlicmFyeSBkaXJlY3RpdmVzIG11c3QgaW5jbHVkZSBhIGxpYnJhcnkgbmFtZSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfSURFTlRJRklFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX0lERU5USUZJRVInLCA4MSwgIkV4cGVjdGVkIGFuIGlkZW50aWZpZXIiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfUFJFRklYX0lOX0RFRkVSUkVEX0lNUE9SVCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX1BSRUZJWF9JTl9ERUZFUlJFRF9JTVBPUlQnLCA4MiwgIkRlZmVycmVkIGltcG9ydHMgbXVzdCBoYXZlIGEgcHJlZml4Iik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19LRVlXT1JEX09QRVJBVE9SID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfS0VZV09SRF9PUEVSQVRPUicsIDgyLCAiT3BlcmF0b3IgZGVjbGFyYXRpb25zIG11c3QgYmUgcHJlY2VlZGVkIGJ5IHRoZSBrZXl3b3JkICdvcGVyYXRvciciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfU1RBVEVNRU5UID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfU1RBVEVNRU5UJywgODMsICJFeHBlY3RlZCBhIHN0YXRlbWVudCIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfTkFNRV9JTl9MSUJSQVJZX0RJUkVDVElWRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX05BTUVfSU5fTElCUkFSWV9ESVJFQ1RJVkUnLCA4MywgIkxpYnJhcnkgZGlyZWN0aXZlcyBtdXN0IGluY2x1ZGUgYSBsaWJyYXJ5IG5hbWUiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfVEVSTUlOQVRPUl9GT1JfUEFSQU1FVEVSX0dST1VQID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfVEVSTUlOQVRPUl9GT1JfUEFSQU1FVEVSX0dST1VQJywgODQsICJUaGVyZSBpcyBubyAnJXMnIHRvIGNsb3NlIHRoZSBwYXJhbWV0ZXIgZ3JvdXAiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX05BTUVfSU5fUEFSVF9PRl9ESVJFQ1RJVkUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19OQU1FX0lOX1BBUlRfT0ZfRElSRUNUSVZFJywgODQsICJMaWJyYXJ5IGRpcmVjdGl2ZXMgbXVzdCBpbmNsdWRlIGEgbGlicmFyeSBuYW1lIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX1RZUEVERUZfUEFSQU1FVEVSUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX1RZUEVERUZfUEFSQU1FVEVSUycsIDg1LCAiVHlwZSBhbGlhc2VzIGZvciBmdW5jdGlvbnMgbXVzdCBoYXZlIGFuIGV4cGxpY2l0IGxpc3Qgb2YgcGFyYW1ldGVycyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfUFJFRklYX0lOX0RFRkVSUkVEX0lNUE9SVCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNSVNTSU5HX1BSRUZJWF9JTl9ERUZFUlJFRF9JTVBPUlQnLCA4NSwgIkRlZmVycmVkIGltcG9ydHMgbXVzdCBoYXZlIGEgcHJlZml4Iik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX1ZBUklBQkxFX0lOX0ZPUl9FQUNIID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfVkFSSUFCTEVfSU5fRk9SX0VBQ0gnLCA4NiwgIkEgbG9vcCB2YXJpYWJsZSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgZm9yLWVhY2ggbG9vcCBiZWZvcmUgdGhlICdpbicsIGJ1dCBub25lIHdlcmUgZm91bmQiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX1NUQVJfQUZURVJfU1lOQyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb240KCdNSVNTSU5HX1NUQVJfQUZURVJfU1lOQycsIDg2LCAiVGhlIG1vZGlmaWVyICdzeW5jJyBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3RhciAoJyonKSIsICJSZW1vdmUgdGhlIG1vZGlmaWVyIG9yIGFkZCBhIHN0YXIuIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVhFRF9QQVJBTUVURVJfR1JPVVBTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JWEVEX1BBUkFNRVRFUl9HUk9VUFMnLCA4NywgIkNhbm5vdCBoYXZlIGJvdGggcG9zaXRpb25hbCBhbmQgbmFtZWQgcGFyYW1ldGVycyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXIgbGlzdCIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1JU1NJTkdfU1RBVEVNRU5UID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfU1RBVEVNRU5UJywgODcsICJFeHBlY3RlZCBhIHN0YXRlbWVudCIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfRVhURU5EU19DTEFVU0VTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX0VYVEVORFNfQ0xBVVNFUycsIDg4LCAiRWFjaCBjbGFzcyBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGV4dGVuZHMgY2xhdXNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19URVJNSU5BVE9SX0ZPUl9QQVJBTUVURVJfR1JPVVAgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19URVJNSU5BVE9SX0ZPUl9QQVJBTUVURVJfR1JPVVAnLCA4OCwgIlRoZXJlIGlzIG5vICclcycgdG8gY2xvc2UgdGhlIHBhcmFtZXRlciBncm91cCIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfSU1QTEVNRU5UU19DTEFVU0VTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX0lNUExFTUVOVFNfQ0xBVVNFUycsIDg5LCAiRWFjaCBjbGFzcyBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGltcGxlbWVudHMgY2xhdXNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTUlTU0lOR19UWVBFREVGX1BBUkFNRVRFUlMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTUlTU0lOR19UWVBFREVGX1BBUkFNRVRFUlMnLCA4OSwgIlR5cGUgYWxpYXNlcyBmb3IgZnVuY3Rpb25zIG11c3QgaGF2ZSBhbiBleHBsaWNpdCBsaXN0IG9mIHBhcmFtZXRlcnMiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1VTFRJUExFX0xJQlJBUllfRElSRUNUSVZFUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNVUxUSVBMRV9MSUJSQVJZX0RJUkVDVElWRVMnLCA5MCwgIk9ubHkgb25lIGxpYnJhcnkgZGlyZWN0aXZlIG1heSBiZSBkZWNsYXJlZCBpbiBhIGZpbGUiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVNTSU5HX1ZBUklBQkxFX0lOX0ZPUl9FQUNIID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JU1NJTkdfVkFSSUFCTEVfSU5fRk9SX0VBQ0gnLCA5MCwgIkEgbG9vcCB2YXJpYWJsZSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgZm9yLWVhY2ggbG9vcCBiZWZvcmUgdGhlICdpbicsIGJ1dCBub25lIHdlcmUgZm91bmQiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1VTFRJUExFX05BTUVEX1BBUkFNRVRFUl9HUk9VUFMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTVVMVElQTEVfTkFNRURfUEFSQU1FVEVSX0dST1VQUycsIDkxLCAiQ2Fubm90IGhhdmUgbXVsdGlwbGUgZ3JvdXBzIG9mIG5hbWVkIHBhcmFtZXRlcnMgaW4gYSBzaW5nbGUgcGFyYW1ldGVyIGxpc3QiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNSVhFRF9QQVJBTUVURVJfR1JPVVBTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01JWEVEX1BBUkFNRVRFUl9HUk9VUFMnLCA5MSwgIkNhbm5vdCBoYXZlIGJvdGggcG9zaXRpb25hbCBhbmQgbmFtZWQgcGFyYW1ldGVycyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXIgbGlzdCIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfUEFSVF9PRl9ESVJFQ1RJVkVTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1BBUlRfT0ZfRElSRUNUSVZFUycsIDkyLCAiT25seSBvbmUgcGFydC1vZiBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1VTFRJUExFX0VYVEVORFNfQ0xBVVNFUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNVUxUSVBMRV9FWFRFTkRTX0NMQVVTRVMnLCA5MiwgIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBleHRlbmRzIGNsYXVzZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfUE9TSVRJT05BTF9QQVJBTUVURVJfR1JPVVBTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1BPU0lUSU9OQUxfUEFSQU1FVEVSX0dST1VQUycsIDkzLCAiQ2Fubm90IGhhdmUgbXVsdGlwbGUgZ3JvdXBzIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXIgbGlzdCIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE1VTFRJUExFX0lNUExFTUVOVFNfQ0xBVVNFUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNVUxUSVBMRV9JTVBMRU1FTlRTX0NMQVVTRVMnLCA5MywgIkVhY2ggY2xhc3MgZGVmaW5pdGlvbiBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBpbXBsZW1lbnRzIGNsYXVzZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfVkFSSUFCTEVTX0lOX0ZPUl9FQUNIID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1ZBUklBQkxFU19JTl9GT1JfRUFDSCcsIDk0LCAiQSBzaW5nbGUgbG9vcCB2YXJpYWJsZSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgZm9yLWVhY2ggbG9vcCBiZWZvcmUgdGhlICdpbicsIGJ1dCAlcyB3ZXJlIGZvdW5kIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfTElCUkFSWV9ESVJFQ1RJVkVTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX0xJQlJBUllfRElSRUNUSVZFUycsIDk0LCAiT25seSBvbmUgbGlicmFyeSBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfV0lUSF9DTEFVU0VTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1dJVEhfQ0xBVVNFUycsIDk1LCAiRWFjaCBjbGFzcyBkZWZpbml0aW9uIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHdpdGggY2xhdXNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfTkFNRURfUEFSQU1FVEVSX0dST1VQUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdNVUxUSVBMRV9OQU1FRF9QQVJBTUVURVJfR1JPVVBTJywgOTUsICJDYW5ub3QgaGF2ZSBtdWx0aXBsZSBncm91cHMgb2YgbmFtZWQgcGFyYW1ldGVycyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXIgbGlzdCIpOworCisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfUEFSVF9PRl9ESVJFQ1RJVkVTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1BBUlRfT0ZfRElSRUNUSVZFUycsIDk2LCAiT25seSBvbmUgcGFydC1vZiBkaXJlY3RpdmUgbWF5IGJlIGRlY2xhcmVkIGluIGEgZmlsZSIpOworCisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfUE9TSVRJT05BTF9QQVJBTUVURVJfR1JPVVBTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1BPU0lUSU9OQUxfUEFSQU1FVEVSX0dST1VQUycsIDk3LCAiQ2Fubm90IGhhdmUgbXVsdGlwbGUgZ3JvdXBzIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBpbiBhIHNpbmdsZSBwYXJhbWV0ZXIgbGlzdCIpOworCisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTVVMVElQTEVfVkFSSUFCTEVTX0lOX0ZPUl9FQUNIID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ01VTFRJUExFX1ZBUklBQkxFU19JTl9GT1JfRUFDSCcsIDk4LCAiQSBzaW5nbGUgbG9vcCB2YXJpYWJsZSBtdXN0IGJlIGRlY2xhcmVkIGluIGEgZm9yLWVhY2ggbG9vcCBiZWZvcmUgdGhlICdpbicsIGJ1dCAlcyB3ZXJlIGZvdW5kIik7CisKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBNVUxUSVBMRV9XSVRIX0NMQVVTRVMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTVVMVElQTEVfV0lUSF9DTEFVU0VTJywgOTksICJFYWNoIGNsYXNzIGRlZmluaXRpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgd2l0aCBjbGF1c2UiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE5BTUVEX0ZVTkNUSU9OX0VYUFJFU1NJT04gPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTkFNRURfRlVOQ1RJT05fRVhQUkVTU0lPTicsIDk2LCAiRnVuY3Rpb24gZXhwcmVzc2lvbnMgY2Fubm90IGJlIG5hbWVkIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTkFNRURfRlVOQ1RJT05fRVhQUkVTU0lPTiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdOQU1FRF9GVU5DVElPTl9FWFBSRVNTSU9OJywgMTAwLCAiRnVuY3Rpb24gZXhwcmVzc2lvbnMgY2Fubm90IGJlIG5hbWVkIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOQU1FRF9QQVJBTUVURVJfT1VUU0lERV9HUk9VUCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdOQU1FRF9QQVJBTUVURVJfT1VUU0lERV9HUk9VUCcsIDk3LCAiTmFtZWQgcGFyYW1ldGVycyBtdXN0IGJlIGVuY2xvc2VkIGluIGN1cmx5IGJyYWNlcyAoJ3snIGFuZCAnfScpIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTkFNRURfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTkFNRURfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAnLCAxMDEsICJOYW1lZCBwYXJhbWV0ZXJzIG11c3QgYmUgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2VzICgneycgYW5kICd9JykiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE5BVElWRV9DTEFVU0VfSU5fTk9OX1NES19DT0RFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ05BVElWRV9DTEFVU0VfSU5fTk9OX1NES19DT0RFJywgOTgsICJOYXRpdmUgY2xhdXNlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIFNESyBhbmQgY29kZSB0aGF0IGlzIGxvYWRlZCB0aHJvdWdoIG5hdGl2ZSBleHRlbnNpb25zIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTkFUSVZFX0NMQVVTRV9JTl9OT05fU0RLX0NPREUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTkFUSVZFX0NMQVVTRV9JTl9OT05fU0RLX0NPREUnLCAxMDIsICJOYXRpdmUgY2xhdXNlIGNhbiBvbmx5IGJlIHVzZWQgaW4gdGhlIFNESyBhbmQgY29kZSB0aGF0IGlzIGxvYWRlZCB0aHJvdWdoIG5hdGl2ZSBleHRlbnNpb25zIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOQVRJVkVfRlVOQ1RJT05fQk9EWV9JTl9OT05fU0RLX0NPREUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTkFUSVZFX0ZVTkNUSU9OX0JPRFlfSU5fTk9OX1NES19DT0RFJywgOTksICJOYXRpdmUgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBTREsgYW5kIGNvZGUgdGhhdCBpcyBsb2FkZWQgdGhyb3VnaCBuYXRpdmUgZXh0ZW5zaW9ucyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIE5BVElWRV9GVU5DVElPTl9CT0RZX0lOX05PTl9TREtfQ09ERSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdOQVRJVkVfRlVOQ1RJT05fQk9EWV9JTl9OT05fU0RLX0NPREUnLCAxMDMsICJOYXRpdmUgZnVuY3Rpb25zIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIHRoZSBTREsgYW5kIGNvZGUgdGhhdCBpcyBsb2FkZWQgdGhyb3VnaCBuYXRpdmUgZXh0ZW5zaW9ucyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9OX0NPTlNUUlVDVE9SX0ZBQ1RPUlkgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9OX0NPTlNUUlVDVE9SX0ZBQ1RPUlknLCAxMDAsICJPbmx5IGNvbnN0cnVjdG9ycyBjYW4gYmUgZGVjbGFyZWQgdG8gYmUgYSAnZmFjdG9yeSciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOT05fQ09OU1RSVUNUT1JfRkFDVE9SWSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdOT05fQ09OU1RSVUNUT1JfRkFDVE9SWScsIDEwNCwgIk9ubHkgY29uc3RydWN0b3JzIGNhbiBiZSBkZWNsYXJlZCB0byBiZSBhICdmYWN0b3J5JyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9OX0lERU5USUZJRVJfTElCUkFSWV9OQU1FID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ05PTl9JREVOVElGSUVSX0xJQlJBUllfTkFNRScsIDEwMSwgIlRoZSBuYW1lIG9mIGEgbGlicmFyeSBtdXN0IGJlIGFuIGlkZW50aWZpZXIiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOT05fSURFTlRJRklFUl9MSUJSQVJZX05BTUUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9OX0lERU5USUZJRVJfTElCUkFSWV9OQU1FJywgMTA1LCAiVGhlIG5hbWUgb2YgYSBsaWJyYXJ5IG11c3QgYmUgYW4gaWRlbnRpZmllciIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQnLCAxMDIsICJUaGUgcGFydC1vZiBkaXJlY3RpdmUgbXVzdCBiZSB0aGUgb25seSBkaXJlY3RpdmUgaW4gYSBwYXJ0Iik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9OX1BBUlRfT0ZfRElSRUNUSVZFX0lOX1BBUlQnLCAxMDYsICJUaGUgcGFydC1vZiBkaXJlY3RpdmUgbXVzdCBiZSB0aGUgb25seSBkaXJlY3RpdmUgaW4gYSBwYXJ0Iik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOT05fVVNFUl9ERUZJTkFCTEVfT1BFUkFUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9OX1VTRVJfREVGSU5BQkxFX09QRVJBVE9SJywgMTAzLCAiVGhlIG9wZXJhdG9yICclcycgaXMgbm90IHVzZXIgZGVmaW5hYmxlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9OX1VTRVJfREVGSU5BQkxFX09QRVJBVE9SID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ05PTl9VU0VSX0RFRklOQUJMRV9PUEVSQVRPUicsIDEwNywgIlRoZSBvcGVyYXRvciAnJXMnIGlzIG5vdCB1c2VyIGRlZmluYWJsZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgTk9STUFMX0JFRk9SRV9PUFRJT05BTF9QQVJBTUVURVJTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ05PUk1BTF9CRUZPUkVfT1BUSU9OQUxfUEFSQU1FVEVSUycsIDEwNCwgIk5vcm1hbCBwYXJhbWV0ZXJzIG11c3Qgb2NjdXIgYmVmb3JlIG9wdGlvbmFsIHBhcmFtZXRlcnMiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBOT1JNQUxfQkVGT1JFX09QVElPTkFMX1BBUkFNRVRFUlMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnTk9STUFMX0JFRk9SRV9PUFRJT05BTF9QQVJBTUVURVJTJywgMTA4LCAiTm9ybWFsIHBhcmFtZXRlcnMgbXVzdCBvY2N1ciBiZWZvcmUgb3B0aW9uYWwgcGFyYW1ldGVycyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgUE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdQT1NJVElPTkFMX0FGVEVSX05BTUVEX0FSR1VNRU5UJywgMTA1LCAiUG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBvY2N1ciBiZWZvcmUgbmFtZWQgYXJndW1lbnRzIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgUE9TSVRJT05BTF9BRlRFUl9OQU1FRF9BUkdVTUVOVCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdQT1NJVElPTkFMX0FGVEVSX05BTUVEX0FSR1VNRU5UJywgMTA5LCAiUG9zaXRpb25hbCBhcmd1bWVudHMgbXVzdCBvY2N1ciBiZWZvcmUgbmFtZWQgYXJndW1lbnRzIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBQT1NJVElPTkFMX1BBUkFNRVRFUl9PVVRTSURFX0dST1VQID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1BPU0lUSU9OQUxfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAnLCAxMDYsICJQb3NpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgKCdbJyBhbmQgJ10nKSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFBPU0lUSU9OQUxfUEFSQU1FVEVSX09VVFNJREVfR1JPVVAgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnUE9TSVRJT05BTF9QQVJBTUVURVJfT1VUU0lERV9HUk9VUCcsIDExMCwgIlBvc2l0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIGVuY2xvc2VkIGluIHNxdWFyZSBicmFja2V0cyAoJ1snIGFuZCAnXScpIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBSRURJUkVDVElPTl9JTl9OT05fRkFDVE9SWV9DT05TVFJVQ1RPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdSRURJUkVDVElPTl9JTl9OT05fRkFDVE9SWV9DT05TVFJVQ1RPUicsIDEwNywgIk9ubHkgZmFjdG9yeSBjb25zdHJ1Y3RvciBjYW4gc3BlY2lmeSAnPScgcmVkaXJlY3Rpb24uIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgUkVESVJFQ1RJT05fSU5fTk9OX0ZBQ1RPUllfQ09OU1RSVUNUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnUkVESVJFQ1RJT05fSU5fTk9OX0ZBQ1RPUllfQ09OU1RSVUNUT1InLCAxMTEsICJPbmx5IGZhY3RvcnkgY29uc3RydWN0b3IgY2FuIHNwZWNpZnkgJz0nIHJlZGlyZWN0aW9uLiIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU0VUVEVSX0lOX0ZVTkNUSU9OID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NFVFRFUl9JTl9GVU5DVElPTicsIDEwOCwgIlNldHRlcnMgY2Fubm90IGJlIGRlZmluZWQgd2l0aGluIG1ldGhvZHMgb3IgZnVuY3Rpb25zIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU0VUVEVSX0lOX0ZVTkNUSU9OID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NFVFRFUl9JTl9GVU5DVElPTicsIDExMiwgIlNldHRlcnMgY2Fubm90IGJlIGRlZmluZWQgd2l0aGluIG1ldGhvZHMgb3IgZnVuY3Rpb25zIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfQUZURVJfQ09OU1QgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1RBVElDX0FGVEVSX0NPTlNUJywgMTA5LCAiVGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdjb25zdCciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfQUZURVJfQ09OU1QgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1RBVElDX0FGVEVSX0NPTlNUJywgMTEzLCAiVGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICdjb25zdCciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNUQVRJQ19BRlRFUl9GSU5BTCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfQUZURVJfRklOQUwnLCAxMTAsICJUaGUgbW9kaWZpZXIgJ3N0YXRpYycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZpbmFsJyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNUQVRJQ19BRlRFUl9GSU5BTCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfQUZURVJfRklOQUwnLCAxMTQsICJUaGUgbW9kaWZpZXIgJ3N0YXRpYycgc2hvdWxkIGJlIGJlZm9yZSB0aGUgbW9kaWZpZXIgJ2ZpbmFsJyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU1RBVElDX0FGVEVSX1ZBUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfQUZURVJfVkFSJywgMTExLCAiVGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICd2YXInIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU1RBVElDX0FGVEVSX1ZBUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfQUZURVJfVkFSJywgMTE1LCAiVGhlIG1vZGlmaWVyICdzdGF0aWMnIHNob3VsZCBiZSBiZWZvcmUgdGhlIG1vZGlmaWVyICd2YXInIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfQ09OU1RSVUNUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1RBVElDX0NPTlNUUlVDVE9SJywgMTEyLCAiQ29uc3RydWN0b3JzIGNhbm5vdCBiZSBzdGF0aWMiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfQ09OU1RSVUNUT1IgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1RBVElDX0NPTlNUUlVDVE9SJywgMTE2LCAiQ29uc3RydWN0b3JzIGNhbm5vdCBiZSBzdGF0aWMiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNUQVRJQ19HRVRURVJfV0lUSE9VVF9CT0RZID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NUQVRJQ19HRVRURVJfV0lUSE9VVF9CT0RZJywgMTEzLCAiQSAnc3RhdGljJyBnZXR0ZXIgbXVzdCBoYXZlIGEgYm9keSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNUQVRJQ19HRVRURVJfV0lUSE9VVF9CT0RZID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NUQVRJQ19HRVRURVJfV0lUSE9VVF9CT0RZJywgMTE3LCAiQSAnc3RhdGljJyBnZXR0ZXIgbXVzdCBoYXZlIGEgYm9keSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU1RBVElDX09QRVJBVE9SID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NUQVRJQ19PUEVSQVRPUicsIDExNCwgIk9wZXJhdG9ycyBjYW5ub3QgYmUgc3RhdGljIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU1RBVElDX09QRVJBVE9SID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NUQVRJQ19PUEVSQVRPUicsIDExOCwgIk9wZXJhdG9ycyBjYW5ub3QgYmUgc3RhdGljIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfU0VUVEVSX1dJVEhPVVRfQk9EWSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfU0VUVEVSX1dJVEhPVVRfQk9EWScsIDExNSwgIkEgJ3N0YXRpYycgc2V0dGVyIG11c3QgaGF2ZSBhIGJvZHkiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTVEFUSUNfU0VUVEVSX1dJVEhPVVRfQk9EWSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfU0VUVEVSX1dJVEhPVVRfQk9EWScsIDExOSwgIkEgJ3N0YXRpYycgc2V0dGVyIG11c3QgaGF2ZSBhIGJvZHkiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNUQVRJQ19UT1BfTEVWRUxfREVDTEFSQVRJT04gPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1RBVElDX1RPUF9MRVZFTF9ERUNMQVJBVElPTicsIDExNiwgIlRvcC1sZXZlbCBkZWNsYXJhdGlvbnMgY2Fubm90IGJlIGRlY2xhcmVkIHRvIGJlICdzdGF0aWMnIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgU1RBVElDX1RPUF9MRVZFTF9ERUNMQVJBVElPTiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdTVEFUSUNfVE9QX0xFVkVMX0RFQ0xBUkFUSU9OJywgMTIwLCAiVG9wLWxldmVsIGRlY2xhcmF0aW9ucyBjYW5ub3QgYmUgZGVjbGFyZWQgdG8gYmUgJ3N0YXRpYyciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFNXSVRDSF9IQVNfQ0FTRV9BRlRFUl9ERUZBVUxUX0NBU0UgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1dJVENIX0hBU19DQVNFX0FGVEVSX0RFRkFVTFRfQ0FTRScsIDExNywgIlRoZSAnZGVmYXVsdCcgY2FzZSBzaG91bGQgYmUgdGhlIGxhc3QgY2FzZSBpbiBhIHN3aXRjaCBzdGF0ZW1lbnQiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTV0lUQ0hfSEFTX0NBU0VfQUZURVJfREVGQVVMVF9DQVNFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1NXSVRDSF9IQVNfQ0FTRV9BRlRFUl9ERUZBVUxUX0NBU0UnLCAxMjEsICJUaGUgJ2RlZmF1bHQnIGNhc2Ugc2hvdWxkIGJlIHRoZSBsYXN0IGNhc2UgaW4gYSBzd2l0Y2ggc3RhdGVtZW50Iik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTV0lUQ0hfSEFTX01VTFRJUExFX0RFRkFVTFRfQ0FTRVMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1dJVENIX0hBU19NVUxUSVBMRV9ERUZBVUxUX0NBU0VTJywgMTE4LCAiVGhlICdkZWZhdWx0JyBjYXNlIGNhbiBvbmx5IGJlIGRlY2xhcmVkIG9uY2UiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBTV0lUQ0hfSEFTX01VTFRJUExFX0RFRkFVTFRfQ0FTRVMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnU1dJVENIX0hBU19NVUxUSVBMRV9ERUZBVUxUX0NBU0VTJywgMTIyLCAiVGhlICdkZWZhdWx0JyBjYXNlIGNhbiBvbmx5IGJlIGRlY2xhcmVkIG9uY2UiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFRPUF9MRVZFTF9PUEVSQVRPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdUT1BfTEVWRUxfT1BFUkFUT1InLCAxMTksICJPcGVyYXRvcnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoaW4gYSBjbGFzcyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFRPUF9MRVZFTF9PUEVSQVRPUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdUT1BfTEVWRUxfT1BFUkFUT1InLCAxMjMsICJPcGVyYXRvcnMgbXVzdCBiZSBkZWNsYXJlZCB3aXRoaW4gYSBjbGFzcyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVU5FWFBFQ1RFRF9URVJNSU5BVE9SX0ZPUl9QQVJBTUVURVJfR1JPVVAgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVU5FWFBFQ1RFRF9URVJNSU5BVE9SX0ZPUl9QQVJBTUVURVJfR1JPVVAnLCAxMjAsICJUaGVyZSBpcyBubyAnJXMnIHRvIG9wZW4gYSBwYXJhbWV0ZXIgZ3JvdXAiKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBVTkVYUEVDVEVEX1RFUk1JTkFUT1JfRk9SX1BBUkFNRVRFUl9HUk9VUCA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdVTkVYUEVDVEVEX1RFUk1JTkFUT1JfRk9SX1BBUkFNRVRFUl9HUk9VUCcsIDEyNCwgIlRoZXJlIGlzIG5vICclcycgdG8gb3BlbiBhIHBhcmFtZXRlciBncm91cCIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVU5FWFBFQ1RFRF9UT0tFTiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdVTkVYUEVDVEVEX1RPS0VOJywgMTIxLCAiVW5leHBlY3RlZCB0b2tlbiAnJXMnIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVU5FWFBFQ1RFRF9UT0tFTiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdVTkVYUEVDVEVEX1RPS0VOJywgMTI1LCAiVW5leHBlY3RlZCB0b2tlbiAnJXMnIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBXSVRIX0JFRk9SRV9FWFRFTkRTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dJVEhfQkVGT1JFX0VYVEVORFMnLCAxMjIsICJUaGUgZXh0ZW5kcyBjbGF1c2UgbXVzdCBiZSBiZWZvcmUgdGhlIHdpdGggY2xhdXNlIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgV0lUSF9CRUZPUkVfRVhURU5EUyA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdXSVRIX0JFRk9SRV9FWFRFTkRTJywgMTI2LCAiVGhlIGV4dGVuZHMgY2xhdXNlIG11c3QgYmUgYmVmb3JlIHRoZSB3aXRoIGNsYXVzZSIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgV0lUSF9XSVRIT1VUX0VYVEVORFMgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnV0lUSF9XSVRIT1VUX0VYVEVORFMnLCAxMjMsICJUaGUgd2l0aCBjbGF1c2UgY2Fubm90IGJlIHVzZWQgd2l0aG91dCBhbiBleHRlbmRzIGNsYXVzZSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFdJVEhfV0lUSE9VVF9FWFRFTkRTID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dJVEhfV0lUSE9VVF9FWFRFTkRTJywgMTI3LCAiVGhlIHdpdGggY2xhdXNlIGNhbm5vdCBiZSB1c2VkIHdpdGhvdXQgYW4gZXh0ZW5kcyBjbGF1c2UiKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFdST05HX1NFUEFSQVRPUl9GT1JfTkFNRURfUEFSQU1FVEVSID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dST05HX1NFUEFSQVRPUl9GT1JfTkFNRURfUEFSQU1FVEVSJywgMTI0LCAiVGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBuYW1lZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHByZWNlZWRlZCBieSAnOiciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBXUk9OR19TRVBBUkFUT1JfRk9SX05BTUVEX1BBUkFNRVRFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdXUk9OR19TRVBBUkFUT1JfRk9SX05BTUVEX1BBUkFNRVRFUicsIDEyOCwgIlRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgbmFtZWQgcGFyYW1ldGVyIHNob3VsZCBiZSBwcmVjZWVkZWQgYnkgJzonIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dST05HX1NFUEFSQVRPUl9GT1JfUE9TSVRJT05BTF9QQVJBTUVURVInLCAxMjUsICJUaGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyIHNob3VsZCBiZSBwcmVjZWVkZWQgYnkgJz0nIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgV1JPTkdfU0VQQVJBVE9SX0ZPUl9QT1NJVElPTkFMX1BBUkFNRVRFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdXUk9OR19TRVBBUkFUT1JfRk9SX1BPU0lUSU9OQUxfUEFSQU1FVEVSJywgMTI5LCAiVGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBwb3NpdGlvbmFsIHBhcmFtZXRlciBzaG91bGQgYmUgcHJlY2VlZGVkIGJ5ICc9JyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgV1JPTkdfVEVSTUlOQVRPUl9GT1JfUEFSQU1FVEVSX0dST1VQID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dST05HX1RFUk1JTkFUT1JfRk9SX1BBUkFNRVRFUl9HUk9VUCcsIDEyNiwgIkV4cGVjdGVkICclcycgdG8gY2xvc2UgcGFyYW1ldGVyIGdyb3VwIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgV1JPTkdfVEVSTUlOQVRPUl9GT1JfUEFSQU1FVEVSX0dST1VQID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1dST05HX1RFUk1JTkFUT1JfRk9SX1BBUkFNRVRFUl9HUk9VUCcsIDEzMCwgIkV4cGVjdGVkICclcycgdG8gY2xvc2UgcGFyYW1ldGVyIGdyb3VwIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWQVJfQU5EX1RZUEUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVkFSX0FORF9UWVBFJywgMTI3LCAiVmFyaWFibGVzIGNhbm5vdCBiZSBkZWNsYXJlZCB1c2luZyBib3RoICd2YXInIGFuZCBhIHR5cGUgbmFtZTsgcmVtb3ZlIHRoZSAndmFyJyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFZBUl9BTkRfVFlQRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdWQVJfQU5EX1RZUEUnLCAxMzEsICJWYXJpYWJsZXMgY2Fubm90IGJlIGRlY2xhcmVkIHVzaW5nIGJvdGggJ3ZhcicgYW5kIGEgdHlwZSBuYW1lOyByZW1vdmUgdGhlICd2YXInIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWQVJfQVNfVFlQRV9OQU1FID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1ZBUl9BU19UWVBFX05BTUUnLCAxMjgsICJUaGUga2V5d29yZCAndmFyJyBjYW5ub3QgYmUgdXNlZCBhcyBhIHR5cGUgbmFtZSIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFZBUl9BU19UWVBFX05BTUUgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVkFSX0FTX1RZUEVfTkFNRScsIDEzMiwgIlRoZSBrZXl3b3JkICd2YXInIGNhbm5vdCBiZSB1c2VkIGFzIGEgdHlwZSBuYW1lIik7CiAKLSAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWQVJfQ0xBU1MgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVkFSX0NMQVNTJywgMTI5LCAiQ2xhc3NlcyBjYW5ub3QgYmUgZGVjbGFyZWQgdG8gYmUgJ3ZhciciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWQVJfQ0xBU1MgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVkFSX0NMQVNTJywgMTMzLCAiQ2xhc3NlcyBjYW5ub3QgYmUgZGVjbGFyZWQgdG8gYmUgJ3ZhciciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFZBUl9SRVRVUk5fVFlQRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdWQVJfUkVUVVJOX1RZUEUnLCAxMzAsICJUaGUgcmV0dXJuIHR5cGUgY2Fubm90IGJlICd2YXInIik7CisgIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVkFSX1JFVFVSTl9UWVBFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1ZBUl9SRVRVUk5fVFlQRScsIDEzNCwgIlRoZSByZXR1cm4gdHlwZSBjYW5ub3QgYmUgJ3ZhciciKTsKIAotICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFZBUl9UWVBFREVGID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1ZBUl9UWVBFREVGJywgMTMxLCAiVHlwZSBhbGlhc2VzIGNhbm5vdCBiZSBkZWNsYXJlZCB0byBiZSAndmFyJyIpOworICBzdGF0aWMgY29uc3QgUGFyc2VyRXJyb3JDb2RlIFZBUl9UWVBFREVGID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1ZBUl9UWVBFREVGJywgMTM1LCAiVHlwZSBhbGlhc2VzIGNhbm5vdCBiZSBkZWNsYXJlZCB0byBiZSAndmFyJyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVk9JRF9QQVJBTUVURVIgPSBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uMygnVk9JRF9QQVJBTUVURVInLCAxMzIsICJQYXJhbWV0ZXJzIGNhbm5vdCBoYXZlIGEgdHlwZSBvZiAndm9pZCciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWT0lEX1BBUkFNRVRFUiA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdWT0lEX1BBUkFNRVRFUicsIDEzNiwgIlBhcmFtZXRlcnMgY2Fubm90IGhhdmUgYSB0eXBlIG9mICd2b2lkJyIpOwogCi0gIHN0YXRpYyBjb25zdCBQYXJzZXJFcnJvckNvZGUgVk9JRF9WQVJJQUJMRSA9IGNvbnN0IFBhcnNlckVycm9yQ29kZS5jb24zKCdWT0lEX1ZBUklBQkxFJywgMTMzLCAiVmFyaWFibGVzIGNhbm5vdCBoYXZlIGEgdHlwZSBvZiAndm9pZCciKTsKKyAgc3RhdGljIGNvbnN0IFBhcnNlckVycm9yQ29kZSBWT0lEX1ZBUklBQkxFID0gY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoJ1ZPSURfVkFSSUFCTEUnLCAxMzcsICJWYXJpYWJsZXMgY2Fubm90IGhhdmUgYSB0eXBlIG9mICd2b2lkJyIpOwogCiAgIHN0YXRpYyBjb25zdCBMaXN0PFBhcnNlckVycm9yQ29kZT4gdmFsdWVzID0gY29uc3QgWwogICAgICAgQUJTVFJBQ1RfQ0xBU1NfTUVNQkVSLApAQCAtNzc3OSwxMSArNzkxOSwxNCBAQAogICAgICAgSU1QTEVNRU5UU19CRUZPUkVfV0lUSCwKICAgICAgIElNUE9SVF9ESVJFQ1RJVkVfQUZURVJfUEFSVF9ESVJFQ1RJVkUsCiAgICAgICBJTklUSUFMSVpFRF9WQVJJQUJMRV9JTl9GT1JfRUFDSCwKKyAgICAgIElOVkFMSURfQVdBSVRfSU5fRk9SLAogICAgICAgSU5WQUxJRF9DT0RFX1BPSU5ULAogICAgICAgSU5WQUxJRF9DT01NRU5UX1JFRkVSRU5DRSwKICAgICAgIElOVkFMSURfSEVYX0VTQ0FQRSwKICAgICAgIElOVkFMSURfT1BFUkFUT1IsCiAgICAgICBJTlZBTElEX09QRVJBVE9SX0ZPUl9TVVBFUiwKKyAgICAgIElOVkFMSURfU1RBUl9BRlRFUl9BU1lOQywKKyAgICAgIElOVkFMSURfU1lOQywKICAgICAgIElOVkFMSURfVU5JQ09ERV9FU0NBUEUsCiAgICAgICBMSUJSQVJZX0RJUkVDVElWRV9OT1RfRklSU1QsCiAgICAgICBMT0NBTF9GVU5DVElPTl9ERUNMQVJBVElPTl9NT0RJRklFUiwKQEAgLTc4MDEsNiArNzk0NCw3IEBACiAgICAgICBNSVNTSU5HX05BTUVfSU5fTElCUkFSWV9ESVJFQ1RJVkUsCiAgICAgICBNSVNTSU5HX05BTUVfSU5fUEFSVF9PRl9ESVJFQ1RJVkUsCiAgICAgICBNSVNTSU5HX1BSRUZJWF9JTl9ERUZFUlJFRF9JTVBPUlQsCisgICAgICBNSVNTSU5HX1NUQVJfQUZURVJfU1lOQywKICAgICAgIE1JU1NJTkdfU1RBVEVNRU5ULAogICAgICAgTUlTU0lOR19URVJNSU5BVE9SX0ZPUl9QQVJBTUVURVJfR1JPVVAsCiAgICAgICBNSVNTSU5HX1RZUEVERUZfUEFSQU1FVEVSUywKQEAgLTc4OTMsNiArODAzNywxNCBAQAogICAgKi8KICAgY29uc3QgUGFyc2VyRXJyb3JDb2RlLmNvbjMoU3RyaW5nIG5hbWUsIGludCBvcmRpbmFsLCBTdHJpbmcgbWVzc2FnZSkgOiB0aGlzLmNvbjIobmFtZSwgb3JkaW5hbCwgRXJyb3JTZXZlcml0eS5FUlJPUiwgbWVzc2FnZSwgbnVsbCk7CiAKKyAgLyoqCisgICAqIEluaXRpYWxpemUgYSBuZXdseSBjcmVhdGVkIGVycm9yIGNvZGUgdG8gaGF2ZSB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBzZXZlcml0eSBvZiBFUlJPUi4KKyAgICoKKyAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdGVtcGxhdGUgdXNlZCB0byBjcmVhdGUgdGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGZvciB0aGUgZXJyb3IKKyAgICogQHBhcmFtIGNvcnJlY3Rpb24gdGhlIHRlbXBsYXRlIHVzZWQgdG8gY3JlYXRlIHRoZSBjb3JyZWN0aW9uIHRvIGJlIGRpc3BsYXllZCBmb3IgdGhlIGVycm9yCisgICAqLworICBjb25zdCBQYXJzZXJFcnJvckNvZGUuY29uNChTdHJpbmcgbmFtZSwgaW50IG9yZGluYWwsIFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgY29ycmVjdGlvbikgOiB0aGlzLmNvbjIobmFtZSwgb3JkaW5hbCwgRXJyb3JTZXZlcml0eS5FUlJPUiwgbWVzc2FnZSwgY29ycmVjdGlvbik7CisKICAgQG92ZXJyaWRlCiAgIEVycm9yVHlwZSBnZXQgdHlwZSA9PiBFcnJvclR5cGUuU1lOVEFDVElDX0VSUk9SOwogCkBAIC03OTk1LDYgKzgxNDcsMTIgQEAKICAgfQogCiAgIEBvdmVycmlkZQorICBib29sIHZpc2l0QXdhaXRFeHByZXNzaW9uKEF3YWl0RXhwcmVzc2lvbiBub2RlKSB7CisgICAgQXdhaXRFeHByZXNzaW9uIHRvTm9kZSA9IHRoaXMuX3RvTm9kZSBhcyBBd2FpdEV4cHJlc3Npb247CisgICAgcmV0dXJuIGphdmFCb29sZWFuQW5kKGphdmFCb29sZWFuQW5kKF9pc0VxdWFsVG9rZW5zKG5vZGUuYXdhaXRLZXl3b3JkLCB0b05vZGUuYXdhaXRLZXl3b3JkKSwgX2lzRXF1YWxOb2Rlcyhub2RlLmV4cHJlc3Npb24sIHRvTm9kZS5leHByZXNzaW9uKSksIF9pc0VxdWFsVG9rZW5zKG5vZGUuc2VtaWNvbG9uLCB0b05vZGUuc2VtaWNvbG9uKSk7CisgIH0KKworICBAb3ZlcnJpZGUKICAgYm9vbCB2aXNpdEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBub2RlKSB7CiAgICAgQmluYXJ5RXhwcmVzc2lvbiB0b05vZGUgPSB0aGlzLl90b05vZGUgYXMgQmluYXJ5RXhwcmVzc2lvbjsKICAgICBpZiAoamF2YUJvb2xlYW5BbmQoamF2YUJvb2xlYW5BbmQoX2lzRXF1YWxOb2Rlcyhub2RlLmxlZnRPcGVyYW5kLCB0b05vZGUubGVmdE9wZXJhbmQpLCBfaXNFcXVhbFRva2Vucyhub2RlLm9wZXJhdG9yLCB0b05vZGUub3BlcmF0b3IpKSwgX2lzRXF1YWxOb2Rlcyhub2RlLnJpZ2h0T3BlcmFuZCwgdG9Ob2RlLnJpZ2h0T3BlcmFuZCkpKSB7CkBAIC04Nzc2LDYgKzg5MzQsMTIgQEAKICAgICByZXR1cm4gamF2YUJvb2xlYW5BbmQoX2lzRXF1YWxUb2tlbnMobm9kZS53aXRoS2V5d29yZCwgdG9Ob2RlLndpdGhLZXl3b3JkKSwgX2lzRXF1YWxOb2RlTGlzdHMobm9kZS5taXhpblR5cGVzLCB0b05vZGUubWl4aW5UeXBlcykpOwogICB9CiAKKyAgQG92ZXJyaWRlCisgIGJvb2wgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CisgICAgWWllbGRTdGF0ZW1lbnQgdG9Ob2RlID0gdGhpcy5fdG9Ob2RlIGFzIFlpZWxkU3RhdGVtZW50OworICAgIHJldHVybiBqYXZhQm9vbGVhbkFuZChqYXZhQm9vbGVhbkFuZChfaXNFcXVhbFRva2Vucyhub2RlLnlpZWxkS2V5d29yZCwgdG9Ob2RlLnlpZWxkS2V5d29yZCksIF9pc0VxdWFsTm9kZXMobm9kZS5leHByZXNzaW9uLCB0b05vZGUuZXhwcmVzc2lvbikpLCBfaXNFcXVhbFRva2Vucyhub2RlLnNlbWljb2xvbiwgdG9Ob2RlLnNlbWljb2xvbikpOworICB9CisKICAgLyoqCiAgICAqIFJldHVybiBgdHJ1ZWAgaWYgdGhlIGdpdmVuIGxpc3RzIG9mIEFTVCBub2RlcyBoYXZlIHRoZSBzYW1lIHNpemUgYW5kIGNvcnJlc3BvbmRpbmcKICAgICogZWxlbWVudHMgYXJlIGVxdWFsLgpAQCAtODk1Myw2ICs5MTE3LDcgQEAKICAgJ3BhcnNlQXNzZXJ0U3RhdGVtZW50XzAnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgwLCAoUGFyc2VyIHRhcmdldCkgPT4gdGFyZ2V0Ll9wYXJzZUFzc2VydFN0YXRlbWVudCgpKSwKICAgJ3BhcnNlQXNzaWduYWJsZUV4cHJlc3Npb25fMSc6IG5ldyBNZXRob2RUcmFtcG9saW5lKDEsIChQYXJzZXIgdGFyZ2V0LCBhcmcwKSA9PiB0YXJnZXQuX3BhcnNlQXNzaWduYWJsZUV4cHJlc3Npb24oYXJnMCkpLAogICAncGFyc2VBc3NpZ25hYmxlU2VsZWN0b3JfMic6IG5ldyBNZXRob2RUcmFtcG9saW5lKDIsIChQYXJzZXIgdGFyZ2V0LCBhcmcwLCBhcmcxKSA9PiB0YXJnZXQuX3BhcnNlQXNzaWduYWJsZVNlbGVjdG9yKGFyZzAsIGFyZzEpKSwKKyAgJ3BhcnNlQXdhaXRFeHByZXNzaW9uXzAnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgwLCAoUGFyc2VyIHRhcmdldCkgPT4gdGFyZ2V0Ll9wYXJzZUF3YWl0RXhwcmVzc2lvbigpKSwKICAgJ3BhcnNlQml0d2lzZUFuZEV4cHJlc3Npb25fMCc6IG5ldyBNZXRob2RUcmFtcG9saW5lKDAsIChQYXJzZXIgdGFyZ2V0KSA9PiB0YXJnZXQuX3BhcnNlQml0d2lzZUFuZEV4cHJlc3Npb24oKSksCiAgICdwYXJzZUJpdHdpc2VYb3JFeHByZXNzaW9uXzAnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgwLCAoUGFyc2VyIHRhcmdldCkgPT4gdGFyZ2V0Ll9wYXJzZUJpdHdpc2VYb3JFeHByZXNzaW9uKCkpLAogICAncGFyc2VCcmVha1N0YXRlbWVudF8wJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMCwgKFBhcnNlciB0YXJnZXQpID0+IHRhcmdldC5fcGFyc2VCcmVha1N0YXRlbWVudCgpKSwKQEAgLTkwMzEsNiArOTE5Niw3IEBACiAgICdwYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZnRlck1ldGFkYXRhXzEnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgxLCAoUGFyc2VyIHRhcmdldCwgYXJnMCkgPT4gdGFyZ2V0Ll9wYXJzZVZhcmlhYmxlRGVjbGFyYXRpb25TdGF0ZW1lbnRBZnRlck1ldGFkYXRhKGFyZzApKSwKICAgJ3BhcnNlVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudEFmdGVyVHlwZV8zJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMywgKFBhcnNlciB0YXJnZXQsIGFyZzAsIGFyZzEsIGFyZzIpID0+IHRhcmdldC5fcGFyc2VWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50QWZ0ZXJUeXBlKGFyZzAsIGFyZzEsIGFyZzIpKSwKICAgJ3BhcnNlV2hpbGVTdGF0ZW1lbnRfMCc6IG5ldyBNZXRob2RUcmFtcG9saW5lKDAsIChQYXJzZXIgdGFyZ2V0KSA9PiB0YXJnZXQuX3BhcnNlV2hpbGVTdGF0ZW1lbnQoKSksCisgICdwYXJzZVlpZWxkU3RhdGVtZW50XzAnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgwLCAoUGFyc2VyIHRhcmdldCkgPT4gdGFyZ2V0Ll9wYXJzZVlpZWxkU3RhdGVtZW50KCkpLAogICAncGVla18wJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMCwgKFBhcnNlciB0YXJnZXQpID0+IHRhcmdldC5fcGVlaygpKSwKICAgJ3BlZWtBdF8xJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMSwgKFBhcnNlciB0YXJnZXQsIGFyZzApID0+IHRhcmdldC5fcGVla0F0KGFyZzApKSwKICAgJ3JlcG9ydEVycm9yXzEnOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgxLCAoUGFyc2VyIHRhcmdldCwgYXJnMCkgPT4gdGFyZ2V0Ll9yZXBvcnRFcnJvcihhcmcwKSksCkBAIC05MDUyLDYgKzkyMTgsNyBAQAogICAndG9rZW5NYXRjaGVzXzInOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgyLCAoUGFyc2VyIHRhcmdldCwgYXJnMCwgYXJnMSkgPT4gdGFyZ2V0Ll90b2tlbk1hdGNoZXMoYXJnMCwgYXJnMSkpLAogICAndG9rZW5NYXRjaGVzSWRlbnRpZmllcl8xJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMSwgKFBhcnNlciB0YXJnZXQsIGFyZzApID0+IHRhcmdldC5fdG9rZW5NYXRjaGVzSWRlbnRpZmllcihhcmcwKSksCiAgICd0b2tlbk1hdGNoZXNLZXl3b3JkXzInOiBuZXcgTWV0aG9kVHJhbXBvbGluZSgyLCAoUGFyc2VyIHRhcmdldCwgYXJnMCwgYXJnMSkgPT4gdGFyZ2V0Ll90b2tlbk1hdGNoZXNLZXl3b3JkKGFyZzAsIGFyZzEpKSwKKyAgJ3Rva2VuTWF0Y2hlc1N0cmluZ18yJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMiwgKFBhcnNlciB0YXJnZXQsIGFyZzAsIGFyZzEpID0+IHRhcmdldC5fdG9rZW5NYXRjaGVzU3RyaW5nKGFyZzAsIGFyZzEpKSwKICAgJ3RyYW5zbGF0ZUNoYXJhY3Rlcl8zJzogbmV3IE1ldGhvZFRyYW1wb2xpbmUoMywgKFBhcnNlciB0YXJnZXQsIGFyZzAsIGFyZzEsIGFyZzIpID0+IHRhcmdldC5fdHJhbnNsYXRlQ2hhcmFjdGVyKGFyZzAsIGFyZzEsIGFyZzIpKSwKICAgJ3VubG9ja0Vycm9yTGlzdGVuZXJfMCc6IG5ldyBNZXRob2RUcmFtcG9saW5lKDAsIChQYXJzZXIgdGFyZ2V0KSA9PiB0YXJnZXQuX3VubG9ja0Vycm9yTGlzdGVuZXIoKSksCiAgICd2YWxpZGF0ZUZvcm1hbFBhcmFtZXRlckxpc3RfMSc6IG5ldyBNZXRob2RUcmFtcG9saW5lKDEsIChQYXJzZXIgdGFyZ2V0LCBhcmcwKSA9PiB0YXJnZXQuX3ZhbGlkYXRlRm9ybWFsUGFyYW1ldGVyTGlzdChhcmcwKSksCmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvcmVzb2x2ZXIuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0CmluZGV4IDUwM2RiY2QuLmZhMTIyOTEgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0CisrKyBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC9yZXNvbHZlci5kYXJ0CkBAIC0xNDAwLDYgKzE0MDAsOSBAQAogCiAgIEBvdmVycmlkZQogICBPYmplY3QgdmlzaXRJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbihJbnN0YW5jZUNyZWF0aW9uRXhwcmVzc2lvbiBub2RlKSB7CisgICAgaWYgKG5vZGUuaXNDb25zdCkgeworICAgICAgX3ZhbGlkYXRlKG5vZGUsIG51bGwpOworICAgIH0KICAgICBfdmFsaWRhdGVJbnN0YW5jZUNyZWF0aW9uQXJndW1lbnRzKG5vZGUpOwogICAgIHJldHVybiBzdXBlci52aXNpdEluc3RhbmNlQ3JlYXRpb25FeHByZXNzaW9uKG5vZGUpOwogICB9CkBAIC0xNjA5LDcgKzE2MTIsNyBAQAogICAgICAgICBFcnJvckNvZGUgZGF0YUVycm9yQ29kZSA9IGRhdGEuZXJyb3JDb2RlOwogICAgICAgICBpZiAoaWRlbnRpY2FsKGRhdGFFcnJvckNvZGUsIENvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTikgfHwgaWRlbnRpY2FsKGRhdGFFcnJvckNvZGUsIENvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0VWQUxfVEhST1dTX0lEQlpFKSB8fCBpZGVudGljYWwoZGF0YUVycm9yQ29kZSwgQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfRVZBTF9UWVBFX0JPT0xfTlVNX1NUUklORykgfHwgaWRlbnRpY2FsKGRhdGFFcnJvckNvZGUsIENvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0VWQUxfVFlQRV9CT09MKSB8fCBpZGVudGljYWwoZGF0YUVycm9yQ29kZSwgQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfRVZBTF9UWVBFX0lOVCkgfHwgaWRlbnRpY2FsKGRhdGFFcnJvckNvZGUsIENvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0VWQUxfVFlQRV9OVU0pKSB7CiAgICAgICAgICAgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKGRhdGFFcnJvckNvZGUsIGRhdGEubm9kZSwgW10pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSAhPSBudWxsKSB7CiAgICAgICAgICAgX2Vycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3JGb3JOb2RlKGVycm9yQ29kZSwgZGF0YS5ub2RlLCBbXSk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTE1ODk4LDcgKzE1OTAxLDcgQEAKICAgdm9pZCBfcGVyZm9ybUNvbnN0YW50RXZhbHVhdGlvbigpIHsKICAgICBUaW1lQ291bnRlcl9UaW1lQ291bnRlckhhbmRsZSB0aW1lQ291bnRlciA9IFBlcmZvcm1hbmNlU3RhdGlzdGljcy5yZXNvbHZlLnN0YXJ0KCk7CiAgICAgdHJ5IHsKLSAgICAgIENvbnN0YW50VmFsdWVDb21wdXRlciBjb21wdXRlciA9IG5ldyBDb25zdGFudFZhbHVlQ29tcHV0ZXIoX3R5cGVQcm92aWRlcik7CisgICAgICBDb25zdGFudFZhbHVlQ29tcHV0ZXIgY29tcHV0ZXIgPSBuZXcgQ29uc3RhbnRWYWx1ZUNvbXB1dGVyKF90eXBlUHJvdmlkZXIsIGFuYWx5c2lzQ29udGV4dC5kZWNsYXJlZFZhcmlhYmxlcyk7CiAgICAgICBmb3IgKExpYnJhcnkgbGlicmFyeSBpbiBfbGlicmFyaWVzSW5DeWNsZXMpIHsKICAgICAgICAgZm9yIChTb3VyY2Ugc291cmNlIGluIGxpYnJhcnkuY29tcGlsYXRpb25Vbml0U291cmNlcykgewogICAgICAgICAgIHRyeSB7CkBAIC0xNjM1MCw3ICsxNjM1Myw3IEBACiAgIHZvaWQgX3BlcmZvcm1Db25zdGFudEV2YWx1YXRpb24oKSB7CiAgICAgVGltZUNvdW50ZXJfVGltZUNvdW50ZXJIYW5kbGUgdGltZUNvdW50ZXIgPSBQZXJmb3JtYW5jZVN0YXRpc3RpY3MucmVzb2x2ZS5zdGFydCgpOwogICAgIHRyeSB7Ci0gICAgICBDb25zdGFudFZhbHVlQ29tcHV0ZXIgY29tcHV0ZXIgPSBuZXcgQ29uc3RhbnRWYWx1ZUNvbXB1dGVyKF90eXBlUHJvdmlkZXIpOworICAgICAgQ29uc3RhbnRWYWx1ZUNvbXB1dGVyIGNvbXB1dGVyID0gbmV3IENvbnN0YW50VmFsdWVDb21wdXRlcihfdHlwZVByb3ZpZGVyLCBhbmFseXNpc0NvbnRleHQuZGVjbGFyZWRWYXJpYWJsZXMpOwogICAgICAgZm9yIChSZXNvbHZhYmxlTGlicmFyeSBsaWJyYXJ5IGluIF9saWJyYXJpZXNJbkN5Y2xlKSB7CiAgICAgICAgIGZvciAoUmVzb2x2YWJsZUNvbXBpbGF0aW9uVW5pdCB1bml0IGluIGxpYnJhcnkucmVzb2x2YWJsZUNvbXBpbGF0aW9uVW5pdHMpIHsKICAgICAgICAgICBDb21waWxhdGlvblVuaXQgYXN0ID0gdW5pdC5jb21waWxhdGlvblVuaXQ7CkBAIC0xOTY2OCw3ICsxOTY3MSw3IEBACiAgICAgfSBmaW5hbGx5IHsKICAgICAgIF9uYW1lU2NvcGUgPSBvdXRlclNjb3BlOwogICAgIH0KLSAgICBpZiAoZnVuY3Rpb25FbGVtZW50LmVuY2xvc2luZ0VsZW1lbnQgaXMhIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQpIHsKKyAgICBpZiAoZnVuY3Rpb25FbGVtZW50ICE9IG51bGwgJiYgZnVuY3Rpb25FbGVtZW50LmVuY2xvc2luZ0VsZW1lbnQgaXMhIENvbXBpbGF0aW9uVW5pdEVsZW1lbnQpIHsKICAgICAgIF9uYW1lU2NvcGUuZGVmaW5lKGZ1bmN0aW9uRWxlbWVudCk7CiAgICAgfQogICAgIHJldHVybiBudWxsOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvYXN0X2ZhY3RvcnkuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL2dlbmVyYXRlZC90ZXN0aW5nL2FzdF9mYWN0b3J5LmRhcnQKaW5kZXggZTAxMTkzYi4uOTc1MTIyMSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvZ2VuZXJhdGVkL3Rlc3RpbmcvYXN0X2ZhY3RvcnkuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9nZW5lcmF0ZWQvdGVzdGluZy9hc3RfZmFjdG9yeS5kYXJ0CkBAIC00MCwxMyArNDAsMjEgQEAKIAogICBzdGF0aWMgQXNzaWdubWVudEV4cHJlc3Npb24gYXNzaWdubWVudEV4cHJlc3Npb24oRXhwcmVzc2lvbiBsZWZ0SGFuZFNpZGUsIFRva2VuVHlwZSBvcGVyYXRvciwgRXhwcmVzc2lvbiByaWdodEhhbmRTaWRlKSA9PiBuZXcgQXNzaWdubWVudEV4cHJlc3Npb24obGVmdEhhbmRTaWRlLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShvcGVyYXRvciksIHJpZ2h0SGFuZFNpZGUpOwogCisgIHN0YXRpYyBCbG9ja0Z1bmN0aW9uQm9keSBhc3luY0Jsb2NrRnVuY3Rpb25Cb2R5KExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSA9PiBuZXcgQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJhc3luYyIpLCBudWxsLCBibG9jayhzdGF0ZW1lbnRzKSk7CisKKyAgc3RhdGljIEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgYXN5bmNFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgPT4gbmV3IEV4cHJlc3Npb25GdW5jdGlvbkJvZHkoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJhc3luYyIpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuRlVOQ1RJT04pLCBleHByZXNzaW9uLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuU0VNSUNPTE9OKSk7CisKKyAgc3RhdGljIEJsb2NrRnVuY3Rpb25Cb2R5IGFzeW5jR2VuZXJhdG9yQmxvY2tGdW5jdGlvbkJvZHkoTGlzdDxTdGF0ZW1lbnQ+IHN0YXRlbWVudHMpID0+IG5ldyBCbG9ja0Z1bmN0aW9uQm9keShUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZUFuZFN0cmluZyhUb2tlblR5cGUuSURFTlRJRklFUiwgImFzeW5jIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TVEFSKSwgYmxvY2soc3RhdGVtZW50cykpOworCisgIHN0YXRpYyBBd2FpdEV4cHJlc3Npb24gYXdhaXRFeHByZXNzaW9uKEV4cHJlc3Npb24gZXhwcmVzc2lvbikgPT4gbmV3IEF3YWl0RXhwcmVzc2lvbihUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZUFuZFN0cmluZyhUb2tlblR5cGUuSURFTlRJRklFUiwgImF3YWl0IiksIGV4cHJlc3Npb24sIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TRU1JQ09MT04pKTsKKwogICBzdGF0aWMgQmluYXJ5RXhwcmVzc2lvbiBiaW5hcnlFeHByZXNzaW9uKEV4cHJlc3Npb24gbGVmdE9wZXJhbmQsIFRva2VuVHlwZSBvcGVyYXRvciwgRXhwcmVzc2lvbiByaWdodE9wZXJhbmQpID0+IG5ldyBCaW5hcnlFeHByZXNzaW9uKGxlZnRPcGVyYW5kLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShvcGVyYXRvciksIHJpZ2h0T3BlcmFuZCk7CiAKICAgc3RhdGljIEJsb2NrIGJsb2NrKExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSA9PiBuZXcgQmxvY2soVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fQ1VSTFlfQlJBQ0tFVCksIGxpc3Qoc3RhdGVtZW50cyksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5DTE9TRV9DVVJMWV9CUkFDS0VUKSk7CiAKLSAgc3RhdGljIEJsb2NrRnVuY3Rpb25Cb2R5IGJsb2NrRnVuY3Rpb25Cb2R5KEJsb2NrIGJsb2NrKSA9PiBuZXcgQmxvY2tGdW5jdGlvbkJvZHkoYmxvY2spOworICBzdGF0aWMgQmxvY2tGdW5jdGlvbkJvZHkgYmxvY2tGdW5jdGlvbkJvZHkoQmxvY2sgYmxvY2spID0+IG5ldyBCbG9ja0Z1bmN0aW9uQm9keShudWxsLCBudWxsLCBibG9jayk7CiAKLSAgc3RhdGljIEJsb2NrRnVuY3Rpb25Cb2R5IGJsb2NrRnVuY3Rpb25Cb2R5MihMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgPT4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KGJsb2NrKHN0YXRlbWVudHMpKTsKKyAgc3RhdGljIEJsb2NrRnVuY3Rpb25Cb2R5IGJsb2NrRnVuY3Rpb25Cb2R5MihMaXN0PFN0YXRlbWVudD4gc3RhdGVtZW50cykgPT4gbmV3IEJsb2NrRnVuY3Rpb25Cb2R5KG51bGwsIG51bGwsIGJsb2NrKHN0YXRlbWVudHMpKTsKIAogICBzdGF0aWMgQm9vbGVhbkxpdGVyYWwgYm9vbGVhbkxpdGVyYWwoYm9vbCB2YWx1ZSkgPT4gbmV3IEJvb2xlYW5MaXRlcmFsKHZhbHVlID8gVG9rZW5GYWN0b3J5LnRva2VuRnJvbUtleXdvcmQoS2V5d29yZC5UUlVFKSA6IFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRkFMU0UpLCB2YWx1ZSk7CiAKQEAgLTEyNyw3ICsxMzUsNyBAQAogCiAgIHN0YXRpYyBFeHBvcnREaXJlY3RpdmUgZXhwb3J0RGlyZWN0aXZlMihTdHJpbmcgdXJpLCBMaXN0PENvbWJpbmF0b3I+IGNvbWJpbmF0b3JzKSA9PiBleHBvcnREaXJlY3RpdmUobmV3IExpc3Q8QW5ub3RhdGlvbj4oKSwgdXJpLCBjb21iaW5hdG9ycyk7CiAKLSAgc3RhdGljIEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgZXhwcmVzc2lvbkZ1bmN0aW9uQm9keShFeHByZXNzaW9uIGV4cHJlc3Npb24pID0+IG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5GVU5DVElPTiksIGV4cHJlc3Npb24sIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TRU1JQ09MT04pKTsKKyAgc3RhdGljIEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgZXhwcmVzc2lvbkZ1bmN0aW9uQm9keShFeHByZXNzaW9uIGV4cHJlc3Npb24pID0+IG5ldyBFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KG51bGwsIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5GVU5DVElPTiksIGV4cHJlc3Npb24sIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TRU1JQ09MT04pKTsKIAogICBzdGF0aWMgRXhwcmVzc2lvblN0YXRlbWVudCBleHByZXNzaW9uU3RhdGVtZW50KEV4cHJlc3Npb24gZXhwcmVzc2lvbikgPT4gbmV3IEV4cHJlc3Npb25TdGF0ZW1lbnQoZXhwcmVzc2lvbiwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLlNFTUlDT0xPTikpOwogCkBAIC0xNDEsOSArMTQ5LDkgQEAKIAogICBzdGF0aWMgRmllbGRGb3JtYWxQYXJhbWV0ZXIgZmllbGRGb3JtYWxQYXJhbWV0ZXIyKFN0cmluZyBpZGVudGlmaWVyKSA9PiBmaWVsZEZvcm1hbFBhcmFtZXRlcihudWxsLCBudWxsLCBpZGVudGlmaWVyKTsKIAotICBzdGF0aWMgRm9yRWFjaFN0YXRlbWVudCBmb3JFYWNoU3RhdGVtZW50KERlY2xhcmVkSWRlbnRpZmllciBsb29wVmFyaWFibGUsIEV4cHJlc3Npb24gaXRlcmF0b3IsIFN0YXRlbWVudCBib2R5KSA9PiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24xKFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRk9SKSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fUEFSRU4pLCBsb29wVmFyaWFibGUsIFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuSU4pLCBpdGVyYXRvciwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLkNMT1NFX1BBUkVOKSwgYm9keSk7CisgIHN0YXRpYyBGb3JFYWNoU3RhdGVtZW50IGZvckVhY2hTdGF0ZW1lbnQoRGVjbGFyZWRJZGVudGlmaWVyIGxvb3BWYXJpYWJsZSwgRXhwcmVzc2lvbiBpdGVyYXRvciwgU3RhdGVtZW50IGJvZHkpID0+IG5ldyBGb3JFYWNoU3RhdGVtZW50LmNvbjEobnVsbCwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbUtleXdvcmQoS2V5d29yZC5GT1IpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuT1BFTl9QQVJFTiksIGxvb3BWYXJpYWJsZSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbUtleXdvcmQoS2V5d29yZC5JTiksIGl0ZXJhdG9yLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuQ0xPU0VfUEFSRU4pLCBib2R5KTsKIAotICBzdGF0aWMgRm9yRWFjaFN0YXRlbWVudCBmb3JFYWNoU3RhdGVtZW50MihTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIsIEV4cHJlc3Npb24gaXRlcmF0b3IsIFN0YXRlbWVudCBib2R5KSA9PiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRk9SKSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fUEFSRU4pLCBpZGVudGlmaWVyLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkLklOKSwgaXRlcmF0b3IsIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5DTE9TRV9QQVJFTiksIGJvZHkpOworICBzdGF0aWMgRm9yRWFjaFN0YXRlbWVudCBmb3JFYWNoU3RhdGVtZW50MihTaW1wbGVJZGVudGlmaWVyIGlkZW50aWZpZXIsIEV4cHJlc3Npb24gaXRlcmF0b3IsIFN0YXRlbWVudCBib2R5KSA9PiBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKG51bGwsIFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRk9SKSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fUEFSRU4pLCBpZGVudGlmaWVyLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkLklOKSwgaXRlcmF0b3IsIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5DTE9TRV9QQVJFTiksIGJvZHkpOwogCiAgIHN0YXRpYyBGb3JtYWxQYXJhbWV0ZXJMaXN0IGZvcm1hbFBhcmFtZXRlckxpc3QoTGlzdDxGb3JtYWxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpID0+IG5ldyBGb3JtYWxQYXJhbWV0ZXJMaXN0KFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5PUEVOX1BBUkVOKSwgbGlzdChwYXJhbWV0ZXJzKSwgbnVsbCwgbnVsbCwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLkNMT1NFX1BBUkVOKSk7CiAKQEAgLTM0Nyw2ICszNTUsMTAgQEAKICAgICByZXR1cm4gbmV3IFN5bWJvbExpdGVyYWwoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLkhBU0gpLCBuZXcgTGlzdC5mcm9tKGlkZW50aWZpZXJMaXN0KSk7CiAgIH0KIAorICBzdGF0aWMgQmxvY2tGdW5jdGlvbkJvZHkgc3luY0Jsb2NrRnVuY3Rpb25Cb2R5KExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSA9PiBuZXcgQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJzeW5jIiksIG51bGwsIGJsb2NrKHN0YXRlbWVudHMpKTsKKworICBzdGF0aWMgQmxvY2tGdW5jdGlvbkJvZHkgc3luY0dlbmVyYXRvckJsb2NrRnVuY3Rpb25Cb2R5KExpc3Q8U3RhdGVtZW50PiBzdGF0ZW1lbnRzKSA9PiBuZXcgQmxvY2tGdW5jdGlvbkJvZHkoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJzeW5jIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TVEFSKSwgYmxvY2soc3RhdGVtZW50cykpOworCiAgIHN0YXRpYyBUaGlzRXhwcmVzc2lvbiB0aGlzRXhwcmVzc2lvbigpID0+IG5ldyBUaGlzRXhwcmVzc2lvbihUb2tlbkZhY3RvcnkudG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkLlRISVMpKTsKIAogICBzdGF0aWMgVGhyb3dFeHByZXNzaW9uIHRocm93RXhwcmVzc2lvbigpID0+IHRocm93RXhwcmVzc2lvbjIobnVsbCk7CkBAIC00MjUsNCArNDM3LDggQEAKICAgc3RhdGljIFdoaWxlU3RhdGVtZW50IHdoaWxlU3RhdGVtZW50KEV4cHJlc3Npb24gY29uZGl0aW9uLCBTdGF0ZW1lbnQgYm9keSkgPT4gbmV3IFdoaWxlU3RhdGVtZW50KFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuV0hJTEUpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuT1BFTl9QQVJFTiksIGNvbmRpdGlvbiwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLkNMT1NFX1BBUkVOKSwgYm9keSk7CiAKICAgc3RhdGljIFdpdGhDbGF1c2Ugd2l0aENsYXVzZShMaXN0PFR5cGVOYW1lPiB0eXBlcykgPT4gbmV3IFdpdGhDbGF1c2UoVG9rZW5GYWN0b3J5LnRva2VuRnJvbUtleXdvcmQoS2V5d29yZC5XSVRIKSwgbGlzdCh0eXBlcykpOworCisgIHN0YXRpYyBZaWVsZFN0YXRlbWVudCB5aWVsZEVhY2hTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSA9PiBuZXcgWWllbGRTdGF0ZW1lbnQoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJ5aWVsZCIpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuU1RBUiksIGV4cHJlc3Npb24sIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5TRU1JQ09MT04pKTsKKworICBzdGF0aWMgWWllbGRTdGF0ZW1lbnQgeWllbGRTdGF0ZW1lbnQoRXhwcmVzc2lvbiBleHByZXNzaW9uKSA9PiBuZXcgWWllbGRTdGF0ZW1lbnQoVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGVBbmRTdHJpbmcoVG9rZW5UeXBlLklERU5USUZJRVIsICJ5aWVsZCIpLCBudWxsLCBleHByZXNzaW9uLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuU0VNSUNPTE9OKSk7CiB9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc2VydmljZXMvZm9ybWF0dGVyX2ltcGwuZGFydCBiL3BrZy9hbmFseXplci9saWIvc3JjL3NlcnZpY2VzL2Zvcm1hdHRlcl9pbXBsLmRhcnQKaW5kZXggNTg4NDY0ZC4uNGIwYzdlOSAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc2VydmljZXMvZm9ybWF0dGVyX2ltcGwuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zZXJ2aWNlcy9mb3JtYXR0ZXJfaW1wbC5kYXJ0CkBAIC0zODUsNiArMzg1LDkgQEAKICAgLy8vIEEgd2VpZ2h0IGZvciBwb3RlbnRpYWwgYnJlYWtwb2ludHMuCiAgIGludCBjdXJyZW50QnJlYWtXZWlnaHQgPSBERUZBVUxUX1NQQUNFX1dFSUdIVDsKIAorICAvLy8gVGhlIGxhc3QgaXNzdWVkIHNwYWNlIHdlaWdodC4KKyAgaW50IGxhc3RTcGFjZVdlaWdodCA9IDA7CisKICAgLy8vIE9yaWdpbmFsIHByZS1mb3JtYXQgc2VsZWN0aW9uIGluZm9ybWF0aW9uIChtYXkgYmUgbnVsbCkuCiAgIGZpbmFsIFNlbGVjdGlvbiBwcmVTZWxlY3Rpb247CiAKQEAgLTQyMyw4ICs0MjYsMTMgQEAKIAogICB2aXNpdEFyZ3VtZW50TGlzdChBcmd1bWVudExpc3Qgbm9kZSkgewogICAgIHRva2VuKG5vZGUubGVmdFBhcmVudGhlc2lzKTsKLSAgICBicmVha2FibGVOb25TcGFjZSgpOwotICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWROb2Rlcyhub2RlLmFyZ3VtZW50cyk7CisgICAgaWYgKG5vZGUuYXJndW1lbnRzLmlzTm90RW1wdHkpIHsKKyAgICAgIGludCB3ZWlnaHQgPSBsYXN0U3BhY2VXZWlnaHQrKzsKKyAgICAgIGxldmVsU3BhY2Uod2VpZ2h0LCAwKTsKKyAgICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWROb2RlcygKKyAgICAgICAgICBub2RlLmFyZ3VtZW50cywKKyAgICAgICAgICBmb2xsb3dlZEJ5OiAoKSA9PiBsZXZlbFNwYWNlKHdlaWdodCkpOworICAgIH0KICAgICB0b2tlbihub2RlLnJpZ2h0UGFyZW50aGVzaXMpOwogICB9CiAKQEAgLTQ1NCwxMiArNDYyLDM5IEBACiAgICAgfSk7CiAgIH0KIAorICBAb3ZlcnJpZGUKKyAgdmlzaXRBd2FpdEV4cHJlc3Npb24oQXdhaXRFeHByZXNzaW9uIG5vZGUpIHsKKyAgICB0b2tlbihub2RlLmF3YWl0S2V5d29yZCk7CisgICAgc3BhY2UoKTsKKyAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOworICAgIC8vIFRPRE8oc2NoZWdsb3YpIGEgYnVnIGluIHRoZSBzcGVjLCB0aGVyZSBzb3VsZCBub3QgYmUgYSAnOycKKyAgICB0b2tlbihub2RlLnNlbWljb2xvbik7CisgIH0KKwogICB2aXNpdEJpbmFyeUV4cHJlc3Npb24oQmluYXJ5RXhwcmVzc2lvbiBub2RlKSB7Ci0gICAgdmlzaXQobm9kZS5sZWZ0T3BlcmFuZCk7Ci0gICAgc3BhY2UoKTsKLSAgICB0b2tlbihub2RlLm9wZXJhdG9yKTsKLSAgICBzcGFjZSgpOwotICAgIHZpc2l0KG5vZGUucmlnaHRPcGVyYW5kKTsKKyAgICBUb2tlbiBvcGVyYXRvciA9IG5vZGUub3BlcmF0b3I7CisgICAgVG9rZW5UeXBlIG9wZXJhdG9yVHlwZSA9IG9wZXJhdG9yLnR5cGU7CisgICAgaW50IGFkZE9wZXJhbmRzKExpc3Q8RXhwcmVzc2lvbj4gb3BlcmFuZHMsIEV4cHJlc3Npb24gZSwgaW50IGkpIHsKKyAgICAgIGlmIChlIGlzIEJpbmFyeUV4cHJlc3Npb24gJiYgZS5vcGVyYXRvci50eXBlID09IG9wZXJhdG9yVHlwZSkgeworICAgICAgICBpID0gYWRkT3BlcmFuZHMob3BlcmFuZHMsIGUubGVmdE9wZXJhbmQsIGkpOworICAgICAgICBpID0gYWRkT3BlcmFuZHMob3BlcmFuZHMsIGUucmlnaHRPcGVyYW5kLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG9wZXJhbmRzLmluc2VydChpKyssIGUpOworICAgICAgfQorICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIExpc3Q8RXhwcmVzc2lvbj4gb3BlcmFuZHMgPSBbXTsKKyAgICBhZGRPcGVyYW5kcyhvcGVyYW5kcywgbm9kZS5sZWZ0T3BlcmFuZCwgMCk7CisgICAgYWRkT3BlcmFuZHMob3BlcmFuZHMsIG5vZGUucmlnaHRPcGVyYW5kLCBvcGVyYW5kcy5sZW5ndGgpOworICAgIGludCB3ZWlnaHQgPSBsYXN0U3BhY2VXZWlnaHQrKzsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhbmRzLmxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgIHNwYWNlKCk7CisgICAgICAgIHRva2VuKG9wZXJhdG9yKTsKKyAgICAgICAgbGV2ZWxTcGFjZSh3ZWlnaHQpOworICAgICAgfQorICAgICAgdmlzaXQob3BlcmFuZHNbaV0pOworICAgIH0KICAgfQogCiAgIHZpc2l0QmxvY2soQmxvY2sgbm9kZSkgewpAQCAtNTk1LDE1ICs2MzAsMTYgQEAKICAgfQogCiAgIHZpc2l0Q29uZGl0aW9uYWxFeHByZXNzaW9uKENvbmRpdGlvbmFsRXhwcmVzc2lvbiBub2RlKSB7CisgICAgaW50IHdlaWdodCA9IGxhc3RTcGFjZVdlaWdodCsrOwogICAgIHZpc2l0KG5vZGUuY29uZGl0aW9uKTsKICAgICBzcGFjZSgpOwogICAgIHRva2VuKG5vZGUucXVlc3Rpb24pOwogICAgIGFsbG93Q29udGludWVkTGluZXMoKCl7Ci0gICAgICBzcGFjZSgpOworICAgICAgbGV2ZWxTcGFjZSh3ZWlnaHQpOwogICAgICAgdmlzaXQobm9kZS50aGVuRXhwcmVzc2lvbik7CiAgICAgICBzcGFjZSgpOwogICAgICAgdG9rZW4obm9kZS5jb2xvbik7Ci0gICAgICBzcGFjZSgpOworICAgICAgbGV2ZWxTcGFjZSh3ZWlnaHQpOwogICAgICAgdmlzaXQobm9kZS5lbHNlRXhwcmVzc2lvbik7CiAgICAgfSk7CiAgIH0KQEAgLTc0OCw4ICs3ODQsOSBAQAogICB9CiAKICAgdmlzaXRFeHByZXNzaW9uRnVuY3Rpb25Cb2R5KEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgbm9kZSkgeworICAgIGludCB3ZWlnaHQgPSBsYXN0U3BhY2VXZWlnaHQrKzsKICAgICB0b2tlbihub2RlLmZ1bmN0aW9uRGVmaW5pdGlvbik7Ci0gICAgc3BhY2UoKTsKKyAgICBsZXZlbFNwYWNlKHdlaWdodCk7CiAgICAgdmlzaXQobm9kZS5leHByZXNzaW9uKTsKICAgICB0b2tlbihub2RlLnNlbWljb2xvbik7CiAgIH0KQEAgLTEwMTksMTEgKzEwNTYsMTUgQEAKICAgfQogCiAgIHZpc2l0TGlzdExpdGVyYWwoTGlzdExpdGVyYWwgbm9kZSkgeworICAgIGludCB3ZWlnaHQgPSBsYXN0U3BhY2VXZWlnaHQrKzsKICAgICBtb2RpZmllcihub2RlLmNvbnN0S2V5d29yZCk7CiAgICAgdmlzaXQobm9kZS50eXBlQXJndW1lbnRzKTsKICAgICB0b2tlbihub2RlLmxlZnRCcmFja2V0KTsKICAgICBpbmRlbnQoKTsKLSAgICB2aXNpdENvbW1hU2VwYXJhdGVkTm9kZXMobm9kZS5lbGVtZW50cyAvKiwgZm9sbG93ZWRCeTogYnJlYWthYmxlU3BhY2UqLyk7CisgICAgbGV2ZWxTcGFjZSh3ZWlnaHQsIDApOworICAgIHZpc2l0Q29tbWFTZXBhcmF0ZWROb2RlcygKKyAgICAgICAgbm9kZS5lbGVtZW50cywKKyAgICAgICAgZm9sbG93ZWRCeTogKCkgPT4gbGV2ZWxTcGFjZSh3ZWlnaHQpKTsKICAgICBvcHRpb25hbFRyYWlsaW5nQ29tbWEobm9kZS5yaWdodEJyYWNrZXQpOwogICAgIHRva2VuKG5vZGUucmlnaHRCcmFja2V0LCBwcmVjZWRlZEJ5OiB1bmluZGVudCk7CiAgIH0KQEAgLTEzMTksMTQgKzEzNjAsMjQgQEAKICAgICAgIHNwYWNlKCk7CiAgICAgICB0b2tlbihub2RlLmVxdWFscyk7CiAgICAgICB2YXIgaW5pdGlhbGl6ZXIgPSBub2RlLmluaXRpYWxpemVyOwotICAgICAgaWYgKGluaXRpYWxpemVyIGlzISBMaXN0TGl0ZXJhbCAmJiBpbml0aWFsaXplciBpcyEgTWFwTGl0ZXJhbCkgewotICAgICAgICBhbGxvd0NvbnRpbnVlZExpbmVzKCgpeworICAgICAgaWYgKGluaXRpYWxpemVyIGlzIExpc3RMaXRlcmFsIHx8IGluaXRpYWxpemVyIGlzIE1hcExpdGVyYWwpIHsKKyAgICAgICAgc3BhY2UoKTsKKyAgICAgICAgdmlzaXQoaW5pdGlhbGl6ZXIpOworICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBCaW5hcnlFeHByZXNzaW9uKSB7CisgICAgICAgIGFsbG93Q29udGludWVkTGluZXMoKCkgeworICAgICAgICAgIGxldmVsU3BhY2UobGFzdFNwYWNlV2VpZ2h0KTsKKyAgICAgICAgICB2aXNpdChpbml0aWFsaXplcik7CisgICAgICAgIH0pOworICAgICAgfSBlbHNlIGlmIChpbml0aWFsaXplciBpcyBDb25kaXRpb25hbEV4cHJlc3Npb24pIHsKKyAgICAgICAgYWxsb3dDb250aW51ZWRMaW5lcygoKSB7CiAgICAgICAgICAgc3BhY2UoKTsKICAgICAgICAgICB2aXNpdChpbml0aWFsaXplcik7CiAgICAgICAgIH0pOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3BhY2UoKTsKLSAgICAgICAgdmlzaXQoaW5pdGlhbGl6ZXIpOworICAgICAgICBhbGxvd0NvbnRpbnVlZExpbmVzKCgpIHsKKyAgICAgICAgICBsZXZlbFNwYWNlKGxhc3RTcGFjZVdlaWdodCsrKTsKKyAgICAgICAgICB2aXNpdChpbml0aWFsaXplcik7CisgICAgICAgIH0pOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTM4OCw2ICsxNDM5LDE1IEBACiAgICAgdmlzaXRDb21tYVNlcGFyYXRlZE5vZGVzKG5vZGUubWl4aW5UeXBlcyk7CiAgIH0KIAorICBAb3ZlcnJpZGUKKyAgdmlzaXRZaWVsZFN0YXRlbWVudChZaWVsZFN0YXRlbWVudCBub2RlKSB7CisgICAgdG9rZW4obm9kZS55aWVsZEtleXdvcmQpOworICAgIHRva2VuKG5vZGUuc3Rhcik7CisgICAgc3BhY2UoKTsKKyAgICB2aXNpdChub2RlLmV4cHJlc3Npb24pOworICAgIHRva2VuKG5vZGUuc2VtaWNvbG9uKTsKKyAgfQorCiAgIC8vLyBTYWZlbHkgdmlzaXQgdGhlIGdpdmVuIFtub2RlXS4KICAgdmlzaXQoQXN0Tm9kZSBub2RlKSB7CiAgICAgaWYgKG5vZGUgIT0gbnVsbCkgewpAQCAtMTU3Myw2ICsxNjMzLDEyIEBACiAgICAgZW1pdEVtcHR5U3BhY2VzID0gdHJ1ZTsKICAgfQogCisgIC8vLyBFbWl0IGxldmVsIHNwYWNlcywgZXZlbiBpZiBlbXB0eSAod29ya3MgYXMgYSBicmVhayBwb2ludCkuCisgIGxldmVsU3BhY2UoaW50IHdlaWdodCwgW2ludCBuID0gMV0pIHsKKyAgICBzcGFjZShuOiBuLCBicmVha1dlaWdodDogd2VpZ2h0KTsKKyAgICBlbWl0RW1wdHlTcGFjZXMgPSB0cnVlOworICB9CisKICAgLy8vIEVtaXQgYSBub24tYnJlYWthYmxlIHNwYWNlLgogICBub25CcmVha2luZ1NwYWNlKCkgewogICAgIHNwYWNlKGJyZWFrV2VpZ2h0OiBVTkJSRUFLQUJMRV9TUEFDRV9XRUlHSFQpOwpAQCAtMTU4Myw3ICsxNjQ5LDcgQEAKICAgLy8vIGluZGVudC1sZXZlbCksIG90aGVyd2lzZSBsaW5lLWxlYWRpbmcgc3BhY2VzIHdpbGwgYmUgaWdub3JlZC4KICAgc3BhY2Uoe246IDEsIGFsbG93TGluZUxlYWRpbmc6IGZhbHNlLCBicmVha1dlaWdodDogREVGQVVMVF9TUEFDRV9XRUlHSFR9KSB7CiAgICAgLy9UT0RPKHBxdWl0c2x1bmQpOiByZXBsYWNlIHdpdGggYSBwcm9wZXIgc3BhY2UgdG9rZW4KLSAgICBsZWFkaW5nU3BhY2VzKz1uOworICAgIGxlYWRpbmdTcGFjZXMgKz0gbjsKICAgICBhbGxvd0xpbmVMZWFkaW5nU3BhY2VzID0gYWxsb3dMaW5lTGVhZGluZzsKICAgICBjdXJyZW50QnJlYWtXZWlnaHQgPSBicmVha1dlaWdodDsKICAgfQpAQCAtMTc4Miw1ICsxODQ4LDQgQEAKICAgfQogCiAgIFN0cmluZyB0b1N0cmluZygpID0+IHdyaXRlci50b1N0cmluZygpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL2xpYi9zcmMvc2VydmljZXMvd3JpdGVyLmRhcnQgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zZXJ2aWNlcy93cml0ZXIuZGFydAppbmRleCBjZjBkZDc0Li5mNDQ0M2NkIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zZXJ2aWNlcy93cml0ZXIuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvbGliL3NyYy9zZXJ2aWNlcy93cml0ZXIuZGFydApAQCAtNCw3ICs0LDcgQEAKIAogbGlicmFyeSBzb3VyY2Vfd3JpdGVyOwogCi0KK2ltcG9ydCAnZGFydDptYXRoJyBhcyBtYXRoOwogCiBjbGFzcyBMaW5lIHsKIApAQCAtODQsNjMgKzg0LDgyIEBACiAgICAgdmFyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKICAgICB2YXIgY2h1bmtzID0gYnJlYWtMaW5lKGxpbmUpOwogICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgKytpKSB7CisgICAgICB2YXIgY2h1bmsgPSBjaHVua3NbaV07CiAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgYnVmLndyaXRlKGluZGVudChjaHVua3NbaV0sIGxpbmUuaW5kZW50TGV2ZWwpKTsKKyAgICAgICAgYnVmLndyaXRlKGluZGVudChjaHVuaywgY2h1bmsuaW5kZW50KSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBidWYud3JpdGUoY2h1bmtzW2ldKTsKKyAgICAgICAgYnVmLndyaXRlKGNodW5rKTsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOwogICB9CiAKLSAgU3RyaW5nIGluZGVudChDaHVuayBjaHVuaywgaW50IGxldmVsKSA9PgotICAgICAgJ1xuJyArIGluZGVudGVyKGxldmVsICsgMikgKyBjaHVuay50b1N0cmluZygpOworICBTdHJpbmcgaW5kZW50KENodW5rIGNodW5rLCBpbnQgbGV2ZWwpIHsKKyAgICByZXR1cm4gJ1xuJyArIGluZGVudGVyKGxldmVsKSArIGNodW5rLnRvU3RyaW5nKCk7CisgIH0KIAogICBMaXN0PENodW5rPiBicmVha0xpbmUoTGluZSBsaW5lKSB7Ci0KLSAgICB2YXIgdG9rZW5zID0gcHJlcHJvY2VzcyhsaW5lLnRva2Vucyk7Ci0KLSAgICB2YXIgY2h1bmtzID0gPENodW5rPltdOwotCi0gICAgLy8gVGhlIGN1cnJlbnQgdW5icm9rZW4gbGluZQotICAgIHZhciBjdXJyZW50ID0gbmV3IENodW5rKG1heExlbmd0aDogbWF4TGVuZ3RoKTsKLQotICAgIC8vIEEgdGVudGF0aXZlIHdvcmtpbmcgY2h1bmsgdGhhdCB3aWxsIGVpdGhlciBzdGFydCBhIG5ldyBsaW5lIG9yIGdldAotICAgIC8vIGFic29yYmVkIGludG8gJ2N1cnJlbnQnCi0gICAgdmFyIHdvcmsgPSBuZXcgQ2h1bmsobWF4TGVuZ3RoOiBtYXhMZW5ndGgpOwotCi0gICAgdG9rZW5zLmZvckVhY2goKHRvaykgewotCi0gICAgICBpZiAoZ29vZFN0YXJ0KHRvaywgd29yaykpIHsKLSAgICAgICAgaWYgKGN1cnJlbnQuZml0cyh3b3JrKSkgewotICAgICAgICAgIGN1cnJlbnQuYWRkKHdvcmspOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChjdXJyZW50Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGNodW5rcy5hZGQoY3VycmVudCk7CisgICAgTGlzdDxMaW5lVG9rZW4+IHRva2VucyA9IHByZXByb2Nlc3MobGluZS50b2tlbnMpOworICAgIExpc3Q8Q2h1bms+IGNodW5rcyA9IDxDaHVuaz5bbmV3IENodW5rKGxpbmUuaW5kZW50TGV2ZWwsIG1heExlbmd0aCwgdG9rZW5zKV07CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIExpc3Q8Q2h1bms+IG5ld0NodW5rcyA9IDxDaHVuaz5bXTsKKyAgICAgIGJvb2wgaGFzQ2hhbmdlcyA9IGZhbHNlOworICAgICAgZm9yIChDaHVuayBjaHVuayBpbiBjaHVua3MpIHsKKyAgICAgICAgdG9rZW5zID0gY2h1bmsudG9rZW5zOworICAgICAgICBpZiAoY2h1bmsubGVuZ3RoID4gbWF4TGVuZ3RoKSB7CisgICAgICAgICAgaWYgKGNodW5rLmhhc0FueVNwYWNlKCkpIHsKKyAgICAgICAgICAgIGludCB3ZWlnaHQgPSBjaHVuay5maW5kTWluU3BhY2VXZWlnaHQoKTsKKyAgICAgICAgICAgIGludCBuZXdJbmRlbnQgPSBjaHVuay5pbmRlbnQ7CisgICAgICAgICAgICBpZiAod2VpZ2h0ID09IERFRkFVTFRfU1BBQ0VfV0VJR0hUKSB7CisgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgICAgIGludCBsZW5ndGggPSAwOworICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIExpbmVUb2tlbiB0b2tlbiA9IHRva2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4gaXMgU3BhY2VUb2tlbiAmJiB0b2tlbi5icmVha1dlaWdodCA9PSB3ZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgJiYgaSA8IHRva2Vucy5sZW5ndGggLSAxKSB7CisgICAgICAgICAgICAgICAgICBMaW5lVG9rZW4gbmV4dFRva2VuID0gdG9rZW5zW2kgKyAxXTsKKyAgICAgICAgICAgICAgICAgIGlmIChsZW5ndGggKyB0b2tlbi5sZW5ndGggKyBuZXh0VG9rZW4ubGVuZ3RoID4gbWF4TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0NodW5rcy5hZGQoY2h1bmsuc3ViQ2h1bmsobmV3SW5kZW50LCBzdGFydCwgaSkpOworICAgICAgICAgICAgICAgICAgICBuZXdJbmRlbnQgPSBjaHVuay5pbmRlbnQgKyAyOworICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHRva2VuLmxlbmd0aDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoc3RhcnQgPCB0b2tlbnMubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgbmV3Q2h1bmtzLmFkZChjaHVuay5zdWJDaHVuayhuZXdJbmRlbnQsIHN0YXJ0KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIExpc3Q8TGluZVRva2VuPiBwYXJ0ID0gW107CisgICAgICAgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgTGluZVRva2VuIHRva2VuID0gdG9rZW5zW2ldOworICAgICAgICAgICAgICAgIGlmICh0b2tlbiBpcyBTcGFjZVRva2VuICYmIHRva2VuLmJyZWFrV2VpZ2h0ID09IHdlaWdodCkgeworICAgICAgICAgICAgICAgICAgbmV3Q2h1bmtzLmFkZChjaHVuay5zdWJDaHVuayhuZXdJbmRlbnQsIHN0YXJ0LCBpKSk7CisgICAgICAgICAgICAgICAgICBuZXdJbmRlbnQgPSBjaHVuay5pbmRlbnQgKyAyOworICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgdG9rZW5zLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIG5ld0NodW5rcy5hZGQoY2h1bmsuc3ViQ2h1bmsobmV3SW5kZW50LCBzdGFydCkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0NodW5rcy5hZGQoY2h1bmspOwogICAgICAgICAgIH0KLSAgICAgICAgICBjdXJyZW50ID0gd29yazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuZXdDaHVua3MuYWRkKGNodW5rKTsKICAgICAgICAgfQotICAgICAgICB3b3JrID0gbmV3IENodW5rKHN0YXJ0OiB0b2ssIG1heExlbmd0aDogbWF4TGVuZ3RoIC0gY3VycmVudC5sZW5ndGgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHdvcmsuZml0cyh0b2spKSB7Ci0gICAgICAgICAgd29yay5hZGQodG9rKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoIWlzQWxsV2hpdGVzcGFjZSh3b3JrKSB8fCBpc0xpbmVTdGFydChjdXJyZW50KSkgewotICAgICAgICAgICAgY3VycmVudC5hZGQod29yayk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50Lmxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIGNodW5rcy5hZGQoY3VycmVudCk7Ci0gICAgICAgICAgICBjdXJyZW50ID0gbmV3IENodW5rKG1heExlbmd0aDogbWF4TGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd29yayA9IG5ldyBDaHVuayhtYXhMZW5ndGg6IG1heExlbmd0aCk7Ci0gICAgICAgICAgd29yay5hZGQodG9rKTsKKyAgICAgICAgaWYgKG5ld0NodW5rcy5sZW5ndGggPiBjaHVua3MubGVuZ3RoKSB7CisgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7CiAgICAgICAgIH0KICAgICAgIH0KLQotICAgIH0pOwotCi0gICAgY3VycmVudC5hZGQod29yayk7Ci0gICAgaWYgKGN1cnJlbnQubGVuZ3RoID4gMCkgewotICAgICAgY2h1bmtzLmFkZChjdXJyZW50KTsKKyAgICAgIGlmICghaGFzQ2hhbmdlcykgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNodW5rcyA9IG5ld0NodW5rczsKICAgICB9CiAgICAgcmV0dXJuIGNodW5rczsKICAgfQpAQCAtMTUwLDcgKzE2OSw3IEBACiAgICAgdmFyIHRva2VucyA9IDxMaW5lVG9rZW4+W107CiAgICAgdmFyIGN1cnI7CiAKLSAgICB0b2suZm9yRWFjaCgodG9rZW4peworICAgIHRvay5mb3JFYWNoKCh0b2tlbikgewogICAgICAgaWYgKHRva2VuIGlzISBTcGFjZVRva2VuKSB7CiAgICAgICAgIGlmIChjdXJyID09IG51bGwpIHsKICAgICAgICAgICBjdXJyID0gdG9rZW47CkBAIC0xODIsMTUgKzIwMSw2IEBACiAKICAgc3RhdGljIExpbmVUb2tlbiBtZXJnZShMaW5lVG9rZW4gZmlyc3QsIExpbmVUb2tlbiBzZWNvbmQpID0+CiAgICAgICBuZXcgTGluZVRva2VuKGZpcnN0LnZhbHVlICsgc2Vjb25kLnZhbHVlKTsKLQotICBib29sIGlzQWxsV2hpdGVzcGFjZShDaHVuayBjaHVuaykgPT4gaXNXaGl0ZXNwYWNlKGNodW5rLmJ1ZmZlci50b1N0cmluZygpKTsKLQotICBib29sIGlzTGluZVN0YXJ0KGNodW5rKSA9PiBjaHVuay5sZW5ndGggPT0gMCAmJiBjaHVuay5zdGFydCA9PSBMSU5FX1NUQVJUOwotCi0gIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyB0b2tlbiBpcyBhIGdvb2Qgc3RhcnQgZm9yIGEgbmV3IHdvcmtpbmcgY2h1bmsKLSAgYm9vbCBnb29kU3RhcnQoTGluZVRva2VuIHRvaywgQ2h1bmsgd29ya2luZ0NodW5rKSA9PgotICAgICAgdG9rIGlzIFNwYWNlVG9rZW4gJiYgdG9rLmJyZWFrV2VpZ2h0ID49IHdvcmtpbmdDaHVuay5zdGFydC5icmVha1dlaWdodDsKLQogfQogCiAvLy8gVGVzdCBpZiB0aGlzIFtzdHJpbmddIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzCkBAIC0yMDAsOCArMjEwLDggQEAKIC8vLyBTcGVjaWFsIHRva2VuIGluZGljYXRpbmcgYSBsaW5lIHN0YXJ0CiBmaW5hbCBMSU5FX1NUQVJUID0gbmV3IFNwYWNlVG9rZW4oMCk7CiAKLWNvbnN0IERFRkFVTFRfU1BBQ0VfV0VJR0hUID0gMDsKLWNvbnN0IFVOQlJFQUtBQkxFX1NQQUNFX1dFSUdIVCA9IC0xOworY29uc3QgREVGQVVMVF9TUEFDRV9XRUlHSFQgPSBVTkJSRUFLQUJMRV9TUEFDRV9XRUlHSFQgLSAxOworY29uc3QgVU5CUkVBS0FCTEVfU1BBQ0VfV0VJR0hUID0gMTAwMDAwMDAwOwogCiAvLy8gU2ltcGxlIG5vbi1icmVha2luZyBwcmludGVyCiBjbGFzcyBTaW1wbGVMaW5lUHJpbnRlciBleHRlbmRzIExpbmVQcmludGVyIHsKQEAgLTIyMCwzOCArMjMwLDQ5IEBACiAvLy8gRGVzY3JpYmVzIGEgcGllY2Ugb2YgdGV4dCBpbiBhIFtMaW5lXS4KIGFic3RyYWN0IGNsYXNzIExpbmVUZXh0IHsKICAgaW50IGdldCBsZW5ndGg7Ci0gIHZvaWQgYWRkVG8oQ2h1bmsgY2h1bmspOwogfQogCiAKIC8vLyBBIHdvcmtpbmcgcGllY2Ugb2YgdGV4dCB1c2VkIGluIGNhbGN1bGF0aW5nIGxpbmUgYnJlYWtzCi1jbGFzcyBDaHVuayBpbXBsZW1lbnRzIExpbmVUZXh0IHsKK2NsYXNzIENodW5rIHsKKyAgZmluYWwgaW50IGluZGVudDsKKyAgZmluYWwgaW50IG1heExlbmd0aDsKKyAgZmluYWwgTGlzdDxMaW5lVG9rZW4+IHRva2VucyA9IDxMaW5lVG9rZW4+W107CiAKLSAgZmluYWwgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgQ2h1bmsodGhpcy5pbmRlbnQsIHRoaXMubWF4TGVuZ3RoLCBbTGlzdDxMaW5lVG9rZW4+IHRva2Vuc10pIHsKKyAgICB0aGlzLnRva2Vucy5hZGRBbGwodG9rZW5zKTsKKyAgfQogCi0gIGludCBtYXhMZW5ndGg7Ci0gIFNwYWNlVG9rZW4gc3RhcnQ7CisgIGludCBnZXQgbGVuZ3RoID0+IHRva2Vucy5mb2xkKDAsIChsZW4sIHRva2VuKSA9PiBsZW4gKyB0b2tlbi5sZW5ndGgpOwogCi0gIENodW5rKHt0aGlzLnN0YXJ0LCB0aGlzLm1heExlbmd0aH0pIHsKLSAgICBpZiAoc3RhcnQgPT0gbnVsbCkgewotICAgICAgc3RhcnQgPSBMSU5FX1NUQVJUOworICBib29sIGZpdHMoTGluZVRva2VuIGEsIExpbmVUb2tlbiBiKSB7CisgICAgcmV0dXJuIGxlbmd0aCArIGEubGVuZ3RoICsgYS5sZW5ndGggPD0gbWF4TGVuZ3RoOworICB9CisKKyAgdm9pZCBhZGQoTGluZVRva2VuIHRva2VuKSB7CisgICAgdG9rZW5zLmFkZCh0b2tlbik7CisgIH0KKworICBib29sIGhhc0FueVNwYWNlKCkgeworICAgIHJldHVybiB0b2tlbnMuYW55KCh0b2tlbikgPT4gdG9rZW4gaXMgU3BhY2VUb2tlbik7CisgIH0KKworICBpbnQgZmluZE1pblNwYWNlV2VpZ2h0KCkgeworICAgIGludCBtaW5XZWlnaHQgPSBVTkJSRUFLQUJMRV9TUEFDRV9XRUlHSFQ7CisgICAgZm9yICh2YXIgdG9rZW4gaW4gdG9rZW5zKSB7CisgICAgICBpZiAodG9rZW4gaXMgU3BhY2VUb2tlbikgeworICAgICAgICBtaW5XZWlnaHQgPSBtYXRoLm1pbihtaW5XZWlnaHQsIHRva2VuLmJyZWFrV2VpZ2h0KTsKKyAgICAgIH0KICAgICB9CisgICAgcmV0dXJuIG1pbldlaWdodDsKICAgfQogCi0gIGJvb2wgZml0cyhMaW5lVGV4dCB0ZXh0KSA9PiBsZW5ndGggKyB0ZXh0Lmxlbmd0aCA8PSBtYXhMZW5ndGg7Ci0KLSAgaW50IGdldCBsZW5ndGggPT4gc3RhcnQudmFsdWUubGVuZ3RoICsgYnVmZmVyLmxlbmd0aDsKLQotICB2b2lkIGFkZChMaW5lVGV4dCB0ZXh0KSB7Ci0gICAgdGV4dC5hZGRUbyh0aGlzKTsKKyAgQ2h1bmsgc3ViQ2h1bmsoaW50IGluZGVudExldmVsLCBpbnQgc3RhcnQsIFtpbnQgZW5kXSkgeworICAgIExpc3Q8TGluZVRva2VuPiBzdWJUb2tlbnMgPSB0b2tlbnMuc3VibGlzdChzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gbmV3IENodW5rKGluZGVudExldmVsLCBtYXhMZW5ndGgsIHN1YlRva2Vucyk7CiAgIH0KIAotICBTdHJpbmcgdG9TdHJpbmcoKSA9PiBidWZmZXIudG9TdHJpbmcoKTsKLQotICB2b2lkIGFkZFRvKENodW5rIGNodW5rKSB7Ci0gICAgY2h1bmsuYnVmZmVyLndyaXRlKHN0YXJ0LnZhbHVlKTsKLSAgICBjaHVuay5idWZmZXIud3JpdGUoYnVmZmVyLnRvU3RyaW5nKCkpOwotICB9CisgIFN0cmluZyB0b1N0cmluZygpID0+IHRva2Vucy5qb2luKCk7CiB9CiAKIApAQCAtMjY1LDEwICsyODYsNiBAQAogCiAgIGludCBnZXQgbGVuZ3RoID0+IGxlbmd0aExlc3NOZXdsaW5lcyh2YWx1ZSk7CiAKLSAgdm9pZCBhZGRUbyhDaHVuayBjaHVuaykgewotICAgIGNodW5rLmJ1ZmZlci53cml0ZSh2YWx1ZSk7Ci0gIH0KLQogICBpbnQgbGVuZ3RoTGVzc05ld2xpbmVzKFN0cmluZyBzdHIpID0+CiAgICAgICBzdHIuZW5kc1dpdGgoJ1xuJykgPyBzdHIubGVuZ3RoIC0gMSA6IHN0ci5sZW5ndGg7CiAKZGlmZiAtLWdpdCBhL3BrZy9hbmFseXplci9wdWJzcGVjLnlhbWwgYi9wa2cvYW5hbHl6ZXIvcHVic3BlYy55YW1sCmluZGV4IGVhYmQzODguLjM4NmQ0MTUgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci9wdWJzcGVjLnlhbWwKKysrIGIvcGtnL2FuYWx5emVyL3B1YnNwZWMueWFtbApAQCAtMSw1ICsxLDUgQEAKIG5hbWU6IGFuYWx5emVyCi12ZXJzaW9uOiAwLjIxLjAKK3ZlcnNpb246IDAuMjEuMQogYXV0aG9yOiBEYXJ0IFRlYW0gPG1pc2NAZGFydGxhbmcub3JnPgogZGVzY3JpcHRpb246IFN0YXRpYyBhbmFseXplciBmb3IgRGFydC4KIGhvbWVwYWdlOiBodHRwOi8vd3d3LmRhcnRsYW5nLm9yZwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2FzdF90ZXN0LmRhcnQgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvYXN0X3Rlc3QuZGFydAppbmRleCBmYzQ1MzFiNi4uNjhmZTFjYiAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2FzdF90ZXN0LmRhcnQKKysrIGIvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL2FzdF90ZXN0LmRhcnQKQEAgLTE2NDgsNiArMTY0OCwxMCBAQAogICAgIF9hc3NlcnRTb3VyY2UoImEgPSBiIiwgQXN0RmFjdG9yeS5hc3NpZ25tZW50RXhwcmVzc2lvbihBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJhIiksIFRva2VuVHlwZS5FUSwgQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiYiIpKSk7CiAgIH0KIAorICB2b2lkIHRlc3RfdmlzaXRBd2FpdEV4cHJlc3Npb24oKSB7CisgICAgX2Fzc2VydFNvdXJjZSgiYXdhaXQgZTsiLCBBc3RGYWN0b3J5LmF3YWl0RXhwcmVzc2lvbihBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJlIikpKTsKKyAgfQorCiAgIHZvaWQgdGVzdF92aXNpdEJpbmFyeUV4cHJlc3Npb24oKSB7CiAgICAgX2Fzc2VydFNvdXJjZSgiYSArIGIiLCBBc3RGYWN0b3J5LmJpbmFyeUV4cHJlc3Npb24oQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiYSIpLCBUb2tlblR5cGUuUExVUywgQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiYiIpKSk7CiAgIH0KQEAgLTE2NjAsMTAgKzE2NjQsMjYgQEAKICAgICBfYXNzZXJ0U291cmNlKCJ7YnJlYWs7IGJyZWFrO30iLCBBc3RGYWN0b3J5LmJsb2NrKFtBc3RGYWN0b3J5LmJyZWFrU3RhdGVtZW50KCksIEFzdEZhY3RvcnkuYnJlYWtTdGF0ZW1lbnQoKV0pKTsKICAgfQogCi0gIHZvaWQgdGVzdF92aXNpdEJsb2NrRnVuY3Rpb25Cb2R5KCkgeworICB2b2lkIHRlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keV9hc3luYygpIHsKKyAgICBfYXNzZXJ0U291cmNlKCJhc3luYyB7fSIsIEFzdEZhY3RvcnkuYXN5bmNCbG9ja0Z1bmN0aW9uQm9keShbXSkpOworICB9CisKKyAgdm9pZCB0ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfYXN5bmNfc3RhcigpIHsKKyAgICBfYXNzZXJ0U291cmNlKCJhc3luYyoge30iLCBBc3RGYWN0b3J5LmFzeW5jR2VuZXJhdG9yQmxvY2tGdW5jdGlvbkJvZHkoW10pKTsKKyAgfQorCisgIHZvaWQgdGVzdF92aXNpdEJsb2NrRnVuY3Rpb25Cb2R5X3NpbXBsZSgpIHsKICAgICBfYXNzZXJ0U291cmNlKCJ7fSIsIEFzdEZhY3RvcnkuYmxvY2tGdW5jdGlvbkJvZHkyKFtdKSk7CiAgIH0KIAorICB2b2lkIHRlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keV9zeW5jKCkgeworICAgIF9hc3NlcnRTb3VyY2UoInN5bmMge30iLCBBc3RGYWN0b3J5LnN5bmNCbG9ja0Z1bmN0aW9uQm9keShbXSkpOworICB9CisKKyAgdm9pZCB0ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfc3luY19zdGFyKCkgeworICAgIF9hc3NlcnRTb3VyY2UoInN5bmMqIHt9IiwgQXN0RmFjdG9yeS5zeW5jR2VuZXJhdG9yQmxvY2tGdW5jdGlvbkJvZHkoW10pKTsKKyAgfQorCiAgIHZvaWQgdGVzdF92aXNpdEJvb2xlYW5MaXRlcmFsX2ZhbHNlKCkgewogICAgIF9hc3NlcnRTb3VyY2UoImZhbHNlIiwgQXN0RmFjdG9yeS5ib29sZWFuTGl0ZXJhbChmYWxzZSkpOwogICB9CkBAIC0xOTgyLDcgKzIwMDIsMTEgQEAKICAgICBfYXNzZXJ0U291cmNlKCJAZGVwcmVjYXRlZCBleHBvcnQgJ2EuZGFydCc7IiwgZGlyZWN0aXZlKTsKICAgfQogCi0gIHZvaWQgdGVzdF92aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHkoKSB7CisgIHZvaWQgdGVzdF92aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHlfYXN5bmMoKSB7CisgICAgX2Fzc2VydFNvdXJjZSgiYXN5bmMgPT4gYTsiLCBBc3RGYWN0b3J5LmFzeW5jRXhwcmVzc2lvbkZ1bmN0aW9uQm9keShBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJhIikpKTsKKyAgfQorCisgIHZvaWQgdGVzdF92aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHlfc2ltcGxlKCkgewogICAgIF9hc3NlcnRTb3VyY2UoIj0+IGE7IiwgQXN0RmFjdG9yeS5leHByZXNzaW9uRnVuY3Rpb25Cb2R5KEFzdEZhY3RvcnkuaWRlbnRpZmllcjMoImEiKSkpOwogICB9CiAKQEAgLTIwMjksNyArMjA1MywxMSBAQAogICB9CiAKICAgdm9pZCB0ZXN0X3Zpc2l0Rm9yRWFjaFN0YXRlbWVudF92YXJpYWJsZSgpIHsKLSAgICBfYXNzZXJ0U291cmNlKCJmb3IgKGEgaW4gYikge30iLCBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRk9SKSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fUEFSRU4pLCBBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJhIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuSU4pLCBBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJiIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5DTE9TRV9QQVJFTiksIEFzdEZhY3RvcnkuYmxvY2soW10pKSk7CisgICAgX2Fzc2VydFNvdXJjZSgiZm9yIChhIGluIGIpIHt9IiwgbmV3IEZvckVhY2hTdGF0ZW1lbnQuY29uMihudWxsLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkLkZPUiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5PUEVOX1BBUkVOKSwgQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiYSIpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tS2V5d29yZChLZXl3b3JkLklOKSwgQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiYiIpLCBUb2tlbkZhY3RvcnkudG9rZW5Gcm9tVHlwZShUb2tlblR5cGUuQ0xPU0VfUEFSRU4pLCBBc3RGYWN0b3J5LmJsb2NrKFtdKSkpOworICB9CisKKyAgdm9pZCB0ZXN0X3Zpc2l0Rm9yRWFjaFN0YXRlbWVudF92YXJpYWJsZV9hd2FpdCgpIHsKKyAgICBfYXNzZXJ0U291cmNlKCJhd2FpdCBmb3IgKGEgaW4gYikge30iLCBuZXcgRm9yRWFjaFN0YXRlbWVudC5jb24yKFRva2VuRmFjdG9yeS50b2tlbkZyb21TdHJpbmcoImF3YWl0IiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuRk9SKSwgVG9rZW5GYWN0b3J5LnRva2VuRnJvbVR5cGUoVG9rZW5UeXBlLk9QRU5fUEFSRU4pLCBBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJhIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21LZXl3b3JkKEtleXdvcmQuSU4pLCBBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJiIiksIFRva2VuRmFjdG9yeS50b2tlbkZyb21UeXBlKFRva2VuVHlwZS5DTE9TRV9QQVJFTiksIEFzdEZhY3RvcnkuYmxvY2soW10pKSk7CiAgIH0KIAogICB2b2lkIHRlc3RfdmlzaXRGb3JtYWxQYXJhbWV0ZXJMaXN0X2VtcHR5KCkgewpAQCAtMjc5MCw2ICsyODE4LDE0IEBACiAgICAgX2Fzc2VydFNvdXJjZSgid2l0aCBBIiwgQXN0RmFjdG9yeS53aXRoQ2xhdXNlKFtBc3RGYWN0b3J5LnR5cGVOYW1lNCgiQSIsIFtdKV0pKTsKICAgfQogCisgIHZvaWQgdGVzdF92aXNpdFlpZWxkU3RhdGVtZW50KCkgeworICAgIF9hc3NlcnRTb3VyY2UoInlpZWxkIGU7IiwgQXN0RmFjdG9yeS55aWVsZFN0YXRlbWVudChBc3RGYWN0b3J5LmlkZW50aWZpZXIzKCJlIikpKTsKKyAgfQorCisgIHZvaWQgdGVzdF92aXNpdFlpZWxkU3RhdGVtZW50X2VhY2goKSB7CisgICAgX2Fzc2VydFNvdXJjZSgieWllbGQqIGU7IiwgQXN0RmFjdG9yeS55aWVsZEVhY2hTdGF0ZW1lbnQoQXN0RmFjdG9yeS5pZGVudGlmaWVyMygiZSIpKSk7CisgIH0KKwogICAvKioKICAgICogQXNzZXJ0IHRoYXQgYSBgVG9Tb3VyY2VWaXNpdG9yYCB3aWxsIHByb2R1Y2UgdGhlIGV4cGVjdGVkIHNvdXJjZSB3aGVuIHZpc2l0aW5nIHRoZSBnaXZlbgogICAgKiBub2RlLgpAQCAtMjgzNCwxMyArMjg3MCwzMyBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEFzc2lnbm1lbnRFeHByZXNzaW9uKTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRBd2FpdEV4cHJlc3Npb24nLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0QXdhaXRFeHByZXNzaW9uKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRCaW5hcnlFeHByZXNzaW9uJywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEJpbmFyeUV4cHJlc3Npb24pOwogICAgICAgfSk7Ci0gICAgICBfdXQudGVzdCgndGVzdF92aXNpdEJsb2NrRnVuY3Rpb25Cb2R5JywgKCkgeworICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keV9hc3luYycsICgpIHsKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKLSAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keSk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfYXN5bmMpOworICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF92aXNpdEJsb2NrRnVuY3Rpb25Cb2R5X2FzeW5jX3N0YXInLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfYXN5bmNfc3Rhcik7CisgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfc2ltcGxlJywgKCkgeworICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEJsb2NrRnVuY3Rpb25Cb2R5X3NpbXBsZSk7CisgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfc3luYycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keV9zeW5jKTsKKyAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRCbG9ja0Z1bmN0aW9uQm9keV9zeW5jX3N0YXInLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0QmxvY2tGdW5jdGlvbkJvZHlfc3luY19zdGFyKTsKICAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRCbG9ja19lbXB0eScsICgpIHsKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKQEAgLTMxNDYsOSArMzIwMiwxMyBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEV4cG9ydERpcmVjdGl2ZV93aXRoTWV0YWRhdGEpOwogICAgICAgfSk7Ci0gICAgICBfdXQudGVzdCgndGVzdF92aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHknLCAoKSB7CisgICAgICBfdXQudGVzdCgndGVzdF92aXNpdEV4cHJlc3Npb25GdW5jdGlvbkJvZHlfYXN5bmMnLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7Ci0gICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keSk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keV9hc3luYyk7CisgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X3Zpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keV9zaW1wbGUnLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3Zpc2l0RXhwcmVzc2lvbkZ1bmN0aW9uQm9keV9zaW1wbGUpOwogICAgICAgfSk7CiAgICAgICBfdXQudGVzdCgndGVzdF92aXNpdEV4cHJlc3Npb25TdGF0ZW1lbnQnLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBUb1NvdXJjZVZpc2l0b3JUZXN0KCk7CkBAIC0zMTk0LDYgKzMyNTQsMTAgQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKICAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfdmlzaXRGb3JFYWNoU3RhdGVtZW50X3ZhcmlhYmxlKTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRGb3JFYWNoU3RhdGVtZW50X3ZhcmlhYmxlX2F3YWl0JywgKCkgeworICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEZvckVhY2hTdGF0ZW1lbnRfdmFyaWFibGVfYXdhaXQpOworICAgICAgfSk7CiAgICAgICBfdXQudGVzdCgndGVzdF92aXNpdEZvclN0YXRlbWVudF9jJywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdEZvclN0YXRlbWVudF9jKTsKQEAgLTM4NTgsNiArMzkyMiwxNCBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgVG9Tb3VyY2VWaXNpdG9yVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF92aXNpdFdpdGhDbGF1c2Vfc2luZ2xlKTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfdmlzaXRZaWVsZFN0YXRlbWVudCcsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfdmlzaXRZaWVsZFN0YXRlbWVudCk7CisgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X3Zpc2l0WWllbGRTdGF0ZW1lbnRfZWFjaCcsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFRvU291cmNlVmlzaXRvclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfdmlzaXRZaWVsZFN0YXRlbWVudF9lYWNoKTsKKyAgICAgIH0pOwogICAgIH0pOwogICB9CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcGFyc2VyX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfdGVzdC5kYXJ0CmluZGV4IDNhOWMyYzMuLjgzZTdlYWYgMTAwNjQ0Ci0tLSBhL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9wYXJzZXJfdGVzdC5kYXJ0CkBAIC05MTMsNiArOTEzLDEwIEBACiAgICAgUGFyc2VyVGVzdENhc2UucGFyc2UzKCJwYXJzZUNvbXBpbGF0aW9uVW5pdE1lbWJlciIsIDxPYmplY3Q+IFtlbXB0eUNvbW1lbnRBbmRNZXRhZGF0YSgpXSwgIjQgc2NvcmUiLCBbUGFyc2VyRXJyb3JDb2RlLkVYUEVDVEVEX0VYRUNVVEFCTEVdKTsKICAgfQogCisgIHZvaWQgdGVzdF9leHBlY3RlZEV4ZWN1dGFibGVfdG9wTGV2ZWxfZW9mKCkgeworICAgIFBhcnNlclRlc3RDYXNlLnBhcnNlMigicGFyc2VDb21waWxhdGlvblVuaXRNZW1iZXIiLCA8T2JqZWN0PiBbZW1wdHlDb21tZW50QW5kTWV0YWRhdGEoKV0sICJ4IiwgW25ldyBBbmFseXNpc0Vycm9yLmNvbjIobnVsbCwgMCwgMSwgUGFyc2VyRXJyb3JDb2RlLkVYUEVDVEVEX0VYRUNVVEFCTEUsIFtdKV0pOworICB9CisKICAgdm9pZCB0ZXN0X2V4cGVjdGVkSW50ZXJwb2xhdGlvbklkZW50aWZpZXIoKSB7CiAgICAgUGFyc2VyVGVzdENhc2UucGFyc2U0KCJwYXJzZVN0cmluZ0xpdGVyYWwiLCAiJ1wkeFwkJyIsIFtQYXJzZXJFcnJvckNvZGUuTUlTU0lOR19JREVOVElGSUVSXSk7CiAgIH0KQEAgLTExNDEsNiArMTE0NSwxMCBAQAogICAgIFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VGb3JTdGF0ZW1lbnQiLCAiZm9yIChpbnQgYSA9IDAgaW4gZm9vKSB7fSIsIFtQYXJzZXJFcnJvckNvZGUuSU5JVElBTElaRURfVkFSSUFCTEVfSU5fRk9SX0VBQ0hdKTsKICAgfQogCisgIHZvaWQgdGVzdF9pbnZhbGlkQXdhaXRJbkZvcigpIHsKKyAgICBQYXJzZXJUZXN0Q2FzZS5wYXJzZTQoInBhcnNlRm9yU3RhdGVtZW50IiwgImF3YWl0IGZvciAoOyA7KSB7fSIsIFtQYXJzZXJFcnJvckNvZGUuSU5WQUxJRF9BV0FJVF9JTl9GT1JdKTsKKyAgfQorCiAgIHZvaWQgdGVzdF9pbnZhbGlkQ29kZVBvaW50KCkgewogICAgIFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VTdHJpbmdMaXRlcmFsIiwgIidcXHVEOTAwJyIsIFtQYXJzZXJFcnJvckNvZGUuSU5WQUxJRF9DT0RFX1BPSU5UXSk7CiAgIH0KQEAgLTExNjUsNiArMTE3MywxNCBAQAogICAgIFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VVbmFyeUV4cHJlc3Npb24iLCAiKytzdXBlciIsIFtQYXJzZXJFcnJvckNvZGUuSU5WQUxJRF9PUEVSQVRPUl9GT1JfU1VQRVJdKTsKICAgfQogCisgIHZvaWQgdGVzdF9pbnZhbGlkU3RhckFmdGVyQXN5bmMoKSB7CisgICAgUGFyc2VyVGVzdENhc2UucGFyc2UzKCJwYXJzZUZ1bmN0aW9uQm9keSIsIDxPYmplY3Q+IFtmYWxzZSwgbnVsbCwgZmFsc2VdLCAiYXN5bmMqID0+IDA7IiwgW1BhcnNlckVycm9yQ29kZS5JTlZBTElEX1NUQVJfQUZURVJfQVNZTkNdKTsKKyAgfQorCisgIHZvaWQgdGVzdF9pbnZhbGlkU3luYygpIHsKKyAgICBQYXJzZXJUZXN0Q2FzZS5wYXJzZTMoInBhcnNlRnVuY3Rpb25Cb2R5IiwgPE9iamVjdD4gW2ZhbHNlLCBudWxsLCBmYWxzZV0sICJzeW5jKiA9PiAwOyIsIFtQYXJzZXJFcnJvckNvZGUuSU5WQUxJRF9TWU5DXSk7CisgIH0KKwogICB2b2lkIHRlc3RfaW52YWxpZFVuaWNvZGVFc2NhcGVfaW5jb21wbGV0ZV9ub0RpZ2l0cygpIHsKICAgICBQYXJzZXJUZXN0Q2FzZS5wYXJzZTQoInBhcnNlU3RyaW5nTGl0ZXJhbCIsICInXFx1eyciLCBbUGFyc2VyRXJyb3JDb2RlLklOVkFMSURfVU5JQ09ERV9FU0NBUEVdKTsKICAgfQpAQCAtMTM1NSw2ICsxMzcxLDEwIEBACiAgICAgUGFyc2VyVGVzdENhc2UucGFyc2VDb21waWxhdGlvblVuaXQoImltcG9ydCAnZm9vLmRhcnQnIGRlZmVycmVkOyIsIFtQYXJzZXJFcnJvckNvZGUuTUlTU0lOR19QUkVGSVhfSU5fREVGRVJSRURfSU1QT1JUXSk7CiAgIH0KIAorICB2b2lkIHRlc3RfbWlzc2luZ1N0YXJ0QWZ0ZXJTeW5jKCkgeworICAgIFBhcnNlclRlc3RDYXNlLnBhcnNlMygicGFyc2VGdW5jdGlvbkJvZHkiLCA8T2JqZWN0PiBbZmFsc2UsIG51bGwsIGZhbHNlXSwgInN5bmMge30iLCBbUGFyc2VyRXJyb3JDb2RlLk1JU1NJTkdfU1RBUl9BRlRFUl9TWU5DXSk7CisgIH0KKwogICB2b2lkIHRlc3RfbWlzc2luZ1N0YXRlbWVudCgpIHsKICAgICBQYXJzZXJUZXN0Q2FzZS5wYXJzZVN0YXRlbWVudCgiaXMiLCBbUGFyc2VyRXJyb3JDb2RlLk1JU1NJTkdfU1RBVEVNRU5UXSk7CiAgIH0KQEAgLTE5NDAsNiArMTk2MCwxMCBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgRXJyb3JQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2V4cGVjdGVkRXhlY3V0YWJsZV90b3BMZXZlbF9iZWZvcmVUeXBlKTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfZXhwZWN0ZWRFeGVjdXRhYmxlX3RvcExldmVsX2VvZicsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9leHBlY3RlZEV4ZWN1dGFibGVfdG9wTGV2ZWxfZW9mKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfZXhwZWN0ZWRJbnRlcnBvbGF0aW9uSWRlbnRpZmllcicsICgpIHsKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9leHBlY3RlZEludGVycG9sYXRpb25JZGVudGlmaWVyKTsKQEAgLTIxNDgsNiArMjE3MiwxMCBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgRXJyb3JQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2luaXRpYWxpemVkVmFyaWFibGVJbkZvckVhY2gpOwogICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9pbnZhbGlkQXdhaXRJbkZvcicsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9pbnZhbGlkQXdhaXRJbkZvcik7CisgICAgICB9KTsKICAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRDb2RlUG9pbnQnLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBFcnJvclBhcnNlclRlc3QoKTsKICAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfaW52YWxpZENvZGVQb2ludCk7CkBAIC0yMTcyLDYgKzIyMDAsMTQgQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9pbnZhbGlkT3BlcmF0b3JGb3JTdXBlcik7CiAgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRTdGFyQWZ0ZXJBc3luYycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9pbnZhbGlkU3RhckFmdGVyQXN5bmMpOworICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9pbnZhbGlkU3luYycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9pbnZhbGlkU3luYyk7CisgICAgICB9KTsKICAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRVbmljb2RlRXNjYXBlX2luY29tcGxldGVfbm9EaWdpdHMnLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBFcnJvclBhcnNlclRlc3QoKTsKICAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfaW52YWxpZFVuaWNvZGVFc2NhcGVfaW5jb21wbGV0ZV9ub0RpZ2l0cyk7CkBAIC0yMzUyLDYgKzIzODgsMTAgQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9taXNzaW5nUHJlZml4SW5EZWZlcnJlZEltcG9ydCk7CiAgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X21pc3NpbmdTdGFydEFmdGVyU3luYycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IEVycm9yUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9taXNzaW5nU3RhcnRBZnRlclN5bmMpOworICAgICAgfSk7CiAgICAgICBfdXQudGVzdCgndGVzdF9taXNzaW5nU3RhdGVtZW50JywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgRXJyb3JQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X21pc3NpbmdTdGF0ZW1lbnQpOwpAQCAtMzI5Niw2ICszMzM2LDcgQEAKICAgICBQYXJzZXIgcGFyc2VyID0gbmV3IFBhcnNlcihudWxsLCBsaXN0ZW5lcik7CiAgICAgcGFyc2VyLnBhcnNlRnVuY3Rpb25Cb2RpZXMgPSBwYXJzZUZ1bmN0aW9uQm9kaWVzOwogICAgIHBhcnNlci5wYXJzZURlZmVycmVkTGlicmFyaWVzID0gdHJ1ZTsKKyAgICBwYXJzZXIucGFyc2VBc3luYyA9IHRydWU7CiAgICAgT2JqZWN0IHJlc3VsdCA9IGludm9rZVBhcnNlck1ldGhvZEltcGwocGFyc2VyLCBtZXRob2ROYW1lLCBvYmplY3RzLCB0b2tlblN0cmVhbSk7CiAgICAgLy8KICAgICAvLyBQYXJ0aWFsbHkgdGVzdCB0aGUgcmVzdWx0cy4KQEAgLTU1NTUsNiArNTU5NiwxMyBAQAogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzZWxlY3Rvcik7CiAgIH0KIAorICB2b2lkIHRlc3RfcGFyc2VBd2FpdEV4cHJlc3Npb24oKSB7CisgICAgQXdhaXRFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBQYXJzZXJUZXN0Q2FzZS5wYXJzZTQoInBhcnNlQXdhaXRFeHByZXNzaW9uIiwgImF3YWl0IHg7IiwgW10pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChleHByZXNzaW9uLmF3YWl0S2V5d29yZCk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGV4cHJlc3Npb24uc2VtaWNvbG9uKTsKKyAgfQorCiAgIHZvaWQgdGVzdF9wYXJzZUJpdHdpc2VBbmRFeHByZXNzaW9uX25vcm1hbCgpIHsKICAgICBCaW5hcnlFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBQYXJzZXJUZXN0Q2FzZS5wYXJzZTQoInBhcnNlQml0d2lzZUFuZEV4cHJlc3Npb24iLCAieCAmIHkiLCBbXSk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGV4cHJlc3Npb24ubGVmdE9wZXJhbmQpOwpAQCAtNzQyOCw4ICs3NDc2LDIyIEBACiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHBhcmFtZXRlckxpc3QucmlnaHRQYXJlbnRoZXNpcyk7CiAgIH0KIAorICB2b2lkIHRlc3RfcGFyc2VGb3JTdGF0ZW1lbnRfZWFjaF9hd2FpdCgpIHsKKyAgICBGb3JFYWNoU3RhdGVtZW50IHN0YXRlbWVudCA9IFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VGb3JTdGF0ZW1lbnQiLCAiYXdhaXQgZm9yIChlbGVtZW50IGluIGxpc3QpIHt9IiwgW10pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQuYXdhaXRLZXl3b3JkKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmZvcktleXdvcmQpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQubGVmdFBhcmVudGhlc2lzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoc3RhdGVtZW50Lmxvb3BWYXJpYWJsZSk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5pZGVudGlmaWVyKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmluS2V5d29yZCk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5pdGVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5yaWdodFBhcmVudGhlc2lzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmJvZHkpOworICB9CisKICAgdm9pZCB0ZXN0X3BhcnNlRm9yU3RhdGVtZW50X2VhY2hfaWRlbnRpZmllcigpIHsKICAgICBGb3JFYWNoU3RhdGVtZW50IHN0YXRlbWVudCA9IFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VGb3JTdGF0ZW1lbnQiLCAiZm9yIChlbGVtZW50IGluIGxpc3QpIHt9IiwgW10pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0TnVsbChzdGF0ZW1lbnQuYXdhaXRLZXl3b3JkKTsKICAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmZvcktleXdvcmQpOwogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQubGVmdFBhcmVudGhlc2lzKTsKICAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoc3RhdGVtZW50Lmxvb3BWYXJpYWJsZSk7CkBAIC03NDQyLDYgKzc1MDQsNyBAQAogCiAgIHZvaWQgdGVzdF9wYXJzZUZvclN0YXRlbWVudF9lYWNoX25vVHlwZV9tZXRhZGF0YSgpIHsKICAgICBGb3JFYWNoU3RhdGVtZW50IHN0YXRlbWVudCA9IFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VGb3JTdGF0ZW1lbnQiLCAiZm9yIChAQSB2YXIgZWxlbWVudCBpbiBsaXN0KSB7fSIsIFtdKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoc3RhdGVtZW50LmF3YWl0S2V5d29yZCk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5mb3JLZXl3b3JkKTsKICAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmxlZnRQYXJlbnRoZXNpcyk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5sb29wVmFyaWFibGUpOwpAQCAtNzQ1NSw2ICs3NTE4LDcgQEAKIAogICB2b2lkIHRlc3RfcGFyc2VGb3JTdGF0ZW1lbnRfZWFjaF90eXBlKCkgewogICAgIEZvckVhY2hTdGF0ZW1lbnQgc3RhdGVtZW50ID0gUGFyc2VyVGVzdENhc2UucGFyc2U0KCJwYXJzZUZvclN0YXRlbWVudCIsICJmb3IgKEEgZWxlbWVudCBpbiBsaXN0KSB7fSIsIFtdKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoc3RhdGVtZW50LmF3YWl0S2V5d29yZCk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5mb3JLZXl3b3JkKTsKICAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LmxlZnRQYXJlbnRoZXNpcyk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5sb29wVmFyaWFibGUpOwpAQCAtNzQ2Nyw2ICs3NTMxLDcgQEAKIAogICB2b2lkIHRlc3RfcGFyc2VGb3JTdGF0ZW1lbnRfZWFjaF92YXIoKSB7CiAgICAgRm9yRWFjaFN0YXRlbWVudCBzdGF0ZW1lbnQgPSBQYXJzZXJUZXN0Q2FzZS5wYXJzZTQoInBhcnNlRm9yU3RhdGVtZW50IiwgImZvciAodmFyIGVsZW1lbnQgaW4gbGlzdCkge30iLCBbXSk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROdWxsKHN0YXRlbWVudC5hd2FpdEtleXdvcmQpOwogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQuZm9yS2V5d29yZCk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5sZWZ0UGFyZW50aGVzaXMpOwogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQubG9vcFZhcmlhYmxlKTsKQEAgLTc2MzMsNyArNzY5OCw0NSBAQAogCiAgIHZvaWQgdGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9jaygpIHsKICAgICBCbG9ja0Z1bmN0aW9uQm9keSBmdW5jdGlvbkJvZHkgPSBQYXJzZXJUZXN0Q2FzZS5wYXJzZSgicGFyc2VGdW5jdGlvbkJvZHkiLCA8T2JqZWN0PiBbZmFsc2UsIG51bGwsIGZhbHNlXSwgInt9Iik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROdWxsKGZ1bmN0aW9uQm9keS5rZXl3b3JkKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoZnVuY3Rpb25Cb2R5LnN0YXIpOwogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkuYmxvY2spOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RmFsc2UoZnVuY3Rpb25Cb2R5LmlzQXN5bmNocm9ub3VzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEZhbHNlKGZ1bmN0aW9uQm9keS5pc0dlbmVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRUcnVlKGZ1bmN0aW9uQm9keS5pc1N5bmNocm9ub3VzKTsKKyAgfQorCisgIHZvaWQgdGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9ja19hc3luYygpIHsKKyAgICBCbG9ja0Z1bmN0aW9uQm9keSBmdW5jdGlvbkJvZHkgPSBQYXJzZXJUZXN0Q2FzZS5wYXJzZSgicGFyc2VGdW5jdGlvbkJvZHkiLCA8T2JqZWN0PiBbZmFsc2UsIG51bGwsIGZhbHNlXSwgImFzeW5jIHt9Iik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGZ1bmN0aW9uQm9keS5rZXl3b3JkKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEVxdWFscyhQYXJzZXIuQVNZTkMsIGZ1bmN0aW9uQm9keS5rZXl3b3JkLmxleGVtZSk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROdWxsKGZ1bmN0aW9uQm9keS5zdGFyKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZnVuY3Rpb25Cb2R5LmJsb2NrKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFRydWUoZnVuY3Rpb25Cb2R5LmlzQXN5bmNocm9ub3VzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEZhbHNlKGZ1bmN0aW9uQm9keS5pc0dlbmVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRGYWxzZShmdW5jdGlvbkJvZHkuaXNTeW5jaHJvbm91cyk7CisgIH0KKworICB2b2lkIHRlc3RfcGFyc2VGdW5jdGlvbkJvZHlfYmxvY2tfYXN5bmNHZW5lcmF0b3IoKSB7CisgICAgQmxvY2tGdW5jdGlvbkJvZHkgZnVuY3Rpb25Cb2R5ID0gUGFyc2VyVGVzdENhc2UucGFyc2UoInBhcnNlRnVuY3Rpb25Cb2R5IiwgPE9iamVjdD4gW2ZhbHNlLCBudWxsLCBmYWxzZV0sICJhc3luYyoge30iKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZnVuY3Rpb25Cb2R5LmtleXdvcmQpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RXF1YWxzKFBhcnNlci5BU1lOQywgZnVuY3Rpb25Cb2R5LmtleXdvcmQubGV4ZW1lKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZnVuY3Rpb25Cb2R5LnN0YXIpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkuYmxvY2spOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0VHJ1ZShmdW5jdGlvbkJvZHkuaXNBc3luY2hyb25vdXMpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0VHJ1ZShmdW5jdGlvbkJvZHkuaXNHZW5lcmF0b3IpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RmFsc2UoZnVuY3Rpb25Cb2R5LmlzU3luY2hyb25vdXMpOworICB9CisKKyAgdm9pZCB0ZXN0X3BhcnNlRnVuY3Rpb25Cb2R5X2Jsb2NrX3N5bmNHZW5lcmF0b3IoKSB7CisgICAgQmxvY2tGdW5jdGlvbkJvZHkgZnVuY3Rpb25Cb2R5ID0gUGFyc2VyVGVzdENhc2UucGFyc2UoInBhcnNlRnVuY3Rpb25Cb2R5IiwgPE9iamVjdD4gW2ZhbHNlLCBudWxsLCBmYWxzZV0sICJzeW5jKiB7fSIpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkua2V5d29yZCk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoUGFyc2VyLlNZTkMsIGZ1bmN0aW9uQm9keS5rZXl3b3JkLmxleGVtZSk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGZ1bmN0aW9uQm9keS5zdGFyKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZnVuY3Rpb25Cb2R5LmJsb2NrKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEZhbHNlKGZ1bmN0aW9uQm9keS5pc0FzeW5jaHJvbm91cyk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRUcnVlKGZ1bmN0aW9uQm9keS5pc0dlbmVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRUcnVlKGZ1bmN0aW9uQm9keS5pc1N5bmNocm9ub3VzKTsKICAgfQogCiAgIHZvaWQgdGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9lbXB0eSgpIHsKQEAgLTc2NDMsOSArNzc0NiwyNSBAQAogCiAgIHZvaWQgdGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9leHByZXNzaW9uKCkgewogICAgIEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgZnVuY3Rpb25Cb2R5ID0gUGFyc2VyVGVzdENhc2UucGFyc2UoInBhcnNlRnVuY3Rpb25Cb2R5IiwgPE9iamVjdD4gW2ZhbHNlLCBudWxsLCBmYWxzZV0sICI9PiB5OyIpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0TnVsbChmdW5jdGlvbkJvZHkua2V5d29yZCk7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGZ1bmN0aW9uQm9keS5mdW5jdGlvbkRlZmluaXRpb24pOwogICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkuZXhwcmVzc2lvbik7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKGZ1bmN0aW9uQm9keS5zZW1pY29sb24pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0RmFsc2UoZnVuY3Rpb25Cb2R5LmlzQXN5bmNocm9ub3VzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEZhbHNlKGZ1bmN0aW9uQm9keS5pc0dlbmVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRUcnVlKGZ1bmN0aW9uQm9keS5pc1N5bmNocm9ub3VzKTsKKyAgfQorCisgIHZvaWQgdGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9leHByZXNzaW9uX2FzeW5jKCkgeworICAgIEV4cHJlc3Npb25GdW5jdGlvbkJvZHkgZnVuY3Rpb25Cb2R5ID0gUGFyc2VyVGVzdENhc2UucGFyc2UoInBhcnNlRnVuY3Rpb25Cb2R5IiwgPE9iamVjdD4gW2ZhbHNlLCBudWxsLCBmYWxzZV0sICJhc3luYyA9PiB5OyIpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkua2V5d29yZCk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRFcXVhbHMoUGFyc2VyLkFTWU5DLCBmdW5jdGlvbkJvZHkua2V5d29yZC5sZXhlbWUpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkuZnVuY3Rpb25EZWZpbml0aW9uKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoZnVuY3Rpb25Cb2R5LmV4cHJlc3Npb24pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChmdW5jdGlvbkJvZHkuc2VtaWNvbG9uKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydFRydWUoZnVuY3Rpb25Cb2R5LmlzQXN5bmNocm9ub3VzKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydEZhbHNlKGZ1bmN0aW9uQm9keS5pc0dlbmVyYXRvcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnRGYWxzZShmdW5jdGlvbkJvZHkuaXNTeW5jaHJvbm91cyk7CiAgIH0KIAogICB2b2lkIHRlc3RfcGFyc2VGdW5jdGlvbkJvZHlfbmF0aXZlRnVuY3Rpb25Cb2R5KCkgewpAQCAtOTQ2Myw2ICs5NTgyLDIyIEBACiAgICAgRW5naW5lVGVzdENhc2UuYXNzZXJ0U2l6ZU9mTGlzdCgxLCBjbGF1c2UubWl4aW5UeXBlcyk7CiAgIH0KIAorICB2b2lkIHRlc3RfcGFyc2VZaWVsZFN0YXRlbWVudF9lYWNoKCkgeworICAgIFlpZWxkU3RhdGVtZW50IHN0YXRlbWVudCA9IFBhcnNlclRlc3RDYXNlLnBhcnNlNCgicGFyc2VZaWVsZFN0YXRlbWVudCIsICJ5aWVsZCogeDsiLCBbXSk7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC55aWVsZEtleXdvcmQpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQuc3Rhcik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5leHByZXNzaW9uKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE5vdE51bGwoc3RhdGVtZW50LnNlbWljb2xvbik7CisgIH0KKworICB2b2lkIHRlc3RfcGFyc2VZaWVsZFN0YXRlbWVudF9ub3JtYWwoKSB7CisgICAgWWllbGRTdGF0ZW1lbnQgc3RhdGVtZW50ID0gUGFyc2VyVGVzdENhc2UucGFyc2U0KCJwYXJzZVlpZWxkU3RhdGVtZW50IiwgInlpZWxkIHg7IiwgW10pOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQueWllbGRLZXl3b3JkKTsKKyAgICBKVW5pdFRlc3RDYXNlLmFzc2VydE51bGwoc3RhdGVtZW50LnN0YXIpOworICAgIEpVbml0VGVzdENhc2UuYXNzZXJ0Tm90TnVsbChzdGF0ZW1lbnQuZXhwcmVzc2lvbik7CisgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROb3ROdWxsKHN0YXRlbWVudC5zZW1pY29sb24pOworICB9CisKICAgdm9pZCB0ZXN0X3NraXBQcmVmaXhlZElkZW50aWZpZXJfaW52YWxpZCgpIHsKICAgICBUb2tlbiBmb2xsb3dpbmcgPSBfc2tpcCgic2tpcFByZWZpeGVkSWRlbnRpZmllciIsICIrIik7CiAgICAgSlVuaXRUZXN0Q2FzZS5hc3NlcnROdWxsKGZvbGxvd2luZyk7CkBAIC0xMDEwOSw2ICsxMDI0NCwxMCBAQAogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUFzc2lnbmFibGVTZWxlY3Rvcl9ub25lKTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VBd2FpdEV4cHJlc3Npb24nLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlQXdhaXRFeHByZXNzaW9uKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VCaXR3aXNlQW5kRXhwcmVzc2lvbl9ub3JtYWwnLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlQml0d2lzZUFuZEV4cHJlc3Npb25fbm9ybWFsKTsKQEAgLTEwODUzLDYgKzEwOTkyLDEwIEBACiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlRmluYWxDb25zdFZhck9yVHlwZV92YXIpOwogICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9wYXJzZUZvclN0YXRlbWVudF9lYWNoX2F3YWl0JywgKCkgeworICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUZvclN0YXRlbWVudF9lYWNoX2F3YWl0KTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VGb3JTdGF0ZW1lbnRfZWFjaF9pZGVudGlmaWVyJywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUZvclN0YXRlbWVudF9lYWNoX2lkZW50aWZpZXIpOwpAQCAtMTA5ODUsNiArMTExMjgsMTggQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNpbXBsZVBhcnNlclRlc3QoKTsKICAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfcGFyc2VGdW5jdGlvbkJvZHlfYmxvY2spOwogICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9ja19hc3luYycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNpbXBsZVBhcnNlclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfcGFyc2VGdW5jdGlvbkJvZHlfYmxvY2tfYXN5bmMpOworICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9ja19hc3luY0dlbmVyYXRvcicsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNpbXBsZVBhcnNlclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfcGFyc2VGdW5jdGlvbkJvZHlfYmxvY2tfYXN5bmNHZW5lcmF0b3IpOworICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9ja19zeW5jR2VuZXJhdG9yJywgKCkgeworICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9ibG9ja19zeW5jR2VuZXJhdG9yKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VGdW5jdGlvbkJvZHlfZW1wdHknLCAoKSB7CiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlRnVuY3Rpb25Cb2R5X2VtcHR5KTsKQEAgLTEwOTkzLDYgKzExMTQ4LDEwIEBACiAgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlRnVuY3Rpb25Cb2R5X2V4cHJlc3Npb24pOwogICAgICAgfSk7CisgICAgICBfdXQudGVzdCgndGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9leHByZXNzaW9uX2FzeW5jJywgKCkgeworICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9leHByZXNzaW9uX2FzeW5jKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VGdW5jdGlvbkJvZHlfbmF0aXZlRnVuY3Rpb25Cb2R5JywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9wYXJzZUZ1bmN0aW9uQm9keV9uYXRpdmVGdW5jdGlvbkJvZHkpOwpAQCAtMTE4ODksNiArMTIwNDgsMTQgQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNpbXBsZVBhcnNlclRlc3QoKTsKICAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfcGFyc2VXaXRoQ2xhdXNlX3NpbmdsZSk7CiAgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X3BhcnNlWWllbGRTdGF0ZW1lbnRfZWFjaCcsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IFNpbXBsZVBhcnNlclRlc3QoKTsKKyAgICAgICAgcnVuSlVuaXRUZXN0KF9fdGVzdCwgX190ZXN0LnRlc3RfcGFyc2VZaWVsZFN0YXRlbWVudF9lYWNoKTsKKyAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfcGFyc2VZaWVsZFN0YXRlbWVudF9ub3JtYWwnLCAoKSB7CisgICAgICAgIGZpbmFsIF9fdGVzdCA9IG5ldyBTaW1wbGVQYXJzZXJUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X3BhcnNlWWllbGRTdGF0ZW1lbnRfbm9ybWFsKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3Rfc2tpcFByZWZpeGVkSWRlbnRpZmllcl9pbnZhbGlkJywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgU2ltcGxlUGFyc2VyVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9za2lwUHJlZml4ZWRJZGVudGlmaWVyX2ludmFsaWQpOwpkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Jlc29sdmVyX3Rlc3QuZGFydCBiL3BrZy9hbmFseXplci90ZXN0L2dlbmVyYXRlZC9yZXNvbHZlcl90ZXN0LmRhcnQKaW5kZXggMzg3OWNmMy4uYTA5NzgyMCAxMDA2NDQKLS0tIGEvcGtnL2FuYWx5emVyL3Rlc3QvZ2VuZXJhdGVkL3Jlc29sdmVyX3Rlc3QuZGFydAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9nZW5lcmF0ZWQvcmVzb2x2ZXJfdGVzdC5kYXJ0CkBAIC0xNjM2LDYgKzE2MzYsMzEgQEAKICAgICB2ZXJpZnkoW3NvdXJjZV0pOwogICB9CiAKKyAgdm9pZCB0ZXN0X2Zyb21FbnZpcm9ubWVudF9ib29sX2JhZEFyZ3MoKSB7CisgICAgU291cmNlIHNvdXJjZSA9IGFkZFNvdXJjZShFbmdpbmVUZXN0Q2FzZS5jcmVhdGVTb3VyY2UoWworICAgICAgICAidmFyIGIxID0gY29uc3QgYm9vbC5mcm9tRW52aXJvbm1lbnQoMSk7IiwKKyAgICAgICAgInZhciBiMiA9IGNvbnN0IGJvb2wuZnJvbUVudmlyb25tZW50KCd4JywgZGVmYXVsdFZhbHVlOiAxKTsiXSkpOworICAgIHJlc29sdmUoc291cmNlKTsKKyAgICBhc3NlcnRFcnJvcnMoc291cmNlLCBbCisgICAgICAgIENvbXBpbGVUaW1lRXJyb3JDb2RlLkNPTlNUX0VWQUxfVEhST1dTX0VYQ0VQVElPTiwKKyAgICAgICAgU3RhdGljV2FybmluZ0NvZGUuQVJHVU1FTlRfVFlQRV9OT1RfQVNTSUdOQUJMRSwKKyAgICAgICAgQ29tcGlsZVRpbWVFcnJvckNvZGUuQ09OU1RfRVZBTF9USFJPV1NfRVhDRVBUSU9OLAorICAgICAgICBTdGF0aWNXYXJuaW5nQ29kZS5BUkdVTUVOVF9UWVBFX05PVF9BU1NJR05BQkxFXSk7CisgICAgdmVyaWZ5KFtzb3VyY2VdKTsKKyAgfQorCisgIHZvaWQgdGVzdF9mcm9tRW52aXJvbm1lbnRfYm9vbF9iYWREZWZhdWx0X3doZW5EZWZpbmVkKCkgeworICAgIC8vIFRoZSB0eXBlIG9mIHRoZSBkZWZhdWx0VmFsdWUgbmVlZHMgdG8gYmUgY29ycmVjdCBldmVuIHdoZW4gdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAvLyBpc24ndCB1c2VkIChiZWNhdXNlIHRoZSB2YXJpYWJsZSBpcyBkZWZpbmVkIGluIHRoZSBlbnZpcm9ubWVudCkuCisgICAgYW5hbHlzaXNDb250ZXh0Mi5kZWNsYXJlZFZhcmlhYmxlcy5kZWZpbmUoIngiLCAidHJ1ZSIpOworICAgIFNvdXJjZSBzb3VyY2UgPSBhZGRTb3VyY2UoRW5naW5lVGVzdENhc2UuY3JlYXRlU291cmNlKFsidmFyIGIgPSBjb25zdCBib29sLmZyb21FbnZpcm9ubWVudCgneCcsIGRlZmF1bHRWYWx1ZTogMSk7Il0pKTsKKyAgICByZXNvbHZlKHNvdXJjZSk7CisgICAgYXNzZXJ0RXJyb3JzKHNvdXJjZSwgWworICAgICAgICBDb21waWxlVGltZUVycm9yQ29kZS5DT05TVF9FVkFMX1RIUk9XU19FWENFUFRJT04sCisgICAgICAgIFN0YXRpY1dhcm5pbmdDb2RlLkFSR1VNRU5UX1RZUEVfTk9UX0FTU0lHTkFCTEVdKTsKKyAgICB2ZXJpZnkoW3NvdXJjZV0pOworICB9CisKICAgdm9pZCB0ZXN0X2dldHRlckFuZE1ldGhvZFdpdGhTYW1lTmFtZSgpIHsKICAgICBTb3VyY2Ugc291cmNlID0gYWRkU291cmNlKEVuZ2luZVRlc3RDYXNlLmNyZWF0ZVNvdXJjZShbImNsYXNzIEEgeyIsICIgIHgoeSkge30iLCAiICBnZXQgeCA9PiAwOyIsICJ9Il0pKTsKICAgICByZXNvbHZlKHNvdXJjZSk7CkBAIC00NTczLDYgKzQ1OTgsMTQgQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IENvbXBpbGVUaW1lRXJyb3JDb2RlVGVzdCgpOwogICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9maW5hbE5vdEluaXRpYWxpemVkX2xvY2FsX2NvbnN0KTsKICAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfZnJvbUVudmlyb25tZW50X2Jvb2xfYmFkQXJncycsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IENvbXBpbGVUaW1lRXJyb3JDb2RlVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9mcm9tRW52aXJvbm1lbnRfYm9vbF9iYWRBcmdzKTsKKyAgICAgIH0pOworICAgICAgX3V0LnRlc3QoJ3Rlc3RfZnJvbUVudmlyb25tZW50X2Jvb2xfYmFkRGVmYXVsdF93aGVuRGVmaW5lZCcsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IENvbXBpbGVUaW1lRXJyb3JDb2RlVGVzdCgpOworICAgICAgICBydW5KVW5pdFRlc3QoX190ZXN0LCBfX3Rlc3QudGVzdF9mcm9tRW52aXJvbm1lbnRfYm9vbF9iYWREZWZhdWx0X3doZW5EZWZpbmVkKTsKKyAgICAgIH0pOwogICAgICAgX3V0LnRlc3QoJ3Rlc3RfZ2V0dGVyQW5kTWV0aG9kV2l0aFNhbWVOYW1lJywgKCkgewogICAgICAgICBmaW5hbCBfX3Rlc3QgPSBuZXcgQ29tcGlsZVRpbWVFcnJvckNvZGVUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2dldHRlckFuZE1ldGhvZFdpdGhTYW1lTmFtZSk7CkBAIC0xMDE4NCwyNyArMTAyMTcsNiBAQAogfQogCiBjbGFzcyBOb25FcnJvclJlc29sdmVyVGVzdCBleHRlbmRzIFJlc29sdmVyVGVzdENhc2UgewotICB2b2lkIGZhaWxfaW52YWxpZEFzc2lnbm1lbnRfaW1wbGljaXRseUltcGxlbWVudEZ1bmN0aW9uVmlhQ2FsbF8yKCkgewotICAgIC8vIDE4MzQxCi0gICAgLy8KLSAgICAvLyBIZXJlICdDJyBjaGVja3MgYXMgYSBzdWJ0eXBlIG9mICdJJywgYnV0ICdDJyBkb2VzIG5vdAotICAgIC8vIGNoZWNrIGFzIGEgc3VidHlwZSBvZiAnSW50VG9JbnQnLiBUb2dldGhlciB3aXRoCi0gICAgLy8gJ3Rlc3RfaW52YWxpZEFzc2lnbm1lbnRfaW1wbGljaXRseUltcGxlbWVudEZ1bmN0aW9uVmlhQ2FsbF8xKCknIHdlIHNlZQotICAgIC8vIHRoYXQgc3VidHlwaW5nIGlzIG5vdCB0cmFuc2l0aXZlIGhlcmUuCi0gICAgU291cmNlIHNvdXJjZSA9IGFkZFNvdXJjZShFbmdpbmVUZXN0Q2FzZS5jcmVhdGVTb3VyY2UoWwotICAgICAgICAiY2xhc3MgSSB7IiwKLSAgICAgICAgIiAgaW50IGNhbGwoaW50IHgpID0+IDA7IiwKLSAgICAgICAgIn0iLAotICAgICAgICAiY2xhc3MgQyBpbXBsZW1lbnRzIEkgeyIsCi0gICAgICAgICIgIG5vU3VjaE1ldGhvZChfKSA9PiBudWxsOyIsCi0gICAgICAgICJ9IiwKLSAgICAgICAgInR5cGVkZWYgaW50IEludFRvSW50KGludCB4KTsiLAotICAgICAgICAiSW50VG9JbnQgZiA9IG5ldyBDKCk7Il0pKTsKLSAgICByZXNvbHZlKHNvdXJjZSk7Ci0gICAgYXNzZXJ0Tm9FcnJvcnMoc291cmNlKTsKLSAgICB2ZXJpZnkoW3NvdXJjZV0pOwotICB9Ci0KICAgdm9pZCB0ZXN0X2FtYmlndW91c0V4cG9ydCgpIHsKICAgICBTb3VyY2Ugc291cmNlID0gYWRkU291cmNlKEVuZ2luZVRlc3RDYXNlLmNyZWF0ZVNvdXJjZShbCiAgICAgICAgICJsaWJyYXJ5IEw7IiwKQEAgLTExODA1LDcgKzExODE3LDcgQEAKICAgdm9pZCB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMSgpIHsKICAgICAvLyAxODM0MQogICAgIC8vCi0gICAgLy8gVGhpcyB0ZXN0IGFuZCAnZmFpbC90ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMigpJworICAgIC8vIFRoaXMgdGVzdCBhbmQgJ3Rlc3RfaW52YWxpZEFzc2lnbm1lbnRfaW1wbGljaXRseUltcGxlbWVudEZ1bmN0aW9uVmlhQ2FsbF8yKCknCiAgICAgLy8gYXJlIGNsb3NlbHkgcmVsYXRlZDogaGVyZSB3ZSBzZWUgdGhhdCAnSScgY2hlY2tzIGFzIGEgc3VidHlwZSBvZiAnSW50VG9JbnQnLgogICAgIFNvdXJjZSBzb3VyY2UgPSBhZGRTb3VyY2UoRW5naW5lVGVzdENhc2UuY3JlYXRlU291cmNlKFsKICAgICAgICAgImNsYXNzIEkgeyIsCkBAIC0xMTgyMSwxMCArMTE4MzMsMzEgQEAKICAgICB2ZXJpZnkoW3NvdXJjZV0pOwogICB9CiAKKyAgdm9pZCB0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMigpIHsKKyAgICAvLyAxODM0MQorICAgIC8vCisgICAgLy8gSGVyZSAnQycgY2hlY2tzIGFzIGEgc3VidHlwZSBvZiAnSScsIGJ1dCAnQycgZG9lcyBub3QKKyAgICAvLyBjaGVjayBhcyBhIHN1YnR5cGUgb2YgJ0ludFRvSW50Jy4gVG9nZXRoZXIgd2l0aAorICAgIC8vICd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMSgpJyB3ZSBzZWUKKyAgICAvLyB0aGF0IHN1YnR5cGluZyBpcyBub3QgdHJhbnNpdGl2ZSBoZXJlLgorICAgIFNvdXJjZSBzb3VyY2UgPSBhZGRTb3VyY2UoRW5naW5lVGVzdENhc2UuY3JlYXRlU291cmNlKFsKKyAgICAgICAgImNsYXNzIEkgeyIsCisgICAgICAgICIgIGludCBjYWxsKGludCB4KSA9PiAwOyIsCisgICAgICAgICJ9IiwKKyAgICAgICAgImNsYXNzIEMgaW1wbGVtZW50cyBJIHsiLAorICAgICAgICAiICBub1N1Y2hNZXRob2QoXykgPT4gbnVsbDsiLAorICAgICAgICAifSIsCisgICAgICAgICJ0eXBlZGVmIGludCBJbnRUb0ludChpbnQgeCk7IiwKKyAgICAgICAgIkludFRvSW50IGYgPSBuZXcgQygpOyJdKSk7CisgICAgcmVzb2x2ZShzb3VyY2UpOworICAgIGFzc2VydE5vRXJyb3JzKHNvdXJjZSk7CisgICAgdmVyaWZ5KFtzb3VyY2VdKTsKKyAgfQorCiAgIHZvaWQgdGVzdF9pbnZhbGlkQXNzaWdubWVudF9pbXBsaWNpdGx5SW1wbGVtZW50RnVuY3Rpb25WaWFDYWxsXzMoKSB7CiAgICAgLy8gMTgzNDEKICAgICAvLwotICAgIC8vIExpa2UgJ2ZhaWwvdGVzdF9pbnZhbGlkQXNzaWdubWVudF9pbXBsaWNpdGx5SW1wbGVtZW50RnVuY3Rpb25WaWFDYWxsXzIoKScsCisgICAgLy8gTGlrZSAndGVzdF9pbnZhbGlkQXNzaWdubWVudF9pbXBsaWNpdGx5SW1wbGVtZW50RnVuY3Rpb25WaWFDYWxsXzIoKScsCiAgICAgLy8gYnV0IHVzZXMgdHlwZSAnRnVuY3Rpb24nIGluc3RlYWQgb2YgbW9yZSBwcmVjaXNlIHR5cGUgJ0ludFRvSW50JyBmb3IgJ2YnLgogICAgIFNvdXJjZSBzb3VyY2UgPSBhZGRTb3VyY2UoRW5naW5lVGVzdENhc2UuY3JlYXRlU291cmNlKFsKICAgICAgICAgImNsYXNzIEkgeyIsCkBAIC0xMTg0MCw2ICsxMTg3MywzMCBAQAogICAgIHZlcmlmeShbc291cmNlXSk7CiAgIH0KIAorICB2b2lkIHRlc3RfaW52YWxpZEFzc2lnbm1lbnRfaW1wbGljaXRseUltcGxlbWVudEZ1bmN0aW9uVmlhQ2FsbF80KCkgeworICAgIC8vIDE4MzQxCisgICAgLy8KKyAgICAvLyBMaWtlICd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMigpJywKKyAgICAvLyBidXQgdXNlcyB0eXBlICdWb2lkVG9JbnQnIGluc3RlYWQgb2YgbW9yZSBwcmVjaXNlIHR5cGUgJ0ludFRvSW50JyBmb3IgJ2YnLgorICAgIC8vCisgICAgLy8gSGVyZSAnQyA8OiBJbnRUb0ludCA8OiBWb2lkVG9JbnQnLCBidXQgdGhlIHNwZWMgZ2l2ZXMgbm8gdHJhbnNpdGl2aXR5IHJ1bGUKKyAgICAvLyBmb3IgJzw6Jy4gSG93ZXZlciwgbWFueSBvZiB0aGUgOi90b29scy90ZXN0LnB5IHRlc3RzIGFzc3VtZSB0aGlzIHRyYW5zaXRpdml0eQorICAgIC8vIGZvciAnSnNCdWlsZGVyJyBvYmplY3RzLCBhc3NpZ25pbmcgdGhlbSB0byAnKFN0cmluZykgLT4gZHluYW1pYycuIFRoZSBkZWNsYXJlZCB0eXBlIG9mCisgICAgLy8gJ0pzQnVpbGRlci5jYWxsJyBpcyAnKFN0cmluZywgW2R5bmFtaWNdKSAtPiBFeHByZXNzaW9uJy4KKyAgICBTb3VyY2Ugc291cmNlID0gYWRkU291cmNlKEVuZ2luZVRlc3RDYXNlLmNyZWF0ZVNvdXJjZShbCisgICAgICAgICJjbGFzcyBJIHsiLAorICAgICAgICAiICBpbnQgY2FsbChbaW50IHhdKSA9PiAwOyIsCisgICAgICAgICJ9IiwKKyAgICAgICAgImNsYXNzIEMgaW1wbGVtZW50cyBJIHsiLAorICAgICAgICAiICBub1N1Y2hNZXRob2QoXykgPT4gbnVsbDsiLAorICAgICAgICAifSIsCisgICAgICAgICJ0eXBlZGVmIGludCBWb2lkVG9JbnQoKTsiLAorICAgICAgICAiVm9pZFRvSW50IGYgPSBuZXcgQygpOyJdKSk7CisgICAgcmVzb2x2ZShzb3VyY2UpOworICAgIGFzc2VydE5vRXJyb3JzKHNvdXJjZSk7CisgICAgdmVyaWZ5KFtzb3VyY2VdKTsKKyAgfQorCiAgIHZvaWQgdGVzdF9pbnZhbGlkQXNzaWdubWVudF90b0R5bmFtaWMoKSB7CiAgICAgU291cmNlIHNvdXJjZSA9IGFkZFNvdXJjZShFbmdpbmVUZXN0Q2FzZS5jcmVhdGVTb3VyY2UoWyJmKCkgeyIsICIgIHZhciBnOyIsICIgIGcgPSAoKSA9PiAwOyIsICJ9Il0pKTsKICAgICByZXNvbHZlKHNvdXJjZSk7CkBAIC0xNDc1NCwxMCArMTQ4MTEsMTggQEAKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5vbkVycm9yUmVzb2x2ZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMSk7CiAgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMicsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5vbkVycm9yUmVzb2x2ZXJUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMik7CisgICAgICB9KTsKICAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMycsICgpIHsKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5vbkVycm9yUmVzb2x2ZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfMyk7CiAgICAgICB9KTsKKyAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfNCcsICgpIHsKKyAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5vbkVycm9yUmVzb2x2ZXJUZXN0KCk7CisgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2ludmFsaWRBc3NpZ25tZW50X2ltcGxpY2l0bHlJbXBsZW1lbnRGdW5jdGlvblZpYUNhbGxfNCk7CisgICAgICB9KTsKICAgICAgIF91dC50ZXN0KCd0ZXN0X2ludmFsaWRBc3NpZ25tZW50X3RvRHluYW1pYycsICgpIHsKICAgICAgICAgZmluYWwgX190ZXN0ID0gbmV3IE5vbkVycm9yUmVzb2x2ZXJUZXN0KCk7CiAgICAgICAgIHJ1bkpVbml0VGVzdChfX3Rlc3QsIF9fdGVzdC50ZXN0X2ludmFsaWRBc3NpZ25tZW50X3RvRHluYW1pYyk7CkBAIC0yNTk0Niw3ICsyNjAxMSwxNCBAQAogICBAb3ZlcnJpZGUKICAgSW50ZXJmYWNlVHlwZSBnZXQgYm9vbFR5cGUgewogICAgIGlmIChfYm9vbFR5cGUgPT0gbnVsbCkgewotICAgICAgX2Jvb2xUeXBlID0gRWxlbWVudEZhY3RvcnkuY2xhc3NFbGVtZW50MigiYm9vbCIsIFtdKS50eXBlOworICAgICAgQ2xhc3NFbGVtZW50SW1wbCBib29sRWxlbWVudCA9IEVsZW1lbnRGYWN0b3J5LmNsYXNzRWxlbWVudDIoImJvb2wiLCBbXSk7CisgICAgICBfYm9vbFR5cGUgPSBib29sRWxlbWVudC50eXBlOworICAgICAgQ29uc3RydWN0b3JFbGVtZW50SW1wbCBmcm9tRW52aXJvbm1lbnQgPSBFbGVtZW50RmFjdG9yeS5jb25zdHJ1Y3RvckVsZW1lbnQoYm9vbEVsZW1lbnQsICJmcm9tRW52aXJvbm1lbnQiLCB0cnVlLCBbXSk7CisgICAgICBmcm9tRW52aXJvbm1lbnQucGFyYW1ldGVycyA9IDxQYXJhbWV0ZXJFbGVtZW50PiBbCisgICAgICAgICAgRWxlbWVudEZhY3RvcnkucmVxdWlyZWRQYXJhbWV0ZXIyKCJuYW1lIiwgc3RyaW5nVHlwZSksCisgICAgICAgICAgRWxlbWVudEZhY3RvcnkubmFtZWRQYXJhbWV0ZXIyKCJkZWZhdWx0VmFsdWUiLCBfYm9vbFR5cGUpXTsKKyAgICAgIGZyb21FbnZpcm9ubWVudC5mYWN0b3J5ID0gdHJ1ZTsKKyAgICAgIGJvb2xFbGVtZW50LmNvbnN0cnVjdG9ycyA9IDxDb25zdHJ1Y3RvckVsZW1lbnQ+IFtmcm9tRW52aXJvbm1lbnRdOwogICAgIH0KICAgICByZXR1cm4gX2Jvb2xUeXBlOwogICB9CkBAIC0yNjExNCw2ICsyNjE4NiwxMiBAQAogICAgICAgICAgIEVsZW1lbnRGYWN0b3J5Lm1ldGhvZEVsZW1lbnQoIisiLCBfc3RyaW5nVHlwZSwgW19zdHJpbmdUeXBlXSksCiAgICAgICAgICAgRWxlbWVudEZhY3RvcnkubWV0aG9kRWxlbWVudCgidG9Mb3dlckNhc2UiLCBfc3RyaW5nVHlwZSwgW10pLAogICAgICAgICAgIEVsZW1lbnRGYWN0b3J5Lm1ldGhvZEVsZW1lbnQoInRvVXBwZXJDYXNlIiwgX3N0cmluZ1R5cGUsIFtdKV07CisgICAgICBDb25zdHJ1Y3RvckVsZW1lbnRJbXBsIGZyb21FbnZpcm9ubWVudCA9IEVsZW1lbnRGYWN0b3J5LmNvbnN0cnVjdG9yRWxlbWVudChzdHJpbmdFbGVtZW50LCAiZnJvbUVudmlyb25tZW50IiwgdHJ1ZSwgW10pOworICAgICAgZnJvbUVudmlyb25tZW50LnBhcmFtZXRlcnMgPSA8UGFyYW1ldGVyRWxlbWVudD4gWworICAgICAgICAgIEVsZW1lbnRGYWN0b3J5LnJlcXVpcmVkUGFyYW1ldGVyMigibmFtZSIsIHN0cmluZ1R5cGUpLAorICAgICAgICAgIEVsZW1lbnRGYWN0b3J5Lm5hbWVkUGFyYW1ldGVyMigiZGVmYXVsdFZhbHVlIiwgX3N0cmluZ1R5cGUpXTsKKyAgICAgIGZyb21FbnZpcm9ubWVudC5mYWN0b3J5ID0gdHJ1ZTsKKyAgICAgIHN0cmluZ0VsZW1lbnQuY29uc3RydWN0b3JzID0gPENvbnN0cnVjdG9yRWxlbWVudD4gW2Zyb21FbnZpcm9ubWVudF07CiAgICAgfQogICAgIHJldHVybiBfc3RyaW5nVHlwZTsKICAgfQpAQCAtMjYyMDMsNiArMjYyODEsMTIgQEAKICAgICAgICAgRWxlbWVudEZhY3RvcnkubWV0aG9kRWxlbWVudCgiY2VpbCIsIF9pbnRUeXBlLCBbXSksCiAgICAgICAgIEVsZW1lbnRGYWN0b3J5Lm1ldGhvZEVsZW1lbnQoInRydW5jYXRlIiwgX2ludFR5cGUsIFtdKSwKICAgICAgICAgRWxlbWVudEZhY3RvcnkubWV0aG9kRWxlbWVudCgidG9TdHJpbmciLCBfc3RyaW5nVHlwZSwgW10pXTsKKyAgICBDb25zdHJ1Y3RvckVsZW1lbnRJbXBsIGZyb21FbnZpcm9ubWVudCA9IEVsZW1lbnRGYWN0b3J5LmNvbnN0cnVjdG9yRWxlbWVudChpbnRFbGVtZW50LCAiZnJvbUVudmlyb25tZW50IiwgdHJ1ZSwgW10pOworICAgIGZyb21FbnZpcm9ubWVudC5wYXJhbWV0ZXJzID0gPFBhcmFtZXRlckVsZW1lbnQ+IFsKKyAgICAgICAgRWxlbWVudEZhY3RvcnkucmVxdWlyZWRQYXJhbWV0ZXIyKCJuYW1lIiwgc3RyaW5nVHlwZSksCisgICAgICAgIEVsZW1lbnRGYWN0b3J5Lm5hbWVkUGFyYW1ldGVyMigiZGVmYXVsdFZhbHVlIiwgX2ludFR5cGUpXTsKKyAgICBmcm9tRW52aXJvbm1lbnQuZmFjdG9yeSA9IHRydWU7CisgICAgaW50RWxlbWVudC5jb25zdHJ1Y3RvcnMgPSA8Q29uc3RydWN0b3JFbGVtZW50PiBbZnJvbUVudmlyb25tZW50XTsKICAgICBMaXN0PEZpZWxkRWxlbWVudD4gZmllbGRzID0gPEZpZWxkRWxlbWVudD4gWwogICAgICAgICBFbGVtZW50RmFjdG9yeS5maWVsZEVsZW1lbnQoIk5BTiIsIHRydWUsIGZhbHNlLCB0cnVlLCBfZG91YmxlVHlwZSksCiAgICAgICAgIEVsZW1lbnRGYWN0b3J5LmZpZWxkRWxlbWVudCgiSU5GSU5JVFkiLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgX2RvdWJsZVR5cGUpLApkaWZmIC0tZ2l0IGEvcGtnL2FuYWx5emVyL3Rlc3Qvc2VydmljZXMvZGF0YS9zdG10X3Rlc3RzLmRhdGEgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9kYXRhL3N0bXRfdGVzdHMuZGF0YQppbmRleCAzMTQzZmUxLi5kMWNmNGNjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9kYXRhL3N0bXRfdGVzdHMuZGF0YQorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9kYXRhL3N0bXRfdGVzdHMuZGF0YQpAQCAtMzQsMTAgKzM0LDEyIEBACiAgIHByaW50KHgpOwogfQogPj4+Ci12YXIgcHJpbWVzID0gWzIsIDMsIDUsIDcsIDExLCAxMywgMTcsIDE5LCAyMywgMjksIDMxLCAzNywgNDEsIDQzLCA0NywgNTMsIDU5LCA2MSwgNjcsIDcxXTsKK0xpc3Q8aW50PiBudW1iZXJzID0gPGludD5bYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwgYjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwgYzAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OV07CiA8PDwKLXZhciBwcmltZXMgPSBbMiwgMywgNSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOSwgMzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksCi0gICAgNjEsIDY3LCA3MV07CitMaXN0PGludD4gbnVtYmVycyA9IDxpbnQ+WworICAgIGEwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODksCisgICAgYjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwKKyAgICBjMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5XTsKID4+PgogYmxhaCgpIHsKICAgcHJpbnQoJ2JsYWggYmxhaCBibGFoIGJsYWggYmxhaCBibGFoIGJsYWggYmxhaCBibGFoIGJsYWggYmxhaCBibGFoIGJsYWggYmxhaCAkZm9vJyk7CkBAIC0xOTMsMTIgKzE5NSwxMyBAQAogfQogPj4+CiBtYWluKCkgewotICBmKGEsIGIpIHt9Ci0gIGYoMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgMTExKTsKKyAgcHJpbnROdW1iZXJzKGEsIGIpIHt9CisgIHByaW50TnVtYmVycygwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgMTExKTsKIH0KIDw8PAogbWFpbigpIHsKLSAgZihhLCBiKSB7fQotICBmKDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsCisgIHByaW50TnVtYmVycyhhLCBiKSB7fQorICBwcmludE51bWJlcnMoCisgICAgICAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwKICAgICAgIDExMSk7CiB9CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9kYXRhL3dyYXBfdGVzdHMuZGF0YSBiL3BrZy9hbmFseXplci90ZXN0L3NlcnZpY2VzL2RhdGEvd3JhcF90ZXN0cy5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjE1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9kYXRhL3dyYXBfdGVzdHMuZGF0YQpAQCAtMCwwICsxLDk1IEBACis+Pj4gbGlzdCBsaXRlcmFsCittYWluKCkgeworICBMaXN0PFN0cmluZz4gdmFsdWVzID0gPFN0cmluZz5bYTAxMjM0NTY3ODkwMTIzNDUsIGIwMTIzNDU2Nzg5MDEyMzQ1LCBjMDEyMzQ1Njc4OTAxMjM0NSwgZDAxMjM0NTY3ODkwMTIzNDVdOworfQorPDw8CittYWluKCkgeworICBMaXN0PFN0cmluZz4gdmFsdWVzID0gPFN0cmluZz5bCisgICAgICBhMDEyMzQ1Njc4OTAxMjM0NSwKKyAgICAgIGIwMTIzNDU2Nzg5MDEyMzQ1LAorICAgICAgYzAxMjM0NTY3ODkwMTIzNDUsCisgICAgICBkMDEyMzQ1Njc4OTAxMjM0NV07Cit9Cis+Pj4gb3BlcmF0b3JzCittYWluKCkgeworICBpbnQgcmVzdWx0ID0gYTAxMjM0NTY3ODkwMTIzNDUgKiBiMDEyMzQ1Njc4OTAxMjM0NSArIGMwMTIzNDU2Nzg5MDEyMzQ1ICogZDAxMjM0NTY3ODkwMTIzNDU7Cit9Cis8PDwKK21haW4oKSB7CisgIGludCByZXN1bHQgPQorICAgICAgYTAxMjM0NTY3ODkwMTIzNDUgKiBiMDEyMzQ1Njc4OTAxMjM0NSArCisgICAgICBjMDEyMzQ1Njc4OTAxMjM0NSAqIGQwMTIzNDU2Nzg5MDEyMzQ1OworfQorPj4+IGFyZ3VtZW50cworbWFpbigpIHsKKyAgbXlGdW5jdGlvbihhMDEyMzQ1Njc4OTAxMjM0NSAqIGIwMTIzNDU2Nzg5MDEyMzQ1LCBjMDEyMzQ1Njc4OTAxMjM0NSAqIGQwMTIzNDU2Nzg5MDEyMzQ1KTsKK30KKzw8PAorbWFpbigpIHsKKyAgbXlGdW5jdGlvbigKKyAgICAgIGEwMTIzNDU2Nzg5MDEyMzQ1ICogYjAxMjM0NTY3ODkwMTIzNDUsCisgICAgICBjMDEyMzQ1Njc4OTAxMjM0NSAqIGQwMTIzNDU2Nzg5MDEyMzQ1KTsKK30KKz4+PiBhcmd1bWVudHMsIG5lc3RlZAorbWFpbigpIHsKKyAgc29tZUZ1bmN0aW9uT25lKGEwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODksCisgICAgc29tZUZ1bmN0aW9uVHdvKGJhMDEyMzQ1Njc4OTAxMjM0NTY3ODksIGJiMDEyMzQ1Njc4OTAxMjM0NTY3ODksIGJjMDEyMzQ1Njc4OTAxMjM0NTY3ODkpLAorICAgIHNvbWVGdW5jdGlvblR3byhjYTAxMjM0NTY3ODkwMTIzNDU2Nzg5LCBjYjAxMjM0NTY3ODkwMTIzNDU2Nzg5LCBjYzAxMjM0NTY3ODkwMTIzNDU2Nzg5KSwKKyAgICBkMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5LCBlMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5KTsKK30KKzw8PAorbWFpbigpIHsKKyAgc29tZUZ1bmN0aW9uT25lKAorICAgICAgYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwKKyAgICAgIHNvbWVGdW5jdGlvblR3bygKKyAgICAgICAgICBiYTAxMjM0NTY3ODkwMTIzNDU2Nzg5LAorICAgICAgICAgIGJiMDEyMzQ1Njc4OTAxMjM0NTY3ODksCisgICAgICAgICAgYmMwMTIzNDU2Nzg5MDEyMzQ1Njc4OSksCisgICAgICBzb21lRnVuY3Rpb25Ud28oCisgICAgICAgICAgY2EwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwKKyAgICAgICAgICBjYjAxMjM0NTY3ODkwMTIzNDU2Nzg5LAorICAgICAgICAgIGNjMDEyMzQ1Njc4OTAxMjM0NTY3ODkpLAorICAgICAgZDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSwKKyAgICAgIGUwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkpOworfQorPj4+IGNvbmRpdGlvbnMsIHNhbWUgb3BlcmF0b3IKK21haW4oKSB7CisgIGlmIChhMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8IGIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgfHwgYzAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorICAgICAgICAgICAgICAgICAgfHwgZDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSkgeworICB9Cit9Cis8PDwKK21haW4oKSB7CisgIGlmIChhMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8CisgICAgICBiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8CisgICAgICBjMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8CisgICAgICBkMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5KSB7CisgIH0KK30KKz4+PiBjb25kaXRpb25zLCBkaWZmZXJlbnQgb3BlcmF0b3JzCittYWluKCkgeworICBpZiAoYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSAmJiBiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8IGMwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKKyAgICAgICAgICAgICAgICAgICYmIGQwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkpIHsKKyAgfQorfQorPDw8CittYWluKCkgeworICBpZiAoYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSAmJiBiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5IHx8CisgICAgICBjMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ICYmIGQwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkpIHsKKyAgfQorfQorPj4+IGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KK21haW4oKSB7CisgIE1hdGNoS2luZCBraW5kID0gZWxlbWVudCAhPSBudWxsID8gYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSA6IGIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk7Cit9Cis8PDwKK21haW4oKSB7CisgIE1hdGNoS2luZCBraW5kID0gZWxlbWVudCAhPSBudWxsID8KKyAgICAgIGEwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkgOgorICAgICAgYjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTsKK30KKz4+PiBleHByZXNzaW9uIGZ1bmN0aW9uIGJvZHkKK215RnVuY3Rpb24oKSA9PiBhMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ICsgYjAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTsKKzw8PAorbXlGdW5jdGlvbigpID0+CisgICAgYTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSArIGIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODk7CmRpZmYgLS1naXQgYS9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9mb3JtYXR0ZXJfdGVzdC5kYXJ0IGIvcGtnL2FuYWx5emVyL3Rlc3Qvc2VydmljZXMvZm9ybWF0dGVyX3Rlc3QuZGFydAppbmRleCA1Mjk4ZDczLi5jNDkwN2FjIDEwMDY0NAotLS0gYS9wa2cvYW5hbHl6ZXIvdGVzdC9zZXJ2aWNlcy9mb3JtYXR0ZXJfdGVzdC5kYXJ0CisrKyBiL3BrZy9hbmFseXplci90ZXN0L3NlcnZpY2VzL2Zvcm1hdHRlcl90ZXN0LmRhcnQKQEAgLTQyLDYgKzQyLDEzIEBACiAgICAgfSk7CiAgIH0pOwogCisgIC8vLyBEYXRhLWRyaXZlbiB3cmFwcGluZyB0ZXN0cworICBncm91cCgnd3JhcF90ZXN0cy5kYXRhJywgKCkgeworICAgIHJ1blRlc3RzKCd3cmFwX3Rlc3RzLmRhdGEnLCAoaW5wdXQsIGV4cGVjdGVkT3V0cHV0KSB7CisgICAgICBleHBlY3RDVUZvcm1hdHNUbyhpbnB1dCwgZXhwZWN0ZWRPdXRwdXQpOworICAgIH0pOworICB9KTsKKwogICAvLy8gRm9ybWF0dGVyIHRlc3RzCiAgIGdyb3VwKCdmb3JtYXR0ZXInLCAoKSB7CiAKQEAgLTEzMzEsNyArMTMzOCwxMCBAQAogICAgICAgICBuZXcgU2ltcGxlTGluZUJyZWFrZXIobWF4TGVuZ3RoKS5icmVha0xpbmUobGluZSk7CiAKICAgICBTdHJpbmcgcHJpbnRMaW5lKExpbmUgbGluZSwgaW50IG1heExlbmd0aCkgPT4KLSAgICAgICAgbmV3IFNpbXBsZUxpbmVCcmVha2VyKG1heExlbmd0aCkucHJpbnRMaW5lKGxpbmUpOworICAgICAgICBuZXcgU2ltcGxlTGluZUJyZWFrZXIoCisgICAgICAgICAgICBtYXhMZW5ndGgsCisgICAgICAgICAgICAobikgPT4gbmV3IExpc3QuZmlsbGVkKG4sICcgICcpLmpvaW4oKQorICAgICAgICApLnByaW50TGluZShsaW5lKTsKIAogICAgIExpbmUgbGluZShMaXN0IHRva2VucykgewogICAgICAgdmFyIGxpbmUgPSBuZXcgTGluZSgpOwpAQCAtMTM0OSw3ICsxMzU5LDkgQEAKICAgICB9CiAKIAotICAgIGZpbmFsIFNQXzEgPSBuZXcgU3BhY2VUb2tlbigxLCBicmVha1dlaWdodDogMSk7CisgICAgZmluYWwgU1BfMSA9IG5ldyBTcGFjZVRva2VuKDEsIGJyZWFrV2VpZ2h0OiBERUZBVUxUX1NQQUNFX1dFSUdIVCk7CisgICAgZmluYWwgU1BfdzEgPSBuZXcgU3BhY2VUb2tlbigxLCBicmVha1dlaWdodDogMSk7CisgICAgZmluYWwgU1BfdzIgPSBuZXcgU3BhY2VUb2tlbigxLCBicmVha1dlaWdodDogMik7CiAKICAgICAvLyAnZm9vfDF8YmFyfDF8YmF6fDF8Zm9vfDF8YmFyfDF8YmF6JwogICAgIGZpbmFsIExJTkVfMSA9IGxpbmUoWydmb28nLCBTUF8xLCAnYmFyJywgU1BfMSwgJ2JheicsIFNQXzEsCkBAIC0xMzg5LDI0ICsxNDAxLDQwIEBACiAgICAgICBleHBlY3RUZXh0c0VxdWFsKGNodW5rcywgWycgIGZvbyBiYXIgYmF6JywgJ2ZvbyBiYXIgYmF6J10pOwogICAgIH0pOwogCisgICAgdGVzdCgnYnJlYWtMaW5lIC0gdXNlIHdlaWdodHMgLSAxJywgKCkgeworICAgICAgdmFyIHNvdXJjZSA9IGxpbmUoWycxMTEnLCBTUF93MiwgJzIyMicsIFNQX3cxLCAnMzMzJywgU1BfdzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnNDQ0JywgU1BfdzEsICc1NTUnLCBTUF93MiwgJzY2NiddKTsKKyAgICAgIHZhciBjaHVua3MgPSBicmVha0xpbmUoc291cmNlLCAxMik7CisgICAgICBleHBlY3RUZXh0c0VxdWFsKGNodW5rcywgWycxMTEgMjIyJywgJzMzMyA0NDQnLCAnNTU1IDY2NiddKTsKKyAgICB9KTsKKwogICAgIHRlc3QoJ3ByaW50TGluZSAtIDEnLCAoKSB7CiAgICAgICB2YXIgbGluZSA9IHByaW50TGluZShMSU5FXzEsIDEpOwotICAgICAgZXhwZWN0KGxpbmUsICdmb29cbmJhclxuYmF6XG5mb29cbmJhclxuYmF6Jyk7CisgICAgICBleHBlY3QobGluZSwgJ2Zvb1xuICAgIGJhclxuICAgIGJhelxuICAgIGZvb1xuICAgIGJhclxuICAgIGJheicpOwogICAgIH0pOwogCiAgICAgdGVzdCgncHJpbnRMaW5lIC0gMicsICgpIHsKICAgICAgIHZhciBsaW5lID0gcHJpbnRMaW5lKExJTkVfMSwgNCk7Ci0gICAgICBleHBlY3QobGluZSwgJ2Zvb1xuYmFyXG5iYXpcbmZvb1xuYmFyXG5iYXonKTsKKyAgICAgIGV4cGVjdChsaW5lLCAnZm9vXG4gICAgYmFyXG4gICAgYmF6XG4gICAgZm9vXG4gICAgYmFyXG4gICAgYmF6Jyk7CiAgICAgfSk7CiAKICAgICB0ZXN0KCdwcmludExpbmUgLSAzJywgKCkgewogICAgICAgdmFyIGxpbmUgPSBwcmludExpbmUoTElORV8xLCA4KTsKLSAgICAgIGV4cGVjdChsaW5lLCAnZm9vIGJhclxuYmF6IGZvb1xuYmFyIGJheicpOworICAgICAgZXhwZWN0KGxpbmUsICdmb28gYmFyXG4gICAgYmF6IGZvb1xuICAgIGJhciBiYXonKTsKICAgICB9KTsKIAogICAgIHRlc3QoJ3ByaW50TGluZSAtIDQnLCAoKSB7CiAgICAgICB2YXIgbGluZSA9IHByaW50TGluZShMSU5FXzEsIDEyKTsKLSAgICAgIGV4cGVjdChsaW5lLCAnZm9vIGJhciBiYXpcbmZvbyBiYXIgYmF6Jyk7CisgICAgICBleHBlY3QobGluZSwgJ2ZvbyBiYXIgYmF6XG4gICAgZm9vIGJhciBiYXonKTsKKyAgICB9KTsKKworICAgIHRlc3QoJ3ByaW50TGluZSAtIHVzZSB3ZWlnaHQgLSAxJywgKCkgeworICAgICAgdmFyIHNvdXJjZSA9IGxpbmUoCisgICAgICAgICAgICAgICAgICAgICBbJzExMTExMScsIFNQX3cyLCAnMjIyMjIyJywgU1BfdzEsCisgICAgICAgICAgICAgICAgICAgICAgJzMzMzMzMycsIFNQX3cyLCAnNDQ0NDQ0JywgU1BfdzEsCisgICAgICAgICAgICAgICAgICAgICAgJzU1NTU1NScsIFNQX3cyLCAnNjY2NjY2J10pOworICAgICAgdmFyIHJlc3VsdCA9IHByaW50TGluZShzb3VyY2UsIDIwKTsKKyAgICAgIGV4cGVjdChyZXN1bHQsICcxMTExMTEgMjIyMjIyXG4gICAgMzMzMzMzIDQ0NDQ0NFxuICAgIDU1NTU1NSA2NjY2NjYnKTsKICAgICB9KTsKIAogICAgIHRlc3QoJ2lzV2hpdGVzcGFjZScsICgpIHsKZGlmZiAtLWdpdCBhL3BrZy9jb21waWxlcl91bnN1cHBvcnRlZC9wdWJzcGVjLnlhbWwgYi9wa2cvY29tcGlsZXJfdW5zdXBwb3J0ZWQvcHVic3BlYy55YW1sCmluZGV4IGEyMjhiY2QuLjk4ODc0N2IgMTAwNjQ0Ci0tLSBhL3BrZy9jb21waWxlcl91bnN1cHBvcnRlZC9wdWJzcGVjLnlhbWwKKysrIGIvcGtnL2NvbXBpbGVyX3Vuc3VwcG9ydGVkL3B1YnNwZWMueWFtbApAQCAtMSw5ICsxLDEwIEBACiBuYW1lOiBjb21waWxlcl91bnN1cHBvcnRlZAotdmVyc2lvbjogMC43LjEKK3ZlcnNpb246IDAuNy4yCiBhdXRob3I6IERhcnQyanMgVGVhbSA8Y29tcGlsZXItZGV2QGRhcnRsYW5nLm9yZz4KIGhvbWVwYWdlOiBodHRwOi8vd3d3LmRhcnRsYW5nLm9yZwogZGVzY3JpcHRpb246ID4KICAgVGhpcyBpcyBhbiB1bnN1cHBvcnRlZCBjb3B5IG9mIHRoZSBkYXJ0MmpzIHNvdXJjZS4gVGhlIEFQSSBvZiB0aGlzIHBhY2thZ2UKLSAgY2FuIGFuZCB3aWxsIGNoYW5nZSBpbiB1bnByZWRpY3RhYmxlIGFuZCBpbmNvbXBhdGlibGUgd2F5cy4KKyAgY2FuIGFuZCB3aWxsIGNoYW5nZSBpbiB1bnByZWRpY3RhYmxlIGFuZCBpbmNvbXBhdGlibGUgd2F5cy4gVGhpcyByZWxlYXNlCisgIHRyYWNrcyB0aGUgMS42LjAtZGV2LjEuMiBkYXJ0MmpzIHZlcnNpb24uCiBlbnZpcm9ubWVudDoKICAgc2RrOiAiPj0xLjAuMCA8Mi4wLjAiCmRpZmYgLS1naXQgYS9wa2cvaW50bC9DSEFOR0VMT0cubWQgYi9wa2cvaW50bC9DSEFOR0VMT0cubWQKaW5kZXggNjdjYWQwOC4uMTA4NWEyNCAxMDA2NDQKLS0tIGEvcGtnL2ludGwvQ0hBTkdFTE9HLm1kCisrKyBiL3BrZy9pbnRsL0NIQU5HRUxPRy5tZApAQCAtMSwzICsxLDkgQEAKKyMjIDAuMTEuMgorCisgKiBNaXNzZWQgY2Fub25pY2FsaXphdGlvbiBvZiBsb2NhbGVzIGluIG9uZSBwbGFjZSBpbiBtZXNzYWdlIGxpYnJhcnkgZ2VuZXJhdGlvbi4KKworICogQWRkZWQgYSBzaW1wbGUgZGVidWcgc2NyaXB0IGZvciBtZXNzYWdlX2V4dHJhY3Rpb25fdGVzdC4KKwogIyMgMC4xMS4xCiAKICAqIE5lZ2F0aXZlIG51bWJlcnMgd2VyZSBiZWluZyBwYXJzZWQgYXMgcG9zaXRpdmUuCmRpZmYgLS1naXQgYS9wa2cvaW50bC9saWIvZ2VuZXJhdGVfbG9jYWxpemVkLmRhcnQgYi9wa2cvaW50bC9saWIvZ2VuZXJhdGVfbG9jYWxpemVkLmRhcnQKaW5kZXggOWI4MDUxZC4uMDAwMzMzMSAxMDA2NDQKLS0tIGEvcGtnL2ludGwvbGliL2dlbmVyYXRlX2xvY2FsaXplZC5kYXJ0CisrKyBiL3BrZy9pbnRsL2xpYi9nZW5lcmF0ZV9sb2NhbGl6ZWQuZGFydApAQCAtMTgzLDcgKzE4Myw4IEBACiAgIH0KICAgb3V0cHV0LndyaXRlKCJcbiIpOwogICBvdXRwdXQud3JpdGUoIlxuTWFwPFN0cmluZywgRnVuY3Rpb24+IF9kZWZlcnJlZExpYnJhcmllcyA9IHtcbiIpOwotICBmb3IgKHZhciBsb2NhbGUgaW4gYWxsTG9jYWxlcykgeworICBmb3IgKHZhciByYXdMb2NhbGUgaW4gYWxsTG9jYWxlcykgeworICAgIHZhciBsb2NhbGUgPSBJbnRsLmNhbm9uaWNhbGl6ZWRMb2NhbGUocmF3TG9jYWxlKTsKICAgICBvdXRwdXQud3JpdGUoIiAgJyRsb2NhbGUnIDogKCkgPT4gJHtfbGlicmFyeU5hbWUobG9jYWxlKX0ubG9hZExpYnJhcnkoKSxcbiIpOwogICB9CiAgIG91dHB1dC53cml0ZSgifTtcbiIpOwpkaWZmIC0tZ2l0IGEvcGtnL2ludGwvcHVic3BlYy55YW1sIGIvcGtnL2ludGwvcHVic3BlYy55YW1sCmluZGV4IDZjMWYwYmUuLmZkZDk4NGYgMTAwNjQ0Ci0tLSBhL3BrZy9pbnRsL3B1YnNwZWMueWFtbAorKysgYi9wa2cvaW50bC9wdWJzcGVjLnlhbWwKQEAgLTEsNSArMSw1IEBACiBuYW1lOiBpbnRsCi12ZXJzaW9uOiAwLjExLjEKK3ZlcnNpb246IDAuMTEuMgogYXV0aG9yOiBEYXJ0IFRlYW0gPG1pc2NAZGFydGxhbmcub3JnPgogZGVzY3JpcHRpb246IENvbnRhaW5zIGNvZGUgdG8gZGVhbCB3aXRoIGludGVybmF0aW9uYWxpemVkL2xvY2FsaXplZCBtZXNzYWdlcywgZGF0ZSBhbmQgbnVtYmVyIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcsIGJpLWRpcmVjdGlvbmFsIHRleHQsIGFuZCBvdGhlciBpbnRlcm5hdGlvbmFsaXphdGlvbiBpc3N1ZXMuCiBob21lcGFnZTogaHR0cDovL3d3dy5kYXJ0bGFuZy5vcmcKZGlmZiAtLWdpdCBhL3BrZy9pbnRsL3Rlc3QvbWVzc2FnZV9leHRyYWN0aW9uL2RlYnVnLnNoIGIvcGtnL2ludGwvdGVzdC9tZXNzYWdlX2V4dHJhY3Rpb24vZGVidWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODJjOGI4NwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9pbnRsL3Rlc3QvbWVzc2FnZV9leHRyYWN0aW9uL2RlYnVnLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorIyBUaGUgbWVzc2FnZV9leHRyYWN0aW9uX3Rlc3QuZGFydCB0ZXN0IHVzZXMgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IGFuZCBzcGF3bnMgCisjIHNlcGFyYXRlIHByb2Nlc3NlcyBmb3IgZWFjaCBzdGVwLiBUaGlzIGNhbiBtYWtlIGl0IHZlcnkgcGFpbmZ1bCB0byBkZWJ1ZyB0aGUKKyMgc3RlcHMuIAorIyBUaGlzIHNjcmlwdCBydW5zIHRoZSBzdGVwcyBpbmRpdmlkdWFsbHksIHB1dHRpbmcgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50CisjIGRpcmVjdG9yeS4gWW91IGNhbiBydW4gdGhlIHNjcmlwdCB0byBydW4gdGhlIHRlc3QgbG9jYWxseSwgb3IgdXNlIHRoaXMgdG8KKyMgcnVuIGluZGl2aWR1YWwgc3RlcHMgb3IgY3JlYXRlIHRoZW0gYXMgbGF1bmNoZXMgaW4gdGhlIGVkaXRvci4KK2RhcnQgLi4vLi4vYmluL2V4dHJhY3RfdG9fYXJiLmRhcnQgc2FtcGxlX3dpdGhfbWVzc2FnZXMuZGFydCBcCitwYXJ0X29mX3NhbXBsZV93aXRoX21lc3NhZ2VzLmRhcnQKK2RhcnQgbWFrZV9oYXJkY29kZWRfdHJhbnNsYXRpb24uZGFydCBpbnRsX21lc3NhZ2VzLmFyYgorZGFydCAuLi8uLi9iaW4vZ2VuZXJhdGVfZnJvbV9hcmIuZGFydCAtLWdlbmVyYXRlZC1maWxlLXByZWZpeD1mb29fIFwKK3NhbXBsZV93aXRoX21lc3NhZ2VzLmRhcnQgcGFydF9vZl9zYW1wbGVfd2l0aF9tZXNzYWdlcy5kYXJ0IFwKK3RyYW5zbGF0aW9uX2ZyLmFyYiB0cmFuc2xhdGlvbl9kZV9ERS5hcmIKZGlmZiAtLWdpdCBhL3BrZy9vYnNlcnZlL0NIQU5HRUxPRy5tZCBiL3BrZy9vYnNlcnZlL0NIQU5HRUxPRy5tZAppbmRleCBiMzIzMDNhLi41M2E0MjVmIDEwMDY0NAotLS0gYS9wa2cvb2JzZXJ2ZS9DSEFOR0VMT0cubWQKKysrIGIvcGtnL29ic2VydmUvQ0hBTkdFTE9HLm1kCkBAIC0zLDYgKzMsMTEgQEAKIFRoaXMgZmlsZSBjb250YWlucyBoaWdobGlnaHRzIG9mIHdoYXQgY2hhbmdlcyBvbiBlYWNoIHZlcnNpb24gb2YgdGhlIG9ic2VydmUKIHBhY2thZ2UuCiAKKyMjIyMgUHViIHZlcnNpb24gMC4xMS4wLWRldgorICAqIFBhdGhPYnNlcnZlci52YWx1ZT0gbm8gbG9uZ2VyIGRpc2NhcmRzIGNoYW5nZXMgKHRoaXMgaXMgaW4gY29tYmluYXRpb24gd2l0aAorICAgIGEgY2hhbmdlIGluIHRlbXBsYXRlX2JpbmRpbmcgYW5kIHBvbHltZXIgdG8gaW1wcm92ZSBpbnRlcm9wIHdpdGggSlMgY3VzdG9tCisgICAgZWxlbWVudHMpLgorCiAjIyMjIFB1YiB2ZXJzaW9uIDAuMTAuMCszCiAgICogbWlub3IgY2hhbmdlcyB0byBkb2N1bWVudGF0aW9uLCBkZXByZWNhdGVkIGBkaXNjYXJkTGlzdENoYWdlc2AgaW4gZmF2b3Igb2YKICAgICBgZGlzY2FyZExpc3RDaGFuZ2VzYCAodGhlIGZvcm1lciBoYWQgYSB0eXBvKS4KZGlmZiAtLWdpdCBhL3BrZy9wa2cuc3RhdHVzIGIvcGtnL3BrZy5zdGF0dXMKaW5kZXggMWQ3Yzk3Yy4uNzk4ZjQzZCAxMDA2NDQKLS0tIGEvcGtnL3BrZy5zdGF0dXMKKysrIGIvcGtnL3BrZy5zdGF0dXMKQEAgLTQ4LDYgKzQ4LDcgQEAKIHBvbHltZXIvdGVzdC9yZWdpc3Rlcl90ZXN0OiBQYXNzLCBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxODkzMQogcG9seW1lci90ZXN0L3Rha2VfYXR0cmlidXRlc190ZXN0OiBQYXNzLCBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxODkzMQogcG9seW1lci90ZXN0L3RlbXBsYXRlX2Rpc3RyaWJ1dGVfZHluYW1pY190ZXN0OiBQYXNzLCBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxODkzMQorcG9seW1lci90ZXN0L3R3b193YXlfYmluZF90ZXN0OiBQYXNzLCBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxODkzMQogd2ViX2NvbXBvbmVudHMvdGVzdC9pbnRlcm9wX3Rlc3Q6IFBhc3MsIFJ1bnRpbWVFcnJvciAjIElzc3VlIDE4OTMxCiAKIFsgJGNvbXBpbGVyID09IG5vbmUgJiYgKCRydW50aW1lID09IGRhcnRpdW0pICYmICRtb2RlID09IGRlYnVnIF0KQEAgLTE3MSw2ICsxNzIsNyBAQAogcG9seW1lci90ZXN0L3JlZ2lzdGVyX3Rlc3Q6IFNraXAgI3VzZXMgZGFydDpodG1sCiBwb2x5bWVyL3Rlc3QvdGFrZV9hdHRyaWJ1dGVzX3Rlc3Q6IFNraXAgI3VzZXMgZGFydDpodG1sCiBwb2x5bWVyL3Rlc3QvdGVtcGxhdGVfZGlzdHJpYnV0ZV9keW5hbWljX3Rlc3Q6IFNraXAgI3VzZXMgZGFydDpodG1sCitwb2x5bWVyL3Rlc3QvdHdvX3dheV9iaW5kX3Rlc3Q6IFNraXAgI3VzZXMgZGFydDpodG1sCiBwb2x5bWVyL3Rlc3QvdW5iaW5kX3Rlc3Q6IFNraXAgIyB1c2VzIGRhcnQ6aHRtbAogdGhpcmRfcGFydHkvYW5ndWxhcl90ZXN0cy9icm93c2VyX3Rlc3Q6IFNraXAgIyB1c2VzIGRhcnQ6aHRtbAogd2ViX2NvbXBvbmVudHMvdGVzdC8qOiBTa2lwICMgdXNlcyBkYXJ0Omh0bWwKZGlmZiAtLWdpdCBhL3BrZy9wa2didWlsZC5zdGF0dXMgYi9wa2cvcGtnYnVpbGQuc3RhdHVzCmluZGV4IGUzNjI4ZjEuLjgzZGFmN2YgMTAwNjQ0Ci0tLSBhL3BrZy9wa2didWlsZC5zdGF0dXMKKysrIGIvcGtnL3BrZ2J1aWxkLnN0YXR1cwpAQCAtMTcsOSArMTcsNiBAQAogCiBbICR1c2VfcHVibGljX3BhY2thZ2VzIF0KIHNhbXBsZXMvdGhpcmRfcGFydHkvYW5ndWxhcl90b2RvOiBQYXNzLCBTbG93Ci1wa2cvdGVtcGxhdGVfYmluZGluZzogUHViR2V0RXJyb3IKLXBrZy9wb2x5bWVyX2V4cHJlc3Npb25zOiBQdWJHZXRFcnJvcgotcGtnL3BvbHltZXI6IFB1YkdldEVycm9yCiAKIFsgJHVzZV9wdWJsaWNfcGFja2FnZXMgJiYgJGJ1aWxkZXJfdGFnID09IHJ1c3NpYW4gXQogc2FtcGxlcy90aGlyZF9wYXJ0eS90b2RvbXZjOiBGYWlsICMgSXNzdWUgMTgxMDQKZGlmZiAtLWdpdCBhL3BrZy9wb2x5bWVyL0NIQU5HRUxPRy5tZCBiL3BrZy9wb2x5bWVyL0NIQU5HRUxPRy5tZAppbmRleCBhMjUwNzUyLi45N2NiNGQzIDEwMDY0NAotLS0gYS9wa2cvcG9seW1lci9DSEFOR0VMT0cubWQKKysrIGIvcGtnL3BvbHltZXIvQ0hBTkdFTE9HLm1kCkBAIC00LDYgKzQsMTEgQEAKIHBhY2thZ2UuIFdlIHdpbGwgYWxzbyBub3RlIGltcG9ydGFudCBjaGFuZ2VzIHRvIHRoZSBwb2x5ZmlsbCBwYWNrYWdlcyAob2JzZXJ2ZSwKIHdlYl9jb21wb25lbnRzLCBhbmQgdGVtcGxhdGVfYmluZGluZykgaWYgdGhleSBpbXBhY3QgcG9seW1lci4KIAorIyMjIyBQdWIgdmVyc2lvbiAwLjExLjEtZGV2CisgKiBVc2UgdGhlIGxhdGVzdCB0ZW1wbGF0ZV9iaW5kaW5nIHdpdGggYmV0dGVyIE5vZGVCaW5kIGludGVyb3Agc3VwcG9ydCAoZm9yCisgICB0d28td2F5IGJpbmRpbmdzIHdpdGggSlMgcG9seW1lciBlbGVtZW50cykuCisgKiBGaXggZm9yIFsxOTc3MF0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9kYXJ0L2lzc3Vlcy9kZXRhaWw/aWQ9MTk3NzApCisKICMjIyMgUHViIHZlcnNpb24gMC4xMS4wKzUKICAgKiBmaXhlcyB3ZWJfY29tcG9uZW50cyB2ZXJzaW9uIGluIGRlcGVuZGVuY2llcwogCmRpZmYgLS1naXQgYS9wa2cvcG9seW1lci9saWIvc3JjL2J1aWxkL2ltcG9ydF9pbmxpbmVyLmRhcnQgYi9wa2cvcG9seW1lci9saWIvc3JjL2J1aWxkL2ltcG9ydF9pbmxpbmVyLmRhcnQKaW5kZXggNzFhYjY3Yy4uMzE2N2YyNiAxMDA2NDQKLS0tIGEvcGtnL3BvbHltZXIvbGliL3NyYy9idWlsZC9pbXBvcnRfaW5saW5lci5kYXJ0CisrKyBiL3BrZy9wb2x5bWVyL2xpYi9zcmMvYnVpbGQvaW1wb3J0X2lubGluZXIuZGFydApAQCAtMjg5LDEzICsyODksMTggQEAKICAgX1VybE5vcm1hbGl6ZXIodGhpcy50cmFuc2Zvcm0sIHRoaXMuc291cmNlSWQpOwogCiAgIHZpc2l0RWxlbWVudChFbGVtZW50IG5vZGUpIHsKLSAgICBub2RlLmF0dHJpYnV0ZXMuZm9yRWFjaCgobmFtZSwgdmFsdWUpIHsKLSAgICAgIGlmIChfdXJsQXR0cmlidXRlcy5jb250YWlucyhuYW1lKSkgewotICAgICAgICBpZiAodmFsdWUgIT0gJycgJiYgIXZhbHVlLnRyaW0oKS5zdGFydHNXaXRoKCd7eycpKSB7Ci0gICAgICAgICAgbm9kZS5hdHRyaWJ1dGVzW25hbWVdID0gX25ld1VybCh2YWx1ZSwgbm9kZS5zb3VyY2VTcGFuKTsKKyAgICAvLyBUT0RPKGpha2VtYWMpOiBTdXBwb3J0IGN1c3RvbSBlbGVtZW50cyB0aGF0IGV4dGVuZCBodG1sIGVsZW1lbnRzIHdoaWNoCisgICAgLy8gaGF2ZSB1cmwtbGlrZSBhdHRyaWJ1dGVzLiBUaGlzIHByb2JhYmx5IG1lYW5zIGtlZXBpbmcgYSBsaXN0IG9mIHdoaWNoCisgICAgLy8gaHRtbCBlbGVtZW50cyBzdXBwb3J0IGVhY2ggdXJsLWxpa2UgYXR0cmlidXRlLgorICAgIGlmICghaXNDdXN0b21UYWdOYW1lKG5vZGUubG9jYWxOYW1lKSkgeworICAgICAgbm9kZS5hdHRyaWJ1dGVzLmZvckVhY2goKG5hbWUsIHZhbHVlKSB7CisgICAgICAgIGlmIChfdXJsQXR0cmlidXRlcy5jb250YWlucyhuYW1lKSkgeworICAgICAgICAgIGlmICh2YWx1ZSAhPSAnJyAmJiAhdmFsdWUudHJpbSgpLnN0YXJ0c1dpdGgoJ3t7JykpIHsKKyAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlc1tuYW1lXSA9IF9uZXdVcmwodmFsdWUsIG5vZGUuc291cmNlU3Bhbik7CisgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSk7CisgICAgICB9KTsKKyAgICB9CiAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09ICdzdHlsZScpIHsKICAgICAgIG5vZGUudGV4dCA9IHZpc2l0Q3NzKG5vZGUudGV4dCk7CiAgICAgfSBlbHNlIGlmIChub2RlLmxvY2FsTmFtZSA9PSAnc2NyaXB0JyAmJgpkaWZmIC0tZ2l0IGEvcGtnL3BvbHltZXIvdGVzdC9idWlsZC9pbXBvcnRfaW5saW5lcl90ZXN0LmRhcnQgYi9wa2cvcG9seW1lci90ZXN0L2J1aWxkL2ltcG9ydF9pbmxpbmVyX3Rlc3QuZGFydAppbmRleCA2NjNlMzUzLi4yZTU0MzdlIDEwMDY0NAotLS0gYS9wa2cvcG9seW1lci90ZXN0L2J1aWxkL2ltcG9ydF9pbmxpbmVyX3Rlc3QuZGFydAorKysgYi9wa2cvcG9seW1lci90ZXN0L2J1aWxkL2ltcG9ydF9pbmxpbmVyX3Rlc3QuZGFydApAQCAtMjAsNiArMjAsNyBAQAogICBncm91cCgncmVsPWltcG9ydCcsIGltcG9ydFRlc3RzKTsKICAgZ3JvdXAoJ3JlbD1zdHlsZXNoZWV0Jywgc3R5bGVzaGVldFRlc3RzKTsKICAgZ3JvdXAoJ3NjcmlwdCB0eXBlPWRhcnQnLCBjb2RlRXh0cmFjdG9yVGVzdHMpOworICBncm91cCgndXJsIGF0dHJpYnV0ZXMnLCB1cmxBdHRyaWJ1dGVUZXN0cyk7CiB9CiAKIHZvaWQgaW1wb3J0VGVzdHMoKSB7CkBAIC03NDAsMyArNzQxLDI4IEBACiAgICAgICAgICAgJ2gxIHsgZm9udC1zaXplOiA3MHB4OyB9JywKICAgICB9KTsKIH0KKwordm9pZCB1cmxBdHRyaWJ1dGVUZXN0cygpIHsKKworICB0ZXN0UGhhc2VzKCd1cmwgYXR0cmlidXRlcyBhcmUgbm9ybWFsaXplZCcsIHBoYXNlcywgeworICAgICAgJ2F8d2ViL3Rlc3QuaHRtbCc6CisgICAgICAgICAgJzwhRE9DVFlQRSBodG1sPjxodG1sPjxoZWFkPicKKyAgICAgICAgICAnPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImZvby90ZXN0XzEuaHRtbCI+JworICAgICAgICAgICc8bGluayByZWw9ImltcG9ydCIgaHJlZj0iZm9vL3Rlc3RfMi5odG1sIj4nCisgICAgICAgICAgJzwvaGVhZD48L2h0bWw+JywKKyAgICAgICdhfHdlYi9mb28vdGVzdF8xLmh0bWwnOgorICAgICAgICAgICc8c2NyaXB0IHNyYz0iYmF6LmpwZyI+PC9zY3JpcHQ+JywKKyAgICAgICdhfHdlYi9mb28vdGVzdF8yLmh0bWwnOgorICAgICAgICAgICc8Zm9vLWVsZW1lbnQgc3JjPSJiYXouanBnIj48L2Zvby1lbGVtZW50PicKKyAgICB9LCB7CisgICAgICAnYXx3ZWIvdGVzdC5odG1sJzoKKyAgICAgICAgICAnPCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PC9oZWFkPjxib2R5PicKKyAgICAgICAgICAnPHNjcmlwdCBzcmM9ImZvby9iYXouanBnIj48L3NjcmlwdD4nICAgICAgICAvLyBub3JtYWxpemVkCisgICAgICAgICAgJzxmb28tZWxlbWVudCBzcmM9ImJhei5qcGciPjwvZm9vLWVsZW1lbnQ+JyAgLy8gbGVmdCBhbG9uZSAoY3VzdG9tKQorICAgICAgICAgICc8L2JvZHk+PC9odG1sPicsCisgICAgICAnYXx3ZWIvZm9vL3Rlc3RfMS5odG1sJzoKKyAgICAgICAgICAnPHNjcmlwdCBzcmM9ImJhei5qcGciPjwvc2NyaXB0PicsCisgICAgICAnYXx3ZWIvZm9vL3Rlc3RfMi5odG1sJzoKKyAgICAgICAgICAnPGZvby1lbGVtZW50IHNyYz0iYmF6LmpwZyI+PC9mb28tZWxlbWVudD4nLAorICAgIH0pOyAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wa2cvcG9seW1lci90ZXN0L3R3b193YXlfYmluZF90ZXN0LmRhcnQgYi9wa2cvcG9seW1lci90ZXN0L3R3b193YXlfYmluZF90ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzNDdlNwotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9wb2x5bWVyL3Rlc3QvdHdvX3dheV9iaW5kX3Rlc3QuZGFydApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAnZGFydDphc3luYyc7CitpbXBvcnQgJ2RhcnQ6aHRtbCc7CitpbXBvcnQgJ3BhY2thZ2U6dW5pdHRlc3QvdW5pdHRlc3QuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6dW5pdHRlc3QvaHRtbF9jb25maWcuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6cG9seW1lci9wb2x5bWVyLmRhcnQnOworCitAQ3VzdG9tVGFnKCdpbm5lci1lbGVtZW50JykKK2NsYXNzIElubmVyRWxlbWVudCBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKKyAgQHB1Ymxpc2hlZCBpbnQgbnVtYmVyOworICBAcHVibGlzaGVkIGJvb2wgYm9vbGVhbjsKKyAgQHB1Ymxpc2hlZCBTdHJpbmcgc3RyaW5nOworCisgIElubmVyRWxlbWVudC5jcmVhdGVkKCkgOiBzdXBlci5jcmVhdGVkKCk7Cit9CisKK0BDdXN0b21UYWcoJ291dGVyLWVsZW1lbnQnKQorY2xhc3MgT3V0ZXJFbGVtZW50IGV4dGVuZHMgUG9seW1lckVsZW1lbnQgeworICBAb2JzZXJ2YWJsZSBpbnQgbnVtYmVyID0gMTsKKyAgQG9ic2VydmFibGUgYm9vbCBib29sZWFuID0gZmFsc2U7CisgIEBvYnNlcnZhYmxlIFN0cmluZyBzdHJpbmcgPSAnYSc7CisKKyAgT3V0ZXJFbGVtZW50LmNyZWF0ZWQoKSA6IHN1cGVyLmNyZWF0ZWQoKTsKK30KKworbWFpbigpID0+IGluaXRQb2x5bWVyKCkucnVuKCgpIHsKKyAgdXNlSHRtbENvbmZpZ3VyYXRpb24oKTsKKworICBzZXRVcCgoKSA9PiBQb2x5bWVyLm9uUmVhZHkpOworICAKKyAgdGVzdCgnaW5uZXIgZWxlbWVudCBnZXRzIGluaXRpYWwgdmFsdWVzJywgKCkgeworICAgIHZhciBvdXRlciA9IHF1ZXJ5U2VsZWN0b3IoJ291dGVyLWVsZW1lbnQnKTsKKyAgICB2YXIgaW5uZXIgPSBvdXRlci5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lubmVyLWVsZW1lbnQnKTsKKyAgICAKKyAgICBleHBlY3QoaW5uZXIubnVtYmVyLCAxKTsKKyAgICBleHBlY3QoaW5uZXIuYm9vbGVhbiwgZmFsc2UpOworICAgIGV4cGVjdChpbm5lci5zdHJpbmcsICdhJyk7CisgIH0pOworCisgIHRlc3QoJ2lubmVyIGVsZW1lbnQgdXBkYXRlcyB0aGUgb3V0ZXIgZWxlbWVudCcsICgpIHsKKyAgICB2YXIgb3V0ZXIgPSBxdWVyeVNlbGVjdG9yKCdvdXRlci1lbGVtZW50Jyk7CisgICAgdmFyIGlubmVyID0gb3V0ZXIuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbm5lci1lbGVtZW50Jyk7CisgICAgCisgICAgLy8gVG9nZ2xlIHRoZSB2YWx1ZSBpbiB0aGUgY2hpbGQgYW5kIG1ha2Ugc3VyZSB0aGF0IHByb3BhZ2F0ZXMgYXJvdW5kLgorICAgIGlubmVyLm51bWJlciA9IDI7CisgICAgaW5uZXIuYm9vbGVhbiA9IHRydWU7CisgICAgaW5uZXIuc3RyaW5nID0gJ2InOworICAgIHJldHVybiBuZXcgRnV0dXJlKCgpIHt9KS50aGVuKChfKSB7CisgICAgICBleHBlY3Qob3V0ZXIubnVtYmVyLCAyKTsKKyAgICAgIGV4cGVjdChvdXRlci5ib29sZWFuLCB0cnVlKTsKKyAgICAgIGV4cGVjdChvdXRlci5zdHJpbmcsICdiJyk7CisgICAgICAKKyAgICAgIGlubmVyLm51bWJlciA9IDE7CisgICAgICBpbm5lci5ib29sZWFuID0gZmFsc2U7CisgICAgICBpbm5lci5zdHJpbmcgPSAnYSc7CisgICAgfSkudGhlbigoXykgPT4gbmV3IEZ1dHVyZSgoKSB7fSkpLnRoZW4oKF8pIHsKKyAgICAgIGV4cGVjdChvdXRlci5udW1iZXIsIDEpOworICAgICAgZXhwZWN0KG91dGVyLmJvb2xlYW4sIGZhbHNlKTsKKyAgICAgIGV4cGVjdChvdXRlci5zdHJpbmcsICdhJyk7CisgICAgfSk7CisgIH0pOworICAKKyAgdGVzdCgnb3V0ZXIgZWxlbWVudCB1cGRhdGVzIHRoZSBpbm5lciBlbGVtZW50JywgKCkgeworICAgIHZhciBvdXRlciA9IHF1ZXJ5U2VsZWN0b3IoJ291dGVyLWVsZW1lbnQnKTsKKyAgICB2YXIgaW5uZXIgPSBvdXRlci5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ2lubmVyLWVsZW1lbnQnKTsKKyAgICAKKyAgICAvLyBUb2dnbGUgdGhlIHZhbHVlIGluIHRoZSBwYXJlbnQgYW5kIG1ha2Ugc3VyZSB0aGF0IHByb3BhZ2F0ZXMgYXJvdW5kLgorICAgIG91dGVyLm51bWJlciA9IDI7CisgICAgb3V0ZXIuYm9vbGVhbiA9IHRydWU7CisgICAgb3V0ZXIuc3RyaW5nID0gJ2InOworICAgIHJldHVybiBuZXcgRnV0dXJlKCgpIHt9KS50aGVuKChfKSB7CisgICAgICBleHBlY3QoaW5uZXIubnVtYmVyLCAyKTsKKyAgICAgIGV4cGVjdChpbm5lci5ib29sZWFuLCB0cnVlKTsKKyAgICAgIGV4cGVjdChpbm5lci5zdHJpbmcsICdiJyk7CisgICAgICAKKyAgICAgIG91dGVyLm51bWJlciA9IDE7CisgICAgICBvdXRlci5ib29sZWFuID0gZmFsc2U7CisgICAgICBvdXRlci5zdHJpbmcgPSAnYSc7CisgICAgfSkudGhlbigoXykgPT4gbmV3IEZ1dHVyZSgoKSB7fSkpLnRoZW4oKF8pIHsKKyAgICAgIGV4cGVjdChpbm5lci5udW1iZXIsIDEpOworICAgICAgZXhwZWN0KGlubmVyLmJvb2xlYW4sIGZhbHNlKTsKKyAgICAgIGV4cGVjdChpbm5lci5zdHJpbmcsICdhJyk7CisgICAgfSk7CisgIH0pOworfSk7CmRpZmYgLS1naXQgYS9wa2cvcG9seW1lci90ZXN0L3R3b193YXlfYmluZF90ZXN0Lmh0bWwgYi9wa2cvcG9seW1lci90ZXN0L3R3b193YXlfYmluZF90ZXN0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNGIyMQotLS0gL2Rldi9udWxsCisrKyBiL3BrZy9wb2x5bWVyL3Rlc3QvdHdvX3dheV9iaW5kX3Rlc3QuaHRtbApAQCAtMCwwICsxLDM5IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorICA8IS0tcG9seW1lci10ZXN0OiB0aGlzIGNvbW1lbnQgaXMgbmVlZGVkIGZvciB0ZXN0X3N1aXRlLmRhcnQtLT4KKyAgPGhlYWQ+CisgICAgPHRpdGxlPnR3byB3YXkgYmluZGluZ3M8L3RpdGxlPgorICAgIDxzY3JpcHQgc3JjPSJwYWNrYWdlcy93ZWJfY29tcG9uZW50cy9wbGF0Zm9ybS5qcyI+PC9zY3JpcHQ+CisgICAgPHNjcmlwdCBzcmM9InBhY2thZ2VzL3dlYl9jb21wb25lbnRzL2RhcnRfc3VwcG9ydC5qcyI+PC9zY3JpcHQ+CisgICAgPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9InBhY2thZ2VzL3BvbHltZXIvcG9seW1lci5odG1sIj4KKyAgICA8c2NyaXB0IHNyYz0iL3Jvb3RfZGFydC90b29scy90ZXN0aW5nL2RhcnQvdGVzdF9jb250cm9sbGVyLmpzIj48L3NjcmlwdD4KKyAgPC9oZWFkPgorCisgIDxib2R5PgorICAgIDxwb2x5bWVyLWVsZW1lbnQgbmFtZT0iaW5uZXItZWxlbWVudCI+CisgICAgICA8dGVtcGxhdGU+CisgICAgICAgIDxoMT5IZWxsbyBmcm9tIHRoZSBjaGlsZDwvaDE+CisgICAgICAgIDxwPlRoZSBudW1iZXIgaXMge3tudW1iZXJ9fTwvcD4KKyAgICAgICAgPHA+VGhlIGJvb2xlYW4gaXMge3tib29sZWFufX08L3A+CisgICAgICAgIDxwPlRoZSBzdHJpbmcgaXMge3tzdHJpbmd9fTwvcD4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgPC9wb2x5bWVyLWVsZW1lbnQ+CisKKyAgICA8cG9seW1lci1lbGVtZW50IG5hbWU9Im91dGVyLWVsZW1lbnQiPgorICAgICAgPHRlbXBsYXRlPgorICAgICAgICA8aDE+SGVsbG8gZnJvbSB0aGUgY3VzdG9tIGVsZW1lbnQ8L2gxPgorICAgICAgICA8cD5UaGUgbnVtYmVyIGlzIHt7bnVtYmVyfX08L3A+CisgICAgICAgIDxwPlRoZSBib29sZWFuIGlzIHt7Ym9vbGVhbn19PC9wPgorICAgICAgICA8cD5UaGUgc3RyaW5nIGlzIHt7c3RyaW5nfX08L3A+CisgICAgICAgIDxwPgorICAgICAgICAgIDxpbm5lci1lbGVtZW50IGlkPSJjaGlsZCIgbnVtYmVyPSJ7e251bWJlcn19IgorICAgICAgICAgICAgICBib29sZWFuPSJ7e2Jvb2xlYW59fSIgc3RyaW5nPSJ7e3N0cmluZ319Ij48L2lubmVyLWVsZW1lbnQ+CisgICAgICAgIDwvcD4KKyAgICAgIDwvdGVtcGxhdGU+CisgICAgPC9wb2x5bWVyLWVsZW1lbnQ+CisKKyAgICA8b3V0ZXItZWxlbWVudD48L291dGVyLWVsZW1lbnQ+CisKKyAgICA8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0idHdvX3dheV9iaW5kX3Rlc3QuZGFydCI+PC9zY3JpcHQ+CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3BrZy9wb2x5bWVyX2V4cHJlc3Npb25zL0NIQU5HRUxPRy5tZCBiL3BrZy9wb2x5bWVyX2V4cHJlc3Npb25zL0NIQU5HRUxPRy5tZAppbmRleCA5MDlmY2MxLi44NjgzZjU1IDEwMDY0NAotLS0gYS9wa2cvcG9seW1lcl9leHByZXNzaW9ucy9DSEFOR0VMT0cubWQKKysrIGIvcGtnL3BvbHltZXJfZXhwcmVzc2lvbnMvQ0hBTkdFTE9HLm1kCkBAIC0zLDYgKzMsMTAgQEAKIFRoaXMgZmlsZSBjb250YWlucyBoaWdobGlnaHRzIG9mIHdoYXQgY2hhbmdlcyBvbiBlYWNoIHZlcnNpb24gb2YgdGhlCiBwb2x5bWVyX2V4cHJlc3Npb25zIHBhY2thZ2UuCiAKKyMjIyMgUHViIHZlcnNpb24gMC4xMi4wLWRldgorICAqIFVwZGF0ZWQgdG8gZGVwZW5kIG9uIGxhdGVzdCB0ZW1wbGF0ZV9iaW5kaW5nIGFuZCBvYnNlcnZlLiBTZXR0aW5nIGEgdmFsdWUgb24KKyAgICBhIHBvbHltZXIgZXhwcmVzc2lvbiBiaW5kaW5nIG5vdyBwcm9kdWNlcyBhIGNoYW5nZSBub3RpZmljYXRpb24uCisKICMjIyMgUHViIHZlcnNpb24gMC4xMS4wCiAgICogUmVtb3ZlIGZhdWx0eSBhc3NlcnQgdGhhdCB0aHJldyB3aGVuIGFuIGl0ZXJhYmxlIGZpZWxkIHdhcyB1cGRhdGVkLgogICAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL2RiZ19tZXNzYWdlLmNjIGIvcnVudGltZS9iaW4vZGJnX21lc3NhZ2UuY2MKaW5kZXggMjhmZThhZC4uMTEzNWM1MiAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vZGJnX21lc3NhZ2UuY2MKKysrIGIvcnVudGltZS9iaW4vZGJnX21lc3NhZ2UuY2MKQEAgLTQ0Nyw2ICs0NDcsOSBAQAogICBpbnRwdHJfdCB0cmFjZV9sZW4gPSAwOwogICBEYXJ0X0hhbmRsZSByZXMgPSBEYXJ0X1N0YWNrVHJhY2VMZW5ndGgodHJhY2UsICZ0cmFjZV9sZW4pOwogICBBU1NFUlRfTk9UX0VSUk9SKHJlcyk7CisgIGlmICh0cmFjZV9sZW4gPT0gMCkgeworICAgIHJldHVybjsKKyAgfQogICBEYXJ0X0FjdGl2YXRpb25GcmFtZSBmcmFtZTsKICAgcmVzID0gRGFydF9HZXRBY3RpdmF0aW9uRnJhbWUodHJhY2UsIDAsICZmcmFtZSk7CiAgIEFTU0VSVF9OT1RfRVJST1IocmVzKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4Lmh0bWwgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleC5odG1sCmluZGV4IGZkMTE4NDQuLmEzNDQyNTUgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4Lmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvaW5kZXguaHRtbApAQCAtMzEzMSwxNCArMzEzMSwxNCBAQAogICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiB9CiA8L3N0eWxlPjwhLS0gVGhlc2UgY29tbWVudHMgYXJlIGhlcmUgdG8gYWxsb3cgbmV3bGluZXMuCi0gICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgaXNEYXJ0IH19Ij48IS0tCi0gICAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJmFtcDsmYW1wOyAhaGFzUGFyZW50ICZhbXA7JmFtcDsgaGFzQ2xhc3MgfX0iPjwhLS0KLSAgICAgICAtLT48Y2xhc3MtcmVmIHJlZj0ie3sgcmVmWydvd25lciddIH19Ij48L2NsYXNzLXJlZj4uPC90ZW1wbGF0ZT48IS0tCi0gICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICZhbXA7JmFtcDsgaGFzUGFyZW50IH19Ij48IS0tCi0gICAgICAgLS0+PGZ1bmN0aW9uLXJlZiByZWY9Int7IHJlZlsncGFyZW50J10gfX0iIHF1YWxpZmllZD0ie3sgdHJ1ZSB9fSI+CisgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcmVmLmlzRGFydCB9fSI+PCEtLQorICAgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICZhbXA7JmFtcDsgcmVmLnBhcmVudCA9PSBudWxsICZhbXA7JmFtcDsgcmVmLm93bmluZ0NsYXNzICE9IG51bGwgfX0iPjwhLS0KKyAgICAgICAtLT48Y2xhc3MtcmVmIHJlZj0ie3sgcmVmLm93bmluZ0NsYXNzXSB9fSI+PC9jbGFzcy1yZWY+LjwvdGVtcGxhdGU+PCEtLQorICAgICAtLT48dGVtcGxhdGUgaWY9Int7IHF1YWxpZmllZCAmYW1wOyZhbXA7IHJlZi5wYXJlbnQgIT0gbnVsbCB9fSI+PCEtLQorICAgICAgIC0tPjxmdW5jdGlvbi1yZWYgcmVmPSJ7eyByZWYucGFyZW50IH19IiBxdWFsaWZpZWQ9Int7IHRydWUgfX0iPgogICAgICAgICAgIDwvZnVuY3Rpb24tcmVmPi48IS0tCiAgICAgIC0tPjwvdGVtcGxhdGU+PGEgb24tY2xpY2s9Int7IGdvdG8gfX0iIGhyZWY9Int7IHVybCB9fSI+e3sgbmFtZSB9fTwvYT48IS0tCi0gIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhaXNEYXJ0IH19Ij48c3Bhbj4ge3sgbmFtZSB9fTwvc3Bhbj48L3RlbXBsYXRlPjwvdGVtcGxhdGU+CisgIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhcmVmLmlzRGFydCB9fSI+PHNwYW4+IHt7IG5hbWUgfX08L3NwYW4+PC90ZW1wbGF0ZT48L3RlbXBsYXRlPgogPC9wb2x5bWVyLWVsZW1lbnQ+CiAKIApAQCAtMzQxMiwyNiArMzQxMiw2NSBAQAogICAgICAgICBwYWRkaW5nLWxlZnQ6IDE1JTsKICAgICAgICAgcGFkZGluZy1yaWdodDogMTUlOwogICAgICAgfQotICAgICAgLmdyYXlCb3ggeworICAgICAgLnNvdXJjZUJveCB7CiAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgICBwYWRkaW5nOiAxMHB4OwotICAgICB9CisgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CisgICAgICB9CisgICAgICAuc291cmNlVGFibGUgeworICAgICAgICBkaXNwbGF5OiB0YWJsZTsKKyAgICAgIH0KKyAgICAgIC5zb3VyY2VSb3cgeworICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CisgICAgICB9CisgICAgICAuc291cmNlSXRlbSwgLnNvdXJjZUl0ZW1DdXJyZW50IHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgZm9udDogNDAwIDE0cHggY29uc29sYXMsIGNvdXJpZXIsIG1vbm9zcGFjZTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDEyNSU7CisgICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CisgICAgICB9CisgICAgICAuc291cmNlSXRlbUN1cnJlbnQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmNmOworICAgICAgfQorICAgICAgLmhpdHNOb25lLCAuaGl0c05vdEV4ZWN1dGVkLCAuaGl0c0V4ZWN1dGVkIHsKKyAgICAgICAgbWluLXdpZHRoOiAzMnB4OworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgIH0KKyAgICAgIC5oaXRzTm90RXhlY3V0ZWQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTY2OworICAgICAgfQorICAgICAgLmhpdHNFeGVjdXRlZCB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2ZDY7CisgICAgICB9CiAgICAgPC9zdHlsZT4KICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJbnNldCI+CiAgICAgICA8Y29udGVudD48L2NvbnRlbnQ+Ci0gICAgICA8ZGl2IGNsYXNzPSJncmF5Qm94Ij4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0Ym9keT4KLSAgICAgICAgICAgIDx0ciB0ZW1wbGF0ZT0iIiByZXBlYXQ9Int7IGxpbmVOdW1iZXIgaW4gbGluZU51bWJlcnMgfX0iPgotICAgICAgICAgICAgICA8dGQgc3R5bGU9Int7IHN0eWxlRm9ySGl0cyhzY3JpcHQubGluZXNbbGluZU51bWJlcl0uaGl0cykgfX0iPjxzcGFuPiAgPC9zcGFuPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCBzdHlsZT0iZm9udC1mYW1pbHk6IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7Zm9udC1zaXplOiAxZW07bGluZS1oZWlnaHQ6IDEuMmVtO3doaXRlLXNwYWNlOiBub3dyYXA7Ij57e3NjcmlwdC5saW5lc1tsaW5lTnVtYmVyXS5saW5lfX08L3RkPgotICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgICAgPHRkIHdpZHRoPSI5OSUiIHN0eWxlPSJmb250LWZhbWlseTogY29uc29sYXMsIGNvdXJpZXIsIG1vbm9zcGFjZTtmb250LXNpemU6IDFlbTtsaW5lLWhlaWdodDogMS4yZW07d2hpdGUtc3BhY2U6IHByZTsiPnt7c2NyaXB0LmxpbmVzW2xpbmVOdW1iZXJdLnRleHR9fTwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGJvZHk+Ci0gICAgICAgIDwvdGFibGU+CisgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VCb3giIHN0eWxlPSJoZWlnaHQ6e3toZWlnaHR9fSI+CisgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZVRhYmxlIj4KKyAgICAgICAgICA8dGVtcGxhdGUgcmVwZWF0PSJ7eyBsaW5lIGluIGxpbmVzIH19Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZVJvdyIgaWQ9Int7IG1ha2VMaW5lSWQobGluZS5saW5lKSB9fSI+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID09IG51bGwgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhpdHNOb25lIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmhpdHMgPT0gMCB9fSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGl0c05vdEV4ZWN1dGVkIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmhpdHMgPiAwIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXRzRXhlY3V0ZWQiPnt7IGxpbmUubGluZSB9fTwvZGl2PgorICAgICAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJdGVtIj4mbmJzcDs8L2Rpdj4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmxpbmUgPT0gY3VycmVudExpbmUgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImN1cnJlbnRMaW5lIiBjbGFzcz0ic291cmNlSXRlbUN1cnJlbnQiPnt7bGluZS50ZXh0fX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmxpbmUgIT0gY3VycmVudExpbmUgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZUl0ZW0iPnt7bGluZS50ZXh0fX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgIDwvZGl2PgogICAgICAgPC9kaXY+CiAgICAgPC9kaXY+CiAgIDwvdGVtcGxhdGU+CkBAIC00MTE3LDcgKzQxNTYsNyBAQAogICAgIDwvZGl2PgogCiAgICAgPGhyPgotICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBjbHMuc2NyaXB0IH19IiBwb3M9Int7IGNscy50b2tlblBvcyB9fSIgZW5kcG9zPSJ7eyBjbHMuZW5kVG9rZW5Qb3MgfX0iPgorICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBjbHMuc2NyaXB0IH19IiBzdGFydHBvcz0ie3sgY2xzLnRva2VuUG9zIH19IiBlbmRwb3M9Int7IGNscy5lbmRUb2tlblBvcyB9fSI+CiAgICAgPC9zY3JpcHQtaW5zZXQ+CiAKICAgICA8YnI+PGJyPjxicj48YnI+CkBAIC00MTI4LDYgKzQxNjcsNyBAQAogCiAKIAorCiA8cG9seW1lci1lbGVtZW50IG5hbWU9ImNvZGUtcmVmIiBleHRlbmRzPSJzZXJ2aWNlLXJlZiI+CiAgIDx0ZW1wbGF0ZT4KICAgICA8c3R5bGU+CkBAIC00Njk4LDcgKzQ3MzgsNyBAQAogICAgIDxuYXYtYmFyPgogICAgICAgPHRvcC1uYXYtbWVudT48L3RvcC1uYXYtbWVudT4KICAgICAgIDxpc29sYXRlLW5hdi1tZW51IGlzb2xhdGU9Int7IGNvZGUuaXNvbGF0ZSB9fSI+PC9pc29sYXRlLW5hdi1tZW51PgotICAgICAgPG5hdi1tZW51IGxpbms9Ii4iIGFuY2hvcj0ie3sgY29kZS5uYW1lIH19IiBsYXN0PSJ7eyB0cnVlIH19Ij48L25hdi1tZW51PgorICAgICAgPG5hdi1tZW51IGxpbms9Int7IGNvZGUubGluayB9fSIgYW5jaG9yPSJ7eyBjb2RlLm5hbWUgfX0iIGxhc3Q9Int7IHRydWUgfX0iPjwvbmF2LW1lbnU+CiAgICAgICA8bmF2LXJlZnJlc2ggY2FsbGJhY2s9Int7IHJlZnJlc2ggfX0iPjwvbmF2LXJlZnJlc2g+CiAgICAgICA8bmF2LWNvbnRyb2w+PC9uYXYtY29udHJvbD4KICAgICA8L25hdi1iYXI+CkBAIC02NTE2LDEyICs2NTU2LDEyIEBACiAgICAgPG5hdi1iYXI+CiAgICAgICA8dG9wLW5hdi1tZW51PjwvdG9wLW5hdi1tZW51PgogICAgICAgPGlzb2xhdGUtbmF2LW1lbnUgaXNvbGF0ZT0ie3sgZnVuY3Rpb24uaXNvbGF0ZSB9fSI+PC9pc29sYXRlLW5hdi1tZW51PgotICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSA9PSAnQ2xhc3MnIH19Ij4KKyAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgIT0gbnVsbCB9fSI+CiAgICAgICAgIDwhLS0gVE9ETyh0dXJuaWRnZSk6IEFkZCBsaWJyYXJ5IG5hdiBtZW51IGhlcmUuIC0tPgotICAgICAgICA8Y2xhc3MtbmF2LW1lbnUgY2xzPSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9jbGFzcy1uYXYtbWVudT4KKyAgICAgICAgPGNsYXNzLW5hdi1tZW51IGNscz0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgfX0iPjwvY2xhc3MtbmF2LW1lbnU+CiAgICAgICA8L3RlbXBsYXRlPgotICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSA9PSAnTGlicmFyeScgfX0iPgotICAgICAgICA8bGlicmFyeS1uYXYtbWVudSBsaWJyYXJ5PSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9saWJyYXJ5LW5hdi1tZW51PgorICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5ICE9IG51bGwgfX0iPgorICAgICAgICA8bGlicmFyeS1uYXYtbWVudSBsaWJyYXJ5PSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5IH19Ij48L2xpYnJhcnktbmF2LW1lbnU+CiAgICAgICA8L3RlbXBsYXRlPgogICAgICAgPG5hdi1tZW51IGxpbms9Int7IGZ1bmN0aW9uLmxpbmsgfX0iIGFuY2hvcj0ie3sgZnVuY3Rpb24ubmFtZSB9fSIgbGFzdD0ie3sgdHJ1ZSB9fSI+PC9uYXYtbWVudT4KICAgICAgIDxuYXYtcmVmcmVzaCBjYWxsYmFjaz0ie3sgcmVmcmVzaCB9fSI+PC9uYXYtcmVmcmVzaD4KQEAgLTY1MjksNzggKzY1NjksNzggQEAKICAgICA8L25hdi1iYXI+CiAKICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KLSAgICAgIDxoMT5mdW5jdGlvbiB7eyBxdWFsaWZpZWROYW1lIH19PC9oMT4KKyAgICAgIDxoMT5mdW5jdGlvbiB7eyBmdW5jdGlvbi5xdWFsaWZpZWROYW1lIH19PC9oMT4KIAogICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTGlzdCI+CiAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPmtpbmQ8L2Rpdj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydpc19zdGF0aWMnXSB9fSI+c3RhdGljPC90ZW1wbGF0ZT4KLSAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ2lzX2NvbnN0J10gfX0iPmNvbnN0PC90ZW1wbGF0ZT4KLSAgICAgICAgICAgIHt7IGtpbmQgfX0KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24uaXNTdGF0aWMgfX0iPnN0YXRpYzwvdGVtcGxhdGU+CisgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLmlzQ29uc3QgfX0iPmNvbnN0PC90ZW1wbGF0ZT4KKyAgICAgICAgICAgIHt7IGZ1bmN0aW9uLmtpbmQudG9TdHJpbmcoKSB9fQogICAgICAgICAgIDwvZGl2PgogICAgICAgICA8L2Rpdj4KLSAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsncGFyZW50J10gIT0gbnVsbCB9fSI+CisgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ucGFyZW50ICE9IG51bGwgfX0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+cGFyZW50IGZ1bmN0aW9uPC9kaXY+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICAgIDxmdW5jdGlvbi1yZWYgcmVmPSJ7eyBmdW5jdGlvblsncGFyZW50J10gfX0iPjwvZnVuY3Rpb24tcmVmPgorICAgICAgICAgICAgICA8ZnVuY3Rpb24tcmVmIHJlZj0ie3sgZnVuY3Rpb24ucGFyZW50IH19Ij48L2Z1bmN0aW9uLXJlZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgIDwvZGl2PgogICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5vd25lcjwvZGl2PgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10uc2VydmljZVR5cGUgPT0gJ0NsYXNzJyB9fSI+Ci0gICAgICAgICAgICAgIDxjbGFzcy1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9jbGFzcy1yZWY+CisgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLm93bmluZ0NsYXNzICE9IG51bGwgfX0iPgorICAgICAgICAgICAgICA8Y2xhc3MtcmVmIHJlZj0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgfX0iPjwvY2xhc3MtcmVmPgogICAgICAgICAgICAgPC90ZW1wbGF0ZT4KLSAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10uc2VydmljZVR5cGUgIT0gJ0NsYXNzJyB9fSI+Ci0gICAgICAgICAgICAgIDxsaWJyYXJ5LXJlZiByZWY9Int7IGZ1bmN0aW9uWydvd25lciddIH19Ij48L2xpYnJhcnktcmVmPgorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5ICE9IG51bGwgfX0iPgorICAgICAgICAgICAgICA8bGlicmFyeS1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5IH19Ij48L2xpYnJhcnktcmVmPgogICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+CiAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPnNjcmlwdDwvZGl2PgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgIDxzY3JpcHQtcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ3NjcmlwdCddIH19IiBwb3M9Int7IGZ1bmN0aW9uWyd0b2tlblBvcyddIH19Ij4KKyAgICAgICAgICAgIDxzY3JpcHQtcmVmIHJlZj0ie3sgZnVuY3Rpb24uc2NyaXB0IH19IiBwb3M9Int7IGZ1bmN0aW9uLnRva2VuUG9zIH19Ij4KICAgICAgICAgICAgIDwvc2NyaXB0LXJlZj4KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+CiAKICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+Jm5ic3A7PC9kaXY+CiAKLSAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnY29kZSddICE9IG51bGwgfX0iPgorICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLmNvZGUgIT0gbnVsbCB9fSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5vcHRpbWl6ZWQgY29kZTwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnY29kZSddIH19Ij48L2NvZGUtcmVmPgorICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5jb2RlIH19Ij48L2NvZGUtcmVmPgogICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ3Vub3B0aW1pemVkX2NvZGUnXSAhPSBudWxsIH19Ij4KKyAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi51bm9wdGltaXplZENvZGUgIT0gbnVsbCB9fSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj51bm9wdGltaXplZCBjb2RlPC9kaXY+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICAgIDxjb2RlLXJlZiByZWY9Int7IGZ1bmN0aW9uWyd1bm9wdGltaXplZF9jb2RlJ10gfX0iPjwvY29kZS1yZWY+CisgICAgICAgICAgICAgIDxjb2RlLXJlZiByZWY9Int7IGZ1bmN0aW9uLnVub3B0aW1pemVkQ29kZSB9fSI+PC9jb2RlLXJlZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlRoaXMgY291bnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBhIGZ1bmN0aW9uIHdpbGwgYmUgb3B0aW1pemVkLiAgSXQgaXMgYSBjb21iaW5hdGlvbiBvZiBjYWxsIGNvdW50cyBhbmQgb3RoZXIgZmFjdG9ycy4iPgotICAgICAgICAgICAgICAgICAgKHVzYWdlIGNvdW50OiB7eyBmdW5jdGlvblsndXNhZ2VfY291bnRlciddIH19KQorICAgICAgICAgICAgICAgICAgKHVzYWdlIGNvdW50OiB7eyBmdW5jdGlvbi51c2FnZUNvdW50ZXIgfX0pCiAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+ZGVvcHRpbWl6YXRpb25zPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnZGVvcHRpbWl6YXRpb25zJ10gfX08L2Rpdj4KKyAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uLmRlb3B0aW1pemF0aW9ucyB9fTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3B0aW1pemFibGU8L2Rpdj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uWydpc19vcHRpbWl6YWJsZSddIH19PC9kaXY+CisgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvbi5pc09wdGltaXphYmxlIH19PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5pbmxpbmFibGU8L2Rpdj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uWydpc19pbmxpbmFibGUnXSB9fTwvZGl2PgorICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb24uaXNJbmxpbmFibGUgfX08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5uYW1lICE9IGZ1bmN0aW9uLnZtTmFtZSB9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgpAQCAtNjYxMiw3ICs2NjUyLDcgQEAKICAgICA8L2Rpdj4KIAogICAgIDxocj4KLSAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgZnVuY3Rpb25bJ3NjcmlwdCddIH19IiBwb3M9Int7IGZ1bmN0aW9uWyd0b2tlblBvcyddIH19IiBlbmRwb3M9Int7IGZ1bmN0aW9uWydlbmRUb2tlblBvcyddIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgZnVuY3Rpb24uc2NyaXB0IH19IiBzdGFydHBvcz0ie3sgZnVuY3Rpb24udG9rZW5Qb3MgfX0iIGVuZHBvcz0ie3sgZnVuY3Rpb24uZW5kVG9rZW5Qb3MgfX0iPgogICAgIDwvc2NyaXB0LWluc2V0PgogCiAgICAgPGJyPgpAQCAtMTM0MzgsNyArMTM0NzgsNyBAQAogCiAgICAgPHRlbXBsYXRlIGlmPSJ7eyBpc29sYXRlLnRvcEZyYW1lICE9IG51bGwgfX0iPgogICAgICAgPGJyPgotICAgICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3NjcmlwdCddIH19IiBwb3M9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3Rva2VuUG9zJ10gfX0iPgorICAgICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3NjcmlwdCddIH19IiBjdXJyZW50cG9zPSJ7eyBpc29sYXRlLnRvcEZyYW1lWyd0b2tlblBvcyddIH19IiBoZWlnaHQ9IjIwMHB4Ij4KICAgICAgIDwvc2NyaXB0LWluc2V0PgogICAgIDwvdGVtcGxhdGU+CiAKQEAgLTE1NTk5LDkgKzE1NjM5LDE4IEBACiAgICAgPG5hdi1jb250cm9sPjwvbmF2LWNvbnRyb2w+CiAgIDwvbmF2LWJhcj4KIAotICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iIHBvcz0ie3sgc2NyaXB0LmZpcnN0VG9rZW5Qb3MgfX0iIGVuZHBvcz0ie3sgc2NyaXB0Lmxhc3RUb2tlblBvcyB9fSI+Ci0gIDxoMT5zY3JpcHQge3sgc2NyaXB0Lm5hbWUgfX08L2gxPgotICA8L3NjcmlwdC1pbnNldD4KKyAgPHRlbXBsYXRlIGlmPSJ7eyBhcmdzWydwb3MnXSA9PSBudWxsIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iPgorICAgICAgPGgxPnNjcmlwdCB7eyBzY3JpcHQubmFtZSB9fTwvaDE+CisgICAgPC9zY3JpcHQtaW5zZXQ+CisgIDwvdGVtcGxhdGU+CisKKyAgPHRlbXBsYXRlIGlmPSJ7eyBhcmdzWydwb3MnXSAhPSBudWxsIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iIGN1cnJlbnRwb3M9Int7IGFyZ3NbJ3BvcyddIHwgcGFyc2VJbnQgfX0iPgorICAgICAgPGgxPnNjcmlwdCB7eyBzY3JpcHQubmFtZSB9fTwvaDE+CisgICAgPC9zY3JpcHQtaW5zZXQ+CisgIDwvdGVtcGxhdGU+CisKIDwvdGVtcGxhdGU+CiA8L3BvbHltZXItZWxlbWVudD4KIApAQCAtMTU2MTAsNiArMTU2NTksNyBAQAogCiAKIAorCiA8cG9seW1lci1lbGVtZW50IG5hbWU9InN0YWNrLXRyYWNlIiBleHRlbmRzPSJvYnNlcnZhdG9yeS1lbGVtZW50Ij4KICAgPHRlbXBsYXRlPgogICAgIDxzdHlsZT4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4Lmh0bWxfYm9vdHN0cmFwLmRhcnQuanMgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleC5odG1sX2Jvb3RzdHJhcC5kYXJ0LmpzCmluZGV4IGFiNGU0MjUuLjc1NGE3NWYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4Lmh0bWxfYm9vdHN0cmFwLmRhcnQuanMKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvaW5kZXguaHRtbF9ib290c3RyYXAuZGFydC5qcwpAQCAtMTkzLDIzICsxOTMsMjMgQEAKICJeIjoiYTsiLAogbjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09Yn0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEoYSl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEguYTUoYSl9LAotVDpbZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpLG51bGwpKX0sIiQxIiwiZ3hLIiwyLDAsbnVsbCw2OV0sCi1nYng6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmN1KEguYjcoYSksbnVsbCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBILmE1KGEpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCitUOltmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLmxyKGEsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCksbnVsbCkpfSwiJDEiLCJneEsiLDIsMCxudWxsLDcwXSwKK2dieDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguY3UoSC53TyhhKSxudWxsKX0sCiAiJSI6IkRPTUltcGxlbWVudGF0aW9ufE5hdmlnYXRvcnxTVkdBbmltYXRlZEVudW1lcmF0aW9ufFNWR0FuaW1hdGVkTGVuZ3RofFNWR0FuaW1hdGVkTGVuZ3RoTGlzdHxTVkdBbmltYXRlZE51bWJlcnxTVkdBbmltYXRlZE51bWJlckxpc3R8U1ZHQW5pbWF0ZWRTdHJpbmcifSwKIHlFZTp7CiAiXiI6Ikd2OyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gU3RyaW5nKGEpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIGE/NTE5MDE4OjIxODE1OX0sCiBnYng6ZnVuY3Rpb24oYSl7cmV0dXJuIEMuSEx9LAogJGlzYTI6dHJ1ZX0sCiBDRFU6ewogIl4iOiJHdjsiLAogbjpmdW5jdGlvbihhLGIpe3JldHVybiBudWxsPT1ifSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAogZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBDLkdYfSwKLVQ6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouR3YucHJvdG90eXBlLlQuY2FsbCh0aGlzLGEsYil9LCIkMSIsImd4SyIsMiwwLG51bGwsNjldfSwKK1Q6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouR3YucHJvdG90eXBlLlQuY2FsbCh0aGlzLGEsYil9LCIkMSIsImd4SyIsMiwwLG51bGwsNzBdfSwKIFVlMTp7CiAiXiI6Ikd2OyIsCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LApAQCAtMjQzLDcgKzI0Myw3IEBACiBmb3Ioej1KLm1ZKGIpO3ouRygpOyl0aGlzLmgoYSx6LmdsKCkpfSwKIFYxOmZ1bmN0aW9uKGEpe3RoaXMuc0IoYSwwKX0sCiBhTjpmdW5jdGlvbihhLGIpe3JldHVybiBILmJRKGEsYil9LAotZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguQTgoYSxiKSxbbnVsbCxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImZRIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoidWIiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwiUSIpfSwzMV0sCitlejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5BOChhLGIpLFtudWxsLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiZlEiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJKbSIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJRIil9LDMxXSwKIHpWOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKIHo9YS5sZW5ndGgKIHk9QXJyYXkoeikKQEAgLTI1NiwxMSArMjU2LDExIEBACiByZXR1cm4gYVtiXX0sCiBhTTpmdW5jdGlvbihhLGIsYyl7aWYoYjwwfHxiPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGIsMCxhLmxlbmd0aCkpCiBpZihjPGJ8fGM+YS5sZW5ndGgpdGhyb3cgSC5iKFAuVEUoYyxiLGEubGVuZ3RoKSkKLWlmKGI9PT1jKXJldHVybiBILlZNKFtdLFtILktwKGEsMCldKQotcmV0dXJuIEguVk0oYS5zbGljZShiLGMpLFtILktwKGEsMCldKX0sCitpZihiPT09YylyZXR1cm4gSC5WTShbXSxbSC5PcShhLDApXSkKK3JldHVybiBILlZNKGEuc2xpY2UoYixjKSxbSC5PcShhLDApXSl9LAogTXU6ZnVuY3Rpb24oYSxiLGMpe0gueEYoYSxiLGMpCiByZXR1cm4gSC5jMShhLGIsYyxudWxsKX0sCi1ndEg6ZnVuY3Rpb24oYSl7aWYoYS5sZW5ndGg+MClyZXR1cm4gYVswXQorZ1R3OmZ1bmN0aW9uKGEpe2lmKGEubGVuZ3RoPjApcmV0dXJuIGFbMF0KIHRocm93IEguYihQLncoIk5vIGVsZW1lbnRzIikpfSwKIGdyWjpmdW5jdGlvbihhKXt2YXIgej1hLmxlbmd0aAogaWYoej4wKXJldHVybiBhW3otMV0KQEAgLTI4NSwxNyArMjg1LDE3IEBACiByZXR1cm4hMX0sCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoPT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RoIT09MH0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC5XRShhLCJbIiwiXSIpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiB0dDpmdW5jdGlvbihhLGIpe3ZhciB6Ci1pZihiKXJldHVybiBILlZNKGEuc2xpY2UoKSxbSC5LcChhLDApXSkKLWVsc2V7ej1ILlZNKGEuc2xpY2UoKSxbSC5LcChhLDApXSkKK2lmKGIpcmV0dXJuIEguVk0oYS5zbGljZSgpLFtILk9xKGEsMCldKQorZWxzZXt6PUguVk0oYS5zbGljZSgpLFtILk9xKGEsMCldKQogei5maXhlZCRsZW5ndGg9aW5pdAogcmV0dXJuIHp9fSwKIGJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKLXpIOmZ1bmN0aW9uKGEpe3ZhciB6PVAuTHMobnVsbCxudWxsLG51bGwsSC5LcChhLDApKQorekg6ZnVuY3Rpb24oYSl7dmFyIHo9UC5McyhudWxsLG51bGwsbnVsbCxILk9xKGEsMCkpCiB6LkZWKDAsYSkKIHJldHVybiB6fSwKLWdBOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5LcChhLDApXSl9LAorZ0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILk9xKGEsMCldKX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEguZVEoYSl9LAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKIHNCOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIhPT0ibnVtYmVyInx8TWF0aC5mbG9vcihiKSE9PWIpdGhyb3cgSC5iKFAudShiKSkKQEAgLTM0OSwxMSArMzQ5LDExIEBACiBpZih6LkMoYiwwKXx8ei5EKGIsMjApKXRocm93IEguYihQLktQKGIpKQogeT1hLnRvRml4ZWQoYikKIGlmKGE9PT0wJiZ0aGlzLmd6UChhKSlyZXR1cm4iLSIreQotcmV0dXJuIHl9LCIkMSIsImdLeSIsMiwwLDE1LDcwXSwKK3JldHVybiB5fSwiJDEiLCJnS3kiLDIsMCwxNSw3MV0sCiBXWjpmdW5jdGlvbihhLGIpe2lmKGI8Mnx8Yj4zNil0aHJvdyBILmIoUC5LUChiKSkKIHJldHVybiBhLnRvU3RyaW5nKGIpfSwKLWJ1OmZ1bmN0aW9uKGEpe2lmKGE9PT0wJiYxL2E8MClyZXR1cm4iLTAuMCIKLWVsc2UgcmV0dXJuIiIrYX0sCitidTpbZnVuY3Rpb24oYSl7aWYoYT09PTAmJjEvYTwwKXJldHVybiItMC4wIgorZWxzZSByZXR1cm4iIithfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIGEmMHgxRkZGRkZGRn0sCiBKOmZ1bmN0aW9uKGEpe3JldHVybi1hfSwKIGc6ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYiE9PSJudW1iZXIiKXRocm93IEguYihQLnUoYikpCkBAIC00NzgsNiArNDc4LDcgQEAKIGI9Yj4+PjEKIGlmKGI9PT0wKWJyZWFrCiB6Kz16fXJldHVybiB5fSwKK2dZQzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEoubU4oYSl9LAogWFU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3CiBpZihiPT1udWxsKUgudmgoUC51KG51bGwpKQogaWYoYzwwfHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsMCxhLmxlbmd0aCkpCkBAIC01MDUsNyArNTA2LDcgQEAKIGlmKGE9PT1iKXo9MAogZWxzZSB6PWE8Yj8tMToxCiByZXR1cm4gen0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIGF9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGdpTzpmdW5jdGlvbihhKXt2YXIgeix5LHgKIGZvcih6PWEubGVuZ3RoLHk9MCx4PTA7eDx6OysreCl7eT01MzY4NzA5MTEmeSthLmNoYXJDb2RlQXQoeCkKIHk9NTM2ODcwOTExJnkrKCg1MjQyODcmeSk8PDEwPj4+MCkKQEAgLTUyNyw3ICs1MjgsMjIgQEAKIGZvcih6PWEubGVuZ3RoO2I+MDtiPXkpe3k9Yi0xCiBpZih5Pj16KUgudmgoUC5OKHkpKQogeD1hLmNoYXJDb2RlQXQoeSkKLWlmKHghPT0zMiYmeCE9PTEzJiYhSi5HYSh4KSlicmVha31yZXR1cm4gYn19fX1dLFsiX2lzb2xhdGVfaGVscGVyIiwiZGFydDpfaXNvbGF0ZV9oZWxwZXIiLCxILHsKK2lmKHghPT0zMiYmeCE9PTEzJiYhSi5HYSh4KSlicmVha31yZXR1cm4gYn19fSwKK21OOnsKKyJeIjoidzJZO2lOIiwKK2dCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmlOLmxlbmd0aH0sCit0OmZ1bmN0aW9uKGEsYil7dmFyIHoseQorej10aGlzLmlOCitpZih0eXBlb2YgYiE9PSJudW1iZXIifHxNYXRoLmZsb29yKGIpIT09YilILnZoKFAudShiKSkKK3k9Si5XeChiKQoraWYoeS5DKGIsMCkpSC52aChQLk4oYikpCitpZih5LkYoYix6Lmxlbmd0aCkpSC52aChQLk4oYikpCityZXR1cm4gei5jaGFyQ29kZUF0KGIpfSwKKyRhc3cyWTpmdW5jdGlvbigpe3JldHVybltQLktOXX0sCiskYXNhcms6ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19LAorJGFzSXI6ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19LAorJGFzV086ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19LAorJGFzUVY6ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19fX1dLFsiX2lzb2xhdGVfaGVscGVyIiwiZGFydDpfaXNvbGF0ZV9oZWxwZXIiLCxILHsKICJeIjoiIiwKIGRCOmZ1bmN0aW9uKGEsYil7dmFyIHo9YS52VigwLGIpCiBpbml0Lmdsb2JhbFN0YXRlLlh6LmJMKCkKQEAgLTU0Miw3ICs1NTgsNyBAQAogei5hPWIKIHk9Yn1lbHNlIHk9YgogaWYoIUoueCh5KS4kaXNXTyl0aHJvdyBILmIoUC51KCJBcmd1bWVudHMgdG8gbWFpbiBtdXN0IGJlIGEgTGlzdDogIitILmQoeSkpKQoteT1uZXcgSC5GVSgwLDAsMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhKQoreT1uZXcgSC5wcSgwLDAsMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhKQogeS5xaShhKQogaW5pdC5nbG9iYWxTdGF0ZT15CiBpZihpbml0Lmdsb2JhbFN0YXRlLkVGPT09ITApcmV0dXJuCkBAIC01NzYsMTYgKzU5MiwxNiBAQAogaWYoeSE9bnVsbClyZXR1cm4geVsxXQogdGhyb3cgSC5iKFAuZigiQ2Fubm90IGV4dHJhY3QgVVJJIGZyb20gXCIiK0guZCh6KSsiXCIiKSl9LAogdUs6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbQotej1ILkhoKGIuZGF0YSkKK3o9SC5iMChiLmRhdGEpCiB5PUouVTYoeikKLXN3aXRjaCh5LnQoeiwiY29tbWFuZCIpKXtjYXNlInN0YXJ0Ijppbml0Lmdsb2JhbFN0YXRlLm9MPXkudCh6LCJpZCIpCitzd2l0Y2goeS50KHosImNvbW1hbmQiKSl7Y2FzZSJzdGFydCI6aW5pdC5nbG9iYWxTdGF0ZS5OTz15LnQoeiwiaWQiKQogeD15LnQoeiwiZnVuY3Rpb25OYW1lIikKIHc9eD09bnVsbD9pbml0Lmdsb2JhbFN0YXRlLncyOmluaXQuZ2xvYmFsRnVuY3Rpb25zW3hdKCkKIHY9eS50KHosImFyZ3MiKQotdT1ILkhoKHkudCh6LCJtc2ciKSkKK3U9SC5iMCh5LnQoeiwibXNnIikpCiB0PXkudCh6LCJpc1NwYXduVXJpIikKIHM9eS50KHosInN0YXJ0UGF1c2VkIikKLXI9SC5IaCh5LnQoeiwicmVwbHlUbyIpKQorcj1ILmIwKHkudCh6LCJyZXBseVRvIikpCiB5PWluaXQuZ2xvYmFsU3RhdGUuSGcrKwogcT1QLkw1KG51bGwsbnVsbCxudWxsLFAuS04sSC55bykKIHA9UC5McyhudWxsLG51bGwsbnVsbCxQLktOKQpAQCAtNTk4LDcgKzYxNCw3IEBACiBpbml0Lmdsb2JhbFN0YXRlLlh6LmJMKCkKIGJyZWFrCiBjYXNlInNwYXduLXdvcmtlciI6bT15LnQoeiwicmVwbHlQb3J0IikKLUguRU4oeS50KHosImZ1bmN0aW9uTmFtZSIpLHkudCh6LCJ1cmkiKSx5LnQoeiwiYXJncyIpLHkudCh6LCJtc2ciKSwhMSx5LnQoeiwiaXNTcGF3blVyaSIpLHkudCh6LCJzdGFydFBhdXNlZCIpKS5SeChuZXcgSC5tTihtKSxuZXcgSC54bihtKSkKK0guRU4oeS50KHosImZ1bmN0aW9uTmFtZSIpLHkudCh6LCJ1cmkiKSx5LnQoeiwiYXJncyIpLHkudCh6LCJtc2ciKSwhMSx5LnQoeiwiaXNTcGF3blVyaSIpLHkudCh6LCJzdGFydFBhdXNlZCIpKS5SeChuZXcgSC54bihtKSxuZXcgSC5qbDMobSkpCiBicmVhawogY2FzZSJtZXNzYWdlIjppZih5LnQoeiwicG9ydCIpIT1udWxsKUouSDQoeS50KHosInBvcnQiKSx5LnQoeiwibXNnIikpCiBpbml0Lmdsb2JhbFN0YXRlLlh6LmJMKCkKQEAgLTYyNCwxNiArNjQwLDE2IEBACiB0aHJvdyBILmIoUC5GTSh6KSl9fSwKIEVOOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciB6LHkseCx3LHYsdQogaWYoYiE9bnVsbCYmSi5WcihiLCIuZGFydCIpKWI9Si5ldyhiLCIuanMiKQotej1QLmhNKCkKK3o9UC5hdCgpCiB5PUguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKQotei5ndEgoeikubWwobmV3IEguV0soeSkpCit6LmdUdyh6KS5tbChuZXcgSC55ayh5KSkKIHg9bmV3IEguVlUoei52bCxpbml0Lmdsb2JhbFN0YXRlLk4wLmpPKQogaWYoaW5pdC5nbG9iYWxTdGF0ZS5qaT09PSEwJiYhZSlpZihpbml0Lmdsb2JhbFN0YXRlLkVGPT09ITApe3c9aW5pdC5nbG9iYWxTdGF0ZS5yagogdj1ILnQwKFAuRUYoWyJjb21tYW5kIiwic3Bhd24td29ya2VyIiwiZnVuY3Rpb25OYW1lIixhLCJhcmdzIixjLCJtc2ciLGQsInVyaSIsYiwiaXNTcGF3blVyaSIsZiwic3RhcnRQYXVzZWQiLGcsInJlcGx5UG9ydCIseF0sbnVsbCxudWxsKSkKIHcudG9TdHJpbmcKIHNlbGYucG9zdE1lc3NhZ2Uodil9ZWxzZXtpZihiPT1udWxsKWI9JC5adCgpCiB1PW5ldyBXb3JrZXIoYikKLXUub25lcnJvcj1mdW5jdGlvbihoLGksail7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBoKGssaSxqKX19KEguR0EsYixuZXcgSC50Wih5KSkKK3Uub25lcnJvcj1mdW5jdGlvbihoLGksail7cmV0dXJuIGZ1bmN0aW9uKGspe3JldHVybiBoKGssaSxqKX19KEguR0EsYixuZXcgSC5XSyh5KSkKIHUub25tZXNzYWdlPWZ1bmN0aW9uKGgsaSl7cmV0dXJuIGZ1bmN0aW9uKGope2oub25lcnJvcj1udWxsCiByZXR1cm4gaChpLGopfX0oSC51Syx1KQogdz1pbml0Lmdsb2JhbFN0YXRlLlk3KysKQEAgLTY4MCwyMyArNjk2LDIzIEBACiByZXR1cm4gei5abyhhKX1lbHNle3o9bmV3IEguZkwobmV3IEguY3goKSkKIHoubVI9bmV3IEgubTMobnVsbCkKIHJldHVybiB6LlpvKGEpfX0sCi1IaDpmdW5jdGlvbihhKXtpZihpbml0Lmdsb2JhbFN0YXRlLmppPT09ITApcmV0dXJuIG5ldyBILkJWKG51bGwpLnVnKGEpCitiMDpmdW5jdGlvbihhKXtpZihpbml0Lmdsb2JhbFN0YXRlLmppPT09ITApcmV0dXJuIG5ldyBILkJWKG51bGwpLnVnKGEpCiBlbHNlIHJldHVybiBhfSwKIHZNOmZ1bmN0aW9uKGEpe3JldHVybiBhPT1udWxsfHx0eXBlb2YgYT09PSJzdHJpbmcifHx0eXBlb2YgYT09PSJudW1iZXIifHx0eXBlb2YgYT09PSJib29sZWFuIn0sCiBaUjpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbHx8dHlwZW9mIGE9PT0ic3RyaW5nInx8dHlwZW9mIGE9PT0ibnVtYmVyInx8dHlwZW9mIGE9PT0iYm9vbGVhbiJ9LAogUEs6ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOmZ1bmN0aW9uKCl7dGhpcy5iLiQxKHRoaXMuYS5hKX0sCiAkaXNFSDp0cnVlfSwKIEpPOnsKLSJeIjoiVHA6NzE7YSxjIiwKKyJeIjoiVHBaOjcyO2EsYyIsCiAkMDpmdW5jdGlvbigpe3RoaXMuYy4kMih0aGlzLmEuYSxudWxsKX0sCiAkaXNFSDp0cnVlfSwKLUZVOnsKLSJeIjoiYTtIZyxvTCxZNyxOMCxOcixYeixkYSxFRixqaSxpUjwscmosWEMsdzI8IiwKK3BxOnsKKyJeIjoiYTtIZyxOTyxZNyxOMCxOcixYeixkYSxFRixqaSxpUjwscmosWEMsdzI8IiwKIHFpOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PSQuTXkoKT09bnVsbAoteT0kLnJtKCkKK3k9JC5GdigpCiB4PXomJiQud0IoKT09PSEwCiB0aGlzLkVGPXgKIGlmKCF4KXk9eSE9bnVsbCYmJC5adCgpIT1udWxsCkBAIC03MTUsMTMgKzczMSwxMyBAQAogJC5qaygpLm9ubWVzc2FnZT13CiAkLmprKCkuZGFydFByaW50PWZ1bmN0aW9uKGIpe319fX0sCiBhWDp7Ci0iXiI6ImE7ak8+LEd4LGZXLEVuPCxFRTwsdW0sUFgseEY/LFVGPCxDOTwsbHcsQ04sTTIsbWYscGEsaXIiLAorIl4iOiJhO2pPPixHeCxmVyxFbjwsRUU8LHVtLFBYLHhGPyxVRjwsQzk8LGxKLENOLE0yLEppLHBhLGlyIiwKIG96OmZ1bmN0aW9uKGEsYil7aWYoIXRoaXMudW0ubigwLGEpKXJldHVybgotaWYodGhpcy5sdy5oKDAsYikmJiF0aGlzLlVGKXRoaXMuVUY9ITAKK2lmKHRoaXMubEouaCgwLGIpJiYhdGhpcy5VRil0aGlzLlVGPSEwCiB0aGlzLlBDKCl9LAogTlI6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiBpZighdGhpcy5VRilyZXR1cm4KLXo9dGhpcy5sdworej10aGlzLmxKCiB6LlJ6KDAsYSkKIGlmKHouWDU9PT0wKXtmb3Ioej10aGlzLkM5O3k9ei5sZW5ndGgseSE9PTA7KXtpZigwPj15KXJldHVybiBILmUoeiwwKQogeD16LnBvcCgpCkBAIC03NDUsNyArNzYxLDcgQEAKIHRoaXMucGE9Yn0sCiBaQzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9Si54KGIpCi1pZighei5uKGIsMCkpeT16Lm4oYiwxKSYmIXRoaXMubWYKK2lmKCF6Lm4oYiwwKSl5PXoubihiLDEpJiYhdGhpcy5KaQogZWxzZSB5PSEwCiBpZih5KXtKLkg0KGEsbnVsbCkKIHJldHVybn15PW5ldyBILk5ZKGEpCkBAIC03NTcsNyArNzczLDcgQEAKIGJjOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYoIXRoaXMuUFgubigwLGEpKXJldHVybgogej1KLngoYikKLWlmKCF6Lm4oYiwwKSl5PXoubihiLDEpJiYhdGhpcy5tZgoraWYoIXoubihiLDApKXk9ei5uKGIsMSkmJiF0aGlzLkppCiBlbHNlIHk9ITAKIGlmKHkpe3RoaXMuRG0oKQogcmV0dXJufWlmKHoubihiLDIpKXt6PWluaXQuZ2xvYmFsU3RhdGUuWHoKQEAgLTc4MywxNiArNzk5LDE2IEBACiBpbml0Lmdsb2JhbFN0YXRlLk4wPXRoaXMKICQ9dGhpcy5FbgogeT1udWxsCi10aGlzLm1mPSEwCit0aGlzLkppPSEwCiB0cnl7eT1iLiQwKCl9Y2F0Y2godil7dT1ILlJ1KHYpCiB4PXUKIHc9bmV3IEguWE8odixudWxsKQogdGhpcy5oayh4LHcpCiBpZih0aGlzLnBhPT09ITApe3RoaXMuRG0oKQotaWYodGhpcz09PWluaXQuZ2xvYmFsU3RhdGUuTnIpdGhyb3cgdn19ZmluYWxseXt0aGlzLm1mPSExCitpZih0aGlzPT09aW5pdC5nbG9iYWxTdGF0ZS5Ocil0aHJvdyB2fX1maW5hbGx5e3RoaXMuSmk9ITEKIGluaXQuZ2xvYmFsU3RhdGUuTjA9egogaWYoeiE9bnVsbCkkPXouZ0VuKCkKLWlmKHRoaXMuTTIhPW51bGwpZm9yKDt1PXRoaXMuTTIsIXUuZ2wwKHUpOyl0aGlzLk0yLkFSKCkuJDAoKX1yZXR1cm4geX0sIiQxIiwiZ1ptIiwyLDAsNzIsNzNdLAoraWYodGhpcy5NMiE9bnVsbClmb3IoO3U9dGhpcy5NMiwhdS5nbDAodSk7KXRoaXMuTTIuQVIoKS4kMCgpfXJldHVybiB5fSwiJDEiLCJnWm0iLDIsMCw3Myw3NF0sCiBEczpmdW5jdGlvbihhKXt2YXIgej1KLlU2KGEpCiBzd2l0Y2goei50KGEsMCkpe2Nhc2UicGF1c2UiOnRoaXMub3ooei50KGEsMSksei50KGEsMikpCiBicmVhawpAQCAtODIxLDE3ICs4MzcsMTcgQEAKIERtOltmdW5jdGlvbigpe3ZhciB6LHkKIHo9dGhpcy5NMgogaWYoeiE9bnVsbCl6LlYxKDApCi1mb3Ioej10aGlzLkd4LHk9ei5nVVEoeikseT1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh5Lmw2KSx5LlQ2KSxbSC5LcCh5LDApLEguS3AoeSwxKV0pO3kuRygpOyl5LmxvLnByKCkKK2Zvcih6PXRoaXMuR3gseT16LmdVUSh6KSx5PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHkubDYpLHkuVDYpLFtILk9xKHksMCksSC5PcSh5LDEpXSk7eS5HKCk7KXkubG8ucHIoKQogei5WMSgwKQogdGhpcy5mVy5WMSgwKQogaW5pdC5nbG9iYWxTdGF0ZS5pUi5SeigwLHRoaXMuak8pCiB0aGlzLmlyLlYxKDApCiB6PXRoaXMuQ04KLWlmKHohPW51bGwpe2Zvcih6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5INCh6LmxvLG51bGwpCitpZih6IT1udWxsKXtmb3Ioej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KUouSDQoei5sbyxudWxsKQogdGhpcy5DTj1udWxsfX0sIiQwIiwiZ0ltIiwwLDAsMThdLAogJGlzYVg6dHJ1ZX0sCiBOWTp7Ci0iXiI6IlRwOjE4O2EiLAorIl4iOiJUcFo6MTg7YSIsCiAkMDpbZnVuY3Rpb24oKXtKLkg0KHRoaXMuYSxudWxsKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGNDOnsKQEAgLTg2MCw3ICs4NzYsNyBAQAogdy50b1N0cmluZwogc2VsZi5wb3N0TWVzc2FnZSh2KX19fSwKIFJtOnsKLSJeIjoiVHA6MTg7YSIsCisiXiI6IlRwWjoxODthIiwKICQwOltmdW5jdGlvbigpe2lmKCF0aGlzLmEueEIoKSlyZXR1cm4KIFAuclQoQy5ueSx0aGlzKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKQEAgLTg3MiwzNyArODg4LDM3IEBACiBJbjp7CiAiXiI6ImE7In0sCiBrYjp7Ci0iXiI6IlRwOjcxO2EsYixjLGQsZSxmIiwKKyJeIjoiVHBaOjcyO2EsYixjLGQsZSxmIiwKICQwOltmdW5jdGlvbigpe0guRGkodGhpcy5hLHRoaXMuYix0aGlzLmMsdGhpcy5kLHRoaXMuZSx0aGlzLmYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAotbU46ewotIl4iOiJUcDoxMztVSSIsCi0kMTpbZnVuY3Rpb24oYSl7Si5INCh0aGlzLlVJLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNzQsImNhbGwiXSwKLSRpc0VIOnRydWV9LAogeG46ewotIl4iOiJUcDo1O2JLIiwKLSQxOltmdW5jdGlvbihhKXtKLkg0KHRoaXMuYkssWyJzcGF3biBmYWlsZWQiLGFdKX0sIiQxIixudWxsLDIsMCxudWxsLDc1LCJjYWxsIl0sCisiXiI6IlRwWjoxMztVSSIsCiskMTpbZnVuY3Rpb24oYSl7Si5INCh0aGlzLlVJLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNzUsImNhbGwiXSwKICRpc0VIOnRydWV9LAotV0s6ewotIl4iOiJUcDoxMzthIiwKK2psMzp7CisiXiI6IlRwWjo1O2JLIiwKKyQxOltmdW5jdGlvbihhKXtKLkg0KHRoaXMuYkssWyJzcGF3biBmYWlsZWQiLGFdKX0sIiQxIixudWxsLDIsMCxudWxsLDc2LCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK3lrOnsKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9Si5VNihhKQogeT10aGlzLmEKIGlmKEoueEMoei50KGEsMCksInNwYXduZWQiKSl7ej15Lk1NCiBpZih6Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCi16Lk9IKGEpfWVsc2UgeS5wbSh6LnQoYSwxKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw3NCwiY2FsbCJdLAorei5PSChhKX1lbHNlIHkucG0oei50KGEsMSkpfSwiJDEiLG51bGwsMiwwLG51bGwsNzUsImNhbGwiXSwKICRpc0VIOnRydWV9LAotdFo6ewotIl4iOiJUcDo1O2IiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmIucG0oYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw3NiwiY2FsbCJdLAorV0s6eworIl4iOiJUcFo6NTtiIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iLnBtKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNzcsImNhbGwiXSwKICRpc0VIOnRydWV9LAogaEk6ewotIl4iOiJUcDo3MTthLGIsYyxkLGUiLAorIl4iOiJUcFo6NzI7YSxiLGMsZCxlIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYQogSC5EaShpbml0Lmdsb2JhbEZ1bmN0aW9uc1t0aGlzLmJdKCksei5hLHouYix0aGlzLmMsdGhpcy5kLHRoaXMuZSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB2Szp7Ci0iXiI6IlRwOjE4O2EsYixjLGQsZSIsCisiXiI6IlRwWjoxODthLGIsYyxkLGUiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHoseSx4CiB0aGlzLmUuc3hGKCEwKQogaWYodGhpcy5kIT09ITApdGhpcy5hLiQxKHRoaXMuYykKQEAgLTkxNyw3ICs5MzMsNyBAQAogSXk0OnsKICJeIjoiYTsiLAogJGlzcFc6dHJ1ZSwKLSRpc1hZOnRydWV9LAorJGlzaHE6dHJ1ZX0sCiBWVTp7CiAiXiI6Ikl5NDtKRSx0diIsCiB3UjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKQEAgLTkzOSwxMyArOTU1LDEzIEBACiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEoua2kodGhpcy5KRSl9LAogJGlzVlU6dHJ1ZSwKICRpc3BXOnRydWUsCi0kaXNYWTp0cnVlfSwKKyRpc2hxOnRydWV9LAogVWE6ewotIl4iOiJUcDo3MTthLGIsYyIsCisiXiI6IlRwWjo3MjthLGIsYyIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMuYi5KRQogaWYoIXouZ0tTKCkpe2lmKHRoaXMuYyl7eT10aGlzLmEKLXkuYT1ILkhoKHkuYSl9Si5uMCh6LHRoaXMuYS5hKX19LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAoreS5hPUguYjAoeS5hKX1KLm4wKHosdGhpcy5hLmEpfX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGJNOnsKICJeIjoiSXk0O1pVLGJ2LHR2IiwKQEAgLTk2NCw3ICs5ODAsNyBAQAogcmV0dXJuKHpeeV54KT4+PjB9LAogJGlzYk06dHJ1ZSwKICRpc3BXOnRydWUsCi0kaXNYWTp0cnVlfSwKKyRpc2hxOnRydWV9LAogeW86ewogIl4iOiJhO3FLPixEMSxLUzwiLAogd3k6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRDEuJDEoYSl9LApAQCAtOTkyLDE0ICsxMDA4LDE0IEBACiB5STpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LUihhLG51bGwsbnVsbCxudWxsKX0sCiB4TzpbZnVuY3Rpb24oYSl7dGhpcy52bC54TygwKQogdGhpcy50VS54TygwKX0sIiQwIiwiZ1FGIiwwLDAsMThdLAotVEw6ZnVuY3Rpb24oYSl7dmFyIHo9UC54Mih0aGlzLmdRRih0aGlzKSxudWxsLG51bGwsbnVsbCwhMCxudWxsKQorVEw6ZnVuY3Rpb24oYSl7dmFyIHo9UC5IVCh0aGlzLmdRRih0aGlzKSxudWxsLG51bGwsbnVsbCwhMCxudWxsKQogdGhpcy50VT16CiB0aGlzLnZsLkQxPXouZ2h0KHopfSwKICRhc3dTOmZ1bmN0aW9uKCl7cmV0dXJuW251bGxdfSwKICRpc3dTOnRydWV9LAogUlM6ewotIl4iOiJqUDE7QW8sbVIiLAotREU6ZnVuY3Rpb24oYSl7aWYoISFhLiRpc1ZVKXJldHVyblsic2VuZHBvcnQiLGluaXQuZ2xvYmFsU3RhdGUub0wsYS50dixKLmtpKGEuSkUpXQorIl4iOiJoejtBbyxtUiIsCitERTpmdW5jdGlvbihhKXtpZighIWEuJGlzVlUpcmV0dXJuWyJzZW5kcG9ydCIsaW5pdC5nbG9iYWxTdGF0ZS5OTyxhLnR2LEoua2koYS5KRSldCiBpZighIWEuJGlzYk0pcmV0dXJuWyJzZW5kcG9ydCIsYS5aVSxhLnR2LGEuYnZdCiB0aHJvdyBILmIoIklsbGVnYWwgdW5kZXJseWluZyBwb3J0ICIrYS5idSgwKSl9LAogeWY6ZnVuY3Rpb24oYSl7aWYoISFhLiRpc2lWKXJldHVyblsiY2FwYWJpbGl0eSIsYS5xS10KQEAgLTEwMTgsMjIgKzEwMzQsMjIgQEAKIHk9ei50KGEsMSkKIHg9ei50KGEsMikKIHc9ei50KGEsMykKLWlmKEoueEMoeSxpbml0Lmdsb2JhbFN0YXRlLm9MKSl7dj1pbml0Lmdsb2JhbFN0YXRlLmlSLnQoMCx4KQoraWYoSi54Qyh5LGluaXQuZ2xvYmFsU3RhdGUuTk8pKXt2PWluaXQuZ2xvYmFsU3RhdGUuaVIudCgwLHgpCiBpZih2PT1udWxsKXJldHVybgogdT12LmhWKHcpCiBpZih1PT1udWxsKXJldHVybgogcmV0dXJuIG5ldyBILlZVKHUseCl9ZWxzZSByZXR1cm4gbmV3IEguYk0oeSx3LHgpfSwKIE9wOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5pVihKLlVRKGEsMSkpfX0sCiBtMzp7Ci0iXiI6ImE7TUQiLAorIl4iOiJhO3U1IiwKIHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5fX01lc3NhZ2VUcmF2ZXJzZXJfX2F0dGFjaGVkX2luZm9fX30sCi11OmZ1bmN0aW9uKGEsYixjKXt0aGlzLk1ELnB1c2goYikKK3U6ZnVuY3Rpb24oYSxiLGMpe3RoaXMudTUucHVzaChiKQogYi5fX01lc3NhZ2VUcmF2ZXJzZXJfX2F0dGFjaGVkX2luZm9fXz1jfSwKLUNIOmZ1bmN0aW9uKGEpe3RoaXMuTUQ9W119LAorQ0g6ZnVuY3Rpb24oYSl7dGhpcy51NT1bXX0sCiBubzpmdW5jdGlvbigpe3ZhciB6LHkseAotZm9yKHo9dGhpcy5NRC5sZW5ndGgseT0wO3k8ejsrK3kpe3g9dGhpcy5NRAorZm9yKHo9dGhpcy51NS5sZW5ndGgseT0wO3k8ejsrK3kpe3g9dGhpcy51NQogaWYoeT49eC5sZW5ndGgpcmV0dXJuIEguZSh4LHkpCi14W3ldLl9fTWVzc2FnZVRyYXZlcnNlcl9fYXR0YWNoZWRfaW5mb19fPW51bGx9dGhpcy5NRD1udWxsfX0sCit4W3ldLl9fTWVzc2FnZVRyYXZlcnNlcl9fYXR0YWNoZWRfaW5mb19fPW51bGx9dGhpcy51NT1udWxsfX0sCiBjeDp7CiAiXiI6ImE7IiwKIHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm59LApAQCAtMTA1Myw3ICsxMDY5LDcgQEAKIGlmKCEhei4kaXNXTylyZXR1cm4gdGhpcy53YihhKQogaWYoISF6LiRpc1owKXJldHVybiB0aGlzLlRJKGEpCiBpZighIXouJGlzcFcpcmV0dXJuIHRoaXMuREUoYSkKLWlmKCEhei4kaXNYWSlyZXR1cm4gdGhpcy55ZihhKQoraWYoISF6LiRpc2hxKXJldHVybiB0aGlzLnlmKGEpCiByZXR1cm4gdGhpcy5OMShhKX0sCiBOMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoIk1lc3NhZ2Ugc2VyaWFsaXphdGlvbjogSWxsZWdhbCB2YWx1ZSAiK0guZChhKSsiIHBhc3NlZCIpfX0sCiBvb3k6ewpAQCAtMTA4MiwxMSArMTA5OCwxMSBAQAogREU6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudmgoUC5TWShudWxsKSl9LAogeWY6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudmgoUC5TWShudWxsKSl9fSwKIFJLOnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmIKLUoua1codGhpcy5hLmEsei5ROShhKSx6LlE5KGIpKX0sIiQyIixudWxsLDQsMCxudWxsLDc3LDc4LCJjYWxsIl0sCitKLmtXKHRoaXMuYS5hLHouUTkoYSksei5ROShiKSl9LCIkMiIsbnVsbCw0LDAsbnVsbCw3OCw3OSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1qUDE6eworaHo6ewogIl4iOiJCQjsiLAogUHE6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LAogd2I6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtMTE3NSwxMiArMTE5MSwxMiBAQAogei5RYShhLGIpCiByZXR1cm4gen19fSwKIEF2OnsKLSJeIjoiVHA6MTg7YSxiIiwKKyJeIjoiVHBaOjE4O2EsYiIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmEucDk9bnVsbAogdGhpcy5iLiQwKCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB2dDp7Ci0iXiI6IlRwOjE4O2MsZCIsCisiXiI6IlRwWjoxODtjLGQiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5jLnA5PW51bGwKIEguY3YoKQogdGhpcy5kLiQwKCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLApAQCAtMTIwNSw3ICsxMjIxLDcgQEAKIHk9Yi5xSwogcmV0dXJuIHo9PW51bGw/eT09bnVsbDp6PT09eX1yZXR1cm4hMX0sCiAkaXNpVjp0cnVlLAotJGlzWFk6dHJ1ZX19XSxbIl9qc19oZWxwZXIiLCJkYXJ0Ol9qc19oZWxwZXIiLCxILHsKKyRpc2hxOnRydWV9fV0sWyJfanNfaGVscGVyIiwiZGFydDpfanNfaGVscGVyIiwsSCx7CiAiXiI6IiIsCiBHcDpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihiIT1udWxsKXt6PWIueApAQCAtMTI2MiwzMCArMTI3OCwzMCBAQAogaWYodHlwZW9mIHk9PT0ic3RyaW5nIil6PS9eXHcrJC8udGVzdCh5KT95Onp9aWYoei5sZW5ndGg+MSYmQy54Qi5qKHosMCk9PT0zNil6PUMueEIueW4oeiwxKQogcmV0dXJuKHorSC5pYShILm9YKGEpLDAsbnVsbCkpLnJlcGxhY2UoL1tePCw+IF0rL2csZnVuY3Rpb24oYil7cmV0dXJuIGluaXQubWFuZ2xlZEdsb2JhbE5hbWVzW2JdfHxifSl9LAogYTU6ZnVuY3Rpb24oYSl7cmV0dXJuIkluc3RhbmNlIG9mICciK0gubGgoYSkrIicifSwKLU1zOmZ1bmN0aW9uKCl7aWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdyE9PW51bGwpe3ZhciB6PXdpbmRvdy5wZXJmb3JtYW5jZQorQW86ZnVuY3Rpb24oKXtpZih0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93IT09bnVsbCl7dmFyIHo9d2luZG93LnBlcmZvcm1hbmNlCiBpZih6IT1udWxsJiZ0eXBlb2Ygei53ZWJraXROb3c9PSJmdW5jdGlvbiIpcmV0dXJuIEMuQ0QueXUoTWF0aC5mbG9vcigxMDAwKnoud2Via2l0Tm93KCkpKX1yZXR1cm4gMTAwMCpEYXRlLm5vdygpfSwKLUNiOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQorUkY6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiB6PWEubGVuZ3RoCiBmb3IoeT16PD01MDAseD0iIix3PTA7dzx6O3crPTUwMCl7aWYoeSl2PWEKIGVsc2V7dT13KzUwMAogdT11PHo/dTp6CiB2PWEuc2xpY2Uodyx1KX14Kz1TdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsdil9cmV0dXJuIHh9LAotWUY6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CitYWjpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9W10KIHouJGJ1aWx0aW5UeXBlSW5mbz1bUC5LTl0KIHk9bmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpCi15LiRidWlsdGluVHlwZUluZm89W0guS3AoYSwwKV0KK3kuJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcShhLDApXQogZm9yKDt5LkcoKTspe3g9eS5sbwogaWYodHlwZW9mIHghPT0ibnVtYmVyInx8TWF0aC5mbG9vcih4KSE9PXgpdGhyb3cgSC5iKFAudSh4KSkKIGlmKHg8PTY1NTM1KXoucHVzaCh4KQogZWxzZSBpZih4PD0xMTE0MTExKXt6LnB1c2goNTUyOTYrKEMuam4uR0coeC02NTUzNiwxMCkmMTAyMykpCi16LnB1c2goNTYzMjArKHgmMTAyMykpfWVsc2UgdGhyb3cgSC5iKFAudSh4KSl9cmV0dXJuIEguQ2Ioeil9LAorei5wdXNoKDU2MzIwKyh4JjEwMjMpKX1lbHNlIHRocm93IEguYihQLnUoeCkpfXJldHVybiBILlJGKHopfSwKIExZOmZ1bmN0aW9uKGEpe3ZhciB6LHkKLWZvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILktwKGEsMCldKTt6LkcoKTspe3k9ei5sbworZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guT3EoYSwwKV0pO3ouRygpOyl7eT16LmxvCiBpZih0eXBlb2YgeSE9PSJudW1iZXIifHxNYXRoLmZsb29yKHkpIT09eSl0aHJvdyBILmIoUC51KHkpKQogaWYoeTwwKXRocm93IEguYihQLnUoeSkpCi1pZih5PjY1NTM1KXJldHVybiBILllGKGEpfXJldHVybiBILkNiKGEpfSwKLUpNOmZ1bmN0aW9uKGEpe3ZhciB6CitpZih5PjY1NTM1KXJldHVybiBILlhaKGEpfXJldHVybiBILlJGKGEpfSwKK214OmZ1bmN0aW9uKGEpe3ZhciB6CiBpZih0eXBlb2YgYSE9PSJudW1iZXIiKXJldHVybiBILnMoYSkKIGlmKDA8PWEpe2lmKGE8PTY1NTM1KXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEpCiBpZihhPD0xMTE0MTExKXt6PWEtNjU1MzYKQEAgLTEyOTcsNyArMTMxMyw3IEBACiBpZih0eXBlb2YgZCE9PSJudW1iZXIifHxNYXRoLmZsb29yKGQpIT09ZClILnZoKFAudShkKSkKIGlmKHR5cGVvZiBlIT09Im51bWJlciJ8fE1hdGguZmxvb3IoZSkhPT1lKUgudmgoUC51KGUpKQogaWYodHlwZW9mIGYhPT0ibnVtYmVyInx8TWF0aC5mbG9vcihmKSE9PWYpSC52aChQLnUoZikpCi16PUouYkkoYiwxKQorej1KLkhuKGIsMSkKIHk9aD9EYXRlLlVUQyhhLHosYyxkLGUsZixnKTpuZXcgRGF0ZShhLHosYyxkLGUsZixnKS52YWx1ZU9mKCkKIGlmKGlzTmFOKHkpfHx5PC04NjQwMDAwMDAwMDAwMDAwfHx5Pjg2NDAwMDAwMDAwMDAwMDApdGhyb3cgSC5iKFAudShudWxsKSkKIHg9Si5XeChhKQpAQCAtMTM3NCw3ICsxMzkwLDcgQEAKIHA9JC5XNigpCiAkLkJpKCkKIG89JC5lQSgpCi1uPSQua28oKQorbj0kLnFLKCkKIG09di5xUyh5KQogaWYobSE9bnVsbClyZXR1cm4gei4kMShILlQzKHksbSkpCiBlbHNle209dS5xUyh5KQpAQCAtMTM5MSw3ICsxNDA3LDcgQEAKIGlmKHYpe3Y9bT09bnVsbD9udWxsOm0ubWV0aG9kCiByZXR1cm4gei4kMShuZXcgSC5abyh5LHYpKX19fXY9dHlwZW9mIHk9PT0ic3RyaW5nIj95OiIiCiByZXR1cm4gei4kMShuZXcgSC52Vih2KSl9aWYoYSBpbnN0YW5jZW9mIFJhbmdlRXJyb3Ipe2lmKHR5cGVvZiB5PT09InN0cmluZyImJnkuaW5kZXhPZigiY2FsbCBzdGFjayIpIT09LTEpcmV0dXJuIG5ldyBQLktZKCkKLXJldHVybiB6LiQxKG5ldyBQLkFUKG51bGwpKX1pZih0eXBlb2YgSW50ZXJuYWxFcnJvcj09ImZ1bmN0aW9uIiYmYSBpbnN0YW5jZW9mIEludGVybmFsRXJyb3IpaWYodHlwZW9mIHk9PT0ic3RyaW5nIiYmeT09PSJ0b28gbXVjaCByZWN1cnNpb24iKXJldHVybiBuZXcgUC5LWSgpCityZXR1cm4gei4kMShuZXcgUC5PWShudWxsKSl9aWYodHlwZW9mIEludGVybmFsRXJyb3I9PSJmdW5jdGlvbiImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVycm9yKWlmKHR5cGVvZiB5PT09InN0cmluZyImJnk9PT0idG9vIG11Y2ggcmVjdXJzaW9uIilyZXR1cm4gbmV3IFAuS1koKQogcmV0dXJuIGF9LAogQ1U6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbHx8dHlwZW9mIGEhPSdvYmplY3QnKXJldHVybiBKLnYxKGEpCiBlbHNlIHJldHVybiBILmVRKGEpfSwKQEAgLTE0MzEsNyArMTQ0Nyw3IEBACiB2LnByb3RvdHlwZT13CiB1PSFkCiBpZih1KXt0PWUubGVuZ3RoPT0xJiYhMAotcz1ILlNEKGEseix0KQorcz1ILmJ4KGEseix0KQogcy4kcmVmbGVjdGlvbkluZm89Y31lbHNle3cuJG5hbWU9Zgogcz16CiB0PSExfWlmKHR5cGVvZiB4PT0ibnVtYmVyIilyPWZ1bmN0aW9uKGcpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBpbml0Lm1ldGFkYXRhW2ddfX0oeCkKQEAgLTE0NDEsNyArMTQ1Nyw3IEBACiB3W3ldPXMKIGZvcih1PWIubGVuZ3RoLHA9MTtwPHU7KytwKXtvPWJbcF0KIG49by4kY2FsbE5hbWUKLWlmKG4hPW51bGwpe209ZD9vOkguU0QoYSxvLHQpCitpZihuIT1udWxsKXttPWQ/bzpILmJ4KGEsbyx0KQogd1tuXT1tfX13WyJjYWxsKiJdPXMKIHJldHVybiB2fSwKIHZxOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6PUgudWoKQEAgLTE0NTIsNyArMTQ2OCw3IEBACiBjYXNlIDQ6cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpLGope3JldHVybiBmKHRoaXMpW2VdKGcsaCxpLGopfX0oYyx6KQogY2FzZSA1OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxqLGspe3JldHVybiBmKHRoaXMpW2VdKGcsaCxpLGosayl9fShjLHopCiBkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KGYodGhpcyksYXJndW1lbnRzKX19KGQseil9fSwKLVNEOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUKK2J4OmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUKIGlmKGMpcmV0dXJuIEguSGYoYSxiKQogej1iLiRzdHViTmFtZQogeT1iLmxlbmd0aApAQCAtMTQ2MCwxOSArMTQ3NiwxOSBAQAogdz1iPT1udWxsP3g9PW51bGw6Yj09PXgKIGlmKHR5cGVvZiBkYXJ0X3ByZWNvbXBpbGVkPT0iZnVuY3Rpb24ifHwhd3x8eT49MjcpcmV0dXJuIEgudnEoeSwhdyx6LGIpCiBpZih5PT09MCl7dz0kLmJmCi1pZih3PT1udWxsKXt3PUguQjMoInNlbGYiKQoraWYodz09bnVsbCl7dz1ILmJkKCJzZWxmIikKICQuYmY9d313PSJyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4iK0guZCh3KSsiLiIrSC5kKHopKyIoKTsiCiB2PSQuT0sKICQuT0s9Si5ldyh2LDEpCiByZXR1cm4gbmV3IEZ1bmN0aW9uKHcrSC5kKHYpKyJ9IikoKX11PSJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIuc3BsaXQoIiIpLnNwbGljZSgwLHkpLmpvaW4oIiwiKQogdz0icmV0dXJuIGZ1bmN0aW9uKCIrdSsiKXtyZXR1cm4gdGhpcy4iCiB2PSQuYmYKLWlmKHY9PW51bGwpe3Y9SC5CMygic2VsZiIpCitpZih2PT1udWxsKXt2PUguYmQoInNlbGYiKQogJC5iZj12fXY9dytILmQodikrIi4iK0guZCh6KSsiKCIrdSsiKTsiCiB3PSQuT0sKICQuT0s9Si5ldyh3LDEpCiByZXR1cm4gbmV3IEZ1bmN0aW9uKHYrSC5kKHcpKyJ9IikoKX0sCi1acTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5CitybTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5CiB6PUgudWoKIHk9SC5IWQogc3dpdGNoKGI/LTE6YSl7Y2FzZSAwOnRocm93IEguYihILllpKCJJbnRlcmNlcHRlZCBmdW5jdGlvbiB3aXRoIG5vIGFyZ3VtZW50cy4iKSkKQEAgLTE0ODgsMTMgKzE1MDQsMTMgQEAKIEhmOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1LHQscwogej1ILmJPKCkKIHk9JC5VOQotaWYoeT09bnVsbCl7eT1ILkIzKCJyZWNlaXZlciIpCitpZih5PT1udWxsKXt5PUguYmQoInJlY2VpdmVyIikKICQuVTk9eX14PWIuJHN0dWJOYW1lCiB3PWIubGVuZ3RoCiB2PXR5cGVvZiBkYXJ0X3ByZWNvbXBpbGVkPT0iZnVuY3Rpb24iCiB1PWFbeF0KIHQ9Yj09bnVsbD91PT1udWxsOmI9PT11Ci1pZih2fHwhdHx8dz49MjgpcmV0dXJuIEguWnEodywhdCx4LGIpCitpZih2fHwhdHx8dz49MjgpcmV0dXJuIEgucm0odywhdCx4LGIpCiBpZih3PT09MSl7eT0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuIitILmQoeikrIi4iK0guZCh4KSsiKHRoaXMuIitILmQoeSkrIik7IgogdD0kLk9LCiAkLk9LPUouZXcodCwxKQpAQCAtMTUxNiw4ICsxNTMyLDggQEAKIGFnOmZ1bmN0aW9uKGEpe3Rocm93IEguYihQLm1FKCJDeWNsaWMgaW5pdGlhbGl6YXRpb24gZm9yIHN0YXRpYyAiK0guZChhKSkpfSwKIEtUOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IEguR04oYSxiLGMsbnVsbCl9LAogT2c6ZnVuY3Rpb24oYSxiKXt2YXIgej1hLm5hbWUKLWlmKGI9PW51bGx8fGIubGVuZ3RoPT09MClyZXR1cm4gbmV3IEguRnAoeikKLXJldHVybiBuZXcgSC5LRUEoeixiLG51bGwpfSwKK2lmKGI9PW51bGx8fGIubGVuZ3RoPT09MClyZXR1cm4gbmV3IEgudHUoeikKK3JldHVybiBuZXcgSC5mdyh6LGIsbnVsbCl9LAogRzM6ZnVuY3Rpb24oKXtyZXR1cm4gQy5LWn0sCiBJTDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguY3UoYSxudWxsKX0sCiBWTTpmdW5jdGlvbihhLGIpe2lmKGEhPW51bGwpYS4kYnVpbHRpblR5cGVJbmZvPWIKQEAgLTE1MjcsNyArMTU0Myw3IEBACiBJTTpmdW5jdGlvbihhLGIpe3JldHVybiBILlk5KGFbIiRhcyIrSC5kKGIpXSxILm9YKGEpKX0sCiBpcDpmdW5jdGlvbihhLGIsYyl7dmFyIHo9SC5JTShhLGIpCiByZXR1cm4gej09bnVsbD9udWxsOnpbY119LAotS3A6ZnVuY3Rpb24oYSxiKXt2YXIgej1ILm9YKGEpCitPcTpmdW5jdGlvbihhLGIpe3ZhciB6PUgub1goYSkKIHJldHVybiB6PT1udWxsP251bGw6eltiXX0sCiBLbzpmdW5jdGlvbihhLGIpe2lmKGE9PW51bGwpcmV0dXJuImR5bmFtaWMiCiBlbHNlIGlmKHR5cGVvZiBhPT09Im9iamVjdCImJmEhPT1udWxsJiZhLmNvbnN0cnVjdG9yPT09QXJyYXkpcmV0dXJuIGFbMF0uYnVpbHRpbiRjbHMrSC5pYShhLDEsYikKQEAgLTE1NDMsNyArMTU1OSw3IEBACiBpZih2IT1udWxsKXc9ITEKIHU9SC5Lbyh2LGMpCiB6LnZNKz10eXBlb2YgdT09PSJzdHJpbmciP3U6SC5kKHUpfXJldHVybiB3PyIiOiI8IitILmQoeikrIj4ifSwKLWI3OmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKS5jb25zdHJ1Y3Rvci5idWlsdGluJGNscword086ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpLmNvbnN0cnVjdG9yLmJ1aWx0aW4kY2xzCiBpZihhPT1udWxsKXJldHVybiB6CiByZXR1cm4geitILmlhKGEuJGJ1aWx0aW5UeXBlSW5mbywwLG51bGwpfSwKIFk5OmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PT0ib2JqZWN0IiYmYSE9PW51bGwmJmEuY29uc3RydWN0b3I9PT1BcnJheSliPWEKQEAgLTE3MjEsNyArMTczNyw3IEBACiBlbHNle3o9Si54KGIpCiBpZighIXouJGlzVlIpe3o9Qy54Qi55bihhLGMpCiB5PWIuRWoKLXJldHVybiB5LnRlc3Qoeil9ZWxzZSByZXR1cm4gSi55eCh6LmRkKGIsQy54Qi55bihhLGMpKSl9fSwKK3JldHVybiB5LnRlc3Qoeil9ZWxzZSByZXR1cm4gSi5wTyh6LmRkKGIsQy54Qi55bihhLGMpKSl9fSwKIHlzOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdwogaWYoYj09PSIiKWlmKGE9PT0iIilyZXR1cm4gYwogZWxzZXt6PVAucDkoIiIpCkBAIC0xNzM0LDcgKzE3NTAsNyBAQAogIl4iOiJhOyIsCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueEModGhpcy5nQih0aGlzKSwwKX0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIUoueEModGhpcy5nQih0aGlzKSwwKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIEVQOmZ1bmN0aW9uKCl7dGhyb3cgSC5iKFAuZigiQ2Fubm90IG1vZGlmeSB1bm1vZGlmaWFibGUgTWFwIikpfSwKIHU6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLkVQKCl9LAogUno6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5FUCgpfSwKQEAgLTE3NTQsMTIgKzE3NzAsMTIgQEAKIHo9dGhpcy50YwogZm9yKHk9MDt5PHoubGVuZ3RoOysreSl7eD16W3ldCiBiLiQyKHgsdGhpcy5UWih4KSl9fSwKLWd2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSC5YUih0aGlzKSxbSC5LcCh0aGlzLDApXSl9LAotZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKHRoaXMudGMsbmV3IEguaFkodGhpcyksSC5LcCh0aGlzLDApLEguS3AodGhpcywxKSl9LAorZ3ZjOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBILlhSKHRoaXMpLFtILk9xKHRoaXMsMCldKX0sCitnVVE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguSzEodGhpcy50YyxuZXcgSC5oWSh0aGlzKSxILk9xKHRoaXMsMCksSC5PcSh0aGlzLDEpKX0sCiAkaXN5Tjp0cnVlfSwKIGhZOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5UWihhKX0sIiQxIixudWxsLDIsMCxudWxsLDc3LCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLlRaKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNzgsImNhbGwiXSwKICRpc0VIOnRydWV9LAogWFI6ewogIl4iOiJtVztZMyIsCkBAIC0xNzc5LDE4ICsxNzk1LDE4IEBACiB4LmZpeGVkJGxlbmd0aD0hMAogcmV0dXJuIHh9LAogZ1ZtOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcsdix1LHQscwotaWYodGhpcy54SSE9PTApcmV0dXJuIFAuRmwoUC5HRCxudWxsKQoraWYodGhpcy54SSE9PTApcmV0dXJuIFAuRmwoUC5JTixudWxsKQogej10aGlzLkZYCiB5PXoubGVuZ3RoCiB4PXRoaXMucnEKIHc9eC5sZW5ndGgteQotaWYoeT09PTApcmV0dXJuIFAuRmwoUC5HRCxudWxsKQotdj1QLkw1KG51bGwsbnVsbCxudWxsLFAuR0QsbnVsbCkKK2lmKHk9PT0wKXJldHVybiBQLkZsKFAuSU4sbnVsbCkKK3Y9UC5MNShudWxsLG51bGwsbnVsbCxQLklOLG51bGwpCiBmb3IodT0wO3U8eTsrK3Upe2lmKHU+PXoubGVuZ3RoKXJldHVybiBILmUoeix1KQogdD16W3VdCiBzPXcrdQogaWYoczwwfHxzPj14Lmxlbmd0aClyZXR1cm4gSC5lKHgscykKLXYudSgwLG5ldyBILklOKHQpLHhbc10pfXJldHVybiB2fSwKK3YudSgwLG5ldyBILnR4KHQpLHhbc10pfXJldHVybiB2fSwKIHN0YXRpYzp7Il4iOiJoQXcsZUhGLFk4In19LAogRkQ6ewogIl4iOiJhO21yLFJuPixYWixSdixoRyxNbyxBTSxORSIsCkBAIC0xODMwLDcgKzE4NDYsNyBAQAogeD16WzFdCiByZXR1cm4gbmV3IEguRkQoYSx6LCh5JjEpPT09MSx5Pj4xLHg+PjEsKHgmMSk9PT0xLHpbMl0sbnVsbCl9fX0sCiB1Vjp7Ci0iXiI6IlRwOjU7YSxiLGMiLAorIl4iOiJUcFo6NTthLGIsYyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9dGhpcy5iLk5FCiB5PXRoaXMuYS5hKysKQEAgLTE4MzksMTQgKzE4NTUsMTQgQEAKIHpbeV09eH0sCiAkaXNFSDp0cnVlfSwKIENqOnsKLSJeIjoiVHA6ODA7YSxiLGMiLAorIl4iOiJUcFo6ODE7YSxiLGMiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmEKIHouYj16LmIrIiQiK0guZChhKQogdGhpcy5jLnB1c2goYSkKIHRoaXMuYi5wdXNoKGIpOysrei5hfSwKICRpc0VIOnRydWV9LAogdTg6ewotIl4iOiJUcDo4MDthLGIiLAorIl4iOiJUcFo6ODE7YSxiIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5iCiBpZih6Lng0KDAsYSkpei51KDAsYSxiKQogZWxzZSB0aGlzLmEuYT0hMH0sCkBAIC0xODY4LDcgKzE4ODQsNyBAQAogeD10aGlzLmNSCiBpZih4IT09LTEpeS5yZWNlaXZlcj16W3grMV0KIHJldHVybiB5fSwKLXN0YXRpYzp7Il4iOiJsbSxrMSxSZSxmTixxaSxjeixCWCx0dCxkdCxBNyIsY006ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CitzdGF0aWM6eyJeIjoibG0sazEsUmUsZk4scWksY3osQlgsdHQsZHQsQWkiLGNNOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQogYT1hLnJlcGxhY2UoU3RyaW5nKHt9KSwnJHJlY2VpdmVyJCcpLnJlcGxhY2UobmV3IFJlZ0V4cCgiW1tcXF17fSgpKis/LlxcXFxeJHxdIiwnZycpLCdcXCQmJykKIHo9YS5tYXRjaCgvXFxcJFthLXpBLVpdK1xcXCQvZykKIGlmKHo9PW51bGwpej1bXQpAQCAtMTg4MSwxOSArMTg5NywxOSBAQAogdHJ5eyRleHByJC4kbWV0aG9kJCgkYXJndW1lbnRzRXhwciQpfWNhdGNoKHope3JldHVybiB6Lm1lc3NhZ2V9fShhKX0sTWo6ZnVuY3Rpb24oYSl7cmV0dXJuIGZ1bmN0aW9uKCRleHByJCl7dHJ5eyRleHByJC4kbWV0aG9kJH1jYXRjaCh6KXtyZXR1cm4gei5tZXNzYWdlfX0oYSl9fX0sCiBabzp7CiAiXiI6IlhTO0s5LEdhIiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuR2EKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLkdhCiBpZih6PT1udWxsKXJldHVybiJOdWxsRXJyb3I6ICIrSC5kKHRoaXMuSzkpCi1yZXR1cm4iTnVsbEVycm9yOiBDYW5ub3QgY2FsbCBcIiIrSC5kKHopKyJcIiBvbiBudWxsIn0sCityZXR1cm4iTnVsbEVycm9yOiBDYW5ub3QgY2FsbCBcIiIrSC5kKHopKyJcIiBvbiBudWxsIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzSlM6dHJ1ZSwKICRpc1hTOnRydWV9LAogdTA6ewogIl4iOiJYUztLOSxHYSxjUiIsCi1idTpmdW5jdGlvbihhKXt2YXIgeix5CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLkdhCiBpZih6PT1udWxsKXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogIitILmQodGhpcy5LOSkKIHk9dGhpcy5jUgogaWYoeT09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBjYWxsIFwiIitILmQoeikrIlwiICgiK0guZCh0aGlzLks5KSsiKSIKLXJldHVybiJOb1N1Y2hNZXRob2RFcnJvcjogQ2Fubm90IGNhbGwgXCIiK0guZCh6KSsiXCIgb24gXCIiK0guZCh5KSsiXCIgKCIrSC5kKHRoaXMuSzkpKyIpIn0sCityZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBjYWxsIFwiIitILmQoeikrIlwiIG9uIFwiIitILmQoeSkrIlwiICgiK0guZCh0aGlzLks5KSsiKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0pTOnRydWUsCiAkaXNYUzp0cnVlLAogc3RhdGljOntUMzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKQEAgLTE5MDMsNTAgKzE5MTksNTAgQEAKIHJldHVybiBuZXcgSC51MChhLHkseil9fX0sCiB2Vjp7CiAiXiI6IlhTO0s5IiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuSzkKLXJldHVybiBDLnhCLmdsMCh6KT8iRXJyb3IiOiJFcnJvcjogIit6fX0sCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5LOQorcmV0dXJuIEMueEIuZ2wwKHopPyJFcnJvciI6IkVycm9yOiAiK3p9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBBbTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtpZighIUoueChhKS4kaXNYUylpZihhLiR0aHJvd25Kc0Vycm9yPT1udWxsKWEuJHRocm93bkpzRXJyb3I9dGhpcy5hCiByZXR1cm4gYX0sCiAkaXNFSDp0cnVlfSwKIFhPOnsKICJeIjoiYTtsQSx1aSIsCi1idTpmdW5jdGlvbihhKXt2YXIgeix5CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLnVpCiBpZih6IT1udWxsKXJldHVybiB6CiB6PXRoaXMubEEKIHk9dHlwZW9mIHo9PT0ib2JqZWN0Ij96LnN0YWNrOm51bGwKIHo9eT09bnVsbD8iIjp5CiB0aGlzLnVpPXoKLXJldHVybiB6fX0sCityZXR1cm4gen0sIiQwIiwiZ0FZIiwwLDAsNjldfSwKIGRyOnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS4kMCgpfSwKICRpc0VIOnRydWV9LAogVEw6ewotIl4iOiJUcDo3MTtiLGMiLAorIl4iOiJUcFo6NzI7YixjIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYi4kMSh0aGlzLmMpfSwKICRpc0VIOnRydWV9LAogdVo6ewotIl4iOiJUcDo3MTtkLGUsZiIsCisiXiI6IlRwWjo3MjtkLGUsZiIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmQuJDIodGhpcy5lLHRoaXMuZil9LAogJGlzRUg6dHJ1ZX0sCiBPUTp7Ci0iXiI6IlRwOjcxO1VJLGJLLEdxLFJtIiwKKyJeIjoiVHBaOjcyO1VJLGJLLEdxLFJtIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVUkuJDModGhpcy5iSyx0aGlzLkdxLHRoaXMuUm0pfSwKICRpc0VIOnRydWV9LAogUXg6ewotIl4iOiJUcDo3MTt3MyxIWixtRyx4QyxjaiIsCisiXiI6IlRwWjo3Mjt3MyxIWixtRyx4QyxjaiIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnczLiQ0KHRoaXMuSFosdGhpcy5tRyx0aGlzLnhDLHRoaXMuY2opfSwKICRpc0VIOnRydWV9LAotVHA6eworVHBaOnsKICJeIjoiYTsiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIkNsb3N1cmUifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iQ2xvc3VyZSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0VIOnRydWUsCiBnS3U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LAogQnA6ewotIl4iOiJUcDsifSwKKyJeIjoiVHBaOyJ9LAogdjp7CiAiXiI6IkJwO253LGptLGNSLFJBIiwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCkBAIC0xOTYwLDggKzE5NzYsOCBAQAogcmV0dXJuIEouVU4oeSxILmVRKHRoaXMuam0pKX0sCiAkaXN2OnRydWUsCiBzdGF0aWM6eyJeIjoiYmYsVTkiLHVqOmZ1bmN0aW9uKGEpe3JldHVybiBhLm53fSxIWTpmdW5jdGlvbihhKXtyZXR1cm4gYS5jUn0sYk86ZnVuY3Rpb24oKXt2YXIgej0kLmJmCi1pZih6PT1udWxsKXt6PUguQjMoInNlbGYiKQotJC5iZj16fXJldHVybiB6fSxCMzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CitpZih6PT1udWxsKXt6PUguYmQoInNlbGYiKQorJC5iZj16fXJldHVybiB6fSxiZDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiB6PW5ldyBILnYoInNlbGYiLCJ0YXJnZXQiLCJyZWNlaXZlciIsIm5hbWUiKQogeT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh6KQogeS5maXhlZCRsZW5ndGg9aW5pdApAQCAtMTk3MCwxMiArMTk4NiwxMiBAQAogaWYoelt2XT09PWEpcmV0dXJuIHZ9fX19LAogUGU6ewogIl4iOiJYUztHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRzF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLkcxfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNYUzp0cnVlLAogc3RhdGljOnthcTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgSC5QZSgiQ2FzdEVycm9yOiBDYXN0aW5nIHZhbHVlIG9mIHR5cGUgIitILmQoYSkrIiB0byBpbmNvbXBhdGlibGUgdHlwZSAiK0guZChiKSl9fX0sCiBiYjp7CiAiXiI6IlhTO0cxPiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iUnVudGltZUVycm9yOiAiK0guZCh0aGlzLkcxKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIitILmQodGhpcy5HMSl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7WWk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmJiKGEpfX19LAogbGJwOnsKICJeIjoiYTsifSwKQEAgLTIwMDAsNyArMjAxNiw3IEBACiB2PUgua1UoeSkKIGZvcih4PXYubGVuZ3RoLHU9MDt1PHg7Kyt1KXt0PXZbdV0KIHdbdF09eVt0XS56YSgpfXoubmFtZWQ9d31yZXR1cm4gen0sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCitidTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscwogej10aGlzLklxCiBpZih6IT1udWxsKWZvcih5PXoubGVuZ3RoLHg9IigiLHc9ITEsdj0wO3Y8eTsrK3Ysdz0hMCl7dT16W3ZdCiBpZih3KXgrPSIsICIKQEAgLTIwMTQsNyArMjAzMCw3IEBACiB0PUgua1UoeikKIGZvcih5PXQubGVuZ3RoLHc9ITEsdj0wO3Y8eTsrK3Ysdz0hMCl7cz10W3ZdCiBpZih3KXgrPSIsICIKLXgrPUguZCh6W3NdLnphKCkpKyIgIitzfXgrPSJ9In19cmV0dXJuIHgrKCIpIC0+ICIrSC5kKHRoaXMuZHcpKX0sCit4Kz1ILmQoeltzXS56YSgpKSsiICIrc314Kz0ifSJ9fXJldHVybiB4KygiKSAtPiAiK0guZCh0aGlzLmR3KSl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7Il4iOiJsY3MiLER6OmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogYT1hCiB6PVtdCkBAIC0yMDIyLDE4ICsyMDM4LDE4IEBACiByZXR1cm4gen19fSwKIGhKOnsKICJeIjoibGJwOyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iZHluYW1pYyJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJkeW5hbWljIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogemE6ZnVuY3Rpb24oKXtyZXR1cm59LAogJGlzaEo6dHJ1ZX0sCi1GcDp7Cit0dTp7CiAiXiI6ImxicDtvYz4iLAogemE6ZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMub2MKIHk9aW5pdC5hbGxDbGFzc2VzW3pdCiBpZih5PT1udWxsKXRocm93IEguYigibm8gdHlwZSBmb3IgJyIrSC5kKHopKyInIikKIHJldHVybiB5fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9jfX0sCi1LRUE6eworYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9jfSwiJDAiLCJnQVkiLDAsMCw2OV19LAorZnc6ewogIl4iOiJsYnA7b2M+LHJlLEV0IiwKIHphOmZ1bmN0aW9uKCl7dmFyIHoseQogej10aGlzLkV0CkBAIC0yMDQyLDMzICsyMDU4LDMzIEBACiB5PVtpbml0LmFsbENsYXNzZXNbel1dCiBpZigwPj15Lmxlbmd0aClyZXR1cm4gSC5lKHksMCkKIGlmKHlbMF09PW51bGwpdGhyb3cgSC5iKCJubyB0eXBlIGZvciAnIitILmQoeikrIjwuLi4+JyIpCi1mb3Ioej10aGlzLnJlLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl5LnB1c2goei5sby56YSgpKQorZm9yKHo9dGhpcy5yZSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspeS5wdXNoKHoubG8uemEoKSkKIHRoaXMuRXQ9eQogcmV0dXJuIHl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLm9jKSsiPCIrSi5JYSh0aGlzLnJlLCIsICIpKyI+In19LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5vYykrIjwiK0oudUcodGhpcy5yZSwiLCAiKSsiPiJ9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBjdTp7CiAiXiI6ImE7TFUsa2UiLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5rZQogaWYoeiE9bnVsbClyZXR1cm4gegogeT10aGlzLkxVLnJlcGxhY2UoL1tePCw+IF0rL2csZnVuY3Rpb24oYil7cmV0dXJuIGluaXQubWFuZ2xlZEdsb2JhbE5hbWVzW2JdfHxifSkKIHRoaXMua2U9eQotcmV0dXJuIHl9LAorcmV0dXJuIHl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSi52MSh0aGlzLkxVKX0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzY3UmJkoueEModGhpcy5MVSxiLkxVKX0sCiAkaXNjdTp0cnVlLAogJGlzdXE6dHJ1ZX0sCiBkQzp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hKGEpfSwKICRpc0VIOnRydWV9LAogVlg6ewotIl4iOiJUcDo4MTtiIiwKKyJeIjoiVHBaOjgyO2IiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5iKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiByaDp7Ci0iXiI6IlRwOjU7YyIsCisiXiI6IlRwWjo1O2MiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYyhhKX0sCiAkaXNFSDp0cnVlfSwKIFZSOnsKQEAgLTIxNjYsNyArMjE4Miw3IEBACiAkaXNuczp0cnVlfX1dLFsiYWN0aW9uX2xpbmtfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2FjdGlvbl9saW5rLmRhcnQiLCxYLHsKICJeIjoiIiwKIGhWOnsKLSJeIjoiTFBjO2ZpLGRCLEtXLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiTFBjO2ZpLGRCLEtXLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd2ODpmdW5jdGlvbihhKXtyZXR1cm4gYS5maX0sCiBzdjg6ZnVuY3Rpb24oYSxiKXthLmZpPXRoaXMuY3QoYSxDLlM0LGEuZmksYil9LAogZ0ZSOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRCfSwKQEAgLTIxNzgsNyArMjE5NCw3IEBACiBGNjpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9YS5maQogaWYoej09PSEwKXJldHVybgogaWYoYS5kQiE9bnVsbCl7YS5maT10aGlzLmN0KGEsQy5TNCx6LCEwKQotdGhpcy5MWShhLG51bGwpLllNKG5ldyBYLmpFKGEpKX19LCIkMyIsImdOYSIsNiwwLDgyLDQ2LDQ3LDgzXSwKK3RoaXMuTFkoYSxudWxsKS5ZTShuZXcgWC5qRShhKSl9fSwiJDMiLCJnTmEiLDYsMCw4Myw0Niw0Nyw4NF0sCiBzdGF0aWM6e3p5OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKQEAgLTIxODYsMTAgKzIyMDIsMTAgQEAKIGEuZmk9ITEKIGEuZEI9bnVsbAogYS5LVz0iYWN0aW9uIgotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5EZi5aTChhKQogQy5EZi5YSShhKQpAQCAtMjE5OCw3ICsyMjE0LDcgQEAKICJeIjoieGMrUGk7IiwKICRpc2QzOnRydWV9LAogakU6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9dGhpcy5hCiB6LmZpPUouUTUoeixDLlM0LHouZmksITEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJhcHAiLCJwYWNrYWdlOm9ic2VydmF0b3J5L2FwcC5kYXJ0IiwsRyx7CkBAIC0yMjA4LDExICsyMjI0LDExIEBACiB6PUouVVEoSi5VUSgkLlNpKCksImdvb2dsZSIpLCJ2aXN1YWxpemF0aW9uIikKICQuQlk9egogcmV0dXJuIHp9LCIkMSIsInZOIiwyLDAsMTMsMTRdLAotb2g6ZnVuY3Rpb24oYSl7dmFyIHo9JC5WeSgpLmdldEl0ZW0oYSkKK1hrOmZ1bmN0aW9uKGEpe3ZhciB6PSQuVnkoKS5nZXRJdGVtKGEpCiBpZih6PT1udWxsKXJldHVybgogcmV0dXJuIEMueHIua1Yoeil9LAogRkk6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gUC5WdShudWxsLG51bGwsbnVsbCkKLXJldHVybiBXLktuKCIvY3JkcHRhcmdldHMvIitQLmpXKEMueUQsYSxDLnhNLCExKSxudWxsLG51bGwpLm1sKG5ldyBHLnR4KCkpLk9BKG5ldyBHLktGKCkpfSwKK3JldHVybiBXLktuKCIvY3JkcHRhcmdldHMvIitQLmpXKEMueUQsYSxDLnhNLCExKSxudWxsLG51bGwpLm1sKG5ldyBHLktGKCkpLk9BKG5ldyBHLlhOKCkpfSwKIGRqOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuQ0QuU3koMTAwKkouWDkoYSxiKSwyKSsiJSJ9LAogbzE6ZnVuY3Rpb24oYSxiKXt2YXIgegogZm9yKHo9IiI7Yj4xOyl7LS1iCkBAIC0yMjI0LDcgKzIyNDAsNyBAQAogYT16LlooYSwxMDAwKQogeD1HLm8xKHksMykKIGZvcig7ej1KLld4KGEpLHouRChhLDEwMDApOyl7eD1HLm8xKHouWShhLDEwMDApLDMpKyIsIit4Ci1hPXouWihhLDEwMDApfXJldHVybiF6Lm4oYSwwKT9ILmQoYSkrIiwiK3g6eH0sIiQxIiwia2giLDIsMCwxNV0sCithPXouWihhLDEwMDApfXJldHVybiF6Lm4oYSwwKT9ILmQoYSkrIiwiK3g6eH0sIiQxIiwieEsiLDIsMCwxNV0sCiBQMDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej1DLkNELnl1KEMuQ0QuVUQoYSoxMDAwKSkKIHk9Qy5qbi5jVSh6LDM2MDAwMDApCkBAIC0yMjUzLDcgKzIyNjksNyBAQAogaWYoeCE9PTApcmV0dXJuIiIreCsibSAiK3crInMiCiByZXR1cm4iIit3KyJzIn0sCiBtTDp7Ci0iXiI6IlBpO2NFLEdaLFo2LEVoLG0yPCxFYixibixQdixjQyxBUCxmbiIsCisiXiI6IlBpO09KLEVmLFo2LEVoLG0yPCxFYixibixQdixjQyxBUCxmbiIsCiBnd3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRWh9LAogc3d2OmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKEoueEModGhpcy5FaCxiKSlyZXR1cm4KQEAgLTIyNjMsNzQgKzIyNzksNzggQEAKIGIuZ0VIKCkubWwodGhpcy5nd24oKSkKIEouZDcoYikubWwodGhpcy5na3EoKSkKIHo9Yi5nRzIoKQotSC5WTShuZXcgUC5Jayh6KSxbSC5LcCh6LDApXSkueUkodGhpcy5nYmYoKSkKK0guVk0obmV3IFAuSWsoeiksW0guT3EoeiwwKV0pLnlJKHRoaXMuZ2JmKCkpCiB6PWIuZ0xpKCkKLUguVk0obmV3IFAuSWsoeiksW0guS3AoeiwwKV0pLnlJKHRoaXMuZ1hhKCkpfXRoaXMuRWg9Yn0sCitILlZNKG5ldyBQLklrKHopLFtILk9xKHosMCldKS55SSh0aGlzLmdYYSgpKX10aGlzLkVoPWJ9LAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkVifSwKIHNvZDpmdW5jdGlvbihhLGIpe3RoaXMuRWI9Ri5XaSh0aGlzLEMuckIsdGhpcy5FYixiKX0sCiBndks6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jQ30sCiBzdks6ZnVuY3Rpb24oYSl7dGhpcy5jQz1GLldpKHRoaXMsQy5jNix0aGlzLmNDLGEpfSwKIEFROmZ1bmN0aW9uKGEpe3ZhciB6LHkKLSQubWY9dGhpcwotej10aGlzLmNFCi16LnB1c2gobmV3IEcuQkEodGhpcyxudWxsLG51bGwsbnVsbCkpCi16LnB1c2gobmV3IEcuSFModGhpcyxudWxsLG51bGwsbnVsbCkpCi16LnB1c2gobmV3IEcuZjIodGhpcyxudWxsLG51bGwsbnVsbCkpCi16LnB1c2gobmV3IEcuY1oodGhpcyxudWxsLG51bGwsbnVsbCkpCiskLktoPXRoaXMKK3o9dGhpcy5PSgorei5wdXNoKG5ldyBHLnQ5KHRoaXMsbnVsbCxudWxsLG51bGwsbnVsbCkpCit6LnB1c2gobmV3IEcudjUodGhpcyxudWxsLG51bGwsbnVsbCxudWxsKSkKK3oucHVzaChuZXcgRy5TeSh0aGlzLG51bGwsbnVsbCxudWxsLG51bGwpKQorei5wdXNoKG5ldyBHLmJ5KHRoaXMsbnVsbCxudWxsLG51bGwsbnVsbCkpCiB6PXRoaXMuWjYKIHouZWM9dGhpcwogeT1ILlZNKG5ldyBXLlJPKHdpbmRvdyxDLnlmLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAseS5ESyx5LlBoLFcuYUYoei5nYlEoKSkseS5TZyksW0guS3AoeSwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx5LkRLLHkuUGgsVy5hRih6LmdiUSgpKSx5LlNnKSxbSC5PcSh5LDApXSkuWnooKQogei5DeSgpfSwKLXgzOmZ1bmN0aW9uKGEpe0oudVkodGhpcy5jQyxuZXcgRy5kdyhhLG5ldyBHLmNFKCkpKX0sCi1rajpbZnVuY3Rpb24oYSl7dGhpcy5Qdj1hCi10aGlzLm9nKCJlcnJvci8iLG51bGwpfSwiJDEiLCJnYmYiLDIsMCw4NCwyNF0sCit4MzpmdW5jdGlvbihhKXtKLnJBKHRoaXMuY0MsbmV3IEcueEUoYSxuZXcgRy5jRSgpKSl9LAoreVM6W2Z1bmN0aW9uKGEpe3RoaXMuUHY9YQordGhpcy5vZygiZXJyb3IvIixudWxsKX0sIiQxIiwiZ2JmIiwyLDAsODUsMjRdLAoga0k6W2Z1bmN0aW9uKGEpe3RoaXMuUHY9YQogaWYoSi54QyhKLkl6KGEpLCJOZXR3b3JrRXhjZXB0aW9uIikpdGhpcy5aNi5ibygwLCIjL3ZtLWNvbm5lY3QvIikKLWVsc2UgdGhpcy5vZygiZXJyb3IvIixudWxsKX0sIiQxIiwiZ1hhIiwyLDAsODUsODZdLAotb2c6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKLWZvcih6PXRoaXMuY0UseT0wO3k8ei5sZW5ndGg7Kyt5KXt4PXpbeV0KLWlmKHguVlUoYSkpe3RoaXMubEooeCkKLXguRFYoYSkKK2Vsc2UgdGhpcy5vZygiZXJyb3IvIixudWxsKX0sIiQxIiwiZ1hhIiwyLDAsODYsODddLAorb2c6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2Cit6PWI9PW51bGw/UC5GbChudWxsLG51bGwpOlAuTXMoYixDLnhNKQorZm9yKHk9dGhpcy5PSix4PTA7eDx5Lmxlbmd0aDsrK3gpe3c9eVt4XQoraWYody5WVShhKSl7dGhpcy5HUCh3KQoreT1SLnRCKHopCit2PXcuZnoKK2lmKHcuZ256KHcpJiYhSi54Qyh2LHkpKXt2PW5ldyBULnFJKHcsQy5aZyx2LHkpCit2LiRidWlsdGluVHlwZUluZm89W251bGxdCit3Lm5xKHcsdil9dy5mej15Cit3LnFZKGEpCiByZXR1cm59fXRocm93IEguYihQLmE5KCkpfSwKLWxKOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3Ci15PXRoaXMuR1oKK0dQOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CitpZihKLnhDKHRoaXMuRWYsYSkpcmV0dXJuCitpZih0aGlzLkVmIT1udWxsKXtOLlFNKCIiKS5UbygiVW5pbnN0YWxsaW5nIHBhZ2U6ICIrSC5kKHRoaXMuRWYpKQordGhpcy5FZi5vVigpCitKLnI0KHRoaXMuYm4pfU4uUU0oIiIpLlRvKCJJbnN0YWxsaW5nIHBhZ2U6ICIrSC5kKGEpKQordHJ5e2EuY2koKX1jYXRjaCh5KXt4PUguUnUoeSkKK3o9eAorTi5RTSgiIikuWVgoIkZhaWxlZCB0byBpbnN0YWxsIHBhZ2U6ICIrSC5kKHopKX10aGlzLmJuLmFwcGVuZENoaWxkKGEuZ3lGKCkpCiB4PWEKLWlmKHk9PW51bGw/eD09bnVsbDp5PT09eClyZXR1cm4KLWlmKHkhPW51bGwpe04uUU0oIiIpLlRvKCJVbmluc3RhbGxpbmcgcGFuZTogIitKLkFHKHRoaXMuR1opKQoteT10aGlzLkdaCi14PXkueUYKLWlmKHkuZ256KHkpJiZ4IT1udWxsKXt4PW5ldyBULnFJKHksQy5HUCx4LG51bGwpCi14LiRidWlsdGluVHlwZUluZm89W251bGxdCi15Lm5xKHkseCl9eS55Rj1udWxsCi1KLnI0KHRoaXMuYm4pfU4uUU0oIiIpLlRvKCJJbnN0YWxsaW5nIHBhbmU6ICIrSC5kKGEpKQotdHJ5e2EuY2koKX1jYXRjaCh3KXt5PUguUnUodykKLXo9eQotTi5RTSgiIikuWVgoIkZhaWxlZCB0byBpbnN0YWxsIHBhbmU6ICIrSC5kKHopKX10aGlzLmJuLmFwcGVuZENoaWxkKGEuZ3lGKCkpCi10aGlzLkdaPWF9LAotbW46W2Z1bmN0aW9uKGEpe2lmKCEhSi54KGEpLiRpc0tNKXRoaXMubTIuaCgwLGEuTil9LCIkMSIsImd3biIsMiwwLDg3LDg4XSwKK3c9dGhpcy5FZgoraWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHcseCkpe3c9bmV3IFQucUkodGhpcyxDLlJHLHcseCkKK3cuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KK3RoaXMubnEodGhpcyx3KX10aGlzLkVmPXh9LAorYWI6W2Z1bmN0aW9uKGEpe2lmKCEhSi54KGEpLiRpc0tNKXRoaXMubTIuaCgwLGEuTil9LCIkMSIsImd3biIsMiwwLDg4LDg5XSwKIGFPOltmdW5jdGlvbihhKXtpZighSi54Qyh0aGlzLkVoLGEpKXJldHVybgogdGhpcy5zd3YoMCxudWxsKQotdGhpcy5aNi5ibygwLCIjL3ZtLWNvbm5lY3QvIil9LCIkMSIsImdrcSIsMiwwLDg3LDg4XSwKK3RoaXMuWjYuYm8oMCwiIy92bS1jb25uZWN0LyIpfSwiJDEiLCJna3EiLDIsMCw4OCw4OV0sCiBUeTpmdW5jdGlvbihhKXt2YXIgej10aGlzLm0yLlRZCiB6PW5ldyBVLktNKEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkseixQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVS5VMiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLDAsbnVsbCwidW5rbm93biIsInVua25vd24iLDAsITEsITEsIiIsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsRC5hZiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYnYpLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiB6Lkx3KCkKIHRoaXMuc3d2KDAseikKIHRoaXMuQVEoITEpfSwKLUUwOmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBVLlpXKEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAuQUUpLDAsInVua25vd24iLCJ1bmtub3duIiwwLCExLCExLCIiLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYWYpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmJ2KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQorRTA6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFUuZFMoSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsUC5BNSksMCwidW5rbm93biIsInVua25vd24iLDAsITEsITEsIiIsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsRC5hZiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYnYpLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiB6Lkx3KCkKIHouWkgoKQogdGhpcy5zd3YoMCx6KQogdGhpcy5BUSghMCl9LAotc3RhdGljOnsiXiI6Im1mPCJ9fSwKK3N0YXRpYzp7Il4iOiJLaDwifX0sCiBjRTp7Ci0iXiI6IlRwOjg5OyIsCisiXiI6IlRwWjo5MDsiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9Si5SRShhKQogcmV0dXJuIEoueEMoei5nZkcoYSksIklzb2xhdGVJbnRlcnJ1cHRlZCIpfHxKLnhDKHouZ2ZHKGEpLCJCcmVha3BvaW50UmVhY2hlZCIpfHxKLnhDKHouZ2ZHKGEpLCJFeGNlcHRpb25UaHJvd24iKX0sCiAkaXNFSDp0cnVlfSwKLWR3OnsKLSJeIjoiVHA6MTM7YSxiIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi54QyhKLmFUKGEpLHRoaXMuYSkmJnRoaXMuYi4kMShhKT09PSEwfSwiJDEiLG51bGwsMiwwLG51bGwsOTAsImNhbGwiXSwKK3hFOnsKKyJeIjoiVHBaOjEzO2EsYiIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEoueEMoSi5hVChhKSx0aGlzLmEpJiZ0aGlzLmIuJDEoYSk9PT0hMH0sIiQxIixudWxsLDIsMCxudWxsLDkxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEtmOnsKICJeIjoiYTtLSiIsCkBAIC0yMzQwLDcgKzIzNjAsNyBAQAogei5WNygicmVtb3ZlUm93cyIsWzAsei5uUSgiZ2V0TnVtYmVyT2ZSb3dzIildKX0sCiBJZDpmdW5jdGlvbihhLGIpe3ZhciB6PVtdCiBDLk5tLkZWKHosSi5rbChiLFAuRW4oKSkpCi10aGlzLktKLlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLlR6KHopLFtudWxsXSldKX19LAordGhpcy5LSi5WNygiYWRkUm93IixbSC5WTShuZXcgUC5HRCh6KSxbbnVsbF0pXSl9fSwKIHF1OnsKICJeIjoiYTt2UixiRyIsCiBXMjpmdW5jdGlvbihhKXt2YXIgej1QLmpUKHRoaXMuYkcpCkBAIC0yMzYzLDcgKzIzODMsNyBAQAogaWYoeT4xJiYhSi54Qyh6WzFdLCIiKSl7aWYoMT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LDEpCiB4PXpbMV19ZWxzZSB4PW51bGx9ZWxzZSB4PW51bGwKIHRoaXMuZWMub2coYSx4KX0sCi1DejpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CitXVjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CiB6PUouVnMoYykuTVcuZ2V0QXR0cmlidXRlKCJocmVmIikKIHk9Si5SRShhKQogeD15LmdwTChhKQpAQCAtMjM3Nyw2NCArMjM5Nyw2NyBAQAogaWYod2luZG93LmxvY2F0aW9uLmhhc2g9PT0iInx8d2luZG93LmxvY2F0aW9uLmhhc2g9PT0iIyIpej0iIyIrdGhpcy5NUAogd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKHosZG9jdW1lbnQudGl0bGUseikKIHRoaXMubFUod2luZG93LmxvY2F0aW9uLmhhc2gpfSwKLXkwOltmdW5jdGlvbihhKXt0aGlzLmxVKHdpbmRvdy5sb2NhdGlvbi5oYXNoKX0sIiQxIiwiZ2JRIiwyLDAsOTEsMTRdLAoreTA6W2Z1bmN0aW9uKGEpe3RoaXMubFUod2luZG93LmxvY2F0aW9uLmhhc2gpfSwiJDEiLCJnYlEiLDIsMCw5MiwxNF0sCiB3YTpmdW5jdGlvbihhKXtyZXR1cm4iIyIrSC5kKGEpfX0sCi11Rzp7CitPUzp7CiAiXiI6IlBpO2k2Pix5RjwiLAogZ0ZMOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnlGfSwKLSRpc3VHOnRydWV9LAotY1o6ewotIl4iOiJ1RztpNix5RixBUCxmbiIsCitnS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZnp9LAorc0t3OmZ1bmN0aW9uKGEsYil7dGhpcy5mej1GLldpKHRoaXMsQy5aZyx0aGlzLmZ6LGIpfSwKK29WOmZ1bmN0aW9uKCl7dGhpcy55Rj1GLldpKHRoaXMsQy5HUCx0aGlzLnlGLG51bGwpfSwKKyRpc09TOnRydWV9LAorYnk6eworIl4iOiJPUztpNix5RixmeixBUCxmbiIsCiBjaTpmdW5jdGlvbigpe2lmKHRoaXMueUY9PW51bGwpe3ZhciB6PVcucjMoInNlcnZpY2UtdmlldyIsbnVsbCkKIHRoaXMueUY9Ri5XaSh0aGlzLEMuR1AsdGhpcy55Rix6KX19LAotRFY6ZnVuY3Rpb24oYSl7aWYoSi54QyhhLCIiKSlyZXR1cm4KLXRoaXMuaTYuRWguY3YoYSkubWwobmV3IEcuenYodGhpcykpLk9BKG5ldyBHLk9YKCkpfSwKK3FZOmZ1bmN0aW9uKGEpe2lmKEoueEMoYSwiIikpcmV0dXJuCit0aGlzLmk2LkVoLmN2KGEpLm1sKG5ldyBHLm1vKHRoaXMpKS5PQShuZXcgRy5HbzUoKSl9LAogVlU6ZnVuY3Rpb24oYSl7cmV0dXJuITB9fSwKLXp2OnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7Si5oOSh0aGlzLmEueUYsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MiwiY2FsbCJdLAorbW86eworIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7Si5oOSh0aGlzLmEueUYsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1PWDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7Ti5RTSgiIikuWVgoIlNlcnZpY2VPYmplY3RQYW5lIHZpc2l0IGVycm9yOiAiK0guZChhKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCitHbzU6eworIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtOLlFNKCIiKS5ZWCgiU2VydmljZU9iamVjdFBhZ2UgdmlzaXQgZXJyb3I6ICIrSC5kKGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAotQkE6ewotIl4iOiJ1RztpNix5RixBUCxmbiIsCit0OTp7CisiXiI6Ik9TO2k2LHlGLGZ6LEFQLGZuIiwKIGNpOmZ1bmN0aW9uKCl7aWYodGhpcy55Rj09bnVsbCl7dmFyIHo9Vy5yMygiY2xhc3MtdHJlZSIsbnVsbCkKIHRoaXMueUY9Ri5XaSh0aGlzLEMuR1AsdGhpcy55Rix6KX19LAotRFY6ZnVuY3Rpb24oYSl7YT1KLlpaKGEsMTEpCi10aGlzLmk2LkVoLmN2KGEpLm1sKG5ldyBHLnlrKHRoaXMpKS5PQShuZXcgRy5xSCgpKX0sCitxWTpmdW5jdGlvbihhKXthPUouWlooYSwxMSkKK3RoaXMuaTYuRWguY3YoYSkubWwobmV3IEcuWmEodGhpcykpLk9BKG5ldyBHLmhhKCkpfSwKIFZVOmZ1bmN0aW9uKGEpe3JldHVybiBKLmNvKGEsImNsYXNzLXRyZWUvIil9LAotc3RhdGljOnsiXiI6Im85eCJ9fSwKLXlrOnsKLSJeIjoiVHA6MTM7YSIsCitzdGF0aWM6eyJeIjoicmprIn19LAorWmE6eworIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hLnlGCi1pZih6IT1udWxsKUoudU0oeixhKX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCitpZih6IT1udWxsKUoudU0oeixhKX0sIiQxIixudWxsLDIsMCxudWxsLDk0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLXFIOnsKLSJeIjoiVHA6MTM7IiwKLSQxOltmdW5jdGlvbihhKXtOLlFNKCIiKS5ZWCgiQ2xhc3NUcmVlUGFuZSB2aXNpdCBlcnJvcjogIitILmQoYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAoraGE6eworIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtOLlFNKCIiKS5ZWCgiQ2xhc3NUcmVlUGFnZSB2aXNpdCBlcnJvcjogIitILmQoYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1mMjp7Ci0iXiI6InVHO2k2LHlGLEFQLGZuIiwKK1N5OnsKKyJeIjoiT1M7aTYseUYsZnosQVAsZm4iLAogY2k6ZnVuY3Rpb24oKXtpZih0aGlzLnlGPT1udWxsKXt2YXIgej1XLnIzKCJzZXJ2aWNlLXZpZXciLG51bGwpCiB0aGlzLnlGPUYuV2kodGhpcyxDLkdQLHRoaXMueUYseil9fSwKLURWOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3FZOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9SC5Hbyh0aGlzLnlGLCIkaXNUaSIpCiB5PXRoaXMuaTYuUHYKIHouTGw9Si5RNSh6LEMudGQsei5MbCx5KX0sCiBWVTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jbyhhLCJlcnJvci8iKX19LAotSFM6ewotIl4iOiJ1RztpNix5RixBUCxmbiIsCit2NTp7CisiXiI6Ik9TO2k2LHlGLGZ6LEFQLGZuIiwKIGNpOmZ1bmN0aW9uKCl7aWYodGhpcy55Rj09bnVsbCl7dmFyIHo9Vy5yMygidm0tY29ubmVjdCIsbnVsbCkKIHRoaXMueUY9Ri5XaSh0aGlzLEMuR1AsdGhpcy55Rix6KX19LAotRFY6ZnVuY3Rpb24oYSl7fSwKK3FZOmZ1bmN0aW9uKGEpe30sCiBWVTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jbyhhLCJ2bS1jb25uZWN0LyIpfX0sCiB1dDp7CiAiXiI6ImE7SVUiLAotY3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIEcub2godGhpcy5JVSsiLiIrSC5kKGEpKX19LAotdHg6ewotIl4iOiJUcDo1OyIsCitjdjpmdW5jdGlvbihhKXtyZXR1cm4gRy5Yayh0aGlzLklVKyIuIitILmQoYSkpfX0sCitLRjp7CisiXiI6IlRwWjo1OyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9Qy54ci5rVihhKQogaWYoej09bnVsbClyZXR1cm4gegpAQCAtMjQ0MywxNSArMjQ2NiwxNSBAQAogd2hpbGUoITApe3c9eS5nQih6KQogaWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCiBpZighKHg8dykpYnJlYWsKLXkudSh6LHgsVS5LOSh5LnQoeix4KSkpOysreH1yZXR1cm4gen0sIiQxIixudWxsLDIsMCxudWxsLDk0LCJjYWxsIl0sCit5LnUoeix4LFUuSzkoeS50KHoseCkpKTsrK3h9cmV0dXJuIHp9LCIkMSIsbnVsbCwyLDAsbnVsbCw5NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1LRjp7Ci0iXiI6IlRwOjEzOyIsCitYTjp7CisiXiI6IlRwWjoxMzsiLAogJDE6W2Z1bmN0aW9uKGEpe30sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbkQ6ewogIl4iOiJkMzt3dSxqWT4sVFkscm8sZFVDLHB0IiwKLU5ZOmZ1bmN0aW9uKCl7cmV0dXJuIndzOi8vIitILmQod2luZG93LmxvY2F0aW9uLmhvc3QpKyIvd3MifSwKK0JaOmZ1bmN0aW9uKCl7cmV0dXJuIndzOi8vIitILmQod2luZG93LmxvY2F0aW9uLmhvc3QpKyIvd3MifSwKIFRQOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuTUcoYSkKIGlmKHohPW51bGwpcmV0dXJuIHoKIHo9bmV3IFUuWjUoMCwhMSxudWxsLGEpCkBAIC0yNDYxLDcgKzI0ODQsNyBAQAogej17fQogei5hPW51bGwKIHk9dGhpcy5qWQoteS5hTih5LG5ldyBHLkxhKHosYSkpCit5LmFOKHksbmV3IEcuVW4oeixhKSkKIHJldHVybiB6LmF9LAogaDpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGlmKGIuZ0E5KCk9PT0hMClyZXR1cm4KQEAgLTI0ODQsNyArMjUwNyw3IEBACiBVSjpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5qWQogei5WMSh6KQoteT1HLm9oKHRoaXMud3UuSVUrIi5oaXN0b3J5IikKK3k9Ry5Yayh0aGlzLnd1LklVKyIuaGlzdG9yeSIpCiBpZih5PT1udWxsKXJldHVybgogeD1KLlU2KHkpCiB3PTAKQEAgLTI0OTQsMTYgKzI1MTcsMTYgQEAKIHgudSh5LHcsVS5LOSh4LnQoeSx3KSkpOysrd316LkZWKDAseSkKIHRoaXMuWFQoKX0sCiBGZjpmdW5jdGlvbigpe3RoaXMuVUooKQotdmFyIHo9dGhpcy5UUCh0aGlzLk5ZKCkpCit2YXIgej10aGlzLlRQKHRoaXMuQlooKSkKIHRoaXMuVFk9egogdGhpcy5oKDAseil9LAotc3RhdGljOnsiXiI6IkFOIn19LAotTGE6ewotIl4iOiJUcDoxMzthLGIiLAorc3RhdGljOnsiXiI6ImRJIn19LAorVW46eworIl4iOiJUcFo6MTM7YSxiIiwKICQxOmZ1bmN0aW9uKGEpe2lmKEoueEMoYS5ndzgoKSx0aGlzLmIpJiZKLnhDKGEuZ0E5KCksITEpKXRoaXMuYS5hPWF9LAogJGlzRUg6dHJ1ZX0sCiBqUTp7Ci0iXiI6IlRwOjk1OyIsCisiXiI6IlRwWjo5NjsiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5GVyhiLmdlWCgpLGEuZ2VYKCkpfSwKICRpc0VIOnRydWV9LAogWTI6ewpAQCAtMjUyMSw3ICsyNTQ0LDcgQEAKIHJldHVybiB0aGlzLnlxfSwKIGs3OmZ1bmN0aW9uKGEpe2lmKCF0aGlzLk5oKCkpdGhpcy5hWj1GLldpKHRoaXMsQy5Qbix0aGlzLmFaLCJ2aXNpYmlsaXR5OmhpZGRlbjsiKX0sCiAkaXNZMjp0cnVlfSwKLVhOOnsKK2lZOnsKICJeIjoiUGk7dnA+LEFQLGZuIiwKIG1BOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy52cApAQCAtMjU2MSwxMCArMjU4NCwxMCBAQAogRi5XaSh0aGlzLEMuSkIsMCwxKX0sCiBlRTpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMudnAKIGlmKGE+Pj4wIT09YXx8YT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCi1yZXR1cm4gSi5VUShKLlRQKHpbYV0pLGIpfSwKK3JldHVybiBKLlVRKEouVThvKHpbYV0pLGIpfSwKIFBWOltmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuZUUoYSx0aGlzLnBUKQotcmV0dXJuIEouRlcodGhpcy5lRShiLHRoaXMucFQpLHopfSwiJDIiLCJncFBYIiw0LDAsOTZdLAotekY6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouRlcodGhpcy5lRShhLHRoaXMucFQpLHRoaXMuZUUoYix0aGlzLnBUKSl9LCIkMiIsImdQZCIsNCwwLDk2XSwKK3JldHVybiBKLkZXKHRoaXMuZUUoYix0aGlzLnBUKSx6KX0sIiQyIiwiZ3BQWCIsNCwwLDk3XSwKK3pGOltmdW5jdGlvbihhLGIpe3JldHVybiBKLkZXKHRoaXMuZUUoYSx0aGlzLnBUKSx0aGlzLmVFKGIsdGhpcy5wVCkpfSwiJDIiLCJnUGQiLDQsMCw5N10sCiBKZDpmdW5jdGlvbihhKXt2YXIgeix5CiBuZXcgUC5WVigxMDAwMDAwLG51bGwsbnVsbCkud0UoMCkKIHo9dGhpcy56egpAQCAtMjU3OSw3ICsyNjAyLDcgQEAKIEd1OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej10aGlzLnZwCiBpZihhPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYSkKLXk9Si5VUShKLlRQKHpbYV0pLGIpCit5PUouVVEoSi5VOG8oelthXSksYikKIHo9dGhpcy5vSAogaWYoYj49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGIpCiByZXR1cm4geltiXS5nT1YoKS4kMSh5KX0sCkBAIC0yNTg5LDE4NDYgKzI2MTIsMTkwMiBAQAogcmV0dXJuIEouZXcoSi5ZcSh6W2FdKSwiXHUyMDAzIil9ej10aGlzLm9ICiBpZihhPj4+MCE9PWF8fGE+PXoubGVuZ3RoKXJldHVybiBILmUoeixhKQogej1KLllxKHpbYV0pCi1yZXR1cm4gSi5ldyh6LHRoaXMualY/Ilx1MjViYyI6Ilx1MjViMiIpfSwiJDEiLCJnQ08iLDIsMCwxNSw5N119fV0sWyJhcHBfYm9vdHN0cmFwIiwiaW5kZXguaHRtbF9ib290c3RyYXAuZGFydCIsLEUseworcmV0dXJuIEouZXcoeix0aGlzLmpWPyJcdTI1YmMiOiJcdTI1YjIiKX0sIiQxIiwiZ0NPIiwyLDAsMTUsOThdfX1dLFsiYXBwX2Jvb3RzdHJhcCIsImluZGV4Lmh0bWxfYm9vdHN0cmFwLmRhcnQiLCxFLHsKICJeIjoiIiwKIEp6OltmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKLXo9UC5FRihbQy5hUCxuZXcgRS5lbSgpLEMuSUgsbmV3IEUuTGIoKSxDLmNnLG5ldyBFLlFBKCksQy5qMixuZXcgRS5DdigpLEMuRVQsbmV3IEUuZWQoKSxDLkJFLG5ldyBFLndhKCksQy5XQyxuZXcgRS5PcigpLEMuaFIsbmV3IEUuWUwoKSxDLlM0LG5ldyBFLndmKCksQy5SbyxuZXcgRS5PYSgpLEMuaE4sbmV3IEUuZW12KCksQy5BVixuZXcgRS5MYmQoKSxDLmJWLG5ldyBFLlFBYSgpLEMuQzAsbmV3IEUuQ3ZTKCksQy5lWixuZXcgRS5lZHkoKSxDLmJrLG5ldyBFLndhRSgpLEMubEgsbmV3IEUuT3JlKCksQy5hbSxuZXcgRS5ZTGEoKSxDLm9FLG5ldyBFLndmYSgpLEMua0csbmV3IEUuT2FhKCksQy5PSSxuZXcgRS5lMCgpLEMuSTksbmV3IEUuZTEoKSxDLlRvLG5ldyBFLmUyKCksQy5YQSxuZXcgRS5lMygpLEMuaTQsbmV3IEUuZTQoKSxDLnF0LG5ldyBFLmU1KCksQy5wMSxuZXcgRS5lNigpLEMueUosbmV3IEUuZTcoKSxDLmxhLG5ldyBFLmU4KCksQy55TCxuZXcgRS5lOSgpLEMuYkosbmV3IEUuZTEwKCksQy5veCxuZXcgRS5lMTEoKSxDLkplLG5ldyBFLmUxMigpLEMuTHcsbmV3IEUuZTEzKCksQy5pRSxuZXcgRS5lMTQoKSxDLmY0LG5ldyBFLmUxNSgpLEMuVkssbmV3IEUuZTE2KCksQy5hSCxuZXcgRS5lMTcoKSxDLmFLLG5ldyBFLmUxOCgpLEMuR1AsbmV3IEUuZTE5KCksQy52cyxuZXcgRS5lMjAoKSxDLkdyLG5ldyBFLmUyMSgpLEMuVFUsbmV3IEUuZTIyKCksQy5GZSxuZXcgRS5lMjMoKSxDLnRQLG5ldyBFLmUyNCgpLEMueWgsbmV3IEUuZTI1KCksQy5aYixuZXcgRS5lMjYoKSxDLnU3LG5ldyBFLmUyNygpLEMucDgsbmV3IEUuZTI4KCksQy5xUixuZXcgRS5lMjkoKSxDLmxkLG5ldyBFLmUzMCgpLEMubmUsbmV3IEUuZTMxKCksQy5CMCxuZXcgRS5lMzIoKSxDLnIxLG5ldyBFLmUzMygpLEMubXIsbmV3IEUuZTM0KCksQy5FayxuZXcgRS5lMzUoKSxDLlBuLG5ldyBFLmUzNigpLEMuWVQsbmV3IEUuZTM3KCksQy5oNyxuZXcgRS5lMzgoKSxDLlIzLG5ldyBFLmUzOSgpLEMuV1EsbmV3IEUuZTQwKCksQy5mVixuZXcgRS5lNDEoKSxDLmpVLG5ldyBFLmU0MigpLEMuR2QsbmV3IEUuZTQzKCksQy5PTyxuZXcgRS5lNDQoKSxDLk1jLG5ldyBFLmU0NSgpLEMuRlAsbmV3IEUuZTQ2KCksQy5rRixuZXcgRS5lNDcoKSxDLlVELG5ldyBFLmU0OCgpLEMuQXEsbmV3IEUuZTQ5KCksQy5EUyxuZXcgRS5lNTAoKSxDLkM5LG5ldyBFLmU1MSgpLEMuVkYsbmV3IEUuZTUyKCksQy51VSxuZXcgRS5lNTMoKSxDLllKLG5ldyBFLmU1NCgpLEMuZUYsbmV3IEUuZTU1KCksQy5vSSxuZXcgRS5lNTYoKSxDLlNULG5ldyBFLmU1NygpLEMuUUgsbmV3IEUuZTU4KCksQy5xWCxuZXcgRS5lNTkoKSxDLnJFLG5ldyBFLmU2MCgpLEMubmYsbmV3IEUuZTYxKCksQy5wTyxuZXcgRS5lNjIoKSxDLkVJLG5ldyBFLmU2MygpLEMuSkIsbmV3IEUuZTY0KCksQy5SWSxuZXcgRS5lNjUoKSxDLmQ0LG5ldyBFLmU2NigpLEMuY0YsbmV3IEUuZTY3KCksQy5RbCxuZXcgRS5lNjgoKSxDLlNJLG5ldyBFLmU2OSgpLEMuelMsbmV3IEUuZTcwKCksQy5ZQSxuZXcgRS5lNzEoKSxDLmFrLG5ldyBFLmU3MigpLEMuR2UsbmV3IEUuZTczKCksQy5IZSxuZXcgRS5lNzQoKSxDLmltLG5ldyBFLmU3NSgpLEMuU3MsbmV3IEUuZTc2KCksQy5rNixuZXcgRS5lNzcoKSxDLm9qLG5ldyBFLmU3OCgpLEMuUEosbmV3IEUuZTc5KCksQy5xMixuZXcgRS5lODAoKSxDLmQyLG5ldyBFLmU4MSgpLEMua04sbmV3IEUuZTgyKCksQy5mbixuZXcgRS5lODMoKSxDLnlCLG5ldyBFLmU4NCgpLEMuZUosbmV3IEUuZTg1KCksQy5pRyxuZXcgRS5lODYoKSxDLlB5LG5ldyBFLmU4NygpLEMucEMsbmV3IEUuZTg4KCksQy51dSxuZXcgRS5lODkoKSxDLnFzLG5ldyBFLmU5MCgpLEMuWEgsbmV3IEUuZTkxKCksQy50SixuZXcgRS5lOTIoKSxDLkY4LG5ldyBFLmU5MygpLEMuQzEsbmV3IEUuZTk0KCksQy5uTCxuZXcgRS5lOTUoKSxDLmEwLG5ldyBFLmU5NigpLEMuWWcsbmV3IEUuZTk3KCksQy5iUixuZXcgRS5lOTgoKSxDLmFpLG5ldyBFLmU5OSgpLEMub2IsbmV3IEUuZTEwMCgpLEMuSXYsbmV3IEUuZTEwMSgpLEMuV2csbmV3IEUuZTEwMigpLEMudEQsbmV3IEUuZTEwMygpLEMublosbmV3IEUuZTEwNCgpLEMuT2YsbmV3IEUuZTEwNSgpLEMucFksbmV3IEUuZTEwNigpLEMuWEwsbmV3IEUuZTEwNygpLEMuTEEsbmV3IEUuZTEwOCgpLEMuTGssbmV3IEUuZTEwOSgpLEMuZEssbmV3IEUuZTExMCgpLEMueGYsbmV3IEUuZTExMSgpLEMuckIsbmV3IEUuZTExMigpLEMuYnosbmV3IEUuZTExMygpLEMuSngsbmV3IEUuZTExNCgpLEMuYjUsbmV3IEUuZTExNSgpLEMuTGMsbmV3IEUuZTExNigpLEMuaGYsbmV3IEUuZTExNygpLEMudWssbmV3IEUuZTExOCgpLEMuWmksbmV3IEUuZTExOSgpLEMuVE4sbmV3IEUuZTEyMCgpLEMua0EsbmV3IEUuZTEyMSgpLEMuR0ksbmV3IEUuZTEyMigpLEMuV24sbmV3IEUuZTEyMygpLEMudXIsbmV3IEUuZTEyNCgpLEMuVk4sbmV3IEUuZTEyNSgpLEMuRVYsbmV3IEUuZTEyNigpLEMuVkksbmV3IEUuZTEyNygpLEMuZWgsbmV3IEUuZTEyOCgpLEMucjYsbmV3IEUuZTEyOSgpLEMuTVcsbmV3IEUuZTEzMCgpLEMuU0EsbmV3IEUuZTEzMSgpLEMua1YsbmV3IEUuZTEzMigpLEMudnAsbmV3IEUuZTEzMygpLEMuY2MsbmV3IEUuZTEzNCgpLEMuRFksbmV3IEUuZTEzNSgpLEMuTHgsbmV3IEUuZTEzNigpLEMuTTMsbmV3IEUuZTEzNygpLEMud1QsbmV3IEUuZTEzOCgpLEMuU1IsbmV3IEUuZTEzOSgpLEMudDYsbmV3IEUuZTE0MCgpLEMuclAsbmV3IEUuZTE0MSgpLEMucFgsbmV3IEUuZTE0MigpLEMuVkQsbmV3IEUuZTE0MygpLEMuTk4sbmV3IEUuZTE0NCgpLEMuVVgsbmV3IEUuZTE0NSgpLEMuWVMsbmV3IEUuZTE0NigpLEMucHUsbmV3IEUuZTE0NygpLEMuQkosbmV3IEUuZTE0OCgpLEMuYzYsbmV3IEUuZTE0OSgpLEMudGQsbmV3IEUuZTE1MCgpLEMuR24sbmV3IEUuZTE1MSgpLEMuek8sbmV3IEUuZTE1MigpLEMudmcsbmV3IEUuZTE1MygpLEMuWXMsbmV3IEUuZTE1NCgpLEMuem0sbmV3IEUuZTE1NSgpLEMuWE0sbmV3IEUuZTE1NigpLEMuSWMsbmV3IEUuZTE1NygpLEMueUcsbmV3IEUuZTE1OCgpLEMudUksbmV3IEUuZTE1OSgpLEMuTzksbmV3IEUuZTE2MCgpLEMuYmEsbmV3IEUuZTE2MSgpLEMudFcsbmV3IEUuZTE2MigpLEMuQ0csbmV3IEUuZTE2MygpLEMuV2osbmV3IEUuZTE2NCgpLEMudmIsbmV3IEUuZTE2NSgpLEMuVUwsbmV3IEUuZTE2NigpLEMuQVksbmV3IEUuZTE2NygpLEMuUUssbmV3IEUuZTE2OCgpLEMuQU8sbmV3IEUuZTE2OSgpLEMuWGQsbmV3IEUuZTE3MCgpLEMuSTcsbmV3IEUuZTE3MSgpLEMueFAsbmV3IEUuZTE3MigpLEMuV20sbmV3IEUuZTE3MygpLEMuR1IsbmV3IEUuZTE3NCgpLEMuS1gsbmV3IEUuZTE3NSgpLEMuamEsbmV3IEUuZTE3NigpLEMuRGosbmV3IEUuZTE3NygpLEMuaXIsbmV3IEUuZTE3OCgpLEMuZHgsbmV3IEUuZTE3OSgpLEMubmksbmV3IEUuZTE4MCgpLEMuWDIsbmV3IEUuZTE4MSgpLEMuRjMsbmV3IEUuZTE4MigpLEMuVVksbmV3IEUuZTE4MygpLEMuQWEsbmV3IEUuZTE4NCgpLEMublksbmV3IEUuZTE4NSgpLEMudGcsbmV3IEUuZTE4NigpLEMuSEQsbmV3IEUuZTE4NygpLEMuaVUsbmV3IEUuZTE4OCgpLEMuZU4sbmV3IEUuZTE4OSgpLEMudWUsbmV3IEUuZTE5MCgpLEMubmgsbmV3IEUuZTE5MSgpLEMuTDIsbmV3IEUuZTE5MigpLEMuR3MsbmV3IEUuZTE5MygpLEMuYkUsbmV3IEUuZTE5NCgpLEMuWUQsbmV3IEUuZTE5NSgpLEMuUFgsbmV3IEUuZTE5NigpLEMuTjgsbmV3IEUuZTE5NygpLEMuRUEsbmV3IEUuZTE5OCgpLEMub1csbmV3IEUuZTE5OSgpLEMuaGQsbmV3IEUuZTIwMCgpLEMucEgsbmV3IEUuZTIwMSgpLEMuVmUsbmV3IEUuZTIwMigpLEMuak0sbmV3IEUuZTIwMygpLEMuVzUsbmV3IEUuZTIwNCgpLEMudVgsbmV3IEUuZTIwNSgpLEMubnQsbmV3IEUuZTIwNigpLEMuUE0sbmV3IEUuZTIwNygpLEMueEEsbmV3IEUuZTIwOCgpLEMuazUsbmV3IEUuZTIwOSgpLEMuTnYsbmV3IEUuZTIxMCgpLEMuQ3csbmV3IEUuZTIxMSgpLEMuVFcsbmV3IEUuZTIxMigpLEMueFMsbmV3IEUuZTIxMygpLEMuZnQsbmV3IEUuZTIxNCgpLEMuUUYsbmV3IEUuZTIxNSgpLEMubWksbmV3IEUuZTIxNigpLEMuenosbmV3IEUuZTIxNygpLEMuaE8sbmV3IEUuZTIxOCgpLEMuZWksbmV3IEUuZTIxOSgpLEMuSEssbmV3IEUuZTIyMCgpLEMuamUsbmV3IEUuZTIyMSgpLEMuRWYsbmV3IEUuZTIyMigpLEMuUkgsbmV3IEUuZTIyMygpLEMuUTEsbmV3IEUuZTIyNCgpLEMuSUQsbmV3IEUuZTIyNSgpLEMuejYsbmV3IEUuZTIyNigpLEMuYmMsbmV3IEUuZTIyNygpLEMua3csbmV3IEUuZTIyOCgpLEMuZXAsbmV3IEUuZTIyOSgpLEMuSjIsbmV3IEUuZTIzMCgpLEMuelUsbmV3IEUuZTIzMSgpLEMuYm4sbmV3IEUuZTIzMigpLEMubWgsbmV3IEUuZTIzMygpLEMuRmgsbmV3IEUuZTIzNCgpLEMuTFAsbmV3IEUuZTIzNSgpLEMuamgsbmV3IEUuZTIzNigpLEMuZmosbmV3IEUuZTIzNygpLEMueHcsbmV3IEUuZTIzOCgpLEMuem4sbmV3IEUuZTIzOSgpLEMuUkosbmV3IEUuZTI0MCgpLEMuVGMsbmV3IEUuZTI0MSgpLEMuWUUsbmV3IEUuZTI0MigpLEMuVXksbmV3IEUuZTI0MygpXSxudWxsLG51bGwpCi15PVAuRUYoW0MuYVAsbmV3IEUuZTI0NCgpLEMuY2csbmV3IEUuZTI0NSgpLEMuUzQsbmV3IEUuZTI0NigpLEMuQVYsbmV3IEUuZTI0NygpLEMuYmssbmV3IEUuZTI0OCgpLEMubEgsbmV3IEUuZTI0OSgpLEMuYW0sbmV3IEUuZTI1MCgpLEMub0UsbmV3IEUuZTI1MSgpLEMua0csbmV3IEUuZTI1MigpLEMuWEEsbmV3IEUuZTI1MygpLEMuaTQsbmV3IEUuZTI1NCgpLEMueUwsbmV3IEUuZTI1NSgpLEMuYkosbmV3IEUuZTI1NigpLEMuVkssbmV3IEUuZTI1NygpLEMuYUgsbmV3IEUuZTI1OCgpLEMudnMsbmV3IEUuZTI1OSgpLEMuR3IsbmV3IEUuZTI2MCgpLEMuRmUsbmV3IEUuZTI2MSgpLEMudFAsbmV3IEUuZTI2MigpLEMueWgsbmV3IEUuZTI2MygpLEMuWmIsbmV3IEUuZTI2NCgpLEMucDgsbmV3IEUuZTI2NSgpLEMubGQsbmV3IEUuZTI2NigpLEMubmUsbmV3IEUuZTI2NygpLEMuQjAsbmV3IEUuZTI2OCgpLEMubXIsbmV3IEUuZTI2OSgpLEMuWVQsbmV3IEUuZTI3MCgpLEMuV1EsbmV3IEUuZTI3MSgpLEMualUsbmV3IEUuZTI3MigpLEMuR2QsbmV3IEUuZTI3MygpLEMuT08sbmV3IEUuZTI3NCgpLEMuTWMsbmV3IEUuZTI3NSgpLEMuUUgsbmV3IEUuZTI3NigpLEMuckUsbmV3IEUuZTI3NygpLEMubmYsbmV3IEUuZTI3OCgpLEMuUWwsbmV3IEUuZTI3OSgpLEMuYWssbmV3IEUuZTI4MCgpLEMuR2UsbmV3IEUuZTI4MSgpLEMuSGUsbmV3IEUuZTI4MigpLEMub2osbmV3IEUuZTI4MygpLEMuZDIsbmV3IEUuZTI4NCgpLEMuZm4sbmV3IEUuZTI4NSgpLEMueUIsbmV3IEUuZTI4NigpLEMuUHksbmV3IEUuZTI4NygpLEMudXUsbmV3IEUuZTI4OCgpLEMucXMsbmV3IEUuZTI4OSgpLEMuYTAsbmV3IEUuZTI5MCgpLEMuckIsbmV3IEUuZTI5MSgpLEMuTGMsbmV3IEUuZTI5MigpLEMuaGYsbmV3IEUuZTI5MygpLEMudWssbmV3IEUuZTI5NCgpLEMuWmksbmV3IEUuZTI5NSgpLEMuVE4sbmV3IEUuZTI5NigpLEMua0EsbmV3IEUuZTI5NygpLEMudXIsbmV3IEUuZTI5OCgpLEMuRVYsbmV3IEUuZTI5OSgpLEMuZWgsbmV3IEUuZTMwMCgpLEMuU0EsbmV3IEUuZTMwMSgpLEMua1YsbmV3IEUuZTMwMigpLEMudnAsbmV3IEUuZTMwMygpLEMuU1IsbmV3IEUuZTMwNCgpLEMudDYsbmV3IEUuZTMwNSgpLEMuVVgsbmV3IEUuZTMwNigpLEMuWVMsbmV3IEUuZTMwNygpLEMuYzYsbmV3IEUuZTMwOCgpLEMudGQsbmV3IEUuZTMwOSgpLEMuek8sbmV3IEUuZTMxMCgpLEMuWXMsbmV3IEUuZTMxMSgpLEMuWE0sbmV3IEUuZTMxMigpLEMuSWMsbmV3IEUuZTMxMygpLEMuTzksbmV3IEUuZTMxNCgpLEMudFcsbmV3IEUuZTMxNSgpLEMuV2osbmV3IEUuZTMxNigpLEMudmIsbmV3IEUuZTMxNygpLEMuUUssbmV3IEUuZTMxOCgpLEMuQU8sbmV3IEUuZTMxOSgpLEMuWGQsbmV3IEUuZTMyMCgpLEMueFAsbmV3IEUuZTMyMSgpLEMuR1IsbmV3IEUuZTMyMigpLEMuS1gsbmV3IEUuZTMyMygpLEMuamEsbmV3IEUuZTMyNCgpLEMuRGosbmV3IEUuZTMyNSgpLEMuWDIsbmV3IEUuZTMyNigpLEMuVVksbmV3IEUuZTMyNygpLEMuQWEsbmV3IEUuZTMyOCgpLEMublksbmV3IEUuZTMyOSgpLEMudGcsbmV3IEUuZTMzMCgpLEMuSEQsbmV3IEUuZTMzMSgpLEMuaVUsbmV3IEUuZTMzMigpLEMuZU4sbmV3IEUuZTMzMygpLEMuR3MsbmV3IEUuZTMzNCgpLEMuYkUsbmV3IEUuZTMzNSgpLEMuWUQsbmV3IEUuZTMzNigpLEMuUFgsbmV3IEUuZTMzNygpLEMucEgsbmV3IEUuZTMzOCgpLEMuVmUsbmV3IEUuZTMzOSgpLEMuak0sbmV3IEUuZTM0MCgpLEMudVgsbmV3IEUuZTM0MSgpLEMubnQsbmV3IEUuZTM0MigpLEMuUE0sbmV3IEUuZTM0MygpLEMuTnYsbmV3IEUuZTM0NCgpLEMuQ3csbmV3IEUuZTM0NSgpLEMuVFcsbmV3IEUuZTM0NigpLEMuZnQsbmV3IEUuZTM0NygpLEMubWksbmV3IEUuZTM0OCgpLEMuenosbmV3IEUuZTM0OSgpLEMuejYsbmV3IEUuZTM1MCgpLEMua3csbmV3IEUuZTM1MSgpLEMuelUsbmV3IEUuZTM1MigpLEMuUkosbmV3IEUuZTM1MygpLEMuWUUsbmV3IEUuZTM1NCgpXSxudWxsLG51bGwpCi14PVAuRUYoW0MuSzQsQy5xSixDLnlTLEMuTXQsQy5PRyxDLmlsLEMubncsQy5NdCxDLnhFLEMuTXQsQy5vVCxDLmlsLEMualIsQy5NdCxDLkxnLEMucUosQy5LTyxDLk10LEMud2ssQy5NdCxDLmpBLEMucUosQy5KbyxDLmlsLEMuQXosQy5NdCxDLlZ4LEMuTXQsQy5CTCxDLk10LEMubEUsQy5hbCxDLnRlLEMuTXQsQy5pRCxDLk10LEMuSnUsQy5NdCxDLld6LEMuaWwsQy5NSSxDLk10LEMucEYsQy5pbCxDLldoLEMuTXQsQy5xRixDLk10LEMublgsQy5pbCxDLlpqLEMuTXQsQy5FcCxDLk10LEMuZEQsQy5hbCxDLmhQLEMuTXQsQy50YyxDLk10LEMuclIsQy5pbCxDLm9HLEMuTXQsQy5KZixDLmlsLEMuRVosQy5NdCxDLkZHLEMuaWwsQy5wSixDLk10LEMudFUsQy5NdCxDLkRELEMuTXQsQy5ZeSxDLmlsLEMuWHYsQy5NdCxDLmNlLEMuTXQsQy5VSixDLmlsLEMuY2EsQy5NdCxDLklvLEMuTXQsQy5qNCxDLk10LEMuRUcsQy5NdCxDLkNULEMuTXQsQy5tcSxDLk10LEMuVHEsQy5NdCxDLmxwLEMuaWwsQy5QVCxDLk10LEMuRXksQy5NdCxDLmttLEMuTXQsQy52dyxDLk10LEMuTFQsQy5NdCxDLk5XLEMubDQsQy5tcyxDLk10LEMuRkEsQy5NdCxDLlF0LEMuTXQsQy5hOCxDLk10LEMuSlcsQy5NdCxDLk1mLEMuTXQsQy5EbCxDLk10LEMubDQsQy5xSixDLk9OLEMuTXQsQy5TYixDLmFsLEMuVGgsQy5NdCxDLndILEMuTXQsQy5wSyxDLk10LEMuaWwsQy5NdCxDLlg4LEMuTXQsQy5ZMyxDLnFKLEMuTlIsQy5NdCxDLnZ1LEMuTXQsQy5iQyxDLk10LEMud3MsQy5NdCxDLmNLLEMuaWwsQy5qSyxDLk10LEMucUosQy5qdyxDLk10LEMubDQsQy5hbCxDLmlsXSxudWxsLG51bGwpCi13PVAuRUYoW0MuSzQsUC5FRihbQy5TNCxDLkZCLEMuQVYsQy5RcCxDLmhmLEMuVjBdLG51bGwsbnVsbCksQy55UyxQLkVGKFtDLlVYLEMuUHRdLG51bGwsbnVsbCksQy5PRyxDLkNNLEMubncsUC5FRihbQy5yQixDLnhZLEMuYnosQy5Ca10sbnVsbCxudWxsKSxDLnhFLFAuRUYoW0MuWEEsQy5kcSxDLnlCLEMudlosQy50ZyxDLkRDXSxudWxsLG51bGwpLEMub1QsUC5FRihbQy5pNCxDLlFzLEMuV20sQy5RV10sbnVsbCxudWxsKSxDLmpSLFAuRUYoW0MuaTQsQy5hSl0sbnVsbCxudWxsKSxDLkxnLFAuRUYoW0MuUzQsQy5GQixDLkFWLEMuUXAsQy5CMCxDLmI2LEMucjEsQy5uUCxDLm1yLEMuSEVdLG51bGwsbnVsbCksQy5LTyxQLkVGKFtDLnloLEMuemRdLG51bGwsbnVsbCksQy53ayxQLkVGKFtDLkFWLEMuZnIsQy5laCxDLnJILEMuQWEsQy5VeixDLm1pLEMueVZdLG51bGwsbnVsbCksQy5qQSxQLkVGKFtDLlM0LEMuRkIsQy5BVixDLlFwLEMuWVQsQy5MQyxDLmhmLEMuVjAsQy5VWSxDLm42XSxudWxsLG51bGwpLEMuSm8sQy5DTSxDLkF6LFAuRUYoW0MuV1EsQy5haF0sbnVsbCxudWxsKSxDLlZ4LFAuRUYoW0MuT08sQy5DZl0sbnVsbCxudWxsKSxDLkJMLFAuRUYoW0MuTWMsQy5mMF0sbnVsbCxudWxsKSxDLmxFLFAuRUYoW0MuUWwsQy5USixDLmFrLEMueUksQy5hMCxDLlA5LEMuUUssQy5ZbyxDLldtLEMuUVddLG51bGwsbnVsbCksQy50ZSxQLkVGKFtDLm5mLEMuVjMsQy5wTyxDLmF1LEMuTGMsQy5QYyxDLkFPLEMuZmldLG51bGwsbnVsbCksQy5pRCxQLkVGKFtDLlFILEMuQzQsQy5xWCxDLmRPLEMuUE0sQy5qdl0sbnVsbCxudWxsKSxDLkp1LFAuRUYoW0Mua0csQy5QcixDLnJCLEMueFksQy5aaSxDLnh4LEMuVE4sQy5HaixDLnZiLEMuTXEsQy5VTCxDLm1NXSxudWxsLG51bGwpLEMuV3osQy5DTSxDLk1JLFAuRUYoW0MuZm4sQy5meixDLlhNLEMuVHQsQy50ZyxDLkRDXSxudWxsLG51bGwpLEMucEYsQy5DTSxDLldoLFAuRUYoW0MueUwsQy5qNV0sbnVsbCxudWxsKSxDLnFGLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLm5YLEMuQ00sQy5aaixQLkVGKFtDLm9qLEMuR1RdLG51bGwsbnVsbCksQy5FcCxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5kRCxQLkVGKFtDLnBILEMuRmtdLG51bGwsbnVsbCksQy5oUCxQLkVGKFtDLldqLEMuQWhdLG51bGwsbnVsbCksQy50YyxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5yUixDLkNNLEMub0csUC5FRihbQy5qVSxDLmJ3XSxudWxsLG51bGwpLEMuSmYsQy5DTSxDLkVaLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLkZHLEMuQ00sQy5wSixQLkVGKFtDLlZlLEMuWDRdLG51bGwsbnVsbCksQy50VSxQLkVGKFtDLnFzLEMuTU5dLG51bGwsbnVsbCksQy5ERCxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5ZeSxDLkNNLEMuWHYsUC5FRihbQy5ZRSxDLldsXSxudWxsLG51bGwpLEMuY2UsUC5FRihbQy5hSCxDLnczLEMuSGUsQy5vVixDLnZiLEMuTXEsQy5VTCxDLm1NLEMuRGosQy5BeSxDLkdzLEMuaU8sQy5iRSxDLmgzLEMuWUQsQy5mUCxDLlRXLEMuSDAsQy54UyxDLmJCLEMuenosQy5sU10sbnVsbCxudWxsKSxDLlVKLEMuQ00sQy5jYSxQLkVGKFtDLmJKLEMuVUksQy5veCxDLlJoXSxudWxsLG51bGwpLEMuSW8sUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuajQsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuRUcsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuQ1QsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMubXEsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuVHEsUC5FRihbQy5TUixDLlM5LEMudDYsQy5ocixDLnJQLEMuTnRdLG51bGwsbnVsbCksQy5scCxDLkNNLEMuUFQsUC5FRihbQy5FVixDLlpRXSxudWxsLG51bGwpLEMuRXksUC5FRihbQy5YQSxDLmRxLEMudWssQy5wNF0sbnVsbCxudWxsKSxDLmttLFAuRUYoW0MuckIsQy5SVSxDLmJ6LEMuQmssQy51ayxDLnA0XSxudWxsLG51bGwpLEMudncsUC5FRihbQy51ayxDLnA0LEMuRVYsQy5aUV0sbnVsbCxudWxsKSxDLkxULFAuRUYoW0MuWXMsQy5DZV0sbnVsbCxudWxsKSxDLk5XLEMuQ00sQy5tcyxQLkVGKFtDLmNnLEMubGwsQy51ayxDLnA0LEMua1YsQy52el0sbnVsbCxudWxsKSxDLkZBLFAuRUYoW0MuY2csQy5sbCxDLmtWLEMudnpdLG51bGwsbnVsbCksQy5RdCxQLkVGKFtDLmxkLEMuR3ddLG51bGwsbnVsbCksQy5hOCxQLkVGKFtDLnA4LEMudWMsQy5sZCxDLkd3XSxudWxsLG51bGwpLEMuSlcsUC5FRihbQy5hUCxDLnhELEMuQVYsQy5RcCxDLmhmLEMuVjBdLG51bGwsbnVsbCksQy5NZixQLkVGKFtDLnVrLEMucDRdLG51bGwsbnVsbCksQy5EbCxQLkVGKFtDLlZLLEMuT2RdLG51bGwsbnVsbCksQy5sNCxQLkVGKFtDLk85LEMucTksQy5iYSxDLmtRXSxudWxsLG51bGwpLEMuT04sUC5FRihbQy52cyxDLk1QLEMuR3IsQy5WSixDLlRVLEMuQ3AsQy5TQSxDLktJLEMudFcsQy5rSCxDLkNHLEMuTWwsQy5QWCxDLmp6LEMuTjgsQy5xRSxDLm50LEMuVlNdLG51bGwsbnVsbCksQy5TYixQLkVGKFtDLnRXLEMua0gsQy5DRyxDLk1sXSxudWxsLG51bGwpLEMuVGgsUC5FRihbQy5QWCxDLmp6XSxudWxsLG51bGwpLEMud0gsUC5FRihbQy55aCxDLmxKXSxudWxsLG51bGwpLEMucEssUC5FRihbQy5uZSxDLnJaXSxudWxsLG51bGwpLEMuaWwsUC5FRihbQy51dSxDLnlZLEMueFAsQy5UTyxDLldtLEMuUVddLG51bGwsbnVsbCksQy5YOCxQLkVGKFtDLnRkLEMuWmssQy5HbixDLmF6XSxudWxsLG51bGwpLEMuWTMsUC5FRihbQy5iayxDLlVkLEMubEgsQy5kRyxDLnpVLEMudVRdLG51bGwsbnVsbCksQy5OUixQLkVGKFtDLnJFLEMuS1NdLG51bGwsbnVsbCksQy52dSxQLkVGKFtDLmt3LEMub0NdLG51bGwsbnVsbCksQy5iQyxQLkVGKFtDLmFtLEMuSkQsQy5vRSxDLnIyLEMudVgsQy5FYl0sbnVsbCxudWxsKSxDLndzLFAuRUYoW0MuZnQsQy51M10sbnVsbCxudWxsKSxDLmNLLEMuQ00sQy5qSyxQLkVGKFtDLnloLEMuVWwsQy5SSixDLkJQXSxudWxsLG51bGwpXSxudWxsLG51bGwpCi12PU8udHkobmV3IE8uT2ooeix5LHgsdyxDLkNNLFAuRUYoW0MuYVAsImFjdGl2ZSIsQy5JSCwiYWRkcmVzcyIsQy5jZywiYW5jaG9yIixDLmoyLCJhcHAiLEMuRVQsImFzc2VydHNFbmFibGVkIixDLkJFLCJhdmVyYWdlQ29sbGVjdGlvblBlcmlvZEluTWlsbGlzIixDLldDLCJicHQiLEMuaFIsImJyZWFrcG9pbnQiLEMuUzQsImJ1c3kiLEMuUm8sImJ1dHRvbkNsaWNrIixDLmhOLCJieXRlcyIsQy5BViwiY2FsbGJhY2siLEMuYlYsImNhcGFjaXR5IixDLkMwLCJjaGFuZ2UiLEMuZVosImNoYW5nZVNvcnQiLEMuYmssImNoZWNrZWQiLEMubEgsImNoZWNrZWRUZXh0IixDLmFtLCJjaHJvbWVUYXJnZXRzIixDLm9FLCJjaHJvbWl1bUFkZHJlc3MiLEMua0csImNsYXNzVGFibGUiLEMuT0ksImNsYXNzZXMiLEMuSTksImNsb3NlSXRlbSIsQy5UbywiY2xvc2luZyIsQy5YQSwiY2xzIixDLmk0LCJjb2RlIixDLnF0LCJjb2xvcmluZyIsQy5wMSwiY29sdW1ucyIsQy55SiwiY29ubmVjdFN0YW5kYWxvbmUiLEMubGEsImNvbm5lY3RUb1ZtIixDLnlMLCJjb25uZWN0aW9uIixDLmJKLCJjb3VudGVycyIsQy5veCwiY291bnRlcnNDaGFuZ2VkIixDLkplLCJjdXJyZW50IixDLkx3LCJkZWxldGVWbSIsQy5pRSwiZGVzY3JpcHRvciIsQy5mNCwiZGVzY3JpcHRvcnMiLEMuVkssImRldnRvb2xzIixDLmFILCJkaXNwbGF5Q3V0b2ZmIixDLmFLLCJkb0FjdGlvbiIsQy5HUCwiZWxlbWVudCIsQy52cywiZW5kTGluZSIsQy5HciwiZW5kUG9zIixDLlRVLCJlbmRQb3NDaGFuZ2VkIixDLkZlLCJlbmRUb2tlblBvcyIsQy50UCwiZW50cnkiLEMueWgsImVycm9yIixDLlpiLCJldmFsIixDLnU3LCJldmFsTm93IixDLnA4LCJldmVudCIsQy5xUiwiZXZlbnRUeXBlIixDLmxkLCJldmVudHMiLEMubmUsImV4Y2VwdGlvbiIsQy5CMCwiZXhwYW5kIixDLnIxLCJleHBhbmRDaGFuZ2VkIixDLm1yLCJleHBhbmRlZCIsQy5FaywiZXhwYW5kZXIiLEMuUG4sImV4cGFuZGVyU3R5bGUiLEMuWVQsImV4cHIiLEMuaDcsImV4dGVybmFsIixDLlIzLCJmZCIsQy5XUSwiZmllbGQiLEMuZlYsImZpZWxkcyIsQy5qVSwiZmlsZSIsQy5HZCwiZmlyc3RUb2tlblBvcyIsQy5PTywiZmxhZyIsQy5NYywiZmxhZ0xpc3QiLEMuRlAsImZvcm1hdFNpemUiLEMua0YsImZvcm1hdFRpbWUiLEMuVUQsImZvcm1hdHRlZEFkZHJlc3MiLEMuQXEsImZvcm1hdHRlZEF2ZXJhZ2UiLEMuRFMsImZvcm1hdHRlZENvbGxlY3Rpb25zIixDLkM5LCJmb3JtYXR0ZWREZW9wdElkIixDLlZGLCJmb3JtYXR0ZWRFeGNsdXNpdmUiLEMudVUsImZvcm1hdHRlZEV4Y2x1c2l2ZVRpY2tzIixDLllKLCJmb3JtYXR0ZWRJbmNsdXNpdmUiLEMuZUYsImZvcm1hdHRlZEluY2x1c2l2ZVRpY2tzIixDLm9JLCJmb3JtYXR0ZWRMaW5lIixDLlNULCJmb3JtYXR0ZWRUb3RhbENvbGxlY3Rpb25UaW1lIixDLlFILCJmcmFnbWVudGF0aW9uIixDLnFYLCJmcmFnbWVudGF0aW9uQ2hhbmdlZCIsQy5yRSwiZnJhbWUiLEMubmYsImZ1bmN0aW9uIixDLnBPLCJmdW5jdGlvbkNoYW5nZWQiLEMuRUksImZ1bmN0aW9ucyIsQy5KQiwiZ2V0Q29sdW1uTGFiZWwiLEMuUlksImdldFRhYnMiLEMuZDQsImdvdG8iLEMuY0YsImdvdG9MaW5rIixDLlFsLCJoYXNDbGFzcyIsQy5TSSwiaGFzRGVzY3JpcHRvcnMiLEMuelMsImhhc0Rpc2Fzc2VtYmx5IixDLllBLCJoYXNOb0FsbG9jYXRpb25zIixDLmFrLCJoYXNQYXJlbnQiLEMuR2UsImhhc2hMaW5rV29ya2Fyb3VuZCIsQy5IZSwiaGlkZVRhZ3NDaGVja2VkIixDLmltLCJoaXN0b3J5IixDLlNzLCJoaXRzIixDLms2LCJob3ZlclRleHQiLEMub2osImh0dHBTZXJ2ZXIiLEMuUEosImh1bWFuIixDLnEyLCJpZGxlIixDLmQyLCJpbXAiLEMua04sImltcG9ydHMiLEMuZm4sImluc3RhbmNlIixDLnlCLCJpbnN0YW5jZXMiLEMuZUosImluc3RydWN0aW9uIixDLmlHLCJpbnN0cnVjdGlvbnMiLEMuUHksImludGVyZmFjZSIsQy5wQywiaW50ZXJmYWNlcyIsQy51dSwiaW50ZXJuYWwiLEMucXMsImlvIixDLlhILCJpc0Fic3RyYWN0IixDLnRKLCJpc0Jvb2wiLEMuRjgsImlzQ2hyb21lVGFyZ2V0IixDLkMxLCJpc0NvbW1lbnQiLEMubkwsImlzQ3VycmVudFRhcmdldCIsQy5hMCwiaXNEYXJ0IixDLllnLCJpc0RhcnRDb2RlIixDLmJSLCJpc0RvdWJsZSIsQy5haSwiaXNFbXB0eSIsQy5vYiwiaXNFcnJvciIsQy5JdiwiaXNJbnN0YW5jZSIsQy5XZywiaXNJbnQiLEMudEQsImlzTGlzdCIsQy5uWiwiaXNOb3RFbXB0eSIsQy5PZiwiaXNOdWxsIixDLnBZLCJpc09wdGltaXplZCIsQy5YTCwiaXNQYXRjaCIsQy5MQSwiaXNQaXBlIixDLkxrLCJpc1N0cmluZyIsQy5kSywiaXNUeXBlIixDLnhmLCJpc1VuZXhwZWN0ZWQiLEMuckIsImlzb2xhdGUiLEMuYnosImlzb2xhdGVDaGFuZ2VkIixDLkp4LCJpc29sYXRlcyIsQy5iNSwianVtcFRhcmdldCIsQy5MYywia2luZCIsQy5oZiwibGFiZWwiLEMudWssImxhc3QiLEMuWmksImxhc3RBY2N1bXVsYXRvclJlc2V0IixDLlROLCJsYXN0U2VydmljZUdDIixDLmtBLCJsYXN0VG9rZW5Qb3MiLEMuR0ksImxhc3RVcGRhdGUiLEMuV24sImxlbmd0aCIsQy51ciwibGliIixDLlZOLCJsaWJyYXJpZXMiLEMuRVYsImxpYnJhcnkiLEMuVkksImxpbmUiLEMuZWgsImxpbmVNb2RlIixDLnI2LCJsaW5lTnVtYmVyIixDLk1XLCJsaW5lTnVtYmVycyIsQy5TQSwibGluZXMiLEMua1YsImxpbmsiLEMudnAsImxpc3QiLEMuY2MsImxpc3RlbmluZyIsQy5EWSwibG9hZGluZyIsQy5MeCwibG9jYWxBZGRyZXNzIixDLk0zLCJsb2NhbFBvcnQiLEMud1QsIm1haW5Qb3J0IixDLlNSLCJtYXAiLEMudDYsIm1hcEFzU3RyaW5nIixDLnJQLCJtYXBDaGFuZ2VkIixDLnBYLCJtZXNzYWdlIixDLlZELCJtb3VzZU91dCIsQy5OTiwibW91c2VPdmVyIixDLlVYLCJtc2ciLEMuWVMsIm5hbWUiLEMucHUsIm5hbWVJc0VtcHR5IixDLkJKLCJuZXdTcGFjZSIsQy5jNiwibm90aWZpY2F0aW9ucyIsQy50ZCwib2JqZWN0IixDLkduLCJvYmplY3RDaGFuZ2VkIixDLnpPLCJvYmplY3RQb29sIixDLnZnLCJvbGRTcGFjZSIsQy5ZcywicGFkIixDLnptLCJwYWRkaW5nIixDLlhNLCJwYXRoIixDLkljLCJwYXVzZSIsQy55RywicGF1c2VFdmVudCIsQy51SSwicGlkIixDLk85LCJwb2xsUGVyaW9kIixDLmJhLCJwb2xsUGVyaW9kQ2hhbmdlZCIsQy50VywicG9zIixDLkNHLCJwb3NDaGFuZ2VkIixDLldqLCJwcm9jZXNzIixDLnZiLCJwcm9maWxlIixDLlVMLCJwcm9maWxlQ2hhbmdlZCIsQy5BWSwicHJvdG9jb2wiLEMuUUssInF1YWxpZmllZCIsQy5BTywicXVhbGlmaWVkTmFtZSIsQy5YZCwicmVhY2hhYmxlIixDLkk3LCJyZWFkQ2xvc2VkIixDLnhQLCJyZWYiLEMuV20sInJlZkNoYW5nZWQiLEMuR1IsInJlZnJlc2giLEMuS1gsInJlZnJlc2hDb3ZlcmFnZSIsQy5qYSwicmVmcmVzaEdDIixDLkRqLCJyZWZyZXNoVGltZSIsQy5pciwicmVsYXRpdmVMaW5rIixDLmR4LCJyZW1vdGVBZGRyZXNzIixDLm5pLCJyZW1vdGVQb3J0IixDLlgyLCJyZXNldEFjY3VtdWxhdG9yIixDLkYzLCJyZXNwb25zZSIsQy5VWSwicmVzdWx0IixDLkFhLCJyZXN1bHRzIixDLm5ZLCJyZXN1bWUiLEMudGcsInJldGFpbmVkQnl0ZXMiLEMuSEQsInJldGFpbmVkU2l6ZSIsQy5pVSwicmV0YWluaW5nUGF0aCIsQy5lTiwicm9vdExpYiIsQy51ZSwicm93IixDLm5oLCJyb3dzIixDLkwyLCJydW5uaW5nIixDLkdzLCJzYW1wbGVDb3VudCIsQy5iRSwic2FtcGxlRGVwdGgiLEMuWUQsInNhbXBsZVJhdGUiLEMuUFgsInNjcmlwdCIsQy5OOCwic2NyaXB0Q2hhbmdlZCIsQy5FQSwic2NyaXB0cyIsQy5vVywic2VsZWN0RXhwciIsQy5oZCwic2VydmljZVR5cGUiLEMucEgsInNtYWxsIixDLlZlLCJzb2NrZXQiLEMuak0sInNvY2tldE93bmVyIixDLlc1LCJzdGFuZGFsb25lIixDLnVYLCJzdGFuZGFsb25lVm1BZGRyZXNzIixDLm50LCJzdGFydExpbmUiLEMuUE0sInN0YXR1cyIsQy54QSwic3R5bGVGb3JIaXRzIixDLms1LCJzdWJDbGFzc2VzIixDLk52LCJzdWJjbGFzcyIsQy5Ddywic3VwZXJDbGFzcyIsQy5UVywidGFnU2VsZWN0b3IiLEMueFMsInRhZ1NlbGVjdG9yQ2hhbmdlZCIsQy5mdCwidGFyZ2V0IixDLlFGLCJ0YXJnZXRzIixDLm1pLCJ0ZXh0IixDLnp6LCJ0aW1lU3BhbiIsQy5oTywidGlwRXhjbHVzaXZlIixDLmVpLCJ0aXBLaW5kIixDLkhLLCJ0aXBQYXJlbnQiLEMuamUsInRpcFRpY2tzIixDLkVmLCJ0aXBUaW1lIixDLlJILCJ0b1N0cmluZ0FzRml4ZWQiLEMuUTEsInRvZ2dsZUV4cGFuZCIsQy5JRCwidG9nZ2xlRXhwYW5kZWQiLEMuejYsInRva2VuUG9zIixDLmJjLCJ0b3BGcmFtZSIsQy5rdywidHJhY2UiLEMuZXAsInRyZWUiLEMuSjIsInR5cGVDaGVja3NFbmFibGVkIixDLnpVLCJ1bmNoZWNrZWRUZXh0IixDLmJuLCJ1cGRhdGVMaW5lTW9kZSIsQy5taCwidXB0aW1lIixDLkZoLCJ1cmwiLEMuTFAsInVzZWQiLEMuamgsInYiLEMuZmosInZhcmlhYmxlIixDLnh3LCJ2YXJpYWJsZXMiLEMuem4sInZlcnNpb24iLEMuUkosInZtIixDLlRjLCJ2bU5hbWUiLEMuWUUsIndlYlNvY2tldCIsQy5VeSwid3JpdGVDbG9zZWQiXSxudWxsLG51bGwpLCExKSkKK3o9UC5FRihbQy5hUCxuZXcgRS5lbSgpLEMuSUgsbmV3IEUuTGIoKSxDLmNnLG5ldyBFLlFBKCksQy5qMixuZXcgRS5DdigpLEMuWmcsbmV3IEUuZWQoKSxDLkVULG5ldyBFLndhKCksQy5CRSxuZXcgRS5PcigpLEMuV0MsbmV3IEUuWUwoKSxDLmhSLG5ldyBFLndmKCksQy5TNCxuZXcgRS5PYSgpLEMuUm8sbmV3IEUuZW12KCksQy5oTixuZXcgRS5MYmQoKSxDLkFWLG5ldyBFLlFBYSgpLEMuYlYsbmV3IEUuQ3ZTKCksQy5DMCxuZXcgRS5lZHkoKSxDLmVaLG5ldyBFLndhRSgpLEMuYmssbmV3IEUuT3JlKCksQy5sSCxuZXcgRS5ZTGEoKSxDLmFtLG5ldyBFLndmYSgpLEMub0UsbmV3IEUuT2FhKCksQy5rRyxuZXcgRS5lMCgpLEMuT0ksbmV3IEUuZTEoKSxDLkk5LG5ldyBFLmUyKCksQy5UbyxuZXcgRS5lMygpLEMuWEEsbmV3IEUuZTQoKSxDLmk0LG5ldyBFLmU1KCksQy5xdCxuZXcgRS5lNigpLEMucDEsbmV3IEUuZTcoKSxDLnlKLG5ldyBFLmU4KCksQy5sYSxuZXcgRS5lOSgpLEMueUwsbmV3IEUuZTEwKCksQy5iSixuZXcgRS5lMTEoKSxDLm94LG5ldyBFLmUxMigpLEMuSmUsbmV3IEUuZTEzKCksQy5rSSxuZXcgRS5lMTQoKSxDLnZZLG5ldyBFLmUxNSgpLEMuUnMsbmV3IEUuZTE2KCksQy5MdyxuZXcgRS5lMTcoKSxDLmVSLG5ldyBFLmUxOCgpLEMuaUUsbmV3IEUuZTE5KCksQy5mNCxuZXcgRS5lMjAoKSxDLlZLLG5ldyBFLmUyMSgpLEMuYUgsbmV3IEUuZTIyKCksQy5hSyxuZXcgRS5lMjMoKSxDLkdQLG5ldyBFLmUyNCgpLEMudnMsbmV3IEUuZTI1KCksQy5HcixuZXcgRS5lMjYoKSxDLlRVLG5ldyBFLmUyNygpLEMuRmUsbmV3IEUuZTI4KCksQy50UCxuZXcgRS5lMjkoKSxDLnloLG5ldyBFLmUzMCgpLEMuWmIsbmV3IEUuZTMxKCksQy51NyxuZXcgRS5lMzIoKSxDLnA4LG5ldyBFLmUzMygpLEMucVIsbmV3IEUuZTM0KCksQy5sZCxuZXcgRS5lMzUoKSxDLm5lLG5ldyBFLmUzNigpLEMuQjAsbmV3IEUuZTM3KCksQy5yMSxuZXcgRS5lMzgoKSxDLm1yLG5ldyBFLmUzOSgpLEMuRWssbmV3IEUuZTQwKCksQy5QbixuZXcgRS5lNDEoKSxDLllULG5ldyBFLmU0MigpLEMuaDcsbmV3IEUuZTQzKCksQy5SMyxuZXcgRS5lNDQoKSxDLldRLG5ldyBFLmU0NSgpLEMuZlYsbmV3IEUuZTQ2KCksQy5qVSxuZXcgRS5lNDcoKSxDLk9PLG5ldyBFLmU0OCgpLEMuTWMsbmV3IEUuZTQ5KCksQy5GUCxuZXcgRS5lNTAoKSxDLmtGLG5ldyBFLmU1MSgpLEMuVUQsbmV3IEUuZTUyKCksQy5BcSxuZXcgRS5lNTMoKSxDLkRTLG5ldyBFLmU1NCgpLEMuQzksbmV3IEUuZTU1KCksQy5WRixuZXcgRS5lNTYoKSxDLnVVLG5ldyBFLmU1NygpLEMuWUosbmV3IEUuZTU4KCksQy5lRixuZXcgRS5lNTkoKSxDLm9JLG5ldyBFLmU2MCgpLEMuU1QsbmV3IEUuZTYxKCksQy5RSCxuZXcgRS5lNjIoKSxDLnFYLG5ldyBFLmU2MygpLEMuckUsbmV3IEUuZTY0KCksQy5uZixuZXcgRS5lNjUoKSxDLkVJLG5ldyBFLmU2NigpLEMuSkIsbmV3IEUuZTY3KCksQy5SWSxuZXcgRS5lNjgoKSxDLmQ0LG5ldyBFLmU2OSgpLEMuY0YsbmV3IEUuZTcwKCksQy5TSSxuZXcgRS5lNzEoKSxDLnpTLG5ldyBFLmU3MigpLEMuWUEsbmV3IEUuZTczKCksQy5HZSxuZXcgRS5lNzQoKSxDLkE3LG5ldyBFLmU3NSgpLEMuSGUsbmV3IEUuZTc2KCksQy5pbSxuZXcgRS5lNzcoKSxDLlNzLG5ldyBFLmU3OCgpLEMuazYsbmV3IEUuZTc5KCksQy5vaixuZXcgRS5lODAoKSxDLlBKLG5ldyBFLmU4MSgpLEMucTIsbmV3IEUuZTgyKCksQy5kMixuZXcgRS5lODMoKSxDLmtOLG5ldyBFLmU4NCgpLEMuZm4sbmV3IEUuZTg1KCksQy55QixuZXcgRS5lODYoKSxDLmVKLG5ldyBFLmU4NygpLEMuaUcsbmV3IEUuZTg4KCksQy5QeSxuZXcgRS5lODkoKSxDLnBDLG5ldyBFLmU5MCgpLEMudXUsbmV3IEUuZTkxKCksQy5xcyxuZXcgRS5lOTIoKSxDLlhILG5ldyBFLmU5MygpLEMudEosbmV3IEUuZTk0KCksQy5GOCxuZXcgRS5lOTUoKSxDLkMxLG5ldyBFLmU5NigpLEMuTnIsbmV3IEUuZTk3KCksQy5uTCxuZXcgRS5lOTgoKSxDLmEwLG5ldyBFLmU5OSgpLEMuWWcsbmV3IEUuZTEwMCgpLEMuYlIsbmV3IEUuZTEwMSgpLEMuYWksbmV3IEUuZTEwMigpLEMub2IsbmV3IEUuZTEwMygpLEMuTVksbmV3IEUuZTEwNCgpLEMuSXYsbmV3IEUuZTEwNSgpLEMuV2csbmV3IEUuZTEwNigpLEMudEQsbmV3IEUuZTEwNygpLEMublosbmV3IEUuZTEwOCgpLEMuT2YsbmV3IEUuZTEwOSgpLEMuVmwsbmV3IEUuZTExMCgpLEMucFksbmV3IEUuZTExMSgpLEMuWEwsbmV3IEUuZTExMigpLEMuTEEsbmV3IEUuZTExMygpLEMuQVQsbmV3IEUuZTExNCgpLEMuTGssbmV3IEUuZTExNSgpLEMuZEssbmV3IEUuZTExNigpLEMueGYsbmV3IEUuZTExNygpLEMuckIsbmV3IEUuZTExOCgpLEMuYnosbmV3IEUuZTExOSgpLEMuSngsbmV3IEUuZTEyMCgpLEMuYjUsbmV3IEUuZTEyMSgpLEMuTGMsbmV3IEUuZTEyMigpLEMuaGYsbmV3IEUuZTEyMygpLEMudWssbmV3IEUuZTEyNCgpLEMuWmksbmV3IEUuZTEyNSgpLEMuVE4sbmV3IEUuZTEyNigpLEMuR0ksbmV3IEUuZTEyNygpLEMuV24sbmV3IEUuZTEyOCgpLEMudXIsbmV3IEUuZTEyOSgpLEMuVk4sbmV3IEUuZTEzMCgpLEMuRVYsbmV3IEUuZTEzMSgpLEMuVkksbmV3IEUuZTEzMigpLEMuZWgsbmV3IEUuZTEzMygpLEMuU0EsbmV3IEUuZTEzNCgpLEMua1YsbmV3IEUuZTEzNSgpLEMudnAsbmV3IEUuZTEzNigpLEMuY2MsbmV3IEUuZTEzNygpLEMuRFksbmV3IEUuZTEzOCgpLEMuTHgsbmV3IEUuZTEzOSgpLEMuTTMsbmV3IEUuZTE0MCgpLEMud1QsbmV3IEUuZTE0MSgpLEMuSkssbmV3IEUuZTE0MigpLEMuU1IsbmV3IEUuZTE0MygpLEMudDYsbmV3IEUuZTE0NCgpLEMuclAsbmV3IEUuZTE0NSgpLEMucFgsbmV3IEUuZTE0NigpLEMuVkQsbmV3IEUuZTE0NygpLEMuTk4sbmV3IEUuZTE0OCgpLEMuVVgsbmV3IEUuZTE0OSgpLEMuWVMsbmV3IEUuZTE1MCgpLEMucHUsbmV3IEUuZTE1MSgpLEMuQkosbmV3IEUuZTE1MigpLEMuYzYsbmV3IEUuZTE1MygpLEMudGQsbmV3IEUuZTE1NCgpLEMuR24sbmV3IEUuZTE1NSgpLEMuek8sbmV3IEUuZTE1NigpLEMudmcsbmV3IEUuZTE1NygpLEMuWVYsbmV3IEUuZTE1OCgpLEMuSWYsbmV3IEUuZTE1OSgpLEMuWXMsbmV3IEUuZTE2MCgpLEMuem0sbmV3IEUuZTE2MSgpLEMublgsbmV3IEUuZTE2MigpLEMueFAsbmV3IEUuZTE2MygpLEMuWE0sbmV3IEUuZTE2NCgpLEMuSWMsbmV3IEUuZTE2NSgpLEMueUcsbmV3IEUuZTE2NigpLEMudUksbmV3IEUuZTE2NygpLEMuTzksbmV3IEUuZTE2OCgpLEMuYmEsbmV3IEUuZTE2OSgpLEMudFcsbmV3IEUuZTE3MCgpLEMuQ0csbmV3IEUuZTE3MSgpLEMuV2osbmV3IEUuZTE3MigpLEMudmIsbmV3IEUuZTE3MygpLEMuVUwsbmV3IEUuZTE3NCgpLEMuQVksbmV3IEUuZTE3NSgpLEMuUUssbmV3IEUuZTE3NigpLEMuQU8sbmV3IEUuZTE3NygpLEMuWGQsbmV3IEUuZTE3OCgpLEMuSTcsbmV3IEUuZTE3OSgpLEMua1ksbmV3IEUuZTE4MCgpLEMuV20sbmV3IEUuZTE4MSgpLEMuR1IsbmV3IEUuZTE4MigpLEMuS1gsbmV3IEUuZTE4MygpLEMuamEsbmV3IEUuZTE4NCgpLEMuRGosbmV3IEUuZTE4NSgpLEMuaXIsbmV3IEUuZTE4NigpLEMuZHgsbmV3IEUuZTE4NygpLEMubmksbmV3IEUuZTE4OCgpLEMuWDIsbmV3IEUuZTE4OSgpLEMuRjMsbmV3IEUuZTE5MCgpLEMuVVksbmV3IEUuZTE5MSgpLEMuQWEsbmV3IEUuZTE5MigpLEMublksbmV3IEUuZTE5MygpLEMudGcsbmV3IEUuZTE5NCgpLEMuSEQsbmV3IEUuZTE5NSgpLEMuaVUsbmV3IEUuZTE5NigpLEMuZU4sbmV3IEUuZTE5NygpLEMudWUsbmV3IEUuZTE5OCgpLEMubmgsbmV3IEUuZTE5OSgpLEMuTDIsbmV3IEUuZTIwMCgpLEMuR3MsbmV3IEUuZTIwMSgpLEMuYkUsbmV3IEUuZTIwMigpLEMuWUQsbmV3IEUuZTIwMygpLEMuUFgsbmV3IEUuZTIwNCgpLEMuTjgsbmV3IEUuZTIwNSgpLEMuRUEsbmV3IEUuZTIwNigpLEMub1csbmV3IEUuZTIwNygpLEMuaGQsbmV3IEUuZTIwOCgpLEMucEgsbmV3IEUuZTIwOSgpLEMuVmUsbmV3IEUuZTIxMCgpLEMuak0sbmV3IEUuZTIxMSgpLEMuVzUsbmV3IEUuZTIxMigpLEMudVgsbmV3IEUuZTIxMygpLEMubnQsbmV3IEUuZTIxNCgpLEMuSVQsbmV3IEUuZTIxNSgpLEMubGksbmV3IEUuZTIxNigpLEMuUE0sbmV3IEUuZTIxNygpLEMuazUsbmV3IEUuZTIxOCgpLEMuTnYsbmV3IEUuZTIxOSgpLEMuQ3csbmV3IEUuZTIyMCgpLEMuVFcsbmV3IEUuZTIyMSgpLEMueFMsbmV3IEUuZTIyMigpLEMuZnQsbmV3IEUuZTIyMygpLEMuUUYsbmV3IEUuZTIyNCgpLEMubWksbmV3IEUuZTIyNSgpLEMuenosbmV3IEUuZTIyNigpLEMuaE8sbmV3IEUuZTIyNygpLEMuZWksbmV3IEUuZTIyOCgpLEMuSEssbmV3IEUuZTIyOSgpLEMuamUsbmV3IEUuZTIzMCgpLEMuRWYsbmV3IEUuZTIzMSgpLEMuUUwsbmV3IEUuZTIzMigpLEMuUkgsbmV3IEUuZTIzMygpLEMuUTEsbmV3IEUuZTIzNCgpLEMuSUQsbmV3IEUuZTIzNSgpLEMuejYsbmV3IEUuZTIzNigpLEMuYmMsbmV3IEUuZTIzNygpLEMua3csbmV3IEUuZTIzOCgpLEMuZXAsbmV3IEUuZTIzOSgpLEMuSjIsbmV3IEUuZTI0MCgpLEMuelUsbmV3IEUuZTI0MSgpLEMuT1UsbmV3IEUuZTI0MigpLEMuYm4sbmV3IEUuZTI0MygpLEMubWgsbmV3IEUuZTI0NCgpLEMuRmgsbmV3IEUuZTI0NSgpLEMueXYsbmV3IEUuZTI0NigpLEMuTFAsbmV3IEUuZTI0NygpLEMuamgsbmV3IEUuZTI0OCgpLEMuZmosbmV3IEUuZTI0OSgpLEMueHcsbmV3IEUuZTI1MCgpLEMuem4sbmV3IEUuZTI1MSgpLEMuUkosbmV3IEUuZTI1MigpLEMuVGMsbmV3IEUuZTI1MygpLEMuWUUsbmV3IEUuZTI1NCgpLEMuVXksbmV3IEUuZTI1NSgpXSxudWxsLG51bGwpCit5PVAuRUYoW0MuYVAsbmV3IEUuZTI1NigpLEMuY2csbmV3IEUuZTI1NygpLEMuWmcsbmV3IEUuZTI1OCgpLEMuUzQsbmV3IEUuZTI1OSgpLEMuQVYsbmV3IEUuZTI2MCgpLEMuYmssbmV3IEUuZTI2MSgpLEMubEgsbmV3IEUuZTI2MigpLEMuYW0sbmV3IEUuZTI2MygpLEMub0UsbmV3IEUuZTI2NCgpLEMua0csbmV3IEUuZTI2NSgpLEMuWEEsbmV3IEUuZTI2NigpLEMuaTQsbmV3IEUuZTI2NygpLEMueUwsbmV3IEUuZTI2OCgpLEMuYkosbmV3IEUuZTI2OSgpLEMua0ksbmV3IEUuZTI3MCgpLEMudlksbmV3IEUuZTI3MSgpLEMuVkssbmV3IEUuZTI3MigpLEMuYUgsbmV3IEUuZTI3MygpLEMudnMsbmV3IEUuZTI3NCgpLEMuR3IsbmV3IEUuZTI3NSgpLEMuRmUsbmV3IEUuZTI3NigpLEMudFAsbmV3IEUuZTI3NygpLEMueWgsbmV3IEUuZTI3OCgpLEMuWmIsbmV3IEUuZTI3OSgpLEMucDgsbmV3IEUuZTI4MCgpLEMubGQsbmV3IEUuZTI4MSgpLEMubmUsbmV3IEUuZTI4MigpLEMuQjAsbmV3IEUuZTI4MygpLEMubXIsbmV3IEUuZTI4NCgpLEMuWVQsbmV3IEUuZTI4NSgpLEMuV1EsbmV3IEUuZTI4NigpLEMualUsbmV3IEUuZTI4NygpLEMuT08sbmV3IEUuZTI4OCgpLEMuTWMsbmV3IEUuZTI4OSgpLEMuUUgsbmV3IEUuZTI5MCgpLEMuckUsbmV3IEUuZTI5MSgpLEMubmYsbmV3IEUuZTI5MigpLEMuR2UsbmV3IEUuZTI5MygpLEMuQTcsbmV3IEUuZTI5NCgpLEMuSGUsbmV3IEUuZTI5NSgpLEMub2osbmV3IEUuZTI5NigpLEMuZDIsbmV3IEUuZTI5NygpLEMuZm4sbmV3IEUuZTI5OCgpLEMueUIsbmV3IEUuZTI5OSgpLEMuUHksbmV3IEUuZTMwMCgpLEMudXUsbmV3IEUuZTMwMSgpLEMucXMsbmV3IEUuZTMwMigpLEMuckIsbmV3IEUuZTMwMygpLEMuaGYsbmV3IEUuZTMwNCgpLEMudWssbmV3IEUuZTMwNSgpLEMuWmksbmV3IEUuZTMwNigpLEMuVE4sbmV3IEUuZTMwNygpLEMudXIsbmV3IEUuZTMwOCgpLEMuRVYsbmV3IEUuZTMwOSgpLEMuZWgsbmV3IEUuZTMxMCgpLEMuU0EsbmV3IEUuZTMxMSgpLEMua1YsbmV3IEUuZTMxMigpLEMudnAsbmV3IEUuZTMxMygpLEMuU1IsbmV3IEUuZTMxNCgpLEMudDYsbmV3IEUuZTMxNSgpLEMuVVgsbmV3IEUuZTMxNigpLEMuWVMsbmV3IEUuZTMxNygpLEMuYzYsbmV3IEUuZTMxOCgpLEMudGQsbmV3IEUuZTMxOSgpLEMuek8sbmV3IEUuZTMyMCgpLEMuWVYsbmV3IEUuZTMyMSgpLEMuSWYsbmV3IEUuZTMyMigpLEMuWXMsbmV3IEUuZTMyMygpLEMublgsbmV3IEUuZTMyNCgpLEMuWE0sbmV3IEUuZTMyNSgpLEMuSWMsbmV3IEUuZTMyNigpLEMuTzksbmV3IEUuZTMyNygpLEMudFcsbmV3IEUuZTMyOCgpLEMuV2osbmV3IEUuZTMyOSgpLEMudmIsbmV3IEUuZTMzMCgpLEMuUUssbmV3IEUuZTMzMSgpLEMuWGQsbmV3IEUuZTMzMigpLEMua1ksbmV3IEUuZTMzMygpLEMuR1IsbmV3IEUuZTMzNCgpLEMuS1gsbmV3IEUuZTMzNSgpLEMuamEsbmV3IEUuZTMzNigpLEMuRGosbmV3IEUuZTMzNygpLEMuWDIsbmV3IEUuZTMzOCgpLEMuVVksbmV3IEUuZTMzOSgpLEMuQWEsbmV3IEUuZTM0MCgpLEMublksbmV3IEUuZTM0MSgpLEMudGcsbmV3IEUuZTM0MigpLEMuSEQsbmV3IEUuZTM0MygpLEMuaVUsbmV3IEUuZTM0NCgpLEMuZU4sbmV3IEUuZTM0NSgpLEMuR3MsbmV3IEUuZTM0NigpLEMuYkUsbmV3IEUuZTM0NygpLEMuWUQsbmV3IEUuZTM0OCgpLEMuUFgsbmV3IEUuZTM0OSgpLEMucEgsbmV3IEUuZTM1MCgpLEMuVmUsbmV3IEUuZTM1MSgpLEMuak0sbmV3IEUuZTM1MigpLEMudVgsbmV3IEUuZTM1MygpLEMubnQsbmV3IEUuZTM1NCgpLEMuSVQsbmV3IEUuZTM1NSgpLEMuUE0sbmV3IEUuZTM1NigpLEMuTnYsbmV3IEUuZTM1NygpLEMuQ3csbmV3IEUuZTM1OCgpLEMuVFcsbmV3IEUuZTM1OSgpLEMuZnQsbmV3IEUuZTM2MCgpLEMubWksbmV3IEUuZTM2MSgpLEMuenosbmV3IEUuZTM2MigpLEMuejYsbmV3IEUuZTM2MygpLEMua3csbmV3IEUuZTM2NCgpLEMuelUsbmV3IEUuZTM2NSgpLEMuT1UsbmV3IEUuZTM2NigpLEMuUkosbmV3IEUuZTM2NygpLEMuWUUsbmV3IEUuZTM2OCgpXSxudWxsLG51bGwpCit4PVAuRUYoW0MuSzQsQy5xSixDLnlTLEMuTXQsQy5PRyxDLmlsLEMubncsQy5NdCxDLm91LEMuTXQsQy5vVCxDLmlsLEMualIsQy5NdCxDLkxnLEMucUosQy5LTyxDLk10LEMud2ssQy5NdCxDLmpBLEMucUosQy5KbyxDLmlsLEMuQXosQy5NdCxDLlZ4LEMuTXQsQy5RYixDLk10LEMubEUsQy5hbCxDLnRlLEMuTXQsQy5pRCxDLk10LEMuSnUsQy5NdCxDLld6LEMuaWwsQy5NSSxDLk10LEMucEYsQy5pbCxDLldoLEMuTXQsQy5xRixDLk10LEMucVosQy5pbCxDLlpqLEMuTXQsQy5oZSxDLk10LEMuZEQsQy5hbCxDLmhQLEMuTXQsQy50YyxDLk10LEMuclIsQy5pbCxDLm9HLEMuTXQsQy5KZixDLmlsLEMuRVosQy5NdCxDLkZHLEMuaWwsQy5wSixDLk10LEMudFUsQy5NdCxDLkRELEMuTXQsQy5ZeSxDLmlsLEMuWHYsQy5NdCxDLmNlLEMuTXQsQy5VSixDLmlsLEMuY2EsQy5NdCxDLklvLEMuTXQsQy5qNCxDLk10LEMuRUcsQy5NdCxDLkNULEMuTXQsQy5tcSxDLk10LEMuVHEsQy5NdCxDLmxwLEMuaWwsQy5QVCxDLk10LEMuRXksQy5NdCxDLmttLEMuTXQsQy52dyxDLk10LEMuTFQsQy5NdCxDLk5XLEMubDQsQy5tcyxDLk10LEMuRkEsQy5NdCxDLlF0LEMuTXQsQy5hOCxDLk10LEMuSlcsQy5NdCxDLk1mLEMuTXQsQy5EbCxDLk10LEMubDQsQy5xSixDLk9OLEMuTXQsQy5TYixDLmFsLEMuVGgsQy5NdCxDLndILEMuTXQsQy5wSyxDLk10LEMuaWwsQy5NdCxDLlg4LEMuTXQsQy5ZMyxDLnFKLEMuTlIsQy5NdCxDLnZ1LEMuTXQsQy5iQyxDLk10LEMud3MsQy5NdCxDLmNLLEMuaWwsQy5qSyxDLk10LEMucUosQy5qdyxDLk10LEMubDQsQy5hbCxDLmlsXSxudWxsLG51bGwpCit3PVAuRUYoW0MuSzQsUC5FRihbQy5TNCxDLkZCLEMuQVYsQy5RcCxDLmhmLEMuVjBdLG51bGwsbnVsbCksQy55UyxQLkVGKFtDLlVYLEMuUHRdLG51bGwsbnVsbCksQy5PRyxDLkNNLEMubncsUC5FRihbQy5yQixDLnhZLEMuYnosQy5Ca10sbnVsbCxudWxsKSxDLm91LFAuRUYoW0MuWEEsQy5kcSxDLnlCLEMudlosQy50ZyxDLkRDXSxudWxsLG51bGwpLEMub1QsUC5FRihbQy5pNCxDLlFzLEMuV20sQy5RV10sbnVsbCxudWxsKSxDLmpSLFAuRUYoW0MuaTQsQy5hSl0sbnVsbCxudWxsKSxDLkxnLFAuRUYoW0MuUzQsQy5GQixDLkFWLEMuUXAsQy5CMCxDLmI2LEMucjEsQy5uUCxDLm1yLEMuSEVdLG51bGwsbnVsbCksQy5LTyxQLkVGKFtDLnloLEMuemRdLG51bGwsbnVsbCksQy53ayxQLkVGKFtDLkFWLEMuZnIsQy5laCxDLnJILEMuQWEsQy5VeixDLm1pLEMueVZdLG51bGwsbnVsbCksQy5qQSxQLkVGKFtDLlM0LEMuRkIsQy5BVixDLlFwLEMuWVQsQy5MQyxDLmhmLEMuVjAsQy5VWSxDLm42XSxudWxsLG51bGwpLEMuSm8sQy5DTSxDLkF6LFAuRUYoW0MuV1EsQy5haF0sbnVsbCxudWxsKSxDLlZ4LFAuRUYoW0MuT08sQy5DZl0sbnVsbCxudWxsKSxDLlFiLFAuRUYoW0MuTWMsQy5mMF0sbnVsbCxudWxsKSxDLmxFLFAuRUYoW0MuUUssQy5Zb10sbnVsbCxudWxsKSxDLnRlLFAuRUYoW0MubmYsQy53Ul0sbnVsbCxudWxsKSxDLmlELFAuRUYoW0MuUUgsQy5DNCxDLnFYLEMuZE8sQy5QTSxDLmp2XSxudWxsLG51bGwpLEMuSnUsUC5FRihbQy5rRyxDLlByLEMuckIsQy54WSxDLlppLEMueHgsQy5UTixDLkdqLEMudmIsQy5NcSxDLlVMLEMubU1dLG51bGwsbnVsbCksQy5XeixDLkNNLEMuTUksUC5FRihbQy5mbixDLmZ6LEMuWE0sQy5UdCxDLnRnLEMuRENdLG51bGwsbnVsbCksQy5wRixDLkNNLEMuV2gsUC5FRihbQy55TCxDLmo1XSxudWxsLG51bGwpLEMucUYsUC5FRihbQy52cCxDLm8wXSxudWxsLG51bGwpLEMucVosQy5DTSxDLlpqLFAuRUYoW0Mub2osQy5HVF0sbnVsbCxudWxsKSxDLmhlLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLmRELFAuRUYoW0MucEgsQy5Ga10sbnVsbCxudWxsKSxDLmhQLFAuRUYoW0MuV2osQy5BaF0sbnVsbCxudWxsKSxDLnRjLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLnJSLEMuQ00sQy5vRyxQLkVGKFtDLmpVLEMuYnddLG51bGwsbnVsbCksQy5KZixDLkNNLEMuRVosUC5FRihbQy52cCxDLm8wXSxudWxsLG51bGwpLEMuRkcsQy5DTSxDLnBKLFAuRUYoW0MuVmUsQy5YNF0sbnVsbCxudWxsKSxDLnRVLFAuRUYoW0MucXMsQy5NTl0sbnVsbCxudWxsKSxDLkRELFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLll5LEMuQ00sQy5YdixQLkVGKFtDLllFLEMuV2xdLG51bGwsbnVsbCksQy5jZSxQLkVGKFtDLmFILEMudzMsQy5IZSxDLm9WLEMudmIsQy5NcSxDLlVMLEMubU0sQy5EaixDLkF5LEMuR3MsQy5pTyxDLmJFLEMuaDMsQy5ZRCxDLmZQLEMuVFcsQy5IMCxDLnhTLEMuYkIsQy56eixDLmxTXSxudWxsLG51bGwpLEMuVUosQy5DTSxDLmNhLFAuRUYoW0MuYkosQy5VSSxDLm94LEMuUmhdLG51bGwsbnVsbCksQy5JbyxQLkVGKFtDLnJCLEMuUlVdLG51bGwsbnVsbCksQy5qNCxQLkVGKFtDLnJCLEMuUlVdLG51bGwsbnVsbCksQy5FRyxQLkVGKFtDLnJCLEMuUlVdLG51bGwsbnVsbCksQy5DVCxQLkVGKFtDLnJCLEMuUlVdLG51bGwsbnVsbCksQy5tcSxQLkVGKFtDLnJCLEMuUlVdLG51bGwsbnVsbCksQy5UcSxQLkVGKFtDLlNSLEMuUzksQy50NixDLmhyLEMuclAsQy5OdF0sbnVsbCxudWxsKSxDLmxwLEMuQ00sQy5QVCxQLkVGKFtDLkVWLEMuWlFdLG51bGwsbnVsbCksQy5FeSxQLkVGKFtDLlhBLEMuZHEsQy51ayxDLnA0XSxudWxsLG51bGwpLEMua20sUC5FRihbQy5yQixDLlJVLEMuYnosQy5CayxDLnVrLEMucDRdLG51bGwsbnVsbCksQy52dyxQLkVGKFtDLnVrLEMucDQsQy5FVixDLlpRXSxudWxsLG51bGwpLEMuTFQsUC5FRihbQy5ZcyxDLkNlXSxudWxsLG51bGwpLEMuTlcsQy5DTSxDLm1zLFAuRUYoW0MuY2csQy5sbCxDLnVrLEMucDQsQy5rVixDLnZ6XSxudWxsLG51bGwpLEMuRkEsUC5FRihbQy5jZyxDLmxsLEMua1YsQy52el0sbnVsbCxudWxsKSxDLlF0LFAuRUYoW0MubGQsQy5Hd10sbnVsbCxudWxsKSxDLmE4LFAuRUYoW0MucDgsQy51YyxDLmxkLEMuR3ddLG51bGwsbnVsbCksQy5KVyxQLkVGKFtDLmFQLEMueEQsQy5BVixDLlFwLEMuaGYsQy5WMF0sbnVsbCxudWxsKSxDLk1mLFAuRUYoW0MudWssQy5wNF0sbnVsbCxudWxsKSxDLkRsLFAuRUYoW0MuVkssQy5PZF0sbnVsbCxudWxsKSxDLmw0LFAuRUYoW0MuTzksQy5xOSxDLmJhLEMua1FdLG51bGwsbnVsbCksQy5PTixQLkVGKFtDLmtJLEMuSk0sQy52WSxDLlpTLEMuUnMsQy5FVyxDLnZzLEMuTVAsQy5HcixDLlZKLEMuVFUsQy5DcCxDLkE3LEMuU0QsQy5TQSxDLktJLEMuUFgsQy5qeixDLk44LEMucUUsQy5udCxDLlZTLEMuSVQsQy5OTCxDLmxpLEMuVHpdLG51bGwsbnVsbCksQy5TYixQLkVGKFtDLnRXLEMua0gsQy5DRyxDLk1sXSxudWxsLG51bGwpLEMuVGgsUC5FRihbQy5QWCxDLmp6XSxudWxsLG51bGwpLEMud0gsUC5FRihbQy55aCxDLmxKXSxudWxsLG51bGwpLEMucEssUC5FRihbQy5uZSxDLnJaXSxudWxsLG51bGwpLEMuaWwsUC5FRihbQy51dSxDLnlZLEMua1ksQy5UTyxDLldtLEMuUVddLG51bGwsbnVsbCksQy5YOCxQLkVGKFtDLlpnLEMuYjcsQy50ZCxDLlprLEMuR24sQy5hel0sbnVsbCxudWxsKSxDLlkzLFAuRUYoW0MuYmssQy5VZCxDLmxILEMuZEcsQy56VSxDLnVUXSxudWxsLG51bGwpLEMuTlIsUC5FRihbQy5yRSxDLktTXSxudWxsLG51bGwpLEMudnUsUC5FRihbQy5rdyxDLm9DXSxudWxsLG51bGwpLEMuYkMsUC5FRihbQy5hbSxDLkpELEMub0UsQy5yMixDLnVYLEMuRWJdLG51bGwsbnVsbCksQy53cyxQLkVGKFtDLmZ0LEMudTNdLG51bGwsbnVsbCksQy5jSyxDLkNNLEMuakssUC5FRihbQy55aCxDLlVsLEMuUkosQy5CUF0sbnVsbCxudWxsKV0sbnVsbCxudWxsKQordj1PLnR5KG5ldyBPLk9qKHoseSx4LHcsQy5DTSxQLkVGKFtDLmFQLCJhY3RpdmUiLEMuSUgsImFkZHJlc3MiLEMuY2csImFuY2hvciIsQy5qMiwiYXBwIixDLlpnLCJhcmdzIixDLkVULCJhc3NlcnRzRW5hYmxlZCIsQy5CRSwiYXZlcmFnZUNvbGxlY3Rpb25QZXJpb2RJbk1pbGxpcyIsQy5XQywiYnB0IixDLmhSLCJicmVha3BvaW50IixDLlM0LCJidXN5IixDLlJvLCJidXR0b25DbGljayIsQy5oTiwiYnl0ZXMiLEMuQVYsImNhbGxiYWNrIixDLmJWLCJjYXBhY2l0eSIsQy5DMCwiY2hhbmdlIixDLmVaLCJjaGFuZ2VTb3J0IixDLmJrLCJjaGVja2VkIixDLmxILCJjaGVja2VkVGV4dCIsQy5hbSwiY2hyb21lVGFyZ2V0cyIsQy5vRSwiY2hyb21pdW1BZGRyZXNzIixDLmtHLCJjbGFzc1RhYmxlIixDLk9JLCJjbGFzc2VzIixDLkk5LCJjbG9zZUl0ZW0iLEMuVG8sImNsb3NpbmciLEMuWEEsImNscyIsQy5pNCwiY29kZSIsQy5xdCwiY29sb3JpbmciLEMucDEsImNvbHVtbnMiLEMueUosImNvbm5lY3RTdGFuZGFsb25lIixDLmxhLCJjb25uZWN0VG9WbSIsQy55TCwiY29ubmVjdGlvbiIsQy5iSiwiY291bnRlcnMiLEMub3gsImNvdW50ZXJzQ2hhbmdlZCIsQy5KZSwiY3VycmVudCIsQy5rSSwiY3VycmVudExpbmUiLEMudlksImN1cnJlbnRQb3MiLEMuUnMsImN1cnJlbnRQb3NDaGFuZ2VkIixDLkx3LCJkZWxldGVWbSIsQy5lUiwiZGVvcHRpbWl6YXRpb25zIixDLmlFLCJkZXNjcmlwdG9yIixDLmY0LCJkZXNjcmlwdG9ycyIsQy5WSywiZGV2dG9vbHMiLEMuYUgsImRpc3BsYXlDdXRvZmYiLEMuYUssImRvQWN0aW9uIixDLkdQLCJlbGVtZW50IixDLnZzLCJlbmRMaW5lIixDLkdyLCJlbmRQb3MiLEMuVFUsImVuZFBvc0NoYW5nZWQiLEMuRmUsImVuZFRva2VuUG9zIixDLnRQLCJlbnRyeSIsQy55aCwiZXJyb3IiLEMuWmIsImV2YWwiLEMudTcsImV2YWxOb3ciLEMucDgsImV2ZW50IixDLnFSLCJldmVudFR5cGUiLEMubGQsImV2ZW50cyIsQy5uZSwiZXhjZXB0aW9uIixDLkIwLCJleHBhbmQiLEMucjEsImV4cGFuZENoYW5nZWQiLEMubXIsImV4cGFuZGVkIixDLkVrLCJleHBhbmRlciIsQy5QbiwiZXhwYW5kZXJTdHlsZSIsQy5ZVCwiZXhwciIsQy5oNywiZXh0ZXJuYWwiLEMuUjMsImZkIixDLldRLCJmaWVsZCIsQy5mViwiZmllbGRzIixDLmpVLCJmaWxlIixDLk9PLCJmbGFnIixDLk1jLCJmbGFnTGlzdCIsQy5GUCwiZm9ybWF0U2l6ZSIsQy5rRiwiZm9ybWF0VGltZSIsQy5VRCwiZm9ybWF0dGVkQWRkcmVzcyIsQy5BcSwiZm9ybWF0dGVkQXZlcmFnZSIsQy5EUywiZm9ybWF0dGVkQ29sbGVjdGlvbnMiLEMuQzksImZvcm1hdHRlZERlb3B0SWQiLEMuVkYsImZvcm1hdHRlZEV4Y2x1c2l2ZSIsQy51VSwiZm9ybWF0dGVkRXhjbHVzaXZlVGlja3MiLEMuWUosImZvcm1hdHRlZEluY2x1c2l2ZSIsQy5lRiwiZm9ybWF0dGVkSW5jbHVzaXZlVGlja3MiLEMub0ksImZvcm1hdHRlZExpbmUiLEMuU1QsImZvcm1hdHRlZFRvdGFsQ29sbGVjdGlvblRpbWUiLEMuUUgsImZyYWdtZW50YXRpb24iLEMucVgsImZyYWdtZW50YXRpb25DaGFuZ2VkIixDLnJFLCJmcmFtZSIsQy5uZiwiZnVuY3Rpb24iLEMuRUksImZ1bmN0aW9ucyIsQy5KQiwiZ2V0Q29sdW1uTGFiZWwiLEMuUlksImdldFRhYnMiLEMuZDQsImdvdG8iLEMuY0YsImdvdG9MaW5rIixDLlNJLCJoYXNEZXNjcmlwdG9ycyIsQy56UywiaGFzRGlzYXNzZW1ibHkiLEMuWUEsImhhc05vQWxsb2NhdGlvbnMiLEMuR2UsImhhc2hMaW5rV29ya2Fyb3VuZCIsQy5BNywiaGVpZ2h0IixDLkhlLCJoaWRlVGFnc0NoZWNrZWQiLEMuaW0sImhpc3RvcnkiLEMuU3MsImhpdHMiLEMuazYsImhvdmVyVGV4dCIsQy5vaiwiaHR0cFNlcnZlciIsQy5QSiwiaHVtYW4iLEMucTIsImlkbGUiLEMuZDIsImltcCIsQy5rTiwiaW1wb3J0cyIsQy5mbiwiaW5zdGFuY2UiLEMueUIsImluc3RhbmNlcyIsQy5lSiwiaW5zdHJ1Y3Rpb24iLEMuaUcsImluc3RydWN0aW9ucyIsQy5QeSwiaW50ZXJmYWNlIixDLnBDLCJpbnRlcmZhY2VzIixDLnV1LCJpbnRlcm5hbCIsQy5xcywiaW8iLEMuWEgsImlzQWJzdHJhY3QiLEMudEosImlzQm9vbCIsQy5GOCwiaXNDaHJvbWVUYXJnZXQiLEMuQzEsImlzQ29tbWVudCIsQy5OciwiaXNDb25zdCIsQy5uTCwiaXNDdXJyZW50VGFyZ2V0IixDLmEwLCJpc0RhcnQiLEMuWWcsImlzRGFydENvZGUiLEMuYlIsImlzRG91YmxlIixDLmFpLCJpc0VtcHR5IixDLm9iLCJpc0Vycm9yIixDLk1ZLCJpc0lubGluYWJsZSIsQy5JdiwiaXNJbnN0YW5jZSIsQy5XZywiaXNJbnQiLEMudEQsImlzTGlzdCIsQy5uWiwiaXNOb3RFbXB0eSIsQy5PZiwiaXNOdWxsIixDLlZsLCJpc09wdGltaXphYmxlIixDLnBZLCJpc09wdGltaXplZCIsQy5YTCwiaXNQYXRjaCIsQy5MQSwiaXNQaXBlIixDLkFULCJpc1N0YXRpYyIsQy5MaywiaXNTdHJpbmciLEMuZEssImlzVHlwZSIsQy54ZiwiaXNVbmV4cGVjdGVkIixDLnJCLCJpc29sYXRlIixDLmJ6LCJpc29sYXRlQ2hhbmdlZCIsQy5KeCwiaXNvbGF0ZXMiLEMuYjUsImp1bXBUYXJnZXQiLEMuTGMsImtpbmQiLEMuaGYsImxhYmVsIixDLnVrLCJsYXN0IixDLlppLCJsYXN0QWNjdW11bGF0b3JSZXNldCIsQy5UTiwibGFzdFNlcnZpY2VHQyIsQy5HSSwibGFzdFVwZGF0ZSIsQy5XbiwibGVuZ3RoIixDLnVyLCJsaWIiLEMuVk4sImxpYnJhcmllcyIsQy5FViwibGlicmFyeSIsQy5WSSwibGluZSIsQy5laCwibGluZU1vZGUiLEMuU0EsImxpbmVzIixDLmtWLCJsaW5rIixDLnZwLCJsaXN0IixDLmNjLCJsaXN0ZW5pbmciLEMuRFksImxvYWRpbmciLEMuTHgsImxvY2FsQWRkcmVzcyIsQy5NMywibG9jYWxQb3J0IixDLndULCJtYWluUG9ydCIsQy5KSywibWFrZUxpbmVJZCIsQy5TUiwibWFwIixDLnQ2LCJtYXBBc1N0cmluZyIsQy5yUCwibWFwQ2hhbmdlZCIsQy5wWCwibWVzc2FnZSIsQy5WRCwibW91c2VPdXQiLEMuTk4sIm1vdXNlT3ZlciIsQy5VWCwibXNnIixDLllTLCJuYW1lIixDLnB1LCJuYW1lSXNFbXB0eSIsQy5CSiwibmV3U3BhY2UiLEMuYzYsIm5vdGlmaWNhdGlvbnMiLEMudGQsIm9iamVjdCIsQy5Hbiwib2JqZWN0Q2hhbmdlZCIsQy56Tywib2JqZWN0UG9vbCIsQy52Zywib2xkU3BhY2UiLEMuWVYsIm93bmluZ0NsYXNzIixDLklmLCJvd25pbmdMaWJyYXJ5IixDLllzLCJwYWQiLEMuem0sInBhZGRpbmciLEMublgsInBhcmVudCIsQy54UCwicGFyc2VJbnQiLEMuWE0sInBhdGgiLEMuSWMsInBhdXNlIixDLnlHLCJwYXVzZUV2ZW50IixDLnVJLCJwaWQiLEMuTzksInBvbGxQZXJpb2QiLEMuYmEsInBvbGxQZXJpb2RDaGFuZ2VkIixDLnRXLCJwb3MiLEMuQ0csInBvc0NoYW5nZWQiLEMuV2osInByb2Nlc3MiLEMudmIsInByb2ZpbGUiLEMuVUwsInByb2ZpbGVDaGFuZ2VkIixDLkFZLCJwcm90b2NvbCIsQy5RSywicXVhbGlmaWVkIixDLkFPLCJxdWFsaWZpZWROYW1lIixDLlhkLCJyZWFjaGFibGUiLEMuSTcsInJlYWRDbG9zZWQiLEMua1ksInJlZiIsQy5XbSwicmVmQ2hhbmdlZCIsQy5HUiwicmVmcmVzaCIsQy5LWCwicmVmcmVzaENvdmVyYWdlIixDLmphLCJyZWZyZXNoR0MiLEMuRGosInJlZnJlc2hUaW1lIixDLmlyLCJyZWxhdGl2ZUxpbmsiLEMuZHgsInJlbW90ZUFkZHJlc3MiLEMubmksInJlbW90ZVBvcnQiLEMuWDIsInJlc2V0QWNjdW11bGF0b3IiLEMuRjMsInJlc3BvbnNlIixDLlVZLCJyZXN1bHQiLEMuQWEsInJlc3VsdHMiLEMublksInJlc3VtZSIsQy50ZywicmV0YWluZWRCeXRlcyIsQy5IRCwicmV0YWluZWRTaXplIixDLmlVLCJyZXRhaW5pbmdQYXRoIixDLmVOLCJyb290TGliIixDLnVlLCJyb3ciLEMubmgsInJvd3MiLEMuTDIsInJ1bm5pbmciLEMuR3MsInNhbXBsZUNvdW50IixDLmJFLCJzYW1wbGVEZXB0aCIsQy5ZRCwic2FtcGxlUmF0ZSIsQy5QWCwic2NyaXB0IixDLk44LCJzY3JpcHRDaGFuZ2VkIixDLkVBLCJzY3JpcHRzIixDLm9XLCJzZWxlY3RFeHByIixDLmhkLCJzZXJ2aWNlVHlwZSIsQy5wSCwic21hbGwiLEMuVmUsInNvY2tldCIsQy5qTSwic29ja2V0T3duZXIiLEMuVzUsInN0YW5kYWxvbmUiLEMudVgsInN0YW5kYWxvbmVWbUFkZHJlc3MiLEMubnQsInN0YXJ0TGluZSIsQy5JVCwic3RhcnRQb3MiLEMubGksInN0YXJ0UG9zQ2hhbmdlZCIsQy5QTSwic3RhdHVzIixDLms1LCJzdWJDbGFzc2VzIixDLk52LCJzdWJjbGFzcyIsQy5Ddywic3VwZXJDbGFzcyIsQy5UVywidGFnU2VsZWN0b3IiLEMueFMsInRhZ1NlbGVjdG9yQ2hhbmdlZCIsQy5mdCwidGFyZ2V0IixDLlFGLCJ0YXJnZXRzIixDLm1pLCJ0ZXh0IixDLnp6LCJ0aW1lU3BhbiIsQy5oTywidGlwRXhjbHVzaXZlIixDLmVpLCJ0aXBLaW5kIixDLkhLLCJ0aXBQYXJlbnQiLEMuamUsInRpcFRpY2tzIixDLkVmLCJ0aXBUaW1lIixDLlFMLCJ0b1N0cmluZyIsQy5SSCwidG9TdHJpbmdBc0ZpeGVkIixDLlExLCJ0b2dnbGVFeHBhbmQiLEMuSUQsInRvZ2dsZUV4cGFuZGVkIixDLno2LCJ0b2tlblBvcyIsQy5iYywidG9wRnJhbWUiLEMua3csInRyYWNlIixDLmVwLCJ0cmVlIixDLkoyLCJ0eXBlQ2hlY2tzRW5hYmxlZCIsQy56VSwidW5jaGVja2VkVGV4dCIsQy5PVSwidW5vcHRpbWl6ZWRDb2RlIixDLmJuLCJ1cGRhdGVMaW5lTW9kZSIsQy5taCwidXB0aW1lIixDLkZoLCJ1cmwiLEMueXYsInVzYWdlQ291bnRlciIsQy5MUCwidXNlZCIsQy5qaCwidiIsQy5maiwidmFyaWFibGUiLEMueHcsInZhcmlhYmxlcyIsQy56biwidmVyc2lvbiIsQy5SSiwidm0iLEMuVGMsInZtTmFtZSIsQy5ZRSwid2ViU29ja2V0IixDLlV5LCJ3cml0ZUNsb3NlZCJdLG51bGwsbnVsbCksITEpKQogJC5qOD1uZXcgTy5mSCh6LHksQy5DTSkKICQuWXY9bmV3IE8uYlkoeCx3LCExKQogJC5xZT12Ci0kLk02PVtuZXcgRS5lMzU1KCksbmV3IEUuZTM1NigpLG5ldyBFLmUzNTcoKSxuZXcgRS5lMzU4KCksbmV3IEUuZTM1OSgpLG5ldyBFLmUzNjAoKSxuZXcgRS5lMzYxKCksbmV3IEUuZTM2MigpLG5ldyBFLmUzNjMoKSxuZXcgRS5lMzY0KCksbmV3IEUuZTM2NSgpLG5ldyBFLmUzNjYoKSxuZXcgRS5lMzY3KCksbmV3IEUuZTM2OCgpLG5ldyBFLmUzNjkoKSxuZXcgRS5lMzcwKCksbmV3IEUuZTM3MSgpLG5ldyBFLmUzNzIoKSxuZXcgRS5lMzczKCksbmV3IEUuZTM3NCgpLG5ldyBFLmUzNzUoKSxuZXcgRS5lMzc2KCksbmV3IEUuZTM3NygpLG5ldyBFLmUzNzgoKSxuZXcgRS5lMzc5KCksbmV3IEUuZTM4MCgpLG5ldyBFLmUzODEoKSxuZXcgRS5lMzgyKCksbmV3IEUuZTM4MygpLG5ldyBFLmUzODQoKSxuZXcgRS5lMzg1KCksbmV3IEUuZTM4NigpLG5ldyBFLmUzODcoKSxuZXcgRS5lMzg4KCksbmV3IEUuZTM4OSgpLG5ldyBFLmUzOTAoKSxuZXcgRS5lMzkxKCksbmV3IEUuZTM5MigpLG5ldyBFLmUzOTMoKSxuZXcgRS5lMzk0KCksbmV3IEUuZTM5NSgpLG5ldyBFLmUzOTYoKSxuZXcgRS5lMzk3KCksbmV3IEUuZTM5OCgpLG5ldyBFLmUzOTkoKSxuZXcgRS5lNDAwKCksbmV3IEUuZTQwMSgpLG5ldyBFLmU0MDIoKSxuZXcgRS5lNDAzKCksbmV3IEUuZTQwNCgpLG5ldyBFLmU0MDUoKSxuZXcgRS5lNDA2KCksbmV3IEUuZTQwNygpLG5ldyBFLmU0MDgoKSxuZXcgRS5lNDA5KCksbmV3IEUuZTQxMCgpLG5ldyBFLmU0MTEoKSxuZXcgRS5lNDEyKCksbmV3IEUuZTQxMygpLG5ldyBFLmU0MTQoKSxuZXcgRS5lNDE1KCksbmV3IEUuZTQxNigpLG5ldyBFLmU0MTcoKSxuZXcgRS5lNDE4KCksbmV3IEUuZTQxOSgpLG5ldyBFLmU0MjAoKSxuZXcgRS5lNDIxKCksbmV3IEUuZTQyMigpLG5ldyBFLmU0MjMoKSxuZXcgRS5lNDI0KCksbmV3IEUuZTQyNSgpLG5ldyBFLmU0MjYoKSxuZXcgRS5lNDI3KCksbmV3IEUuZTQyOCgpLG5ldyBFLmU0MjkoKSxuZXcgRS5lNDMwKCksbmV3IEUuZTQzMSgpLG5ldyBFLmU0MzIoKV0KKyQuTTY9W25ldyBFLmUzNjkoKSxuZXcgRS5lMzcwKCksbmV3IEUuZTM3MSgpLG5ldyBFLmUzNzIoKSxuZXcgRS5lMzczKCksbmV3IEUuZTM3NCgpLG5ldyBFLmUzNzUoKSxuZXcgRS5lMzc2KCksbmV3IEUuZTM3NygpLG5ldyBFLmUzNzgoKSxuZXcgRS5lMzc5KCksbmV3IEUuZTM4MCgpLG5ldyBFLmUzODEoKSxuZXcgRS5lMzgyKCksbmV3IEUuZTM4MygpLG5ldyBFLmUzODQoKSxuZXcgRS5lMzg1KCksbmV3IEUuZTM4NigpLG5ldyBFLmUzODcoKSxuZXcgRS5lMzg4KCksbmV3IEUuZTM4OSgpLG5ldyBFLmUzOTAoKSxuZXcgRS5lMzkxKCksbmV3IEUuZTM5MigpLG5ldyBFLmUzOTMoKSxuZXcgRS5lMzk0KCksbmV3IEUuZTM5NSgpLG5ldyBFLmUzOTYoKSxuZXcgRS5lMzk3KCksbmV3IEUuZTM5OCgpLG5ldyBFLmUzOTkoKSxuZXcgRS5lNDAwKCksbmV3IEUuZTQwMSgpLG5ldyBFLmU0MDIoKSxuZXcgRS5lNDAzKCksbmV3IEUuZTQwNCgpLG5ldyBFLmU0MDUoKSxuZXcgRS5lNDA2KCksbmV3IEUuZTQwNygpLG5ldyBFLmU0MDgoKSxuZXcgRS5lNDA5KCksbmV3IEUuZTQxMCgpLG5ldyBFLmU0MTEoKSxuZXcgRS5lNDEyKCksbmV3IEUuZTQxMygpLG5ldyBFLmU0MTQoKSxuZXcgRS5lNDE1KCksbmV3IEUuZTQxNigpLG5ldyBFLmU0MTcoKSxuZXcgRS5lNDE4KCksbmV3IEUuZTQxOSgpLG5ldyBFLmU0MjAoKSxuZXcgRS5lNDIxKCksbmV3IEUuZTQyMigpLG5ldyBFLmU0MjMoKSxuZXcgRS5lNDI0KCksbmV3IEUuZTQyNSgpLG5ldyBFLmU0MjYoKSxuZXcgRS5lNDI3KCksbmV3IEUuZTQyOCgpLG5ldyBFLmU0MjkoKSxuZXcgRS5lNDMwKCksbmV3IEUuZTQzMSgpLG5ldyBFLmU0MzIoKSxuZXcgRS5lNDMzKCksbmV3IEUuZTQzNCgpLG5ldyBFLmU0MzUoKSxuZXcgRS5lNDM2KCksbmV3IEUuZTQzNygpLG5ldyBFLmU0MzgoKSxuZXcgRS5lNDM5KCksbmV3IEUuZTQ0MCgpLG5ldyBFLmU0NDEoKSxuZXcgRS5lNDQyKCksbmV3IEUuZTQ0MygpLG5ldyBFLmU0NDQoKSxuZXcgRS5lNDQ1KCksbmV3IEUuZTQ0NigpXQogJC5VRz0hMAotRi5FMigpfSwiJDAiLCJWNyIsMCwwLDE4XSwKK0YuRTIoKX0sIiQwIiwiVjdBIiwwLDAsMThdLAogZW06ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkpwKGEpfSwKICRpc0VIOnRydWV9LAogTGI6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdZdSgpfSwKICRpc0VIOnRydWV9LAogUUE6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkxuKGEpfSwKICRpc0VIOnRydWV9LAogQ3Y6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnIwKGEpfSwKICRpc0VIOnRydWV9LAogZWQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0EzKCl9LAotJGlzRUg6dHJ1ZX0sCi13YTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncVooKX0sCi0kaXNFSDp0cnVlfSwKLU9yOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdxcigpfSwKLSRpc0VIOnRydWV9LAotWUw6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ExKCl9LAotJGlzRUg6dHJ1ZX0sCi13Zjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uRyhhKX0sCi0kaXNFSDp0cnVlfSwKLU9hOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmFBKGEpfSwKLSRpc0VIOnRydWV9LAotZW12OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdmaigpfSwKLSRpc0VIOnRydWV9LAotTGJkOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLldUKGEpfSwKLSRpc0VIOnRydWV9LAotUUFhOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdDcygpfSwKLSRpc0VIOnRydWV9LAotQ3ZTOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLldwKGEpfSwKLSRpc0VIOnRydWV9LAotZWR5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm45KGEpfSwKLSRpc0VIOnRydWV9LAotd2FFOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkswKGEpfSwKLSRpc0VIOnRydWV9LAotT3JlOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmhuKGEpfSwKLSRpc0VIOnRydWV9LAotWUxhOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhQKGEpfSwKLSRpc0VIOnRydWV9LAotd2ZhOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnpGKGEpfSwKLSRpc0VIOnRydWV9LAotT2FhOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnl6KGEpfSwKLSRpc0VIOnRydWV9LAotZTA6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnBQKGEpfSwKICRpc0VIOnRydWV9LAord2E6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdBMygpfSwKKyRpc0VIOnRydWV9LAorT3I6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdxWigpfSwKKyRpc0VIOnRydWV9LAorWUw6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdxcigpfSwKKyRpc0VIOnRydWV9LAord2Y6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdRMSgpfSwKKyRpc0VIOnRydWV9LAorT2E6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm5HKGEpfSwKKyRpc0VIOnRydWV9LAorZW12OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hQShhKX0sCiskaXNFSDp0cnVlfSwKK0xiZDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2ZqKCl9LAorJGlzRUg6dHJ1ZX0sCitRQWE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLldUKGEpfSwKKyRpc0VIOnRydWV9LAorQ3ZTOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQ3MoKX0sCiskaXNFSDp0cnVlfSwKK2VkeTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouV3AoYSl9LAorJGlzRUg6dHJ1ZX0sCit3YUU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm45KGEpfSwKKyRpc0VIOnRydWV9LAorT3JlOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LMChhKX0sCiskaXNFSDp0cnVlfSwKK1lMYTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaG4oYSl9LAorJGlzRUg6dHJ1ZX0sCit3ZmE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhQKGEpfSwKKyRpc0VIOnRydWV9LAorT2FhOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56RihhKX0sCiskaXNFSDp0cnVlfSwKK2UwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55eihhKX0sCiskaXNFSDp0cnVlfSwKIGUxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJDKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VZihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdhUCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5SQyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkUzKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nYVAoKX0sCiAkaXNFSDp0cnVlfSwKIGU0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm9uKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FMyhhKX0sCiAkaXNFSDp0cnVlfSwKIGU1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlNNKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5vbihhKX0sCiAkaXNFSDp0cnVlfSwKIGU2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdvSCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5TTShhKX0sCiAkaXNFSDp0cnVlfSwKIGU3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk1oKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nb0goKX0sCiAkaXNFSDp0cnVlfSwKIGU4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmpPKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NaChhKX0sCiAkaXNFSDp0cnVlfSwKIGU5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhlKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qTyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5PVChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueGUoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouT2soYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk9UKGEpfSwKICRpc0VIOnRydWV9LAogZTEyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdsKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk9rKGEpfSwKICRpc0VIOnRydWV9LAogZTEzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm80KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbCgpfSwKICRpc0VIOnRydWV9LAogZTE0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTTCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5oNihhKX0sCiAkaXNFSDp0cnVlfSwKIGUxNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndUgoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSnIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubVAoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlAzKGEpfSwKICRpc0VIOnRydWV9LAogZTE3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkJUKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5vNChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi52aShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ucShhKX0sCi0kaXNFSDp0cnVlfSwKLWUyMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rMChhKX0sCi0kaXNFSDp0cnVlfSwKLWUyMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ydyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUyMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5sayhhKX0sCi0kaXNFSDp0cnVlfSwKLWUyMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZWooKX0sCi0kaXNFSDp0cnVlfSwKLWUyNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndzIoKX0sCi0kaXNFSDp0cnVlfSwKLWUyNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi53OChhKX0sCi0kaXNFSDp0cnVlfSwKLWUyNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pcyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUyNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uRShhKX0sCi0kaXNFSDp0cnVlfSwKLWUyODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hMyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUyOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UcyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUzMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LeShhKX0sCi0kaXNFSDp0cnVlfSwKLWUzMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5WbChhKX0sCi0kaXNFSDp0cnVlfSwKLWUzMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rRShhKX0sCi0kaXNFSDp0cnVlfSwKLWUzMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5HbChhKX0sCi0kaXNFSDp0cnVlfSwKLWUzNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NeihhKX0sCi0kaXNFSDp0cnVlfSwKLWUzNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uYihhKX0sCi0kaXNFSDp0cnVlfSwKLWUzNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndHkoKX0sCi0kaXNFSDp0cnVlfSwKLWUzNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55bihhKX0sCi0kaXNFSDp0cnVlfSwKLWUzODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTVgoKX0sCi0kaXNFSDp0cnVlfSwKLWUzOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5na0UoKX0sCi0kaXNFSDp0cnVlfSwKLWU0MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5wbShhKX0sCi0kaXNFSDp0cnVlfSwKLWU0MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndEooKX0sCi0kaXNFSDp0cnVlfSwKLWU0Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FYyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU0Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naFkoKX0sCi0kaXNFSDp0cnVlfSwKLWU0NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5yYShhKX0sCi0kaXNFSDp0cnVlfSwKLWU0NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZSChhKX0sCi0kaXNFSDp0cnVlfSwKLWU0Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XWChhKX0sCi0kaXNFSDp0cnVlfSwKLWU0Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5JUChhKX0sCi0kaXNFSDp0cnVlfSwKLWU0ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWmQoKX0sCi0kaXNFSDp0cnVlfSwKLWU0OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UTShhKX0sCi0kaXNFSDp0cnVlfSwKLWU1MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54byhhKX0sCi0kaXNFSDp0cnVlfSwKLWU1MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5na0EoKX0sCi0kaXNFSDp0cnVlfSwKLWU1Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nR0soKX0sCi0kaXNFSDp0cnVlfSwKLWU1Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nYW4oKX0sCi0kaXNFSDp0cnVlfSwKLWU1NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nY1EoKX0sCi0kaXNFSDp0cnVlfSwKLWU1NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUzcoKX0sCi0kaXNFSDp0cnVlfSwKLWU1Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSnooKX0sCi0kaXNFSDp0cnVlfSwKLWU1Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QWShhKX0sCi0kaXNFSDp0cnVlfSwKLWU1ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5idShhKX0sCi0kaXNFSDp0cnVlfSwKLWU1OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5WTChhKX0sCi0kaXNFSDp0cnVlfSwKLWU2MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56TihhKX0sCi0kaXNFSDp0cnVlfSwKLWU2MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5tNChhKX0sCi0kaXNFSDp0cnVlfSwKLWU2Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi52OChhKX0sCi0kaXNFSDp0cnVlfSwKLWU2Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbXUoKX0sCi0kaXNFSDp0cnVlfSwKLWU2NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQ08oKX0sCi0kaXNFSDp0cnVlfSwKLWU2NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NQihhKX0sCi0kaXNFSDp0cnVlfSwKLWU2Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5lVShhKX0sCi0kaXNFSDp0cnVlfSwKLWU2Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5EQihhKX0sCi0kaXNFSDp0cnVlfSwKLWU2ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi53TyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU2OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nR2YoKX0sCi0kaXNFSDp0cnVlfSwKLWU3MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndlMoKX0sCi0kaXNFSDp0cnVlfSwKLWU3MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSkwoKX0sCi0kaXNFSDp0cnVlfSwKLWU3Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51MShhKX0sCi0kaXNFSDp0cnVlfSwKLWU3Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56MyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU3NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZUShhKX0sCi0kaXNFSDp0cnVlfSwKLWU3NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi50QyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU3Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndTkoKX0sCi0kaXNFSDp0cnVlfSwKLWU3Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5mQShhKX0sCi0kaXNFSDp0cnVlfSwKLWU3ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hQihhKX0sCi0kaXNFSDp0cnVlfSwKLWU3OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTDQoKX0sCi0kaXNFSDp0cnVlfSwKLWU4MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nYWooKX0sCi0kaXNFSDp0cnVlfSwKLWU4MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naXEoKX0sCi0kaXNFSDp0cnVlfSwKLWU4Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQm0oKX0sCi0kaXNFSDp0cnVlfSwKLWU4Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54UihhKX0sCi0kaXNFSDp0cnVlfSwKLWU4NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VUyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU4NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTkkoKX0sCi0kaXNFSDp0cnVlfSwKLWU4Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndmEoKX0sCi0kaXNFSDp0cnVlfSwKLWU4Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nS3QoKX0sCi0kaXNFSDp0cnVlfSwKLWU4ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncDIoKX0sCi0kaXNFSDp0cnVlfSwKLWU4OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VVShhKX0sCi0kaXNFSDp0cnVlfSwKLWU5MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FdyhhKX0sCi0kaXNFSDp0cnVlfSwKLWU5MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVk0oKX0sCi0kaXNFSDp0cnVlfSwKLWU5Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YaShhKX0sCi0kaXNFSDp0cnVlfSwKLWU5Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5iTChhKX0sCi0kaXNFSDp0cnVlfSwKLWU5NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVUIoKX0sCi0kaXNFSDp0cnVlfSwKLWU5NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5peChhKX0sCi0kaXNFSDp0cnVlfSwKLWU5Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5wZChhKX0sCi0kaXNFSDp0cnVlfSwKLWU5Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncXkoKX0sCi0kaXNFSDp0cnVlfSwKLWU5ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5HVShhKX0sCi0kaXNFSDp0cnVlfSwKLWU5OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5GTihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouV2soYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTAxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmVUKGEpfSwKLSRpc0VIOnRydWV9LAotZTEwMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5DOChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudGYoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTA0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnl4KGEpfSwKLSRpc0VIOnRydWV9LAotZTEwNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jVShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1lHKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTA3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdpMigpfSwKLSRpc0VIOnRydWV9LAotZTEwODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSFkoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouajAoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTEwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpOKGEpfSwKLSRpc0VIOnRydWV9LAotZTExMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54YShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYVQoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTEzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLktHKGEpfSwKLSRpc0VIOnRydWV9LAotZTExNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naVIoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0VCKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTE2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkl6KGEpfSwKLSRpc0VIOnRydWV9LAotZTExNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZcShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTVEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTE5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlg3KGEpfSwKLSRpc0VIOnRydWV9LAotZTEyMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5JUihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1NLKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTIyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdQRSgpfSwKLSRpc0VIOnRydWV9LAotZTEyMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5xOChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2hYKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTI1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2VSgpfSwKLSRpc0VIOnRydWV9LAotZTEyNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qbChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1JkKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTI4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnpZKGEpfSwKLSRpc0VIOnRydWV9LAotZTEyOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rNyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoub1ooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTMxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmRlKGEpfSwKLSRpc0VIOnRydWV9LAotZTEzMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5EcyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY08oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTM0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd6TSgpfSwKLSRpc0VIOnRydWV9LAotZTEzNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTU4oKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lQKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTM3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtZCgpfSwKLSRpc0VIOnRydWV9LAotZTEzODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZUgoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUzgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmt2KGEpfSwKLSRpc0VIOnRydWV9LAotZTE0MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5paChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouejIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpGKGEpfSwKLSRpc0VIOnRydWV9LAotZTE0NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5MaChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWnYoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQ2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk82KGEpfSwKLSRpc0VIOnRydWV9LAotZTE0Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QZihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1VZKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQ5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2SygpfSwKLSRpc0VIOnRydWV9LAotZTE1MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5KaihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudDgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTUyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdMMSgpfSwKLSRpc0VIOnRydWV9LAotZTE1Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5neFEoKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZWUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTU1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkpHKGEpfSwKLSRpc0VIOnRydWV9LAotZTE1Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5BRihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTEIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTU4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLktsKGEpfSwKLSRpc0VIOnRydWV9LAotZTE1OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVTYoKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY2ooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTYxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmJyKGEpfSwKLSRpc0VIOnRydWV9LAotZTE2Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pbyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZnkoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTY0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlFhKGEpfSwKLSRpc0VIOnRydWV9LAotZTE2NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rcyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQ04oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTY3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnFsKGEpfSwKLSRpc0VIOnRydWV9LAotZTE2ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51bChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouU3ooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTcwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlkKGEpfSwKLSRpc0VIOnRydWV9LAotZTE3MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbTgoKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQlooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTczOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkgxKGEpfSwKLSRpc0VIOnRydWV9LAotZTE3NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5DbShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZlUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTc2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkdIKGEpfSwKLSRpc0VIOnRydWV9LAotZTE3Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uOChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0xjKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTc5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdOUygpfSwKLSRpc0VIOnRydWV9LAotZTE4MDp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3VoKCl9LAogJGlzRUg6dHJ1ZX0sCitlMTk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdQOSgpfSwKKyRpc0VIOnRydWV9LAorZTIwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndUgoKX0sCiskaXNFSDp0cnVlfSwKK2UyMTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubVAoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMjI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkJUKGEpfSwKKyRpc0VIOnRydWV9LAorZTIzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi52aShhKX0sCiskaXNFSDp0cnVlfSwKK2UyNDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubnEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMjU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmswKGEpfSwKKyRpc0VIOnRydWV9LAorZTI2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ydyhhKX0sCiskaXNFSDp0cnVlfSwKK2UyNzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubGsoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMjg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdlaigpfSwKKyRpc0VIOnRydWV9LAorZTI5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndzIoKX0sCiskaXNFSDp0cnVlfSwKK2UzMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzgoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlzKGEpfSwKKyRpc0VIOnRydWV9LAorZTMyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rdihhKX0sCiskaXNFSDp0cnVlfSwKK2UzMzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYTMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlRzKGEpfSwKKyRpc0VIOnRydWV9LAorZTM1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LeShhKX0sCiskaXNFSDp0cnVlfSwKK2UzNjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaW8oYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmtFKGEpfSwKKyRpc0VIOnRydWV9LAorZTM4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5HbChhKX0sCiskaXNFSDp0cnVlfSwKK2UzOTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTXooYSl9LAorJGlzRUg6dHJ1ZX0sCitlNDA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm5iKGEpfSwKKyRpc0VIOnRydWV9LAorZTQxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndHkoKX0sCiskaXNFSDp0cnVlfSwKK2U0Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueW4oYSl9LAorJGlzRUg6dHJ1ZX0sCitlNDM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdNWCgpfSwKKyRpc0VIOnRydWV9LAorZTQ0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5neDUoKX0sCiskaXNFSDp0cnVlfSwKK2U0NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucG0oYSl9LAorJGlzRUg6dHJ1ZX0sCitlNDY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd0SigpfSwKKyRpc0VIOnRydWV9LAorZTQ3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FYyhhKX0sCiskaXNFSDp0cnVlfSwKK2U0ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucmEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNDk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLllIKGEpfSwKKyRpc0VIOnRydWV9LAorZTUwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XWChhKX0sCiskaXNFSDp0cnVlfSwKK2U1MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSVAoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNTI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdaZCgpfSwKKyRpc0VIOnRydWV9LAorZTUzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UTShhKX0sCiskaXNFSDp0cnVlfSwKK2U1NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueG8oYSl9LAorJGlzRUg6dHJ1ZX0sCitlNTU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdrQSgpfSwKKyRpc0VIOnRydWV9LAorZTU2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nR0soKX0sCiskaXNFSDp0cnVlfSwKK2U1Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2FuKCl9LAorJGlzRUg6dHJ1ZX0sCitlNTg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdjUSgpfSwKKyRpc0VIOnRydWV9LAorZTU5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUzcoKX0sCiskaXNFSDp0cnVlfSwKK2U2MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0p6KCl9LAorJGlzRUg6dHJ1ZX0sCitlNjE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlBZKGEpfSwKKyRpc0VIOnRydWV9LAorZTYyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5idShhKX0sCiskaXNFSDp0cnVlfSwKK2U2Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVkwoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNjQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnpOKGEpfSwKKyRpc0VIOnRydWV9LAorZTY1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5tNChhKX0sCiskaXNFSDp0cnVlfSwKK2U2Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ211KCl9LAorJGlzRUg6dHJ1ZX0sCitlNjc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdDTygpfSwKKyRpc0VIOnRydWV9LAorZTY4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NQihhKX0sCiskaXNFSDp0cnVlfSwKK2U2OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZVUoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNzA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkRCKGEpfSwKKyRpc0VIOnRydWV9LAorZTcxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nR2YoKX0sCiskaXNFSDp0cnVlfSwKK2U3Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZTKCl9LAorJGlzRUg6dHJ1ZX0sCitlNzM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdKTCgpfSwKKyRpc0VIOnRydWV9LAorZTc0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FcihhKX0sCiskaXNFSDp0cnVlfSwKK2U3NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouT0IoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNzY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLllRKGEpfSwKKyRpc0VIOnRydWV9LAorZTc3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi50QyhhKX0sCiskaXNFSDp0cnVlfSwKK2U3ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3U5KCl9LAorJGlzRUg6dHJ1ZX0sCitlNzk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmFXKGEpfSwKKyRpc0VIOnRydWV9LAorZTgwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hQihhKX0sCiskaXNFSDp0cnVlfSwKK2U4MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0w0KCl9LAorJGlzRUg6dHJ1ZX0sCitlODI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdhaigpfSwKKyRpc0VIOnRydWV9LAorZTgzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naXEoKX0sCiskaXNFSDp0cnVlfSwKK2U4NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0JtKCl9LAorJGlzRUg6dHJ1ZX0sCitlODU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhSKGEpfSwKKyRpc0VIOnRydWV9LAorZTg2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VUyhhKX0sCiskaXNFSDp0cnVlfSwKK2U4Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ05JKCl9LAorJGlzRUg6dHJ1ZX0sCitlODg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2YSgpfSwKKyRpc0VIOnRydWV9LAorZTg5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nS3QoKX0sCiskaXNFSDp0cnVlfSwKK2U5MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3AyKCl9LAorJGlzRUg6dHJ1ZX0sCitlOTE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlVVKGEpfSwKKyRpc0VIOnRydWV9LAorZTkyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FdyhhKX0sCiskaXNFSDp0cnVlfSwKK2U5Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ZNKCl9LAorJGlzRUg6dHJ1ZX0sCitlOTQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlhpKGEpfSwKKyRpc0VIOnRydWV9LAorZTk1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5iTChhKX0sCiskaXNFSDp0cnVlfSwKK2U5Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1VCKCl9LAorJGlzRUg6dHJ1ZX0sCitlOTc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdScygpfSwKKyRpc0VIOnRydWV9LAorZTk4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5peChhKX0sCiskaXNFSDp0cnVlfSwKK2U5OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ25pKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTAwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncXkoKX0sCiskaXNFSDp0cnVlfSwKK2UxMDE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnd6KGEpfSwKKyRpc0VIOnRydWV9LAorZTEwMjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRk4oYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTAzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XayhhKX0sCiskaXNFSDp0cnVlfSwKK2UxMDQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdobygpfSwKKyRpc0VIOnRydWV9LAorZTEwNTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZVQoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTA2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5DOChhKX0sCiskaXNFSDp0cnVlfSwKK2UxMDc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnRmKGEpfSwKKyRpc0VIOnRydWV9LAorZTEwODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucE8oYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTA5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jVShhKX0sCiskaXNFSDp0cnVlfSwKK2UxMTA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdXMSgpfSwKKyRpc0VIOnRydWV9LAorZTExMTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1lHKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTEyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naTIoKX0sCiskaXNFSDp0cnVlfSwKK2UxMTM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdIWSgpfSwKKyRpc0VIOnRydWV9LAorZTExNDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0ZvKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTE1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qMChhKX0sCiskaXNFSDp0cnVlfSwKK2UxMTY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpOKGEpfSwKKyRpc0VIOnRydWV9LAorZTExNzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueGEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTE4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hVChhKX0sCiskaXNFSDp0cnVlfSwKK2UxMTk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLktHKGEpfSwKKyRpc0VIOnRydWV9LAorZTEyMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lSKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTIxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nRUIoKX0sCiskaXNFSDp0cnVlfSwKK2UxMjI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkl6KGEpfSwKKyRpc0VIOnRydWV9LAorZTEyMzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWXEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTI0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51WShhKX0sCiskaXNFSDp0cnVlfSwKK2UxMjU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlg3KGEpfSwKKyRpc0VIOnRydWV9LAorZTEyNjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSVIoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTI3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUEUoKX0sCiskaXNFSDp0cnVlfSwKK2UxMjg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnE4KGEpfSwKKyRpc0VIOnRydWV9LAorZTEyOTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2hYKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTMwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndlUoKX0sCiskaXNFSDp0cnVlfSwKK2UxMzE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmpsKGEpfSwKKyRpc0VIOnRydWV9LAorZTEzMjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1JkKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTMzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56WShhKX0sCiskaXNFSDp0cnVlfSwKK2UxMzQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmRlKGEpfSwKKyRpc0VIOnRydWV9LAorZTEzNTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRHMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTM2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jTyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxMzc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd6TSgpfSwKKyRpc0VIOnRydWV9LAorZTEzODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ01OKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTM5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naVAoKX0sCiskaXNFSDp0cnVlfSwKK2UxNDA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtZCgpfSwKKyRpc0VIOnRydWV9LAorZTE0MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VIKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTQyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55YyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxNDM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLllmKGEpfSwKKyRpc0VIOnRydWV9LAorZTE0NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWnEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTQ1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5paChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNDY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnoyKGEpfSwKKyRpc0VIOnRydWV9LAorZTE0Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWkYoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTQ4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5MaChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNDk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlp2KGEpfSwKKyRpc0VIOnRydWV9LAorZTE1MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTzYoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTUxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QZihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNTI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdVWSgpfSwKKyRpc0VIOnRydWV9LAorZTE1Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZLKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTU0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5KaihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNTU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnQ4KGEpfSwKKyRpc0VIOnRydWV9LAorZTE1Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0wxKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTU3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5neFEoKX0sCiskaXNFSDp0cnVlfSwKK2UxNTg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdFbCgpfSwKKyRpc0VIOnRydWV9LAorZTE1OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3hIKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTYwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5lZShhKX0sCiskaXNFSDp0cnVlfSwKK2UxNjE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkpHKGEpfSwKKyRpc0VIOnRydWV9LAorZTE2Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTHAoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTYzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56MShhKX0sCiskaXNFSDp0cnVlfSwKK2UxNjQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkFGKGEpfSwKKyRpc0VIOnRydWV9LAorZTE2NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZmkoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTY2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LbChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNjc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdVNigpfSwKKyRpc0VIOnRydWV9LAorZTE2ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY2ooYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTY5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5icihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlBCKGEpfSwKKyRpc0VIOnRydWV9LAorZTE3MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZnkoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTcyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5RYShhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmtzKGEpfSwKKyRpc0VIOnRydWV9LAorZTE3NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQ04oYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTc1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5xbChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVsKGEpfSwKKyRpc0VIOnRydWV9LAorZTE3Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1V4KCl9LAorJGlzRUg6dHJ1ZX0sCitlMTc4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pZChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtOCgpfSwKKyRpc0VIOnRydWV9LAorZTE4MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQlooYSl9LAorJGlzRUg6dHJ1ZX0sCiBlMTgxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlMKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IMShhKX0sCiAkaXNFSDp0cnVlfSwKIGUxODI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYngoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkNtKGEpfSwKICRpc0VIOnRydWV9LAogZTE4Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51VyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZlUoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTg0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlcyKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5HSChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxODU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVQoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm44KGEpfSwKICRpc0VIOnRydWV9LAogZTE4Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LZChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0xjKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMTg3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnBVKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTlMoKX0sCiAkaXNFSDp0cnVlfSwKIGUxODg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVGcoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd6SygpfSwKICRpc0VIOnRydWV9LAogZTE4OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVmMoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaUwoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTkwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdwRigpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rNyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVFkoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnVXKGEpfSwKICRpc0VIOnRydWV9LAogZTE5Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQTYoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVzIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTkzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJ5KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VVChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVAoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLktkKGEpfSwKICRpc0VIOnRydWV9LAogZTE5NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5mdyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucFUoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTk2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnpIKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UZyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWnMoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWYygpfSwKICRpc0VIOnRydWV9LAogZTE5ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWFIoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3BGKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMTk5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk5CKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UWShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3pTKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdBNigpfSwKICRpc0VIOnRydWV9LAogZTIwMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VOChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUnkoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjAyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm9OKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VUChhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1Y4KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlVBKGEpfSwKICRpc0VIOnRydWV9LAogZTIwNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncDgoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouekgoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjA1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkY5KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5acyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSEIoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdYUigpfSwKICRpc0VIOnRydWV9LAogZTIwNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qQihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTkIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjA4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhiKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nelMoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1M1KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlU4KGEpfSwKICRpc0VIOnRydWV9LAogZTIxMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nRG8oKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoub04oYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjExOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd1aigpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVjgoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouajEoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdwOCgpfSwKICRpc0VIOnRydWV9LAogZTIxMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5BdyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRjkoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjE0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmwyKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IQihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ20yKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnlJKGEpfSwKICRpc0VIOnRydWV9LAogZTIxNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5kWShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouangoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjE3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnlxKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qQihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2tpKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTNSgpfSwKICRpc0VIOnRydWV9LAogZTIxOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWm4oKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0RvKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjIwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2cygpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndWooKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ZoKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmoxKGEpfSwKICRpc0VIOnRydWV9LAogZTIyMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWlgoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQXcoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjIzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmQ1KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5sMihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouU0coYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtMigpfSwKICRpc0VIOnRydWV9LAogZTIyNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jcyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZFkoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjI2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWRigpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55cShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2t3KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdraSgpfSwKICRpc0VIOnRydWV9LAogZTIyODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LMihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1puKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjI5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnV5KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndnMoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0V5KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWaCgpfSwKICRpc0VIOnRydWV9LAogZTIzMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YSihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1pYKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjMyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlA0KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5SZyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0prKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmQ1KGEpfSwKICRpc0VIOnRydWV9LAogZTIzNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5RMihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouU0coYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjM1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTVSgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jcyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1hBKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWRigpfSwKICRpc0VIOnRydWV9LAogZTIzNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWVkoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2t3KCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjM4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdaMygpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LMihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucnkoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnV5KGEpfSwKICRpc0VIOnRydWV9LAogZTI0MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5JMihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0V5KCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdkTigpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YSihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTkMoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdqVygpfSwKICRpc0VIOnRydWV9LAogZTI0Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVjAoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUDQoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQ0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5SWChhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSmsoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkw5KGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlEyKGEpfSwKICRpc0VIOnRydWV9LAogZTI0Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oubDcoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1N1KCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQ3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5rQihhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nU1UoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkFlKGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdYQSgpfSwKICRpc0VIOnRydWV9LAogZTI0OTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouSVgoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1lZKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjUwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5FZChhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWjMoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLk5FKGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJ5KGEpfSwKICRpc0VIOnRydWV9LAogZTI1Mjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouV0koYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSTIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjUzOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5OWihhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVFgoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlQ1KGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk5DKGEpfSwKICRpc0VIOnRydWV9LAogZTI1NTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouaTAoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1YwKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjU2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5TZihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUlgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkxNKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5MOShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI1ODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oucXEoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLk5WKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjU5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5BYyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oubDcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLll6KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5rQihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc2VqKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouQWUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnN3MihiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLklYKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjYzOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5RcihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouRWQoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnhXKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5ORShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2NTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouV3koYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLldJKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjY2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5pMihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTlooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkJDKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5UNShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2ODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oucEIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmkwKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjY5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5OTyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouU2YoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLldCKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5KbChhLGIpfSwKICRpc0VIOnRydWV9LAogZTI3MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouSlooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlRQKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjcyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5mUihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTE0oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNoWShiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmF1KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjc0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si51UChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouQWMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnZKKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5ZeihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI3Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTmYoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNlaihiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlBsKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zdzIoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjc4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5DMyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUXIoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnhIKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si54VyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4MDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTmgoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLld5KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjgxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5BSShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouaTIoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLm5BKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5CQyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouZmIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnBCKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjg0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zaXEoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5OTyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4NTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUXkoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLldCKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjg2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si54MChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouSlooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNLdChiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmZSKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjg4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5jVihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudVAoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLm1VKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si52SihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5MDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouS3ooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLk5mKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjkxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si51TShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUGwoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkVyKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5DMyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouR1ooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkFJKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjk0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5oUyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouT0UoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLm16KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5uQShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oucEEoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmZiKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjk3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zU0soYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zaXEoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjk4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zaFgoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5ReShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5OTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouY2woYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLngwKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzAwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5KYihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc0t0KGIpfSwKICRpc0VIOnRydWV9LAogZTMwMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oueFEoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmNWKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzAyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5NWChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oubVUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMDM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkE0KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si51TShhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwNDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oud0QoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkdaKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzA1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si53SihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouaFMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMDY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLm9KKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5teihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwNzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouREYoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnBBKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzA4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zdksoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zaFgoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzA5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5oOShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouY2woYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNMMShiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlFsKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzExOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5YRihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oueFEoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlNGKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5NWChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMxMzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUXYoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkE0KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzE0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5SOChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oud0QoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlhnKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si53SihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMxNjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouYXcoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLm9KKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzE3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5DSihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouREYoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlAyKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zdksoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzE5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5mdihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouaDkoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkowKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zTDEoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzIxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5QUChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc0VsKGIpfSwKICRpc0VIOnRydWV9LAogZTMyMjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouU2ooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnN4SChiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnR2KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5YRihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMyNDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oudzcoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkExKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzI1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5NRShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouU0YoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmtYKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5RdihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMyNzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oucTAoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlI4KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzI4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5FSihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouWGcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmlIKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5hdyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzMDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouU08oYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkNKKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzMxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5COShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUDIoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlBOKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5KMChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzMzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc1ZjKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUFAoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkJ5KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5TaihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzNTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouamQoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnR2KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzM2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5SeChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudzcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlpJKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5NRShhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouZmEoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmtYKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzM5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5DdShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oucTAoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNWOChiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkVKKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5FQyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouaUgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkhuKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5TTyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouVHgoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkI5KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQ0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zRG8oYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5QTihhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0NTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc3VqKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc1ZjKGIpfSwKICRpc0VIOnRydWV9LAogZTM0Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouSDMoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkJ5KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQ3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5UWihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouamQoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnQzKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si51SChhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0OTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oubXkoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlpJKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzUwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zVkYoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5mYShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oueU8oYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkN1KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzUyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5aVShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc1Y4KGIpfSwKICRpc0VIOnRydWV9LAogZTM1Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oudFEoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkVDKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzU0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si50SChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oueEgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNTU6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImN1cmx5LWJsb2NrIixDLkxnKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnd1KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzU2OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJvYnNlcnZhdG9yeS1lbGVtZW50IixDLmw0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlR4KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzU3OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzZXJ2aWNlLXJlZiIsQy5pbCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zRG8oYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzU4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpbnN0YW5jZS1yZWYiLEMuV3opfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc3VqKGIpfSwKICRpc0VIOnRydWV9LAogZTM1OTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiYWN0aW9uLWxpbmsiLEMuSzQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouSDMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNjA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1iYXIiLEMuTFQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouVFooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNjE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1tZW51IixDLm1zKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnQzKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzYyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbWVudS1pdGVtIixDLkZBKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLm15KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzYzOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtcmVmcmVzaCIsQy5KVyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zVkYoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzY0OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtY29udHJvbCIsQy5OVyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si55TyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTM2NTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidG9wLW5hdi1tZW51IixDLk1mKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlpVKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzY2OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLW5hdi1tZW51IixDLmttKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNqVyhiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNjc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktbmF2LW1lbnUiLEMudncpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudFEoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNjg6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNsYXNzLW5hdi1tZW51IixDLkV5KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnRIKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzY5OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbm90aWZ5IixDLlF0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImN1cmx5LWJsb2NrIixDLkxnKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1ub3RpZnktaXRlbSIsQy5hOCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJvYnNlcnZhdG9yeS1lbGVtZW50IixDLmw0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImJyZWFrcG9pbnQtbGlzdCIsQy55Uyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzZXJ2aWNlLXJlZiIsQy5pbCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzcyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy1yZWYiLEMuT0cpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW5zdGFuY2UtcmVmIixDLld6KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzM6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNsYXNzLXRyZWUiLEMubncpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiYWN0aW9uLWxpbmsiLEMuSzQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM3NDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZXZhbC1ib3giLEMud2spfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LWJhciIsQy5MVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzc1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJldmFsLWxpbmsiLEMuakEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LW1lbnUiLEMubXMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM3Njp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmllbGQtcmVmIixDLkpvKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1tZW51LWl0ZW0iLEMuRkEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM3Nzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZnVuY3Rpb24tcmVmIixDLmxFKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1yZWZyZXNoIixDLkpXKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzg6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktcmVmIixDLmxwKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1jb250cm9sIixDLk5XKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC1pbnNldCIsQy5PTil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJ0b3AtbmF2LW1lbnUiLEMuTWYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4MDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2NyaXB0LXJlZiIsQy5TYil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLW5hdi1tZW51IixDLmttKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzODE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNsYXNzLXZpZXciLEMueEUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibGlicmFyeS1uYXYtbWVudSIsQy52dyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzgyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjb2RlLXJlZiIsQy5vVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy1uYXYtbWVudSIsQy5FeSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzgzOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjb2RlLXZpZXciLEMualIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LW5vdGlmeSIsQy5RdCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzg0OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJlcnJvci12aWV3IixDLktPKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1ub3RpZnktaXRlbSIsQy5hOCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzg1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmaWVsZC12aWV3IixDLkF6KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImJyZWFrcG9pbnQtbGlzdCIsQy55Uyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzg2OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzdGFjay1mcmFtZSIsQy5OUil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy1yZWYiLEMuT0cpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4Nzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmxhZy1saXN0IixDLkJMKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNsYXNzLXRyZWUiLEMubncpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4ODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmxhZy1pdGVtIixDLlZ4KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImV2YWwtYm94IixDLndrKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzODk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZ1bmN0aW9uLXZpZXciLEMudGUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZXZhbC1saW5rIixDLmpBKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzOTA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImhlYXAtbWFwIixDLmlEKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZpZWxkLXJlZiIsQy5Kbyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzkxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby12aWV3IixDLnRVKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZ1bmN0aW9uLXJlZiIsQy5sRSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzkyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1yZWYiLEMuSmYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibGlicmFyeS1yZWYiLEMubHApfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5Mzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItbGlzdC12aWV3IixDLnFGKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC1pbnNldCIsQy5PTil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzk0OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci1yZWYiLEMublgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2NyaXB0LXJlZiIsQy5TYil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzk1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci12aWV3IixDLlpqKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNsYXNzLXZpZXciLEMub3UpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5Njp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItY29ubmVjdGlvbi12aWV3IixDLldoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNvZGUtcmVmIixDLm9UKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzOTc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLWNvbm5lY3Rpb24tcmVmIixDLnBGKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImNvZGUtdmlldyIsQy5qUil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzk4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1zb2NrZXQtcmVmIixDLkZHKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImVycm9yLXZpZXciLEMuS08pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5OTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tc29ja2V0LWxpc3QtdmlldyIsQy5FWil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmaWVsZC12aWV3IixDLkF6KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXNvY2tldC12aWV3IixDLnBKKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInN0YWNrLWZyYW1lIixDLk5SKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXdlYi1zb2NrZXQtcmVmIixDLll5KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZsYWctbGlzdCIsQy5RYil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDAyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby13ZWItc29ja2V0LWxpc3QtdmlldyIsQy5ERCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmbGFnLWl0ZW0iLEMuVngpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwMzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8td2ViLXNvY2tldC12aWV3IixDLlh2KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZ1bmN0aW9uLXZpZXciLEMudGUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwNDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcmFuZG9tLWFjY2Vzcy1maWxlLWxpc3QtdmlldyIsQy50Yyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJoZWFwLW1hcCIsQy5pRCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDA1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1yYW5kb20tYWNjZXNzLWZpbGUtcmVmIixDLnJSKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXZpZXciLEMudFUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwNjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcmFuZG9tLWFjY2Vzcy1maWxlLXZpZXciLEMub0cpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcmVmIixDLkpmKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXByb2Nlc3MtbGlzdC12aWV3IixDLkVwKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLWxpc3QtdmlldyIsQy5xRil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDA4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1wcm9jZXNzLXJlZiIsQy5kRCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci1yZWYiLEMucVopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwOTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcHJvY2Vzcy12aWV3IixDLmhQKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLXZpZXciLEMuWmopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxMDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1yZWYiLEMuVUopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItY29ubmVjdGlvbi12aWV3IixDLldoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtc3VtbWFyeSIsQy5DVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci1jb25uZWN0aW9uLXJlZiIsQy5wRil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDEyOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXJ1bi1zdGF0ZSIsQy5qNCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1zb2NrZXQtcmVmIixDLkZHKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTM6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtbG9jYXRpb24iLEMuSW8pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tc29ja2V0LWxpc3QtdmlldyIsQy5FWil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDE0OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXNoYXJlZC1zdW1tYXJ5IixDLkVHKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXNvY2tldC12aWV3IixDLnBKKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTU6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtY291bnRlci1jaGFydCIsQy5jYSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby13ZWItc29ja2V0LXJlZiIsQy5ZeSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDE2OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXZpZXciLEMubXEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8td2ViLXNvY2tldC1saXN0LXZpZXciLEMuREQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxNzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW5zdGFuY2UtdmlldyIsQy5NSSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby13ZWItc29ja2V0LXZpZXciLEMuWHYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgianNvbi12aWV3IixDLlRxKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJhbmRvbS1hY2Nlc3MtZmlsZS1saXN0LXZpZXciLEMudGMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxOTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibGlicmFyeS12aWV3IixDLlBUKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJhbmRvbS1hY2Nlc3MtZmlsZS1yZWYiLEMuclIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyMDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaGVhcC1wcm9maWxlIixDLkp1KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJhbmRvbS1hY2Nlc3MtZmlsZS12aWV3IixDLm9HKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MjE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNsaWRpbmctY2hlY2tib3giLEMuWTMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcHJvY2Vzcy1saXN0LXZpZXciLEMuaGUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyMjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1wcm9maWxlIixDLmNlKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXByb2Nlc3MtcmVmIixDLmREKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MjM6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC12aWV3IixDLlRoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXByb2Nlc3MtdmlldyIsQy5oUCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDI0OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzdGFjay10cmFjZSIsQy52dSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXJlZiIsQy5VSil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDI1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJ2bS12aWV3IixDLmpLKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtc3VtbWFyeSIsQy5DVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDI2OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzZXJ2aWNlLXZpZXciLEMuWDgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1ydW4tc3RhdGUiLEMuajQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyNzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgib2JzZXJ2YXRvcnktYXBwbGljYXRpb24iLEMuRGwpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1sb2NhdGlvbiIsQy5Jbyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDI4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzZXJ2aWNlLWV4Y2VwdGlvbi12aWV3IixDLnBLKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtc2hhcmVkLXN1bW1hcnkiLEMuRUcpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyOTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1lcnJvci12aWV3IixDLndIKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtY291bnRlci1jaGFydCIsQy5jYSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDMwOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJ2bS1jb25uZWN0LXRhcmdldCIsQy53cyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXZpZXciLEMubXEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQzMTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tY29ubmVjdCIsQy5iQyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpbnN0YW5jZS12aWV3IixDLk1JKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MzI6ewotIl4iOiJUcDo3MTsiLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJqc29uLXZpZXciLEMuVHEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQzMzp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktdmlldyIsQy5QVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDM0OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaGVhcC1wcm9maWxlIixDLkp1KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0MzU6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzbGlkaW5nLWNoZWNrYm94IixDLlkzKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0MzY6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXByb2ZpbGUiLEMuY2UpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQzNzp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC12aWV3IixDLlRoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0Mzg6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzdGFjay10cmFjZSIsQy52dSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDM5OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tdmlldyIsQy5qSyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQwOnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS12aWV3IixDLlg4KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0NDE6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJvYnNlcnZhdG9yeS1hcHBsaWNhdGlvbiIsQy5EbCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQyOnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1leGNlcHRpb24tdmlldyIsQy5wSyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQzOnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1lcnJvci12aWV3IixDLndIKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0NDQ6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJ2bS1jb25uZWN0LXRhcmdldCIsQy53cyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQ1OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tY29ubmVjdCIsQy5iQyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQ2OnsKKyJeIjoiVHBaOjcyOyIsCiAkMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tcmVmIixDLmNLKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX0sMV0sWyJicmVha3BvaW50X2xpc3RfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2JyZWFrcG9pbnRfbGlzdC5kYXJ0IiwsQix7CiAiXiI6IiIsCiBHNjp7Ci0iXiI6InB2O0JXLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoicHY7QlcsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3JzOmZ1bmN0aW9uKGEpe3JldHVybiBhLkJXfSwKIHNyczpmdW5jdGlvbihhLGIpe2EuQlc9dGhpcy5jdChhLEMuVVgsYS5CVyxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQlcpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQlcpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e0R3OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTXcuWkwoYSkKIEMuTXcuWEkoYSkKQEAgLTQ0MzgsMTYgKzQ1MTcsMTYgQEAKICRpc2QzOnRydWV9fV0sWyJjbGFzc19yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2NsYXNzX3JlZi5kYXJ0IiwsUSx7CiAiXiI6IiIsCiBlVzp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogc3RhdGljOntydDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLllaei5aTChhKQogQy5ZWnouWEkoYSkKQEAgLTQ0NzAsMTMgKzQ1NDksMTMgQEAKIG84OmZ1bmN0aW9uKCl7fSwKIE5oOmZ1bmN0aW9uKCl7cmV0dXJuIEoucTgoSi5NeCh0aGlzLlJ1KSk+MH19LAogZW86ewotIl4iOiJEc2Q7Q0EsSG09LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiRHNkO0NBLEhtPSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQ0F9LAogc29kOmZ1bmN0aW9uKGEsYil7YS5DQT10aGlzLmN0KGEsQy5yQixhLkNBLGIpfSwKIEVzOmZ1bmN0aW9uKGEpe3ZhciB6CiBaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIHo9Ui50QihbXSkKLWEuSG09bmV3IEcuWE4oeixudWxsLG51bGwpCithLkhtPW5ldyBHLmlZKHosbnVsbCxudWxsKQogej1hLkNBCiBpZih6IT1udWxsKXRoaXMuaFAoYSx6LmdEWigpKX0sCiBHVTpbZnVuY3Rpb24oYSxiKXthLkNBLldSKCkubWwobmV3IE8ubmMoYSkpfSwiJDEiLCJndXoiLDIsMCwxMyw1N10sCkBAIC00NDk3LDEwICs0NTc2LDEwIEBACiBhLkhtLm1BKHopfWNhdGNoKHEpe3c9SC5SdShxKQogeT13CiB4PW5ldyBILlhPKHEsbnVsbCkKLU4uUU0oIiIpLnhIKCJfdXBkYXRlIix5LHgpfWlmKEoueEMoSi5xOChhLkhtLnZwKSwxKSlhLkhtLnFVKDApCitOLlFNKCIiKS53RigiX3VwZGF0ZSIseSx4KX1pZihKLnhDKEoucTgoYS5IbS52cCksMSkpYS5IbS5xVSgwKQogdGhpcy5jdChhLEMuZXAsbnVsbCxhLkhtKX0sCi1rYTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4icGFkZGluZy1sZWZ0OiAiK2IuZ3l0KCkqMTYrInB4OyJ9LCIkMSIsImdIbiIsMiwwLDk5LDEwMF0sCi1MWjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy5RQ1tDLmpuLlkoYi5neXQoKS0xLDkpXX0sIiQxIiwiZ2J3IiwyLDAsOTksMTAwXSwKK2thOltmdW5jdGlvbihhLGIpe3JldHVybiJwYWRkaW5nLWxlZnQ6ICIrYi5neXQoKSoxNisicHg7In0sIiQxIiwiZ0huIiwyLDAsMTAwLDEwMV0sCitMWjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gQy5RQ1tDLmpuLlkoYi5neXQoKS0xLDkpXX0sIiQxIiwiZ2J3IiwyLDAsMTAwLDEwMV0sCiBZRjpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdix1CiB3PUouUkUoYikKIGlmKCFKLnhDKEouZVMody5nTihiKSksImV4cGFuZCIpJiYhSi54Qyh3LmdOKGIpLGQpKXJldHVybgpAQCAtNDUxMSwxNSArNDU5MCwxNSBAQAogdy5xVSh2LTEpfWNhdGNoKHUpe3c9SC5SdSh1KQogeT13CiB4PW5ldyBILlhPKHUsbnVsbCkKLU4uUU0oIiIpLnhIKCJ0b2dnbGVFeHBhbmRlZCIseSx4KX19LCIkMyIsImd3SiIsNiwwLDEwMSwxLDEwMiwxMDNdLAorTi5RTSgiIikud0YoInRvZ2dsZUV4cGFuZGVkIix5LHgpfX0sIiQzIiwiZ3dKIiw2LDAsMTAyLDEsMTAzLDEwNF0sCiBzdGF0aWM6e2wwOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuUkQuWkwoYSkKIEMuUkQuWEkoYSkKQEAgLTQ1MjgsMzMgKzQ2MDcsMzMgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogbmM6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtKLm9EKHRoaXMuYSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDEwNCwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7Si5vRCh0aGlzLmEsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMDUsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJjbGFzc192aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jbGFzc192aWV3LmRhcnQiLCxaLHsKICJeIjoiIiwKLWFDOnsKLSJeIjoidHVqO3lCLG5KLG1OLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKK2FrOnsKKyJeIjoidHVqO3lCLG5KLG1OLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdSdTpmdW5jdGlvbihhKXtyZXR1cm4gYS55Qn0sCiBzUnU6ZnVuY3Rpb24oYSxiKXthLnlCPXRoaXMuY3QoYSxDLlhBLGEueUIsYil9LAogZ1d0OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5KfSwKIHNXdDpmdW5jdGlvbihhLGIpe2Eubko9dGhpcy5jdChhLEMueUIsYS5uSixiKX0sCiBnQ0Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubU59LAogc0NGOmZ1bmN0aW9uKGEsYil7YS5tTj10aGlzLmN0KGEsQy50ZyxhLm1OLGIpfSwKLXZWOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJldmFsP2V4cHI9IitQLmpXKEMueUQsYixDLnhNLCExKSl9LCIkMSIsImdabSIsMiwwLDEwNSwxMDZdLAotdGw6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIGEueUIuY3YoImluc3RhbmNlcz9saW1pdD0iK0guZChiKSkubWwobmV3IFouRXooYSkpfSwiJDEiLCJnUjEiLDIsMCwxMDcsMTA4XSwKLVMxOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJyZXRhaW5lZCIpLm1sKG5ldyBaLlNTKGEpKX0sIiQxIiwiZ2hOIiwyLDAsMTA3LDEwOV0sCi1wQTpbZnVuY3Rpb24oYSxiKXthLm5KPXRoaXMuY3QoYSxDLnlCLGEubkosbnVsbCkKK3ZWOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJldmFsP2V4cHI9IitQLmpXKEMueUQsYixDLnhNLCExKSl9LCIkMSIsImdabSIsMiwwLDEwNiwxMDddLAordGw6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIGEueUIuY3YoImluc3RhbmNlcz9saW1pdD0iK0guZChiKSkubWwobmV3IFouT2IoYSkpfSwiJDEiLCJnUjEiLDIsMCwxMDgsMTA5XSwKK1MxOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJyZXRhaW5lZCIpLm1sKG5ldyBaLlNTKGEpKX0sIiQxIiwiZ2hOIiwyLDAsMTA4LDExMF0sCitTSzpbZnVuY3Rpb24oYSxiKXthLm5KPXRoaXMuY3QoYSxDLnlCLGEubkosbnVsbCkKIGEubU49dGhpcy5jdChhLEMudGcsYS5tTixudWxsKQotSi5jSShhLnlCKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotajk6W2Z1bmN0aW9uKGEsYil7Si5lZyhhLnlCKS5ZTShiKX0sIiQxIiwiZ0RYIiwyLDAsMjAsOThdLAorSi5jSShhLnlCKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAorajk6W2Z1bmN0aW9uKGEsYil7Si5lZyhhLnlCKS5ZTShiKX0sIiQxIiwiZ0RYIiwyLDAsMjAsOTldLAogc3RhdGljOntsVzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmthLlpMKGEpCiBDLmthLlhJKGEpCkBAIC00NTYyLDIxICs0NjQxLDIxIEBACiB0dWo6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCi1Fejp7Ci0iXiI6IlRwOjExMDthIiwKK09iOnsKKyJeIjoiVHBaOjExMTthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXoubko9Si5RNSh6LEMueUIsei5uSixhKX0sIiQxIixudWxsLDIsMCxudWxsLDkyLCJjYWxsIl0sCit6Lm5KPUouUTUoeixDLnlCLHoubkosYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBTUzp7Ci0iXiI6IlRwOjExMDthIiwKKyJeIjoiVHBaOjExMTthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT1ILkJVKEouVVEoYSwidmFsdWVBc1N0cmluZyIpLG51bGwsbnVsbCkKLXoubU49Si5RNSh6LEMudGcsei5tTix5KX0sIiQxIixudWxsLDIsMCxudWxsLDkyLCJjYWxsIl0sCit6Lm1OPUouUTUoeixDLnRnLHoubU4seSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImNvZGVfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jb2RlX3JlZi5kYXJ0IiwsTyx7CiAiXiI6IiIsCiBWWTp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3RUOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRZfSwKIGFWOltmdW5jdGlvbihhLGIpe1EueEkucHJvdG90eXBlLmFWLmNhbGwodGhpcyxhLGIpCiB0aGlzLmN0KGEsQy5pNCwwLDEpfSwiJDEiLCJnTGUiLDIsMCwxMyw1N10sCkBAIC00NTg1LDI1ICs0NjY0LDI1IEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMudFdPLlpMKGEpCiBDLnRXTy5YSShhKQogcmV0dXJuIGF9fX19XSxbImNvZGVfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvY29kZV92aWV3LmRhcnQiLCxGLHsKICJeIjoiIiwKIEJlOnsKLSJeIjoiVmN0O1h4LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVmN0O1h4LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd0VDpmdW5jdGlvbihhKXtyZXR1cm4gYS5YeH0sCiBzdFQ6ZnVuY3Rpb24oYSxiKXthLlh4PXRoaXMuY3QoYSxDLmk0LGEuWHgsYil9LAogRXM6ZnVuY3Rpb24oYSl7dmFyIHoKIFoudUwucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKQogej1hLlh4CiBpZih6PT1udWxsKXJldHVybgotSi5TSyh6KS5tbChuZXcgRi5CYygpKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuWHgpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitKLlNLKHopLm1sKG5ldyBGLlA5KCkpfSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5YeCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIGIwOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiB6PUouVnMoYikuTVcuZ2V0QXR0cmlidXRlKCJkYXRhLWp1bXAtdGFyZ2V0IikKIGlmKHo9PT0iIilyZXR1cm4KQEAgLTQ2MTMsMTggKzQ2OTIsMTggQEAKIHJldHVybiB4fSwKIFlJOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgej10aGlzLmIwKGEsZCkKIGlmKHo9PW51bGwpcmV0dXJuCi1KLnBQKHopLmgoMCwiaGlnaGxpZ2h0Iil9LCIkMyIsImdmZiIsNiwwLDExMSwxLDEwMiwxMDNdLAorSi5VZih6KS5oKDAsImhpZ2hsaWdodCIpfSwiJDMiLCJnZmYiLDYsMCwxMTIsMSwxMDMsMTA0XSwKIExrOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgej10aGlzLmIwKGEsZCkKIGlmKHo9PW51bGwpcmV0dXJuCi1KLnBQKHopLlJ6KDAsImhpZ2hsaWdodCIpfSwiJDMiLCJnQUYiLDYsMCwxMTEsMSwxMDIsMTAzXSwKLXN0YXRpYzp7Zjk6ZnVuY3Rpb24oYSl7dmFyIHoseQorSi5VZih6KS5SeigwLCJoaWdobGlnaHQiKX0sIiQzIiwiZ0FGIiw2LDAsMTEyLDEsMTAzLDEwNF0sCitzdGF0aWM6e2ZtOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMudXguWkwoYSkKIEMudXguWEkoYSkKQEAgLTQ2MzIsMTUgKzQ3MTEsMTUgQEAKIFZjdDp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKLUJjOnsKLSJeIjoiVHA6MTEyOyIsCi0kMTpbZnVuY3Rpb24oYSl7YS5PRigpfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKK1A5OnsKKyJeIjoiVHBaOjExMzsiLAorJDE6W2Z1bmN0aW9uKGEpe2EuT0YoKX0sIiQxIixudWxsLDIsMCxudWxsLDg0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiY3VybHlfYmxvY2tfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2N1cmx5X2Jsb2NrLmRhcnQiLCxSLHsKICJeIjoiIiwKIEpJOnsKLSJeIjoiU2FNO0dWLHVvLG54LG9NLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKLWdvRTpmdW5jdGlvbihhKXtyZXR1cm4gYS5HVn0sCi1zb0U6ZnVuY3Rpb24oYSxiKXthLkdWPXRoaXMuY3QoYSxDLm1yLGEuR1YsYil9LAorIl4iOiJTYU07dEgsdW8sbngsb00sQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAorZ29FOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRIfSwKK3NvRTpmdW5jdGlvbihhLGIpe2EudEg9dGhpcy5jdChhLEMubXIsYS50SCxiKX0sCiBndjg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudW99LAogc3Y4OmZ1bmN0aW9uKGEsYil7YS51bz10aGlzLmN0KGEsQy5TNCxhLnVvLGIpfSwKIGdGUjpmdW5jdGlvbihhKXtyZXR1cm4gYS5ueH0sCkBAIC00NjUwLDI3ICs0NzI5LDI3IEBACiBnaXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub019LAogc2l0OmZ1bmN0aW9uKGEsYil7YS5vTT10aGlzLmN0KGEsQy5CMCxhLm9NLGIpfSwKIHRuOltmdW5jdGlvbihhLGIpe3ZhciB6PWEub00KLWEuR1Y9dGhpcy5jdChhLEMubXIsYS5HVix6KX0sIiQxIiwiZ2h5IiwyLDAsMjAsNTddLAotRGI6W2Z1bmN0aW9uKGEpe3ZhciB6PWEuR1YKLWEuR1Y9dGhpcy5jdChhLEMubXIseix6IT09ITApCithLnRIPXRoaXMuY3QoYSxDLm1yLGEudEgseil9LCIkMSIsImdoeSIsMiwwLDIwLDU3XSwKK1dNOltmdW5jdGlvbihhKXt2YXIgej1hLnRICithLnRIPXRoaXMuY3QoYSxDLm1yLHoseiE9PSEwKQogYS51bz10aGlzLmN0KGEsQy5TNCxhLnVvLCExKX0sIiQwIiwiZ04yIiwwLDAsMThdLAogY2I6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6PWEudW8KIGlmKHo9PT0hMClyZXR1cm4KIGlmKGEubnghPW51bGwpe2EudW89dGhpcy5jdChhLEMuUzQseiwhMCkKLXRoaXMuQVYoYSxhLkdWIT09ITAsdGhpcy5nTjIoYSkpfWVsc2V7ej1hLkdWCi1hLkdWPXRoaXMuY3QoYSxDLm1yLHoseiE9PSEwKX19LCIkMyIsImdESSIsNiwwLDgyLDQ2LDQ3LDgzXSwKK3RoaXMuQVYoYSxhLnRIIT09ITAsdGhpcy5nTjIoYSkpfWVsc2V7ej1hLnRICithLnRIPXRoaXMuY3QoYSxDLm1yLHoseiE9PSEwKX19LCIkMyIsImdESSIsNiwwLDgzLDQ2LDQ3LDg0XSwKIHN0YXRpYzp7b1M6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5HVj0hMQorYS50SD0hMQogYS51bz0hMQogYS5ueD1udWxsCiBhLm9NPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk8wLlpMKGEpCiBDLk8wLlhJKGEpCkBAIC00NjgwLDEyICs0NzU5LDEyIEBACiAkaXNkMzp0cnVlfX1dLFsiZGFydC5faW50ZXJuYWwiLCJkYXJ0Ol9pbnRlcm5hbCIsLEgsewogIl4iOiIiLAogYlE6ZnVuY3Rpb24oYSxiKXt2YXIgegotZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guS3AoYSwwKV0pO3ouRygpOyliLiQxKHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILk9xKGEsMCldKTt6LkcoKTspYi4kMSh6LmxvKX0sCiBDazpmdW5jdGlvbihhLGIpe3ZhciB6Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5LcChhLDApXSk7ei5HKCk7KWlmKGIuJDEoei5sbyk9PT0hMClyZXR1cm4hMAorZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guT3EoYSwwKV0pO3ouRygpOylpZihiLiQxKHoubG8pPT09ITApcmV0dXJuITAKIHJldHVybiExfSwKLUZ6OmZ1bmN0aW9uKGEsYixjKXt2YXIgegotZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guS3AoYSwwKV0pO3ouRygpOyliPWMuJDIoYix6LmxvKQorbjM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6Citmb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5PcShhLDApXSk7ei5HKCk7KWI9Yy4kMihiLHoubG8pCiByZXR1cm4gYn0sCiBBcDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIHo9W10KQEAgLTQ3MDYsNyArNDc4NSw3IEBACiBpZih6LkMoYyxiKXx8ei5EKGMsYS5sZW5ndGgpKXRocm93IEguYihQLlRFKGMsYixhLmxlbmd0aCkpfSwKIHFHOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoseSx4LHcKIEgueEYoYSxiLGMpCi16PUouYkkoYyxiKQorej1KLkhuKGMsYikKIGlmKEoueEMoeiwwKSlyZXR1cm4KIGlmKEoudTYoZSwwKSl0aHJvdyBILmIoUC51KGUpKQogeT1KLngoZCkKQEAgLTQ3MjgsNyArNDgwNyw3IEBACiBILnFHKGEsYit5LHgsYSxiKQogZm9yKHo9ei5nQShjKTt6LkcoKTtiPXcpe3c9YisxCiBDLk5tLnUoYSxiLHouZ2woKSl9fSwKLVFiOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5CituYTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogaWYoYjwwfHxiPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGIsMCxhLmxlbmd0aCkpCiBmb3Ioej1KLm1ZKGMpO3ouRygpO2I9eSl7eT1iKzEKIEMuTm0udShhLGIsei5nbCgpKX19LApAQCAtNDczNiw3ICs0ODE1LDcgQEAKIGFyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmxqKCJUb28gZmV3IGVsZW1lbnRzIil9LAogdGI6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgeix5LHgsdyx2CiB6PUouV3goYikKLWlmKHouQyhiLGQpKWZvcih5PUouYkkoei5nKGIsZSksMSkseD1KLmJJKEouZXcoZCxlKSwxKSx6PUouVTYoYSk7dz1KLld4KHkpLHcuRih5LGIpO3k9dy5XKHksMSkseD1KLmJJKHgsMSkpQy5ObS51KGMseCx6LnQoYSx5KSkKK2lmKHouQyhiLGQpKWZvcih5PUouSG4oei5nKGIsZSksMSkseD1KLkhuKEouZXcoZCxlKSwxKSx6PUouVTYoYSk7dz1KLld4KHkpLHcuRih5LGIpO3k9dy5XKHksMSkseD1KLkhuKHgsMSkpQy5ObS51KGMseCx6LnQoYSx5KSkKIGVsc2UgZm9yKHc9Si5VNihhKSx4PWQseT1iO3Y9Si5XeCh5KSx2LkMoeSx6LmcoYixlKSk7eT12LmcoeSwxKSx4PUouZXcoeCwxKSlDLk5tLnUoYyx4LHcudChhLHkpKX0sCiBUSzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgegogaWYoYz49YS5sZW5ndGgpcmV0dXJuLTEKQEAgLTQ3NTAsNyArNDgyOSw3IEBACiBmb3IoeT1jO3k+PTA7LS15KXtpZih5Pj1hLmxlbmd0aClyZXR1cm4gSC5lKGEseSkKIGlmKEoueEMoYVt5XSxiKSlyZXR1cm4geX1yZXR1cm4tMX0sCiBaRTpmdW5jdGlvbihhLGIsYyxkKXtpZihjLWI8PTMyKUgudzkoYSxiLGMsZCkKLWVsc2UgSC53UihhLGIsYyxkKX0sCitlbHNlIEguWkQoYSxiLGMsZCl9LAogdzk6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdgogZm9yKHo9YisxLHk9Si5VNihhKTt6PD1jOysreil7eD15LnQoYSx6KQogdz16CkBAIC00NzU4LDcgKzQ4MzcsNyBAQAogdj13LTEKIHkudShhLHcseS50KGEsdikpCiB3PXZ9eS51KGEsdyx4KX19LAotd1I6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUKK1pEOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlCiB6PUMuam4uY1UoYy1iKzEsNikKIHk9Yit6CiB4PWMtegpAQCAtNDg2MSw3ICs0OTQwLDcgQEAKIGlmKHohPT10aGlzLmdCKHRoaXMpKXRocm93IEguYihQLmE0KHRoaXMpKX19LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhDKHRoaXMuZ0IodGhpcyksMCl9LAogZ3JaOmZ1bmN0aW9uKGEpe2lmKEoueEModGhpcy5nQih0aGlzKSwwKSl0aHJvdyBILmIoSC5EVSgpKQotcmV0dXJuIHRoaXMuWnYoMCxKLmJJKHRoaXMuZ0IodGhpcyksMSkpfSwKK3JldHVybiB0aGlzLlp2KDAsSi5Ibih0aGlzLmdCKHRoaXMpLDEpKX0sCiB0ZzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dGhpcy5nQih0aGlzKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCkBAIC00ODkzLDcgKzQ5NzIsNyBAQAogdy52TSs9dHlwZW9mIHU9PT0ic3RyaW5nIj91OkguZCh1KQogaWYoeiE9PXRoaXMuZ0IodGhpcykpdGhyb3cgSC5iKFAuYTQodGhpcykpfXJldHVybiB3LnZNfX0sCiBhZDpmdW5jdGlvbihhLGIpe3JldHVybiBQLm1XLnByb3RvdHlwZS5hZC5jYWxsKHRoaXMsdGhpcyxiKX0sCi1lejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5BOCh0aGlzLGIpLFtudWxsLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoia1kiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJKbSIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJhTCIpfSwzMV0sCitlejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5BOCh0aGlzLGIpLFtudWxsLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoia1kiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJLNiIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJhTCIpfSwzMV0sCiBlczpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CiB6PXRoaXMuZ0IodGhpcykKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIEgucyh6KQpAQCAtNDk0MCw4ICs1MDE5LDggQEAKIHk9dGhpcy5TSAogaWYoSi5KNSh5LHopKXJldHVybiAwCiB4PXRoaXMuQU4KLWlmKHg9PW51bGx8fEouSjUoeCx6KSlyZXR1cm4gSi5iSSh6LHkpCi1yZXR1cm4gSi5iSSh4LHkpfSwKK2lmKHg9PW51bGx8fEouSjUoeCx6KSlyZXR1cm4gSi5Ibih6LHkpCityZXR1cm4gSi5Ibih4LHkpfSwKIFp2OmZ1bmN0aW9uKGEsYil7dmFyIHo9Si5ldyh0aGlzLmdqWCgpLGIpCiBpZihKLnU2KGIsMCl8fEouSjUoeix0aGlzLmdNYSgpKSl0aHJvdyBILmIoUC5URShiLDAsdGhpcy5nQih0aGlzKSkpCiByZXR1cm4gSi5pOSh0aGlzLmw2LHopfSwKQEAgLTQ5ODYsNyArNTA2NSw3IEBACiByZXR1cm4gen0sCiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gSi5xOCh0aGlzLmw2KX0sCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRk4odGhpcy5sNil9LAotZ3JaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1iKEouTVEodGhpcy5sNikpfSwKK2dyWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tYihKLnVZKHRoaXMubDYpKX0sCiAkYXNtVzpmdW5jdGlvbihhLGIpe3JldHVybltiXX0sCiAkYXNRVjpmdW5jdGlvbihhLGIpe3JldHVybltiXX0sCiBzdGF0aWM6e0sxOmZ1bmN0aW9uKGEsYixjLGQpe2lmKCEhSi54KGEpLiRpc3lOKXJldHVybiBILlZNKG5ldyBILnh5KGEsYiksW2MsZF0pCkBAIC01MDk1LDE2ICs1MTc0LDE2IEBACiB4PXkuZ0IoeikKIGlmKHR5cGVvZiBiIT09Im51bWJlciIpcmV0dXJuIEgucyhiKQogcmV0dXJuIHkuWnYoeix4LTEtYil9fSwKLUlOOnsKK3R4OnsKICJeIjoiYTtmTj4iLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKLXJldHVybiEhSi54KGIpLiRpc0lOJiZKLnhDKHRoaXMuZk4sYi5mTil9LAorcmV0dXJuISFKLngoYikuJGlzdHgmJkoueEModGhpcy5mTixiLmZOKX0sCiBnaU86ZnVuY3Rpb24oYSl7dmFyIHo9Si52MSh0aGlzLmZOKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiByZXR1cm4gNTM2ODcwOTExJjY2NDU5Nyp6fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJTeW1ib2woXCIiK0guZCh0aGlzLmZOKSsiXCIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlN5bWJvbChcIiIrSC5kKHRoaXMuZk4pKyJcIikifSwiJDAiLCJnQVkiLDAsMCw3Ml0sCiskaXN0eDp0cnVlLAogJGlzSU46dHJ1ZSwKLSRpc0dEOnRydWUsCiBzdGF0aWM6eyJeIjoiUldqLEVTMSxxdVAsS0dQLGVELGZiViJ9fX1dLFsiZGFydC5fanNfbmFtZXMiLCJkYXJ0Ol9qc19uYW1lcyIsLEgsewogIl4iOiIiLAoga1U6ZnVuY3Rpb24oYSl7dmFyIHo9SC5WTShmdW5jdGlvbihiLGMpe3ZhciB5PVtdCkBAIC01MTMyLDcgKzUyMTEsNyBAQAogei5kPW51bGwKIHouZT1udWxsCiB5PW5ldyBQLm1RKHosYikKLWZvcih4PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILktwKGEsMCldKTt4LkcoKTspeC5sby5SeChuZXcgUC5Udyh6LGIsei5jKyspLHkpCitmb3IoeD1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5PcShhLDApXSk7eC5HKCk7KXgubG8uUngobmV3IFAuVHcoeixiLHouYysrKSx5KQogeT16LmMKIGlmKHk9PT0wKXJldHVybiBQLkFiKEMuZG4sbnVsbCkKIHc9QXJyYXkoeSkKQEAgLTUxNDgsMjIgKzUyMjcsMjIgQEAKICQuUzY9en0kLms4PW51bGx9LAogQkc6W2Z1bmN0aW9uKCl7dmFyIHoKIHRyeXtQLkN4KCl9Y2F0Y2goeil7SC5SdSh6KQotJC5laigpLiQxKFAucVooKSkKKyQuZWooKS4kMShQLnlLKCkpCiAkLlM2PSQuUzYuZ2F3KCkKLXRocm93IHp9fSwiJDAiLCJxWiIsMCwwLDE4XSwKK3Rocm93IHp9fSwiJDAiLCJ5SyIsMCwwLDE4XSwKIElBOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9JC5rOAogaWYoej09bnVsbCl7ej1uZXcgUC5PTShhLG51bGwpCiAkLms4PXoKICQuUzY9egotJC5laigpLiQxKFAucVooKSl9ZWxzZXt5PW5ldyBQLk9NKGEsbnVsbCkKKyQuZWooKS4kMShQLnlLKCkpfWVsc2V7eT1uZXcgUC5PTShhLG51bGwpCiB6LmF3PXkKICQuazg9eX19LAogcmI6ZnVuY3Rpb24oYSl7dmFyIHoKIGlmKEoueEMoJC5YMyxDLk5VKSl7JC5YMy53cihhKQogcmV0dXJufXo9JC5YMwogei53cih6LnhpKGEsITApKX0sCi14MjpmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIGU/SC5WTShuZXcgUC5NdihiLGMsZCxhLG51bGwsMCxudWxsKSxbZl0pOkguVk0obmV3IFAucTEoYixjLGQsYSxudWxsLDAsbnVsbCksW2ZdKX0sCitIVDpmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIGU/SC5WTShuZXcgUC5NdihiLGMsZCxhLG51bGwsMCxudWxsKSxbZl0pOkguVk0obmV3IFAucTEoYixjLGQsYSxudWxsLDAsbnVsbCksW2ZdKX0sCiBiSzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgegogaWYoYyl7ej1ILlZNKG5ldyBQLnpXKGIsYSwwLG51bGwsbnVsbCxudWxsLG51bGwpLFtkXSkKIHouU0o9egpAQCAtNTE3OCw3ICs1MjU3LDcgQEAKIHk9dgogeD1uZXcgSC5YTyh3LG51bGwpCiAkLlgzLmhrKHkseCl9fSwKLVNOOltmdW5jdGlvbihhKXt9LCIkMSIsIkF4IiwyLDAsMjAsMjFdLAorSEM6W2Z1bmN0aW9uKGEpe30sIiQxIiwiQzciLDIsMCwyMCwyMV0sCiBTWjpbZnVuY3Rpb24oYSxiKXskLlgzLmhrKGEsYil9LGZ1bmN0aW9uKGEpe3JldHVybiBQLlNaKGEsbnVsbCl9LG51bGwsIiQyIiwiJDEiLCJYcSIsMiwyLDIyLDIzLDI0LDI1XSwKIGRMOltmdW5jdGlvbigpe30sIiQwIiwidjMiLDAsMCwxOF0sCiBGRTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcKQEAgLTUyMDgsMTEgKzUyODcsMTEgQEAKIHo9UC5VcyhjKQogdHJ5e3k9ZC4kMCgpCiByZXR1cm4geX1maW5hbGx5eyQuWDM9en19LCIkNCIsImx3Iiw4LDAsMzAsMjcsMjgsMjksMzFdLAoteXY6W2Z1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoseQorVjc6W2Z1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoseQogaWYoSi54QygkLlgzLGMpKXJldHVybiBkLiQxKGUpCiB6PVAuVXMoYykKIHRyeXt5PWQuJDEoZSkKLXJldHVybiB5fWZpbmFsbHl7JC5YMz16fX0sIiQ1IiwiVW4iLDEwLDAsMzIsMjcsMjgsMjksMzEsMzNdLAorcmV0dXJuIHl9ZmluYWxseXskLlgzPXp9fSwiJDUiLCJNTSIsMTAsMCwzMiwyNywyOCwyOSwzMSwzM10sCiBNdTpbZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB6LHkKIGlmKEoueEMoJC5YMyxjKSlyZXR1cm4gZC4kMihlLGYpCiB6PVAuVXMoYykKQEAgLTUyMjMsMTQgKzUzMDIsMTQgQEAKIHc2OltmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gZH0sIiQ0IiwibDkiLDgsMCwzNywyNywyOCwyOSwzMV0sCiBUazpbZnVuY3Rpb24oYSxiLGMsZCl7UC5JQShDLk5VIT09Yz9jLmNlKGQpOmQpfSwiJDQiLCJHMiIsOCwwLDM4XSwKIGg4OltmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBQLmpMKGQsQy5OVSE9PWM/Yy5jZShlKTplKX0sIiQ1IiwiTG0iLDEwLDAsMzksMjcsMjgsMjksNDAsNDFdLAotWEI6W2Z1bmN0aW9uKGEsYixjLGQpe0gucXcoZCl9LCIkNCIsImFXIiw4LDAsNDJdLAorWEI6W2Z1bmN0aW9uKGEsYixjLGQpe0gucXcoZCl9LCIkNCIsIm9RIiw4LDAsNDJdLAogQ0k6W2Z1bmN0aW9uKGEpe0oud2woJC5YMyxhKX0sIiQxIiwianQiLDIsMCw0M10sCi1VQTpbZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgegorRTE6W2Z1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoKICQub0s9UC5qdCgpCiB6PVAuWU0obnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQotcmV0dXJuIG5ldyBQLnVvKGMsZCx6KX0sIiQ1IiwiSXMiLDEwLDAsNDRdLAorcmV0dXJuIG5ldyBQLnVvKGMsZCx6KX0sIiQ1IiwiQWsiLDEwLDAsNDRdLAogQzY6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7SC5jdigpCiB0aGlzLmEuJDAoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKQEAgLTUyNTksMTEgKzUzMzgsMTEgQEAKIHJldHVybih6JjQpIT09MH0sCiB1TzpbZnVuY3Rpb24oKXt9LCIkMCIsImdwNCIsMCwwLDE4XSwKIExQOltmdW5jdGlvbigpe30sIiQwIiwiZ1o5IiwwLDAsMThdLAotc3RhdGljOnsiXiI6IkUyYixSRyxWQ2QifX0sCitzdGF0aWM6eyJeIjoiRTJiLEhDSyxWQ2QifX0sCiBXVnU6ewogIl4iOiJhO2lFQCxTSkAiLAogZ1VGOmZ1bmN0aW9uKCl7cmV0dXJuITF9LAotaW06ZnVuY3Rpb24oKXt2YXIgej10aGlzLnl4CitTTDpmdW5jdGlvbigpe3ZhciB6PXRoaXMueXgKIGlmKHohPW51bGwpcmV0dXJuIHoKIHo9UC5EdChudWxsKQogdGhpcy55eD16CkBAIC01MzAyLDI0ICs1MzgxLDI0IEBACiBxNzpmdW5jdGlvbigpe2lmKCh0aGlzLkd2JjQpIT09MClyZXR1cm4gbmV3IFAubGooIkNhbm5vdCBhZGQgbmV3IGV2ZW50cyBhZnRlciBjYWxsaW5nIGNsb3NlIikKIHJldHVybiBuZXcgUC5saigiQ2Fubm90IGFkZCBuZXcgZXZlbnRzIHdoaWxlIGRvaW5nIGFuIGFkZFN0cmVhbSIpfSwKIGg6W2Z1bmN0aW9uKGEsYil7aWYodGhpcy5Hdj49NCl0aHJvdyBILmIodGhpcy5xNygpKQotdGhpcy5JdihiKX0sIiQxIiwiZ2h0IiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoieWQiLHZvaWQ6dHJ1ZSxhcmdzOlthXX19LHRoaXMuJHJlY2VpdmVyLCJXVnUiKX0sMTEzXSwKK3RoaXMuSXYoYil9LCIkMSIsImdodCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6InlkIix2b2lkOnRydWUsYXJnczpbYV19fSx0aGlzLiRyZWNlaXZlciwiV1Z1Iil9LDExNF0sCiBqczpbZnVuY3Rpb24oYSxiKXtpZih0aGlzLkd2Pj00KXRocm93IEguYih0aGlzLnE3KCkpCi10aGlzLnBiKGEsYil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmpzKGEsbnVsbCl9LCJKVCIsIiQyIiwiJDEiLCJnR2oiLDIsMiwxMTQsMjMsMjQsMjVdLAordGhpcy5wYihhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qcyhhLG51bGwpfSwiSlQiLCIkMiIsIiQxIiwiZ0dqIiwyLDIsMTE1LDIzLDI0LDI1XSwKIHhPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5HdgogaWYoKHomNCkhPT0wKXJldHVybiB0aGlzLnl4CiBpZih6Pj00KXRocm93IEguYih0aGlzLnE3KCkpCiB0aGlzLkd2PXp8NAoteT10aGlzLmltKCkKLXRoaXMuRHUoKQoreT10aGlzLlNMKCkKK3RoaXMuU1koKQogcmV0dXJuIHl9LAogUmc6ZnVuY3Rpb24oYSxiKXt0aGlzLkl2KGIpfSwKIG9KOmZ1bmN0aW9uKGEsYil7dGhpcy5wYihhLGIpfSwKIFFqOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5XWAogdGhpcy5XWD1udWxsCiB0aGlzLkd2Jj00Mjk0OTY3Mjg3Ci1DLmJQLnRaKHopfSwKLUZXOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CitDLmpOLnRaKHopfSwKK1F6OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuR3YKIGlmKCh6JjIpIT09MCl0aHJvdyBILmIoUC53KCJDYW5ub3QgZmlyZSBuZXcgZXZlbnQuIENvbnRyb2xsZXIgaXMgYWxyZWFkeSBmaXJpbmcgYW4gZXZlbnQiKSkKIHk9dGhpcy5pRQpAQCAtNTM0OSwyMyArNTQyOCwyMyBAQAogdGhpcy5pRS5SZygwLGEpCiB0aGlzLkd2Jj00Mjk0OTY3MjkzCiBpZih0aGlzLmlFPT09dGhpcyl0aGlzLk9mKCkKLXJldHVybn10aGlzLkZXKG5ldyBQLnRLKHRoaXMsYSkpfSwKK3JldHVybn10aGlzLlF6KG5ldyBQLnRLKHRoaXMsYSkpfSwKIHBiOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5pRT09PXRoaXMpcmV0dXJuCi10aGlzLkZXKG5ldyBQLk9SKHRoaXMsYSxiKSl9LAotRHU6ZnVuY3Rpb24oKXtpZih0aGlzLmlFIT09dGhpcyl0aGlzLkZXKG5ldyBQLnd6KHRoaXMpKQordGhpcy5ReihuZXcgUC5PUih0aGlzLGEsYikpfSwKK1NZOmZ1bmN0aW9uKCl7aWYodGhpcy5pRSE9PXRoaXMpdGhpcy5ReihuZXcgUC5CZyh0aGlzKSkKIGVsc2UgdGhpcy55eC5PSChudWxsKX19LAogdEs6ewotIl4iOiJUcDthLGIiLAorIl4iOiJUcFo7YSxiIiwKICQxOmZ1bmN0aW9uKGEpe2EuUmcoMCx0aGlzLmIpfSwKICRpc0VIOnRydWUsCiAkc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IktYIixhcmdzOltbUC5LQSxhXV19fSx0aGlzLmEsInpXIil9fSwKIE9SOnsKLSJeIjoiVHA7YSxiLGMiLAorIl4iOiJUcFo7YSxiLGMiLAogJDE6ZnVuY3Rpb24oYSl7YS5vSih0aGlzLmIsdGhpcy5jKX0sCiAkaXNFSDp0cnVlLAogJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJLWCIsYXJnczpbW1AuS0EsYV1dfX0sdGhpcy5hLCJ6VyIpfX0sCi13ejp7Ci0iXiI6IlRwO2EiLAorQmc6eworIl4iOiJUcFo7YSIsCiAkMTpmdW5jdGlvbihhKXthLlFqKCl9LAogJGlzRUg6dHJ1ZSwKICRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTWMiLGFyZ3M6W1tQLkxSLGFdXX19LHRoaXMuYSwielciKX19LApAQCAtNTM3NywxNCArNTQ1NiwxNCBAQAogei53Nih5KX19LAogcGI6ZnVuY3Rpb24oYSxiKXt2YXIgegogZm9yKHo9dGhpcy5pRTt6IT09dGhpczt6PXouZ2lFKCkpei53NihuZXcgUC5EbihhLGIsbnVsbCkpfSwKLUR1OmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5pRQorU1k6ZnVuY3Rpb24oKXt2YXIgej10aGlzLmlFCiBpZih6IT09dGhpcylmb3IoO3ohPT10aGlzO3o9ei5naUUoKSl6Lnc2KEMuWkIpCiBlbHNlIHRoaXMueXguT0gobnVsbCl9fSwKIGI4OnsKICJeIjoiYTsiLAogJGlzYjg6dHJ1ZX0sCiB3NDp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHoseSx4LHcKIHRyeXt0aGlzLmIuclgodGhpcy5hLiQwKCkpfWNhdGNoKHgpe3c9SC5SdSh4KQogej13CkBAIC01MzkyLDcgKzU0NzEsNyBAQAogdGhpcy5iLks1KHoseSl9fSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbVE6ewotIl4iOiJUcDo3OTthLGIiLAorIl4iOiJUcFo6ODA7YSxiIiwKICQyOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogej10aGlzLmEKIHk9ei5iCkBAIC01NDAwLDEwICs1NDc5LDEwIEBACiB4PS0tei5jCiBpZih5IT1udWxsKWlmKHg9PT0wfHx0aGlzLmIpei5hLncwKGEsYikKIGVsc2V7ei5kPWEKLXouZT1ifWVsc2UgaWYoeD09PTAmJiF0aGlzLmIpei5hLncwKHouZCx6LmUpfSwiJDIiLG51bGwsNCwwLG51bGwsMTE1LDExNiwiY2FsbCJdLAorei5lPWJ9ZWxzZSBpZih4PT09MCYmIXRoaXMuYil6LmEudzAoei5kLHouZSl9LCIkMiIsbnVsbCw0LDAsbnVsbCwxMTYsMTE3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFR3OnsKLSJeIjoiVHA6MTE3O2EsYyxkIiwKKyJeIjoiVHBaOjExODthLGMsZCIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9dGhpcy5hCiB5PS0tei5jCkBAIC01NDE1LDIyICs1NDk0LDIyIEBACiBpZih6Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCiB6Lk9IKHgpfX1lbHNlIGlmKHk9PT0wJiYhdGhpcy5jKXouYS53MCh6LmQsei5lKX0sIiQxIixudWxsLDIsMCxudWxsLDIxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLUFFOnsKK0E1OnsKICJeIjoiYTsiLAotJGlzQUU6dHJ1ZX0sCiskaXNBNTp0cnVlfSwKIFBmMDp7CiAiXiI6ImE7IiwKLSRpc0FFOnRydWV9LAorJGlzQTU6dHJ1ZX0sCiBaZjp7CiAiXiI6IlBmMDtNTSIsCiBqMzpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLk1NCiBpZih6Lkd2IT09MCl0aHJvdyBILmIoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKLXouT0goYil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmozKGEsbnVsbCl9LCJ0WiIsIiQxIiwiJDAiLCJndjYiLDAsMiwxMTgsMjMsMjFdLAorei5PSChiKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuajMoYSxudWxsKX0sInRaIiwiJDEiLCIkMCIsImd2NiIsMCwyLDExOSwyMywyMV0sCiB3MDpbZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYT09bnVsbCl0aHJvdyBILmIoUC51KCJFcnJvciBtdXN0IG5vdCBiZSBudWxsIikpCiB6PXRoaXMuTU0KIGlmKHouR3YhPT0wKXRocm93IEguYihQLncoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQotei5DRyhhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53MChhLG51bGwpfSwicG0iLCIkMiIsIiQxIiwiZ1lKIiwyLDIsMTE0LDIzLDI0LDI1XX0sCit6LkNHKGEsYil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLncwKGEsbnVsbCl9LCJwbSIsIiQyIiwiJDEiLCJnWUoiLDIsMiwxMTUsMjMsMjQsMjVdfSwKIEdjOnsKICJeIjoiYTtHdixMajwsamssQlFALE9ZLEFzLHFWLG80IiwKIGdjZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkd2Pj00fSwKQEAgLTU1NTYsMzEgKzU2MzUsMzEgQEAKIHk9YgogYj1xfX19fSwKIGRhOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXtQLkhaKHRoaXMuYSx0aGlzLmIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogVTc6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3RoaXMuYS5SOChhKX0sIiQxIixudWxsLDIsMCxudWxsLDIxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHZyOnsKLSJeIjoiVHA6MTE5O2IiLAorIl4iOiJUcFo6MTIwO2IiLAogJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5iLks1KGEsYil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLiQyKGEsbnVsbCl9LCIkMSIsIiQyIixudWxsLG51bGwsMiwyLG51bGwsMjMsMjQsMjUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogY1g6ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe1AuQTkodGhpcy5iLHRoaXMuYSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlWDp7Ci0iXiI6IlRwOjcxO2MsZCIsCisiXiI6IlRwWjo3MjtjLGQiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5jLlI4KHRoaXMuZCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBaTDp7Ci0iXiI6IlRwOjcxO2EsYixjIiwKKyJeIjoiVHBaOjcyO2EsYixjIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYS5LNSh0aGlzLmIsdGhpcy5jKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHJxOnsKLSJeIjoiVHA6MTIwO2IsZCxlLGYiLAorIl4iOiJUcFo6MTIxO2IsZCxlLGYiLAogJDA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdwogdHJ5e3RoaXMuYi5jPXRoaXMuZi5GSSh0aGlzLmQuZ08xKCksdGhpcy5lKQogcmV0dXJuITB9Y2F0Y2goeCl7dz1ILlJ1KHgpCkBAIC01NTkwLDcgKzU2NjksNyBAQAogcmV0dXJuITF9fSwKICRpc0VIOnRydWV9LAogUlc6ewotIl4iOiJUcDoxODtjLGIsVUksYksiLAorIl4iOiJUcFo6MTg7YyxiLFVJLGJLIiwKICQwOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbQogej10aGlzLmMuZS5nY0coKQogcj10aGlzLlVJCkBAIC01NjI2LDcgKzU3MDUsNyBAQAogci5iPSExfX0sCiAkaXNFSDp0cnVlfSwKIFJUOnsKLSJeIjoiVHA6MTg7YyxiLEdxLFJtLHczIiwKKyJeIjoiVHBaOjE4O2MsYixHcSxSbSx3MyIsCiAkMDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYsdQogej17fQogei5hPW51bGwKQEAgLTU2NDYsMTEgKzU3MjUsMTEgQEAKIHouYS5SeChuZXcgUC5qWih0aGlzLmMsdiksbmV3IFAuRlooeix2KSl9fSwKICRpc0VIOnRydWV9LAogalo6ewotIl4iOiJUcDoxMztjLEhaIiwKLSQxOltmdW5jdGlvbihhKXtQLkhaKHRoaXMuYy5lLHRoaXMuSFopfSwiJDEiLG51bGwsMiwwLG51bGwsMTIxLCJjYWxsIl0sCisiXiI6IlRwWjoxMztjLEhaIiwKKyQxOltmdW5jdGlvbihhKXtQLkhaKHRoaXMuYy5lLHRoaXMuSFopfSwiJDEiLG51bGwsMiwwLG51bGwsMTIyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEZaOnsKLSJeIjoiVHA6MTE5O2EsbUciLAorIl4iOiJUcFo6MTIwO2EsbUciLAogJDI6W2Z1bmN0aW9uKGEsYil7dmFyIHoseQogej10aGlzLmEKIGlmKCFKLngoei5hKS4kaXNHYyl7eT1QLkR0KG51bGwpCkBAIC01NjYyLDggKzU3NDEsOCBAQAogS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRlIuJDAoKX19LAogd1M6ewogIl4iOiJhOyIsCi1lejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgUC5jOShiLHRoaXMpLFtILmlwKHRoaXMsIndTIiwwKSxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImJwIixyZXQ6UC53UyxhcmdzOlt7ZnVuYzoiTGYiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwid1MiKX0sMTIyXSwKLWxNOltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBQLkJnKGIsdGhpcyksW0guaXAodGhpcywid1MiLDApLG51bGxdKX0sIiQxIiwiZ2l0IiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoieHYiLHJldDpQLndTLGFyZ3M6W3tmdW5jOiJmQSIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJ3UyIpfSwxMjJdLAorZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFAuYzkoYix0aGlzKSxbSC5pcCh0aGlzLCJ3UyIsMCksbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJicCIscmV0OlAud1MsYXJnczpbe2Z1bmM6IlB3IixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIndTIil9LDEyM10sCitsTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgUC5BRShiLHRoaXMpLFtILmlwKHRoaXMsIndTIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6Inh2IixyZXQ6UC53UyxhcmdzOlt7ZnVuYzoiZkEiLHJldDpQLlFWLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwid1MiKX0sMTIzXSwKIHRnOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej17fQogeT1QLkR0KFAuYTIpCkBAIC01NjgwLDcgKzU3NTksNyBAQAogej17fQogeT1QLkR0KFAuYTIpCiB6LmE9bnVsbAotei5hPXRoaXMuS1IobmV3IFAuQlNkKHosdGhpcyxiLHkpLCEwLG5ldyBQLmR5aih5KSx5LmdhcSgpKQorei5hPXRoaXMuS1IobmV3IFAuSWEoeix0aGlzLGIseSksITAsbmV3IFAuQlNkKHkpLHkuZ2FxKCkpCiByZXR1cm4geX0sCiBnQjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXt9CkBAIC01Njk5LDcgKzU3NzgsNyBAQAogeT1QLkR0KFtQLnh1LEguaXAodGhpcywid1MiLDApXSkKIHRoaXMuS1IobmV3IFAub1kodGhpcyx6KSwhMCxuZXcgUC55Wih6LHkpLHkuZ2FxKCkpCiByZXR1cm4geX0sCi1ndEg6ZnVuY3Rpb24oYSl7dmFyIHoseQorZ1R3OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9e30KIHk9UC5EdChILmlwKHRoaXMsIndTIiwwKSkKIHouYT1udWxsCkBAIC01NzE0LDExMiArNTc5MywxMTIgQEAKIHJldHVybiB5fSwKICRpc3dTOnRydWV9LAogU2Q6ewotIl4iOiJUcDthLGIsYyxkIiwKKyJeIjoiVHBaO2EsYixjLGQiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5hCiB5PXRoaXMuZAotUC5GRShuZXcgUC5PaCh0aGlzLmMsYSksbmV3IFAuanZIKHoseSksUC5UQih6LmEseSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTIzLCJjYWxsIl0sCitQLkZFKG5ldyBQLkxCKHRoaXMuYyxhKSxuZXcgUC5PaCh6LHkpLFAuVEIoei5hLHkpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCi1PaDp7Ci0iXiI6IlRwOjcxO2UsZiIsCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAorTEI6eworIl4iOiJUcFo6NzI7ZSxmIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIEoueEModGhpcy5mLHRoaXMuZSl9LAogJGlzRUg6dHJ1ZX0sCi1qdkg6ewotIl4iOiJUcDoxMjQ7YSxVSSIsCitPaDp7CisiXiI6IlRwWjoxMjU7YSxVSSIsCiAkMTpmdW5jdGlvbihhKXtpZihhPT09ITApUC5CYih0aGlzLmEuYSx0aGlzLlVJLCEwKX0sCiAkaXNFSDp0cnVlfSwKIHRHOnsKLSJeIjoiVHA6NzE7YksiLAorIl4iOiJUcFo6NzI7YksiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5iSy5yWCghMSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBsejp7Ci0iXiI6IlRwO2EsYixjLGQiLAotJDE6W2Z1bmN0aW9uKGEpe1AuRkUobmV3IFAuUmwodGhpcy5jLGEpLG5ldyBQLmF0KCksUC5UQih0aGlzLmEuYSx0aGlzLmQpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyMywiY2FsbCJdLAorIl4iOiJUcFo7YSxiLGMsZCIsCiskMTpbZnVuY3Rpb24oYSl7UC5GRShuZXcgUC5SbCh0aGlzLmMsYSksbmV3IFAuSmIoKSxQLlRCKHRoaXMuYS5hLHRoaXMuZCkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTI0LCJjYWxsIl0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJMZiIsYXJnczpbYV19fSx0aGlzLmIsIndTIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUHciLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiBSbDp7Ci0iXiI6IlRwOjcxO2UsZiIsCisiXiI6IlRwWjo3MjtlLGYiLAogJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lLiQxKHRoaXMuZil9LAogJGlzRUg6dHJ1ZX0sCi1hdDp7Ci0iXiI6IlRwOjEzOyIsCitKYjp7CisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7fSwKICRpc0VIOnRydWV9LAogTTQ6ewotIl4iOiJUcDo3MTtVSSIsCisiXiI6IlRwWjo3MjtVSSIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLlVJLnJYKG51bGwpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAotQlNkOnsKLSJeIjoiVHA7YSxiLGMsZCIsCitJYTp7CisiXiI6IlRwWjthLGIsYyxkIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT10aGlzLmQKLVAuRkUobmV3IFAuV04odGhpcy5jLGEpLG5ldyBQLlhQQih6LHkpLFAuVEIoei5hLHkpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyMywiY2FsbCJdLAorUC5GRShuZXcgUC5XTih0aGlzLmMsYSksbmV3IFAuWFBCKHoseSksUC5UQih6LmEseSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTI0LCJjYWxsIl0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJMZiIsYXJnczpbYV19fSx0aGlzLmIsIndTIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUHciLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiBXTjp7Ci0iXiI6IlRwOjcxO2UsZiIsCisiXiI6IlRwWjo3MjtlLGYiLAogJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lLiQxKHRoaXMuZil9LAogJGlzRUg6dHJ1ZX0sCiBYUEI6ewotIl4iOiJUcDoxMjQ7YSxVSSIsCisiXiI6IlRwWjoxMjU7YSxVSSIsCiAkMTpmdW5jdGlvbihhKXtpZihhPT09ITApUC5CYih0aGlzLmEuYSx0aGlzLlVJLCEwKX0sCiAkaXNFSDp0cnVlfSwKLWR5ajp7Ci0iXiI6IlRwOjcxO2JLIiwKK0JTZDp7CisiXiI6IlRwWjo3MjtiSyIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmJLLnJYKCExKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFBJOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXsrK3RoaXMuYS5hfSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdU86ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYi5yWCh0aGlzLmEuYSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBxZzp7Ci0iXiI6IlRwOjEzO2EsYiIsCisiXiI6IlRwWjoxMzthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe1AuQmIodGhpcy5hLmEsdGhpcy5iLCExKX0sIiQxIixudWxsLDIsMCxudWxsLDE0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFdkOnsKLSJeIjoiVHA6NzE7YyIsCisiXiI6IlRwWjo3MjtjIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYy5yWCghMCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBvWTp7Ci0iXiI6IlRwO2EsYiIsCi0kMTpbZnVuY3Rpb24oYSl7dGhpcy5iLmgoMCxhKX0sIiQxIixudWxsLDIsMCxudWxsLDExMywiY2FsbCJdLAorIl4iOiJUcFo7YSxiIiwKKyQxOltmdW5jdGlvbihhKXt0aGlzLmIuaCgwLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTE0LCJjYWxsIl0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJMZiIsYXJnczpbYV19fSx0aGlzLmEsIndTIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUHciLGFyZ3M6W2FdfX0sdGhpcy5hLCJ3UyIpfX0sCiB5Wjp7Ci0iXiI6IlRwOjcxO2MsZCIsCisiXiI6IlRwWjo3MjtjLGQiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5kLnJYKHRoaXMuYyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB4cDp7Ci0iXiI6IlRwO2EsYixjIiwKKyJeIjoiVHBaO2EsYixjIiwKICQxOltmdW5jdGlvbihhKXtQLkJiKHRoaXMuYS5hLHRoaXMuYyxhKX0sIiQxIixudWxsLDIsMCxudWxsLDIxLCJjYWxsIl0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJMZiIsYXJnczpbYV19fSx0aGlzLmIsIndTIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUHciLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiBPQzp7Ci0iXiI6IlRwOjcxO2QiLAorIl4iOiJUcFo6NzI7ZCIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmQuTHAobmV3IFAubGooIk5vIGVsZW1lbnRzIikpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogVUg6ewotIl4iOiJUcDthLGIiLAorIl4iOiJUcFo7YSxiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKIHouYj0hMAogei5hPWF9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAogZUk6ewotIl4iOiJUcDo3MTthLGMiLAorIl4iOiJUcFo6NzI7YSxjIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYQogaWYoei5iKXt0aGlzLmMuclgoei5hKQogcmV0dXJufXRoaXMuYy5McChuZXcgUC5saigiTm8gZWxlbWVudHMiKSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1NTzp7Cit5WDp7CiAiXiI6ImE7IiwKLSRpc01POnRydWV9LAorJGlzeVg6dHJ1ZX0sCiBuUjp7CiAiXiI6ImE7IiwKIGdVRjpmdW5jdGlvbigpe3ZhciB6PXRoaXMuR3YKQEAgLTU4MzYsNyArNTkxNSw3IEBACiByZXR1cm4gdGhpcy54R30sCiBuRzpmdW5jdGlvbigpe2lmKCh0aGlzLkd2JjQpIT09MClyZXR1cm4gbmV3IFAubGooIkNhbm5vdCBhZGQgZXZlbnQgYWZ0ZXIgY2xvc2luZyIpCiByZXR1cm4gbmV3IFAubGooIkNhbm5vdCBhZGQgZXZlbnQgd2hpbGUgYWRkaW5nIGEgc3RyZWFtIil9LAotaW06ZnVuY3Rpb24oKXt2YXIgej10aGlzLnl4CitTTDpmdW5jdGlvbigpe3ZhciB6PXRoaXMueXgKIGlmKHo9PW51bGwpe3o9KHRoaXMuR3YmMikhPT0wPyQubWsoKTpQLkR0KG51bGwpCiB0aGlzLnl4PXp9cmV0dXJuIHp9LAogaDpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLkd2CkBAIC01ODQ0LDEzICs1OTIzLDEzIEBACiBpZigoeiYxKSE9PTApdGhpcy5JdihiKQogZWxzZSBpZigoeiYzKT09PTApdGhpcy5rVygpLmgoMCxILlZNKG5ldyBQLmZaKGIsbnVsbCksW0guaXAodGhpcywiblIiLDApXSkpfSwiJDEiLCJnaHQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJsVTYiLHZvaWQ6dHJ1ZSxhcmdzOlthXX19LHRoaXMuJHJlY2VpdmVyLCJuUiIpfV0sCiB4TzpmdW5jdGlvbihhKXt2YXIgej10aGlzLkd2Ci1pZigoeiY0KSE9PTApcmV0dXJuIHRoaXMuaW0oKQoraWYoKHomNCkhPT0wKXJldHVybiB0aGlzLlNMKCkKIGlmKHo+PTQpdGhyb3cgSC5iKHRoaXMubkcoKSkKIHp8PTQKIHRoaXMuR3Y9egotaWYoKHomMSkhPT0wKXRoaXMuRHUoKQoraWYoKHomMSkhPT0wKXRoaXMuU1koKQogZWxzZSBpZigoeiYzKT09PTApdGhpcy5rVygpLmgoMCxDLlpCKQotcmV0dXJuIHRoaXMuaW0oKX0sCityZXR1cm4gdGhpcy5TTCgpfSwKIFJnOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5HdgogaWYoKHomMSkhPT0wKXRoaXMuSXYoYikKIGVsc2UgaWYoKHomMyk9PT0wKXRoaXMua1coKS5oKDAsSC5WTShuZXcgUC5mWihiLG51bGwpLFtILmlwKHRoaXMsIm5SIiwwKV0pKX0sCkBAIC01ODgxLDcgKzU5NjAsNyBAQAogdT1QLkR0KG51bGwpCiB1LkNHKHkseCkKIHo9dX1lbHNlIHo9ei5ZTSh0aGlzLmdRQygpKQotdj1uZXcgUC5CY1YodGhpcykKK3Y9bmV3IFAuQmModGhpcykKIGlmKHohPW51bGwpej16LllNKHYpCiBlbHNlIHYuJDAoKQogcmV0dXJuIHp9LApAQCAtNTg5MCwxMSArNTk2OSwxMSBAQAogbTQ6ZnVuY3Rpb24oYSl7aWYoKHRoaXMuR3YmOCkhPT0wKXRoaXMueEcuUUUoMCkKIFAub3QodGhpcy5nWjkoKSl9fSwKIFVPOnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOmZ1bmN0aW9uKCl7UC5vdCh0aGlzLmEuZ25MKCkpfSwKICRpc0VIOnRydWV9LAotQmNWOnsKLSJeIjoiVHA6MTg7YSIsCitCYzp7CisiXiI6IlRwWjoxODthIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYS55eAogaWYoeiE9bnVsbCYmei5Hdj09PTApei5PSChudWxsKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKQEAgLTU5MDIsMTIgKzU5ODEsMTIgQEAKICJeIjoiYTsiLAogSXY6ZnVuY3Rpb24oYSl7dGhpcy5nRWUoKS5SZygwLGEpfSwKIHBiOmZ1bmN0aW9uKGEsYil7dGhpcy5nRWUoKS5vSihhLGIpfSwKLUR1OmZ1bmN0aW9uKCl7dGhpcy5nRWUoKS5RaigpfX0sCitTWTpmdW5jdGlvbigpe3RoaXMuZ0VlKCkuUWooKX19LAogb2YyOnsKICJeIjoiYTsiLAogSXY6ZnVuY3Rpb24oYSl7dGhpcy5nRWUoKS53NihILlZNKG5ldyBQLmZaKGEsbnVsbCksW251bGxdKSl9LAogcGI6ZnVuY3Rpb24oYSxiKXt0aGlzLmdFZSgpLnc2KG5ldyBQLkRuKGEsYixudWxsKSl9LAotRHU6ZnVuY3Rpb24oKXt0aGlzLmdFZSgpLnc2KEMuWkIpfX0sCitTWTpmdW5jdGlvbigpe3RoaXMuZ0VlKCkudzYoQy5aQil9fSwKIHExOnsKICJeIjoiWnpEO25MPCxwNDwsWjk8LFFDPCx4RyxHdix5eCIsCiB0QTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFDLiQwKCl9fSwKQEAgLTU5MTksNyArNTk5OCw3IEBACiBNRkk6ewogIl4iOiJuUitUVDsifSwKIHUyOnsKLSJeIjoiWW47bHkiLAorIl4iOiJhTjtseSIsCiB3NDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5seS5FVChhKX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuKEguZVEodGhpcy5seSleODkyNDgyODY2KT4+PjB9LAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKQEAgLTU5NTAsNyArNjAyOSw3IEBACiB0aGlzLkd2PSh6KzEyOHw0KT4+PjAKIGlmKGIhPW51bGwpYi5ZTSh0aGlzLmdEUSh0aGlzKSkKIGlmKHo8MTI4JiZ0aGlzLlJpIT1udWxsKXRoaXMuUmkuSU8oKQotaWYoKHomNCk9PT0wJiYodGhpcy5HdiYzMik9PT0wKXRoaXMuSjcodGhpcy5ncDQoKSl9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkZ2KGEsbnVsbCl9LCJ5eSIsIiQxIiwiJDAiLCJnWDAiLDAsMiwxMjUsMjMsMTI2XSwKK2lmKCh6JjQpPT09MCYmKHRoaXMuR3YmMzIpPT09MCl0aGlzLko3KHRoaXMuZ3A0KCkpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5GdihhLG51bGwpfSwieXkiLCIkMSIsIiQwIiwiZ1gwIiwwLDIsMTI2LDIzLDEyN10sCiBRRTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HdgogaWYoKHomOCkhPT0wKXJldHVybgogaWYoej49MTI4KXt6LT0xMjgKQEAgLTU5ODUsNyArNjA2NCw3IEBACiBpZigoeiY4KSE9PTApcmV0dXJuCiB6PSh6fDIpPj4+MAogdGhpcy5Hdj16Ci1pZih6PDMyKXRoaXMuRHUoKQoraWYoejwzMil0aGlzLlNZKCkKIGVsc2UgdGhpcy53NihDLlpCKX0sCiB1TzpbZnVuY3Rpb24oKXt9LCIkMCIsImdwNCIsMCwwLDE4XSwKIExQOltmdW5jdGlvbigpe30sIiQwIiwiZ1o5IiwwLDAsMThdLApAQCAtNjAxMiw3ICs2MDkxLDcgQEAKIGlmKCEhSi54KHopLiRpc2I4KXouWU0oeSkKIGVsc2UgeS4kMCgpfWVsc2V7eS4kMCgpCiB0aGlzLnV0KCh6JjQpIT09MCl9fSwKLUR1OmZ1bmN0aW9uKCl7dmFyIHoseQorU1k6ZnVuY3Rpb24oKXt2YXIgeix5CiB6PW5ldyBQLnFCKHRoaXMpCiB0aGlzLnRrKCkKIHRoaXMuR3Y9KHRoaXMuR3Z8MTYpPj4+MApAQCAtNjA0MSwxMCArNjEyMCwxMCBAQAogZWxzZSB0aGlzLkxQKCkKIHRoaXMuR3Y9KHRoaXMuR3YmNDI5NDk2NzI2Myk+Pj4wfXo9dGhpcy5HdgogaWYoKHomNjQpIT09MCYmejwxMjgpdGhpcy5SaS50Mih0aGlzKX0sCi0kaXNNTzp0cnVlLAotc3RhdGljOnsiXiI6Ilh4LGJHLFE5ZSxJcjksbmF2LERyLEpBSyx2byxGRiJ9fSwKKyRpc3lYOnRydWUsCitzdGF0aWM6eyJeIjoiWHgsYkcsUTllLElyOSxuYXYsRHIsSkFLLHZvLFBqIn19LAogeDE6ewotIl4iOiJUcDoxODthLGIsYyIsCisiXiI6IlRwWjoxODthLGIsYyIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUKIHo9dGhpcy5hCiB5PXouR3YKQEAgLTYwNjEsNyArNjE0MCw3IEBACiBlbHNlIHkubTEodix1KX16Lkd2PSh6Lkd2JjQyOTQ5NjcyNjMpPj4+MH0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHFCOnsKLSJeIjoiVHA6MTg7YSIsCisiXiI6IlRwWjoxODthIiwKICQwOltmdW5jdGlvbigpe3ZhciB6LHkKIHo9dGhpcy5hCiB5PXouR3YKQEAgLTYwNzAsNyArNjE0OSw3IEBACiB6LkxqLmJIKHouQmQpCiB6Lkd2PSh6Lkd2JjQyOTQ5NjcyNjMpPj4+MH0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLVluOnsKK2FOOnsKICJeIjoid1M7IiwKIEtSOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6PXRoaXMudzQoITA9PT1iKQogei5wcyhhKQpAQCAtNjA4NSwxNyArNjE2NCwxNyBAQAogeT1uZXcgUC5LQShudWxsLG51bGwsbnVsbCx6LHksbnVsbCxudWxsKQogeS4kYnVpbHRpblR5cGVJbmZvPXRoaXMuJGJ1aWx0aW5UeXBlSW5mbwogcmV0dXJuIHl9fSwKLWZJbTp7Cit0aTp7CiAiXiI6ImE7YXdAIn0sCiBmWjp7Ci0iXiI6ImZJbTtQPixhdyIsCisiXiI6InRpO1A+LGF3IiwKIGRQOmZ1bmN0aW9uKGEpe2EuSXYodGhpcy5QKX19LAogRG46ewotIl4iOiJmSW07a2M+LEk0PCxhdyIsCisiXiI6InRpO2tjPixJNDwsYXciLAogZFA6ZnVuY3Rpb24oYSl7YS5wYih0aGlzLmtjLHRoaXMuSTQpfX0sCiB5UmY6ewogIl4iOiJhOyIsCi1kUDpmdW5jdGlvbihhKXthLkR1KCl9LAorZFA6ZnVuY3Rpb24oYSl7YS5TWSgpfSwKIGdhdzpmdW5jdGlvbigpe3JldHVybn0sCiBzYXc6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAudygiTm8gZXZlbnRzIGFmdGVyIGEgZG9uZS4iKSl9fSwKIEIzUDp7CkBAIC02MTA3LDEzICs2MTg2LDEzIEBACiB0aGlzLkd2PTF9LAogSU86ZnVuY3Rpb24oKXtpZih0aGlzLkd2PT09MSl0aGlzLkd2PTN9fSwKIENSOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMuYQogeT16Lkd2CiB6Lkd2PTAKIGlmKHk9PT0zKXJldHVybgotei5UTyh0aGlzLmIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKK3oudkcodGhpcy5iKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFFrOnsKICJeIjoiQjNQO3pSLE42LEd2IiwKQEAgLTYxMjIsNyArNjIwMSw3IEBACiBpZih6PT1udWxsKXt0aGlzLk42PWIKIHRoaXMuelI9Yn1lbHNle3ouc2F3KGIpCiB0aGlzLk42PWJ9fSwKLVRPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3ZHOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy56UgogeT16LmdhdygpCiB0aGlzLnpSPXkKQEAgLTYxNDEsMzAgKzYyMjAsMzAgQEAKIGZtOmZ1bmN0aW9uKGEsYil7fSwKIHk1OmZ1bmN0aW9uKGEpe3RoaXMuQmQ9YX0sCiBGdjpbZnVuY3Rpb24oYSxiKXt0aGlzLkd2Kz00Ci1pZihiIT1udWxsKWIuWU0odGhpcy5nRFEodGhpcykpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5GdihhLG51bGwpfSwieXkiLCIkMSIsIiQwIiwiZ1gwIiwwLDIsMTI1LDIzLDEyNl0sCitpZihiIT1udWxsKWIuWU0odGhpcy5nRFEodGhpcykpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5GdihhLG51bGwpfSwieXkiLCIkMSIsIiQwIiwiZ1gwIiwwLDIsMTI2LDIzLDEyN10sCiBRRTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HdgogaWYoej49NCl7ei09NAogdGhpcy5Hdj16CiBpZih6PDQmJih6JjEpPT09MCl0aGlzLnljKCl9fSwiJDAiLCJnRFEiLDAsMCwxOF0sCiBlZDpmdW5jdGlvbigpe3JldHVybn0sCi1EdTpbZnVuY3Rpb24oKXt2YXIgej0odGhpcy5HdiY0Mjk0OTY3MjkzKT4+PjAKK1NZOltmdW5jdGlvbigpe3ZhciB6PSh0aGlzLkd2JjQyOTQ5NjcyOTMpPj4+MAogdGhpcy5Hdj16CiBpZih6Pj00KXJldHVybgogdGhpcy5Hdj0oenwxKT4+PjAKIHo9dGhpcy5CZAogaWYoeiE9bnVsbCl0aGlzLkxqLmJIKHopfSwiJDAiLCJnWG0iLDAsMCwxOF0sCi0kaXNNTzp0cnVlLAotc3RhdGljOnsiXiI6IkQ0LEVENyxFTGcifX0sCiskaXN5WDp0cnVlLAorc3RhdGljOnsiXiI6IkZrVixFRDcsRUxnIn19LAogZFI6ewotIl4iOiJUcDo3MTthLGIsYyIsCisiXiI6IlRwWjo3MjthLGIsYyIsCiAkMDpbZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLks1KHRoaXMuYix0aGlzLmMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdVI6ewotIl4iOiJUcDoxMjc7YSxiIiwKKyJeIjoiVHBaOjEyODthLGIiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5OWCh0aGlzLmEsdGhpcy5iLGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBRWDp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5yWCh0aGlzLmIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogb2c6ewpAQCAtNjIwMCwxNSArNjI3OSwxNSBAQAogdEE6ZnVuY3Rpb24oKXt2YXIgej10aGlzLkVlCiBpZih6IT1udWxsKXt0aGlzLkVlPW51bGwKIHouZWQoKX1yZXR1cm59LAotdng6W2Z1bmN0aW9uKGEpe3RoaXMuS1Eua00oYSx0aGlzKX0sIiQxIiwiZ09hIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJrQTYiLHZvaWQ6dHJ1ZSxhcmdzOlthXX19LHRoaXMuJHJlY2VpdmVyLCJmQiIpfSwxMTNdLAoteEw6W2Z1bmN0aW9uKGEsYil7dGhpcy5vSihhLGIpfSwiJDIiLCJndmUiLDQsMCwxMjgsMjQsMjVdLAordng6W2Z1bmN0aW9uKGEpe3RoaXMuS1Eua00oYSx0aGlzKX0sIiQxIiwiZ09hIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJrQTYiLHZvaWQ6dHJ1ZSxhcmdzOlthXX19LHRoaXMuJHJlY2VpdmVyLCJmQiIpfSwxMTRdLAoreEw6W2Z1bmN0aW9uKGEsYil7dGhpcy5vSihhLGIpfSwiJDIiLCJndmUiLDQsMCwxMjksMjQsMjVdLAogU3A6W2Z1bmN0aW9uKCl7dGhpcy5RaigpfSwiJDAiLCJnSDEiLDAsMCwxOF0sCiBTODpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5CiB6PXRoaXMuZ09hKCkKIHk9dGhpcy5ndmUoKQogdGhpcy5FZT10aGlzLktRLlNiLnpDKHosdGhpcy5nSDEoKSx5KX0sCiAkYXNLQTpmdW5jdGlvbihhLGIpe3JldHVybltiXX0sCi0kYXNNTzpmdW5jdGlvbihhLGIpe3JldHVybltiXX19LAorJGFzeVg6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYl19fSwKIG5POnsKICJeIjoib2c7WlAsU2IiLAogRHI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWlAuJDEoYSl9LApAQCAtNjIzMSw3ICs2MzEwLDcgQEAKIHg9bmV3IEguWE8odyxudWxsKQogYi5vSih5LHgpCiByZXR1cm59Si53eChiLHopfX0sCi1CZzp7CitBRTp7CiAiXiI6Im9nO3BLLFNiIiwKIEdXOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBLLiQxKGEpfSwKIGtNOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgpAQCAtNjI0NSw5ICs2MzI0LDkgQEAKIGFZeTp7CiAiXiI6ImE7In0sCiB5UTp7Ci0iXiI6ImE7RTI8LGNTPCxPdDwsakg8LEthPCxYcDwsZmI8LHJiPCxacTwsTlcsbXA+LHhrPCIsCisiXiI6ImE7RTI8LGhZPCxPdDwsakg8LEthPCxYcDwsZmI8LHJiPCxacTwsTlcsbXA+LHhrPCIsCiBoazpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkUyLiQyKGEsYil9LAotR3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY1MuJDEoYSl9LAorR3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaFkuJDEoYSl9LAogRkk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5PdC4kMihhLGIpfSwKIG1nOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5qSC4kMyhhLGIsYyl9LAogQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2EuJDEoYSl9LApAQCAtNjI1OCwxOSArNjMzNywxOSBAQAogdU46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5acS4kMihhLGIpfSwKIENoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubXAuJDEoYil9LAogcXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueGsuJDEkc3BlY2lmaWNhdGlvbihhKX19LAotcUs6eworZTR5OnsKICJeIjoiYTsifSwKIGRsOnsKICJeIjoiYTsifSwKIElkOnsKICJeIjoiYTtuVSIsCiBnTGo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5uVX0sCi14NTpmdW5jdGlvbihhLGIsYyl7dmFyIHo9dGhpcy5uVQorYzE6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6PXRoaXMublUKIGZvcig7ei5ndHAoKS5nRTIoKT09bnVsbDspej16LmdlVCh6KQogcmV0dXJuIHouZ3RwKCkuZ0UyKCkuJDUoeixuZXcgUC5JZCh6LmdlVCh6KSksYSxiLGMpfSwKIFZuOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5uVQotZm9yKDt6Lmd0cCgpLmdjUygpPT1udWxsOyl6PXouZ2VUKHopCi1yZXR1cm4gei5ndHAoKS5nY1MoKS4kNCh6LG5ldyBQLklkKHouZ2VUKHopKSxhLGIpfSwKK2Zvcig7ei5ndHAoKS5naFkoKT09bnVsbDspej16LmdlVCh6KQorcmV0dXJuIHouZ3RwKCkuZ2hZKCkuJDQoeixuZXcgUC5JZCh6LmdlVCh6KSksYSxiKX0sCiBFbzpmdW5jdGlvbihhLGIsYyl7dmFyIHo9dGhpcy5uVQogZm9yKDt6Lmd0cCgpLmdPdCgpPT1udWxsOyl6PXouZ2VUKHopCiByZXR1cm4gei5ndHAoKS5nT3QoKS4kNSh6LG5ldyBQLklkKHouZ2VUKHopKSxhLGIsYyl9LApAQCAtNjMzNCwyOSArNjQxMywyOSBAQAogZWxzZSByZXR1cm4gbmV3IFAuSHModGhpcyx6KX0sCiBjbDpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuTzgoYSkKIGlmKGIpcmV0dXJuIG5ldyBQLmR2KHRoaXMseikKLWVsc2UgcmV0dXJuIG5ldyBQLndkKHRoaXMseil9fSwKK2Vsc2UgcmV0dXJuIG5ldyBQLmNaKHRoaXMseil9fSwKIFRGOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLmJIKHRoaXMuYil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBYejp7Ci0iXiI6IlRwOjcxO2MsZCIsCisiXiI6IlRwWjo3MjtjLGQiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYy5Hcih0aGlzLmQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQ2c6ewotIl4iOiJUcDoxMzthLGIiLAorIl4iOiJUcFo6MTM7YSxiIiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLm0xKHRoaXMuYixhKX0sIiQxIixudWxsLDIsMCxudWxsLDMzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEhzOnsKLSJeIjoiVHA6MTM7YyxkIiwKKyJeIjoiVHBaOjEzO2MsZCIsCiAkMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYy5GSSh0aGlzLmQsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwzMywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBkdjp7Ci0iXiI6IlRwOjc5O2EsYiIsCisiXiI6IlRwWjo4MDthLGIiLAogJDI6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS56OCh0aGlzLmIsYSxiKX0sIiQyIixudWxsLDQsMCxudWxsLDksMTAsImNhbGwiXSwKICRpc0VIOnRydWV9LAotd2Q6ewotIl4iOiJUcDo3OTtjLGQiLAorY1o6eworIl4iOiJUcFo6ODA7YyxkIiwKICQyOltmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmMubWcodGhpcy5kLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw5LDEwLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHVvOnsKQEAgLTYzNjcsNyArNjQ0Niw3IEBACiB5PXoudCgwLGIpCiBpZih5IT1udWxsfHx6Lng0KDAsYikpcmV0dXJuIHkKIHJldHVybiB0aGlzLmVULnQoMCxiKX0sCi1oazpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5JZCh0aGlzKS54NSh0aGlzLGEsYil9LAoraGs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuSWQodGhpcykuYzEodGhpcyxhLGIpfSwKIHVJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLklkKHRoaXMpLmxkKHRoaXMsYSxiKX0sCiBxcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51SShhLG51bGwpfSwKIEdyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5JZCh0aGlzKS5Wbih0aGlzLGEpfSwKQEAgLTYzODAsMTEgKzY0NTksMTEgQEAKIHVOOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLklkKHRoaXMpLmRKKHRoaXMsYSxiKX0sCiBDaDpmdW5jdGlvbihhLGIpe25ldyBQLklkKHRoaXMpLlJCKDAsdGhpcyxiKX19LAogRk86ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe1AuSUEobmV3IFAuZU0odGhpcy5hLHRoaXMuYikpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZU06ewotIl4iOiJUcDo3MTtjLGQiLAorIl4iOiJUcFo6NzI7YyxkIiwKICQwOltmdW5jdGlvbigpe3ZhciB6LHkKIHo9dGhpcy5jCiBQLkZMKCJVbmNhdWdodCBFcnJvcjogIitILmQoeikpCkBAIC02Mzk0LDE2ICs2NDczLDE2IEBACiB0aHJvdyBILmIoeil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBVZXo6ewotIl4iOiJUcDo3OTthIiwKLSQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sIiQyIixudWxsLDQsMCxudWxsLDc3LDIxLCJjYWxsIl0sCisiXiI6IlRwWjo4MDthIiwKKyQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sIiQyIixudWxsLDQsMCxudWxsLDc4LDIxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEFIaTp7CiAiXiI6ImE7IiwKIGdFMjpmdW5jdGlvbigpe3JldHVybiBQLndMKCl9LAogaGs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nRTIoKS4kMihhLGIpfSwKLWdjUzpmdW5jdGlvbigpe3JldHVybiBQLmx3KCl9LAotR3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2NTKCkuJDEoYSl9LAotZ090OmZ1bmN0aW9uKCl7cmV0dXJuIFAuVW4oKX0sCitnaFk6ZnVuY3Rpb24oKXtyZXR1cm4gUC5sdygpfSwKK0dyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdoWSgpLiQxKGEpfSwKK2dPdDpmdW5jdGlvbigpe3JldHVybiBQLk1NKCl9LAogRkk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nT3QoKS4kMihhLGIpfSwKIGdqSDpmdW5jdGlvbigpe3JldHVybiBQLml5KCl9LAogbWc6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmdqSCgpLiQzKGEsYixjKX0sCkBAIC02NDE4LDIyICs2NDk3LDIyIEBACiBSSzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdyYigpLiQyKGEsYil9LAogZ1pxOmZ1bmN0aW9uKCl7cmV0dXJuIFAuTG0oKX0sCiB1TjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdacSgpLiQyKGEsYil9LAotZ21wOmZ1bmN0aW9uKGEpe3JldHVybiBQLmFXKCl9LAorZ21wOmZ1bmN0aW9uKGEpe3JldHVybiBQLm9RKCl9LAogQ2g6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nbXAodGhpcykuJDEoYil9LAotZ3hrOmZ1bmN0aW9uKCl7cmV0dXJuIFAuSXMoKX0sCitneGs6ZnVuY3Rpb24oKXtyZXR1cm4gUC5BaygpfSwKIHFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmd4aygpLiQxJHNwZWNpZmljYXRpb24oYSl9fSwKIFI4MTp7CiAiXiI6ImZaaTsiLAogZ2VUOmZ1bmN0aW9uKGEpe3JldHVybn0sCi1ndHA6ZnVuY3Rpb24oKXtyZXR1cm4gQy5kU30sCitndHA6ZnVuY3Rpb24oKXtyZXR1cm4gQy52OH0sCiBnQzU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCiBmQzpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQzUoKT09PXRoaXN9LAogdDpmdW5jdGlvbihhLGIpe3JldHVybn0sCiBoazpmdW5jdGlvbihhLGIpe3JldHVybiBQLkNLKHRoaXMsbnVsbCx0aGlzLGEsYil9LAotdUk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5VQSh0aGlzLG51bGwsdGhpcyxhLGIpfSwKK3VJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuRTEodGhpcyxudWxsLHRoaXMsYSxiKX0sCiBxcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51SShhLG51bGwpfSwKIEdyOmZ1bmN0aW9uKGEpe3JldHVybiBQLlQ4KHRoaXMsbnVsbCx0aGlzLGEpfSwKLUZJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAueXYodGhpcyxudWxsLHRoaXMsYSxiKX0sCitGSTpmdW5jdGlvbihhLGIpe3JldHVybiBQLlY3KHRoaXMsbnVsbCx0aGlzLGEsYil9LAogbWc6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBQLk11KHRoaXMsbnVsbCx0aGlzLGEsYixjKX0sCiBBbDpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCiB3WTpmdW5jdGlvbihhKXtyZXR1cm4gYX0sCkBAIC02NDQ1LDcgKzY1MjQsNyBAQAogIl4iOiIiLAogRUY6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBILkI3KGEsSC5WTShuZXcgUC5ZQigwLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwwKSxbYixjXSkpfSwKIEZsOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFAuWUIoMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMCksW2EsYl0pfSwKLVRROltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGEsYil9LCIkMiIsIldiRSIsNCwwLDQ1LDQ2LDQ3XSwKK091OltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGEsYil9LCIkMiIsIkhyIiw0LDAsNDUsNDYsNDddLAogVDk6W2Z1bmN0aW9uKGEpe3JldHVybiBKLnYxKGEpfSwiJDEiLCJweSIsMiwwLDQ4LDQ2XSwKIFlNOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoKIGlmKGE9PW51bGwpe3o9bmV3IFAuYkEoMCxudWxsLG51bGwsbnVsbCxudWxsKQpAQCAtNjQ1Myw3ICs2NTMyLDcgQEAKIHJldHVybiB6fWI9UC5weSgpCiByZXR1cm4gUC5jNyhhLGIsYyxkLGUpfSwKIFJOOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFAuUEwoMCxudWxsLG51bGwsbnVsbCxudWxsKSxbYSxiXSl9LAotUmQ6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEguVk0obmV3IFAuUnIoMCxudWxsLG51bGwsbnVsbCxudWxsKSxbZF0pfSwKK1JkOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBILlZNKG5ldyBQLmpnKDAsbnVsbCxudWxsLG51bGwsbnVsbCksW2RdKX0sCiBJeDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogaWYoUC5uSChhKSl7aWYoYj09PSIoIiYmYz09PSIpIilyZXR1cm4iKC4uLikiCiByZXR1cm4gYisiLi4uIitjfXo9W10KQEAgLTY1MzQsOCArNjYxMyw4IEBACiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5YNX0sCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWDU9PT0wfSwKIGdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5YNSE9PTB9LAotZ3ZjOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBQLmZHKHRoaXMpLFtILktwKHRoaXMsMCldKX0sCi1nVVE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguSzEoSC5WTShuZXcgUC5mRyh0aGlzKSxbSC5LcCh0aGlzLDApXSksbmV3IFAub2kodGhpcyksSC5LcCh0aGlzLDApLEguS3AodGhpcywxKSl9LAorZ3ZjOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBQLmZHKHRoaXMpLFtILk9xKHRoaXMsMCldKX0sCitnVVE6ZnVuY3Rpb24oYSl7cmV0dXJuIEguSzEoSC5WTShuZXcgUC5mRyh0aGlzKSxbSC5PcSh0aGlzLDApXSksbmV3IFAub2kodGhpcyksSC5PcSh0aGlzLDApLEguT3EodGhpcywxKSl9LAogeDQ6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiBpZih0eXBlb2YgYj09PSJzdHJpbmciJiZiIT09Il9fcHJvdG9fXyIpe3o9dGhpcy52dgogcmV0dXJuIHo9PW51bGw/ITE6eltiXSE9bnVsbH1lbHNlIGlmKHR5cGVvZiBiPT09Im51bWJlciImJihiJjB4M2ZmZmZmZik9PT1iKXt5PXRoaXMuT1gKQEAgLTY2MzYsMTQgKzY3MTUsMTQgQEAKIGRlbGV0ZSB6WyI8bm9uLWlkZW50aWZpZXIta2V5PiJdCiByZXR1cm4gen19fSwKIG9pOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS50KDAsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMjksImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudCgwLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTMwLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIERKOnsKLSJeIjoiVHA7YSIsCisiXiI6IlRwWjthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoib0siLGFyZ3M6W2EsYl19fSx0aGlzLmEsImJBIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJ2UCIsYXJnczpbYSxiXX19LHRoaXMuYSwiYkEiKX19LAogUEw6ewogIl4iOiJiQTtYNSx2dixPWCxPQix3ViIsCiBubTpmdW5jdGlvbihhKXtyZXR1cm4gSC5DVShhKSYweDNmZmZmZmZ9LApAQCAtNjY1NiwxMyArNjczNSwxMyBAQAogIl4iOiJiQTttNixSRyxoZyxYNSx2dixPWCxPQix3ViIsCiBDMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm02LiQyKGEsYil9LAogSDU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUkcuJDEoYSl9LAotRWY6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGcuJDEoYSl9LAotdDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuRWYoYikhPT0hMClyZXR1cm4KK1h5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhnLiQxKGEpfSwKK3Q6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLlh5KGIpIT09ITApcmV0dXJuCiByZXR1cm4gUC5iQS5wcm90b3R5cGUuRGwuY2FsbCh0aGlzLGIpfSwKIHU6ZnVuY3Rpb24oYSxiLGMpe1AuYkEucHJvdG90eXBlLm1zLmNhbGwodGhpcyxiLGMpfSwKLXg0OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5FZihiKSE9PSEwKXJldHVybiExCit4NDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuWHkoYikhPT0hMClyZXR1cm4hMQogcmV0dXJuIFAuYkEucHJvdG90eXBlLlp0LmNhbGwodGhpcyxiKX0sCi1SejpmdW5jdGlvbihhLGIpe2lmKHRoaXMuRWYoYikhPT0hMClyZXR1cm4KK1J6OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5YeShiKSE9PSEwKXJldHVybgogcmV0dXJuIFAuYkEucHJvdG90eXBlLmJCLmNhbGwodGhpcyxiKX0sCiBubTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5INShhKSYweDNmZmZmZmZ9LAogYUg6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CkBAIC02NjcwLDExICs2NzQ5LDExIEBACiB6PWEubGVuZ3RoCiBmb3IoeT0wO3k8ejt5Kz0yKWlmKHRoaXMuQzIoYVt5XSxiKT09PSEwKXJldHVybiB5CiByZXR1cm4tMX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7Yzc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgej1uZXcgUC5qRyhkKQogcmV0dXJuIEguVk0obmV3IFAuRnEoYSxiLHosMCxudWxsLG51bGwsbnVsbCxudWxsKSxbZCxlXSl9fX0sCiBqRzp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej1ILklVKGEsdGhpcy5hKQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCkBAIC02NzEwLDggKzY3ODksOCBAQAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWDV9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlg1PT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWDUhPT0wfSwKLWd2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5pNSh0aGlzKSxbSC5LcCh0aGlzLDApXSl9LAotZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKEguVk0obmV3IFAuaTUodGhpcyksW0guS3AodGhpcywwKV0pLG5ldyBQLmExKHRoaXMpLEguS3AodGhpcywwKSxILktwKHRoaXMsMSkpfSwKK2d2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5pNSh0aGlzKSxbSC5PcSh0aGlzLDApXSl9LAorZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKEguVk0obmV3IFAuaTUodGhpcyksW0guT3EodGhpcywwKV0pLG5ldyBQLmExKHRoaXMpLEguT3EodGhpcywwKSxILk9xKHRoaXMsMSkpfSwKIHg0OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYodHlwZW9mIGI9PT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt6PXRoaXMudnYKIGlmKHo9PW51bGwpcmV0dXJuITEKQEAgLTY4MTUsNyArNjg5NCw3IEBACiB6PWEubGVuZ3RoCiBmb3IoeT0wO3k8ejsrK3kpaWYoSi54QyhKLnVwKGFbeV0pLGIpKXJldHVybiB5CiByZXR1cm4tMX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0ZvOnRydWUsCiAkaXNaMDp0cnVlLAogJGFzWjA6bnVsbCwKQEAgLTY4MjQsMTQgKzY5MDMsMTQgQEAKIGRlbGV0ZSB6WyI8bm9uLWlkZW50aWZpZXIta2V5PiJdCiByZXR1cm4gen19fSwKIGExOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS50KDAsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMjksImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudCgwLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTMwLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHBrOnsKLSJeIjoiVHA7YSIsCi0kMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3NywyMSwiY2FsbCJdLAorIl4iOiJUcFo7YSIsCiskMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3OCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJsYiIsYXJnczpbYSxiXX19LHRoaXMuYSwiWUIiKX19LAorJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEsYil7cmV0dXJue2Z1bmM6Im9LIixhcmdzOlthLGJdfX0sdGhpcy5hLCJZQiIpfX0sCiBkYjp7CiAiXiI6ImE7a2g+LGNBQCxER0AselFAIn0sCiBpNTp7CkBAIC02ODYzLDkgKzY5NDIsOSBAQAogcmV0dXJuITF9ZWxzZXt0aGlzLmZEPXouZ2toKHopCiB0aGlzLnpxPXRoaXMuenEuZ0RHKCkKIHJldHVybiEwfX19fSwKLVJyOnsKK2pnOnsKICJeIjoidTNUO1g1LHZ2LE9YLE9CLERNIiwKLVlzOmZ1bmN0aW9uKCl7dmFyIHo9bmV3IFAuUnIoMCxudWxsLG51bGwsbnVsbCxudWxsKQorWXM6ZnVuY3Rpb24oKXt2YXIgej1uZXcgUC5qZygwLG51bGwsbnVsbCxudWxsLG51bGwpCiB6LiRidWlsdGluVHlwZUluZm89dGhpcy4kYnVpbHRpblR5cGVJbmZvCiByZXR1cm4gen0sCiBnQTpmdW5jdGlvbihhKXt2YXIgej1uZXcgUC5jTih0aGlzLHRoaXMuWmwoKSwwLG51bGwpCkBAIC03MTQwLDkgKzcyMTksOSBAQAogcmV0dXJuIHp9fSwKIG1XOnsKICJeIjoiYTsiLAotZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguSzEodGhpcyxiLEguaXAodGhpcywibVciLDApLG51bGwpfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJVeSIscmV0OlAuUVYsYXJnczpbe2Z1bmM6Iks2IixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIm1XIil9LDMxXSwKK2V6OltmdW5jdGlvbihhLGIpe3JldHVybiBILksxKHRoaXMsYixILmlwKHRoaXMsIm1XIiwwKSxudWxsKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiVXkiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJ1YmoiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibVciKX0sMzFdLAogYWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5VNSh0aGlzLGIpLFtILmlwKHRoaXMsIm1XIiwwKV0pfSwKLWxNOltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILm9BKHRoaXMsYiksW0guaXAodGhpcywibVciLDApLG51bGxdKX0sIiQxIiwiZ2l0IiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUlMiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJ0ciIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJtVyIpfSwzMV0sCitsTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQSh0aGlzLGIpLFtILmlwKHRoaXMsIm1XIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlJTIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiRTciLHJldDpQLlFWLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibVciKX0sMzFdLAogdGc6ZnVuY3Rpb24oYSxiKXt2YXIgegogZm9yKHo9dGhpcy5nQSh0aGlzKTt6LkcoKTspaWYoSi54Qyh6LmdsKCksYikpcmV0dXJuITAKIHJldHVybiExfSwKQEAgLTcxODQsMTIgKzcyNjMsMTIgQEAKIHc9Si54KHkpCiBpZih3Lm4oeSwwKSlyZXR1cm4geAogeT13LlcoeSwxKX10aHJvdyBILmIoUC5OKGIpKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC5JeCh0aGlzLCIoIiwiKSIpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC5JeCh0aGlzLCIoIiwiKSIpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNRVjp0cnVlLAogJGFzUVY6bnVsbH0sCiBhcms6ewotIl4iOiJFOWg7In0sCi1FOWg6eworIl4iOiJJcjsifSwKK0lyOnsKICJeIjoiYStsRDsiLAogJGlzV086dHJ1ZSwKICRhc1dPOm51bGwsCkBAIC03MjIyLDggKzczMDEsOCBAQAogei5XZShhLGIpCiByZXR1cm4gei52TX0sCiBhZDpmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILlU1KGEsYiksW0guaXAoYSwibEQiLDApXSl9LAotZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguQTgoYSxiKSxbbnVsbCxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImZRTyIscmV0OlAuUVYsYXJnczpbe2Z1bmM6InViaiIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsRCIpfSwzMV0sCi1sTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQShhLGIpLFtILmlwKGEsImxEIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IkdiYSIscmV0OlAuUVYsYXJnczpbe2Z1bmM6IlZMIixyZXQ6UC5RVixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsImxEIil9LDMxXSwKK2V6OltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILkE4KGEsYiksW251bGwsbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJNUSIscmV0OlAuUVYsYXJnczpbe2Z1bmM6Ik9BMiIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsRCIpfSwzMV0sCitsTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQShhLGIpLFtILmlwKGEsImxEIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IkdiYSIscmV0OlAuUVYsYXJnczpbe2Z1bmM6InRyIixyZXQ6UC5RVixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsImxEIil9LDMxXSwKIGVSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguYzEoYSxiLG51bGwsbnVsbCl9LAogdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIGlmKGIpe3o9SC5WTShbXSxbSC5pcChhLCJsRCIsMCldKQpAQCAtNzI0MSw3ICs3MzIwLDcgQEAKIHRoaXMuc0IoYSx6KzEpCiB0aGlzLnUoYSx6LGIpfSwKIEZWOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5LcChiLDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PUguVk0obmV3IEguYTcoYixiLmxlbmd0aCwwLG51bGwpLFtILk9xKGIsMCldKTt6LkcoKTspe3k9ei5sbwogeD10aGlzLmdCKGEpCiB0aGlzLnNCKGEseCsxKQogdGhpcy51KGEseCx5KX19LApAQCAtNzI1OCw2ICs3MzM3LDE0IEBACiBpZih6LkMoYiwwKXx8ei5EKGIsdGhpcy5nQihhKSkpdGhyb3cgSC5iKFAuVEUoYiwwLHRoaXMuZ0IoYSkpKQogej1KLld4KGMpCiBpZih6LkMoYyxiKXx8ei5EKGMsdGhpcy5nQihhKSkpdGhyb3cgSC5iKFAuVEUoYyxiLHRoaXMuZ0IoYSkpKX0sCithTTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcKK3RoaXMucFooYSxiLGMpCit6PWMtYgoreT1ILlZNKFtdLFtILmlwKGEsImxEIiwwKV0pCitDLk5tLnNCKHkseikKK2Zvcih4PTA7eDx6OysreCl7dz10aGlzLnQoYSxiK3gpCitpZih4Pj15Lmxlbmd0aClyZXR1cm4gSC5lKHkseCkKK3lbeF09d31yZXR1cm4geX0sCiBNdTpmdW5jdGlvbihhLGIsYyl7dGhpcy5wWihhLGIsYykKIHJldHVybiBILmMxKGEsYixjLG51bGwpfSwKIFVaOmZ1bmN0aW9uKGEsYixjKXt2YXIgegpAQCAtNzMwNywyMSArNzM5NCwyMSBAQAogaWYoISF6LiRpc1dPKXRoaXMuekIoYSxiLGIrei5nQihjKSxjKQogZWxzZSBmb3Ioej16LmdBKGMpO3ouRygpO2I9eSl7eT1iKzEKIHRoaXMudShhLGIsei5nbCgpKX19LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzV086dHJ1ZSwKICRhc1dPOm51bGwsCiAkaXN5Tjp0cnVlLAogJGlzUVY6dHJ1ZSwKICRhc1FWOm51bGx9LAogVzA6ewotIl4iOiJUcDo3OTthLGIiLAorIl4iOiJUcFo6ODA7YSxiIiwKICQyOltmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYQogaWYoIXouYSl0aGlzLmIuS0YoIiwgIikKIHouYT0hMQogej10aGlzLmIKIHouS0YoYSkKIHouS0YoIjogIikKLXouS0YoYil9LCIkMiIsbnVsbCw0LDAsbnVsbCwxMzAsNjQsImNhbGwiXSwKK3ouS0YoYil9LCIkMiIsbnVsbCw0LDAsbnVsbCwxMzEsNjQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogU3c6ewogIl4iOiJtVzt2NSxhdixlWixxVCIsCkBAIC03MzQ2LDEwICs3NDMzLDEwIEBACiBpZih5PDB8fHk+PXgpcmV0dXJuIEguZSh6LHkpCiByZXR1cm4gelt5XX0sCiB0dDpmdW5jdGlvbihhLGIpe3ZhciB6LHkKLWlmKGIpe3o9SC5WTShbXSxbSC5LcCh0aGlzLDApXSkKK2lmKGIpe3o9SC5WTShbXSxbSC5PcSh0aGlzLDApXSkKIEMuTm0uc0Ioeix0aGlzLmdCKHRoaXMpKX1lbHNle3k9QXJyYXkodGhpcy5nQih0aGlzKSkKIHkuZml4ZWQkbGVuZ3RoPWluaXQKLXo9SC5WTSh5LFtILktwKHRoaXMsMCldKX10aGlzLkdQKHopCit6PUguVk0oeSxbSC5PcSh0aGlzLDApXSl9dGhpcy5JeCh6KQogcmV0dXJuIHp9LAogYnI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHQoYSwhMCl9LAogaDpmdW5jdGlvbihhLGIpe3RoaXMuTlooMCxiKX0sCkBAIC03MzU5LDEyICs3NDQ2LDEyIEBACiB4PXkregogdz10aGlzLnY1CiB2PXcubGVuZ3RoCi1pZih4Pj12KXt1PVAueHEoeCkKK2lmKHg+PXYpe3U9UC51YXkoeCkKIGlmKHR5cGVvZiB1IT09Im51bWJlciIpcmV0dXJuIEgucyh1KQogdz1BcnJheSh1KQogdy5maXhlZCRsZW5ndGg9aW5pdAotdD1ILlZNKHcsW0guS3AodGhpcywwKV0pCi10aGlzLmVaPXRoaXMuR1AodCkKK3Q9SC5WTSh3LFtILk9xKHRoaXMsMCldKQordGhpcy5lWj10aGlzLkl4KHQpCiB0aGlzLnY1PXQKIHRoaXMuYXY9MAogSC5xRyh0LHkseCxiLDApCkBAIC03Mzk4LDcgKzc0ODUsNyBAQAogaWYoeiE9PXkpe2Zvcih4PXRoaXMudjUsdz14Lmxlbmd0aCx2PXctMTt6IT09eTt6PSh6KzEmdik+Pj4wKXtpZih6PDB8fHo+PXcpcmV0dXJuIEguZSh4LHopCiB4W3pdPW51bGx9dGhpcy5lWj0wCiB0aGlzLmF2PTA7Kyt0aGlzLnFUfX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBBUjpmdW5jdGlvbigpe3ZhciB6LHkseCx3CiB6PXRoaXMuYXYKIGlmKHo9PT10aGlzLmVaKXRocm93IEguYihILkRVKCkpOysrdGhpcy5xVApAQCAtNzQ0Myw3ICs3NTMwLDcgQEAKIE05OmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKIHo9QXJyYXkodGhpcy52NS5sZW5ndGgqMikKIHouZml4ZWQkbGVuZ3RoPWluaXQKLXk9SC5WTSh6LFtILktwKHRoaXMsMCldKQoreT1ILlZNKHosW0guT3EodGhpcywwKV0pCiB6PXRoaXMudjUKIHg9dGhpcy5hdgogdz16Lmxlbmd0aC14CkBAIC03NDU0LDcgKzc1NDEsNyBAQAogdGhpcy5hdj0wCiB0aGlzLmVaPXRoaXMudjUubGVuZ3RoCiB0aGlzLnY1PXl9LAotR1A6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgorSXg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej10aGlzLmF2CiB5PXRoaXMuZVoKIHg9dGhpcy52NQpAQCAtNzQ3Miw3ICs3NTU5LDcgQEAKICRpc3lOOnRydWUsCiAkaXNRVjp0cnVlLAogJGFzUVY6bnVsbCwKLXN0YXRpYzp7Il4iOiJUTmUiLHhxOmZ1bmN0aW9uKGEpe3ZhciB6CitzdGF0aWM6eyJeIjoiVE5lIix1YXk6ZnVuY3Rpb24oYSl7dmFyIHoKIGlmKHR5cGVvZiBhIT09Im51bWJlciIpcmV0dXJuIGEuTygpCiBhPShhPDwyPj4+MCktMQogZm9yKDshMDthPXope3o9KGEmYS0xKT4+PjAKQEAgLTc0OTksMjYgKzc1ODYsMjYgQEAKIEZWOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGZvcih6PUoubVkoYik7ei5HKCk7KXRoaXMuaCgwLHouZ2woKSl9LAogRXg6ZnVuY3Rpb24oYSl7dmFyIHoKLWZvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILktwKGEsMCldKTt6LkcoKTspdGhpcy5SeigwLHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILk9xKGEsMCldKTt6LkcoKTspdGhpcy5SeigwLHoubG8pfSwKIE5rOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiB6PVtdCiBmb3IoeT10aGlzLmdBKHRoaXMpO3kuRygpOyl7eD15LmdsKCkKIGlmKGIuJDEoeCk9PT0hMCl6LnB1c2goeCl9dGhpcy5FeCh6KX0sCiB0dDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKLWlmKGIpe3o9SC5WTShbXSxbSC5LcCh0aGlzLDApXSkKK2lmKGIpe3o9SC5WTShbXSxbSC5PcSh0aGlzLDApXSkKIEMuTm0uc0Ioeix0aGlzLmdCKHRoaXMpKX1lbHNle3k9QXJyYXkodGhpcy5nQih0aGlzKSkKIHkuZml4ZWQkbGVuZ3RoPWluaXQKLXo9SC5WTSh5LFtILktwKHRoaXMsMCldKX1mb3IoeT10aGlzLmdBKHRoaXMpLHg9MDt5LkcoKTt4PXYpe3c9eS5nbCgpCit6PUguVk0oeSxbSC5PcSh0aGlzLDApXSl9Zm9yKHk9dGhpcy5nQSh0aGlzKSx4PTA7eS5HKCk7eD12KXt3PXkuZ2woKQogdj14KzEKIGlmKHg+PXoubGVuZ3RoKXJldHVybiBILmUoeix4KQogelt4XT13fXJldHVybiB6fSwKIGJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKLWV6OltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILnh5KHRoaXMsYiksW0guS3AodGhpcywwKSxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6InhQbyIscmV0OlAuUVYsYXJnczpbe2Z1bmM6Ik9BMiIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsZnUiKX0sMzFdLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sCitlejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC54eSh0aGlzLGIpLFtILk9xKHRoaXMsMCksbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJmUU8iLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJKbVIiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibGZ1Iil9LDMxXSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC5XRSh0aGlzLCJ7IiwifSIpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBhZDpmdW5jdGlvbihhLGIpe3ZhciB6PW5ldyBILlU1KHRoaXMsYikKIHouJGJ1aWx0aW5UeXBlSW5mbz10aGlzLiRidWlsdGluVHlwZUluZm8KIHJldHVybiB6fSwKLWxNOltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILm9BKHRoaXMsYiksW0guS3AodGhpcywwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlBBSiIscmV0OlAuUVYsYXJnczpbe2Z1bmM6IkQ2IixyZXQ6UC5RVixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsImxmdSIpfSwzMV0sCitsTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQSh0aGlzLGIpLFtILk9xKHRoaXMsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJQQUoiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJWTCIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsZnUiKX0sMzFdLAogYU46ZnVuY3Rpb24oYSxiKXt2YXIgegogZm9yKHo9dGhpcy5nQSh0aGlzKTt6LkcoKTspYi4kMSh6LmdsKCkpfSwKIHpWOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CkBAIC03NjE0LDE0ICs3NzAxLDE0IEBACiBCYTp7CiAiXiI6InZYMTtxVyxoZyxhWSxpVyxKMCxxVCxiYiIsCiB3UzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnFXLiQyKGEsYil9LAotRWY6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGcuJDEoYSl9LAorWHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuaGcuJDEoYSl9LAogeVY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy53UyhhLGIpfSwKIHQ6ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXRocm93IEguYihQLnUoYikpCi1pZih0aGlzLkVmKGIpIT09ITApcmV0dXJuCitpZih0aGlzLlh5KGIpIT09ITApcmV0dXJuCiBpZih0aGlzLmFZIT1udWxsKWlmKEoueEModGhpcy52aChiKSwwKSlyZXR1cm4gdGhpcy5hWS5QCiByZXR1cm59LAogUno6ZnVuY3Rpb24oYSxiKXt2YXIgegotaWYodGhpcy5FZihiKSE9PSEwKXJldHVybgoraWYodGhpcy5YeShiKSE9PSEwKXJldHVybgogej10aGlzLmJCKGIpCiBpZih6IT1udWxsKXJldHVybiB6LlAKIHJldHVybn0sCkBAIC03NjM0LDcgKzc3MjEsNyBAQAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFZPT1udWxsfSwKIGdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hWSE9bnVsbH0sCiBhTjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAotej1ILktwKHRoaXMsMCkKK3o9SC5PcSh0aGlzLDApCiB5PUguVk0obmV3IFAuSFcodGhpcyxILlZNKFtdLFtQLm96XSksdGhpcy5xVCx0aGlzLmJiLG51bGwpLFt6XSkKIHkuUWYodGhpcyxbUC5veix6XSkKIGZvcig7eS5HKCk7KXt4PXkuZ2woKQpAQCAtNzY0MywxMSArNzczMCwxMiBAQAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSjB9LAogVjE6ZnVuY3Rpb24oYSl7dGhpcy5hWT1udWxsCiB0aGlzLkowPTA7Kyt0aGlzLnFUfSwKLWd2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5uRih0aGlzKSxbSC5LcCh0aGlzLDApXSl9LAoreDQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5YeShiKT09PSEwJiZKLnhDKHRoaXMudmgoYiksMCl9LAorZ3ZjOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBQLm5GKHRoaXMpLFtILk9xKHRoaXMsMCldKX0sCiBnVVE6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAucm8odGhpcykKIHouJGJ1aWx0aW5UeXBlSW5mbz10aGlzLiRidWlsdGluVHlwZUluZm8KIHJldHVybiB6fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzQmE6dHJ1ZSwKICRhc3ZYMTpmdW5jdGlvbihhLGIpe3JldHVyblthXX0sCiAkYXNaMDpudWxsLApAQCAtNzY1NywxNSArNzc0NSwxNSBAQAogeT1uZXcgUC5BbihjKQogcmV0dXJuIEguVk0obmV3IFAuQmEoeix5LG51bGwsSC5WTShuZXcgUC5veihudWxsLG51bGwsbnVsbCksW2NdKSwwLDAsMCksW2MsZF0pfX19LAogQW46ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9SC5JVShhLHRoaXMuYSkKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogUUc6ewotIl4iOiJUcDthIiwKKyJeIjoiVHBaO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEsYil9LAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJ2UHQiLGFyZ3M6W2EsYl19fSx0aGlzLmEsIkJhIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJCaSIsYXJnczpbYSxiXX19LHRoaXMuYSwiQmEiKX19LAogUzZCOnsKICJeIjoiYTsiLAogZ2w6ZnVuY3Rpb24oKXt2YXIgej10aGlzLnlhCkBAIC03Njk3LDcgKzc3ODUsNyBAQAogej10aGlzLmxUCiB5PW5ldyBQLkROKHosSC5WTShbXSxbUC5vel0pLHoucVQsei5iYixudWxsKQogeS4kYnVpbHRpblR5cGVJbmZvPXRoaXMuJGJ1aWx0aW5UeXBlSW5mbwoteS5RZih6LEguS3AodGhpcywwKSkKK3kuUWYoeixILk9xKHRoaXMsMCkpCiByZXR1cm4geX0sCiAkaXN5Tjp0cnVlfSwKIHJvOnsKQEAgLTc3MDgsNyArNzc5Niw3IEBACiB6PXRoaXMuRmIKIHk9bmV3IFAuWk0oeixILlZNKFtdLFtQLm96XSksei5xVCx6LmJiLG51bGwpCiB5LiRidWlsdGluVHlwZUluZm89dGhpcy4kYnVpbHRpblR5cGVJbmZvCi15LlFmKHosSC5LcCh0aGlzLDEpKQoreS5RZih6LEguT3EodGhpcywxKSkKIHJldHVybiB5fSwKICRhc21XOmZ1bmN0aW9uKGEsYil7cmV0dXJuW2JdfSwKICRhc1FWOmZ1bmN0aW9uKGEsYil7cmV0dXJuW2JdfSwKQEAgLTc3MzYsMTEgKzc4MjQsMTEgQEAKIHRocm93IEguYihQLmNEKFN0cmluZyh5KSkpfXJldHVybiBQLlZRKHosYil9LAogdHA6W2Z1bmN0aW9uKGEpe3JldHVybiBhLkx0KCl9LCIkMSIsIkpuIiwyLDAsNDksNTBdLAogSkM6ewotIl4iOiJUcDo3OTsiLAorIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGJ9LAogJGlzRUg6dHJ1ZX0sCiBmMTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdAogaWYoYT09bnVsbHx8dHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCiBpZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSk9PT1BcnJheS5wcm90b3R5cGUpe3o9YQpAQCAtNzc2MCwyMyArNzg0OCwyMyBAQAogIl4iOiJVa3I7IiwKICRhc1VrcjpmdW5jdGlvbigpe3JldHVybltQLnFVLFtQLldPLFAuS05dXX19LAogQUo6ewotIl4iOiJYUztDdCxGTiIsCi1idTpmdW5jdGlvbihhKXtpZih0aGlzLkZOIT1udWxsKXJldHVybiJDb252ZXJ0aW5nIG9iamVjdCB0byBhbiBlbmNvZGFibGUgb2JqZWN0IGZhaWxlZC4iCi1lbHNlIHJldHVybiJDb252ZXJ0aW5nIG9iamVjdCBkaWQgbm90IHJldHVybiBhbiBlbmNvZGFibGUgb2JqZWN0LiJ9LAorIl4iOiJYUztQYyxGTiIsCitidTpbZnVuY3Rpb24oYSl7aWYodGhpcy5GTiE9bnVsbClyZXR1cm4iQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxlIG9iamVjdCBmYWlsZWQuIgorZWxzZSByZXR1cm4iQ29udmVydGluZyBvYmplY3QgZGlkIG5vdCByZXR1cm4gYW4gZW5jb2RhYmxlIG9iamVjdC4ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e0d5OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLkFKKGEsYil9fX0sCiBLODp7Ci0iXiI6IkFKO0N0LEZOIiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJDeWNsaWMgZXJyb3IgaW4gSlNPTiBzdHJpbmdpZnkifSwKLXN0YXRpYzp7WWY6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLks4KGEsbnVsbCl9fX0sCi1wRTp7CisiXiI6IkFKO1BjLEZOIiwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iQ3ljbGljIGVycm9yIGluIEpTT04gc3RyaW5naWZ5In0sIiQwIiwiZ0FZIiwwLDAsNjldLAorc3RhdGljOntrbzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuSzgoYSxudWxsKX19fSwKK2J5Zzp7CiAiXiI6IlVrcjtxYTwsTjkiLAotcFc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5qYyhhLHRoaXMuZ0hlKCkucWEpfSwKK3BXOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuamMoYSx0aGlzLmdQMSgpLnFhKX0sCiBrVjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wVyhhLG51bGwpfSwKIFEwOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5nWkUoKQogcmV0dXJuIFAuVmcoYSx6LlNJLHouVU0pfSwKIEtQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlEwKGEsbnVsbCl9LAogZ1pFOmZ1bmN0aW9uKCl7cmV0dXJuIEMuY2J9LAotZ0hlOmZ1bmN0aW9uKCl7cmV0dXJuIEMuQTN9LAorZ1AxOmZ1bmN0aW9uKCl7cmV0dXJuIEMuQTN9LAogJGFzVWtyOmZ1bmN0aW9uKCl7cmV0dXJuW1AuYSxQLnFVXX19LAogb2pGOnsKICJeIjoid0llO1VNLFNJIiwKQEAgLTc3OTgsNDYgKzc4ODYsNDYgQEAKIGlmKHU+OTIpY29udGludWUKIGlmKHU8MzIpe2lmKHY+dyl7dD16Lk5qKGEsdyx2KQogeC52TSs9dH13PXYrMQotdD1ILkpNKDkyKQordD1ILm14KDkyKQogeC52TSs9dAotc3dpdGNoKHUpe2Nhc2UgODp0PUguSk0oOTgpCitzd2l0Y2godSl7Y2FzZSA4OnQ9SC5teCg5OCkKIHgudk0rPXQKIGJyZWFrCi1jYXNlIDk6dD1ILkpNKDExNikKK2Nhc2UgOTp0PUgubXgoMTE2KQogeC52TSs9dAogYnJlYWsKLWNhc2UgMTA6dD1ILkpNKDExMCkKK2Nhc2UgMTA6dD1ILm14KDExMCkKIHgudk0rPXQKIGJyZWFrCi1jYXNlIDEyOnQ9SC5KTSgxMDIpCitjYXNlIDEyOnQ9SC5teCgxMDIpCiB4LnZNKz10CiBicmVhawotY2FzZSAxMzp0PUguSk0oMTE0KQorY2FzZSAxMzp0PUgubXgoMTE0KQogeC52TSs9dAogYnJlYWsKLWRlZmF1bHQ6dD1ILkpNKDExNykKK2RlZmF1bHQ6dD1ILm14KDExNykKIHgudk0rPXQKLXQ9SC5KTSg0OCkKK3Q9SC5teCg0OCkKIHgudk0rPXQKLXQ9SC5KTSg0OCkKK3Q9SC5teCg0OCkKIHgudk0rPXQKIHQ9dT4+PjQmMTUKLXQ9SC5KTSh0PDEwPzQ4K3Q6ODcrdCkKK3Q9SC5teCh0PDEwPzQ4K3Q6ODcrdCkKIHgudk0rPXQKIHQ9dSYxNQotdD1ILkpNKHQ8MTA/NDgrdDo4Nyt0KQordD1ILm14KHQ8MTA/NDgrdDo4Nyt0KQogeC52TSs9dAogYnJlYWt9fWVsc2UgaWYodT09PTM0fHx1PT09OTIpe2lmKHY+dyl7dD16Lk5qKGEsdyx2KQogeC52TSs9dH13PXYrMQotdD1ILkpNKDkyKQordD1ILm14KDkyKQogeC52TSs9dAotdD1ILkpNKHUpCit0PUgubXgodSkKIHgudk0rPXR9fWlmKHc9PT0wKXgudk0rPXR5cGVvZiBhPT09InN0cmluZyI/YTpILmQoYSkKIGVsc2UgaWYodzx5KXt6PXouTmooYSx3LHkpCiB4LnZNKz16fX0sCiBXRDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogZm9yKHo9dGhpcy5vbCx5PXoubGVuZ3RoLHg9MDt4PHk7Kyt4KXt3PXpbeF0KLWlmKGE9PW51bGw/dz09bnVsbDphPT09dyl0aHJvdyBILmIoUC5ZZihhKSl9ei5wdXNoKGEpfSwKK2lmKGE9PW51bGw/dz09bnVsbDphPT09dyl0aHJvdyBILmIoUC5rbyhhKSl9ei5wdXNoKGEpfSwKIEM3OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiBpZighdGhpcy5KYyhhKSl7dGhpcy5XRChhKQogdHJ5e3o9dGhpcy5pWShhKQpAQCAtNzg3OCwxMyArNzk2NiwxMyBAQAogcGc6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5vbAogaWYoMD49ei5sZW5ndGgpcmV0dXJuIEguZSh6LDApCiB6LnBvcCgpfSwKLXN0YXRpYzp7Il4iOiJHc20saHlZLFRhNixKeWYsTm9WLEhWZSx0RixCTG0sdmssSG8sbXJ0LE5YdSxDRSxRVnYiLHhsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAuU2goYixhLFtdKX0sVmc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6CitzdGF0aWM6eyJeIjoiR3NtLGh5WSxUYTYsSnlmLE5vVixIVmUsQVRmLEJMbSxLUXosSG8sbXJ0LE5YdSxDRSxRVnYiLHhsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAuU2goYixhLFtdKX0sVmc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6CiBiPVAuSm4oKQogej1QLnA5KCIiKQogUC54bCh6LGIsYykuQzcoYSkKIHJldHVybiB6LnZNfX19LAogdTVGOnsKLSJeIjoiWml2O0l5IiwKKyJeIjoiWml2O0lFIiwKIGdvYzpmdW5jdGlvbihhKXtyZXR1cm4idXRmLTgifSwKIGdaRTpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5vbSgpfX0sCiBvbTp7CkBAIC03ODk2LDExICs3OTg0LDExIEBACiB5PUFycmF5KHkpCiB5LmZpeGVkJGxlbmd0aD1pbml0CiB5PUguVk0oeSxbUC5LTl0pCi14PW5ldyBQLmVuKDAsMCx5KQotaWYoeC5ydyhhLDAsei5nQihhKSkhPT16LmdCKGEpKXguSTcoei5qKGEsSi5iSSh6LmdCKGEpLDEpKSwwKQoreD1uZXcgUC5SdygwLDAseSkKK2lmKHgucncoYSwwLHouZ0IoYSkpIT09ei5nQihhKSl4Lkk3KHouaihhLEouSG4oei5nQihhKSwxKSksMCkKIHJldHVybiBDLk5tLmFNKHksMCx4Lkw4KX0sCiAkYXN3SWU6ZnVuY3Rpb24oKXtyZXR1cm5bUC5xVSxbUC5XTyxQLktOXV19fSwKLWVuOnsKK1J3OnsKICJeIjoiYTtTbyxMOCxJVCIsCiBJNzpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5JVApAQCAtNzkzNiw3ICs4MDI0LDcgQEAKIHpbeV09MTI4fGEmNjMKIHJldHVybiExfX0sCiBydzpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1LHQscwotaWYoYiE9PWMmJihKLlBwKGEsSi5iSShjLDEpKSY2NDUxMik9PT01NTI5NiljPUouYkkoYywxKQoraWYoYiE9PWMmJihKLlBwKGEsSi5IbihjLDEpKSY2NDUxMik9PT01NTI5NiljPUouSG4oYywxKQogaWYodHlwZW9mIGMhPT0ibnVtYmVyIilyZXR1cm4gSC5zKGMpCiB6PXRoaXMuSVQKIHk9ei5sZW5ndGgKQEAgLTc5NjgsNyArODA1Niw5MCBAQAogdGhpcy5MOD11KzEKIGlmKHU+PXkpcmV0dXJuIEguZSh6LHUpCiB6W3VdPTEyOHx2JjYzfX1yZXR1cm4gd30sCi1zdGF0aWM6eyJeIjoiSmY0In19fV0sWyJkYXJ0LmNvcmUiLCJkYXJ0OmNvcmUiLCxQLHsKK3N0YXRpYzp7Il4iOiJKZjQifX0sCitHWTp7CisiXiI6IndJZTtJRSIsCitXSjpmdW5jdGlvbihhKXt2YXIgeix5Cit6PVAucDkoIiIpCit5PW5ldyBQLnR6KHRoaXMuSUUseiwhMCwwLDAsMCkKK3kuTUUoYSwwLEoucTgoYSkpCit5LmZaKCkKK3JldHVybiB6LnZNfSwKKyRhc3dJZTpmdW5jdGlvbigpe3JldHVybltbUC5XTyxQLktOXSxQLnFVXX19LAordHo6eworIl4iOiJhO0lFLFpCLEFYLEZVLGtOLE5ZIiwKK3hPOmZ1bmN0aW9uKGEpe3RoaXMuZlooKX0sCitmWjpmdW5jdGlvbigpe2lmKHRoaXMua04+MCl7aWYodGhpcy5JRSE9PSEwKXRocm93IEguYihQLmNEKCJVbmZpbmlzaGVkIFVURi04IG9jdGV0IHNlcXVlbmNlIikpCit0aGlzLlpCLktGKEgubXgoNjU1MzMpKQordGhpcy5GVT0wCit0aGlzLmtOPTAKK3RoaXMuTlk9MH19LAorTUU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0KK3o9e30KK3k9dGhpcy5GVQoreD10aGlzLmtOCit3PXRoaXMuTlkKK3ouYT0wCit0aGlzLkZVPTAKK3RoaXMua049MAordGhpcy5OWT0wCit2PW5ldyBQLnpDKHosdGhpcyxhKQorJGxvb3AkMDpmb3IodT10aGlzLlpCLHQ9dGhpcy5JRSE9PSEwLHM9Si5VNihhKSxyPWI7ITA7cj1vKXskbXVsdGlieXRlJDI6e2lmKHg+MCl7ZG97aWYocj09PWMpYnJlYWsgJGxvb3AkMAorcT1zLnQoYSxyKQorcD1KLld4KHEpCitpZihwLmkocSwxOTIpIT09MTI4KXtpZih0KXRocm93IEguYihQLmNEKCJCYWQgVVRGLTggZW5jb2RpbmcgMHgiK3AuV1oocSwxNikpKQordGhpcy5BWD0hMQorcD1ILm14KDY1NTMzKQordS52TSs9cAoreD0wCiticmVhayAkbXVsdGlieXRlJDJ9ZWxzZXt5PSh5PDw2fHAuaShxLDYzKSk+Pj4wOy0teDsrK3J9fXdoaWxlKHg+MCkKK3A9dy0xCitpZihwPDB8fHA+PTQpcmV0dXJuIEguZShDLkdiLHApCitpZih5PD1DLkdiW3BdKXtpZih0KXRocm93IEguYihQLmNEKCJPdmVybG9uZyBlbmNvZGluZyBvZiAweCIrQy5qbi5XWih5LDE2KSkpCit5PTY1NTMzCit4PTAKK3c9MH1pZih5PjExMTQxMTEpe2lmKHQpdGhyb3cgSC5iKFAuY0QoIkNoYXJhY3RlciBvdXRzaWRlIHZhbGlkIFVuaWNvZGUgcmFuZ2U6IDB4IitDLmpuLldaKHksMTYpKSkKK3k9NjU1MzN9aWYoIXRoaXMuQVh8fHkhPT02NTI3OSl7cD1ILm14KHkpCit1LnZNKz1wfXRoaXMuQVg9ITF9fWZvcig7cjxjO3I9byl7bz1yKzEKK3E9cy50KGEscikKK3A9Si5XeChxKQoraWYocC5DKHEsMCkpe249ei5hCitpZihuPjApe209by0xCit2LiQyKG0tbixtKX1pZih0KXRocm93IEguYihQLmNEKCJOZWdhdGl2ZSBVVEYtOCBjb2RlIHVuaXQ6IC0weCIrQy5DRC5XWihwLkoocSksMTYpKSkKK3A9SC5teCg2NTUzMykKK3Uudk0rPXB9ZWxzZSBpZihwLkUocSwxMjcpKXt0aGlzLkFYPSExOysrei5hfWVsc2V7bj16LmEKK2lmKG4+MCl7bT1vLTEKK3YuJDIobS1uLG0pfWlmKHAuaShxLDIyNCk9PT0xOTIpe3k9cC5pKHEsMzEpCit4PTEKK3c9MQorY29udGludWUgJGxvb3AkMH1pZihwLmkocSwyNDApPT09MjI0KXt5PXAuaShxLDE1KQoreD0yCit3PTIKK2NvbnRpbnVlICRsb29wJDB9aWYocC5pKHEsMjQ4KT09PTI0MCYmcC5DKHEsMjQ1KSl7eT1wLmkocSw3KQoreD0zCit3PTMKK2NvbnRpbnVlICRsb29wJDB9aWYodCl0aHJvdyBILmIoUC5jRCgiQmFkIFVURi04IGVuY29kaW5nIDB4IitwLldaKHEsMTYpKSkKK3RoaXMuQVg9ITEKK3A9SC5teCg2NTUzMykKK3Uudk0rPXAKK3k9NjU1MzMKK3g9MAordz0wfX1icmVhayAkbG9vcCQwfXo9ei5hCitpZih6PjApdi4kMihyLXosYykKK2lmKHg+MCl7dGhpcy5GVT15Cit0aGlzLmtOPXgKK3RoaXMuTlk9d319LAorc3RhdGljOnsiXiI6IkFEaSJ9fSwKK3pDOnsKKyJeIjoiVHBaOjEzMjthLGIsYyIsCiskMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAorej1hPT09MCYmYj09PUoucTgodGhpcy5jKQoreT10aGlzLmIKK3g9dGhpcy5jCitpZih6KXkuWkIuS0YoUC5RZSh4KSkKK2Vsc2UgeS5aQi5LRihQLlFlKEouRmQoeCxhLGIpKSkKK3RoaXMuYS5hPTB9LAorJGlzRUg6dHJ1ZX19XSxbImRhcnQuY29yZSIsImRhcnQ6Y29yZSIsLFAsewogIl4iOiIiLAogVGU6ZnVuY3Rpb24oYSl7cmV0dXJufSwKIFdjOltmdW5jdGlvbihhLGIpe3JldHVybiBKLkZXKGEsYil9LCIkMiIsIm40Iiw0LDAsNTEsNDYsNDddLApAQCAtNzk4MywxMCArODE1NCwxMCBAQAogZWxzZXt3PXoudk0rPSJcXHgiCiBpZih2PDE2KXoudk09dysiMCIKIGVsc2V7ei52TT13KyIxIgotdi09MTZ9dz1ILkpNKHY8MTA/NDgrdjo4Nyt2KQordi09MTZ9dz1ILm14KHY8MTA/NDgrdjo4Nyt2KQogdz16LnZNKz13fWVsc2UgaWYodj09PTkyKXc9ei52TSs9IlxcXFwiCiBlbHNlIGlmKHY9PT0zNCl3PXoudk0rPSJcXFwiIgotZWxzZXt3PUguSk0odikKK2Vsc2V7dz1ILm14KHYpCiB3PXoudk0rPXd9fXk9dysiXCIiCiB6LnZNPXkKIHJldHVybiB5fXJldHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCkBAIC04MDA4LDEyICs4MTc5LDEzIEBACiB5PSQub0sKIGlmKHk9PW51bGwpSC5xdyh6KQogZWxzZSB5LiQxKHopfSwKK1FlOmZ1bmN0aW9uKGEpe3JldHVybiBILkxZKGEuY29uc3RydWN0b3IhPT1BcnJheT9QLkYoYSwhMCxudWxsKTphKX0sCiBZMjU6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEuZ2ZOKGEpLGIpfSwKICRpc0VIOnRydWV9LAogQ0w6ewotIl4iOiJUcDoxMzE7YSIsCisiXiI6IlRwWjoxMzM7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYQogaWYoei5iPjApei5hLktGKCIsICIpCiB6LmEuS0YoSi5HTChhKSkKQEAgLTgwMzMsNyArODIwNSw3IEBACiByZXR1cm4gSi54Qyh0aGlzLnkzLGIueTMpJiZ0aGlzLmFMPT09Yi5hTH0sCiBpTTpmdW5jdGlvbihhLGIpe3JldHVybiBKLkZXKHRoaXMueTMsYi5neTMoKSl9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnkzfSwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKK2J1OltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCiB6PXRoaXMuYUwKIHk9UC5HcSh6P0gubzIodGhpcykuZ2V0VVRDRnVsbFllYXIoKSswOkgubzIodGhpcykuZ2V0RnVsbFllYXIoKSswKQogeD1QLmgwKHo/SC5vMih0aGlzKS5nZXRVVENNb250aCgpKzE6SC5vMih0aGlzKS5nZXRNb250aCgpKzEpCkBAIC04MDQzLDEyICs4MjE1LDEyIEBACiB0PVAuaDAoej9ILm8yKHRoaXMpLmdldFVUQ1NlY29uZHMoKSswOkgubzIodGhpcykuZ2V0U2Vjb25kcygpKzApCiBzPVAucFYoej9ILm8yKHRoaXMpLmdldFVUQ01pbGxpc2Vjb25kcygpKzA6SC5vMih0aGlzKS5nZXRNaWxsaXNlY29uZHMoKSswKQogaWYoeilyZXR1cm4geSsiLSIreCsiLSIrdysiICIrdisiOiIrdSsiOiIrdCsiLiIrcysiWiIKLWVsc2UgcmV0dXJuIHkrIi0iK3grIi0iK3crIiAiK3YrIjoiK3UrIjoiK3QrIi4iK3N9LAorZWxzZSByZXR1cm4geSsiLSIreCsiLSIrdysiICIrdisiOiIrdSsiOiIrdCsiLiIrc30sIiQwIiwiZ0FZIiwwLDAsNjldLAogaDpmdW5jdGlvbihhLGIpe3JldHVybiBQLld1KEouZXcodGhpcy55MyxiLmdWcygpKSx0aGlzLmFMKX0sCiBFSzpmdW5jdGlvbigpe0gubzIodGhpcyl9LAogUk06ZnVuY3Rpb24oYSxiKXtpZihKLnlIKGEpPjg2NDAwMDAwMDAwMDAwMDApdGhyb3cgSC5iKFAudShhKSl9LAogJGlzaVA6dHJ1ZSwKLXN0YXRpYzp7Il4iOiJiUyxWcDgsRXUscDJXLGgyLEtMLEVRZSxOWHQsSG0sR2lvLHpNMyxjUlMsRTAzLEtlTCxDZ2QsTnJYLExELG80SSxUM0YsZjgseWZrLGxtZSIsenU6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGssagorc3RhdGljOnsiXiI6ImJTLFZwLEV1LHAyVyxoMixRQzMsRVFlLE5YdCx0cDEsR2lvLEZ6LGNSLEUwMyxLZUwsQ2dkLE5yWCxMRCxvNEksVDNGLGY4LHlmayxsbWUiLHp1OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGoKIHo9bmV3IEguVlIoIl4oWystXT9cXGR7NCw1fSktPyhcXGRcXGQpLT8oXFxkXFxkKSg/OlsgVF0oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoPzo6PyhcXGRcXGQpKC5cXGR7MSw2fSk/KT8pPyggP1t6Wl18ID8oWy0rXSkoXFxkXFxkKSg/Ojo/KFxcZFxcZCkpPyk/KT8kIixILnY0KCJeKFsrLV0/XFxkezQsNX0pLT8oXFxkXFxkKS0/KFxcZFxcZCkoPzpbIFRdKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSguXFxkezEsNn0pPyk/KT8oID9belpdfCA/KFstK10pKFxcZFxcZCkoPzo6PyhcXGRcXGQpKT8pPyk/JCIsITEsITAsITEpLG51bGwsbnVsbCkuaWsoYSkKIGlmKHohPW51bGwpe3k9bmV3IFAuTUYoKQogeD16LlFLCkBAIC04MDgwLDcgKzgyNTIsNyBAQAogaWYodHlwZW9mIG0hPT0ibnVtYmVyIilyZXR1cm4gSC5zKG0pCiBsPUouZXcobCw2MCptKQogaWYodHlwZW9mIGwhPT0ibnVtYmVyIilyZXR1cm4gSC5zKGwpCi1zPUouYkkocyxuKmwpfWs9ITB9ZWxzZSBrPSExCitzPUouSG4ocyxuKmwpfWs9ITB9ZWxzZSBrPSExCiBqPUguZnUodyx2LHUsdCxzLHIscSxrKQogcmV0dXJuIFAuV3UocD9qKzE6aixrKX1lbHNlIHRocm93IEguYihQLmNEKGEpKX0sV3U6ZnVuY3Rpb24oYSxiKXt2YXIgej1uZXcgUC5pUChhLGIpCiB6LlJNKGEsYikKQEAgLTgwOTUsMTIgKzgyNjcsMTIgQEAKIHJldHVybiIwMCIrYX0saDA6ZnVuY3Rpb24oYSl7aWYoYT49MTApcmV0dXJuIiIrYQogcmV0dXJuIjAiK2F9fX0sCiBNRjp7Ci0iXiI6IlRwOjEzMjsiLAorIl4iOiJUcFo6MTM0OyIsCiAkMTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiAwCiByZXR1cm4gSC5CVShhLG51bGwsbnVsbCl9LAogJGlzRUg6dHJ1ZX0sCiBScTp7Ci0iXiI6IlRwOjEzMzsiLAorIl4iOiJUcFo6MTM1OyIsCiAkMTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXJldHVybiAwCiByZXR1cm4gSC5SUihhLG51bGwpfSwKICRpc0VIOnRydWV9LApAQCAtODEyNywxOCArODI5OSwxOCBAQAogcmV0dXJuIHRoaXMuRnE9PT1iLkZxfSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5GcSYweDFGRkZGRkZGfSwKIGlNOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuQ0QuaU0odGhpcy5GcSxiLmdGcSgpKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1uZXcgUC5EVygpCiB5PXRoaXMuRnEKIGlmKHk8MClyZXR1cm4iLSIrUC5paSgwLDAsLXksMCwwLDApLmJ1KDApCiB4PXouJDEoQy5DRC5KVihDLkNELmNVKHksNjAwMDAwMDApLDYwKSkKIHc9ei4kMShDLkNELkpWKEMuQ0QuY1UoeSwxMDAwMDAwKSw2MCkpCiB2PW5ldyBQLlA3KCkuJDEoQy5DRC5KVih5LDEwMDAwMDApKQotcmV0dXJuIEguZChDLkNELmNVKHksMzYwMDAwMDAwMCkpKyI6IitILmQoeCkrIjoiK0guZCh3KSsiLiIrSC5kKHYpfSwKK3JldHVybiBILmQoQy5DRC5jVSh5LDM2MDAwMDAwMDApKSsiOiIrSC5kKHgpKyI6IitILmQodykrIi4iK0guZCh2KX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzYTY6dHJ1ZSwKLXN0YXRpYzp7Il4iOiJCcDcsUzRkLGRrbyxMb0Isemo1LGIySCxxOUosSUdCLERvTSxDdkQsa1RCLElKWixpSSxXcixmbSxyR3IiLGlpOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtyZXR1cm4gbmV3IFAuYTYoYSo4NjQwMDAwMDAwMCtiKjM2MDAwMDAwMDArZSo2MDAwMDAwMCtmKjEwMDAwMDArZCoxMDAwK2MpfX19LAorc3RhdGljOnsiXiI6IkJwNyxTNGQsZGtvLExvQix6ajUsYjJILHE5SixJR0IsRG9NLEN2RCxrVEIsSUpaLGlJLFZrQSxTODQsckdyIixpaTpmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIG5ldyBQLmE2KGEqODY0MDAwMDAwMDArYiozNjAwMDAwMDAwK2UqNjAwMDAwMDArZioxMDAwMDAwK2QqMTAwMCtjKX19fSwKIFA3OnsKLSJeIjoiVHA6MTU7IiwKKyJeIjoiVHBaOjE1OyIsCiAkMTpmdW5jdGlvbihhKXtpZihhPj0xMDAwMDApcmV0dXJuIEguZChhKQogaWYoYT49MTAwMDApcmV0dXJuIjAiK0guZChhKQogaWYoYT49MTAwMClyZXR1cm4iMDAiK0guZChhKQpAQCAtODE0Nyw3ICs4MzE5LDcgQEAKIHJldHVybiIwMDAwMCIrSC5kKGEpfSwKICRpc0VIOnRydWV9LAogRFc6ewotIl4iOiJUcDoxNTsiLAorIl4iOiJUcFo6MTU7IiwKICQxOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiBILmQoYSkKIHJldHVybiIwIitILmQoYSl9LAogJGlzRUg6dHJ1ZX0sCkBAIC04MTU3LDIzICs4MzI5LDIzIEBACiAkaXNYUzp0cnVlfSwKIExLOnsKICJeIjoiWFM7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJUaHJvdyBvZiBudWxsLiJ9fSwKLUFUOnsKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbC4ifSwiJDAiLCJnQVkiLDAsMCw2OV19LAorT1k6ewogIl4iOiJYUztHMT4iLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HMQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuRzEKIGlmKHohPW51bGwpcmV0dXJuIklsbGVnYWwgYXJndW1lbnQocyk6ICIrSC5kKHopCi1yZXR1cm4iSWxsZWdhbCBhcmd1bWVudChzKSJ9LAotc3RhdGljOnt1OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5BVChhKX19fSwKK3JldHVybiJJbGxlZ2FsIGFyZ3VtZW50KHMpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAorc3RhdGljOnt1OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5PWShhKX19fSwKIFNuOnsKLSJeIjoiQVQ7RzEiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlJhbmdlRXJyb3I6ICIrSC5kKHRoaXMuRzEpfSwKKyJeIjoiT1k7RzEiLAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJSYW5nZUVycm9yOiAiK0guZCh0aGlzLkcxKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntLUDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuU24oYSl9LE46ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlNuKCJ2YWx1ZSAiK0guZChhKSl9LFRFOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFAuU24oInZhbHVlICIrSC5kKGEpKyIgbm90IGluIHJhbmdlICIrSC5kKGIpKyIuLiIrSC5kKGMpKX19fSwKIE5wOnsKICJeIjoiWFM7IiwKIHN0YXRpYzp7YTk6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFAuTnAoKX19fSwKIEpTOnsKLSJeIjoiWFM7dUYsVVAsbVAsU0EsdkciLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CisiXiI6IlhTO3VGLFVQLG1QLFNBLEZaIiwKK2J1OltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKIHo9e30KIHouYT1QLnA5KCIiKQogei5iPTAKQEAgLTgxODIsNTkgKzgzNTQsNTkgQEAKIGlmKHg8MClyZXR1cm4gSC5lKHkseCkKIHU9UC5obCh5W3hdKQogdi52TSs9dHlwZW9mIHU9PT0ic3RyaW5nIj91OkguZCh1KX10aGlzLlNBLmFOKDAsbmV3IFAuQ0woeikpCi1yZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3IgOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0aGlzLlVQLmJ1KDApKyInXG5SZWNlaXZlcjogIitILmQoUC5obCh0aGlzLnVGKSkrIlxuQXJndW1lbnRzOiBbIit6LmEudk0rIl0ifSwKK3JldHVybiJOb1N1Y2hNZXRob2RFcnJvciA6IG1ldGhvZCBub3QgZm91bmQ6ICciK3RoaXMuVVAuYnUoMCkrIidcblJlY2VpdmVyOiAiK0guZChQLmhsKHRoaXMudUYpKSsiXG5Bcmd1bWVudHM6IFsiK3ouYS52TSsiXSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0pTOnRydWUsCiBzdGF0aWM6e2xyOmZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIG5ldyBQLkpTKGEsYixjLGQsZSl9fX0sCiB1Yjp7CiAiXiI6IlhTO0cxPiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuRzF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJVbnN1cHBvcnRlZCBvcGVyYXRpb246ICIrdGhpcy5HMX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntmOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC51YihhKX19fSwKIHJNOnsKICJeIjoiWFM7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuRzEKLXJldHVybiB6IT1udWxsPyJVbmltcGxlbWVudGVkRXJyb3I6ICIrSC5kKHopOiJVbmltcGxlbWVudGVkRXJyb3IifSwKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLkcxCityZXR1cm4geiE9bnVsbD8iVW5pbXBsZW1lbnRlZEVycm9yOiAiK0guZCh6KToiVW5pbXBsZW1lbnRlZEVycm9yIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzWFM6dHJ1ZSwKIHN0YXRpYzp7U1k6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLnJNKGEpfX19LAogbGo6ewogIl4iOiJYUztHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIkJhZCBzdGF0ZTogIit0aGlzLkcxfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iQmFkIHN0YXRlOiAiK3RoaXMuRzF9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7dzpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAubGooYSl9fX0sCiBVVjp7CiAiXiI6IlhTO1lBIiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuWUEKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLllBCiBpZih6PT1udWxsKXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uLiIKLXJldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiK0guZChQLmhsKHopKSsiLiJ9LAorcmV0dXJuIkNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGR1cmluZyBpdGVyYXRpb246ICIrSC5kKFAuaGwoeikpKyIuIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOnthNDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuVVYoYSl9fX0sCiBxbjp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJPdXQgb2YgTWVtb3J5In0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIk91dCBvZiBNZW1vcnkifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnSTQ6ZnVuY3Rpb24oKXtyZXR1cm59LAogJGlzWFM6dHJ1ZX0sCiBLWTp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJTdGFjayBPdmVyZmxvdyJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGdJNDpmdW5jdGlvbigpe3JldHVybn0sCiAkaXNYUzp0cnVlfSwKIHQ3OnsKICJeIjoiWFM7V28iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlYWRpbmcgc3RhdGljIHZhcmlhYmxlICciK3RoaXMuV28rIicgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0aGlzLldvKyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e21FOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC50NyhhKX19fSwKIEhHOnsKICJeIjoiYTtHMT4iLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HMQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuRzEKIGlmKHo9PW51bGwpcmV0dXJuIkV4Y2VwdGlvbiIKLXJldHVybiJFeGNlcHRpb246ICIrSC5kKHopfX0sCityZXR1cm4iRXhjZXB0aW9uOiAiK0guZCh6KX0sIiQwIiwiZ0FZIiwwLDAsNjldfSwKIG9lOnsKICJeIjoiYTtHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIkZvcm1hdEV4Y2VwdGlvbjogIitILmQodGhpcy5HMSl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJGb3JtYXRFeGNlcHRpb246ICIrSC5kKHRoaXMuRzEpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e2NEOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5vZShhKX19fSwKIGVWOnsKICJeIjoiYTsiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIkludGVnZXJEaXZpc2lvbkJ5WmVyb0V4Y2VwdGlvbiJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e3RzOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLmVWKCl9fX0sCiBxbzp7CiAiXiI6ImE7b2M+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJFeHBhbmRvOiIrSC5kKHRoaXMub2MpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iRXhwYW5kbzoiK0guZCh0aGlzLm9jKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogdDpmdW5jdGlvbihhLGIpe3ZhciB6PUgub2YoYiwiZXhwYW5kbyR2YWx1ZXMiKQogcmV0dXJuIHo9PW51bGw/bnVsbDpILm9mKHosdGhpcy5KNCgpKX0sCiB1OmZ1bmN0aW9uKGEsYixjKXt2YXIgej1ILm9mKGIsImV4cGFuZG8kdmFsdWVzIikKQEAgLTgyNzQsNyArODQ0Niw3IEBACiAkYXNaMDpudWxsfSwKIGM4OnsKICJeIjoiYTsiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIm51bGwifSwiJDAiLCJnQVkiLDAsMCw2OV19LAogIitOdWxsIjowLAogRks6ewogIl4iOiJhOyIsCkBAIC04Mjg0LDkgKzg0NTYsOSBAQAogIl4iOiI7IiwKIG46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcz09PWJ9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmE1KHRoaXMpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5hNSh0aGlzKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogVDpmdW5jdGlvbihhLGIpe3Rocm93IEguYihQLmxyKHRoaXMsYi5nV2EoKSxiLmduZCgpLGIuZ1ZtKCksbnVsbCkpfSwKLWdieDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguY3UoSC5iNyh0aGlzKSxudWxsKX0sCitnYng6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmN1KEgud08odGhpcyksbnVsbCl9LAogJGlzYTp0cnVlfSwKIG5zOnsKICJeIjoiYTsiLApAQCAtODMwMiw4ICs4NDc0LDggQEAKIHdFOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej10aGlzLnl6PT1udWxsCiBpZigheiYmdGhpcy53aj09bnVsbClyZXR1cm4KLWlmKHopdGhpcy55ej1ILk1zKCkKLWVsc2V7ej1ILk1zKCkKK2lmKHopdGhpcy55ej1ILkFvKCkKK2Vsc2V7ej1ILkFvKCkKIHk9dGhpcy53agogeD10aGlzLnl6CiBpZih0eXBlb2YgeSE9PSJudW1iZXIiKXJldHVybiB5LlcoKQpAQCAtODM0NywzMyArODUxOSwzMyBAQAogeT16LmdsKCkKIHRoaXMudk0rPXR5cGVvZiB5PT09InN0cmluZyI/eTpILmQoeSl9fX0sCiBWMTpmdW5jdGlvbihhKXt0aGlzLnZNPSIifSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnZNfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52TX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogUEQ6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PT0ic3RyaW5nIil0aGlzLnZNPWEKIGVsc2UgdGhpcy5LRihhKX0sCiBzdGF0aWM6e3A5OmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBQLlJuKCIiKQogei5QRChhKQogcmV0dXJuIHp9fX0sCi1HRDp7CitJTjp7CiAiXiI6ImE7IiwKLSRpc0dEOnRydWV9LAorJGlzSU46dHJ1ZX0sCiB1cTp7CiAiXiI6ImE7IiwKICRpc3VxOnRydWV9LAogcTU6ewotIl4iOiJhO0JvLElFLHBPLEZpLGt1LHRQLEJKLGhPLGxIIiwKKyJeIjoiYTtCbyxtbixwTyxGaSxrdSx0UCxCSixoTyxsSCIsCiBnSmY6ZnVuY3Rpb24oYSl7dmFyIHoKIGlmKEMueEIubkModGhpcy5CbywiWyIpKXt6PXRoaXMuQm8KIHJldHVybiBDLnhCLk5qKHosMSx6Lmxlbmd0aC0xKX1yZXR1cm4gdGhpcy5Cb30sCiBna2I6ZnVuY3Rpb24oYSl7dmFyIHoKLWlmKEoueEModGhpcy5JRSwwKSl7ej10aGlzLkZpCitpZihKLnhDKHRoaXMubW4sMCkpe3o9dGhpcy5GaQogaWYoej09PSJodHRwIilyZXR1cm4gODAKLWlmKHo9PT0iaHR0cHMiKXJldHVybiA0NDN9cmV0dXJuIHRoaXMuSUV9LAoraWYoej09PSJodHRwcyIpcmV0dXJuIDQ0M31yZXR1cm4gdGhpcy5tbn0sCiBnSWk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucE99LAogeDY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PWE9PW51bGwKIGlmKHomJiEwKXJldHVybiIiCiB6PSF6Ci1pZih6KTt5PXo/UC5YYyhhKTpDLmJQLmV6KGIsbmV3IFAuYm0oKSkuelYoMCwiLyIpCitpZih6KTt5PXo/UC5YYyhhKTpDLmpOLmV6KGIsbmV3IFAuYm0oKSkuelYoMCwiLyIpCiBpZigodGhpcy5nSmYodGhpcykhPT0iInx8dGhpcy5GaT09PSJmaWxlIikmJkouVTYoeSkuZ29yKHkpJiYhQy54Qi5uQyh5LCIvIikpcmV0dXJuIi8iK0guZCh5KQogcmV0dXJuIHl9LAogeU06ZnVuY3Rpb24oYSxiKXtpZihhPT09IiIpcmV0dXJuIi8iK0guZChiKQpAQCAtODM4Myw3ICs4NTU1LDcgQEAKIEtPOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIGlmKCF0aGlzLksyKGEpKXJldHVybiBhCiB6PVtdCi1mb3IoeT1hLnNwbGl0KCIvIikseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSkseD0hMTt5LkcoKTspe3c9eS5sbworZm9yKHk9YS5zcGxpdCgiLyIpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pLHg9ITE7eS5HKCk7KXt3PXkubG8KIGlmKEoueEModywiLi4iKSl7dj16Lmxlbmd0aAogaWYodiE9PTApaWYodj09PTEpe2lmKDA+PXYpcmV0dXJuIEguZSh6LDApCiB2PSFKLnhDKHpbMF0sIiIpfWVsc2Ugdj0hMApAQCAtODM5Myw3ICs4NTY1LDcgQEAKIGVsc2V7ei5wdXNoKHcpCiB4PSExfX1pZih4KXoucHVzaCgiIikKIHJldHVybiBDLk5tLnpWKHosIi8iKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLnA5KCIiKQogeT10aGlzLkZpCiBpZigiIiE9PXkpe3ouS0YoeSkKQEAgLTg0MDEsMTMgKzg1NzMsMTMgQEAKIHk9dGhpcy5rdQogaWYoIiIhPT15KXt6LktGKHkpCiB6LktGKCJAIil9ei5LRih0aGlzLkJvKQotaWYoIUoueEModGhpcy5JRSwwKSl7ei5LRigiOiIpCi16LktGKEouQUcodGhpcy5JRSkpfX16LktGKHRoaXMucE8pCitpZighSi54Qyh0aGlzLm1uLDApKXt6LktGKCI6IikKK3ouS0YoSi5BRyh0aGlzLm1uKSl9fXouS0YodGhpcy5wTykKIHk9dGhpcy50UAogaWYoIiIhPT15KXt6LktGKCI/IikKIHouS0YoeSl9eT10aGlzLkJKCiBpZigiIiE9PXkpe3ouS0YoIiMiKQotei5LRih5KX1yZXR1cm4gei52TX0sCit6LktGKHkpfXJldHVybiB6LnZNfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQpAQCAtODQyNiwxNCArODU5OCwxNCBAQAogZWxzZSB6PSExCiBlbHNlIHo9ITEKIHJldHVybiB6fSwKLWdpTzpmdW5jdGlvbihhKXt2YXIgej1uZXcgUC5YWigpCitnaU86ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAuV2YoKQogcmV0dXJuIHouJDIodGhpcy5GaSx6LiQyKHRoaXMua3Usei4kMih0aGlzLmdKZih0aGlzKSx6LiQyKHRoaXMuZ2tiKHRoaXMpLHouJDIodGhpcy5wTyx6LiQyKHRoaXMudFAsei4kMih0aGlzLkJKLDEpKSkpKSkpfSwKLW4zOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtpZihoPT09Imh0dHAiJiZKLnhDKGUsODApKXRoaXMuSUU9MAotZWxzZSBpZihoPT09Imh0dHBzIiYmSi54QyhlLDQ0MykpdGhpcy5JRT0wCi1lbHNlIHRoaXMuSUU9ZQorbjM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe2lmKGg9PT0iaHR0cCImJkoueEMoZSw4MCkpdGhpcy5tbj0wCitlbHNlIGlmKGg9PT0iaHR0cHMiJiZKLnhDKGUsNDQzKSl0aGlzLm1uPTAKK2Vsc2UgdGhpcy5tbj1lCiB0aGlzLnBPPXRoaXMueDYoYyxkKX0sCiAkaXNxNTp0cnVlLAotc3RhdGljOnsiXiI6IlFxRixxNyxyVSx2NSx2SSxpbGYsSW1pLEdwUixRNVcsWHJKLEc5LGZDLGxNLEZzUCxqMyxtbyx1MEksVEdOLFlrLFF4dCxsTCxXVHAsSGl3LEg1LHpzdCxWRkcsbkpkLFNwLEdQZixKQTcseXcxLFNRVSxmYlEiLGhLOmZ1bmN0aW9uKGEwKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhCitzdGF0aWM6eyJeIjoiUXFGLHE3LHJVLHVDWCx3bTcsaWxmLEltaSxHcFIsUTVXLFhySixWeGEsZkMsbE0sRnNQLGozLGRSQyx1MEksVEdOLFlrLFF4dCxsTCxCeCxIaXcsSDUsenN0LFZGRyxuSmQsU3BXLEdQZixKQTcseXcxLFNRVSxmYlEiLGhLOmZ1bmN0aW9uKGEwKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZSxkLGMsYixhCiB4PW5ldyBQLmpZKCkKIHc9bmV3IFAuVW8oYTApCiB2PWEwLmxlbmd0aApAQCAtODQ0Miw4ICs4NjE0LDggQEAKIGlmKHU+PXYpSC52aChQLk4odSkpCiByPWEwLmNoYXJDb2RlQXQodSkKIGlmKHI8MTI4KXtxPXI+Pj40Ci1pZihxPj04KXJldHVybiBILmUoQy5OTCxxKQotcT0oQy5OTFtxXSZDLmpuLktJKDEsciYxNSkpIT09MH1lbHNlIHE9ITEKK2lmKHE+PTgpcmV0dXJuIEguZShDLm1LeSxxKQorcT0oQy5tS3lbcV0mQy5qbi5LSSgxLHImMTUpKSE9PTB9ZWxzZSBxPSExCiBpZighcSl7aWYocj09PTU4KXt0PXMKIHU9dH1lbHNle3U9cy0xCiB0PTB9YnJlYWt9fWVsc2V7dT0wCkBAIC04NDk5LDcgKzg2NzEsNyBAQAogYj14LkMobCxqKT9DLnhCLk5qKGEwLHguZyhsLDEpLGopOiIiCiB4PUouV3goaikKIGE9eC5DKGosdik/Qy54Qi5OaihhMCx4LmcoaiwxKSx2KToiIgotcmV0dXJuIFAuV28oYSxkLGMsbnVsbCx6LGIsbnVsbCxoLGYpfSxXbzpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHo9UC5XZihoKQorcmV0dXJuIFAuV28oYSxkLGMsbnVsbCx6LGIsbnVsbCxoLGYpfSxXbzpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7dmFyIHo9UC5LVShoKQogej1uZXcgUC5xNShQLkw3KGIpLG51bGwsbnVsbCx6LGksUC5MRShmLGcpLFAubzYoYSksbnVsbCxudWxsKQogei5uMyhhLGIsYyxkLGUsZixnLGgsaSkKIHJldHVybiB6fSxMNzpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC04NTA5LDcgKzg2ODEsNyBAQAogUC5VdyhDLnhCLk5qKGEsMSx6KSkKIHJldHVybiBhfWZvcih6PWEubGVuZ3RoLHk9MDt5PHo7Kyt5KXtpZih5Pj16KUgudmgoUC5OKHkpKQogaWYoYS5jaGFyQ29kZUF0KHkpPT09NTgpe1AuVXcoYSkKLXJldHVybiJbIithKyJdIn19cmV0dXJuIGF9LFdmOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQorcmV0dXJuIlsiK2ErIl0ifX1yZXR1cm4gYX0sS1U6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiB6PW5ldyBQLlFVKCkKIGlmKGE9PW51bGwpcmV0dXJuIiIKIHk9YS5sZW5ndGgKQEAgLTg1MjAsOCArODY5Miw4IEBACiB1PSF1fWVsc2UgdT0hMQogaWYodSl0aHJvdyBILmIoUC51KCJJbGxlZ2FsIHNjaGVtZTogIithKSkKIGlmKHouJDEodikhPT0hMCl7aWYodjwxMjgpe3U9dj4+PjQKLWlmKHU+PTgpcmV0dXJuIEguZShDLk5MLHUpCi11PShDLk5MW3VdJkMuam4uS0koMSx2JjE1KSkhPT0wfWVsc2UgdT0hMQoraWYodT49OClyZXR1cm4gSC5lKEMubUt5LHUpCit1PShDLm1LeVt1XSZDLmpuLktJKDEsdiYxNSkpIT09MH1lbHNlIHU9ITEKIGlmKHUpO2Vsc2UgdGhyb3cgSC5iKFAudSgiSWxsZWdhbCBzY2hlbWU6ICIrYSkpCiB4PSExfX1yZXR1cm4geD9hOmEudG9Mb3dlckNhc2UoKX0sTEU6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIHo9e30KQEAgLTg1MzEsNyArODcwMyw3IEBACiBpZih5KTtpZih5KXJldHVybiBQLlhjKGEpCiB4PVAucDkoIiIpCiB6LmE9ITAKLUMuYlAuYU4oYixuZXcgUC5VZSh6LHgpKQorQy5qTi5hTihiLG5ldyBQLlVlKHoseCkpCiByZXR1cm4geC52TX0sbzY6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4iIgogcmV0dXJuIFAuWGMoYSl9LFhjOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0KIHo9e30KQEAgLTg1MzksNyArODcxMSw3IEBACiB6LmE9eQogaWYoeTwwKXJldHVybiBhCiB4PW5ldyBQLkFsKCkKLXc9bmV3IFAubTkoKQordz1uZXcgUC5RQigpCiB2PW5ldyBQLndtKGEseCxuZXcgUC50UygpKQogdT1uZXcgUC5RRShhKQogei5iPW51bGwKQEAgLTg1NTUsMjQgKzg3MjcsMjQgQEAKIHI9dy4kMShvKQogbj16LmIKIGlmKHI9PT0hMCl7bi50b1N0cmluZwotcj1ILkpNKG8pCityPUgubXgobykKIG4udk0rPXJ9ZWxzZXtuLnRvU3RyaW5nCiBuLnZNKz0iJSIKIHI9di4kMSh6LmErMSkKIG4udG9TdHJpbmcKLXI9SC5KTShyKQorcj1ILm14KHIpCiBuLnZNKz1yCiByPXouYgogbj12LiQxKHouYSsyKQogci50b1N0cmluZwotbj1ILkpNKG4pCituPUgubXgobikKIHIudk0rPW59cj16LmErPTMKIHouYz1yfW09Qy54Qi5YVShhLCIlIixyKQogaWYobT49ei5hKXt6LmE9bQogcj1tfWVsc2V7ei5hPXQKIHI9dH19aWYoei5iPT1udWxsKXJldHVybiBhCiBpZih6LmMhPT1yKXMuJDAoKQotcmV0dXJuIEouQUcoei5iKX0sRHk6ZnVuY3Rpb24oYSl7dmFyIHoseQorcmV0dXJuIEouQUcoei5iKX0sTXM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5uMyhKLkl0KGEsIiYiKSxQLkZsKG51bGwsbnVsbCksbmV3IFAucXooYikpfSxEeTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PW5ldyBQLkpWKCkKIHk9YS5zcGxpdCgiLiIpCiBpZih5Lmxlbmd0aCE9PTQpei4kMSgiSVB2NCBhZGRyZXNzIHNob3VsZCBjb250YWluIGV4YWN0bHkgNCBwYXJ0cyIpCkBAIC04NjAwLDcgKzg3NzIsNyBAQAogdT0hMH1lbHNlIEouYmkoeCx5LiQyKHcsdCkpCiB3PXQrMX0rK3R9aWYoSi5xOCh4KT09PTApei4kMSgidG9vIGZldyBwYXJ0cyIpCiBxPUoueEModyxKLnE4KGEpKQotcD1KLnhDKEouTVEoeCksLTEpCitwPUoueEMoSi51WSh4KSwtMSkKIGlmKHEmJiFwKXouJDEoImV4cGVjdGVkIGEgcGFydCBhZnRlciBsYXN0IGA6YCIpCiBpZighcSl0cnl7Si5iaSh4LHkuJDIodyxKLnE4KGEpKSl9Y2F0Y2gobyl7SC5SdShvKQogdHJ5e3Y9UC5EeShKLlpaKGEsdykpCkBAIC04NjEzLDcgKzg3ODUsNyBAQAogaWYodHlwZW9mIHMhPT0ibnVtYmVyIilyZXR1cm4gSC5zKHMpCiBKLmJpKHgsKHJ8cyk+Pj4wKX1jYXRjaChvKXtILlJ1KG8pCiB6LiQxKCJpbnZhbGlkIGVuZCBvZiBJUHY2IGFkZHJlc3MuIil9fWlmKHUpe2lmKEoucTgoeCk+Nyl6LiQxKCJhbiBhZGRyZXNzIHdpdGggYSB3aWxkY2FyZCBtdXN0IGhhdmUgbGVzcyB0aGFuIDcgcGFydHMiKX1lbHNlIGlmKEoucTgoeCkhPT04KXouJDEoImFuIGFkZHJlc3Mgd2l0aG91dCBhIHdpbGRjYXJkIG11c3QgY29udGFpbiBleGFjdGx5IDggcGFydHMiKQotcz1uZXcgSC5vQSh4LG5ldyBQLmQ5KHgpKQorcz1uZXcgSC5vQSh4LG5ldyBQLkVZKHgpKQogcy4kYnVpbHRpblR5cGVJbmZvPVtudWxsLG51bGxdCiByZXR1cm4gUC5GKHMsITAsSC5pcChzLCJtVyIsMCkpfSxqVzpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUsdAogej1uZXcgUC5ySSgpCkBAIC04NjI0LDEzICs4Nzk2LDQxIEBACiBpZih1LkModiwxMjgpKXt0PXUubSh2LDQpCiBpZih0Pj04KXJldHVybiBILmUoYSx0KQogdD0oYVt0XSZDLmpuLktJKDEsdS5pKHYsMTUpKSkhPT0wfWVsc2UgdD0hMQotaWYodCl7dT1ILkpNKHYpCi15LnZNKz11fWVsc2UgaWYoZCYmdS5uKHYsMzIpKXt1PUguSk0oNDMpCi15LnZNKz11fWVsc2V7dT1ILkpNKDM3KQoraWYodCl7dT1ILm14KHYpCit5LnZNKz11fWVsc2UgaWYoZCYmdS5uKHYsMzIpKXt1PUgubXgoNDMpCit5LnZNKz11fWVsc2V7dT1ILm14KDM3KQogeS52TSs9dQotei4kMih2LHkpfX1yZXR1cm4geS52TX19fSwKK3ouJDIodix5KX19cmV0dXJuIHkudk19LG9oOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKK2Zvcih6PUouclkoYSkseT0wLHg9MDt4PDI7Kyt4KXt3PXouaihhLGIreCkKK2lmKDQ4PD13JiZ3PD01Nyl5PXkqMTYrdy00OAorZWxzZXt3fD0zMgoraWYoOTc8PXcmJnc8PTEwMil5PXkqMTYrdy04NworZWxzZSB0aHJvdyBILmIoUC51KCJJbnZhbGlkIFVSTCBlbmNvZGluZyIpKX19cmV0dXJuIHl9LHBFOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUsdAorej1KLlU2KGEpCit5PSEwCit4PTAKK3doaWxlKCEwKXt3PXouZ0IoYSkKK2lmKHR5cGVvZiB3IT09Im51bWJlciIpcmV0dXJuIEgucyh3KQoraWYoISh4PHcmJnkpKWJyZWFrCit2PXouaihhLHgpCit5PXYhPT0zNyYmdiE9PTQzOysreH1pZih5KWlmKGI9PT1DLnhNfHwhMSlyZXR1cm4gYQorZWxzZSB1PXouZ1lDKGEpCitlbHNle3U9W10KK3g9MAord2hpbGUoITApe3c9ei5nQihhKQoraWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCitpZighKHg8dykpYnJlYWsKK3Y9ei5qKGEseCkKK2lmKHY+MTI3KXRocm93IEguYihQLnUoIklsbGVnYWwgcGVyY2VudCBlbmNvZGluZyBpbiBVUkkiKSkKK2lmKHY9PT0zNyl7dz16LmdCKGEpCitpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiBILnModykKK2lmKHgrMz53KXRocm93IEguYihQLnUoIlRydW5jYXRlZCBVUkkiKSkKK3UucHVzaChQLm9oKGEseCsxKSkKK3grPTJ9ZWxzZSBpZihjJiZ2PT09NDMpdS5wdXNoKDMyKQorZWxzZSB1LnB1c2godik7Kyt4fX10PWIuSUUKK3JldHVybiBuZXcgUC5HWSh0KS5XSih1KX19fSwKIGpZOnsKLSJeIjoiVHA6MTM0OyIsCisiXiI6IlRwWjoxMzY7IiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZihhPDEyOCl7ej1hPj4+NAogaWYoej49OClyZXR1cm4gSC5lKEMuYWEseikKQEAgLTg2MzgsMTMgKzg4MzgsMTMgQEAKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogVW86ewotIl4iOiJUcDoxMzU7YSIsCisiXiI6IlRwWjoxMzc7YSIsCiAkMTpmdW5jdGlvbihhKXthPUouRFAodGhpcy5hLCJdIixhKQogaWYoYT09PS0xKXRocm93IEguYihQLmNEKCJCYWQgZW5kIG9mIElQdjYgaG9zdCIpKQogcmV0dXJuIGErMX0sCiAkaXNFSDp0cnVlfSwKIFFVOnsKLSJeIjoiVHA6MTM0OyIsCisiXiI6IlRwWjoxMzY7IiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZihhPDEyOCl7ej1hPj4+NAogaWYoej49OClyZXR1cm4gSC5lKEMuSkgseikKQEAgLTg2NTIsMTEgKzg4NTIsMTEgQEAKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogYm06ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBQLmpXKEMuWkosYSxDLnhNLCExKX0sCiAkaXNFSDp0cnVlfSwKIFVlOnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYQogaWYoIXouYSl0aGlzLmIuS0YoIiYiKQogei5hPSExCkBAIC04NjY3LDE4ICs4ODY3LDE4IEBACiB6LktGKFAualcoQy5CMixiLEMueE0sITApKX0sCiAkaXNFSDp0cnVlfSwKIEFsOnsKLSJeIjoiVHA6MTM0OyIsCisiXiI6IlRwWjoxMzY7IiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZighKDQ4PD1hJiZhPD01Nykpej02NTw9YSYmYTw9NzAKIGVsc2Ugej0hMAogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiB0Uzp7Ci0iXiI6IlRwOjEzNDsiLAorIl4iOiJUcFo6MTM2OyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gOTc8PWEmJmE8PTEwMn0sCiAkaXNFSDp0cnVlfSwKLW05OnsKLSJeIjoiVHA6MTM0OyIsCitRQjp7CisiXiI6IlRwWjoxMzY7IiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZihhPDEyOCl7ej1DLmpuLkdHKGEsNCkKIGlmKHo+PTgpcmV0dXJuIEguZShDLkIyLHopCkBAIC04Njg2LDcgKzg4ODYsNyBAQAogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiB3bTp7Ci0iXiI6IlRwOjEzNTtiLGMsZCIsCisiXiI6IlRwWjoxMzc7YixjLGQiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLmIKIHk9Si5QcCh6LGEpCkBAIC04Njk1LDcgKzg4OTUsNyBAQAogZWxzZSByZXR1cm4geX0sCiAkaXNFSDp0cnVlfSwKIFFFOnsKLSJeIjoiVHA6MTM1O2UiLAorIl4iOiJUcFo6MTM3O2UiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogZm9yKHo9dGhpcy5lLHk9Si5yWSh6KSx4PTAsdz0wO3c8MjsrK3cpe3Y9eS5qKHosYSt3KQogaWYoNDg8PXYmJnY8PTU3KXg9eCoxNit2LTQ4CkBAIC04NzA0LDcgKzg5MDQsNyBAQAogZWxzZSB0aHJvdyBILmIoUC51KCJJbnZhbGlkIHBlcmNlbnQtZW5jb2RpbmcgaW4gVVJJIGNvbXBvbmVudDogIit6KSl9fXJldHVybiB4fSwKICRpc0VIOnRydWV9LAogWVA6ewotIl4iOiJUcDoxODthLGYiLAorIl4iOiJUcFo6MTg7YSxmIiwKICQwOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcsdgogej10aGlzLmEKIHk9ei5iCkBAIC04NzE0LDMwICs4OTE0LDQwIEBACiBpZih5PT1udWxsKXouYj1QLnA5KEouTmoodyx4LHYpKQogZWxzZSB5LktGKEouTmoodyx4LHYpKX0sCiAkaXNFSDp0cnVlfSwKLVhaOnsKLSJeIjoiVHA6MTM2OyIsCitXZjp7CisiXiI6IlRwWjoxMzg7IiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9Si52MShhKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiByZXR1cm4gYiozMSt6JjEwNzM3NDE4MjN9LAogJGlzRUg6dHJ1ZX0sCitxejp7CisiXiI6IlRwWjo4MDthIiwKKyQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKK3o9Si5VNihiKQoreT16LmtKKGIsIj0iKQoraWYoeT09PS0xKXtpZighei5uKGIsIiIpKUoua1coYSxQLnBFKGIsdGhpcy5hLCEwKSwiIil9ZWxzZSBpZih5IT09MCl7eD16Lk5qKGIsMCx5KQordz16LnluKGIseSsxKQorej10aGlzLmEKK0oua1coYSxQLnBFKHgseiwhMCksUC5wRSh3LHosITApKX1yZXR1cm4gYX0sCiskaXNFSDp0cnVlfSwKIEpWOnsKLSJeIjoiVHA6NDM7IiwKKyJeIjoiVHBaOjQzOyIsCiAkMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5jRCgiSWxsZWdhbCBJUHY0IGFkZHJlc3MsICIrYSkpfSwKICRpc0VIOnRydWV9LAogTnc6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9SC5CVShhLG51bGwsbnVsbCkKIHk9Si5XeCh6KQogaWYoeS5DKHosMCl8fHkuRCh6LDI1NSkpdGhpcy5hLiQxKCJlYWNoIHBhcnQgbXVzdCBiZSBpbiB0aGUgcmFuZ2Ugb2YgYDAuLjI1NWAiKQotcmV0dXJuIHp9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMzcsImNhbGwiXSwKK3JldHVybiB6fSwiJDEiLG51bGwsMiwwLG51bGwsMTM5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHg4OnsKLSJeIjoiVHA6NDM7IiwKKyJeIjoiVHBaOjQzOyIsCiAkMTpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5jRCgiSWxsZWdhbCBJUHY2IGFkZHJlc3MsICIrYSkpfSwKICRpc0VIOnRydWV9LAogSlQ6ewotIl4iOiJUcDo5NjthLGIiLAorIl4iOiJUcFo6OTc7YSxiIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYoYi1hPjQpdGhpcy5iLiQxKCJhbiBJUHY2IHBhcnQgY2FuIG9ubHkgY29udGFpbiBhIG1heGltdW0gb2YgNCBoZXggZGlnaXRzIikKIHo9SC5CVShDLnhCLk5qKHRoaXMuYSxhLGIpLDE2LG51bGwpCkBAIC04NzQ1LDE3ICs4OTU1LDE3IEBACiBpZih5LkMoeiwwKXx8eS5EKHosNjU1MzUpKXRoaXMuYi4kMSgiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAweDAuLjB4RkZGRmAiKQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCi1kOTp7Ci0iXiI6IlRwOjEzO2MiLAorRVk6eworIl4iOiJUcFo6MTM7YyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKIGlmKHoubihhLC0xKSlyZXR1cm4gUC5POCgoOS10aGlzLmMubGVuZ3RoKSoyLDAsbnVsbCkKIGVsc2UgcmV0dXJuW3oubShhLDgpJjI1NSx6LmkoYSwyNTUpXX0sCiAkaXNFSDp0cnVlfSwKIHJJOnsKLSJeIjoiVHA6Nzk7IiwKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PUouV3goYSkKLWIuS0YoSC5KTShDLnhCLmooIjAxMjM0NTY3ODlBQkNERUYiLHoubShhLDQpKSkpCi1iLktGKEguSk0oQy54Qi5qKCIwMTIzNDU2Nzg5QUJDREVGIix6LmkoYSwxNSkpKSl9LAorYi5LRihILm14KEMueEIuaigiMDEyMzQ1Njc4OUFCQ0RFRiIsei5tKGEsNCkpKSkKK2IuS0YoSC5teChDLnhCLmooIjAxMjM0NTY3ODlBQkNERUYiLHouaShhLDE1KSkpKX0sCiAkaXNFSDp0cnVlfX1dLFsiZGFydC5kb20uaHRtbCIsImRhcnQ6aHRtbCIsLFcsewogIl4iOiIiLAogUTg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4CkBAIC04Nzc3LDE0ICs4OTg3LDE1IEBACiB4PW5ldyBYTUxIdHRwUmVxdWVzdCgpCiBDLlczLmVvKHgsIkdFVCIsYSwhMCkKIHo9SC5WTShuZXcgVy5STyh4LEMuTEYuUGgsITEpLFtudWxsXSkKLUguVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRihuZXcgVy5iVSh5LHgpKSx6LlNnKSxbSC5LcCh6LDApXSkuWnooKQorSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKG5ldyBXLmJVKHkseCkpLHouU2cpLFtILk9xKHosMCldKS5aeigpCiB6PUguVk0obmV3IFcuUk8oeCxDLkpOLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYoeS5nWUooKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih5LmdZSigpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogeC5zZW5kKCkKIHJldHVybiB5Lk1NfSwKIEVEOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiLG51bGwpCiBpZihhIT1udWxsKXRyeXtKLmlNKHosYSl9Y2F0Y2goeSl7SC5SdSh5KX1yZXR1cm4gen0sCitXczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3ICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlcnx8d2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXJ8fHdpbmRvdy5Nb3pNdXRhdGlvbk9ic2VydmVyKShILnRSKFcuQjMoYSksMikpfSwKIHBTOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej10eXBlb2YgYSE9PSJzdHJpbmciCiBpZigoIXp8fGE9PW51bGwpJiYhMClyZXR1cm4gbmV3IFdlYlNvY2tldChhKQpAQCAtODgwOSw4ICs5MDIwLDggQEAKIHJldHVybiBQLm83KGEsITApfSwKIEdpOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBXLnpaKGEsYil9LAogejk6W2Z1bmN0aW9uKGEpe3JldHVybiBKLk4xKGEpfSwiJDEiLCJiNCIsMiwwLDEzLDU0XSwKLUh4OltmdW5jdGlvbihhKXtyZXR1cm4gSi5aMihhKX0sIiQxIiwiSE0iLDIsMCwxMyw1NF0sCi1IdzpbZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouZGYoYSxiLGMsZCl9LCIkNCIsInJpIiw4LDAsNTUsNTQsNTYsNTcsNThdLAorSHg6W2Z1bmN0aW9uKGEpe3JldHVybiBKLnFxKGEpfSwiJDEiLCJITSIsMiwwLDEzLDU0XSwKK0h3OltmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5kZihhLGIsYyxkKX0sIiQ0IiwiU04iLDgsMCw1NSw1NCw1Niw1Nyw1OF0sCiBDdDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxCiB6PUouWHIoZCkKIGlmKHo9PW51bGwpdGhyb3cgSC5iKFAudShkKSkKQEAgLTg4MjcsNyArOTAzOCw3IEBACiB0LmNyZWF0ZWRDYWxsYmFjaz17dmFsdWU6ZnVuY3Rpb24oZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcyl9fShILnRSKFcuR2koeCx5KSwxKSl9CiB0LmF0dGFjaGVkQ2FsbGJhY2s9e3ZhbHVlOmZ1bmN0aW9uKGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmKHRoaXMpfX0oSC50UihXLmI0KCksMSkpfQogdC5kZXRhY2hlZENhbGxiYWNrPXt2YWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKX19KEgudFIoVy5ITSgpLDEpKX0KLXQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPXt2YWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGkpe3JldHVybiBmKHRoaXMsZyxoLGkpfX0oSC50UihXLnJpKCksNCkpfQordC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9e3ZhbHVlOmZ1bmN0aW9uKGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSl7cmV0dXJuIGYodGhpcyxnLGgsaSl9fShILnRSKFcuU04oKSw0KSl9CiBzPU9iamVjdC5jcmVhdGUodS5wcm90b3R5cGUsdCkKIHI9SC5WYSh5KQogT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsaW5pdC5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6cixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQpAQCAtODgzNywxMSArOTA0OCwxMSBAQAogYUY6ZnVuY3Rpb24oYSl7aWYoSi54QygkLlgzLEMuTlUpKXJldHVybiBhCiBpZihhPT1udWxsKXJldHVybgogcmV0dXJuICQuWDMuck8oYSwhMCl9LAotRnM6ZnVuY3Rpb24oYSl7aWYoSi54QygkLlgzLEMuTlUpKXJldHVybiBhCitCMzpmdW5jdGlvbihhKXtpZihKLnhDKCQuWDMsQy5OVSkpcmV0dXJuIGEKIHJldHVybiAkLlgzLmNsKGEsITApfSwKIEJvOnsKICJeIjoiaDQ7IiwKLSIlIjoiSFRNTEFwcGxldEVsZW1lbnR8SFRNTEJSRWxlbWVudHxIVE1MQ29udGVudEVsZW1lbnR8SFRNTERMaXN0RWxlbWVudHxIVE1MRGF0YUxpc3RFbGVtZW50fEhUTUxEaXJlY3RvcnlFbGVtZW50fEhUTUxEaXZFbGVtZW50fEhUTUxGb250RWxlbWVudHxIVE1MRnJhbWVFbGVtZW50fEhUTUxIUkVsZW1lbnR8SFRNTEhlYWRFbGVtZW50fEhUTUxIZWFkaW5nRWxlbWVudHxIVE1MSHRtbEVsZW1lbnR8SFRNTE1hcnF1ZWVFbGVtZW50fEhUTUxNZW51RWxlbWVudHxIVE1MTW9kRWxlbWVudHxIVE1MUGFyYWdyYXBoRWxlbWVudHxIVE1MUHJlRWxlbWVudHxIVE1MUXVvdGVFbGVtZW50fEhUTUxTaGFkb3dFbGVtZW50fEhUTUxTcGFuRWxlbWVudHxIVE1MVGFibGVDYXB0aW9uRWxlbWVudHxIVE1MVGFibGVDb2xFbGVtZW50fEhUTUxUaXRsZUVsZW1lbnR8SFRNTFVMaXN0RWxlbWVudHxIVE1MVW5rbm93bkVsZW1lbnQ7SFRNTEVsZW1lbnQ7anBSfE90fHhjfExQY3xoVnxYZnN8dUx8cHZ8RzZ8VmZ4fHhJfGVXfERzZHxlb3x0dWp8YUN8Vll8VmN0fEJlfFNhTXxKSXxEMTN8WlB8V1pxfG5KfEtBZnxFZ3xpN3xwdmF8R2t8Y2RhfE5yfHdhYXxNSnxUNTN8REt8VjR8QlN8VjEwfFZifFYxMXxMeXxwUnxWMTJ8aHh8VjEzfEw0fE1ifFYxNHxtT3xERXxWMTV8VTF8VjE2fEg4fFdTfHFofFYxN3xvRnxWMTh8UTZ8dUV8VjE5fFpufFYyMHxuNXxWMjF8TWF8d058VjIyfGRzfFYyM3xvdXxaelJ8YXZ8VjI0fHV6fFYyNXxrS3xvYXxWMjZ8U3R8VjI3fElXfFYyOHxRaHxWMjl8T3p8VjMwfFo0fFYzMXxxa3xWMzJ8dmp8TFV8VjMzfENYfFYzNHxtZHxWMzV8Qm18VjM2fFlhfFYzN3xXd3x5ZXxWMzh8RzF8VjM5fGZsfFY0MHxVS3xWNDF8d018VjQyfE5LfFY0M3xaeHxWNDR8RjF8VjQ1fG92fG9FWXxrbnxWNDZ8Zkl8VjQ3fHpNfFY0OHxSa3xWNDl8VGl8SW1LfENZfFY1MHxubXxWNTF8dXd8VjUyfFBhfFY1M3xEMnxJNXxWNTR8ZWwifSwKKyIlIjoiSFRNTEFwcGxldEVsZW1lbnR8SFRNTEJSRWxlbWVudHxIVE1MQ29udGVudEVsZW1lbnR8SFRNTERMaXN0RWxlbWVudHxIVE1MRGF0YUxpc3RFbGVtZW50fEhUTUxEaXJlY3RvcnlFbGVtZW50fEhUTUxEaXZFbGVtZW50fEhUTUxGb250RWxlbWVudHxIVE1MRnJhbWVFbGVtZW50fEhUTUxIUkVsZW1lbnR8SFRNTEhlYWRFbGVtZW50fEhUTUxIZWFkaW5nRWxlbWVudHxIVE1MSHRtbEVsZW1lbnR8SFRNTE1hcnF1ZWVFbGVtZW50fEhUTUxNZW51RWxlbWVudHxIVE1MTW9kRWxlbWVudHxIVE1MUGFyYWdyYXBoRWxlbWVudHxIVE1MUHJlRWxlbWVudHxIVE1MUXVvdGVFbGVtZW50fEhUTUxTaGFkb3dFbGVtZW50fEhUTUxTcGFuRWxlbWVudHxIVE1MVGFibGVDYXB0aW9uRWxlbWVudHxIVE1MVGFibGVDb2xFbGVtZW50fEhUTUxUaXRsZUVsZW1lbnR8SFRNTFVMaXN0RWxlbWVudHxIVE1MVW5rbm93bkVsZW1lbnQ7SFRNTEVsZW1lbnQ7anBSfFRSMHx4Y3xMUGN8aFZ8WGZzfHVMfHB2fEc2fFZmeHx4SXxlV3xEc2R8ZW98dHVqfGFrfFZZfFZjdHxCZXxTYU18Skl8RDEzfFpQfFdacXxuSnxLQWZ8RWd8aTd8cHZhfEdrfGNkYXxKM3x3YWF8TUp8VDUzfERLfFY5fEJTfFYxMHxWYnxWMTF8THl8cFJ8VjEyfGh4fFYxM3xMNHxNYnxWMTR8bU98REV8VjE1fFUxfFYxNnxIOHxXU3xxaHxWMTd8b0Z8VjE4fFE2fHVFfFYxOXxabnxWMjB8bjV8VjIxfE1hfHdOfFYyMnxkc3xWMjN8cU18WnpSfGF2fFYyNHx1enxWMjV8a0t8b2F8VjI2fFN0fFYyN3xJV3xWMjh8UWh8VjI5fE96fFYzMHxaNHxWMzF8cWt8VjMyfHZqfExVfFYzM3xDWHxWMzR8bWR8VjM1fEJtfFYzNnxZYXxWMzd8V3d8eWV8VjM4fEcxfFYzOXxmbHxWNDB8VUt8VjQxfHdNfFY0MnxOS3xWNDN8Wnh8VjQ0fEYxfFY0NXxvdnxvRVl8a258VjQ2fGZJfFY0N3x6TXxWNDh8Umt8VjQ5fFRpfEltS3xDWXxWNTB8bm18VjUxfHV3fFY1MnxQYXxWNTN8RDJ8STV8VjU0fGVsIn0sCiBZeW46ewogIl4iOiJHdjsiLAogJGlzV086dHJ1ZSwKQEAgLTg4NTIsMTEgKzkwNjMsMTEgQEAKICIlIjoiRW50cnlBcnJheSJ9LAogUHM6ewogIl4iOiJCbztOOnRhcmdldCUsdDU6dHlwZSUsbUg6aHJlZiUsYUI6cHJvdG9jb2w9IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LCIkMCIsImdBWSIsMCwwLDY5XSwKICIlIjoiSFRNTEFuY2hvckVsZW1lbnQifSwKIGZZOnsKICJeIjoiQm87Tjp0YXJnZXQlLG1IOmhyZWYlLGFCOnByb3RvY29sPSIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAiJSI6IkhUTUxBcmVhRWxlbWVudCJ9LAogclpnOnsKICJeIjoiQm87bUg6aHJlZiUsTjp0YXJnZXQlIiwKQEAgLTg4NzIsOCArOTA4Myw4IEBACiBPeDp7CiAiXiI6IkJvO01COmZvcm09LG9jOm5hbWUlLHQ1OnR5cGUlLFA6dmFsdWUlIiwKICIlIjoiSFRNTEJ1dHRvbkVsZW1lbnQifSwKLU55OnsKLSJeIjoiQm87Zmc6aGVpZ2h0fSxSOndpZHRofSIsCitOeTk6eworIl4iOiJCbztmZzpoZWlnaHQlLFI6d2lkdGh9IiwKIGdWRTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRDb250ZXh0KCIyZCIpfSwKICIlIjoiSFRNTENhbnZhc0VsZW1lbnQifSwKIE9pOnsKQEAgLTg5MjUsNyArOTEzNiw3IEBACiBNZDpmdW5jdGlvbihhLGIpe3JldHVybiBXLnZEKGEucXVlcnlTZWxlY3RvckFsbChiKSxudWxsKX0sCiAkaXNZTjp0cnVlLAogIiUiOiJYTUxEb2N1bWVudDtEb2N1bWVudCJ9LAotQWo6eworaHN3OnsKICJeIjoiS1Y7IiwKIGdrczpmdW5jdGlvbihhKXtpZihhLl9kb2NDaGlsZHJlbj09bnVsbClhLl9kb2NDaGlsZHJlbj1ILlZNKG5ldyBQLkQ3KGEsbmV3IFcud2koYSkpLFtudWxsXSkKIHJldHVybiBhLl9kb2NDaGlsZHJlbn0sCkBAIC04OTQxLDcgKzkxNTIsNyBAQAogaWYoUC5GNygpPT09ITAmJno9PT0iU0VDVVJJVFlfRVJSIilyZXR1cm4iU2VjdXJpdHlFcnJvciIKIGlmKFAuRjcoKT09PSEwJiZ6PT09IlNZTlRBWF9FUlIiKXJldHVybiJTeW50YXhFcnJvciIKIHJldHVybiB6fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0JLOnRydWUsCiAiJSI6IkRPTUV4Y2VwdGlvbiJ9LAogaDQ6ewpAQCAtODk1Niw3ICs5MTY3LDcgQEAKIHdOOmZ1bmN0aW9uKGEsYixjLGQpe30sCiBncW46ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKIGdLRDpmdW5jdGlvbihhKXtyZXR1cm4gYS5uYW1lc3BhY2VVUkl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS5sb2NhbE5hbWV9LCIkMCIsImdBWSIsMCwwLDY5XSwKIFdPOmZ1bmN0aW9uKGEsYil7aWYoISFhLm1hdGNoZXMpcmV0dXJuIGEubWF0Y2hlcyhiKQogZWxzZSBpZighIWEud2Via2l0TWF0Y2hlc1NlbGVjdG9yKXJldHVybiBhLndlYmtpdE1hdGNoZXNTZWxlY3RvcihiKQogZWxzZSBpZighIWEubW96TWF0Y2hlc1NlbGVjdG9yKXJldHVybiBhLm1vek1hdGNoZXNTZWxlY3RvcihiKQpAQCAtODk2NCw3ICs5MTc1LDcgQEAKIGVsc2UgaWYoISFhLm9NYXRjaGVzU2VsZWN0b3IpcmV0dXJuIGEub01hdGNoZXNTZWxlY3RvcihiKQogZWxzZSB0aHJvdyBILmIoUC5mKCJOb3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKSl9LAogWDM6ZnVuY3Rpb24oYSxiKXt2YXIgej1hCi1kb3tpZihKLlJGKHosYikpcmV0dXJuITAKK2Rve2lmKEouVXYoeixiKSlyZXR1cm4hMAogej16LnBhcmVudEVsZW1lbnR9d2hpbGUoeiE9bnVsbCkKIHJldHVybiExfSwKIGVyOmZ1bmN0aW9uKGEpe3JldHVybihhLmNyZWF0ZVNoYWRvd1Jvb3R8fGEud2Via2l0Q3JlYXRlU2hhZG93Um9vdCkuY2FsbChhKX0sCkBAIC04OTgxLDggKzkxOTIsOCBAQAogJGlzaDQ6dHJ1ZSwKICRpc1BaOnRydWUsCiAiJSI6IjtFbGVtZW50In0sCi1sQzp7Ci0iXiI6IkJvO2ZnOmhlaWdodH0sb2M6bmFtZSUsdDU6dHlwZSUsUjp3aWR0aH0iLAorS2s6eworIl4iOiJCbztmZzpoZWlnaHQlLG9jOm5hbWUlLHQ1OnR5cGUlLFI6d2lkdGh9IiwKICIlIjoiSFRNTEVtYmVkRWxlbWVudCJ9LAogVHk6ewogIl4iOiJlYTtrYzplcnJvcj0sRzE6bWVzc2FnZT0iLApAQCAtODk5Myw3ICs5MjA0LDcgQEAKIGdOOmZ1bmN0aW9uKGEpe3JldHVybiBXLnFjKGEudGFyZ2V0KX0sCiBlNjpmdW5jdGlvbihhKXtyZXR1cm4gYS5wcmV2ZW50RGVmYXVsdCgpfSwKICRpc2VhOnRydWUsCi0iJSI6IkF1ZGlvUHJvY2Vzc2luZ0V2ZW50fEF1dG9jb21wbGV0ZUVycm9yRXZlbnR8QmVmb3JlTG9hZEV2ZW50fEJlZm9yZVVubG9hZEV2ZW50fENTU0ZvbnRGYWNlTG9hZEV2ZW50fERldmljZU1vdGlvbkV2ZW50fERldmljZU9yaWVudGF0aW9uRXZlbnR8SGFzaENoYW5nZUV2ZW50fElEQlZlcnNpb25DaGFuZ2VFdmVudHxJbnN0YWxsRXZlbnR8SW5zdGFsbFBoYXNlRXZlbnR8TWVkaWFLZXlOZWVkZWRFdmVudHxNZWRpYVN0cmVhbUV2ZW50fE1lZGlhU3RyZWFtVHJhY2tFdmVudHxNdXRhdGlvbkV2ZW50fE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudHxPdmVyZmxvd0V2ZW50fFBhZ2VUcmFuc2l0aW9uRXZlbnR8UlRDRFRNRlRvbmVDaGFuZ2VFdmVudHxSVENEYXRhQ2hhbm5lbEV2ZW50fFJUQ0ljZUNhbmRpZGF0ZUV2ZW50fFNwZWVjaElucHV0RXZlbnR8VHJhY2tFdmVudHxUcmFuc2l0aW9uRXZlbnR8V2ViR0xDb250ZXh0RXZlbnR8V2ViS2l0QW5pbWF0aW9uRXZlbnR8V2ViS2l0VHJhbnNpdGlvbkV2ZW50O0V2ZW50In0sCisiJSI6IkF1ZGlvUHJvY2Vzc2luZ0V2ZW50fEF1dG9jb21wbGV0ZUVycm9yRXZlbnR8QmVmb3JlTG9hZEV2ZW50fEJlZm9yZVVubG9hZEV2ZW50fENTU0ZvbnRGYWNlTG9hZEV2ZW50fERldmljZU1vdGlvbkV2ZW50fERldmljZU9yaWVudGF0aW9uRXZlbnR8SGFzaENoYW5nZUV2ZW50fElEQlZlcnNpb25DaGFuZ2VFdmVudHxJbnN0YWxsRXZlbnR8SW5zdGFsbFBoYXNlRXZlbnR8TWVkaWFLZXlOZWVkZWRFdmVudHxNZWRpYVN0cmVhbUV2ZW50fE1lZGlhU3RyZWFtVHJhY2tFdmVudHxNdXRhdGlvbkV2ZW50fE9mZmxpbmVBdWRpb0NvbXBsZXRpb25FdmVudHxPdmVyZmxvd0V2ZW50fFBhZ2VUcmFuc2l0aW9uRXZlbnR8UlRDRFRNRlRvbmVDaGFuZ2VFdmVudHxSVENEYXRhQ2hhbm5lbEV2ZW50fFJUQ0ljZUNhbmRpZGF0ZUV2ZW50fFNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnR8U3BlZWNoSW5wdXRFdmVudHxUcmFja0V2ZW50fFRyYW5zaXRpb25FdmVudHxXZWJHTENvbnRleHRFdmVudHxXZWJLaXRBbmltYXRpb25FdmVudHxXZWJLaXRUcmFuc2l0aW9uRXZlbnQ7RXZlbnQifSwKIFBaOnsKICJeIjoiR3Y7IiwKIGdJOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5rZChhKX0sCkBAIC05MDAyLDIwICs5MjEzLDIwIEBACiBZOTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsSC50UihjLDEpLGQpfSwKICRpc1BaOnRydWUsCiAiJSI6IjtFdmVudFRhcmdldCJ9LAotQW86eworYXNnOnsKICJeIjoiQm87TUI6Zm9ybT0sb2M6bmFtZSUsdDU6dHlwZT0iLAogIiUiOiJIVE1MRmllbGRTZXRFbGVtZW50In0sCiBoSDp7CiAiXiI6Ik80O29jOm5hbWU9IiwKICRpc2hIOnRydWUsCiAiJSI6IkZpbGUifSwKLUFhSTp7CituUzp7CiAiXiI6InJ6O3RUOmNvZGU9IiwKICIlIjoiRmlsZUVycm9yIn0sCiBqSDp7CiAiXiI6IkJvO0I6bGVuZ3RoPSxvYzpuYW1lJSxOOnRhcmdldCUiLAogIiUiOiJIVE1MRm9ybUVsZW1lbnQifSwKLXVzOnsKK2M0OnsKICJeIjoiR3Y7QjpsZW5ndGg9IiwKICIlIjoiSGlzdG9yeSJ9LAogeG5kOnsKQEAgLTkwNDQsMjkgKzkyNTUsMjkgQEAKIHNtazpmdW5jdGlvbihhLGIpe2EudGl0bGU9Yn0sCiAiJSI6IkhUTUxEb2N1bWVudCJ9LAogZko6ewotIl4iOiJyaztpbDpyZXNwb25zZVRleHQ9LHBmOnN0YXR1cz0iLAotZ245OmZ1bmN0aW9uKGEpe3JldHVybiBXLlBkKGEucmVzcG9uc2UpfSwKKyJeIjoid2FWO2lsOnJlc3BvbnNlVGV4dD0scGY6c3RhdHVzPSIsCitnYkE6ZnVuY3Rpb24oYSl7cmV0dXJuIFcuUGQoYS5yZXNwb25zZSl9LAogUjM6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiBhLm9wZW4oYixjLGQsZixlKX0sCiBlbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gYS5vcGVuKGIsYyxkKX0sCiB3UjpmdW5jdGlvbihhLGIpe3JldHVybiBhLnNlbmQoYil9LAogJGlzZko6dHJ1ZSwKICIlIjoiWE1MSHR0cFJlcXVlc3QifSwKLXJrOnsKK3dhVjp7CiAiXiI6IlBaOyIsCiAiJSI6IjtYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0In0sCiB0YkU6ewotIl4iOiJCbztmZzpoZWlnaHR9LG9jOm5hbWUlLFI6d2lkdGh9IiwKKyJeIjoiQm87Zmc6aGVpZ2h0JSxvYzpuYW1lJSxSOndpZHRofSIsCiAiJSI6IkhUTUxJRnJhbWVFbGVtZW50In0sCiBTZzp7CiAiXiI6Ikd2O1JuOmRhdGE9LGZnOmhlaWdodD0sUjp3aWR0aD0iLAogJGlzU2c6dHJ1ZSwKICIlIjoiSW1hZ2VEYXRhIn0sCiBTTDp7Ci0iXiI6IkJvO2ZnOmhlaWdodH0sUjp3aWR0aH0iLAorIl4iOiJCbztmZzpoZWlnaHQlLFI6d2lkdGh9IiwKIGozOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuY29tcGxldGUuJDEoYil9LAogIiUiOiJIVE1MSW1hZ2VFbGVtZW50In0sCiBNaTp7Ci0iXiI6IkJvO2Q0OmNoZWNrZWQlLE1COmZvcm09LGZnOmhlaWdodH0sang6bGlzdD0sb2M6bmFtZSUsdDU6dHlwZSUsUDp2YWx1ZSUsUjp3aWR0aH0iLAorIl4iOiJCbztkNDpjaGVja2VkJSxNQjpmb3JtPSxmZzpoZWlnaHQlLGp4Omxpc3Q9LG9jOm5hbWUlLHQ1OnR5cGUlLFA6dmFsdWUlLFI6d2lkdGh9IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYWNjZXB0LiQxKGIpfSwKICRpc01pOnRydWUsCiAkaXNoNDp0cnVlLApAQCAtOTA3OSw3ICs5MjkwLDcgQEAKIHR0SDp7CiAiXiI6IkJvO01COmZvcm09LG9jOm5hbWUlLHQ1OnR5cGU9IiwKICIlIjoiSFRNTEtleWdlbkVsZW1lbnQifSwKLXBMOnsKK0d4OnsKICJeIjoiQm87UDp2YWx1ZSUiLAogIiUiOiJIVE1MTElFbGVtZW50In0sCiBoaTp7CkBAIC05MDk0LDcgKzkzMDUsNyBAQAogdThyOnsKICJeIjoiR3Y7bUg6aHJlZj0sYUI6cHJvdG9jb2w9IiwKIFJFOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlbG9hZCgpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LCIkMCIsImdBWSIsMCwwLDY5XSwKICIlIjoiTG9jYXRpb24ifSwKIGpKOnsKICJeIjoiQm87b2M6bmFtZSUiLApAQCAtOTExNCw3ICs5MzI1LDcgQEAKIHdxOnsKICJeIjoiZWE7RzE6bWVzc2FnZT0iLAogIiUiOiJNZWRpYUtleUV2ZW50In0sCi1XNzp7CitmSm46ewogIl4iOiJlYTtHMTptZXNzYWdlPSIsCiAiJSI6Ik1lZGlhS2V5TWVzc2FnZUV2ZW50In0sCiBEODA6ewpAQCAtOTE0MCw3ICs5MzUxLDcgQEAKICIlIjoiTUlESU1lc3NhZ2VFdmVudCJ9LAogeXQ6ewogIl4iOiJJbXI7IiwKLWZaOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5zZW5kKGIsYyl9LAorRVo6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnNlbmQoYixjKX0sCiB3UjpmdW5jdGlvbihhLGIpe3JldHVybiBhLnNlbmQoYil9LAogIiUiOiJNSURJT3V0cHV0In0sCiBJbXI6ewpAQCAtOTE1Niw3ICs5MzY3LDcgQEAKIGVsc2V7aWYoIUoueChXLnFjKGEudGFyZ2V0KSkuJGlzaDQpdGhyb3cgSC5iKFAuZigib2Zmc2V0WCBpcyBvbmx5IHN1cHBvcnRlZCBvbiBlbGVtZW50cyIpKQogej1XLnFjKGEudGFyZ2V0KQogeT1ILlZNKG5ldyBQLmhMKGEuY2xpZW50WCxhLmNsaWVudFkpLFtudWxsXSkuVygwLEouakMoSi5tQih6KSkpCi1yZXR1cm4gSC5WTShuZXcgUC5oTChKLkl0KHkueCksSi5JdCh5LnkpKSxbbnVsbF0pfX0sCityZXR1cm4gSC5WTShuZXcgUC5oTChKLkhoKHkueCksSi5IaCh5LnkpKSxbbnVsbF0pfX0sCiAkaXNBalk6dHJ1ZSwKICIlIjoiRHJhZ0V2ZW50fE1TUG9pbnRlckV2ZW50fE1vdXNlRXZlbnR8TW91c2VTY3JvbGxFdmVudHxNb3VzZVdoZWVsRXZlbnR8UG9pbnRlckV2ZW50fFdoZWVsRXZlbnQifSwKIEg5OnsKQEAgLTkxNzEsOCArOTM4Miw5IEBACiB5LiQyKCJzdWJ0cmVlIixpKQogeS4kMigiYXR0cmlidXRlT2xkVmFsdWUiLGQpCiB5LiQyKCJjaGFyYWN0ZXJEYXRhT2xkVmFsdWUiLGcpCi15LiQyKCJhdHRyaWJ1dGVGaWx0ZXIiLGMpCitpZihjIT1udWxsKXkuJDIoImF0dHJpYnV0ZUZpbHRlciIsYykKIGEub2JzZXJ2ZShiLHopfSwKK09UOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5qaChhLGIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGMsbnVsbCl9LAogTVM6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuamgoYSxiLGMsbnVsbCxkLG51bGwsbnVsbCxudWxsLG51bGwpfSwKICIlIjoiTXV0YXRpb25PYnNlcnZlcnxXZWJLaXRNdXRhdGlvbk9ic2VydmVyIn0sCiBWdjp7CkBAIC05MTk2LDggKzk0MDgsOCBAQAogZm9yKHk9ei5jaGlsZE5vZGVzLmxlbmd0aCx4PTA7eDx5OysreClhLmluc2VydEJlZm9yZSh6LmZpcnN0Q2hpbGQsYyl9ZWxzZSBmb3Ioej16LmdBKGIpO3ouRygpOylhLmluc2VydEJlZm9yZSh6LmdsKCksYyl9LAogcGo6ZnVuY3Rpb24oYSl7dmFyIHoKIGZvcig7ej1hLmZpcnN0Q2hpbGQseiE9bnVsbDspYS5yZW1vdmVDaGlsZCh6KX0sCi1idTpmdW5jdGlvbihhKXt2YXIgej1hLm5vZGVWYWx1ZQotcmV0dXJuIHo9PW51bGw/Si5Hdi5wcm90b3R5cGUuYnUuY2FsbCh0aGlzLGEpOnp9LAorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PWEubm9kZVZhbHVlCityZXR1cm4gej09bnVsbD9KLkd2LnByb3RvdHlwZS5idS5jYWxsKHRoaXMsYSk6en0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbXg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChiKX0sCiB0ZzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbnRhaW5zKGIpfSwKIG1LOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5pbnNlcnRCZWZvcmUoYixjKX0sCkBAIC05MjI4LDcgKzk0NDAsNyBAQAogIl4iOiJCbzt0NTp0eXBlJSIsCiAiJSI6IkhUTUxPTGlzdEVsZW1lbnQifSwKIEc3Nzp7Ci0iXiI6IkJvO1JuOmRhdGE9LE1COmZvcm09LGZnOmhlaWdodH0sb2M6bmFtZSUsdDU6dHlwZSUsUjp3aWR0aH0iLAorIl4iOiJCbztSbjpkYXRhPSxNQjpmb3JtPSxmZzpoZWlnaHQlLG9jOm5hbWUlLHQ1OnR5cGUlLFI6d2lkdGh9IiwKICIlIjoiSFRNTE9iamVjdEVsZW1lbnQifSwKIHFXOnsKICJeIjoiQm87cGg6bGFiZWwlIiwKQEAgLTkyNTAsMzggKzk0NjIsMzUgQEAKIE1SOnsKICJeIjoiR3Y7dFQ6Y29kZT0sRzE6bWVzc2FnZT0iLAogIiUiOiJQb3NpdGlvbkVycm9yIn0sCi15Yjp7CitRbHM6ewogIl4iOiJueDtOOnRhcmdldD0iLAogIiUiOiJQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ifSwKIEtSOnsKICJeIjoiQm87UDp2YWx1ZSUiLAogIiUiOiJIVE1MUHJvZ3Jlc3NFbGVtZW50In0sCi1rZjp7Citldzc6ewogIl4iOiJlYTtveDpsb2FkZWQ9IiwKLSRpc2tmOnRydWUsCiskaXNldzc6dHJ1ZSwKICIlIjoiWE1MSHR0cFJlcXVlc3RQcm9ncmVzc0V2ZW50O1Byb2dyZXNzRXZlbnQifSwKIGJUOnsKLSJeIjoia2Y7TzM6dXJsPSIsCisiXiI6ImV3NztPMzp1cmw9IiwKICIlIjoiUmVzb3VyY2VQcm9ncmVzc0V2ZW50In0sCiBqMjQ6ewogIl4iOiJCbzt0NTp0eXBlJSIsCiAiJSI6IkhUTUxTY3JpcHRFbGVtZW50In0sCi1FYWc6ewotIl4iOiJlYTtiQTpsaW5lTnVtYmVyPSIsCi0iJSI6IlNlY3VyaXR5UG9saWN5VmlvbGF0aW9uRXZlbnQifSwKIHprOnsKICJeIjoiQm87TUI6Zm9ybT0sQjpsZW5ndGglLG9jOm5hbWUlLE1qOnNlbGVjdGVkSW5kZXglLHQ1OnR5cGU9LFA6dmFsdWUlIiwKICRpc3prOnRydWUsCiAiJSI6IkhUTUxTZWxlY3RFbGVtZW50In0sCiBJMDp7Ci0iXiI6IkFqOyIsCisiXiI6ImhzdzsiLAogS2I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5nZXRFbGVtZW50QnlJZChiKX0sCiAkaXNJMDp0cnVlLAogIiUiOiJTaGFkb3dSb290In0sCiB5TlY6ewogIl4iOiJCbzt0NTp0eXBlJSIsCiAiJSI6IkhUTUxTb3VyY2VFbGVtZW50In0sCi1TMjp7CitIZDp7CiAiXiI6ImVhO2tjOmVycm9yPSxHMTptZXNzYWdlPSIsCiAiJSI6IlNwZWVjaFJlY29nbml0aW9uRXJyb3IifSwKIHkwOnsKQEAgLTkyOTMsOSArOTUwMiwxMCBAQAogRzU6ewogIl4iOiJlYTtvYzpuYW1lPSIsCiAiJSI6IlNwZWVjaFN5bnRoZXNpc0V2ZW50In0sCi14aTp7CitBc1M6ewogIl4iOiJHdjsiLAogRlY6ZnVuY3Rpb24oYSxiKXtILmJRKGIsbmV3IFcuQUEoYSkpfSwKK3g0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0SXRlbShiKSE9bnVsbH0sCiB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0SXRlbShiKX0sCiB1OmZ1bmN0aW9uKGEsYixjKXthLnNldEl0ZW0oYixjKX0sCiBSejpmdW5jdGlvbihhLGIpe3ZhciB6PWEuZ2V0SXRlbShiKQpAQCAtOTMxOCw3ICs5NTI4LDcgQEAKICRpc1owOnRydWUsCiAkYXNaMDpmdW5jdGlvbigpe3JldHVybltQLnFVLFAucVVdfSwKICIlIjoiU3RvcmFnZSJ9LAota0k6eworS0w6ewogIl4iOiJlYTtHMzprZXk9LE8zOnVybD0iLAogIiUiOiJTdG9yYWdlRXZlbnQifSwKIGZxcTp7CkBAIC05MzQ5LDkgKzk1NTksOSBAQAogIl4iOiJueDsiLAogJGlzbXc6dHJ1ZSwKICIlIjoiQ0RBVEFTZWN0aW9ufFRleHQifSwKLUE1OnsKK0hSOnsKICJeIjoiQm87TUI6Zm9ybT0sb2M6bmFtZSUsdnA6cm93cz0sdDU6dHlwZT0sUDp2YWx1ZSUiLAotJGlzQTU6dHJ1ZSwKKyRpc0hSOnRydWUsCiAiJSI6IkhUTUxUZXh0QXJlYUVsZW1lbnQifSwKIFIwOnsKICJeIjoidzZPO1JuOmRhdGE9IiwKQEAgLTkzNjAsMTMgKzk1NzAsMTMgQEAKICJeIjoidzZPO1lLOmFsdEtleT0sRVg6Y3RybEtleT0sTmw6bWV0YUtleT0scXg6c2hpZnRLZXk9IiwKICIlIjoiVG91Y2hFdmVudCJ9LAogUkh0OnsKLSJeIjoiQm87Zlk6a2luZCUscGg6bGFiZWwlIiwKKyJeIjoiQm87Zlk6a2luZD0scGg6bGFiZWwlIiwKICIlIjoiSFRNTFRyYWNrRWxlbWVudCJ9LAogdzZPOnsKICJeIjoiZWE7IiwKICIlIjoiRm9jdXNFdmVudHxTVkdab29tRXZlbnQ7VUlFdmVudCJ9LAogU1c6ewotIl4iOiJlTDtmZzpoZWlnaHR9LFI6d2lkdGh9IiwKKyJeIjoiZUw7Zmc6aGVpZ2h0JSxSOndpZHRofSIsCiAiJSI6IkhUTUxWaWRlb0VsZW1lbnQifSwKIEVLVzp7CiAiXiI6IlBaO2FCOnByb3RvY29sPSxPMzp1cmw9IiwKQEAgLTkzODYsMTkgKzk1OTYsMTkgQEAKIHhPOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNsb3NlKCl9LAoga3I6ZnVuY3Rpb24oYSxiLGMsZCl7YS5wb3N0TWVzc2FnZShQLnBmKGIpLGMpCiByZXR1cm59LAotRDk6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmtyKGEsYixjLG51bGwpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRvU3RyaW5nKCl9LAorWDY6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmtyKGEsYixjLG51bGwpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnRXI6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IFcuUk8oYSxDLlUzLlBoLCExKSxbbnVsbF0pfSwKIGdMbTpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgVy5STyhhLEMuaTMuUGgsITEpLFtudWxsXSl9LAogJGlzSzU6dHJ1ZSwKICRpc1BaOnRydWUsCiAiJSI6IkRPTVdpbmRvd3xXaW5kb3cifSwKLVVNOnsKK0JuOnsKICJeIjoiS1Y7b2M6bmFtZT0sUDp2YWx1ZSUiLAogIiUiOiJBdHRyIn0sCiBvNTp7CiAiXiI6Ikd2O1FHOmJvdHRvbT0sZmc6aGVpZ2h0PSxCYjpsZWZ0PSxUODpyaWdodD0sRzY6dG9wPSxSOndpZHRoPSIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRoKSsiIHggIitILmQoYS5oZWlnaHQpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK0guZChhLmxlZnQpKyIsICIrSC5kKGEudG9wKSsiKSAiK0guZChhLndpZHRoKSsiIHggIitILmQoYS5oZWlnaHQpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQpAQCAtOTQzMCw3ICs5NjQwLDcgQEAKICJeIjoiQm87IiwKICRpc1BaOnRydWUsCiAiJSI6IkhUTUxGcmFtZVNldEVsZW1lbnQifSwKLXJoTTp7CitDeTp7CiAiXiI6ImtFSTsiLAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGVuZ3RofSwKIHQ6ZnVuY3Rpb24oYSxiKXt2YXIgej1hLmxlbmd0aApAQCAtOTQ4NSw5ICs5Njk1LDkgQEAKIGg6ZnVuY3Rpb24oYSxiKXt0aGlzLk1XLmFwcGVuZENoaWxkKGIpCiByZXR1cm4gYn0sCiBnQTpmdW5jdGlvbihhKXt2YXIgej10aGlzLmJyKHRoaXMpCi1yZXR1cm4gSC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pfSwKK3JldHVybiBILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSl9LAogRlY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5LcChiLDApXSkseT10aGlzLk1XO3ouRygpOyl5LmFwcGVuZENoaWxkKHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoYixiLmxlbmd0aCwwLG51bGwpLFtILk9xKGIsMCldKSx5PXRoaXMuTVc7ei5HKCk7KXkuYXBwZW5kQ2hpbGQoei5sbyl9LAogR1Q6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5mKCJDYW5ub3Qgc29ydCBlbGVtZW50IGxpc3RzIikpfSwKIEpkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkdUKGEsbnVsbCl9LAogTms6ZnVuY3Rpb24oYSxiKXt0aGlzLkpsKGIsITEpfSwKQEAgLTk0OTUsNyArOTcwNSw3IEBACiB6PXRoaXMuTVcKIGlmKGIpe3o9Si5NeCh6KQogeT16LmFkKHosbmV3IFcudE4oYSkpfWVsc2V7ej1KLk14KHopCi15PXouYWQoeixhKX1mb3Ioej1ILlZNKG5ldyBILk1vKEoubVkoeS5sNikseS5UNiksW0guS3AoeSwwKV0pLHg9ei5PSTt6LkcoKTspSi5NcCh4LmdsKCkpfSwKK3k9ei5hZCh6LGEpfWZvcih6PUguVk0obmV3IEguTW8oSi5tWSh5Lmw2KSx5LlQ2KSxbSC5PcSh5LDApXSkseD16Lk9JO3ouRygpOylKLk1wKHguZ2woKSl9LAogWVc6ZnVuY3Rpb24oYSxiLGMsZCxlKXt0aHJvdyBILmIoUC5TWShudWxsKSl9LAogekI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIHRoaXMuWVcoYSxiLGMsZCwwKX0sCiBSejpmdW5jdGlvbihhLGIpe3ZhciB6CkBAIC05NTE5LDExICs5NzI5LDExIEBACiBpZih6PT1udWxsKXRocm93IEguYihQLncoIk5vIGVsZW1lbnRzIikpCiByZXR1cm4gen0sCiAkYXNhcms6ZnVuY3Rpb24oKXtyZXR1cm5bVy5oNF19LAotJGFzRTloOmZ1bmN0aW9uKCl7cmV0dXJuW1cuaDRdfSwKKyRhc0lyOmZ1bmN0aW9uKCl7cmV0dXJuW1cuaDRdfSwKICRhc1dPOmZ1bmN0aW9uKCl7cmV0dXJuW1cuaDRdfSwKICRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1cuaDRdfX0sCiB0Tjp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLiQxKGEpIT09ITB9LAogJGlzRUg6dHJ1ZX0sCiBUUzp7CkBAIC05NTUxLDcgKzk3NjEsNyBAQAogei5VbihhLGIpCiByZXR1cm4gen19fSwKIHBOOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNoNH0sCiAkaXNFSDp0cnVlfSwKIFFJOnsKQEAgLTk1NjIsMTEgKzk3NzIsMTEgQEAKIERNOnsKICJeIjoia2Q7b2Y6WU88LG9mIiwKIHQ6ZnVuY3Rpb24oYSxiKXt2YXIgeix5Ci16PSQuVnAoKQorej0kLm5uKCkKIHk9Si5yWShiKQogaWYoei5ndmMoeikuRmIueDQoMCx5LmhjKGIpKSlpZihQLkY3KCk9PT0hMClyZXR1cm4gSC5WTShuZXcgVy5KRih0aGlzLllPLHoudCgwLHkuaGMoYikpLCExKSxbbnVsbF0pCiByZXR1cm4gSC5WTShuZXcgVy5KRih0aGlzLllPLGIsITEpLFtudWxsXSl9LAotc3RhdGljOnsiXiI6ImZEIn19LAorc3RhdGljOnsiXiI6ImZEWCJ9fSwKIFJBcDp7CiAiXiI6Ikd2K2xEOyIsCiAkaXNXTzp0cnVlLApAQCAtOTU4MiwxNSArOTc5MiwxNSBAQAogJGlzUVY6dHJ1ZSwKICRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfX0sCiBLeDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEoubE4oYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMzgsImNhbGwiXSwKKyJeIjoiVHBaOjEzOyIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEoubE4oYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDAsImNhbGwiXSwKICRpc0VIOnRydWV9LAogYlUyOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnNldFJlcXVlc3RIZWFkZXIoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGJVOnsKLSJeIjoiVHA6MTM7YixjIiwKKyJeIjoiVHBaOjEzO2IsYyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PXRoaXMuYwogeT16LnN0YXR1cwpAQCAtOTYwMiw3ICs5ODEyLDcgQEAKIHkuT0goeil9ZWxzZSB4LnBtKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBRUjp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe2lmKGIhPW51bGwpdGhpcy5hW2FdPWJ9LAogJGlzRUg6dHJ1ZX0sCiB3aTp7CkBAIC05NjEyLDcgKzk4MjIsNyBAQAogcmV0dXJuIHp9LAogaDpmdW5jdGlvbihhLGIpe3RoaXMuTkwuYXBwZW5kQ2hpbGQoYil9LAogRlY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5LcChiLDApXSkseT10aGlzLk5MO3ouRygpOyl5LmFwcGVuZENoaWxkKHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoYixiLmxlbmd0aCwwLG51bGwpLFtILk9xKGIsMCldKSx5PXRoaXMuTkw7ei5HKCk7KXkuYXBwZW5kQ2hpbGQoei5sbyl9LAogeGU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogaWYoYj50aGlzLk5MLmNoaWxkTm9kZXMubGVuZ3RoKXRocm93IEguYihQLlRFKGIsMCx0aGlzLmdCKHRoaXMpKSkKIHo9dGhpcy5OTApAQCAtOTY1Nyw3ICs5ODY3LDcgQEAKIHJldHVybiB6W2JdfSwKICRpc3dpOnRydWUsCiAkYXNhcms6ZnVuY3Rpb24oKXtyZXR1cm5bVy5LVl19LAotJGFzRTloOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfSwKKyRhc0lyOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfSwKICRhc1dPOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfSwKICRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfX0sCiBuTkw6ewpAQCAtOTY3NSwxNSArOTg4NSwxNSBAQAogJGlzUVY6dHJ1ZSwKICRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfX0sCiBBQTp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5zZXRJdGVtKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3UTp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucHVzaChhKX0sCiAkaXNFSDp0cnVlfSwKIHJzOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS5wdXNoKGIpfSwKICRpc0VIOnRydWV9LAogeW9vOnsKQEAgLTk3MTgsOSArOTkyOCw5IEBACiAiXiI6ImE7IiwKIEZWOmZ1bmN0aW9uKGEsYil7Si5NZShiLG5ldyBXLlpjKHRoaXMpKX0sCiBWMTpmdW5jdGlvbihhKXt2YXIgegotZm9yKHo9dGhpcy5ndmModGhpcyksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXRoaXMuUnooMCx6LmxvKX0sCitmb3Ioej10aGlzLmd2Yyh0aGlzKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspdGhpcy5SeigwLHoubG8pfSwKIGFOOmZ1bmN0aW9uKGEsYil7dmFyIHoseQotZm9yKHo9dGhpcy5ndmModGhpcyksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PXRoaXMuZ3ZjKHRoaXMpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOyl7eT16LmxvCiBiLiQyKHksdGhpcy50KDAseSkpfX0sCiBndmM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9dGhpcy5NVy5hdHRyaWJ1dGVzCkBAIC05NzM5LDcgKzk5NDksNyBAQAogJGlzWjA6dHJ1ZSwKICRhc1owOmZ1bmN0aW9uKCl7cmV0dXJuW1AucVUsUC5xVV19fSwKIFpjOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwKICRpc0VIOnRydWV9LAogRTk6ewpAQCAtOTc2MSw0NiArOTk3MSw0NiBAQAogcmV0dXJuIHp9LAogcDU6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1DLk5tLnpWKFAuRihhLCEwLG51bGwpLCIgIikKLWZvcih5PXRoaXMubjgseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSk7eS5HKCk7KUouUHcoeS5sbyx6KX0sCitmb3IoeT10aGlzLm44LHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pO3kuRygpOylKLlB3KHkubG8seil9LAogT1M6ZnVuY3Rpb24oYSl7dGhpcy5LZC5hTigwLG5ldyBXLkp0KGEpKX0sCi1SejpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlE2KG5ldyBXLkExKGIpKX0sCitSejpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlE2KG5ldyBXLm1hKGIpKX0sCiBRNjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LZC5lcygwLCExLG5ldyBXLmhEKGEpKX0sCiB5SjpmdW5jdGlvbihhKXt0aGlzLktkPUguVk0obmV3IEguQTgoUC5GKHRoaXMubjgsITAsbnVsbCksbmV3IFcuWHcoKSksW251bGwsbnVsbF0pfSwKIHN0YXRpYzp7b3I6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFcuaFooYSxudWxsKQogei55SihhKQogcmV0dXJuIHp9fX0sCiBYdzp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBuZXcgVy5JNChhKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogcW06ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5GVigwLGEubEYoKSl9LAogJGlzRUg6dHJ1ZX0sCiBKdDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5PUyh0aGlzLmEpfSwKICRpc0VIOnRydWV9LAotQTE6ewotIl4iOiJUcDoxMzthIiwKK21hOnsKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVjEoYSx0aGlzLmEpfSwKICRpc0VIOnRydWV9LAogaEQ6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLiQxKGIpPT09ITB8fGE9PT0hMH0sCiAkaXNFSDp0cnVlfSwKIEk0OnsKICJeIjoiQXMzO01XIiwKIGxGOmZ1bmN0aW9uKCl7dmFyIHoseSx4CiB6PVAuTHMobnVsbCxudWxsLG51bGwsUC5xVSkKLWZvcih5PUoudWYodGhpcy5NVykuc3BsaXQoIiAiKSx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILktwKHksMCldKTt5LkcoKTspe3g9Si5ycih5LmxvKQorZm9yKHk9Si51Zih0aGlzLk1XKS5zcGxpdCgiICIpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pO3kuRygpOyl7eD1KLnJyKHkubG8pCiBpZih4Lmxlbmd0aCE9PTApei5oKDAseCl9cmV0dXJuIHp9LAogcDU6ZnVuY3Rpb24oYSl7UC5GKGEsITAsbnVsbCkKIEouUHcodGhpcy5NVyxhLnpWKDAsIiAiKSl9fSwKIEZrTzp7CiAiXiI6ImE7UGgiLAotZW46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgVy5STyhhLHRoaXMuUGgsYiksW251bGxdKX0sCi1MWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lbihhLCExKX19LAorRFQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgVy5STyhhLHRoaXMuUGgsYiksW251bGxdKX0sCitMWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5EVChhLCExKX19LAogUk86ewogIl4iOiJ3UztESyxQaCxTZyIsCiBLUjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1uZXcgVy5PdigwLHRoaXMuREssdGhpcy5QaCxXLmFGKGEpLHRoaXMuU2cpCkBAIC05ODE1LDQwICsxMDAyNSw0MCBAQAogcmV0dXJuIEguVk0obmV3IFAuYzkobmV3IFcucmcoYikseiksW0guaXAoeiwid1MiLDApLG51bGxdKX0sCiAkaXN3Uzp0cnVlfSwKIGllOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlNvKEoubDIoYSksdGhpcy5hKX0sCiAkaXNFSDp0cnVlfSwKIHJnOnsKLSJeIjoiVHA6MTM7YiIsCisiXiI6IlRwWjoxMztiIiwKICQxOltmdW5jdGlvbihhKXtKLnFkKGEsdGhpcy5iKQogcmV0dXJuIGF9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFVjOnsKICJeIjoid1M7UXgsU2csUGgiLAotV086ZnVuY3Rpb24oYSxiKXt2YXIgej1ILlZNKG5ldyBQLm5PKG5ldyBXLmIwKGIpLHRoaXMpLFtILmlwKHRoaXMsIndTIiwwKV0pCi1yZXR1cm4gSC5WTShuZXcgUC5jOShuZXcgVy5IYihiKSx6KSxbSC5pcCh6LCJ3UyIsMCksbnVsbF0pfSwKK1dPOmZ1bmN0aW9uKGEsYil7dmFyIHo9SC5WTShuZXcgUC5uTyhuZXcgVy5IYihiKSx0aGlzKSxbSC5pcCh0aGlzLCJ3UyIsMCldKQorcmV0dXJuIEguVk0obmV3IFAuYzkobmV3IFcuaU5EKGIpLHopLFtILmlwKHosIndTIiwwKSxudWxsXSl9LAogS1I6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdgotej1ILlZNKG5ldyBXLnFPKG51bGwsUC5MNShudWxsLG51bGwsbnVsbCxbUC53UyxudWxsXSxbUC5NTyxudWxsXSkpLFtudWxsXSkKK3o9SC5WTShuZXcgVy5xTyhudWxsLFAuTDUobnVsbCxudWxsLG51bGwsW1Aud1MsbnVsbF0sW1AueVgsbnVsbF0pKSxbbnVsbF0pCiB6LnhkKG51bGwpCiBmb3IoeT10aGlzLlF4LHk9eS5nQSh5KSx4PXRoaXMuUGgsdz10aGlzLlNnO3kuRygpOyl7dj1uZXcgVy5STyh5LmxvLHgsdykKIHYuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KIHouaCgwLHYpfXk9ei5wWQogeS50b1N0cmluZwotcmV0dXJuIEguVk0obmV3IFAuSWsoeSksW0guS3AoeSwwKV0pLktSKGEsYixjLGQpfSwKK3JldHVybiBILlZNKG5ldyBQLklrKHkpLFtILk9xKHksMCldKS5LUihhLGIsYyxkKX0sCiB6QzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuS1IoYSxudWxsLGIsYyl9LAogeUk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS1IoYSxudWxsLG51bGwsbnVsbCl9LAogJGlzd1M6dHJ1ZX0sCi1iMDp7Ci0iXiI6IlRwOjEzO2EiLAorSGI6eworIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5TbyhKLmwyKGEpLHRoaXMuYSl9LAogJGlzRUg6dHJ1ZX0sCi1IYjp7Ci0iXiI6IlRwOjEzO2IiLAoraU5EOnsKKyJeIjoiVHBaOjEzO2IiLAogJDE6W2Z1bmN0aW9uKGEpe0oucWQoYSx0aGlzLmIpCiByZXR1cm4gYX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogT3Y6ewotIl4iOiJNTztWUCxESyxQaCx1NyxTZyIsCisiXiI6InlYO1ZQLERLLFBoLHU3LFNnIiwKIGVkOmZ1bmN0aW9uKCl7aWYodGhpcy5ESz09bnVsbClyZXR1cm4KIHRoaXMuTnMoKQogdGhpcy5ESz1udWxsCkBAIC05ODU2LDcgKzEwMDY2LDcgQEAKIHJldHVybn0sCiBGdjpbZnVuY3Rpb24oYSxiKXtpZih0aGlzLkRLPT1udWxsKXJldHVybjsrK3RoaXMuVlAKIHRoaXMuTnMoKQotaWYoYiE9bnVsbCliLllNKHRoaXMuZ0RRKHRoaXMpKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnYoYSxudWxsKX0sInl5IiwiJDEiLCIkMCIsImdYMCIsMCwyLDEyNSwyMywxMjZdLAoraWYoYiE9bnVsbCliLllNKHRoaXMuZ0RRKHRoaXMpKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnYoYSxudWxsKX0sInl5IiwiJDEiLCIkMCIsImdYMCIsMCwyLDEyNiwyMywxMjddLAogZ1VGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVlA+MH0sCiBRRTpbZnVuY3Rpb24oYSl7aWYodGhpcy5ESz09bnVsbHx8dGhpcy5WUDw9MClyZXR1cm47LS10aGlzLlZQCiB0aGlzLlp6KCl9LCIkMCIsImdEUSIsMCwwLDE4XSwKQEAgLTk4NzQsMTIgKzEwMDg0LDEyIEBACiBSejpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMudVouUnooMCxiKQogaWYoeiE9bnVsbCl6LmVkKCl9LAogeE86W2Z1bmN0aW9uKGEpe3ZhciB6LHkKLWZvcih6PXRoaXMudVoseT16LmdVUSh6KSx5PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHkubDYpLHkuVDYpLFtILktwKHksMCksSC5LcCh5LDEpXSk7eS5HKCk7KXkubG8uZWQoKQorZm9yKHo9dGhpcy51Wix5PXouZ1VRKHopLHk9SC5WTShuZXcgSC5NSChudWxsLEoubVkoeS5sNikseS5UNiksW0guT3EoeSwwKSxILk9xKHksMSldKTt5LkcoKTspeS5sby5lZCgpCiB6LlYxKDApCiB0aGlzLnBZLnhPKDApfSwiJDAiLCJnUUYiLDAsMCwxOF0sCiB4ZDpmdW5jdGlvbihhKXt0aGlzLnBZPVAuYksodGhpcy5nUUYodGhpcyksbnVsbCwhMCxhKX19LAogclc6ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuUnooMCx0aGlzLmIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogR206ewpAQCAtOTk0Miw3ICsxMDE1Miw3IEBACiByZXR1cm4hMX0sCiBnbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlFafX0sCiB6Wjp7Ci0iXiI6IlRwOjEzO2EsYiIsCisiXiI6IlRwWjoxMzthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PUguVmEodGhpcy5iKQogT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsaW5pdC5kaXNwYXRjaFByb3BlcnR5TmFtZSx7dmFsdWU6eixlbnVtZXJhYmxlOmZhbHNlLHdyaXRhYmxlOnRydWUsY29uZmlndXJhYmxlOnRydWV9KQogYS5jb25zdHJ1Y3Rvcj1hLl9fcHJvdG9fXy5jb25zdHJ1Y3RvcgpAQCAtOTk1NCw3ICsxMDE2NCw3IEBACiBnZVQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFcuUDEodGhpcy5VaS5wYXJlbnQpfSwKIHhPOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlVpLmNsb3NlKCl9LAoga3I6ZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5VaS5wb3N0TWVzc2FnZShQLnBmKGIpLGMpfSwKLUQ5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5rcihhLGIsYyxudWxsKX0sCitYNjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMua3IoYSxiLGMsbnVsbCl9LAogZ0k6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudmgoUC5mKCJZb3UgY2FuIG9ubHkgYXR0YWNoIEV2ZW50TGlzdGVuZXJzIHRvIHlvdXIgb3duIHdpbmRvdy4iKSl9LAogWWI6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEgudmgoUC5mKCJZb3UgY2FuIG9ubHkgYXR0YWNoIEV2ZW50TGlzdGVuZXJzIHRvIHlvdXIgb3duIHdpbmRvdy4iKSl9LAogWTk6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEgudmgoUC5mKCJZb3UgY2FuIG9ubHkgYXR0YWNoIEV2ZW50TGlzdGVuZXJzIHRvIHlvdXIgb3duIHdpbmRvdy4iKSl9LApAQCAtOTk3OCw4MiArMTAxODgsODIgQEAKICJeIjoiUmM7bUg6aHJlZj0iLAogIiUiOiJTVkdBbHRHbHlwaEVsZW1lbnQifSwKIGVHOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVCbGVuZEVsZW1lbnQifSwKLWJkOnsKLSJeIjoiZDVHO3Q1OnR5cGU9LFVROnZhbHVlcz0seUc6cmVzdWx0PSx4PSx5PSIsCitsdnI6eworIl4iOiJkNUc7dDU6dHlwZT0sVVE6dmFsdWVzPSxmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRUNvbG9yTWF0cml4RWxlbWVudCJ9LAogcGZjOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVDb21wb25lbnRUcmFuc2ZlckVsZW1lbnQifSwKIG5ROnsKLSJeIjoiZDVHO2twOm9wZXJhdG9yPSx5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2twOm9wZXJhdG9yPSxmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRUNvbXBvc2l0ZUVsZW1lbnQifSwKIEVmRTp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFQ29udm9sdmVNYXRyaXhFbGVtZW50In0sCiBtQ3o6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRURpZmZ1c2VMaWdodGluZ0VsZW1lbnQifSwKIHdmdTp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFRGlzcGxhY2VtZW50TWFwRWxlbWVudCJ9LAotaGE6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSIsCitpaEg6eworIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVGbG9vZEVsZW1lbnQifSwKIHltOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVHYXVzc2lhbkJsdXJFbGVtZW50In0sCiBtZUk6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSxtSDpocmVmPSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0sbUg6aHJlZj0iLAogIiUiOiJTVkdGRUltYWdlRWxlbWVudCJ9LAogb0JXOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVNZXJnZUVsZW1lbnQifSwKIHdDOnsKLSJeIjoiZDVHO2twOm9wZXJhdG9yPSx5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2twOm9wZXJhdG9yPSxmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRU1vcnBob2xvZ3lFbGVtZW50In0sCiBMajp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFT2Zmc2V0RWxlbWVudCJ9LAogVWJyOnsKICJeIjoiZDVHO3g9LHk9IiwKICIlIjoiU1ZHRkVQb2ludExpZ2h0RWxlbWVudCJ9LAogYk1COnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVTcGVjdWxhckxpZ2h0aW5nRWxlbWVudCJ9LAogcFE6ewogIl4iOiJkNUc7eD0seT0iLAogIiUiOiJTVkdGRVNwb3RMaWdodEVsZW1lbnQifSwKIEhYOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVUaWxlRWxlbWVudCJ9LAogRnU6ewotIl4iOiJkNUc7dDU6dHlwZT0seUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1Rzt0NTp0eXBlPSxmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRVR1cmJ1bGVuY2VFbGVtZW50In0sCiBPRTU6ewotIl4iOiJkNUc7eD0seT0sbUg6aHJlZj0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx4PSx5PSxtSDpocmVmPSIsCiAiJSI6IlNWR0ZpbHRlckVsZW1lbnQifSwKIE45OnsKLSJeIjoidHByO3g9LHk9IiwKKyJeIjoidHByO2ZnOmhlaWdodD0seD0seT0iLAogIiUiOiJTVkdGb3JlaWduT2JqZWN0RWxlbWVudCJ9LAotZDBEOnsKK2VuOnsKICJeIjoidHByOyIsCiAiJSI6IlNWR0NpcmNsZUVsZW1lbnR8U1ZHRWxsaXBzZUVsZW1lbnR8U1ZHTGluZUVsZW1lbnR8U1ZHUGF0aEVsZW1lbnR8U1ZHUG9seWdvbkVsZW1lbnR8U1ZHUG9seWxpbmVFbGVtZW50O1NWR0dlb21ldHJ5RWxlbWVudCJ9LAogdHByOnsKICJeIjoiZDVHOyIsCiAiJSI6IlNWR0NsaXBQYXRoRWxlbWVudHxTVkdEZWZzRWxlbWVudHxTVkdHRWxlbWVudHxTVkdTd2l0Y2hFbGVtZW50O1NWR0dyYXBoaWNzRWxlbWVudCJ9LAogcEF2OnsKLSJeIjoidHByO3g9LHk9LG1IOmhyZWY9IiwKKyJeIjoidHByO2ZnOmhlaWdodD0seD0seT0sbUg6aHJlZj0iLAogIiUiOiJTVkdJbWFnZUVsZW1lbnQifSwKIE5CWjp7Ci0iXiI6ImQ1Rzt4PSx5PSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHg9LHk9IiwKICIlIjoiU1ZHTWFza0VsZW1lbnQifSwKIEdyNTp7Ci0iXiI6ImQ1Rzt4PSx5PSxtSDpocmVmPSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHg9LHk9LG1IOmhyZWY9IiwKICIlIjoiU1ZHUGF0dGVybkVsZW1lbnQifSwKIGZROnsKLSJeIjoiZDBEO3g9LHk9IiwKKyJeIjoiZW47Zmc6aGVpZ2h0PSx4PSx5PSIsCiAiJSI6IlNWR1JlY3RFbGVtZW50In0sCiBxSVI6ewogIl4iOiJkNUc7dDU6dHlwZSUsbUg6aHJlZj0iLApAQCAtMTAwNzQsOSArMTAyODQsOSBAQAogZ2YwOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBXLkpGKGEsQy5LcS5QaCwhMSksW251bGxdKX0sCiAkaXNQWjp0cnVlLAogIiUiOiJTVkdBbHRHbHlwaERlZkVsZW1lbnR8U1ZHQWx0R2x5cGhJdGVtRWxlbWVudHxTVkdBbmltYXRlRWxlbWVudHxTVkdBbmltYXRlTW90aW9uRWxlbWVudHxTVkdBbmltYXRlVHJhbnNmb3JtRWxlbWVudHxTVkdBbmltYXRpb25FbGVtZW50fFNWR0NvbXBvbmVudFRyYW5zZmVyRnVuY3Rpb25FbGVtZW50fFNWR0N1cnNvckVsZW1lbnR8U1ZHRGVzY0VsZW1lbnR8U1ZHRGlzY2FyZEVsZW1lbnR8U1ZHRkVEaXN0YW50TGlnaHRFbGVtZW50fFNWR0ZFRHJvcFNoYWRvd0VsZW1lbnR8U1ZHRkVGdW5jQUVsZW1lbnR8U1ZHRkVGdW5jQkVsZW1lbnR8U1ZHRkVGdW5jR0VsZW1lbnR8U1ZHRkVGdW5jUkVsZW1lbnR8U1ZHRkVNZXJnZU5vZGVFbGVtZW50fFNWR0ZvbnRFbGVtZW50fFNWR0ZvbnRGYWNlRWxlbWVudHxTVkdGb250RmFjZUZvcm1hdEVsZW1lbnR8U1ZHRm9udEZhY2VOYW1lRWxlbWVudHxTVkdGb250RmFjZVNyY0VsZW1lbnR8U1ZHRm9udEZhY2VVcmlFbGVtZW50fFNWR0dseXBoRWxlbWVudHxTVkdHbHlwaFJlZkVsZW1lbnR8U1ZHSEtlcm5FbGVtZW50fFNWR01QYXRoRWxlbWVudHxTVkdNYXJrZXJFbGVtZW50fFNWR01ldGFkYXRhRWxlbWVudHxTVkdNaXNzaW5nR2x5cGhFbGVtZW50fFNWR1NldEVsZW1lbnR8U1ZHU3RvcEVsZW1lbnR8U1ZHU3ltYm9sRWxlbWVudHxTVkdUaXRsZUVsZW1lbnR8U1ZHVktlcm5FbGVtZW50fFNWR1ZpZXdFbGVtZW50O1NWR0VsZW1lbnQiLAotc3RhdGljOnsiXiI6IkpRPCJ9fSwKK3N0YXRpYzp7Il4iOiJTSDwifX0sCiBoeTp7Ci0iXiI6InRwcjt4PSx5PSIsCisiXiI6InRwcjtmZzpoZWlnaHQ9LHg9LHk9IiwKIEtiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0RWxlbWVudEJ5SWQoYil9LAogJGlzaHk6dHJ1ZSwKICIlIjoiU1ZHU1ZHRWxlbWVudCJ9LApAQCAtMTAwOTAsNyArMTAzMDAsNyBAQAogIl4iOiJtSHE7eD0seT0iLAogIiUiOiJTVkdUU3BhbkVsZW1lbnR8U1ZHVGV4dEVsZW1lbnQ7U1ZHVGV4dFBvc2l0aW9uaW5nRWxlbWVudCJ9LAogY2k6ewotIl4iOiJ0cHI7eD0seT0sbUg6aHJlZj0iLAorIl4iOiJ0cHI7Zmc6aGVpZ2h0PSx4PSx5PSxtSDpocmVmPSIsCiAiJSI6IlNWR1VzZUVsZW1lbnQifSwKIGN1VTp7CiAiXiI6ImQ1RzttSDpocmVmPSIsCkBAIC0xMDEwMSw3ICsxMDMxMSw3IEBACiB6PXRoaXMuTE8uZ2V0QXR0cmlidXRlKCJjbGFzcyIpCiB5PVAuTHMobnVsbCxudWxsLG51bGwsUC5xVSkKIGlmKHo9PW51bGwpcmV0dXJuIHkKLWZvcih4PXouc3BsaXQoIiAiKSx4PUguVk0obmV3IEguYTcoeCx4Lmxlbmd0aCwwLG51bGwpLFtILktwKHgsMCldKTt4LkcoKTspe3c9Si5ycih4LmxvKQorZm9yKHg9ei5zcGxpdCgiICIpLHg9SC5WTShuZXcgSC5hNyh4LHgubGVuZ3RoLDAsbnVsbCksW0guT3EoeCwwKV0pO3guRygpOyl7dz1KLnJyKHgubG8pCiBpZih3Lmxlbmd0aCE9PTApeS5oKDAsdyl9cmV0dXJuIHl9LAogcDU6ZnVuY3Rpb24oYSl7dGhpcy5MTy5zZXRBdHRyaWJ1dGUoImNsYXNzIixhLnpWKDAsIiAiKSl9fX1dLFsiZGFydC5kb20ud2ViX3NxbCIsImRhcnQ6d2ViX3NxbCIsLFAsewogIl4iOiIiLApAQCAtMTAxMDksNyArMTAzMTksNyBAQAogIl4iOiJHdjt0VDpjb2RlPSxHMTptZXNzYWdlPSIsCiAiJSI6IlNRTEVycm9yIn19XSxbImRhcnQuaXNvbGF0ZSIsImRhcnQ6aXNvbGF0ZSIsLFAsewogIl4iOiIiLAotaE06ZnVuY3Rpb24oKXt2YXIgeix5LHgKK2F0OmZ1bmN0aW9uKCl7dmFyIHoseSx4CiB6PSQuVnoKICQuVno9eisxCiB5PW5ldyBILnlvKHosbnVsbCwhMSkKQEAgLTEwMTE5LDE2ICsxMDMyOSwxNiBAQAogeD1uZXcgSC5mYyh5LG51bGwpCiB4LlRMKHkpCiByZXR1cm4geH0sCi1YWTp7CitocTp7CiAiXiI6ImE7IiwKLSRpc1hZOnRydWUsCiskaXNocTp0cnVlLAogc3RhdGljOntOMzpmdW5jdGlvbigpe3JldHVybiBuZXcgSC5pVigoTWF0aC5yYW5kb20oKSoweDEwMDAwMDAwMD4+PjApKyhNYXRoLnJhbmRvbSgpKjB4MTAwMDAwMDAwPj4+MCkqNDI5NDk2NzI5Nil9fX19XSxbImRhcnQuanMiLCJkYXJ0OmpzIiwsUCx7CiAiXiI6IiIsCiB4WjpmdW5jdGlvbihhLGIpe3JldHVybiBmdW5jdGlvbihjLGQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGMoZCxlLHRoaXMsQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGFyZ3VtZW50cykpfX0oUC5SNCxhLGIpfSwKIFI0OltmdW5jdGlvbihhLGIsYyxkKXt2YXIgegogaWYoYj09PSEwKXt6PVtjXQogQy5ObS5GVih6LGQpCi1kPXp9cmV0dXJuIFAud1koSC5lQyhhLFAuRihKLmtsKGQsUC5YbCgpKSwhMCxudWxsKSxQLlRlKG51bGwpKSl9LCIkNCIsIkd4Iiw4LDAsbnVsbCw0MSw1OSwyNyw2MF0sCitkPXp9cmV0dXJuIFAud1koSC5lQyhhLFAuRihKLmtsKGQsUC5YbCgpKSwhMCxudWxsKSxQLlRlKG51bGwpKSl9LCIkNCIsInFIIiw4LDAsbnVsbCw0MSw1OSwyNyw2MF0sCiBEbTpmdW5jdGlvbihhLGIsYyl7dmFyIHoKIGlmKE9iamVjdC5pc0V4dGVuc2libGUoYSkpdHJ5e09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOmN9KQogcmV0dXJuITB9Y2F0Y2goeil7SC5SdSh6KX1yZXR1cm4hMX0sCkBAIC0xMDE3MCwxMCArMTAzODAsMTAgQEAKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCiByZXR1cm4hIUoueChiKS4kaXNFNCYmdGhpcy5laD09PWIuZWh9LAogRWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEgaW4gdGhpcy5laH0sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseQogdHJ5e3o9U3RyaW5nKHRoaXMuZWgpCiByZXR1cm4gen1jYXRjaCh5KXtILlJ1KHkpCi1yZXR1cm4gUC5hLnByb3RvdHlwZS5idS5jYWxsKHRoaXMsdGhpcyl9fSwKK3JldHVybiBQLmEucHJvdG90eXBlLmJ1LmNhbGwodGhpcyx0aGlzKX19LCIkMCIsImdBWSIsMCwwLDY5XSwKIFY3OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej10aGlzLmVoCiB5PWI9PW51bGw/bnVsbDpQLkYoSC5WTShuZXcgSC5BOChiLFAuRW4oKSksW251bGwsbnVsbF0pLCEwLG51bGwpCkBAIC0xMDE4NywxMCArMTAzOTcsMTAgQEAKIEMuTm0uRlYoeSxILlZNKG5ldyBILkE4KGIsUC5FbigpKSxbbnVsbCxudWxsXSkpCiB4PXouYmluZC5hcHBseSh6LHkpCiBTdHJpbmcoeCkKLXJldHVybiBQLk5EKG5ldyB4KCkpfSxIVTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXRocm93IEguYihQLnUoIm9iamVjdCBjYW5ub3QgYmUgYSBudW0sIHN0cmluZywgYm9vbCwgb3IgbnVsbCIpKQorcmV0dXJuIFAuTkQobmV3IHgoKSl9LFhZOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpdGhyb3cgSC5iKFAudSgib2JqZWN0IGNhbm5vdCBiZSBhIG51bSwgc3RyaW5nLCBib29sLCBvciBudWxsIikpCiByZXR1cm4gUC5ORChQLndZKGEpKX0salQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuTkQoUC5NMChhKSl9LE0wOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5YYihQLlJOKG51bGwsbnVsbCkpLiQxKGEpfX19LAogWGI6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5hCiBpZih6Lng0KDAsYSkpcmV0dXJuIHoudCgwLGEpCkBAIC0xMDIxMiw3ICsxMDQyMiw3IEBACiBQTzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5xUChhLG51bGwpfSwKICRpc3I3OnRydWUsCiBzdGF0aWM6e210OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhQLnhaKGEsITApKX19fSwKLVR6OnsKK0dEOnsKICJeIjoiV2tGO2VoIiwKIHQ6ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYodHlwZW9mIGI9PT0ibnVtYmVyIiYmYj09PUMuQ0QueXUoYikpe2lmKHR5cGVvZiBiPT09Im51bWJlciImJk1hdGguZmxvb3IoYik9PT1iKXo9YjwwfHxiPj10aGlzLmdCKHRoaXMpCkBAIC0xMDI1NSwyNSArMTA0NjUsMjUgQEAKICRpc1FWOnRydWUsCiAkYXNRVjpudWxsfSwKIERWOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej1QLnhaKGEsITEpCiBQLkRtKHosJC5EcCgpLGEpCiByZXR1cm4gen0sCiAkaXNFSDp0cnVlfSwKIEhwOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgdGhpcy5hKGEpfSwKICRpc0VIOnRydWV9LAogTno6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yNyhhKX0sCiAkaXNFSDp0cnVlfSwKIEpkOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBQLlR6KGEpLFtudWxsXSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBQLkdEKGEpLFtudWxsXSl9LAogJGlzRUg6dHJ1ZX0sCiBRUzp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLkU0KGEpfSwKICRpc0VIOnRydWV9fV0sWyJkYXJ0Lm1hdGgiLCJkYXJ0Om1hdGgiLCxQLHsKICJeIjoiIiwKQEAgLTEwMzA1LDcgKzEwNTE1LDcgQEAKICJeIjoiYTsiLAogajE6ZnVuY3Rpb24oYSl7aWYoYTw9MHx8YT40Mjk0OTY3Mjk2KXRocm93IEguYihQLktQKCJtYXggbXVzdCBiZSBpbiByYW5nZSAwIDwgbWF4IFx1MjI2NCAyXjMyLCB3YXMgIithKSkKIHJldHVybiBNYXRoLnJhbmRvbSgpKmE+Pj4wfX0sCi12WTp7CitraDp7CiAiXiI6ImE7TmQsaWkiLAogaHY6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUKIHo9dGhpcy5OZApAQCAtMTAzMjUsNyArMTA1MzUsNyBAQAogeT10aGlzLk5kCiB4PXklYX13aGlsZSh5LXgrYT49NDI5NDk2NzI5NikKIHJldHVybiB4fSwKLUpLOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKK21mOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9Si51NihhLDApPy0xOjAKIGRve3k9Si5XeChhKQogeD15LmkoYSw0Mjk0OTY3Mjk1KQpAQCAtMTAzNTksMTIgKzEwNTY5LDEyIEBACiB0aGlzLmh2KCkKIHRoaXMuaHYoKQogdGhpcy5odigpfSwKLXN0YXRpYzp7Il4iOiJ0Z00sUFppLEpZVSIsbjI6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAudlkoMCwwKQotei5KSyhhKQorc3RhdGljOnsiXiI6InRnTSxQWmksSllVIixOaDpmdW5jdGlvbihhKXt2YXIgej1uZXcgUC5raCgwLDApCit6Lm1mKGEpCiByZXR1cm4gen19fSwKIGhMOnsKICJeIjoiYTt4Pix5PiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iUG9pbnQoIitILmQodGhpcy54KSsiLCAiK0guZCh0aGlzLnkpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlBvaW50KCIrSC5kKHRoaXMueCkrIiwgIitILmQodGhpcy55KSsiKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiBpZihiPT1udWxsKXJldHVybiExCiBpZighSi54KGIpLiRpc2hMKXJldHVybiExCkBAIC0xMDQxOSw3ICsxMDYyOSw3IEBACiAiXiI6ImE7IiwKIGdUODpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nQmIodGhpcykrdGhpcy5SfSwKIGdRRzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nRzYodGhpcykrdGhpcy5mZ30sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK3RoaXMuZ0JiKHRoaXMpKyIsICIrdGhpcy5HNisiKSAiK3RoaXMuUisiIHggIit0aGlzLmZnfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iUmVjdGFuZ2xlICgiK3RoaXMuZ0JiKHRoaXMpKyIsICIrdGhpcy5HNisiKSAiK3RoaXMuUisiIHggIit0aGlzLmZnfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKQEAgLTEwNDYyLDIwICsxMDY3MiwyMSBAQAogdTpmdW5jdGlvbihhLGIsYyl7dGhpcy5ScC51KDAsYixjKX0sCiBGVjpmdW5jdGlvbihhLGIpe3RoaXMuUnAuRlYoMCxiKX0sCiBWMTpmdW5jdGlvbihhKXt0aGlzLlJwLlYxKDApfSwKK3g0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUnAueDQoMCxiKX0sCiBhTjpmdW5jdGlvbihhLGIpe3RoaXMuUnAuYU4oMCxiKX0sCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUnAuWDU9PT0wfSwKIGdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ScC5YNSE9PTB9LAogZ3ZjOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuUnAKLXJldHVybiBILlZNKG5ldyBQLmk1KHopLFtILktwKHosMCldKX0sCityZXR1cm4gSC5WTShuZXcgUC5pNSh6KSxbSC5PcSh6LDApXSl9LAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUnAuWDV9LAogUno6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ScC5SeigwLGIpfSwKIGdVUTpmdW5jdGlvbihhKXt2YXIgej10aGlzLlJwCiByZXR1cm4gei5nVVEoeil9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcy5ScCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMuUnApfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNaMDp0cnVlLAogJGFzWjA6bnVsbH19XSxbImRhcnQudHlwZWRfZGF0YS5pbXBsZW1lbnRhdGlvbiIsImRhcnQ6X25hdGl2ZV90eXBlZF9kYXRhIiwsSCx7CiAiXiI6IiIsCi1pYzpmdW5jdGlvbihhKXthLnRvU3RyaW5nCittNjpmdW5jdGlvbihhKXthLnRvU3RyaW5nCiByZXR1cm4gYX0sCiBqWk46ZnVuY3Rpb24oYSl7YS50b1N0cmluZwogcmV0dXJuIGF9LApAQCAtMTA1ODAsOSArMTA3OTEsOSBAQAogJGFzUVY6ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19LAogJGlzQVM6dHJ1ZSwKICIlIjoiSW50OEFycmF5In0sCi13ZkY6eworcGQ6ewogIl4iOiJQZzsiLAotZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBDLk01fSwKK2dieDpmdW5jdGlvbihhKXtyZXR1cm4gQy5vWn0sCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHo9YS5sZW5ndGgKIGlmKGI+Pj4wIT09Ynx8Yj49eil0aGlzLkoyKGEsYix6KQogcmV0dXJuIGFbYl19LApAQCAtMTA2MzEsNyArMTA4NDIsNyBAQAogIiUiOiJDYW52YXNQaXhlbEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5In0sCiBWNjp7CiAiXiI6IlBnOyIsCi1nYng6ZnVuY3Rpb24oYSl7cmV0dXJuIEMuSEN9LAorZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBDLldyfSwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHo9YS5sZW5ndGgKIGlmKGI+Pj4wIT09Ynx8Yj49eil0aGlzLkoyKGEsYix6KQpAQCAtMTA3MDksMTcgKzEwOTIwLDE3IEBACiByZXR1cm59dGhyb3ciVW5hYmxlIHRvIHByaW50IG1lc3NhZ2U6ICIrU3RyaW5nKGEpfX1dLFsiZXJyb3Jfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZXJyb3Jfdmlldy5kYXJ0IiwsRix7CiAiXiI6IiIsCiBaUDp7Ci0iXiI6IkQxMztQeSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IkQxMztQeSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBna2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUHl9LAogc2tjOmZ1bmN0aW9uKGEsYil7YS5QeT10aGlzLmN0KGEsQy55aCxhLlB5LGIpfSwKIHN0YXRpYzp7WXc6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5PRC5aTChhKQogQy5PRC5YSShhKQpAQCAtMTA3MjksNyArMTA5NDAsNyBAQAogJGlzZDM6dHJ1ZX19XSxbImV2YWxfYm94X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9ldmFsX2JveC5kYXJ0IiwsTCx7CiAiXiI6IiIsCiBuSjp7Ci0iXiI6IldacTthMyxFayxMbix5NCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IldacTthMyxFayxMbix5NCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnYTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYTN9LAogc2E0OmZ1bmN0aW9uKGEsYil7YS5hMz10aGlzLmN0KGEsQy5taSxhLmEzLGIpfSwKIGdkdTpmdW5jdGlvbihhKXtyZXR1cm4gYS5Fa30sCkBAIC0xMDc0NCw3ICsxMDk1NSw3IEBACiB6PXRoaXMuY3QoYSxDLmVoLGEuRWsseikKIGEuRWs9egogaWYoSi54Qyh6LCIxLWxpbmUiKSl7ej1KLkpBKGEuYTMsIlxuIiwiICIpCi1hLmEzPXRoaXMuY3QoYSxDLm1pLGEuYTMseil9fSwiJDMiLCJnVnIiLDYsMCwxMTEsMSwxMDIsMTAzXSwKK2EuYTM9dGhpcy5jdChhLEMubWksYS5hMyx6KX19LCIkMyIsImdWciIsNiwwLDExMiwxLDEwMywxMDRdLAogWjE6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseAogSi5LcihiKQogej1hLmEzCkBAIC0xMDc1Myw5ICsxMDk2NCw5IEBACiB4PVIudEIoeSkKIEoua1coeCwiZXhwciIseikKIEouVmsoYS55NCwwLHgpCi10aGlzLkxZKGEseikubWwobmV3IEwuWVcoeCkpfX0sIiQzIiwiZ1ptIiw2LDAsMTExLDEsMTAyLDEwM10sCit0aGlzLkxZKGEseikubWwobmV3IEwuWVcoeCkpfX0sIiQzIiwiZ1ptIiw2LDAsMTEyLDEsMTAzLDEwNF0sCiBvNTpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLmJOKEoubDIoYiksImV4cHIiKQotYS5hMz10aGlzLmN0KGEsQy5taSxhLmEzLHopfSwiJDEiLCJnSG8iLDIsMCwxMzksMV0sCithLmEzPXRoaXMuY3QoYSxDLm1pLGEuYTMseil9LCIkMSIsImdIbyIsMiwwLDE0MSwxXSwKIHN0YXRpYzp7UnA6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PVIudEIoW10pCiB5PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQpAQCAtMTA3NjMsMjQgKzEwOTc0LDI0IEBACiB4PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx4LG51bGwpLG51bGwsbnVsbCksW3gsbnVsbF0pCiBhLkVrPSIxLWxpbmUiCiBhLnk0PXoKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9eQorYS5vRz0hMQorYS5aTT15CiBhLlpRPXgKLUMudFQuWkwoYSkKLUMudFQuWEkoYSkKK0MuSmguWkwoYSkKK0MuSmguWEkoYSkKIHJldHVybiBhfX19LAogV1pxOnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogWVc6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtKLmtXKHRoaXMuYSwidmFsdWUiLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtKLmtXKHRoaXMuYSwidmFsdWUiLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiZXZhbF9saW5rX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9ldmFsX2xpbmsuZGFydCIsLFIsewogIl4iOiIiLAogRWc6ewotIl4iOiJLQWY7ZmUsbDEsYlksanYsb3ksQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJLQWY7ZmUsbDEsYlksanYsb3ksQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3Y4OmZ1bmN0aW9uKGEpe3JldHVybiBhLmZlfSwKIHN2ODpmdW5jdGlvbihhLGIpe2EuZmU9dGhpcy5jdChhLEMuUzQsYS5mZSxiKX0sCiBncGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubDF9LApAQCAtMTA3OTcsOCArMTEwMDgsOCBAQAogaWYoej09PSEwKXJldHVybgogaWYoYS5iWSE9bnVsbCl7YS5mZT10aGlzLmN0KGEsQy5TNCx6LCEwKQogYS5veT10aGlzLmN0KGEsQy5VWSxhLm95LG51bGwpCi10aGlzLkxZKGEsYS5qdikubWwobmV3IFIudXYoYSkpLllNKG5ldyBSLk91KGEpKX19LCIkMyIsImdEZiIsNiwwLDgyLDQ2LDQ3LDgzXSwKLXN0YXRpYzp7TmQ6ZnVuY3Rpb24oYSl7dmFyIHoseQordGhpcy5MWShhLGEuanYpLm1sKG5ldyBSLkt6KGEpKS5ZTShuZXcgUi51dihhKSl9fSwiJDMiLCJnRGYiLDYsMCw4Myw0Niw0Nyw4NF0sCitzdGF0aWM6e09sYTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCkBAIC0xMDgwNyw3OCArMTEwMTgsNzggQEAKIGEuYlk9bnVsbAogYS5qdj0iIgogYS5veT1udWxsCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLlVGLlpMKGEpCi1DLlVGLlhJKGEpCitDLnFMLlpMKGEpCitDLnFMLlhJKGEpCiByZXR1cm4gYX19fSwKIEtBZjp7CiAiXiI6InhjK1BpOyIsCiAkaXNkMzp0cnVlfSwKLXV2OnsKLSJeIjoiVHA6MTQxO2EiLAorS3o6eworIl4iOiJUcFo6MTQzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQotei5veT1KLlE1KHosQy5VWSx6Lm95LGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTIsImNhbGwiXSwKK3oub3k9Si5RNSh6LEMuVVksei5veSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLU91OnsKLSJeIjoiVHA6NzE7YiIsCit1djp7CisiXiI6IlRwWjo3MjtiIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYgogei5mZT1KLlE1KHosQy5TNCx6LmZlLCExKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiZmllbGRfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9maWVsZF9yZWYuZGFydCIsLEQsewogIl4iOiIiLAogaTc6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7aFNXOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTUMuWkwoYSkKIEMuTUMuWEkoYSkKIHJldHVybiBhfX19fV0sWyJmaWVsZF92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9maWVsZF92aWV3LmRhcnQiLCxBLHsKICJeIjoiIiwKIEdrOnsKLSJeIjoicHZhO0tWLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoicHZhO0tWLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd0MDpmdW5jdGlvbihhKXtyZXR1cm4gYS5LVn0sCiBzdDA6ZnVuY3Rpb24oYSxiKXthLktWPXRoaXMuY3QoYSxDLldRLGEuS1YsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLktWKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotc3RhdGljOntudjpmdW5jdGlvbihhKXt2YXIgeix5CitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuS1YpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitzdGF0aWM6e2NZTzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLmJ5LlpMKGEpCi1DLmJ5LlhJKGEpCitDLkQ0LlpMKGEpCitDLkQ0LlhJKGEpCiByZXR1cm4gYX19fSwKIHB2YTp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfX1dLFsiZmxhZ19saXN0X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9mbGFnX2xpc3QuZGFydCIsLFgsewogIl4iOiIiLAotTnI6ewotIl4iOiJjZGE7REMsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorSjM6eworIl4iOiJjZGE7REMsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3BNOmZ1bmN0aW9uKGEpe3JldHVybiBhLkRDfSwKIHNwTTpmdW5jdGlvbihhLGIpe2EuREM9dGhpcy5jdChhLEMuTWMsYS5EQyxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuREMpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCi1zdGF0aWM6e0FrOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5EQykuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK3N0YXRpYzp7VHNGOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTU8wLlpMKGEpCiBDLk1PMC5YSShhKQpAQCAtMTA4ODcsMTcgKzExMDk4LDE3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE1KOnsKLSJeIjoid2FhO1pjLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoid2FhO1pjLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdKNjpmdW5jdGlvbihhKXtyZXR1cm4gYS5aY30sCiBzSjY6ZnVuY3Rpb24oYSxiKXthLlpjPXRoaXMuY3QoYSxDLk9PLGEuWmMsYil9LAogc3RhdGljOntJZlg6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5sczYuWkwoYSkKIEMubHM2LlhJKGEpCkBAIC0xMDkwNyw0MiArMTExMTgsMTkgQEAKICRpc2QzOnRydWV9fV0sWyJmdW5jdGlvbl9yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3JlZi5kYXJ0IiwsVSx7CiAiXiI6IiIsCiBESzp7Ci0iXiI6IlQ1MztsaCxReix6ZyxGcyxBUCxmbix0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlQ1MztsaCxBUCxmbix0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnVTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGh9LAogc1U0OmZ1bmN0aW9uKGEsYil7YS5saD10aGlzLmN0KGEsQy5RSyxhLmxoLGIpfSwKLWFWOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseAotUS54SS5wcm90b3R5cGUuYVYuY2FsbCh0aGlzLGEsYikKLXRoaXMuY3QoYSxDLmFrLDAsMSkKLXRoaXMuY3QoYSxDLlFsLDAsMSkKLXo9YS50WQoteT16IT1udWxsCi1pZih5KXt4PUouVTYoeikKLXg9IUoueEMoeC50KHosImtpbmQiKSwiQ29sbGVjdGVkIikmJiFKLnhDKHgudCh6LCJraW5kIiksIk5hdGl2ZSIpJiYhSi54Qyh4LnQoeiwia2luZCIpLCJUYWciKSYmIUoueEMoeC50KHosImtpbmQiKSwiUmV1c2VkIil9ZWxzZSB4PSExCi1hLkZzPXRoaXMuY3QoYSxDLmEwLGEuRnMseCkKLXg9eSYmSi5VUSh6LCJwYXJlbnQiKSE9bnVsbAotYS5Rej10aGlzLmN0KGEsQy5hayxhLlF6LHgpCi1pZih5KXt5PUouVTYoeikKLXk9eS50KHosIm93bmVyIikhPW51bGwmJkoueEMoeS50KHosIm93bmVyIikuZ3pTKCksIkNsYXNzIil9ZWxzZSB5PSExCi1hLnpnPXRoaXMuY3QoYSxDLlFsLGEuemcseSl9LCIkMSIsImdMZSIsMiwwLDIwLDU3XSwKLWdTWTpmdW5jdGlvbihhKXtyZXR1cm4gYS5Ren0sCi1zU1k6ZnVuY3Rpb24oYSxiKXthLlF6PXRoaXMuY3QoYSxDLmFrLGEuUXosYil9LAotZ0U3OmZ1bmN0aW9uKGEpe3JldHVybiBhLnpnfSwKLXNFNzpmdW5jdGlvbihhLGIpe2Euemc9dGhpcy5jdChhLEMuUWwsYS56ZyxiKX0sCi1nbmk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuRnN9LAotc25pOmZ1bmN0aW9uKGEsYil7YS5Gcz10aGlzLmN0KGEsQy5hMCxhLkZzLGIpfSwKIHN0YXRpYzp7djk6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5saD0hMAotYS5Rej0hMQotYS56Zz0hMQotYS5Gcz0hMQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5Yby5aTChhKQogQy5Yby5YSShhKQpAQCAtMTA5NTIsNzUgKzExMTQwLDI5IEBACiAkaXNkMzp0cnVlfX1dLFsiZnVuY3Rpb25fdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZnVuY3Rpb25fdmlldy5kYXJ0IiwsTix7CiAiXiI6IiIsCiBCUzp7Ci0iXiI6IlY0O1A2LFNxLFpaLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjk7UDYsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2lnOmZ1bmN0aW9uKGEpe3JldHVybiBhLlA2fSwKIHNpZzpmdW5jdGlvbihhLGIpe2EuUDY9dGhpcy5jdChhLEMubmYsYS5QNixiKX0sCi1nVXg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuU3F9LAotc1V4OmZ1bmN0aW9uKGEsYil7YS5TcT10aGlzLmN0KGEsQy5BTyxhLlNxLGIpfSwKLWdmWTpmdW5jdGlvbihhKXtyZXR1cm4gYS5aWn0sCi1zZlk6ZnVuY3Rpb24oYSxiKXthLlpaPXRoaXMuY3QoYSxDLkxjLGEuWlosYil9LAotVzc6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKLXo9YiE9bnVsbAoteT16JiZKLlVRKGIsInBhcmVudCIpIT1udWxsP0ouVVEoYiwicGFyZW50Iik6bnVsbAotaWYoeSE9bnVsbClyZXR1cm4gdGhpcy5XNyhhLHkpKyIuIitILmQoSi5VUShiLCJ1c2VyX25hbWUiKSkKLWlmKHope3o9Si5VNihiKQotej16LnQoYiwib3duZXIiKSE9bnVsbCYmSi54Qyh6LnQoYiwib3duZXIiKS5nelMoKSwiQ2xhc3MiKX1lbHNlIHo9ITEKLXg9ej9KLlVRKGIsIm93bmVyIik6bnVsbAotaWYoeCE9bnVsbClyZXR1cm4gSC5kKEouVVEoeCwidXNlcl9uYW1lIikpKyIuIitILmQoSi5VUShiLCJ1c2VyX25hbWUiKSkKLXJldHVybiBILmQoSi5VUShiLCJ1c2VyX25hbWUiKSl9LAotakM6W2Z1bmN0aW9uKGEsYil7dmFyIHoseQotdGhpcy5jdChhLEMuQU8sMCwxKQotdGhpcy5jdChhLEMuTGMsMCwxKQotej10aGlzLlc3KGEsYS5QNikKLWEuU3E9dGhpcy5jdChhLEMuQU8sYS5TcSx6KQotej1KLlVRKGEuUDYsImtpbmQiKQoteT1hLlpaCi1zd2l0Y2goeil7Y2FzZSJrUmVndWxhckZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImZ1bmN0aW9uIikKLWJyZWFrCi1jYXNlImtDbG9zdXJlRnVuY3Rpb24iOmEuWlo9dGhpcy5jdChhLEMuTGMseSwiY2xvc3VyZSBmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrU2lnbmF0dXJlRnVuY3Rpb24iOmEuWlo9dGhpcy5jdChhLEMuTGMseSwic2lnbmF0dXJlIGZ1bmN0aW9uIikKLWJyZWFrCi1jYXNlImtHZXR0ZXJGdW5jdGlvbiI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJnZXR0ZXIgZnVuY3Rpb24iKQotYnJlYWsKLWNhc2Uia1NldHRlckZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksInNldHRlciBmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrQ29uc3RydWN0b3IiOmEuWlo9dGhpcy5jdChhLEMuTGMseSwiY29uc3RydWN0b3IiKQotYnJlYWsKLWNhc2Uia0ltcGxpY2l0R2V0dGVyRnVuY3Rpb24iOmEuWlo9dGhpcy5jdChhLEMuTGMseSwiaW1wbGljaXQgZ2V0dGVyIGZ1bmN0aW9uIikKLWJyZWFrCi1jYXNlImtJbXBsaWNpdFNldHRlckZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImltcGxpY2l0IHNldHRlciBmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrU3RhdGljSW5pdGlhbGl6ZXIiOmEuWlo9dGhpcy5jdChhLEMuTGMseSwic3RhdGljIGluaXRpYWxpemVyIikKLWJyZWFrCi1jYXNlImtNZXRob2RFeHRyYWN0b3IiOmEuWlo9dGhpcy5jdChhLEMuTGMseSwibWV0aG9kIGV4dHJhY3RvciIpCi1icmVhawotY2FzZSJrTm9TdWNoTWV0aG9kRGlzcGF0Y2hlciI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJub1N1Y2hNZXRob2QgZGlzcGF0Y2hlciIpCi1icmVhawotY2FzZSJrSW52b2tlRmllbGREaXNwYXRjaGVyIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImludm9rZSBmaWVsZCBkaXNwYXRjaGVyIikKLWJyZWFrCi1kZWZhdWx0OmEuWlo9dGhpcy5jdChhLEMuTGMseSwiVU5LTk9XTiIpCi1icmVha319LCIkMSIsImducCIsMiwwLDIwLDU3XSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5QNikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5QNikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7bno6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5QSjguWkwoYSkKIEMuUEo4LlhJKGEpCiByZXR1cm4gYX19fSwKLVY0OnsKK1Y5OnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9fV0sWyJoZWFwX21hcF9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaGVhcF9tYXAuZGFydCIsLE8sewogIl4iOiIiLAogSHo6ewogIl4iOiJhO3pFLG1TIiwKLVBZOltmdW5jdGlvbigpe3JldHVybiBuZXcgTy5Ieih0aGlzLnpFLHRoaXMubVMrNCl9LCIkMCIsImdhdyIsMCwwLDE0Ml0sCitQWTpbZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE8uSHoodGhpcy56RSx0aGlzLm1TKzQpfSwiJDAiLCJnYXciLDAsMCwxNDRdLAogZ3ZIOmZ1bmN0aW9uKGEpe3JldHVybiBDLkNELmNVKHRoaXMubVMsNCl9LAogc3RhdGljOnsiXiI6IlEweiIseDY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIHo9Yi5neShiKQpAQCAtMTEwMzAsMTAgKzExMTcyLDEwIEBACiB4PWIuZ3goYikKIGlmKHR5cGVvZiB4IT09Im51bWJlciIpcmV0dXJuIEgucyh4KQogcmV0dXJuIG5ldyBPLkh6KGEsKHoqeSt4KSo0KX19fSwKLWtqOnsKK3gyOnsKICJeIjoiYTtZdTwsdEwifSwKIFZiOnsKLSJeIjoiVjEwO2hpLEFuLGRXLHJNLEFqLFVMLFBBLG9qLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjEwO2hpLEFuLGRXLHJNLEFqLFVMLFBBLG9qLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdwZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5QQX0sCiBzcGY6ZnVuY3Rpb24oYSxiKXthLlBBPXRoaXMuY3QoYSxDLlBNLGEuUEEsYil9LAogZ3l3OmZ1bmN0aW9uKGEpe3JldHVybiBhLm9qfSwKQEAgLTExMDQzLDE0ICsxMTE4NSwxNCBAQAogej0oYS5zaGFkb3dSb290fHxhLndlYmtpdFNoYWRvd1Jvb3QpLnF1ZXJ5U2VsZWN0b3IoIiNmcmFnbWVudGF0aW9uIikKIGEuaGk9egogej1KLlE5KHopCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nbW8oYSkpLHouU2cpLFtILktwKHosMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nbW8oYSkpLHouU2cpLFtILk9xKHosMCldKS5aeigpCiB6PUouR1coYS5oaSkKLUguVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdKYihhKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCl9LAorSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ0piKGEpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKX0sCiBMVjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogZm9yKHo9Si5tWShiKSx5PTA7ei5HKCk7KXt4PXoubG8KIGlmKHR5cGVvZiB4IT09Im51bWJlciIpcmV0dXJuIEgucyh4KQogeT15KjI1Nit4fXJldHVybiB5fSwKLWZKOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6PUoudUgoYywiQCIpCitmSjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1KLkl0KGMsIkAiKQogaWYoMD49ei5sZW5ndGgpcmV0dXJuIEguZSh6LDApCiBhLlVMLnUoMCxiLHpbMF0pCiBhLnJNLnUoMCxiLGQpCkBAIC0xMTA1OCwxNiArMTEyMDAsMTYgQEAKIGVEOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIKIGZvcih6PUoubVkoSi5VUShiLCJtZW1iZXJzIikpLHk9YS5VTCx4PWEuck0sdz1hLkFqO3ouRygpOyl7dj16LmdsKCkKIGlmKCFKLngodikuJGlzZHkpe04uUU0oIiIpLlRvKEguZCh2KSkKLWNvbnRpbnVlfXU9SC5CVShDLk5tLmdyWihKLnVIKHYucjAsIi8iKSksbnVsbCxudWxsKQotdD11PT1udWxsP0MucHI6UC5uMih1KQorY29udGludWV9dT1ILkJVKEMuTm0uZ3JaKEouSXQodi5yMCwiLyIpKSxudWxsLG51bGwpCit0PXU9PW51bGw/Qy5wcjpQLk5oKHUpCiBzPVt0LmoxKDEyOCksdC5qMSgxMjgpLHQuajEoMTI4KSwyNTVdCi1yPUoudUgodi5iTiwiQCIpCityPUouSXQodi5iTiwiQCIpCiBpZigwPj1yLmxlbmd0aClyZXR1cm4gSC5lKHIsMCkKIHkudSgwLHUsclswXSkKIHgudSgwLHUscykKIHcudSgwLHRoaXMuTFYoYSxzKSx1KX10aGlzLmZKKGEsYywiRnJlZSIsJC5SMigpKQogdGhpcy5mSihhLDAsIiIsJC5RZygpKX0sCi1vbjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuCitXRTpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuCiB6PWEuZFcKIHk9Si5ETyhhLkFuKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gei5VKCkKQEAgLTExMDk4LDE5ICsxMTI0MCwxOSBAQAogYnJlYWt9bys9Mn16PUguQlUoei50KHMsIm9iamVjdF9zdGFydCIpLG51bGwsbnVsbCkKIHk9Si5VUShhLm9qLCJ1bml0X3NpemVfYnl0ZXMiKQogaWYodHlwZW9mIHkhPT0ibnVtYmVyIilyZXR1cm4gSC5zKHkpCi1yZXR1cm4gbmV3IE8ua2ooSi5ldyh6LHUqeSksSi52WChwLEouVVEoYS5vaiwidW5pdF9zaXplX2J5dGVzIikpKX0sCityZXR1cm4gbmV3IE8ueDIoSi5ldyh6LHUqeSksSi52WChwLEouVVEoYS5vaiwidW5pdF9zaXplX2J5dGVzIikpKX0sCiBVODpbZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiB6PUouUkUoYikKLXk9dGhpcy5vbihhLHouZ0Q3KGIpKQoteD1ILmQoeS50TCkrIkIgQCAweCIrSi5jUih5Lll1LDE2KQoreT10aGlzLldFKGEsei5nRDcoYikpCit4PUguZCh5LnRMKSsiQiBAIDB4IitKLnUxKHkuWXUsMTYpCiB6PXouZ0Q3KGIpCiB6PU8ueDYoYS5Bbix6KQogdz16Lm1TCiB2PWEuVUwudCgwLGEuQWoudCgwLHRoaXMuTFYoYSxDLnlwLk11KEouUWQoei56RSksdyx3KzQpKSkpCiB6PUoueEModiwiIik/Ii0iOkguZCh2KSsiICIreAotYS5QQT10aGlzLmN0KGEsQy5QTSxhLlBBLHopfSwiJDEiLCJnbW8iLDIsMCwxMzksMl0sCi1YNzpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLmNSKHRoaXMub24oYSxKLm9wKGIpKS5ZdSwxNikKLXdpbmRvdy5sb2NhdGlvbi5oYXNoPSIvIitILmQoSi5EcyhKLmFUKGEub2opKSkrIi9hZGRyZXNzLyIren0sIiQxIiwiZ0piIiwyLDAsMTM5LDJdLAorYS5QQT10aGlzLmN0KGEsQy5QTSxhLlBBLHopfSwiJDEiLCJnbW8iLDIsMCwxNDEsMl0sCitYNzpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLnUxKHRoaXMuV0UoYSxKLm9wKGIpKS5ZdSwxNikKK3dpbmRvdy5sb2NhdGlvbi5oYXNoPSIvIitILmQoSi5EcyhKLmFUKGEub2opKSkrIi9hZGRyZXNzLyIren0sIiQxIiwiZ0piIiwyLDAsMTQxLDJdLAogTXk6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1hLm9qCiBpZih6PT1udWxsfHxhLmhpPT1udWxsKXJldHVybgpAQCAtMTExMjYsNyArMTEyNjgsNyBAQAogdz1KLnE4KHkpCiBpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiBILnModykKIHY9UC5KKHoqdyw2MDAwKQotdz1QLkozKEouVmYoYS5oaSkuY3JlYXRlSW1hZ2VEYXRhKHgsdikpCit3PVAuZjkoSi5WZihhLmhpKS5jcmVhdGVJbWFnZURhdGEoeCx2KSkKIGEuQW49dwogSi5ObyhhLmhpLEouRE8odykpCiBKLk9FKGEuaGksSi5PQihhLkFuKSkKQEAgLTExMTc5LDkgKzExMzIxLDkgQEAKIHg9YS5BbgogSi5rWih5LHgsMCwwLDAsdyxKLkRPKHgpLHYpCiBQLkl3KG5ldyBPLlI1KGEsYiksbnVsbCl9LAotcEE6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5vagorU0s6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5vagogaWYoej09bnVsbClyZXR1cm4KLUouYVQoeikuY3YoImhlYXBtYXAiKS5tbChuZXcgTy5hRyhhKSkuT0EobmV3IE8uejQoKSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK0ouYVQoeikuY3YoImhlYXBtYXAiKS5tbChuZXcgTy5hRyhhKSkuT0EobmV3IE8uejQoKSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIFlTNzpbZnVuY3Rpb24oYSxiKXtQLkl3KG5ldyBPLm9jKGEpLG51bGwpfSwiJDEiLCJnUjIiLDIsMCwyMCw1N10sCiBzdGF0aWM6eyJeIjoibkssT3MsU29ULFdCTyIscG46ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1QLkZsKG51bGwsbnVsbCkKQEAgLTExMTkzLDEwICsxMTMzNSwxMCBAQAogYS5yTT16CiBhLkFqPXkKIGEuVUw9eAotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT13CithLm9HPSExCithLlpNPXcKIGEuWlE9dgogQy5Dcy5aTChhKQogQy5Dcy5YSShhKQpAQCAtMTEyMDUsMjAgKzExMzQ3LDIwIEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFI1OnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpmdW5jdGlvbigpe0ouTVUodGhpcy5hLHRoaXMuYisxKX0sCiAkaXNFSDp0cnVlfSwKIGFHOnsKLSJeIjoiVHA6MTEwO2EiLAorIl4iOiJUcFo6MTExO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQotei5vaj1KLlE1KHosQy5RSCx6Lm9qLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQzLCJjYWxsIl0sCit6Lm9qPUouUTUoeixDLlFILHoub2osYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogejQ6ewotIl4iOiJUcDo3OTsiLAotJDI6W2Z1bmN0aW9uKGEsYil7Ti5RTSgiIikuVG8oSC5kKGEpKyIgIitILmQoYikpfSwiJDIiLG51bGwsNCwwLG51bGwsMSwxNDQsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpbZnVuY3Rpb24oYSxiKXtOLlFNKCIiKS5UbyhILmQoYSkrIiAiK0guZChiKSl9LCIkMiIsbnVsbCw0LDAsbnVsbCwxLDE0NiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBvYzp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpmdW5jdGlvbigpe0oudlAodGhpcy5hKX0sCiAkaXNFSDp0cnVlfX1dLFsiaGVhcF9wcm9maWxlX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9oZWFwX3Byb2ZpbGUuZGFydCIsLEssewogIl4iOiIiLApAQCAtMTEyMjcsOSArMTEzNjksOSBAQAogZUU6ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYj09PTApe3o9dGhpcy52cAogaWYoYT4+PjAhPT1hfHxhPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYSkKLXJldHVybiBKLk82KEouVVEoSi5UUCh6W2FdKSxiKSl9cmV0dXJuIEcubGcucHJvdG90eXBlLmVFLmNhbGwodGhpcyxhLGIpfX0sCityZXR1cm4gSi5PNihKLlVRKEouVThvKHpbYV0pLGIpKX1yZXR1cm4gRy5sZy5wcm90b3R5cGUuZUUuY2FsbCh0aGlzLGEsYil9fSwKIEx5OnsKLSJeIjoiVjExO01GLHVZLEdRLEk4LE9jLEdNLG5jLHBwLE9sLFNrLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjExO01GLHVZLEdRLEk4LE9jLEdNLG5jLHBwLE9sLFNrLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdZdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5NRn0sCiBzWXQ6ZnVuY3Rpb24oYSxiKXthLk1GPXRoaXMuY3QoYSxDLlROLGEuTUYsYil9LAogZ2NIOmZ1bmN0aW9uKGEpe3JldHVybiBhLnVZfSwKQEAgLTExMjcxLDcgKzExNDEzLDcgQEAKIHM9eS5neFEoKS5nYmkoKS53Zgogcj15Lmd4USgpLmdsKCkuclQKIHE9eS5neFEoKS5nbCgpLndmCi1KLkpyKGEubmMsbmV3IEcuTmkoW3ksIiIseCx3LHYsdSwiIix0LHMscixxXSkpfUoudE8oYS5uYyl9LAorSi5mRChhLm5jLG5ldyBHLk5pKFt5LCIiLHgsdyx2LHUsIiIsdCxzLHIscV0pKX1KLnRPKGEubmMpfSwKIEU0OmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUKIHo9Si5VUShKLlRZKGEubmMpLGMpCiB5PUouUkUoYikKQEAgLTExMzIyLDE3ICsxMTQ2NCwxNyBAQAogaWYoej09bnVsbD95IT1udWxsOnohPT15KXt4LnN4cCh5KQogYS5uYy5zVDMoITApfWVsc2UgeC5zVDMoIXguZ1QzKCkpCiBKLnRPKGEubmMpCi10aGlzLkpoKGEpfX0sIiQzIiwiZ1FxIiw2LDAsMTAxLDEsMTAyLDEwM10sCi1wQTpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLk9sCit0aGlzLkpoKGEpfX0sIiQzIiwiZ1FxIiw2LDAsMTAyLDEsMTAzLDEwNF0sCitTSzpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLk9sCiBpZih6PT1udWxsKXJldHVybgotSi5hVCh6KS5jdigiL2FsbG9jYXRpb25wcm9maWxlIikubWwodGhpcy5nTHYoYSkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitKLmFUKHopLmN2KCIvYWxsb2NhdGlvbnByb2ZpbGUiKS5tbCh0aGlzLmdMdihhKSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHpUOltmdW5jdGlvbihhLGIpe3ZhciB6PWEuT2wKIGlmKHo9PW51bGwpcmV0dXJuCi1KLmFUKHopLmN2KCIvYWxsb2NhdGlvbnByb2ZpbGU/Z2M9ZnVsbCIpLm1sKHRoaXMuZ0x2KGEpKS5ZTShiKX0sIiQxIiwiZ3lXIiwyLDAsMjAsOThdLAorSi5hVCh6KS5jdigiL2FsbG9jYXRpb25wcm9maWxlP2djPWZ1bGwiKS5tbCh0aGlzLmdMdihhKSkuWU0oYil9LCIkMSIsImd5VyIsMiwwLDIwLDk5XSwKIGVKOltmdW5jdGlvbihhLGIpe3ZhciB6PWEuT2wKIGlmKHo9PW51bGwpcmV0dXJuCi1KLmFUKHopLmN2KCIvYWxsb2NhdGlvbnByb2ZpbGU/cmVzZXQ9dHJ1ZSIpLm1sKHRoaXMuZ0x2KGEpKS5ZTShiKX0sIiQxIiwiZ05iIiwyLDAsMjAsOThdLAotaHo6W2Z1bmN0aW9uKGEsYil7YS5PbD10aGlzLmN0KGEsQy52YixhLk9sLGIpfSwiJDEiLCJnTHYiLDIsMCwxNDUsMTQ2XSwKK0ouYVQoeikuY3YoIi9hbGxvY2F0aW9ucHJvZmlsZT9yZXNldD10cnVlIikubWwodGhpcy5nTHYoYSkpLllNKGIpfSwiJDEiLCJnTmIiLDIsMCwyMCw5OV0sCitoejpbZnVuY3Rpb24oYSxiKXthLk9sPXRoaXMuY3QoYSxDLnZiLGEuT2wsYil9LCIkMSIsImdMdiIsMiwwLDE0NywxNDhdLAogbjE6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgogej1hLk9sCiBpZih6PT1udWxsKXJldHVybgpAQCAtMTEzNTIsMTkgKzExNDk0LDE5IEBACiB6PXouS0oKIHY9W10KIEMuTm0uRlYodixDLk5tLmV6KFsiVXNlZCIsd10sUC5FbigpKSkKLXouVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHoodiksW251bGxdKV0pCit6LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHYpLFtudWxsXSldKQogdj1hLkdRCi16PUouYkkoeC5nVVkoKS5nQ3MoKSx4LmdVWSgpLmdTVSgpKQorej1KLkhuKHguZ1VZKCkuZ0NzKCkseC5nVVkoKS5nU1UoKSkKIHY9di5LSgogdz1bXQogQy5ObS5GVih3LEMuTm0uZXooWyJGcmVlIix6XSxQLkVuKCkpKQotdi5WNygiYWRkUm93IixbSC5WTShuZXcgUC5Ueih3KSxbbnVsbF0pXSkKK3YuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuR0QodyksW251bGxdKV0pCiB3PWEuR1EKIHY9eC5nVVkoKS5nTVgoKQogdz13LktKCiB6PVtdCiBDLk5tLkZWKHosQy5ObS5leihbIkV4dGVybmFsIix2XSxQLkVuKCkpKQotdy5WNygiYWRkUm93IixbSC5WTShuZXcgUC5Ueih6KSxbbnVsbF0pXSkKK3cuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuR0QoeiksW251bGxdKV0pCiB6PWEuT2MuS0oKIHouVjcoInJlbW92ZVJvd3MiLFswLHoublEoImdldE51bWJlck9mUm93cyIpXSkKIHo9YS5PYwpAQCAtMTEzNzIsMTkgKzExNTE0LDE5IEBACiB6PXouS0oKIHY9W10KIEMuTm0uRlYodixDLk5tLmV6KFsiVXNlZCIsd10sUC5FbigpKSkKLXouVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHoodiksW251bGxdKV0pCit6LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHYpLFtudWxsXSldKQogdj1hLk9jCi16PUouYkkoeC5neFEoKS5nQ3MoKSx4Lmd4USgpLmdTVSgpKQorej1KLkhuKHguZ3hRKCkuZ0NzKCkseC5neFEoKS5nU1UoKSkKIHY9di5LSgogdz1bXQogQy5ObS5GVih3LEMuTm0uZXooWyJGcmVlIix6XSxQLkVuKCkpKQotdi5WNygiYWRkUm93IixbSC5WTShuZXcgUC5Ueih3KSxbbnVsbF0pXSkKK3YuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuR0QodyksW251bGxdKV0pCiB3PWEuT2MKIHY9eC5neFEoKS5nTVgoKQogdz13LktKCiB6PVtdCiBDLk5tLkZWKHosQy5ObS5leihbIkV4dGVybmFsIix2XSxQLkVuKCkpKQotdy5WNygiYWRkUm93IixbSC5WTShuZXcgUC5Ueih6KSxbbnVsbF0pXSkKK3cuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuR0QoeiksW251bGxdKV0pCiB0aGlzLllhKGEpCiB0aGlzLll6KGEpCiB0aGlzLkpoKGEpCkBAIC0xMTM5OCwxNyArMTE1NDAsMTcgQEAKIGlmKHo9PW51bGwpcmV0dXJuIiIKIHk9Si5SRSh6KQogeD1iPT09ITA/eS5nb2QoeikuZ1VZKCk6eS5nb2QoeikuZ3hRKCkKLXJldHVybiBDLkNELlN5KEouWDkoSi52WCh4LmdweSgpLDEwMDApLHguZ1lrKCkpLDIpKyIgbXMifSwiJDEiLCJnT2QiLDIsMCwxNDcsMTQ4XSwKK3JldHVybiBDLkNELlN5KEouWDkoSi52WCh4LmdweSgpLDEwMDApLHguZ1lrKCkpLDIpKyIgbXMifSwiJDEiLCJnT2QiLDIsMCwxNDksMTUwXSwKIHVXOltmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9YS5PbAogaWYoej09bnVsbClyZXR1cm4iIgogeT1KLlJFKHopCi1yZXR1cm4gSi5BRygoYj09PSEwP3kuZ29kKHopLmdVWSgpOnkuZ29kKHopLmd4USgpKS5nWWsoKSl9LCIkMSIsImdKTiIsMiwwLDE0NywxNDhdLAorcmV0dXJuIEouQUcoKGI9PT0hMD95LmdvZCh6KS5nVVkoKTp5LmdvZCh6KS5neFEoKSkuZ1lrKCkpfSwiJDEiLCJnSk4iLDIsMCwxNDksMTUwXSwKIEY5OltmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9YS5PbAogaWYoej09bnVsbClyZXR1cm4iIgogeT1KLlJFKHopCi1yZXR1cm4gSi53RigoYj09PSEwP3kuZ29kKHopLmdVWSgpOnkuZ29kKHopLmd4USgpKS5ncHkoKSwyKSsiIHNlY3MifSwiJDEiLCJnb04iLDIsMCwxNDcsMTQ4XSwKK3JldHVybiBKLndGKChiPT09ITA/eS5nb2QoeikuZ1VZKCk6eS5nb2QoeikuZ3hRKCkpLmdweSgpLDIpKyIgc2VjcyJ9LCIkMSIsImdvTiIsMiwwLDE0OSwxNTBdLAogWnk6ZnVuY3Rpb24oYSl7dmFyIHo9UC56VihKLlVRKCQuQlksIkRhdGFUYWJsZSIpLG51bGwpCiBhLkdRPW5ldyBHLktmKHopCiB6LlY3KCJhZGRDb2x1bW4iLFsic3RyaW5nIiwiVHlwZSJdKQpAQCAtMTE0MTgsNyArMTE1NjAsNyBAQAogei5WNygiYWRkQ29sdW1uIixbInN0cmluZyIsIlR5cGUiXSkKIGEuT2MuS0ouVjcoImFkZENvbHVtbiIsWyJudW1iZXIiLCJTaXplIl0pCiB6PUguVk0oW10sW0cuTmldKQotej10aGlzLmN0KGEsQy5rRyxhLm5jLG5ldyBLLlVDKFtuZXcgRy5LdCgiQ2xhc3MiLEcuamkoKSksbmV3IEcuS3QoIiIsRy5qaSgpKSxuZXcgRy5LdCgiQWNjdW11bGF0ZWQgU2l6ZSAoTmV3KSIsRy5wMCgpKSxuZXcgRy5LdCgiQWNjdW11bGF0ZWQgSW5zdGFuY2VzIixHLmtoKCkpLG5ldyBHLkt0KCJDdXJyZW50IFNpemUiLEcucDAoKSksbmV3IEcuS3QoIkN1cnJlbnQgSW5zdGFuY2VzIixHLmtoKCkpLG5ldyBHLkt0KCIiLEcuamkoKSksbmV3IEcuS3QoIkFjY3VtdWxhdG9yIFNpemUgKE9sZCkiLEcucDAoKSksbmV3IEcuS3QoIkFjY3VtdWxhdG9yIEluc3RhbmNlcyIsRy5raCgpKSxuZXcgRy5LdCgiQ3VycmVudCBTaXplIixHLnAwKCkpLG5ldyBHLkt0KCJDdXJyZW50IEluc3RhbmNlcyIsRy5raCgpKV0seixbXSwwLCEwLG51bGwsbnVsbCkpCit6PXRoaXMuY3QoYSxDLmtHLGEubmMsbmV3IEsuVUMoW25ldyBHLkt0KCJDbGFzcyIsRy5qaSgpKSxuZXcgRy5LdCgiIixHLmppKCkpLG5ldyBHLkt0KCJBY2N1bXVsYXRlZCBTaXplIChOZXcpIixHLnAwKCkpLG5ldyBHLkt0KCJBY2N1bXVsYXRlZCBJbnN0YW5jZXMiLEcueEsoKSksbmV3IEcuS3QoIkN1cnJlbnQgU2l6ZSIsRy5wMCgpKSxuZXcgRy5LdCgiQ3VycmVudCBJbnN0YW5jZXMiLEcueEsoKSksbmV3IEcuS3QoIiIsRy5qaSgpKSxuZXcgRy5LdCgiQWNjdW11bGF0b3IgU2l6ZSAoT2xkKSIsRy5wMCgpKSxuZXcgRy5LdCgiQWNjdW11bGF0b3IgSW5zdGFuY2VzIixHLnhLKCkpLG5ldyBHLkt0KCJDdXJyZW50IFNpemUiLEcucDAoKSksbmV3IEcuS3QoIkN1cnJlbnQgSW5zdGFuY2VzIixHLnhLKCkpXSx6LFtdLDAsITAsbnVsbCxudWxsKSkKIGEubmM9egogei5zeHAoMil9LAogc3RhdGljOntVdDpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC0xMTQyNywxMCArMTE1NjksMTAgQEAKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuTUY9Ii0tLSIKIGEudVk9Ii0tLSIKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuVmMuWkwoYSkKIEMuVmMuWEkoYSkKQEAgLTExNDQ2LDggKzExNTg4LDggQEAKIG5ldyBQLnVTKCkuJDAoKQogcmV0dXJuIHl9LAogbzc6ZnVuY3Rpb24oYSxiKXt2YXIgej1bXQotcmV0dXJuIG5ldyBQLnhMKGIsbmV3IFAuQ0EoW10seiksbmV3IFAudGkoeiksbmV3IFAuS0MoeikpLiQxKGEpfSwKLUozOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3JldHVybiBuZXcgUC54TChiLG5ldyBQLkNBKFtdLHopLG5ldyBQLkQ2KHopLG5ldyBQLktDKHopKS4kMShhKX0sCitmOTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PUoueChhKQogaWYoISF6LiRpc1NnKXt5PXouZ1JuKGEpCiBpZih5LmNvbnN0cnVjdG9yPT09QXJyYXkpaWYodHlwZW9mIENhbnZhc1BpeGVsQXJyYXkhPT0idW5kZWZpbmVkIil7eS5jb25zdHJ1Y3Rvcj1DYW52YXNQaXhlbEFycmF5CkBAIC0xMTQ2MCw3ICsxMTYwMiw3IEBACiAkLlF6PXp9ej16IT09ITAmJkouTlQod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQsIldlYktpdCIsMCkKICQuUjY9en1yZXR1cm4gen0sCiBPVzp7Ci0iXiI6IlRwOjQ4O2IsYyIsCisiXiI6IlRwWjo0ODtiLGMiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PXRoaXMuYgogeT16Lmxlbmd0aApAQCAtMTE0NzAsMjMgKzExNjEyLDIzIEBACiByZXR1cm4geX0sCiAkaXNFSDp0cnVlfSwKIHJHOnsKLSJeIjoiVHA6MTQ5O2QiLAorIl4iOiJUcFo6MTUxO2QiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5kCiBpZihhPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYSkKIHJldHVybiB6W2FdfSwKICRpc0VIOnRydWV9LAogZmg6ewotIl4iOiJUcDoxNTA7ZSIsCisiXiI6IlRwWjoxNTI7ZSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuZQogaWYoYT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCiB6W2FdPWJ9LAogJGlzRUg6dHJ1ZX0sCiB1Uzp7Ci0iXiI6IlRwOjcxOyIsCisiXiI6IlRwWjo3MjsiLAogJDA6ZnVuY3Rpb24oKXt9LAogJGlzRUg6dHJ1ZX0sCiBUbTp7Ci0iXiI6IlRwOjEzO2YsVUksYksiLAorIl4iOiJUcFo6MTM7ZixVSSxiSyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKIHo9e30KIGlmKGE9PW51bGwpcmV0dXJuIGEKQEAgLTExNTIwLDExICsxMTY2MiwxMSBAQAogd1t1XT16fXJldHVybiB3fXRocm93IEguYihQLlNZKCJzdHJ1Y3R1cmVkIGNsb25lIG9mIG90aGVyIHR5cGUiKSl9LAogJGlzRUg6dHJ1ZX0sCiBpYjp7Ci0iXiI6IlRwOjc5O2EsR3EiLAotJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLmFbYV09dGhpcy5HcS4kMShiKX0sIiQyIixudWxsLDQsMCxudWxsLDc3LDIxLCJjYWxsIl0sCisiXiI6IlRwWjo4MDthLEdxIiwKKyQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuR3EuJDEoYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3OCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBDQTp7Ci0iXiI6IlRwOjQ4O2EsYiIsCisiXiI6IlRwWjo0ODthLGIiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9dGhpcy5hCiB5PXoubGVuZ3RoCkBAIC0xMTUzMywyMCArMTE2NzUsMjAgQEAKIHRoaXMuYi5wdXNoKG51bGwpCiByZXR1cm4geX0sCiAkaXNFSDp0cnVlfSwKLXRpOnsKLSJeIjoiVHA6MTQ5O2MiLAorRDY6eworIl4iOiJUcFo6MTUxO2MiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5jCiBpZihhPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYSkKIHJldHVybiB6W2FdfSwKICRpc0VIOnRydWV9LAogS0M6ewotIl4iOiJUcDoxNTA7ZCIsCisiXiI6IlRwWjoxNTI7ZCIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuZAogaWYoYT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCiB6W2FdPWJ9LAogJGlzRUg6dHJ1ZX0sCiB4TDp7Ci0iXiI6IlRwOjEzO2UsZixVSSxiSyIsCisiXiI6IlRwWjoxMztlLGYsVUksYksiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQKIGlmKGE9PW51bGwpcmV0dXJuIGEKIGlmKHR5cGVvZiBhPT09ImJvb2xlYW4iKXJldHVybiBhCkBAIC0xMTU1OSw3ICsxMTcwMSw3IEBACiBpZih5IT1udWxsKXJldHVybiB5CiB5PVAuRmwobnVsbCxudWxsKQogdGhpcy5iSy4kMih6LHkpCi1mb3IoeD1PYmplY3Qua2V5cyhhKSx4PUguVk0obmV3IEguYTcoeCx4Lmxlbmd0aCwwLG51bGwpLFtILktwKHgsMCldKTt4LkcoKTspe3c9eC5sbworZm9yKHg9T2JqZWN0LmtleXMoYSkseD1ILlZNKG5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKSxbSC5PcSh4LDApXSk7eC5HKCk7KXt3PXgubG8KIHkudSgwLHcsdGhpcy4kMShhW3ddKSl9cmV0dXJuIHl9aWYoYSBpbnN0YW5jZW9mIEFycmF5KXt6PXRoaXMuZi4kMShhKQogeT10aGlzLlVJLiQxKHopCiBpZih5IT1udWxsKXJldHVybiB5CkBAIC0xMTU3OSw3ICsxMTcyMSw3IEBACiAkaXNTZzp0cnVlfSwKIEFzMzp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxGKCkuelYoMCwiICIpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sRigpLnpWKDAsIiAiKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ0E6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5sRigpCiB6PUguVk0obmV3IFAuelEoeix6LnpOLG51bGwsbnVsbCksW251bGxdKQogei56cT16Lk8yLkg5CkBAIC0xMTU4NywxMSArMTE3MjksMTEgQEAKIGFOOmZ1bmN0aW9uKGEsYil7dGhpcy5sRigpLmFOKDAsYil9LAogelY6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5sRigpLnpWKDAsYil9LAogZXo6W2Z1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5sRigpCi1yZXR1cm4gSC5WTShuZXcgSC54eSh6LGIpLFtILktwKHosMCksbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCwxNTEsMzFdLAorcmV0dXJuIEguVk0obmV3IEgueHkoeixiKSxbSC5PcSh6LDApLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsMTUzLDMxXSwKIGFkOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5sRigpCi1yZXR1cm4gSC5WTShuZXcgSC5VNSh6LGIpLFtILktwKHosMCldKX0sCityZXR1cm4gSC5WTShuZXcgSC5VNSh6LGIpLFtILk9xKHosMCldKX0sCiBsTTpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmxGKCkKLXJldHVybiBILlZNKG5ldyBILm9BKHosYiksW0guS3AoeiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLDE1MiwzMV0sCityZXR1cm4gSC5WTShuZXcgSC5vQSh6LGIpLFtILk9xKHosMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCwxNTQsMzFdLAogb3U6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5sRigpLm91KDAsYil9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmxGKCkuWDU9PT0wfSwKIGdvcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sRigpLlg1IT09MH0sCkBAIC0xMTYyOSwyMCArMTE3NzEsMjAgQEAKICRpc1FWOnRydWUsCiAkYXNRVjpmdW5jdGlvbigpe3JldHVybltQLnFVXX19LAogR0U6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5iaShhLHRoaXMuYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmJpKGEsdGhpcy5hKX0sIiQxIixudWxsLDIsMCxudWxsLDE1NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBybDp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmJqKGEsdGhpcy5hKX0sIiQxIixudWxsLDIsMCxudWxsLDE1MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouYmooYSx0aGlzLmEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTU1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFBSOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEoudVkoYSx0aGlzLmEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTUzLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5yQShhLHRoaXMuYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdVE6ewotIl4iOiJUcDoxMzsiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLlo4KGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTUzLCJjYWxsIl0sCisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLlo4KGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTU1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEQ3OnsKICJeIjoiYXJrO1luLGl6IiwKQEAgLTExNjU4LDcgKzExODAwLDcgQEAKIHRoaXMuVVooMCxiLHopfSwKIGg6ZnVuY3Rpb24oYSxiKXt0aGlzLml6Lk5MLmFwcGVuZENoaWxkKGIpfSwKIEZWOmZ1bmN0aW9uKGEsYil7dmFyIHoseQotZm9yKHo9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guS3AoYiwwKV0pLHk9dGhpcy5pei5OTDt6LkcoKTspeS5hcHBlbmRDaGlsZCh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5PcShiLDApXSkseT10aGlzLml6Lk5MO3ouRygpOyl5LmFwcGVuZENoaWxkKHoubG8pfSwKIHRnOmZ1bmN0aW9uKGEsYil7cmV0dXJuITF9LAogR1Q6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5mKCJDYW5ub3Qgc29ydCBmaWx0ZXJlZCBsaXN0IikpfSwKIEpkOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkdUKGEsbnVsbCl9LApAQCAtMTE2ODcsMTggKzExODI5LDE4IEBACiBpZihiPj4+MCE9PWJ8fGI+PXoubGVuZ3RoKXJldHVybiBILmUoeixiKQogcmV0dXJuIHpbYl19LAogZ0E6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5neWUoKQotcmV0dXJuIEguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKX19LAorcmV0dXJuIEguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKX19LAogaFQ6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc2g0fSwKICRpc0VIOnRydWV9LAogR1M6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk1wKGEpfSwKICRpc0VIOnRydWV9fV0sWyJpbnN0YW5jZV9yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2luc3RhbmNlX3JlZi5kYXJ0IiwsQix7CiAiXiI6IiIsCiBwUjp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0pwOmZ1bmN0aW9uKGEpe3ZhciB6PWEudFkKIGlmKHohPW51bGwpaWYoSi54Qyh6Lmd6UygpLCJOdWxsIikpaWYoSi54QyhKLmVTKGEudFkpLCJvYmplY3RzL29wdGltaXplZC1vdXQiKSlyZXR1cm4iVGhpcyBvYmplY3QgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhbmQgaGFzIGJlZW4gcmVtb3ZlZCBieSB0aGUgb3B0aW1pemluZyBjb21waWxlci4iCiBlbHNlIGlmKEoueEMoSi5lUyhhLnRZKSwib2JqZWN0cy9jb2xsZWN0ZWQiKSlyZXR1cm4iVGhpcyBvYmplY3QgaGFzIGJlZW4gcmVjbGFpbWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4iCkBAIC0xMTcwNiw1OSArMTE4NDgsNTkgQEAKIGVsc2UgaWYoSi54QyhKLmVTKGEudFkpLCJvYmplY3RzL25vdC1pbml0aWFsaXplZCIpKXJldHVybiJUaGlzIG9iamVjdCB3aWxsIGJlIGluaXRpYWxpemVkIG9uY2UgaXQgaXMgYWNjZXNzZWQgYnkgdGhlIHByb2dyYW0uIgogZWxzZSBpZihKLnhDKEouZVMoYS50WSksIm9iamVjdHMvYmVpbmctaW5pdGlhbGl6ZWQiKSlyZXR1cm4iVGhpcyBvYmplY3QgaXMgY3VycmVudGx5IGJlaW5nIGluaXRpYWxpemVkLiIKIHJldHVybiBRLnhJLnByb3RvdHlwZS5nSnAuY2FsbCh0aGlzLGEpfSwKLUduOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ndXMoYSl9LCIkMCIsImd5WCIsMCwwLDcxXSwKK0duOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ndXMoYSl9LCIkMCIsImd5WCIsMCwwLDcyXSwKIHZROltmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogej1hLnRZCiBpZihiPT09ITApSi5jSSh6KS5tbChuZXcgQi5OZyhhKSkuWU0oYykKIGVsc2V7eT1KLncxKHopCiB5LnUoeiwiZmllbGRzIixudWxsKQogeS51KHosImVsZW1lbnRzIixudWxsKQotYy4kMCgpfX0sIiQyIiwiZ3VzIiw0LDAsMTU0LDE1NSw5OF0sCitjLiQwKCl9fSwiJDIiLCJndXMiLDQsMCwxNTYsMTU3LDk5XSwKIHN0YXRpYzp7bHU6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5wby5aTChhKQotQy5wby5YSShhKQorQy5oTS5aTChhKQorQy5oTS5YSShhKQogcmV0dXJuIGF9fX0sCiBOZzp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej1KLlU2KGEpCiBpZih6LnQoYSwidmFsdWVBc1N0cmluZyIpIT1udWxsKXt6LnNvYyhhLHoudChhLCJ2YWx1ZUFzU3RyaW5nIikpCi1hLnNkTih6LnQoYSwidmFsdWVBc1N0cmluZyIpKX16PXRoaXMuYQorYS5zVFgoei50KGEsInZhbHVlQXNTdHJpbmciKSl9ej10aGlzLmEKIHk9Si5SRSh6KQotei50WT15LmN0KHosQy54UCx6LnRZLGEpCi15LmN0KHosQy54UCwwLDEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCit6LnRZPXkuY3QoeixDLmtZLHoudFksYSkKK3kuY3QoeixDLmtZLDAsMSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDIsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJpbnN0YW5jZV92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pbnN0YW5jZV92aWV3LmRhcnQiLCxaLHsKICJeIjoiIiwKIGh4OnsKLSJeIjoiVjEyO1hoLGYyLFJyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjEyO1hoLGYyLFJyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdoZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5YaH0sCiBzaGY6ZnVuY3Rpb24oYSxiKXthLlhoPXRoaXMuY3QoYSxDLmZuLGEuWGgsYil9LAogZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiBhLmYyfSwKIHNJaTpmdW5jdGlvbihhLGIpe2EuZjI9dGhpcy5jdChhLEMuWE0sYS5mMixiKX0sCiBnQ0Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUnJ9LAogc0NGOmZ1bmN0aW9uKGEsYil7YS5Scj10aGlzLmN0KGEsQy50ZyxhLlJyLGIpfSwKLXZWOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuWGgpLmN2KEouZXcoSi5lUyhhLlhoKSwiL2V2YWw/ZXhwcj0iK1AualcoQy55RCxiLEMueE0sITEpKSl9LCIkMSIsImdabSIsMiwwLDEwNSwxMDZdLAotUzE6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5YaCkuY3YoSi5ldyhKLmVTKGEuWGgpLCIvcmV0YWluZWQiKSkubWwobmV3IFoud1UoYSkpfSwiJDEiLCJnaE4iLDIsMCwxMDcsMTA5XSwKLVByOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuWGgpLmN2KEouZXcoSi5lUyhhLlhoKSwiL3JldGFpbmluZ19wYXRoP2xpbWl0PSIrSC5kKGIpKSkubWwobmV3IFouY0woYSkpfSwiJDEiLCJnQ0kiLDIsMCwxMDcsMzNdLAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlhoKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAordlY6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5YaCkuY3YoSi5ldyhKLmVTKGEuWGgpLCIvZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpKX0sIiQxIiwiZ1ptIiwyLDAsMTA2LDEwN10sCitTMTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5hVChhLlhoKS5jdihKLmV3KEouZVMoYS5YaCksIi9yZXRhaW5lZCIpKS5tbChuZXcgWi53VShhKSl9LCIkMSIsImdoTiIsMiwwLDEwOCwxMTBdLAorUHI6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5YaCkuY3YoSi5ldyhKLmVTKGEuWGgpLCIvcmV0YWluaW5nX3BhdGg/bGltaXQ9IitILmQoYikpKS5tbChuZXcgWi5jTChhKSl9LCIkMSIsImdDSSIsMiwwLDEwOCwzM10sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuWGgpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e0NvVzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlJyPW51bGwKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMueUt4LlpMKGEpCiBDLnlLeC5YSShhKQpAQCAtMTE3NjcsNjYgKzExOTA5LDY2IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIHdVOnsKLSJeIjoiVHA6MTEwO2EiLAorIl4iOiJUcFo6MTExO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5hCiB5PUguQlUoSi5VUShhLCJ2YWx1ZUFzU3RyaW5nIiksbnVsbCxudWxsKQotei5Scj1KLlE1KHosQy50Zyx6LlJyLHkpfSwiJDEiLG51bGwsMiwwLG51bGwsOTIsImNhbGwiXSwKK3ouUnI9Si5RNSh6LEMudGcsei5Scix5KX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGNMOnsKLSJeIjoiVHA6MTQxO2EiLAorIl4iOiJUcFo6MTQzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQotei5mMj1KLlE1KHosQy5YTSx6LmYyLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTIsImNhbGwiXSwKK3ouZjI9Si5RNSh6LEMuWE0sei5mMixhKX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiaW9fdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaW9fdmlldy5kYXJ0IiwsRSx7CiAiXiI6IiIsCiBMNDp7Ci0iXiI6IlYxMztQTSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxMztQTSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBna206ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUE19LAogc2ttOmZ1bmN0aW9uKGEsYil7YS5QTT10aGlzLmN0KGEsQy5xcyxhLlBNLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5QTSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5QTSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7cDR0OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuemEuWkwoYSkKLUMuemEuWEkoYSkKK0Mud2QuWkwoYSkKK0Mud2QuWEkoYSkKIHJldHVybiBhfX19LAogVjEzOnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogTWI6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7UlZJOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuQWcuWkwoYSkKIEMuQWcuWEkoYSkKIHJldHVybiBhfX19LAogbU86ewotIl4iOiJWMTQ7Q3IsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMTQ7Q3IsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2p4OmZ1bmN0aW9uKGEpe3JldHVybiBhLkNyfSwKIHNqeDpmdW5jdGlvbihhLGIpe2EuQ3I9dGhpcy5jdChhLEMudnAsYS5DcixiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQ3IpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQ3IpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e0NoOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuSWUuWkwoYSkKIEMuSWUuWEkoYSkKQEAgLTExODM1LDI1ICsxMTk3NywyNSBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBERTp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogc3RhdGljOntvQjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLklnLlpMKGEpCiBDLklnLlhJKGEpCiByZXR1cm4gYX19fSwKIFUxOnsKLSJeIjoiVjE1O3lSLG1aLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjE1O3lSLG1aLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdxbDpmdW5jdGlvbihhKXtyZXR1cm4gYS55Un0sCiBzcWw6ZnVuY3Rpb24oYSxiKXthLnlSPXRoaXMuY3QoYSxDLm9qLGEueVIsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnlSKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnlSKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogTGc6W2Z1bmN0aW9uKGEpe0ouY0koYS55UikuWU0obmV3IEUuS3YoYSkpfSwiJDAiLCJnVzYiLDAsMCwxOF0sCiBFczpmdW5jdGlvbihhKXtaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIGEubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmdXNihhKSl9LApAQCAtMTE4NjIsMTQgKzEyMDA0LDE0IEBACiB6PWEubVoKIGlmKHohPW51bGwpe3ouZWQoKQogYS5tWj1udWxsfX0sCi1zdGF0aWM6e2htOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3N0YXRpYzp7VGlVOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMueDQuWkwoYSkKIEMueDQuWEkoYSkKQEAgLTExODc4LDE1ICsxMjAyMCwxNSBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBLdjp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmEKIGlmKHoubVohPW51bGwpei5tWj1QLnJUKFAuaWkoMCwwLDAsMCwwLDEpLEouQUwoeikpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogSDg6ewotIl4iOiJWMTY7dmQsbVosQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMTY7dmQsbVosQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1BCOmZ1bmN0aW9uKGEpe3JldHVybiBhLnZkfSwKIHNQQjpmdW5jdGlvbihhLGIpe2EudmQ9dGhpcy5jdChhLEMueUwsYS52ZCxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudmQpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudmQpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBMZzpbZnVuY3Rpb24oYSl7Si5jSShhLnZkKS5ZTShuZXcgRS51TihhKSl9LCIkMCIsImdXNiIsMCwwLDE4XSwKIEVzOmZ1bmN0aW9uKGEpe1oudUwucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKQogYS5tWj1QLnJUKFAuaWkoMCwwLDAsMCwwLDEpLHRoaXMuZ1c2KGEpKX0sCkBAIC0xMTg5OSw2NSArMTIwNDEsNjUgQEAKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuQnMuWkwoYSkKLUMuQnMuWEkoYSkKK0MuR0lJLlpMKGEpCitDLkdJSS5YSShhKQogcmV0dXJuIGF9fX0sCiBWMTY6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiB1Tjp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmEKIGlmKHoubVohPW51bGwpei5tWj1QLnJUKFAuaWkoMCwwLDAsMCwwLDEpLEouQUwoeikpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogV1M6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7alM6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5VZy5aTChhKQotQy5VZy5YSShhKQorQy5iUC5aTChhKQorQy5iUC5YSShhKQogcmV0dXJuIGF9fX0sCiBxaDp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKLXN0YXRpYzp7Y3VhOmZ1bmN0aW9uKGEpe3ZhciB6LHkKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAorc3RhdGljOntTYzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLndLLlpMKGEpCiBDLndLLlhJKGEpCiByZXR1cm4gYX19fSwKIG9GOnsKLSJeIjoiVjE3O0NyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjE3O0NyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqeDpmdW5jdGlvbihhKXtyZXR1cm4gYS5Dcn0sCiBzang6ZnVuY3Rpb24oYSxiKXthLkNyPXRoaXMuY3QoYSxDLnZwLGEuQ3IsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntVRTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlRsLlpMKGEpCiBDLlRsLlhJKGEpCkBAIC0xMTk2NiwxOCArMTIxMDgsMTggQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogUTY6ewotIl4iOiJWMTg7dXYsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMTg7dXYsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2o0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnV2fSwKIHNqNDpmdW5jdGlvbihhLGIpe2EudXY9dGhpcy5jdChhLEMuVmUsYS51dixiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudXYpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudXYpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e2NoRjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnRvLlpMKGEpCiBDLnRvLlhJKGEpCkBAIC0xMTk4NiwzMyArMTIxMjgsMzMgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogdUU6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7QVc6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5qcy5aTChhKQotQy5qcy5YSShhKQorQy5Sci5aTChhKQorQy5Sci5YSShhKQogcmV0dXJuIGF9fX0sCiBabjp7Ci0iXiI6IlYxOTtDcixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxOTtDcixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnang6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQ3J9LAogc2p4OmZ1bmN0aW9uKGEsYil7YS5Dcj10aGlzLmN0KGEsQy52cCxhLkNyLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKLXN0YXRpYzp7eEs6ZnVuY3Rpb24oYSl7dmFyIHoseQorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAorc3RhdGljOntrZjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmlqLlpMKGEpCiBDLmlqLlhJKGEpCkBAIC0xMjAyMSwxOCArMTIxNjMsMTggQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogbjU6ewotIl4iOiJWMjA7aDEsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMjA7aDEsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0h5OmZ1bmN0aW9uKGEpe3JldHVybiBhLmgxfSwKIHNIeTpmdW5jdGlvbihhLGIpe2EuaDE9dGhpcy5jdChhLEMuWUUsYS5oMSxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuaDEpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuaDEpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e2lPbzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmFWLlpMKGEpCiBDLmFWLlhJKGEpCkBAIC0xMjA0MSwxOCArMTIxODMsMTggQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogTWE6ewotIl4iOiJWMjE7Q3IsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMjE7Q3IsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2p4OmZ1bmN0aW9uKGEpe3JldHVybiBhLkNyfSwKIHNqeDpmdW5jdGlvbihhLGIpe2EuQ3I9dGhpcy5jdChhLEMudnAsYS5DcixiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQ3IpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCi1zdGF0aWM6e0lpOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK3N0YXRpYzp7SWkxOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuaVIuWkwoYSkKIEMuaVIuWEkoYSkKQEAgLTEyMDYxLDI1ICsxMjIwMywyNSBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiB3Tjp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogc3RhdGljOntNTDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkw2LlpMKGEpCiBDLkw2LlhJKGEpCiByZXR1cm4gYX19fSwKIGRzOnsKLSJeIjoiVjIyO3dULG1aLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjIyO3dULG1aLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdNWjpmdW5jdGlvbihhKXtyZXR1cm4gYS53VH0sCiBzTVo6ZnVuY3Rpb24oYSxiKXthLndUPXRoaXMuY3QoYSxDLmpVLGEud1QsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLndUKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLndUKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogbks6W2Z1bmN0aW9uKGEpe0ouY0koYS53VCkuWU0obmV3IEUubWooYSkpfSwiJDAiLCJndVQiLDAsMCwxOF0sCiBFczpmdW5jdGlvbihhKXtaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIGEubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmd1VChhKSl9LApAQCAtMTIwOTIsMTAgKzEyMjM0LDEwIEBACiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLndQLlpMKGEpCiBDLndQLlhJKGEpCkBAIC0xMjEwNCwyMyArMTIyNDYsMjMgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogbWo6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9dGhpcy5hCiBpZih6Lm1aIT1udWxsKXoubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLmxCKHopKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLW91OnsKLSJeIjoiVjIzO0NyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKK3FNOnsKKyJeIjoiVjIzO0NyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqeDpmdW5jdGlvbihhKXtyZXR1cm4gYS5Dcn0sCiBzang6ZnVuY3Rpb24oYSxiKXthLkNyPXRoaXMuY3QoYSxDLnZwLGEuQ3IsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOnt0WDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmxYLlpMKGEpCiBDLmxYLlhJKGEpCkBAIC0xMjEyOSw3ICsxMjI3MSw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIGF2OnsKLSJeIjoiWnpSO0NCLEFQLGZuLHRZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiWnpSO0NCLEFQLGZuLHRZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdFUTpmdW5jdGlvbihhKXtyZXR1cm4gYS5DQn0sCiBzRVE6ZnVuY3Rpb24oYSxiKXthLkNCPXRoaXMuY3QoYSxDLnBILGEuQ0IsYil9LAogc3RhdGljOntSNzpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC0xMjEzOCwxMCArMTIyODAsMTAgQEAKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuQ0I9ITEKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuT2tJLlpMKGEpCiBDLk9rSS5YSShhKQpAQCAtMTIxNTAsMTEgKzEyMjkyLDExIEBACiAiXiI6InhJK1BpOyIsCiAkaXNkMzp0cnVlfSwKIHV6OnsKLSJeIjoiVjI0O1JYLG1aLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjI0O1JYLG1aLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdOTjpmdW5jdGlvbihhKXtyZXR1cm4gYS5SWH0sCiBGbjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nTk4oYSkuJDAoKX0sCiBzTk46ZnVuY3Rpb24oYSxiKXthLlJYPXRoaXMuY3QoYSxDLldqLGEuUlgsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlJYKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlJYKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogbks6W2Z1bmN0aW9uKGEpe0ouY0koYS5SWCkuWU0obmV3IEUuQ2MoYSkpfSwiJDAiLCJndVQiLDAsMCwxOF0sCiBFczpmdW5jdGlvbihhKXtaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIGEubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmd1VChhKSl9LApAQCAtMTIxNjMsMTQgKzEyMzA1LDE0IEBACiB6PWEubVoKIGlmKHohPW51bGwpe3ouZWQoKQogYS5tWj1udWxsfX0sCi1zdGF0aWM6e3oxOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3N0YXRpYzp7WkZQOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuYlouWkwoYSkKIEMuYlouWEkoYSkKQEAgLTEyMTc5LDcgKzEyMzIxLDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogQ2M6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9dGhpcy5hCiBpZih6Lm1aIT1udWxsKXoubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLmxCKHopKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiaXNvbGF0ZV9wcm9maWxlX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pc29sYXRlX3Byb2ZpbGUuZGFydCIsLFgsewpAQCAtMTIxOTUsNyArMTIzMzcsNyBAQAogZm9yKHc9dGhpcy5ILHY9Si5tWShKLk14KHcpKSx1PXRoaXMuU0Y7di5HKCk7KXt0PXYuZ2woKQogcz1KLlg5KHQuZ0F2KCksdy5nQXYoKSkKIGlmKHR5cGVvZiB5IT09Im51bWJlciIpcmV0dXJuIEgucyh5KQotaWYoIShzPnl8fEouWDkoSi5vbih0KS5nUGwoKSx1LkF2KT55KSljb250aW51ZQoraWYoIShzPnl8fEouWDkoSi5vbih0KS5nRHUoKSx1LkF2KT55KSljb250aW51ZQogeC5wdXNoKFguU0ooeix1LHQsdGhpcykpfX0sCiBvODpmdW5jdGlvbigpe30sCiBOaDpmdW5jdGlvbigpe3JldHVybiBKLnE4KEouTXgodGhpcy5IKSk+MH0sCkBAIC0xMjIxMSw3ICsxMjM1Myw3IEBACiBlbHNlIHRoaXMuWm49SC5kKEouSXooeS5ndFQoeikpKSsiIChGdW5jdGlvbikiCiBpZihkPT1udWxsKXRoaXMudnM9Ry5kaih6LmdBdigpLHRoaXMuU0YuQXYpCiBlbHNlIHRoaXMudnM9Ry5kaih6LmdBdigpLGQuSC5nQXYoKSkKLXRoaXMua2k9Ry5kaih5Lmd0VCh6KS5nUGwoKSx0aGlzLlNGLkF2KX16PXRoaXMub0gKK3RoaXMua2k9Ry5kaih5Lmd0VCh6KS5nRHUoKSx0aGlzLlNGLkF2KX16PXRoaXMub0gKIHoucHVzaCh0aGlzLnZzKQogei5wdXNoKHRoaXMua2kpfSwKIHN0YXRpYzp7U0o6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseQpAQCAtMTIyMjIsNyArMTIzNjQsNyBAQAogei5tVyhhLGIsYyxkKQogcmV0dXJuIHp9fX0sCiBrSzp7Ci0iXiI6IlYyNTtvaSxUSCxXVCxVdyxJayxvbyxmRSxldixYWCxUTSxXQyxIbT0sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMjU7b2ksVEgsV1QsVXcsSWssb28sZkUsZXYsWFgsVE0sV0MsSG09LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdCMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5vaX0sCiBzQjE6ZnVuY3Rpb24oYSxiKXthLm9pPXRoaXMuY3QoYSxDLnZiLGEub2ksYil9LAogZ1BMOmZ1bmN0aW9uKGEpe3JldHVybiBhLlRIfSwKQEAgLTEyMjMxLDggKzEyMzczLDggQEAKIHNMVzpmdW5jdGlvbihhLGIpe2EuV1Q9dGhpcy5jdChhLEMuR3MsYS5XVCxiKX0sCiBnVW86ZnVuY3Rpb24oYSl7cmV0dXJuIGEuVXd9LAogc1VvOmZ1bmN0aW9uKGEsYil7YS5Vdz10aGlzLmN0KGEsQy5EaixhLlV3LGIpfSwKLWdFbDpmdW5jdGlvbihhKXtyZXR1cm4gYS5Ja30sCi1zRWw6ZnVuY3Rpb24oYSxiKXthLklrPXRoaXMuY3QoYSxDLllELGEuSWssYil9LAorZ1AyOmZ1bmN0aW9uKGEpe3JldHVybiBhLklrfSwKK3NQMjpmdW5jdGlvbihhLGIpe2EuSWs9dGhpcy5jdChhLEMuWUQsYS5JayxiKX0sCiBnblo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub299LAogc25aOmZ1bmN0aW9uKGEsYil7YS5vbz10aGlzLmN0KGEsQy5iRSxhLm9vLGIpfSwKIGdORzpmdW5jdGlvbihhKXtyZXR1cm4gYS5mRX0sCkBAIC0xMjI2OCwxMSArMTI0MTAsMTEgQEAKIEVzOmZ1bmN0aW9uKGEpe3ZhciB6CiBaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIHo9Ui50QihbXSkKLWEuSG09bmV3IEcuWE4oeixudWxsLG51bGwpCithLkhtPW5ldyBHLmlZKHosbnVsbCxudWxsKQogdGhpcy5aYihhKX0sCi1tNTpbZnVuY3Rpb24oYSxiKXt0aGlzLnBBKGEsbnVsbCl9LCIkMSIsImdiNiIsMiwwLDIwLDU3XSwKLXBBOltmdW5jdGlvbihhLGIpe3ZhciB6PSJwcm9maWxlP3RhZ3M9IitILmQoYS5UTSkKLUouYVQoYS5vaSkuY3YoeikubWwobmV3IFguWHkoYSkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCittNTpbZnVuY3Rpb24oYSxiKXt0aGlzLlNLKGEsbnVsbCl9LCIkMSIsImdiNiIsMiwwLDIwLDU3XSwKK1NLOltmdW5jdGlvbihhLGIpe3ZhciB6PSJwcm9maWxlP3RhZ3M9IitILmQoYS5UTSkKK0ouYVQoYS5vaSkuY3YoeikubWwobmV3IFguWHkoYSkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBaYjpmdW5jdGlvbihhKXtpZihhLm9pPT1udWxsKXJldHVybgogdGhpcy5HTihhKX0sCiBHTjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CkBAIC0xMjI4MSwxMCArMTI0MjMsMTAgQEAKIHRyeXthLkhtLm1BKFguU0ooYS5vaSx6LHosbnVsbCkpfWNhdGNoKHcpe3Y9SC5SdSh3KQogeT12CiB4PW5ldyBILlhPKHcsbnVsbCkKLU4uUU0oIiIpLnhIKCJfYnVpbGRTdGFja1RyZWUiLHkseCl9aWYoSi54QyhKLnE4KGEuSG0udnApLDEpKWEuSG0ucVUoMCkKK04uUU0oIiIpLndGKCJfYnVpbGRTdGFja1RyZWUiLHkseCl9aWYoSi54QyhKLnE4KGEuSG0udnApLDEpKWEuSG0ucVUoMCkKIHRoaXMuY3QoYSxDLmVwLG51bGwsYS5IbSl9LAota2E6W2Z1bmN0aW9uKGEsYil7cmV0dXJuInBhZGRpbmctbGVmdDogIitiLmd5dCgpKjE2KyJweDsifSwiJDEiLCJnSG4iLDIsMCw5OSwxMDBdLAotTFo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEMuUUNbQy5qbi5ZKGIuZ3l0KCktMSw5KV19LCIkMSIsImdidyIsMiwwLDk5LDEwMF0sCitrYTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4icGFkZGluZy1sZWZ0OiAiK2IuZ3l0KCkqMTYrInB4OyJ9LCIkMSIsImdIbiIsMiwwLDEwMCwxMDFdLAorTFo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEMuUUNbQy5qbi5ZKGIuZ3l0KCktMSw5KV19LCIkMSIsImdidyIsMiwwLDEwMCwxMDFdLAogWUY6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdQogdz1KLlJFKGIpCiBpZighSi54QyhKLmVTKHcuZ04oYikpLCJleHBhbmQiKSYmIUoueEMody5nTihiKSxkKSlyZXR1cm4KQEAgLTEyMjk1LDcgKzEyNDM3LDcgQEAKIHcucVUodi0xKX1jYXRjaCh1KXt3PUguUnUodSkKIHk9dwogeD1uZXcgSC5YTyh1LG51bGwpCi1OLlFNKCIiKS54SCgidG9nZ2xlRXhwYW5kZWQiLHkseCl9fSwiJDMiLCJnd0oiLDYsMCwxMDEsMSwxMDIsMTAzXSwKK04uUU0oIiIpLndGKCJ0b2dnbGVFeHBhbmRlZCIseSx4KX19LCIkMyIsImd3SiIsNiwwLDEwMiwxLDEwMywxMDRdLAogc3RhdGljOnsiXiI6IkI2IixqRDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCkBAIC0xMjMwOSwxMCArMTI0NTEsMTAgQEAKIGEuWFg9MC4wMDAyCiBhLlRNPSJ1diIKIGEuV0M9IiN0YWJsZVRyZWUiCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmtTLlpMKGEpCiBDLmtTLlhJKGEpCkBAIC0xMjMyMSwzOSArMTI0NjMsMzkgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogWHk6ewotIl4iOiJUcDoxMTA7YSIsCisiXiI6IlRwWjoxMTE7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi16Lm9pPUouUTUoeixDLnZiLHoub2ksYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTYsImNhbGwiXSwKK3oub2k9Si5RNSh6LEMudmIsei5vaSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDE1OCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImlzb2xhdGVfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pc29sYXRlX3JlZi5kYXJ0IiwsTix7CiAiXiI6IiIsCiBvYTp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoieEk7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogc3RhdGljOntJQjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkxOLlpMKGEpCiBDLkxOLlhJKGEpCiByZXR1cm4gYX19fX1dLFsiaXNvbGF0ZV9zdW1tYXJ5X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pc29sYXRlX3N1bW1hcnkuZGFydCIsLEQsewogIl4iOiIiLAogU3Q6ewotIl4iOiJWMjY7b3csQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMjY7b3csQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBhLm93fSwKIHNvZDpmdW5jdGlvbihhLGIpe2Eub3c9dGhpcy5jdChhLEMuckIsYS5vdyxiKX0sCiBzdGF0aWM6e041OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuT29GLlpMKGEpCiBDLk9vRi5YSShhKQpAQCAtMTIzNjIsMTkgKzEyNTA0LDE5IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIElXOnsKLSJeIjoiVjI3O293LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjI3O293LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5vd30sCiBzb2Q6ZnVuY3Rpb24oYSxiKXthLm93PXRoaXMuY3QoYSxDLnJCLGEub3csYil9LAotRnY6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIGEub3cuY3YoImRlYnVnL3BhdXNlIikubWwobmV3IEQuR0coYSkpfSwiJDEiLCJnWDAiLDIsMCwxNTcsMTRdLAota2Y6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIGEub3cuY3YoImRlYnVnL3Jlc3VtZSIpLm1sKG5ldyBELnI4KGEpKX0sIiQxIiwiZ0RRIiwyLDAsMTU3LDE0XSwKK0Z2OltmdW5jdGlvbihhLGIpe3JldHVybiBhLm93LmN2KCJkZWJ1Zy9wYXVzZSIpLm1sKG5ldyBELnJmKGEpKX0sIiQxIiwiZ1gwIiwyLDAsMTU5LDE0XSwKK2tmOltmdW5jdGlvbihhLGIpe3JldHVybiBhLm93LmN2KCJkZWJ1Zy9yZXN1bWUiKS5tbChuZXcgRC5yOChhKSl9LCIkMSIsImdEUSIsMiwwLDE1OSwxNF0sCiBzdGF0aWM6e3pyOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuRjIuWkwoYSkKIEMuRjIuWEkoYSkKQEAgLTEyMzgyLDI4ICsxMjUyNCwyOCBAQAogVjI3OnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAotR0c6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEub3cpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCityZjp7CisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEub3cpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHI4OnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLSQubWYueDMoei5vdykKLXJldHVybiBKLmNJKHoub3cpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCiskLktoLngzKHoub3cpCityZXR1cm4gSi5jSSh6Lm93KX0sIiQxIixudWxsLDIsMCxudWxsLDE0MiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBRaDp7Ci0iXiI6IlYyODtvdyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYyODtvdyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3d9LAogc29kOmZ1bmN0aW9uKGEsYil7YS5vdz10aGlzLmN0KGEsQy5yQixhLm93LGIpfSwKIHN0YXRpYzp7UWo6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5WaS5aTChhKQogQy5WaS5YSShhKQpAQCAtMTI0MTIsMTcgKzEyNTU0LDE3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE96OnsKLSJeIjoiVjI5O293LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjI5O293LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5vd30sCiBzb2Q6ZnVuY3Rpb24oYSxiKXthLm93PXRoaXMuY3QoYSxDLnJCLGEub3csYil9LAogc3RhdGljOntSUDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkppLlpMKGEpCiBDLkppLlhJKGEpCkBAIC0xMjQzNywxOCArMTI1NzksMTggQEAKIGlmKEoueEMoei5uUSgiZ2V0TnVtYmVyT2ZDb2x1bW5zIiksMCkpe3ouVjcoImFkZENvbHVtbiIsWyJzdHJpbmciLCJOYW1lIl0pCiB6LlY3KCJhZGRDb2x1bW4iLFsibnVtYmVyIiwiVmFsdWUiXSl9ei5WNygicmVtb3ZlUm93cyIsWzAsei5uUSgiZ2V0TnVtYmVyT2ZSb3dzIildKQogZm9yKHk9Si5SRShhKSx4PUoubVkoeS5ndmMoYSkpO3guRygpOyl7dz14LmdsKCkKLXY9Si51SCh5LnQoYSx3KSwiJSIpCit2PUouSXQoeS50KGEsdyksIiUiKQogaWYoMD49di5sZW5ndGgpcmV0dXJuIEguZSh2LDApCiB1PVtdCiBDLk5tLkZWKHUsQy5ObS5leihbdyxILlJSKHZbMF0sbnVsbCldLFAuRW4oKSkpCi11PW5ldyBQLlR6KHUpCit1PW5ldyBQLkdEKHUpCiB1LiRidWlsdGluVHlwZUluZm89W251bGxdCiB6LlY3KCJhZGRSb3ciLFt1XSl9fX0sCiBaNDp7Ci0iXiI6IlYzMDt3ZCxpdyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzMDt3ZCxpdyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnWEU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEud2R9LAogc1hFOmZ1bmN0aW9uKGEsYil7YS53ZD10aGlzLmN0KGEsQy5iSixhLndkLGIpfSwKLUszOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseAorYWs6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4CiBpZihhLndkPT1udWxsKXJldHVybgogaWYoJC5JYigpLk1NLkd2IT09MCYmYS5pdz09bnVsbClhLml3PW5ldyBELnZUKG5ldyBHLktmKFAuelYoSi5VUSgkLkJZLCJEYXRhVGFibGUiKSxudWxsKSksbnVsbCkKIHo9YS5pdwpAQCAtMTI0NjQsMTAgKzEyNjA2LDEwIEBACiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmFYUC5aTChhKQogQy5hWFAuWEkoYSkKQEAgLTEyNDc2LDEwICsxMjYxOCwxMCBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX19XSxbImlzb2xhdGVfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaXNvbGF0ZV92aWV3LmRhcnQiLCxMLHsKICJeIjoiIiwKLUlmOnsKLSJeIjoiYTtYNixZVCIsCitwNjk6eworIl4iOiJhO1lpLFMyIiwKIGVDOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxCi16PXRoaXMuWDYuS0oKK3o9dGhpcy5ZaS5LSgogaWYoSi54Qyh6Lm5RKCJnZXROdW1iZXJPZkNvbHVtbnMiKSwwKSl7ei5WNygiYWRkQ29sdW1uIixbInN0cmluZyIsIlRpbWUiXSkKIGZvcih5PUoubVkoYS5nYWYoKSk7eS5HKCk7KXt4PXkubG8KIGlmKEoueEMoeCwiSWRsZSIpKWNvbnRpbnVlCkBAIC0xMjQ5NCw3ICsxMjYzNiw3IEBACiBzLnB1c2goInQgIitDLkNELlN5KHQtdiwyKSl9ZWxzZSBzLnB1c2goIiIpCiB5PWEuZ2xJKCkKIGlmKHU+PXkubGVuZ3RoKXJldHVybiBILmUoeSx1KQotcj15W3VdLndaCityPXlbdV0uT1EKIGlmKHI9PT0wKXtxPTAKIHdoaWxlKCEwKXt5PWEuZ2xJKCkKIGlmKHU+PXkubGVuZ3RoKXJldHVybiBILmUoeSx1KQpAQCAtMTI1MTEsMzcgKzEyNjUzLDM3IEBACiBpZihxPj15Lmxlbmd0aClyZXR1cm4gSC5lKHkscSkKIHMucHVzaChDLkNELnl1KEouWDkoeVtxXSxyKSoxMDApKX0rK3F9fXk9W10KIEMuTm0uRlYoeSxDLk5tLmV6KHMsUC5FbigpKSkKLXk9bmV3IFAuVHooeSkKK3k9bmV3IFAuR0QoeSkKIHkuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KIHouVjcoImFkZFJvdyIsW3ldKX19fSwKIHFrOnsKLSJeIjoiVjMxO2NrLHRzLHR1LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKLWdvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5ja30sCi1zb2Q6ZnVuY3Rpb24oYSxiKXthLmNrPXRoaXMuY3QoYSxDLnJCLGEuY2ssYil9LAotdlY6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5jawotcmV0dXJuIHouY3YoSi5ldyhKLmVTKHouZ1ZjKCkpLCIvZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpKX0sIiQxIiwiZ1ptIiwyLDAsMTA1LDEwNl0sCi1WcDpbZnVuY3Rpb24oYSl7YS5jay5tNygpLm1sKG5ldyBMLkxYKGEpKX0sIiQwIiwiZ0pEIiwwLDAsMThdLAorIl4iOiJWMzE7VE8sQ24sRnMsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAorZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBhLlRPfSwKK3NvZDpmdW5jdGlvbihhLGIpe2EuVE89dGhpcy5jdChhLEMuckIsYS5UTyxiKX0sCit2VjpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLlRPCityZXR1cm4gei5jdihKLmV3KEouZVMoei5nVmMoKSksIi9ldmFsP2V4cHI9IitQLmpXKEMueUQsYixDLnhNLCExKSkpfSwiJDEiLCJnWm0iLDIsMCwxMDYsMTA3XSwKK3RJOltmdW5jdGlvbihhKXthLlRPLm03KCkubWwobmV3IEwuTFgoYSkpfSwiJDAiLCJnQ3QiLDAsMCwxOF0sCiBFczpmdW5jdGlvbihhKXtaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKLWEudHM9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmdKRChhKSl9LAorYS5Dbj1QLnJUKFAuaWkoMCwwLDAsMCwwLDEpLHRoaXMuZ0N0KGEpKX0sCiBkUTpmdW5jdGlvbihhKXt2YXIgegogWi51TC5wcm90b3R5cGUuZFEuY2FsbCh0aGlzLGEpCi16PWEudHMKK3o9YS5DbgogaWYoeiE9bnVsbCl7ei5lZCgpCi1hLnRzPW51bGx9fSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5jaykuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKLWo5OltmdW5jdGlvbihhLGIpe0ouZWcoYS5jaykuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk4XSwKLUZ2OltmdW5jdGlvbihhLGIpe3JldHVybiBhLmNrLmN2KCJkZWJ1Zy9wYXVzZSIpLm1sKG5ldyBMLkNWKGEpKX0sIiQxIiwiZ1gwIiwyLDAsMTU3LDE0XSwKLWtmOltmdW5jdGlvbihhLGIpe3JldHVybiBhLmNrLmN2KCJyZXN1bWUiKS5tbChuZXcgTC5WcShhKSl9LCIkMSIsImdEUSIsMiwwLDE1NywxNF0sCithLkNuPW51bGx9fSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5UTykuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK2o5OltmdW5jdGlvbihhLGIpe0ouZWcoYS5UTykuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk5XSwKK0Z2OltmdW5jdGlvbihhLGIpe3JldHVybiBhLlRPLmN2KCJkZWJ1Zy9wYXVzZSIpLm1sKG5ldyBMLkNWKGEpKX0sIiQxIiwiZ1gwIiwyLDAsMTU5LDE0XSwKK2tmOltmdW5jdGlvbihhLGIpe3JldHVybiBhLlRPLmN2KCJyZXN1bWUiKS5tbChuZXcgTC5WcShhKSl9LCIkMSIsImdEUSIsMiwwLDE1OSwxNF0sCiBzdGF0aWM6e1F0cDpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9UC56VihKLlVRKCQuQlksIkRhdGFUYWJsZSIpLG51bGwpCiB5PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeD1QLnFVCiB4PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx4LG51bGwpLG51bGwsbnVsbCksW3gsbnVsbF0pCi1hLnR1PW5ldyBMLklmKG5ldyBHLktmKHopLG51bGwpCi1hLlNhPVtdCithLkZzPW5ldyBMLnA2OShuZXcgRy5LZih6KSxudWxsKQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT15CithLm9HPSExCithLlpNPXkKIGEuWlE9eAogQy5YZS5aTChhKQogQy5YZS5YSShhKQpAQCAtMTI1NTAsMjcgKzEyNjkyLDI3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIExYOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuYQoteT16LnR1Cit5PXouRnMKIHkuZUMoYSkKIHg9KHouc2hhZG93Um9vdHx8ei53ZWJraXRTaGFkb3dSb290KS5xdWVyeVNlbGVjdG9yKCIjdGFnUHJvZmlsZUNoYXJ0IikKLWlmKHghPW51bGwpe2lmKHkuWVQ9PW51bGwpe3c9UC5MNShudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCitpZih4IT1udWxsKXtpZih5LlMyPT1udWxsKXt3PVAuTDUobnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogdj1uZXcgRy5xdShudWxsLHcpCiB2LnZSPVAuelYoSi5VUSgkLkJZLCJTdGVwcGVkQXJlYUNoYXJ0IiksW3hdKQoteS5ZVD12Cit5LlMyPXYKIHcudSgwLCJpc1N0YWNrZWQiLCEwKQoteS5ZVC5iRy51KDAsImNvbm5lY3RTdGVwcyIsITEpCi15LllULmJHLnUoMCwidkF4aXMiLFAuRUYoWyJtaW5WYWx1ZSIsMCwibWF4VmFsdWUiLDEwMF0sbnVsbCxudWxsKSl9eS5ZVC5XMih5Llg2KX1pZih6LnRzIT1udWxsKXoudHM9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLk9ZKHopKX0sIiQxIixudWxsLDIsMCxudWxsLDE1OCwiY2FsbCJdLAoreS5TMi5iRy51KDAsImNvbm5lY3RTdGVwcyIsITEpCit5LlMyLmJHLnUoMCwidkF4aXMiLFAuRUYoWyJtaW5WYWx1ZSIsMCwibWF4VmFsdWUiLDEwMF0sbnVsbCxudWxsKSl9eS5TMi5XMih5LllpKX1pZih6LkNuIT1udWxsKXouQ249UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLko3KHopKX0sIiQxIixudWxsLDIsMCxudWxsLDE2MCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBDVjp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmNJKHRoaXMuYS5jayl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDAsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmNJKHRoaXMuYS5UTyl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDIsImNhbGwiXSwKICRpc0VIOnRydWV9LAogVnE6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEuY2spfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEuVE8pfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsianNvbl92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9qc29uX3ZpZXcuZGFydCIsLFosewogIl4iOiIiLAogeGg6ewpAQCAtMTI2MjQsNyArMTI3NjYsNyBAQAogdT14LnZNKz10eXBlb2Ygdj09PSJzdHJpbmciP3Y6SC5kKHYpCiB4LnZNPXUrIlxuIn19ei5SeigwLGEpfX0sCiB2ajp7Ci0iXiI6IlYzMjtMeSxjcyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzMjtMeSxjcyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnSXI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuTHl9LAogZXo6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nSXIoYSkuJDEoYil9LAogc0lyOmZ1bmN0aW9uKGEsYil7YS5MeT10aGlzLmN0KGEsQy5TUixhLkx5LGIpfSwKQEAgLTEyNjQ0LDEwICsxMjc4NiwxMCBAQAogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5ZdC5aTChhKQogQy5ZdC5YSShhKQpAQCAtMTI2NTcsMzYgKzEyNzk5LDM2IEBACiAkaXNkMzp0cnVlfX1dLFsibGlicmFyeV9yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2xpYnJhcnlfcmVmLmRhcnQiLCxSLHsKICJeIjoiIiwKIExVOnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAotc3RhdGljOntyQTpmdW5jdGlvbihhKXt2YXIgeix5CisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKK3N0YXRpYzp7VjQ6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5aMy5aTChhKQogQy5aMy5YSShhKQogcmV0dXJuIGF9fX19XSxbImxpYnJhcnlfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvbGlicmFyeV92aWV3LmRhcnQiLCxNLHsKICJeIjoiIiwKIENYOnsKLSJeIjoiVjMzO2lJLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjMzO2lJLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdIdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pSX0sCiBzSHQ6ZnVuY3Rpb24oYSxiKXthLmlJPXRoaXMuY3QoYSxDLkVWLGEuaUksYil9LAotdlY6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5pSSkuY3YoSi5ldyhKLmVTKGEuaUkpLCIvZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpKX0sIiQxIiwiZ1ptIiwyLDAsMTA1LDEwNl0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuaUkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCi1qOTpbZnVuY3Rpb24oYSxiKXtKLmVnKGEuaUkpLllNKGIpfSwiJDEiLCJnRFgiLDIsMCwyMCw5OF0sCit2VjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5hVChhLmlJKS5jdihKLmV3KEouZVMoYS5pSSksIi9ldmFsP2V4cHI9IitQLmpXKEMueUQsYixDLnhNLCExKSkpfSwiJDEiLCJnWm0iLDIsMCwxMDYsMTA3XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5pSSkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK2o5OltmdW5jdGlvbihhLGIpe0ouZWcoYS5pSSkuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7YXM6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5NRy5aTChhKQogQy5NRy5YSShhKQpAQCAtMTI2OTUsNyArMTI4MzcsNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX19XSxbImxvZ2dpbmciLCJwYWNrYWdlOmxvZ2dpbmcvbG9nZ2luZy5kYXJ0IiwsTix7CiAiXiI6IiIsCi1Sdzp7CitUSjp7CiAiXiI6ImE7b2M+LGVUPixuMixDaj4sa3M+LEdzIiwKIGdCODpmdW5jdGlvbigpe3ZhciB6LHkseAogej10aGlzLmVUCkBAIC0xMjcyNiwzMSArMTI4NjgsMzEgQEAKIE55OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRMKGEsbnVsbCxudWxsKX0sCiBaRzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuWTYoQy5JRixhLGIsYyl9LAogVG86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWkcoYSxudWxsLG51bGwpfSwKLXhIOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5ZNihDLm5ULGEsYixjKX0sCi1qMjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54SChhLG51bGwsbnVsbCl9LAord0Y6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLlk2KEMublQsYSxiLGMpfSwKK2oyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLndGKGEsbnVsbCxudWxsKX0sCiBXQjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuWTYoQy5jZCxhLGIsYyl9LAogWVg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuV0IoYSxudWxsLG51bGwpfSwKIHRROmZ1bmN0aW9uKCl7aWYoJC5STHx8dGhpcy5lVD09bnVsbCl7dmFyIHo9dGhpcy5HcwogaWYoej09bnVsbCl7ej1QLmJLKG51bGwsbnVsbCwhMCxOLkhWKQogdGhpcy5Hcz16fXoudG9TdHJpbmcKLXJldHVybiBILlZNKG5ldyBQLklrKHopLFtILktwKHosMCldKX1lbHNlIHJldHVybiBOLlFNKCIiKS50USgpfSwKK3JldHVybiBILlZNKG5ldyBQLklrKHopLFtILk9xKHosMCldKX1lbHNlIHJldHVybiBOLlFNKCIiKS50USgpfSwKIGNCOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuR3MKIGlmKHohPW51bGwpe2lmKHouR3Y+PTQpSC52aCh6LnE3KCkpCiB6Lkl2KGEpfX0sCiBRTDpmdW5jdGlvbihhLGIsYyl7dmFyIHo9dGhpcy5lVAogaWYoeiE9bnVsbClKLlRyKHopLnUoMCx0aGlzLm9jLHRoaXMpfSwKLSRpc1J3OnRydWUsCiskaXNUSjp0cnVlLAogc3RhdGljOnsiXiI6IlVqIixRTTpmdW5jdGlvbihhKXtyZXR1cm4gJC5JdSgpLnRvKDAsYSxuZXcgTi5hTyhhKSl9fX0sCiBhTzp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5hCiBpZihDLnhCLm5DKHosIi4iKSlILnZoKFAudSgibmFtZSBzaG91bGRuJ3Qgc3RhcnQgd2l0aCBhICcuJyIpKQogeT1DLnhCLmNuKHosIi4iKQogaWYoeT09PS0xKXg9eiE9PSIiP04uUU0oIiIpOm51bGwKIGVsc2V7eD1OLlFNKEMueEIuTmooeiwwLHkpKQotej1DLnhCLnluKHoseSsxKX13PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxOLlJ3KQotdj1uZXcgTi5Sdyh6LHgsbnVsbCx3LEguVk0obmV3IFEuQTIodyksW251bGwsbnVsbF0pLG51bGwpCit6PUMueEIueW4oeix5KzEpfXc9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLE4uVEopCit2PW5ldyBOLlRKKHoseCxudWxsLHcsSC5WTShuZXcgUS5BMih3KSxbbnVsbCxudWxsXSksbnVsbCkKIHYuUUwoeix4LHcpCiByZXR1cm4gdn0sCiAkaXNFSDp0cnVlfSwKQEAgLTEyNzc0LDM1ICsxMjkxNiwzNSBAQAogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiByZXR1cm4gdGhpcy5QLXp9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlB9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub2N9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9jfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNxVjp0cnVlLAogc3RhdGljOnsiXiI6IlY3Syx0bWosRW5rLExrTyx0WSxrSDgsaGxLLE1ISyxmTSxsRHUsdXhjIn19LAogSFY6ewogIl4iOiJhO09SPCxHMT4saUosRmw8LGMwLGtjPixJNDwiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlsiK3RoaXMuT1Iub2MrIl0gIit0aGlzLmlKKyI6ICIrdGhpcy5HMX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlsiK3RoaXMuT1Iub2MrIl0gIit0aGlzLmlKKyI6ICIrdGhpcy5HMX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzSFY6dHJ1ZSwKIHN0YXRpYzp7Il4iOiJ4TyJ9fX1dLFsiIiwibWFpbi5kYXJ0IiwsRix7CiAiXiI6IiIsCiBFMjpmdW5jdGlvbigpe3ZhciB6LHkKIE4uUU0oIiIpLnNPUihDLklGKQotTi5RTSgiIikuZ1NaKCkueUkobmV3IEYuZTQzMygpKQorTi5RTSgiIikuZ1NaKCkueUkobmV3IEYuZTQ0NygpKQogTi5RTSgiIikuVG8oIlN0YXJ0aW5nIE9ic2VydmF0b3J5IikKIE4uUU0oIiIpLlRvKCJMb2FkaW5nIEdvb2dsZSBDaGFydHMgQVBJIikKIHo9Si5VUSgkLlNpKCksImdvb2dsZSIpCiB5PSQuSWIoKQogei5WNygibG9hZCIsWyJ2aXN1YWxpemF0aW9uIiwiMSIsUC5qVChQLkVGKFsicGFja2FnZXMiLFsiY29yZWNoYXJ0IiwidGFibGUiXSwiY2FsbGJhY2siLFAubXQoeS5ndjYoeSkpXSxudWxsLG51bGwpKV0pCi0kLkliKCkuTU0ubWwoRy52TigpKS5tbChuZXcgRi5lNDM0KCkpfSwKLWU0MzM6ewotIl4iOiJUcDoxNjA7IiwKKyQuSWIoKS5NTS5tbChHLnZOKCkpLm1sKG5ldyBGLmU0NDgoKSl9LAorZTQ0Nzp7CisiXiI6IlRwWjoxNjI7IiwKICQxOltmdW5jdGlvbihhKXt2YXIgegogaWYoSi54QyhhLmdPUigpLEMublQpKXt6PUouUkUoYSkKIGlmKEouY28oei5nRzEoYSksIkVycm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiIpKXo9Si54NSh6LmdHMShhKSwiQ2FuJ3QgYXNzaWduIHRvIG51bGw6ICIpPT09ITB8fEoueDUoei5nRzEoYSksIkV4cHJlc3Npb24gaXMgbm90IGFzc2lnbmFibGU6ICIpPT09ITAKIGVsc2Ugej0hMX1lbHNlIHo9ITEKIGlmKHopcmV0dXJuCi1QLkZMKGEuZ09SKCkub2MrIjogIithLmdGbCgpLmJ1KDApKyI6ICIrSC5kKEouejIoYSkpKX0sIiQxIixudWxsLDIsMCxudWxsLDE1OSwiY2FsbCJdLAorUC5GTChhLmdPUigpLm9jKyI6ICIrYS5nRmwoKS5idSgwKSsiOiAiK0guZChKLnoyKGEpKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNjEsImNhbGwiXSwKICRpc0VIOnRydWV9LAotZTQzNDp7Ci0iXiI6IlRwOjEzOyIsCitlNDQ4OnsKKyJeIjoiVHBaOjEzOyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4CiBOLlFNKCIiKS5UbygiSW5pdGlhbGl6aW5nIFBvbHltZXIiKQogdHJ5e0EuWUsoKX1jYXRjaCh5KXt4PUguUnUoeSkKQEAgLTEyODExLDcgKzEyOTUzLDcgQEAKICRpc0VIOnRydWV9fV0sWyJuYXZfYmFyX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9uYXZfYmFyLmRhcnQiLCxBLHsKICJeIjoiIiwKIG1kOnsKLSJeIjoiVjM0O2k0LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjM0O2k0LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdpQzpmdW5jdGlvbihhKXtyZXR1cm4gYS5pNH0sCiBzaUM6ZnVuY3Rpb24oYSxiKXthLmk0PXRoaXMuY3QoYSxDLllzLGEuaTQsYil9LAogc3RhdGljOntEQ2k6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtMTI4MTksMTAgKzEyOTYxLDEwIEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuaTQ9ITAKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMua0QuWkwoYSkKIEMua0QuWEkoYSkKQEAgLTEyODMxLDcgKzEyOTczLDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogQm06ewotIl4iOiJWMzU7S1UsVjQsSm8sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMzU7S1UsVjQsSm8sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1BqOmZ1bmN0aW9uKGEpe3JldHVybiBhLktVfSwKIHNQajpmdW5jdGlvbihhLGIpe2EuS1U9dGhpcy5jdChhLEMua1YsYS5LVSxiKX0sCiBnZFU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuVjR9LApAQCAtMTI4NDUsMTAgKzEyOTg3LDEwIEBACiBhLktVPSIjIgogYS5WND0iLS0tIgogYS5Kbz0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5JRy5aTChhKQogQy5JRy5YSShhKQpAQCAtMTI4NTcsNyArMTI5OTksNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBZYTp7Ci0iXiI6IlYzNjtLVSxWNCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzNjtLVSxWNCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnUGo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuS1V9LAogc1BqOmZ1bmN0aW9uKGEsYil7YS5LVT10aGlzLmN0KGEsQy5rVixhLktVLGIpfSwKIGdkVTpmdW5jdGlvbihhKXtyZXR1cm4gYS5WNH0sCkBAIC0xMjg2OCwxOSArMTMwMTAsMTkgQEAKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuS1U9IiMiCiBhLlY0PSItLS0iCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLm5uLlpMKGEpCi1DLm5uLlhJKGEpCitDLk5rLlpMKGEpCitDLk5rLlhJKGEpCiByZXR1cm4gYX19fSwKIFYzNjp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFd3OnsKLSJeIjoiVjM3O3JVLFNCLHoyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjM3O3JVLFNCLHoyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdGUjpmdW5jdGlvbihhKXtyZXR1cm4gYS5yVX0sCiBLaTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nRlIoYSkuJDAoKX0sCiBMWTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmdGUihhKS4kMShiKX0sCkBAIC0xMjg4OSwxMCArMTMwMzEsMTAgQEAKIHNqbDpmdW5jdGlvbihhLGIpe2EuU0I9dGhpcy5jdChhLEMuYVAsYS5TQixiKX0sCiBncGg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuejJ9LAogc3BoOmZ1bmN0aW9uKGEsYil7YS56Mj10aGlzLmN0KGEsQy5oZixhLnoyLGIpfSwKLVcxOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1hLlNCCitLcDpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9YS5TQgogaWYoej09PSEwKXJldHVybgogYS5TQj10aGlzLmN0KGEsQy5hUCx6LCEwKQotaWYoYS5yVSE9bnVsbCl0aGlzLkxZKGEsdGhpcy5nV2QoYSkpfSwiJDMiLCJnelkiLDYsMCwxMTEsMSwxMDIsMTAzXSwKK2lmKGEuclUhPW51bGwpdGhpcy5MWShhLHRoaXMuZ1dkKGEpKX0sIiQzIiwiZ3pZIiw2LDAsMTEyLDEsMTAzLDEwNF0sCiByYTpbZnVuY3Rpb24oYSl7YS5TQj10aGlzLmN0KGEsQy5hUCxhLlNCLCExKX0sIiQwIiwiZ1dkIiwwLDAsMThdLAogc3RhdGljOntaQzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQpAQCAtMTI5MDAsMzMgKzEzMDQyLDMzIEBACiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlNCPSExCiBhLnoyPSJSZWZyZXNoIgotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5KNy5aTChhKQotQy5KNy5YSShhKQorQy5ZNi5aTChhKQorQy5ZNi5YSShhKQogcmV0dXJuIGF9fX0sCiBWMzc6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiB5ZTp7Ci0iXiI6InVMO2RpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoidUw7dEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogc3RhdGljOntXMTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnBsLlpMKGEpCiBDLnBsLlhJKGEpCiByZXR1cm4gYX19fSwKIEcxOnsKLSJeIjoiVjM4O0pvLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjM4O0pvLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdyWjpmdW5jdGlvbihhKXtyZXR1cm4gYS5Kb30sCiBzclo6ZnVuY3Rpb24oYSxiKXthLkpvPXRoaXMuY3QoYSxDLnVrLGEuSm8sYil9LAogc3RhdGljOntKODpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC0xMjkzNCwxMCArMTMwNzYsMTAgQEAKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5Kbz0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5PS2wuWkwoYSkKIEMuT0tsLlhJKGEpCkBAIC0xMjk0Niw3ICsxMzA4OCw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIGZsOnsKLSJeIjoiVjM5O0pvLGl5LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjM5O0pvLGl5LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdyWjpmdW5jdGlvbihhKXtyZXR1cm4gYS5Kb30sCiBzclo6ZnVuY3Rpb24oYSxiKXthLkpvPXRoaXMuY3QoYSxDLnVrLGEuSm8sYil9LAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBhLml5fSwKQEAgLTEyOTYxLDEwICsxMzEwMywxMCBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLkpvPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlJSbC5aTChhKQogQy5SUmwuWEkoYSkKQEAgLTEyOTczLDcgKzEzMTE1LDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogVUs6ewotIl4iOiJWNDA7VlcsSm8sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDA7VlcsSm8sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0h0OmZ1bmN0aW9uKGEpe3JldHVybiBhLlZXfSwKIHNIdDpmdW5jdGlvbihhLGIpe2EuVlc9dGhpcy5jdChhLEMuRVYsYS5WVyxiKX0sCiBnclo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSm99LApAQCAtMTI5ODMsMTAgKzEzMTI1LDEwIEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuSm89ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuY3QuWkwoYSkKIEMuY3QuWEkoYSkKQEAgLTEyOTk1LDcgKzEzMTM3LDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogd006ewotIl4iOiJWNDE7QXUsSm8sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDE7QXUsSm8sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1J1OmZ1bmN0aW9uKGEpe3JldHVybiBhLkF1fSwKIHNSdTpmdW5jdGlvbihhLGIpe2EuQXU9dGhpcy5jdChhLEMuWEEsYS5BdSxiKX0sCiBnclo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSm99LApAQCAtMTMwMDUsMjkgKzEzMTQ3LDI5IEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuSm89ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuSFIuWkwoYSkKLUMuSFIuWEkoYSkKK0MuaWMuWkwoYSkKK0MuaWMuWEkoYSkKIHJldHVybiBhfX19LAogVjQxOnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogTks6ewotIl4iOiJWNDI7cnYsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDI7cnYsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1JrOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJ2fSwKIHNSazpmdW5jdGlvbihhLGIpe2EucnY9dGhpcy5jdChhLEMubGQsYS5ydixiKX0sCiBzdGF0aWM6e1hpaTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk1uLlpMKGEpCiBDLk1uLlhJKGEpCkBAIC0xMzAzNiwyMCArMTMxNzgsMjAgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogWng6ewotIl4iOiJWNDM7cnYsV3gsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDM7cnYsV3gsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1JrOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJ2fSwKIHNSazpmdW5jdGlvbihhLGIpe2EucnY9dGhpcy5jdChhLEMubGQsYS5ydixiKX0sCiBnQms6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuV3h9LAogc0JrOmZ1bmN0aW9uKGEsYil7YS5XeD10aGlzLmN0KGEsQy5wOCxhLld4LGIpfSwKLWN6OltmdW5jdGlvbihhLGIsYyxkKXtKLlYxKGEucnYsYS5XeCl9LCIkMyIsImdUQSIsNiwwLDE2MSwxLDEwMiwxMDNdLAotc3RhdGljOnt6QzpmdW5jdGlvbihhKXt2YXIgeix5CitjejpbZnVuY3Rpb24oYSxiLGMsZCl7Si5WMShhLnJ2LGEuV3gpfSwiJDMiLCJnVEEiLDYsMCwxNjMsMSwxMDMsMTA0XSwKK3N0YXRpYzp7T3c6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5MOC5aTChhKQogQy5MOC5YSShhKQpAQCAtMTMwNTksMjkgKzEzMjAxLDI5IEBACiAkaXNkMzp0cnVlfX1dLFsib2JzZXJ2YXRvcnlfYXBwbGljYXRpb25fZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL29ic2VydmF0b3J5X2FwcGxpY2F0aW9uLmRhcnQiLCxWLHsKICJeIjoiIiwKIEYxOnsKLSJeIjoiVjQ0O3FDLGk2PSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY0NDtxQyxpNj0sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3pqOmZ1bmN0aW9uKGEpe3JldHVybiBhLnFDfSwKIHN6ajpmdW5jdGlvbihhLGIpe2EucUM9dGhpcy5jdChhLEMuVkssYS5xQyxiKX0sCiBFczpmdW5jdGlvbihhKXt2YXIgeix5LHgKIFoudUwucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKQotaWYoYS5xQz09PSEwKXt6PW5ldyBHLm1MKEguVk0oW10sW0cudUddKSxudWxsLG5ldyBHLm5nKCIvdm0iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCxudWxsLG51bGwsYSxudWxsLFEuY2gobnVsbCxELk1rKSxudWxsLG51bGwpCitpZihhLnFDPT09ITApe3o9bmV3IEcubUwoSC5WTShbXSxbRy5PU10pLG51bGwsbmV3IEcubmcoIi92bSIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxudWxsLG51bGwsbnVsbCxhLG51bGwsUS5jaChudWxsLEQuTWspLG51bGwsbnVsbCkKIHouRTAoYSkKLWEuaTY9en1lbHNle3o9SC5WTShbXSxbRy51R10pCithLmk2PXp9ZWxzZXt6PUguVk0oW10sW0cuT1NdKQogeT1RLmNoKG51bGwsRC5NaykKIHg9bmV3IEcubkQobmV3IEcudXQoInRhcmdldE1hbmFnZXIiKSxRLmNoKG51bGwsbnVsbCksbnVsbCxudWxsLG51bGwsbnVsbCkKIHguRmYoKQogeT1uZXcgRy5tTCh6LG51bGwsbmV3IEcubmcoIi92bSIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxudWxsLHgsbnVsbCxhLG51bGwseSxudWxsLG51bGwpCiB5LlR5KGEpCiBhLmk2PXl9fSwKLXN0YXRpYzp7SlQ4OmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3N0YXRpYzp7ZnY6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5xQz0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5CSC5aTChhKQogQy5CSC5YSShhKQpAQCAtMTMwOTEsNTcgKzEzMjMzLDU5IEBACiAkaXNkMzp0cnVlfX1dLFsib2JzZXJ2YXRvcnlfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL29ic2VydmF0b3J5X2VsZW1lbnQuZGFydCIsLFosewogIl4iOiIiLAogdUw6ewotIl4iOiJYZnM7ZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAotZ2k2OmZ1bmN0aW9uKGEpe3JldHVybiAkLm1mfSwKKyJeIjoiWGZzO3RCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKK2dpNjpmdW5jdGlvbihhKXtyZXR1cm4gJC5LaH0sCitnS3c6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucFAodGhpcy5naTYoYSkuRWYpfSwKIEVzOmZ1bmN0aW9uKGEpe0EuenMucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKQotdGhpcy5hUihhKX0sCit0aGlzLlR0KGEpfSwKIHdOOmZ1bmN0aW9uKGEsYixjLGQpe0EuenMucHJvdG90eXBlLndOLmNhbGwodGhpcyxhLGIsYyxkKX0sCiBkUTpmdW5jdGlvbihhKXtBLnpzLnByb3RvdHlwZS5kUS5jYWxsKHRoaXMsYSkKLXRoaXMuSHEoYSl9LAordGhpcy5RNChhKX0sCiBlMTpmdW5jdGlvbihhKXtBLnpzLnByb3RvdHlwZS5lMS5jYWxsKHRoaXMsYSl9LAotZ01UOmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpfSwKLXNNVDpmdW5jdGlvbihhLGIpe2EuZGk9dGhpcy5jdChhLEMuTzksYS5kaSxiKX0sCitnTVQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudEJ9LAorc01UOmZ1bmN0aW9uKGEsYil7YS50Qj10aGlzLmN0KGEsQy5POSxhLnRCLGIpfSwKIHlZOmZ1bmN0aW9uKGEpe30sCi1McTpbZnVuY3Rpb24oYSxiKXtpZihhLmRpIT1udWxsKXRoaXMuYVIoYSkKLWVsc2UgdGhpcy5IcShhKX0sIiQxIiwiZ2o4IiwyLDAsMjAsNTddLAotYVI6ZnVuY3Rpb24oYSl7dmFyIHoKLWlmKGEuZGk9PW51bGwpcmV0dXJuCi16PWEubzEKK0xxOltmdW5jdGlvbihhLGIpe2lmKGEudEIhPW51bGwpdGhpcy5UdChhKQorZWxzZSB0aGlzLlE0KGEpfSwiJDEiLCJnajgiLDIsMCwyMCw1N10sCitUdDpmdW5jdGlvbihhKXt2YXIgegoraWYoYS50Qj09bnVsbClyZXR1cm4KK3o9YS5rUgogaWYoeiE9bnVsbCl6LmVkKCkKLWEubzE9UC5yVChhLmRpLHRoaXMuZ1dFKGEpKX0sCi1IcTpmdW5jdGlvbihhKXt2YXIgej1hLm8xCithLmtSPVAuclQoYS50Qix0aGlzLmd3WihhKSl9LAorUTQ6ZnVuY3Rpb24oYSl7dmFyIHo9YS5rUgogaWYoeiE9bnVsbCl6LmVkKCkKLWEubzE9bnVsbH0sCi1URjpbZnVuY3Rpb24oYSl7dmFyIHoKK2Eua1I9bnVsbH0sCitMdTpbZnVuY3Rpb24oYSl7dmFyIHoKIHRoaXMueVkoYSkKLXo9YS5kaQotaWYoej09bnVsbCl7dGhpcy5IcShhKQotcmV0dXJufWEubzE9UC5yVCh6LHRoaXMuZ1dFKGEpKX0sIiQwIiwiZ1dFIiwwLDAsMThdLAotd1c6W2Z1bmN0aW9uKGEsYixjLGQpe3RoaXMuZ2k2KGEpLlo2LkN6KGIsYyxkKX0sIiQzIiwiZ1JoIiw2LDAsMTYxLDIsMTAyLDEwM10sCi1YRDpbZnVuY3Rpb24oYSxiKXt0aGlzLmdpNihhKS5aNgotcmV0dXJuIiMiK0guZChiKX0sIiQxIiwiZ24wIiwyLDAsMTYyLDE2M10sCi1hNzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gRy5tRyhiKX0sIiQxIiwiZ1NzIiwyLDAsMTY0LDE2NV0sCit6PWEudEIKK2lmKHo9PW51bGwpe3RoaXMuUTQoYSkKK3JldHVybn1hLmtSPVAuclQoeix0aGlzLmd3WihhKSl9LCIkMCIsImd3WiIsMCwwLDE4XSwKK2NEOltmdW5jdGlvbihhLGIsYyxkKXt0aGlzLmdpNihhKS5aNi5XVihiLGMsZCl9LCIkMyIsImdSaCIsNiwwLDE2MywyLDEwMywxMDRdLAorS046W2Z1bmN0aW9uKGEsYil7dGhpcy5naTYoYSkuWjYKK3JldHVybiIjIitILmQoYil9LCIkMSIsImduMCIsMiwwLDE2NCwxNjVdLAorYTc6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEcubUcoYil9LCIkMSIsImdTcyIsMiwwLDE2NiwxNjddLAogWmU6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEcuQXMoYil9LCIkMSIsImdiSiIsMiwwLDE1LDE2XSwKLXVHOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIk51bGwiKX0sIiQxIiwiZ0hoIiwyLDAsMTY2LDE2N10sCi1pNTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJFcnJvciIpfSwiJDEiLCJnYzkiLDIsMCwxNjYsMTY3XSwKK0IzOltmdW5jdGlvbihhLGIpe3JldHVybiBILkJVKGIsbnVsbCxudWxsKX0sIiQxIiwiZ1hyIiwyLDAsMTM0LDIxXSwKK3VHOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIk51bGwiKX0sIiQxIiwiZ0hoIiwyLDAsMTY4LDE2OV0sCitNSTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJFcnJvciIpfSwiJDEiLCJnYzkiLDIsMCwxNjgsMTY5XSwKIE9QOltmdW5jdGlvbihhLGIpe3ZhciB6PUoueChiKQotcmV0dXJuIHoubihiLCJTbWkiKXx8ei5uKGIsIk1pbnQiKXx8ei5uKGIsIkJpZ2ludCIpfSwiJDEiLCJnU08iLDIsMCwxNjYsMTY3XSwKLVJVOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIkJvb2wiKX0sIiQxIiwiZ3I5IiwyLDAsMTY2LDE2N10sCi16ZTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJTdHJpbmciKX0sIiQxIiwiZ08wIiwyLDAsMTY2LDE2N10sCi13bTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJJbnN0YW5jZSIpfSwiJDEiLCJnbkQiLDIsMCwxNjYsMTY3XSwKLUpHOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIkRvdWJsZSIpfSwiJDEiLCJnengiLDIsMCwxNjYsMTY3XSwKK3JldHVybiB6Lm4oYiwiU21pIil8fHoubihiLCJNaW50Iil8fHoubihiLCJCaWdpbnQiKX0sIiQxIiwiZ1NPIiwyLDAsMTY4LDE2OV0sCitSVTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJCb29sIil9LCIkMSIsImdyOSIsMiwwLDE2OCwxNjldLAorT2o6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiU3RyaW5nIil9LCIkMSIsImdPMCIsMiwwLDE2OCwxNjldLAord206W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiSW5zdGFuY2UiKX0sIiQxIiwiZ25EIiwyLDAsMTY4LDE2OV0sCitKRzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJEb3VibGUiKX0sIiQxIiwiZ3p4IiwyLDAsMTY4LDE2OV0sCiBDcDpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLngoYikKLXJldHVybiB6Lm4oYiwiR3Jvd2FibGVPYmplY3RBcnJheSIpfHx6Lm4oYiwiQXJyYXkiKX0sIiQxIiwiZ0s0IiwyLDAsMTY2LDE2N10sCi10UjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJUeXBlIil9LCIkMSIsImdxTiIsMiwwLDE2NiwxNjddLAotQUM6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIUMuTm0udGcoWyJOdWxsIiwiU21pIiwiTWludCIsIkJpZ2ludCIsIkJvb2wiLCJTdHJpbmciLCJEb3VibGUiLCJJbnN0YW5jZSIsIkdyb3dhYmxlT2JqZWN0QXJyYXkiLCJBcnJheSIsIlR5cGUiLCJFcnJvciJdLGIpfSwiJDEiLCJnZVMiLDIsMCwxNjYsMTY3XSwKK3JldHVybiB6Lm4oYiwiR3Jvd2FibGVPYmplY3RBcnJheSIpfHx6Lm4oYiwiQXJyYXkiKX0sIiQxIiwiZ0s0IiwyLDAsMTY4LDE2OV0sCit0UjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJUeXBlIil9LCIkMSIsImdxTiIsMiwwLDE2OCwxNjldLAorRHo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIUMuTm0udGcoWyJOdWxsIiwiU21pIiwiTWludCIsIkJpZ2ludCIsIkJvb2wiLCJTdHJpbmciLCJEb3VibGUiLCJJbnN0YW5jZSIsIkdyb3dhYmxlT2JqZWN0QXJyYXkiLCJBcnJheSIsIlR5cGUiLCJFcnJvciJdLGIpfSwiJDEiLCJnZVMiLDIsMCwxNjgsMTY5XSwKIHN0YXRpYzp7RUU6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5QZnouWkwoYSkKIEMuUGZ6LlhJKGEpCkBAIC0xMzE2MSw3ICsxMzMwNSw3IEBACiBpZih6PT1udWxsKXt6PXRoaXMuZ3F3KGEpCiB6PVAuYksodGhpcy5neW0oYSkseiwhMCxudWxsKQogYS5BUD16fXoudG9TdHJpbmcKLXJldHVybiBILlZNKG5ldyBQLklrKHopLFtILktwKHosMCldKX0sCityZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5PcSh6LDApXSl9LAogazA6W2Z1bmN0aW9uKGEpe30sIiQwIiwiZ3F3IiwwLDAsMThdLAogZHQ6W2Z1bmN0aW9uKGEpe2EuQVA9bnVsbH0sIiQwIiwiZ3ltIiwwLDAsMThdLAogSEM6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseApAQCAtMTMxNzEsNyArMTMzMTUsNyBAQAogeD1ILlZNKG5ldyBQLllwKHopLFtULnlqXSkKIGlmKHkuR3Y+PTQpSC52aCh5LnE3KCkpCiB5Lkl2KHgpCi1yZXR1cm4hMH1yZXR1cm4hMX0sIiQwIiwiZ0R4IiwwLDAsMTIwXSwKK3JldHVybiEwfXJldHVybiExfSwiJDAiLCJnRHgiLDAsMCwxMjFdLAogZ256OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9YS5BUAogaWYoeiE9bnVsbCl7eT16LmlFCkBAIC0xMzE4OCw3ICsxMzMzMiw3IEBACiAkaXN5ajp0cnVlfSwKIHFJOnsKICJeIjoieWo7V0E+LG9jPixqTCx6WiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iIzxQcm9wZXJ0eUNoYW5nZVJlY29yZCAiK0guZCh0aGlzLm9jKSsiIGZyb206ICIrSC5kKHRoaXMuakwpKyIgdG86ICIrSC5kKHRoaXMuelopKyI+In0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIiM8UHJvcGVydHlDaGFuZ2VSZWNvcmQgIitILmQodGhpcy5vYykrIiBmcm9tOiAiK0guZCh0aGlzLmpMKSsiIHRvOiAiK0guZCh0aGlzLnpaKSsiPiJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc3FJOnRydWV9fV0sWyJvYnNlcnZlLnNyYy5kaXJ0eV9jaGVjayIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvZGlydHlfY2hlY2suZGFydCIsLE8sewogIl4iOiIiLAogTjA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscQpAQCAtMTMyMDksNyArMTMzNTMsNyBAQAogdj0hMH0kLk9vLnB1c2godCl9fX13aGlsZSh6PDEwMDAmJnYpCiBpZih3JiZ2KXt3PSQuUzUoKQogdy5qMigiUG9zc2libGUgbG9vcCBpbiBPYnNlcnZhYmxlLmRpcnR5Q2hlY2ssIHN0b3BwZWQgY2hlY2tpbmcuIikKLWZvcihzPUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILktwKHksMCldKTtzLkcoKTspe3I9cy5sbworZm9yKHM9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pO3MuRygpOyl7cj1zLmxvCiBxPUouVTYocikKIHcuajIoIkluIGxhc3QgaXRlcmF0aW9uIE9ic2VydmFibGUgY2hhbmdlZCBhdCBpbmRleCAiK0guZChxLnQociwwKSkrIiwgb2JqZWN0OiAiK0guZChxLnQociwxKSkrIi4iKX19JC5heD0kLk9vLmxlbmd0aAogJC5UZD0hMX0sCkBAIC0xMzIxOCw0MSArMTMzNjIsNDEgQEAKIHo9bmV3IE8uWUMoeikKIHJldHVybiBuZXcgUC55UShudWxsLG51bGwsbnVsbCxudWxsLG5ldyBPLnpJKHopLG5ldyBPLmh3KHopLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKX0sCiBZQzp7Ci0iXiI6IlRwOjE2ODthIiwKKyJeIjoiVHBaOjE3MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5hCiBpZih6LmEpcmV0dXJuCiB6LmE9ITAKIGEuUksoYixuZXcgTy5hUih6KSl9LAogJGlzRUg6dHJ1ZX0sCiBhUjp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmEuYT0hMQogTy5OMCgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogekk6ewotIl4iOiJUcDozMDtiIiwKKyJeIjoiVHBaOjMwO2IiLAogJDQ6W2Z1bmN0aW9uKGEsYixjLGQpe2lmKGQ9PW51bGwpcmV0dXJuIGQKIHJldHVybiBuZXcgTy5IRih0aGlzLmIsYixjLGQpfSwiJDQiLG51bGwsOCwwLG51bGwsMjcsMjgsMjksMzEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogSEY6ewotIl4iOiJUcDo3MTtjLGQsZSxmIiwKKyJeIjoiVHBaOjcyO2MsZCxlLGYiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5jLiQyKHRoaXMuZCx0aGlzLmUpCiByZXR1cm4gdGhpcy5mLiQwKCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBodzp7Ci0iXiI6IlRwOjE2OTtVSSIsCisiXiI6IlRwWjoxNzE7VUkiLAogJDQ6W2Z1bmN0aW9uKGEsYixjLGQpe2lmKGQ9PW51bGwpcmV0dXJuIGQKLXJldHVybiBuZXcgTy5mNih0aGlzLlVJLGIsYyxkKX0sIiQ0IixudWxsLDgsMCxudWxsLDI3LDI4LDI5LDMxLCJjYWxsIl0sCityZXR1cm4gbmV3IE8uaXUodGhpcy5VSSxiLGMsZCl9LCIkNCIsbnVsbCw4LDAsbnVsbCwyNywyOCwyOSwzMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1mNjp7Ci0iXiI6IlRwOjEzO2JLLEdxLFJtLHczIiwKK2l1OnsKKyJeIjoiVHBaOjEzO2JLLEdxLFJtLHczIiwKICQxOltmdW5jdGlvbihhKXt0aGlzLmJLLiQyKHRoaXMuR3EsdGhpcy5SbSkKIHJldHVybiB0aGlzLnczLiQxKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNjUsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJvYnNlcnZlLnNyYy5saXN0X2RpZmYiLCJwYWNrYWdlOm9ic2VydmUvc3JjL2xpc3RfZGlmZi5kYXJ0IiwsRyx7CiAiXiI6IiIsCiBCNTpmdW5jdGlvbihhLGIsYyxkLGUsZil7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbQogej1mLWUrMQoteT1KLmV3KEouYkkoYyxiKSwxKQoreT1KLmV3KEouSG4oYyxiKSwxKQogeD1BcnJheSh6KQogZm9yKHc9eC5sZW5ndGgsdj0wO3Y8ejsrK3Ype2lmKHR5cGVvZiB5IT09Im51bWJlciIpcmV0dXJuIEgucyh5KQogdT1BcnJheSh5KQpAQCAtMTMyNjUsNyArMTM0MDksNyBAQAogdT14WzBdCiBpZih0Pj11Lmxlbmd0aClyZXR1cm4gSC5lKHUsdCkKIHVbdF09dH1mb3IodT1KLlFjKGIpLHM9Si5VNihhKSx2PTE7djx6Oysrdilmb3Iocj12LTEscT1lK3YtMSx0PTE7dDx5OysrdCl7aWYocT4+PjAhPT1xfHxxPj1kLmxlbmd0aClyZXR1cm4gSC5lKGQscSkKLXA9Si54QyhkW3FdLHMudChhLEouYkkodS5nKGIsdCksMSkpKQorcD1KLnhDKGRbcV0scy50KGEsSi5Ibih1LmcoYix0KSwxKSkpCiBvPXhbdl0KIG49eFtyXQogbT10LTEKQEAgLTEzNDA2LDM3ICsxMzU1MCwzNyBAQAogeD1xLkZ0CiBwPVAuSih5LEouZXcoeCxxLkxkKSktUC55KHoseCkKIGlmKHA+PTApe0MuTm0uVzQoYSxyKTstLXIKLXo9Si5iSShxLkxkLHEuVkQuRzQubGVuZ3RoKQorej1KLkhuKHEuTGQscS5WRC5HNC5sZW5ndGgpCiBpZih0eXBlb2YgeiE9PSJudW1iZXIiKXJldHVybiBILnMoeikKIHMtPXoKLXo9Si5ldyh1LkxkLEouYkkocS5MZCxwKSkKK3o9Si5ldyh1LkxkLEouSG4ocS5MZCxwKSkKIHUuTGQ9egogeT11LlZELkc0Lmxlbmd0aAogeD1xLlZELkc0Lmxlbmd0aAogaWYoSi54Qyh6LDApJiZ5K3gtcD09PTApdD0hMAogZWxzZXtvPXEuZW0KIGlmKEoudTYodS5GdCxxLkZ0KSl7ej11LlZECi16PXouTXUoeiwwLEouYkkocS5GdCx1LkZ0KSkKK3o9ei5NdSh6LDAsSi5IbihxLkZ0LHUuRnQpKQogby50b1N0cmluZwogaWYodHlwZW9mIG8hPT0ib2JqZWN0Inx8bz09PW51bGx8fCEhby5maXhlZCRsZW5ndGgpSC52aChQLmYoImluc2VydEFsbCIpKQogSC5JQyhvLDAseil9aWYoSi56OChKLmV3KHUuRnQsdS5WRC5HNC5sZW5ndGgpLEouZXcocS5GdCxxLkxkKSkpe3o9dS5WRAotSi5iaihvLHouTXUoeixKLmJJKEouZXcocS5GdCxxLkxkKSx1LkZ0KSx1LlZELkc0Lmxlbmd0aCkpfXUuZW09bworSi5iaihvLHouTXUoeixKLkhuKEouZXcocS5GdCxxLkxkKSx1LkZ0KSx1LlZELkc0Lmxlbmd0aCkpfXUuZW09bwogdS5WRD1xLlZECiBpZihKLnU2KHEuRnQsdS5GdCkpdS5GdD1xLkZ0CiB0PSExfX1lbHNlIGlmKEoudTYodS5GdCxxLkZ0KSl7Qy5ObS54ZShhLHIsdSk7KytyCi1uPUouYkkodS5MZCx1LlZELkc0Lmxlbmd0aCkKK249Si5Ibih1LkxkLHUuVkQuRzQubGVuZ3RoKQogcS5GdD1KLmV3KHEuRnQsbikKIGlmKHR5cGVvZiBuIT09Im51bWJlciIpcmV0dXJuIEgucyhuKQogcys9bgogdD0hMH1lbHNlIHQ9ITF9aWYoIXQpYS5wdXNoKHUpfSwKIGhzOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej1ILlZNKFtdLFtHLkRBXSkKLWZvcih5PUguVk0obmV3IEguYTcoYixiLmxlbmd0aCwwLG51bGwpLFtILktwKGIsMCldKTt5LkcoKTspRy5tMSh6LHkubG8pCitmb3IoeT1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5PcShiLDApXSk7eS5HKCk7KUcubTEoeix5LmxvKQogcmV0dXJuIHp9LAogUWk6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUKIGlmKGIubGVuZ3RoPD0xKXJldHVybiBiCiB6PVtdCi1mb3IoeT1HLmhzKGEsYikseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSkseD1hLmFvO3kuRygpOyl7dz15LmxvCitmb3IoeT1HLmhzKGEsYikseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5PcSh5LDApXSkseD1hLmFvO3kuRygpOyl7dz15LmxvCiBpZihKLnhDKHcuZ05nKCksMSkmJncuZ1J0KCkuRzQubGVuZ3RoPT09MSl7dj13LmdSdCgpLkc0CiBpZigwPj12Lmxlbmd0aClyZXR1cm4gSC5lKHYsMCkKIHY9dlswXQpAQCAtMTM0NTAsMTcgKzEzNTk0LDE3IEBACiBndkg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnR9LAogZ1J0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVkR9LAogZ05nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTGR9LAotdlA6ZnVuY3Rpb24oYSl7dmFyIHoKK2NrOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZih0eXBlb2YgYT09PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YSl7ej10aGlzLkZ0CiBpZih0eXBlb2YgeiE9PSJudW1iZXIiKXJldHVybiBILnMoeikKIHo9YTx6fWVsc2Ugej0hMAogaWYoeilyZXR1cm4hMQogaWYoIUoueEModGhpcy5MZCx0aGlzLlZELkc0Lmxlbmd0aCkpcmV0dXJuITAKIHJldHVybiBKLnU2KGEsSi5ldyh0aGlzLkZ0LHRoaXMuTGQpKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5CitidTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej0iIzxMaXN0Q2hhbmdlUmVjb3JkIGluZGV4OiAiK0guZCh0aGlzLkZ0KSsiLCByZW1vdmVkOiAiCiB5PXRoaXMuVkQKLXJldHVybiB6K3kuYnUoeSkrIiwgYWRkZWRDb3VudDogIitILmQodGhpcy5MZCkrIj4ifSwKK3JldHVybiB6K3kuYnUoeSkrIiwgYWRkZWRDb3VudDogIitILmQodGhpcy5MZCkrIj4ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNEQTp0cnVlLAogc3RhdGljOntLNjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgegogaWYoZD09bnVsbClkPVtdCkBAIC0xMzQ4MSwxMCArMTM2MjUsMTAgQEAKIGQzOnsKICJeIjoiYTtSOTpybyUsVjI6ZFVDJSxtZTpwdCUiLAogZ3FoOmZ1bmN0aW9uKGEpe3ZhciB6Ci1pZih0aGlzLmdSOShhKT09bnVsbCl7ej10aGlzLmdsWihhKQoraWYodGhpcy5nUjkoYSk9PW51bGwpe3o9dGhpcy5nRlcoYSkKIHRoaXMuc1I5KGEsUC5iSyh0aGlzLmdrayhhKSx6LCEwLG51bGwpKX16PXRoaXMuZ1I5KGEpCiB6LnRvU3RyaW5nCi1yZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5LcCh6LDApXSl9LAorcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guT3EoeiwwKV0pfSwKIGduejpmdW5jdGlvbihhKXt2YXIgeix5CiBpZih0aGlzLmdSOShhKSE9bnVsbCl7ej10aGlzLmdSOShhKQogeT16LmlFCkBAIC0xMzQ5NSwxMSArMTM2MzksMTEgQEAKIGlmKHo9PW51bGwpe3o9SC5WTShbXSxbRi5kM10pCiAkLk9vPXp9ei5wdXNoKGEpCiAkLmF4PSQuYXgrMQoteT1QLkw1KG51bGwsbnVsbCxudWxsLFAuR0QsUC5hKQotZm9yKHo9dGhpcy5nYngoYSksej0kLm1YKCkuTWUoMCx6LG5ldyBBLldxKCEwLCExLCEwLEMuRlEsITEsITEsQy5DZCxudWxsKSksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt4PUouTzYoei5sbykKK3k9UC5MNShudWxsLG51bGwsbnVsbCxQLklOLFAuYSkKK2Zvcih6PXRoaXMuZ2J4KGEpLHo9JC5tWCgpLk1lKDAseixuZXcgQS5XcSghMCwhMSwhMCxDLkZRLCExLCExLEMuQ2QsbnVsbCkpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOyl7eD1KLk82KHoubG8pCiB3PSQuY3AoKS5lQS50KDAseCkKIGlmKHc9PW51bGwpSC52aChPLmxBKCJnZXR0ZXIgXCIiK0guZCh4KSsiXCIgaW4gIit0aGlzLmJ1KGEpKSkKLXkudSgwLHgsdy4kMShhKSl9dGhpcy5zVjIoYSx5KX0sIiQwIiwiZ2xaIiwwLDAsMThdLAoreS51KDAseCx3LiQxKGEpKX10aGlzLnNWMihhLHkpfSwiJDAiLCJnRlciLDAsMCwxOF0sCiBMNTpbZnVuY3Rpb24oYSl7aWYodGhpcy5nVjIoYSkhPW51bGwpdGhpcy5zVjIoYSxudWxsKX0sIiQwIiwiZ2trIiwwLDAsMThdLAogSEM6ZnVuY3Rpb24oYSl7dmFyIHoseQogej17fQpAQCAtMTM1MTgsNyArMTM2NjIsNyBAQAogdGhpcy5nbWUoYSkucHVzaChiKX0sCiAkaXNkMzp0cnVlfSwKIFg2OnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5iCiB5PSQuY3AoKS5qRCh6LGEpCkBAIC0xMzUzNSwxNCArMTM2NzksMTQgQEAKICJeIjoiUGk7IiwKIGdQOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkRBfSwKIHNQOmZ1bmN0aW9uKGEsYil7dGhpcy5EQT1GLldpKHRoaXMsQy5scyx0aGlzLkRBLGIpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiIjPCIrbmV3IEguY3UoSC5iNyh0aGlzKSxudWxsKS5idSgwKSsiIHZhbHVlOiAiK0guZCh0aGlzLkRBKSsiPiJ9fX1dLFsib2JzZXJ2ZS5zcmMub2JzZXJ2YWJsZV9saXN0IiwicGFja2FnZTpvYnNlcnZlL3NyYy9vYnNlcnZhYmxlX2xpc3QuZGFydCIsLFEseworYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIjPCIrbmV3IEguY3UoSC53Tyh0aGlzKSxudWxsKS5idSgwKSsiIHZhbHVlOiAiK0guZCh0aGlzLkRBKSsiPiJ9LCIkMCIsImdBWSIsMCwwLDY5XX19XSxbIm9ic2VydmUuc3JjLm9ic2VydmFibGVfbGlzdCIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvb2JzZXJ2YWJsZV9saXN0LmRhcnQiLCxRLHsKICJeIjoiIiwKIHduOnsKICJeIjoidUZVO2IzQCxpVCxhbyxBUCxmbiIsCiBnUVY6ZnVuY3Rpb24oKXt2YXIgej10aGlzLmlUCi1pZih6PT1udWxsKXt6PVAuYksobmV3IFEuT0EodGhpcyksbnVsbCwhMCxudWxsKQoraWYoej09bnVsbCl7ej1QLmJLKG5ldyBRLnhiKHRoaXMpLG51bGwsITAsbnVsbCkKIHRoaXMuaVQ9en16LnRvU3RyaW5nCi1yZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5LcCh6LDApXSl9LAorcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guT3EoeiwwKV0pfSwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFvLmxlbmd0aH0sCiBzQjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5hbwpAQCAtMTM1OTYsNyArMTM3NDAsNyBAQAogej14PT1udWxsP3ohPW51bGw6eCE9PXp9ZWxzZSB6PSExCiBpZih6JiZ5PjApe3o9dGhpcy5hbwogSC54Rih6LGIseSkKLXRoaXMuaUgoRy5LNih0aGlzLGIseSxILmMxKHosYix5LG51bGwpLmJyKDApKSl9SC5RYih0aGlzLmFvLGIsYyl9LAordGhpcy5pSChHLks2KHRoaXMsYix5LEguYzEoeixiLHksbnVsbCkuYnIoMCkpKX1ILm5hKHRoaXMuYW8sYixjKX0sCiBoOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKIHo9dGhpcy5hbwogeT16Lmxlbmd0aApAQCAtMTM2NTcsNyArMTM4MDEsNyBAQAogQy5ObS5zQih6LHgreSkKIHc9ei5sZW5ndGgKIEgucUcoeixiK3ksdyx0aGlzLGIpCi1ILlFiKHosYixjKQorSC5uYSh6LGIsYykKIHRoaXMuT24oeCx6Lmxlbmd0aCkKIHo9dGhpcy5pVAogaWYoeiE9bnVsbCl7dz16LmlFCkBAIC0xMzY5Miw3ICsxMzgzNiw3IEBACiB5PWI9PT0wCiB0aGlzLmN0KHRoaXMsQy5haSx6LHkpCiB0aGlzLmN0KHRoaXMsQy5uWiwheiwheSl9LAotTHU6W2Z1bmN0aW9uKCl7dmFyIHoseSx4CitKdTpbZnVuY3Rpb24oKXt2YXIgeix5LHgKIHo9dGhpcy5iMwogaWYoej09bnVsbClyZXR1cm4hMQogeT1HLlFpKHRoaXMseikKQEAgLTEzNzAzLDcgKzEzODQ3LDcgQEAKIGlmKHgmJnkubGVuZ3RoIT09MCl7eD1ILlZNKG5ldyBQLllwKHkpLFtHLkRBXSkKIGlmKHouR3Y+PTQpSC52aCh6LnE3KCkpCiB6Lkl2KHgpCi1yZXR1cm4hMH1yZXR1cm4hMX0sIiQwIiwiZ0w2IiwwLDAsMTIwXSwKK3JldHVybiEwfXJldHVybiExfSwiJDAiLCJnTDYiLDAsMCwxMjFdLAogJGlzd246dHJ1ZSwKIHN0YXRpYzp7Y2g6ZnVuY3Rpb24oYSxiKXt2YXIgej1ILlZNKFtdLFtiXSkKIHJldHVybiBILlZNKG5ldyBRLnduKG51bGwsbnVsbCx6LG51bGwsbnVsbCksW2JdKX0sWTU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbApAQCAtMTM3MjgsNyArMTM4NzIsNyBAQAogbT1zLW8KIEgucUcoYSx3LG4sdCwwKQogaWYobyE9PTApe0gucUcoYSxuLG0sYSx1KQotQy5ObS5zQihhLG0pfX1lbHNle289Si5iSShwLHEpCitDLk5tLnNCKGEsbSl9fWVsc2V7bz1KLkhuKHAscSkKIHI9YS5sZW5ndGgKIGlmKHR5cGVvZiBvIT09Im51bWJlciIpcmV0dXJuIEgucyhvKQogbD1yK28KQEAgLTEzNzM5LDE3ICsxMzg4MywxNyBAQAogdUZVOnsKICJeIjoiYXJrK1BpOyIsCiAkaXNkMzp0cnVlfSwKLU9BOnsKLSJeIjoiVHA6NzE7YSIsCit4Yjp7CisiXiI6IlRwWjo3MjthIiwKICQwOmZ1bmN0aW9uKCl7dGhpcy5hLmlUPW51bGx9LAogJGlzRUg6dHJ1ZX19XSxbIm9ic2VydmUuc3JjLm9ic2VydmFibGVfbWFwIiwicGFja2FnZTpvYnNlcnZlL3NyYy9vYnNlcnZhYmxlX21hcC5kYXJ0IiwsVix7CiAiXiI6IiIsCiB5YTp7CiAiXiI6InlqO0czPixqTCx6WixhQyx3NSIsCi1idTpmdW5jdGlvbihhKXt2YXIgegorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6CiBpZih0aGlzLmFDKXo9Imluc2VydCIKIGVsc2Ugej10aGlzLnc1PyJyZW1vdmUiOiJzZXQiCi1yZXR1cm4iIzxNYXBDaGFuZ2VSZWNvcmQgIit6KyIgIitILmQodGhpcy5HMykrIiBmcm9tOiAiK0guZCh0aGlzLmpMKSsiIHRvOiAiK0guZCh0aGlzLnpaKSsiPiJ9LAorcmV0dXJuIiM8TWFwQ2hhbmdlUmVjb3JkICIreisiICIrSC5kKHRoaXMuRzMpKyIgZnJvbTogIitILmQodGhpcy5qTCkrIiB0bzogIitILmQodGhpcy56WikrIj4ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXN5YTp0cnVlfSwKIHFDOnsKICJeIjoiUGk7WnAsQVAsZm4iLApAQCAtMTM3NjMsNiArMTM5MDcsNyBAQAogcmV0dXJuIHouZ0Ioeik9PT0wfSwKIGdvcjpmdW5jdGlvbihhKXt2YXIgej10aGlzLlpwCiByZXR1cm4gei5nQih6KSE9PTB9LAoreDQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5acC54NCgwLGIpfSwKIHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5acC50KDAsYil9LAogdTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcKIHo9dGhpcy5BUApAQCAtMTM3OTgsNyArMTM5NDMsNyBAQAogRi5XaSh0aGlzLEMuV24seSwwKQogdGhpcy5HOCgpfXouVjEoMCl9LAogYU46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5acC5hTigwLGIpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogRzg6ZnVuY3Rpb24oKXt0aGlzLm5xKHRoaXMsSC5WTShuZXcgVC5xSSh0aGlzLEMuU1YsbnVsbCxudWxsKSxbbnVsbF0pKQogdGhpcy5ucSh0aGlzLEguVk0obmV3IFQucUkodGhpcyxDLlVxLG51bGwsbnVsbCksW251bGxdKSl9LAogJGlzcUM6dHJ1ZSwKQEAgLTEzODEwLDEyICsxMzk1NSwxMiBAQAogZWxzZSB5PSEhei4kaXNGbz9ILlZNKG5ldyBWLnFDKFAuTDUobnVsbCxudWxsLG51bGwsYixjKSxudWxsLG51bGwpLFtiLGNdKTpILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwsYixjKSxudWxsLG51bGwpLFtiLGNdKQogcmV0dXJuIHl9fX0sCiB6VDp7Ci0iXiI6IlRwO2EiLAotJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsNzcsMjEsImNhbGwiXSwKKyJeIjoiVHBaO2EiLAorJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsNzgsMjEsImNhbGwiXSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoiVmZWIixhcmdzOlthLGJdfX0sdGhpcy5hLCJxQyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoibGIiLGFyZ3M6W2EsYl19fSx0aGlzLmEsInFDIil9fSwKIExvOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5hCiB6Lm5xKHosSC5WTShuZXcgVi55YShhLGIsbnVsbCwhMSwhMCksW251bGwsbnVsbF0pKX0sCiAkaXNFSDp0cnVlfX1dLFsib2JzZXJ2ZS5zcmMub2JzZXJ2ZXJfdHJhbnNmb3JtIiwicGFja2FnZTpvYnNlcnZlL3NyYy9vYnNlcnZlcl90cmFuc2Zvcm0uZGFydCIsLFksewpAQCAtMTM4NDgsNyArMTM5OTMsNyBAQAogSGo6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiBpZihhPT1udWxsKXJldHVybgogej1iCi1pZih0eXBlb2Ygej09PSJudW1iZXIiJiZNYXRoLmZsb29yKHopPT09eil7aWYoISFKLngoYSkuJGlzV08mJkouSjUoYiwwKSYmSi51NihiLEoucTgoYSkpKXJldHVybiBKLlVRKGEsYil9ZWxzZSBpZighIUoueChiKS4kaXNHRCl7ej1hCitpZih0eXBlb2Ygej09PSJudW1iZXIiJiZNYXRoLmZsb29yKHopPT09eil7aWYoISFKLngoYSkuJGlzV08mJkouSjUoYiwwKSYmSi51NihiLEoucTgoYSkpKXJldHVybiBKLlVRKGEsYil9ZWxzZSBpZighIUoueChiKS4kaXNJTil7ej1hCiB5PUguUkIoeiwiJGlzQ28iLFtQLnFVLG51bGxdLCIkYXNDbyIpCiBpZigheSl7ej1hCiB5PUguUkIoeiwiJGlzWjAiLFtQLnFVLG51bGxdLCIkYXNaMCIpCkBAIC0xMzg2MSwxNCArMTQwMDYsMTQgQEAKIHo9eC4kMSh6KQogcmV0dXJuIHp9Y2F0Y2godyl7aWYoISFKLngoSC5SdSh3KSkuJGlzSlMpe3o9Si5KayhhKQogdj0kLm1YKCkuRjEoeixDLk9WKQotaWYoISh2IT1udWxsJiZ2LmZZPT09Qy5oVSYmIXYuRm8pKXRocm93IHd9ZWxzZSB0aHJvdyB3fX16PSQuWVYoKQoraWYoISh2IT1udWxsJiZ2LmZZPT09Qy5oVSYmIXYuRm8pKXRocm93IHd9ZWxzZSB0aHJvdyB3fX16PSQuTmQoKQogaWYoei5tTChDLkQ4KSl6LmtTKCJjYW4ndCBnZXQgIitILmQoYikrIiBpbiAiK0guZChhKSkKIHJldHVybn0sCi1pdTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CitFWDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CiBpZihhPT1udWxsKXJldHVybiExCiB6PWIKIGlmKHR5cGVvZiB6PT09Im51bWJlciImJk1hdGguZmxvb3Ioeik9PT16KXtpZighIUoueChhKS4kaXNXTyYmSi5KNShiLDApJiZKLnU2KGIsSi5xOChhKSkpe0oua1coYSxiLGMpCi1yZXR1cm4hMH19ZWxzZSBpZighIUoueChiKS4kaXNHRCl7ej1hCityZXR1cm4hMH19ZWxzZSBpZighIUoueChiKS4kaXNJTil7ej1hCiB5PUguUkIoeiwiJGlzQ28iLFtQLnFVLG51bGxdLCIkYXNDbyIpCiBpZigheSl7ej1hCiB5PUguUkIoeiwiJGlzWjAiLFtQLnFVLG51bGxdLCIkYXNaMCIpCkBAIC0xMzg3Niw3ICsxNDAyMSw3IEBACiBpZih6KXtKLmtXKGEsJC5NZygpLmVwLnQoMCxiKSxjKQogcmV0dXJuITB9dHJ5eyQuY3AoKS5DcShhLGIsYykKIHJldHVybiEwfWNhdGNoKHgpe2lmKCEhSi54KEguUnUoeCkpLiRpc0pTKXt6PUouSmsoYSkKLWlmKCEkLm1YKCkuVUsoeixDLk9WKSl0aHJvdyB4fWVsc2UgdGhyb3cgeH19ej0kLllWKCkKK2lmKCEkLm1YKCkuVUsoeixDLk9WKSl0aHJvdyB4fWVsc2UgdGhyb3cgeH19ej0kLk5kKCkKIGlmKHoubUwoQy5EOCkpei5rUygiY2FuJ3Qgc2V0ICIrSC5kKGIpKyIgaW4gIitILmQoYSkpCiByZXR1cm4hMX0sCiBjQjpmdW5jdGlvbihhKXthPUoucnIoYSkKQEAgLTEzOTEyLDggKzE0MDU3LDggQEAKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9LLmxlbmd0aH0sCiBnbDA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuT0subGVuZ3RoPT09MH0sCiBnUHU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCi1idTpmdW5jdGlvbihhKXtpZighdGhpcy5nUHUoKSlyZXR1cm4iPGludmFsaWQgcGF0aD4iCi1yZXR1cm4gSC5WTShuZXcgSC5BOCh0aGlzLk9LLG5ldyBMLmY3KCkpLFtudWxsLG51bGxdKS56VigwLCIuIil9LAorYnU6W2Z1bmN0aW9uKGEpe2lmKCF0aGlzLmdQdSgpKXJldHVybiI8aW52YWxpZCBwYXRoPiIKK3JldHVybiBILlZNKG5ldyBILkE4KHRoaXMuT0ssbmV3IEwuZjcoKSksW251bGwsbnVsbF0pLnpWKDAsIi4iKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIGlmKGI9PW51bGwpcmV0dXJuITEKIGlmKHRoaXM9PT1iKXJldHVybiEwCkBAIC0xMzkzOCw3ICsxNDA4Myw3IEBACiByZXR1cm4gNTM2ODcwOTExJngrKCgxNjM4MyZ4KTw8MTU+Pj4wKX0sCiBUbDpmdW5jdGlvbihhKXt2YXIgeix5CiBpZighdGhpcy5nUHUoKSlyZXR1cm4KLWZvcih6PXRoaXMuT0ssej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PXRoaXMuT0ssej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXt5PXoubG8KIGlmKGE9PW51bGwpcmV0dXJuCiBhPUwuSGooYSx5KX1yZXR1cm4gYX0sCiByTDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseApAQCAtMTM5NDgsNyArMTQwOTMsNyBAQAogZm9yKHg9MDt4PHk7Kyt4KXtpZihhPT1udWxsKXJldHVybiExCiBpZih4Pj16Lmxlbmd0aClyZXR1cm4gSC5lKHoseCkKIGE9TC5IaihhLHpbeF0pfWlmKHk+PXoubGVuZ3RoKXJldHVybiBILmUoeix5KQotcmV0dXJuIEwuaXUoYSx6W3ldLGIpfSwKK3JldHVybiBMLkVYKGEselt5XSxiKX0sCiBWVjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3CiBpZighdGhpcy5nUHUoKXx8dGhpcy5PSy5sZW5ndGg9PT0wKXJldHVybgogej10aGlzLk9LCkBAIC0xMzk2MiwxNiArMTQxMDcsMTYgQEAKIHN0YXRpYzp7aGs6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscwogaWYoISFKLngoYSkuJGlzV08pe3o9UC5GKGEsITEsbnVsbCkKIHk9bmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpCi15LiRidWlsdGluVHlwZUluZm89W0guS3AoeiwwKV0KK3kuJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcSh6LDApXQogZm9yKDt5LkcoKTspe3g9eS5sbwotaWYoKHR5cGVvZiB4IT09Im51bWJlciJ8fE1hdGguZmxvb3IoeCkhPT14KSYmIUoueCh4KS4kaXNHRCl0aHJvdyBILmIoUC51KCJMaXN0IG11c3QgY29udGFpbiBvbmx5IGludHMgYW5kIFN5bWJvbHMiKSl9cmV0dXJuIG5ldyBMLlR2KHopfWlmKGE9PW51bGwpYT0iIgoraWYoKHR5cGVvZiB4IT09Im51bWJlciJ8fE1hdGguZmxvb3IoeCkhPT14KSYmIUoueCh4KS4kaXNJTil0aHJvdyBILmIoUC51KCJMaXN0IG11c3QgY29udGFpbiBvbmx5IGludHMgYW5kIFN5bWJvbHMiKSl9cmV0dXJuIG5ldyBMLlR2KHopfWlmKGE9PW51bGwpYT0iIgogdz0kLmhXKCkudCgwLGEpCiBpZih3IT1udWxsKXJldHVybiB3CiBpZighTC5jQihhKSlyZXR1cm4gJC5KcygpCiB2PVtdCiB5PUoucnIoYSkuc3BsaXQoIi4iKQogdT1uZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCkKLXUuJGJ1aWx0aW5UeXBlSW5mbz1bSC5LcCh5LDApXQordS4kYnVpbHRpblR5cGVJbmZvPVtILk9xKHksMCldCiBmb3IoO3UuRygpOyl7eD11LmxvCiBpZihKLnhDKHgsIiIpKWNvbnRpbnVlCiB0PUguQlUoeCwxMCxuZXcgTC5vcSgpKQpAQCAtMTM5NzksMjUgKzE0MTI0LDI1IEBACiB5PSQuaFcoKQogaWYoeS5YNT49MTAwKXt5LnRvU3RyaW5nCiB1PW5ldyBQLmk1KHkpCi11LiRidWlsdGluVHlwZUluZm89W0guS3AoeSwwKV0KK3UuJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcSh5LDApXQogcz11LmdBKHUpCiBpZighcy5HKCkpSC52aChILkRVKCkpCiB5LlJ6KDAscy5nbCgpKX15LnUoMCxhLHcpCiByZXR1cm4gd319fSwKIG9xOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm59LAogJGlzRUg6dHJ1ZX0sCiBmNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzR0Q/JC5NZygpLmVwLnQoMCxhKTphfSwiJDEiLG51bGwsMiwwLG51bGwsMTUzLCJjYWxsIl0sCisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc0lOPyQuTWcoKS5lcC50KDAsYSk6YX0sIiQxIixudWxsLDIsMCxudWxsLDE1NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBUVjp7CiAiXiI6IlR2O09LIiwKIGdQdTpmdW5jdGlvbigpe3JldHVybiExfSwKIHN0YXRpYzp7Il4iOiJxYSJ9fSwKLVlKRzp7Ci0iXiI6IlRwOjcxOyIsCitET2U6eworIl4iOiJUcFo6NzI7IiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILlZSKCJeKD86KD86WyRfYS16QS1aXStbJF9hLXpBLVowLTldKnwoPzpbMC05XXxbMS05XStbMC05XSspKSkoPzpcXC4oPzpbJF9hLXpBLVpdK1skX2EtekEtWjAtOV0qfCg/OlswLTldfFsxLTldK1swLTldKykpKSokIixILnY0KCJeKD86KD86WyRfYS16QS1aXStbJF9hLXpBLVowLTldKnwoPzpbMC05XXxbMS05XStbMC05XSspKSkoPzpcXC4oPzpbJF9hLXpBLVpdK1skX2EtekEtWjAtOV0qfCg/OlswLTldfFsxLTldK1swLTldKykpKSokIiwhMSwhMCwhMSksbnVsbCxudWxsKX0sCiAkaXNFSDp0cnVlfSwKIHd3OnsKQEAgLTE0MDEyLDcgKzE0MTU3LDcgQEAKIGlmKHohPW51bGwpe3k9ei5rVGQKIHk9eT09bnVsbD93IT1udWxsOnkhPT13fWVsc2UgeT0hMAogaWYoeSl7ej1uZXcgTC56Ryh3LFAuR1YobnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCxudWxsLCExKQotJC54Rz16fXoueWoudSgwLHRoaXMuY1gsdGhpcykKKyQueEc9en16LkpELnUoMCx0aGlzLmNYLHRoaXMpCiB0aGlzLm5mKHouZ1RUKHopKQogdGhpcy54RT1udWxsCiBicmVha319fSwKQEAgLTE0MDYxLDcgKzE0MjA2LDcgQEAKIHRGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaFEoITEpfSwKICRpc1lqOnRydWV9LAogWnU6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQogcmV0dXJuIHouR1ghPW51bGwmJnouU0coKX0sIiQxIixudWxsLDIsMCxudWxsLDE0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKQEAgLTE0MDc1LDcgKzE0MjIwLDcgQEAKIE1tOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5HWC4kMyhhLGIsYyl9LAogZ2E4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuR1ghPW51bGx9LAogVFI6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLkdYIT1udWxsfHx0aGlzLmdxYygpKXRocm93IEguYihQLncoIk9ic2VydmVyIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkLiIpKQotaWYoWC5PUyhiKT50aGlzLmdJbigpKXRocm93IEguYihQLnUoImNhbGxiYWNrIHNob3VsZCB0YWtlICIrdGhpcy5nSW4oKSsiIG9yIGZld2VyIGFyZ3VtZW50cyIpKQoraWYoWC5DeihiKT50aGlzLmdJbigpKXRocm93IEguYihQLnUoImNhbGxiYWNrIHNob3VsZCB0YWtlICIrdGhpcy5nSW4oKSsiIG9yIGZld2VyIGFyZ3VtZW50cyIpKQogdGhpcy5HWD1iCiB0aGlzLnZBPVAuSih0aGlzLmdJbigpLFguUkkoYikpCiB0aGlzLk5KKDApCkBAIC0xNDEwMiwxMyArMTQyNDcsMTMgQEAKIEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKS53MCh6LHkpfX0sCiB6YzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLkF3KGEsYixudWxsKX19LAogekc6ewotIl4iOiJhO2tUZCx5aixyUyxITixvcCIsCi1UUjpmdW5jdGlvbihhLGIpe3RoaXMueWoudSgwLGIuZ2NYKCksYikKKyJeIjoiYTtrVGQsSkQsclMsSE4sb3AiLAorVFI6ZnVuY3Rpb24oYSxiKXt0aGlzLkpELnUoMCxiLmdjWCgpLGIpCiBiLm5mKHRoaXMuZ1RUKHRoaXMpKX0sCiB3ZTpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLngoYikKLWlmKCEhei4kaXN3bil0aGlzLndxKGIuZ1FWKCkpCi1pZighIXouJGlzZDMpdGhpcy53cSh6LmdxaChiKSl9LCIkMSIsImdUVCIsMiwwLDE3MCw5Ml0sCi13cTpmdW5jdGlvbihhKXt2YXIgeix5CitpZighIXouJGlzd24pdGhpcy5rbChiLmdRVigpKQoraWYoISF6LiRpc2QzKXRoaXMua2woei5ncWgoYikpfSwiJDEiLCJnVFQiLDIsMCwxNzIsOTNdLAora2w6ZnVuY3Rpb24oYSl7dmFyIHoseQogaWYodGhpcy5yUz09bnVsbCl0aGlzLnJTPVAuWU0obnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogej10aGlzLkhOCiB5PXohPW51bGw/ei5SeigwLGEpOm51bGwKQEAgLTE0MTIwLDMzICsxNDI2NSwzMyBAQAogaWYoej09bnVsbCl6PVAuWU0obnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogdGhpcy5ITj10aGlzLnJTCiB0aGlzLnJTPXoKLWZvcih5PXRoaXMueWoseT1ILlZNKG5ldyBQLnJvKHkpLFtILktwKHksMCksSC5LcCh5LDEpXSkseD15LkZiLHc9SC5LcCh5LDEpLHk9SC5WTShuZXcgUC5aTSh4LEguVk0oW10sW1Aub3pdKSx4LnFULHguYmIsbnVsbCksW0guS3AoeSwwKSx3XSkseS5RZih4LHcpO3kuRygpOyl7dj15LmdsKCkKLWlmKHYuZ2E4KCkpdi5uZih0aGlzLmdUVCh0aGlzKSl9Zm9yKHk9dGhpcy5ITix5PXkuZ1VRKHkpLHk9SC5WTShuZXcgSC5NSChudWxsLEoubVkoeS5sNikseS5UNiksW0guS3AoeSwwKSxILktwKHksMSldKTt5LkcoKTspeS5sby5lZCgpCitmb3IoeT10aGlzLkpELHk9SC5WTShuZXcgUC5ybyh5KSxbSC5PcSh5LDApLEguT3EoeSwxKV0pLHg9eS5GYix3PUguT3EoeSwxKSx5PUguVk0obmV3IFAuWk0oeCxILlZNKFtdLFtQLm96XSkseC5xVCx4LmJiLG51bGwpLFtILk9xKHksMCksd10pLHkuUWYoeCx3KTt5LkcoKTspe3Y9eS5nbCgpCitpZih2LmdhOCgpKXYubmYodGhpcy5nVFQodGhpcykpfWZvcih5PXRoaXMuSE4seT15LmdVUSh5KSx5PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHkubDYpLHkuVDYpLFtILk9xKHksMCksSC5PcSh5LDEpXSk7eS5HKCk7KXkubG8uZWQoKQogdGhpcy5ITj1udWxsfSwiJDAiLCJnVGgiLDAsMCwxOF0sCiB0OTpbZnVuY3Rpb24oYSl7dmFyIHoseQotZm9yKHo9dGhpcy55aix6PUguVk0obmV3IFAucm8oeiksW0guS3AoeiwwKSxILktwKHosMSldKSx6PVAuRih6LCExLEguaXAoeiwibVciLDApKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspe3k9ei5sbworZm9yKHo9dGhpcy5KRCx6PUguVk0obmV3IFAucm8oeiksW0guT3EoeiwwKSxILk9xKHosMSldKSx6PVAuRih6LCExLEguaXAoeiwibVciLDApKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspe3k9ei5sbwogaWYoeS5nYTgoKSl5LnRGKCl9dGhpcy5vcD0hMAotUC5yYih0aGlzLmdUaCh0aGlzKSl9LCIkMSIsImdDUCIsMiwwLDIwLDE3MV0sCitQLnJiKHRoaXMuZ1RoKHRoaXMpKX0sIiQxIiwiZ0NQIiwyLDAsMjAsMTczXSwKIHN0YXRpYzp7Il4iOiJ4RyIsU0U6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PSQueEcKIGlmKHohPW51bGwpe3k9ei5rVGQKIHk9eT09bnVsbD9iIT1udWxsOnkhPT1ifWVsc2UgeT0hMAogaWYoeSl7ej1uZXcgTC56RyhiLFAuR1YobnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCxudWxsLCExKQotJC54Rz16fXoueWoudSgwLGEuY1gsYSkKKyQueEc9en16LkpELnUoMCxhLmNYLGEpCiBhLm5mKHouZ1RUKHopKX19fX1dLFsib2JzZXJ2ZS5zcmMudG9fb2JzZXJ2YWJsZSIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvdG9fb2JzZXJ2YWJsZS5kYXJ0IiwsUix7CiAiXiI6IiIsCiB0QjpbZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PUoueChhKQogaWYoISF6LiRpc2QzKXJldHVybiBhCiBpZighIXouJGlzWjApe3k9Vi5BQihhLG51bGwsbnVsbCkKLXouYU4oYSxuZXcgUi5RZSh5KSkKK3ouYU4oYSxuZXcgUi55eCh5KSkKIHJldHVybiB5fWlmKCEhei4kaXNRVil7ej16LmV6KGEsUi5GdCgpKQogeD1RLmNoKG51bGwsbnVsbCkKIHguRlYoMCx6KQogcmV0dXJuIHh9cmV0dXJuIGF9LCIkMSIsIkZ0IiwyLDAsMTMsMjFdLAotUWU6ewotIl4iOiJUcDo3OTthIiwKLSQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsUi50QihhKSxSLnRCKGIpKX0sIiQyIixudWxsLDQsMCxudWxsLDEzMCw2NCwiY2FsbCJdLAoreXg6eworIl4iOiJUcFo6ODA7YSIsCiskMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLFIudEIoYSksUi50QihiKSl9LCIkMiIsbnVsbCw0LDAsbnVsbCwxMzEsNjQsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJwb2x5bWVyIiwicGFja2FnZTpwb2x5bWVyL3BvbHltZXIuZGFydCIsLEEsewogIl4iOiIiLAogWUc6ZnVuY3Rpb24oYSxiLGMpe2lmKGE9PW51bGx8fCQuQU0oKT09bnVsbClyZXR1cm4KQEAgLTE0MTczLDEwICsxNDMxOCwxMCBAQAogcmV0dXJuIHkuQzEoeiwiQ2hhbmdlZCIpJiYheS5uKHosImF0dHJpYnV0ZUNoYW5nZWQiKX0sIiQxIiwiRjQiLDIsMCw2Miw2M10sCiBBZDpmdW5jdGlvbihhLGIpeyQuRWooKS51KDAsYSxiKQogSC5HbyhKLlVRKCQuU2koKSwiUG9seW1lciIpLCIkaXNyNyIpLlBPKFthXSl9LAotaDY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdworeDk6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdwogaWYoYT09bnVsbClyZXR1cm4KIGRvY3VtZW50Ci1pZigkLmpnKCk9PT0hMCliPWRvY3VtZW50LmhlYWQKK2lmKCQuRXAoKT09PSEwKWI9ZG9jdW1lbnQuaGVhZAogej1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIsbnVsbCkKIEoudDMoeixKLmRZKGEpKQogeT1hLmdldEF0dHJpYnV0ZSgiZWxlbWVudCIpCkBAIC0xNDE5OSw3ICsxNDM0NCw3IEBACiB6LnNldEF0dHJpYnV0ZSgibmFtZSIsImF1dG8tYmluZGluZy1kYXJ0IikKIHouc2V0QXR0cmlidXRlKCJleHRlbmRzIiwidGVtcGxhdGUiKQogSi5VUSgkLlhYKCksImluaXQiKS5xUChbXSx6KQotZm9yKHk9SC5WTShuZXcgSC5hNyhhLDc4LDAsbnVsbCksW0guS3AoYSwwKV0pO3kuRygpOyl5LmxvLiQwKCl9LAorZm9yKHk9SC5WTShuZXcgSC5hNyhhLDc4LDAsbnVsbCksW0guT3EoYSwwKV0pO3kuRygpOyl5LmxvLiQwKCl9LAogSlA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdwogej0kLlNpKCkKIGlmKEouVVEoeiwiUGxhdGZvcm0iKT09bnVsbCl0aHJvdyBILmIoUC53KCJwbGF0Zm9ybS5qcywgZGFydF9zdXBwb3J0LmpzIG11c3QgYmUgbG9hZGVkIGF0IHRoZSB0b3Agb2YgeW91ciBhcHBsaWNhdGlvbiwgYmVmb3JlIGFueSBvdGhlciBzY3JpcHRzIG9yIEhUTUwgaW1wb3J0cyB0aGF0IHVzZSBwb2x5bWVyLiBQdXR0aW5nIHRoZXNlIHR3byBzY3JpcHQgdGFncyBhdCB0aGUgdG9wIG9mIHlvdXIgPGhlYWQ+IGVsZW1lbnQgc2hvdWxkIGFkZHJlc3MgdGhpcyBpc3N1ZTogPHNjcmlwdCBzcmM9XCJwYWNrYWdlcy93ZWJfY29tcG9uZW50cy9wbGF0Zm9ybS5qc1wiPjwvc2NyaXB0PiBhbmQgIDxzY3JpcHQgc3JjPVwicGFja2FnZXMvd2ViX2NvbXBvbmVudHMvZGFydF9zdXBwb3J0LmpzXCI+PC9zY3JpcHQ+LiIpKQpAQCAtMTQyMTEsNyArMTQzNTYsNyBAQAogaWYodz09bnVsbCl0aHJvdyBILmIoUC53KCJwb2x5bWVyLmpzIG11c3QgZXhwb3NlIFwicmVnaXN0ZXJcIiBmdW5jdGlvbiBvbiBwb2x5bWVyLWVsZW1lbnQgdG8gZW5hYmxlIHBvbHltZXIuZGFydCB0byBpbnRlcm9wZXJhdGUuIikpCiBKLmtXKCQuWFgoKSwicmVnaXN0ZXIiLFAubXQobmV3IEEuazIoeCx3KSkpfSwKIFhQOnsKLSJeIjoiYTtGTD4sdDU+LFAxPCxvYz4sUTc8LE5GPCxjSz4sa0s8LEJqPCxRayxsRCxVaj4sUFM8LHRJLHQ0IiwKKyJeIjoiYTtGTD4sdDU+LFhqPCxvYz4sUTc8LE5GPCxjSz4sa0s8LEJqPCxRayxsRCxVaj4sUFM8LGtYLHQ0IiwKIGdaZjpmdW5jdGlvbigpe3ZhciB6LHkKIHo9Si5FaCh0aGlzLkZMLCJ0ZW1wbGF0ZSIpCiBpZih6IT1udWxsKXk9Si5OUSghIUoueCh6KS4kaXN2eT96Ok0uU0IoeikpCkBAIC0xNDIxOSw3ICsxNDM2NCw3IEBACiByZXR1cm4geX0sCiBCYTpmdW5jdGlvbihhKXt2YXIgeix5LHgKIGZvcih6PW51bGwseT10aGlzO3khPW51bGw7KXt6PUouVnMoSi5ucSh5KSkuTVcuZ2V0QXR0cmlidXRlKCJleHRlbmRzIikKLXk9eS5nUDEoKX14PWRvY3VtZW50Cit5PXkuZ1hqKCl9eD1kb2N1bWVudAogVy5DdCh3aW5kb3cseCxhLHRoaXMudDUseil9LAogQ3c6ZnVuY3Rpb24oYSl7dmFyIHo9JC5LYygpCiBpZih6PT1udWxsKXJldHVybgpAQCAtMTQyMzQsNyArMTQzNzksNyBAQAogdGhpcy5Caj15fX16PXRoaXMudDUKIHRoaXMucEkoeikKIHg9Si5Wcyh0aGlzLkZMKS5NVy5nZXRBdHRyaWJ1dGUoImF0dHJpYnV0ZXMiKQotaWYoeCE9bnVsbClmb3IoeT1DLnhCLkZyKHgsJC5hUSgpKSx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILktwKHksMCldKSx3PXRoaXMub2M7eS5HKCk7KXt2PUoucnIoeS5sbykKK2lmKHghPW51bGwpZm9yKHk9Qy54Qi5Gcih4LCQuYVEoKSkseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5PcSh5LDApXSksdz10aGlzLm9jO3kuRygpOyl7dj1KLnJyKHkubG8pCiBpZih2PT09IiIpY29udGludWUKIHU9JC5NZygpLk56LnQoMCx2KQogdD1MLmhrKFt1XSkKQEAgLTE0MjQ4LDcgKzE0MzkzLDcgQEAKIGlmKHM9PW51bGwpe3M9UC5GbChudWxsLG51bGwpCiB0aGlzLlE3PXN9cy51KDAsdCxyKX19LAogcEk6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKLWZvcih6PSQubVgoKS5NZSgwLGEsQy5haiksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PSQubVgoKS5NZSgwLGEsQy5haiksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXt5PXoubG8KIHg9Si5SRSh5KQogaWYoeC5nVjUoeSk9PT0hMCljb250aW51ZQogdz10aGlzLlE3CkBAIC0xNDI2MywyMyArMTQ0MDgsMjMgQEAKIFZrOmZ1bmN0aW9uKCl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsUC5hKQogdGhpcy5rSz16Ci15PXRoaXMuUDEKK3k9dGhpcy5YagogaWYoeSE9bnVsbCl6LkZWKDAseS5na0soKSkKIEouVnModGhpcy5GTCkuYU4oMCxuZXcgQS5lWSh0aGlzKSl9LAogVzM6ZnVuY3Rpb24oYSl7Si5Wcyh0aGlzLkZMKS5hTigwLG5ldyBBLkJPKGEpKX0sCiBNaTpmdW5jdGlvbigpe3ZhciB6PXRoaXMuQmcoImxpbmtbcmVsPXN0eWxlc2hlZXRdIikKIHRoaXMuUWs9egotZm9yKHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOylKLk1wKHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspSi5NcCh6LmxvKX0sCiBmNjpmdW5jdGlvbigpe3ZhciB6PXRoaXMuQmcoInN0eWxlW3BvbHltZXItc2NvcGVdIikKIHRoaXMubEQ9egotZm9yKHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOylKLk1wKHoubG8pfSwKK2Zvcih6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspSi5NcCh6LmxvKX0sCiBPTDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9dGhpcy5Rawogei50b1N0cmluZwogeT1ILlZNKG5ldyBILlU1KHosbmV3IEEuWkcoKSksW251bGxdKQogeD10aGlzLmdaZigpCiBpZih4IT1udWxsKXt3PVAucDkoIiIpCi1mb3Ioej1ILlZNKG5ldyBILk1vKEoubVkoeS5sNikseS5UNiksW0guS3AoeSwwKV0pLHY9ei5PSTt6LkcoKTspe3U9QS5xMyh2LmdsKCkpCitmb3Ioej1ILlZNKG5ldyBILk1vKEoubVkoeS5sNikseS5UNiksW0guT3EoeSwwKV0pLHY9ei5PSTt6LkcoKTspe3U9QS5xMyh2LmdsKCkpCiB0PXcudk0rPXR5cGVvZiB1PT09InN0cmluZyI/dTpILmQodSkKIHcudk09dCsiXG4ifWlmKHcudk0ubGVuZ3RoPjApe3M9Si5Ebyh0aGlzLkZMKS5jcmVhdGVFbGVtZW50KCJzdHlsZSIsbnVsbCkKIEoudDMocyxILmQodykpCkBAIC0xNDI5NSw5ICsxNDQ0MCw5IEBACiBrTzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKIHo9UC5wOSgiIikKIHk9bmV3IEEudWEoIltwb2x5bWVyLXNjb3BlPSIrYSsiXSIpCi1mb3IoeD10aGlzLlFrLHgudG9TdHJpbmcseD1ILlZNKG5ldyBILlU1KHgseSksW251bGxdKSx4PUguVk0obmV3IEguTW8oSi5tWSh4Lmw2KSx4LlQ2KSxbSC5LcCh4LDApXSksdz14Lk9JO3guRygpOyl7dj1BLnEzKHcuZ2woKSkKK2Zvcih4PXRoaXMuUWsseC50b1N0cmluZyx4PUguVk0obmV3IEguVTUoeCx5KSxbbnVsbF0pLHg9SC5WTShuZXcgSC5NbyhKLm1ZKHgubDYpLHguVDYpLFtILk9xKHgsMCldKSx3PXguT0k7eC5HKCk7KXt2PUEucTMody5nbCgpKQogdT16LnZNKz10eXBlb2Ygdj09PSJzdHJpbmciP3Y6SC5kKHYpCi16LnZNPXUrIlxuXG4ifWZvcih4PXRoaXMubEQseC50b1N0cmluZyx5PUguVk0obmV3IEguVTUoeCx5KSxbbnVsbF0pLHk9SC5WTShuZXcgSC5NbyhKLm1ZKHkubDYpLHkuVDYpLFtILktwKHksMCldKSx4PXkuT0k7eS5HKCk7KXt2PUouZFkoeC5nbCgpKQorei52TT11KyJcblxuIn1mb3IoeD10aGlzLmxELHgudG9TdHJpbmcseT1ILlZNKG5ldyBILlU1KHgseSksW251bGxdKSx5PUguVk0obmV3IEguTW8oSi5tWSh5Lmw2KSx5LlQ2KSxbSC5PcSh5LDApXSkseD15Lk9JO3kuRygpOyl7dj1KLmRZKHguZ2woKSkKIHc9ei52TSs9dHlwZW9mIHY9PT0ic3RyaW5nIj92OkguZCh2KQogei52TT13KyJcblxuIn1yZXR1cm4gei52TX0sCiBKMzpmdW5jdGlvbihhLGIpe3ZhciB6CkBAIC0xNDMwNywxOCArMTQ0NTIsMTggQEAKIHouc2V0QXR0cmlidXRlKCJlbGVtZW50IixILmQodGhpcy5vYykrIi0iK2IpCiByZXR1cm4gen0sCiBySDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKLWZvcih6PSQuSE4oKSx6PSQubVgoKS5NZSgwLHRoaXMudDUseiksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PSQuU3ooKSx6PSQubVgoKS5NZSgwLHRoaXMudDUseiksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXt5PXoubG8KIGlmKHRoaXMuY0s9PW51bGwpdGhpcy5jSz1QLllNKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIHg9Si5SRSh5KQogdz14LmdvYyh5KQogdj0kLk1nKCkuZXAudCgwLHcpCiB3PUouVTYodikKLXY9dy5Oaih2LDAsSi5iSSh3LmdCKHYpLDcpKQordj13Lk5qKHYsMCxKLkhuKHcuZ0IodiksNykpCiB0aGlzLmNLLnUoMCxMLmhrKHYpLFt4LmdvYyh5KV0pfX0sCiBJOTpmdW5jdGlvbigpe3ZhciB6LHkseAotZm9yKHo9JC5tWCgpLk1lKDAsdGhpcy50NSxDLlhrKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspe3k9ei5sby5nRHYoKQorZm9yKHo9JC5tWCgpLk1lKDAsdGhpcy50NSxDLlRiKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspe3k9ei5sby5nRHYoKQogeD1uZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCkKLXguJGJ1aWx0aW5UeXBlSW5mbz1bSC5LcCh5LDApXQoreC4kYnVpbHRpblR5cGVJbmZvPVtILk9xKHksMCldCiBmb3IoO3guRygpOyljb250aW51ZX19LAogWWw6ZnVuY3Rpb24oYSl7dmFyIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLG51bGwpCiBhLmFOKDAsbmV3IEEuVGooeikpCkBAIC0xNDMyNiwxOSArMTQ0NzEsMTkgQEAKICRpc1hQOnRydWUsCiBzdGF0aWM6eyJeIjoiS2IifX0sCiBaZDp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzaEd9LAogJGlzRUg6dHJ1ZX0sCiBEYTp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZuKCl9LAogJGlzRUg6dHJ1ZX0sCiBlWTp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe2lmKEMubjcueDQoMCxhKSE9PSEwJiYhSi5jbyhhLCJvbi0iKSl0aGlzLmEua0sudSgwLGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBCTzp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogej1KLnJZKGEpCiBpZih6Lm5DKGEsIm9uLSIpKXt5PUouVTYoYikua0ooYiwie3siKQpAQCAtMTQzNDYsMTkgKzE0NDkxLDE5IEBACiBpZih5Pj0wJiZ4Pj0wKXRoaXMuYS51KDAsei55bihhLDMpLEMueEIuYlMoQy54Qi5OaihiLHkrMix4KSkpfX0sCiAkaXNFSDp0cnVlfSwKIFpHOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5WcyhhKS5NVy5oYXNBdHRyaWJ1dGUoInBvbHltZXItc2NvcGUiKSE9PSEwfSwKICRpc0VIOnRydWV9LAogdWE6ewotIl4iOiJUcDoxMzthIiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJGKGEsdGhpcy5hKX0sCisiXiI6IlRwWjoxMzthIiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlV2KGEsdGhpcy5hKX0sCiAkaXNFSDp0cnVlfSwKIFhVRzp7Ci0iXiI6IlRwOjcxOyIsCisiXiI6IlRwWjo3MjsiLAogJDA6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sCiAkaXNFSDp0cnVlfSwKIFRqOnsKLSJeIjoiVHA6MTcyO2EiLAorIl4iOiJUcFo6MTc0O2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLEguZChhKS50b0xvd2VyQ2FzZSgpLGIpfSwKICRpc0VIOnRydWV9LAogTGk6ewpAQCAtMTQzODMsOSArMTQ1MjgsOSBAQAogei5hPXgKIHc9Qy5mRS50KDAseCkKIHouYT13IT1udWxsP3c6ei5hCi1yZXR1cm4gbmV3IEEubGkoeix0aGlzLGEpfX0sCityZXR1cm4gbmV3IEEubGl6KHosdGhpcyxhKX19LAogbDU6ewotIl4iOiJUcDoxMzthLGIsYyxkIiwKKyJeIjoiVHBaOjEzO2EsYixjLGQiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuYQogeT16LmEKQEAgLTE0MzkzLDIxICsxNDUzOCwyMSBAQAogei5hPXgKIHk9eH1pZighIUoueCh5KS4kaXN6cyl7eT1KLngoYSkKIGlmKCEheS4kaXNSYil7dz15LmdleXooYSkKLWlmKHc9PW51bGwpdz1KLlVRKFAuSFUoYSksImRldGFpbCIpfWVsc2Ugdz1udWxsCitpZih3PT1udWxsKXc9Si5VUShQLlhZKGEpLCJkZXRhaWwiKX1lbHNlIHc9bnVsbAogeT15LmdTZChhKQogej16LmEKIEouYkgoeix6LHRoaXMuZCxbYSx3LHldKX1lbHNlIHRocm93IEguYihQLncoImNvbnRyb2xsZXIgIitILmQoeSkrIiBpcyBub3QgYSBEYXJ0IHBvbHltZXItZWxlbWVudC4iKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLWxpOnsKLSJeIjoiVHA6MTc2O2EsYixjIiwKK2xpejp7CisiXiI6IlRwWjoxNzg7YSxiLGMiLAogJDM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdwogej10aGlzLmMKIHk9dGhpcy5iLlkyKG51bGwsYix6KQogeD1KLkVpKGIpLnQoMCx0aGlzLmEuYSkKLXc9SC5WTShuZXcgVy5PdigwLHguREsseC5QaCxXLmFGKHkpLHguU2cpLFtILktwKHgsMCldKQordz1ILlZNKG5ldyBXLk92KDAseC5ESyx4LlBoLFcuYUYoeSkseC5TZyksW0guT3EoeCwwKV0pCiB3Llp6KCkKIGlmKGM9PT0hMClyZXR1cm4KLXJldHVybiBuZXcgQS5kNih3LHopfSwiJDMiLG51bGwsNiwwLG51bGwsMTczLDE3NCwxNzUsImNhbGwiXSwKK3JldHVybiBuZXcgQS5kNih3LHopfSwiJDMiLG51bGwsNiwwLG51bGwsMTc1LDE3NiwxNzcsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZDY6ewogIl4iOiJZajtKcSxFRCIsCkBAIC0xNDQyMCwxNiArMTQ1NjUsMTYgQEAKICJeIjoibmQ7dm48IiwKICRpc2hHOnRydWV9LAogeGM6ewotIl4iOiJPdDtBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlRSMDtBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBYSTpmdW5jdGlvbihhKXt0aGlzLlBhKGEpfSwKIHN0YXRpYzp7Rzc6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5LaS5aTChhKQogQy5LaS5YSShhKQpAQCAtMTQ0NDIsNyArMTQ1ODcsNyBAQAogJGlzaDQ6dHJ1ZSwKICRpc1BaOnRydWUsCiAkaXNLVjp0cnVlfSwKLU90OnsKK1RSMDp7CiAiXiI6ImpwUitQaTsiLAogJGlzZDM6dHJ1ZX0sCiB6czp7CkBAIC0xNDQ1NSwyNyArMTQ2MDAsMjcgQEAKIHk9dGhpcy5nUWcoYSkuTVcuZ2V0QXR0cmlidXRlKCJpcyIpCiByZXR1cm4geT09bnVsbHx8eT09PSIiP3RoaXMuZ3FuKGEpOnl9LAogUGE6ZnVuY3Rpb24oYSl7dmFyIHoseQotej10aGlzLmdDbihhKQorej10aGlzLmdtU0EoYSkKIGlmKHohPW51bGwmJnouazghPW51bGwpe3dpbmRvdwogeT0iQXR0cmlidXRlcyBvbiAiK0guZCh0aGlzLmdSVChhKSkrIiB3ZXJlIGRhdGEgYm91bmQgcHJpb3IgdG8gUG9seW1lciB1cGdyYWRpbmcgdGhlIGVsZW1lbnQuIFRoaXMgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QgYmluZGluZyB0eXBlcy4iCiBpZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpY29uc29sZS53YXJuKHkpfXRoaXMuRWMoYSkKIHk9dGhpcy5nTTAoYSkKLWlmKCFKLnhDKCQuS3MoKS50KDAseSksITApfHwkLmpnKCk9PT0hMCl0aGlzLnJmKGEpfSwKK2lmKCFKLnhDKCQuS3MoKS50KDAseSksITApfHwkLkVwKCk9PT0hMCl0aGlzLnJmKGEpfSwKIEVjOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIGlmKGEuSVghPW51bGwpe3dpbmRvdwogej0iRWxlbWVudCBhbHJlYWR5IHByZXBhcmVkOiAiK0guZCh0aGlzLmdSVChhKSkKIGlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiljb25zb2xlLndhcm4oeikKLXJldHVybn1hLlNEPVAuSFUoYSkKK3JldHVybn1hLlNEPVAuWFkoYSkKIHo9dGhpcy5nUlQoYSkKIGEuSVg9JC52RSgpLnQoMCx6KQogdGhpcy5udChhKQogej1hLld6Ci1pZih6IT1udWxsKXt5PXRoaXMuZ251KGEpCitpZih6IT1udWxsKXt5PXRoaXMuZ1VjKGEpCiB6LnRvU3RyaW5nCi1MLkFSLnByb3RvdHlwZS5UUi5jYWxsKEoueCh6KSx6LHkpfWlmKGEuSVguZ1E3KCkhPW51bGwpdGhpcy5ncWgoYSkueUkodGhpcy5ncVkoYSkpCitMLkFSLnByb3RvdHlwZS5UUi5jYWxsKEoueCh6KSx6LHkpfWlmKGEuSVguZ1E3KCkhPW51bGwpdGhpcy5ncWgoYSkueUkodGhpcy5nR2koYSkpCiB0aGlzLloyKGEpCiB0aGlzLmZrKGEpCi10aGlzLlVjKGEpfSwKK3RoaXMucWIoYSl9LAogcmY6ZnVuY3Rpb24oYSl7aWYoYS5xMSlyZXR1cm4KIGEucTE9ITAKIHRoaXMuT2goYSxhLklYKQpAQCAtMTQ0ODQsMTAgKzE0NjI5LDEwIEBACiBlMTpmdW5jdGlvbihhKXt9LAogRXM6ZnVuY3Rpb24oYSl7aWYoYS5JWD09bnVsbCl0aHJvdyBILmIoUC53KCJwb2x5bWVyQ3JlYXRlZCB3YXMgbm90IGNhbGxlZCBmb3IgY3VzdG9tIGVsZW1lbnQgIitILmQodGhpcy5nUlQoYSkpKyIsIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIGRvbmUgaW4gdGhlIC5jcmVhdGVkKCkgaWYgUG9seW1lciBpcyB1c2VkIGFzIGEgbWl4aW4uIikpCiB0aGlzLm9XKGEpCi1pZighYS5YTil7YS5YTj0hMAoraWYoIWEub0cpe2Eub0c9ITAKIHRoaXMuclcoYSxuZXcgQS5ibChhKSl9fSwKIGRROmZ1bmN0aW9uKGEpe3RoaXMuZDkoYSl9LAotT2g6ZnVuY3Rpb24oYSxiKXtpZihiIT1udWxsKXt0aGlzLk9oKGEsYi5nUDEoKSkKK09oOmZ1bmN0aW9uKGEsYil7aWYoYiE9bnVsbCl7dGhpcy5PaChhLGIuZ1hqKCkpCiB0aGlzLmFJKGEsSi5ucShiKSl9fSwKIGFJOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKIHo9Si5SRShiKQpAQCAtMTQ0OTUsMTYgKzE0NjQwLDE2IEBACiBpZih5IT1udWxsKXt4PXRoaXMuVHAoYSx5KQogdz16LmdRZyhiKS5NVy5nZXRBdHRyaWJ1dGUoIm5hbWUiKQogaWYodz09bnVsbClyZXR1cm4KLWEuWHkudSgwLHcseCl9fSwKK2EuWk0udSgwLHcseCl9fSwKIFRwOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1CiBpZihiPT1udWxsKXJldHVybgogej10aGlzLmVyKGEpCiB5PXRoaXMuZ1VqKGEpCiB4PSEhSi54KGIpLiRpc3Z5P2I6TS5TQihiKQotdz1KLlliKHgsYSx5PT1udWxsJiZKLmZ4KHgpPT1udWxsP0ouZHUoYS5JWCk6eSkKK3c9Si5NTyh4LGEseT09bnVsbCYmSi5meCh4KT09bnVsbD9KLmR1KGEuSVgpOnkpCiB2PSQudkgoKS50KDAsdykKIHU9diE9bnVsbD92Lmd1MigpOnYKLWEuU2EucHVzaCh1KQorYS5DYy5wdXNoKHUpCiB6LmFwcGVuZENoaWxkKHcpCiB0aGlzLmxqKGEseikKIHU9JC5QbygpCkBAIC0xNDUzMCw3ICsxNDY3NSw3IEBACiB4PUoueCh2KQogdT1aLlpoKGMsdywoeC5uKHYsQy5GUSl8fHgubih2LEMuZVApKSYmdyE9bnVsbD9KLkprKHcpOnYpCiBpZih1PT1udWxsP3chPW51bGw6dSE9PXcpe3k9eS5nb2MoeikKLSQuY3AoKS5DcShhLHksdSl9fSwiJDIiLCJnaFciLDQsMCwxNzddLAorJC5jcCgpLkNxKGEseSx1KX19LCIkMiIsImdoVyIsNCwwLDE3OV0sCiBCMjpmdW5jdGlvbihhLGIpe3ZhciB6PWEuSVguZ05GKCkKIGlmKHo9PW51bGwpcmV0dXJuCiByZXR1cm4gei50KDAsYil9LApAQCAtMTQ1NTAsNyArMTQ2OTUsNyBAQAogaWYoej09bnVsbClyZXR1cm4gSi5GUyhNLlNCKGEpLGIsYyxkKQogZWxzZXt5PUouUkUoeikKIHg9eS5nb2MoeikKLXc9JC5MdSgpCit3PSQuekIoKQogaWYody5tTChDLnQ0KSl3Lk55KCJiaW5kUHJvcGVydHk6IFsiK0guZChjKSsiXSB0byBbIitILmQodGhpcy5nUlQoYSkpKyJdLlsiK0guZCh4KSsiXSIpCiB3PUouUkUoYykKIGlmKHcuZ1AoYyk9PW51bGwpdy5zUChjLCQuY3AoKS5qRChhLHgpKQpAQCAtMTQ1NjgsNyArMTQ3MTMsNyBAQAogVno6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucmYoYSl9LAogZ0NkOmZ1bmN0aW9uKGEpe3JldHVybiBKLkM1KE0uU0IoYSkpfSwKIHNDZDpmdW5jdGlvbihhLGIpe0oubkMoTS5TQihhKSxiKX0sCi1nQ246ZnVuY3Rpb24oYSl7cmV0dXJuIEouZmUoTS5TQihhKSl9LAorZ21TQTpmdW5jdGlvbihhKXtyZXR1cm4gSi5xYihNLlNCKGEpKX0sCiBkOTpmdW5jdGlvbihhKXt2YXIgeix5CiBpZihhLlVrPT09ITApcmV0dXJuCiAkLmlYKCkuTnkoIlsiK0guZCh0aGlzLmdSVChhKSkrIl0gYXN5bmNVbmJpbmRBbGwiKQpAQCAtMTQ1NzgsOCArMTQ3MjMsOCBAQAogei50NigwLHksbnVsbCkKIGEub3E9en0sCiBCTTpbZnVuY3Rpb24oYSl7aWYoYS5Vaz09PSEwKXJldHVybgotSC5iUShhLlNhLHRoaXMuZ2hiKGEpKQotYS5TYT1bXQorSC5iUShhLkNjLHRoaXMuZ2hiKGEpKQorYS5DYz1bXQogdGhpcy5VcShhKQogYS5Vaz0hMH0sIiQwIiwiZ0pnIiwwLDAsMThdLAogb1c6ZnVuY3Rpb24oYSl7dmFyIHoKQEAgLTE0NTk1LDI2ICsxNDc0MCwyNiBAQAogeD1uZXcgTC53dyhudWxsLFtdLHksbnVsbCxudWxsLG51bGwpCiB4LldmPVtdCiBhLld6PXgKLWEuU2EucHVzaChbeF0pCi1mb3IoeT1ILlZNKG5ldyBQLmZHKHopLFtILktwKHosMCldKSx3PXkuRmIseT1ILlZNKG5ldyBQLkVRKHcsdy5JZygpLDAsbnVsbCksW0guS3AoeSwwKV0pO3kuRygpOyl7dj15LmZECithLkNjLnB1c2goW3hdKQorZm9yKHk9SC5WTShuZXcgUC5mRyh6KSxbSC5PcSh6LDApXSksdz15LkZiLHk9SC5WTShuZXcgUC5FUSh3LHcuSWcoKSwwLG51bGwpLFtILk9xKHksMCldKTt5LkcoKTspe3Y9eS5mRAogeC55TihhLHYpCiB0aGlzLnJKKGEsdix2LlRsKGEpLG51bGwpfX19LAotRlE6W2Z1bmN0aW9uKGEsYixjLGQpe0ouTWUoYyxuZXcgQS5xeihhLGIsYyxkLEouSlIoYS5JWCksUC5SZChudWxsLG51bGwsbnVsbCxudWxsKSkpfSwiJDMiLCJnbnUiLDYsMCwxNzhdLAorRlE6W2Z1bmN0aW9uKGEsYixjLGQpe0ouTWUoYyxuZXcgQS5ONChhLGIsYyxkLEouSlIoYS5JWCksUC5SZChudWxsLG51bGwsbnVsbCxudWxsKSkpfSwiJDMiLCJnVWMiLDYsMCwxODBdLAogSFQ6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgogZm9yKHo9Si5tWShiKTt6LkcoKTspe3k9ei5nbCgpCiBpZighSi54KHkpLiRpc3FJKWNvbnRpbnVlCiB4PXkub2MKIHc9JC5NZygpLmVwLnQoMCx4KQogdj1hLklYLmdCaigpCi1pZih2IT1udWxsJiZ2LnRnKDAsdykpdGhpcy5KWShhLHcpfX0sIiQxIiwiZ3FZIiwyLDAsMTc5LDE3MV0sCitpZih2IT1udWxsJiZ2LnRnKDAsdykpdGhpcy5KWShhLHcpfX0sIiQxIiwiZ0dpIiwyLDAsMTgxLDE3M10sCiBySjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2CiB6PUouSlIoYS5JWCkKIGlmKHo9PW51bGwpcmV0dXJuCiB5PXoudCgwLGIpCiBpZih5PT1udWxsKXJldHVybgotaWYoISFKLngoZCkuJGlzd24pe3g9JC5idCgpCitpZighIUoueChkKS4kaXN3bil7eD0kLmRuTygpCiBpZih4Lm1MKEMudDQpKXguTnkoIlsiK0guZCh0aGlzLmdSVChhKSkrIl0gb2JzZXJ2ZUFycmF5VmFsdWU6IHVucmVnaXN0ZXIgIitILmQoYikpCi10aGlzLmlRKGEsSC5kKGIpKyJfX2FycmF5Iil9aWYoISFKLngoYykuJGlzd24pe3g9JC5idCgpCit0aGlzLmlRKGEsSC5kKGIpKyJfX2FycmF5Iil9aWYoISFKLngoYykuJGlzd24pe3g9JC5kbk8oKQogaWYoeC5tTChDLnQ0KSl4Lk55KCJbIitILmQodGhpcy5nUlQoYSkpKyJdIG9ic2VydmVBcnJheVZhbHVlOiByZWdpc3RlciAiK0guZChiKSkKIHc9Yy5nUVYoKS53NCghMSkKIHcucHMobmV3IEEuWTAoYSxkLHkpKQpAQCAtMTQ2MjIsMTEgKzE0NzY3LDExIEBACiB3Lnk1KG51bGwpCiB4PUguZChiKSsiX19hcnJheSIKIHY9YS5xOQotaWYodj09bnVsbCl7dj1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsUC5NTykKK2lmKHY9PW51bGwpe3Y9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAueVgpCiBhLnE5PXZ9di51KDAseCx3KX19LAotckI6W2Z1bmN0aW9uKGEsYil7dmFyIHoseQorZHZxOltmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGZvcih6PUoubVkoYik7ei5HKCk7KXt5PXouZ2woKQotaWYoeSE9bnVsbClKLnlkKHkpfX0sIiQxIiwiZ2hiIiwyLDAsMTgwXSwKK2lmKHkhPW51bGwpSi55ZCh5KX19LCIkMSIsImdoYiIsMiwwLDE4Ml0sCiBpUTpmdW5jdGlvbihhLGIpe3ZhciB6PWEucTkuUnooMCxiKQogaWYoej09bnVsbClyZXR1cm4hMQogei5lZCgpCkBAIC0xNDYzNCwxMCArMTQ3NzksMTAgQEAKIFVxOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9YS5xOQogaWYoej09bnVsbClyZXR1cm4KLWZvcih6PXouZ1VRKHopLHo9SC5WTShuZXcgSC5NSChudWxsLEoubVkoei5sNiksei5UNiksW0guS3AoeiwwKSxILktwKHosMSldKTt6LkcoKTspe3k9ei5sbworZm9yKHo9ei5nVVEoeiksej1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh6Lmw2KSx6LlQ2KSxbSC5PcSh6LDApLEguT3EoeiwxKV0pO3ouRygpOyl7eT16LmxvCiBpZih5IT1udWxsKXkuZWQoKX1hLnE5LlYxKDApCiBhLnE5PW51bGx9LAotVWM6ZnVuY3Rpb24oYSl7dmFyIHoseQorcWI6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1hLklYLmdQUygpCiBpZih6LmdsMCh6KSlyZXR1cm4KIHk9JC5heSgpCkBAIC0xNDY3MCwyMSArMTQ4MTUsMjEgQEAKICRpc1BaOnRydWUsCiAkaXNLVjp0cnVlfSwKIGJsOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm59LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBTdjp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PUouVnModGhpcy5hKQogaWYoei54NCgwLGEpIT09ITApei51KDAsYSxuZXcgQS5UZTQoYikuJDAoKSkKIHoudCgwLGEpfSwKICRpc0VIOnRydWV9LAogVGU0OnsKLSJeIjoiVHA6NzE7YiIsCisiXiI6IlRwWjo3MjtiIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYn0sCiAkaXNFSDp0cnVlfSwKLXF6OnsKLSJeIjoiVHA6Nzk7YSxiLGMsZCxlLGYiLAorTjQ6eworIl4iOiJUcFo6ODA7YSxiLGMsZCxlLGYiLAogJDI6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscAogej10aGlzLmIKIHk9Si5VUSh6LGEpCkBAIC0xNDcwMCwyNiArMTQ4NDUsMjYgQEAKIGZvcih3PUoubVkodSksdD10aGlzLmEscz1KLlJFKHQpLHI9dGhpcy5jLHE9dGhpcy5mO3cuRygpOyl7cD13LmdsKCkKIGlmKCFxLmgoMCxwKSljb250aW51ZQogcy5ySih0LHYseSxiKQotJC5jcCgpLkNrKHQscCxbYix5LHoscix4XSwhMCxudWxsKX19LCIkMiIsbnVsbCw0LDAsbnVsbCw5Myw1NywiY2FsbCJdLAorJC5jcCgpLkNrKHQscCxbYix5LHoscix4XSwhMCxudWxsKX19LCIkMiIsbnVsbCw0LDAsbnVsbCw5NCw1NywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBZMDp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKKyJeIjoiVHBaOjEzO2EsYixjIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogZm9yKHo9Si5tWSh0aGlzLmMpLHk9dGhpcy5hLHg9dGhpcy5iO3ouRygpOyl7dz16LmdsKCkKLSQuY3AoKS5Dayh5LHcsW3hdLCEwLG51bGwpfX0sIiQxIixudWxsLDIsMCxudWxsLDE4MSwiY2FsbCJdLAorJC5jcCgpLkNrKHksdyxbeF0sITAsbnVsbCl9fSwiJDEiLG51bGwsMiwwLG51bGwsMTgzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFNYOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej10aGlzLmEKIHk9Si5FaSh6KS50KDAsYSkKLUguVk0obmV3IFcuT3YoMCx5LkRLLHkuUGgsVy5hRihKLmR1KHouSVgpLlkyKHoseixiKSkseS5TZyksW0guS3AoeSwwKV0pLlp6KCl9LAorSC5WTShuZXcgVy5PdigwLHkuREsseS5QaCxXLmFGKEouZHUoei5JWCkuWTIoeix6LGIpKSx5LlNnKSxbSC5PcSh5LDApXSkuWnooKX0sCiAkaXNFSDp0cnVlfSwKIGxLOnsKICJeIjoiWWo7STYsaVUscTAsSnEsZFkiLAogQUI6W2Z1bmN0aW9uKGEpe3RoaXMuZFk9YQogJC5jcCgpLkNxKHRoaXMuSTYsdGhpcy5pVSxhKX0sIiQxIiwiZ2FwIiwyLDAsMjAsNThdLAotaG86W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKK0hYOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiBmb3Ioej1KLm1ZKGEpLHk9dGhpcy5pVTt6LkcoKTspe3g9ei5nbCgpCiBpZighIUoueCh4KS4kaXNxSSYmSi54Qyh4Lm9jLHkpKXt6PXRoaXMuSTYKIHc9JC5jcCgpLmVBLnQoMCx5KQpAQCAtMTQ3MjcsNyArMTQ4NzIsNyBAQAogdj13LiQxKHopCiB6PXRoaXMuZFkKIGlmKHo9PW51bGw/diE9bnVsbDp6IT09dilKLnRhKHRoaXMucTAsdikKLXJldHVybn19fSwiJDEiLCJnWFEiLDIsMCwxNzksMTcxXSwKK3JldHVybn19fSwiJDEiLCJnWFEiLDIsMCwxODEsMTczXSwKIFRSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoubXUodGhpcy5xMCxiKX0sCiBnUDpmdW5jdGlvbihhKXtyZXR1cm4gSi5WbSh0aGlzLnEwKX0sCiBzUDpmdW5jdGlvbihhLGIpe0oudGEodGhpcy5xMCxiKQpAQCAtMTQ3NTMsMzYgKzE0ODk4LDM2IEBACiBpZih6IT1udWxsKXt6LmVkKCkKIHRoaXMuaWg9bnVsbH19fSwKIEszOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKIGlmKHouaWghPW51bGx8fHoubFMhPW51bGwpe3oublkoMCkKIHouV3MoKX1yZXR1cm59LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBtUzp7Ci0iXiI6IlRwOjcxOyIsCisiXiI6IlRwWjo3MjsiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuWDEoJC5NNiwkLlVHKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGhwOnsKLSJeIjoiVHA6NzE7IiwKKyJeIjoiVHBaOjcyOyIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej0kLmlGKCkuTU0KIGlmKHouR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKIHouT0gobnVsbCkKIHJldHVybn0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGsyOnsKLSJeIjoiVHA6MTg0O2EsYiIsCisiXiI6IlRwWjoxODY7YSxiIiwKICQzOltmdW5jdGlvbihhLGIsYyl7dmFyIHo9JC5FaigpLnQoMCxiKQogaWYoeiE9bnVsbClyZXR1cm4gdGhpcy5hLkdyKG5ldyBBLnpSKGEsYix6LCQudkUoKS50KDAsYykpKQotcmV0dXJuIHRoaXMuYi5xUChbYixjXSxhKX0sIiQzIixudWxsLDYsMCxudWxsLDE4Miw1NiwxODMsImNhbGwiXSwKK3JldHVybiB0aGlzLmIucVAoW2IsY10sYSl9LCIkMyIsbnVsbCw2LDAsbnVsbCwxODQsNTYsMTg1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHpSOnsKLSJeIjoiVHA6NzE7YyxkLGUsZiIsCisiXiI6IlRwWjo3MjtjLGQsZSxmIiwKICQwOltmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGoKIHo9dGhpcy5jCiB5PXRoaXMuZAogeD10aGlzLmUKIHc9dGhpcy5mCi12PSQuUnMoKQordj0kLnJrKCkKIHU9UC5GbChudWxsLG51bGwpCiB0PW5ldyBBLlhQKHoseCx3LHksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCx2LHUsbnVsbCxudWxsKQogJC52RSgpLnUoMCx5LHQpCkBAIC0xNDc5Nyw3ICsxNDk0Miw3IEBACiB0Lk1pKCkKIHQuZjYoKQogdC5PTCgpCi1BLmg2KHQuSjModC5rTygiZ2xvYmFsIiksImdsb2JhbCIpLGRvY3VtZW50LmhlYWQpCitBLng5KHQuSjModC5rTygiZ2xvYmFsIiksImdsb2JhbCIpLGRvY3VtZW50LmhlYWQpCiB0LkN3KHopCiB0LlZrKCkKIHQuVzModSkKQEAgLTE0ODMwLDM2ICsxNDk3NSwzNiBAQAogcmV0dXJufSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogTWQ6ewotIl4iOiJUcDo3MTsiLAotJDA6ZnVuY3Rpb24oKXt2YXIgej1KLlVRKFAuSFUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicG9seW1lci1lbGVtZW50IixudWxsKSksIl9fcHJvdG9fXyIpCi1yZXR1cm4hIUoueCh6KS4kaXNLVj9QLkhVKHopOnp9LAorIl4iOiJUcFo6NzI7IiwKKyQwOmZ1bmN0aW9uKCl7dmFyIHo9Si5VUShQLlhZKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBvbHltZXItZWxlbWVudCIsbnVsbCkpLCJfX3Byb3RvX18iKQorcmV0dXJuISFKLngoeikuJGlzS1Y/UC5YWSh6KTp6fSwKICRpc0VIOnRydWV9fV0sWyJwb2x5bWVyLmF1dG9fYmluZGluZyIsInBhY2thZ2U6cG9seW1lci9hdXRvX2JpbmRpbmcuZGFydCIsLFksewogIl4iOiIiLAogcTY6ewotIl4iOiJ3YztIZixybyxkVUMscHQsSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ3YztIZixybyxkVUMscHQsSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2s4OmZ1bmN0aW9uKGEpe3JldHVybiBKLlpIKGEuSGYpfSwKIGdHNTpmdW5jdGlvbihhKXtyZXR1cm4gSi5meChhLkhmKX0sCiBzRzU6ZnVuY3Rpb24oYSxiKXtKLk5BKGEuSGYsYil9LAogVjE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWjgoYS5IZil9LAogZ1VqOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZ4KGEuSGYpfSwKLVpLOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5ZYihhLkhmLGIsYyl9LAorWks6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLk1PKGEuSGYsYixjKX0sCiBlYTpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gQS56cy5wcm90b3R5cGUuZWEuY2FsbCh0aGlzLGEsYj09PWE/Si5aSChhLkhmKTpiLGMsZCl9LAogZFg6ZnVuY3Rpb24oYSl7dmFyIHoKIHRoaXMuUGEoYSkKIGEuSGY9TS5TQihhKQogej1ULkdGKG51bGwsQy5xWSkKIEouTkEoYS5IZixuZXcgWS56cChhLHosbnVsbCkpCi0kLmlGKCkuTU0ubWwobmV3IFkuemwoYSkpfSwKKyQuaUYoKS5NTS5tbChuZXcgWS5sa0soYSkpfSwKICRpc0RUOnRydWUsCiAkaXN2eTp0cnVlLAogc3RhdGljOnt6RTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkdrcC5aTChhKQogQy5Ha3AuZFgoYSkKQEAgLTE0ODc1LDE0ICsxNTAyMCwxNCBAQAogd2M6ewogIl4iOiJHTEwrZDM7Ujk6cm8lLFYyOmRVQyUsbWU6cHQlIiwKICRpc2QzOnRydWV9LAotemw6ewotIl4iOiJUcDoxMzthIiwKK2xrSzp7CisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKIHouc2V0QXR0cmlidXRlKCJiaW5kIiwiIikKIEoubUkoeixuZXcgWS5NcngoeikpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogTXJ4OnsKLSJeIjoiVHA6MTM7YiIsCisiXiI6IlRwWjoxMztiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYgogeT1KLlJFKHopCkBAIC0xNDg5NCw0NCArMTUwMzksNDQgQEAKIFhCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRxfX19XSxbInBvbHltZXIuZGVzZXJpYWxpemUiLCJwYWNrYWdlOnBvbHltZXIvZGVzZXJpYWxpemUuZGFydCIsLFosewogIl4iOiIiLAogWmg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAotej0kLlFMKCkudCgwLGMpCit6PSQuUmYoKS50KDAsYykKIGlmKHohPW51bGwpcmV0dXJuIHouJDIoYSxiKQogdHJ5e3k9Qy54ci5rVihKLkpBKGEsIiciLCJcIiIpKQogcmV0dXJuIHl9Y2F0Y2goeCl7SC5SdSh4KQogcmV0dXJuIGF9fSwKIGxQOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9LAotJGlzRUg6dHJ1ZX0sCi1VZjp7Ci0iXiI6IlRwOjc5OyIsCisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYX0sCiAkaXNFSDp0cnVlfSwKIFJhOnsKLSJeIjoiVHA6Nzk7IiwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBhfSwKKyRpc0VIOnRydWV9LAord0pZOnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHRyeXt6PVAuenUoYSkKIHJldHVybiB6fWNhdGNoKHkpe0guUnUoeSkKIHJldHVybiBifX0sCiAkaXNFSDp0cnVlfSwKLXdKWTp7Ci0iXiI6IlRwOjc5OyIsCit6T1E6eworIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIUoueEMoYSwiZmFsc2UiKX0sCiAkaXNFSDp0cnVlfSwKLXpPUTp7Ci0iXiI6IlRwOjc5OyIsCitXNm86eworIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguQlUoYSxudWxsLG5ldyBaLmZUKGIpKX0sCiAkaXNFSDp0cnVlfSwKIGZUOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF9LAogJGlzRUg6dHJ1ZX0sCi1XNm86ewotIl4iOiJUcDo3OTsiLAorTWRROnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiBILlJSKGEsbmV3IFouTGYoYikpfSwKICRpc0VIOnRydWV9LAogTGY6ewotIl4iOiJUcDoxMztiIiwKKyJeIjoiVHBaOjEzO2IiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYn0sCiAkaXNFSDp0cnVlfX1dLFsicG9seW1lcl9leHByZXNzaW9ucyIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy9wb2x5bWVyX2V4cHJlc3Npb25zLmRhcnQiLCxULHsKICJeIjoiIiwKQEAgLTE0OTQ1LDQ0ICsxNTA5MCw0NCBAQAogcmV0dXJuIHp9LCIkMSIsIkd1IiwyLDAsNDksNjRdLAogRm06W2Z1bmN0aW9uKGEpe3JldHVybiBhfSwiJDEiLCJrUiIsMiwwLDEzLDY1XSwKIElLOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhDKEouVVEodGhpcy5hLGEpLCEwKX0sCiAkaXNFSDp0cnVlfSwKIGs5OnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguZChhKSsiOiAiK0guZChKLlVRKHRoaXMuYSxhKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMzAsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSkrIjogIitILmQoSi5VUSh0aGlzLmEsYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTMxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLVFCOnsKK2NQOnsKICJeIjoiVkU7VkEsancsaVgsV0ssY0oiLAogVVM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3CiB6PXt9CiB5PW5ldyBZLnh2KEguVk0oW10sW1kucVNdKSxQLnA5KCIiKSxuZXcgUC5XVShhLDAsMCxudWxsKSxudWxsKQoteD1uZXcgVS50dSgpCit4PW5ldyBVLkZzKCkKIHg9bmV3IFQuRlgoeCx5LG51bGwsbnVsbCkKIHk9eS56bCgpCiB4LmpRPXkKLXgudmk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guS3AoeSwwKV0pCit4LnZpPUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILk9xKHksMCldKQogeC5CcCgpCiB3PXguVGUoKQogaWYoTS5DRihjKSl7eT1KLngoYikKIHk9eS5uKGIsImJpbmQiKXx8eS5uKGIsInJlcGVhdCIpfWVsc2UgeT0hMQogaWYoeSl7ej1KLngodykKLWlmKCEhei4kaXNESSlyZXR1cm4gbmV3IFQucWIodGhpcyx3LmdGNSgpLHouZ2taKHcpKQotZWxzZSByZXR1cm4gbmV3IFQuWHliKHRoaXMsdyl9ei5hPW51bGwKK2lmKCEhei4kaXNESSlyZXR1cm4gbmV3IFQuWHliKHRoaXMsdy5nRjUoKSx6LmdrWih3KSkKK2Vsc2UgcmV0dXJuIG5ldyBULkRkaih0aGlzLHcpfXouYT1udWxsCiB5PSEhSi54KGMpLiRpc2g0CiBpZih5JiZKLnhDKGIsImNsYXNzIikpei5hPVQudjAoKQogZWxzZSBpZih5JiZKLnhDKGIsInN0eWxlIikpei5hPVQuR3UoKQotcmV0dXJuIG5ldyBULkRkaih6LHRoaXMsdyl9LAorcmV0dXJuIG5ldyBULkgxQih6LHRoaXMsdyl9LAogQ0U6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5XSy50KDAsYSkKLWlmKHo9PW51bGwpcmV0dXJuIG5ldyBULldiKHRoaXMsYSkKLXJldHVybiBuZXcgVC51S28odGhpcyxhLHopfSwKK2lmKHo9PW51bGwpcmV0dXJuIG5ldyBULnI2KHRoaXMsYSkKK3JldHVybiBuZXcgVC5XYih0aGlzLGEseil9LAogZk86ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1KLlJFKGEpCiB5PXouZ0J5KGEpCiBpZih5PT1udWxsKXJldHVybgogaWYoTS5DRihhKSl7eD0hIXouJGlzdnk/YTpNLlNCKGEpCiB6PUouUkUoeCkKLXc9ei5nQ24oeCkKK3c9ei5nbVNBKHgpCiB2PXc9PW51bGw/ei5nazgoeCk6dy5rOAogaWYoISFKLngodikuJGlzR0spcmV0dXJuIHYKIGVsc2UgcmV0dXJuIHRoaXMuaVgudCgwLGEpfXJldHVybiB0aGlzLmZPKHkpfSwKQEAgLTE0OTk4LDcgKzE1MTQzLDcgQEAKIFdnOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiBpZihNLkNGKGEpKXt6PSEhSi54KGEpLiRpc3Z5P2E6TS5TQihhKQogeT1KLlJFKHopCi1pZih5LmdDbih6KT09bnVsbCl5LmdrOCh6KQoraWYoeS5nbVNBKHopPT1udWxsKXkuZ2s4KHopCiByZXR1cm4gdGhpcy5pWC50KDAsYSl9ZWxzZXt5PUouUkUoYSkKIGlmKHkuZ2VUKGEpPT1udWxsKXt4PXRoaXMuaVgudCgwLGEpCiByZXR1cm4geCE9bnVsbD94OksuZFooYix0aGlzLmp3KX1lbHNlIHJldHVybiB0aGlzLldnKHkuZ0J5KGEpLGIpfX0sCkBAIC0xNTAwNyw1NCArMTUxNTIsNTQgQEAKIHk9SC5WTShuZXcgUC5xbyhudWxsKSxbUC5xVV0pCiB4PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxQLmEpCiB4LkZWKDAsQy52YSkKLXJldHVybiBuZXcgVC5RQihiLHgseix5LG51bGwpfX19LAotcWI6ewotIl4iOiJUcDoxODU7YixjLGQiLAorcmV0dXJuIG5ldyBULmNQKGIseCx6LHksbnVsbCl9fX0sCitYeWI6eworIl4iOiJUcFo6MTg3O2IsYyxkIiwKICQzOltmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogej10aGlzLmIKIHouV0sudSgwLGIsdGhpcy5jKQogeT0hIUoueChhKS4kaXNHSz9hOksuZFooYSx6Lmp3KQogei5pWC51KDAsYix5KQogej1ULmtSKCkKLXJldHVybiBuZXcgVC50SSh5LHosdGhpcy5kLG51bGwsbnVsbCxudWxsLG51bGwpfSwiJDMiLG51bGwsNiwwLG51bGwsMTczLDE3NCwxNzUsImNhbGwiXSwKK3JldHVybiBuZXcgVC50SSh5LHosdGhpcy5kLG51bGwsbnVsbCxudWxsLG51bGwpfSwiJDMiLG51bGwsNiwwLG51bGwsMTc1LDE3NiwxNzcsImNhbGwiXSwKICRpc0VIOnRydWV9LAotWHliOnsKLSJeIjoiVHA6MTg1O2UsZiIsCitEZGo6eworIl4iOiJUcFo6MTg3O2UsZiIsCiAkMzpbZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIHo9dGhpcy5lCiB5PSEhSi54KGEpLiRpc0dLP2E6Sy5kWihhLHouancpCiB6LmlYLnUoMCxiLHkpCiBpZihjPT09ITApcmV0dXJuIFQuakYodGhpcy5mLHksbnVsbCkKIHo9VC5rUigpCi1yZXR1cm4gbmV3IFQudEkoeSx6LHRoaXMuZixudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3MywxNzQsMTc1LCJjYWxsIl0sCityZXR1cm4gbmV3IFQudEkoeSx6LHRoaXMuZixudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3NSwxNzYsMTc3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLURkajp7Ci0iXiI6IlRwOjE4NTthLFVJLGJLIiwKK0gxQjp7CisiXiI6IlRwWjoxODc7YSxVSSxiSyIsCiAkMzpbZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIHo9dGhpcy5VSS5leShiLGEpCiBpZihjPT09ITApcmV0dXJuIFQuakYodGhpcy5iSyx6LHRoaXMuYS5hKQogeT10aGlzLmEuYQogaWYoeT09bnVsbCl5PVQua1IoKQotcmV0dXJuIG5ldyBULnRJKHoseSx0aGlzLmJLLG51bGwsbnVsbCxudWxsLG51bGwpfSwiJDMiLG51bGwsNiwwLG51bGwsMTczLDE3NCwxNzUsImNhbGwiXSwKK3JldHVybiBuZXcgVC50SSh6LHksdGhpcy5iSyxudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3NSwxNzYsMTc3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLVdiOnsKLSJeIjoiVHA6MTM7YSxiIiwKK3I2OnsKKyJeIjoiVHBaOjEzO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PXRoaXMuYQogeT10aGlzLmIKIHg9ei5pWC50KDAseSkKIGlmKHghPW51bGwpe2lmKEoueEMoYSxKLlpIKHgpKSlyZXR1cm4geAotcmV0dXJuIEsuZFooYSx6Lmp3KX1lbHNlIHJldHVybiB6LmV5KHksYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNzMsImNhbGwiXSwKK3JldHVybiBLLmRaKGEsei5qdyl9ZWxzZSByZXR1cm4gei5leSh5LGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTc1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLXVLbzp7Ci0iXiI6IlRwOjEzO2MsZCxlIiwKK1diOnsKKyJeIjoiVHBaOjEzO2MsZCxlIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej10aGlzLmMKIHk9dGhpcy5kCiB4PXouaVgudCgwLHkpCiB3PXRoaXMuZQogaWYoeCE9bnVsbClyZXR1cm4geC50MSh3LGEpCi1lbHNlIHJldHVybiB6LmZPKHkpLnQxKHcsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNzMsImNhbGwiXSwKK2Vsc2UgcmV0dXJuIHouZk8oeSkudDEodyxhKX0sIiQxIixudWxsLDIsMCxudWxsLDE3NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB0STp7CiAiXiI6IllqO0lNLGVJLGtHLFR1LFQ3LHowLElaIiwKQEAgLTE1MDY0LDExICsxNTIwOSwxMSBAQAogej10aGlzLklaCiB5PXRoaXMuYmgoYSkKIHRoaXMuSVo9eQotaWYoYiE9PSEwJiZ0aGlzLlR1IT1udWxsJiYhSi54Qyh6LHkpKXRoaXMudEModGhpcy5JWil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmI5KGEsITEpfSwiYlUiLCIkMiRza2lwQ2hhbmdlcyIsIiQxIiwiZ05CIiwyLDMsMTg2LDE4Nyw2NCwxODhdLAoraWYoYiE9PSEwJiZ0aGlzLlR1IT1udWxsJiYhSi54Qyh6LHkpKXRoaXMudEModGhpcy5JWil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmI5KGEsITEpfSwiYlUiLCIkMiRza2lwQ2hhbmdlcyIsIiQxIiwiZ05CIiwyLDMsMTg4LDE4OSw2NCwxOTBdLAogZ1A6ZnVuY3Rpb24oYSl7aWYodGhpcy5UdSE9bnVsbClyZXR1cm4gdGhpcy5JWgogcmV0dXJuIFQuakYodGhpcy5rRyx0aGlzLklNLHRoaXMuZUkpfSwKIHNQOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgotdHJ5e3o9Sy5qWCh0aGlzLmtHLGIsdGhpcy5JTSwhMSkKK3RyeXt6PUsuRkgodGhpcy5rRyxiLHRoaXMuSU0sITEpCiB0aGlzLmI5KHosITApfWNhdGNoKHcpe3Y9SC5SdSh3KQogeT12CiB4PW5ldyBILlhPKHcsbnVsbCkKQEAgLTE1MDg0LDkgKzE1MjI5LDkgQEAKIHguZm0oMCxuZXcgVC5wSSh0aGlzKSkKIHRoaXMuVDc9eAogdHJ5e3g9dGhpcy56MAotSi5OVih4LG5ldyBLLkVkaCh0aGlzLklNKSkKLXguZ1hyKCkKLXRoaXMuYjkodGhpcy56MC5nWHIoKSwhMCl9Y2F0Y2godil7eD1ILlJ1KHYpCitKLm9rVih4LG5ldyBLLkVkaCh0aGlzLklNKSkKK3guZ0szKCkKK3RoaXMuYjkodGhpcy56MC5nSzMoKSwhMCl9Y2F0Y2godil7eD1ILlJ1KHYpCiB6PXgKIHk9bmV3IEguWE8odixudWxsKQogSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLncwKCJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyIrSC5kKHRoaXMuejApKyInOiAiK0guZCh6KSx5KX1yZXR1cm4gdGhpcy5JWn0sCkBAIC0xNTA5OCwxOCArMTUyNDMsMTggQEAKIHo9JC53YigpCiB5PXRoaXMuejAKIHoudG9TdHJpbmcKLUouTlYoeSx6KQorSi5va1YoeSx6KQogdGhpcy56MD1udWxsfSwKIHN0YXRpYzp7akY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYKLXRyeXt6PUouTlYoYSxuZXcgSy5HUShiKSkKK3RyeXt6PUoub2tWKGEsbmV3IEsuR1EoYikpCiB3PWM9PW51bGw/ejpjLiQxKHopCiByZXR1cm4gd31jYXRjaCh2KXt3PUguUnUodikKIHk9dwogeD1uZXcgSC5YTyh2LG51bGwpCiBILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkudzAoIkVycm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiAnIitILmQoYSkrIic6ICIrSC5kKHkpLHgpfXJldHVybn19fSwKIHBJOnsKLSJeIjoiVHA6Nzk7YSIsCi0kMjpbZnVuY3Rpb24oYSxiKXtILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkudzAoIkVycm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiAnIitILmQodGhpcy5hLnowKSsiJzogIitILmQoYSksYil9LCIkMiIsbnVsbCw0LDAsbnVsbCwxLDE1MywiY2FsbCJdLAorIl4iOiJUcFo6ODA7YSIsCiskMjpbZnVuY3Rpb24oYSxiKXtILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkudzAoIkVycm9yIGV2YWx1YXRpbmcgZXhwcmVzc2lvbiAnIitILmQodGhpcy5hLnowKSsiJzogIitILmQoYSksYil9LCIkMiIsbnVsbCw0LDAsbnVsbCwxLDE1NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB5eTp7CiAiXiI6ImE7In19XSxbInBvbHltZXJfZXhwcmVzc2lvbnMuYXN5bmMiLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvYXN5bmMuZGFydCIsLEIsewpAQCAtMTUxMjIsMTMgKzE1MjY3LDEzIEBACiB6LnZiKGEsYikKIHJldHVybiB6fX19LAogZmc6ewotIl4iOiJUcDthLGIiLAorIl4iOiJUcFo7YSxiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmIKLXouREE9Ri5XaSh6LEMubHMsei5EQSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCit6LkRBPUYuV2koeixDLmxzLHouREEsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5NCwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUHciLGFyZ3M6W2FdfX0sdGhpcy5iLCJEZSIpfX19XSxbInBvbHltZXJfZXhwcmVzc2lvbnMuZXZhbCIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy9ldmFsLmRhcnQiLCxLLHsKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiQXkiLGFyZ3M6W2FdfX0sdGhpcy5iLCJEZSIpfX19XSxbInBvbHltZXJfZXhwcmVzc2lvbnMuZXZhbCIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy9ldmFsLmRhcnQiLCxLLHsKICJeIjoiIiwKLWpYOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdSx0CitGSDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUsdAogej1ILlZNKFtdLFtVLklwXSkKIGZvcig7eT1KLngoYSksISF5LiRpc3VrdTspe2lmKCFKLnhDKHkuZ2twKGEpLCJ8IikpYnJlYWsKIHoucHVzaCh5LmdUOChhKSkKQEAgLTE1MTM2LDE0ICsxNTI4MSwxNCBAQAogdz1DLk9MCiB2PSExfWVsc2UgaWYoISF5LiRpc3pYKXt3PWEuZ1RmKCkKIHg9YS5nSm4oKQotdj0hMH1lbHNle2lmKCEheS4kaXN4OSl7dz1hLmdUZigpCit2PSEwfWVsc2V7aWYoISF5LiRpc3JYKXt3PWEuZ1RmKCkKIHg9eS5nb2MoYSl9ZWxzZXtpZihkKXRocm93IEguYihLLnpxKCJFeHByZXNzaW9uIGlzIG5vdCBhc3NpZ25hYmxlOiAiK0guZChhKSkpCi1yZXR1cm59dj0hMX1mb3IoeT1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7eS5HKCk7KXt1PXkubG8KLUouTlYodSxuZXcgSy5HUShjKSkKK3JldHVybn12PSExfWZvcih5PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt5LkcoKTspe3U9eS5sbworSi5va1YodSxuZXcgSy5HUShjKSkKIGlmKGQpdGhyb3cgSC5iKEsuenEoImZpbHRlciBtdXN0IGltcGxlbWVudCBUcmFuc2Zvcm1lciB0byBiZSBhc3NpZ25hYmxlOiAiK0guZCh1KSkpCi1lbHNlIHJldHVybn10PUouTlYodyxuZXcgSy5HUShjKSkKK2Vsc2UgcmV0dXJufXQ9Si5va1YodyxuZXcgSy5HUShjKSkKIGlmKHQ9PW51bGwpcmV0dXJuCi1pZih2KUoua1codCxKLk5WKHgsbmV3IEsuR1EoYykpLGIpCitpZih2KUoua1codCxKLm9rVih4LG5ldyBLLkdRKGMpKSxiKQogZWxzZXt5PSQuTWcoKS5Oei50KDAseCkKICQuY3AoKS5DcSh0LHksYil9cmV0dXJuIGJ9LAogZFo6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKQEAgLTE1MTU0LDgzICsxNTI5OSw4MyBAQAogeD1uZXcgSy5QaCh6LHkpCiBpZih5Lng0KDAsInRoaXMiKSlILnZoKEsuenEoIid0aGlzJyBjYW5ub3QgYmUgdXNlZCBhcyBhIHZhcmlhYmxlIG5hbWUuIikpCiB5PXh9cmV0dXJuIHl9LAotdzEwOnsKLSJeIjoiVHA6Nzk7IiwKK3cxMTp7CisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5ldyhhLGIpfSwKICRpc0VIOnRydWV9LAotdzExOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouYkkoYSxiKX0sCi0kaXNFSDp0cnVlfSwKIHcxMjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnZYKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouSG4oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxMzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLlg5KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudlgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxNDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLmhoKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouWDkoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxNTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouaGgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxNjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiFKLnhDKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxNzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT1udWxsP2I9PW51bGw6YT09PWJ9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIUoueEMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcxODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT1udWxsP2IhPW51bGw6YSE9PWJ9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PW51bGw/Yj09bnVsbDphPT09Yn0sCiAkaXNFSDp0cnVlfSwKIHcxOTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLno4KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PW51bGw/YiE9bnVsbDphIT09Yn0sCiAkaXNFSDp0cnVlfSwKIHcyMDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLko1KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouejgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcyMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnU2KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouSjUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcyMjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLkJsKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudTYoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcyMzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09ITB8fGI9PT0hMH0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5CbChhLGIpfSwKICRpc0VIOnRydWV9LAogdzI0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT0hMCYmYj09PSEwfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09ITB8fGI9PT0hMH0sCiAkaXNFSDp0cnVlfSwKIHcyNTp7Ci0iXiI6IlRwOjc5OyIsCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PSEwJiZiPT09ITB9LAorJGlzRUg6dHJ1ZX0sCit3MjY6eworIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9SC5PZyhQLmEpCiB6PUguS1Qoeixbel0pLkJEKGIpCiBpZih6KXJldHVybiBiLiQxKGEpCiB0aHJvdyBILmIoSy56cSgiRmlsdGVycyBtdXN0IGJlIGEgb25lLWFyZ3VtZW50IGZ1bmN0aW9uLiIpKX0sCiAkaXNFSDp0cnVlfSwKLVJhYTp7Ci0iXiI6IlRwOjEzOyIsCit3MDp7CisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LAogJGlzRUg6dHJ1ZX0sCi13MDp7Ci0iXiI6IlRwOjEzOyIsCit3NTp7CisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouanpvKGEpfSwKICRpc0VIOnRydWV9LAotdzU6ewotIl4iOiJUcDoxMzsiLAordzEwOnsKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gYSE9PSEwfSwKICRpc0VIOnRydWV9LAogR0s6ewpAQCAtMTUyNTAsOCArMTUzOTUsOCBAQAogaWYoeT09bnVsbHx8ej09bnVsbCl0aHJvdyBILmIoSy56cSgidmFyaWFibGUgJyIrSC5kKGIpKyInIG5vdCBmb3VuZCIpKQogeT0kLmNwKCkuakQoeSx6KQogcmV0dXJuISFKLngoeSkuJGlzd1M/Qi5wZSh5LG51bGwpOnl9LAotdDg6ZnVuY3Rpb24oYSl7cmV0dXJuIUoueEMoYSwidGhpcyIpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJbbW9kZWw6ICIrSC5kKHRoaXMuazgpKyJdIn19LAorQUM6ZnVuY3Rpb24oYSl7cmV0dXJuIUoueEMoYSwidGhpcyIpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iW21vZGVsOiAiK0guZCh0aGlzLms4KSsiXSJ9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBQTzp7CiAiXiI6IkdLO2VUPixaMCxQPiIsCiBnazg6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5lVApAQCAtMTUyNjAsNjQgKzE1NDA1LDY0IEBACiB0OmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKEoueEModGhpcy5aMCxiKSl7ej10aGlzLlAKIHJldHVybiEhSi54KHopLiRpc3dTP0IucGUoeixudWxsKTp6fXJldHVybiB0aGlzLmVULnQoMCxiKX0sCi10ODpmdW5jdGlvbihhKXtpZihKLnhDKHRoaXMuWjAsYSkpcmV0dXJuITEKLXJldHVybiB0aGlzLmVULnQ4KGEpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVULmJ1KDApKyIgPiBbbG9jYWw6ICIrSC5kKHRoaXMuWjApKyJdIn19LAorQUM6ZnVuY3Rpb24oYSl7aWYoSi54Qyh0aGlzLlowLGEpKXJldHVybiExCityZXR1cm4gdGhpcy5lVC5BQyhhKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZVQuYnUoMCkrIiA+IFtsb2NhbDogIitILmQodGhpcy5aMCkrIl0ifSwiJDAiLCJnQVkiLDAsMCw2OV19LAogUGg6ewogIl4iOiJHSztlVD4sWjM8IiwKIGdrODpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lVC5rOH0sCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5aMwogaWYoei54NCgwLGIpKXt6PXoudCgwLGIpCiByZXR1cm4hIUoueCh6KS4kaXN3Uz9CLnBlKHosbnVsbCk6en1yZXR1cm4gdGhpcy5lVC50KDAsYil9LAotdDg6ZnVuY3Rpb24oYSl7aWYodGhpcy5aMy54NCgwLGEpKXJldHVybiExCitBQzpmdW5jdGlvbihhKXtpZih0aGlzLlozLng0KDAsYSkpcmV0dXJuITEKIHJldHVybiFKLnhDKGEsInRoaXMiKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLlozCi1yZXR1cm4iW21vZGVsOiAiK0guZCh0aGlzLmVULms4KSsiXSA+IFtnbG9iYWw6ICIrUC5JeChILlZNKG5ldyBQLmk1KHopLFtILktwKHosMCldKSwiKCIsIikiKSsiXSJ9fSwKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLlozCityZXR1cm4iW21vZGVsOiAiK0guZCh0aGlzLmVULms4KSsiXSA+IFtnbG9iYWw6ICIrUC5JeChILlZNKG5ldyBQLmk1KHopLFtILk9xKHosMCldKSwiKCIsIikiKSsiXSJ9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBBeTA6ewotIl4iOiJhO21tPyx6bzwiLAotZ1VPOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5QMAotcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guS3AoeiwwKV0pfSwKLWdYcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnpvfSwKLUNYOmZ1bmN0aW9uKGEpe30sCi1wbzpmdW5jdGlvbihhKXt2YXIgegotdGhpcy51ME8oMCxhKQotej10aGlzLm1tCi1pZih6IT1udWxsKXoucG8oYSl9LAotT1c6ZnVuY3Rpb24oKXt2YXIgej10aGlzLnV5CisiXiI6ImE7Yk8/LFhsPCIsCitnVU86ZnVuY3Rpb24oKXt2YXIgej10aGlzLms2CityZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5PcSh6LDApXSl9LAorZ0szOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWGx9LAorUWg6ZnVuY3Rpb24oYSl7fSwKK3ViOmZ1bmN0aW9uKGEpe3ZhciB6Cit0aGlzLkRiKDAsYSkKK3o9dGhpcy5iTworaWYoeiE9bnVsbCl6LnViKGEpfSwKK3B1OmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy50agogaWYoeiE9bnVsbCl7ei5lZCgpCi10aGlzLnV5PW51bGx9fSwKLXUwTzpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAotdGhpcy5PVygpCi16PXRoaXMuem8KLXRoaXMuQ1goYikKLXk9dGhpcy56bwotaWYoeT09bnVsbD96IT1udWxsOnkhPT16KXt4PXRoaXMuUDAKK3RoaXMudGo9bnVsbH19LAorRGI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKK3RoaXMucHUoKQorej10aGlzLlhsCit0aGlzLlFoKGIpCit5PXRoaXMuWGwKK2lmKHk9PW51bGw/eiE9bnVsbDp5IT09eil7eD10aGlzLms2CiBpZih4Lkd2Pj00KUgudmgoeC5xNygpKQogeC5Jdih5KX19LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSHUuYnUoMCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLktMLmJ1KDApfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNJcDp0cnVlfSwKIEVkaDp7CiAiXiI6ImNmUztxdSIsCi14bjpmdW5jdGlvbihhKXthLnUwTygwLHRoaXMucXUpfX0sCit4bjpmdW5jdGlvbihhKXthLkRiKDAsdGhpcy5xdSl9fSwKIG1lOnsKICJeIjoiY2ZTOyIsCi14bjpmdW5jdGlvbihhKXthLk9XKCl9LAoreG46ZnVuY3Rpb24oYSl7YS5wdSgpfSwKIHN0YXRpYzp7Il4iOiJsbiJ9fSwKIEdROnsKICJeIjoiUDU1O3F1IiwKIFc5OmZ1bmN0aW9uKGEpe3JldHVybiBKLlpIKHRoaXMucXUpfSwKIExUOmZ1bmN0aW9uKGEpe3JldHVybiBhLnd6LlJSKDAsdGhpcyl9LAogZlY6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PUouTlYoYS5nVGYoKSx0aGlzKQorej1KLm9rVihhLmdUZigpLHRoaXMpCiBpZih6PT1udWxsKXJldHVybgogeT1hLmdvYyhhKQogeD0kLk1nKCkuTnoudCgwLHkpCiByZXR1cm4gJC5jcCgpLmpEKHoseCl9LAotQ1U6ZnVuY3Rpb24oYSl7dmFyIHo9Si5OVihhLmdUZigpLHRoaXMpCitDVTpmdW5jdGlvbihhKXt2YXIgej1KLm9rVihhLmdUZigpLHRoaXMpCiBpZih6PT1udWxsKXJldHVybgotcmV0dXJuIEouVVEoeixKLk5WKGEuZ0puKCksdGhpcykpfSwKK3JldHVybiBKLlVRKHosSi5va1YoYS5nSm4oKSx0aGlzKSl9LAogWlI6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgotej1KLk5WKGEuZ1RmKCksdGhpcykKK3o9Si5va1YoYS5nVGYoKSx0aGlzKQogaWYoej09bnVsbClyZXR1cm4KIGlmKGEuZ3JlKCk9PW51bGwpeT1udWxsCiBlbHNle3g9YS5ncmUoKQpAQCAtMTUzMzEsMTQgKzE1NDc2LDE0IEBACiBaaDpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSC5BOChhLmdoTCgpLHRoaXMuZ2F5KCkpLFtudWxsLG51bGxdKS5icigwKX0sCiBvMDpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9UC5GbChudWxsLG51bGwpCi1mb3IoeT1hLmdSbChhKSx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILktwKHksMCldKTt5LkcoKTspe3g9eS5sbwotei51KDAsSi5OVihKLkE2KHgpLHRoaXMpLEouTlYoeC5ndjQoKSx0aGlzKSl9cmV0dXJuIHp9LAorZm9yKHk9YS5nUmwoYSkseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5PcSh5LDApXSk7eS5HKCk7KXt4PXkubG8KK3oudSgwLEoub2tWKEouQTYoeCksdGhpcyksSi5va1YoeC5ndjQoKSx0aGlzKSl9cmV0dXJuIHp9LAogWVY6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudmgoUC5mKCJzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIikpfSwKIHFzOmZ1bmN0aW9uKGEpe3JldHVybiBKLlVRKHRoaXMucXUsYS5nUChhKSl9LAogZXg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1hLmdrcChhKQoteT1KLk5WKGEuZ0JiKGEpLHRoaXMpCi14PUouTlYoYS5nVDgoYSksdGhpcykKK3k9Si5va1YoYS5nQmIoYSksdGhpcykKK3g9Si5va1YoYS5nVDgoYSksdGhpcykKIHc9JC5SYWIoKS50KDAseikKIHY9Si54KHopCiBpZih2Lm4oeiwiJiYiKXx8di5uKHosInx8Iikpe3Y9eT09bnVsbD8hMTp5CkBAIC0xNTM0NiwxMSArMTU0OTEsMTEgQEAKIGVsc2UgaWYoeT09bnVsbHx8eD09bnVsbClyZXR1cm4KIHJldHVybiB3LiQyKHkseCl9LAogeE46ZnVuY3Rpb24oYSl7dmFyIHoseQotej1KLk5WKGEuZ3d6KCksdGhpcykKLXk9JC5xTCgpLnQoMCxhLmdrcChhKSkKK3o9Si5va1YoYS5nd3ooKSx0aGlzKQoreT0kLklpKCkudCgwLGEuZ2twKGEpKQogaWYoSi54QyhhLmdrcChhKSwiISIpKXJldHVybiB5LiQxKHo9PW51bGw/ITE6eikKIHJldHVybiB6PT1udWxsP251bGw6eS4kMSh6KX0sCi1SRDpmdW5jdGlvbihhKXtyZXR1cm4gSi54QyhKLk5WKGEuZ2RjKCksdGhpcyksITApP0ouTlYoYS5nU2woKSx0aGlzKTpKLk5WKGEuZ3J1KCksdGhpcyl9LAorUkQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueEMoSi5va1YoYS5nZGMoKSx0aGlzKSwhMCk/Si5va1YoYS5nU2woKSx0aGlzKTpKLm9rVihhLmdydSgpLHRoaXMpfSwKIGt6OmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuZigiY2FuJ3QgZXZhbCBhbiAnaW4nIGV4cHJlc3Npb24iKSl9LAogeHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEgudmgoUC5mKCJjYW4ndCBldmFsIGFuICdhcycgZXhwcmVzc2lvbiIpKX19LAogT3k6ewpAQCAtMTUzNTgsMjUgKzE1NTAzLDI1IEBACiBXOTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEsudUQoYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSl9LAogTFQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEud3ouUlIoMCx0aGlzKX0sCiBmVjpmdW5jdGlvbihhKXt2YXIgeix5Ci16PUouTlYoYS5nVGYoKSx0aGlzKQorej1KLm9rVihhLmdUZigpLHRoaXMpCiB5PW5ldyBLLnZsKHosYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHkpCit6LnNiTyh5KQogcmV0dXJuIHl9LAogQ1U6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PUouTlYoYS5nVGYoKSx0aGlzKQoteT1KLk5WKGEuZ0puKCksdGhpcykKK3o9Si5va1YoYS5nVGYoKSx0aGlzKQoreT1KLm9rVihhLmdKbigpLHRoaXMpCiB4PW5ldyBLLmlUKHoseSxhLG51bGwsbnVsbCxudWxsLFAuYksobnVsbCxudWxsLCExLG51bGwpKQotei5zbW0oeCkKLXkuc21tKHgpCit6LnNiTyh4KQoreS5zYk8oeCkKIHJldHVybiB4fSwKIFpSOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKLXo9Si5OVihhLmdUZigpLHRoaXMpCit6PUoub2tWKGEuZ1RmKCksdGhpcykKIGlmKGEuZ3JlKCk9PW51bGwpeT1udWxsCiBlbHNle3g9YS5ncmUoKQogdz10aGlzLmdheSgpCiB4LnRvU3RyaW5nCiB5PUguVk0obmV3IEguQTgoeCx3KSxbbnVsbCxudWxsXSkudHQoMCwhMSl9dj1uZXcgSy5jMyh6LHksYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHYpCit6LnNiTyh2KQogaWYoeSE9bnVsbClILmJRKHksbmV3IEsuekQodikpCiByZXR1cm4gdn0sCiBvRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEsuejAoYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSl9LApAQCAtMTUzOTEsMjY0ICsxNTUzNiwyNjQgQEAKIEguYlEoeixuZXcgSy5Ycyh5KSkKIHJldHVybiB5fSwKIFlWOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAotej1KLk5WKGEuZ0czKGEpLHRoaXMpCi15PUouTlYoYS5ndjQoKSx0aGlzKQorej1KLm9rVihhLmdHMyhhKSx0aGlzKQoreT1KLm9rVihhLmd2NCgpLHRoaXMpCiB4PW5ldyBLLkVMKHoseSxhLG51bGwsbnVsbCxudWxsLFAuYksobnVsbCxudWxsLCExLG51bGwpKQotei5zbW0oeCkKLXkuc21tKHgpCit6LnNiTyh4KQoreS5zYk8oeCkKIHJldHVybiB4fSwKIHFzOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSy5layhhLG51bGwsbnVsbCxudWxsLFAuYksobnVsbCxudWxsLCExLG51bGwpKX0sCiBleDpmdW5jdGlvbihhKXt2YXIgeix5LHgKLXo9Si5OVihhLmdCYihhKSx0aGlzKQoteT1KLk5WKGEuZ1Q4KGEpLHRoaXMpCit6PUoub2tWKGEuZ0JiKGEpLHRoaXMpCit5PUoub2tWKGEuZ1Q4KGEpLHRoaXMpCiB4PW5ldyBLLmt5cCh6LHksYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHgpCi15LnNtbSh4KQorei5zYk8oeCkKK3kuc2JPKHgpCiByZXR1cm4geH0sCiB4TjpmdW5jdGlvbihhKXt2YXIgeix5Ci16PUouTlYoYS5nd3ooKSx0aGlzKQorej1KLm9rVihhLmd3eigpLHRoaXMpCiB5PW5ldyBLLm12KHosYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHkpCit6LnNiTyh5KQogcmV0dXJuIHl9LAogUkQ6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKLXo9Si5OVihhLmdkYygpLHRoaXMpCi15PUouTlYoYS5nU2woKSx0aGlzKQoteD1KLk5WKGEuZ3J1KCksdGhpcykKK3o9Si5va1YoYS5nZGMoKSx0aGlzKQoreT1KLm9rVihhLmdTbCgpLHRoaXMpCit4PUoub2tWKGEuZ3J1KCksdGhpcykKIHc9bmV3IEsuV1coeix5LHgsYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHcpCi15LnNtbSh3KQoteC5zbW0odykKK3ouc2JPKHcpCit5LnNiTyh3KQoreC5zYk8odykKIHJldHVybiB3fSwKIGt6OmZ1bmN0aW9uKGEpe3Rocm93IEguYihQLmYoImNhbid0IGV2YWwgYW4gJ2luJyBleHByZXNzaW9uIikpfSwKIHh0OmZ1bmN0aW9uKGEpe3Rocm93IEguYihQLmYoImNhbid0IGV2YWwgYW4gJ2FzJyBleHByZXNzaW9uIikpfX0sCiB6RDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLWEuc21tKHopCithLnNiTyh6KQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiBYVjp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLWEuc21tKHopCithLnNiTyh6KQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiBYczp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLWEuc21tKHopCithLnNiTyh6KQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiB1RDp7Ci0iXiI6IkF5MDtIdSxtbSx1eSx6byxQMCIsCi1DWDpmdW5jdGlvbihhKXt0aGlzLnpvPUouWkgoYSl9LAorIl4iOiJBeTA7S0wsYk8sdGosWGwsazYiLAorUWg6ZnVuY3Rpb24oYSl7dGhpcy5YbD1KLlpIKGEpfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuVzkodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuRU9dfSwKICRpc0VPOnRydWUsCiAkaXNJcDp0cnVlfSwKIHowOnsKLSJeIjoiQXkwO0h1LG1tLHV5LHpvLFAwIiwKLWdQOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuSHUKKyJeIjoiQXkwO0tMLGJPLHRqLFhsLGs2IiwKK2dQOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuS0wKIHJldHVybiB6LmdQKHopfSwKLUNYOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuSHUKLXRoaXMuem89ei5nUCh6KX0sCitRaDpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCit0aGlzLlhsPXouZ1Aoeil9LAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5vRCh0aGlzKX0sCiAkYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS5ub119LAogJGFzbm86ZnVuY3Rpb24oKXtyZXR1cm5bbnVsbF19LAogJGlzbm86dHJ1ZSwKICRpc0lwOnRydWV9LAoga0w6ewotIl4iOiJBeTA7aEw8LEh1LG1tLHV5LHpvLFAwIiwKLUNYOmZ1bmN0aW9uKGEpe3RoaXMuem89SC5WTShuZXcgSC5BOCh0aGlzLmhMLG5ldyBLLkh2KCkpLFtudWxsLG51bGxdKS5icigwKX0sCisiXiI6IkF5MDtoTDwsS0wsYk8sdGosWGwsazYiLAorUWg6ZnVuY3Rpb24oYSl7dGhpcy5YbD1ILlZNKG5ldyBILkE4KHRoaXMuaEwsbmV3IEsuSHYoKSksW251bGwsbnVsbF0pLmJyKDApfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuWmgodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuYzBdfSwKICRpc2MwOnRydWUsCiAkaXNJcDp0cnVlfSwKIEh2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gYS5nem8oKX0sIiQxIixudWxsLDIsMCxudWxsLDkzLCJjYWxsIl0sCisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBhLmdYbCgpfSwiJDEiLG51bGwsMiwwLG51bGwsOTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZXY6ewotIl4iOiJBeTA7Umw+LEh1LG1tLHV5LHpvLFAwIiwKLUNYOmZ1bmN0aW9uKGEpe3RoaXMuem89SC5Geih0aGlzLlJsLFAuTDUobnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxuZXcgSy5LdSgpKX0sCisiXiI6IkF5MDtSbD4sS0wsYk8sdGosWGwsazYiLAorUWg6ZnVuY3Rpb24oYSl7dGhpcy5YbD1ILm4zKHRoaXMuUmwsUC5MNShudWxsLG51bGwsbnVsbCxudWxsLG51bGwpLG5ldyBLLkt1KCkpfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIubzAodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuTW1dfSwKICRpc01tOnRydWUsCiAkaXNJcDp0cnVlfSwKIEt1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5rVyhhLEouQTYoYikuZ3pvKCksYi5ndjQoKS5nem8oKSkKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oua1coYSxKLkE2KGIpLmdYbCgpLGIuZ3Y0KCkuZ1hsKCkpCiByZXR1cm4gYX0sCiAkaXNFSDp0cnVlfSwKIEVMOnsKLSJeIjoiQXkwO0czPix2NDwsSHUsbW0sdXksem8sUDAiLAorIl4iOiJBeTA7RzM+LHY0PCxLTCxiTyx0aixYbCxrNiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLllWKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLmFlXX0sCiAkaXNhZTp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBlazp7Ci0iXiI6IkF5MDtIdSxtbSx1eSx6byxQMCIsCi1nUDpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDtLTCxiTyx0aixYbCxrNiIsCitnUDpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5nUCh6KX0sCi1DWDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwotej10aGlzLkh1CitRaDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdworej10aGlzLktMCiB5PUouVTYoYSkKLXRoaXMuem89eS50KGEsei5nUCh6KSkKLWlmKCFhLnQ4KHouZ1AoeikpKXJldHVybgordGhpcy5YbD15LnQoYSx6LmdQKHopKQoraWYoIWEuQUMoei5nUCh6KSkpcmV0dXJuCiB4PXkuZ2s4KGEpCiB5PUoueCh4KQogaWYoIXkuJGlzZDMpcmV0dXJuCiB6PXouZ1AoeikKIHc9JC5NZygpLk56LnQoMCx6KQotdGhpcy51eT15LmdxaCh4KS55SShuZXcgSy5WOCh0aGlzLGEsdykpfSwKK3RoaXMudGo9eS5ncWgoeCkueUkobmV3IEsuVjgodGhpcyxhLHcpKX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLnFzKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLmZwXX0sCiAkaXNmcDp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBWODp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKLSQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLkdDKHRoaXMuYykpPT09ITApdGhpcy5hLnBvKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODEsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EsYixjIiwKKyQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLkdDKHRoaXMuYykpPT09ITApdGhpcy5hLnViKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogR0M6ewotIl4iOiJUcDoxMztkIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNxSSYmSi54QyhhLm9jLHRoaXMuZCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7ZCIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbXY6ewotIl4iOiJBeTA7d3o8LEh1LG1tLHV5LHpvLFAwIiwKLWdrcDpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDt3ejwsS0wsYk8sdGosWGwsazYiLAorZ2twOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuS0wKIHJldHVybiB6LmdrcCh6KX0sCi1DWDpmdW5jdGlvbihhKXt2YXIgeix5Ci16PXRoaXMuSHUKLXk9JC5xTCgpLnQoMCx6LmdrcCh6KSkKLWlmKEoueEMoei5na3AoeiksIiEiKSl7ej10aGlzLnd6Lmd6bygpCi10aGlzLnpvPXkuJDEoej09bnVsbD8hMTp6KX1lbHNle3o9dGhpcy53egotdGhpcy56bz16Lmd6bygpPT1udWxsP251bGw6eS4kMSh6Lmd6bygpKX19LAorUWg6ZnVuY3Rpb24oYSl7dmFyIHoseQorej10aGlzLktMCit5PSQuSWkoKS50KDAsei5na3AoeikpCitpZihKLnhDKHouZ2twKHopLCIhIikpe3o9dGhpcy53ei5nWGwoKQordGhpcy5YbD15LiQxKHo9PW51bGw/ITE6eil9ZWxzZXt6PXRoaXMud3oKK3RoaXMuWGw9ei5nWGwoKT09bnVsbD9udWxsOnkuJDEoei5nWGwoKSl9fSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIueE4odGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuY0pdfSwKICRpc2NKOnRydWUsCiAkaXNJcDp0cnVlfSwKIGt5cDp7Ci0iXiI6IkF5MDtCYj4sVDg+LEh1LG1tLHV5LHpvLFAwIiwKLWdrcDpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDtCYj4sVDg+LEtMLGJPLHRqLFhsLGs2IiwKK2drcDpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5na3Aoeil9LAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PXRoaXMuSHUKK1FoOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAorej10aGlzLktMCiB5PSQuUmFiKCkudCgwLHouZ2twKHopKQotaWYoSi54Qyh6LmdrcCh6KSwiJiYiKXx8Si54Qyh6LmdrcCh6KSwifHwiKSl7ej10aGlzLkJiLmd6bygpCitpZihKLnhDKHouZ2twKHopLCImJiIpfHxKLnhDKHouZ2twKHopLCJ8fCIpKXt6PXRoaXMuQmIuZ1hsKCkKIGlmKHo9PW51bGwpej0hMQoteD10aGlzLlQ4Lmd6bygpCi10aGlzLnpvPXkuJDIoeix4PT1udWxsPyExOngpfWVsc2UgaWYoSi54Qyh6LmdrcCh6KSwiPT0iKXx8Si54Qyh6LmdrcCh6KSwiIT0iKSl0aGlzLnpvPXkuJDIodGhpcy5CYi5nem8oKSx0aGlzLlQ4Lmd6bygpKQoreD10aGlzLlQ4LmdYbCgpCit0aGlzLlhsPXkuJDIoeix4PT1udWxsPyExOngpfWVsc2UgaWYoSi54Qyh6LmdrcCh6KSwiPT0iKXx8Si54Qyh6LmdrcCh6KSwiIT0iKSl0aGlzLlhsPXkuJDIodGhpcy5CYi5nWGwoKSx0aGlzLlQ4LmdYbCgpKQogZWxzZXt4PXRoaXMuQmIKLWlmKHguZ3pvKCk9PW51bGx8fHRoaXMuVDguZ3pvKCk9PW51bGwpdGhpcy56bz1udWxsCi1lbHNle2lmKEoueEMoei5na3AoeiksInwiKSYmISFKLngoeC5nem8oKSkuJGlzd24pdGhpcy51eT1ILkdvKHguZ3pvKCksIiRpc3duIikuZ1FWKCkueUkobmV3IEsuUDgodGhpcyxhKSkKLXRoaXMuem89eS4kMih4Lmd6bygpLHRoaXMuVDguZ3pvKCkpfX19LAoraWYoeC5nWGwoKT09bnVsbHx8dGhpcy5UOC5nWGwoKT09bnVsbCl0aGlzLlhsPW51bGwKK2Vsc2V7aWYoSi54Qyh6LmdrcCh6KSwifCIpJiYhIUoueCh4LmdYbCgpKS4kaXN3bil0aGlzLnRqPUguR28oeC5nWGwoKSwiJGlzd24iKS5nUVYoKS55SShuZXcgSy5QOCh0aGlzLGEpKQordGhpcy5YbD15LiQyKHguZ1hsKCksdGhpcy5UOC5nWGwoKSl9fX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLmV4KHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLnVrdV19LAogJGlzdWt1OnRydWUsCiAkaXNJcDp0cnVlfSwKIFA4OnsKLSJeIjoiVHA6MTM7YSxiIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnBvKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSxiIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnViKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBXVzp7Ci0iXiI6IkF5MDtkYzwsU2w8LHJ1PCxIdSxtbSx1eSx6byxQMCIsCi1DWDpmdW5jdGlvbihhKXt2YXIgej10aGlzLmRjLmd6bygpCi10aGlzLnpvPSh6PT1udWxsPyExOnopPT09ITA/dGhpcy5TbC5nem8oKTp0aGlzLnJ1Lmd6bygpfSwKKyJeIjoiQXkwO2RjPCxTbDwscnU8LEtMLGJPLHRqLFhsLGs2IiwKK1FoOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuZGMuZ1hsKCkKK3RoaXMuWGw9KHo9PW51bGw/ITE6eik9PT0hMD90aGlzLlNsLmdYbCgpOnRoaXMucnUuZ1hsKCl9LAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5SRCh0aGlzKX0sCiAkYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS5tY119LAogJGlzbWM6dHJ1ZSwKICRpc0lwOnRydWV9LAogdmw6ewotIl4iOiJBeTA7VGY8LEh1LG1tLHV5LHpvLFAwIiwKLWdvYzpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDtUZjwsS0wsYk8sdGosWGwsazYiLAorZ29jOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuS0wKIHJldHVybiB6LmdvYyh6KX0sCi1DWDpmdW5jdGlvbihhKXt2YXIgeix5LHgKLXo9dGhpcy5UZi5nem8oKQotaWYoej09bnVsbCl7dGhpcy56bz1udWxsCi1yZXR1cm59eT10aGlzLkh1CitRaDpmdW5jdGlvbihhKXt2YXIgeix5LHgKK3o9dGhpcy5UZi5nWGwoKQoraWYoej09bnVsbCl7dGhpcy5YbD1udWxsCityZXR1cm59eT10aGlzLktMCiB5PXkuZ29jKHkpCiB4PSQuTWcoKS5Oei50KDAseSkKLXRoaXMuem89JC5jcCgpLmpEKHoseCkKK3RoaXMuWGw9JC5jcCgpLmpEKHoseCkKIHk9Si54KHopCi1pZighIXkuJGlzZDMpdGhpcy51eT15LmdxaCh6KS55SShuZXcgSy5mayh0aGlzLGEseCkpfSwKK2lmKCEheS4kaXNkMyl0aGlzLnRqPXkuZ3FoKHopLnlJKG5ldyBLLmZrKHRoaXMsYSx4KSl9LAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5mVih0aGlzKX0sCi0kYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS54OV19LAotJGlzeDk6dHJ1ZSwKKyRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLnJYXX0sCiskaXNyWDp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBmazp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKLSQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLldLYih0aGlzLmMpKT09PSEwKXRoaXMuYS5wbyh0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgxLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthLGIsYyIsCiskMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5XS2IodGhpcy5jKSk9PT0hMCl0aGlzLmEudWIodGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBXS2I6ewotIl4iOiJUcDoxMztkIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNxSSYmSi54QyhhLm9jLHRoaXMuZCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7ZCIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogaVQ6ewotIl4iOiJBeTA7VGY8LEpuPCxIdSxtbSx1eSx6byxQMCIsCi1DWDpmdW5jdGlvbihhKXt2YXIgeix5LHgKLXo9dGhpcy5UZi5nem8oKQotaWYoej09bnVsbCl7dGhpcy56bz1udWxsCi1yZXR1cm59eT10aGlzLkpuLmd6bygpCisiXiI6IkF5MDtUZjwsSm48LEtMLGJPLHRqLFhsLGs2IiwKK1FoOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAorej10aGlzLlRmLmdYbCgpCitpZih6PT1udWxsKXt0aGlzLlhsPW51bGwKK3JldHVybn15PXRoaXMuSm4uZ1hsKCkKIHg9Si5VNih6KQotdGhpcy56bz14LnQoeix5KQotaWYoISF4LiRpc3duKXRoaXMudXk9ei5nUVYoKS55SShuZXcgSy50RSh0aGlzLGEseSkpCi1lbHNlIGlmKCEheC4kaXNkMyl0aGlzLnV5PXguZ3FoKHopLnlJKG5ldyBLLm5hKHRoaXMsYSx5KSl9LAordGhpcy5YbD14LnQoeix5KQoraWYoISF4LiRpc3duKXRoaXMudGo9ei5nUVYoKS55SShuZXcgSy50RSh0aGlzLGEseSkpCitlbHNlIGlmKCEheC4kaXNkMyl0aGlzLnRqPXguZ3FoKHopLnlJKG5ldyBLLmphaSh0aGlzLGEseSkpfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuQ1UodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuelhdfSwKICRpc3pYOnRydWUsCiAkaXNJcDp0cnVlfSwKIHRFOnsKLSJeIjoiVHA6MTM7YSxiLGMiLAotJDE6W2Z1bmN0aW9uKGEpe2lmKEoubkUxKGEsbmV3IEsuencodGhpcy5jKSk9PT0hMCl0aGlzLmEucG8odGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MSwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSxiLGMiLAorJDE6W2Z1bmN0aW9uKGEpe2lmKEoubkUxKGEsbmV3IEsuencodGhpcy5jKSk9PT0hMCl0aGlzLmEudWIodGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB6dzp7Ci0iXiI6IlRwOjEzO2QiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBhLnZQKHRoaXMuZCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7ZCIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2sodGhpcy5kKX0sIiQxIixudWxsLDIsMCxudWxsLDg0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLW5hOnsKLSJeIjoiVHA6MTM7ZSxmLFVJIiwKLSQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLmV5KHRoaXMuVUkpKT09PSEwKXRoaXMuZS5wbyh0aGlzLmYpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgxLCJjYWxsIl0sCitqYWk6eworIl4iOiJUcFo6MTM7ZSxmLFVJIiwKKyQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLmV5KHRoaXMuVUkpKT09PSEwKXRoaXMuZS51Yih0aGlzLmYpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGV5OnsKLSJeIjoiVHA6MTM7YksiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc3lhJiZKLnhDKGEuRzMsdGhpcy5iSyl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7YksiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc3lhJiZKLnhDKGEuRzMsdGhpcy5iSyl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4NCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBjMzp7Ci0iXiI6IkF5MDtUZjwscmU8LEh1LG1tLHV5LHpvLFAwIiwKLWdTZjpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDtUZjwscmU8LEtMLGJPLHRqLFhsLGs2IiwKK2dTZjpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5nU2Yoeil9LAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKK1FoOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMucmUKIHoudG9TdHJpbmcKIHk9SC5WTShuZXcgSC5BOCh6LG5ldyBLLnZRKCkpLFtudWxsLG51bGxdKS5icigwKQoteD10aGlzLlRmLmd6bygpCi1pZih4PT1udWxsKXt0aGlzLnpvPW51bGwKLXJldHVybn16PXRoaXMuSHUKK3g9dGhpcy5UZi5nWGwoKQoraWYoeD09bnVsbCl7dGhpcy5YbD1udWxsCityZXR1cm59ej10aGlzLktMCiBpZih6LmdTZih6KT09bnVsbCl7ej1ILmVDKHgseSxQLlRlKG51bGwpKQotdGhpcy56bz0hIUoueCh6KS4kaXN3Uz9CLnBlKHosbnVsbCk6en1lbHNle3o9ei5nU2YoeikKK3RoaXMuWGw9ISFKLngoeikuJGlzd1M/Qi5wZSh6LG51bGwpOnp9ZWxzZXt6PXouZ1NmKHopCiB3PSQuTWcoKS5Oei50KDAseikKLXRoaXMuem89JC5jcCgpLkNrKHgsdyx5LCExLG51bGwpCit0aGlzLlhsPSQuY3AoKS5Dayh4LHcseSwhMSxudWxsKQogej1KLngoeCkKLWlmKCEhei4kaXNkMyl0aGlzLnV5PXouZ3FoKHgpLnlJKG5ldyBLLlNyKHRoaXMsYSx3KSl9fSwKK2lmKCEhei4kaXNkMyl0aGlzLnRqPXouZ3FoKHgpLnlJKG5ldyBLLlNyKHRoaXMsYSx3KSl9fSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuWlIodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UuTmJdfSwKICRpc05iOnRydWUsCiAkaXNJcDp0cnVlfSwKIHZROnsKLSJeIjoiVHA6MTM7IiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gYS5nem8oKX0sIiQxIixudWxsLDIsMCxudWxsLDQ2LCJjYWxsIl0sCisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBhLmdYbCgpfSwiJDEiLG51bGwsMiwwLG51bGwsNDYsImNhbGwiXSwKICRpc0VIOnRydWV9LAogU3I6ewotIl4iOiJUcDoxODk7YSxiLGMiLAotJDE6W2Z1bmN0aW9uKGEpe2lmKEoubkUxKGEsbmV3IEsuaG8odGhpcy5jKSk9PT0hMCl0aGlzLmEucG8odGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MSwiY2FsbCJdLAorIl4iOiJUcFo6MTkxO2EsYixjIiwKKyQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLmhvKHRoaXMuYykpPT09ITApdGhpcy5hLnViKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogaG86ewotIl4iOiJUcDoxMztkIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNxSSYmSi54QyhhLm9jLHRoaXMuZCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7ZCIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQjAzOnsKICJeIjoiYTtHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIkV2YWxFeGNlcHRpb246ICIrdGhpcy5HMX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIkV2YWxFeGNlcHRpb246ICIrdGhpcy5HMX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOnt6cTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEsuQjAzKGEpfX19fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLmV4cHJlc3Npb24iLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvZXhwcmVzc2lvbi5kYXJ0IiwsVSx7CiAiXiI6IiIsCiBQdTpmdW5jdGlvbihhLGIpe3ZhciB6LHkKQEAgLTE1NjU4LDggKzE1ODAzLDggQEAKIGZvcih6PTA7ejxhLmxlbmd0aDsrK3ope3k9YVt6XQogaWYoej49Yi5sZW5ndGgpcmV0dXJuIEguZShiLHopCiBpZighSi54Qyh5LGJbel0pKXJldHVybiExfXJldHVybiEwfSwKLWIxOmZ1bmN0aW9uKGEpe2EudG9TdHJpbmcKLXJldHVybiBVLkxlKEguRnooYSwwLG5ldyBVLnhzKCkpKX0sCitwejpmdW5jdGlvbihhKXthLnRvU3RyaW5nCityZXR1cm4gVS5MZShILm4zKGEsMCxuZXcgVS5sYygpKSl9LAogQzBDOmZ1bmN0aW9uKGEsYil7dmFyIHo9Si5ldyhhLGIpCiBpZih0eXBlb2YgeiE9PSJudW1iZXIiKXJldHVybiBILnMoeikKIGE9NTM2ODcwOTExJnoKQEAgLTE1NjY5LDkgKzE1ODE0LDkgQEAKIGE9NTM2ODcwOTExJmErKCg2NzEwODg2MyZhKTw8Mz4+PjApCiBhPShhXmE+Pj4xMSk+Pj4wCiByZXR1cm4gNTM2ODcwOTExJmErKCgxNjM4MyZhKTw8MTU+Pj4wKX0sCi10dTp7CitGczp7CiAiXiI6ImE7IiwKLUJmOltmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBVLnpYKGIsYyl9LCIkMiIsImd2SCIsNCwwLDE5MCwxLDQ2XX0sCitCZjpbZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgVS56WChiLGMpfSwiJDIiLCJndkgiLDQsMCwxOTIsMSw0Nl19LAogSXA6ewogIl4iOiJhOyIsCiAkaXNJcDp0cnVlfSwKQEAgLTE1NjgyLDM2ICsxNTgyNywzNiBAQAogbm86ewogIl4iOiJJcDtQPiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLm9EKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuUAotcmV0dXJuIHR5cGVvZiB6PT09InN0cmluZyI/IlwiIitILmQoeikrIlwiIjpILmQoeil9LAorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuUAorcmV0dXJuIHR5cGVvZiB6PT09InN0cmluZyI/IlwiIitILmQoeikrIlwiIjpILmQoeil9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYj09bnVsbClyZXR1cm4hMQotej1ILlJCKGIsIiRpc25vIixbSC5LcCh0aGlzLDApXSwiJGFzbm8iKQorej1ILlJCKGIsIiRpc25vIixbSC5PcSh0aGlzLDApXSwiJGFzbm8iKQogcmV0dXJuIHomJkoueEMoSi5WbShiKSx0aGlzLlApfSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSi52MSh0aGlzLlApfSwKICRpc25vOnRydWV9LAogYzA6ewogIl4iOiJJcDtoTDwiLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5aaCh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuaEwpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuaEwpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzYzAmJlUuUHUoYi5naEwoKSx0aGlzLmhMKX0sCi1naU86ZnVuY3Rpb24oYSl7cmV0dXJuIFUuYjEodGhpcy5oTCl9LAorZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBVLnB6KHRoaXMuaEwpfSwKICRpc2MwOnRydWV9LAogTW06ewogIl4iOiJJcDtSbD4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5vMCh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4ieyIrSC5kKHRoaXMuUmwpKyJ9In0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuInsiK0guZCh0aGlzLlJsKSsifSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKIHJldHVybiEhei4kaXNNbSYmVS5QdSh6LmdSbChiKSx0aGlzLlJsKX0sCi1naU86ZnVuY3Rpb24oYSl7cmV0dXJuIFUuYjEodGhpcy5SbCl9LAorZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBVLnB6KHRoaXMuUmwpfSwKICRpc01tOnRydWV9LAogYWU6ewogIl4iOiJJcDtHMz4sdjQ8IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuWVYodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRzMuYnUoMCkrIjogIitILmQodGhpcy52NCl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLkczLmJ1KDApKyI6ICIrSC5kKHRoaXMudjQpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xNTcyNCw3ICsxNTg2OSw3IEBACiBYQzp7CiAiXiI6IklwO3d6IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuTFQodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLnd6KSsiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy53eikrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzWEMmJkoueEMoYi53eix0aGlzLnd6KX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEoudjEodGhpcy53eil9LApAQCAtMTU3MzIsNyArMTU4NzcsNyBAQAogZnA6ewogIl4iOiJJcDtQPiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLnFzKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlB9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLlB9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKQEAgLTE1NzQyLDcgKzE1ODg3LDcgQEAKIGNKOnsKICJeIjoiSXA7a3A+LHd6PCIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLnhOKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5rcCkrIiAiK0guZCh0aGlzLnd6KX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmtwKSsiICIrSC5kKHRoaXMud3opfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xNTc1NSw3ICsxNTkwMCw3IEBACiB1a3U6ewogIl4iOiJJcDtrcD4sQmI+LFQ4PiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLmV4KHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5CYikrIiAiK0guZCh0aGlzLmtwKSsiICIrSC5kKHRoaXMuVDgpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLkJiKSsiICIrSC5kKHRoaXMua3ApKyIgIitILmQodGhpcy5UOCkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xNTc2OSw3ICsxNTkxNCw3IEBACiBtYzp7CiAiXiI6IklwO2RjPCxTbDwscnU8IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuUkQodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLmRjKSsiID8gIitILmQodGhpcy5TbCkrIiA6ICIrSC5kKHRoaXMucnUpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLmRjKSsiID8gIitILmQodGhpcy5TbCkrIiA6ICIrSC5kKHRoaXMucnUpKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKIHJldHVybiEhSi54KGIpLiRpc21jJiZKLnhDKGIuZ2RjKCksdGhpcy5kYykmJkoueEMoYi5nU2woKSx0aGlzLlNsKSYmSi54QyhiLmdydSgpLHRoaXMucnUpfSwKIGdpTzpmdW5jdGlvbihhKXt2YXIgeix5LHgKQEAgLTE1Nzc4LDIxICsxNTkyMywyMSBAQAogeD1KLnYxKHRoaXMucnUpCiByZXR1cm4gVS5MZShVLkMwQyhVLkMwQyhVLkMwQygwLHopLHkpLHgpKX0sCiAkaXNtYzp0cnVlfSwKLW1hOnsKK1g3Uzp7CiAiXiI6IklwO0JiPixUOD4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5reih0aGlzKX0sCiBnRjU6ZnVuY3Rpb24oKXt2YXIgej10aGlzLkJiCiByZXR1cm4gei5nUCh6KX0sCiBna1o6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuVDh9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLkJiKSsiIGluICIrSC5kKHRoaXMuVDgpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLkJiKSsiIGluICIrSC5kKHRoaXMuVDgpKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKLXJldHVybiEhSi54KGIpLiRpc21hJiZiLkJiLm4oMCx0aGlzLkJiKSYmSi54QyhiLlQ4LHRoaXMuVDgpfSwKK3JldHVybiEhSi54KGIpLiRpc1g3UyYmYi5CYi5uKDAsdGhpcy5CYikmJkoueEMoYi5UOCx0aGlzLlQ4KX0sCiBnaU86ZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLkJiCiB6PXouZ2lPKHopCiB5PUoudjEodGhpcy5UOCkKIHJldHVybiBVLkxlKFUuQzBDKFUuQzBDKDAseikseSkpfSwKLSRpc21hOnRydWUsCiskaXNYN1M6dHJ1ZSwKICRpc0RJOnRydWV9LAogcHg6ewogIl4iOiJJcDtCYj4sVDg+IiwKQEAgLTE1ODAwLDcgKzE1OTQ1LDcgQEAKIGdGNTpmdW5jdGlvbigpe3ZhciB6PXRoaXMuVDgKIHJldHVybiB6LmdQKHopfSwKIGdrWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5CYn0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMuQmIpKyIgYXMgIitILmQodGhpcy5UOCkrIikifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMuQmIpKyIgYXMgIitILmQodGhpcy5UOCkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzcHgmJkoueEMoYi5CYix0aGlzLkJiKSYmYi5UOC5uKDAsdGhpcy5UOCl9LAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKQEAgLTE1ODEzLDcgKzE1OTU4LDcgQEAKIHpYOnsKICJeIjoiSXA7VGY8LEpuPCIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLkNVKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5UZikrIlsiK0guZCh0aGlzLkpuKSsiXSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5UZikrIlsiK0guZCh0aGlzLkpuKSsiXSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCiByZXR1cm4hIUoueChiKS4kaXN6WCYmSi54QyhiLmdUZigpLHRoaXMuVGYpJiZKLnhDKGIuZ0puKCksdGhpcy5Kbil9LAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKQEAgLTE1ODIxLDIzICsxNTk2NiwyMyBAQAogeT1KLnYxKHRoaXMuSm4pCiByZXR1cm4gVS5MZShVLkMwQyhVLkMwQygwLHopLHkpKX0sCiAkaXN6WDp0cnVlfSwKLXg5OnsKK3JYOnsKICJeIjoiSXA7VGY8LG9jPiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLmZWKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5UZikrIi4iK0guZCh0aGlzLm9jKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLlRmKSsiLiIrSC5kKHRoaXMub2MpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCi1yZXR1cm4hIXouJGlzeDkmJkoueEMoYi5nVGYoKSx0aGlzLlRmKSYmSi54Qyh6LmdvYyhiKSx0aGlzLm9jKX0sCityZXR1cm4hIXouJGlzclgmJkoueEMoYi5nVGYoKSx0aGlzLlRmKSYmSi54Qyh6LmdvYyhiKSx0aGlzLm9jKX0sCiBnaU86ZnVuY3Rpb24oYSl7dmFyIHoseQogej1KLnYxKHRoaXMuVGYpCiB5PUoudjEodGhpcy5vYykKIHJldHVybiBVLkxlKFUuQzBDKFUuQzBDKDAseikseSkpfSwKLSRpc3g5OnRydWV9LAorJGlzclg6dHJ1ZX0sCiBOYjp7CiAiXiI6IklwO1RmPCxTZj4scmU8IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuWlIodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLlRmKSsiLiIrSC5kKHRoaXMuU2YpKyIoIitILmQodGhpcy5yZSkrIikifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuVGYpKyIuIitILmQodGhpcy5TZikrIigiK0guZCh0aGlzLnJlKSsiKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKQEAgLTE1ODQ1LDExICsxNTk5MCwxMSBAQAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej1KLnYxKHRoaXMuVGYpCiB5PUoudjEodGhpcy5TZikKLXg9VS5iMSh0aGlzLnJlKQoreD1VLnB6KHRoaXMucmUpCiByZXR1cm4gVS5MZShVLkMwQyhVLkMwQyhVLkMwQygwLHopLHkpLHgpKX0sCiAkaXNOYjp0cnVlfSwKLXhzOnsKLSJeIjoiVHA6Nzk7IiwKK2xjOnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiBVLkMwQyhhLEoudjEoYikpfSwKICRpc0VIOnRydWV9fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLnBhcnNlciIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy9wYXJzZXIuZGFydCIsLFQsewogIl4iOiIiLApAQCAtMTU4ODAsMTIgKzE2MDI1LDEyIEBACiB0aGlzLkJwKCkKIHc9dGhpcy5UZSgpCiB0aGlzLnJwLnRvU3RyaW5nCi1hPW5ldyBVLm1hKGEsdyl9ZWxzZSBpZihKLnhDKEouVm0odGhpcy52aS5sbyksImFzIikpe3RoaXMuQnAoKQorYT1uZXcgVS5YN1MoYSx3KX1lbHNlIGlmKEoueEMoSi5WbSh0aGlzLnZpLmxvKSwiYXMiKSl7dGhpcy5CcCgpCiB3PXRoaXMuVGUoKQogaWYoIUoueCh3KS4kaXNmcClILnZoKFkuUlYoIidhcycgc3RhdGVtZW50cyBtdXN0IGVuZCB3aXRoIGFuIGlkZW50aWZpZXIiKSkKIHRoaXMucnAudG9TdHJpbmcKIGE9bmV3IFUucHgoYSx3KX1lbHNlIGJyZWFrCi1lbHNle2lmKEoueEMoSi5Jeih0aGlzLnZpLmxvKSw4KSl7ej10aGlzLnZpLmxvLmdQOSgpCitlbHNle2lmKEoueEMoSi5Jeih0aGlzLnZpLmxvKSw4KSl7ej10aGlzLnZpLmxvLmduUygpCiBpZih0eXBlb2YgeiE9PSJudW1iZXIiKXJldHVybiB6LkYoKQogaWYodHlwZW9mIGIhPT0ibnVtYmVyIilyZXR1cm4gSC5zKGIpCiB6PXo+PWJ9ZWxzZSB6PSExCkBAIC0xNTkwMCw3ICsxNjA0NSw3IEBACiB6PUoueChiKQogaWYoISF6LiRpc2ZwKXt6PXouZ1AoYikKIHRoaXMucnAudG9TdHJpbmcKLXJldHVybiBuZXcgVS54OShhLHopfWVsc2UgaWYoISF6LiRpc05iJiYhIUoueChiLmdUZigpKS4kaXNmcCl7ej1KLlZtKGIuZ1RmKCkpCityZXR1cm4gbmV3IFUuclgoYSx6KX1lbHNlIGlmKCEhei4kaXNOYiYmISFKLngoYi5nVGYoKSkuJGlzZnApe3o9Si5WbShiLmdUZigpKQogeT1iLmdyZSgpCiB0aGlzLnJwLnRvU3RyaW5nCiByZXR1cm4gbmV3IFUuTmIoYSx6LHkpfWVsc2UgdGhyb3cgSC5iKFkuUlYoImV4cGVjdGVkIGlkZW50aWZpZXI6ICIrSC5kKGIpKSl9LApAQCAtMTU5MTEsMTUgKzE2MDU2LDE1IEBACiB0aGlzLkJwKCkKIHg9dGhpcy5ZcSgpCiB3aGlsZSghMCl7dz10aGlzLnZpLmxvCi1pZih3IT1udWxsKWlmKEoueEMoSi5Jeih3KSw4KXx8Si54QyhKLkl6KHRoaXMudmkubG8pLDMpfHxKLnhDKEouSXoodGhpcy52aS5sbyksOSkpe3c9dGhpcy52aS5sby5nUDkoKQotdj16LmdQOSgpCitpZih3IT1udWxsKWlmKEoueEMoSi5Jeih3KSw4KXx8Si54QyhKLkl6KHRoaXMudmkubG8pLDMpfHxKLnhDKEouSXoodGhpcy52aS5sbyksOSkpe3c9dGhpcy52aS5sby5nblMoKQordj16LmduUygpCiBpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiB3LkQoKQogaWYodHlwZW9mIHYhPT0ibnVtYmVyIilyZXR1cm4gSC5zKHYpCiB2PXc+dgogdz12fWVsc2Ugdz0hMQogZWxzZSB3PSExCiBpZighdylicmVhawoteD10aGlzLm1pKHgsdGhpcy52aS5sby5nUDkoKSl9eT15LmdQKHopCit4PXRoaXMubWkoeCx0aGlzLnZpLmxvLmduUygpKX15PXkuZ1AoeikKIHRoaXMucnAudG9TdHJpbmcKIHJldHVybiBuZXcgVS51a3UoeSxhLHgpfSwKIFlxOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKQEAgLTE1OTM3LDEzICsxNjA4MiwxMyBAQAogej1uZXcgVS5ubyh4KQogei4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQogdGhpcy5CcCgpCi1yZXR1cm4gen1lbHNle3c9dGhpcy5taSh0aGlzLkxMKCksMTEpCityZXR1cm4gen1lbHNle3c9dGhpcy5taSh0aGlzLmZxKCksMTEpCiB5LnRvU3RyaW5nCiByZXR1cm4gbmV3IFUuY0ooeix3KX19fWVsc2UgaWYoeS5uKHosIiEiKSl7dGhpcy5CcCgpCi13PXRoaXMubWkodGhpcy5MTCgpLDExKQordz10aGlzLm1pKHRoaXMuZnEoKSwxMSkKIHRoaXMucnAudG9TdHJpbmcKLXJldHVybiBuZXcgVS5jSih6LHcpfWVsc2UgdGhyb3cgSC5iKFkuUlYoInVuZXhwZWN0ZWQgdG9rZW46ICIrSC5kKHopKSl9cmV0dXJuIHRoaXMuTEwoKX0sCi1MTDpmdW5jdGlvbigpe3ZhciB6LHkKK3JldHVybiBuZXcgVS5jSih6LHcpfWVsc2UgdGhyb3cgSC5iKFkuUlYoInVuZXhwZWN0ZWQgdG9rZW46ICIrSC5kKHopKSl9cmV0dXJuIHRoaXMuZnEoKX0sCitmcTpmdW5jdGlvbigpe3ZhciB6LHkKIHN3aXRjaChKLkl6KHRoaXMudmkubG8pKXtjYXNlIDEwOno9Si5WbSh0aGlzLnZpLmxvKQogaWYoSi54Qyh6LCJ0aGlzIikpe3RoaXMuQnAoKQogdGhpcy5ycC50b1N0cmluZwpAQCAtMTYwMzUsMTMgKzE2MTgwLDEzIEBACiByZXR1cm4geX0sCiB4SjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnUzKCIiKX19fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLnNyYy5nbG9iYWxzIiwicGFja2FnZTpwb2x5bWVyX2V4cHJlc3Npb25zL3NyYy9nbG9iYWxzLmRhcnQiLCxLLHsKICJeIjoiIiwKLUM3OltmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSy5CdChhKSxbbnVsbF0pfSwiJDEiLCJwZyIsMiwwLDY2LDY3XSwKK0RjOltmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSy5CdChhKSxbbnVsbF0pfSwiJDEiLCJVTSIsMiwwLDY2LDY3XSwKIEFlcDp7CiAiXiI6ImE7dkg+LFA+IiwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCiByZXR1cm4hIUoueChiKS4kaXNBZXAmJkoueEMoYi52SCx0aGlzLnZIKSYmSi54QyhiLlAsdGhpcy5QKX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEoudjEodGhpcy5QKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMudkgpKyIsICIrSC5kKHRoaXMuUCkrIikifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMudkgpKyIsICIrSC5kKHRoaXMuUCkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNBZXA6dHJ1ZX0sCiBCdDp7CiAiXiI6Im1XO1lSIiwKQEAgLTE2MDUzLDcgKzE2MTk4LDcgQEAKIGdyWjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuWVIKIHk9Si5VNih6KQotej1uZXcgSy5BZXAoSi5iSSh5LmdCKHopLDEpLHkuZ3JaKHopKQorej1uZXcgSy5BZXAoSi5Ibih5LmdCKHopLDEpLHkuZ3JaKHopKQogei4kYnVpbHRpblR5cGVJbmZvPXRoaXMuJGJ1aWx0aW5UeXBlSW5mbwogcmV0dXJuIHp9LAogJGFzbVc6ZnVuY3Rpb24oYSl7cmV0dXJuW1tLLkFlcCxhXV19LApAQCAtMTYwNzQsOCArMTYyMTksOCBAQAogY2FzZSAxMTg6cmV0dXJuIDExCiBkZWZhdWx0OnJldHVybiBhfX0sCiBxUzp7Ci0iXiI6ImE7Zlk+LFA+LFA5PCIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iKCIrdGhpcy5mWSsiLCAnIit0aGlzLlArIicpIn0sCisiXiI6ImE7Zlk+LFA+LG5TPCIsCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK3RoaXMuZlkrIiwgJyIrdGhpcy5QKyInKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc3FTOnRydWV9LAogeHY6ewogIl4iOiJhO01WLHp5LGpJLHgwIiwKQEAgLTE2MTAwLDEzICsxNjI0NSwxMyBAQAogdGhpcy54MD14CiBpZihDLk5tLnRnKEMuYmcseCkpe3g9dGhpcy54MAogdT1ILkxZKFt2LHhdKQotaWYoQy5ObS50ZyhDLkc4LHUpKXt4PXouRygpP3ouV246bnVsbAoraWYoQy5ObS50ZyhDLkZuLHUpKXt4PXouRygpP3ouV246bnVsbAogdGhpcy54MD14CiBpZih4PT09NjEpeD12PT09MzN8fHY9PT02MQogZWxzZSB4PSExCiBpZih4KXt0PXUrIj0iCi10aGlzLngwPXouRygpP3ouV246bnVsbH1lbHNlIHQ9dX1lbHNlIHQ9SC5KTSh2KX1lbHNlIHQ9SC5KTSh2KQoteS5wdXNoKG5ldyBZLnFTKDgsdCxDLmx4LnQoMCx0KSkpfWVsc2UgaWYoQy5ObS50ZyhDLmlxLHRoaXMueDApKXtzPUguSk0odGhpcy54MCkKK3RoaXMueDA9ei5HKCk/ei5XbjpudWxsfWVsc2UgdD11fWVsc2UgdD1ILm14KHYpfWVsc2UgdD1ILm14KHYpCit5LnB1c2gobmV3IFkucVMoOCx0LEMubHgudCgwLHQpKSl9ZWxzZSBpZihDLk5tLnRnKEMuaXEsdGhpcy54MCkpe3M9SC5teCh0aGlzLngwKQogeS5wdXNoKG5ldyBZLnFTKDkscyxDLmx4LnQoMCxzKSkpCiB0aGlzLngwPXouRygpP3ouV246bnVsbH1lbHNlIHRoaXMueDA9ei5HKCk/ei5XbjpudWxsfXJldHVybiB5fSwKIFdHOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKQEAgLTE2MTE4LDggKzE2MjYzLDggQEAKIGlmKHg9PT05Mil7eD15LkcoKT95LlduOm51bGwKIHRoaXMueDA9eAogaWYoeD09bnVsbCl0aHJvdyBILmIoWS5SVigidW50ZXJtaW5hdGVkIHN0cmluZyIpKQoteD1ILkpNKFkud1goeCkpCi13LnZNKz14fWVsc2V7eD1ILkpNKHgpCit4PUgubXgoWS53WCh4KSkKK3cudk0rPXh9ZWxzZXt4PUgubXgoeCkKIHcudk0rPXh9eD15LkcoKT95LlduOm51bGwKIHRoaXMueDA9eH10aGlzLk1WLnB1c2gobmV3IFkucVMoMSx3LnZNLDApKQogdy52TT0iIgpAQCAtMTYxMzMsNyArMTYyNzgsNyBAQAogZWxzZSB3PSEwCiBlbHNlIHc9ITB9ZWxzZSB3PSExCiBpZighdylicmVhawoteD1ILkpNKHgpCit4PUgubXgoeCkKIHkudk0rPXgKIHRoaXMueDA9ei5HKCk/ei5XbjpudWxsfXY9eS52TQogej10aGlzLk1WCkBAIC0xNjE0Nyw3ICsxNjI5Miw3IEBACiBpZih4IT1udWxsKXtpZih0eXBlb2YgeCE9PSJudW1iZXIiKXJldHVybiBILnMoeCkKIHc9NDg8PXgmJng8PTU3fWVsc2Ugdz0hMQogaWYoIXcpYnJlYWsKLXg9SC5KTSh4KQoreD1ILm14KHgpCiB5LnZNKz14CiB0aGlzLngwPXouRygpP3ouV246bnVsbH1pZih4PT09NDYpe3o9ei5HKCk/ei5XbjpudWxsCiB0aGlzLngwPXoKQEAgLTE2MTU3LDU4ICsxNjMwMiw1OCBAQAogeS52TT0iIn19LAogcXY6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdwogej10aGlzLnp5Ci16LktGKEguSk0oNDYpKQorei5LRihILm14KDQ2KSkKIHk9dGhpcy5qSQogd2hpbGUoITApe3g9dGhpcy54MAogaWYoeCE9bnVsbCl7aWYodHlwZW9mIHghPT0ibnVtYmVyIilyZXR1cm4gSC5zKHgpCiB3PTQ4PD14JiZ4PD01N31lbHNlIHc9ITEKIGlmKCF3KWJyZWFrCi14PUguSk0oeCkKK3g9SC5teCh4KQogei52TSs9eAogdGhpcy54MD15LkcoKT95LlduOm51bGx9dGhpcy5NVi5wdXNoKG5ldyBZLnFTKDcsei52TSwwKSkKIHoudk09IiJ9fSwKIGhBOnsKICJeIjoiYTtHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlBhcnNlRXhjZXB0aW9uOiAiK3RoaXMuRzF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJQYXJzZUV4Y2VwdGlvbjogIit0aGlzLkcxfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e1JWOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWS5oQShhKX19fX1dLFsicG9seW1lcl9leHByZXNzaW9ucy52aXNpdG9yIiwicGFja2FnZTpwb2x5bWVyX2V4cHJlc3Npb25zL3Zpc2l0b3IuZGFydCIsLFMsewogIl4iOiIiLAogUDU1OnsKICJeIjoiYTsiLAotRFY6W2Z1bmN0aW9uKGEpe3JldHVybiBKLk5WKGEsdGhpcyl9LCIkMSIsImdheSIsMiwwLDE5MSwxNTNdfSwKK0RWOltmdW5jdGlvbihhKXtyZXR1cm4gSi5va1YoYSx0aGlzKX0sIiQxIiwiZ2F5IiwyLDAsMTkzLDE1NV19LAogY2ZTOnsKICJeIjoiUDU1OyIsCiB4bjpmdW5jdGlvbihhKXt9LAogVzk6ZnVuY3Rpb24oYSl7dGhpcy54bihhKX0sCiBMVDpmdW5jdGlvbihhKXthLnd6LlJSKDAsdGhpcykKIHRoaXMueG4oYSl9LAotZlY6ZnVuY3Rpb24oYSl7Si5OVihhLmdUZigpLHRoaXMpCitmVjpmdW5jdGlvbihhKXtKLm9rVihhLmdUZigpLHRoaXMpCiB0aGlzLnhuKGEpfSwKLUNVOmZ1bmN0aW9uKGEpe0ouTlYoYS5nVGYoKSx0aGlzKQotSi5OVihhLmdKbigpLHRoaXMpCitDVTpmdW5jdGlvbihhKXtKLm9rVihhLmdUZigpLHRoaXMpCitKLm9rVihhLmdKbigpLHRoaXMpCiB0aGlzLnhuKGEpfSwKIFpSOmZ1bmN0aW9uKGEpe3ZhciB6Ci1KLk5WKGEuZ1RmKCksdGhpcykKLWlmKGEuZ3JlKCkhPW51bGwpZm9yKHo9YS5ncmUoKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5OVih6LmxvLHRoaXMpCitKLm9rVihhLmdUZigpLHRoaXMpCitpZihhLmdyZSgpIT1udWxsKWZvcih6PWEuZ3JlKCksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KUoub2tWKHoubG8sdGhpcykKIHRoaXMueG4oYSl9LAogb0Q6ZnVuY3Rpb24oYSl7dGhpcy54bihhKX0sCiBaaDpmdW5jdGlvbihhKXt2YXIgegotZm9yKHo9YS5naEwoKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5OVih6LmxvLHRoaXMpCitmb3Ioej1hLmdoTCgpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOylKLm9rVih6LmxvLHRoaXMpCiB0aGlzLnhuKGEpfSwKIG8wOmZ1bmN0aW9uKGEpe3ZhciB6Ci1mb3Ioej1hLmdSbChhKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5OVih6LmxvLHRoaXMpCitmb3Ioej1hLmdSbChhKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspSi5va1Yoei5sbyx0aGlzKQogdGhpcy54bihhKX0sCi1ZVjpmdW5jdGlvbihhKXtKLk5WKGEuZ0czKGEpLHRoaXMpCi1KLk5WKGEuZ3Y0KCksdGhpcykKK1lWOmZ1bmN0aW9uKGEpe0oub2tWKGEuZ0czKGEpLHRoaXMpCitKLm9rVihhLmd2NCgpLHRoaXMpCiB0aGlzLnhuKGEpfSwKIHFzOmZ1bmN0aW9uKGEpe3RoaXMueG4oYSl9LAotZXg6ZnVuY3Rpb24oYSl7Si5OVihhLmdCYihhKSx0aGlzKQotSi5OVihhLmdUOChhKSx0aGlzKQorZXg6ZnVuY3Rpb24oYSl7Si5va1YoYS5nQmIoYSksdGhpcykKK0oub2tWKGEuZ1Q4KGEpLHRoaXMpCiB0aGlzLnhuKGEpfSwKLXhOOmZ1bmN0aW9uKGEpe0ouTlYoYS5nd3ooKSx0aGlzKQoreE46ZnVuY3Rpb24oYSl7Si5va1YoYS5nd3ooKSx0aGlzKQogdGhpcy54bihhKX0sCi1SRDpmdW5jdGlvbihhKXtKLk5WKGEuZ2RjKCksdGhpcykKLUouTlYoYS5nU2woKSx0aGlzKQotSi5OVihhLmdydSgpLHRoaXMpCitSRDpmdW5jdGlvbihhKXtKLm9rVihhLmdkYygpLHRoaXMpCitKLm9rVihhLmdTbCgpLHRoaXMpCitKLm9rVihhLmdydSgpLHRoaXMpCiB0aGlzLnhuKGEpfSwKIGt6OmZ1bmN0aW9uKGEpe2EuQmIuUlIoMCx0aGlzKQogYS5UOC5SUigwLHRoaXMpCkBAIC0xNjIxOCw3MiArMTYzNjMsOTMgQEAKIHRoaXMueG4oYSl9fX1dLFsic2NyaXB0X2luc2V0X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zY3JpcHRfaW5zZXQuZGFydCIsLFQsewogIl4iOiIiLAogb3Y6ewotIl4iOiJWNDU7b1gsR1IsY0ksQmk9LHhvLFpKLEtmLE9xLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQ1O29YLHQ3LGZJLEZkLGNJLEhlLHhvLFpKLEtmLG51LE9xLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdJczpmdW5jdGlvbihhKXtyZXR1cm4gYS5vWH0sCiBzSXM6ZnVuY3Rpb24oYSxiKXthLm9YPXRoaXMuY3QoYSxDLlBYLGEub1gsYil9LAotZ0JWOmZ1bmN0aW9uKGEpe3JldHVybiBhLkdSfSwKLXNCVjpmdW5jdGlvbihhLGIpe2EuR1I9dGhpcy5jdChhLEMudFcsYS5HUixiKX0sCitnZmc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudDd9LAorc2ZnOmZ1bmN0aW9uKGEsYil7YS50Nz10aGlzLmN0KGEsQy5BNyxhLnQ3LGIpfSwKK2dHVjpmdW5jdGlvbihhKXtyZXR1cm4gYS5mSX0sCitzR1Y6ZnVuY3Rpb24oYSxiKXthLmZJPXRoaXMuY3QoYSxDLnZZLGEuZkksYil9LAorZ0xmOmZ1bmN0aW9uKGEpe3JldHVybiBhLkZkfSwKK3NMZjpmdW5jdGlvbihhLGIpe2EuRmQ9dGhpcy5jdChhLEMuSVQsYS5GZCxiKX0sCiBnTWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY0l9LAogc01sOmZ1bmN0aW9uKGEsYil7YS5jST10aGlzLmN0KGEsQy5HcixhLmNJLGIpfSwKK2dNTDpmdW5jdGlvbihhKXtyZXR1cm4gYS5IZX0sCitzTUw6ZnVuY3Rpb24oYSxiKXthLkhlPXRoaXMuY3QoYSxDLmtJLGEuSGUsYil9LAogZ3hUOmZ1bmN0aW9uKGEpe3JldHVybiBhLnhvfSwKIHN4VDpmdW5jdGlvbihhLGIpe2EueG89dGhpcy5jdChhLEMubnQsYS54byxiKX0sCiBnaVo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWkp9LAogc2laOmZ1bmN0aW9uKGEsYil7YS5aSj10aGlzLmN0KGEsQy52cyxhLlpKLGIpfSwKIGdHZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5LZn0sCiBzR2Q6ZnVuY3Rpb24oYSxiKXthLktmPXRoaXMuY3QoYSxDLlNBLGEuS2YsYil9LAotRXM6ZnVuY3Rpb24oYSl7Wi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpfSwKLVZqOltmdW5jdGlvbihhLGIpe3RoaXMubUMoYSl9LCIkMSIsImdjWSIsMiwwLDIwLDU3XSwKLWZYOltmdW5jdGlvbihhLGIpe3RoaXMubUMoYSl9LCIkMSIsImdJRiIsMiwwLDIwLDU3XSwKK05uOltmdW5jdGlvbihhLGIpe3JldHVybiJsaW5lLSIrSC5kKGIpfSwiJDEiLCJndVMiLDIsMCwxNSwxOTRdLAoraWI6W2Z1bmN0aW9uKGEsYixjKXt2YXIgeix5Cit6PShhLnNoYWRvd1Jvb3R8fGEud2Via2l0U2hhZG93Um9vdCkucXVlcnlTZWxlY3RvcigiI2xpbmUtIitILmQoYS5IZSkpCitpZih6IT1udWxsKXt5PSEhei5zY3JvbGxJbnRvVmlld0lmTmVlZGVkCitpZih5KXouc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZCgpCitlbHNlIHouc2Nyb2xsSW50b1ZpZXcoKX19LCIkMiIsImdGRyIsNCwwLDE5NSwxOTYsMTk3XSwKK0VzOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK1oudUwucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKQorej0oYS5zaGFkb3dSb290fHxhLndlYmtpdFNoYWRvd1Jvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5zb3VyY2VUYWJsZSIpCitpZih6IT1udWxsKXt5PVcuV3ModGhpcy5nRkcoYSkpCithLm51PXkKK0MuUzIuT1QoeSx6LCEwKX19LAorZFE6ZnVuY3Rpb24oYSl7dmFyIHo9YS5udQoraWYoeiE9bnVsbCl7ei5kaXNjb25uZWN0KCkKK2EubnU9bnVsbH1aLnVMLnByb3RvdHlwZS5kUS5jYWxsKHRoaXMsYSl9LAorR0E6W2Z1bmN0aW9uKGEsYil7dGhpcy5tQyhhKX0sIiQxIiwiZ29MIiwyLDAsMjAsNTddLAorWW86W2Z1bmN0aW9uKGEsYil7dGhpcy5tQyhhKX0sIiQxIiwiZ2llIiwyLDAsMjAsNTddLAogckE6W2Z1bmN0aW9uKGEsYil7dGhpcy5tQyhhKX0sIiQxIiwiZ1JxIiwyLDAsMjAsNTddLAotREo6W2Z1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4ibWluLXdpZHRoOjMycHg7IgotZWxzZSBpZihKLnhDKGIsMCkpcmV0dXJuIm1pbi13aWR0aDozMnB4OyBiYWNrZ3JvdW5kLWNvbG9yOnJlZCIKLXJldHVybiJtaW4td2lkdGg6MzJweDsgYmFja2dyb3VuZC1jb2xvcjpncmVlbiJ9LCIkMSIsImdmcSIsMiwwLDE1LDE5Ml0sCitvazpbZnVuY3Rpb24oYSxiKXt0aGlzLm1DKGEpfSwiJDEiLCJnY1kiLDIsMCwyMCw1N10sCiBtQzpmdW5jdGlvbihhKXt2YXIgeix5LHgKIGlmKGEuT3EhPW51bGwpcmV0dXJuCi1pZihKLmlTKGEub1gpIT09ITApe2EuT3E9Si5TSyhhLm9YKS5tbChuZXcgVC5FcyhhKSkKLXJldHVybn16PWEuR1IKLXo9eiE9bnVsbD9KLmJJKGEub1gucTYoeiksMSk6MAotej10aGlzLmN0KGEsQy5udCxhLnhvLHopCi1hLnhvPXoKLXk9YS5jSQotej15IT1udWxsP2Eub1gucTYoeSk6Si5ldyh6LDEpCit6PWEub1gKK2lmKHo9PW51bGwpcmV0dXJuCitpZihKLmlTKHopIT09ITApe2EuT3E9Si5TSyhhLm9YKS5tbChuZXcgVC5FcyhhKSkKK3JldHVybn16PWEuRmQKK3o9eiE9bnVsbD9hLm9YLnE2KHopOjEKK2EueG89dGhpcy5jdChhLEMubnQsYS54byx6KQorej1hLmZJCit6PXohPW51bGw/YS5vWC5xNih6KTpudWxsCithLkhlPXRoaXMuY3QoYSxDLmtJLGEuSGUseikKK3o9YS5jSQoreT1hLm9YCit6PXohPW51bGw/eS5xNih6KTpKLnE4KEouZGUoeSkpCiBhLlpKPXRoaXMuY3QoYSxDLnZzLGEuWkoseikKLXo9YS5CaQotei5WMSh6KQotZm9yKHg9YS54bzt5PUouV3goeCkseS5DKHgsYS5aSik7eD15LmcoeCwxKSl6LmgoMCx4KX0sCi1zdGF0aWM6eyJeIjoiTk0sTVJXLFZuUCIsVDVpOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3Ci16PVEuY2gobnVsbCxQLktOKQoteT1SLnRCKFtdKQoteD1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKLXc9UC5xVQotdz1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwsdyxudWxsKSxudWxsLG51bGwpLFt3LG51bGxdKQotYS5CaT16Ci1hLktmPXkKLWEuU2E9W10KK0ouWjgoYS5LZikKK2Zvcih4PUouSG4oYS54bywxKTt6PUouV3goeCksei5FKHgsSi5IbihhLlpKLDEpKTt4PXouZyh4LDEpKUouYmkoYS5LZixKLlVRKEouZGUoYS5vWCkseCkpfSwKK3N0YXRpYzp7VDVpOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAorej1SLnRCKFtdKQoreT1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKK3g9UC5xVQoreD1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseCxudWxsKSxudWxsLG51bGwpLFt4LG51bGxdKQorYS50Nz1udWxsCithLktmPXoKK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9eAotYS5aUT13Ci1DLkZhLlpMKGEpCi1DLkZhLlhJKGEpCithLm9HPSExCithLlpNPXkKK2EuWlE9eAorQy56YS5aTChhKQorQy56YS5YSShhKQogcmV0dXJuIGF9fX0sCiBWNDU6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBFczp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCiBpZihKLmlTKHoub1gpPT09ITApe3ouT3E9bnVsbAogSi5URyh6KX19LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbInNjcmlwdF9yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NjcmlwdF9yZWYuZGFydCIsLEEsewogIl4iOiIiLAoga246ewotIl4iOiJvRVk7akosQVAsZm4sdFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJvRVk7akosQVAsZm4sdFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0JWOmZ1bmN0aW9uKGEpe3JldHVybiBhLmpKfSwKIHNCVjpmdW5jdGlvbihhLGIpe2Euako9dGhpcy5jdChhLEMudFcsYS5qSixiKX0sCiBnSnA6ZnVuY3Rpb24oYSl7dmFyIHo9YS50WQogaWYoej09bnVsbClyZXR1cm4gUS54SS5wcm90b3R5cGUuZ0pwLmNhbGwodGhpcyxhKQotcmV0dXJuIHouZ2ROKCl9LAorcmV0dXJuIHouZ1RYKCl9LAogZlg6W2Z1bmN0aW9uKGEsYil7dGhpcy5yNihhLG51bGwpfSwiJDEiLCJnSUYiLDIsMCwyMCw1N10sCiByNjpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLnRZCiBpZih6IT1udWxsJiZKLmlTKHopPT09ITApe3RoaXMuY3QoYSxDLllTLDAsMSkKQEAgLTE2Mjk0LDIyICsxNjQ2MCwyMCBAQAogeT1hLnRZCiBpZih6PT09ITApcmV0dXJuIEguZChRLnhJLnByb3RvdHlwZS5nb2MuY2FsbCh0aGlzLGEpKSsiOiIrSC5kKHkucTYoYS5qSikpCiBlbHNlIEouU0soeSkubWwodGhpcy5ndm8oYSkpfXJldHVybiBRLnhJLnByb3RvdHlwZS5nb2MuY2FsbCh0aGlzLGEpfSwKLWdPMzpmdW5jdGlvbihhKXt2YXIgeix5Ci1pZihhLnRZPT1udWxsKXJldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpCi1pZihKLko1KGEuakosMCkpe3o9Si5pUyhhLnRZKQoteT1hLnRZCi1pZih6PT09ITApcmV0dXJuIFEueEkucHJvdG90eXBlLmdPMy5jYWxsKHRoaXMsYSkrIiNsaW5lPSIrSC5kKHkucTYoYS5qSikpCi1lbHNlIEouU0soeSkubWwodGhpcy5ndm8oYSkpfXJldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpfSwKLXN0YXRpYzp7SXI6ZnVuY3Rpb24oYSl7dmFyIHoseQorZ08zOmZ1bmN0aW9uKGEpe2lmKGEudFk9PW51bGwpcmV0dXJuIFEueEkucHJvdG90eXBlLmdPMy5jYWxsKHRoaXMsYSkKK2lmKEouSjUoYS5qSiwwKSlpZihKLmlTKGEudFkpPT09ITApcmV0dXJuIFEueEkucHJvdG90eXBlLmdPMy5jYWxsKHRoaXMsYSkrIiNwb3M9IitILmQoYS5qSikKK2Vsc2UgSi5TSyhhLnRZKS5tbCh0aGlzLmd2byhhKSkKK3JldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpfSwKK3N0YXRpYzp7VFE6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5qSj0tMQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5XYS5aTChhKQogQy5XYS5YSShhKQpAQCAtMTYzMTksNyArMTY0ODMsNyBAQAogJGlzZDM6dHJ1ZX19XSxbInNjcmlwdF92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zY3JpcHRfdmlldy5kYXJ0IiwsVSx7CiAiXiI6IiIsCiBmSTp7Ci0iXiI6IlY0NjtVeixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY0NjtVeixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuVXp9LAogc0lzOmZ1bmN0aW9uKGEsYil7YS5Vej10aGlzLmN0KGEsQy5QWCxhLlV6LGIpfSwKIEVzOmZ1bmN0aW9uKGEpe3ZhciB6CkBAIC0xNjMyNywxOSArMTY0OTEsMTkgQEAKIHo9YS5VegogaWYoej09bnVsbClyZXR1cm4KIEouU0soeil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlV6KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotajk6W2Z1bmN0aW9uKGEsYil7Si5lZyhhLlV6KS5ZTShiKX0sIiQxIiwiZ0RYIiwyLDAsMjAsOThdLAotc3RhdGljOntkSTpmdW5jdGlvbihhKXt2YXIgeix5CitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuVXopLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitqOTpbZnVuY3Rpb24oYSxiKXtKLmVnKGEuVXopLllNKGIpfSwiJDEiLCJnRFgiLDIsMCwyMCw5OV0sCitzdGF0aWM6e1VGOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuRkguWkwoYSkKLUMuRkguWEkoYSkKK0MuY0owLlpMKGEpCitDLmNKMC5YSShhKQogcmV0dXJuIGF9fX0sCiBWNDY6ewogIl4iOiJ1TCtQaTsiLApAQCAtMTYzNjgsNyArMTY1MzIsNyBAQAogdi4kYnVpbHRpblR5cGVJbmZvPVt6XQogdj1uZXcgUS53bihudWxsLG51bGwsdixudWxsLG51bGwpCiB2LiRidWlsdGluVHlwZUluZm89W3pdCi16PUQudk8KK3o9RC5LcAogdT1bXQogdS4kYnVpbHRpblR5cGVJbmZvPVt6XQogdT1uZXcgUS53bihudWxsLG51bGwsdSxudWxsLG51bGwpCkBAIC0xNjM5Nyw2ICsxNjU2MSw4IEBACiBicmVhawogY2FzZSJFcnJvciI6cz1uZXcgRC5wRChudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiBicmVhaworY2FzZSJGdW5jdGlvbiI6cz1uZXcgRC5LcChudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKK2JyZWFrCiBjYXNlIklzb2xhdGUiOno9Si5JMihhKQogeD1uZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCxudWxsKQogeC4kYnVpbHRpblR5cGVJbmZvPVtudWxsLG51bGxdCkBAIC0xNjQzOSwxMyArMTY2MDUsMTQgQEAKIHUuJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHU9bmV3IFEud24obnVsbCxudWxsLHUsbnVsbCxudWxsKQogdS4kYnVpbHRpblR5cGVJbmZvPVt6XQotej1ELnZPCit6PUQuS3AKIHQ9W10KIHQuJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHQ9bmV3IFEud24obnVsbCxudWxsLHQsbnVsbCxudWxsKQogdC4kYnVpbHRpblR5cGVJbmZvPVt6XQogcz1uZXcgRC5VNChudWxsLHgsdyx2LHUsdCxudWxsLG51bGwsYSxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogYnJlYWsKK2Nhc2UiTnVsbCI6cmV0dXJuCiBjYXNlIlNlcnZpY2VFcnJvciI6cz1uZXcgRC5ONyhudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIGJyZWFrCiBjYXNlIlNlcnZpY2VFdmVudCI6cz1uZXcgRC5NayhudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQpAQCAtMTY0NTcsNyArMTY2MjQsNyBAQAogeC4kYnVpbHRpblR5cGVJbmZvPVt6XQogeD1uZXcgUS53bihudWxsLG51bGwseCxudWxsLG51bGwpCiB4LiRidWlsdGluVHlwZUluZm89W3pdCi1zPW5ldyBELnZ4KHgsUC5MNShudWxsLG51bGwsbnVsbCxQLktOLFAuS04pLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKK3M9bmV3IEQudngoeCxQLkw1KG51bGwsbnVsbCxudWxsLFAuS04sUC5LTiksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLFAuRmwobnVsbCxudWxsKSxQLkZsKG51bGwsbnVsbCksbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIGJyZWFrCiBjYXNlIlNvY2tldCI6cz1uZXcgRC5XUChudWxsLG51bGwsbnVsbCxudWxsLCIiLCExLCExLCExLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogYnJlYWsKQEAgLTE2NDg0LDcgKzE2NjUxLDcgQEAKIGVsc2UgaWYoISF3LiRpc3duKUQuZjMoeCxiKQogZWxzZSBpZih2KUQuR2YoeCxiKX19LAogYWY6ewotIl4iOiJQaTtiTkAsdDdAIiwKKyJeIjoiUGk7Yk5ALEdSQCIsCiBnWFA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5QM30sCiBnd3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSTIodGhpcy5QMyl9LAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBKLmFUKHRoaXMuUDMpfSwKQEAgLTE2NDk2LDggKzE2NjYzLDggQEAKIGdNODpmdW5jdGlvbigpe3JldHVybiExfSwKIGdvYzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nYk4oKX0sCiBzb2M6ZnVuY3Rpb24oYSxiKXt0aGlzLnNiTih0aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmdiTigpLGIpKX0sCi1nZE46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ndDcoKX0sCi1zZE46ZnVuY3Rpb24oYSl7dGhpcy5zdDcodGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5ndDcoKSxhKSl9LAorZ1RYOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ0dSKCl9LAorc1RYOmZ1bmN0aW9uKGEpe3RoaXMuc0dSKHRoaXMuY3QodGhpcyxDLlRjLHRoaXMuZ0dSKCksYSkpfSwKIHhXOmZ1bmN0aW9uKGEpe2lmKHRoaXMua1QpcmV0dXJuIFAuQWIodGhpcyxudWxsKQogcmV0dXJuIHRoaXMuUkUoMCl9LAogUkU6ZnVuY3Rpb24oYSl7dmFyIHoKQEAgLTE2NTE2LDEwICsxNjY4MywxMCBAQAogaWYodyE9bnVsbCYmIUoueEModyx6LnQoYSwiaWQiKSkpO3RoaXMucjA9ei50KGEsImlkIikKIHRoaXMubVE9eAogdGhpcy5iRigwLGEseSl9LAotTXE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdQaih0aGlzKSsiLyIrSC5kKGEpfSwiJDEiLCJnTGMiLDIsMCwxNjIsMTkzXSwKK01xOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nUGoodGhpcykrIi8iK0guZChhKX0sIiQxIiwiZ0xjIiwyLDAsMTY0LDE5OF0sCiAkaXNhZjp0cnVlfSwKIEJmOnsKLSJeIjoiVHA6MTk1O2EiLAorIl4iOiJUcFo6MjAwO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9Si5VUShhLCJ0eXBlIikKIHk9Si5yWSh6KQpAQCAtMTY1MjcsMjUgKzE2Njk0LDI1IEBACiB5PXRoaXMuYQogaWYoIUoueEMoeix5Lm1RKSlyZXR1cm4gRC5ObCh5LlAzLGEpCiB5LmVDKGEpCi1yZXR1cm4geX0sIiQxIixudWxsLDIsMCxudWxsLDE5NCwiY2FsbCJdLAorcmV0dXJuIHl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTksImNhbGwiXSwKICRpc0VIOnRydWV9LAogbjE6ewotIl4iOiJUcDo3MTtiIiwKKyJeIjoiVHBaOjcyO2IiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5iLlZSPW51bGx9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBib2g6ewogIl4iOiJhOyIsCiBPNTpmdW5jdGlvbihhKXtKLk1lKGEsbmV3IEQuUDUoKSl9LAotTXM6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmd3dih0aGlzKS5qVSh0aGlzLk1xKCJjb3ZlcmFnZSIpKS5tbChuZXcgRC5Sdih0aGlzKSl9LCIkMCIsImdEWCIsMCwwLDE5Nl19LAorTXM6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmd3dih0aGlzKS5qVSh0aGlzLk1xKCJjb3ZlcmFnZSIpKS5tbChuZXcgRC5Sdih0aGlzKSl9LCIkMCIsImdEWCIsMCwwLDIwMV19LAogUDU6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOltmdW5jdGlvbihhKXt2YXIgej1KLlU2KGEpCi16LnQoYSwic2NyaXB0IikuU0Moei50KGEsImhpdHMiKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTcsImNhbGwiXSwKK3oudChhLCJzY3JpcHQiKS5TQyh6LnQoYSwiaGl0cyIpKX0sIiQxIixudWxsLDIsMCxudWxsLDIwMiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBSdjp7Ci0iXiI6IlRwOjE5NTthIiwKKyJeIjoiVHBaOjIwMDthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXouTzUoRC5ObChKLnhDKHouZ3pTKCksIklzb2xhdGUiKT96OnouZ1hQKCksYSkudCgwLCJjb3ZlcmFnZSIpKX0sIiQxIixudWxsLDIsMCxudWxsLDE5NCwiY2FsbCJdLAorei5PNShELk5sKEoueEMoei5nelMoKSwiSXNvbGF0ZSIpP3o6ei5nWFAoKSxhKS50KDAsImNvdmVyYWdlIikpfSwiJDEiLG51bGwsMiwwLG51bGwsMTk5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHhtOnsKICJeIjoiYWY7In0sCkBAIC0xNjU1Niw3ICsxNjcyMyw3IEBACiBnaVI6ZnVuY3Rpb24oKXt2YXIgej10aGlzLno3CiByZXR1cm4gei5nVVEoeil9LAogZ1BqOmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5yMCl9LAotTXE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSl9LCIkMSIsImdMYyIsMiwwLDE2MiwxOTNdLAorTXE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSl9LCIkMSIsImdMYyIsMiwwLDE2NCwxOThdLAogZ1llOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk94fSwKIGdKazpmdW5jdGlvbigpe3JldHVybiB0aGlzLlJXfSwKIGdBMzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlRzfSwKQEAgLTE2NTgzLDcgKzE2NzUwLDcgQEAKIGlmKHR5cGVvZiB5IT09Im51bWJlciIpcmV0dXJuIEgucyh5KQogcmV0dXJuIEMueEIueW4oeCx3K3kpfSwKIGp6OmZ1bmN0aW9uKGEpe3ZhciB6LHkseAotej0kLmpOKCkuUjQoMCxhKQorej0kLmZBKCkuUjQoMCxhKQogaWYoej09bnVsbClyZXR1cm4iIgogeT16LlFLCiB4PXkuaW5kZXgKQEAgLTE2NjAzLDcgKzE2NzcwLDcgQEAKIHJldHVybiB0aGlzLkI3KHopLm1sKG5ldyBELml0KHRoaXMseSkpfXg9dGhpcy5ReS50KDAsYSkKIGlmKHghPW51bGwpcmV0dXJuIEouY0koeCkKIHJldHVybiB0aGlzLmpVKGEpLm1sKG5ldyBELmxiKHRoaXMsYSkpfSwKLVltOltmdW5jdGlvbihhLGIpe3JldHVybiBifSwiJDIiLCJnY08iLDQsMCw3OV0sCitZbTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0sIiQyIiwiZ2NPIiw0LDAsODBdLAogbmc6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PW51bGwKIHRyeXt5PW5ldyBQLmM1KHRoaXMuZ2NPKCkpCkBAIC0xNjY0Nyw3ICsxNjgxNCw3IEBACiBOLlFNKCIiKS5UbygiTmV3IGlzb2xhdGUgJyIrSC5kKHUucjApKyInIil9fXkuYU4oMCxuZXcgRC5ZdSgpKQogdGhpcy56Nz15fSwKIEx3OmZ1bmN0aW9uKCl7dGhpcy5iTj10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLCJ2bSIpCi10aGlzLnQ3PXRoaXMuY3QodGhpcyxDLlRjLHRoaXMudDcsInZtIikKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUiwidm0iKQogdGhpcy5ReS51KDAsInZtIix0aGlzKQogdmFyIHo9UC5FRihbImlkIiwidm0iLCJ0eXBlIiwiQFZNIl0sbnVsbCxudWxsKQogdGhpcy5lQyhSLnRCKHopKX0sCkBAIC0xNjY1NiwyMCArMTY4MjMsMjAgQEAKICJeIjoieG0rUGk7IiwKICRpc2QzOnRydWV9LAogank6ewotIl4iOiJUcDoxMzthLGIiLAorIl4iOiJUcFo6MTM7YSxiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PUQuTmwoYSx0aGlzLmEuYSkKIHk9dGhpcy5iLlJrCiBpZih5Lkd2Pj00KUgudmgoeS5xNygpKQoteS5Jdih6KX0sIiQxIixudWxsLDIsMCxudWxsLDE5OCwiY2FsbCJdLAoreS5Jdih6KX0sIiQxIixudWxsLDIsMCxudWxsLDIwMywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBNWjp7Ci0iXiI6IlRwOjEzO2EsYiIsCisiXiI6IlRwWjoxMzthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe2lmKCFKLngoYSkuJGlzd3YpcmV0dXJuCi1yZXR1cm4gdGhpcy5hLno3LnQoMCx0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCityZXR1cm4gdGhpcy5hLno3LnQoMCx0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGl0OnsKLSJeIjoiVHA6MTM7YSxiIiwKKyJeIjoiVHBaOjEzO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoKIGlmKGE9PW51bGwpcmV0dXJuIHRoaXMuYQogej10aGlzLmIKQEAgLTE2Njc3LDY1ICsxNjg0NCw2NSBAQAogZWxzZSByZXR1cm4gYS5jdih6KX0sIiQxIixudWxsLDIsMCxudWxsLDcsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbGI6ewotIl4iOiJUcDoxOTU7YyxkIiwKKyJeIjoiVHBaOjIwMDtjLGQiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5jCiB5PUQuTmwoeixhKQogaWYoeS5nVW0oKSl6LlF5LnRvKDAsdGhpcy5kLG5ldyBELlFaKHkpKQotcmV0dXJuIHl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTQsImNhbGwiXSwKK3JldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTk5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFFaOnsKLSJeIjoiVHA6NzE7ZSIsCisiXiI6IlRwWjo3MjtlIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZX0sCiAkaXNFSDp0cnVlfSwKIHpBOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXJldHVybiB6Lk43KHoubmcoYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQzLCJjYWxsIl0sCityZXR1cm4gei5ONyh6Lm5nKGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDE0NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB0bTp7Ci0iXiI6IlRwOjEzO2IiLAorIl4iOiJUcFo6MTM7YiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5iLkcyCiBpZih6Lkd2Pj00KUgudmgoei5xNygpKQogei5JdihhKQogcmV0dXJuIFAuVnUoYSxudWxsLG51bGwpfSwiJDEiLG51bGwsMiwwLG51bGwsMjQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbVI6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNON30sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogYnA6ewotIl4iOiJUcDoxMztjIiwKKyJeIjoiVHBaOjEzO2MiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYy5MaQogaWYoei5Hdj49NClILnZoKHoucTcoKSkKIHouSXYoYSkKLXJldHVybiBQLlZ1KGEsbnVsbCxudWxsKX0sIiQxIixudWxsLDIsMCxudWxsLDg2LCJjYWxsIl0sCityZXR1cm4gUC5WdShhLG51bGwsbnVsbCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4NywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBoYzp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc0VQfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBZdTp7Ci0iXiI6IlRwOjc5OyIsCisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXtKLmNJKGIpfSwKICRpc0VIOnRydWV9LAogRVI6ewotIl4iOiJhO1NQLFhFPix3WiIsCisiXiI6ImE7U1AsWEU+LE9RIiwKIGVLOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5YRQotSC5RYih6LDAsYSkKLWZvcih5PXoubGVuZ3RoLHg9MDt4PHk7Kyt4KXt3PXRoaXMud1oKK0gubmEoeiwwLGEpCitmb3IoeT16Lmxlbmd0aCx4PTA7eDx5OysreCl7dz10aGlzLk9RCiB2PXpbeF0KIGlmKHR5cGVvZiB2IT09Im51bWJlciIpcmV0dXJuIEgucyh2KQotdGhpcy53Wj13K3Z9fSwKK3RoaXMuT1E9dyt2fX0sCiB5ODpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0CiBmb3Ioej10aGlzLlhFLHk9ei5sZW5ndGgseD1KLlU2KGEpLHc9Yi5sZW5ndGgsdj0wO3Y8eTsrK3Ype3U9eC50KGEsdikKIGlmKHY+PXcpcmV0dXJuIEguZShiLHYpCi11PUouYkkodSxiW3ZdKQordT1KLkhuKHUsYlt2XSkKIHpbdl09dQotdD10aGlzLndaCit0PXRoaXMuT1EKIGlmKHR5cGVvZiB1IT09Im51bWJlciIpcmV0dXJuIEgucyh1KQotdGhpcy53Wj10K3V9fSwKK3RoaXMuT1E9dCt1fX0sCiBrNTpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdQogej1KLlU2KGIpCiB5PXRoaXMuWEUKQEAgLTE2ODAxLDExICsxNjk2OCwxMSBAQAogeT16LnQoYSwiY29sbGVjdGlvbnMiKQogdGhpcy55cD1GLldpKHRoaXMsQy5XRyx0aGlzLnlwLHkpCiB5PXoudChhLCJ0aW1lIikKLXRoaXMuT2c9Ri5XaSh0aGlzLEMuSmwsdGhpcy5PZyx5KQordGhpcy5PZz1GLldpKHRoaXMsQy5oNSx0aGlzLk9nLHkpCiB6PXoudChhLCJhdmdDb2xsZWN0aW9uUGVyaW9kTWlsbGlzIikKIHRoaXMuaHU9Ri5XaSh0aGlzLEMuQkUsdGhpcy5odSx6KX19LAogYnY6ewotIl4iOiJidmM7VjMsSnIsRVksZVUseVAsWFYsUXksR0gsV20sQUksdjksdFcsemIsYk46S1RALHQ3OmY1QCxpOSxjTCxZOCxVWTwseFE8LHZKLHl2LEJDPCxGRixiaixBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6ImJ2YztWMyxKcixFWSxlVSx5UCxYVixReSxHSCxXbSxBSSx2OSx0Vyx6YixiTjpLVEAsR1I6ZjVALGk5LGNMLFk4LFVZPCx4UTwsdkoseXYsQkM8LEZGLGJqLEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGd3djpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QM30sCiBnb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXN9LAogZ1hFOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlYzfSwKQEAgLTE2ODE1LDcgKzE2OTgyLDcgQEAKIGdBNjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVZfSwKIGdhajpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVVfSwKIGdNTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnlQfSwKLU1xOltmdW5jdGlvbihhKXtyZXR1cm4iLyIrSC5kKHRoaXMucjApKyIvIitILmQoYSl9LCIkMSIsImdMYyIsMiwwLDE2MiwxOTNdLAorTXE6W2Z1bmN0aW9uKGEpe3JldHVybiIvIitILmQodGhpcy5yMCkrIi8iK0guZChhKX0sIiQxIiwiZ0xjIiwyLDAsMTY0LDE5OF0sCiBOMzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej1ILlZNKFtdLFtELmt4XSkKIHk9Si5VNihhKQpAQCAtMTY4MzcsMTcgKzE3MDA0LDE3IEBACiB6PVtdCiBmb3IoeT1KLm1ZKEouVVEoYSwibWVtYmVycyIpKTt5LkcoKTspe3g9eS5nbCgpCiB3PUoueCh4KQotaWYoISF3LiRpc2R5KXoucHVzaCh3LnhXKHgpKX1yZXR1cm4gUC5OZSh6LCExKX0sIiQxIiwiZ2VMIiwyLDAsMTk5LDIwMF0sCitpZighIXcuJGlzZHkpei5wdXNoKHcueFcoeCkpfXJldHVybiBQLk5lKHosITEpfSwiJDEiLCJnZUwiLDIsMCwyMDQsMjA1XSwKIE56ZTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9dGhpcy5BSQogei5WMSh6KQogdGhpcy5XbT1GLldpKHRoaXMsQy5qbyx0aGlzLldtLG51bGwpCiBmb3IoeT1KLm1ZKGEpO3kuRygpOyl7eD15LmdsKCkKIGlmKHguZ3VqKCk9PW51bGwpei5oKDAseCkKLWlmKEoueEMoeC5nZE4oKSwiT2JqZWN0IikmJkoueEMoeC5naTIoKSwhMSkpe3c9dGhpcy5XbQoraWYoSi54Qyh4LmdUWCgpLCJPYmplY3QiKSYmSi54Qyh4LmdpMigpLCExKSl7dz10aGlzLldtCiBpZih0aGlzLmdueih0aGlzKSYmIUoueEModyx4KSl7dz1uZXcgVC5xSSh0aGlzLEMuam8sdyx4KQogdy4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQotdGhpcy5ucSh0aGlzLHcpfXRoaXMuV209eH19cmV0dXJuIFAuQWIodGhpcy5XbSxudWxsKX0sIiQxIiwiZ01oIiwyLDAsMjAxLDIwMl0sCit0aGlzLm5xKHRoaXMsdyl9dGhpcy5XbT14fX1yZXR1cm4gUC5BYih0aGlzLldtLG51bGwpfSwiJDEiLCJnTWgiLDIsMCwyMDYsMjA3XSwKIFFuOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogaWYoYT09bnVsbClyZXR1cm4KIHo9Si5VUShhLCJpZCIpCkBAIC0xNjg1NSw3ICsxNzAyMiw3IEBACiB4PXkudCgwLHopCiBpZih4IT1udWxsKXJldHVybiB4CiB4PUQuTmwodGhpcyxhKQotaWYoeC5nVW0oKSl5LnUoMCx6LHgpCitpZih4IT1udWxsJiZ4LmdVbSgpKXkudSgwLHoseCkKIHJldHVybiB4fSwKIGN2OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuUXkudCgwLGEpCiBpZih6IT1udWxsKXJldHVybiBKLmNJKHopCkBAIC0xNjg2Nyw4ICsxNzAzNCw4IEBACiBna3c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56Yn0sCiBnb2M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS1R9LAogc29jOmZ1bmN0aW9uKGEsYil7dGhpcy5LVD1GLldpKHRoaXMsQy5ZUyx0aGlzLktULGIpfSwKLWdkTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmY1fSwKLXNkTjpmdW5jdGlvbihhKXt0aGlzLmY1PUYuV2kodGhpcyxDLlRjLHRoaXMuZjUsYSl9LAorZ1RYOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZjV9LAorc1RYOmZ1bmN0aW9uKGEpe3RoaXMuZjU9Ri5XaSh0aGlzLEMuVGMsdGhpcy5mNSxhKX0sCiBnZUg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pOX0sCiBndzI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jTH0sCiBzdzI6ZnVuY3Rpb24oYSl7dGhpcy5jTD1GLldpKHRoaXMsQy50UCx0aGlzLmNMLGEpfSwKQEAgLTE2OTkyLDkgKzE3MTU5LDkgQEAKICJeIjoiUEtYK1BpOyIsCiAkaXNkMzp0cnVlfSwKIGl6OnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtpZighIUoueChhKS4kaXNreCl7YS54TT1GLldpKGEsQy5LaixhLnhNLDApCi1hLlBsPTAKK2EuRHU9MAogYS5mRj0wCiBhLm1NPUYuV2koYSxDLmVGLGEubU0sIiIpCiBhLnFIPUYuV2koYSxDLnVVLGEucUgsIiIpCkBAIC0xNzAwMywzNiArMTcxNzAsMzYgQEAKIGEuT28uVjEoMCl9fSwKICRpc0VIOnRydWV9LAogS1E6ewotIl4iOiJUcDoxOTU7YSxiIiwKKyJeIjoiVHBaOjIwMDthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5hCiB5PUQuTmwoeixhKQogaWYoeS5nVW0oKSl6LlF5LnRvKDAsdGhpcy5iLG5ldyBELkVhKHkpKQotcmV0dXJuIHl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTQsImNhbGwiXSwKK3JldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTk5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEVhOnsKLSJeIjoiVHA6NzE7YyIsCisiXiI6IlRwWjo3MjtjIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY30sCiAkaXNFSDp0cnVlfSwKIFFxOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej1KLlU2KGEpCi10aGlzLmEudSgwLHoudChhLCJuYW1lIiksei50KGEsInRpbWUiKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMDMsImNhbGwiXSwKK3RoaXMuYS51KDAsei50KGEsIm5hbWUiKSx6LnQoYSwidGltZSIpKX0sIiQxIixudWxsLDIsMCxudWxsLDIwOCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBBUDp7Ci0iXiI6IlRwOjE5NTthIiwKKyJeIjoiVHBaOjIwMDthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PURhdGUubm93KCkKIG5ldyBQLmlQKHosITEpLkVLKCkKIHk9dGhpcy5hLkdICiB5LnhaKHovMTAwMCxhKQotcmV0dXJuIHl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTYsImNhbGwiXSwKK3JldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTU4LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHZPOnsKLSJeIjoiYWY7UkYsUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJhZjtSRixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnVW06ZnVuY3Rpb24oKXtyZXR1cm4oSi54Qyh0aGlzLm1RLCJDbGFzcyIpfHxKLnhDKHRoaXMubVEsIkZ1bmN0aW9uIil8fEoueEModGhpcy5tUSwiRmllbGQiKSkmJiFKLmNvKHRoaXMucjAsJC5SUSl9LAogZ004OmZ1bmN0aW9uKCl7cmV0dXJuITF9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcy5SRil9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMuUkYpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBiRjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4CiB0aGlzLmtUPSFjCiB6PXRoaXMuUkYKQEAgLTE3MDQyLDEwICsxNzIwOSwxMSBAQAogeD15LnQoMCwidXNlcl9uYW1lIikKIHRoaXMuYk49dGhpcy5jdCgwLEMuWVMsdGhpcy5iTix4KQogeT15LnQoMCwibmFtZSIpCi10aGlzLnQ3PXRoaXMuY3QoMCxDLlRjLHRoaXMudDcseSkKK3RoaXMuR1I9dGhpcy5jdCgwLEMuVGMsdGhpcy5HUix5KQogRC5rVCh6LHRoaXMuUDMpfSwKIEZWOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUkYuRlYoMCxiKX0sCiBWMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5SRi5WMSgwKX0sCit4NDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlJGLlpwLng0KDAsYil9LAogYU46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5SRi5acC5hTigwLGIpfSwKIFJ6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUkYuUnooMCxiKX0sCiB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUkYuWnAudCgwLGIpfSwKQEAgLTE3MDYyLDcgKzE3MjMwLDcgQEAKIGdCOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuUkYuWnAKIHJldHVybiB6LmdCKHopfSwKIEhDOltmdW5jdGlvbihhKXt2YXIgej10aGlzLlJGCi1yZXR1cm4gei5IQyh6KX0sIiQwIiwiZ0R4IiwwLDAsMTIwXSwKK3JldHVybiB6LkhDKHopfSwiJDAiLCJnRHgiLDAsMCwxMjFdLAogbnE6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLlJGCiByZXR1cm4gei5ucSh6LGIpfSwKIGN0OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBGLldpKHRoaXMuUkYsYixjLGQpfSwKQEAgLTE3MDg0LDkgKzE3MjUyLDggQEAKICRpc2QzOnRydWUsCiBzdGF0aWM6eyJeIjoiUlEifX0sCiBwRDp7Ci0iXiI6IkQzO0kwLExELGpvLE5lLEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoid1ZxO0kwLExELGpvLE5lLEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdmWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JMH0sCi1zZlk6ZnVuY3Rpb24oYSxiKXt0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAsYil9LAogZ0cxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxEfSwKIGdqYTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qb30sCiBzamE6ZnVuY3Rpb24oYSxiKXt0aGlzLmpvPUYuV2kodGhpcyxDLm5lLHRoaXMuam8sYil9LApAQCAtMTcxMDQsMTQgKzE3MjcxLDEzIEBACiB6PSJEYXJ0RXJyb3IgIitILmQodGhpcy5JMCkKIHo9dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTix6KQogdGhpcy5iTj16Ci10aGlzLnQ3PXRoaXMuY3QodGhpcyxDLlRjLHRoaXMudDcseil9fSwKLUQzOnsKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix6KX19LAord1ZxOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogTjc6ewotIl4iOiJ3VnE7STAsTEQsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJkWkw7STAsTEQsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ2ZZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkkwfSwKLXNmWTpmdW5jdGlvbihhLGIpe3RoaXMuSTA9Ri5XaSh0aGlzLEMuTGMsdGhpcy5JMCxiKX0sCiBnRzE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTER9LAogYkY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIHRoaXMua1Q9ITAKQEAgLTE3MTIzLDE3ICsxNzI4OSwxNiBAQAogej0iU2VydmljZUVycm9yICIrSC5kKHRoaXMuSTApCiB6PXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seikKIHRoaXMuYk49egotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHopfSwKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix6KX0sCiAkaXNONzp0cnVlfSwKLXdWcTp7CitkWkw6ewogIl4iOiJhZitQaTsiLAogJGlzZDM6dHJ1ZX0sCiBFUDp7Ci0iXiI6ImRaTDtJMCxMRCxJVixBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6Inc4RjtJMCxMRCxJVixBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnZlk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSTB9LAotc2ZZOmZ1bmN0aW9uKGEsYil7dGhpcy5JMD1GLldpKHRoaXMsQy5MYyx0aGlzLkkwLGIpfSwKIGdHMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5MRH0sCi1nbjk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSVZ9LAorZ2JBOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLklWfSwKIGJGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5CiB6PUouVTYoYikKIHk9ei50KGIsImtpbmQiKQpAQCAtMTcxNDUsMTMgKzE3MzEwLDEzIEBACiB6PSJTZXJ2aWNlRXhjZXB0aW9uICIrSC5kKHRoaXMuSTApCiB6PXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seikKIHRoaXMuYk49egotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHopfSwKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix6KX0sCiAkaXNFUDp0cnVlfSwKLWRaTDp7Cit3OEY6ewogIl4iOiJhZitQaTsiLAogJGlzZDM6dHJ1ZX0sCiBNazp7Ci0iXiI6Inc4RjtlcSxIUSxqbyxBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6IlY0YjtlcSxIUSxqbyxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnZkc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZXF9LAogZ1ExOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSFF9LAogZ2phOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmpvfSwKQEAgLTE3MTY2LDE2ICsxNzMzMSwxNiBAQAogeT0iU2VydmljZUV2ZW50ICIrSC5kKHkpCiB5PXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seSkKIHRoaXMuYk49eQotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHkpCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1IseSkKIGlmKHoudChiLCJicmVha3BvaW50IikhPW51bGwpe3k9ei50KGIsImJyZWFrcG9pbnQiKQogdGhpcy5IUT1GLldpKHRoaXMsQy5oUix0aGlzLkhRLHkpfWlmKHoudChiLCJleGNlcHRpb24iKSE9bnVsbCl7ej16LnQoYiwiZXhjZXB0aW9uIikKIHRoaXMuam89Ri5XaSh0aGlzLEMubmUsdGhpcy5qbyx6KX19LAogJGlzTWs6dHJ1ZX0sCi13OEY6eworVjRiOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogVTQ6ewotIl4iOiJyRzk7ZGosQm08LFhSPCxERD4sWjM8LG11PCxBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6InJHOTtkaixCbTwsWFI8LEREPixaMzwsbXU8LEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdPMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kan0sCiBnVW06ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiBnTTg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCkBAIC0xNzE5Myw3ICsxNzM1OCw3IEBACiB0aGlzLmJOPXkKIGlmKEouRk4oeSk9PT0hMCl0aGlzLmJOPXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seCkKIHk9ei50KGIsIm5hbWUiKQotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHkpCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1IseSkKIGlmKGMpcmV0dXJuCiB0aGlzLmtUPSEwCiBELmtUKGIsSi5hVCh0aGlzLlAzKSkKQEAgLTE3MjQ0LDkgKzE3NDA5LDkgQEAKIHgud2Y9Ri5XaSh4LEMueUIseC53Zix6KQogeT1KLmV3KHkudChhLDMpLHkudChhLDUpKQogeC5yVD1GLldpKHgsQy5oTix4LnJULHkpfSwKLXN0YXRpYzp7Il4iOiJqWngseHh4LHFXRixvUSxTMU8sd1h1LFdWaSxXaHUifX0sCitzdGF0aWM6eyJeIjoialp4LHh4eCxZbixTUDcsUzEsd1h1LFdWaSxKUSJ9fSwKIGR5OnsKLSJeIjoiY09yO0d6LGFyLHg4LExoLHZZLHUwLEoxLEU4LHFHLFRYLHl2LFVZPCx4UTwsa3M+LFM1PCx0SjwsbXU8LHAyPCxBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6ImNPcjtHeixhcix4OCxMaCx2WSx1MCxKMSxFOCxxRyxkTix5dixVWTwseFE8LGtzPixTNTwsdEo8LG11PCxwMjwsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ0h0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkd6fSwKIHNIdDpmdW5jdGlvbihhLGIpe3RoaXMuR3o9Ri5XaSh0aGlzLEMuRVYsdGhpcy5HeixiKX0sCiBnSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJ9LApAQCAtMTcyNTQsMTEgKzE3NDE5LDEyIEBACiBndWo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54OH0sCiBzdWo6ZnVuY3Rpb24oYSl7dGhpcy54OD1GLldpKHRoaXMsQy5Ddyx0aGlzLng4LGEpfSwKIGdWTTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkxofSwKK2dSczpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZZfSwKIGdpMjpmdW5jdGlvbigpe3JldHVybiB0aGlzLkoxfSwKIGdWRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFHfSwKIHNWRjpmdW5jdGlvbihhKXt0aGlzLnFHPUYuV2kodGhpcyxDLno2LHRoaXMucUcsYSl9LAotZ2VqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVFh9LAotc2VqOmZ1bmN0aW9uKGEpe3RoaXMuVFg9Ri5XaSh0aGlzLEMuRmUsdGhpcy5UWCxhKX0sCitnZWo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kTn0sCitzZWo6ZnVuY3Rpb24oYSl7dGhpcy5kTj1GLldpKHRoaXMsQy5GZSx0aGlzLmROLGEpfSwKIGdrYzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy55dn0sCiBza2M6ZnVuY3Rpb24oYSxiKXt0aGlzLnl2PUYuV2kodGhpcyxDLnloLHRoaXMueXYsYil9LAogZ0pMOmZ1bmN0aW9uKCl7dmFyIHoseQpAQCAtMTcyNzMsMTMgKzE3NDM5LDEzIEBACiByZXR1cm4gen0sCiBnVW06ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiBnTTg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iU2VydmljZSBDbGFzczogIitILmQodGhpcy50Nyl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJTZXJ2aWNlIENsYXNzOiAiK0guZCh0aGlzLkdSKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogYkY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogej1KLlU2KGIpCiB5PXoudChiLCJ1c2VyX25hbWUiKQogdGhpcy5iTj10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHkpCiB5PXoudChiLCJuYW1lIikKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx5KQordGhpcy5HUj10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLkdSLHkpCiBpZihjKXJldHVybgogdGhpcy5rVD0hMAogRC5rVChiLEouYVQodGhpcy5QMykpCkBAIC0xNzI5MCw3ICsxNzQ1Niw3IEBACiB5PXoudChiLCJhYnN0cmFjdCIpCiB0aGlzLkxoPUYuV2kodGhpcyxDLlhILHRoaXMuTGgseSkKIHk9ei50KGIsImNvbnN0IikKLXRoaXMudlk9Ri5XaSh0aGlzLEMuRDYsdGhpcy52WSx5KQordGhpcy52WT1GLldpKHRoaXMsQy5Ocix0aGlzLnZZLHkpCiB5PXoudChiLCJmaW5hbGl6ZWQiKQogdGhpcy51MD1GLldpKHRoaXMsQy5XVix0aGlzLnUwLHkpCiB5PXoudChiLCJwYXRjaCIpCkBAIC0xNzMwMCw3ICsxNzQ2Niw3IEBACiB5PXoudChiLCJ0b2tlblBvcyIpCiB0aGlzLnFHPUYuV2kodGhpcyxDLno2LHRoaXMucUcseSkKIHk9ei50KGIsImVuZFRva2VuUG9zIikKLXRoaXMuVFg9Ri5XaSh0aGlzLEMuRmUsdGhpcy5UWCx5KQordGhpcy5kTj1GLldpKHRoaXMsQy5GZSx0aGlzLmROLHkpCiB5PXRoaXMuUzUKIHkuVjEoeSkKIHkuRlYoMCx6LnQoYiwic3ViY2xhc3NlcyIpKQpAQCAtMTczMzMsMjkgKzE3NDk5LDExNCBAQAogY09yOnsKICJeIjoiWnpRK1BpOyIsCiAkaXNkMzp0cnVlfSwKK0hrOnsKKyJeIjoiYTt6dCIsCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuenR9LCIkMCIsImdBWSIsMCwwLDcyXSwKK1EyOmZ1bmN0aW9uKCl7cmV0dXJuIEMuTm0udGcoWyQuYjEoKSwkLmwzKCksJC56eCgpLCQuTVEoKV0sdGhpcyl9LAorc3RhdGljOnsiXiI6IklqLGpYLEYwLEJzLEc4LHhzLGFiLFNwLEV0LExsLEhVLGJ0LHdwLHozLFliLHZlIixFejpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSJrUmVndWxhckZ1bmN0aW9uIjpyZXR1cm4gJC5ZRigpCitjYXNlImtDbG9zdXJlRnVuY3Rpb24iOnJldHVybiAkLnhxKCkKK2Nhc2Uia0dldHRlckZ1bmN0aW9uIjpyZXR1cm4gJC5HRygpCitjYXNlImtTZXR0ZXJGdW5jdGlvbiI6cmV0dXJuICQuS3coKQorY2FzZSJrQ29uc3RydWN0b3IiOnJldHVybiAkLmtqKCkKK2Nhc2Uia0ltcGxpY2l0R2V0dGVyRnVuY3Rpb24iOnJldHVybiAkLmQ5KCkKK2Nhc2Uia0ltcGxpY2l0U2V0dGVyRnVuY3Rpb24iOnJldHVybiAkLm5FKCkKK2Nhc2Uia1N0YXRpY0luaXRpYWxpemVyIjpyZXR1cm4gJC55NSgpCitjYXNlImtNZXRob2RFeHRyYWN0b3IiOnJldHVybiAkLk90KCkKK2Nhc2Uia05vU3VjaE1ldGhvZERpc3BhdGNoZXIiOnJldHVybiAkLkU3KCkKK2Nhc2Uia0ludm9rZUZpZWxkRGlzcGF0Y2hlciI6cmV0dXJuICQuZjYoKQorY2FzZSJDb2xsZWN0ZWQiOnJldHVybiAkLmIxKCkKK2Nhc2UiTmF0aXZlIjpyZXR1cm4gJC5sMygpCitjYXNlIlRhZyI6cmV0dXJuICQuengoKQorY2FzZSJSZXVzZWQiOnJldHVybiAkLk1RKCl9cmV0dXJuICQubEMoKX19fSwKK0twOnsKKyJeIjoiWnFhO01ELEVHLGJWLHZZLGZkLGFyLHFHLGROLFRELE5NLHZmLEg3LEkwLFhOLE5pLGtFLFo0LEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKK2dFbDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1EfSwKK3NFbDpmdW5jdGlvbihhKXt0aGlzLk1EPUYuV2kodGhpcyxDLllWLHRoaXMuTUQsYSl9LAorZ3hIOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuRUd9LAorc3hIOmZ1bmN0aW9uKGEpe3RoaXMuRUc9Ri5XaSh0aGlzLEMuSWYsdGhpcy5FRyxhKX0sCitnRm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5iVn0sCitnUnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52WX0sCitnZVQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZmR9LAorc2VUOmZ1bmN0aW9uKGEsYil7dGhpcy5mZD1GLldpKHRoaXMsQy5uWCx0aGlzLmZkLGIpfSwKK2dJczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcn0sCitzSXM6ZnVuY3Rpb24oYSxiKXt0aGlzLmFyPUYuV2kodGhpcyxDLlBYLHRoaXMuYXIsYil9LAorZ1ZGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucUd9LAorc1ZGOmZ1bmN0aW9uKGEpe3RoaXMucUc9Ri5XaSh0aGlzLEMuejYsdGhpcy5xRyxhKX0sCitnZWo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kTn0sCitzZWo6ZnVuY3Rpb24oYSl7dGhpcy5kTj1GLldpKHRoaXMsQy5GZSx0aGlzLmROLGEpfSwKK2d0VDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5URH0sCitzdFQ6ZnVuY3Rpb24oYSxiKXt0aGlzLlREPUYuV2kodGhpcyxDLmk0LHRoaXMuVEQsYil9LAorZ2pXOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTk19LAorc2pXOmZ1bmN0aW9uKGEpe3RoaXMuTk09Ri5XaSh0aGlzLEMuT1UsdGhpcy5OTSxhKX0sCitnVzE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Zn0sCitnaG86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IN30sCitnZlk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSTB9LAorZ3VoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWE59LAorZ1V4OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTml9LAorZ1N1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua0V9LAorZ25pOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuWjR9LAorYkY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKK3o9Si5VNihiKQoreT16LnQoYiwidXNlcl9uYW1lIikKK3RoaXMuYk49dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTix5KQoreT16LnQoYiwibmFtZSIpCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1IseSkKK0Qua1QoYixKLmFUKHRoaXMuUDMpKQoreT16Lng0KGIsIm93bmluZ0NsYXNzIik9PT0hMD96LnQoYiwib3duaW5nQ2xhc3MiKTpudWxsCit0aGlzLk1EPUYuV2kodGhpcyxDLllWLHRoaXMuTUQseSkKK3k9ei54NChiLCJvd25pbmdMaWJyYXJ5Iik9PT0hMD96LnQoYiwib3duaW5nTGlicmFyeSIpOm51bGwKK3RoaXMuRUc9Ri5XaSh0aGlzLEMuSWYsdGhpcy5FRyx5KQoreT1ELkV6KHoudChiLCJraW5kIikpCit5PUYuV2kodGhpcyxDLkxjLHRoaXMuSTAseSkKK3RoaXMuSTA9eQoreT15LlEyKCkKK3RoaXMuWjQ9Ri5XaSh0aGlzLEMuYTAsdGhpcy5aNCwheSkKK2lmKGMpcmV0dXJuCit5PXoudChiLCJpc1N0YXRpYyIpCit0aGlzLmJWPUYuV2kodGhpcyxDLkFULHRoaXMuYlYseSkKK3k9ei50KGIsImlzQ29uc3QiKQordGhpcy52WT1GLldpKHRoaXMsQy5Ocix0aGlzLnZZLHkpCit5PXoudChiLCJwYXJlbnQiKQordGhpcy5mZD1GLldpKHRoaXMsQy5uWCx0aGlzLmZkLHkpCit5PXoudChiLCJzY3JpcHQiKQordGhpcy5hcj1GLldpKHRoaXMsQy5QWCx0aGlzLmFyLHkpCit5PXoudChiLCJ0b2tlblBvcyIpCit0aGlzLnFHPUYuV2kodGhpcyxDLno2LHRoaXMucUcseSkKK3k9ei50KGIsImVuZFRva2VuUG9zIikKK3RoaXMuZE49Ri5XaSh0aGlzLEMuRmUsdGhpcy5kTix5KQoreT16LnQoYiwiY29kZSIpCit0aGlzLlREPUYuV2kodGhpcyxDLmk0LHRoaXMuVEQseSkKK3k9ei50KGIsInVub3B0aW1pemVkX2NvZGUiKQordGhpcy5OTT1GLldpKHRoaXMsQy5PVSx0aGlzLk5NLHkpCit5PXoudChiLCJpc19vcHRpbWl6YWJsZSIpCit0aGlzLnZmPUYuV2kodGhpcyxDLlZsLHRoaXMudmYseSkKK3k9ei50KGIsImlzX2lubGluYWJsZSIpCit0aGlzLkg3PUYuV2kodGhpcyxDLk1ZLHRoaXMuSDcseSkKK3k9ei50KGIsImRlb3B0aW1pemF0aW9ucyIpCit0aGlzLlhOPUYuV2kodGhpcyxDLmVSLHRoaXMuWE4seSkKK3o9ei50KGIsInVzYWdlX2NvdW50ZXIiKQordGhpcy5rRT1GLldpKHRoaXMsQy55dix0aGlzLmtFLHopCit6PXRoaXMuZmQKK2lmKHo9PW51bGwpe3o9dGhpcy5NRAorej16IT1udWxsP0guZChKLk82KHopKSsiLiIrSC5kKHRoaXMuYk4pOnRoaXMuYk4KK3RoaXMuTmk9Ri5XaSh0aGlzLEMuQU8sdGhpcy5OaSx6KX1lbHNle3o9SC5kKHouZ1V4KCkpKyIuIitILmQodGhpcy5iTikKK3RoaXMuTmk9Ri5XaSh0aGlzLEMuQU8sdGhpcy5OaSx6KX19LAorJGlzS3A6dHJ1ZX0sCitacWE6eworIl4iOiJhZitQaTsiLAorJGlzZDM6dHJ1ZX0sCiBjMjp7CiAiXiI6IlBpO1JkPCxhND4seDksQVAsZm4iLAogZ3U5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueDl9LAogc3U5OmZ1bmN0aW9uKGEpe3RoaXMueDk9Ri5XaSh0aGlzLEMuU3MsdGhpcy54OSxhKX0sCiAkaXNjMjp0cnVlfSwKIHZ4OnsKLSJeIjoiUzZMO0dkPixkNixJMCxVOSxuRSxHZSx3QSx5NixGQixBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6IlM2TDtHZD4sZDYsSTAsVTksbkUsR2Usd0EseTYsRkIsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ2ZZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkkwfSwKLXNmWTpmdW5jdGlvbihhLGIpe3RoaXMuSTA9Ri5XaSh0aGlzLEMuTGMsdGhpcy5JMCxiKX0sCi1naFk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VOX0sCi1zaFk6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5VOQotaWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHosYSkpe3o9bmV3IFQucUkodGhpcyxDLkdkLHosYSkKLXouJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KLXRoaXMubnEodGhpcyx6KX10aGlzLlU5PWF9LAotZ1NLOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubkV9LAotc1NLOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMubkUKLWlmKHRoaXMuZ256KHRoaXMpJiYhSi54Qyh6LGEpKXt6PW5ldyBULnFJKHRoaXMsQy5rQSx6LGEpCi16LiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMseil9dGhpcy5uRT1hfSwKIGdVbTpmdW5jdGlvbigpe3JldHVybiEwfSwKIGdNODpmdW5jdGlvbigpe3JldHVybiEwfSwKIHJLOmZ1bmN0aW9uKGEpe3ZhciB6LHkKLXo9Si5iSShhLDEpCit6PUouSG4oYSwxKQogeT10aGlzLkdkLmFvCiBpZih6Pj4+MCE9PXp8fHo+PXkubGVuZ3RoKXJldHVybiBILmUoeSx6KQogcmV0dXJuIHlbel19LApAQCAtMTczNzMsNDMgKzE3NjI0LDQ1IEBACiB0aGlzLkdlPXcKIHRoaXMuYk49dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTix3KQogdz10aGlzLndBCi10aGlzLnQ3PXRoaXMuY3QodGhpcyxDLlRjLHRoaXMudDcsdykKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix3KQogdGhpcy5XOCh6LnQoYiwic291cmNlIikpCiB0aGlzLlBUKHoudChiLCJ0b2tlblBvc1RhYmxlIikpfSwKLVBUOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscgorUFQ6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscAogaWYoYT09bnVsbClyZXR1cm4KLXRoaXMueTY9UC5GbChudWxsLG51bGwpCi10aGlzLkZCPVAuRmwobnVsbCxudWxsKQorej10aGlzLnk2Cit6LlYxKDApCit5PXRoaXMuRkIKK3kuVjEoMCkKIHRoaXMuVTk9Ri5XaSh0aGlzLEMuR2QsdGhpcy5VOSxudWxsKQogdGhpcy5uRT1GLldpKHRoaXMsQy5rQSx0aGlzLm5FLG51bGwpCi1mb3Ioej1KLm1ZKGEpO3ouRygpOyl7eT16LmdsKCkKLXg9Si5VNih5KQotdz14LnQoeSwwKQotdj0xCi13aGlsZSghMCl7dT14LmdCKHkpCi1pZih0eXBlb2YgdSE9PSJudW1iZXIiKXJldHVybiBILnModSkKLWlmKCEodjx1KSlicmVhawotdD14LnQoeSx2KQotcz14LnQoeSx2KzEpCi11PXRoaXMuVTkKLWlmKHU9PW51bGwpe2lmKHRoaXMuZ256KHRoaXMpJiYhSi54Qyh1LHQpKXt1PW5ldyBULnFJKHRoaXMsQy5HZCx1LHQpCi11LiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMsdSl9dGhpcy5VOT10Ci11PXRoaXMubkUKLWlmKHRoaXMuZ256KHRoaXMpJiYhSi54Qyh1LHQpKXt1PW5ldyBULnFJKHRoaXMsQy5rQSx1LHQpCi11LiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMsdSl9dGhpcy5uRT10fWVsc2V7dT1KLkJsKHUsdCk/dGhpcy5VOTp0Ci1yPXRoaXMuVTkKLWlmKHRoaXMuZ256KHRoaXMpJiYhSi54QyhyLHUpKXtyPW5ldyBULnFJKHRoaXMsQy5HZCxyLHUpCi1yLiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMscil9dGhpcy5VOT11Ci11PUouSjUodGhpcy5uRSx0KT90aGlzLm5FOnQKLXI9dGhpcy5uRQotaWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHIsdSkpe3I9bmV3IFQucUkodGhpcyxDLmtBLHIsdSkKLXIuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KLXRoaXMubnEodGhpcyxyKX10aGlzLm5FPXV9dGhpcy55Ni51KDAsdCx3KQotdGhpcy5GQi51KDAsdCxzKQotdis9Mn19fSwKK2Zvcih4PUoubVkoYSk7eC5HKCk7KXt3PXguZ2woKQordj1KLlU2KHcpCit1PXYudCh3LDApCit0PTEKK3doaWxlKCEwKXtzPXYuZ0IodykKK2lmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIEgucyhzKQoraWYoISh0PHMpKWJyZWFrCityPXYudCh3LHQpCitxPXYudCh3LHQrMSkKK3M9dGhpcy5VOQoraWYocz09bnVsbCl7aWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHMscikpe3M9bmV3IFQucUkodGhpcyxDLkdkLHMscikKK3MuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KK3RoaXMubnEodGhpcyxzKX10aGlzLlU5PXIKK3M9dGhpcy5uRQoraWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHMscikpe3M9bmV3IFQucUkodGhpcyxDLmtBLHMscikKK3MuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KK3RoaXMubnEodGhpcyxzKX10aGlzLm5FPXJ9ZWxzZXtzPUouQmwocyxyKT90aGlzLlU5OnIKK3A9dGhpcy5VOQoraWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHAscykpe3A9bmV3IFQucUkodGhpcyxDLkdkLHAscykKK3AuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KK3RoaXMubnEodGhpcyxwKX10aGlzLlU5PXMKK3M9Si5KNSh0aGlzLm5FLHIpP3RoaXMubkU6cgorcD10aGlzLm5FCitpZih0aGlzLmdueih0aGlzKSYmIUoueEMocCxzKSl7cD1uZXcgVC5xSSh0aGlzLEMua0EscCxzKQorcC4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQordGhpcy5ucSh0aGlzLHApfXRoaXMubkU9c316LnUoMCxyLHUpCit5LnUoMCxyLHEpCit0Kz0yfX19LAogU0M6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQKIHo9Si5VNihhKQogeT10aGlzLmQ2CkBAIC0xNzQyNSw3ICsxNzY3OCw3IEBACiBXODpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogdGhpcy5rVD0hMQogaWYoYT09bnVsbClyZXR1cm4KLXo9Si51SChhLCJcbiIpCit6PUouSXQoYSwiXG4iKQogaWYoei5sZW5ndGg9PT0wKXJldHVybgogdGhpcy5rVD0hMAogeT10aGlzLkdkCkBAIC0xNzQ0NSw3ICsxNzY5OCw3IEBACiAiXiI6Ind2WStQaTsiLAogJGlzZDM6dHJ1ZX0sCiBEYjp7Ci0iXiI6ImE7WXU8LFBsPCxmRjwiLAorIl4iOiJhO1l1PCxEdTwsZkY8IiwKICRpc0RiOnRydWV9LAogWjk6ewogIl4iOiJQaTtZdTwsTFIsVkY8LFluUCxmWT4sYXIsdXAsQVAsZm4iLApAQCAtMTc0NTYsNyArMTc3MDksNyBAQAogej10aGlzLkxSCiB5PUoueCh6KQogaWYoeS5uKHosLTEpKXJldHVybiJOL0EiCi1yZXR1cm4geS5idSh6KX0sIiQwIiwiZ2tBIiwwLDAsMjA0XSwKK3JldHVybiB5LmJ1KHopfSwiJDAiLCJna0EiLDAsMCw2OV0sCiBiUjpmdW5jdGlvbihhKXt2YXIgeix5CiB0aGlzLmFyPUYuV2kodGhpcyxDLlBYLHRoaXMuYXIsbnVsbCkKIHo9dGhpcy5WRgpAQCAtMTc0NzYsMjAgKzE3NzI5LDIwIEBACiB6PXRoaXMuWXUKIHk9Si54KHopCiBpZih5Lm4oeiwwKSlyZXR1cm4iIgotcmV0dXJuIjB4Iit5LldaKHosMTYpfSwiJDAiLCJnWmQiLDAsMCwyMDRdLAorcmV0dXJuIjB4Iit5LldaKHosMTYpfSwiJDAiLCJnWmQiLDAsMCw2OV0sCiBpbzpbZnVuY3Rpb24oYSl7dmFyIHoKIGlmKGE9PW51bGwpcmV0dXJuIiIKIHo9YS5nT28oKS5acC50KDAsdGhpcy5ZdSkKIGlmKHo9PW51bGwpcmV0dXJuIiIKLWlmKEoueEMoei5nZkYoKSx6LmdQbCgpKSlyZXR1cm4iIgotcmV0dXJuIEQuZEooei5nZkYoKSxhLmdsdCgpKSsiICgiK0guZCh6LmdmRigpKSsiKSJ9LCIkMSIsImdjUSIsMiwwLDIwNSw3M10sCitpZihKLnhDKHouZ2ZGKCksei5nRHUoKSkpcmV0dXJuIiIKK3JldHVybiBELmRKKHouZ2ZGKCksYS5nbHQoKSkrIiAoIitILmQoei5nZkYoKSkrIikifSwiJDEiLCJnY1EiLDIsMCwyMDksNzRdLAogSFU6W2Z1bmN0aW9uKGEpe3ZhciB6CiBpZihhPT1udWxsKXJldHVybiIiCiB6PWEuZ09vKCkuWnAudCgwLHRoaXMuWXUpCiBpZih6PT1udWxsKXJldHVybiIiCi1yZXR1cm4gRC5kSih6LmdQbCgpLGEuZ2x0KCkpKyIgKCIrSC5kKHouZ1BsKCkpKyIpIn0sIiQxIiwiZ0dLIiwyLDAsMjA1LDczXSwKK3JldHVybiBELmRKKHouZ0R1KCksYS5nbHQoKSkrIiAoIitILmQoei5nRHUoKSkrIikifSwiJDEiLCJnR0siLDIsMCwyMDksNzRdLAogZVE6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdwoteT1KLnVIKHRoaXMuTDQsIiAiKQoreT1KLkl0KHRoaXMuTDQsIiAiKQogeD15Lmxlbmd0aAogaWYoeCE9PTIpcmV0dXJuIDAKIGlmKDE+PXgpcmV0dXJuIEguZSh5LDEpCkBAIC0xNzUxNCw4ICsxNzc2Nyw4IEBACiBzdGF0aWM6e2RKOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuQ0QuU3koMTAwKkouWDkoYSxiKSwyKSsiJSJ9fX0sCiBXQUU6ewogIl4iOiJhO3VYIiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVYfSwKLXN0YXRpYzp7Il4iOiJPY2ksbDhSLFdBZyx5UDAsWjdVIixDUTpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51WH0sIiQwIiwiZ0FZIiwwLDAsNjldLAorc3RhdGljOnsiXiI6Ik9jaSxwZyxXQWcseVAwLFo3VSIsQ1E6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiBpZih6Lm4oYSwiTmF0aXZlIikpcmV0dXJuIEMuT2MKIGVsc2UgaWYoei5uKGEsIkRhcnQiKSlyZXR1cm4gQy5sOAogZWxzZSBpZih6Lm4oYSwiQ29sbGVjdGVkIikpcmV0dXJuIEMuV0EKQEAgLTE3NTMwLDE0ICsxNzc4MywxMyBAQAogIl4iOiJhO3RUPixBdjwsa3M+LEp2IiwKICRpc0Q1OnRydWV9LAoga3g6ewotIl4iOiJWNGI7STAseE0sUGw8LGZGPCx2ZyxNYixWUyxodyx2YTwsT288LG1NLHFILE5pLE1PLGFyLE1ILG9jKixkTkAsVEQsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJEM2k7STAseE0sRHU8LGZGPCx2ZyxNYixWUyxodyx2YTwsT288LG1NLHFILEpLLE1PLGFyLE1ILG9jKixUWEAsTWssQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ2ZZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkkwfSwKLXNmWTpmdW5jdGlvbihhLGIpe3RoaXMuSTA9Ri5XaSh0aGlzLEMuTGMsdGhpcy5JMCxiKX0sCiBnbHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54TX0sCiBnUzc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tTX0sCiBnYW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xSH0sCi1nTDE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5OaX0sCi1zTDE6ZnVuY3Rpb24oYSl7dGhpcy5OaT1GLldpKHRoaXMsQy56Tyx0aGlzLk5pLGEpfSwKK2dMMTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkpLfSwKK3NMMTpmdW5jdGlvbihhKXt0aGlzLkpLPUYuV2kodGhpcyxDLnpPLHRoaXMuSkssYSl9LAogZ2lnOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk1PfSwKIHNpZzpmdW5jdGlvbihhLGIpe3RoaXMuTU89Ri5XaSh0aGlzLEMubmYsdGhpcy5NTyxiKX0sCiBnSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJ9LApAQCAtMTc1NDcsMTMgKzE3Nzk5LDEzIEBACiBnTTg6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiB0eDpbZnVuY3Rpb24oYSl7dmFyIHoseQogdGhpcy5hcj1GLldpKHRoaXMsQy5QWCx0aGlzLmFyLGEpCi1mb3Ioej10aGlzLnZhLHo9ei5nQSh6KTt6LkcoKTspZm9yKHk9ei5sby5ndUgoKSx5PXkuZ0EoeSk7eS5HKCk7KXkubG8uYlIoYSl9LCIkMSIsImdVSCIsMiwwLDIwNiwyMDddLAorZm9yKHo9dGhpcy52YSx6PXouZ0Eoeik7ei5HKCk7KWZvcih5PXoubG8uZ3VIKCkseT15LmdBKHkpO3kuRygpOyl5LmxvLmJSKGEpfSwiJDEiLCJnVUgiLDIsMCwyMTAsMjExXSwKIE9GOmZ1bmN0aW9uKCl7aWYodGhpcy5hciE9bnVsbClyZXR1cm4KIGlmKCFKLnhDKHRoaXMuSTAsQy5sOCkpcmV0dXJuCiB2YXIgej10aGlzLk1PCiBpZih6PT1udWxsKXJldHVybgotaWYoSi5VUSh6LCJzY3JpcHQiKT09bnVsbCl7Si5TSyh0aGlzLk1PKS5tbChuZXcgRC5FbSh0aGlzKSkKLXJldHVybn1KLlNLKEouVVEodGhpcy5NTywic2NyaXB0IikpLm1sKHRoaXMuZ1VIKCkpfSwKK2lmKEouekgoeik9PW51bGwpe0ouU0sodGhpcy5NTykubWwobmV3IEQuRW0odGhpcykpCityZXR1cm59Si5TSyhKLnpIKHRoaXMuTU8pKS5tbCh0aGlzLmdVSCgpKX0sCiBSRTpmdW5jdGlvbihhKXtpZihKLnhDKHRoaXMuSTAsQy5sOCkpcmV0dXJuIEQuYWYucHJvdG90eXBlLlJFLmNhbGwodGhpcyx0aGlzKQogcmV0dXJuIFAuQWIodGhpcyxudWxsKX0sCiBiZDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdgpAQCAtMTc1NzEsMTkgKzE3ODIzLDE5IEBACiB0aGlzLnhNPUYuV2kodGhpcyxDLktqLHRoaXMueE0sYykKIHo9Si5VNihhKQogdGhpcy5mRj1ILkJVKHoudChhLCJpbmNsdXNpdmVfdGlja3MiKSxudWxsLG51bGwpCi10aGlzLlBsPUguQlUoei50KGEsImV4Y2x1c2l2ZV90aWNrcyIpLG51bGwsbnVsbCkKK3RoaXMuRHU9SC5CVSh6LnQoYSwiZXhjbHVzaXZlX3RpY2tzIiksbnVsbCxudWxsKQogdGhpcy5iZCh0aGlzLlZTLHoudChhLCJjYWxsZXJzIiksYikKIHRoaXMuYmQodGhpcy5odyx6LnQoYSwiY2FsbGVlcyIpLGIpCiB5PXoudChhLCJ0aWNrcyIpCiBpZih5IT1udWxsKXRoaXMucUwoeSkKIHo9RC5SQSh0aGlzLmZGLHRoaXMueE0pKyIgKCIrSC5kKHRoaXMuZkYpKyIpIgogdGhpcy5tTT1GLldpKHRoaXMsQy5lRix0aGlzLm1NLHopCi16PUQuUkEodGhpcy5QbCx0aGlzLnhNKSsiICgiK0guZCh0aGlzLlBsKSsiKSIKK3o9RC5SQSh0aGlzLkR1LHRoaXMueE0pKyIgKCIrSC5kKHRoaXMuRHUpKyIpIgogdGhpcy5xSD1GLldpKHRoaXMsQy51VSx0aGlzLnFILHopfSwKIGJGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUKIHo9Si5VNihiKQogdGhpcy5vYz16LnQoYiwidXNlcl9uYW1lIikKLXRoaXMuZE49ei50KGIsIm5hbWUiKQordGhpcy5UWD16LnQoYiwibmFtZSIpCiB5PXoudChiLCJpc09wdGltaXplZCIpIT1udWxsJiZ6LnQoYiwiaXNPcHRpbWl6ZWQiKQogdGhpcy5NSD1GLldpKHRoaXMsQy5wWSx0aGlzLk1ILHkpCiB5PUQuQ1Eoei50KGIsImtpbmQiKSkKQEAgLTE3NTk1LDcgKzE3ODQ3LDcgQEAKIHc9eC5nb2QoeSkuUW4oei50KGIsImZ1bmN0aW9uIikpCiB0aGlzLk1PPUYuV2kodGhpcyxDLm5mLHRoaXMuTU8sdykKIHk9eC5nb2QoeSkuUW4oei50KGIsIm9iamVjdF9wb29sIikpCi10aGlzLk5pPUYuV2kodGhpcyxDLnpPLHRoaXMuTmkseSkKK3RoaXMuSks9Ri5XaSh0aGlzLEMuek8sdGhpcy5KSyx5KQogdj16LnQoYiwiZGlzYXNzZW1ibHkiKQogaWYodiE9bnVsbCl0aGlzLnhzKHYpCiB1PXoudChiLCJkZXNjcmlwdG9ycyIpCkBAIC0xNzYwMyw4ICsxNzg1NSw4IEBACiB6PXRoaXMudmEuYW8KIHRoaXMua1Q9ei5sZW5ndGghPT0wfHwhSi54Qyh0aGlzLkkwLEMubDgpCiB6PXoubGVuZ3RoIT09MCYmSi54Qyh0aGlzLkkwLEMubDgpCi10aGlzLlREPUYuV2kodGhpcyxDLnpTLHRoaXMuVEQseil9LAotZ3ZTOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVER9LAordGhpcy5Naz1GLldpKHRoaXMsQy56Uyx0aGlzLk1rLHopfSwKK2d2UzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk1rfSwKIHhzOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9dGhpcy52YQogei5WMSh6KQpAQCAtMTc2NTAsMjQgKzE3OTAyLDI0IEBACiBncXk6ZnVuY3Rpb24oKXtyZXR1cm4gSi54Qyh0aGlzLkkwLEMubDgpfSwKICRpc2t4OnRydWUsCiBzdGF0aWM6e1JBOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEMuQ0QuU3koMTAwKkouWDkoYSxiKSwyKSsiJSJ9fX0sCi1WNGI6eworRDNpOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogRW06ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5hCi15PUouVVEoei5NTywic2NyaXB0IikKK3k9Si56SCh6Lk1PKQogaWYoeT09bnVsbClyZXR1cm4KLUouU0soeSkubWwoei5nVUgoKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMDgsImNhbGwiXSwKK0ouU0soeSkubWwoei5nVUgoKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMTIsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQ3E6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5iSShiLmdBdigpLGEuZ0F2KCkpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLkhuKGIuZ0F2KCksYS5nQXYoKSl9LAogJGlzRUg6dHJ1ZX0sCi1NOXg6eworbDhSOnsKICJeIjoiYTt1WCIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51WH0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudVh9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7Il4iOiJDbmssbFRVLEZKeSx3ciIsQjQ6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiBpZih6Lm4oYSwiTGlzdGVuaW5nIikpcmV0dXJuIEMuQ24KIGVsc2UgaWYoei5uKGEsIk5vcm1hbCIpKXJldHVybiBDLmxUCkBAIC0xNzY3NiwyNyArMTc5MjgsMjYgQEAKIE4uUU0oIiIpLmoyKCJVbmtub3duIHNvY2tldCBraW5kICIrSC5kKGEpKQogdGhyb3cgSC5iKFAuYTkoKSl9fX0sCiBXUDp7Ci0iXiI6IlpxYTtWOEAsaWIsbUksSTAsdnUsREIsWEssRkgsTDcsencsdE8sSE8sdTgsRUMsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJQcWI7VjhALGplbCxVZSxJMCx2dSxEQixYSyxGSCxMNyx6dyx0TyxITyx1OCxFQyxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnVW06ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiBnSFk6ZnVuY3Rpb24oKXtyZXR1cm4gSi54Qyh0aGlzLkkwLEMuRkopfSwKIGdmWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JMH0sCi1zZlk6ZnVuY3Rpb24oYSxiKXt0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAsYil9LAogZ2FCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnZ1fSwKIGdtODpmdW5jdGlvbigpe3JldHVybiB0aGlzLkRCfSwKIGdWMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlhLfSwKIGdhUDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkZIfSwKIGd6TTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkw3fSwKLWdrRTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp3fSwKK2d4NTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp3fSwKIGdpUDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRPfSwKIGdtZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhPfSwKIGdOUzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnU4fSwKLWd1aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVDfSwKK2d6SzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVDfSwKIGJGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5CiB6PUouVTYoYikKIHk9ei50KGIsIm5hbWUiKQogdGhpcy5iTj10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHkpCiB5PXoudChiLCJuYW1lIikKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx5KQordGhpcy5HUj10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLkdSLHkpCiB5PUQuQjQoei50KGIsImtpbmQiKSkKIHRoaXMuSTA9Ri5XaSh0aGlzLEMuTGMsdGhpcy5JMCx5KQogaWYoYylyZXR1cm4KQEAgLTE3NzIzLDExICsxNzk3NCwxMSBAQAogeT16LnQoYiwiZmQiKQogdGhpcy56dz1GLldpKHRoaXMsQy5SMyx0aGlzLnp3LHkpCiB0aGlzLlY4PXoudChiLCJvd25lciIpfX0sCi1acWE6eworUHFiOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogUWY6ewotIl4iOiJUcDo3OTthLGIiLAorIl4iOiJUcFo6ODA7YSxiIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej1KLngoYikKIHk9ISF6LiRpc3FDCkBAIC0xNzczNywxNyArMTc5ODgsMTcgQEAKICRpc0VIOnRydWV9fV0sWyJzZXJ2aWNlX2Vycm9yX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NlcnZpY2VfZXJyb3Jfdmlldy5kYXJ0IiwsUix7CiAiXiI6IiIsCiB6TTp7Ci0iXiI6IlY0NztTNCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY0NztTNCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBna2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUzR9LAogc2tjOmZ1bmN0aW9uKGEsYil7YS5TND10aGlzLmN0KGEsQy55aCxhLlM0LGIpfSwKIHN0YXRpYzp7Wm1LOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuVTAuWkwoYSkKIEMuVTAuWEkoYSkKQEAgLTE3NzU3LDE3ICsxODAwOCwxNyBAQAogJGlzZDM6dHJ1ZX19XSxbInNlcnZpY2VfZXhjZXB0aW9uX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NlcnZpY2VfZXhjZXB0aW9uX3ZpZXcuZGFydCIsLEQsewogIl4iOiIiLAogUms6ewotIl4iOiJWNDg7WGMsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDg7WGMsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2phOmZ1bmN0aW9uKGEpe3JldHVybiBhLlhjfSwKIHNqYTpmdW5jdGlvbihhLGIpe2EuWGM9dGhpcy5jdChhLEMubmUsYS5YYyxiKX0sCiBzdGF0aWM6e2JacDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlZkLlpMKGEpCiBDLlZkLlhJKGEpCkBAIC0xNzc5NSw3ICsxODA0Niw3IEBACiAiXiI6ImE7ak8+LG1oPCIsCiAkaXNVMjp0cnVlfSwKIEtNOnsKLSJeIjoid3Y7ZUcsTXAsTj4sSlMsUzMseWIsYnMsT3gsR1ksUlcsVHMsVmEsa1UsbDcsTGksRzIsUmssUXksejcsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJ3djtlRyxNcCxOPixKUyxTMyx5YixicyxPeCxHWSxSVyxUcyxWYSxrVSxsNyxMaSxHMixSayxReSx6NyxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnRUg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lRy5NTX0sCiB0MzpmdW5jdGlvbigpe3ZhciB6PXRoaXMuTXAuTU0KIGlmKHouR3Y9PT0wKXtOLlFNKCIiKS5UbygiV2ViU29ja2V0Vk0gY29ubmVjdGlvbiBlcnJvcjogIitILmQodGhpcy5OLmd3OCgpKSkKQEAgLTE3ODEwLDE5ICsxODA2MSwxOSBAQAogaWYodGhpcy5icz09bnVsbCl7ej1XLnBTKHRoaXMuTi5ndzgoKSxudWxsKQogdGhpcy5icz16CiB6PUguVk0obmV3IFcuUk8oeixDLmk2LlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5neGIoKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmd4YigpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej10aGlzLmJzCiB6LnRvU3RyaW5nCiB6PUguVk0obmV3IFcuUk8oeixDLk1ELlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5ncFUoKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdwVSgpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej10aGlzLmJzCiB6LnRvU3RyaW5nCiB6PUguVk0obmV3IFcuUk8oeixDLkpMLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5ncU0oKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdxTSgpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej10aGlzLmJzCiB6LnRvU3RyaW5nCiB6PUguVk0obmV3IFcuUk8oeixDLnBoLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nYTkoKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCl9eT1DLmpuLmJ1KHRoaXMueWIrKykKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdhOSgpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKX15PUMuam4uYnUodGhpcy55YisrKQogej1QLnFVCiB6PUguVk0obmV3IFAuWmYoUC5EdCh6KSksW3pdKQogeD1uZXcgVS5VMihiLHopCkBAIC0xNzgzMCwxMCArMTgwODEsMTAgQEAKIGVsc2UgdGhpcy5KUy51KDAseSx4KQogcmV0dXJuIHouTU19LAogVzRYOltmdW5jdGlvbihhKXt0aGlzLkNTKCkKLXRoaXMudDMoKX0sIiQxIiwiZ3hiIiwyLDAsMjA5LDJdLAordGhpcy50MygpfSwiJDEiLCJneGIiLDIsMCwyMTMsMl0sCiBXcDpbZnVuY3Rpb24oYSl7dGhpcy5DUygpCi10aGlzLnQzKCl9LCIkMSIsImdwVSIsMiwwLDIwLDIxMF0sCi1NTDpbZnVuY3Rpb24oYSl7dmFyIHoseQordGhpcy50MygpfSwiJDEiLCJncFUiLDIsMCwyMCwyMTRdLAorTUxDOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuTgogeT1EYXRlLm5vdygpCiBuZXcgUC5pUCh5LCExKS5FSygpCkBAIC0xNzg0Miw3ICsxODA5Myw3IEBACiB5PXRoaXMuZUcuTU0KIGlmKHkuR3Y9PT0wKXtOLlFNKCIiKS5UbygiV2ViU29ja2V0Vk0gY29ubmVjdGlvbiBvcGVuZWQ6ICIrSC5kKHouZ3c4KCkpKQogaWYoeS5HdiE9PTApSC52aChQLncoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQoteS5PSCh0aGlzKX19LCIkMSIsImdxTSIsMiwwLDIwLDIxMF0sCit5Lk9IKHRoaXMpfX0sIiQxIiwiZ3FNIiwyLDAsMjAsMjE0XSwKIFNTOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiB6PUMueHIua1YoSi5RZChhKSkKIGlmKHo9PW51bGwpe04uUU0oIiIpLllYKCJXZWJTb2NrZXRWTSBnb3QgZW1wdHkgbWVzc2FnZSIpCkBAIC0xNzg1Niw3ICsxODEwNyw3IEBACiBpZih2PT1udWxsKXtOLlFNKCIiKS5ZWCgiUmVjZWl2ZWQgdW5leHBlY3RlZCBtZXNzYWdlOiAiK0guZCh6KSkKIHJldHVybn15PXYuZ21oKCkuTU0KIGlmKHkuR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKLXkuT0godyl9LCIkMSIsImdhOSIsMiwwLDIxMSwyXSwKK3kuT0godyl9LCIkMSIsImdhOSIsMiwwLDIxNSwyXSwKIHoxOmZ1bmN0aW9uKGEpe2EuYU4oMCxuZXcgVS5Gdyh0aGlzKSkKIGEuVjEoMCl9LAogQ1M6ZnVuY3Rpb24oKXt2YXIgej10aGlzLlMzCkBAIC0xNzg3NCwxMCArMTgxMjUsMTAgQEAKIGlmKCFKLlZyKHouZ2pPKGIpLCIvcHJvZmlsZS90YWciKSlOLlFNKCIiKS5UbygiR0VUICIrSC5kKHouZ2pPKGIpKSsiIGZyb20gIitILmQodGhpcy5OLmd3OCgpKSkKIHRoaXMuUzMudSgwLGEsYikKIHk9dGhpcy5OLmdBOSgpPT09ITA/Qy54ci5LUChQLkVGKFsiaWQiLEguQlUoYSxudWxsLG51bGwpLCJtZXRob2QiLCJEYXJ0Lm9ic2VydmF0b3J5UXVlcnkiLCJwYXJhbXMiLFAuRUYoWyJpZCIsYSwicXVlcnkiLHouZ2pPKGIpXSxudWxsLG51bGwpXSxudWxsLG51bGwpKTpDLnhyLktQKFAuRUYoWyJzZXEiLGEsInJlcXVlc3QiLHouZ2pPKGIpXSxudWxsLG51bGwpKQotdGhpcy5icy5zZW5kKHkpfSwiJDIiLCJna0IiLDQsMCwyMTJdLAordGhpcy5icy5zZW5kKHkpfSwiJDIiLCJna0IiLDQsMCwyMTZdLAogJGlzS006dHJ1ZX0sCiBGdzp7Ci0iXiI6IlRwOjIxMzthIiwKKyJeIjoiVHBaOjIxNzthIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej1iLmdtaCgpCiB5PUMueHIuS1AoUC5FRihbInR5cGUiLCJTZXJ2aWNlRXhjZXB0aW9uIiwiaWQiLCIiLCJraW5kIiwiTmV0d29ya0V4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJXZWJTb2NrZXQgZGlzY29ubmVjdGVkIl0sbnVsbCxudWxsKSkKQEAgLTE3ODg1LDggKzE4MTM2LDggQEAKIGlmKHouR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKIHouT0goeSl9LAogJGlzRUg6dHJ1ZX0sCi1aVzp7Ci0iXiI6Ind2O2VHLE1wLFMzLHliLE94LEdZLFJXLFRzLFZhLGtVLGw3LExpLEcyLFJrLFF5LHo3LEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKK2RTOnsKKyJeIjoid3Y7ZUcsTXAsUzMseWIsT3gsR1ksUlcsVHMsVmEsa1UsbDcsTGksRzIsUmssUXksejcsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogamU6ZnVuY3Rpb24oYSl7fSwKIGdFSDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVHLk1NfSwKIGdpRzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5NcC5NTX0sCkBAIC0xNzg5OSw3ICsxODE1MCw3IEBACiB6PXRoaXMuUzMKIHY9ei50KDAseSkKIHouUnooMCx5KQotSi5LRCh2LHcpfSwiJDEiLCJnVngiLDIsMCwyMCw3NF0sCitKLktEKHYsdyl9LCIkMSIsImdWeCIsMiwwLDIwLDc1XSwKIHo2OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiB6PSIiK3RoaXMueWIKIHk9UC5GbChudWxsLG51bGwpCkBAIC0xNzkwOCwxOCArMTgxNTksMjAgQEAKIHkudSgwLCJxdWVyeSIsSC5kKGIpKTsrK3RoaXMueWIKIHg9SC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pCiB0aGlzLlMzLnUoMCx6LHgpCi1KLlYyKFcuUHYod2luZG93LnBhcmVudCksQy54ci5LUCh5KSwiKiIpCitKLnRUKFcuUHYod2luZG93LnBhcmVudCksQy54ci5LUCh5KSwiKiIpCiByZXR1cm4geC5NTX0sCiBaSDpmdW5jdGlvbigpe3ZhciB6PUguVk0obmV3IFcuUk8od2luZG93LEMucGguUGgsITEpLFtudWxsXSkKLUguVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdWeCgpKSx6LlNnKSxbSC5LcCh6LDApXSkuWnooKQorSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ1Z4KCkpLHouU2cpLFtILk9xKHosMCldKS5aeigpCiB6PXRoaXMuZUcuTU0KIGlmKHouR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKIHouT0godGhpcyl9fX1dLFsic2VydmljZV9vYmplY3Rfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2VydmljZV92aWV3LmRhcnQiLCxVLHsKICJeIjoiIiwKIFRpOnsKLSJeIjoiVjQ5O0xsLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQ5O0xsLFNhLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdXQTpmdW5jdGlvbihhKXtyZXR1cm4gYS5MbH0sCiBzV0E6ZnVuY3Rpb24oYSxiKXthLkxsPXRoaXMuY3QoYSxDLnRkLGEuTGwsYil9LAorZ0t3OmZ1bmN0aW9uKGEpe3JldHVybiBhLlNhfSwKK3NLdzpmdW5jdGlvbihhLGIpe2EuU2E9dGhpcy5jdChhLEMuWmcsYS5TYSxiKX0sCiBYcTpmdW5jdGlvbihhKXt2YXIgegogc3dpdGNoKGEuTGwuZ3pTKCkpe2Nhc2UiQWxsb2NhdGlvblByb2ZpbGUiOno9Vy5yMygiaGVhcC1wcm9maWxlIixudWxsKQogSi5DSih6LGEuTGwpCkBAIC0xODAyOCwxMCArMTgyODEsMTAgQEAKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTnMuWkwoYSkKIEMuTnMuWEkoYSkKQEAgLTE4MDQxLDkgKzE4Mjk0LDkgQEAKICRpc2QzOnRydWV9fV0sWyJzZXJ2aWNlX3JlZl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2VydmljZV9yZWYuZGFydCIsLFEsewogIl4iOiIiLAogeEk6ewotIl4iOiJWZng7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWZng7dFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ252OmZ1bmN0aW9uKGEpe3JldHVybiBhLnRZfSwKLXNudjpmdW5jdGlvbihhLGIpe2EudFk9dGhpcy5jdChhLEMueFAsYS50WSxiKX0sCitzbnY6ZnVuY3Rpb24oYSxiKXthLnRZPXRoaXMuY3QoYSxDLmtZLGEudFksYil9LAogZ2pUOmZ1bmN0aW9uKGEpe3JldHVybiBhLlBlfSwKIHNqVDpmdW5jdGlvbihhLGIpe2EuUGU9dGhpcy5jdChhLEMudXUsYS5QZSxiKX0sCiBhVjpbZnVuY3Rpb24oYSxiKXt0aGlzLmN0KGEsQy5GaCwiIix0aGlzLmdPMyhhKSkKQEAgLTE4MDU3LDcgKzE4MzEwLDcgQEAKIHJldHVybiIjIitILmQoeil9LAogZ0pwOmZ1bmN0aW9uKGEpe3ZhciB6PWEudFkKIGlmKHo9PW51bGwpcmV0dXJuIk5VTEwgUkVGIgotcmV0dXJuIHouZ2ROKCl9LAorcmV0dXJuIHouZ1RYKCl9LAogZ29jOmZ1bmN0aW9uKGEpe3ZhciB6PWEudFkKIGlmKHo9PW51bGwpcmV0dXJuIk5VTEwgUkVGIgogcmV0dXJuIEouTzYoeil9LApAQCAtMTgwNjcsMTAgKzE4MzIwLDEwIEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuSFJjLlpMKGEpCiBDLkhSYy5YSShhKQpAQCAtMTgwODAsNyArMTgzMzMsNyBAQAogJGlzZDM6dHJ1ZX19XSxbInNsaWRpbmdfY2hlY2tib3hfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NsaWRpbmdfY2hlY2tib3guZGFydCIsLFEsewogIl4iOiIiLAogQ1k6ewotIl4iOiJJbUs7a0YsSUssYlAsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJJbUs7a0YsSUssYlAsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2Q0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmtGfSwKIHNkNDpmdW5jdGlvbihhLGIpe2Eua0Y9dGhpcy5jdChhLEMuYmssYS5rRixiKX0sCiBnRXU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSUt9LApAQCAtMTgwODgsMTUgKzE4MzQxLDE1IEBACiBnUlk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYlB9LAogc1JZOmZ1bmN0aW9uKGEsYil7YS5iUD10aGlzLmN0KGEsQy56VSxhLmJQLGIpfSwKIFJDOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1KLkswKChhLnNoYWRvd1Jvb3R8fGEud2Via2l0U2hhZG93Um9vdCkucXVlcnlTZWxlY3RvcigiI3NsaWRlLXN3aXRjaCIpKQotYS5rRj10aGlzLmN0KGEsQy5iayxhLmtGLHopfSwiJDMiLCJnUVUiLDYsMCwxMTEsMSwyMTQsMTAzXSwKK2Eua0Y9dGhpcy5jdChhLEMuYmssYS5rRix6KX0sIiQzIiwiZ1FVIiw2LDAsMTEyLDEsMjE4LDEwNF0sCiBzdGF0aWM6e1NtOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuemIuWkwoYSkKIEMuemIuWEkoYSkKQEAgLTE4MTA2LDIxICsxODM1OSwyMSBAQAogJGlzZDM6dHJ1ZX19XSxbInNtb2tlIiwicGFja2FnZTpzbW9rZS9zbW9rZS5kYXJ0IiwsQSx7CiAiXiI6IiIsCiBXcTp7Ci0iXiI6ImE7YzEsSVcsTWcsbk4sRVIsSmEsV0ksUHAiLAotV086ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5QcC4kMShiKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgej1QLnA5KCIiKQorIl4iOiJhO3dxLElXLE1nLG5OLEVSLEphLFdJLHR1IiwKK1dPOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMudHUuJDEoYil9LAorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PVAucDkoIiIpCiB6LktGKCIob3B0aW9uczoiKQotei5LRih0aGlzLmMxPyJmaWVsZHMgIjoiIikKK3ouS0YodGhpcy53cT8iZmllbGRzICI6IiIpCiB6LktGKHRoaXMuSVc/InByb3BlcnRpZXMgIjoiIikKIHouS0YodGhpcy5KYT8ibWV0aG9kcyAiOiIiKQogei5LRih0aGlzLk1nPyJpbmhlcml0ZWQgIjoiXyIpCiB6LktGKHRoaXMuRVI/Im5vIGZpbmFscyAiOiIiKQogei5LRigiYW5ub3RhdGlvbnM6ICIrSC5kKHRoaXMuV0kpKQotei5LRih0aGlzLlBwIT1udWxsPyJ3aXRoIG1hdGNoZXIiOiIiKQorei5LRih0aGlzLnR1IT1udWxsPyJ3aXRoIG1hdGNoZXIiOiIiKQogei5LRigiKSIpCi1yZXR1cm4gei52TX19LAorcmV0dXJuIHoudk19LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBFUzp7Ci0iXiI6ImE7b2M+LGZZPixWNT4sdDU+LEZvLER2PCIsCisiXiI6ImE7b2M+LGZZPixWNT4sdDU+LEZvPCxEdjwiLAogZ1pJOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZlk9PT1DLm5VfSwKIGdVZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZZPT09Qy5CTX0sCiBnVUE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mWT09PUMuaFV9LApAQCAtMTgxMjgsNyArMTgzODEsNyBAQAogcmV0dXJuIHouZ2lPKHopfSwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCiByZXR1cm4hIUoueChiKS4kaXNFUyYmdGhpcy5vYy5uKDAsYi5vYykmJnRoaXMuZlk9PT1iLmZZJiZ0aGlzLlY1PT09Yi5WNSYmdGhpcy50NS5uKDAsYi50NSkmJnRoaXMuRm89PT1iLkZvJiZYLlc0KHRoaXMuRHYsYi5EdiwhMSl9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9UC5wOSgiIikKK2J1OltmdW5jdGlvbihhKXt2YXIgej1QLnA5KCIiKQogei5LRigiKGRlY2xhcmF0aW9uICIpCiB6LktGKHRoaXMub2MpCiB6LktGKHRoaXMuZlk9PT1DLkJNPyIgKHByb3BlcnR5KSAiOiIgKG1ldGhvZCkgIikKQEAgLTE4MTM2LDcgKzE4Mzg5LDcgQEAKIHouS0YodGhpcy5Gbz8ic3RhdGljICI6IiIpCiB6LktGKHRoaXMuRHYpCiB6LktGKCIpIikKLXJldHVybiB6LnZNfSwKK3JldHVybiB6LnZNfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNFUzp0cnVlfSwKIGlZbjp7CiAiXiI6ImE7Zlk+In19XSxbInNtb2tlLnNyYy5jb21tb24iLCJwYWNrYWdlOnNtb2tlL3NyYy9jb21tb24uZGFydCIsLFgsewpAQCAtMTgxNTIsMTggKzE4NDA1LDE4IEBACiByZXR1cm4gen1yZXR1cm4gYX0sCiBaTzpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdQogej1uZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCkKLXouJGJ1aWx0aW5UeXBlSW5mbz1bSC5LcChhLDApXQorei4kYnVpbHRpblR5cGVJbmZvPVtILk9xKGEsMCldCiBmb3IoO3ouRygpOyl7eT16LmxvCiBiLmxlbmd0aAogeD1uZXcgSC5hNyhiLDEsMCxudWxsKQoteC4kYnVpbHRpblR5cGVJbmZvPVtILktwKGIsMCldCit4LiRidWlsdGluVHlwZUluZm89W0guT3EoYiwwKV0KIHc9Si54KHkpCiBmb3IoO3guRygpOyl7dj14LmxvCiBpZih3Lm4oeSx2KSlyZXR1cm4hMAogaWYoISFKLngodikuJGlzdXEpe3U9dy5nYngoeSkKIHU9JC5tWCgpLmRNKHUsdil9ZWxzZSB1PSExCiBpZih1KXJldHVybiEwfX1yZXR1cm4hMX0sCi1PUzpmdW5jdGlvbihhKXt2YXIgeix5CitDejpmdW5jdGlvbihhKXt2YXIgeix5CiB6PUguRzMoKQogeT1ILktUKHopLkJEKGEpCiBpZih5KXJldHVybiAwCkBAIC0xODE5OCw3ICsxODQ1MSw3IEBACiBrUDpmdW5jdGlvbigpe3Rocm93IEguYihQLkZNKCJUaGUgXCJzbW9rZVwiIGxpYnJhcnkgaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQuIE1ha2Ugc3VyZSB5b3UgaW1wb3J0IGFuZCBjb25maWd1cmUgb25lIG9mIHRoZSBpbXBsZW1lbnRhdGlvbnMgKHBhY2thZ2U6c21va2UvbWlycm9ycy5kYXJ0IG9yIHBhY2thZ2U6c21va2Uvc3RhdGljLmRhcnQpLiIpKX19XSxbInNtb2tlLnN0YXRpYyIsInBhY2thZ2U6c21va2Uvc3RhdGljLmRhcnQiLCxPLHsKICJeIjoiIiwKIE9qOnsKLSJeIjoiYTtMSCxBSCxaR2osWUtILE5YLGFmPCx5USJ9LAorIl4iOiJhO2gyLEFILFpHaixZS0gsWXAsYWY8LHlRIn0sCiBmSDp7CiAiXiI6ImE7ZUEsdmssWDkiLAogakQ6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmVBLnQoMCxiKQpAQCAtMTgyMTMsNyArMTg0NjYsNyBAQAogej1udWxsfWVsc2V7eD10aGlzLmVBLnQoMCxiKQogej14PT1udWxsP251bGw6eC4kMShhKX1pZih6PT1udWxsKXRocm93IEguYihPLmxBKCJtZXRob2QgXCIiK0guZChiKSsiXCIgaW4gIitILmQoYSkpKQogeT1udWxsCi1pZihkKXt3PVguT1MoeikKK2lmKGQpe3c9WC5Deih6KQogaWYodz4zKXt5PSJ3ZSB0cmllZCB0byBhZGp1c3QgdGhlIGFyZ3VtZW50cyBmb3IgY2FsbGluZyBcIiIrSC5kKGIpKyJcIiwgYnV0IHdlIGNvdWxkbid0IGRldGVybWluZSB0aGUgZXhhY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCBleHBlY3RzIChpdCBpcyBtb3JlIHRoYW4gMykuIgogYz1YLk5hKGMsdyxQLnkodyxKLnE4KGMpKSl9ZWxzZXt2PVguUkkoeikKIHU9dj49MD92OkoucTgoYykKQEAgLTE4MjQ1LDExICsxODQ5OCwxMSBAQAogaWYoeT09bnVsbCl7aWYodGhpcy5BWil0aHJvdyBILmIoTy5sQSgic3VwZXJjbGFzcyBvZiBcIiIrSC5kKGIpKyJcIiIpKX1lbHNlIGlmKCF5Lm4oMCxjLm5OKSl6PXRoaXMuTWUoMCx5LGMpfXg9dGhpcy5XRi50KDAsYikKIGlmKHg9PW51bGwpe2lmKCF0aGlzLkFaKXJldHVybiB6CiB0aHJvdyBILmIoTy5sQSgiZGVjbGFyYXRpb25zIGZvciAiK0guZChiKSkpfWZvcih3PUoubVkoeC5nVVEoeCkpO3cuRygpOyl7dj13LmdsKCkKLWlmKCFjLmMxJiZ2LmdaSSgpKWNvbnRpbnVlCitpZighYy53cSYmdi5nWkkoKSljb250aW51ZQogaWYoIWMuSVcmJnYuZ1VkKCkpY29udGludWUKIGlmKGMuRVImJkouWjYodik9PT0hMCljb250aW51ZQogaWYoIWMuSmEmJnYuZ1VBKCkpY29udGludWUKLWlmKGMuUHAhPW51bGwmJmMuV08oMCxKLk82KHYpKSE9PSEwKWNvbnRpbnVlCitpZihjLnR1IT1udWxsJiZjLldPKDAsSi5PNih2KSkhPT0hMCljb250aW51ZQogdT1jLldJCiBpZih1IT1udWxsJiYhWC5aTyh2LmdEdigpLHUpKWNvbnRpbnVlCiB6LnB1c2godil9cmV0dXJuIHp9LApAQCAtMTgyNjYsMjYgKzE4NTE5LDI2IEBACiB6LlV0KGEpCiByZXR1cm4gen19fSwKIG04OnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLk56LnUoMCxiLGEpfSwKICRpc0VIOnRydWV9LAogdGs6ewogIl4iOiJhO0dCIiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJNaXNzaW5nICIrdGhpcy5HQisiLiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBzbW9rZSBwYWNrYWdlIHNlZW1zIGluY29tcGxldGUuIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIk1pc3NpbmcgIit0aGlzLkdCKyIuIENvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNtb2tlIHBhY2thZ2Ugc2VlbXMgaW5jb21wbGV0ZS4ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e2xBOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgTy50ayhhKX19fX1dLFsic3RhY2tfZnJhbWVfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3N0YWNrX2ZyYW1lLmRhcnQiLCxLLHsKICJeIjoiIiwKIG5tOnsKLSJeIjoiVjUwO3hQLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjUwO3hQLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdNNjpmdW5jdGlvbihhKXtyZXR1cm4gYS54UH0sCiBzTTY6ZnVuY3Rpb24oYSxiKXthLnhQPXRoaXMuY3QoYSxDLnJFLGEueFAsYil9LAotc3RhdGljOnthbnQ6ZnVuY3Rpb24oYSl7dmFyIHoseQorc3RhdGljOnthbjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmRYLlpMKGEpCiBDLmRYLlhJKGEpCkBAIC0xODI5NSwxOCArMTg1NDgsMTggQEAKICRpc2QzOnRydWV9fV0sWyJzdGFja190cmFjZV9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc3RhY2tfdHJhY2UuZGFydCIsLFgsewogIl4iOiIiLAogdXc6ewotIl4iOiJWNTE7anUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNTE7anUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3ROOmZ1bmN0aW9uKGEpe3JldHVybiBhLmp1fSwKIHN0TjpmdW5jdGlvbihhLGIpe2EuanU9dGhpcy5jdChhLEMua3csYS5qdSxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuanUpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuanUpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e0hJOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMudUMuWkwoYSkKIEMudUMuWEkoYSkKQEAgLTE4MzIzLDExICsxODU3NiwxMSBAQAogeT1kPT1udWxsPyIiOkguZChkKQogei5NVy5zZXRBdHRyaWJ1dGUoYix5KX19LAogeTk6ZnVuY3Rpb24oYSl7dmFyIHoKLWZvcig7ej1KLlRtQihhKSx6IT1udWxsO2E9eik7cmV0dXJuIE0ud3AoYSk/YTpudWxsfSwKLXdwOmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKQorZm9yKDt6PUouVG1CKGEpLHohPW51bGw7YT16KTtyZXR1cm4gTS5NUGcoYSk/YTpudWxsfSwKK01QZzpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKIHJldHVybiEhei4kaXNZTnx8ISF6LiRpc0kwfHwhIXouJGlzaHl9LAogZGc6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUKLXo9TS5MbChhLGIpCit6PU0ucE56KGEsYikKIGlmKHo9PW51bGwpej1uZXcgTS5QVyhbXSxudWxsLG51bGwpCiBmb3IoeT1KLlJFKGEpLHg9eS5nUFooYSksdz1udWxsLHY9MDt4IT1udWxsO3g9eC5uZXh0U2libGluZywrK3Ype3U9TS5kZyh4LGIpCiBpZih1PT1udWxsKWNvbnRpbnVlCkBAIC0xODM2MCw3ICsxODYxMyw3IEBACiBpZihhPT1udWxsKXJldHVybn19LAogZlg6ZnVuY3Rpb24oYSxiLGMpe2lmKGM9PW51bGwpcmV0dXJuCiByZXR1cm4gbmV3IE0uaGcoYSxiLGMpfSwKLUxsOmZ1bmN0aW9uKGEsYil7dmFyIHoseQorcE56OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej1KLngoYSkKIGlmKCEhei4kaXNoNClyZXR1cm4gTS5GNShhLGIpCiBpZighIXouJGlzbXcpe3k9Uy5qOShhLnRleHRDb250ZW50LE0uZlgoInRleHQiLGEsYikpCkBAIC0xODQyMSw3ICsxODY3NCw3IEBACiB3aGlsZSghMCl7dz14LmdCKGIpCiBpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiBILnModykKIGlmKCEodjx3KSlicmVhawotYyQwOnt1PWIuQVgodikKK2MkMDp7dT1iLmw4KHYpCiB6PWIuSEgodikKIGlmKHohPW51bGwpe3Q9ei4kMyhkLGMsdSkKIGlmKHU9PT0hMCl5LlUyKHQpCkBAIC0xODQzOSw4ICsxODY5Miw4IEBACiBpZihyIT1udWxsJiYhMClkLnB1c2gocil9di5Weih4KQogaWYoIXouJGlzcWYpcmV0dXJuCiBxPU0uU0IoYSkKLXEuc1EyKGMpCi1wPXEuQTUoYikKK3Euc0N6KGMpCitwPXEuWlooYikKIGlmKHAhPW51bGwmJiEwKWQucHVzaChwKX0sCiBTQjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej0kLmNtKCkKQEAgLTE4NDUxLDExICsxODcwNCwxMSBAQAogdz1KLngoYSkKIGlmKCEhdy4kaXNNaSl4PW5ldyBNLkwxKGEsbnVsbCxudWxsKQogZWxzZSBpZighIXcuJGlzemspeD1uZXcgTS51ZyhhLG51bGwsbnVsbCkKLWVsc2UgaWYoISF3LiRpc0E1KXg9bmV3IE0uVlQoYSxudWxsLG51bGwpCitlbHNlIGlmKCEhdy4kaXNIUil4PW5ldyBNLlZUKGEsbnVsbCxudWxsKQogZWxzZSBpZighIXcuJGlzaDQpe2lmKCEoYS50YWdOYW1lPT09IlRFTVBMQVRFIiYmYS5uYW1lc3BhY2VVUkk9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIpKWlmKCEody5nUWcoYSkuTVcuaGFzQXR0cmlidXRlKCJ0ZW1wbGF0ZSIpPT09ITAmJkMuejUueDQoMCx3LmdxbihhKSk9PT0hMCkpdz1hLnRhZ05hbWU9PT0idGVtcGxhdGUiJiZ3LmdLRChhKT09PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKIGVsc2Ugdz0hMAogZWxzZSB3PSEwCi14PXc/bmV3IE0uRFQobnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSxudWxsLG51bGwpOm5ldyBNLnBxKGEsbnVsbCxudWxsKX1lbHNlIHg9ISF3LiRpc213P25ldyBNLlhUKGEsbnVsbCxudWxsKTpuZXcgTS52eShhLG51bGwsbnVsbCkKK3g9dz9uZXcgTS5EVChudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhLG51bGwsbnVsbCk6bmV3IE0uVjIoYSxudWxsLG51bGwpfWVsc2UgeD0hIXcuJGlzbXc/bmV3IE0uWFQoYSxudWxsLG51bGwpOm5ldyBNLnZ5KGEsbnVsbCxudWxsKQogei51KDAsYSx4KQogcmV0dXJuIHh9LAogQ0Y6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCkBAIC0xODQ2OCw3ICsxODcyMSw3IEBACiAiXiI6ImE7Y0oiLAogVVM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybn0sCiBzdGF0aWM6eyJeIjoiYWMifX0sCi1wcTp7CitWMjp7CiAiXiI6InZ5O3JGLENkLFZ3IiwKIG5SOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdQogej17fQpAQCAtMTg0ODQsOCArMTg3MzcsOCBAQAogaWYodSl7eC5nUWcoeSkuUnooMCx6LmEpCiB4PXouYQogdz1KLlU2KHgpCi16LmE9dy5Oaih4LDAsSi5iSSh3LmdCKHgpLDEpKX1pZihkKXJldHVybiBNLkFEKHRoaXMuZ3JGKCksei5hLHUsYykKLXg9bmV3IE0uSW9aKHosdGhpcyx1KQorei5hPXcuTmooeCwwLEouSG4ody5nQih4KSwxKSl9aWYoZClyZXR1cm4gTS5BRCh0aGlzLmdyRigpLHouYSx1LGMpCit4PW5ldyBNLkJMKHosdGhpcyx1KQogeC4kMShKLm11KGMseCkpfXo9ei5hCiByZXR1cm4gJC5ySz90aGlzLkJ6KHosYyk6Y30sCiBEdDpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscwpAQCAtMTg1MDIsOCArMTg3NTUsOCBAQAogcz1udWxsfXkuc1AoeixhPT1udWxsPyIiOkguZChhKSkKIGlmKHMhPW51bGwmJiFKLnhDKHcuZ1AoeCksdCkpe3k9dy5nUCh4KQogSi50YShzLmd2dCgpLHkpfX0sIiQxIiwiZ2UyIiwyLDAsMjAsNThdfSwKLUlvWjp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKK0JMOnsKKyJeIjoiVHBaOjEzO2EsYixjIiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm4gTS5BRCh0aGlzLmIuZ3JGKCksdGhpcy5hLmEsdGhpcy5jLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNjUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogYjI6ewpAQCAtMTg1MzMsMTQgKzE4Nzg2LDE0IEBACiBpZih6IT1udWxsKXtKLnlkKHopCiB0aGlzLnZ0PW51bGx9fSwKICRpc2IyOnRydWUsCi1zdGF0aWM6eyJeIjoiblMiLHB3OmZ1bmN0aW9uKGEsYixjKXtzd2l0Y2goYyl7Y2FzZSJjaGVja2VkIjpKLkFlKGEsbnVsbCE9YiYmITEhPT1iKQorc3RhdGljOnsiXiI6IlM4IixwdzpmdW5jdGlvbihhLGIsYyl7c3dpdGNoKGMpe2Nhc2UiY2hlY2tlZCI6Si5BZShhLG51bGwhPWImJiExIT09YikKIHJldHVybgotY2FzZSJzZWxlY3RlZEluZGV4IjpKLmRrKGEsTS5oNShiKSkKK2Nhc2Uic2VsZWN0ZWRJbmRleCI6Si5kayhhLE0uRmEoYikpCiByZXR1cm4KIGNhc2UidmFsdWUiOkoudGEoYSxiPT1udWxsPyIiOkguZChiKSkKIHJldHVybn19LElQdDpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKIGlmKCEhei4kaXNRbHQpcmV0dXJuIEguVk0obmV3IFcuSkYoYSxDLmkzLlBoLCExKSxbbnVsbF0pCi1zd2l0Y2goei5ndDUoYSkpe2Nhc2UiY2hlY2tib3giOnJldHVybiAkLkRSKCkuTFgoYSkKK3N3aXRjaCh6Lmd0NShhKSl7Y2FzZSJjaGVja2JveCI6cmV0dXJuICQuRkYoKS5MWChhKQogY2FzZSJyYWRpbyI6Y2FzZSJzZWxlY3QtbXVsdGlwbGUiOmNhc2Uic2VsZWN0LW9uZSI6cmV0dXJuIHouZ0VyKGEpCiBjYXNlInJhbmdlIjppZihKLng1KHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LG5ldyBILlZSKCJUcmlkZW50fE1TSUUiLEgudjQoIlRyaWRlbnR8TVNJRSIsITEsITAsITEpLG51bGwsbnVsbCkpKXJldHVybiB6LmdFcihhKQogYnJlYWt9cmV0dXJuIHouZ0xtKGEpfSxwdDpmdW5jdGlvbihhKXt2YXIgeix5LHgKQEAgLTE4NTUxLDM1ICsxODgwNCwzNSBAQAogcmV0dXJuIHouYWQoeixuZXcgTS5xeChhKSl9ZWxzZXt5PU0ueTkoYSkKIGlmKHk9PW51bGwpcmV0dXJuIEMuZG4KIHg9Si5NSyh5LCJpbnB1dFt0eXBlPVwicmFkaW9cIl1bbmFtZT1cIiIrSC5kKHouZ29jKGEpKSsiXCJdIikKLXJldHVybiB4LmFkKHgsbmV3IE0ueTQoYSkpfX0saDU6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PT0ic3RyaW5nIilyZXR1cm4gSC5CVShhLG51bGwsbmV3IE0uTEcoKSkKK3JldHVybiB4LmFkKHgsbmV3IE0ueTQoYSkpfX0sRmE6ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PT0ic3RyaW5nIilyZXR1cm4gSC5CVShhLG51bGwsbmV3IE0uTEcoKSkKIHJldHVybiB0eXBlb2YgYT09PSJudW1iZXIiJiZNYXRoLmZsb29yKGEpPT09YT9hOjB9fX0sCi1VZmE6ewotIl4iOiJUcDo3MTsiLAorUmFhOnsKKyJeIjoiVHBaOjcyOyIsCiAkMDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKIHo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsKS5hcHBlbmRDaGlsZChXLkVEKG51bGwpKQogeT1KLlJFKHopCiB5LnN0NSh6LCJjaGVja2JveCIpCiB4PVtdCiB3PXkuZ2ZzKHopCi1ILlZNKG5ldyBXLk92KDAsdy5ESyx3LlBoLFcuYUYobmV3IE0ucHAoeCkpLHcuU2cpLFtILktwKHcsMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsdy5ESyx3LlBoLFcuYUYobmV3IE0ucHAoeCkpLHcuU2cpLFtILk9xKHcsMCldKS5aeigpCiB5PXkuZ0VyKHopCi1ILlZNKG5ldyBXLk92KDAseS5ESyx5LlBoLFcuYUYobmV3IE0uaWsoeCkpLHkuU2cpLFtILktwKHksMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAseS5ESyx5LlBoLFcuYUYobmV3IE0uTGZTKHgpKSx5LlNnKSxbSC5PcSh5LDApXSkuWnooKQogeT13aW5kb3cKIHY9ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKQogSi5EaCh2LCJjbGljayIsITAsITAseSwwLDAsMCwwLDAsITEsITEsITEsITEsMCxudWxsKQogei5kaXNwYXRjaEV2ZW50KHYpCi1yZXR1cm4geC5sZW5ndGg9PT0xP0MuVTM6Qy5ObS5ndEgoeCl9LAorcmV0dXJuIHgubGVuZ3RoPT09MT9DLlUzOkMuTm0uZ1R3KHgpfSwKICRpc0VIOnRydWV9LAogcHA6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3RoaXMuYS5wdXNoKEMuVDEpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1pazp7Ci0iXiI6IlRwOjEzO2IiLAorTGZTOnsKKyJeIjoiVHBaOjEzO2IiLAogJDE6W2Z1bmN0aW9uKGEpe3RoaXMuYi5wdXNoKEMuVTMpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBxeDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT1KLngoYSkKQEAgLTE4NTkxLDIwICsxODg0NCwyMCBAQAogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiB5NDp7Ci0iXiI6IlRwOjEzO2IiLAorIl4iOiJUcFo6MTM7YiIsCiAkMTpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKIHJldHVybiF6Lm4oYSx0aGlzLmIpJiZ6LmdNQihhKT09bnVsbH0sCiAkaXNFSDp0cnVlfSwKIExHOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gMH0sCiAkaXNFSDp0cnVlfSwKIEwxOnsKLSJeIjoicHE7ckYsQ2QsVnciLAorIl4iOiJWMjtyRixDZCxWdyIsCiBnckY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yRn0sCiBuUjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgKIHo9Si54KGIpCi1pZighei5uKGIsInZhbHVlIikmJiF6Lm4oYiwiY2hlY2tlZCIpKXJldHVybiBNLnBxLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKK2lmKCF6Lm4oYiwidmFsdWUiKSYmIXoubihiLCJjaGVja2VkIikpcmV0dXJuIE0uVjIucHJvdG90eXBlLm5SLmNhbGwodGhpcyx0aGlzLGIsYyxkKQogSi5Wcyh0aGlzLnJGKS5SeigwLGIpCiBpZihkKXtNLnB3KHRoaXMuckYsYyxiKQogcmV0dXJufXo9dGhpcy5yRgpAQCAtMTg2MzIsOSArMTg4ODUsOSBAQAogaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKWNvbnNvbGUuZXJyb3IoeikKIHJldHVybn0sCiBWejpmdW5jdGlvbihhKXt9LAotZ0NuOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuVncKK2dtU0E6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5WdwogaWYoeiE9bnVsbCk7ZWxzZSBpZihKLkxwKHRoaXMuZ3JGKCkpIT1udWxsKXt6PUouTHAodGhpcy5nckYoKSkKLXo9Si5mZSghIUoueCh6KS4kaXN2eT96Ok0uU0IoeikpfWVsc2Ugej1udWxsCit6PUoucWIoISFKLngoeikuJGlzdnk/ejpNLlNCKHopKX1lbHNlIHo9bnVsbAogcmV0dXJuIHp9LAogQno6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PXRoaXMuQ2QKQEAgLTE4NjQ0LDE1ICsxODg5NywxNSBAQAogdGhpcy5DZC51KDAsYSxiKQogcmV0dXJuIGJ9LAogJGlzdnk6dHJ1ZX0sCi1ESDp7Cit6ZTp7CiAiXiI6ImE7azg+LEVBLFBvIn0sCiB1Zzp7Ci0iXiI6InBxO3JGLENkLFZ3IiwKKyJeIjoiVjI7ckYsQ2QsVnciLAogZ3JGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuckZ9LAogblI6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4CiBpZihKLnhDKGIsInNlbGVjdGVkaW5kZXgiKSliPSJzZWxlY3RlZEluZGV4Igogej1KLngoYikKLWlmKCF6Lm4oYiwic2VsZWN0ZWRJbmRleCIpJiYhei5uKGIsInZhbHVlIikpcmV0dXJuIE0ucHEucHJvdG90eXBlLm5SLmNhbGwodGhpcyx0aGlzLGIsYyxkKQoraWYoIXoubihiLCJzZWxlY3RlZEluZGV4IikmJiF6Lm4oYiwidmFsdWUiKSlyZXR1cm4gTS5WMi5wcm90b3R5cGUublIuY2FsbCh0aGlzLHRoaXMsYixjLGQpCiBKLlZzKHRoaXMuckYpLlJ6KDAsYikKIGlmKGQpe00ucHcodGhpcy5yRixjLGIpCiByZXR1cm59ej10aGlzLnJGCkBAIC0xODY2MiwyMyArMTg5MTUsMjMgQEAKIE0ucHcoeixKLm11KHkudnQseCksYikKIHJldHVybiB0aGlzLkJ6KGIseSl9fSwKIERUOnsKLSJeIjoicHE7UTI/LG5GLG9zPCx4VSxxND8sQng/LE01PyxsZSxWWixxOCxyRixDZCxWdyIsCisiXiI6IlYyO0N6PyxuRixvczwseFUscTQ/LEJ4PyxNNT8sbGUsVloscTgsckYsQ2QsVnciLAogZ3JGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuckZ9LAogblI6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoKLWlmKCFKLnhDKGIsInJlZiIpKXJldHVybiBNLnBxLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKK2lmKCFKLnhDKGIsInJlZiIpKXJldHVybiBNLlYyLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKIHo9ZD9jOkoubXUoYyxuZXcgTS5waSh0aGlzKSkKIEouVnModGhpcy5yRikuTVcuc2V0QXR0cmlidXRlKCJyZWYiLHopCiB0aGlzLmFYKCkKIGlmKGQpcmV0dXJuCiByZXR1cm4gdGhpcy5CeigicmVmIixjKX0sCi1BNTpmdW5jdGlvbihhKXt2YXIgej10aGlzLm9zCitaWjpmdW5jdGlvbihhKXt2YXIgej10aGlzLm9zCiBpZih6IT1udWxsKXouTkMoKQogaWYoYS5xZD09bnVsbCYmYS5mdT09bnVsbCYmYS5jdz09bnVsbCl7ej10aGlzLm9zCiBpZih6IT1udWxsKXt6LnhPKDApCiB0aGlzLm9zPW51bGx9cmV0dXJufXo9dGhpcy5vcwogaWYoej09bnVsbCl7ej1uZXcgTS5hWSh0aGlzLFtdLFtdLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwpCi10aGlzLm9zPXp9ei5kRShhLHRoaXMuUTIpCi1KLlpnKCQucFQoKSx0aGlzLnJGLFsicmVmIl0sITApCit0aGlzLm9zPXp9ei5kRShhLHRoaXMuQ3opCitKLlpXKCQuaWsoKSx0aGlzLnJGLFsicmVmIl0sITApCiByZXR1cm4gdGhpcy5vc30sCiBaSzpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGsKIGlmKGM9PW51bGwpYz10aGlzLm5GCkBAIC0xODY4NiwxNSArMTg5MzksMTUgQEAKIGlmKHo9PW51bGwpe3o9dGhpcy5nTksoKQogej1KLk5RKCEhSi54KHopLiRpc3Z5P3o6TS5TQih6KSkKIHRoaXMucTg9en15PUouUkUoeikKLWlmKHkuZ1BaKHopPT1udWxsKXJldHVybiAkLkU3KCkKLXg9Yz09bnVsbD8kLkhUKCk6YworaWYoeS5nUFooeik9PW51bGwpcmV0dXJuICQuemwoKQoreD1jPT1udWxsPyQuREgoKTpjCiB3PXguY0oKIGlmKHc9PW51bGwpe3c9SC5WTShuZXcgUC5xbyhudWxsKSxbbnVsbF0pCiB4LmNKPXd9dj13LnQoMCx6KQogaWYodj09bnVsbCl7dj1NLmRnKHoseCkKIHguY0oudSgwLHosdil9dz10aGlzLmxlCiBpZih3PT1udWxsKXt1PUouRG8odGhpcy5yRikKLXc9JC5teCgpCit3PSQudEYoKQogdD13LnQoMCx1KQogaWYodD09bnVsbCl7dD11LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikKICQuS3MoKS51KDAsdCwhMCkKQEAgLTE4NzA3LDcgKzE4OTYwLDcgQEAKIHIuQ2k9dGhpcy5yRgogci5DMD16CiBxLnUoMCxzLHIpCi1wPW5ldyBNLkRIKGIsbnVsbCxudWxsKQorcD1uZXcgTS56ZShiLG51bGwsbnVsbCkKIE0uU0Iocykuc1Z3KHApCiBmb3Iobz15LmdQWih6KSx6PXYhPW51bGwsbj0wLG09ITE7byE9bnVsbDtvPW8ubmV4dFNpYmxpbmcsKytuKXtpZihvLm5leHRTaWJsaW5nPT1udWxsKW09ITAKIGw9ej92LkpXKG4pOm51bGwKQEAgLTE4NzE4LDcgKzE4OTcxLDcgQEAKIHIuQzA9bnVsbAogci5DaT1udWxsCiByZXR1cm4gc30sCi1nazg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUTJ9LAorZ2s4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkN6fSwKIGdHNTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5uRn0sCiBzRzU6ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYodGhpcy5uRiE9bnVsbCl0aHJvdyBILmIoUC53KCJUZW1wbGF0ZSBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIGEgbmV3IGJpbmRpbmdEZWxlZ2F0ZSBjYW4gYmUgYXNzaWduZWQiKSkKQEAgLTE4NzM5LDcgKzE4OTkyLDcgQEAKIHRoaXMub3MuSW8obnVsbCkKIHRoaXMub3MudnIobnVsbCl9LAogVjE6ZnVuY3Rpb24oYSl7dmFyIHoseQotdGhpcy5RMj1udWxsCit0aGlzLkN6PW51bGwKIHRoaXMubkY9bnVsbAogej10aGlzLkNkCiBpZih6IT1udWxsKXt5PXouUnooMCwicmVmIikKQEAgLTE4Nzk0LDcgKzE5MDQ3LDcgQEAKIHJldHVybiEwfSwKIEdDOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYnQobnVsbCl9LAogJGlzRFQ6dHJ1ZSwKLXN0YXRpYzp7Il4iOiJtbixFVyxZTyx2VSx4VixrWSIsVEE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKK3N0YXRpYzp7Il4iOiJtbix2MixZTyx2VSx4Vixqb0siLFRBOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PUouRG8oYSkKIGlmKFcuUHYoei5kZWZhdWx0Vmlldyk9PW51bGwpcmV0dXJuIHoKIHk9JC5MUSgpLnQoMCx6KQpAQCAtMTg4MDQsNyArMTkwNTcsNyBAQAogej1KLlJFKGEpCiB5PXouZ00wKGEpLmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIixudWxsKQogei5nQnkoYSkuaW5zZXJ0QmVmb3JlKHksYSkKLWZvcih4PXouZ1FnKGEpLHg9Qy5ObS5icih4Lmd2Yyh4KSkseD1ILlZNKG5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKSxbSC5LcCh4LDApXSk7eC5HKCk7KXt3PXgubG8KK2Zvcih4PXouZ1FnKGEpLHg9Qy5ObS5icih4Lmd2Yyh4KSkseD1ILlZNKG5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKSxbSC5PcSh4LDApXSk7eC5HKCk7KXt3PXgubG8KIHN3aXRjaCh3KXtjYXNlInRlbXBsYXRlIjp2PXouZ1FnKGEpLk1XCiB2LmdldEF0dHJpYnV0ZSh3KQogdi5yZW1vdmVBdHRyaWJ1dGUodykKQEAgLTE4ODM1LDI2ICsxOTA4OCwyNiBAQAogSi5PNSh6LGRvY3VtZW50LmJhc2VVUkkpCiBKLm01KGEpLmFwcGVuZENoaWxkKHopfX19LAogcGk6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQogSi5Wcyh6LnJGKS5NVy5zZXRBdHRyaWJ1dGUoInJlZiIsYSkKLXouYVgoKX0sIiQxIixudWxsLDIsMCxudWxsLDIxNSwiY2FsbCJdLAorei5hWCgpfSwiJDEiLG51bGwsMiwwLG51bGwsMjE5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHlpOnsKLSJeIjoiVHA6MjA7IiwKKyJeIjoiVHBaOjIwOyIsCiAkMTpmdW5jdGlvbihhKXtpZighTS5TQihhKS5idChudWxsKSlNLkdNKEouTlEoISFKLngoYSkuJGlzdnk/YTpNLlNCKGEpKSl9LAogJGlzRUg6dHJ1ZX0sCi1NZFE6ewotIl4iOiJUcDoxMzsiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSkrIlt0ZW1wbGF0ZV0ifSwiJDEiLG51bGwsMiwwLG51bGwsMTMwLCJjYWxsIl0sCi0kaXNFSDp0cnVlfSwKLURPZTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpbZnVuY3Rpb24oYSxiKXt2YXIgegotZm9yKHo9Si5tWShhKTt6LkcoKTspTS5TQihKLmwyKHouZ2woKSkpLmFYKCl9LCIkMiIsbnVsbCw0LDAsbnVsbCwxNzEsMTQsImNhbGwiXSwKK1lKRzp7CisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSkrIlt0ZW1wbGF0ZV0ifSwiJDEiLG51bGwsMiwwLG51bGwsMTMxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGxQYTp7Ci0iXiI6IlRwOjcxOyIsCisiXiI6IlRwWjo4MDsiLAorJDI6W2Z1bmN0aW9uKGEsYil7dmFyIHoKK2Zvcih6PUoubVkoYSk7ei5HKCk7KU0uU0IoSi5sMih6LmdsKCkpKS5hWCgpfSwiJDIiLG51bGwsNCwwLG51bGwsMTczLDE0LCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK1VmYTp7CisiXiI6IlRwWjo3MjsiLAogJDA6ZnVuY3Rpb24oKXt2YXIgej1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKICQudkgoKS51KDAseixuZXcgTS5GaShbXSxudWxsLG51bGwsbnVsbCkpCiByZXR1cm4gen0sCkBAIC0xODg2MiwxMSArMTkxMTUsMTEgQEAKIEZpOnsKICJeIjoiYTt1MjwsUW88LENpPCxDMDwifSwKIGhnOnsKLSJeIjoiVHA6MTM7YSxiLGMiLAorIl4iOiJUcFo6MTM7YSxiLGMiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYy5VUyhhLHRoaXMuYSx0aGlzLmIpfSwKICRpc0VIOnRydWV9LAogVWs6ewotIl4iOiJUcDo3OTthLGIsYyxkIiwKKyJeIjoiVHBaOjgwO2EsYixjLGQiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdwogZm9yKDt6PUouVTYoYSksSi54Qyh6LnQoYSwwKSwiXyIpOylhPXoueW4oYSwxKQogaWYodGhpcy5kKXo9ei5uKGEsImJpbmQiKXx8ei5uKGEsImlmIil8fHoubihhLCJyZXBlYXQiKQpAQCAtMTg4ODIsNyArMTkxMzUsNyBAQAogei5wdXNoKHkpfX0sCiAkaXNFSDp0cnVlfSwKIGFZOnsKLSJeIjoiWWo7WVMsUmosdnksUzYsa3ksdkwsd0MsRDIsY00scWUsdXIsVkMsV3YsZVksVEMiLAorIl4iOiJZajtZUyxSaix2eSxTNixreSx2TCx3QyxEMix0cyxxZSx1cixWQyxXdixlWSxUQyIsCiBSVjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lWS4kMShhKX0sCiBUUjpmdW5jdGlvbihhLGIpe3JldHVybiBILnZoKFAudygiYmluZGluZyBhbHJlYWR5IG9wZW5lZCIpKX0sCiBnUDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53Q30sCkBAIC0xODkwMCwxMiArMTkxNTMsMTIgQEAKIHk9YS5xZAogeD15IT1udWxsCiB0aGlzLkQyPXgKLXRoaXMuY009YS5jdyE9bnVsbAordGhpcy50cz1hLmN3IT1udWxsCiBpZih4KXt0aGlzLnFlPXkud0QKIHk9TS5vTygiaWYiLHkseixiKQogdGhpcy52TD15CiBpZih0aGlzLnFlPT09ITApe2lmKCEobnVsbCE9eSYmITEhPT15KSl7dGhpcy52cihudWxsKQotcmV0dXJufX1lbHNlIEguR28oeSwiJGlzWWoiKS5UUigwLHRoaXMuZ050KCkpfWlmKHRoaXMuY009PT0hMCl7eT1hLmN3CityZXR1cm59fWVsc2UgSC5Hbyh5LCIkaXNZaiIpLlRSKDAsdGhpcy5nTnQoKSl9aWYodGhpcy50cz09PSEwKXt5PWEuY3cKIHRoaXMudXI9eS53RAogeT1NLm9PKCJyZXBlYXQiLHkseixiKQogdGhpcy53Qz15fWVsc2V7eT1hLmZ1CkBAIC0xODkxOSw3ICsxOTE3Miw3IEBACiB6PXouZ1Aoeil9aWYoIShudWxsIT16JiYhMSE9PXopKXt0aGlzLklvKFtdKQogcmV0dXJufX15PXRoaXMud0MKIGlmKHRoaXMudXIhPT0hMCl7SC5Hbyh5LCIkaXNZaiIpCi15PXkuZ1AoeSl9dGhpcy5Jbyh0aGlzLmNNIT09ITA/W3ldOnkpfSwiJDEiLCJnTnQiLDIsMCwyMCwxNF0sCit5PXkuZ1AoeSl9dGhpcy5Jbyh0aGlzLnRzIT09ITA/W3ldOnkpfSwiJDEiLCJnTnQiLDIsMCwyMCwxNF0sCiBJbzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PUoueChhKQogaWYoIXouJGlzV08pYT0hIXouJGlzUVY/ei5icihhKTpbXQpAQCAtMTg5MjcsMTAgKzE5MTgwLDEwIEBACiBpZihhPT09eilyZXR1cm4KIHRoaXMuS2UoKQogdGhpcy5TNj1hCi1pZighIUoueChhKS4kaXN3biYmdGhpcy5jTT09PSEwJiZ0aGlzLnVyIT09ITApe2lmKGEuZ2IzKCkhPW51bGwpYS5zYjMoW10pCitpZighIUoueChhKS4kaXN3biYmdGhpcy50cz09PSEwJiZ0aGlzLnVyIT09ITApe2lmKGEuZ2IzKCkhPW51bGwpYS5zYjMoW10pCiB0aGlzLlZDPWEuZ1FWKCkueUkodGhpcy5nVTAoKSl9eT10aGlzLlM2CiB5PXkhPW51bGw/eTpbXQotdGhpcy5WaShHLmpqKHksMCxKLnE4KHkpLHosMCx6Lmxlbmd0aCkpfSwKK3RoaXMubHcoRy5qaih5LDAsSi5xOCh5KSx6LDAsei5sZW5ndGgpKX0sCiB4UzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogaWYoSi54QyhhLC0xKSlyZXR1cm4gdGhpcy5ZUy5yRgogej0kLnZIKCkKQEAgLTE4OTQzLDcgKzE5MTk2LDcgQEAKIGlmKHc9PW51bGwpcmV0dXJuIHgKIHJldHVybiB3LnhTKHcuUmoubGVuZ3RoLTEpfSwKIG5lOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0Ci16PXRoaXMueFMoSi5iSShhLDEpKQorej10aGlzLnhTKEouSG4oYSwxKSkKIHk9dGhpcy54UyhhKQogSi5UbUIodGhpcy5ZUy5yRikKIHg9Qy5ObS5XNCh0aGlzLlJqLGEpCkBAIC0xODk1Miw3ICsxOTIwNSw3IEBACiB0PXUucGFyZW50Tm9kZQogaWYodCE9bnVsbCl0LnJlbW92ZUNoaWxkKHUpCiB3Lm14KHgsdSl9cmV0dXJuIHh9LAotVmk6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlCitsdzpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUKIGlmKHRoaXMua3l8fEouRk4oYSk9PT0hMClyZXR1cm4KIHU9dGhpcy5ZUwogdD11LnJGCkBAIC0xODk2NywxNCArMTkyMjAsMTQgQEAKIGZvcihwPUoudzEoYSksbz1wLmdBKGEpLG49MDtvLkcoKTspe209by5nbCgpCiBmb3IobD1tLmdSdCgpLGw9bC5nQShsKSxrPUouUkUobSk7bC5HKCk7KXtqPWwubG8KIGk9dGhpcy5uZShKLmV3KGsuZ3ZIKG0pLG4pKQotaWYoIUoueEMoaSwkLkU3KCkpKXEudSgwLGosaSl9bD1tLmdOZygpCitpZighSi54QyhpLCQuemwoKSkpcS51KDAsaixpKX1sPW0uZ05nKCkKIGlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIEgucyhsKQogbi09bH1mb3IocD1wLmdBKGEpO3AuRygpOyl7bT1wLmdsKCkKIGZvcihvPUouUkUobSksaD1vLmd2SChtKTtKLnU2KGgsSi5ldyhvLmd2SChtKSxtLmdOZygpKSk7KytoKXtpZihoPj4+MCE9PWh8fGg+PXMubGVuZ3RoKXJldHVybiBILmUocyxoKQogeT1zW2hdCiB4PXEuUnooMCx5KQogaWYoeD09bnVsbCl0cnl7aWYodGhpcy5lWSE9bnVsbCl5PXRoaXMuUlYoeSkKLWlmKHk9PW51bGwpeD0kLkU3KCkKK2lmKHk9PW51bGwpeD0kLnpsKCkKIGVsc2UgeD11LlpLKDAseSx6KX1jYXRjaChnKXtsPUguUnUoZykKIHc9bAogdj1uZXcgSC5YTyhnLG51bGwpCkBAIC0xODk4NSwxOSArMTkyMzgsMTkgQEAKIGlmKGs9PW51bGwpSC52aChQLnUoIkVycm9yIG11c3Qgbm90IGJlIG51bGwiKSkKIGlmKGwuR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKIGwuQ0coayx2KQoteD0kLkU3KCl9bD14Cit4PSQuemwoKX1sPXgKIGY9dGhpcy54UyhoLTEpCiBlPUouVG1CKHUuckYpCiBDLk5tLnhlKHRoaXMuUmosaCxsKQotZS5pbnNlcnRCZWZvcmUobCxKLnA3KGYpKX19Zm9yKHU9cS5nVVEocSksdT1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh1Lmw2KSx1LlQ2KSxbSC5LcCh1LDApLEguS3AodSwxKV0pO3UuRygpOyl0aGlzLkVwKHUubG8pfSwiJDEiLCJnVTAiLDIsMCwyMTYsMjE3XSwKK2UuaW5zZXJ0QmVmb3JlKGwsSi5wNyhmKSl9fWZvcih1PXEuZ1VRKHEpLHU9SC5WTShuZXcgSC5NSChudWxsLEoubVkodS5sNiksdS5UNiksW0guT3EodSwwKSxILk9xKHUsMSldKTt1LkcoKTspdGhpcy5FcCh1LmxvKX0sIiQxIiwiZ1UwIiwyLDAsMjIwLDIyMV0sCiBFcDpbZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PSQudkgoKQogei50b1N0cmluZwogeT1ILm9mKGEsImV4cGFuZG8kdmFsdWVzIikKIHg9KHk9PW51bGw/bnVsbDpILm9mKHksei5KNCgpKSkuZ3UyKCkKIHo9bmV3IEguYTcoeCx4Lmxlbmd0aCwwLG51bGwpCi16LiRidWlsdGluVHlwZUluZm89W0guS3AoeCwwKV0KLWZvcig7ei5HKCk7KUoueWQoei5sbyl9LCIkMSIsImdNUiIsMiwwLDIxOF0sCit6LiRidWlsdGluVHlwZUluZm89W0guT3EoeCwwKV0KK2Zvcig7ei5HKCk7KUoueWQoei5sbyl9LCIkMSIsImdNUiIsMiwwLDIyMl0sCiBLZTpmdW5jdGlvbigpe3ZhciB6PXRoaXMuVkMKIGlmKHo9PW51bGwpcmV0dXJuCiB6LmVkKCkKQEAgLTE5MDIzLDEwICsxOTI3NiwxMCBAQAogdXg6W2Z1bmN0aW9uKGEpe3ZhciB6PWE9PW51bGw/IiI6SC5kKGEpCiBKLnQzKHRoaXMuckYseil9LCIkMSIsImdtdCIsMiwwLDEzLDIxXX0sCiBWVDp7Ci0iXiI6InBxO3JGLENkLFZ3IiwKKyJeIjoiVjI7ckYsQ2QsVnciLAogZ3JGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuckZ9LAogblI6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4Ci1pZighSi54QyhiLCJ2YWx1ZSIpKXJldHVybiBNLnBxLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKK2lmKCFKLnhDKGIsInZhbHVlIikpcmV0dXJuIE0uVjIucHJvdG90eXBlLm5SLmNhbGwodGhpcyx0aGlzLGIsYyxkKQogSi5Wcyh0aGlzLnJGKS5SeigwLGIpCiBpZihkKXtNLnB3KHRoaXMuckYsYyxiKQogcmV0dXJufXo9dGhpcy5yRgpAQCAtMTkwMzYsNyArMTkyODksNyBAQAogTS5wdyh6LEoubXUoeS52dCx4KSxiKQogcmV0dXJuICQucks/dGhpcy5CeihiLHkpOnl9fX1dLFsidGVtcGxhdGVfYmluZGluZy5zcmMubXVzdGFjaGVfdG9rZW5zIiwicGFja2FnZTp0ZW1wbGF0ZV9iaW5kaW5nL3NyYy9tdXN0YWNoZV90b2tlbnMuZGFydCIsLFMsewogIl4iOiIiLAotYWI6eworamI6ewogIl4iOiJhO2lCLHdEPCxVViIsCiBncXo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pQi5sZW5ndGg9PT01fSwKIGdhVzpmdW5jdGlvbigpe3ZhciB6LHkKQEAgLTE5MDQ5LDcgKzE5MzAyLDcgQEAKIGdFTzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlVWfSwKIHFtOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdFTygpLiQxKGEpfSwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiBDLmpuLmNVKHRoaXMuaUIubGVuZ3RoLDQpfSwKLUFYOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK2w4OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5pQgogeT1hKjQrMQogaWYoeT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LHkpCkBAIC0xOTA3Miw3ICsxOTMyNSw3IEBACiB4PXoubGVuZ3RoCiB3PUMuam4uY1UoeCw0KSo0CiBpZih3Pj14KXJldHVybiBILmUoeix3KQotcmV0dXJuIHkrSC5kKHpbd10pfSwiJDEiLCJnZWIiLDIsMCwyMTksMjFdLAorcmV0dXJuIHkrSC5kKHpbd10pfSwiJDEiLCJnZWIiLDIsMCwyMjMsMjFdLAogWGI6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9dGhpcy5pQgogaWYoMD49ei5sZW5ndGgpcmV0dXJuIEguZSh6LDApCkBAIC0xOTA4Myw3ICsxOTMzNiw3IEBACiB0PXYqNAogaWYodD49ei5sZW5ndGgpcmV0dXJuIEguZSh6LHQpCiBzPXpbdF0KLXkudk0rPXR5cGVvZiBzPT09InN0cmluZyI/czpILmQocyl9cmV0dXJuIHkudk19LCIkMSIsImdxdCIsMiwwLDIyMCwyMjFdLAoreS52TSs9dHlwZW9mIHM9PT0ic3RyaW5nIj9zOkguZChzKX1yZXR1cm4geS52TX0sIiQxIiwiZ3F0IiwyLDAsMjI0LDIyNV0sCiBsMzpmdW5jdGlvbihhLGIpe3RoaXMuVVY9dGhpcy5pQi5sZW5ndGg9PT01P3RoaXMuZ2ViKCk6dGhpcy5ncXQoKX0sCiBzdGF0aWM6eyJeIjoicno1LHhOOCx0M2EsZXBHLG9NLEZ0ZyIsajk6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtCiBpZihhPT1udWxsfHxhLmxlbmd0aD09PTApcmV0dXJuCkBAIC0xOTEwOCwxOCArMTkzNjEsMTggQEAKIGVsc2Ugdy5wdXNoKG51bGwpCiB3LnB1c2gobSkKIHY9bysyfWlmKHY9PT16KXcucHVzaCgiIikKLXk9bmV3IFMuYWIodyx1LG51bGwpCit5PW5ldyBTLmpiKHcsdSxudWxsKQogeS5sMyh3LHUpCiByZXR1cm4geX19fX1dLFsidm1fY29ubmVjdF9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvdm1fY29ubmVjdC5kYXJ0IiwsVix7CiAiXiI6IiIsCiBQYTp7Ci0iXiI6IlY1MjtQNSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY1MjtQNSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnTjpmdW5jdGlvbihhKXtyZXR1cm4gYS5QNX0sCiBzTjpmdW5jdGlvbihhLGIpe2EuUDU9dGhpcy5jdChhLEMuZnQsYS5QNSxiKX0sCiBnaFM6ZnVuY3Rpb24oYSl7dmFyIHo9YS5QNQogaWYoej09bnVsbClyZXR1cm4hMQogcmV0dXJuIHouZ0E5KCl9LAotZ25JOmZ1bmN0aW9uKGEpe3ZhciB6PSQubWYuRWgKK2duSTpmdW5jdGlvbihhKXt2YXIgej0kLktoLkVoCiBpZih6PT1udWxsKXJldHVybiExCiByZXR1cm4gSi54QyhILkdvKHosIiRpc0tNIikuTixhLlA1KX0sCiB4WDpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcKQEAgLTE5MTI4LDM5ICsxOTM4MSwzOSBAQAogaWYodHlwZW9mIHkhPT0ibnVtYmVyIilyZXR1cm4geS5EKCkKIGlmKHk+MHx8ei5nTmwoYik9PT0hMHx8ei5nRVgoYik9PT0hMHx8ei5ncXgoYik9PT0hMHx8ei5nWUsoYik9PT0hMClyZXR1cm4KIHouZTYoYikKLXg9JC5tZi5FaAotaWYoeD09bnVsbHx8IUoueEMoSi5sMih4KSxhLlA1KSl7ej0kLm1mCit4PSQuS2guRWgKK2lmKHg9PW51bGx8fCFKLnhDKEoubDIoeCksYS5QNSkpe3o9JC5LaAogeT1hLlA1CiB5PW5ldyBVLktNKEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkseSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVS5VMiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLDAsbnVsbCwidW5rbm93biIsInVua25vd24iLDAsITEsITEsIiIsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsRC5hZiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYnYpLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiB5Lkx3KCkKIHouc3d2KDAseSl9dz1KLlZzKGQpLk1XLmdldEF0dHJpYnV0ZSgiaHJlZiIpCi0kLm1mLlo2LmJvKDAsdyl9LCIkMyIsImdrRCIsNiwwLDE2MSwyLDEwMiwxNzRdLAorJC5LaC5aNi5ibygwLHcpfSwiJDMiLCJna0QiLDYsMCwxNjMsMiwxMDMsMTc2XSwKIE1lQjpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcKLXo9JC5tZi5tMgorej0kLktoLm0yCiB5PWEuUDUKIHg9ei5qWQogeC5SeigwLHkpCiB6LlhUKCkKIHouWFQoKQogdz16Lnd1LklVKyIuaGlzdG9yeSIKLSQuVnkoKS5zZXRJdGVtKHcsQy54ci5LUCh4KSl9LCIkMyIsImdBUyIsNiwwLDE2MSwyLDEwMiwxNzRdLAorJC5WeSgpLnNldEl0ZW0odyxDLnhyLktQKHgpKX0sIiQzIiwiZ0FTIiw2LDAsMTYzLDIsMTAzLDE3Nl0sCiBzdGF0aWM6e2ZYeDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLlphLlpMKGEpCi1DLlphLlhJKGEpCitDLko1Ny5aTChhKQorQy5KNTcuWEkoYSkKIHJldHVybiBhfX19LAogVjUyOnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogRDI6ewotIl4iOiJWNTM7b3QsWUUsbHIsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNTM7b3QsWUUsbHIsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3ZtOmZ1bmN0aW9uKGEpe3JldHVybiBhLm90fSwKIHN2bTpmdW5jdGlvbihhLGIpe2Eub3Q9dGhpcy5jdChhLEMudVgsYS5vdCxiKX0sCiBnSEw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWUV9LApAQCAtMTkxNzMsMTcgKzE5NDI2LDE3IEBACiBueTpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4CiBKLktyKGIpCiB6PXRoaXMuS2woYSxhLm90KQotZD0kLm1mLm0yLlRQKHopCi15PSQubWYKK2Q9JC5LaC5tMi5UUCh6KQoreT0kLktoCiB4PW5ldyBVLktNKEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksZCxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVS5VMiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLDAsbnVsbCwidW5rbm93biIsInVua25vd24iLDAsITEsITEsIiIsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsRC5hZiksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYnYpLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiB4Lkx3KCkKIHkuc3d2KDAseCkKLSQubWYuWjYuYm8oMCwiIy92bSIpfSwiJDMiLCJnTXQiLDYsMCwxMTEsMSwxMDIsMTAzXSwKKyQuS2guWjYuYm8oMCwiIy92bSIpfSwiJDMiLCJnTXQiLDYsMCwxMTIsMSwxMDMsMTA0XSwKIHFmOltmdW5jdGlvbihhLGIsYyxkKXtKLktyKGIpCi10aGlzLlZmKGEpfSwiJDMiLCJnekciLDYsMCwxMTEsMSwxMDIsMTAzXSwKK3RoaXMuVmYoYSl9LCIkMyIsImd6RyIsNiwwLDExMiwxLDEwMywxMDRdLAogVmY6ZnVuY3Rpb24oYSl7Ry5GSShhLllFKS5tbChuZXcgVi5WbihhKSkuT0EobmV3IFYub1UoYSkpfSwKIEtxOmZ1bmN0aW9uKGEpe3ZhciB6PVAuaWkoMCwwLDAsMCwwLDEpCi1hLmRpPXRoaXMuY3QoYSxDLk85LGEuZGkseil9LAorYS50Qj10aGlzLmN0KGEsQy5POSxhLnRCLHopfSwKIHN0YXRpYzp7Tkk6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PVEuY2gobnVsbCxVLlo1KQogeT1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKQEAgLTE5MTkyLDEwICsxOTQ0NSwxMCBAQAogYS5vdD0iIgogYS5ZRT0ibG9jYWxob3N0OjkyMjIiCiBhLmxyPXoKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9eQorYS5vRz0hMQorYS5aTT15CiBhLlpRPXgKIEMuaGouWkwoYSkKIEMuaGouWEkoYSkKQEAgLTE5MjA1LDcgKzE5NDU4LDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogVm46ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuYQogSi5aOCh6LmxyKQpAQCAtMTkyMTYsNDQgKzE5NDY5LDQ0IEBACiBpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiBILnModykKIGlmKCEoeDx3KSlicmVhawogYyQwOntpZih5LnQoYSx4KS5ndzgoKT09bnVsbClicmVhayBjJDAKLUouYmkoei5scix5LnQoYSx4KSl9Kyt4fX0sIiQxIixudWxsLDIsMCxudWxsLDIyMiwiY2FsbCJdLAorSi5iaSh6LmxyLHkudChhLHgpKX0rK3h9fSwiJDEiLG51bGwsMiwwLG51bGwsMjI2LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG9VOnsKLSJeIjoiVHA6MTM7YiIsCisiXiI6IlRwWjoxMztiIiwKICQxOltmdW5jdGlvbihhKXtKLlo4KHRoaXMuYi5scil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsidm1fcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy92bV9yZWYuZGFydCIsLFgsewogIl4iOiIiLAogSTU6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7dkM6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy52QS5aTChhKQogQy52QS5YSShhKQogcmV0dXJuIGF9fX19XSxbInZtX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3ZtX3ZpZXcuZGFydCIsLFUsewogIl4iOiIiLAogZWw6ewotIl4iOiJWNTQ7dUIsbGMsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNTQ7dUIsbGMsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ3d2OmZ1bmN0aW9uKGEpe3JldHVybiBhLnVCfSwKIHN3djpmdW5jdGlvbihhLGIpe2EudUI9dGhpcy5jdChhLEMuUkosYS51QixiKX0sCiBna2M6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubGN9LAogc2tjOmZ1bmN0aW9uKGEsYil7YS5sYz10aGlzLmN0KGEsQy55aCxhLmxjLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS51QikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS51QikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7b0g6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5kbS5aTChhKQogQy5kbS5YSShhKQpAQCAtMTkzMjIsMTYgKzE5NTc1LDE2IEBACiBVLnpYLiRpc3pYPXRydWUKIFUuelguJGlzSXA9dHJ1ZQogVS56WC4kaXNhPXRydWUKLVUueDkuJGlzSXA9dHJ1ZQotVS54OS4kaXNhPXRydWUKK1UuclguJGlzSXA9dHJ1ZQorVS5yWC4kaXNhPXRydWUKIFUuRU8uJGlzRU89dHJ1ZQogVS5FTy4kaXNJcD10cnVlCiBVLkVPLiRpc2E9dHJ1ZQotUC5HRC4kaXNHRD10cnVlCi1QLkdELiRpc2E9dHJ1ZQorUC5JTi4kaXNJTj10cnVlCitQLklOLiRpc2E9dHJ1ZQogUC51cS4kaXN1cT10cnVlCiBQLnVxLiRpc2E9dHJ1ZQotTi5Sdy4kaXNhPXRydWUKK04uVEouJGlzYT10cnVlCiBULnlqLiRpc3lqPXRydWUKIFQueWouJGlzYT10cnVlCiBXLnRWLiRpc2g0PXRydWUKQEAgLTE5MzU1LDYgKzE5NjA4LDggQEAKIEQudk8uJGlzWjA9dHJ1ZQogRC52Ty4kYXNaMD1bbnVsbCxudWxsXQogRC52Ty4kaXNhPXRydWUKK0QuS3AuJGlzYWY9dHJ1ZQorRC5LcC4kaXNhPXRydWUKIEQuUTQuJGlzYT10cnVlCiBELkRiLiRpc2E9dHJ1ZQogRC5VNC4kaXNhZj10cnVlCkBAIC0xOTM3OSw4ICsxOTYzNCw4IEBACiBQLmEyLiRpc2EyPXRydWUKIFAuYTIuJGlzYT10cnVlCiBXLmZKLiRpc2E9dHJ1ZQotVy5rZi4kaXNlYT10cnVlCi1XLmtmLiRpc2E9dHJ1ZQorVy5ldzcuJGlzZWE9dHJ1ZQorVy5ldzcuJGlzYT10cnVlCiBHLlkyLiRpc1kyPXRydWUKIEcuWTIuJGlzYT10cnVlCiBELmt4LiRpc2t4PXRydWUKQEAgLTE5MzkyLDEzICsxOTY0NywxMyBAQAogVy5BalkuJGlzQWpZPXRydWUKIFcuQWpZLiRpc2VhPXRydWUKIFcuQWpZLiRpc2E9dHJ1ZQotRy51Ry4kaXNhPXRydWUKK0cuT1MuJGlzYT10cnVlCiBELk1rLiRpc2FmPXRydWUKIEQuTWsuJGlzYT10cnVlCiBXLmY1LiRpc2Y1PXRydWUKIFcuZjUuJGlzZWE9dHJ1ZQogVy5mNS4kaXNhPXRydWUKLVAuQUUuJGlzYT10cnVlCitQLkE1LiRpc2E9dHJ1ZQogVy5QRy4kaXNlYT10cnVlCiBXLlBHLiRpc2E9dHJ1ZQogTC5Udi4kaXNUdj10cnVlCkBAIC0xOTQwOSwxMyArMTk2NjQsMTMgQEAKIEgueW8uJGlzYT10cnVlCiBILklZLiRpc2E9dHJ1ZQogSC5hWC4kaXNhPXRydWUKLVcuSTAuJGlzQWo9dHJ1ZQorVy5JMC4kaXNoc3c9dHJ1ZQogVy5JMC4kaXNLVj10cnVlCiBXLkkwLiRpc2E9dHJ1ZQogUC53Uy4kaXN3Uz10cnVlCiBQLndTLiRpc2E9dHJ1ZQotUC5NTy4kaXNNTz10cnVlCi1QLk1PLiRpc2E9dHJ1ZQorUC55WC4kaXN5WD10cnVlCitQLnlYLiRpc2E9dHJ1ZQogWS5xUy4kaXNhPXRydWUKIFUuSXAuJGlzSXA9dHJ1ZQogVS5JcC4kaXNhPXRydWUKQEAgLTE5NDI5LDE1ICsxOTY4NCwxNSBAQAogUC5CcFAuJGlzYT10cnVlCiBQLktBLiRpc0tBPXRydWUKIFAuS0EuJGlzTk9UPXRydWUKLVAuS0EuJGlzTU89dHJ1ZQorUC5LQS4kaXN5WD10cnVlCiBQLktBLiRpc2E9dHJ1ZQogUC5MUi4kaXNMUj10cnVlCiBQLkxSLiRpc0tBPXRydWUKIFAuTFIuJGlzTk9UPXRydWUKLVAuTFIuJGlzTU89dHJ1ZQorUC5MUi4kaXN5WD10cnVlCiBQLkxSLiRpc2E9dHJ1ZQotUC5xSy4kaXNxSz10cnVlCi1QLnFLLiRpc2E9dHJ1ZQorUC5lNHkuJGlzZTR5PXRydWUKK1AuZTR5LiRpc2E9dHJ1ZQogUC5kbC4kaXNkbD10cnVlCiBQLmRsLiRpc2E9dHJ1ZQogUC5Sei4kaXNSej10cnVlCkBAIC0xOTQ1Niw4ICsxOTcxMSw4IEBACiBQLmI4LiRpc2E9dHJ1ZQogUC5OT1QuJGlzTk9UPXRydWUKIFAuTk9ULiRpc2E9dHJ1ZQotUC5mSW0uJGlzZkltPXRydWUKLVAuZkltLiRpc2E9dHJ1ZQorUC50aS4kaXN0aT10cnVlCitQLnRpLiRpc2E9dHJ1ZQogUC5pUC4kaXNpUD10cnVlCiBQLmlQLiRpc1J6PXRydWUKIFAuaVAuJGFzUno9W251bGxdCkBAIC0xOTQ4Miw5ICsxOTczNyw5IEBACiBMLkFSLiRpc0FSPXRydWUKIEwuQVIuJGlzWWo9dHJ1ZQogTC5BUi4kaXNhPXRydWUKLVcuQWouJGlzQWo9dHJ1ZQotVy5Bai4kaXNLVj10cnVlCi1XLkFqLiRpc2E9dHJ1ZQorVy5oc3cuJGlzaHN3PXRydWUKK1cuaHN3LiRpc0tWPXRydWUKK1cuaHN3LiRpc2E9dHJ1ZQogSi5RYz1mdW5jdGlvbihhKXtpZih0eXBlb2YgYT09Im51bWJlciIpcmV0dXJuIEouUC5wcm90b3R5cGUKIGlmKHR5cGVvZiBhPT0ic3RyaW5nIilyZXR1cm4gSi5PLnByb3RvdHlwZQogaWYoYT09bnVsbClyZXR1cm4gYQpAQCAtMTk1MjEsNiArMTk3NzYsNyBAQAogaWYodHlwZW9mIGEhPSJvYmplY3QiKXJldHVybiBhCiBpZihhIGluc3RhbmNlb2YgUC5hKXJldHVybiBhCiByZXR1cm4gSi5tMChhKX0KK0ouQTE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zZVQoYSxiKX0KIEouQTQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zangoYSxiKX0KIEouQTY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0czKGEpfQogSi5BRj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSWkoYSl9CkBAIC0xOTU2MCwxNiArMTk4MTYsMTYgQEAKIEouRWQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRksoYSxiKX0KIEouRWg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5XayhhLGIpfQogSi5FaT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSShhKX0KLUouRXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zZlkoYSxiKX0KK0ouRXI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3U2KGEpfQogSi5Fdz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5na20oYSl9CiBKLkY5PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd2bShhKX0KIEouRk49ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ2wwKGEpfQogSi5GUz1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5uUihhLGIsYyxkKX0KIEouRlc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5RYyhhKS5pTShhLGIpfQorSi5GZD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEoudzEoYSkuYU0oYSxiLGMpfQogSi5HSD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5neVcoYSl9CiBKLkdKPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJFKGEpLlk5KGEsYixjLGQpfQogSi5HTD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nZk4oYSl9Ci1KLkdVPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd6eChhKX0KIEouR1c9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1ZZKGEpfQogSi5HWj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNwaChhLGIpfQogSi5HbD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5naHkoYSl9CkBAIC0xOTU3OSwyNyArMTk4MzUsMjkgQEAKIEouSEI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3hUKGEpfQogSi5IUD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRksoYSl9CiBKLkhhPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5layhhLGIsYyl9Ci1KLkhuPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3hUKGEsYil9CitKLkhoPWZ1bmN0aW9uKGEpe3JldHVybiBKLld4KGEpLnl1KGEpfQorSi5Ibj1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmdHlwZW9mIGI9PSJudW1iZXIiKXJldHVybiBhLWIKK3JldHVybiBKLld4KGEpLlcoYSxiKX0KIEouSTI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3d2KGEpfQogSi5JTz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUkgoYSl9CiBKLklQPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdTcyhhKX0KIEouSVI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1l0KGEpfQogSi5JWD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNFdShhLGIpfQotSi5JYT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLnpWKGEsYil9Ci1KLkl0PWZ1bmN0aW9uKGEpe3JldHVybiBKLld4KGEpLnl1KGEpfQorSi5JdD1mdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLkZyKGEsYil9CiBKLkl6PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdmWShhKX0KIEouSjA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUjEoYSxiKX0KIEouSjU9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYT49YgogcmV0dXJuIEouV3goYSkuRihhLGIpfQorSi5KNz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQ3QoYSl9CiBKLkpBPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5oOChhLGIsYyl9CiBKLkpHPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdIbihhKX0KIEouSlI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2NLKGEpfQogSi5KWj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN0MChhLGIpfQotSi5KYj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNkdShhLGIpfQogSi5Kaj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nV0EoYSl9CiBKLkprPWZ1bmN0aW9uKGEpe3JldHVybiBKLngoYSkuZ2J4KGEpfQorSi5KbD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNNTChhLGIpfQogSi5KcD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5namwoYSl9Ci1KLkpyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuSWQoYSxiKX0KK0ouSnI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0dWKGEpfQogSi5LMD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nZDQoYSl9CiBKLksyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd0TihhKX0KIEouS0Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5qMyhhLGIpfQpAQCAtMTk2MDgsOSArMTk4NjYsNyBAQAogSi5LbD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQlAoYSl9CiBKLktyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmU2KGEpfQogSi5LeT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUmsoYSl9Ci1KLkt6PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc25pKGEsYil9CiBKLkw5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2RVKGEsYil9Ci1KLkxCPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdYMChhKX0KIEouTEg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5HVChhLGIpfQogSi5MTD1mdW5jdGlvbihhKXtyZXR1cm4gSi5XeChhKS5IRyhhKX0KIEouTE09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zemooYSxiKX0KQEAgLTE5NjIyLDcgKzE5ODc4LDcgQEAKIEouTUI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3pHKGEpfQogSi5NRT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNVbyhhLGIpfQogSi5NSz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLk1kKGEsYil9Ci1KLk1RPWZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmdyWihhKX0KK0ouTU89ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLlJFKGEpLlpLKGEsYixjKX0KIEouTVU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5GYyhhLGIpfQogSi5NWD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNQaihhLGIpfQogSi5NZT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLmFOKGEsYil9CkBAIC0xOTYzOCwxMCArMTk4OTQsOSBAQAogSi5OTz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNvRShhLGIpfQogSi5OUT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5namIoYSl9CiBKLk5UPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5VNihhKS5lTShhLGIsYyl9Ci1KLk5WPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuUlIoYSxiKX0KK0ouTlY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zS3coYSxiKX0KIEouTlo9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUnUoYSxiKX0KIEouTmY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zeXcoYSxiKX0KLUouTmg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zU1koYSxiKX0KIEouTmo9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLnJZKGEpLk5qKGEsYixjKX0KIEouTm89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUihhLGIpfQogSi5OcT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nR2MoYSl9CkBAIC0xOTY1MSwxMCArMTk5MDYsMTEgQEAKIEouT0I9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2ZnKGEpfQogSi5PRT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNmZyhhLGIpfQogSi5PVD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nWEUoYSl9Ci1KLk9ZPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdKRChhKX0KIEouT2s9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2hVKGEpfQogSi5QMj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNVNChhLGIpfQorSi5QMz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nb0woYSl9CiBKLlA0PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWcihhKX0KK0ouUEI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0JWKGEpfQogSi5QTj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNDSShhLGIpfQogSi5QUD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNudihhLGIpfQogSi5QWT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nb04oYSl9CkBAIC0xOTY3MCwxNyArMTk5MjYsMTYgQEAKIEouUVQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS52VihhLGIpfQogSi5RYT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nTk4oYSl9CiBKLlFkPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdSbihhKX0KK0ouUWw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zZHUoYSxiKX0KIEouUXI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5za2MoYSxiKX0KIEouUXY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zWDAoYSxiKX0KIEouUXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zaGYoYSxiKX0KIEouUjE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuRm4oYSl9CiBKLlI4PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc01UKGEsYil9CiBKLlJDPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdUQShhKX0KLUouUkY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5XTyhhLGIpfQogSi5SWD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNqbChhLGIpfQotSi5SeD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNFbChhLGIpfQorSi5SZz1mdW5jdGlvbihhKXtyZXR1cm4gSi54KGEpLmdBWShhKX0KIEouUnk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0xXKGEpfQotSi5TOD1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5nSXIoYSl9CiBKLlNGPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0lpKGEsYil9CiBKLlNHPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdESShhKX0KIEouU0s9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkueFcoYSl9CkBAIC0xOTY4OSwxMSArMTk5NDQsMTAgQEAKIEouU2Y9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zWEUoYSxiKX0KIEouU2o9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zdkMoYSxiKX0KIEouU289ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5YMyhhLGIpfQotSi5Tej1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVXgoYSl9CiBKLlQ1PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3RUKGEsYil9CiBKLlRHPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLm1DKGEpfQogSi5UTT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nT2QoYSl9Ci1KLlRQPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdVUShhKX0KK0ouVFA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zR1YoYSxiKX0KIEouVFk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3ZwKGEpfQogSi5UWj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNOKGEsYil9CiBKLlRnPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdDSShhKX0KQEAgLTE5NzAyLDYgKzE5OTU2LDggQEAKIEouVHM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2ZHKGEpfQogSi5UeD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNwZihhLGIpfQogSi5VOD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRVEoYSl9CitKLlU4bz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVVEoYSl9CitKLlVBPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdQMihhKX0KIEouVU49ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4oYV5iKT4+PjAKIHJldHVybiBKLld4KGEpLncoYSxiKX0KIEouVVA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ25aKGEpfQpAQCAtMTk3MTAsMTQgKzE5OTY2LDE0IEBACiBKLlVTPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdXdChhKX0KIEouVVQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0RRKGEpfQogSi5VVT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nalQoYSl9CitKLlVmPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdERChhKX0KK0ouVXY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5XTyhhLGIpfQogSi5WMT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLlJ6KGEsYil9Ci1KLlYyPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5EOShhLGIsYyl9CiBKLlY1PWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJFKGEpLlliKGEsYixjLGQpfQogSi5WTD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUjIoYSl9CiBKLlZaPWZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEoudzEoYSkuWVcoYSxiLGMsZCxlKX0KIEouVmY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1ZFKGEpfQogSi5Waz1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEoudzEoYSkueGUoYSxiLGMpfQotSi5WbD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5namEoYSl9CiBKLlZtPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdQKGEpfQogSi5Wcj1mdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLkMxKGEsYil9CiBKLlZzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdRZyhhKX0KQEAgLTE5NzM4LDEwICsxOTk5NCw5IEBACiBKLlhpPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdyOShhKX0KIEouWUg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3BNKGEpfQogSi5ZUT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUEwoYSl9Ci1KLlliPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5aSyhhLGIsYyl9CitKLllmPWZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmdJcihhKX0KIEouWXE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3BoKGEpfQogSi5Zej1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNNbChhLGIpfQotSi5aMj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5kUShhKX0KIEouWjY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1Y1KGEpfQogSi5aOD1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5WMShhKX0KIEouWkY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0FGKGEpfQpAQCAtMTk3NDksMTkgKzIwMDA0LDIwIEBACiBKLlpJPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0lzKGEsYil9CiBKLlpOPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdxTihhKX0KIEouWlU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUlkoYSxiKX0KK0ouWlc9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuTVMoYSxiLGMsZCl9CiBKLlpaPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouclkoYSkueW4oYSxiKX0KLUouWmc9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuTVMoYSxiLGMsZCl9CitKLlpxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdscChhKX0KIEouWnM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2NZKGEpfQogSi5adj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ncnMoYSl9CiBKLmEzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdCayhhKX0KIEouYUE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3pZKGEpfQogSi5hQj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ncWwoYSl9CiBKLmFUPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdvZChhKX0KK0ouYVc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0pwKGEpfQorSi5hdT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNORyhhLGIpfQogSi5hdkQ9ZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gSi5SRShhKS5kRihhLGIsYyxkLGUpfQogSi5hdz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNOTihhLGIpfQogSi5iSD1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5lYShhLGIsYyxkKX0KLUouYkk9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYS1iCi1yZXR1cm4gSi5XeChhKS5XKGEsYil9CiBKLmJMPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdoUyhhKX0KIEouYk49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5HRShhLGIpfQogSi5iaT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLmgoYSxiKX0KQEAgLTE5NzY5LDExICsyMDAyNSw5IEBACiBKLmJyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdqOChhKX0KIEouYnM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuSlAoYSl9CiBKLmJ1PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd5dyhhKX0KLUouYng9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ245KGEpfQogSi5jRz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5LaShhKX0KIEouY0k9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuUkUoYSl9CiBKLmNPPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdqeChhKX0KLUouY1I9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5XeChhKS5XWihhLGIpfQogSi5jVT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSGgoYSl9CiBKLmNWPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2pUKGEsYil9CiBKLmNqPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdNVChhKX0KQEAgLTE5Nzk2LDE3ICsyMDA1MCwxNiBAQAogSi5ldD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlU2KGEpLmtKKGEsYil9CiBKLmV3PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGErYgogcmV0dXJuIEouUWMoYSkuZyhhLGIpfQotSi5mQT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSnAoYSl9CitKLmZEPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuSWQoYSxiKX0KIEouZlI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTVooYSxiKX0KIEouZlU9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0RYKGEpfQogSi5mYT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNFUShhLGIpfQogSi5mYj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNxbChhLGIpfQotSi5mZT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQ24oYSl9CiBKLmZmPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5VNihhKS5QayhhLGIsYyl9Ci1KLmZ2PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1V4KGEsYil9Ci1KLmZ3PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdFbChhKX0KK0ouZmk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1gwKGEpfQogSi5meD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRzUoYSl9CiBKLmZ5PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdJRihhKX0KK0ouaDY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ01MKGEpfQogSi5oOT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNXQShhLGIpfQogSi5oUz1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLnNyWihhLGIpfQogSi5oaD1mdW5jdGlvbihhLGIpe3JldHVybiBKLld4KGEpLlkoYSxiKX0KQEAgLTE5ODIwLDcgKzIwMDczLDcgQEAKIEouaVM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ294KGEpfQogSi5pZD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUjEoYSl9CiBKLmloPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdhNShhKX0KLUouaW89ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0JWKGEpfQorSi5pbz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5namEoYSl9CiBKLmlzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdabShhKX0KIEouaXY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1YyKGEpfQogSi5peD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nbkkoYSl9CkBAIC0xOTgzMiw2ICsyMDA4NSw3IEBACiBKLmpkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc25aKGEsYil9CiBKLmpmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoueChhKS5UKGEsYil9CiBKLmpsPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdIdChhKX0KK0ouang9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2llKGEpfQogSi5qem89ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybi1hCiByZXR1cm4gSi5XeChhKS5KKGEpfQogSi5rMD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5naVooYSl9CkBAIC0xOTg0NSw3ICsyMDA5OSw3IEBACiBKLmtpPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdxSyhhKX0KIEoua2w9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5leihhLGIpfQogSi5rcz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQjEoYSl9Ci1KLmt2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdscChhKX0KK0oua3Y9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0RmKGEpfQogSi5reT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouUkUoYSkuZFIoYSxiLGMpfQogSi5sMj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nTihhKX0KIEoubDc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zdjgoYSxiKX0KQEAgLTE5ODY4LDcgKzIwMTIyLDYgQEAKIEoubjk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1FxKGEpfQogSi5uQT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNQTChhLGIpfQogSi5uQz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNDZChhLGIpfQotSi5uRT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRGYoYSl9CiBKLm5FMT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLm91KGEsYil9CiBKLm5HPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd2OChhKX0KIEoubmI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3lYKGEpfQpAQCAtMTk4NzcsMjUgKzIwMTMwLDI3IEBACiBKLm9EPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuaFAoYSxiKX0KIEoub0o9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zcnMoYSxiKX0KIEoub049ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2o0KGEpfQotSi5vWj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQmkoYSl9CitKLm9rVj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLlJSKGEsYil9CiBKLm9uPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd0VChhKX0KIEoub3A9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0Q3KGEpfQogSi5wNz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndUQoYSl9CiBKLnBBPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1l0KGEsYil9CiBKLnBCPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuc2l0KGEsYil9Ci1KLnBQPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdERChhKX0KK0oucE89ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ29yKGEpfQorSi5wUD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nS3coYSl9CiBKLnBVPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdoTihhKX0KLUoucGQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ25pKGEpfQogSi5wbT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndDAoYSl9CiBKLnEwPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3lHKGEsYil9CiBKLnE4PWZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdCKGEpfQogSi5xQT1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5icihhKX0KIEoucUQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLlJFKGEpLmFEKGEsYixjKX0KK0oucWI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ21TQShhKX0KIEoucWQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zSXQoYSxiKX0KIEoucWw9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2FCKGEpfQotSi5xcT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNORyhhLGIpfQorSi5xcT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5kUShhKX0KIEoucjA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2k2KGEpfQogSi5yND1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5waihhKX0KK0ouckE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5OayhhLGIpfQogSi5yYT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSjYoYSl9CiBKLnJyPWZ1bmN0aW9uKGEpe3JldHVybiBKLnJZKGEpLmJTKGEpfQogSi5ydz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nTWwoYSl9CkBAIC0xOTkwNiwyNCArMjAxNjEsMjUgQEAKIEoudEg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zSHkoYSxiKX0KIEoudE89ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSkuSmQoYSl9CiBKLnRRPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3d2KGEsYil9CitKLnRUPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5YNihhLGIsYyl9CiBKLnRhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1AoYSxiKX0KIEoudGY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0s0KGEpfQogSi50dj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNEWChhLGIpfQogSi50dz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5qZShhKX0KLUoudTE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1NZKGEpfQorSi51MT1mdW5jdGlvbihhLGIpe3JldHVybiBKLld4KGEpLldaKGEsYil9CiBKLnU2PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGE8YgogcmV0dXJuIEouV3goYSkuQyhhLGIpfQotSi51SD1mdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLkZyKGEsYil9CitKLnVHPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuelYoYSxiKX0KK0oudUg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUDIoYSxiKX0KIEoudU09ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zb2QoYSxiKX0KIEoudVA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zSjYoYSxiKX0KIEoudVc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3lHKGEpfQotSi51WT1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLk5rKGEsYil9CitKLnVZPWZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLmdyWihhKX0KIEoudWY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3hyKGEpfQogSi51bD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVTQoYSl9CiBKLnVwPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdraChhKX0KIEoudXk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0htKGEpfQogSi52MT1mdW5jdGlvbihhKXtyZXR1cm4gSi54KGEpLmdpTyhhKX0KLUoudjg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ25wKGEpfQogSi52Sj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNwTShhLGIpfQogSi52UD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5NeShhKX0KIEoudlg9ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYSpiCkBAIC0xOTkzNCwzMyArMjAxOTAsMzQgQEAKIEoud0Q9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5zSXIoYSxiKX0KIEoud0Y9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5XeChhKS5TeShhLGIpfQogSi53Sj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNscChhLGIpfQotSi53Tz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRTcoYSl9CiBKLndnPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkuc0IoYSxiKX0KIEoud2w9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5DaChhLGIpfQorSi53dT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNMZihhLGIpfQogSi53eD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLlJnKGEsYil9CitKLnd6PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd6eChhKX0KIEoueDA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zV3QoYSxiKX0KIEoueDU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5VNihhKS50ZyhhLGIpfQogSi54Qz1mdW5jdGlvbihhLGIpe2lmKGE9PW51bGwpcmV0dXJuIGI9PW51bGwKIGlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYiE9bnVsbCYmYT09PWIKIHJldHVybiBKLngoYSkubihhLGIpfQotSi54SD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNFNyhhLGIpfQorSi54SD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN4VChhLGIpfQogSi54UT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNHZChhLGIpfQogSi54Uj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5naGYoYSl9CiBKLnhXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1ptKGEsYil9CiBKLnhhPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdlUyhhKX0KLUoueGI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2ZxKGEpfQogSi54ZT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUEIoYSl9CiBKLnhvPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdKTihhKX0KIEoueTI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5teChhLGIpfQogSi55SD1mdW5jdGlvbihhKXtyZXR1cm4gSi5XeChhKS5WeShhKX0KK0oueUk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0xmKGEpfQogSi55Tz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN0TihhLGIpfQorSi55Yz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndVMoYSl9CiBKLnlkPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLnhPKGEpfQogSi55bj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5na1ooYSl9CiBKLnlxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdRbChhKX0KLUoueXg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTYoYSkuZ29yKGEpfQogSi55ej1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nTEYoYSl9CitKLnoxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdYcihhKX0KIEouejI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0cxKGEpfQotSi56Mz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndTYoYSl9CiBKLno4PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGE+YgogcmV0dXJuIEouV3goYSkuRChhLGIpfQogSi56Rj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSEwoYSl9CkBAIC0xOTk3MiwzMSArMjAyMjksMzEgQEAKIEMuRGY9WC5oVi5wcm90b3R5cGUKIEMuR2twPVkucTYucHJvdG90eXBlCiBDLk13PUIuRzYucHJvdG90eXBlCi1DLkhSPUEud00ucHJvdG90eXBlCitDLmljPUEud00ucHJvdG90eXBlCiBDLllaej1RLmVXLnByb3RvdHlwZQogQy5SRD1PLmVvLnByb3RvdHlwZQotQy5rYT1aLmFDLnByb3RvdHlwZQorQy5rYT1aLmFrLnByb3RvdHlwZQogQy50V089Ty5WWS5wcm90b3R5cGUKIEMudXg9Ri5CZS5wcm90b3R5cGUKIEMuTzA9Ui5KSS5wcm90b3R5cGUKIEMuT0Q9Ri5aUC5wcm90b3R5cGUKLUMudFQ9TC5uSi5wcm90b3R5cGUKLUMuVUY9Ui5FZy5wcm90b3R5cGUKK0MuSmg9TC5uSi5wcm90b3R5cGUKK0MucUw9Ui5FZy5wcm90b3R5cGUKIEMuTUM9RC5pNy5wcm90b3R5cGUKLUMuYnk9QS5Hay5wcm90b3R5cGUKK0MuRDQ9QS5Hay5wcm90b3R5cGUKIEMubHM2PVguTUoucHJvdG90eXBlCi1DLk1PMD1YLk5yLnByb3RvdHlwZQorQy5NTzA9WC5KMy5wcm90b3R5cGUKIEMuWG89VS5ESy5wcm90b3R5cGUKIEMuUEo4PU4uQlMucHJvdG90eXBlCiBDLkNzPU8uVmIucHJvdG90eXBlCiBDLlZjPUsuTHkucHJvdG90eXBlCiBDLlczPVcuZkoucHJvdG90eXBlCi1DLlVnPUUuV1MucHJvdG90eXBlCi1DLkJzPUUuSDgucHJvdG90eXBlCitDLmJQPUUuV1MucHJvdG90eXBlCitDLkdJST1FLkg4LnByb3RvdHlwZQogQy5JZT1FLm1PLnByb3RvdHlwZQogQy5JZz1FLkRFLnByb3RvdHlwZQogQy54ND1FLlUxLnByb3RvdHlwZQotQy5sWD1FLm91LnByb3RvdHlwZQorQy5sWD1FLnFNLnByb3RvdHlwZQogQy5Pa0k9RS5hdi5wcm90b3R5cGUKIEMuYlo9RS51ei5wcm90b3R5cGUKIEMuaVI9RS5NYS5wcm90b3R5cGUKQEAgLTIwMDA2LDExICsyMDI2MywxMSBAQAogQy5UbD1FLm9GLnByb3RvdHlwZQogQy53Sz1FLnFoLnByb3RvdHlwZQogQy50bz1FLlE2LnByb3RvdHlwZQotQy56YT1FLkw0LnByb3RvdHlwZQorQy53ZD1FLkw0LnByb3RvdHlwZQogQy5paj1FLlpuLnByb3RvdHlwZQotQy5qcz1FLnVFLnByb3RvdHlwZQorQy5Scj1FLnVFLnByb3RvdHlwZQogQy5hVj1FLm41LnByb3RvdHlwZQotQy5wbz1CLnBSLnByb3RvdHlwZQorQy5oTT1CLnBSLnByb3RvdHlwZQogQy55S3g9Wi5oeC5wcm90b3R5cGUKIEMuYVhQPUQuWjQucHJvdG90eXBlCiBDLlZpPUQuUWgucHJvdG90eXBlCkBAIC0yMDAyNCwyOSArMjAyODEsMzAgQEAKIEMuTm09Si5RLnByb3RvdHlwZQogQy5ZST1KLlZBLnByb3RvdHlwZQogQy5qbj1KLlhoLnByb3RvdHlwZQotQy5iUD1KLkNEVS5wcm90b3R5cGUKK0Muak49Si5DRFUucHJvdG90eXBlCiBDLkNEPUouUC5wcm90b3R5cGUKIEMueEI9Si5PLnByb3RvdHlwZQogQy5ZdD1aLnZqLnByb3RvdHlwZQogQy5jdD1BLlVLLnByb3RvdHlwZQogQy5aMz1SLkxVLnByb3RvdHlwZQogQy5NRz1NLkNYLnByb3RvdHlwZQorQy5TMj1XLkg5LnByb3RvdHlwZQogQy55cD1ILmVFVi5wcm90b3R5cGUKIEMua0Q9QS5tZC5wcm90b3R5cGUKIEMucGw9QS55ZS5wcm90b3R5cGUKIEMuSUc9QS5CbS5wcm90b3R5cGUKLUMubm49QS5ZYS5wcm90b3R5cGUKK0MuTms9QS5ZYS5wcm90b3R5cGUKIEMuTW49QS5OSy5wcm90b3R5cGUKIEMuTDg9QS5aeC5wcm90b3R5cGUKLUMuSjc9QS5Xdy5wcm90b3R5cGUKK0MuWTY9QS5Xdy5wcm90b3R5cGUKIEMudDU9Vy5CSDMucHJvdG90eXBlCiBDLkJIPVYuRjEucHJvdG90eXBlCiBDLlBmej1aLnVMLnByb3RvdHlwZQogQy5TeD1KLmlDVy5wcm90b3R5cGUKIEMuS2k9QS54Yy5wcm90b3R5cGUKLUMuRmE9VC5vdi5wcm90b3R5cGUKK0MuemE9VC5vdi5wcm90b3R5cGUKIEMuV2E9QS5rbi5wcm90b3R5cGUKLUMuRkg9VS5mSS5wcm90b3R5cGUKK0MuY0owPVUuZkkucHJvdG90eXBlCiBDLlUwPVIuek0ucHJvdG90eXBlCiBDLlZkPUQuUmsucHJvdG90eXBlCiBDLk5zPVUuVGkucHJvdG90eXBlCkBAIC0yMDA1Nyw3ICsyMDMxNSw3IEBACiBDLk9LbD1BLkcxLnByb3RvdHlwZQogQy52Qj1KLmtkUS5wcm90b3R5cGUKIEMuaGo9Vi5EMi5wcm90b3R5cGUKLUMuWmE9Vi5QYS5wcm90b3R5cGUKK0MuSjU3PVYuUGEucHJvdG90eXBlCiBDLnZBPVguSTUucHJvdG90eXBlCiBDLmRtPVUuZWwucHJvdG90eXBlCiBDLm9sPVcuSzUucHJvdG90eXBlCkBAIC0yMDA3MCw3ICsyMDMyOCw3IEBACiBDLnByPW5ldyBQLm1nYigpCiBDLmRWPW5ldyBMLmlOYygpCiBDLk5VPW5ldyBQLlI4MSgpCi1DLmRTPW5ldyBQLkFIaSgpCitDLnY4PW5ldyBQLkFIaSgpCiBDLldBPW5ldyBELldBRSgiQ29sbGVjdGVkIikKIEMubDg9bmV3IEQuV0FFKCJEYXJ0IikKIEMuT2M9bmV3IEQuV0FFKCJOYXRpdmUiKQpAQCAtMjAwNzksMjUyICsyMDMzNywyNTUgQEAKIEMublU9bmV3IEEuaVluKDApCiBDLkJNPW5ldyBBLmlZbigxKQogQy5oVT1uZXcgQS5pWW4oMikKLUMuaGY9bmV3IEguSU4oImxhYmVsIikKK0MuaGY9bmV3IEgudHgoImxhYmVsIikKIEMuR2g9SC5JTCgncVUnKQogQy5CMTA9bmV3IEsudmx5KCkKLUMuT1U9bmV3IEEuaEcoITEpCitDLnZyZD1uZXcgQS5oRyghMSkKIEkudUw9ZnVuY3Rpb24oYSl7YS5pbW11dGFibGUkbGlzdD1pbml0CiBhLmZpeGVkJGxlbmd0aD1pbml0CiByZXR1cm4gYX0KLUMudWNQPUkudUwoW0MuQjEwLEMuT1VdKQorQy51Y1A9SS51TChbQy5CMTAsQy52cmRdKQogQy5WMD1uZXcgQS5FUyhDLmhmLEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKLUMuRVY9bmV3IEguSU4oImxpYnJhcnkiKQorQy5FVj1uZXcgSC50eCgibGlicmFyeSIpCiBDLkpueT1ILklMKCdVNCcpCiBDLlpRPW5ldyBBLkVTKEMuRVYsQy5CTSwhMSxDLkpueSwhMSxDLnVjUCkKLUMuU1I9bmV3IEguSU4oIm1hcCIpCitDLlpnPW5ldyBILnR4KCJhcmdzIikKK0MuU1hLPUguSUwoJ3FDJykKK0MuYjc9bmV3IEEuRVMoQy5aZyxDLkJNLCExLEMuU1hLLCExLEMudWNQKQorQy5TUj1uZXcgSC50eCgibWFwIikKIEMuTVIxPUguSUwoJ3ZPJykKIEMuUzk9bmV3IEEuRVMoQy5TUixDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5sZD1uZXcgSC5JTigiZXZlbnRzIikKK0MubGQ9bmV3IEgudHgoImV2ZW50cyIpCiBDLkdzYz1ILklMKCd3bicpCiBDLkd3PW5ldyBBLkVTKEMubGQsQy5CTSwhMSxDLkdzYywhMSxDLnVjUCkKLUMuVUw9bmV3IEguSU4oInByb2ZpbGVDaGFuZ2VkIikKK0MuVUw9bmV3IEgudHgoInByb2ZpbGVDaGFuZ2VkIikKIEMueVFQPUguSUwoJ0VIJykKIEMuZG49SS51TChbXSkKIEMubU09bmV3IEEuRVMoQy5VTCxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLlFsPW5ldyBILklOKCJoYXNDbGFzcyIpCi1DLkhMPUguSUwoJ2EyJykKLUMuSjE5PW5ldyBLLm5kKCkKLUMuZXN4PUkudUwoW0MuQjEwLEMuSjE5XSkKLUMuVEo9bmV3IEEuRVMoQy5RbCxDLkJNLCExLEMuSEwsITEsQy5lc3gpCi1DLlRVPW5ldyBILklOKCJlbmRQb3NDaGFuZ2VkIikKK0MuVFU9bmV3IEgudHgoImVuZFBvc0NoYW5nZWQiKQogQy5DcD1uZXcgQS5FUyhDLlRVLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMubmU9bmV3IEguSU4oImV4Y2VwdGlvbiIpCitDLm5lPW5ldyBILnR4KCJleGNlcHRpb24iKQogQy5TTnU9SC5JTCgnRVAnKQogQy5yWj1uZXcgQS5FUyhDLm5lLEMuQk0sITEsQy5TTnUsITEsQy51Y1ApCi1DLldtPW5ldyBILklOKCJyZWZDaGFuZ2VkIikKK0MuV209bmV3IEgudHgoInJlZkNoYW5nZWQiKQogQy5RVz1uZXcgQS5FUyhDLldtLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuVVk9bmV3IEguSU4oInJlc3VsdCIpCitDLlVZPW5ldyBILnR4KCJyZXN1bHQiKQogQy5TbU49SC5JTCgnYWYnKQogQy5uNj1uZXcgQS5FUyhDLlVZLEMuQk0sITEsQy5TbU4sITEsQy51Y1ApCi1DLlFLPW5ldyBILklOKCJxdWFsaWZpZWQiKQorQy5RSz1uZXcgSC50eCgicXVhbGlmaWVkIikKK0MuSEw9SC5JTCgnYTInKQogQy5Zbz1uZXcgQS5FUyhDLlFLLEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMuU0E9bmV3IEguSU4oImxpbmVzIikKK0MuU0E9bmV3IEgudHgoImxpbmVzIikKIEMuaEFYPUguSUwoJ1dPJykKK0MuSjE5PW5ldyBLLm5kKCkKK0MuZXN4PUkudUwoW0MuQjEwLEMuSjE5XSkKIEMuS0k9bmV3IEEuRVMoQy5TQSxDLkJNLCExLEMuaEFYLCExLEMuZXN4KQotQy56VT1uZXcgSC5JTigidW5jaGVja2VkVGV4dCIpCitDLnpVPW5ldyBILnR4KCJ1bmNoZWNrZWRUZXh0IikKIEMudVQ9bmV3IEEuRVMoQy56VSxDLkJNLCExLEMuR2gsITEsQy51Y1ApCi1DLlhBPW5ldyBILklOKCJjbHMiKQorQy5JVD1uZXcgSC50eCgic3RhcnRQb3MiKQorQy55dz1ILklMKCdLTicpCitDLk5MPW5ldyBBLkVTKEMuSVQsQy5CTSwhMSxDLnl3LCExLEMudWNQKQorQy5BNz1uZXcgSC50eCgiaGVpZ2h0IikKK0MuU0Q9bmV3IEEuRVMoQy5BNyxDLkJNLCExLEMuR2gsITEsQy51Y1ApCitDLlhBPW5ldyBILnR4KCJjbHMiKQogQy5qRlg9SC5JTCgnZHknKQogQy5kcT1uZXcgQS5FUyhDLlhBLEMuQk0sITEsQy5qRlgsITEsQy51Y1ApCi1DLmFIPW5ldyBILklOKCJkaXNwbGF5Q3V0b2ZmIikKK0MuYUg9bmV3IEgudHgoImRpc3BsYXlDdXRvZmYiKQogQy53Mz1uZXcgQS5FUyhDLmFILEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMuckI9bmV3IEguSU4oImlzb2xhdGUiKQorQy5yQj1uZXcgSC50eCgiaXNvbGF0ZSIpCiBDLmEycD1ILklMKCdidicpCiBDLnhZPW5ldyBBLkVTKEMuckIsQy5CTSwhMSxDLmEycCwhMSxDLmVzeCkKLUMuYno9bmV3IEguSU4oImlzb2xhdGVDaGFuZ2VkIikKK0MuYno9bmV3IEgudHgoImlzb2xhdGVDaGFuZ2VkIikKIEMuQms9bmV3IEEuRVMoQy5ieixDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLkNHPW5ldyBILklOKCJwb3NDaGFuZ2VkIikKK0MuQ0c9bmV3IEgudHgoInBvc0NoYW5nZWQiKQogQy5NbD1uZXcgQS5FUyhDLkNHLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMueWg9bmV3IEguSU4oImVycm9yIikKK0MueWg9bmV3IEgudHgoImVycm9yIikKIEMub1VEPUguSUwoJ043JykKIEMubEo9bmV3IEEuRVMoQy55aCxDLkJNLCExLEMub1VELCExLEMudWNQKQotQy5Hcz1uZXcgSC5JTigic2FtcGxlQ291bnQiKQorQy5Hcz1uZXcgSC50eCgic2FtcGxlQ291bnQiKQogQy5pTz1uZXcgQS5FUyhDLkdzLEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMub2o9bmV3IEguSU4oImh0dHBTZXJ2ZXIiKQorQy5vaj1uZXcgSC50eCgiaHR0cFNlcnZlciIpCiBDLkdUPW5ldyBBLkVTKEMub2osQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMudGQ9bmV3IEguSU4oIm9iamVjdCIpCitDLnRkPW5ldyBILnR4KCJvYmplY3QiKQogQy5aaz1uZXcgQS5FUyhDLnRkLEMuQk0sITEsQy5TbU4sITEsQy51Y1ApCi1DLlRXPW5ldyBILklOKCJ0YWdTZWxlY3RvciIpCitDLlRXPW5ldyBILnR4KCJ0YWdTZWxlY3RvciIpCiBDLkgwPW5ldyBBLkVTKEMuVFcsQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5IZT1uZXcgSC5JTigiaGlkZVRhZ3NDaGVja2VkIikKK0MuSGU9bmV3IEgudHgoImhpZGVUYWdzQ2hlY2tlZCIpCiBDLm9WPW5ldyBBLkVTKEMuSGUsQy5CTSwhMSxDLkhMLCExLEMuZXN4KQotQy5iYT1uZXcgSC5JTigicG9sbFBlcmlvZENoYW5nZWQiKQorQy5iYT1uZXcgSC50eCgicG9sbFBlcmlvZENoYW5nZWQiKQogQy5rUT1uZXcgQS5FUyhDLmJhLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMueno9bmV3IEguSU4oInRpbWVTcGFuIikKK0MuUnM9bmV3IEgudHgoImN1cnJlbnRQb3NDaGFuZ2VkIikKK0MuRVc9bmV3IEEuRVMoQy5ScyxDLmhVLCExLEMueVFQLCExLEMuZG4pCitDLnp6PW5ldyBILnR4KCJ0aW1lU3BhbiIpCiBDLmxTPW5ldyBBLkVTKEMuenosQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5BTz1uZXcgSC5JTigicXVhbGlmaWVkTmFtZSIpCi1DLmZpPW5ldyBBLkVTKEMuQU8sQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5tcj1uZXcgSC5JTigiZXhwYW5kZWQiKQorQy5tcj1uZXcgSC50eCgiZXhwYW5kZWQiKQogQy5IRT1uZXcgQS5FUyhDLm1yLEMuQk0sITEsQy5ITCwhMSxDLmVzeCkKLUMua3c9bmV3IEguSU4oInRyYWNlIikKK0Mua3c9bmV3IEgudHgoInRyYWNlIikKIEMub0M9bmV3IEEuRVMoQy5rdyxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5xWD1uZXcgSC5JTigiZnJhZ21lbnRhdGlvbkNoYW5nZWQiKQorQy5xWD1uZXcgSC50eCgiZnJhZ21lbnRhdGlvbkNoYW5nZWQiKQogQy5kTz1uZXcgQS5FUyhDLnFYLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuVVg9bmV3IEguSU4oIm1zZyIpCitDLlVYPW5ldyBILnR4KCJtc2ciKQogQy5QdD1uZXcgQS5FUyhDLlVYLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLnBPPW5ldyBILklOKCJmdW5jdGlvbkNoYW5nZWQiKQotQy5hdT1uZXcgQS5FUyhDLnBPLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuclA9bmV3IEguSU4oIm1hcENoYW5nZWQiKQorQy5yUD1uZXcgSC50eCgibWFwQ2hhbmdlZCIpCiBDLk50PW5ldyBBLkVTKEMuclAsQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy5iaz1uZXcgSC5JTigiY2hlY2tlZCIpCitDLm5mPW5ldyBILnR4KCJmdW5jdGlvbiIpCitDLlFKNz1ILklMKCdLcCcpCitDLndSPW5ldyBBLkVTKEMubmYsQy5CTSwhMSxDLlFKNywhMSxDLnVjUCkKK0MuYms9bmV3IEgudHgoImNoZWNrZWQiKQogQy5VZD1uZXcgQS5FUyhDLmJrLEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMua1Y9bmV3IEguSU4oImxpbmsiKQorQy5rVj1uZXcgSC50eCgibGluayIpCiBDLnZ6PW5ldyBBLkVTKEMua1YsQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5WZT1uZXcgSC5JTigic29ja2V0IikKK0MuVmU9bmV3IEgudHgoInNvY2tldCIpCiBDLlhtcT1ILklMKCdXUCcpCiBDLlg0PW5ldyBBLkVTKEMuVmUsQy5CTSwhMSxDLlhtcSwhMSxDLnVjUCkKLUMubnQ9bmV3IEguSU4oInN0YXJ0TGluZSIpCi1DLnl3PUguSUwoJ0tOJykKK0MubnQ9bmV3IEgudHgoInN0YXJ0TGluZSIpCiBDLlZTPW5ldyBBLkVTKEMubnQsQy5CTSwhMSxDLnl3LCExLEMuZXN4KQotQy50Zz1uZXcgSC5JTigicmV0YWluZWRCeXRlcyIpCitDLnRnPW5ldyBILnR4KCJyZXRhaW5lZEJ5dGVzIikKIEMuREM9bmV3IEEuRVMoQy50ZyxDLkJNLCExLEMueXcsITEsQy5lc3gpCi1DLnA4PW5ldyBILklOKCJldmVudCIpCitDLnZZPW5ldyBILnR4KCJjdXJyZW50UG9zIikKK0MuWlM9bmV3IEEuRVMoQy52WSxDLkJNLCExLEMueXcsITEsQy51Y1ApCitDLnA4PW5ldyBILnR4KCJldmVudCIpCiBDLktwMj1ILklMKCdNaycpCiBDLnVjPW5ldyBBLkVTKEMucDgsQy5CTSwhMSxDLktwMiwhMSxDLnVjUCkKLUMuWUQ9bmV3IEguSU4oInNhbXBsZVJhdGUiKQorQy5ZRD1uZXcgSC50eCgic2FtcGxlUmF0ZSIpCiBDLmZQPW5ldyBBLkVTKEMuWUQsQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5BYT1uZXcgSC5JTigicmVzdWx0cyIpCitDLkFhPW5ldyBILnR4KCJyZXN1bHRzIikKIEMuVXo9bmV3IEEuRVMoQy5BYSxDLkJNLCExLEMuR3NjLCExLEMuZXN4KQotQy5CMD1uZXcgSC5JTigiZXhwYW5kIikKK0MuQjA9bmV3IEgudHgoImV4cGFuZCIpCiBDLmI2PW5ldyBBLkVTKEMuQjAsQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy50Nj1uZXcgSC5JTigibWFwQXNTdHJpbmciKQorQy50Nj1uZXcgSC50eCgibWFwQXNTdHJpbmciKQogQy5ocj1uZXcgQS5FUyhDLnQ2LEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMucXM9bmV3IEguSU4oImlvIikKK0MucXM9bmV3IEgudHgoImlvIikKIEMuTU49bmV3IEEuRVMoQy5xcyxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5RSD1uZXcgSC5JTigiZnJhZ21lbnRhdGlvbiIpCitDLlFIPW5ldyBILnR4KCJmcmFnbWVudGF0aW9uIikKIEMuQzQ9bmV3IEEuRVMoQy5RSCxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5mdD1uZXcgSC5JTigidGFyZ2V0IikKK0MuZnQ9bmV3IEgudHgoInRhcmdldCIpCiBDLkk0aj1ILklMKCdaNScpCiBDLnUzPW5ldyBBLkVTKEMuZnQsQy5CTSwhMSxDLkk0aiwhMSxDLnVjUCkKLUMuVks9bmV3IEguSU4oImRldnRvb2xzIikKK0MuVks9bmV3IEgudHgoImRldnRvb2xzIikKIEMuT2Q9bmV3IEEuRVMoQy5WSyxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLnV1PW5ldyBILklOKCJpbnRlcm5hbCIpCitDLnV1PW5ldyBILnR4KCJpbnRlcm5hbCIpCiBDLnlZPW5ldyBBLkVTKEMudXUsQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy55TD1uZXcgSC5JTigiY29ubmVjdGlvbiIpCitDLnlMPW5ldyBILnR4KCJjb25uZWN0aW9uIikKIEMuajU9bmV3IEEuRVMoQy55TCxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5Xaj1uZXcgSC5JTigicHJvY2VzcyIpCitDLldqPW5ldyBILnR4KCJwcm9jZXNzIikKIEMuQWg9bmV3IEEuRVMoQy5XaixDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5uZj1uZXcgSC5JTigiZnVuY3Rpb24iKQotQy5WMz1uZXcgQS5FUyhDLm5mLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLkxjPW5ldyBILklOKCJraW5kIikKLUMuUGM9bmV3IEEuRVMoQy5MYyxDLkJNLCExLEMuR2gsITEsQy51Y1ApCi1DLlM0PW5ldyBILklOKCJidXN5IikKK0MuUzQ9bmV3IEgudHgoImJ1c3kiKQogQy5GQj1uZXcgQS5FUyhDLlM0LEMuQk0sITEsQy5ITCwhMSxDLmVzeCkKLUMuZWg9bmV3IEguSU4oImxpbmVNb2RlIikKK0MuZWg9bmV3IEgudHgoImxpbmVNb2RlIikKIEMuckg9bmV3IEEuRVMoQy5laCxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLlBNPW5ldyBILklOKCJzdGF0dXMiKQorQy5QTT1uZXcgSC50eCgic3RhdHVzIikKIEMuanY9bmV3IEEuRVMoQy5QTSxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLlppPW5ldyBILklOKCJsYXN0QWNjdW11bGF0b3JSZXNldCIpCitDLlppPW5ldyBILnR4KCJsYXN0QWNjdW11bGF0b3JSZXNldCIpCiBDLnh4PW5ldyBBLkVTKEMuWmksQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5sSD1uZXcgSC5JTigiY2hlY2tlZFRleHQiKQorQy5sSD1uZXcgSC50eCgiY2hlY2tlZFRleHQiKQogQy5kRz1uZXcgQS5FUyhDLmxILEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKLUMuQVY9bmV3IEguSU4oImNhbGxiYWNrIikKK0MuQVY9bmV3IEgudHgoImNhbGxiYWNrIikKIEMuUWlPPUguSUwoJ1NhJykKIEMuZnI9bmV3IEEuRVMoQy5BVixDLkJNLCExLEMuUWlPLCExLEMudWNQKQotQy52cz1uZXcgSC5JTigiZW5kTGluZSIpCitDLnZzPW5ldyBILnR4KCJlbmRMaW5lIikKIEMuTVA9bmV3IEEuRVMoQy52cyxDLkJNLCExLEMueXcsITEsQy5lc3gpCi1DLnBIPW5ldyBILklOKCJzbWFsbCIpCitDLnBIPW5ldyBILnR4KCJzbWFsbCIpCiBDLkZrPW5ldyBBLkVTKEMucEgsQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy5veD1uZXcgSC5JTigiY291bnRlcnNDaGFuZ2VkIikKK0MubGk9bmV3IEgudHgoInN0YXJ0UG9zQ2hhbmdlZCIpCitDLlR6PW5ldyBBLkVTKEMubGksQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQorQy5veD1uZXcgSC50eCgiY291bnRlcnNDaGFuZ2VkIikKIEMuUmg9bmV3IEEuRVMoQy5veCxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLlhNPW5ldyBILklOKCJwYXRoIikKK0MuWE09bmV3IEgudHgoInBhdGgiKQogQy5UdD1uZXcgQS5FUyhDLlhNLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLmJKPW5ldyBILklOKCJjb3VudGVycyIpCi1DLlVaPUguSUwoJ3FDJykKLUMuVUk9bmV3IEEuRVMoQy5iSixDLkJNLCExLEMuVVosITEsQy51Y1ApCi1DLmJFPW5ldyBILklOKCJzYW1wbGVEZXB0aCIpCitDLmJKPW5ldyBILnR4KCJjb3VudGVycyIpCitDLlVJPW5ldyBBLkVTKEMuYkosQy5CTSwhMSxDLlNYSywhMSxDLnVjUCkKK0MuYkU9bmV3IEgudHgoInNhbXBsZURlcHRoIikKIEMuaDM9bmV3IEEuRVMoQy5iRSxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLllzPW5ldyBILklOKCJwYWQiKQorQy5Zcz1uZXcgSC50eCgicGFkIikKIEMuQ2U9bmV3IEEuRVMoQy5ZcyxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLk44PW5ldyBILklOKCJzY3JpcHRDaGFuZ2VkIikKK0MuTjg9bmV3IEgudHgoInNjcmlwdENoYW5nZWQiKQogQy5xRT1uZXcgQS5FUyhDLk44LEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuWVQ9bmV3IEguSU4oImV4cHIiKQorQy5ZVD1uZXcgSC50eCgiZXhwciIpCiBDLmVQPUguSUwoJ2R5bmFtaWMnKQogQy5MQz1uZXcgQS5FUyhDLllULEMuQk0sITEsQy5lUCwhMSxDLnVjUCkKLUMueUI9bmV3IEguSU4oImluc3RhbmNlcyIpCitDLnlCPW5ldyBILnR4KCJpbnN0YW5jZXMiKQogQy52Wj1uZXcgQS5FUyhDLnlCLEMuQk0sITEsQy5NUjEsITEsQy5lc3gpCi1DLmFrPW5ldyBILklOKCJoYXNQYXJlbnQiKQotQy55ST1uZXcgQS5FUyhDLmFrLEMuQk0sITEsQy5ITCwhMSxDLmVzeCkKLUMueFM9bmV3IEguSU4oInRhZ1NlbGVjdG9yQ2hhbmdlZCIpCitDLnhTPW5ldyBILnR4KCJ0YWdTZWxlY3RvckNoYW5nZWQiKQogQy5iQj1uZXcgQS5FUyhDLnhTLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMualU9bmV3IEguSU4oImZpbGUiKQorQy5qVT1uZXcgSC50eCgiZmlsZSIpCiBDLmJ3PW5ldyBBLkVTKEMualUsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKIEMuUlU9bmV3IEEuRVMoQy5yQixDLkJNLCExLEMuYTJwLCExLEMudWNQKQotQy5ZRT1uZXcgSC5JTigid2ViU29ja2V0IikKK0MuWUU9bmV3IEgudHgoIndlYlNvY2tldCIpCiBDLldsPW5ldyBBLkVTKEMuWUUsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuRGo9bmV3IEguSU4oInJlZnJlc2hUaW1lIikKK0MuRGo9bmV3IEgudHgoInJlZnJlc2hUaW1lIikKIEMuQXk9bmV3IEEuRVMoQy5EaixDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLkdyPW5ldyBILklOKCJlbmRQb3MiKQorQy5Hcj1uZXcgSC50eCgiZW5kUG9zIikKIEMuVko9bmV3IEEuRVMoQy5HcixDLkJNLCExLEMueXcsITEsQy51Y1ApCi1DLlJKPW5ldyBILklOKCJ2bSIpCitDLlJKPW5ldyBILnR4KCJ2bSIpCiBDLm44Uz1ILklMKCd3dicpCiBDLkJQPW5ldyBBLkVTKEMuUkosQy5CTSwhMSxDLm44UywhMSxDLnVjUCkKLUMudVg9bmV3IEguSU4oInN0YW5kYWxvbmVWbUFkZHJlc3MiKQorQy51WD1uZXcgSC50eCgic3RhbmRhbG9uZVZtQWRkcmVzcyIpCiBDLkViPW5ldyBBLkVTKEMudVgsQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5hMD1uZXcgSC5JTigiaXNEYXJ0IikKLUMuUDk9bmV3IEEuRVMoQy5hMCxDLkJNLCExLEMuSEwsITEsQy5lc3gpCi1DLlBYPW5ldyBILklOKCJzY3JpcHQiKQorQy5QWD1uZXcgSC50eCgic2NyaXB0IikKIEMuS0I9SC5JTCgndngnKQogQy5qej1uZXcgQS5FUyhDLlBYLEMuQk0sITEsQy5LQiwhMSxDLnVjUCkKLUMuYVA9bmV3IEguSU4oImFjdGl2ZSIpCitDLmFQPW5ldyBILnR4KCJhY3RpdmUiKQogQy54RD1uZXcgQS5FUyhDLmFQLEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMuR249bmV3IEguSU4oIm9iamVjdENoYW5nZWQiKQorQy5Hbj1uZXcgSC50eCgib2JqZWN0Q2hhbmdlZCIpCiBDLmF6PW5ldyBBLkVTKEMuR24sQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy52cD1uZXcgSC5JTigibGlzdCIpCitDLnZwPW5ldyBILnR4KCJsaXN0IikKIEMubzA9bmV3IEEuRVMoQy52cCxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5pND1uZXcgSC5JTigiY29kZSIpCitDLmk0PW5ldyBILnR4KCJjb2RlIikKIEMucE09SC5JTCgna3gnKQogQy5hSj1uZXcgQS5FUyhDLmk0LEMuQk0sITEsQy5wTSwhMSxDLnVjUCkKLUMua0c9bmV3IEguSU4oImNsYXNzVGFibGUiKQorQy5rST1uZXcgSC50eCgiY3VycmVudExpbmUiKQorQy5KTT1uZXcgQS5FUyhDLmtJLEMuQk0sITEsQy55dywhMSxDLmVzeCkKK0Mua0c9bmV3IEgudHgoImNsYXNzVGFibGUiKQogQy5tN0k9SC5JTCgnVUMnKQogQy5Qcj1uZXcgQS5FUyhDLmtHLEMuQk0sITEsQy5tN0ksITEsQy5lc3gpCi1DLlROPW5ldyBILklOKCJsYXN0U2VydmljZUdDIikKK0MuVE49bmV3IEgudHgoImxhc3RTZXJ2aWNlR0MiKQogQy5Haj1uZXcgQS5FUyhDLlROLEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKIEMuemQ9bmV3IEEuRVMoQy55aCxDLkJNLCExLEMuU21OLCExLEMudWNQKQotQy5PTz1uZXcgSC5JTigiZmxhZyIpCi1DLkNmPW5ldyBBLkVTKEMuT08sQy5CTSwhMSxDLlVaLCExLEMudWNQKQotQy5POT1uZXcgSC5JTigicG9sbFBlcmlvZCIpCitDLk9PPW5ldyBILnR4KCJmbGFnIikKK0MuQ2Y9bmV3IEEuRVMoQy5PTyxDLkJNLCExLEMuU1hLLCExLEMudWNQKQorQy5POT1uZXcgSC50eCgicG9sbFBlcmlvZCIpCiBDLnE5PW5ldyBBLkVTKEMuTzksQy5CTSwhMSxDLmVQLCExLEMuZXN4KQotQy51az1uZXcgSC5JTigibGFzdCIpCitDLnVrPW5ldyBILnR4KCJsYXN0IikKIEMucDQ9bmV3IEEuRVMoQy51ayxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLmFtPW5ldyBILklOKCJjaHJvbWVUYXJnZXRzIikKK0MuYW09bmV3IEgudHgoImNocm9tZVRhcmdldHMiKQogQy5KRD1uZXcgQS5FUyhDLmFtLEMuQk0sITEsQy5Hc2MsITEsQy5lc3gpCi1DLm9FPW5ldyBILklOKCJjaHJvbWl1bUFkZHJlc3MiKQorQy5vRT1uZXcgSC50eCgiY2hyb21pdW1BZGRyZXNzIikKIEMucjI9bmV3IEEuRVMoQy5vRSxDLkJNLCExLEMuR2gsITEsQy51Y1ApCi1DLldRPW5ldyBILklOKCJmaWVsZCIpCitDLldRPW5ldyBILnR4KCJmaWVsZCIpCiBDLmFoPW5ldyBBLkVTKEMuV1EsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMucjE9bmV3IEguSU4oImV4cGFuZENoYW5nZWQiKQorQy5yMT1uZXcgSC50eCgiZXhwYW5kQ2hhbmdlZCIpCiBDLm5QPW5ldyBBLkVTKEMucjEsQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy5NYz1uZXcgSC5JTigiZmxhZ0xpc3QiKQorQy5NYz1uZXcgSC50eCgiZmxhZ0xpc3QiKQogQy5mMD1uZXcgQS5FUyhDLk1jLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLmZuPW5ldyBILklOKCJpbnN0YW5jZSIpCitDLmZuPW5ldyBILnR4KCJpbnN0YW5jZSIpCiBDLmZ6PW5ldyBBLkVTKEMuZm4sQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuckU9bmV3IEguSU4oImZyYW1lIikKLUMuS1M9bmV3IEEuRVMoQy5yRSxDLkJNLCExLEMuVVosITEsQy51Y1ApCi1DLmNnPW5ldyBILklOKCJhbmNob3IiKQorQy5yRT1uZXcgSC50eCgiZnJhbWUiKQorQy5LUz1uZXcgQS5FUyhDLnJFLEMuQk0sITEsQy5TWEssITEsQy51Y1ApCitDLmNnPW5ldyBILnR4KCJhbmNob3IiKQogQy5sbD1uZXcgQS5FUyhDLmNnLEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKIEMubmdtPUkudUwoW0MuSjE5XSkKIEMuUXM9bmV3IEEuRVMoQy5pNCxDLkJNLCEwLEMucE0sITEsQy5uZ20pCi1DLm1pPW5ldyBILklOKCJ0ZXh0IikKK0MubWk9bmV3IEgudHgoInRleHQiKQogQy55Vj1uZXcgQS5FUyhDLm1pLEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMudFc9bmV3IEguSU4oInBvcyIpCitDLnRXPW5ldyBILnR4KCJwb3MiKQogQy5rSD1uZXcgQS5FUyhDLnRXLEMuQk0sITEsQy55dywhMSxDLnVjUCkKLUMueFA9bmV3IEguSU4oInJlZiIpCi1DLlRPPW5ldyBBLkVTKEMueFAsQy5CTSwhMSxDLlNtTiwhMSxDLnVjUCkKK0Mua1k9bmV3IEgudHgoInJlZiIpCitDLlRPPW5ldyBBLkVTKEMua1ksQy5CTSwhMSxDLlNtTiwhMSxDLnVjUCkKIEMub3FvPUguSUwoJ3BEJykKIEMuVWw9bmV3IEEuRVMoQy55aCxDLkJNLCExLEMub3FvLCExLEMudWNQKQogQy5RcD1uZXcgQS5FUyhDLkFWLEMuQk0sITEsQy5lUCwhMSxDLnVjUCkKLUMudmI9bmV3IEguSU4oInByb2ZpbGUiKQorQy52Yj1uZXcgSC50eCgicHJvZmlsZSIpCiBDLk1xPW5ldyBBLkVTKEMudmIsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKIEMubnk9bmV3IFAuYTYoMCkKIEMuVTM9SC5WTShuZXcgVy5Ga08oImNoYW5nZSIpLFtXLmVhXSkKIEMuVDE9SC5WTShuZXcgVy5Ga08oImNsaWNrIiksW1cuQWpZXSkKIEMuaTY9SC5WTShuZXcgVy5Ga08oImNsb3NlIiksW1cuQkldKQogQy5pdz1ILlZNKG5ldyBXLkZrTygiZGlzY29ubmVjdCIpLFtXLlBHXSkKLUMuSk49SC5WTShuZXcgVy5Ga08oImVycm9yIiksW1cua2ZdKQorQy5KTj1ILlZNKG5ldyBXLkZrTygiZXJyb3IiKSxbVy5ldzddKQogQy5NRD1ILlZNKG5ldyBXLkZrTygiZXJyb3IiKSxbVy5lYV0pCiBDLmkzPUguVk0obmV3IFcuRmtPKCJpbnB1dCIpLFtXLmVhXSkKLUMuTEY9SC5WTShuZXcgVy5Ga08oImxvYWQiKSxbVy5rZl0pCitDLkxGPUguVk0obmV3IFcuRmtPKCJsb2FkIiksW1cuZXc3XSkKIEMucGg9SC5WTShuZXcgVy5Ga08oIm1lc3NhZ2UiKSxbVy5IeV0pCiBDLldodz1ILlZNKG5ldyBXLkZrTygibW91c2Vkb3duIiksW1cuQWpZXSkKIEMuS3E9SC5WTShuZXcgVy5Ga08oIm1vdXNlbW92ZSIpLFtXLkFqWV0pCkBAIC0yMDQ2MSw3ICsyMDcyMiw3IEBACiAgIGhvb2tzLmdldFRhZyA9IGdldFRhZ0ZpeGVkOwogICBob29rcy5wcm90b3R5cGVGb3JUYWcgPSBwcm90b3R5cGVGb3JUYWdGaXhlZDsKIH0KLUMueHI9bmV3IFAucEUobnVsbCxudWxsKQorQy54cj1uZXcgUC5ieWcobnVsbCxudWxsKQogQy5BMz1uZXcgUC5jNShudWxsKQogQy5jYj1uZXcgUC5vakYobnVsbCxudWxsKQogQy5EOD1uZXcgTi5xVigiRklORVIiLDQwMCkKQEAgLTIwNDY5LDIwICsyMDczMCwyMSBAQAogQy5JRj1uZXcgTi5xVigiSU5GTyIsODAwKQogQy5jZD1uZXcgTi5xVigiU0VWRVJFIiwxMDAwKQogQy5uVD1uZXcgTi5xVigiV0FSTklORyIsOTAwKQorQy5HYj1ILlZNKEkudUwoWzEyNywyMDQ3LDY1NTM1LDExMTQxMTFdKSxbUC5LTl0pCiBDLk5HPUkudUwoWzEsNl0pCiBDLkpIPUkudUwoWzAsMCwyNjYyNCwxMDIzLDAsMCw2NTUzNCwyMDQ3XSkKLUMuU1Y9bmV3IEguSU4oImtleXMiKQotQy5VcT1uZXcgSC5JTigidmFsdWVzIikKLUMuV249bmV3IEguSU4oImxlbmd0aCIpCi1DLmFpPW5ldyBILklOKCJpc0VtcHR5IikKLUMublo9bmV3IEguSU4oImlzTm90RW1wdHkiKQorQy5TVj1uZXcgSC50eCgia2V5cyIpCitDLlVxPW5ldyBILnR4KCJ2YWx1ZXMiKQorQy5Xbj1uZXcgSC50eCgibGVuZ3RoIikKK0MuYWk9bmV3IEgudHgoImlzRW1wdHkiKQorQy5uWj1uZXcgSC50eCgiaXNOb3RFbXB0eSIpCiBDLlp3PUkudUwoW0MuU1YsQy5VcSxDLlduLEMuYWksQy5uWl0pCiBDLmZXPUguVk0oSS51TChbIisiLCItIiwiKiIsIi8iLCIlIiwiXiIsIj09IiwiIT0iLCI+IiwiPCIsIj49IiwiPD0iLCJ8fCIsIiYmIiwiJiIsIj09PSIsIiE9PSIsInwiXSksW1AucVVdKQotQy5OTD1JLnVMKFswLDAsMjY2MjQsMTAyMyw2NTUzNCwyMDQ3LDY1NTM0LDIwNDddKQorQy5tS3k9SS51TChbMCwwLDI2NjI0LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSkKIEMueUQ9SS51TChbMCwwLDI2NDk4LDEwMjMsNjU1MzQsMzQ4MTUsNjU1MzQsMTg0MzFdKQotQy5OND1ILklMKCduZCcpCi1DLkNkPUkudUwoW0MuTjRdKQotQy5HOD1JLnVMKFsiPT0iLCIhPSIsIjw9IiwiPj0iLCJ8fCIsIiYmIl0pCitDLnB6Yz1ILklMKCduZCcpCitDLkNkPUkudUwoW0MucHpjXSkKK0MuRm49SS51TChbIj09IiwiIT0iLCI8PSIsIj49IiwifHwiLCImJiJdKQogQy5vUD1JLnVMKFsiYXMiLCJpbiIsInRoaXMiXSkKIEMuUUM9SS51TChbInJvd0NvbG9yMCIsInJvd0NvbG9yMSIsInJvd0NvbG9yMiIsInJvd0NvbG9yMyIsInJvd0NvbG9yNCIsInJvd0NvbG9yNSIsInJvd0NvbG9yNiIsInJvd0NvbG9yNyIsInJvd0NvbG9yOCJdKQogQy5iZz1JLnVMKFs0Myw0NSw0Miw0NywzMywzOCwzNyw2MCw2MSw2Miw2Myw5NCwxMjRdKQpAQCAtMjA0OTYsMjAwICsyMDc1OCwyMTQgQEAKIEMuZkU9bmV3IEguUHgoMTQse2RvbWZvY3Vzb3V0OiJET01Gb2N1c091dCIsZG9tZm9jdXNpbjoiRE9NRm9jdXNJbiIsZG9tbW91c2VzY3JvbGw6IkRPTU1vdXNlU2Nyb2xsIixhbmltYXRpb25lbmQ6IndlYmtpdEFuaW1hdGlvbkVuZCIsYW5pbWF0aW9uaXRlcmF0aW9uOiJ3ZWJraXRBbmltYXRpb25JdGVyYXRpb24iLGFuaW1hdGlvbnN0YXJ0OiJ3ZWJraXRBbmltYXRpb25TdGFydCIsZG91YmxlY2xpY2s6ImRibGNsaWNrIixmdWxsc2NyZWVuY2hhbmdlOiJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIixmdWxsc2NyZWVuZXJyb3I6IndlYmtpdGZ1bGxzY3JlZW5lcnJvciIsa2V5YWRkZWQ6IndlYmtpdGtleWFkZGVkIixrZXllcnJvcjoid2Via2l0a2V5ZXJyb3IiLGtleW1lc3NhZ2U6IndlYmtpdGtleW1lc3NhZ2UiLG5lZWRrZXk6IndlYmtpdG5lZWRrZXkiLHNwZWVjaGNoYW5nZToid2Via2l0U3BlZWNoQ2hhbmdlIn0sQy5WZ3YpCiBDLnJXYz1JLnVMKFsibmFtZSIsImV4dGVuZHMiLCJjb25zdHJ1Y3RvciIsIm5vc2NyaXB0IiwiYXNzZXRwYXRoIiwiY2FjaGUtY3NzdGV4dCIsImF0dHJpYnV0ZXMiXSkKIEMubjc9bmV3IEguUHgoNyx7bmFtZToxLGV4dGVuZHM6MSxjb25zdHJ1Y3RvcjoxLG5vc2NyaXB0OjEsYXNzZXRwYXRoOjEsImNhY2hlLWNzc3RleHQiOjEsYXR0cmlidXRlczoxfSxDLnJXYykKLUMuWTE9SS51TChbIiEiLCI6IiwiLCIsIikiLCJdIiwifSIsIj8iLCJ8fCIsIiYmIiwifCIsIl4iLCImIiwiIT0iLCI9PSIsIiE9PSIsIj09PSIsIj49IiwiPiIsIjw9IiwiPCIsIisiLCItIiwiJSIsIi8iLCIqIiwiKCIsIlsiLCIuIiwieyJdKQotQy5seD1uZXcgSC5QeCgyOSx7IiEiOjAsIjoiOjAsIiwiOjAsIikiOjAsIl0iOjAsIn0iOjAsIj8iOjEsInx8IjoyLCImJiI6MywifCI6NCwiXiI6NSwiJiI6NiwiIT0iOjcsIj09Ijo3LCIhPT0iOjcsIj09PSI6NywiPj0iOjgsIj4iOjgsIjw9Ijo4LCI8Ijo4LCIrIjo5LCItIjo5LCIlIjoxMCwiLyI6MTAsIioiOjEwLCIoIjoxMSwiWyI6MTEsIi4iOjExLCJ7IjoxMX0sQy5ZMSkKK0Mua0tpPUkudUwoWyIhIiwiOiIsIiwiLCIpIiwiXSIsIn0iLCI/IiwifHwiLCImJiIsInwiLCJeIiwiJiIsIiE9IiwiPT0iLCIhPT0iLCI9PT0iLCI+PSIsIj4iLCI8PSIsIjwiLCIrIiwiLSIsIiUiLCIvIiwiKiIsIigiLCJbIiwiLiIsInsiXSkKK0MubHg9bmV3IEguUHgoMjkseyIhIjowLCI6IjowLCIsIjowLCIpIjowLCJdIjowLCJ9IjowLCI/IjoxLCJ8fCI6MiwiJiYiOjMsInwiOjQsIl4iOjUsIiYiOjYsIiE9Ijo3LCI9PSI6NywiIT09Ijo3LCI9PT0iOjcsIj49Ijo4LCI+Ijo4LCI8PSI6OCwiPCI6OCwiKyI6OSwiLSI6OSwiJSI6MTAsIi8iOjEwLCIqIjoxMCwiKCI6MTEsIlsiOjExLCIuIjoxMSwieyI6MTF9LEMua0tpKQogQy5DTT1uZXcgSC5QeCgwLHt9LEMuZG4pCiBDLk1FRz1JLnVMKFsiZW51bWVyYXRlIl0pCi1DLnZhPW5ldyBILlB4KDEse2VudW1lcmF0ZTpLLnBnKCl9LEMuTUVHKQorQy52YT1uZXcgSC5QeCgxLHtlbnVtZXJhdGU6Sy5VTSgpfSxDLk1FRykKIEMudHE9SC5JTCgnQm8nKQogQy51d2o9SC5JTCgnd0EnKQogQy53RT1JLnVMKFtDLnV3al0pCi1DLlhrPW5ldyBBLldxKCExLCExLCEwLEMudHEsITEsITAsQy53RSxudWxsKQorQy5UYj1uZXcgQS5XcSghMSwhMSwhMCxDLnRxLCExLCEwLEMud0UsbnVsbCkKIEMudURrPUguSUwoJ2hHJykKIEMudG1GPUkudUwoW0MudURrXSkKIEMuYWo9bmV3IEEuV3EoITAsITAsITAsQy50cSwhMSwhMSxDLnRtRixudWxsKQotQy53aj1uZXcgRC5NOXgoIkludGVybmFsIikKLUMuQ249bmV3IEQuTTl4KCJMaXN0ZW5pbmciKQotQy5sVD1uZXcgRC5NOXgoIk5vcm1hbCIpCi1DLkZKPW5ldyBELk05eCgiUGlwZSIpCi1DLkJFPW5ldyBILklOKCJhdmVyYWdlQ29sbGVjdGlvblBlcmlvZEluTWlsbGlzIikKLUMuSUg9bmV3IEguSU4oImFkZHJlc3MiKQotQy5qMj1uZXcgSC5JTigiYXBwIikKLUMua2U9bmV3IEguSU4oImFyY2hpdGVjdHVyZSIpCi1DLkVUPW5ldyBILklOKCJhc3NlcnRzRW5hYmxlZCIpCi1DLldDPW5ldyBILklOKCJicHQiKQotQy5oUj1uZXcgSC5JTigiYnJlYWtwb2ludCIpCi1DLlJvPW5ldyBILklOKCJidXR0b25DbGljayIpCi1DLmhOPW5ldyBILklOKCJieXRlcyIpCi1DLkthPW5ldyBILklOKCJjYWxsIikKLUMuYlY9bmV3IEguSU4oImNhcGFjaXR5IikKLUMuQzA9bmV3IEguSU4oImNoYW5nZSIpCi1DLmVaPW5ldyBILklOKCJjaGFuZ2VTb3J0IikKLUMuT0k9bmV3IEguSU4oImNsYXNzZXMiKQotQy5JOT1uZXcgSC5JTigiY2xvc2VJdGVtIikKLUMuVG89bmV3IEguSU4oImNsb3NpbmciKQotQy5XRz1uZXcgSC5JTigiY29sbGVjdGlvbnMiKQotQy5xdD1uZXcgSC5JTigiY29sb3JpbmciKQotQy5wMT1uZXcgSC5JTigiY29sdW1ucyIpCi1DLnlKPW5ldyBILklOKCJjb25uZWN0U3RhbmRhbG9uZSIpCi1DLmxhPW5ldyBILklOKCJjb25uZWN0VG9WbSIpCi1DLkplPW5ldyBILklOKCJjdXJyZW50IikKLUMuTHc9bmV3IEguSU4oImRlbGV0ZVZtIikKLUMuaUU9bmV3IEguSU4oImRlc2NyaXB0b3IiKQotQy5mND1uZXcgSC5JTigiZGVzY3JpcHRvcnMiKQotQy5hSz1uZXcgSC5JTigiZG9BY3Rpb24iKQotQy5HUD1uZXcgSC5JTigiZWxlbWVudCIpCi1DLkZlPW5ldyBILklOKCJlbmRUb2tlblBvcyIpCi1DLnRQPW5ldyBILklOKCJlbnRyeSIpCi1DLlpiPW5ldyBILklOKCJldmFsIikKLUMudTc9bmV3IEguSU4oImV2YWxOb3ciKQotQy5xUj1uZXcgSC5JTigiZXZlbnRUeXBlIikKLUMuRWs9bmV3IEguSU4oImV4cGFuZGVyIikKLUMuUG49bmV3IEguSU4oImV4cGFuZGVyU3R5bGUiKQotQy5oNz1uZXcgSC5JTigiZXh0ZXJuYWwiKQotQy5SMz1uZXcgSC5JTigiZmQiKQotQy5mVj1uZXcgSC5JTigiZmllbGRzIikKLUMuR2Q9bmV3IEguSU4oImZpcnN0VG9rZW5Qb3MiKQotQy5GUD1uZXcgSC5JTigiZm9ybWF0U2l6ZSIpCi1DLmtGPW5ldyBILklOKCJmb3JtYXRUaW1lIikKLUMuVUQ9bmV3IEguSU4oImZvcm1hdHRlZEFkZHJlc3MiKQotQy5BcT1uZXcgSC5JTigiZm9ybWF0dGVkQXZlcmFnZSIpCi1DLkRTPW5ldyBILklOKCJmb3JtYXR0ZWRDb2xsZWN0aW9ucyIpCi1DLkM5PW5ldyBILklOKCJmb3JtYXR0ZWREZW9wdElkIikKLUMuVkY9bmV3IEguSU4oImZvcm1hdHRlZEV4Y2x1c2l2ZSIpCi1DLnVVPW5ldyBILklOKCJmb3JtYXR0ZWRFeGNsdXNpdmVUaWNrcyIpCi1DLllKPW5ldyBILklOKCJmb3JtYXR0ZWRJbmNsdXNpdmUiKQotQy5lRj1uZXcgSC5JTigiZm9ybWF0dGVkSW5jbHVzaXZlVGlja3MiKQotQy5vST1uZXcgSC5JTigiZm9ybWF0dGVkTGluZSIpCi1DLlNUPW5ldyBILklOKCJmb3JtYXR0ZWRUb3RhbENvbGxlY3Rpb25UaW1lIikKLUMuRUk9bmV3IEguSU4oImZ1bmN0aW9ucyIpCi1DLkpCPW5ldyBILklOKCJnZXRDb2x1bW5MYWJlbCIpCi1DLlJZPW5ldyBILklOKCJnZXRUYWJzIikKLUMuZDQ9bmV3IEguSU4oImdvdG8iKQotQy5jRj1uZXcgSC5JTigiZ290b0xpbmsiKQotQy5TST1uZXcgSC5JTigiaGFzRGVzY3JpcHRvcnMiKQotQy56Uz1uZXcgSC5JTigiaGFzRGlzYXNzZW1ibHkiKQotQy5ZQT1uZXcgSC5JTigiaGFzTm9BbGxvY2F0aW9ucyIpCi1DLkdlPW5ldyBILklOKCJoYXNoTGlua1dvcmthcm91bmQiKQotQy5pbT1uZXcgSC5JTigiaGlzdG9yeSIpCi1DLlNzPW5ldyBILklOKCJoaXRzIikKLUMuazY9bmV3IEguSU4oImhvdmVyVGV4dCIpCi1DLlBKPW5ldyBILklOKCJodW1hbiIpCi1DLnEyPW5ldyBILklOKCJpZGxlIikKLUMuZDI9bmV3IEguSU4oImltcCIpCi1DLmtOPW5ldyBILklOKCJpbXBvcnRzIikKLUMuZUo9bmV3IEguSU4oImluc3RydWN0aW9uIikKLUMuaUc9bmV3IEguSU4oImluc3RydWN0aW9ucyIpCi1DLlB5PW5ldyBILklOKCJpbnRlcmZhY2UiKQotQy5wQz1uZXcgSC5JTigiaW50ZXJmYWNlcyIpCi1DLmlBPW5ldyBILklOKCJpb0VuYWJsZWQiKQotQy5YSD1uZXcgSC5JTigiaXNBYnN0cmFjdCIpCi1DLnRKPW5ldyBILklOKCJpc0Jvb2wiKQotQy5GOD1uZXcgSC5JTigiaXNDaHJvbWVUYXJnZXQiKQotQy5DMT1uZXcgSC5JTigiaXNDb21tZW50IikKLUMuRDY9bmV3IEguSU4oImlzQ29uc3QiKQotQy5uTD1uZXcgSC5JTigiaXNDdXJyZW50VGFyZ2V0IikKLUMuWWc9bmV3IEguSU4oImlzRGFydENvZGUiKQotQy5iUj1uZXcgSC5JTigiaXNEb3VibGUiKQotQy5vYj1uZXcgSC5JTigiaXNFcnJvciIpCi1DLldWPW5ldyBILklOKCJpc0ZpbmFsaXplZCIpCi1DLkloPW5ldyBILklOKCJpc0ltcGxlbWVudGVkIikKLUMuSXY9bmV3IEguSU4oImlzSW5zdGFuY2UiKQotQy5XZz1uZXcgSC5JTigiaXNJbnQiKQotQy50RD1uZXcgSC5JTigiaXNMaXN0IikKLUMuT2Y9bmV3IEguSU4oImlzTnVsbCIpCi1DLnBZPW5ldyBILklOKCJpc09wdGltaXplZCIpCi1DLlhMPW5ldyBILklOKCJpc1BhdGNoIikKLUMuTEE9bmV3IEguSU4oImlzUGlwZSIpCi1DLkxrPW5ldyBILklOKCJpc1N0cmluZyIpCi1DLmRLPW5ldyBILklOKCJpc1R5cGUiKQotQy54Zj1uZXcgSC5JTigiaXNVbmV4cGVjdGVkIikKLUMuSng9bmV3IEguSU4oImlzb2xhdGVzIikKLUMuYjU9bmV3IEguSU4oImp1bXBUYXJnZXQiKQotQy5rQT1uZXcgSC5JTigibGFzdFRva2VuUG9zIikKLUMuR0k9bmV3IEguSU4oImxhc3RVcGRhdGUiKQotQy51cj1uZXcgSC5JTigibGliIikKLUMuVk49bmV3IEguSU4oImxpYnJhcmllcyIpCi1DLlZJPW5ldyBILklOKCJsaW5lIikKLUMucjY9bmV3IEguSU4oImxpbmVOdW1iZXIiKQotQy5NVz1uZXcgSC5JTigibGluZU51bWJlcnMiKQotQy5jYz1uZXcgSC5JTigibGlzdGVuaW5nIikKLUMuRFk9bmV3IEguSU4oImxvYWRpbmciKQotQy5MeD1uZXcgSC5JTigibG9jYWxBZGRyZXNzIikKLUMuTTM9bmV3IEguSU4oImxvY2FsUG9ydCIpCi1DLndUPW5ldyBILklOKCJtYWluUG9ydCIpCi1DLnBYPW5ldyBILklOKCJtZXNzYWdlIikKLUMuVkQ9bmV3IEguSU4oIm1vdXNlT3V0IikKLUMuTk49bmV3IEguSU4oIm1vdXNlT3ZlciIpCi1DLllTPW5ldyBILklOKCJuYW1lIikKLUMucHU9bmV3IEguSU4oIm5hbWVJc0VtcHR5IikKLUMuQko9bmV3IEguSU4oIm5ld1NwYWNlIikKLUMuT1Y9bmV3IEguSU4oIm5vU3VjaE1ldGhvZCIpCi1DLmM2PW5ldyBILklOKCJub3RpZmljYXRpb25zIikKLUMuam89bmV3IEguSU4oIm9iamVjdENsYXNzIikKLUMuek89bmV3IEguSU4oIm9iamVjdFBvb2wiKQotQy52Zz1uZXcgSC5JTigib2xkU3BhY2UiKQotQy56bT1uZXcgSC5JTigicGFkZGluZyIpCi1DLkljPW5ldyBILklOKCJwYXVzZSIpCi1DLnlHPW5ldyBILklOKCJwYXVzZUV2ZW50IikKLUMudUk9bmV3IEguSU4oInBpZCIpCi1DLkFZPW5ldyBILklOKCJwcm90b2NvbCIpCi1DLlhkPW5ldyBILklOKCJyZWFjaGFibGUiKQotQy5JNz1uZXcgSC5JTigicmVhZENsb3NlZCIpCi1DLkdSPW5ldyBILklOKCJyZWZyZXNoIikKLUMuS1g9bmV3IEguSU4oInJlZnJlc2hDb3ZlcmFnZSIpCi1DLmphPW5ldyBILklOKCJyZWZyZXNoR0MiKQotQy5NVD1uZXcgSC5JTigicmVnaXN0ZXJDYWxsYmFjayIpCi1DLmlyPW5ldyBILklOKCJyZWxhdGl2ZUxpbmsiKQotQy5keD1uZXcgSC5JTigicmVtb3RlQWRkcmVzcyIpCi1DLm5pPW5ldyBILklOKCJyZW1vdGVQb3J0IikKLUMuWDI9bmV3IEguSU4oInJlc2V0QWNjdW11bGF0b3IiKQotQy5GMz1uZXcgSC5JTigicmVzcG9uc2UiKQotQy5uWT1uZXcgSC5JTigicmVzdW1lIikKLUMuSEQ9bmV3IEguSU4oInJldGFpbmVkU2l6ZSIpCi1DLmlVPW5ldyBILklOKCJyZXRhaW5pbmdQYXRoIikKLUMuZU49bmV3IEguSU4oInJvb3RMaWIiKQotQy51ZT1uZXcgSC5JTigicm93IikKLUMubmg9bmV3IEguSU4oInJvd3MiKQotQy5MMj1uZXcgSC5JTigicnVubmluZyIpCi1DLkVBPW5ldyBILklOKCJzY3JpcHRzIikKLUMub1c9bmV3IEguSU4oInNlbGVjdEV4cHIiKQotQy5oZD1uZXcgSC5JTigic2VydmljZVR5cGUiKQotQy5qTT1uZXcgSC5JTigic29ja2V0T3duZXIiKQotQy5ITz1uZXcgSC5JTigic3RhY2t0cmFjZSIpCi1DLlc1PW5ldyBILklOKCJzdGFuZGFsb25lIikKLUMueEE9bmV3IEguSU4oInN0eWxlRm9ySGl0cyIpCi1DLms1PW5ldyBILklOKCJzdWJDbGFzc2VzIikKLUMuTnY9bmV3IEguSU4oInN1YmNsYXNzIikKLUMuQ3c9bmV3IEguSU4oInN1cGVyQ2xhc3MiKQotQy5RRj1uZXcgSC5JTigidGFyZ2V0cyIpCi1DLmhPPW5ldyBILklOKCJ0aXBFeGNsdXNpdmUiKQotQy5laT1uZXcgSC5JTigidGlwS2luZCIpCi1DLkhLPW5ldyBILklOKCJ0aXBQYXJlbnQiKQotQy5qZT1uZXcgSC5JTigidGlwVGlja3MiKQotQy5FZj1uZXcgSC5JTigidGlwVGltZSIpCi1DLlJIPW5ldyBILklOKCJ0b1N0cmluZ0FzRml4ZWQiKQotQy5RMT1uZXcgSC5JTigidG9nZ2xlRXhwYW5kIikKLUMuSUQ9bmV3IEguSU4oInRvZ2dsZUV4cGFuZGVkIikKLUMuejY9bmV3IEguSU4oInRva2VuUG9zIikKLUMuYmM9bmV3IEguSU4oInRvcEZyYW1lIikKLUMuSmw9bmV3IEguSU4oInRvdGFsQ29sbGVjdGlvblRpbWVJblNlY29uZHMiKQotQy5Laj1uZXcgSC5JTigidG90YWxTYW1wbGVzSW5Qcm9maWxlIikKLUMuZXA9bmV3IEguSU4oInRyZWUiKQotQy5KMj1uZXcgSC5JTigidHlwZUNoZWNrc0VuYWJsZWQiKQotQy5ibj1uZXcgSC5JTigidXBkYXRlTGluZU1vZGUiKQotQy5taD1uZXcgSC5JTigidXB0aW1lIikKLUMuRmg9bmV3IEguSU4oInVybCIpCi1DLkxQPW5ldyBILklOKCJ1c2VkIikKLUMuamg9bmV3IEguSU4oInYiKQotQy5scz1uZXcgSC5JTigidmFsdWUiKQotQy5maj1uZXcgSC5JTigidmFyaWFibGUiKQotQy54dz1uZXcgSC5JTigidmFyaWFibGVzIikKLUMuem49bmV3IEguSU4oInZlcnNpb24iKQotQy5UYz1uZXcgSC5JTigidm1OYW1lIikKLUMuVXk9bmV3IEguSU4oIndyaXRlQ2xvc2VkIikKK0Mud2o9bmV3IEQubDhSKCJJbnRlcm5hbCIpCitDLkNuPW5ldyBELmw4UigiTGlzdGVuaW5nIikKK0MubFQ9bmV3IEQubDhSKCJOb3JtYWwiKQorQy5GSj1uZXcgRC5sOFIoIlBpcGUiKQorQy5CRT1uZXcgSC50eCgiYXZlcmFnZUNvbGxlY3Rpb25QZXJpb2RJbk1pbGxpcyIpCitDLklIPW5ldyBILnR4KCJhZGRyZXNzIikKK0MuajI9bmV3IEgudHgoImFwcCIpCitDLmtlPW5ldyBILnR4KCJhcmNoaXRlY3R1cmUiKQorQy5FVD1uZXcgSC50eCgiYXNzZXJ0c0VuYWJsZWQiKQorQy5XQz1uZXcgSC50eCgiYnB0IikKK0MuaFI9bmV3IEgudHgoImJyZWFrcG9pbnQiKQorQy5Sbz1uZXcgSC50eCgiYnV0dG9uQ2xpY2siKQorQy5oTj1uZXcgSC50eCgiYnl0ZXMiKQorQy5LYT1uZXcgSC50eCgiY2FsbCIpCitDLmJWPW5ldyBILnR4KCJjYXBhY2l0eSIpCitDLkMwPW5ldyBILnR4KCJjaGFuZ2UiKQorQy5lWj1uZXcgSC50eCgiY2hhbmdlU29ydCIpCitDLk9JPW5ldyBILnR4KCJjbGFzc2VzIikKK0MuSTk9bmV3IEgudHgoImNsb3NlSXRlbSIpCitDLlRvPW5ldyBILnR4KCJjbG9zaW5nIikKK0MuV0c9bmV3IEgudHgoImNvbGxlY3Rpb25zIikKK0MucXQ9bmV3IEgudHgoImNvbG9yaW5nIikKK0MucDE9bmV3IEgudHgoImNvbHVtbnMiKQorQy55Sj1uZXcgSC50eCgiY29ubmVjdFN0YW5kYWxvbmUiKQorQy5sYT1uZXcgSC50eCgiY29ubmVjdFRvVm0iKQorQy5KZT1uZXcgSC50eCgiY3VycmVudCIpCitDLlJHPW5ldyBILnR4KCJjdXJyZW50UGFnZSIpCitDLkx3PW5ldyBILnR4KCJkZWxldGVWbSIpCitDLmVSPW5ldyBILnR4KCJkZW9wdGltaXphdGlvbnMiKQorQy5pRT1uZXcgSC50eCgiZGVzY3JpcHRvciIpCitDLmY0PW5ldyBILnR4KCJkZXNjcmlwdG9ycyIpCitDLmFLPW5ldyBILnR4KCJkb0FjdGlvbiIpCitDLkdQPW5ldyBILnR4KCJlbGVtZW50IikKK0MuRmU9bmV3IEgudHgoImVuZFRva2VuUG9zIikKK0MudFA9bmV3IEgudHgoImVudHJ5IikKK0MuWmI9bmV3IEgudHgoImV2YWwiKQorQy51Nz1uZXcgSC50eCgiZXZhbE5vdyIpCitDLnFSPW5ldyBILnR4KCJldmVudFR5cGUiKQorQy5Faz1uZXcgSC50eCgiZXhwYW5kZXIiKQorQy5Qbj1uZXcgSC50eCgiZXhwYW5kZXJTdHlsZSIpCitDLmg3PW5ldyBILnR4KCJleHRlcm5hbCIpCitDLlIzPW5ldyBILnR4KCJmZCIpCitDLmZWPW5ldyBILnR4KCJmaWVsZHMiKQorQy5HZD1uZXcgSC50eCgiZmlyc3RUb2tlblBvcyIpCitDLkZQPW5ldyBILnR4KCJmb3JtYXRTaXplIikKK0Mua0Y9bmV3IEgudHgoImZvcm1hdFRpbWUiKQorQy5VRD1uZXcgSC50eCgiZm9ybWF0dGVkQWRkcmVzcyIpCitDLkFxPW5ldyBILnR4KCJmb3JtYXR0ZWRBdmVyYWdlIikKK0MuRFM9bmV3IEgudHgoImZvcm1hdHRlZENvbGxlY3Rpb25zIikKK0MuQzk9bmV3IEgudHgoImZvcm1hdHRlZERlb3B0SWQiKQorQy5WRj1uZXcgSC50eCgiZm9ybWF0dGVkRXhjbHVzaXZlIikKK0MudVU9bmV3IEgudHgoImZvcm1hdHRlZEV4Y2x1c2l2ZVRpY2tzIikKK0MuWUo9bmV3IEgudHgoImZvcm1hdHRlZEluY2x1c2l2ZSIpCitDLmVGPW5ldyBILnR4KCJmb3JtYXR0ZWRJbmNsdXNpdmVUaWNrcyIpCitDLm9JPW5ldyBILnR4KCJmb3JtYXR0ZWRMaW5lIikKK0MuU1Q9bmV3IEgudHgoImZvcm1hdHRlZFRvdGFsQ29sbGVjdGlvblRpbWUiKQorQy5FST1uZXcgSC50eCgiZnVuY3Rpb25zIikKK0MuSkI9bmV3IEgudHgoImdldENvbHVtbkxhYmVsIikKK0MuUlk9bmV3IEgudHgoImdldFRhYnMiKQorQy5kND1uZXcgSC50eCgiZ290byIpCitDLmNGPW5ldyBILnR4KCJnb3RvTGluayIpCitDLlNJPW5ldyBILnR4KCJoYXNEZXNjcmlwdG9ycyIpCitDLnpTPW5ldyBILnR4KCJoYXNEaXNhc3NlbWJseSIpCitDLllBPW5ldyBILnR4KCJoYXNOb0FsbG9jYXRpb25zIikKK0MuR2U9bmV3IEgudHgoImhhc2hMaW5rV29ya2Fyb3VuZCIpCitDLmltPW5ldyBILnR4KCJoaXN0b3J5IikKK0MuU3M9bmV3IEgudHgoImhpdHMiKQorQy5rNj1uZXcgSC50eCgiaG92ZXJUZXh0IikKK0MuUEo9bmV3IEgudHgoImh1bWFuIikKK0MucTI9bmV3IEgudHgoImlkbGUiKQorQy5kMj1uZXcgSC50eCgiaW1wIikKK0Mua049bmV3IEgudHgoImltcG9ydHMiKQorQy5lSj1uZXcgSC50eCgiaW5zdHJ1Y3Rpb24iKQorQy5pRz1uZXcgSC50eCgiaW5zdHJ1Y3Rpb25zIikKK0MuUHk9bmV3IEgudHgoImludGVyZmFjZSIpCitDLnBDPW5ldyBILnR4KCJpbnRlcmZhY2VzIikKK0MuaUE9bmV3IEgudHgoImlvRW5hYmxlZCIpCitDLlhIPW5ldyBILnR4KCJpc0Fic3RyYWN0IikKK0MudEo9bmV3IEgudHgoImlzQm9vbCIpCitDLkY4PW5ldyBILnR4KCJpc0Nocm9tZVRhcmdldCIpCitDLkMxPW5ldyBILnR4KCJpc0NvbW1lbnQiKQorQy5Ocj1uZXcgSC50eCgiaXNDb25zdCIpCitDLm5MPW5ldyBILnR4KCJpc0N1cnJlbnRUYXJnZXQiKQorQy5hMD1uZXcgSC50eCgiaXNEYXJ0IikKK0MuWWc9bmV3IEgudHgoImlzRGFydENvZGUiKQorQy5iUj1uZXcgSC50eCgiaXNEb3VibGUiKQorQy5vYj1uZXcgSC50eCgiaXNFcnJvciIpCitDLldWPW5ldyBILnR4KCJpc0ZpbmFsaXplZCIpCitDLkloPW5ldyBILnR4KCJpc0ltcGxlbWVudGVkIikKK0MuTVk9bmV3IEgudHgoImlzSW5saW5hYmxlIikKK0MuSXY9bmV3IEgudHgoImlzSW5zdGFuY2UiKQorQy5XZz1uZXcgSC50eCgiaXNJbnQiKQorQy50RD1uZXcgSC50eCgiaXNMaXN0IikKK0MuT2Y9bmV3IEgudHgoImlzTnVsbCIpCitDLlZsPW5ldyBILnR4KCJpc09wdGltaXphYmxlIikKK0MucFk9bmV3IEgudHgoImlzT3B0aW1pemVkIikKK0MuWEw9bmV3IEgudHgoImlzUGF0Y2giKQorQy5MQT1uZXcgSC50eCgiaXNQaXBlIikKK0MuQVQ9bmV3IEgudHgoImlzU3RhdGljIikKK0MuTGs9bmV3IEgudHgoImlzU3RyaW5nIikKK0MuZEs9bmV3IEgudHgoImlzVHlwZSIpCitDLnhmPW5ldyBILnR4KCJpc1VuZXhwZWN0ZWQiKQorQy5KeD1uZXcgSC50eCgiaXNvbGF0ZXMiKQorQy5iNT1uZXcgSC50eCgianVtcFRhcmdldCIpCitDLkxjPW5ldyBILnR4KCJraW5kIikKK0Mua0E9bmV3IEgudHgoImxhc3RUb2tlblBvcyIpCitDLkdJPW5ldyBILnR4KCJsYXN0VXBkYXRlIikKK0MudXI9bmV3IEgudHgoImxpYiIpCitDLlZOPW5ldyBILnR4KCJsaWJyYXJpZXMiKQorQy5WST1uZXcgSC50eCgibGluZSIpCitDLmNjPW5ldyBILnR4KCJsaXN0ZW5pbmciKQorQy5EWT1uZXcgSC50eCgibG9hZGluZyIpCitDLkx4PW5ldyBILnR4KCJsb2NhbEFkZHJlc3MiKQorQy5NMz1uZXcgSC50eCgibG9jYWxQb3J0IikKK0Mud1Q9bmV3IEgudHgoIm1haW5Qb3J0IikKK0MuSks9bmV3IEgudHgoIm1ha2VMaW5lSWQiKQorQy5wWD1uZXcgSC50eCgibWVzc2FnZSIpCitDLlZEPW5ldyBILnR4KCJtb3VzZU91dCIpCitDLk5OPW5ldyBILnR4KCJtb3VzZU92ZXIiKQorQy5ZUz1uZXcgSC50eCgibmFtZSIpCitDLnB1PW5ldyBILnR4KCJuYW1lSXNFbXB0eSIpCitDLkJKPW5ldyBILnR4KCJuZXdTcGFjZSIpCitDLk9WPW5ldyBILnR4KCJub1N1Y2hNZXRob2QiKQorQy5jNj1uZXcgSC50eCgibm90aWZpY2F0aW9ucyIpCitDLmpvPW5ldyBILnR4KCJvYmplY3RDbGFzcyIpCitDLnpPPW5ldyBILnR4KCJvYmplY3RQb29sIikKK0Mudmc9bmV3IEgudHgoIm9sZFNwYWNlIikKK0MuWVY9bmV3IEgudHgoIm93bmluZ0NsYXNzIikKK0MuSWY9bmV3IEgudHgoIm93bmluZ0xpYnJhcnkiKQorQy56bT1uZXcgSC50eCgicGFkZGluZyIpCitDLm5YPW5ldyBILnR4KCJwYXJlbnQiKQorQy54UD1uZXcgSC50eCgicGFyc2VJbnQiKQorQy5JYz1uZXcgSC50eCgicGF1c2UiKQorQy55Rz1uZXcgSC50eCgicGF1c2VFdmVudCIpCitDLnVJPW5ldyBILnR4KCJwaWQiKQorQy5BWT1uZXcgSC50eCgicHJvdG9jb2wiKQorQy5BTz1uZXcgSC50eCgicXVhbGlmaWVkTmFtZSIpCitDLlhkPW5ldyBILnR4KCJyZWFjaGFibGUiKQorQy5JNz1uZXcgSC50eCgicmVhZENsb3NlZCIpCitDLkdSPW5ldyBILnR4KCJyZWZyZXNoIikKK0MuS1g9bmV3IEgudHgoInJlZnJlc2hDb3ZlcmFnZSIpCitDLmphPW5ldyBILnR4KCJyZWZyZXNoR0MiKQorQy5NVD1uZXcgSC50eCgicmVnaXN0ZXJDYWxsYmFjayIpCitDLmlyPW5ldyBILnR4KCJyZWxhdGl2ZUxpbmsiKQorQy5keD1uZXcgSC50eCgicmVtb3RlQWRkcmVzcyIpCitDLm5pPW5ldyBILnR4KCJyZW1vdGVQb3J0IikKK0MuWDI9bmV3IEgudHgoInJlc2V0QWNjdW11bGF0b3IiKQorQy5GMz1uZXcgSC50eCgicmVzcG9uc2UiKQorQy5uWT1uZXcgSC50eCgicmVzdW1lIikKK0MuSEQ9bmV3IEgudHgoInJldGFpbmVkU2l6ZSIpCitDLmlVPW5ldyBILnR4KCJyZXRhaW5pbmdQYXRoIikKK0MuZU49bmV3IEgudHgoInJvb3RMaWIiKQorQy51ZT1uZXcgSC50eCgicm93IikKK0Mubmg9bmV3IEgudHgoInJvd3MiKQorQy5MMj1uZXcgSC50eCgicnVubmluZyIpCitDLkVBPW5ldyBILnR4KCJzY3JpcHRzIikKK0Mub1c9bmV3IEgudHgoInNlbGVjdEV4cHIiKQorQy5oZD1uZXcgSC50eCgic2VydmljZVR5cGUiKQorQy5qTT1uZXcgSC50eCgic29ja2V0T3duZXIiKQorQy5ITz1uZXcgSC50eCgic3RhY2t0cmFjZSIpCitDLlc1PW5ldyBILnR4KCJzdGFuZGFsb25lIikKK0MuazU9bmV3IEgudHgoInN1YkNsYXNzZXMiKQorQy5Odj1uZXcgSC50eCgic3ViY2xhc3MiKQorQy5Ddz1uZXcgSC50eCgic3VwZXJDbGFzcyIpCitDLlFGPW5ldyBILnR4KCJ0YXJnZXRzIikKK0MuaE89bmV3IEgudHgoInRpcEV4Y2x1c2l2ZSIpCitDLmVpPW5ldyBILnR4KCJ0aXBLaW5kIikKK0MuSEs9bmV3IEgudHgoInRpcFBhcmVudCIpCitDLmplPW5ldyBILnR4KCJ0aXBUaWNrcyIpCitDLkVmPW5ldyBILnR4KCJ0aXBUaW1lIikKK0MuUUw9bmV3IEgudHgoInRvU3RyaW5nIikKK0MuUkg9bmV3IEgudHgoInRvU3RyaW5nQXNGaXhlZCIpCitDLlExPW5ldyBILnR4KCJ0b2dnbGVFeHBhbmQiKQorQy5JRD1uZXcgSC50eCgidG9nZ2xlRXhwYW5kZWQiKQorQy56Nj1uZXcgSC50eCgidG9rZW5Qb3MiKQorQy5iYz1uZXcgSC50eCgidG9wRnJhbWUiKQorQy5oNT1uZXcgSC50eCgidG90YWxDb2xsZWN0aW9uVGltZUluU2Vjb25kcyIpCitDLktqPW5ldyBILnR4KCJ0b3RhbFNhbXBsZXNJblByb2ZpbGUiKQorQy5lcD1uZXcgSC50eCgidHJlZSIpCitDLkoyPW5ldyBILnR4KCJ0eXBlQ2hlY2tzRW5hYmxlZCIpCitDLk9VPW5ldyBILnR4KCJ1bm9wdGltaXplZENvZGUiKQorQy5ibj1uZXcgSC50eCgidXBkYXRlTGluZU1vZGUiKQorQy5taD1uZXcgSC50eCgidXB0aW1lIikKK0MuRmg9bmV3IEgudHgoInVybCIpCitDLnl2PW5ldyBILnR4KCJ1c2FnZUNvdW50ZXIiKQorQy5MUD1uZXcgSC50eCgidXNlZCIpCitDLmpoPW5ldyBILnR4KCJ2IikKK0MubHM9bmV3IEgudHgoInZhbHVlIikKK0MuZmo9bmV3IEgudHgoInZhcmlhYmxlIikKK0MueHc9bmV3IEgudHgoInZhcmlhYmxlcyIpCitDLnpuPW5ldyBILnR4KCJ2ZXJzaW9uIikKK0MuVGM9bmV3IEgudHgoInZtTmFtZSIpCitDLlV5PW5ldyBILnR4KCJ3cml0ZUNsb3NlZCIpCiBDLk1JPUguSUwoJ2h4JykKIEMuaFA9SC5JTCgndXonKQorQy5RYj1ILklMKCdKMycpCiBDLk1mPUguSUwoJ0cxJykKIEMucTBTPUguSUwoJ0RnJykKIEMuRGw9SC5JTCgnRjEnKQpAQCAtMjA3MDMsNyArMjA5NzksNiBAQAogQy5kUD1ILklMKCd2bScpCiBDLlZ4PUguSUwoJ01KJykKIEMuVmg9SC5JTCgnUHonKQotQy5IQz1ILklMKCdGMCcpCiBDLnJSPUguSUwoJ3dOJykKIEMueVM9SC5JTCgnRzYnKQogQy5TYj1ILklMKCdrbicpCkBAIC0yMDcxMiw3ICsyMDk4Nyw2IEBACiBDLkVaPUguSUwoJ29GJykKIEMudnc9SC5JTCgnVUsnKQogQy5Kbz1ILklMKCdpNycpCi1DLkJMPUguSUwoJ05yJykKIEMuT049SC5JTCgnb3YnKQogQy5qUj1ILklMKCdCZScpCiBDLmFsPUguSUwoJ2VzJykKQEAgLTIwNzMxLDEyICsyMTAwNSwxMCBAQAogQy5NdD1ILklMKCdodScpCiBDLmxhaj1ILklMKCdaWCcpCiBDLnBhPUguSUwoJ0NQJykKLUMueEU9SC5JTCgnYUMnKQogQy52dT1ILklMKCd1dycpCiBDLmNhPUguSUwoJ1o0JykKIEMucEo9SC5JTCgnUTYnKQogQy5ZeT1ILklMKCd1RScpCi1DLk01PUguSUwoJ3ljJykKIEMuWXhtPUguSUwoJ1BnJykKIEMuaWw9SC5JTCgneEknKQogQy5HMD1ILklMKCdtSicpCkBAIC0yMDc0NSw5ICsyMTAxNywxMSBAQAogQy5FRz1ILklMKCdPeicpCiBDLm53PUguSUwoJ2VvJykKIEMuT0c9SC5JTCgnZVcnKQorQy5vWj1ILklMKCdIUycpCiBDLmttPUguSUwoJ2ZsJykKIEMualY9SC5JTCgnckYnKQogQy5UcT1ILklMKCd2aicpCitDLm91PUguSUwoJ2FrJykKIEMuSlc9SC5JTCgnV3cnKQogQy5DVD1ILklMKCdTdCcpCiBDLndIPUguSUwoJ3pNJykKQEAgLTIwNzY0LDE3ICsyMTAzOCwxOCBAQAogQy5xRj1ILklMKCdtTycpCiBDLkV5PUguSUwoJ3dNJykKIEMucEY9SC5JTCgnV1MnKQotQy5uWD1ILklMKCdERScpCitDLnFaPUguSUwoJ0RFJykKIEMuanc9SC5JTCgneGMnKQogQy5OVz1ILklMKCd5ZScpCiBDLmpSaT1ILklMKCd3ZScpCiBDLlh2PUguSUwoJ241JykKIEMuWEk9SC5JTCgnY24nKQogQy5LTz1ILklMKCdaUCcpCitDLmhlPUguSUwoJ3FNJykKIEMuSm09SC5JTCgncTYnKQogQy5Xej1ILklMKCdwUicpCi1DLkVwPUguSUwoJ291JykKIEMudGM9SC5JTCgnTWEnKQorQy5Xcj1ILklMKCdtOScpCiBDLklvPUguSUwoJ1FoJykKIEMuUXQ9SC5JTCgnTksnKQogQy53az1ILklMKCduSicpCkBAIC0yMDgwOCw3ICsyMTA4Myw3IEBACiAkLnE0PW51bGwKICQudnY9bnVsbAogJC5Cdj1udWxsCi0kLm1mPW51bGwKKyQuS2g9bnVsbAogJC5CWT1udWxsCiAkLm9LPW51bGwKICQuUzY9bnVsbApAQCAtMjA4MzMsMTAgKzIxMTA4LDEwIEBACiAkLnZVPW51bGwKICQueFY9bnVsbAogJC5ySz0hMQotJC5BdT1bQy50cSxXLkJvLHt9LEMuTUksWi5oeCx7Y3JlYXRlZDpaLkNvV30sQy5oUCxFLnV6LHtjcmVhdGVkOkUuejF9LEMuTWYsQS5HMSx7Y3JlYXRlZDpBLko4fSxDLnEwUyxILkRnLHsiIjpILmpaTn0sQy5EbCxWLkYxLHtjcmVhdGVkOlYuSlQ4fSxDLkpmLEUuTWIse2NyZWF0ZWQ6RS5SVkl9LEMuVUosTi5vYSx7Y3JlYXRlZDpOLklCfSxDLlkzLFEuQ1kse2NyZWF0ZWQ6US5TbX0sQy5qNCxELklXLHtjcmVhdGVkOkQuenJ9LEMuVngsWC5NSix7Y3JlYXRlZDpYLklmWH0sQy5yUixFLndOLHtjcmVhdGVkOkUuTUx9LEMueVMsQi5HNix7Y3JlYXRlZDpCLkR3fSxDLlNiLEEua24se2NyZWF0ZWQ6QS5Jcn0sQy5FWixFLm9GLHtjcmVhdGVkOkUuVUV9LEMudncsQS5VSyx7Y3JlYXRlZDpBLklWfSxDLkpvLEQuaTcse2NyZWF0ZWQ6RC5oU1d9LEMuQkwsWC5Ocix7Y3JlYXRlZDpYLkFrfSxDLk9OLFQub3Yse2NyZWF0ZWQ6VC5UNWl9LEMualIsRi5CZSx7Y3JlYXRlZDpGLmY5fSxDLlBULE0uQ1gse2NyZWF0ZWQ6TS5hc30sQy5pRCxPLlZiLHtjcmVhdGVkOk8ucG59LEMuY2UsWC5rSyx7Y3JlYXRlZDpYLmpEfSxDLmRELEUuYXYse2NyZWF0ZWQ6RS5SN30sQy5GQSxBLllhLHtjcmVhdGVkOkEudm59LEMuUEYsVy55eU4se30sQy5UaCxVLmZJLHtjcmVhdGVkOlUuZEl9LEMudFUsRS5MNCx7Y3JlYXRlZDpFLnA0dH0sQy5jSyxYLkk1LHtjcmVhdGVkOlgudkN9LEMuakEsUi5FZyx7Y3JlYXRlZDpSLk5kfSxDLks0LFguaFYse2NyZWF0ZWQ6WC56eX0sQy54RSxaLmFDLHtjcmVhdGVkOloubFd9LEMudnUsWC51dyx7Y3JlYXRlZDpYLkhJfSxDLmNhLEQuWjQse2NyZWF0ZWQ6RC5PbGx9LEMucEosRS5RNix7Y3JlYXRlZDpFLmNoRn0sQy5ZeSxFLnVFLHtjcmVhdGVkOkUuQVd9LEMuWXhtLEguUGcseyIiOkguYVJ1fSxDLmlsLFEueEkse2NyZWF0ZWQ6US5sS0h9LEMubHAsUi5MVSx7Y3JlYXRlZDpSLnJBfSxDLm9HLEUuZHMse2NyZWF0ZWQ6RS5wSWZ9LEMuRUcsRC5Peix7Y3JlYXRlZDpELlJQfSxDLm53LE8uZW8se2NyZWF0ZWQ6Ty5sMH0sQy5PRyxRLmVXLHtjcmVhdGVkOlEucnR9LEMua20sQS5mbCx7Y3JlYXRlZDpBLkR1fSxDLlRxLFoudmose2NyZWF0ZWQ6Wi5NN30sQy5KVyxBLld3LHtjcmVhdGVkOkEuWkN9LEMuQ1QsRC5TdCx7Y3JlYXRlZDpELk41fSxDLndILFIuek0se2NyZWF0ZWQ6Ui5abUt9LEMubDQsWi51TCx7Y3JlYXRlZDpaLkVFfSxDLkxULEEubWQse2NyZWF0ZWQ6QS5EQ2l9LEMuV2gsRS5IOCx7Y3JlYXRlZDpFLlpoWH0sQy5aaixFLlUxLHtjcmVhdGVkOkUuaG19LEMuRkcsRS5xaCx7Y3JlYXRlZDpFLmN1YX0sQy5iQyxWLkQyLHtjcmVhdGVkOlYuTkl9LEMuYTgsQS5aeCx7Y3JlYXRlZDpBLnpDfSxDLk5SLEsubm0se2NyZWF0ZWQ6Sy5hbnR9LEMuREQsRS5abix7Y3JlYXRlZDpFLnhLfSxDLnFGLEUubU8se2NyZWF0ZWQ6RS5DaH0sQy5FeSxBLndNLHtjcmVhdGVkOkEuR099LEMucEYsRS5XUyx7Y3JlYXRlZDpFLmpTfSxDLm5YLEUuREUse2NyZWF0ZWQ6RS5vQn0sQy5qdyxBLnhjLHtjcmVhdGVkOkEuRzd9LEMuTlcsQS55ZSx7Y3JlYXRlZDpBLlcxfSxDLmpSaSxILndlLHsiIjpILmljfSxDLlh2LEUubjUse2NyZWF0ZWQ6RS5pT299LEMuS08sRi5aUCx7Y3JlYXRlZDpGLll3fSxDLkptLFkucTYse2NyZWF0ZWQ6WS56RX0sQy5XeixCLnBSLHtjcmVhdGVkOkIubHV9LEMuRXAsRS5vdSx7Y3JlYXRlZDpFLnRYfSxDLnRjLEUuTWEse2NyZWF0ZWQ6RS5JaX0sQy5JbyxELlFoLHtjcmVhdGVkOkQuUWp9LEMuUXQsQS5OSyx7Y3JlYXRlZDpBLlhpaX0sQy53ayxMLm5KLHtjcmVhdGVkOkwuUnB9LEMudGUsTi5CUyx7Y3JlYXRlZDpOLm56fSxDLm1zLEEuQm0se2NyZWF0ZWQ6QS5BSm19LEMud3MsVi5QYSx7Y3JlYXRlZDpWLmZYeH0sQy5wSyxELlJrLHtjcmVhdGVkOkQuYlpwfSxDLmxFLFUuREsse2NyZWF0ZWQ6VS52OX0sQy5BeixBLkdrLHtjcmVhdGVkOkEubnZ9LEMuWDgsVS5UaSx7Y3JlYXRlZDpVLkd2dH0sQy5MZyxSLkpJLHtjcmVhdGVkOlIub1N9LEMuSnUsSy5MeSx7Y3JlYXRlZDpLLlV0fSxDLm1xLEwucWsse2NyZWF0ZWQ6TC5RdHB9LEMuWFdZLFcudUVZLHt9LEMub1QsTy5WWSx7Y3JlYXRlZDpPLk9ufSxDLmpLLFUuZWwse2NyZWF0ZWQ6VS5vSH1dCiskLkF1PVtDLnRxLFcuQm8se30sQy5NSSxaLmh4LHtjcmVhdGVkOlouQ29XfSxDLmhQLEUudXose2NyZWF0ZWQ6RS5aRlB9LEMuUWIsWC5KMyx7Y3JlYXRlZDpYLlRzRn0sQy5NZixBLkcxLHtjcmVhdGVkOkEuSjh9LEMucTBTLEguRGcseyIiOkgualpOfSxDLkRsLFYuRjEse2NyZWF0ZWQ6Vi5mdn0sQy5KZixFLk1iLHtjcmVhdGVkOkUuUlZJfSxDLlVKLE4ub2Ese2NyZWF0ZWQ6Ti5JQn0sQy5ZMyxRLkNZLHtjcmVhdGVkOlEuU219LEMuajQsRC5JVyx7Y3JlYXRlZDpELnpyfSxDLlZ4LFguTUose2NyZWF0ZWQ6WC5JZlh9LEMuclIsRS53Tix7Y3JlYXRlZDpFLk1MfSxDLnlTLEIuRzYse2NyZWF0ZWQ6Qi5Ed30sQy5TYixBLmtuLHtjcmVhdGVkOkEuVFF9LEMuRVosRS5vRix7Y3JlYXRlZDpFLlVFfSxDLnZ3LEEuVUsse2NyZWF0ZWQ6QS5JVn0sQy5KbyxELmk3LHtjcmVhdGVkOkQuaFNXfSxDLk9OLFQub3Yse2NyZWF0ZWQ6VC5UNWl9LEMualIsRi5CZSx7Y3JlYXRlZDpGLmZtfSxDLlBULE0uQ1gse2NyZWF0ZWQ6TS5hc30sQy5pRCxPLlZiLHtjcmVhdGVkOk8ucG59LEMuY2UsWC5rSyx7Y3JlYXRlZDpYLmpEfSxDLmRELEUuYXYse2NyZWF0ZWQ6RS5SN30sQy5GQSxBLllhLHtjcmVhdGVkOkEudm59LEMuUEYsVy55eU4se30sQy5UaCxVLmZJLHtjcmVhdGVkOlUuVUZ9LEMudFUsRS5MNCx7Y3JlYXRlZDpFLnA0dH0sQy5jSyxYLkk1LHtjcmVhdGVkOlgudkN9LEMuakEsUi5FZyx7Y3JlYXRlZDpSLk9sYX0sQy5LNCxYLmhWLHtjcmVhdGVkOlguenl9LEMudnUsWC51dyx7Y3JlYXRlZDpYLkhJfSxDLmNhLEQuWjQse2NyZWF0ZWQ6RC5PbGx9LEMucEosRS5RNix7Y3JlYXRlZDpFLmNoRn0sQy5ZeSxFLnVFLHtjcmVhdGVkOkUuQVd9LEMuWXhtLEguUGcseyIiOkguYVJ1fSxDLmlsLFEueEkse2NyZWF0ZWQ6US5sS0h9LEMubHAsUi5MVSx7Y3JlYXRlZDpSLlY0fSxDLm9HLEUuZHMse2NyZWF0ZWQ6RS5wSWZ9LEMuRUcsRC5Peix7Y3JlYXRlZDpELlJQfSxDLm53LE8uZW8se2NyZWF0ZWQ6Ty5sMH0sQy5PRyxRLmVXLHtjcmVhdGVkOlEucnR9LEMua20sQS5mbCx7Y3JlYXRlZDpBLkR1fSxDLlRxLFoudmose2NyZWF0ZWQ6Wi5NN30sQy5vdSxaLmFrLHtjcmVhdGVkOloubFd9LEMuSlcsQS5Xdyx7Y3JlYXRlZDpBLlpDfSxDLkNULEQuU3Qse2NyZWF0ZWQ6RC5ONX0sQy53SCxSLnpNLHtjcmVhdGVkOlIuWm1LfSxDLmw0LFoudUwse2NyZWF0ZWQ6Wi5FRX0sQy5MVCxBLm1kLHtjcmVhdGVkOkEuRENpfSxDLldoLEUuSDgse2NyZWF0ZWQ6RS5aaFh9LEMuWmosRS5VMSx7Y3JlYXRlZDpFLlRpVX0sQy5GRyxFLnFoLHtjcmVhdGVkOkUuU2N9LEMuYkMsVi5EMix7Y3JlYXRlZDpWLk5JfSxDLmE4LEEuWngse2NyZWF0ZWQ6QS5Pd30sQy5OUixLLm5tLHtjcmVhdGVkOksuYW59LEMuREQsRS5abix7Y3JlYXRlZDpFLmtmfSxDLnFGLEUubU8se2NyZWF0ZWQ6RS5DaH0sQy5FeSxBLndNLHtjcmVhdGVkOkEuR099LEMucEYsRS5XUyx7Y3JlYXRlZDpFLmpTfSxDLnFaLEUuREUse2NyZWF0ZWQ6RS5vQn0sQy5qdyxBLnhjLHtjcmVhdGVkOkEuRzd9LEMuTlcsQS55ZSx7Y3JlYXRlZDpBLlcxfSxDLmpSaSxILndlLHsiIjpILm02fSxDLlh2LEUubjUse2NyZWF0ZWQ6RS5pT299LEMuS08sRi5aUCx7Y3JlYXRlZDpGLll3fSxDLmhlLEUucU0se2NyZWF0ZWQ6RS50WH0sQy5KbSxZLnE2LHtjcmVhdGVkOlkuekV9LEMuV3osQi5wUix7Y3JlYXRlZDpCLmx1fSxDLnRjLEUuTWEse2NyZWF0ZWQ6RS5JaTF9LEMuSW8sRC5RaCx7Y3JlYXRlZDpELlFqfSxDLlF0LEEuTksse2NyZWF0ZWQ6QS5YaWl9LEMud2ssTC5uSix7Y3JlYXRlZDpMLlJwfSxDLnRlLE4uQlMse2NyZWF0ZWQ6Ti5uen0sQy5tcyxBLkJtLHtjcmVhdGVkOkEuQUptfSxDLndzLFYuUGEse2NyZWF0ZWQ6Vi5mWHh9LEMucEssRC5Sayx7Y3JlYXRlZDpELmJacH0sQy5sRSxVLkRLLHtjcmVhdGVkOlUudjl9LEMuQXosQS5Hayx7Y3JlYXRlZDpBLmNZT30sQy5YOCxVLlRpLHtjcmVhdGVkOlUuR3Z0fSxDLkxnLFIuSkkse2NyZWF0ZWQ6Ui5vU30sQy5KdSxLLkx5LHtjcmVhdGVkOksuVXR9LEMubXEsTC5xayx7Y3JlYXRlZDpMLlF0cH0sQy5YV1ksVy51RVkse30sQy5vVCxPLlZZLHtjcmVhdGVkOk8uT259LEMuakssVS5lbCx7Y3JlYXRlZDpVLm9IfV0KIEkuJGxhenkoJCwiZ2xvYmFsVGhpcyIsIkRYIiwiamsiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCl9KQogSS4kbGF6eSgkLCJnbG9iYWxXaW5kb3ciLCJVVyIsIk15IixmdW5jdGlvbigpe3JldHVybiAkLmprKCkud2luZG93fSkKLUkuJGxhenkoJCwiZ2xvYmFsV29ya2VyIiwidTkiLCJybSIsZnVuY3Rpb24oKXtyZXR1cm4gJC5qaygpLldvcmtlcn0pCitJLiRsYXp5KCQsImdsb2JhbFdvcmtlciIsInU5IiwiRnYiLGZ1bmN0aW9uKCl7cmV0dXJuICQuamsoKS5Xb3JrZXJ9KQogSS4kbGF6eSgkLCJnbG9iYWxQb3N0TWVzc2FnZURlZmluZWQiLCJXSCIsIndCIixmdW5jdGlvbigpe3JldHVybiAkLmprKCkucG9zdE1lc3NhZ2UhPT12b2lkIDB9KQogSS4kbGF6eSgkLCJ0aGlzU2NyaXB0IiwiU1UiLCJadCIsZnVuY3Rpb24oKXtyZXR1cm4gSC55bCgpfSkKIEkuJGxhenkoJCwid29ya2VySWRzIiwiclMiLCJwNiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5WTShuZXcgUC5xbyhudWxsKSxbUC5LTl0pfSkKQEAgLTIwODUxLDY1ICsyMTEyNiw4MSBAQAogSS4kbGF6eSgkLCJudWxsUHJvcGVydHlQYXR0ZXJuIiwiQlgiLCJXNiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShILk1qKG51bGwpKX0pCiBJLiRsYXp5KCQsIm51bGxMaXRlcmFsUHJvcGVydHlQYXR0ZXJuIiwidHQiLCJCaSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXtudWxsLiRtZXRob2QkfWNhdGNoKHope3JldHVybiB6Lm1lc3NhZ2V9fSgpKX0pCiBJLiRsYXp5KCQsInVuZGVmaW5lZFByb3BlcnR5UGF0dGVybiIsImR0IiwiZUEiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5Naih2b2lkIDApKX0pCi1JLiRsYXp5KCQsInVuZGVmaW5lZExpdGVyYWxQcm9wZXJ0eVBhdHRlcm4iLCJBNyIsImtvIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNhdGNoKHope3JldHVybiB6Lm1lc3NhZ2V9fSgpKX0pCitJLiRsYXp5KCQsInVuZGVmaW5lZExpdGVyYWxQcm9wZXJ0eVBhdHRlcm4iLCJBaSIsInFLIixmdW5jdGlvbigpe3JldHVybiBILmNNKGZ1bmN0aW9uKCl7dHJ5eyh2b2lkIDApLiRtZXRob2QkfWNhdGNoKHope3JldHVybiB6Lm1lc3NhZ2V9fSgpKX0pCiBJLiRsYXp5KCQsIl9jb21wbGV0ZXIiLCJJUSIsIkliIixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSl9KQogSS4kbGF6eSgkLCJfc3RvcmFnZSIsIndaIiwiVnkiLGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2V9KQogSS4kbGF6eSgkLCJzY2hlZHVsZUltbWVkaWF0ZUNsb3N1cmUiLCJsSSIsImVqIixmdW5jdGlvbigpe3JldHVybiBQLnhnKCl9KQogSS4kbGF6eSgkLCJfbnVsbEZ1dHVyZSIsImJxIiwibWsiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuQWIobnVsbCxudWxsKX0pCiBJLiRsYXp5KCQsIl90b1N0cmluZ1Zpc2l0aW5nIiwibk0iLCJFeCIsZnVuY3Rpb24oKXtyZXR1cm5bXX0pCi1JLiRsYXp5KCQsIndlYmtpdEV2ZW50cyIsImZEIiwiVnAiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJhbmltYXRpb25lbmQiLCJ3ZWJraXRBbmltYXRpb25FbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJ3ZWJraXRBbmltYXRpb25JdGVyYXRpb24iLCJhbmltYXRpb25zdGFydCIsIndlYmtpdEFuaW1hdGlvblN0YXJ0IiwiZnVsbHNjcmVlbmNoYW5nZSIsIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCJmdWxsc2NyZWVuZXJyb3IiLCJ3ZWJraXRmdWxsc2NyZWVuZXJyb3IiLCJrZXlhZGRlZCIsIndlYmtpdGtleWFkZGVkIiwia2V5ZXJyb3IiLCJ3ZWJraXRrZXllcnJvciIsImtleW1lc3NhZ2UiLCJ3ZWJraXRrZXltZXNzYWdlIiwibmVlZGtleSIsIndlYmtpdG5lZWRrZXkiLCJwb2ludGVybG9ja2NoYW5nZSIsIndlYmtpdHBvaW50ZXJsb2NrY2hhbmdlIiwicG9pbnRlcmxvY2tlcnJvciIsIndlYmtpdHBvaW50ZXJsb2NrZXJyb3IiLCJyZXNvdXJjZXRpbWluZ2J1ZmZlcmZ1bGwiLCJ3ZWJraXRyZXNvdXJjZXRpbWluZ2J1ZmZlcmZ1bGwiLCJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsInNwZWVjaGNoYW5nZSIsIndlYmtpdFNwZWVjaENoYW5nZSJdLG51bGwsbnVsbCl9KQorSS4kbGF6eSgkLCJ3ZWJraXRFdmVudHMiLCJmRFgiLCJubiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbImFuaW1hdGlvbmVuZCIsIndlYmtpdEFuaW1hdGlvbkVuZCIsImFuaW1hdGlvbml0ZXJhdGlvbiIsIndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbiIsImFuaW1hdGlvbnN0YXJ0Iiwid2Via2l0QW5pbWF0aW9uU3RhcnQiLCJmdWxsc2NyZWVuY2hhbmdlIiwid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsImZ1bGxzY3JlZW5lcnJvciIsIndlYmtpdGZ1bGxzY3JlZW5lcnJvciIsImtleWFkZGVkIiwid2Via2l0a2V5YWRkZWQiLCJrZXllcnJvciIsIndlYmtpdGtleWVycm9yIiwia2V5bWVzc2FnZSIsIndlYmtpdGtleW1lc3NhZ2UiLCJuZWVka2V5Iiwid2Via2l0bmVlZGtleSIsInBvaW50ZXJsb2NrY2hhbmdlIiwid2Via2l0cG9pbnRlcmxvY2tjaGFuZ2UiLCJwb2ludGVybG9ja2Vycm9yIiwid2Via2l0cG9pbnRlcmxvY2tlcnJvciIsInJlc291cmNldGltaW5nYnVmZmVyZnVsbCIsIndlYmtpdHJlc291cmNldGltaW5nYnVmZmVyZnVsbCIsInRyYW5zaXRpb25lbmQiLCJ3ZWJraXRUcmFuc2l0aW9uRW5kIiwic3BlZWNoY2hhbmdlIiwid2Via2l0U3BlZWNoQ2hhbmdlIl0sbnVsbCxudWxsKX0pCiBJLiRsYXp5KCQsImNvbnRleHQiLCJMdCIsIlNpIixmdW5jdGlvbigpe3JldHVybiBQLk5EKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCkpfSkKIEkuJGxhenkoJCwiX0RBUlRfT0JKRUNUX1BST1BFUlRZX05BTUUiLCJrdCIsIklxIixmdW5jdGlvbigpe3JldHVybiBpbml0LmdldElzb2xhdGVUYWcoIl8kZGFydF9kYXJ0T2JqZWN0Iil9KQogSS4kbGF6eSgkLCJfREFSVF9DTE9TVVJFX1BST1BFUlRZX05BTUUiLCJSaSIsIkRwIixmdW5jdGlvbigpe3JldHVybiBpbml0LmdldElzb2xhdGVUYWcoIl8kZGFydF9kYXJ0Q2xvc3VyZSIpfSkKIEkuJGxhenkoJCwiX2RhcnRQcm94eUN0b3IiLCJmSyIsImlXIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBEYXJ0T2JqZWN0KGEpe3RoaXMubz1hfX0pCiBJLiRsYXp5KCQsIl9mcmVlQ29sb3IiLCJuSyIsIlIyIixmdW5jdGlvbigpe3JldHVyblsyNTUsMjU1LDI1NSwyNTVdfSkKIEkuJGxhenkoJCwiX3BhZ2VTZXBhcmF0aW9uQ29sb3IiLCJPcyIsIlFnIixmdW5jdGlvbigpe3JldHVyblswLDAsMCwyNTVdfSkKLUkuJGxhenkoJCwiX2xvZ2dlcnMiLCJVaiIsIkl1IixmdW5jdGlvbigpe3JldHVybiBQLkZsKFAucVUsTi5Sdyl9KQorSS4kbGF6eSgkLCJfbG9nZ2VycyIsIlVqIiwiSXUiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuRmwoUC5xVSxOLlRKKX0pCiBJLiRsYXp5KCQsIl9sb2dnZXIiLCJ5NyIsIlM1IixmdW5jdGlvbigpe3JldHVybiBOLlFNKCJPYnNlcnZhYmxlLmRpcnR5Q2hlY2siKX0pCiBJLiRsYXp5KCQsIl9pbnN0YW5jZSIsInFhIiwiSnMiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLlRWKFtdKX0pCi1JLiRsYXp5KCQsIl9wYXRoUmVnRXhwIiwiVWIiLCJCOCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuWUpHKCkuJDAoKX0pCi1JLiRsYXp5KCQsIl9sb2dnZXIiLCJ5N1kiLCJZViIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgib2JzZXJ2ZS5QYXRoT2JzZXJ2ZXIiKX0pCitJLiRsYXp5KCQsIl9wYXRoUmVnRXhwIiwiVWIiLCJCOCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEwuRE9lKCkuJDAoKX0pCitJLiRsYXp5KCQsIl9sb2dnZXIiLCJ5N1kiLCJOZCIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgib2JzZXJ2ZS5QYXRoT2JzZXJ2ZXIiKX0pCiBJLiRsYXp5KCQsIl9wYXRoQ2FjaGUiLCJ1biIsImhXIixmdW5jdGlvbigpe3JldHVybiBQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsTC5Udil9KQotSS4kbGF6eSgkLCJfcG9seW1lclN5bnRheCIsIktiIiwiUnMiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLkxpKFQuR0YobnVsbCxDLnFZKSxudWxsKX0pCitJLiRsYXp5KCQsIl9wb2x5bWVyU3ludGF4IiwiS2IiLCJyayIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEuTGkoVC5HRihudWxsLEMucVkpLG51bGwpfSkKIEkuJGxhenkoJCwiX3R5cGVzQnlOYW1lIiwiSGkiLCJFaiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAudXEpfSkKIEkuJGxhenkoJCwiX2RlY2xhcmF0aW9ucyIsImVmIiwidkUiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxBLlhQKX0pCi1JLiRsYXp5KCQsIl9oYXNTaGFkb3dEb21Qb2x5ZmlsbCIsIm4zIiwiamciLGZ1bmN0aW9uKCl7cmV0dXJuICQuU2koKS5FZygiU2hhZG93RE9NUG9seWZpbGwiKX0pCitJLiRsYXp5KCQsIl9oYXNTaGFkb3dEb21Qb2x5ZmlsbCIsIll4IiwiRXAiLGZ1bmN0aW9uKCl7cmV0dXJuICQuU2koKS5FZygiU2hhZG93RE9NUG9seWZpbGwiKX0pCiBJLiRsYXp5KCQsIl9TaGFkb3dDc3MiLCJxUCIsIkFNIixmdW5jdGlvbigpe3ZhciB6PSQuS2MoKQogcmV0dXJuIHohPW51bGw/Si5VUSh6LCJTaGFkb3dDU1MiKTpudWxsfSkKIEkuJGxhenkoJCwiX3NoZWV0TG9nIiwiZHoiLCJRSiIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci5zdHlsZXNoZWV0Iil9KQotSS4kbGF6eSgkLCJfY2hhbmdlZE1ldGhvZFF1ZXJ5T3B0aW9ucyIsIlNDIiwiSE4iLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLldxKCExLCExLCEwLEMudHEsITEsITAsbnVsbCxBLkY0KCkpfSkKK0kuJGxhenkoJCwiX2NoYW5nZWRNZXRob2RRdWVyeU9wdGlvbnMiLCJTQyIsIlN6IixmdW5jdGlvbigpe3JldHVybiBuZXcgQS5XcSghMSwhMSwhMCxDLnRxLCExLCEwLG51bGwsQS5GNCgpKX0pCiBJLiRsYXp5KCQsIl9BVFRSSUJVVEVTX1JFR0VYIiwibUQiLCJhUSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguVlIoIlxcc3wsIixILnY0KCJcXHN8LCIsITEsITAsITEpLG51bGwsbnVsbCl9KQogSS4kbGF6eSgkLCJfUGxhdGZvcm0iLCJXRiIsIktjIixmdW5jdGlvbigpe3JldHVybiBKLlVRKCQuU2koKSwiUGxhdGZvcm0iKX0pCiBJLiRsYXp5KCQsImJpbmRQYXR0ZXJuIiwiWkEiLCJpQiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguVlIoIlxce1xceyhbXnt9XSopfX0iLEgudjQoIlxce1xceyhbXnt9XSopfX0iLCExLCEwLCExKSxudWxsLG51bGwpfSkKIEkuJGxhenkoJCwiX29uUmVhZHkiLCJSOSIsImlGIixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSl9KQotSS4kbGF6eSgkLCJfb2JzZXJ2ZUxvZyIsIkRaIiwiYnQiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oInBvbHltZXIub2JzZXJ2ZSIpfSkKK0kuJGxhenkoJCwiX29ic2VydmVMb2ciLCJEWiIsImRuTyIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci5vYnNlcnZlIil9KQogSS4kbGF6eSgkLCJfZXZlbnRzTG9nIiwiZm8iLCJheSIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci5ldmVudHMiKX0pCiBJLiRsYXp5KCQsIl91bmJpbmRMb2ciLCJldSIsImlYIixmdW5jdGlvbigpe3JldHVybiBOLlFNKCJwb2x5bWVyLnVuYmluZCIpfSkKLUkuJGxhenkoJCwiX2JpbmRMb2ciLCJ4eiIsIkx1IixmdW5jdGlvbigpe3JldHVybiBOLlFNKCJwb2x5bWVyLmJpbmQiKX0pCitJLiRsYXp5KCQsIl9iaW5kTG9nIiwiZjIiLCJ6QiIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci5iaW5kIil9KQogSS4kbGF6eSgkLCJfUG9seW1lckdlc3R1cmVzIiwiWEsiLCJQbyIsZnVuY3Rpb24oKXtyZXR1cm4gSi5VUSgkLlNpKCksIlBvbHltZXJHZXN0dXJlcyIpfSkKIEkuJGxhenkoJCwiX3BvbHltZXJFbGVtZW50UHJvdG8iLCJMVyIsIlhYIixmdW5jdGlvbigpe3JldHVybiBuZXcgQS5NZCgpLiQwKCl9KQotSS4kbGF6eSgkLCJfdHlwZUhhbmRsZXJzIiwibHEiLCJRTCIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbQy5HaCxuZXcgWi5sUCgpLEMuR1gsbmV3IFouVWYoKSxDLlljLG5ldyBaLlJhKCksQy5ITCxuZXcgWi53SlkoKSxDLnl3LG5ldyBaLnpPUSgpLEMucGEsbmV3IFouVzZvKCldLG51bGwsbnVsbCl9KQotSS4kbGF6eSgkLCJfQklOQVJZX09QRVJBVE9SUyIsIkFmIiwiUmFiIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFsiKyIsbmV3IEsudzEwKCksIi0iLG5ldyBLLncxMSgpLCIqIixuZXcgSy53MTIoKSwiLyIsbmV3IEsudzEzKCksIiUiLG5ldyBLLncxNCgpLCI9PSIsbmV3IEsudzE1KCksIiE9IixuZXcgSy53MTYoKSwiPT09IixuZXcgSy53MTcoKSwiIT09IixuZXcgSy53MTgoKSwiPiIsbmV3IEsudzE5KCksIj49IixuZXcgSy53MjAoKSwiPCIsbmV3IEsudzIxKCksIjw9IixuZXcgSy53MjIoKSwifHwiLG5ldyBLLncyMygpLCImJiIsbmV3IEsudzI0KCksInwiLG5ldyBLLncyNSgpXSxudWxsLG51bGwpfSkKLUkuJGxhenkoJCwiX1VOQVJZX09QRVJBVE9SUyIsInFNIiwicUwiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyIrIixuZXcgSy5SYWEoKSwiLSIsbmV3IEsudzAoKSwiISIsbmV3IEsudzUoKV0sbnVsbCxudWxsKX0pCitJLiRsYXp5KCQsIl90eXBlSGFuZGxlcnMiLCJscSIsIlJmIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFtDLkdoLG5ldyBaLmxQKCksQy5HWCxuZXcgWi5SYSgpLEMuWWMsbmV3IFoud0pZKCksQy5ITCxuZXcgWi56T1EoKSxDLnl3LG5ldyBaLlc2bygpLEMucGEsbmV3IFouTWRRKCldLG51bGwsbnVsbCl9KQorSS4kbGF6eSgkLCJfQklOQVJZX09QRVJBVE9SUyIsIkFmIiwiUmFiIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFsiKyIsbmV3IEsudzExKCksIi0iLG5ldyBLLncxMigpLCIqIixuZXcgSy53MTMoKSwiLyIsbmV3IEsudzE0KCksIiUiLG5ldyBLLncxNSgpLCI9PSIsbmV3IEsudzE2KCksIiE9IixuZXcgSy53MTcoKSwiPT09IixuZXcgSy53MTgoKSwiIT09IixuZXcgSy53MTkoKSwiPiIsbmV3IEsudzIwKCksIj49IixuZXcgSy53MjEoKSwiPCIsbmV3IEsudzIyKCksIjw9IixuZXcgSy53MjMoKSwifHwiLG5ldyBLLncyNCgpLCImJiIsbmV3IEsudzI1KCksInwiLG5ldyBLLncyNigpXSxudWxsLG51bGwpfSkKK0kuJGxhenkoJCwiX1VOQVJZX09QRVJBVE9SUyIsInBycCIsIklpIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFsiKyIsbmV3IEsudzAoKSwiLSIsbmV3IEsudzUoKSwiISIsbmV3IEsudzEwKCldLG51bGwsbnVsbCl9KQogSS4kbGF6eSgkLCJfaW5zdGFuY2UiLCJsbiIsIndiIixmdW5jdGlvbigpe3JldHVybiBuZXcgSy5tZSgpfSkKLUkuJGxhenkoJCwiX2N1cnJlbnRJc29sYXRlTWF0Y2hlciIsInZmIiwiak4iLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILlZSKCJpc29sYXRlcy9cXGQrIixILnY0KCJpc29sYXRlcy9cXGQrIiwhMSwhMCwhMSksbnVsbCxudWxsKX0pCitJLiRsYXp5KCQsIl9jdXJyZW50SXNvbGF0ZU1hdGNoZXIiLCJ2ZiIsImZBIixmdW5jdGlvbigpe3JldHVybiBuZXcgSC5WUigiaXNvbGF0ZXMvXFxkKyIsSC52NCgiaXNvbGF0ZXMvXFxkKyIsITEsITAsITEpLG51bGwsbnVsbCl9KQogSS4kbGF6eSgkLCJfY3VycmVudE9iamVjdE1hdGNoZXIiLCJkMCIsInJjIixmdW5jdGlvbigpe3JldHVybiBuZXcgSC5WUigiaXNvbGF0ZXMvXFxkKy8iLEgudjQoImlzb2xhdGVzL1xcZCsvIiwhMSwhMCwhMSksbnVsbCxudWxsKX0pCitJLiRsYXp5KCQsImtSZWd1bGFyRnVuY3Rpb24iLCJJaiIsIllGIixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtDbG9zdXJlRnVuY3Rpb24iLCJqWCIsInhxIixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiY2xvc3VyZSBmdW5jdGlvbiIpfSkKK0kuJGxhenkoJCwia0dldHRlckZ1bmN0aW9uIiwiRjAiLCJHRyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoImdldHRlciBmdW5jdGlvbiIpfSkKK0kuJGxhenkoJCwia1NldHRlckZ1bmN0aW9uIiwiQnMiLCJLdyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoInNldHRlciBmdW5jdGlvbiIpfSkKK0kuJGxhenkoJCwia0NvbnN0cnVjdG9yIiwiRzgiLCJraiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoImNvbnN0cnVjdG9yIil9KQorSS4kbGF6eSgkLCJrSW1wbGljaXRHZXR0ZXJGdW5jdGlvbiIsInhzIiwiZDkiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtJbXBsaWNpdFNldHRlckZ1bmN0aW9uIiwiYWIiLCJuRSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoImltcGxpY2l0IHNldHRlciBmdW5jdGlvbiIpfSkKK0kuJGxhenkoJCwia1N0YXRpY0luaXRpYWxpemVyIiwiU3AiLCJ5NSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoInN0YXRpYyBpbml0aWFsaXplciIpfSkKK0kuJGxhenkoJCwia01ldGhvZEV4dHJhY3RvciIsIkV0IiwiT3QiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJtZXRob2QgZXh0cmFjdG9yIil9KQorSS4kbGF6eSgkLCJrTm9TdWNoTWV0aG9kRGlzcGF0Y2hlciIsIkxsIiwiRTciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJub1N1Y2hNZXRob2QgZGlzcGF0Y2hlciIpfSkKK0kuJGxhenkoJCwia0ludm9rZUZpZWxkRGlzcGF0Y2hlciIsIkhVIiwiZjYiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJpbnZva2UgZmllbGQgZGlzcGF0Y2hlciIpfSkKK0kuJGxhenkoJCwia0NvbGxlY3RlZCIsImJ0IiwiYjEiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJDb2xsZWN0ZWQiKX0pCitJLiRsYXp5KCQsImtOYXRpdmUiLCJ3cCIsImwzIixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiTmF0aXZlIil9KQorSS4kbGF6eSgkLCJrVGFnIiwiejMiLCJ6eCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoIlRhZyIpfSkKK0kuJGxhenkoJCwia1JldXNlZCIsIlliIiwiTVEiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJSZXVzZWQiKX0pCitJLiRsYXp5KCQsImtVTktOT1dOIiwidmUiLCJsQyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoIlVOS05PV04iKX0pCiBJLiRsYXp5KCQsIm9iamVjdEFjY2Vzc29yIiwiajgiLCJjcCIsZnVuY3Rpb24oKXtyZXR1cm4gRC5rUCgpfSkKIEkuJGxhenkoJCwidHlwZUluc3BlY3RvciIsIll2IiwibVgiLGZ1bmN0aW9uKCl7cmV0dXJuIEQua1AoKX0pCiBJLiRsYXp5KCQsInN5bWJvbENvbnZlcnRlciIsInFlIiwiTWciLGZ1bmN0aW9uKCl7cmV0dXJuIEQua1AoKX0pCi1JLiRsYXp5KCQsIl9ERUZBVUxUIiwiYWMiLCJIVCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0uVkUobnVsbCl9KQotSS4kbGF6eSgkLCJfY2hlY2tib3hFdmVudFR5cGUiLCJuUyIsIkRSIixmdW5jdGlvbigpe3JldHVybiBuZXcgTS5VZmEoKS4kMCgpfSkKK0kuJGxhenkoJCwiX0RFRkFVTFQiLCJhYyIsIkRIIixmdW5jdGlvbigpe3JldHVybiBuZXcgTS5WRShudWxsKX0pCitJLiRsYXp5KCQsIl9jaGVja2JveEV2ZW50VHlwZSIsIlM4IiwiRkYiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLlJhYSgpLiQwKCl9KQogSS4kbGF6eSgkLCJfY29udGVudHNPd25lciIsIm1uIiwiTFEiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW251bGxdKX0pCi1JLiRsYXp5KCQsIl9vd25lclN0YWdpbmdEb2N1bWVudCIsIkVXIiwibXgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW251bGxdKX0pCi1JLiRsYXp5KCQsIl9hbGxUZW1wbGF0ZXNTZWxlY3RvcnMiLCJZTyIsIlplIixmdW5jdGlvbigpe3JldHVybiJ0ZW1wbGF0ZSwgIitKLmtsKEMuejUuZ3ZjKEMuejUpLG5ldyBNLk1kUSgpKS56VigwLCIsICIpfSkKLUkuJGxhenkoJCwiX3RlbXBsYXRlT2JzZXJ2ZXIiLCJrWSIsInBUIixmdW5jdGlvbigpe3JldHVybiBuZXcgKHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcnx8d2luZG93Lk1vek11dGF0aW9uT2JzZXJ2ZXIpKEgudFIoVy5GcyhuZXcgTS5ET2UoKSksMikpfSkKLUkuJGxhenkoJCwiX2VtcHR5SW5zdGFuY2UiLCJvTCIsIkU3IixmdW5jdGlvbigpe3JldHVybiBuZXcgTS5sUGEoKS4kMCgpfSkKK0kuJGxhenkoJCwiX293bmVyU3RhZ2luZ0RvY3VtZW50IiwidjIiLCJ0RiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5WTShuZXcgUC5xbyhudWxsKSxbbnVsbF0pfSkKK0kuJGxhenkoJCwiX2FsbFRlbXBsYXRlc1NlbGVjdG9ycyIsIllPIiwiWmUiLGZ1bmN0aW9uKCl7cmV0dXJuInRlbXBsYXRlLCAiK0oua2woQy56NS5ndmMoQy56NSksbmV3IE0uWUpHKCkpLnpWKDAsIiwgIil9KQorSS4kbGF6eSgkLCJfdGVtcGxhdGVPYnNlcnZlciIsImpvSyIsImlrIixmdW5jdGlvbigpe3JldHVybiBXLldzKG5ldyBNLmxQYSgpKX0pCitJLiRsYXp5KCQsIl9lbXB0eUluc3RhbmNlIiwib0wiLCJ6bCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0uVWZhKCkuJDAoKX0pCiBJLiRsYXp5KCQsIl9pbnN0YW5jZUV4dGVuc2lvbiIsIkFIIiwidkgiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW251bGxdKX0pCiBJLiRsYXp5KCQsIl9pc1N0YWdpbmdEb2N1bWVudCIsIkZnIiwiS3MiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW251bGxdKX0pCiBJLiRsYXp5KCQsIl9leHBhbmRvIiwiZkYiLCJjbSIsZnVuY3Rpb24oKXtyZXR1cm4gSC5WTShuZXcgUC5xbygidGVtcGxhdGVfYmluZGluZyIpLFtudWxsXSl9KQogCi1pbml0LmZ1bmN0aW9uQWxpYXNlcz17U2E6MjIzfQotaW5pdC5tZXRhZGF0YT1bInNlbmRlciIsImUiLCJldmVudCIsInVyaSIsIm9uRXJyb3IiLHtmdW5jOiJwZCIsYXJnczpbUC5xVV19LCJjbG9zdXJlIiwiaXNvbGF0ZSIsIm51bWJlck9mQXJndW1lbnRzIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIse2Z1bmM6Imw0IixhcmdzOltudWxsXX0sIl8iLHtmdW5jOiJDdSIscmV0OlAucVUsYXJnczpbUC5LTl19LCJieXRlcyIse2Z1bmM6IlJKIixyZXQ6UC5xVSxhcmdzOltudWxsXX0se2Z1bmM6ImtsIix2b2lkOnRydWV9LHtmdW5jOiJiMSIsdm9pZDp0cnVlLGFyZ3M6W3tmdW5jOiJrbCIsdm9pZDp0cnVlfV19LHtmdW5jOiJhMCIsdm9pZDp0cnVlLGFyZ3M6W251bGxdfSwidmFsdWUiLHtmdW5jOiJNeCIsdm9pZDp0cnVlLGFyZ3M6W251bGxdLG9wdDpbUC5CcFBdfSwsImVycm9yIiwic3RhY2tUcmFjZSIse2Z1bmM6InJFIix2b2lkOnRydWUsYXJnczpbUC5kbCxQLnFLLFAuZGwsbnVsbCxQLkJwUF19LCJzZWxmIiwicGFyZW50Iiwiem9uZSIse2Z1bmM6IlFOIixhcmdzOltQLmRsLFAucUssUC5kbCx7ZnVuYzoiTlQifV19LCJmIix7ZnVuYzoiYUUiLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19LG51bGxdfSwiYXJnIix7ZnVuYzoidGEiLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJMcyIsYXJnczpbbnVsbCxudWxsXX0sbnVsbCxudWxsXX0se2Z1bmM6InJsIixyZXQ6e2Z1bmM6Ik5UIn0sYXJnczpbUC5kbCxQLnFLLFAuZGwse2Z1bmM6Ik5UIn1dfSx7ZnVuYzoiaWUiLHJldDp7ZnVuYzoibDQiLGFyZ3M6W251bGxdfSxhcmdzOltQLmRsLFAucUssUC5kbCx7ZnVuYzoibDQiLGFyZ3M6W251bGxdfV19LHtmdW5jOiJHdCIscmV0OntmdW5jOiJMcyIsYXJnczpbbnVsbCxudWxsXX0sYXJnczpbUC5kbCxQLnFLLFAuZGwse2Z1bmM6IkxzIixhcmdzOltudWxsLG51bGxdfV19LHtmdW5jOiJpViIsdm9pZDp0cnVlLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJOVCJ9XX0se2Z1bmM6ImFzIixyZXQ6UC5YYSxhcmdzOltQLmRsLFAucUssUC5kbCxQLmE2LHtmdW5jOiJrbCIsdm9pZDp0cnVlfV19LCJkdXJhdGlvbiIsImNhbGxiYWNrIix7ZnVuYzoiWGciLHZvaWQ6dHJ1ZSxhcmdzOltQLmRsLFAucUssUC5kbCxQLnFVXX0se2Z1bmM6Imt4Iix2b2lkOnRydWUsYXJnczpbUC5xVV19LHtmdW5jOiJOZiIscmV0OlAuZGwsYXJnczpbUC5kbCxQLnFLLFAuZGwsUC5hWXksUC5aMF19LHtmdW5jOiJHbCIscmV0OlAuYTIsYXJnczpbbnVsbCxudWxsXX0sImEiLCJiIix7ZnVuYzoiYlgiLHJldDpQLktOLGFyZ3M6W251bGxdfSx7ZnVuYzoidUoiLHJldDpQLmEsYXJnczpbbnVsbF19LCJvYmplY3QiLHtmdW5jOiJQMiIscmV0OlAuS04sYXJnczpbUC5SeixQLlJ6XX0se2Z1bmM6Inp2IixyZXQ6UC5hMixhcmdzOltQLmEsUC5hXX0se2Z1bmM6IlpZIixyZXQ6UC5LTixhcmdzOltQLmFdfSwicmVjZWl2ZXIiLHtmdW5jOiJ3SSIsYXJnczpbbnVsbCxudWxsLG51bGwsbnVsbF19LCJuYW1lIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsImNhcHR1cmVUaGlzIiwiYXJndW1lbnRzIiwibyIse2Z1bmM6IlZIIixyZXQ6UC5hMixhcmdzOltQLkdEXX0sInN5bWJvbCIsInYiLCJ4Iix7ZnVuYzoicXEiLHJldDpbUC5RVixLLkFlcF0sYXJnczpbUC5RVl19LCJpdGVyYWJsZSIse2Z1bmM6IkhjIixyZXQ6UC5LTixhcmdzOltELmFmLEQuYWZdfSwiaW52b2NhdGlvbiIsImZyYWN0aW9uRGlnaXRzIix7ZnVuYzoiTlQifSx7ZnVuYzoicnoiLGFyZ3M6W1AuRUhdfSwiY29kZSIsIm1zZyIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJrZXkiLCJ2YWwiLHtmdW5jOiJMcyIsYXJnczpbbnVsbCxudWxsXX0se2Z1bmM6IlphIixhcmdzOltQLnFVLG51bGxdfSx7ZnVuYzoiVFMiLGFyZ3M6W251bGwsUC5xVV19LHtmdW5jOiJaVCIsdm9pZDp0cnVlLGFyZ3M6W251bGwsbnVsbCxudWxsXX0sImMiLHtmdW5jOiJGMyIsdm9pZDp0cnVlLGFyZ3M6W0QuTjddfSx7ZnVuYzoiR0oiLHZvaWQ6dHJ1ZSxhcmdzOltELkVQXX0sImV4Y2VwdGlvbiIse2Z1bmM6IkFmIixhcmdzOltELnd2XX0sInZtIix7ZnVuYzoid2siLHJldDpQLmEyLGFyZ3M6W251bGxdfSwib2xkRXZlbnQiLHtmdW5jOiJmNCIsdm9pZDp0cnVlLGFyZ3M6W1cuZjVdfSwib2JqIiwiaSIsInJlc3BvbnNlVGV4dCIse2Z1bmM6InVDIixhcmdzOltVLlo1LFUuWjVdfSx7ZnVuYzoiSEUiLHJldDpQLktOLGFyZ3M6W1AuS04sUC5LTl19LCJjb2x1bW4iLCJkb25lIix7ZnVuYzoiUEsiLHJldDpQLnFVLGFyZ3M6W0cuWTJdfSwicm93Iix7ZnVuYzoiU3oiLHZvaWQ6dHJ1ZSxhcmdzOltXLmVhLG51bGwsVy5oNF19LCJkZXRhaWwiLCJ0YXJnZXQiLCJvYmplY3RDbGFzcyIse2Z1bmM6IldyIixyZXQ6W1AuYjgsRC5hZl0sYXJnczpbUC5xVV19LCJ0ZXh0Iix7ZnVuYzoiS0RZIixyZXQ6W1AuYjgsRC5hZl0sYXJnczpbbnVsbF19LCJsaW1pdCIsImR1bW15Iix7ZnVuYzoiUTUiLGFyZ3M6W0Qudk9dfSx7ZnVuYzoiTnAiLHZvaWQ6dHJ1ZSxhcmdzOltXLmVhLG51bGwsVy5LVl19LHtmdW5jOiJWSSIsYXJnczpbRC5reF19LCJkYXRhIix7ZnVuYzoidXUiLHZvaWQ6dHJ1ZSxhcmdzOltQLmFdLG9wdDpbUC5CcFBdfSwidGhlRXJyb3IiLCJ0aGVTdGFja1RyYWNlIix7ZnVuYzoiaksiLGFyZ3M6W1AuYV19LHtmdW5jOiJjcSIsdm9pZDp0cnVlLG9wdDpbbnVsbF19LHtmdW5jOiJIcCIsYXJnczpbbnVsbF0sb3B0OltudWxsXX0se2Z1bmM6IlVmIixyZXQ6UC5hMn0sImlnbm9yZWQiLCJjb252ZXJ0IiwiZWxlbWVudCIse2Z1bmM6InprIixhcmdzOltQLmEyXX0se2Z1bmM6ImMzIix2b2lkOnRydWUsb3B0OltQLmI4XX0sInJlc3VtZVNpZ25hbCIse2Z1bmM6ImhhIixhcmdzOltudWxsLFAuQnBQXX0se2Z1bmM6Ik41Iix2b2lkOnRydWUsYXJnczpbbnVsbCxQLkJwUF19LCJlYWNoIiwiayIse2Z1bmM6Imx2IixhcmdzOltQLkdELG51bGxdfSx7ZnVuYzoiVGxhIixyZXQ6UC5LTixhcmdzOltQLnFVXX0se2Z1bmM6IlpoUiIscmV0OlAuQ1AsYXJnczpbUC5xVV19LHtmdW5jOiJjZCIscmV0OlAuYTIsYXJnczpbUC5LTl19LHtmdW5jOiJWZSIscmV0OlAuS04sYXJnczpbUC5LTl19LHtmdW5jOiJsayIscmV0OlAuS04sYXJnczpbbnVsbCxudWxsXX0sImJ5dGVTdHJpbmciLCJ4aHIiLHtmdW5jOiJRTyIsdm9pZDp0cnVlLGFyZ3M6W1cuQWpZXX0sInJlc3VsdCIse2Z1bmM6ImZLIixhcmdzOltELmFmXX0se2Z1bmM6IklTIixyZXQ6Ty5Ien0sInJlc3BvbnNlIiwic3QiLHtmdW5jOiJEOCIsdm9pZDp0cnVlLGFyZ3M6W0Qudk9dfSwibmV3UHJvZmlsZSIse2Z1bmM6IllpIixyZXQ6UC5xVSxhcmdzOltQLmEyXX0sIm5ld1NwYWNlIix7ZnVuYzoiWjUiLGFyZ3M6W1AuS05dfSx7ZnVuYzoia2QiLGFyZ3M6W1AuS04sbnVsbF19LHtmdW5jOiJ4RCIscmV0OlAuUVYsYXJnczpbe2Z1bmM6InBkIixhcmdzOltQLnFVXX1dfSx7ZnVuYzoiUWQiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJsYSIscmV0OlAuUVYsYXJnczpbUC5xVV19XX0sInMiLHtmdW5jOiJTMCIsdm9pZDp0cnVlLGFyZ3M6W1AuYTIsbnVsbF19LCJleHBhbmQiLCJtIix7ZnVuYzoiZm5oIixyZXQ6UC5iOCxhcmdzOltudWxsXX0sInRhZ1Byb2ZpbGUiLCJyZWMiLHtmdW5jOiJYTyIsYXJnczpbTi5IVl19LHtmdW5jOiJkNEMiLHZvaWQ6dHJ1ZSxhcmdzOltXLkFqWSxudWxsLFcuaDRdfSx7ZnVuYzoiSWYiLHJldDpQLnFVLGFyZ3M6W1AucVVdfSwidXJsIix7ZnVuYzoibnhnIixyZXQ6UC5xVSxhcmdzOltQLkNQXX0sInRpbWUiLHtmdW5jOiJ4YyIscmV0OlAuYTIsYXJnczpbUC5xVV19LCJ0eXBlIix7ZnVuYzoiQjQiLGFyZ3M6W1AucUssUC5kbF19LHtmdW5jOiJaZyIsYXJnczpbUC5kbCxQLnFLLFAuZGwse2Z1bmM6Imw0IixhcmdzOltudWxsXX1dfSx7ZnVuYzoiREYiLHZvaWQ6dHJ1ZSxhcmdzOltQLmFdfSwicmVjb3JkcyIse2Z1bmM6InFrIixhcmdzOltMLlR2LG51bGxdfSwibW9kZWwiLCJub2RlIiwib25lVGltZSIse2Z1bmM6Im9ZdCIsYXJnczpbbnVsbCxudWxsLG51bGxdfSx7ZnVuYzoicmQiLHZvaWQ6dHJ1ZSxhcmdzOltQLnFVLFAucVVdfSx7ZnVuYzoiYUEiLHZvaWQ6dHJ1ZSxhcmdzOltQLldPLFAuWjAsUC5XT119LHtmdW5jOiJLNyIsdm9pZDp0cnVlLGFyZ3M6W1tQLldPLFQueWpdXX0se2Z1bmM6IlFZIix2b2lkOnRydWUsYXJnczpbW1AuUVYsQS5Zal1dfSwiY2hhbmdlcyIsImpzRWxlbSIsImV4dGVuZGVlIix7ZnVuYzoiUVAiLGFyZ3M6W251bGwsUC5xVSxQLnFVXX0se2Z1bmM6InR3IixhcmdzOltudWxsLFcuS1YsUC5hMl19LHtmdW5jOiJIYiIsYXJnczpbbnVsbF0sbmFtZWQ6e3NraXBDaGFuZ2VzOlAuYTJ9fSwhMSwic2tpcENoYW5nZXMiLHtmdW5jOiJaRCIsYXJnczpbW1AuV08sVC55al1dfSx7ZnVuYzoiQ3giLHJldDpVLnpYLGFyZ3M6W1UuSXAsVS5JcF19LHtmdW5jOiJRYyIsYXJnczpbVS5JcF19LCJoaXRzIiwiaWQiLCJtYXAiLHtmdW5jOiJKQyIsYXJnczpbVi5xQ119LHtmdW5jOiJydCIscmV0OlAuYjh9LCJzY3JpcHRDb3ZlcmFnZSIsIm93bmluZ0lzb2xhdGUiLHtmdW5jOiJEMCIscmV0OltQLmI4LFtQLldPLEQuZHldXSxhcmdzOltELnZPXX0sImNsYXNzTGlzdCIse2Z1bmM6ImxCIixyZXQ6W1AuYjgsRC5keV0sYXJnczpbW1AuV08sRC5keV1dfSwiY2xhc3NlcyIsInRpbWVyIix7ZnVuYzoiSTZhIixyZXQ6UC5xVX0se2Z1bmM6Ikg2IixyZXQ6UC5xVSxhcmdzOltELmt4XX0se2Z1bmM6InFRIix2b2lkOnRydWUsYXJnczpbRC52eF19LCJzY3JpcHQiLCJmdW5jIix7ZnVuYzoiSlEiLHZvaWQ6dHJ1ZSxhcmdzOltXLkJJXX0sIkV2ZW50Iix7ZnVuYzoiV0V6Iix2b2lkOnRydWUsYXJnczpbVy5IeV19LHtmdW5jOiJUMiIsdm9pZDp0cnVlLGFyZ3M6W1AucVUsVS5VMl19LHtmdW5jOiJweCIsYXJnczpbUC5xVSxVLlUyXX0sImRldGFpbHMiLCJyZWYiLHtmdW5jOiJQekMiLHZvaWQ6dHJ1ZSxhcmdzOltbUC5XTyxHLkRBXV19LCJzcGxpY2VzIix7ZnVuYzoieGgiLHZvaWQ6dHJ1ZSxhcmdzOltXLkFqXX0se2Z1bmM6IlZ2IixyZXQ6UC5xVSxhcmdzOltQLmFdfSx7ZnVuYzoiaThpIixyZXQ6UC5xVSxhcmdzOltbUC5XTyxQLmFdXX0sInZhbHVlcyIsInRhcmdldHMiLHtmdW5jOiJ3OSIscmV0OlAuYjgsYXJnczpbUC5xVV19LF07JD1udWxsCitpbml0LmZ1bmN0aW9uQWxpYXNlcz17U2E6MjI3fQoraW5pdC5tZXRhZGF0YT1bInNlbmRlciIsImUiLCJldmVudCIsInVyaSIsIm9uRXJyb3IiLHtmdW5jOiJwZCIsYXJnczpbUC5xVV19LCJjbG9zdXJlIiwiaXNvbGF0ZSIsIm51bWJlck9mQXJndW1lbnRzIiwiYXJnMSIsImFyZzIiLCJhcmczIiwiYXJnNCIse2Z1bmM6Imw0IixhcmdzOltudWxsXX0sIl8iLHtmdW5jOiJDdSIscmV0OlAucVUsYXJnczpbUC5LTl19LCJieXRlcyIse2Z1bmM6IlJKIixyZXQ6UC5xVSxhcmdzOltudWxsXX0se2Z1bmM6Img5Iix2b2lkOnRydWV9LHtmdW5jOiJuOSIsdm9pZDp0cnVlLGFyZ3M6W3tmdW5jOiJoOSIsdm9pZDp0cnVlfV19LHtmdW5jOiJhMCIsdm9pZDp0cnVlLGFyZ3M6W251bGxdfSwidmFsdWUiLHtmdW5jOiJNeCIsdm9pZDp0cnVlLGFyZ3M6W251bGxdLG9wdDpbUC5CcFBdfSwsImVycm9yIiwic3RhY2tUcmFjZSIse2Z1bmM6InBBIix2b2lkOnRydWUsYXJnczpbUC5kbCxQLmU0eSxQLmRsLG51bGwsUC5CcFBdfSwic2VsZiIsInBhcmVudCIsInpvbmUiLHtmdW5jOiJRTiIsYXJnczpbUC5kbCxQLmU0eSxQLmRsLHtmdW5jOiJOVCJ9XX0sImYiLHtmdW5jOiJhRSIsYXJnczpbUC5kbCxQLmU0eSxQLmRsLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19LG51bGxdfSwiYXJnIix7ZnVuYzoidGEiLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LG51bGwsbnVsbF19LHtmdW5jOiJybCIscmV0OntmdW5jOiJOVCJ9LGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoiTlQifV19LHtmdW5jOiJYUlIiLHJldDp7ZnVuYzoibDQiLGFyZ3M6W251bGxdfSxhcmdzOltQLmRsLFAuZTR5LFAuZGwse2Z1bmM6Imw0IixhcmdzOltudWxsXX1dfSx7ZnVuYzoiR3QiLHJldDp7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19XX0se2Z1bmM6ImlWIix2b2lkOnRydWUsYXJnczpbUC5kbCxQLmU0eSxQLmRsLHtmdW5jOiJOVCJ9XX0se2Z1bmM6InpvIixyZXQ6UC5YYSxhcmdzOltQLmRsLFAuZTR5LFAuZGwsUC5hNix7ZnVuYzoiaDkiLHZvaWQ6dHJ1ZX1dfSwiZHVyYXRpb24iLCJjYWxsYmFjayIse2Z1bmM6IlhnIix2b2lkOnRydWUsYXJnczpbUC5kbCxQLmU0eSxQLmRsLFAucVVdfSx7ZnVuYzoia3giLHZvaWQ6dHJ1ZSxhcmdzOltQLnFVXX0se2Z1bmM6Ik5mIixyZXQ6UC5kbCxhcmdzOltQLmRsLFAuZTR5LFAuZGwsUC5hWXksUC5aMF19LHtmdW5jOiJHbCIscmV0OlAuYTIsYXJnczpbbnVsbCxudWxsXX0sImEiLCJiIix7ZnVuYzoiYlgiLHJldDpQLktOLGFyZ3M6W251bGxdfSx7ZnVuYzoidUoiLHJldDpQLmEsYXJnczpbbnVsbF19LCJvYmplY3QiLHtmdW5jOiJ4aCIscmV0OlAuS04sYXJnczpbUC5SeixQLlJ6XX0se2Z1bmM6Inp2IixyZXQ6UC5hMixhcmdzOltQLmEsUC5hXX0se2Z1bmM6IlpZIixyZXQ6UC5LTixhcmdzOltQLmFdfSwicmVjZWl2ZXIiLHtmdW5jOiJ3SSIsYXJnczpbbnVsbCxudWxsLG51bGwsbnVsbF19LCJuYW1lIiwib2xkVmFsdWUiLCJuZXdWYWx1ZSIsImNhcHR1cmVUaGlzIiwiYXJndW1lbnRzIiwibyIse2Z1bmM6IlZIIixyZXQ6UC5hMixhcmdzOltQLklOXX0sInN5bWJvbCIsInYiLCJ4Iix7ZnVuYzoicXEiLHJldDpbUC5RVixLLkFlcF0sYXJnczpbUC5RVl19LCJpdGVyYWJsZSIse2Z1bmM6IkhjIixyZXQ6UC5LTixhcmdzOltELmFmLEQuYWZdfSx7ZnVuYzoiQnIiLHJldDpQLnFVfSwiaW52b2NhdGlvbiIsImZyYWN0aW9uRGlnaXRzIix7ZnVuYzoiTlQifSx7ZnVuYzoicnoiLGFyZ3M6W1AuRUhdfSwiY29kZSIsIm1zZyIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJrZXkiLCJ2YWwiLHtmdW5jOiJMcyIsYXJnczpbbnVsbCxudWxsXX0se2Z1bmM6IlphIixhcmdzOltQLnFVLG51bGxdfSx7ZnVuYzoiVFMiLGFyZ3M6W251bGwsUC5xVV19LHtmdW5jOiJaVCIsdm9pZDp0cnVlLGFyZ3M6W251bGwsbnVsbCxudWxsXX0sImMiLHtmdW5jOiJGMyIsdm9pZDp0cnVlLGFyZ3M6W0QuTjddfSx7ZnVuYzoiR0oiLHZvaWQ6dHJ1ZSxhcmdzOltELkVQXX0sImV4Y2VwdGlvbiIse2Z1bmM6IkFmIixhcmdzOltELnd2XX0sInZtIix7ZnVuYzoid2siLHJldDpQLmEyLGFyZ3M6W251bGxdfSwib2xkRXZlbnQiLHtmdW5jOiJmNCIsdm9pZDp0cnVlLGFyZ3M6W1cuZjVdfSwib2JqIiwiaSIsInJlc3BvbnNlVGV4dCIse2Z1bmM6InVDIixhcmdzOltVLlo1LFUuWjVdfSx7ZnVuYzoiSEUiLHJldDpQLktOLGFyZ3M6W1AuS04sUC5LTl19LCJjb2x1bW4iLCJkb25lIix7ZnVuYzoiUEsiLHJldDpQLnFVLGFyZ3M6W0cuWTJdfSwicm93Iix7ZnVuYzoiU3oiLHZvaWQ6dHJ1ZSxhcmdzOltXLmVhLG51bGwsVy5oNF19LCJkZXRhaWwiLCJ0YXJnZXQiLCJvYmplY3RDbGFzcyIse2Z1bmM6IldyIixyZXQ6W1AuYjgsRC5hZl0sYXJnczpbUC5xVV19LCJ0ZXh0Iix7ZnVuYzoiS0RZIixyZXQ6W1AuYjgsRC5hZl0sYXJnczpbbnVsbF19LCJsaW1pdCIsImR1bW15Iix7ZnVuYzoiUTUiLGFyZ3M6W0Qudk9dfSx7ZnVuYzoiTnAiLHZvaWQ6dHJ1ZSxhcmdzOltXLmVhLG51bGwsVy5LVl19LHtmdW5jOiJWSSIsYXJnczpbRC5reF19LCJkYXRhIix7ZnVuYzoidXUiLHZvaWQ6dHJ1ZSxhcmdzOltQLmFdLG9wdDpbUC5CcFBdfSwidGhlRXJyb3IiLCJ0aGVTdGFja1RyYWNlIix7ZnVuYzoiaksiLGFyZ3M6W1AuYV19LHtmdW5jOiJjcSIsdm9pZDp0cnVlLG9wdDpbbnVsbF19LHtmdW5jOiJIcCIsYXJnczpbbnVsbF0sb3B0OltudWxsXX0se2Z1bmM6IlVmIixyZXQ6UC5hMn0sImlnbm9yZWQiLCJjb252ZXJ0IiwiZWxlbWVudCIse2Z1bmM6InprIixhcmdzOltQLmEyXX0se2Z1bmM6ImMzIix2b2lkOnRydWUsb3B0OltQLmI4XX0sInJlc3VtZVNpZ25hbCIse2Z1bmM6ImhhIixhcmdzOltudWxsLFAuQnBQXX0se2Z1bmM6Ik41Iix2b2lkOnRydWUsYXJnczpbbnVsbCxQLkJwUF19LCJlYWNoIiwiayIse2Z1bmM6Imp0Iix2b2lkOnRydWUsYXJnczpbUC5LTixQLktOXX0se2Z1bmM6Imx2IixhcmdzOltQLklOLG51bGxdfSx7ZnVuYzoiVGxhIixyZXQ6UC5LTixhcmdzOltQLnFVXX0se2Z1bmM6IlpoUiIscmV0OlAuQ1AsYXJnczpbUC5xVV19LHtmdW5jOiJjZCIscmV0OlAuYTIsYXJnczpbUC5LTl19LHtmdW5jOiJWZSIscmV0OlAuS04sYXJnczpbUC5LTl19LHtmdW5jOiJsayIscmV0OlAuS04sYXJnczpbbnVsbCxudWxsXX0sImJ5dGVTdHJpbmciLCJ4aHIiLHtmdW5jOiJRTyIsdm9pZDp0cnVlLGFyZ3M6W1cuQWpZXX0sInJlc3VsdCIse2Z1bmM6ImZLIixhcmdzOltELmFmXX0se2Z1bmM6IklTIixyZXQ6Ty5Ien0sInJlc3BvbnNlIiwic3QiLHtmdW5jOiJEOCIsdm9pZDp0cnVlLGFyZ3M6W0Qudk9dfSwibmV3UHJvZmlsZSIse2Z1bmM6IkFnIixyZXQ6UC5xVSxhcmdzOltQLmEyXX0sIm5ld1NwYWNlIix7ZnVuYzoiWjUiLGFyZ3M6W1AuS05dfSx7ZnVuYzoia2QiLGFyZ3M6W1AuS04sbnVsbF19LHtmdW5jOiJ4RCIscmV0OlAuUVYsYXJnczpbe2Z1bmM6InBkIixhcmdzOltQLnFVXX1dfSx7ZnVuYzoiUWQiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJ1VzIiLHJldDpQLlFWLGFyZ3M6W1AucVVdfV19LCJzIix7ZnVuYzoiVzciLHZvaWQ6dHJ1ZSxhcmdzOltQLmEyLG51bGxdfSwiZXhwYW5kIiwibSIse2Z1bmM6ImZuaCIscmV0OlAuYjgsYXJnczpbbnVsbF19LCJ0YWdQcm9maWxlIiwicmVjIix7ZnVuYzoiWE8iLGFyZ3M6W04uSFZdfSx7ZnVuYzoiZDRDIix2b2lkOnRydWUsYXJnczpbVy5BalksbnVsbCxXLmg0XX0se2Z1bmM6IklmIixyZXQ6UC5xVSxhcmdzOltQLnFVXX0sInVybCIse2Z1bmM6Im54ZyIscmV0OlAucVUsYXJnczpbUC5DUF19LCJ0aW1lIix7ZnVuYzoid1Q2IixyZXQ6UC5hMixhcmdzOltQLnFVXX0sInR5cGUiLHtmdW5jOiJCNCIsYXJnczpbUC5lNHksUC5kbF19LHtmdW5jOiJaZyIsYXJnczpbUC5kbCxQLmU0eSxQLmRsLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19XX0se2Z1bmM6IkRGIix2b2lkOnRydWUsYXJnczpbUC5hXX0sInJlY29yZHMiLHtmdW5jOiJxayIsYXJnczpbTC5UdixudWxsXX0sIm1vZGVsIiwibm9kZSIsIm9uZVRpbWUiLHtmdW5jOiJvWXQiLGFyZ3M6W251bGwsbnVsbCxudWxsXX0se2Z1bmM6InJkIix2b2lkOnRydWUsYXJnczpbUC5xVSxQLnFVXX0se2Z1bmM6ImFBIix2b2lkOnRydWUsYXJnczpbUC5XTyxQLlowLFAuV09dfSx7ZnVuYzoiWVQiLHZvaWQ6dHJ1ZSxhcmdzOltbUC5XTyxULnlqXV19LHtmdW5jOiJRWSIsdm9pZDp0cnVlLGFyZ3M6W1tQLlFWLEEuWWpdXX0sImNoYW5nZXMiLCJqc0VsZW0iLCJleHRlbmRlZSIse2Z1bmM6IlFQIixhcmdzOltudWxsLFAucVUsUC5xVV19LHtmdW5jOiJ0dyIsYXJnczpbbnVsbCxXLktWLFAuYTJdfSx7ZnVuYzoiSGIiLGFyZ3M6W251bGxdLG5hbWVkOntza2lwQ2hhbmdlczpQLmEyfX0sITEsInNraXBDaGFuZ2VzIix7ZnVuYzoiWkQiLGFyZ3M6W1tQLldPLFQueWpdXX0se2Z1bmM6IkN4IixyZXQ6VS56WCxhcmdzOltVLklwLFUuSXBdfSx7ZnVuYzoiUWMiLGFyZ3M6W1UuSXBdfSwibGluZSIse2Z1bmM6IlR6Iix2b2lkOnRydWUsYXJnczpbbnVsbCxudWxsXX0sIm11dGF0aW9ucyIsIm9ic2VydmVyIiwiaWQiLCJtYXAiLHtmdW5jOiJKQyIsYXJnczpbVi5xQ119LHtmdW5jOiJydCIscmV0OlAuYjh9LCJzY3JpcHRDb3ZlcmFnZSIsIm93bmluZ0lzb2xhdGUiLHtmdW5jOiJEMCIscmV0OltQLmI4LFtQLldPLEQuZHldXSxhcmdzOltELnZPXX0sImNsYXNzTGlzdCIse2Z1bmM6ImxCIixyZXQ6W1AuYjgsRC5keV0sYXJnczpbW1AuV08sRC5keV1dfSwiY2xhc3NlcyIsInRpbWVyIix7ZnVuYzoiSDYiLHJldDpQLnFVLGFyZ3M6W0Qua3hdfSx7ZnVuYzoicVEiLHZvaWQ6dHJ1ZSxhcmdzOltELnZ4XX0sInNjcmlwdCIsImZ1bmMiLHtmdW5jOiJKUSIsdm9pZDp0cnVlLGFyZ3M6W1cuQkldfSwiRXZlbnQiLHtmdW5jOiJXRXoiLHZvaWQ6dHJ1ZSxhcmdzOltXLkh5XX0se2Z1bmM6IlQyIix2b2lkOnRydWUsYXJnczpbUC5xVSxVLlUyXX0se2Z1bmM6InB4IixhcmdzOltQLnFVLFUuVTJdfSwiZGV0YWlscyIsInJlZiIse2Z1bmM6Iks3Iix2b2lkOnRydWUsYXJnczpbW1AuV08sRy5EQV1dfSwic3BsaWNlcyIse2Z1bmM6ImsyRyIsdm9pZDp0cnVlLGFyZ3M6W1cuaHN3XX0se2Z1bmM6IlZ2IixyZXQ6UC5xVSxhcmdzOltQLmFdfSx7ZnVuYzoiaThpIixyZXQ6UC5xVSxhcmdzOltbUC5XTyxQLmFdXX0sInZhbHVlcyIsInRhcmdldHMiLHtmdW5jOiJ3OSIscmV0OlAuYjgsYXJnczpbUC5xVV19LF07JD1udWxsCiBJID0gSS4kZmluaXNoSXNvbGF0ZUNvbnN0cnVjdG9yKEkpCiAkPW5ldyBJKCkKIGZ1bmN0aW9uIGNvbnZlcnRUb0Zhc3RPYmplY3QoYSl7ZnVuY3Rpb24gTXlDbGFzcygpe31NeUNsYXNzLnByb3RvdHlwZT1hCkBAIC0yMDk1NSw3ICsyMTI0Niw3IEBACiByZXR1cm59aWYoZG9jdW1lbnQuY3VycmVudFNjcmlwdCl7YShkb2N1bWVudC5jdXJyZW50U2NyaXB0KQogcmV0dXJufXZhciB6PWRvY3VtZW50LnNjcmlwdHMKIGZ1bmN0aW9uIG9uTG9hZChiKXtmb3IodmFyIHg9MDt4PHoubGVuZ3RoOysreCl7elt4XS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpfWEoYi50YXJnZXQpfWZvcih2YXIgeT0wO3k8ei5sZW5ndGg7Kyt5KXt6W3ldLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG9uTG9hZCxmYWxzZSl9fSkoZnVuY3Rpb24oYSl7aW5pdC5jdXJyZW50U2NyaXB0PWEKLWlmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpe2RhcnRNYWluUnVubmVyKGZ1bmN0aW9uKGIpe0gud1coRS5WNygpLGIpfSxbXSl9ZWxzZXsoZnVuY3Rpb24oYil7SC53VyhFLlY3KCksYil9KShbXSl9fSkKK2lmKHR5cGVvZiBkYXJ0TWFpblJ1bm5lcj09PSJmdW5jdGlvbiIpe2RhcnRNYWluUnVubmVyKGZ1bmN0aW9uKGIpe0gud1coRS5WN0EoKSxiKX0sW10pfWVsc2V7KGZ1bmN0aW9uKGIpe0gud1coRS5WN0EoKSxiKX0pKFtdKX19KQogZnVuY3Rpb24gaW5pdCgpe0kucD17fQogZnVuY3Rpb24gZ2VuZXJhdGVBY2Nlc3NvcihhLGIsYyl7dmFyIHk9YS5zcGxpdCgiLSIpCiB2YXIgeD15WzBdCmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleF9kZXZ0b29scy5odG1sIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvaW5kZXhfZGV2dG9vbHMuaHRtbAppbmRleCA1MDk4NzVkLi5jY2E4MjVjIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleF9kZXZ0b29scy5odG1sCisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4X2RldnRvb2xzLmh0bWwKQEAgLTMxMzEsMTQgKzMxMzEsMTQgQEAKICAgd29yZC13cmFwOiBicmVhay13b3JkOwogfQogPC9zdHlsZT48IS0tIFRoZXNlIGNvbW1lbnRzIGFyZSBoZXJlIHRvIGFsbG93IG5ld2xpbmVzLgotICAgICAtLT48dGVtcGxhdGUgaWY9Int7IGlzRGFydCB9fSI+PCEtLQotICAgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICZhbXA7JmFtcDsgIWhhc1BhcmVudCAmYW1wOyZhbXA7IGhhc0NsYXNzIH19Ij48IS0tCi0gICAgICAgLS0+PGNsYXNzLXJlZiByZWY9Int7IHJlZlsnb3duZXInXSB9fSI+PC9jbGFzcy1yZWY+LjwvdGVtcGxhdGU+PCEtLQotICAgICAtLT48dGVtcGxhdGUgaWY9Int7IHF1YWxpZmllZCAmYW1wOyZhbXA7IGhhc1BhcmVudCB9fSI+PCEtLQotICAgICAgIC0tPjxmdW5jdGlvbi1yZWYgcmVmPSJ7eyByZWZbJ3BhcmVudCddIH19IiBxdWFsaWZpZWQ9Int7IHRydWUgfX0iPgorICAgICAtLT48dGVtcGxhdGUgaWY9Int7IHJlZi5pc0RhcnQgfX0iPjwhLS0KKyAgICAgICAtLT48dGVtcGxhdGUgaWY9Int7IHF1YWxpZmllZCAmYW1wOyZhbXA7IHJlZi5wYXJlbnQgPT0gbnVsbCAmYW1wOyZhbXA7IHJlZi5vd25pbmdDbGFzcyAhPSBudWxsIH19Ij48IS0tCisgICAgICAgLS0+PGNsYXNzLXJlZiByZWY9Int7IHJlZi5vd25pbmdDbGFzc10gfX0iPjwvY2xhc3MtcmVmPi48L3RlbXBsYXRlPjwhLS0KKyAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJmFtcDsmYW1wOyByZWYucGFyZW50ICE9IG51bGwgfX0iPjwhLS0KKyAgICAgICAtLT48ZnVuY3Rpb24tcmVmIHJlZj0ie3sgcmVmLnBhcmVudCB9fSIgcXVhbGlmaWVkPSJ7eyB0cnVlIH19Ij4KICAgICAgICAgICA8L2Z1bmN0aW9uLXJlZj4uPCEtLQogICAgICAtLT48L3RlbXBsYXRlPjxhIG9uLWNsaWNrPSJ7eyBnb3RvIH19IiBocmVmPSJ7eyB1cmwgfX0iPnt7IG5hbWUgfX08L2E+PCEtLQotICAtLT48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZj0ie3sgIWlzRGFydCB9fSI+PHNwYW4+IHt7IG5hbWUgfX08L3NwYW4+PC90ZW1wbGF0ZT48L3RlbXBsYXRlPgorICAtLT48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBpZj0ie3sgIXJlZi5pc0RhcnQgfX0iPjxzcGFuPiB7eyBuYW1lIH19PC9zcGFuPjwvdGVtcGxhdGU+PC90ZW1wbGF0ZT4KIDwvcG9seW1lci1lbGVtZW50PgogCiAKQEAgLTM0MTIsMjYgKzM0MTIsNjUgQEAKICAgICAgICAgcGFkZGluZy1sZWZ0OiAxNSU7CiAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1JTsKICAgICAgIH0KLSAgICAgIC5ncmF5Qm94IHsKKyAgICAgIC5zb3VyY2VCb3ggewogICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgICAgICAgcGFkZGluZzogMTBweDsKLSAgICAgfQorICAgICAgICBvdmVyZmxvdy15OiBhdXRvOworICAgICAgfQorICAgICAgLnNvdXJjZVRhYmxlIHsKKyAgICAgICAgZGlzcGxheTogdGFibGU7CisgICAgICB9CisgICAgICAuc291cmNlUm93IHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtcm93OworICAgICAgfQorICAgICAgLnNvdXJjZUl0ZW0sIC5zb3VyY2VJdGVtQ3VycmVudCB7CisgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgICAgIGZvbnQ6IDQwMCAxNHB4IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxMjUlOworICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgICAgfQorICAgICAgLnNvdXJjZUl0ZW1DdXJyZW50IHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzZjZjsKKyAgICAgIH0KKyAgICAgIC5oaXRzTm9uZSwgLmhpdHNOb3RFeGVjdXRlZCwgLmhpdHNFeGVjdXRlZCB7CisgICAgICAgIG1pbi13aWR0aDogMzJweDsKKyAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgICB9CisgICAgICAuaGl0c05vdEV4ZWN1dGVkIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U2NjsKKyAgICAgIH0KKyAgICAgIC5oaXRzRXhlY3V0ZWQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmQ2OworICAgICAgfQogICAgIDwvc3R5bGU+CiAgICAgPGRpdiBjbGFzcz0ic291cmNlSW5zZXQiPgogICAgICAgPGNvbnRlbnQ+PC9jb250ZW50PgotICAgICAgPGRpdiBjbGFzcz0iZ3JheUJveCI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dGJvZHk+Ci0gICAgICAgICAgICA8dHIgdGVtcGxhdGU9IiIgcmVwZWF0PSJ7eyBsaW5lTnVtYmVyIGluIGxpbmVOdW1iZXJzIH19Ij4KLSAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ7eyBzdHlsZUZvckhpdHMoc2NyaXB0LmxpbmVzW2xpbmVOdW1iZXJdLmhpdHMpIH19Ij48c3Bhbj4gIDwvc3Bhbj48L3RkPgotICAgICAgICAgICAgICA8dGQgc3R5bGU9ImZvbnQtZmFtaWx5OiBjb25zb2xhcywgY291cmllciwgbW9ub3NwYWNlO2ZvbnQtc2l6ZTogMWVtO2xpbmUtaGVpZ2h0OiAxLjJlbTt3aGl0ZS1zcGFjZTogbm93cmFwOyI+e3tzY3JpcHQubGluZXNbbGluZU51bWJlcl0ubGluZX19PC90ZD4KLSAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTklIiBzdHlsZT0iZm9udC1mYW1pbHk6IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7Zm9udC1zaXplOiAxZW07bGluZS1oZWlnaHQ6IDEuMmVtO3doaXRlLXNwYWNlOiBwcmU7Ij57e3NjcmlwdC5saW5lc1tsaW5lTnVtYmVyXS50ZXh0fX08L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3Rib2R5PgotICAgICAgICA8L3RhYmxlPgorICAgICAgPGRpdiBjbGFzcz0ic291cmNlQm94IiBzdHlsZT0iaGVpZ2h0Ont7aGVpZ2h0fX0iPgorICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VUYWJsZSI+CisgICAgICAgICAgPHRlbXBsYXRlIHJlcGVhdD0ie3sgbGluZSBpbiBsaW5lcyB9fSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VSb3ciIGlkPSJ7eyBtYWtlTGluZUlkKGxpbmUubGluZSkgfX0iPgorICAgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGxpbmUuaGl0cyA9PSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXRzTm9uZSI+e3sgbGluZS5saW5lIH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID09IDAgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhpdHNOb3RFeGVjdXRlZCI+e3sgbGluZS5saW5lIH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID4gMCB9fSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGl0c0V4ZWN1dGVkIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlSXRlbSI+Jm5ic3A7PC9kaXY+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5saW5lID09IGN1cnJlbnRMaW5lIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjdXJyZW50TGluZSIgY2xhc3M9InNvdXJjZUl0ZW1DdXJyZW50Ij57e2xpbmUudGV4dH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5saW5lICE9IGN1cnJlbnRMaW5lIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJdGVtIj57e2xpbmUudGV4dH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8L2Rpdj4KICAgICAgIDwvZGl2PgogICAgIDwvZGl2PgogICA8L3RlbXBsYXRlPgpAQCAtNDExNyw3ICs0MTU2LDcgQEAKICAgICA8L2Rpdj4KIAogICAgIDxocj4KLSAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIgcG9zPSJ7eyBjbHMudG9rZW5Qb3MgfX0iIGVuZHBvcz0ie3sgY2xzLmVuZFRva2VuUG9zIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIgc3RhcnRwb3M9Int7IGNscy50b2tlblBvcyB9fSIgZW5kcG9zPSJ7eyBjbHMuZW5kVG9rZW5Qb3MgfX0iPgogICAgIDwvc2NyaXB0LWluc2V0PgogCiAgICAgPGJyPjxicj48YnI+PGJyPgpAQCAtNDEyOCw2ICs0MTY3LDcgQEAKIAogCiAKKwogPHBvbHltZXItZWxlbWVudCBuYW1lPSJjb2RlLXJlZiIgZXh0ZW5kcz0ic2VydmljZS1yZWYiPgogICA8dGVtcGxhdGU+CiAgICAgPHN0eWxlPgpAQCAtNDY5OCw3ICs0NzM4LDcgQEAKICAgICA8bmF2LWJhcj4KICAgICAgIDx0b3AtbmF2LW1lbnU+PC90b3AtbmF2LW1lbnU+CiAgICAgICA8aXNvbGF0ZS1uYXYtbWVudSBpc29sYXRlPSJ7eyBjb2RlLmlzb2xhdGUgfX0iPjwvaXNvbGF0ZS1uYXYtbWVudT4KLSAgICAgIDxuYXYtbWVudSBsaW5rPSIuIiBhbmNob3I9Int7IGNvZGUubmFtZSB9fSIgbGFzdD0ie3sgdHJ1ZSB9fSI+PC9uYXYtbWVudT4KKyAgICAgIDxuYXYtbWVudSBsaW5rPSJ7eyBjb2RlLmxpbmsgfX0iIGFuY2hvcj0ie3sgY29kZS5uYW1lIH19IiBsYXN0PSJ7eyB0cnVlIH19Ij48L25hdi1tZW51PgogICAgICAgPG5hdi1yZWZyZXNoIGNhbGxiYWNrPSJ7eyByZWZyZXNoIH19Ij48L25hdi1yZWZyZXNoPgogICAgICAgPG5hdi1jb250cm9sPjwvbmF2LWNvbnRyb2w+CiAgICAgPC9uYXYtYmFyPgpAQCAtNjUxNiwxMiArNjU1NiwxMiBAQAogICAgIDxuYXYtYmFyPgogICAgICAgPHRvcC1uYXYtbWVudT48L3RvcC1uYXYtbWVudT4KICAgICAgIDxpc29sYXRlLW5hdi1tZW51IGlzb2xhdGU9Int7IGZ1bmN0aW9uLmlzb2xhdGUgfX0iPjwvaXNvbGF0ZS1uYXYtbWVudT4KLSAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10uc2VydmljZVR5cGUgPT0gJ0NsYXNzJyB9fSI+CisgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLm93bmluZ0NsYXNzICE9IG51bGwgfX0iPgogICAgICAgICA8IS0tIFRPRE8odHVybmlkZ2UpOiBBZGQgbGlicmFyeSBuYXYgbWVudSBoZXJlLiAtLT4KLSAgICAgICAgPGNsYXNzLW5hdi1tZW51IGNscz0ie3sgZnVuY3Rpb25bJ293bmVyJ10gfX0iPjwvY2xhc3MtbmF2LW1lbnU+CisgICAgICAgIDxjbGFzcy1uYXYtbWVudSBjbHM9Int7IGZ1bmN0aW9uLm93bmluZ0NsYXNzIH19Ij48L2NsYXNzLW5hdi1tZW51PgogICAgICAgPC90ZW1wbGF0ZT4KLSAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10uc2VydmljZVR5cGUgPT0gJ0xpYnJhcnknIH19Ij4KLSAgICAgICAgPGxpYnJhcnktbmF2LW1lbnUgbGlicmFyeT0ie3sgZnVuY3Rpb25bJ293bmVyJ10gfX0iPjwvbGlicmFyeS1uYXYtbWVudT4KKyAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSAhPSBudWxsIH19Ij4KKyAgICAgICAgPGxpYnJhcnktbmF2LW1lbnUgbGlicmFyeT0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSB9fSI+PC9saWJyYXJ5LW5hdi1tZW51PgogICAgICAgPC90ZW1wbGF0ZT4KICAgICAgIDxuYXYtbWVudSBsaW5rPSJ7eyBmdW5jdGlvbi5saW5rIH19IiBhbmNob3I9Int7IGZ1bmN0aW9uLm5hbWUgfX0iIGxhc3Q9Int7IHRydWUgfX0iPjwvbmF2LW1lbnU+CiAgICAgICA8bmF2LXJlZnJlc2ggY2FsbGJhY2s9Int7IHJlZnJlc2ggfX0iPjwvbmF2LXJlZnJlc2g+CkBAIC02NTI5LDc4ICs2NTY5LDc4IEBACiAgICAgPC9uYXYtYmFyPgogCiAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+Ci0gICAgICA8aDE+ZnVuY3Rpb24ge3sgcXVhbGlmaWVkTmFtZSB9fTwvaDE+CisgICAgICA8aDE+ZnVuY3Rpb24ge3sgZnVuY3Rpb24ucXVhbGlmaWVkTmFtZSB9fTwvaDE+CiAKICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckxpc3QiPgogICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5raW5kPC9kaXY+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnaXNfc3RhdGljJ10gfX0iPnN0YXRpYzwvdGVtcGxhdGU+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydpc19jb25zdCddIH19Ij5jb25zdDwvdGVtcGxhdGU+Ci0gICAgICAgICAgICB7eyBraW5kIH19CisgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLmlzU3RhdGljIH19Ij5zdGF0aWM8L3RlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5pc0NvbnN0IH19Ij5jb25zdDwvdGVtcGxhdGU+CisgICAgICAgICAgICB7eyBmdW5jdGlvbi5raW5kLnRvU3RyaW5nKCkgfX0KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+Ci0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ3BhcmVudCddICE9IG51bGwgfX0iPgorICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLnBhcmVudCAhPSBudWxsIH19Ij4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPnBhcmVudCBmdW5jdGlvbjwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8ZnVuY3Rpb24tcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ3BhcmVudCddIH19Ij48L2Z1bmN0aW9uLXJlZj4KKyAgICAgICAgICAgICAgPGZ1bmN0aW9uLXJlZiByZWY9Int7IGZ1bmN0aW9uLnBhcmVudCB9fSI+PC9mdW5jdGlvbi1yZWY+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3duZXI8L2Rpdj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlID09ICdDbGFzcycgfX0iPgotICAgICAgICAgICAgICA8Y2xhc3MtcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10gfX0iPjwvY2xhc3MtcmVmPgorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdDbGFzcyAhPSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgPGNsYXNzLXJlZiByZWY9Int7IGZ1bmN0aW9uLm93bmluZ0NsYXNzIH19Ij48L2NsYXNzLXJlZj4KICAgICAgICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlICE9ICdDbGFzcycgfX0iPgotICAgICAgICAgICAgICA8bGlicmFyeS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9saWJyYXJ5LXJlZj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSAhPSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgPGxpYnJhcnktcmVmIHJlZj0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSB9fSI+PC9saWJyYXJ5LXJlZj4KICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvZGl2PgogICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5zY3JpcHQ8L2Rpdj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICA8c2NyaXB0LXJlZiByZWY9Int7IGZ1bmN0aW9uWydzY3JpcHQnXSB9fSIgcG9zPSJ7eyBmdW5jdGlvblsndG9rZW5Qb3MnXSB9fSI+CisgICAgICAgICAgICA8c2NyaXB0LXJlZiByZWY9Int7IGZ1bmN0aW9uLnNjcmlwdCB9fSIgcG9zPSJ7eyBmdW5jdGlvbi50b2tlblBvcyB9fSI+CiAgICAgICAgICAgICA8L3NjcmlwdC1yZWY+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvZGl2PgogCiAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPiZuYnNwOzwvZGl2PgogCi0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ2NvZGUnXSAhPSBudWxsIH19Ij4KKyAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5jb2RlICE9IG51bGwgfX0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3B0aW1pemVkIGNvZGU8L2Rpdj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgICAgPGNvZGUtcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ2NvZGUnXSB9fSI+PC9jb2RlLXJlZj4KKyAgICAgICAgICAgICAgPGNvZGUtcmVmIHJlZj0ie3sgZnVuY3Rpb24uY29kZSB9fSI+PC9jb2RlLXJlZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgIDwvZGl2PgogICAgICAgICA8L3RlbXBsYXRlPgotICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWyd1bm9wdGltaXplZF9jb2RlJ10gIT0gbnVsbCB9fSI+CisgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24udW5vcHRpbWl6ZWRDb2RlICE9IG51bGwgfX0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+dW5vcHRpbWl6ZWQgY29kZTwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsndW5vcHRpbWl6ZWRfY29kZSddIH19Ij48L2NvZGUtcmVmPgorICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvbi51bm9wdGltaXplZENvZGUgfX0iPjwvY29kZS1yZWY+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgogICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJUaGlzIGNvdW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gYSBmdW5jdGlvbiB3aWxsIGJlIG9wdGltaXplZC4gIEl0IGlzIGEgY29tYmluYXRpb24gb2YgY2FsbCBjb3VudHMgYW5kIG90aGVyIGZhY3RvcnMuIj4KLSAgICAgICAgICAgICAgICAgICh1c2FnZSBjb3VudDoge3sgZnVuY3Rpb25bJ3VzYWdlX2NvdW50ZXInXSB9fSkKKyAgICAgICAgICAgICAgICAgICh1c2FnZSBjb3VudDoge3sgZnVuY3Rpb24udXNhZ2VDb3VudGVyIH19KQogICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPmRlb3B0aW1pemF0aW9uczwvZGl2PgotICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb25bJ2Rlb3B0aW1pemF0aW9ucyddIH19PC9kaXY+CisgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvbi5kZW9wdGltaXphdGlvbnMgfX08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPm9wdGltaXphYmxlPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnaXNfb3B0aW1pemFibGUnXSB9fTwvZGl2PgorICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb24uaXNPcHRpbWl6YWJsZSB9fTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+aW5saW5hYmxlPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnaXNfaW5saW5hYmxlJ10gfX08L2Rpdj4KKyAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uLmlzSW5saW5hYmxlIH19PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ubmFtZSAhPSBmdW5jdGlvbi52bU5hbWUgfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KQEAgLTY2MTIsNyArNjY1Miw3IEBACiAgICAgPC9kaXY+CiAKICAgICA8aHI+Ci0gICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGZ1bmN0aW9uWydzY3JpcHQnXSB9fSIgcG9zPSJ7eyBmdW5jdGlvblsndG9rZW5Qb3MnXSB9fSIgZW5kcG9zPSJ7eyBmdW5jdGlvblsnZW5kVG9rZW5Qb3MnXSB9fSI+CisgICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGZ1bmN0aW9uLnNjcmlwdCB9fSIgc3RhcnRwb3M9Int7IGZ1bmN0aW9uLnRva2VuUG9zIH19IiBlbmRwb3M9Int7IGZ1bmN0aW9uLmVuZFRva2VuUG9zIH19Ij4KICAgICA8L3NjcmlwdC1pbnNldD4KIAogICAgIDxicj4KQEAgLTEzNDM4LDcgKzEzNDc4LDcgQEAKIAogICAgIDx0ZW1wbGF0ZSBpZj0ie3sgaXNvbGF0ZS50b3BGcmFtZSAhPSBudWxsIH19Ij4KICAgICAgIDxicj4KLSAgICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBpc29sYXRlLnRvcEZyYW1lWydzY3JpcHQnXSB9fSIgcG9zPSJ7eyBpc29sYXRlLnRvcEZyYW1lWyd0b2tlblBvcyddIH19Ij4KKyAgICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBpc29sYXRlLnRvcEZyYW1lWydzY3JpcHQnXSB9fSIgY3VycmVudHBvcz0ie3sgaXNvbGF0ZS50b3BGcmFtZVsndG9rZW5Qb3MnXSB9fSIgaGVpZ2h0PSIyMDBweCI+CiAgICAgICA8L3NjcmlwdC1pbnNldD4KICAgICA8L3RlbXBsYXRlPgogCkBAIC0xNTU5OSw5ICsxNTYzOSwxOCBAQAogICAgIDxuYXYtY29udHJvbD48L25hdi1jb250cm9sPgogICA8L25hdi1iYXI+CiAKLSAgPHNjcmlwdC1pbnNldCBpZD0ic2NyaXB0SW5zZXQiIHNjcmlwdD0ie3sgc2NyaXB0IH19IiBwb3M9Int7IHNjcmlwdC5maXJzdFRva2VuUG9zIH19IiBlbmRwb3M9Int7IHNjcmlwdC5sYXN0VG9rZW5Qb3MgfX0iPgotICA8aDE+c2NyaXB0IHt7IHNjcmlwdC5uYW1lIH19PC9oMT4KLSAgPC9zY3JpcHQtaW5zZXQ+CisgIDx0ZW1wbGF0ZSBpZj0ie3sgYXJnc1sncG9zJ10gPT0gbnVsbCB9fSI+CisgICAgPHNjcmlwdC1pbnNldCBpZD0ic2NyaXB0SW5zZXQiIHNjcmlwdD0ie3sgc2NyaXB0IH19Ij4KKyAgICAgIDxoMT5zY3JpcHQge3sgc2NyaXB0Lm5hbWUgfX08L2gxPgorICAgIDwvc2NyaXB0LWluc2V0PgorICA8L3RlbXBsYXRlPgorCisgIDx0ZW1wbGF0ZSBpZj0ie3sgYXJnc1sncG9zJ10gIT0gbnVsbCB9fSI+CisgICAgPHNjcmlwdC1pbnNldCBpZD0ic2NyaXB0SW5zZXQiIHNjcmlwdD0ie3sgc2NyaXB0IH19IiBjdXJyZW50cG9zPSJ7eyBhcmdzWydwb3MnXSB8IHBhcnNlSW50IH19Ij4KKyAgICAgIDxoMT5zY3JpcHQge3sgc2NyaXB0Lm5hbWUgfX08L2gxPgorICAgIDwvc2NyaXB0LWluc2V0PgorICA8L3RlbXBsYXRlPgorCiA8L3RlbXBsYXRlPgogPC9wb2x5bWVyLWVsZW1lbnQ+CiAKQEAgLTE1NjEwLDYgKzE1NjU5LDcgQEAKIAogCiAKKwogPHBvbHltZXItZWxlbWVudCBuYW1lPSJzdGFjay10cmFjZSIgZXh0ZW5kcz0ib2JzZXJ2YXRvcnktZWxlbWVudCI+CiAgIDx0ZW1wbGF0ZT4KICAgICA8c3R5bGU+CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleF9kZXZ0b29scy5odG1sX2Jvb3RzdHJhcC5kYXJ0LmpzIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvaW5kZXhfZGV2dG9vbHMuaHRtbF9ib290c3RyYXAuZGFydC5qcwppbmRleCAwYmY3NmU3Li4yOWQyN2NmIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9pbmRleF9kZXZ0b29scy5odG1sX2Jvb3RzdHJhcC5kYXJ0LmpzCisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL2luZGV4X2RldnRvb2xzLmh0bWxfYm9vdHN0cmFwLmRhcnQuanMKQEAgLTE5MywyMyArMTkzLDIzIEBACiAiXiI6ImE7IiwKIG46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PWJ9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmE1KGEpfSwKLVQ6W2Z1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAubHIoYSxiLmdXYSgpLGIuZ25kKCksYi5nVm0oKSxudWxsKSl9LCIkMSIsImd4SyIsMiwwLG51bGwsNjldLAotZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5jdShILmI3KGEpLG51bGwpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5hNShhKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAorVDpbZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5scihhLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpLG51bGwpKX0sIiQxIiwiZ3hLIiwyLDAsbnVsbCw3MF0sCitnYng6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmN1KEgud08oYSksbnVsbCl9LAogIiUiOiJET01JbXBsZW1lbnRhdGlvbnxOYXZpZ2F0b3J8U1ZHQW5pbWF0ZWRFbnVtZXJhdGlvbnxTVkdBbmltYXRlZExlbmd0aHxTVkdBbmltYXRlZExlbmd0aExpc3R8U1ZHQW5pbWF0ZWROdW1iZXJ8U1ZHQW5pbWF0ZWROdW1iZXJMaXN0fFNWR0FuaW1hdGVkU3RyaW5nIn0sCiB5RWU6ewogIl4iOiJHdjsiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFN0cmluZyhhKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBhPzUxOTAxODoyMTgxNTl9LAogZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBDLkhMfSwKICRpc2EyOnRydWV9LAogQ0RVOnsKICJeIjoiR3Y7IiwKIG46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09Yn0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4ibnVsbCJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKIGdieDpmdW5jdGlvbihhKXtyZXR1cm4gQy5HWH0sCi1UOltmdW5jdGlvbihhLGIpe3JldHVybiBKLkd2LnByb3RvdHlwZS5ULmNhbGwodGhpcyxhLGIpfSwiJDEiLCJneEsiLDIsMCxudWxsLDY5XX0sCitUOltmdW5jdGlvbihhLGIpe3JldHVybiBKLkd2LnByb3RvdHlwZS5ULmNhbGwodGhpcyxhLGIpfSwiJDEiLCJneEsiLDIsMCxudWxsLDcwXX0sCiBVZTE6ewogIl4iOiJHdjsiLAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiAwfSwKQEAgLTI0Myw3ICsyNDMsNyBAQAogZm9yKHo9Si5tWShiKTt6LkcoKTspdGhpcy5oKGEsei5nbCgpKX0sCiBWMTpmdW5jdGlvbihhKXt0aGlzLnNCKGEsMCl9LAogYU46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5iUShhLGIpfSwKLWV6OltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILkE4KGEsYiksW251bGwsbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJmUSIscmV0OlAuUVYsYXJnczpbe2Z1bmM6InViIixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIlEiKX0sMzFdLAorZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguQTgoYSxiKSxbbnVsbCxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImZRIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiSm0iLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwiUSIpfSwzMV0sCiB6VjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3CiB6PWEubGVuZ3RoCiB5PUFycmF5KHopCkBAIC0yNTYsMTEgKzI1NiwxMSBAQAogcmV0dXJuIGFbYl19LAogYU06ZnVuY3Rpb24oYSxiLGMpe2lmKGI8MHx8Yj5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShiLDAsYS5sZW5ndGgpKQogaWYoYzxifHxjPmEubGVuZ3RoKXRocm93IEguYihQLlRFKGMsYixhLmxlbmd0aCkpCi1pZihiPT09YylyZXR1cm4gSC5WTShbXSxbSC5LcChhLDApXSkKLXJldHVybiBILlZNKGEuc2xpY2UoYixjKSxbSC5LcChhLDApXSl9LAoraWYoYj09PWMpcmV0dXJuIEguVk0oW10sW0guT3EoYSwwKV0pCityZXR1cm4gSC5WTShhLnNsaWNlKGIsYyksW0guT3EoYSwwKV0pfSwKIE11OmZ1bmN0aW9uKGEsYixjKXtILnhGKGEsYixjKQogcmV0dXJuIEguYzEoYSxiLGMsbnVsbCl9LAotZ3RIOmZ1bmN0aW9uKGEpe2lmKGEubGVuZ3RoPjApcmV0dXJuIGFbMF0KK2dUdzpmdW5jdGlvbihhKXtpZihhLmxlbmd0aD4wKXJldHVybiBhWzBdCiB0aHJvdyBILmIoUC53KCJObyBlbGVtZW50cyIpKX0sCiBnclo6ZnVuY3Rpb24oYSl7dmFyIHo9YS5sZW5ndGgKIGlmKHo+MClyZXR1cm4gYVt6LTFdCkBAIC0yODUsMTcgKzI4NSwxNyBAQAogcmV0dXJuITF9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aD09PTB9LAogZ29yOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aCE9PTB9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UoYSwiWyIsIl0iKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgegotaWYoYilyZXR1cm4gSC5WTShhLnNsaWNlKCksW0guS3AoYSwwKV0pCi1lbHNle3o9SC5WTShhLnNsaWNlKCksW0guS3AoYSwwKV0pCitpZihiKXJldHVybiBILlZNKGEuc2xpY2UoKSxbSC5PcShhLDApXSkKK2Vsc2V7ej1ILlZNKGEuc2xpY2UoKSxbSC5PcShhLDApXSkKIHouZml4ZWQkbGVuZ3RoPWluaXQKIHJldHVybiB6fX0sCiBicjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX0sCi16SDpmdW5jdGlvbihhKXt2YXIgej1QLkxzKG51bGwsbnVsbCxudWxsLEguS3AoYSwwKSkKK3pIOmZ1bmN0aW9uKGEpe3ZhciB6PVAuTHMobnVsbCxudWxsLG51bGwsSC5PcShhLDApKQogei5GVigwLGEpCiByZXR1cm4gen0sCi1nQTpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guS3AoYSwwKV0pfSwKK2dBOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5PcShhLDApXSl9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBILmVRKGEpfSwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCiBzQjpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBiIT09Im51bWJlciJ8fE1hdGguZmxvb3IoYikhPT1iKXRocm93IEguYihQLnUoYikpCkBAIC0zNDksMTEgKzM0OSwxMSBAQAogaWYoei5DKGIsMCl8fHouRChiLDIwKSl0aHJvdyBILmIoUC5LUChiKSkKIHk9YS50b0ZpeGVkKGIpCiBpZihhPT09MCYmdGhpcy5nelAoYSkpcmV0dXJuIi0iK3kKLXJldHVybiB5fSwiJDEiLCJnS3kiLDIsMCwxNSw3MF0sCityZXR1cm4geX0sIiQxIiwiZ0t5IiwyLDAsMTUsNzFdLAogV1o6ZnVuY3Rpb24oYSxiKXtpZihiPDJ8fGI+MzYpdGhyb3cgSC5iKFAuS1AoYikpCiByZXR1cm4gYS50b1N0cmluZyhiKX0sCi1idTpmdW5jdGlvbihhKXtpZihhPT09MCYmMS9hPDApcmV0dXJuIi0wLjAiCi1lbHNlIHJldHVybiIiK2F9LAorYnU6W2Z1bmN0aW9uKGEpe2lmKGE9PT0wJiYxL2E8MClyZXR1cm4iLTAuMCIKK2Vsc2UgcmV0dXJuIiIrYX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBhJjB4MUZGRkZGRkZ9LAogSjpmdW5jdGlvbihhKXtyZXR1cm4tYX0sCiBnOmZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGIhPT0ibnVtYmVyIil0aHJvdyBILmIoUC51KGIpKQpAQCAtNDc4LDYgKzQ3OCw3IEBACiBiPWI+Pj4xCiBpZihiPT09MClicmVhawogeis9en1yZXR1cm4geX0sCitnWUM6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBKLm1OKGEpfSwKIFhVOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdwogaWYoYj09bnVsbClILnZoKFAudShudWxsKSkKIGlmKGM8MHx8Yz5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShjLDAsYS5sZW5ndGgpKQpAQCAtNTA1LDcgKzUwNiw3IEBACiBpZihhPT09Yil6PTAKIGVsc2Ugej1hPGI/LTE6MQogcmV0dXJuIHp9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBhfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnaU86ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiBmb3Ioej1hLmxlbmd0aCx5PTAseD0wO3g8ejsrK3gpe3k9NTM2ODcwOTExJnkrYS5jaGFyQ29kZUF0KHgpCiB5PTUzNjg3MDkxMSZ5KygoNTI0Mjg3JnkpPDwxMD4+PjApCkBAIC01MjcsNyArNTI4LDIyIEBACiBmb3Ioej1hLmxlbmd0aDtiPjA7Yj15KXt5PWItMQogaWYoeT49eilILnZoKFAuTih5KSkKIHg9YS5jaGFyQ29kZUF0KHkpCi1pZih4IT09MzImJnghPT0xMyYmIUouR2EoeCkpYnJlYWt9cmV0dXJuIGJ9fX19XSxbIl9pc29sYXRlX2hlbHBlciIsImRhcnQ6X2lzb2xhdGVfaGVscGVyIiwsSCx7CitpZih4IT09MzImJnghPT0xMyYmIUouR2EoeCkpYnJlYWt9cmV0dXJuIGJ9fX0sCittTjp7CisiXiI6IncyWTtpTiIsCitnQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5pTi5sZW5ndGh9LAordDpmdW5jdGlvbihhLGIpe3ZhciB6LHkKK3o9dGhpcy5pTgoraWYodHlwZW9mIGIhPT0ibnVtYmVyInx8TWF0aC5mbG9vcihiKSE9PWIpSC52aChQLnUoYikpCit5PUouV3goYikKK2lmKHkuQyhiLDApKUgudmgoUC5OKGIpKQoraWYoeS5GKGIsei5sZW5ndGgpKUgudmgoUC5OKGIpKQorcmV0dXJuIHouY2hhckNvZGVBdChiKX0sCiskYXN3Mlk6ZnVuY3Rpb24oKXtyZXR1cm5bUC5LTl19LAorJGFzYXJrOmZ1bmN0aW9uKCl7cmV0dXJuW1AuS05dfSwKKyRhc0lyOmZ1bmN0aW9uKCl7cmV0dXJuW1AuS05dfSwKKyRhc1dPOmZ1bmN0aW9uKCl7cmV0dXJuW1AuS05dfSwKKyRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1AuS05dfX19XSxbIl9pc29sYXRlX2hlbHBlciIsImRhcnQ6X2lzb2xhdGVfaGVscGVyIiwsSCx7CiAiXiI6IiIsCiBkQjpmdW5jdGlvbihhLGIpe3ZhciB6PWEudlYoMCxiKQogaW5pdC5nbG9iYWxTdGF0ZS5Yei5iTCgpCkBAIC01NDIsNyArNTU4LDcgQEAKIHouYT1iCiB5PWJ9ZWxzZSB5PWIKIGlmKCFKLngoeSkuJGlzV08pdGhyb3cgSC5iKFAudSgiQXJndW1lbnRzIHRvIG1haW4gbXVzdCBiZSBhIExpc3Q6ICIrSC5kKHkpKSkKLXk9bmV3IEguRlUoMCwwLDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSkKK3k9bmV3IEgucHEoMCwwLDEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSkKIHkucWkoYSkKIGluaXQuZ2xvYmFsU3RhdGU9eQogaWYoaW5pdC5nbG9iYWxTdGF0ZS5FRj09PSEwKXJldHVybgpAQCAtNTc2LDE2ICs1OTIsMTYgQEAKIGlmKHkhPW51bGwpcmV0dXJuIHlbMV0KIHRocm93IEguYihQLmYoIkNhbm5vdCBleHRyYWN0IFVSSSBmcm9tIFwiIitILmQoeikrIlwiIikpfSwKIHVLOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0KLXo9SC5IaChiLmRhdGEpCit6PUguYjAoYi5kYXRhKQogeT1KLlU2KHopCi1zd2l0Y2goeS50KHosImNvbW1hbmQiKSl7Y2FzZSJzdGFydCI6aW5pdC5nbG9iYWxTdGF0ZS5vTD15LnQoeiwiaWQiKQorc3dpdGNoKHkudCh6LCJjb21tYW5kIikpe2Nhc2Uic3RhcnQiOmluaXQuZ2xvYmFsU3RhdGUuTk89eS50KHosImlkIikKIHg9eS50KHosImZ1bmN0aW9uTmFtZSIpCiB3PXg9PW51bGw/aW5pdC5nbG9iYWxTdGF0ZS53Mjppbml0Lmdsb2JhbEZ1bmN0aW9uc1t4XSgpCiB2PXkudCh6LCJhcmdzIikKLXU9SC5IaCh5LnQoeiwibXNnIikpCit1PUguYjAoeS50KHosIm1zZyIpKQogdD15LnQoeiwiaXNTcGF3blVyaSIpCiBzPXkudCh6LCJzdGFydFBhdXNlZCIpCi1yPUguSGgoeS50KHosInJlcGx5VG8iKSkKK3I9SC5iMCh5LnQoeiwicmVwbHlUbyIpKQogeT1pbml0Lmdsb2JhbFN0YXRlLkhnKysKIHE9UC5MNShudWxsLG51bGwsbnVsbCxQLktOLEgueW8pCiBwPVAuTHMobnVsbCxudWxsLG51bGwsUC5LTikKQEAgLTU5OCw3ICs2MTQsNyBAQAogaW5pdC5nbG9iYWxTdGF0ZS5Yei5iTCgpCiBicmVhawogY2FzZSJzcGF3bi13b3JrZXIiOm09eS50KHosInJlcGx5UG9ydCIpCi1ILkVOKHkudCh6LCJmdW5jdGlvbk5hbWUiKSx5LnQoeiwidXJpIikseS50KHosImFyZ3MiKSx5LnQoeiwibXNnIiksITEseS50KHosImlzU3Bhd25VcmkiKSx5LnQoeiwic3RhcnRQYXVzZWQiKSkuUngobmV3IEgubU4obSksbmV3IEgueG4obSkpCitILkVOKHkudCh6LCJmdW5jdGlvbk5hbWUiKSx5LnQoeiwidXJpIikseS50KHosImFyZ3MiKSx5LnQoeiwibXNnIiksITEseS50KHosImlzU3Bhd25VcmkiKSx5LnQoeiwic3RhcnRQYXVzZWQiKSkuUngobmV3IEgueG4obSksbmV3IEguamwzKG0pKQogYnJlYWsKIGNhc2UibWVzc2FnZSI6aWYoeS50KHosInBvcnQiKSE9bnVsbClKLkg0KHkudCh6LCJwb3J0IikseS50KHosIm1zZyIpKQogaW5pdC5nbG9iYWxTdGF0ZS5Yei5iTCgpCkBAIC02MjQsMTYgKzY0MCwxNiBAQAogdGhyb3cgSC5iKFAuRk0oeikpfX0sCiBFTjpmdW5jdGlvbihhLGIsYyxkLGUsZixnKXt2YXIgeix5LHgsdyx2LHUKIGlmKGIhPW51bGwmJkouVnIoYiwiLmRhcnQiKSliPUouZXcoYiwiLmpzIikKLXo9UC5oTSgpCit6PVAuYXQoKQogeT1ILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkKLXouZ3RIKHopLm1sKG5ldyBILldLKHkpKQorei5nVHcoeikubWwobmV3IEgueWsoeSkpCiB4PW5ldyBILlZVKHoudmwsaW5pdC5nbG9iYWxTdGF0ZS5OMC5qTykKIGlmKGluaXQuZ2xvYmFsU3RhdGUuamk9PT0hMCYmIWUpaWYoaW5pdC5nbG9iYWxTdGF0ZS5FRj09PSEwKXt3PWluaXQuZ2xvYmFsU3RhdGUucmoKIHY9SC50MChQLkVGKFsiY29tbWFuZCIsInNwYXduLXdvcmtlciIsImZ1bmN0aW9uTmFtZSIsYSwiYXJncyIsYywibXNnIixkLCJ1cmkiLGIsImlzU3Bhd25VcmkiLGYsInN0YXJ0UGF1c2VkIixnLCJyZXBseVBvcnQiLHhdLG51bGwsbnVsbCkpCiB3LnRvU3RyaW5nCiBzZWxmLnBvc3RNZXNzYWdlKHYpfWVsc2V7aWYoYj09bnVsbCliPSQuWnQoKQogdT1uZXcgV29ya2VyKGIpCi11Lm9uZXJyb3I9ZnVuY3Rpb24oaCxpLGope3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gaChrLGksail9fShILkdBLGIsbmV3IEgudFooeSkpCit1Lm9uZXJyb3I9ZnVuY3Rpb24oaCxpLGope3JldHVybiBmdW5jdGlvbihrKXtyZXR1cm4gaChrLGksail9fShILkdBLGIsbmV3IEguV0soeSkpCiB1Lm9ubWVzc2FnZT1mdW5jdGlvbihoLGkpe3JldHVybiBmdW5jdGlvbihqKXtqLm9uZXJyb3I9bnVsbAogcmV0dXJuIGgoaSxqKX19KEgudUssdSkKIHc9aW5pdC5nbG9iYWxTdGF0ZS5ZNysrCkBAIC02ODAsMjMgKzY5NiwyMyBAQAogcmV0dXJuIHouWm8oYSl9ZWxzZXt6PW5ldyBILmZMKG5ldyBILmN4KCkpCiB6Lm1SPW5ldyBILm0zKG51bGwpCiByZXR1cm4gei5abyhhKX19LAotSGg6ZnVuY3Rpb24oYSl7aWYoaW5pdC5nbG9iYWxTdGF0ZS5qaT09PSEwKXJldHVybiBuZXcgSC5CVihudWxsKS51ZyhhKQorYjA6ZnVuY3Rpb24oYSl7aWYoaW5pdC5nbG9iYWxTdGF0ZS5qaT09PSEwKXJldHVybiBuZXcgSC5CVihudWxsKS51ZyhhKQogZWxzZSByZXR1cm4gYX0sCiB2TTpmdW5jdGlvbihhKXtyZXR1cm4gYT09bnVsbHx8dHlwZW9mIGE9PT0ic3RyaW5nInx8dHlwZW9mIGE9PT0ibnVtYmVyInx8dHlwZW9mIGE9PT0iYm9vbGVhbiJ9LAogWlI6ZnVuY3Rpb24oYSl7cmV0dXJuIGE9PW51bGx8fHR5cGVvZiBhPT09InN0cmluZyJ8fHR5cGVvZiBhPT09Im51bWJlciJ8fHR5cGVvZiBhPT09ImJvb2xlYW4ifSwKIFBLOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpmdW5jdGlvbigpe3RoaXMuYi4kMSh0aGlzLmEuYSl9LAogJGlzRUg6dHJ1ZX0sCiBKTzp7Ci0iXiI6IlRwOjcxO2EsYyIsCisiXiI6IlRwWjo3MjthLGMiLAogJDA6ZnVuY3Rpb24oKXt0aGlzLmMuJDIodGhpcy5hLmEsbnVsbCl9LAogJGlzRUg6dHJ1ZX0sCi1GVTp7Ci0iXiI6ImE7SGcsb0wsWTcsTjAsTnIsWHosZGEsRUYsamksaVI8LHJqLFhDLHcyPCIsCitwcTp7CisiXiI6ImE7SGcsTk8sWTcsTjAsTnIsWHosZGEsRUYsamksaVI8LHJqLFhDLHcyPCIsCiBxaTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej0kLk15KCk9PW51bGwKLXk9JC5ybSgpCit5PSQuRnYoKQogeD16JiYkLndCKCk9PT0hMAogdGhpcy5FRj14CiBpZigheCl5PXkhPW51bGwmJiQuWnQoKSE9bnVsbApAQCAtNzE1LDEzICs3MzEsMTMgQEAKICQuamsoKS5vbm1lc3NhZ2U9dwogJC5qaygpLmRhcnRQcmludD1mdW5jdGlvbihiKXt9fX19LAogYVg6ewotIl4iOiJhO2pPPixHeCxmVyxFbjwsRUU8LHVtLFBYLHhGPyxVRjwsQzk8LGx3LENOLE0yLG1mLHBhLGlyIiwKKyJeIjoiYTtqTz4sR3gsZlcsRW48LEVFPCx1bSxQWCx4Rj8sVUY8LEM5PCxsSixDTixNMixKaSxwYSxpciIsCiBvejpmdW5jdGlvbihhLGIpe2lmKCF0aGlzLnVtLm4oMCxhKSlyZXR1cm4KLWlmKHRoaXMubHcuaCgwLGIpJiYhdGhpcy5VRil0aGlzLlVGPSEwCitpZih0aGlzLmxKLmgoMCxiKSYmIXRoaXMuVUYpdGhpcy5VRj0hMAogdGhpcy5QQygpfSwKIE5SOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQogaWYoIXRoaXMuVUYpcmV0dXJuCi16PXRoaXMubHcKK3o9dGhpcy5sSgogei5SeigwLGEpCiBpZih6Llg1PT09MCl7Zm9yKHo9dGhpcy5DOTt5PXoubGVuZ3RoLHkhPT0wOyl7aWYoMD49eSlyZXR1cm4gSC5lKHosMCkKIHg9ei5wb3AoKQpAQCAtNzQ1LDcgKzc2MSw3IEBACiB0aGlzLnBhPWJ9LAogWkM6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PUoueChiKQotaWYoIXoubihiLDApKXk9ei5uKGIsMSkmJiF0aGlzLm1mCitpZighei5uKGIsMCkpeT16Lm4oYiwxKSYmIXRoaXMuSmkKIGVsc2UgeT0hMAogaWYoeSl7Si5INChhLG51bGwpCiByZXR1cm59eT1uZXcgSC5OWShhKQpAQCAtNzU3LDcgKzc3Myw3IEBACiBiYzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGlmKCF0aGlzLlBYLm4oMCxhKSlyZXR1cm4KIHo9Si54KGIpCi1pZighei5uKGIsMCkpeT16Lm4oYiwxKSYmIXRoaXMubWYKK2lmKCF6Lm4oYiwwKSl5PXoubihiLDEpJiYhdGhpcy5KaQogZWxzZSB5PSEwCiBpZih5KXt0aGlzLkRtKCkKIHJldHVybn1pZih6Lm4oYiwyKSl7ej1pbml0Lmdsb2JhbFN0YXRlLlh6CkBAIC03ODMsMTYgKzc5OSwxNiBAQAogaW5pdC5nbG9iYWxTdGF0ZS5OMD10aGlzCiAkPXRoaXMuRW4KIHk9bnVsbAotdGhpcy5tZj0hMAordGhpcy5KaT0hMAogdHJ5e3k9Yi4kMCgpfWNhdGNoKHYpe3U9SC5SdSh2KQogeD11CiB3PW5ldyBILlhPKHYsbnVsbCkKIHRoaXMuaGsoeCx3KQogaWYodGhpcy5wYT09PSEwKXt0aGlzLkRtKCkKLWlmKHRoaXM9PT1pbml0Lmdsb2JhbFN0YXRlLk5yKXRocm93IHZ9fWZpbmFsbHl7dGhpcy5tZj0hMQoraWYodGhpcz09PWluaXQuZ2xvYmFsU3RhdGUuTnIpdGhyb3cgdn19ZmluYWxseXt0aGlzLkppPSExCiBpbml0Lmdsb2JhbFN0YXRlLk4wPXoKIGlmKHohPW51bGwpJD16LmdFbigpCi1pZih0aGlzLk0yIT1udWxsKWZvcig7dT10aGlzLk0yLCF1LmdsMCh1KTspdGhpcy5NMi5BUigpLiQwKCl9cmV0dXJuIHl9LCIkMSIsImdabSIsMiwwLDcyLDczXSwKK2lmKHRoaXMuTTIhPW51bGwpZm9yKDt1PXRoaXMuTTIsIXUuZ2wwKHUpOyl0aGlzLk0yLkFSKCkuJDAoKX1yZXR1cm4geX0sIiQxIiwiZ1ptIiwyLDAsNzMsNzRdLAogRHM6ZnVuY3Rpb24oYSl7dmFyIHo9Si5VNihhKQogc3dpdGNoKHoudChhLDApKXtjYXNlInBhdXNlIjp0aGlzLm96KHoudChhLDEpLHoudChhLDIpKQogYnJlYWsKQEAgLTgyMSwxNyArODM3LDE3IEBACiBEbTpbZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMuTTIKIGlmKHohPW51bGwpei5WMSgwKQotZm9yKHo9dGhpcy5HeCx5PXouZ1VRKHopLHk9SC5WTShuZXcgSC5NSChudWxsLEoubVkoeS5sNikseS5UNiksW0guS3AoeSwwKSxILktwKHksMSldKTt5LkcoKTspeS5sby5wcigpCitmb3Ioej10aGlzLkd4LHk9ei5nVVEoeikseT1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh5Lmw2KSx5LlQ2KSxbSC5PcSh5LDApLEguT3EoeSwxKV0pO3kuRygpOyl5LmxvLnByKCkKIHouVjEoMCkKIHRoaXMuZlcuVjEoMCkKIGluaXQuZ2xvYmFsU3RhdGUuaVIuUnooMCx0aGlzLmpPKQogdGhpcy5pci5WMSgwKQogej10aGlzLkNOCi1pZih6IT1udWxsKXtmb3Ioej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KUouSDQoei5sbyxudWxsKQoraWYoeiE9bnVsbCl7Zm9yKHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOylKLkg0KHoubG8sbnVsbCkKIHRoaXMuQ049bnVsbH19LCIkMCIsImdJbSIsMCwwLDE4XSwKICRpc2FYOnRydWV9LAogTlk6ewotIl4iOiJUcDoxODthIiwKKyJeIjoiVHBaOjE4O2EiLAogJDA6W2Z1bmN0aW9uKCl7Si5INCh0aGlzLmEsbnVsbCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBjQzp7CkBAIC04NjAsNyArODc2LDcgQEAKIHcudG9TdHJpbmcKIHNlbGYucG9zdE1lc3NhZ2Uodil9fX0sCiBSbTp7Ci0iXiI6IlRwOjE4O2EiLAorIl4iOiJUcFo6MTg7YSIsCiAkMDpbZnVuY3Rpb24oKXtpZighdGhpcy5hLnhCKCkpcmV0dXJuCiBQLnJUKEMubnksdGhpcyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCkBAIC04NzIsMzcgKzg4OCwzNyBAQAogSW46ewogIl4iOiJhOyJ9LAoga2I6ewotIl4iOiJUcDo3MTthLGIsYyxkLGUsZiIsCisiXiI6IlRwWjo3MjthLGIsYyxkLGUsZiIsCiAkMDpbZnVuY3Rpb24oKXtILkRpKHRoaXMuYSx0aGlzLmIsdGhpcy5jLHRoaXMuZCx0aGlzLmUsdGhpcy5mKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLW1OOnsKLSJeIjoiVHA6MTM7VUkiLAotJDE6W2Z1bmN0aW9uKGEpe0ouSDQodGhpcy5VSSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDc0LCJjYWxsIl0sCi0kaXNFSDp0cnVlfSwKIHhuOnsKLSJeIjoiVHA6NTtiSyIsCi0kMTpbZnVuY3Rpb24oYSl7Si5INCh0aGlzLmJLLFsic3Bhd24gZmFpbGVkIixhXSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw3NSwiY2FsbCJdLAorIl4iOiJUcFo6MTM7VUkiLAorJDE6W2Z1bmN0aW9uKGEpe0ouSDQodGhpcy5VSSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDc1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLVdLOnsKLSJeIjoiVHA6MTM7YSIsCitqbDM6eworIl4iOiJUcFo6NTtiSyIsCiskMTpbZnVuY3Rpb24oYSl7Si5INCh0aGlzLmJLLFsic3Bhd24gZmFpbGVkIixhXSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw3NiwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCit5azp7CisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PUouVTYoYSkKIHk9dGhpcy5hCiBpZihKLnhDKHoudChhLDApLCJzcGF3bmVkIikpe3o9eS5NTQogaWYoei5HdiE9PTApSC52aChQLncoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQotei5PSChhKX1lbHNlIHkucG0oei50KGEsMSkpfSwiJDEiLG51bGwsMiwwLG51bGwsNzQsImNhbGwiXSwKK3ouT0goYSl9ZWxzZSB5LnBtKHoudChhLDEpKX0sIiQxIixudWxsLDIsMCxudWxsLDc1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLXRaOnsKLSJeIjoiVHA6NTtiIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iLnBtKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsNzYsImNhbGwiXSwKK1dLOnsKKyJeIjoiVHBaOjU7YiIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYi5wbShhKX0sIiQxIixudWxsLDIsMCxudWxsLDc3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGhJOnsKLSJeIjoiVHA6NzE7YSxiLGMsZCxlIiwKKyJeIjoiVHBaOjcyO2EsYixjLGQsZSIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmEKIEguRGkoaW5pdC5nbG9iYWxGdW5jdGlvbnNbdGhpcy5iXSgpLHouYSx6LmIsdGhpcy5jLHRoaXMuZCx0aGlzLmUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdks6ewotIl4iOiJUcDoxODthLGIsYyxkLGUiLAorIl4iOiJUcFo6MTg7YSxiLGMsZCxlIiwKICQwOltmdW5jdGlvbigpe3ZhciB6LHkseAogdGhpcy5lLnN4RighMCkKIGlmKHRoaXMuZCE9PSEwKXRoaXMuYS4kMSh0aGlzLmMpCkBAIC05MTcsNyArOTMzLDcgQEAKIEl5NDp7CiAiXiI6ImE7IiwKICRpc3BXOnRydWUsCi0kaXNYWTp0cnVlfSwKKyRpc2hxOnRydWV9LAogVlU6ewogIl4iOiJJeTQ7SkUsdHYiLAogd1I6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CkBAIC05MzksMTMgKzk1NSwxMyBAQAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBKLmtpKHRoaXMuSkUpfSwKICRpc1ZVOnRydWUsCiAkaXNwVzp0cnVlLAotJGlzWFk6dHJ1ZX0sCiskaXNocTp0cnVlfSwKIFVhOnsKLSJeIjoiVHA6NzE7YSxiLGMiLAorIl4iOiJUcFo6NzI7YSxiLGMiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHoseQogej10aGlzLmIuSkUKIGlmKCF6LmdLUygpKXtpZih0aGlzLmMpe3k9dGhpcy5hCi15LmE9SC5IaCh5LmEpfUoubjAoeix0aGlzLmEuYSl9fSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKK3kuYT1ILmIwKHkuYSl9Si5uMCh6LHRoaXMuYS5hKX19LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBiTTp7CiAiXiI6Ikl5NDtaVSxidix0diIsCkBAIC05NjQsNyArOTgwLDcgQEAKIHJldHVybih6XnleeCk+Pj4wfSwKICRpc2JNOnRydWUsCiAkaXNwVzp0cnVlLAotJGlzWFk6dHJ1ZX0sCiskaXNocTp0cnVlfSwKIHlvOnsKICJeIjoiYTtxSz4sRDEsS1M8IiwKIHd5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkQxLiQxKGEpfSwKQEAgLTk5MiwxNCArMTAwOCwxNCBAQAogeUk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS1IoYSxudWxsLG51bGwsbnVsbCl9LAogeE86W2Z1bmN0aW9uKGEpe3RoaXMudmwueE8oMCkKIHRoaXMudFUueE8oMCl9LCIkMCIsImdRRiIsMCwwLDE4XSwKLVRMOmZ1bmN0aW9uKGEpe3ZhciB6PVAueDIodGhpcy5nUUYodGhpcyksbnVsbCxudWxsLG51bGwsITAsbnVsbCkKK1RMOmZ1bmN0aW9uKGEpe3ZhciB6PVAuSFQodGhpcy5nUUYodGhpcyksbnVsbCxudWxsLG51bGwsITAsbnVsbCkKIHRoaXMudFU9egogdGhpcy52bC5EMT16LmdodCh6KX0sCiAkYXN3UzpmdW5jdGlvbigpe3JldHVybltudWxsXX0sCiAkaXN3Uzp0cnVlfSwKIFJTOnsKLSJeIjoialAxO0FvLG1SIiwKLURFOmZ1bmN0aW9uKGEpe2lmKCEhYS4kaXNWVSlyZXR1cm5bInNlbmRwb3J0Iixpbml0Lmdsb2JhbFN0YXRlLm9MLGEudHYsSi5raShhLkpFKV0KKyJeIjoiaHo7QW8sbVIiLAorREU6ZnVuY3Rpb24oYSl7aWYoISFhLiRpc1ZVKXJldHVyblsic2VuZHBvcnQiLGluaXQuZ2xvYmFsU3RhdGUuTk8sYS50dixKLmtpKGEuSkUpXQogaWYoISFhLiRpc2JNKXJldHVyblsic2VuZHBvcnQiLGEuWlUsYS50dixhLmJ2XQogdGhyb3cgSC5iKCJJbGxlZ2FsIHVuZGVybHlpbmcgcG9ydCAiK2EuYnUoMCkpfSwKIHlmOmZ1bmN0aW9uKGEpe2lmKCEhYS4kaXNpVilyZXR1cm5bImNhcGFiaWxpdHkiLGEucUtdCkBAIC0xMDE4LDIyICsxMDM0LDIyIEBACiB5PXoudChhLDEpCiB4PXoudChhLDIpCiB3PXoudChhLDMpCi1pZihKLnhDKHksaW5pdC5nbG9iYWxTdGF0ZS5vTCkpe3Y9aW5pdC5nbG9iYWxTdGF0ZS5pUi50KDAseCkKK2lmKEoueEMoeSxpbml0Lmdsb2JhbFN0YXRlLk5PKSl7dj1pbml0Lmdsb2JhbFN0YXRlLmlSLnQoMCx4KQogaWYodj09bnVsbClyZXR1cm4KIHU9di5oVih3KQogaWYodT09bnVsbClyZXR1cm4KIHJldHVybiBuZXcgSC5WVSh1LHgpfWVsc2UgcmV0dXJuIG5ldyBILmJNKHksdyx4KX0sCiBPcDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEguaVYoSi5VUShhLDEpKX19LAogbTM6ewotIl4iOiJhO01EIiwKKyJeIjoiYTt1NSIsCiB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuX19NZXNzYWdlVHJhdmVyc2VyX19hdHRhY2hlZF9pbmZvX199LAotdTpmdW5jdGlvbihhLGIsYyl7dGhpcy5NRC5wdXNoKGIpCit1OmZ1bmN0aW9uKGEsYixjKXt0aGlzLnU1LnB1c2goYikKIGIuX19NZXNzYWdlVHJhdmVyc2VyX19hdHRhY2hlZF9pbmZvX189Y30sCi1DSDpmdW5jdGlvbihhKXt0aGlzLk1EPVtdfSwKK0NIOmZ1bmN0aW9uKGEpe3RoaXMudTU9W119LAogbm86ZnVuY3Rpb24oKXt2YXIgeix5LHgKLWZvcih6PXRoaXMuTUQubGVuZ3RoLHk9MDt5PHo7Kyt5KXt4PXRoaXMuTUQKK2Zvcih6PXRoaXMudTUubGVuZ3RoLHk9MDt5PHo7Kyt5KXt4PXRoaXMudTUKIGlmKHk+PXgubGVuZ3RoKXJldHVybiBILmUoeCx5KQoteFt5XS5fX01lc3NhZ2VUcmF2ZXJzZXJfX2F0dGFjaGVkX2luZm9fXz1udWxsfXRoaXMuTUQ9bnVsbH19LAoreFt5XS5fX01lc3NhZ2VUcmF2ZXJzZXJfX2F0dGFjaGVkX2luZm9fXz1udWxsfXRoaXMudTU9bnVsbH19LAogY3g6ewogIl4iOiJhOyIsCiB0OmZ1bmN0aW9uKGEsYil7cmV0dXJufSwKQEAgLTEwNTMsNyArMTA2OSw3IEBACiBpZighIXouJGlzV08pcmV0dXJuIHRoaXMud2IoYSkKIGlmKCEhei4kaXNaMClyZXR1cm4gdGhpcy5USShhKQogaWYoISF6LiRpc3BXKXJldHVybiB0aGlzLkRFKGEpCi1pZighIXouJGlzWFkpcmV0dXJuIHRoaXMueWYoYSkKK2lmKCEhei4kaXNocSlyZXR1cm4gdGhpcy55ZihhKQogcmV0dXJuIHRoaXMuTjEoYSl9LAogTjE6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKCJNZXNzYWdlIHNlcmlhbGl6YXRpb246IElsbGVnYWwgdmFsdWUgIitILmQoYSkrIiBwYXNzZWQiKX19LAogb295OnsKQEAgLTEwODIsMTEgKzEwOTgsMTEgQEAKIERFOmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuU1kobnVsbCkpfSwKIHlmOmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuU1kobnVsbCkpfX0sCiBSSzp7Ci0iXiI6IlRwOjc5O2EsYiIsCisiXiI6IlRwWjo4MDthLGIiLAogJDI6W2Z1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5iCi1KLmtXKHRoaXMuYS5hLHouUTkoYSksei5ROShiKSl9LCIkMiIsbnVsbCw0LDAsbnVsbCw3Nyw3OCwiY2FsbCJdLAorSi5rVyh0aGlzLmEuYSx6LlE5KGEpLHouUTkoYikpfSwiJDIiLG51bGwsNCwwLG51bGwsNzgsNzksImNhbGwiXSwKICRpc0VIOnRydWV9LAotalAxOnsKK2h6OnsKICJeIjoiQkI7IiwKIFBxOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKIHdiOmZ1bmN0aW9uKGEpe3ZhciB6LHkKQEAgLTExNzUsMTIgKzExOTEsMTIgQEAKIHouUWEoYSxiKQogcmV0dXJuIHp9fX0sCiBBdjp7Ci0iXiI6IlRwOjE4O2EsYiIsCisiXiI6IlRwWjoxODthLGIiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5hLnA5PW51bGwKIHRoaXMuYi4kMCgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdnQ6ewotIl4iOiJUcDoxODtjLGQiLAorIl4iOiJUcFo6MTg7YyxkIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYy5wOT1udWxsCiBILmN2KCkKIHRoaXMuZC4kMCgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKQEAgLTEyMDUsNyArMTIyMSw3IEBACiB5PWIucUsKIHJldHVybiB6PT1udWxsP3k9PW51bGw6ej09PXl9cmV0dXJuITF9LAogJGlzaVY6dHJ1ZSwKLSRpc1hZOnRydWV9fV0sWyJfanNfaGVscGVyIiwiZGFydDpfanNfaGVscGVyIiwsSCx7CiskaXNocTp0cnVlfX1dLFsiX2pzX2hlbHBlciIsImRhcnQ6X2pzX2hlbHBlciIsLEgsewogIl4iOiIiLAogR3A6ZnVuY3Rpb24oYSxiKXt2YXIgegogaWYoYiE9bnVsbCl7ej1iLngKQEAgLTEyNjIsMzAgKzEyNzgsMzAgQEAKIGlmKHR5cGVvZiB5PT09InN0cmluZyIpej0vXlx3KyQvLnRlc3QoeSk/eTp6fWlmKHoubGVuZ3RoPjEmJkMueEIuaih6LDApPT09MzYpej1DLnhCLnluKHosMSkKIHJldHVybih6K0guaWEoSC5vWChhKSwwLG51bGwpKS5yZXBsYWNlKC9bXjwsPiBdKy9nLGZ1bmN0aW9uKGIpe3JldHVybiBpbml0Lm1hbmdsZWRHbG9iYWxOYW1lc1tiXXx8Yn0pfSwKIGE1OmZ1bmN0aW9uKGEpe3JldHVybiJJbnN0YW5jZSBvZiAnIitILmxoKGEpKyInIn0sCi1NczpmdW5jdGlvbigpe2lmKHR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3chPT1udWxsKXt2YXIgej13aW5kb3cucGVyZm9ybWFuY2UKK0FvOmZ1bmN0aW9uKCl7aWYodHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdyE9PW51bGwpe3ZhciB6PXdpbmRvdy5wZXJmb3JtYW5jZQogaWYoeiE9bnVsbCYmdHlwZW9mIHoud2Via2l0Tm93PT0iZnVuY3Rpb24iKXJldHVybiBDLkNELnl1KE1hdGguZmxvb3IoMTAwMCp6LndlYmtpdE5vdygpKSl9cmV0dXJuIDEwMDAqRGF0ZS5ub3coKX0sCi1DYjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKK1JGOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQogej1hLmxlbmd0aAogZm9yKHk9ejw9NTAwLHg9IiIsdz0wO3c8ejt3Kz01MDApe2lmKHkpdj1hCiBlbHNle3U9dys1MDAKIHU9dTx6P3U6egogdj1hLnNsaWNlKHcsdSl9eCs9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHYpfXJldHVybiB4fSwKLVlGOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAorWFo6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PVtdCiB6LiRidWlsdGluVHlwZUluZm89W1AuS05dCiB5PW5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKQoteS4kYnVpbHRpblR5cGVJbmZvPVtILktwKGEsMCldCit5LiRidWlsdGluVHlwZUluZm89W0guT3EoYSwwKV0KIGZvcig7eS5HKCk7KXt4PXkubG8KIGlmKHR5cGVvZiB4IT09Im51bWJlciJ8fE1hdGguZmxvb3IoeCkhPT14KXRocm93IEguYihQLnUoeCkpCiBpZih4PD02NTUzNSl6LnB1c2goeCkKIGVsc2UgaWYoeDw9MTExNDExMSl7ei5wdXNoKDU1Mjk2KyhDLmpuLkdHKHgtNjU1MzYsMTApJjEwMjMpKQotei5wdXNoKDU2MzIwKyh4JjEwMjMpKX1lbHNlIHRocm93IEguYihQLnUoeCkpfXJldHVybiBILkNiKHopfSwKK3oucHVzaCg1NjMyMCsoeCYxMDIzKSl9ZWxzZSB0aHJvdyBILmIoUC51KHgpKX1yZXR1cm4gSC5SRih6KX0sCiBMWTpmdW5jdGlvbihhKXt2YXIgeix5Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5LcChhLDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILk9xKGEsMCldKTt6LkcoKTspe3k9ei5sbwogaWYodHlwZW9mIHkhPT0ibnVtYmVyInx8TWF0aC5mbG9vcih5KSE9PXkpdGhyb3cgSC5iKFAudSh5KSkKIGlmKHk8MCl0aHJvdyBILmIoUC51KHkpKQotaWYoeT42NTUzNSlyZXR1cm4gSC5ZRihhKX1yZXR1cm4gSC5DYihhKX0sCi1KTTpmdW5jdGlvbihhKXt2YXIgegoraWYoeT42NTUzNSlyZXR1cm4gSC5YWihhKX1yZXR1cm4gSC5SRihhKX0sCitteDpmdW5jdGlvbihhKXt2YXIgegogaWYodHlwZW9mIGEhPT0ibnVtYmVyIilyZXR1cm4gSC5zKGEpCiBpZigwPD1hKXtpZihhPD02NTUzNSlyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhKQogaWYoYTw9MTExNDExMSl7ej1hLTY1NTM2CkBAIC0xMjk3LDcgKzEzMTMsNyBAQAogaWYodHlwZW9mIGQhPT0ibnVtYmVyInx8TWF0aC5mbG9vcihkKSE9PWQpSC52aChQLnUoZCkpCiBpZih0eXBlb2YgZSE9PSJudW1iZXIifHxNYXRoLmZsb29yKGUpIT09ZSlILnZoKFAudShlKSkKIGlmKHR5cGVvZiBmIT09Im51bWJlciJ8fE1hdGguZmxvb3IoZikhPT1mKUgudmgoUC51KGYpKQotej1KLmJJKGIsMSkKK3o9Si5IbihiLDEpCiB5PWg/RGF0ZS5VVEMoYSx6LGMsZCxlLGYsZyk6bmV3IERhdGUoYSx6LGMsZCxlLGYsZykudmFsdWVPZigpCiBpZihpc05hTih5KXx8eTwtODY0MDAwMDAwMDAwMDAwMHx8eT44NjQwMDAwMDAwMDAwMDAwKXRocm93IEguYihQLnUobnVsbCkpCiB4PUouV3goYSkKQEAgLTEzNzQsNyArMTM5MCw3IEBACiBwPSQuVzYoKQogJC5CaSgpCiBvPSQuZUEoKQotbj0kLmtvKCkKK249JC5xSygpCiBtPXYucVMoeSkKIGlmKG0hPW51bGwpcmV0dXJuIHouJDEoSC5UMyh5LG0pKQogZWxzZXttPXUucVMoeSkKQEAgLTEzOTEsNyArMTQwNyw3IEBACiBpZih2KXt2PW09PW51bGw/bnVsbDptLm1ldGhvZAogcmV0dXJuIHouJDEobmV3IEguWm8oeSx2KSl9fX12PXR5cGVvZiB5PT09InN0cmluZyI/eToiIgogcmV0dXJuIHouJDEobmV3IEgudlYodikpfWlmKGEgaW5zdGFuY2VvZiBSYW5nZUVycm9yKXtpZih0eXBlb2YgeT09PSJzdHJpbmciJiZ5LmluZGV4T2YoImNhbGwgc3RhY2siKSE9PS0xKXJldHVybiBuZXcgUC5LWSgpCi1yZXR1cm4gei4kMShuZXcgUC5BVChudWxsKSl9aWYodHlwZW9mIEludGVybmFsRXJyb3I9PSJmdW5jdGlvbiImJmEgaW5zdGFuY2VvZiBJbnRlcm5hbEVycm9yKWlmKHR5cGVvZiB5PT09InN0cmluZyImJnk9PT0idG9vIG11Y2ggcmVjdXJzaW9uIilyZXR1cm4gbmV3IFAuS1koKQorcmV0dXJuIHouJDEobmV3IFAuT1kobnVsbCkpfWlmKHR5cGVvZiBJbnRlcm5hbEVycm9yPT0iZnVuY3Rpb24iJiZhIGluc3RhbmNlb2YgSW50ZXJuYWxFcnJvcilpZih0eXBlb2YgeT09PSJzdHJpbmciJiZ5PT09InRvbyBtdWNoIHJlY3Vyc2lvbiIpcmV0dXJuIG5ldyBQLktZKCkKIHJldHVybiBhfSwKIENVOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGx8fHR5cGVvZiBhIT0nb2JqZWN0JylyZXR1cm4gSi52MShhKQogZWxzZSByZXR1cm4gSC5lUShhKX0sCkBAIC0xNDMxLDcgKzE0NDcsNyBAQAogdi5wcm90b3R5cGU9dwogdT0hZAogaWYodSl7dD1lLmxlbmd0aD09MSYmITAKLXM9SC5TRChhLHosdCkKK3M9SC5ieChhLHosdCkKIHMuJHJlZmxlY3Rpb25JbmZvPWN9ZWxzZXt3LiRuYW1lPWYKIHM9egogdD0hMX1pZih0eXBlb2YgeD09Im51bWJlciIpcj1mdW5jdGlvbihnKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaW5pdC5tZXRhZGF0YVtnXX19KHgpCkBAIC0xNDQxLDcgKzE0NTcsNyBAQAogd1t5XT1zCiBmb3IodT1iLmxlbmd0aCxwPTE7cDx1OysrcCl7bz1iW3BdCiBuPW8uJGNhbGxOYW1lCi1pZihuIT1udWxsKXttPWQ/bzpILlNEKGEsbyx0KQoraWYobiE9bnVsbCl7bT1kP286SC5ieChhLG8sdCkKIHdbbl09bX19d1siY2FsbCoiXT1zCiByZXR1cm4gdn0sCiB2cTpmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1ILnVqCkBAIC0xNDUyLDcgKzE0NjgsNyBAQAogY2FzZSA0OnJldHVybiBmdW5jdGlvbihlLGYpe3JldHVybiBmdW5jdGlvbihnLGgsaSxqKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqKX19KGMseikKIGNhc2UgNTpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGksaixrKXtyZXR1cm4gZih0aGlzKVtlXShnLGgsaSxqLGspfX0oYyx6KQogZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseShmKHRoaXMpLGFyZ3VtZW50cyl9fShkLHopfX0sCi1TRDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1CitieDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1CiBpZihjKXJldHVybiBILkhmKGEsYikKIHo9Yi4kc3R1Yk5hbWUKIHk9Yi5sZW5ndGgKQEAgLTE0NjAsMTkgKzE0NzYsMTkgQEAKIHc9Yj09bnVsbD94PT1udWxsOmI9PT14CiBpZih0eXBlb2YgZGFydF9wcmVjb21waWxlZD09ImZ1bmN0aW9uInx8IXd8fHk+PTI3KXJldHVybiBILnZxKHksIXcseixiKQogaWYoeT09PTApe3c9JC5iZgotaWYodz09bnVsbCl7dz1ILkIzKCJzZWxmIikKK2lmKHc9PW51bGwpe3c9SC5iZCgic2VsZiIpCiAkLmJmPXd9dz0icmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuIitILmQodykrIi4iK0guZCh6KSsiKCk7Igogdj0kLk9LCiAkLk9LPUouZXcodiwxKQogcmV0dXJuIG5ldyBGdW5jdGlvbih3K0guZCh2KSsifSIpKCl9dT0iYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLnNwbGl0KCIiKS5zcGxpY2UoMCx5KS5qb2luKCIsIikKIHc9InJldHVybiBmdW5jdGlvbigiK3UrIil7cmV0dXJuIHRoaXMuIgogdj0kLmJmCi1pZih2PT1udWxsKXt2PUguQjMoInNlbGYiKQoraWYodj09bnVsbCl7dj1ILmJkKCJzZWxmIikKICQuYmY9dn12PXcrSC5kKHYpKyIuIitILmQoeikrIigiK3UrIik7Igogdz0kLk9LCiAkLk9LPUouZXcodywxKQogcmV0dXJuIG5ldyBGdW5jdGlvbih2K0guZCh3KSsifSIpKCl9LAotWnE6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseQorcm06ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseQogej1ILnVqCiB5PUguSFkKIHN3aXRjaChiPy0xOmEpe2Nhc2UgMDp0aHJvdyBILmIoSC5ZaSgiSW50ZXJjZXB0ZWQgZnVuY3Rpb24gd2l0aCBubyBhcmd1bWVudHMuIikpCkBAIC0xNDg4LDEzICsxNTA0LDEzIEBACiBIZjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9SC5iTygpCiB5PSQuVTkKLWlmKHk9PW51bGwpe3k9SC5CMygicmVjZWl2ZXIiKQoraWYoeT09bnVsbCl7eT1ILmJkKCJyZWNlaXZlciIpCiAkLlU5PXl9eD1iLiRzdHViTmFtZQogdz1iLmxlbmd0aAogdj10eXBlb2YgZGFydF9wcmVjb21waWxlZD09ImZ1bmN0aW9uIgogdT1hW3hdCiB0PWI9PW51bGw/dT09bnVsbDpiPT09dQotaWYodnx8IXR8fHc+PTI4KXJldHVybiBILlpxKHcsIXQseCxiKQoraWYodnx8IXR8fHc+PTI4KXJldHVybiBILnJtKHcsIXQseCxiKQogaWYodz09PTEpe3k9InJldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLiIrSC5kKHopKyIuIitILmQoeCkrIih0aGlzLiIrSC5kKHkpKyIpOyIKIHQ9JC5PSwogJC5PSz1KLmV3KHQsMSkKQEAgLTE1MTYsOCArMTUzMiw4IEBACiBhZzpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5tRSgiQ3ljbGljIGluaXRpYWxpemF0aW9uIGZvciBzdGF0aWMgIitILmQoYSkpKX0sCiBLVDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBILkdOKGEsYixjLG51bGwpfSwKIE9nOmZ1bmN0aW9uKGEsYil7dmFyIHo9YS5uYW1lCi1pZihiPT1udWxsfHxiLmxlbmd0aD09PTApcmV0dXJuIG5ldyBILkZwKHopCi1yZXR1cm4gbmV3IEguS0VBKHosYixudWxsKX0sCitpZihiPT1udWxsfHxiLmxlbmd0aD09PTApcmV0dXJuIG5ldyBILnR1KHopCityZXR1cm4gbmV3IEguZncoeixiLG51bGwpfSwKIEczOmZ1bmN0aW9uKCl7cmV0dXJuIEMuS1p9LAogSUw6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmN1KGEsbnVsbCl9LAogVk06ZnVuY3Rpb24oYSxiKXtpZihhIT1udWxsKWEuJGJ1aWx0aW5UeXBlSW5mbz1iCkBAIC0xNTI3LDcgKzE1NDMsNyBAQAogSU06ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5ZOShhWyIkYXMiK0guZChiKV0sSC5vWChhKSl9LAogaXA6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6PUguSU0oYSxiKQogcmV0dXJuIHo9PW51bGw/bnVsbDp6W2NdfSwKLUtwOmZ1bmN0aW9uKGEsYil7dmFyIHo9SC5vWChhKQorT3E6ZnVuY3Rpb24oYSxiKXt2YXIgej1ILm9YKGEpCiByZXR1cm4gej09bnVsbD9udWxsOnpbYl19LAogS286ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiJkeW5hbWljIgogZWxzZSBpZih0eXBlb2YgYT09PSJvYmplY3QiJiZhIT09bnVsbCYmYS5jb25zdHJ1Y3Rvcj09PUFycmF5KXJldHVybiBhWzBdLmJ1aWx0aW4kY2xzK0guaWEoYSwxLGIpCkBAIC0xNTQzLDcgKzE1NTksNyBAQAogaWYodiE9bnVsbCl3PSExCiB1PUguS28odixjKQogei52TSs9dHlwZW9mIHU9PT0ic3RyaW5nIj91OkguZCh1KX1yZXR1cm4gdz8iIjoiPCIrSC5kKHopKyI+In0sCi1iNzpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkuY29uc3RydWN0b3IuYnVpbHRpbiRjbHMKK3dPOmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKS5jb25zdHJ1Y3Rvci5idWlsdGluJGNscwogaWYoYT09bnVsbClyZXR1cm4gegogcmV0dXJuIHorSC5pYShhLiRidWlsdGluVHlwZUluZm8sMCxudWxsKX0sCiBZOTpmdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT09Im9iamVjdCImJmEhPT1udWxsJiZhLmNvbnN0cnVjdG9yPT09QXJyYXkpYj1hCkBAIC0xNzIxLDcgKzE3MzcsNyBAQAogZWxzZXt6PUoueChiKQogaWYoISF6LiRpc1ZSKXt6PUMueEIueW4oYSxjKQogeT1iLkVqCi1yZXR1cm4geS50ZXN0KHopfWVsc2UgcmV0dXJuIEoueXgoei5kZChiLEMueEIueW4oYSxjKSkpfX0sCityZXR1cm4geS50ZXN0KHopfWVsc2UgcmV0dXJuIEoucE8oei5kZChiLEMueEIueW4oYSxjKSkpfX0sCiB5czpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcKIGlmKGI9PT0iIilpZihhPT09IiIpcmV0dXJuIGMKIGVsc2V7ej1QLnA5KCIiKQpAQCAtMTczNCw3ICsxNzUwLDcgQEAKICJeIjoiYTsiLAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhDKHRoaXMuZ0IodGhpcyksMCl9LAogZ29yOmZ1bmN0aW9uKGEpe3JldHVybiFKLnhDKHRoaXMuZ0IodGhpcyksMCl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBFUDpmdW5jdGlvbigpe3Rocm93IEguYihQLmYoIkNhbm5vdCBtb2RpZnkgdW5tb2RpZmlhYmxlIE1hcCIpKX0sCiB1OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5FUCgpfSwKIFJ6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuRVAoKX0sCkBAIC0xNzU0LDEyICsxNzcwLDEyIEBACiB6PXRoaXMudGMKIGZvcih5PTA7eTx6Lmxlbmd0aDsrK3kpe3g9elt5XQogYi4kMih4LHRoaXMuVFooeCkpfX0sCi1ndmM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IEguWFIodGhpcyksW0guS3AodGhpcywwKV0pfSwKLWdVUTpmdW5jdGlvbihhKXtyZXR1cm4gSC5LMSh0aGlzLnRjLG5ldyBILmhZKHRoaXMpLEguS3AodGhpcywwKSxILktwKHRoaXMsMSkpfSwKK2d2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgSC5YUih0aGlzKSxbSC5PcSh0aGlzLDApXSl9LAorZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKHRoaXMudGMsbmV3IEguaFkodGhpcyksSC5PcSh0aGlzLDApLEguT3EodGhpcywxKSl9LAogJGlzeU46dHJ1ZX0sCiBoWTp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuVFooYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw3NywiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5UWihhKX0sIiQxIixudWxsLDIsMCxudWxsLDc4LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFhSOnsKICJeIjoibVc7WTMiLApAQCAtMTc3OSwxOCArMTc5NSwxOCBAQAogeC5maXhlZCRsZW5ndGg9ITAKIHJldHVybiB4fSwKIGdWbTpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYsdSx0LHMKLWlmKHRoaXMueEkhPT0wKXJldHVybiBQLkZsKFAuR0QsbnVsbCkKK2lmKHRoaXMueEkhPT0wKXJldHVybiBQLkZsKFAuSU4sbnVsbCkKIHo9dGhpcy5GWAogeT16Lmxlbmd0aAogeD10aGlzLnJxCiB3PXgubGVuZ3RoLXkKLWlmKHk9PT0wKXJldHVybiBQLkZsKFAuR0QsbnVsbCkKLXY9UC5MNShudWxsLG51bGwsbnVsbCxQLkdELG51bGwpCitpZih5PT09MClyZXR1cm4gUC5GbChQLklOLG51bGwpCit2PVAuTDUobnVsbCxudWxsLG51bGwsUC5JTixudWxsKQogZm9yKHU9MDt1PHk7Kyt1KXtpZih1Pj16Lmxlbmd0aClyZXR1cm4gSC5lKHosdSkKIHQ9elt1XQogcz13K3UKIGlmKHM8MHx8cz49eC5sZW5ndGgpcmV0dXJuIEguZSh4LHMpCi12LnUoMCxuZXcgSC5JTih0KSx4W3NdKX1yZXR1cm4gdn0sCit2LnUoMCxuZXcgSC50eCh0KSx4W3NdKX1yZXR1cm4gdn0sCiBzdGF0aWM6eyJeIjoiaEF3LGVIRixZOCJ9fSwKIEZEOnsKICJeIjoiYTttcixSbj4sWFosUnYsaEcsTW8sQU0sTkUiLApAQCAtMTgzMCw3ICsxODQ2LDcgQEAKIHg9elsxXQogcmV0dXJuIG5ldyBILkZEKGEseiwoeSYxKT09PTEseT4+MSx4Pj4xLCh4JjEpPT09MSx6WzJdLG51bGwpfX19LAogdVY6ewotIl4iOiJUcDo1O2EsYixjIiwKKyJeIjoiVHBaOjU7YSxiLGMiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PXRoaXMuYi5ORQogeT10aGlzLmEuYSsrCkBAIC0xODM5LDE0ICsxODU1LDE0IEBACiB6W3ldPXh9LAogJGlzRUg6dHJ1ZX0sCiBDajp7Ci0iXiI6IlRwOjgwO2EsYixjIiwKKyJeIjoiVHBaOjgxO2EsYixjIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5hCiB6LmI9ei5iKyIkIitILmQoYSkKIHRoaXMuYy5wdXNoKGEpCiB0aGlzLmIucHVzaChiKTsrK3ouYX0sCiAkaXNFSDp0cnVlfSwKIHU4OnsKLSJeIjoiVHA6ODA7YSxiIiwKKyJeIjoiVHBaOjgxO2EsYiIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYgogaWYoei54NCgwLGEpKXoudSgwLGEsYikKIGVsc2UgdGhpcy5hLmE9ITB9LApAQCAtMTg2OCw3ICsxODg0LDcgQEAKIHg9dGhpcy5jUgogaWYoeCE9PS0xKXkucmVjZWl2ZXI9elt4KzFdCiByZXR1cm4geX0sCi1zdGF0aWM6eyJeIjoibG0sazEsUmUsZk4scWksY3osQlgsdHQsZHQsQTciLGNNOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQorc3RhdGljOnsiXiI6ImxtLGsxLFJlLGZOLHFpLGN6LEJYLHR0LGR0LEFpIixjTTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKIGE9YS5yZXBsYWNlKFN0cmluZyh7fSksJyRyZWNlaXZlciQnKS5yZXBsYWNlKG5ldyBSZWdFeHAoIltbXFxde30oKSorPy5cXFxcXiR8XSIsJ2cnKSwnXFwkJicpCiB6PWEubWF0Y2goL1xcXCRbYS16QS1aXStcXFwkL2cpCiBpZih6PT1udWxsKXo9W10KQEAgLTE4ODEsMTkgKzE4OTcsMTkgQEAKIHRyeXskZXhwciQuJG1ldGhvZCQoJGFyZ3VtZW50c0V4cHIkKX1jYXRjaCh6KXtyZXR1cm4gei5tZXNzYWdlfX0oYSl9LE1qOmZ1bmN0aW9uKGEpe3JldHVybiBmdW5jdGlvbigkZXhwciQpe3RyeXskZXhwciQuJG1ldGhvZCR9Y2F0Y2goeil7cmV0dXJuIHoubWVzc2FnZX19KGEpfX19LAogWm86ewogIl4iOiJYUztLOSxHYSIsCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLkdhCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HYQogaWYoej09bnVsbClyZXR1cm4iTnVsbEVycm9yOiAiK0guZCh0aGlzLks5KQotcmV0dXJuIk51bGxFcnJvcjogQ2Fubm90IGNhbGwgXCIiK0guZCh6KSsiXCIgb24gbnVsbCJ9LAorcmV0dXJuIk51bGxFcnJvcjogQ2Fubm90IGNhbGwgXCIiK0guZCh6KSsiXCIgb24gbnVsbCJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0pTOnRydWUsCiAkaXNYUzp0cnVlfSwKIHUwOnsKICJeIjoiWFM7SzksR2EsY1IiLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5HYQogaWYoej09bnVsbClyZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6ICIrSC5kKHRoaXMuSzkpCiB5PXRoaXMuY1IKIGlmKHk9PW51bGwpcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBDYW5ub3QgY2FsbCBcIiIrSC5kKHopKyJcIiAoIitILmQodGhpcy5LOSkrIikiCi1yZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3I6IENhbm5vdCBjYWxsIFwiIitILmQoeikrIlwiIG9uIFwiIitILmQoeSkrIlwiICgiK0guZCh0aGlzLks5KSsiKSJ9LAorcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yOiBDYW5ub3QgY2FsbCBcIiIrSC5kKHopKyJcIiBvbiBcIiIrSC5kKHkpKyJcIiAoIitILmQodGhpcy5LOSkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNKUzp0cnVlLAogJGlzWFM6dHJ1ZSwKIHN0YXRpYzp7VDM6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CkBAIC0xOTAzLDUwICsxOTE5LDUwIEBACiByZXR1cm4gbmV3IEgudTAoYSx5LHopfX19LAogdlY6ewogIl4iOiJYUztLOSIsCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLks5Ci1yZXR1cm4gQy54Qi5nbDAoeik/IkVycm9yIjoiRXJyb3I6ICIren19LAorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuSzkKK3JldHVybiBDLnhCLmdsMCh6KT8iRXJyb3IiOiJFcnJvcjogIit6fSwiJDAiLCJnQVkiLDAsMCw2OV19LAogQW06ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7aWYoISFKLngoYSkuJGlzWFMpaWYoYS4kdGhyb3duSnNFcnJvcj09bnVsbClhLiR0aHJvd25Kc0Vycm9yPXRoaXMuYQogcmV0dXJuIGF9LAogJGlzRUg6dHJ1ZX0sCiBYTzp7CiAiXiI6ImE7bEEsdWkiLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy51aQogaWYoeiE9bnVsbClyZXR1cm4gegogej10aGlzLmxBCiB5PXR5cGVvZiB6PT09Im9iamVjdCI/ei5zdGFjazpudWxsCiB6PXk9PW51bGw/IiI6eQogdGhpcy51aT16Ci1yZXR1cm4gen19LAorcmV0dXJuIHp9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBkcjp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuJDAoKX0sCiAkaXNFSDp0cnVlfSwKIFRMOnsKLSJeIjoiVHA6NzE7YixjIiwKKyJeIjoiVHBaOjcyO2IsYyIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmIuJDEodGhpcy5jKX0sCiAkaXNFSDp0cnVlfSwKIHVaOnsKLSJeIjoiVHA6NzE7ZCxlLGYiLAorIl4iOiJUcFo6NzI7ZCxlLGYiLAogJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kLiQyKHRoaXMuZSx0aGlzLmYpfSwKICRpc0VIOnRydWV9LAogT1E6ewotIl4iOiJUcDo3MTtVSSxiSyxHcSxSbSIsCisiXiI6IlRwWjo3MjtVSSxiSyxHcSxSbSIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlVJLiQzKHRoaXMuYkssdGhpcy5HcSx0aGlzLlJtKX0sCiAkaXNFSDp0cnVlfSwKIFF4OnsKLSJeIjoiVHA6NzE7dzMsSFosbUcseEMsY2oiLAorIl4iOiJUcFo6NzI7dzMsSFosbUcseEMsY2oiLAogJDA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53My4kNCh0aGlzLkhaLHRoaXMubUcsdGhpcy54Qyx0aGlzLmNqKX0sCiAkaXNFSDp0cnVlfSwKLVRwOnsKK1RwWjp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJDbG9zdXJlIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIkNsb3N1cmUifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNFSDp0cnVlLAogZ0t1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSwKIEJwOnsKLSJeIjoiVHA7In0sCisiXiI6IlRwWjsifSwKIHY6ewogIl4iOiJCcDtudyxqbSxjUixSQSIsCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQpAQCAtMTk2MCw4ICsxOTc2LDggQEAKIHJldHVybiBKLlVOKHksSC5lUSh0aGlzLmptKSl9LAogJGlzdjp0cnVlLAogc3RhdGljOnsiXiI6ImJmLFU5Iix1ajpmdW5jdGlvbihhKXtyZXR1cm4gYS5ud30sSFk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY1J9LGJPOmZ1bmN0aW9uKCl7dmFyIHo9JC5iZgotaWYoej09bnVsbCl7ej1ILkIzKCJzZWxmIikKLSQuYmY9en1yZXR1cm4gen0sQjM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgoraWYoej09bnVsbCl7ej1ILmJkKCJzZWxmIikKKyQuYmY9en1yZXR1cm4gen0sYmQ6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1uZXcgSC52KCJzZWxmIiwidGFyZ2V0IiwicmVjZWl2ZXIiLCJuYW1lIikKIHk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoeikKIHkuZml4ZWQkbGVuZ3RoPWluaXQKQEAgLTE5NzAsMTIgKzE5ODYsMTIgQEAKIGlmKHpbdl09PT1hKXJldHVybiB2fX19fSwKIFBlOnsKICJeIjoiWFM7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkcxfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5HMX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzWFM6dHJ1ZSwKIHN0YXRpYzp7YXE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IEguUGUoIkNhc3RFcnJvcjogQ2FzdGluZyB2YWx1ZSBvZiB0eXBlICIrSC5kKGEpKyIgdG8gaW5jb21wYXRpYmxlIHR5cGUgIitILmQoYikpfX19LAogYmI6ewogIl4iOiJYUztHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlJ1bnRpbWVFcnJvcjogIitILmQodGhpcy5HMSl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJSdW50aW1lRXJyb3I6ICIrSC5kKHRoaXMuRzEpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e1lpOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5iYihhKX19fSwKIGxicDp7CiAiXiI6ImE7In0sCkBAIC0yMDAwLDcgKzIwMTYsNyBAQAogdj1ILmtVKHkpCiBmb3IoeD12Lmxlbmd0aCx1PTA7dTx4OysrdSl7dD12W3VdCiB3W3RdPXlbdF0uemEoKX16Lm5hbWVkPXd9cmV0dXJuIHp9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscworYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKIHo9dGhpcy5JcQogaWYoeiE9bnVsbClmb3IoeT16Lmxlbmd0aCx4PSIoIix3PSExLHY9MDt2PHk7Kyt2LHc9ITApe3U9elt2XQogaWYodyl4Kz0iLCAiCkBAIC0yMDE0LDcgKzIwMzAsNyBAQAogdD1ILmtVKHopCiBmb3IoeT10Lmxlbmd0aCx3PSExLHY9MDt2PHk7Kyt2LHc9ITApe3M9dFt2XQogaWYodyl4Kz0iLCAiCi14Kz1ILmQoeltzXS56YSgpKSsiICIrc314Kz0ifSJ9fXJldHVybiB4KygiKSAtPiAiK0guZCh0aGlzLmR3KSl9LAoreCs9SC5kKHpbc10uemEoKSkrIiAiK3N9eCs9In0ifX1yZXR1cm4geCsoIikgLT4gIitILmQodGhpcy5kdykpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6eyJeIjoibGNzIixEejpmdW5jdGlvbihhKXt2YXIgeix5LHgKIGE9YQogej1bXQpAQCAtMjAyMiwxOCArMjAzOCwxOCBAQAogcmV0dXJuIHp9fX0sCiBoSjp7CiAiXiI6ImxicDsiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuImR5bmFtaWMifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iZHluYW1pYyJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHphOmZ1bmN0aW9uKCl7cmV0dXJufSwKICRpc2hKOnRydWV9LAotRnA6ewordHU6ewogIl4iOiJsYnA7b2M+IiwKIHphOmZ1bmN0aW9uKCl7dmFyIHoseQogej10aGlzLm9jCiB5PWluaXQuYWxsQ2xhc3Nlc1t6XQogaWYoeT09bnVsbCl0aHJvdyBILmIoIm5vIHR5cGUgZm9yICciK0guZCh6KSsiJyIpCiByZXR1cm4geX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vY319LAotS0VBOnsKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vY30sIiQwIiwiZ0FZIiwwLDAsNjldfSwKK2Z3OnsKICJeIjoibGJwO29jPixyZSxFdCIsCiB6YTpmdW5jdGlvbigpe3ZhciB6LHkKIHo9dGhpcy5FdApAQCAtMjA0MiwzMyArMjA1OCwzMyBAQAogeT1baW5pdC5hbGxDbGFzc2VzW3pdXQogaWYoMD49eS5sZW5ndGgpcmV0dXJuIEguZSh5LDApCiBpZih5WzBdPT1udWxsKXRocm93IEguYigibm8gdHlwZSBmb3IgJyIrSC5kKHopKyI8Li4uPiciKQotZm9yKHo9dGhpcy5yZSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspeS5wdXNoKHoubG8uemEoKSkKK2Zvcih6PXRoaXMucmUsej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXkucHVzaCh6LmxvLnphKCkpCiB0aGlzLkV0PXkKIHJldHVybiB5fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5vYykrIjwiK0ouSWEodGhpcy5yZSwiLCAiKSsiPiJ9fSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMub2MpKyI8IitKLnVHKHRoaXMucmUsIiwgIikrIj4ifSwiJDAiLCJnQVkiLDAsMCw2OV19LAogY3U6ewogIl4iOiJhO0xVLGtlIiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6LHkKK2J1OltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMua2UKIGlmKHohPW51bGwpcmV0dXJuIHoKIHk9dGhpcy5MVS5yZXBsYWNlKC9bXjwsPiBdKy9nLGZ1bmN0aW9uKGIpe3JldHVybiBpbml0Lm1hbmdsZWRHbG9iYWxOYW1lc1tiXXx8Yn0pCiB0aGlzLmtlPXkKLXJldHVybiB5fSwKK3JldHVybiB5fSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEoudjEodGhpcy5MVSl9LAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKIHJldHVybiEhSi54KGIpLiRpc2N1JiZKLnhDKHRoaXMuTFUsYi5MVSl9LAogJGlzY3U6dHJ1ZSwKICRpc3VxOnRydWV9LAogZEM6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYShhKX0sCiAkaXNFSDp0cnVlfSwKIFZYOnsKLSJeIjoiVHA6ODE7YiIsCisiXiI6IlRwWjo4MjtiIiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYihhLGIpfSwKICRpc0VIOnRydWV9LAogcmg6ewotIl4iOiJUcDo1O2MiLAorIl4iOiJUcFo6NTtjIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmMoYSl9LAogJGlzRUg6dHJ1ZX0sCiBWUjp7CkBAIC0yMTY2LDcgKzIxODIsNyBAQAogJGlzbnM6dHJ1ZX19XSxbImFjdGlvbl9saW5rX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9hY3Rpb25fbGluay5kYXJ0IiwsWCx7CiAiXiI6IiIsCiBoVjp7Ci0iXiI6IkxQYztmaSxkQixLVyxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IkxQYztmaSxkQixLVyxBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBndjg6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZml9LAogc3Y4OmZ1bmN0aW9uKGEsYil7YS5maT10aGlzLmN0KGEsQy5TNCxhLmZpLGIpfSwKIGdGUjpmdW5jdGlvbihhKXtyZXR1cm4gYS5kQn0sCkBAIC0yMTc4LDcgKzIxOTQsNyBAQAogRjY6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6PWEuZmkKIGlmKHo9PT0hMClyZXR1cm4KIGlmKGEuZEIhPW51bGwpe2EuZmk9dGhpcy5jdChhLEMuUzQseiwhMCkKLXRoaXMuTFkoYSxudWxsKS5ZTShuZXcgWC5qRShhKSl9fSwiJDMiLCJnTmEiLDYsMCw4Miw0Niw0Nyw4M10sCit0aGlzLkxZKGEsbnVsbCkuWU0obmV3IFguakUoYSkpfX0sIiQzIiwiZ05hIiw2LDAsODMsNDYsNDcsODRdLAogc3RhdGljOnt6eTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCkBAIC0yMTg2LDEwICsyMjAyLDEwIEBACiBhLmZpPSExCiBhLmRCPW51bGwKIGEuS1c9ImFjdGlvbiIKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuRGYuWkwoYSkKIEMuRGYuWEkoYSkKQEAgLTIxOTgsNyArMjIxNCw3IEBACiAiXiI6InhjK1BpOyIsCiAkaXNkMzp0cnVlfSwKIGpFOnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYQogei5maT1KLlE1KHosQy5TNCx6LmZpLCExKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiYXBwIiwicGFja2FnZTpvYnNlcnZhdG9yeS9hcHAuZGFydCIsLEcsewpAQCAtMjIwOCwxMSArMjIyNCwxMSBAQAogej1KLlVRKEouVVEoJC5TaSgpLCJnb29nbGUiKSwidmlzdWFsaXphdGlvbiIpCiAkLkJZPXoKIHJldHVybiB6fSwiJDEiLCJ2TiIsMiwwLDEzLDE0XSwKLW9oOmZ1bmN0aW9uKGEpe3ZhciB6PSQuVnkoKS5nZXRJdGVtKGEpCitYazpmdW5jdGlvbihhKXt2YXIgej0kLlZ5KCkuZ2V0SXRlbShhKQogaWYoej09bnVsbClyZXR1cm4KIHJldHVybiBDLnhyLmtWKHopfSwKIEZJOmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIFAuVnUobnVsbCxudWxsLG51bGwpCi1yZXR1cm4gVy5LbigiL2NyZHB0YXJnZXRzLyIrUC5qVyhDLnlELGEsQy54TSwhMSksbnVsbCxudWxsKS5tbChuZXcgRy50eCgpKS5PQShuZXcgRy5LRigpKX0sCityZXR1cm4gVy5LbigiL2NyZHB0YXJnZXRzLyIrUC5qVyhDLnlELGEsQy54TSwhMSksbnVsbCxudWxsKS5tbChuZXcgRy5LRigpKS5PQShuZXcgRy5YTigpKX0sCiBkajpmdW5jdGlvbihhLGIpe3JldHVybiBDLkNELlN5KDEwMCpKLlg5KGEsYiksMikrIiUifSwKIG8xOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGZvcih6PSIiO2I+MTspey0tYgpAQCAtMjIyNCw3ICsyMjQwLDcgQEAKIGE9ei5aKGEsMTAwMCkKIHg9Ry5vMSh5LDMpCiBmb3IoO3o9Si5XeChhKSx6LkQoYSwxMDAwKTspe3g9Ry5vMSh6LlkoYSwxMDAwKSwzKSsiLCIreAotYT16LlooYSwxMDAwKX1yZXR1cm4hei5uKGEsMCk/SC5kKGEpKyIsIit4Onh9LCIkMSIsImtoIiwyLDAsMTVdLAorYT16LlooYSwxMDAwKX1yZXR1cm4hei5uKGEsMCk/SC5kKGEpKyIsIit4Onh9LCIkMSIsInhLIiwyLDAsMTVdLAogUDA6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9Qy5DRC55dShDLkNELlVEKGEqMTAwMCkpCiB5PUMuam4uY1UoeiwzNjAwMDAwKQpAQCAtMjI1Myw3ICsyMjY5LDcgQEAKIGlmKHghPT0wKXJldHVybiIiK3grIm0gIit3KyJzIgogcmV0dXJuIiIrdysicyJ9LAogbUw6ewotIl4iOiJQaTtjRSxHWixaNixFaCxtMjwsRWIsYm4sUHYsY0MsQVAsZm4iLAorIl4iOiJQaTtPSixFZixaNixFaCxtMjwsRWIsYm4sUHYsY0MsQVAsZm4iLAogZ3d2OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkVofSwKIHN3djpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihKLnhDKHRoaXMuRWgsYikpcmV0dXJuCkBAIC0yMjYzLDc0ICsyMjc5LDc4IEBACiBiLmdFSCgpLm1sKHRoaXMuZ3duKCkpCiBKLmQ3KGIpLm1sKHRoaXMuZ2txKCkpCiB6PWIuZ0cyKCkKLUguVk0obmV3IFAuSWsoeiksW0guS3AoeiwwKV0pLnlJKHRoaXMuZ2JmKCkpCitILlZNKG5ldyBQLklrKHopLFtILk9xKHosMCldKS55SSh0aGlzLmdiZigpKQogej1iLmdMaSgpCi1ILlZNKG5ldyBQLklrKHopLFtILktwKHosMCldKS55SSh0aGlzLmdYYSgpKX10aGlzLkVoPWJ9LAorSC5WTShuZXcgUC5Jayh6KSxbSC5PcSh6LDApXSkueUkodGhpcy5nWGEoKSl9dGhpcy5FaD1ifSwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5FYn0sCiBzb2Q6ZnVuY3Rpb24oYSxiKXt0aGlzLkViPUYuV2kodGhpcyxDLnJCLHRoaXMuRWIsYil9LAogZ3ZLOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY0N9LAogc3ZLOmZ1bmN0aW9uKGEpe3RoaXMuY0M9Ri5XaSh0aGlzLEMuYzYsdGhpcy5jQyxhKX0sCiBBUTpmdW5jdGlvbihhKXt2YXIgeix5Ci0kLm1mPXRoaXMKLXo9dGhpcy5jRQotei5wdXNoKG5ldyBHLkJBKHRoaXMsbnVsbCxudWxsLG51bGwpKQotei5wdXNoKG5ldyBHLkhTKHRoaXMsbnVsbCxudWxsLG51bGwpKQotei5wdXNoKG5ldyBHLmYyKHRoaXMsbnVsbCxudWxsLG51bGwpKQotei5wdXNoKG5ldyBHLmNaKHRoaXMsbnVsbCxudWxsLG51bGwpKQorJC5LaD10aGlzCit6PXRoaXMuT0oKK3oucHVzaChuZXcgRy50OSh0aGlzLG51bGwsbnVsbCxudWxsLG51bGwpKQorei5wdXNoKG5ldyBHLnY1KHRoaXMsbnVsbCxudWxsLG51bGwsbnVsbCkpCit6LnB1c2gobmV3IEcuU3kodGhpcyxudWxsLG51bGwsbnVsbCxudWxsKSkKK3oucHVzaChuZXcgRy5ieSh0aGlzLG51bGwsbnVsbCxudWxsLG51bGwpKQogej10aGlzLlo2CiB6LmVjPXRoaXMKIHk9SC5WTShuZXcgVy5STyh3aW5kb3csQy55Zi5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHkuREsseS5QaCxXLmFGKHouZ2JRKCkpLHkuU2cpLFtILktwKHksMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAseS5ESyx5LlBoLFcuYUYoei5nYlEoKSkseS5TZyksW0guT3EoeSwwKV0pLlp6KCkKIHouQ3koKX0sCi14MzpmdW5jdGlvbihhKXtKLnVZKHRoaXMuY0MsbmV3IEcuZHcoYSxuZXcgRy5jRSgpKSl9LAota2o6W2Z1bmN0aW9uKGEpe3RoaXMuUHY9YQotdGhpcy5vZygiZXJyb3IvIixudWxsKX0sIiQxIiwiZ2JmIiwyLDAsODQsMjRdLAoreDM6ZnVuY3Rpb24oYSl7Si5yQSh0aGlzLmNDLG5ldyBHLnhFKGEsbmV3IEcuY0UoKSkpfSwKK3lTOltmdW5jdGlvbihhKXt0aGlzLlB2PWEKK3RoaXMub2coImVycm9yLyIsbnVsbCl9LCIkMSIsImdiZiIsMiwwLDg1LDI0XSwKIGtJOltmdW5jdGlvbihhKXt0aGlzLlB2PWEKIGlmKEoueEMoSi5JeihhKSwiTmV0d29ya0V4Y2VwdGlvbiIpKXRoaXMuWjYuYm8oMCwiIy92bS1jb25uZWN0LyIpCi1lbHNlIHRoaXMub2coImVycm9yLyIsbnVsbCl9LCIkMSIsImdYYSIsMiwwLDg1LDg2XSwKLW9nOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4Ci1mb3Ioej10aGlzLmNFLHk9MDt5PHoubGVuZ3RoOysreSl7eD16W3ldCi1pZih4LlZVKGEpKXt0aGlzLmxKKHgpCi14LkRWKGEpCitlbHNlIHRoaXMub2coImVycm9yLyIsbnVsbCl9LCIkMSIsImdYYSIsMiwwLDg2LDg3XSwKK29nOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgorej1iPT1udWxsP1AuRmwobnVsbCxudWxsKTpQLk1zKGIsQy54TSkKK2Zvcih5PXRoaXMuT0oseD0wO3g8eS5sZW5ndGg7Kyt4KXt3PXlbeF0KK2lmKHcuVlUoYSkpe3RoaXMuR1AodykKK3k9Ui50Qih6KQordj13LmZ6CitpZih3Lmdueih3KSYmIUoueEModix5KSl7dj1uZXcgVC5xSSh3LEMuWmcsdix5KQordi4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQordy5ucSh3LHYpfXcuZno9eQordy5xWShhKQogcmV0dXJufX10aHJvdyBILmIoUC5hOSgpKX0sCi1sSjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwoteT10aGlzLkdaCitHUDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdworaWYoSi54Qyh0aGlzLkVmLGEpKXJldHVybgoraWYodGhpcy5FZiE9bnVsbCl7Ti5RTSgiIikuVG8oIlVuaW5zdGFsbGluZyBwYWdlOiAiK0guZCh0aGlzLkVmKSkKK3RoaXMuRWYub1YoKQorSi5yNCh0aGlzLmJuKX1OLlFNKCIiKS5UbygiSW5zdGFsbGluZyBwYWdlOiAiK0guZChhKSkKK3RyeXthLmNpKCl9Y2F0Y2goeSl7eD1ILlJ1KHkpCit6PXgKK04uUU0oIiIpLllYKCJGYWlsZWQgdG8gaW5zdGFsbCBwYWdlOiAiK0guZCh6KSl9dGhpcy5ibi5hcHBlbmRDaGlsZChhLmd5RigpKQogeD1hCi1pZih5PT1udWxsP3g9PW51bGw6eT09PXgpcmV0dXJuCi1pZih5IT1udWxsKXtOLlFNKCIiKS5UbygiVW5pbnN0YWxsaW5nIHBhbmU6ICIrSi5BRyh0aGlzLkdaKSkKLXk9dGhpcy5HWgoteD15LnlGCi1pZih5Lmdueih5KSYmeCE9bnVsbCl7eD1uZXcgVC5xSSh5LEMuR1AseCxudWxsKQoteC4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQoteS5ucSh5LHgpfXkueUY9bnVsbAotSi5yNCh0aGlzLmJuKX1OLlFNKCIiKS5UbygiSW5zdGFsbGluZyBwYW5lOiAiK0guZChhKSkKLXRyeXthLmNpKCl9Y2F0Y2godyl7eT1ILlJ1KHcpCi16PXkKLU4uUU0oIiIpLllYKCJGYWlsZWQgdG8gaW5zdGFsbCBwYW5lOiAiK0guZCh6KSl9dGhpcy5ibi5hcHBlbmRDaGlsZChhLmd5RigpKQotdGhpcy5HWj1hfSwKLW1uOltmdW5jdGlvbihhKXtpZighIUoueChhKS4kaXNLTSl0aGlzLm0yLmgoMCxhLk4pfSwiJDEiLCJnd24iLDIsMCw4Nyw4OF0sCit3PXRoaXMuRWYKK2lmKHRoaXMuZ256KHRoaXMpJiYhSi54Qyh3LHgpKXt3PW5ldyBULnFJKHRoaXMsQy5SRyx3LHgpCit3LiRidWlsdGluVHlwZUluZm89W251bGxdCit0aGlzLm5xKHRoaXMsdyl9dGhpcy5FZj14fSwKK2FiOltmdW5jdGlvbihhKXtpZighIUoueChhKS4kaXNLTSl0aGlzLm0yLmgoMCxhLk4pfSwiJDEiLCJnd24iLDIsMCw4OCw4OV0sCiBhTzpbZnVuY3Rpb24oYSl7aWYoIUoueEModGhpcy5FaCxhKSlyZXR1cm4KIHRoaXMuc3d2KDAsbnVsbCkKLXRoaXMuWjYuYm8oMCwiIy92bS1jb25uZWN0LyIpfSwiJDEiLCJna3EiLDIsMCw4Nyw4OF0sCit0aGlzLlo2LmJvKDAsIiMvdm0tY29ubmVjdC8iKX0sIiQxIiwiZ2txIiwyLDAsODgsODldLAogVHk6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5tMi5UWQogej1uZXcgVS5LTShILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLHosUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxVLlUyKSwwLG51bGwsInVua25vd24iLCJ1bmtub3duIiwwLCExLCExLCIiLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYWYpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmJ2KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogei5MdygpCiB0aGlzLnN3digwLHopCiB0aGlzLkFRKCExKX0sCi1FMDpmdW5jdGlvbihhKXt2YXIgej1uZXcgVS5aVyhILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxQLkFFKSwwLCJ1bmtub3duIiwidW5rbm93biIsMCwhMSwhMSwiIixudWxsLFAuYksobnVsbCxudWxsLCExLG51bGwpLFAuYksobnVsbCxudWxsLCExLG51bGwpLFAuYksobnVsbCxudWxsLCExLG51bGwpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmFmKSxQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsRC5idiksbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKK0UwOmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBVLmRTKEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKSxILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAuQTUpLDAsInVua25vd24iLCJ1bmtub3duIiwwLCExLCExLCIiLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYWYpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmJ2KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogei5MdygpCiB6LlpIKCkKIHRoaXMuc3d2KDAseikKIHRoaXMuQVEoITApfSwKLXN0YXRpYzp7Il4iOiJtZjwifX0sCitzdGF0aWM6eyJeIjoiS2g8In19LAogY0U6ewotIl4iOiJUcDo4OTsiLAorIl4iOiJUcFo6OTA7IiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6PUouUkUoYSkKIHJldHVybiBKLnhDKHouZ2ZHKGEpLCJJc29sYXRlSW50ZXJydXB0ZWQiKXx8Si54Qyh6LmdmRyhhKSwiQnJlYWtwb2ludFJlYWNoZWQiKXx8Si54Qyh6LmdmRyhhKSwiRXhjZXB0aW9uVGhyb3duIil9LAogJGlzRUg6dHJ1ZX0sCi1kdzp7Ci0iXiI6IlRwOjEzO2EsYiIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEoueEMoSi5hVChhKSx0aGlzLmEpJiZ0aGlzLmIuJDEoYSk9PT0hMH0sIiQxIixudWxsLDIsMCxudWxsLDkwLCJjYWxsIl0sCit4RTp7CisiXiI6IlRwWjoxMzthLGIiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLnhDKEouYVQoYSksdGhpcy5hKSYmdGhpcy5iLiQxKGEpPT09ITB9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBLZjp7CiAiXiI6ImE7S0oiLApAQCAtMjM0MCw3ICsyMzYwLDcgQEAKIHouVjcoInJlbW92ZVJvd3MiLFswLHoublEoImdldE51bWJlck9mUm93cyIpXSl9LAogSWQ6ZnVuY3Rpb24oYSxiKXt2YXIgej1bXQogQy5ObS5GVih6LEoua2woYixQLkVuKCkpKQotdGhpcy5LSi5WNygiYWRkUm93IixbSC5WTShuZXcgUC5Ueih6KSxbbnVsbF0pXSl9fSwKK3RoaXMuS0ouVjcoImFkZFJvdyIsW0guVk0obmV3IFAuR0QoeiksW251bGxdKV0pfX0sCiBxdTp7CiAiXiI6ImE7dlIsYkciLAogVzI6ZnVuY3Rpb24oYSl7dmFyIHo9UC5qVCh0aGlzLmJHKQpAQCAtMjM2Myw3ICsyMzgzLDcgQEAKIGlmKHk+MSYmIUoueEMoelsxXSwiIikpe2lmKDE+PXoubGVuZ3RoKXJldHVybiBILmUoeiwxKQogeD16WzFdfWVsc2UgeD1udWxsfWVsc2UgeD1udWxsCiB0aGlzLmVjLm9nKGEseCl9LAotQ3o6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAorV1Y6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogej1KLlZzKGMpLk1XLmdldEF0dHJpYnV0ZSgiaHJlZiIpCiB5PUouUkUoYSkKIHg9eS5ncEwoYSkKQEAgLTIzNzcsNjQgKzIzOTcsNjcgQEAKIGlmKHdpbmRvdy5sb2NhdGlvbi5oYXNoPT09IiJ8fHdpbmRvdy5sb2NhdGlvbi5oYXNoPT09IiMiKXo9IiMiK3RoaXMuTVAKIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZSh6LGRvY3VtZW50LnRpdGxlLHopCiB0aGlzLmxVKHdpbmRvdy5sb2NhdGlvbi5oYXNoKX0sCi15MDpbZnVuY3Rpb24oYSl7dGhpcy5sVSh3aW5kb3cubG9jYXRpb24uaGFzaCl9LCIkMSIsImdiUSIsMiwwLDkxLDE0XSwKK3kwOltmdW5jdGlvbihhKXt0aGlzLmxVKHdpbmRvdy5sb2NhdGlvbi5oYXNoKX0sIiQxIiwiZ2JRIiwyLDAsOTIsMTRdLAogd2E6ZnVuY3Rpb24oYSl7cmV0dXJuIiMiK0guZChhKX19LAotdUc6eworT1M6ewogIl4iOiJQaTtpNj4seUY8IiwKIGdGTDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy55Rn0sCi0kaXN1Rzp0cnVlfSwKLWNaOnsKLSJeIjoidUc7aTYseUYsQVAsZm4iLAorZ0t3OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZ6fSwKK3NLdzpmdW5jdGlvbihhLGIpe3RoaXMuZno9Ri5XaSh0aGlzLEMuWmcsdGhpcy5meixiKX0sCitvVjpmdW5jdGlvbigpe3RoaXMueUY9Ri5XaSh0aGlzLEMuR1AsdGhpcy55RixudWxsKX0sCiskaXNPUzp0cnVlfSwKK2J5OnsKKyJeIjoiT1M7aTYseUYsZnosQVAsZm4iLAogY2k6ZnVuY3Rpb24oKXtpZih0aGlzLnlGPT1udWxsKXt2YXIgej1XLnIzKCJzZXJ2aWNlLXZpZXciLG51bGwpCiB0aGlzLnlGPUYuV2kodGhpcyxDLkdQLHRoaXMueUYseil9fSwKLURWOmZ1bmN0aW9uKGEpe2lmKEoueEMoYSwiIikpcmV0dXJuCi10aGlzLmk2LkVoLmN2KGEpLm1sKG5ldyBHLnp2KHRoaXMpKS5PQShuZXcgRy5PWCgpKX0sCitxWTpmdW5jdGlvbihhKXtpZihKLnhDKGEsIiIpKXJldHVybgordGhpcy5pNi5FaC5jdihhKS5tbChuZXcgRy5tbyh0aGlzKSkuT0EobmV3IEcuR281KCkpfSwKIFZVOmZ1bmN0aW9uKGEpe3JldHVybiEwfX0sCi16djp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe0ouaDkodGhpcy5hLnlGLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTIsImNhbGwiXSwKK21vOnsKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe0ouaDkodGhpcy5hLnlGLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTMsImNhbGwiXSwKICRpc0VIOnRydWV9LAotT1g6ewotIl4iOiJUcDoxMzsiLAotJDE6W2Z1bmN0aW9uKGEpe04uUU0oIiIpLllYKCJTZXJ2aWNlT2JqZWN0UGFuZSB2aXNpdCBlcnJvcjogIitILmQoYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAorR281OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpbZnVuY3Rpb24oYSl7Ti5RTSgiIikuWVgoIlNlcnZpY2VPYmplY3RQYWdlIHZpc2l0IGVycm9yOiAiK0guZChhKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLUJBOnsKLSJeIjoidUc7aTYseUYsQVAsZm4iLAordDk6eworIl4iOiJPUztpNix5RixmeixBUCxmbiIsCiBjaTpmdW5jdGlvbigpe2lmKHRoaXMueUY9PW51bGwpe3ZhciB6PVcucjMoImNsYXNzLXRyZWUiLG51bGwpCiB0aGlzLnlGPUYuV2kodGhpcyxDLkdQLHRoaXMueUYseil9fSwKLURWOmZ1bmN0aW9uKGEpe2E9Si5aWihhLDExKQotdGhpcy5pNi5FaC5jdihhKS5tbChuZXcgRy55ayh0aGlzKSkuT0EobmV3IEcucUgoKSl9LAorcVk6ZnVuY3Rpb24oYSl7YT1KLlpaKGEsMTEpCit0aGlzLmk2LkVoLmN2KGEpLm1sKG5ldyBHLlphKHRoaXMpKS5PQShuZXcgRy5oYSgpKX0sCiBWVTpmdW5jdGlvbihhKXtyZXR1cm4gSi5jbyhhLCJjbGFzcy10cmVlLyIpfSwKLXN0YXRpYzp7Il4iOiJvOXgifX0sCi15azp7Ci0iXiI6IlRwOjEzO2EiLAorc3RhdGljOnsiXiI6InJqayJ9fSwKK1phOnsKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYS55RgotaWYoeiE9bnVsbClKLnVNKHosYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAoraWYoeiE9bnVsbClKLnVNKHosYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5NCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1xSDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7Ti5RTSgiIikuWVgoIkNsYXNzVHJlZVBhbmUgdmlzaXQgZXJyb3I6ICIrSC5kKGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKK2hhOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpbZnVuY3Rpb24oYSl7Ti5RTSgiIikuWVgoIkNsYXNzVHJlZVBhZ2UgdmlzaXQgZXJyb3I6ICIrSC5kKGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAotZjI6ewotIl4iOiJ1RztpNix5RixBUCxmbiIsCitTeTp7CisiXiI6Ik9TO2k2LHlGLGZ6LEFQLGZuIiwKIGNpOmZ1bmN0aW9uKCl7aWYodGhpcy55Rj09bnVsbCl7dmFyIHo9Vy5yMygic2VydmljZS12aWV3IixudWxsKQogdGhpcy55Rj1GLldpKHRoaXMsQy5HUCx0aGlzLnlGLHopfX0sCi1EVjpmdW5jdGlvbihhKXt2YXIgeix5CitxWTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PUguR28odGhpcy55RiwiJGlzVGkiKQogeT10aGlzLmk2LlB2CiB6LkxsPUouUTUoeixDLnRkLHouTGwseSl9LAogVlU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY28oYSwiZXJyb3IvIil9fSwKLUhTOnsKLSJeIjoidUc7aTYseUYsQVAsZm4iLAordjU6eworIl4iOiJPUztpNix5RixmeixBUCxmbiIsCiBjaTpmdW5jdGlvbigpe2lmKHRoaXMueUY9PW51bGwpe3ZhciB6PVcucjMoInZtLWNvbm5lY3QiLG51bGwpCiB0aGlzLnlGPUYuV2kodGhpcyxDLkdQLHRoaXMueUYseil9fSwKLURWOmZ1bmN0aW9uKGEpe30sCitxWTpmdW5jdGlvbihhKXt9LAogVlU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY28oYSwidm0tY29ubmVjdC8iKX19LAogdXQ6ewogIl4iOiJhO0lVIiwKLWN2OmZ1bmN0aW9uKGEpe3JldHVybiBHLm9oKHRoaXMuSVUrIi4iK0guZChhKSl9fSwKLXR4OnsKLSJeIjoiVHA6NTsiLAorY3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIEcuWGsodGhpcy5JVSsiLiIrSC5kKGEpKX19LAorS0Y6eworIl4iOiJUcFo6NTsiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PUMueHIua1YoYSkKIGlmKHo9PW51bGwpcmV0dXJuIHoKQEAgLTI0NDMsMTUgKzI0NjYsMTUgQEAKIHdoaWxlKCEwKXt3PXkuZ0IoeikKIGlmKHR5cGVvZiB3IT09Im51bWJlciIpcmV0dXJuIEgucyh3KQogaWYoISh4PHcpKWJyZWFrCi15LnUoeix4LFUuSzkoeS50KHoseCkpKTsrK3h9cmV0dXJuIHp9LCIkMSIsbnVsbCwyLDAsbnVsbCw5NCwiY2FsbCJdLAoreS51KHoseCxVLks5KHkudCh6LHgpKSk7Kyt4fXJldHVybiB6fSwiJDEiLG51bGwsMiwwLG51bGwsOTUsImNhbGwiXSwKICRpc0VIOnRydWV9LAotS0Y6ewotIl4iOiJUcDoxMzsiLAorWE46eworIl4iOiJUcFo6MTM7IiwKICQxOltmdW5jdGlvbihhKXt9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG5EOnsKICJeIjoiZDM7d3Usalk+LFRZLHJvLGRVQyxwdCIsCi1OWTpmdW5jdGlvbigpe3JldHVybiJ3czovLyIrSC5kKHdpbmRvdy5sb2NhdGlvbi5ob3N0KSsiL3dzIn0sCitCWjpmdW5jdGlvbigpe3JldHVybiJ3czovLyIrSC5kKHdpbmRvdy5sb2NhdGlvbi5ob3N0KSsiL3dzIn0sCiBUUDpmdW5jdGlvbihhKXt2YXIgej10aGlzLk1HKGEpCiBpZih6IT1udWxsKXJldHVybiB6CiB6PW5ldyBVLlo1KDAsITEsbnVsbCxhKQpAQCAtMjQ2MSw3ICsyNDg0LDcgQEAKIHo9e30KIHouYT1udWxsCiB5PXRoaXMualkKLXkuYU4oeSxuZXcgRy5MYSh6LGEpKQoreS5hTih5LG5ldyBHLlVuKHosYSkpCiByZXR1cm4gei5hfSwKIGg6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiBpZihiLmdBOSgpPT09ITApcmV0dXJuCkBAIC0yNDg0LDcgKzI1MDcsNyBAQAogVUo6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMualkKIHouVjEoeikKLXk9Ry5vaCh0aGlzLnd1LklVKyIuaGlzdG9yeSIpCit5PUcuWGsodGhpcy53dS5JVSsiLmhpc3RvcnkiKQogaWYoeT09bnVsbClyZXR1cm4KIHg9Si5VNih5KQogdz0wCkBAIC0yNDk0LDE2ICsyNTE3LDE2IEBACiB4LnUoeSx3LFUuSzkoeC50KHksdykpKTsrK3d9ei5GVigwLHkpCiB0aGlzLlhUKCl9LAogRmY6ZnVuY3Rpb24oKXt0aGlzLlVKKCkKLXZhciB6PXRoaXMuVFAodGhpcy5OWSgpKQordmFyIHo9dGhpcy5UUCh0aGlzLkJaKCkpCiB0aGlzLlRZPXoKIHRoaXMuaCgwLHopfSwKLXN0YXRpYzp7Il4iOiJBTiJ9fSwKLUxhOnsKLSJeIjoiVHA6MTM7YSxiIiwKK3N0YXRpYzp7Il4iOiJkSSJ9fSwKK1VuOnsKKyJeIjoiVHBaOjEzO2EsYiIsCiAkMTpmdW5jdGlvbihhKXtpZihKLnhDKGEuZ3c4KCksdGhpcy5iKSYmSi54QyhhLmdBOSgpLCExKSl0aGlzLmEuYT1hfSwKICRpc0VIOnRydWV9LAogalE6ewotIl4iOiJUcDo5NTsiLAorIl4iOiJUcFo6OTY7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouRlcoYi5nZVgoKSxhLmdlWCgpKX0sCiAkaXNFSDp0cnVlfSwKIFkyOnsKQEAgLTI1MjEsNyArMjU0NCw3IEBACiByZXR1cm4gdGhpcy55cX0sCiBrNzpmdW5jdGlvbihhKXtpZighdGhpcy5OaCgpKXRoaXMuYVo9Ri5XaSh0aGlzLEMuUG4sdGhpcy5hWiwidmlzaWJpbGl0eTpoaWRkZW47Iil9LAogJGlzWTI6dHJ1ZX0sCi1YTjp7CitpWTp7CiAiXiI6IlBpO3ZwPixBUCxmbiIsCiBtQTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMudnAKQEAgLTI1NjEsMTAgKzI1ODQsMTAgQEAKIEYuV2kodGhpcyxDLkpCLDAsMSl9LAogZUU6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLnZwCiBpZihhPj4+MCE9PWF8fGE+PXoubGVuZ3RoKXJldHVybiBILmUoeixhKQotcmV0dXJuIEouVVEoSi5UUCh6W2FdKSxiKX0sCityZXR1cm4gSi5VUShKLlU4byh6W2FdKSxiKX0sCiBQVjpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmVFKGEsdGhpcy5wVCkKLXJldHVybiBKLkZXKHRoaXMuZUUoYix0aGlzLnBUKSx6KX0sIiQyIiwiZ3BQWCIsNCwwLDk2XSwKLXpGOltmdW5jdGlvbihhLGIpe3JldHVybiBKLkZXKHRoaXMuZUUoYSx0aGlzLnBUKSx0aGlzLmVFKGIsdGhpcy5wVCkpfSwiJDIiLCJnUGQiLDQsMCw5Nl0sCityZXR1cm4gSi5GVyh0aGlzLmVFKGIsdGhpcy5wVCkseil9LCIkMiIsImdwUFgiLDQsMCw5N10sCit6RjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5GVyh0aGlzLmVFKGEsdGhpcy5wVCksdGhpcy5lRShiLHRoaXMucFQpKX0sIiQyIiwiZ1BkIiw0LDAsOTddLAogSmQ6ZnVuY3Rpb24oYSl7dmFyIHoseQogbmV3IFAuVlYoMTAwMDAwMCxudWxsLG51bGwpLndFKDApCiB6PXRoaXMuenoKQEAgLTI1NzksNyArMjYwMiw3IEBACiBHdTpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dGhpcy52cAogaWYoYT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCi15PUouVVEoSi5UUCh6W2FdKSxiKQoreT1KLlVRKEouVThvKHpbYV0pLGIpCiB6PXRoaXMub0gKIGlmKGI+PXoubGVuZ3RoKXJldHVybiBILmUoeixiKQogcmV0dXJuIHpbYl0uZ09WKCkuJDEoeSl9LApAQCAtMjU4OSwxODQ2ICsyNjEyLDE5MDIgQEAKIHJldHVybiBKLmV3KEouWXEoelthXSksIlx1MjAwMyIpfXo9dGhpcy5vSAogaWYoYT4+PjAhPT1hfHxhPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYSkKIHo9Si5ZcSh6W2FdKQotcmV0dXJuIEouZXcoeix0aGlzLmpWPyJcdTI1YmMiOiJcdTI1YjIiKX0sIiQxIiwiZ0NPIiwyLDAsMTUsOTddfX1dLFsiYXBwX2Jvb3RzdHJhcCIsImluZGV4X2RldnRvb2xzLmh0bWxfYm9vdHN0cmFwLmRhcnQiLCxFLHsKK3JldHVybiBKLmV3KHosdGhpcy5qVj8iXHUyNWJjIjoiXHUyNWIyIil9LCIkMSIsImdDTyIsMiwwLDE1LDk4XX19XSxbImFwcF9ib290c3RyYXAiLCJpbmRleF9kZXZ0b29scy5odG1sX2Jvb3RzdHJhcC5kYXJ0IiwsRSx7CiAiXiI6IiIsCiBKejpbZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2Ci16PVAuRUYoW0MuYVAsbmV3IEUuZW0oKSxDLklILG5ldyBFLkxiKCksQy5jZyxuZXcgRS5RQSgpLEMuajIsbmV3IEUuQ3YoKSxDLkVULG5ldyBFLmVkKCksQy5CRSxuZXcgRS53YSgpLEMuV0MsbmV3IEUuT3IoKSxDLmhSLG5ldyBFLllMKCksQy5TNCxuZXcgRS53ZigpLEMuUm8sbmV3IEUuT2EoKSxDLmhOLG5ldyBFLmVtdigpLEMuQVYsbmV3IEUuTGJkKCksQy5iVixuZXcgRS5RQWEoKSxDLkMwLG5ldyBFLkN2UygpLEMuZVosbmV3IEUuZWR5KCksQy5iayxuZXcgRS53YUUoKSxDLmxILG5ldyBFLk9yZSgpLEMuYW0sbmV3IEUuWUxhKCksQy5vRSxuZXcgRS53ZmEoKSxDLmtHLG5ldyBFLk9hYSgpLEMuT0ksbmV3IEUuZTAoKSxDLkk5LG5ldyBFLmUxKCksQy5UbyxuZXcgRS5lMigpLEMuWEEsbmV3IEUuZTMoKSxDLmk0LG5ldyBFLmU0KCksQy5xdCxuZXcgRS5lNSgpLEMucDEsbmV3IEUuZTYoKSxDLnlKLG5ldyBFLmU3KCksQy5sYSxuZXcgRS5lOCgpLEMueUwsbmV3IEUuZTkoKSxDLmJKLG5ldyBFLmUxMCgpLEMub3gsbmV3IEUuZTExKCksQy5KZSxuZXcgRS5lMTIoKSxDLkx3LG5ldyBFLmUxMygpLEMuaUUsbmV3IEUuZTE0KCksQy5mNCxuZXcgRS5lMTUoKSxDLlZLLG5ldyBFLmUxNigpLEMuYUgsbmV3IEUuZTE3KCksQy5hSyxuZXcgRS5lMTgoKSxDLkdQLG5ldyBFLmUxOSgpLEMudnMsbmV3IEUuZTIwKCksQy5HcixuZXcgRS5lMjEoKSxDLlRVLG5ldyBFLmUyMigpLEMuRmUsbmV3IEUuZTIzKCksQy50UCxuZXcgRS5lMjQoKSxDLnloLG5ldyBFLmUyNSgpLEMuWmIsbmV3IEUuZTI2KCksQy51NyxuZXcgRS5lMjcoKSxDLnA4LG5ldyBFLmUyOCgpLEMucVIsbmV3IEUuZTI5KCksQy5sZCxuZXcgRS5lMzAoKSxDLm5lLG5ldyBFLmUzMSgpLEMuQjAsbmV3IEUuZTMyKCksQy5yMSxuZXcgRS5lMzMoKSxDLm1yLG5ldyBFLmUzNCgpLEMuRWssbmV3IEUuZTM1KCksQy5QbixuZXcgRS5lMzYoKSxDLllULG5ldyBFLmUzNygpLEMuaDcsbmV3IEUuZTM4KCksQy5SMyxuZXcgRS5lMzkoKSxDLldRLG5ldyBFLmU0MCgpLEMuZlYsbmV3IEUuZTQxKCksQy5qVSxuZXcgRS5lNDIoKSxDLkdkLG5ldyBFLmU0MygpLEMuT08sbmV3IEUuZTQ0KCksQy5NYyxuZXcgRS5lNDUoKSxDLkZQLG5ldyBFLmU0NigpLEMua0YsbmV3IEUuZTQ3KCksQy5VRCxuZXcgRS5lNDgoKSxDLkFxLG5ldyBFLmU0OSgpLEMuRFMsbmV3IEUuZTUwKCksQy5DOSxuZXcgRS5lNTEoKSxDLlZGLG5ldyBFLmU1MigpLEMudVUsbmV3IEUuZTUzKCksQy5ZSixuZXcgRS5lNTQoKSxDLmVGLG5ldyBFLmU1NSgpLEMub0ksbmV3IEUuZTU2KCksQy5TVCxuZXcgRS5lNTcoKSxDLlFILG5ldyBFLmU1OCgpLEMucVgsbmV3IEUuZTU5KCksQy5yRSxuZXcgRS5lNjAoKSxDLm5mLG5ldyBFLmU2MSgpLEMucE8sbmV3IEUuZTYyKCksQy5FSSxuZXcgRS5lNjMoKSxDLkpCLG5ldyBFLmU2NCgpLEMuUlksbmV3IEUuZTY1KCksQy5kNCxuZXcgRS5lNjYoKSxDLmNGLG5ldyBFLmU2NygpLEMuUWwsbmV3IEUuZTY4KCksQy5TSSxuZXcgRS5lNjkoKSxDLnpTLG5ldyBFLmU3MCgpLEMuWUEsbmV3IEUuZTcxKCksQy5hayxuZXcgRS5lNzIoKSxDLkdlLG5ldyBFLmU3MygpLEMuSGUsbmV3IEUuZTc0KCksQy5pbSxuZXcgRS5lNzUoKSxDLlNzLG5ldyBFLmU3NigpLEMuazYsbmV3IEUuZTc3KCksQy5vaixuZXcgRS5lNzgoKSxDLlBKLG5ldyBFLmU3OSgpLEMucTIsbmV3IEUuZTgwKCksQy5kMixuZXcgRS5lODEoKSxDLmtOLG5ldyBFLmU4MigpLEMuZm4sbmV3IEUuZTgzKCksQy55QixuZXcgRS5lODQoKSxDLmVKLG5ldyBFLmU4NSgpLEMuaUcsbmV3IEUuZTg2KCksQy5QeSxuZXcgRS5lODcoKSxDLnBDLG5ldyBFLmU4OCgpLEMudXUsbmV3IEUuZTg5KCksQy5xcyxuZXcgRS5lOTAoKSxDLlhILG5ldyBFLmU5MSgpLEMudEosbmV3IEUuZTkyKCksQy5GOCxuZXcgRS5lOTMoKSxDLkMxLG5ldyBFLmU5NCgpLEMubkwsbmV3IEUuZTk1KCksQy5hMCxuZXcgRS5lOTYoKSxDLllnLG5ldyBFLmU5NygpLEMuYlIsbmV3IEUuZTk4KCksQy5haSxuZXcgRS5lOTkoKSxDLm9iLG5ldyBFLmUxMDAoKSxDLkl2LG5ldyBFLmUxMDEoKSxDLldnLG5ldyBFLmUxMDIoKSxDLnRELG5ldyBFLmUxMDMoKSxDLm5aLG5ldyBFLmUxMDQoKSxDLk9mLG5ldyBFLmUxMDUoKSxDLnBZLG5ldyBFLmUxMDYoKSxDLlhMLG5ldyBFLmUxMDcoKSxDLkxBLG5ldyBFLmUxMDgoKSxDLkxrLG5ldyBFLmUxMDkoKSxDLmRLLG5ldyBFLmUxMTAoKSxDLnhmLG5ldyBFLmUxMTEoKSxDLnJCLG5ldyBFLmUxMTIoKSxDLmJ6LG5ldyBFLmUxMTMoKSxDLkp4LG5ldyBFLmUxMTQoKSxDLmI1LG5ldyBFLmUxMTUoKSxDLkxjLG5ldyBFLmUxMTYoKSxDLmhmLG5ldyBFLmUxMTcoKSxDLnVrLG5ldyBFLmUxMTgoKSxDLlppLG5ldyBFLmUxMTkoKSxDLlROLG5ldyBFLmUxMjAoKSxDLmtBLG5ldyBFLmUxMjEoKSxDLkdJLG5ldyBFLmUxMjIoKSxDLlduLG5ldyBFLmUxMjMoKSxDLnVyLG5ldyBFLmUxMjQoKSxDLlZOLG5ldyBFLmUxMjUoKSxDLkVWLG5ldyBFLmUxMjYoKSxDLlZJLG5ldyBFLmUxMjcoKSxDLmVoLG5ldyBFLmUxMjgoKSxDLnI2LG5ldyBFLmUxMjkoKSxDLk1XLG5ldyBFLmUxMzAoKSxDLlNBLG5ldyBFLmUxMzEoKSxDLmtWLG5ldyBFLmUxMzIoKSxDLnZwLG5ldyBFLmUxMzMoKSxDLmNjLG5ldyBFLmUxMzQoKSxDLkRZLG5ldyBFLmUxMzUoKSxDLkx4LG5ldyBFLmUxMzYoKSxDLk0zLG5ldyBFLmUxMzcoKSxDLndULG5ldyBFLmUxMzgoKSxDLlNSLG5ldyBFLmUxMzkoKSxDLnQ2LG5ldyBFLmUxNDAoKSxDLnJQLG5ldyBFLmUxNDEoKSxDLnBYLG5ldyBFLmUxNDIoKSxDLlZELG5ldyBFLmUxNDMoKSxDLk5OLG5ldyBFLmUxNDQoKSxDLlVYLG5ldyBFLmUxNDUoKSxDLllTLG5ldyBFLmUxNDYoKSxDLnB1LG5ldyBFLmUxNDcoKSxDLkJKLG5ldyBFLmUxNDgoKSxDLmM2LG5ldyBFLmUxNDkoKSxDLnRkLG5ldyBFLmUxNTAoKSxDLkduLG5ldyBFLmUxNTEoKSxDLnpPLG5ldyBFLmUxNTIoKSxDLnZnLG5ldyBFLmUxNTMoKSxDLllzLG5ldyBFLmUxNTQoKSxDLnptLG5ldyBFLmUxNTUoKSxDLlhNLG5ldyBFLmUxNTYoKSxDLkljLG5ldyBFLmUxNTcoKSxDLnlHLG5ldyBFLmUxNTgoKSxDLnVJLG5ldyBFLmUxNTkoKSxDLk85LG5ldyBFLmUxNjAoKSxDLmJhLG5ldyBFLmUxNjEoKSxDLnRXLG5ldyBFLmUxNjIoKSxDLkNHLG5ldyBFLmUxNjMoKSxDLldqLG5ldyBFLmUxNjQoKSxDLnZiLG5ldyBFLmUxNjUoKSxDLlVMLG5ldyBFLmUxNjYoKSxDLkFZLG5ldyBFLmUxNjcoKSxDLlFLLG5ldyBFLmUxNjgoKSxDLkFPLG5ldyBFLmUxNjkoKSxDLlhkLG5ldyBFLmUxNzAoKSxDLkk3LG5ldyBFLmUxNzEoKSxDLnhQLG5ldyBFLmUxNzIoKSxDLldtLG5ldyBFLmUxNzMoKSxDLkdSLG5ldyBFLmUxNzQoKSxDLktYLG5ldyBFLmUxNzUoKSxDLmphLG5ldyBFLmUxNzYoKSxDLkRqLG5ldyBFLmUxNzcoKSxDLmlyLG5ldyBFLmUxNzgoKSxDLmR4LG5ldyBFLmUxNzkoKSxDLm5pLG5ldyBFLmUxODAoKSxDLlgyLG5ldyBFLmUxODEoKSxDLkYzLG5ldyBFLmUxODIoKSxDLlVZLG5ldyBFLmUxODMoKSxDLkFhLG5ldyBFLmUxODQoKSxDLm5ZLG5ldyBFLmUxODUoKSxDLnRnLG5ldyBFLmUxODYoKSxDLkhELG5ldyBFLmUxODcoKSxDLmlVLG5ldyBFLmUxODgoKSxDLmVOLG5ldyBFLmUxODkoKSxDLnVlLG5ldyBFLmUxOTAoKSxDLm5oLG5ldyBFLmUxOTEoKSxDLkwyLG5ldyBFLmUxOTIoKSxDLkdzLG5ldyBFLmUxOTMoKSxDLmJFLG5ldyBFLmUxOTQoKSxDLllELG5ldyBFLmUxOTUoKSxDLlBYLG5ldyBFLmUxOTYoKSxDLk44LG5ldyBFLmUxOTcoKSxDLkVBLG5ldyBFLmUxOTgoKSxDLm9XLG5ldyBFLmUxOTkoKSxDLmhkLG5ldyBFLmUyMDAoKSxDLnBILG5ldyBFLmUyMDEoKSxDLlZlLG5ldyBFLmUyMDIoKSxDLmpNLG5ldyBFLmUyMDMoKSxDLlc1LG5ldyBFLmUyMDQoKSxDLnVYLG5ldyBFLmUyMDUoKSxDLm50LG5ldyBFLmUyMDYoKSxDLlBNLG5ldyBFLmUyMDcoKSxDLnhBLG5ldyBFLmUyMDgoKSxDLms1LG5ldyBFLmUyMDkoKSxDLk52LG5ldyBFLmUyMTAoKSxDLkN3LG5ldyBFLmUyMTEoKSxDLlRXLG5ldyBFLmUyMTIoKSxDLnhTLG5ldyBFLmUyMTMoKSxDLmZ0LG5ldyBFLmUyMTQoKSxDLlFGLG5ldyBFLmUyMTUoKSxDLm1pLG5ldyBFLmUyMTYoKSxDLnp6LG5ldyBFLmUyMTcoKSxDLmhPLG5ldyBFLmUyMTgoKSxDLmVpLG5ldyBFLmUyMTkoKSxDLkhLLG5ldyBFLmUyMjAoKSxDLmplLG5ldyBFLmUyMjEoKSxDLkVmLG5ldyBFLmUyMjIoKSxDLlJILG5ldyBFLmUyMjMoKSxDLlExLG5ldyBFLmUyMjQoKSxDLklELG5ldyBFLmUyMjUoKSxDLno2LG5ldyBFLmUyMjYoKSxDLmJjLG5ldyBFLmUyMjcoKSxDLmt3LG5ldyBFLmUyMjgoKSxDLmVwLG5ldyBFLmUyMjkoKSxDLkoyLG5ldyBFLmUyMzAoKSxDLnpVLG5ldyBFLmUyMzEoKSxDLmJuLG5ldyBFLmUyMzIoKSxDLm1oLG5ldyBFLmUyMzMoKSxDLkZoLG5ldyBFLmUyMzQoKSxDLkxQLG5ldyBFLmUyMzUoKSxDLmpoLG5ldyBFLmUyMzYoKSxDLmZqLG5ldyBFLmUyMzcoKSxDLnh3LG5ldyBFLmUyMzgoKSxDLnpuLG5ldyBFLmUyMzkoKSxDLlJKLG5ldyBFLmUyNDAoKSxDLlRjLG5ldyBFLmUyNDEoKSxDLllFLG5ldyBFLmUyNDIoKSxDLlV5LG5ldyBFLmUyNDMoKV0sbnVsbCxudWxsKQoteT1QLkVGKFtDLmFQLG5ldyBFLmUyNDQoKSxDLmNnLG5ldyBFLmUyNDUoKSxDLlM0LG5ldyBFLmUyNDYoKSxDLkFWLG5ldyBFLmUyNDcoKSxDLmJrLG5ldyBFLmUyNDgoKSxDLmxILG5ldyBFLmUyNDkoKSxDLmFtLG5ldyBFLmUyNTAoKSxDLm9FLG5ldyBFLmUyNTEoKSxDLmtHLG5ldyBFLmUyNTIoKSxDLlhBLG5ldyBFLmUyNTMoKSxDLmk0LG5ldyBFLmUyNTQoKSxDLnlMLG5ldyBFLmUyNTUoKSxDLmJKLG5ldyBFLmUyNTYoKSxDLlZLLG5ldyBFLmUyNTcoKSxDLmFILG5ldyBFLmUyNTgoKSxDLnZzLG5ldyBFLmUyNTkoKSxDLkdyLG5ldyBFLmUyNjAoKSxDLkZlLG5ldyBFLmUyNjEoKSxDLnRQLG5ldyBFLmUyNjIoKSxDLnloLG5ldyBFLmUyNjMoKSxDLlpiLG5ldyBFLmUyNjQoKSxDLnA4LG5ldyBFLmUyNjUoKSxDLmxkLG5ldyBFLmUyNjYoKSxDLm5lLG5ldyBFLmUyNjcoKSxDLkIwLG5ldyBFLmUyNjgoKSxDLm1yLG5ldyBFLmUyNjkoKSxDLllULG5ldyBFLmUyNzAoKSxDLldRLG5ldyBFLmUyNzEoKSxDLmpVLG5ldyBFLmUyNzIoKSxDLkdkLG5ldyBFLmUyNzMoKSxDLk9PLG5ldyBFLmUyNzQoKSxDLk1jLG5ldyBFLmUyNzUoKSxDLlFILG5ldyBFLmUyNzYoKSxDLnJFLG5ldyBFLmUyNzcoKSxDLm5mLG5ldyBFLmUyNzgoKSxDLlFsLG5ldyBFLmUyNzkoKSxDLmFrLG5ldyBFLmUyODAoKSxDLkdlLG5ldyBFLmUyODEoKSxDLkhlLG5ldyBFLmUyODIoKSxDLm9qLG5ldyBFLmUyODMoKSxDLmQyLG5ldyBFLmUyODQoKSxDLmZuLG5ldyBFLmUyODUoKSxDLnlCLG5ldyBFLmUyODYoKSxDLlB5LG5ldyBFLmUyODcoKSxDLnV1LG5ldyBFLmUyODgoKSxDLnFzLG5ldyBFLmUyODkoKSxDLmEwLG5ldyBFLmUyOTAoKSxDLnJCLG5ldyBFLmUyOTEoKSxDLkxjLG5ldyBFLmUyOTIoKSxDLmhmLG5ldyBFLmUyOTMoKSxDLnVrLG5ldyBFLmUyOTQoKSxDLlppLG5ldyBFLmUyOTUoKSxDLlROLG5ldyBFLmUyOTYoKSxDLmtBLG5ldyBFLmUyOTcoKSxDLnVyLG5ldyBFLmUyOTgoKSxDLkVWLG5ldyBFLmUyOTkoKSxDLmVoLG5ldyBFLmUzMDAoKSxDLlNBLG5ldyBFLmUzMDEoKSxDLmtWLG5ldyBFLmUzMDIoKSxDLnZwLG5ldyBFLmUzMDMoKSxDLlNSLG5ldyBFLmUzMDQoKSxDLnQ2LG5ldyBFLmUzMDUoKSxDLlVYLG5ldyBFLmUzMDYoKSxDLllTLG5ldyBFLmUzMDcoKSxDLmM2LG5ldyBFLmUzMDgoKSxDLnRkLG5ldyBFLmUzMDkoKSxDLnpPLG5ldyBFLmUzMTAoKSxDLllzLG5ldyBFLmUzMTEoKSxDLlhNLG5ldyBFLmUzMTIoKSxDLkljLG5ldyBFLmUzMTMoKSxDLk85LG5ldyBFLmUzMTQoKSxDLnRXLG5ldyBFLmUzMTUoKSxDLldqLG5ldyBFLmUzMTYoKSxDLnZiLG5ldyBFLmUzMTcoKSxDLlFLLG5ldyBFLmUzMTgoKSxDLkFPLG5ldyBFLmUzMTkoKSxDLlhkLG5ldyBFLmUzMjAoKSxDLnhQLG5ldyBFLmUzMjEoKSxDLkdSLG5ldyBFLmUzMjIoKSxDLktYLG5ldyBFLmUzMjMoKSxDLmphLG5ldyBFLmUzMjQoKSxDLkRqLG5ldyBFLmUzMjUoKSxDLlgyLG5ldyBFLmUzMjYoKSxDLlVZLG5ldyBFLmUzMjcoKSxDLkFhLG5ldyBFLmUzMjgoKSxDLm5ZLG5ldyBFLmUzMjkoKSxDLnRnLG5ldyBFLmUzMzAoKSxDLkhELG5ldyBFLmUzMzEoKSxDLmlVLG5ldyBFLmUzMzIoKSxDLmVOLG5ldyBFLmUzMzMoKSxDLkdzLG5ldyBFLmUzMzQoKSxDLmJFLG5ldyBFLmUzMzUoKSxDLllELG5ldyBFLmUzMzYoKSxDLlBYLG5ldyBFLmUzMzcoKSxDLnBILG5ldyBFLmUzMzgoKSxDLlZlLG5ldyBFLmUzMzkoKSxDLmpNLG5ldyBFLmUzNDAoKSxDLnVYLG5ldyBFLmUzNDEoKSxDLm50LG5ldyBFLmUzNDIoKSxDLlBNLG5ldyBFLmUzNDMoKSxDLk52LG5ldyBFLmUzNDQoKSxDLkN3LG5ldyBFLmUzNDUoKSxDLlRXLG5ldyBFLmUzNDYoKSxDLmZ0LG5ldyBFLmUzNDcoKSxDLm1pLG5ldyBFLmUzNDgoKSxDLnp6LG5ldyBFLmUzNDkoKSxDLno2LG5ldyBFLmUzNTAoKSxDLmt3LG5ldyBFLmUzNTEoKSxDLnpVLG5ldyBFLmUzNTIoKSxDLlJKLG5ldyBFLmUzNTMoKSxDLllFLG5ldyBFLmUzNTQoKV0sbnVsbCxudWxsKQoteD1QLkVGKFtDLks0LEMucUosQy55UyxDLk10LEMuT0csQy5pbCxDLm53LEMuTXQsQy54RSxDLk10LEMub1QsQy5pbCxDLmpSLEMuTXQsQy5MZyxDLnFKLEMuS08sQy5NdCxDLndrLEMuTXQsQy5qQSxDLnFKLEMuSm8sQy5pbCxDLkF6LEMuTXQsQy5WeCxDLk10LEMuQkwsQy5NdCxDLmxFLEMuYWwsQy50ZSxDLk10LEMuaUQsQy5NdCxDLkp1LEMuTXQsQy5XeixDLmlsLEMuTUksQy5NdCxDLnBGLEMuaWwsQy5XaCxDLk10LEMucUYsQy5NdCxDLm5YLEMuaWwsQy5aaixDLk10LEMuRXAsQy5NdCxDLmRELEMuYWwsQy5oUCxDLk10LEMudGMsQy5NdCxDLnJSLEMuaWwsQy5vRyxDLk10LEMuSmYsQy5pbCxDLkVaLEMuTXQsQy5GRyxDLmlsLEMucEosQy5NdCxDLnRVLEMuTXQsQy5ERCxDLk10LEMuWXksQy5pbCxDLlh2LEMuTXQsQy5jZSxDLk10LEMuVUosQy5pbCxDLmNhLEMuTXQsQy5JbyxDLk10LEMuajQsQy5NdCxDLkVHLEMuTXQsQy5DVCxDLk10LEMubXEsQy5NdCxDLlRxLEMuTXQsQy5scCxDLmlsLEMuUFQsQy5NdCxDLkV5LEMuTXQsQy5rbSxDLk10LEMudncsQy5NdCxDLkxULEMuTXQsQy5OVyxDLmw0LEMubXMsQy5NdCxDLkZBLEMuTXQsQy5RdCxDLk10LEMuYTgsQy5NdCxDLkpXLEMuTXQsQy5NZixDLk10LEMuRGwsQy5NdCxDLmw0LEMucUosQy5PTixDLk10LEMuU2IsQy5hbCxDLlRoLEMuTXQsQy53SCxDLk10LEMucEssQy5NdCxDLmlsLEMuTXQsQy5YOCxDLk10LEMuWTMsQy5xSixDLk5SLEMuTXQsQy52dSxDLk10LEMuYkMsQy5NdCxDLndzLEMuTXQsQy5jSyxDLmlsLEMuakssQy5NdCxDLnFKLEMuancsQy5NdCxDLmw0LEMuYWwsQy5pbF0sbnVsbCxudWxsKQotdz1QLkVGKFtDLks0LFAuRUYoW0MuUzQsQy5GQixDLkFWLEMuUXAsQy5oZixDLlYwXSxudWxsLG51bGwpLEMueVMsUC5FRihbQy5VWCxDLlB0XSxudWxsLG51bGwpLEMuT0csQy5DTSxDLm53LFAuRUYoW0MuckIsQy54WSxDLmJ6LEMuQmtdLG51bGwsbnVsbCksQy54RSxQLkVGKFtDLlhBLEMuZHEsQy55QixDLnZaLEMudGcsQy5EQ10sbnVsbCxudWxsKSxDLm9ULFAuRUYoW0MuaTQsQy5RcyxDLldtLEMuUVddLG51bGwsbnVsbCksQy5qUixQLkVGKFtDLmk0LEMuYUpdLG51bGwsbnVsbCksQy5MZyxQLkVGKFtDLlM0LEMuRkIsQy5BVixDLlFwLEMuQjAsQy5iNixDLnIxLEMublAsQy5tcixDLkhFXSxudWxsLG51bGwpLEMuS08sUC5FRihbQy55aCxDLnpkXSxudWxsLG51bGwpLEMud2ssUC5FRihbQy5BVixDLmZyLEMuZWgsQy5ySCxDLkFhLEMuVXosQy5taSxDLnlWXSxudWxsLG51bGwpLEMuakEsUC5FRihbQy5TNCxDLkZCLEMuQVYsQy5RcCxDLllULEMuTEMsQy5oZixDLlYwLEMuVVksQy5uNl0sbnVsbCxudWxsKSxDLkpvLEMuQ00sQy5BeixQLkVGKFtDLldRLEMuYWhdLG51bGwsbnVsbCksQy5WeCxQLkVGKFtDLk9PLEMuQ2ZdLG51bGwsbnVsbCksQy5CTCxQLkVGKFtDLk1jLEMuZjBdLG51bGwsbnVsbCksQy5sRSxQLkVGKFtDLlFsLEMuVEosQy5hayxDLnlJLEMuYTAsQy5QOSxDLlFLLEMuWW8sQy5XbSxDLlFXXSxudWxsLG51bGwpLEMudGUsUC5FRihbQy5uZixDLlYzLEMucE8sQy5hdSxDLkxjLEMuUGMsQy5BTyxDLmZpXSxudWxsLG51bGwpLEMuaUQsUC5FRihbQy5RSCxDLkM0LEMucVgsQy5kTyxDLlBNLEMuanZdLG51bGwsbnVsbCksQy5KdSxQLkVGKFtDLmtHLEMuUHIsQy5yQixDLnhZLEMuWmksQy54eCxDLlROLEMuR2osQy52YixDLk1xLEMuVUwsQy5tTV0sbnVsbCxudWxsKSxDLld6LEMuQ00sQy5NSSxQLkVGKFtDLmZuLEMuZnosQy5YTSxDLlR0LEMudGcsQy5EQ10sbnVsbCxudWxsKSxDLnBGLEMuQ00sQy5XaCxQLkVGKFtDLnlMLEMuajVdLG51bGwsbnVsbCksQy5xRixQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5uWCxDLkNNLEMuWmosUC5FRihbQy5vaixDLkdUXSxudWxsLG51bGwpLEMuRXAsUC5FRihbQy52cCxDLm8wXSxudWxsLG51bGwpLEMuZEQsUC5FRihbQy5wSCxDLkZrXSxudWxsLG51bGwpLEMuaFAsUC5FRihbQy5XaixDLkFoXSxudWxsLG51bGwpLEMudGMsUC5FRihbQy52cCxDLm8wXSxudWxsLG51bGwpLEMuclIsQy5DTSxDLm9HLFAuRUYoW0MualUsQy5id10sbnVsbCxudWxsKSxDLkpmLEMuQ00sQy5FWixQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5GRyxDLkNNLEMucEosUC5FRihbQy5WZSxDLlg0XSxudWxsLG51bGwpLEMudFUsUC5FRihbQy5xcyxDLk1OXSxudWxsLG51bGwpLEMuREQsUC5FRihbQy52cCxDLm8wXSxudWxsLG51bGwpLEMuWXksQy5DTSxDLlh2LFAuRUYoW0MuWUUsQy5XbF0sbnVsbCxudWxsKSxDLmNlLFAuRUYoW0MuYUgsQy53MyxDLkhlLEMub1YsQy52YixDLk1xLEMuVUwsQy5tTSxDLkRqLEMuQXksQy5HcyxDLmlPLEMuYkUsQy5oMyxDLllELEMuZlAsQy5UVyxDLkgwLEMueFMsQy5iQixDLnp6LEMubFNdLG51bGwsbnVsbCksQy5VSixDLkNNLEMuY2EsUC5FRihbQy5iSixDLlVJLEMub3gsQy5SaF0sbnVsbCxudWxsKSxDLklvLFAuRUYoW0MuckIsQy5SVV0sbnVsbCxudWxsKSxDLmo0LFAuRUYoW0MuckIsQy5SVV0sbnVsbCxudWxsKSxDLkVHLFAuRUYoW0MuckIsQy5SVV0sbnVsbCxudWxsKSxDLkNULFAuRUYoW0MuckIsQy5SVV0sbnVsbCxudWxsKSxDLm1xLFAuRUYoW0MuckIsQy5SVV0sbnVsbCxudWxsKSxDLlRxLFAuRUYoW0MuU1IsQy5TOSxDLnQ2LEMuaHIsQy5yUCxDLk50XSxudWxsLG51bGwpLEMubHAsQy5DTSxDLlBULFAuRUYoW0MuRVYsQy5aUV0sbnVsbCxudWxsKSxDLkV5LFAuRUYoW0MuWEEsQy5kcSxDLnVrLEMucDRdLG51bGwsbnVsbCksQy5rbSxQLkVGKFtDLnJCLEMuUlUsQy5ieixDLkJrLEMudWssQy5wNF0sbnVsbCxudWxsKSxDLnZ3LFAuRUYoW0MudWssQy5wNCxDLkVWLEMuWlFdLG51bGwsbnVsbCksQy5MVCxQLkVGKFtDLllzLEMuQ2VdLG51bGwsbnVsbCksQy5OVyxDLkNNLEMubXMsUC5FRihbQy5jZyxDLmxsLEMudWssQy5wNCxDLmtWLEMudnpdLG51bGwsbnVsbCksQy5GQSxQLkVGKFtDLmNnLEMubGwsQy5rVixDLnZ6XSxudWxsLG51bGwpLEMuUXQsUC5FRihbQy5sZCxDLkd3XSxudWxsLG51bGwpLEMuYTgsUC5FRihbQy5wOCxDLnVjLEMubGQsQy5Hd10sbnVsbCxudWxsKSxDLkpXLFAuRUYoW0MuYVAsQy54RCxDLkFWLEMuUXAsQy5oZixDLlYwXSxudWxsLG51bGwpLEMuTWYsUC5FRihbQy51ayxDLnA0XSxudWxsLG51bGwpLEMuRGwsUC5FRihbQy5WSyxDLk9kXSxudWxsLG51bGwpLEMubDQsUC5FRihbQy5POSxDLnE5LEMuYmEsQy5rUV0sbnVsbCxudWxsKSxDLk9OLFAuRUYoW0MudnMsQy5NUCxDLkdyLEMuVkosQy5UVSxDLkNwLEMuU0EsQy5LSSxDLnRXLEMua0gsQy5DRyxDLk1sLEMuUFgsQy5qeixDLk44LEMucUUsQy5udCxDLlZTXSxudWxsLG51bGwpLEMuU2IsUC5FRihbQy50VyxDLmtILEMuQ0csQy5NbF0sbnVsbCxudWxsKSxDLlRoLFAuRUYoW0MuUFgsQy5qel0sbnVsbCxudWxsKSxDLndILFAuRUYoW0MueWgsQy5sSl0sbnVsbCxudWxsKSxDLnBLLFAuRUYoW0MubmUsQy5yWl0sbnVsbCxudWxsKSxDLmlsLFAuRUYoW0MudXUsQy55WSxDLnhQLEMuVE8sQy5XbSxDLlFXXSxudWxsLG51bGwpLEMuWDgsUC5FRihbQy50ZCxDLlprLEMuR24sQy5hel0sbnVsbCxudWxsKSxDLlkzLFAuRUYoW0MuYmssQy5VZCxDLmxILEMuZEcsQy56VSxDLnVUXSxudWxsLG51bGwpLEMuTlIsUC5FRihbQy5yRSxDLktTXSxudWxsLG51bGwpLEMudnUsUC5FRihbQy5rdyxDLm9DXSxudWxsLG51bGwpLEMuYkMsUC5FRihbQy5hbSxDLkpELEMub0UsQy5yMixDLnVYLEMuRWJdLG51bGwsbnVsbCksQy53cyxQLkVGKFtDLmZ0LEMudTNdLG51bGwsbnVsbCksQy5jSyxDLkNNLEMuakssUC5FRihbQy55aCxDLlVsLEMuUkosQy5CUF0sbnVsbCxudWxsKV0sbnVsbCxudWxsKQotdj1PLnR5KG5ldyBPLk9qKHoseSx4LHcsQy5DTSxQLkVGKFtDLmFQLCJhY3RpdmUiLEMuSUgsImFkZHJlc3MiLEMuY2csImFuY2hvciIsQy5qMiwiYXBwIixDLkVULCJhc3NlcnRzRW5hYmxlZCIsQy5CRSwiYXZlcmFnZUNvbGxlY3Rpb25QZXJpb2RJbk1pbGxpcyIsQy5XQywiYnB0IixDLmhSLCJicmVha3BvaW50IixDLlM0LCJidXN5IixDLlJvLCJidXR0b25DbGljayIsQy5oTiwiYnl0ZXMiLEMuQVYsImNhbGxiYWNrIixDLmJWLCJjYXBhY2l0eSIsQy5DMCwiY2hhbmdlIixDLmVaLCJjaGFuZ2VTb3J0IixDLmJrLCJjaGVja2VkIixDLmxILCJjaGVja2VkVGV4dCIsQy5hbSwiY2hyb21lVGFyZ2V0cyIsQy5vRSwiY2hyb21pdW1BZGRyZXNzIixDLmtHLCJjbGFzc1RhYmxlIixDLk9JLCJjbGFzc2VzIixDLkk5LCJjbG9zZUl0ZW0iLEMuVG8sImNsb3NpbmciLEMuWEEsImNscyIsQy5pNCwiY29kZSIsQy5xdCwiY29sb3JpbmciLEMucDEsImNvbHVtbnMiLEMueUosImNvbm5lY3RTdGFuZGFsb25lIixDLmxhLCJjb25uZWN0VG9WbSIsQy55TCwiY29ubmVjdGlvbiIsQy5iSiwiY291bnRlcnMiLEMub3gsImNvdW50ZXJzQ2hhbmdlZCIsQy5KZSwiY3VycmVudCIsQy5MdywiZGVsZXRlVm0iLEMuaUUsImRlc2NyaXB0b3IiLEMuZjQsImRlc2NyaXB0b3JzIixDLlZLLCJkZXZ0b29scyIsQy5hSCwiZGlzcGxheUN1dG9mZiIsQy5hSywiZG9BY3Rpb24iLEMuR1AsImVsZW1lbnQiLEMudnMsImVuZExpbmUiLEMuR3IsImVuZFBvcyIsQy5UVSwiZW5kUG9zQ2hhbmdlZCIsQy5GZSwiZW5kVG9rZW5Qb3MiLEMudFAsImVudHJ5IixDLnloLCJlcnJvciIsQy5aYiwiZXZhbCIsQy51NywiZXZhbE5vdyIsQy5wOCwiZXZlbnQiLEMucVIsImV2ZW50VHlwZSIsQy5sZCwiZXZlbnRzIixDLm5lLCJleGNlcHRpb24iLEMuQjAsImV4cGFuZCIsQy5yMSwiZXhwYW5kQ2hhbmdlZCIsQy5tciwiZXhwYW5kZWQiLEMuRWssImV4cGFuZGVyIixDLlBuLCJleHBhbmRlclN0eWxlIixDLllULCJleHByIixDLmg3LCJleHRlcm5hbCIsQy5SMywiZmQiLEMuV1EsImZpZWxkIixDLmZWLCJmaWVsZHMiLEMualUsImZpbGUiLEMuR2QsImZpcnN0VG9rZW5Qb3MiLEMuT08sImZsYWciLEMuTWMsImZsYWdMaXN0IixDLkZQLCJmb3JtYXRTaXplIixDLmtGLCJmb3JtYXRUaW1lIixDLlVELCJmb3JtYXR0ZWRBZGRyZXNzIixDLkFxLCJmb3JtYXR0ZWRBdmVyYWdlIixDLkRTLCJmb3JtYXR0ZWRDb2xsZWN0aW9ucyIsQy5DOSwiZm9ybWF0dGVkRGVvcHRJZCIsQy5WRiwiZm9ybWF0dGVkRXhjbHVzaXZlIixDLnVVLCJmb3JtYXR0ZWRFeGNsdXNpdmVUaWNrcyIsQy5ZSiwiZm9ybWF0dGVkSW5jbHVzaXZlIixDLmVGLCJmb3JtYXR0ZWRJbmNsdXNpdmVUaWNrcyIsQy5vSSwiZm9ybWF0dGVkTGluZSIsQy5TVCwiZm9ybWF0dGVkVG90YWxDb2xsZWN0aW9uVGltZSIsQy5RSCwiZnJhZ21lbnRhdGlvbiIsQy5xWCwiZnJhZ21lbnRhdGlvbkNoYW5nZWQiLEMuckUsImZyYW1lIixDLm5mLCJmdW5jdGlvbiIsQy5wTywiZnVuY3Rpb25DaGFuZ2VkIixDLkVJLCJmdW5jdGlvbnMiLEMuSkIsImdldENvbHVtbkxhYmVsIixDLlJZLCJnZXRUYWJzIixDLmQ0LCJnb3RvIixDLmNGLCJnb3RvTGluayIsQy5RbCwiaGFzQ2xhc3MiLEMuU0ksImhhc0Rlc2NyaXB0b3JzIixDLnpTLCJoYXNEaXNhc3NlbWJseSIsQy5ZQSwiaGFzTm9BbGxvY2F0aW9ucyIsQy5haywiaGFzUGFyZW50IixDLkdlLCJoYXNoTGlua1dvcmthcm91bmQiLEMuSGUsImhpZGVUYWdzQ2hlY2tlZCIsQy5pbSwiaGlzdG9yeSIsQy5TcywiaGl0cyIsQy5rNiwiaG92ZXJUZXh0IixDLm9qLCJodHRwU2VydmVyIixDLlBKLCJodW1hbiIsQy5xMiwiaWRsZSIsQy5kMiwiaW1wIixDLmtOLCJpbXBvcnRzIixDLmZuLCJpbnN0YW5jZSIsQy55QiwiaW5zdGFuY2VzIixDLmVKLCJpbnN0cnVjdGlvbiIsQy5pRywiaW5zdHJ1Y3Rpb25zIixDLlB5LCJpbnRlcmZhY2UiLEMucEMsImludGVyZmFjZXMiLEMudXUsImludGVybmFsIixDLnFzLCJpbyIsQy5YSCwiaXNBYnN0cmFjdCIsQy50SiwiaXNCb29sIixDLkY4LCJpc0Nocm9tZVRhcmdldCIsQy5DMSwiaXNDb21tZW50IixDLm5MLCJpc0N1cnJlbnRUYXJnZXQiLEMuYTAsImlzRGFydCIsQy5ZZywiaXNEYXJ0Q29kZSIsQy5iUiwiaXNEb3VibGUiLEMuYWksImlzRW1wdHkiLEMub2IsImlzRXJyb3IiLEMuSXYsImlzSW5zdGFuY2UiLEMuV2csImlzSW50IixDLnRELCJpc0xpc3QiLEMublosImlzTm90RW1wdHkiLEMuT2YsImlzTnVsbCIsQy5wWSwiaXNPcHRpbWl6ZWQiLEMuWEwsImlzUGF0Y2giLEMuTEEsImlzUGlwZSIsQy5MaywiaXNTdHJpbmciLEMuZEssImlzVHlwZSIsQy54ZiwiaXNVbmV4cGVjdGVkIixDLnJCLCJpc29sYXRlIixDLmJ6LCJpc29sYXRlQ2hhbmdlZCIsQy5KeCwiaXNvbGF0ZXMiLEMuYjUsImp1bXBUYXJnZXQiLEMuTGMsImtpbmQiLEMuaGYsImxhYmVsIixDLnVrLCJsYXN0IixDLlppLCJsYXN0QWNjdW11bGF0b3JSZXNldCIsQy5UTiwibGFzdFNlcnZpY2VHQyIsQy5rQSwibGFzdFRva2VuUG9zIixDLkdJLCJsYXN0VXBkYXRlIixDLlduLCJsZW5ndGgiLEMudXIsImxpYiIsQy5WTiwibGlicmFyaWVzIixDLkVWLCJsaWJyYXJ5IixDLlZJLCJsaW5lIixDLmVoLCJsaW5lTW9kZSIsQy5yNiwibGluZU51bWJlciIsQy5NVywibGluZU51bWJlcnMiLEMuU0EsImxpbmVzIixDLmtWLCJsaW5rIixDLnZwLCJsaXN0IixDLmNjLCJsaXN0ZW5pbmciLEMuRFksImxvYWRpbmciLEMuTHgsImxvY2FsQWRkcmVzcyIsQy5NMywibG9jYWxQb3J0IixDLndULCJtYWluUG9ydCIsQy5TUiwibWFwIixDLnQ2LCJtYXBBc1N0cmluZyIsQy5yUCwibWFwQ2hhbmdlZCIsQy5wWCwibWVzc2FnZSIsQy5WRCwibW91c2VPdXQiLEMuTk4sIm1vdXNlT3ZlciIsQy5VWCwibXNnIixDLllTLCJuYW1lIixDLnB1LCJuYW1lSXNFbXB0eSIsQy5CSiwibmV3U3BhY2UiLEMuYzYsIm5vdGlmaWNhdGlvbnMiLEMudGQsIm9iamVjdCIsQy5Hbiwib2JqZWN0Q2hhbmdlZCIsQy56Tywib2JqZWN0UG9vbCIsQy52Zywib2xkU3BhY2UiLEMuWXMsInBhZCIsQy56bSwicGFkZGluZyIsQy5YTSwicGF0aCIsQy5JYywicGF1c2UiLEMueUcsInBhdXNlRXZlbnQiLEMudUksInBpZCIsQy5POSwicG9sbFBlcmlvZCIsQy5iYSwicG9sbFBlcmlvZENoYW5nZWQiLEMudFcsInBvcyIsQy5DRywicG9zQ2hhbmdlZCIsQy5XaiwicHJvY2VzcyIsQy52YiwicHJvZmlsZSIsQy5VTCwicHJvZmlsZUNoYW5nZWQiLEMuQVksInByb3RvY29sIixDLlFLLCJxdWFsaWZpZWQiLEMuQU8sInF1YWxpZmllZE5hbWUiLEMuWGQsInJlYWNoYWJsZSIsQy5JNywicmVhZENsb3NlZCIsQy54UCwicmVmIixDLldtLCJyZWZDaGFuZ2VkIixDLkdSLCJyZWZyZXNoIixDLktYLCJyZWZyZXNoQ292ZXJhZ2UiLEMuamEsInJlZnJlc2hHQyIsQy5EaiwicmVmcmVzaFRpbWUiLEMuaXIsInJlbGF0aXZlTGluayIsQy5keCwicmVtb3RlQWRkcmVzcyIsQy5uaSwicmVtb3RlUG9ydCIsQy5YMiwicmVzZXRBY2N1bXVsYXRvciIsQy5GMywicmVzcG9uc2UiLEMuVVksInJlc3VsdCIsQy5BYSwicmVzdWx0cyIsQy5uWSwicmVzdW1lIixDLnRnLCJyZXRhaW5lZEJ5dGVzIixDLkhELCJyZXRhaW5lZFNpemUiLEMuaVUsInJldGFpbmluZ1BhdGgiLEMuZU4sInJvb3RMaWIiLEMudWUsInJvdyIsQy5uaCwicm93cyIsQy5MMiwicnVubmluZyIsQy5Hcywic2FtcGxlQ291bnQiLEMuYkUsInNhbXBsZURlcHRoIixDLllELCJzYW1wbGVSYXRlIixDLlBYLCJzY3JpcHQiLEMuTjgsInNjcmlwdENoYW5nZWQiLEMuRUEsInNjcmlwdHMiLEMub1csInNlbGVjdEV4cHIiLEMuaGQsInNlcnZpY2VUeXBlIixDLnBILCJzbWFsbCIsQy5WZSwic29ja2V0IixDLmpNLCJzb2NrZXRPd25lciIsQy5XNSwic3RhbmRhbG9uZSIsQy51WCwic3RhbmRhbG9uZVZtQWRkcmVzcyIsQy5udCwic3RhcnRMaW5lIixDLlBNLCJzdGF0dXMiLEMueEEsInN0eWxlRm9ySGl0cyIsQy5rNSwic3ViQ2xhc3NlcyIsQy5Odiwic3ViY2xhc3MiLEMuQ3csInN1cGVyQ2xhc3MiLEMuVFcsInRhZ1NlbGVjdG9yIixDLnhTLCJ0YWdTZWxlY3RvckNoYW5nZWQiLEMuZnQsInRhcmdldCIsQy5RRiwidGFyZ2V0cyIsQy5taSwidGV4dCIsQy56eiwidGltZVNwYW4iLEMuaE8sInRpcEV4Y2x1c2l2ZSIsQy5laSwidGlwS2luZCIsQy5ISywidGlwUGFyZW50IixDLmplLCJ0aXBUaWNrcyIsQy5FZiwidGlwVGltZSIsQy5SSCwidG9TdHJpbmdBc0ZpeGVkIixDLlExLCJ0b2dnbGVFeHBhbmQiLEMuSUQsInRvZ2dsZUV4cGFuZGVkIixDLno2LCJ0b2tlblBvcyIsQy5iYywidG9wRnJhbWUiLEMua3csInRyYWNlIixDLmVwLCJ0cmVlIixDLkoyLCJ0eXBlQ2hlY2tzRW5hYmxlZCIsQy56VSwidW5jaGVja2VkVGV4dCIsQy5ibiwidXBkYXRlTGluZU1vZGUiLEMubWgsInVwdGltZSIsQy5GaCwidXJsIixDLkxQLCJ1c2VkIixDLmpoLCJ2IixDLmZqLCJ2YXJpYWJsZSIsQy54dywidmFyaWFibGVzIixDLnpuLCJ2ZXJzaW9uIixDLlJKLCJ2bSIsQy5UYywidm1OYW1lIixDLllFLCJ3ZWJTb2NrZXQiLEMuVXksIndyaXRlQ2xvc2VkIl0sbnVsbCxudWxsKSwhMSkpCit6PVAuRUYoW0MuYVAsbmV3IEUuZW0oKSxDLklILG5ldyBFLkxiKCksQy5jZyxuZXcgRS5RQSgpLEMuajIsbmV3IEUuQ3YoKSxDLlpnLG5ldyBFLmVkKCksQy5FVCxuZXcgRS53YSgpLEMuQkUsbmV3IEUuT3IoKSxDLldDLG5ldyBFLllMKCksQy5oUixuZXcgRS53ZigpLEMuUzQsbmV3IEUuT2EoKSxDLlJvLG5ldyBFLmVtdigpLEMuaE4sbmV3IEUuTGJkKCksQy5BVixuZXcgRS5RQWEoKSxDLmJWLG5ldyBFLkN2UygpLEMuQzAsbmV3IEUuZWR5KCksQy5lWixuZXcgRS53YUUoKSxDLmJrLG5ldyBFLk9yZSgpLEMubEgsbmV3IEUuWUxhKCksQy5hbSxuZXcgRS53ZmEoKSxDLm9FLG5ldyBFLk9hYSgpLEMua0csbmV3IEUuZTAoKSxDLk9JLG5ldyBFLmUxKCksQy5JOSxuZXcgRS5lMigpLEMuVG8sbmV3IEUuZTMoKSxDLlhBLG5ldyBFLmU0KCksQy5pNCxuZXcgRS5lNSgpLEMucXQsbmV3IEUuZTYoKSxDLnAxLG5ldyBFLmU3KCksQy55SixuZXcgRS5lOCgpLEMubGEsbmV3IEUuZTkoKSxDLnlMLG5ldyBFLmUxMCgpLEMuYkosbmV3IEUuZTExKCksQy5veCxuZXcgRS5lMTIoKSxDLkplLG5ldyBFLmUxMygpLEMua0ksbmV3IEUuZTE0KCksQy52WSxuZXcgRS5lMTUoKSxDLlJzLG5ldyBFLmUxNigpLEMuTHcsbmV3IEUuZTE3KCksQy5lUixuZXcgRS5lMTgoKSxDLmlFLG5ldyBFLmUxOSgpLEMuZjQsbmV3IEUuZTIwKCksQy5WSyxuZXcgRS5lMjEoKSxDLmFILG5ldyBFLmUyMigpLEMuYUssbmV3IEUuZTIzKCksQy5HUCxuZXcgRS5lMjQoKSxDLnZzLG5ldyBFLmUyNSgpLEMuR3IsbmV3IEUuZTI2KCksQy5UVSxuZXcgRS5lMjcoKSxDLkZlLG5ldyBFLmUyOCgpLEMudFAsbmV3IEUuZTI5KCksQy55aCxuZXcgRS5lMzAoKSxDLlpiLG5ldyBFLmUzMSgpLEMudTcsbmV3IEUuZTMyKCksQy5wOCxuZXcgRS5lMzMoKSxDLnFSLG5ldyBFLmUzNCgpLEMubGQsbmV3IEUuZTM1KCksQy5uZSxuZXcgRS5lMzYoKSxDLkIwLG5ldyBFLmUzNygpLEMucjEsbmV3IEUuZTM4KCksQy5tcixuZXcgRS5lMzkoKSxDLkVrLG5ldyBFLmU0MCgpLEMuUG4sbmV3IEUuZTQxKCksQy5ZVCxuZXcgRS5lNDIoKSxDLmg3LG5ldyBFLmU0MygpLEMuUjMsbmV3IEUuZTQ0KCksQy5XUSxuZXcgRS5lNDUoKSxDLmZWLG5ldyBFLmU0NigpLEMualUsbmV3IEUuZTQ3KCksQy5PTyxuZXcgRS5lNDgoKSxDLk1jLG5ldyBFLmU0OSgpLEMuRlAsbmV3IEUuZTUwKCksQy5rRixuZXcgRS5lNTEoKSxDLlVELG5ldyBFLmU1MigpLEMuQXEsbmV3IEUuZTUzKCksQy5EUyxuZXcgRS5lNTQoKSxDLkM5LG5ldyBFLmU1NSgpLEMuVkYsbmV3IEUuZTU2KCksQy51VSxuZXcgRS5lNTcoKSxDLllKLG5ldyBFLmU1OCgpLEMuZUYsbmV3IEUuZTU5KCksQy5vSSxuZXcgRS5lNjAoKSxDLlNULG5ldyBFLmU2MSgpLEMuUUgsbmV3IEUuZTYyKCksQy5xWCxuZXcgRS5lNjMoKSxDLnJFLG5ldyBFLmU2NCgpLEMubmYsbmV3IEUuZTY1KCksQy5FSSxuZXcgRS5lNjYoKSxDLkpCLG5ldyBFLmU2NygpLEMuUlksbmV3IEUuZTY4KCksQy5kNCxuZXcgRS5lNjkoKSxDLmNGLG5ldyBFLmU3MCgpLEMuU0ksbmV3IEUuZTcxKCksQy56UyxuZXcgRS5lNzIoKSxDLllBLG5ldyBFLmU3MygpLEMuR2UsbmV3IEUuZTc0KCksQy5BNyxuZXcgRS5lNzUoKSxDLkhlLG5ldyBFLmU3NigpLEMuaW0sbmV3IEUuZTc3KCksQy5TcyxuZXcgRS5lNzgoKSxDLms2LG5ldyBFLmU3OSgpLEMub2osbmV3IEUuZTgwKCksQy5QSixuZXcgRS5lODEoKSxDLnEyLG5ldyBFLmU4MigpLEMuZDIsbmV3IEUuZTgzKCksQy5rTixuZXcgRS5lODQoKSxDLmZuLG5ldyBFLmU4NSgpLEMueUIsbmV3IEUuZTg2KCksQy5lSixuZXcgRS5lODcoKSxDLmlHLG5ldyBFLmU4OCgpLEMuUHksbmV3IEUuZTg5KCksQy5wQyxuZXcgRS5lOTAoKSxDLnV1LG5ldyBFLmU5MSgpLEMucXMsbmV3IEUuZTkyKCksQy5YSCxuZXcgRS5lOTMoKSxDLnRKLG5ldyBFLmU5NCgpLEMuRjgsbmV3IEUuZTk1KCksQy5DMSxuZXcgRS5lOTYoKSxDLk5yLG5ldyBFLmU5NygpLEMubkwsbmV3IEUuZTk4KCksQy5hMCxuZXcgRS5lOTkoKSxDLllnLG5ldyBFLmUxMDAoKSxDLmJSLG5ldyBFLmUxMDEoKSxDLmFpLG5ldyBFLmUxMDIoKSxDLm9iLG5ldyBFLmUxMDMoKSxDLk1ZLG5ldyBFLmUxMDQoKSxDLkl2LG5ldyBFLmUxMDUoKSxDLldnLG5ldyBFLmUxMDYoKSxDLnRELG5ldyBFLmUxMDcoKSxDLm5aLG5ldyBFLmUxMDgoKSxDLk9mLG5ldyBFLmUxMDkoKSxDLlZsLG5ldyBFLmUxMTAoKSxDLnBZLG5ldyBFLmUxMTEoKSxDLlhMLG5ldyBFLmUxMTIoKSxDLkxBLG5ldyBFLmUxMTMoKSxDLkFULG5ldyBFLmUxMTQoKSxDLkxrLG5ldyBFLmUxMTUoKSxDLmRLLG5ldyBFLmUxMTYoKSxDLnhmLG5ldyBFLmUxMTcoKSxDLnJCLG5ldyBFLmUxMTgoKSxDLmJ6LG5ldyBFLmUxMTkoKSxDLkp4LG5ldyBFLmUxMjAoKSxDLmI1LG5ldyBFLmUxMjEoKSxDLkxjLG5ldyBFLmUxMjIoKSxDLmhmLG5ldyBFLmUxMjMoKSxDLnVrLG5ldyBFLmUxMjQoKSxDLlppLG5ldyBFLmUxMjUoKSxDLlROLG5ldyBFLmUxMjYoKSxDLkdJLG5ldyBFLmUxMjcoKSxDLlduLG5ldyBFLmUxMjgoKSxDLnVyLG5ldyBFLmUxMjkoKSxDLlZOLG5ldyBFLmUxMzAoKSxDLkVWLG5ldyBFLmUxMzEoKSxDLlZJLG5ldyBFLmUxMzIoKSxDLmVoLG5ldyBFLmUxMzMoKSxDLlNBLG5ldyBFLmUxMzQoKSxDLmtWLG5ldyBFLmUxMzUoKSxDLnZwLG5ldyBFLmUxMzYoKSxDLmNjLG5ldyBFLmUxMzcoKSxDLkRZLG5ldyBFLmUxMzgoKSxDLkx4LG5ldyBFLmUxMzkoKSxDLk0zLG5ldyBFLmUxNDAoKSxDLndULG5ldyBFLmUxNDEoKSxDLkpLLG5ldyBFLmUxNDIoKSxDLlNSLG5ldyBFLmUxNDMoKSxDLnQ2LG5ldyBFLmUxNDQoKSxDLnJQLG5ldyBFLmUxNDUoKSxDLnBYLG5ldyBFLmUxNDYoKSxDLlZELG5ldyBFLmUxNDcoKSxDLk5OLG5ldyBFLmUxNDgoKSxDLlVYLG5ldyBFLmUxNDkoKSxDLllTLG5ldyBFLmUxNTAoKSxDLnB1LG5ldyBFLmUxNTEoKSxDLkJKLG5ldyBFLmUxNTIoKSxDLmM2LG5ldyBFLmUxNTMoKSxDLnRkLG5ldyBFLmUxNTQoKSxDLkduLG5ldyBFLmUxNTUoKSxDLnpPLG5ldyBFLmUxNTYoKSxDLnZnLG5ldyBFLmUxNTcoKSxDLllWLG5ldyBFLmUxNTgoKSxDLklmLG5ldyBFLmUxNTkoKSxDLllzLG5ldyBFLmUxNjAoKSxDLnptLG5ldyBFLmUxNjEoKSxDLm5YLG5ldyBFLmUxNjIoKSxDLnhQLG5ldyBFLmUxNjMoKSxDLlhNLG5ldyBFLmUxNjQoKSxDLkljLG5ldyBFLmUxNjUoKSxDLnlHLG5ldyBFLmUxNjYoKSxDLnVJLG5ldyBFLmUxNjcoKSxDLk85LG5ldyBFLmUxNjgoKSxDLmJhLG5ldyBFLmUxNjkoKSxDLnRXLG5ldyBFLmUxNzAoKSxDLkNHLG5ldyBFLmUxNzEoKSxDLldqLG5ldyBFLmUxNzIoKSxDLnZiLG5ldyBFLmUxNzMoKSxDLlVMLG5ldyBFLmUxNzQoKSxDLkFZLG5ldyBFLmUxNzUoKSxDLlFLLG5ldyBFLmUxNzYoKSxDLkFPLG5ldyBFLmUxNzcoKSxDLlhkLG5ldyBFLmUxNzgoKSxDLkk3LG5ldyBFLmUxNzkoKSxDLmtZLG5ldyBFLmUxODAoKSxDLldtLG5ldyBFLmUxODEoKSxDLkdSLG5ldyBFLmUxODIoKSxDLktYLG5ldyBFLmUxODMoKSxDLmphLG5ldyBFLmUxODQoKSxDLkRqLG5ldyBFLmUxODUoKSxDLmlyLG5ldyBFLmUxODYoKSxDLmR4LG5ldyBFLmUxODcoKSxDLm5pLG5ldyBFLmUxODgoKSxDLlgyLG5ldyBFLmUxODkoKSxDLkYzLG5ldyBFLmUxOTAoKSxDLlVZLG5ldyBFLmUxOTEoKSxDLkFhLG5ldyBFLmUxOTIoKSxDLm5ZLG5ldyBFLmUxOTMoKSxDLnRnLG5ldyBFLmUxOTQoKSxDLkhELG5ldyBFLmUxOTUoKSxDLmlVLG5ldyBFLmUxOTYoKSxDLmVOLG5ldyBFLmUxOTcoKSxDLnVlLG5ldyBFLmUxOTgoKSxDLm5oLG5ldyBFLmUxOTkoKSxDLkwyLG5ldyBFLmUyMDAoKSxDLkdzLG5ldyBFLmUyMDEoKSxDLmJFLG5ldyBFLmUyMDIoKSxDLllELG5ldyBFLmUyMDMoKSxDLlBYLG5ldyBFLmUyMDQoKSxDLk44LG5ldyBFLmUyMDUoKSxDLkVBLG5ldyBFLmUyMDYoKSxDLm9XLG5ldyBFLmUyMDcoKSxDLmhkLG5ldyBFLmUyMDgoKSxDLnBILG5ldyBFLmUyMDkoKSxDLlZlLG5ldyBFLmUyMTAoKSxDLmpNLG5ldyBFLmUyMTEoKSxDLlc1LG5ldyBFLmUyMTIoKSxDLnVYLG5ldyBFLmUyMTMoKSxDLm50LG5ldyBFLmUyMTQoKSxDLklULG5ldyBFLmUyMTUoKSxDLmxpLG5ldyBFLmUyMTYoKSxDLlBNLG5ldyBFLmUyMTcoKSxDLms1LG5ldyBFLmUyMTgoKSxDLk52LG5ldyBFLmUyMTkoKSxDLkN3LG5ldyBFLmUyMjAoKSxDLlRXLG5ldyBFLmUyMjEoKSxDLnhTLG5ldyBFLmUyMjIoKSxDLmZ0LG5ldyBFLmUyMjMoKSxDLlFGLG5ldyBFLmUyMjQoKSxDLm1pLG5ldyBFLmUyMjUoKSxDLnp6LG5ldyBFLmUyMjYoKSxDLmhPLG5ldyBFLmUyMjcoKSxDLmVpLG5ldyBFLmUyMjgoKSxDLkhLLG5ldyBFLmUyMjkoKSxDLmplLG5ldyBFLmUyMzAoKSxDLkVmLG5ldyBFLmUyMzEoKSxDLlFMLG5ldyBFLmUyMzIoKSxDLlJILG5ldyBFLmUyMzMoKSxDLlExLG5ldyBFLmUyMzQoKSxDLklELG5ldyBFLmUyMzUoKSxDLno2LG5ldyBFLmUyMzYoKSxDLmJjLG5ldyBFLmUyMzcoKSxDLmt3LG5ldyBFLmUyMzgoKSxDLmVwLG5ldyBFLmUyMzkoKSxDLkoyLG5ldyBFLmUyNDAoKSxDLnpVLG5ldyBFLmUyNDEoKSxDLk9VLG5ldyBFLmUyNDIoKSxDLmJuLG5ldyBFLmUyNDMoKSxDLm1oLG5ldyBFLmUyNDQoKSxDLkZoLG5ldyBFLmUyNDUoKSxDLnl2LG5ldyBFLmUyNDYoKSxDLkxQLG5ldyBFLmUyNDcoKSxDLmpoLG5ldyBFLmUyNDgoKSxDLmZqLG5ldyBFLmUyNDkoKSxDLnh3LG5ldyBFLmUyNTAoKSxDLnpuLG5ldyBFLmUyNTEoKSxDLlJKLG5ldyBFLmUyNTIoKSxDLlRjLG5ldyBFLmUyNTMoKSxDLllFLG5ldyBFLmUyNTQoKSxDLlV5LG5ldyBFLmUyNTUoKV0sbnVsbCxudWxsKQoreT1QLkVGKFtDLmFQLG5ldyBFLmUyNTYoKSxDLmNnLG5ldyBFLmUyNTcoKSxDLlpnLG5ldyBFLmUyNTgoKSxDLlM0LG5ldyBFLmUyNTkoKSxDLkFWLG5ldyBFLmUyNjAoKSxDLmJrLG5ldyBFLmUyNjEoKSxDLmxILG5ldyBFLmUyNjIoKSxDLmFtLG5ldyBFLmUyNjMoKSxDLm9FLG5ldyBFLmUyNjQoKSxDLmtHLG5ldyBFLmUyNjUoKSxDLlhBLG5ldyBFLmUyNjYoKSxDLmk0LG5ldyBFLmUyNjcoKSxDLnlMLG5ldyBFLmUyNjgoKSxDLmJKLG5ldyBFLmUyNjkoKSxDLmtJLG5ldyBFLmUyNzAoKSxDLnZZLG5ldyBFLmUyNzEoKSxDLlZLLG5ldyBFLmUyNzIoKSxDLmFILG5ldyBFLmUyNzMoKSxDLnZzLG5ldyBFLmUyNzQoKSxDLkdyLG5ldyBFLmUyNzUoKSxDLkZlLG5ldyBFLmUyNzYoKSxDLnRQLG5ldyBFLmUyNzcoKSxDLnloLG5ldyBFLmUyNzgoKSxDLlpiLG5ldyBFLmUyNzkoKSxDLnA4LG5ldyBFLmUyODAoKSxDLmxkLG5ldyBFLmUyODEoKSxDLm5lLG5ldyBFLmUyODIoKSxDLkIwLG5ldyBFLmUyODMoKSxDLm1yLG5ldyBFLmUyODQoKSxDLllULG5ldyBFLmUyODUoKSxDLldRLG5ldyBFLmUyODYoKSxDLmpVLG5ldyBFLmUyODcoKSxDLk9PLG5ldyBFLmUyODgoKSxDLk1jLG5ldyBFLmUyODkoKSxDLlFILG5ldyBFLmUyOTAoKSxDLnJFLG5ldyBFLmUyOTEoKSxDLm5mLG5ldyBFLmUyOTIoKSxDLkdlLG5ldyBFLmUyOTMoKSxDLkE3LG5ldyBFLmUyOTQoKSxDLkhlLG5ldyBFLmUyOTUoKSxDLm9qLG5ldyBFLmUyOTYoKSxDLmQyLG5ldyBFLmUyOTcoKSxDLmZuLG5ldyBFLmUyOTgoKSxDLnlCLG5ldyBFLmUyOTkoKSxDLlB5LG5ldyBFLmUzMDAoKSxDLnV1LG5ldyBFLmUzMDEoKSxDLnFzLG5ldyBFLmUzMDIoKSxDLnJCLG5ldyBFLmUzMDMoKSxDLmhmLG5ldyBFLmUzMDQoKSxDLnVrLG5ldyBFLmUzMDUoKSxDLlppLG5ldyBFLmUzMDYoKSxDLlROLG5ldyBFLmUzMDcoKSxDLnVyLG5ldyBFLmUzMDgoKSxDLkVWLG5ldyBFLmUzMDkoKSxDLmVoLG5ldyBFLmUzMTAoKSxDLlNBLG5ldyBFLmUzMTEoKSxDLmtWLG5ldyBFLmUzMTIoKSxDLnZwLG5ldyBFLmUzMTMoKSxDLlNSLG5ldyBFLmUzMTQoKSxDLnQ2LG5ldyBFLmUzMTUoKSxDLlVYLG5ldyBFLmUzMTYoKSxDLllTLG5ldyBFLmUzMTcoKSxDLmM2LG5ldyBFLmUzMTgoKSxDLnRkLG5ldyBFLmUzMTkoKSxDLnpPLG5ldyBFLmUzMjAoKSxDLllWLG5ldyBFLmUzMjEoKSxDLklmLG5ldyBFLmUzMjIoKSxDLllzLG5ldyBFLmUzMjMoKSxDLm5YLG5ldyBFLmUzMjQoKSxDLlhNLG5ldyBFLmUzMjUoKSxDLkljLG5ldyBFLmUzMjYoKSxDLk85LG5ldyBFLmUzMjcoKSxDLnRXLG5ldyBFLmUzMjgoKSxDLldqLG5ldyBFLmUzMjkoKSxDLnZiLG5ldyBFLmUzMzAoKSxDLlFLLG5ldyBFLmUzMzEoKSxDLlhkLG5ldyBFLmUzMzIoKSxDLmtZLG5ldyBFLmUzMzMoKSxDLkdSLG5ldyBFLmUzMzQoKSxDLktYLG5ldyBFLmUzMzUoKSxDLmphLG5ldyBFLmUzMzYoKSxDLkRqLG5ldyBFLmUzMzcoKSxDLlgyLG5ldyBFLmUzMzgoKSxDLlVZLG5ldyBFLmUzMzkoKSxDLkFhLG5ldyBFLmUzNDAoKSxDLm5ZLG5ldyBFLmUzNDEoKSxDLnRnLG5ldyBFLmUzNDIoKSxDLkhELG5ldyBFLmUzNDMoKSxDLmlVLG5ldyBFLmUzNDQoKSxDLmVOLG5ldyBFLmUzNDUoKSxDLkdzLG5ldyBFLmUzNDYoKSxDLmJFLG5ldyBFLmUzNDcoKSxDLllELG5ldyBFLmUzNDgoKSxDLlBYLG5ldyBFLmUzNDkoKSxDLnBILG5ldyBFLmUzNTAoKSxDLlZlLG5ldyBFLmUzNTEoKSxDLmpNLG5ldyBFLmUzNTIoKSxDLnVYLG5ldyBFLmUzNTMoKSxDLm50LG5ldyBFLmUzNTQoKSxDLklULG5ldyBFLmUzNTUoKSxDLlBNLG5ldyBFLmUzNTYoKSxDLk52LG5ldyBFLmUzNTcoKSxDLkN3LG5ldyBFLmUzNTgoKSxDLlRXLG5ldyBFLmUzNTkoKSxDLmZ0LG5ldyBFLmUzNjAoKSxDLm1pLG5ldyBFLmUzNjEoKSxDLnp6LG5ldyBFLmUzNjIoKSxDLno2LG5ldyBFLmUzNjMoKSxDLmt3LG5ldyBFLmUzNjQoKSxDLnpVLG5ldyBFLmUzNjUoKSxDLk9VLG5ldyBFLmUzNjYoKSxDLlJKLG5ldyBFLmUzNjcoKSxDLllFLG5ldyBFLmUzNjgoKV0sbnVsbCxudWxsKQoreD1QLkVGKFtDLks0LEMucUosQy55UyxDLk10LEMuT0csQy5pbCxDLm53LEMuTXQsQy5vdSxDLk10LEMub1QsQy5pbCxDLmpSLEMuTXQsQy5MZyxDLnFKLEMuS08sQy5NdCxDLndrLEMuTXQsQy5qQSxDLnFKLEMuSm8sQy5pbCxDLkF6LEMuTXQsQy5WeCxDLk10LEMuUWIsQy5NdCxDLmxFLEMuYWwsQy50ZSxDLk10LEMuaUQsQy5NdCxDLkp1LEMuTXQsQy5XeixDLmlsLEMuTUksQy5NdCxDLnBGLEMuaWwsQy5XaCxDLk10LEMucUYsQy5NdCxDLnFaLEMuaWwsQy5aaixDLk10LEMuaGUsQy5NdCxDLmRELEMuYWwsQy5oUCxDLk10LEMudGMsQy5NdCxDLnJSLEMuaWwsQy5vRyxDLk10LEMuSmYsQy5pbCxDLkVaLEMuTXQsQy5GRyxDLmlsLEMucEosQy5NdCxDLnRVLEMuTXQsQy5ERCxDLk10LEMuWXksQy5pbCxDLlh2LEMuTXQsQy5jZSxDLk10LEMuVUosQy5pbCxDLmNhLEMuTXQsQy5JbyxDLk10LEMuajQsQy5NdCxDLkVHLEMuTXQsQy5DVCxDLk10LEMubXEsQy5NdCxDLlRxLEMuTXQsQy5scCxDLmlsLEMuUFQsQy5NdCxDLkV5LEMuTXQsQy5rbSxDLk10LEMudncsQy5NdCxDLkxULEMuTXQsQy5OVyxDLmw0LEMubXMsQy5NdCxDLkZBLEMuTXQsQy5RdCxDLk10LEMuYTgsQy5NdCxDLkpXLEMuTXQsQy5NZixDLk10LEMuRGwsQy5NdCxDLmw0LEMucUosQy5PTixDLk10LEMuU2IsQy5hbCxDLlRoLEMuTXQsQy53SCxDLk10LEMucEssQy5NdCxDLmlsLEMuTXQsQy5YOCxDLk10LEMuWTMsQy5xSixDLk5SLEMuTXQsQy52dSxDLk10LEMuYkMsQy5NdCxDLndzLEMuTXQsQy5jSyxDLmlsLEMuakssQy5NdCxDLnFKLEMuancsQy5NdCxDLmw0LEMuYWwsQy5pbF0sbnVsbCxudWxsKQordz1QLkVGKFtDLks0LFAuRUYoW0MuUzQsQy5GQixDLkFWLEMuUXAsQy5oZixDLlYwXSxudWxsLG51bGwpLEMueVMsUC5FRihbQy5VWCxDLlB0XSxudWxsLG51bGwpLEMuT0csQy5DTSxDLm53LFAuRUYoW0MuckIsQy54WSxDLmJ6LEMuQmtdLG51bGwsbnVsbCksQy5vdSxQLkVGKFtDLlhBLEMuZHEsQy55QixDLnZaLEMudGcsQy5EQ10sbnVsbCxudWxsKSxDLm9ULFAuRUYoW0MuaTQsQy5RcyxDLldtLEMuUVddLG51bGwsbnVsbCksQy5qUixQLkVGKFtDLmk0LEMuYUpdLG51bGwsbnVsbCksQy5MZyxQLkVGKFtDLlM0LEMuRkIsQy5BVixDLlFwLEMuQjAsQy5iNixDLnIxLEMublAsQy5tcixDLkhFXSxudWxsLG51bGwpLEMuS08sUC5FRihbQy55aCxDLnpkXSxudWxsLG51bGwpLEMud2ssUC5FRihbQy5BVixDLmZyLEMuZWgsQy5ySCxDLkFhLEMuVXosQy5taSxDLnlWXSxudWxsLG51bGwpLEMuakEsUC5FRihbQy5TNCxDLkZCLEMuQVYsQy5RcCxDLllULEMuTEMsQy5oZixDLlYwLEMuVVksQy5uNl0sbnVsbCxudWxsKSxDLkpvLEMuQ00sQy5BeixQLkVGKFtDLldRLEMuYWhdLG51bGwsbnVsbCksQy5WeCxQLkVGKFtDLk9PLEMuQ2ZdLG51bGwsbnVsbCksQy5RYixQLkVGKFtDLk1jLEMuZjBdLG51bGwsbnVsbCksQy5sRSxQLkVGKFtDLlFLLEMuWW9dLG51bGwsbnVsbCksQy50ZSxQLkVGKFtDLm5mLEMud1JdLG51bGwsbnVsbCksQy5pRCxQLkVGKFtDLlFILEMuQzQsQy5xWCxDLmRPLEMuUE0sQy5qdl0sbnVsbCxudWxsKSxDLkp1LFAuRUYoW0Mua0csQy5QcixDLnJCLEMueFksQy5aaSxDLnh4LEMuVE4sQy5HaixDLnZiLEMuTXEsQy5VTCxDLm1NXSxudWxsLG51bGwpLEMuV3osQy5DTSxDLk1JLFAuRUYoW0MuZm4sQy5meixDLlhNLEMuVHQsQy50ZyxDLkRDXSxudWxsLG51bGwpLEMucEYsQy5DTSxDLldoLFAuRUYoW0MueUwsQy5qNV0sbnVsbCxudWxsKSxDLnFGLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLnFaLEMuQ00sQy5aaixQLkVGKFtDLm9qLEMuR1RdLG51bGwsbnVsbCksQy5oZSxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5kRCxQLkVGKFtDLnBILEMuRmtdLG51bGwsbnVsbCksQy5oUCxQLkVGKFtDLldqLEMuQWhdLG51bGwsbnVsbCksQy50YyxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5yUixDLkNNLEMub0csUC5FRihbQy5qVSxDLmJ3XSxudWxsLG51bGwpLEMuSmYsQy5DTSxDLkVaLFAuRUYoW0MudnAsQy5vMF0sbnVsbCxudWxsKSxDLkZHLEMuQ00sQy5wSixQLkVGKFtDLlZlLEMuWDRdLG51bGwsbnVsbCksQy50VSxQLkVGKFtDLnFzLEMuTU5dLG51bGwsbnVsbCksQy5ERCxQLkVGKFtDLnZwLEMubzBdLG51bGwsbnVsbCksQy5ZeSxDLkNNLEMuWHYsUC5FRihbQy5ZRSxDLldsXSxudWxsLG51bGwpLEMuY2UsUC5FRihbQy5hSCxDLnczLEMuSGUsQy5vVixDLnZiLEMuTXEsQy5VTCxDLm1NLEMuRGosQy5BeSxDLkdzLEMuaU8sQy5iRSxDLmgzLEMuWUQsQy5mUCxDLlRXLEMuSDAsQy54UyxDLmJCLEMuenosQy5sU10sbnVsbCxudWxsKSxDLlVKLEMuQ00sQy5jYSxQLkVGKFtDLmJKLEMuVUksQy5veCxDLlJoXSxudWxsLG51bGwpLEMuSW8sUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuajQsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuRUcsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuQ1QsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMubXEsUC5FRihbQy5yQixDLlJVXSxudWxsLG51bGwpLEMuVHEsUC5FRihbQy5TUixDLlM5LEMudDYsQy5ocixDLnJQLEMuTnRdLG51bGwsbnVsbCksQy5scCxDLkNNLEMuUFQsUC5FRihbQy5FVixDLlpRXSxudWxsLG51bGwpLEMuRXksUC5FRihbQy5YQSxDLmRxLEMudWssQy5wNF0sbnVsbCxudWxsKSxDLmttLFAuRUYoW0MuckIsQy5SVSxDLmJ6LEMuQmssQy51ayxDLnA0XSxudWxsLG51bGwpLEMudncsUC5FRihbQy51ayxDLnA0LEMuRVYsQy5aUV0sbnVsbCxudWxsKSxDLkxULFAuRUYoW0MuWXMsQy5DZV0sbnVsbCxudWxsKSxDLk5XLEMuQ00sQy5tcyxQLkVGKFtDLmNnLEMubGwsQy51ayxDLnA0LEMua1YsQy52el0sbnVsbCxudWxsKSxDLkZBLFAuRUYoW0MuY2csQy5sbCxDLmtWLEMudnpdLG51bGwsbnVsbCksQy5RdCxQLkVGKFtDLmxkLEMuR3ddLG51bGwsbnVsbCksQy5hOCxQLkVGKFtDLnA4LEMudWMsQy5sZCxDLkd3XSxudWxsLG51bGwpLEMuSlcsUC5FRihbQy5hUCxDLnhELEMuQVYsQy5RcCxDLmhmLEMuVjBdLG51bGwsbnVsbCksQy5NZixQLkVGKFtDLnVrLEMucDRdLG51bGwsbnVsbCksQy5EbCxQLkVGKFtDLlZLLEMuT2RdLG51bGwsbnVsbCksQy5sNCxQLkVGKFtDLk85LEMucTksQy5iYSxDLmtRXSxudWxsLG51bGwpLEMuT04sUC5FRihbQy5rSSxDLkpNLEMudlksQy5aUyxDLlJzLEMuRVcsQy52cyxDLk1QLEMuR3IsQy5WSixDLlRVLEMuQ3AsQy5BNyxDLlNELEMuU0EsQy5LSSxDLlBYLEMuanosQy5OOCxDLnFFLEMubnQsQy5WUyxDLklULEMuTkwsQy5saSxDLlR6XSxudWxsLG51bGwpLEMuU2IsUC5FRihbQy50VyxDLmtILEMuQ0csQy5NbF0sbnVsbCxudWxsKSxDLlRoLFAuRUYoW0MuUFgsQy5qel0sbnVsbCxudWxsKSxDLndILFAuRUYoW0MueWgsQy5sSl0sbnVsbCxudWxsKSxDLnBLLFAuRUYoW0MubmUsQy5yWl0sbnVsbCxudWxsKSxDLmlsLFAuRUYoW0MudXUsQy55WSxDLmtZLEMuVE8sQy5XbSxDLlFXXSxudWxsLG51bGwpLEMuWDgsUC5FRihbQy5aZyxDLmI3LEMudGQsQy5aayxDLkduLEMuYXpdLG51bGwsbnVsbCksQy5ZMyxQLkVGKFtDLmJrLEMuVWQsQy5sSCxDLmRHLEMuelUsQy51VF0sbnVsbCxudWxsKSxDLk5SLFAuRUYoW0MuckUsQy5LU10sbnVsbCxudWxsKSxDLnZ1LFAuRUYoW0Mua3csQy5vQ10sbnVsbCxudWxsKSxDLmJDLFAuRUYoW0MuYW0sQy5KRCxDLm9FLEMucjIsQy51WCxDLkViXSxudWxsLG51bGwpLEMud3MsUC5FRihbQy5mdCxDLnUzXSxudWxsLG51bGwpLEMuY0ssQy5DTSxDLmpLLFAuRUYoW0MueWgsQy5VbCxDLlJKLEMuQlBdLG51bGwsbnVsbCldLG51bGwsbnVsbCkKK3Y9Ty50eShuZXcgTy5Paih6LHkseCx3LEMuQ00sUC5FRihbQy5hUCwiYWN0aXZlIixDLklILCJhZGRyZXNzIixDLmNnLCJhbmNob3IiLEMuajIsImFwcCIsQy5aZywiYXJncyIsQy5FVCwiYXNzZXJ0c0VuYWJsZWQiLEMuQkUsImF2ZXJhZ2VDb2xsZWN0aW9uUGVyaW9kSW5NaWxsaXMiLEMuV0MsImJwdCIsQy5oUiwiYnJlYWtwb2ludCIsQy5TNCwiYnVzeSIsQy5SbywiYnV0dG9uQ2xpY2siLEMuaE4sImJ5dGVzIixDLkFWLCJjYWxsYmFjayIsQy5iViwiY2FwYWNpdHkiLEMuQzAsImNoYW5nZSIsQy5lWiwiY2hhbmdlU29ydCIsQy5iaywiY2hlY2tlZCIsQy5sSCwiY2hlY2tlZFRleHQiLEMuYW0sImNocm9tZVRhcmdldHMiLEMub0UsImNocm9taXVtQWRkcmVzcyIsQy5rRywiY2xhc3NUYWJsZSIsQy5PSSwiY2xhc3NlcyIsQy5JOSwiY2xvc2VJdGVtIixDLlRvLCJjbG9zaW5nIixDLlhBLCJjbHMiLEMuaTQsImNvZGUiLEMucXQsImNvbG9yaW5nIixDLnAxLCJjb2x1bW5zIixDLnlKLCJjb25uZWN0U3RhbmRhbG9uZSIsQy5sYSwiY29ubmVjdFRvVm0iLEMueUwsImNvbm5lY3Rpb24iLEMuYkosImNvdW50ZXJzIixDLm94LCJjb3VudGVyc0NoYW5nZWQiLEMuSmUsImN1cnJlbnQiLEMua0ksImN1cnJlbnRMaW5lIixDLnZZLCJjdXJyZW50UG9zIixDLlJzLCJjdXJyZW50UG9zQ2hhbmdlZCIsQy5MdywiZGVsZXRlVm0iLEMuZVIsImRlb3B0aW1pemF0aW9ucyIsQy5pRSwiZGVzY3JpcHRvciIsQy5mNCwiZGVzY3JpcHRvcnMiLEMuVkssImRldnRvb2xzIixDLmFILCJkaXNwbGF5Q3V0b2ZmIixDLmFLLCJkb0FjdGlvbiIsQy5HUCwiZWxlbWVudCIsQy52cywiZW5kTGluZSIsQy5HciwiZW5kUG9zIixDLlRVLCJlbmRQb3NDaGFuZ2VkIixDLkZlLCJlbmRUb2tlblBvcyIsQy50UCwiZW50cnkiLEMueWgsImVycm9yIixDLlpiLCJldmFsIixDLnU3LCJldmFsTm93IixDLnA4LCJldmVudCIsQy5xUiwiZXZlbnRUeXBlIixDLmxkLCJldmVudHMiLEMubmUsImV4Y2VwdGlvbiIsQy5CMCwiZXhwYW5kIixDLnIxLCJleHBhbmRDaGFuZ2VkIixDLm1yLCJleHBhbmRlZCIsQy5FaywiZXhwYW5kZXIiLEMuUG4sImV4cGFuZGVyU3R5bGUiLEMuWVQsImV4cHIiLEMuaDcsImV4dGVybmFsIixDLlIzLCJmZCIsQy5XUSwiZmllbGQiLEMuZlYsImZpZWxkcyIsQy5qVSwiZmlsZSIsQy5PTywiZmxhZyIsQy5NYywiZmxhZ0xpc3QiLEMuRlAsImZvcm1hdFNpemUiLEMua0YsImZvcm1hdFRpbWUiLEMuVUQsImZvcm1hdHRlZEFkZHJlc3MiLEMuQXEsImZvcm1hdHRlZEF2ZXJhZ2UiLEMuRFMsImZvcm1hdHRlZENvbGxlY3Rpb25zIixDLkM5LCJmb3JtYXR0ZWREZW9wdElkIixDLlZGLCJmb3JtYXR0ZWRFeGNsdXNpdmUiLEMudVUsImZvcm1hdHRlZEV4Y2x1c2l2ZVRpY2tzIixDLllKLCJmb3JtYXR0ZWRJbmNsdXNpdmUiLEMuZUYsImZvcm1hdHRlZEluY2x1c2l2ZVRpY2tzIixDLm9JLCJmb3JtYXR0ZWRMaW5lIixDLlNULCJmb3JtYXR0ZWRUb3RhbENvbGxlY3Rpb25UaW1lIixDLlFILCJmcmFnbWVudGF0aW9uIixDLnFYLCJmcmFnbWVudGF0aW9uQ2hhbmdlZCIsQy5yRSwiZnJhbWUiLEMubmYsImZ1bmN0aW9uIixDLkVJLCJmdW5jdGlvbnMiLEMuSkIsImdldENvbHVtbkxhYmVsIixDLlJZLCJnZXRUYWJzIixDLmQ0LCJnb3RvIixDLmNGLCJnb3RvTGluayIsQy5TSSwiaGFzRGVzY3JpcHRvcnMiLEMuelMsImhhc0Rpc2Fzc2VtYmx5IixDLllBLCJoYXNOb0FsbG9jYXRpb25zIixDLkdlLCJoYXNoTGlua1dvcmthcm91bmQiLEMuQTcsImhlaWdodCIsQy5IZSwiaGlkZVRhZ3NDaGVja2VkIixDLmltLCJoaXN0b3J5IixDLlNzLCJoaXRzIixDLms2LCJob3ZlclRleHQiLEMub2osImh0dHBTZXJ2ZXIiLEMuUEosImh1bWFuIixDLnEyLCJpZGxlIixDLmQyLCJpbXAiLEMua04sImltcG9ydHMiLEMuZm4sImluc3RhbmNlIixDLnlCLCJpbnN0YW5jZXMiLEMuZUosImluc3RydWN0aW9uIixDLmlHLCJpbnN0cnVjdGlvbnMiLEMuUHksImludGVyZmFjZSIsQy5wQywiaW50ZXJmYWNlcyIsQy51dSwiaW50ZXJuYWwiLEMucXMsImlvIixDLlhILCJpc0Fic3RyYWN0IixDLnRKLCJpc0Jvb2wiLEMuRjgsImlzQ2hyb21lVGFyZ2V0IixDLkMxLCJpc0NvbW1lbnQiLEMuTnIsImlzQ29uc3QiLEMubkwsImlzQ3VycmVudFRhcmdldCIsQy5hMCwiaXNEYXJ0IixDLllnLCJpc0RhcnRDb2RlIixDLmJSLCJpc0RvdWJsZSIsQy5haSwiaXNFbXB0eSIsQy5vYiwiaXNFcnJvciIsQy5NWSwiaXNJbmxpbmFibGUiLEMuSXYsImlzSW5zdGFuY2UiLEMuV2csImlzSW50IixDLnRELCJpc0xpc3QiLEMublosImlzTm90RW1wdHkiLEMuT2YsImlzTnVsbCIsQy5WbCwiaXNPcHRpbWl6YWJsZSIsQy5wWSwiaXNPcHRpbWl6ZWQiLEMuWEwsImlzUGF0Y2giLEMuTEEsImlzUGlwZSIsQy5BVCwiaXNTdGF0aWMiLEMuTGssImlzU3RyaW5nIixDLmRLLCJpc1R5cGUiLEMueGYsImlzVW5leHBlY3RlZCIsQy5yQiwiaXNvbGF0ZSIsQy5ieiwiaXNvbGF0ZUNoYW5nZWQiLEMuSngsImlzb2xhdGVzIixDLmI1LCJqdW1wVGFyZ2V0IixDLkxjLCJraW5kIixDLmhmLCJsYWJlbCIsQy51aywibGFzdCIsQy5aaSwibGFzdEFjY3VtdWxhdG9yUmVzZXQiLEMuVE4sImxhc3RTZXJ2aWNlR0MiLEMuR0ksImxhc3RVcGRhdGUiLEMuV24sImxlbmd0aCIsQy51ciwibGliIixDLlZOLCJsaWJyYXJpZXMiLEMuRVYsImxpYnJhcnkiLEMuVkksImxpbmUiLEMuZWgsImxpbmVNb2RlIixDLlNBLCJsaW5lcyIsQy5rViwibGluayIsQy52cCwibGlzdCIsQy5jYywibGlzdGVuaW5nIixDLkRZLCJsb2FkaW5nIixDLkx4LCJsb2NhbEFkZHJlc3MiLEMuTTMsImxvY2FsUG9ydCIsQy53VCwibWFpblBvcnQiLEMuSkssIm1ha2VMaW5lSWQiLEMuU1IsIm1hcCIsQy50NiwibWFwQXNTdHJpbmciLEMuclAsIm1hcENoYW5nZWQiLEMucFgsIm1lc3NhZ2UiLEMuVkQsIm1vdXNlT3V0IixDLk5OLCJtb3VzZU92ZXIiLEMuVVgsIm1zZyIsQy5ZUywibmFtZSIsQy5wdSwibmFtZUlzRW1wdHkiLEMuQkosIm5ld1NwYWNlIixDLmM2LCJub3RpZmljYXRpb25zIixDLnRkLCJvYmplY3QiLEMuR24sIm9iamVjdENoYW5nZWQiLEMuek8sIm9iamVjdFBvb2wiLEMudmcsIm9sZFNwYWNlIixDLllWLCJvd25pbmdDbGFzcyIsQy5JZiwib3duaW5nTGlicmFyeSIsQy5ZcywicGFkIixDLnptLCJwYWRkaW5nIixDLm5YLCJwYXJlbnQiLEMueFAsInBhcnNlSW50IixDLlhNLCJwYXRoIixDLkljLCJwYXVzZSIsQy55RywicGF1c2VFdmVudCIsQy51SSwicGlkIixDLk85LCJwb2xsUGVyaW9kIixDLmJhLCJwb2xsUGVyaW9kQ2hhbmdlZCIsQy50VywicG9zIixDLkNHLCJwb3NDaGFuZ2VkIixDLldqLCJwcm9jZXNzIixDLnZiLCJwcm9maWxlIixDLlVMLCJwcm9maWxlQ2hhbmdlZCIsQy5BWSwicHJvdG9jb2wiLEMuUUssInF1YWxpZmllZCIsQy5BTywicXVhbGlmaWVkTmFtZSIsQy5YZCwicmVhY2hhYmxlIixDLkk3LCJyZWFkQ2xvc2VkIixDLmtZLCJyZWYiLEMuV20sInJlZkNoYW5nZWQiLEMuR1IsInJlZnJlc2giLEMuS1gsInJlZnJlc2hDb3ZlcmFnZSIsQy5qYSwicmVmcmVzaEdDIixDLkRqLCJyZWZyZXNoVGltZSIsQy5pciwicmVsYXRpdmVMaW5rIixDLmR4LCJyZW1vdGVBZGRyZXNzIixDLm5pLCJyZW1vdGVQb3J0IixDLlgyLCJyZXNldEFjY3VtdWxhdG9yIixDLkYzLCJyZXNwb25zZSIsQy5VWSwicmVzdWx0IixDLkFhLCJyZXN1bHRzIixDLm5ZLCJyZXN1bWUiLEMudGcsInJldGFpbmVkQnl0ZXMiLEMuSEQsInJldGFpbmVkU2l6ZSIsQy5pVSwicmV0YWluaW5nUGF0aCIsQy5lTiwicm9vdExpYiIsQy51ZSwicm93IixDLm5oLCJyb3dzIixDLkwyLCJydW5uaW5nIixDLkdzLCJzYW1wbGVDb3VudCIsQy5iRSwic2FtcGxlRGVwdGgiLEMuWUQsInNhbXBsZVJhdGUiLEMuUFgsInNjcmlwdCIsQy5OOCwic2NyaXB0Q2hhbmdlZCIsQy5FQSwic2NyaXB0cyIsQy5vVywic2VsZWN0RXhwciIsQy5oZCwic2VydmljZVR5cGUiLEMucEgsInNtYWxsIixDLlZlLCJzb2NrZXQiLEMuak0sInNvY2tldE93bmVyIixDLlc1LCJzdGFuZGFsb25lIixDLnVYLCJzdGFuZGFsb25lVm1BZGRyZXNzIixDLm50LCJzdGFydExpbmUiLEMuSVQsInN0YXJ0UG9zIixDLmxpLCJzdGFydFBvc0NoYW5nZWQiLEMuUE0sInN0YXR1cyIsQy5rNSwic3ViQ2xhc3NlcyIsQy5Odiwic3ViY2xhc3MiLEMuQ3csInN1cGVyQ2xhc3MiLEMuVFcsInRhZ1NlbGVjdG9yIixDLnhTLCJ0YWdTZWxlY3RvckNoYW5nZWQiLEMuZnQsInRhcmdldCIsQy5RRiwidGFyZ2V0cyIsQy5taSwidGV4dCIsQy56eiwidGltZVNwYW4iLEMuaE8sInRpcEV4Y2x1c2l2ZSIsQy5laSwidGlwS2luZCIsQy5ISywidGlwUGFyZW50IixDLmplLCJ0aXBUaWNrcyIsQy5FZiwidGlwVGltZSIsQy5RTCwidG9TdHJpbmciLEMuUkgsInRvU3RyaW5nQXNGaXhlZCIsQy5RMSwidG9nZ2xlRXhwYW5kIixDLklELCJ0b2dnbGVFeHBhbmRlZCIsQy56NiwidG9rZW5Qb3MiLEMuYmMsInRvcEZyYW1lIixDLmt3LCJ0cmFjZSIsQy5lcCwidHJlZSIsQy5KMiwidHlwZUNoZWNrc0VuYWJsZWQiLEMuelUsInVuY2hlY2tlZFRleHQiLEMuT1UsInVub3B0aW1pemVkQ29kZSIsQy5ibiwidXBkYXRlTGluZU1vZGUiLEMubWgsInVwdGltZSIsQy5GaCwidXJsIixDLnl2LCJ1c2FnZUNvdW50ZXIiLEMuTFAsInVzZWQiLEMuamgsInYiLEMuZmosInZhcmlhYmxlIixDLnh3LCJ2YXJpYWJsZXMiLEMuem4sInZlcnNpb24iLEMuUkosInZtIixDLlRjLCJ2bU5hbWUiLEMuWUUsIndlYlNvY2tldCIsQy5VeSwid3JpdGVDbG9zZWQiXSxudWxsLG51bGwpLCExKSkKICQuajg9bmV3IE8uZkgoeix5LEMuQ00pCiAkLll2PW5ldyBPLmJZKHgsdywhMSkKICQucWU9dgotJC5NNj1bbmV3IEUuZTM1NSgpLG5ldyBFLmUzNTYoKSxuZXcgRS5lMzU3KCksbmV3IEUuZTM1OCgpLG5ldyBFLmUzNTkoKSxuZXcgRS5lMzYwKCksbmV3IEUuZTM2MSgpLG5ldyBFLmUzNjIoKSxuZXcgRS5lMzYzKCksbmV3IEUuZTM2NCgpLG5ldyBFLmUzNjUoKSxuZXcgRS5lMzY2KCksbmV3IEUuZTM2NygpLG5ldyBFLmUzNjgoKSxuZXcgRS5lMzY5KCksbmV3IEUuZTM3MCgpLG5ldyBFLmUzNzEoKSxuZXcgRS5lMzcyKCksbmV3IEUuZTM3MygpLG5ldyBFLmUzNzQoKSxuZXcgRS5lMzc1KCksbmV3IEUuZTM3NigpLG5ldyBFLmUzNzcoKSxuZXcgRS5lMzc4KCksbmV3IEUuZTM3OSgpLG5ldyBFLmUzODAoKSxuZXcgRS5lMzgxKCksbmV3IEUuZTM4MigpLG5ldyBFLmUzODMoKSxuZXcgRS5lMzg0KCksbmV3IEUuZTM4NSgpLG5ldyBFLmUzODYoKSxuZXcgRS5lMzg3KCksbmV3IEUuZTM4OCgpLG5ldyBFLmUzODkoKSxuZXcgRS5lMzkwKCksbmV3IEUuZTM5MSgpLG5ldyBFLmUzOTIoKSxuZXcgRS5lMzkzKCksbmV3IEUuZTM5NCgpLG5ldyBFLmUzOTUoKSxuZXcgRS5lMzk2KCksbmV3IEUuZTM5NygpLG5ldyBFLmUzOTgoKSxuZXcgRS5lMzk5KCksbmV3IEUuZTQwMCgpLG5ldyBFLmU0MDEoKSxuZXcgRS5lNDAyKCksbmV3IEUuZTQwMygpLG5ldyBFLmU0MDQoKSxuZXcgRS5lNDA1KCksbmV3IEUuZTQwNigpLG5ldyBFLmU0MDcoKSxuZXcgRS5lNDA4KCksbmV3IEUuZTQwOSgpLG5ldyBFLmU0MTAoKSxuZXcgRS5lNDExKCksbmV3IEUuZTQxMigpLG5ldyBFLmU0MTMoKSxuZXcgRS5lNDE0KCksbmV3IEUuZTQxNSgpLG5ldyBFLmU0MTYoKSxuZXcgRS5lNDE3KCksbmV3IEUuZTQxOCgpLG5ldyBFLmU0MTkoKSxuZXcgRS5lNDIwKCksbmV3IEUuZTQyMSgpLG5ldyBFLmU0MjIoKSxuZXcgRS5lNDIzKCksbmV3IEUuZTQyNCgpLG5ldyBFLmU0MjUoKSxuZXcgRS5lNDI2KCksbmV3IEUuZTQyNygpLG5ldyBFLmU0MjgoKSxuZXcgRS5lNDI5KCksbmV3IEUuZTQzMCgpLG5ldyBFLmU0MzEoKSxuZXcgRS5lNDMyKCldCiskLk02PVtuZXcgRS5lMzY5KCksbmV3IEUuZTM3MCgpLG5ldyBFLmUzNzEoKSxuZXcgRS5lMzcyKCksbmV3IEUuZTM3MygpLG5ldyBFLmUzNzQoKSxuZXcgRS5lMzc1KCksbmV3IEUuZTM3NigpLG5ldyBFLmUzNzcoKSxuZXcgRS5lMzc4KCksbmV3IEUuZTM3OSgpLG5ldyBFLmUzODAoKSxuZXcgRS5lMzgxKCksbmV3IEUuZTM4MigpLG5ldyBFLmUzODMoKSxuZXcgRS5lMzg0KCksbmV3IEUuZTM4NSgpLG5ldyBFLmUzODYoKSxuZXcgRS5lMzg3KCksbmV3IEUuZTM4OCgpLG5ldyBFLmUzODkoKSxuZXcgRS5lMzkwKCksbmV3IEUuZTM5MSgpLG5ldyBFLmUzOTIoKSxuZXcgRS5lMzkzKCksbmV3IEUuZTM5NCgpLG5ldyBFLmUzOTUoKSxuZXcgRS5lMzk2KCksbmV3IEUuZTM5NygpLG5ldyBFLmUzOTgoKSxuZXcgRS5lMzk5KCksbmV3IEUuZTQwMCgpLG5ldyBFLmU0MDEoKSxuZXcgRS5lNDAyKCksbmV3IEUuZTQwMygpLG5ldyBFLmU0MDQoKSxuZXcgRS5lNDA1KCksbmV3IEUuZTQwNigpLG5ldyBFLmU0MDcoKSxuZXcgRS5lNDA4KCksbmV3IEUuZTQwOSgpLG5ldyBFLmU0MTAoKSxuZXcgRS5lNDExKCksbmV3IEUuZTQxMigpLG5ldyBFLmU0MTMoKSxuZXcgRS5lNDE0KCksbmV3IEUuZTQxNSgpLG5ldyBFLmU0MTYoKSxuZXcgRS5lNDE3KCksbmV3IEUuZTQxOCgpLG5ldyBFLmU0MTkoKSxuZXcgRS5lNDIwKCksbmV3IEUuZTQyMSgpLG5ldyBFLmU0MjIoKSxuZXcgRS5lNDIzKCksbmV3IEUuZTQyNCgpLG5ldyBFLmU0MjUoKSxuZXcgRS5lNDI2KCksbmV3IEUuZTQyNygpLG5ldyBFLmU0MjgoKSxuZXcgRS5lNDI5KCksbmV3IEUuZTQzMCgpLG5ldyBFLmU0MzEoKSxuZXcgRS5lNDMyKCksbmV3IEUuZTQzMygpLG5ldyBFLmU0MzQoKSxuZXcgRS5lNDM1KCksbmV3IEUuZTQzNigpLG5ldyBFLmU0MzcoKSxuZXcgRS5lNDM4KCksbmV3IEUuZTQzOSgpLG5ldyBFLmU0NDAoKSxuZXcgRS5lNDQxKCksbmV3IEUuZTQ0MigpLG5ldyBFLmU0NDMoKSxuZXcgRS5lNDQ0KCksbmV3IEUuZTQ0NSgpLG5ldyBFLmU0NDYoKV0KICQuVUc9ITAKLUYuRTIoKX0sIiQwIiwiVjciLDAsMCwxOF0sCitGLkUyKCl9LCIkMCIsIlY3QSIsMCwwLDE4XSwKIGVtOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5KcChhKX0sCiAkaXNFSDp0cnVlfSwKIExiOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWXUoKX0sCiAkaXNFSDp0cnVlfSwKIFFBOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5MbihhKX0sCiAkaXNFSDp0cnVlfSwKIEN2OnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5yMChhKX0sCiAkaXNFSDp0cnVlfSwKIGVkOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdBMygpfSwKLSRpc0VIOnRydWV9LAotd2E6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3FaKCl9LAotJGlzRUg6dHJ1ZX0sCi1Pcjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncXIoKX0sCi0kaXNFSDp0cnVlfSwKLVlMOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdRMSgpfSwKLSRpc0VIOnRydWV9LAotd2Y6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubkcoYSl9LAotJGlzRUg6dHJ1ZX0sCi1PYTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hQShhKX0sCi0kaXNFSDp0cnVlfSwKLWVtdjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZmooKX0sCi0kaXNFSDp0cnVlfSwKLUxiZDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XVChhKX0sCi0kaXNFSDp0cnVlfSwKLVFBYTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQ3MoKX0sCi0kaXNFSDp0cnVlfSwKLUN2Uzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XcChhKX0sCi0kaXNFSDp0cnVlfSwKLWVkeTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uOShhKX0sCi0kaXNFSDp0cnVlfSwKLXdhRTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LMChhKX0sCi0kaXNFSDp0cnVlfSwKLU9yZTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5obihhKX0sCi0kaXNFSDp0cnVlfSwKLVlMYTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IUChhKX0sCi0kaXNFSDp0cnVlfSwKLXdmYTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56RihhKX0sCi0kaXNFSDp0cnVlfSwKLU9hYTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55eihhKX0sCi0kaXNFSDp0cnVlfSwKLWUwOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5wUChhKX0sCiAkaXNFSDp0cnVlfSwKK3dhOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQTMoKX0sCiskaXNFSDp0cnVlfSwKK09yOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncVooKX0sCiskaXNFSDp0cnVlfSwKK1lMOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncXIoKX0sCiskaXNFSDp0cnVlfSwKK3dmOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUTEoKX0sCiskaXNFSDp0cnVlfSwKK09hOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uRyhhKX0sCiskaXNFSDp0cnVlfSwKK2Vtdjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYUEoYSl9LAorJGlzRUg6dHJ1ZX0sCitMYmQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdmaigpfSwKKyRpc0VIOnRydWV9LAorUUFhOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XVChhKX0sCiskaXNFSDp0cnVlfSwKK0N2Uzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0NzKCl9LAorJGlzRUg6dHJ1ZX0sCitlZHk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLldwKGEpfSwKKyRpc0VIOnRydWV9LAord2FFOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uOShhKX0sCiskaXNFSDp0cnVlfSwKK09yZTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSzAoYSl9LAorJGlzRUg6dHJ1ZX0sCitZTGE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmhuKGEpfSwKKyRpc0VIOnRydWV9LAord2ZhOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IUChhKX0sCiskaXNFSDp0cnVlfSwKK09hYTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouekYoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueXooYSl9LAorJGlzRUg6dHJ1ZX0sCiBlMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5SQyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVWYoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nYVAoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkMoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5FMyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2FQKCl9LAogJGlzRUg6dHJ1ZX0sCiBlNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5vbihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRTMoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5TTShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoub24oYSl9LAogJGlzRUg6dHJ1ZX0sCiBlNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nb0goKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouU00oYSl9LAogJGlzRUg6dHJ1ZX0sCiBlNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NaChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ29IKCl9LAogJGlzRUg6dHJ1ZX0sCiBlODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qTyhhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTWgoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54ZShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouak8oYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouT1QoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhlKGEpfSwKICRpc0VIOnRydWV9LAogZTExOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk9rKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5PVChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5PayhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5vNChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2woKX0sCiAkaXNFSDp0cnVlfSwKIGUxNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nU0woKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaDYoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3VIKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkpyKGEpfSwKICRpc0VIOnRydWV9LAogZTE2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm1QKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QMyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5CVChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubzQoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudmkoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubnEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouazAoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucncoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubGsoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VqKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMjQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3cyKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMjU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaXMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubkUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYTMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMjk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVHMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouS3koYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVmwoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoua0UoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouR2woYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTXooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubmIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3R5KCl9LAotJGlzRUg6dHJ1ZX0sCi1lMzc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueW4oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMzg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ01YKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMzk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2tFKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNDA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucG0oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3RKKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNDI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRWMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2hZKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNDQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucmEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWUgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouV1goYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSVAoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNDg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1pkKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNDk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVE0oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNTA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueG8oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2tBKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0dLKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2FuKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2NRKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1M3KCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0p6KCl9LAotJGlzRUg6dHJ1ZX0sCi1lNTc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUFkoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYnUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNTk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVkwoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouek4oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubTQoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudjgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ211KCl9LAotJGlzRUg6dHJ1ZX0sCi1lNjQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0NPKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNjU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTUIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZVUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouREIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoud08oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNjk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0dmKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNzA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZTKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNzE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0pMKCl9LAotJGlzRUg6dHJ1ZX0sCi1lNzI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudTEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouejMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWVEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudEMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3U5KCl9LAotJGlzRUg6dHJ1ZX0sCi1lNzc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZkEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYUIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lNzk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0w0KCl9LAotJGlzRUg6dHJ1ZX0sCi1lODA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2FqKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lxKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0JtKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueFIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lODQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lODU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ05JKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZhKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0t0KCl9LAotJGlzRUg6dHJ1ZX0sCi1lODg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3AyKCl9LAotJGlzRUg6dHJ1ZX0sCi1lODk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVUoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRXcoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ZNKCl9LAotJGlzRUg6dHJ1ZX0sCi1lOTI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWGkoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYkwoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1VCKCl9LAotJGlzRUg6dHJ1ZX0sCi1lOTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaXgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucGQoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3F5KCl9LAotJGlzRUg6dHJ1ZX0sCi1lOTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouR1UoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lOTk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRk4oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTAwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLldrKGEpfSwKLSRpc0VIOnRydWV9LAotZTEwMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5lVChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQzgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTAzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnRmKGEpfSwKLSRpc0VIOnRydWV9LAotZTEwNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55eChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY1UoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTA2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdZRygpfSwKLSRpc0VIOnRydWV9LAotZTEwNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naTIoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMDg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0hZKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTA5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmowKGEpfSwKLSRpc0VIOnRydWV9LAotZTExMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5aTihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueGEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTEyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmFUKGEpfSwKLSRpc0VIOnRydWV9LAotZTExMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LRyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lSKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTE1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdFQigpfSwKLSRpc0VIOnRydWV9LAotZTExNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5JeihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMTc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWXEoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTE4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk1RKGEpfSwKLSRpc0VIOnRydWV9LAotZTExOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YNyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSVIoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTIxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTSygpfSwKLSRpc0VIOnRydWV9LAotZTEyMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUEUoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucTgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTI0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdoWCgpfSwKLSRpc0VIOnRydWV9LAotZTEyNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndlUoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouamwoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTI3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdSZCgpfSwKLSRpc0VIOnRydWV9LAotZTEyODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56WShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMjk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouazcoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTMwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm9aKGEpfSwKLSRpc0VIOnRydWV9LAotZTEzMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5kZShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRHMoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTMzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmNPKGEpfSwKLSRpc0VIOnRydWV9LAotZTEzNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nek0oKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ01OKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTM2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdpUCgpfSwKLSRpc0VIOnRydWV9LAotZTEzNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbWQoKX0sCi0kaXNFSDp0cnVlfSwKLWUxMzg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2VIKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTM5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlM4KGEpfSwKLSRpc0VIOnRydWV9LAotZTE0MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rdihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnoyKGEpfSwKLSRpc0VIOnRydWV9LAotZTE0Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5aRihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTGgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQ1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlp2KGEpfSwKLSRpc0VIOnRydWV9LAotZTE0Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5PNihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNDc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUGYoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTQ4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdVWSgpfSwKLSRpc0VIOnRydWV9LAotZTE0OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndksoKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSmooYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTUxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnQ4KGEpfSwKLSRpc0VIOnRydWV9LAotZTE1Mjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTDEoKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3hRKCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTU0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmVlKGEpfSwKLSRpc0VIOnRydWV9LAotZTE1NTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5KRyhhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQUYoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTU3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkxCKGEpfSwKLSRpc0VIOnRydWV9LAotZTE1ODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LbChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNTk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1U2KCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTYwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmNqKGEpfSwKLSRpc0VIOnRydWV9LAotZTE2MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5icihhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaW8oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTYzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZ5KGEpfSwKLSRpc0VIOnRydWV9LAotZTE2NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5RYShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoua3MoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTY2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkNOKGEpfSwKLSRpc0VIOnRydWV9LAotZTE2Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5xbChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNjg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudWwoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTY5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlN6KGEpfSwKLSRpc0VIOnRydWV9LAotZTE3MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pZChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ204KCl9LAotJGlzRUg6dHJ1ZX0sCi1lMTcyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkJaKGEpfSwKLSRpc0VIOnRydWV9LAotZTE3Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5IMShhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQ20oYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTc1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZVKGEpfSwKLSRpc0VIOnRydWV9LAotZTE3Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5HSChhKX0sCi0kaXNFSDp0cnVlfSwKLWUxNzc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubjgoYSl9LAotJGlzRUg6dHJ1ZX0sCi1lMTc4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdMYygpfSwKLSRpc0VIOnRydWV9LAotZTE3OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTlMoKX0sCi0kaXNFSDp0cnVlfSwKLWUxODA6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd1aCgpfSwKICRpc0VIOnRydWV9LAorZTE5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUDkoKX0sCiskaXNFSDp0cnVlfSwKK2UyMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3VIKCl9LAorJGlzRUg6dHJ1ZX0sCitlMjE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm1QKGEpfSwKKyRpc0VIOnRydWV9LAorZTIyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5CVChhKX0sCiskaXNFSDp0cnVlfSwKK2UyMzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudmkoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMjQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm5xKGEpfSwKKyRpc0VIOnRydWV9LAorZTI1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rMChhKX0sCiskaXNFSDp0cnVlfSwKK2UyNjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucncoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMjc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmxrKGEpfSwKKyRpc0VIOnRydWV9LAorZTI4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZWooKX0sCiskaXNFSDp0cnVlfSwKK2UyOTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3cyKCl9LAorJGlzRUg6dHJ1ZX0sCitlMzA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnc4KGEpfSwKKyRpc0VIOnRydWV9LAorZTMxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pcyhhKX0sCiskaXNFSDp0cnVlfSwKK2UzMjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoua3YoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmEzKGEpfSwKKyRpc0VIOnRydWV9LAorZTM0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5UcyhhKX0sCiskaXNFSDp0cnVlfSwKK2UzNTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouS3koYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlvKGEpfSwKKyRpc0VIOnRydWV9LAorZTM3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rRShhKX0sCiskaXNFSDp0cnVlfSwKK2UzODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouR2woYSl9LAorJGlzRUg6dHJ1ZX0sCitlMzk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk16KGEpfSwKKyRpc0VIOnRydWV9LAorZTQwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uYihhKX0sCiskaXNFSDp0cnVlfSwKK2U0MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3R5KCl9LAorJGlzRUg6dHJ1ZX0sCitlNDI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnluKGEpfSwKKyRpc0VIOnRydWV9LAorZTQzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nTVgoKX0sCiskaXNFSDp0cnVlfSwKK2U0NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3g1KCl9LAorJGlzRUg6dHJ1ZX0sCitlNDU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnBtKGEpfSwKKyRpc0VIOnRydWV9LAorZTQ2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndEooKX0sCiskaXNFSDp0cnVlfSwKK2U0Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRWMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNDg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJhKGEpfSwKKyRpc0VIOnRydWV9LAorZTQ5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZSChhKX0sCiskaXNFSDp0cnVlfSwKK2U1MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouV1goYSl9LAorJGlzRUg6dHJ1ZX0sCitlNTE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLklQKGEpfSwKKyRpc0VIOnRydWV9LAorZTUyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWmQoKX0sCiskaXNFSDp0cnVlfSwKK2U1Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVE0oYSl9LAorJGlzRUg6dHJ1ZX0sCitlNTQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhvKGEpfSwKKyRpc0VIOnRydWV9LAorZTU1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5na0EoKX0sCiskaXNFSDp0cnVlfSwKK2U1Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0dLKCl9LAorJGlzRUg6dHJ1ZX0sCitlNTc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdhbigpfSwKKyRpc0VIOnRydWV9LAorZTU4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nY1EoKX0sCiskaXNFSDp0cnVlfSwKK2U1OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1M3KCl9LAorJGlzRUg6dHJ1ZX0sCitlNjA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdKeigpfSwKKyRpc0VIOnRydWV9LAorZTYxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QWShhKX0sCiskaXNFSDp0cnVlfSwKK2U2Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYnUoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNjM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlZMKGEpfSwKKyRpc0VIOnRydWV9LAorZTY0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56TihhKX0sCiskaXNFSDp0cnVlfSwKK2U2NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubTQoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNjY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtdSgpfSwKKyRpc0VIOnRydWV9LAorZTY3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQ08oKX0sCiskaXNFSDp0cnVlfSwKK2U2ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTUIoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNjk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmVVKGEpfSwKKyRpc0VIOnRydWV9LAorZTcwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5EQihhKX0sCiskaXNFSDp0cnVlfSwKK2U3MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0dmKCl9LAorJGlzRUg6dHJ1ZX0sCitlNzI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2UygpfSwKKyRpc0VIOnRydWV9LAorZTczOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSkwoKX0sCiskaXNFSDp0cnVlfSwKK2U3NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRXIoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNzU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk9CKGEpfSwKKyRpc0VIOnRydWV9LAorZTc2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZUShhKX0sCiskaXNFSDp0cnVlfSwKK2U3Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudEMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlNzg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd1OSgpfSwKKyRpc0VIOnRydWV9LAorZTc5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5hVyhhKX0sCiskaXNFSDp0cnVlfSwKK2U4MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYUIoYSl9LAorJGlzRUg6dHJ1ZX0sCitlODE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdMNCgpfSwKKyRpc0VIOnRydWV9LAorZTgyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nYWooKX0sCiskaXNFSDp0cnVlfSwKK2U4Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lxKCl9LAorJGlzRUg6dHJ1ZX0sCitlODQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdCbSgpfSwKKyRpc0VIOnRydWV9LAorZTg1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54UihhKX0sCiskaXNFSDp0cnVlfSwKK2U4Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlODc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdOSSgpfSwKKyRpc0VIOnRydWV9LAorZTg4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndmEoKX0sCiskaXNFSDp0cnVlfSwKK2U4OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0t0KCl9LAorJGlzRUg6dHJ1ZX0sCitlOTA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdwMigpfSwKKyRpc0VIOnRydWV9LAorZTkxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VVShhKX0sCiskaXNFSDp0cnVlfSwKK2U5Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouRXcoYSl9LAorJGlzRUg6dHJ1ZX0sCitlOTM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWTSgpfSwKKyRpc0VIOnRydWV9LAorZTk0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YaShhKX0sCiskaXNFSDp0cnVlfSwKK2U5NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYkwoYSl9LAorJGlzRUg6dHJ1ZX0sCitlOTY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdVQigpfSwKKyRpc0VIOnRydWV9LAorZTk3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUnMoKX0sCiskaXNFSDp0cnVlfSwKK2U5ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaXgoYSl9LAorJGlzRUg6dHJ1ZX0sCitlOTk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmduaSgpfSwKKyRpc0VIOnRydWV9LAorZTEwMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3F5KCl9LAorJGlzRUg6dHJ1ZX0sCitlMTAxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi53eihhKX0sCiskaXNFSDp0cnVlfSwKK2UxMDI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkZOKGEpfSwKKyRpc0VIOnRydWV9LAorZTEwMzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouV2soYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTA0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5naG8oKX0sCiskaXNFSDp0cnVlfSwKK2UxMDU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmVUKGEpfSwKKyRpc0VIOnRydWV9LAorZTEwNjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQzgoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTA3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi50ZihhKX0sCiskaXNFSDp0cnVlfSwKK2UxMDg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnBPKGEpfSwKKyRpc0VIOnRydWV9LAorZTEwOTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY1UoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTEwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVzEoKX0sCiskaXNFSDp0cnVlfSwKK2UxMTE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdZRygpfSwKKyRpc0VIOnRydWV9LAorZTExMjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2kyKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTEzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nSFkoKX0sCiskaXNFSDp0cnVlfSwKK2UxMTQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdGbygpfSwKKyRpc0VIOnRydWV9LAorZTExNTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouajAoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTE2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5aTihhKX0sCiskaXNFSDp0cnVlfSwKK2UxMTc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhhKGEpfSwKKyRpc0VIOnRydWV9LAorZTExODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYVQoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTE5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LRyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxMjA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdpUigpfSwKKyRpc0VIOnRydWV9LAorZTEyMTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0VCKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTIyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5JeihhKX0sCiskaXNFSDp0cnVlfSwKK2UxMjM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLllxKGEpfSwKKyRpc0VIOnRydWV9LAorZTEyNDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVkoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTI1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5YNyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxMjY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLklSKGEpfSwKKyRpc0VIOnRydWV9LAorZTEyNzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1BFKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTI4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5xOChhKX0sCiskaXNFSDp0cnVlfSwKK2UxMjk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdoWCgpfSwKKyRpc0VIOnRydWV9LAorZTEzMDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZVKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTMxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qbChhKX0sCiskaXNFSDp0cnVlfSwKK2UxMzI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdSZCgpfSwKKyRpc0VIOnRydWV9LAorZTEzMzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouelkoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTM0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5kZShhKX0sCiskaXNFSDp0cnVlfSwKK2UxMzU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkRzKGEpfSwKKyRpc0VIOnRydWV9LAorZTEzNjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY08oYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTM3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nek0oKX0sCiskaXNFSDp0cnVlfSwKK2UxMzg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdNTigpfSwKKyRpc0VIOnRydWV9LAorZTEzOTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2lQKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTQwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbWQoKX0sCiskaXNFSDp0cnVlfSwKK2UxNDE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdlSCgpfSwKKyRpc0VIOnRydWV9LAorZTE0Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueWMoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTQzOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5ZZihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNDQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpxKGEpfSwKKyRpc0VIOnRydWV9LAorZTE0NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWgoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTQ2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56MihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNDc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpGKGEpfSwKKyRpc0VIOnRydWV9LAorZTE0ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouTGgoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTQ5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5adihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNTA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk82KGEpfSwKKyRpc0VIOnRydWV9LAorZTE1MTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUGYoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTUyOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVVkoKX0sCiskaXNFSDp0cnVlfSwKK2UxNTM6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2SygpfSwKKyRpc0VIOnRydWV9LAorZTE1NDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSmooYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTU1OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi50OChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNTY6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdMMSgpfSwKKyRpc0VIOnRydWV9LAorZTE1Nzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3hRKCl9LAorJGlzRUg6dHJ1ZX0sCitlMTU4OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nRWwoKX0sCiskaXNFSDp0cnVlfSwKK2UxNTk6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd4SCgpfSwKKyRpc0VIOnRydWV9LAorZTE2MDp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZWUoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTYxOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5KRyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxNjI6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkxwKGEpfSwKKyRpc0VIOnRydWV9LAorZTE2Mzp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouejEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTY0OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5BRihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNjU6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZpKGEpfSwKKyRpc0VIOnRydWV9LAorZTE2Njp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouS2woYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTY3OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVTYoKX0sCiskaXNFSDp0cnVlfSwKK2UxNjg6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmNqKGEpfSwKKyRpc0VIOnRydWV9LAorZTE2OTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouYnIoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTcwOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QQihhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzE6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZ5KGEpfSwKKyRpc0VIOnRydWV9LAorZTE3Mjp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUWEoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTczOnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5rcyhhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzQ6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkNOKGEpfSwKKyRpc0VIOnRydWV9LAorZTE3NTp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucWwoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTc2OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51bChhKX0sCiskaXNFSDp0cnVlfSwKK2UxNzc6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdVeCgpfSwKKyRpc0VIOnRydWV9LAorZTE3ODp7CisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouaWQoYSl9LAorJGlzRUg6dHJ1ZX0sCitlMTc5OnsKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbTgoKX0sCiskaXNFSDp0cnVlfSwKK2UxODA6eworIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkJaKGEpfSwKKyRpc0VIOnRydWV9LAogZTE4MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5pTChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSDEoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTgyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmJ4KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5DbShhKX0sCiAkaXNFSDp0cnVlfSwKIGUxODM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoudVcoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZVKGEpfSwKICRpc0VIOnRydWV9LAogZTE4NDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5XMihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouR0goYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTg1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlVUKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5uOChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxODY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouS2QoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdMYygpfSwKICRpc0VIOnRydWV9LAogZTE4Nzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5wVShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ05TKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMTg4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlRnKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5neksoKX0sCiAkaXNFSDp0cnVlfSwKIGUxODk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ZjKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmlMKGEpfSwKICRpc0VIOnRydWV9LAogZTE5MDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncEYoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouazcoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTkxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlRZKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51VyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0E2KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlcyKGEpfSwKICRpc0VIOnRydWV9LAogZTE5Mzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5SeShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVQoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTk0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlVQKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5LZChhKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZncoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnBVKGEpfSwKICRpc0VIOnRydWV9LAogZTE5Njp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi56SChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVGcoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMTk3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlpzKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVmMoKX0sCiAkaXNFSDp0cnVlfSwKIGUxOTg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1hSKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdwRigpfSwKICRpc0VIOnRydWV9LAogZTE5OTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5OQihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVFkoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjAwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd6UygpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nQTYoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVTgoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlJ5KGEpfSwKICRpc0VIOnRydWV9LAogZTIwMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5vTihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVVAoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjAzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWOCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VQShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3A4KCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnpIKGEpfSwKICRpc0VIOnRydWV9LAogZTIwNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5GOShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWnMoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjA2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkhCKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWFIoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMDc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouakIoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk5CKGEpfSwKICRpc0VIOnRydWV9LAogZTIwODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54YihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3pTKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjA5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTNSgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VOChhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0RvKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLm9OKGEpfSwKICRpc0VIOnRydWV9LAogZTIxMTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndWooKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1Y4KCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjEyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmoxKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ncDgoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouQXcoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkY5KGEpfSwKICRpc0VIOnRydWV9LAogZTIxNDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5sMihhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSEIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjE1OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdtMigpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55SShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTY6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZFkoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmp4KGEpfSwKICRpc0VIOnRydWV9LAogZTIxNzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi55cShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouakIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjE4OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdraSgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nUzUoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMTk6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1puKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdEbygpfSwKICRpc0VIOnRydWV9LAogZTIyMDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5ndnMoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3VqKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjIxOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWaCgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5qMShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjI6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1pYKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkF3KGEpfSwKICRpc0VIOnRydWV9LAogZTIyMzp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5kNShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoubDIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjI0OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlNHKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nbTIoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjU6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY3MoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmRZKGEpfSwKICRpc0VIOnRydWV9LAogZTIyNjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVkYoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueXEoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjI3OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdrdygpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5na2koKX0sCiAkaXNFSDp0cnVlfSwKIGUyMjg6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSzIoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdabigpfSwKICRpc0VIOnRydWV9LAogZTIyOTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51eShhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3ZzKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjMwOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdFeSgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVmgoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzE6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWEooYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdaWCgpfSwKICRpc0VIOnRydWV9LAogZTIzMjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5QNChhKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUmcoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjMzOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdKaygpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5kNShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzQ6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouUTIoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlNHKGEpfSwKICRpc0VIOnRydWV9LAogZTIzNTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nU1UoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouY3MoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjM2OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdYQSgpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nVkYoKX0sCiAkaXNFSDp0cnVlfSwKIGUyMzc6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1lZKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdrdygpfSwKICRpc0VIOnRydWV9LAogZTIzODp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWjMoKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSzIoYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjM5OnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLnJ5KGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi51eShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDA6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouSTIoYSl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdFeSgpfSwKICRpc0VIOnRydWV9LAogZTI0MTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nZE4oKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouWEooYSl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQyOnsKLSJeIjoiVHA6MTM7IiwKLSQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLk5DKGEpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nalcoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDM6ewotIl4iOiJUcDoxMzsiLAotJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1YwKCl9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlA0KGEpfSwKICRpc0VIOnRydWV9LAogZTI0NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUlgoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0prKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQ1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5MOShhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5RMihhKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmw3KGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdTdSgpfSwKICRpc0VIOnRydWV9LAogZTI0Nzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oua0IoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1NVKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjQ4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5BZShhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gYS5nWEEoKX0sCiAkaXNFSDp0cnVlfSwKIGUyNDk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLklYKGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdZWSgpfSwKICRpc0VIOnRydWV9LAogZTI1MDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouRWQoYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1ozKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjUxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5ORShhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5yeShhKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLldJKGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLkkyKGEpfSwKICRpc0VIOnRydWV9LAogZTI1Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTlooYSxiKX0sCisiXiI6IlRwWjoxMzsiLAorJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ1RYKCl9LAogJGlzRUg6dHJ1ZX0sCiBlMjU0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5UNShhLGIpfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5OQyhhKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmkwKGEsYil9LAorIl4iOiJUcFo6MTM7IiwKKyQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmdWMCgpfSwKICRpc0VIOnRydWV9LAogZTI1Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouU2YoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlJYKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjU3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5MTShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTDkoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNTg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnFxKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5OVihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI1OTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQWMoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmw3KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjYwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5ZeihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oua0IoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNlaihiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkFlKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjYyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zdzIoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5JWChhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2Mzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUXIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkVkKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjY0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si54VyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTkUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLld5KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5XSShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouaTIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLk5aKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjY3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5CQyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouVDUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNjg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnBCKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5pMChhLGIpfSwKICRpc0VIOnRydWV9LAogZTI2OTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTk8oYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlNmKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjcwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5XQihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouSmwoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkpaKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5UUChhLGIpfSwKICRpc0VIOnRydWV9LAogZTI3Mjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouZlIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkxNKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjczOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zaFkoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5hdShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI3NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oudVAoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkFjKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjc1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si52SihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouWXooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyNzY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLk5mKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zZWooYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjc3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5QbChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc3cyKGIpfSwKICRpc0VIOnRydWV9LAogZTI3ODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQzMoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlFyKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjc5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si54SChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oueFcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLk5oKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5XeShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQUkoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmkyKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjgyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5uQShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouQkMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmZiKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5wQihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc2lxKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTk8oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyODU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlF5KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5XQihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4Njp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oueDAoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkpaKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjg3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zS3QoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5mUihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI4ODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouY1YoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnVQKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjg5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5tVShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudkooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkt6KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5OZihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oudU0oYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlBsKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjkyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5FcihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouQzMoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkdaKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5BSShhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouaFMoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLk9FKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMjk1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5teihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oubkEoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnBBKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5mYihhLGIpfSwKICRpc0VIOnRydWV9LAogZTI5Nzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc1NLKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc2lxKGIpfSwKICRpc0VIOnRydWV9LAogZTI5ODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc2hYKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUXkoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUyOTk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmNsKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si54MChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwMDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouSmIoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNLdChiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMDE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnhRKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5jVihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwMjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTVgoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLm1VKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzAzOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5BNChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudU0oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMDQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLndEKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5HWihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwNTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oud0ooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmhTKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzA2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5vSihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oubXooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMDc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkRGKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5wQShhLGIpfSwKICRpc0VIOnRydWV9LAogZTMwODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc3ZLKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc2hYKGIpfSwKICRpc0VIOnRydWV9LAogZTMwOTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouaDkoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmNsKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzEwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zTDEoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5RbChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMxMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouWEYoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnhRKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzEyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5TRihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTVgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlF2KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5BNChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMxNDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUjgoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLndEKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzE1OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5YZyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oud0ooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMTY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmF3KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5vSihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMxNzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQ0ooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkRGKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzE4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5QMihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc3ZLKGIpfSwKICRpc0VIOnRydWV9LAogZTMxOTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouZnYoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmg5KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzIwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5KMChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc0wxKGIpfSwKICRpc0VIOnRydWV9LAogZTMyMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUFAoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNFbChiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlNqKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zeEgoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzIzOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si50dihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouWEYoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnc3KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5BMShhLGIpfSwKICRpc0VIOnRydWV9LAogZTMyNTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouTUUoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlNGKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzI2OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5rWChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUXYoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMjc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnEwKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5SOChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMyODp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouRUooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlhnKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzI5OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5pSChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouYXcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlNPKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5DSihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQjkoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlAyKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzMyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5QTihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouSjAoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnNWYyhiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlBQKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzM0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5CeShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouU2ooYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmpkKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si50dihhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzNjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouUngoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnc3KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzM3OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5aSShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouTUUoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzMzg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLmZhKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5rWChhLGIpfSwKICRpc0VIOnRydWV9LAogZTMzOTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouQ3UoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnEwKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQwOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7YS5zVjgoYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5FSihhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0MTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouRUMoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmlIKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQyOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si5IbihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouU08oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLlR4KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5COShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc0RvKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouUE4oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXthLnN1aihiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNWYyhiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLkgzKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5CeShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM0Nzp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouVFooYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmpkKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzQ4OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7Si50MyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oudUgoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNDk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLm15KGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5aSShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1MDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe2Euc1ZGKGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0ouZmEoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNTE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnlPKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5DdShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1Mjp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0ouWlUoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnNWOChiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNTM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtKLnRRKGEsYil9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5FQyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1NDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oudEgoYSxiKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnhIKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzU1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjdXJseS1ibG9jayIsQy5MZyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si53dShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1Njp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgib2JzZXJ2YXRvcnktZWxlbWVudCIsQy5sNCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5UeChhLGIpfSwKICRpc0VIOnRydWV9LAogZTM1Nzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1yZWYiLEMuaWwpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc0RvKGIpfSwKICRpc0VIOnRydWV9LAogZTM1ODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW5zdGFuY2UtcmVmIixDLld6KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXthLnN1aihiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNTk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImFjdGlvbi1saW5rIixDLks0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLkgzKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzYwOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtYmFyIixDLkxUKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLlRaKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzYxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbWVudSIsQy5tcyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si50MyhhLGIpfSwKICRpc0VIOnRydWV9LAogZTM2Mjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LW1lbnUtaXRlbSIsQy5GQSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5teShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM2Mzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LXJlZnJlc2giLEMuSlcpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe2Euc1ZGKGIpfSwKICRpc0VIOnRydWV9LAogZTM2NDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LWNvbnRyb2wiLEMuTlcpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe0oueU8oYSxiKX0sCiAkaXNFSDp0cnVlfSwKIGUzNjU6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInRvcC1uYXYtbWVudSIsQy5NZil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si5aVShhLGIpfSwKICRpc0VIOnRydWV9LAogZTM2Njp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1uYXYtbWVudSIsQy5rbSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7YS5zalcoYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzY3OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJsaWJyYXJ5LW5hdi1tZW51IixDLnZ3KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLnRRKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBlMzY4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy1uYXYtbWVudSIsQy5FeSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7Si50SChhLGIpfSwKICRpc0VIOnRydWV9LAogZTM2OTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgibmF2LW5vdGlmeSIsQy5RdCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjdXJseS1ibG9jayIsQy5MZyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzcwOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbm90aWZ5LWl0ZW0iLEMuYTgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgib2JzZXJ2YXRvcnktZWxlbWVudCIsQy5sNCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzcxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJicmVha3BvaW50LWxpc3QiLEMueVMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1yZWYiLEMuaWwpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM3Mjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiY2xhc3MtcmVmIixDLk9HKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImluc3RhbmNlLXJlZiIsQy5Xeil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzczOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy10cmVlIixDLm53KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImFjdGlvbi1saW5rIixDLks0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzQ6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImV2YWwtYm94IixDLndrKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1iYXIiLEMuTFQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM3NTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZXZhbC1saW5rIixDLmpBKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1tZW51IixDLm1zKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzY6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZpZWxkLXJlZiIsQy5Kbyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbWVudS1pdGVtIixDLkZBKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzNzc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZ1bmN0aW9uLXJlZiIsQy5sRSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtcmVmcmVzaCIsQy5KVyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzc4OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJsaWJyYXJ5LXJlZiIsQy5scCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtY29udHJvbCIsQy5OVyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzc5OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzY3JpcHQtaW5zZXQiLEMuT04pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidG9wLW5hdi1tZW51IixDLk1mKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzODA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC1yZWYiLEMuU2IpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1uYXYtbWVudSIsQy5rbSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzgxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy12aWV3IixDLnhFKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktbmF2LW1lbnUiLEMudncpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4Mjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiY29kZS1yZWYiLEMub1QpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiY2xhc3MtbmF2LW1lbnUiLEMuRXkpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4Mzp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiY29kZS12aWV3IixDLmpSKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm5hdi1ub3RpZnkiLEMuUXQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4NDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZXJyb3ItdmlldyIsQy5LTyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJuYXYtbm90aWZ5LWl0ZW0iLEMuYTgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4NTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmllbGQtdmlldyIsQy5Beil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJicmVha3BvaW50LWxpc3QiLEMueVMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM4Njp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic3RhY2stZnJhbWUiLEMuTlIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiY2xhc3MtcmVmIixDLk9HKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzODc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZsYWctbGlzdCIsQy5CTCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy10cmVlIixDLm53KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzODg6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImZsYWctaXRlbSIsQy5WeCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJldmFsLWJveCIsQy53ayl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzg5OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmdW5jdGlvbi12aWV3IixDLnRlKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImV2YWwtbGluayIsQy5qQSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzkwOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJoZWFwLW1hcCIsQy5pRCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmaWVsZC1yZWYiLEMuSm8pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5MTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tdmlldyIsQy50VSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmdW5jdGlvbi1yZWYiLEMubEUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5Mjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcmVmIixDLkpmKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktcmVmIixDLmxwKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzOTM6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLWxpc3QtdmlldyIsQy5xRil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzY3JpcHQtaW5zZXQiLEMuT04pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5NDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItcmVmIixDLm5YKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNjcmlwdC1yZWYiLEMuU2IpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5NTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItdmlldyIsQy5aail9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjbGFzcy12aWV3IixDLm91KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzOTY6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLWNvbm5lY3Rpb24tdmlldyIsQy5XaCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjb2RlLXJlZiIsQy5vVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlMzk3OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci1jb25uZWN0aW9uLXJlZiIsQy5wRil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJjb2RlLXZpZXciLEMualIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTM5ODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tc29ja2V0LXJlZiIsQy5GRyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJlcnJvci12aWV3IixDLktPKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGUzOTk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXNvY2tldC1saXN0LXZpZXciLEMuRVopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmllbGQtdmlldyIsQy5Beil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDAwOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1zb2NrZXQtdmlldyIsQy5wSil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzdGFjay1mcmFtZSIsQy5OUil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDAxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby13ZWItc29ja2V0LXJlZiIsQy5ZeSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmbGFnLWxpc3QiLEMuUWIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwMjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8td2ViLXNvY2tldC1saXN0LXZpZXciLEMuREQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiZmxhZy1pdGVtIixDLlZ4KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDM6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXdlYi1zb2NrZXQtdmlldyIsQy5Ydil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJmdW5jdGlvbi12aWV3IixDLnRlKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDQ6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJhbmRvbS1hY2Nlc3MtZmlsZS1saXN0LXZpZXciLEMudGMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaGVhcC1tYXAiLEMuaUQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwNTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcmFuZG9tLWFjY2Vzcy1maWxlLXJlZiIsQy5yUil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby12aWV3IixDLnRVKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDY6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJhbmRvbS1hY2Nlc3MtZmlsZS12aWV3IixDLm9HKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXJlZiIsQy5KZil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDA3OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1wcm9jZXNzLWxpc3QtdmlldyIsQy5FcCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci1saXN0LXZpZXciLEMucUYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQwODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tcHJvY2Vzcy1yZWYiLEMuZEQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItcmVmIixDLnFaKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MDk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXByb2Nlc3MtdmlldyIsQy5oUCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1odHRwLXNlcnZlci12aWV3IixDLlpqKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtcmVmIixDLlVKKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLWh0dHAtc2VydmVyLWNvbm5lY3Rpb24tdmlldyIsQy5XaCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDExOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXN1bW1hcnkiLEMuQ1QpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8taHR0cC1zZXJ2ZXItY29ubmVjdGlvbi1yZWYiLEMucEYpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxMjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1ydW4tc3RhdGUiLEMuajQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8tc29ja2V0LXJlZiIsQy5GRyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDEzOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLWxvY2F0aW9uIixDLklvKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXNvY2tldC1saXN0LXZpZXciLEMuRVopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxNDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1zaGFyZWQtc3VtbWFyeSIsQy5FRyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1zb2NrZXQtdmlldyIsQy5wSil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDE1OnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLWNvdW50ZXItY2hhcnQiLEMuY2EpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8td2ViLXNvY2tldC1yZWYiLEMuWXkpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQxNjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS12aWV3IixDLm1xKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXdlYi1zb2NrZXQtbGlzdC12aWV3IixDLkREKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImluc3RhbmNlLXZpZXciLEMuTUkpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW8td2ViLXNvY2tldC12aWV3IixDLlh2KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTg6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImpzb24tdmlldyIsQy5UcSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1yYW5kb20tYWNjZXNzLWZpbGUtbGlzdC12aWV3IixDLnRjKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MTk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImxpYnJhcnktdmlldyIsQy5QVCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1yYW5kb20tYWNjZXNzLWZpbGUtcmVmIixDLnJSKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MjA6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImhlYXAtcHJvZmlsZSIsQy5KdSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1yYW5kb20tYWNjZXNzLWZpbGUtdmlldyIsQy5vRyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDIxOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzbGlkaW5nLWNoZWNrYm94IixDLlkzKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlvLXByb2Nlc3MtbGlzdC12aWV3IixDLmhlKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MjI6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtcHJvZmlsZSIsQy5jZSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1wcm9jZXNzLXJlZiIsQy5kRCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDIzOnsKLSJeIjoiVHA6NzE7IiwKLSQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzY3JpcHQtdmlldyIsQy5UaCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpby1wcm9jZXNzLXZpZXciLEMuaFApfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyNDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic3RhY2stdHJhY2UiLEMudnUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1yZWYiLEMuVUopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyNTp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tdmlldyIsQy5qSyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXN1bW1hcnkiLEMuQ1QpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyNjp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS12aWV3IixDLlg4KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtcnVuLXN0YXRlIixDLmo0KX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0Mjc6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoIm9ic2VydmF0b3J5LWFwcGxpY2F0aW9uIixDLkRsKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImlzb2xhdGUtbG9jYXRpb24iLEMuSW8pfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQyODp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2VydmljZS1leGNlcHRpb24tdmlldyIsQy5wSyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLXNoYXJlZC1zdW1tYXJ5IixDLkVHKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0Mjk6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNlcnZpY2UtZXJyb3ItdmlldyIsQy53SCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJpc29sYXRlLWNvdW50ZXItY2hhcnQiLEMuY2EpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZTQzMDp7Ci0iXiI6IlRwOjcxOyIsCi0kMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tY29ubmVjdC10YXJnZXQiLEMud3MpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS12aWV3IixDLm1xKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGU0MzE6ewotIl4iOiJUcDo3MTsiLAotJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInZtLWNvbm5lY3QiLEMuYkMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaW5zdGFuY2UtdmlldyIsQy5NSSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBlNDMyOnsKLSJeIjoiVHA6NzE7IiwKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgianNvbi12aWV3IixDLlRxKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0MzM6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJsaWJyYXJ5LXZpZXciLEMuUFQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQzNDp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoImhlYXAtcHJvZmlsZSIsQy5KdSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDM1OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic2xpZGluZy1jaGVja2JveCIsQy5ZMyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDM2OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgiaXNvbGF0ZS1wcm9maWxlIixDLmNlKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiskaXNFSDp0cnVlfSwKK2U0Mzc6eworIl4iOiJUcFo6NzI7IiwKKyQwOltmdW5jdGlvbigpe3JldHVybiBBLkFkKCJzY3JpcHQtdmlldyIsQy5UaCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDM4OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgic3RhY2stdHJhY2UiLEMudnUpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQzOTp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInZtLXZpZXciLEMuakspfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQ0MDp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNlcnZpY2UtdmlldyIsQy5YOCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQxOnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgib2JzZXJ2YXRvcnktYXBwbGljYXRpb24iLEMuRGwpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQ0Mjp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNlcnZpY2UtZXhjZXB0aW9uLXZpZXciLEMucEspfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQ0Mzp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInNlcnZpY2UtZXJyb3ItdmlldyIsQy53SCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitlNDQ0OnsKKyJeIjoiVHBaOjcyOyIsCiskMDpbZnVuY3Rpb24oKXtyZXR1cm4gQS5BZCgidm0tY29ubmVjdC10YXJnZXQiLEMud3MpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQ0NTp7CisiXiI6IlRwWjo3MjsiLAorJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInZtLWNvbm5lY3QiLEMuYkMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKKyRpc0VIOnRydWV9LAorZTQ0Njp7CisiXiI6IlRwWjo3MjsiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIEEuQWQoInZtLXJlZiIsQy5jSyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19LDFdLFsiYnJlYWtwb2ludF9saXN0X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9icmVha3BvaW50X2xpc3QuZGFydCIsLEIsewogIl4iOiIiLAogRzY6ewotIl4iOiJwdjtCVyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InB2O0JXLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdyczpmdW5jdGlvbihhKXtyZXR1cm4gYS5CV30sCiBzcnM6ZnVuY3Rpb24oYSxiKXthLkJXPXRoaXMuY3QoYSxDLlVYLGEuQlcsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkJXKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkJXKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntEdzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk13LlpMKGEpCiBDLk13LlhJKGEpCkBAIC00NDM4LDE2ICs0NTE3LDE2IEBACiAkaXNkMzp0cnVlfX1dLFsiY2xhc3NfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jbGFzc19yZWYuZGFydCIsLFEsewogIl4iOiIiLAogZVc6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7cnQ6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5ZWnouWkwoYSkKIEMuWVp6LlhJKGEpCkBAIC00NDcwLDEzICs0NTQ5LDEzIEBACiBvODpmdW5jdGlvbigpe30sCiBOaDpmdW5jdGlvbigpe3JldHVybiBKLnE4KEouTXgodGhpcy5SdSkpPjB9fSwKIGVvOnsKLSJeIjoiRHNkO0NBLEhtPSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IkRzZDtDQSxIbT0sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBhLkNBfSwKIHNvZDpmdW5jdGlvbihhLGIpe2EuQ0E9dGhpcy5jdChhLEMuckIsYS5DQSxiKX0sCiBFczpmdW5jdGlvbihhKXt2YXIgegogWi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCiB6PVIudEIoW10pCi1hLkhtPW5ldyBHLlhOKHosbnVsbCxudWxsKQorYS5IbT1uZXcgRy5pWSh6LG51bGwsbnVsbCkKIHo9YS5DQQogaWYoeiE9bnVsbCl0aGlzLmhQKGEsei5nRFooKSl9LAogR1U6W2Z1bmN0aW9uKGEsYil7YS5DQS5XUigpLm1sKG5ldyBPLm5jKGEpKX0sIiQxIiwiZ3V6IiwyLDAsMTMsNTddLApAQCAtNDQ5NywxMCArNDU3NiwxMCBAQAogYS5IbS5tQSh6KX1jYXRjaChxKXt3PUguUnUocSkKIHk9dwogeD1uZXcgSC5YTyhxLG51bGwpCi1OLlFNKCIiKS54SCgiX3VwZGF0ZSIseSx4KX1pZihKLnhDKEoucTgoYS5IbS52cCksMSkpYS5IbS5xVSgwKQorTi5RTSgiIikud0YoIl91cGRhdGUiLHkseCl9aWYoSi54QyhKLnE4KGEuSG0udnApLDEpKWEuSG0ucVUoMCkKIHRoaXMuY3QoYSxDLmVwLG51bGwsYS5IbSl9LAota2E6W2Z1bmN0aW9uKGEsYil7cmV0dXJuInBhZGRpbmctbGVmdDogIitiLmd5dCgpKjE2KyJweDsifSwiJDEiLCJnSG4iLDIsMCw5OSwxMDBdLAotTFo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEMuUUNbQy5qbi5ZKGIuZ3l0KCktMSw5KV19LCIkMSIsImdidyIsMiwwLDk5LDEwMF0sCitrYTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4icGFkZGluZy1sZWZ0OiAiK2IuZ3l0KCkqMTYrInB4OyJ9LCIkMSIsImdIbiIsMiwwLDEwMCwxMDFdLAorTFo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEMuUUNbQy5qbi5ZKGIuZ3l0KCktMSw5KV19LCIkMSIsImdidyIsMiwwLDEwMCwxMDFdLAogWUY6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdQogdz1KLlJFKGIpCiBpZighSi54QyhKLmVTKHcuZ04oYikpLCJleHBhbmQiKSYmIUoueEMody5nTihiKSxkKSlyZXR1cm4KQEAgLTQ1MTEsMTUgKzQ1OTAsMTUgQEAKIHcucVUodi0xKX1jYXRjaCh1KXt3PUguUnUodSkKIHk9dwogeD1uZXcgSC5YTyh1LG51bGwpCi1OLlFNKCIiKS54SCgidG9nZ2xlRXhwYW5kZWQiLHkseCl9fSwiJDMiLCJnd0oiLDYsMCwxMDEsMSwxMDIsMTAzXSwKK04uUU0oIiIpLndGKCJ0b2dnbGVFeHBhbmRlZCIseSx4KX19LCIkMyIsImd3SiIsNiwwLDEwMiwxLDEwMywxMDRdLAogc3RhdGljOntsMDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlJELlpMKGEpCiBDLlJELlhJKGEpCkBAIC00NTI4LDMzICs0NjA3LDMzIEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIG5jOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7Si5vRCh0aGlzLmEsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMDQsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe0oub0QodGhpcy5hLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTA1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiY2xhc3Nfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvY2xhc3Nfdmlldy5kYXJ0IiwsWix7CiAiXiI6IiIsCi1hQzp7Ci0iXiI6InR1ajt5QixuSixtTixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCithazp7CisiXiI6InR1ajt5QixuSixtTixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnUnU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueUJ9LAogc1J1OmZ1bmN0aW9uKGEsYil7YS55Qj10aGlzLmN0KGEsQy5YQSxhLnlCLGIpfSwKIGdXdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5uSn0sCiBzV3Q6ZnVuY3Rpb24oYSxiKXthLm5KPXRoaXMuY3QoYSxDLnlCLGEubkosYil9LAogZ0NGOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1OfSwKIHNDRjpmdW5jdGlvbihhLGIpe2EubU49dGhpcy5jdChhLEMudGcsYS5tTixiKX0sCi12VjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS55Qi5jdigiZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpfSwiJDEiLCJnWm0iLDIsMCwxMDUsMTA2XSwKLXRsOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJpbnN0YW5jZXM/bGltaXQ9IitILmQoYikpLm1sKG5ldyBaLkV6KGEpKX0sIiQxIiwiZ1IxIiwyLDAsMTA3LDEwOF0sCi1TMTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS55Qi5jdigicmV0YWluZWQiKS5tbChuZXcgWi5TUyhhKSl9LCIkMSIsImdoTiIsMiwwLDEwNywxMDldLAotcEE6W2Z1bmN0aW9uKGEsYil7YS5uSj10aGlzLmN0KGEsQy55QixhLm5KLG51bGwpCit2VjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS55Qi5jdigiZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpfSwiJDEiLCJnWm0iLDIsMCwxMDYsMTA3XSwKK3RsOltmdW5jdGlvbihhLGIpe3JldHVybiBhLnlCLmN2KCJpbnN0YW5jZXM/bGltaXQ9IitILmQoYikpLm1sKG5ldyBaLk9iKGEpKX0sIiQxIiwiZ1IxIiwyLDAsMTA4LDEwOV0sCitTMTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS55Qi5jdigicmV0YWluZWQiKS5tbChuZXcgWi5TUyhhKSl9LCIkMSIsImdoTiIsMiwwLDEwOCwxMTBdLAorU0s6W2Z1bmN0aW9uKGEsYil7YS5uSj10aGlzLmN0KGEsQy55QixhLm5KLG51bGwpCiBhLm1OPXRoaXMuY3QoYSxDLnRnLGEubU4sbnVsbCkKLUouY0koYS55QikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKLWo5OltmdW5jdGlvbihhLGIpe0ouZWcoYS55QikuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk4XSwKK0ouY0koYS55QikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK2o5OltmdW5jdGlvbihhLGIpe0ouZWcoYS55QikuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7bFc6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5rYS5aTChhKQogQy5rYS5YSShhKQpAQCAtNDU2MiwyMSArNDY0MSwyMSBAQAogdHVqOnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAotRXo6ewotIl4iOiJUcDoxMTA7YSIsCitPYjp7CisiXiI6IlRwWjoxMTE7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi16Lm5KPUouUTUoeixDLnlCLHoubkosYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MiwiY2FsbCJdLAorei5uSj1KLlE1KHosQy55Qix6Lm5KLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogU1M6ewotIl4iOiJUcDoxMTA7YSIsCisiXiI6IlRwWjoxMTE7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLmEKIHk9SC5CVShKLlVRKGEsInZhbHVlQXNTdHJpbmciKSxudWxsLG51bGwpCi16Lm1OPUouUTUoeixDLnRnLHoubU4seSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MiwiY2FsbCJdLAorei5tTj1KLlE1KHosQy50Zyx6Lm1OLHkpfSwiJDEiLG51bGwsMiwwLG51bGwsOTMsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJjb2RlX3JlZl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvY29kZV9yZWYuZGFydCIsLE8sewogIl4iOiIiLAogVlk6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd0VDpmdW5jdGlvbihhKXtyZXR1cm4gYS50WX0sCiBhVjpbZnVuY3Rpb24oYSxiKXtRLnhJLnByb3RvdHlwZS5hVi5jYWxsKHRoaXMsYSxiKQogdGhpcy5jdChhLEMuaTQsMCwxKX0sIiQxIiwiZ0xlIiwyLDAsMTMsNTddLApAQCAtNDU4NSwyNSArNDY2NCwyNSBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnRXTy5aTChhKQogQy50V08uWEkoYSkKIHJldHVybiBhfX19fV0sWyJjb2RlX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2NvZGVfdmlldy5kYXJ0IiwsRix7CiAiXiI6IiIsCiBCZTp7Ci0iXiI6IlZjdDtYeCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlZjdDtYeCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBndFQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWHh9LAogc3RUOmZ1bmN0aW9uKGEsYil7YS5YeD10aGlzLmN0KGEsQy5pNCxhLlh4LGIpfSwKIEVzOmZ1bmN0aW9uKGEpe3ZhciB6CiBaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIHo9YS5YeAogaWYoej09bnVsbClyZXR1cm4KLUouU0soeikubWwobmV3IEYuQmMoKSl9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlh4KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorSi5TSyh6KS5tbChuZXcgRi5QOSgpKX0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuWHgpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBiMDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogej1KLlZzKGIpLk1XLmdldEF0dHJpYnV0ZSgiZGF0YS1qdW1wLXRhcmdldCIpCiBpZih6PT09IiIpcmV0dXJuCkBAIC00NjEzLDE4ICs0NjkyLDE4IEBACiByZXR1cm4geH0sCiBZSTpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9dGhpcy5iMChhLGQpCiBpZih6PT1udWxsKXJldHVybgotSi5wUCh6KS5oKDAsImhpZ2hsaWdodCIpfSwiJDMiLCJnZmYiLDYsMCwxMTEsMSwxMDIsMTAzXSwKK0ouVWYoeikuaCgwLCJoaWdobGlnaHQiKX0sIiQzIiwiZ2ZmIiw2LDAsMTEyLDEsMTAzLDEwNF0sCiBMazpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9dGhpcy5iMChhLGQpCiBpZih6PT1udWxsKXJldHVybgotSi5wUCh6KS5SeigwLCJoaWdobGlnaHQiKX0sIiQzIiwiZ0FGIiw2LDAsMTExLDEsMTAyLDEwM10sCi1zdGF0aWM6e2Y5OmZ1bmN0aW9uKGEpe3ZhciB6LHkKK0ouVWYoeikuUnooMCwiaGlnaGxpZ2h0Iil9LCIkMyIsImdBRiIsNiwwLDExMiwxLDEwMywxMDRdLAorc3RhdGljOntmbTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnV4LlpMKGEpCiBDLnV4LlhJKGEpCkBAIC00NjMyLDE1ICs0NzExLDE1IEBACiBWY3Q6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCi1CYzp7Ci0iXiI6IlRwOjExMjsiLAotJDE6W2Z1bmN0aW9uKGEpe2EuT0YoKX0sIiQxIixudWxsLDIsMCxudWxsLDgzLCJjYWxsIl0sCitQOTp7CisiXiI6IlRwWjoxMTM7IiwKKyQxOltmdW5jdGlvbihhKXthLk9GKCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4NCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImN1cmx5X2Jsb2NrX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jdXJseV9ibG9jay5kYXJ0IiwsUix7CiAiXiI6IiIsCiBKSTp7Ci0iXiI6IlNhTTtHVix1byxueCxvTSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCi1nb0U6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuR1Z9LAotc29FOmZ1bmN0aW9uKGEsYil7YS5HVj10aGlzLmN0KGEsQy5tcixhLkdWLGIpfSwKKyJeIjoiU2FNO3RILHVvLG54LG9NLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKK2dvRTpmdW5jdGlvbihhKXtyZXR1cm4gYS50SH0sCitzb0U6ZnVuY3Rpb24oYSxiKXthLnRIPXRoaXMuY3QoYSxDLm1yLGEudEgsYil9LAogZ3Y4OmZ1bmN0aW9uKGEpe3JldHVybiBhLnVvfSwKIHN2ODpmdW5jdGlvbihhLGIpe2EudW89dGhpcy5jdChhLEMuUzQsYS51byxiKX0sCiBnRlI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubnh9LApAQCAtNDY1MCwyNyArNDcyOSwyNyBAQAogZ2l0OmZ1bmN0aW9uKGEpe3JldHVybiBhLm9NfSwKIHNpdDpmdW5jdGlvbihhLGIpe2Eub009dGhpcy5jdChhLEMuQjAsYS5vTSxiKX0sCiB0bjpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLm9NCi1hLkdWPXRoaXMuY3QoYSxDLm1yLGEuR1Yseil9LCIkMSIsImdoeSIsMiwwLDIwLDU3XSwKLURiOltmdW5jdGlvbihhKXt2YXIgej1hLkdWCi1hLkdWPXRoaXMuY3QoYSxDLm1yLHoseiE9PSEwKQorYS50SD10aGlzLmN0KGEsQy5tcixhLnRILHopfSwiJDEiLCJnaHkiLDIsMCwyMCw1N10sCitXTTpbZnVuY3Rpb24oYSl7dmFyIHo9YS50SAorYS50SD10aGlzLmN0KGEsQy5tcix6LHohPT0hMCkKIGEudW89dGhpcy5jdChhLEMuUzQsYS51bywhMSl9LCIkMCIsImdOMiIsMCwwLDE4XSwKIGNiOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1hLnVvCiBpZih6PT09ITApcmV0dXJuCiBpZihhLm54IT1udWxsKXthLnVvPXRoaXMuY3QoYSxDLlM0LHosITApCi10aGlzLkFWKGEsYS5HViE9PSEwLHRoaXMuZ04yKGEpKX1lbHNle3o9YS5HVgotYS5HVj10aGlzLmN0KGEsQy5tcix6LHohPT0hMCl9fSwiJDMiLCJnREkiLDYsMCw4Miw0Niw0Nyw4M10sCit0aGlzLkFWKGEsYS50SCE9PSEwLHRoaXMuZ04yKGEpKX1lbHNle3o9YS50SAorYS50SD10aGlzLmN0KGEsQy5tcix6LHohPT0hMCl9fSwiJDMiLCJnREkiLDYsMCw4Myw0Niw0Nyw4NF0sCiBzdGF0aWM6e29TOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuR1Y9ITEKK2EudEg9ITEKIGEudW89ITEKIGEubng9bnVsbAogYS5vTT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5PMC5aTChhKQogQy5PMC5YSShhKQpAQCAtNDY4MCwxMiArNDc1OSwxMiBAQAogJGlzZDM6dHJ1ZX19XSxbImRhcnQuX2ludGVybmFsIiwiZGFydDpfaW50ZXJuYWwiLCxILHsKICJeIjoiIiwKIGJROmZ1bmN0aW9uKGEsYil7dmFyIHoKLWZvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILktwKGEsMCldKTt6LkcoKTspYi4kMSh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5PcShhLDApXSk7ei5HKCk7KWIuJDEoei5sbyl9LAogQ2s6ZnVuY3Rpb24oYSxiKXt2YXIgegotZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guS3AoYSwwKV0pO3ouRygpOylpZihiLiQxKHoubG8pPT09ITApcmV0dXJuITAKK2Zvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILk9xKGEsMCldKTt6LkcoKTspaWYoYi4kMSh6LmxvKT09PSEwKXJldHVybiEwCiByZXR1cm4hMX0sCi1GejpmdW5jdGlvbihhLGIsYyl7dmFyIHoKLWZvcih6PUguVk0obmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpLFtILktwKGEsMCldKTt6LkcoKTspYj1jLiQyKGIsei5sbykKK24zOmZ1bmN0aW9uKGEsYixjKXt2YXIgegorZm9yKHo9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guT3EoYSwwKV0pO3ouRygpOyliPWMuJDIoYix6LmxvKQogcmV0dXJuIGJ9LAogQXA6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiB6PVtdCkBAIC00NzA2LDcgKzQ3ODUsNyBAQAogaWYoei5DKGMsYil8fHouRChjLGEubGVuZ3RoKSl0aHJvdyBILmIoUC5URShjLGIsYS5sZW5ndGgpKX0sCiBxRzpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6LHkseCx3CiBILnhGKGEsYixjKQotej1KLmJJKGMsYikKK3o9Si5IbihjLGIpCiBpZihKLnhDKHosMCkpcmV0dXJuCiBpZihKLnU2KGUsMCkpdGhyb3cgSC5iKFAudShlKSkKIHk9Si54KGQpCkBAIC00NzI4LDcgKzQ4MDcsNyBAQAogSC5xRyhhLGIreSx4LGEsYikKIGZvcih6PXouZ0EoYyk7ei5HKCk7Yj13KXt3PWIrMQogQy5ObS51KGEsYix6LmdsKCkpfX0sCi1RYjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseQorbmE6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIGlmKGI8MHx8Yj5hLmxlbmd0aCl0aHJvdyBILmIoUC5URShiLDAsYS5sZW5ndGgpKQogZm9yKHo9Si5tWShjKTt6LkcoKTtiPXkpe3k9YisxCiBDLk5tLnUoYSxiLHouZ2woKSl9fSwKQEAgLTQ3MzYsNyArNDgxNSw3IEBACiBhcjpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5saigiVG9vIGZldyBlbGVtZW50cyIpfSwKIHRiOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoseSx4LHcsdgogej1KLld4KGIpCi1pZih6LkMoYixkKSlmb3IoeT1KLmJJKHouZyhiLGUpLDEpLHg9Si5iSShKLmV3KGQsZSksMSksej1KLlU2KGEpO3c9Si5XeCh5KSx3LkYoeSxiKTt5PXcuVyh5LDEpLHg9Si5iSSh4LDEpKUMuTm0udShjLHgsei50KGEseSkpCitpZih6LkMoYixkKSlmb3IoeT1KLkhuKHouZyhiLGUpLDEpLHg9Si5IbihKLmV3KGQsZSksMSksej1KLlU2KGEpO3c9Si5XeCh5KSx3LkYoeSxiKTt5PXcuVyh5LDEpLHg9Si5Ibih4LDEpKUMuTm0udShjLHgsei50KGEseSkpCiBlbHNlIGZvcih3PUouVTYoYSkseD1kLHk9Yjt2PUouV3goeSksdi5DKHksei5nKGIsZSkpO3k9di5nKHksMSkseD1KLmV3KHgsMSkpQy5ObS51KGMseCx3LnQoYSx5KSl9LAogVEs6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoKIGlmKGM+PWEubGVuZ3RoKXJldHVybi0xCkBAIC00NzUwLDcgKzQ4MjksNyBAQAogZm9yKHk9Yzt5Pj0wOy0teSl7aWYoeT49YS5sZW5ndGgpcmV0dXJuIEguZShhLHkpCiBpZihKLnhDKGFbeV0sYikpcmV0dXJuIHl9cmV0dXJuLTF9LAogWkU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYy1iPD0zMilILnc5KGEsYixjLGQpCi1lbHNlIEgud1IoYSxiLGMsZCl9LAorZWxzZSBILlpEKGEsYixjLGQpfSwKIHc5OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYKIGZvcih6PWIrMSx5PUouVTYoYSk7ejw9YzsrK3ope3g9eS50KGEseikKIHc9egpAQCAtNDc1OCw3ICs0ODM3LDcgQEAKIHY9dy0xCiB5LnUoYSx3LHkudChhLHYpKQogdz12fXkudShhLHcseCl9fSwKLXdSOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlCitaRDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZQogej1DLmpuLmNVKGMtYisxLDYpCiB5PWIregogeD1jLXoKQEAgLTQ4NjEsNyArNDk0MCw3IEBACiBpZih6IT09dGhpcy5nQih0aGlzKSl0aHJvdyBILmIoUC5hNCh0aGlzKSl9fSwKIGdsMDpmdW5jdGlvbihhKXtyZXR1cm4gSi54Qyh0aGlzLmdCKHRoaXMpLDApfSwKIGdyWjpmdW5jdGlvbihhKXtpZihKLnhDKHRoaXMuZ0IodGhpcyksMCkpdGhyb3cgSC5iKEguRFUoKSkKLXJldHVybiB0aGlzLlp2KDAsSi5iSSh0aGlzLmdCKHRoaXMpLDEpKX0sCityZXR1cm4gdGhpcy5adigwLEouSG4odGhpcy5nQih0aGlzKSwxKSl9LAogdGc6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PXRoaXMuZ0IodGhpcykKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIEgucyh6KQpAQCAtNDg5Myw3ICs0OTcyLDcgQEAKIHcudk0rPXR5cGVvZiB1PT09InN0cmluZyI/dTpILmQodSkKIGlmKHohPT10aGlzLmdCKHRoaXMpKXRocm93IEguYihQLmE0KHRoaXMpKX1yZXR1cm4gdy52TX19LAogYWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5tVy5wcm90b3R5cGUuYWQuY2FsbCh0aGlzLHRoaXMsYil9LAotZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguQTgodGhpcyxiKSxbbnVsbCxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImtZIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiSm0iLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwiYUwiKX0sMzFdLAorZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguQTgodGhpcyxiKSxbbnVsbCxudWxsXSl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6ImtZIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiSzYiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwiYUwiKX0sMzFdLAogZXM6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogej10aGlzLmdCKHRoaXMpCiBpZih0eXBlb2YgeiE9PSJudW1iZXIiKXJldHVybiBILnMoeikKQEAgLTQ5NDAsOCArNTAxOSw4IEBACiB5PXRoaXMuU0gKIGlmKEouSjUoeSx6KSlyZXR1cm4gMAogeD10aGlzLkFOCi1pZih4PT1udWxsfHxKLko1KHgseikpcmV0dXJuIEouYkkoeix5KQotcmV0dXJuIEouYkkoeCx5KX0sCitpZih4PT1udWxsfHxKLko1KHgseikpcmV0dXJuIEouSG4oeix5KQorcmV0dXJuIEouSG4oeCx5KX0sCiBadjpmdW5jdGlvbihhLGIpe3ZhciB6PUouZXcodGhpcy5nalgoKSxiKQogaWYoSi51NihiLDApfHxKLko1KHosdGhpcy5nTWEoKSkpdGhyb3cgSC5iKFAuVEUoYiwwLHRoaXMuZ0IodGhpcykpKQogcmV0dXJuIEouaTkodGhpcy5sNix6KX0sCkBAIC00OTg2LDcgKzUwNjUsNyBAQAogcmV0dXJuIHp9LAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucTgodGhpcy5sNil9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiBKLkZOKHRoaXMubDYpfSwKLWdyWjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5tYihKLk1RKHRoaXMubDYpKX0sCitnclo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubWIoSi51WSh0aGlzLmw2KSl9LAogJGFzbVc6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYl19LAogJGFzUVY6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYl19LAogc3RhdGljOntLMTpmdW5jdGlvbihhLGIsYyxkKXtpZighIUoueChhKS4kaXN5TilyZXR1cm4gSC5WTShuZXcgSC54eShhLGIpLFtjLGRdKQpAQCAtNTA5NSwxNiArNTE3NCwxNiBAQAogeD15LmdCKHopCiBpZih0eXBlb2YgYiE9PSJudW1iZXIiKXJldHVybiBILnMoYikKIHJldHVybiB5Llp2KHoseC0xLWIpfX0sCi1JTjp7Cit0eDp7CiAiXiI6ImE7Zk4+IiwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCi1yZXR1cm4hIUoueChiKS4kaXNJTiYmSi54Qyh0aGlzLmZOLGIuZk4pfSwKK3JldHVybiEhSi54KGIpLiRpc3R4JiZKLnhDKHRoaXMuZk4sYi5mTil9LAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6PUoudjEodGhpcy5mTikKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIEgucyh6KQogcmV0dXJuIDUzNjg3MDkxMSY2NjQ1OTcqen0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iU3ltYm9sKFwiIitILmQodGhpcy5mTikrIlwiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJTeW1ib2woXCIiK0guZCh0aGlzLmZOKSsiXCIpIn0sIiQwIiwiZ0FZIiwwLDAsNzJdLAorJGlzdHg6dHJ1ZSwKICRpc0lOOnRydWUsCi0kaXNHRDp0cnVlLAogc3RhdGljOnsiXiI6IlJXaixFUzEscXVQLEtHUCxlRCxmYlYifX19XSxbImRhcnQuX2pzX25hbWVzIiwiZGFydDpfanNfbmFtZXMiLCxILHsKICJeIjoiIiwKIGtVOmZ1bmN0aW9uKGEpe3ZhciB6PUguVk0oZnVuY3Rpb24oYixjKXt2YXIgeT1bXQpAQCAtNTEzMiw3ICs1MjExLDcgQEAKIHouZD1udWxsCiB6LmU9bnVsbAogeT1uZXcgUC5tUSh6LGIpCi1mb3IoeD1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5LcChhLDApXSk7eC5HKCk7KXgubG8uUngobmV3IFAuVHcoeixiLHouYysrKSx5KQorZm9yKHg9SC5WTShuZXcgSC5hNyhhLGEubGVuZ3RoLDAsbnVsbCksW0guT3EoYSwwKV0pO3guRygpOyl4LmxvLlJ4KG5ldyBQLlR3KHosYix6LmMrKykseSkKIHk9ei5jCiBpZih5PT09MClyZXR1cm4gUC5BYihDLmRuLG51bGwpCiB3PUFycmF5KHkpCkBAIC01MTQ4LDIyICs1MjI3LDIyIEBACiAkLlM2PXp9JC5rOD1udWxsfSwKIEJHOltmdW5jdGlvbigpe3ZhciB6CiB0cnl7UC5DeCgpfWNhdGNoKHope0guUnUoeikKLSQuZWooKS4kMShQLnFaKCkpCiskLmVqKCkuJDEoUC55SygpKQogJC5TNj0kLlM2LmdhdygpCi10aHJvdyB6fX0sIiQwIiwicVoiLDAsMCwxOF0sCit0aHJvdyB6fX0sIiQwIiwieUsiLDAsMCwxOF0sCiBJQTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PSQuazgKIGlmKHo9PW51bGwpe3o9bmV3IFAuT00oYSxudWxsKQogJC5rOD16CiAkLlM2PXoKLSQuZWooKS4kMShQLnFaKCkpfWVsc2V7eT1uZXcgUC5PTShhLG51bGwpCiskLmVqKCkuJDEoUC55SygpKX1lbHNle3k9bmV3IFAuT00oYSxudWxsKQogei5hdz15CiAkLms4PXl9fSwKIHJiOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZihKLnhDKCQuWDMsQy5OVSkpeyQuWDMud3IoYSkKIHJldHVybn16PSQuWDMKIHoud3Ioei54aShhLCEwKSl9LAoteDI6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiBlP0guVk0obmV3IFAuTXYoYixjLGQsYSxudWxsLDAsbnVsbCksW2ZdKTpILlZNKG5ldyBQLnExKGIsYyxkLGEsbnVsbCwwLG51bGwpLFtmXSl9LAorSFQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiBlP0guVk0obmV3IFAuTXYoYixjLGQsYSxudWxsLDAsbnVsbCksW2ZdKTpILlZNKG5ldyBQLnExKGIsYyxkLGEsbnVsbCwwLG51bGwpLFtmXSl9LAogYks6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoKIGlmKGMpe3o9SC5WTShuZXcgUC56VyhiLGEsMCxudWxsLG51bGwsbnVsbCxudWxsKSxbZF0pCiB6LlNKPXoKQEAgLTUxNzgsNyArNTI1Nyw3IEBACiB5PXYKIHg9bmV3IEguWE8odyxudWxsKQogJC5YMy5oayh5LHgpfX0sCi1TTjpbZnVuY3Rpb24oYSl7fSwiJDEiLCJBeCIsMiwwLDIwLDIxXSwKK0hDOltmdW5jdGlvbihhKXt9LCIkMSIsIkM3IiwyLDAsMjAsMjFdLAogU1o6W2Z1bmN0aW9uKGEsYil7JC5YMy5oayhhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gUC5TWihhLG51bGwpfSxudWxsLCIkMiIsIiQxIiwiWHEiLDIsMiwyMiwyMywyNCwyNV0sCiBkTDpbZnVuY3Rpb24oKXt9LCIkMCIsInYzIiwwLDAsMThdLAogRkU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3CkBAIC01MjA4LDExICs1Mjg3LDExIEBACiB6PVAuVXMoYykKIHRyeXt5PWQuJDAoKQogcmV0dXJuIHl9ZmluYWxseXskLlgzPXp9fSwiJDQiLCJsdyIsOCwwLDMwLDI3LDI4LDI5LDMxXSwKLXl2OltmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6LHkKK1Y3OltmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6LHkKIGlmKEoueEMoJC5YMyxjKSlyZXR1cm4gZC4kMShlKQogej1QLlVzKGMpCiB0cnl7eT1kLiQxKGUpCi1yZXR1cm4geX1maW5hbGx5eyQuWDM9en19LCIkNSIsIlVuIiwxMCwwLDMyLDI3LDI4LDI5LDMxLDMzXSwKK3JldHVybiB5fWZpbmFsbHl7JC5YMz16fX0sIiQ1IiwiTU0iLDEwLDAsMzIsMjcsMjgsMjksMzEsMzNdLAogTXU6W2Z1bmN0aW9uKGEsYixjLGQsZSxmKXt2YXIgeix5CiBpZihKLnhDKCQuWDMsYykpcmV0dXJuIGQuJDIoZSxmKQogej1QLlVzKGMpCkBAIC01MjIzLDE0ICs1MzAyLDE0IEBACiB3NjpbZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGR9LCIkNCIsImw5Iiw4LDAsMzcsMjcsMjgsMjksMzFdLAogVGs6W2Z1bmN0aW9uKGEsYixjLGQpe1AuSUEoQy5OVSE9PWM/Yy5jZShkKTpkKX0sIiQ0IiwiRzIiLDgsMCwzOF0sCiBoODpbZnVuY3Rpb24oYSxiLGMsZCxlKXtyZXR1cm4gUC5qTChkLEMuTlUhPT1jP2MuY2UoZSk6ZSl9LCIkNSIsIkxtIiwxMCwwLDM5LDI3LDI4LDI5LDQwLDQxXSwKLVhCOltmdW5jdGlvbihhLGIsYyxkKXtILnF3KGQpfSwiJDQiLCJhVyIsOCwwLDQyXSwKK1hCOltmdW5jdGlvbihhLGIsYyxkKXtILnF3KGQpfSwiJDQiLCJvUSIsOCwwLDQyXSwKIENJOltmdW5jdGlvbihhKXtKLndsKCQuWDMsYSl9LCIkMSIsImp0IiwyLDAsNDNdLAotVUE6W2Z1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHoKK0UxOltmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6CiAkLm9LPVAuanQoKQogej1QLllNKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKLXJldHVybiBuZXcgUC51byhjLGQseil9LCIkNSIsIklzIiwxMCwwLDQ0XSwKK3JldHVybiBuZXcgUC51byhjLGQseil9LCIkNSIsIkFrIiwxMCwwLDQ0XSwKIEM2OnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOltmdW5jdGlvbigpe0guY3YoKQogdGhpcy5hLiQwKCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCkBAIC01MjU5LDExICs1MzM4LDExIEBACiByZXR1cm4oeiY0KSE9PTB9LAogdU86W2Z1bmN0aW9uKCl7fSwiJDAiLCJncDQiLDAsMCwxOF0sCiBMUDpbZnVuY3Rpb24oKXt9LCIkMCIsImdaOSIsMCwwLDE4XSwKLXN0YXRpYzp7Il4iOiJFMmIsUkcsVkNkIn19LAorc3RhdGljOnsiXiI6IkUyYixIQ0ssVkNkIn19LAogV1Z1OnsKICJeIjoiYTtpRUAsU0pAIiwKIGdVRjpmdW5jdGlvbigpe3JldHVybiExfSwKLWltOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy55eAorU0w6ZnVuY3Rpb24oKXt2YXIgej10aGlzLnl4CiBpZih6IT1udWxsKXJldHVybiB6CiB6PVAuRHQobnVsbCkKIHRoaXMueXg9egpAQCAtNTMwMiwyNCArNTM4MSwyNCBAQAogcTc6ZnVuY3Rpb24oKXtpZigodGhpcy5HdiY0KSE9PTApcmV0dXJuIG5ldyBQLmxqKCJDYW5ub3QgYWRkIG5ldyBldmVudHMgYWZ0ZXIgY2FsbGluZyBjbG9zZSIpCiByZXR1cm4gbmV3IFAubGooIkNhbm5vdCBhZGQgbmV3IGV2ZW50cyB3aGlsZSBkb2luZyBhbiBhZGRTdHJlYW0iKX0sCiBoOltmdW5jdGlvbihhLGIpe2lmKHRoaXMuR3Y+PTQpdGhyb3cgSC5iKHRoaXMucTcoKSkKLXRoaXMuSXYoYil9LCIkMSIsImdodCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6InlkIix2b2lkOnRydWUsYXJnczpbYV19fSx0aGlzLiRyZWNlaXZlciwiV1Z1Iil9LDExM10sCit0aGlzLkl2KGIpfSwiJDEiLCJnaHQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJ5ZCIsdm9pZDp0cnVlLGFyZ3M6W2FdfX0sdGhpcy4kcmVjZWl2ZXIsIldWdSIpfSwxMTRdLAoganM6W2Z1bmN0aW9uKGEsYil7aWYodGhpcy5Hdj49NCl0aHJvdyBILmIodGhpcy5xNygpKQotdGhpcy5wYihhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qcyhhLG51bGwpfSwiSlQiLCIkMiIsIiQxIiwiZ0dqIiwyLDIsMTE0LDIzLDI0LDI1XSwKK3RoaXMucGIoYSxiKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuanMoYSxudWxsKX0sIkpUIiwiJDIiLCIkMSIsImdHaiIsMiwyLDExNSwyMywyNCwyNV0sCiB4TzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuR3YKIGlmKCh6JjQpIT09MClyZXR1cm4gdGhpcy55eAogaWYoej49NCl0aHJvdyBILmIodGhpcy5xNygpKQogdGhpcy5Hdj16fDQKLXk9dGhpcy5pbSgpCi10aGlzLkR1KCkKK3k9dGhpcy5TTCgpCit0aGlzLlNZKCkKIHJldHVybiB5fSwKIFJnOmZ1bmN0aW9uKGEsYil7dGhpcy5JdihiKX0sCiBvSjpmdW5jdGlvbihhLGIpe3RoaXMucGIoYSxiKX0sCiBRajpmdW5jdGlvbigpe3ZhciB6PXRoaXMuV1gKIHRoaXMuV1g9bnVsbAogdGhpcy5HdiY9NDI5NDk2NzI4NwotQy5iUC50Wih6KX0sCi1GVzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdworQy5qTi50Wih6KX0sCitRejpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej10aGlzLkd2CiBpZigoeiYyKSE9PTApdGhyb3cgSC5iKFAudygiQ2Fubm90IGZpcmUgbmV3IGV2ZW50LiBDb250cm9sbGVyIGlzIGFscmVhZHkgZmlyaW5nIGFuIGV2ZW50IikpCiB5PXRoaXMuaUUKQEAgLTUzNDksMjMgKzU0MjgsMjMgQEAKIHRoaXMuaUUuUmcoMCxhKQogdGhpcy5HdiY9NDI5NDk2NzI5MwogaWYodGhpcy5pRT09PXRoaXMpdGhpcy5PZigpCi1yZXR1cm59dGhpcy5GVyhuZXcgUC50Syh0aGlzLGEpKX0sCityZXR1cm59dGhpcy5ReihuZXcgUC50Syh0aGlzLGEpKX0sCiBwYjpmdW5jdGlvbihhLGIpe2lmKHRoaXMuaUU9PT10aGlzKXJldHVybgotdGhpcy5GVyhuZXcgUC5PUih0aGlzLGEsYikpfSwKLUR1OmZ1bmN0aW9uKCl7aWYodGhpcy5pRSE9PXRoaXMpdGhpcy5GVyhuZXcgUC53eih0aGlzKSkKK3RoaXMuUXoobmV3IFAuT1IodGhpcyxhLGIpKX0sCitTWTpmdW5jdGlvbigpe2lmKHRoaXMuaUUhPT10aGlzKXRoaXMuUXoobmV3IFAuQmcodGhpcykpCiBlbHNlIHRoaXMueXguT0gobnVsbCl9fSwKIHRLOnsKLSJeIjoiVHA7YSxiIiwKKyJeIjoiVHBaO2EsYiIsCiAkMTpmdW5jdGlvbihhKXthLlJnKDAsdGhpcy5iKX0sCiAkaXNFSDp0cnVlLAogJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJLWCIsYXJnczpbW1AuS0EsYV1dfX0sdGhpcy5hLCJ6VyIpfX0sCiBPUjp7Ci0iXiI6IlRwO2EsYixjIiwKKyJeIjoiVHBaO2EsYixjIiwKICQxOmZ1bmN0aW9uKGEpe2Eub0oodGhpcy5iLHRoaXMuYyl9LAogJGlzRUg6dHJ1ZSwKICRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiS1giLGFyZ3M6W1tQLktBLGFdXX19LHRoaXMuYSwielciKX19LAotd3o6ewotIl4iOiJUcDthIiwKK0JnOnsKKyJeIjoiVHBaO2EiLAogJDE6ZnVuY3Rpb24oYSl7YS5RaigpfSwKICRpc0VIOnRydWUsCiAkc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6Ik1jIixhcmdzOltbUC5MUixhXV19fSx0aGlzLmEsInpXIil9fSwKQEAgLTUzNzcsMTQgKzU0NTYsMTQgQEAKIHoudzYoeSl9fSwKIHBiOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGZvcih6PXRoaXMuaUU7eiE9PXRoaXM7ej16LmdpRSgpKXoudzYobmV3IFAuRG4oYSxiLG51bGwpKX0sCi1EdTpmdW5jdGlvbigpe3ZhciB6PXRoaXMuaUUKK1NZOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5pRQogaWYoeiE9PXRoaXMpZm9yKDt6IT09dGhpczt6PXouZ2lFKCkpei53NihDLlpCKQogZWxzZSB0aGlzLnl4Lk9IKG51bGwpfX0sCiBiODp7CiAiXiI6ImE7IiwKICRpc2I4OnRydWV9LAogdzQ6ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe3ZhciB6LHkseCx3CiB0cnl7dGhpcy5iLnJYKHRoaXMuYS4kMCgpKX1jYXRjaCh4KXt3PUguUnUoeCkKIHo9dwpAQCAtNTM5Miw3ICs1NDcxLDcgQEAKIHRoaXMuYi5LNSh6LHkpfX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG1ROnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpbZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIHo9dGhpcy5hCiB5PXouYgpAQCAtNTQwMCwxMCArNTQ3OSwxMCBAQAogeD0tLXouYwogaWYoeSE9bnVsbClpZih4PT09MHx8dGhpcy5iKXouYS53MChhLGIpCiBlbHNle3ouZD1hCi16LmU9Yn1lbHNlIGlmKHg9PT0wJiYhdGhpcy5iKXouYS53MCh6LmQsei5lKX0sIiQyIixudWxsLDQsMCxudWxsLDExNSwxMTYsImNhbGwiXSwKK3ouZT1ifWVsc2UgaWYoeD09PTAmJiF0aGlzLmIpei5hLncwKHouZCx6LmUpfSwiJDIiLG51bGwsNCwwLG51bGwsMTE2LDExNywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBUdzp7Ci0iXiI6IlRwOjExNzthLGMsZCIsCisiXiI6IlRwWjoxMTg7YSxjLGQiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuYQogeT0tLXouYwpAQCAtNTQxNSwyMiArNTQ5NCwyMiBAQAogaWYoei5HdiE9PTApSC52aChQLncoIkZ1dHVyZSBhbHJlYWR5IGNvbXBsZXRlZCIpKQogei5PSCh4KX19ZWxzZSBpZih5PT09MCYmIXRoaXMuYyl6LmEudzAoei5kLHouZSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1BRTp7CitBNTp7CiAiXiI6ImE7IiwKLSRpc0FFOnRydWV9LAorJGlzQTU6dHJ1ZX0sCiBQZjA6ewogIl4iOiJhOyIsCi0kaXNBRTp0cnVlfSwKKyRpc0E1OnRydWV9LAogWmY6ewogIl4iOiJQZjA7TU0iLAogajM6W2Z1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5NTQogaWYoei5HdiE9PTApdGhyb3cgSC5iKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCi16Lk9IKGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qMyhhLG51bGwpfSwidFoiLCIkMSIsIiQwIiwiZ3Y2IiwwLDIsMTE4LDIzLDIxXSwKK3ouT0goYil9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmozKGEsbnVsbCl9LCJ0WiIsIiQxIiwiJDAiLCJndjYiLDAsMiwxMTksMjMsMjFdLAogdzA6W2Z1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGE9PW51bGwpdGhyb3cgSC5iKFAudSgiRXJyb3IgbXVzdCBub3QgYmUgbnVsbCIpKQogej10aGlzLk1NCiBpZih6Lkd2IT09MCl0aHJvdyBILmIoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKLXouQ0coYSxiKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudzAoYSxudWxsKX0sInBtIiwiJDIiLCIkMSIsImdZSiIsMiwyLDExNCwyMywyNCwyNV19LAorei5DRyhhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53MChhLG51bGwpfSwicG0iLCIkMiIsIiQxIiwiZ1lKIiwyLDIsMTE1LDIzLDI0LDI1XX0sCiBHYzp7CiAiXiI6ImE7R3YsTGo8LGprLEJRQCxPWSxBcyxxVixvNCIsCiBnY2c6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Hdj49NH0sCkBAIC01NTU2LDMxICs1NjM1LDMxIEBACiB5PWIKIGI9cX19fX0sCiBkYTp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6W2Z1bmN0aW9uKCl7UC5IWih0aGlzLmEsdGhpcy5iKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFU3OnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt0aGlzLmEuUjgoYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB2cjp7Ci0iXiI6IlRwOjExOTtiIiwKKyJeIjoiVHBaOjEyMDtiIiwKICQyOltmdW5jdGlvbihhLGIpe3RoaXMuYi5LNShhLGIpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy4kMihhLG51bGwpfSwiJDEiLCIkMiIsbnVsbCxudWxsLDIsMixudWxsLDIzLDI0LDI1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGNYOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXtQLkE5KHRoaXMuYix0aGlzLmEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZVg6ewotIl4iOiJUcDo3MTtjLGQiLAorIl4iOiJUcFo6NzI7YyxkIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYy5SOCh0aGlzLmQpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogWkw6ewotIl4iOiJUcDo3MTthLGIsYyIsCisiXiI6IlRwWjo3MjthLGIsYyIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmEuSzUodGhpcy5iLHRoaXMuYyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBycTp7Ci0iXiI6IlRwOjEyMDtiLGQsZSxmIiwKKyJeIjoiVHBaOjEyMTtiLGQsZSxmIiwKICQwOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKIHRyeXt0aGlzLmIuYz10aGlzLmYuRkkodGhpcy5kLmdPMSgpLHRoaXMuZSkKIHJldHVybiEwfWNhdGNoKHgpe3c9SC5SdSh4KQpAQCAtNTU5MCw3ICs1NjY5LDcgQEAKIHJldHVybiExfX0sCiAkaXNFSDp0cnVlfSwKIFJXOnsKLSJeIjoiVHA6MTg7YyxiLFVJLGJLIiwKKyJeIjoiVHBaOjE4O2MsYixVSSxiSyIsCiAkMDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0KIHo9dGhpcy5jLmUuZ2NHKCkKIHI9dGhpcy5VSQpAQCAtNTYyNiw3ICs1NzA1LDcgQEAKIHIuYj0hMX19LAogJGlzRUg6dHJ1ZX0sCiBSVDp7Ci0iXiI6IlRwOjE4O2MsYixHcSxSbSx3MyIsCisiXiI6IlRwWjoxODtjLGIsR3EsUm0sdzMiLAogJDA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUKIHo9e30KIHouYT1udWxsCkBAIC01NjQ2LDExICs1NzI1LDExIEBACiB6LmEuUngobmV3IFAualoodGhpcy5jLHYpLG5ldyBQLkZaKHosdikpfX0sCiAkaXNFSDp0cnVlfSwKIGpaOnsKLSJeIjoiVHA6MTM7YyxIWiIsCi0kMTpbZnVuY3Rpb24oYSl7UC5IWih0aGlzLmMuZSx0aGlzLkhaKX0sIiQxIixudWxsLDIsMCxudWxsLDEyMSwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YyxIWiIsCiskMTpbZnVuY3Rpb24oYSl7UC5IWih0aGlzLmMuZSx0aGlzLkhaKX0sIiQxIixudWxsLDIsMCxudWxsLDEyMiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBGWjp7Ci0iXiI6IlRwOjExOTthLG1HIiwKKyJeIjoiVHBaOjEyMDthLG1HIiwKICQyOltmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dGhpcy5hCiBpZighSi54KHouYSkuJGlzR2Mpe3k9UC5EdChudWxsKQpAQCAtNTY2Miw4ICs1NzQxLDggQEAKIEtpOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkZSLiQwKCl9fSwKIHdTOnsKICJeIjoiYTsiLAotZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFAuYzkoYix0aGlzKSxbSC5pcCh0aGlzLCJ3UyIsMCksbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJicCIscmV0OlAud1MsYXJnczpbe2Z1bmM6IkxmIixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIndTIil9LDEyMl0sCi1sTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgUC5CZyhiLHRoaXMpLFtILmlwKHRoaXMsIndTIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6Inh2IixyZXQ6UC53UyxhcmdzOlt7ZnVuYzoiZkEiLHJldDpQLlFWLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwid1MiKX0sMTIyXSwKK2V6OltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBQLmM5KGIsdGhpcyksW0guaXAodGhpcywid1MiLDApLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiYnAiLHJldDpQLndTLGFyZ3M6W3tmdW5jOiJQdyIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJ3UyIpfSwxMjNdLAorbE06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFAuQUUoYix0aGlzKSxbSC5pcCh0aGlzLCJ3UyIsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJ4diIscmV0OlAud1MsYXJnczpbe2Z1bmM6ImZBIixyZXQ6UC5RVixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIndTIil9LDEyM10sCiB0ZzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9e30KIHk9UC5EdChQLmEyKQpAQCAtNTY4MCw3ICs1NzU5LDcgQEAKIHo9e30KIHk9UC5EdChQLmEyKQogei5hPW51bGwKLXouYT10aGlzLktSKG5ldyBQLkJTZCh6LHRoaXMsYix5KSwhMCxuZXcgUC5keWooeSkseS5nYXEoKSkKK3ouYT10aGlzLktSKG5ldyBQLklhKHosdGhpcyxiLHkpLCEwLG5ldyBQLkJTZCh5KSx5LmdhcSgpKQogcmV0dXJuIHl9LAogZ0I6ZnVuY3Rpb24oYSl7dmFyIHoseQogej17fQpAQCAtNTY5OSw3ICs1Nzc4LDcgQEAKIHk9UC5EdChbUC54dSxILmlwKHRoaXMsIndTIiwwKV0pCiB0aGlzLktSKG5ldyBQLm9ZKHRoaXMseiksITAsbmV3IFAueVooeix5KSx5LmdhcSgpKQogcmV0dXJuIHl9LAotZ3RIOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK2dUdzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXt9CiB5PVAuRHQoSC5pcCh0aGlzLCJ3UyIsMCkpCiB6LmE9bnVsbApAQCAtNTcxNCwxMTIgKzU3OTMsMTEyIEBACiByZXR1cm4geX0sCiAkaXN3Uzp0cnVlfSwKIFNkOnsKLSJeIjoiVHA7YSxiLGMsZCIsCisiXiI6IlRwWjthLGIsYyxkIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT10aGlzLmQKLVAuRkUobmV3IFAuT2godGhpcy5jLGEpLG5ldyBQLmp2SCh6LHkpLFAuVEIoei5hLHkpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyMywiY2FsbCJdLAorUC5GRShuZXcgUC5MQih0aGlzLmMsYSksbmV3IFAuT2goeix5KSxQLlRCKHouYSx5KSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMjQsImNhbGwiXSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IkxmIixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAotT2g6ewotIl4iOiJUcDo3MTtlLGYiLAorJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJQdyIsYXJnczpbYV19fSx0aGlzLmIsIndTIil9fSwKK0xCOnsKKyJeIjoiVHBaOjcyO2UsZiIsCiAkMDpmdW5jdGlvbigpe3JldHVybiBKLnhDKHRoaXMuZix0aGlzLmUpfSwKICRpc0VIOnRydWV9LAotanZIOnsKLSJeIjoiVHA6MTI0O2EsVUkiLAorT2g6eworIl4iOiJUcFo6MTI1O2EsVUkiLAogJDE6ZnVuY3Rpb24oYSl7aWYoYT09PSEwKVAuQmIodGhpcy5hLmEsdGhpcy5VSSwhMCl9LAogJGlzRUg6dHJ1ZX0sCiB0Rzp7Ci0iXiI6IlRwOjcxO2JLIiwKKyJeIjoiVHBaOjcyO2JLIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYksuclgoITEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbHo6ewotIl4iOiJUcDthLGIsYyxkIiwKLSQxOltmdW5jdGlvbihhKXtQLkZFKG5ldyBQLlJsKHRoaXMuYyxhKSxuZXcgUC5hdCgpLFAuVEIodGhpcy5hLmEsdGhpcy5kKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMjMsImNhbGwiXSwKKyJeIjoiVHBaO2EsYixjLGQiLAorJDE6W2Z1bmN0aW9uKGEpe1AuRkUobmV3IFAuUmwodGhpcy5jLGEpLG5ldyBQLkpiKCksUC5UQih0aGlzLmEuYSx0aGlzLmQpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAogUmw6ewotIl4iOiJUcDo3MTtlLGYiLAorIl4iOiJUcFo6NzI7ZSxmIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZS4kMSh0aGlzLmYpfSwKICRpc0VIOnRydWV9LAotYXQ6ewotIl4iOiJUcDoxMzsiLAorSmI6eworIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe30sCiAkaXNFSDp0cnVlfSwKIE00OnsKLSJeIjoiVHA6NzE7VUkiLAorIl4iOiJUcFo6NzI7VUkiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5VSS5yWChudWxsKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLUJTZDp7Ci0iXiI6IlRwO2EsYixjLGQiLAorSWE6eworIl4iOiJUcFo7YSxiLGMsZCIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLmEKIHk9dGhpcy5kCi1QLkZFKG5ldyBQLldOKHRoaXMuYyxhKSxuZXcgUC5YUEIoeix5KSxQLlRCKHouYSx5KSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMjMsImNhbGwiXSwKK1AuRkUobmV3IFAuV04odGhpcy5jLGEpLG5ldyBQLlhQQih6LHkpLFAuVEIoei5hLHkpKX0sIiQxIixudWxsLDIsMCxudWxsLDEyNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAogV046ewotIl4iOiJUcDo3MTtlLGYiLAorIl4iOiJUcFo6NzI7ZSxmIiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZS4kMSh0aGlzLmYpfSwKICRpc0VIOnRydWV9LAogWFBCOnsKLSJeIjoiVHA6MTI0O2EsVUkiLAorIl4iOiJUcFo6MTI1O2EsVUkiLAogJDE6ZnVuY3Rpb24oYSl7aWYoYT09PSEwKVAuQmIodGhpcy5hLmEsdGhpcy5VSSwhMCl9LAogJGlzRUg6dHJ1ZX0sCi1keWo6ewotIl4iOiJUcDo3MTtiSyIsCitCU2Q6eworIl4iOiJUcFo6NzI7YksiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5iSy5yWCghMSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBQSTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7Kyt0aGlzLmEuYX0sIiQxIixudWxsLDIsMCxudWxsLDE0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHVPOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmIuclgodGhpcy5hLmEpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogcWc6ewotIl4iOiJUcDoxMzthLGIiLAorIl4iOiJUcFo6MTM7YSxiIiwKICQxOltmdW5jdGlvbihhKXtQLkJiKHRoaXMuYS5hLHRoaXMuYiwhMSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBXZDp7Ci0iXiI6IlRwOjcxO2MiLAorIl4iOiJUcFo6NzI7YyIsCiAkMDpbZnVuY3Rpb24oKXt0aGlzLmMuclgoITApfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogb1k6ewotIl4iOiJUcDthLGIiLAotJDE6W2Z1bmN0aW9uKGEpe3RoaXMuYi5oKDAsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxMTMsImNhbGwiXSwKKyJeIjoiVHBaO2EsYiIsCiskMTpbZnVuY3Rpb24oYSl7dGhpcy5iLmgoMCxhKX0sIiQxIixudWxsLDIsMCxudWxsLDExNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5hLCJ3UyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYSwid1MiKX19LAogeVo6ewotIl4iOiJUcDo3MTtjLGQiLAorIl4iOiJUcFo6NzI7YyxkIiwKICQwOltmdW5jdGlvbigpe3RoaXMuZC5yWCh0aGlzLmMpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogeHA6ewotIl4iOiJUcDthLGIsYyIsCisiXiI6IlRwWjthLGIsYyIsCiAkMTpbZnVuY3Rpb24oYSl7UC5CYih0aGlzLmEuYSx0aGlzLmMsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZSwKLSRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTGYiLGFyZ3M6W2FdfX0sdGhpcy5iLCJ3UyIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAogT0M6ewotIl4iOiJUcDo3MTtkIiwKKyJeIjoiVHBaOjcyO2QiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5kLkxwKG5ldyBQLmxqKCJObyBlbGVtZW50cyIpKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFVIOnsKLSJeIjoiVHA7YSxiIiwKKyJeIjoiVHBaO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCiB6LmI9ITAKIHouYT1hfSwiJDEiLG51bGwsMiwwLG51bGwsMjEsImNhbGwiXSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IkxmIixhcmdzOlthXX19LHRoaXMuYiwid1MiKX19LAorJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJQdyIsYXJnczpbYV19fSx0aGlzLmIsIndTIil9fSwKIGVJOnsKLSJeIjoiVHA6NzE7YSxjIiwKKyJeIjoiVHBaOjcyO2EsYyIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmEKIGlmKHouYil7dGhpcy5jLnJYKHouYSkKIHJldHVybn10aGlzLmMuTHAobmV3IFAubGooIk5vIGVsZW1lbnRzIikpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAotTU86eworeVg6ewogIl4iOiJhOyIsCi0kaXNNTzp0cnVlfSwKKyRpc3lYOnRydWV9LAogblI6ewogIl4iOiJhOyIsCiBnVUY6ZnVuY3Rpb24oKXt2YXIgej10aGlzLkd2CkBAIC01ODM2LDcgKzU5MTUsNyBAQAogcmV0dXJuIHRoaXMueEd9LAogbkc6ZnVuY3Rpb24oKXtpZigodGhpcy5HdiY0KSE9PTApcmV0dXJuIG5ldyBQLmxqKCJDYW5ub3QgYWRkIGV2ZW50IGFmdGVyIGNsb3NpbmciKQogcmV0dXJuIG5ldyBQLmxqKCJDYW5ub3QgYWRkIGV2ZW50IHdoaWxlIGFkZGluZyBhIHN0cmVhbSIpfSwKLWltOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy55eAorU0w6ZnVuY3Rpb24oKXt2YXIgej10aGlzLnl4CiBpZih6PT1udWxsKXt6PSh0aGlzLkd2JjIpIT09MD8kLm1rKCk6UC5EdChudWxsKQogdGhpcy55eD16fXJldHVybiB6fSwKIGg6W2Z1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5HdgpAQCAtNTg0NCwxMyArNTkyMywxMyBAQAogaWYoKHomMSkhPT0wKXRoaXMuSXYoYikKIGVsc2UgaWYoKHomMyk9PT0wKXRoaXMua1coKS5oKDAsSC5WTShuZXcgUC5mWihiLG51bGwpLFtILmlwKHRoaXMsIm5SIiwwKV0pKX0sIiQxIiwiZ2h0IiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoibFU2Iix2b2lkOnRydWUsYXJnczpbYV19fSx0aGlzLiRyZWNlaXZlciwiblIiKX1dLAogeE86ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HdgotaWYoKHomNCkhPT0wKXJldHVybiB0aGlzLmltKCkKK2lmKCh6JjQpIT09MClyZXR1cm4gdGhpcy5TTCgpCiBpZih6Pj00KXRocm93IEguYih0aGlzLm5HKCkpCiB6fD00CiB0aGlzLkd2PXoKLWlmKCh6JjEpIT09MCl0aGlzLkR1KCkKK2lmKCh6JjEpIT09MCl0aGlzLlNZKCkKIGVsc2UgaWYoKHomMyk9PT0wKXRoaXMua1coKS5oKDAsQy5aQikKLXJldHVybiB0aGlzLmltKCl9LAorcmV0dXJuIHRoaXMuU0woKX0sCiBSZzpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuR3YKIGlmKCh6JjEpIT09MCl0aGlzLkl2KGIpCiBlbHNlIGlmKCh6JjMpPT09MCl0aGlzLmtXKCkuaCgwLEguVk0obmV3IFAuZlooYixudWxsKSxbSC5pcCh0aGlzLCJuUiIsMCldKSl9LApAQCAtNTg4MSw3ICs1OTYwLDcgQEAKIHU9UC5EdChudWxsKQogdS5DRyh5LHgpCiB6PXV9ZWxzZSB6PXouWU0odGhpcy5nUUMoKSkKLXY9bmV3IFAuQmNWKHRoaXMpCit2PW5ldyBQLkJjKHRoaXMpCiBpZih6IT1udWxsKXo9ei5ZTSh2KQogZWxzZSB2LiQwKCkKIHJldHVybiB6fSwKQEAgLTU4OTAsMTEgKzU5NjksMTEgQEAKIG00OmZ1bmN0aW9uKGEpe2lmKCh0aGlzLkd2JjgpIT09MCl0aGlzLnhHLlFFKDApCiBQLm90KHRoaXMuZ1o5KCkpfX0sCiBVTzp7Ci0iXiI6IlRwOjcxO2EiLAorIl4iOiJUcFo6NzI7YSIsCiAkMDpmdW5jdGlvbigpe1Aub3QodGhpcy5hLmduTCgpKX0sCiAkaXNFSDp0cnVlfSwKLUJjVjp7Ci0iXiI6IlRwOjE4O2EiLAorQmM6eworIl4iOiJUcFo6MTg7YSIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmEueXgKIGlmKHohPW51bGwmJnouR3Y9PT0wKXouT0gobnVsbCl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCkBAIC01OTAyLDEyICs1OTgxLDEyIEBACiAiXiI6ImE7IiwKIEl2OmZ1bmN0aW9uKGEpe3RoaXMuZ0VlKCkuUmcoMCxhKX0sCiBwYjpmdW5jdGlvbihhLGIpe3RoaXMuZ0VlKCkub0ooYSxiKX0sCi1EdTpmdW5jdGlvbigpe3RoaXMuZ0VlKCkuUWooKX19LAorU1k6ZnVuY3Rpb24oKXt0aGlzLmdFZSgpLlFqKCl9fSwKIG9mMjp7CiAiXiI6ImE7IiwKIEl2OmZ1bmN0aW9uKGEpe3RoaXMuZ0VlKCkudzYoSC5WTShuZXcgUC5mWihhLG51bGwpLFtudWxsXSkpfSwKIHBiOmZ1bmN0aW9uKGEsYil7dGhpcy5nRWUoKS53NihuZXcgUC5EbihhLGIsbnVsbCkpfSwKLUR1OmZ1bmN0aW9uKCl7dGhpcy5nRWUoKS53NihDLlpCKX19LAorU1k6ZnVuY3Rpb24oKXt0aGlzLmdFZSgpLnc2KEMuWkIpfX0sCiBxMTp7CiAiXiI6Ilp6RDtuTDwscDQ8LFo5PCxRQzwseEcsR3YseXgiLAogdEE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RQy4kMCgpfX0sCkBAIC01OTE5LDcgKzU5OTgsNyBAQAogTUZJOnsKICJeIjoiblIrVFQ7In0sCiB1Mjp7Ci0iXiI6IlluO2x5IiwKKyJeIjoiYU47bHkiLAogdzQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubHkuRVQoYSl9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybihILmVRKHRoaXMubHkpXjg5MjQ4Mjg2Nik+Pj4wfSwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCkBAIC01OTUwLDcgKzYwMjksNyBAQAogdGhpcy5Hdj0oeisxMjh8NCk+Pj4wCiBpZihiIT1udWxsKWIuWU0odGhpcy5nRFEodGhpcykpCiBpZih6PDEyOCYmdGhpcy5SaSE9bnVsbCl0aGlzLlJpLklPKCkKLWlmKCh6JjQpPT09MCYmKHRoaXMuR3YmMzIpPT09MCl0aGlzLko3KHRoaXMuZ3A0KCkpfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5GdihhLG51bGwpfSwieXkiLCIkMSIsIiQwIiwiZ1gwIiwwLDIsMTI1LDIzLDEyNl0sCitpZigoeiY0KT09PTAmJih0aGlzLkd2JjMyKT09PTApdGhpcy5KNyh0aGlzLmdwNCgpKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnYoYSxudWxsKX0sInl5IiwiJDEiLCIkMCIsImdYMCIsMCwyLDEyNiwyMywxMjddLAogUUU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuR3YKIGlmKCh6JjgpIT09MClyZXR1cm4KIGlmKHo+PTEyOCl7ei09MTI4CkBAIC01OTg1LDcgKzYwNjQsNyBAQAogaWYoKHomOCkhPT0wKXJldHVybgogej0oenwyKT4+PjAKIHRoaXMuR3Y9egotaWYoejwzMil0aGlzLkR1KCkKK2lmKHo8MzIpdGhpcy5TWSgpCiBlbHNlIHRoaXMudzYoQy5aQil9LAogdU86W2Z1bmN0aW9uKCl7fSwiJDAiLCJncDQiLDAsMCwxOF0sCiBMUDpbZnVuY3Rpb24oKXt9LCIkMCIsImdaOSIsMCwwLDE4XSwKQEAgLTYwMTIsNyArNjA5MSw3IEBACiBpZighIUoueCh6KS4kaXNiOCl6LllNKHkpCiBlbHNlIHkuJDAoKX1lbHNle3kuJDAoKQogdGhpcy51dCgoeiY0KSE9PTApfX0sCi1EdTpmdW5jdGlvbigpe3ZhciB6LHkKK1NZOmZ1bmN0aW9uKCl7dmFyIHoseQogej1uZXcgUC5xQih0aGlzKQogdGhpcy50aygpCiB0aGlzLkd2PSh0aGlzLkd2fDE2KT4+PjAKQEAgLTYwNDEsMTAgKzYxMjAsMTAgQEAKIGVsc2UgdGhpcy5MUCgpCiB0aGlzLkd2PSh0aGlzLkd2JjQyOTQ5NjcyNjMpPj4+MH16PXRoaXMuR3YKIGlmKCh6JjY0KSE9PTAmJno8MTI4KXRoaXMuUmkudDIodGhpcyl9LAotJGlzTU86dHJ1ZSwKLXN0YXRpYzp7Il4iOiJYeCxiRyxROWUsSXI5LG5hdixEcixKQUssdm8sRkYifX0sCiskaXN5WDp0cnVlLAorc3RhdGljOnsiXiI6Ilh4LGJHLFE5ZSxJcjksbmF2LERyLEpBSyx2byxQaiJ9fSwKIHgxOnsKLSJeIjoiVHA6MTg7YSxiLGMiLAorIl4iOiJUcFo6MTg7YSxiLGMiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHoseSx4LHcsdix1CiB6PXRoaXMuYQogeT16Lkd2CkBAIC02MDYxLDcgKzYxNDAsNyBAQAogZWxzZSB5Lm0xKHYsdSl9ei5Hdj0oei5HdiY0Mjk0OTY3MjYzKT4+PjB9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBxQjp7Ci0iXiI6IlRwOjE4O2EiLAorIl4iOiJUcFo6MTg7YSIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMuYQogeT16Lkd2CkBAIC02MDcwLDcgKzYxNDksNyBAQAogei5Mai5iSCh6LkJkKQogei5Hdj0oei5HdiY0Mjk0OTY3MjYzKT4+PjB9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1Zbjp7CithTjp7CiAiXiI6IndTOyIsCiBLUjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgej10aGlzLnc0KCEwPT09YikKIHoucHMoYSkKQEAgLTYwODUsMTcgKzYxNjQsMTcgQEAKIHk9bmV3IFAuS0EobnVsbCxudWxsLG51bGwseix5LG51bGwsbnVsbCkKIHkuJGJ1aWx0aW5UeXBlSW5mbz10aGlzLiRidWlsdGluVHlwZUluZm8KIHJldHVybiB5fX0sCi1mSW06ewordGk6ewogIl4iOiJhO2F3QCJ9LAogZlo6ewotIl4iOiJmSW07UD4sYXciLAorIl4iOiJ0aTtQPixhdyIsCiBkUDpmdW5jdGlvbihhKXthLkl2KHRoaXMuUCl9fSwKIERuOnsKLSJeIjoiZkltO2tjPixJNDwsYXciLAorIl4iOiJ0aTtrYz4sSTQ8LGF3IiwKIGRQOmZ1bmN0aW9uKGEpe2EucGIodGhpcy5rYyx0aGlzLkk0KX19LAogeVJmOnsKICJeIjoiYTsiLAotZFA6ZnVuY3Rpb24oYSl7YS5EdSgpfSwKK2RQOmZ1bmN0aW9uKGEpe2EuU1koKX0sCiBnYXc6ZnVuY3Rpb24oKXtyZXR1cm59LAogc2F3OmZ1bmN0aW9uKGEpe3Rocm93IEguYihQLncoIk5vIGV2ZW50cyBhZnRlciBhIGRvbmUuIikpfX0sCiBCM1A6ewpAQCAtNjEwNywxMyArNjE4NiwxMyBAQAogdGhpcy5Hdj0xfSwKIElPOmZ1bmN0aW9uKCl7aWYodGhpcy5Hdj09PTEpdGhpcy5Hdj0zfX0sCiBDUjp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHoseQogej10aGlzLmEKIHk9ei5Hdgogei5Hdj0wCiBpZih5PT09MylyZXR1cm4KLXouVE8odGhpcy5iKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCit6LnZHKHRoaXMuYil9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBRazp7CiAiXiI6IkIzUDt6UixONixHdiIsCkBAIC02MTIyLDcgKzYyMDEsNyBAQAogaWYoej09bnVsbCl7dGhpcy5ONj1iCiB0aGlzLnpSPWJ9ZWxzZXt6LnNhdyhiKQogdGhpcy5ONj1ifX0sCi1UTzpmdW5jdGlvbihhKXt2YXIgeix5Cit2RzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuelIKIHk9ei5nYXcoKQogdGhpcy56Uj15CkBAIC02MTQxLDMwICs2MjIwLDMwIEBACiBmbTpmdW5jdGlvbihhLGIpe30sCiB5NTpmdW5jdGlvbihhKXt0aGlzLkJkPWF9LAogRnY6W2Z1bmN0aW9uKGEsYil7dGhpcy5Hdis9NAotaWYoYiE9bnVsbCliLllNKHRoaXMuZ0RRKHRoaXMpKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnYoYSxudWxsKX0sInl5IiwiJDEiLCIkMCIsImdYMCIsMCwyLDEyNSwyMywxMjZdLAoraWYoYiE9bnVsbCliLllNKHRoaXMuZ0RRKHRoaXMpKX0sZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnYoYSxudWxsKX0sInl5IiwiJDEiLCIkMCIsImdYMCIsMCwyLDEyNiwyMywxMjddLAogUUU6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuR3YKIGlmKHo+PTQpe3otPTQKIHRoaXMuR3Y9egogaWYoejw0JiYoeiYxKT09PTApdGhpcy55YygpfX0sIiQwIiwiZ0RRIiwwLDAsMThdLAogZWQ6ZnVuY3Rpb24oKXtyZXR1cm59LAotRHU6W2Z1bmN0aW9uKCl7dmFyIHo9KHRoaXMuR3YmNDI5NDk2NzI5Myk+Pj4wCitTWTpbZnVuY3Rpb24oKXt2YXIgej0odGhpcy5HdiY0Mjk0OTY3MjkzKT4+PjAKIHRoaXMuR3Y9egogaWYoej49NClyZXR1cm4KIHRoaXMuR3Y9KHp8MSk+Pj4wCiB6PXRoaXMuQmQKIGlmKHohPW51bGwpdGhpcy5Mai5iSCh6KX0sIiQwIiwiZ1htIiwwLDAsMThdLAotJGlzTU86dHJ1ZSwKLXN0YXRpYzp7Il4iOiJENCxFRDcsRUxnIn19LAorJGlzeVg6dHJ1ZSwKK3N0YXRpYzp7Il4iOiJGa1YsRUQ3LEVMZyJ9fSwKIGRSOnsKLSJeIjoiVHA6NzE7YSxiLGMiLAorIl4iOiJUcFo6NzI7YSxiLGMiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5LNSh0aGlzLmIsdGhpcy5jKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHVSOnsKLSJeIjoiVHA6MTI3O2EsYiIsCisiXiI6IlRwWjoxMjg7YSxiIiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuTlgodGhpcy5hLHRoaXMuYixhLGIpfSwKICRpc0VIOnRydWV9LAogUVg6ewotIl4iOiJUcDo3MTthLGIiLAorIl4iOiJUcFo6NzI7YSxiIiwKICQwOltmdW5jdGlvbigpe3JldHVybiB0aGlzLmEuclgodGhpcy5iKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG9nOnsKQEAgLTYyMDAsMTUgKzYyNzksMTUgQEAKIHRBOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5FZQogaWYoeiE9bnVsbCl7dGhpcy5FZT1udWxsCiB6LmVkKCl9cmV0dXJufSwKLXZ4OltmdW5jdGlvbihhKXt0aGlzLktRLmtNKGEsdGhpcyl9LCIkMSIsImdPYSIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoia0E2Iix2b2lkOnRydWUsYXJnczpbYV19fSx0aGlzLiRyZWNlaXZlciwiZkIiKX0sMTEzXSwKLXhMOltmdW5jdGlvbihhLGIpe3RoaXMub0ooYSxiKX0sIiQyIiwiZ3ZlIiw0LDAsMTI4LDI0LDI1XSwKK3Z4OltmdW5jdGlvbihhKXt0aGlzLktRLmtNKGEsdGhpcyl9LCIkMSIsImdPYSIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoia0E2Iix2b2lkOnRydWUsYXJnczpbYV19fSx0aGlzLiRyZWNlaXZlciwiZkIiKX0sMTE0XSwKK3hMOltmdW5jdGlvbihhLGIpe3RoaXMub0ooYSxiKX0sIiQyIiwiZ3ZlIiw0LDAsMTI5LDI0LDI1XSwKIFNwOltmdW5jdGlvbigpe3RoaXMuUWooKX0sIiQwIiwiZ0gxIiwwLDAsMThdLAogUzg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseQogej10aGlzLmdPYSgpCiB5PXRoaXMuZ3ZlKCkKIHRoaXMuRWU9dGhpcy5LUS5TYi56Qyh6LHRoaXMuZ0gxKCkseSl9LAogJGFzS0E6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYl19LAotJGFzTU86ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYl19fSwKKyRhc3lYOmZ1bmN0aW9uKGEsYil7cmV0dXJuW2JdfX0sCiBuTzp7CiAiXiI6Im9nO1pQLFNiIiwKIERyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlpQLiQxKGEpfSwKQEAgLTYyMzEsNyArNjMxMCw3IEBACiB4PW5ldyBILlhPKHcsbnVsbCkKIGIub0ooeSx4KQogcmV0dXJufUoud3goYix6KX19LAotQmc6eworQUU6ewogIl4iOiJvZztwSyxTYiIsCiBHVzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wSy4kMShhKX0sCiBrTTpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKQEAgLTYyNDUsOSArNjMyNCw5IEBACiBhWXk6ewogIl4iOiJhOyJ9LAogeVE6ewotIl4iOiJhO0UyPCxjUzwsT3Q8LGpIPCxLYTwsWHA8LGZiPCxyYjwsWnE8LE5XLG1wPix4azwiLAorIl4iOiJhO0UyPCxoWTwsT3Q8LGpIPCxLYTwsWHA8LGZiPCxyYjwsWnE8LE5XLG1wPix4azwiLAogaGs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5FMi4kMihhLGIpfSwKLUdyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNTLiQxKGEpfSwKK0dyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhZLiQxKGEpfSwKIEZJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuT3QuJDIoYSxiKX0sCiBtZzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuakguJDMoYSxiLGMpfSwKIEFsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkthLiQxKGEpfSwKQEAgLTYyNTgsMTkgKzYzMzcsMTkgQEAKIHVOOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWnEuJDIoYSxiKX0sCiBDaDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1wLiQxKGIpfSwKIHFwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnhrLiQxJHNwZWNpZmljYXRpb24oYSl9fSwKLXFLOnsKK2U0eTp7CiAiXiI6ImE7In0sCiBkbDp7CiAiXiI6ImE7In0sCiBJZDp7CiAiXiI6ImE7blUiLAogZ0xqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMublV9LAoteDU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6PXRoaXMublUKK2MxOmZ1bmN0aW9uKGEsYixjKXt2YXIgej10aGlzLm5VCiBmb3IoO3ouZ3RwKCkuZ0UyKCk9PW51bGw7KXo9ei5nZVQoeikKIHJldHVybiB6Lmd0cCgpLmdFMigpLiQ1KHosbmV3IFAuSWQoei5nZVQoeikpLGEsYixjKX0sCiBWbjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMublUKLWZvcig7ei5ndHAoKS5nY1MoKT09bnVsbDspej16LmdlVCh6KQotcmV0dXJuIHouZ3RwKCkuZ2NTKCkuJDQoeixuZXcgUC5JZCh6LmdlVCh6KSksYSxiKX0sCitmb3IoO3ouZ3RwKCkuZ2hZKCk9PW51bGw7KXo9ei5nZVQoeikKK3JldHVybiB6Lmd0cCgpLmdoWSgpLiQ0KHosbmV3IFAuSWQoei5nZVQoeikpLGEsYil9LAogRW86ZnVuY3Rpb24oYSxiLGMpe3ZhciB6PXRoaXMublUKIGZvcig7ei5ndHAoKS5nT3QoKT09bnVsbDspej16LmdlVCh6KQogcmV0dXJuIHouZ3RwKCkuZ090KCkuJDUoeixuZXcgUC5JZCh6LmdlVCh6KSksYSxiLGMpfSwKQEAgLTYzMzQsMjkgKzY0MTMsMjkgQEAKIGVsc2UgcmV0dXJuIG5ldyBQLkhzKHRoaXMseil9LAogY2w6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLk84KGEpCiBpZihiKXJldHVybiBuZXcgUC5kdih0aGlzLHopCi1lbHNlIHJldHVybiBuZXcgUC53ZCh0aGlzLHopfX0sCitlbHNlIHJldHVybiBuZXcgUC5jWih0aGlzLHopfX0sCiBURjp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6W2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYS5iSCh0aGlzLmIpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogWHo6ewotIl4iOiJUcDo3MTtjLGQiLAorIl4iOiJUcFo6NzI7YyxkIiwKICQwOltmdW5jdGlvbigpe3JldHVybiB0aGlzLmMuR3IodGhpcy5kKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIENnOnsKLSJeIjoiVHA6MTM7YSxiIiwKKyJeIjoiVHBaOjEzO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5tMSh0aGlzLmIsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwzMywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBIczp7Ci0iXiI6IlRwOjEzO2MsZCIsCisiXiI6IlRwWjoxMztjLGQiLAogJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmMuRkkodGhpcy5kLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMzMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogZHY6ewotIl4iOiJUcDo3OTthLGIiLAorIl4iOiJUcFo6ODA7YSxiIiwKICQyOltmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEuejgodGhpcy5iLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw5LDEwLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLXdkOnsKLSJeIjoiVHA6Nzk7YyxkIiwKK2NaOnsKKyJeIjoiVHBaOjgwO2MsZCIsCiAkMjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5jLm1nKHRoaXMuZCxhLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsOSwxMCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB1bzp7CkBAIC02MzY3LDcgKzY0NDYsNyBAQAogeT16LnQoMCxiKQogaWYoeSE9bnVsbHx8ei54NCgwLGIpKXJldHVybiB5CiByZXR1cm4gdGhpcy5lVC50KDAsYil9LAotaGs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbmV3IFAuSWQodGhpcykueDUodGhpcyxhLGIpfSwKK2hrOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG5ldyBQLklkKHRoaXMpLmMxKHRoaXMsYSxiKX0sCiB1STpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5JZCh0aGlzKS5sZCh0aGlzLGEsYil9LAogcXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudUkoYSxudWxsKX0sCiBHcjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuSWQodGhpcykuVm4odGhpcyxhKX0sCkBAIC02MzgwLDExICs2NDU5LDExIEBACiB1TjpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5JZCh0aGlzKS5kSih0aGlzLGEsYil9LAogQ2g6ZnVuY3Rpb24oYSxiKXtuZXcgUC5JZCh0aGlzKS5SQigwLHRoaXMsYil9fSwKIEZPOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXtQLklBKG5ldyBQLmVNKHRoaXMuYSx0aGlzLmIpKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGVNOnsKLSJeIjoiVHA6NzE7YyxkIiwKKyJeIjoiVHBaOjcyO2MsZCIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5CiB6PXRoaXMuYwogUC5GTCgiVW5jYXVnaHQgRXJyb3I6ICIrSC5kKHopKQpAQCAtNjM5NCwxNiArNjQ3MywxNiBAQAogdGhyb3cgSC5iKHopfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogVWV6OnsKLSJeIjoiVHA6Nzk7YSIsCi0kMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3NywyMSwiY2FsbCJdLAorIl4iOiJUcFo6ODA7YSIsCiskMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLGEsYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3OCwyMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBBSGk6ewogIl4iOiJhOyIsCiBnRTI6ZnVuY3Rpb24oKXtyZXR1cm4gUC53TCgpfSwKIGhrOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ0UyKCkuJDIoYSxiKX0sCi1nY1M6ZnVuY3Rpb24oKXtyZXR1cm4gUC5sdygpfSwKLUdyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmdjUygpLiQxKGEpfSwKLWdPdDpmdW5jdGlvbigpe3JldHVybiBQLlVuKCl9LAorZ2hZOmZ1bmN0aW9uKCl7cmV0dXJuIFAubHcoKX0sCitHcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5naFkoKS4kMShhKX0sCitnT3Q6ZnVuY3Rpb24oKXtyZXR1cm4gUC5NTSgpfSwKIEZJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ090KCkuJDIoYSxiKX0sCiBnakg6ZnVuY3Rpb24oKXtyZXR1cm4gUC5peSgpfSwKIG1nOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5nakgoKS4kMyhhLGIsYyl9LApAQCAtNjQxOCwyMiArNjQ5NywyMiBAQAogUks6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ncmIoKS4kMihhLGIpfSwKIGdacTpmdW5jdGlvbigpe3JldHVybiBQLkxtKCl9LAogdU46ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nWnEoKS4kMihhLGIpfSwKLWdtcDpmdW5jdGlvbihhKXtyZXR1cm4gUC5hVygpfSwKK2dtcDpmdW5jdGlvbihhKXtyZXR1cm4gUC5vUSgpfSwKIENoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ21wKHRoaXMpLiQxKGIpfSwKLWd4azpmdW5jdGlvbigpe3JldHVybiBQLklzKCl9LAorZ3hrOmZ1bmN0aW9uKCl7cmV0dXJuIFAuQWsoKX0sCiBxcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5neGsoKS4kMSRzcGVjaWZpY2F0aW9uKGEpfX0sCiBSODE6ewogIl4iOiJmWmk7IiwKIGdlVDpmdW5jdGlvbihhKXtyZXR1cm59LAotZ3RwOmZ1bmN0aW9uKCl7cmV0dXJuIEMuZFN9LAorZ3RwOmZ1bmN0aW9uKCl7cmV0dXJuIEMudjh9LAogZ0M1OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LAogZkM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ0M1KCk9PT10aGlzfSwKIHQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm59LAogaGs6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5DSyh0aGlzLG51bGwsdGhpcyxhLGIpfSwKLXVJOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuVUEodGhpcyxudWxsLHRoaXMsYSxiKX0sCit1STpmdW5jdGlvbihhLGIpe3JldHVybiBQLkUxKHRoaXMsbnVsbCx0aGlzLGEsYil9LAogcXA6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudUkoYSxudWxsKX0sCiBHcjpmdW5jdGlvbihhKXtyZXR1cm4gUC5UOCh0aGlzLG51bGwsdGhpcyxhKX0sCi1GSTpmdW5jdGlvbihhLGIpe3JldHVybiBQLnl2KHRoaXMsbnVsbCx0aGlzLGEsYil9LAorRkk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5WNyh0aGlzLG51bGwsdGhpcyxhLGIpfSwKIG1nOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gUC5NdSh0aGlzLG51bGwsdGhpcyxhLGIsYyl9LAogQWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LAogd1k6ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LApAQCAtNjQ0NSw3ICs2NTI0LDcgQEAKICJeIjoiIiwKIEVGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSC5CNyhhLEguVk0obmV3IFAuWUIoMCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsMCksW2IsY10pKX0sCiBGbDpmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBQLllCKDAsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLDApLFthLGJdKX0sCi1UUTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhhLGIpfSwiJDIiLCJXYkUiLDQsMCw0NSw0Niw0N10sCitPdTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhhLGIpfSwiJDIiLCJIciIsNCwwLDQ1LDQ2LDQ3XSwKIFQ5OltmdW5jdGlvbihhKXtyZXR1cm4gSi52MShhKX0sIiQxIiwicHkiLDIsMCw0OCw0Nl0sCiBZTTpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciB6CiBpZihhPT1udWxsKXt6PW5ldyBQLmJBKDAsbnVsbCxudWxsLG51bGwsbnVsbCkKQEAgLTY0NTMsNyArNjUzMiw3IEBACiByZXR1cm4gen1iPVAucHkoKQogcmV0dXJuIFAuYzcoYSxiLGMsZCxlKX0sCiBSTjpmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBQLlBMKDAsbnVsbCxudWxsLG51bGwsbnVsbCksW2EsYl0pfSwKLVJkOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBILlZNKG5ldyBQLlJyKDAsbnVsbCxudWxsLG51bGwsbnVsbCksW2RdKX0sCitSZDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSC5WTShuZXcgUC5qZygwLG51bGwsbnVsbCxudWxsLG51bGwpLFtkXSl9LAogSXg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIGlmKFAubkgoYSkpe2lmKGI9PT0iKCImJmM9PT0iKSIpcmV0dXJuIiguLi4pIgogcmV0dXJuIGIrIi4uLiIrY316PVtdCkBAIC02NTM0LDggKzY2MTMsOCBAQAogZ0I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWDV9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlg1PT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuWDUhPT0wfSwKLWd2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5mRyh0aGlzKSxbSC5LcCh0aGlzLDApXSl9LAotZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKEguVk0obmV3IFAuZkcodGhpcyksW0guS3AodGhpcywwKV0pLG5ldyBQLm9pKHRoaXMpLEguS3AodGhpcywwKSxILktwKHRoaXMsMSkpfSwKK2d2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5mRyh0aGlzKSxbSC5PcSh0aGlzLDApXSl9LAorZ1VROmZ1bmN0aW9uKGEpe3JldHVybiBILksxKEguVk0obmV3IFAuZkcodGhpcyksW0guT3EodGhpcywwKV0pLG5ldyBQLm9pKHRoaXMpLEguT3EodGhpcywwKSxILk9xKHRoaXMsMSkpfSwKIHg0OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYodHlwZW9mIGI9PT0ic3RyaW5nIiYmYiE9PSJfX3Byb3RvX18iKXt6PXRoaXMudnYKIHJldHVybiB6PT1udWxsPyExOnpbYl0hPW51bGx9ZWxzZSBpZih0eXBlb2YgYj09PSJudW1iZXIiJiYoYiYweDNmZmZmZmYpPT09Yil7eT10aGlzLk9YCkBAIC02NjM2LDE0ICs2NzE1LDE0IEBACiBkZWxldGUgelsiPG5vbi1pZGVudGlmaWVyLWtleT4iXQogcmV0dXJuIHp9fX0sCiBvaTp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudCgwLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTI5LCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnQoMCxhKX0sIiQxIixudWxsLDIsMCxudWxsLDEzMCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBESjp7Ci0iXiI6IlRwO2EiLAorIl4iOiJUcFo7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEsYil7cmV0dXJue2Z1bmM6Im9LIixhcmdzOlthLGJdfX0sdGhpcy5hLCJiQSIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoidlAiLGFyZ3M6W2EsYl19fSx0aGlzLmEsImJBIil9fSwKIFBMOnsKICJeIjoiYkE7WDUsdnYsT1gsT0Isd1YiLAogbm06ZnVuY3Rpb24oYSl7cmV0dXJuIEguQ1UoYSkmMHgzZmZmZmZmfSwKQEAgLTY2NTYsMTMgKzY3MzUsMTMgQEAKICJeIjoiYkE7bTYsUkcsaGcsWDUsdnYsT1gsT0Isd1YiLAogQzI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5tNi4kMihhLGIpfSwKIEg1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlJHLiQxKGEpfSwKLUVmOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhnLiQxKGEpfSwKLXQ6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLkVmKGIpIT09ITApcmV0dXJuCitYeTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5oZy4kMShhKX0sCit0OmZ1bmN0aW9uKGEsYil7aWYodGhpcy5YeShiKSE9PSEwKXJldHVybgogcmV0dXJuIFAuYkEucHJvdG90eXBlLkRsLmNhbGwodGhpcyxiKX0sCiB1OmZ1bmN0aW9uKGEsYixjKXtQLmJBLnByb3RvdHlwZS5tcy5jYWxsKHRoaXMsYixjKX0sCi14NDpmdW5jdGlvbihhLGIpe2lmKHRoaXMuRWYoYikhPT0hMClyZXR1cm4hMQoreDQ6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLlh5KGIpIT09ITApcmV0dXJuITEKIHJldHVybiBQLmJBLnByb3RvdHlwZS5adC5jYWxsKHRoaXMsYil9LAotUno6ZnVuY3Rpb24oYSxiKXtpZih0aGlzLkVmKGIpIT09ITApcmV0dXJuCitSejpmdW5jdGlvbihhLGIpe2lmKHRoaXMuWHkoYikhPT0hMClyZXR1cm4KIHJldHVybiBQLmJBLnByb3RvdHlwZS5iQi5jYWxsKHRoaXMsYil9LAogbm06ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSDUoYSkmMHgzZmZmZmZmfSwKIGFIOmZ1bmN0aW9uKGEsYil7dmFyIHoseQpAQCAtNjY3MCwxMSArNjc0OSwxMSBAQAogej1hLmxlbmd0aAogZm9yKHk9MDt5PHo7eSs9MilpZih0aGlzLkMyKGFbeV0sYik9PT0hMClyZXR1cm4geQogcmV0dXJuLTF9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e2M3OmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIHo9bmV3IFAuakcoZCkKIHJldHVybiBILlZNKG5ldyBQLkZxKGEsYix6LDAsbnVsbCxudWxsLG51bGwsbnVsbCksW2QsZV0pfX19LAogakc6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9SC5JVShhLHRoaXMuYSkKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LApAQCAtNjcxMCw4ICs2Nzg5LDggQEAKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlg1fSwKIGdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5YNT09PTB9LAogZ29yOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlg1IT09MH0sCi1ndmM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IFAuaTUodGhpcyksW0guS3AodGhpcywwKV0pfSwKLWdVUTpmdW5jdGlvbihhKXtyZXR1cm4gSC5LMShILlZNKG5ldyBQLmk1KHRoaXMpLFtILktwKHRoaXMsMCldKSxuZXcgUC5hMSh0aGlzKSxILktwKHRoaXMsMCksSC5LcCh0aGlzLDEpKX0sCitndmM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IFAuaTUodGhpcyksW0guT3EodGhpcywwKV0pfSwKK2dVUTpmdW5jdGlvbihhKXtyZXR1cm4gSC5LMShILlZNKG5ldyBQLmk1KHRoaXMpLFtILk9xKHRoaXMsMCldKSxuZXcgUC5hMSh0aGlzKSxILk9xKHRoaXMsMCksSC5PcSh0aGlzLDEpKX0sCiB4NDpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGlmKHR5cGVvZiBiPT09InN0cmluZyImJmIhPT0iX19wcm90b19fIil7ej10aGlzLnZ2CiBpZih6PT1udWxsKXJldHVybiExCkBAIC02ODE1LDcgKzY4OTQsNyBAQAogej1hLmxlbmd0aAogZm9yKHk9MDt5PHo7Kyt5KWlmKEoueEMoSi51cChhW3ldKSxiKSlyZXR1cm4geQogcmV0dXJuLTF9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNGbzp0cnVlLAogJGlzWjA6dHJ1ZSwKICRhc1owOm51bGwsCkBAIC02ODI0LDE0ICs2OTAzLDE0IEBACiBkZWxldGUgelsiPG5vbi1pZGVudGlmaWVyLWtleT4iXQogcmV0dXJuIHp9fX0sCiBhMTp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEudCgwLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTI5LCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hLnQoMCxhKX0sIiQxIixudWxsLDIsMCxudWxsLDEzMCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBwazp7Ci0iXiI6IlRwO2EiLAotJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsNzcsMjEsImNhbGwiXSwKKyJeIjoiVHBaO2EiLAorJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsNzgsMjEsImNhbGwiXSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoibGIiLGFyZ3M6W2EsYl19fSx0aGlzLmEsIllCIil9fSwKKyRzaWduYXR1cmU6ZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhLGIpe3JldHVybntmdW5jOiJvSyIsYXJnczpbYSxiXX19LHRoaXMuYSwiWUIiKX19LAogZGI6ewogIl4iOiJhO2toPixjQUAsREdALHpRQCJ9LAogaTU6ewpAQCAtNjg2Myw5ICs2OTQyLDkgQEAKIHJldHVybiExfWVsc2V7dGhpcy5mRD16LmdraCh6KQogdGhpcy56cT10aGlzLnpxLmdERygpCiByZXR1cm4hMH19fX0sCi1Scjp7CitqZzp7CiAiXiI6InUzVDtYNSx2dixPWCxPQixETSIsCi1ZczpmdW5jdGlvbigpe3ZhciB6PW5ldyBQLlJyKDAsbnVsbCxudWxsLG51bGwsbnVsbCkKK1lzOmZ1bmN0aW9uKCl7dmFyIHo9bmV3IFAuamcoMCxudWxsLG51bGwsbnVsbCxudWxsKQogei4kYnVpbHRpblR5cGVJbmZvPXRoaXMuJGJ1aWx0aW5UeXBlSW5mbwogcmV0dXJuIHp9LAogZ0E6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAuY04odGhpcyx0aGlzLlpsKCksMCxudWxsKQpAQCAtNzE0MCw5ICs3MjE5LDkgQEAKIHJldHVybiB6fX0sCiBtVzp7CiAiXiI6ImE7IiwKLWV6OltmdW5jdGlvbihhLGIpe3JldHVybiBILksxKHRoaXMsYixILmlwKHRoaXMsIm1XIiwwKSxudWxsKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiVXkiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJLNiIsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJtVyIpfSwzMV0sCitlejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5LMSh0aGlzLGIsSC5pcCh0aGlzLCJtVyIsMCksbnVsbCl9LCIkMSIsImdJciIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlV5IixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoidWJqIixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIm1XIil9LDMxXSwKIGFkOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEguVTUodGhpcyxiKSxbSC5pcCh0aGlzLCJtVyIsMCldKX0sCi1sTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQSh0aGlzLGIpLFtILmlwKHRoaXMsIm1XIiwwKSxudWxsXSl9LCIkMSIsImdpdCIsMiwwLGZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlJTIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoidHIiLHJldDpQLlFWLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibVciKX0sMzFdLAorbE06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEgub0EodGhpcyxiKSxbSC5pcCh0aGlzLCJtVyIsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJSUyIscmV0OlAuUVYsYXJnczpbe2Z1bmM6IkU3IixyZXQ6UC5RVixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsIm1XIil9LDMxXSwKIHRnOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGZvcih6PXRoaXMuZ0EodGhpcyk7ei5HKCk7KWlmKEoueEMoei5nbCgpLGIpKXJldHVybiEwCiByZXR1cm4hMX0sCkBAIC03MTg0LDEyICs3MjYzLDEyIEBACiB3PUoueCh5KQogaWYody5uKHksMCkpcmV0dXJuIHgKIHk9dy5XKHksMSl9dGhyb3cgSC5iKFAuTihiKSl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuSXgodGhpcywiKCIsIikiKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAuSXgodGhpcywiKCIsIikiKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzUVY6dHJ1ZSwKICRhc1FWOm51bGx9LAogYXJrOnsKLSJeIjoiRTloOyJ9LAotRTloOnsKKyJeIjoiSXI7In0sCitJcjp7CiAiXiI6ImErbEQ7IiwKICRpc1dPOnRydWUsCiAkYXNXTzpudWxsLApAQCAtNzIyMiw4ICs3MzAxLDggQEAKIHouV2UoYSxiKQogcmV0dXJuIHoudk19LAogYWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5VNShhLGIpLFtILmlwKGEsImxEIiwwKV0pfSwKLWV6OltmdW5jdGlvbihhLGIpe3JldHVybiBILlZNKG5ldyBILkE4KGEsYiksW251bGwsbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJmUU8iLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJ1YmoiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibEQiKX0sMzFdLAotbE06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEgub0EoYSxiKSxbSC5pcChhLCJsRCIsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJHYmEiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJWTCIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsRCIpfSwzMV0sCitlejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5BOChhLGIpLFtudWxsLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiTVEiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJPQTIiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibEQiKX0sMzFdLAorbE06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEgub0EoYSxiKSxbSC5pcChhLCJsRCIsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJHYmEiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJ0ciIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsRCIpfSwzMV0sCiBlUjpmdW5jdGlvbihhLGIpe3JldHVybiBILmMxKGEsYixudWxsLG51bGwpfSwKIHR0OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiBpZihiKXt6PUguVk0oW10sW0guaXAoYSwibEQiLDApXSkKQEAgLTcyNDEsNyArNzMyMCw3IEBACiB0aGlzLnNCKGEseisxKQogdGhpcy51KGEseixiKX0sCiBGVjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAotZm9yKHo9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guS3AoYiwwKV0pO3ouRygpOyl7eT16LmxvCitmb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5PcShiLDApXSk7ei5HKCk7KXt5PXoubG8KIHg9dGhpcy5nQihhKQogdGhpcy5zQihhLHgrMSkKIHRoaXMudShhLHgseSl9fSwKQEAgLTcyNTgsNiArNzMzNywxNCBAQAogaWYoei5DKGIsMCl8fHouRChiLHRoaXMuZ0IoYSkpKXRocm93IEguYihQLlRFKGIsMCx0aGlzLmdCKGEpKSkKIHo9Si5XeChjKQogaWYoei5DKGMsYil8fHouRChjLHRoaXMuZ0IoYSkpKXRocm93IEguYihQLlRFKGMsYix0aGlzLmdCKGEpKSl9LAorYU06ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3Cit0aGlzLnBaKGEsYixjKQorej1jLWIKK3k9SC5WTShbXSxbSC5pcChhLCJsRCIsMCldKQorQy5ObS5zQih5LHopCitmb3IoeD0wO3g8ejsrK3gpe3c9dGhpcy50KGEsYit4KQoraWYoeD49eS5sZW5ndGgpcmV0dXJuIEguZSh5LHgpCit5W3hdPXd9cmV0dXJuIHl9LAogTXU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMucFooYSxiLGMpCiByZXR1cm4gSC5jMShhLGIsYyxudWxsKX0sCiBVWjpmdW5jdGlvbihhLGIsYyl7dmFyIHoKQEAgLTczMDcsMjEgKzczOTQsMjEgQEAKIGlmKCEhei4kaXNXTyl0aGlzLnpCKGEsYixiK3ouZ0IoYyksYykKIGVsc2UgZm9yKHo9ei5nQShjKTt6LkcoKTtiPXkpe3k9YisxCiB0aGlzLnUoYSxiLHouZ2woKSl9fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBQLldFKGEsIlsiLCJdIil9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc1dPOnRydWUsCiAkYXNXTzpudWxsLAogJGlzeU46dHJ1ZSwKICRpc1FWOnRydWUsCiAkYXNRVjpudWxsfSwKIFcwOnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpbZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmEKIGlmKCF6LmEpdGhpcy5iLktGKCIsICIpCiB6LmE9ITEKIHo9dGhpcy5iCiB6LktGKGEpCiB6LktGKCI6ICIpCi16LktGKGIpfSwiJDIiLG51bGwsNCwwLG51bGwsMTMwLDY0LCJjYWxsIl0sCit6LktGKGIpfSwiJDIiLG51bGwsNCwwLG51bGwsMTMxLDY0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFN3OnsKICJeIjoibVc7djUsYXYsZVoscVQiLApAQCAtNzM0NiwxMCArNzQzMywxMCBAQAogaWYoeTwwfHx5Pj14KXJldHVybiBILmUoeix5KQogcmV0dXJuIHpbeV19LAogdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgeix5Ci1pZihiKXt6PUguVk0oW10sW0guS3AodGhpcywwKV0pCitpZihiKXt6PUguVk0oW10sW0guT3EodGhpcywwKV0pCiBDLk5tLnNCKHosdGhpcy5nQih0aGlzKSl9ZWxzZXt5PUFycmF5KHRoaXMuZ0IodGhpcykpCiB5LmZpeGVkJGxlbmd0aD1pbml0Ci16PUguVk0oeSxbSC5LcCh0aGlzLDApXSl9dGhpcy5HUCh6KQorej1ILlZNKHksW0guT3EodGhpcywwKV0pfXRoaXMuSXgoeikKIHJldHVybiB6fSwKIGJyOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnR0KGEsITApfSwKIGg6ZnVuY3Rpb24oYSxiKXt0aGlzLk5aKDAsYil9LApAQCAtNzM1OSwxMiArNzQ0NiwxMiBAQAogeD15K3oKIHc9dGhpcy52NQogdj13Lmxlbmd0aAotaWYoeD49dil7dT1QLnhxKHgpCitpZih4Pj12KXt1PVAudWF5KHgpCiBpZih0eXBlb2YgdSE9PSJudW1iZXIiKXJldHVybiBILnModSkKIHc9QXJyYXkodSkKIHcuZml4ZWQkbGVuZ3RoPWluaXQKLXQ9SC5WTSh3LFtILktwKHRoaXMsMCldKQotdGhpcy5lWj10aGlzLkdQKHQpCit0PUguVk0odyxbSC5PcSh0aGlzLDApXSkKK3RoaXMuZVo9dGhpcy5JeCh0KQogdGhpcy52NT10CiB0aGlzLmF2PTAKIEgucUcodCx5LHgsYiwwKQpAQCAtNzM5OCw3ICs3NDg1LDcgQEAKIGlmKHohPT15KXtmb3IoeD10aGlzLnY1LHc9eC5sZW5ndGgsdj13LTE7eiE9PXk7ej0oeisxJnYpPj4+MCl7aWYoejwwfHx6Pj13KXJldHVybiBILmUoeCx6KQogeFt6XT1udWxsfXRoaXMuZVo9MAogdGhpcy5hdj0wOysrdGhpcy5xVH19LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogQVI6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdwogej10aGlzLmF2CiBpZih6PT09dGhpcy5lWil0aHJvdyBILmIoSC5EVSgpKTsrK3RoaXMucVQKQEAgLTc0NDMsNyArNzUzMCw3IEBACiBNOTpmdW5jdGlvbigpe3ZhciB6LHkseCx3CiB6PUFycmF5KHRoaXMudjUubGVuZ3RoKjIpCiB6LmZpeGVkJGxlbmd0aD1pbml0Ci15PUguVk0oeixbSC5LcCh0aGlzLDApXSkKK3k9SC5WTSh6LFtILk9xKHRoaXMsMCldKQogej10aGlzLnY1CiB4PXRoaXMuYXYKIHc9ei5sZW5ndGgteApAQCAtNzQ1NCw3ICs3NTQxLDcgQEAKIHRoaXMuYXY9MAogdGhpcy5lWj10aGlzLnY1Lmxlbmd0aAogdGhpcy52NT15fSwKLUdQOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKK0l4OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5hdgogeT10aGlzLmVaCiB4PXRoaXMudjUKQEAgLTc0NzIsNyArNzU1OSw3IEBACiAkaXN5Tjp0cnVlLAogJGlzUVY6dHJ1ZSwKICRhc1FWOm51bGwsCi1zdGF0aWM6eyJeIjoiVE5lIix4cTpmdW5jdGlvbihhKXt2YXIgegorc3RhdGljOnsiXiI6IlROZSIsdWF5OmZ1bmN0aW9uKGEpe3ZhciB6CiBpZih0eXBlb2YgYSE9PSJudW1iZXIiKXJldHVybiBhLk8oKQogYT0oYTw8Mj4+PjApLTEKIGZvcig7ITA7YT16KXt6PShhJmEtMSk+Pj4wCkBAIC03NDk5LDI2ICs3NTg2LDI2IEBACiBGVjpmdW5jdGlvbihhLGIpe3ZhciB6CiBmb3Ioej1KLm1ZKGIpO3ouRygpOyl0aGlzLmgoMCx6LmdsKCkpfSwKIEV4OmZ1bmN0aW9uKGEpe3ZhciB6Ci1mb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5LcChhLDApXSk7ei5HKCk7KXRoaXMuUnooMCx6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KGEsYS5sZW5ndGgsMCxudWxsKSxbSC5PcShhLDApXSk7ei5HKCk7KXRoaXMuUnooMCx6LmxvKX0sCiBOazpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogej1bXQogZm9yKHk9dGhpcy5nQSh0aGlzKTt5LkcoKTspe3g9eS5nbCgpCiBpZihiLiQxKHgpPT09ITApei5wdXNoKHgpfXRoaXMuRXgoeil9LAogdHQ6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2Ci1pZihiKXt6PUguVk0oW10sW0guS3AodGhpcywwKV0pCitpZihiKXt6PUguVk0oW10sW0guT3EodGhpcywwKV0pCiBDLk5tLnNCKHosdGhpcy5nQih0aGlzKSl9ZWxzZXt5PUFycmF5KHRoaXMuZ0IodGhpcykpCiB5LmZpeGVkJGxlbmd0aD1pbml0Ci16PUguVk0oeSxbSC5LcCh0aGlzLDApXSl9Zm9yKHk9dGhpcy5nQSh0aGlzKSx4PTA7eS5HKCk7eD12KXt3PXkuZ2woKQorej1ILlZNKHksW0guT3EodGhpcywwKV0pfWZvcih5PXRoaXMuZ0EodGhpcykseD0wO3kuRygpO3g9dil7dz15LmdsKCkKIHY9eCsxCiBpZih4Pj16Lmxlbmd0aClyZXR1cm4gSC5lKHoseCkKIHpbeF09d31yZXR1cm4gen0sCiBicjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50dChhLCEwKX0sCi1lejpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC54eSh0aGlzLGIpLFtILktwKHRoaXMsMCksbnVsbF0pfSwiJDEiLCJnSXIiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJ4UG8iLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJPQTIiLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibGZ1Iil9LDMxXSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLldFKHRoaXMsInsiLCJ9Iil9LAorZXo6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEgueHkodGhpcyxiKSxbSC5PcSh0aGlzLDApLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiZlFPIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiSm1SIixhcmdzOlthXX1dfX0sdGhpcy4kcmVjZWl2ZXIsImxmdSIpfSwzMV0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAuV0UodGhpcywieyIsIn0iKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogYWQ6ZnVuY3Rpb24oYSxiKXt2YXIgej1uZXcgSC5VNSh0aGlzLGIpCiB6LiRidWlsdGluVHlwZUluZm89dGhpcy4kYnVpbHRpblR5cGVJbmZvCiByZXR1cm4gen0sCi1sTTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5WTShuZXcgSC5vQSh0aGlzLGIpLFtILktwKHRoaXMsMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCxmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEpe3JldHVybntmdW5jOiJQQUoiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJENiIscmV0OlAuUVYsYXJnczpbYV19XX19LHRoaXMuJHJlY2VpdmVyLCJsZnUiKX0sMzFdLAorbE06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IEgub0EodGhpcyxiKSxbSC5PcSh0aGlzLDApLG51bGxdKX0sIiQxIiwiZ2l0IiwyLDAsZnVuY3Rpb24oKXtyZXR1cm4gSC5YVyhmdW5jdGlvbihhKXtyZXR1cm57ZnVuYzoiUEFKIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoiVkwiLHJldDpQLlFWLGFyZ3M6W2FdfV19fSx0aGlzLiRyZWNlaXZlciwibGZ1Iil9LDMxXSwKIGFOOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGZvcih6PXRoaXMuZ0EodGhpcyk7ei5HKCk7KWIuJDEoei5nbCgpKX0sCiB6VjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseApAQCAtNzYxNCwxNCArNzcwMSwxNCBAQAogQmE6ewogIl4iOiJ2WDE7cVcsaGcsYVksaVcsSjAscVQsYmIiLAogd1M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5xVy4kMihhLGIpfSwKLUVmOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhnLiQxKGEpfSwKK1h5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmhnLiQxKGEpfSwKIHlWOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMud1MoYSxiKX0sCiB0OmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbCl0aHJvdyBILmIoUC51KGIpKQotaWYodGhpcy5FZihiKSE9PSEwKXJldHVybgoraWYodGhpcy5YeShiKSE9PSEwKXJldHVybgogaWYodGhpcy5hWSE9bnVsbClpZihKLnhDKHRoaXMudmgoYiksMCkpcmV0dXJuIHRoaXMuYVkuUAogcmV0dXJufSwKIFJ6OmZ1bmN0aW9uKGEsYil7dmFyIHoKLWlmKHRoaXMuRWYoYikhPT0hMClyZXR1cm4KK2lmKHRoaXMuWHkoYikhPT0hMClyZXR1cm4KIHo9dGhpcy5iQihiKQogaWYoeiE9bnVsbClyZXR1cm4gei5QCiByZXR1cm59LApAQCAtNzYzNCw3ICs3NzIxLDcgQEAKIGdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hWT09bnVsbH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYVkhPW51bGx9LAogYU46ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKLXo9SC5LcCh0aGlzLDApCit6PUguT3EodGhpcywwKQogeT1ILlZNKG5ldyBQLkhXKHRoaXMsSC5WTShbXSxbUC5vel0pLHRoaXMucVQsdGhpcy5iYixudWxsKSxbel0pCiB5LlFmKHRoaXMsW1Aub3osel0pCiBmb3IoO3kuRygpOyl7eD15LmdsKCkKQEAgLTc2NDMsMTEgKzc3MzAsMTIgQEAKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkowfSwKIFYxOmZ1bmN0aW9uKGEpe3RoaXMuYVk9bnVsbAogdGhpcy5KMD0wOysrdGhpcy5xVH0sCi1ndmM6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IFAubkYodGhpcyksW0guS3AodGhpcywwKV0pfSwKK3g0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWHkoYik9PT0hMCYmSi54Qyh0aGlzLnZoKGIpLDApfSwKK2d2YzpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5uRih0aGlzKSxbSC5PcSh0aGlzLDApXSl9LAogZ1VROmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBQLnJvKHRoaXMpCiB6LiRidWlsdGluVHlwZUluZm89dGhpcy4kYnVpbHRpblR5cGVJbmZvCiByZXR1cm4gen0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0JhOnRydWUsCiAkYXN2WDE6ZnVuY3Rpb24oYSxiKXtyZXR1cm5bYV19LAogJGFzWjA6bnVsbCwKQEAgLTc2NTcsMTUgKzc3NDUsMTUgQEAKIHk9bmV3IFAuQW4oYykKIHJldHVybiBILlZNKG5ldyBQLkJhKHoseSxudWxsLEguVk0obmV3IFAub3oobnVsbCxudWxsLG51bGwpLFtjXSksMCwwLDApLFtjLGRdKX19fSwKIEFuOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6PUguSVUoYSx0aGlzLmEpCiByZXR1cm4gen0sCiAkaXNFSDp0cnVlfSwKIFFHOnsKLSJeIjoiVHA7YSIsCisiXiI6IlRwWjthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLGIpfSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoidlB0IixhcmdzOlthLGJdfX0sdGhpcy5hLCJCYSIpfX0sCiskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSxiKXtyZXR1cm57ZnVuYzoiQmkiLGFyZ3M6W2EsYl19fSx0aGlzLmEsIkJhIil9fSwKIFM2Qjp7CiAiXiI6ImE7IiwKIGdsOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy55YQpAQCAtNzY5Nyw3ICs3Nzg1LDcgQEAKIHo9dGhpcy5sVAogeT1uZXcgUC5ETih6LEguVk0oW10sW1Aub3pdKSx6LnFULHouYmIsbnVsbCkKIHkuJGJ1aWx0aW5UeXBlSW5mbz10aGlzLiRidWlsdGluVHlwZUluZm8KLXkuUWYoeixILktwKHRoaXMsMCkpCit5LlFmKHosSC5PcSh0aGlzLDApKQogcmV0dXJuIHl9LAogJGlzeU46dHJ1ZX0sCiBybzp7CkBAIC03NzA4LDcgKzc3OTYsNyBAQAogej10aGlzLkZiCiB5PW5ldyBQLlpNKHosSC5WTShbXSxbUC5vel0pLHoucVQsei5iYixudWxsKQogeS4kYnVpbHRpblR5cGVJbmZvPXRoaXMuJGJ1aWx0aW5UeXBlSW5mbwoteS5RZih6LEguS3AodGhpcywxKSkKK3kuUWYoeixILk9xKHRoaXMsMSkpCiByZXR1cm4geX0sCiAkYXNtVzpmdW5jdGlvbihhLGIpe3JldHVybltiXX0sCiAkYXNRVjpmdW5jdGlvbihhLGIpe3JldHVybltiXX0sCkBAIC03NzM2LDExICs3ODI0LDExIEBACiB0aHJvdyBILmIoUC5jRChTdHJpbmcoeSkpKX1yZXR1cm4gUC5WUSh6LGIpfSwKIHRwOltmdW5jdGlvbihhKXtyZXR1cm4gYS5MdCgpfSwiJDEiLCJKbiIsMiwwLDQ5LDUwXSwKIEpDOnsKLSJeIjoiVHA6Nzk7IiwKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiBifSwKICRpc0VIOnRydWV9LAogZjE6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQKIGlmKGE9PW51bGx8fHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQogaWYoT2JqZWN0LmdldFByb3RvdHlwZU9mKGEpPT09QXJyYXkucHJvdG90eXBlKXt6PWEKQEAgLTc3NjAsMjMgKzc4NDgsMjMgQEAKICJeIjoiVWtyOyIsCiAkYXNVa3I6ZnVuY3Rpb24oKXtyZXR1cm5bUC5xVSxbUC5XTyxQLktOXV19fSwKIEFKOnsKLSJeIjoiWFM7Q3QsRk4iLAotYnU6ZnVuY3Rpb24oYSl7aWYodGhpcy5GTiE9bnVsbClyZXR1cm4iQ29udmVydGluZyBvYmplY3QgdG8gYW4gZW5jb2RhYmxlIG9iamVjdCBmYWlsZWQuIgotZWxzZSByZXR1cm4iQ29udmVydGluZyBvYmplY3QgZGlkIG5vdCByZXR1cm4gYW4gZW5jb2RhYmxlIG9iamVjdC4ifSwKKyJeIjoiWFM7UGMsRk4iLAorYnU6W2Z1bmN0aW9uKGEpe2lmKHRoaXMuRk4hPW51bGwpcmV0dXJuIkNvbnZlcnRpbmcgb2JqZWN0IHRvIGFuIGVuY29kYWJsZSBvYmplY3QgZmFpbGVkLiIKK2Vsc2UgcmV0dXJuIkNvbnZlcnRpbmcgb2JqZWN0IGRpZCBub3QgcmV0dXJuIGFuIGVuY29kYWJsZSBvYmplY3QuIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntHeTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgUC5BSihhLGIpfX19LAogSzg6ewotIl4iOiJBSjtDdCxGTiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iQ3ljbGljIGVycm9yIGluIEpTT04gc3RyaW5naWZ5In0sCi1zdGF0aWM6e1lmOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5LOChhLG51bGwpfX19LAotcEU6eworIl4iOiJBSjtQYyxGTiIsCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIkN5Y2xpYyBlcnJvciBpbiBKU09OIHN0cmluZ2lmeSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKK3N0YXRpYzp7a286ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLks4KGEsbnVsbCl9fX0sCitieWc6ewogIl4iOiJVa3I7cWE8LE45IiwKLXBXOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFAuamMoYSx0aGlzLmdIZSgpLnFhKX0sCitwVzpmdW5jdGlvbihhLGIpe3JldHVybiBQLmpjKGEsdGhpcy5nUDEoKS5xYSl9LAoga1Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucFcoYSxudWxsKX0sCiBRMDpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuZ1pFKCkKIHJldHVybiBQLlZnKGEsei5TSSx6LlVNKX0sCiBLUDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5RMChhLG51bGwpfSwKIGdaRTpmdW5jdGlvbigpe3JldHVybiBDLmNifSwKLWdIZTpmdW5jdGlvbigpe3JldHVybiBDLkEzfSwKK2dQMTpmdW5jdGlvbigpe3JldHVybiBDLkEzfSwKICRhc1VrcjpmdW5jdGlvbigpe3JldHVybltQLmEsUC5xVV19fSwKIG9qRjp7CiAiXiI6IndJZTtVTSxTSSIsCkBAIC03Nzk4LDQ2ICs3ODg2LDQ2IEBACiBpZih1PjkyKWNvbnRpbnVlCiBpZih1PDMyKXtpZih2Pncpe3Q9ei5OaihhLHcsdikKIHgudk0rPXR9dz12KzEKLXQ9SC5KTSg5MikKK3Q9SC5teCg5MikKIHgudk0rPXQKLXN3aXRjaCh1KXtjYXNlIDg6dD1ILkpNKDk4KQorc3dpdGNoKHUpe2Nhc2UgODp0PUgubXgoOTgpCiB4LnZNKz10CiBicmVhawotY2FzZSA5OnQ9SC5KTSgxMTYpCitjYXNlIDk6dD1ILm14KDExNikKIHgudk0rPXQKIGJyZWFrCi1jYXNlIDEwOnQ9SC5KTSgxMTApCitjYXNlIDEwOnQ9SC5teCgxMTApCiB4LnZNKz10CiBicmVhawotY2FzZSAxMjp0PUguSk0oMTAyKQorY2FzZSAxMjp0PUgubXgoMTAyKQogeC52TSs9dAogYnJlYWsKLWNhc2UgMTM6dD1ILkpNKDExNCkKK2Nhc2UgMTM6dD1ILm14KDExNCkKIHgudk0rPXQKIGJyZWFrCi1kZWZhdWx0OnQ9SC5KTSgxMTcpCitkZWZhdWx0OnQ9SC5teCgxMTcpCiB4LnZNKz10Ci10PUguSk0oNDgpCit0PUgubXgoNDgpCiB4LnZNKz10Ci10PUguSk0oNDgpCit0PUgubXgoNDgpCiB4LnZNKz10CiB0PXU+Pj40JjE1Ci10PUguSk0odDwxMD80OCt0Ojg3K3QpCit0PUgubXgodDwxMD80OCt0Ojg3K3QpCiB4LnZNKz10CiB0PXUmMTUKLXQ9SC5KTSh0PDEwPzQ4K3Q6ODcrdCkKK3Q9SC5teCh0PDEwPzQ4K3Q6ODcrdCkKIHgudk0rPXQKIGJyZWFrfX1lbHNlIGlmKHU9PT0zNHx8dT09PTkyKXtpZih2Pncpe3Q9ei5OaihhLHcsdikKIHgudk0rPXR9dz12KzEKLXQ9SC5KTSg5MikKK3Q9SC5teCg5MikKIHgudk0rPXQKLXQ9SC5KTSh1KQordD1ILm14KHUpCiB4LnZNKz10fX1pZih3PT09MCl4LnZNKz10eXBlb2YgYT09PSJzdHJpbmciP2E6SC5kKGEpCiBlbHNlIGlmKHc8eSl7ej16Lk5qKGEsdyx5KQogeC52TSs9en19LAogV0Q6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIGZvcih6PXRoaXMub2wseT16Lmxlbmd0aCx4PTA7eDx5OysreCl7dz16W3hdCi1pZihhPT1udWxsP3c9PW51bGw6YT09PXcpdGhyb3cgSC5iKFAuWWYoYSkpfXoucHVzaChhKX0sCitpZihhPT1udWxsP3c9PW51bGw6YT09PXcpdGhyb3cgSC5iKFAua28oYSkpfXoucHVzaChhKX0sCiBDNzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogaWYoIXRoaXMuSmMoYSkpe3RoaXMuV0QoYSkKIHRyeXt6PXRoaXMuaVkoYSkKQEAgLTc4NzgsMTMgKzc5NjYsMTMgQEAKIHBnOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMub2wKIGlmKDA+PXoubGVuZ3RoKXJldHVybiBILmUoeiwwKQogei5wb3AoKX0sCi1zdGF0aWM6eyJeIjoiR3NtLGh5WSxUYTYsSnlmLE5vVixIVmUsdEYsQkxtLHZrLEhvLG1ydCxOWHUsQ0UsUVZ2Iix4bDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlNoKGIsYSxbXSl9LFZnOmZ1bmN0aW9uKGEsYixjKXt2YXIgegorc3RhdGljOnsiXiI6IkdzbSxoeVksVGE2LEp5ZixOb1YsSFZlLEFUZixCTG0sS1F6LEhvLG1ydCxOWHUsQ0UsUVZ2Iix4bDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlNoKGIsYSxbXSl9LFZnOmZ1bmN0aW9uKGEsYixjKXt2YXIgegogYj1QLkpuKCkKIHo9UC5wOSgiIikKIFAueGwoeixiLGMpLkM3KGEpCiByZXR1cm4gei52TX19fSwKIHU1Rjp7Ci0iXiI6IlppdjtJeSIsCisiXiI6IlppdjtJRSIsCiBnb2M6ZnVuY3Rpb24oYSl7cmV0dXJuInV0Zi04In0sCiBnWkU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFAub20oKX19LAogb206ewpAQCAtNzg5NiwxMSArNzk4NCwxMSBAQAogeT1BcnJheSh5KQogeS5maXhlZCRsZW5ndGg9aW5pdAogeT1ILlZNKHksW1AuS05dKQoteD1uZXcgUC5lbigwLDAseSkKLWlmKHgucncoYSwwLHouZ0IoYSkpIT09ei5nQihhKSl4Lkk3KHouaihhLEouYkkoei5nQihhKSwxKSksMCkKK3g9bmV3IFAuUncoMCwwLHkpCitpZih4LnJ3KGEsMCx6LmdCKGEpKSE9PXouZ0IoYSkpeC5JNyh6LmooYSxKLkhuKHouZ0IoYSksMSkpLDApCiByZXR1cm4gQy5ObS5hTSh5LDAseC5MOCl9LAogJGFzd0llOmZ1bmN0aW9uKCl7cmV0dXJuW1AucVUsW1AuV08sUC5LTl1dfX0sCi1lbjp7CitSdzp7CiAiXiI6ImE7U28sTDgsSVQiLAogSTc6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuSVQKQEAgLTc5MzYsNyArODAyNCw3IEBACiB6W3ldPTEyOHxhJjYzCiByZXR1cm4hMX19LAogcnc6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYsdSx0LHMKLWlmKGIhPT1jJiYoSi5QcChhLEouYkkoYywxKSkmNjQ1MTIpPT09NTUyOTYpYz1KLmJJKGMsMSkKK2lmKGIhPT1jJiYoSi5QcChhLEouSG4oYywxKSkmNjQ1MTIpPT09NTUyOTYpYz1KLkhuKGMsMSkKIGlmKHR5cGVvZiBjIT09Im51bWJlciIpcmV0dXJuIEgucyhjKQogej10aGlzLklUCiB5PXoubGVuZ3RoCkBAIC03OTY4LDcgKzgwNTYsOTAgQEAKIHRoaXMuTDg9dSsxCiBpZih1Pj15KXJldHVybiBILmUoeix1KQogelt1XT0xMjh8diY2M319cmV0dXJuIHd9LAotc3RhdGljOnsiXiI6IkpmNCJ9fX1dLFsiZGFydC5jb3JlIiwiZGFydDpjb3JlIiwsUCx7CitzdGF0aWM6eyJeIjoiSmY0In19LAorR1k6eworIl4iOiJ3SWU7SUUiLAorV0o6ZnVuY3Rpb24oYSl7dmFyIHoseQorej1QLnA5KCIiKQoreT1uZXcgUC50eih0aGlzLklFLHosITAsMCwwLDApCit5Lk1FKGEsMCxKLnE4KGEpKQoreS5mWigpCityZXR1cm4gei52TX0sCiskYXN3SWU6ZnVuY3Rpb24oKXtyZXR1cm5bW1AuV08sUC5LTl0sUC5xVV19fSwKK3R6OnsKKyJeIjoiYTtJRSxaQixBWCxGVSxrTixOWSIsCit4TzpmdW5jdGlvbihhKXt0aGlzLmZaKCl9LAorZlo6ZnVuY3Rpb24oKXtpZih0aGlzLmtOPjApe2lmKHRoaXMuSUUhPT0hMCl0aHJvdyBILmIoUC5jRCgiVW5maW5pc2hlZCBVVEYtOCBvY3RldCBzZXF1ZW5jZSIpKQordGhpcy5aQi5LRihILm14KDY1NTMzKSkKK3RoaXMuRlU9MAordGhpcy5rTj0wCit0aGlzLk5ZPTB9fSwKK01FOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtCit6PXt9Cit5PXRoaXMuRlUKK3g9dGhpcy5rTgordz10aGlzLk5ZCit6LmE9MAordGhpcy5GVT0wCit0aGlzLmtOPTAKK3RoaXMuTlk9MAordj1uZXcgUC56Qyh6LHRoaXMsYSkKKyRsb29wJDA6Zm9yKHU9dGhpcy5aQix0PXRoaXMuSUUhPT0hMCxzPUouVTYoYSkscj1iOyEwO3I9byl7JG11bHRpYnl0ZSQyOntpZih4PjApe2Rve2lmKHI9PT1jKWJyZWFrICRsb29wJDAKK3E9cy50KGEscikKK3A9Si5XeChxKQoraWYocC5pKHEsMTkyKSE9PTEyOCl7aWYodCl0aHJvdyBILmIoUC5jRCgiQmFkIFVURi04IGVuY29kaW5nIDB4IitwLldaKHEsMTYpKSkKK3RoaXMuQVg9ITEKK3A9SC5teCg2NTUzMykKK3Uudk0rPXAKK3g9MAorYnJlYWsgJG11bHRpYnl0ZSQyfWVsc2V7eT0oeTw8NnxwLmkocSw2MykpPj4+MDstLXg7KytyfX13aGlsZSh4PjApCitwPXctMQoraWYocDwwfHxwPj00KXJldHVybiBILmUoQy5HYixwKQoraWYoeTw9Qy5HYltwXSl7aWYodCl0aHJvdyBILmIoUC5jRCgiT3ZlcmxvbmcgZW5jb2Rpbmcgb2YgMHgiK0Muam4uV1ooeSwxNikpKQoreT02NTUzMworeD0wCit3PTB9aWYoeT4xMTE0MTExKXtpZih0KXRocm93IEguYihQLmNEKCJDaGFyYWN0ZXIgb3V0c2lkZSB2YWxpZCBVbmljb2RlIHJhbmdlOiAweCIrQy5qbi5XWih5LDE2KSkpCit5PTY1NTMzfWlmKCF0aGlzLkFYfHx5IT09NjUyNzkpe3A9SC5teCh5KQordS52TSs9cH10aGlzLkFYPSExfX1mb3IoO3I8YztyPW8pe289cisxCitxPXMudChhLHIpCitwPUouV3gocSkKK2lmKHAuQyhxLDApKXtuPXouYQoraWYobj4wKXttPW8tMQordi4kMihtLW4sbSl9aWYodCl0aHJvdyBILmIoUC5jRCgiTmVnYXRpdmUgVVRGLTggY29kZSB1bml0OiAtMHgiK0MuQ0QuV1oocC5KKHEpLDE2KSkpCitwPUgubXgoNjU1MzMpCit1LnZNKz1wfWVsc2UgaWYocC5FKHEsMTI3KSl7dGhpcy5BWD0hMTsrK3ouYX1lbHNle249ei5hCitpZihuPjApe209by0xCit2LiQyKG0tbixtKX1pZihwLmkocSwyMjQpPT09MTkyKXt5PXAuaShxLDMxKQoreD0xCit3PTEKK2NvbnRpbnVlICRsb29wJDB9aWYocC5pKHEsMjQwKT09PTIyNCl7eT1wLmkocSwxNSkKK3g9Mgordz0yCitjb250aW51ZSAkbG9vcCQwfWlmKHAuaShxLDI0OCk9PT0yNDAmJnAuQyhxLDI0NSkpe3k9cC5pKHEsNykKK3g9Mwordz0zCitjb250aW51ZSAkbG9vcCQwfWlmKHQpdGhyb3cgSC5iKFAuY0QoIkJhZCBVVEYtOCBlbmNvZGluZyAweCIrcC5XWihxLDE2KSkpCit0aGlzLkFYPSExCitwPUgubXgoNjU1MzMpCit1LnZNKz1wCit5PTY1NTMzCit4PTAKK3c9MH19YnJlYWsgJGxvb3AkMH16PXouYQoraWYoej4wKXYuJDIoci16LGMpCitpZih4PjApe3RoaXMuRlU9eQordGhpcy5rTj14Cit0aGlzLk5ZPXd9fSwKK3N0YXRpYzp7Il4iOiJBRGkifX0sCit6Qzp7CisiXiI6IlRwWjoxMzI7YSxiLGMiLAorJDI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKK3o9YT09PTAmJmI9PT1KLnE4KHRoaXMuYykKK3k9dGhpcy5iCit4PXRoaXMuYworaWYoeil5LlpCLktGKFAuUWUoeCkpCitlbHNlIHkuWkIuS0YoUC5RZShKLkZkKHgsYSxiKSkpCit0aGlzLmEuYT0wfSwKKyRpc0VIOnRydWV9fV0sWyJkYXJ0LmNvcmUiLCJkYXJ0OmNvcmUiLCxQLHsKICJeIjoiIiwKIFRlOmZ1bmN0aW9uKGEpe3JldHVybn0sCiBXYzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5GVyhhLGIpfSwiJDIiLCJuNCIsNCwwLDUxLDQ2LDQ3XSwKQEAgLTc5ODMsMTAgKzgxNTQsMTAgQEAKIGVsc2V7dz16LnZNKz0iXFx4IgogaWYodjwxNil6LnZNPXcrIjAiCiBlbHNle3oudk09dysiMSIKLXYtPTE2fXc9SC5KTSh2PDEwPzQ4K3Y6ODcrdikKK3YtPTE2fXc9SC5teCh2PDEwPzQ4K3Y6ODcrdikKIHc9ei52TSs9d31lbHNlIGlmKHY9PT05Mil3PXoudk0rPSJcXFxcIgogZWxzZSBpZih2PT09MzQpdz16LnZNKz0iXFxcIiIKLWVsc2V7dz1ILkpNKHYpCitlbHNle3c9SC5teCh2KQogdz16LnZNKz13fX15PXcrIlwiIgogei52TT15CiByZXR1cm4geX1yZXR1cm4iSW5zdGFuY2Ugb2YgJyIrSC5saChhKSsiJyJ9LApAQCAtODAwOCwxMiArODE3OSwxMyBAQAogeT0kLm9LCiBpZih5PT1udWxsKUgucXcoeikKIGVsc2UgeS4kMSh6KX0sCitRZTpmdW5jdGlvbihhKXtyZXR1cm4gSC5MWShhLmNvbnN0cnVjdG9yIT09QXJyYXk/UC5GKGEsITAsbnVsbCk6YSl9LAogWTI1OnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxhLmdmTihhKSxiKX0sCiAkaXNFSDp0cnVlfSwKIENMOnsKLSJeIjoiVHA6MTMxO2EiLAorIl4iOiJUcFo6MTMzO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmEKIGlmKHouYj4wKXouYS5LRigiLCAiKQogei5hLktGKEouR0woYSkpCkBAIC04MDMzLDcgKzgyMDUsNyBAQAogcmV0dXJuIEoueEModGhpcy55MyxiLnkzKSYmdGhpcy5hTD09PWIuYUx9LAogaU06ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5GVyh0aGlzLnkzLGIuZ3kzKCkpfSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy55M30sCi1idTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCitidTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1LHQscwogej10aGlzLmFMCiB5PVAuR3Eoej9ILm8yKHRoaXMpLmdldFVUQ0Z1bGxZZWFyKCkrMDpILm8yKHRoaXMpLmdldEZ1bGxZZWFyKCkrMCkKIHg9UC5oMCh6P0gubzIodGhpcykuZ2V0VVRDTW9udGgoKSsxOkgubzIodGhpcykuZ2V0TW9udGgoKSsxKQpAQCAtODA0MywxMiArODIxNSwxMiBAQAogdD1QLmgwKHo/SC5vMih0aGlzKS5nZXRVVENTZWNvbmRzKCkrMDpILm8yKHRoaXMpLmdldFNlY29uZHMoKSswKQogcz1QLnBWKHo/SC5vMih0aGlzKS5nZXRVVENNaWxsaXNlY29uZHMoKSswOkgubzIodGhpcykuZ2V0TWlsbGlzZWNvbmRzKCkrMCkKIGlmKHopcmV0dXJuIHkrIi0iK3grIi0iK3crIiAiK3YrIjoiK3UrIjoiK3QrIi4iK3MrIloiCi1lbHNlIHJldHVybiB5KyItIit4KyItIit3KyIgIit2KyI6Iit1KyI6Iit0KyIuIitzfSwKK2Vsc2UgcmV0dXJuIHkrIi0iK3grIi0iK3crIiAiK3YrIjoiK3UrIjoiK3QrIi4iK3N9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGg6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUC5XdShKLmV3KHRoaXMueTMsYi5nVnMoKSksdGhpcy5hTCl9LAogRUs6ZnVuY3Rpb24oKXtILm8yKHRoaXMpfSwKIFJNOmZ1bmN0aW9uKGEsYil7aWYoSi55SChhKT44NjQwMDAwMDAwMDAwMDAwKXRocm93IEguYihQLnUoYSkpfSwKICRpc2lQOnRydWUsCi1zdGF0aWM6eyJeIjoiYlMsVnA4LEV1LHAyVyxoMixLTCxFUWUsTlh0LEhtLEdpbyx6TTMsY1JTLEUwMyxLZUwsQ2dkLE5yWCxMRCxvNEksVDNGLGY4LHlmayxsbWUiLHp1OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGoKK3N0YXRpYzp7Il4iOiJiUyxWcCxFdSxwMlcsaDIsUUMzLEVRZSxOWHQsdHAxLEdpbyxGeixjUixFMDMsS2VMLENnZCxOclgsTEQsbzRJLFQzRixmOCx5ZmssbG1lIix6dTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqCiB6PW5ldyBILlZSKCJeKFsrLV0/XFxkezQsNX0pLT8oXFxkXFxkKS0/KFxcZFxcZCkoPzpbIFRdKFxcZFxcZCkoPzo6PyhcXGRcXGQpKD86Oj8oXFxkXFxkKSguXFxkezEsNn0pPyk/KT8oID9belpdfCA/KFstK10pKFxcZFxcZCkoPzo6PyhcXGRcXGQpKT8pPyk/JCIsSC52NCgiXihbKy1dP1xcZHs0LDV9KS0/KFxcZFxcZCktPyhcXGRcXGQpKD86WyBUXShcXGRcXGQpKD86Oj8oXFxkXFxkKSg/Ojo/KFxcZFxcZCkoLlxcZHsxLDZ9KT8pPyk/KCA/W3paXXwgPyhbLStdKShcXGRcXGQpKD86Oj8oXFxkXFxkKSk/KT8pPyQiLCExLCEwLCExKSxudWxsLG51bGwpLmlrKGEpCiBpZih6IT1udWxsKXt5PW5ldyBQLk1GKCkKIHg9ei5RSwpAQCAtODA4MCw3ICs4MjUyLDcgQEAKIGlmKHR5cGVvZiBtIT09Im51bWJlciIpcmV0dXJuIEgucyhtKQogbD1KLmV3KGwsNjAqbSkKIGlmKHR5cGVvZiBsIT09Im51bWJlciIpcmV0dXJuIEgucyhsKQotcz1KLmJJKHMsbipsKX1rPSEwfWVsc2Ugaz0hMQorcz1KLkhuKHMsbipsKX1rPSEwfWVsc2Ugaz0hMQogaj1ILmZ1KHcsdix1LHQscyxyLHEsaykKIHJldHVybiBQLld1KHA/aisxOmosayl9ZWxzZSB0aHJvdyBILmIoUC5jRChhKSl9LFd1OmZ1bmN0aW9uKGEsYil7dmFyIHo9bmV3IFAuaVAoYSxiKQogei5STShhLGIpCkBAIC04MDk1LDEyICs4MjY3LDEyIEBACiByZXR1cm4iMDAiK2F9LGgwOmZ1bmN0aW9uKGEpe2lmKGE+PTEwKXJldHVybiIiK2EKIHJldHVybiIwIithfX19LAogTUY6ewotIl4iOiJUcDoxMzI7IiwKKyJeIjoiVHBaOjEzNDsiLAogJDE6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gMAogcmV0dXJuIEguQlUoYSxudWxsLG51bGwpfSwKICRpc0VIOnRydWV9LAogUnE6ewotIl4iOiJUcDoxMzM7IiwKKyJeIjoiVHBaOjEzNTsiLAogJDE6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbClyZXR1cm4gMAogcmV0dXJuIEguUlIoYSxudWxsKX0sCiAkaXNFSDp0cnVlfSwKQEAgLTgxMjcsMTggKzgyOTksMTggQEAKIHJldHVybiB0aGlzLkZxPT09Yi5GcX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRnEmMHgxRkZGRkZGRn0sCiBpTTpmdW5jdGlvbihhLGIpe3JldHVybiBDLkNELmlNKHRoaXMuRnEsYi5nRnEoKSl9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9bmV3IFAuRFcoKQogeT10aGlzLkZxCiBpZih5PDApcmV0dXJuIi0iK1AuaWkoMCwwLC15LDAsMCwwKS5idSgwKQogeD16LiQxKEMuQ0QuSlYoQy5DRC5jVSh5LDYwMDAwMDAwKSw2MCkpCiB3PXouJDEoQy5DRC5KVihDLkNELmNVKHksMTAwMDAwMCksNjApKQogdj1uZXcgUC5QNygpLiQxKEMuQ0QuSlYoeSwxMDAwMDAwKSkKLXJldHVybiBILmQoQy5DRC5jVSh5LDM2MDAwMDAwMDApKSsiOiIrSC5kKHgpKyI6IitILmQodykrIi4iK0guZCh2KX0sCityZXR1cm4gSC5kKEMuQ0QuY1UoeSwzNjAwMDAwMDAwKSkrIjoiK0guZCh4KSsiOiIrSC5kKHcpKyIuIitILmQodil9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc2E2OnRydWUsCi1zdGF0aWM6eyJeIjoiQnA3LFM0ZCxka28sTG9CLHpqNSxiMkgscTlKLElHQixEb00sQ3ZELGtUQixJSlosaUksV3IsZm0sckdyIixpaTpmdW5jdGlvbihhLGIsYyxkLGUsZil7cmV0dXJuIG5ldyBQLmE2KGEqODY0MDAwMDAwMDArYiozNjAwMDAwMDAwK2UqNjAwMDAwMDArZioxMDAwMDAwK2QqMTAwMCtjKX19fSwKK3N0YXRpYzp7Il4iOiJCcDcsUzRkLGRrbyxMb0Isemo1LGIySCxxOUosSUdCLERvTSxDdkQsa1RCLElKWixpSSxWa0EsUzg0LHJHciIsaWk6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3JldHVybiBuZXcgUC5hNihhKjg2NDAwMDAwMDAwK2IqMzYwMDAwMDAwMCtlKjYwMDAwMDAwK2YqMTAwMDAwMCtkKjEwMDArYyl9fX0sCiBQNzp7Ci0iXiI6IlRwOjE1OyIsCisiXiI6IlRwWjoxNTsiLAogJDE6ZnVuY3Rpb24oYSl7aWYoYT49MTAwMDAwKXJldHVybiBILmQoYSkKIGlmKGE+PTEwMDAwKXJldHVybiIwIitILmQoYSkKIGlmKGE+PTEwMDApcmV0dXJuIjAwIitILmQoYSkKQEAgLTgxNDcsNyArODMxOSw3IEBACiByZXR1cm4iMDAwMDAiK0guZChhKX0sCiAkaXNFSDp0cnVlfSwKIERXOnsKLSJeIjoiVHA6MTU7IiwKKyJeIjoiVHBaOjE1OyIsCiAkMTpmdW5jdGlvbihhKXtpZihhPj0xMClyZXR1cm4gSC5kKGEpCiByZXR1cm4iMCIrSC5kKGEpfSwKICRpc0VIOnRydWV9LApAQCAtODE1NywyMyArODMyOSwyMyBAQAogJGlzWFM6dHJ1ZX0sCiBMSzp7CiAiXiI6IlhTOyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iVGhyb3cgb2YgbnVsbC4ifX0sCi1BVDp7CitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlRocm93IG9mIG51bGwuIn0sIiQwIiwiZ0FZIiwwLDAsNjldfSwKK09ZOnsKICJeIjoiWFM7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuRzEKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLkcxCiBpZih6IT1udWxsKXJldHVybiJJbGxlZ2FsIGFyZ3VtZW50KHMpOiAiK0guZCh6KQotcmV0dXJuIklsbGVnYWwgYXJndW1lbnQocykifSwKLXN0YXRpYzp7dTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuQVQoYSl9fX0sCityZXR1cm4iSWxsZWdhbCBhcmd1bWVudChzKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKK3N0YXRpYzp7dTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuT1koYSl9fX0sCiBTbjp7Ci0iXiI6IkFUO0cxIiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJSYW5nZUVycm9yOiAiK0guZCh0aGlzLkcxKX0sCisiXiI6Ik9ZO0cxIiwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iUmFuZ2VFcnJvcjogIitILmQodGhpcy5HMSl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7S1A6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlNuKGEpfSxOOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5TbigidmFsdWUgIitILmQoYSkpfSxURTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG5ldyBQLlNuKCJ2YWx1ZSAiK0guZChhKSsiIG5vdCBpbiByYW5nZSAiK0guZChiKSsiLi4iK0guZChjKSl9fX0sCiBOcDp7CiAiXiI6IlhTOyIsCiBzdGF0aWM6e2E5OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBQLk5wKCl9fX0sCiBKUzp7Ci0iXiI6IlhTO3VGLFVQLG1QLFNBLHZHIiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQorIl4iOiJYUzt1RixVUCxtUCxTQSxGWiIsCitidTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiB6PXt9CiB6LmE9UC5wOSgiIikKIHouYj0wCkBAIC04MTgyLDU5ICs4MzU0LDU5IEBACiBpZih4PDApcmV0dXJuIEguZSh5LHgpCiB1PVAuaGwoeVt4XSkKIHYudk0rPXR5cGVvZiB1PT09InN0cmluZyI/dTpILmQodSl9dGhpcy5TQS5hTigwLG5ldyBQLkNMKHopKQotcmV0dXJuIk5vU3VjaE1ldGhvZEVycm9yIDogbWV0aG9kIG5vdCBmb3VuZDogJyIrdGhpcy5VUC5idSgwKSsiJ1xuUmVjZWl2ZXI6ICIrSC5kKFAuaGwodGhpcy51RikpKyJcbkFyZ3VtZW50czogWyIrei5hLnZNKyJdIn0sCityZXR1cm4iTm9TdWNoTWV0aG9kRXJyb3IgOiBtZXRob2Qgbm90IGZvdW5kOiAnIit0aGlzLlVQLmJ1KDApKyInXG5SZWNlaXZlcjogIitILmQoUC5obCh0aGlzLnVGKSkrIlxuQXJndW1lbnRzOiBbIit6LmEudk0rIl0ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNKUzp0cnVlLAogc3RhdGljOntscjpmdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBuZXcgUC5KUyhhLGIsYyxkLGUpfX19LAogdWI6ewogIl4iOiJYUztHMT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlVuc3VwcG9ydGVkIG9wZXJhdGlvbjogIit0aGlzLkcxfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iVW5zdXBwb3J0ZWQgb3BlcmF0aW9uOiAiK3RoaXMuRzF9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7ZjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudWIoYSl9fX0sCiByTTp7CiAiXiI6IlhTO0cxPiIsCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLkcxCi1yZXR1cm4geiE9bnVsbD8iVW5pbXBsZW1lbnRlZEVycm9yOiAiK0guZCh6KToiVW5pbXBsZW1lbnRlZEVycm9yIn0sCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5HMQorcmV0dXJuIHohPW51bGw/IlVuaW1wbGVtZW50ZWRFcnJvcjogIitILmQoeik6IlVuaW1wbGVtZW50ZWRFcnJvciJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc1hTOnRydWUsCiBzdGF0aWM6e1NZOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5yTShhKX19fSwKIGxqOnsKICJeIjoiWFM7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJCYWQgc3RhdGU6ICIrdGhpcy5HMX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIkJhZCBzdGF0ZTogIit0aGlzLkcxfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6e3c6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLmxqKGEpfX19LAogVVY6ewogIl4iOiJYUztZQSIsCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLllBCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5ZQQogaWYoej09bnVsbClyZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbi4iCi1yZXR1cm4iQ29uY3VycmVudCBtb2RpZmljYXRpb24gZHVyaW5nIGl0ZXJhdGlvbjogIitILmQoUC5obCh6KSkrIi4ifSwKK3JldHVybiJDb25jdXJyZW50IG1vZGlmaWNhdGlvbiBkdXJpbmcgaXRlcmF0aW9uOiAiK0guZChQLmhsKHopKSsiLiJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7YTQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBQLlVWKGEpfX19LAogcW46ewogIl4iOiJhOyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iT3V0IG9mIE1lbW9yeSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJPdXQgb2YgTWVtb3J5In0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ0k0OmZ1bmN0aW9uKCl7cmV0dXJufSwKICRpc1hTOnRydWV9LAogS1k6ewogIl4iOiJhOyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iU3RhY2sgT3ZlcmZsb3cifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBnSTQ6ZnVuY3Rpb24oKXtyZXR1cm59LAogJGlzWFM6dHJ1ZX0sCiB0Nzp7CiAiXiI6IlhTO1dvIiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJSZWFkaW5nIHN0YXRpYyB2YXJpYWJsZSAnIit0aGlzLldvKyInIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24ifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iUmVhZGluZyBzdGF0aWMgdmFyaWFibGUgJyIrdGhpcy5XbysiJyBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOnttRTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAudDcoYSl9fX0sCiBIRzp7CiAiXiI6ImE7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuRzEKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLkcxCiBpZih6PT1udWxsKXJldHVybiJFeGNlcHRpb24iCi1yZXR1cm4iRXhjZXB0aW9uOiAiK0guZCh6KX19LAorcmV0dXJuIkV4Y2VwdGlvbjogIitILmQoeil9LCIkMCIsImdBWSIsMCwwLDY5XX0sCiBvZTp7CiAiXiI6ImE7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJGb3JtYXRFeGNlcHRpb246ICIrSC5kKHRoaXMuRzEpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iRm9ybWF0RXhjZXB0aW9uOiAiK0guZCh0aGlzLkcxKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntjRDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAub2UoYSl9fX0sCiBlVjp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJJbnRlZ2VyRGl2aXNpb25CeVplcm9FeGNlcHRpb24ifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iSW50ZWdlckRpdmlzaW9uQnlaZXJvRXhjZXB0aW9uIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOnt0czpmdW5jdGlvbigpe3JldHVybiBuZXcgUC5lVigpfX19LAogcW86ewogIl4iOiJhO29jPiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iRXhwYW5kbzoiK0guZCh0aGlzLm9jKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIkV4cGFuZG86IitILmQodGhpcy5vYyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHQ6ZnVuY3Rpb24oYSxiKXt2YXIgej1ILm9mKGIsImV4cGFuZG8kdmFsdWVzIikKIHJldHVybiB6PT1udWxsP251bGw6SC5vZih6LHRoaXMuSjQoKSl9LAogdTpmdW5jdGlvbihhLGIsYyl7dmFyIHo9SC5vZihiLCJleHBhbmRvJHZhbHVlcyIpCkBAIC04Mjc0LDcgKzg0NDYsNyBAQAogJGFzWjA6bnVsbH0sCiBjODp7CiAiXiI6ImE7IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJudWxsIn19LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJudWxsIn0sIiQwIiwiZ0FZIiwwLDAsNjldfSwKICIrTnVsbCI6MCwKIEZLOnsKICJeIjoiYTsiLApAQCAtODI4NCw5ICs4NDU2LDkgQEAKICJeIjoiOyIsCiBuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXM9PT1ifSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gSC5lUSh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gSC5hNSh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguYTUodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIFQ6ZnVuY3Rpb24oYSxiKXt0aHJvdyBILmIoUC5scih0aGlzLGIuZ1dhKCksYi5nbmQoKSxiLmdWbSgpLG51bGwpKX0sCi1nYng6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBILmN1KEguYjcodGhpcyksbnVsbCl9LAorZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgSC5jdShILndPKHRoaXMpLG51bGwpfSwKICRpc2E6dHJ1ZX0sCiBuczp7CiAiXiI6ImE7IiwKQEAgLTgzMDIsOCArODQ3NCw4IEBACiB3RTpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9dGhpcy55ej09bnVsbAogaWYoIXomJnRoaXMud2o9PW51bGwpcmV0dXJuCi1pZih6KXRoaXMueXo9SC5NcygpCi1lbHNle3o9SC5NcygpCitpZih6KXRoaXMueXo9SC5BbygpCitlbHNle3o9SC5BbygpCiB5PXRoaXMud2oKIHg9dGhpcy55egogaWYodHlwZW9mIHkhPT0ibnVtYmVyIilyZXR1cm4geS5XKCkKQEAgLTgzNDcsMzMgKzg1MTksMzMgQEAKIHk9ei5nbCgpCiB0aGlzLnZNKz10eXBlb2YgeT09PSJzdHJpbmciP3k6SC5kKHkpfX19LAogVjE6ZnVuY3Rpb24oYSl7dGhpcy52TT0iIn0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52TX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudk19LCIkMCIsImdBWSIsMCwwLDY5XSwKIFBEOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpdGhpcy52TT1hCiBlbHNlIHRoaXMuS0YoYSl9LAogc3RhdGljOntwOTpmdW5jdGlvbihhKXt2YXIgej1uZXcgUC5SbigiIikKIHouUEQoYSkKIHJldHVybiB6fX19LAotR0Q6eworSU46ewogIl4iOiJhOyIsCi0kaXNHRDp0cnVlfSwKKyRpc0lOOnRydWV9LAogdXE6ewogIl4iOiJhOyIsCiAkaXN1cTp0cnVlfSwKIHE1OnsKLSJeIjoiYTtCbyxJRSxwTyxGaSxrdSx0UCxCSixoTyxsSCIsCisiXiI6ImE7Qm8sbW4scE8sRmksa3UsdFAsQkosaE8sbEgiLAogZ0pmOmZ1bmN0aW9uKGEpe3ZhciB6CiBpZihDLnhCLm5DKHRoaXMuQm8sIlsiKSl7ej10aGlzLkJvCiByZXR1cm4gQy54Qi5Oaih6LDEsei5sZW5ndGgtMSl9cmV0dXJuIHRoaXMuQm99LAogZ2tiOmZ1bmN0aW9uKGEpe3ZhciB6Ci1pZihKLnhDKHRoaXMuSUUsMCkpe3o9dGhpcy5GaQoraWYoSi54Qyh0aGlzLm1uLDApKXt6PXRoaXMuRmkKIGlmKHo9PT0iaHR0cCIpcmV0dXJuIDgwCi1pZih6PT09Imh0dHBzIilyZXR1cm4gNDQzfXJldHVybiB0aGlzLklFfSwKK2lmKHo9PT0iaHR0cHMiKXJldHVybiA0NDN9cmV0dXJuIHRoaXMubW59LAogZ0lpOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnBPfSwKIHg2OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej1hPT1udWxsCiBpZih6JiYhMClyZXR1cm4iIgogej0hegotaWYoeik7eT16P1AuWGMoYSk6Qy5iUC5leihiLG5ldyBQLmJtKCkpLnpWKDAsIi8iKQoraWYoeik7eT16P1AuWGMoYSk6Qy5qTi5leihiLG5ldyBQLmJtKCkpLnpWKDAsIi8iKQogaWYoKHRoaXMuZ0pmKHRoaXMpIT09IiJ8fHRoaXMuRmk9PT0iZmlsZSIpJiZKLlU2KHkpLmdvcih5KSYmIUMueEIubkMoeSwiLyIpKXJldHVybiIvIitILmQoeSkKIHJldHVybiB5fSwKIHlNOmZ1bmN0aW9uKGEsYil7aWYoYT09PSIiKXJldHVybiIvIitILmQoYikKQEAgLTgzODMsNyArODU1NSw3IEBACiBLTzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiBpZighdGhpcy5LMihhKSlyZXR1cm4gYQogej1bXQotZm9yKHk9YS5zcGxpdCgiLyIpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guS3AoeSwwKV0pLHg9ITE7eS5HKCk7KXt3PXkubG8KK2Zvcih5PWEuc3BsaXQoIi8iKSx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILk9xKHksMCldKSx4PSExO3kuRygpOyl7dz15LmxvCiBpZihKLnhDKHcsIi4uIikpe3Y9ei5sZW5ndGgKIGlmKHYhPT0wKWlmKHY9PT0xKXtpZigwPj12KXJldHVybiBILmUoeiwwKQogdj0hSi54Qyh6WzBdLCIiKX1lbHNlIHY9ITAKQEAgLTgzOTMsNyArODU2NSw3IEBACiBlbHNle3oucHVzaCh3KQogeD0hMX19aWYoeCl6LnB1c2goIiIpCiByZXR1cm4gQy5ObS56Vih6LCIvIil9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5wOSgiIikKIHk9dGhpcy5GaQogaWYoIiIhPT15KXt6LktGKHkpCkBAIC04NDAxLDEzICs4NTczLDEzIEBACiB5PXRoaXMua3UKIGlmKCIiIT09eSl7ei5LRih5KQogei5LRigiQCIpfXouS0YodGhpcy5CbykKLWlmKCFKLnhDKHRoaXMuSUUsMCkpe3ouS0YoIjoiKQotei5LRihKLkFHKHRoaXMuSUUpKX19ei5LRih0aGlzLnBPKQoraWYoIUoueEModGhpcy5tbiwwKSl7ei5LRigiOiIpCit6LktGKEouQUcodGhpcy5tbikpfX16LktGKHRoaXMucE8pCiB5PXRoaXMudFAKIGlmKCIiIT09eSl7ei5LRigiPyIpCiB6LktGKHkpfXk9dGhpcy5CSgogaWYoIiIhPT15KXt6LktGKCIjIikKLXouS0YoeSl9cmV0dXJuIHoudk19LAorei5LRih5KX1yZXR1cm4gei52TX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKQEAgLTg0MjYsMTQgKzg1OTgsMTQgQEAKIGVsc2Ugej0hMQogZWxzZSB6PSExCiByZXR1cm4gen0sCi1naU86ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAuWFooKQorZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBQLldmKCkKIHJldHVybiB6LiQyKHRoaXMuRmksei4kMih0aGlzLmt1LHouJDIodGhpcy5nSmYodGhpcyksei4kMih0aGlzLmdrYih0aGlzKSx6LiQyKHRoaXMucE8sei4kMih0aGlzLnRQLHouJDIodGhpcy5CSiwxKSkpKSkpKX0sCi1uMzpmdW5jdGlvbihhLGIsYyxkLGUsZixnLGgsaSl7aWYoaD09PSJodHRwIiYmSi54QyhlLDgwKSl0aGlzLklFPTAKLWVsc2UgaWYoaD09PSJodHRwcyImJkoueEMoZSw0NDMpKXRoaXMuSUU9MAotZWxzZSB0aGlzLklFPWUKK24zOmZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpKXtpZihoPT09Imh0dHAiJiZKLnhDKGUsODApKXRoaXMubW49MAorZWxzZSBpZihoPT09Imh0dHBzIiYmSi54QyhlLDQ0MykpdGhpcy5tbj0wCitlbHNlIHRoaXMubW49ZQogdGhpcy5wTz10aGlzLng2KGMsZCl9LAogJGlzcTU6dHJ1ZSwKLXN0YXRpYzp7Il4iOiJRcUYscTcsclUsdjUsdkksaWxmLEltaSxHcFIsUTVXLFhySixHOSxmQyxsTSxGc1AsajMsbW8sdTBJLFRHTixZayxReHQsbEwsV1RwLEhpdyxINSx6c3QsVkZHLG5KZCxTcCxHUGYsSkE3LHl3MSxTUVUsZmJRIixoSzpmdW5jdGlvbihhMCl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYQorc3RhdGljOnsiXiI6IlFxRixxNyxyVSx1Q1gsd203LGlsZixJbWksR3BSLFE1VyxYckosVnhhLGZDLGxNLEZzUCxqMyxkUkMsdTBJLFRHTixZayxReHQsbEwsQngsSGl3LEg1LHpzdCxWRkcsbkpkLFNwVyxHUGYsSkE3LHl3MSxTUVUsZmJRIixoSzpmdW5jdGlvbihhMCl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbSxsLGssaixpLGgsZyxmLGUsZCxjLGIsYQogeD1uZXcgUC5qWSgpCiB3PW5ldyBQLlVvKGEwKQogdj1hMC5sZW5ndGgKQEAgLTg0NDIsOCArODYxNCw4IEBACiBpZih1Pj12KUgudmgoUC5OKHUpKQogcj1hMC5jaGFyQ29kZUF0KHUpCiBpZihyPDEyOCl7cT1yPj4+NAotaWYocT49OClyZXR1cm4gSC5lKEMuTkwscSkKLXE9KEMuTkxbcV0mQy5qbi5LSSgxLHImMTUpKSE9PTB9ZWxzZSBxPSExCitpZihxPj04KXJldHVybiBILmUoQy5tS3kscSkKK3E9KEMubUt5W3FdJkMuam4uS0koMSxyJjE1KSkhPT0wfWVsc2UgcT0hMQogaWYoIXEpe2lmKHI9PT01OCl7dD1zCiB1PXR9ZWxzZXt1PXMtMQogdD0wfWJyZWFrfX1lbHNle3U9MApAQCAtODQ5OSw3ICs4NjcxLDcgQEAKIGI9eC5DKGwsaik/Qy54Qi5OaihhMCx4LmcobCwxKSxqKToiIgogeD1KLld4KGopCiBhPXguQyhqLHYpP0MueEIuTmooYTAseC5nKGosMSksdik6IiIKLXJldHVybiBQLldvKGEsZCxjLG51bGwseixiLG51bGwsaCxmKX0sV286ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB6PVAuV2YoaCkKK3JldHVybiBQLldvKGEsZCxjLG51bGwseixiLG51bGwsaCxmKX0sV286ZnVuY3Rpb24oYSxiLGMsZCxlLGYsZyxoLGkpe3ZhciB6PVAuS1UoaCkKIHo9bmV3IFAucTUoUC5MNyhiKSxudWxsLG51bGwseixpLFAuTEUoZixnKSxQLm82KGEpLG51bGwsbnVsbCkKIHoubjMoYSxiLGMsZCxlLGYsZyxoLGkpCiByZXR1cm4gen0sTDc6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtODUwOSw3ICs4NjgxLDcgQEAKIFAuVXcoQy54Qi5OaihhLDEseikpCiByZXR1cm4gYX1mb3Ioej1hLmxlbmd0aCx5PTA7eTx6OysreSl7aWYoeT49eilILnZoKFAuTih5KSkKIGlmKGEuY2hhckNvZGVBdCh5KT09PTU4KXtQLlV3KGEpCi1yZXR1cm4iWyIrYSsiXSJ9fXJldHVybiBhfSxXZjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUKK3JldHVybiJbIithKyJdIn19cmV0dXJuIGF9LEtVOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdQogej1uZXcgUC5RVSgpCiBpZihhPT1udWxsKXJldHVybiIiCiB5PWEubGVuZ3RoCkBAIC04NTIwLDggKzg2OTIsOCBAQAogdT0hdX1lbHNlIHU9ITEKIGlmKHUpdGhyb3cgSC5iKFAudSgiSWxsZWdhbCBzY2hlbWU6ICIrYSkpCiBpZih6LiQxKHYpIT09ITApe2lmKHY8MTI4KXt1PXY+Pj40Ci1pZih1Pj04KXJldHVybiBILmUoQy5OTCx1KQotdT0oQy5OTFt1XSZDLmpuLktJKDEsdiYxNSkpIT09MH1lbHNlIHU9ITEKK2lmKHU+PTgpcmV0dXJuIEguZShDLm1LeSx1KQordT0oQy5tS3lbdV0mQy5qbi5LSSgxLHYmMTUpKSE9PTB9ZWxzZSB1PSExCiBpZih1KTtlbHNlIHRocm93IEguYihQLnUoIklsbGVnYWwgc2NoZW1lOiAiK2EpKQogeD0hMX19cmV0dXJuIHg/YTphLnRvTG93ZXJDYXNlKCl9LExFOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiB6PXt9CkBAIC04NTMxLDcgKzg3MDMsNyBAQAogaWYoeSk7aWYoeSlyZXR1cm4gUC5YYyhhKQogeD1QLnA5KCIiKQogei5hPSEwCi1DLmJQLmFOKGIsbmV3IFAuVWUoeix4KSkKK0Muak4uYU4oYixuZXcgUC5VZSh6LHgpKQogcmV0dXJuIHgudk19LG82OmZ1bmN0aW9uKGEpe2lmKGE9PW51bGwpcmV0dXJuIiIKIHJldHVybiBQLlhjKGEpfSxYYzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtCiB6PXt9CkBAIC04NTM5LDcgKzg3MTEsNyBAQAogei5hPXkKIGlmKHk8MClyZXR1cm4gYQogeD1uZXcgUC5BbCgpCi13PW5ldyBQLm05KCkKK3c9bmV3IFAuUUIoKQogdj1uZXcgUC53bShhLHgsbmV3IFAudFMoKSkKIHU9bmV3IFAuUUUoYSkKIHouYj1udWxsCkBAIC04NTU1LDI0ICs4NzI3LDI0IEBACiByPXcuJDEobykKIG49ei5iCiBpZihyPT09ITApe24udG9TdHJpbmcKLXI9SC5KTShvKQorcj1ILm14KG8pCiBuLnZNKz1yfWVsc2V7bi50b1N0cmluZwogbi52TSs9IiUiCiByPXYuJDEoei5hKzEpCiBuLnRvU3RyaW5nCi1yPUguSk0ocikKK3I9SC5teChyKQogbi52TSs9cgogcj16LmIKIG49di4kMSh6LmErMikKIHIudG9TdHJpbmcKLW49SC5KTShuKQorbj1ILm14KG4pCiByLnZNKz1ufXI9ei5hKz0zCiB6LmM9cn1tPUMueEIuWFUoYSwiJSIscikKIGlmKG0+PXouYSl7ei5hPW0KIHI9bX1lbHNle3ouYT10CiByPXR9fWlmKHouYj09bnVsbClyZXR1cm4gYQogaWYoei5jIT09cilzLiQwKCkKLXJldHVybiBKLkFHKHouYil9LER5OmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3JldHVybiBKLkFHKHouYil9LE1zOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEgubjMoSi5JdChhLCImIiksUC5GbChudWxsLG51bGwpLG5ldyBQLnF6KGIpKX0sRHk6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1uZXcgUC5KVigpCiB5PWEuc3BsaXQoIi4iKQogaWYoeS5sZW5ndGghPT00KXouJDEoIklQdjQgYWRkcmVzcyBzaG91bGQgY29udGFpbiBleGFjdGx5IDQgcGFydHMiKQpAQCAtODYwMCw3ICs4NzcyLDcgQEAKIHU9ITB9ZWxzZSBKLmJpKHgseS4kMih3LHQpKQogdz10KzF9Kyt0fWlmKEoucTgoeCk9PT0wKXouJDEoInRvbyBmZXcgcGFydHMiKQogcT1KLnhDKHcsSi5xOChhKSkKLXA9Si54QyhKLk1RKHgpLC0xKQorcD1KLnhDKEoudVkoeCksLTEpCiBpZihxJiYhcCl6LiQxKCJleHBlY3RlZCBhIHBhcnQgYWZ0ZXIgbGFzdCBgOmAiKQogaWYoIXEpdHJ5e0ouYmkoeCx5LiQyKHcsSi5xOChhKSkpfWNhdGNoKG8pe0guUnUobykKIHRyeXt2PVAuRHkoSi5aWihhLHcpKQpAQCAtODYxMyw3ICs4Nzg1LDcgQEAKIGlmKHR5cGVvZiBzIT09Im51bWJlciIpcmV0dXJuIEgucyhzKQogSi5iaSh4LChyfHMpPj4+MCl9Y2F0Y2gobyl7SC5SdShvKQogei4kMSgiaW52YWxpZCBlbmQgb2YgSVB2NiBhZGRyZXNzLiIpfX1pZih1KXtpZihKLnE4KHgpPjcpei4kMSgiYW4gYWRkcmVzcyB3aXRoIGEgd2lsZGNhcmQgbXVzdCBoYXZlIGxlc3MgdGhhbiA3IHBhcnRzIil9ZWxzZSBpZihKLnE4KHgpIT09OCl6LiQxKCJhbiBhZGRyZXNzIHdpdGhvdXQgYSB3aWxkY2FyZCBtdXN0IGNvbnRhaW4gZXhhY3RseSA4IHBhcnRzIikKLXM9bmV3IEgub0EoeCxuZXcgUC5kOSh4KSkKK3M9bmV3IEgub0EoeCxuZXcgUC5FWSh4KSkKIHMuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbCxudWxsXQogcmV0dXJuIFAuRihzLCEwLEguaXAocywibVciLDApKX0salc6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdix1LHQKIHo9bmV3IFAuckkoKQpAQCAtODYyNCwxMyArODc5Niw0MSBAQAogaWYodS5DKHYsMTI4KSl7dD11Lm0odiw0KQogaWYodD49OClyZXR1cm4gSC5lKGEsdCkKIHQ9KGFbdF0mQy5qbi5LSSgxLHUuaSh2LDE1KSkpIT09MH1lbHNlIHQ9ITEKLWlmKHQpe3U9SC5KTSh2KQoteS52TSs9dX1lbHNlIGlmKGQmJnUubih2LDMyKSl7dT1ILkpNKDQzKQoteS52TSs9dX1lbHNle3U9SC5KTSgzNykKK2lmKHQpe3U9SC5teCh2KQoreS52TSs9dX1lbHNlIGlmKGQmJnUubih2LDMyKSl7dT1ILm14KDQzKQoreS52TSs9dX1lbHNle3U9SC5teCgzNykKIHkudk0rPXUKLXouJDIodix5KX19cmV0dXJuIHkudk19fX0sCit6LiQyKHYseSl9fXJldHVybiB5LnZNfSxvaDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3Citmb3Ioej1KLnJZKGEpLHk9MCx4PTA7eDwyOysreCl7dz16LmooYSxiK3gpCitpZig0ODw9dyYmdzw9NTcpeT15KjE2K3ctNDgKK2Vsc2V7d3w9MzIKK2lmKDk3PD13JiZ3PD0xMDIpeT15KjE2K3ctODcKK2Vsc2UgdGhyb3cgSC5iKFAudSgiSW52YWxpZCBVUkwgZW5jb2RpbmciKSl9fXJldHVybiB5fSxwRTpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1LHQKK3o9Si5VNihhKQoreT0hMAoreD0wCit3aGlsZSghMCl7dz16LmdCKGEpCitpZih0eXBlb2YgdyE9PSJudW1iZXIiKXJldHVybiBILnModykKK2lmKCEoeDx3JiZ5KSlicmVhawordj16LmooYSx4KQoreT12IT09MzcmJnYhPT00MzsrK3h9aWYoeSlpZihiPT09Qy54TXx8ITEpcmV0dXJuIGEKK2Vsc2UgdT16LmdZQyhhKQorZWxzZXt1PVtdCit4PTAKK3doaWxlKCEwKXt3PXouZ0IoYSkKK2lmKHR5cGVvZiB3IT09Im51bWJlciIpcmV0dXJuIEgucyh3KQoraWYoISh4PHcpKWJyZWFrCit2PXouaihhLHgpCitpZih2PjEyNyl0aHJvdyBILmIoUC51KCJJbGxlZ2FsIHBlcmNlbnQgZW5jb2RpbmcgaW4gVVJJIikpCitpZih2PT09Mzcpe3c9ei5nQihhKQoraWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCitpZih4KzM+dyl0aHJvdyBILmIoUC51KCJUcnVuY2F0ZWQgVVJJIikpCit1LnB1c2goUC5vaChhLHgrMSkpCit4Kz0yfWVsc2UgaWYoYyYmdj09PTQzKXUucHVzaCgzMikKK2Vsc2UgdS5wdXNoKHYpOysreH19dD1iLklFCityZXR1cm4gbmV3IFAuR1kodCkuV0oodSl9fX0sCiBqWTp7Ci0iXiI6IlRwOjEzNDsiLAorIl4iOiJUcFo6MTM2OyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgegogaWYoYTwxMjgpe3o9YT4+PjQKIGlmKHo+PTgpcmV0dXJuIEguZShDLmFhLHopCkBAIC04NjM4LDEzICs4ODM4LDEzIEBACiByZXR1cm4gen0sCiAkaXNFSDp0cnVlfSwKIFVvOnsKLSJeIjoiVHA6MTM1O2EiLAorIl4iOiJUcFo6MTM3O2EiLAogJDE6ZnVuY3Rpb24oYSl7YT1KLkRQKHRoaXMuYSwiXSIsYSkKIGlmKGE9PT0tMSl0aHJvdyBILmIoUC5jRCgiQmFkIGVuZCBvZiBJUHY2IGhvc3QiKSkKIHJldHVybiBhKzF9LAogJGlzRUg6dHJ1ZX0sCiBRVTp7Ci0iXiI6IlRwOjEzNDsiLAorIl4iOiJUcFo6MTM2OyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgegogaWYoYTwxMjgpe3o9YT4+PjQKIGlmKHo+PTgpcmV0dXJuIEguZShDLkpILHopCkBAIC04NjUyLDExICs4ODUyLDExIEBACiByZXR1cm4gen0sCiAkaXNFSDp0cnVlfSwKIGJtOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gUC5qVyhDLlpKLGEsQy54TSwhMSl9LAogJGlzRUg6dHJ1ZX0sCiBVZTp7Ci0iXiI6IlRwOjc5O2EsYiIsCisiXiI6IlRwWjo4MDthLGIiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmEKIGlmKCF6LmEpdGhpcy5iLktGKCImIikKIHouYT0hMQpAQCAtODY2NywxOCArODg2NywxOCBAQAogei5LRihQLmpXKEMuQjIsYixDLnhNLCEwKSl9LAogJGlzRUg6dHJ1ZX0sCiBBbDp7Ci0iXiI6IlRwOjEzNDsiLAorIl4iOiJUcFo6MTM2OyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgegogaWYoISg0ODw9YSYmYTw9NTcpKXo9NjU8PWEmJmE8PTcwCiBlbHNlIHo9ITAKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogdFM6ewotIl4iOiJUcDoxMzQ7IiwKKyJeIjoiVHBaOjEzNjsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIDk3PD1hJiZhPD0xMDJ9LAogJGlzRUg6dHJ1ZX0sCi1tOTp7Ci0iXiI6IlRwOjEzNDsiLAorUUI6eworIl4iOiJUcFo6MTM2OyIsCiAkMTpmdW5jdGlvbihhKXt2YXIgegogaWYoYTwxMjgpe3o9Qy5qbi5HRyhhLDQpCiBpZih6Pj04KXJldHVybiBILmUoQy5CMix6KQpAQCAtODY4Niw3ICs4ODg2LDcgQEAKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogd206ewotIl4iOiJUcDoxMzU7YixjLGQiLAorIl4iOiJUcFo6MTM3O2IsYyxkIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5iCiB5PUouUHAoeixhKQpAQCAtODY5NSw3ICs4ODk1LDcgQEAKIGVsc2UgcmV0dXJuIHl9LAogJGlzRUg6dHJ1ZX0sCiBRRTp7Ci0iXiI6IlRwOjEzNTtlIiwKKyJeIjoiVHBaOjEzNztlIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIGZvcih6PXRoaXMuZSx5PUouclkoeikseD0wLHc9MDt3PDI7Kyt3KXt2PXkuaih6LGErdykKIGlmKDQ4PD12JiZ2PD01Nyl4PXgqMTYrdi00OApAQCAtODcwNCw3ICs4OTA0LDcgQEAKIGVsc2UgdGhyb3cgSC5iKFAudSgiSW52YWxpZCBwZXJjZW50LWVuY29kaW5nIGluIFVSSSBjb21wb25lbnQ6ICIreikpfX1yZXR1cm4geH0sCiAkaXNFSDp0cnVlfSwKIFlQOnsKLSJeIjoiVHA6MTg7YSxmIiwKKyJeIjoiVHBaOjE4O2EsZiIsCiAkMDpmdW5jdGlvbigpe3ZhciB6LHkseCx3LHYKIHo9dGhpcy5hCiB5PXouYgpAQCAtODcxNCwzMCArODkxNCw0MCBAQAogaWYoeT09bnVsbCl6LmI9UC5wOShKLk5qKHcseCx2KSkKIGVsc2UgeS5LRihKLk5qKHcseCx2KSl9LAogJGlzRUg6dHJ1ZX0sCi1YWjp7Ci0iXiI6IlRwOjEzNjsiLAorV2Y6eworIl4iOiJUcFo6MTM4OyIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PUoudjEoYSkKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIEgucyh6KQogcmV0dXJuIGIqMzEreiYxMDczNzQxODIzfSwKICRpc0VIOnRydWV9LAorcXo6eworIl4iOiJUcFo6ODA7YSIsCiskMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3Cit6PUouVTYoYikKK3k9ei5rSihiLCI9IikKK2lmKHk9PT0tMSl7aWYoIXoubihiLCIiKSlKLmtXKGEsUC5wRShiLHRoaXMuYSwhMCksIiIpfWVsc2UgaWYoeSE9PTApe3g9ei5OaihiLDAseSkKK3c9ei55bihiLHkrMSkKK3o9dGhpcy5hCitKLmtXKGEsUC5wRSh4LHosITApLFAucEUodyx6LCEwKSl9cmV0dXJuIGF9LAorJGlzRUg6dHJ1ZX0sCiBKVjp7Ci0iXiI6IlRwOjQzOyIsCisiXiI6IlRwWjo0MzsiLAogJDE6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuY0QoIklsbGVnYWwgSVB2NCBhZGRyZXNzLCAiK2EpKX0sCiAkaXNFSDp0cnVlfSwKIE53OnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PUguQlUoYSxudWxsLG51bGwpCiB5PUouV3goeikKIGlmKHkuQyh6LDApfHx5LkQoeiwyNTUpKXRoaXMuYS4kMSgiZWFjaCBwYXJ0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIGAwLi4yNTVgIikKLXJldHVybiB6fSwiJDEiLG51bGwsMiwwLG51bGwsMTM3LCJjYWxsIl0sCityZXR1cm4gen0sIiQxIixudWxsLDIsMCxudWxsLDEzOSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB4ODp7Ci0iXiI6IlRwOjQzOyIsCisiXiI6IlRwWjo0MzsiLAogJDE6ZnVuY3Rpb24oYSl7dGhyb3cgSC5iKFAuY0QoIklsbGVnYWwgSVB2NiBhZGRyZXNzLCAiK2EpKX0sCiAkaXNFSDp0cnVlfSwKIEpUOnsKLSJeIjoiVHA6OTY7YSxiIiwKKyJeIjoiVHBaOjk3O2EsYiIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGlmKGItYT40KXRoaXMuYi4kMSgiYW4gSVB2NiBwYXJ0IGNhbiBvbmx5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIDQgaGV4IGRpZ2l0cyIpCiB6PUguQlUoQy54Qi5Oaih0aGlzLmEsYSxiKSwxNixudWxsKQpAQCAtODc0NSwxNyArODk1NSwxNyBAQAogaWYoeS5DKHosMCl8fHkuRCh6LDY1NTM1KSl0aGlzLmIuJDEoImVhY2ggcGFydCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBgMHgwLi4weEZGRkZgIikKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAotZDk6ewotIl4iOiJUcDoxMztjIiwKK0VZOnsKKyJeIjoiVHBaOjEzO2MiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiBpZih6Lm4oYSwtMSkpcmV0dXJuIFAuTzgoKDktdGhpcy5jLmxlbmd0aCkqMiwwLG51bGwpCiBlbHNlIHJldHVyblt6Lm0oYSw4KSYyNTUsei5pKGEsMjU1KV19LAogJGlzRUg6dHJ1ZX0sCiBySTp7Ci0iXiI6IlRwOjc5OyIsCisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej1KLld4KGEpCi1iLktGKEguSk0oQy54Qi5qKCIwMTIzNDU2Nzg5QUJDREVGIix6Lm0oYSw0KSkpKQotYi5LRihILkpNKEMueEIuaigiMDEyMzQ1Njc4OUFCQ0RFRiIsei5pKGEsMTUpKSkpfSwKK2IuS0YoSC5teChDLnhCLmooIjAxMjM0NTY3ODlBQkNERUYiLHoubShhLDQpKSkpCitiLktGKEgubXgoQy54Qi5qKCIwMTIzNDU2Nzg5QUJDREVGIix6LmkoYSwxNSkpKSl9LAogJGlzRUg6dHJ1ZX19XSxbImRhcnQuZG9tLmh0bWwiLCJkYXJ0Omh0bWwiLCxXLHsKICJeIjoiIiwKIFE4OmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseApAQCAtODc3NywxNCArODk4NywxNSBAQAogeD1uZXcgWE1MSHR0cFJlcXVlc3QoKQogQy5XMy5lbyh4LCJHRVQiLGEsITApCiB6PUguVk0obmV3IFcuUk8oeCxDLkxGLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYobmV3IFcuYlUoeSx4KSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRihuZXcgVy5iVSh5LHgpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej1ILlZNKG5ldyBXLlJPKHgsQy5KTi5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHkuZ1lKKCkpLHouU2cpLFtILktwKHosMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYoeS5nWUooKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCkKIHguc2VuZCgpCiByZXR1cm4geS5NTX0sCiBFRDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0IixudWxsKQogaWYoYSE9bnVsbCl0cnl7Si5pTSh6LGEpfWNhdGNoKHkpe0guUnUoeSl9cmV0dXJuIHp9LAorV3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXJ8fHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuTW96TXV0YXRpb25PYnNlcnZlcikoSC50UihXLkIzKGEpLDIpKX0sCiBwUzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dHlwZW9mIGEhPT0ic3RyaW5nIgogaWYoKCF6fHxhPT1udWxsKSYmITApcmV0dXJuIG5ldyBXZWJTb2NrZXQoYSkKQEAgLTg4MDksOCArOTAyMCw4IEBACiByZXR1cm4gUC5vNyhhLCEwKX0sCiBHaTpmdW5jdGlvbihhLGIpe3JldHVybiBuZXcgVy56WihhLGIpfSwKIHo5OltmdW5jdGlvbihhKXtyZXR1cm4gSi5OMShhKX0sIiQxIiwiYjQiLDIsMCwxMyw1NF0sCi1IeDpbZnVuY3Rpb24oYSl7cmV0dXJuIEouWjIoYSl9LCIkMSIsIkhNIiwyLDAsMTMsNTRdLAotSHc6W2Z1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLmRmKGEsYixjLGQpfSwiJDQiLCJyaSIsOCwwLDU1LDU0LDU2LDU3LDU4XSwKK0h4OltmdW5jdGlvbihhKXtyZXR1cm4gSi5xcShhKX0sIiQxIiwiSE0iLDIsMCwxMyw1NF0sCitIdzpbZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouZGYoYSxiLGMsZCl9LCIkNCIsIlNOIiw4LDAsNTUsNTQsNTYsNTcsNThdLAogQ3Q6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscQogej1KLlhyKGQpCiBpZih6PT1udWxsKXRocm93IEguYihQLnUoZCkpCkBAIC04ODI3LDcgKzkwMzgsNyBAQAogdC5jcmVhdGVkQ2FsbGJhY2s9e3ZhbHVlOmZ1bmN0aW9uKGYpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBmKHRoaXMpfX0oSC50UihXLkdpKHgseSksMSkpfQogdC5hdHRhY2hlZENhbGxiYWNrPXt2YWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZih0aGlzKX19KEgudFIoVy5iNCgpLDEpKX0KIHQuZGV0YWNoZWRDYWxsYmFjaz17dmFsdWU6ZnVuY3Rpb24oZil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYodGhpcyl9fShILnRSKFcuSE0oKSwxKSl9Ci10LmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjaz17dmFsdWU6ZnVuY3Rpb24oZil7cmV0dXJuIGZ1bmN0aW9uKGcsaCxpKXtyZXR1cm4gZih0aGlzLGcsaCxpKX19KEgudFIoVy5yaSgpLDQpKX0KK3QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrPXt2YWx1ZTpmdW5jdGlvbihmKXtyZXR1cm4gZnVuY3Rpb24oZyxoLGkpe3JldHVybiBmKHRoaXMsZyxoLGkpfX0oSC50UihXLlNOKCksNCkpfQogcz1PYmplY3QuY3JlYXRlKHUucHJvdG90eXBlLHQpCiByPUguVmEoeSkKIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLGluaXQuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnIsZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKQEAgLTg4MzcsMTEgKzkwNDgsMTEgQEAKIGFGOmZ1bmN0aW9uKGEpe2lmKEoueEMoJC5YMyxDLk5VKSlyZXR1cm4gYQogaWYoYT09bnVsbClyZXR1cm4KIHJldHVybiAkLlgzLnJPKGEsITApfSwKLUZzOmZ1bmN0aW9uKGEpe2lmKEoueEMoJC5YMyxDLk5VKSlyZXR1cm4gYQorQjM6ZnVuY3Rpb24oYSl7aWYoSi54QygkLlgzLEMuTlUpKXJldHVybiBhCiByZXR1cm4gJC5YMy5jbChhLCEwKX0sCiBCbzp7CiAiXiI6Img0OyIsCi0iJSI6IkhUTUxBcHBsZXRFbGVtZW50fEhUTUxCUkVsZW1lbnR8SFRNTENvbnRlbnRFbGVtZW50fEhUTUxETGlzdEVsZW1lbnR8SFRNTERhdGFMaXN0RWxlbWVudHxIVE1MRGlyZWN0b3J5RWxlbWVudHxIVE1MRGl2RWxlbWVudHxIVE1MRm9udEVsZW1lbnR8SFRNTEZyYW1lRWxlbWVudHxIVE1MSFJFbGVtZW50fEhUTUxIZWFkRWxlbWVudHxIVE1MSGVhZGluZ0VsZW1lbnR8SFRNTEh0bWxFbGVtZW50fEhUTUxNYXJxdWVlRWxlbWVudHxIVE1MTWVudUVsZW1lbnR8SFRNTE1vZEVsZW1lbnR8SFRNTFBhcmFncmFwaEVsZW1lbnR8SFRNTFByZUVsZW1lbnR8SFRNTFF1b3RlRWxlbWVudHxIVE1MU2hhZG93RWxlbWVudHxIVE1MU3BhbkVsZW1lbnR8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnR8SFRNTFRhYmxlQ29sRWxlbWVudHxIVE1MVGl0bGVFbGVtZW50fEhUTUxVTGlzdEVsZW1lbnR8SFRNTFVua25vd25FbGVtZW50O0hUTUxFbGVtZW50O2pwUnxPdHx4Y3xMUGN8aFZ8WGZzfHVMfHB2fEc2fFZmeHx4SXxlV3xEc2R8ZW98dHVqfGFDfFZZfFZjdHxCZXxTYU18Skl8RDEzfFpQfFdacXxuSnxLQWZ8RWd8aTd8cHZhfEdrfGNkYXxOcnx3YWF8TUp8VDUzfERLfFY0fEJTfFYxMHxWYnxWMTF8THl8cFJ8VjEyfGh4fFYxM3xMNHxNYnxWMTR8bU98REV8VjE1fFUxfFYxNnxIOHxXU3xxaHxWMTd8b0Z8VjE4fFE2fHVFfFYxOXxabnxWMjB8bjV8VjIxfE1hfHdOfFYyMnxkc3xWMjN8b3V8WnpSfGF2fFYyNHx1enxWMjV8a0t8b2F8VjI2fFN0fFYyN3xJV3xWMjh8UWh8VjI5fE96fFYzMHxaNHxWMzF8cWt8VjMyfHZqfExVfFYzM3xDWHxWMzR8bWR8VjM1fEJtfFYzNnxZYXxWMzd8V3d8eWV8VjM4fEcxfFYzOXxmbHxWNDB8VUt8VjQxfHdNfFY0MnxOS3xWNDN8Wnh8VjQ0fEYxfFY0NXxvdnxvRVl8a258VjQ2fGZJfFY0N3x6TXxWNDh8Umt8VjQ5fFRpfEltS3xDWXxWNTB8bm18VjUxfHV3fFY1MnxQYXxWNTN8RDJ8STV8VjU0fGVsIn0sCisiJSI6IkhUTUxBcHBsZXRFbGVtZW50fEhUTUxCUkVsZW1lbnR8SFRNTENvbnRlbnRFbGVtZW50fEhUTUxETGlzdEVsZW1lbnR8SFRNTERhdGFMaXN0RWxlbWVudHxIVE1MRGlyZWN0b3J5RWxlbWVudHxIVE1MRGl2RWxlbWVudHxIVE1MRm9udEVsZW1lbnR8SFRNTEZyYW1lRWxlbWVudHxIVE1MSFJFbGVtZW50fEhUTUxIZWFkRWxlbWVudHxIVE1MSGVhZGluZ0VsZW1lbnR8SFRNTEh0bWxFbGVtZW50fEhUTUxNYXJxdWVlRWxlbWVudHxIVE1MTWVudUVsZW1lbnR8SFRNTE1vZEVsZW1lbnR8SFRNTFBhcmFncmFwaEVsZW1lbnR8SFRNTFByZUVsZW1lbnR8SFRNTFF1b3RlRWxlbWVudHxIVE1MU2hhZG93RWxlbWVudHxIVE1MU3BhbkVsZW1lbnR8SFRNTFRhYmxlQ2FwdGlvbkVsZW1lbnR8SFRNTFRhYmxlQ29sRWxlbWVudHxIVE1MVGl0bGVFbGVtZW50fEhUTUxVTGlzdEVsZW1lbnR8SFRNTFVua25vd25FbGVtZW50O0hUTUxFbGVtZW50O2pwUnxUUjB8eGN8TFBjfGhWfFhmc3x1THxwdnxHNnxWZnh8eEl8ZVd8RHNkfGVvfHR1anxha3xWWXxWY3R8QmV8U2FNfEpJfEQxM3xaUHxXWnF8bkp8S0FmfEVnfGk3fHB2YXxHa3xjZGF8SjN8d2FhfE1KfFQ1M3xES3xWOXxCU3xWMTB8VmJ8VjExfEx5fHBSfFYxMnxoeHxWMTN8TDR8TWJ8VjE0fG1PfERFfFYxNXxVMXxWMTZ8SDh8V1N8cWh8VjE3fG9GfFYxOHxRNnx1RXxWMTl8Wm58VjIwfG41fFYyMXxNYXx3TnxWMjJ8ZHN8VjIzfHFNfFp6UnxhdnxWMjR8dXp8VjI1fGtLfG9hfFYyNnxTdHxWMjd8SVd8VjI4fFFofFYyOXxPenxWMzB8WjR8VjMxfHFrfFYzMnx2anxMVXxWMzN8Q1h8VjM0fG1kfFYzNXxCbXxWMzZ8WWF8VjM3fFd3fHllfFYzOHxHMXxWMzl8Zmx8VjQwfFVLfFY0MXx3TXxWNDJ8Tkt8VjQzfFp4fFY0NHxGMXxWNDV8b3Z8b0VZfGtufFY0NnxmSXxWNDd8ek18VjQ4fFJrfFY0OXxUaXxJbUt8Q1l8VjUwfG5tfFY1MXx1d3xWNTJ8UGF8VjUzfEQyfEk1fFY1NHxlbCJ9LAogWXluOnsKICJeIjoiR3Y7IiwKICRpc1dPOnRydWUsCkBAIC04ODUyLDExICs5MDYzLDExIEBACiAiJSI6IkVudHJ5QXJyYXkifSwKIFBzOnsKICJeIjoiQm87Tjp0YXJnZXQlLHQ1OnR5cGUlLG1IOmhyZWYlLGFCOnByb3RvY29sPSIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAiJSI6IkhUTUxBbmNob3JFbGVtZW50In0sCiBmWTp7CiAiXiI6IkJvO046dGFyZ2V0JSxtSDpocmVmJSxhQjpwcm90b2NvbD0iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9TdHJpbmcoKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9TdHJpbmcoKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogIiUiOiJIVE1MQXJlYUVsZW1lbnQifSwKIHJaZzp7CiAiXiI6IkJvO21IOmhyZWYlLE46dGFyZ2V0JSIsCkBAIC04ODcyLDggKzkwODMsOCBAQAogT3g6ewogIl4iOiJCbztNQjpmb3JtPSxvYzpuYW1lJSx0NTp0eXBlJSxQOnZhbHVlJSIsCiAiJSI6IkhUTUxCdXR0b25FbGVtZW50In0sCi1OeTp7Ci0iXiI6IkJvO2ZnOmhlaWdodH0sUjp3aWR0aH0iLAorTnk5OnsKKyJeIjoiQm87Zmc6aGVpZ2h0JSxSOndpZHRofSIsCiBnVkU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ2V0Q29udGV4dCgiMmQiKX0sCiAiJSI6IkhUTUxDYW52YXNFbGVtZW50In0sCiBPaTp7CkBAIC04OTI1LDcgKzkxMzYsNyBAQAogTWQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVy52RChhLnF1ZXJ5U2VsZWN0b3JBbGwoYiksbnVsbCl9LAogJGlzWU46dHJ1ZSwKICIlIjoiWE1MRG9jdW1lbnQ7RG9jdW1lbnQifSwKLUFqOnsKK2hzdzp7CiAiXiI6IktWOyIsCiBna3M6ZnVuY3Rpb24oYSl7aWYoYS5fZG9jQ2hpbGRyZW49PW51bGwpYS5fZG9jQ2hpbGRyZW49SC5WTShuZXcgUC5ENyhhLG5ldyBXLndpKGEpKSxbbnVsbF0pCiByZXR1cm4gYS5fZG9jQ2hpbGRyZW59LApAQCAtODk0MSw3ICs5MTUyLDcgQEAKIGlmKFAuRjcoKT09PSEwJiZ6PT09IlNFQ1VSSVRZX0VSUiIpcmV0dXJuIlNlY3VyaXR5RXJyb3IiCiBpZihQLkY3KCk9PT0hMCYmej09PSJTWU5UQVhfRVJSIilyZXR1cm4iU3ludGF4RXJyb3IiCiByZXR1cm4gen0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNCSzp0cnVlLAogIiUiOiJET01FeGNlcHRpb24ifSwKIGg0OnsKQEAgLTg5NTYsNyArOTE2Nyw3IEBACiB3TjpmdW5jdGlvbihhLGIsYyxkKXt9LAogZ3FuOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCiBnS0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZXNwYWNlVVJJfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxvY2FsTmFtZX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEubG9jYWxOYW1lfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBXTzpmdW5jdGlvbihhLGIpe2lmKCEhYS5tYXRjaGVzKXJldHVybiBhLm1hdGNoZXMoYikKIGVsc2UgaWYoISFhLndlYmtpdE1hdGNoZXNTZWxlY3RvcilyZXR1cm4gYS53ZWJraXRNYXRjaGVzU2VsZWN0b3IoYikKIGVsc2UgaWYoISFhLm1vek1hdGNoZXNTZWxlY3RvcilyZXR1cm4gYS5tb3pNYXRjaGVzU2VsZWN0b3IoYikKQEAgLTg5NjQsNyArOTE3NSw3IEBACiBlbHNlIGlmKCEhYS5vTWF0Y2hlc1NlbGVjdG9yKXJldHVybiBhLm9NYXRjaGVzU2VsZWN0b3IoYikKIGVsc2UgdGhyb3cgSC5iKFAuZigiTm90IHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtIikpfSwKIFgzOmZ1bmN0aW9uKGEsYil7dmFyIHo9YQotZG97aWYoSi5SRih6LGIpKXJldHVybiEwCitkb3tpZihKLlV2KHosYikpcmV0dXJuITAKIHo9ei5wYXJlbnRFbGVtZW50fXdoaWxlKHohPW51bGwpCiByZXR1cm4hMX0sCiBlcjpmdW5jdGlvbihhKXtyZXR1cm4oYS5jcmVhdGVTaGFkb3dSb290fHxhLndlYmtpdENyZWF0ZVNoYWRvd1Jvb3QpLmNhbGwoYSl9LApAQCAtODk4MSw4ICs5MTkyLDggQEAKICRpc2g0OnRydWUsCiAkaXNQWjp0cnVlLAogIiUiOiI7RWxlbWVudCJ9LAotbEM6ewotIl4iOiJCbztmZzpoZWlnaHR9LG9jOm5hbWUlLHQ1OnR5cGUlLFI6d2lkdGh9IiwKK0trOnsKKyJeIjoiQm87Zmc6aGVpZ2h0JSxvYzpuYW1lJSx0NTp0eXBlJSxSOndpZHRofSIsCiAiJSI6IkhUTUxFbWJlZEVsZW1lbnQifSwKIFR5OnsKICJeIjoiZWE7a2M6ZXJyb3I9LEcxOm1lc3NhZ2U9IiwKQEAgLTg5OTMsNyArOTIwNCw3IEBACiBnTjpmdW5jdGlvbihhKXtyZXR1cm4gVy5xYyhhLnRhcmdldCl9LAogZTY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucHJldmVudERlZmF1bHQoKX0sCiAkaXNlYTp0cnVlLAotIiUiOiJBdWRpb1Byb2Nlc3NpbmdFdmVudHxBdXRvY29tcGxldGVFcnJvckV2ZW50fEJlZm9yZUxvYWRFdmVudHxCZWZvcmVVbmxvYWRFdmVudHxDU1NGb250RmFjZUxvYWRFdmVudHxEZXZpY2VNb3Rpb25FdmVudHxEZXZpY2VPcmllbnRhdGlvbkV2ZW50fEhhc2hDaGFuZ2VFdmVudHxJREJWZXJzaW9uQ2hhbmdlRXZlbnR8SW5zdGFsbEV2ZW50fEluc3RhbGxQaGFzZUV2ZW50fE1lZGlhS2V5TmVlZGVkRXZlbnR8TWVkaWFTdHJlYW1FdmVudHxNZWRpYVN0cmVhbVRyYWNrRXZlbnR8TXV0YXRpb25FdmVudHxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnR8T3ZlcmZsb3dFdmVudHxQYWdlVHJhbnNpdGlvbkV2ZW50fFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnR8UlRDRGF0YUNoYW5uZWxFdmVudHxSVENJY2VDYW5kaWRhdGVFdmVudHxTcGVlY2hJbnB1dEV2ZW50fFRyYWNrRXZlbnR8VHJhbnNpdGlvbkV2ZW50fFdlYkdMQ29udGV4dEV2ZW50fFdlYktpdEFuaW1hdGlvbkV2ZW50fFdlYktpdFRyYW5zaXRpb25FdmVudDtFdmVudCJ9LAorIiUiOiJBdWRpb1Byb2Nlc3NpbmdFdmVudHxBdXRvY29tcGxldGVFcnJvckV2ZW50fEJlZm9yZUxvYWRFdmVudHxCZWZvcmVVbmxvYWRFdmVudHxDU1NGb250RmFjZUxvYWRFdmVudHxEZXZpY2VNb3Rpb25FdmVudHxEZXZpY2VPcmllbnRhdGlvbkV2ZW50fEhhc2hDaGFuZ2VFdmVudHxJREJWZXJzaW9uQ2hhbmdlRXZlbnR8SW5zdGFsbEV2ZW50fEluc3RhbGxQaGFzZUV2ZW50fE1lZGlhS2V5TmVlZGVkRXZlbnR8TWVkaWFTdHJlYW1FdmVudHxNZWRpYVN0cmVhbVRyYWNrRXZlbnR8TXV0YXRpb25FdmVudHxPZmZsaW5lQXVkaW9Db21wbGV0aW9uRXZlbnR8T3ZlcmZsb3dFdmVudHxQYWdlVHJhbnNpdGlvbkV2ZW50fFJUQ0RUTUZUb25lQ2hhbmdlRXZlbnR8UlRDRGF0YUNoYW5uZWxFdmVudHxSVENJY2VDYW5kaWRhdGVFdmVudHxTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50fFNwZWVjaElucHV0RXZlbnR8VHJhY2tFdmVudHxUcmFuc2l0aW9uRXZlbnR8V2ViR0xDb250ZXh0RXZlbnR8V2ViS2l0QW5pbWF0aW9uRXZlbnR8V2ViS2l0VHJhbnNpdGlvbkV2ZW50O0V2ZW50In0sCiBQWjp7CiAiXiI6Ikd2OyIsCiBnSTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcua2QoYSl9LApAQCAtOTAwMiwyMCArOTIxMywyMCBAQAogWTk6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEucmVtb3ZlRXZlbnRMaXN0ZW5lcihiLEgudFIoYywxKSxkKX0sCiAkaXNQWjp0cnVlLAogIiUiOiI7RXZlbnRUYXJnZXQifSwKLUFvOnsKK2FzZzp7CiAiXiI6IkJvO01COmZvcm09LG9jOm5hbWUlLHQ1OnR5cGU9IiwKICIlIjoiSFRNTEZpZWxkU2V0RWxlbWVudCJ9LAogaEg6ewogIl4iOiJPNDtvYzpuYW1lPSIsCiAkaXNoSDp0cnVlLAogIiUiOiJGaWxlIn0sCi1BYUk6eworblM6ewogIl4iOiJyejt0VDpjb2RlPSIsCiAiJSI6IkZpbGVFcnJvciJ9LAogakg6ewogIl4iOiJCbztCOmxlbmd0aD0sb2M6bmFtZSUsTjp0YXJnZXQlIiwKICIlIjoiSFRNTEZvcm1FbGVtZW50In0sCi11czp7CitjNDp7CiAiXiI6Ikd2O0I6bGVuZ3RoPSIsCiAiJSI6Ikhpc3RvcnkifSwKIHhuZDp7CkBAIC05MDQ0LDI5ICs5MjU1LDI5IEBACiBzbWs6ZnVuY3Rpb24oYSxiKXthLnRpdGxlPWJ9LAogIiUiOiJIVE1MRG9jdW1lbnQifSwKIGZKOnsKLSJeIjoicms7aWw6cmVzcG9uc2VUZXh0PSxwZjpzdGF0dXM9IiwKLWduOTpmdW5jdGlvbihhKXtyZXR1cm4gVy5QZChhLnJlc3BvbnNlKX0sCisiXiI6IndhVjtpbDpyZXNwb25zZVRleHQ9LHBmOnN0YXR1cz0iLAorZ2JBOmZ1bmN0aW9uKGEpe3JldHVybiBXLlBkKGEucmVzcG9uc2UpfSwKIFIzOmZ1bmN0aW9uKGEsYixjLGQsZSxmKXtyZXR1cm4gYS5vcGVuKGIsYyxkLGYsZSl9LAogZW86ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIGEub3BlbihiLGMsZCl9LAogd1I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zZW5kKGIpfSwKICRpc2ZKOnRydWUsCiAiJSI6IlhNTEh0dHBSZXF1ZXN0In0sCi1yazp7Cit3YVY6ewogIl4iOiJQWjsiLAogIiUiOiI7WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCJ9LAogdGJFOnsKLSJeIjoiQm87Zmc6aGVpZ2h0fSxvYzpuYW1lJSxSOndpZHRofSIsCisiXiI6IkJvO2ZnOmhlaWdodCUsb2M6bmFtZSUsUjp3aWR0aH0iLAogIiUiOiJIVE1MSUZyYW1lRWxlbWVudCJ9LAogU2c6ewogIl4iOiJHdjtSbjpkYXRhPSxmZzpoZWlnaHQ9LFI6d2lkdGg9IiwKICRpc1NnOnRydWUsCiAiJSI6IkltYWdlRGF0YSJ9LAogU0w6ewotIl4iOiJCbztmZzpoZWlnaHR9LFI6d2lkdGh9IiwKKyJeIjoiQm87Zmc6aGVpZ2h0JSxSOndpZHRofSIsCiBqMzpmdW5jdGlvbihhLGIpe3JldHVybiBhLmNvbXBsZXRlLiQxKGIpfSwKICIlIjoiSFRNTEltYWdlRWxlbWVudCJ9LAogTWk6ewotIl4iOiJCbztkNDpjaGVja2VkJSxNQjpmb3JtPSxmZzpoZWlnaHR9LGp4Omxpc3Q9LG9jOm5hbWUlLHQ1OnR5cGUlLFA6dmFsdWUlLFI6d2lkdGh9IiwKKyJeIjoiQm87ZDQ6Y2hlY2tlZCUsTUI6Zm9ybT0sZmc6aGVpZ2h0JSxqeDpsaXN0PSxvYzpuYW1lJSx0NTp0eXBlJSxQOnZhbHVlJSxSOndpZHRofSIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmFjY2VwdC4kMShiKX0sCiAkaXNNaTp0cnVlLAogJGlzaDQ6dHJ1ZSwKQEAgLTkwNzksNyArOTI5MCw3IEBACiB0dEg6ewogIl4iOiJCbztNQjpmb3JtPSxvYzpuYW1lJSx0NTp0eXBlPSIsCiAiJSI6IkhUTUxLZXlnZW5FbGVtZW50In0sCi1wTDp7CitHeDp7CiAiXiI6IkJvO1A6dmFsdWUlIiwKICIlIjoiSFRNTExJRWxlbWVudCJ9LAogaGk6ewpAQCAtOTA5NCw3ICs5MzA1LDcgQEAKIHU4cjp7CiAiXiI6Ikd2O21IOmhyZWY9LGFCOnByb3RvY29sPSIsCiBSRTpmdW5jdGlvbihhKXtyZXR1cm4gYS5yZWxvYWQoKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAiJSI6IkxvY2F0aW9uIn0sCiBqSjp7CiAiXiI6IkJvO29jOm5hbWUlIiwKQEAgLTkxMTQsNyArOTMyNSw3IEBACiB3cTp7CiAiXiI6ImVhO0cxOm1lc3NhZ2U9IiwKICIlIjoiTWVkaWFLZXlFdmVudCJ9LAotVzc6eworZkpuOnsKICJeIjoiZWE7RzE6bWVzc2FnZT0iLAogIiUiOiJNZWRpYUtleU1lc3NhZ2VFdmVudCJ9LAogRDgwOnsKQEAgLTkxNDAsNyArOTM1MSw3IEBACiAiJSI6Ik1JRElNZXNzYWdlRXZlbnQifSwKIHl0OnsKICJeIjoiSW1yOyIsCi1mWjpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuc2VuZChiLGMpfSwKK0VaOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYS5zZW5kKGIsYyl9LAogd1I6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5zZW5kKGIpfSwKICIlIjoiTUlESU91dHB1dCJ9LAogSW1yOnsKQEAgLTkxNTYsNyArOTM2Nyw3IEBACiBlbHNle2lmKCFKLngoVy5xYyhhLnRhcmdldCkpLiRpc2g0KXRocm93IEguYihQLmYoIm9mZnNldFggaXMgb25seSBzdXBwb3J0ZWQgb24gZWxlbWVudHMiKSkKIHo9Vy5xYyhhLnRhcmdldCkKIHk9SC5WTShuZXcgUC5oTChhLmNsaWVudFgsYS5jbGllbnRZKSxbbnVsbF0pLlcoMCxKLmpDKEoubUIoeikpKQotcmV0dXJuIEguVk0obmV3IFAuaEwoSi5JdCh5LngpLEouSXQoeS55KSksW251bGxdKX19LAorcmV0dXJuIEguVk0obmV3IFAuaEwoSi5IaCh5LngpLEouSGgoeS55KSksW251bGxdKX19LAogJGlzQWpZOnRydWUsCiAiJSI6IkRyYWdFdmVudHxNU1BvaW50ZXJFdmVudHxNb3VzZUV2ZW50fE1vdXNlU2Nyb2xsRXZlbnR8TW91c2VXaGVlbEV2ZW50fFBvaW50ZXJFdmVudHxXaGVlbEV2ZW50In0sCiBIOTp7CkBAIC05MTcxLDggKzkzODIsOSBAQAogeS4kMigic3VidHJlZSIsaSkKIHkuJDIoImF0dHJpYnV0ZU9sZFZhbHVlIixkKQogeS4kMigiY2hhcmFjdGVyRGF0YU9sZFZhbHVlIixnKQoteS4kMigiYXR0cmlidXRlRmlsdGVyIixjKQoraWYoYyE9bnVsbCl5LiQyKCJhdHRyaWJ1dGVGaWx0ZXIiLGMpCiBhLm9ic2VydmUoYix6KX0sCitPVDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuamgoYSxiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxjLG51bGwpfSwKIE1TOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLmpoKGEsYixjLG51bGwsZCxudWxsLG51bGwsbnVsbCxudWxsKX0sCiAiJSI6Ik11dGF0aW9uT2JzZXJ2ZXJ8V2ViS2l0TXV0YXRpb25PYnNlcnZlciJ9LAogVnY6ewpAQCAtOTE5Niw4ICs5NDA4LDggQEAKIGZvcih5PXouY2hpbGROb2Rlcy5sZW5ndGgseD0wO3g8eTsrK3gpYS5pbnNlcnRCZWZvcmUoei5maXJzdENoaWxkLGMpfWVsc2UgZm9yKHo9ei5nQShiKTt6LkcoKTspYS5pbnNlcnRCZWZvcmUoei5nbCgpLGMpfSwKIHBqOmZ1bmN0aW9uKGEpe3ZhciB6CiBmb3IoO3o9YS5maXJzdENoaWxkLHohPW51bGw7KWEucmVtb3ZlQ2hpbGQoeil9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9YS5ub2RlVmFsdWUKLXJldHVybiB6PT1udWxsP0ouR3YucHJvdG90eXBlLmJ1LmNhbGwodGhpcyxhKTp6fSwKK2J1OltmdW5jdGlvbihhKXt2YXIgej1hLm5vZGVWYWx1ZQorcmV0dXJuIHo9PW51bGw/Si5Hdi5wcm90b3R5cGUuYnUuY2FsbCh0aGlzLGEpOnp9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG14OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuYXBwZW5kQ2hpbGQoYil9LAogdGc6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jb250YWlucyhiKX0sCiBtSzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGEuaW5zZXJ0QmVmb3JlKGIsYyl9LApAQCAtOTIyOCw3ICs5NDQwLDcgQEAKICJeIjoiQm87dDU6dHlwZSUiLAogIiUiOiJIVE1MT0xpc3RFbGVtZW50In0sCiBHNzc6ewotIl4iOiJCbztSbjpkYXRhPSxNQjpmb3JtPSxmZzpoZWlnaHR9LG9jOm5hbWUlLHQ1OnR5cGUlLFI6d2lkdGh9IiwKKyJeIjoiQm87Um46ZGF0YT0sTUI6Zm9ybT0sZmc6aGVpZ2h0JSxvYzpuYW1lJSx0NTp0eXBlJSxSOndpZHRofSIsCiAiJSI6IkhUTUxPYmplY3RFbGVtZW50In0sCiBxVzp7CiAiXiI6IkJvO3BoOmxhYmVsJSIsCkBAIC05MjUwLDM4ICs5NDYyLDM1IEBACiBNUjp7CiAiXiI6Ikd2O3RUOmNvZGU9LEcxOm1lc3NhZ2U9IiwKICIlIjoiUG9zaXRpb25FcnJvciJ9LAoteWI6eworUWxzOnsKICJeIjoibng7Tjp0YXJnZXQ9IiwKICIlIjoiUHJvY2Vzc2luZ0luc3RydWN0aW9uIn0sCiBLUjp7CiAiXiI6IkJvO1A6dmFsdWUlIiwKICIlIjoiSFRNTFByb2dyZXNzRWxlbWVudCJ9LAota2Y6eworZXc3OnsKICJeIjoiZWE7b3g6bG9hZGVkPSIsCi0kaXNrZjp0cnVlLAorJGlzZXc3OnRydWUsCiAiJSI6IlhNTEh0dHBSZXF1ZXN0UHJvZ3Jlc3NFdmVudDtQcm9ncmVzc0V2ZW50In0sCiBiVDp7Ci0iXiI6ImtmO08zOnVybD0iLAorIl4iOiJldzc7TzM6dXJsPSIsCiAiJSI6IlJlc291cmNlUHJvZ3Jlc3NFdmVudCJ9LAogajI0OnsKICJeIjoiQm87dDU6dHlwZSUiLAogIiUiOiJIVE1MU2NyaXB0RWxlbWVudCJ9LAotRWFnOnsKLSJeIjoiZWE7YkE6bGluZU51bWJlcj0iLAotIiUiOiJTZWN1cml0eVBvbGljeVZpb2xhdGlvbkV2ZW50In0sCiB6azp7CiAiXiI6IkJvO01COmZvcm09LEI6bGVuZ3RoJSxvYzpuYW1lJSxNajpzZWxlY3RlZEluZGV4JSx0NTp0eXBlPSxQOnZhbHVlJSIsCiAkaXN6azp0cnVlLAogIiUiOiJIVE1MU2VsZWN0RWxlbWVudCJ9LAogSTA6ewotIl4iOiJBajsiLAorIl4iOiJoc3c7IiwKIEtiOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuZ2V0RWxlbWVudEJ5SWQoYil9LAogJGlzSTA6dHJ1ZSwKICIlIjoiU2hhZG93Um9vdCJ9LAogeU5WOnsKICJeIjoiQm87dDU6dHlwZSUiLAogIiUiOiJIVE1MU291cmNlRWxlbWVudCJ9LAotUzI6eworSGQ6ewogIl4iOiJlYTtrYzplcnJvcj0sRzE6bWVzc2FnZT0iLAogIiUiOiJTcGVlY2hSZWNvZ25pdGlvbkVycm9yIn0sCiB5MDp7CkBAIC05MjkzLDkgKzk1MDIsMTAgQEAKIEc1OnsKICJeIjoiZWE7b2M6bmFtZT0iLAogIiUiOiJTcGVlY2hTeW50aGVzaXNFdmVudCJ9LAoteGk6eworQXNTOnsKICJeIjoiR3Y7IiwKIEZWOmZ1bmN0aW9uKGEsYil7SC5iUShiLG5ldyBXLkFBKGEpKX0sCit4NDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEl0ZW0oYikhPW51bGx9LAogdDpmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEl0ZW0oYil9LAogdTpmdW5jdGlvbihhLGIsYyl7YS5zZXRJdGVtKGIsYyl9LAogUno6ZnVuY3Rpb24oYSxiKXt2YXIgej1hLmdldEl0ZW0oYikKQEAgLTkzMTgsNyArOTUyOCw3IEBACiAkaXNaMDp0cnVlLAogJGFzWjA6ZnVuY3Rpb24oKXtyZXR1cm5bUC5xVSxQLnFVXX0sCiAiJSI6IlN0b3JhZ2UifSwKLWtJOnsKK0tMOnsKICJeIjoiZWE7RzM6a2V5PSxPMzp1cmw9IiwKICIlIjoiU3RvcmFnZUV2ZW50In0sCiBmcXE6ewpAQCAtOTM0OSw5ICs5NTU5LDkgQEAKICJeIjoibng7IiwKICRpc213OnRydWUsCiAiJSI6IkNEQVRBU2VjdGlvbnxUZXh0In0sCi1BNTp7CitIUjp7CiAiXiI6IkJvO01COmZvcm09LG9jOm5hbWUlLHZwOnJvd3M9LHQ1OnR5cGU9LFA6dmFsdWUlIiwKLSRpc0E1OnRydWUsCiskaXNIUjp0cnVlLAogIiUiOiJIVE1MVGV4dEFyZWFFbGVtZW50In0sCiBSMDp7CiAiXiI6Inc2TztSbjpkYXRhPSIsCkBAIC05MzYwLDEzICs5NTcwLDEzIEBACiAiXiI6Inc2TztZSzphbHRLZXk9LEVYOmN0cmxLZXk9LE5sOm1ldGFLZXk9LHF4OnNoaWZ0S2V5PSIsCiAiJSI6IlRvdWNoRXZlbnQifSwKIFJIdDp7Ci0iXiI6IkJvO2ZZOmtpbmQlLHBoOmxhYmVsJSIsCisiXiI6IkJvO2ZZOmtpbmQ9LHBoOmxhYmVsJSIsCiAiJSI6IkhUTUxUcmFja0VsZW1lbnQifSwKIHc2Tzp7CiAiXiI6ImVhOyIsCiAiJSI6IkZvY3VzRXZlbnR8U1ZHWm9vbUV2ZW50O1VJRXZlbnQifSwKIFNXOnsKLSJeIjoiZUw7Zmc6aGVpZ2h0fSxSOndpZHRofSIsCisiXiI6ImVMO2ZnOmhlaWdodCUsUjp3aWR0aH0iLAogIiUiOiJIVE1MVmlkZW9FbGVtZW50In0sCiBFS1c6ewogIl4iOiJQWjthQjpwcm90b2NvbD0sTzM6dXJsPSIsCkBAIC05Mzg2LDE5ICs5NTk2LDE5IEBACiB4TzpmdW5jdGlvbihhKXtyZXR1cm4gYS5jbG9zZSgpfSwKIGtyOmZ1bmN0aW9uKGEsYixjLGQpe2EucG9zdE1lc3NhZ2UoUC5wZihiKSxjKQogcmV0dXJufSwKLUQ5OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5rcihhLGIsYyxudWxsKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygpfSwKK1g2OmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5rcihhLGIsYyxudWxsKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9TdHJpbmcoKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogZ0VyOmZ1bmN0aW9uKGEpe3JldHVybiBILlZNKG5ldyBXLlJPKGEsQy5VMy5QaCwhMSksW251bGxdKX0sCiBnTG06ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IFcuUk8oYSxDLmkzLlBoLCExKSxbbnVsbF0pfSwKICRpc0s1OnRydWUsCiAkaXNQWjp0cnVlLAogIiUiOiJET01XaW5kb3d8V2luZG93In0sCi1VTTp7CitCbjp7CiAiXiI6IktWO29jOm5hbWU9LFA6dmFsdWUlIiwKICIlIjoiQXR0ciJ9LAogbzU6ewogIl4iOiJHdjtRRzpib3R0b209LGZnOmhlaWdodD0sQmI6bGVmdD0sVDg6cmlnaHQ9LEc2OnRvcD0sUjp3aWR0aD0iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIitILmQoYS5sZWZ0KSsiLCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4ICIrSC5kKGEuaGVpZ2h0KX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIitILmQoYS5sZWZ0KSsiLCAiK0guZChhLnRvcCkrIikgIitILmQoYS53aWR0aCkrIiB4ICIrSC5kKGEuaGVpZ2h0KX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogaWYoYj09bnVsbClyZXR1cm4hMQogej1KLngoYikKQEAgLTk0MzAsNyArOTY0MCw3IEBACiAiXiI6IkJvOyIsCiAkaXNQWjp0cnVlLAogIiUiOiJIVE1MRnJhbWVTZXRFbGVtZW50In0sCi1yaE06eworQ3k6ewogIl4iOiJrRUk7IiwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxlbmd0aH0sCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHo9YS5sZW5ndGgKQEAgLTk0ODUsOSArOTY5NSw5IEBACiBoOmZ1bmN0aW9uKGEsYil7dGhpcy5NVy5hcHBlbmRDaGlsZChiKQogcmV0dXJuIGJ9LAogZ0E6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5icih0aGlzKQotcmV0dXJuIEguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKX0sCityZXR1cm4gSC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pfSwKIEZWOmZ1bmN0aW9uKGEsYil7dmFyIHoseQotZm9yKHo9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guS3AoYiwwKV0pLHk9dGhpcy5NVzt6LkcoKTspeS5hcHBlbmRDaGlsZCh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5PcShiLDApXSkseT10aGlzLk1XO3ouRygpOyl5LmFwcGVuZENoaWxkKHoubG8pfSwKIEdUOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAuZigiQ2Fubm90IHNvcnQgZWxlbWVudCBsaXN0cyIpKX0sCiBKZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5HVChhLG51bGwpfSwKIE5rOmZ1bmN0aW9uKGEsYil7dGhpcy5KbChiLCExKX0sCkBAIC05NDk1LDcgKzk3MDUsNyBAQAogej10aGlzLk1XCiBpZihiKXt6PUouTXgoeikKIHk9ei5hZCh6LG5ldyBXLnROKGEpKX1lbHNle3o9Si5NeCh6KQoteT16LmFkKHosYSl9Zm9yKHo9SC5WTShuZXcgSC5NbyhKLm1ZKHkubDYpLHkuVDYpLFtILktwKHksMCldKSx4PXouT0k7ei5HKCk7KUouTXAoeC5nbCgpKX0sCit5PXouYWQoeixhKX1mb3Ioej1ILlZNKG5ldyBILk1vKEoubVkoeS5sNikseS5UNiksW0guT3EoeSwwKV0pLHg9ei5PSTt6LkcoKTspSi5NcCh4LmdsKCkpfSwKIFlXOmZ1bmN0aW9uKGEsYixjLGQsZSl7dGhyb3cgSC5iKFAuU1kobnVsbCkpfSwKIHpCOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLllXKGEsYixjLGQsMCl9LAogUno6ZnVuY3Rpb24oYSxiKXt2YXIgegpAQCAtOTUxOSwxMSArOTcyOSwxMSBAQAogaWYoej09bnVsbCl0aHJvdyBILmIoUC53KCJObyBlbGVtZW50cyIpKQogcmV0dXJuIHp9LAogJGFzYXJrOmZ1bmN0aW9uKCl7cmV0dXJuW1cuaDRdfSwKLSRhc0U5aDpmdW5jdGlvbigpe3JldHVybltXLmg0XX0sCiskYXNJcjpmdW5jdGlvbigpe3JldHVybltXLmg0XX0sCiAkYXNXTzpmdW5jdGlvbigpe3JldHVybltXLmg0XX0sCiAkYXNRVjpmdW5jdGlvbigpe3JldHVybltXLmg0XX19LAogdE46ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS4kMShhKSE9PSEwfSwKICRpc0VIOnRydWV9LAogVFM6ewpAQCAtOTU1MSw3ICs5NzYxLDcgQEAKIHouVW4oYSxiKQogcmV0dXJuIHp9fX0sCiBwTjp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzaDR9LAogJGlzRUg6dHJ1ZX0sCiBRSTp7CkBAIC05NTYyLDExICs5NzcyLDExIEBACiBETTp7CiAiXiI6ImtkO29mOllPPCxvZiIsCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHoseQotej0kLlZwKCkKK3o9JC5ubigpCiB5PUouclkoYikKIGlmKHouZ3ZjKHopLkZiLng0KDAseS5oYyhiKSkpaWYoUC5GNygpPT09ITApcmV0dXJuIEguVk0obmV3IFcuSkYodGhpcy5ZTyx6LnQoMCx5LmhjKGIpKSwhMSksW251bGxdKQogcmV0dXJuIEguVk0obmV3IFcuSkYodGhpcy5ZTyxiLCExKSxbbnVsbF0pfSwKLXN0YXRpYzp7Il4iOiJmRCJ9fSwKK3N0YXRpYzp7Il4iOiJmRFgifX0sCiBSQXA6ewogIl4iOiJHditsRDsiLAogJGlzV086dHJ1ZSwKQEAgLTk1ODIsMTUgKzk3OTIsMTUgQEAKICRpc1FWOnRydWUsCiAkYXNRVjpmdW5jdGlvbigpe3JldHVybltXLktWXX19LAogS3g6ewotIl4iOiJUcDoxMzsiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmxOKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTM4LCJjYWxsIl0sCisiXiI6IlRwWjoxMzsiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmxOKGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGJVMjp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5zZXRSZXF1ZXN0SGVhZGVyKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiBiVTp7Ci0iXiI6IlRwOjEzO2IsYyIsCisiXiI6IlRwWjoxMztiLGMiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseAogej10aGlzLmMKIHk9ei5zdGF0dXMKQEAgLTk2MDIsNyArOTgxMiw3IEBACiB5Lk9IKHopfWVsc2UgeC5wbShhKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogUVI6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXtpZihiIT1udWxsKXRoaXMuYVthXT1ifSwKICRpc0VIOnRydWV9LAogd2k6ewpAQCAtOTYxMiw3ICs5ODIyLDcgQEAKIHJldHVybiB6fSwKIGg6ZnVuY3Rpb24oYSxiKXt0aGlzLk5MLmFwcGVuZENoaWxkKGIpfSwKIEZWOmZ1bmN0aW9uKGEsYil7dmFyIHoseQotZm9yKHo9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guS3AoYiwwKV0pLHk9dGhpcy5OTDt6LkcoKTspeS5hcHBlbmRDaGlsZCh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5PcShiLDApXSkseT10aGlzLk5MO3ouRygpOyl5LmFwcGVuZENoaWxkKHoubG8pfSwKIHhlOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgKIGlmKGI+dGhpcy5OTC5jaGlsZE5vZGVzLmxlbmd0aCl0aHJvdyBILmIoUC5URShiLDAsdGhpcy5nQih0aGlzKSkpCiB6PXRoaXMuTkwKQEAgLTk2NTcsNyArOTg2Nyw3IEBACiByZXR1cm4geltiXX0sCiAkaXN3aTp0cnVlLAogJGFzYXJrOmZ1bmN0aW9uKCl7cmV0dXJuW1cuS1ZdfSwKLSRhc0U5aDpmdW5jdGlvbigpe3JldHVybltXLktWXX0sCiskYXNJcjpmdW5jdGlvbigpe3JldHVybltXLktWXX0sCiAkYXNXTzpmdW5jdGlvbigpe3JldHVybltXLktWXX0sCiAkYXNRVjpmdW5jdGlvbigpe3JldHVybltXLktWXX19LAogbk5MOnsKQEAgLTk2NzUsMTUgKzk4ODUsMTUgQEAKICRpc1FWOnRydWUsCiAkYXNRVjpmdW5jdGlvbigpe3JldHVybltXLktWXX19LAogQUE6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt0aGlzLmEuc2V0SXRlbShhLGIpfSwKICRpc0VIOnRydWV9LAogd1E6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5hLnB1c2goYSl9LAogJGlzRUg6dHJ1ZX0sCiByczp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLmEucHVzaChiKX0sCiAkaXNFSDp0cnVlfSwKIHlvbzp7CkBAIC05NzE4LDkgKzk5MjgsOSBAQAogIl4iOiJhOyIsCiBGVjpmdW5jdGlvbihhLGIpe0ouTWUoYixuZXcgVy5aYyh0aGlzKSl9LAogVjE6ZnVuY3Rpb24oYSl7dmFyIHoKLWZvcih6PXRoaXMuZ3ZjKHRoaXMpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl0aGlzLlJ6KDAsei5sbyl9LAorZm9yKHo9dGhpcy5ndmModGhpcyksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXRoaXMuUnooMCx6LmxvKX0sCiBhTjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKLWZvcih6PXRoaXMuZ3ZjKHRoaXMpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl7eT16LmxvCitmb3Ioej10aGlzLmd2Yyh0aGlzKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspe3k9ei5sbwogYi4kMih5LHRoaXMudCgwLHkpKX19LAogZ3ZjOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuTVcuYXR0cmlidXRlcwpAQCAtOTczOSw3ICs5OTQ5LDcgQEAKICRpc1owOnRydWUsCiAkYXNaMDpmdW5jdGlvbigpe3JldHVybltQLnFVLFAucVVdfX0sCiBaYzp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sCiAkaXNFSDp0cnVlfSwKIEU5OnsKQEAgLTk3NjEsNDYgKzk5NzEsNDYgQEAKIHJldHVybiB6fSwKIHA1OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9Qy5ObS56VihQLkYoYSwhMCxudWxsKSwiICIpCi1mb3IoeT10aGlzLm44LHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guS3AoeSwwKV0pO3kuRygpOylKLlB3KHkubG8seil9LAorZm9yKHk9dGhpcy5uOCx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILk9xKHksMCldKTt5LkcoKTspSi5Qdyh5LmxvLHopfSwKIE9TOmZ1bmN0aW9uKGEpe3RoaXMuS2QuYU4oMCxuZXcgVy5KdChhKSl9LAotUno6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RNihuZXcgVy5BMShiKSl9LAorUno6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5RNihuZXcgVy5tYShiKSl9LAogUTY6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuS2QuZXMoMCwhMSxuZXcgVy5oRChhKSl9LAogeUo6ZnVuY3Rpb24oYSl7dGhpcy5LZD1ILlZNKG5ldyBILkE4KFAuRih0aGlzLm44LCEwLG51bGwpLG5ldyBXLlh3KCkpLFtudWxsLG51bGxdKX0sCiBzdGF0aWM6e29yOmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBXLmhaKGEsbnVsbCkKIHoueUooYSkKIHJldHVybiB6fX19LAogWHc6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFcuSTQoYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHFtOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmEuRlYoMCxhLmxGKCkpfSwKICRpc0VIOnRydWV9LAogSnQ6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuT1ModGhpcy5hKX0sCiAkaXNFSDp0cnVlfSwKLUExOnsKLSJeIjoiVHA6MTM7YSIsCittYTp7CisiXiI6IlRwWjoxMzthIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlYxKGEsdGhpcy5hKX0sCiAkaXNFSDp0cnVlfSwKIGhEOnsKLSJeIjoiVHA6Nzk7YSIsCisiXiI6IlRwWjo4MDthIiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuYS4kMShiKT09PSEwfHxhPT09ITB9LAogJGlzRUg6dHJ1ZX0sCiBJNDp7CiAiXiI6IkFzMztNVyIsCiBsRjpmdW5jdGlvbigpe3ZhciB6LHkseAogej1QLkxzKG51bGwsbnVsbCxudWxsLFAucVUpCi1mb3IoeT1KLnVmKHRoaXMuTVcpLnNwbGl0KCIgIikseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSk7eS5HKCk7KXt4PUoucnIoeS5sbykKK2Zvcih5PUoudWYodGhpcy5NVykuc3BsaXQoIiAiKSx5PUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILk9xKHksMCldKTt5LkcoKTspe3g9Si5ycih5LmxvKQogaWYoeC5sZW5ndGghPT0wKXouaCgwLHgpfXJldHVybiB6fSwKIHA1OmZ1bmN0aW9uKGEpe1AuRihhLCEwLG51bGwpCiBKLlB3KHRoaXMuTVcsYS56VigwLCIgIikpfX0sCiBGa086ewogIl4iOiJhO1BoIiwKLWVuOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFcuUk8oYSx0aGlzLlBoLGIpLFtudWxsXSl9LAotTFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZW4oYSwhMSl9fSwKK0RUOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEguVk0obmV3IFcuUk8oYSx0aGlzLlBoLGIpLFtudWxsXSl9LAorTFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuRFQoYSwhMSl9fSwKIFJPOnsKICJeIjoid1M7REssUGgsU2ciLAogS1I6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9bmV3IFcuT3YoMCx0aGlzLkRLLHRoaXMuUGgsVy5hRihhKSx0aGlzLlNnKQpAQCAtOTgxNSw0MCArMTAwMjUsNDAgQEAKIHJldHVybiBILlZNKG5ldyBQLmM5KG5ldyBXLnJnKGIpLHopLFtILmlwKHosIndTIiwwKSxudWxsXSl9LAogJGlzd1M6dHJ1ZX0sCiBpZTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5TbyhKLmwyKGEpLHRoaXMuYSl9LAogJGlzRUg6dHJ1ZX0sCiByZzp7Ci0iXiI6IlRwOjEzO2IiLAorIl4iOiJUcFo6MTM7YiIsCiAkMTpbZnVuY3Rpb24oYSl7Si5xZChhLHRoaXMuYikKIHJldHVybiBhfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBVYzp7CiAiXiI6IndTO1F4LFNnLFBoIiwKLVdPOmZ1bmN0aW9uKGEsYil7dmFyIHo9SC5WTShuZXcgUC5uTyhuZXcgVy5iMChiKSx0aGlzKSxbSC5pcCh0aGlzLCJ3UyIsMCldKQotcmV0dXJuIEguVk0obmV3IFAuYzkobmV3IFcuSGIoYikseiksW0guaXAoeiwid1MiLDApLG51bGxdKX0sCitXTzpmdW5jdGlvbihhLGIpe3ZhciB6PUguVk0obmV3IFAubk8obmV3IFcuSGIoYiksdGhpcyksW0guaXAodGhpcywid1MiLDApXSkKK3JldHVybiBILlZNKG5ldyBQLmM5KG5ldyBXLmlORChiKSx6KSxbSC5pcCh6LCJ3UyIsMCksbnVsbF0pfSwKIEtSOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3LHYKLXo9SC5WTShuZXcgVy5xTyhudWxsLFAuTDUobnVsbCxudWxsLG51bGwsW1Aud1MsbnVsbF0sW1AuTU8sbnVsbF0pKSxbbnVsbF0pCit6PUguVk0obmV3IFcucU8obnVsbCxQLkw1KG51bGwsbnVsbCxudWxsLFtQLndTLG51bGxdLFtQLnlYLG51bGxdKSksW251bGxdKQogei54ZChudWxsKQogZm9yKHk9dGhpcy5ReCx5PXkuZ0EoeSkseD10aGlzLlBoLHc9dGhpcy5TZzt5LkcoKTspe3Y9bmV3IFcuUk8oeS5sbyx4LHcpCiB2LiRidWlsdGluVHlwZUluZm89W251bGxdCiB6LmgoMCx2KX15PXoucFkKIHkudG9TdHJpbmcKLXJldHVybiBILlZNKG5ldyBQLklrKHkpLFtILktwKHksMCldKS5LUihhLGIsYyxkKX0sCityZXR1cm4gSC5WTShuZXcgUC5Jayh5KSxbSC5PcSh5LDApXSkuS1IoYSxiLGMsZCl9LAogekM6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLktSKGEsbnVsbCxiLGMpfSwKIHlJOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLktSKGEsbnVsbCxudWxsLG51bGwpfSwKICRpc3dTOnRydWV9LAotYjA6ewotIl4iOiJUcDoxMzthIiwKK0hiOnsKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouU28oSi5sMihhKSx0aGlzLmEpfSwKICRpc0VIOnRydWV9LAotSGI6ewotIl4iOiJUcDoxMztiIiwKK2lORDp7CisiXiI6IlRwWjoxMztiIiwKICQxOltmdW5jdGlvbihhKXtKLnFkKGEsdGhpcy5iKQogcmV0dXJuIGF9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIE92OnsKLSJeIjoiTU87VlAsREssUGgsdTcsU2ciLAorIl4iOiJ5WDtWUCxESyxQaCx1NyxTZyIsCiBlZDpmdW5jdGlvbigpe2lmKHRoaXMuREs9PW51bGwpcmV0dXJuCiB0aGlzLk5zKCkKIHRoaXMuREs9bnVsbApAQCAtOTg1Niw3ICsxMDA2Niw3IEBACiByZXR1cm59LAogRnY6W2Z1bmN0aW9uKGEsYil7aWYodGhpcy5ESz09bnVsbClyZXR1cm47Kyt0aGlzLlZQCiB0aGlzLk5zKCkKLWlmKGIhPW51bGwpYi5ZTSh0aGlzLmdEUSh0aGlzKSl9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkZ2KGEsbnVsbCl9LCJ5eSIsIiQxIiwiJDAiLCJnWDAiLDAsMiwxMjUsMjMsMTI2XSwKK2lmKGIhPW51bGwpYi5ZTSh0aGlzLmdEUSh0aGlzKSl9LGZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkZ2KGEsbnVsbCl9LCJ5eSIsIiQxIiwiJDAiLCJnWDAiLDAsMiwxMjYsMjMsMTI3XSwKIGdVRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZQPjB9LAogUUU6W2Z1bmN0aW9uKGEpe2lmKHRoaXMuREs9PW51bGx8fHRoaXMuVlA8PTApcmV0dXJuOy0tdGhpcy5WUAogdGhpcy5aeigpfSwiJDAiLCJnRFEiLDAsMCwxOF0sCkBAIC05ODc0LDEyICsxMDA4NCwxMiBAQAogUno6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLnVaLlJ6KDAsYikKIGlmKHohPW51bGwpei5lZCgpfSwKIHhPOltmdW5jdGlvbihhKXt2YXIgeix5Ci1mb3Ioej10aGlzLnVaLHk9ei5nVVEoeikseT1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh5Lmw2KSx5LlQ2KSxbSC5LcCh5LDApLEguS3AoeSwxKV0pO3kuRygpOyl5LmxvLmVkKCkKK2Zvcih6PXRoaXMudVoseT16LmdVUSh6KSx5PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHkubDYpLHkuVDYpLFtILk9xKHksMCksSC5PcSh5LDEpXSk7eS5HKCk7KXkubG8uZWQoKQogei5WMSgwKQogdGhpcy5wWS54TygwKX0sIiQwIiwiZ1FGIiwwLDAsMThdLAogeGQ6ZnVuY3Rpb24oYSl7dGhpcy5wWT1QLmJLKHRoaXMuZ1FGKHRoaXMpLG51bGwsITAsYSl9fSwKIHJXOnsKLSJeIjoiVHA6NzE7YSxiIiwKKyJeIjoiVHBaOjcyO2EsYiIsCiAkMDpbZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hLlJ6KDAsdGhpcy5iKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEdtOnsKQEAgLTk5NDIsNyArMTAxNTIsNyBAQAogcmV0dXJuITF9LAogZ2w6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5RWn19LAogelo6ewotIl4iOiJUcDoxMzthLGIiLAorIl4iOiJUcFo6MTM7YSxiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej1ILlZhKHRoaXMuYikKIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGluaXQuZGlzcGF0Y2hQcm9wZXJ0eU5hbWUse3ZhbHVlOnosZW51bWVyYWJsZTpmYWxzZSx3cml0YWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTp0cnVlfSkKIGEuY29uc3RydWN0b3I9YS5fX3Byb3RvX18uY29uc3RydWN0b3IKQEAgLTk5NTQsNyArMTAxNjQsNyBAQAogZ2VUOmZ1bmN0aW9uKGEpe3JldHVybiBXLlAxKHRoaXMuVWkucGFyZW50KX0sCiB4TzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5VaS5jbG9zZSgpfSwKIGtyOmZ1bmN0aW9uKGEsYixjLGQpe3RoaXMuVWkucG9zdE1lc3NhZ2UoUC5wZihiKSxjKX0sCi1EOTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMua3IoYSxiLGMsbnVsbCl9LAorWDY6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLmtyKGEsYixjLG51bGwpfSwKIGdJOmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuZigiWW91IGNhbiBvbmx5IGF0dGFjaCBFdmVudExpc3RlbmVycyB0byB5b3VyIG93biB3aW5kb3cuIikpfSwKIFliOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBILnZoKFAuZigiWW91IGNhbiBvbmx5IGF0dGFjaCBFdmVudExpc3RlbmVycyB0byB5b3VyIG93biB3aW5kb3cuIikpfSwKIFk5OmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBILnZoKFAuZigiWW91IGNhbiBvbmx5IGF0dGFjaCBFdmVudExpc3RlbmVycyB0byB5b3VyIG93biB3aW5kb3cuIikpfSwKQEAgLTk5NzgsODIgKzEwMTg4LDgyIEBACiAiXiI6IlJjO21IOmhyZWY9IiwKICIlIjoiU1ZHQWx0R2x5cGhFbGVtZW50In0sCiBlRzp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFQmxlbmRFbGVtZW50In0sCi1iZDp7Ci0iXiI6ImQ1Rzt0NTp0eXBlPSxVUTp2YWx1ZXM9LHlHOnJlc3VsdD0seD0seT0iLAorbHZyOnsKKyJeIjoiZDVHO3Q1OnR5cGU9LFVROnZhbHVlcz0sZmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVDb2xvck1hdHJpeEVsZW1lbnQifSwKIHBmYzp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFQ29tcG9uZW50VHJhbnNmZXJFbGVtZW50In0sCiBuUTp7Ci0iXiI6ImQ1RztrcDpvcGVyYXRvcj0seUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztrcDpvcGVyYXRvcj0sZmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVDb21wb3NpdGVFbGVtZW50In0sCiBFZkU6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRUNvbnZvbHZlTWF0cml4RWxlbWVudCJ9LAogbUN6OnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVEaWZmdXNlTGlnaHRpbmdFbGVtZW50In0sCiB3ZnU6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRURpc3BsYWNlbWVudE1hcEVsZW1lbnQifSwKLWhhOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0iLAoraWhIOnsKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFRmxvb2RFbGVtZW50In0sCiB5bTp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFR2F1c3NpYW5CbHVyRWxlbWVudCJ9LAogbWVJOnsKLSJeIjoiZDVHO3lHOnJlc3VsdD0seD0seT0sbUg6aHJlZj0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9LG1IOmhyZWY9IiwKICIlIjoiU1ZHRkVJbWFnZUVsZW1lbnQifSwKIG9CVzp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFTWVyZ2VFbGVtZW50In0sCiB3Qzp7Ci0iXiI6ImQ1RztrcDpvcGVyYXRvcj0seUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztrcDpvcGVyYXRvcj0sZmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVNb3JwaG9sb2d5RWxlbWVudCJ9LAogTGo6ewotIl4iOiJkNUc7eUc6cmVzdWx0PSx4PSx5PSIsCisiXiI6ImQ1RztmZzpoZWlnaHQ9LHlHOnJlc3VsdD0seD0seT0iLAogIiUiOiJTVkdGRU9mZnNldEVsZW1lbnQifSwKIFVicjp7CiAiXiI6ImQ1Rzt4PSx5PSIsCiAiJSI6IlNWR0ZFUG9pbnRMaWdodEVsZW1lbnQifSwKIGJNQjp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFU3BlY3VsYXJMaWdodGluZ0VsZW1lbnQifSwKIHBROnsKICJeIjoiZDVHO3g9LHk9IiwKICIlIjoiU1ZHRkVTcG90TGlnaHRFbGVtZW50In0sCiBIWDp7Ci0iXiI6ImQ1Rzt5RzpyZXN1bHQ9LHg9LHk9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seUc6cmVzdWx0PSx4PSx5PSIsCiAiJSI6IlNWR0ZFVGlsZUVsZW1lbnQifSwKIEZ1OnsKLSJeIjoiZDVHO3Q1OnR5cGU9LHlHOnJlc3VsdD0seD0seT0iLAorIl4iOiJkNUc7dDU6dHlwZT0sZmc6aGVpZ2h0PSx5RzpyZXN1bHQ9LHg9LHk9IiwKICIlIjoiU1ZHRkVUdXJidWxlbmNlRWxlbWVudCJ9LAogT0U1OnsKLSJeIjoiZDVHO3g9LHk9LG1IOmhyZWY9IiwKKyJeIjoiZDVHO2ZnOmhlaWdodD0seD0seT0sbUg6aHJlZj0iLAogIiUiOiJTVkdGaWx0ZXJFbGVtZW50In0sCiBOOTp7Ci0iXiI6InRwcjt4PSx5PSIsCisiXiI6InRwcjtmZzpoZWlnaHQ9LHg9LHk9IiwKICIlIjoiU1ZHRm9yZWlnbk9iamVjdEVsZW1lbnQifSwKLWQwRDp7Citlbjp7CiAiXiI6InRwcjsiLAogIiUiOiJTVkdDaXJjbGVFbGVtZW50fFNWR0VsbGlwc2VFbGVtZW50fFNWR0xpbmVFbGVtZW50fFNWR1BhdGhFbGVtZW50fFNWR1BvbHlnb25FbGVtZW50fFNWR1BvbHlsaW5lRWxlbWVudDtTVkdHZW9tZXRyeUVsZW1lbnQifSwKIHRwcjp7CiAiXiI6ImQ1RzsiLAogIiUiOiJTVkdDbGlwUGF0aEVsZW1lbnR8U1ZHRGVmc0VsZW1lbnR8U1ZHR0VsZW1lbnR8U1ZHU3dpdGNoRWxlbWVudDtTVkdHcmFwaGljc0VsZW1lbnQifSwKIHBBdjp7Ci0iXiI6InRwcjt4PSx5PSxtSDpocmVmPSIsCisiXiI6InRwcjtmZzpoZWlnaHQ9LHg9LHk9LG1IOmhyZWY9IiwKICIlIjoiU1ZHSW1hZ2VFbGVtZW50In0sCiBOQlo6ewotIl4iOiJkNUc7eD0seT0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx4PSx5PSIsCiAiJSI6IlNWR01hc2tFbGVtZW50In0sCiBHcjU6ewotIl4iOiJkNUc7eD0seT0sbUg6aHJlZj0iLAorIl4iOiJkNUc7Zmc6aGVpZ2h0PSx4PSx5PSxtSDpocmVmPSIsCiAiJSI6IlNWR1BhdHRlcm5FbGVtZW50In0sCiBmUTp7Ci0iXiI6ImQwRDt4PSx5PSIsCisiXiI6ImVuO2ZnOmhlaWdodD0seD0seT0iLAogIiUiOiJTVkdSZWN0RWxlbWVudCJ9LAogcUlSOnsKICJeIjoiZDVHO3Q1OnR5cGUlLG1IOmhyZWY9IiwKQEAgLTEwMDc0LDkgKzEwMjg0LDkgQEAKIGdmMDpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgVy5KRihhLEMuS3EuUGgsITEpLFtudWxsXSl9LAogJGlzUFo6dHJ1ZSwKICIlIjoiU1ZHQWx0R2x5cGhEZWZFbGVtZW50fFNWR0FsdEdseXBoSXRlbUVsZW1lbnR8U1ZHQW5pbWF0ZUVsZW1lbnR8U1ZHQW5pbWF0ZU1vdGlvbkVsZW1lbnR8U1ZHQW5pbWF0ZVRyYW5zZm9ybUVsZW1lbnR8U1ZHQW5pbWF0aW9uRWxlbWVudHxTVkdDb21wb25lbnRUcmFuc2ZlckZ1bmN0aW9uRWxlbWVudHxTVkdDdXJzb3JFbGVtZW50fFNWR0Rlc2NFbGVtZW50fFNWR0Rpc2NhcmRFbGVtZW50fFNWR0ZFRGlzdGFudExpZ2h0RWxlbWVudHxTVkdGRURyb3BTaGFkb3dFbGVtZW50fFNWR0ZFRnVuY0FFbGVtZW50fFNWR0ZFRnVuY0JFbGVtZW50fFNWR0ZFRnVuY0dFbGVtZW50fFNWR0ZFRnVuY1JFbGVtZW50fFNWR0ZFTWVyZ2VOb2RlRWxlbWVudHxTVkdGb250RWxlbWVudHxTVkdGb250RmFjZUVsZW1lbnR8U1ZHRm9udEZhY2VGb3JtYXRFbGVtZW50fFNWR0ZvbnRGYWNlTmFtZUVsZW1lbnR8U1ZHRm9udEZhY2VTcmNFbGVtZW50fFNWR0ZvbnRGYWNlVXJpRWxlbWVudHxTVkdHbHlwaEVsZW1lbnR8U1ZHR2x5cGhSZWZFbGVtZW50fFNWR0hLZXJuRWxlbWVudHxTVkdNUGF0aEVsZW1lbnR8U1ZHTWFya2VyRWxlbWVudHxTVkdNZXRhZGF0YUVsZW1lbnR8U1ZHTWlzc2luZ0dseXBoRWxlbWVudHxTVkdTZXRFbGVtZW50fFNWR1N0b3BFbGVtZW50fFNWR1N5bWJvbEVsZW1lbnR8U1ZHVGl0bGVFbGVtZW50fFNWR1ZLZXJuRWxlbWVudHxTVkdWaWV3RWxlbWVudDtTVkdFbGVtZW50IiwKLXN0YXRpYzp7Il4iOiJKUTwifX0sCitzdGF0aWM6eyJeIjoiU0g8In19LAogaHk6ewotIl4iOiJ0cHI7eD0seT0iLAorIl4iOiJ0cHI7Zmc6aGVpZ2h0PSx4PSx5PSIsCiBLYjpmdW5jdGlvbihhLGIpe3JldHVybiBhLmdldEVsZW1lbnRCeUlkKGIpfSwKICRpc2h5OnRydWUsCiAiJSI6IlNWR1NWR0VsZW1lbnQifSwKQEAgLTEwMDkwLDcgKzEwMzAwLDcgQEAKICJeIjoibUhxO3g9LHk9IiwKICIlIjoiU1ZHVFNwYW5FbGVtZW50fFNWR1RleHRFbGVtZW50O1NWR1RleHRQb3NpdGlvbmluZ0VsZW1lbnQifSwKIGNpOnsKLSJeIjoidHByO3g9LHk9LG1IOmhyZWY9IiwKKyJeIjoidHByO2ZnOmhlaWdodD0seD0seT0sbUg6aHJlZj0iLAogIiUiOiJTVkdVc2VFbGVtZW50In0sCiBjdVU6ewogIl4iOiJkNUc7bUg6aHJlZj0iLApAQCAtMTAxMDEsNyArMTAzMTEsNyBAQAogej10aGlzLkxPLmdldEF0dHJpYnV0ZSgiY2xhc3MiKQogeT1QLkxzKG51bGwsbnVsbCxudWxsLFAucVUpCiBpZih6PT1udWxsKXJldHVybiB5Ci1mb3IoeD16LnNwbGl0KCIgIikseD1ILlZNKG5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKSxbSC5LcCh4LDApXSk7eC5HKCk7KXt3PUoucnIoeC5sbykKK2Zvcih4PXouc3BsaXQoIiAiKSx4PUguVk0obmV3IEguYTcoeCx4Lmxlbmd0aCwwLG51bGwpLFtILk9xKHgsMCldKTt4LkcoKTspe3c9Si5ycih4LmxvKQogaWYody5sZW5ndGghPT0wKXkuaCgwLHcpfXJldHVybiB5fSwKIHA1OmZ1bmN0aW9uKGEpe3RoaXMuTE8uc2V0QXR0cmlidXRlKCJjbGFzcyIsYS56VigwLCIgIikpfX19XSxbImRhcnQuZG9tLndlYl9zcWwiLCJkYXJ0OndlYl9zcWwiLCxQLHsKICJeIjoiIiwKQEAgLTEwMTA5LDcgKzEwMzE5LDcgQEAKICJeIjoiR3Y7dFQ6Y29kZT0sRzE6bWVzc2FnZT0iLAogIiUiOiJTUUxFcnJvciJ9fV0sWyJkYXJ0Lmlzb2xhdGUiLCJkYXJ0Omlzb2xhdGUiLCxQLHsKICJeIjoiIiwKLWhNOmZ1bmN0aW9uKCl7dmFyIHoseSx4CithdDpmdW5jdGlvbigpe3ZhciB6LHkseAogej0kLlZ6CiAkLlZ6PXorMQogeT1uZXcgSC55byh6LG51bGwsITEpCkBAIC0xMDExOSwxNiArMTAzMjksMTYgQEAKIHg9bmV3IEguZmMoeSxudWxsKQogeC5UTCh5KQogcmV0dXJuIHh9LAotWFk6eworaHE6ewogIl4iOiJhOyIsCi0kaXNYWTp0cnVlLAorJGlzaHE6dHJ1ZSwKIHN0YXRpYzp7TjM6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguaVYoKE1hdGgucmFuZG9tKCkqMHgxMDAwMDAwMDA+Pj4wKSsoTWF0aC5yYW5kb20oKSoweDEwMDAwMDAwMD4+PjApKjQyOTQ5NjcyOTYpfX19fV0sWyJkYXJ0LmpzIiwiZGFydDpqcyIsLFAsewogIl4iOiIiLAogeFo6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyxkLGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBjKGQsZSx0aGlzLEFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhcmd1bWVudHMpKX19KFAuUjQsYSxiKX0sCiBSNDpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoKIGlmKGI9PT0hMCl7ej1bY10KIEMuTm0uRlYoeixkKQotZD16fXJldHVybiBQLndZKEguZUMoYSxQLkYoSi5rbChkLFAuWGwoKSksITAsbnVsbCksUC5UZShudWxsKSkpfSwiJDQiLCJHeCIsOCwwLG51bGwsNDEsNTksMjcsNjBdLAorZD16fXJldHVybiBQLndZKEguZUMoYSxQLkYoSi5rbChkLFAuWGwoKSksITAsbnVsbCksUC5UZShudWxsKSkpfSwiJDQiLCJxSCIsOCwwLG51bGwsNDEsNTksMjcsNjBdLAogRG06ZnVuY3Rpb24oYSxiLGMpe3ZhciB6CiBpZihPYmplY3QuaXNFeHRlbnNpYmxlKGEpKXRyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxiLHt2YWx1ZTpjfSkKIHJldHVybiEwfWNhdGNoKHope0guUnUoeil9cmV0dXJuITF9LApAQCAtMTAxNzAsMTAgKzEwMzgwLDEwIEBACiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzRTQmJnRoaXMuZWg9PT1iLmVofSwKIEVnOmZ1bmN0aW9uKGEpe3JldHVybiBhIGluIHRoaXMuZWh9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHRyeXt6PVN0cmluZyh0aGlzLmVoKQogcmV0dXJuIHp9Y2F0Y2goeSl7SC5SdSh5KQotcmV0dXJuIFAuYS5wcm90b3R5cGUuYnUuY2FsbCh0aGlzLHRoaXMpfX0sCityZXR1cm4gUC5hLnByb3RvdHlwZS5idS5jYWxsKHRoaXMsdGhpcyl9fSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBWNzpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dGhpcy5laAogeT1iPT1udWxsP251bGw6UC5GKEguVk0obmV3IEguQTgoYixQLkVuKCkpLFtudWxsLG51bGxdKSwhMCxudWxsKQpAQCAtMTAxODcsMTAgKzEwMzk3LDEwIEBACiBDLk5tLkZWKHksSC5WTShuZXcgSC5BOChiLFAuRW4oKSksW251bGwsbnVsbF0pKQogeD16LmJpbmQuYXBwbHkoeix5KQogU3RyaW5nKHgpCi1yZXR1cm4gUC5ORChuZXcgeCgpKX0sSFU6ZnVuY3Rpb24oYSl7aWYoYT09bnVsbCl0aHJvdyBILmIoUC51KCJvYmplY3QgY2Fubm90IGJlIGEgbnVtLCBzdHJpbmcsIGJvb2wsIG9yIG51bGwiKSkKK3JldHVybiBQLk5EKG5ldyB4KCkpfSxYWTpmdW5jdGlvbihhKXtpZihhPT1udWxsKXRocm93IEguYihQLnUoIm9iamVjdCBjYW5ub3QgYmUgYSBudW0sIHN0cmluZywgYm9vbCwgb3IgbnVsbCIpKQogcmV0dXJuIFAuTkQoUC53WShhKSl9LGpUOmZ1bmN0aW9uKGEpe3JldHVybiBQLk5EKFAuTTAoYSkpfSxNMDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAuWGIoUC5STihudWxsLG51bGwpKS4kMShhKX19fSwKIFhiOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuYQogaWYoei54NCgwLGEpKXJldHVybiB6LnQoMCxhKQpAQCAtMTAyMTIsNyArMTA0MjIsNyBAQAogUE86ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucVAoYSxudWxsKX0sCiAkaXNyNzp0cnVlLAogc3RhdGljOnttdDpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoUC54WihhLCEwKSl9fX0sCi1Uejp7CitHRDp7CiAiXiI6IldrRjtlaCIsCiB0OmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKHR5cGVvZiBiPT09Im51bWJlciImJmI9PT1DLkNELnl1KGIpKXtpZih0eXBlb2YgYj09PSJudW1iZXIiJiZNYXRoLmZsb29yKGIpPT09Yil6PWI8MHx8Yj49dGhpcy5nQih0aGlzKQpAQCAtMTAyNTUsMjUgKzEwNDY1LDI1IEBACiAkaXNRVjp0cnVlLAogJGFzUVY6bnVsbH0sCiBEVjp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9UC54WihhLCExKQogUC5EbSh6LCQuRHAoKSxhKQogcmV0dXJuIHp9LAogJGlzRUg6dHJ1ZX0sCiBIcDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IHRoaXMuYShhKX0sCiAkaXNFSDp0cnVlfSwKIE56OnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFAucjcoYSl9LAogJGlzRUg6dHJ1ZX0sCiBKZDp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5UeihhKSxbbnVsbF0pfSwKKyJeIjoiVHBaOjEzOyIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSC5WTShuZXcgUC5HRChhKSxbbnVsbF0pfSwKICRpc0VIOnRydWV9LAogUVM6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgUC5FNChhKX0sCiAkaXNFSDp0cnVlfX1dLFsiZGFydC5tYXRoIiwiZGFydDptYXRoIiwsUCx7CiAiXiI6IiIsCkBAIC0xMDMwNSw3ICsxMDUxNSw3IEBACiAiXiI6ImE7IiwKIGoxOmZ1bmN0aW9uKGEpe2lmKGE8PTB8fGE+NDI5NDk2NzI5Nil0aHJvdyBILmIoUC5LUCgibWF4IG11c3QgYmUgaW4gcmFuZ2UgMCA8IG1heCBcdTIyNjQgMl4zMiwgd2FzICIrYSkpCiByZXR1cm4gTWF0aC5yYW5kb20oKSphPj4+MH19LAotdlk6ewora2g6ewogIl4iOiJhO05kLGlpIiwKIGh2OmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcsdix1CiB6PXRoaXMuTmQKQEAgLTEwMzI1LDcgKzEwNTM1LDcgQEAKIHk9dGhpcy5OZAogeD15JWF9d2hpbGUoeS14K2E+PTQyOTQ5NjcyOTYpCiByZXR1cm4geH0sCi1KSzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCittZjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCiB6PUoudTYoYSwwKT8tMTowCiBkb3t5PUouV3goYSkKIHg9eS5pKGEsNDI5NDk2NzI5NSkKQEAgLTEwMzU5LDEyICsxMDU2OSwxMiBAQAogdGhpcy5odigpCiB0aGlzLmh2KCkKIHRoaXMuaHYoKX0sCi1zdGF0aWM6eyJeIjoidGdNLFBaaSxKWVUiLG4yOmZ1bmN0aW9uKGEpe3ZhciB6PW5ldyBQLnZZKDAsMCkKLXouSksoYSkKK3N0YXRpYzp7Il4iOiJ0Z00sUFppLEpZVSIsTmg6ZnVuY3Rpb24oYSl7dmFyIHo9bmV3IFAua2goMCwwKQorei5tZihhKQogcmV0dXJuIHp9fX0sCiBoTDp7CiAiXiI6ImE7eD4seT4iLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlBvaW50KCIrSC5kKHRoaXMueCkrIiwgIitILmQodGhpcy55KSsiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJQb2ludCgiK0guZCh0aGlzLngpKyIsICIrSC5kKHRoaXMueSkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogaWYoYj09bnVsbClyZXR1cm4hMQogaWYoIUoueChiKS4kaXNoTClyZXR1cm4hMQpAQCAtMTA0MTksNyArMTA2MjksNyBAQAogIl4iOiJhOyIsCiBnVDg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0JiKHRoaXMpK3RoaXMuUn0sCiBnUUc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0c2KHRoaXMpK3RoaXMuZmd9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIit0aGlzLmdCYih0aGlzKSsiLCAiK3RoaXMuRzYrIikgIit0aGlzLlIrIiB4ICIrdGhpcy5mZ30sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlJlY3RhbmdsZSAoIit0aGlzLmdCYih0aGlzKSsiLCAiK3RoaXMuRzYrIikgIit0aGlzLlIrIiB4ICIrdGhpcy5mZ30sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xMDQ2MiwyMCArMTA2NzIsMjEgQEAKIHU6ZnVuY3Rpb24oYSxiLGMpe3RoaXMuUnAudSgwLGIsYyl9LAogRlY6ZnVuY3Rpb24oYSxiKXt0aGlzLlJwLkZWKDAsYil9LAogVjE6ZnVuY3Rpb24oYSl7dGhpcy5ScC5WMSgwKX0sCit4NDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlJwLng0KDAsYil9LAogYU46ZnVuY3Rpb24oYSxiKXt0aGlzLlJwLmFOKDAsYil9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlJwLlg1PT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUnAuWDUhPT0wfSwKIGd2YzpmdW5jdGlvbihhKXt2YXIgej10aGlzLlJwCi1yZXR1cm4gSC5WTShuZXcgUC5pNSh6KSxbSC5LcCh6LDApXSl9LAorcmV0dXJuIEguVk0obmV3IFAuaTUoeiksW0guT3EoeiwwKV0pfSwKIGdCOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlJwLlg1fSwKIFJ6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUnAuUnooMCxiKX0sCiBnVVE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5ScAogcmV0dXJuIHouZ1VRKHopfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMuUnApfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzLlJwKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzWjA6dHJ1ZSwKICRhc1owOm51bGx9fV0sWyJkYXJ0LnR5cGVkX2RhdGEuaW1wbGVtZW50YXRpb24iLCJkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YSIsLEgsewogIl4iOiIiLAotaWM6ZnVuY3Rpb24oYSl7YS50b1N0cmluZworbTY6ZnVuY3Rpb24oYSl7YS50b1N0cmluZwogcmV0dXJuIGF9LAogalpOOmZ1bmN0aW9uKGEpe2EudG9TdHJpbmcKIHJldHVybiBhfSwKQEAgLTEwNTgwLDkgKzEwNzkxLDkgQEAKICRhc1FWOmZ1bmN0aW9uKCl7cmV0dXJuW1AuS05dfSwKICRpc0FTOnRydWUsCiAiJSI6IkludDhBcnJheSJ9LAotd2ZGOnsKK3BkOnsKICJeIjoiUGc7IiwKLWdieDpmdW5jdGlvbihhKXtyZXR1cm4gQy5NNX0sCitnYng6ZnVuY3Rpb24oYSl7cmV0dXJuIEMub1p9LAogdDpmdW5jdGlvbihhLGIpe3ZhciB6PWEubGVuZ3RoCiBpZihiPj4+MCE9PWJ8fGI+PXopdGhpcy5KMihhLGIseikKIHJldHVybiBhW2JdfSwKQEAgLTEwNjMxLDcgKzEwODQyLDcgQEAKICIlIjoiQ2FudmFzUGl4ZWxBcnJheXxVaW50OENsYW1wZWRBcnJheSJ9LAogVjY6ewogIl4iOiJQZzsiLAotZ2J4OmZ1bmN0aW9uKGEpe3JldHVybiBDLkhDfSwKK2dieDpmdW5jdGlvbihhKXtyZXR1cm4gQy5Xcn0sCiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gYS5sZW5ndGh9LAogdDpmdW5jdGlvbihhLGIpe3ZhciB6PWEubGVuZ3RoCiBpZihiPj4+MCE9PWJ8fGI+PXopdGhpcy5KMihhLGIseikKQEAgLTEwNzA5LDE3ICsxMDkyMCwxNyBAQAogcmV0dXJufXRocm93IlVuYWJsZSB0byBwcmludCBtZXNzYWdlOiAiK1N0cmluZyhhKX19XSxbImVycm9yX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Vycm9yX3ZpZXcuZGFydCIsLEYsewogIl4iOiIiLAogWlA6ewotIl4iOiJEMTM7UHksQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJEMTM7UHksQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2tjOmZ1bmN0aW9uKGEpe3JldHVybiBhLlB5fSwKIHNrYzpmdW5jdGlvbihhLGIpe2EuUHk9dGhpcy5jdChhLEMueWgsYS5QeSxiKX0sCiBzdGF0aWM6e1l3OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuT0QuWkwoYSkKIEMuT0QuWEkoYSkKQEAgLTEwNzI5LDcgKzEwOTQwLDcgQEAKICRpc2QzOnRydWV9fV0sWyJldmFsX2JveF9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZXZhbF9ib3guZGFydCIsLEwsewogIl4iOiIiLAogbko6ewotIl4iOiJXWnE7YTMsRWssTG4seTQsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJXWnE7YTMsRWssTG4seTQsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2E0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmEzfSwKIHNhNDpmdW5jdGlvbihhLGIpe2EuYTM9dGhpcy5jdChhLEMubWksYS5hMyxiKX0sCiBnZHU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuRWt9LApAQCAtMTA3NDQsNyArMTA5NTUsNyBAQAogej10aGlzLmN0KGEsQy5laCxhLkVrLHopCiBhLkVrPXoKIGlmKEoueEMoeiwiMS1saW5lIikpe3o9Si5KQShhLmEzLCJcbiIsIiAiKQotYS5hMz10aGlzLmN0KGEsQy5taSxhLmEzLHopfX0sIiQzIiwiZ1ZyIiw2LDAsMTExLDEsMTAyLDEwM10sCithLmEzPXRoaXMuY3QoYSxDLm1pLGEuYTMseil9fSwiJDMiLCJnVnIiLDYsMCwxMTIsMSwxMDMsMTA0XSwKIFoxOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgKIEouS3IoYikKIHo9YS5hMwpAQCAtMTA3NTMsOSArMTA5NjQsOSBAQAogeD1SLnRCKHkpCiBKLmtXKHgsImV4cHIiLHopCiBKLlZrKGEueTQsMCx4KQotdGhpcy5MWShhLHopLm1sKG5ldyBMLllXKHgpKX19LCIkMyIsImdabSIsNiwwLDExMSwxLDEwMiwxMDNdLAordGhpcy5MWShhLHopLm1sKG5ldyBMLllXKHgpKX19LCIkMyIsImdabSIsNiwwLDExMiwxLDEwMywxMDRdLAogbzU6W2Z1bmN0aW9uKGEsYil7dmFyIHo9Si5iTihKLmwyKGIpLCJleHByIikKLWEuYTM9dGhpcy5jdChhLEMubWksYS5hMyx6KX0sIiQxIiwiZ0hvIiwyLDAsMTM5LDFdLAorYS5hMz10aGlzLmN0KGEsQy5taSxhLmEzLHopfSwiJDEiLCJnSG8iLDIsMCwxNDEsMV0sCiBzdGF0aWM6e1JwOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej1SLnRCKFtdKQogeT1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKQEAgLTEwNzYzLDI0ICsxMDk3NCwyNCBAQAogeD1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseCxudWxsKSxudWxsLG51bGwpLFt4LG51bGxdKQogYS5Faz0iMS1saW5lIgogYS55ND16Ci1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXkKK2Eub0c9ITEKK2EuWk09eQogYS5aUT14Ci1DLnRULlpMKGEpCi1DLnRULlhJKGEpCitDLkpoLlpMKGEpCitDLkpoLlhJKGEpCiByZXR1cm4gYX19fSwKIFdacTp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFlXOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7Si5rVyh0aGlzLmEsInZhbHVlIixhKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7Si5rVyh0aGlzLmEsInZhbHVlIixhKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImV2YWxfbGlua19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZXZhbF9saW5rLmRhcnQiLCxSLHsKICJeIjoiIiwKIEVnOnsKLSJeIjoiS0FmO2ZlLGwxLGJZLGp2LG95LEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiS0FmO2ZlLGwxLGJZLGp2LG95LEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd2ODpmdW5jdGlvbihhKXtyZXR1cm4gYS5mZX0sCiBzdjg6ZnVuY3Rpb24oYSxiKXthLmZlPXRoaXMuY3QoYSxDLlM0LGEuZmUsYil9LAogZ3BoOmZ1bmN0aW9uKGEpe3JldHVybiBhLmwxfSwKQEAgLTEwNzk3LDggKzExMDA4LDggQEAKIGlmKHo9PT0hMClyZXR1cm4KIGlmKGEuYlkhPW51bGwpe2EuZmU9dGhpcy5jdChhLEMuUzQseiwhMCkKIGEub3k9dGhpcy5jdChhLEMuVVksYS5veSxudWxsKQotdGhpcy5MWShhLGEuanYpLm1sKG5ldyBSLnV2KGEpKS5ZTShuZXcgUi5PdShhKSl9fSwiJDMiLCJnRGYiLDYsMCw4Miw0Niw0Nyw4M10sCi1zdGF0aWM6e05kOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3RoaXMuTFkoYSxhLmp2KS5tbChuZXcgUi5LeihhKSkuWU0obmV3IFIudXYoYSkpfX0sIiQzIiwiZ0RmIiw2LDAsODMsNDYsNDcsODRdLAorc3RhdGljOntPbGE6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQpAQCAtMTA4MDcsNzggKzExMDE4LDc4IEBACiBhLmJZPW51bGwKIGEuanY9IiIKIGEub3k9bnVsbAotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5VRi5aTChhKQotQy5VRi5YSShhKQorQy5xTC5aTChhKQorQy5xTC5YSShhKQogcmV0dXJuIGF9fX0sCiBLQWY6ewogIl4iOiJ4YytQaTsiLAogJGlzZDM6dHJ1ZX0sCi11djp7Ci0iXiI6IlRwOjE0MTthIiwKK0t6OnsKKyJeIjoiVHBaOjE0MzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXoub3k9Si5RNSh6LEMuVVksei5veSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDkyLCJjYWxsIl0sCit6Lm95PUouUTUoeixDLlVZLHoub3ksYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1PdTp7Ci0iXiI6IlRwOjcxO2IiLAordXY6eworIl4iOiJUcFo6NzI7YiIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgej10aGlzLmIKIHouZmU9Si5RNSh6LEMuUzQsei5mZSwhMSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImZpZWxkX3JlZl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZmllbGRfcmVmLmRhcnQiLCxELHsKICJeIjoiIiwKIGk3OnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBzdGF0aWM6e2hTVzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk1DLlpMKGEpCiBDLk1DLlhJKGEpCiByZXR1cm4gYX19fX1dLFsiZmllbGRfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZmllbGRfdmlldy5kYXJ0IiwsQSx7CiAiXiI6IiIsCiBHazp7Ci0iXiI6InB2YTtLVixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InB2YTtLVixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBndDA6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuS1Z9LAogc3QwOmZ1bmN0aW9uKGEsYil7YS5LVj10aGlzLmN0KGEsQy5XUSxhLktWLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5LVikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKLXN0YXRpYzp7bnY6ZnVuY3Rpb24oYSl7dmFyIHoseQorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLktWKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAorc3RhdGljOntjWU86ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5ieS5aTChhKQotQy5ieS5YSShhKQorQy5ENC5aTChhKQorQy5ENC5YSShhKQogcmV0dXJuIGF9fX0sCiBwdmE6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX19XSxbImZsYWdfbGlzdF9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZmxhZ19saXN0LmRhcnQiLCxYLHsKICJeIjoiIiwKLU5yOnsKLSJeIjoiY2RhO0RDLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKK0ozOnsKKyJeIjoiY2RhO0RDLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdwTTpmdW5jdGlvbihhKXtyZXR1cm4gYS5EQ30sCiBzcE06ZnVuY3Rpb24oYSxiKXthLkRDPXRoaXMuY3QoYSxDLk1jLGEuREMsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkRDKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotc3RhdGljOntBazpmdW5jdGlvbihhKXt2YXIgeix5CitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuREMpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitzdGF0aWM6e1RzRjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk1PMC5aTChhKQogQy5NTzAuWEkoYSkKQEAgLTEwODg3LDE3ICsxMTA5OCwxNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBNSjp7Ci0iXiI6IndhYTtaYyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IndhYTtaYyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnSjY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWmN9LAogc0o2OmZ1bmN0aW9uKGEsYil7YS5aYz10aGlzLmN0KGEsQy5PTyxhLlpjLGIpfSwKIHN0YXRpYzp7SWZYOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMubHM2LlpMKGEpCiBDLmxzNi5YSShhKQpAQCAtMTA5MDcsNDIgKzExMTE4LDE5IEBACiAkaXNkMzp0cnVlfX1dLFsiZnVuY3Rpb25fcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuZGFydCIsLFUsewogIl4iOiIiLAogREs6ewotIl4iOiJUNTM7bGgsUXosemcsRnMsQVAsZm4sdFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJUNTM7bGgsQVAsZm4sdFksUGUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1U0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmxofSwKIHNVNDpmdW5jdGlvbihhLGIpe2EubGg9dGhpcy5jdChhLEMuUUssYS5saCxiKX0sCi1hVjpbZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKLVEueEkucHJvdG90eXBlLmFWLmNhbGwodGhpcyxhLGIpCi10aGlzLmN0KGEsQy5haywwLDEpCi10aGlzLmN0KGEsQy5RbCwwLDEpCi16PWEudFkKLXk9eiE9bnVsbAotaWYoeSl7eD1KLlU2KHopCi14PSFKLnhDKHgudCh6LCJraW5kIiksIkNvbGxlY3RlZCIpJiYhSi54Qyh4LnQoeiwia2luZCIpLCJOYXRpdmUiKSYmIUoueEMoeC50KHosImtpbmQiKSwiVGFnIikmJiFKLnhDKHgudCh6LCJraW5kIiksIlJldXNlZCIpfWVsc2UgeD0hMQotYS5Gcz10aGlzLmN0KGEsQy5hMCxhLkZzLHgpCi14PXkmJkouVVEoeiwicGFyZW50IikhPW51bGwKLWEuUXo9dGhpcy5jdChhLEMuYWssYS5Reix4KQotaWYoeSl7eT1KLlU2KHopCi15PXkudCh6LCJvd25lciIpIT1udWxsJiZKLnhDKHkudCh6LCJvd25lciIpLmd6UygpLCJDbGFzcyIpfWVsc2UgeT0hMQotYS56Zz10aGlzLmN0KGEsQy5RbCxhLnpnLHkpfSwiJDEiLCJnTGUiLDIsMCwyMCw1N10sCi1nU1k6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUXp9LAotc1NZOmZ1bmN0aW9uKGEsYil7YS5Rej10aGlzLmN0KGEsQy5hayxhLlF6LGIpfSwKLWdFNzpmdW5jdGlvbihhKXtyZXR1cm4gYS56Z30sCi1zRTc6ZnVuY3Rpb24oYSxiKXthLnpnPXRoaXMuY3QoYSxDLlFsLGEuemcsYil9LAotZ25pOmZ1bmN0aW9uKGEpe3JldHVybiBhLkZzfSwKLXNuaTpmdW5jdGlvbihhLGIpe2EuRnM9dGhpcy5jdChhLEMuYTAsYS5GcyxiKX0sCiBzdGF0aWM6e3Y5OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEubGg9ITAKLWEuUXo9ITEKLWEuemc9ITEKLWEuRnM9ITEKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuWG8uWkwoYSkKIEMuWG8uWEkoYSkKQEAgLTEwOTUyLDc1ICsxMTE0MCwyOSBAQAogJGlzZDM6dHJ1ZX19XSxbImZ1bmN0aW9uX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuZGFydCIsLE4sewogIl4iOiIiLAogQlM6ewotIl4iOiJWNDtQNixTcSxaWixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY5O1A2LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdpZzpmdW5jdGlvbihhKXtyZXR1cm4gYS5QNn0sCiBzaWc6ZnVuY3Rpb24oYSxiKXthLlA2PXRoaXMuY3QoYSxDLm5mLGEuUDYsYil9LAotZ1V4OmZ1bmN0aW9uKGEpe3JldHVybiBhLlNxfSwKLXNVeDpmdW5jdGlvbihhLGIpe2EuU3E9dGhpcy5jdChhLEMuQU8sYS5TcSxiKX0sCi1nZlk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWlp9LAotc2ZZOmZ1bmN0aW9uKGEsYil7YS5aWj10aGlzLmN0KGEsQy5MYyxhLlpaLGIpfSwKLVc3OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4Ci16PWIhPW51bGwKLXk9eiYmSi5VUShiLCJwYXJlbnQiKSE9bnVsbD9KLlVRKGIsInBhcmVudCIpOm51bGwKLWlmKHkhPW51bGwpcmV0dXJuIHRoaXMuVzcoYSx5KSsiLiIrSC5kKEouVVEoYiwidXNlcl9uYW1lIikpCi1pZih6KXt6PUouVTYoYikKLXo9ei50KGIsIm93bmVyIikhPW51bGwmJkoueEMoei50KGIsIm93bmVyIikuZ3pTKCksIkNsYXNzIil9ZWxzZSB6PSExCi14PXo/Si5VUShiLCJvd25lciIpOm51bGwKLWlmKHghPW51bGwpcmV0dXJuIEguZChKLlVRKHgsInVzZXJfbmFtZSIpKSsiLiIrSC5kKEouVVEoYiwidXNlcl9uYW1lIikpCi1yZXR1cm4gSC5kKEouVVEoYiwidXNlcl9uYW1lIikpfSwKLWpDOltmdW5jdGlvbihhLGIpe3ZhciB6LHkKLXRoaXMuY3QoYSxDLkFPLDAsMSkKLXRoaXMuY3QoYSxDLkxjLDAsMSkKLXo9dGhpcy5XNyhhLGEuUDYpCi1hLlNxPXRoaXMuY3QoYSxDLkFPLGEuU3EseikKLXo9Si5VUShhLlA2LCJraW5kIikKLXk9YS5aWgotc3dpdGNoKHope2Nhc2Uia1JlZ3VsYXJGdW5jdGlvbiI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrQ2xvc3VyZUZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImNsb3N1cmUgZnVuY3Rpb24iKQotYnJlYWsKLWNhc2Uia1NpZ25hdHVyZUZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksInNpZ25hdHVyZSBmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrR2V0dGVyRnVuY3Rpb24iOmEuWlo9dGhpcy5jdChhLEMuTGMseSwiZ2V0dGVyIGZ1bmN0aW9uIikKLWJyZWFrCi1jYXNlImtTZXR0ZXJGdW5jdGlvbiI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJzZXR0ZXIgZnVuY3Rpb24iKQotYnJlYWsKLWNhc2Uia0NvbnN0cnVjdG9yIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImNvbnN0cnVjdG9yIikKLWJyZWFrCi1jYXNlImtJbXBsaWNpdEdldHRlckZ1bmN0aW9uIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksImltcGxpY2l0IGdldHRlciBmdW5jdGlvbiIpCi1icmVhawotY2FzZSJrSW1wbGljaXRTZXR0ZXJGdW5jdGlvbiI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJpbXBsaWNpdCBzZXR0ZXIgZnVuY3Rpb24iKQotYnJlYWsKLWNhc2Uia1N0YXRpY0luaXRpYWxpemVyIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksInN0YXRpYyBpbml0aWFsaXplciIpCi1icmVhawotY2FzZSJrTWV0aG9kRXh0cmFjdG9yIjphLlpaPXRoaXMuY3QoYSxDLkxjLHksIm1ldGhvZCBleHRyYWN0b3IiKQotYnJlYWsKLWNhc2Uia05vU3VjaE1ldGhvZERpc3BhdGNoZXIiOmEuWlo9dGhpcy5jdChhLEMuTGMseSwibm9TdWNoTWV0aG9kIGRpc3BhdGNoZXIiKQotYnJlYWsKLWNhc2Uia0ludm9rZUZpZWxkRGlzcGF0Y2hlciI6YS5aWj10aGlzLmN0KGEsQy5MYyx5LCJpbnZva2UgZmllbGQgZGlzcGF0Y2hlciIpCi1icmVhawotZGVmYXVsdDphLlpaPXRoaXMuY3QoYSxDLkxjLHksIlVOS05PV04iKQotYnJlYWt9fSwiJDEiLCJnbnAiLDIsMCwyMCw1N10sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuUDYpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuUDYpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e256OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuUEo4LlpMKGEpCiBDLlBKOC5YSShhKQogcmV0dXJuIGF9fX0sCi1WNDp7CitWOTp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfX1dLFsiaGVhcF9tYXBfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2hlYXBfbWFwLmRhcnQiLCxPLHsKICJeIjoiIiwKIEh6OnsKICJeIjoiYTt6RSxtUyIsCi1QWTpbZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE8uSHoodGhpcy56RSx0aGlzLm1TKzQpfSwiJDAiLCJnYXciLDAsMCwxNDJdLAorUFk6W2Z1bmN0aW9uKCl7cmV0dXJuIG5ldyBPLkh6KHRoaXMuekUsdGhpcy5tUys0KX0sIiQwIiwiZ2F3IiwwLDAsMTQ0XSwKIGd2SDpmdW5jdGlvbihhKXtyZXR1cm4gQy5DRC5jVSh0aGlzLm1TLDQpfSwKIHN0YXRpYzp7Il4iOiJRMHoiLHg2OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CiB6PWIuZ3koYikKQEAgLTExMDMwLDEwICsxMTE3MiwxMCBAQAogeD1iLmd4KGIpCiBpZih0eXBlb2YgeCE9PSJudW1iZXIiKXJldHVybiBILnMoeCkKIHJldHVybiBuZXcgTy5IeihhLCh6KnkreCkqNCl9fX0sCi1rajp7Cit4Mjp7CiAiXiI6ImE7WXU8LHRMIn0sCiBWYjp7Ci0iXiI6IlYxMDtoaSxBbixkVyxyTSxBaixVTCxQQSxvaixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxMDtoaSxBbixkVyxyTSxBaixVTCxQQSxvaixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBncGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUEF9LAogc3BmOmZ1bmN0aW9uKGEsYil7YS5QQT10aGlzLmN0KGEsQy5QTSxhLlBBLGIpfSwKIGd5dzpmdW5jdGlvbihhKXtyZXR1cm4gYS5van0sCkBAIC0xMTA0MywxNCArMTExODUsMTQgQEAKIHo9KGEuc2hhZG93Um9vdHx8YS53ZWJraXRTaGFkb3dSb290KS5xdWVyeVNlbGVjdG9yKCIjZnJhZ21lbnRhdGlvbiIpCiBhLmhpPXoKIHo9Si5ROSh6KQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ21vKGEpKSx6LlNnKSxbSC5LcCh6LDApXSkuWnooKQorSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ21vKGEpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej1KLkdXKGEuaGkpCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nSmIoYSkpLHouU2cpLFtILktwKHosMCldKS5aeigpfSwKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdKYihhKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCl9LAogTFY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIGZvcih6PUoubVkoYikseT0wO3ouRygpOyl7eD16LmxvCiBpZih0eXBlb2YgeCE9PSJudW1iZXIiKXJldHVybiBILnMoeCkKIHk9eSoyNTYreH1yZXR1cm4geX0sCi1mSjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgej1KLnVIKGMsIkAiKQorZko6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9Si5JdChjLCJAIikKIGlmKDA+PXoubGVuZ3RoKXJldHVybiBILmUoeiwwKQogYS5VTC51KDAsYix6WzBdKQogYS5yTS51KDAsYixkKQpAQCAtMTEwNTgsMTYgKzExMjAwLDE2IEBACiBlRDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1LHQscyxyCiBmb3Ioej1KLm1ZKEouVVEoYiwibWVtYmVycyIpKSx5PWEuVUwseD1hLnJNLHc9YS5Bajt6LkcoKTspe3Y9ei5nbCgpCiBpZighSi54KHYpLiRpc2R5KXtOLlFNKCIiKS5UbyhILmQodikpCi1jb250aW51ZX11PUguQlUoQy5ObS5nclooSi51SCh2LnIwLCIvIikpLG51bGwsbnVsbCkKLXQ9dT09bnVsbD9DLnByOlAubjIodSkKK2NvbnRpbnVlfXU9SC5CVShDLk5tLmdyWihKLkl0KHYucjAsIi8iKSksbnVsbCxudWxsKQordD11PT1udWxsP0MucHI6UC5OaCh1KQogcz1bdC5qMSgxMjgpLHQuajEoMTI4KSx0LmoxKDEyOCksMjU1XQotcj1KLnVIKHYuYk4sIkAiKQorcj1KLkl0KHYuYk4sIkAiKQogaWYoMD49ci5sZW5ndGgpcmV0dXJuIEguZShyLDApCiB5LnUoMCx1LHJbMF0pCiB4LnUoMCx1LHMpCiB3LnUoMCx0aGlzLkxWKGEscyksdSl9dGhpcy5mSihhLGMsIkZyZWUiLCQuUjIoKSkKIHRoaXMuZkooYSwwLCIiLCQuUWcoKSl9LAotb246ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbgorV0U6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbgogej1hLmRXCiB5PUouRE8oYS5BbikKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIHouVSgpCkBAIC0xMTA5OCwxOSArMTEyNDAsMTkgQEAKIGJyZWFrfW8rPTJ9ej1ILkJVKHoudChzLCJvYmplY3Rfc3RhcnQiKSxudWxsLG51bGwpCiB5PUouVVEoYS5vaiwidW5pdF9zaXplX2J5dGVzIikKIGlmKHR5cGVvZiB5IT09Im51bWJlciIpcmV0dXJuIEgucyh5KQotcmV0dXJuIG5ldyBPLmtqKEouZXcoeix1KnkpLEoudlgocCxKLlVRKGEub2osInVuaXRfc2l6ZV9ieXRlcyIpKSl9LAorcmV0dXJuIG5ldyBPLngyKEouZXcoeix1KnkpLEoudlgocCxKLlVRKGEub2osInVuaXRfc2l6ZV9ieXRlcyIpKSl9LAogVTg6W2Z1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgogej1KLlJFKGIpCi15PXRoaXMub24oYSx6LmdENyhiKSkKLXg9SC5kKHkudEwpKyJCIEAgMHgiK0ouY1IoeS5ZdSwxNikKK3k9dGhpcy5XRShhLHouZ0Q3KGIpKQoreD1ILmQoeS50TCkrIkIgQCAweCIrSi51MSh5Lll1LDE2KQogej16LmdENyhiKQogej1PLng2KGEuQW4seikKIHc9ei5tUwogdj1hLlVMLnQoMCxhLkFqLnQoMCx0aGlzLkxWKGEsQy55cC5NdShKLlFkKHouekUpLHcsdys0KSkpKQogej1KLnhDKHYsIiIpPyItIjpILmQodikrIiAiK3gKLWEuUEE9dGhpcy5jdChhLEMuUE0sYS5QQSx6KX0sIiQxIiwiZ21vIiwyLDAsMTM5LDJdLAotWDc6W2Z1bmN0aW9uKGEsYil7dmFyIHo9Si5jUih0aGlzLm9uKGEsSi5vcChiKSkuWXUsMTYpCi13aW5kb3cubG9jYXRpb24uaGFzaD0iLyIrSC5kKEouRHMoSi5hVChhLm9qKSkpKyIvYWRkcmVzcy8iK3p9LCIkMSIsImdKYiIsMiwwLDEzOSwyXSwKK2EuUEE9dGhpcy5jdChhLEMuUE0sYS5QQSx6KX0sIiQxIiwiZ21vIiwyLDAsMTQxLDJdLAorWDc6W2Z1bmN0aW9uKGEsYil7dmFyIHo9Si51MSh0aGlzLldFKGEsSi5vcChiKSkuWXUsMTYpCit3aW5kb3cubG9jYXRpb24uaGFzaD0iLyIrSC5kKEouRHMoSi5hVChhLm9qKSkpKyIvYWRkcmVzcy8iK3p9LCIkMSIsImdKYiIsMiwwLDE0MSwyXSwKIE15OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9YS5vagogaWYoej09bnVsbHx8YS5oaT09bnVsbClyZXR1cm4KQEAgLTExMTI2LDcgKzExMjY4LDcgQEAKIHc9Si5xOCh5KQogaWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCiB2PVAuSih6KncsNjAwMCkKLXc9UC5KMyhKLlZmKGEuaGkpLmNyZWF0ZUltYWdlRGF0YSh4LHYpKQordz1QLmY5KEouVmYoYS5oaSkuY3JlYXRlSW1hZ2VEYXRhKHgsdikpCiBhLkFuPXcKIEouTm8oYS5oaSxKLkRPKHcpKQogSi5PRShhLmhpLEouT0IoYS5BbikpCkBAIC0xMTE3OSw5ICsxMTMyMSw5IEBACiB4PWEuQW4KIEoua1ooeSx4LDAsMCwwLHcsSi5ETyh4KSx2KQogUC5JdyhuZXcgTy5SNShhLGIpLG51bGwpfSwKLXBBOltmdW5jdGlvbihhLGIpe3ZhciB6PWEub2oKK1NLOltmdW5jdGlvbihhLGIpe3ZhciB6PWEub2oKIGlmKHo9PW51bGwpcmV0dXJuCi1KLmFUKHopLmN2KCJoZWFwbWFwIikubWwobmV3IE8uYUcoYSkpLk9BKG5ldyBPLno0KCkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitKLmFUKHopLmN2KCJoZWFwbWFwIikubWwobmV3IE8uYUcoYSkpLk9BKG5ldyBPLno0KCkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBZUzc6W2Z1bmN0aW9uKGEsYil7UC5JdyhuZXcgTy5vYyhhKSxudWxsKX0sIiQxIiwiZ1IyIiwyLDAsMjAsNTddLAogc3RhdGljOnsiXiI6Im5LLE9zLFNvVCxXQk8iLHBuOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9UC5GbChudWxsLG51bGwpCkBAIC0xMTE5MywxMCArMTEzMzUsMTAgQEAKIGEuck09egogYS5Baj15CiBhLlVMPXgKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9dworYS5vRz0hMQorYS5aTT13CiBhLlpRPXYKIEMuQ3MuWkwoYSkKIEMuQ3MuWEkoYSkKQEAgLTExMjA1LDIwICsxMTM0NywyMCBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBSNTp7Ci0iXiI6IlRwOjcxO2EsYiIsCisiXiI6IlRwWjo3MjthLGIiLAogJDA6ZnVuY3Rpb24oKXtKLk1VKHRoaXMuYSx0aGlzLmIrMSl9LAogJGlzRUg6dHJ1ZX0sCiBhRzp7Ci0iXiI6IlRwOjExMDthIiwKKyJeIjoiVHBaOjExMTthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXoub2o9Si5RNSh6LEMuUUgsei5vaixhKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MywiY2FsbCJdLAorei5vaj1KLlE1KHosQy5RSCx6Lm9qLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQ1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHo0OnsKLSJeIjoiVHA6Nzk7IiwKLSQyOltmdW5jdGlvbihhLGIpe04uUU0oIiIpLlRvKEguZChhKSsiICIrSC5kKGIpKX0sIiQyIixudWxsLDQsMCxudWxsLDEsMTQ0LCJjYWxsIl0sCisiXiI6IlRwWjo4MDsiLAorJDI6W2Z1bmN0aW9uKGEsYil7Ti5RTSgiIikuVG8oSC5kKGEpKyIgIitILmQoYikpfSwiJDIiLG51bGwsNCwwLG51bGwsMSwxNDYsImNhbGwiXSwKICRpc0VIOnRydWV9LAogb2M6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6ZnVuY3Rpb24oKXtKLnZQKHRoaXMuYSl9LAogJGlzRUg6dHJ1ZX19XSxbImhlYXBfcHJvZmlsZV9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaGVhcF9wcm9maWxlLmRhcnQiLCxLLHsKICJeIjoiIiwKQEAgLTExMjI3LDkgKzExMzY5LDkgQEAKIGVFOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PT0wKXt6PXRoaXMudnAKIGlmKGE+Pj4wIT09YXx8YT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCi1yZXR1cm4gSi5PNihKLlVRKEouVFAoelthXSksYikpfXJldHVybiBHLmxnLnByb3RvdHlwZS5lRS5jYWxsKHRoaXMsYSxiKX19LAorcmV0dXJuIEouTzYoSi5VUShKLlU4byh6W2FdKSxiKSl9cmV0dXJuIEcubGcucHJvdG90eXBlLmVFLmNhbGwodGhpcyxhLGIpfX0sCiBMeTp7Ci0iXiI6IlYxMTtNRix1WSxHUSxJOCxPYyxHTSxuYyxwcCxPbCxTayxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxMTtNRix1WSxHUSxJOCxPYyxHTSxuYyxwcCxPbCxTayxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnWXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuTUZ9LAogc1l0OmZ1bmN0aW9uKGEsYil7YS5NRj10aGlzLmN0KGEsQy5UTixhLk1GLGIpfSwKIGdjSDpmdW5jdGlvbihhKXtyZXR1cm4gYS51WX0sCkBAIC0xMTI3MSw3ICsxMTQxMyw3IEBACiBzPXkuZ3hRKCkuZ2JpKCkud2YKIHI9eS5neFEoKS5nbCgpLnJUCiBxPXkuZ3hRKCkuZ2woKS53ZgotSi5KcihhLm5jLG5ldyBHLk5pKFt5LCIiLHgsdyx2LHUsIiIsdCxzLHIscV0pKX1KLnRPKGEubmMpfSwKK0ouZkQoYS5uYyxuZXcgRy5OaShbeSwiIix4LHcsdix1LCIiLHQscyxyLHFdKSl9Si50TyhhLm5jKX0sCiBFNDpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1CiB6PUouVVEoSi5UWShhLm5jKSxjKQogeT1KLlJFKGIpCkBAIC0xMTMyMiwxNyArMTE0NjQsMTcgQEAKIGlmKHo9PW51bGw/eSE9bnVsbDp6IT09eSl7eC5zeHAoeSkKIGEubmMuc1QzKCEwKX1lbHNlIHguc1QzKCF4LmdUMygpKQogSi50TyhhLm5jKQotdGhpcy5KaChhKX19LCIkMyIsImdRcSIsNiwwLDEwMSwxLDEwMiwxMDNdLAotcEE6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5PbAordGhpcy5KaChhKX19LCIkMyIsImdRcSIsNiwwLDEwMiwxLDEwMywxMDRdLAorU0s6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5PbAogaWYoej09bnVsbClyZXR1cm4KLUouYVQoeikuY3YoIi9hbGxvY2F0aW9ucHJvZmlsZSIpLm1sKHRoaXMuZ0x2KGEpKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorSi5hVCh6KS5jdigiL2FsbG9jYXRpb25wcm9maWxlIikubWwodGhpcy5nTHYoYSkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiB6VDpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLk9sCiBpZih6PT1udWxsKXJldHVybgotSi5hVCh6KS5jdigiL2FsbG9jYXRpb25wcm9maWxlP2djPWZ1bGwiKS5tbCh0aGlzLmdMdihhKSkuWU0oYil9LCIkMSIsImd5VyIsMiwwLDIwLDk4XSwKK0ouYVQoeikuY3YoIi9hbGxvY2F0aW9ucHJvZmlsZT9nYz1mdWxsIikubWwodGhpcy5nTHYoYSkpLllNKGIpfSwiJDEiLCJneVciLDIsMCwyMCw5OV0sCiBlSjpbZnVuY3Rpb24oYSxiKXt2YXIgej1hLk9sCiBpZih6PT1udWxsKXJldHVybgotSi5hVCh6KS5jdigiL2FsbG9jYXRpb25wcm9maWxlP3Jlc2V0PXRydWUiKS5tbCh0aGlzLmdMdihhKSkuWU0oYil9LCIkMSIsImdOYiIsMiwwLDIwLDk4XSwKLWh6OltmdW5jdGlvbihhLGIpe2EuT2w9dGhpcy5jdChhLEMudmIsYS5PbCxiKX0sIiQxIiwiZ0x2IiwyLDAsMTQ1LDE0Nl0sCitKLmFUKHopLmN2KCIvYWxsb2NhdGlvbnByb2ZpbGU/cmVzZXQ9dHJ1ZSIpLm1sKHRoaXMuZ0x2KGEpKS5ZTShiKX0sIiQxIiwiZ05iIiwyLDAsMjAsOTldLAoraHo6W2Z1bmN0aW9uKGEsYil7YS5PbD10aGlzLmN0KGEsQy52YixhLk9sLGIpfSwiJDEiLCJnTHYiLDIsMCwxNDcsMTQ4XSwKIG4xOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIHo9YS5PbAogaWYoej09bnVsbClyZXR1cm4KQEAgLTExMzUyLDE5ICsxMTQ5NCwxOSBAQAogej16LktKCiB2PVtdCiBDLk5tLkZWKHYsQy5ObS5leihbIlVzZWQiLHddLFAuRW4oKSkpCi16LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLlR6KHYpLFtudWxsXSldKQorei5WNygiYWRkUm93IixbSC5WTShuZXcgUC5HRCh2KSxbbnVsbF0pXSkKIHY9YS5HUQotej1KLmJJKHguZ1VZKCkuZ0NzKCkseC5nVVkoKS5nU1UoKSkKK3o9Si5Ibih4LmdVWSgpLmdDcygpLHguZ1VZKCkuZ1NVKCkpCiB2PXYuS0oKIHc9W10KIEMuTm0uRlYodyxDLk5tLmV6KFsiRnJlZSIsel0sUC5FbigpKSkKLXYuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHoodyksW251bGxdKV0pCit2LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHcpLFtudWxsXSldKQogdz1hLkdRCiB2PXguZ1VZKCkuZ01YKCkKIHc9dy5LSgogej1bXQogQy5ObS5GVih6LEMuTm0uZXooWyJFeHRlcm5hbCIsdl0sUC5FbigpKSkKLXcuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHooeiksW251bGxdKV0pCit3LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHopLFtudWxsXSldKQogej1hLk9jLktKCiB6LlY3KCJyZW1vdmVSb3dzIixbMCx6Lm5RKCJnZXROdW1iZXJPZlJvd3MiKV0pCiB6PWEuT2MKQEAgLTExMzcyLDE5ICsxMTUxNCwxOSBAQAogej16LktKCiB2PVtdCiBDLk5tLkZWKHYsQy5ObS5leihbIlVzZWQiLHddLFAuRW4oKSkpCi16LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLlR6KHYpLFtudWxsXSldKQorei5WNygiYWRkUm93IixbSC5WTShuZXcgUC5HRCh2KSxbbnVsbF0pXSkKIHY9YS5PYwotej1KLmJJKHguZ3hRKCkuZ0NzKCkseC5neFEoKS5nU1UoKSkKK3o9Si5Ibih4Lmd4USgpLmdDcygpLHguZ3hRKCkuZ1NVKCkpCiB2PXYuS0oKIHc9W10KIEMuTm0uRlYodyxDLk5tLmV6KFsiRnJlZSIsel0sUC5FbigpKSkKLXYuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHoodyksW251bGxdKV0pCit2LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHcpLFtudWxsXSldKQogdz1hLk9jCiB2PXguZ3hRKCkuZ01YKCkKIHc9dy5LSgogej1bXQogQy5ObS5GVih6LEMuTm0uZXooWyJFeHRlcm5hbCIsdl0sUC5FbigpKSkKLXcuVjcoImFkZFJvdyIsW0guVk0obmV3IFAuVHooeiksW251bGxdKV0pCit3LlY3KCJhZGRSb3ciLFtILlZNKG5ldyBQLkdEKHopLFtudWxsXSldKQogdGhpcy5ZYShhKQogdGhpcy5ZeihhKQogdGhpcy5KaChhKQpAQCAtMTEzOTgsMTcgKzExNTQwLDE3IEBACiBpZih6PT1udWxsKXJldHVybiIiCiB5PUouUkUoeikKIHg9Yj09PSEwP3kuZ29kKHopLmdVWSgpOnkuZ29kKHopLmd4USgpCi1yZXR1cm4gQy5DRC5TeShKLlg5KEoudlgoeC5ncHkoKSwxMDAwKSx4LmdZaygpKSwyKSsiIG1zIn0sIiQxIiwiZ09kIiwyLDAsMTQ3LDE0OF0sCityZXR1cm4gQy5DRC5TeShKLlg5KEoudlgoeC5ncHkoKSwxMDAwKSx4LmdZaygpKSwyKSsiIG1zIn0sIiQxIiwiZ09kIiwyLDAsMTQ5LDE1MF0sCiB1VzpbZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PWEuT2wKIGlmKHo9PW51bGwpcmV0dXJuIiIKIHk9Si5SRSh6KQotcmV0dXJuIEouQUcoKGI9PT0hMD95LmdvZCh6KS5nVVkoKTp5LmdvZCh6KS5neFEoKSkuZ1lrKCkpfSwiJDEiLCJnSk4iLDIsMCwxNDcsMTQ4XSwKK3JldHVybiBKLkFHKChiPT09ITA/eS5nb2QoeikuZ1VZKCk6eS5nb2QoeikuZ3hRKCkpLmdZaygpKX0sIiQxIiwiZ0pOIiwyLDAsMTQ5LDE1MF0sCiBGOTpbZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB6PWEuT2wKIGlmKHo9PW51bGwpcmV0dXJuIiIKIHk9Si5SRSh6KQotcmV0dXJuIEoud0YoKGI9PT0hMD95LmdvZCh6KS5nVVkoKTp5LmdvZCh6KS5neFEoKSkuZ3B5KCksMikrIiBzZWNzIn0sIiQxIiwiZ29OIiwyLDAsMTQ3LDE0OF0sCityZXR1cm4gSi53RigoYj09PSEwP3kuZ29kKHopLmdVWSgpOnkuZ29kKHopLmd4USgpKS5ncHkoKSwyKSsiIHNlY3MifSwiJDEiLCJnb04iLDIsMCwxNDksMTUwXSwKIFp5OmZ1bmN0aW9uKGEpe3ZhciB6PVAuelYoSi5VUSgkLkJZLCJEYXRhVGFibGUiKSxudWxsKQogYS5HUT1uZXcgRy5LZih6KQogei5WNygiYWRkQ29sdW1uIixbInN0cmluZyIsIlR5cGUiXSkKQEAgLTExNDE4LDcgKzExNTYwLDcgQEAKIHouVjcoImFkZENvbHVtbiIsWyJzdHJpbmciLCJUeXBlIl0pCiBhLk9jLktKLlY3KCJhZGRDb2x1bW4iLFsibnVtYmVyIiwiU2l6ZSJdKQogej1ILlZNKFtdLFtHLk5pXSkKLXo9dGhpcy5jdChhLEMua0csYS5uYyxuZXcgSy5VQyhbbmV3IEcuS3QoIkNsYXNzIixHLmppKCkpLG5ldyBHLkt0KCIiLEcuamkoKSksbmV3IEcuS3QoIkFjY3VtdWxhdGVkIFNpemUgKE5ldykiLEcucDAoKSksbmV3IEcuS3QoIkFjY3VtdWxhdGVkIEluc3RhbmNlcyIsRy5raCgpKSxuZXcgRy5LdCgiQ3VycmVudCBTaXplIixHLnAwKCkpLG5ldyBHLkt0KCJDdXJyZW50IEluc3RhbmNlcyIsRy5raCgpKSxuZXcgRy5LdCgiIixHLmppKCkpLG5ldyBHLkt0KCJBY2N1bXVsYXRvciBTaXplIChPbGQpIixHLnAwKCkpLG5ldyBHLkt0KCJBY2N1bXVsYXRvciBJbnN0YW5jZXMiLEcua2goKSksbmV3IEcuS3QoIkN1cnJlbnQgU2l6ZSIsRy5wMCgpKSxuZXcgRy5LdCgiQ3VycmVudCBJbnN0YW5jZXMiLEcua2goKSldLHosW10sMCwhMCxudWxsLG51bGwpKQorej10aGlzLmN0KGEsQy5rRyxhLm5jLG5ldyBLLlVDKFtuZXcgRy5LdCgiQ2xhc3MiLEcuamkoKSksbmV3IEcuS3QoIiIsRy5qaSgpKSxuZXcgRy5LdCgiQWNjdW11bGF0ZWQgU2l6ZSAoTmV3KSIsRy5wMCgpKSxuZXcgRy5LdCgiQWNjdW11bGF0ZWQgSW5zdGFuY2VzIixHLnhLKCkpLG5ldyBHLkt0KCJDdXJyZW50IFNpemUiLEcucDAoKSksbmV3IEcuS3QoIkN1cnJlbnQgSW5zdGFuY2VzIixHLnhLKCkpLG5ldyBHLkt0KCIiLEcuamkoKSksbmV3IEcuS3QoIkFjY3VtdWxhdG9yIFNpemUgKE9sZCkiLEcucDAoKSksbmV3IEcuS3QoIkFjY3VtdWxhdG9yIEluc3RhbmNlcyIsRy54SygpKSxuZXcgRy5LdCgiQ3VycmVudCBTaXplIixHLnAwKCkpLG5ldyBHLkt0KCJDdXJyZW50IEluc3RhbmNlcyIsRy54SygpKV0seixbXSwwLCEwLG51bGwsbnVsbCkpCiBhLm5jPXoKIHouc3hwKDIpfSwKIHN0YXRpYzp7VXQ6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtMTE0MjcsMTAgKzExNTY5LDEwIEBACiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLk1GPSItLS0iCiBhLnVZPSItLS0iCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlZjLlpMKGEpCiBDLlZjLlhJKGEpCkBAIC0xMTQ0Niw4ICsxMTU4OCw4IEBACiBuZXcgUC51UygpLiQwKCkKIHJldHVybiB5fSwKIG83OmZ1bmN0aW9uKGEsYil7dmFyIHo9W10KLXJldHVybiBuZXcgUC54TChiLG5ldyBQLkNBKFtdLHopLG5ldyBQLnRpKHopLG5ldyBQLktDKHopKS4kMShhKX0sCi1KMzpmdW5jdGlvbihhKXt2YXIgeix5CityZXR1cm4gbmV3IFAueEwoYixuZXcgUC5DQShbXSx6KSxuZXcgUC5ENih6KSxuZXcgUC5LQyh6KSkuJDEoYSl9LAorZjk6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1KLngoYSkKIGlmKCEhei4kaXNTZyl7eT16LmdSbihhKQogaWYoeS5jb25zdHJ1Y3Rvcj09PUFycmF5KWlmKHR5cGVvZiBDYW52YXNQaXhlbEFycmF5IT09InVuZGVmaW5lZCIpe3kuY29uc3RydWN0b3I9Q2FudmFzUGl4ZWxBcnJheQpAQCAtMTE0NjAsNyArMTE2MDIsNyBAQAogJC5Rej16fXo9eiE9PSEwJiZKLk5UKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50LCJXZWJLaXQiLDApCiAkLlI2PXp9cmV0dXJuIHp9LAogT1c6ewotIl4iOiJUcDo0ODtiLGMiLAorIl4iOiJUcFo6NDg7YixjIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej10aGlzLmIKIHk9ei5sZW5ndGgKQEAgLTExNDcwLDIzICsxMTYxMiwyMyBAQAogcmV0dXJuIHl9LAogJGlzRUg6dHJ1ZX0sCiByRzp7Ci0iXiI6IlRwOjE0OTtkIiwKKyJeIjoiVHBaOjE1MTtkIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuZAogaWYoYT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCiByZXR1cm4gelthXX0sCiAkaXNFSDp0cnVlfSwKIGZoOnsKLSJeIjoiVHA6MTUwO2UiLAorIl4iOiJUcFo6MTUyO2UiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmUKIGlmKGE+PXoubGVuZ3RoKXJldHVybiBILmUoeixhKQogelthXT1ifSwKICRpc0VIOnRydWV9LAogdVM6ewotIl4iOiJUcDo3MTsiLAorIl4iOiJUcFo6NzI7IiwKICQwOmZ1bmN0aW9uKCl7fSwKICRpc0VIOnRydWV9LAogVG06ewotIl4iOiJUcDoxMztmLFVJLGJLIiwKKyJeIjoiVHBaOjEzO2YsVUksYksiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiB6PXt9CiBpZihhPT1udWxsKXJldHVybiBhCkBAIC0xMTUyMCwxMSArMTE2NjIsMTEgQEAKIHdbdV09en1yZXR1cm4gd310aHJvdyBILmIoUC5TWSgic3RydWN0dXJlZCBjbG9uZSBvZiBvdGhlciB0eXBlIikpfSwKICRpc0VIOnRydWV9LAogaWI6ewotIl4iOiJUcDo3OTthLEdxIiwKLSQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS5hW2FdPXRoaXMuR3EuJDEoYil9LCIkMiIsbnVsbCw0LDAsbnVsbCw3NywyMSwiY2FsbCJdLAorIl4iOiJUcFo6ODA7YSxHcSIsCiskMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEuYVthXT10aGlzLkdxLiQxKGIpfSwiJDIiLG51bGwsNCwwLG51bGwsNzgsMjEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQ0E6ewotIl4iOiJUcDo0ODthLGIiLAorIl4iOiJUcFo6NDg7YSxiIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuYQogeT16Lmxlbmd0aApAQCAtMTE1MzMsMjAgKzExNjc1LDIwIEBACiB0aGlzLmIucHVzaChudWxsKQogcmV0dXJuIHl9LAogJGlzRUg6dHJ1ZX0sCi10aTp7Ci0iXiI6IlRwOjE0OTtjIiwKK0Q2OnsKKyJeIjoiVHBaOjE1MTtjIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYwogaWYoYT49ei5sZW5ndGgpcmV0dXJuIEguZSh6LGEpCiByZXR1cm4gelthXX0sCiAkaXNFSDp0cnVlfSwKIEtDOnsKLSJeIjoiVHA6MTUwO2QiLAorIl4iOiJUcFo6MTUyO2QiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej10aGlzLmQKIGlmKGE+PXoubGVuZ3RoKXJldHVybiBILmUoeixhKQogelthXT1ifSwKICRpc0VIOnRydWV9LAogeEw6ewotIl4iOiJUcDoxMztlLGYsVUksYksiLAorIl4iOiJUcFo6MTM7ZSxmLFVJLGJLIiwKICQxOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0CiBpZihhPT1udWxsKXJldHVybiBhCiBpZih0eXBlb2YgYT09PSJib29sZWFuIilyZXR1cm4gYQpAQCAtMTE1NTksNyArMTE3MDEsNyBAQAogaWYoeSE9bnVsbClyZXR1cm4geQogeT1QLkZsKG51bGwsbnVsbCkKIHRoaXMuYksuJDIoeix5KQotZm9yKHg9T2JqZWN0LmtleXMoYSkseD1ILlZNKG5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKSxbSC5LcCh4LDApXSk7eC5HKCk7KXt3PXgubG8KK2Zvcih4PU9iamVjdC5rZXlzKGEpLHg9SC5WTShuZXcgSC5hNyh4LHgubGVuZ3RoLDAsbnVsbCksW0guT3EoeCwwKV0pO3guRygpOyl7dz14LmxvCiB5LnUoMCx3LHRoaXMuJDEoYVt3XSkpfXJldHVybiB5fWlmKGEgaW5zdGFuY2VvZiBBcnJheSl7ej10aGlzLmYuJDEoYSkKIHk9dGhpcy5VSS4kMSh6KQogaWYoeSE9bnVsbClyZXR1cm4geQpAQCAtMTE1NzksNyArMTE3MjEsNyBAQAogJGlzU2c6dHJ1ZX0sCiBBczM6ewogIl4iOiJhOyIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sRigpLnpWKDAsIiAiKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubEYoKS56VigwLCIgIil9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGdBOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMubEYoKQogej1ILlZNKG5ldyBQLnpRKHosei56TixudWxsLG51bGwpLFtudWxsXSkKIHouenE9ei5PMi5IOQpAQCAtMTE1ODcsMTEgKzExNzI5LDExIEBACiBhTjpmdW5jdGlvbihhLGIpe3RoaXMubEYoKS5hTigwLGIpfSwKIHpWOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubEYoKS56VigwLGIpfSwKIGV6OltmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMubEYoKQotcmV0dXJuIEguVk0obmV3IEgueHkoeixiKSxbSC5LcCh6LDApLG51bGxdKX0sIiQxIiwiZ0lyIiwyLDAsMTUxLDMxXSwKK3JldHVybiBILlZNKG5ldyBILnh5KHosYiksW0guT3EoeiwwKSxudWxsXSl9LCIkMSIsImdJciIsMiwwLDE1MywzMV0sCiBhZDpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMubEYoKQotcmV0dXJuIEguVk0obmV3IEguVTUoeixiKSxbSC5LcCh6LDApXSl9LAorcmV0dXJuIEguVk0obmV3IEguVTUoeixiKSxbSC5PcSh6LDApXSl9LAogbE06W2Z1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5sRigpCi1yZXR1cm4gSC5WTShuZXcgSC5vQSh6LGIpLFtILktwKHosMCksbnVsbF0pfSwiJDEiLCJnaXQiLDIsMCwxNTIsMzFdLAorcmV0dXJuIEguVk0obmV3IEgub0EoeixiKSxbSC5PcSh6LDApLG51bGxdKX0sIiQxIiwiZ2l0IiwyLDAsMTU0LDMxXSwKIG91OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubEYoKS5vdSgwLGIpfSwKIGdsMDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5sRigpLlg1PT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubEYoKS5YNSE9PTB9LApAQCAtMTE2MjksMjAgKzExNzcxLDIwIEBACiAkaXNRVjp0cnVlLAogJGFzUVY6ZnVuY3Rpb24oKXtyZXR1cm5bUC5xVV19fSwKIEdFOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouYmkoYSx0aGlzLmEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTUzLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5iaShhLHRoaXMuYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogcmw6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5iaihhLHRoaXMuYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLmJqKGEsdGhpcy5hKX0sIiQxIixudWxsLDIsMCxudWxsLDE1NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBQUjp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBKLnVZKGEsdGhpcy5hKX0sIiQxIixudWxsLDIsMCxudWxsLDE1MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouckEoYSx0aGlzLmEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTU1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHVROnsKLSJeIjoiVHA6MTM7IiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5aOChhKX0sIiQxIixudWxsLDIsMCxudWxsLDE1MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5aOChhKX0sIiQxIixudWxsLDIsMCxudWxsLDE1NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBENzp7CiAiXiI6ImFyaztZbixpeiIsCkBAIC0xMTY1OCw3ICsxMTgwMCw3IEBACiB0aGlzLlVaKDAsYix6KX0sCiBoOmZ1bmN0aW9uKGEsYil7dGhpcy5pei5OTC5hcHBlbmRDaGlsZChiKX0sCiBGVjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKLWZvcih6PUguVk0obmV3IEguYTcoYixiLmxlbmd0aCwwLG51bGwpLFtILktwKGIsMCldKSx5PXRoaXMuaXouTkw7ei5HKCk7KXkuYXBwZW5kQ2hpbGQoei5sbyl9LAorZm9yKHo9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guT3EoYiwwKV0pLHk9dGhpcy5pei5OTDt6LkcoKTspeS5hcHBlbmRDaGlsZCh6LmxvKX0sCiB0ZzpmdW5jdGlvbihhLGIpe3JldHVybiExfSwKIEdUOmZ1bmN0aW9uKGEsYil7dGhyb3cgSC5iKFAuZigiQ2Fubm90IHNvcnQgZmlsdGVyZWQgbGlzdCIpKX0sCiBKZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5HVChhLG51bGwpfSwKQEAgLTExNjg3LDE4ICsxMTgyOSwxOCBAQAogaWYoYj4+PjAhPT1ifHxiPj16Lmxlbmd0aClyZXR1cm4gSC5lKHosYikKIHJldHVybiB6W2JdfSwKIGdBOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuZ3llKCkKLXJldHVybiBILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSl9fSwKK3JldHVybiBILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSl9fSwKIGhUOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNoNH0sCiAkaXNFSDp0cnVlfSwKIEdTOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5NcChhKX0sCiAkaXNFSDp0cnVlfX1dLFsiaW5zdGFuY2VfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pbnN0YW5jZV9yZWYuZGFydCIsLEIsewogIl4iOiIiLAogcFI6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdKcDpmdW5jdGlvbihhKXt2YXIgej1hLnRZCiBpZih6IT1udWxsKWlmKEoueEMoei5nelMoKSwiTnVsbCIpKWlmKEoueEMoSi5lUyhhLnRZKSwib2JqZWN0cy9vcHRpbWl6ZWQtb3V0IikpcmV0dXJuIlRoaXMgb2JqZWN0IGlzIG5vIGxvbmdlciBuZWVkZWQgYW5kIGhhcyBiZWVuIHJlbW92ZWQgYnkgdGhlIG9wdGltaXppbmcgY29tcGlsZXIuIgogZWxzZSBpZihKLnhDKEouZVMoYS50WSksIm9iamVjdHMvY29sbGVjdGVkIikpcmV0dXJuIlRoaXMgb2JqZWN0IGhhcyBiZWVuIHJlY2xhaW1lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IuIgpAQCAtMTE3MDYsNTkgKzExODQ4LDU5IEBACiBlbHNlIGlmKEoueEMoSi5lUyhhLnRZKSwib2JqZWN0cy9ub3QtaW5pdGlhbGl6ZWQiKSlyZXR1cm4iVGhpcyBvYmplY3Qgd2lsbCBiZSBpbml0aWFsaXplZCBvbmNlIGl0IGlzIGFjY2Vzc2VkIGJ5IHRoZSBwcm9ncmFtLiIKIGVsc2UgaWYoSi54QyhKLmVTKGEudFkpLCJvYmplY3RzL2JlaW5nLWluaXRpYWxpemVkIikpcmV0dXJuIlRoaXMgb2JqZWN0IGlzIGN1cnJlbnRseSBiZWluZyBpbml0aWFsaXplZC4iCiByZXR1cm4gUS54SS5wcm90b3R5cGUuZ0pwLmNhbGwodGhpcyxhKX0sCi1HbjpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ3VzKGEpfSwiJDAiLCJneVgiLDAsMCw3MV0sCitHbjpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ3VzKGEpfSwiJDAiLCJneVgiLDAsMCw3Ml0sCiB2UTpbZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIHo9YS50WQogaWYoYj09PSEwKUouY0koeikubWwobmV3IEIuTmcoYSkpLllNKGMpCiBlbHNle3k9Si53MSh6KQogeS51KHosImZpZWxkcyIsbnVsbCkKIHkudSh6LCJlbGVtZW50cyIsbnVsbCkKLWMuJDAoKX19LCIkMiIsImd1cyIsNCwwLDE1NCwxNTUsOThdLAorYy4kMCgpfX0sIiQyIiwiZ3VzIiw0LDAsMTU2LDE1Nyw5OV0sCiBzdGF0aWM6e2x1OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMucG8uWkwoYSkKLUMucG8uWEkoYSkKK0MuaE0uWkwoYSkKK0MuaE0uWEkoYSkKIHJldHVybiBhfX19LAogTmc6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9Si5VNihhKQogaWYoei50KGEsInZhbHVlQXNTdHJpbmciKSE9bnVsbCl7ei5zb2MoYSx6LnQoYSwidmFsdWVBc1N0cmluZyIpKQotYS5zZE4oei50KGEsInZhbHVlQXNTdHJpbmciKSl9ej10aGlzLmEKK2Euc1RYKHoudChhLCJ2YWx1ZUFzU3RyaW5nIikpfXo9dGhpcy5hCiB5PUouUkUoeikKLXoudFk9eS5jdCh6LEMueFAsei50WSxhKQoteS5jdCh6LEMueFAsMCwxKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorei50WT15LmN0KHosQy5rWSx6LnRZLGEpCit5LmN0KHosQy5rWSwwLDEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsiaW5zdGFuY2Vfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaW5zdGFuY2Vfdmlldy5kYXJ0IiwsWix7CiAiXiI6IiIsCiBoeDp7Ci0iXiI6IlYxMjtYaCxmMixScixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxMjtYaCxmMixScixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnaGY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuWGh9LAogc2hmOmZ1bmN0aW9uKGEsYil7YS5YaD10aGlzLmN0KGEsQy5mbixhLlhoLGIpfSwKIGdJaTpmdW5jdGlvbihhKXtyZXR1cm4gYS5mMn0sCiBzSWk6ZnVuY3Rpb24oYSxiKXthLmYyPXRoaXMuY3QoYSxDLlhNLGEuZjIsYil9LAogZ0NGOmZ1bmN0aW9uKGEpe3JldHVybiBhLlJyfSwKIHNDRjpmdW5jdGlvbihhLGIpe2EuUnI9dGhpcy5jdChhLEMudGcsYS5ScixiKX0sCi12VjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5hVChhLlhoKS5jdihKLmV3KEouZVMoYS5YaCksIi9ldmFsP2V4cHI9IitQLmpXKEMueUQsYixDLnhNLCExKSkpfSwiJDEiLCJnWm0iLDIsMCwxMDUsMTA2XSwKLVMxOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuWGgpLmN2KEouZXcoSi5lUyhhLlhoKSwiL3JldGFpbmVkIikpLm1sKG5ldyBaLndVKGEpKX0sIiQxIiwiZ2hOIiwyLDAsMTA3LDEwOV0sCi1QcjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5hVChhLlhoKS5jdihKLmV3KEouZVMoYS5YaCksIi9yZXRhaW5pbmdfcGF0aD9saW1pdD0iK0guZChiKSkpLm1sKG5ldyBaLmNMKGEpKX0sIiQxIiwiZ0NJIiwyLDAsMTA3LDMzXSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5YaCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK3ZWOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuWGgpLmN2KEouZXcoSi5lUyhhLlhoKSwiL2V2YWw/ZXhwcj0iK1AualcoQy55RCxiLEMueE0sITEpKSl9LCIkMSIsImdabSIsMiwwLDEwNiwxMDddLAorUzE6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5YaCkuY3YoSi5ldyhKLmVTKGEuWGgpLCIvcmV0YWluZWQiKSkubWwobmV3IFoud1UoYSkpfSwiJDEiLCJnaE4iLDIsMCwxMDgsMTEwXSwKK1ByOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuWGgpLmN2KEouZXcoSi5lUyhhLlhoKSwiL3JldGFpbmluZ19wYXRoP2xpbWl0PSIrSC5kKGIpKSkubWwobmV3IFouY0woYSkpfSwiJDEiLCJnQ0kiLDIsMCwxMDgsMzNdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlhoKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntDb1c6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5Scj1udWxsCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnlLeC5aTChhKQogQy55S3guWEkoYSkKQEAgLTExNzY3LDY2ICsxMTkwOSw2NiBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiB3VTp7Ci0iXiI6IlRwOjExMDthIiwKKyJeIjoiVHBaOjExMTthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT1ILkJVKEouVVEoYSwidmFsdWVBc1N0cmluZyIpLG51bGwsbnVsbCkKLXouUnI9Si5RNSh6LEMudGcsei5Scix5KX0sIiQxIixudWxsLDIsMCxudWxsLDkyLCJjYWxsIl0sCit6LlJyPUouUTUoeixDLnRnLHouUnIseSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBjTDp7Ci0iXiI6IlRwOjE0MTthIiwKKyJeIjoiVHBaOjE0MzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKLXouZjI9Si5RNSh6LEMuWE0sei5mMixhKX0sIiQxIixudWxsLDIsMCxudWxsLDkyLCJjYWxsIl0sCit6LmYyPUouUTUoeixDLlhNLHouZjIsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImlvX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2lvX3ZpZXcuZGFydCIsLEUsewogIl4iOiIiLAogTDQ6ewotIl4iOiJWMTM7UE0sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMTM7UE0sQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2ttOmZ1bmN0aW9uKGEpe3JldHVybiBhLlBNfSwKIHNrbTpmdW5jdGlvbihhLGIpe2EuUE09dGhpcy5jdChhLEMucXMsYS5QTSxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuUE0pLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuUE0pLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e3A0dDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLnphLlpMKGEpCi1DLnphLlhJKGEpCitDLndkLlpMKGEpCitDLndkLlhJKGEpCiByZXR1cm4gYX19fSwKIFYxMzp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE1iOnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBzdGF0aWM6e1JWSTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkFnLlpMKGEpCiBDLkFnLlhJKGEpCiByZXR1cm4gYX19fSwKIG1POnsKLSJeIjoiVjE0O0NyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjE0O0NyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqeDpmdW5jdGlvbihhKXtyZXR1cm4gYS5Dcn0sCiBzang6ZnVuY3Rpb24oYSxiKXthLkNyPXRoaXMuY3QoYSxDLnZwLGEuQ3IsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntDaDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkllLlpMKGEpCiBDLkllLlhJKGEpCkBAIC0xMTgzNSwyNSArMTE5NzcsMjUgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogREU6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7b0I6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5JZy5aTChhKQogQy5JZy5YSShhKQogcmV0dXJuIGF9fX0sCiBVMTp7Ci0iXiI6IlYxNTt5UixtWixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxNTt5UixtWixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBncWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueVJ9LAogc3FsOmZ1bmN0aW9uKGEsYil7YS55Uj10aGlzLmN0KGEsQy5vaixhLnlSLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS55UikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS55UikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIExnOltmdW5jdGlvbihhKXtKLmNJKGEueVIpLllNKG5ldyBFLkt2KGEpKX0sIiQwIiwiZ1c2IiwwLDAsMThdLAogRXM6ZnVuY3Rpb24oYSl7Wi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCiBhLm1aPVAuclQoUC5paSgwLDAsMCwwLDAsMSksdGhpcy5nVzYoYSkpfSwKQEAgLTExODYyLDE0ICsxMjAwNCwxNCBAQAogej1hLm1aCiBpZih6IT1udWxsKXt6LmVkKCkKIGEubVo9bnVsbH19LAotc3RhdGljOntobTpmdW5jdGlvbihhKXt2YXIgeix5CitzdGF0aWM6e1RpVTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLng0LlpMKGEpCiBDLng0LlhJKGEpCkBAIC0xMTg3OCwxNSArMTIwMjAsMTUgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogS3Y6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9dGhpcy5hCiBpZih6Lm1aIT1udWxsKXoubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLkFMKHopKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEg4OnsKLSJeIjoiVjE2O3ZkLG1aLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjE2O3ZkLG1aLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdQQjpmdW5jdGlvbihhKXtyZXR1cm4gYS52ZH0sCiBzUEI6ZnVuY3Rpb24oYSxiKXthLnZkPXRoaXMuY3QoYSxDLnlMLGEudmQsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnZkKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnZkKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogTGc6W2Z1bmN0aW9uKGEpe0ouY0koYS52ZCkuWU0obmV3IEUudU4oYSkpfSwiJDAiLCJnVzYiLDAsMCwxOF0sCiBFczpmdW5jdGlvbihhKXtaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKIGEubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmdXNihhKSl9LApAQCAtMTE4OTksNjUgKzEyMDQxLDY1IEBACiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLkJzLlpMKGEpCi1DLkJzLlhJKGEpCitDLkdJSS5aTChhKQorQy5HSUkuWEkoYSkKIHJldHVybiBhfX19LAogVjE2OnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogdU46ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9dGhpcy5hCiBpZih6Lm1aIT1udWxsKXoubVo9UC5yVChQLmlpKDAsMCwwLDAsMCwxKSxKLkFMKHopKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFdTOnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBzdGF0aWM6e2pTOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuVWcuWkwoYSkKLUMuVWcuWEkoYSkKK0MuYlAuWkwoYSkKK0MuYlAuWEkoYSkKIHJldHVybiBhfX19LAogcWg6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCi1zdGF0aWM6e2N1YTpmdW5jdGlvbihhKXt2YXIgeix5CisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKK3N0YXRpYzp7U2M6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy53Sy5aTChhKQogQy53Sy5YSShhKQogcmV0dXJuIGF9fX0sCiBvRjp7Ci0iXiI6IlYxNztDcixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYxNztDcixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnang6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQ3J9LAogc2p4OmZ1bmN0aW9uKGEsYil7YS5Dcj10aGlzLmN0KGEsQy52cCxhLkNyLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7VUU6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5UbC5aTChhKQogQy5UbC5YSShhKQpAQCAtMTE5NjYsMTggKzEyMTA4LDE4IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFE2OnsKLSJeIjoiVjE4O3V2LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjE4O3V2LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqNDpmdW5jdGlvbihhKXtyZXR1cm4gYS51dn0sCiBzajQ6ZnVuY3Rpb24oYSxiKXthLnV2PXRoaXMuY3QoYSxDLlZlLGEudXYsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnV2KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLnV2KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntjaEY6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy50by5aTChhKQogQy50by5YSShhKQpAQCAtMTE5ODYsMzMgKzEyMTI4LDMzIEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIHVFOnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBzdGF0aWM6e0FXOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuanMuWkwoYSkKLUMuanMuWEkoYSkKK0MuUnIuWkwoYSkKK0MuUnIuWEkoYSkKIHJldHVybiBhfX19LAogWm46ewotIl4iOiJWMTk7Q3IsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMTk7Q3IsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2p4OmZ1bmN0aW9uKGEpe3JldHVybiBhLkNyfSwKIHNqeDpmdW5jdGlvbihhLGIpe2EuQ3I9dGhpcy5jdChhLEMudnAsYS5DcixiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQ3IpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCi1zdGF0aWM6e3hLOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKK3N0YXRpYzp7a2Y6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5pai5aTChhKQogQy5pai5YSShhKQpAQCAtMTIwMjEsMTggKzEyMTYzLDE4IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIG41OnsKLSJeIjoiVjIwO2gxLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjIwO2gxLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdIeTpmdW5jdGlvbihhKXtyZXR1cm4gYS5oMX0sCiBzSHk6ZnVuY3Rpb24oYSxiKXthLmgxPXRoaXMuY3QoYSxDLllFLGEuaDEsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLmgxKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLmgxKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntpT286ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5hVi5aTChhKQogQy5hVi5YSShhKQpAQCAtMTIwNDEsMTggKzEyMTgzLDE4IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE1hOnsKLSJeIjoiVjIxO0NyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjIxO0NyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqeDpmdW5jdGlvbihhKXtyZXR1cm4gYS5Dcn0sCiBzang6ZnVuY3Rpb24oYSxiKXthLkNyPXRoaXMuY3QoYSxDLnZwLGEuQ3IsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLkNyKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotc3RhdGljOntJaTpmdW5jdGlvbihhKXt2YXIgeix5CitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuQ3IpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitzdGF0aWM6e0lpMTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmlSLlpMKGEpCiBDLmlSLlhJKGEpCkBAIC0xMjA2MSwyNSArMTIyMDMsMjUgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogd046ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7TUw6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5MNi5aTChhKQogQy5MNi5YSShhKQogcmV0dXJuIGF9fX0sCiBkczp7Ci0iXiI6IlYyMjt3VCxtWixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYyMjt3VCxtWixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnTVo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEud1R9LAogc01aOmZ1bmN0aW9uKGEsYil7YS53VD10aGlzLmN0KGEsQy5qVSxhLndULGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS53VCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS53VCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIG5LOltmdW5jdGlvbihhKXtKLmNJKGEud1QpLllNKG5ldyBFLm1qKGEpKX0sIiQwIiwiZ3VUIiwwLDAsMThdLAogRXM6ZnVuY3Rpb24oYSl7Wi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCiBhLm1aPVAuclQoUC5paSgwLDAsMCwwLDAsMSksdGhpcy5ndVQoYSkpfSwKQEAgLTEyMDkyLDEwICsxMjIzNCwxMCBAQAogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy53UC5aTChhKQogQy53UC5YSShhKQpAQCAtMTIxMDQsMjMgKzEyMjQ2LDIzIEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIG1qOnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYQogaWYoei5tWiE9bnVsbCl6Lm1aPVAuclQoUC5paSgwLDAsMCwwLDAsMSksSi5sQih6KSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1vdTp7Ci0iXiI6IlYyMztDcixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCitxTTp7CisiXiI6IlYyMztDcixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnang6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQ3J9LAogc2p4OmZ1bmN0aW9uKGEsYil7YS5Dcj10aGlzLmN0KGEsQy52cCxhLkNyLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5DcikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIHN0YXRpYzp7dFg6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5sWC5aTChhKQogQy5sWC5YSShhKQpAQCAtMTIxMjksNyArMTIyNzEsNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBhdjp7Ci0iXiI6Ilp6UjtDQixBUCxmbix0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6Ilp6UjtDQixBUCxmbix0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnRVE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuQ0J9LAogc0VROmZ1bmN0aW9uKGEsYil7YS5DQj10aGlzLmN0KGEsQy5wSCxhLkNCLGIpfSwKIHN0YXRpYzp7Ujc6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtMTIxMzgsMTAgKzEyMjgwLDEwIEBACiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLkNCPSExCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk9rSS5aTChhKQogQy5Pa0kuWEkoYSkKQEAgLTEyMTUwLDExICsxMjI5MiwxMSBAQAogIl4iOiJ4SStQaTsiLAogJGlzZDM6dHJ1ZX0sCiB1ejp7Ci0iXiI6IlYyNDtSWCxtWixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYyNDtSWCxtWixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnTk46ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUlh9LAogRm46ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ05OKGEpLiQwKCl9LAogc05OOmZ1bmN0aW9uKGEsYil7YS5SWD10aGlzLmN0KGEsQy5XaixhLlJYLGIpfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5SWCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKK1NLOltmdW5jdGlvbihhLGIpe0ouY0koYS5SWCkuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk5XSwKIG5LOltmdW5jdGlvbihhKXtKLmNJKGEuUlgpLllNKG5ldyBFLkNjKGEpKX0sIiQwIiwiZ3VUIiwwLDAsMThdLAogRXM6ZnVuY3Rpb24oYSl7Wi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCiBhLm1aPVAuclQoUC5paSgwLDAsMCwwLDAsMSksdGhpcy5ndVQoYSkpfSwKQEAgLTEyMTYzLDE0ICsxMjMwNSwxNCBAQAogej1hLm1aCiBpZih6IT1udWxsKXt6LmVkKCkKIGEubVo9bnVsbH19LAotc3RhdGljOnt6MTpmdW5jdGlvbihhKXt2YXIgeix5CitzdGF0aWM6e1pGUDpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmJaLlpMKGEpCiBDLmJaLlhJKGEpCkBAIC0xMjE3OSw3ICsxMjMyMSw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIENjOnsKLSJeIjoiVHA6NzE7YSIsCisiXiI6IlRwWjo3MjthIiwKICQwOltmdW5jdGlvbigpe3ZhciB6PXRoaXMuYQogaWYoei5tWiE9bnVsbCl6Lm1aPVAuclQoUC5paSgwLDAsMCwwLDAsMSksSi5sQih6KSl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImlzb2xhdGVfcHJvZmlsZV9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaXNvbGF0ZV9wcm9maWxlLmRhcnQiLCxYLHsKQEAgLTEyMTk1LDcgKzEyMzM3LDcgQEAKIGZvcih3PXRoaXMuSCx2PUoubVkoSi5NeCh3KSksdT10aGlzLlNGO3YuRygpOyl7dD12LmdsKCkKIHM9Si5YOSh0LmdBdigpLHcuZ0F2KCkpCiBpZih0eXBlb2YgeSE9PSJudW1iZXIiKXJldHVybiBILnMoeSkKLWlmKCEocz55fHxKLlg5KEoub24odCkuZ1BsKCksdS5Bdik+eSkpY29udGludWUKK2lmKCEocz55fHxKLlg5KEoub24odCkuZ0R1KCksdS5Bdik+eSkpY29udGludWUKIHgucHVzaChYLlNKKHosdSx0LHRoaXMpKX19LAogbzg6ZnVuY3Rpb24oKXt9LAogTmg6ZnVuY3Rpb24oKXtyZXR1cm4gSi5xOChKLk14KHRoaXMuSCkpPjB9LApAQCAtMTIyMTEsNyArMTIzNTMsNyBAQAogZWxzZSB0aGlzLlpuPUguZChKLkl6KHkuZ3RUKHopKSkrIiAoRnVuY3Rpb24pIgogaWYoZD09bnVsbCl0aGlzLnZzPUcuZGooei5nQXYoKSx0aGlzLlNGLkF2KQogZWxzZSB0aGlzLnZzPUcuZGooei5nQXYoKSxkLkguZ0F2KCkpCi10aGlzLmtpPUcuZGooeS5ndFQoeikuZ1BsKCksdGhpcy5TRi5Bdil9ej10aGlzLm9ICit0aGlzLmtpPUcuZGooeS5ndFQoeikuZ0R1KCksdGhpcy5TRi5Bdil9ej10aGlzLm9ICiB6LnB1c2godGhpcy52cykKIHoucHVzaCh0aGlzLmtpKX0sCiBzdGF0aWM6e1NKOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkKQEAgLTEyMjIyLDcgKzEyMzY0LDcgQEAKIHoubVcoYSxiLGMsZCkKIHJldHVybiB6fX19LAoga0s6ewotIl4iOiJWMjU7b2ksVEgsV1QsVXcsSWssb28sZkUsZXYsWFgsVE0sV0MsSG09LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjI1O29pLFRILFdULFV3LElrLG9vLGZFLGV2LFhYLFRNLFdDLEhtPSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnQjE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub2l9LAogc0IxOmZ1bmN0aW9uKGEsYil7YS5vaT10aGlzLmN0KGEsQy52YixhLm9pLGIpfSwKIGdQTDpmdW5jdGlvbihhKXtyZXR1cm4gYS5USH0sCkBAIC0xMjIzMSw4ICsxMjM3Myw4IEBACiBzTFc6ZnVuY3Rpb24oYSxiKXthLldUPXRoaXMuY3QoYSxDLkdzLGEuV1QsYil9LAogZ1VvOmZ1bmN0aW9uKGEpe3JldHVybiBhLlV3fSwKIHNVbzpmdW5jdGlvbihhLGIpe2EuVXc9dGhpcy5jdChhLEMuRGosYS5VdyxiKX0sCi1nRWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSWt9LAotc0VsOmZ1bmN0aW9uKGEsYil7YS5Jaz10aGlzLmN0KGEsQy5ZRCxhLklrLGIpfSwKK2dQMjpmdW5jdGlvbihhKXtyZXR1cm4gYS5Ja30sCitzUDI6ZnVuY3Rpb24oYSxiKXthLklrPXRoaXMuY3QoYSxDLllELGEuSWssYil9LAogZ25aOmZ1bmN0aW9uKGEpe3JldHVybiBhLm9vfSwKIHNuWjpmdW5jdGlvbihhLGIpe2Eub289dGhpcy5jdChhLEMuYkUsYS5vbyxiKX0sCiBnTkc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZkV9LApAQCAtMTIyNjgsMTEgKzEyNDEwLDExIEBACiBFczpmdW5jdGlvbihhKXt2YXIgegogWi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCiB6PVIudEIoW10pCi1hLkhtPW5ldyBHLlhOKHosbnVsbCxudWxsKQorYS5IbT1uZXcgRy5pWSh6LG51bGwsbnVsbCkKIHRoaXMuWmIoYSl9LAotbTU6W2Z1bmN0aW9uKGEsYil7dGhpcy5wQShhLG51bGwpfSwiJDEiLCJnYjYiLDIsMCwyMCw1N10sCi1wQTpbZnVuY3Rpb24oYSxiKXt2YXIgej0icHJvZmlsZT90YWdzPSIrSC5kKGEuVE0pCi1KLmFUKGEub2kpLmN2KHopLm1sKG5ldyBYLlh5KGEpKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorbTU6W2Z1bmN0aW9uKGEsYil7dGhpcy5TSyhhLG51bGwpfSwiJDEiLCJnYjYiLDIsMCwyMCw1N10sCitTSzpbZnVuY3Rpb24oYSxiKXt2YXIgej0icHJvZmlsZT90YWdzPSIrSC5kKGEuVE0pCitKLmFUKGEub2kpLmN2KHopLm1sKG5ldyBYLlh5KGEpKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogWmI6ZnVuY3Rpb24oYSl7aWYoYS5vaT09bnVsbClyZXR1cm4KIHRoaXMuR04oYSl9LAogR046ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgpAQCAtMTIyODEsMTAgKzEyNDIzLDEwIEBACiB0cnl7YS5IbS5tQShYLlNKKGEub2kseix6LG51bGwpKX1jYXRjaCh3KXt2PUguUnUodykKIHk9dgogeD1uZXcgSC5YTyh3LG51bGwpCi1OLlFNKCIiKS54SCgiX2J1aWxkU3RhY2tUcmVlIix5LHgpfWlmKEoueEMoSi5xOChhLkhtLnZwKSwxKSlhLkhtLnFVKDApCitOLlFNKCIiKS53RigiX2J1aWxkU3RhY2tUcmVlIix5LHgpfWlmKEoueEMoSi5xOChhLkhtLnZwKSwxKSlhLkhtLnFVKDApCiB0aGlzLmN0KGEsQy5lcCxudWxsLGEuSG0pfSwKLWthOltmdW5jdGlvbihhLGIpe3JldHVybiJwYWRkaW5nLWxlZnQ6ICIrYi5neXQoKSoxNisicHg7In0sIiQxIiwiZ0huIiwyLDAsOTksMTAwXSwKLUxaOltmdW5jdGlvbihhLGIpe3JldHVybiBDLlFDW0Muam4uWShiLmd5dCgpLTEsOSldfSwiJDEiLCJnYnciLDIsMCw5OSwxMDBdLAora2E6W2Z1bmN0aW9uKGEsYil7cmV0dXJuInBhZGRpbmctbGVmdDogIitiLmd5dCgpKjE2KyJweDsifSwiJDEiLCJnSG4iLDIsMCwxMDAsMTAxXSwKK0xaOltmdW5jdGlvbihhLGIpe3JldHVybiBDLlFDW0Muam4uWShiLmd5dCgpLTEsOSldfSwiJDEiLCJnYnciLDIsMCwxMDAsMTAxXSwKIFlGOltmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUKIHc9Si5SRShiKQogaWYoIUoueEMoSi5lUyh3LmdOKGIpKSwiZXhwYW5kIikmJiFKLnhDKHcuZ04oYiksZCkpcmV0dXJuCkBAIC0xMjI5NSw3ICsxMjQzNyw3IEBACiB3LnFVKHYtMSl9Y2F0Y2godSl7dz1ILlJ1KHUpCiB5PXcKIHg9bmV3IEguWE8odSxudWxsKQotTi5RTSgiIikueEgoInRvZ2dsZUV4cGFuZGVkIix5LHgpfX0sIiQzIiwiZ3dKIiw2LDAsMTAxLDEsMTAyLDEwM10sCitOLlFNKCIiKS53RigidG9nZ2xlRXhwYW5kZWQiLHkseCl9fSwiJDMiLCJnd0oiLDYsMCwxMDIsMSwxMDMsMTA0XSwKIHN0YXRpYzp7Il4iOiJCNiIsakQ6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQpAQCAtMTIzMDksMTAgKzEyNDUxLDEwIEBACiBhLlhYPTAuMDAwMgogYS5UTT0idXYiCiBhLldDPSIjdGFibGVUcmVlIgotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5rUy5aTChhKQogQy5rUy5YSShhKQpAQCAtMTIzMjEsMzkgKzEyNDYzLDM5IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFh5OnsKLSJeIjoiVHA6MTEwO2EiLAorIl4iOiJUcFo6MTExO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQotei5vaT1KLlE1KHosQy52Yix6Lm9pLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTU2LCJjYWxsIl0sCit6Lm9pPUouUTUoeixDLnZiLHoub2ksYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTgsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJpc29sYXRlX3JlZl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaXNvbGF0ZV9yZWYuZGFydCIsLE4sewogIl4iOiIiLAogb2E6ewotIl4iOiJ4STt0WSxQZSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InhJO3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7SUI6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5QZT0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5MTi5aTChhKQogQy5MTi5YSShhKQogcmV0dXJuIGF9fX19XSxbImlzb2xhdGVfc3VtbWFyeV9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaXNvbGF0ZV9zdW1tYXJ5LmRhcnQiLCxELHsKICJeIjoiIiwKIFN0OnsKLSJeIjoiVjI2O293LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjI2O293LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5vd30sCiBzb2Q6ZnVuY3Rpb24oYSxiKXthLm93PXRoaXMuY3QoYSxDLnJCLGEub3csYil9LAogc3RhdGljOntONTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk9vRi5aTChhKQogQy5Pb0YuWEkoYSkKQEAgLTEyMzYyLDE5ICsxMjUwNCwxOSBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBJVzp7Ci0iXiI6IlYyNztvdyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYyNztvdyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3d9LAogc29kOmZ1bmN0aW9uKGEsYil7YS5vdz10aGlzLmN0KGEsQy5yQixhLm93LGIpfSwKLUZ2OltmdW5jdGlvbihhLGIpe3JldHVybiBhLm93LmN2KCJkZWJ1Zy9wYXVzZSIpLm1sKG5ldyBELkdHKGEpKX0sIiQxIiwiZ1gwIiwyLDAsMTU3LDE0XSwKLWtmOltmdW5jdGlvbihhLGIpe3JldHVybiBhLm93LmN2KCJkZWJ1Zy9yZXN1bWUiKS5tbChuZXcgRC5yOChhKSl9LCIkMSIsImdEUSIsMiwwLDE1NywxNF0sCitGdjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5vdy5jdigiZGVidWcvcGF1c2UiKS5tbChuZXcgRC5yZihhKSl9LCIkMSIsImdYMCIsMiwwLDE1OSwxNF0sCitrZjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5vdy5jdigiZGVidWcvcmVzdW1lIikubWwobmV3IEQucjgoYSkpfSwiJDEiLCJnRFEiLDIsMCwxNTksMTRdLAogc3RhdGljOnt6cjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkYyLlpMKGEpCiBDLkYyLlhJKGEpCkBAIC0xMjM4MiwyOCArMTI1MjQsMjggQEAKIFYyNzp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKLUdHOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouY0kodGhpcy5hLm93KX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorcmY6eworIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouY0kodGhpcy5hLm93KX0sIiQxIixudWxsLDIsMCxudWxsLDE0MiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiByODp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi0kLm1mLngzKHoub3cpCi1yZXR1cm4gSi5jSSh6Lm93KX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorJC5LaC54Myh6Lm93KQorcmV0dXJuIEouY0koei5vdyl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDIsImNhbGwiXSwKICRpc0VIOnRydWV9LAogUWg6ewotIl4iOiJWMjg7b3csQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMjg7b3csQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiBhLm93fSwKIHNvZDpmdW5jdGlvbihhLGIpe2Eub3c9dGhpcy5jdChhLEMuckIsYS5vdyxiKX0sCiBzdGF0aWM6e1FqOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuVmkuWkwoYSkKIEMuVmkuWEkoYSkKQEAgLTEyNDEyLDE3ICsxMjU1NCwxNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBPejp7Ci0iXiI6IlYyOTtvdyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYyOTtvdyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub3d9LAogc29kOmZ1bmN0aW9uKGEsYil7YS5vdz10aGlzLmN0KGEsQy5yQixhLm93LGIpfSwKIHN0YXRpYzp7UlA6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5KaS5aTChhKQogQy5KaS5YSShhKQpAQCAtMTI0MzcsMTggKzEyNTc5LDE4IEBACiBpZihKLnhDKHoublEoImdldE51bWJlck9mQ29sdW1ucyIpLDApKXt6LlY3KCJhZGRDb2x1bW4iLFsic3RyaW5nIiwiTmFtZSJdKQogei5WNygiYWRkQ29sdW1uIixbIm51bWJlciIsIlZhbHVlIl0pfXouVjcoInJlbW92ZVJvd3MiLFswLHoublEoImdldE51bWJlck9mUm93cyIpXSkKIGZvcih5PUouUkUoYSkseD1KLm1ZKHkuZ3ZjKGEpKTt4LkcoKTspe3c9eC5nbCgpCi12PUoudUgoeS50KGEsdyksIiUiKQordj1KLkl0KHkudChhLHcpLCIlIikKIGlmKDA+PXYubGVuZ3RoKXJldHVybiBILmUodiwwKQogdT1bXQogQy5ObS5GVih1LEMuTm0uZXooW3csSC5SUih2WzBdLG51bGwpXSxQLkVuKCkpKQotdT1uZXcgUC5Ueih1KQordT1uZXcgUC5HRCh1KQogdS4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQogei5WNygiYWRkUm93IixbdV0pfX19LAogWjQ6ewotIl4iOiJWMzA7d2QsaXcsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMzA7d2QsaXcsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1hFOmZ1bmN0aW9uKGEpe3JldHVybiBhLndkfSwKIHNYRTpmdW5jdGlvbihhLGIpe2Eud2Q9dGhpcy5jdChhLEMuYkosYS53ZCxiKX0sCi1LMzpbZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKK2FrOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogaWYoYS53ZD09bnVsbClyZXR1cm4KIGlmKCQuSWIoKS5NTS5HdiE9PTAmJmEuaXc9PW51bGwpYS5pdz1uZXcgRC52VChuZXcgRy5LZihQLnpWKEouVVEoJC5CWSwiRGF0YVRhYmxlIiksbnVsbCkpLG51bGwpCiB6PWEuaXcKQEAgLTEyNDY0LDEwICsxMjYwNiwxMCBAQAogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5hWFAuWkwoYSkKIEMuYVhQLlhJKGEpCkBAIC0xMjQ3NiwxMCArMTI2MTgsMTAgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9fV0sWyJpc29sYXRlX3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2lzb2xhdGVfdmlldy5kYXJ0IiwsTCx7CiAiXiI6IiIsCi1JZjp7Ci0iXiI6ImE7WDYsWVQiLAorcDY5OnsKKyJeIjoiYTtZaSxTMiIsCiBlQzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscQotej10aGlzLlg2LktKCit6PXRoaXMuWWkuS0oKIGlmKEoueEMoei5uUSgiZ2V0TnVtYmVyT2ZDb2x1bW5zIiksMCkpe3ouVjcoImFkZENvbHVtbiIsWyJzdHJpbmciLCJUaW1lIl0pCiBmb3IoeT1KLm1ZKGEuZ2FmKCkpO3kuRygpOyl7eD15LmxvCiBpZihKLnhDKHgsIklkbGUiKSljb250aW51ZQpAQCAtMTI0OTQsNyArMTI2MzYsNyBAQAogcy5wdXNoKCJ0ICIrQy5DRC5TeSh0LXYsMikpfWVsc2Ugcy5wdXNoKCIiKQogeT1hLmdsSSgpCiBpZih1Pj15Lmxlbmd0aClyZXR1cm4gSC5lKHksdSkKLXI9eVt1XS53Wgorcj15W3VdLk9RCiBpZihyPT09MCl7cT0wCiB3aGlsZSghMCl7eT1hLmdsSSgpCiBpZih1Pj15Lmxlbmd0aClyZXR1cm4gSC5lKHksdSkKQEAgLTEyNTExLDM3ICsxMjY1MywzNyBAQAogaWYocT49eS5sZW5ndGgpcmV0dXJuIEguZSh5LHEpCiBzLnB1c2goQy5DRC55dShKLlg5KHlbcV0scikqMTAwKSl9KytxfX15PVtdCiBDLk5tLkZWKHksQy5ObS5leihzLFAuRW4oKSkpCi15PW5ldyBQLlR6KHkpCit5PW5ldyBQLkdEKHkpCiB5LiRidWlsdGluVHlwZUluZm89W251bGxdCiB6LlY3KCJhZGRSb3ciLFt5XSl9fX0sCiBxazp7Ci0iXiI6IlYzMTtjayx0cyx0dSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCi1nb2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2t9LAotc29kOmZ1bmN0aW9uKGEsYil7YS5jaz10aGlzLmN0KGEsQy5yQixhLmNrLGIpfSwKLXZWOltmdW5jdGlvbihhLGIpe3ZhciB6PWEuY2sKLXJldHVybiB6LmN2KEouZXcoSi5lUyh6LmdWYygpKSwiL2V2YWw/ZXhwcj0iK1AualcoQy55RCxiLEMueE0sITEpKSl9LCIkMSIsImdabSIsMiwwLDEwNSwxMDZdLAotVnA6W2Z1bmN0aW9uKGEpe2EuY2subTcoKS5tbChuZXcgTC5MWChhKSl9LCIkMCIsImdKRCIsMCwwLDE4XSwKKyJeIjoiVjMxO1RPLENuLEZzLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKK2dvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5UT30sCitzb2Q6ZnVuY3Rpb24oYSxiKXthLlRPPXRoaXMuY3QoYSxDLnJCLGEuVE8sYil9LAordlY6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS5UTworcmV0dXJuIHouY3YoSi5ldyhKLmVTKHouZ1ZjKCkpLCIvZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpKX0sIiQxIiwiZ1ptIiwyLDAsMTA2LDEwN10sCit0STpbZnVuY3Rpb24oYSl7YS5UTy5tNygpLm1sKG5ldyBMLkxYKGEpKX0sIiQwIiwiZ0N0IiwwLDAsMThdLAogRXM6ZnVuY3Rpb24oYSl7Wi51TC5wcm90b3R5cGUuRXMuY2FsbCh0aGlzLGEpCi1hLnRzPVAuclQoUC5paSgwLDAsMCwwLDAsMSksdGhpcy5nSkQoYSkpfSwKK2EuQ249UC5yVChQLmlpKDAsMCwwLDAsMCwxKSx0aGlzLmdDdChhKSl9LAogZFE6ZnVuY3Rpb24oYSl7dmFyIHoKIFoudUwucHJvdG90eXBlLmRRLmNhbGwodGhpcyxhKQotej1hLnRzCit6PWEuQ24KIGlmKHohPW51bGwpe3ouZWQoKQotYS50cz1udWxsfX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuY2spLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCi1qOTpbZnVuY3Rpb24oYSxiKXtKLmVnKGEuY2spLllNKGIpfSwiJDEiLCJnRFgiLDIsMCwyMCw5OF0sCi1GdjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jay5jdigiZGVidWcvcGF1c2UiKS5tbChuZXcgTC5DVihhKSl9LCIkMSIsImdYMCIsMiwwLDE1NywxNF0sCi1rZjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5jay5jdigicmVzdW1lIikubWwobmV3IEwuVnEoYSkpfSwiJDEiLCJnRFEiLDIsMCwxNTcsMTRdLAorYS5Dbj1udWxsfX0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuVE8pLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitqOTpbZnVuY3Rpb24oYSxiKXtKLmVnKGEuVE8pLllNKGIpfSwiJDEiLCJnRFgiLDIsMCwyMCw5OV0sCitGdjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5UTy5jdigiZGVidWcvcGF1c2UiKS5tbChuZXcgTC5DVihhKSl9LCIkMSIsImdYMCIsMiwwLDE1OSwxNF0sCitrZjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5UTy5jdigicmVzdW1lIikubWwobmV3IEwuVnEoYSkpfSwiJDEiLCJnRFEiLDIsMCwxNTksMTRdLAogc3RhdGljOntRdHA6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PVAuelYoSi5VUSgkLkJZLCJEYXRhVGFibGUiKSxudWxsKQogeT1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHg9UC5xVQogeD1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseCxudWxsKSxudWxsLG51bGwpLFt4LG51bGxdKQotYS50dT1uZXcgTC5JZihuZXcgRy5LZih6KSxudWxsKQotYS5TYT1bXQorYS5Gcz1uZXcgTC5wNjkobmV3IEcuS2YoeiksbnVsbCkKK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9eQorYS5vRz0hMQorYS5aTT15CiBhLlpRPXgKIEMuWGUuWkwoYSkKIEMuWGUuWEkoYSkKQEAgLTEyNTUwLDI3ICsxMjY5MiwyNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBMWDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej10aGlzLmEKLXk9ei50dQoreT16LkZzCiB5LmVDKGEpCiB4PSh6LnNoYWRvd1Jvb3R8fHoud2Via2l0U2hhZG93Um9vdCkucXVlcnlTZWxlY3RvcigiI3RhZ1Byb2ZpbGVDaGFydCIpCi1pZih4IT1udWxsKXtpZih5LllUPT1udWxsKXt3PVAuTDUobnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQoraWYoeCE9bnVsbCl7aWYoeS5TMj09bnVsbCl7dz1QLkw1KG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIHY9bmV3IEcucXUobnVsbCx3KQogdi52Uj1QLnpWKEouVVEoJC5CWSwiU3RlcHBlZEFyZWFDaGFydCIpLFt4XSkKLXkuWVQ9dgoreS5TMj12CiB3LnUoMCwiaXNTdGFja2VkIiwhMCkKLXkuWVQuYkcudSgwLCJjb25uZWN0U3RlcHMiLCExKQoteS5ZVC5iRy51KDAsInZBeGlzIixQLkVGKFsibWluVmFsdWUiLDAsIm1heFZhbHVlIiwxMDBdLG51bGwsbnVsbCkpfXkuWVQuVzIoeS5YNil9aWYoei50cyE9bnVsbCl6LnRzPVAuclQoUC5paSgwLDAsMCwwLDAsMSksSi5PWSh6KSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTgsImNhbGwiXSwKK3kuUzIuYkcudSgwLCJjb25uZWN0U3RlcHMiLCExKQoreS5TMi5iRy51KDAsInZBeGlzIixQLkVGKFsibWluVmFsdWUiLDAsIm1heFZhbHVlIiwxMDBdLG51bGwsbnVsbCkpfXkuUzIuVzIoeS5ZaSl9aWYoei5DbiE9bnVsbCl6LkNuPVAuclQoUC5paSgwLDAsMCwwLDAsMSksSi5KNyh6KSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNjAsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQ1Y6ewotIl4iOiJUcDoxMzthIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEuY2spfSwiJDEiLG51bGwsMiwwLG51bGwsMTQwLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSi5jSSh0aGlzLmEuVE8pfSwiJDEiLG51bGwsMiwwLG51bGwsMTQyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFZxOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouY0kodGhpcy5hLmNrKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIEouY0kodGhpcy5hLlRPKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbImpzb25fdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvanNvbl92aWV3LmRhcnQiLCxaLHsKICJeIjoiIiwKIHhoOnsKQEAgLTEyNjI0LDcgKzEyNzY2LDcgQEAKIHU9eC52TSs9dHlwZW9mIHY9PT0ic3RyaW5nIj92OkguZCh2KQogeC52TT11KyJcbiJ9fXouUnooMCxhKX19LAogdmo6ewotIl4iOiJWMzI7THksY3MsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMzI7THksY3MsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0lyOmZ1bmN0aW9uKGEpe3JldHVybiBhLkx5fSwKIGV6OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZ0lyKGEpLiQxKGIpfSwKIHNJcjpmdW5jdGlvbihhLGIpe2EuTHk9dGhpcy5jdChhLEMuU1IsYS5MeSxiKX0sCkBAIC0xMjY0NCwxMCArMTI3ODYsMTAgQEAKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuWXQuWkwoYSkKIEMuWXQuWEkoYSkKQEAgLTEyNjU3LDM2ICsxMjc5OSwzNiBAQAogJGlzZDM6dHJ1ZX19XSxbImxpYnJhcnlfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9saWJyYXJ5X3JlZi5kYXJ0IiwsUix7CiAiXiI6IiIsCiBMVTp7Ci0iXiI6InhJO3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKLXN0YXRpYzp7ckE6ZnVuY3Rpb24oYSl7dmFyIHoseQorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCitzdGF0aWM6e1Y0OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuWjMuWkwoYSkKIEMuWjMuWEkoYSkKIHJldHVybiBhfX19fV0sWyJsaWJyYXJ5X3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2xpYnJhcnlfdmlldy5kYXJ0IiwsTSx7CiAiXiI6IiIsCiBDWDp7Ci0iXiI6IlYzMztpSSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzMztpSSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnSHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaUl9LAogc0h0OmZ1bmN0aW9uKGEsYil7YS5pST10aGlzLmN0KGEsQy5FVixhLmlJLGIpfSwKLXZWOltmdW5jdGlvbihhLGIpe3JldHVybiBKLmFUKGEuaUkpLmN2KEouZXcoSi5lUyhhLmlJKSwiL2V2YWw/ZXhwcj0iK1AualcoQy55RCxiLEMueE0sITEpKSl9LCIkMSIsImdabSIsMiwwLDEwNSwxMDZdLAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLmlJKS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAotajk6W2Z1bmN0aW9uKGEsYil7Si5lZyhhLmlJKS5ZTShiKX0sIiQxIiwiZ0RYIiwyLDAsMjAsOThdLAordlY6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEouYVQoYS5pSSkuY3YoSi5ldyhKLmVTKGEuaUkpLCIvZXZhbD9leHByPSIrUC5qVyhDLnlELGIsQy54TSwhMSkpKX0sIiQxIiwiZ1ptIiwyLDAsMTA2LDEwN10sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEuaUkpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCitqOTpbZnVuY3Rpb24oYSxiKXtKLmVnKGEuaUkpLllNKGIpfSwiJDEiLCJnRFgiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e2FzOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTUcuWkwoYSkKIEMuTUcuWEkoYSkKQEAgLTEyNjk1LDcgKzEyODM3LDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9fV0sWyJsb2dnaW5nIiwicGFja2FnZTpsb2dnaW5nL2xvZ2dpbmcuZGFydCIsLE4sewogIl4iOiIiLAotUnc6eworVEo6ewogIl4iOiJhO29jPixlVD4sbjIsQ2o+LGtzPixHcyIsCiBnQjg6ZnVuY3Rpb24oKXt2YXIgeix5LHgKIHo9dGhpcy5lVApAQCAtMTI3MjYsMzEgKzEyODY4LDMxIEBACiBOeTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kTChhLG51bGwsbnVsbCl9LAogWkc6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLlk2KEMuSUYsYSxiLGMpfSwKIFRvOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlpHKGEsbnVsbCxudWxsKX0sCi14SDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuWTYoQy5uVCxhLGIsYyl9LAotajI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueEgoYSxudWxsLG51bGwpfSwKK3dGOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gdGhpcy5ZNihDLm5ULGEsYixjKX0sCitqMjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy53RihhLG51bGwsbnVsbCl9LAogV0I6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLlk2KEMuY2QsYSxiLGMpfSwKIFlYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLldCKGEsbnVsbCxudWxsKX0sCiB0UTpmdW5jdGlvbigpe2lmKCQuUkx8fHRoaXMuZVQ9PW51bGwpe3ZhciB6PXRoaXMuR3MKIGlmKHo9PW51bGwpe3o9UC5iSyhudWxsLG51bGwsITAsTi5IVikKIHRoaXMuR3M9en16LnRvU3RyaW5nCi1yZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5LcCh6LDApXSl9ZWxzZSByZXR1cm4gTi5RTSgiIikudFEoKX0sCityZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5PcSh6LDApXSl9ZWxzZSByZXR1cm4gTi5RTSgiIikudFEoKX0sCiBjQjpmdW5jdGlvbihhKXt2YXIgej10aGlzLkdzCiBpZih6IT1udWxsKXtpZih6Lkd2Pj00KUgudmgoei5xNygpKQogei5JdihhKX19LAogUUw6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6PXRoaXMuZVQKIGlmKHohPW51bGwpSi5Ucih6KS51KDAsdGhpcy5vYyx0aGlzKX0sCi0kaXNSdzp0cnVlLAorJGlzVEo6dHJ1ZSwKIHN0YXRpYzp7Il4iOiJVaiIsUU06ZnVuY3Rpb24oYSl7cmV0dXJuICQuSXUoKS50bygwLGEsbmV3IE4uYU8oYSkpfX19LAogYU86ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuYQogaWYoQy54Qi5uQyh6LCIuIikpSC52aChQLnUoIm5hbWUgc2hvdWxkbid0IHN0YXJ0IHdpdGggYSAnLiciKSkKIHk9Qy54Qi5jbih6LCIuIikKIGlmKHk9PT0tMSl4PXohPT0iIj9OLlFNKCIiKTpudWxsCiBlbHNle3g9Ti5RTShDLnhCLk5qKHosMCx5KSkKLXo9Qy54Qi55bih6LHkrMSl9dz1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsTi5SdykKLXY9bmV3IE4uUncoeix4LG51bGwsdyxILlZNKG5ldyBRLkEyKHcpLFtudWxsLG51bGxdKSxudWxsKQorej1DLnhCLnluKHoseSsxKX13PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxOLlRKKQordj1uZXcgTi5USih6LHgsbnVsbCx3LEguVk0obmV3IFEuQTIodyksW251bGwsbnVsbF0pLG51bGwpCiB2LlFMKHoseCx3KQogcmV0dXJuIHZ9LAogJGlzRUg6dHJ1ZX0sCkBAIC0xMjc3NCwzNSArMTI5MTYsMzUgQEAKIGlmKHR5cGVvZiB6IT09Im51bWJlciIpcmV0dXJuIEgucyh6KQogcmV0dXJuIHRoaXMuUC16fSwKIGdpTzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm9jfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5vY30sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzcVY6dHJ1ZSwKIHN0YXRpYzp7Il4iOiJWN0ssdG1qLEVuayxMa08sdFksa0g4LGhsSyxNSEssZk0sbER1LHV4YyJ9fSwKIEhWOnsKICJeIjoiYTtPUjwsRzE+LGlKLEZsPCxjMCxrYz4sSTQ8IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJbIit0aGlzLk9SLm9jKyJdICIrdGhpcy5pSisiOiAiK3RoaXMuRzF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJbIit0aGlzLk9SLm9jKyJdICIrdGhpcy5pSisiOiAiK3RoaXMuRzF9LCIkMCIsImdBWSIsMCwwLDY5XSwKICRpc0hWOnRydWUsCiBzdGF0aWM6eyJeIjoieE8ifX19XSxbIiIsIm1haW4uZGFydCIsLEYsewogIl4iOiIiLAogRTI6ZnVuY3Rpb24oKXt2YXIgeix5CiBOLlFNKCIiKS5zT1IoQy5JRikKLU4uUU0oIiIpLmdTWigpLnlJKG5ldyBGLmU0MzMoKSkKK04uUU0oIiIpLmdTWigpLnlJKG5ldyBGLmU0NDcoKSkKIE4uUU0oIiIpLlRvKCJTdGFydGluZyBPYnNlcnZhdG9yeSIpCiBOLlFNKCIiKS5UbygiTG9hZGluZyBHb29nbGUgQ2hhcnRzIEFQSSIpCiB6PUouVVEoJC5TaSgpLCJnb29nbGUiKQogeT0kLkliKCkKIHouVjcoImxvYWQiLFsidmlzdWFsaXphdGlvbiIsIjEiLFAualQoUC5FRihbInBhY2thZ2VzIixbImNvcmVjaGFydCIsInRhYmxlIl0sImNhbGxiYWNrIixQLm10KHkuZ3Y2KHkpKV0sbnVsbCxudWxsKSldKQotJC5JYigpLk1NLm1sKEcudk4oKSkubWwobmV3IEYuZTQzNCgpKX0sCi1lNDMzOnsKLSJeIjoiVHA6MTYwOyIsCiskLkliKCkuTU0ubWwoRy52TigpKS5tbChuZXcgRi5lNDQ4KCkpfSwKK2U0NDc6eworIl4iOiJUcFo6MTYyOyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoKIGlmKEoueEMoYS5nT1IoKSxDLm5UKSl7ej1KLlJFKGEpCiBpZihKLmNvKHouZ0cxKGEpLCJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24iKSl6PUoueDUoei5nRzEoYSksIkNhbid0IGFzc2lnbiB0byBudWxsOiAiKT09PSEwfHxKLng1KHouZ0cxKGEpLCJFeHByZXNzaW9uIGlzIG5vdCBhc3NpZ25hYmxlOiAiKT09PSEwCiBlbHNlIHo9ITF9ZWxzZSB6PSExCiBpZih6KXJldHVybgotUC5GTChhLmdPUigpLm9jKyI6ICIrYS5nRmwoKS5idSgwKSsiOiAiK0guZChKLnoyKGEpKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTksImNhbGwiXSwKK1AuRkwoYS5nT1IoKS5vYysiOiAiK2EuZ0ZsKCkuYnUoMCkrIjogIitILmQoSi56MihhKSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTYxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLWU0MzQ6ewotIl4iOiJUcDoxMzsiLAorZTQ0ODp7CisiXiI6IlRwWjoxMzsiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseAogTi5RTSgiIikuVG8oIkluaXRpYWxpemluZyBQb2x5bWVyIikKIHRyeXtBLllLKCl9Y2F0Y2goeSl7eD1ILlJ1KHkpCkBAIC0xMjgxMSw3ICsxMjk1Myw3IEBACiAkaXNFSDp0cnVlfX1dLFsibmF2X2Jhcl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvbmF2X2Jhci5kYXJ0IiwsQSx7CiAiXiI6IiIsCiBtZDp7Ci0iXiI6IlYzNDtpNCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzNDtpNCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnaUM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaTR9LAogc2lDOmZ1bmN0aW9uKGEsYil7YS5pND10aGlzLmN0KGEsQy5ZcyxhLmk0LGIpfSwKIHN0YXRpYzp7RENpOmZ1bmN0aW9uKGEpe3ZhciB6LHkKQEAgLTEyODE5LDEwICsxMjk2MSwxMCBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLmk0PSEwCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmtELlpMKGEpCiBDLmtELlhJKGEpCkBAIC0xMjgzMSw3ICsxMjk3Myw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIEJtOnsKLSJeIjoiVjM1O0tVLFY0LEpvLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjM1O0tVLFY0LEpvLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdQajpmdW5jdGlvbihhKXtyZXR1cm4gYS5LVX0sCiBzUGo6ZnVuY3Rpb24oYSxiKXthLktVPXRoaXMuY3QoYSxDLmtWLGEuS1UsYil9LAogZ2RVOmZ1bmN0aW9uKGEpe3JldHVybiBhLlY0fSwKQEAgLTEyODQ1LDEwICsxMjk4NywxMCBAQAogYS5LVT0iIyIKIGEuVjQ9Ii0tLSIKIGEuSm89ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuSUcuWkwoYSkKIEMuSUcuWEkoYSkKQEAgLTEyODU3LDcgKzEyOTk5LDcgQEAKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogWWE6ewotIl4iOiJWMzY7S1UsVjQsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWMzY7S1UsVjQsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ1BqOmZ1bmN0aW9uKGEpe3JldHVybiBhLktVfSwKIHNQajpmdW5jdGlvbihhLGIpe2EuS1U9dGhpcy5jdChhLEMua1YsYS5LVSxiKX0sCiBnZFU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuVjR9LApAQCAtMTI4NjgsMTkgKzEzMDEwLDE5IEBACiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLktVPSIjIgogYS5WND0iLS0tIgotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5ubi5aTChhKQotQy5ubi5YSShhKQorQy5Oay5aTChhKQorQy5Oay5YSShhKQogcmV0dXJuIGF9fX0sCiBWMzY6ewogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBXdzp7Ci0iXiI6IlYzNztyVSxTQix6MixBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzNztyVSxTQix6MixBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnRlI6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuclV9LAogS2k6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ0ZSKGEpLiQwKCl9LAogTFk6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5nRlIoYSkuJDEoYil9LApAQCAtMTI4ODksMTAgKzEzMDMxLDEwIEBACiBzamw6ZnVuY3Rpb24oYSxiKXthLlNCPXRoaXMuY3QoYSxDLmFQLGEuU0IsYil9LAogZ3BoOmZ1bmN0aW9uKGEpe3JldHVybiBhLnoyfSwKIHNwaDpmdW5jdGlvbihhLGIpe2EuejI9dGhpcy5jdChhLEMuaGYsYS56MixiKX0sCi1XMTpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9YS5TQgorS3A6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6PWEuU0IKIGlmKHo9PT0hMClyZXR1cm4KIGEuU0I9dGhpcy5jdChhLEMuYVAseiwhMCkKLWlmKGEuclUhPW51bGwpdGhpcy5MWShhLHRoaXMuZ1dkKGEpKX0sIiQzIiwiZ3pZIiw2LDAsMTExLDEsMTAyLDEwM10sCitpZihhLnJVIT1udWxsKXRoaXMuTFkoYSx0aGlzLmdXZChhKSl9LCIkMyIsImd6WSIsNiwwLDExMiwxLDEwMywxMDRdLAogcmE6W2Z1bmN0aW9uKGEpe2EuU0I9dGhpcy5jdChhLEMuYVAsYS5TQiwhMSl9LCIkMCIsImdXZCIsMCwwLDE4XSwKIHN0YXRpYzp7WkM6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKQEAgLTEyOTAwLDMzICsxMzA0MiwzMyBAQAogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5TQj0hMQogYS56Mj0iUmVmcmVzaCIKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKLUMuSjcuWkwoYSkKLUMuSjcuWEkoYSkKK0MuWTYuWkwoYSkKK0MuWTYuWEkoYSkKIHJldHVybiBhfX19LAogVjM3OnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogeWU6ewotIl4iOiJ1TDtkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6InVMO3RCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIHN0YXRpYzp7VzE6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5wbC5aTChhKQogQy5wbC5YSShhKQogcmV0dXJuIGF9fX0sCiBHMTp7Ci0iXiI6IlYzODtKbyxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzODtKbyxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnclo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSm99LAogc3JaOmZ1bmN0aW9uKGEsYil7YS5Kbz10aGlzLmN0KGEsQy51ayxhLkpvLGIpfSwKIHN0YXRpYzp7Sjg6ZnVuY3Rpb24oYSl7dmFyIHoseQpAQCAtMTI5MzQsMTAgKzEzMDc2LDEwIEBACiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuSm89ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuT0tsLlpMKGEpCiBDLk9LbC5YSShhKQpAQCAtMTI5NDYsNyArMTMwODgsNyBAQAogIl4iOiJ1TCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBmbDp7Ci0iXiI6IlYzOTtKbyxpeSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlYzOTtKbyxpeSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnclo6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSm99LAogc3JaOmZ1bmN0aW9uKGEsYil7YS5Kbz10aGlzLmN0KGEsQy51ayxhLkpvLGIpfSwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5peX0sCkBAIC0xMjk2MSwxMCArMTMxMDMsMTAgQEAKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQogYS5Kbz0hMQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5SUmwuWkwoYSkKIEMuUlJsLlhJKGEpCkBAIC0xMjk3Myw3ICsxMzExNSw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFVLOnsKLSJeIjoiVjQwO1ZXLEpvLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQwO1ZXLEpvLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdIdDpmdW5jdGlvbihhKXtyZXR1cm4gYS5WV30sCiBzSHQ6ZnVuY3Rpb24oYSxiKXthLlZXPXRoaXMuY3QoYSxDLkVWLGEuVlcsYil9LAogZ3JaOmZ1bmN0aW9uKGEpe3JldHVybiBhLkpvfSwKQEAgLTEyOTgzLDEwICsxMzEyNSwxMCBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLkpvPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLmN0LlpMKGEpCiBDLmN0LlhJKGEpCkBAIC0xMjk5NSw3ICsxMzEzNyw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIHdNOnsKLSJeIjoiVjQxO0F1LEpvLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQxO0F1LEpvLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdSdTpmdW5jdGlvbihhKXtyZXR1cm4gYS5BdX0sCiBzUnU6ZnVuY3Rpb24oYSxiKXthLkF1PXRoaXMuY3QoYSxDLlhBLGEuQXUsYil9LAogZ3JaOmZ1bmN0aW9uKGEpe3JldHVybiBhLkpvfSwKQEAgLTEzMDA1LDI5ICsxMzE0NywyOSBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLkpvPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLkhSLlpMKGEpCi1DLkhSLlhJKGEpCitDLmljLlpMKGEpCitDLmljLlhJKGEpCiByZXR1cm4gYX19fSwKIFY0MTp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE5LOnsKLSJeIjoiVjQyO3J2LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQyO3J2LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdSazpmdW5jdGlvbihhKXtyZXR1cm4gYS5ydn0sCiBzUms6ZnVuY3Rpb24oYSxiKXthLnJ2PXRoaXMuY3QoYSxDLmxkLGEucnYsYil9LAogc3RhdGljOntYaWk6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5Nbi5aTChhKQogQy5Nbi5YSShhKQpAQCAtMTMwMzYsMjAgKzEzMTc4LDIwIEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFp4OnsKLSJeIjoiVjQzO3J2LFd4LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQzO3J2LFd4LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdSazpmdW5jdGlvbihhKXtyZXR1cm4gYS5ydn0sCiBzUms6ZnVuY3Rpb24oYSxiKXthLnJ2PXRoaXMuY3QoYSxDLmxkLGEucnYsYil9LAogZ0JrOmZ1bmN0aW9uKGEpe3JldHVybiBhLld4fSwKIHNCazpmdW5jdGlvbihhLGIpe2EuV3g9dGhpcy5jdChhLEMucDgsYS5XeCxiKX0sCi1jejpbZnVuY3Rpb24oYSxiLGMsZCl7Si5WMShhLnJ2LGEuV3gpfSwiJDMiLCJnVEEiLDYsMCwxNjEsMSwxMDIsMTAzXSwKLXN0YXRpYzp7ekM6ZnVuY3Rpb24oYSl7dmFyIHoseQorY3o6W2Z1bmN0aW9uKGEsYixjLGQpe0ouVjEoYS5ydixhLld4KX0sIiQzIiwiZ1RBIiw2LDAsMTYzLDEsMTAzLDEwNF0sCitzdGF0aWM6e093OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuTDguWkwoYSkKIEMuTDguWEkoYSkKQEAgLTEzMDU5LDI5ICsxMzIwMSwyOSBAQAogJGlzZDM6dHJ1ZX19XSxbIm9ic2VydmF0b3J5X2FwcGxpY2F0aW9uX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9vYnNlcnZhdG9yeV9hcHBsaWNhdGlvbi5kYXJ0IiwsVix7CiAiXiI6IiIsCiBGMTp7Ci0iXiI6IlY0NDtxQyxpNj0sQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDQ7cUMsaTY9LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd6ajpmdW5jdGlvbihhKXtyZXR1cm4gYS5xQ30sCiBzemo6ZnVuY3Rpb24oYSxiKXthLnFDPXRoaXMuY3QoYSxDLlZLLGEucUMsYil9LAogRXM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiBaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKLWlmKGEucUM9PT0hMCl7ej1uZXcgRy5tTChILlZNKFtdLFtHLnVHXSksbnVsbCxuZXcgRy5uZygiL3ZtIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwpLG51bGwsbnVsbCxudWxsLGEsbnVsbCxRLmNoKG51bGwsRC5NayksbnVsbCxudWxsKQoraWYoYS5xQz09PSEwKXt6PW5ldyBHLm1MKEguVk0oW10sW0cuT1NdKSxudWxsLG5ldyBHLm5nKCIvdm0iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCxudWxsLG51bGwsYSxudWxsLFEuY2gobnVsbCxELk1rKSxudWxsLG51bGwpCiB6LkUwKGEpCi1hLmk2PXp9ZWxzZXt6PUguVk0oW10sW0cudUddKQorYS5pNj16fWVsc2V7ej1ILlZNKFtdLFtHLk9TXSkKIHk9US5jaChudWxsLEQuTWspCiB4PW5ldyBHLm5EKG5ldyBHLnV0KCJ0YXJnZXRNYW5hZ2VyIiksUS5jaChudWxsLG51bGwpLG51bGwsbnVsbCxudWxsLG51bGwpCiB4LkZmKCkKIHk9bmV3IEcubUwoeixudWxsLG5ldyBHLm5nKCIvdm0iLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCksbnVsbCx4LG51bGwsYSxudWxsLHksbnVsbCxudWxsKQogeS5UeShhKQogYS5pNj15fX0sCi1zdGF0aWM6e0pUODpmdW5jdGlvbihhKXt2YXIgeix5CitzdGF0aWM6e2Z2OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEucUM9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuQkguWkwoYSkKIEMuQkguWEkoYSkKQEAgLTEzMDkxLDU3ICsxMzIzMyw1OSBAQAogJGlzZDM6dHJ1ZX19XSxbIm9ic2VydmF0b3J5X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9vYnNlcnZhdG9yeV9lbGVtZW50LmRhcnQiLCxaLHsKICJeIjoiIiwKIHVMOnsKLSJeIjoiWGZzO2RpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKLWdpNjpmdW5jdGlvbihhKXtyZXR1cm4gJC5tZn0sCisiXiI6Ilhmczt0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCitnaTY6ZnVuY3Rpb24oYSl7cmV0dXJuICQuS2h9LAorZ0t3OmZ1bmN0aW9uKGEpe3JldHVybiBKLnBQKHRoaXMuZ2k2KGEpLkVmKX0sCiBFczpmdW5jdGlvbihhKXtBLnpzLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKLXRoaXMuYVIoYSl9LAordGhpcy5UdChhKX0sCiB3TjpmdW5jdGlvbihhLGIsYyxkKXtBLnpzLnByb3RvdHlwZS53Ti5jYWxsKHRoaXMsYSxiLGMsZCl9LAogZFE6ZnVuY3Rpb24oYSl7QS56cy5wcm90b3R5cGUuZFEuY2FsbCh0aGlzLGEpCi10aGlzLkhxKGEpfSwKK3RoaXMuUTQoYSl9LAogZTE6ZnVuY3Rpb24oYSl7QS56cy5wcm90b3R5cGUuZTEuY2FsbCh0aGlzLGEpfSwKLWdNVDpmdW5jdGlvbihhKXtyZXR1cm4gYS5kaX0sCi1zTVQ6ZnVuY3Rpb24oYSxiKXthLmRpPXRoaXMuY3QoYSxDLk85LGEuZGksYil9LAorZ01UOmZ1bmN0aW9uKGEpe3JldHVybiBhLnRCfSwKK3NNVDpmdW5jdGlvbihhLGIpe2EudEI9dGhpcy5jdChhLEMuTzksYS50QixiKX0sCiB5WTpmdW5jdGlvbihhKXt9LAotTHE6W2Z1bmN0aW9uKGEsYil7aWYoYS5kaSE9bnVsbCl0aGlzLmFSKGEpCi1lbHNlIHRoaXMuSHEoYSl9LCIkMSIsImdqOCIsMiwwLDIwLDU3XSwKLWFSOmZ1bmN0aW9uKGEpe3ZhciB6Ci1pZihhLmRpPT1udWxsKXJldHVybgotej1hLm8xCitMcTpbZnVuY3Rpb24oYSxiKXtpZihhLnRCIT1udWxsKXRoaXMuVHQoYSkKK2Vsc2UgdGhpcy5RNChhKX0sIiQxIiwiZ2o4IiwyLDAsMjAsNTddLAorVHQ6ZnVuY3Rpb24oYSl7dmFyIHoKK2lmKGEudEI9PW51bGwpcmV0dXJuCit6PWEua1IKIGlmKHohPW51bGwpei5lZCgpCi1hLm8xPVAuclQoYS5kaSx0aGlzLmdXRShhKSl9LAotSHE6ZnVuY3Rpb24oYSl7dmFyIHo9YS5vMQorYS5rUj1QLnJUKGEudEIsdGhpcy5nd1ooYSkpfSwKK1E0OmZ1bmN0aW9uKGEpe3ZhciB6PWEua1IKIGlmKHohPW51bGwpei5lZCgpCi1hLm8xPW51bGx9LAotVEY6W2Z1bmN0aW9uKGEpe3ZhciB6CithLmtSPW51bGx9LAorTHU6W2Z1bmN0aW9uKGEpe3ZhciB6CiB0aGlzLnlZKGEpCi16PWEuZGkKLWlmKHo9PW51bGwpe3RoaXMuSHEoYSkKLXJldHVybn1hLm8xPVAuclQoeix0aGlzLmdXRShhKSl9LCIkMCIsImdXRSIsMCwwLDE4XSwKLXdXOltmdW5jdGlvbihhLGIsYyxkKXt0aGlzLmdpNihhKS5aNi5DeihiLGMsZCl9LCIkMyIsImdSaCIsNiwwLDE2MSwyLDEwMiwxMDNdLAotWEQ6W2Z1bmN0aW9uKGEsYil7dGhpcy5naTYoYSkuWjYKLXJldHVybiIjIitILmQoYil9LCIkMSIsImduMCIsMiwwLDE2MiwxNjNdLAotYTc6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEcubUcoYil9LCIkMSIsImdTcyIsMiwwLDE2NCwxNjVdLAorej1hLnRCCitpZih6PT1udWxsKXt0aGlzLlE0KGEpCityZXR1cm59YS5rUj1QLnJUKHosdGhpcy5nd1ooYSkpfSwiJDAiLCJnd1oiLDAsMCwxOF0sCitjRDpbZnVuY3Rpb24oYSxiLGMsZCl7dGhpcy5naTYoYSkuWjYuV1YoYixjLGQpfSwiJDMiLCJnUmgiLDYsMCwxNjMsMiwxMDMsMTA0XSwKK0tOOltmdW5jdGlvbihhLGIpe3RoaXMuZ2k2KGEpLlo2CityZXR1cm4iIyIrSC5kKGIpfSwiJDEiLCJnbjAiLDIsMCwxNjQsMTY1XSwKK2E3OltmdW5jdGlvbihhLGIpe3JldHVybiBHLm1HKGIpfSwiJDEiLCJnU3MiLDIsMCwxNjYsMTY3XSwKIFplOltmdW5jdGlvbihhLGIpe3JldHVybiBHLkFzKGIpfSwiJDEiLCJnYkoiLDIsMCwxNSwxNl0sCi11RzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJOdWxsIil9LCIkMSIsImdIaCIsMiwwLDE2NiwxNjddLAotaTU6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiRXJyb3IiKX0sIiQxIiwiZ2M5IiwyLDAsMTY2LDE2N10sCitCMzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5CVShiLG51bGwsbnVsbCl9LCIkMSIsImdYciIsMiwwLDEzNCwyMV0sCit1RzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJOdWxsIil9LCIkMSIsImdIaCIsMiwwLDE2OCwxNjldLAorTUk6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiRXJyb3IiKX0sIiQxIiwiZ2M5IiwyLDAsMTY4LDE2OV0sCiBPUDpbZnVuY3Rpb24oYSxiKXt2YXIgej1KLngoYikKLXJldHVybiB6Lm4oYiwiU21pIil8fHoubihiLCJNaW50Iil8fHoubihiLCJCaWdpbnQiKX0sIiQxIiwiZ1NPIiwyLDAsMTY2LDE2N10sCi1SVTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJCb29sIil9LCIkMSIsImdyOSIsMiwwLDE2NiwxNjddLAotemU6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiU3RyaW5nIil9LCIkMSIsImdPMCIsMiwwLDE2NiwxNjddLAotd206W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiSW5zdGFuY2UiKX0sIiQxIiwiZ25EIiwyLDAsMTY2LDE2N10sCi1KRzpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhiLCJEb3VibGUiKX0sIiQxIiwiZ3p4IiwyLDAsMTY2LDE2N10sCityZXR1cm4gei5uKGIsIlNtaSIpfHx6Lm4oYiwiTWludCIpfHx6Lm4oYiwiQmlnaW50Iil9LCIkMSIsImdTTyIsMiwwLDE2OCwxNjldLAorUlU6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiQm9vbCIpfSwiJDEiLCJncjkiLDIsMCwxNjgsMTY5XSwKK09qOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIlN0cmluZyIpfSwiJDEiLCJnTzAiLDIsMCwxNjgsMTY5XSwKK3dtOltmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGIsIkluc3RhbmNlIil9LCIkMSIsImduRCIsMiwwLDE2OCwxNjldLAorSkc6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiRG91YmxlIil9LCIkMSIsImd6eCIsMiwwLDE2OCwxNjldLAogQ3A6W2Z1bmN0aW9uKGEsYil7dmFyIHo9Si54KGIpCi1yZXR1cm4gei5uKGIsIkdyb3dhYmxlT2JqZWN0QXJyYXkiKXx8ei5uKGIsIkFycmF5Iil9LCIkMSIsImdLNCIsMiwwLDE2NiwxNjddLAotdFI6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiVHlwZSIpfSwiJDEiLCJncU4iLDIsMCwxNjYsMTY3XSwKLUFDOltmdW5jdGlvbihhLGIpe3JldHVybiFDLk5tLnRnKFsiTnVsbCIsIlNtaSIsIk1pbnQiLCJCaWdpbnQiLCJCb29sIiwiU3RyaW5nIiwiRG91YmxlIiwiSW5zdGFuY2UiLCJHcm93YWJsZU9iamVjdEFycmF5IiwiQXJyYXkiLCJUeXBlIiwiRXJyb3IiXSxiKX0sIiQxIiwiZ2VTIiwyLDAsMTY2LDE2N10sCityZXR1cm4gei5uKGIsIkdyb3dhYmxlT2JqZWN0QXJyYXkiKXx8ei5uKGIsIkFycmF5Iil9LCIkMSIsImdLNCIsMiwwLDE2OCwxNjldLAordFI6W2Z1bmN0aW9uKGEsYil7cmV0dXJuIEoueEMoYiwiVHlwZSIpfSwiJDEiLCJncU4iLDIsMCwxNjgsMTY5XSwKK0R6OltmdW5jdGlvbihhLGIpe3JldHVybiFDLk5tLnRnKFsiTnVsbCIsIlNtaSIsIk1pbnQiLCJCaWdpbnQiLCJCb29sIiwiU3RyaW5nIiwiRG91YmxlIiwiSW5zdGFuY2UiLCJHcm93YWJsZU9iamVjdEFycmF5IiwiQXJyYXkiLCJUeXBlIiwiRXJyb3IiXSxiKX0sIiQxIiwiZ2VTIiwyLDAsMTY4LDE2OV0sCiBzdGF0aWM6e0VFOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuUGZ6LlpMKGEpCiBDLlBmei5YSShhKQpAQCAtMTMxNjEsNyArMTMzMDUsNyBAQAogaWYoej09bnVsbCl7ej10aGlzLmdxdyhhKQogej1QLmJLKHRoaXMuZ3ltKGEpLHosITAsbnVsbCkKIGEuQVA9en16LnRvU3RyaW5nCi1yZXR1cm4gSC5WTShuZXcgUC5Jayh6KSxbSC5LcCh6LDApXSl9LAorcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guT3EoeiwwKV0pfSwKIGswOltmdW5jdGlvbihhKXt9LCIkMCIsImdxdyIsMCwwLDE4XSwKIGR0OltmdW5jdGlvbihhKXthLkFQPW51bGx9LCIkMCIsImd5bSIsMCwwLDE4XSwKIEhDOltmdW5jdGlvbihhKXt2YXIgeix5LHgKQEAgLTEzMTcxLDcgKzEzMzE1LDcgQEAKIHg9SC5WTShuZXcgUC5ZcCh6KSxbVC55al0pCiBpZih5Lkd2Pj00KUgudmgoeS5xNygpKQogeS5Jdih4KQotcmV0dXJuITB9cmV0dXJuITF9LCIkMCIsImdEeCIsMCwwLDEyMF0sCityZXR1cm4hMH1yZXR1cm4hMX0sIiQwIiwiZ0R4IiwwLDAsMTIxXSwKIGduejpmdW5jdGlvbihhKXt2YXIgeix5CiB6PWEuQVAKIGlmKHohPW51bGwpe3k9ei5pRQpAQCAtMTMxODgsNyArMTMzMzIsNyBAQAogJGlzeWo6dHJ1ZX0sCiBxSTp7CiAiXiI6InlqO1dBPixvYz4sakwseloiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIiM8UHJvcGVydHlDaGFuZ2VSZWNvcmQgIitILmQodGhpcy5vYykrIiBmcm9tOiAiK0guZCh0aGlzLmpMKSsiIHRvOiAiK0guZCh0aGlzLnpaKSsiPiJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIjPFByb3BlcnR5Q2hhbmdlUmVjb3JkICIrSC5kKHRoaXMub2MpKyIgZnJvbTogIitILmQodGhpcy5qTCkrIiB0bzogIitILmQodGhpcy56WikrIj4ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNxSTp0cnVlfX1dLFsib2JzZXJ2ZS5zcmMuZGlydHlfY2hlY2siLCJwYWNrYWdlOm9ic2VydmUvc3JjL2RpcnR5X2NoZWNrLmRhcnQiLCxPLHsKICJeIjoiIiwKIE4wOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcsdix1LHQscyxyLHEKQEAgLTEzMjA5LDcgKzEzMzUzLDcgQEAKIHY9ITB9JC5Pby5wdXNoKHQpfX19d2hpbGUoejwxMDAwJiZ2KQogaWYodyYmdil7dz0kLlM1KCkKIHcuajIoIlBvc3NpYmxlIGxvb3AgaW4gT2JzZXJ2YWJsZS5kaXJ0eUNoZWNrLCBzdG9wcGVkIGNoZWNraW5nLiIpCi1mb3Iocz1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSk7cy5HKCk7KXtyPXMubG8KK2ZvcihzPUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILk9xKHksMCldKTtzLkcoKTspe3I9cy5sbwogcT1KLlU2KHIpCiB3LmoyKCJJbiBsYXN0IGl0ZXJhdGlvbiBPYnNlcnZhYmxlIGNoYW5nZWQgYXQgaW5kZXggIitILmQocS50KHIsMCkpKyIsIG9iamVjdDogIitILmQocS50KHIsMSkpKyIuIil9fSQuYXg9JC5Pby5sZW5ndGgKICQuVGQ9ITF9LApAQCAtMTMyMTgsNDEgKzEzMzYyLDQxIEBACiB6PW5ldyBPLllDKHopCiByZXR1cm4gbmV3IFAueVEobnVsbCxudWxsLG51bGwsbnVsbCxuZXcgTy56SSh6KSxuZXcgTy5odyh6KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCl9LAogWUM6ewotIl4iOiJUcDoxNjg7YSIsCisiXiI6IlRwWjoxNzA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYQogaWYoei5hKXJldHVybgogei5hPSEwCiBhLlJLKGIsbmV3IE8uYVIoeikpfSwKICRpc0VIOnRydWV9LAogYVI6ewotIl4iOiJUcDo3MTthIiwKKyJeIjoiVHBaOjcyO2EiLAogJDA6W2Z1bmN0aW9uKCl7dGhpcy5hLmE9ITEKIE8uTjAoKX0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIHpJOnsKLSJeIjoiVHA6MzA7YiIsCisiXiI6IlRwWjozMDtiIiwKICQ0OltmdW5jdGlvbihhLGIsYyxkKXtpZihkPT1udWxsKXJldHVybiBkCiByZXR1cm4gbmV3IE8uSEYodGhpcy5iLGIsYyxkKX0sIiQ0IixudWxsLDgsMCxudWxsLDI3LDI4LDI5LDMxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEhGOnsKLSJeIjoiVHA6NzE7YyxkLGUsZiIsCisiXiI6IlRwWjo3MjtjLGQsZSxmIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYy4kMih0aGlzLmQsdGhpcy5lKQogcmV0dXJuIHRoaXMuZi4kMCgpfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogaHc6ewotIl4iOiJUcDoxNjk7VUkiLAorIl4iOiJUcFo6MTcxO1VJIiwKICQ0OltmdW5jdGlvbihhLGIsYyxkKXtpZihkPT1udWxsKXJldHVybiBkCi1yZXR1cm4gbmV3IE8uZjYodGhpcy5VSSxiLGMsZCl9LCIkNCIsbnVsbCw4LDAsbnVsbCwyNywyOCwyOSwzMSwiY2FsbCJdLAorcmV0dXJuIG5ldyBPLml1KHRoaXMuVUksYixjLGQpfSwiJDQiLG51bGwsOCwwLG51bGwsMjcsMjgsMjksMzEsImNhbGwiXSwKICRpc0VIOnRydWV9LAotZjY6ewotIl4iOiJUcDoxMztiSyxHcSxSbSx3MyIsCitpdTp7CisiXiI6IlRwWjoxMztiSyxHcSxSbSx3MyIsCiAkMTpbZnVuY3Rpb24oYSl7dGhpcy5iSy4kMih0aGlzLkdxLHRoaXMuUm0pCiByZXR1cm4gdGhpcy53My4kMShhKX0sIiQxIixudWxsLDIsMCxudWxsLDY1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsib2JzZXJ2ZS5zcmMubGlzdF9kaWZmIiwicGFja2FnZTpvYnNlcnZlL3NyYy9saXN0X2RpZmYuZGFydCIsLEcsewogIl4iOiIiLAogQjU6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0KIHo9Zi1lKzEKLXk9Si5ldyhKLmJJKGMsYiksMSkKK3k9Si5ldyhKLkhuKGMsYiksMSkKIHg9QXJyYXkoeikKIGZvcih3PXgubGVuZ3RoLHY9MDt2PHo7Kyt2KXtpZih0eXBlb2YgeSE9PSJudW1iZXIiKXJldHVybiBILnMoeSkKIHU9QXJyYXkoeSkKQEAgLTEzMjY1LDcgKzEzNDA5LDcgQEAKIHU9eFswXQogaWYodD49dS5sZW5ndGgpcmV0dXJuIEguZSh1LHQpCiB1W3RdPXR9Zm9yKHU9Si5RYyhiKSxzPUouVTYoYSksdj0xO3Y8ejsrK3YpZm9yKHI9di0xLHE9ZSt2LTEsdD0xO3Q8eTsrK3Qpe2lmKHE+Pj4wIT09cXx8cT49ZC5sZW5ndGgpcmV0dXJuIEguZShkLHEpCi1wPUoueEMoZFtxXSxzLnQoYSxKLmJJKHUuZyhiLHQpLDEpKSkKK3A9Si54QyhkW3FdLHMudChhLEouSG4odS5nKGIsdCksMSkpKQogbz14W3ZdCiBuPXhbcl0KIG09dC0xCkBAIC0xMzQwNiwzNyArMTM1NTAsMzcgQEAKIHg9cS5GdAogcD1QLkooeSxKLmV3KHgscS5MZCkpLVAueSh6LHgpCiBpZihwPj0wKXtDLk5tLlc0KGEscik7LS1yCi16PUouYkkocS5MZCxxLlZELkc0Lmxlbmd0aCkKK3o9Si5IbihxLkxkLHEuVkQuRzQubGVuZ3RoKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiBzLT16Ci16PUouZXcodS5MZCxKLmJJKHEuTGQscCkpCit6PUouZXcodS5MZCxKLkhuKHEuTGQscCkpCiB1LkxkPXoKIHk9dS5WRC5HNC5sZW5ndGgKIHg9cS5WRC5HNC5sZW5ndGgKIGlmKEoueEMoeiwwKSYmeSt4LXA9PT0wKXQ9ITAKIGVsc2V7bz1xLmVtCiBpZihKLnU2KHUuRnQscS5GdCkpe3o9dS5WRAotej16Lk11KHosMCxKLmJJKHEuRnQsdS5GdCkpCit6PXouTXUoeiwwLEouSG4ocS5GdCx1LkZ0KSkKIG8udG9TdHJpbmcKIGlmKHR5cGVvZiBvIT09Im9iamVjdCJ8fG89PT1udWxsfHwhIW8uZml4ZWQkbGVuZ3RoKUgudmgoUC5mKCJpbnNlcnRBbGwiKSkKIEguSUMobywwLHopfWlmKEouejgoSi5ldyh1LkZ0LHUuVkQuRzQubGVuZ3RoKSxKLmV3KHEuRnQscS5MZCkpKXt6PXUuVkQKLUouYmoobyx6Lk11KHosSi5iSShKLmV3KHEuRnQscS5MZCksdS5GdCksdS5WRC5HNC5sZW5ndGgpKX11LmVtPW8KK0ouYmoobyx6Lk11KHosSi5IbihKLmV3KHEuRnQscS5MZCksdS5GdCksdS5WRC5HNC5sZW5ndGgpKX11LmVtPW8KIHUuVkQ9cS5WRAogaWYoSi51NihxLkZ0LHUuRnQpKXUuRnQ9cS5GdAogdD0hMX19ZWxzZSBpZihKLnU2KHUuRnQscS5GdCkpe0MuTm0ueGUoYSxyLHUpOysrcgotbj1KLmJJKHUuTGQsdS5WRC5HNC5sZW5ndGgpCituPUouSG4odS5MZCx1LlZELkc0Lmxlbmd0aCkKIHEuRnQ9Si5ldyhxLkZ0LG4pCiBpZih0eXBlb2YgbiE9PSJudW1iZXIiKXJldHVybiBILnMobikKIHMrPW4KIHQ9ITB9ZWxzZSB0PSExfWlmKCF0KWEucHVzaCh1KX0sCiBoczpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9SC5WTShbXSxbRy5EQV0pCi1mb3IoeT1ILlZNKG5ldyBILmE3KGIsYi5sZW5ndGgsMCxudWxsKSxbSC5LcChiLDApXSk7eS5HKCk7KUcubTEoeix5LmxvKQorZm9yKHk9SC5WTShuZXcgSC5hNyhiLGIubGVuZ3RoLDAsbnVsbCksW0guT3EoYiwwKV0pO3kuRygpOylHLm0xKHoseS5sbykKIHJldHVybiB6fSwKIFFpOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1CiBpZihiLmxlbmd0aDw9MSlyZXR1cm4gYgogej1bXQotZm9yKHk9Ry5ocyhhLGIpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guS3AoeSwwKV0pLHg9YS5hbzt5LkcoKTspe3c9eS5sbworZm9yKHk9Ry5ocyhhLGIpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pLHg9YS5hbzt5LkcoKTspe3c9eS5sbwogaWYoSi54Qyh3LmdOZygpLDEpJiZ3LmdSdCgpLkc0Lmxlbmd0aD09PTEpe3Y9dy5nUnQoKS5HNAogaWYoMD49di5sZW5ndGgpcmV0dXJuIEguZSh2LDApCiB2PXZbMF0KQEAgLTEzNDUwLDE3ICsxMzU5NCwxNyBAQAogZ3ZIOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkZ0fSwKIGdSdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlZEfSwKIGdOZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLkxkfSwKLXZQOmZ1bmN0aW9uKGEpe3ZhciB6CitjazpmdW5jdGlvbihhKXt2YXIgegogaWYodHlwZW9mIGE9PT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWEpe3o9dGhpcy5GdAogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiB6PWE8en1lbHNlIHo9ITAKIGlmKHopcmV0dXJuITEKIGlmKCFKLnhDKHRoaXMuTGQsdGhpcy5WRC5HNC5sZW5ndGgpKXJldHVybiEwCiByZXR1cm4gSi51NihhLEouZXcodGhpcy5GdCx0aGlzLkxkKSl9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoseQorYnU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHo9IiM8TGlzdENoYW5nZVJlY29yZCBpbmRleDogIitILmQodGhpcy5GdCkrIiwgcmVtb3ZlZDogIgogeT10aGlzLlZECi1yZXR1cm4geit5LmJ1KHkpKyIsIGFkZGVkQ291bnQ6ICIrSC5kKHRoaXMuTGQpKyI+In0sCityZXR1cm4geit5LmJ1KHkpKyIsIGFkZGVkQ291bnQ6ICIrSC5kKHRoaXMuTGQpKyI+In0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzREE6dHJ1ZSwKIHN0YXRpYzp7SzY6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoKIGlmKGQ9PW51bGwpZD1bXQpAQCAtMTM0ODEsMTAgKzEzNjI1LDEwIEBACiBkMzp7CiAiXiI6ImE7Ujk6cm8lLFYyOmRVQyUsbWU6cHQlIiwKIGdxaDpmdW5jdGlvbihhKXt2YXIgegotaWYodGhpcy5nUjkoYSk9PW51bGwpe3o9dGhpcy5nbFooYSkKK2lmKHRoaXMuZ1I5KGEpPT1udWxsKXt6PXRoaXMuZ0ZXKGEpCiB0aGlzLnNSOShhLFAuYksodGhpcy5na2soYSkseiwhMCxudWxsKSl9ej10aGlzLmdSOShhKQogei50b1N0cmluZwotcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guS3AoeiwwKV0pfSwKK3JldHVybiBILlZNKG5ldyBQLklrKHopLFtILk9xKHosMCldKX0sCiBnbno6ZnVuY3Rpb24oYSl7dmFyIHoseQogaWYodGhpcy5nUjkoYSkhPW51bGwpe3o9dGhpcy5nUjkoYSkKIHk9ei5pRQpAQCAtMTM0OTUsMTEgKzEzNjM5LDExIEBACiBpZih6PT1udWxsKXt6PUguVk0oW10sW0YuZDNdKQogJC5Pbz16fXoucHVzaChhKQogJC5heD0kLmF4KzEKLXk9UC5MNShudWxsLG51bGwsbnVsbCxQLkdELFAuYSkKLWZvcih6PXRoaXMuZ2J4KGEpLHo9JC5tWCgpLk1lKDAseixuZXcgQS5XcSghMCwhMSwhMCxDLkZRLCExLCExLEMuQ2QsbnVsbCkpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl7eD1KLk82KHoubG8pCit5PVAuTDUobnVsbCxudWxsLG51bGwsUC5JTixQLmEpCitmb3Ioej10aGlzLmdieChhKSx6PSQubVgoKS5NZSgwLHosbmV3IEEuV3EoITAsITEsITAsQy5GUSwhMSwhMSxDLkNkLG51bGwpKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspe3g9Si5PNih6LmxvKQogdz0kLmNwKCkuZUEudCgwLHgpCiBpZih3PT1udWxsKUgudmgoTy5sQSgiZ2V0dGVyIFwiIitILmQoeCkrIlwiIGluICIrdGhpcy5idShhKSkpCi15LnUoMCx4LHcuJDEoYSkpfXRoaXMuc1YyKGEseSl9LCIkMCIsImdsWiIsMCwwLDE4XSwKK3kudSgwLHgsdy4kMShhKSl9dGhpcy5zVjIoYSx5KX0sIiQwIiwiZ0ZXIiwwLDAsMThdLAogTDU6W2Z1bmN0aW9uKGEpe2lmKHRoaXMuZ1YyKGEpIT1udWxsKXRoaXMuc1YyKGEsbnVsbCl9LCIkMCIsImdrayIsMCwwLDE4XSwKIEhDOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9e30KQEAgLTEzNTE4LDcgKzEzNjYyLDcgQEAKIHRoaXMuZ21lKGEpLnB1c2goYil9LAogJGlzZDM6dHJ1ZX0sCiBYNjp7Ci0iXiI6IlRwOjc5O2EsYiIsCisiXiI6IlRwWjo4MDthLGIiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuYgogeT0kLmNwKCkuakQoeixhKQpAQCAtMTM1MzUsMTQgKzEzNjc5LDE0IEBACiAiXiI6IlBpOyIsCiBnUDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5EQX0sCiBzUDpmdW5jdGlvbihhLGIpe3RoaXMuREE9Ri5XaSh0aGlzLEMubHMsdGhpcy5EQSxiKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iIzwiK25ldyBILmN1KEguYjcodGhpcyksbnVsbCkuYnUoMCkrIiB2YWx1ZTogIitILmQodGhpcy5EQSkrIj4ifX19XSxbIm9ic2VydmUuc3JjLm9ic2VydmFibGVfbGlzdCIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvb2JzZXJ2YWJsZV9saXN0LmRhcnQiLCxRLHsKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iIzwiK25ldyBILmN1KEgud08odGhpcyksbnVsbCkuYnUoMCkrIiB2YWx1ZTogIitILmQodGhpcy5EQSkrIj4ifSwiJDAiLCJnQVkiLDAsMCw2OV19fV0sWyJvYnNlcnZlLnNyYy5vYnNlcnZhYmxlX2xpc3QiLCJwYWNrYWdlOm9ic2VydmUvc3JjL29ic2VydmFibGVfbGlzdC5kYXJ0IiwsUSx7CiAiXiI6IiIsCiB3bjp7CiAiXiI6InVGVTtiM0AsaVQsYW8sQVAsZm4iLAogZ1FWOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5pVAotaWYoej09bnVsbCl7ej1QLmJLKG5ldyBRLk9BKHRoaXMpLG51bGwsITAsbnVsbCkKK2lmKHo9PW51bGwpe3o9UC5iSyhuZXcgUS54Yih0aGlzKSxudWxsLCEwLG51bGwpCiB0aGlzLmlUPXp9ei50b1N0cmluZwotcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guS3AoeiwwKV0pfSwKK3JldHVybiBILlZNKG5ldyBQLklrKHopLFtILk9xKHosMCldKX0sCiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hby5sZW5ndGh9LAogc0I6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuYW8KQEAgLTEzNTk2LDcgKzEzNzQwLDcgQEAKIHo9eD09bnVsbD96IT1udWxsOnghPT16fWVsc2Ugej0hMQogaWYoeiYmeT4wKXt6PXRoaXMuYW8KIEgueEYoeixiLHkpCi10aGlzLmlIKEcuSzYodGhpcyxiLHksSC5jMSh6LGIseSxudWxsKS5icigwKSkpfUguUWIodGhpcy5hbyxiLGMpfSwKK3RoaXMuaUgoRy5LNih0aGlzLGIseSxILmMxKHosYix5LG51bGwpLmJyKDApKSl9SC5uYSh0aGlzLmFvLGIsYyl9LAogaDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3CiB6PXRoaXMuYW8KIHk9ei5sZW5ndGgKQEAgLTEzNjU3LDcgKzEzODAxLDcgQEAKIEMuTm0uc0Ioeix4K3kpCiB3PXoubGVuZ3RoCiBILnFHKHosYit5LHcsdGhpcyxiKQotSC5RYih6LGIsYykKK0gubmEoeixiLGMpCiB0aGlzLk9uKHgsei5sZW5ndGgpCiB6PXRoaXMuaVQKIGlmKHohPW51bGwpe3c9ei5pRQpAQCAtMTM2OTIsNyArMTM4MzYsNyBAQAogeT1iPT09MAogdGhpcy5jdCh0aGlzLEMuYWkseix5KQogdGhpcy5jdCh0aGlzLEMublosIXosIXkpfSwKLUx1OltmdW5jdGlvbigpe3ZhciB6LHkseAorSnU6W2Z1bmN0aW9uKCl7dmFyIHoseSx4CiB6PXRoaXMuYjMKIGlmKHo9PW51bGwpcmV0dXJuITEKIHk9Ry5RaSh0aGlzLHopCkBAIC0xMzcwMyw3ICsxMzg0Nyw3IEBACiBpZih4JiZ5Lmxlbmd0aCE9PTApe3g9SC5WTShuZXcgUC5ZcCh5KSxbRy5EQV0pCiBpZih6Lkd2Pj00KUgudmgoei5xNygpKQogei5Jdih4KQotcmV0dXJuITB9cmV0dXJuITF9LCIkMCIsImdMNiIsMCwwLDEyMF0sCityZXR1cm4hMH1yZXR1cm4hMX0sIiQwIiwiZ0w2IiwwLDAsMTIxXSwKICRpc3duOnRydWUsCiBzdGF0aWM6e2NoOmZ1bmN0aW9uKGEsYil7dmFyIHo9SC5WTShbXSxbYl0pCiByZXR1cm4gSC5WTShuZXcgUS53bihudWxsLG51bGwseixudWxsLG51bGwpLFtiXSl9LFk1OmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwKQEAgLTEzNzI4LDcgKzEzODcyLDcgQEAKIG09cy1vCiBILnFHKGEsdyxuLHQsMCkKIGlmKG8hPT0wKXtILnFHKGEsbixtLGEsdSkKLUMuTm0uc0IoYSxtKX19ZWxzZXtvPUouYkkocCxxKQorQy5ObS5zQihhLG0pfX1lbHNle289Si5IbihwLHEpCiByPWEubGVuZ3RoCiBpZih0eXBlb2YgbyE9PSJudW1iZXIiKXJldHVybiBILnMobykKIGw9citvCkBAIC0xMzczOSwxNyArMTM4ODMsMTcgQEAKIHVGVTp7CiAiXiI6ImFyaytQaTsiLAogJGlzZDM6dHJ1ZX0sCi1PQTp7Ci0iXiI6IlRwOjcxO2EiLAoreGI6eworIl4iOiJUcFo6NzI7YSIsCiAkMDpmdW5jdGlvbigpe3RoaXMuYS5pVD1udWxsfSwKICRpc0VIOnRydWV9fV0sWyJvYnNlcnZlLnNyYy5vYnNlcnZhYmxlX21hcCIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvb2JzZXJ2YWJsZV9tYXAuZGFydCIsLFYsewogIl4iOiIiLAogeWE6ewogIl4iOiJ5ajtHMz4sakwselosYUMsdzUiLAotYnU6ZnVuY3Rpb24oYSl7dmFyIHoKK2J1OltmdW5jdGlvbihhKXt2YXIgegogaWYodGhpcy5hQyl6PSJpbnNlcnQiCiBlbHNlIHo9dGhpcy53NT8icmVtb3ZlIjoic2V0IgotcmV0dXJuIiM8TWFwQ2hhbmdlUmVjb3JkICIreisiICIrSC5kKHRoaXMuRzMpKyIgZnJvbTogIitILmQodGhpcy5qTCkrIiB0bzogIitILmQodGhpcy56WikrIj4ifSwKK3JldHVybiIjPE1hcENoYW5nZVJlY29yZCAiK3orIiAiK0guZCh0aGlzLkczKSsiIGZyb206ICIrSC5kKHRoaXMuakwpKyIgdG86ICIrSC5kKHRoaXMuelopKyI+In0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzeWE6dHJ1ZX0sCiBxQzp7CiAiXiI6IlBpO1pwLEFQLGZuIiwKQEAgLTEzNzYzLDYgKzEzOTA3LDcgQEAKIHJldHVybiB6LmdCKHopPT09MH0sCiBnb3I6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5acAogcmV0dXJuIHouZ0IoeikhPT0wfSwKK3g0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWnAueDQoMCxiKX0sCiB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWnAudCgwLGIpfSwKIHU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3CiB6PXRoaXMuQVAKQEAgLTEzNzk4LDcgKzEzOTQzLDcgQEAKIEYuV2kodGhpcyxDLlduLHksMCkKIHRoaXMuRzgoKX16LlYxKDApfSwKIGFOOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuWnAuYU4oMCxiKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIFAudlcodGhpcyl9LCIkMCIsImdBWSIsMCwwLDY5XSwKIEc4OmZ1bmN0aW9uKCl7dGhpcy5ucSh0aGlzLEguVk0obmV3IFQucUkodGhpcyxDLlNWLG51bGwsbnVsbCksW251bGxdKSkKIHRoaXMubnEodGhpcyxILlZNKG5ldyBULnFJKHRoaXMsQy5VcSxudWxsLG51bGwpLFtudWxsXSkpfSwKICRpc3FDOnRydWUsCkBAIC0xMzgxMCwxMiArMTM5NTUsMTIgQEAKIGVsc2UgeT0hIXouJGlzRm8/SC5WTShuZXcgVi5xQyhQLkw1KG51bGwsbnVsbCxudWxsLGIsYyksbnVsbCxudWxsKSxbYixjXSk6SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLGIsYyksbnVsbCxudWxsKSxbYixjXSkKIHJldHVybiB5fX19LAogelQ6ewotIl4iOiJUcDthIiwKLSQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sIiQyIixudWxsLDQsMCxudWxsLDc3LDIxLCJjYWxsIl0sCisiXiI6IlRwWjthIiwKKyQyOltmdW5jdGlvbihhLGIpe3RoaXMuYS51KDAsYSxiKX0sIiQyIixudWxsLDQsMCxudWxsLDc4LDIxLCJjYWxsIl0sCiAkaXNFSDp0cnVlLAotJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEsYil7cmV0dXJue2Z1bmM6IlZmViIsYXJnczpbYSxiXX19LHRoaXMuYSwicUMiKX19LAorJHNpZ25hdHVyZTpmdW5jdGlvbigpe3JldHVybiBILlhXKGZ1bmN0aW9uKGEsYil7cmV0dXJue2Z1bmM6ImxiIixhcmdzOlthLGJdfX0sdGhpcy5hLCJxQyIpfX0sCiBMbzp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuYQogei5ucSh6LEguVk0obmV3IFYueWEoYSxiLG51bGwsITEsITApLFtudWxsLG51bGxdKSl9LAogJGlzRUg6dHJ1ZX19XSxbIm9ic2VydmUuc3JjLm9ic2VydmVyX3RyYW5zZm9ybSIsInBhY2thZ2U6b2JzZXJ2ZS9zcmMvb2JzZXJ2ZXJfdHJhbnNmb3JtLmRhcnQiLCxZLHsKQEAgLTEzODQ4LDcgKzEzOTkzLDcgQEAKIEhqOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdgogaWYoYT09bnVsbClyZXR1cm4KIHo9YgotaWYodHlwZW9mIHo9PT0ibnVtYmVyIiYmTWF0aC5mbG9vcih6KT09PXope2lmKCEhSi54KGEpLiRpc1dPJiZKLko1KGIsMCkmJkoudTYoYixKLnE4KGEpKSlyZXR1cm4gSi5VUShhLGIpfWVsc2UgaWYoISFKLngoYikuJGlzR0Qpe3o9YQoraWYodHlwZW9mIHo9PT0ibnVtYmVyIiYmTWF0aC5mbG9vcih6KT09PXope2lmKCEhSi54KGEpLiRpc1dPJiZKLko1KGIsMCkmJkoudTYoYixKLnE4KGEpKSlyZXR1cm4gSi5VUShhLGIpfWVsc2UgaWYoISFKLngoYikuJGlzSU4pe3o9YQogeT1ILlJCKHosIiRpc0NvIixbUC5xVSxudWxsXSwiJGFzQ28iKQogaWYoIXkpe3o9YQogeT1ILlJCKHosIiRpc1owIixbUC5xVSxudWxsXSwiJGFzWjAiKQpAQCAtMTM4NjEsMTQgKzE0MDA2LDE0IEBACiB6PXguJDEoeikKIHJldHVybiB6fWNhdGNoKHcpe2lmKCEhSi54KEguUnUodykpLiRpc0pTKXt6PUouSmsoYSkKIHY9JC5tWCgpLkYxKHosQy5PVikKLWlmKCEodiE9bnVsbCYmdi5mWT09PUMuaFUmJiF2LkZvKSl0aHJvdyB3fWVsc2UgdGhyb3cgd319ej0kLllWKCkKK2lmKCEodiE9bnVsbCYmdi5mWT09PUMuaFUmJiF2LkZvKSl0aHJvdyB3fWVsc2UgdGhyb3cgd319ej0kLk5kKCkKIGlmKHoubUwoQy5EOCkpei5rUygiY2FuJ3QgZ2V0ICIrSC5kKGIpKyIgaW4gIitILmQoYSkpCiByZXR1cm59LAotaXU6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAorRVg6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogaWYoYT09bnVsbClyZXR1cm4hMQogej1iCiBpZih0eXBlb2Ygej09PSJudW1iZXIiJiZNYXRoLmZsb29yKHopPT09eil7aWYoISFKLngoYSkuJGlzV08mJkouSjUoYiwwKSYmSi51NihiLEoucTgoYSkpKXtKLmtXKGEsYixjKQotcmV0dXJuITB9fWVsc2UgaWYoISFKLngoYikuJGlzR0Qpe3o9YQorcmV0dXJuITB9fWVsc2UgaWYoISFKLngoYikuJGlzSU4pe3o9YQogeT1ILlJCKHosIiRpc0NvIixbUC5xVSxudWxsXSwiJGFzQ28iKQogaWYoIXkpe3o9YQogeT1ILlJCKHosIiRpc1owIixbUC5xVSxudWxsXSwiJGFzWjAiKQpAQCAtMTM4NzYsNyArMTQwMjEsNyBAQAogaWYoeil7Si5rVyhhLCQuTWcoKS5lcC50KDAsYiksYykKIHJldHVybiEwfXRyeXskLmNwKCkuQ3EoYSxiLGMpCiByZXR1cm4hMH1jYXRjaCh4KXtpZighIUoueChILlJ1KHgpKS4kaXNKUyl7ej1KLkprKGEpCi1pZighJC5tWCgpLlVLKHosQy5PVikpdGhyb3cgeH1lbHNlIHRocm93IHh9fXo9JC5ZVigpCitpZighJC5tWCgpLlVLKHosQy5PVikpdGhyb3cgeH1lbHNlIHRocm93IHh9fXo9JC5OZCgpCiBpZih6Lm1MKEMuRDgpKXoua1MoImNhbid0IHNldCAiK0guZChiKSsiIGluICIrSC5kKGEpKQogcmV0dXJuITF9LAogY0I6ZnVuY3Rpb24oYSl7YT1KLnJyKGEpCkBAIC0xMzkxMiw4ICsxNDA1Nyw4IEBACiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5PSy5sZW5ndGh9LAogZ2wwOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLk9LLmxlbmd0aD09PTB9LAogZ1B1OmZ1bmN0aW9uKCl7cmV0dXJuITB9LAotYnU6ZnVuY3Rpb24oYSl7aWYoIXRoaXMuZ1B1KCkpcmV0dXJuIjxpbnZhbGlkIHBhdGg+IgotcmV0dXJuIEguVk0obmV3IEguQTgodGhpcy5PSyxuZXcgTC5mNygpKSxbbnVsbCxudWxsXSkuelYoMCwiLiIpfSwKK2J1OltmdW5jdGlvbihhKXtpZighdGhpcy5nUHUoKSlyZXR1cm4iPGludmFsaWQgcGF0aD4iCityZXR1cm4gSC5WTShuZXcgSC5BOCh0aGlzLk9LLG5ldyBMLmY3KCkpLFtudWxsLG51bGxdKS56VigwLCIuIil9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2CiBpZihiPT1udWxsKXJldHVybiExCiBpZih0aGlzPT09YilyZXR1cm4hMApAQCAtMTM5MzgsNyArMTQwODMsNyBAQAogcmV0dXJuIDUzNjg3MDkxMSZ4KygoMTYzODMmeCk8PDE1Pj4+MCl9LAogVGw6ZnVuY3Rpb24oYSl7dmFyIHoseQogaWYoIXRoaXMuZ1B1KCkpcmV0dXJuCi1mb3Ioej10aGlzLk9LLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl7eT16LmxvCitmb3Ioej10aGlzLk9LLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOyl7eT16LmxvCiBpZihhPT1udWxsKXJldHVybgogYT1MLkhqKGEseSl9cmV0dXJuIGF9LAogckw6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKQEAgLTEzOTQ4LDcgKzE0MDkzLDcgQEAKIGZvcih4PTA7eDx5OysreCl7aWYoYT09bnVsbClyZXR1cm4hMQogaWYoeD49ei5sZW5ndGgpcmV0dXJuIEguZSh6LHgpCiBhPUwuSGooYSx6W3hdKX1pZih5Pj16Lmxlbmd0aClyZXR1cm4gSC5lKHoseSkKLXJldHVybiBMLml1KGEselt5XSxiKX0sCityZXR1cm4gTC5FWChhLHpbeV0sYil9LAogVlY6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdwogaWYoIXRoaXMuZ1B1KCl8fHRoaXMuT0subGVuZ3RoPT09MClyZXR1cm4KIHo9dGhpcy5PSwpAQCAtMTM5NjIsMTYgKzE0MTA3LDE2IEBACiBzdGF0aWM6e2hrOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKIGlmKCEhSi54KGEpLiRpc1dPKXt6PVAuRihhLCExLG51bGwpCiB5PW5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKQoteS4kYnVpbHRpblR5cGVJbmZvPVtILktwKHosMCldCit5LiRidWlsdGluVHlwZUluZm89W0guT3EoeiwwKV0KIGZvcig7eS5HKCk7KXt4PXkubG8KLWlmKCh0eXBlb2YgeCE9PSJudW1iZXIifHxNYXRoLmZsb29yKHgpIT09eCkmJiFKLngoeCkuJGlzR0QpdGhyb3cgSC5iKFAudSgiTGlzdCBtdXN0IGNvbnRhaW4gb25seSBpbnRzIGFuZCBTeW1ib2xzIikpfXJldHVybiBuZXcgTC5Udih6KX1pZihhPT1udWxsKWE9IiIKK2lmKCh0eXBlb2YgeCE9PSJudW1iZXIifHxNYXRoLmZsb29yKHgpIT09eCkmJiFKLngoeCkuJGlzSU4pdGhyb3cgSC5iKFAudSgiTGlzdCBtdXN0IGNvbnRhaW4gb25seSBpbnRzIGFuZCBTeW1ib2xzIikpfXJldHVybiBuZXcgTC5Udih6KX1pZihhPT1udWxsKWE9IiIKIHc9JC5oVygpLnQoMCxhKQogaWYodyE9bnVsbClyZXR1cm4gdwogaWYoIUwuY0IoYSkpcmV0dXJuICQuSnMoKQogdj1bXQogeT1KLnJyKGEpLnNwbGl0KCIuIikKIHU9bmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpCi11LiRidWlsdGluVHlwZUluZm89W0guS3AoeSwwKV0KK3UuJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcSh5LDApXQogZm9yKDt1LkcoKTspe3g9dS5sbwogaWYoSi54Qyh4LCIiKSljb250aW51ZQogdD1ILkJVKHgsMTAsbmV3IEwub3EoKSkKQEAgLTEzOTc5LDI1ICsxNDEyNCwyNSBAQAogeT0kLmhXKCkKIGlmKHkuWDU+PTEwMCl7eS50b1N0cmluZwogdT1uZXcgUC5pNSh5KQotdS4kYnVpbHRpblR5cGVJbmZvPVtILktwKHksMCldCit1LiRidWlsdGluVHlwZUluZm89W0guT3EoeSwwKV0KIHM9dS5nQSh1KQogaWYoIXMuRygpKUgudmgoSC5EVSgpKQogeS5SeigwLHMuZ2woKSl9eS51KDAsYSx3KQogcmV0dXJuIHd9fX0sCiBvcTp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJufSwKICRpc0VIOnRydWV9LAogZjc6ewotIl4iOiJUcDoxMzsiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc0dEPyQuTWcoKS5lcC50KDAsYSk6YX0sIiQxIixudWxsLDIsMCxudWxsLDE1MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNJTj8kLk1nKCkuZXAudCgwLGEpOmF9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNTUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogVFY6ewogIl4iOiJUdjtPSyIsCiBnUHU6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCiBzdGF0aWM6eyJeIjoicWEifX0sCi1ZSkc6ewotIl4iOiJUcDo3MTsiLAorRE9lOnsKKyJeIjoiVHBaOjcyOyIsCiAkMDpmdW5jdGlvbigpe3JldHVybiBuZXcgSC5WUigiXig/Oig/OlskX2EtekEtWl0rWyRfYS16QS1aMC05XSp8KD86WzAtOV18WzEtOV0rWzAtOV0rKSkpKD86XFwuKD86WyRfYS16QS1aXStbJF9hLXpBLVowLTldKnwoPzpbMC05XXxbMS05XStbMC05XSspKSkqJCIsSC52NCgiXig/Oig/OlskX2EtekEtWl0rWyRfYS16QS1aMC05XSp8KD86WzAtOV18WzEtOV0rWzAtOV0rKSkpKD86XFwuKD86WyRfYS16QS1aXStbJF9hLXpBLVowLTldKnwoPzpbMC05XXxbMS05XStbMC05XSspKSkqJCIsITEsITAsITEpLG51bGwsbnVsbCl9LAogJGlzRUg6dHJ1ZX0sCiB3dzp7CkBAIC0xNDAxMiw3ICsxNDE1Nyw3IEBACiBpZih6IT1udWxsKXt5PXoua1RkCiB5PXk9PW51bGw/dyE9bnVsbDp5IT09d31lbHNlIHk9ITAKIGlmKHkpe3o9bmV3IEwuekcodyxQLkdWKG51bGwsbnVsbCxudWxsLG51bGwpLG51bGwsbnVsbCwhMSkKLSQueEc9en16LnlqLnUoMCx0aGlzLmNYLHRoaXMpCiskLnhHPXp9ei5KRC51KDAsdGhpcy5jWCx0aGlzKQogdGhpcy5uZih6LmdUVCh6KSkKIHRoaXMueEU9bnVsbAogYnJlYWt9fX0sCkBAIC0xNDA2MSw3ICsxNDIwNiw3IEBACiB0RjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmhRKCExKX0sCiAkaXNZajp0cnVlfSwKIFp1OnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKIHJldHVybiB6LkdYIT1udWxsJiZ6LlNHKCl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCkBAIC0xNDA3NSw3ICsxNDIyMCw3IEBACiBNbTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMuR1guJDMoYSxiLGMpfSwKIGdhODpmdW5jdGlvbigpe3JldHVybiB0aGlzLkdYIT1udWxsfSwKIFRSOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5HWCE9bnVsbHx8dGhpcy5ncWMoKSl0aHJvdyBILmIoUC53KCJPYnNlcnZlciBoYXMgYWxyZWFkeSBiZWVuIG9wZW5lZC4iKSkKLWlmKFguT1MoYik+dGhpcy5nSW4oKSl0aHJvdyBILmIoUC51KCJjYWxsYmFjayBzaG91bGQgdGFrZSAiK3RoaXMuZ0luKCkrIiBvciBmZXdlciBhcmd1bWVudHMiKSkKK2lmKFguQ3ooYik+dGhpcy5nSW4oKSl0aHJvdyBILmIoUC51KCJjYWxsYmFjayBzaG91bGQgdGFrZSAiK3RoaXMuZ0luKCkrIiBvciBmZXdlciBhcmd1bWVudHMiKSkKIHRoaXMuR1g9YgogdGhpcy52QT1QLkoodGhpcy5nSW4oKSxYLlJJKGIpKQogdGhpcy5OSigwKQpAQCAtMTQxMDIsMTMgKzE0MjQ3LDEzIEBACiBILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSkudzAoeix5KX19LAogemM6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5BdyhhLGIsbnVsbCl9fSwKIHpHOnsKLSJeIjoiYTtrVGQseWosclMsSE4sb3AiLAotVFI6ZnVuY3Rpb24oYSxiKXt0aGlzLnlqLnUoMCxiLmdjWCgpLGIpCisiXiI6ImE7a1RkLEpELHJTLEhOLG9wIiwKK1RSOmZ1bmN0aW9uKGEsYil7dGhpcy5KRC51KDAsYi5nY1goKSxiKQogYi5uZih0aGlzLmdUVCh0aGlzKSl9LAogd2U6W2Z1bmN0aW9uKGEsYil7dmFyIHo9Si54KGIpCi1pZighIXouJGlzd24pdGhpcy53cShiLmdRVigpKQotaWYoISF6LiRpc2QzKXRoaXMud3Eoei5ncWgoYikpfSwiJDEiLCJnVFQiLDIsMCwxNzAsOTJdLAotd3E6ZnVuY3Rpb24oYSl7dmFyIHoseQoraWYoISF6LiRpc3duKXRoaXMua2woYi5nUVYoKSkKK2lmKCEhei4kaXNkMyl0aGlzLmtsKHouZ3FoKGIpKX0sIiQxIiwiZ1RUIiwyLDAsMTcyLDkzXSwKK2tsOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIGlmKHRoaXMuclM9PW51bGwpdGhpcy5yUz1QLllNKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIHo9dGhpcy5ITgogeT16IT1udWxsP3ouUnooMCxhKTpudWxsCkBAIC0xNDEyMCwzMyArMTQyNjUsMzMgQEAKIGlmKHo9PW51bGwpej1QLllNKG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIHRoaXMuSE49dGhpcy5yUwogdGhpcy5yUz16Ci1mb3IoeT10aGlzLnlqLHk9SC5WTShuZXcgUC5ybyh5KSxbSC5LcCh5LDApLEguS3AoeSwxKV0pLHg9eS5GYix3PUguS3AoeSwxKSx5PUguVk0obmV3IFAuWk0oeCxILlZNKFtdLFtQLm96XSkseC5xVCx4LmJiLG51bGwpLFtILktwKHksMCksd10pLHkuUWYoeCx3KTt5LkcoKTspe3Y9eS5nbCgpCi1pZih2LmdhOCgpKXYubmYodGhpcy5nVFQodGhpcykpfWZvcih5PXRoaXMuSE4seT15LmdVUSh5KSx5PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHkubDYpLHkuVDYpLFtILktwKHksMCksSC5LcCh5LDEpXSk7eS5HKCk7KXkubG8uZWQoKQorZm9yKHk9dGhpcy5KRCx5PUguVk0obmV3IFAucm8oeSksW0guT3EoeSwwKSxILk9xKHksMSldKSx4PXkuRmIsdz1ILk9xKHksMSkseT1ILlZNKG5ldyBQLlpNKHgsSC5WTShbXSxbUC5vel0pLHgucVQseC5iYixudWxsKSxbSC5PcSh5LDApLHddKSx5LlFmKHgsdyk7eS5HKCk7KXt2PXkuZ2woKQoraWYodi5nYTgoKSl2Lm5mKHRoaXMuZ1RUKHRoaXMpKX1mb3IoeT10aGlzLkhOLHk9eS5nVVEoeSkseT1ILlZNKG5ldyBILk1IKG51bGwsSi5tWSh5Lmw2KSx5LlQ2KSxbSC5PcSh5LDApLEguT3EoeSwxKV0pO3kuRygpOyl5LmxvLmVkKCkKIHRoaXMuSE49bnVsbH0sIiQwIiwiZ1RoIiwwLDAsMThdLAogdDk6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKLWZvcih6PXRoaXMueWosej1ILlZNKG5ldyBQLnJvKHopLFtILktwKHosMCksSC5LcCh6LDEpXSksej1QLkYoeiwhMSxILmlwKHosIm1XIiwwKSksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PXRoaXMuSkQsej1ILlZNKG5ldyBQLnJvKHopLFtILk9xKHosMCksSC5PcSh6LDEpXSksej1QLkYoeiwhMSxILmlwKHosIm1XIiwwKSksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXt5PXoubG8KIGlmKHkuZ2E4KCkpeS50RigpfXRoaXMub3A9ITAKLVAucmIodGhpcy5nVGgodGhpcykpfSwiJDEiLCJnQ1AiLDIsMCwyMCwxNzFdLAorUC5yYih0aGlzLmdUaCh0aGlzKSl9LCIkMSIsImdDUCIsMiwwLDIwLDE3M10sCiBzdGF0aWM6eyJeIjoieEciLFNFOmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej0kLnhHCiBpZih6IT1udWxsKXt5PXoua1RkCiB5PXk9PW51bGw/YiE9bnVsbDp5IT09Yn1lbHNlIHk9ITAKIGlmKHkpe3o9bmV3IEwuekcoYixQLkdWKG51bGwsbnVsbCxudWxsLG51bGwpLG51bGwsbnVsbCwhMSkKLSQueEc9en16LnlqLnUoMCxhLmNYLGEpCiskLnhHPXp9ei5KRC51KDAsYS5jWCxhKQogYS5uZih6LmdUVCh6KSl9fX19XSxbIm9ic2VydmUuc3JjLnRvX29ic2VydmFibGUiLCJwYWNrYWdlOm9ic2VydmUvc3JjL3RvX29ic2VydmFibGUuZGFydCIsLFIsewogIl4iOiIiLAogdEI6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseAogej1KLngoYSkKIGlmKCEhei4kaXNkMylyZXR1cm4gYQogaWYoISF6LiRpc1owKXt5PVYuQUIoYSxudWxsLG51bGwpCi16LmFOKGEsbmV3IFIuUWUoeSkpCit6LmFOKGEsbmV3IFIueXgoeSkpCiByZXR1cm4geX1pZighIXouJGlzUVYpe3o9ei5leihhLFIuRnQoKSkKIHg9US5jaChudWxsLG51bGwpCiB4LkZWKDAseikKIHJldHVybiB4fXJldHVybiBhfSwiJDEiLCJGdCIsMiwwLDEzLDIxXSwKLVFlOnsKLSJeIjoiVHA6Nzk7YSIsCi0kMjpbZnVuY3Rpb24oYSxiKXt0aGlzLmEudSgwLFIudEIoYSksUi50QihiKSl9LCIkMiIsbnVsbCw0LDAsbnVsbCwxMzAsNjQsImNhbGwiXSwKK3l4OnsKKyJeIjoiVHBaOjgwO2EiLAorJDI6W2Z1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxSLnRCKGEpLFIudEIoYikpfSwiJDIiLG51bGwsNCwwLG51bGwsMTMxLDY0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfX1dLFsicG9seW1lciIsInBhY2thZ2U6cG9seW1lci9wb2x5bWVyLmRhcnQiLCxBLHsKICJeIjoiIiwKIFlHOmZ1bmN0aW9uKGEsYixjKXtpZihhPT1udWxsfHwkLkFNKCk9PW51bGwpcmV0dXJuCkBAIC0xNDE3MywxMCArMTQzMTgsMTAgQEAKIHJldHVybiB5LkMxKHosIkNoYW5nZWQiKSYmIXkubih6LCJhdHRyaWJ1dGVDaGFuZ2VkIil9LCIkMSIsIkY0IiwyLDAsNjIsNjNdLAogQWQ6ZnVuY3Rpb24oYSxiKXskLkVqKCkudSgwLGEsYikKIEguR28oSi5VUSgkLlNpKCksIlBvbHltZXIiKSwiJGlzcjciKS5QTyhbYV0pfSwKLWg2OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKK3g5OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKIGlmKGE9PW51bGwpcmV0dXJuCiBkb2N1bWVudAotaWYoJC5qZygpPT09ITApYj1kb2N1bWVudC5oZWFkCitpZigkLkVwKCk9PT0hMCliPWRvY3VtZW50LmhlYWQKIHo9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiLG51bGwpCiBKLnQzKHosSi5kWShhKSkKIHk9YS5nZXRBdHRyaWJ1dGUoImVsZW1lbnQiKQpAQCAtMTQxOTksNyArMTQzNDQsNyBAQAogei5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJhdXRvLWJpbmRpbmctZGFydCIpCiB6LnNldEF0dHJpYnV0ZSgiZXh0ZW5kcyIsInRlbXBsYXRlIikKIEouVVEoJC5YWCgpLCJpbml0IikucVAoW10seikKLWZvcih5PUguVk0obmV3IEguYTcoYSw3OCwwLG51bGwpLFtILktwKGEsMCldKTt5LkcoKTspeS5sby4kMCgpfSwKK2Zvcih5PUguVk0obmV3IEguYTcoYSw3OCwwLG51bGwpLFtILk9xKGEsMCldKTt5LkcoKTspeS5sby4kMCgpfSwKIEpQOmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKIHo9JC5TaSgpCiBpZihKLlVRKHosIlBsYXRmb3JtIik9PW51bGwpdGhyb3cgSC5iKFAudygicGxhdGZvcm0uanMsIGRhcnRfc3VwcG9ydC5qcyBtdXN0IGJlIGxvYWRlZCBhdCB0aGUgdG9wIG9mIHlvdXIgYXBwbGljYXRpb24sIGJlZm9yZSBhbnkgb3RoZXIgc2NyaXB0cyBvciBIVE1MIGltcG9ydHMgdGhhdCB1c2UgcG9seW1lci4gUHV0dGluZyB0aGVzZSB0d28gc2NyaXB0IHRhZ3MgYXQgdGhlIHRvcCBvZiB5b3VyIDxoZWFkPiBlbGVtZW50IHNob3VsZCBhZGRyZXNzIHRoaXMgaXNzdWU6IDxzY3JpcHQgc3JjPVwicGFja2FnZXMvd2ViX2NvbXBvbmVudHMvcGxhdGZvcm0uanNcIj48L3NjcmlwdD4gYW5kICA8c2NyaXB0IHNyYz1cInBhY2thZ2VzL3dlYl9jb21wb25lbnRzL2RhcnRfc3VwcG9ydC5qc1wiPjwvc2NyaXB0Pi4iKSkKQEAgLTE0MjExLDcgKzE0MzU2LDcgQEAKIGlmKHc9PW51bGwpdGhyb3cgSC5iKFAudygicG9seW1lci5qcyBtdXN0IGV4cG9zZSBcInJlZ2lzdGVyXCIgZnVuY3Rpb24gb24gcG9seW1lci1lbGVtZW50IHRvIGVuYWJsZSBwb2x5bWVyLmRhcnQgdG8gaW50ZXJvcGVyYXRlLiIpKQogSi5rVygkLlhYKCksInJlZ2lzdGVyIixQLm10KG5ldyBBLmsyKHgsdykpKX0sCiBYUDp7Ci0iXiI6ImE7Rkw+LHQ1PixQMTwsb2M+LFE3PCxORjwsY0s+LGtLPCxCajwsUWssbEQsVWo+LFBTPCx0SSx0NCIsCisiXiI6ImE7Rkw+LHQ1PixYajwsb2M+LFE3PCxORjwsY0s+LGtLPCxCajwsUWssbEQsVWo+LFBTPCxrWCx0NCIsCiBnWmY6ZnVuY3Rpb24oKXt2YXIgeix5CiB6PUouRWgodGhpcy5GTCwidGVtcGxhdGUiKQogaWYoeiE9bnVsbCl5PUouTlEoISFKLngoeikuJGlzdnk/ejpNLlNCKHopKQpAQCAtMTQyMTksNyArMTQzNjQsNyBAQAogcmV0dXJuIHl9LAogQmE6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiBmb3Ioej1udWxsLHk9dGhpczt5IT1udWxsOyl7ej1KLlZzKEoubnEoeSkpLk1XLmdldEF0dHJpYnV0ZSgiZXh0ZW5kcyIpCi15PXkuZ1AxKCl9eD1kb2N1bWVudAoreT15LmdYaigpfXg9ZG9jdW1lbnQKIFcuQ3Qod2luZG93LHgsYSx0aGlzLnQ1LHopfSwKIEN3OmZ1bmN0aW9uKGEpe3ZhciB6PSQuS2MoKQogaWYoej09bnVsbClyZXR1cm4KQEAgLTE0MjM0LDcgKzE0Mzc5LDcgQEAKIHRoaXMuQmo9eX19ej10aGlzLnQ1CiB0aGlzLnBJKHopCiB4PUouVnModGhpcy5GTCkuTVcuZ2V0QXR0cmlidXRlKCJhdHRyaWJ1dGVzIikKLWlmKHghPW51bGwpZm9yKHk9Qy54Qi5Gcih4LCQuYVEoKSkseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSksdz10aGlzLm9jO3kuRygpOyl7dj1KLnJyKHkubG8pCitpZih4IT1udWxsKWZvcih5PUMueEIuRnIoeCwkLmFRKCkpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pLHc9dGhpcy5vYzt5LkcoKTspe3Y9Si5ycih5LmxvKQogaWYodj09PSIiKWNvbnRpbnVlCiB1PSQuTWcoKS5Oei50KDAsdikKIHQ9TC5oayhbdV0pCkBAIC0xNDI0OCw3ICsxNDM5Myw3IEBACiBpZihzPT1udWxsKXtzPVAuRmwobnVsbCxudWxsKQogdGhpcy5RNz1zfXMudSgwLHQscil9fSwKIHBJOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3Ci1mb3Ioej0kLm1YKCkuTWUoMCxhLEMuYWopLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl7eT16LmxvCitmb3Ioej0kLm1YKCkuTWUoMCxhLEMuYWopLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOyl7eT16LmxvCiB4PUouUkUoeSkKIGlmKHguZ1Y1KHkpPT09ITApY29udGludWUKIHc9dGhpcy5RNwpAQCAtMTQyNjMsMjMgKzE0NDA4LDIzIEBACiBWazpmdW5jdGlvbigpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAuYSkKIHRoaXMua0s9egoteT10aGlzLlAxCit5PXRoaXMuWGoKIGlmKHkhPW51bGwpei5GVigwLHkuZ2tLKCkpCiBKLlZzKHRoaXMuRkwpLmFOKDAsbmV3IEEuZVkodGhpcykpfSwKIFczOmZ1bmN0aW9uKGEpe0ouVnModGhpcy5GTCkuYU4oMCxuZXcgQS5CTyhhKSl9LAogTWk6ZnVuY3Rpb24oKXt2YXIgej10aGlzLkJnKCJsaW5rW3JlbD1zdHlsZXNoZWV0XSIpCiB0aGlzLlFrPXoKLWZvcih6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5NcCh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KUouTXAoei5sbyl9LAogZjY6ZnVuY3Rpb24oKXt2YXIgej10aGlzLkJnKCJzdHlsZVtwb2x5bWVyLXNjb3BlXSIpCiB0aGlzLmxEPXoKLWZvcih6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILktwKHosMCldKTt6LkcoKTspSi5NcCh6LmxvKX0sCitmb3Ioej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KUouTXAoei5sbyl9LAogT0w6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUsdCxzCiB6PXRoaXMuUWsKIHoudG9TdHJpbmcKIHk9SC5WTShuZXcgSC5VNSh6LG5ldyBBLlpHKCkpLFtudWxsXSkKIHg9dGhpcy5nWmYoKQogaWYoeCE9bnVsbCl7dz1QLnA5KCIiKQotZm9yKHo9SC5WTShuZXcgSC5NbyhKLm1ZKHkubDYpLHkuVDYpLFtILktwKHksMCldKSx2PXouT0k7ei5HKCk7KXt1PUEucTModi5nbCgpKQorZm9yKHo9SC5WTShuZXcgSC5NbyhKLm1ZKHkubDYpLHkuVDYpLFtILk9xKHksMCldKSx2PXouT0k7ei5HKCk7KXt1PUEucTModi5nbCgpKQogdD13LnZNKz10eXBlb2YgdT09PSJzdHJpbmciP3U6SC5kKHUpCiB3LnZNPXQrIlxuIn1pZih3LnZNLmxlbmd0aD4wKXtzPUouRG8odGhpcy5GTCkuY3JlYXRlRWxlbWVudCgic3R5bGUiLG51bGwpCiBKLnQzKHMsSC5kKHcpKQpAQCAtMTQyOTUsOSArMTQ0NDAsOSBAQAoga086ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdix1CiB6PVAucDkoIiIpCiB5PW5ldyBBLnVhKCJbcG9seW1lci1zY29wZT0iK2ErIl0iKQotZm9yKHg9dGhpcy5Rayx4LnRvU3RyaW5nLHg9SC5WTShuZXcgSC5VNSh4LHkpLFtudWxsXSkseD1ILlZNKG5ldyBILk1vKEoubVkoeC5sNikseC5UNiksW0guS3AoeCwwKV0pLHc9eC5PSTt4LkcoKTspe3Y9QS5xMyh3LmdsKCkpCitmb3IoeD10aGlzLlFrLHgudG9TdHJpbmcseD1ILlZNKG5ldyBILlU1KHgseSksW251bGxdKSx4PUguVk0obmV3IEguTW8oSi5tWSh4Lmw2KSx4LlQ2KSxbSC5PcSh4LDApXSksdz14Lk9JO3guRygpOyl7dj1BLnEzKHcuZ2woKSkKIHU9ei52TSs9dHlwZW9mIHY9PT0ic3RyaW5nIj92OkguZCh2KQotei52TT11KyJcblxuIn1mb3IoeD10aGlzLmxELHgudG9TdHJpbmcseT1ILlZNKG5ldyBILlU1KHgseSksW251bGxdKSx5PUguVk0obmV3IEguTW8oSi5tWSh5Lmw2KSx5LlQ2KSxbSC5LcCh5LDApXSkseD15Lk9JO3kuRygpOyl7dj1KLmRZKHguZ2woKSkKK3oudk09dSsiXG5cbiJ9Zm9yKHg9dGhpcy5sRCx4LnRvU3RyaW5nLHk9SC5WTShuZXcgSC5VNSh4LHkpLFtudWxsXSkseT1ILlZNKG5ldyBILk1vKEoubVkoeS5sNikseS5UNiksW0guT3EoeSwwKV0pLHg9eS5PSTt5LkcoKTspe3Y9Si5kWSh4LmdsKCkpCiB3PXoudk0rPXR5cGVvZiB2PT09InN0cmluZyI/djpILmQodikKIHoudk09dysiXG5cbiJ9cmV0dXJuIHoudk19LAogSjM6ZnVuY3Rpb24oYSxiKXt2YXIgegpAQCAtMTQzMDcsMTggKzE0NDUyLDE4IEBACiB6LnNldEF0dHJpYnV0ZSgiZWxlbWVudCIsSC5kKHRoaXMub2MpKyItIitiKQogcmV0dXJuIHp9LAogckg6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2Ci1mb3Ioej0kLkhOKCksej0kLm1YKCkuTWUoMCx0aGlzLnQ1LHopLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3ouRygpOyl7eT16LmxvCitmb3Ioej0kLlN6KCksej0kLm1YKCkuTWUoMCx0aGlzLnQ1LHopLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOyl7eT16LmxvCiBpZih0aGlzLmNLPT1udWxsKXRoaXMuY0s9UC5ZTShudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiB4PUouUkUoeSkKIHc9eC5nb2MoeSkKIHY9JC5NZygpLmVwLnQoMCx3KQogdz1KLlU2KHYpCi12PXcuTmoodiwwLEouYkkody5nQih2KSw3KSkKK3Y9dy5Oaih2LDAsSi5Ibih3LmdCKHYpLDcpKQogdGhpcy5jSy51KDAsTC5oayh2KSxbeC5nb2MoeSldKX19LAogSTk6ZnVuY3Rpb24oKXt2YXIgeix5LHgKLWZvcih6PSQubVgoKS5NZSgwLHRoaXMudDUsQy5Yayksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KXt5PXoubG8uZ0R2KCkKK2Zvcih6PSQubVgoKS5NZSgwLHRoaXMudDUsQy5UYiksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KXt5PXoubG8uZ0R2KCkKIHg9bmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpCi14LiRidWlsdGluVHlwZUluZm89W0guS3AoeSwwKV0KK3guJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcSh5LDApXQogZm9yKDt4LkcoKTspY29udGludWV9fSwKIFlsOmZ1bmN0aW9uKGEpe3ZhciB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxudWxsKQogYS5hTigwLG5ldyBBLlRqKHopKQpAQCAtMTQzMjYsMTkgKzE0NDcxLDE5IEBACiAkaXNYUDp0cnVlLAogc3RhdGljOnsiXiI6IktiIn19LAogWmQ6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc2hHfSwKICRpc0VIOnRydWV9LAogRGE6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBhLmd2bigpfSwKICRpc0VIOnRydWV9LAogZVk6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXtpZihDLm43Lng0KDAsYSkhPT0hMCYmIUouY28oYSwib24tIikpdGhpcy5hLmtLLnUoMCxhLGIpfSwKICRpc0VIOnRydWV9LAogQk86ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKIHo9Si5yWShhKQogaWYoei5uQyhhLCJvbi0iKSl7eT1KLlU2KGIpLmtKKGIsInt7IikKQEAgLTE0MzQ2LDE5ICsxNDQ5MSwxOSBAQAogaWYoeT49MCYmeD49MCl0aGlzLmEudSgwLHoueW4oYSwzKSxDLnhCLmJTKEMueEIuTmooYix5KzIseCkpKX19LAogJGlzRUg6dHJ1ZX0sCiBaRzp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVnMoYSkuTVcuaGFzQXR0cmlidXRlKCJwb2x5bWVyLXNjb3BlIikhPT0hMH0sCiAkaXNFSDp0cnVlfSwKIHVhOnsKLSJeIjoiVHA6MTM7YSIsCi0kMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5SRihhLHRoaXMuYSl9LAorIl4iOiJUcFo6MTM7YSIsCiskMTpmdW5jdGlvbihhKXtyZXR1cm4gSi5VdihhLHRoaXMuYSl9LAogJGlzRUg6dHJ1ZX0sCiBYVUc6ewotIl4iOiJUcDo3MTsiLAorIl4iOiJUcFo6NzI7IiwKICQwOmZ1bmN0aW9uKCl7cmV0dXJuW119LAogJGlzRUg6dHJ1ZX0sCiBUajp7Ci0iXiI6IlRwOjE3MjthIiwKKyJeIjoiVHBaOjE3NDthIiwKICQyOmZ1bmN0aW9uKGEsYil7dGhpcy5hLnUoMCxILmQoYSkudG9Mb3dlckNhc2UoKSxiKX0sCiAkaXNFSDp0cnVlfSwKIExpOnsKQEAgLTE0MzgzLDkgKzE0NTI4LDkgQEAKIHouYT14CiB3PUMuZkUudCgwLHgpCiB6LmE9dyE9bnVsbD93OnouYQotcmV0dXJuIG5ldyBBLmxpKHosdGhpcyxhKX19LAorcmV0dXJuIG5ldyBBLmxpeih6LHRoaXMsYSl9fSwKIGw1OnsKLSJeIjoiVHA6MTM7YSxiLGMsZCIsCisiXiI6IlRwWjoxMzthLGIsYyxkIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej10aGlzLmEKIHk9ei5hCkBAIC0xNDM5MywyMSArMTQ1MzgsMjEgQEAKIHouYT14CiB5PXh9aWYoISFKLngoeSkuJGlzenMpe3k9Si54KGEpCiBpZighIXkuJGlzUmIpe3c9eS5nZXl6KGEpCi1pZih3PT1udWxsKXc9Si5VUShQLkhVKGEpLCJkZXRhaWwiKX1lbHNlIHc9bnVsbAoraWYodz09bnVsbCl3PUouVVEoUC5YWShhKSwiZGV0YWlsIil9ZWxzZSB3PW51bGwKIHk9eS5nU2QoYSkKIHo9ei5hCiBKLmJIKHoseix0aGlzLmQsW2Esdyx5XSl9ZWxzZSB0aHJvdyBILmIoUC53KCJjb250cm9sbGVyICIrSC5kKHkpKyIgaXMgbm90IGEgRGFydCBwb2x5bWVyLWVsZW1lbnQuIikpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1saTp7Ci0iXiI6IlRwOjE3NjthLGIsYyIsCitsaXo6eworIl4iOiJUcFo6MTc4O2EsYixjIiwKICQzOltmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcKIHo9dGhpcy5jCiB5PXRoaXMuYi5ZMihudWxsLGIseikKIHg9Si5FaShiKS50KDAsdGhpcy5hLmEpCi13PUguVk0obmV3IFcuT3YoMCx4LkRLLHguUGgsVy5hRih5KSx4LlNnKSxbSC5LcCh4LDApXSkKK3c9SC5WTShuZXcgVy5PdigwLHguREsseC5QaCxXLmFGKHkpLHguU2cpLFtILk9xKHgsMCldKQogdy5aeigpCiBpZihjPT09ITApcmV0dXJuCi1yZXR1cm4gbmV3IEEuZDYodyx6KX0sIiQzIixudWxsLDYsMCxudWxsLDE3MywxNzQsMTc1LCJjYWxsIl0sCityZXR1cm4gbmV3IEEuZDYodyx6KX0sIiQzIixudWxsLDYsMCxudWxsLDE3NSwxNzYsMTc3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGQ2OnsKICJeIjoiWWo7SnEsRUQiLApAQCAtMTQ0MjAsMTYgKzE0NTY1LDE2IEBACiAiXiI6Im5kO3ZuPCIsCiAkaXNoRzp0cnVlfSwKIHhjOnsKLSJeIjoiT3Q7QVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJUUjA7QVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogWEk6ZnVuY3Rpb24oYSl7dGhpcy5QYShhKX0sCiBzdGF0aWM6e0c3OmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuS2kuWkwoYSkKIEMuS2kuWEkoYSkKQEAgLTE0NDQyLDcgKzE0NTg3LDcgQEAKICRpc2g0OnRydWUsCiAkaXNQWjp0cnVlLAogJGlzS1Y6dHJ1ZX0sCi1PdDp7CitUUjA6ewogIl4iOiJqcFIrUGk7IiwKICRpc2QzOnRydWV9LAogenM6ewpAQCAtMTQ0NTUsMjcgKzE0NjAwLDI3IEBACiB5PXRoaXMuZ1FnKGEpLk1XLmdldEF0dHJpYnV0ZSgiaXMiKQogcmV0dXJuIHk9PW51bGx8fHk9PT0iIj90aGlzLmdxbihhKTp5fSwKIFBhOmZ1bmN0aW9uKGEpe3ZhciB6LHkKLXo9dGhpcy5nQ24oYSkKK3o9dGhpcy5nbVNBKGEpCiBpZih6IT1udWxsJiZ6Lms4IT1udWxsKXt3aW5kb3cKIHk9IkF0dHJpYnV0ZXMgb24gIitILmQodGhpcy5nUlQoYSkpKyIgd2VyZSBkYXRhIGJvdW5kIHByaW9yIHRvIFBvbHltZXIgdXBncmFkaW5nIHRoZSBlbGVtZW50LiBUaGlzIG1heSByZXN1bHQgaW4gaW5jb3JyZWN0IGJpbmRpbmcgdHlwZXMuIgogaWYodHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiKWNvbnNvbGUud2Fybih5KX10aGlzLkVjKGEpCiB5PXRoaXMuZ00wKGEpCi1pZighSi54QygkLktzKCkudCgwLHkpLCEwKXx8JC5qZygpPT09ITApdGhpcy5yZihhKX0sCitpZighSi54QygkLktzKCkudCgwLHkpLCEwKXx8JC5FcCgpPT09ITApdGhpcy5yZihhKX0sCiBFYzpmdW5jdGlvbihhKXt2YXIgeix5CiBpZihhLklYIT1udWxsKXt3aW5kb3cKIHo9IkVsZW1lbnQgYWxyZWFkeSBwcmVwYXJlZDogIitILmQodGhpcy5nUlQoYSkpCiBpZih0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCIpY29uc29sZS53YXJuKHopCi1yZXR1cm59YS5TRD1QLkhVKGEpCityZXR1cm59YS5TRD1QLlhZKGEpCiB6PXRoaXMuZ1JUKGEpCiBhLklYPSQudkUoKS50KDAseikKIHRoaXMubnQoYSkKIHo9YS5XegotaWYoeiE9bnVsbCl7eT10aGlzLmdudShhKQoraWYoeiE9bnVsbCl7eT10aGlzLmdVYyhhKQogei50b1N0cmluZwotTC5BUi5wcm90b3R5cGUuVFIuY2FsbChKLngoeikseix5KX1pZihhLklYLmdRNygpIT1udWxsKXRoaXMuZ3FoKGEpLnlJKHRoaXMuZ3FZKGEpKQorTC5BUi5wcm90b3R5cGUuVFIuY2FsbChKLngoeikseix5KX1pZihhLklYLmdRNygpIT1udWxsKXRoaXMuZ3FoKGEpLnlJKHRoaXMuZ0dpKGEpKQogdGhpcy5aMihhKQogdGhpcy5mayhhKQotdGhpcy5VYyhhKX0sCit0aGlzLnFiKGEpfSwKIHJmOmZ1bmN0aW9uKGEpe2lmKGEucTEpcmV0dXJuCiBhLnExPSEwCiB0aGlzLk9oKGEsYS5JWCkKQEAgLTE0NDg0LDEwICsxNDYyOSwxMCBAQAogZTE6ZnVuY3Rpb24oYSl7fSwKIEVzOmZ1bmN0aW9uKGEpe2lmKGEuSVg9PW51bGwpdGhyb3cgSC5iKFAudygicG9seW1lckNyZWF0ZWQgd2FzIG5vdCBjYWxsZWQgZm9yIGN1c3RvbSBlbGVtZW50ICIrSC5kKHRoaXMuZ1JUKGEpKSsiLCB0aGlzIHNob3VsZCBub3JtYWxseSBiZSBkb25lIGluIHRoZSAuY3JlYXRlZCgpIGlmIFBvbHltZXIgaXMgdXNlZCBhcyBhIG1peGluLiIpKQogdGhpcy5vVyhhKQotaWYoIWEuWE4pe2EuWE49ITAKK2lmKCFhLm9HKXthLm9HPSEwCiB0aGlzLnJXKGEsbmV3IEEuYmwoYSkpfX0sCiBkUTpmdW5jdGlvbihhKXt0aGlzLmQ5KGEpfSwKLU9oOmZ1bmN0aW9uKGEsYil7aWYoYiE9bnVsbCl7dGhpcy5PaChhLGIuZ1AxKCkpCitPaDpmdW5jdGlvbihhLGIpe2lmKGIhPW51bGwpe3RoaXMuT2goYSxiLmdYaigpKQogdGhpcy5hSShhLEoubnEoYikpfX0sCiBhSTpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3CiB6PUouUkUoYikKQEAgLTE0NDk1LDE2ICsxNDY0MCwxNiBAQAogaWYoeSE9bnVsbCl7eD10aGlzLlRwKGEseSkKIHc9ei5nUWcoYikuTVcuZ2V0QXR0cmlidXRlKCJuYW1lIikKIGlmKHc9PW51bGwpcmV0dXJuCi1hLlh5LnUoMCx3LHgpfX0sCithLlpNLnUoMCx3LHgpfX0sCiBUcDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdQogaWYoYj09bnVsbClyZXR1cm4KIHo9dGhpcy5lcihhKQogeT10aGlzLmdVaihhKQogeD0hIUoueChiKS4kaXN2eT9iOk0uU0IoYikKLXc9Si5ZYih4LGEseT09bnVsbCYmSi5meCh4KT09bnVsbD9KLmR1KGEuSVgpOnkpCit3PUouTU8oeCxhLHk9PW51bGwmJkouZngoeCk9PW51bGw/Si5kdShhLklYKTp5KQogdj0kLnZIKCkudCgwLHcpCiB1PXYhPW51bGw/di5ndTIoKTp2Ci1hLlNhLnB1c2godSkKK2EuQ2MucHVzaCh1KQogei5hcHBlbmRDaGlsZCh3KQogdGhpcy5saihhLHopCiB1PSQuUG8oKQpAQCAtMTQ1MzAsNyArMTQ2NzUsNyBAQAogeD1KLngodikKIHU9Wi5aaChjLHcsKHgubih2LEMuRlEpfHx4Lm4odixDLmVQKSkmJnchPW51bGw/Si5Kayh3KTp2KQogaWYodT09bnVsbD93IT1udWxsOnUhPT13KXt5PXkuZ29jKHopCi0kLmNwKCkuQ3EoYSx5LHUpfX0sIiQyIiwiZ2hXIiw0LDAsMTc3XSwKKyQuY3AoKS5DcShhLHksdSl9fSwiJDIiLCJnaFciLDQsMCwxNzldLAogQjI6ZnVuY3Rpb24oYSxiKXt2YXIgej1hLklYLmdORigpCiBpZih6PT1udWxsKXJldHVybgogcmV0dXJuIHoudCgwLGIpfSwKQEAgLTE0NTUwLDcgKzE0Njk1LDcgQEAKIGlmKHo9PW51bGwpcmV0dXJuIEouRlMoTS5TQihhKSxiLGMsZCkKIGVsc2V7eT1KLlJFKHopCiB4PXkuZ29jKHopCi13PSQuTHUoKQordz0kLnpCKCkKIGlmKHcubUwoQy50NCkpdy5OeSgiYmluZFByb3BlcnR5OiBbIitILmQoYykrIl0gdG8gWyIrSC5kKHRoaXMuZ1JUKGEpKSsiXS5bIitILmQoeCkrIl0iKQogdz1KLlJFKGMpCiBpZih3LmdQKGMpPT1udWxsKXcuc1AoYywkLmNwKCkuakQoYSx4KSkKQEAgLTE0NTY4LDcgKzE0NzEzLDcgQEAKIFZ6OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJmKGEpfSwKIGdDZDpmdW5jdGlvbihhKXtyZXR1cm4gSi5DNShNLlNCKGEpKX0sCiBzQ2Q6ZnVuY3Rpb24oYSxiKXtKLm5DKE0uU0IoYSksYil9LAotZ0NuOmZ1bmN0aW9uKGEpe3JldHVybiBKLmZlKE0uU0IoYSkpfSwKK2dtU0E6ZnVuY3Rpb24oYSl7cmV0dXJuIEoucWIoTS5TQihhKSl9LAogZDk6ZnVuY3Rpb24oYSl7dmFyIHoseQogaWYoYS5Vaz09PSEwKXJldHVybgogJC5pWCgpLk55KCJbIitILmQodGhpcy5nUlQoYSkpKyJdIGFzeW5jVW5iaW5kQWxsIikKQEAgLTE0NTc4LDggKzE0NzIzLDggQEAKIHoudDYoMCx5LG51bGwpCiBhLm9xPXp9LAogQk06W2Z1bmN0aW9uKGEpe2lmKGEuVWs9PT0hMClyZXR1cm4KLUguYlEoYS5TYSx0aGlzLmdoYihhKSkKLWEuU2E9W10KK0guYlEoYS5DYyx0aGlzLmdoYihhKSkKK2EuQ2M9W10KIHRoaXMuVXEoYSkKIGEuVWs9ITB9LCIkMCIsImdKZyIsMCwwLDE4XSwKIG9XOmZ1bmN0aW9uKGEpe3ZhciB6CkBAIC0xNDU5NSwyNiArMTQ3NDAsMjYgQEAKIHg9bmV3IEwud3cobnVsbCxbXSx5LG51bGwsbnVsbCxudWxsKQogeC5XZj1bXQogYS5Xej14Ci1hLlNhLnB1c2goW3hdKQotZm9yKHk9SC5WTShuZXcgUC5mRyh6KSxbSC5LcCh6LDApXSksdz15LkZiLHk9SC5WTShuZXcgUC5FUSh3LHcuSWcoKSwwLG51bGwpLFtILktwKHksMCldKTt5LkcoKTspe3Y9eS5mRAorYS5DYy5wdXNoKFt4XSkKK2Zvcih5PUguVk0obmV3IFAuZkcoeiksW0guT3EoeiwwKV0pLHc9eS5GYix5PUguVk0obmV3IFAuRVEodyx3LklnKCksMCxudWxsKSxbSC5PcSh5LDApXSk7eS5HKCk7KXt2PXkuZkQKIHgueU4oYSx2KQogdGhpcy5ySihhLHYsdi5UbChhKSxudWxsKX19fSwKLUZROltmdW5jdGlvbihhLGIsYyxkKXtKLk1lKGMsbmV3IEEucXooYSxiLGMsZCxKLkpSKGEuSVgpLFAuUmQobnVsbCxudWxsLG51bGwsbnVsbCkpKX0sIiQzIiwiZ251Iiw2LDAsMTc4XSwKK0ZROltmdW5jdGlvbihhLGIsYyxkKXtKLk1lKGMsbmV3IEEuTjQoYSxiLGMsZCxKLkpSKGEuSVgpLFAuUmQobnVsbCxudWxsLG51bGwsbnVsbCkpKX0sIiQzIiwiZ1VjIiw2LDAsMTgwXSwKIEhUOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKIGZvcih6PUoubVkoYik7ei5HKCk7KXt5PXouZ2woKQogaWYoIUoueCh5KS4kaXNxSSljb250aW51ZQogeD15Lm9jCiB3PSQuTWcoKS5lcC50KDAseCkKIHY9YS5JWC5nQmooKQotaWYodiE9bnVsbCYmdi50ZygwLHcpKXRoaXMuSlkoYSx3KX19LCIkMSIsImdxWSIsMiwwLDE3OSwxNzFdLAoraWYodiE9bnVsbCYmdi50ZygwLHcpKXRoaXMuSlkoYSx3KX19LCIkMSIsImdHaSIsMiwwLDE4MSwxNzNdLAogcko6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdgogej1KLkpSKGEuSVgpCiBpZih6PT1udWxsKXJldHVybgogeT16LnQoMCxiKQogaWYoeT09bnVsbClyZXR1cm4KLWlmKCEhSi54KGQpLiRpc3duKXt4PSQuYnQoKQoraWYoISFKLngoZCkuJGlzd24pe3g9JC5kbk8oKQogaWYoeC5tTChDLnQ0KSl4Lk55KCJbIitILmQodGhpcy5nUlQoYSkpKyJdIG9ic2VydmVBcnJheVZhbHVlOiB1bnJlZ2lzdGVyICIrSC5kKGIpKQotdGhpcy5pUShhLEguZChiKSsiX19hcnJheSIpfWlmKCEhSi54KGMpLiRpc3duKXt4PSQuYnQoKQordGhpcy5pUShhLEguZChiKSsiX19hcnJheSIpfWlmKCEhSi54KGMpLiRpc3duKXt4PSQuZG5PKCkKIGlmKHgubUwoQy50NCkpeC5OeSgiWyIrSC5kKHRoaXMuZ1JUKGEpKSsiXSBvYnNlcnZlQXJyYXlWYWx1ZTogcmVnaXN0ZXIgIitILmQoYikpCiB3PWMuZ1FWKCkudzQoITEpCiB3LnBzKG5ldyBBLlkwKGEsZCx5KSkKQEAgLTE0NjIyLDExICsxNDc2NywxMSBAQAogdy55NShudWxsKQogeD1ILmQoYikrIl9fYXJyYXkiCiB2PWEucTkKLWlmKHY9PW51bGwpe3Y9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFAuTU8pCitpZih2PT1udWxsKXt2PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxQLnlYKQogYS5xOT12fXYudSgwLHgsdyl9fSwKLXJCOltmdW5jdGlvbihhLGIpe3ZhciB6LHkKK2R2cTpbZnVuY3Rpb24oYSxiKXt2YXIgeix5CiBmb3Ioej1KLm1ZKGIpO3ouRygpOyl7eT16LmdsKCkKLWlmKHkhPW51bGwpSi55ZCh5KX19LCIkMSIsImdoYiIsMiwwLDE4MF0sCitpZih5IT1udWxsKUoueWQoeSl9fSwiJDEiLCJnaGIiLDIsMCwxODJdLAogaVE6ZnVuY3Rpb24oYSxiKXt2YXIgej1hLnE5LlJ6KDAsYikKIGlmKHo9PW51bGwpcmV0dXJuITEKIHouZWQoKQpAQCAtMTQ2MzQsMTAgKzE0Nzc5LDEwIEBACiBVcTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PWEucTkKIGlmKHo9PW51bGwpcmV0dXJuCi1mb3Ioej16LmdVUSh6KSx6PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHoubDYpLHouVDYpLFtILktwKHosMCksSC5LcCh6LDEpXSk7ei5HKCk7KXt5PXoubG8KK2Zvcih6PXouZ1VRKHopLHo9SC5WTShuZXcgSC5NSChudWxsLEoubVkoei5sNiksei5UNiksW0guT3EoeiwwKSxILk9xKHosMSldKTt6LkcoKTspe3k9ei5sbwogaWYoeSE9bnVsbCl5LmVkKCl9YS5xOS5WMSgwKQogYS5xOT1udWxsfSwKLVVjOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3FiOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9YS5JWC5nUFMoKQogaWYoei5nbDAoeikpcmV0dXJuCiB5PSQuYXkoKQpAQCAtMTQ2NzAsMjEgKzE0ODE1LDIxIEBACiAkaXNQWjp0cnVlLAogJGlzS1Y6dHJ1ZX0sCiBibDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7cmV0dXJufSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogU3Y6ewotIl4iOiJUcDo3OTthIiwKKyJeIjoiVHBaOjgwO2EiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgej1KLlZzKHRoaXMuYSkKIGlmKHoueDQoMCxhKSE9PSEwKXoudSgwLGEsbmV3IEEuVGU0KGIpLiQwKCkpCiB6LnQoMCxhKX0sCiAkaXNFSDp0cnVlfSwKIFRlNDp7Ci0iXiI6IlRwOjcxO2IiLAorIl4iOiJUcFo6NzI7YiIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ9LAogJGlzRUg6dHJ1ZX0sCi1xejp7Ci0iXiI6IlRwOjc5O2EsYixjLGQsZSxmIiwKK040OnsKKyJeIjoiVHBaOjgwO2EsYixjLGQsZSxmIiwKICQyOltmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAKIHo9dGhpcy5iCiB5PUouVVEoeixhKQpAQCAtMTQ3MDAsMjYgKzE0ODQ1LDI2IEBACiBmb3Iodz1KLm1ZKHUpLHQ9dGhpcy5hLHM9Si5SRSh0KSxyPXRoaXMuYyxxPXRoaXMuZjt3LkcoKTspe3A9dy5nbCgpCiBpZighcS5oKDAscCkpY29udGludWUKIHMuckoodCx2LHksYikKLSQuY3AoKS5Dayh0LHAsW2IseSx6LHIseF0sITAsbnVsbCl9fSwiJDIiLG51bGwsNCwwLG51bGwsOTMsNTcsImNhbGwiXSwKKyQuY3AoKS5Dayh0LHAsW2IseSx6LHIseF0sITAsbnVsbCl9fSwiJDIiLG51bGwsNCwwLG51bGwsOTQsNTcsImNhbGwiXSwKICRpc0VIOnRydWV9LAogWTA6ewotIl4iOiJUcDoxMzthLGIsYyIsCisiXiI6IlRwWjoxMzthLGIsYyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIGZvcih6PUoubVkodGhpcy5jKSx5PXRoaXMuYSx4PXRoaXMuYjt6LkcoKTspe3c9ei5nbCgpCi0kLmNwKCkuQ2soeSx3LFt4XSwhMCxudWxsKX19LCIkMSIsbnVsbCwyLDAsbnVsbCwxODEsImNhbGwiXSwKKyQuY3AoKS5Dayh5LHcsW3hdLCEwLG51bGwpfX0sIiQxIixudWxsLDIsMCxudWxsLDE4MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBTWDp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9dGhpcy5hCiB5PUouRWkoeikudCgwLGEpCi1ILlZNKG5ldyBXLk92KDAseS5ESyx5LlBoLFcuYUYoSi5kdSh6LklYKS5ZMih6LHosYikpLHkuU2cpLFtILktwKHksMCldKS5aeigpfSwKK0guVk0obmV3IFcuT3YoMCx5LkRLLHkuUGgsVy5hRihKLmR1KHouSVgpLlkyKHoseixiKSkseS5TZyksW0guT3EoeSwwKV0pLlp6KCl9LAogJGlzRUg6dHJ1ZX0sCiBsSzp7CiAiXiI6IllqO0k2LGlVLHEwLEpxLGRZIiwKIEFCOltmdW5jdGlvbihhKXt0aGlzLmRZPWEKICQuY3AoKS5DcSh0aGlzLkk2LHRoaXMuaVUsYSl9LCIkMSIsImdhcCIsMiwwLDIwLDU4XSwKLWhvOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CitIWDpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogZm9yKHo9Si5tWShhKSx5PXRoaXMuaVU7ei5HKCk7KXt4PXouZ2woKQogaWYoISFKLngoeCkuJGlzcUkmJkoueEMoeC5vYyx5KSl7ej10aGlzLkk2CiB3PSQuY3AoKS5lQS50KDAseSkKQEAgLTE0NzI3LDcgKzE0ODcyLDcgQEAKIHY9dy4kMSh6KQogej10aGlzLmRZCiBpZih6PT1udWxsP3YhPW51bGw6eiE9PXYpSi50YSh0aGlzLnEwLHYpCi1yZXR1cm59fX0sIiQxIiwiZ1hRIiwyLDAsMTc5LDE3MV0sCityZXR1cm59fX0sIiQxIiwiZ1hRIiwyLDAsMTgxLDE3M10sCiBUUjpmdW5jdGlvbihhLGIpe3JldHVybiBKLm11KHRoaXMucTAsYil9LAogZ1A6ZnVuY3Rpb24oYSl7cmV0dXJuIEouVm0odGhpcy5xMCl9LAogc1A6ZnVuY3Rpb24oYSxiKXtKLnRhKHRoaXMucTAsYikKQEAgLTE0NzUzLDM2ICsxNDg5OCwzNiBAQAogaWYoeiE9bnVsbCl7ei5lZCgpCiB0aGlzLmloPW51bGx9fX0sCiBLMzp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCiBpZih6LmloIT1udWxsfHx6LmxTIT1udWxsKXt6Lm5ZKDApCiB6LldzKCl9cmV0dXJufSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogbVM6ewotIl4iOiJUcDo3MTsiLAorIl4iOiJUcFo6NzI7IiwKICQwOltmdW5jdGlvbigpe3JldHVybiBBLlgxKCQuTTYsJC5VRyl9LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBocDp7Ci0iXiI6IlRwOjcxOyIsCisiXiI6IlRwWjo3MjsiLAogJDA6W2Z1bmN0aW9uKCl7dmFyIHo9JC5pRigpLk1NCiBpZih6Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCiB6Lk9IKG51bGwpCiByZXR1cm59LCIkMCIsbnVsbCwwLDAsbnVsbCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBrMjp7Ci0iXiI6IlRwOjE4NDthLGIiLAorIl4iOiJUcFo6MTg2O2EsYiIsCiAkMzpbZnVuY3Rpb24oYSxiLGMpe3ZhciB6PSQuRWooKS50KDAsYikKIGlmKHohPW51bGwpcmV0dXJuIHRoaXMuYS5HcihuZXcgQS56UihhLGIseiwkLnZFKCkudCgwLGMpKSkKLXJldHVybiB0aGlzLmIucVAoW2IsY10sYSl9LCIkMyIsbnVsbCw2LDAsbnVsbCwxODIsNTYsMTgzLCJjYWxsIl0sCityZXR1cm4gdGhpcy5iLnFQKFtiLGNdLGEpfSwiJDMiLG51bGwsNiwwLG51bGwsMTg0LDU2LDE4NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB6Ujp7Ci0iXiI6IlRwOjcxO2MsZCxlLGYiLAorIl4iOiJUcFo6NzI7YyxkLGUsZiIsCiAkMDpbZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqCiB6PXRoaXMuYwogeT10aGlzLmQKIHg9dGhpcy5lCiB3PXRoaXMuZgotdj0kLlJzKCkKK3Y9JC5yaygpCiB1PVAuRmwobnVsbCxudWxsKQogdD1uZXcgQS5YUCh6LHgsdyx5LG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsdix1LG51bGwsbnVsbCkKICQudkUoKS51KDAseSx0KQpAQCAtMTQ3OTcsNyArMTQ5NDIsNyBAQAogdC5NaSgpCiB0LmY2KCkKIHQuT0woKQotQS5oNih0LkozKHQua08oImdsb2JhbCIpLCJnbG9iYWwiKSxkb2N1bWVudC5oZWFkKQorQS54OSh0LkozKHQua08oImdsb2JhbCIpLCJnbG9iYWwiKSxkb2N1bWVudC5oZWFkKQogdC5Ddyh6KQogdC5WaygpCiB0LlczKHUpCkBAIC0xNDgzMCwzNiArMTQ5NzUsMzYgQEAKIHJldHVybn0sIiQwIixudWxsLDAsMCxudWxsLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIE1kOnsKLSJeIjoiVHA6NzE7IiwKLSQwOmZ1bmN0aW9uKCl7dmFyIHo9Si5VUShQLkhVKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBvbHltZXItZWxlbWVudCIsbnVsbCkpLCJfX3Byb3RvX18iKQotcmV0dXJuISFKLngoeikuJGlzS1Y/UC5IVSh6KTp6fSwKKyJeIjoiVHBaOjcyOyIsCiskMDpmdW5jdGlvbigpe3ZhciB6PUouVVEoUC5YWShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwb2x5bWVyLWVsZW1lbnQiLG51bGwpKSwiX19wcm90b19fIikKK3JldHVybiEhSi54KHopLiRpc0tWP1AuWFkoeik6en0sCiAkaXNFSDp0cnVlfX1dLFsicG9seW1lci5hdXRvX2JpbmRpbmciLCJwYWNrYWdlOnBvbHltZXIvYXV0b19iaW5kaW5nLmRhcnQiLCxZLHsKICJeIjoiIiwKIHE2OnsKLSJeIjoid2M7SGYscm8sZFVDLHB0LElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoid2M7SGYscm8sZFVDLHB0LElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdrODpmdW5jdGlvbihhKXtyZXR1cm4gSi5aSChhLkhmKX0sCiBnRzU6ZnVuY3Rpb24oYSl7cmV0dXJuIEouZngoYS5IZil9LAogc0c1OmZ1bmN0aW9uKGEsYil7Si5OQShhLkhmLGIpfSwKIFYxOmZ1bmN0aW9uKGEpe3JldHVybiBKLlo4KGEuSGYpfSwKIGdVajpmdW5jdGlvbihhKXtyZXR1cm4gSi5meChhLkhmKX0sCi1aSzpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouWWIoYS5IZixiLGMpfSwKK1pLOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5NTyhhLkhmLGIsYyl9LAogZWE6ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEEuenMucHJvdG90eXBlLmVhLmNhbGwodGhpcyxhLGI9PT1hP0ouWkgoYS5IZik6YixjLGQpfSwKIGRYOmZ1bmN0aW9uKGEpe3ZhciB6CiB0aGlzLlBhKGEpCiBhLkhmPU0uU0IoYSkKIHo9VC5HRihudWxsLEMucVkpCiBKLk5BKGEuSGYsbmV3IFkuenAoYSx6LG51bGwpKQotJC5pRigpLk1NLm1sKG5ldyBZLnpsKGEpKX0sCiskLmlGKCkuTU0ubWwobmV3IFkubGtLKGEpKX0sCiAkaXNEVDp0cnVlLAogJGlzdnk6dHJ1ZSwKIHN0YXRpYzp7ekU6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5Ha3AuWkwoYSkKIEMuR2twLmRYKGEpCkBAIC0xNDg3NSwxNCArMTUwMjAsMTQgQEAKIHdjOnsKICJeIjoiR0xMK2QzO1I5OnJvJSxWMjpkVUMlLG1lOnB0JSIsCiAkaXNkMzp0cnVlfSwKLXpsOnsKLSJeIjoiVHA6MTM7YSIsCitsa0s6eworIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCiB6LnNldEF0dHJpYnV0ZSgiYmluZCIsIiIpCiBKLm1JKHosbmV3IFkuTXJ4KHopKX0sIiQxIixudWxsLDIsMCxudWxsLDE0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIE1yeDp7Ci0iXiI6IlRwOjEzO2IiLAorIl4iOiJUcFo6MTM7YiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLmIKIHk9Si5SRSh6KQpAQCAtMTQ4OTQsNDQgKzE1MDM5LDQ0IEBACiBYQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5kcX19fV0sWyJwb2x5bWVyLmRlc2VyaWFsaXplIiwicGFja2FnZTpwb2x5bWVyL2Rlc2VyaWFsaXplLmRhcnQiLCxaLHsKICJeIjoiIiwKIFpoOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgKLXo9JC5RTCgpLnQoMCxjKQorej0kLlJmKCkudCgwLGMpCiBpZih6IT1udWxsKXJldHVybiB6LiQyKGEsYikKIHRyeXt5PUMueHIua1YoSi5KQShhLCInIiwiXCIiKSkKIHJldHVybiB5fWNhdGNoKHgpe0guUnUoeCkKIHJldHVybiBhfX0sCiBsUDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBhfSwKLSRpc0VIOnRydWV9LAotVWY6ewotIl4iOiJUcDo3OTsiLAorIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGF9LAogJGlzRUg6dHJ1ZX0sCiBSYTp7Ci0iXiI6IlRwOjc5OyIsCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYX0sCiskaXNFSDp0cnVlfSwKK3dKWTp7CisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CiB0cnl7ej1QLnp1KGEpCiByZXR1cm4gen1jYXRjaCh5KXtILlJ1KHkpCiByZXR1cm4gYn19LAogJGlzRUg6dHJ1ZX0sCi13Slk6ewotIl4iOiJUcDo3OTsiLAorek9ROnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiFKLnhDKGEsImZhbHNlIil9LAogJGlzRUg6dHJ1ZX0sCi16T1E6ewotIl4iOiJUcDo3OTsiLAorVzZvOnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3JldHVybiBILkJVKGEsbnVsbCxuZXcgWi5mVChiKSl9LAogJGlzRUg6dHJ1ZX0sCiBmVDp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hfSwKICRpc0VIOnRydWV9LAotVzZvOnsKLSJeIjoiVHA6Nzk7IiwKK01kUTp7CisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC5SUihhLG5ldyBaLkxmKGIpKX0sCiAkaXNFSDp0cnVlfSwKIExmOnsKLSJeIjoiVHA6MTM7YiIsCisiXiI6IlRwWjoxMztiIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmJ9LAogJGlzRUg6dHJ1ZX19XSxbInBvbHltZXJfZXhwcmVzc2lvbnMiLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvcG9seW1lcl9leHByZXNzaW9ucy5kYXJ0IiwsVCx7CiAiXiI6IiIsCkBAIC0xNDk0NSw0NCArMTUwOTAsNDQgQEAKIHJldHVybiB6fSwiJDEiLCJHdSIsMiwwLDQ5LDY0XSwKIEZtOltmdW5jdGlvbihhKXtyZXR1cm4gYX0sIiQxIiwia1IiLDIsMCwxMyw2NV0sCiBJSzp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpmdW5jdGlvbihhKXtyZXR1cm4gSi54QyhKLlVRKHRoaXMuYSxhKSwhMCl9LAogJGlzRUg6dHJ1ZX0sCiBrOTp7Ci0iXiI6IlRwOjEzO2EiLAotJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQoYSkrIjogIitILmQoSi5VUSh0aGlzLmEsYSkpfSwiJDEiLG51bGwsMiwwLG51bGwsMTMwLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKGEpKyI6ICIrSC5kKEouVVEodGhpcy5hLGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDEzMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1RQjp7CitjUDp7CiAiXiI6IlZFO1ZBLGp3LGlYLFdLLGNKIiwKIFVTOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdwogej17fQogeT1uZXcgWS54dihILlZNKFtdLFtZLnFTXSksUC5wOSgiIiksbmV3IFAuV1UoYSwwLDAsbnVsbCksbnVsbCkKLXg9bmV3IFUudHUoKQoreD1uZXcgVS5GcygpCiB4PW5ldyBULkZYKHgseSxudWxsLG51bGwpCiB5PXkuemwoKQogeC5qUT15Ci14LnZpPUguVk0obmV3IEguYTcoeSx5Lmxlbmd0aCwwLG51bGwpLFtILktwKHksMCldKQoreC52aT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5PcSh5LDApXSkKIHguQnAoKQogdz14LlRlKCkKIGlmKE0uQ0YoYykpe3k9Si54KGIpCiB5PXkubihiLCJiaW5kIil8fHkubihiLCJyZXBlYXQiKX1lbHNlIHk9ITEKIGlmKHkpe3o9Si54KHcpCi1pZighIXouJGlzREkpcmV0dXJuIG5ldyBULnFiKHRoaXMsdy5nRjUoKSx6LmdrWih3KSkKLWVsc2UgcmV0dXJuIG5ldyBULlh5Yih0aGlzLHcpfXouYT1udWxsCitpZighIXouJGlzREkpcmV0dXJuIG5ldyBULlh5Yih0aGlzLHcuZ0Y1KCksei5na1oodykpCitlbHNlIHJldHVybiBuZXcgVC5EZGoodGhpcyx3KX16LmE9bnVsbAogeT0hIUoueChjKS4kaXNoNAogaWYoeSYmSi54QyhiLCJjbGFzcyIpKXouYT1ULnYwKCkKIGVsc2UgaWYoeSYmSi54QyhiLCJzdHlsZSIpKXouYT1ULkd1KCkKLXJldHVybiBuZXcgVC5EZGooeix0aGlzLHcpfSwKK3JldHVybiBuZXcgVC5IMUIoeix0aGlzLHcpfSwKIENFOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuV0sudCgwLGEpCi1pZih6PT1udWxsKXJldHVybiBuZXcgVC5XYih0aGlzLGEpCi1yZXR1cm4gbmV3IFQudUtvKHRoaXMsYSx6KX0sCitpZih6PT1udWxsKXJldHVybiBuZXcgVC5yNih0aGlzLGEpCityZXR1cm4gbmV3IFQuV2IodGhpcyxhLHopfSwKIGZPOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9Si5SRShhKQogeT16LmdCeShhKQogaWYoeT09bnVsbClyZXR1cm4KIGlmKE0uQ0YoYSkpe3g9ISF6LiRpc3Z5P2E6TS5TQihhKQogej1KLlJFKHgpCi13PXouZ0NuKHgpCit3PXouZ21TQSh4KQogdj13PT1udWxsP3ouZ2s4KHgpOncuazgKIGlmKCEhSi54KHYpLiRpc0dLKXJldHVybiB2CiBlbHNlIHJldHVybiB0aGlzLmlYLnQoMCxhKX1yZXR1cm4gdGhpcy5mTyh5KX0sCkBAIC0xNDk5OCw3ICsxNTE0Myw3IEBACiBXZzpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogaWYoTS5DRihhKSl7ej0hIUoueChhKS4kaXN2eT9hOk0uU0IoYSkKIHk9Si5SRSh6KQotaWYoeS5nQ24oeik9PW51bGwpeS5nazgoeikKK2lmKHkuZ21TQSh6KT09bnVsbCl5LmdrOCh6KQogcmV0dXJuIHRoaXMuaVgudCgwLGEpfWVsc2V7eT1KLlJFKGEpCiBpZih5LmdlVChhKT09bnVsbCl7eD10aGlzLmlYLnQoMCxhKQogcmV0dXJuIHghPW51bGw/eDpLLmRaKGIsdGhpcy5qdyl9ZWxzZSByZXR1cm4gdGhpcy5XZyh5LmdCeShhKSxiKX19LApAQCAtMTUwMDcsNTQgKzE1MTUyLDU0IEBACiB5PUguVk0obmV3IFAucW8obnVsbCksW1AucVVdKQogeD1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsUC5hKQogeC5GVigwLEMudmEpCi1yZXR1cm4gbmV3IFQuUUIoYix4LHoseSxudWxsKX19fSwKLXFiOnsKLSJeIjoiVHA6MTg1O2IsYyxkIiwKK3JldHVybiBuZXcgVC5jUChiLHgseix5LG51bGwpfX19LAorWHliOnsKKyJeIjoiVHBaOjE4NztiLGMsZCIsCiAkMzpbZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkKIHo9dGhpcy5iCiB6LldLLnUoMCxiLHRoaXMuYykKIHk9ISFKLngoYSkuJGlzR0s/YTpLLmRaKGEsei5qdykKIHouaVgudSgwLGIseSkKIHo9VC5rUigpCi1yZXR1cm4gbmV3IFQudEkoeSx6LHRoaXMuZCxudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3MywxNzQsMTc1LCJjYWxsIl0sCityZXR1cm4gbmV3IFQudEkoeSx6LHRoaXMuZCxudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3NSwxNzYsMTc3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKLVh5Yjp7Ci0iXiI6IlRwOjE4NTtlLGYiLAorRGRqOnsKKyJeIjoiVHBaOjE4NztlLGYiLAogJDM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgeix5CiB6PXRoaXMuZQogeT0hIUoueChhKS4kaXNHSz9hOksuZFooYSx6Lmp3KQogei5pWC51KDAsYix5KQogaWYoYz09PSEwKXJldHVybiBULmpGKHRoaXMuZix5LG51bGwpCiB6PVQua1IoKQotcmV0dXJuIG5ldyBULnRJKHkseix0aGlzLmYsbnVsbCxudWxsLG51bGwsbnVsbCl9LCIkMyIsbnVsbCw2LDAsbnVsbCwxNzMsMTc0LDE3NSwiY2FsbCJdLAorcmV0dXJuIG5ldyBULnRJKHkseix0aGlzLmYsbnVsbCxudWxsLG51bGwsbnVsbCl9LCIkMyIsbnVsbCw2LDAsbnVsbCwxNzUsMTc2LDE3NywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1EZGo6ewotIl4iOiJUcDoxODU7YSxVSSxiSyIsCitIMUI6eworIl4iOiJUcFo6MTg3O2EsVUksYksiLAogJDM6W2Z1bmN0aW9uKGEsYixjKXt2YXIgeix5CiB6PXRoaXMuVUkuZXkoYixhKQogaWYoYz09PSEwKXJldHVybiBULmpGKHRoaXMuYksseix0aGlzLmEuYSkKIHk9dGhpcy5hLmEKIGlmKHk9PW51bGwpeT1ULmtSKCkKLXJldHVybiBuZXcgVC50SSh6LHksdGhpcy5iSyxudWxsLG51bGwsbnVsbCxudWxsKX0sIiQzIixudWxsLDYsMCxudWxsLDE3MywxNzQsMTc1LCJjYWxsIl0sCityZXR1cm4gbmV3IFQudEkoeix5LHRoaXMuYkssbnVsbCxudWxsLG51bGwsbnVsbCl9LCIkMyIsbnVsbCw2LDAsbnVsbCwxNzUsMTc2LDE3NywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1XYjp7Ci0iXiI6IlRwOjEzO2EsYiIsCityNjp7CisiXiI6IlRwWjoxMzthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseAogej10aGlzLmEKIHk9dGhpcy5iCiB4PXouaVgudCgwLHkpCiBpZih4IT1udWxsKXtpZihKLnhDKGEsSi5aSCh4KSkpcmV0dXJuIHgKLXJldHVybiBLLmRaKGEsei5qdyl9ZWxzZSByZXR1cm4gei5leSh5LGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTczLCJjYWxsIl0sCityZXR1cm4gSy5kWihhLHouancpfWVsc2UgcmV0dXJuIHouZXkoeSxhKX0sIiQxIixudWxsLDIsMCxudWxsLDE3NSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi11S286ewotIl4iOiJUcDoxMztjLGQsZSIsCitXYjp7CisiXiI6IlRwWjoxMztjLGQsZSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9dGhpcy5jCiB5PXRoaXMuZAogeD16LmlYLnQoMCx5KQogdz10aGlzLmUKIGlmKHghPW51bGwpcmV0dXJuIHgudDEodyxhKQotZWxzZSByZXR1cm4gei5mTyh5KS50MSh3LGEpfSwiJDEiLG51bGwsMiwwLG51bGwsMTczLCJjYWxsIl0sCitlbHNlIHJldHVybiB6LmZPKHkpLnQxKHcsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNzUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdEk6ewogIl4iOiJZajtJTSxlSSxrRyxUdSxUNyx6MCxJWiIsCkBAIC0xNTA2NCwxMSArMTUyMDksMTEgQEAKIHo9dGhpcy5JWgogeT10aGlzLmJoKGEpCiB0aGlzLklaPXkKLWlmKGIhPT0hMCYmdGhpcy5UdSE9bnVsbCYmIUoueEMoeix5KSl0aGlzLnRDKHRoaXMuSVopfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iOShhLCExKX0sImJVIiwiJDIkc2tpcENoYW5nZXMiLCIkMSIsImdOQiIsMiwzLDE4NiwxODcsNjQsMTg4XSwKK2lmKGIhPT0hMCYmdGhpcy5UdSE9bnVsbCYmIUoueEMoeix5KSl0aGlzLnRDKHRoaXMuSVopfSxmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5iOShhLCExKX0sImJVIiwiJDIkc2tpcENoYW5nZXMiLCIkMSIsImdOQiIsMiwzLDE4OCwxODksNjQsMTkwXSwKIGdQOmZ1bmN0aW9uKGEpe2lmKHRoaXMuVHUhPW51bGwpcmV0dXJuIHRoaXMuSVoKIHJldHVybiBULmpGKHRoaXMua0csdGhpcy5JTSx0aGlzLmVJKX0sCiBzUDpmdW5jdGlvbihhLGIpe3ZhciB6LHkseCx3LHYKLXRyeXt6PUsualgodGhpcy5rRyxiLHRoaXMuSU0sITEpCit0cnl7ej1LLkZIKHRoaXMua0csYix0aGlzLklNLCExKQogdGhpcy5iOSh6LCEwKX1jYXRjaCh3KXt2PUguUnUodykKIHk9dgogeD1uZXcgSC5YTyh3LG51bGwpCkBAIC0xNTA4NCw5ICsxNTIyOSw5IEBACiB4LmZtKDAsbmV3IFQucEkodGhpcykpCiB0aGlzLlQ3PXgKIHRyeXt4PXRoaXMuejAKLUouTlYoeCxuZXcgSy5FZGgodGhpcy5JTSkpCi14LmdYcigpCi10aGlzLmI5KHRoaXMuejAuZ1hyKCksITApfWNhdGNoKHYpe3g9SC5SdSh2KQorSi5va1YoeCxuZXcgSy5FZGgodGhpcy5JTSkpCit4LmdLMygpCit0aGlzLmI5KHRoaXMuejAuZ0szKCksITApfWNhdGNoKHYpe3g9SC5SdSh2KQogej14CiB5PW5ldyBILlhPKHYsbnVsbCkKIEguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKS53MCgiRXJyb3IgZXZhbHVhdGluZyBleHByZXNzaW9uICciK0guZCh0aGlzLnowKSsiJzogIitILmQoeikseSl9cmV0dXJuIHRoaXMuSVp9LApAQCAtMTUwOTgsMTggKzE1MjQzLDE4IEBACiB6PSQud2IoKQogeT10aGlzLnowCiB6LnRvU3RyaW5nCi1KLk5WKHkseikKK0oub2tWKHkseikKIHRoaXMuejA9bnVsbH0sCiBzdGF0aWM6e2pGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgsdyx2Ci10cnl7ej1KLk5WKGEsbmV3IEsuR1EoYikpCit0cnl7ej1KLm9rVihhLG5ldyBLLkdRKGIpKQogdz1jPT1udWxsP3o6Yy4kMSh6KQogcmV0dXJuIHd9Y2F0Y2godil7dz1ILlJ1KHYpCiB5PXcKIHg9bmV3IEguWE8odixudWxsKQogSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLncwKCJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyIrSC5kKGEpKyInOiAiK0guZCh5KSx4KX1yZXR1cm59fX0sCiBwSTp7Ci0iXiI6IlRwOjc5O2EiLAotJDI6W2Z1bmN0aW9uKGEsYil7SC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLncwKCJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyIrSC5kKHRoaXMuYS56MCkrIic6ICIrSC5kKGEpLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsMSwxNTMsImNhbGwiXSwKKyJeIjoiVHBaOjgwO2EiLAorJDI6W2Z1bmN0aW9uKGEsYil7SC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLncwKCJFcnJvciBldmFsdWF0aW5nIGV4cHJlc3Npb24gJyIrSC5kKHRoaXMuYS56MCkrIic6ICIrSC5kKGEpLGIpfSwiJDIiLG51bGwsNCwwLG51bGwsMSwxNTUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogeXk6ewogIl4iOiJhOyJ9fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLmFzeW5jIiwicGFja2FnZTpwb2x5bWVyX2V4cHJlc3Npb25zL2FzeW5jLmRhcnQiLCxCLHsKQEAgLTE1MTIyLDEzICsxNTI2NywxMyBAQAogei52YihhLGIpCiByZXR1cm4gen19fSwKIGZnOnsKLSJeIjoiVHA7YSxiIiwKKyJeIjoiVHBaO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5iCi16LkRBPUYuV2koeixDLmxzLHouREEsYSl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAorei5EQT1GLldpKHosQy5scyx6LkRBLGEpfSwiJDEiLG51bGwsMiwwLG51bGwsOTQsImNhbGwiXSwKICRpc0VIOnRydWUsCi0kc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IlB3IixhcmdzOlthXX19LHRoaXMuYiwiRGUiKX19fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLmV2YWwiLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvZXZhbC5kYXJ0IiwsSyx7Ciskc2lnbmF0dXJlOmZ1bmN0aW9uKCl7cmV0dXJuIEguWFcoZnVuY3Rpb24oYSl7cmV0dXJue2Z1bmM6IkF5IixhcmdzOlthXX19LHRoaXMuYiwiRGUiKX19fV0sWyJwb2x5bWVyX2V4cHJlc3Npb25zLmV2YWwiLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvZXZhbC5kYXJ0IiwsSyx7CiAiXiI6IiIsCi1qWDpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUsdAorRkg6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4LHcsdix1LHQKIHo9SC5WTShbXSxbVS5JcF0pCiBmb3IoO3k9Si54KGEpLCEheS4kaXN1a3U7KXtpZighSi54Qyh5LmdrcChhKSwifCIpKWJyZWFrCiB6LnB1c2goeS5nVDgoYSkpCkBAIC0xNTEzNiwxNCArMTUyODEsMTQgQEAKIHc9Qy5PTAogdj0hMX1lbHNlIGlmKCEheS4kaXN6WCl7dz1hLmdUZigpCiB4PWEuZ0puKCkKLXY9ITB9ZWxzZXtpZighIXkuJGlzeDkpe3c9YS5nVGYoKQordj0hMH1lbHNle2lmKCEheS4kaXNyWCl7dz1hLmdUZigpCiB4PXkuZ29jKGEpfWVsc2V7aWYoZCl0aHJvdyBILmIoSy56cSgiRXhwcmVzc2lvbiBpcyBub3QgYXNzaWduYWJsZTogIitILmQoYSkpKQotcmV0dXJufXY9ITF9Zm9yKHk9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guS3AoeiwwKV0pO3kuRygpOyl7dT15LmxvCi1KLk5WKHUsbmV3IEsuR1EoYykpCityZXR1cm59dj0hMX1mb3IoeT1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7eS5HKCk7KXt1PXkubG8KK0oub2tWKHUsbmV3IEsuR1EoYykpCiBpZihkKXRocm93IEguYihLLnpxKCJmaWx0ZXIgbXVzdCBpbXBsZW1lbnQgVHJhbnNmb3JtZXIgdG8gYmUgYXNzaWduYWJsZTogIitILmQodSkpKQotZWxzZSByZXR1cm59dD1KLk5WKHcsbmV3IEsuR1EoYykpCitlbHNlIHJldHVybn10PUoub2tWKHcsbmV3IEsuR1EoYykpCiBpZih0PT1udWxsKXJldHVybgotaWYodilKLmtXKHQsSi5OVih4LG5ldyBLLkdRKGMpKSxiKQoraWYodilKLmtXKHQsSi5va1YoeCxuZXcgSy5HUShjKSksYikKIGVsc2V7eT0kLk1nKCkuTnoudCgwLHgpCiAkLmNwKCkuQ3EodCx5LGIpfXJldHVybiBifSwKIGRaOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4CkBAIC0xNTE1NCw4MyArMTUyOTksODMgQEAKIHg9bmV3IEsuUGgoeix5KQogaWYoeS54NCgwLCJ0aGlzIikpSC52aChLLnpxKCIndGhpcycgY2Fubm90IGJlIHVzZWQgYXMgYSB2YXJpYWJsZSBuYW1lLiIpKQogeT14fXJldHVybiB5fSwKLXcxMDp7Ci0iXiI6IlRwOjc5OyIsCit3MTE6eworIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouZXcoYSxiKX0sCiAkaXNFSDp0cnVlfSwKLXcxMTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLmJJKGEsYil9LAotJGlzRUg6dHJ1ZX0sCiB3MTI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi52WChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLkhuKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5YOShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnZYKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTQ6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5oaChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLlg5KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTU6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi54QyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLmhoKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTY6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4hSi54QyhhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnhDKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTc6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09bnVsbD9iPT1udWxsOmE9PT1ifSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiFKLnhDKGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MTg6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09bnVsbD9iIT1udWxsOmEhPT1ifSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT1udWxsP2I9PW51bGw6YT09PWJ9LAogJGlzRUg6dHJ1ZX0sCiB3MTk6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi56OChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT1udWxsP2IhPW51bGw6YSE9PWJ9LAogJGlzRUg6dHJ1ZX0sCiB3MjA6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5KNShhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLno4KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MjE6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi51NihhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLko1KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MjI6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5CbChhLGIpfSwKKyJeIjoiVHBaOjgwOyIsCiskMjpmdW5jdGlvbihhLGIpe3JldHVybiBKLnU2KGEsYil9LAogJGlzRUg6dHJ1ZX0sCiB3MjM6ewotIl4iOiJUcDo3OTsiLAotJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PSEwfHxiPT09ITB9LAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouQmwoYSxiKX0sCiAkaXNFSDp0cnVlfSwKIHcyNDp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe3JldHVybiBhPT09ITAmJmI9PT0hMH0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT09PSEwfHxiPT09ITB9LAogJGlzRUg6dHJ1ZX0sCiB3MjU6ewotIl4iOiJUcDo3OTsiLAorIl4iOiJUcFo6ODA7IiwKKyQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9PT0hMCYmYj09PSEwfSwKKyRpc0VIOnRydWV9LAordzI2OnsKKyJeIjoiVHBaOjgwOyIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6PUguT2coUC5hKQogej1ILktUKHosW3pdKS5CRChiKQogaWYoeilyZXR1cm4gYi4kMShhKQogdGhyb3cgSC5iKEsuenEoIkZpbHRlcnMgbXVzdCBiZSBhIG9uZS1hcmd1bWVudCBmdW5jdGlvbi4iKSl9LAogJGlzRUg6dHJ1ZX0sCi1SYWE6ewotIl4iOiJUcDoxMzsiLAordzA6eworIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBhfSwKICRpc0VIOnRydWV9LAotdzA6ewotIl4iOiJUcDoxMzsiLAordzU6eworIl4iOiJUcFo6MTM7IiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiBKLmp6byhhKX0sCiAkaXNFSDp0cnVlfSwKLXc1OnsKLSJeIjoiVHA6MTM7IiwKK3cxMDp7CisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMH0sCiAkaXNFSDp0cnVlfSwKIEdLOnsKQEAgLTE1MjUwLDggKzE1Mzk1LDggQEAKIGlmKHk9PW51bGx8fHo9PW51bGwpdGhyb3cgSC5iKEsuenEoInZhcmlhYmxlICciK0guZChiKSsiJyBub3QgZm91bmQiKSkKIHk9JC5jcCgpLmpEKHkseikKIHJldHVybiEhSi54KHkpLiRpc3dTP0IucGUoeSxudWxsKTp5fSwKLXQ4OmZ1bmN0aW9uKGEpe3JldHVybiFKLnhDKGEsInRoaXMiKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iW21vZGVsOiAiK0guZCh0aGlzLms4KSsiXSJ9fSwKK0FDOmZ1bmN0aW9uKGEpe3JldHVybiFKLnhDKGEsInRoaXMiKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIlttb2RlbDogIitILmQodGhpcy5rOCkrIl0ifSwiJDAiLCJnQVkiLDAsMCw2OV19LAogUE86ewogIl4iOiJHSztlVD4sWjAsUD4iLAogZ2s4OmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuZVQKQEAgLTE1MjYwLDY0ICsxNTQwNSw2NCBAQAogdDpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihKLnhDKHRoaXMuWjAsYikpe3o9dGhpcy5QCiByZXR1cm4hIUoueCh6KS4kaXN3Uz9CLnBlKHosbnVsbCk6en1yZXR1cm4gdGhpcy5lVC50KDAsYil9LAotdDg6ZnVuY3Rpb24oYSl7aWYoSi54Qyh0aGlzLlowLGEpKXJldHVybiExCi1yZXR1cm4gdGhpcy5lVC50OChhKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lVC5idSgwKSsiID4gW2xvY2FsOiAiK0guZCh0aGlzLlowKSsiXSJ9fSwKK0FDOmZ1bmN0aW9uKGEpe2lmKEoueEModGhpcy5aMCxhKSlyZXR1cm4hMQorcmV0dXJuIHRoaXMuZVQuQUMoYSl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVULmJ1KDApKyIgPiBbbG9jYWw6ICIrSC5kKHRoaXMuWjApKyJdIn0sIiQwIiwiZ0FZIiwwLDAsNjldfSwKIFBoOnsKICJeIjoiR0s7ZVQ+LFozPCIsCiBnazg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZVQuazh9LAogdDpmdW5jdGlvbihhLGIpe3ZhciB6PXRoaXMuWjMKIGlmKHoueDQoMCxiKSl7ej16LnQoMCxiKQogcmV0dXJuISFKLngoeikuJGlzd1M/Qi5wZSh6LG51bGwpOnp9cmV0dXJuIHRoaXMuZVQudCgwLGIpfSwKLXQ4OmZ1bmN0aW9uKGEpe2lmKHRoaXMuWjMueDQoMCxhKSlyZXR1cm4hMQorQUM6ZnVuY3Rpb24oYSl7aWYodGhpcy5aMy54NCgwLGEpKXJldHVybiExCiByZXR1cm4hSi54QyhhLCJ0aGlzIil9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5aMwotcmV0dXJuIlttb2RlbDogIitILmQodGhpcy5lVC5rOCkrIl0gPiBbZ2xvYmFsOiAiK1AuSXgoSC5WTShuZXcgUC5pNSh6KSxbSC5LcCh6LDApXSksIigiLCIpIikrIl0ifX0sCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5aMworcmV0dXJuIlttb2RlbDogIitILmQodGhpcy5lVC5rOCkrIl0gPiBbZ2xvYmFsOiAiK1AuSXgoSC5WTShuZXcgUC5pNSh6KSxbSC5PcSh6LDApXSksIigiLCIpIikrIl0ifSwiJDAiLCJnQVkiLDAsMCw2OV19LAogQXkwOnsKLSJeIjoiYTttbT8sem88IiwKLWdVTzpmdW5jdGlvbigpe3ZhciB6PXRoaXMuUDAKLXJldHVybiBILlZNKG5ldyBQLklrKHopLFtILktwKHosMCldKX0sCi1nWHI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56b30sCi1DWDpmdW5jdGlvbihhKXt9LAotcG86ZnVuY3Rpb24oYSl7dmFyIHoKLXRoaXMudTBPKDAsYSkKLXo9dGhpcy5tbQotaWYoeiE9bnVsbCl6LnBvKGEpfSwKLU9XOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy51eQorIl4iOiJhO2JPPyxYbDwiLAorZ1VPOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5rNgorcmV0dXJuIEguVk0obmV3IFAuSWsoeiksW0guT3EoeiwwKV0pfSwKK2dLMzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlhsfSwKK1FoOmZ1bmN0aW9uKGEpe30sCit1YjpmdW5jdGlvbihhKXt2YXIgegordGhpcy5EYigwLGEpCit6PXRoaXMuYk8KK2lmKHohPW51bGwpei51YihhKX0sCitwdTpmdW5jdGlvbigpe3ZhciB6PXRoaXMudGoKIGlmKHohPW51bGwpe3ouZWQoKQotdGhpcy51eT1udWxsfX0sCi11ME86ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgKLXRoaXMuT1coKQotej10aGlzLnpvCi10aGlzLkNYKGIpCi15PXRoaXMuem8KLWlmKHk9PW51bGw/eiE9bnVsbDp5IT09eil7eD10aGlzLlAwCit0aGlzLnRqPW51bGx9fSwKK0RiOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4Cit0aGlzLnB1KCkKK3o9dGhpcy5YbAordGhpcy5RaChiKQoreT10aGlzLlhsCitpZih5PT1udWxsP3ohPW51bGw6eSE9PXope3g9dGhpcy5rNgogaWYoeC5Hdj49NClILnZoKHgucTcoKSkKIHguSXYoeSl9fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkh1LmJ1KDApfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5LTC5idSgwKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzSXA6dHJ1ZX0sCiBFZGg6ewogIl4iOiJjZlM7cXUiLAoteG46ZnVuY3Rpb24oYSl7YS51ME8oMCx0aGlzLnF1KX19LAoreG46ZnVuY3Rpb24oYSl7YS5EYigwLHRoaXMucXUpfX0sCiBtZTp7CiAiXiI6ImNmUzsiLAoteG46ZnVuY3Rpb24oYSl7YS5PVygpfSwKK3huOmZ1bmN0aW9uKGEpe2EucHUoKX0sCiBzdGF0aWM6eyJeIjoibG4ifX0sCiBHUTp7CiAiXiI6IlA1NTtxdSIsCiBXOTpmdW5jdGlvbihhKXtyZXR1cm4gSi5aSCh0aGlzLnF1KX0sCiBMVDpmdW5jdGlvbihhKXtyZXR1cm4gYS53ei5SUigwLHRoaXMpfSwKIGZWOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAotej1KLk5WKGEuZ1RmKCksdGhpcykKK3o9Si5va1YoYS5nVGYoKSx0aGlzKQogaWYoej09bnVsbClyZXR1cm4KIHk9YS5nb2MoYSkKIHg9JC5NZygpLk56LnQoMCx5KQogcmV0dXJuICQuY3AoKS5qRCh6LHgpfSwKLUNVOmZ1bmN0aW9uKGEpe3ZhciB6PUouTlYoYS5nVGYoKSx0aGlzKQorQ1U6ZnVuY3Rpb24oYSl7dmFyIHo9Si5va1YoYS5nVGYoKSx0aGlzKQogaWYoej09bnVsbClyZXR1cm4KLXJldHVybiBKLlVRKHosSi5OVihhLmdKbigpLHRoaXMpKX0sCityZXR1cm4gSi5VUSh6LEoub2tWKGEuZ0puKCksdGhpcykpfSwKIFpSOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKLXo9Si5OVihhLmdUZigpLHRoaXMpCit6PUoub2tWKGEuZ1RmKCksdGhpcykKIGlmKHo9PW51bGwpcmV0dXJuCiBpZihhLmdyZSgpPT1udWxsKXk9bnVsbAogZWxzZXt4PWEuZ3JlKCkKQEAgLTE1MzMxLDE0ICsxNTQ3NiwxNCBAQAogWmg6ZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IEguQTgoYS5naEwoKSx0aGlzLmdheSgpKSxbbnVsbCxudWxsXSkuYnIoMCl9LAogbzA6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiB6PVAuRmwobnVsbCxudWxsKQotZm9yKHk9YS5nUmwoYSkseT1ILlZNKG5ldyBILmE3KHkseS5sZW5ndGgsMCxudWxsKSxbSC5LcCh5LDApXSk7eS5HKCk7KXt4PXkubG8KLXoudSgwLEouTlYoSi5BNih4KSx0aGlzKSxKLk5WKHguZ3Y0KCksdGhpcykpfXJldHVybiB6fSwKK2Zvcih5PWEuZ1JsKGEpLHk9SC5WTShuZXcgSC5hNyh5LHkubGVuZ3RoLDAsbnVsbCksW0guT3EoeSwwKV0pO3kuRygpOyl7eD15LmxvCit6LnUoMCxKLm9rVihKLkE2KHgpLHRoaXMpLEoub2tWKHguZ3Y0KCksdGhpcykpfXJldHVybiB6fSwKIFlWOmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuZigic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpKX0sCiBxczpmdW5jdGlvbihhKXtyZXR1cm4gSi5VUSh0aGlzLnF1LGEuZ1AoYSkpfSwKIGV4OmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYKIHo9YS5na3AoYSkKLXk9Si5OVihhLmdCYihhKSx0aGlzKQoteD1KLk5WKGEuZ1Q4KGEpLHRoaXMpCit5PUoub2tWKGEuZ0JiKGEpLHRoaXMpCit4PUoub2tWKGEuZ1Q4KGEpLHRoaXMpCiB3PSQuUmFiKCkudCgwLHopCiB2PUoueCh6KQogaWYodi5uKHosIiYmIil8fHYubih6LCJ8fCIpKXt2PXk9PW51bGw/ITE6eQpAQCAtMTUzNDYsMTEgKzE1NDkxLDExIEBACiBlbHNlIGlmKHk9PW51bGx8fHg9PW51bGwpcmV0dXJuCiByZXR1cm4gdy4kMih5LHgpfSwKIHhOOmZ1bmN0aW9uKGEpe3ZhciB6LHkKLXo9Si5OVihhLmd3eigpLHRoaXMpCi15PSQucUwoKS50KDAsYS5na3AoYSkpCit6PUoub2tWKGEuZ3d6KCksdGhpcykKK3k9JC5JaSgpLnQoMCxhLmdrcChhKSkKIGlmKEoueEMoYS5na3AoYSksIiEiKSlyZXR1cm4geS4kMSh6PT1udWxsPyExOnopCiByZXR1cm4gej09bnVsbD9udWxsOnkuJDEoeil9LAotUkQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEoueEMoSi5OVihhLmdkYygpLHRoaXMpLCEwKT9KLk5WKGEuZ1NsKCksdGhpcyk6Si5OVihhLmdydSgpLHRoaXMpfSwKK1JEOmZ1bmN0aW9uKGEpe3JldHVybiBKLnhDKEoub2tWKGEuZ2RjKCksdGhpcyksITApP0oub2tWKGEuZ1NsKCksdGhpcyk6Si5va1YoYS5ncnUoKSx0aGlzKX0sCiBrejpmdW5jdGlvbihhKXtyZXR1cm4gSC52aChQLmYoImNhbid0IGV2YWwgYW4gJ2luJyBleHByZXNzaW9uIikpfSwKIHh0OmZ1bmN0aW9uKGEpe3JldHVybiBILnZoKFAuZigiY2FuJ3QgZXZhbCBhbiAnYXMnIGV4cHJlc3Npb24iKSl9fSwKIE95OnsKQEAgLTE1MzU4LDI1ICsxNTUwMywyNSBAQAogVzk6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBLLnVEKGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpfSwKIExUOmZ1bmN0aW9uKGEpe3JldHVybiBhLnd6LlJSKDAsdGhpcyl9LAogZlY6ZnVuY3Rpb24oYSl7dmFyIHoseQotej1KLk5WKGEuZ1RmKCksdGhpcykKK3o9Si5va1YoYS5nVGYoKSx0aGlzKQogeT1uZXcgSy52bCh6LGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpCi16LnNtbSh5KQorei5zYk8oeSkKIHJldHVybiB5fSwKIENVOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAotej1KLk5WKGEuZ1RmKCksdGhpcykKLXk9Si5OVihhLmdKbigpLHRoaXMpCit6PUoub2tWKGEuZ1RmKCksdGhpcykKK3k9Si5va1YoYS5nSm4oKSx0aGlzKQogeD1uZXcgSy5pVCh6LHksYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHgpCi15LnNtbSh4KQorei5zYk8oeCkKK3kuc2JPKHgpCiByZXR1cm4geH0sCiBaUjpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2Ci16PUouTlYoYS5nVGYoKSx0aGlzKQorej1KLm9rVihhLmdUZigpLHRoaXMpCiBpZihhLmdyZSgpPT1udWxsKXk9bnVsbAogZWxzZXt4PWEuZ3JlKCkKIHc9dGhpcy5nYXkoKQogeC50b1N0cmluZwogeT1ILlZNKG5ldyBILkE4KHgsdyksW251bGwsbnVsbF0pLnR0KDAsITEpfXY9bmV3IEsuYzMoeix5LGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpCi16LnNtbSh2KQorei5zYk8odikKIGlmKHkhPW51bGwpSC5iUSh5LG5ldyBLLnpEKHYpKQogcmV0dXJuIHZ9LAogb0Q6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBLLnowKGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpfSwKQEAgLTE1MzkxLDI2NCArMTU1MzYsMjY0IEBACiBILmJRKHosbmV3IEsuWHMoeSkpCiByZXR1cm4geX0sCiBZVjpmdW5jdGlvbihhKXt2YXIgeix5LHgKLXo9Si5OVihhLmdHMyhhKSx0aGlzKQoteT1KLk5WKGEuZ3Y0KCksdGhpcykKK3o9Si5va1YoYS5nRzMoYSksdGhpcykKK3k9Si5va1YoYS5ndjQoKSx0aGlzKQogeD1uZXcgSy5FTCh6LHksYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSkKLXouc21tKHgpCi15LnNtbSh4KQorei5zYk8oeCkKK3kuc2JPKHgpCiByZXR1cm4geH0sCiBxczpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEsuZWsoYSxudWxsLG51bGwsbnVsbCxQLmJLKG51bGwsbnVsbCwhMSxudWxsKSl9LAogZXg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PUouTlYoYS5nQmIoYSksdGhpcykKLXk9Si5OVihhLmdUOChhKSx0aGlzKQorej1KLm9rVihhLmdCYihhKSx0aGlzKQoreT1KLm9rVihhLmdUOChhKSx0aGlzKQogeD1uZXcgSy5reXAoeix5LGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpCi16LnNtbSh4KQoteS5zbW0oeCkKK3ouc2JPKHgpCit5LnNiTyh4KQogcmV0dXJuIHh9LAogeE46ZnVuY3Rpb24oYSl7dmFyIHoseQotej1KLk5WKGEuZ3d6KCksdGhpcykKK3o9Si5va1YoYS5nd3ooKSx0aGlzKQogeT1uZXcgSy5tdih6LGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpCi16LnNtbSh5KQorei5zYk8oeSkKIHJldHVybiB5fSwKIFJEOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3Ci16PUouTlYoYS5nZGMoKSx0aGlzKQoteT1KLk5WKGEuZ1NsKCksdGhpcykKLXg9Si5OVihhLmdydSgpLHRoaXMpCit6PUoub2tWKGEuZ2RjKCksdGhpcykKK3k9Si5va1YoYS5nU2woKSx0aGlzKQoreD1KLm9rVihhLmdydSgpLHRoaXMpCiB3PW5ldyBLLldXKHoseSx4LGEsbnVsbCxudWxsLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCkpCi16LnNtbSh3KQoteS5zbW0odykKLXguc21tKHcpCit6LnNiTyh3KQoreS5zYk8odykKK3guc2JPKHcpCiByZXR1cm4gd30sCiBrejpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5mKCJjYW4ndCBldmFsIGFuICdpbicgZXhwcmVzc2lvbiIpKX0sCiB4dDpmdW5jdGlvbihhKXt0aHJvdyBILmIoUC5mKCJjYW4ndCBldmFsIGFuICdhcycgZXhwcmVzc2lvbiIpKX19LAogekQ6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi1hLnNtbSh6KQorYS5zYk8oeikKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogWFY6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi1hLnNtbSh6KQorYS5zYk8oeikKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogWHM6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi1hLnNtbSh6KQorYS5zYk8oeikKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogdUQ6ewotIl4iOiJBeTA7SHUsbW0sdXksem8sUDAiLAotQ1g6ZnVuY3Rpb24oYSl7dGhpcy56bz1KLlpIKGEpfSwKKyJeIjoiQXkwO0tMLGJPLHRqLFhsLGs2IiwKK1FoOmZ1bmN0aW9uKGEpe3RoaXMuWGw9Si5aSChhKX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLlc5KHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLkVPXX0sCiAkaXNFTzp0cnVlLAogJGlzSXA6dHJ1ZX0sCiB6MDp7Ci0iXiI6IkF5MDtIdSxtbSx1eSx6byxQMCIsCi1nUDpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1CisiXiI6IkF5MDtLTCxiTyx0aixYbCxrNiIsCitnUDpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5nUCh6KX0sCi1DWDpmdW5jdGlvbihhKXt2YXIgej10aGlzLkh1Ci10aGlzLnpvPXouZ1Aoeil9LAorUWg6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5LTAordGhpcy5YbD16LmdQKHopfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIub0QodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1Uubm9dfSwKICRhc25vOmZ1bmN0aW9uKCl7cmV0dXJuW251bGxdfSwKICRpc25vOnRydWUsCiAkaXNJcDp0cnVlfSwKIGtMOnsKLSJeIjoiQXkwO2hMPCxIdSxtbSx1eSx6byxQMCIsCi1DWDpmdW5jdGlvbihhKXt0aGlzLnpvPUguVk0obmV3IEguQTgodGhpcy5oTCxuZXcgSy5IdigpKSxbbnVsbCxudWxsXSkuYnIoMCl9LAorIl4iOiJBeTA7aEw8LEtMLGJPLHRqLFhsLGs2IiwKK1FoOmZ1bmN0aW9uKGEpe3RoaXMuWGw9SC5WTShuZXcgSC5BOCh0aGlzLmhMLG5ldyBLLkh2KCkpLFtudWxsLG51bGxdKS5icigwKX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLlpoKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLmMwXX0sCiAkaXNjMDp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBIdjp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3pvKCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw5MywiY2FsbCJdLAorIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gYS5nWGwoKX0sIiQxIixudWxsLDIsMCxudWxsLDk0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGV2OnsKLSJeIjoiQXkwO1JsPixIdSxtbSx1eSx6byxQMCIsCi1DWDpmdW5jdGlvbihhKXt0aGlzLnpvPUguRnoodGhpcy5SbCxQLkw1KG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCksbmV3IEsuS3UoKSl9LAorIl4iOiJBeTA7Umw+LEtMLGJPLHRqLFhsLGs2IiwKK1FoOmZ1bmN0aW9uKGEpe3RoaXMuWGw9SC5uMyh0aGlzLlJsLFAuTDUobnVsbCxudWxsLG51bGwsbnVsbCxudWxsKSxuZXcgSy5LdSgpKX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLm8wKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLk1tXX0sCiAkaXNNbTp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBLdTp7Ci0iXiI6IlRwOjc5OyIsCi0kMjpmdW5jdGlvbihhLGIpe0oua1coYSxKLkE2KGIpLmd6bygpLGIuZ3Y0KCkuZ3pvKCkpCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtKLmtXKGEsSi5BNihiKS5nWGwoKSxiLmd2NCgpLmdYbCgpKQogcmV0dXJuIGF9LAogJGlzRUg6dHJ1ZX0sCiBFTDp7Ci0iXiI6IkF5MDtHMz4sdjQ8LEh1LG1tLHV5LHpvLFAwIiwKKyJeIjoiQXkwO0czPix2NDwsS0wsYk8sdGosWGwsazYiLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5ZVih0aGlzKX0sCiAkYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS5hZV19LAogJGlzYWU6dHJ1ZSwKICRpc0lwOnRydWV9LAogZWs6ewotIl4iOiJBeTA7SHUsbW0sdXksem8sUDAiLAotZ1A6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5IdQorIl4iOiJBeTA7S0wsYk8sdGosWGwsazYiLAorZ1A6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5LTAogcmV0dXJuIHouZ1Aoeil9LAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKLXo9dGhpcy5IdQorUWg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKK3o9dGhpcy5LTAogeT1KLlU2KGEpCi10aGlzLnpvPXkudChhLHouZ1AoeikpCi1pZighYS50OCh6LmdQKHopKSlyZXR1cm4KK3RoaXMuWGw9eS50KGEsei5nUCh6KSkKK2lmKCFhLkFDKHouZ1AoeikpKXJldHVybgogeD15LmdrOChhKQogeT1KLngoeCkKIGlmKCF5LiRpc2QzKXJldHVybgogej16LmdQKHopCiB3PSQuTWcoKS5Oei50KDAseikKLXRoaXMudXk9eS5ncWgoeCkueUkobmV3IEsuVjgodGhpcyxhLHcpKX0sCit0aGlzLnRqPXkuZ3FoKHgpLnlJKG5ldyBLLlY4KHRoaXMsYSx3KSl9LAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5xcyh0aGlzKX0sCiAkYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS5mcF19LAogJGlzZnA6dHJ1ZSwKICRpc0lwOnRydWV9LAogVjg6ewotIl4iOiJUcDoxMzthLGIsYyIsCi0kMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5HQyh0aGlzLmMpKT09PSEwKXRoaXMuYS5wbyh0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgxLCJjYWxsIl0sCisiXiI6IlRwWjoxMzthLGIsYyIsCiskMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5HQyh0aGlzLmMpKT09PSEwKXRoaXMuYS51Yih0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEdDOnsKLSJeIjoiVHA6MTM7ZCIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2QiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc3FJJiZKLnhDKGEub2MsdGhpcy5kKX0sIiQxIixudWxsLDIsMCxudWxsLDg0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG12OnsKLSJeIjoiQXkwO3d6PCxIdSxtbSx1eSx6byxQMCIsCi1na3A6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5IdQorIl4iOiJBeTA7d3o8LEtMLGJPLHRqLFhsLGs2IiwKK2drcDpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5na3Aoeil9LAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseQotej10aGlzLkh1Ci15PSQucUwoKS50KDAsei5na3AoeikpCi1pZihKLnhDKHouZ2twKHopLCIhIikpe3o9dGhpcy53ei5nem8oKQotdGhpcy56bz15LiQxKHo9PW51bGw/ITE6eil9ZWxzZXt6PXRoaXMud3oKLXRoaXMuem89ei5nem8oKT09bnVsbD9udWxsOnkuJDEoei5nem8oKSl9fSwKK1FoOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3o9dGhpcy5LTAoreT0kLklpKCkudCgwLHouZ2twKHopKQoraWYoSi54Qyh6LmdrcCh6KSwiISIpKXt6PXRoaXMud3ouZ1hsKCkKK3RoaXMuWGw9eS4kMSh6PT1udWxsPyExOnopfWVsc2V7ej10aGlzLnd6Cit0aGlzLlhsPXouZ1hsKCk9PW51bGw/bnVsbDp5LiQxKHouZ1hsKCkpfX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLnhOKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLmNKXX0sCiAkaXNjSjp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBreXA6ewotIl4iOiJBeTA7QmI+LFQ4PixIdSxtbSx1eSx6byxQMCIsCi1na3A6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5IdQorIl4iOiJBeTA7QmI+LFQ4PixLTCxiTyx0aixYbCxrNiIsCitna3A6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5LTAogcmV0dXJuIHouZ2twKHopfSwKLUNYOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAotej10aGlzLkh1CitRaDpmdW5jdGlvbihhKXt2YXIgeix5LHgKK3o9dGhpcy5LTAogeT0kLlJhYigpLnQoMCx6LmdrcCh6KSkKLWlmKEoueEMoei5na3AoeiksIiYmIil8fEoueEMoei5na3AoeiksInx8Iikpe3o9dGhpcy5CYi5nem8oKQoraWYoSi54Qyh6LmdrcCh6KSwiJiYiKXx8Si54Qyh6LmdrcCh6KSwifHwiKSl7ej10aGlzLkJiLmdYbCgpCiBpZih6PT1udWxsKXo9ITEKLXg9dGhpcy5UOC5nem8oKQotdGhpcy56bz15LiQyKHoseD09bnVsbD8hMTp4KX1lbHNlIGlmKEoueEMoei5na3AoeiksIj09Iil8fEoueEMoei5na3AoeiksIiE9IikpdGhpcy56bz15LiQyKHRoaXMuQmIuZ3pvKCksdGhpcy5UOC5nem8oKSkKK3g9dGhpcy5UOC5nWGwoKQordGhpcy5YbD15LiQyKHoseD09bnVsbD8hMTp4KX1lbHNlIGlmKEoueEMoei5na3AoeiksIj09Iil8fEoueEMoei5na3AoeiksIiE9IikpdGhpcy5YbD15LiQyKHRoaXMuQmIuZ1hsKCksdGhpcy5UOC5nWGwoKSkKIGVsc2V7eD10aGlzLkJiCi1pZih4Lmd6bygpPT1udWxsfHx0aGlzLlQ4Lmd6bygpPT1udWxsKXRoaXMuem89bnVsbAotZWxzZXtpZihKLnhDKHouZ2twKHopLCJ8IikmJiEhSi54KHguZ3pvKCkpLiRpc3duKXRoaXMudXk9SC5Hbyh4Lmd6bygpLCIkaXN3biIpLmdRVigpLnlJKG5ldyBLLlA4KHRoaXMsYSkpCi10aGlzLnpvPXkuJDIoeC5nem8oKSx0aGlzLlQ4Lmd6bygpKX19fSwKK2lmKHguZ1hsKCk9PW51bGx8fHRoaXMuVDguZ1hsKCk9PW51bGwpdGhpcy5YbD1udWxsCitlbHNle2lmKEoueEMoei5na3AoeiksInwiKSYmISFKLngoeC5nWGwoKSkuJGlzd24pdGhpcy50aj1ILkdvKHguZ1hsKCksIiRpc3duIikuZ1FWKCkueUkobmV3IEsuUDgodGhpcyxhKSkKK3RoaXMuWGw9eS4kMih4LmdYbCgpLHRoaXMuVDguZ1hsKCkpfX19LAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5leCh0aGlzKX0sCiAkYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS51a3VdfSwKICRpc3VrdTp0cnVlLAogJGlzSXA6dHJ1ZX0sCiBQODp7Ci0iXiI6IlRwOjEzO2EsYiIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS5wbyh0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EsYiIsCiskMTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYS51Yih0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogV1c6ewotIl4iOiJBeTA7ZGM8LFNsPCxydTwsSHUsbW0sdXksem8sUDAiLAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5kYy5nem8oKQotdGhpcy56bz0oej09bnVsbD8hMTp6KT09PSEwP3RoaXMuU2wuZ3pvKCk6dGhpcy5ydS5nem8oKX0sCisiXiI6IkF5MDtkYzwsU2w8LHJ1PCxLTCxiTyx0aixYbCxrNiIsCitRaDpmdW5jdGlvbihhKXt2YXIgej10aGlzLmRjLmdYbCgpCit0aGlzLlhsPSh6PT1udWxsPyExOnopPT09ITA/dGhpcy5TbC5nWGwoKTp0aGlzLnJ1LmdYbCgpfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuUkQodGhpcyl9LAogJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UubWNdfSwKICRpc21jOnRydWUsCiAkaXNJcDp0cnVlfSwKIHZsOnsKLSJeIjoiQXkwO1RmPCxIdSxtbSx1eSx6byxQMCIsCi1nb2M6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5IdQorIl4iOiJBeTA7VGY8LEtMLGJPLHRqLFhsLGs2IiwKK2dvYzpmdW5jdGlvbihhKXt2YXIgej10aGlzLktMCiByZXR1cm4gei5nb2Moeil9LAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PXRoaXMuVGYuZ3pvKCkKLWlmKHo9PW51bGwpe3RoaXMuem89bnVsbAotcmV0dXJufXk9dGhpcy5IdQorUWg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Cit6PXRoaXMuVGYuZ1hsKCkKK2lmKHo9PW51bGwpe3RoaXMuWGw9bnVsbAorcmV0dXJufXk9dGhpcy5LTAogeT15LmdvYyh5KQogeD0kLk1nKCkuTnoudCgwLHkpCi10aGlzLnpvPSQuY3AoKS5qRCh6LHgpCit0aGlzLlhsPSQuY3AoKS5qRCh6LHgpCiB5PUoueCh6KQotaWYoISF5LiRpc2QzKXRoaXMudXk9eS5ncWgoeikueUkobmV3IEsuZmsodGhpcyxhLHgpKX0sCitpZighIXkuJGlzZDMpdGhpcy50aj15LmdxaCh6KS55SShuZXcgSy5mayh0aGlzLGEseCkpfSwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuZlYodGhpcyl9LAotJGFzQXkwOmZ1bmN0aW9uKCl7cmV0dXJuW1UueDldfSwKLSRpc3g5OnRydWUsCiskYXNBeTA6ZnVuY3Rpb24oKXtyZXR1cm5bVS5yWF19LAorJGlzclg6dHJ1ZSwKICRpc0lwOnRydWV9LAogZms6ewotIl4iOiJUcDoxMzthLGIsYyIsCi0kMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5XS2IodGhpcy5jKSk9PT0hMCl0aGlzLmEucG8odGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MSwiY2FsbCJdLAorIl4iOiJUcFo6MTM7YSxiLGMiLAorJDE6W2Z1bmN0aW9uKGEpe2lmKEoubkUxKGEsbmV3IEsuV0tiKHRoaXMuYykpPT09ITApdGhpcy5hLnViKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogV0tiOnsKLSJeIjoiVHA6MTM7ZCIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2QiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc3FJJiZKLnhDKGEub2MsdGhpcy5kKX0sIiQxIixudWxsLDIsMCxudWxsLDg0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGlUOnsKLSJeIjoiQXkwO1RmPCxKbjwsSHUsbW0sdXksem8sUDAiLAotQ1g6ZnVuY3Rpb24oYSl7dmFyIHoseSx4Ci16PXRoaXMuVGYuZ3pvKCkKLWlmKHo9PW51bGwpe3RoaXMuem89bnVsbAotcmV0dXJufXk9dGhpcy5Kbi5nem8oKQorIl4iOiJBeTA7VGY8LEpuPCxLTCxiTyx0aixYbCxrNiIsCitRaDpmdW5jdGlvbihhKXt2YXIgeix5LHgKK3o9dGhpcy5UZi5nWGwoKQoraWYoej09bnVsbCl7dGhpcy5YbD1udWxsCityZXR1cm59eT10aGlzLkpuLmdYbCgpCiB4PUouVTYoeikKLXRoaXMuem89eC50KHoseSkKLWlmKCEheC4kaXN3bil0aGlzLnV5PXouZ1FWKCkueUkobmV3IEsudEUodGhpcyxhLHkpKQotZWxzZSBpZighIXguJGlzZDMpdGhpcy51eT14LmdxaCh6KS55SShuZXcgSy5uYSh0aGlzLGEseSkpfSwKK3RoaXMuWGw9eC50KHoseSkKK2lmKCEheC4kaXN3bil0aGlzLnRqPXouZ1FWKCkueUkobmV3IEsudEUodGhpcyxhLHkpKQorZWxzZSBpZighIXguJGlzZDMpdGhpcy50aj14LmdxaCh6KS55SShuZXcgSy5qYWkodGhpcyxhLHkpKX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLkNVKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLnpYXX0sCiAkaXN6WDp0cnVlLAogJGlzSXA6dHJ1ZX0sCiB0RTp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKLSQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLnp3KHRoaXMuYykpPT09ITApdGhpcy5hLnBvKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODEsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2EsYixjIiwKKyQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLnp3KHRoaXMuYykpPT09ITApdGhpcy5hLnViKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogenc6ewotIl4iOiJUcDoxMztkIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gYS52UCh0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2QiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiBhLmNrKHRoaXMuZCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4NCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCi1uYTp7Ci0iXiI6IlRwOjEzO2UsZixVSSIsCi0kMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5leSh0aGlzLlVJKSk9PT0hMCl0aGlzLmUucG8odGhpcy5mKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MSwiY2FsbCJdLAoramFpOnsKKyJeIjoiVHBaOjEzO2UsZixVSSIsCiskMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5leSh0aGlzLlVJKSk9PT0hMCl0aGlzLmUudWIodGhpcy5mKX0sIiQxIixudWxsLDIsMCxudWxsLDE4MywiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBleTp7Ci0iXiI6IlRwOjEzO2JLIiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXN5YSYmSi54QyhhLkczLHRoaXMuYkspfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2JLIiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXN5YSYmSi54QyhhLkczLHRoaXMuYkspfSwiJDEiLG51bGwsMiwwLG51bGwsODQsImNhbGwiXSwKICRpc0VIOnRydWV9LAogYzM6ewotIl4iOiJBeTA7VGY8LHJlPCxIdSxtbSx1eSx6byxQMCIsCi1nU2Y6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5IdQorIl4iOiJBeTA7VGY8LHJlPCxLTCxiTyx0aixYbCxrNiIsCitnU2Y6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5LTAogcmV0dXJuIHouZ1NmKHopfSwKLUNYOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CitRaDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej10aGlzLnJlCiB6LnRvU3RyaW5nCiB5PUguVk0obmV3IEguQTgoeixuZXcgSy52USgpKSxbbnVsbCxudWxsXSkuYnIoMCkKLXg9dGhpcy5UZi5nem8oKQotaWYoeD09bnVsbCl7dGhpcy56bz1udWxsCi1yZXR1cm59ej10aGlzLkh1Cit4PXRoaXMuVGYuZ1hsKCkKK2lmKHg9PW51bGwpe3RoaXMuWGw9bnVsbAorcmV0dXJufXo9dGhpcy5LTAogaWYoei5nU2Yoeik9PW51bGwpe3o9SC5lQyh4LHksUC5UZShudWxsKSkKLXRoaXMuem89ISFKLngoeikuJGlzd1M/Qi5wZSh6LG51bGwpOnp9ZWxzZXt6PXouZ1NmKHopCit0aGlzLlhsPSEhSi54KHopLiRpc3dTP0IucGUoeixudWxsKTp6fWVsc2V7ej16LmdTZih6KQogdz0kLk1nKCkuTnoudCgwLHopCi10aGlzLnpvPSQuY3AoKS5Dayh4LHcseSwhMSxudWxsKQordGhpcy5YbD0kLmNwKCkuQ2soeCx3LHksITEsbnVsbCkKIHo9Si54KHgpCi1pZighIXouJGlzZDMpdGhpcy51eT16LmdxaCh4KS55SShuZXcgSy5Tcih0aGlzLGEsdykpfX0sCitpZighIXouJGlzZDMpdGhpcy50aj16LmdxaCh4KS55SShuZXcgSy5Tcih0aGlzLGEsdykpfX0sCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLlpSKHRoaXMpfSwKICRhc0F5MDpmdW5jdGlvbigpe3JldHVybltVLk5iXX0sCiAkaXNOYjp0cnVlLAogJGlzSXA6dHJ1ZX0sCiB2UTp7Ci0iXiI6IlRwOjEzOyIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuIGEuZ3pvKCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw0NiwiY2FsbCJdLAorIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gYS5nWGwoKX0sIiQxIixudWxsLDIsMCxudWxsLDQ2LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIFNyOnsKLSJeIjoiVHA6MTg5O2EsYixjIiwKLSQxOltmdW5jdGlvbihhKXtpZihKLm5FMShhLG5ldyBLLmhvKHRoaXMuYykpPT09ITApdGhpcy5hLnBvKHRoaXMuYil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxODEsImNhbGwiXSwKKyJeIjoiVHBaOjE5MTthLGIsYyIsCiskMTpbZnVuY3Rpb24oYSl7aWYoSi5uRTEoYSxuZXcgSy5obyh0aGlzLmMpKT09PSEwKXRoaXMuYS51Yih0aGlzLmIpfSwiJDEiLG51bGwsMiwwLG51bGwsMTgzLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGhvOnsKLSJeIjoiVHA6MTM7ZCIsCi0kMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzcUkmJkoueEMoYS5vYyx0aGlzLmQpfSwiJDEiLG51bGwsMiwwLG51bGwsODMsImNhbGwiXSwKKyJeIjoiVHBaOjEzO2QiLAorJDE6W2Z1bmN0aW9uKGEpe3JldHVybiEhSi54KGEpLiRpc3FJJiZKLnhDKGEub2MsdGhpcy5kKX0sIiQxIixudWxsLDIsMCxudWxsLDg0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIEIwMzp7CiAiXiI6ImE7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJFdmFsRXhjZXB0aW9uOiAiK3RoaXMuRzF9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJFdmFsRXhjZXB0aW9uOiAiK3RoaXMuRzF9LCIkMCIsImdBWSIsMCwwLDY5XSwKIHN0YXRpYzp7enE6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBLLkIwMyhhKX19fX1dLFsicG9seW1lcl9leHByZXNzaW9ucy5leHByZXNzaW9uIiwicGFja2FnZTpwb2x5bWVyX2V4cHJlc3Npb25zL2V4cHJlc3Npb24uZGFydCIsLFUsewogIl4iOiIiLAogUHU6ZnVuY3Rpb24oYSxiKXt2YXIgeix5CkBAIC0xNTY1OCw4ICsxNTgwMyw4IEBACiBmb3Ioej0wO3o8YS5sZW5ndGg7Kyt6KXt5PWFbel0KIGlmKHo+PWIubGVuZ3RoKXJldHVybiBILmUoYix6KQogaWYoIUoueEMoeSxiW3pdKSlyZXR1cm4hMX1yZXR1cm4hMH0sCi1iMTpmdW5jdGlvbihhKXthLnRvU3RyaW5nCi1yZXR1cm4gVS5MZShILkZ6KGEsMCxuZXcgVS54cygpKSl9LAorcHo6ZnVuY3Rpb24oYSl7YS50b1N0cmluZworcmV0dXJuIFUuTGUoSC5uMyhhLDAsbmV3IFUubGMoKSkpfSwKIEMwQzpmdW5jdGlvbihhLGIpe3ZhciB6PUouZXcoYSxiKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gSC5zKHopCiBhPTUzNjg3MDkxMSZ6CkBAIC0xNTY2OSw5ICsxNTgxNCw5IEBACiBhPTUzNjg3MDkxMSZhKygoNjcxMDg4NjMmYSk8PDM+Pj4wKQogYT0oYV5hPj4+MTEpPj4+MAogcmV0dXJuIDUzNjg3MDkxMSZhKygoMTYzODMmYSk8PDE1Pj4+MCl9LAotdHU6eworRnM6ewogIl4iOiJhOyIsCi1CZjpbZnVuY3Rpb24oYSxiLGMpe3JldHVybiBuZXcgVS56WChiLGMpfSwiJDIiLCJndkgiLDQsMCwxOTAsMSw0Nl19LAorQmY6W2Z1bmN0aW9uKGEsYixjKXtyZXR1cm4gbmV3IFUuelgoYixjKX0sIiQyIiwiZ3ZIIiw0LDAsMTkyLDEsNDZdfSwKIElwOnsKICJeIjoiYTsiLAogJGlzSXA6dHJ1ZX0sCkBAIC0xNTY4MiwzNiArMTU4MjcsMzYgQEAKIG5vOnsKICJeIjoiSXA7UD4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5vRCh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXt2YXIgej10aGlzLlAKLXJldHVybiB0eXBlb2Ygej09PSJzdHJpbmciPyJcIiIrSC5kKHopKyJcIiI6SC5kKHopfSwKK2J1OltmdW5jdGlvbihhKXt2YXIgej10aGlzLlAKK3JldHVybiB0eXBlb2Ygej09PSJzdHJpbmciPyJcIiIrSC5kKHopKyJcIiI6SC5kKHopfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKLXo9SC5SQihiLCIkaXNubyIsW0guS3AodGhpcywwKV0sIiRhc25vIikKK3o9SC5SQihiLCIkaXNubyIsW0guT3EodGhpcywwKV0sIiRhc25vIikKIHJldHVybiB6JiZKLnhDKEouVm0oYiksdGhpcy5QKX0sCiBnaU86ZnVuY3Rpb24oYSl7cmV0dXJuIEoudjEodGhpcy5QKX0sCiAkaXNubzp0cnVlfSwKIGMwOnsKICJeIjoiSXA7aEw8IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIuWmgodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmhMKX0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLmhMKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKIHJldHVybiEhSi54KGIpLiRpc2MwJiZVLlB1KGIuZ2hMKCksdGhpcy5oTCl9LAotZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBVLmIxKHRoaXMuaEwpfSwKK2dpTzpmdW5jdGlvbihhKXtyZXR1cm4gVS5weih0aGlzLmhMKX0sCiAkaXNjMDp0cnVlfSwKIE1tOnsKICJeIjoiSXA7Umw+IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIubzAodGhpcyl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuInsiK0guZCh0aGlzLlJsKSsifSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJ7IitILmQodGhpcy5SbCkrIn0ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCiByZXR1cm4hIXouJGlzTW0mJlUuUHUoei5nUmwoYiksdGhpcy5SbCl9LAotZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBVLmIxKHRoaXMuUmwpfSwKK2dpTzpmdW5jdGlvbihhKXtyZXR1cm4gVS5weih0aGlzLlJsKX0sCiAkaXNNbTp0cnVlfSwKIGFlOnsKICJeIjoiSXA7RzM+LHY0PCIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLllWKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkczLmJ1KDApKyI6ICIrSC5kKHRoaXMudjQpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5HMy5idSgwKSsiOiAiK0guZCh0aGlzLnY0KX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQpAQCAtMTU3MjQsNyArMTU4NjksNyBAQAogWEM6ewogIl4iOiJJcDt3eiIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLkxUKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy53eikrIikifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMud3opKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKIHJldHVybiEhSi54KGIpLiRpc1hDJiZKLnhDKGIud3osdGhpcy53eil9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBKLnYxKHRoaXMud3opfSwKQEAgLTE1NzMyLDcgKzE1ODc3LDcgQEAKIGZwOnsKICJeIjoiSXA7UD4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5xcyh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5QfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xNTc0Miw3ICsxNTg4Nyw3IEBACiBjSjp7CiAiXiI6IklwO2twPix3ejwiLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi54Tih0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMua3ApKyIgIitILmQodGhpcy53eil9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5rcCkrIiAiK0guZCh0aGlzLnd6KX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQpAQCAtMTU3NTUsNyArMTU5MDAsNyBAQAogdWt1OnsKICJeIjoiSXA7a3A+LEJiPixUOD4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5leCh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iKCIrSC5kKHRoaXMuQmIpKyIgIitILmQodGhpcy5rcCkrIiAiK0guZCh0aGlzLlQ4KSsiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5CYikrIiAiK0guZCh0aGlzLmtwKSsiICIrSC5kKHRoaXMuVDgpKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQpAQCAtMTU3NjksNyArMTU5MTQsNyBAQAogbWM6ewogIl4iOiJJcDtkYzwsU2w8LHJ1PCIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLlJEKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5kYykrIiA/ICIrSC5kKHRoaXMuU2wpKyIgOiAiK0guZCh0aGlzLnJ1KSsiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5kYykrIiA/ICIrSC5kKHRoaXMuU2wpKyIgOiAiK0guZCh0aGlzLnJ1KSsiKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCiByZXR1cm4hIUoueChiKS4kaXNtYyYmSi54QyhiLmdkYygpLHRoaXMuZGMpJiZKLnhDKGIuZ1NsKCksdGhpcy5TbCkmJkoueEMoYi5ncnUoKSx0aGlzLnJ1KX0sCiBnaU86ZnVuY3Rpb24oYSl7dmFyIHoseSx4CkBAIC0xNTc3OCwyMSArMTU5MjMsMjEgQEAKIHg9Si52MSh0aGlzLnJ1KQogcmV0dXJuIFUuTGUoVS5DMEMoVS5DMEMoVS5DMEMoMCx6KSx5KSx4KSl9LAogJGlzbWM6dHJ1ZX0sCi1tYTp7CitYN1M6ewogIl4iOiJJcDtCYj4sVDg+IiwKIFJSOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGIua3oodGhpcyl9LAogZ0Y1OmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5CYgogcmV0dXJuIHouZ1Aoeil9LAogZ2taOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlQ4fSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5CYikrIiBpbiAiK0guZCh0aGlzLlQ4KSsiKSJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIoIitILmQodGhpcy5CYikrIiBpbiAiK0guZCh0aGlzLlQ4KSsiKSJ9LCIkMCIsImdBWSIsMCwwLDY5XSwKIG46ZnVuY3Rpb24oYSxiKXtpZihiPT1udWxsKXJldHVybiExCi1yZXR1cm4hIUoueChiKS4kaXNtYSYmYi5CYi5uKDAsdGhpcy5CYikmJkoueEMoYi5UOCx0aGlzLlQ4KX0sCityZXR1cm4hIUoueChiKS4kaXNYN1MmJmIuQmIubigwLHRoaXMuQmIpJiZKLnhDKGIuVDgsdGhpcy5UOCl9LAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9dGhpcy5CYgogej16LmdpTyh6KQogeT1KLnYxKHRoaXMuVDgpCiByZXR1cm4gVS5MZShVLkMwQyhVLkMwQygwLHopLHkpKX0sCi0kaXNtYTp0cnVlLAorJGlzWDdTOnRydWUsCiAkaXNESTp0cnVlfSwKIHB4OnsKICJeIjoiSXA7QmI+LFQ4PiIsCkBAIC0xNTgwMCw3ICsxNTk0NSw3IEBACiBnRjU6ZnVuY3Rpb24oKXt2YXIgej10aGlzLlQ4CiByZXR1cm4gei5nUCh6KX0sCiBna1o6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuQmJ9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLkJiKSsiIGFzICIrSC5kKHRoaXMuVDgpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLkJiKSsiIGFzICIrSC5kKHRoaXMuVDgpKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuITEKIHJldHVybiEhSi54KGIpLiRpc3B4JiZKLnhDKGIuQmIsdGhpcy5CYikmJmIuVDgubigwLHRoaXMuVDgpfSwKIGdpTzpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC0xNTgxMyw3ICsxNTk1OCw3IEBACiB6WDp7CiAiXiI6IklwO1RmPCxKbjwiLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5DVSh0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuVGYpKyJbIitILmQodGhpcy5KbikrIl0ifSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuVGYpKyJbIitILmQodGhpcy5KbikrIl0ifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzelgmJkoueEMoYi5nVGYoKSx0aGlzLlRmKSYmSi54QyhiLmdKbigpLHRoaXMuSm4pfSwKIGdpTzpmdW5jdGlvbihhKXt2YXIgeix5CkBAIC0xNTgyMSwyMyArMTU5NjYsMjMgQEAKIHk9Si52MSh0aGlzLkpuKQogcmV0dXJuIFUuTGUoVS5DMEMoVS5DMEMoMCx6KSx5KSl9LAogJGlzelg6dHJ1ZX0sCi14OTp7CityWDp7CiAiXiI6IklwO1RmPCxvYz4iLAogUlI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi5mVih0aGlzKX0sCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMuVGYpKyIuIitILmQodGhpcy5vYyl9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5UZikrIi4iK0guZCh0aGlzLm9jKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogbjpmdW5jdGlvbihhLGIpe3ZhciB6CiBpZihiPT1udWxsKXJldHVybiExCiB6PUoueChiKQotcmV0dXJuISF6LiRpc3g5JiZKLnhDKGIuZ1RmKCksdGhpcy5UZikmJkoueEMoei5nb2MoYiksdGhpcy5vYyl9LAorcmV0dXJuISF6LiRpc3JYJiZKLnhDKGIuZ1RmKCksdGhpcy5UZikmJkoueEMoei5nb2MoYiksdGhpcy5vYyl9LAogZ2lPOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9Si52MSh0aGlzLlRmKQogeT1KLnYxKHRoaXMub2MpCiByZXR1cm4gVS5MZShVLkMwQyhVLkMwQygwLHopLHkpKX0sCi0kaXN4OTp0cnVlfSwKKyRpc3JYOnRydWV9LAogTmI6ewogIl4iOiJJcDtUZjwsU2Y+LHJlPCIsCiBSUjpmdW5jdGlvbihhLGIpe3JldHVybiBiLlpSKHRoaXMpfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBILmQodGhpcy5UZikrIi4iK0guZCh0aGlzLlNmKSsiKCIrSC5kKHRoaXMucmUpKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIEguZCh0aGlzLlRmKSsiLiIrSC5kKHRoaXMuU2YpKyIoIitILmQodGhpcy5yZSkrIikifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBuOmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKGI9PW51bGwpcmV0dXJuITEKIHo9Si54KGIpCkBAIC0xNTg0NSwxMSArMTU5OTAsMTEgQEAKIGdpTzpmdW5jdGlvbihhKXt2YXIgeix5LHgKIHo9Si52MSh0aGlzLlRmKQogeT1KLnYxKHRoaXMuU2YpCi14PVUuYjEodGhpcy5yZSkKK3g9VS5weih0aGlzLnJlKQogcmV0dXJuIFUuTGUoVS5DMEMoVS5DMEMoVS5DMEMoMCx6KSx5KSx4KSl9LAogJGlzTmI6dHJ1ZX0sCi14czp7Ci0iXiI6IlRwOjc5OyIsCitsYzp7CisiXiI6IlRwWjo4MDsiLAogJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVS5DMEMoYSxKLnYxKGIpKX0sCiAkaXNFSDp0cnVlfX1dLFsicG9seW1lcl9leHByZXNzaW9ucy5wYXJzZXIiLCJwYWNrYWdlOnBvbHltZXJfZXhwcmVzc2lvbnMvcGFyc2VyLmRhcnQiLCxULHsKICJeIjoiIiwKQEAgLTE1ODgwLDEyICsxNjAyNSwxMiBAQAogdGhpcy5CcCgpCiB3PXRoaXMuVGUoKQogdGhpcy5ycC50b1N0cmluZwotYT1uZXcgVS5tYShhLHcpfWVsc2UgaWYoSi54QyhKLlZtKHRoaXMudmkubG8pLCJhcyIpKXt0aGlzLkJwKCkKK2E9bmV3IFUuWDdTKGEsdyl9ZWxzZSBpZihKLnhDKEouVm0odGhpcy52aS5sbyksImFzIikpe3RoaXMuQnAoKQogdz10aGlzLlRlKCkKIGlmKCFKLngodykuJGlzZnApSC52aChZLlJWKCInYXMnIHN0YXRlbWVudHMgbXVzdCBlbmQgd2l0aCBhbiBpZGVudGlmaWVyIikpCiB0aGlzLnJwLnRvU3RyaW5nCiBhPW5ldyBVLnB4KGEsdyl9ZWxzZSBicmVhawotZWxzZXtpZihKLnhDKEouSXoodGhpcy52aS5sbyksOCkpe3o9dGhpcy52aS5sby5nUDkoKQorZWxzZXtpZihKLnhDKEouSXoodGhpcy52aS5sbyksOCkpe3o9dGhpcy52aS5sby5nblMoKQogaWYodHlwZW9mIHohPT0ibnVtYmVyIilyZXR1cm4gei5GKCkKIGlmKHR5cGVvZiBiIT09Im51bWJlciIpcmV0dXJuIEgucyhiKQogej16Pj1ifWVsc2Ugej0hMQpAQCAtMTU5MDAsNyArMTYwNDUsNyBAQAogej1KLngoYikKIGlmKCEhei4kaXNmcCl7ej16LmdQKGIpCiB0aGlzLnJwLnRvU3RyaW5nCi1yZXR1cm4gbmV3IFUueDkoYSx6KX1lbHNlIGlmKCEhei4kaXNOYiYmISFKLngoYi5nVGYoKSkuJGlzZnApe3o9Si5WbShiLmdUZigpKQorcmV0dXJuIG5ldyBVLnJYKGEseil9ZWxzZSBpZighIXouJGlzTmImJiEhSi54KGIuZ1RmKCkpLiRpc2ZwKXt6PUouVm0oYi5nVGYoKSkKIHk9Yi5ncmUoKQogdGhpcy5ycC50b1N0cmluZwogcmV0dXJuIG5ldyBVLk5iKGEseix5KX1lbHNlIHRocm93IEguYihZLlJWKCJleHBlY3RlZCBpZGVudGlmaWVyOiAiK0guZChiKSkpfSwKQEAgLTE1OTExLDE1ICsxNjA1NiwxNSBAQAogdGhpcy5CcCgpCiB4PXRoaXMuWXEoKQogd2hpbGUoITApe3c9dGhpcy52aS5sbwotaWYodyE9bnVsbClpZihKLnhDKEouSXoodyksOCl8fEoueEMoSi5Jeih0aGlzLnZpLmxvKSwzKXx8Si54QyhKLkl6KHRoaXMudmkubG8pLDkpKXt3PXRoaXMudmkubG8uZ1A5KCkKLXY9ei5nUDkoKQoraWYodyE9bnVsbClpZihKLnhDKEouSXoodyksOCl8fEoueEMoSi5Jeih0aGlzLnZpLmxvKSwzKXx8Si54QyhKLkl6KHRoaXMudmkubG8pLDkpKXt3PXRoaXMudmkubG8uZ25TKCkKK3Y9ei5nblMoKQogaWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gdy5EKCkKIGlmKHR5cGVvZiB2IT09Im51bWJlciIpcmV0dXJuIEgucyh2KQogdj13PnYKIHc9dn1lbHNlIHc9ITEKIGVsc2Ugdz0hMQogaWYoIXcpYnJlYWsKLXg9dGhpcy5taSh4LHRoaXMudmkubG8uZ1A5KCkpfXk9eS5nUCh6KQoreD10aGlzLm1pKHgsdGhpcy52aS5sby5nblMoKSl9eT15LmdQKHopCiB0aGlzLnJwLnRvU3RyaW5nCiByZXR1cm4gbmV3IFUudWt1KHksYSx4KX0sCiBZcTpmdW5jdGlvbigpe3ZhciB6LHkseCx3CkBAIC0xNTkzNywxMyArMTYwODIsMTMgQEAKIHo9bmV3IFUubm8oeCkKIHouJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KIHRoaXMuQnAoKQotcmV0dXJuIHp9ZWxzZXt3PXRoaXMubWkodGhpcy5MTCgpLDExKQorcmV0dXJuIHp9ZWxzZXt3PXRoaXMubWkodGhpcy5mcSgpLDExKQogeS50b1N0cmluZwogcmV0dXJuIG5ldyBVLmNKKHosdyl9fX1lbHNlIGlmKHkubih6LCIhIikpe3RoaXMuQnAoKQotdz10aGlzLm1pKHRoaXMuTEwoKSwxMSkKK3c9dGhpcy5taSh0aGlzLmZxKCksMTEpCiB0aGlzLnJwLnRvU3RyaW5nCi1yZXR1cm4gbmV3IFUuY0ooeix3KX1lbHNlIHRocm93IEguYihZLlJWKCJ1bmV4cGVjdGVkIHRva2VuOiAiK0guZCh6KSkpfXJldHVybiB0aGlzLkxMKCl9LAotTEw6ZnVuY3Rpb24oKXt2YXIgeix5CityZXR1cm4gbmV3IFUuY0ooeix3KX1lbHNlIHRocm93IEguYihZLlJWKCJ1bmV4cGVjdGVkIHRva2VuOiAiK0guZCh6KSkpfXJldHVybiB0aGlzLmZxKCl9LAorZnE6ZnVuY3Rpb24oKXt2YXIgeix5CiBzd2l0Y2goSi5Jeih0aGlzLnZpLmxvKSl7Y2FzZSAxMDp6PUouVm0odGhpcy52aS5sbykKIGlmKEoueEMoeiwidGhpcyIpKXt0aGlzLkJwKCkKIHRoaXMucnAudG9TdHJpbmcKQEAgLTE2MDM1LDEzICsxNjE4MCwxMyBAQAogcmV0dXJuIHl9LAogeEo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51MygiIil9fX1dLFsicG9seW1lcl9leHByZXNzaW9ucy5zcmMuZ2xvYmFscyIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy9zcmMvZ2xvYmFscy5kYXJ0IiwsSyx7CiAiXiI6IiIsCi1DNzpbZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IEsuQnQoYSksW251bGxdKX0sIiQxIiwicGciLDIsMCw2Niw2N10sCitEYzpbZnVuY3Rpb24oYSl7cmV0dXJuIEguVk0obmV3IEsuQnQoYSksW251bGxdKX0sIiQxIiwiVU0iLDIsMCw2Niw2N10sCiBBZXA6ewogIl4iOiJhO3ZIPixQPiIsCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzQWVwJiZKLnhDKGIudkgsdGhpcy52SCkmJkoueEMoYi5QLHRoaXMuUCl9LAogZ2lPOmZ1bmN0aW9uKGEpe3JldHVybiBKLnYxKHRoaXMuUCl9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLnZIKSsiLCAiK0guZCh0aGlzLlApKyIpIn0sCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIigiK0guZCh0aGlzLnZIKSsiLCAiK0guZCh0aGlzLlApKyIpIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzQWVwOnRydWV9LAogQnQ6ewogIl4iOiJtVztZUiIsCkBAIC0xNjA1Myw3ICsxNjE5OCw3IEBACiBnclo6ZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLllSCiB5PUouVTYoeikKLXo9bmV3IEsuQWVwKEouYkkoeS5nQih6KSwxKSx5LmdyWih6KSkKK3o9bmV3IEsuQWVwKEouSG4oeS5nQih6KSwxKSx5LmdyWih6KSkKIHouJGJ1aWx0aW5UeXBlSW5mbz10aGlzLiRidWlsdGluVHlwZUluZm8KIHJldHVybiB6fSwKICRhc21XOmZ1bmN0aW9uKGEpe3JldHVybltbSy5BZXAsYV1dfSwKQEAgLTE2MDc0LDggKzE2MjE5LDggQEAKIGNhc2UgMTE4OnJldHVybiAxMQogZGVmYXVsdDpyZXR1cm4gYX19LAogcVM6ewotIl4iOiJhO2ZZPixQPixQOTwiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIigiK3RoaXMuZlkrIiwgJyIrdGhpcy5QKyInKSJ9LAorIl4iOiJhO2ZZPixQPixuUzwiLAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiIoIit0aGlzLmZZKyIsICciK3RoaXMuUCsiJykifSwiJDAiLCJnQVkiLDAsMCw2OV0sCiAkaXNxUzp0cnVlfSwKIHh2OnsKICJeIjoiYTtNVix6eSxqSSx4MCIsCkBAIC0xNjEwMCwxMyArMTYyNDUsMTMgQEAKIHRoaXMueDA9eAogaWYoQy5ObS50ZyhDLmJnLHgpKXt4PXRoaXMueDAKIHU9SC5MWShbdix4XSkKLWlmKEMuTm0udGcoQy5HOCx1KSl7eD16LkcoKT96LlduOm51bGwKK2lmKEMuTm0udGcoQy5Gbix1KSl7eD16LkcoKT96LlduOm51bGwKIHRoaXMueDA9eAogaWYoeD09PTYxKXg9dj09PTMzfHx2PT09NjEKIGVsc2UgeD0hMQogaWYoeCl7dD11KyI9IgotdGhpcy54MD16LkcoKT96LlduOm51bGx9ZWxzZSB0PXV9ZWxzZSB0PUguSk0odil9ZWxzZSB0PUguSk0odikKLXkucHVzaChuZXcgWS5xUyg4LHQsQy5seC50KDAsdCkpKX1lbHNlIGlmKEMuTm0udGcoQy5pcSx0aGlzLngwKSl7cz1ILkpNKHRoaXMueDApCit0aGlzLngwPXouRygpP3ouV246bnVsbH1lbHNlIHQ9dX1lbHNlIHQ9SC5teCh2KX1lbHNlIHQ9SC5teCh2KQoreS5wdXNoKG5ldyBZLnFTKDgsdCxDLmx4LnQoMCx0KSkpfWVsc2UgaWYoQy5ObS50ZyhDLmlxLHRoaXMueDApKXtzPUgubXgodGhpcy54MCkKIHkucHVzaChuZXcgWS5xUyg5LHMsQy5seC50KDAscykpKQogdGhpcy54MD16LkcoKT96LlduOm51bGx9ZWxzZSB0aGlzLngwPXouRygpP3ouV246bnVsbH1yZXR1cm4geX0sCiBXRzpmdW5jdGlvbigpe3ZhciB6LHkseCx3CkBAIC0xNjExOCw4ICsxNjI2Myw4IEBACiBpZih4PT09OTIpe3g9eS5HKCk/eS5XbjpudWxsCiB0aGlzLngwPXgKIGlmKHg9PW51bGwpdGhyb3cgSC5iKFkuUlYoInVudGVybWluYXRlZCBzdHJpbmciKSkKLXg9SC5KTShZLndYKHgpKQotdy52TSs9eH1lbHNle3g9SC5KTSh4KQoreD1ILm14KFkud1goeCkpCit3LnZNKz14fWVsc2V7eD1ILm14KHgpCiB3LnZNKz14fXg9eS5HKCk/eS5XbjpudWxsCiB0aGlzLngwPXh9dGhpcy5NVi5wdXNoKG5ldyBZLnFTKDEsdy52TSwwKSkKIHcudk09IiIKQEAgLTE2MTMzLDcgKzE2Mjc4LDcgQEAKIGVsc2Ugdz0hMAogZWxzZSB3PSEwfWVsc2Ugdz0hMQogaWYoIXcpYnJlYWsKLXg9SC5KTSh4KQoreD1ILm14KHgpCiB5LnZNKz14CiB0aGlzLngwPXouRygpP3ouV246bnVsbH12PXkudk0KIHo9dGhpcy5NVgpAQCAtMTYxNDcsNyArMTYyOTIsNyBAQAogaWYoeCE9bnVsbCl7aWYodHlwZW9mIHghPT0ibnVtYmVyIilyZXR1cm4gSC5zKHgpCiB3PTQ4PD14JiZ4PD01N31lbHNlIHc9ITEKIGlmKCF3KWJyZWFrCi14PUguSk0oeCkKK3g9SC5teCh4KQogeS52TSs9eAogdGhpcy54MD16LkcoKT96LlduOm51bGx9aWYoeD09PTQ2KXt6PXouRygpP3ouV246bnVsbAogdGhpcy54MD16CkBAIC0xNjE1Nyw1OCArMTYzMDIsNTggQEAKIHkudk09IiJ9fSwKIHF2OmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKIHo9dGhpcy56eQotei5LRihILkpNKDQ2KSkKK3ouS0YoSC5teCg0NikpCiB5PXRoaXMuakkKIHdoaWxlKCEwKXt4PXRoaXMueDAKIGlmKHghPW51bGwpe2lmKHR5cGVvZiB4IT09Im51bWJlciIpcmV0dXJuIEgucyh4KQogdz00ODw9eCYmeDw9NTd9ZWxzZSB3PSExCiBpZighdylicmVhawoteD1ILkpNKHgpCit4PUgubXgoeCkKIHoudk0rPXgKIHRoaXMueDA9eS5HKCk/eS5XbjpudWxsfXRoaXMuTVYucHVzaChuZXcgWS5xUyg3LHoudk0sMCkpCiB6LnZNPSIifX0sCiBoQTp7CiAiXiI6ImE7RzE+IiwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiJQYXJzZUV4Y2VwdGlvbjogIit0aGlzLkcxfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iUGFyc2VFeGNlcHRpb246ICIrdGhpcy5HMX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntSVjpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IFkuaEEoYSl9fX19XSxbInBvbHltZXJfZXhwcmVzc2lvbnMudmlzaXRvciIsInBhY2thZ2U6cG9seW1lcl9leHByZXNzaW9ucy92aXNpdG9yLmRhcnQiLCxTLHsKICJeIjoiIiwKIFA1NTp7CiAiXiI6ImE7IiwKLURWOltmdW5jdGlvbihhKXtyZXR1cm4gSi5OVihhLHRoaXMpfSwiJDEiLCJnYXkiLDIsMCwxOTEsMTUzXX0sCitEVjpbZnVuY3Rpb24oYSl7cmV0dXJuIEoub2tWKGEsdGhpcyl9LCIkMSIsImdheSIsMiwwLDE5MywxNTVdfSwKIGNmUzp7CiAiXiI6IlA1NTsiLAogeG46ZnVuY3Rpb24oYSl7fSwKIFc5OmZ1bmN0aW9uKGEpe3RoaXMueG4oYSl9LAogTFQ6ZnVuY3Rpb24oYSl7YS53ei5SUigwLHRoaXMpCiB0aGlzLnhuKGEpfSwKLWZWOmZ1bmN0aW9uKGEpe0ouTlYoYS5nVGYoKSx0aGlzKQorZlY6ZnVuY3Rpb24oYSl7Si5va1YoYS5nVGYoKSx0aGlzKQogdGhpcy54bihhKX0sCi1DVTpmdW5jdGlvbihhKXtKLk5WKGEuZ1RmKCksdGhpcykKLUouTlYoYS5nSm4oKSx0aGlzKQorQ1U6ZnVuY3Rpb24oYSl7Si5va1YoYS5nVGYoKSx0aGlzKQorSi5va1YoYS5nSm4oKSx0aGlzKQogdGhpcy54bihhKX0sCiBaUjpmdW5jdGlvbihhKXt2YXIgegotSi5OVihhLmdUZigpLHRoaXMpCi1pZihhLmdyZSgpIT1udWxsKWZvcih6PWEuZ3JlKCksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KUouTlYoei5sbyx0aGlzKQorSi5va1YoYS5nVGYoKSx0aGlzKQoraWYoYS5ncmUoKSE9bnVsbClmb3Ioej1hLmdyZSgpLHo9SC5WTShuZXcgSC5hNyh6LHoubGVuZ3RoLDAsbnVsbCksW0guT3EoeiwwKV0pO3ouRygpOylKLm9rVih6LmxvLHRoaXMpCiB0aGlzLnhuKGEpfSwKIG9EOmZ1bmN0aW9uKGEpe3RoaXMueG4oYSl9LAogWmg6ZnVuY3Rpb24oYSl7dmFyIHoKLWZvcih6PWEuZ2hMKCksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KUouTlYoei5sbyx0aGlzKQorZm9yKHo9YS5naEwoKSx6PUguVk0obmV3IEguYTcoeix6Lmxlbmd0aCwwLG51bGwpLFtILk9xKHosMCldKTt6LkcoKTspSi5va1Yoei5sbyx0aGlzKQogdGhpcy54bihhKX0sCiBvMDpmdW5jdGlvbihhKXt2YXIgegotZm9yKHo9YS5nUmwoYSksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5LcCh6LDApXSk7ei5HKCk7KUouTlYoei5sbyx0aGlzKQorZm9yKHo9YS5nUmwoYSksej1ILlZNKG5ldyBILmE3KHosei5sZW5ndGgsMCxudWxsKSxbSC5PcSh6LDApXSk7ei5HKCk7KUoub2tWKHoubG8sdGhpcykKIHRoaXMueG4oYSl9LAotWVY6ZnVuY3Rpb24oYSl7Si5OVihhLmdHMyhhKSx0aGlzKQotSi5OVihhLmd2NCgpLHRoaXMpCitZVjpmdW5jdGlvbihhKXtKLm9rVihhLmdHMyhhKSx0aGlzKQorSi5va1YoYS5ndjQoKSx0aGlzKQogdGhpcy54bihhKX0sCiBxczpmdW5jdGlvbihhKXt0aGlzLnhuKGEpfSwKLWV4OmZ1bmN0aW9uKGEpe0ouTlYoYS5nQmIoYSksdGhpcykKLUouTlYoYS5nVDgoYSksdGhpcykKK2V4OmZ1bmN0aW9uKGEpe0oub2tWKGEuZ0JiKGEpLHRoaXMpCitKLm9rVihhLmdUOChhKSx0aGlzKQogdGhpcy54bihhKX0sCi14TjpmdW5jdGlvbihhKXtKLk5WKGEuZ3d6KCksdGhpcykKK3hOOmZ1bmN0aW9uKGEpe0oub2tWKGEuZ3d6KCksdGhpcykKIHRoaXMueG4oYSl9LAotUkQ6ZnVuY3Rpb24oYSl7Si5OVihhLmdkYygpLHRoaXMpCi1KLk5WKGEuZ1NsKCksdGhpcykKLUouTlYoYS5ncnUoKSx0aGlzKQorUkQ6ZnVuY3Rpb24oYSl7Si5va1YoYS5nZGMoKSx0aGlzKQorSi5va1YoYS5nU2woKSx0aGlzKQorSi5va1YoYS5ncnUoKSx0aGlzKQogdGhpcy54bihhKX0sCiBrejpmdW5jdGlvbihhKXthLkJiLlJSKDAsdGhpcykKIGEuVDguUlIoMCx0aGlzKQpAQCAtMTYyMTgsNzIgKzE2MzYzLDkzIEBACiB0aGlzLnhuKGEpfX19XSxbInNjcmlwdF9pbnNldF9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0LmRhcnQiLCxULHsKICJeIjoiIiwKIG92OnsKLSJeIjoiVjQ1O29YLEdSLGNJLEJpPSx4byxaSixLZixPcSxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY0NTtvWCx0NyxmSSxGZCxjSSxIZSx4byxaSixLZixudSxPcSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEub1h9LAogc0lzOmZ1bmN0aW9uKGEsYil7YS5vWD10aGlzLmN0KGEsQy5QWCxhLm9YLGIpfSwKLWdCVjpmdW5jdGlvbihhKXtyZXR1cm4gYS5HUn0sCi1zQlY6ZnVuY3Rpb24oYSxiKXthLkdSPXRoaXMuY3QoYSxDLnRXLGEuR1IsYil9LAorZ2ZnOmZ1bmN0aW9uKGEpe3JldHVybiBhLnQ3fSwKK3NmZzpmdW5jdGlvbihhLGIpe2EudDc9dGhpcy5jdChhLEMuQTcsYS50NyxiKX0sCitnR1Y6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZkl9LAorc0dWOmZ1bmN0aW9uKGEsYil7YS5mST10aGlzLmN0KGEsQy52WSxhLmZJLGIpfSwKK2dMZjpmdW5jdGlvbihhKXtyZXR1cm4gYS5GZH0sCitzTGY6ZnVuY3Rpb24oYSxiKXthLkZkPXRoaXMuY3QoYSxDLklULGEuRmQsYil9LAogZ01sOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNJfSwKIHNNbDpmdW5jdGlvbihhLGIpe2EuY0k9dGhpcy5jdChhLEMuR3IsYS5jSSxiKX0sCitnTUw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuSGV9LAorc01MOmZ1bmN0aW9uKGEsYil7YS5IZT10aGlzLmN0KGEsQy5rSSxhLkhlLGIpfSwKIGd4VDpmdW5jdGlvbihhKXtyZXR1cm4gYS54b30sCiBzeFQ6ZnVuY3Rpb24oYSxiKXthLnhvPXRoaXMuY3QoYSxDLm50LGEueG8sYil9LAogZ2laOmZ1bmN0aW9uKGEpe3JldHVybiBhLlpKfSwKIHNpWjpmdW5jdGlvbihhLGIpe2EuWko9dGhpcy5jdChhLEMudnMsYS5aSixiKX0sCiBnR2Q6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuS2Z9LAogc0dkOmZ1bmN0aW9uKGEsYil7YS5LZj10aGlzLmN0KGEsQy5TQSxhLktmLGIpfSwKLUVzOmZ1bmN0aW9uKGEpe1oudUwucHJvdG90eXBlLkVzLmNhbGwodGhpcyxhKX0sCi1WajpbZnVuY3Rpb24oYSxiKXt0aGlzLm1DKGEpfSwiJDEiLCJnY1kiLDIsMCwyMCw1N10sCi1mWDpbZnVuY3Rpb24oYSxiKXt0aGlzLm1DKGEpfSwiJDEiLCJnSUYiLDIsMCwyMCw1N10sCitObjpbZnVuY3Rpb24oYSxiKXtyZXR1cm4ibGluZS0iK0guZChiKX0sIiQxIiwiZ3VTIiwyLDAsMTUsMTk0XSwKK2liOltmdW5jdGlvbihhLGIsYyl7dmFyIHoseQorej0oYS5zaGFkb3dSb290fHxhLndlYmtpdFNoYWRvd1Jvb3QpLnF1ZXJ5U2VsZWN0b3IoIiNsaW5lLSIrSC5kKGEuSGUpKQoraWYoeiE9bnVsbCl7eT0hIXouc2Nyb2xsSW50b1ZpZXdJZk5lZWRlZAoraWYoeSl6LnNjcm9sbEludG9WaWV3SWZOZWVkZWQoKQorZWxzZSB6LnNjcm9sbEludG9WaWV3KCl9fSwiJDIiLCJnRkciLDQsMCwxOTUsMTk2LDE5N10sCitFczpmdW5jdGlvbihhKXt2YXIgeix5CitaLnVMLnByb3RvdHlwZS5Fcy5jYWxsKHRoaXMsYSkKK3o9KGEuc2hhZG93Um9vdHx8YS53ZWJraXRTaGFkb3dSb290KS5xdWVyeVNlbGVjdG9yKCIuc291cmNlVGFibGUiKQoraWYoeiE9bnVsbCl7eT1XLldzKHRoaXMuZ0ZHKGEpKQorYS5udT15CitDLlMyLk9UKHkseiwhMCl9fSwKK2RROmZ1bmN0aW9uKGEpe3ZhciB6PWEubnUKK2lmKHohPW51bGwpe3ouZGlzY29ubmVjdCgpCithLm51PW51bGx9Wi51TC5wcm90b3R5cGUuZFEuY2FsbCh0aGlzLGEpfSwKK0dBOltmdW5jdGlvbihhLGIpe3RoaXMubUMoYSl9LCIkMSIsImdvTCIsMiwwLDIwLDU3XSwKK1lvOltmdW5jdGlvbihhLGIpe3RoaXMubUMoYSl9LCIkMSIsImdpZSIsMiwwLDIwLDU3XSwKIHJBOltmdW5jdGlvbihhLGIpe3RoaXMubUMoYSl9LCIkMSIsImdScSIsMiwwLDIwLDU3XSwKLURKOltmdW5jdGlvbihhLGIpe2lmKGI9PW51bGwpcmV0dXJuIm1pbi13aWR0aDozMnB4OyIKLWVsc2UgaWYoSi54QyhiLDApKXJldHVybiJtaW4td2lkdGg6MzJweDsgYmFja2dyb3VuZC1jb2xvcjpyZWQiCi1yZXR1cm4ibWluLXdpZHRoOjMycHg7IGJhY2tncm91bmQtY29sb3I6Z3JlZW4ifSwiJDEiLCJnZnEiLDIsMCwxNSwxOTJdLAorb2s6W2Z1bmN0aW9uKGEsYil7dGhpcy5tQyhhKX0sIiQxIiwiZ2NZIiwyLDAsMjAsNTddLAogbUM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CiBpZihhLk9xIT1udWxsKXJldHVybgotaWYoSi5pUyhhLm9YKSE9PSEwKXthLk9xPUouU0soYS5vWCkubWwobmV3IFQuRXMoYSkpCi1yZXR1cm59ej1hLkdSCi16PXohPW51bGw/Si5iSShhLm9YLnE2KHopLDEpOjAKLXo9dGhpcy5jdChhLEMubnQsYS54byx6KQotYS54bz16Ci15PWEuY0kKLXo9eSE9bnVsbD9hLm9YLnE2KHkpOkouZXcoeiwxKQorej1hLm9YCitpZih6PT1udWxsKXJldHVybgoraWYoSi5pUyh6KSE9PSEwKXthLk9xPUouU0soYS5vWCkubWwobmV3IFQuRXMoYSkpCityZXR1cm59ej1hLkZkCit6PXohPW51bGw/YS5vWC5xNih6KToxCithLnhvPXRoaXMuY3QoYSxDLm50LGEueG8seikKK3o9YS5mSQorej16IT1udWxsP2Eub1gucTYoeik6bnVsbAorYS5IZT10aGlzLmN0KGEsQy5rSSxhLkhlLHopCit6PWEuY0kKK3k9YS5vWAorej16IT1udWxsP3kucTYoeik6Si5xOChKLmRlKHkpKQogYS5aSj10aGlzLmN0KGEsQy52cyxhLlpKLHopCi16PWEuQmkKLXouVjEoeikKLWZvcih4PWEueG87eT1KLld4KHgpLHkuQyh4LGEuWkopO3g9eS5nKHgsMSkpei5oKDAseCl9LAotc3RhdGljOnsiXiI6Ik5NLE1SVyxWblAiLFQ1aTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwotej1RLmNoKG51bGwsUC5LTikKLXk9Ui50QihbXSkKLXg9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCi13PVAucVUKLXc9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHcsbnVsbCksbnVsbCxudWxsKSxbdyxudWxsXSkKLWEuQmk9egotYS5LZj15Ci1hLlNhPVtdCitKLlo4KGEuS2YpCitmb3IoeD1KLkhuKGEueG8sMSk7ej1KLld4KHgpLHouRSh4LEouSG4oYS5aSiwxKSk7eD16LmcoeCwxKSlKLmJpKGEuS2YsSi5VUShKLmRlKGEub1gpLHgpKX0sCitzdGF0aWM6e1Q1aTpmdW5jdGlvbihhKXt2YXIgeix5LHgKK3o9Ui50QihbXSkKK3k9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCit4PVAucVUKK3g9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHgsbnVsbCksbnVsbCxudWxsKSxbeCxudWxsXSkKK2EudDc9bnVsbAorYS5LZj16CithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXgKLWEuWlE9dwotQy5GYS5aTChhKQotQy5GYS5YSShhKQorYS5vRz0hMQorYS5aTT15CithLlpRPXgKK0MuemEuWkwoYSkKK0MuemEuWEkoYSkKIHJldHVybiBhfX19LAogVjQ1OnsKICJeIjoidUwrUGk7IiwKICRpc2QzOnRydWV9LAogRXM6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYQogaWYoSi5pUyh6Lm9YKT09PSEwKXt6Lk9xPW51bGwKIEouVEcoeil9fSwiJDEiLG51bGwsMiwwLG51bGwsMTQsImNhbGwiXSwKICRpc0VIOnRydWV9fV0sWyJzY3JpcHRfcmVmX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zY3JpcHRfcmVmLmRhcnQiLCxBLHsKICJeIjoiIiwKIGtuOnsKLSJeIjoib0VZO2pKLEFQLGZuLHRZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoib0VZO2pKLEFQLGZuLHRZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdCVjpmdW5jdGlvbihhKXtyZXR1cm4gYS5qSn0sCiBzQlY6ZnVuY3Rpb24oYSxiKXthLmpKPXRoaXMuY3QoYSxDLnRXLGEuakosYil9LAogZ0pwOmZ1bmN0aW9uKGEpe3ZhciB6PWEudFkKIGlmKHo9PW51bGwpcmV0dXJuIFEueEkucHJvdG90eXBlLmdKcC5jYWxsKHRoaXMsYSkKLXJldHVybiB6LmdkTigpfSwKK3JldHVybiB6LmdUWCgpfSwKIGZYOltmdW5jdGlvbihhLGIpe3RoaXMucjYoYSxudWxsKX0sIiQxIiwiZ0lGIiwyLDAsMjAsNTddLAogcjY6W2Z1bmN0aW9uKGEsYil7dmFyIHo9YS50WQogaWYoeiE9bnVsbCYmSi5pUyh6KT09PSEwKXt0aGlzLmN0KGEsQy5ZUywwLDEpCkBAIC0xNjI5NCwyMiArMTY0NjAsMjAgQEAKIHk9YS50WQogaWYoej09PSEwKXJldHVybiBILmQoUS54SS5wcm90b3R5cGUuZ29jLmNhbGwodGhpcyxhKSkrIjoiK0guZCh5LnE2KGEuakopKQogZWxzZSBKLlNLKHkpLm1sKHRoaXMuZ3ZvKGEpKX1yZXR1cm4gUS54SS5wcm90b3R5cGUuZ29jLmNhbGwodGhpcyxhKX0sCi1nTzM6ZnVuY3Rpb24oYSl7dmFyIHoseQotaWYoYS50WT09bnVsbClyZXR1cm4gUS54SS5wcm90b3R5cGUuZ08zLmNhbGwodGhpcyxhKQotaWYoSi5KNShhLmpKLDApKXt6PUouaVMoYS50WSkKLXk9YS50WQotaWYoej09PSEwKXJldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpKyIjbGluZT0iK0guZCh5LnE2KGEuakopKQotZWxzZSBKLlNLKHkpLm1sKHRoaXMuZ3ZvKGEpKX1yZXR1cm4gUS54SS5wcm90b3R5cGUuZ08zLmNhbGwodGhpcyxhKX0sCi1zdGF0aWM6e0lyOmZ1bmN0aW9uKGEpe3ZhciB6LHkKK2dPMzpmdW5jdGlvbihhKXtpZihhLnRZPT1udWxsKXJldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpCitpZihKLko1KGEuakosMCkpaWYoSi5pUyhhLnRZKT09PSEwKXJldHVybiBRLnhJLnByb3RvdHlwZS5nTzMuY2FsbCh0aGlzLGEpKyIjcG9zPSIrSC5kKGEuakopCitlbHNlIEouU0soYS50WSkubWwodGhpcy5ndm8oYSkpCityZXR1cm4gUS54SS5wcm90b3R5cGUuZ08zLmNhbGwodGhpcyxhKX0sCitzdGF0aWM6e1RROmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuako9LTEKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuV2EuWkwoYSkKIEMuV2EuWEkoYSkKQEAgLTE2MzE5LDcgKzE2NDgzLDcgQEAKICRpc2QzOnRydWV9fV0sWyJzY3JpcHRfdmlld19lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X3ZpZXcuZGFydCIsLFUsewogIl4iOiIiLAogZkk6ewotIl4iOiJWNDY7VXosQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDY7VXosQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ0lzOmZ1bmN0aW9uKGEpe3JldHVybiBhLlV6fSwKIHNJczpmdW5jdGlvbihhLGIpe2EuVXo9dGhpcy5jdChhLEMuUFgsYS5VeixiKX0sCiBFczpmdW5jdGlvbihhKXt2YXIgegpAQCAtMTYzMjcsMTkgKzE2NDkxLDE5IEBACiB6PWEuVXoKIGlmKHo9PW51bGwpcmV0dXJuCiBKLlNLKHopfSwKLXBBOltmdW5jdGlvbihhLGIpe0ouY0koYS5VeikuWU0oYil9LCIkMSIsImd2QyIsMiwwLDIwLDk4XSwKLWo5OltmdW5jdGlvbihhLGIpe0ouZWcoYS5VeikuWU0oYil9LCIkMSIsImdEWCIsMiwwLDIwLDk4XSwKLXN0YXRpYzp7ZEk6ZnVuY3Rpb24oYSl7dmFyIHoseQorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLlV6KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAorajk6W2Z1bmN0aW9uKGEsYil7Si5lZyhhLlV6KS5ZTShiKX0sIiQxIiwiZ0RYIiwyLDAsMjAsOTldLAorc3RhdGljOntVRjpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15Ci1DLkZILlpMKGEpCi1DLkZILlhJKGEpCitDLmNKMC5aTChhKQorQy5jSjAuWEkoYSkKIHJldHVybiBhfX19LAogVjQ2OnsKICJeIjoidUwrUGk7IiwKQEAgLTE2MzY4LDcgKzE2NTMyLDcgQEAKIHYuJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHY9bmV3IFEud24obnVsbCxudWxsLHYsbnVsbCxudWxsKQogdi4kYnVpbHRpblR5cGVJbmZvPVt6XQotej1ELnZPCit6PUQuS3AKIHU9W10KIHUuJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHU9bmV3IFEud24obnVsbCxudWxsLHUsbnVsbCxudWxsKQpAQCAtMTYzOTcsNiArMTY1NjEsOCBAQAogYnJlYWsKIGNhc2UiRXJyb3IiOnM9bmV3IEQucEQobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogYnJlYWsKK2Nhc2UiRnVuY3Rpb24iOnM9bmV3IEQuS3AobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiticmVhawogY2FzZSJJc29sYXRlIjp6PUouSTIoYSkKIHg9bmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCxudWxsLG51bGwpLG51bGwsbnVsbCkKIHguJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbCxudWxsXQpAQCAtMTY0MzksMTMgKzE2NjA1LDE0IEBACiB1LiRidWlsdGluVHlwZUluZm89W3pdCiB1PW5ldyBRLnduKG51bGwsbnVsbCx1LG51bGwsbnVsbCkKIHUuJGJ1aWx0aW5UeXBlSW5mbz1bel0KLXo9RC52Tworej1ELktwCiB0PVtdCiB0LiRidWlsdGluVHlwZUluZm89W3pdCiB0PW5ldyBRLnduKG51bGwsbnVsbCx0LG51bGwsbnVsbCkKIHQuJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHM9bmV3IEQuVTQobnVsbCx4LHcsdix1LHQsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIGJyZWFrCitjYXNlIk51bGwiOnJldHVybgogY2FzZSJTZXJ2aWNlRXJyb3IiOnM9bmV3IEQuTjcobnVsbCxudWxsLG51bGwsbnVsbCxhLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiBicmVhawogY2FzZSJTZXJ2aWNlRXZlbnQiOnM9bmV3IEQuTWsobnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKQEAgLTE2NDU3LDcgKzE2NjI0LDcgQEAKIHguJGJ1aWx0aW5UeXBlSW5mbz1bel0KIHg9bmV3IFEud24obnVsbCxudWxsLHgsbnVsbCxudWxsKQogeC4kYnVpbHRpblR5cGVJbmZvPVt6XQotcz1uZXcgRC52eCh4LFAuTDUobnVsbCxudWxsLG51bGwsUC5LTixQLktOKSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxhLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCitzPW5ldyBELnZ4KHgsUC5MNShudWxsLG51bGwsbnVsbCxQLktOLFAuS04pLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxQLkZsKG51bGwsbnVsbCksUC5GbChudWxsLG51bGwpLG51bGwsbnVsbCxhLG51bGwsbnVsbCwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwpCiBicmVhawogY2FzZSJTb2NrZXQiOnM9bmV3IEQuV1AobnVsbCxudWxsLG51bGwsbnVsbCwiIiwhMSwhMSwhMSwhMSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCkKIGJyZWFrCkBAIC0xNjQ4NCw3ICsxNjY1MSw3IEBACiBlbHNlIGlmKCEhdy4kaXN3bilELmYzKHgsYikKIGVsc2UgaWYodilELkdmKHgsYil9fSwKIGFmOnsKLSJeIjoiUGk7Yk5ALHQ3QCIsCisiXiI6IlBpO2JOQCxHUkAiLAogZ1hQOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuUDN9LAogZ3d2OmZ1bmN0aW9uKGEpe3JldHVybiBKLkkyKHRoaXMuUDMpfSwKIGdvZDpmdW5jdGlvbihhKXtyZXR1cm4gSi5hVCh0aGlzLlAzKX0sCkBAIC0xNjQ5Niw4ICsxNjY2Myw4IEBACiBnTTg6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sCiBnb2M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ2JOKCl9LAogc29jOmZ1bmN0aW9uKGEsYil7dGhpcy5zYk4odGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5nYk4oKSxiKSl9LAotZ2ROOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3Q3KCl9LAotc2ROOmZ1bmN0aW9uKGEpe3RoaXMuc3Q3KHRoaXMuY3QodGhpcyxDLlRjLHRoaXMuZ3Q3KCksYSkpfSwKK2dUWDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdHUigpfSwKK3NUWDpmdW5jdGlvbihhKXt0aGlzLnNHUih0aGlzLmN0KHRoaXMsQy5UYyx0aGlzLmdHUigpLGEpKX0sCiB4VzpmdW5jdGlvbihhKXtpZih0aGlzLmtUKXJldHVybiBQLkFiKHRoaXMsbnVsbCkKIHJldHVybiB0aGlzLlJFKDApfSwKIFJFOmZ1bmN0aW9uKGEpe3ZhciB6CkBAIC0xNjUxNiwxMCArMTY2ODMsMTAgQEAKIGlmKHchPW51bGwmJiFKLnhDKHcsei50KGEsImlkIikpKTt0aGlzLnIwPXoudChhLCJpZCIpCiB0aGlzLm1RPXgKIHRoaXMuYkYoMCxhLHkpfSwKLU1xOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nUGoodGhpcykrIi8iK0guZChhKX0sIiQxIiwiZ0xjIiwyLDAsMTYyLDE5M10sCitNcTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZ1BqKHRoaXMpKyIvIitILmQoYSl9LCIkMSIsImdMYyIsMiwwLDE2NCwxOThdLAogJGlzYWY6dHJ1ZX0sCiBCZjp7Ci0iXiI6IlRwOjE5NTthIiwKKyJeIjoiVHBaOjIwMDthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PUouVVEoYSwidHlwZSIpCiB5PUouclkoeikKQEAgLTE2NTI3LDI1ICsxNjY5NCwyNSBAQAogeT10aGlzLmEKIGlmKCFKLnhDKHoseS5tUSkpcmV0dXJuIEQuTmwoeS5QMyxhKQogeS5lQyhhKQotcmV0dXJuIHl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTQsImNhbGwiXSwKK3JldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTk5LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG4xOnsKLSJeIjoiVHA6NzE7YiIsCisiXiI6IlRwWjo3MjtiIiwKICQwOltmdW5jdGlvbigpe3RoaXMuYi5WUj1udWxsfSwiJDAiLG51bGwsMCwwLG51bGwsImNhbGwiXSwKICRpc0VIOnRydWV9LAogYm9oOnsKICJeIjoiYTsiLAogTzU6ZnVuY3Rpb24oYSl7Si5NZShhLG5ldyBELlA1KCkpfSwKLU1zOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nd3YodGhpcykualUodGhpcy5NcSgiY292ZXJhZ2UiKSkubWwobmV3IEQuUnYodGhpcykpfSwiJDAiLCJnRFgiLDAsMCwxOTZdfSwKK01zOltmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nd3YodGhpcykualUodGhpcy5NcSgiY292ZXJhZ2UiKSkubWwobmV3IEQuUnYodGhpcykpfSwiJDAiLCJnRFgiLDAsMCwyMDFdfSwKIFA1OnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9Si5VNihhKQotei50KGEsInNjcmlwdCIpLlNDKHoudChhLCJoaXRzIikpfSwiJDEiLG51bGwsMiwwLG51bGwsMTk3LCJjYWxsIl0sCit6LnQoYSwic2NyaXB0IikuU0Moei50KGEsImhpdHMiKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMDIsImNhbGwiXSwKICRpc0VIOnRydWV9LAogUnY6ewotIl4iOiJUcDoxOTU7YSIsCisiXiI6IlRwWjoyMDA7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi16Lk81KEQuTmwoSi54Qyh6Lmd6UygpLCJJc29sYXRlIik/ejp6LmdYUCgpLGEpLnQoMCwiY292ZXJhZ2UiKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTQsImNhbGwiXSwKK3ouTzUoRC5ObChKLnhDKHouZ3pTKCksIklzb2xhdGUiKT96OnouZ1hQKCksYSkudCgwLCJjb3ZlcmFnZSIpKX0sIiQxIixudWxsLDIsMCxudWxsLDE5OSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB4bTp7CiAiXiI6ImFmOyJ9LApAQCAtMTY1NTYsNyArMTY3MjMsNyBAQAogZ2lSOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy56NwogcmV0dXJuIHouZ1VRKHopfSwKIGdQajpmdW5jdGlvbihhKXtyZXR1cm4gSC5kKHRoaXMucjApfSwKLU1xOltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKGEpfSwiJDEiLCJnTGMiLDIsMCwxNjIsMTkzXSwKK01xOltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKGEpfSwiJDEiLCJnTGMiLDIsMCwxNjQsMTk4XSwKIGdZZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5PeH0sCiBnSms6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5SV30sCiBnQTM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Uc30sCkBAIC0xNjU4Myw3ICsxNjc1MCw3IEBACiBpZih0eXBlb2YgeSE9PSJudW1iZXIiKXJldHVybiBILnMoeSkKIHJldHVybiBDLnhCLnluKHgsdyt5KX0sCiBqejpmdW5jdGlvbihhKXt2YXIgeix5LHgKLXo9JC5qTigpLlI0KDAsYSkKK3o9JC5mQSgpLlI0KDAsYSkKIGlmKHo9PW51bGwpcmV0dXJuIiIKIHk9ei5RSwogeD15LmluZGV4CkBAIC0xNjYwMyw3ICsxNjc3MCw3IEBACiByZXR1cm4gdGhpcy5CNyh6KS5tbChuZXcgRC5pdCh0aGlzLHkpKX14PXRoaXMuUXkudCgwLGEpCiBpZih4IT1udWxsKXJldHVybiBKLmNJKHgpCiByZXR1cm4gdGhpcy5qVShhKS5tbChuZXcgRC5sYih0aGlzLGEpKX0sCi1ZbTpbZnVuY3Rpb24oYSxiKXtyZXR1cm4gYn0sIiQyIiwiZ2NPIiw0LDAsNzldLAorWW06W2Z1bmN0aW9uKGEsYil7cmV0dXJuIGJ9LCIkMiIsImdjTyIsNCwwLDgwXSwKIG5nOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej1udWxsCiB0cnl7eT1uZXcgUC5jNSh0aGlzLmdjTygpKQpAQCAtMTY2NDcsNyArMTY4MTQsNyBAQAogTi5RTSgiIikuVG8oIk5ldyBpc29sYXRlICciK0guZCh1LnIwKSsiJyIpfX15LmFOKDAsbmV3IEQuWXUoKSkKIHRoaXMuejc9eX0sCiBMdzpmdW5jdGlvbigpe3RoaXMuYk49dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTiwidm0iKQotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LCJ2bSIpCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1IsInZtIikKIHRoaXMuUXkudSgwLCJ2bSIsdGhpcykKIHZhciB6PVAuRUYoWyJpZCIsInZtIiwidHlwZSIsIkBWTSJdLG51bGwsbnVsbCkKIHRoaXMuZUMoUi50Qih6KSl9LApAQCAtMTY2NTYsMjAgKzE2ODIzLDIwIEBACiAiXiI6InhtK1BpOyIsCiAkaXNkMzp0cnVlfSwKIGp5OnsKLSJeIjoiVHA6MTM7YSxiIiwKKyJeIjoiVHBaOjEzO2EsYiIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej1ELk5sKGEsdGhpcy5hLmEpCiB5PXRoaXMuYi5SawogaWYoeS5Hdj49NClILnZoKHkucTcoKSkKLXkuSXYoeil9LCIkMSIsbnVsbCwyLDAsbnVsbCwxOTgsImNhbGwiXSwKK3kuSXYoeil9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMDMsImNhbGwiXSwKICRpc0VIOnRydWV9LAogTVo6ewotIl4iOiJUcDoxMzthLGIiLAorIl4iOiJUcFo6MTM7YSxiIiwKICQxOltmdW5jdGlvbihhKXtpZighSi54KGEpLiRpc3d2KXJldHVybgotcmV0dXJuIHRoaXMuYS56Ny50KDAsdGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MCwiY2FsbCJdLAorcmV0dXJuIHRoaXMuYS56Ny50KDAsdGhpcy5iKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBpdDp7Ci0iXiI6IlRwOjEzO2EsYiIsCisiXiI6IlRwWjoxMzthLGIiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6CiBpZihhPT1udWxsKXJldHVybiB0aGlzLmEKIHo9dGhpcy5iCkBAIC0xNjY3Nyw2NSArMTY4NDQsNjUgQEAKIGVsc2UgcmV0dXJuIGEuY3Yoeil9LCIkMSIsbnVsbCwyLDAsbnVsbCw3LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGxiOnsKLSJeIjoiVHA6MTk1O2MsZCIsCisiXiI6IlRwWjoyMDA7YyxkIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYwogeT1ELk5sKHosYSkKIGlmKHkuZ1VtKCkpei5ReS50bygwLHRoaXMuZCxuZXcgRC5RWih5KSkKLXJldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTk0LCJjYWxsIl0sCityZXR1cm4geX0sIiQxIixudWxsLDIsMCxudWxsLDE5OSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBRWjp7Ci0iXiI6IlRwOjcxO2UiLAorIl4iOiJUcFo6NzI7ZSIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmV9LAogJGlzRUg6dHJ1ZX0sCiB6QTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5hCi1yZXR1cm4gei5ONyh6Lm5nKGEpKX0sIiQxIixudWxsLDIsMCxudWxsLDE0MywiY2FsbCJdLAorcmV0dXJuIHouTjcoei5uZyhhKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwxNDUsImNhbGwiXSwKICRpc0VIOnRydWV9LAogdG06ewotIl4iOiJUcDoxMztiIiwKKyJeIjoiVHBaOjEzO2IiLAogJDE6W2Z1bmN0aW9uKGEpe3ZhciB6PXRoaXMuYi5HMgogaWYoei5Hdj49NClILnZoKHoucTcoKSkKIHouSXYoYSkKIHJldHVybiBQLlZ1KGEsbnVsbCxudWxsKX0sIiQxIixudWxsLDIsMCxudWxsLDI0LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIG1SOnsKLSJeIjoiVHA6MTM7IiwKKyJeIjoiVHBaOjEzOyIsCiAkMTpbZnVuY3Rpb24oYSl7cmV0dXJuISFKLngoYSkuJGlzTjd9LCIkMSIsbnVsbCwyLDAsbnVsbCwxLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGJwOnsKLSJeIjoiVHA6MTM7YyIsCisiXiI6IlRwWjoxMztjIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmMuTGkKIGlmKHouR3Y+PTQpSC52aCh6LnE3KCkpCiB6Lkl2KGEpCi1yZXR1cm4gUC5WdShhLG51bGwsbnVsbCl9LCIkMSIsbnVsbCwyLDAsbnVsbCw4NiwiY2FsbCJdLAorcmV0dXJuIFAuVnUoYSxudWxsLG51bGwpfSwiJDEiLG51bGwsMiwwLG51bGwsODcsImNhbGwiXSwKICRpc0VIOnRydWV9LAogaGM6ewotIl4iOiJUcDoxMzsiLAorIl4iOiJUcFo6MTM7IiwKICQxOltmdW5jdGlvbihhKXtyZXR1cm4hIUoueChhKS4kaXNFUH0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogWXU6ewotIl4iOiJUcDo3OTsiLAorIl4iOiJUcFo6ODA7IiwKICQyOmZ1bmN0aW9uKGEsYil7Si5jSShiKX0sCiAkaXNFSDp0cnVlfSwKIEVSOnsKLSJeIjoiYTtTUCxYRT4sd1oiLAorIl4iOiJhO1NQLFhFPixPUSIsCiBlSzpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2CiB6PXRoaXMuWEUKLUguUWIoeiwwLGEpCi1mb3IoeT16Lmxlbmd0aCx4PTA7eDx5OysreCl7dz10aGlzLndaCitILm5hKHosMCxhKQorZm9yKHk9ei5sZW5ndGgseD0wO3g8eTsrK3gpe3c9dGhpcy5PUQogdj16W3hdCiBpZih0eXBlb2YgdiE9PSJudW1iZXIiKXJldHVybiBILnModikKLXRoaXMud1o9dyt2fX0sCit0aGlzLk9RPXcrdn19LAogeTg6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUsdAogZm9yKHo9dGhpcy5YRSx5PXoubGVuZ3RoLHg9Si5VNihhKSx3PWIubGVuZ3RoLHY9MDt2PHk7Kyt2KXt1PXgudChhLHYpCiBpZih2Pj13KXJldHVybiBILmUoYix2KQotdT1KLmJJKHUsYlt2XSkKK3U9Si5Ibih1LGJbdl0pCiB6W3ZdPXUKLXQ9dGhpcy53WgordD10aGlzLk9RCiBpZih0eXBlb2YgdSE9PSJudW1iZXIiKXJldHVybiBILnModSkKLXRoaXMud1o9dCt1fX0sCit0aGlzLk9RPXQrdX19LAogazU6ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUKIHo9Si5VNihiKQogeT10aGlzLlhFCkBAIC0xNjgwMSwxMSArMTY5NjgsMTEgQEAKIHk9ei50KGEsImNvbGxlY3Rpb25zIikKIHRoaXMueXA9Ri5XaSh0aGlzLEMuV0csdGhpcy55cCx5KQogeT16LnQoYSwidGltZSIpCi10aGlzLk9nPUYuV2kodGhpcyxDLkpsLHRoaXMuT2cseSkKK3RoaXMuT2c9Ri5XaSh0aGlzLEMuaDUsdGhpcy5PZyx5KQogej16LnQoYSwiYXZnQ29sbGVjdGlvblBlcmlvZE1pbGxpcyIpCiB0aGlzLmh1PUYuV2kodGhpcyxDLkJFLHRoaXMuaHUseil9fSwKIGJ2OnsKLSJeIjoiYnZjO1YzLEpyLEVZLGVVLHlQLFhWLFF5LEdILFdtLEFJLHY5LHRXLHpiLGJOOktUQCx0NzpmNUAsaTksY0wsWTgsVVk8LHhRPCx2Six5dixCQzwsRkYsYmosQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJidmM7VjMsSnIsRVksZVUseVAsWFYsUXksR0gsV20sQUksdjksdFcsemIsYk46S1RALEdSOmY1QCxpOSxjTCxZOCxVWTwseFE8LHZKLHl2LEJDPCxGRixiaixBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnd3Y6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUDN9LAogZ29kOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzfSwKIGdYRTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5WM30sCkBAIC0xNjgxNSw3ICsxNjk4Miw3IEBACiBnQTY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FWX0sCiBnYWo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lVX0sCiBnTU46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy55UH0sCi1NcTpbZnVuY3Rpb24oYSl7cmV0dXJuIi8iK0guZCh0aGlzLnIwKSsiLyIrSC5kKGEpfSwiJDEiLCJnTGMiLDIsMCwxNjIsMTkzXSwKK01xOltmdW5jdGlvbihhKXtyZXR1cm4iLyIrSC5kKHRoaXMucjApKyIvIitILmQoYSl9LCIkMSIsImdMYyIsMiwwLDE2NCwxOThdLAogTjM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9SC5WTShbXSxbRC5reF0pCiB5PUouVTYoYSkKQEAgLTE2ODM3LDE3ICsxNzAwNCwxNyBAQAogej1bXQogZm9yKHk9Si5tWShKLlVRKGEsIm1lbWJlcnMiKSk7eS5HKCk7KXt4PXkuZ2woKQogdz1KLngoeCkKLWlmKCEhdy4kaXNkeSl6LnB1c2gody54Vyh4KSl9cmV0dXJuIFAuTmUoeiwhMSl9LCIkMSIsImdlTCIsMiwwLDE5OSwyMDBdLAoraWYoISF3LiRpc2R5KXoucHVzaCh3LnhXKHgpKX1yZXR1cm4gUC5OZSh6LCExKX0sIiQxIiwiZ2VMIiwyLDAsMjA0LDIwNV0sCiBOemU6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3CiB6PXRoaXMuQUkKIHouVjEoeikKIHRoaXMuV209Ri5XaSh0aGlzLEMuam8sdGhpcy5XbSxudWxsKQogZm9yKHk9Si5tWShhKTt5LkcoKTspe3g9eS5nbCgpCiBpZih4Lmd1aigpPT1udWxsKXouaCgwLHgpCi1pZihKLnhDKHguZ2ROKCksIk9iamVjdCIpJiZKLnhDKHguZ2kyKCksITEpKXt3PXRoaXMuV20KK2lmKEoueEMoeC5nVFgoKSwiT2JqZWN0IikmJkoueEMoeC5naTIoKSwhMSkpe3c9dGhpcy5XbQogaWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHcseCkpe3c9bmV3IFQucUkodGhpcyxDLmpvLHcseCkKIHcuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KLXRoaXMubnEodGhpcyx3KX10aGlzLldtPXh9fXJldHVybiBQLkFiKHRoaXMuV20sbnVsbCl9LCIkMSIsImdNaCIsMiwwLDIwMSwyMDJdLAordGhpcy5ucSh0aGlzLHcpfXRoaXMuV209eH19cmV0dXJuIFAuQWIodGhpcy5XbSxudWxsKX0sIiQxIiwiZ01oIiwyLDAsMjA2LDIwN10sCiBRbjpmdW5jdGlvbihhKXt2YXIgeix5LHgKIGlmKGE9PW51bGwpcmV0dXJuCiB6PUouVVEoYSwiaWQiKQpAQCAtMTY4NTUsNyArMTcwMjIsNyBAQAogeD15LnQoMCx6KQogaWYoeCE9bnVsbClyZXR1cm4geAogeD1ELk5sKHRoaXMsYSkKLWlmKHguZ1VtKCkpeS51KDAseix4KQoraWYoeCE9bnVsbCYmeC5nVW0oKSl5LnUoMCx6LHgpCiByZXR1cm4geH0sCiBjdjpmdW5jdGlvbihhKXt2YXIgej10aGlzLlF5LnQoMCxhKQogaWYoeiE9bnVsbClyZXR1cm4gSi5jSSh6KQpAQCAtMTY4NjcsOCArMTcwMzQsOCBAQAogZ2t3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuemJ9LAogZ29jOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLktUfSwKIHNvYzpmdW5jdGlvbihhLGIpe3RoaXMuS1Q9Ri5XaSh0aGlzLEMuWVMsdGhpcy5LVCxiKX0sCi1nZE46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mNX0sCi1zZE46ZnVuY3Rpb24oYSl7dGhpcy5mNT1GLldpKHRoaXMsQy5UYyx0aGlzLmY1LGEpfSwKK2dUWDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmY1fSwKK3NUWDpmdW5jdGlvbihhKXt0aGlzLmY1PUYuV2kodGhpcyxDLlRjLHRoaXMuZjUsYSl9LAogZ2VIOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaTl9LAogZ3cyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY0x9LAogc3cyOmZ1bmN0aW9uKGEpe3RoaXMuY0w9Ri5XaSh0aGlzLEMudFAsdGhpcy5jTCxhKX0sCkBAIC0xNjk5Miw5ICsxNzE1OSw5IEBACiAiXiI6IlBLWCtQaTsiLAogJGlzZDM6dHJ1ZX0sCiBpejp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7aWYoISFKLngoYSkuJGlza3gpe2EueE09Ri5XaShhLEMuS2osYS54TSwwKQotYS5QbD0wCithLkR1PTAKIGEuZkY9MAogYS5tTT1GLldpKGEsQy5lRixhLm1NLCIiKQogYS5xSD1GLldpKGEsQy51VSxhLnFILCIiKQpAQCAtMTcwMDMsMzYgKzE3MTcwLDM2IEBACiBhLk9vLlYxKDApfX0sCiAkaXNFSDp0cnVlfSwKIEtROnsKLSJeIjoiVHA6MTk1O2EsYiIsCisiXiI6IlRwWjoyMDA7YSxiIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQogeT1ELk5sKHosYSkKIGlmKHkuZ1VtKCkpei5ReS50bygwLHRoaXMuYixuZXcgRC5FYSh5KSkKLXJldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTk0LCJjYWxsIl0sCityZXR1cm4geX0sIiQxIixudWxsLDIsMCxudWxsLDE5OSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBFYTp7Ci0iXiI6IlRwOjcxO2MiLAorIl4iOiJUcFo6NzI7YyIsCiAkMDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmN9LAogJGlzRUg6dHJ1ZX0sCiBRcTp7Ci0iXiI6IlRwOjEzO2EiLAorIl4iOiJUcFo6MTM7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHo9Si5VNihhKQotdGhpcy5hLnUoMCx6LnQoYSwibmFtZSIpLHoudChhLCJ0aW1lIikpfSwiJDEiLG51bGwsMiwwLG51bGwsMjAzLCJjYWxsIl0sCit0aGlzLmEudSgwLHoudChhLCJuYW1lIiksei50KGEsInRpbWUiKSl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMDgsImNhbGwiXSwKICRpc0VIOnRydWV9LAogQVA6ewotIl4iOiJUcDoxOTU7YSIsCisiXiI6IlRwWjoyMDA7YSIsCiAkMTpbZnVuY3Rpb24oYSl7dmFyIHoseQogej1EYXRlLm5vdygpCiBuZXcgUC5pUCh6LCExKS5FSygpCiB5PXRoaXMuYS5HSAogeS54Wih6LzEwMDAsYSkKLXJldHVybiB5fSwiJDEiLG51bGwsMiwwLG51bGwsMTU2LCJjYWxsIl0sCityZXR1cm4geX0sIiQxIixudWxsLDIsMCxudWxsLDE1OCwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB2Tzp7Ci0iXiI6ImFmO1JGLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoiYWY7UkYsUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ1VtOmZ1bmN0aW9uKCl7cmV0dXJuKEoueEModGhpcy5tUSwiQ2xhc3MiKXx8Si54Qyh0aGlzLm1RLCJGdW5jdGlvbiIpfHxKLnhDKHRoaXMubVEsIkZpZWxkIikpJiYhSi5jbyh0aGlzLnIwLCQuUlEpfSwKIGdNODpmdW5jdGlvbigpe3JldHVybiExfSwKLWJ1OmZ1bmN0aW9uKGEpe3JldHVybiBQLnZXKHRoaXMuUkYpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4gUC52Vyh0aGlzLlJGKX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogYkY6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseAogdGhpcy5rVD0hYwogej10aGlzLlJGCkBAIC0xNzA0MiwxMCArMTcyMDksMTEgQEAKIHg9eS50KDAsInVzZXJfbmFtZSIpCiB0aGlzLmJOPXRoaXMuY3QoMCxDLllTLHRoaXMuYk4seCkKIHk9eS50KDAsIm5hbWUiKQotdGhpcy50Nz10aGlzLmN0KDAsQy5UYyx0aGlzLnQ3LHkpCit0aGlzLkdSPXRoaXMuY3QoMCxDLlRjLHRoaXMuR1IseSkKIEQua1Qoeix0aGlzLlAzKX0sCiBGVjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlJGLkZWKDAsYil9LAogVjE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuUkYuVjEoMCl9LAoreDQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5SRi5acC54NCgwLGIpfSwKIGFOOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUkYuWnAuYU4oMCxiKX0sCiBSejpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlJGLlJ6KDAsYil9LAogdDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLlJGLlpwLnQoMCxiKX0sCkBAIC0xNzA2Miw3ICsxNzIzMCw3IEBACiBnQjpmdW5jdGlvbihhKXt2YXIgej10aGlzLlJGLlpwCiByZXR1cm4gei5nQih6KX0sCiBIQzpbZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5SRgotcmV0dXJuIHouSEMoeil9LCIkMCIsImdEeCIsMCwwLDEyMF0sCityZXR1cm4gei5IQyh6KX0sIiQwIiwiZ0R4IiwwLDAsMTIxXSwKIG5xOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5SRgogcmV0dXJuIHoubnEoeixiKX0sCiBjdDpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gRi5XaSh0aGlzLlJGLGIsYyxkKX0sCkBAIC0xNzA4NCw5ICsxNzI1Miw4IEBACiAkaXNkMzp0cnVlLAogc3RhdGljOnsiXiI6IlJRIn19LAogcEQ6ewotIl4iOiJEMztJMCxMRCxqbyxOZSxBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCisiXiI6IndWcTtJMCxMRCxqbyxOZSxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnZlk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSTB9LAotc2ZZOmZ1bmN0aW9uKGEsYil7dGhpcy5JMD1GLldpKHRoaXMsQy5MYyx0aGlzLkkwLGIpfSwKIGdHMTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5MRH0sCiBnamE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuam99LAogc2phOmZ1bmN0aW9uKGEsYil7dGhpcy5qbz1GLldpKHRoaXMsQy5uZSx0aGlzLmpvLGIpfSwKQEAgLTE3MTA0LDE0ICsxNzI3MSwxMyBAQAogej0iRGFydEVycm9yICIrSC5kKHRoaXMuSTApCiB6PXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seikKIHRoaXMuYk49egotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHopfX0sCi1EMzp7Cit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1Iseil9fSwKK3dWcTp7CiAiXiI6ImFmK1BpOyIsCiAkaXNkMzp0cnVlfSwKIE43OnsKLSJeIjoid1ZxO0kwLExELEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoiZFpMO0kwLExELEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdmWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JMH0sCi1zZlk6ZnVuY3Rpb24oYSxiKXt0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAsYil9LAogZ0cxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkxEfSwKIGJGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5CiB0aGlzLmtUPSEwCkBAIC0xNzEyMywxNyArMTcyODksMTYgQEAKIHo9IlNlcnZpY2VFcnJvciAiK0guZCh0aGlzLkkwKQogej10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHopCiB0aGlzLmJOPXoKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx6KX0sCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1Iseil9LAogJGlzTjc6dHJ1ZX0sCi13VnE6eworZFpMOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogRVA6ewotIl4iOiJkWkw7STAsTEQsSVYsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJ3OEY7STAsTEQsSVYsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ2ZZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkkwfSwKLXNmWTpmdW5jdGlvbihhLGIpe3RoaXMuSTA9Ri5XaSh0aGlzLEMuTGMsdGhpcy5JMCxiKX0sCiBnRzE6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTER9LAotZ245OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLklWfSwKK2diQTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JVn0sCiBiRjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogej1KLlU2KGIpCiB5PXoudChiLCJraW5kIikKQEAgLTE3MTQ1LDEzICsxNzMxMCwxMyBAQAogej0iU2VydmljZUV4Y2VwdGlvbiAiK0guZCh0aGlzLkkwKQogej10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHopCiB0aGlzLmJOPXoKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx6KX0sCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1Iseil9LAogJGlzRVA6dHJ1ZX0sCi1kWkw6ewordzhGOnsKICJeIjoiYWYrUGk7IiwKICRpc2QzOnRydWV9LAogTWs6ewotIl4iOiJ3OEY7ZXEsSFEsam8sQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJWNGI7ZXEsSFEsam8sQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ2ZHOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVxfSwKIGdRMTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkhRfSwKIGdqYTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5qb30sCkBAIC0xNzE2NiwxNiArMTczMzEsMTYgQEAKIHk9IlNlcnZpY2VFdmVudCAiK0guZCh5KQogeT10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHkpCiB0aGlzLmJOPXkKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx5KQordGhpcy5HUj10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLkdSLHkpCiBpZih6LnQoYiwiYnJlYWtwb2ludCIpIT1udWxsKXt5PXoudChiLCJicmVha3BvaW50IikKIHRoaXMuSFE9Ri5XaSh0aGlzLEMuaFIsdGhpcy5IUSx5KX1pZih6LnQoYiwiZXhjZXB0aW9uIikhPW51bGwpe3o9ei50KGIsImV4Y2VwdGlvbiIpCiB0aGlzLmpvPUYuV2kodGhpcyxDLm5lLHRoaXMuam8seil9fSwKICRpc01rOnRydWV9LAotdzhGOnsKK1Y0Yjp7CiAiXiI6ImFmK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFU0OnsKLSJeIjoickc5O2RqLEJtPCxYUjwsREQ+LFozPCxtdTwsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJyRzk7ZGosQm08LFhSPCxERD4sWjM8LG11PCxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCiBnTzM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGp9LAogZ1VtOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAogZ004OmZ1bmN0aW9uKCl7cmV0dXJuITF9LApAQCAtMTcxOTMsNyArMTczNTgsNyBAQAogdGhpcy5iTj15CiBpZihKLkZOKHkpPT09ITApdGhpcy5iTj10aGlzLmN0KHRoaXMsQy5ZUyx0aGlzLmJOLHgpCiB5PXoudChiLCJuYW1lIikKLXRoaXMudDc9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy50Nyx5KQordGhpcy5HUj10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLkdSLHkpCiBpZihjKXJldHVybgogdGhpcy5rVD0hMAogRC5rVChiLEouYVQodGhpcy5QMykpCkBAIC0xNzI0NCw5ICsxNzQwOSw5IEBACiB4LndmPUYuV2koeCxDLnlCLHgud2YseikKIHk9Si5ldyh5LnQoYSwzKSx5LnQoYSw1KSkKIHguclQ9Ri5XaSh4LEMuaE4seC5yVCx5KX0sCi1zdGF0aWM6eyJeIjoialp4LHh4eCxxV0Ysb1EsUzFPLHdYdSxXVmksV2h1In19LAorc3RhdGljOnsiXiI6ImpaeCx4eHgsWW4sU1A3LFMxLHdYdSxXVmksSlEifX0sCiBkeTp7Ci0iXiI6ImNPcjtHeixhcix4OCxMaCx2WSx1MCxKMSxFOCxxRyxUWCx5dixVWTwseFE8LGtzPixTNTwsdEo8LG11PCxwMjwsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJjT3I7R3osYXIseDgsTGgsdlksdTAsSjEsRTgscUcsZE4seXYsVVk8LHhRPCxrcz4sUzU8LHRKPCxtdTwscDI8LEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdIdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5Hen0sCiBzSHQ6ZnVuY3Rpb24oYSxiKXt0aGlzLkd6PUYuV2kodGhpcyxDLkVWLHRoaXMuR3osYil9LAogZ0lzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFyfSwKQEAgLTE3MjU0LDExICsxNzQxOSwxMiBAQAogZ3VqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueDh9LAogc3VqOmZ1bmN0aW9uKGEpe3RoaXMueDg9Ri5XaSh0aGlzLEMuQ3csdGhpcy54OCxhKX0sCiBnVk06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MaH0sCitnUnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52WX0sCiBnaTI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KMX0sCiBnVkY6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xR30sCiBzVkY6ZnVuY3Rpb24oYSl7dGhpcy5xRz1GLldpKHRoaXMsQy56Nix0aGlzLnFHLGEpfSwKLWdlajpmdW5jdGlvbigpe3JldHVybiB0aGlzLlRYfSwKLXNlajpmdW5jdGlvbihhKXt0aGlzLlRYPUYuV2kodGhpcyxDLkZlLHRoaXMuVFgsYSl9LAorZ2VqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZE59LAorc2VqOmZ1bmN0aW9uKGEpe3RoaXMuZE49Ri5XaSh0aGlzLEMuRmUsdGhpcy5kTixhKX0sCiBna2M6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMueXZ9LAogc2tjOmZ1bmN0aW9uKGEsYil7dGhpcy55dj1GLldpKHRoaXMsQy55aCx0aGlzLnl2LGIpfSwKIGdKTDpmdW5jdGlvbigpe3ZhciB6LHkKQEAgLTE3MjczLDEzICsxNzQzOSwxMyBAQAogcmV0dXJuIHp9LAogZ1VtOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAogZ004OmZ1bmN0aW9uKCl7cmV0dXJuITF9LAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIlNlcnZpY2UgQ2xhc3M6ICIrSC5kKHRoaXMudDcpfSwKK2J1OltmdW5jdGlvbihhKXtyZXR1cm4iU2VydmljZSBDbGFzczogIitILmQodGhpcy5HUil9LCIkMCIsImdBWSIsMCwwLDY5XSwKIGJGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5LHgKIHo9Si5VNihiKQogeT16LnQoYiwidXNlcl9uYW1lIikKIHRoaXMuYk49dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTix5KQogeT16LnQoYiwibmFtZSIpCi10aGlzLnQ3PXRoaXMuY3QodGhpcyxDLlRjLHRoaXMudDcseSkKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix5KQogaWYoYylyZXR1cm4KIHRoaXMua1Q9ITAKIEQua1QoYixKLmFUKHRoaXMuUDMpKQpAQCAtMTcyOTAsNyArMTc0NTYsNyBAQAogeT16LnQoYiwiYWJzdHJhY3QiKQogdGhpcy5MaD1GLldpKHRoaXMsQy5YSCx0aGlzLkxoLHkpCiB5PXoudChiLCJjb25zdCIpCi10aGlzLnZZPUYuV2kodGhpcyxDLkQ2LHRoaXMudlkseSkKK3RoaXMudlk9Ri5XaSh0aGlzLEMuTnIsdGhpcy52WSx5KQogeT16LnQoYiwiZmluYWxpemVkIikKIHRoaXMudTA9Ri5XaSh0aGlzLEMuV1YsdGhpcy51MCx5KQogeT16LnQoYiwicGF0Y2giKQpAQCAtMTczMDAsNyArMTc0NjYsNyBAQAogeT16LnQoYiwidG9rZW5Qb3MiKQogdGhpcy5xRz1GLldpKHRoaXMsQy56Nix0aGlzLnFHLHkpCiB5PXoudChiLCJlbmRUb2tlblBvcyIpCi10aGlzLlRYPUYuV2kodGhpcyxDLkZlLHRoaXMuVFgseSkKK3RoaXMuZE49Ri5XaSh0aGlzLEMuRmUsdGhpcy5kTix5KQogeT10aGlzLlM1CiB5LlYxKHkpCiB5LkZWKDAsei50KGIsInN1YmNsYXNzZXMiKSkKQEAgLTE3MzMzLDI5ICsxNzQ5OSwxMTQgQEAKIGNPcjp7CiAiXiI6Ilp6UStQaTsiLAogJGlzZDM6dHJ1ZX0sCitIazp7CisiXiI6ImE7enQiLAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLnp0fSwiJDAiLCJnQVkiLDAsMCw3Ml0sCitRMjpmdW5jdGlvbigpe3JldHVybiBDLk5tLnRnKFskLmIxKCksJC5sMygpLCQuengoKSwkLk1RKCldLHRoaXMpfSwKK3N0YXRpYzp7Il4iOiJJaixqWCxGMCxCcyxHOCx4cyxhYixTcCxFdCxMbCxIVSxidCx3cCx6MyxZYix2ZSIsRXo6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2Uia1JlZ3VsYXJGdW5jdGlvbiI6cmV0dXJuICQuWUYoKQorY2FzZSJrQ2xvc3VyZUZ1bmN0aW9uIjpyZXR1cm4gJC54cSgpCitjYXNlImtHZXR0ZXJGdW5jdGlvbiI6cmV0dXJuICQuR0coKQorY2FzZSJrU2V0dGVyRnVuY3Rpb24iOnJldHVybiAkLkt3KCkKK2Nhc2Uia0NvbnN0cnVjdG9yIjpyZXR1cm4gJC5raigpCitjYXNlImtJbXBsaWNpdEdldHRlckZ1bmN0aW9uIjpyZXR1cm4gJC5kOSgpCitjYXNlImtJbXBsaWNpdFNldHRlckZ1bmN0aW9uIjpyZXR1cm4gJC5uRSgpCitjYXNlImtTdGF0aWNJbml0aWFsaXplciI6cmV0dXJuICQueTUoKQorY2FzZSJrTWV0aG9kRXh0cmFjdG9yIjpyZXR1cm4gJC5PdCgpCitjYXNlImtOb1N1Y2hNZXRob2REaXNwYXRjaGVyIjpyZXR1cm4gJC5FNygpCitjYXNlImtJbnZva2VGaWVsZERpc3BhdGNoZXIiOnJldHVybiAkLmY2KCkKK2Nhc2UiQ29sbGVjdGVkIjpyZXR1cm4gJC5iMSgpCitjYXNlIk5hdGl2ZSI6cmV0dXJuICQubDMoKQorY2FzZSJUYWciOnJldHVybiAkLnp4KCkKK2Nhc2UiUmV1c2VkIjpyZXR1cm4gJC5NUSgpfXJldHVybiAkLmxDKCl9fX0sCitLcDp7CisiXiI6IlpxYTtNRCxFRyxiVix2WSxmZCxhcixxRyxkTixURCxOTSx2ZixINyxJMCxYTixOaSxrRSxaNCxBUCxmbixQMyxyMCxtUSxrVCxiTixHUixWUixBUCxmbiIsCitnRWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5NRH0sCitzRWw6ZnVuY3Rpb24oYSl7dGhpcy5NRD1GLldpKHRoaXMsQy5ZVix0aGlzLk1ELGEpfSwKK2d4SDpmdW5jdGlvbigpe3JldHVybiB0aGlzLkVHfSwKK3N4SDpmdW5jdGlvbihhKXt0aGlzLkVHPUYuV2kodGhpcyxDLklmLHRoaXMuRUcsYSl9LAorZ0ZvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYlZ9LAorZ1JzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudll9LAorZ2VUOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmZkfSwKK3NlVDpmdW5jdGlvbihhLGIpe3RoaXMuZmQ9Ri5XaSh0aGlzLEMublgsdGhpcy5mZCxiKX0sCitnSXM6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJ9LAorc0lzOmZ1bmN0aW9uKGEsYil7dGhpcy5hcj1GLldpKHRoaXMsQy5QWCx0aGlzLmFyLGIpfSwKK2dWRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnFHfSwKK3NWRjpmdW5jdGlvbihhKXt0aGlzLnFHPUYuV2kodGhpcyxDLno2LHRoaXMucUcsYSl9LAorZ2VqOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZE59LAorc2VqOmZ1bmN0aW9uKGEpe3RoaXMuZE49Ri5XaSh0aGlzLEMuRmUsdGhpcy5kTixhKX0sCitndFQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuVER9LAorc3RUOmZ1bmN0aW9uKGEsYil7dGhpcy5URD1GLldpKHRoaXMsQy5pNCx0aGlzLlRELGIpfSwKK2dqVzpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5NfSwKK3NqVzpmdW5jdGlvbihhKXt0aGlzLk5NPUYuV2kodGhpcyxDLk9VLHRoaXMuTk0sYSl9LAorZ1cxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmZ9LAorZ2hvOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuSDd9LAorZ2ZZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLkkwfSwKK2d1aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLlhOfSwKK2dVeDpmdW5jdGlvbigpe3JldHVybiB0aGlzLk5pfSwKK2dTdTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmtFfSwKK2duaTpmdW5jdGlvbigpe3JldHVybiB0aGlzLlo0fSwKK2JGOmZ1bmN0aW9uKGEsYixjKXt2YXIgeix5Cit6PUouVTYoYikKK3k9ei50KGIsInVzZXJfbmFtZSIpCit0aGlzLmJOPXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4seSkKK3k9ei50KGIsIm5hbWUiKQordGhpcy5HUj10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLkdSLHkpCitELmtUKGIsSi5hVCh0aGlzLlAzKSkKK3k9ei54NChiLCJvd25pbmdDbGFzcyIpPT09ITA/ei50KGIsIm93bmluZ0NsYXNzIik6bnVsbAordGhpcy5NRD1GLldpKHRoaXMsQy5ZVix0aGlzLk1ELHkpCit5PXoueDQoYiwib3duaW5nTGlicmFyeSIpPT09ITA/ei50KGIsIm93bmluZ0xpYnJhcnkiKTpudWxsCit0aGlzLkVHPUYuV2kodGhpcyxDLklmLHRoaXMuRUcseSkKK3k9RC5Feih6LnQoYiwia2luZCIpKQoreT1GLldpKHRoaXMsQy5MYyx0aGlzLkkwLHkpCit0aGlzLkkwPXkKK3k9eS5RMigpCit0aGlzLlo0PUYuV2kodGhpcyxDLmEwLHRoaXMuWjQsIXkpCitpZihjKXJldHVybgoreT16LnQoYiwiaXNTdGF0aWMiKQordGhpcy5iVj1GLldpKHRoaXMsQy5BVCx0aGlzLmJWLHkpCit5PXoudChiLCJpc0NvbnN0IikKK3RoaXMudlk9Ri5XaSh0aGlzLEMuTnIsdGhpcy52WSx5KQoreT16LnQoYiwicGFyZW50IikKK3RoaXMuZmQ9Ri5XaSh0aGlzLEMublgsdGhpcy5mZCx5KQoreT16LnQoYiwic2NyaXB0IikKK3RoaXMuYXI9Ri5XaSh0aGlzLEMuUFgsdGhpcy5hcix5KQoreT16LnQoYiwidG9rZW5Qb3MiKQordGhpcy5xRz1GLldpKHRoaXMsQy56Nix0aGlzLnFHLHkpCit5PXoudChiLCJlbmRUb2tlblBvcyIpCit0aGlzLmROPUYuV2kodGhpcyxDLkZlLHRoaXMuZE4seSkKK3k9ei50KGIsImNvZGUiKQordGhpcy5URD1GLldpKHRoaXMsQy5pNCx0aGlzLlRELHkpCit5PXoudChiLCJ1bm9wdGltaXplZF9jb2RlIikKK3RoaXMuTk09Ri5XaSh0aGlzLEMuT1UsdGhpcy5OTSx5KQoreT16LnQoYiwiaXNfb3B0aW1pemFibGUiKQordGhpcy52Zj1GLldpKHRoaXMsQy5WbCx0aGlzLnZmLHkpCit5PXoudChiLCJpc19pbmxpbmFibGUiKQordGhpcy5INz1GLldpKHRoaXMsQy5NWSx0aGlzLkg3LHkpCit5PXoudChiLCJkZW9wdGltaXphdGlvbnMiKQordGhpcy5YTj1GLldpKHRoaXMsQy5lUix0aGlzLlhOLHkpCit6PXoudChiLCJ1c2FnZV9jb3VudGVyIikKK3RoaXMua0U9Ri5XaSh0aGlzLEMueXYsdGhpcy5rRSx6KQorej10aGlzLmZkCitpZih6PT1udWxsKXt6PXRoaXMuTUQKK3o9eiE9bnVsbD9ILmQoSi5PNih6KSkrIi4iK0guZCh0aGlzLmJOKTp0aGlzLmJOCit0aGlzLk5pPUYuV2kodGhpcyxDLkFPLHRoaXMuTmkseil9ZWxzZXt6PUguZCh6LmdVeCgpKSsiLiIrSC5kKHRoaXMuYk4pCit0aGlzLk5pPUYuV2kodGhpcyxDLkFPLHRoaXMuTmkseil9fSwKKyRpc0twOnRydWV9LAorWnFhOnsKKyJeIjoiYWYrUGk7IiwKKyRpc2QzOnRydWV9LAogYzI6ewogIl4iOiJQaTtSZDwsYTQ+LHg5LEFQLGZuIiwKIGd1OTpmdW5jdGlvbigpe3JldHVybiB0aGlzLng5fSwKIHN1OTpmdW5jdGlvbihhKXt0aGlzLng5PUYuV2kodGhpcyxDLlNzLHRoaXMueDksYSl9LAogJGlzYzI6dHJ1ZX0sCiB2eDp7Ci0iXiI6IlM2TDtHZD4sZDYsSTAsVTksbkUsR2Usd0EseTYsRkIsQVAsZm4sUDMscjAsbVEsa1QsYk4sdDcsVlIsQVAsZm4iLAorIl4iOiJTNkw7R2Q+LGQ2LEkwLFU5LG5FLEdlLHdBLHk2LEZCLEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdmWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JMH0sCi1zZlk6ZnVuY3Rpb24oYSxiKXt0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAsYil9LAotZ2hZOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuVTl9LAotc2hZOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuVTkKLWlmKHRoaXMuZ256KHRoaXMpJiYhSi54Qyh6LGEpKXt6PW5ldyBULnFJKHRoaXMsQy5HZCx6LGEpCi16LiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMseil9dGhpcy5VOT1hfSwKLWdTSzpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5FfSwKLXNTSzpmdW5jdGlvbihhKXt2YXIgej10aGlzLm5FCi1pZih0aGlzLmdueih0aGlzKSYmIUoueEMoeixhKSl7ej1uZXcgVC5xSSh0aGlzLEMua0EseixhKQotei4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQotdGhpcy5ucSh0aGlzLHopfXRoaXMubkU9YX0sCiBnVW06ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiBnTTg6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCiBySzpmdW5jdGlvbihhKXt2YXIgeix5Ci16PUouYkkoYSwxKQorej1KLkhuKGEsMSkKIHk9dGhpcy5HZC5hbwogaWYoej4+PjAhPT16fHx6Pj15Lmxlbmd0aClyZXR1cm4gSC5lKHkseikKIHJldHVybiB5W3pdfSwKQEAgLTE3MzczLDQzICsxNzYyNCw0NSBAQAogdGhpcy5HZT13CiB0aGlzLmJOPXRoaXMuY3QodGhpcyxDLllTLHRoaXMuYk4sdykKIHc9dGhpcy53QQotdGhpcy50Nz10aGlzLmN0KHRoaXMsQy5UYyx0aGlzLnQ3LHcpCit0aGlzLkdSPXRoaXMuY3QodGhpcyxDLlRjLHRoaXMuR1IsdykKIHRoaXMuVzgoei50KGIsInNvdXJjZSIpKQogdGhpcy5QVCh6LnQoYiwidG9rZW5Qb3NUYWJsZSIpKX0sCi1QVDpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIKK1BUOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAKIGlmKGE9PW51bGwpcmV0dXJuCi10aGlzLnk2PVAuRmwobnVsbCxudWxsKQotdGhpcy5GQj1QLkZsKG51bGwsbnVsbCkKK3o9dGhpcy55Ngorei5WMSgwKQoreT10aGlzLkZCCit5LlYxKDApCiB0aGlzLlU5PUYuV2kodGhpcyxDLkdkLHRoaXMuVTksbnVsbCkKIHRoaXMubkU9Ri5XaSh0aGlzLEMua0EsdGhpcy5uRSxudWxsKQotZm9yKHo9Si5tWShhKTt6LkcoKTspe3k9ei5nbCgpCi14PUouVTYoeSkKLXc9eC50KHksMCkKLXY9MQotd2hpbGUoITApe3U9eC5nQih5KQotaWYodHlwZW9mIHUhPT0ibnVtYmVyIilyZXR1cm4gSC5zKHUpCi1pZighKHY8dSkpYnJlYWsKLXQ9eC50KHksdikKLXM9eC50KHksdisxKQotdT10aGlzLlU5Ci1pZih1PT1udWxsKXtpZih0aGlzLmdueih0aGlzKSYmIUoueEModSx0KSl7dT1uZXcgVC5xSSh0aGlzLEMuR2QsdSx0KQotdS4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQotdGhpcy5ucSh0aGlzLHUpfXRoaXMuVTk9dAotdT10aGlzLm5FCi1pZih0aGlzLmdueih0aGlzKSYmIUoueEModSx0KSl7dT1uZXcgVC5xSSh0aGlzLEMua0EsdSx0KQotdS4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQotdGhpcy5ucSh0aGlzLHUpfXRoaXMubkU9dH1lbHNle3U9Si5CbCh1LHQpP3RoaXMuVTk6dAotcj10aGlzLlU5Ci1pZih0aGlzLmdueih0aGlzKSYmIUoueEMocix1KSl7cj1uZXcgVC5xSSh0aGlzLEMuR2Qscix1KQotci4kYnVpbHRpblR5cGVJbmZvPVtudWxsXQotdGhpcy5ucSh0aGlzLHIpfXRoaXMuVTk9dQotdT1KLko1KHRoaXMubkUsdCk/dGhpcy5uRTp0Ci1yPXRoaXMubkUKLWlmKHRoaXMuZ256KHRoaXMpJiYhSi54QyhyLHUpKXtyPW5ldyBULnFJKHRoaXMsQy5rQSxyLHUpCi1yLiRidWlsdGluVHlwZUluZm89W251bGxdCi10aGlzLm5xKHRoaXMscil9dGhpcy5uRT11fXRoaXMueTYudSgwLHQsdykKLXRoaXMuRkIudSgwLHQscykKLXYrPTJ9fX0sCitmb3IoeD1KLm1ZKGEpO3guRygpOyl7dz14LmdsKCkKK3Y9Si5VNih3KQordT12LnQodywwKQordD0xCit3aGlsZSghMCl7cz12LmdCKHcpCitpZih0eXBlb2YgcyE9PSJudW1iZXIiKXJldHVybiBILnMocykKK2lmKCEodDxzKSlicmVhaworcj12LnQodyx0KQorcT12LnQodyx0KzEpCitzPXRoaXMuVTkKK2lmKHM9PW51bGwpe2lmKHRoaXMuZ256KHRoaXMpJiYhSi54QyhzLHIpKXtzPW5ldyBULnFJKHRoaXMsQy5HZCxzLHIpCitzLiRidWlsdGluVHlwZUluZm89W251bGxdCit0aGlzLm5xKHRoaXMscyl9dGhpcy5VOT1yCitzPXRoaXMubkUKK2lmKHRoaXMuZ256KHRoaXMpJiYhSi54QyhzLHIpKXtzPW5ldyBULnFJKHRoaXMsQy5rQSxzLHIpCitzLiRidWlsdGluVHlwZUluZm89W251bGxdCit0aGlzLm5xKHRoaXMscyl9dGhpcy5uRT1yfWVsc2V7cz1KLkJsKHMscik/dGhpcy5VOTpyCitwPXRoaXMuVTkKK2lmKHRoaXMuZ256KHRoaXMpJiYhSi54QyhwLHMpKXtwPW5ldyBULnFJKHRoaXMsQy5HZCxwLHMpCitwLiRidWlsdGluVHlwZUluZm89W251bGxdCit0aGlzLm5xKHRoaXMscCl9dGhpcy5VOT1zCitzPUouSjUodGhpcy5uRSxyKT90aGlzLm5FOnIKK3A9dGhpcy5uRQoraWYodGhpcy5nbnoodGhpcykmJiFKLnhDKHAscykpe3A9bmV3IFQucUkodGhpcyxDLmtBLHAscykKK3AuJGJ1aWx0aW5UeXBlSW5mbz1bbnVsbF0KK3RoaXMubnEodGhpcyxwKX10aGlzLm5FPXN9ei51KDAscix1KQoreS51KDAscixxKQordCs9Mn19fSwKIFNDOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0CiB6PUouVTYoYSkKIHk9dGhpcy5kNgpAQCAtMTc0MjUsNyArMTc2NzgsNyBAQAogVzg6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHRoaXMua1Q9ITEKIGlmKGE9PW51bGwpcmV0dXJuCi16PUoudUgoYSwiXG4iKQorej1KLkl0KGEsIlxuIikKIGlmKHoubGVuZ3RoPT09MClyZXR1cm4KIHRoaXMua1Q9ITAKIHk9dGhpcy5HZApAQCAtMTc0NDUsNyArMTc2OTgsNyBAQAogIl4iOiJ3dlkrUGk7IiwKICRpc2QzOnRydWV9LAogRGI6ewotIl4iOiJhO1l1PCxQbDwsZkY8IiwKKyJeIjoiYTtZdTwsRHU8LGZGPCIsCiAkaXNEYjp0cnVlfSwKIFo5OnsKICJeIjoiUGk7WXU8LExSLFZGPCxZblAsZlk+LGFyLHVwLEFQLGZuIiwKQEAgLTE3NDU2LDcgKzE3NzA5LDcgQEAKIHo9dGhpcy5MUgogeT1KLngoeikKIGlmKHkubih6LC0xKSlyZXR1cm4iTi9BIgotcmV0dXJuIHkuYnUoeil9LCIkMCIsImdrQSIsMCwwLDIwNF0sCityZXR1cm4geS5idSh6KX0sIiQwIiwiZ2tBIiwwLDAsNjldLAogYlI6ZnVuY3Rpb24oYSl7dmFyIHoseQogdGhpcy5hcj1GLldpKHRoaXMsQy5QWCx0aGlzLmFyLG51bGwpCiB6PXRoaXMuVkYKQEAgLTE3NDc2LDIwICsxNzcyOSwyMCBAQAogej10aGlzLll1CiB5PUoueCh6KQogaWYoeS5uKHosMCkpcmV0dXJuIiIKLXJldHVybiIweCIreS5XWih6LDE2KX0sIiQwIiwiZ1pkIiwwLDAsMjA0XSwKK3JldHVybiIweCIreS5XWih6LDE2KX0sIiQwIiwiZ1pkIiwwLDAsNjldLAogaW86W2Z1bmN0aW9uKGEpe3ZhciB6CiBpZihhPT1udWxsKXJldHVybiIiCiB6PWEuZ09vKCkuWnAudCgwLHRoaXMuWXUpCiBpZih6PT1udWxsKXJldHVybiIiCi1pZihKLnhDKHouZ2ZGKCksei5nUGwoKSkpcmV0dXJuIiIKLXJldHVybiBELmRKKHouZ2ZGKCksYS5nbHQoKSkrIiAoIitILmQoei5nZkYoKSkrIikifSwiJDEiLCJnY1EiLDIsMCwyMDUsNzNdLAoraWYoSi54Qyh6LmdmRigpLHouZ0R1KCkpKXJldHVybiIiCityZXR1cm4gRC5kSih6LmdmRigpLGEuZ2x0KCkpKyIgKCIrSC5kKHouZ2ZGKCkpKyIpIn0sIiQxIiwiZ2NRIiwyLDAsMjA5LDc0XSwKIEhVOltmdW5jdGlvbihhKXt2YXIgegogaWYoYT09bnVsbClyZXR1cm4iIgogej1hLmdPbygpLlpwLnQoMCx0aGlzLll1KQogaWYoej09bnVsbClyZXR1cm4iIgotcmV0dXJuIEQuZEooei5nUGwoKSxhLmdsdCgpKSsiICgiK0guZCh6LmdQbCgpKSsiKSJ9LCIkMSIsImdHSyIsMiwwLDIwNSw3M10sCityZXR1cm4gRC5kSih6LmdEdSgpLGEuZ2x0KCkpKyIgKCIrSC5kKHouZ0R1KCkpKyIpIn0sIiQxIiwiZ0dLIiwyLDAsMjA5LDc0XSwKIGVROmZ1bmN0aW9uKCl7dmFyIHoseSx4LHcKLXk9Si51SCh0aGlzLkw0LCIgIikKK3k9Si5JdCh0aGlzLkw0LCIgIikKIHg9eS5sZW5ndGgKIGlmKHghPT0yKXJldHVybiAwCiBpZigxPj14KXJldHVybiBILmUoeSwxKQpAQCAtMTc1MTQsOCArMTc3NjcsOCBAQAogc3RhdGljOntkSjpmdW5jdGlvbihhLGIpe3JldHVybiBDLkNELlN5KDEwMCpKLlg5KGEsYiksMikrIiUifX19LAogV0FFOnsKICJeIjoiYTt1WCIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy51WH0sCi1zdGF0aWM6eyJeIjoiT2NpLGw4UixXQWcseVAwLFo3VSIsQ1E6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCitidTpbZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudVh9LCIkMCIsImdBWSIsMCwwLDY5XSwKK3N0YXRpYzp7Il4iOiJPY2kscGcsV0FnLHlQMCxaN1UiLENROmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKQogaWYoei5uKGEsIk5hdGl2ZSIpKXJldHVybiBDLk9jCiBlbHNlIGlmKHoubihhLCJEYXJ0IikpcmV0dXJuIEMubDgKIGVsc2UgaWYoei5uKGEsIkNvbGxlY3RlZCIpKXJldHVybiBDLldBCkBAIC0xNzUzMCwxNCArMTc3ODMsMTMgQEAKICJeIjoiYTt0VD4sQXY8LGtzPixKdiIsCiAkaXNENTp0cnVlfSwKIGt4OnsKLSJeIjoiVjRiO0kwLHhNLFBsPCxmRjwsdmcsTWIsVlMsaHcsdmE8LE9vPCxtTSxxSCxOaSxNTyxhcixNSCxvYyosZE5ALFRELEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoiRDNpO0kwLHhNLER1PCxmRjwsdmcsTWIsVlMsaHcsdmE8LE9vPCxtTSxxSCxKSyxNTyxhcixNSCxvYyosVFhALE1rLEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGdmWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5JMH0sCi1zZlk6ZnVuY3Rpb24oYSxiKXt0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAsYil9LAogZ2x0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueE19LAogZ1M3OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubU19LAogZ2FuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucUh9LAotZ0wxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuTml9LAotc0wxOmZ1bmN0aW9uKGEpe3RoaXMuTmk9Ri5XaSh0aGlzLEMuek8sdGhpcy5OaSxhKX0sCitnTDE6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5KS30sCitzTDE6ZnVuY3Rpb24oYSl7dGhpcy5KSz1GLldpKHRoaXMsQy56Tyx0aGlzLkpLLGEpfSwKIGdpZzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5NT30sCiBzaWc6ZnVuY3Rpb24oYSxiKXt0aGlzLk1PPUYuV2kodGhpcyxDLm5mLHRoaXMuTU8sYil9LAogZ0lzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFyfSwKQEAgLTE3NTQ3LDEzICsxNzc5OSwxMyBAQAogZ004OmZ1bmN0aW9uKCl7cmV0dXJuITB9LAogdHg6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKIHRoaXMuYXI9Ri5XaSh0aGlzLEMuUFgsdGhpcy5hcixhKQotZm9yKHo9dGhpcy52YSx6PXouZ0Eoeik7ei5HKCk7KWZvcih5PXoubG8uZ3VIKCkseT15LmdBKHkpO3kuRygpOyl5LmxvLmJSKGEpfSwiJDEiLCJnVUgiLDIsMCwyMDYsMjA3XSwKK2Zvcih6PXRoaXMudmEsej16LmdBKHopO3ouRygpOylmb3IoeT16LmxvLmd1SCgpLHk9eS5nQSh5KTt5LkcoKTspeS5sby5iUihhKX0sIiQxIiwiZ1VIIiwyLDAsMjEwLDIxMV0sCiBPRjpmdW5jdGlvbigpe2lmKHRoaXMuYXIhPW51bGwpcmV0dXJuCiBpZighSi54Qyh0aGlzLkkwLEMubDgpKXJldHVybgogdmFyIHo9dGhpcy5NTwogaWYoej09bnVsbClyZXR1cm4KLWlmKEouVVEoeiwic2NyaXB0Iik9PW51bGwpe0ouU0sodGhpcy5NTykubWwobmV3IEQuRW0odGhpcykpCi1yZXR1cm59Si5TSyhKLlVRKHRoaXMuTU8sInNjcmlwdCIpKS5tbCh0aGlzLmdVSCgpKX0sCitpZihKLnpIKHopPT1udWxsKXtKLlNLKHRoaXMuTU8pLm1sKG5ldyBELkVtKHRoaXMpKQorcmV0dXJufUouU0soSi56SCh0aGlzLk1PKSkubWwodGhpcy5nVUgoKSl9LAogUkU6ZnVuY3Rpb24oYSl7aWYoSi54Qyh0aGlzLkkwLEMubDgpKXJldHVybiBELmFmLnByb3RvdHlwZS5SRS5jYWxsKHRoaXMsdGhpcykKIHJldHVybiBQLkFiKHRoaXMsbnVsbCl9LAogYmQ6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYKQEAgLTE3NTcxLDE5ICsxNzgyMywxOSBAQAogdGhpcy54TT1GLldpKHRoaXMsQy5Laix0aGlzLnhNLGMpCiB6PUouVTYoYSkKIHRoaXMuZkY9SC5CVSh6LnQoYSwiaW5jbHVzaXZlX3RpY2tzIiksbnVsbCxudWxsKQotdGhpcy5QbD1ILkJVKHoudChhLCJleGNsdXNpdmVfdGlja3MiKSxudWxsLG51bGwpCit0aGlzLkR1PUguQlUoei50KGEsImV4Y2x1c2l2ZV90aWNrcyIpLG51bGwsbnVsbCkKIHRoaXMuYmQodGhpcy5WUyx6LnQoYSwiY2FsbGVycyIpLGIpCiB0aGlzLmJkKHRoaXMuaHcsei50KGEsImNhbGxlZXMiKSxiKQogeT16LnQoYSwidGlja3MiKQogaWYoeSE9bnVsbCl0aGlzLnFMKHkpCiB6PUQuUkEodGhpcy5mRix0aGlzLnhNKSsiICgiK0guZCh0aGlzLmZGKSsiKSIKIHRoaXMubU09Ri5XaSh0aGlzLEMuZUYsdGhpcy5tTSx6KQotej1ELlJBKHRoaXMuUGwsdGhpcy54TSkrIiAoIitILmQodGhpcy5QbCkrIikiCit6PUQuUkEodGhpcy5EdSx0aGlzLnhNKSsiICgiK0guZCh0aGlzLkR1KSsiKSIKIHRoaXMucUg9Ri5XaSh0aGlzLEMudVUsdGhpcy5xSCx6KX0sCiBiRjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseSx4LHcsdix1CiB6PUouVTYoYikKIHRoaXMub2M9ei50KGIsInVzZXJfbmFtZSIpCi10aGlzLmROPXoudChiLCJuYW1lIikKK3RoaXMuVFg9ei50KGIsIm5hbWUiKQogeT16LnQoYiwiaXNPcHRpbWl6ZWQiKSE9bnVsbCYmei50KGIsImlzT3B0aW1pemVkIikKIHRoaXMuTUg9Ri5XaSh0aGlzLEMucFksdGhpcy5NSCx5KQogeT1ELkNRKHoudChiLCJraW5kIikpCkBAIC0xNzU5NSw3ICsxNzg0Nyw3IEBACiB3PXguZ29kKHkpLlFuKHoudChiLCJmdW5jdGlvbiIpKQogdGhpcy5NTz1GLldpKHRoaXMsQy5uZix0aGlzLk1PLHcpCiB5PXguZ29kKHkpLlFuKHoudChiLCJvYmplY3RfcG9vbCIpKQotdGhpcy5OaT1GLldpKHRoaXMsQy56Tyx0aGlzLk5pLHkpCit0aGlzLkpLPUYuV2kodGhpcyxDLnpPLHRoaXMuSksseSkKIHY9ei50KGIsImRpc2Fzc2VtYmx5IikKIGlmKHYhPW51bGwpdGhpcy54cyh2KQogdT16LnQoYiwiZGVzY3JpcHRvcnMiKQpAQCAtMTc2MDMsOCArMTc4NTUsOCBAQAogej10aGlzLnZhLmFvCiB0aGlzLmtUPXoubGVuZ3RoIT09MHx8IUoueEModGhpcy5JMCxDLmw4KQogej16Lmxlbmd0aCE9PTAmJkoueEModGhpcy5JMCxDLmw4KQotdGhpcy5URD1GLldpKHRoaXMsQy56Uyx0aGlzLlRELHopfSwKLWd2UzpmdW5jdGlvbigpe3JldHVybiB0aGlzLlREfSwKK3RoaXMuTWs9Ri5XaSh0aGlzLEMuelMsdGhpcy5Nayx6KX0sCitndlM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5Na30sCiB4czpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCiB6PXRoaXMudmEKIHouVjEoeikKQEAgLTE3NjUwLDI0ICsxNzkwMiwyNCBAQAogZ3F5OmZ1bmN0aW9uKCl7cmV0dXJuIEoueEModGhpcy5JMCxDLmw4KX0sCiAkaXNreDp0cnVlLAogc3RhdGljOntSQTpmdW5jdGlvbihhLGIpe3JldHVybiBDLkNELlN5KDEwMCpKLlg5KGEsYiksMikrIiUifX19LAotVjRiOnsKK0QzaTp7CiAiXiI6ImFmK1BpOyIsCiAkaXNkMzp0cnVlfSwKIEVtOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuYQoteT1KLlVRKHouTU8sInNjcmlwdCIpCit5PUouekgoei5NTykKIGlmKHk9PW51bGwpcmV0dXJuCi1KLlNLKHkpLm1sKHouZ1VIKCkpfSwiJDEiLG51bGwsMiwwLG51bGwsMjA4LCJjYWxsIl0sCitKLlNLKHkpLm1sKHouZ1VIKCkpfSwiJDEiLG51bGwsMiwwLG51bGwsMjEyLCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIENxOnsKLSJeIjoiVHA6Nzk7IiwKLSQyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIEouYkkoYi5nQXYoKSxhLmdBdigpKX0sCisiXiI6IlRwWjo4MDsiLAorJDI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5IbihiLmdBdigpLGEuZ0F2KCkpfSwKICRpc0VIOnRydWV9LAotTTl4OnsKK2w4Ujp7CiAiXiI6ImE7dVgiLAotYnU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudVh9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiB0aGlzLnVYfSwiJDAiLCJnQVkiLDAsMCw2OV0sCiBzdGF0aWM6eyJeIjoiQ25rLGxUVSxGSnksd3IiLEI0OmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKQogaWYoei5uKGEsIkxpc3RlbmluZyIpKXJldHVybiBDLkNuCiBlbHNlIGlmKHoubihhLCJOb3JtYWwiKSlyZXR1cm4gQy5sVApAQCAtMTc2NzYsMjcgKzE3OTI4LDI2IEBACiBOLlFNKCIiKS5qMigiVW5rbm93biBzb2NrZXQga2luZCAiK0guZChhKSkKIHRocm93IEguYihQLmE5KCkpfX19LAogV1A6ewotIl4iOiJacWE7VjhALGliLG1JLEkwLHZ1LERCLFhLLEZILEw3LHp3LHRPLEhPLHU4LEVDLEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoiUHFiO1Y4QCxqZWwsVWUsSTAsdnUsREIsWEssRkgsTDcsencsdE8sSE8sdTgsRUMsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ1VtOmZ1bmN0aW9uKCl7cmV0dXJuITB9LAogZ0hZOmZ1bmN0aW9uKCl7cmV0dXJuIEoueEModGhpcy5JMCxDLkZKKX0sCiBnZlk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuSTB9LAotc2ZZOmZ1bmN0aW9uKGEsYil7dGhpcy5JMD1GLldpKHRoaXMsQy5MYyx0aGlzLkkwLGIpfSwKIGdhQjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy52dX0sCiBnbTg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5EQn0sCiBnVjA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5YS30sCiBnYVA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5GSH0sCiBnek06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5MN30sCi1na0U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56d30sCitneDU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy56d30sCiBnaVA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50T30sCiBnbWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5IT30sCiBnTlM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51OH0sCi1ndWg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FQ30sCitneks6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5FQ30sCiBiRjpmdW5jdGlvbihhLGIsYyl7dmFyIHoseQogej1KLlU2KGIpCiB5PXoudChiLCJuYW1lIikKIHRoaXMuYk49dGhpcy5jdCh0aGlzLEMuWVMsdGhpcy5iTix5KQogeT16LnQoYiwibmFtZSIpCi10aGlzLnQ3PXRoaXMuY3QodGhpcyxDLlRjLHRoaXMudDcseSkKK3RoaXMuR1I9dGhpcy5jdCh0aGlzLEMuVGMsdGhpcy5HUix5KQogeT1ELkI0KHoudChiLCJraW5kIikpCiB0aGlzLkkwPUYuV2kodGhpcyxDLkxjLHRoaXMuSTAseSkKIGlmKGMpcmV0dXJuCkBAIC0xNzcyMywxMSArMTc5NzQsMTEgQEAKIHk9ei50KGIsImZkIikKIHRoaXMuenc9Ri5XaSh0aGlzLEMuUjMsdGhpcy56dyx5KQogdGhpcy5WOD16LnQoYiwib3duZXIiKX19LAotWnFhOnsKK1BxYjp7CiAiXiI6ImFmK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFFmOnsKLSJeIjoiVHA6Nzk7YSxiIiwKKyJeIjoiVHBaOjgwO2EsYiIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9Si54KGIpCiB5PSEhei4kaXNxQwpAQCAtMTc3MzcsMTcgKzE3OTg4LDE3IEBACiAkaXNFSDp0cnVlfX1dLFsic2VydmljZV9lcnJvcl92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zZXJ2aWNlX2Vycm9yX3ZpZXcuZGFydCIsLFIsewogIl4iOiIiLAogek06ewotIl4iOiJWNDc7UzQsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNDc7UzQsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ2tjOmZ1bmN0aW9uKGEpe3JldHVybiBhLlM0fSwKIHNrYzpmdW5jdGlvbihhLGIpe2EuUzQ9dGhpcy5jdChhLEMueWgsYS5TNCxiKX0sCiBzdGF0aWM6e1ptSzpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLlUwLlpMKGEpCiBDLlUwLlhJKGEpCkBAIC0xNzc1NywxNyArMTgwMDgsMTcgQEAKICRpc2QzOnRydWV9fV0sWyJzZXJ2aWNlX2V4Y2VwdGlvbl92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zZXJ2aWNlX2V4Y2VwdGlvbl92aWV3LmRhcnQiLCxELHsKICJeIjoiIiwKIFJrOnsKLSJeIjoiVjQ4O1hjLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjQ4O1hjLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdqYTpmdW5jdGlvbihhKXtyZXR1cm4gYS5YY30sCiBzamE6ZnVuY3Rpb24oYSxiKXthLlhjPXRoaXMuY3QoYSxDLm5lLGEuWGMsYil9LAogc3RhdGljOntiWnA6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5WZC5aTChhKQogQy5WZC5YSShhKQpAQCAtMTc3OTUsNyArMTgwNDYsNyBAQAogIl4iOiJhO2pPPixtaDwiLAogJGlzVTI6dHJ1ZX0sCiBLTTp7Ci0iXiI6Ind2O2VHLE1wLE4+LEpTLFMzLHliLGJzLE94LEdZLFJXLFRzLFZhLGtVLGw3LExpLEcyLFJrLFF5LHo3LEFQLGZuLFAzLHIwLG1RLGtULGJOLHQ3LFZSLEFQLGZuIiwKKyJeIjoid3Y7ZUcsTXAsTj4sSlMsUzMseWIsYnMsT3gsR1ksUlcsVHMsVmEsa1UsbDcsTGksRzIsUmssUXksejcsQVAsZm4sUDMscjAsbVEsa1QsYk4sR1IsVlIsQVAsZm4iLAogZ0VIOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZUcuTU19LAogdDM6ZnVuY3Rpb24oKXt2YXIgej10aGlzLk1wLk1NCiBpZih6Lkd2PT09MCl7Ti5RTSgiIikuVG8oIldlYlNvY2tldFZNIGNvbm5lY3Rpb24gZXJyb3I6ICIrSC5kKHRoaXMuTi5ndzgoKSkpCkBAIC0xNzgxMCwxOSArMTgwNjEsMTkgQEAKIGlmKHRoaXMuYnM9PW51bGwpe3o9Vy5wUyh0aGlzLk4uZ3c4KCksbnVsbCkKIHRoaXMuYnM9egogej1ILlZNKG5ldyBXLlJPKHosQy5pNi5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ3hiKCkpLHouU2cpLFtILktwKHosMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5neGIoKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCkKIHo9dGhpcy5icwogei50b1N0cmluZwogej1ILlZNKG5ldyBXLlJPKHosQy5NRC5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ3BVKCkpLHouU2cpLFtILktwKHosMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5ncFUoKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCkKIHo9dGhpcy5icwogei50b1N0cmluZwogej1ILlZNKG5ldyBXLlJPKHosQy5KTC5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ3FNKCkpLHouU2cpLFtILktwKHosMCldKS5aeigpCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5ncU0oKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCkKIHo9dGhpcy5icwogei50b1N0cmluZwogej1ILlZNKG5ldyBXLlJPKHosQy5waC5QaCwhMSksW251bGxdKQotSC5WTShuZXcgVy5PdigwLHouREssei5QaCxXLmFGKHRoaXMuZ2E5KCkpLHouU2cpLFtILktwKHosMCldKS5aeigpfXk9Qy5qbi5idSh0aGlzLnliKyspCitILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nYTkoKSksei5TZyksW0guT3EoeiwwKV0pLlp6KCl9eT1DLmpuLmJ1KHRoaXMueWIrKykKIHo9UC5xVQogej1ILlZNKG5ldyBQLlpmKFAuRHQoeikpLFt6XSkKIHg9bmV3IFUuVTIoYix6KQpAQCAtMTc4MzAsMTAgKzE4MDgxLDEwIEBACiBlbHNlIHRoaXMuSlMudSgwLHkseCkKIHJldHVybiB6Lk1NfSwKIFc0WDpbZnVuY3Rpb24oYSl7dGhpcy5DUygpCi10aGlzLnQzKCl9LCIkMSIsImd4YiIsMiwwLDIwOSwyXSwKK3RoaXMudDMoKX0sIiQxIiwiZ3hiIiwyLDAsMjEzLDJdLAogV3A6W2Z1bmN0aW9uKGEpe3RoaXMuQ1MoKQotdGhpcy50MygpfSwiJDEiLCJncFUiLDIsMCwyMCwyMTBdLAotTUw6W2Z1bmN0aW9uKGEpe3ZhciB6LHkKK3RoaXMudDMoKX0sIiQxIiwiZ3BVIiwyLDAsMjAsMjE0XSwKK01MQzpbZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLk4KIHk9RGF0ZS5ub3coKQogbmV3IFAuaVAoeSwhMSkuRUsoKQpAQCAtMTc4NDIsNyArMTgwOTMsNyBAQAogeT10aGlzLmVHLk1NCiBpZih5Lkd2PT09MCl7Ti5RTSgiIikuVG8oIldlYlNvY2tldFZNIGNvbm5lY3Rpb24gb3BlbmVkOiAiK0guZCh6Lmd3OCgpKSkKIGlmKHkuR3YhPT0wKUgudmgoUC53KCJGdXR1cmUgYWxyZWFkeSBjb21wbGV0ZWQiKSkKLXkuT0godGhpcyl9fSwiJDEiLCJncU0iLDIsMCwyMCwyMTBdLAoreS5PSCh0aGlzKX19LCIkMSIsImdxTSIsMiwwLDIwLDIxNF0sCiBTUzpbZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcsdgogej1DLnhyLmtWKEouUWQoYSkpCiBpZih6PT1udWxsKXtOLlFNKCIiKS5ZWCgiV2ViU29ja2V0Vk0gZ290IGVtcHR5IG1lc3NhZ2UiKQpAQCAtMTc4NTYsNyArMTgxMDcsNyBAQAogaWYodj09bnVsbCl7Ti5RTSgiIikuWVgoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgbWVzc2FnZTogIitILmQoeikpCiByZXR1cm59eT12LmdtaCgpLk1NCiBpZih5Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCi15Lk9IKHcpfSwiJDEiLCJnYTkiLDIsMCwyMTEsMl0sCit5Lk9IKHcpfSwiJDEiLCJnYTkiLDIsMCwyMTUsMl0sCiB6MTpmdW5jdGlvbihhKXthLmFOKDAsbmV3IFUuRncodGhpcykpCiBhLlYxKDApfSwKIENTOmZ1bmN0aW9uKCl7dmFyIHo9dGhpcy5TMwpAQCAtMTc4NzQsMTAgKzE4MTI1LDEwIEBACiBpZighSi5Wcih6LmdqTyhiKSwiL3Byb2ZpbGUvdGFnIikpTi5RTSgiIikuVG8oIkdFVCAiK0guZCh6LmdqTyhiKSkrIiBmcm9tICIrSC5kKHRoaXMuTi5ndzgoKSkpCiB0aGlzLlMzLnUoMCxhLGIpCiB5PXRoaXMuTi5nQTkoKT09PSEwP0MueHIuS1AoUC5FRihbImlkIixILkJVKGEsbnVsbCxudWxsKSwibWV0aG9kIiwiRGFydC5vYnNlcnZhdG9yeVF1ZXJ5IiwicGFyYW1zIixQLkVGKFsiaWQiLGEsInF1ZXJ5Iix6LmdqTyhiKV0sbnVsbCxudWxsKV0sbnVsbCxudWxsKSk6Qy54ci5LUChQLkVGKFsic2VxIixhLCJyZXF1ZXN0Iix6LmdqTyhiKV0sbnVsbCxudWxsKSkKLXRoaXMuYnMuc2VuZCh5KX0sIiQyIiwiZ2tCIiw0LDAsMjEyXSwKK3RoaXMuYnMuc2VuZCh5KX0sIiQyIiwiZ2tCIiw0LDAsMjE2XSwKICRpc0tNOnRydWV9LAogRnc6ewotIl4iOiJUcDoyMTM7YSIsCisiXiI6IlRwWjoyMTc7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9Yi5nbWgoKQogeT1DLnhyLktQKFAuRUYoWyJ0eXBlIiwiU2VydmljZUV4Y2VwdGlvbiIsImlkIiwiIiwia2luZCIsIk5ldHdvcmtFeGNlcHRpb24iLCJtZXNzYWdlIiwiV2ViU29ja2V0IGRpc2Nvbm5lY3RlZCJdLG51bGwsbnVsbCkpCkBAIC0xNzg4NSw4ICsxODEzNiw4IEBACiBpZih6Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCiB6Lk9IKHkpfSwKICRpc0VIOnRydWV9LAotWlc6ewotIl4iOiJ3djtlRyxNcCxTMyx5YixPeCxHWSxSVyxUcyxWYSxrVSxsNyxMaSxHMixSayxReSx6NyxBUCxmbixQMyxyMCxtUSxrVCxiTix0NyxWUixBUCxmbiIsCitkUzp7CisiXiI6Ind2O2VHLE1wLFMzLHliLE94LEdZLFJXLFRzLFZhLGtVLGw3LExpLEcyLFJrLFF5LHo3LEFQLGZuLFAzLHIwLG1RLGtULGJOLEdSLFZSLEFQLGZuIiwKIGplOmZ1bmN0aW9uKGEpe30sCiBnRUg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lRy5NTX0sCiBnaUc6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuTXAuTU19LApAQCAtMTc4OTksNyArMTgxNTAsNyBAQAogej10aGlzLlMzCiB2PXoudCgwLHkpCiB6LlJ6KDAseSkKLUouS0Qodix3KX0sIiQxIiwiZ1Z4IiwyLDAsMjAsNzRdLAorSi5LRCh2LHcpfSwiJDEiLCJnVngiLDIsMCwyMCw3NV0sCiB6NjpmdW5jdGlvbihhLGIpe3ZhciB6LHkseAogej0iIit0aGlzLnliCiB5PVAuRmwobnVsbCxudWxsKQpAQCAtMTc5MDgsMTggKzE4MTU5LDIwIEBACiB5LnUoMCwicXVlcnkiLEguZChiKSk7Kyt0aGlzLnliCiB4PUguVk0obmV3IFAuWmYoUC5EdChudWxsKSksW251bGxdKQogdGhpcy5TMy51KDAseix4KQotSi5WMihXLlB2KHdpbmRvdy5wYXJlbnQpLEMueHIuS1AoeSksIioiKQorSi50VChXLlB2KHdpbmRvdy5wYXJlbnQpLEMueHIuS1AoeSksIioiKQogcmV0dXJuIHguTU19LAogWkg6ZnVuY3Rpb24oKXt2YXIgej1ILlZNKG5ldyBXLlJPKHdpbmRvdyxDLnBoLlBoLCExKSxbbnVsbF0pCi1ILlZNKG5ldyBXLk92KDAsei5ESyx6LlBoLFcuYUYodGhpcy5nVngoKSksei5TZyksW0guS3AoeiwwKV0pLlp6KCkKK0guVk0obmV3IFcuT3YoMCx6LkRLLHouUGgsVy5hRih0aGlzLmdWeCgpKSx6LlNnKSxbSC5PcSh6LDApXSkuWnooKQogej10aGlzLmVHLk1NCiBpZih6Lkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCiB6Lk9IKHRoaXMpfX19XSxbInNlcnZpY2Vfb2JqZWN0X3ZpZXdfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NlcnZpY2Vfdmlldy5kYXJ0IiwsVSx7CiAiXiI6IiIsCiBUaTp7Ci0iXiI6IlY0OTtMbCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY0OTtMbCxTYSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnV0E6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuTGx9LAogc1dBOmZ1bmN0aW9uKGEsYil7YS5MbD10aGlzLmN0KGEsQy50ZCxhLkxsLGIpfSwKK2dLdzpmdW5jdGlvbihhKXtyZXR1cm4gYS5TYX0sCitzS3c6ZnVuY3Rpb24oYSxiKXthLlNhPXRoaXMuY3QoYSxDLlpnLGEuU2EsYil9LAogWHE6ZnVuY3Rpb24oYSl7dmFyIHoKIHN3aXRjaChhLkxsLmd6UygpKXtjYXNlIkFsbG9jYXRpb25Qcm9maWxlIjp6PVcucjMoImhlYXAtcHJvZmlsZSIsbnVsbCkKIEouQ0ooeixhLkxsKQpAQCAtMTgwMjgsMTAgKzE4MjgxLDEwIEBACiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLk5zLlpMKGEpCiBDLk5zLlhJKGEpCkBAIC0xODA0MSw5ICsxODI5NCw5IEBACiAkaXNkMzp0cnVlfX1dLFsic2VydmljZV9yZWZfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NlcnZpY2VfcmVmLmRhcnQiLCxRLHsKICJeIjoiIiwKIHhJOnsKLSJeIjoiVmZ4O3RZLFBlLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVmZ4O3RZLFBlLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdudjpmdW5jdGlvbihhKXtyZXR1cm4gYS50WX0sCi1zbnY6ZnVuY3Rpb24oYSxiKXthLnRZPXRoaXMuY3QoYSxDLnhQLGEudFksYil9LAorc252OmZ1bmN0aW9uKGEsYil7YS50WT10aGlzLmN0KGEsQy5rWSxhLnRZLGIpfSwKIGdqVDpmdW5jdGlvbihhKXtyZXR1cm4gYS5QZX0sCiBzalQ6ZnVuY3Rpb24oYSxiKXthLlBlPXRoaXMuY3QoYSxDLnV1LGEuUGUsYil9LAogYVY6W2Z1bmN0aW9uKGEsYil7dGhpcy5jdChhLEMuRmgsIiIsdGhpcy5nTzMoYSkpCkBAIC0xODA1Nyw3ICsxODMxMCw3IEBACiByZXR1cm4iIyIrSC5kKHopfSwKIGdKcDpmdW5jdGlvbihhKXt2YXIgej1hLnRZCiBpZih6PT1udWxsKXJldHVybiJOVUxMIFJFRiIKLXJldHVybiB6LmdkTigpfSwKK3JldHVybiB6LmdUWCgpfSwKIGdvYzpmdW5jdGlvbihhKXt2YXIgej1hLnRZCiBpZih6PT1udWxsKXJldHVybiJOVUxMIFJFRiIKIHJldHVybiBKLk82KHopfSwKQEAgLTE4MDY3LDEwICsxODMyMCwxMCBAQAogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCiBhLlBlPSExCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLkhSYy5aTChhKQogQy5IUmMuWEkoYSkKQEAgLTE4MDgwLDcgKzE4MzMzLDcgQEAKICRpc2QzOnRydWV9fV0sWyJzbGlkaW5nX2NoZWNrYm94X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zbGlkaW5nX2NoZWNrYm94LmRhcnQiLCxRLHsKICJeIjoiIiwKIENZOnsKLSJeIjoiSW1LO2tGLElLLGJQLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiSW1LO2tGLElLLGJQLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGdkNDpmdW5jdGlvbihhKXtyZXR1cm4gYS5rRn0sCiBzZDQ6ZnVuY3Rpb24oYSxiKXthLmtGPXRoaXMuY3QoYSxDLmJrLGEua0YsYil9LAogZ0V1OmZ1bmN0aW9uKGEpe3JldHVybiBhLklLfSwKQEAgLTE4MDg4LDE1ICsxODM0MSwxNSBAQAogZ1JZOmZ1bmN0aW9uKGEpe3JldHVybiBhLmJQfSwKIHNSWTpmdW5jdGlvbihhLGIpe2EuYlA9dGhpcy5jdChhLEMuelUsYS5iUCxiKX0sCiBSQzpbZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHo9Si5LMCgoYS5zaGFkb3dSb290fHxhLndlYmtpdFNoYWRvd1Jvb3QpLnF1ZXJ5U2VsZWN0b3IoIiNzbGlkZS1zd2l0Y2giKSkKLWEua0Y9dGhpcy5jdChhLEMuYmssYS5rRix6KX0sIiQzIiwiZ1FVIiw2LDAsMTExLDEsMjE0LDEwM10sCithLmtGPXRoaXMuY3QoYSxDLmJrLGEua0Yseil9LCIkMyIsImdRVSIsNiwwLDExMiwxLDIxOCwxMDRdLAogc3RhdGljOntTbTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnpiLlpMKGEpCiBDLnpiLlhJKGEpCkBAIC0xODEwNiwyMSArMTgzNTksMjEgQEAKICRpc2QzOnRydWV9fV0sWyJzbW9rZSIsInBhY2thZ2U6c21va2Uvc21va2UuZGFydCIsLEEsewogIl4iOiIiLAogV3E6ewotIl4iOiJhO2MxLElXLE1nLG5OLEVSLEphLFdJLFBwIiwKLVdPOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuUHAuJDEoYil9LAotYnU6ZnVuY3Rpb24oYSl7dmFyIHo9UC5wOSgiIikKKyJeIjoiYTt3cSxJVyxNZyxuTixFUixKYSxXSSx0dSIsCitXTzpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnR1LiQxKGIpfSwKK2J1OltmdW5jdGlvbihhKXt2YXIgej1QLnA5KCIiKQogei5LRigiKG9wdGlvbnM6IikKLXouS0YodGhpcy5jMT8iZmllbGRzICI6IiIpCit6LktGKHRoaXMud3E/ImZpZWxkcyAiOiIiKQogei5LRih0aGlzLklXPyJwcm9wZXJ0aWVzICI6IiIpCiB6LktGKHRoaXMuSmE/Im1ldGhvZHMgIjoiIikKIHouS0YodGhpcy5NZz8iaW5oZXJpdGVkICI6Il8iKQogei5LRih0aGlzLkVSPyJubyBmaW5hbHMgIjoiIikKIHouS0YoImFubm90YXRpb25zOiAiK0guZCh0aGlzLldJKSkKLXouS0YodGhpcy5QcCE9bnVsbD8id2l0aCBtYXRjaGVyIjoiIikKK3ouS0YodGhpcy50dSE9bnVsbD8id2l0aCBtYXRjaGVyIjoiIikKIHouS0YoIikiKQotcmV0dXJuIHoudk19fSwKK3JldHVybiB6LnZNfSwiJDAiLCJnQVkiLDAsMCw2OV19LAogRVM6ewotIl4iOiJhO29jPixmWT4sVjU+LHQ1PixGbyxEdjwiLAorIl4iOiJhO29jPixmWT4sVjU+LHQ1PixGbzwsRHY8IiwKIGdaSTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZZPT09Qy5uVX0sCiBnVWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mWT09PUMuQk19LAogZ1VBOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZlk9PT1DLmhVfSwKQEAgLTE4MTI4LDcgKzE4MzgxLDcgQEAKIHJldHVybiB6LmdpTyh6KX0sCiBuOmZ1bmN0aW9uKGEsYil7aWYoYj09bnVsbClyZXR1cm4hMQogcmV0dXJuISFKLngoYikuJGlzRVMmJnRoaXMub2MubigwLGIub2MpJiZ0aGlzLmZZPT09Yi5mWSYmdGhpcy5WNT09PWIuVjUmJnRoaXMudDUubigwLGIudDUpJiZ0aGlzLkZvPT09Yi5GbyYmWC5XNCh0aGlzLkR2LGIuRHYsITEpfSwKLWJ1OmZ1bmN0aW9uKGEpe3ZhciB6PVAucDkoIiIpCitidTpbZnVuY3Rpb24oYSl7dmFyIHo9UC5wOSgiIikKIHouS0YoIihkZWNsYXJhdGlvbiAiKQogei5LRih0aGlzLm9jKQogei5LRih0aGlzLmZZPT09Qy5CTT8iIChwcm9wZXJ0eSkgIjoiIChtZXRob2QpICIpCkBAIC0xODEzNiw3ICsxODM4OSw3IEBACiB6LktGKHRoaXMuRm8/InN0YXRpYyAiOiIiKQogei5LRih0aGlzLkR2KQogei5LRigiKSIpCi1yZXR1cm4gei52TX0sCityZXR1cm4gei52TX0sIiQwIiwiZ0FZIiwwLDAsNjldLAogJGlzRVM6dHJ1ZX0sCiBpWW46ewogIl4iOiJhO2ZZPiJ9fV0sWyJzbW9rZS5zcmMuY29tbW9uIiwicGFja2FnZTpzbW9rZS9zcmMvY29tbW9uLmRhcnQiLCxYLHsKQEAgLTE4MTUyLDE4ICsxODQwNSwxOCBAQAogcmV0dXJuIHp9cmV0dXJuIGF9LAogWk86ZnVuY3Rpb24oYSxiKXt2YXIgeix5LHgsdyx2LHUKIHo9bmV3IEguYTcoYSxhLmxlbmd0aCwwLG51bGwpCi16LiRidWlsdGluVHlwZUluZm89W0guS3AoYSwwKV0KK3ouJGJ1aWx0aW5UeXBlSW5mbz1bSC5PcShhLDApXQogZm9yKDt6LkcoKTspe3k9ei5sbwogYi5sZW5ndGgKIHg9bmV3IEguYTcoYiwxLDAsbnVsbCkKLXguJGJ1aWx0aW5UeXBlSW5mbz1bSC5LcChiLDApXQoreC4kYnVpbHRpblR5cGVJbmZvPVtILk9xKGIsMCldCiB3PUoueCh5KQogZm9yKDt4LkcoKTspe3Y9eC5sbwogaWYody5uKHksdikpcmV0dXJuITAKIGlmKCEhSi54KHYpLiRpc3VxKXt1PXcuZ2J4KHkpCiB1PSQubVgoKS5kTSh1LHYpfWVsc2UgdT0hMQogaWYodSlyZXR1cm4hMH19cmV0dXJuITF9LAotT1M6ZnVuY3Rpb24oYSl7dmFyIHoseQorQ3o6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1ILkczKCkKIHk9SC5LVCh6KS5CRChhKQogaWYoeSlyZXR1cm4gMApAQCAtMTgxOTgsNyArMTg0NTEsNyBAQAoga1A6ZnVuY3Rpb24oKXt0aHJvdyBILmIoUC5GTSgiVGhlIFwic21va2VcIiBsaWJyYXJ5IGhhcyBub3QgYmVlbiBjb25maWd1cmVkLiBNYWtlIHN1cmUgeW91IGltcG9ydCBhbmQgY29uZmlndXJlIG9uZSBvZiB0aGUgaW1wbGVtZW50YXRpb25zIChwYWNrYWdlOnNtb2tlL21pcnJvcnMuZGFydCBvciBwYWNrYWdlOnNtb2tlL3N0YXRpYy5kYXJ0KS4iKSl9fV0sWyJzbW9rZS5zdGF0aWMiLCJwYWNrYWdlOnNtb2tlL3N0YXRpYy5kYXJ0IiwsTyx7CiAiXiI6IiIsCiBPajp7Ci0iXiI6ImE7TEgsQUgsWkdqLFlLSCxOWCxhZjwseVEifSwKKyJeIjoiYTtoMixBSCxaR2osWUtILFlwLGFmPCx5USJ9LAogZkg6ewogIl4iOiJhO2VBLHZrLFg5IiwKIGpEOmZ1bmN0aW9uKGEsYil7dmFyIHo9dGhpcy5lQS50KDAsYikKQEAgLTE4MjEzLDcgKzE4NDY2LDcgQEAKIHo9bnVsbH1lbHNle3g9dGhpcy5lQS50KDAsYikKIHo9eD09bnVsbD9udWxsOnguJDEoYSl9aWYoej09bnVsbCl0aHJvdyBILmIoTy5sQSgibWV0aG9kIFwiIitILmQoYikrIlwiIGluICIrSC5kKGEpKSkKIHk9bnVsbAotaWYoZCl7dz1YLk9TKHopCitpZihkKXt3PVguQ3ooeikKIGlmKHc+Myl7eT0id2UgdHJpZWQgdG8gYWRqdXN0IHRoZSBhcmd1bWVudHMgZm9yIGNhbGxpbmcgXCIiK0guZChiKSsiXCIsIGJ1dCB3ZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIGV4YWN0IG51bWJlciBvZiBhcmd1bWVudHMgaXQgZXhwZWN0cyAoaXQgaXMgbW9yZSB0aGFuIDMpLiIKIGM9WC5OYShjLHcsUC55KHcsSi5xOChjKSkpfWVsc2V7dj1YLlJJKHopCiB1PXY+PTA/djpKLnE4KGMpCkBAIC0xODI0NSwxMSArMTg0OTgsMTEgQEAKIGlmKHk9PW51bGwpe2lmKHRoaXMuQVopdGhyb3cgSC5iKE8ubEEoInN1cGVyY2xhc3Mgb2YgXCIiK0guZChiKSsiXCIiKSl9ZWxzZSBpZigheS5uKDAsYy5uTikpej10aGlzLk1lKDAseSxjKX14PXRoaXMuV0YudCgwLGIpCiBpZih4PT1udWxsKXtpZighdGhpcy5BWilyZXR1cm4gegogdGhyb3cgSC5iKE8ubEEoImRlY2xhcmF0aW9ucyBmb3IgIitILmQoYikpKX1mb3Iodz1KLm1ZKHguZ1VRKHgpKTt3LkcoKTspe3Y9dy5nbCgpCi1pZighYy5jMSYmdi5nWkkoKSljb250aW51ZQoraWYoIWMud3EmJnYuZ1pJKCkpY29udGludWUKIGlmKCFjLklXJiZ2LmdVZCgpKWNvbnRpbnVlCiBpZihjLkVSJiZKLlo2KHYpPT09ITApY29udGludWUKIGlmKCFjLkphJiZ2LmdVQSgpKWNvbnRpbnVlCi1pZihjLlBwIT1udWxsJiZjLldPKDAsSi5PNih2KSkhPT0hMCljb250aW51ZQoraWYoYy50dSE9bnVsbCYmYy5XTygwLEouTzYodikpIT09ITApY29udGludWUKIHU9Yy5XSQogaWYodSE9bnVsbCYmIVguWk8odi5nRHYoKSx1KSljb250aW51ZQogei5wdXNoKHYpfXJldHVybiB6fSwKQEAgLTE4MjY2LDI2ICsxODUxOSwyNiBAQAogei5VdChhKQogcmV0dXJuIHp9fX0sCiBtODp7Ci0iXiI6IlRwOjc5O2EiLAorIl4iOiJUcFo6ODA7YSIsCiAkMjpmdW5jdGlvbihhLGIpe3RoaXMuYS5Oei51KDAsYixhKX0sCiAkaXNFSDp0cnVlfSwKIHRrOnsKICJeIjoiYTtHQiIsCi1idTpmdW5jdGlvbihhKXtyZXR1cm4iTWlzc2luZyAiK3RoaXMuR0IrIi4gQ29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc21va2UgcGFja2FnZSBzZWVtcyBpbmNvbXBsZXRlLiJ9LAorYnU6W2Z1bmN0aW9uKGEpe3JldHVybiJNaXNzaW5nICIrdGhpcy5HQisiLiBDb2RlIGdlbmVyYXRpb24gZm9yIHRoZSBzbW9rZSBwYWNrYWdlIHNlZW1zIGluY29tcGxldGUuIn0sIiQwIiwiZ0FZIiwwLDAsNjldLAogc3RhdGljOntsQTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IE8udGsoYSl9fX19XSxbInN0YWNrX2ZyYW1lX2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zdGFja19mcmFtZS5kYXJ0IiwsSyx7CiAiXiI6IiIsCiBubTp7Ci0iXiI6IlY1MDt4UCxBUCxmbixkaSxvMSxBUCxmbixBUCxmbixJWCxxOSxTYSxVayxvcSxXeixxMSxTRCxYTixYeSxaUSIsCisiXiI6IlY1MDt4UCxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBnTTY6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueFB9LAogc002OmZ1bmN0aW9uKGEsYil7YS54UD10aGlzLmN0KGEsQy5yRSxhLnhQLGIpfSwKLXN0YXRpYzp7YW50OmZ1bmN0aW9uKGEpe3ZhciB6LHkKK3N0YXRpYzp7YW46ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQogQy5kWC5aTChhKQogQy5kWC5YSShhKQpAQCAtMTgyOTUsMTggKzE4NTQ4LDE4IEBACiAkaXNkMzp0cnVlfX1dLFsic3RhY2tfdHJhY2VfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3N0YWNrX3RyYWNlLmRhcnQiLCxYLHsKICJeIjoiIiwKIHV3OnsKLSJeIjoiVjUxO2p1LEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjUxO2p1LEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd0TjpmdW5jdGlvbihhKXtyZXR1cm4gYS5qdX0sCiBzdE46ZnVuY3Rpb24oYSxiKXthLmp1PXRoaXMuY3QoYSxDLmt3LGEuanUsYil9LAotcEE6W2Z1bmN0aW9uKGEsYil7Si5jSShhLmp1KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOThdLAorU0s6W2Z1bmN0aW9uKGEsYil7Si5jSShhLmp1KS5ZTShiKX0sIiQxIiwiZ3ZDIiwyLDAsMjAsOTldLAogc3RhdGljOntISTpmdW5jdGlvbihhKXt2YXIgeix5CiB6PVAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxXLkkwKQogeT1QLnFVCiB5PUguVk0obmV3IFYucUMoUC5ZTShudWxsLG51bGwsbnVsbCx5LG51bGwpLG51bGwsbnVsbCksW3ksbnVsbF0pCi1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXoKK2Eub0c9ITEKK2EuWk09egogYS5aUT15CiBDLnVDLlpMKGEpCiBDLnVDLlhJKGEpCkBAIC0xODMyMywxMSArMTg1NzYsMTEgQEAKIHk9ZD09bnVsbD8iIjpILmQoZCkKIHouTVcuc2V0QXR0cmlidXRlKGIseSl9fSwKIHk5OmZ1bmN0aW9uKGEpe3ZhciB6Ci1mb3IoO3o9Si5UbUIoYSkseiE9bnVsbDthPXopO3JldHVybiBNLndwKGEpP2E6bnVsbH0sCi13cDpmdW5jdGlvbihhKXt2YXIgej1KLngoYSkKK2Zvcig7ej1KLlRtQihhKSx6IT1udWxsO2E9eik7cmV0dXJuIE0uTVBnKGEpP2E6bnVsbH0sCitNUGc6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiByZXR1cm4hIXouJGlzWU58fCEhei4kaXNJMHx8ISF6LiRpc2h5fSwKIGRnOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1Ci16PU0uTGwoYSxiKQorej1NLnBOeihhLGIpCiBpZih6PT1udWxsKXo9bmV3IE0uUFcoW10sbnVsbCxudWxsKQogZm9yKHk9Si5SRShhKSx4PXkuZ1BaKGEpLHc9bnVsbCx2PTA7eCE9bnVsbDt4PXgubmV4dFNpYmxpbmcsKyt2KXt1PU0uZGcoeCxiKQogaWYodT09bnVsbCljb250aW51ZQpAQCAtMTgzNjAsNyArMTg2MTMsNyBAQAogaWYoYT09bnVsbClyZXR1cm59fSwKIGZYOmZ1bmN0aW9uKGEsYixjKXtpZihjPT1udWxsKXJldHVybgogcmV0dXJuIG5ldyBNLmhnKGEsYixjKX0sCi1MbDpmdW5jdGlvbihhLGIpe3ZhciB6LHkKK3BOejpmdW5jdGlvbihhLGIpe3ZhciB6LHkKIHo9Si54KGEpCiBpZighIXouJGlzaDQpcmV0dXJuIE0uRjUoYSxiKQogaWYoISF6LiRpc213KXt5PVMuajkoYS50ZXh0Q29udGVudCxNLmZYKCJ0ZXh0IixhLGIpKQpAQCAtMTg0MjEsNyArMTg2NzQsNyBAQAogd2hpbGUoITApe3c9eC5nQihiKQogaWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCiBpZighKHY8dykpYnJlYWsKLWMkMDp7dT1iLkFYKHYpCitjJDA6e3U9Yi5sOCh2KQogej1iLkhIKHYpCiBpZih6IT1udWxsKXt0PXouJDMoZCxjLHUpCiBpZih1PT09ITApeS5VMih0KQpAQCAtMTg0MzksOCArMTg2OTIsOCBAQAogaWYociE9bnVsbCYmITApZC5wdXNoKHIpfXYuVnooeCkKIGlmKCF6LiRpc3FmKXJldHVybgogcT1NLlNCKGEpCi1xLnNRMihjKQotcD1xLkE1KGIpCitxLnNDeihjKQorcD1xLlpaKGIpCiBpZihwIT1udWxsJiYhMClkLnB1c2gocCl9LAogU0I6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIHo9JC5jbSgpCkBAIC0xODQ1MSwxMSArMTg3MDQsMTEgQEAKIHc9Si54KGEpCiBpZighIXcuJGlzTWkpeD1uZXcgTS5MMShhLG51bGwsbnVsbCkKIGVsc2UgaWYoISF3LiRpc3prKXg9bmV3IE0udWcoYSxudWxsLG51bGwpCi1lbHNlIGlmKCEhdy4kaXNBNSl4PW5ldyBNLlZUKGEsbnVsbCxudWxsKQorZWxzZSBpZighIXcuJGlzSFIpeD1uZXcgTS5WVChhLG51bGwsbnVsbCkKIGVsc2UgaWYoISF3LiRpc2g0KXtpZighKGEudGFnTmFtZT09PSJURU1QTEFURSImJmEubmFtZXNwYWNlVVJJPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiKSlpZighKHcuZ1FnKGEpLk1XLmhhc0F0dHJpYnV0ZSgidGVtcGxhdGUiKT09PSEwJiZDLno1Lng0KDAsdy5ncW4oYSkpPT09ITApKXc9YS50YWdOYW1lPT09InRlbXBsYXRlIiYmdy5nS0QoYSk9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiBlbHNlIHc9ITAKIGVsc2Ugdz0hMAoteD13P25ldyBNLkRUKG51bGwsbnVsbCxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLGEsbnVsbCxudWxsKTpuZXcgTS5wcShhLG51bGwsbnVsbCl9ZWxzZSB4PSEhdy4kaXNtdz9uZXcgTS5YVChhLG51bGwsbnVsbCk6bmV3IE0udnkoYSxudWxsLG51bGwpCit4PXc/bmV3IE0uRFQobnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsYSxudWxsLG51bGwpOm5ldyBNLlYyKGEsbnVsbCxudWxsKX1lbHNlIHg9ISF3LiRpc213P25ldyBNLlhUKGEsbnVsbCxudWxsKTpuZXcgTS52eShhLG51bGwsbnVsbCkKIHoudSgwLGEseCkKIHJldHVybiB4fSwKIENGOmZ1bmN0aW9uKGEpe3ZhciB6PUoueChhKQpAQCAtMTg0NjgsNyArMTg3MjEsNyBAQAogIl4iOiJhO2NKIiwKIFVTOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm59LAogc3RhdGljOnsiXiI6ImFjIn19LAotcHE6eworVjI6ewogIl4iOiJ2eTtyRixDZCxWdyIsCiBuUjpmdW5jdGlvbihhLGIsYyxkKXt2YXIgeix5LHgsdyx2LHUKIHo9e30KQEAgLTE4NDg0LDggKzE4NzM3LDggQEAKIGlmKHUpe3guZ1FnKHkpLlJ6KDAsei5hKQogeD16LmEKIHc9Si5VNih4KQotei5hPXcuTmooeCwwLEouYkkody5nQih4KSwxKSl9aWYoZClyZXR1cm4gTS5BRCh0aGlzLmdyRigpLHouYSx1LGMpCi14PW5ldyBNLklvWih6LHRoaXMsdSkKK3ouYT13Lk5qKHgsMCxKLkhuKHcuZ0IoeCksMSkpfWlmKGQpcmV0dXJuIE0uQUQodGhpcy5nckYoKSx6LmEsdSxjKQoreD1uZXcgTS5CTCh6LHRoaXMsdSkKIHguJDEoSi5tdShjLHgpKX16PXouYQogcmV0dXJuICQucks/dGhpcy5Ceih6LGMpOmN9LAogRHQ6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMKQEAgLTE4NTAyLDggKzE4NzU1LDggQEAKIHM9bnVsbH15LnNQKHosYT09bnVsbD8iIjpILmQoYSkpCiBpZihzIT1udWxsJiYhSi54Qyh3LmdQKHgpLHQpKXt5PXcuZ1AoeCkKIEoudGEocy5ndnQoKSx5KX19LCIkMSIsImdlMiIsMiwwLDIwLDU4XX0sCi1Jb1o6ewotIl4iOiJUcDoxMzthLGIsYyIsCitCTDp7CisiXiI6IlRwWjoxMzthLGIsYyIsCiAkMTpbZnVuY3Rpb24oYSl7cmV0dXJuIE0uQUQodGhpcy5iLmdyRigpLHRoaXMuYS5hLHRoaXMuYyxhKX0sIiQxIixudWxsLDIsMCxudWxsLDY1LCJjYWxsIl0sCiAkaXNFSDp0cnVlfSwKIGIyOnsKQEAgLTE4NTMzLDE0ICsxODc4NiwxNCBAQAogaWYoeiE9bnVsbCl7Si55ZCh6KQogdGhpcy52dD1udWxsfX0sCiAkaXNiMjp0cnVlLAotc3RhdGljOnsiXiI6Im5TIixwdzpmdW5jdGlvbihhLGIsYyl7c3dpdGNoKGMpe2Nhc2UiY2hlY2tlZCI6Si5BZShhLG51bGwhPWImJiExIT09YikKK3N0YXRpYzp7Il4iOiJTOCIscHc6ZnVuY3Rpb24oYSxiLGMpe3N3aXRjaChjKXtjYXNlImNoZWNrZWQiOkouQWUoYSxudWxsIT1iJiYhMSE9PWIpCiByZXR1cm4KLWNhc2Uic2VsZWN0ZWRJbmRleCI6Si5kayhhLE0uaDUoYikpCitjYXNlInNlbGVjdGVkSW5kZXgiOkouZGsoYSxNLkZhKGIpKQogcmV0dXJuCiBjYXNlInZhbHVlIjpKLnRhKGEsYj09bnVsbD8iIjpILmQoYikpCiByZXR1cm59fSxJUHQ6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiBpZighIXouJGlzUWx0KXJldHVybiBILlZNKG5ldyBXLkpGKGEsQy5pMy5QaCwhMSksW251bGxdKQotc3dpdGNoKHouZ3Q1KGEpKXtjYXNlImNoZWNrYm94IjpyZXR1cm4gJC5EUigpLkxYKGEpCitzd2l0Y2goei5ndDUoYSkpe2Nhc2UiY2hlY2tib3giOnJldHVybiAkLkZGKCkuTFgoYSkKIGNhc2UicmFkaW8iOmNhc2Uic2VsZWN0LW11bHRpcGxlIjpjYXNlInNlbGVjdC1vbmUiOnJldHVybiB6LmdFcihhKQogY2FzZSJyYW5nZSI6aWYoSi54NSh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCxuZXcgSC5WUigiVHJpZGVudHxNU0lFIixILnY0KCJUcmlkZW50fE1TSUUiLCExLCEwLCExKSxudWxsLG51bGwpKSlyZXR1cm4gei5nRXIoYSkKIGJyZWFrfXJldHVybiB6LmdMbShhKX0scHQ6ZnVuY3Rpb24oYSl7dmFyIHoseSx4CkBAIC0xODU1MSwzNSArMTg4MDQsMzUgQEAKIHJldHVybiB6LmFkKHosbmV3IE0ucXgoYSkpfWVsc2V7eT1NLnk5KGEpCiBpZih5PT1udWxsKXJldHVybiBDLmRuCiB4PUouTUsoeSwiaW5wdXRbdHlwZT1cInJhZGlvXCJdW25hbWU9XCIiK0guZCh6LmdvYyhhKSkrIlwiXSIpCi1yZXR1cm4geC5hZCh4LG5ldyBNLnk0KGEpKX19LGg1OmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIEguQlUoYSxudWxsLG5ldyBNLkxHKCkpCityZXR1cm4geC5hZCh4LG5ldyBNLnk0KGEpKX19LEZhOmZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT09InN0cmluZyIpcmV0dXJuIEguQlUoYSxudWxsLG5ldyBNLkxHKCkpCiByZXR1cm4gdHlwZW9mIGE9PT0ibnVtYmVyIiYmTWF0aC5mbG9vcihhKT09PWE/YTowfX19LAotVWZhOnsKLSJeIjoiVHA6NzE7IiwKK1JhYTp7CisiXiI6IlRwWjo3MjsiLAogJDA6ZnVuY3Rpb24oKXt2YXIgeix5LHgsdyx2CiB6PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCkuYXBwZW5kQ2hpbGQoVy5FRChudWxsKSkKIHk9Si5SRSh6KQogeS5zdDUoeiwiY2hlY2tib3giKQogeD1bXQogdz15Lmdmcyh6KQotSC5WTShuZXcgVy5PdigwLHcuREssdy5QaCxXLmFGKG5ldyBNLnBwKHgpKSx3LlNnKSxbSC5LcCh3LDApXSkuWnooKQorSC5WTShuZXcgVy5PdigwLHcuREssdy5QaCxXLmFGKG5ldyBNLnBwKHgpKSx3LlNnKSxbSC5PcSh3LDApXSkuWnooKQogeT15LmdFcih6KQotSC5WTShuZXcgVy5PdigwLHkuREsseS5QaCxXLmFGKG5ldyBNLmlrKHgpKSx5LlNnKSxbSC5LcCh5LDApXSkuWnooKQorSC5WTShuZXcgVy5PdigwLHkuREsseS5QaCxXLmFGKG5ldyBNLkxmUyh4KSkseS5TZyksW0guT3EoeSwwKV0pLlp6KCkKIHk9d2luZG93CiB2PWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50IikKIEouRGgodiwiY2xpY2siLCEwLCEwLHksMCwwLDAsMCwwLCExLCExLCExLCExLDAsbnVsbCkKIHouZGlzcGF0Y2hFdmVudCh2KQotcmV0dXJuIHgubGVuZ3RoPT09MT9DLlUzOkMuTm0uZ3RIKHgpfSwKK3JldHVybiB4Lmxlbmd0aD09PTE/Qy5VMzpDLk5tLmdUdyh4KX0sCiAkaXNFSDp0cnVlfSwKIHBwOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt0aGlzLmEucHVzaChDLlQxKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAotaWs6ewotIl4iOiJUcDoxMztiIiwKK0xmUzp7CisiXiI6IlRwWjoxMztiIiwKICQxOltmdW5jdGlvbihhKXt0aGlzLmIucHVzaChDLlUzKX0sIiQxIixudWxsLDIsMCxudWxsLDEsImNhbGwiXSwKICRpc0VIOnRydWV9LAogcXg6ewotIl4iOiJUcDoxMzthIiwKKyJeIjoiVHBaOjEzO2EiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHoseQogej10aGlzLmEKIHk9Si54KGEpCkBAIC0xODU5MSwyMCArMTg4NDQsMjAgQEAKIHJldHVybiB6fSwKICRpc0VIOnRydWV9LAogeTQ6ewotIl4iOiJUcDoxMztiIiwKKyJeIjoiVHBaOjEzO2IiLAogJDE6ZnVuY3Rpb24oYSl7dmFyIHo9Si54KGEpCiByZXR1cm4hei5uKGEsdGhpcy5iKSYmei5nTUIoYSk9PW51bGx9LAogJGlzRUg6dHJ1ZX0sCiBMRzp7Ci0iXiI6IlRwOjEzOyIsCisiXiI6IlRwWjoxMzsiLAogJDE6ZnVuY3Rpb24oYSl7cmV0dXJuIDB9LAogJGlzRUg6dHJ1ZX0sCiBMMTp7Ci0iXiI6InBxO3JGLENkLFZ3IiwKKyJeIjoiVjI7ckYsQ2QsVnciLAogZ3JGOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuckZ9LAogblI6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIHoseSx4CiB6PUoueChiKQotaWYoIXoubihiLCJ2YWx1ZSIpJiYhei5uKGIsImNoZWNrZWQiKSlyZXR1cm4gTS5wcS5wcm90b3R5cGUublIuY2FsbCh0aGlzLHRoaXMsYixjLGQpCitpZighei5uKGIsInZhbHVlIikmJiF6Lm4oYiwiY2hlY2tlZCIpKXJldHVybiBNLlYyLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKIEouVnModGhpcy5yRikuUnooMCxiKQogaWYoZCl7TS5wdyh0aGlzLnJGLGMsYikKIHJldHVybn16PXRoaXMuckYKQEAgLTE4NjMyLDkgKzE4ODg1LDkgQEAKIGlmKHR5cGVvZiBjb25zb2xlIT0idW5kZWZpbmVkIiljb25zb2xlLmVycm9yKHopCiByZXR1cm59LAogVno6ZnVuY3Rpb24oYSl7fSwKLWdDbjpmdW5jdGlvbihhKXt2YXIgej10aGlzLlZ3CitnbVNBOmZ1bmN0aW9uKGEpe3ZhciB6PXRoaXMuVncKIGlmKHohPW51bGwpO2Vsc2UgaWYoSi5McCh0aGlzLmdyRigpKSE9bnVsbCl7ej1KLkxwKHRoaXMuZ3JGKCkpCi16PUouZmUoISFKLngoeikuJGlzdnk/ejpNLlNCKHopKX1lbHNlIHo9bnVsbAorej1KLnFiKCEhSi54KHopLiRpc3Z5P3o6TS5TQih6KSl9ZWxzZSB6PW51bGwKIHJldHVybiB6fSwKIEJ6OmZ1bmN0aW9uKGEsYil7dmFyIHoseQogej10aGlzLkNkCkBAIC0xODY0NCwxNSArMTg4OTcsMTUgQEAKIHRoaXMuQ2QudSgwLGEsYikKIHJldHVybiBifSwKICRpc3Z5OnRydWV9LAotREg6eworemU6ewogIl4iOiJhO2s4PixFQSxQbyJ9LAogdWc6ewotIl4iOiJwcTtyRixDZCxWdyIsCisiXiI6IlYyO3JGLENkLFZ3IiwKIGdyRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJGfSwKIG5SOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseAogaWYoSi54QyhiLCJzZWxlY3RlZGluZGV4IikpYj0ic2VsZWN0ZWRJbmRleCIKIHo9Si54KGIpCi1pZighei5uKGIsInNlbGVjdGVkSW5kZXgiKSYmIXoubihiLCJ2YWx1ZSIpKXJldHVybiBNLnBxLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKK2lmKCF6Lm4oYiwic2VsZWN0ZWRJbmRleCIpJiYhei5uKGIsInZhbHVlIikpcmV0dXJuIE0uVjIucHJvdG90eXBlLm5SLmNhbGwodGhpcyx0aGlzLGIsYyxkKQogSi5Wcyh0aGlzLnJGKS5SeigwLGIpCiBpZihkKXtNLnB3KHRoaXMuckYsYyxiKQogcmV0dXJufXo9dGhpcy5yRgpAQCAtMTg2NjIsMjMgKzE4OTE1LDIzIEBACiBNLnB3KHosSi5tdSh5LnZ0LHgpLGIpCiByZXR1cm4gdGhpcy5CeihiLHkpfX0sCiBEVDp7Ci0iXiI6InBxO1EyPyxuRixvczwseFUscTQ/LEJ4PyxNNT8sbGUsVloscTgsckYsQ2QsVnciLAorIl4iOiJWMjtDej8sbkYsb3M8LHhVLHE0PyxCeD8sTTU/LGxlLFZaLHE4LHJGLENkLFZ3IiwKIGdyRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJGfSwKIG5SOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6Ci1pZighSi54QyhiLCJyZWYiKSlyZXR1cm4gTS5wcS5wcm90b3R5cGUublIuY2FsbCh0aGlzLHRoaXMsYixjLGQpCitpZighSi54QyhiLCJyZWYiKSlyZXR1cm4gTS5WMi5wcm90b3R5cGUublIuY2FsbCh0aGlzLHRoaXMsYixjLGQpCiB6PWQ/YzpKLm11KGMsbmV3IE0ucGkodGhpcykpCiBKLlZzKHRoaXMuckYpLk1XLnNldEF0dHJpYnV0ZSgicmVmIix6KQogdGhpcy5hWCgpCiBpZihkKXJldHVybgogcmV0dXJuIHRoaXMuQnooInJlZiIsYyl9LAotQTU6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5vcworWlo6ZnVuY3Rpb24oYSl7dmFyIHo9dGhpcy5vcwogaWYoeiE9bnVsbCl6Lk5DKCkKIGlmKGEucWQ9PW51bGwmJmEuZnU9PW51bGwmJmEuY3c9PW51bGwpe3o9dGhpcy5vcwogaWYoeiE9bnVsbCl7ei54TygwKQogdGhpcy5vcz1udWxsfXJldHVybn16PXRoaXMub3MKIGlmKHo9PW51bGwpe3o9bmV3IE0uYVkodGhpcyxbXSxbXSxudWxsLCExLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsKQotdGhpcy5vcz16fXouZEUoYSx0aGlzLlEyKQotSi5aZygkLnBUKCksdGhpcy5yRixbInJlZiJdLCEwKQordGhpcy5vcz16fXouZEUoYSx0aGlzLkN6KQorSi5aVygkLmlrKCksdGhpcy5yRixbInJlZiJdLCEwKQogcmV0dXJuIHRoaXMub3N9LAogWks6ZnVuY3Rpb24oYSxiLGMpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrCiBpZihjPT1udWxsKWM9dGhpcy5uRgpAQCAtMTg2ODYsMTUgKzE4OTM5LDE1IEBACiBpZih6PT1udWxsKXt6PXRoaXMuZ05LKCkKIHo9Si5OUSghIUoueCh6KS4kaXN2eT96Ok0uU0IoeikpCiB0aGlzLnE4PXp9eT1KLlJFKHopCi1pZih5LmdQWih6KT09bnVsbClyZXR1cm4gJC5FNygpCi14PWM9PW51bGw/JC5IVCgpOmMKK2lmKHkuZ1BaKHopPT1udWxsKXJldHVybiAkLnpsKCkKK3g9Yz09bnVsbD8kLkRIKCk6Ywogdz14LmNKCiBpZih3PT1udWxsKXt3PUguVk0obmV3IFAucW8obnVsbCksW251bGxdKQogeC5jSj13fXY9dy50KDAseikKIGlmKHY9PW51bGwpe3Y9TS5kZyh6LHgpCiB4LmNKLnUoMCx6LHYpfXc9dGhpcy5sZQogaWYodz09bnVsbCl7dT1KLkRvKHRoaXMuckYpCi13PSQubXgoKQordz0kLnRGKCkKIHQ9dy50KDAsdSkKIGlmKHQ9PW51bGwpe3Q9dS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpCiAkLktzKCkudSgwLHQsITApCkBAIC0xODcwNyw3ICsxODk2MCw3IEBACiByLkNpPXRoaXMuckYKIHIuQzA9egogcS51KDAscyxyKQotcD1uZXcgTS5ESChiLG51bGwsbnVsbCkKK3A9bmV3IE0uemUoYixudWxsLG51bGwpCiBNLlNCKHMpLnNWdyhwKQogZm9yKG89eS5nUFooeiksej12IT1udWxsLG49MCxtPSExO28hPW51bGw7bz1vLm5leHRTaWJsaW5nLCsrbil7aWYoby5uZXh0U2libGluZz09bnVsbCltPSEwCiBsPXo/di5KVyhuKTpudWxsCkBAIC0xODcxOCw3ICsxODk3MSw3IEBACiByLkMwPW51bGwKIHIuQ2k9bnVsbAogcmV0dXJuIHN9LAotZ2s4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLlEyfSwKK2drODpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5Den0sCiBnRzU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubkZ9LAogc0c1OmZ1bmN0aW9uKGEsYil7dmFyIHoKIGlmKHRoaXMubkYhPW51bGwpdGhyb3cgSC5iKFAudygiVGVtcGxhdGUgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSBhIG5ldyBiaW5kaW5nRGVsZWdhdGUgY2FuIGJlIGFzc2lnbmVkIikpCkBAIC0xODczOSw3ICsxODk5Miw3IEBACiB0aGlzLm9zLklvKG51bGwpCiB0aGlzLm9zLnZyKG51bGwpfSwKIFYxOmZ1bmN0aW9uKGEpe3ZhciB6LHkKLXRoaXMuUTI9bnVsbAordGhpcy5Dej1udWxsCiB0aGlzLm5GPW51bGwKIHo9dGhpcy5DZAogaWYoeiE9bnVsbCl7eT16LlJ6KDAsInJlZiIpCkBAIC0xODc5NCw3ICsxOTA0Nyw3IEBACiByZXR1cm4hMH0sCiBHQzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ0KG51bGwpfSwKICRpc0RUOnRydWUsCi1zdGF0aWM6eyJeIjoibW4sRVcsWU8sdlUseFYsa1kiLFRBOmZ1bmN0aW9uKGEpe3ZhciB6LHkseCx3CitzdGF0aWM6eyJeIjoibW4sdjIsWU8sdlUseFYsam9LIixUQTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej1KLkRvKGEpCiBpZihXLlB2KHouZGVmYXVsdFZpZXcpPT1udWxsKXJldHVybiB6CiB5PSQuTFEoKS50KDAseikKQEAgLTE4ODA0LDcgKzE5MDU3LDcgQEAKIHo9Si5SRShhKQogeT16LmdNMChhKS5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIsbnVsbCkKIHouZ0J5KGEpLmluc2VydEJlZm9yZSh5LGEpCi1mb3IoeD16LmdRZyhhKSx4PUMuTm0uYnIoeC5ndmMoeCkpLHg9SC5WTShuZXcgSC5hNyh4LHgubGVuZ3RoLDAsbnVsbCksW0guS3AoeCwwKV0pO3guRygpOyl7dz14LmxvCitmb3IoeD16LmdRZyhhKSx4PUMuTm0uYnIoeC5ndmMoeCkpLHg9SC5WTShuZXcgSC5hNyh4LHgubGVuZ3RoLDAsbnVsbCksW0guT3EoeCwwKV0pO3guRygpOyl7dz14LmxvCiBzd2l0Y2godyl7Y2FzZSJ0ZW1wbGF0ZSI6dj16LmdRZyhhKS5NVwogdi5nZXRBdHRyaWJ1dGUodykKIHYucmVtb3ZlQXR0cmlidXRlKHcpCkBAIC0xODgzNSwyNiArMTkwODgsMjYgQEAKIEouTzUoeixkb2N1bWVudC5iYXNlVVJJKQogSi5tNShhKS5hcHBlbmRDaGlsZCh6KX19fSwKIHBpOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgej10aGlzLmEKIEouVnMoei5yRikuTVcuc2V0QXR0cmlidXRlKCJyZWYiLGEpCi16LmFYKCl9LCIkMSIsbnVsbCwyLDAsbnVsbCwyMTUsImNhbGwiXSwKK3ouYVgoKX0sIiQxIixudWxsLDIsMCxudWxsLDIxOSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiB5aTp7Ci0iXiI6IlRwOjIwOyIsCisiXiI6IlRwWjoyMDsiLAogJDE6ZnVuY3Rpb24oYSl7aWYoIU0uU0IoYSkuYnQobnVsbCkpTS5HTShKLk5RKCEhSi54KGEpLiRpc3Z5P2E6TS5TQihhKSkpfSwKICRpc0VIOnRydWV9LAotTWRROnsKLSJeIjoiVHA6MTM7IiwKLSQxOltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKGEpKyJbdGVtcGxhdGVdIn0sIiQxIixudWxsLDIsMCxudWxsLDEzMCwiY2FsbCJdLAotJGlzRUg6dHJ1ZX0sCi1ET2U6ewotIl4iOiJUcDo3OTsiLAotJDI6W2Z1bmN0aW9uKGEsYil7dmFyIHoKLWZvcih6PUoubVkoYSk7ei5HKCk7KU0uU0IoSi5sMih6LmdsKCkpKS5hWCgpfSwiJDIiLG51bGwsNCwwLG51bGwsMTcxLDE0LCJjYWxsIl0sCitZSkc6eworIl4iOiJUcFo6MTM7IiwKKyQxOltmdW5jdGlvbihhKXtyZXR1cm4gSC5kKGEpKyJbdGVtcGxhdGVdIn0sIiQxIixudWxsLDIsMCxudWxsLDEzMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBsUGE6ewotIl4iOiJUcDo3MTsiLAorIl4iOiJUcFo6ODA7IiwKKyQyOltmdW5jdGlvbihhLGIpe3ZhciB6Citmb3Ioej1KLm1ZKGEpO3ouRygpOylNLlNCKEoubDIoei5nbCgpKSkuYVgoKX0sIiQyIixudWxsLDQsMCxudWxsLDE3MywxNCwiY2FsbCJdLAorJGlzRUg6dHJ1ZX0sCitVZmE6eworIl4iOiJUcFo6NzI7IiwKICQwOmZ1bmN0aW9uKCl7dmFyIHo9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCiAkLnZIKCkudSgwLHosbmV3IE0uRmkoW10sbnVsbCxudWxsLG51bGwpKQogcmV0dXJuIHp9LApAQCAtMTg4NjIsMTEgKzE5MTE1LDExIEBACiBGaTp7CiAiXiI6ImE7dTI8LFFvPCxDaTwsQzA8In0sCiBoZzp7Ci0iXiI6IlRwOjEzO2EsYixjIiwKKyJeIjoiVHBaOjEzO2EsYixjIiwKICQxOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmMuVVMoYSx0aGlzLmEsdGhpcy5iKX0sCiAkaXNFSDp0cnVlfSwKIFVrOnsKLSJeIjoiVHA6Nzk7YSxiLGMsZCIsCisiXiI6IlRwWjo4MDthLGIsYyxkIiwKICQyOmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcKIGZvcig7ej1KLlU2KGEpLEoueEMoei50KGEsMCksIl8iKTspYT16LnluKGEsMSkKIGlmKHRoaXMuZCl6PXoubihhLCJiaW5kIil8fHoubihhLCJpZiIpfHx6Lm4oYSwicmVwZWF0IikKQEAgLTE4ODgyLDcgKzE5MTM1LDcgQEAKIHoucHVzaCh5KX19LAogJGlzRUg6dHJ1ZX0sCiBhWTp7Ci0iXiI6IllqO1lTLFJqLHZ5LFM2LGt5LHZMLHdDLEQyLGNNLHFlLHVyLFZDLFd2LGVZLFRDIiwKKyJeIjoiWWo7WVMsUmosdnksUzYsa3ksdkwsd0MsRDIsdHMscWUsdXIsVkMsV3YsZVksVEMiLAogUlY6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZVkuJDEoYSl9LAogVFI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSC52aChQLncoImJpbmRpbmcgYWxyZWFkeSBvcGVuZWQiKSl9LAogZ1A6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMud0N9LApAQCAtMTg5MDAsMTIgKzE5MTUzLDEyIEBACiB5PWEucWQKIHg9eSE9bnVsbAogdGhpcy5EMj14Ci10aGlzLmNNPWEuY3chPW51bGwKK3RoaXMudHM9YS5jdyE9bnVsbAogaWYoeCl7dGhpcy5xZT15LndECiB5PU0ub08oImlmIix5LHosYikKIHRoaXMudkw9eQogaWYodGhpcy5xZT09PSEwKXtpZighKG51bGwhPXkmJiExIT09eSkpe3RoaXMudnIobnVsbCkKLXJldHVybn19ZWxzZSBILkdvKHksIiRpc1lqIikuVFIoMCx0aGlzLmdOdCgpKX1pZih0aGlzLmNNPT09ITApe3k9YS5jdworcmV0dXJufX1lbHNlIEguR28oeSwiJGlzWWoiKS5UUigwLHRoaXMuZ050KCkpfWlmKHRoaXMudHM9PT0hMCl7eT1hLmN3CiB0aGlzLnVyPXkud0QKIHk9TS5vTygicmVwZWF0Iix5LHosYikKIHRoaXMud0M9eX1lbHNle3k9YS5mdQpAQCAtMTg5MTksNyArMTkxNzIsNyBAQAogej16LmdQKHopfWlmKCEobnVsbCE9eiYmITEhPT16KSl7dGhpcy5JbyhbXSkKIHJldHVybn19eT10aGlzLndDCiBpZih0aGlzLnVyIT09ITApe0guR28oeSwiJGlzWWoiKQoteT15LmdQKHkpfXRoaXMuSW8odGhpcy5jTSE9PSEwP1t5XTp5KX0sIiQxIiwiZ050IiwyLDAsMjAsMTRdLAoreT15LmdQKHkpfXRoaXMuSW8odGhpcy50cyE9PSEwP1t5XTp5KX0sIiQxIiwiZ050IiwyLDAsMjAsMTRdLAogSW86ZnVuY3Rpb24oYSl7dmFyIHoseQogej1KLngoYSkKIGlmKCF6LiRpc1dPKWE9ISF6LiRpc1FWP3ouYnIoYSk6W10KQEAgLTE4OTI3LDEwICsxOTE4MCwxMCBAQAogaWYoYT09PXopcmV0dXJuCiB0aGlzLktlKCkKIHRoaXMuUzY9YQotaWYoISFKLngoYSkuJGlzd24mJnRoaXMuY009PT0hMCYmdGhpcy51ciE9PSEwKXtpZihhLmdiMygpIT1udWxsKWEuc2IzKFtdKQoraWYoISFKLngoYSkuJGlzd24mJnRoaXMudHM9PT0hMCYmdGhpcy51ciE9PSEwKXtpZihhLmdiMygpIT1udWxsKWEuc2IzKFtdKQogdGhpcy5WQz1hLmdRVigpLnlJKHRoaXMuZ1UwKCkpfXk9dGhpcy5TNgogeT15IT1udWxsP3k6W10KLXRoaXMuVmkoRy5qaih5LDAsSi5xOCh5KSx6LDAsei5sZW5ndGgpKX0sCit0aGlzLmx3KEcuamooeSwwLEoucTgoeSkseiwwLHoubGVuZ3RoKSl9LAogeFM6ZnVuY3Rpb24oYSl7dmFyIHoseSx4LHcKIGlmKEoueEMoYSwtMSkpcmV0dXJuIHRoaXMuWVMuckYKIHo9JC52SCgpCkBAIC0xODk0Myw3ICsxOTE5Niw3IEBACiBpZih3PT1udWxsKXJldHVybiB4CiByZXR1cm4gdy54Uyh3LlJqLmxlbmd0aC0xKX0sCiBuZTpmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdAotej10aGlzLnhTKEouYkkoYSwxKSkKK3o9dGhpcy54UyhKLkhuKGEsMSkpCiB5PXRoaXMueFMoYSkKIEouVG1CKHRoaXMuWVMuckYpCiB4PUMuTm0uVzQodGhpcy5SaixhKQpAQCAtMTg5NTIsNyArMTkyMDUsNyBAQAogdD11LnBhcmVudE5vZGUKIGlmKHQhPW51bGwpdC5yZW1vdmVDaGlsZCh1KQogdy5teCh4LHUpfXJldHVybiB4fSwKLVZpOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzLHIscSxwLG8sbixtLGwsayxqLGksaCxnLGYsZQorbHc6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseCx3LHYsdSx0LHMscixxLHAsbyxuLG0sbCxrLGosaSxoLGcsZixlCiBpZih0aGlzLmt5fHxKLkZOKGEpPT09ITApcmV0dXJuCiB1PXRoaXMuWVMKIHQ9dS5yRgpAQCAtMTg5NjcsMTQgKzE5MjIwLDE0IEBACiBmb3IocD1KLncxKGEpLG89cC5nQShhKSxuPTA7by5HKCk7KXttPW8uZ2woKQogZm9yKGw9bS5nUnQoKSxsPWwuZ0EobCksaz1KLlJFKG0pO2wuRygpOyl7aj1sLmxvCiBpPXRoaXMubmUoSi5ldyhrLmd2SChtKSxuKSkKLWlmKCFKLnhDKGksJC5FNygpKSlxLnUoMCxqLGkpfWw9bS5nTmcoKQoraWYoIUoueEMoaSwkLnpsKCkpKXEudSgwLGosaSl9bD1tLmdOZygpCiBpZih0eXBlb2YgbCE9PSJudW1iZXIiKXJldHVybiBILnMobCkKIG4tPWx9Zm9yKHA9cC5nQShhKTtwLkcoKTspe209cC5nbCgpCiBmb3Iobz1KLlJFKG0pLGg9by5ndkgobSk7Si51NihoLEouZXcoby5ndkgobSksbS5nTmcoKSkpOysraCl7aWYoaD4+PjAhPT1ofHxoPj1zLmxlbmd0aClyZXR1cm4gSC5lKHMsaCkKIHk9c1toXQogeD1xLlJ6KDAseSkKIGlmKHg9PW51bGwpdHJ5e2lmKHRoaXMuZVkhPW51bGwpeT10aGlzLlJWKHkpCi1pZih5PT1udWxsKXg9JC5FNygpCitpZih5PT1udWxsKXg9JC56bCgpCiBlbHNlIHg9dS5aSygwLHkseil9Y2F0Y2goZyl7bD1ILlJ1KGcpCiB3PWwKIHY9bmV3IEguWE8oZyxudWxsKQpAQCAtMTg5ODUsMTkgKzE5MjM4LDE5IEBACiBpZihrPT1udWxsKUgudmgoUC51KCJFcnJvciBtdXN0IG5vdCBiZSBudWxsIikpCiBpZihsLkd2IT09MClILnZoKFAudygiRnV0dXJlIGFscmVhZHkgY29tcGxldGVkIikpCiBsLkNHKGssdikKLXg9JC5FNygpfWw9eAoreD0kLnpsKCl9bD14CiBmPXRoaXMueFMoaC0xKQogZT1KLlRtQih1LnJGKQogQy5ObS54ZSh0aGlzLlJqLGgsbCkKLWUuaW5zZXJ0QmVmb3JlKGwsSi5wNyhmKSl9fWZvcih1PXEuZ1VRKHEpLHU9SC5WTShuZXcgSC5NSChudWxsLEoubVkodS5sNiksdS5UNiksW0guS3AodSwwKSxILktwKHUsMSldKTt1LkcoKTspdGhpcy5FcCh1LmxvKX0sIiQxIiwiZ1UwIiwyLDAsMjE2LDIxN10sCitlLmluc2VydEJlZm9yZShsLEoucDcoZikpfX1mb3IodT1xLmdVUShxKSx1PUguVk0obmV3IEguTUgobnVsbCxKLm1ZKHUubDYpLHUuVDYpLFtILk9xKHUsMCksSC5PcSh1LDEpXSk7dS5HKCk7KXRoaXMuRXAodS5sbyl9LCIkMSIsImdVMCIsMiwwLDIyMCwyMjFdLAogRXA6W2Z1bmN0aW9uKGEpe3ZhciB6LHkseAogej0kLnZIKCkKIHoudG9TdHJpbmcKIHk9SC5vZihhLCJleHBhbmRvJHZhbHVlcyIpCiB4PSh5PT1udWxsP251bGw6SC5vZih5LHouSjQoKSkpLmd1MigpCiB6PW5ldyBILmE3KHgseC5sZW5ndGgsMCxudWxsKQotei4kYnVpbHRpblR5cGVJbmZvPVtILktwKHgsMCldCi1mb3IoO3ouRygpOylKLnlkKHoubG8pfSwiJDEiLCJnTVIiLDIsMCwyMThdLAorei4kYnVpbHRpblR5cGVJbmZvPVtILk9xKHgsMCldCitmb3IoO3ouRygpOylKLnlkKHoubG8pfSwiJDEiLCJnTVIiLDIsMCwyMjJdLAogS2U6ZnVuY3Rpb24oKXt2YXIgej10aGlzLlZDCiBpZih6PT1udWxsKXJldHVybgogei5lZCgpCkBAIC0xOTAyMywxMCArMTkyNzYsMTAgQEAKIHV4OltmdW5jdGlvbihhKXt2YXIgej1hPT1udWxsPyIiOkguZChhKQogSi50Myh0aGlzLnJGLHopfSwiJDEiLCJnbXQiLDIsMCwxMywyMV19LAogVlQ6ewotIl4iOiJwcTtyRixDZCxWdyIsCisiXiI6IlYyO3JGLENkLFZ3IiwKIGdyRjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJGfSwKIG5SOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseAotaWYoIUoueEMoYiwidmFsdWUiKSlyZXR1cm4gTS5wcS5wcm90b3R5cGUublIuY2FsbCh0aGlzLHRoaXMsYixjLGQpCitpZighSi54QyhiLCJ2YWx1ZSIpKXJldHVybiBNLlYyLnByb3RvdHlwZS5uUi5jYWxsKHRoaXMsdGhpcyxiLGMsZCkKIEouVnModGhpcy5yRikuUnooMCxiKQogaWYoZCl7TS5wdyh0aGlzLnJGLGMsYikKIHJldHVybn16PXRoaXMuckYKQEAgLTE5MDM2LDcgKzE5Mjg5LDcgQEAKIE0ucHcoeixKLm11KHkudnQseCksYikKIHJldHVybiAkLnJLP3RoaXMuQnooYix5KTp5fX19XSxbInRlbXBsYXRlX2JpbmRpbmcuc3JjLm11c3RhY2hlX3Rva2VucyIsInBhY2thZ2U6dGVtcGxhdGVfYmluZGluZy9zcmMvbXVzdGFjaGVfdG9rZW5zLmRhcnQiLCxTLHsKICJeIjoiIiwKLWFiOnsKK2piOnsKICJeIjoiYTtpQix3RDwsVVYiLAogZ3F6OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaUIubGVuZ3RoPT09NX0sCiBnYVc6ZnVuY3Rpb24oKXt2YXIgeix5CkBAIC0xOTA0OSw3ICsxOTMwMiw3IEBACiBnRU86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5VVn0sCiBxbTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nRU8oKS4kMShhKX0sCiBnQjpmdW5jdGlvbihhKXtyZXR1cm4gQy5qbi5jVSh0aGlzLmlCLmxlbmd0aCw0KX0sCi1BWDpmdW5jdGlvbihhKXt2YXIgeix5CitsODpmdW5jdGlvbihhKXt2YXIgeix5CiB6PXRoaXMuaUIKIHk9YSo0KzEKIGlmKHk+PXoubGVuZ3RoKXJldHVybiBILmUoeix5KQpAQCAtMTkwNzIsNyArMTkzMjUsNyBAQAogeD16Lmxlbmd0aAogdz1DLmpuLmNVKHgsNCkqNAogaWYodz49eClyZXR1cm4gSC5lKHosdykKLXJldHVybiB5K0guZCh6W3ddKX0sIiQxIiwiZ2ViIiwyLDAsMjE5LDIxXSwKK3JldHVybiB5K0guZCh6W3ddKX0sIiQxIiwiZ2ViIiwyLDAsMjIzLDIxXSwKIFhiOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdyx2LHUsdCxzCiB6PXRoaXMuaUIKIGlmKDA+PXoubGVuZ3RoKXJldHVybiBILmUoeiwwKQpAQCAtMTkwODMsNyArMTkzMzYsNyBAQAogdD12KjQKIGlmKHQ+PXoubGVuZ3RoKXJldHVybiBILmUoeix0KQogcz16W3RdCi15LnZNKz10eXBlb2Ygcz09PSJzdHJpbmciP3M6SC5kKHMpfXJldHVybiB5LnZNfSwiJDEiLCJncXQiLDIsMCwyMjAsMjIxXSwKK3kudk0rPXR5cGVvZiBzPT09InN0cmluZyI/czpILmQocyl9cmV0dXJuIHkudk19LCIkMSIsImdxdCIsMiwwLDIyNCwyMjVdLAogbDM6ZnVuY3Rpb24oYSxiKXt0aGlzLlVWPXRoaXMuaUIubGVuZ3RoPT09NT90aGlzLmdlYigpOnRoaXMuZ3F0KCl9LAogc3RhdGljOnsiXiI6InJ6NSx4TjgsdDNhLGVwRyxvTSxGdGciLGo5OmZ1bmN0aW9uKGEsYil7dmFyIHoseSx4LHcsdix1LHQscyxyLHEscCxvLG4sbQogaWYoYT09bnVsbHx8YS5sZW5ndGg9PT0wKXJldHVybgpAQCAtMTkxMDgsMTggKzE5MzYxLDE4IEBACiBlbHNlIHcucHVzaChudWxsKQogdy5wdXNoKG0pCiB2PW8rMn1pZih2PT09eil3LnB1c2goIiIpCi15PW5ldyBTLmFiKHcsdSxudWxsKQoreT1uZXcgUy5qYih3LHUsbnVsbCkKIHkubDModyx1KQogcmV0dXJuIHl9fX19XSxbInZtX2Nvbm5lY3RfZWxlbWVudCIsInBhY2thZ2U6b2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3ZtX2Nvbm5lY3QuZGFydCIsLFYsewogIl4iOiIiLAogUGE6ewotIl4iOiJWNTI7UDUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJWNTI7UDUsQVAsZm4sdEIsa1IsQVAsZm4sQVAsZm4sSVgscTksQ2MsVWssb3EsV3oscTEsU0Qsb0csWk0sWlEiLAogZ046ZnVuY3Rpb24oYSl7cmV0dXJuIGEuUDV9LAogc046ZnVuY3Rpb24oYSxiKXthLlA1PXRoaXMuY3QoYSxDLmZ0LGEuUDUsYil9LAogZ2hTOmZ1bmN0aW9uKGEpe3ZhciB6PWEuUDUKIGlmKHo9PW51bGwpcmV0dXJuITEKIHJldHVybiB6LmdBOSgpfSwKLWduSTpmdW5jdGlvbihhKXt2YXIgej0kLm1mLkVoCitnbkk6ZnVuY3Rpb24oYSl7dmFyIHo9JC5LaC5FaAogaWYoej09bnVsbClyZXR1cm4hMQogcmV0dXJuIEoueEMoSC5Hbyh6LCIkaXNLTSIpLk4sYS5QNSl9LAogeFg6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3CkBAIC0xOTEyOCwzOSArMTkzODEsMzkgQEAKIGlmKHR5cGVvZiB5IT09Im51bWJlciIpcmV0dXJuIHkuRCgpCiBpZih5PjB8fHouZ05sKGIpPT09ITB8fHouZ0VYKGIpPT09ITB8fHouZ3F4KGIpPT09ITB8fHouZ1lLKGIpPT09ITApcmV0dXJuCiB6LmU2KGIpCi14PSQubWYuRWgKLWlmKHg9PW51bGx8fCFKLnhDKEoubDIoeCksYS5QNSkpe3o9JC5tZgoreD0kLktoLkVoCitpZih4PT1udWxsfHwhSi54QyhKLmwyKHgpLGEuUDUpKXt6PSQuS2gKIHk9YS5QNQogeT1uZXcgVS5LTShILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLHksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxVLlUyKSwwLG51bGwsInVua25vd24iLCJ1bmtub3duIiwwLCExLCExLCIiLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYWYpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmJ2KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogeS5MdygpCiB6LnN3digwLHkpfXc9Si5WcyhkKS5NVy5nZXRBdHRyaWJ1dGUoImhyZWYiKQotJC5tZi5aNi5ibygwLHcpfSwiJDMiLCJna0QiLDYsMCwxNjEsMiwxMDIsMTc0XSwKKyQuS2guWjYuYm8oMCx3KX0sIiQzIiwiZ2tEIiw2LDAsMTYzLDIsMTAzLDE3Nl0sCiBNZUI6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseCx3Ci16PSQubWYubTIKK3o9JC5LaC5tMgogeT1hLlA1CiB4PXoualkKIHguUnooMCx5KQogei5YVCgpCiB6LlhUKCkKIHc9ei53dS5JVSsiLmhpc3RvcnkiCi0kLlZ5KCkuc2V0SXRlbSh3LEMueHIuS1AoeCkpfSwiJDMiLCJnQVMiLDYsMCwxNjEsMiwxMDIsMTc0XSwKKyQuVnkoKS5zZXRJdGVtKHcsQy54ci5LUCh4KSl9LCIkMyIsImdBUyIsNiwwLDE2MywyLDEwMywxNzZdLAogc3RhdGljOntmWHg6ZnVuY3Rpb24oYSl7dmFyIHoseQogej1QLkw1KG51bGwsbnVsbCxudWxsLFAucVUsVy5JMCkKIHk9UC5xVQogeT1ILlZNKG5ldyBWLnFDKFAuWU0obnVsbCxudWxsLG51bGwseSxudWxsKSxudWxsLG51bGwpLFt5LG51bGxdKQotYS5TYT1bXQorYS5DYz1bXQogYS5xMT0hMQotYS5YTj0hMQotYS5YeT16CithLm9HPSExCithLlpNPXoKIGEuWlE9eQotQy5aYS5aTChhKQotQy5aYS5YSShhKQorQy5KNTcuWkwoYSkKK0MuSjU3LlhJKGEpCiByZXR1cm4gYX19fSwKIFY1Mjp7CiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIEQyOnsKLSJeIjoiVjUzO290LFlFLGxyLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjUzO290LFlFLGxyLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd2bTpmdW5jdGlvbihhKXtyZXR1cm4gYS5vdH0sCiBzdm06ZnVuY3Rpb24oYSxiKXthLm90PXRoaXMuY3QoYSxDLnVYLGEub3QsYil9LAogZ0hMOmZ1bmN0aW9uKGEpe3JldHVybiBhLllFfSwKQEAgLTE5MTczLDE3ICsxOTQyNiwxNyBAQAogbnk6W2Z1bmN0aW9uKGEsYixjLGQpe3ZhciB6LHkseAogSi5LcihiKQogej10aGlzLktsKGEsYS5vdCkKLWQ9JC5tZi5tMi5UUCh6KQoteT0kLm1mCitkPSQuS2gubTIuVFAoeikKK3k9JC5LaAogeD1uZXcgVS5LTShILlZNKG5ldyBQLlpmKFAuRHQobnVsbCkpLFtudWxsXSksSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pLGQsUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFUuVTIpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxVLlUyKSwwLG51bGwsInVua25vd24iLCJ1bmtub3duIiwwLCExLCExLCIiLG51bGwsUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5iSyhudWxsLG51bGwsITEsbnVsbCksUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEQuYWYpLFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxELmJ2KSxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsITEsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsKQogeC5MdygpCiB5LnN3digwLHgpCi0kLm1mLlo2LmJvKDAsIiMvdm0iKX0sIiQzIiwiZ010Iiw2LDAsMTExLDEsMTAyLDEwM10sCiskLktoLlo2LmJvKDAsIiMvdm0iKX0sIiQzIiwiZ010Iiw2LDAsMTEyLDEsMTAzLDEwNF0sCiBxZjpbZnVuY3Rpb24oYSxiLGMsZCl7Si5LcihiKQotdGhpcy5WZihhKX0sIiQzIiwiZ3pHIiw2LDAsMTExLDEsMTAyLDEwM10sCit0aGlzLlZmKGEpfSwiJDMiLCJnekciLDYsMCwxMTIsMSwxMDMsMTA0XSwKIFZmOmZ1bmN0aW9uKGEpe0cuRkkoYS5ZRSkubWwobmV3IFYuVm4oYSkpLk9BKG5ldyBWLm9VKGEpKX0sCiBLcTpmdW5jdGlvbihhKXt2YXIgej1QLmlpKDAsMCwwLDAsMCwxKQotYS5kaT10aGlzLmN0KGEsQy5POSxhLmRpLHopfSwKK2EudEI9dGhpcy5jdChhLEMuTzksYS50Qix6KX0sCiBzdGF0aWM6e05JOmZ1bmN0aW9uKGEpe3ZhciB6LHkseAogej1RLmNoKG51bGwsVS5aNSkKIHk9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCkBAIC0xOTE5MiwxMCArMTk0NDUsMTAgQEAKIGEub3Q9IiIKIGEuWUU9ImxvY2FsaG9zdDo5MjIyIgogYS5scj16Ci1hLlNhPVtdCithLkNjPVtdCiBhLnExPSExCi1hLlhOPSExCi1hLlh5PXkKK2Eub0c9ITEKK2EuWk09eQogYS5aUT14CiBDLmhqLlpMKGEpCiBDLmhqLlhJKGEpCkBAIC0xOTIwNSw3ICsxOTQ1OCw3IEBACiAiXiI6InVMK1BpOyIsCiAkaXNkMzp0cnVlfSwKIFZuOnsKLSJeIjoiVHA6MTM7YSIsCisiXiI6IlRwWjoxMzthIiwKICQxOltmdW5jdGlvbihhKXt2YXIgeix5LHgsdwogej10aGlzLmEKIEouWjgoei5scikKQEAgLTE5MjE2LDQ0ICsxOTQ2OSw0NCBAQAogaWYodHlwZW9mIHchPT0ibnVtYmVyIilyZXR1cm4gSC5zKHcpCiBpZighKHg8dykpYnJlYWsKIGMkMDp7aWYoeS50KGEseCkuZ3c4KCk9PW51bGwpYnJlYWsgYyQwCi1KLmJpKHoubHIseS50KGEseCkpfSsreH19LCIkMSIsbnVsbCwyLDAsbnVsbCwyMjIsImNhbGwiXSwKK0ouYmkoei5scix5LnQoYSx4KSl9Kyt4fX0sIiQxIixudWxsLDIsMCxudWxsLDIyNiwiY2FsbCJdLAogJGlzRUg6dHJ1ZX0sCiBvVTp7Ci0iXiI6IlRwOjEzO2IiLAorIl4iOiJUcFo6MTM7YiIsCiAkMTpbZnVuY3Rpb24oYSl7Si5aOCh0aGlzLmIubHIpfSwiJDEiLG51bGwsMiwwLG51bGwsMSwiY2FsbCJdLAogJGlzRUg6dHJ1ZX19XSxbInZtX3JlZl9lbGVtZW50IiwicGFja2FnZTpvYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvdm1fcmVmLmRhcnQiLCxYLHsKICJeIjoiIiwKIEk1OnsKLSJeIjoieEk7dFksUGUsQVAsZm4sZGksbzEsQVAsZm4sQVAsZm4sSVgscTksU2EsVWssb3EsV3oscTEsU0QsWE4sWHksWlEiLAorIl4iOiJ4STt0WSxQZSxBUCxmbix0QixrUixBUCxmbixBUCxmbixJWCxxOSxDYyxVayxvcSxXeixxMSxTRCxvRyxaTSxaUSIsCiBzdGF0aWM6e3ZDOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKIGEuUGU9ITEKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMudkEuWkwoYSkKIEMudkEuWEkoYSkKIHJldHVybiBhfX19fV0sWyJ2bV92aWV3X2VsZW1lbnQiLCJwYWNrYWdlOm9ic2VydmF0b3J5L3NyYy9lbGVtZW50cy92bV92aWV3LmRhcnQiLCxVLHsKICJeIjoiIiwKIGVsOnsKLSJeIjoiVjU0O3VCLGxjLEFQLGZuLGRpLG8xLEFQLGZuLEFQLGZuLElYLHE5LFNhLFVrLG9xLFd6LHExLFNELFhOLFh5LFpRIiwKKyJeIjoiVjU0O3VCLGxjLEFQLGZuLHRCLGtSLEFQLGZuLEFQLGZuLElYLHE5LENjLFVrLG9xLFd6LHExLFNELG9HLFpNLFpRIiwKIGd3djpmdW5jdGlvbihhKXtyZXR1cm4gYS51Qn0sCiBzd3Y6ZnVuY3Rpb24oYSxiKXthLnVCPXRoaXMuY3QoYSxDLlJKLGEudUIsYil9LAogZ2tjOmZ1bmN0aW9uKGEpe3JldHVybiBhLmxjfSwKIHNrYzpmdW5jdGlvbihhLGIpe2EubGM9dGhpcy5jdChhLEMueWgsYS5sYyxiKX0sCi1wQTpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudUIpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OF0sCitTSzpbZnVuY3Rpb24oYSxiKXtKLmNJKGEudUIpLllNKGIpfSwiJDEiLCJndkMiLDIsMCwyMCw5OV0sCiBzdGF0aWM6e29IOmZ1bmN0aW9uKGEpe3ZhciB6LHkKIHo9UC5MNShudWxsLG51bGwsbnVsbCxQLnFVLFcuSTApCiB5PVAucVUKIHk9SC5WTShuZXcgVi5xQyhQLllNKG51bGwsbnVsbCxudWxsLHksbnVsbCksbnVsbCxudWxsKSxbeSxudWxsXSkKLWEuU2E9W10KK2EuQ2M9W10KIGEucTE9ITEKLWEuWE49ITEKLWEuWHk9egorYS5vRz0hMQorYS5aTT16CiBhLlpRPXkKIEMuZG0uWkwoYSkKIEMuZG0uWEkoYSkKQEAgLTE5MzIyLDE2ICsxOTU3NSwxNiBAQAogVS56WC4kaXN6WD10cnVlCiBVLnpYLiRpc0lwPXRydWUKIFUuelguJGlzYT10cnVlCi1VLng5LiRpc0lwPXRydWUKLVUueDkuJGlzYT10cnVlCitVLnJYLiRpc0lwPXRydWUKK1UuclguJGlzYT10cnVlCiBVLkVPLiRpc0VPPXRydWUKIFUuRU8uJGlzSXA9dHJ1ZQogVS5FTy4kaXNhPXRydWUKLVAuR0QuJGlzR0Q9dHJ1ZQotUC5HRC4kaXNhPXRydWUKK1AuSU4uJGlzSU49dHJ1ZQorUC5JTi4kaXNhPXRydWUKIFAudXEuJGlzdXE9dHJ1ZQogUC51cS4kaXNhPXRydWUKLU4uUncuJGlzYT10cnVlCitOLlRKLiRpc2E9dHJ1ZQogVC55ai4kaXN5aj10cnVlCiBULnlqLiRpc2E9dHJ1ZQogVy50Vi4kaXNoND10cnVlCkBAIC0xOTM1NSw2ICsxOTYwOCw4IEBACiBELnZPLiRpc1owPXRydWUKIEQudk8uJGFzWjA9W251bGwsbnVsbF0KIEQudk8uJGlzYT10cnVlCitELktwLiRpc2FmPXRydWUKK0QuS3AuJGlzYT10cnVlCiBELlE0LiRpc2E9dHJ1ZQogRC5EYi4kaXNhPXRydWUKIEQuVTQuJGlzYWY9dHJ1ZQpAQCAtMTkzNzksOCArMTk2MzQsOCBAQAogUC5hMi4kaXNhMj10cnVlCiBQLmEyLiRpc2E9dHJ1ZQogVy5mSi4kaXNhPXRydWUKLVcua2YuJGlzZWE9dHJ1ZQotVy5rZi4kaXNhPXRydWUKK1cuZXc3LiRpc2VhPXRydWUKK1cuZXc3LiRpc2E9dHJ1ZQogRy5ZMi4kaXNZMj10cnVlCiBHLlkyLiRpc2E9dHJ1ZQogRC5reC4kaXNreD10cnVlCkBAIC0xOTM5MiwxMyArMTk2NDcsMTMgQEAKIFcuQWpZLiRpc0FqWT10cnVlCiBXLkFqWS4kaXNlYT10cnVlCiBXLkFqWS4kaXNhPXRydWUKLUcudUcuJGlzYT10cnVlCitHLk9TLiRpc2E9dHJ1ZQogRC5Nay4kaXNhZj10cnVlCiBELk1rLiRpc2E9dHJ1ZQogVy5mNS4kaXNmNT10cnVlCiBXLmY1LiRpc2VhPXRydWUKIFcuZjUuJGlzYT10cnVlCi1QLkFFLiRpc2E9dHJ1ZQorUC5BNS4kaXNhPXRydWUKIFcuUEcuJGlzZWE9dHJ1ZQogVy5QRy4kaXNhPXRydWUKIEwuVHYuJGlzVHY9dHJ1ZQpAQCAtMTk0MDksMTMgKzE5NjY0LDEzIEBACiBILnlvLiRpc2E9dHJ1ZQogSC5JWS4kaXNhPXRydWUKIEguYVguJGlzYT10cnVlCi1XLkkwLiRpc0FqPXRydWUKK1cuSTAuJGlzaHN3PXRydWUKIFcuSTAuJGlzS1Y9dHJ1ZQogVy5JMC4kaXNhPXRydWUKIFAud1MuJGlzd1M9dHJ1ZQogUC53Uy4kaXNhPXRydWUKLVAuTU8uJGlzTU89dHJ1ZQotUC5NTy4kaXNhPXRydWUKK1AueVguJGlzeVg9dHJ1ZQorUC55WC4kaXNhPXRydWUKIFkucVMuJGlzYT10cnVlCiBVLklwLiRpc0lwPXRydWUKIFUuSXAuJGlzYT10cnVlCkBAIC0xOTQyOSwxNSArMTk2ODQsMTUgQEAKIFAuQnBQLiRpc2E9dHJ1ZQogUC5LQS4kaXNLQT10cnVlCiBQLktBLiRpc05PVD10cnVlCi1QLktBLiRpc01PPXRydWUKK1AuS0EuJGlzeVg9dHJ1ZQogUC5LQS4kaXNhPXRydWUKIFAuTFIuJGlzTFI9dHJ1ZQogUC5MUi4kaXNLQT10cnVlCiBQLkxSLiRpc05PVD10cnVlCi1QLkxSLiRpc01PPXRydWUKK1AuTFIuJGlzeVg9dHJ1ZQogUC5MUi4kaXNhPXRydWUKLVAucUsuJGlzcUs9dHJ1ZQotUC5xSy4kaXNhPXRydWUKK1AuZTR5LiRpc2U0eT10cnVlCitQLmU0eS4kaXNhPXRydWUKIFAuZGwuJGlzZGw9dHJ1ZQogUC5kbC4kaXNhPXRydWUKIFAuUnouJGlzUno9dHJ1ZQpAQCAtMTk0NTYsOCArMTk3MTEsOCBAQAogUC5iOC4kaXNhPXRydWUKIFAuTk9ULiRpc05PVD10cnVlCiBQLk5PVC4kaXNhPXRydWUKLVAuZkltLiRpc2ZJbT10cnVlCi1QLmZJbS4kaXNhPXRydWUKK1AudGkuJGlzdGk9dHJ1ZQorUC50aS4kaXNhPXRydWUKIFAuaVAuJGlzaVA9dHJ1ZQogUC5pUC4kaXNSej10cnVlCiBQLmlQLiRhc1J6PVtudWxsXQpAQCAtMTk0ODIsOSArMTk3MzcsOSBAQAogTC5BUi4kaXNBUj10cnVlCiBMLkFSLiRpc1lqPXRydWUKIEwuQVIuJGlzYT10cnVlCi1XLkFqLiRpc0FqPXRydWUKLVcuQWouJGlzS1Y9dHJ1ZQotVy5Bai4kaXNhPXRydWUKK1cuaHN3LiRpc2hzdz10cnVlCitXLmhzdy4kaXNLVj10cnVlCitXLmhzdy4kaXNhPXRydWUKIEouUWM9ZnVuY3Rpb24oYSl7aWYodHlwZW9mIGE9PSJudW1iZXIiKXJldHVybiBKLlAucHJvdG90eXBlCiBpZih0eXBlb2YgYT09InN0cmluZyIpcmV0dXJuIEouTy5wcm90b3R5cGUKIGlmKGE9PW51bGwpcmV0dXJuIGEKQEAgLTE5NTIxLDYgKzE5Nzc2LDcgQEAKIGlmKHR5cGVvZiBhIT0ib2JqZWN0IilyZXR1cm4gYQogaWYoYSBpbnN0YW5jZW9mIFAuYSlyZXR1cm4gYQogcmV0dXJuIEoubTAoYSl9CitKLkExPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2VUKGEsYil9CiBKLkE0PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2p4KGEsYil9CiBKLkE2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdHMyhhKX0KIEouQUY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0lpKGEpfQpAQCAtMTk1NjAsMTYgKzE5ODE2LDE2IEBACiBKLkVkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0ZLKGEsYil9CiBKLkVoPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuV2soYSxiKX0KIEouRWk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0koYSl9Ci1KLkVyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2ZZKGEsYil9CitKLkVyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd1NihhKX0KIEouRXc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2ttKGEpfQogSi5GOT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndm0oYSl9CiBKLkZOPWZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdsMChhKX0KIEouRlM9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkublIoYSxiLGMsZCl9CiBKLkZXPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUWMoYSkuaU0oYSxiKX0KK0ouRmQ9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLmFNKGEsYixjKX0KIEouR0g9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3lXKGEpfQogSi5HSj1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5ZOShhLGIsYyxkKX0KIEouR0w9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2ZOKGEpfQotSi5HVT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nengoYSl9CiBKLkdXPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWWShhKX0KIEouR1o9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zcGgoYSxiKX0KIEouR2w9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2h5KGEpfQpAQCAtMTk1NzksMjcgKzE5ODM1LDI5IEBACiBKLkhCPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd4VChhKX0KIEouSFA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0ZLKGEpfQogSi5IYT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouUkUoYSkuZWsoYSxiLGMpfQotSi5Ibj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN4VChhLGIpfQorSi5IaD1mdW5jdGlvbihhKXtyZXR1cm4gSi5XeChhKS55dShhKX0KK0ouSG49ZnVuY3Rpb24oYSxiKXtpZih0eXBlb2YgYT09Im51bWJlciImJnR5cGVvZiBiPT0ibnVtYmVyIilyZXR1cm4gYS1iCityZXR1cm4gSi5XeChhKS5XKGEsYil9CiBKLkkyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd3dihhKX0KIEouSU89ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1JIKGEpfQogSi5JUD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nU3MoYSl9CiBKLklSPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdZdChhKX0KIEouSVg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRXUoYSxiKX0KLUouSWE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS56VihhLGIpfQotSi5JdD1mdW5jdGlvbihhKXtyZXR1cm4gSi5XeChhKS55dShhKX0KK0ouSXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5GcihhLGIpfQogSi5Jej1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nZlkoYSl9CiBKLkowPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1IxKGEsYil9CiBKLko1PWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGE+PWIKIHJldHVybiBKLld4KGEpLkYoYSxiKX0KK0ouSjc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0N0KGEpfQogSi5KQT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouclkoYSkuaDgoYSxiLGMpfQogSi5KRz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSG4oYSl9CiBKLkpSPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdjSyhhKX0KIEouSlo9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zdDAoYSxiKX0KLUouSmI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zZHUoYSxiKX0KIEouSmo9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1dBKGEpfQogSi5Kaz1mdW5jdGlvbihhKXtyZXR1cm4gSi54KGEpLmdieChhKX0KK0ouSmw9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTUwoYSxiKX0KIEouSnA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2psKGEpfQotSi5Kcj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLklkKGEsYil9CitKLkpyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdHVihhKX0KIEouSzA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2Q0KGEpfQogSi5LMj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndE4oYSl9CiBKLktEPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuajMoYSxiKX0KQEAgLTE5NjA4LDkgKzE5ODY2LDcgQEAKIEouS2w9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0JQKGEpfQogSi5Lcj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5lNihhKX0KIEouS3k9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1JrKGEpfQotSi5Lej1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNuaShhLGIpfQogSi5MOT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNkVShhLGIpfQotSi5MQj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nWDAoYSl9CiBKLkxIPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuR1QoYSxiKX0KIEouTEw9ZnVuY3Rpb24oYSl7cmV0dXJuIEouV3goYSkuSEcoYSl9CiBKLkxNPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3pqKGEsYil9CkBAIC0xOTYyMiw3ICsxOTg3OCw3IEBACiBKLk1CPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd6RyhhKX0KIEouTUU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zVW8oYSxiKX0KIEouTUs9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5NZChhLGIpfQotSi5NUT1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5nclooYSl9CitKLk1PPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5aSyhhLGIsYyl9CiBKLk1VPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuRmMoYSxiKX0KIEouTVg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUGooYSxiKX0KIEouTWU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5hTihhLGIpfQpAQCAtMTk2MzgsMTAgKzE5ODk0LDkgQEAKIEouTk89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zb0UoYSxiKX0KIEouTlE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2piKGEpfQogSi5OVD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouVTYoYSkuZU0oYSxiLGMpfQotSi5OVj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLlJSKGEsYil9CitKLk5WPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0t3KGEsYil9CiBKLk5aPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1J1KGEsYil9CiBKLk5mPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3l3KGEsYil9Ci1KLk5oPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1NZKGEsYil9CiBKLk5qPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5yWShhKS5OaihhLGIsYyl9CiBKLk5vPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1IoYSxiKX0KIEouTnE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0djKGEpfQpAQCAtMTk2NTEsMTAgKzE5OTA2LDExIEBACiBKLk9CPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdmZyhhKX0KIEouT0U9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zZmcoYSxiKX0KIEouT1Q9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1hFKGEpfQotSi5PWT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSkQoYSl9CiBKLk9rPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdoVShhKX0KIEouUDI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zVTQoYSxiKX0KK0ouUDM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ29MKGEpfQogSi5QND1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVnIoYSl9CitKLlBCPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdCVihhKX0KIEouUE49ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zQ0koYSxiKX0KIEouUFA9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zbnYoYSxiKX0KIEouUFk9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ29OKGEpfQpAQCAtMTk2NzAsMTcgKzE5OTI2LDE2IEBACiBKLlFUPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkudlYoYSxiKX0KIEouUWE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ05OKGEpfQogSi5RZD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUm4oYSl9CitKLlFsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2R1KGEsYil9CiBKLlFyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2tjKGEsYil9CiBKLlF2PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1gwKGEsYil9CiBKLlF5PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc2hmKGEsYil9CiBKLlIxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLkZuKGEpfQogSi5SOD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNNVChhLGIpfQogSi5SQz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVEEoYSl9Ci1KLlJGPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuV08oYSxiKX0KIEouUlg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zamwoYSxiKX0KLUouUng9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRWwoYSxiKX0KK0ouUmc9ZnVuY3Rpb24oYSl7cmV0dXJuIEoueChhKS5nQVkoYSl9CiBKLlJ5PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdMVyhhKX0KLUouUzg9ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSkuZ0lyKGEpfQogSi5TRj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNJaShhLGIpfQogSi5TRz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nREkoYSl9CiBKLlNLPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLnhXKGEpfQpAQCAtMTk2ODksMTEgKzE5OTQ0LDEwIEBACiBKLlNmPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1hFKGEsYil9CiBKLlNqPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3ZDKGEsYil9CiBKLlNvPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuWDMoYSxiKX0KLUouU3o9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1V4KGEpfQogSi5UNT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN0VChhLGIpfQogSi5URz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5tQyhhKX0KIEouVE09ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ09kKGEpfQotSi5UUD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nVVEoYSl9CitKLlRQPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0dWKGEsYil9CiBKLlRZPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd2cChhKX0KIEouVFo9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTihhLGIpfQogSi5UZz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQ0koYSl9CkBAIC0xOTcwMiw2ICsxOTk1Niw4IEBACiBKLlRzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdmRyhhKX0KIEouVHg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zcGYoYSxiKX0KIEouVTg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0VRKGEpfQorSi5VOG89ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1VRKGEpfQorSi5VQT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUDIoYSl9CiBKLlVOPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuKGFeYik+Pj4wCiByZXR1cm4gSi5XeChhKS53KGEsYil9CiBKLlVQPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmduWihhKX0KQEAgLTE5NzEwLDE0ICsxOTk2NiwxNCBAQAogSi5VUz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nV3QoYSl9CiBKLlVUPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEUShhKX0KIEouVVU9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2pUKGEpfQorSi5VZj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nREQoYSl9CitKLlV2PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuV08oYSxiKX0KIEouVjE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5SeihhLGIpfQotSi5WMj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouUkUoYSkuRDkoYSxiLGMpfQogSi5WNT1mdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gSi5SRShhKS5ZYihhLGIsYyxkKX0KIEouVkw9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1IyKGEpfQogSi5WWj1mdW5jdGlvbihhLGIsYyxkLGUpe3JldHVybiBKLncxKGEpLllXKGEsYixjLGQsZSl9CiBKLlZmPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWRShhKX0KIEouVms9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLncxKGEpLnhlKGEsYixjKX0KLUouVmw9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2phKGEpfQogSi5WbT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUChhKX0KIEouVnI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5DMShhLGIpfQogSi5Wcz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUWcoYSl9CkBAIC0xOTczOCwxMCArMTk5OTQsOSBAQAogSi5YaT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ncjkoYSl9CiBKLllIPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdwTShhKX0KIEouWVE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1BMKGEpfQotSi5ZYj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouUkUoYSkuWksoYSxiLGMpfQorSi5ZZj1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5nSXIoYSl9CiBKLllxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdwaChhKX0KIEouWXo9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTWwoYSxiKX0KLUouWjI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZFEoYSl9CiBKLlo2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWNShhKX0KIEouWjg9ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSkuVjEoYSl9CiBKLlpGPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdBRihhKX0KQEAgLTE5NzQ5LDE5ICsyMDAwNCwyMCBAQAogSi5aST1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNJcyhhLGIpfQogSi5aTj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ncU4oYSl9CiBKLlpVPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1JZKGEsYil9CitKLlpXPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJFKGEpLk1TKGEsYixjLGQpfQogSi5aWj1mdW5jdGlvbihhLGIpe3JldHVybiBKLnJZKGEpLnluKGEsYil9Ci1KLlpnPWZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiBKLlJFKGEpLk1TKGEsYixjLGQpfQorSi5acT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nbHAoYSl9CiBKLlpzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdjWShhKX0KIEouWnY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3JzKGEpfQogSi5hMz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nQmsoYSl9CiBKLmFBPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd6WShhKX0KIEouYUI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3FsKGEpfQogSi5hVD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nb2QoYSl9CitKLmFXPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdKcChhKX0KK0ouYXU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTkcoYSxiKX0KIEouYXZEPWZ1bmN0aW9uKGEsYixjLGQsZSl7cmV0dXJuIEouUkUoYSkuZEYoYSxiLGMsZCxlKX0KIEouYXc9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTk4oYSxiKX0KIEouYkg9ZnVuY3Rpb24oYSxiLGMsZCl7cmV0dXJuIEouUkUoYSkuZWEoYSxiLGMsZCl9Ci1KLmJJPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGEtYgotcmV0dXJuIEouV3goYSkuVyhhLGIpfQogSi5iTD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5naFMoYSl9CiBKLmJOPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuR0UoYSxiKX0KIEouYmk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5oKGEsYil9CkBAIC0xOTc2OSwxMSArMjAwMjUsOSBAQAogSi5icj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5najgoYSl9CiBKLmJzPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLkpQKGEpfQogSi5idT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5neXcoYSl9Ci1KLmJ4PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmduOShhKX0KIEouY0c9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuS2koYSl9CiBKLmNJPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLlJFKGEpfQogSi5jTz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nangoYSl9Ci1KLmNSPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouV3goYSkuV1ooYSxiKX0KIEouY1U9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0hoKGEpfQogSi5jVj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNqVChhLGIpfQogSi5jaj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nTVQoYSl9CkBAIC0xOTc5NiwxNyArMjAwNTAsMTYgQEAKIEouZXQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5VNihhKS5rSihhLGIpfQogSi5ldz1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmdHlwZW9mIGI9PSJudW1iZXIiKXJldHVybiBhK2IKIHJldHVybiBKLlFjKGEpLmcoYSxiKX0KLUouZkE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0pwKGEpfQorSi5mRD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLklkKGEsYil9CiBKLmZSPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc01aKGEsYil9CiBKLmZVPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEWChhKX0KIEouZmE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRVEoYSxiKX0KIEouZmI9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zcWwoYSxiKX0KLUouZmU9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0NuKGEpfQogSi5mZj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouVTYoYSkuUGsoYSxiLGMpfQotSi5mdj1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNVeChhLGIpfQotSi5mdz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nRWwoYSl9CitKLmZpPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdYMChhKX0KIEouZng9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0c1KGEpfQogSi5meT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSUYoYSl9CitKLmg2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdNTChhKX0KIEouaDk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zV0EoYSxiKX0KIEouaFM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5zclooYSxiKX0KIEouaGg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5XeChhKS5ZKGEsYil9CkBAIC0xOTgyMCw3ICsyMDA3Myw3IEBACiBKLmlTPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdveChhKX0KIEouaWQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1IxKGEpfQogSi5paD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nYTUoYSl9Ci1KLmlvPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdCVihhKX0KK0ouaW89ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2phKGEpfQogSi5pcz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nWm0oYSl9CiBKLml2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdWMihhKX0KIEouaXg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ25JKGEpfQpAQCAtMTk4MzIsNiArMjAwODUsNyBAQAogSi5qZD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNuWihhLGIpfQogSi5qZj1mdW5jdGlvbihhLGIpe3JldHVybiBKLngoYSkuVChhLGIpfQogSi5qbD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSHQoYSl9CitKLmp4PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdpZShhKX0KIEouanpvPWZ1bmN0aW9uKGEpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIilyZXR1cm4tYQogcmV0dXJuIEouV3goYSkuSihhKX0KIEouazA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2laKGEpfQpAQCAtMTk4NDUsNyArMjAwOTksNyBAQAogSi5raT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ncUsoYSl9CiBKLmtsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuZXooYSxiKX0KIEoua3M9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0IxKGEpfQotSi5rdj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nbHAoYSl9CitKLmt2PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdEZihhKX0KIEoua3k9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBKLlJFKGEpLmRSKGEsYixjKX0KIEoubDI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ04oYSl9CiBKLmw3PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3Y4KGEsYil9CkBAIC0xOTg2OCw3ICsyMDEyMiw2IEBACiBKLm45PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdRcShhKX0KIEoubkE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zUEwoYSxiKX0KIEoubkM9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zQ2QoYSxiKX0KLUoubkU9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0RmKGEpfQogSi5uRTE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5vdShhLGIpfQogSi5uRz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndjgoYSl9CiBKLm5iPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd5WChhKX0KQEAgLTE5ODc3LDI1ICsyMDEzMCwyNyBAQAogSi5vRD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLmhQKGEsYil9CiBKLm9KPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc3JzKGEsYil9CiBKLm9OPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdqNChhKX0KLUoub1o9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0JpKGEpfQorSi5va1Y9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5SUihhLGIpfQogSi5vbj1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5ndFQoYSl9CiBKLm9wPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdENyhhKX0KIEoucDc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3VEKGEpfQogSi5wQT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNZdChhLGIpfQogSi5wQj1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLnNpdChhLGIpfQotSi5wUD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nREQoYSl9CitKLnBPPWZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdvcihhKX0KK0oucFA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0t3KGEpfQogSi5wVT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5naE4oYSl9Ci1KLnBkPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmduaShhKX0KIEoucG09ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3QwKGEpfQogSi5xMD1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN5RyhhLGIpfQogSi5xOD1mdW5jdGlvbihhKXtyZXR1cm4gSi5VNihhKS5nQihhKX0KIEoucUE9ZnVuY3Rpb24oYSl7cmV0dXJuIEoudzEoYSkuYnIoYSl9CiBKLnFEPWZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gSi5SRShhKS5hRChhLGIsYyl9CitKLnFiPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdtU0EoYSl9CiBKLnFkPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0l0KGEsYil9CiBKLnFsPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdhQihhKX0KLUoucXE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTkcoYSxiKX0KK0oucXE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZFEoYSl9CiBKLnIwPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdpNihhKX0KIEoucjQ9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkucGooYSl9CitKLnJBPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuTmsoYSxiKX0KIEoucmE9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0o2KGEpfQogSi5ycj1mdW5jdGlvbihhKXtyZXR1cm4gSi5yWShhKS5iUyhhKX0KIEoucnc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ01sKGEpfQpAQCAtMTk5MDYsMjQgKzIwMTYxLDI1IEBACiBKLnRIPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0h5KGEsYil9CiBKLnRPPWZ1bmN0aW9uKGEpe3JldHVybiBKLncxKGEpLkpkKGEpfQogSi50UT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnN3dihhLGIpfQorSi50VD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIEouUkUoYSkuWDYoYSxiLGMpfQogSi50YT1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNQKGEsYil9CiBKLnRmPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdLNChhKX0KIEoudHY9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRFgoYSxiKX0KIEoudHc9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuamUoYSl9Ci1KLnUxPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdTWShhKX0KK0oudTE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5XeChhKS5XWihhLGIpfQogSi51Nj1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmdHlwZW9mIGI9PSJudW1iZXIiKXJldHVybiBhPGIKIHJldHVybiBKLld4KGEpLkMoYSxiKX0KLUoudUg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5yWShhKS5GcihhLGIpfQorSi51Rz1mdW5jdGlvbihhLGIpe3JldHVybiBKLncxKGEpLnpWKGEsYil9CitKLnVIPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1AyKGEsYil9CiBKLnVNPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc29kKGEsYil9CiBKLnVQPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc0o2KGEsYil9CiBKLnVXPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd5RyhhKX0KLUoudVk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi53MShhKS5OayhhLGIpfQorSi51WT1mdW5jdGlvbihhKXtyZXR1cm4gSi53MShhKS5nclooYSl9CiBKLnVmPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmd4cihhKX0KIEoudWw9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1U0KGEpfQogSi51cD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5na2goYSl9CiBKLnV5PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdIbShhKX0KIEoudjE9ZnVuY3Rpb24oYSl7cmV0dXJuIEoueChhKS5naU8oYSl9Ci1KLnY4PWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmducChhKX0KIEoudko9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zcE0oYSxiKX0KIEoudlA9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuTXkoYSl9CiBKLnZYPWZ1bmN0aW9uKGEsYil7aWYodHlwZW9mIGE9PSJudW1iZXIiJiZ0eXBlb2YgYj09Im51bWJlciIpcmV0dXJuIGEqYgpAQCAtMTk5MzQsMzMgKzIwMTkwLDM0IEBACiBKLndEPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEoudzEoYSkuc0lyKGEsYil9CiBKLndGPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouV3goYSkuU3koYSxiKX0KIEoud0o9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zbHAoYSxiKX0KLUoud089ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0U3KGEpfQogSi53Zz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlU2KGEpLnNCKGEsYil9CiBKLndsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuQ2goYSxiKX0KK0oud3U9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zTGYoYSxiKX0KIEoud3g9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5SZyhhLGIpfQorSi53ej1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nengoYSl9CiBKLngwPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkuc1d0KGEsYil9CiBKLng1PWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouVTYoYSkudGcoYSxiKX0KIEoueEM9ZnVuY3Rpb24oYSxiKXtpZihhPT1udWxsKXJldHVybiBiPT1udWxsCiBpZih0eXBlb2YgYSE9Im9iamVjdCIpcmV0dXJuIGIhPW51bGwmJmE9PT1iCiByZXR1cm4gSi54KGEpLm4oYSxiKX0KLUoueEg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zRTcoYSxiKX0KK0oueEg9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zeFQoYSxiKX0KIEoueFE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zR2QoYSxiKX0KIEoueFI9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2hmKGEpfQogSi54Vz1mdW5jdGlvbihhLGIpe3JldHVybiBKLlJFKGEpLnNabShhLGIpfQogSi54YT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nZVMoYSl9Ci1KLnhiPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdmcShhKX0KIEoueGU9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ1BCKGEpfQogSi54bz1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nSk4oYSl9CiBKLnkyPWZ1bmN0aW9uKGEsYil7cmV0dXJuIEouUkUoYSkubXgoYSxiKX0KIEoueUg9ZnVuY3Rpb24oYSl7cmV0dXJuIEouV3goYSkuVnkoYSl9CitKLnlJPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdMZihhKX0KIEoueU89ZnVuY3Rpb24oYSxiKXtyZXR1cm4gSi5SRShhKS5zdE4oYSxiKX0KK0oueWM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3VTKGEpfQogSi55ZD1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS54TyhhKX0KIEoueW49ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ2taKGEpfQogSi55cT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nUWwoYSl9Ci1KLnl4PWZ1bmN0aW9uKGEpe3JldHVybiBKLlU2KGEpLmdvcihhKX0KIEoueXo9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0xGKGEpfQorSi56MT1mdW5jdGlvbihhKXtyZXR1cm4gSi5SRShhKS5nWHIoYSl9CiBKLnoyPWZ1bmN0aW9uKGEpe3JldHVybiBKLlJFKGEpLmdHMShhKX0KLUouejM9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ3U2KGEpfQogSi56OD1mdW5jdGlvbihhLGIpe2lmKHR5cGVvZiBhPT0ibnVtYmVyIiYmdHlwZW9mIGI9PSJudW1iZXIiKXJldHVybiBhPmIKIHJldHVybiBKLld4KGEpLkQoYSxiKX0KIEouekY9ZnVuY3Rpb24oYSl7cmV0dXJuIEouUkUoYSkuZ0hMKGEpfQpAQCAtMTk5NzIsMzEgKzIwMjI5LDMxIEBACiBDLkRmPVguaFYucHJvdG90eXBlCiBDLkdrcD1ZLnE2LnByb3RvdHlwZQogQy5Ndz1CLkc2LnByb3RvdHlwZQotQy5IUj1BLndNLnByb3RvdHlwZQorQy5pYz1BLndNLnByb3RvdHlwZQogQy5ZWno9US5lVy5wcm90b3R5cGUKIEMuUkQ9Ty5lby5wcm90b3R5cGUKLUMua2E9Wi5hQy5wcm90b3R5cGUKK0Mua2E9Wi5hay5wcm90b3R5cGUKIEMudFdPPU8uVlkucHJvdG90eXBlCiBDLnV4PUYuQmUucHJvdG90eXBlCiBDLk8wPVIuSkkucHJvdG90eXBlCiBDLk9EPUYuWlAucHJvdG90eXBlCi1DLnRUPUwubkoucHJvdG90eXBlCi1DLlVGPVIuRWcucHJvdG90eXBlCitDLkpoPUwubkoucHJvdG90eXBlCitDLnFMPVIuRWcucHJvdG90eXBlCiBDLk1DPUQuaTcucHJvdG90eXBlCi1DLmJ5PUEuR2sucHJvdG90eXBlCitDLkQ0PUEuR2sucHJvdG90eXBlCiBDLmxzNj1YLk1KLnByb3RvdHlwZQotQy5NTzA9WC5Oci5wcm90b3R5cGUKK0MuTU8wPVguSjMucHJvdG90eXBlCiBDLlhvPVUuREsucHJvdG90eXBlCiBDLlBKOD1OLkJTLnByb3RvdHlwZQogQy5Dcz1PLlZiLnByb3RvdHlwZQogQy5WYz1LLkx5LnByb3RvdHlwZQogQy5XMz1XLmZKLnByb3RvdHlwZQotQy5VZz1FLldTLnByb3RvdHlwZQotQy5Ccz1FLkg4LnByb3RvdHlwZQorQy5iUD1FLldTLnByb3RvdHlwZQorQy5HSUk9RS5IOC5wcm90b3R5cGUKIEMuSWU9RS5tTy5wcm90b3R5cGUKIEMuSWc9RS5ERS5wcm90b3R5cGUKIEMueDQ9RS5VMS5wcm90b3R5cGUKLUMubFg9RS5vdS5wcm90b3R5cGUKK0MubFg9RS5xTS5wcm90b3R5cGUKIEMuT2tJPUUuYXYucHJvdG90eXBlCiBDLmJaPUUudXoucHJvdG90eXBlCiBDLmlSPUUuTWEucHJvdG90eXBlCkBAIC0yMDAwNiwxMSArMjAyNjMsMTEgQEAKIEMuVGw9RS5vRi5wcm90b3R5cGUKIEMud0s9RS5xaC5wcm90b3R5cGUKIEMudG89RS5RNi5wcm90b3R5cGUKLUMuemE9RS5MNC5wcm90b3R5cGUKK0Mud2Q9RS5MNC5wcm90b3R5cGUKIEMuaWo9RS5abi5wcm90b3R5cGUKLUMuanM9RS51RS5wcm90b3R5cGUKK0MuUnI9RS51RS5wcm90b3R5cGUKIEMuYVY9RS5uNS5wcm90b3R5cGUKLUMucG89Qi5wUi5wcm90b3R5cGUKK0MuaE09Qi5wUi5wcm90b3R5cGUKIEMueUt4PVouaHgucHJvdG90eXBlCiBDLmFYUD1ELlo0LnByb3RvdHlwZQogQy5WaT1ELlFoLnByb3RvdHlwZQpAQCAtMjAwMjQsMjkgKzIwMjgxLDMwIEBACiBDLk5tPUouUS5wcm90b3R5cGUKIEMuWUk9Si5WQS5wcm90b3R5cGUKIEMuam49Si5YaC5wcm90b3R5cGUKLUMuYlA9Si5DRFUucHJvdG90eXBlCitDLmpOPUouQ0RVLnByb3RvdHlwZQogQy5DRD1KLlAucHJvdG90eXBlCiBDLnhCPUouTy5wcm90b3R5cGUKIEMuWXQ9Wi52ai5wcm90b3R5cGUKIEMuY3Q9QS5VSy5wcm90b3R5cGUKIEMuWjM9Ui5MVS5wcm90b3R5cGUKIEMuTUc9TS5DWC5wcm90b3R5cGUKK0MuUzI9Vy5IOS5wcm90b3R5cGUKIEMueXA9SC5lRVYucHJvdG90eXBlCiBDLmtEPUEubWQucHJvdG90eXBlCiBDLnBsPUEueWUucHJvdG90eXBlCiBDLklHPUEuQm0ucHJvdG90eXBlCi1DLm5uPUEuWWEucHJvdG90eXBlCitDLk5rPUEuWWEucHJvdG90eXBlCiBDLk1uPUEuTksucHJvdG90eXBlCiBDLkw4PUEuWngucHJvdG90eXBlCi1DLko3PUEuV3cucHJvdG90eXBlCitDLlk2PUEuV3cucHJvdG90eXBlCiBDLnQ1PVcuQkgzLnByb3RvdHlwZQogQy5CSD1WLkYxLnByb3RvdHlwZQogQy5QZno9Wi51TC5wcm90b3R5cGUKIEMuU3g9Si5pQ1cucHJvdG90eXBlCiBDLktpPUEueGMucHJvdG90eXBlCi1DLkZhPVQub3YucHJvdG90eXBlCitDLnphPVQub3YucHJvdG90eXBlCiBDLldhPUEua24ucHJvdG90eXBlCi1DLkZIPVUuZkkucHJvdG90eXBlCitDLmNKMD1VLmZJLnByb3RvdHlwZQogQy5VMD1SLnpNLnByb3RvdHlwZQogQy5WZD1ELlJrLnByb3RvdHlwZQogQy5Ocz1VLlRpLnByb3RvdHlwZQpAQCAtMjAwNTcsNyArMjAzMTUsNyBAQAogQy5PS2w9QS5HMS5wcm90b3R5cGUKIEMudkI9Si5rZFEucHJvdG90eXBlCiBDLmhqPVYuRDIucHJvdG90eXBlCi1DLlphPVYuUGEucHJvdG90eXBlCitDLko1Nz1WLlBhLnByb3RvdHlwZQogQy52QT1YLkk1LnByb3RvdHlwZQogQy5kbT1VLmVsLnByb3RvdHlwZQogQy5vbD1XLks1LnByb3RvdHlwZQpAQCAtMjAwNzAsNyArMjAzMjgsNyBAQAogQy5wcj1uZXcgUC5tZ2IoKQogQy5kVj1uZXcgTC5pTmMoKQogQy5OVT1uZXcgUC5SODEoKQotQy5kUz1uZXcgUC5BSGkoKQorQy52OD1uZXcgUC5BSGkoKQogQy5XQT1uZXcgRC5XQUUoIkNvbGxlY3RlZCIpCiBDLmw4PW5ldyBELldBRSgiRGFydCIpCiBDLk9jPW5ldyBELldBRSgiTmF0aXZlIikKQEAgLTIwMDc5LDI1MiArMjAzMzcsMjU1IEBACiBDLm5VPW5ldyBBLmlZbigwKQogQy5CTT1uZXcgQS5pWW4oMSkKIEMuaFU9bmV3IEEuaVluKDIpCi1DLmhmPW5ldyBILklOKCJsYWJlbCIpCitDLmhmPW5ldyBILnR4KCJsYWJlbCIpCiBDLkdoPUguSUwoJ3FVJykKIEMuQjEwPW5ldyBLLnZseSgpCi1DLk9VPW5ldyBBLmhHKCExKQorQy52cmQ9bmV3IEEuaEcoITEpCiBJLnVMPWZ1bmN0aW9uKGEpe2EuaW1tdXRhYmxlJGxpc3Q9aW5pdAogYS5maXhlZCRsZW5ndGg9aW5pdAogcmV0dXJuIGF9Ci1DLnVjUD1JLnVMKFtDLkIxMCxDLk9VXSkKK0MudWNQPUkudUwoW0MuQjEwLEMudnJkXSkKIEMuVjA9bmV3IEEuRVMoQy5oZixDLkJNLCExLEMuR2gsITEsQy51Y1ApCi1DLkVWPW5ldyBILklOKCJsaWJyYXJ5IikKK0MuRVY9bmV3IEgudHgoImxpYnJhcnkiKQogQy5Kbnk9SC5JTCgnVTQnKQogQy5aUT1uZXcgQS5FUyhDLkVWLEMuQk0sITEsQy5KbnksITEsQy51Y1ApCi1DLlNSPW5ldyBILklOKCJtYXAiKQorQy5aZz1uZXcgSC50eCgiYXJncyIpCitDLlNYSz1ILklMKCdxQycpCitDLmI3PW5ldyBBLkVTKEMuWmcsQy5CTSwhMSxDLlNYSywhMSxDLnVjUCkKK0MuU1I9bmV3IEgudHgoIm1hcCIpCiBDLk1SMT1ILklMKCd2TycpCiBDLlM5PW5ldyBBLkVTKEMuU1IsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMubGQ9bmV3IEguSU4oImV2ZW50cyIpCitDLmxkPW5ldyBILnR4KCJldmVudHMiKQogQy5Hc2M9SC5JTCgnd24nKQogQy5Hdz1uZXcgQS5FUyhDLmxkLEMuQk0sITEsQy5Hc2MsITEsQy51Y1ApCi1DLlVMPW5ldyBILklOKCJwcm9maWxlQ2hhbmdlZCIpCitDLlVMPW5ldyBILnR4KCJwcm9maWxlQ2hhbmdlZCIpCiBDLnlRUD1ILklMKCdFSCcpCiBDLmRuPUkudUwoW10pCiBDLm1NPW5ldyBBLkVTKEMuVUwsQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy5RbD1uZXcgSC5JTigiaGFzQ2xhc3MiKQotQy5ITD1ILklMKCdhMicpCi1DLkoxOT1uZXcgSy5uZCgpCi1DLmVzeD1JLnVMKFtDLkIxMCxDLkoxOV0pCi1DLlRKPW5ldyBBLkVTKEMuUWwsQy5CTSwhMSxDLkhMLCExLEMuZXN4KQotQy5UVT1uZXcgSC5JTigiZW5kUG9zQ2hhbmdlZCIpCitDLlRVPW5ldyBILnR4KCJlbmRQb3NDaGFuZ2VkIikKIEMuQ3A9bmV3IEEuRVMoQy5UVSxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLm5lPW5ldyBILklOKCJleGNlcHRpb24iKQorQy5uZT1uZXcgSC50eCgiZXhjZXB0aW9uIikKIEMuU051PUguSUwoJ0VQJykKIEMuclo9bmV3IEEuRVMoQy5uZSxDLkJNLCExLEMuU051LCExLEMudWNQKQotQy5XbT1uZXcgSC5JTigicmVmQ2hhbmdlZCIpCitDLldtPW5ldyBILnR4KCJyZWZDaGFuZ2VkIikKIEMuUVc9bmV3IEEuRVMoQy5XbSxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLlVZPW5ldyBILklOKCJyZXN1bHQiKQorQy5VWT1uZXcgSC50eCgicmVzdWx0IikKIEMuU21OPUguSUwoJ2FmJykKIEMubjY9bmV3IEEuRVMoQy5VWSxDLkJNLCExLEMuU21OLCExLEMudWNQKQotQy5RSz1uZXcgSC5JTigicXVhbGlmaWVkIikKK0MuUUs9bmV3IEgudHgoInF1YWxpZmllZCIpCitDLkhMPUguSUwoJ2EyJykKIEMuWW89bmV3IEEuRVMoQy5RSyxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLlNBPW5ldyBILklOKCJsaW5lcyIpCitDLlNBPW5ldyBILnR4KCJsaW5lcyIpCiBDLmhBWD1ILklMKCdXTycpCitDLkoxOT1uZXcgSy5uZCgpCitDLmVzeD1JLnVMKFtDLkIxMCxDLkoxOV0pCiBDLktJPW5ldyBBLkVTKEMuU0EsQy5CTSwhMSxDLmhBWCwhMSxDLmVzeCkKLUMuelU9bmV3IEguSU4oInVuY2hlY2tlZFRleHQiKQorQy56VT1uZXcgSC50eCgidW5jaGVja2VkVGV4dCIpCiBDLnVUPW5ldyBBLkVTKEMuelUsQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5YQT1uZXcgSC5JTigiY2xzIikKK0MuSVQ9bmV3IEgudHgoInN0YXJ0UG9zIikKK0MueXc9SC5JTCgnS04nKQorQy5OTD1uZXcgQS5FUyhDLklULEMuQk0sITEsQy55dywhMSxDLnVjUCkKK0MuQTc9bmV3IEgudHgoImhlaWdodCIpCitDLlNEPW5ldyBBLkVTKEMuQTcsQy5CTSwhMSxDLkdoLCExLEMudWNQKQorQy5YQT1uZXcgSC50eCgiY2xzIikKIEMuakZYPUguSUwoJ2R5JykKIEMuZHE9bmV3IEEuRVMoQy5YQSxDLkJNLCExLEMuakZYLCExLEMudWNQKQotQy5hSD1uZXcgSC5JTigiZGlzcGxheUN1dG9mZiIpCitDLmFIPW5ldyBILnR4KCJkaXNwbGF5Q3V0b2ZmIikKIEMudzM9bmV3IEEuRVMoQy5hSCxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLnJCPW5ldyBILklOKCJpc29sYXRlIikKK0MuckI9bmV3IEgudHgoImlzb2xhdGUiKQogQy5hMnA9SC5JTCgnYnYnKQogQy54WT1uZXcgQS5FUyhDLnJCLEMuQk0sITEsQy5hMnAsITEsQy5lc3gpCi1DLmJ6PW5ldyBILklOKCJpc29sYXRlQ2hhbmdlZCIpCitDLmJ6PW5ldyBILnR4KCJpc29sYXRlQ2hhbmdlZCIpCiBDLkJrPW5ldyBBLkVTKEMuYnosQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy5DRz1uZXcgSC5JTigicG9zQ2hhbmdlZCIpCitDLkNHPW5ldyBILnR4KCJwb3NDaGFuZ2VkIikKIEMuTWw9bmV3IEEuRVMoQy5DRyxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLnloPW5ldyBILklOKCJlcnJvciIpCitDLnloPW5ldyBILnR4KCJlcnJvciIpCiBDLm9VRD1ILklMKCdONycpCiBDLmxKPW5ldyBBLkVTKEMueWgsQy5CTSwhMSxDLm9VRCwhMSxDLnVjUCkKLUMuR3M9bmV3IEguSU4oInNhbXBsZUNvdW50IikKK0MuR3M9bmV3IEgudHgoInNhbXBsZUNvdW50IikKIEMuaU89bmV3IEEuRVMoQy5HcyxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLm9qPW5ldyBILklOKCJodHRwU2VydmVyIikKK0Mub2o9bmV3IEgudHgoImh0dHBTZXJ2ZXIiKQogQy5HVD1uZXcgQS5FUyhDLm9qLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLnRkPW5ldyBILklOKCJvYmplY3QiKQorQy50ZD1uZXcgSC50eCgib2JqZWN0IikKIEMuWms9bmV3IEEuRVMoQy50ZCxDLkJNLCExLEMuU21OLCExLEMudWNQKQotQy5UVz1uZXcgSC5JTigidGFnU2VsZWN0b3IiKQorQy5UVz1uZXcgSC50eCgidGFnU2VsZWN0b3IiKQogQy5IMD1uZXcgQS5FUyhDLlRXLEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMuSGU9bmV3IEguSU4oImhpZGVUYWdzQ2hlY2tlZCIpCitDLkhlPW5ldyBILnR4KCJoaWRlVGFnc0NoZWNrZWQiKQogQy5vVj1uZXcgQS5FUyhDLkhlLEMuQk0sITEsQy5ITCwhMSxDLmVzeCkKLUMuYmE9bmV3IEguSU4oInBvbGxQZXJpb2RDaGFuZ2VkIikKK0MuYmE9bmV3IEgudHgoInBvbGxQZXJpb2RDaGFuZ2VkIikKIEMua1E9bmV3IEEuRVMoQy5iYSxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLnp6PW5ldyBILklOKCJ0aW1lU3BhbiIpCitDLlJzPW5ldyBILnR4KCJjdXJyZW50UG9zQ2hhbmdlZCIpCitDLkVXPW5ldyBBLkVTKEMuUnMsQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQorQy56ej1uZXcgSC50eCgidGltZVNwYW4iKQogQy5sUz1uZXcgQS5FUyhDLnp6LEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMuQU89bmV3IEguSU4oInF1YWxpZmllZE5hbWUiKQotQy5maT1uZXcgQS5FUyhDLkFPLEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKLUMubXI9bmV3IEguSU4oImV4cGFuZGVkIikKK0MubXI9bmV3IEgudHgoImV4cGFuZGVkIikKIEMuSEU9bmV3IEEuRVMoQy5tcixDLkJNLCExLEMuSEwsITEsQy5lc3gpCi1DLmt3PW5ldyBILklOKCJ0cmFjZSIpCitDLmt3PW5ldyBILnR4KCJ0cmFjZSIpCiBDLm9DPW5ldyBBLkVTKEMua3csQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMucVg9bmV3IEguSU4oImZyYWdtZW50YXRpb25DaGFuZ2VkIikKK0MucVg9bmV3IEgudHgoImZyYWdtZW50YXRpb25DaGFuZ2VkIikKIEMuZE89bmV3IEEuRVMoQy5xWCxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLlVYPW5ldyBILklOKCJtc2ciKQorQy5VWD1uZXcgSC50eCgibXNnIikKIEMuUHQ9bmV3IEEuRVMoQy5VWCxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5wTz1uZXcgSC5JTigiZnVuY3Rpb25DaGFuZ2VkIikKLUMuYXU9bmV3IEEuRVMoQy5wTyxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLnJQPW5ldyBILklOKCJtYXBDaGFuZ2VkIikKK0MuclA9bmV3IEgudHgoIm1hcENoYW5nZWQiKQogQy5OdD1uZXcgQS5FUyhDLnJQLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuYms9bmV3IEguSU4oImNoZWNrZWQiKQorQy5uZj1uZXcgSC50eCgiZnVuY3Rpb24iKQorQy5RSjc9SC5JTCgnS3AnKQorQy53Uj1uZXcgQS5FUyhDLm5mLEMuQk0sITEsQy5RSjcsITEsQy51Y1ApCitDLmJrPW5ldyBILnR4KCJjaGVja2VkIikKIEMuVWQ9bmV3IEEuRVMoQy5iayxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLmtWPW5ldyBILklOKCJsaW5rIikKK0Mua1Y9bmV3IEgudHgoImxpbmsiKQogQy52ej1uZXcgQS5FUyhDLmtWLEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKLUMuVmU9bmV3IEguSU4oInNvY2tldCIpCitDLlZlPW5ldyBILnR4KCJzb2NrZXQiKQogQy5YbXE9SC5JTCgnV1AnKQogQy5YND1uZXcgQS5FUyhDLlZlLEMuQk0sITEsQy5YbXEsITEsQy51Y1ApCi1DLm50PW5ldyBILklOKCJzdGFydExpbmUiKQotQy55dz1ILklMKCdLTicpCitDLm50PW5ldyBILnR4KCJzdGFydExpbmUiKQogQy5WUz1uZXcgQS5FUyhDLm50LEMuQk0sITEsQy55dywhMSxDLmVzeCkKLUMudGc9bmV3IEguSU4oInJldGFpbmVkQnl0ZXMiKQorQy50Zz1uZXcgSC50eCgicmV0YWluZWRCeXRlcyIpCiBDLkRDPW5ldyBBLkVTKEMudGcsQy5CTSwhMSxDLnl3LCExLEMuZXN4KQotQy5wOD1uZXcgSC5JTigiZXZlbnQiKQorQy52WT1uZXcgSC50eCgiY3VycmVudFBvcyIpCitDLlpTPW5ldyBBLkVTKEMudlksQy5CTSwhMSxDLnl3LCExLEMudWNQKQorQy5wOD1uZXcgSC50eCgiZXZlbnQiKQogQy5LcDI9SC5JTCgnTWsnKQogQy51Yz1uZXcgQS5FUyhDLnA4LEMuQk0sITEsQy5LcDIsITEsQy51Y1ApCi1DLllEPW5ldyBILklOKCJzYW1wbGVSYXRlIikKK0MuWUQ9bmV3IEgudHgoInNhbXBsZVJhdGUiKQogQy5mUD1uZXcgQS5FUyhDLllELEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMuQWE9bmV3IEguSU4oInJlc3VsdHMiKQorQy5BYT1uZXcgSC50eCgicmVzdWx0cyIpCiBDLlV6PW5ldyBBLkVTKEMuQWEsQy5CTSwhMSxDLkdzYywhMSxDLmVzeCkKLUMuQjA9bmV3IEguSU4oImV4cGFuZCIpCitDLkIwPW5ldyBILnR4KCJleHBhbmQiKQogQy5iNj1uZXcgQS5FUyhDLkIwLEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMudDY9bmV3IEguSU4oIm1hcEFzU3RyaW5nIikKK0MudDY9bmV3IEgudHgoIm1hcEFzU3RyaW5nIikKIEMuaHI9bmV3IEEuRVMoQy50NixDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLnFzPW5ldyBILklOKCJpbyIpCitDLnFzPW5ldyBILnR4KCJpbyIpCiBDLk1OPW5ldyBBLkVTKEMucXMsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuUUg9bmV3IEguSU4oImZyYWdtZW50YXRpb24iKQorQy5RSD1uZXcgSC50eCgiZnJhZ21lbnRhdGlvbiIpCiBDLkM0PW5ldyBBLkVTKEMuUUgsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuZnQ9bmV3IEguSU4oInRhcmdldCIpCitDLmZ0PW5ldyBILnR4KCJ0YXJnZXQiKQogQy5JNGo9SC5JTCgnWjUnKQogQy51Mz1uZXcgQS5FUyhDLmZ0LEMuQk0sITEsQy5JNGosITEsQy51Y1ApCi1DLlZLPW5ldyBILklOKCJkZXZ0b29scyIpCitDLlZLPW5ldyBILnR4KCJkZXZ0b29scyIpCiBDLk9kPW5ldyBBLkVTKEMuVkssQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy51dT1uZXcgSC5JTigiaW50ZXJuYWwiKQorQy51dT1uZXcgSC50eCgiaW50ZXJuYWwiKQogQy55WT1uZXcgQS5FUyhDLnV1LEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMueUw9bmV3IEguSU4oImNvbm5lY3Rpb24iKQorQy55TD1uZXcgSC50eCgiY29ubmVjdGlvbiIpCiBDLmo1PW5ldyBBLkVTKEMueUwsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuV2o9bmV3IEguSU4oInByb2Nlc3MiKQorQy5Xaj1uZXcgSC50eCgicHJvY2VzcyIpCiBDLkFoPW5ldyBBLkVTKEMuV2osQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMubmY9bmV3IEguSU4oImZ1bmN0aW9uIikKLUMuVjM9bmV3IEEuRVMoQy5uZixDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5MYz1uZXcgSC5JTigia2luZCIpCi1DLlBjPW5ldyBBLkVTKEMuTGMsQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5TND1uZXcgSC5JTigiYnVzeSIpCitDLlM0PW5ldyBILnR4KCJidXN5IikKIEMuRkI9bmV3IEEuRVMoQy5TNCxDLkJNLCExLEMuSEwsITEsQy5lc3gpCi1DLmVoPW5ldyBILklOKCJsaW5lTW9kZSIpCitDLmVoPW5ldyBILnR4KCJsaW5lTW9kZSIpCiBDLnJIPW5ldyBBLkVTKEMuZWgsQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5QTT1uZXcgSC5JTigic3RhdHVzIikKK0MuUE09bmV3IEgudHgoInN0YXR1cyIpCiBDLmp2PW5ldyBBLkVTKEMuUE0sQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5aaT1uZXcgSC5JTigibGFzdEFjY3VtdWxhdG9yUmVzZXQiKQorQy5aaT1uZXcgSC50eCgibGFzdEFjY3VtdWxhdG9yUmVzZXQiKQogQy54eD1uZXcgQS5FUyhDLlppLEMuQk0sITEsQy5HaCwhMSxDLmVzeCkKLUMubEg9bmV3IEguSU4oImNoZWNrZWRUZXh0IikKK0MubEg9bmV3IEgudHgoImNoZWNrZWRUZXh0IikKIEMuZEc9bmV3IEEuRVMoQy5sSCxDLkJNLCExLEMuR2gsITEsQy51Y1ApCi1DLkFWPW5ldyBILklOKCJjYWxsYmFjayIpCitDLkFWPW5ldyBILnR4KCJjYWxsYmFjayIpCiBDLlFpTz1ILklMKCdTYScpCiBDLmZyPW5ldyBBLkVTKEMuQVYsQy5CTSwhMSxDLlFpTywhMSxDLnVjUCkKLUMudnM9bmV3IEguSU4oImVuZExpbmUiKQorQy52cz1uZXcgSC50eCgiZW5kTGluZSIpCiBDLk1QPW5ldyBBLkVTKEMudnMsQy5CTSwhMSxDLnl3LCExLEMuZXN4KQotQy5wSD1uZXcgSC5JTigic21hbGwiKQorQy5wSD1uZXcgSC50eCgic21hbGwiKQogQy5Gaz1uZXcgQS5FUyhDLnBILEMuQk0sITEsQy5ITCwhMSxDLnVjUCkKLUMub3g9bmV3IEguSU4oImNvdW50ZXJzQ2hhbmdlZCIpCitDLmxpPW5ldyBILnR4KCJzdGFydFBvc0NoYW5nZWQiKQorQy5Uej1uZXcgQS5FUyhDLmxpLEMuaFUsITEsQy55UVAsITEsQy5kbikKK0Mub3g9bmV3IEgudHgoImNvdW50ZXJzQ2hhbmdlZCIpCiBDLlJoPW5ldyBBLkVTKEMub3gsQy5oVSwhMSxDLnlRUCwhMSxDLmRuKQotQy5YTT1uZXcgSC5JTigicGF0aCIpCitDLlhNPW5ldyBILnR4KCJwYXRoIikKIEMuVHQ9bmV3IEEuRVMoQy5YTSxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5iSj1uZXcgSC5JTigiY291bnRlcnMiKQotQy5VWj1ILklMKCdxQycpCi1DLlVJPW5ldyBBLkVTKEMuYkosQy5CTSwhMSxDLlVaLCExLEMudWNQKQotQy5iRT1uZXcgSC5JTigic2FtcGxlRGVwdGgiKQorQy5iSj1uZXcgSC50eCgiY291bnRlcnMiKQorQy5VST1uZXcgQS5FUyhDLmJKLEMuQk0sITEsQy5TWEssITEsQy51Y1ApCitDLmJFPW5ldyBILnR4KCJzYW1wbGVEZXB0aCIpCiBDLmgzPW5ldyBBLkVTKEMuYkUsQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5Zcz1uZXcgSC5JTigicGFkIikKK0MuWXM9bmV3IEgudHgoInBhZCIpCiBDLkNlPW5ldyBBLkVTKEMuWXMsQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy5OOD1uZXcgSC5JTigic2NyaXB0Q2hhbmdlZCIpCitDLk44PW5ldyBILnR4KCJzY3JpcHRDaGFuZ2VkIikKIEMucUU9bmV3IEEuRVMoQy5OOCxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLllUPW5ldyBILklOKCJleHByIikKK0MuWVQ9bmV3IEgudHgoImV4cHIiKQogQy5lUD1ILklMKCdkeW5hbWljJykKIEMuTEM9bmV3IEEuRVMoQy5ZVCxDLkJNLCExLEMuZVAsITEsQy51Y1ApCi1DLnlCPW5ldyBILklOKCJpbnN0YW5jZXMiKQorQy55Qj1uZXcgSC50eCgiaW5zdGFuY2VzIikKIEMudlo9bmV3IEEuRVMoQy55QixDLkJNLCExLEMuTVIxLCExLEMuZXN4KQotQy5haz1uZXcgSC5JTigiaGFzUGFyZW50IikKLUMueUk9bmV3IEEuRVMoQy5hayxDLkJNLCExLEMuSEwsITEsQy5lc3gpCi1DLnhTPW5ldyBILklOKCJ0YWdTZWxlY3RvckNoYW5nZWQiKQorQy54Uz1uZXcgSC50eCgidGFnU2VsZWN0b3JDaGFuZ2VkIikKIEMuYkI9bmV3IEEuRVMoQy54UyxDLmhVLCExLEMueVFQLCExLEMuZG4pCi1DLmpVPW5ldyBILklOKCJmaWxlIikKK0MualU9bmV3IEgudHgoImZpbGUiKQogQy5idz1uZXcgQS5FUyhDLmpVLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCiBDLlJVPW5ldyBBLkVTKEMuckIsQy5CTSwhMSxDLmEycCwhMSxDLnVjUCkKLUMuWUU9bmV3IEguSU4oIndlYlNvY2tldCIpCitDLllFPW5ldyBILnR4KCJ3ZWJTb2NrZXQiKQogQy5XbD1uZXcgQS5FUyhDLllFLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLkRqPW5ldyBILklOKCJyZWZyZXNoVGltZSIpCitDLkRqPW5ldyBILnR4KCJyZWZyZXNoVGltZSIpCiBDLkF5PW5ldyBBLkVTKEMuRGosQy5CTSwhMSxDLkdoLCExLEMuZXN4KQotQy5Hcj1uZXcgSC5JTigiZW5kUG9zIikKK0MuR3I9bmV3IEgudHgoImVuZFBvcyIpCiBDLlZKPW5ldyBBLkVTKEMuR3IsQy5CTSwhMSxDLnl3LCExLEMudWNQKQotQy5SSj1uZXcgSC5JTigidm0iKQorQy5SSj1uZXcgSC50eCgidm0iKQogQy5uOFM9SC5JTCgnd3YnKQogQy5CUD1uZXcgQS5FUyhDLlJKLEMuQk0sITEsQy5uOFMsITEsQy51Y1ApCi1DLnVYPW5ldyBILklOKCJzdGFuZGFsb25lVm1BZGRyZXNzIikKK0MudVg9bmV3IEgudHgoInN0YW5kYWxvbmVWbUFkZHJlc3MiKQogQy5FYj1uZXcgQS5FUyhDLnVYLEMuQk0sITEsQy5HaCwhMSxDLnVjUCkKLUMuYTA9bmV3IEguSU4oImlzRGFydCIpCi1DLlA5PW5ldyBBLkVTKEMuYTAsQy5CTSwhMSxDLkhMLCExLEMuZXN4KQotQy5QWD1uZXcgSC5JTigic2NyaXB0IikKK0MuUFg9bmV3IEgudHgoInNjcmlwdCIpCiBDLktCPUguSUwoJ3Z4JykKIEMuano9bmV3IEEuRVMoQy5QWCxDLkJNLCExLEMuS0IsITEsQy51Y1ApCi1DLmFQPW5ldyBILklOKCJhY3RpdmUiKQorQy5hUD1uZXcgSC50eCgiYWN0aXZlIikKIEMueEQ9bmV3IEEuRVMoQy5hUCxDLkJNLCExLEMuSEwsITEsQy51Y1ApCi1DLkduPW5ldyBILklOKCJvYmplY3RDaGFuZ2VkIikKK0MuR249bmV3IEgudHgoIm9iamVjdENoYW5nZWQiKQogQy5hej1uZXcgQS5FUyhDLkduLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMudnA9bmV3IEguSU4oImxpc3QiKQorQy52cD1uZXcgSC50eCgibGlzdCIpCiBDLm8wPW5ldyBBLkVTKEMudnAsQy5CTSwhMSxDLk1SMSwhMSxDLnVjUCkKLUMuaTQ9bmV3IEguSU4oImNvZGUiKQorQy5pND1uZXcgSC50eCgiY29kZSIpCiBDLnBNPUguSUwoJ2t4JykKIEMuYUo9bmV3IEEuRVMoQy5pNCxDLkJNLCExLEMucE0sITEsQy51Y1ApCi1DLmtHPW5ldyBILklOKCJjbGFzc1RhYmxlIikKK0Mua0k9bmV3IEgudHgoImN1cnJlbnRMaW5lIikKK0MuSk09bmV3IEEuRVMoQy5rSSxDLkJNLCExLEMueXcsITEsQy5lc3gpCitDLmtHPW5ldyBILnR4KCJjbGFzc1RhYmxlIikKIEMubTdJPUguSUwoJ1VDJykKIEMuUHI9bmV3IEEuRVMoQy5rRyxDLkJNLCExLEMubTdJLCExLEMuZXN4KQotQy5UTj1uZXcgSC5JTigibGFzdFNlcnZpY2VHQyIpCitDLlROPW5ldyBILnR4KCJsYXN0U2VydmljZUdDIikKIEMuR2o9bmV3IEEuRVMoQy5UTixDLkJNLCExLEMuR2gsITEsQy5lc3gpCiBDLnpkPW5ldyBBLkVTKEMueWgsQy5CTSwhMSxDLlNtTiwhMSxDLnVjUCkKLUMuT089bmV3IEguSU4oImZsYWciKQotQy5DZj1uZXcgQS5FUyhDLk9PLEMuQk0sITEsQy5VWiwhMSxDLnVjUCkKLUMuTzk9bmV3IEguSU4oInBvbGxQZXJpb2QiKQorQy5PTz1uZXcgSC50eCgiZmxhZyIpCitDLkNmPW5ldyBBLkVTKEMuT08sQy5CTSwhMSxDLlNYSywhMSxDLnVjUCkKK0MuTzk9bmV3IEgudHgoInBvbGxQZXJpb2QiKQogQy5xOT1uZXcgQS5FUyhDLk85LEMuQk0sITEsQy5lUCwhMSxDLmVzeCkKLUMudWs9bmV3IEguSU4oImxhc3QiKQorQy51az1uZXcgSC50eCgibGFzdCIpCiBDLnA0PW5ldyBBLkVTKEMudWssQy5CTSwhMSxDLkhMLCExLEMudWNQKQotQy5hbT1uZXcgSC5JTigiY2hyb21lVGFyZ2V0cyIpCitDLmFtPW5ldyBILnR4KCJjaHJvbWVUYXJnZXRzIikKIEMuSkQ9bmV3IEEuRVMoQy5hbSxDLkJNLCExLEMuR3NjLCExLEMuZXN4KQotQy5vRT1uZXcgSC5JTigiY2hyb21pdW1BZGRyZXNzIikKK0Mub0U9bmV3IEgudHgoImNocm9taXVtQWRkcmVzcyIpCiBDLnIyPW5ldyBBLkVTKEMub0UsQy5CTSwhMSxDLkdoLCExLEMudWNQKQotQy5XUT1uZXcgSC5JTigiZmllbGQiKQorQy5XUT1uZXcgSC50eCgiZmllbGQiKQogQy5haD1uZXcgQS5FUyhDLldRLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLnIxPW5ldyBILklOKCJleHBhbmRDaGFuZ2VkIikKK0MucjE9bmV3IEgudHgoImV4cGFuZENoYW5nZWQiKQogQy5uUD1uZXcgQS5FUyhDLnIxLEMuaFUsITEsQy55UVAsITEsQy5kbikKLUMuTWM9bmV3IEguSU4oImZsYWdMaXN0IikKK0MuTWM9bmV3IEgudHgoImZsYWdMaXN0IikKIEMuZjA9bmV3IEEuRVMoQy5NYyxDLkJNLCExLEMuTVIxLCExLEMudWNQKQotQy5mbj1uZXcgSC5JTigiaW5zdGFuY2UiKQorQy5mbj1uZXcgSC50eCgiaW5zdGFuY2UiKQogQy5mej1uZXcgQS5FUyhDLmZuLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCi1DLnJFPW5ldyBILklOKCJmcmFtZSIpCi1DLktTPW5ldyBBLkVTKEMuckUsQy5CTSwhMSxDLlVaLCExLEMudWNQKQotQy5jZz1uZXcgSC5JTigiYW5jaG9yIikKK0MuckU9bmV3IEgudHgoImZyYW1lIikKK0MuS1M9bmV3IEEuRVMoQy5yRSxDLkJNLCExLEMuU1hLLCExLEMudWNQKQorQy5jZz1uZXcgSC50eCgiYW5jaG9yIikKIEMubGw9bmV3IEEuRVMoQy5jZyxDLkJNLCExLEMuR2gsITEsQy51Y1ApCiBDLm5nbT1JLnVMKFtDLkoxOV0pCiBDLlFzPW5ldyBBLkVTKEMuaTQsQy5CTSwhMCxDLnBNLCExLEMubmdtKQotQy5taT1uZXcgSC5JTigidGV4dCIpCitDLm1pPW5ldyBILnR4KCJ0ZXh0IikKIEMueVY9bmV3IEEuRVMoQy5taSxDLkJNLCExLEMuR2gsITEsQy5lc3gpCi1DLnRXPW5ldyBILklOKCJwb3MiKQorQy50Vz1uZXcgSC50eCgicG9zIikKIEMua0g9bmV3IEEuRVMoQy50VyxDLkJNLCExLEMueXcsITEsQy51Y1ApCi1DLnhQPW5ldyBILklOKCJyZWYiKQotQy5UTz1uZXcgQS5FUyhDLnhQLEMuQk0sITEsQy5TbU4sITEsQy51Y1ApCitDLmtZPW5ldyBILnR4KCJyZWYiKQorQy5UTz1uZXcgQS5FUyhDLmtZLEMuQk0sITEsQy5TbU4sITEsQy51Y1ApCiBDLm9xbz1ILklMKCdwRCcpCiBDLlVsPW5ldyBBLkVTKEMueWgsQy5CTSwhMSxDLm9xbywhMSxDLnVjUCkKIEMuUXA9bmV3IEEuRVMoQy5BVixDLkJNLCExLEMuZVAsITEsQy51Y1ApCi1DLnZiPW5ldyBILklOKCJwcm9maWxlIikKK0MudmI9bmV3IEgudHgoInByb2ZpbGUiKQogQy5NcT1uZXcgQS5FUyhDLnZiLEMuQk0sITEsQy5NUjEsITEsQy51Y1ApCiBDLm55PW5ldyBQLmE2KDApCiBDLlUzPUguVk0obmV3IFcuRmtPKCJjaGFuZ2UiKSxbVy5lYV0pCiBDLlQxPUguVk0obmV3IFcuRmtPKCJjbGljayIpLFtXLkFqWV0pCiBDLmk2PUguVk0obmV3IFcuRmtPKCJjbG9zZSIpLFtXLkJJXSkKIEMuaXc9SC5WTShuZXcgVy5Ga08oImRpc2Nvbm5lY3QiKSxbVy5QR10pCi1DLkpOPUguVk0obmV3IFcuRmtPKCJlcnJvciIpLFtXLmtmXSkKK0MuSk49SC5WTShuZXcgVy5Ga08oImVycm9yIiksW1cuZXc3XSkKIEMuTUQ9SC5WTShuZXcgVy5Ga08oImVycm9yIiksW1cuZWFdKQogQy5pMz1ILlZNKG5ldyBXLkZrTygiaW5wdXQiKSxbVy5lYV0pCi1DLkxGPUguVk0obmV3IFcuRmtPKCJsb2FkIiksW1cua2ZdKQorQy5MRj1ILlZNKG5ldyBXLkZrTygibG9hZCIpLFtXLmV3N10pCiBDLnBoPUguVk0obmV3IFcuRmtPKCJtZXNzYWdlIiksW1cuSHldKQogQy5XaHc9SC5WTShuZXcgVy5Ga08oIm1vdXNlZG93biIpLFtXLkFqWV0pCiBDLktxPUguVk0obmV3IFcuRmtPKCJtb3VzZW1vdmUiKSxbVy5BalldKQpAQCAtMjA0NjEsNyArMjA3MjIsNyBAQAogICBob29rcy5nZXRUYWcgPSBnZXRUYWdGaXhlZDsKICAgaG9va3MucHJvdG90eXBlRm9yVGFnID0gcHJvdG90eXBlRm9yVGFnRml4ZWQ7CiB9Ci1DLnhyPW5ldyBQLnBFKG51bGwsbnVsbCkKK0MueHI9bmV3IFAuYnlnKG51bGwsbnVsbCkKIEMuQTM9bmV3IFAuYzUobnVsbCkKIEMuY2I9bmV3IFAub2pGKG51bGwsbnVsbCkKIEMuRDg9bmV3IE4ucVYoIkZJTkVSIiw0MDApCkBAIC0yMDQ2OSwyMCArMjA3MzAsMjEgQEAKIEMuSUY9bmV3IE4ucVYoIklORk8iLDgwMCkKIEMuY2Q9bmV3IE4ucVYoIlNFVkVSRSIsMTAwMCkKIEMublQ9bmV3IE4ucVYoIldBUk5JTkciLDkwMCkKK0MuR2I9SC5WTShJLnVMKFsxMjcsMjA0Nyw2NTUzNSwxMTE0MTExXSksW1AuS05dKQogQy5ORz1JLnVMKFsxLDZdKQogQy5KSD1JLnVMKFswLDAsMjY2MjQsMTAyMywwLDAsNjU1MzQsMjA0N10pCi1DLlNWPW5ldyBILklOKCJrZXlzIikKLUMuVXE9bmV3IEguSU4oInZhbHVlcyIpCi1DLlduPW5ldyBILklOKCJsZW5ndGgiKQotQy5haT1uZXcgSC5JTigiaXNFbXB0eSIpCi1DLm5aPW5ldyBILklOKCJpc05vdEVtcHR5IikKK0MuU1Y9bmV3IEgudHgoImtleXMiKQorQy5VcT1uZXcgSC50eCgidmFsdWVzIikKK0MuV249bmV3IEgudHgoImxlbmd0aCIpCitDLmFpPW5ldyBILnR4KCJpc0VtcHR5IikKK0Mublo9bmV3IEgudHgoImlzTm90RW1wdHkiKQogQy5adz1JLnVMKFtDLlNWLEMuVXEsQy5XbixDLmFpLEMublpdKQogQy5mVz1ILlZNKEkudUwoWyIrIiwiLSIsIioiLCIvIiwiJSIsIl4iLCI9PSIsIiE9IiwiPiIsIjwiLCI+PSIsIjw9IiwifHwiLCImJiIsIiYiLCI9PT0iLCIhPT0iLCJ8Il0pLFtQLnFVXSkKLUMuTkw9SS51TChbMCwwLDI2NjI0LDEwMjMsNjU1MzQsMjA0Nyw2NTUzNCwyMDQ3XSkKK0MubUt5PUkudUwoWzAsMCwyNjYyNCwxMDIzLDY1NTM0LDIwNDcsNjU1MzQsMjA0N10pCiBDLnlEPUkudUwoWzAsMCwyNjQ5OCwxMDIzLDY1NTM0LDM0ODE1LDY1NTM0LDE4NDMxXSkKLUMuTjQ9SC5JTCgnbmQnKQotQy5DZD1JLnVMKFtDLk40XSkKLUMuRzg9SS51TChbIj09IiwiIT0iLCI8PSIsIj49IiwifHwiLCImJiJdKQorQy5wemM9SC5JTCgnbmQnKQorQy5DZD1JLnVMKFtDLnB6Y10pCitDLkZuPUkudUwoWyI9PSIsIiE9IiwiPD0iLCI+PSIsInx8IiwiJiYiXSkKIEMub1A9SS51TChbImFzIiwiaW4iLCJ0aGlzIl0pCiBDLlFDPUkudUwoWyJyb3dDb2xvcjAiLCJyb3dDb2xvcjEiLCJyb3dDb2xvcjIiLCJyb3dDb2xvcjMiLCJyb3dDb2xvcjQiLCJyb3dDb2xvcjUiLCJyb3dDb2xvcjYiLCJyb3dDb2xvcjciLCJyb3dDb2xvcjgiXSkKIEMuYmc9SS51TChbNDMsNDUsNDIsNDcsMzMsMzgsMzcsNjAsNjEsNjIsNjMsOTQsMTI0XSkKQEAgLTIwNDk2LDIwMCArMjA3NTgsMjE0IEBACiBDLmZFPW5ldyBILlB4KDE0LHtkb21mb2N1c291dDoiRE9NRm9jdXNPdXQiLGRvbWZvY3VzaW46IkRPTUZvY3VzSW4iLGRvbW1vdXNlc2Nyb2xsOiJET01Nb3VzZVNjcm9sbCIsYW5pbWF0aW9uZW5kOiJ3ZWJraXRBbmltYXRpb25FbmQiLGFuaW1hdGlvbml0ZXJhdGlvbjoid2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uIixhbmltYXRpb25zdGFydDoid2Via2l0QW5pbWF0aW9uU3RhcnQiLGRvdWJsZWNsaWNrOiJkYmxjbGljayIsZnVsbHNjcmVlbmNoYW5nZToid2Via2l0ZnVsbHNjcmVlbmNoYW5nZSIsZnVsbHNjcmVlbmVycm9yOiJ3ZWJraXRmdWxsc2NyZWVuZXJyb3IiLGtleWFkZGVkOiJ3ZWJraXRrZXlhZGRlZCIsa2V5ZXJyb3I6IndlYmtpdGtleWVycm9yIixrZXltZXNzYWdlOiJ3ZWJraXRrZXltZXNzYWdlIixuZWVka2V5OiJ3ZWJraXRuZWVka2V5IixzcGVlY2hjaGFuZ2U6IndlYmtpdFNwZWVjaENoYW5nZSJ9LEMuVmd2KQogQy5yV2M9SS51TChbIm5hbWUiLCJleHRlbmRzIiwiY29uc3RydWN0b3IiLCJub3NjcmlwdCIsImFzc2V0cGF0aCIsImNhY2hlLWNzc3RleHQiLCJhdHRyaWJ1dGVzIl0pCiBDLm43PW5ldyBILlB4KDcse25hbWU6MSxleHRlbmRzOjEsY29uc3RydWN0b3I6MSxub3NjcmlwdDoxLGFzc2V0cGF0aDoxLCJjYWNoZS1jc3N0ZXh0IjoxLGF0dHJpYnV0ZXM6MX0sQy5yV2MpCi1DLlkxPUkudUwoWyIhIiwiOiIsIiwiLCIpIiwiXSIsIn0iLCI/IiwifHwiLCImJiIsInwiLCJeIiwiJiIsIiE9IiwiPT0iLCIhPT0iLCI9PT0iLCI+PSIsIj4iLCI8PSIsIjwiLCIrIiwiLSIsIiUiLCIvIiwiKiIsIigiLCJbIiwiLiIsInsiXSkKLUMubHg9bmV3IEguUHgoMjkseyIhIjowLCI6IjowLCIsIjowLCIpIjowLCJdIjowLCJ9IjowLCI/IjoxLCJ8fCI6MiwiJiYiOjMsInwiOjQsIl4iOjUsIiYiOjYsIiE9Ijo3LCI9PSI6NywiIT09Ijo3LCI9PT0iOjcsIj49Ijo4LCI+Ijo4LCI8PSI6OCwiPCI6OCwiKyI6OSwiLSI6OSwiJSI6MTAsIi8iOjEwLCIqIjoxMCwiKCI6MTEsIlsiOjExLCIuIjoxMSwieyI6MTF9LEMuWTEpCitDLmtLaT1JLnVMKFsiISIsIjoiLCIsIiwiKSIsIl0iLCJ9IiwiPyIsInx8IiwiJiYiLCJ8IiwiXiIsIiYiLCIhPSIsIj09IiwiIT09IiwiPT09IiwiPj0iLCI+IiwiPD0iLCI8IiwiKyIsIi0iLCIlIiwiLyIsIioiLCIoIiwiWyIsIi4iLCJ7Il0pCitDLmx4PW5ldyBILlB4KDI5LHsiISI6MCwiOiI6MCwiLCI6MCwiKSI6MCwiXSI6MCwifSI6MCwiPyI6MSwifHwiOjIsIiYmIjozLCJ8Ijo0LCJeIjo1LCImIjo2LCIhPSI6NywiPT0iOjcsIiE9PSI6NywiPT09Ijo3LCI+PSI6OCwiPiI6OCwiPD0iOjgsIjwiOjgsIisiOjksIi0iOjksIiUiOjEwLCIvIjoxMCwiKiI6MTAsIigiOjExLCJbIjoxMSwiLiI6MTEsInsiOjExfSxDLmtLaSkKIEMuQ009bmV3IEguUHgoMCx7fSxDLmRuKQogQy5NRUc9SS51TChbImVudW1lcmF0ZSJdKQotQy52YT1uZXcgSC5QeCgxLHtlbnVtZXJhdGU6Sy5wZygpfSxDLk1FRykKK0MudmE9bmV3IEguUHgoMSx7ZW51bWVyYXRlOksuVU0oKX0sQy5NRUcpCiBDLnRxPUguSUwoJ0JvJykKIEMudXdqPUguSUwoJ3dBJykKIEMud0U9SS51TChbQy51d2pdKQotQy5Yaz1uZXcgQS5XcSghMSwhMSwhMCxDLnRxLCExLCEwLEMud0UsbnVsbCkKK0MuVGI9bmV3IEEuV3EoITEsITEsITAsQy50cSwhMSwhMCxDLndFLG51bGwpCiBDLnVEaz1ILklMKCdoRycpCiBDLnRtRj1JLnVMKFtDLnVEa10pCiBDLmFqPW5ldyBBLldxKCEwLCEwLCEwLEMudHEsITEsITEsQy50bUYsbnVsbCkKLUMud2o9bmV3IEQuTTl4KCJJbnRlcm5hbCIpCi1DLkNuPW5ldyBELk05eCgiTGlzdGVuaW5nIikKLUMubFQ9bmV3IEQuTTl4KCJOb3JtYWwiKQotQy5GSj1uZXcgRC5NOXgoIlBpcGUiKQotQy5CRT1uZXcgSC5JTigiYXZlcmFnZUNvbGxlY3Rpb25QZXJpb2RJbk1pbGxpcyIpCi1DLklIPW5ldyBILklOKCJhZGRyZXNzIikKLUMuajI9bmV3IEguSU4oImFwcCIpCi1DLmtlPW5ldyBILklOKCJhcmNoaXRlY3R1cmUiKQotQy5FVD1uZXcgSC5JTigiYXNzZXJ0c0VuYWJsZWQiKQotQy5XQz1uZXcgSC5JTigiYnB0IikKLUMuaFI9bmV3IEguSU4oImJyZWFrcG9pbnQiKQotQy5Sbz1uZXcgSC5JTigiYnV0dG9uQ2xpY2siKQotQy5oTj1uZXcgSC5JTigiYnl0ZXMiKQotQy5LYT1uZXcgSC5JTigiY2FsbCIpCi1DLmJWPW5ldyBILklOKCJjYXBhY2l0eSIpCi1DLkMwPW5ldyBILklOKCJjaGFuZ2UiKQotQy5lWj1uZXcgSC5JTigiY2hhbmdlU29ydCIpCi1DLk9JPW5ldyBILklOKCJjbGFzc2VzIikKLUMuSTk9bmV3IEguSU4oImNsb3NlSXRlbSIpCi1DLlRvPW5ldyBILklOKCJjbG9zaW5nIikKLUMuV0c9bmV3IEguSU4oImNvbGxlY3Rpb25zIikKLUMucXQ9bmV3IEguSU4oImNvbG9yaW5nIikKLUMucDE9bmV3IEguSU4oImNvbHVtbnMiKQotQy55Sj1uZXcgSC5JTigiY29ubmVjdFN0YW5kYWxvbmUiKQotQy5sYT1uZXcgSC5JTigiY29ubmVjdFRvVm0iKQotQy5KZT1uZXcgSC5JTigiY3VycmVudCIpCi1DLkx3PW5ldyBILklOKCJkZWxldGVWbSIpCi1DLmlFPW5ldyBILklOKCJkZXNjcmlwdG9yIikKLUMuZjQ9bmV3IEguSU4oImRlc2NyaXB0b3JzIikKLUMuYUs9bmV3IEguSU4oImRvQWN0aW9uIikKLUMuR1A9bmV3IEguSU4oImVsZW1lbnQiKQotQy5GZT1uZXcgSC5JTigiZW5kVG9rZW5Qb3MiKQotQy50UD1uZXcgSC5JTigiZW50cnkiKQotQy5aYj1uZXcgSC5JTigiZXZhbCIpCi1DLnU3PW5ldyBILklOKCJldmFsTm93IikKLUMucVI9bmV3IEguSU4oImV2ZW50VHlwZSIpCi1DLkVrPW5ldyBILklOKCJleHBhbmRlciIpCi1DLlBuPW5ldyBILklOKCJleHBhbmRlclN0eWxlIikKLUMuaDc9bmV3IEguSU4oImV4dGVybmFsIikKLUMuUjM9bmV3IEguSU4oImZkIikKLUMuZlY9bmV3IEguSU4oImZpZWxkcyIpCi1DLkdkPW5ldyBILklOKCJmaXJzdFRva2VuUG9zIikKLUMuRlA9bmV3IEguSU4oImZvcm1hdFNpemUiKQotQy5rRj1uZXcgSC5JTigiZm9ybWF0VGltZSIpCi1DLlVEPW5ldyBILklOKCJmb3JtYXR0ZWRBZGRyZXNzIikKLUMuQXE9bmV3IEguSU4oImZvcm1hdHRlZEF2ZXJhZ2UiKQotQy5EUz1uZXcgSC5JTigiZm9ybWF0dGVkQ29sbGVjdGlvbnMiKQotQy5DOT1uZXcgSC5JTigiZm9ybWF0dGVkRGVvcHRJZCIpCi1DLlZGPW5ldyBILklOKCJmb3JtYXR0ZWRFeGNsdXNpdmUiKQotQy51VT1uZXcgSC5JTigiZm9ybWF0dGVkRXhjbHVzaXZlVGlja3MiKQotQy5ZSj1uZXcgSC5JTigiZm9ybWF0dGVkSW5jbHVzaXZlIikKLUMuZUY9bmV3IEguSU4oImZvcm1hdHRlZEluY2x1c2l2ZVRpY2tzIikKLUMub0k9bmV3IEguSU4oImZvcm1hdHRlZExpbmUiKQotQy5TVD1uZXcgSC5JTigiZm9ybWF0dGVkVG90YWxDb2xsZWN0aW9uVGltZSIpCi1DLkVJPW5ldyBILklOKCJmdW5jdGlvbnMiKQotQy5KQj1uZXcgSC5JTigiZ2V0Q29sdW1uTGFiZWwiKQotQy5SWT1uZXcgSC5JTigiZ2V0VGFicyIpCi1DLmQ0PW5ldyBILklOKCJnb3RvIikKLUMuY0Y9bmV3IEguSU4oImdvdG9MaW5rIikKLUMuU0k9bmV3IEguSU4oImhhc0Rlc2NyaXB0b3JzIikKLUMuelM9bmV3IEguSU4oImhhc0Rpc2Fzc2VtYmx5IikKLUMuWUE9bmV3IEguSU4oImhhc05vQWxsb2NhdGlvbnMiKQotQy5HZT1uZXcgSC5JTigiaGFzaExpbmtXb3JrYXJvdW5kIikKLUMuaW09bmV3IEguSU4oImhpc3RvcnkiKQotQy5Tcz1uZXcgSC5JTigiaGl0cyIpCi1DLms2PW5ldyBILklOKCJob3ZlclRleHQiKQotQy5QSj1uZXcgSC5JTigiaHVtYW4iKQotQy5xMj1uZXcgSC5JTigiaWRsZSIpCi1DLmQyPW5ldyBILklOKCJpbXAiKQotQy5rTj1uZXcgSC5JTigiaW1wb3J0cyIpCi1DLmVKPW5ldyBILklOKCJpbnN0cnVjdGlvbiIpCi1DLmlHPW5ldyBILklOKCJpbnN0cnVjdGlvbnMiKQotQy5QeT1uZXcgSC5JTigiaW50ZXJmYWNlIikKLUMucEM9bmV3IEguSU4oImludGVyZmFjZXMiKQotQy5pQT1uZXcgSC5JTigiaW9FbmFibGVkIikKLUMuWEg9bmV3IEguSU4oImlzQWJzdHJhY3QiKQotQy50Sj1uZXcgSC5JTigiaXNCb29sIikKLUMuRjg9bmV3IEguSU4oImlzQ2hyb21lVGFyZ2V0IikKLUMuQzE9bmV3IEguSU4oImlzQ29tbWVudCIpCi1DLkQ2PW5ldyBILklOKCJpc0NvbnN0IikKLUMubkw9bmV3IEguSU4oImlzQ3VycmVudFRhcmdldCIpCi1DLllnPW5ldyBILklOKCJpc0RhcnRDb2RlIikKLUMuYlI9bmV3IEguSU4oImlzRG91YmxlIikKLUMub2I9bmV3IEguSU4oImlzRXJyb3IiKQotQy5XVj1uZXcgSC5JTigiaXNGaW5hbGl6ZWQiKQotQy5JaD1uZXcgSC5JTigiaXNJbXBsZW1lbnRlZCIpCi1DLkl2PW5ldyBILklOKCJpc0luc3RhbmNlIikKLUMuV2c9bmV3IEguSU4oImlzSW50IikKLUMudEQ9bmV3IEguSU4oImlzTGlzdCIpCi1DLk9mPW5ldyBILklOKCJpc051bGwiKQotQy5wWT1uZXcgSC5JTigiaXNPcHRpbWl6ZWQiKQotQy5YTD1uZXcgSC5JTigiaXNQYXRjaCIpCi1DLkxBPW5ldyBILklOKCJpc1BpcGUiKQotQy5Maz1uZXcgSC5JTigiaXNTdHJpbmciKQotQy5kSz1uZXcgSC5JTigiaXNUeXBlIikKLUMueGY9bmV3IEguSU4oImlzVW5leHBlY3RlZCIpCi1DLkp4PW5ldyBILklOKCJpc29sYXRlcyIpCi1DLmI1PW5ldyBILklOKCJqdW1wVGFyZ2V0IikKLUMua0E9bmV3IEguSU4oImxhc3RUb2tlblBvcyIpCi1DLkdJPW5ldyBILklOKCJsYXN0VXBkYXRlIikKLUMudXI9bmV3IEguSU4oImxpYiIpCi1DLlZOPW5ldyBILklOKCJsaWJyYXJpZXMiKQotQy5WST1uZXcgSC5JTigibGluZSIpCi1DLnI2PW5ldyBILklOKCJsaW5lTnVtYmVyIikKLUMuTVc9bmV3IEguSU4oImxpbmVOdW1iZXJzIikKLUMuY2M9bmV3IEguSU4oImxpc3RlbmluZyIpCi1DLkRZPW5ldyBILklOKCJsb2FkaW5nIikKLUMuTHg9bmV3IEguSU4oImxvY2FsQWRkcmVzcyIpCi1DLk0zPW5ldyBILklOKCJsb2NhbFBvcnQiKQotQy53VD1uZXcgSC5JTigibWFpblBvcnQiKQotQy5wWD1uZXcgSC5JTigibWVzc2FnZSIpCi1DLlZEPW5ldyBILklOKCJtb3VzZU91dCIpCi1DLk5OPW5ldyBILklOKCJtb3VzZU92ZXIiKQotQy5ZUz1uZXcgSC5JTigibmFtZSIpCi1DLnB1PW5ldyBILklOKCJuYW1lSXNFbXB0eSIpCi1DLkJKPW5ldyBILklOKCJuZXdTcGFjZSIpCi1DLk9WPW5ldyBILklOKCJub1N1Y2hNZXRob2QiKQotQy5jNj1uZXcgSC5JTigibm90aWZpY2F0aW9ucyIpCi1DLmpvPW5ldyBILklOKCJvYmplY3RDbGFzcyIpCi1DLnpPPW5ldyBILklOKCJvYmplY3RQb29sIikKLUMudmc9bmV3IEguSU4oIm9sZFNwYWNlIikKLUMuem09bmV3IEguSU4oInBhZGRpbmciKQotQy5JYz1uZXcgSC5JTigicGF1c2UiKQotQy55Rz1uZXcgSC5JTigicGF1c2VFdmVudCIpCi1DLnVJPW5ldyBILklOKCJwaWQiKQotQy5BWT1uZXcgSC5JTigicHJvdG9jb2wiKQotQy5YZD1uZXcgSC5JTigicmVhY2hhYmxlIikKLUMuSTc9bmV3IEguSU4oInJlYWRDbG9zZWQiKQotQy5HUj1uZXcgSC5JTigicmVmcmVzaCIpCi1DLktYPW5ldyBILklOKCJyZWZyZXNoQ292ZXJhZ2UiKQotQy5qYT1uZXcgSC5JTigicmVmcmVzaEdDIikKLUMuTVQ9bmV3IEguSU4oInJlZ2lzdGVyQ2FsbGJhY2siKQotQy5pcj1uZXcgSC5JTigicmVsYXRpdmVMaW5rIikKLUMuZHg9bmV3IEguSU4oInJlbW90ZUFkZHJlc3MiKQotQy5uaT1uZXcgSC5JTigicmVtb3RlUG9ydCIpCi1DLlgyPW5ldyBILklOKCJyZXNldEFjY3VtdWxhdG9yIikKLUMuRjM9bmV3IEguSU4oInJlc3BvbnNlIikKLUMublk9bmV3IEguSU4oInJlc3VtZSIpCi1DLkhEPW5ldyBILklOKCJyZXRhaW5lZFNpemUiKQotQy5pVT1uZXcgSC5JTigicmV0YWluaW5nUGF0aCIpCi1DLmVOPW5ldyBILklOKCJyb290TGliIikKLUMudWU9bmV3IEguSU4oInJvdyIpCi1DLm5oPW5ldyBILklOKCJyb3dzIikKLUMuTDI9bmV3IEguSU4oInJ1bm5pbmciKQotQy5FQT1uZXcgSC5JTigic2NyaXB0cyIpCi1DLm9XPW5ldyBILklOKCJzZWxlY3RFeHByIikKLUMuaGQ9bmV3IEguSU4oInNlcnZpY2VUeXBlIikKLUMuak09bmV3IEguSU4oInNvY2tldE93bmVyIikKLUMuSE89bmV3IEguSU4oInN0YWNrdHJhY2UiKQotQy5XNT1uZXcgSC5JTigic3RhbmRhbG9uZSIpCi1DLnhBPW5ldyBILklOKCJzdHlsZUZvckhpdHMiKQotQy5rNT1uZXcgSC5JTigic3ViQ2xhc3NlcyIpCi1DLk52PW5ldyBILklOKCJzdWJjbGFzcyIpCi1DLkN3PW5ldyBILklOKCJzdXBlckNsYXNzIikKLUMuUUY9bmV3IEguSU4oInRhcmdldHMiKQotQy5oTz1uZXcgSC5JTigidGlwRXhjbHVzaXZlIikKLUMuZWk9bmV3IEguSU4oInRpcEtpbmQiKQotQy5ISz1uZXcgSC5JTigidGlwUGFyZW50IikKLUMuamU9bmV3IEguSU4oInRpcFRpY2tzIikKLUMuRWY9bmV3IEguSU4oInRpcFRpbWUiKQotQy5SSD1uZXcgSC5JTigidG9TdHJpbmdBc0ZpeGVkIikKLUMuUTE9bmV3IEguSU4oInRvZ2dsZUV4cGFuZCIpCi1DLklEPW5ldyBILklOKCJ0b2dnbGVFeHBhbmRlZCIpCi1DLno2PW5ldyBILklOKCJ0b2tlblBvcyIpCi1DLmJjPW5ldyBILklOKCJ0b3BGcmFtZSIpCi1DLkpsPW5ldyBILklOKCJ0b3RhbENvbGxlY3Rpb25UaW1lSW5TZWNvbmRzIikKLUMuS2o9bmV3IEguSU4oInRvdGFsU2FtcGxlc0luUHJvZmlsZSIpCi1DLmVwPW5ldyBILklOKCJ0cmVlIikKLUMuSjI9bmV3IEguSU4oInR5cGVDaGVja3NFbmFibGVkIikKLUMuYm49bmV3IEguSU4oInVwZGF0ZUxpbmVNb2RlIikKLUMubWg9bmV3IEguSU4oInVwdGltZSIpCi1DLkZoPW5ldyBILklOKCJ1cmwiKQotQy5MUD1uZXcgSC5JTigidXNlZCIpCi1DLmpoPW5ldyBILklOKCJ2IikKLUMubHM9bmV3IEguSU4oInZhbHVlIikKLUMuZmo9bmV3IEguSU4oInZhcmlhYmxlIikKLUMueHc9bmV3IEguSU4oInZhcmlhYmxlcyIpCi1DLnpuPW5ldyBILklOKCJ2ZXJzaW9uIikKLUMuVGM9bmV3IEguSU4oInZtTmFtZSIpCi1DLlV5PW5ldyBILklOKCJ3cml0ZUNsb3NlZCIpCitDLndqPW5ldyBELmw4UigiSW50ZXJuYWwiKQorQy5Dbj1uZXcgRC5sOFIoIkxpc3RlbmluZyIpCitDLmxUPW5ldyBELmw4UigiTm9ybWFsIikKK0MuRko9bmV3IEQubDhSKCJQaXBlIikKK0MuQkU9bmV3IEgudHgoImF2ZXJhZ2VDb2xsZWN0aW9uUGVyaW9kSW5NaWxsaXMiKQorQy5JSD1uZXcgSC50eCgiYWRkcmVzcyIpCitDLmoyPW5ldyBILnR4KCJhcHAiKQorQy5rZT1uZXcgSC50eCgiYXJjaGl0ZWN0dXJlIikKK0MuRVQ9bmV3IEgudHgoImFzc2VydHNFbmFibGVkIikKK0MuV0M9bmV3IEgudHgoImJwdCIpCitDLmhSPW5ldyBILnR4KCJicmVha3BvaW50IikKK0MuUm89bmV3IEgudHgoImJ1dHRvbkNsaWNrIikKK0MuaE49bmV3IEgudHgoImJ5dGVzIikKK0MuS2E9bmV3IEgudHgoImNhbGwiKQorQy5iVj1uZXcgSC50eCgiY2FwYWNpdHkiKQorQy5DMD1uZXcgSC50eCgiY2hhbmdlIikKK0MuZVo9bmV3IEgudHgoImNoYW5nZVNvcnQiKQorQy5PST1uZXcgSC50eCgiY2xhc3NlcyIpCitDLkk5PW5ldyBILnR4KCJjbG9zZUl0ZW0iKQorQy5Ubz1uZXcgSC50eCgiY2xvc2luZyIpCitDLldHPW5ldyBILnR4KCJjb2xsZWN0aW9ucyIpCitDLnF0PW5ldyBILnR4KCJjb2xvcmluZyIpCitDLnAxPW5ldyBILnR4KCJjb2x1bW5zIikKK0MueUo9bmV3IEgudHgoImNvbm5lY3RTdGFuZGFsb25lIikKK0MubGE9bmV3IEgudHgoImNvbm5lY3RUb1ZtIikKK0MuSmU9bmV3IEgudHgoImN1cnJlbnQiKQorQy5SRz1uZXcgSC50eCgiY3VycmVudFBhZ2UiKQorQy5Mdz1uZXcgSC50eCgiZGVsZXRlVm0iKQorQy5lUj1uZXcgSC50eCgiZGVvcHRpbWl6YXRpb25zIikKK0MuaUU9bmV3IEgudHgoImRlc2NyaXB0b3IiKQorQy5mND1uZXcgSC50eCgiZGVzY3JpcHRvcnMiKQorQy5hSz1uZXcgSC50eCgiZG9BY3Rpb24iKQorQy5HUD1uZXcgSC50eCgiZWxlbWVudCIpCitDLkZlPW5ldyBILnR4KCJlbmRUb2tlblBvcyIpCitDLnRQPW5ldyBILnR4KCJlbnRyeSIpCitDLlpiPW5ldyBILnR4KCJldmFsIikKK0MudTc9bmV3IEgudHgoImV2YWxOb3ciKQorQy5xUj1uZXcgSC50eCgiZXZlbnRUeXBlIikKK0MuRWs9bmV3IEgudHgoImV4cGFuZGVyIikKK0MuUG49bmV3IEgudHgoImV4cGFuZGVyU3R5bGUiKQorQy5oNz1uZXcgSC50eCgiZXh0ZXJuYWwiKQorQy5SMz1uZXcgSC50eCgiZmQiKQorQy5mVj1uZXcgSC50eCgiZmllbGRzIikKK0MuR2Q9bmV3IEgudHgoImZpcnN0VG9rZW5Qb3MiKQorQy5GUD1uZXcgSC50eCgiZm9ybWF0U2l6ZSIpCitDLmtGPW5ldyBILnR4KCJmb3JtYXRUaW1lIikKK0MuVUQ9bmV3IEgudHgoImZvcm1hdHRlZEFkZHJlc3MiKQorQy5BcT1uZXcgSC50eCgiZm9ybWF0dGVkQXZlcmFnZSIpCitDLkRTPW5ldyBILnR4KCJmb3JtYXR0ZWRDb2xsZWN0aW9ucyIpCitDLkM5PW5ldyBILnR4KCJmb3JtYXR0ZWREZW9wdElkIikKK0MuVkY9bmV3IEgudHgoImZvcm1hdHRlZEV4Y2x1c2l2ZSIpCitDLnVVPW5ldyBILnR4KCJmb3JtYXR0ZWRFeGNsdXNpdmVUaWNrcyIpCitDLllKPW5ldyBILnR4KCJmb3JtYXR0ZWRJbmNsdXNpdmUiKQorQy5lRj1uZXcgSC50eCgiZm9ybWF0dGVkSW5jbHVzaXZlVGlja3MiKQorQy5vST1uZXcgSC50eCgiZm9ybWF0dGVkTGluZSIpCitDLlNUPW5ldyBILnR4KCJmb3JtYXR0ZWRUb3RhbENvbGxlY3Rpb25UaW1lIikKK0MuRUk9bmV3IEgudHgoImZ1bmN0aW9ucyIpCitDLkpCPW5ldyBILnR4KCJnZXRDb2x1bW5MYWJlbCIpCitDLlJZPW5ldyBILnR4KCJnZXRUYWJzIikKK0MuZDQ9bmV3IEgudHgoImdvdG8iKQorQy5jRj1uZXcgSC50eCgiZ290b0xpbmsiKQorQy5TST1uZXcgSC50eCgiaGFzRGVzY3JpcHRvcnMiKQorQy56Uz1uZXcgSC50eCgiaGFzRGlzYXNzZW1ibHkiKQorQy5ZQT1uZXcgSC50eCgiaGFzTm9BbGxvY2F0aW9ucyIpCitDLkdlPW5ldyBILnR4KCJoYXNoTGlua1dvcmthcm91bmQiKQorQy5pbT1uZXcgSC50eCgiaGlzdG9yeSIpCitDLlNzPW5ldyBILnR4KCJoaXRzIikKK0MuazY9bmV3IEgudHgoImhvdmVyVGV4dCIpCitDLlBKPW5ldyBILnR4KCJodW1hbiIpCitDLnEyPW5ldyBILnR4KCJpZGxlIikKK0MuZDI9bmV3IEgudHgoImltcCIpCitDLmtOPW5ldyBILnR4KCJpbXBvcnRzIikKK0MuZUo9bmV3IEgudHgoImluc3RydWN0aW9uIikKK0MuaUc9bmV3IEgudHgoImluc3RydWN0aW9ucyIpCitDLlB5PW5ldyBILnR4KCJpbnRlcmZhY2UiKQorQy5wQz1uZXcgSC50eCgiaW50ZXJmYWNlcyIpCitDLmlBPW5ldyBILnR4KCJpb0VuYWJsZWQiKQorQy5YSD1uZXcgSC50eCgiaXNBYnN0cmFjdCIpCitDLnRKPW5ldyBILnR4KCJpc0Jvb2wiKQorQy5GOD1uZXcgSC50eCgiaXNDaHJvbWVUYXJnZXQiKQorQy5DMT1uZXcgSC50eCgiaXNDb21tZW50IikKK0MuTnI9bmV3IEgudHgoImlzQ29uc3QiKQorQy5uTD1uZXcgSC50eCgiaXNDdXJyZW50VGFyZ2V0IikKK0MuYTA9bmV3IEgudHgoImlzRGFydCIpCitDLllnPW5ldyBILnR4KCJpc0RhcnRDb2RlIikKK0MuYlI9bmV3IEgudHgoImlzRG91YmxlIikKK0Mub2I9bmV3IEgudHgoImlzRXJyb3IiKQorQy5XVj1uZXcgSC50eCgiaXNGaW5hbGl6ZWQiKQorQy5JaD1uZXcgSC50eCgiaXNJbXBsZW1lbnRlZCIpCitDLk1ZPW5ldyBILnR4KCJpc0lubGluYWJsZSIpCitDLkl2PW5ldyBILnR4KCJpc0luc3RhbmNlIikKK0MuV2c9bmV3IEgudHgoImlzSW50IikKK0MudEQ9bmV3IEgudHgoImlzTGlzdCIpCitDLk9mPW5ldyBILnR4KCJpc051bGwiKQorQy5WbD1uZXcgSC50eCgiaXNPcHRpbWl6YWJsZSIpCitDLnBZPW5ldyBILnR4KCJpc09wdGltaXplZCIpCitDLlhMPW5ldyBILnR4KCJpc1BhdGNoIikKK0MuTEE9bmV3IEgudHgoImlzUGlwZSIpCitDLkFUPW5ldyBILnR4KCJpc1N0YXRpYyIpCitDLkxrPW5ldyBILnR4KCJpc1N0cmluZyIpCitDLmRLPW5ldyBILnR4KCJpc1R5cGUiKQorQy54Zj1uZXcgSC50eCgiaXNVbmV4cGVjdGVkIikKK0MuSng9bmV3IEgudHgoImlzb2xhdGVzIikKK0MuYjU9bmV3IEgudHgoImp1bXBUYXJnZXQiKQorQy5MYz1uZXcgSC50eCgia2luZCIpCitDLmtBPW5ldyBILnR4KCJsYXN0VG9rZW5Qb3MiKQorQy5HST1uZXcgSC50eCgibGFzdFVwZGF0ZSIpCitDLnVyPW5ldyBILnR4KCJsaWIiKQorQy5WTj1uZXcgSC50eCgibGlicmFyaWVzIikKK0MuVkk9bmV3IEgudHgoImxpbmUiKQorQy5jYz1uZXcgSC50eCgibGlzdGVuaW5nIikKK0MuRFk9bmV3IEgudHgoImxvYWRpbmciKQorQy5MeD1uZXcgSC50eCgibG9jYWxBZGRyZXNzIikKK0MuTTM9bmV3IEgudHgoImxvY2FsUG9ydCIpCitDLndUPW5ldyBILnR4KCJtYWluUG9ydCIpCitDLkpLPW5ldyBILnR4KCJtYWtlTGluZUlkIikKK0MucFg9bmV3IEgudHgoIm1lc3NhZ2UiKQorQy5WRD1uZXcgSC50eCgibW91c2VPdXQiKQorQy5OTj1uZXcgSC50eCgibW91c2VPdmVyIikKK0MuWVM9bmV3IEgudHgoIm5hbWUiKQorQy5wdT1uZXcgSC50eCgibmFtZUlzRW1wdHkiKQorQy5CSj1uZXcgSC50eCgibmV3U3BhY2UiKQorQy5PVj1uZXcgSC50eCgibm9TdWNoTWV0aG9kIikKK0MuYzY9bmV3IEgudHgoIm5vdGlmaWNhdGlvbnMiKQorQy5qbz1uZXcgSC50eCgib2JqZWN0Q2xhc3MiKQorQy56Tz1uZXcgSC50eCgib2JqZWN0UG9vbCIpCitDLnZnPW5ldyBILnR4KCJvbGRTcGFjZSIpCitDLllWPW5ldyBILnR4KCJvd25pbmdDbGFzcyIpCitDLklmPW5ldyBILnR4KCJvd25pbmdMaWJyYXJ5IikKK0Muem09bmV3IEgudHgoInBhZGRpbmciKQorQy5uWD1uZXcgSC50eCgicGFyZW50IikKK0MueFA9bmV3IEgudHgoInBhcnNlSW50IikKK0MuSWM9bmV3IEgudHgoInBhdXNlIikKK0MueUc9bmV3IEgudHgoInBhdXNlRXZlbnQiKQorQy51ST1uZXcgSC50eCgicGlkIikKK0MuQVk9bmV3IEgudHgoInByb3RvY29sIikKK0MuQU89bmV3IEgudHgoInF1YWxpZmllZE5hbWUiKQorQy5YZD1uZXcgSC50eCgicmVhY2hhYmxlIikKK0MuSTc9bmV3IEgudHgoInJlYWRDbG9zZWQiKQorQy5HUj1uZXcgSC50eCgicmVmcmVzaCIpCitDLktYPW5ldyBILnR4KCJyZWZyZXNoQ292ZXJhZ2UiKQorQy5qYT1uZXcgSC50eCgicmVmcmVzaEdDIikKK0MuTVQ9bmV3IEgudHgoInJlZ2lzdGVyQ2FsbGJhY2siKQorQy5pcj1uZXcgSC50eCgicmVsYXRpdmVMaW5rIikKK0MuZHg9bmV3IEgudHgoInJlbW90ZUFkZHJlc3MiKQorQy5uaT1uZXcgSC50eCgicmVtb3RlUG9ydCIpCitDLlgyPW5ldyBILnR4KCJyZXNldEFjY3VtdWxhdG9yIikKK0MuRjM9bmV3IEgudHgoInJlc3BvbnNlIikKK0Mublk9bmV3IEgudHgoInJlc3VtZSIpCitDLkhEPW5ldyBILnR4KCJyZXRhaW5lZFNpemUiKQorQy5pVT1uZXcgSC50eCgicmV0YWluaW5nUGF0aCIpCitDLmVOPW5ldyBILnR4KCJyb290TGliIikKK0MudWU9bmV3IEgudHgoInJvdyIpCitDLm5oPW5ldyBILnR4KCJyb3dzIikKK0MuTDI9bmV3IEgudHgoInJ1bm5pbmciKQorQy5FQT1uZXcgSC50eCgic2NyaXB0cyIpCitDLm9XPW5ldyBILnR4KCJzZWxlY3RFeHByIikKK0MuaGQ9bmV3IEgudHgoInNlcnZpY2VUeXBlIikKK0Muak09bmV3IEgudHgoInNvY2tldE93bmVyIikKK0MuSE89bmV3IEgudHgoInN0YWNrdHJhY2UiKQorQy5XNT1uZXcgSC50eCgic3RhbmRhbG9uZSIpCitDLms1PW5ldyBILnR4KCJzdWJDbGFzc2VzIikKK0MuTnY9bmV3IEgudHgoInN1YmNsYXNzIikKK0MuQ3c9bmV3IEgudHgoInN1cGVyQ2xhc3MiKQorQy5RRj1uZXcgSC50eCgidGFyZ2V0cyIpCitDLmhPPW5ldyBILnR4KCJ0aXBFeGNsdXNpdmUiKQorQy5laT1uZXcgSC50eCgidGlwS2luZCIpCitDLkhLPW5ldyBILnR4KCJ0aXBQYXJlbnQiKQorQy5qZT1uZXcgSC50eCgidGlwVGlja3MiKQorQy5FZj1uZXcgSC50eCgidGlwVGltZSIpCitDLlFMPW5ldyBILnR4KCJ0b1N0cmluZyIpCitDLlJIPW5ldyBILnR4KCJ0b1N0cmluZ0FzRml4ZWQiKQorQy5RMT1uZXcgSC50eCgidG9nZ2xlRXhwYW5kIikKK0MuSUQ9bmV3IEgudHgoInRvZ2dsZUV4cGFuZGVkIikKK0MuejY9bmV3IEgudHgoInRva2VuUG9zIikKK0MuYmM9bmV3IEgudHgoInRvcEZyYW1lIikKK0MuaDU9bmV3IEgudHgoInRvdGFsQ29sbGVjdGlvblRpbWVJblNlY29uZHMiKQorQy5Laj1uZXcgSC50eCgidG90YWxTYW1wbGVzSW5Qcm9maWxlIikKK0MuZXA9bmV3IEgudHgoInRyZWUiKQorQy5KMj1uZXcgSC50eCgidHlwZUNoZWNrc0VuYWJsZWQiKQorQy5PVT1uZXcgSC50eCgidW5vcHRpbWl6ZWRDb2RlIikKK0MuYm49bmV3IEgudHgoInVwZGF0ZUxpbmVNb2RlIikKK0MubWg9bmV3IEgudHgoInVwdGltZSIpCitDLkZoPW5ldyBILnR4KCJ1cmwiKQorQy55dj1uZXcgSC50eCgidXNhZ2VDb3VudGVyIikKK0MuTFA9bmV3IEgudHgoInVzZWQiKQorQy5qaD1uZXcgSC50eCgidiIpCitDLmxzPW5ldyBILnR4KCJ2YWx1ZSIpCitDLmZqPW5ldyBILnR4KCJ2YXJpYWJsZSIpCitDLnh3PW5ldyBILnR4KCJ2YXJpYWJsZXMiKQorQy56bj1uZXcgSC50eCgidmVyc2lvbiIpCitDLlRjPW5ldyBILnR4KCJ2bU5hbWUiKQorQy5VeT1uZXcgSC50eCgid3JpdGVDbG9zZWQiKQogQy5NST1ILklMKCdoeCcpCiBDLmhQPUguSUwoJ3V6JykKK0MuUWI9SC5JTCgnSjMnKQogQy5NZj1ILklMKCdHMScpCiBDLnEwUz1ILklMKCdEZycpCiBDLkRsPUguSUwoJ0YxJykKQEAgLTIwNzAzLDcgKzIwOTc5LDYgQEAKIEMuZFA9SC5JTCgndm0nKQogQy5WeD1ILklMKCdNSicpCiBDLlZoPUguSUwoJ1B6JykKLUMuSEM9SC5JTCgnRjAnKQogQy5yUj1ILklMKCd3TicpCiBDLnlTPUguSUwoJ0c2JykKIEMuU2I9SC5JTCgna24nKQpAQCAtMjA3MTIsNyArMjA5ODcsNiBAQAogQy5FWj1ILklMKCdvRicpCiBDLnZ3PUguSUwoJ1VLJykKIEMuSm89SC5JTCgnaTcnKQotQy5CTD1ILklMKCdOcicpCiBDLk9OPUguSUwoJ292JykKIEMualI9SC5JTCgnQmUnKQogQy5hbD1ILklMKCdlcycpCkBAIC0yMDczMSwxMiArMjEwMDUsMTAgQEAKIEMuTXQ9SC5JTCgnaHUnKQogQy5sYWo9SC5JTCgnWlgnKQogQy5wYT1ILklMKCdDUCcpCi1DLnhFPUguSUwoJ2FDJykKIEMudnU9SC5JTCgndXcnKQogQy5jYT1ILklMKCdaNCcpCiBDLnBKPUguSUwoJ1E2JykKIEMuWXk9SC5JTCgndUUnKQotQy5NNT1ILklMKCd5YycpCiBDLll4bT1ILklMKCdQZycpCiBDLmlsPUguSUwoJ3hJJykKIEMuRzA9SC5JTCgnbUonKQpAQCAtMjA3NDUsOSArMjEwMTcsMTEgQEAKIEMuRUc9SC5JTCgnT3onKQogQy5udz1ILklMKCdlbycpCiBDLk9HPUguSUwoJ2VXJykKK0Mub1o9SC5JTCgnSFMnKQogQy5rbT1ILklMKCdmbCcpCiBDLmpWPUguSUwoJ3JGJykKIEMuVHE9SC5JTCgndmonKQorQy5vdT1ILklMKCdhaycpCiBDLkpXPUguSUwoJ1d3JykKIEMuQ1Q9SC5JTCgnU3QnKQogQy53SD1ILklMKCd6TScpCkBAIC0yMDc2NCwxNyArMjEwMzgsMTggQEAKIEMucUY9SC5JTCgnbU8nKQogQy5FeT1ILklMKCd3TScpCiBDLnBGPUguSUwoJ1dTJykKLUMublg9SC5JTCgnREUnKQorQy5xWj1ILklMKCdERScpCiBDLmp3PUguSUwoJ3hjJykKIEMuTlc9SC5JTCgneWUnKQogQy5qUmk9SC5JTCgnd2UnKQogQy5Ydj1ILklMKCduNScpCiBDLlhJPUguSUwoJ2NuJykKIEMuS089SC5JTCgnWlAnKQorQy5oZT1ILklMKCdxTScpCiBDLkptPUguSUwoJ3E2JykKIEMuV3o9SC5JTCgncFInKQotQy5FcD1ILklMKCdvdScpCiBDLnRjPUguSUwoJ01hJykKK0MuV3I9SC5JTCgnbTknKQogQy5Jbz1ILklMKCdRaCcpCiBDLlF0PUguSUwoJ05LJykKIEMud2s9SC5JTCgnbkonKQpAQCAtMjA4MDgsNyArMjEwODMsNyBAQAogJC5xND1udWxsCiAkLnZ2PW51bGwKICQuQnY9bnVsbAotJC5tZj1udWxsCiskLktoPW51bGwKICQuQlk9bnVsbAogJC5vSz1udWxsCiAkLlM2PW51bGwKQEAgLTIwODMzLDEwICsyMTEwOCwxMCBAQAogJC52VT1udWxsCiAkLnhWPW51bGwKICQucks9ITEKLSQuQXU9W0MudHEsVy5Cbyx7fSxDLk1JLFouaHgse2NyZWF0ZWQ6Wi5Db1d9LEMuaFAsRS51eix7Y3JlYXRlZDpFLnoxfSxDLk1mLEEuRzEse2NyZWF0ZWQ6QS5KOH0sQy5xMFMsSC5EZyx7IiI6SC5qWk59LEMuRGwsVi5GMSx7Y3JlYXRlZDpWLkpUOH0sQy5KZixFLk1iLHtjcmVhdGVkOkUuUlZJfSxDLlVKLE4ub2Ese2NyZWF0ZWQ6Ti5JQn0sQy5ZMyxRLkNZLHtjcmVhdGVkOlEuU219LEMuajQsRC5JVyx7Y3JlYXRlZDpELnpyfSxDLlZ4LFguTUose2NyZWF0ZWQ6WC5JZlh9LEMuclIsRS53Tix7Y3JlYXRlZDpFLk1MfSxDLnlTLEIuRzYse2NyZWF0ZWQ6Qi5Ed30sQy5TYixBLmtuLHtjcmVhdGVkOkEuSXJ9LEMuRVosRS5vRix7Y3JlYXRlZDpFLlVFfSxDLnZ3LEEuVUsse2NyZWF0ZWQ6QS5JVn0sQy5KbyxELmk3LHtjcmVhdGVkOkQuaFNXfSxDLkJMLFguTnIse2NyZWF0ZWQ6WC5Ba30sQy5PTixULm92LHtjcmVhdGVkOlQuVDVpfSxDLmpSLEYuQmUse2NyZWF0ZWQ6Ri5mOX0sQy5QVCxNLkNYLHtjcmVhdGVkOk0uYXN9LEMuaUQsTy5WYix7Y3JlYXRlZDpPLnBufSxDLmNlLFgua0sse2NyZWF0ZWQ6WC5qRH0sQy5kRCxFLmF2LHtjcmVhdGVkOkUuUjd9LEMuRkEsQS5ZYSx7Y3JlYXRlZDpBLnZufSxDLlBGLFcueXlOLHt9LEMuVGgsVS5mSSx7Y3JlYXRlZDpVLmRJfSxDLnRVLEUuTDQse2NyZWF0ZWQ6RS5wNHR9LEMuY0ssWC5JNSx7Y3JlYXRlZDpYLnZDfSxDLmpBLFIuRWcse2NyZWF0ZWQ6Ui5OZH0sQy5LNCxYLmhWLHtjcmVhdGVkOlguenl9LEMueEUsWi5hQyx7Y3JlYXRlZDpaLmxXfSxDLnZ1LFgudXcse2NyZWF0ZWQ6WC5ISX0sQy5jYSxELlo0LHtjcmVhdGVkOkQuT2xsfSxDLnBKLEUuUTYse2NyZWF0ZWQ6RS5jaEZ9LEMuWXksRS51RSx7Y3JlYXRlZDpFLkFXfSxDLll4bSxILlBnLHsiIjpILmFSdX0sQy5pbCxRLnhJLHtjcmVhdGVkOlEubEtIfSxDLmxwLFIuTFUse2NyZWF0ZWQ6Ui5yQX0sQy5vRyxFLmRzLHtjcmVhdGVkOkUucElmfSxDLkVHLEQuT3ose2NyZWF0ZWQ6RC5SUH0sQy5udyxPLmVvLHtjcmVhdGVkOk8ubDB9LEMuT0csUS5lVyx7Y3JlYXRlZDpRLnJ0fSxDLmttLEEuZmwse2NyZWF0ZWQ6QS5EdX0sQy5UcSxaLnZqLHtjcmVhdGVkOlouTTd9LEMuSlcsQS5Xdyx7Y3JlYXRlZDpBLlpDfSxDLkNULEQuU3Qse2NyZWF0ZWQ6RC5ONX0sQy53SCxSLnpNLHtjcmVhdGVkOlIuWm1LfSxDLmw0LFoudUwse2NyZWF0ZWQ6Wi5FRX0sQy5MVCxBLm1kLHtjcmVhdGVkOkEuRENpfSxDLldoLEUuSDgse2NyZWF0ZWQ6RS5aaFh9LEMuWmosRS5VMSx7Y3JlYXRlZDpFLmhtfSxDLkZHLEUucWgse2NyZWF0ZWQ6RS5jdWF9LEMuYkMsVi5EMix7Y3JlYXRlZDpWLk5JfSxDLmE4LEEuWngse2NyZWF0ZWQ6QS56Q30sQy5OUixLLm5tLHtjcmVhdGVkOksuYW50fSxDLkRELEUuWm4se2NyZWF0ZWQ6RS54S30sQy5xRixFLm1PLHtjcmVhdGVkOkUuQ2h9LEMuRXksQS53TSx7Y3JlYXRlZDpBLkdPfSxDLnBGLEUuV1Mse2NyZWF0ZWQ6RS5qU30sQy5uWCxFLkRFLHtjcmVhdGVkOkUub0J9LEMuancsQS54Yyx7Y3JlYXRlZDpBLkc3fSxDLk5XLEEueWUse2NyZWF0ZWQ6QS5XMX0sQy5qUmksSC53ZSx7IiI6SC5pY30sQy5YdixFLm41LHtjcmVhdGVkOkUuaU9vfSxDLktPLEYuWlAse2NyZWF0ZWQ6Ri5Zd30sQy5KbSxZLnE2LHtjcmVhdGVkOlkuekV9LEMuV3osQi5wUix7Y3JlYXRlZDpCLmx1fSxDLkVwLEUub3Use2NyZWF0ZWQ6RS50WH0sQy50YyxFLk1hLHtjcmVhdGVkOkUuSWl9LEMuSW8sRC5RaCx7Y3JlYXRlZDpELlFqfSxDLlF0LEEuTksse2NyZWF0ZWQ6QS5YaWl9LEMud2ssTC5uSix7Y3JlYXRlZDpMLlJwfSxDLnRlLE4uQlMse2NyZWF0ZWQ6Ti5uen0sQy5tcyxBLkJtLHtjcmVhdGVkOkEuQUptfSxDLndzLFYuUGEse2NyZWF0ZWQ6Vi5mWHh9LEMucEssRC5Sayx7Y3JlYXRlZDpELmJacH0sQy5sRSxVLkRLLHtjcmVhdGVkOlUudjl9LEMuQXosQS5Hayx7Y3JlYXRlZDpBLm52fSxDLlg4LFUuVGkse2NyZWF0ZWQ6VS5HdnR9LEMuTGcsUi5KSSx7Y3JlYXRlZDpSLm9TfSxDLkp1LEsuTHkse2NyZWF0ZWQ6Sy5VdH0sQy5tcSxMLnFrLHtjcmVhdGVkOkwuUXRwfSxDLlhXWSxXLnVFWSx7fSxDLm9ULE8uVlkse2NyZWF0ZWQ6Ty5Pbn0sQy5qSyxVLmVsLHtjcmVhdGVkOlUub0h9XQorJC5BdT1bQy50cSxXLkJvLHt9LEMuTUksWi5oeCx7Y3JlYXRlZDpaLkNvV30sQy5oUCxFLnV6LHtjcmVhdGVkOkUuWkZQfSxDLlFiLFguSjMse2NyZWF0ZWQ6WC5Uc0Z9LEMuTWYsQS5HMSx7Y3JlYXRlZDpBLko4fSxDLnEwUyxILkRnLHsiIjpILmpaTn0sQy5EbCxWLkYxLHtjcmVhdGVkOlYuZnZ9LEMuSmYsRS5NYix7Y3JlYXRlZDpFLlJWSX0sQy5VSixOLm9hLHtjcmVhdGVkOk4uSUJ9LEMuWTMsUS5DWSx7Y3JlYXRlZDpRLlNtfSxDLmo0LEQuSVcse2NyZWF0ZWQ6RC56cn0sQy5WeCxYLk1KLHtjcmVhdGVkOlguSWZYfSxDLnJSLEUud04se2NyZWF0ZWQ6RS5NTH0sQy55UyxCLkc2LHtjcmVhdGVkOkIuRHd9LEMuU2IsQS5rbix7Y3JlYXRlZDpBLlRRfSxDLkVaLEUub0Yse2NyZWF0ZWQ6RS5VRX0sQy52dyxBLlVLLHtjcmVhdGVkOkEuSVZ9LEMuSm8sRC5pNyx7Y3JlYXRlZDpELmhTV30sQy5PTixULm92LHtjcmVhdGVkOlQuVDVpfSxDLmpSLEYuQmUse2NyZWF0ZWQ6Ri5mbX0sQy5QVCxNLkNYLHtjcmVhdGVkOk0uYXN9LEMuaUQsTy5WYix7Y3JlYXRlZDpPLnBufSxDLmNlLFgua0sse2NyZWF0ZWQ6WC5qRH0sQy5kRCxFLmF2LHtjcmVhdGVkOkUuUjd9LEMuRkEsQS5ZYSx7Y3JlYXRlZDpBLnZufSxDLlBGLFcueXlOLHt9LEMuVGgsVS5mSSx7Y3JlYXRlZDpVLlVGfSxDLnRVLEUuTDQse2NyZWF0ZWQ6RS5wNHR9LEMuY0ssWC5JNSx7Y3JlYXRlZDpYLnZDfSxDLmpBLFIuRWcse2NyZWF0ZWQ6Ui5PbGF9LEMuSzQsWC5oVix7Y3JlYXRlZDpYLnp5fSxDLnZ1LFgudXcse2NyZWF0ZWQ6WC5ISX0sQy5jYSxELlo0LHtjcmVhdGVkOkQuT2xsfSxDLnBKLEUuUTYse2NyZWF0ZWQ6RS5jaEZ9LEMuWXksRS51RSx7Y3JlYXRlZDpFLkFXfSxDLll4bSxILlBnLHsiIjpILmFSdX0sQy5pbCxRLnhJLHtjcmVhdGVkOlEubEtIfSxDLmxwLFIuTFUse2NyZWF0ZWQ6Ui5WNH0sQy5vRyxFLmRzLHtjcmVhdGVkOkUucElmfSxDLkVHLEQuT3ose2NyZWF0ZWQ6RC5SUH0sQy5udyxPLmVvLHtjcmVhdGVkOk8ubDB9LEMuT0csUS5lVyx7Y3JlYXRlZDpRLnJ0fSxDLmttLEEuZmwse2NyZWF0ZWQ6QS5EdX0sQy5UcSxaLnZqLHtjcmVhdGVkOlouTTd9LEMub3UsWi5hayx7Y3JlYXRlZDpaLmxXfSxDLkpXLEEuV3cse2NyZWF0ZWQ6QS5aQ30sQy5DVCxELlN0LHtjcmVhdGVkOkQuTjV9LEMud0gsUi56TSx7Y3JlYXRlZDpSLlptS30sQy5sNCxaLnVMLHtjcmVhdGVkOlouRUV9LEMuTFQsQS5tZCx7Y3JlYXRlZDpBLkRDaX0sQy5XaCxFLkg4LHtjcmVhdGVkOkUuWmhYfSxDLlpqLEUuVTEse2NyZWF0ZWQ6RS5UaVV9LEMuRkcsRS5xaCx7Y3JlYXRlZDpFLlNjfSxDLmJDLFYuRDIse2NyZWF0ZWQ6Vi5OSX0sQy5hOCxBLlp4LHtjcmVhdGVkOkEuT3d9LEMuTlIsSy5ubSx7Y3JlYXRlZDpLLmFufSxDLkRELEUuWm4se2NyZWF0ZWQ6RS5rZn0sQy5xRixFLm1PLHtjcmVhdGVkOkUuQ2h9LEMuRXksQS53TSx7Y3JlYXRlZDpBLkdPfSxDLnBGLEUuV1Mse2NyZWF0ZWQ6RS5qU30sQy5xWixFLkRFLHtjcmVhdGVkOkUub0J9LEMuancsQS54Yyx7Y3JlYXRlZDpBLkc3fSxDLk5XLEEueWUse2NyZWF0ZWQ6QS5XMX0sQy5qUmksSC53ZSx7IiI6SC5tNn0sQy5YdixFLm41LHtjcmVhdGVkOkUuaU9vfSxDLktPLEYuWlAse2NyZWF0ZWQ6Ri5Zd30sQy5oZSxFLnFNLHtjcmVhdGVkOkUudFh9LEMuSm0sWS5xNix7Y3JlYXRlZDpZLnpFfSxDLld6LEIucFIse2NyZWF0ZWQ6Qi5sdX0sQy50YyxFLk1hLHtjcmVhdGVkOkUuSWkxfSxDLklvLEQuUWgse2NyZWF0ZWQ6RC5Ran0sQy5RdCxBLk5LLHtjcmVhdGVkOkEuWGlpfSxDLndrLEwubkose2NyZWF0ZWQ6TC5ScH0sQy50ZSxOLkJTLHtjcmVhdGVkOk4ubnp9LEMubXMsQS5CbSx7Y3JlYXRlZDpBLkFKbX0sQy53cyxWLlBhLHtjcmVhdGVkOlYuZlh4fSxDLnBLLEQuUmsse2NyZWF0ZWQ6RC5iWnB9LEMubEUsVS5ESyx7Y3JlYXRlZDpVLnY5fSxDLkF6LEEuR2sse2NyZWF0ZWQ6QS5jWU99LEMuWDgsVS5UaSx7Y3JlYXRlZDpVLkd2dH0sQy5MZyxSLkpJLHtjcmVhdGVkOlIub1N9LEMuSnUsSy5MeSx7Y3JlYXRlZDpLLlV0fSxDLm1xLEwucWsse2NyZWF0ZWQ6TC5RdHB9LEMuWFdZLFcudUVZLHt9LEMub1QsTy5WWSx7Y3JlYXRlZDpPLk9ufSxDLmpLLFUuZWwse2NyZWF0ZWQ6VS5vSH1dCiBJLiRsYXp5KCQsImdsb2JhbFRoaXMiLCJEWCIsImprIixmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpfSkKIEkuJGxhenkoJCwiZ2xvYmFsV2luZG93IiwiVVciLCJNeSIsZnVuY3Rpb24oKXtyZXR1cm4gJC5qaygpLndpbmRvd30pCi1JLiRsYXp5KCQsImdsb2JhbFdvcmtlciIsInU5Iiwicm0iLGZ1bmN0aW9uKCl7cmV0dXJuICQuamsoKS5Xb3JrZXJ9KQorSS4kbGF6eSgkLCJnbG9iYWxXb3JrZXIiLCJ1OSIsIkZ2IixmdW5jdGlvbigpe3JldHVybiAkLmprKCkuV29ya2VyfSkKIEkuJGxhenkoJCwiZ2xvYmFsUG9zdE1lc3NhZ2VEZWZpbmVkIiwiV0giLCJ3QiIsZnVuY3Rpb24oKXtyZXR1cm4gJC5qaygpLnBvc3RNZXNzYWdlIT09dm9pZCAwfSkKIEkuJGxhenkoJCwidGhpc1NjcmlwdCIsIlNVIiwiWnQiLGZ1bmN0aW9uKCl7cmV0dXJuIEgueWwoKX0pCiBJLiRsYXp5KCQsIndvcmtlcklkcyIsInJTIiwicDYiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW1AuS05dKX0pCkBAIC0yMDg1MSw2NSArMjExMjYsODEgQEAKIEkuJGxhenkoJCwibnVsbFByb3BlcnR5UGF0dGVybiIsIkJYIiwiVzYiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oSC5NaihudWxsKSl9KQogSS4kbGF6eSgkLCJudWxsTGl0ZXJhbFByb3BlcnR5UGF0dGVybiIsInR0IiwiQmkiLGZ1bmN0aW9uKCl7cmV0dXJuIEguY00oZnVuY3Rpb24oKXt0cnl7bnVsbC4kbWV0aG9kJH1jYXRjaCh6KXtyZXR1cm4gei5tZXNzYWdlfX0oKSl9KQogSS4kbGF6eSgkLCJ1bmRlZmluZWRQcm9wZXJ0eVBhdHRlcm4iLCJkdCIsImVBIixmdW5jdGlvbigpe3JldHVybiBILmNNKEguTWoodm9pZCAwKSl9KQotSS4kbGF6eSgkLCJ1bmRlZmluZWRMaXRlcmFsUHJvcGVydHlQYXR0ZXJuIiwiQTciLCJrbyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXsodm9pZCAwKS4kbWV0aG9kJH1jYXRjaCh6KXtyZXR1cm4gei5tZXNzYWdlfX0oKSl9KQorSS4kbGF6eSgkLCJ1bmRlZmluZWRMaXRlcmFsUHJvcGVydHlQYXR0ZXJuIiwiQWkiLCJxSyIsZnVuY3Rpb24oKXtyZXR1cm4gSC5jTShmdW5jdGlvbigpe3RyeXsodm9pZCAwKS4kbWV0aG9kJH1jYXRjaCh6KXtyZXR1cm4gei5tZXNzYWdlfX0oKSl9KQogSS4kbGF6eSgkLCJfY29tcGxldGVyIiwiSVEiLCJJYiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pfSkKIEkuJGxhenkoJCwiX3N0b3JhZ2UiLCJ3WiIsIlZ5IixmdW5jdGlvbigpe3JldHVybiB3aW5kb3cubG9jYWxTdG9yYWdlfSkKIEkuJGxhenkoJCwic2NoZWR1bGVJbW1lZGlhdGVDbG9zdXJlIiwibEkiLCJlaiIsZnVuY3Rpb24oKXtyZXR1cm4gUC54ZygpfSkKIEkuJGxhenkoJCwiX251bGxGdXR1cmUiLCJicSIsIm1rIixmdW5jdGlvbigpe3JldHVybiBQLkFiKG51bGwsbnVsbCl9KQogSS4kbGF6eSgkLCJfdG9TdHJpbmdWaXNpdGluZyIsIm5NIiwiRXgiLGZ1bmN0aW9uKCl7cmV0dXJuW119KQotSS4kbGF6eSgkLCJ3ZWJraXRFdmVudHMiLCJmRCIsIlZwIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFsiYW5pbWF0aW9uZW5kIiwid2Via2l0QW5pbWF0aW9uRW5kIiwiYW5pbWF0aW9uaXRlcmF0aW9uIiwid2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uIiwiYW5pbWF0aW9uc3RhcnQiLCJ3ZWJraXRBbmltYXRpb25TdGFydCIsImZ1bGxzY3JlZW5jaGFuZ2UiLCJ3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIiwiZnVsbHNjcmVlbmVycm9yIiwid2Via2l0ZnVsbHNjcmVlbmVycm9yIiwia2V5YWRkZWQiLCJ3ZWJraXRrZXlhZGRlZCIsImtleWVycm9yIiwid2Via2l0a2V5ZXJyb3IiLCJrZXltZXNzYWdlIiwid2Via2l0a2V5bWVzc2FnZSIsIm5lZWRrZXkiLCJ3ZWJraXRuZWVka2V5IiwicG9pbnRlcmxvY2tjaGFuZ2UiLCJ3ZWJraXRwb2ludGVybG9ja2NoYW5nZSIsInBvaW50ZXJsb2NrZXJyb3IiLCJ3ZWJraXRwb2ludGVybG9ja2Vycm9yIiwicmVzb3VyY2V0aW1pbmdidWZmZXJmdWxsIiwid2Via2l0cmVzb3VyY2V0aW1pbmdidWZmZXJmdWxsIiwidHJhbnNpdGlvbmVuZCIsIndlYmtpdFRyYW5zaXRpb25FbmQiLCJzcGVlY2hjaGFuZ2UiLCJ3ZWJraXRTcGVlY2hDaGFuZ2UiXSxudWxsLG51bGwpfSkKK0kuJGxhenkoJCwid2Via2l0RXZlbnRzIiwiZkRYIiwibm4iLGZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoWyJhbmltYXRpb25lbmQiLCJ3ZWJraXRBbmltYXRpb25FbmQiLCJhbmltYXRpb25pdGVyYXRpb24iLCJ3ZWJraXRBbmltYXRpb25JdGVyYXRpb24iLCJhbmltYXRpb25zdGFydCIsIndlYmtpdEFuaW1hdGlvblN0YXJ0IiwiZnVsbHNjcmVlbmNoYW5nZSIsIndlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UiLCJmdWxsc2NyZWVuZXJyb3IiLCJ3ZWJraXRmdWxsc2NyZWVuZXJyb3IiLCJrZXlhZGRlZCIsIndlYmtpdGtleWFkZGVkIiwia2V5ZXJyb3IiLCJ3ZWJraXRrZXllcnJvciIsImtleW1lc3NhZ2UiLCJ3ZWJraXRrZXltZXNzYWdlIiwibmVlZGtleSIsIndlYmtpdG5lZWRrZXkiLCJwb2ludGVybG9ja2NoYW5nZSIsIndlYmtpdHBvaW50ZXJsb2NrY2hhbmdlIiwicG9pbnRlcmxvY2tlcnJvciIsIndlYmtpdHBvaW50ZXJsb2NrZXJyb3IiLCJyZXNvdXJjZXRpbWluZ2J1ZmZlcmZ1bGwiLCJ3ZWJraXRyZXNvdXJjZXRpbWluZ2J1ZmZlcmZ1bGwiLCJ0cmFuc2l0aW9uZW5kIiwid2Via2l0VHJhbnNpdGlvbkVuZCIsInNwZWVjaGNoYW5nZSIsIndlYmtpdFNwZWVjaENoYW5nZSJdLG51bGwsbnVsbCl9KQogSS4kbGF6eSgkLCJjb250ZXh0IiwiTHQiLCJTaSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5ORChmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKX0pCiBJLiRsYXp5KCQsIl9EQVJUX09CSkVDVF9QUk9QRVJUWV9OQU1FIiwia3QiLCJJcSIsZnVuY3Rpb24oKXtyZXR1cm4gaW5pdC5nZXRJc29sYXRlVGFnKCJfJGRhcnRfZGFydE9iamVjdCIpfSkKIEkuJGxhenkoJCwiX0RBUlRfQ0xPU1VSRV9QUk9QRVJUWV9OQU1FIiwiUmkiLCJEcCIsZnVuY3Rpb24oKXtyZXR1cm4gaW5pdC5nZXRJc29sYXRlVGFnKCJfJGRhcnRfZGFydENsb3N1cmUiKX0pCiBJLiRsYXp5KCQsIl9kYXJ0UHJveHlDdG9yIiwiZksiLCJpVyIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24gRGFydE9iamVjdChhKXt0aGlzLm89YX19KQogSS4kbGF6eSgkLCJfZnJlZUNvbG9yIiwibksiLCJSMiIsZnVuY3Rpb24oKXtyZXR1cm5bMjU1LDI1NSwyNTUsMjU1XX0pCiBJLiRsYXp5KCQsIl9wYWdlU2VwYXJhdGlvbkNvbG9yIiwiT3MiLCJRZyIsZnVuY3Rpb24oKXtyZXR1cm5bMCwwLDAsMjU1XX0pCi1JLiRsYXp5KCQsIl9sb2dnZXJzIiwiVWoiLCJJdSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5GbChQLnFVLE4uUncpfSkKK0kuJGxhenkoJCwiX2xvZ2dlcnMiLCJVaiIsIkl1IixmdW5jdGlvbigpe3JldHVybiBQLkZsKFAucVUsTi5USil9KQogSS4kbGF6eSgkLCJfbG9nZ2VyIiwieTciLCJTNSIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgiT2JzZXJ2YWJsZS5kaXJ0eUNoZWNrIil9KQogSS4kbGF6eSgkLCJfaW5zdGFuY2UiLCJxYSIsIkpzIixmdW5jdGlvbigpe3JldHVybiBuZXcgTC5UVihbXSl9KQotSS4kbGF6eSgkLCJfcGF0aFJlZ0V4cCIsIlViIiwiQjgiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLllKRygpLiQwKCl9KQotSS4kbGF6eSgkLCJfbG9nZ2VyIiwieTdZIiwiWVYiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oIm9ic2VydmUuUGF0aE9ic2VydmVyIil9KQorSS4kbGF6eSgkLCJfcGF0aFJlZ0V4cCIsIlViIiwiQjgiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMLkRPZSgpLiQwKCl9KQorSS4kbGF6eSgkLCJfbG9nZ2VyIiwieTdZIiwiTmQiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oIm9ic2VydmUuUGF0aE9ic2VydmVyIil9KQogSS4kbGF6eSgkLCJfcGF0aENhY2hlIiwidW4iLCJoVyIsZnVuY3Rpb24oKXtyZXR1cm4gUC5MNShudWxsLG51bGwsbnVsbCxQLnFVLEwuVHYpfSkKLUkuJGxhenkoJCwiX3BvbHltZXJTeW50YXgiLCJLYiIsIlJzIixmdW5jdGlvbigpe3JldHVybiBuZXcgQS5MaShULkdGKG51bGwsQy5xWSksbnVsbCl9KQorSS4kbGF6eSgkLCJfcG9seW1lclN5bnRheCIsIktiIiwicmsiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLkxpKFQuR0YobnVsbCxDLnFZKSxudWxsKX0pCiBJLiRsYXp5KCQsIl90eXBlc0J5TmFtZSIsIkhpIiwiRWoiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuTDUobnVsbCxudWxsLG51bGwsUC5xVSxQLnVxKX0pCiBJLiRsYXp5KCQsIl9kZWNsYXJhdGlvbnMiLCJlZiIsInZFIixmdW5jdGlvbigpe3JldHVybiBQLkw1KG51bGwsbnVsbCxudWxsLFAucVUsQS5YUCl9KQotSS4kbGF6eSgkLCJfaGFzU2hhZG93RG9tUG9seWZpbGwiLCJuMyIsImpnIixmdW5jdGlvbigpe3JldHVybiAkLlNpKCkuRWcoIlNoYWRvd0RPTVBvbHlmaWxsIil9KQorSS4kbGF6eSgkLCJfaGFzU2hhZG93RG9tUG9seWZpbGwiLCJZeCIsIkVwIixmdW5jdGlvbigpe3JldHVybiAkLlNpKCkuRWcoIlNoYWRvd0RPTVBvbHlmaWxsIil9KQogSS4kbGF6eSgkLCJfU2hhZG93Q3NzIiwicVAiLCJBTSIsZnVuY3Rpb24oKXt2YXIgej0kLktjKCkKIHJldHVybiB6IT1udWxsP0ouVVEoeiwiU2hhZG93Q1NTIik6bnVsbH0pCiBJLiRsYXp5KCQsIl9zaGVldExvZyIsImR6IiwiUUoiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oInBvbHltZXIuc3R5bGVzaGVldCIpfSkKLUkuJGxhenkoJCwiX2NoYW5nZWRNZXRob2RRdWVyeU9wdGlvbnMiLCJTQyIsIkhOIixmdW5jdGlvbigpe3JldHVybiBuZXcgQS5XcSghMSwhMSwhMCxDLnRxLCExLCEwLG51bGwsQS5GNCgpKX0pCitJLiRsYXp5KCQsIl9jaGFuZ2VkTWV0aG9kUXVlcnlPcHRpb25zIiwiU0MiLCJTeiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEuV3EoITEsITEsITAsQy50cSwhMSwhMCxudWxsLEEuRjQoKSl9KQogSS4kbGF6eSgkLCJfQVRUUklCVVRFU19SRUdFWCIsIm1EIiwiYVEiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILlZSKCJcXHN8LCIsSC52NCgiXFxzfCwiLCExLCEwLCExKSxudWxsLG51bGwpfSkKIEkuJGxhenkoJCwiX1BsYXRmb3JtIiwiV0YiLCJLYyIsZnVuY3Rpb24oKXtyZXR1cm4gSi5VUSgkLlNpKCksIlBsYXRmb3JtIil9KQogSS4kbGF6eSgkLCJiaW5kUGF0dGVybiIsIlpBIiwiaUIiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBILlZSKCJcXHtcXHsoW157fV0qKX19IixILnY0KCJcXHtcXHsoW157fV0qKX19IiwhMSwhMCwhMSksbnVsbCxudWxsKX0pCiBJLiRsYXp5KCQsIl9vblJlYWR5IiwiUjkiLCJpRiIsZnVuY3Rpb24oKXtyZXR1cm4gSC5WTShuZXcgUC5aZihQLkR0KG51bGwpKSxbbnVsbF0pfSkKLUkuJGxhenkoJCwiX29ic2VydmVMb2ciLCJEWiIsImJ0IixmdW5jdGlvbigpe3JldHVybiBOLlFNKCJwb2x5bWVyLm9ic2VydmUiKX0pCitJLiRsYXp5KCQsIl9vYnNlcnZlTG9nIiwiRFoiLCJkbk8iLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oInBvbHltZXIub2JzZXJ2ZSIpfSkKIEkuJGxhenkoJCwiX2V2ZW50c0xvZyIsImZvIiwiYXkiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oInBvbHltZXIuZXZlbnRzIil9KQogSS4kbGF6eSgkLCJfdW5iaW5kTG9nIiwiZXUiLCJpWCIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci51bmJpbmQiKX0pCi1JLiRsYXp5KCQsIl9iaW5kTG9nIiwieHoiLCJMdSIsZnVuY3Rpb24oKXtyZXR1cm4gTi5RTSgicG9seW1lci5iaW5kIil9KQorSS4kbGF6eSgkLCJfYmluZExvZyIsImYyIiwiekIiLGZ1bmN0aW9uKCl7cmV0dXJuIE4uUU0oInBvbHltZXIuYmluZCIpfSkKIEkuJGxhenkoJCwiX1BvbHltZXJHZXN0dXJlcyIsIlhLIiwiUG8iLGZ1bmN0aW9uKCl7cmV0dXJuIEouVVEoJC5TaSgpLCJQb2x5bWVyR2VzdHVyZXMiKX0pCiBJLiRsYXp5KCQsIl9wb2x5bWVyRWxlbWVudFByb3RvIiwiTFciLCJYWCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEEuTWQoKS4kMCgpfSkKLUkuJGxhenkoJCwiX3R5cGVIYW5kbGVycyIsImxxIiwiUUwiLGZ1bmN0aW9uKCl7cmV0dXJuIFAuRUYoW0MuR2gsbmV3IFoubFAoKSxDLkdYLG5ldyBaLlVmKCksQy5ZYyxuZXcgWi5SYSgpLEMuSEwsbmV3IFoud0pZKCksQy55dyxuZXcgWi56T1EoKSxDLnBhLG5ldyBaLlc2bygpXSxudWxsLG51bGwpfSkKLUkuJGxhenkoJCwiX0JJTkFSWV9PUEVSQVRPUlMiLCJBZiIsIlJhYiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbIisiLG5ldyBLLncxMCgpLCItIixuZXcgSy53MTEoKSwiKiIsbmV3IEsudzEyKCksIi8iLG5ldyBLLncxMygpLCIlIixuZXcgSy53MTQoKSwiPT0iLG5ldyBLLncxNSgpLCIhPSIsbmV3IEsudzE2KCksIj09PSIsbmV3IEsudzE3KCksIiE9PSIsbmV3IEsudzE4KCksIj4iLG5ldyBLLncxOSgpLCI+PSIsbmV3IEsudzIwKCksIjwiLG5ldyBLLncyMSgpLCI8PSIsbmV3IEsudzIyKCksInx8IixuZXcgSy53MjMoKSwiJiYiLG5ldyBLLncyNCgpLCJ8IixuZXcgSy53MjUoKV0sbnVsbCxudWxsKX0pCi1JLiRsYXp5KCQsIl9VTkFSWV9PUEVSQVRPUlMiLCJxTSIsInFMIixmdW5jdGlvbigpe3JldHVybiBQLkVGKFsiKyIsbmV3IEsuUmFhKCksIi0iLG5ldyBLLncwKCksIiEiLG5ldyBLLnc1KCldLG51bGwsbnVsbCl9KQorSS4kbGF6eSgkLCJfdHlwZUhhbmRsZXJzIiwibHEiLCJSZiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbQy5HaCxuZXcgWi5sUCgpLEMuR1gsbmV3IFouUmEoKSxDLlljLG5ldyBaLndKWSgpLEMuSEwsbmV3IFouek9RKCksQy55dyxuZXcgWi5XNm8oKSxDLnBhLG5ldyBaLk1kUSgpXSxudWxsLG51bGwpfSkKK0kuJGxhenkoJCwiX0JJTkFSWV9PUEVSQVRPUlMiLCJBZiIsIlJhYiIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbIisiLG5ldyBLLncxMSgpLCItIixuZXcgSy53MTIoKSwiKiIsbmV3IEsudzEzKCksIi8iLG5ldyBLLncxNCgpLCIlIixuZXcgSy53MTUoKSwiPT0iLG5ldyBLLncxNigpLCIhPSIsbmV3IEsudzE3KCksIj09PSIsbmV3IEsudzE4KCksIiE9PSIsbmV3IEsudzE5KCksIj4iLG5ldyBLLncyMCgpLCI+PSIsbmV3IEsudzIxKCksIjwiLG5ldyBLLncyMigpLCI8PSIsbmV3IEsudzIzKCksInx8IixuZXcgSy53MjQoKSwiJiYiLG5ldyBLLncyNSgpLCJ8IixuZXcgSy53MjYoKV0sbnVsbCxudWxsKX0pCitJLiRsYXp5KCQsIl9VTkFSWV9PUEVSQVRPUlMiLCJwcnAiLCJJaSIsZnVuY3Rpb24oKXtyZXR1cm4gUC5FRihbIisiLG5ldyBLLncwKCksIi0iLG5ldyBLLnc1KCksIiEiLG5ldyBLLncxMCgpXSxudWxsLG51bGwpfSkKIEkuJGxhenkoJCwiX2luc3RhbmNlIiwibG4iLCJ3YiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEsubWUoKX0pCi1JLiRsYXp5KCQsIl9jdXJyZW50SXNvbGF0ZU1hdGNoZXIiLCJ2ZiIsImpOIixmdW5jdGlvbigpe3JldHVybiBuZXcgSC5WUigiaXNvbGF0ZXMvXFxkKyIsSC52NCgiaXNvbGF0ZXMvXFxkKyIsITEsITAsITEpLG51bGwsbnVsbCl9KQorSS4kbGF6eSgkLCJfY3VycmVudElzb2xhdGVNYXRjaGVyIiwidmYiLCJmQSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguVlIoImlzb2xhdGVzL1xcZCsiLEgudjQoImlzb2xhdGVzL1xcZCsiLCExLCEwLCExKSxudWxsLG51bGwpfSkKIEkuJGxhenkoJCwiX2N1cnJlbnRPYmplY3RNYXRjaGVyIiwiZDAiLCJyYyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEguVlIoImlzb2xhdGVzL1xcZCsvIixILnY0KCJpc29sYXRlcy9cXGQrLyIsITEsITAsITEpLG51bGwsbnVsbCl9KQorSS4kbGF6eSgkLCJrUmVndWxhckZ1bmN0aW9uIiwiSWoiLCJZRiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoImZ1bmN0aW9uIil9KQorSS4kbGF6eSgkLCJrQ2xvc3VyZUZ1bmN0aW9uIiwialgiLCJ4cSIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoImNsb3N1cmUgZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtHZXR0ZXJGdW5jdGlvbiIsIkYwIiwiR0ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJnZXR0ZXIgZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtTZXR0ZXJGdW5jdGlvbiIsIkJzIiwiS3ciLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJzZXR0ZXIgZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtDb25zdHJ1Y3RvciIsIkc4Iiwia2oiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJjb25zdHJ1Y3RvciIpfSkKK0kuJGxhenkoJCwia0ltcGxpY2l0R2V0dGVyRnVuY3Rpb24iLCJ4cyIsImQ5IixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiaW1wbGljaXQgZ2V0dGVyIGZ1bmN0aW9uIil9KQorSS4kbGF6eSgkLCJrSW1wbGljaXRTZXR0ZXJGdW5jdGlvbiIsImFiIiwibkUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJpbXBsaWNpdCBzZXR0ZXIgZnVuY3Rpb24iKX0pCitJLiRsYXp5KCQsImtTdGF0aWNJbml0aWFsaXplciIsIlNwIiwieTUiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJzdGF0aWMgaW5pdGlhbGl6ZXIiKX0pCitJLiRsYXp5KCQsImtNZXRob2RFeHRyYWN0b3IiLCJFdCIsIk90IixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygibWV0aG9kIGV4dHJhY3RvciIpfSkKK0kuJGxhenkoJCwia05vU3VjaE1ldGhvZERpc3BhdGNoZXIiLCJMbCIsIkU3IixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5Iaygibm9TdWNoTWV0aG9kIGRpc3BhdGNoZXIiKX0pCitJLiRsYXp5KCQsImtJbnZva2VGaWVsZERpc3BhdGNoZXIiLCJIVSIsImY2IixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiaW52b2tlIGZpZWxkIGRpc3BhdGNoZXIiKX0pCitJLiRsYXp5KCQsImtDb2xsZWN0ZWQiLCJidCIsImIxIixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiQ29sbGVjdGVkIil9KQorSS4kbGF6eSgkLCJrTmF0aXZlIiwid3AiLCJsMyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEQuSGsoIk5hdGl2ZSIpfSkKK0kuJGxhenkoJCwia1RhZyIsInozIiwiengiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJUYWciKX0pCitJLiRsYXp5KCQsImtSZXVzZWQiLCJZYiIsIk1RIixmdW5jdGlvbigpe3JldHVybiBuZXcgRC5IaygiUmV1c2VkIil9KQorSS4kbGF6eSgkLCJrVU5LTk9XTiIsInZlIiwibEMiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBELkhrKCJVTktOT1dOIil9KQogSS4kbGF6eSgkLCJvYmplY3RBY2Nlc3NvciIsImo4IiwiY3AiLGZ1bmN0aW9uKCl7cmV0dXJuIEQua1AoKX0pCiBJLiRsYXp5KCQsInR5cGVJbnNwZWN0b3IiLCJZdiIsIm1YIixmdW5jdGlvbigpe3JldHVybiBELmtQKCl9KQogSS4kbGF6eSgkLCJzeW1ib2xDb252ZXJ0ZXIiLCJxZSIsIk1nIixmdW5jdGlvbigpe3JldHVybiBELmtQKCl9KQotSS4kbGF6eSgkLCJfREVGQVVMVCIsImFjIiwiSFQiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLlZFKG51bGwpfSkKLUkuJGxhenkoJCwiX2NoZWNrYm94RXZlbnRUeXBlIiwiblMiLCJEUiIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0uVWZhKCkuJDAoKX0pCitJLiRsYXp5KCQsIl9ERUZBVUxUIiwiYWMiLCJESCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0uVkUobnVsbCl9KQorSS4kbGF6eSgkLCJfY2hlY2tib3hFdmVudFR5cGUiLCJTOCIsIkZGIixmdW5jdGlvbigpe3JldHVybiBuZXcgTS5SYWEoKS4kMCgpfSkKIEkuJGxhenkoJCwiX2NvbnRlbnRzT3duZXIiLCJtbiIsIkxRIixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLnFvKG51bGwpLFtudWxsXSl9KQotSS4kbGF6eSgkLCJfb3duZXJTdGFnaW5nRG9jdW1lbnQiLCJFVyIsIm14IixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLnFvKG51bGwpLFtudWxsXSl9KQotSS4kbGF6eSgkLCJfYWxsVGVtcGxhdGVzU2VsZWN0b3JzIiwiWU8iLCJaZSIsZnVuY3Rpb24oKXtyZXR1cm4idGVtcGxhdGUsICIrSi5rbChDLno1Lmd2YyhDLno1KSxuZXcgTS5NZFEoKSkuelYoMCwiLCAiKX0pCi1JLiRsYXp5KCQsIl90ZW1wbGF0ZU9ic2VydmVyIiwia1kiLCJwVCIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3ICh3aW5kb3cuTXV0YXRpb25PYnNlcnZlcnx8d2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXJ8fHdpbmRvdy5Nb3pNdXRhdGlvbk9ic2VydmVyKShILnRSKFcuRnMobmV3IE0uRE9lKCkpLDIpKX0pCi1JLiRsYXp5KCQsIl9lbXB0eUluc3RhbmNlIiwib0wiLCJFNyIsZnVuY3Rpb24oKXtyZXR1cm4gbmV3IE0ubFBhKCkuJDAoKX0pCitJLiRsYXp5KCQsIl9vd25lclN0YWdpbmdEb2N1bWVudCIsInYyIiwidEYiLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8obnVsbCksW251bGxdKX0pCitJLiRsYXp5KCQsIl9hbGxUZW1wbGF0ZXNTZWxlY3RvcnMiLCJZTyIsIlplIixmdW5jdGlvbigpe3JldHVybiJ0ZW1wbGF0ZSwgIitKLmtsKEMuejUuZ3ZjKEMuejUpLG5ldyBNLllKRygpKS56VigwLCIsICIpfSkKK0kuJGxhenkoJCwiX3RlbXBsYXRlT2JzZXJ2ZXIiLCJqb0siLCJpayIsZnVuY3Rpb24oKXtyZXR1cm4gVy5XcyhuZXcgTS5sUGEoKSl9KQorSS4kbGF6eSgkLCJfZW1wdHlJbnN0YW5jZSIsIm9MIiwiemwiLGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBNLlVmYSgpLiQwKCl9KQogSS4kbGF6eSgkLCJfaW5zdGFuY2VFeHRlbnNpb24iLCJBSCIsInZIIixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLnFvKG51bGwpLFtudWxsXSl9KQogSS4kbGF6eSgkLCJfaXNTdGFnaW5nRG9jdW1lbnQiLCJGZyIsIktzIixmdW5jdGlvbigpe3JldHVybiBILlZNKG5ldyBQLnFvKG51bGwpLFtudWxsXSl9KQogSS4kbGF6eSgkLCJfZXhwYW5kbyIsImZGIiwiY20iLGZ1bmN0aW9uKCl7cmV0dXJuIEguVk0obmV3IFAucW8oInRlbXBsYXRlX2JpbmRpbmciKSxbbnVsbF0pfSkKIAotaW5pdC5mdW5jdGlvbkFsaWFzZXM9e1NhOjIyM30KLWluaXQubWV0YWRhdGE9WyJzZW5kZXIiLCJlIiwiZXZlbnQiLCJ1cmkiLCJvbkVycm9yIix7ZnVuYzoicGQiLGFyZ3M6W1AucVVdfSwiY2xvc3VyZSIsImlzb2xhdGUiLCJudW1iZXJPZkFyZ3VtZW50cyIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19LCJfIix7ZnVuYzoiQ3UiLHJldDpQLnFVLGFyZ3M6W1AuS05dfSwiYnl0ZXMiLHtmdW5jOiJSSiIscmV0OlAucVUsYXJnczpbbnVsbF19LHtmdW5jOiJrbCIsdm9pZDp0cnVlfSx7ZnVuYzoiYjEiLHZvaWQ6dHJ1ZSxhcmdzOlt7ZnVuYzoia2wiLHZvaWQ6dHJ1ZX1dfSx7ZnVuYzoiYTAiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsXX0sInZhbHVlIix7ZnVuYzoiTXgiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsXSxvcHQ6W1AuQnBQXX0sLCJlcnJvciIsInN0YWNrVHJhY2UiLHtmdW5jOiJyRSIsdm9pZDp0cnVlLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLG51bGwsUC5CcFBdfSwic2VsZiIsInBhcmVudCIsInpvbmUiLHtmdW5jOiJRTiIsYXJnczpbUC5kbCxQLnFLLFAuZGwse2Z1bmM6Ik5UIn1dfSwiZiIse2Z1bmM6ImFFIixhcmdzOltQLmRsLFAucUssUC5kbCx7ZnVuYzoibDQiLGFyZ3M6W251bGxdfSxudWxsXX0sImFyZyIse2Z1bmM6InRhIixhcmdzOltQLmRsLFAucUssUC5kbCx7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LG51bGwsbnVsbF19LHtmdW5jOiJybCIscmV0OntmdW5jOiJOVCJ9LGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJOVCJ9XX0se2Z1bmM6ImllIixyZXQ6e2Z1bmM6Imw0IixhcmdzOltudWxsXX0sYXJnczpbUC5kbCxQLnFLLFAuZGwse2Z1bmM6Imw0IixhcmdzOltudWxsXX1dfSx7ZnVuYzoiR3QiLHJldDp7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJMcyIsYXJnczpbbnVsbCxudWxsXX1dfSx7ZnVuYzoiaVYiLHZvaWQ6dHJ1ZSxhcmdzOltQLmRsLFAucUssUC5kbCx7ZnVuYzoiTlQifV19LHtmdW5jOiJhcyIscmV0OlAuWGEsYXJnczpbUC5kbCxQLnFLLFAuZGwsUC5hNix7ZnVuYzoia2wiLHZvaWQ6dHJ1ZX1dfSwiZHVyYXRpb24iLCJjYWxsYmFjayIse2Z1bmM6IlhnIix2b2lkOnRydWUsYXJnczpbUC5kbCxQLnFLLFAuZGwsUC5xVV19LHtmdW5jOiJreCIsdm9pZDp0cnVlLGFyZ3M6W1AucVVdfSx7ZnVuYzoiTmYiLHJldDpQLmRsLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLFAuYVl5LFAuWjBdfSx7ZnVuYzoiR2wiLHJldDpQLmEyLGFyZ3M6W251bGwsbnVsbF19LCJhIiwiYiIse2Z1bmM6ImJYIixyZXQ6UC5LTixhcmdzOltudWxsXX0se2Z1bmM6InVKIixyZXQ6UC5hLGFyZ3M6W251bGxdfSwib2JqZWN0Iix7ZnVuYzoiUDIiLHJldDpQLktOLGFyZ3M6W1AuUnosUC5Sel19LHtmdW5jOiJ6diIscmV0OlAuYTIsYXJnczpbUC5hLFAuYV19LHtmdW5jOiJaWSIscmV0OlAuS04sYXJnczpbUC5hXX0sInJlY2VpdmVyIix7ZnVuYzoid0kiLGFyZ3M6W251bGwsbnVsbCxudWxsLG51bGxdfSwibmFtZSIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJjYXB0dXJlVGhpcyIsImFyZ3VtZW50cyIsIm8iLHtmdW5jOiJWSCIscmV0OlAuYTIsYXJnczpbUC5HRF19LCJzeW1ib2wiLCJ2IiwieCIse2Z1bmM6InFxIixyZXQ6W1AuUVYsSy5BZXBdLGFyZ3M6W1AuUVZdfSwiaXRlcmFibGUiLHtmdW5jOiJIYyIscmV0OlAuS04sYXJnczpbRC5hZixELmFmXX0sImludm9jYXRpb24iLCJmcmFjdGlvbkRpZ2l0cyIse2Z1bmM6Ik5UIn0se2Z1bmM6InJ6IixhcmdzOltQLkVIXX0sImNvZGUiLCJtc2ciLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwia2V5IiwidmFsIix7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LHtmdW5jOiJaYSIsYXJnczpbUC5xVSxudWxsXX0se2Z1bmM6IlRTIixhcmdzOltudWxsLFAucVVdfSx7ZnVuYzoiWlQiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsLG51bGwsbnVsbF19LCJjIix7ZnVuYzoiRjMiLHZvaWQ6dHJ1ZSxhcmdzOltELk43XX0se2Z1bmM6IkdKIix2b2lkOnRydWUsYXJnczpbRC5FUF19LCJleGNlcHRpb24iLHtmdW5jOiJBZiIsYXJnczpbRC53dl19LCJ2bSIse2Z1bmM6IndrIixyZXQ6UC5hMixhcmdzOltudWxsXX0sIm9sZEV2ZW50Iix7ZnVuYzoiZjQiLHZvaWQ6dHJ1ZSxhcmdzOltXLmY1XX0sIm9iaiIsImkiLCJyZXNwb25zZVRleHQiLHtmdW5jOiJ1QyIsYXJnczpbVS5aNSxVLlo1XX0se2Z1bmM6IkhFIixyZXQ6UC5LTixhcmdzOltQLktOLFAuS05dfSwiY29sdW1uIiwiZG9uZSIse2Z1bmM6IlBLIixyZXQ6UC5xVSxhcmdzOltHLlkyXX0sInJvdyIse2Z1bmM6IlN6Iix2b2lkOnRydWUsYXJnczpbVy5lYSxudWxsLFcuaDRdfSwiZGV0YWlsIiwidGFyZ2V0Iiwib2JqZWN0Q2xhc3MiLHtmdW5jOiJXciIscmV0OltQLmI4LEQuYWZdLGFyZ3M6W1AucVVdfSwidGV4dCIse2Z1bmM6IktEWSIscmV0OltQLmI4LEQuYWZdLGFyZ3M6W251bGxdfSwibGltaXQiLCJkdW1teSIse2Z1bmM6IlE1IixhcmdzOltELnZPXX0se2Z1bmM6Ik5wIix2b2lkOnRydWUsYXJnczpbVy5lYSxudWxsLFcuS1ZdfSx7ZnVuYzoiVkkiLGFyZ3M6W0Qua3hdfSwiZGF0YSIse2Z1bmM6InV1Iix2b2lkOnRydWUsYXJnczpbUC5hXSxvcHQ6W1AuQnBQXX0sInRoZUVycm9yIiwidGhlU3RhY2tUcmFjZSIse2Z1bmM6ImpLIixhcmdzOltQLmFdfSx7ZnVuYzoiY3EiLHZvaWQ6dHJ1ZSxvcHQ6W251bGxdfSx7ZnVuYzoiSHAiLGFyZ3M6W251bGxdLG9wdDpbbnVsbF19LHtmdW5jOiJVZiIscmV0OlAuYTJ9LCJpZ25vcmVkIiwiY29udmVydCIsImVsZW1lbnQiLHtmdW5jOiJ6ayIsYXJnczpbUC5hMl19LHtmdW5jOiJjMyIsdm9pZDp0cnVlLG9wdDpbUC5iOF19LCJyZXN1bWVTaWduYWwiLHtmdW5jOiJoYSIsYXJnczpbbnVsbCxQLkJwUF19LHtmdW5jOiJONSIsdm9pZDp0cnVlLGFyZ3M6W251bGwsUC5CcFBdfSwiZWFjaCIsImsiLHtmdW5jOiJsdiIsYXJnczpbUC5HRCxudWxsXX0se2Z1bmM6IlRsYSIscmV0OlAuS04sYXJnczpbUC5xVV19LHtmdW5jOiJaaFIiLHJldDpQLkNQLGFyZ3M6W1AucVVdfSx7ZnVuYzoiY2QiLHJldDpQLmEyLGFyZ3M6W1AuS05dfSx7ZnVuYzoiVmUiLHJldDpQLktOLGFyZ3M6W1AuS05dfSx7ZnVuYzoibGsiLHJldDpQLktOLGFyZ3M6W251bGwsbnVsbF19LCJieXRlU3RyaW5nIiwieGhyIix7ZnVuYzoiUU8iLHZvaWQ6dHJ1ZSxhcmdzOltXLkFqWV19LCJyZXN1bHQiLHtmdW5jOiJmSyIsYXJnczpbRC5hZl19LHtmdW5jOiJJUyIscmV0Ok8uSHp9LCJyZXNwb25zZSIsInN0Iix7ZnVuYzoiRDgiLHZvaWQ6dHJ1ZSxhcmdzOltELnZPXX0sIm5ld1Byb2ZpbGUiLHtmdW5jOiJZaSIscmV0OlAucVUsYXJnczpbUC5hMl19LCJuZXdTcGFjZSIse2Z1bmM6Ilo1IixhcmdzOltQLktOXX0se2Z1bmM6ImtkIixhcmdzOltQLktOLG51bGxdfSx7ZnVuYzoieEQiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJwZCIsYXJnczpbUC5xVV19XX0se2Z1bmM6IlFkIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoibGEiLHJldDpQLlFWLGFyZ3M6W1AucVVdfV19LCJzIix7ZnVuYzoiUzAiLHZvaWQ6dHJ1ZSxhcmdzOltQLmEyLG51bGxdfSwiZXhwYW5kIiwibSIse2Z1bmM6ImZuaCIscmV0OlAuYjgsYXJnczpbbnVsbF19LCJ0YWdQcm9maWxlIiwicmVjIix7ZnVuYzoiWE8iLGFyZ3M6W04uSFZdfSx7ZnVuYzoiZDRDIix2b2lkOnRydWUsYXJnczpbVy5BalksbnVsbCxXLmg0XX0se2Z1bmM6IklmIixyZXQ6UC5xVSxhcmdzOltQLnFVXX0sInVybCIse2Z1bmM6Im54ZyIscmV0OlAucVUsYXJnczpbUC5DUF19LCJ0aW1lIix7ZnVuYzoieGMiLHJldDpQLmEyLGFyZ3M6W1AucVVdfSwidHlwZSIse2Z1bmM6IkI0IixhcmdzOltQLnFLLFAuZGxdfSx7ZnVuYzoiWmciLGFyZ3M6W1AuZGwsUC5xSyxQLmRsLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19XX0se2Z1bmM6IkRGIix2b2lkOnRydWUsYXJnczpbUC5hXX0sInJlY29yZHMiLHtmdW5jOiJxayIsYXJnczpbTC5UdixudWxsXX0sIm1vZGVsIiwibm9kZSIsIm9uZVRpbWUiLHtmdW5jOiJvWXQiLGFyZ3M6W251bGwsbnVsbCxudWxsXX0se2Z1bmM6InJkIix2b2lkOnRydWUsYXJnczpbUC5xVSxQLnFVXX0se2Z1bmM6ImFBIix2b2lkOnRydWUsYXJnczpbUC5XTyxQLlowLFAuV09dfSx7ZnVuYzoiSzciLHZvaWQ6dHJ1ZSxhcmdzOltbUC5XTyxULnlqXV19LHtmdW5jOiJRWSIsdm9pZDp0cnVlLGFyZ3M6W1tQLlFWLEEuWWpdXX0sImNoYW5nZXMiLCJqc0VsZW0iLCJleHRlbmRlZSIse2Z1bmM6IlFQIixhcmdzOltudWxsLFAucVUsUC5xVV19LHtmdW5jOiJ0dyIsYXJnczpbbnVsbCxXLktWLFAuYTJdfSx7ZnVuYzoiSGIiLGFyZ3M6W251bGxdLG5hbWVkOntza2lwQ2hhbmdlczpQLmEyfX0sITEsInNraXBDaGFuZ2VzIix7ZnVuYzoiWkQiLGFyZ3M6W1tQLldPLFQueWpdXX0se2Z1bmM6IkN4IixyZXQ6VS56WCxhcmdzOltVLklwLFUuSXBdfSx7ZnVuYzoiUWMiLGFyZ3M6W1UuSXBdfSwiaGl0cyIsImlkIiwibWFwIix7ZnVuYzoiSkMiLGFyZ3M6W1YucUNdfSx7ZnVuYzoicnQiLHJldDpQLmI4fSwic2NyaXB0Q292ZXJhZ2UiLCJvd25pbmdJc29sYXRlIix7ZnVuYzoiRDAiLHJldDpbUC5iOCxbUC5XTyxELmR5XV0sYXJnczpbRC52T119LCJjbGFzc0xpc3QiLHtmdW5jOiJsQiIscmV0OltQLmI4LEQuZHldLGFyZ3M6W1tQLldPLEQuZHldXX0sImNsYXNzZXMiLCJ0aW1lciIse2Z1bmM6Ikk2YSIscmV0OlAucVV9LHtmdW5jOiJINiIscmV0OlAucVUsYXJnczpbRC5reF19LHtmdW5jOiJxUSIsdm9pZDp0cnVlLGFyZ3M6W0QudnhdfSwic2NyaXB0IiwiZnVuYyIse2Z1bmM6IkpRIix2b2lkOnRydWUsYXJnczpbVy5CSV19LCJFdmVudCIse2Z1bmM6IldFeiIsdm9pZDp0cnVlLGFyZ3M6W1cuSHldfSx7ZnVuYzoiVDIiLHZvaWQ6dHJ1ZSxhcmdzOltQLnFVLFUuVTJdfSx7ZnVuYzoicHgiLGFyZ3M6W1AucVUsVS5VMl19LCJkZXRhaWxzIiwicmVmIix7ZnVuYzoiUHpDIix2b2lkOnRydWUsYXJnczpbW1AuV08sRy5EQV1dfSwic3BsaWNlcyIse2Z1bmM6InhoIix2b2lkOnRydWUsYXJnczpbVy5Bal19LHtmdW5jOiJWdiIscmV0OlAucVUsYXJnczpbUC5hXX0se2Z1bmM6Imk4aSIscmV0OlAucVUsYXJnczpbW1AuV08sUC5hXV19LCJ2YWx1ZXMiLCJ0YXJnZXRzIix7ZnVuYzoidzkiLHJldDpQLmI4LGFyZ3M6W1AucVVdfSxdOyQ9bnVsbAoraW5pdC5mdW5jdGlvbkFsaWFzZXM9e1NhOjIyN30KK2luaXQubWV0YWRhdGE9WyJzZW5kZXIiLCJlIiwiZXZlbnQiLCJ1cmkiLCJvbkVycm9yIix7ZnVuYzoicGQiLGFyZ3M6W1AucVVdfSwiY2xvc3VyZSIsImlzb2xhdGUiLCJudW1iZXJPZkFyZ3VtZW50cyIsImFyZzEiLCJhcmcyIiwiYXJnMyIsImFyZzQiLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19LCJfIix7ZnVuYzoiQ3UiLHJldDpQLnFVLGFyZ3M6W1AuS05dfSwiYnl0ZXMiLHtmdW5jOiJSSiIscmV0OlAucVUsYXJnczpbbnVsbF19LHtmdW5jOiJoOSIsdm9pZDp0cnVlfSx7ZnVuYzoibjkiLHZvaWQ6dHJ1ZSxhcmdzOlt7ZnVuYzoiaDkiLHZvaWQ6dHJ1ZX1dfSx7ZnVuYzoiYTAiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsXX0sInZhbHVlIix7ZnVuYzoiTXgiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsXSxvcHQ6W1AuQnBQXX0sLCJlcnJvciIsInN0YWNrVHJhY2UiLHtmdW5jOiJwQSIsdm9pZDp0cnVlLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCxudWxsLFAuQnBQXX0sInNlbGYiLCJwYXJlbnQiLCJ6b25lIix7ZnVuYzoiUU4iLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoiTlQifV19LCJmIix7ZnVuYzoiYUUiLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoibDQiLGFyZ3M6W251bGxdfSxudWxsXX0sImFyZyIse2Z1bmM6InRhIixhcmdzOltQLmRsLFAuZTR5LFAuZGwse2Z1bmM6IkxzIixhcmdzOltudWxsLG51bGxdfSxudWxsLG51bGxdfSx7ZnVuYzoicmwiLHJldDp7ZnVuYzoiTlQifSxhcmdzOltQLmRsLFAuZTR5LFAuZGwse2Z1bmM6Ik5UIn1dfSx7ZnVuYzoiWFJSIixyZXQ6e2Z1bmM6Imw0IixhcmdzOltudWxsXX0sYXJnczpbUC5kbCxQLmU0eSxQLmRsLHtmdW5jOiJsNCIsYXJnczpbbnVsbF19XX0se2Z1bmM6Ikd0IixyZXQ6e2Z1bmM6IkxzIixhcmdzOltudWxsLG51bGxdfSxhcmdzOltQLmRsLFAuZTR5LFAuZGwse2Z1bmM6IkxzIixhcmdzOltudWxsLG51bGxdfV19LHtmdW5jOiJpViIsdm9pZDp0cnVlLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoiTlQifV19LHtmdW5jOiJ6byIscmV0OlAuWGEsYXJnczpbUC5kbCxQLmU0eSxQLmRsLFAuYTYse2Z1bmM6Img5Iix2b2lkOnRydWV9XX0sImR1cmF0aW9uIiwiY2FsbGJhY2siLHtmdW5jOiJYZyIsdm9pZDp0cnVlLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCxQLnFVXX0se2Z1bmM6Imt4Iix2b2lkOnRydWUsYXJnczpbUC5xVV19LHtmdW5jOiJOZiIscmV0OlAuZGwsYXJnczpbUC5kbCxQLmU0eSxQLmRsLFAuYVl5LFAuWjBdfSx7ZnVuYzoiR2wiLHJldDpQLmEyLGFyZ3M6W251bGwsbnVsbF19LCJhIiwiYiIse2Z1bmM6ImJYIixyZXQ6UC5LTixhcmdzOltudWxsXX0se2Z1bmM6InVKIixyZXQ6UC5hLGFyZ3M6W251bGxdfSwib2JqZWN0Iix7ZnVuYzoieGgiLHJldDpQLktOLGFyZ3M6W1AuUnosUC5Sel19LHtmdW5jOiJ6diIscmV0OlAuYTIsYXJnczpbUC5hLFAuYV19LHtmdW5jOiJaWSIscmV0OlAuS04sYXJnczpbUC5hXX0sInJlY2VpdmVyIix7ZnVuYzoid0kiLGFyZ3M6W251bGwsbnVsbCxudWxsLG51bGxdfSwibmFtZSIsIm9sZFZhbHVlIiwibmV3VmFsdWUiLCJjYXB0dXJlVGhpcyIsImFyZ3VtZW50cyIsIm8iLHtmdW5jOiJWSCIscmV0OlAuYTIsYXJnczpbUC5JTl19LCJzeW1ib2wiLCJ2IiwieCIse2Z1bmM6InFxIixyZXQ6W1AuUVYsSy5BZXBdLGFyZ3M6W1AuUVZdfSwiaXRlcmFibGUiLHtmdW5jOiJIYyIscmV0OlAuS04sYXJnczpbRC5hZixELmFmXX0se2Z1bmM6IkJyIixyZXQ6UC5xVX0sImludm9jYXRpb24iLCJmcmFjdGlvbkRpZ2l0cyIse2Z1bmM6Ik5UIn0se2Z1bmM6InJ6IixhcmdzOltQLkVIXX0sImNvZGUiLCJtc2ciLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwia2V5IiwidmFsIix7ZnVuYzoiTHMiLGFyZ3M6W251bGwsbnVsbF19LHtmdW5jOiJaYSIsYXJnczpbUC5xVSxudWxsXX0se2Z1bmM6IlRTIixhcmdzOltudWxsLFAucVVdfSx7ZnVuYzoiWlQiLHZvaWQ6dHJ1ZSxhcmdzOltudWxsLG51bGwsbnVsbF19LCJjIix7ZnVuYzoiRjMiLHZvaWQ6dHJ1ZSxhcmdzOltELk43XX0se2Z1bmM6IkdKIix2b2lkOnRydWUsYXJnczpbRC5FUF19LCJleGNlcHRpb24iLHtmdW5jOiJBZiIsYXJnczpbRC53dl19LCJ2bSIse2Z1bmM6IndrIixyZXQ6UC5hMixhcmdzOltudWxsXX0sIm9sZEV2ZW50Iix7ZnVuYzoiZjQiLHZvaWQ6dHJ1ZSxhcmdzOltXLmY1XX0sIm9iaiIsImkiLCJyZXNwb25zZVRleHQiLHtmdW5jOiJ1QyIsYXJnczpbVS5aNSxVLlo1XX0se2Z1bmM6IkhFIixyZXQ6UC5LTixhcmdzOltQLktOLFAuS05dfSwiY29sdW1uIiwiZG9uZSIse2Z1bmM6IlBLIixyZXQ6UC5xVSxhcmdzOltHLlkyXX0sInJvdyIse2Z1bmM6IlN6Iix2b2lkOnRydWUsYXJnczpbVy5lYSxudWxsLFcuaDRdfSwiZGV0YWlsIiwidGFyZ2V0Iiwib2JqZWN0Q2xhc3MiLHtmdW5jOiJXciIscmV0OltQLmI4LEQuYWZdLGFyZ3M6W1AucVVdfSwidGV4dCIse2Z1bmM6IktEWSIscmV0OltQLmI4LEQuYWZdLGFyZ3M6W251bGxdfSwibGltaXQiLCJkdW1teSIse2Z1bmM6IlE1IixhcmdzOltELnZPXX0se2Z1bmM6Ik5wIix2b2lkOnRydWUsYXJnczpbVy5lYSxudWxsLFcuS1ZdfSx7ZnVuYzoiVkkiLGFyZ3M6W0Qua3hdfSwiZGF0YSIse2Z1bmM6InV1Iix2b2lkOnRydWUsYXJnczpbUC5hXSxvcHQ6W1AuQnBQXX0sInRoZUVycm9yIiwidGhlU3RhY2tUcmFjZSIse2Z1bmM6ImpLIixhcmdzOltQLmFdfSx7ZnVuYzoiY3EiLHZvaWQ6dHJ1ZSxvcHQ6W251bGxdfSx7ZnVuYzoiSHAiLGFyZ3M6W251bGxdLG9wdDpbbnVsbF19LHtmdW5jOiJVZiIscmV0OlAuYTJ9LCJpZ25vcmVkIiwiY29udmVydCIsImVsZW1lbnQiLHtmdW5jOiJ6ayIsYXJnczpbUC5hMl19LHtmdW5jOiJjMyIsdm9pZDp0cnVlLG9wdDpbUC5iOF19LCJyZXN1bWVTaWduYWwiLHtmdW5jOiJoYSIsYXJnczpbbnVsbCxQLkJwUF19LHtmdW5jOiJONSIsdm9pZDp0cnVlLGFyZ3M6W251bGwsUC5CcFBdfSwiZWFjaCIsImsiLHtmdW5jOiJqdCIsdm9pZDp0cnVlLGFyZ3M6W1AuS04sUC5LTl19LHtmdW5jOiJsdiIsYXJnczpbUC5JTixudWxsXX0se2Z1bmM6IlRsYSIscmV0OlAuS04sYXJnczpbUC5xVV19LHtmdW5jOiJaaFIiLHJldDpQLkNQLGFyZ3M6W1AucVVdfSx7ZnVuYzoiY2QiLHJldDpQLmEyLGFyZ3M6W1AuS05dfSx7ZnVuYzoiVmUiLHJldDpQLktOLGFyZ3M6W1AuS05dfSx7ZnVuYzoibGsiLHJldDpQLktOLGFyZ3M6W251bGwsbnVsbF19LCJieXRlU3RyaW5nIiwieGhyIix7ZnVuYzoiUU8iLHZvaWQ6dHJ1ZSxhcmdzOltXLkFqWV19LCJyZXN1bHQiLHtmdW5jOiJmSyIsYXJnczpbRC5hZl19LHtmdW5jOiJJUyIscmV0Ok8uSHp9LCJyZXNwb25zZSIsInN0Iix7ZnVuYzoiRDgiLHZvaWQ6dHJ1ZSxhcmdzOltELnZPXX0sIm5ld1Byb2ZpbGUiLHtmdW5jOiJBZyIscmV0OlAucVUsYXJnczpbUC5hMl19LCJuZXdTcGFjZSIse2Z1bmM6Ilo1IixhcmdzOltQLktOXX0se2Z1bmM6ImtkIixhcmdzOltQLktOLG51bGxdfSx7ZnVuYzoieEQiLHJldDpQLlFWLGFyZ3M6W3tmdW5jOiJwZCIsYXJnczpbUC5xVV19XX0se2Z1bmM6IlFkIixyZXQ6UC5RVixhcmdzOlt7ZnVuYzoidVcyIixyZXQ6UC5RVixhcmdzOltQLnFVXX1dfSwicyIse2Z1bmM6Ilc3Iix2b2lkOnRydWUsYXJnczpbUC5hMixudWxsXX0sImV4cGFuZCIsIm0iLHtmdW5jOiJmbmgiLHJldDpQLmI4LGFyZ3M6W251bGxdfSwidGFnUHJvZmlsZSIsInJlYyIse2Z1bmM6IlhPIixhcmdzOltOLkhWXX0se2Z1bmM6ImQ0QyIsdm9pZDp0cnVlLGFyZ3M6W1cuQWpZLG51bGwsVy5oNF19LHtmdW5jOiJJZiIscmV0OlAucVUsYXJnczpbUC5xVV19LCJ1cmwiLHtmdW5jOiJueGciLHJldDpQLnFVLGFyZ3M6W1AuQ1BdfSwidGltZSIse2Z1bmM6IndUNiIscmV0OlAuYTIsYXJnczpbUC5xVV19LCJ0eXBlIix7ZnVuYzoiQjQiLGFyZ3M6W1AuZTR5LFAuZGxdfSx7ZnVuYzoiWmciLGFyZ3M6W1AuZGwsUC5lNHksUC5kbCx7ZnVuYzoibDQiLGFyZ3M6W251bGxdfV19LHtmdW5jOiJERiIsdm9pZDp0cnVlLGFyZ3M6W1AuYV19LCJyZWNvcmRzIix7ZnVuYzoicWsiLGFyZ3M6W0wuVHYsbnVsbF19LCJtb2RlbCIsIm5vZGUiLCJvbmVUaW1lIix7ZnVuYzoib1l0IixhcmdzOltudWxsLG51bGwsbnVsbF19LHtmdW5jOiJyZCIsdm9pZDp0cnVlLGFyZ3M6W1AucVUsUC5xVV19LHtmdW5jOiJhQSIsdm9pZDp0cnVlLGFyZ3M6W1AuV08sUC5aMCxQLldPXX0se2Z1bmM6IllUIix2b2lkOnRydWUsYXJnczpbW1AuV08sVC55al1dfSx7ZnVuYzoiUVkiLHZvaWQ6dHJ1ZSxhcmdzOltbUC5RVixBLllqXV19LCJjaGFuZ2VzIiwianNFbGVtIiwiZXh0ZW5kZWUiLHtmdW5jOiJRUCIsYXJnczpbbnVsbCxQLnFVLFAucVVdfSx7ZnVuYzoidHciLGFyZ3M6W251bGwsVy5LVixQLmEyXX0se2Z1bmM6IkhiIixhcmdzOltudWxsXSxuYW1lZDp7c2tpcENoYW5nZXM6UC5hMn19LCExLCJza2lwQ2hhbmdlcyIse2Z1bmM6IlpEIixhcmdzOltbUC5XTyxULnlqXV19LHtmdW5jOiJDeCIscmV0OlUuelgsYXJnczpbVS5JcCxVLklwXX0se2Z1bmM6IlFjIixhcmdzOltVLklwXX0sImxpbmUiLHtmdW5jOiJUeiIsdm9pZDp0cnVlLGFyZ3M6W251bGwsbnVsbF19LCJtdXRhdGlvbnMiLCJvYnNlcnZlciIsImlkIiwibWFwIix7ZnVuYzoiSkMiLGFyZ3M6W1YucUNdfSx7ZnVuYzoicnQiLHJldDpQLmI4fSwic2NyaXB0Q292ZXJhZ2UiLCJvd25pbmdJc29sYXRlIix7ZnVuYzoiRDAiLHJldDpbUC5iOCxbUC5XTyxELmR5XV0sYXJnczpbRC52T119LCJjbGFzc0xpc3QiLHtmdW5jOiJsQiIscmV0OltQLmI4LEQuZHldLGFyZ3M6W1tQLldPLEQuZHldXX0sImNsYXNzZXMiLCJ0aW1lciIse2Z1bmM6Ikg2IixyZXQ6UC5xVSxhcmdzOltELmt4XX0se2Z1bmM6InFRIix2b2lkOnRydWUsYXJnczpbRC52eF19LCJzY3JpcHQiLCJmdW5jIix7ZnVuYzoiSlEiLHZvaWQ6dHJ1ZSxhcmdzOltXLkJJXX0sIkV2ZW50Iix7ZnVuYzoiV0V6Iix2b2lkOnRydWUsYXJnczpbVy5IeV19LHtmdW5jOiJUMiIsdm9pZDp0cnVlLGFyZ3M6W1AucVUsVS5VMl19LHtmdW5jOiJweCIsYXJnczpbUC5xVSxVLlUyXX0sImRldGFpbHMiLCJyZWYiLHtmdW5jOiJLNyIsdm9pZDp0cnVlLGFyZ3M6W1tQLldPLEcuREFdXX0sInNwbGljZXMiLHtmdW5jOiJrMkciLHZvaWQ6dHJ1ZSxhcmdzOltXLmhzd119LHtmdW5jOiJWdiIscmV0OlAucVUsYXJnczpbUC5hXX0se2Z1bmM6Imk4aSIscmV0OlAucVUsYXJnczpbW1AuV08sUC5hXV19LCJ2YWx1ZXMiLCJ0YXJnZXRzIix7ZnVuYzoidzkiLHJldDpQLmI4LGFyZ3M6W1AucVVdfSxdOyQ9bnVsbAogSSA9IEkuJGZpbmlzaElzb2xhdGVDb25zdHJ1Y3RvcihJKQogJD1uZXcgSSgpCiBmdW5jdGlvbiBjb252ZXJ0VG9GYXN0T2JqZWN0KGEpe2Z1bmN0aW9uIE15Q2xhc3MoKXt9TXlDbGFzcy5wcm90b3R5cGU9YQpAQCAtMjA5NTUsNyArMjEyNDYsNyBAQAogcmV0dXJufWlmKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpe2EoZG9jdW1lbnQuY3VycmVudFNjcmlwdCkKIHJldHVybn12YXIgej1kb2N1bWVudC5zY3JpcHRzCiBmdW5jdGlvbiBvbkxvYWQoYil7Zm9yKHZhciB4PTA7eDx6Lmxlbmd0aDsrK3gpe3pbeF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsb25Mb2FkLGZhbHNlKX1hKGIudGFyZ2V0KX1mb3IodmFyIHk9MDt5PHoubGVuZ3RoOysreSl7elt5XS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixvbkxvYWQsZmFsc2UpfX0pKGZ1bmN0aW9uKGEpe2luaXQuY3VycmVudFNjcmlwdD1hCi1pZih0eXBlb2YgZGFydE1haW5SdW5uZXI9PT0iZnVuY3Rpb24iKXtkYXJ0TWFpblJ1bm5lcihmdW5jdGlvbihiKXtILndXKEUuVjcoKSxiKX0sW10pfWVsc2V7KGZ1bmN0aW9uKGIpe0gud1coRS5WNygpLGIpfSkoW10pfX0pCitpZih0eXBlb2YgZGFydE1haW5SdW5uZXI9PT0iZnVuY3Rpb24iKXtkYXJ0TWFpblJ1bm5lcihmdW5jdGlvbihiKXtILndXKEUuVjdBKCksYil9LFtdKX1lbHNleyhmdW5jdGlvbihiKXtILndXKEUuVjdBKCksYil9KShbXSl9fSkKIGZ1bmN0aW9uIGluaXQoKXtJLnA9e30KIGZ1bmN0aW9uIGdlbmVyYXRlQWNjZXNzb3IoYSxiLGMpe3ZhciB5PWEuc3BsaXQoIi0iKQogdmFyIHg9eVswXQpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2NsYXNzX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jbGFzc192aWV3Lmh0bWwKaW5kZXggMjk2ZmY5ZC4uY2Y4N2FiMiAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2NsYXNzX3ZpZXcuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvY2xhc3Nfdmlldy5odG1sCkBAIC0xODksNyArMTg5LDkgQEAKICAgICA8L2Rpdj4KIAogICAgIDxocj4KLSAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIgcG9zPSJ7eyBjbHMudG9rZW5Qb3MgfX0iIGVuZFBvcz0ie3sgY2xzLmVuZFRva2VuUG9zIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIKKyAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zPSJ7eyBjbHMudG9rZW5Qb3MgfX0iCisgICAgICAgICAgICAgICAgICBlbmRQb3M9Int7IGNscy5lbmRUb2tlblBvcyB9fSI+CiAgICAgPC9zY3JpcHQtaW5zZXQ+CiAKICAgICA8YnI+PGJyPjxicj48YnI+CkBAIC0xOTcsNCArMTk5LDQgQEAKICAgPC90ZW1wbGF0ZT4KIDwvcG9seW1lci1lbGVtZW50PgogCi08c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0iY2xhc3Nfdmlldy5kYXJ0Ij48L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0iY2xhc3Nfdmlldy5kYXJ0Ij48L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jb2RlX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9jb2RlX3ZpZXcuaHRtbAppbmRleCAwN2RmMTM0Li4zNDI5NGFkIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvY29kZV92aWV3Lmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2NvZGVfdmlldy5odG1sCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgPG5hdi1iYXI+CiAgICAgICA8dG9wLW5hdi1tZW51PjwvdG9wLW5hdi1tZW51PgogICAgICAgPGlzb2xhdGUtbmF2LW1lbnUgaXNvbGF0ZT0ie3sgY29kZS5pc29sYXRlIH19Ij48L2lzb2xhdGUtbmF2LW1lbnU+Ci0gICAgICA8bmF2LW1lbnUgbGluaz0iLiIgYW5jaG9yPSJ7eyBjb2RlLm5hbWUgfX0iIGxhc3Q9Int7IHRydWUgfX0iPjwvbmF2LW1lbnU+CisgICAgICA8bmF2LW1lbnUgbGluaz0ie3sgY29kZS5saW5rIH19IiBhbmNob3I9Int7IGNvZGUubmFtZSB9fSIgbGFzdD0ie3sgdHJ1ZSB9fSI+PC9uYXYtbWVudT4KICAgICAgIDxuYXYtcmVmcmVzaCBjYWxsYmFjaz0ie3sgcmVmcmVzaCB9fSI+PC9uYXYtcmVmcmVzaD4KICAgICAgIDxuYXYtY29udHJvbD48L25hdi1jb250cm9sPgogICAgIDwvbmF2LWJhcj4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuaHRtbAppbmRleCAxNmEyODFmLi5mNWFiZDMzIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZnVuY3Rpb25fcmVmLmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3JlZi5odG1sCkBAIC00LDE0ICs0LDE0IEBACiAKIDxwb2x5bWVyLWVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tcmVmIiBleHRlbmRzPSJzZXJ2aWNlLXJlZiI+CiAgIDx0ZW1wbGF0ZT48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9zaGFyZWQuY3NzIiAvPjwhLS0gVGhlc2UgY29tbWVudHMgYXJlIGhlcmUgdG8gYWxsb3cgbmV3bGluZXMuCi0gICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgaXNEYXJ0IH19Ij48IS0tCi0gICAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJiYgIWhhc1BhcmVudCAmJiBoYXNDbGFzcyB9fSI+PCEtLQotICAgICAgIC0tPjxjbGFzcy1yZWYgcmVmPSJ7eyByZWZbJ293bmVyJ10gfX0iPjwvY2xhc3MtcmVmPi48L3RlbXBsYXRlPjwhLS0KLSAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJiYgaGFzUGFyZW50IH19Ij48IS0tCi0gICAgICAgLS0+PGZ1bmN0aW9uLXJlZiByZWY9Int7IHJlZlsncGFyZW50J10gfX0iIHF1YWxpZmllZD0ie3sgdHJ1ZSB9fSI+CisgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcmVmLmlzRGFydCB9fSI+PCEtLQorICAgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICYmIHJlZi5wYXJlbnQgPT0gbnVsbCAmJiByZWYub3duaW5nQ2xhc3MgIT0gbnVsbCB9fSI+PCEtLQorICAgICAgIC0tPjxjbGFzcy1yZWYgcmVmPSJ7eyByZWYub3duaW5nQ2xhc3NdIH19Ij48L2NsYXNzLXJlZj4uPC90ZW1wbGF0ZT48IS0tCisgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICYmIHJlZi5wYXJlbnQgIT0gbnVsbCB9fSI+PCEtLQorICAgICAgIC0tPjxmdW5jdGlvbi1yZWYgcmVmPSJ7eyByZWYucGFyZW50IH19IiBxdWFsaWZpZWQ9Int7IHRydWUgfX0iPgogICAgICAgICAgIDwvZnVuY3Rpb24tcmVmPi48IS0tCiAgICAgIC0tPjwvdGVtcGxhdGU+PGEgb24tY2xpY2s9Int7IGdvdG8gfX0iIGhyZWY9Int7IHVybCB9fSI+e3sgbmFtZSB9fTwvYT48IS0tCi0gIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhaXNEYXJ0IH19Ij48c3Bhbj4ge3sgbmFtZSB9fTwvc3Bhbj48L3RlbXBsYXRlPjwvdGVtcGxhdGU+CisgIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhcmVmLmlzRGFydCB9fSI+PHNwYW4+IHt7IG5hbWUgfX08L3NwYW4+PC90ZW1wbGF0ZT48L3RlbXBsYXRlPgogPC9wb2x5bWVyLWVsZW1lbnQ+CiAKIDxzY3JpcHQgdHlwZT0iYXBwbGljYXRpb24vZGFydCIgc3JjPSJmdW5jdGlvbl9yZWYuZGFydCI+PC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9mdW5jdGlvbl92aWV3Lmh0bWwKaW5kZXggNTBlYzk1OS4uNDUwNmFiMCAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvZnVuY3Rpb25fdmlldy5odG1sCkBAIC0xNCwxMiArMTQsMTIgQEAKICAgICA8bmF2LWJhcj4KICAgICAgIDx0b3AtbmF2LW1lbnU+PC90b3AtbmF2LW1lbnU+CiAgICAgICA8aXNvbGF0ZS1uYXYtbWVudSBpc29sYXRlPSJ7eyBmdW5jdGlvbi5pc29sYXRlIH19Ij48L2lzb2xhdGUtbmF2LW1lbnU+Ci0gICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlID09ICdDbGFzcycgfX0iPgorICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdDbGFzcyAhPSBudWxsIH19Ij4KICAgICAgICAgPCEtLSBUT0RPKHR1cm5pZGdlKTogQWRkIGxpYnJhcnkgbmF2IG1lbnUgaGVyZS4gLS0+Ci0gICAgICAgIDxjbGFzcy1uYXYtbWVudSBjbHM9Int7IGZ1bmN0aW9uWydvd25lciddIH19Ij48L2NsYXNzLW5hdi1tZW51PgorICAgICAgICA8Y2xhc3MtbmF2LW1lbnUgY2xzPSJ7eyBmdW5jdGlvbi5vd25pbmdDbGFzcyB9fSI+PC9jbGFzcy1uYXYtbWVudT4KICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlID09ICdMaWJyYXJ5JyB9fSI+Ci0gICAgICAgIDxsaWJyYXJ5LW5hdi1tZW51IGxpYnJhcnk9Int7IGZ1bmN0aW9uWydvd25lciddIH19Ij48L2xpYnJhcnktbmF2LW1lbnU+CisgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLm93bmluZ0xpYnJhcnkgIT0gbnVsbCB9fSI+CisgICAgICAgIDxsaWJyYXJ5LW5hdi1tZW51IGxpYnJhcnk9Int7IGZ1bmN0aW9uLm93bmluZ0xpYnJhcnkgfX0iPjwvbGlicmFyeS1uYXYtbWVudT4KICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICA8bmF2LW1lbnUgbGluaz0ie3sgZnVuY3Rpb24ubGluayB9fSIgYW5jaG9yPSJ7eyBmdW5jdGlvbi5uYW1lIH19IiBsYXN0PSJ7eyB0cnVlIH19Ij48L25hdi1tZW51PgogICAgICAgPG5hdi1yZWZyZXNoIGNhbGxiYWNrPSJ7eyByZWZyZXNoIH19Ij48L25hdi1yZWZyZXNoPgpAQCAtMjcsNzkgKzI3LDc5IEBACiAgICAgPC9uYXYtYmFyPgogCiAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+Ci0gICAgICA8aDE+ZnVuY3Rpb24ge3sgcXVhbGlmaWVkTmFtZSB9fTwvaDE+CisgICAgICA8aDE+ZnVuY3Rpb24ge3sgZnVuY3Rpb24ucXVhbGlmaWVkTmFtZSB9fTwvaDE+CiAKICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckxpc3QiPgogICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5raW5kPC9kaXY+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnaXNfc3RhdGljJ10gfX0iPnN0YXRpYzwvdGVtcGxhdGU+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydpc19jb25zdCddIH19Ij5jb25zdDwvdGVtcGxhdGU+Ci0gICAgICAgICAgICB7eyBraW5kIH19CisgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLmlzU3RhdGljIH19Ij5zdGF0aWM8L3RlbXBsYXRlPgorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5pc0NvbnN0IH19Ij5jb25zdDwvdGVtcGxhdGU+CisgICAgICAgICAgICB7eyBmdW5jdGlvbi5raW5kLnRvU3RyaW5nKCkgfX0KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+Ci0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ3BhcmVudCddICE9IG51bGwgfX0iPgorICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLnBhcmVudCAhPSBudWxsIH19Ij4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPnBhcmVudCBmdW5jdGlvbjwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8ZnVuY3Rpb24tcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ3BhcmVudCddIH19Ij48L2Z1bmN0aW9uLXJlZj4KKyAgICAgICAgICAgICAgPGZ1bmN0aW9uLXJlZiByZWY9Int7IGZ1bmN0aW9uLnBhcmVudCB9fSI+PC9mdW5jdGlvbi1yZWY+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3duZXI8L2Rpdj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlID09ICdDbGFzcycgfX0iPgotICAgICAgICAgICAgICA8Y2xhc3MtcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10gfX0iPjwvY2xhc3MtcmVmPgorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdDbGFzcyAhPSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgPGNsYXNzLXJlZiByZWY9Int7IGZ1bmN0aW9uLm93bmluZ0NsYXNzIH19Ij48L2NsYXNzLXJlZj4KICAgICAgICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlICE9ICdDbGFzcycgfX0iPgotICAgICAgICAgICAgICA8bGlicmFyeS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9saWJyYXJ5LXJlZj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSAhPSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgPGxpYnJhcnktcmVmIHJlZj0ie3sgZnVuY3Rpb24ub3duaW5nTGlicmFyeSB9fSI+PC9saWJyYXJ5LXJlZj4KICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvZGl2PgogICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5zY3JpcHQ8L2Rpdj4KICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICA8c2NyaXB0LXJlZiByZWY9Int7IGZ1bmN0aW9uWydzY3JpcHQnXSB9fSIKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvcz0ie3sgZnVuY3Rpb25bJ3Rva2VuUG9zJ10gfX0iPgorICAgICAgICAgICAgPHNjcmlwdC1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5zY3JpcHQgfX0iCisgICAgICAgICAgICAgICAgICAgICAgICBwb3M9Int7IGZ1bmN0aW9uLnRva2VuUG9zIH19Ij4KICAgICAgICAgICAgIDwvc2NyaXB0LXJlZj4KICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgPC9kaXY+CiAKICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+Jm5ic3A7PC9kaXY+CiAKLSAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnY29kZSddICE9IG51bGwgfX0iPgorICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLmNvZGUgIT0gbnVsbCB9fSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5vcHRpbWl6ZWQgY29kZTwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnY29kZSddIH19Ij48L2NvZGUtcmVmPgorICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5jb2RlIH19Ij48L2NvZGUtcmVmPgogICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvdGVtcGxhdGU+Ci0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ3Vub3B0aW1pemVkX2NvZGUnXSAhPSBudWxsIH19Ij4KKyAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi51bm9wdGltaXplZENvZGUgIT0gbnVsbCB9fSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj51bm9wdGltaXplZCBjb2RlPC9kaXY+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+Ci0gICAgICAgICAgICAgIDxjb2RlLXJlZiByZWY9Int7IGZ1bmN0aW9uWyd1bm9wdGltaXplZF9jb2RlJ10gfX0iPjwvY29kZS1yZWY+CisgICAgICAgICAgICAgIDxjb2RlLXJlZiByZWY9Int7IGZ1bmN0aW9uLnVub3B0aW1pemVkQ29kZSB9fSI+PC9jb2RlLXJlZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9IlRoaXMgY291bnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBhIGZ1bmN0aW9uIHdpbGwgYmUgb3B0aW1pemVkLiAgSXQgaXMgYSBjb21iaW5hdGlvbiBvZiBjYWxsIGNvdW50cyBhbmQgb3RoZXIgZmFjdG9ycy4iPgotICAgICAgICAgICAgICAgICAgKHVzYWdlIGNvdW50OiB7eyBmdW5jdGlvblsndXNhZ2VfY291bnRlciddIH19KQorICAgICAgICAgICAgICAgICAgKHVzYWdlIGNvdW50OiB7eyBmdW5jdGlvbi51c2FnZUNvdW50ZXIgfX0pCiAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+ZGVvcHRpbWl6YXRpb25zPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnZGVvcHRpbWl6YXRpb25zJ10gfX08L2Rpdj4KKyAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uLmRlb3B0aW1pemF0aW9ucyB9fTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3B0aW1pemFibGU8L2Rpdj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uWydpc19vcHRpbWl6YWJsZSddIH19PC9kaXY+CisgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvbi5pc09wdGltaXphYmxlIH19PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5pbmxpbmFibGU8L2Rpdj4KLSAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uWydpc19pbmxpbmFibGUnXSB9fTwvZGl2PgorICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb24uaXNJbmxpbmFibGUgfX08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5uYW1lICE9IGZ1bmN0aW9uLnZtTmFtZSB9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgpAQCAtMTExLDcgKzExMSw5IEBACiAgICAgPC9kaXY+CiAKICAgICA8aHI+Ci0gICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGZ1bmN0aW9uWydzY3JpcHQnXSB9fSIgcG9zPSJ7eyBmdW5jdGlvblsndG9rZW5Qb3MnXSB9fSIgZW5kUG9zPSJ7eyBmdW5jdGlvblsnZW5kVG9rZW5Qb3MnXSB9fSI+CisgICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGZ1bmN0aW9uLnNjcmlwdCB9fSIKKyAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zPSJ7eyBmdW5jdGlvbi50b2tlblBvcyB9fSIKKyAgICAgICAgICAgICAgICAgIGVuZFBvcz0ie3sgZnVuY3Rpb24uZW5kVG9rZW5Qb3MgfX0iPgogICAgIDwvc2NyaXB0LWluc2V0PgogCiAgICAgPGJyPgpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2lzb2xhdGVfdmlldy5odG1sIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL2lzb2xhdGVfdmlldy5odG1sCmluZGV4IDQyNGMyOGQuLmRjOWVjMzAgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9pc29sYXRlX3ZpZXcuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvaXNvbGF0ZV92aWV3Lmh0bWwKQEAgLTU0LDcgKzU0LDggQEAKICAgICA8dGVtcGxhdGUgaWY9Int7IGlzb2xhdGUudG9wRnJhbWUgIT0gbnVsbCB9fSI+CiAgICAgICA8YnI+CiAgICAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgaXNvbGF0ZS50b3BGcmFtZVsnc2NyaXB0J10gfX0iCi0gICAgICAgICAgICAgICAgICAgIHBvcz0ie3sgaXNvbGF0ZS50b3BGcmFtZVsndG9rZW5Qb3MnXSB9fSI+CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3M9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3Rva2VuUG9zJ10gfX0iCisgICAgICAgICAgICAgICAgICAgIGhlaWdodD0iMjAwcHgiPgogICAgICAgPC9zY3JpcHQtaW5zZXQ+CiAgICAgPC90ZW1wbGF0ZT4KIApkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NjcmlwdF9pbnNldC5odG1sIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NjcmlwdF9pbnNldC5odG1sCmluZGV4IGNlZmI5NWMuLjUyNDYwZGYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvZGVwbG95ZWQvd2ViL3BhY2thZ2VzL29ic2VydmF0b3J5L3NyYy9lbGVtZW50cy9zY3JpcHRfaW5zZXQuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0Lmh0bWwKQEAgLTgsMjYgKzgsNjUgQEAKICAgICAgICAgcGFkZGluZy1sZWZ0OiAxNSU7CiAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1JTsKICAgICAgIH0KLSAgICAgIC5ncmF5Qm94IHsKKyAgICAgIC5zb3VyY2VCb3ggewogICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y1ZjVmNTsKICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgICAgICAgcGFkZGluZzogMTBweDsKLSAgICAgfQorICAgICAgICBvdmVyZmxvdy15OiBhdXRvOworICAgICAgfQorICAgICAgLnNvdXJjZVRhYmxlIHsKKyAgICAgICAgZGlzcGxheTogdGFibGU7CisgICAgICB9CisgICAgICAuc291cmNlUm93IHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtcm93OworICAgICAgfQorICAgICAgLnNvdXJjZUl0ZW0sIC5zb3VyY2VJdGVtQ3VycmVudCB7CisgICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CisgICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CisgICAgICAgIGZvbnQ6IDQwMCAxNHB4IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7CisgICAgICAgIGxpbmUtaGVpZ2h0OiAxMjUlOworICAgICAgICB3aGl0ZS1zcGFjZTogcHJlOworICAgICAgfQorICAgICAgLnNvdXJjZUl0ZW1DdXJyZW50IHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzZjZjsKKyAgICAgIH0KKyAgICAgIC5oaXRzTm9uZSwgLmhpdHNOb3RFeGVjdXRlZCwgLmhpdHNFeGVjdXRlZCB7CisgICAgICAgIG1pbi13aWR0aDogMzJweDsKKyAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CisgICAgICB9CisgICAgICAuaGl0c05vdEV4ZWN1dGVkIHsKKyAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U2NjsKKyAgICAgIH0KKyAgICAgIC5oaXRzRXhlY3V0ZWQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmQ2OworICAgICAgfQogICAgIDwvc3R5bGU+CiAgICAgPGRpdiBjbGFzcz0ic291cmNlSW5zZXQiPgogICAgICAgPGNvbnRlbnQ+PC9jb250ZW50PgotICAgICAgPGRpdiBjbGFzcz0iZ3JheUJveCI+Ci0gICAgICAgIDx0YWJsZT4KLSAgICAgICAgICA8dGJvZHk+Ci0gICAgICAgICAgICA8dHIgdGVtcGxhdGUgcmVwZWF0PSJ7eyBsaW5lTnVtYmVyIGluIGxpbmVOdW1iZXJzIH19Ij4KLSAgICAgICAgICAgICAgPHRkIHN0eWxlPSJ7eyBzdHlsZUZvckhpdHMoc2NyaXB0LmxpbmVzW2xpbmVOdW1iZXJdLmhpdHMpIH19Ij48c3Bhbj4gIDwvc3Bhbj48L3RkPgotICAgICAgICAgICAgICA8dGQgc3R5bGU9ImZvbnQtZmFtaWx5OiBjb25zb2xhcywgY291cmllciwgbW9ub3NwYWNlO2ZvbnQtc2l6ZTogMWVtO2xpbmUtaGVpZ2h0OiAxLjJlbTt3aGl0ZS1zcGFjZTogbm93cmFwOyI+e3tzY3JpcHQubGluZXNbbGluZU51bWJlcl0ubGluZX19PC90ZD4KLSAgICAgICAgICAgICAgPHRkPiZuYnNwOzwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCB3aWR0aD0iOTklIiBzdHlsZT0iZm9udC1mYW1pbHk6IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7Zm9udC1zaXplOiAxZW07bGluZS1oZWlnaHQ6IDEuMmVtO3doaXRlLXNwYWNlOiBwcmU7Ij57e3NjcmlwdC5saW5lc1tsaW5lTnVtYmVyXS50ZXh0fX08L3RkPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3Rib2R5PgotICAgICAgICA8L3RhYmxlPgorICAgICAgPGRpdiBjbGFzcz0ic291cmNlQm94IiBzdHlsZT0iaGVpZ2h0Ont7aGVpZ2h0fX0iPgorICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VUYWJsZSI+CisgICAgICAgICAgPHRlbXBsYXRlIHJlcGVhdD0ie3sgbGluZSBpbiBsaW5lcyB9fSI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VSb3ciIGlkPSJ7eyBtYWtlTGluZUlkKGxpbmUubGluZSkgfX0iPgorICAgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGxpbmUuaGl0cyA9PSBudWxsIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXRzTm9uZSI+e3sgbGluZS5saW5lIH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID09IDAgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhpdHNOb3RFeGVjdXRlZCI+e3sgbGluZS5saW5lIH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID4gMCB9fSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGl0c0V4ZWN1dGVkIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlSXRlbSI+Jm5ic3A7PC9kaXY+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5saW5lID09IGN1cnJlbnRMaW5lIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGlkPSJjdXJyZW50TGluZSIgY2xhc3M9InNvdXJjZUl0ZW1DdXJyZW50Ij57e2xpbmUudGV4dH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5saW5lICE9IGN1cnJlbnRMaW5lIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJdGVtIj57e2xpbmUudGV4dH19PC9kaXY+CisgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgICAgICA8L2Rpdj4KKyAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICA8L2Rpdj4KICAgICAgIDwvZGl2PgogICAgIDwvZGl2PgogICA8L3RlbXBsYXRlPgpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9kZXBsb3llZC93ZWIvcGFja2FnZXMvb2JzZXJ2YXRvcnkvc3JjL2VsZW1lbnRzL3NjcmlwdF92aWV3Lmh0bWwgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X3ZpZXcuaHRtbAppbmRleCBhOTliYjg5Li5iZDU0YzcyIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X3ZpZXcuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2RlcGxveWVkL3dlYi9wYWNrYWdlcy9vYnNlcnZhdG9yeS9zcmMvZWxlbWVudHMvc2NyaXB0X3ZpZXcuaHRtbApAQCAtMTYsMTAgKzE2LDIwIEBACiAgICAgPG5hdi1jb250cm9sPjwvbmF2LWNvbnRyb2w+CiAgIDwvbmF2LWJhcj4KIAotICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iIHBvcz0ie3sgc2NyaXB0LmZpcnN0VG9rZW5Qb3MgfX0iIGVuZFBvcz0ie3sgc2NyaXB0Lmxhc3RUb2tlblBvcyB9fSI+Ci0gIDxoMT5zY3JpcHQge3sgc2NyaXB0Lm5hbWUgfX08L2gxPgotICA8L3NjcmlwdC1pbnNldD4KKyAgPHRlbXBsYXRlIGlmPSJ7eyBhcmdzWydwb3MnXSA9PSBudWxsIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iPgorICAgICAgPGgxPnNjcmlwdCB7eyBzY3JpcHQubmFtZSB9fTwvaDE+CisgICAgPC9zY3JpcHQtaW5zZXQ+CisgIDwvdGVtcGxhdGU+CisKKyAgPHRlbXBsYXRlIGlmPSJ7eyBhcmdzWydwb3MnXSAhPSBudWxsIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IGlkPSJzY3JpcHRJbnNldCIgc2NyaXB0PSJ7eyBzY3JpcHQgfX0iCisgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zPSJ7eyBhcmdzWydwb3MnXSB8IHBhcnNlSW50IH19Ij4KKyAgICAgIDxoMT5zY3JpcHQge3sgc2NyaXB0Lm5hbWUgfX08L2gxPgorICAgIDwvc2NyaXB0LWluc2V0PgorICA8L3RlbXBsYXRlPgorCiA8L3RlbXBsYXRlPgogPC9wb2x5bWVyLWVsZW1lbnQ+CiAKLTxzY3JpcHQgdHlwZT0iYXBwbGljYXRpb24vZGFydCIgc3JjPSJzY3JpcHRfdmlldy5kYXJ0Ij48L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0ic2NyaXB0X3ZpZXcuZGFydCI+PC9zY3JpcHQ+CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9hcHAuZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL2FwcC5kYXJ0CmluZGV4IDBjMTAwZTEuLmMxOTQ3M2EgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL2FwcC5kYXJ0CisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL2FwcC5kYXJ0CkBAIC0xOCw3ICsxOCw3IEBACiBwYXJ0ICdzcmMvYXBwL2FwcGxpY2F0aW9uLmRhcnQnOwogcGFydCAnc3JjL2FwcC9jaGFydC5kYXJ0JzsKIHBhcnQgJ3NyYy9hcHAvbG9jYXRpb25fbWFuYWdlci5kYXJ0JzsKLXBhcnQgJ3NyYy9hcHAvcGFuZS5kYXJ0JzsKK3BhcnQgJ3NyYy9hcHAvcGFnZS5kYXJ0JzsKIHBhcnQgJ3NyYy9hcHAvc2V0dGluZ3MuZGFydCc7CiBwYXJ0ICdzcmMvYXBwL3RhcmdldF9tYW5hZ2VyLmRhcnQnOwogcGFydCAnc3JjL2FwcC91dGlscy5kYXJ0JzsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9hcHAvYXBwbGljYXRpb24uZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9hcHAvYXBwbGljYXRpb24uZGFydAppbmRleCA2ZWFlMTBiLi42MjBkODJjIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvYXBwL2FwcGxpY2F0aW9uLmRhcnQKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2FwcC9hcHBsaWNhdGlvbi5kYXJ0CkBAIC04LDggKzgsOCBAQAogLy8vIGJ5IHRoZSBvYnNlcnZhdG9yeV9hcHBsaWNhdGlvbiBjdXN0b20gZWxlbWVudC4KIGNsYXNzIE9ic2VydmF0b3J5QXBwbGljYXRpb24gZXh0ZW5kcyBPYnNlcnZhYmxlIHsKICAgc3RhdGljIE9ic2VydmF0b3J5QXBwbGljYXRpb24gYXBwOwotICBmaW5hbCBfcGFuZVJlZ2lzdHJ5ID0gbmV3IExpc3Q8UGFuZT4oKTsKLSAgUGFuZSBfY3VycmVudFBhbmU7CisgIGZpbmFsIF9wYWdlUmVnaXN0cnkgPSBuZXcgTGlzdDxQYWdlPigpOworICBAb2JzZXJ2YWJsZSBQYWdlIGN1cnJlbnRQYWdlOwogICBAb2JzZXJ2YWJsZSBmaW5hbCBMb2NhdGlvbk1hbmFnZXIgbG9jYXRpb25NYW5hZ2VyOwogICBWTSBfdm07CiAgIFZNIGdldCB2bSA9PiBfdm07CkBAIC00Miw3ICs0Miw3IEBACiAgIHZvaWQgX2luaXRPbmNlKGJvb2wgY2hyb21pdW0pIHsKICAgICBhc3NlcnQoYXBwID09IG51bGwpOwogICAgIGFwcCA9IHRoaXM7Ci0gICAgX3JlZ2lzdGVyUGFuZXMoKTsKKyAgICBfcmVnaXN0ZXJQYWdlcygpOwogICAgIGxvY2F0aW9uTWFuYWdlci5faW5pdCh0aGlzKTsKICAgfQogCkBAIC05MSwxNCArOTEsMTQgQEAKICAgICB9CiAgIH0KIAotICB2b2lkIF9yZWdpc3RlclBhbmVzKCkgewotICAgIC8vIFJlZ2lzdGVyIENsYXNzVHJlZVBhbmUuCi0gICAgX3BhbmVSZWdpc3RyeS5hZGQobmV3IENsYXNzVHJlZVBhbmUodGhpcykpOwotICAgIF9wYW5lUmVnaXN0cnkuYWRkKG5ldyBWTUNvbm5lY3RQYW5lKHRoaXMpKTsKLSAgICBfcGFuZVJlZ2lzdHJ5LmFkZChuZXcgRXJyb3JWaWV3UGFuZSh0aGlzKSk7Ci0gICAgLy8gTm90ZSB0aGF0IFNlcnZpY2VPYmplY3RQYW5lIG11c3QgYmUgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgYXMgaXQgaXMKKyAgdm9pZCBfcmVnaXN0ZXJQYWdlcygpIHsKKyAgICAvLyBSZWdpc3RlciBDbGFzc1RyZWVQYWdlLgorICAgIF9wYWdlUmVnaXN0cnkuYWRkKG5ldyBDbGFzc1RyZWVQYWdlKHRoaXMpKTsKKyAgICBfcGFnZVJlZ2lzdHJ5LmFkZChuZXcgVk1Db25uZWN0UGFnZSh0aGlzKSk7CisgICAgX3BhZ2VSZWdpc3RyeS5hZGQobmV3IEVycm9yVmlld1BhZ2UodGhpcykpOworICAgIC8vIE5vdGUgdGhhdCBTZXJ2aWNlT2JqZWN0UGFnZSBtdXN0IGJlIHRoZSBsYXN0IGVudHJ5IGluIHRoZSBsaXN0IGFzIGl0IGlzCiAgICAgLy8gdGhlIGNhdGNoIGFsbC4KLSAgICBfcGFuZVJlZ2lzdHJ5LmFkZChuZXcgU2VydmljZU9iamVjdFBhbmUodGhpcykpOworICAgIF9wYWdlUmVnaXN0cnkuYWRkKG5ldyBTZXJ2aWNlT2JqZWN0UGFnZSh0aGlzKSk7CiAgIH0KIAogICB2b2lkIF9vbkVycm9yKFNlcnZpY2VFcnJvciBlcnJvcikgewpAQCAtMTA5LDcgKzEwOSw3IEBACiAgIHZvaWQgX29uRXhjZXB0aW9uKFNlcnZpY2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CiAgICAgbGFzdEVycm9yT3JFeGNlcHRpb24gPSBleGNlcHRpb247CiAgICAgaWYgKGV4Y2VwdGlvbi5raW5kID09ICdOZXR3b3JrRXhjZXB0aW9uJykgewotICAgICAgLy8gR290IGEgbmV0d29yayBleGNlcHRpb24sIHZpc2l0IHRoZSB2bS1jb25uZWN0IHBhbmUuCisgICAgICAvLyBHb3QgYSBuZXR3b3JrIGV4Y2VwdGlvbiwgdmlzaXQgdGhlIHZtLWNvbm5lY3QgcGFnZS4KICAgICAgIGxvY2F0aW9uTWFuYWdlci5nbyhsb2NhdGlvbk1hbmFnZXIubWFrZUxpbmsoJy92bS1jb25uZWN0LycpKTsKICAgICB9IGVsc2UgewogICAgICAgX3Zpc2l0KCdlcnJvci8nLCBudWxsKTsKQEAgLTExNyw0MSArMTE3LDQ2IEBACiAgIH0KIAogICB2b2lkIF92aXNpdChTdHJpbmcgdXJsLCBTdHJpbmcgYXJncykgewotICAgIC8vIFRPRE8oam9obm1jY3V0Y2hhbik6IFBhc3MgW2FyZ3NdIHRvIHBhbmUuCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfcGFuZVJlZ2lzdHJ5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgcGFuZSA9IF9wYW5lUmVnaXN0cnlbaV07Ci0gICAgICBpZiAocGFuZS5jYW5WaXNpdCh1cmwpKSB7Ci0gICAgICAgIF9pbnN0YWxsUGFuZShwYW5lKTsKLSAgICAgICAgcGFuZS52aXNpdCh1cmwpOworICAgIHZhciBhcmdzTWFwOworICAgIGlmIChhcmdzID09IG51bGwpIHsKKyAgICAgIGFyZ3NNYXAgPSB7fTsKKyAgICB9IGVsc2UgeworICAgICAgYXJnc01hcCA9IFVyaS5zcGxpdFF1ZXJ5U3RyaW5nKGFyZ3MpOworICAgIH0KKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9wYWdlUmVnaXN0cnkubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBwYWdlID0gX3BhZ2VSZWdpc3RyeVtpXTsKKyAgICAgIGlmIChwYWdlLmNhblZpc2l0KHVybCkpIHsKKyAgICAgICAgX2luc3RhbGxQYWdlKHBhZ2UpOworICAgICAgICBwYWdlLnZpc2l0KHVybCwgYXJnc01hcCk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CiAgICAgdGhyb3cgbmV3IEZhbGxUaHJvdWdoRXJyb3IoKTsKICAgfQogCi0gIC8vLyBTZXQgdGhlIE9ic2VydmF0b3J5IGFwcGxpY2F0aW9uIHBhbmUuCi0gIHZvaWQgX2luc3RhbGxQYW5lKFBhbmUgcGFuZSkgewotICAgIGFzc2VydChwYW5lICE9IG51bGwpOwotICAgIGlmIChfY3VycmVudFBhbmUgPT0gcGFuZSkgeworICAvLy8gU2V0IHRoZSBPYnNlcnZhdG9yeSBhcHBsaWNhdGlvbiBwYWdlLgorICB2b2lkIF9pbnN0YWxsUGFnZShQYWdlIHBhZ2UpIHsKKyAgICBhc3NlcnQocGFnZSAhPSBudWxsKTsKKyAgICBpZiAoY3VycmVudFBhZ2UgPT0gcGFnZSkgewogICAgICAgLy8gQWxyZWFkeSBpc250YWxsZWQuCiAgICAgICByZXR1cm47CiAgICAgfQotICAgIGlmIChfY3VycmVudFBhbmUgIT0gbnVsbCkgewotICAgICAgTG9nZ2VyLnJvb3QuaW5mbygnVW5pbnN0YWxsaW5nIHBhbmU6ICRfY3VycmVudFBhbmUnKTsKLSAgICAgIF9jdXJyZW50UGFuZS5vblVuaW5zdGFsbCgpOworICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKSB7CisgICAgICBMb2dnZXIucm9vdC5pbmZvKCdVbmluc3RhbGxpbmcgcGFnZTogJGN1cnJlbnRQYWdlJyk7CisgICAgICBjdXJyZW50UGFnZS5vblVuaW5zdGFsbCgpOwogICAgICAgLy8gQ2xlYXIgY2hpbGRyZW4uCiAgICAgICByb290RWxlbWVudC5jaGlsZHJlbi5jbGVhcigpOwogICAgIH0KLSAgICBMb2dnZXIucm9vdC5pbmZvKCdJbnN0YWxsaW5nIHBhbmU6ICRwYW5lJyk7CisgICAgTG9nZ2VyLnJvb3QuaW5mbygnSW5zdGFsbGluZyBwYWdlOiAkcGFnZScpOwogICAgIHRyeSB7Ci0gICAgICBwYW5lLm9uSW5zdGFsbCgpOworICAgICAgcGFnZS5vbkluc3RhbGwoKTsKICAgICB9IGNhdGNoIChlKSB7Ci0gICAgICBMb2dnZXIucm9vdC5zZXZlcmUoJ0ZhaWxlZCB0byBpbnN0YWxsIHBhbmU6ICRlJyk7CisgICAgICBMb2dnZXIucm9vdC5zZXZlcmUoJ0ZhaWxlZCB0byBpbnN0YWxsIHBhZ2U6ICRlJyk7CiAgICAgfQotICAgIC8vIEFkZCBuZXcgcGFuZS4KLSAgICByb290RWxlbWVudC5jaGlsZHJlbi5hZGQocGFuZS5lbGVtZW50KTsKLSAgICAvLyBSZW1lbWJlciBwYW5lLgotICAgIF9jdXJyZW50UGFuZSA9IHBhbmU7CisgICAgLy8gQWRkIG5ldyBwYWdlLgorICAgIHJvb3RFbGVtZW50LmNoaWxkcmVuLmFkZChwYWdlLmVsZW1lbnQpOworICAgIC8vIFJlbWVtYmVyIHBhZ2UuCisgICAgY3VycmVudFBhZ2UgPSBwYWdlOwogICB9CiAKICAgT2JzZXJ2YXRvcnlBcHBsaWNhdGlvbi5kZXZ0b29scyh0aGlzLnJvb3RFbGVtZW50KSA6CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvYXBwL3BhZ2UuZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9hcHAvcGFnZS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MjE5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvYXBwL3BhZ2UuZGFydApAQCAtMCwwICsxLDE0MyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitwYXJ0IG9mIGFwcDsKKworLy8vIEEgW1BhZ2VdIGNvbnRyb2xzIHRoZSB1c2VyIGludGVyZmFjZSBvZiBPYnNlcnZhdG9yeS4gQXQgYW55IGdpdmVuIHRpbWUKKy8vLyBvbmUgcGFnZSB3aWxsIGJlIHRoZSBjdXJyZW50IHBhZ2UuIFBhZ2VzIGFyZSByZWdpc3RlcmVkIGF0IHN0YXJ0dXAuCisvLy8gV2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbiwgZWFjaCBwYWdlIGlzIGFza2VkIGlmIGl0CisvLy8gY2FuIGhhbmRsZSB0aGUgY3VycmVudCBsb2NhdGlvbiwgdGhlIGZpcnN0IHBhZ2UgdG8gc2F5IHllcywgd2lucy4KK2Fic3RyYWN0IGNsYXNzIFBhZ2UgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKKyAgZmluYWwgT2JzZXJ2YXRvcnlBcHBsaWNhdGlvbiBhcHA7CisKKyAgQG9ic2VydmFibGUgT2JzZXJ2YXRvcnlFbGVtZW50IGVsZW1lbnQ7CisgIEBvYnNlcnZhYmxlIE9ic2VydmFibGVNYXAgYXJnczsKKworICBQYWdlKHRoaXMuYXBwKTsKKworICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhZ2UgaXMgaW5zdGFsbGVkLCB0aGlzIGNhbGxiYWNrIG11c3QgaW5pdGlhbGl6ZQorICAvLy8gW2VsZW1lbnRdLgorICB2b2lkIG9uSW5zdGFsbCgpOworCisgIC8vLyBDYWxsZWQgd2hlbiB0aGUgcGFnZSBpcyB1bmluc3RhbGxlZCwgdGhpcyBjYWxsYmFjayBtdXN0IGNsZWFyCisgIC8vLyBbZWxlbWVudF0uCisgIHZvaWQgb25Vbmluc3RhbGwoKSB7CisgICAgZWxlbWVudCA9IG51bGw7CisgIH0KKworICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhZ2Ugc2hvdWxkIHVwZGF0ZSBpdHMgc3RhdGUgYmFzZWQgb24gW3VybF0uCisgIC8vLyBOT1RFOiBPbmx5IGNhbGxlZCB3aGVuIHRoZSBwYWdlIGlzIGluc3RhbGxlZC4KKyAgdm9pZCB2aXNpdChTdHJpbmcgdXJsLCBNYXAgYXJnc01hcCkgeworICAgIGFyZ3MgPSB0b09ic2VydmFibGUoYXJnc01hcCk7CisgICAgX3Zpc2l0KHVybCk7CisgIH0KKworICAvLyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuCisgIHZvaWQgX3Zpc2l0KFN0cmluZyB1cmwpOworCisgIC8vLyBDYWxsZWQgdG8gdGVzdCB3aGV0aGVyIHRoaXMgcGFnZSBjYW4gdmlzaXQgW3VybF0uCisgIGJvb2wgY2FuVmlzaXQoU3RyaW5nIHVybCk7Cit9CisKKy8vLyBBIGdlbmVyYWwgc2VydmljZSBvYmplY3Qgdmlld2VyLgorY2xhc3MgU2VydmljZU9iamVjdFBhZ2UgZXh0ZW5kcyBQYWdlIHsKKyAgU2VydmljZU9iamVjdFBhZ2UoYXBwKSA6IHN1cGVyKGFwcCk7CisKKyAgdm9pZCBvbkluc3RhbGwoKSB7CisgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgLy8vIExhemlseSBjcmVhdGUgcGFnZS4KKyAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudC50YWcoJ3NlcnZpY2UtdmlldycpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3Zpc2l0KFN0cmluZyB1cmwpIHsKKyAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKKyAgICBhc3NlcnQoY2FuVmlzaXQodXJsKSk7CisgICAgaWYgKHVybCA9PSAnJykgeworICAgICAgLy8gTm90aGluZyByZXF1ZXN0ZWQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIC8vLyBSZXF1ZXN0IHVybCBmcm9tIFZNIGFuZCBkaXNwbGF5IGl0LgorICAgIGFwcC52bS5nZXQodXJsKS50aGVuKChvYmopIHsKKyAgICAgIFNlcnZpY2VPYmplY3RWaWV3RWxlbWVudCBzZXJ2aWNlRWxlbWVudCA9IGVsZW1lbnQ7CisgICAgICBzZXJ2aWNlRWxlbWVudC5vYmplY3QgPSBvYmo7CisgICAgfSkuY2F0Y2hFcnJvcigoZSkgeworICAgICAgTG9nZ2VyLnJvb3Quc2V2ZXJlKCdTZXJ2aWNlT2JqZWN0UGFnZSB2aXNpdCBlcnJvcjogJGUnKTsKKyAgICB9KTsKKyAgfQorCisgIC8vLyBDYXRjaCBhbGwuCisgIGJvb2wgY2FuVmlzaXQoU3RyaW5nIHVybCkgPT4gdHJ1ZTsKK30KKworLy8vIENsYXNzIHRyZWUgcGFnZS4KK2NsYXNzIENsYXNzVHJlZVBhZ2UgZXh0ZW5kcyBQYWdlIHsKKyAgc3RhdGljIGNvbnN0IF91cmxQcmVmaXggPSAnY2xhc3MtdHJlZS8nOworCisgIENsYXNzVHJlZVBhZ2UoYXBwKSA6IHN1cGVyKGFwcCk7CisKKyAgdm9pZCBvbkluc3RhbGwoKSB7CisgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50LnRhZygnY2xhc3MtdHJlZScpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3Zpc2l0KFN0cmluZyB1cmwpIHsKKyAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKKyAgICBhc3NlcnQoY2FuVmlzaXQodXJsKSk7CisgICAgLy8gQ2xhc3NUcmVlIHVybHMgYXJlICdjbGFzcy10cmVlL2lzb2xhdGUtaWQnLCBjaG9wIG9mZiBwcmVmaXgsIGxlYXZpbmcKKyAgICAvLyBpc29sYXRlIHVybC4KKyAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKF91cmxQcmVmaXgubGVuZ3RoKTsKKyAgICAvLy8gUmVxdWVzdCB0aGUgaXNvbGF0ZSB1cmwuCisgICAgYXBwLnZtLmdldCh1cmwpLnRoZW4oKGkpIHsKKyAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgLy8vIFVwZGF0ZSB0aGUgcGFnZS4KKyAgICAgICAgQ2xhc3NUcmVlRWxlbWVudCBwYWdlID0gZWxlbWVudDsKKyAgICAgICAgcGFnZS5pc29sYXRlID0gaTsKKyAgICAgIH0KKyAgICB9KS5jYXRjaEVycm9yKChlKSB7CisgICAgICBMb2dnZXIucm9vdC5zZXZlcmUoJ0NsYXNzVHJlZVBhZ2UgdmlzaXQgZXJyb3I6ICRlJyk7CisgICAgfSk7CisgIH0KKworICAvLy8gQ2F0Y2ggYWxsLgorICBib29sIGNhblZpc2l0KFN0cmluZyB1cmwpID0+IHVybC5zdGFydHNXaXRoKF91cmxQcmVmaXgpOworfQorCitjbGFzcyBFcnJvclZpZXdQYWdlIGV4dGVuZHMgUGFnZSB7CisgIEVycm9yVmlld1BhZ2UoYXBwKSA6IHN1cGVyKGFwcCk7CisKKyAgdm9pZCBvbkluc3RhbGwoKSB7CisgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgeworICAgICAgLy8vIExhemlseSBjcmVhdGUgcGFnZS4KKyAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudC50YWcoJ3NlcnZpY2UtdmlldycpOworICAgIH0KKyAgfQorCisgIHZvaWQgX3Zpc2l0KFN0cmluZyB1cmwpIHsKKyAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKKyAgICBhc3NlcnQoY2FuVmlzaXQodXJsKSk7CisgICAgKGVsZW1lbnQgYXMgU2VydmljZU9iamVjdFZpZXdFbGVtZW50KS5vYmplY3QgPSBhcHAubGFzdEVycm9yT3JFeGNlcHRpb247CisgIH0KKworICBib29sIGNhblZpc2l0KFN0cmluZyB1cmwpID0+IHVybC5zdGFydHNXaXRoKCdlcnJvci8nKTsKK30KKworY2xhc3MgVk1Db25uZWN0UGFnZSBleHRlbmRzIFBhZ2UgeworICBWTUNvbm5lY3RQYWdlKGFwcCkgOiBzdXBlcihhcHApOworCisgIHZvaWQgb25JbnN0YWxsKCkgeworICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKKyAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudC50YWcoJ3ZtLWNvbm5lY3QnKTsKKyAgICB9CisgICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CisgIH0KKworICB2b2lkIF92aXNpdChTdHJpbmcgdXJsKSB7CisgICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7CisgICAgYXNzZXJ0KGNhblZpc2l0KHVybCkpOworICB9CisKKyAgYm9vbCBjYW5WaXNpdChTdHJpbmcgdXJsKSA9PiB1cmwuc3RhcnRzV2l0aCgndm0tY29ubmVjdC8nKTsKK30KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9hcHAvcGFuZS5kYXJ0IGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2FwcC9wYW5lLmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTkwNjQuLjAwMDAwMDAKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2FwcC9wYW5lLmRhcnQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKLS8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCi0vLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi1wYXJ0IG9mIGFwcDsKLQotLy8vIEEgW1BhbmVdIGNvbnRyb2xzIHRoZSB1c2VyIGludGVyZmFjZSBvZiBPYnNlcnZhdG9yeS4gQXQgYW55IGdpdmVuIHRpbWUKLS8vLyBvbmUgcGFuZSB3aWxsIGJlIHRoZSBjdXJyZW50IHBhbmUuIFBhbmVzIGFyZSByZWdpc3RlcmVkIGF0IHN0YXJ0dXAuCi0vLy8gV2hlbiB0aGUgdXNlciBuYXZpZ2F0ZXMgd2l0aGluIHRoZSBhcHBsaWNhdGlvbiwgZWFjaCBwYW5lIGlzIGFza2VkIGlmIGl0Ci0vLy8gY2FuIGhhbmRsZSB0aGUgY3VycmVudCBsb2NhdGlvbiwgdGhlIGZpcnN0IHBhbmUgdG8gc2F5IHllcywgd2lucy4KLWFic3RyYWN0IGNsYXNzIFBhbmUgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKLSAgZmluYWwgT2JzZXJ2YXRvcnlBcHBsaWNhdGlvbiBhcHA7Ci0KLSAgQG9ic2VydmFibGUgT2JzZXJ2YXRvcnlFbGVtZW50IGVsZW1lbnQ7Ci0KLSAgUGFuZSh0aGlzLmFwcCk7Ci0KLSAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYW5lIGlzIGluc3RhbGxlZCwgdGhpcyBjYWxsYmFjayBtdXN0IGluaXRpYWxpemUKLSAgLy8vIFtlbGVtZW50XS4KLSAgdm9pZCBvbkluc3RhbGwoKTsKLQotICAvLy8gQ2FsbGVkIHdoZW4gdGhlIHBhbmUgaXMgdW5pbnN0YWxsZWQsIHRoaXMgY2FsbGJhY2sgbXVzdCBjbGVhcgotICAvLy8gW2VsZW1lbnRdLgotICB2b2lkIG9uVW5pbnN0YWxsKCkgewotICAgIGVsZW1lbnQgPSBudWxsOwotICB9Ci0KLSAgLy8vIENhbGxlZCB3aGVuIHRoZSBwYW5lIHNob3VsZCB1cGRhdGUgaXRzIHN0YXRlIGJhc2VkIG9uIFt1cmxdLgotICAvLy8gTk9URTogT25seSBjYWxsZWQgd2hlbiB0aGUgcGFuZSBpcyBpbnN0YWxsZWQuCi0gIHZvaWQgdmlzaXQoU3RyaW5nIHVybCk7Ci0KLSAgLy8vIENhbGxlZCB0byB0ZXN0IHdoZXRoZXIgdGhpcyBwYW5lIGNhbiB2aXNpdCBbdXJsXS4KLSAgYm9vbCBjYW5WaXNpdChTdHJpbmcgdXJsKTsKLX0KLQotLy8vIEEgZ2VuZXJhbCBzZXJ2aWNlIG9iamVjdCB2aWV3ZXIuCi1jbGFzcyBTZXJ2aWNlT2JqZWN0UGFuZSBleHRlbmRzIFBhbmUgewotICBTZXJ2aWNlT2JqZWN0UGFuZShhcHApIDogc3VwZXIoYXBwKTsKLQotICB2b2lkIG9uSW5zdGFsbCgpIHsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICAvLy8gTGF6aWx5IGNyZWF0ZSBwYW5lLgotICAgICAgZWxlbWVudCA9IG5ldyBFbGVtZW50LnRhZygnc2VydmljZS12aWV3Jyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB2aXNpdChTdHJpbmcgdXJsKSB7Ci0gICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0KGNhblZpc2l0KHVybCkpOwotICAgIGlmICh1cmwgPT0gJycpIHsKLSAgICAgIC8vIE5vdGhpbmcgcmVxdWVzdGVkLgotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLy8gUmVxdWVzdCB1cmwgZnJvbSBWTSBhbmQgZGlzcGxheSBpdC4KLSAgICBhcHAudm0uZ2V0KHVybCkudGhlbigob2JqKSB7Ci0gICAgICBTZXJ2aWNlT2JqZWN0Vmlld0VsZW1lbnQgcGFuZSA9IGVsZW1lbnQ7Ci0gICAgICBwYW5lLm9iamVjdCA9IG9iajsKLSAgICB9KS5jYXRjaEVycm9yKChlKSB7Ci0gICAgICBMb2dnZXIucm9vdC5zZXZlcmUoJ1NlcnZpY2VPYmplY3RQYW5lIHZpc2l0IGVycm9yOiAkZScpOwotICAgIH0pOwotICB9Ci0KLSAgLy8vIENhdGNoIGFsbC4KLSAgYm9vbCBjYW5WaXNpdChTdHJpbmcgdXJsKSA9PiB0cnVlOwotfQotCi0vLy8gQ2xhc3MgdHJlZSBwYW5lLgotY2xhc3MgQ2xhc3NUcmVlUGFuZSBleHRlbmRzIFBhbmUgewotICBzdGF0aWMgY29uc3QgX3VybFByZWZpeCA9ICdjbGFzcy10cmVlLyc7Ci0KLSAgQ2xhc3NUcmVlUGFuZShhcHApIDogc3VwZXIoYXBwKTsKLQotICB2b2lkIG9uSW5zdGFsbCgpIHsKLSAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7Ci0gICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQudGFnKCdjbGFzcy10cmVlJyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB2aXNpdChTdHJpbmcgdXJsKSB7Ci0gICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0KGNhblZpc2l0KHVybCkpOwotICAgIC8vIENsYXNzVHJlZSB1cmxzIGFyZSAnY2xhc3MtdHJlZS9pc29sYXRlLWlkJywgY2hvcCBvZmYgcHJlZml4LCBsZWF2aW5nCi0gICAgLy8gaXNvbGF0ZSB1cmwuCi0gICAgdXJsID0gdXJsLnN1YnN0cmluZyhfdXJsUHJlZml4Lmxlbmd0aCk7Ci0gICAgLy8vIFJlcXVlc3QgdGhlIGlzb2xhdGUgdXJsLgotICAgIGFwcC52bS5nZXQodXJsKS50aGVuKChpKSB7Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgIC8vLyBVcGRhdGUgdGhlIHBhbmUuCi0gICAgICAgIENsYXNzVHJlZUVsZW1lbnQgcGFuZSA9IGVsZW1lbnQ7Ci0gICAgICAgIHBhbmUuaXNvbGF0ZSA9IGk7Ci0gICAgICB9Ci0gICAgfSkuY2F0Y2hFcnJvcigoZSkgewotICAgICAgTG9nZ2VyLnJvb3Quc2V2ZXJlKCdDbGFzc1RyZWVQYW5lIHZpc2l0IGVycm9yOiAkZScpOwotICAgIH0pOwotICB9Ci0KLSAgLy8vIENhdGNoIGFsbC4KLSAgYm9vbCBjYW5WaXNpdChTdHJpbmcgdXJsKSA9PiB1cmwuc3RhcnRzV2l0aChfdXJsUHJlZml4KTsKLX0KLQotY2xhc3MgRXJyb3JWaWV3UGFuZSBleHRlbmRzIFBhbmUgewotICBFcnJvclZpZXdQYW5lKGFwcCkgOiBzdXBlcihhcHApOwotCi0gIHZvaWQgb25JbnN0YWxsKCkgewotICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLSAgICAgIC8vLyBMYXppbHkgY3JlYXRlIHBhbmUuCi0gICAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQudGFnKCdzZXJ2aWNlLXZpZXcnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHZpc2l0KFN0cmluZyB1cmwpIHsKLSAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKLSAgICBhc3NlcnQoY2FuVmlzaXQodXJsKSk7Ci0gICAgKGVsZW1lbnQgYXMgU2VydmljZU9iamVjdFZpZXdFbGVtZW50KS5vYmplY3QgPSBhcHAubGFzdEVycm9yT3JFeGNlcHRpb247Ci0gIH0KLQotICBib29sIGNhblZpc2l0KFN0cmluZyB1cmwpID0+IHVybC5zdGFydHNXaXRoKCdlcnJvci8nKTsKLX0KLQotY2xhc3MgVk1Db25uZWN0UGFuZSBleHRlbmRzIFBhbmUgewotICBWTUNvbm5lY3RQYW5lKGFwcCkgOiBzdXBlcihhcHApOwotCi0gIHZvaWQgb25JbnN0YWxsKCkgewotICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKLSAgICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudC50YWcoJ3ZtLWNvbm5lY3QnKTsKLSAgICB9Ci0gICAgYXNzZXJ0KGVsZW1lbnQgIT0gbnVsbCk7Ci0gIH0KLQotICB2b2lkIHZpc2l0KFN0cmluZyB1cmwpIHsKLSAgICBhc3NlcnQoZWxlbWVudCAhPSBudWxsKTsKLSAgICBhc3NlcnQoY2FuVmlzaXQodXJsKSk7Ci0gIH0KLQotICBib29sIGNhblZpc2l0KFN0cmluZyB1cmwpID0+IHVybC5zdGFydHNXaXRoKCd2bS1jb25uZWN0LycpOwotfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2NsYXNzX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9jbGFzc192aWV3Lmh0bWwKaW5kZXggMjk2ZmY5ZC4uY2Y4N2FiMiAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2NsYXNzX3ZpZXcuaHRtbAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvY2xhc3Nfdmlldy5odG1sCkBAIC0xODksNyArMTg5LDkgQEAKICAgICA8L2Rpdj4KIAogICAgIDxocj4KLSAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIgcG9zPSJ7eyBjbHMudG9rZW5Qb3MgfX0iIGVuZFBvcz0ie3sgY2xzLmVuZFRva2VuUG9zIH19Ij4KKyAgICA8c2NyaXB0LWluc2V0IHNjcmlwdD0ie3sgY2xzLnNjcmlwdCB9fSIKKyAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zPSJ7eyBjbHMudG9rZW5Qb3MgfX0iCisgICAgICAgICAgICAgICAgICBlbmRQb3M9Int7IGNscy5lbmRUb2tlblBvcyB9fSI+CiAgICAgPC9zY3JpcHQtaW5zZXQ+CiAKICAgICA8YnI+PGJyPjxicj48YnI+CkBAIC0xOTcsNCArMTk5LDQgQEAKICAgPC90ZW1wbGF0ZT4KIDwvcG9seW1lci1lbGVtZW50PgogCi08c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0iY2xhc3Nfdmlldy5kYXJ0Ij48L3NjcmlwdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2RhcnQiIHNyYz0iY2xhc3Nfdmlldy5kYXJ0Ij48L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9jb2RlX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9jb2RlX3ZpZXcuaHRtbAppbmRleCAwN2RmMTM0Li4zNDI5NGFkIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvY29kZV92aWV3Lmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2NvZGVfdmlldy5odG1sCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgPG5hdi1iYXI+CiAgICAgICA8dG9wLW5hdi1tZW51PjwvdG9wLW5hdi1tZW51PgogICAgICAgPGlzb2xhdGUtbmF2LW1lbnUgaXNvbGF0ZT0ie3sgY29kZS5pc29sYXRlIH19Ij48L2lzb2xhdGUtbmF2LW1lbnU+Ci0gICAgICA8bmF2LW1lbnUgbGluaz0iLiIgYW5jaG9yPSJ7eyBjb2RlLm5hbWUgfX0iIGxhc3Q9Int7IHRydWUgfX0iPjwvbmF2LW1lbnU+CisgICAgICA8bmF2LW1lbnUgbGluaz0ie3sgY29kZS5saW5rIH19IiBhbmNob3I9Int7IGNvZGUubmFtZSB9fSIgbGFzdD0ie3sgdHJ1ZSB9fSI+PC9uYXYtbWVudT4KICAgICAgIDxuYXYtcmVmcmVzaCBjYWxsYmFjaz0ie3sgcmVmcmVzaCB9fSI+PC9uYXYtcmVmcmVzaD4KICAgICAgIDxuYXYtY29udHJvbD48L25hdi1jb250cm9sPgogICAgIDwvbmF2LWJhcj4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuZGFydAppbmRleCA1ZWQ2Mjk4Li4zMmQ3OWVhIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvZnVuY3Rpb25fcmVmLmRhcnQKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3JlZi5kYXJ0CkBAIC01LDMyICs1LDExIEBACiBsaWJyYXJ5IGZ1bmN0aW9uX3JlZl9lbGVtZW50OwogCiBpbXBvcnQgJ3BhY2thZ2U6cG9seW1lci9wb2x5bWVyLmRhcnQnOwotaW1wb3J0ICdwYWNrYWdlOm9ic2VydmF0b3J5L3NlcnZpY2UuZGFydCc7CiBpbXBvcnQgJ3NlcnZpY2VfcmVmLmRhcnQnOwogCiBAQ3VzdG9tVGFnKCdmdW5jdGlvbi1yZWYnKQogY2xhc3MgRnVuY3Rpb25SZWZFbGVtZW50IGV4dGVuZHMgU2VydmljZVJlZkVsZW1lbnQgewogICBAcHVibGlzaGVkIGJvb2wgcXVhbGlmaWVkID0gdHJ1ZTsKIAotICB2b2lkIHJlZkNoYW5nZWQob2xkVmFsdWUpIHsKLSAgICBzdXBlci5yZWZDaGFuZ2VkKG9sZFZhbHVlKTsKLSAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZSgjaGFzUGFyZW50LCAwLCAxKTsKLSAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZSgjaGFzQ2xhc3MsIDAsIDEpOwotICAgIFNlcnZpY2VNYXAgcmVmTWFwID0gcmVmOwotICAgIGlzRGFydCA9IChyZWZNYXAgIT0gbnVsbCkgJiYKLSAgICAgICAgICAgICAocmVmTWFwWydraW5kJ10gIT0gJ0NvbGxlY3RlZCcpICYmCi0gICAgICAgICAgICAgKHJlZk1hcFsna2luZCddICE9ICdOYXRpdmUnKSAmJgotICAgICAgICAgICAgIChyZWZNYXBbJ2tpbmQnXSAhPSAnVGFnJykgJiYKLSAgICAgICAgICAgICAocmVmTWFwWydraW5kJ10gIT0gJ1JldXNlZCcpOwotICAgIGhhc1BhcmVudCA9IChyZWZNYXAgIT0gbnVsbCAmJiByZWZNYXBbJ3BhcmVudCddICE9IG51bGwpOwotICAgIGhhc0NsYXNzID0gKHJlZk1hcCAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgcmVmTWFwWydvd25lciddICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICByZWZNYXBbJ293bmVyJ10uc2VydmljZVR5cGUgPT0gJ0NsYXNzJyk7Ci0gIH0KLQotICBAb2JzZXJ2YWJsZSBib29sIGhhc1BhcmVudCA9IGZhbHNlOwotICBAb2JzZXJ2YWJsZSBib29sIGhhc0NsYXNzID0gZmFsc2U7Ci0gIEBvYnNlcnZhYmxlIGJvb2wgaXNEYXJ0ID0gZmFsc2U7Ci0KICAgRnVuY3Rpb25SZWZFbGVtZW50LmNyZWF0ZWQoKSA6IHN1cGVyLmNyZWF0ZWQoKTsKIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl9yZWYuaHRtbAppbmRleCAxNmEyODFmLi5mNWFiZDMzIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvZnVuY3Rpb25fcmVmLmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3JlZi5odG1sCkBAIC00LDE0ICs0LDE0IEBACiAKIDxwb2x5bWVyLWVsZW1lbnQgbmFtZT0iZnVuY3Rpb24tcmVmIiBleHRlbmRzPSJzZXJ2aWNlLXJlZiI+CiAgIDx0ZW1wbGF0ZT48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNzcy9zaGFyZWQuY3NzIiAvPjwhLS0gVGhlc2UgY29tbWVudHMgYXJlIGhlcmUgdG8gYWxsb3cgbmV3bGluZXMuCi0gICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgaXNEYXJ0IH19Ij48IS0tCi0gICAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJiYgIWhhc1BhcmVudCAmJiBoYXNDbGFzcyB9fSI+PCEtLQotICAgICAgIC0tPjxjbGFzcy1yZWYgcmVmPSJ7eyByZWZbJ293bmVyJ10gfX0iPjwvY2xhc3MtcmVmPi48L3RlbXBsYXRlPjwhLS0KLSAgICAgLS0+PHRlbXBsYXRlIGlmPSJ7eyBxdWFsaWZpZWQgJiYgaGFzUGFyZW50IH19Ij48IS0tCi0gICAgICAgLS0+PGZ1bmN0aW9uLXJlZiByZWY9Int7IHJlZlsncGFyZW50J10gfX0iIHF1YWxpZmllZD0ie3sgdHJ1ZSB9fSI+CisgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcmVmLmlzRGFydCB9fSI+PCEtLQorICAgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICYmIHJlZi5wYXJlbnQgPT0gbnVsbCAmJiByZWYub3duaW5nQ2xhc3MgIT0gbnVsbCB9fSI+PCEtLQorICAgICAgIC0tPjxjbGFzcy1yZWYgcmVmPSJ7eyByZWYub3duaW5nQ2xhc3NdIH19Ij48L2NsYXNzLXJlZj4uPC90ZW1wbGF0ZT48IS0tCisgICAgIC0tPjx0ZW1wbGF0ZSBpZj0ie3sgcXVhbGlmaWVkICYmIHJlZi5wYXJlbnQgIT0gbnVsbCB9fSI+PCEtLQorICAgICAgIC0tPjxmdW5jdGlvbi1yZWYgcmVmPSJ7eyByZWYucGFyZW50IH19IiBxdWFsaWZpZWQ9Int7IHRydWUgfX0iPgogICAgICAgICAgIDwvZnVuY3Rpb24tcmVmPi48IS0tCiAgICAgIC0tPjwvdGVtcGxhdGU+PGEgb24tY2xpY2s9Int7IGdvdG8gfX0iIGhyZWY9Int7IHVybCB9fSI+e3sgbmFtZSB9fTwvYT48IS0tCi0gIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhaXNEYXJ0IH19Ij48c3Bhbj4ge3sgbmFtZSB9fTwvc3Bhbj48L3RlbXBsYXRlPjwvdGVtcGxhdGU+CisgIC0tPjwvdGVtcGxhdGU+PHRlbXBsYXRlIGlmPSJ7eyAhcmVmLmlzRGFydCB9fSI+PHNwYW4+IHt7IG5hbWUgfX08L3NwYW4+PC90ZW1wbGF0ZT48L3RlbXBsYXRlPgogPC9wb2x5bWVyLWVsZW1lbnQ+CiAKIDxzY3JpcHQgdHlwZT0iYXBwbGljYXRpb24vZGFydCIgc3JjPSJmdW5jdGlvbl9yZWYuZGFydCI+PC9zY3JpcHQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl92aWV3LmRhcnQKaW5kZXggM2Y5NGNlNC4uYzk1MzM5MyAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuZGFydAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvZnVuY3Rpb25fdmlldy5kYXJ0CkBAIC0xMSw3NyArMTEsOSBAQAogCiBAQ3VzdG9tVGFnKCdmdW5jdGlvbi12aWV3JykKIGNsYXNzIEZ1bmN0aW9uVmlld0VsZW1lbnQgZXh0ZW5kcyBPYnNlcnZhdG9yeUVsZW1lbnQgewotICBAcHVibGlzaGVkIFNlcnZpY2VNYXAgZnVuY3Rpb247CisgIEBwdWJsaXNoZWQgU2VydmljZUZ1bmN0aW9uIGZ1bmN0aW9uOwogICBGdW5jdGlvblZpZXdFbGVtZW50LmNyZWF0ZWQoKSA6IHN1cGVyLmNyZWF0ZWQoKTsKIAotICAvLyBUT0RPKHR1cm5pZGdlKTogT25jZSB3ZSBjcmVhdGUgYSBGdW5jdGlvbiBvYmplY3QsIHRoZXNlIGZpZWxkcwotICAvLyBzaG91bGQgbW92ZSB0aGVyZS4KLSAgQHB1Ymxpc2hlZCBTdHJpbmcgcXVhbGlmaWVkTmFtZTsKLSAgQHB1Ymxpc2hlZCBTdHJpbmcga2luZDsKLQotICBTdHJpbmcgX2dldFF1YWxpZmllZE5hbWUoU2VydmljZU1hcCBmdW5jdGlvbikgewotICAgIHZhciBwYXJlbnQgPSAoZnVuY3Rpb24gIT0gbnVsbCAmJiBmdW5jdGlvblsncGFyZW50J10gIT0gbnVsbAotICAgICAgICAgICAgICAgICAgPyBmdW5jdGlvblsncGFyZW50J10gOiBudWxsKTsKLSAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKLSAgICAgIHJldHVybiAiJHtfZ2V0UXVhbGlmaWVkTmFtZShwYXJlbnQpfS4ke2Z1bmN0aW9uWyd1c2VyX25hbWUnXX0iOwotICAgIH0KLSAgICB2YXIgY2xzID0gKGZ1bmN0aW9uICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIGZ1bmN0aW9uWydvd25lciddICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIGZ1bmN0aW9uWydvd25lciddLnNlcnZpY2VUeXBlID09ICdDbGFzcycKLSAgICAgICAgICAgICAgID8gZnVuY3Rpb25bJ293bmVyJ10gOiBudWxsKTsKLSAgICBpZiAoY2xzICE9IG51bGwpIHsKLSAgICAgIHJldHVybiAiJHtjbHNbJ3VzZXJfbmFtZSddfS4ke2Z1bmN0aW9uWyd1c2VyX25hbWUnXX0iOwotICAgIH0KLSAgICByZXR1cm4gIiR7ZnVuY3Rpb25bJ3VzZXJfbmFtZSddfSI7Ci0gIH0KLQotICB2b2lkIGZ1bmN0aW9uQ2hhbmdlZChvbGRWYWx1ZSkgewotICAgIG5vdGlmeVByb3BlcnR5Q2hhbmdlKCNxdWFsaWZpZWROYW1lLCAwLCAxKTsKLSAgICBub3RpZnlQcm9wZXJ0eUNoYW5nZSgja2luZCwgMCwgMSk7Ci0gICAgcXVhbGlmaWVkTmFtZSA9IF9nZXRRdWFsaWZpZWROYW1lKGZ1bmN0aW9uKTsKLSAgICBzd2l0Y2goZnVuY3Rpb25bJ2tpbmQnXSkgewotICAgICAgY2FzZSAna1JlZ3VsYXJGdW5jdGlvbic6Ci0gICAgICAgIGtpbmQgPSAnZnVuY3Rpb24nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tDbG9zdXJlRnVuY3Rpb24nOgotICAgICAgICBraW5kID0gJ2Nsb3N1cmUgZnVuY3Rpb24nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tTaWduYXR1cmVGdW5jdGlvbic6Ci0gICAgICAgIGtpbmQgPSAnc2lnbmF0dXJlIGZ1bmN0aW9uJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdrR2V0dGVyRnVuY3Rpb24nOgotICAgICAgICBraW5kID0gJ2dldHRlciBmdW5jdGlvbic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAna1NldHRlckZ1bmN0aW9uJzoKLSAgICAgICAga2luZCA9ICdzZXR0ZXIgZnVuY3Rpb24nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tDb25zdHJ1Y3Rvcic6Ci0gICAgICAgIGtpbmQgPSAnY29uc3RydWN0b3InOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tJbXBsaWNpdEdldHRlckZ1bmN0aW9uJzoKLSAgICAgICAga2luZCA9ICdpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tJbXBsaWNpdFNldHRlckZ1bmN0aW9uJzoKLSAgICAgICAga2luZCA9ICdpbXBsaWNpdCBzZXR0ZXIgZnVuY3Rpb24nOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tTdGF0aWNJbml0aWFsaXplcic6Ci0gICAgICAgIGtpbmQgPSAnc3RhdGljIGluaXRpYWxpemVyJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdrTWV0aG9kRXh0cmFjdG9yJzoKLSAgICAgICAga2luZCA9ICdtZXRob2QgZXh0cmFjdG9yJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdrTm9TdWNoTWV0aG9kRGlzcGF0Y2hlcic6Ci0gICAgICAgIGtpbmQgPSAnbm9TdWNoTWV0aG9kIGRpc3BhdGNoZXInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2tJbnZva2VGaWVsZERpc3BhdGNoZXInOgotICAgICAgICBraW5kID0gJ2ludm9rZSBmaWVsZCBkaXNwYXRjaGVyJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBraW5kID0gJ1VOS05PV04nOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQogICB2b2lkIHJlZnJlc2godmFyIGRvbmUpIHsKICAgICBmdW5jdGlvbi5yZWxvYWQoKS53aGVuQ29tcGxldGUoZG9uZSk7CiAgIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl92aWV3Lmh0bWwgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvZnVuY3Rpb25fdmlldy5odG1sCmluZGV4IDUwZWM5NTkuLjQ1MDZhYjAgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9mdW5jdGlvbl92aWV3Lmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2Z1bmN0aW9uX3ZpZXcuaHRtbApAQCAtMTQsMTIgKzE0LDEyIEBACiAgICAgPG5hdi1iYXI+CiAgICAgICA8dG9wLW5hdi1tZW51PjwvdG9wLW5hdi1tZW51PgogICAgICAgPGlzb2xhdGUtbmF2LW1lbnUgaXNvbGF0ZT0ie3sgZnVuY3Rpb24uaXNvbGF0ZSB9fSI+PC9pc29sYXRlLW5hdi1tZW51PgotICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSA9PSAnQ2xhc3MnIH19Ij4KKyAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgIT0gbnVsbCB9fSI+CiAgICAgICAgIDwhLS0gVE9ETyh0dXJuaWRnZSk6IEFkZCBsaWJyYXJ5IG5hdiBtZW51IGhlcmUuIC0tPgotICAgICAgICA8Y2xhc3MtbmF2LW1lbnUgY2xzPSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9jbGFzcy1uYXYtbWVudT4KKyAgICAgICAgPGNsYXNzLW5hdi1tZW51IGNscz0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgfX0iPjwvY2xhc3MtbmF2LW1lbnU+CiAgICAgICA8L3RlbXBsYXRlPgotICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSA9PSAnTGlicmFyeScgfX0iPgotICAgICAgICA8bGlicmFyeS1uYXYtbWVudSBsaWJyYXJ5PSJ7eyBmdW5jdGlvblsnb3duZXInXSB9fSI+PC9saWJyYXJ5LW5hdi1tZW51PgorICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5ICE9IG51bGwgfX0iPgorICAgICAgICA8bGlicmFyeS1uYXYtbWVudSBsaWJyYXJ5PSJ7eyBmdW5jdGlvbi5vd25pbmdMaWJyYXJ5IH19Ij48L2xpYnJhcnktbmF2LW1lbnU+CiAgICAgICA8L3RlbXBsYXRlPgogICAgICAgPG5hdi1tZW51IGxpbms9Int7IGZ1bmN0aW9uLmxpbmsgfX0iIGFuY2hvcj0ie3sgZnVuY3Rpb24ubmFtZSB9fSIgbGFzdD0ie3sgdHJ1ZSB9fSI+PC9uYXYtbWVudT4KICAgICAgIDxuYXYtcmVmcmVzaCBjYWxsYmFjaz0ie3sgcmVmcmVzaCB9fSI+PC9uYXYtcmVmcmVzaD4KQEAgLTI3LDc5ICsyNyw3OSBAQAogICAgIDwvbmF2LWJhcj4KIAogICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgotICAgICAgPGgxPmZ1bmN0aW9uIHt7IHF1YWxpZmllZE5hbWUgfX08L2gxPgorICAgICAgPGgxPmZ1bmN0aW9uIHt7IGZ1bmN0aW9uLnF1YWxpZmllZE5hbWUgfX08L2gxPgogCiAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJMaXN0Ij4KICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+a2luZDwvZGl2PgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ2lzX3N0YXRpYyddIH19Ij5zdGF0aWM8L3RlbXBsYXRlPgotICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnaXNfY29uc3QnXSB9fSI+Y29uc3Q8L3RlbXBsYXRlPgotICAgICAgICAgICAge3sga2luZCB9fQorICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5pc1N0YXRpYyB9fSI+c3RhdGljPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24uaXNDb25zdCB9fSI+Y29uc3Q8L3RlbXBsYXRlPgorICAgICAgICAgICAge3sgZnVuY3Rpb24ua2luZC50b1N0cmluZygpIH19CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvZGl2PgotICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWydwYXJlbnQnXSAhPSBudWxsIH19Ij4KKyAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5wYXJlbnQgIT0gbnVsbCB9fSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJOYW1lIj5wYXJlbnQgZnVuY3Rpb248L2Rpdj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgICAgPGZ1bmN0aW9uLXJlZiByZWY9Int7IGZ1bmN0aW9uWydwYXJlbnQnXSB9fSI+PC9mdW5jdGlvbi1yZWY+CisgICAgICAgICAgICAgIDxmdW5jdGlvbi1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5wYXJlbnQgfX0iPjwvZnVuY3Rpb24tcmVmPgogICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPm93bmVyPC9kaXY+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSA9PSAnQ2xhc3MnIH19Ij4KLSAgICAgICAgICAgICAgPGNsYXNzLXJlZiByZWY9Int7IGZ1bmN0aW9uWydvd25lciddIH19Ij48L2NsYXNzLXJlZj4KKyAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ub3duaW5nQ2xhc3MgIT0gbnVsbCB9fSI+CisgICAgICAgICAgICAgIDxjbGFzcy1yZWYgcmVmPSJ7eyBmdW5jdGlvbi5vd25pbmdDbGFzcyB9fSI+PC9jbGFzcy1yZWY+CiAgICAgICAgICAgICA8L3RlbXBsYXRlPgotICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvblsnb3duZXInXS5zZXJ2aWNlVHlwZSAhPSAnQ2xhc3MnIH19Ij4KLSAgICAgICAgICAgICAgPGxpYnJhcnktcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ293bmVyJ10gfX0iPjwvbGlicmFyeS1yZWY+CisgICAgICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uLm93bmluZ0xpYnJhcnkgIT0gbnVsbCB9fSI+CisgICAgICAgICAgICAgIDxsaWJyYXJ5LXJlZiByZWY9Int7IGZ1bmN0aW9uLm93bmluZ0xpYnJhcnkgfX0iPjwvbGlicmFyeS1yZWY+CiAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgIDwvZGl2PgogICAgICAgICA8L2Rpdj4KICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+c2NyaXB0PC9kaXY+CiAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgPHNjcmlwdC1yZWYgcmVmPSJ7eyBmdW5jdGlvblsnc2NyaXB0J10gfX0iCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3M9Int7IGZ1bmN0aW9uWyd0b2tlblBvcyddIH19Ij4KKyAgICAgICAgICAgIDxzY3JpcHQtcmVmIHJlZj0ie3sgZnVuY3Rpb24uc2NyaXB0IH19IgorICAgICAgICAgICAgICAgICAgICAgICAgcG9zPSJ7eyBmdW5jdGlvbi50b2tlblBvcyB9fSI+CiAgICAgICAgICAgICA8L3NjcmlwdC1yZWY+CiAgICAgICAgICAgPC9kaXY+CiAgICAgICAgIDwvZGl2PgogCiAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPiZuYnNwOzwvZGl2PgogCi0gICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb25bJ2NvZGUnXSAhPSBudWxsIH19Ij4KKyAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBmdW5jdGlvbi5jb2RlICE9IG51bGwgfX0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+b3B0aW1pemVkIGNvZGU8L2Rpdj4KICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj4KLSAgICAgICAgICAgICAgPGNvZGUtcmVmIHJlZj0ie3sgZnVuY3Rpb25bJ2NvZGUnXSB9fSI+PC9jb2RlLXJlZj4KKyAgICAgICAgICAgICAgPGNvZGUtcmVmIHJlZj0ie3sgZnVuY3Rpb24uY29kZSB9fSI+PC9jb2RlLXJlZj4KICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgIDwvZGl2PgogICAgICAgICA8L3RlbXBsYXRlPgotICAgICAgICA8dGVtcGxhdGUgaWY9Int7IGZ1bmN0aW9uWyd1bm9wdGltaXplZF9jb2RlJ10gIT0gbnVsbCB9fSI+CisgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24udW5vcHRpbWl6ZWRDb2RlICE9IG51bGwgfX0iPgogICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlckl0ZW0iPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+dW5vcHRpbWl6ZWQgY29kZTwvZGl2PgogICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgotICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvblsndW5vcHRpbWl6ZWRfY29kZSddIH19Ij48L2NvZGUtcmVmPgorICAgICAgICAgICAgICA8Y29kZS1yZWYgcmVmPSJ7eyBmdW5jdGlvbi51bm9wdGltaXplZENvZGUgfX0iPjwvY29kZS1yZWY+CiAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPgogICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSJUaGlzIGNvdW50IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gYSBmdW5jdGlvbiB3aWxsIGJlIG9wdGltaXplZC4gIEl0IGlzIGEgY29tYmluYXRpb24gb2YgY2FsbCBjb3VudHMgYW5kIG90aGVyIGZhY3RvcnMuIj4KLSAgICAgICAgICAgICAgICAgICh1c2FnZSBjb3VudDoge3sgZnVuY3Rpb25bJ3VzYWdlX2NvdW50ZXInXSB9fSkKKyAgICAgICAgICAgICAgICAgICh1c2FnZSBjb3VudDoge3sgZnVuY3Rpb24udXNhZ2VDb3VudGVyIH19KQogICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPmRlb3B0aW1pemF0aW9uczwvZGl2PgotICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb25bJ2Rlb3B0aW1pemF0aW9ucyddIH19PC9kaXY+CisgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvbi5kZW9wdGltaXphdGlvbnMgfX08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVySXRlbSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlck5hbWUiPm9wdGltaXphYmxlPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnaXNfb3B0aW1pemFibGUnXSB9fTwvZGl2PgorICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJWYWx1ZSI+e3sgZnVuY3Rpb24uaXNPcHRpbWl6YWJsZSB9fTwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyTmFtZSI+aW5saW5hYmxlPC9kaXY+Ci0gICAgICAgICAgIDxkaXYgY2xhc3M9Im1lbWJlclZhbHVlIj57eyBmdW5jdGlvblsnaXNfaW5saW5hYmxlJ10gfX08L2Rpdj4KKyAgICAgICAgICAgPGRpdiBjbGFzcz0ibWVtYmVyVmFsdWUiPnt7IGZ1bmN0aW9uLmlzSW5saW5hYmxlIH19PC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgZnVuY3Rpb24ubmFtZSAhPSBmdW5jdGlvbi52bU5hbWUgfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZW1iZXJJdGVtIj4KQEAgLTExMSw3ICsxMTEsOSBAQAogICAgIDwvZGl2PgogCiAgICAgPGhyPgotICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBmdW5jdGlvblsnc2NyaXB0J10gfX0iIHBvcz0ie3sgZnVuY3Rpb25bJ3Rva2VuUG9zJ10gfX0iIGVuZFBvcz0ie3sgZnVuY3Rpb25bJ2VuZFRva2VuUG9zJ10gfX0iPgorICAgIDxzY3JpcHQtaW5zZXQgc2NyaXB0PSJ7eyBmdW5jdGlvbi5zY3JpcHQgfX0iCisgICAgICAgICAgICAgICAgICBzdGFydFBvcz0ie3sgZnVuY3Rpb24udG9rZW5Qb3MgfX0iCisgICAgICAgICAgICAgICAgICBlbmRQb3M9Int7IGZ1bmN0aW9uLmVuZFRva2VuUG9zIH19Ij4KICAgICA8L3NjcmlwdC1pbnNldD4KIAogICAgIDxicj4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9pc29sYXRlX3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9pc29sYXRlX3ZpZXcuaHRtbAppbmRleCA0MjRjMjhkLi5kYzllYzMwIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvaXNvbGF0ZV92aWV3Lmh0bWwKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL2lzb2xhdGVfdmlldy5odG1sCkBAIC01NCw3ICs1NCw4IEBACiAgICAgPHRlbXBsYXRlIGlmPSJ7eyBpc29sYXRlLnRvcEZyYW1lICE9IG51bGwgfX0iPgogICAgICAgPGJyPgogICAgICAgPHNjcmlwdC1pbnNldCBzY3JpcHQ9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3NjcmlwdCddIH19IgotICAgICAgICAgICAgICAgICAgICBwb3M9Int7IGlzb2xhdGUudG9wRnJhbWVbJ3Rva2VuUG9zJ10gfX0iPgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG9zPSJ7eyBpc29sYXRlLnRvcEZyYW1lWyd0b2tlblBvcyddIH19IgorICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjIwMHB4Ij4KICAgICAgIDwvc2NyaXB0LWluc2V0PgogICAgIDwvdGVtcGxhdGU+CiAKZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9vYnNlcnZhdG9yeV9lbGVtZW50LmRhcnQgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvb2JzZXJ2YXRvcnlfZWxlbWVudC5kYXJ0CmluZGV4IGI1M2U3Y2YuLjc0ZmVmZjcgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9vYnNlcnZhdG9yeV9lbGVtZW50LmRhcnQKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL29ic2VydmF0b3J5X2VsZW1lbnQuZGFydApAQCAtMTUsNiArMTUsOCBAQAogICBPYnNlcnZhdG9yeUVsZW1lbnQuY3JlYXRlZCgpIDogc3VwZXIuY3JlYXRlZCgpOwogCiAgIE9ic2VydmF0b3J5QXBwbGljYXRpb24gZ2V0IGFwcCA9PiBPYnNlcnZhdG9yeUFwcGxpY2F0aW9uLmFwcDsKKyAgUGFnZSBnZXQgcGFnZSA9PiBhcHAuY3VycmVudFBhZ2U7CisgIE9ic2VydmFibGVNYXAgZ2V0IGFyZ3MgPT4gcGFnZS5hcmdzOwogCiAgIEBvdmVycmlkZQogICB2b2lkIGF0dGFjaGVkKCkgewpAQCAtMTA4LDYgKzExMCw4IEBACiAgICAgcmV0dXJuICIke3Nob3J0RmlsZX06JHtmcmFtZVsnbGluZSddfSI7CiAgIH0KIAorICBpbnQgcGFyc2VJbnQoU3RyaW5nIHZhbHVlKSA9PiBpbnQucGFyc2UodmFsdWUpOworCiAgIGJvb2wgaXNOdWxsKFN0cmluZyB0eXBlKSB7CiAgICAgcmV0dXJuIHR5cGUgPT0gJ051bGwnOwogICB9CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0LmRhcnQgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0LmRhcnQKaW5kZXggNWEwYzlhNy4uZDY5Nzk4MyAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL3NjcmlwdF9pbnNldC5kYXJ0CisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfaW5zZXQuZGFydApAQCAtNCw2ICs0LDcgQEAKIAogbGlicmFyeSBzY3JpcHRfaW5zZXRfZWxlbWVudDsKIAoraW1wb3J0ICdkYXJ0Omh0bWwnOwogaW1wb3J0ICdvYnNlcnZhdG9yeV9lbGVtZW50LmRhcnQnOwogaW1wb3J0ICdwYWNrYWdlOm9ic2VydmF0b3J5L3NlcnZpY2UuZGFydCc7CiBpbXBvcnQgJ3BhY2thZ2U6cG9seW1lci9wb2x5bWVyLmRhcnQnOwpAQCAtMTIsMjMgKzEzLDU2IEBACiBAQ3VzdG9tVGFnKCdzY3JpcHQtaW5zZXQnKQogY2xhc3MgU2NyaXB0SW5zZXRFbGVtZW50IGV4dGVuZHMgT2JzZXJ2YXRvcnlFbGVtZW50IHsKICAgQHB1Ymxpc2hlZCBTY3JpcHQgc2NyaXB0OwotICBAcHVibGlzaGVkIGludCBwb3M7CisKKyAgLy8vIFNldCB0aGUgaGVpZ2h0IHRvIG1ha2UgdGhlIHNjcmlwdCBpbnNldCBzY3JvbGwuICBPdGhlcndpc2UgaXQKKyAgLy8vIHdpbGwgc2hvdyBmcm9tIHN0YXJ0UG9zIHRvIGVuZFBvcy4KKyAgQHB1Ymxpc2hlZCBTdHJpbmcgaGVpZ2h0ID0gbnVsbDsKKworICBAcHVibGlzaGVkIGludCBjdXJyZW50UG9zOworICBAcHVibGlzaGVkIGludCBzdGFydFBvczsKICAgQHB1Ymxpc2hlZCBpbnQgZW5kUG9zOwotICBmaW5hbCBMaXN0PGludD4gbGluZU51bWJlcnMgPSBuZXcgT2JzZXJ2YWJsZUxpc3Q8aW50PigpOworCisgIEBvYnNlcnZhYmxlIGludCBjdXJyZW50TGluZTsKICAgQG9ic2VydmFibGUgaW50IHN0YXJ0TGluZTsKICAgQG9ic2VydmFibGUgaW50IGVuZExpbmU7CiAKICAgQG9ic2VydmFibGUgTGlzdDxTY3JpcHRMaW5lPiBsaW5lcyA9IHRvT2JzZXJ2YWJsZShbXSk7CiAKLSAgdm9pZCBhdHRhY2hlZCgpIHsKLSAgICBzdXBlci5hdHRhY2hlZCgpOworICBTdHJpbmcgbWFrZUxpbmVJZChpbnQgbGluZSkgeworICAgIHJldHVybiAnbGluZS0kbGluZSc7CiAgIH0KIAotICB2b2lkIHNjcmlwdENoYW5nZWQob2xkVmFsdWUpIHsKKyAgTXV0YXRpb25PYnNlcnZlciBfb2JzZXJ2ZXI7CisKKyAgdm9pZCBfb25NdXRhdGlvbihtdXRhdGlvbnMsIG9ic2VydmVyKSB7CisgICAgdmFyIGxpbmUgPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNsaW5lLSRjdXJyZW50TGluZScpOworICAgIGlmIChsaW5lICE9IG51bGwpIHsKKyAgICAgIGxpbmUuc2Nyb2xsSW50b1ZpZXcoKTsKKyAgICB9CisgIH0gCisKKyAgdm9pZCBhdHRhY2hlZCgpIHsKKyAgICBzdXBlci5hdHRhY2hlZCgpOworICAgIHZhciB0YWJsZSA9IHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignLnNvdXJjZVRhYmxlJyk7CisgICAgaWYgKHRhYmxlICE9IG51bGwpIHsKKyAgICAgIF9vYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKF9vbk11dGF0aW9uKTsKKyAgICAgIF9vYnNlcnZlci5vYnNlcnZlKHRhYmxlLCBjaGlsZExpc3Q6dHJ1ZSk7CisgICAgfQorICB9CisKKyAgdm9pZCBkZXRhY2hlZCgpIHsKKyAgICBpZiAoX29ic2VydmVyICE9IG51bGwpIHsKKyAgICAgIF9vYnNlcnZlci5kaXNjb25uZWN0KCk7CisgICAgICBfb2JzZXJ2ZXIgPSBudWxsOworICAgIH0KKyAgICBzdXBlci5kZXRhY2hlZCgpOworICB9CisKKyAgdm9pZCBjdXJyZW50UG9zQ2hhbmdlZChvbGRWYWx1ZSkgewogICAgIF91cGRhdGVMaW5lcygpOwogICB9CiAKLSAgdm9pZCBwb3NDaGFuZ2VkKG9sZFZhbHVlKSB7CisgIHZvaWQgc3RhcnRQb3NDaGFuZ2VkKG9sZFZhbHVlKSB7CiAgICAgX3VwZGF0ZUxpbmVzKCk7CiAgIH0KIApAQCAtMzYsMjEgKzcwLDggQEAKICAgICBfdXBkYXRlTGluZXMoKTsKICAgfQogCi0gIHN0YXRpYyBjb25zdCBoaXRTdHlsZU5vbmUgPSAnbWluLXdpZHRoOjMycHg7JzsKLSAgc3RhdGljIGNvbnN0IGhpdFN0eWxlRXhlY3V0ZWQgPSAnbWluLXdpZHRoOjMycHg7IGJhY2tncm91bmQtY29sb3I6Z3JlZW4nOwotICBzdGF0aWMgY29uc3QgaGl0U3R5bGVOb3RFeGVjdXRlZCA9ICdtaW4td2lkdGg6MzJweDsgYmFja2dyb3VuZC1jb2xvcjpyZWQnOwotCi0gIC8vLyBbaGl0c10gY2FuIGJlIG51bGwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGxpbmUgaXMgbm90IGV4ZWN1dGFibGUuCi0gIC8vLyBXaGVuIFtoaXRzXSBpcyAwLCB0aGUgbGluZSBpcyBleGVjdXRhYmxlIGJ1dCBoYXNuJ3QgYmVlbiBleGVjdXRlZCBhbmQKLSAgLy8vIHdoZW4gW2hpdHNdIGlzIHBvc2l0aXZlLCB0aGUgbGluZSBpcyBleGVjdXRhYmxlIGFuZCBoYXMgYmVlbiBleGVjdXRlZC4KLSAgU3RyaW5nIHN0eWxlRm9ySGl0cyhpbnQgaGl0cykgewotICAgIGlmIChoaXRzID09IG51bGwpIHsKLSAgICAgIHJldHVybiBoaXRTdHlsZU5vbmU7Ci0gICAgfSBlbHNlIGlmIChoaXRzID09IDApIHsKLSAgICAgIHJldHVybiBoaXRTdHlsZU5vdEV4ZWN1dGVkOwotICAgIH0KLSAgICBhc3NlcnQoaGl0cyA+IDApOwotICAgIHJldHVybiBoaXRTdHlsZUV4ZWN1dGVkOworICB2b2lkIHNjcmlwdENoYW5nZWQob2xkVmFsdWUpIHsKKyAgICBfdXBkYXRlTGluZXMoKTsKICAgfQogCiAgIHZhciBfdXBkYXRlRnV0dXJlOwpAQCAtNjAsNiArODEsMTAgQEAKICAgICAgIC8vIEFscmVhZHkgc2NoZWR1bGVkLgogICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBpZiAoc2NyaXB0ID09IG51bGwpIHsKKyAgICAgIC8vIFdhaXQgZm9yIHNjcmlwdCB0byBiZSBhc3NpZ25lZC4KKyAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKCFzY3JpcHQubG9hZGVkKSB7CiAgICAgICBfdXBkYXRlRnV0dXJlID0gc2NyaXB0LmxvYWQoKS50aGVuKChfKSB7CiAgICAgICAgIGlmIChzY3JpcHQubG9hZGVkKSB7CkBAIC02OSwxNCArOTQsMTggQEAKICAgICAgIH0pOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBzdGFydExpbmUgPQotICAgICAgICAocG9zICE9IG51bGwpID8gc2NyaXB0LnRva2VuVG9MaW5lKHBvcykgLSAxIDogMDsKLSAgICBlbmRMaW5lID0KLSAgICAgICAgKGVuZFBvcyAhPSBudWxsKSA/IHNjcmlwdC50b2tlblRvTGluZShlbmRQb3MpIDogc3RhcnRMaW5lICsgMTsKLSAgICAvLyBBZGQgbGluZSBudW1iZXJzLgotICAgIGxpbmVOdW1iZXJzLmNsZWFyKCk7Ci0gICAgZm9yICh2YXIgaSA9IHN0YXJ0TGluZTsgaSA8IGVuZExpbmU7IGkrKykgewotICAgICAgbGluZU51bWJlcnMuYWRkKGkpOworICAgIHN0YXJ0TGluZSA9IChzdGFydFBvcyAhPSBudWxsCisgICAgICAgICAgICAgICAgID8gc2NyaXB0LnRva2VuVG9MaW5lKHN0YXJ0UG9zKQorICAgICAgICAgICAgICAgICA6IDEpOworICAgIGN1cnJlbnRMaW5lID0gKGN1cnJlbnRQb3MgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgID8gc2NyaXB0LnRva2VuVG9MaW5lKGN1cnJlbnRQb3MpCisgICAgICAgICAgICAgICAgICAgOiBudWxsKTsKKyAgICBlbmRMaW5lID0gKGVuZFBvcyAhPSBudWxsCisgICAgICAgICAgICAgICA/IHNjcmlwdC50b2tlblRvTGluZShlbmRQb3MpCisgICAgICAgICAgICAgICA6IHNjcmlwdC5saW5lcy5sZW5ndGgpOworICAgIGxpbmVzLmNsZWFyKCk7CisgICAgZm9yIChpbnQgaSA9IChzdGFydExpbmUgLSAxKTsgaSA8PSAoZW5kTGluZSAtIDEpOyBpKyspIHsKKyAgICAgIGxpbmVzLmFkZChzY3JpcHQubGluZXNbaV0pOwogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0Lmh0bWwgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X2luc2V0Lmh0bWwKaW5kZXggY2VmYjk1Yy4uNTI0NjBkZiAxMDA2NDQKLS0tIGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL3NjcmlwdF9pbnNldC5odG1sCisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfaW5zZXQuaHRtbApAQCAtOCwyNiArOCw2NSBAQAogICAgICAgICBwYWRkaW5nLWxlZnQ6IDE1JTsKICAgICAgICAgcGFkZGluZy1yaWdodDogMTUlOwogICAgICAgfQotICAgICAgLmdyYXlCb3ggeworICAgICAgLnNvdXJjZUJveCB7CiAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1OwogICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgICBwYWRkaW5nOiAxMHB4OwotICAgICB9CisgICAgICAgIG92ZXJmbG93LXk6IGF1dG87CisgICAgICB9CisgICAgICAuc291cmNlVGFibGUgeworICAgICAgICBkaXNwbGF5OiB0YWJsZTsKKyAgICAgIH0KKyAgICAgIC5zb3VyY2VSb3cgeworICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CisgICAgICB9CisgICAgICAuc291cmNlSXRlbSwgLnNvdXJjZUl0ZW1DdXJyZW50IHsKKyAgICAgICAgZGlzcGxheTogdGFibGUtY2VsbDsKKyAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKKyAgICAgICAgZm9udDogNDAwIDE0cHggY29uc29sYXMsIGNvdXJpZXIsIG1vbm9zcGFjZTsKKyAgICAgICAgbGluZS1oZWlnaHQ6IDEyNSU7CisgICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CisgICAgICB9CisgICAgICAuc291cmNlSXRlbUN1cnJlbnQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjNmNmOworICAgICAgfQorICAgICAgLmhpdHNOb25lLCAuaGl0c05vdEV4ZWN1dGVkLCAuaGl0c0V4ZWN1dGVkIHsKKyAgICAgICAgbWluLXdpZHRoOiAzMnB4OworICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKKyAgICAgIH0KKyAgICAgIC5oaXRzTm90RXhlY3V0ZWQgeworICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTY2OworICAgICAgfQorICAgICAgLmhpdHNFeGVjdXRlZCB7CisgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICM2ZDY7CisgICAgICB9CiAgICAgPC9zdHlsZT4KICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJbnNldCI+CiAgICAgICA8Y29udGVudD48L2NvbnRlbnQ+Ci0gICAgICA8ZGl2IGNsYXNzPSJncmF5Qm94Ij4KLSAgICAgICAgPHRhYmxlPgotICAgICAgICAgIDx0Ym9keT4KLSAgICAgICAgICAgIDx0ciB0ZW1wbGF0ZSByZXBlYXQ9Int7IGxpbmVOdW1iZXIgaW4gbGluZU51bWJlcnMgfX0iPgotICAgICAgICAgICAgICA8dGQgc3R5bGU9Int7IHN0eWxlRm9ySGl0cyhzY3JpcHQubGluZXNbbGluZU51bWJlcl0uaGl0cykgfX0iPjxzcGFuPiAgPC9zcGFuPjwvdGQ+Ci0gICAgICAgICAgICAgIDx0ZCBzdHlsZT0iZm9udC1mYW1pbHk6IGNvbnNvbGFzLCBjb3VyaWVyLCBtb25vc3BhY2U7Zm9udC1zaXplOiAxZW07bGluZS1oZWlnaHQ6IDEuMmVtO3doaXRlLXNwYWNlOiBub3dyYXA7Ij57e3NjcmlwdC5saW5lc1tsaW5lTnVtYmVyXS5saW5lfX08L3RkPgotICAgICAgICAgICAgICA8dGQ+Jm5ic3A7PC90ZD4KLSAgICAgICAgICAgICAgPHRkIHdpZHRoPSI5OSUiIHN0eWxlPSJmb250LWZhbWlseTogY29uc29sYXMsIGNvdXJpZXIsIG1vbm9zcGFjZTtmb250LXNpemU6IDFlbTtsaW5lLWhlaWdodDogMS4yZW07d2hpdGUtc3BhY2U6IHByZTsiPnt7c2NyaXB0LmxpbmVzW2xpbmVOdW1iZXJdLnRleHR9fTwvdGQ+Ci0gICAgICAgICAgICA8L3RyPgotICAgICAgICAgIDwvdGJvZHk+Ci0gICAgICAgIDwvdGFibGU+CisgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VCb3giIHN0eWxlPSJoZWlnaHQ6e3toZWlnaHR9fSI+CisgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZVRhYmxlIj4KKyAgICAgICAgICA8dGVtcGxhdGUgcmVwZWF0PSJ7eyBsaW5lIGluIGxpbmVzIH19Ij4KKyAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZVJvdyIgaWQ9Int7IG1ha2VMaW5lSWQobGluZS5saW5lKSB9fSI+CisgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpZj0ie3sgbGluZS5oaXRzID09IG51bGwgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhpdHNOb25lIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmhpdHMgPT0gMCB9fSI+CisgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGl0c05vdEV4ZWN1dGVkIj57eyBsaW5lLmxpbmUgfX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmhpdHMgPiAwIH19Ij4KKyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoaXRzRXhlY3V0ZWQiPnt7IGxpbmUubGluZSB9fTwvZGl2PgorICAgICAgICAgICAgICA8L3RlbXBsYXRlPgorICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzb3VyY2VJdGVtIj4mbmJzcDs8L2Rpdj4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmxpbmUgPT0gY3VycmVudExpbmUgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgaWQ9ImN1cnJlbnRMaW5lIiBjbGFzcz0ic291cmNlSXRlbUN1cnJlbnQiPnt7bGluZS50ZXh0fX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgPHRlbXBsYXRlIGlmPSJ7eyBsaW5lLmxpbmUgIT0gY3VycmVudExpbmUgfX0iPgorICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNvdXJjZUl0ZW0iPnt7bGluZS50ZXh0fX08L2Rpdj4KKyAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KKyAgICAgICAgICAgIDwvZGl2PgorICAgICAgICAgIDwvdGVtcGxhdGU+CisgICAgICAgIDwvZGl2PgogICAgICAgPC9kaXY+CiAgICAgPC9kaXY+CiAgIDwvdGVtcGxhdGU+CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X3JlZi5kYXJ0IGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL3NjcmlwdF9yZWYuZGFydAppbmRleCBjODhkNDNhLi42MDFhMjRhIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X3JlZi5kYXJ0CisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfcmVmLmRhcnQKQEAgLTU0LDcgKzU0LDcgQEAKICAgICAgIGlmIChyZWYubG9hZGVkKSB7CiAgICAgICAgIC8vIFNjcmlwdCBpcyBsb2FkZWQsIGdldCB0aGUgbGluZSBudW1iZXIuCiAgICAgICAgIFNjcmlwdCBzY3JpcHQgPSByZWY7Ci0gICAgICAgIHJldHVybiAnJHtzdXBlci51cmx9I2xpbmU9JHtzY3JpcHQudG9rZW5Ub0xpbmUocG9zKX0nOworICAgICAgICByZXR1cm4gJyR7c3VwZXIudXJsfSNwb3M9JHtwb3N9JzsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJlZi5sb2FkKCkudGhlbihfdXBkYXRlUHJvcGVydGllcyk7CiAgICAgICB9CmRpZmYgLS1naXQgYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2NyaXB0X3ZpZXcuaHRtbCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfdmlldy5odG1sCmluZGV4IGE5OWJiODkuLmJkNTRjNzIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfdmlldy5odG1sCisrKyBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zY3JpcHRfdmlldy5odG1sCkBAIC0xNiwxMCArMTYsMjAgQEAKICAgICA8bmF2LWNvbnRyb2w+PC9uYXYtY29udHJvbD4KICAgPC9uYXYtYmFyPgogCi0gIDxzY3JpcHQtaW5zZXQgaWQ9InNjcmlwdEluc2V0IiBzY3JpcHQ9Int7IHNjcmlwdCB9fSIgcG9zPSJ7eyBzY3JpcHQuZmlyc3RUb2tlblBvcyB9fSIgZW5kUG9zPSJ7eyBzY3JpcHQubGFzdFRva2VuUG9zIH19Ij4KLSAgPGgxPnNjcmlwdCB7eyBzY3JpcHQubmFtZSB9fTwvaDE+Ci0gIDwvc2NyaXB0LWluc2V0PgorICA8dGVtcGxhdGUgaWY9Int7IGFyZ3NbJ3BvcyddID09IG51bGwgfX0iPgorICAgIDxzY3JpcHQtaW5zZXQgaWQ9InNjcmlwdEluc2V0IiBzY3JpcHQ9Int7IHNjcmlwdCB9fSI+CisgICAgICA8aDE+c2NyaXB0IHt7IHNjcmlwdC5uYW1lIH19PC9oMT4KKyAgICA8L3NjcmlwdC1pbnNldD4KKyAgPC90ZW1wbGF0ZT4KKworICA8dGVtcGxhdGUgaWY9Int7IGFyZ3NbJ3BvcyddICE9IG51bGwgfX0iPgorICAgIDxzY3JpcHQtaW5zZXQgaWQ9InNjcmlwdEluc2V0IiBzY3JpcHQ9Int7IHNjcmlwdCB9fSIKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3M9Int7IGFyZ3NbJ3BvcyddIHwgcGFyc2VJbnQgfX0iPgorICAgICAgPGgxPnNjcmlwdCB7eyBzY3JpcHQubmFtZSB9fTwvaDE+CisgICAgPC9zY3JpcHQtaW5zZXQ+CisgIDwvdGVtcGxhdGU+CisKIDwvdGVtcGxhdGU+CiA8L3BvbHltZXItZWxlbWVudD4KIAotPHNjcmlwdCB0eXBlPSJhcHBsaWNhdGlvbi9kYXJ0IiBzcmM9InNjcmlwdF92aWV3LmRhcnQiPjwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxzY3JpcHQgdHlwZT0iYXBwbGljYXRpb24vZGFydCIgc3JjPSJzY3JpcHRfdmlldy5kYXJ0Ij48L3NjcmlwdD4KZGlmZiAtLWdpdCBhL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zZXJ2aWNlX3ZpZXcuZGFydCBiL3J1bnRpbWUvYmluL3Ztc2VydmljZS9jbGllbnQvbGliL3NyYy9lbGVtZW50cy9zZXJ2aWNlX3ZpZXcuZGFydAppbmRleCBkYTM5NWM3Li4wMDYxNzZiIDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvZWxlbWVudHMvc2VydmljZV92aWV3LmRhcnQKKysrIGIvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL2VsZW1lbnRzL3NlcnZpY2Vfdmlldy5kYXJ0CkBAIC0xNCw2ICsxNCw3IEBACiBAQ3VzdG9tVGFnKCdzZXJ2aWNlLXZpZXcnKQogY2xhc3MgU2VydmljZU9iamVjdFZpZXdFbGVtZW50IGV4dGVuZHMgT2JzZXJ2YXRvcnlFbGVtZW50IHsKICAgQHB1Ymxpc2hlZCBTZXJ2aWNlT2JqZWN0IG9iamVjdDsKKyAgQHB1Ymxpc2hlZCBPYnNlcnZhYmxlTWFwIGFyZ3M7CiAKICAgU2VydmljZU9iamVjdFZpZXdFbGVtZW50LmNyZWF0ZWQoKSA6IHN1cGVyLmNyZWF0ZWQoKTsKIApkaWZmIC0tZ2l0IGEvcnVudGltZS9iaW4vdm1zZXJ2aWNlL2NsaWVudC9saWIvc3JjL3NlcnZpY2Uvb2JqZWN0LmRhcnQgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvc2VydmljZS9vYmplY3QuZGFydAppbmRleCAwZjkwYzBkLi5hMGUxZmM1IDEwMDY0NAotLS0gYS9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvc2VydmljZS9vYmplY3QuZGFydAorKysgYi9ydW50aW1lL2Jpbi92bXNlcnZpY2UvY2xpZW50L2xpYi9zcmMvc2VydmljZS9vYmplY3QuZGFydApAQCAtNzksMTIgKzc5LDE3IEBACiAgICAgICBjYXNlICdFcnJvcic6CiAgICAgICAgIG9iaiA9IG5ldyBEYXJ0RXJyb3IuX2VtcHR5KG93bmVyKTsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdGdW5jdGlvbic6CisgICAgICAgIG9iaiA9IG5ldyBTZXJ2aWNlRnVuY3Rpb24uX2VtcHR5KG93bmVyKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICdJc29sYXRlJzoKICAgICAgICAgb2JqID0gbmV3IElzb2xhdGUuX2VtcHR5KG93bmVyLnZtKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlICdMaWJyYXJ5JzoKICAgICAgICAgb2JqID0gbmV3IExpYnJhcnkuX2VtcHR5KG93bmVyKTsKICAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdOdWxsJzoKKyAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICBjYXNlICdTZXJ2aWNlRXJyb3InOgogICAgICAgICBvYmogPSBuZXcgU2VydmljZUVycm9yLl9lbXB0eShvd25lcik7CiAgICAgICAgIGJyZWFrOwpAQCAtNjg4LDcgKzY5Myw3IEBACiAgICAgfQogICAgIC8vIEJ1aWxkIHRoZSBvYmplY3QgZnJvbSB0aGUgbWFwIGRpcmVjdGx5LgogICAgIG9iaiA9IG5ldyBTZXJ2aWNlT2JqZWN0Ll9mcm9tTWFwKHRoaXMsIG1hcCk7Ci0gICAgaWYgKG9iai5jYW5DYWNoZSkgeworICAgIGlmIChvYmogIT0gbnVsbCAmJiBvYmouY2FuQ2FjaGUpIHsKICAgICAgIF9jYWNoZVtpZF0gPSBvYmo7CiAgICAgfQogICAgIHJldHVybiBvYmo7CkBAIC0xMDM2LDcgKzEwNDEsNyBAQAogICBAcmVmbGVjdGFibGUgZmluYWwgc2NyaXB0cyA9IG5ldyBPYnNlcnZhYmxlTGlzdDxTY3JpcHQ+KCk7CiAgIEByZWZsZWN0YWJsZSBmaW5hbCBjbGFzc2VzID0gbmV3IE9ic2VydmFibGVMaXN0PENsYXNzPigpOwogICBAcmVmbGVjdGFibGUgZmluYWwgdmFyaWFibGVzID0gbmV3IE9ic2VydmFibGVMaXN0PFNlcnZpY2VNYXA+KCk7Ci0gIEByZWZsZWN0YWJsZSBmaW5hbCBmdW5jdGlvbnMgPSBuZXcgT2JzZXJ2YWJsZUxpc3Q8U2VydmljZU1hcD4oKTsKKyAgQHJlZmxlY3RhYmxlIGZpbmFsIGZ1bmN0aW9ucyA9IG5ldyBPYnNlcnZhYmxlTGlzdDxTZXJ2aWNlRnVuY3Rpb24+KCk7CiAKICAgYm9vbCBnZXQgY2FuQ2FjaGUgPT4gdHJ1ZTsKICAgYm9vbCBnZXQgaW1tdXRhYmxlID0+IGZhbHNlOwpAQCAtMTEzNiw3ICsxMTQxLDcgQEAKICAgQHJlZmxlY3RhYmxlIGZpbmFsIGNoaWxkcmVuID0gbmV3IE9ic2VydmFibGVMaXN0PENsYXNzPigpOwogICBAcmVmbGVjdGFibGUgZmluYWwgc3ViQ2xhc3NlcyA9IG5ldyBPYnNlcnZhYmxlTGlzdDxDbGFzcz4oKTsKICAgQHJlZmxlY3RhYmxlIGZpbmFsIGZpZWxkcyA9IG5ldyBPYnNlcnZhYmxlTGlzdDxTZXJ2aWNlTWFwPigpOwotICBAcmVmbGVjdGFibGUgZmluYWwgZnVuY3Rpb25zID0gbmV3IE9ic2VydmFibGVMaXN0PFNlcnZpY2VNYXA+KCk7CisgIEByZWZsZWN0YWJsZSBmaW5hbCBmdW5jdGlvbnMgPSBuZXcgT2JzZXJ2YWJsZUxpc3Q8U2VydmljZUZ1bmN0aW9uPigpOwogICBAcmVmbGVjdGFibGUgZmluYWwgaW50ZXJmYWNlcyA9IG5ldyBPYnNlcnZhYmxlTGlzdDxDbGFzcz4oKTsKIAogICBib29sIGdldCBjYW5DYWNoZSA9PiB0cnVlOwpAQCAtMTIxNyw2ICsxMjIyLDEwOSBAQAogICB9CiB9CiAKK2NsYXNzIEZ1bmN0aW9uS2luZCB7CisgIGZpbmFsIFN0cmluZyBfc3RyVmFsdWU7CisgIEZ1bmN0aW9uS2luZC5faW50ZXJuYWwodGhpcy5fc3RyVmFsdWUpOworICB0b1N0cmluZygpID0+IF9zdHJWYWx1ZTsKKyAgYm9vbCBpc0Zha2UoKSA9PiBba0NvbGxlY3RlZCwga05hdGl2ZSwga1RhZywga1JldXNlZF0uY29udGFpbnModGhpcyk7CisKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBmcm9tSlNPTihTdHJpbmcgdmFsdWUpIHsKKyAgICBzd2l0Y2godmFsdWUpIHsKKyAgICAgIGNhc2UgJ2tSZWd1bGFyRnVuY3Rpb24nOiByZXR1cm4ga1JlZ3VsYXJGdW5jdGlvbjsKKyAgICAgIGNhc2UgJ2tDbG9zdXJlRnVuY3Rpb24nOiByZXR1cm4ga0Nsb3N1cmVGdW5jdGlvbjsKKyAgICAgIGNhc2UgJ2tHZXR0ZXJGdW5jdGlvbic6IHJldHVybiBrR2V0dGVyRnVuY3Rpb247CisgICAgICBjYXNlICdrU2V0dGVyRnVuY3Rpb24nOiByZXR1cm4ga1NldHRlckZ1bmN0aW9uOworICAgICAgY2FzZSAna0NvbnN0cnVjdG9yJzogcmV0dXJuIGtDb25zdHJ1Y3RvcjsKKyAgICAgIGNhc2UgJ2tJbXBsaWNpdEdldHRlckZ1bmN0aW9uJzogcmV0dXJuIGtJbXBsaWNpdEdldHRlckZ1bmN0aW9uOworICAgICAgY2FzZSAna0ltcGxpY2l0U2V0dGVyRnVuY3Rpb24nOiByZXR1cm4ga0ltcGxpY2l0U2V0dGVyRnVuY3Rpb247CisgICAgICBjYXNlICdrU3RhdGljSW5pdGlhbGl6ZXInOiByZXR1cm4ga1N0YXRpY0luaXRpYWxpemVyOworICAgICAgY2FzZSAna01ldGhvZEV4dHJhY3Rvcic6IHJldHVybiBrTWV0aG9kRXh0cmFjdG9yOworICAgICAgY2FzZSAna05vU3VjaE1ldGhvZERpc3BhdGNoZXInOiByZXR1cm4ga05vU3VjaE1ldGhvZERpc3BhdGNoZXI7CisgICAgICBjYXNlICdrSW52b2tlRmllbGREaXNwYXRjaGVyJzogcmV0dXJuIGtJbnZva2VGaWVsZERpc3BhdGNoZXI7CisgICAgICBjYXNlICdDb2xsZWN0ZWQnOiByZXR1cm4ga0NvbGxlY3RlZDsKKyAgICAgIGNhc2UgJ05hdGl2ZSc6IHJldHVybiBrTmF0aXZlOworICAgICAgY2FzZSAnVGFnJzogcmV0dXJuIGtUYWc7CisgICAgICBjYXNlICdSZXVzZWQnOiByZXR1cm4ga1JldXNlZDsKKyAgICB9CisgICAgcmV0dXJuIGtVTktOT1dOOworICB9CisKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrUmVndWxhckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uS2luZC5faW50ZXJuYWwoJ2Z1bmN0aW9uJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga0Nsb3N1cmVGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdjbG9zdXJlIGZ1bmN0aW9uJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga0dldHRlckZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uS2luZC5faW50ZXJuYWwoJ2dldHRlciBmdW5jdGlvbicpOworICBzdGF0aWMgRnVuY3Rpb25LaW5kIGtTZXR0ZXJGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdzZXR0ZXIgZnVuY3Rpb24nKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrQ29uc3RydWN0b3IgPSBuZXcgRnVuY3Rpb25LaW5kLl9pbnRlcm5hbCgnY29uc3RydWN0b3InKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrSW1wbGljaXRHZXR0ZXJGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdpbXBsaWNpdCBnZXR0ZXIgZnVuY3Rpb24nKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrSW1wbGljaXRTZXR0ZXJGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdpbXBsaWNpdCBzZXR0ZXIgZnVuY3Rpb24nKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrU3RhdGljSW5pdGlhbGl6ZXIgPSBuZXcgRnVuY3Rpb25LaW5kLl9pbnRlcm5hbCgnc3RhdGljIGluaXRpYWxpemVyJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga01ldGhvZEV4dHJhY3RvciA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdtZXRob2QgZXh0cmFjdG9yJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga05vU3VjaE1ldGhvZERpc3BhdGNoZXIgPSBuZXcgRnVuY3Rpb25LaW5kLl9pbnRlcm5hbCgnbm9TdWNoTWV0aG9kIGRpc3BhdGNoZXInKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrSW52b2tlRmllbGREaXNwYXRjaGVyID0gbmV3IEZ1bmN0aW9uS2luZC5faW50ZXJuYWwoJ2ludm9rZSBmaWVsZCBkaXNwYXRjaGVyJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga0NvbGxlY3RlZCA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdDb2xsZWN0ZWQnKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrTmF0aXZlID0gbmV3IEZ1bmN0aW9uS2luZC5faW50ZXJuYWwoJ05hdGl2ZScpOworICBzdGF0aWMgRnVuY3Rpb25LaW5kIGtUYWcgPSBuZXcgRnVuY3Rpb25LaW5kLl9pbnRlcm5hbCgnVGFnJyk7CisgIHN0YXRpYyBGdW5jdGlvbktpbmQga1JldXNlZCA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdSZXVzZWQnKTsKKyAgc3RhdGljIEZ1bmN0aW9uS2luZCBrVU5LTk9XTiA9IG5ldyBGdW5jdGlvbktpbmQuX2ludGVybmFsKCdVTktOT1dOJyk7Cit9CisKK2NsYXNzIFNlcnZpY2VGdW5jdGlvbiBleHRlbmRzIFNlcnZpY2VPYmplY3QgeworICBAb2JzZXJ2YWJsZSBDbGFzcyBvd25pbmdDbGFzczsKKyAgQG9ic2VydmFibGUgTGlicmFyeSBvd25pbmdMaWJyYXJ5OworICBAb2JzZXJ2YWJsZSBib29sIGlzU3RhdGljOworICBAb2JzZXJ2YWJsZSBib29sIGlzQ29uc3Q7CisgIEBvYnNlcnZhYmxlIFNlcnZpY2VGdW5jdGlvbiBwYXJlbnQ7CisgIEBvYnNlcnZhYmxlIFNjcmlwdCBzY3JpcHQ7CisgIEBvYnNlcnZhYmxlIGludCB0b2tlblBvczsKKyAgQG9ic2VydmFibGUgaW50IGVuZFRva2VuUG9zOworICBAb2JzZXJ2YWJsZSBDb2RlIGNvZGU7CisgIEBvYnNlcnZhYmxlIENvZGUgdW5vcHRpbWl6ZWRDb2RlOworICBAb2JzZXJ2YWJsZSBib29sIGlzT3B0aW1pemFibGU7CisgIEBvYnNlcnZhYmxlIGJvb2wgaXNJbmxpbmFibGU7CisgIEBvYnNlcnZhYmxlIEZ1bmN0aW9uS2luZCBraW5kOworICBAb2JzZXJ2YWJsZSBpbnQgZGVvcHRpbWl6YXRpb25zOworICBAb2JzZXJ2YWJsZSBTdHJpbmcgcXVhbGlmaWVkTmFtZTsKKyAgQG9ic2VydmFibGUgaW50IHVzYWdlQ291bnRlcjsKKyAgQG9ic2VydmFibGUgYm9vbCBpc0RhcnQ7CisKKyAgU2VydmljZUZ1bmN0aW9uLl9lbXB0eShTZXJ2aWNlT2JqZWN0IG93bmVyKSA6IHN1cGVyLl9lbXB0eShvd25lcik7CisKKyAgdm9pZCBfdXBkYXRlKE9ic2VydmFibGVNYXAgbWFwLCBib29sIG1hcElzUmVmKSB7CisgICAgbmFtZSA9IG1hcFsndXNlcl9uYW1lJ107CisgICAgdm1OYW1lID0gbWFwWyduYW1lJ107CisKKyAgICBfdXBncmFkZUNvbGxlY3Rpb24obWFwLCBpc29sYXRlKTsKKworICAgIG93bmluZ0NsYXNzID0gbWFwLmNvbnRhaW5zS2V5KCdvd25pbmdDbGFzcycpID8gbWFwWydvd25pbmdDbGFzcyddIDogbnVsbDsKKyAgICBvd25pbmdMaWJyYXJ5ID0gbWFwLmNvbnRhaW5zS2V5KCdvd25pbmdMaWJyYXJ5JykgPyBtYXBbJ293bmluZ0xpYnJhcnknXSA6IG51bGw7CisgICAga2luZCA9IEZ1bmN0aW9uS2luZC5mcm9tSlNPTihtYXBbJ2tpbmQnXSk7CisgICAgaXNEYXJ0ID0gIWtpbmQuaXNGYWtlKCk7CisKKyAgICBpZiAobWFwSXNSZWYpIHsgcmV0dXJuOyB9CisKKyAgICBpc1N0YXRpYyA9IG1hcFsnaXNTdGF0aWMnXTsKKyAgICBpc0NvbnN0ID0gbWFwWydpc0NvbnN0J107CisgICAgcGFyZW50ID0gbWFwWydwYXJlbnQnXTsKKyAgICBzY3JpcHQgPSBtYXBbJ3NjcmlwdCddOworICAgIHRva2VuUG9zID0gbWFwWyd0b2tlblBvcyddOworICAgIGVuZFRva2VuUG9zID0gbWFwWydlbmRUb2tlblBvcyddOworICAgIGNvZGUgPSBtYXBbJ2NvZGUnXTsKKyAgICB1bm9wdGltaXplZENvZGUgPSBtYXBbJ3Vub3B0aW1pemVkX2NvZGUnXTsKKyAgICBpc09wdGltaXphYmxlID0gbWFwWydpc19vcHRpbWl6YWJsZSddOworICAgIGlzSW5saW5hYmxlID0gbWFwWydpc19pbmxpbmFibGUnXTsKKyAgICBkZW9wdGltaXphdGlvbnMgPSBtYXBbJ2Rlb3B0aW1pemF0aW9ucyddOworICAgIHVzYWdlQ291bnRlciA9IG1hcFsndXNhZ2VfY291bnRlciddOworCisgICAgaWYgKHBhcmVudCA9PSBudWxsKSB7CisgICAgICBxdWFsaWZpZWROYW1lID0gKG93bmluZ0NsYXNzICE9IG51bGwpID8KKyAgICAgICAgICAiJHtvd25pbmdDbGFzcy5uYW1lfS4ke25hbWV9IiA6CisgICAgICAgICAgbmFtZTsKKyAgICB9IGVsc2UgeworICAgICAgcXVhbGlmaWVkTmFtZSA9ICIke3BhcmVudC5xdWFsaWZpZWROYW1lfS4ke25hbWV9IjsKKyAgICB9CisKKyAgfQorfQorCiBjbGFzcyBTY3JpcHRMaW5lIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgIGZpbmFsIGludCBsaW5lOwogICBmaW5hbCBTdHJpbmcgdGV4dDsKQEAgLTEyNDUsMTEgKzEzNTMsMTEgQEAKIAogICAvLy8gVGhpcyBmdW5jdGlvbiBtYXBzIGEgdG9rZW4gcG9zaXRpb24gdG8gYSBsaW5lIG51bWJlci4KICAgaW50IHRva2VuVG9MaW5lKGludCB0b2tlbikgPT4gX3Rva2VuVG9MaW5lW3Rva2VuXTsKLSAgTWFwIF90b2tlblRvTGluZTsKKyAgTWFwIF90b2tlblRvTGluZSA9IHt9OwogCiAgIC8vLyBUaGlzIGZ1bmN0aW9uIG1hcHMgYSB0b2tlbiBwb3NpdGlvbiB0byBhIGNvbHVtbiBudW1iZXIuCiAgIGludCB0b2tlblRvQ29sKGludCB0b2tlbikgPT4gX3Rva2VuVG9Db2xbdG9rZW5dOwotICBNYXAgX3Rva2VuVG9Db2w7CisgIE1hcCBfdG9rZW5Ub0NvbCA9IHt9OwogCiAgIHZvaWQgX3VwZGF0ZShPYnNlcnZhYmxlTWFwIG1hcCwgYm9vbCBtYXBJc1JlZikgewogICAgIGtpbmQgPSBtYXBbJ2tpbmQnXTsKQEAgLTEyNjUsOCArMTM3Myw4IEBACiAgICAgaWYgKHRhYmxlID09IG51bGwpIHsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgX3Rva2VuVG9MaW5lID0ge307Ci0gICAgX3Rva2VuVG9Db2wgPSB7fTsKKyAgICBfdG9rZW5Ub0xpbmUuY2xlYXIoKTsKKyAgICBfdG9rZW5Ub0NvbC5jbGVhcigpOwogICAgIGZpcnN0VG9rZW5Qb3MgPSBudWxsOwogICAgIGxhc3RUb2tlblBvcyA9IG51bGw7CiAgICAgZm9yICh2YXIgbGluZSBpbiB0YWJsZSkgewpAQCAtMTU0MCw3ICsxNjQ4LDcgQEAKICAgQG9ic2VydmFibGUgU3RyaW5nIGZvcm1hdHRlZEluY2x1c2l2ZVRpY2tzID0gJyc7CiAgIEBvYnNlcnZhYmxlIFN0cmluZyBmb3JtYXR0ZWRFeGNsdXNpdmVUaWNrcyA9ICcnOwogICBAb2JzZXJ2YWJsZSBTZXJ2aWNlTWFwIG9iamVjdFBvb2w7Ci0gIEBvYnNlcnZhYmxlIFNlcnZpY2VNYXAgZnVuY3Rpb247CisgIEBvYnNlcnZhYmxlIFNlcnZpY2VGdW5jdGlvbiBmdW5jdGlvbjsKICAgQG9ic2VydmFibGUgU2NyaXB0IHNjcmlwdDsKICAgQG9ic2VydmFibGUgYm9vbCBpc09wdGltaXplZCA9IGZhbHNlOwogICBTdHJpbmcgbmFtZTsKQEAgLTE1ODMsMTAgKzE2OTEsMTAgQEAKICAgICBpZiAoZnVuY3Rpb24gPT0gbnVsbCkgewogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoZnVuY3Rpb25bJ3NjcmlwdCddID09IG51bGwpIHsKKyAgICBpZiAoZnVuY3Rpb24uc2NyaXB0ID09IG51bGwpIHsKICAgICAgIC8vIEF0dGVtcHQgdG8gbG9hZCB0aGUgZnVuY3Rpb24uCiAgICAgICBmdW5jdGlvbi5sb2FkKCkudGhlbigoZnVuYykgewotICAgICAgICB2YXIgc2NyaXB0ID0gZnVuY3Rpb25bJ3NjcmlwdCddOworICAgICAgICB2YXIgc2NyaXB0ID0gZnVuY3Rpb24uc2NyaXB0OwogICAgICAgICBpZiAoc2NyaXB0ID09IG51bGwpIHsKICAgICAgICAgICAvLyBGdW5jdGlvbiBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBzY3JpcHQuCiAgICAgICAgICAgcmV0dXJuOwpAQCAtMTU5Nyw3ICsxNzA1LDcgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8gTG9hZCB0aGUgc2NyaXB0IGFuZCB0aGVuIHVwZGF0ZSBkZXNjcmlwdG9ycy4KLSAgICBmdW5jdGlvblsnc2NyaXB0J10ubG9hZCgpLnRoZW4oX3VwZGF0ZURlc2NyaXB0b3JzKTsKKyAgICBmdW5jdGlvbi5zY3JpcHQubG9hZCgpLnRoZW4oX3VwZGF0ZURlc2NyaXB0b3JzKTsKICAgfQogCiAgIC8vLyBSZWxvYWQgW3RoaXNdLiBSZXR1cm5zIGEgZnV0dXJlIHdoaWNoIGNvbXBsZXRlcyB0byBbdGhpc10gb3IKZGlmZiAtLWdpdCBhL3J1bnRpbWUvbGliL2ludGVnZXJzLmNjIGIvcnVudGltZS9saWIvaW50ZWdlcnMuY2MKaW5kZXggYzE4OTNkMi4uZDQ2OGY1OCAxMDA2NDQKLS0tIGEvcnVudGltZS9saWIvaW50ZWdlcnMuY2MKKysrIGIvcnVudGltZS9saWIvaW50ZWdlcnMuY2MKQEAgLTI4MiwxMiArMjgyLDE2IEBACiAgIGlmICh2YWx1ZS5Jc01pbnQoKSkgewogICAgIGNvbnN0IGludDY0X3QgbWludF92YWx1ZSA9IHZhbHVlLkFzSW50NjRWYWx1ZSgpOwogICAgIGNvbnN0IGludCBjb3VudCA9IFV0aWxzOjpIaWdoZXN0Qml0KG1pbnRfdmFsdWUpOwotICAgIGlmICgoY291bnQgKyBhbW91bnQuVmFsdWUoKSkgPCBNaW50OjprQml0cykgeworICAgIGludHB0cl90IHNoaWZ0X2NvdW50ID0gYW1vdW50LlZhbHVlKCk7CisgICAgaWYgKGtpbmQgPT0gVG9rZW46OmtTSFIpIHsKKyAgICAgIHNoaWZ0X2NvdW50ID0gLXNoaWZ0X2NvdW50OworICAgIH0KKyAgICBpZiAoKGNvdW50ICsgc2hpZnRfY291bnQpIDwgTWludDo6a0JpdHMpIHsKICAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgICBjYXNlIFRva2VuOjprU0hMOgotICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobWludF92YWx1ZSA8PCBhbW91bnQuVmFsdWUoKSwgSGVhcDo6a05ldywgc2lsZW50KTsKKyAgICAgICAgICByZXR1cm4gSW50ZWdlcjo6TmV3KG1pbnRfdmFsdWUgPDwgc2hpZnRfY291bnQsIEhlYXA6OmtOZXcsIHNpbGVudCk7CiAgICAgICAgIGNhc2UgVG9rZW46OmtTSFI6Ci0gICAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhtaW50X3ZhbHVlID4+IGFtb3VudC5WYWx1ZSgpLCBIZWFwOjprTmV3LCBzaWxlbnQpOworICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobWludF92YWx1ZSA+PiAtc2hpZnRfY291bnQsIEhlYXA6OmtOZXcsIHNpbGVudCk7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgVU5JTVBMRU1FTlRFRCgpOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvcnVudGltZS9saWIvc3ltYm9sX3BhdGNoLmRhcnQgYi9ydW50aW1lL2xpYi9zeW1ib2xfcGF0Y2guZGFydAppbmRleCBiZTA5ZWFlLi4zNWEwZDg4IDEwMDY0NAotLS0gYS9ydW50aW1lL2xpYi9zeW1ib2xfcGF0Y2guZGFydAorKysgYi9ydW50aW1lL2xpYi9zeW1ib2xfcGF0Y2guZGFydApAQCAtMiw3ICsyLDExIEBACiAvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQogLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAoraW1wb3J0ICdkYXJ0Om1pcnJvcnMnOworCiBwYXRjaCBjbGFzcyBTeW1ib2wgewogICAvKiBwYXRjaCAqLyBjb25zdCBTeW1ib2woU3RyaW5nIG5hbWUpCiAgICAgICA6IHRoaXMuX25hbWUgPSBuYW1lOworCisgIC8qIHBhdGNoICovIHRvU3RyaW5nKCkgPT4gJ1N5bWJvbCgiJHtNaXJyb3JTeXN0ZW0uZ2V0TmFtZSh0aGlzKX0iKSc7CiB9CmRpZmYgLS1naXQgYS9ydW50aW1lL3BsYXRmb3JtL3V0aWxzLmNjIGIvcnVudGltZS9wbGF0Zm9ybS91dGlscy5jYwppbmRleCAwZGQyZWY0Li5mNDg4MjRiIDEwMDY0NAotLS0gYS9ydW50aW1lL3BsYXRmb3JtL3V0aWxzLmNjCisrKyBiL3J1bnRpbWUvcGxhdGZvcm0vdXRpbHMuY2MKQEAgLTM1LDEyICszNSwxNiBAQAogCiAKIGludCBVdGlsczo6SGlnaGVzdEJpdChpbnQ2NF90IHYpIHsKLSAgdWludDY0X3QgdCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PigodiA+IDApID8gdiA6IC12KTsKLSAgaW50IGNvdW50ID0gMDsKLSAgd2hpbGUgKCh0ID4+PSAxKSAhPSAwKSB7Ci0gICAgY291bnQrKzsKLSAgfQotICByZXR1cm4gY291bnQ7CisgIHVpbnQ2NF90IHggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oKHYgPiAwKSA/IHYgOiAtdik7CisgIHVpbnQ2NF90IHQ7CisgIGludCByID0gMDsKKyAgaWYgKCh0ID0geCA+PiAzMikgIT0gMCkgeyB4ID0gdDsgciArPSAzMjsgfQorICBpZiAoKHQgPSB4ID4+IDE2KSAhPSAwKSB7IHggPSB0OyByICs9IDE2OyB9CisgIGlmICgodCA9IHggPj4gOCkgIT0gMCkgeyB4ID0gdDsgciArPSA4OyB9CisgIGlmICgodCA9IHggPj4gNCkgIT0gMCkgeyB4ID0gdDsgciArPSA0OyB9CisgIGlmICgodCA9IHggPj4gMikgIT0gMCkgeyB4ID0gdDsgciArPSAyOyB9CisgIGlmICh4ID4gMSkgciArPSAxOworICByZXR1cm4gcjsKIH0KIAogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9hcm02NC5jYyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2FybTY0LmNjCmluZGV4IDg1ODEwNDkuLmQ1MmRkMWUgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2FybTY0LmNjCisrKyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2FybTY0LmNjCkBAIC0xMDc2LDE1ICsxMDc2LDI3IEBACiAKIAogdm9pZCBBc3NlbWJsZXI6OkxvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoUmVnaXN0ZXIgcmVzdWx0LCBSZWdpc3RlciBvYmplY3QpIHsKLSAgTGFiZWwgbG9hZCwgZG9uZTsKLSAgdHN0aShvYmplY3QsIGtTbWlUYWdNYXNrKTsKLSAgYigmbG9hZCwgTkUpOwotICBMb2FkSW1tZWRpYXRlKHJlc3VsdCwgU21pOjpSYXdWYWx1ZShrU21pQ2lkKSwgUFApOwotICBiKCZkb25lKTsKLSAgQmluZCgmbG9hZCk7Ci0gIExvYWRDbGFzc0lkKHJlc3VsdCwgb2JqZWN0LCBQUCk7CisgIEFTU0VSVChyZXN1bHQgIT0gVE1QKTsKKyAgQVNTRVJUKG9iamVjdCAhPSBUTVApOworCisgIC8vIE1ha2UgYSBjb3B5IG9mIG9iamVjdCBzaW5jZSByZXN1bHQgYW5kIG9iamVjdCBjYW4gYmUgdGhlIHNhbWUgcmVnaXN0ZXIuCisgIG1vdihUTVAsIG9iamVjdCk7CisgIC8vIExvYWQgdXAgYSBudWxsIG9iamVjdC4gV2Ugb25seSBuZWVkIGl0IHNvIHdlIGNhbiB1c2UgTG9hZENsYXNzSWQgb24gaXQgaW4KKyAgLy8gdGhlIGNhc2UgdGhhdCBvYmplY3QgaXMgYSBTbWkuLgorICBMb2FkT2JqZWN0KHJlc3VsdCwgT2JqZWN0OjpudWxsX29iamVjdCgpLCBQUCk7CisgIC8vIENoZWNrIGlmIHRoZSBvYmplY3QgaXMgYSBTbWkuCisgIHRzdGkoVE1QLCBrU21pVGFnTWFzayk7CisgIC8vIElmIHRoZSBvYmplY3QgKmlzKiBhIFNtaSwgbG9hZCB0aGUgbnVsbCBvYmplY3QgaW50byB0bXAuIG8vdyBsZWF2ZSBhbG9uZS4KKyAgY3NlbChUTVAsIHJlc3VsdCwgVE1QLCBFUSk7CisgIC8vIExvYWRzIGVpdGhlciB0aGUgY2lkIG9mIHRoZSBvYmplY3QgaWYgaXQgaXNuJ3QgYSBTbWksIG9yIHRoZSBjaWQgb2YgbnVsbAorICAvLyBpZiBpdCBpcyBhIFNtaSwgd2hpY2ggd2lsbCBiZSBpZ25vcmVkLgorICBMb2FkQ2xhc3NJZChyZXN1bHQsIFRNUCwgUFApOworCisgIExvYWRJbW1lZGlhdGUoVE1QLCBrU21pQ2lkLCBQUCk7CisgIC8vIElmIG9iamVjdCBpcyBhIFNtaSwgbW92ZSB0aGUgU21pIGNpZCBpbnRvIHJlc3VsdC4gby93IGxlYXZlIGFsb25lLgorICBjc2VsKHJlc3VsdCwgVE1QLCByZXN1bHQsIEVRKTsKKyAgLy8gRmluYWxseSwgdGFnIHRoZSByZXN1bHQuCiAgIFNtaVRhZyhyZXN1bHQpOwotICBCaW5kKCZkb25lKTsKIH0KIAogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9pYTMyLmNjIGIvcnVudGltZS92bS9hc3NlbWJsZXJfaWEzMi5jYwppbmRleCBjNWUxM2ZjLi44ZTljYTI4IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9pYTMyLmNjCisrKyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2lhMzIuY2MKQEAgLTI3Myw2ICsyNzMsMjMgQEAKIH0KIAogCisvLyBNb3ZlIGlmIG5vdCBvdmVyZmxvdy4KK3ZvaWQgQXNzZW1ibGVyOjpjbW92bm8oUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMpIHsKKyAgQXNzZW1ibGVyQnVmZmVyOjpFbnN1cmVDYXBhY2l0eSBlbnN1cmVkKCZidWZmZXJfKTsKKyAgRW1pdFVpbnQ4KDB4MEYpOworICBFbWl0VWludDgoMHg0MSk7CisgIEVtaXRSZWdpc3Rlck9wZXJhbmQoZHN0LCBzcmMpOworfQorCisKK3ZvaWQgQXNzZW1ibGVyOjpjbW92ZShSZWdpc3RlciBkc3QsIFJlZ2lzdGVyIHNyYykgeworICBBc3NlbWJsZXJCdWZmZXI6OkVuc3VyZUNhcGFjaXR5IGVuc3VyZWQoJmJ1ZmZlcl8pOworICBFbWl0VWludDgoMHgwRik7CisgIEVtaXRVaW50OCgweDQ0KTsKKyAgRW1pdFJlZ2lzdGVyT3BlcmFuZChkc3QsIHNyYyk7Cit9CisKKwogdm9pZCBBc3NlbWJsZXI6OmNtb3ZzKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKSB7CiAgIEFzc2VtYmxlckJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkgZW5zdXJlZCgmYnVmZmVyXyk7CiAgIEVtaXRVaW50OCgweDBGKTsKQEAgLTE3MjEsNiArMTczOCwxNiBAQAogfQogCiAKK3ZvaWQgQXNzZW1ibGVyOjpzaGxkKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjLCBjb25zdCBJbW1lZGlhdGUmIGltbSkgeworICBBc3NlbWJsZXJCdWZmZXI6OkVuc3VyZUNhcGFjaXR5IGVuc3VyZWQoJmJ1ZmZlcl8pOworICBBU1NFUlQoaW1tLmlzX2ludDgoKSk7CisgIEVtaXRVaW50OCgweDBGKTsKKyAgRW1pdFVpbnQ4KDB4QTQpOworICBFbWl0UmVnaXN0ZXJPcGVyYW5kKHNyYywgZHN0KTsKKyAgRW1pdFVpbnQ4KGltbS52YWx1ZSgpICYgMHhGRik7Cit9CisKKwogdm9pZCBBc3NlbWJsZXI6OnNobGQoY29uc3QgQWRkcmVzcyYgb3BlcmFuZCwgUmVnaXN0ZXIgc3JjKSB7CiAgIEFzc2VtYmxlckJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkgZW5zdXJlZCgmYnVmZmVyXyk7CiAgIEVtaXRVaW50OCgweDBGKTsKQEAgLTE3MjgsNiArMTc1NSw3IEBACiAgIEVtaXRPcGVyYW5kKHNyYywgT3BlcmFuZChvcGVyYW5kKSk7CiB9CiAKKwogdm9pZCBBc3NlbWJsZXI6OnNocmQoUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMpIHsKICAgQXNzZW1ibGVyQnVmZmVyOjpFbnN1cmVDYXBhY2l0eSBlbnN1cmVkKCZidWZmZXJfKTsKICAgRW1pdFVpbnQ4KDB4MEYpOwpAQCAtMTczNiw2ICsxNzY0LDE2IEBACiB9CiAKIAordm9pZCBBc3NlbWJsZXI6OnNocmQoUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMsIGNvbnN0IEltbWVkaWF0ZSYgaW1tKSB7CisgIEFzc2VtYmxlckJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkgZW5zdXJlZCgmYnVmZmVyXyk7CisgIEFTU0VSVChpbW0uaXNfaW50OCgpKTsKKyAgRW1pdFVpbnQ4KDB4MEYpOworICBFbWl0VWludDgoMHhBQyk7CisgIEVtaXRSZWdpc3Rlck9wZXJhbmQoc3JjLCBkc3QpOworICBFbWl0VWludDgoaW1tLnZhbHVlKCkgJiAweEZGKTsKK30KKworCiB2b2lkIEFzc2VtYmxlcjo6c2hyZChjb25zdCBBZGRyZXNzJiBkc3QsIFJlZ2lzdGVyIHNyYykgewogICBBc3NlbWJsZXJCdWZmZXI6OkVuc3VyZUNhcGFjaXR5IGVuc3VyZWQoJmJ1ZmZlcl8pOwogICBFbWl0VWludDgoMHgwRik7CkBAIC0yNjU4LDE2ICsyNjk2LDI5IEBACiB9CiAKIAotdm9pZCBBc3NlbWJsZXI6OkxvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoUmVnaXN0ZXIgcmVzdWx0LCBSZWdpc3RlciBvYmplY3QpIHsKLSAgdGVzdGwob2JqZWN0LCBJbW1lZGlhdGUoa1NtaVRhZ01hc2spKTsKLSAgTGFiZWwgbm90X3NtaSwgZG9uZTsKLSAgaihOT1RfWkVSTywgJm5vdF9zbWksIEFzc2VtYmxlcjo6a05lYXJKdW1wKTsKLSAgbW92bChyZXN1bHQsIEltbWVkaWF0ZShTbWk6OlJhd1ZhbHVlKGtTbWlDaWQpKSk7Ci0gIGptcCgmZG9uZSwgQXNzZW1ibGVyOjprTmVhckp1bXApOwotICBCaW5kKCZub3Rfc21pKTsKLSAgTG9hZENsYXNzSWQocmVzdWx0LCBvYmplY3QpOwordm9pZCBBc3NlbWJsZXI6OkxvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoCisgICAgUmVnaXN0ZXIgcmVzdWx0LCBSZWdpc3RlciBvYmplY3QsIFJlZ2lzdGVyIHRtcCkgeworICBBU1NFUlQob2JqZWN0ICE9IHRtcCk7CisgIEFTU0VSVChyZXN1bHQgIT0gdG1wKTsKKworICAvLyBNYWtlIGEgY29weSBvZiBvYmplY3Qgc2luY2UgcmVzdWx0IGFuZCBvYmplY3QgY2FuIGJlIHRoZSBzYW1lIHJlZ2lzdGVyLgorICBtb3ZsKHRtcCwgb2JqZWN0KTsKKyAgLy8gTG9hZCB1cCBhIG51bGwgb2JqZWN0LiBXZSBvbmx5IG5lZWQgaXQgc28gd2UgY2FuIHVzZSBMb2FkQ2xhc3NJZCBvbiBpdCBpbgorICAvLyB0aGUgY2FzZSB0aGF0IG9iamVjdCBpcyBhIFNtaS4KKyAgbW92bChyZXN1bHQsIEltbWVkaWF0ZShyZWludGVycHJldF9jYXN0PGludHB0cl90PihPYmplY3Q6Om51bGwoKSkpKTsKKyAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhIFNtaS4KKyAgdGVzdGwodG1wLCBJbW1lZGlhdGUoa1NtaVRhZ01hc2spKTsKKyAgLy8gSWYgdGhlIG9iamVjdCAqaXMqIGEgU21pLCBsb2FkIHRoZSBudWxsIG9iamVjdCBpbnRvIHRtcC4gby93IGxlYXZlIGFsb25lLgorICBjbW92ZSh0bXAsIHJlc3VsdCk7CisgIC8vIExvYWRzIGVpdGhlciB0aGUgY2lkIG9mIHRoZSBvYmplY3QgaWYgaXQgaXNuJ3QgYSBTbWksIG9yIHRoZSBjaWQgb2YgbnVsbAorICAvLyBpZiBpdCBpcyBhIFNtaSwgd2hpY2ggd2lsbCBiZSBpZ25vcmVkLgorICBMb2FkQ2xhc3NJZChyZXN1bHQsIHRtcCk7CisKKyAgbW92bCh0bXAsIEltbWVkaWF0ZShrU21pQ2lkKSk7CisgIC8vIElmIG9iamVjdCBpcyBhIFNtaSwgbW92ZSB0aGUgU21pIGNpZCBpbnRvIHJlc3VsdC4gby93IGxlYXZlIGFsb25lLgorICBjbW92ZShyZXN1bHQsIHRtcCk7CisgIC8vIEZpbmFsbHksIHRhZyB0aGUgcmVzdWx0LgogICBTbWlUYWcocmVzdWx0KTsKLSAgQmluZCgmZG9uZSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9hc3NlbWJsZXJfaWEzMi5oIGIvcnVudGltZS92bS9hc3NlbWJsZXJfaWEzMi5oCmluZGV4IDY2ODhlY2EuLjQyMjgxYjEgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2lhMzIuaAorKysgYi9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9pYTMyLmgKQEAgLTM0OCw2ICszNDgsOCBAQAogCiAgIHZvaWQgbGVhbChSZWdpc3RlciBkc3QsIGNvbnN0IEFkZHJlc3MmIHNyYyk7CiAKKyAgdm9pZCBjbW92bm8oUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMpOworICB2b2lkIGNtb3ZlKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKTsKICAgdm9pZCBjbW92cyhSZWdpc3RlciBkc3QsIFJlZ2lzdGVyIHNyYyk7CiAgIHZvaWQgY21vdm5zKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKTsKIApAQCAtNTg0LDggKzU4NiwxMCBAQAogICB2b2lkIHNhcmwoUmVnaXN0ZXIgb3BlcmFuZCwgUmVnaXN0ZXIgc2hpZnRlcik7CiAgIHZvaWQgc2FybChjb25zdCBBZGRyZXNzJiBhZGRyZXNzLCBSZWdpc3RlciBzaGlmdGVyKTsKICAgdm9pZCBzaGxkKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKTsKKyAgdm9pZCBzaGxkKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjLCBjb25zdCBJbW1lZGlhdGUmIGltbSk7CiAgIHZvaWQgc2hsZChjb25zdCBBZGRyZXNzJiBvcGVyYW5kLCBSZWdpc3RlciBzcmMpOwogICB2b2lkIHNocmQoUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMpOworICB2b2lkIHNocmQoUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMsIGNvbnN0IEltbWVkaWF0ZSYgaW1tKTsKICAgdm9pZCBzaHJkKGNvbnN0IEFkZHJlc3MmIGRzdCwgUmVnaXN0ZXIgc3JjKTsKIAogICB2b2lkIG5lZ2woUmVnaXN0ZXIgcmVnKTsKQEAgLTY4Niw3ICs2OTAsOSBAQAogCiAgIHZvaWQgQ29tcGFyZUNsYXNzSWQoUmVnaXN0ZXIgb2JqZWN0LCBpbnRwdHJfdCBjbGFzc19pZCwgUmVnaXN0ZXIgc2NyYXRjaCk7CiAKLSAgdm9pZCBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKFJlZ2lzdGVyIHJlc3VsdCwgUmVnaXN0ZXIgb2JqZWN0KTsKKyAgdm9pZCBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKFJlZ2lzdGVyIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIHRtcCk7CiAKICAgLyoKICAgICogTWlzYy4gZnVuY3Rpb25hbGl0eQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9hc3NlbWJsZXJfaWEzMl90ZXN0LmNjIGIvcnVudGltZS92bS9hc3NlbWJsZXJfaWEzMl90ZXN0LmNjCmluZGV4IDUyN2VhODIuLjA5OWJkOTMgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX2lhMzJfdGVzdC5jYworKysgYi9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9pYTMyX3Rlc3QuY2MKQEAgLTU1Myw2ICs1NTMsMjcgQEAKICAgX18gQmluZCgmZG9uZXRlc3QxNSk7CiAgIF9fIGFkZGwoRVNQLCBJbW1lZGlhdGUoa1dvcmRTaXplKSk7CiAKKyAgTGFiZWwgZG9uZXRlc3QxNjsKKyAgX18gbW92bChFRFgsIEltbWVkaWF0ZSgweDgwMDAwMDAwKSk7CisgIF9fIG1vdmwoRUFYLCBJbW1lZGlhdGUoMCkpOworICBfXyBtb3ZsKEVDWCwgSW1tZWRpYXRlKDMpKTsKKyAgX18gc2FybChFRFgsIEltbWVkaWF0ZSgzKSk7CisgIF9fIHNocmQoRURYLCBFQVgsIEltbWVkaWF0ZSgzKSk7CisgIF9fIGNtcGwoRURYLCBJbW1lZGlhdGUoMHgxZTAwMDAwMCkpOworICBfXyBqKEVRVUFMLCAmZG9uZXRlc3QxNik7CisgIF9fIGludDMoKTsKKyAgX18gQmluZCgmZG9uZXRlc3QxNik7CisKKyAgTGFiZWwgZG9uZXRlc3QxNzsKKyAgX18gbW92bChFRFgsIEltbWVkaWF0ZSgweEZGMDAwMDAwKSk7CisgIF9fIG1vdmwoRUFYLCBJbW1lZGlhdGUoLTEpKTsKKyAgX18gc2hsbChFRFgsIEltbWVkaWF0ZSgyKSk7CisgIF9fIHNobGQoRURYLCBFQVgsIEltbWVkaWF0ZSgyKSk7CisgIF9fIGNtcGwoRURYLCBJbW1lZGlhdGUoMHhGMDAwMDAwMykpOworICBfXyBqKEVRVUFMLCAmZG9uZXRlc3QxNyk7CisgIF9fIGludDMoKTsKKyAgX18gQmluZCgmZG9uZXRlc3QxNyk7CisKICAgX18gbW92bChFQVgsIEltbWVkaWF0ZSgwKSk7CiAgIF9fIHJldCgpOwogfQpAQCAtMzAxOSw2ICszMDQwLDQ3IEBACiB9CiAKIAorLy8gUmV0dXJuIDEgaWYgb3ZlcmZsb3csIDAgaWYgbm8gb3ZlcmZsb3cuCitBU1NFTUJMRVJfVEVTVF9HRU5FUkFURShDb25kaXRpb25hbE1vdmVzTm9PdmVyZmxvdywgYXNzZW1ibGVyKSB7CisgIF9fIG1vdmwoRURYLCBBZGRyZXNzKEVTUCwgMSAqIGtXb3JkU2l6ZSkpOworICBfXyBhZGRsKEVEWCwgQWRkcmVzcyhFU1AsIDIgKiBrV29yZFNpemUpKTsKKyAgX18gbW92bChFQVgsIEltbWVkaWF0ZSgxKSk7CisgIF9fIG1vdmwoRUNYLCBJbW1lZGlhdGUoMCkpOworICBfXyBjbW92bm8oRUFYLCBFQ1gpOworICBfXyByZXQoKTsKK30KKworCitBU1NFTUJMRVJfVEVTVF9SVU4oQ29uZGl0aW9uYWxNb3Zlc05vT3ZlcmZsb3csIHRlc3QpIHsKKyAgdHlwZWRlZiBpbnQgKCpDb25kaXRpb25hbE1vdmVzTm9PdmVyZmxvd0NvZGUpKGludCBpLCBpbnQgaik7CisgIGludCByZXMgPSByZWludGVycHJldF9jYXN0PENvbmRpdGlvbmFsTW92ZXNOb092ZXJmbG93Q29kZT4oCisgICAgICB0ZXN0LT5lbnRyeSgpKSgweDdmZmZmZmZmLCAyKTsKKyAgRVhQRUNUX0VRKDEsIHJlcyk7CisgIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29uZGl0aW9uYWxNb3Zlc05vT3ZlcmZsb3dDb2RlPih0ZXN0LT5lbnRyeSgpKSgxLCAxKTsKKyAgRVhQRUNUX0VRKDAsIHJlcyk7Cit9CisKKworLy8gUmV0dXJuIDEgaWYgZXF1YWwsIDAgaWYgbm90IGVxdWFsLgorQVNTRU1CTEVSX1RFU1RfR0VORVJBVEUoQ29uZGl0aW9uYWxNb3Zlc0VxdWFsLCBhc3NlbWJsZXIpIHsKKyAgX18geG9ybChFQVgsIEVBWCk7CisgIF9fIG1vdmwoRUNYLCBJbW1lZGlhdGUoMSkpOworICBfXyBtb3ZsKEVEWCwgQWRkcmVzcyhFU1AsIDEgKiBrV29yZFNpemUpKTsKKyAgX18gY21wbChFRFgsIEltbWVkaWF0ZSg3ODUpKTsKKyAgX18gY21vdmUoRUFYLCBFQ1gpOworICBfXyByZXQoKTsKK30KKworCitBU1NFTUJMRVJfVEVTVF9SVU4oQ29uZGl0aW9uYWxNb3Zlc0VxdWFsLCB0ZXN0KSB7CisgIHR5cGVkZWYgaW50ICgqQ29uZGl0aW9uYWxNb3Zlc1NpZ25Db2RlKShpbnQgaSk7CisgIGludCByZXMgPSByZWludGVycHJldF9jYXN0PENvbmRpdGlvbmFsTW92ZXNTaWduQ29kZT4odGVzdC0+ZW50cnkoKSkoNzg1KTsKKyAgRVhQRUNUX0VRKDEsIHJlcyk7CisgIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29uZGl0aW9uYWxNb3Zlc1NpZ25Db2RlPih0ZXN0LT5lbnRyeSgpKSgtMTIpOworICBFWFBFQ1RfRVEoMCwgcmVzKTsKK30KKworCiBBU1NFTUJMRVJfVEVTVF9HRU5FUkFURShDb25kaXRpb25hbE1vdmVzQ29tcGFyZSwgYXNzZW1ibGVyKSB7CiAgIF9fIG1vdmwoRURYLCBJbW1lZGlhdGUoMSkpOyAgLy8gR3JlYXRlciBlcXVhbC4KICAgX18gbW92bChFQ1gsIEltbWVkaWF0ZSgtMSkpOyAgLy8gTGVzcwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9hc3NlbWJsZXJfbWlwcy5jYyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX21pcHMuY2MKaW5kZXggYzZiY2Q4OS4uMzMyODJkOCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9hc3NlbWJsZXJfbWlwcy5jYworKysgYi9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9taXBzLmNjCkBAIC02OTIsMTUgKzY5MiwyNyBAQAogCiAKIHZvaWQgQXNzZW1ibGVyOjpMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKFJlZ2lzdGVyIHJlc3VsdCwgUmVnaXN0ZXIgb2JqZWN0KSB7Ci0gIExhYmVsIGxvYWQsIGRvbmU7Ci0gIGFuZGkoQ01QUkVTMSwgb2JqZWN0LCBJbW1lZGlhdGUoa1NtaVRhZ01hc2spKTsKLSAgYm5lKENNUFJFUzEsIFpSLCAmbG9hZCk7Ci0gIExvYWRJbW1lZGlhdGUocmVzdWx0LCBTbWk6OlJhd1ZhbHVlKGtTbWlDaWQpKTsKLSAgYigmZG9uZSk7Ci0gIEJpbmQoJmxvYWQpOwotICBMb2FkQ2xhc3NJZChyZXN1bHQsIG9iamVjdCk7CisgIEFTU0VSVChvYmplY3QgIT0gVE1QKTsKKyAgQVNTRVJUKHJlc3VsdCAhPSBUTVApOworCisgIC8vIE1ha2UgYSBjb3B5IG9mIG9iamVjdCBzaW5jZSByZXN1bHQgYW5kIG9iamVjdCBjYW4gYmUgdGhlIHNhbWUgcmVnaXN0ZXIuCisgIG1vdihUTVAsIG9iamVjdCk7CisgIC8vIExvYWQgdXAgYSBudWxsIG9iamVjdC4gV2Ugb25seSBuZWVkIGl0IHNvIHdlIGNhbiB1c2UgTG9hZENsYXNzSWQgb24gaXQgaW4KKyAgLy8gdGhlIGNhc2UgdGhhdCBvYmplY3QgaXMgYSBTbWkuCisgIExvYWRJbW1lZGlhdGUocmVzdWx0LCByZWludGVycHJldF9jYXN0PGludHB0cl90PihPYmplY3Q6Om51bGwoKSkpOworICAvLyBDaGVjayBpZiB0aGUgb2JqZWN0IGlzIGEgU21pLgorICBhbmRpKENNUFJFUzEsIFRNUCwgSW1tZWRpYXRlKGtTbWlUYWdNYXNrKSk7CisgIC8vIElmIHRoZSBvYmplY3QgKmlzKiBhIFNtaSwgbG9hZCB0aGUgbnVsbCBvYmplY3QgaW50byB0bXAuIG8vdyBsZWF2ZSBhbG9uZS4KKyAgbW92eihUTVAsIHJlc3VsdCwgQ01QUkVTMSk7CisgIC8vIExvYWRzIGVpdGhlciB0aGUgY2lkIG9mIHRoZSBvYmplY3QgaWYgaXQgaXNuJ3QgYSBTbWksIG9yIHRoZSBjaWQgb2YgbnVsbAorICAvLyBpZiBpdCBpcyBhIFNtaSwgd2hpY2ggd2lsbCBiZSBpZ25vcmVkLgorICBMb2FkQ2xhc3NJZChyZXN1bHQsIFRNUCk7CisKKyAgTG9hZEltbWVkaWF0ZShUTVAsIGtTbWlDaWQpOworICAvLyBJZiBvYmplY3QgaXMgYSBTbWksIG1vdmUgdGhlIFNtaSBjaWQgaW50byByZXN1bHQuIG8vdyBsZWF2ZSBhbG9uZS4KKyAgbW92eihyZXN1bHQsIFRNUCwgQ01QUkVTMSk7CisgIC8vIEZpbmFsbHksIHRhZyB0aGUgcmVzdWx0LgogICBTbWlUYWcocmVzdWx0KTsKLSAgQmluZCgmZG9uZSk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9hc3NlbWJsZXJfbWlwcy5oIGIvcnVudGltZS92bS9hc3NlbWJsZXJfbWlwcy5oCmluZGV4IDE0Mzk0NTUuLjJmN2MzOGYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX21pcHMuaAorKysgYi9ydW50aW1lL3ZtL2Fzc2VtYmxlcl9taXBzLmgKQEAgLTYwMyw2ICs2MDMsNyBAQAogICAgIEVtaXRSVHlwZShTUEVDSUFMLCBycywgUjEsIHJkLCAwLCBNT1ZDSSk7CiAgIH0KIAorICAvLyByZCA8LSAocnQgPT0gMCkgPyBycyA6IHJkOwogICB2b2lkIG1vdnooUmVnaXN0ZXIgcmQsIFJlZ2lzdGVyIHJzLCBSZWdpc3RlciBydCkgewogICAgIEVtaXRSVHlwZShTUEVDSUFMLCBycywgcnQsIHJkLCAwLCBNT1ZaKTsKICAgfQpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9hc3NlbWJsZXJfeDY0LmNjIGIvcnVudGltZS92bS9hc3NlbWJsZXJfeDY0LmNjCmluZGV4IDE2MWY0ZjYuLjEyMjJmZTQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NC5jYworKysgYi9ydW50aW1lL3ZtL2Fzc2VtYmxlcl94NjQuY2MKQEAgLTQ1NCw2ICs0NTQsMjYgQEAKIH0KIAogCit2b2lkIEFzc2VtYmxlcjo6Y21vdm5vcShSZWdpc3RlciBkc3QsIFJlZ2lzdGVyIHNyYykgeworICBBc3NlbWJsZXJCdWZmZXI6OkVuc3VyZUNhcGFjaXR5IGVuc3VyZWQoJmJ1ZmZlcl8pOworICBPcGVyYW5kIG9wZXJhbmQoc3JjKTsKKyAgRW1pdE9wZXJhbmRSRVgoZHN0LCBvcGVyYW5kLCBSRVhfVyk7CisgIEVtaXRVaW50OCgweDBGKTsKKyAgRW1pdFVpbnQ4KDB4NDEpOworICBFbWl0T3BlcmFuZChkc3QgJiA3LCBvcGVyYW5kKTsKK30KKworCit2b2lkIEFzc2VtYmxlcjo6Y21vdmVxKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKSB7CisgIEFzc2VtYmxlckJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkgZW5zdXJlZCgmYnVmZmVyXyk7CisgIE9wZXJhbmQgb3BlcmFuZChzcmMpOworICBFbWl0T3BlcmFuZFJFWChkc3QsIG9wZXJhbmQsIFJFWF9XKTsKKyAgRW1pdFVpbnQ4KDB4MEYpOworICBFbWl0VWludDgoMHg0NCk7CisgIEVtaXRPcGVyYW5kKGRzdCAmIDcsIG9wZXJhbmQpOworfQorCisKIHZvaWQgQXNzZW1ibGVyOjpjbW92Z2VxKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKSB7CiAgIEFzc2VtYmxlckJ1ZmZlcjo6RW5zdXJlQ2FwYWNpdHkgZW5zdXJlZCgmYnVmZmVyXyk7CiAgIE9wZXJhbmQgb3BlcmFuZChzcmMpOwpAQCAtMzMzMiwxNSArMzM1MiwyNyBAQAogCiAKIHZvaWQgQXNzZW1ibGVyOjpMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKFJlZ2lzdGVyIHJlc3VsdCwgUmVnaXN0ZXIgb2JqZWN0KSB7Ci0gIExhYmVsIGxvYWQsIGRvbmU7Ci0gIHRlc3RxKG9iamVjdCwgSW1tZWRpYXRlKGtTbWlUYWdNYXNrKSk7Ci0gIGooTk9UX1pFUk8sICZsb2FkLCBBc3NlbWJsZXI6OmtOZWFySnVtcCk7Ci0gIExvYWRJbW1lZGlhdGUocmVzdWx0LCBJbW1lZGlhdGUoU21pOjpSYXdWYWx1ZShrU21pQ2lkKSksIFBQKTsKLSAgam1wKCZkb25lKTsKLSAgQmluZCgmbG9hZCk7Ci0gIExvYWRDbGFzc0lkKHJlc3VsdCwgb2JqZWN0KTsKKyAgQVNTRVJUKG9iamVjdCAhPSBUTVApOworICBBU1NFUlQocmVzdWx0ICE9IFRNUCk7CisKKyAgLy8gTWFrZSBhIGNvcHkgb2Ygb2JqZWN0IHNpbmNlIHJlc3VsdCBhbmQgb2JqZWN0IGNhbiBiZSB0aGUgc2FtZSByZWdpc3Rlci4KKyAgbW92cShUTVAsIG9iamVjdCk7CisgIC8vIExvYWQgdXAgYSBudWxsIG9iamVjdC4gV2Ugb25seSBuZWVkIGl0IHNvIHdlIGNhbiB1c2UgTG9hZENsYXNzSWQgb24gaXQgaW4KKyAgLy8gdGhlIGNhc2UgdGhhdCBvYmplY3QgaXMgYSBTbWkuCisgIExvYWRPYmplY3QocmVzdWx0LCBPYmplY3Q6Om51bGxfb2JqZWN0KCksIFBQKTsKKyAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBpcyBhIFNtaS4KKyAgdGVzdHEoVE1QLCBJbW1lZGlhdGUoa1NtaVRhZ01hc2spKTsKKyAgLy8gSWYgdGhlIG9iamVjdCAqaXMqIGEgU21pLCBsb2FkIHRoZSBudWxsIG9iamVjdCBpbnRvIHRtcC4gby93IGxlYXZlIGFsb25lLgorICBjbW92ZXEoVE1QLCByZXN1bHQpOworICAvLyBMb2FkcyBlaXRoZXIgdGhlIGNpZCBvZiB0aGUgb2JqZWN0IGlmIGl0IGlzbid0IGEgU21pLCBvciB0aGUgY2lkIG9mIG51bGwKKyAgLy8gaWYgaXQgaXMgYSBTbWksIHdoaWNoIHdpbGwgYmUgaWdub3JlZC4KKyAgTG9hZENsYXNzSWQocmVzdWx0LCBUTVApOworCisgIG1vdnEoVE1QLCBJbW1lZGlhdGUoa1NtaUNpZCkpOworICAvLyBJZiBvYmplY3QgaXMgYSBTbWksIG1vdmUgdGhlIFNtaSBjaWQgaW50byByZXN1bHQuIG8vdyBsZWF2ZSBhbG9uZS4KKyAgY21vdmVxKHJlc3VsdCwgVE1QKTsKKyAgLy8gRmluYWxseSwgdGFnIHRoZSByZXN1bHQuCiAgIFNtaVRhZyhyZXN1bHQpOwotICBCaW5kKCZkb25lKTsKIH0KIAogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2Fzc2VtYmxlcl94NjQuaCBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NC5oCmluZGV4IDJmZGM4ODMuLjBmMjkxODYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NC5oCisrKyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NC5oCkBAIC0zODAsNiArMzgwLDggQEAKIAogICB2b2lkIGxlYXEoUmVnaXN0ZXIgZHN0LCBjb25zdCBBZGRyZXNzJiBzcmMpOwogCisgIHZvaWQgY21vdm5vcShSZWdpc3RlciBkc3QsIFJlZ2lzdGVyIHNyYyk7CisgIHZvaWQgY21vdmVxKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKTsKICAgdm9pZCBjbW92Z2VxKFJlZ2lzdGVyIGRzdCwgUmVnaXN0ZXIgc3JjKTsKICAgdm9pZCBjbW92bGVzc3EoUmVnaXN0ZXIgZHN0LCBSZWdpc3RlciBzcmMpOwogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2Fzc2VtYmxlcl94NjRfdGVzdC5jYyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NF90ZXN0LmNjCmluZGV4IDM0MTE5NmEuLmFhYzMwZGIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NF90ZXN0LmNjCisrKyBiL3J1bnRpbWUvdm0vYXNzZW1ibGVyX3g2NF90ZXN0LmNjCkBAIC0yOTQ5LDYgKzI5NDksNDcgQEAKICAgRVhQRUNUX0VRKC0xLCByZXMpOyAgLy8gTGVzcy4KIH0KIAorCisvLyBSZXR1cm4gMSBpZiBlcXVhbCwgMCBpZiBub3QgZXF1YWwuCitBU1NFTUJMRVJfVEVTVF9HRU5FUkFURShDb25kaXRpb25hbE1vdmVzRXF1YWwsIGFzc2VtYmxlcikgeworICBfXyBtb3ZxKFJEWCwgQ2FsbGluZ0NvbnZlbnRpb25zOjprQXJnMVJlZyk7CisgIF9fIHhvcnEoUkFYLCBSQVgpOworICBfXyBtb3ZxKFJDWCwgSW1tZWRpYXRlKDEpKTsKKyAgX18gY21wcShSRFgsIEltbWVkaWF0ZSg3ODUpKTsKKyAgX18gY21vdmVxKFJBWCwgUkNYKTsKKyAgX18gcmV0KCk7Cit9CisKKworQVNTRU1CTEVSX1RFU1RfUlVOKENvbmRpdGlvbmFsTW92ZXNFcXVhbCwgdGVzdCkgeworICB0eXBlZGVmIGludCAoKkNvbmRpdGlvbmFsTW92ZXNFcXVhbENvZGUpKGludCBpKTsKKyAgaW50IHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29uZGl0aW9uYWxNb3Zlc0VxdWFsQ29kZT4odGVzdC0+ZW50cnkoKSkoNzg1KTsKKyAgRVhQRUNUX0VRKDEsIHJlcyk7CisgIHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29uZGl0aW9uYWxNb3Zlc0VxdWFsQ29kZT4odGVzdC0+ZW50cnkoKSkoLTEyKTsKKyAgRVhQRUNUX0VRKDAsIHJlcyk7Cit9CisKKworLy8gUmV0dXJuIDEgaWYgb3ZlcmZsb3csIDAgaWYgbm8gb3ZlcmZsb3cuCitBU1NFTUJMRVJfVEVTVF9HRU5FUkFURShDb25kaXRpb25hbE1vdmVzTm9PdmVyZmxvdywgYXNzZW1ibGVyKSB7CisgIF9fIG1vdnEoUkRYLCBDYWxsaW5nQ29udmVudGlvbnM6OmtBcmcxUmVnKTsKKyAgX18gYWRkcShSRFgsIENhbGxpbmdDb252ZW50aW9uczo6a0FyZzJSZWcpOworICBfXyBtb3ZxKFJBWCwgSW1tZWRpYXRlKDEpKTsKKyAgX18gbW92cShSQ1gsIEltbWVkaWF0ZSgwKSk7CisgIF9fIGNtb3Zub3EoUkFYLCBSQ1gpOworICBfXyByZXQoKTsKK30KKworCitBU1NFTUJMRVJfVEVTVF9SVU4oQ29uZGl0aW9uYWxNb3Zlc05vT3ZlcmZsb3csIHRlc3QpIHsKKyAgdHlwZWRlZiBpbnQgKCpDb25kaXRpb25hbE1vdmVzTm9PdmVyZmxvd0NvZGUpKGludDY0X3QgaSwgaW50NjRfdCBqKTsKKyAgaW50IHJlcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q29uZGl0aW9uYWxNb3Zlc05vT3ZlcmZsb3dDb2RlPigKKyAgICAgIHRlc3QtPmVudHJ5KCkpKDB4N2ZmZmZmZmZmZmZmZmZmZiwgMik7CisgIEVYUEVDVF9FUSgxLCByZXMpOworICByZXMgPSByZWludGVycHJldF9jYXN0PENvbmRpdGlvbmFsTW92ZXNOb092ZXJmbG93Q29kZT4odGVzdC0+ZW50cnkoKSkoMSwgMSk7CisgIEVYUEVDVF9FUSgwLCByZXMpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZGFydAogCiAjZW5kaWYgIC8vIGRlZmluZWQgVEFSR0VUX0FSQ0hfWDY0CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvZGVfZGVzY3JpcHRvcnNfdGVzdC5jYyBiL3J1bnRpbWUvdm0vY29kZV9kZXNjcmlwdG9yc190ZXN0LmNjCmluZGV4IDU2NGEwMTguLmM1NGNhNmMgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vY29kZV9kZXNjcmlwdG9yc190ZXN0LmNjCisrKyBiL3J1bnRpbWUvdm0vY29kZV9kZXNjcmlwdG9yc190ZXN0LmNjCkBAIC0yNTcsMTUgKzI1NywxMyBAQAogICBjb25zdCBQY0Rlc2NyaXB0b3JzJiBkZXNjcmlwdG9ycyA9CiAgICAgICBQY0Rlc2NyaXB0b3JzOjpIYW5kbGUoY29kZS5wY19kZXNjcmlwdG9ycygpKTsKICAgaW50IGNhbGxfY291bnQgPSAwOwotICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzKTsKKyAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjcmlwdG9ycywgUmF3UGNEZXNjcmlwdG9yczo6a1Vub3B0U3RhdGljQ2FsbCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7Ci0gICAgaWYgKHJlYy5raW5kKCkgPT0gUmF3UGNEZXNjcmlwdG9yczo6a1Vub3B0U3RhdGljQ2FsbCkgewotICAgICAgc3RhY2ttYXBfdGFibGVfYnVpbGRlci0+QWRkRW50cnkocmVjLnBjIC0gY29kZS5FbnRyeVBvaW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja19iaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICsrY2FsbF9jb3VudDsKLSAgICB9CisgICAgc3RhY2ttYXBfdGFibGVfYnVpbGRlci0+QWRkRW50cnkocmVjLnBjIC0gY29kZS5FbnRyeVBvaW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICsrY2FsbF9jb3VudDsKICAgfQogICAvLyBXZSBjYW4ndCBlYXNpbHkgY2hlY2sgdGhhdCB3ZSBwdXQgdGhlIHN0YWNrbWFwIGF0IHRoZSBjb3JyZWN0IHBjLCBidXQKICAgLy8gd2UgZGlkIGlmIHRoZXJlIHdhcyBleGFjdGx5IG9uZSBjYWxsIHNlZW4uCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvbXBpbGVyX3Rlc3QuY2MgYi9ydW50aW1lL3ZtL2NvbXBpbGVyX3Rlc3QuY2MKaW5kZXggZmRlY2Q2ZS4uODQ4NTAwOCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9jb21waWxlcl90ZXN0LmNjCisrKyBiL3J1bnRpbWUvdm0vY29tcGlsZXJfdGVzdC5jYwpAQCAtOTksNCArOTksMzcgQEAKICAgRVhQRUNUX1NUUkVRKCJIZXJyIE5pbHNzb24gMTAwLiIsIHZhbC5Ub0NTdHJpbmcoKSk7CiB9CiAKKworVEVTVF9DQVNFKEV2YWxFeHByZXNzaW9uV2l0aExhenlDb21waWxlKSB7CisgIExpYnJhcnkmIGxpYiA9IExpYnJhcnk6OkhhbmRsZShMaWJyYXJ5OjpDb3JlTGlicmFyeSgpKTsKKworICBjb25zdCBTdHJpbmcmIGV4cHJlc3Npb24gPSBTdHJpbmc6OkhhbmRsZShTdHJpbmc6Ok5ldygKKyAgICAgICIoKXsgcmV0dXJuICgpeyByZXR1cm4gKCl7IHJldHVybiAzICsgNDsgfSgpOyB9KCk7IH0oKSIpKTsKKyAgT2JqZWN0JiB2YWwgPSBPYmplY3Q6OkhhbmRsZSgpOworICB2YWwgPSBsaWIuRXZhbHVhdGUoZXhwcmVzc2lvbiwgQXJyYXk6OmVtcHR5X2FycmF5KCksIEFycmF5OjplbXB0eV9hcnJheSgpKTsKKworICBFWFBFQ1QoIXZhbC5Jc051bGwoKSk7CisgIEVYUEVDVCghdmFsLklzRXJyb3IoKSk7CisgIEVYUEVDVCh2YWwuSXNJbnRlZ2VyKCkpOworICBFWFBFQ1RfRVEoNywgSW50ZWdlcjo6Q2FzdCh2YWwpLkFzSW50NjRWYWx1ZSgpKTsKK30KKworCitURVNUX0NBU0UoRXZhbEV4cHJlc3Npb25FeGhhdXN0Q0lEcykgeworICBMaWJyYXJ5JiBsaWIgPSBMaWJyYXJ5OjpIYW5kbGUoTGlicmFyeTo6Q29yZUxpYnJhcnkoKSk7CisKKyAgY29uc3QgU3RyaW5nJiBleHByZXNzaW9uID0gU3RyaW5nOjpIYW5kbGUoU3RyaW5nOjpOZXcoIjMgKyA0IikpOworICBPYmplY3QmIHZhbCA9IE9iamVjdDo6SGFuZGxlKCk7CisKKyAgY29uc3QgaW50cHRyX3QgY2xhc3NUYWJsZVNpemUgPSAxIDw8IFJhd09iamVjdDo6a0NsYXNzSWRUYWdTaXplOworICBmb3IgKGludHB0cl90IGkgPSAwOyBpIDwgY2xhc3NUYWJsZVNpemU7IGkrKykgeworICAgIHZhbCA9IGxpYi5FdmFsdWF0ZShleHByZXNzaW9uLCBBcnJheTo6ZW1wdHlfYXJyYXkoKSwgQXJyYXk6OmVtcHR5X2FycmF5KCkpOworICB9CisKKyAgRVhQRUNUKCF2YWwuSXNOdWxsKCkpOworICBFWFBFQ1QoIXZhbC5Jc0Vycm9yKCkpOworICBFWFBFQ1QodmFsLklzSW50ZWdlcigpKTsKKyAgRVhQRUNUX0VRKDcsIEludGVnZXI6OkNhc3QodmFsKS5Bc0ludDY0VmFsdWUoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBkYXJ0CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2NvdmVyYWdlLmNjIGIvcnVudGltZS92bS9jb3ZlcmFnZS5jYwppbmRleCBlZDcyYmIwLi4yZWIwZDVlIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2NvdmVyYWdlLmNjCisrKyBiL3J1bnRpbWUvdm0vY292ZXJhZ2UuY2MKQEAgLTkwLDQxICs5MCwzNyBAQAogICBjb25zdCBpbnRwdHJfdCBlbmRfcG9zID0gZnVuY3Rpb24uZW5kX3Rva2VuX3BvcygpOwogICBpbnRwdHJfdCBsYXN0X2xpbmUgPSAtMTsKICAgaW50cHRyX3QgbGFzdF9jb3VudCA9IDA7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMpOworICAvLyBPbmx5IElDIGJhc2VkIGNhbGxzIGhhdmUgY291bnRpbmcuCisgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMsCisgICAgICBSYXdQY0Rlc2NyaXB0b3JzOjprSWNDYWxsIHwgUmF3UGNEZXNjcmlwdG9yczo6a1Vub3B0U3RhdGljQ2FsbCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIEhBTkRMRVNDT1BFKGlzb2xhdGUpOwogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7Ci0gICAgUmF3UGNEZXNjcmlwdG9yczo6S2luZCBraW5kID0gcmVjLmtpbmQoKTsKLSAgICAvLyBPbmx5IElDIGJhc2VkIGNhbGxzIGhhdmUgY291bnRpbmcuCi0gICAgaWYgKChraW5kID09IFJhd1BjRGVzY3JpcHRvcnM6OmtJY0NhbGwpIHx8Ci0gICAgICAgIChraW5kID09IFJhd1BjRGVzY3JpcHRvcnM6OmtVbm9wdFN0YXRpY0NhbGwpKSB7Ci0gICAgICBpbnRwdHJfdCBkZW9wdF9pZCA9IHJlYy5kZW9wdF9pZDsKLSAgICAgIGNvbnN0IElDRGF0YSogaWNfZGF0YT0gKCppY19kYXRhX2FycmF5KVtkZW9wdF9pZF07Ci0gICAgICBpZiAoIWljX2RhdGEtPklzTnVsbCgpKSB7Ci0gICAgICAgIGludHB0cl90IHRva2VuX3BvcyA9IHJlYy50b2tlbl9wb3M7Ci0gICAgICAgIC8vIEZpbHRlciBvdXQgZGVzY3JpcHRvcnMgdGhhdCBkbyBub3QgbWFwIHRvIHRva2VucyBpbiB0aGUgc291cmNlIGNvZGUuCi0gICAgICAgIGlmICh0b2tlbl9wb3MgPCBiZWdpbl9wb3MgfHwKLSAgICAgICAgICAgIHRva2VuX3BvcyA+IGVuZF9wb3MpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnRwdHJfdCBsaW5lID0gcG9zX3RvX2xpbmVbdG9rZW5fcG9zXTsKKyAgICBpbnRwdHJfdCBkZW9wdF9pZCA9IHJlYy5kZW9wdF9pZDsKKyAgICBjb25zdCBJQ0RhdGEqIGljX2RhdGEgPSAoKmljX2RhdGFfYXJyYXkpW2Rlb3B0X2lkXTsKKyAgICBpZiAoIWljX2RhdGEtPklzTnVsbCgpKSB7CisgICAgICBpbnRwdHJfdCB0b2tlbl9wb3MgPSByZWMudG9rZW5fcG9zOworICAgICAgLy8gRmlsdGVyIG91dCBkZXNjcmlwdG9ycyB0aGF0IGRvIG5vdCBtYXAgdG8gdG9rZW5zIGluIHRoZSBzb3VyY2UgY29kZS4KKyAgICAgIGlmICgodG9rZW5fcG9zIDwgYmVnaW5fcG9zKSB8fCAodG9rZW5fcG9zID4gZW5kX3BvcykpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnRwdHJfdCBsaW5lID0gcG9zX3RvX2xpbmVbdG9rZW5fcG9zXTsKICNpZiBkZWZpbmVkKERFQlVHKQotICAgICAgICBjb25zdCBTY3JpcHQmIHNjcmlwdCA9IFNjcmlwdDo6SGFuZGxlKGZ1bmN0aW9uLnNjcmlwdCgpKTsKLSAgICAgICAgaW50cHRyX3QgdGVzdF9saW5lID0gLTE7Ci0gICAgICAgIHNjcmlwdC5HZXRUb2tlbkxvY2F0aW9uKHRva2VuX3BvcywgJnRlc3RfbGluZSwgTlVMTCk7Ci0gICAgICAgIEFTU0VSVCh0ZXN0X2xpbmUgPT0gbGluZSk7CisgICAgICBjb25zdCBTY3JpcHQmIHNjcmlwdCA9IFNjcmlwdDo6SGFuZGxlKGZ1bmN0aW9uLnNjcmlwdCgpKTsKKyAgICAgIGludHB0cl90IHRlc3RfbGluZSA9IC0xOworICAgICAgc2NyaXB0LkdldFRva2VuTG9jYXRpb24odG9rZW5fcG9zLCAmdGVzdF9saW5lLCBOVUxMKTsKKyAgICAgIEFTU0VSVCh0ZXN0X2xpbmUgPT0gbGluZSk7CiAjZW5kaWYKLSAgICAgICAgLy8gTWVyZ2UgaGl0IGRhdGEgd2hlcmUgcG9zc2libGUuCi0gICAgICAgIGlmIChsYXN0X2xpbmUgPT0gbGluZSkgewotICAgICAgICAgIGxhc3RfY291bnQgKz0gaWNfZGF0YS0+QWdncmVnYXRlQ291bnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAobGFzdF9saW5lICE9IC0xKSB7Ci0gICAgICAgICAgICBoaXRzX2Fyci5BZGRWYWx1ZShsYXN0X2xpbmUpOwotICAgICAgICAgICAgaGl0c19hcnIuQWRkVmFsdWUobGFzdF9jb3VudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxhc3RfY291bnQgPSBpY19kYXRhLT5BZ2dyZWdhdGVDb3VudCgpOwotICAgICAgICAgIGxhc3RfbGluZSA9IGxpbmU7CisgICAgICAvLyBNZXJnZSBoaXQgZGF0YSB3aGVyZSBwb3NzaWJsZS4KKyAgICAgIGlmIChsYXN0X2xpbmUgPT0gbGluZSkgeworICAgICAgICBsYXN0X2NvdW50ICs9IGljX2RhdGEtPkFnZ3JlZ2F0ZUNvdW50KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAobGFzdF9saW5lICE9IC0xKSB7CisgICAgICAgICAgaGl0c19hcnIuQWRkVmFsdWUobGFzdF9saW5lKTsKKyAgICAgICAgICBoaXRzX2Fyci5BZGRWYWx1ZShsYXN0X2NvdW50KTsKICAgICAgICAgfQorICAgICAgICBsYXN0X2NvdW50ID0gaWNfZGF0YS0+QWdncmVnYXRlQ291bnQoKTsKKyAgICAgICAgbGFzdF9saW5lID0gbGluZTsKICAgICAgIH0KICAgICB9CiAgIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vZGVidWdnZXIuY2MgYi9ydW50aW1lL3ZtL2RlYnVnZ2VyLmNjCmluZGV4IGMxZWY0OWEuLjhjZGVjOGQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vZGVidWdnZXIuY2MKKysrIGIvcnVudGltZS92bS9kZWJ1Z2dlci5jYwpAQCAtMzU5LDcgKzM1OSw3IEBACiAgIGlmICh0b2tlbl9wb3NfIDwgMCkgewogICAgIHRva2VuX3Bvc18gPSBTY2FubmVyOjprTm9Tb3VyY2VQb3M7CiAgICAgR2V0UGNEZXNjcmlwdG9ycygpOwotICAgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIocGNfZGVzY18pOworICAgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIocGNfZGVzY18sIFJhd1BjRGVzY3JpcHRvcnM6OmtBbnlLaW5kKTsKICAgICB3aGlsZSAoaXRlci5IYXNOZXh0KCkpIHsKICAgICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7CiAgICAgICBpZiAocmVjLnBjID09IHBjXykgewpAQCAtOTIxLDE3ICs5MjEsMTQgQEAKIH0KIAogCi1zdGF0aWMgYm9vbCBJc1NhZmVEZXNjS2luZChpbnQ4X3Qga2luZCkgewotICByZXR1cm4gKChraW5kID09IFJhd1BjRGVzY3JpcHRvcnM6OmtJY0NhbGwpIHx8Ci0gICAgICAgICAgKGtpbmQgPT0gUmF3UGNEZXNjcmlwdG9yczo6a09wdFN0YXRpY0NhbGwpIHx8Ci0gICAgICAgICAgKGtpbmQgPT0gUmF3UGNEZXNjcmlwdG9yczo6a1Vub3B0U3RhdGljQ2FsbCkgfHwKLSAgICAgICAgICAoa2luZCA9PSBSYXdQY0Rlc2NyaXB0b3JzOjprQ2xvc3VyZUNhbGwpIHx8Ci0gICAgICAgICAgKGtpbmQgPT0gUmF3UGNEZXNjcmlwdG9yczo6a1J1bnRpbWVDYWxsKSk7Ci19Citjb25zdCB1aW50OF90IGtTYWZlcG9pbnRLaW5kID0KKyAgICBSYXdQY0Rlc2NyaXB0b3JzOjprSWNDYWxsIHwgIFJhd1BjRGVzY3JpcHRvcnM6OmtPcHRTdGF0aWNDYWxsIHwKKyAgICBSYXdQY0Rlc2NyaXB0b3JzOjprVW5vcHRTdGF0aWNDYWxsIHwgUmF3UGNEZXNjcmlwdG9yczo6a0Nsb3N1cmVDYWxsIHwKKyAgICBSYXdQY0Rlc2NyaXB0b3JzOjprUnVudGltZUNhbGw7CiAKIAotc3RhdGljIGJvb2wgSXNTYWZlUG9pbnQoY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMpIHsKLSAgcmV0dXJuIElzU2FmZURlc2NLaW5kKHJlYy5raW5kKCkpICYmIChyZWMudG9rZW5fcG9zICE9IFNjYW5uZXI6OmtOb1NvdXJjZVBvcyk7CitzdGF0aWMgYm9vbCBIYXNUb2tlblBvcyhjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIHJlYykgeworICByZXR1cm4gcmVjLnRva2VuX3BvcyAhPSBTY2FubmVyOjprTm9Tb3VyY2VQb3M7CiB9CiAKIApAQCAtOTQ5LDcgKzk0Niw3IEBACiAgIEFTU0VSVCghY29kZS5Jc051bGwoKSk7CiAgIEFTU0VSVCh0b2tlbl9wb3NfID4gMCk7CiAgIEFTU0VSVChwY18gIT0gMCk7Ci0gIEFTU0VSVChJc1NhZmVEZXNjS2luZChicmVha3BvaW50X2tpbmRfKSk7CisgIEFTU0VSVCgoYnJlYWtwb2ludF9raW5kXyAmIGtTYWZlcG9pbnRLaW5kKSAhPSAwKTsKIH0KIAogCkBAIC0xMjAyLDEwICsxMTk5LDEwIEBACiAgIERlb3B0aW1pemVXb3JsZCgpOwogICBBU1NFUlQoIXRhcmdldF9mdW5jdGlvbi5IYXNPcHRpbWl6ZWRDb2RlKCkpOwogICBQY0Rlc2NyaXB0b3JzJiBkZXNjID0gUGNEZXNjcmlwdG9yczo6SGFuZGxlKGlzb2xhdGUsIGNvZGUucGNfZGVzY3JpcHRvcnMoKSk7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzYyk7CisgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzYywga1NhZmVwb2ludEtpbmQpOwogICB3aGlsZSAoaXRlci5IYXNOZXh0KCkpIHsKICAgICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIHJlYyA9IGl0ZXIuTmV4dCgpOwotICAgIGlmIChJc1NhZmVQb2ludChyZWMpKSB7CisgICAgaWYgKEhhc1Rva2VuUG9zKHJlYykpIHsKICAgICAgIENvZGVCcmVha3BvaW50KiBicHQgPSBHZXRDb2RlQnJlYWtwb2ludChyZWMucGMpOwogICAgICAgaWYgKGJwdCAhPSBOVUxMKSB7CiAgICAgICAgIC8vIFRoZXJlIGlzIGFscmVhZHkgYSBicmVha3BvaW50IGZvciB0aGlzIGFkZHJlc3MuIE1ha2Ugc3VyZQpAQCAtMTI1MywxMCArMTI1MCwxMCBAQAogICBib29sIGlzX2Nsb3N1cmVfY2FsbCA9IGZhbHNlOwogICBjb25zdCBQY0Rlc2NyaXB0b3JzJiBwY19kZXNjID0KICAgICAgIFBjRGVzY3JpcHRvcnM6OkhhbmRsZShpc29sYXRlLCBjb2RlLnBjX2Rlc2NyaXB0b3JzKCkpOwotICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKHBjX2Rlc2MpOworICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKHBjX2Rlc2MsIFJhd1BjRGVzY3JpcHRvcnM6OmtDbG9zdXJlQ2FsbCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7Ci0gICAgaWYgKChyZWMucGMgPT0gcGMpICYmIChyZWMua2luZCgpID09IFJhd1BjRGVzY3JpcHRvcnM6OmtDbG9zdXJlQ2FsbCkpIHsKKyAgICBpZiAocmVjLnBjID09IHBjKSB7CiAgICAgICBpc19jbG9zdXJlX2NhbGwgPSB0cnVlOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTU1MiwxMiArMTU0OSwxMiBAQAogICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMqIGxvd2VzdF9wY19yZWMgPSBOVUxMOwogCiAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyogcmVjID0gTlVMTDsKLSAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjKTsKKyAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjLCBrU2FmZXBvaW50S2luZCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIHJlYyA9ICZpdGVyLk5leHQoKTsKICAgICBpbnRwdHJfdCBkZXNjX3Rva2VuX3BvcyA9IHJlYy0+dG9rZW5fcG9zOwogICAgIEFTU0VSVChkZXNjX3Rva2VuX3BvcyA+PSAwKTsKLSAgICBpZiAoSXNTYWZlUG9pbnQoKnJlYykpIHsKKyAgICBpZiAoSGFzVG9rZW5Qb3MoKnJlYykpIHsKICAgICAgIGlmICgoZGVzY190b2tlbl9wb3MgPCByZXF1ZXN0ZWRfdG9rZW5fcG9zKSB8fAogICAgICAgICAgIChkZXNjX3Rva2VuX3BvcyA+IGxhc3RfdG9rZW5fcG9zKSkgewogICAgICAgICAvLyBUaGlzIGRlc2NyaXB0b3IgaXMgb3V0c2lkZSB0aGUgZGVzaXJlZCB0b2tlbiByYW5nZS4KQEAgLTE2MDUsMTIgKzE2MDIsMTIgQEAKICAgdXdvcmQgbG93ZXN0X3BjID0ga1V3b3JkTWF4OwogICAvLyBGaW5kIHRoZSBzYWZlIHBvaW50IHdpdGggdGhlIGxvd2VzdCBjb21waWxlZCBjb2RlIGFkZHJlc3MKICAgLy8gdGhhdCBtYXBzIHRvIHRoZSB0b2tlbiBwb3NpdGlvbiBvZiB0aGUgc291cmNlIGJyZWFrcG9pbnQuCi0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzYyk7CisgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzYywga1NhZmVwb2ludEtpbmQpOwogICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMqIGxvd2VzdF9yZWMgPSBOVUxMOwogICB3aGlsZSAoaXRlci5IYXNOZXh0KCkpIHsKICAgICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIHJlYyA9IGl0ZXIuTmV4dCgpOwogICAgIGludHB0cl90IGRlc2NfdG9rZW5fcG9zID0gcmVjLnRva2VuX3BvczsKLSAgICBpZiAoKGRlc2NfdG9rZW5fcG9zID09IGJwdC0+dG9rZW5fcG9zXykgJiYgSXNTYWZlUG9pbnQocmVjKSkgeworICAgIGlmICgoZGVzY190b2tlbl9wb3MgPT0gYnB0LT50b2tlbl9wb3NfKSAmJiBIYXNUb2tlblBvcyhyZWMpKSB7CiAgICAgICBpZiAocmVjLnBjIDwgbG93ZXN0X3BjKSB7CiAgICAgICAgIGxvd2VzdF9wYyA9IHJlYy5wYzsKICAgICAgICAgbG93ZXN0X3JlYyA9ICZyZWM7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2RlYnVnZ2VyX2FwaV9pbXBsX3Rlc3QuY2MgYi9ydW50aW1lL3ZtL2RlYnVnZ2VyX2FwaV9pbXBsX3Rlc3QuY2MKaW5kZXggMDRhZDAyOS4uNGNlM2YxMiAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9kZWJ1Z2dlcl9hcGlfaW1wbF90ZXN0LmNjCisrKyBiL3J1bnRpbWUvdm0vZGVidWdnZXJfYXBpX2ltcGxfdGVzdC5jYwpAQCAtMTk5MCw2ICsxOTkwLDQ1IEBACiB9CiAKIAorc3RhdGljIHZvaWQgRXZhbHVhdGVJbkFjdGl2YXRpb25PZkV2YWx1YXRlSGFuZGxlcihEYXJ0X0lzb2xhdGVJZCBpc29sYXRlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXJ0X0hhbmRsZSBleGNlcHRpb25fb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXJ0X1N0YWNrVHJhY2UgdHJhY2UpIHsKKyAgYnJlYWtwb2ludF9oaXRfY291bnRlcisrOworICBEYXJ0X0FjdGl2YXRpb25GcmFtZSB0b3BfZnJhbWUgPSAwOworICBEYXJ0X0hhbmRsZSByZXN1bHQgPSBEYXJ0X0dldEFjdGl2YXRpb25GcmFtZSh0cmFjZSwgMCwgJnRvcF9mcmFtZSk7CisgIEVYUEVDVF9WQUxJRChyZXN1bHQpOworCisgIHJlc3VsdCA9IERhcnRfQWN0aXZhdGlvbkZyYW1lRXZhbHVhdGUodG9wX2ZyYW1lLCBOZXdTdHJpbmcoInAuciIpKTsKKyAgRVhQRUNUX1ZBTElEKHJlc3VsdCk7CisgIEVYUEVDVF9FUSg1LjAsIFRvRG91YmxlKHJlc3VsdCkpOworfQorCisKK1RFU1RfQ0FTRShEZWJ1Z19FdmFsdWF0ZUluQWN0aXZhdGlvbk9mRXZhbHVhdGUpIHsKKyAgLy8gVGhpcyBsaWJyYXJ5IGRlbGliZXJhdGVseSBkZWNsYXJlcyBubyB0b3AtbGV2ZWwgdmFyaWFibGVzIG9yIG1ldGhvZHMuIFRoaXMKKyAgLy8gZXhlcmNpc2VzIGEgcGF0aCBpbiBldmFsIHdoZXJlIGEgbGlicmFyeSBtYXkgaGF2ZSBubyB0b3AtbGV2ZWwgYW5vbnltb3VzCisgIC8vIGNsYXNzZXMuCisgIGNvbnN0IGNoYXIqIGtTY3JpcHRDaGFycyA9CisgICAgICAiaW1wb3J0ICdkYXJ0Om1hdGgnOyAgICAgICAgICAgICAgIFxuIgorICAgICAgImNsYXNzIFBvaW50IHsgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAgICIgIHZhciB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAiICBQb2ludCh0aGlzLngsIHRoaXMueSk7ICAgICAgICAgIFxuIgorICAgICAgIiAgZ2V0IHIgPT4gc3FydCh4KnggKyB5KnkpOyAgICAgICBcbiIKKyAgICAgICJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iOworICBMb2FkU2NyaXB0KGtTY3JpcHRDaGFycyk7CisgIERhcnRfRmluYWxpemVMb2FkaW5nKCk7CisKKyAgRGFydF9TZXRFeGNlcHRpb25UaHJvd25IYW5kbGVyKCZFdmFsdWF0ZUluQWN0aXZhdGlvbk9mRXZhbHVhdGVIYW5kbGVyKTsKKyAgRGFydF9TZXRFeGNlcHRpb25QYXVzZUluZm8oa1BhdXNlT25BbGxFeGNlcHRpb25zKTsKKyAgYnJlYWtwb2ludF9oaXRfY291bnRlciA9IDA7CisKKyAgRGFydF9IYW5kbGUgcmVzdWx0ID0gRGFydF9FdmFsdWF0ZUV4cHIoc2NyaXB0X2xpYiwgTmV3U3RyaW5nKAorICAgICAgIigpIHsgdmFyIHAgPSBuZXcgUG9pbnQoMywgNCk7IHRocm93IHA7IH0gKCkpIikpOworICBFWFBFQ1QoRGFydF9Jc0Vycm9yKHJlc3VsdCkpOworICBFWFBFQ1RfRVEoMSwgYnJlYWtwb2ludF9oaXRfY291bnRlcik7Cit9CisKKwogVEVTVF9DQVNFKERlYnVnX0dldENsb3N1cmVJbmZvKSB7CiAgIGNvbnN0IGNoYXIqIGtTY3JpcHRDaGFycyA9CiAgICAgICAidm9pZCBmb28oKSB7IHJldHVybiA0MzsgfSBcbiIKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vZGlzYXNzZW1ibGVyX2lhMzIuY2MgYi9ydW50aW1lL3ZtL2Rpc2Fzc2VtYmxlcl9pYTMyLmNjCmluZGV4IGNiODQ1ZDcuLjY2YzgzNGQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vZGlzYXNzZW1ibGVyX2lhMzIuY2MKKysrIGIvcnVudGltZS92bS9kaXNhc3NlbWJsZXJfaWEzMi5jYwpAQCAtMjM3LDcgKzIzNyw5IEBACiAgICAgY2FzZSAweEI2OiByZXR1cm4gIm1vdnp4X2IiOwogICAgIGNhc2UgMHhCNzogcmV0dXJuICJtb3Z6eF93IjsKICAgICBjYXNlIDB4QUY6IHJldHVybiAiaW11bCI7CisgICAgY2FzZSAweEE0OiAgLy8gRmFsbCB0aHJvdWdoLgogICAgIGNhc2UgMHhBNTogcmV0dXJuICJzaGxkIjsKKyAgICBjYXNlIDB4QUM6ICAvLyBGYWxsIHRocm91Z2guCiAgICAgY2FzZSAweEFEOiByZXR1cm4gInNocmQiOwogICAgIGNhc2UgMHhBQjogcmV0dXJuICJidHMiOwogICAgIGNhc2UgMHhCRDogcmV0dXJuICJic3IiOwpAQCAtMTQwOSwyMCArMTQxMSwyMyBAQAogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBkYXRhICs9IDI7Ci0gICAgICAgICAgaWYgKGYwYnl0ZSA9PSAweEFCIHx8IGYwYnl0ZSA9PSAweEE1IHx8IGYwYnl0ZSA9PSAweEFEKSB7CisgICAgICAgICAgaWYgKGYwYnl0ZSA9PSAweEFCIHx8IGYwYnl0ZSA9PSAweEE0IHx8IGYwYnl0ZSA9PSAweEE1IHx8CisgICAgICAgICAgICAgIGYwYnl0ZSA9PSAweEFDIHx8IGYwYnl0ZSA9PSAweEFEKSB7CiAgICAgICAgICAgICAvLyBzaHJkLCBzaGxkLCBidHMKICAgICAgICAgICAgIFByaW50KGYwbW5lbSk7CiAgICAgICAgICAgICBpbnQgbW9kLCByZWdvcCwgcm07CiAgICAgICAgICAgICBHZXRNb2RSbSgqZGF0YSwgJm1vZCwgJnJlZ29wLCAmcm0pOwogICAgICAgICAgICAgUHJpbnQoIiAiKTsKICAgICAgICAgICAgIGRhdGEgKz0gUHJpbnRSaWdodE9wZXJhbmQoZGF0YSk7CisgICAgICAgICAgICBQcmludCgiLCIpOworICAgICAgICAgICAgUHJpbnRDUFVSZWdpc3RlcihyZWdvcCk7CiAgICAgICAgICAgICBpZiAoZjBieXRlID09IDB4QUIpIHsKLSAgICAgICAgICAgICAgUHJpbnQoIiwiKTsKLSAgICAgICAgICAgICAgUHJpbnRDUFVSZWdpc3RlcihyZWdvcCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBQcmludCgiLCIpOwotICAgICAgICAgICAgICBQcmludENQVVJlZ2lzdGVyKHJlZ29wKTsKKyAgICAgICAgICAgICAgLy8gRG9uZS4KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZjBieXRlID09IDB4QTUgfHwgZjBieXRlID09IDB4QUQpIHsKICAgICAgICAgICAgICAgUHJpbnQoIixjbCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgUHJpbnQoIiwgIik7CisgICAgICAgICAgICAgIFByaW50SW50KCooZGF0YSsrKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIGlmICgoZjBieXRlID09IDB4MTApIHx8IChmMGJ5dGUgPT0gMHgxMSkgfHwKICAgICAgICAgICAgICAgICAgICAgIElzVHdvWG1tUmVnSW5zdHJ1Y3Rpb24oZjBieXRlKSkgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9leGNlcHRpb25zLmNjIGIvcnVudGltZS92bS9leGNlcHRpb25zLmNjCmluZGV4IDFjOTQ0MDYuLmJjMjY3ZWYgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vZXhjZXB0aW9ucy5jYworKysgYi9ydW50aW1lL3ZtL2V4Y2VwdGlvbnMuY2MKQEAgLTU4NSw3ICs1ODUsMTMgQEAKIAogCiB2b2lkIEV4Y2VwdGlvbnM6OlRocm93KElzb2xhdGUqIGlzb2xhdGUsIGNvbnN0IEluc3RhbmNlJiBleGNlcHRpb24pIHsKLSAgaXNvbGF0ZS0+ZGVidWdnZXIoKS0+U2lnbmFsRXhjZXB0aW9uVGhyb3duKGV4Y2VwdGlvbik7CisgIC8vIERvIG5vdCBub3RpZnkgZGVidWdnZXIgb24gc3RhY2sgb3ZlcmZsb3cgYW5kIG91dCBvZiBtZW1vcnkgZXhjZXB0aW9ucy4KKyAgLy8gVGhlIFZNIHdvdWxkIGNyYXNoIHdoZW4gdGhlIGRlYnVnZ2VyIGNhbGxzIGJhY2sgaW50byB0aGUgVk0gdG8KKyAgLy8gZ2V0IHZhbHVlcyBvZiB2YXJpYWJsZXMuCisgIGlmIChleGNlcHRpb24ucmF3KCkgIT0gaXNvbGF0ZS0+b2JqZWN0X3N0b3JlKCktPm91dF9vZl9tZW1vcnkoKSAmJgorICAgICAgZXhjZXB0aW9uLnJhdygpICE9IGlzb2xhdGUtPm9iamVjdF9zdG9yZSgpLT5zdGFja19vdmVyZmxvdygpKSB7CisgICAgaXNvbGF0ZS0+ZGVidWdnZXIoKS0+U2lnbmFsRXhjZXB0aW9uVGhyb3duKGV4Y2VwdGlvbik7CisgIH0KICAgLy8gTnVsbCBvYmplY3QgaXMgYSB2YWxpZCBleGNlcHRpb24gb2JqZWN0LgogICBUaHJvd0V4Y2VwdGlvbkhlbHBlcihpc29sYXRlLCBleGNlcHRpb24sIEluc3RhbmNlOjpIYW5kbGUoaXNvbGF0ZSksIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vZmxvd19ncmFwaF9jb21waWxlcl9pYTMyLmNjIGIvcnVudGltZS92bS9mbG93X2dyYXBoX2NvbXBpbGVyX2lhMzIuY2MKaW5kZXggNDczZjk2Zi4uM2U3ZjY5ZiAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9mbG93X2dyYXBoX2NvbXBpbGVyX2lhMzIuY2MKKysrIGIvcnVudGltZS92bS9mbG93X2dyYXBoX2NvbXBpbGVyX2lhMzIuY2MKQEAgLTEyNzgsNyArMTI3OCw3IEBACiAgICAgICBNZWdhbW9ycGhpY0NhY2hlOjpab25lSGFuZGxlKHRhYmxlLT5Mb29rdXAobmFtZSwgYXJndW1lbnRzX2Rlc2NyaXB0b3IpKTsKICAgTGFiZWwgbG9hZF9jYWNoZTsKICAgX18gbW92bChFQVgsIEFkZHJlc3MoRVNQLCAoYXJndW1lbnRfY291bnQgLSAxKSAqIGtXb3JkU2l6ZSkpOwotICBfXyBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKEVBWCwgRUFYKTsKKyAgX18gTG9hZFRhZ2dlZENsYXNzSWRNYXlCZVNtaShFQVgsIEVBWCwgRUJYKTsKIAogICAvLyBFQVg6IGNsYXNzIElEIG9mIHRoZSByZWNlaXZlciAoc21pKS4KICAgX18gQmluZCgmbG9hZF9jYWNoZSk7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2ludGVybWVkaWF0ZV9sYW5ndWFnZV9pYTMyLmNjIGIvcnVudGltZS92bS9pbnRlcm1lZGlhdGVfbGFuZ3VhZ2VfaWEzMi5jYwppbmRleCBlMWQzMjE1Li5kNjg5YTNiIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2ludGVybWVkaWF0ZV9sYW5ndWFnZV9pYTMyLmNjCisrKyBiL3J1bnRpbWUvdm0vaW50ZXJtZWRpYXRlX2xhbmd1YWdlX2lhMzIuY2MKQEAgLTk0Myw5ICs5NDMsMjIgQEAKIAogCiB2b2lkIExvYWRDbGFzc0lkSW5zdHI6OkVtaXROYXRpdmVDb2RlKEZsb3dHcmFwaENvbXBpbGVyKiBjb21waWxlcikgewotICBSZWdpc3RlciBvYmplY3QgPSBsb2NzKCktPmluKDApLnJlZygpOwotICBSZWdpc3RlciByZXN1bHQgPSBsb2NzKCktPm91dCgwKS5yZWcoKTsKLSAgX18gTG9hZFRhZ2dlZENsYXNzSWRNYXlCZVNtaShyZXN1bHQsIG9iamVjdCk7CisgIGNvbnN0IFJlZ2lzdGVyIG9iamVjdCA9IGxvY3MoKS0+aW4oMCkucmVnKCk7CisgIGNvbnN0IFJlZ2lzdGVyIHJlc3VsdCA9IGxvY3MoKS0+b3V0KDApLnJlZygpOworICBMYWJlbCBub3Rfc21pLCBkb25lOworCisgIC8vIFdlIGRvbid0IHVzZSBBc3NlbWJsZXI6OkxvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoKSBoZXJlLS0td2hpY2ggdXNlcworICAvLyBhIGNvbmRpdGlvbmFsIG1vdmUgaW5zdGVhZCwgYW5kIHJlcXVpcmVzIGFuIGFkZGl0aW9uYWwgcmVnaXN0ZXItLS1iZWNhdXNlCisgIC8vIGl0IGlzIHNsb3dlciwgcHJvYmFibHkgZHVlIHRvIGJyYW5jaCBwcmVkaWN0aW9uIHVzdWFsbHkgd29ya2luZyBqdXN0IGZpbmUKKyAgLy8gaW4gdGhpcyBjYXNlLgorICBfXyB0ZXN0bChvYmplY3QsIEltbWVkaWF0ZShrU21pVGFnTWFzaykpOworICBfXyBqKE5PVF9aRVJPLCAmbm90X3NtaSwgQXNzZW1ibGVyOjprTmVhckp1bXApOworICBfXyBtb3ZsKHJlc3VsdCwgSW1tZWRpYXRlKFNtaTo6UmF3VmFsdWUoa1NtaUNpZCkpKTsKKyAgX18gam1wKCZkb25lLCBBc3NlbWJsZXI6OmtOZWFySnVtcCk7CisgIF9fIEJpbmQoJm5vdF9zbWkpOworICBfXyBMb2FkQ2xhc3NJZChyZXN1bHQsIG9iamVjdCk7CisgIF9fIFNtaVRhZyhyZXN1bHQpOworICBfXyBCaW5kKCZkb25lKTsKIH0KIAogCkBAIC01NTk3LDcgKzU2MTAsNyBAQAogCiAgIGlmIChpbmRleF9sb2MuSXNDb25zdGFudCgpKSB7CiAgICAgUmVnaXN0ZXIgbGVuZ3RoID0gbGVuZ3RoX2xvYy5yZWcoKTsKLSAgICBjb25zdCBPYmplY3QmIGluZGV4ID0gU21pOjpDYXN0KGluZGV4X2xvYy5jb25zdGFudCgpKTsKKyAgICBjb25zdCBTbWkmIGluZGV4ID0gU21pOjpDYXN0KGluZGV4X2xvYy5jb25zdGFudCgpKTsKICAgICBfXyBjbXBsKGxlbmd0aCwgSW1tZWRpYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdD4oaW5kZXgucmF3KCkpKSk7CiAgICAgX18gaihCRUxPV19FUVVBTCwgZGVvcHQpOwogICB9IGVsc2UgaWYgKGxlbmd0aF9sb2MuSXNDb25zdGFudCgpKSB7CkBAIC01ODc5LDI0ICs1ODkyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvcHQpIGNvbnN0IHsKICAgY29uc3QgaW50cHRyX3Qga051bUlucHV0cyA9IDI7CiAgIGNvbnN0IGludHB0cl90IGtOdW1UZW1wcyA9Ci0gICAgICAob3Bfa2luZCgpID09IFRva2VuOjprU0hMKSA/IChDYW5EZW9wdGltaXplKCkgPyAyIDogMSkgOiAwOworICAgICAgKG9wX2tpbmQoKSA9PSBUb2tlbjo6a1NITCkgJiYgQ2FuRGVvcHRpbWl6ZSgpID8gMiA6IDA7CiAgIExvY2F0aW9uU3VtbWFyeSogc3VtbWFyeSA9IG5ldyhpc29sYXRlKSBMb2NhdGlvblN1bW1hcnkoCiAgICAgICBpc29sYXRlLCBrTnVtSW5wdXRzLCBrTnVtVGVtcHMsIExvY2F0aW9uU3VtbWFyeTo6a05vQ2FsbCk7CiAgIHN1bW1hcnktPnNldF9pbigwLCBMb2NhdGlvbjo6UGFpcihMb2NhdGlvbjo6UmVxdWlyZXNSZWdpc3RlcigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYXRpb246OlJlcXVpcmVzUmVnaXN0ZXIoKSkpOwotICBzdW1tYXJ5LT5zZXRfaW4oMSwgTG9jYXRpb246OlJlZ2lzdGVyTG9jYXRpb24oRUNYKSk7Ci0gIGlmIChvcF9raW5kKCkgPT0gVG9rZW46OmtTSEwpIHsKKyAgc3VtbWFyeS0+c2V0X2luKDEsIExvY2F0aW9uOjpGaXhlZFJlZ2lzdGVyT3JTbWlDb25zdGFudChyaWdodCgpLCBFQ1gpKTsKKyAgaWYgKChvcF9raW5kKCkgPT0gVG9rZW46OmtTSEwpICYmIENhbkRlb3B0aW1pemUoKSkgewogICAgIHN1bW1hcnktPnNldF90ZW1wKDAsIExvY2F0aW9uOjpSZXF1aXJlc1JlZ2lzdGVyKCkpOwotICAgIGlmIChDYW5EZW9wdGltaXplKCkpIHsKLSAgICAgIHN1bW1hcnktPnNldF90ZW1wKDEsIExvY2F0aW9uOjpSZXF1aXJlc1JlZ2lzdGVyKCkpOwotICAgIH0KKyAgICBzdW1tYXJ5LT5zZXRfdGVtcCgxLCBMb2NhdGlvbjo6UmVxdWlyZXNSZWdpc3RlcigpKTsKICAgfQogICBzdW1tYXJ5LT5zZXRfb3V0KDAsIExvY2F0aW9uOjpTYW1lQXNGaXJzdElucHV0KCkpOwogICByZXR1cm4gc3VtbWFyeTsKIH0KIAogCi1zdGF0aWMgY29uc3QgaW50cHRyX3Qga01pbnRTaGlmdENvdW50TGltaXQgPSAzMTsKK3N0YXRpYyBjb25zdCBpbnRwdHJfdCBrTWludFNoaWZ0Q291bnRMaW1pdCA9IDYzOwogCiBib29sIFNoaWZ0TWludE9wSW5zdHI6Omhhc19zaGlmdF9jb3VudF9jaGVjaygpIGNvbnN0IHsKICAgcmV0dXJuIChyaWdodCgpLT5kZWZpbml0aW9uKCktPnJhbmdlKCkgPT0gTlVMTCkKQEAgLTU5MTgsNDUgKzU5MjksMTU0IEBACiAgIGlmIChDYW5EZW9wdGltaXplKCkpIHsKICAgICBkZW9wdCA9IGNvbXBpbGVyLT5BZGREZW9wdFN0dWIoZGVvcHRfaWQoKSwgSUNEYXRhOjprRGVvcHRTaGlmdE1pbnRPcCk7CiAgIH0KLSAgLy8gRGVvcHRpbWl6ZSBpZiBzaGlmdCBjb3VudCBpcyA+IDMxLgotICAvLyBzYXJsIG9wZXJhdGlvbiBtYXNrcyB0aGUgY291bnQgdG8gNSBiaXRzIGFuZAotICAvLyBzaHJkIGlzIHVuZGVmaW5lZCB3aXRoIGNvdW50ID4gb3BlcmFuZCBzaXplICgzMikKLSAgLy8gVE9ETyhmc2NobmVpZGVyKTogU3VwcG9ydCBzaGlmdCBjb3VudHMgPiAzMSB3aXRob3V0IGRlb3B0aW1pemF0aW9uLgotICBfXyBTbWlVbnRhZyhFQ1gpOwotICBpZiAoaGFzX3NoaWZ0X2NvdW50X2NoZWNrKCkpIHsKLSAgICBfXyBjbXBsKEVDWCwgSW1tZWRpYXRlKGtNaW50U2hpZnRDb3VudExpbWl0KSk7Ci0gICAgX18gaihBQk9WRSwgZGVvcHQpOwotICB9Ci0gIHN3aXRjaCAob3Bfa2luZCgpKSB7Ci0gICAgY2FzZSBUb2tlbjo6a1NIUjogewotICAgICAgX18gc2hyZChsZWZ0X2xvLCBsZWZ0X2hpKTsgIC8vIFNoaWZ0IGNvdW50IGluIENMLgotICAgICAgX18gc2FybChsZWZ0X2hpLCBFQ1gpOyAgLy8gU2hpZnQgY291bnQgaW4gQ0wuCi0gICAgICBicmVhazsKKyAgaWYgKGxvY3MoKS0+aW4oMSkuSXNDb25zdGFudCgpKSB7CisgICAgLy8gQ29kZSBmb3IgYSBjb25zdGFudCBzaGlmdCBhbW91bnQuCisgICAgQVNTRVJUKGxvY3MoKS0+aW4oMSkuY29uc3RhbnQoKS5Jc1NtaSgpKTsKKyAgICBjb25zdCBpbnQzMl90IHNoaWZ0ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Pihsb2NzKCktPmluKDEpLmNvbnN0YW50KCkucmF3KCkpID4+IDE7CisgICAgaWYgKChzaGlmdCA8IDApIHx8IChzaGlmdCA+IGtNaW50U2hpZnRDb3VudExpbWl0KSkgeworICAgICAgX18gam1wKGRlb3B0KTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0ID09IDApIHsKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIHplcm8gc2hpZnQgYW1vdW50LgorICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjYXNlIFRva2VuOjprU0hMOiB7Ci0gICAgICBSZWdpc3RlciB0ZW1wMSA9IGxvY3MoKS0+dGVtcCgwKS5yZWcoKTsKLSAgICAgIF9fIG1vdmwodGVtcDEsIGxlZnRfbG8pOyAgLy8gTG93IDMyIGJpdHMuCi0gICAgICBpZiAoY2FuX292ZXJmbG93KCkpIHsKLSAgICAgICAgUmVnaXN0ZXIgdGVtcDIgPSBsb2NzKCktPnRlbXAoMSkucmVnKCk7Ci0gICAgICAgIF9fIG1vdmwodGVtcDIsIGxlZnRfaGkpOyAgLy8gSGlnaCAzMiBiaXRzLgotICAgICAgICBfXyBzaGxsKGxlZnRfbG8sIEVDWCk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KLSAgICAgICAgX18gc2hsZChsZWZ0X2hpLCB0ZW1wMSk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KLSAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93IGJ5IHNoaWZ0aW5nIGJhY2sgdGhlIGhpZ2ggMzIgYml0cwotICAgICAgICAvLyBhbmQgY29tcGFyaW5nIHdpdGggdGhlIGlucHV0LgotICAgICAgICBfXyBtb3ZsKHRlbXAxLCB0ZW1wMik7Ci0gICAgICAgIF9fIG1vdmwodGVtcDIsIGxlZnRfaGkpOwotICAgICAgICBfXyBzYXJsKHRlbXAyLCBFQ1gpOwotICAgICAgICBfXyBjbXBsKHRlbXAxLCB0ZW1wMik7Ci0gICAgICAgIF9fIGooTk9UX0VRVUFMLCBkZW9wdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBfXyBzaGxsKGxlZnRfbG8sIEVDWCk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KLSAgICAgICAgX18gc2hsZChsZWZ0X2hpLCB0ZW1wMSk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KKyAgICBzd2l0Y2ggKG9wX2tpbmQoKSkgeworICAgICAgY2FzZSBUb2tlbjo6a1NIUjogeworICAgICAgICBpZiAoc2hpZnQgPiAzMSkgeworICAgICAgICAgIF9fIG1vdmwobGVmdF9sbywgbGVmdF9oaSk7ICAvLyBTaGlmdCBieSAzMi4KKyAgICAgICAgICBfXyBzYXJsKGxlZnRfaGksIEltbWVkaWF0ZSgzMSkpOyAgLy8gU2lnbiBleHRlbmQgbGVmdCBoaS4KKyAgICAgICAgICBpZiAoc2hpZnQgPiAzMikgeworICAgICAgICAgICAgX18gc2FybChsZWZ0X2xvLCBJbW1lZGlhdGUoc2hpZnQgLSAzMikpOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfXyBzaHJkKGxlZnRfbG8sIGxlZnRfaGksIEltbWVkaWF0ZShzaGlmdCkpOworICAgICAgICAgIF9fIHNhcmwobGVmdF9oaSwgSW1tZWRpYXRlKHNoaWZ0KSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBicmVhazsKKyAgICAgIGNhc2UgVG9rZW46OmtTSEw6IHsKKyAgICAgICAgaWYgKGNhbl9vdmVyZmxvdygpKSB7CisgICAgICAgICAgUmVnaXN0ZXIgdGVtcDEgPSBsb2NzKCktPnRlbXAoMCkucmVnKCk7CisgICAgICAgICAgUmVnaXN0ZXIgdGVtcDIgPSBsb2NzKCktPnRlbXAoMSkucmVnKCk7CisgICAgICAgICAgX18gbW92bCh0ZW1wMSwgbGVmdF9oaSk7ICAvLyBQcmVzZXJ2ZSBoaWdoIDMyIGJpdHMuCisgICAgICAgICAgaWYgKHNoaWZ0ID4gMzEpIHsKKyAgICAgICAgICAgIF9fIG1vdmwobGVmdF9oaSwgbGVmdF9sbyk7ICAvLyBTaGlmdCBieSAzMi4KKyAgICAgICAgICAgIF9fIHhvcmwobGVmdF9sbywgbGVmdF9sbyk7ICAvLyBaZXJvIGxlZnRfbG8uCisgICAgICAgICAgICBpZiAoc2hpZnQgPiAzMikgeworICAgICAgICAgICAgICBfXyBzaGxsKGxlZnRfaGksIEltbWVkaWF0ZShzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cgYnkgc2lnbiBleHRlbmRpbmcgdGhlIGhpZ2ggMzIgYml0cworICAgICAgICAgICAgLy8gYW5kIGNvbXBhcmluZyB3aXRoIHRoZSBpbnB1dC4KKyAgICAgICAgICAgIF9fIG1vdmwodGVtcDIsIGxlZnRfaGkpOworICAgICAgICAgICAgX18gc2FybCh0ZW1wMiwgSW1tZWRpYXRlKDMxKSk7CisgICAgICAgICAgICBfXyBjbXBsKHRlbXAxLCB0ZW1wMik7CisgICAgICAgICAgICBfXyBqKE5PVF9FUVVBTCwgZGVvcHQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfXyBzaGxkKGxlZnRfaGksIGxlZnRfbG8sIEltbWVkaWF0ZShzaGlmdCkpOworICAgICAgICAgICAgX18gc2hsbChsZWZ0X2xvLCBJbW1lZGlhdGUoc2hpZnQpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBieSBzaGlmdGluZyBiYWNrIHRoZSBoaWdoIDMyIGJpdHMKKyAgICAgICAgICAgIC8vIGFuZCBjb21wYXJpbmcgd2l0aCB0aGUgaW5wdXQuCisgICAgICAgICAgICBfXyBtb3ZsKHRlbXAyLCBsZWZ0X2hpKTsKKyAgICAgICAgICAgIF9fIHNhcmwodGVtcDIsIEltbWVkaWF0ZShzaGlmdCkpOworICAgICAgICAgICAgX18gY21wbCh0ZW1wMSwgdGVtcDIpOworICAgICAgICAgICAgX18gaihOT1RfRVFVQUwsIGRlb3B0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKHNoaWZ0ID4gMzEpIHsKKyAgICAgICAgICAgIF9fIG1vdmwobGVmdF9oaSwgbGVmdF9sbyk7ICAvLyBTaGlmdCBieSAzMi4KKyAgICAgICAgICAgIF9fIHhvcmwobGVmdF9sbywgbGVmdF9sbyk7ICAvLyBaZXJvIGxlZnRfbG8uCisgICAgICAgICAgICBpZiAoc2hpZnQgPiAzMikgeworICAgICAgICAgICAgICBfXyBzaGxsKGxlZnRfaGksIEltbWVkaWF0ZShzaGlmdCAtIDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fIHNobGQobGVmdF9oaSwgbGVmdF9sbywgSW1tZWRpYXRlKHNoaWZ0KSk7CisgICAgICAgICAgICBfXyBzaGxsKGxlZnRfbG8sIEltbWVkaWF0ZShzaGlmdCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIFVOUkVBQ0hBQkxFKCk7CisgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgVU5SRUFDSEFCTEUoKTsKLSAgICAgIGJyZWFrOworICB9IGVsc2UgeworICAgIC8vIENvZGUgZm9yIGEgdmFyaWFibGUgc2hpZnQgYW1vdW50LgorICAgIC8vIERlb3B0aW1pemUgaWYgc2hpZnQgY291bnQgaXMgPiA2My4KKyAgICAvLyBzYXJsIG9wZXJhdGlvbiBtYXNrcyB0aGUgY291bnQgdG8gNSBiaXRzIGFuZAorICAgIC8vIHNocmQgaXMgdW5kZWZpbmVkIHdpdGggY291bnQgPiBvcGVyYW5kIHNpemUgKDMyKQorICAgIF9fIFNtaVVudGFnKEVDWCk7CisgICAgaWYgKGhhc19zaGlmdF9jb3VudF9jaGVjaygpKSB7CisgICAgICBfXyBjbXBsKEVDWCwgSW1tZWRpYXRlKGtNaW50U2hpZnRDb3VudExpbWl0KSk7CisgICAgICBfXyBqKEFCT1ZFLCBkZW9wdCk7CisgICAgfQorICAgIExhYmVsIGRvbmUsIGxhcmdlX3NoaWZ0OworICAgIHN3aXRjaCAob3Bfa2luZCgpKSB7CisgICAgICBjYXNlIFRva2VuOjprU0hSOiB7CisgICAgICAgIF9fIGNtcGwoRUNYLCBJbW1lZGlhdGUoMzEpKTsKKyAgICAgICAgX18gaihBQk9WRSwgJmxhcmdlX3NoaWZ0KTsKKworICAgICAgICBfXyBzaHJkKGxlZnRfbG8sIGxlZnRfaGkpOyAgLy8gU2hpZnQgY291bnQgaW4gQ0wuCisgICAgICAgIF9fIHNhcmwobGVmdF9oaSwgRUNYKTsgIC8vIFNoaWZ0IGNvdW50IGluIENMLgorICAgICAgICBfXyBqbXAoJmRvbmUsIEFzc2VtYmxlcjo6a05lYXJKdW1wKTsKKworICAgICAgICBfXyBCaW5kKCZsYXJnZV9zaGlmdCk7CisgICAgICAgIF9fIHN1YmwoRUNYLCBJbW1lZGlhdGUoMzIpKTsKKyAgICAgICAgX18gbW92bChsZWZ0X2xvLCBsZWZ0X2hpKTsgIC8vIFNoaWZ0IGJ5IDMyLgorICAgICAgICBfXyBzYXJsKGxlZnRfaGksIEltbWVkaWF0ZSgzMSkpOyAgLy8gU2lnbiBleHRlbmQgbGVmdCBoaS4KKyAgICAgICAgX18gc2FybChsZWZ0X2xvLCBFQ1gpOyAgLy8gU2hpZnQgY291bnQgLSAzMiBpbiBDTC4KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFRva2VuOjprU0hMOiB7CisgICAgICAgIGlmIChjYW5fb3ZlcmZsb3coKSkgeworICAgICAgICAgIFJlZ2lzdGVyIHRlbXAxID0gbG9jcygpLT50ZW1wKDApLnJlZygpOworICAgICAgICAgIFJlZ2lzdGVyIHRlbXAyID0gbG9jcygpLT50ZW1wKDEpLnJlZygpOworICAgICAgICAgIF9fIG1vdmwodGVtcDEsIGxlZnRfaGkpOyAgLy8gUHJlc2VydmUgaGlnaCAzMiBiaXRzLgorICAgICAgICAgIF9fIGNtcGwoRUNYLCBJbW1lZGlhdGUoMzEpKTsKKyAgICAgICAgICBfXyBqKEFCT1ZFLCAmbGFyZ2Vfc2hpZnQpOworCisgICAgICAgICAgX18gc2hsZChsZWZ0X2hpLCBsZWZ0X2xvKTsgIC8vIFNoaWZ0IGNvdW50IGluIENMLgorICAgICAgICAgIF9fIHNobGwobGVmdF9sbywgRUNYKTsgIC8vIFNoaWZ0IGNvdW50IGluIENMLgorICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBieSBzaGlmdGluZyBiYWNrIHRoZSBoaWdoIDMyIGJpdHMKKyAgICAgICAgICAvLyBhbmQgY29tcGFyaW5nIHdpdGggdGhlIGlucHV0LgorICAgICAgICAgIF9fIG1vdmwodGVtcDIsIGxlZnRfaGkpOworICAgICAgICAgIF9fIHNhcmwodGVtcDIsIEVDWCk7CisgICAgICAgICAgX18gY21wbCh0ZW1wMSwgdGVtcDIpOworICAgICAgICAgIF9fIGooTk9UX0VRVUFMLCBkZW9wdCk7CisgICAgICAgICAgX18gam1wKCZkb25lLCBBc3NlbWJsZXI6OmtOZWFySnVtcCk7CisKKyAgICAgICAgICBfXyBCaW5kKCZsYXJnZV9zaGlmdCk7CisgICAgICAgICAgX18gc3VibChFQ1gsIEltbWVkaWF0ZSgzMikpOworICAgICAgICAgIF9fIG1vdmwobGVmdF9oaSwgbGVmdF9sbyk7ICAvLyBTaGlmdCBieSAzMi4KKyAgICAgICAgICBfXyB4b3JsKGxlZnRfbG8sIGxlZnRfbG8pOyAgLy8gWmVybyBsZWZ0X2xvLgorICAgICAgICAgIF9fIHNobGwobGVmdF9oaSwgRUNYKTsgIC8vIFNoaWZ0IGNvdW50IGluIENMLgorICAgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdyBieSBzaWduIGV4dGVuZGluZyB0aGUgaGlnaCAzMiBiaXRzCisgICAgICAgICAgLy8gYW5kIGNvbXBhcmluZyB3aXRoIHRoZSBpbnB1dC4KKyAgICAgICAgICBfXyBtb3ZsKHRlbXAyLCBsZWZ0X2hpKTsKKyAgICAgICAgICBfXyBzYXJsKHRlbXAyLCBJbW1lZGlhdGUoMzEpKTsKKyAgICAgICAgICBfXyBjbXBsKHRlbXAxLCB0ZW1wMik7CisgICAgICAgICAgX18gaihOT1RfRVFVQUwsIGRlb3B0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBfXyBjbXBsKEVDWCwgSW1tZWRpYXRlKDMxKSk7CisgICAgICAgICAgX18gaihBQk9WRSwgJmxhcmdlX3NoaWZ0KTsKKworICAgICAgICAgIF9fIHNobGQobGVmdF9oaSwgbGVmdF9sbyk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KKyAgICAgICAgICBfXyBzaGxsKGxlZnRfbG8sIEVDWCk7ICAvLyBTaGlmdCBjb3VudCBpbiBDTC4KKyAgICAgICAgICBfXyBqbXAoJmRvbmUsIEFzc2VtYmxlcjo6a05lYXJKdW1wKTsKKworICAgICAgICAgIF9fIEJpbmQoJmxhcmdlX3NoaWZ0KTsKKyAgICAgICAgICBfXyBzdWJsKEVDWCwgSW1tZWRpYXRlKDMyKSk7CisgICAgICAgICAgX18gbW92bChsZWZ0X2hpLCBsZWZ0X2xvKTsgIC8vIFNoaWZ0IGJ5IDMyLgorICAgICAgICAgIF9fIHhvcmwobGVmdF9sbywgbGVmdF9sbyk7ICAvLyBaZXJvIGxlZnRfbG8uCisgICAgICAgICAgX18gc2hsbChsZWZ0X2hpLCBFQ1gpOyAgLy8gU2hpZnQgY291bnQgaW4gQ0wuCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBVTlJFQUNIQUJMRSgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgX18gQmluZCgmZG9uZSk7CiAgIH0KICAgaWYgKEZMQUdfdGhyb3dfb25famF2YXNjcmlwdF9pbnRfb3ZlcmZsb3cpIHsKICAgICBFbWl0SmF2YXNjcmlwdEludE92ZXJmbG93Q2hlY2soY29tcGlsZXIsIGRlb3B0LCBsZWZ0X2xvLCBsZWZ0X2hpKTsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vaW50ZXJtZWRpYXRlX2xhbmd1YWdlX3g2NC5jYyBiL3J1bnRpbWUvdm0vaW50ZXJtZWRpYXRlX2xhbmd1YWdlX3g2NC5jYwppbmRleCAxMTk5NzZlLi4zNmRmMjhlIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL2ludGVybWVkaWF0ZV9sYW5ndWFnZV94NjQuY2MKKysrIGIvcnVudGltZS92bS9pbnRlcm1lZGlhdGVfbGFuZ3VhZ2VfeDY0LmNjCkBAIC04NzIsOSArODcyLDIxIEBACiAKIAogdm9pZCBMb2FkQ2xhc3NJZEluc3RyOjpFbWl0TmF0aXZlQ29kZShGbG93R3JhcGhDb21waWxlciogY29tcGlsZXIpIHsKLSAgUmVnaXN0ZXIgb2JqZWN0ID0gbG9jcygpLT5pbigwKS5yZWcoKTsKLSAgUmVnaXN0ZXIgcmVzdWx0ID0gbG9jcygpLT5vdXQoMCkucmVnKCk7Ci0gIF9fIExvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkocmVzdWx0LCBvYmplY3QpOworICBjb25zdCBSZWdpc3RlciBvYmplY3QgPSBsb2NzKCktPmluKDApLnJlZygpOworICBjb25zdCBSZWdpc3RlciByZXN1bHQgPSBsb2NzKCktPm91dCgwKS5yZWcoKTsKKyAgTGFiZWwgbG9hZCwgZG9uZTsKKworICAvLyBXZSBkb24ndCB1c2UgQXNzZW1ibGVyOjpMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKCkgaGVyZS0tLXdoaWNoIHVzZXMKKyAgLy8gYSBjb25kaXRpb25hbCBtb3ZlIGluc3RlYWQtLS1iZWNhdXNlIGl0IGlzIHNsb3dlciwgcHJvYmFibHkgZHVlIHRvCisgIC8vIGJyYW5jaCBwcmVkaWN0aW9uIHVzdWFsbHkgd29ya2luZyBqdXN0IGZpbmUgaW4gdGhpcyBjYXNlLgorICBfXyB0ZXN0cShvYmplY3QsIEltbWVkaWF0ZShrU21pVGFnTWFzaykpOworICBfXyBqKE5PVF9aRVJPLCAmbG9hZCwgQXNzZW1ibGVyOjprTmVhckp1bXApOworICBfXyBMb2FkSW1tZWRpYXRlKHJlc3VsdCwgSW1tZWRpYXRlKFNtaTo6UmF3VmFsdWUoa1NtaUNpZCkpLCBQUCk7CisgIF9fIGptcCgmZG9uZSk7CisgIF9fIEJpbmQoJmxvYWQpOworICBfXyBMb2FkQ2xhc3NJZChyZXN1bHQsIG9iamVjdCk7CisgIF9fIFNtaVRhZyhyZXN1bHQpOworICBfXyBCaW5kKCZkb25lKTsKIH0KIAogCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL2lzb2xhdGUuY2MgYi9ydW50aW1lL3ZtL2lzb2xhdGUuY2MKaW5kZXggZTFlNTI3Zi4uNmM5YWMzMSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9pc29sYXRlLmNjCisrKyBiL3J1bnRpbWUvdm0vaXNvbGF0ZS5jYwpAQCAtMzQ1LDYgKzM0NSwxMSBAQAogICAgIC8vIEludm9rZSB0aGUgaXNvbGF0ZSdzIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyLCBpZiBpdCBleGlzdHMuCiAgICAgY29uc3QgVW5oYW5kbGVkRXhjZXB0aW9uJiBlcnJvciA9IFVuaGFuZGxlZEV4Y2VwdGlvbjo6Q2FzdChyZXN1bHQpOwogICAgIFJhd0luc3RhbmNlKiBleGNlcHRpb24gPSBlcnJvci5leGNlcHRpb24oKTsKKyAgICBpZiAoKGV4Y2VwdGlvbiA9PSBJLT5vYmplY3Rfc3RvcmUoKS0+b3V0X29mX21lbW9yeSgpKSB8fAorICAgICAgICAoZXhjZXB0aW9uID09IEktPm9iamVjdF9zdG9yZSgpLT5zdGFja19vdmVyZmxvdygpKSkgeworICAgICAgLy8gV2UgZGlkbid0IG5vdGlmeSB0aGUgZGVidWdnZXIgd2hlbiB0aGUgc3RhY2sgd2FzIGZ1bGwuIERvIGl0IG5vdy4KKyAgICAgIEktPmRlYnVnZ2VyKCktPlNpZ25hbEV4Y2VwdGlvblRocm93bihJbnN0YW5jZTo6SGFuZGxlKGV4Y2VwdGlvbikpOworICAgIH0KICAgICBpZiAoKGV4Y2VwdGlvbiAhPSBJLT5vYmplY3Rfc3RvcmUoKS0+b3V0X29mX21lbW9yeSgpKSAmJgogICAgICAgICAoZXhjZXB0aW9uICE9IEktPm9iamVjdF9zdG9yZSgpLT5zdGFja19vdmVyZmxvdygpKSkgewogICAgICAgaWYgKFVuaGFuZGxlZEV4Y2VwdGlvbkNhbGxiYWNrSGFuZGxlcihtZXNzYWdlLCBlcnJvcikpIHsKZGlmZiAtLWdpdCBhL3J1bnRpbWUvdm0vb2JqZWN0LmNjIGIvcnVudGltZS92bS9vYmplY3QuY2MKaW5kZXggY2U0ZjQ1MC4uYWU2OWUzOCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9vYmplY3QuY2MKKysrIGIvcnVudGltZS92bS9vYmplY3QuY2MKQEAgLTI3NDMsNTEgKzI3NDMsMzcgQEAKIH0KIAogCi1zdGF0aWMgUmF3UGF0Y2hDbGFzcyogTWFrZVRlbXBQYXRjaENsYXNzKGNvbnN0IENsYXNzJiBjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZyYgZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIGZvcm1hbF9wYXJhbXMpIHsKK3N0YXRpYyBSYXdGdW5jdGlvbiogRXZhbHVhdGVIZWxwZXIoY29uc3QgQ2xhc3MmIGNscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nJiBleHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheSYgcGFyYW1fbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc3RhdGljKSB7CiAgIGNvbnN0IFN0cmluZyYgZnVuY19zcmMgPQotICAgICAgU3RyaW5nOjpIYW5kbGUoQnVpbGRDbG9zdXJlU291cmNlKGZvcm1hbF9wYXJhbXMsIGV4cHIpKTsKKyAgICAgIFN0cmluZzo6SGFuZGxlKEJ1aWxkQ2xvc3VyZVNvdXJjZShwYXJhbV9uYW1lcywgZXhwcikpOwogICBTY3JpcHQmIHNjcmlwdCA9IFNjcmlwdDo6SGFuZGxlKCk7CiAgIHNjcmlwdCA9IFNjcmlwdDo6TmV3KFN5bWJvbHM6OkVtcHR5KCksIGZ1bmNfc3JjLCBSYXdTY3JpcHQ6OmtTb3VyY2VUYWcpOwogICAvLyBJbiBvcmRlciB0byB0b2tlbml6ZSB0aGUgc291cmNlLCB3ZSBuZWVkIHRvIGdldCB0aGUga2V5IHRvIG1hbmdsZQotICAvLyBwcml2YXRlIG5hbWVzIGZyb20gdGhlIGxpYnJhcnkgZnJvbSB3aGljaCB0aGUgb2JqZWN0J3MgY2xhc3MKLSAgLy8gb3JpZ2luYXRlcy4KKyAgLy8gcHJpdmF0ZSBuYW1lcyBmcm9tIHRoZSBsaWJyYXJ5IGZyb20gd2hpY2ggdGhlIGNsYXNzIG9yaWdpbmF0ZXMuCiAgIGNvbnN0IExpYnJhcnkmIGxpYiA9IExpYnJhcnk6OkhhbmRsZShjbHMubGlicmFyeSgpKTsKICAgQVNTRVJUKCFsaWIuSXNOdWxsKCkpOwogICBjb25zdCBTdHJpbmcmIGxpYl9rZXkgPSBTdHJpbmc6OkhhbmRsZShsaWIucHJpdmF0ZV9rZXkoKSk7CiAgIHNjcmlwdC5Ub2tlbml6ZShsaWJfa2V5KTsKIAotICBjb25zdCBTdHJpbmcmIHNyY19jbGFzc19uYW1lID0gU3RyaW5nOjpIYW5kbGUoU3ltYm9sczo6TmV3KCI6aW50ZXJuYWwiKSk7Ci0gIGNvbnN0IENsYXNzJiBzcmNfY2xhc3MgPSBDbGFzczo6SGFuZGxlKAotICAgICAgQ2xhc3M6Ok5ldyhzcmNfY2xhc3NfbmFtZSwgc2NyaXB0LCBTY2FubmVyOjprTm9Tb3VyY2VQb3MpKTsKLSAgc3JjX2NsYXNzLnNldF9pc19maW5hbGl6ZWQoKTsKLSAgc3JjX2NsYXNzLnNldF9saWJyYXJ5KGxpYik7Ci0gIHJldHVybiBQYXRjaENsYXNzOjpOZXcoY2xzLCBzcmNfY2xhc3MpOworICBjb25zdCBGdW5jdGlvbiYgZnVuYyA9IEZ1bmN0aW9uOjpIYW5kbGUoCisgICAgICAgRnVuY3Rpb246Ok5ld0V2YWxGdW5jdGlvbihjbHMsIHNjcmlwdCwgaXNfc3RhdGljKSk7CisgIGZ1bmMuc2V0X3Jlc3VsdF90eXBlKFR5cGU6OkhhbmRsZShUeXBlOjpEeW5hbWljVHlwZSgpKSk7CisgIGNvbnN0IGludHB0cl90IG51bV9pbXBsaWNpdF9wYXJhbXMgPSBpc19zdGF0aWMgPyAwIDogMTsKKyAgZnVuYy5zZXRfbnVtX2ZpeGVkX3BhcmFtZXRlcnMobnVtX2ltcGxpY2l0X3BhcmFtcyArIHBhcmFtX25hbWVzLkxlbmd0aCgpKTsKKyAgZnVuYy5TZXROdW1PcHRpb25hbFBhcmFtZXRlcnMoMCwgdHJ1ZSk7CisgIGZ1bmMuU2V0SXNPcHRpbWl6YWJsZShmYWxzZSk7CisgIHJldHVybiBmdW5jLnJhdygpOwogfQogCiAKIFJhd09iamVjdCogQ2xhc3M6OkV2YWx1YXRlKGNvbnN0IFN0cmluZyYgZXhwciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBwYXJhbV9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFycmF5JiBwYXJhbV92YWx1ZXMpIGNvbnN0IHsKLSAgY29uc3QgUGF0Y2hDbGFzcyYgdGVtcF9jbGFzcyA9Ci0gICAgICBQYXRjaENsYXNzOjpIYW5kbGUoTWFrZVRlbXBQYXRjaENsYXNzKCp0aGlzLCBleHByLCBwYXJhbV9uYW1lcykpOwotICBjb25zdCBTdHJpbmcmIGV2YWxfZnVuY19uYW1lID0gU3RyaW5nOjpIYW5kbGUoU3ltYm9sczo6TmV3KCI6ZXZhbCIpKTsKICAgY29uc3QgRnVuY3Rpb24mIGV2YWxfZnVuYyA9Ci0gICAgICBGdW5jdGlvbjo6SGFuZGxlKEZ1bmN0aW9uOjpOZXcoZXZhbF9mdW5jX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3RnVuY3Rpb246OmtSZWd1bGFyRnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgICAvLyBTdGF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgY29uc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgYWJzdHJhY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgZXh0ZXJuYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgbmF0aXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOwotICBldmFsX2Z1bmMuc2V0X3Jlc3VsdF90eXBlKFR5cGU6OkhhbmRsZShUeXBlOjpEeW5hbWljVHlwZSgpKSk7Ci0gIGV2YWxfZnVuYy5zZXRfbnVtX2ZpeGVkX3BhcmFtZXRlcnMocGFyYW1fbmFtZXMuTGVuZ3RoKCkpOwotICBldmFsX2Z1bmMuU2V0TnVtT3B0aW9uYWxQYXJhbWV0ZXJzKDAsIHRydWUpOwotICBldmFsX2Z1bmMuU2V0SXNPcHRpbWl6YWJsZShmYWxzZSk7Ci0KKyAgICAgIEZ1bmN0aW9uOjpIYW5kbGUoRXZhbHVhdGVIZWxwZXIoKnRoaXMsIGV4cHIsIHBhcmFtX25hbWVzLCB0cnVlKSk7CiAgIGNvbnN0IE9iamVjdCYgcmVzdWx0ID0KICAgICAgIE9iamVjdDo6SGFuZGxlKERhcnRFbnRyeTo6SW52b2tlRnVuY3Rpb24oZXZhbF9mdW5jLCBwYXJhbV92YWx1ZXMpKTsKICAgcmV0dXJuIHJlc3VsdC5yYXcoKTsKQEAgLTUwNzMsNiArNTA1OSwyMiBAQAogfQogCiAKK1Jhd1NjcmlwdCogRnVuY3Rpb246OmV2YWxfc2NyaXB0KCkgY29uc3QgeworICBjb25zdCBPYmplY3QmIG9iaiA9IE9iamVjdDo6SGFuZGxlKHJhd19wdHIoKS0+ZGF0YV8pOworICBpZiAob2JqLklzU2NyaXB0KCkpIHsKKyAgICByZXR1cm4gU2NyaXB0OjpDYXN0KG9iaikucmF3KCk7CisgIH0KKyAgcmV0dXJuIFNjcmlwdDo6bnVsbCgpOworfQorCisKK3ZvaWQgRnVuY3Rpb246OnNldF9ldmFsX3NjcmlwdChjb25zdCBTY3JpcHQmIHNjcmlwdCkgY29uc3QgeworICBBU1NFUlQodG9rZW5fcG9zKCkgPT0gMCk7CisgIEFTU0VSVChyYXdfcHRyKCktPmRhdGFfID09IE9iamVjdDo6bnVsbCgpKTsKKyAgc2V0X2RhdGEoc2NyaXB0KTsKK30KKworCiBSYXdGdW5jdGlvbiogRnVuY3Rpb246OmV4dHJhY3RlZF9tZXRob2RfY2xvc3VyZSgpIGNvbnN0IHsKICAgQVNTRVJUKGtpbmQoKSA9PSBSYXdGdW5jdGlvbjo6a01ldGhvZEV4dHJhY3Rvcik7CiAgIGNvbnN0IE9iamVjdCYgb2JqID0gT2JqZWN0OjpIYW5kbGUocmF3X3B0cigpLT5kYXRhXyk7CkBAIC01MTQ5LDEzICs1MTUxLDE1IEBACiAgICAgcmV0dXJuIEZ1bmN0aW9uOjpudWxsKCk7CiAgIH0KICAgY29uc3QgT2JqZWN0JiBvYmogPSBPYmplY3Q6OkhhbmRsZShyYXdfcHRyKCktPmRhdGFfKTsKLSAgQVNTRVJUKG9iai5Jc051bGwoKSB8fCBvYmouSXNGdW5jdGlvbigpKTsKLSAgcmV0dXJuIChvYmouSXNOdWxsKCkpID8gRnVuY3Rpb246Om51bGwoKSA6IEZ1bmN0aW9uOjpDYXN0KG9iaikucmF3KCk7CisgIEFTU0VSVChvYmouSXNOdWxsKCkgfHwgb2JqLklzU2NyaXB0KCkgfHwgb2JqLklzRnVuY3Rpb24oKSk7CisgIHJldHVybiAob2JqLklzTnVsbCgpIHx8IG9iai5Jc1NjcmlwdCgpKSA/IEZ1bmN0aW9uOjpudWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRnVuY3Rpb246OkNhc3Qob2JqKS5yYXcoKTsKIH0KIAogCiB2b2lkIEZ1bmN0aW9uOjpzZXRfaW1wbGljaXRfY2xvc3VyZV9mdW5jdGlvbihjb25zdCBGdW5jdGlvbiYgdmFsdWUpIGNvbnN0IHsKICAgQVNTRVJUKCFJc0Nsb3N1cmVGdW5jdGlvbigpICYmICFJc1NpZ25hdHVyZUZ1bmN0aW9uKCkpOworICBBU1NFUlQocmF3X3B0cigpLT5kYXRhXyA9PSBPYmplY3Q6Om51bGwoKSk7CiAgIHNldF9kYXRhKHZhbHVlKTsKIH0KIApAQCAtNjA3OSwxMSArNjA4MywyOCBAQAogICAgICAgICAgICAgICAgICAgICBwYXJlbnRfb3duZXIsCiAgICAgICAgICAgICAgICAgICAgIHRva2VuX3BvcykpOwogICByZXN1bHQuc2V0X3BhcmVudF9mdW5jdGlvbihwYXJlbnQpOwotCiAgIHJldHVybiByZXN1bHQucmF3KCk7CiB9CiAKIAorUmF3RnVuY3Rpb24qIEZ1bmN0aW9uOjpOZXdFdmFsRnVuY3Rpb24oY29uc3QgQ2xhc3MmIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NyaXB0JiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3N0YXRpYykgeworICBjb25zdCBGdW5jdGlvbiYgcmVzdWx0ID0gRnVuY3Rpb246OkhhbmRsZSgKKyAgICAgIEZ1bmN0aW9uOjpOZXcoU3RyaW5nOjpIYW5kbGUoU3ltYm9sczo6TmV3KCI6RXZhbCIpKSwKKyAgICAgICAgICAgICAgICAgICAgUmF3RnVuY3Rpb246OmtSZWd1bGFyRnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGlzX3N0YXRpYywKKyAgICAgICAgICAgICAgICAgICAgLyogaXNfY29uc3QgPSAqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyogaXNfYWJzdHJhY3QgPSAqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyogaXNfZXh0ZXJuYWwgPSAqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgLyogaXNfbmF0aXZlID0gKi8gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIG93bmVyLAorICAgICAgICAgICAgICAgICAgICAwKSk7CisgIEFTU0VSVCghc2NyaXB0LklzTnVsbCgpKTsKKyAgcmVzdWx0LnNldF9ldmFsX3NjcmlwdChzY3JpcHQpOworICByZXR1cm4gcmVzdWx0LnJhdygpOworfQorCiBSYXdGdW5jdGlvbiogRnVuY3Rpb246OkltcGxpY2l0Q2xvc3VyZUZ1bmN0aW9uKCkgY29uc3QgewogICAvLyBSZXR1cm4gdGhlIGV4aXN0aW5nIGltcGxpY2l0IGNsb3N1cmUgZnVuY3Rpb24gaWYgYW55LgogICBpZiAoaW1wbGljaXRfY2xvc3VyZV9mdW5jdGlvbigpICE9IEZ1bmN0aW9uOjpudWxsKCkpIHsKQEAgLTYzNDksNiArNjM3MCwxNyBAQAogCiAKIFJhd1NjcmlwdCogRnVuY3Rpb246OnNjcmlwdCgpIGNvbnN0IHsKKyAgaWYgKHRva2VuX3BvcygpID09IDApIHsKKyAgICAvLyBUZXN0aW5nIGZvciBwb3NpdGlvbiAwIGlzIGFuIG9wdGltaXphdGlvbiB0aGF0IHJlbGllcyBvbiB0ZW1wb3JhcnkKKyAgICAvLyBldmFsIGZ1bmN0aW9ucyBoYXZpbmcgdG9rZW4gcG9zaXRpb24gMC4KKyAgICBjb25zdCBTY3JpcHQmIHNjcmlwdCA9IFNjcmlwdDo6SGFuZGxlKGV2YWxfc2NyaXB0KCkpOworICAgIGlmICghc2NyaXB0LklzTnVsbCgpKSB7CisgICAgICByZXR1cm4gc2NyaXB0LnJhdygpOworICAgIH0KKyAgfQorICBpZiAoSXNDbG9zdXJlRnVuY3Rpb24oKSkgeworICAgIHJldHVybiBGdW5jdGlvbjo6SGFuZGxlKHBhcmVudF9mdW5jdGlvbigpKS5zY3JpcHQoKTsKKyAgfQogICBjb25zdCBPYmplY3QmIG9iaiA9IE9iamVjdDo6SGFuZGxlKHJhd19wdHIoKS0+b3duZXJfKTsKICAgaWYgKG9iai5Jc0NsYXNzKCkpIHsKICAgICByZXR1cm4gQ2xhc3M6OkNhc3Qob2JqKS5zY3JpcHQoKTsKQEAgLTY2NjMsOSArNjY5NSw5IEBACiAgIGpzb2JqLkFkZFByb3BlcnR5KCJ1c2VyX25hbWUiLCBwcmV0dHlfbmFtZSk7CiAgIGlmIChjbHMuSXNUb3BMZXZlbCgpKSB7CiAgICAgY29uc3QgTGlicmFyeSYgbGlicmFyeSA9IExpYnJhcnk6OkhhbmRsZShjbHMubGlicmFyeSgpKTsKLSAgICBqc29iai5BZGRQcm9wZXJ0eSgib3duZXIiLCBsaWJyYXJ5KTsKKyAgICBqc29iai5BZGRQcm9wZXJ0eSgib3duaW5nTGlicmFyeSIsIGxpYnJhcnkpOwogICB9IGVsc2UgewotICAgIGpzb2JqLkFkZFByb3BlcnR5KCJvd25lciIsIGNscyk7CisgICAganNvYmouQWRkUHJvcGVydHkoIm93bmluZ0NsYXNzIiwgY2xzKTsKICAgfQogICBjb25zdCBGdW5jdGlvbiYgcGFyZW50ID0gRnVuY3Rpb246OkhhbmRsZShwYXJlbnRfZnVuY3Rpb24oKSk7CiAgIGlmICghcGFyZW50LklzTnVsbCgpKSB7CkBAIC05Mjc2LDE3ICs5MzA4LDI1IEBACiBSYXdPYmplY3QqIExpYnJhcnk6OkV2YWx1YXRlKGNvbnN0IFN0cmluZyYgZXhwciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIHBhcmFtX25hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcnJheSYgcGFyYW1fdmFsdWVzKSBjb25zdCB7Ci0gIC8vIE1ha2UgYSBmYWtlIHRvcC1sZXZlbCBjbGFzcyBhbmQgZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24KKyAgLy8gVGFrZSBvciBtYWtlIGEgZmFrZSB0b3AtbGV2ZWwgY2xhc3MgYW5kIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uCiAgIC8vIGFzIGEgc3RhdGljIGZ1bmN0aW9uIG9mIHRoZSBjbGFzcy4KLSAgU2NyaXB0JiBzY3JpcHQgPSBTY3JpcHQ6OkhhbmRsZSgpOwotICBzY3JpcHQgPSBTY3JpcHQ6Ok5ldyhTeW1ib2xzOjpFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xzOjpFbXB0eSgpLAotICAgICAgICAgICAgICAgICAgICAgICBSYXdTY3JpcHQ6OmtTb3VyY2VUYWcpOwotICBDbGFzcyYgdGVtcF9jbGFzcyA9Ci0gICAgICBDbGFzczo6SGFuZGxlKENsYXNzOjpOZXcoU3ltYm9sczo6VG9wTGV2ZWwoKSwgc2NyaXB0LCAwKSk7Ci0gIHRlbXBfY2xhc3Muc2V0X2xpYnJhcnkoKnRoaXMpOwotICB0ZW1wX2NsYXNzLnNldF9pc19maW5hbGl6ZWQoKTsKLSAgcmV0dXJuIHRlbXBfY2xhc3MuRXZhbHVhdGUoZXhwciwgcGFyYW1fbmFtZXMsIHBhcmFtX3ZhbHVlcyk7CisgIENsYXNzJiB0b3BfbGV2ZWxfY2xhc3MgPSBDbGFzczo6SGFuZGxlKCk7CisgIEFycmF5JiB0b3BfbGV2ZWxfY2xhc3NlcyA9IEFycmF5OjpIYW5kbGUoYW5vbnltb3VzX2NsYXNzZXMoKSk7CisgIGlmICh0b3BfbGV2ZWxfY2xhc3Nlcy5MZW5ndGgoKSA+IDApIHsKKyAgICB0b3BfbGV2ZWxfY2xhc3MgXj0gdG9wX2xldmVsX2NsYXNzZXMuQXQoMCk7CisgIH0gZWxzZSB7CisgICAgLy8gQSBsaWJyYXJ5IG1heSBoYXZlIG5vIHRvcC1sZXZlbCBjbGFzc2VzIGlmIGl0IGhhcyBubyB0b3AtbGV2ZWwKKyAgICAvLyB2YXJpYWJsZXMgb3IgbWV0aG9kcy4KKyAgICBTY3JpcHQmIHNjcmlwdCA9IFNjcmlwdDo6SGFuZGxlKFNjcmlwdDo6TmV3KFN5bWJvbHM6OkVtcHR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xzOjpFbXB0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3U2NyaXB0OjprU291cmNlVGFnKSk7CisgICAgdG9wX2xldmVsX2NsYXNzID0gQ2xhc3M6Ok5ldyhTeW1ib2xzOjpUb3BMZXZlbCgpLCBzY3JpcHQsIDApOworICAgIHRvcF9sZXZlbF9jbGFzcy5zZXRfaXNfZmluYWxpemVkKCk7CisgICAgdG9wX2xldmVsX2NsYXNzLnNldF9saWJyYXJ5KCp0aGlzKTsKKyAgICBBZGRBbm9ueW1vdXNDbGFzcyh0b3BfbGV2ZWxfY2xhc3MpOworICB9CisgIEFTU0VSVCh0b3BfbGV2ZWxfY2xhc3MuaXNfZmluYWxpemVkKCkpOworICByZXR1cm4gdG9wX2xldmVsX2NsYXNzLkV2YWx1YXRlKGV4cHIsIHBhcmFtX25hbWVzLCBwYXJhbV92YWx1ZXMpOwogfQogCiAKQEAgLTEwMjA1LDYgKzEwMjQ1LDcgQEAKICAgICBjYXNlIFJhd1BjRGVzY3JpcHRvcnM6OmtSdW50aW1lQ2FsbDogICAgIHJldHVybiAicnVudGltZS1jYWxsICI7CiAgICAgY2FzZSBSYXdQY0Rlc2NyaXB0b3JzOjprT3NyRW50cnk6ICAgICAgICByZXR1cm4gIm9zci1lbnRyeSAgICAiOwogICAgIGNhc2UgUmF3UGNEZXNjcmlwdG9yczo6a090aGVyOiAgICAgICAgICAgcmV0dXJuICJvdGhlciAgICAgICAgIjsKKyAgICBjYXNlIFJhd1BjRGVzY3JpcHRvcnM6OmtBbnlLaW5kOiAgICAgICAgIFVOUkVBQ0hBQkxFKCk7IGJyZWFrOwogICB9CiAgIFVOUkVBQ0hBQkxFKCk7CiAgIHJldHVybiAiIjsKQEAgLTEwMjMzLDcgKzEwMjc0LDcgQEAKICAgICAgICIlIy0qIiBQeCAiXHQlc1x0JSIgUGQgIlx0XHQlIiBQZCAiXHQlIiBQZCAiXG4iOwogICAvLyBGaXJzdCBjb21wdXRlIHRoZSBidWZmZXIgc2l6ZSByZXF1aXJlZC4KICAgaW50cHRyX3QgbGVuID0gMTsgIC8vIFRyYWlsaW5nICdcMCcuCi0gIEl0ZXJhdG9yIGl0ZXIoKnRoaXMpOworICBJdGVyYXRvciBpdGVyKCp0aGlzLCBSYXdQY0Rlc2NyaXB0b3JzOjprQW55S2luZCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7CiAgICAgbGVuICs9IE9TOjpTTlByaW50KE5VTEwsIDAsIGtGb3JtYXQsIGFkZHJfd2lkdGgsCkBAIC0xMDI0Nyw3ICsxMDI4OCw3IEBACiAgIGNoYXIqIGJ1ZmZlciA9IElzb2xhdGU6OkN1cnJlbnQoKS0+Y3VycmVudF96b25lKCktPkFsbG9jPGNoYXI+KGxlbik7CiAgIC8vIExheW91dCB0aGUgZmllbGRzIGluIHRoZSBidWZmZXIuCiAgIGludHB0cl90IGluZGV4ID0gMDsKLSAgSXRlcmF0b3IgaXRlcjIoKnRoaXMpOworICBJdGVyYXRvciBpdGVyMigqdGhpcywgUmF3UGNEZXNjcmlwdG9yczo6a0FueUtpbmQpOwogICB3aGlsZSAoaXRlcjIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyMi5OZXh0KCk7CiAgICAgaW5kZXggKz0gT1M6OlNOUHJpbnQoKGJ1ZmZlciArIGluZGV4KSwgKGxlbiAtIGluZGV4KSwga0Zvcm1hdCwgYWRkcl93aWR0aCwKQEAgLTEwMjY4LDcgKzEwMzA5LDcgQEAKICAgLy8gZ2VuZXJhdGUgYW4gSUQuIEN1cnJlbnRseSB3ZSBvbmx5IHByaW50IFBjRGVzY3JpcHRvcnMgaW5saW5lIHdpdGggYSBDb2RlLgogICBqc29iai0+QWRkUHJvcGVydHkoImlkIiwgIiIpOwogICBKU09OQXJyYXkgbWVtYmVycyhqc29iaiwgIm1lbWJlcnMiKTsKLSAgSXRlcmF0b3IgaXRlcigqdGhpcyk7CisgIEl0ZXJhdG9yIGl0ZXIoKnRoaXMsIFJhd1BjRGVzY3JpcHRvcnM6OmtBbnlLaW5kKTsKICAgd2hpbGUgKGl0ZXIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyLk5leHQoKTsKICAgICBKU09OT2JqZWN0IGRlc2NyaXB0b3IoJm1lbWJlcnMpOwpAQCAtMTAzMDYsMTYgKzEwMzQ3LDEyIEBACiAgIGlmICghZnVuY3Rpb24uSXNPcHRpbWl6YWJsZSgpKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIEl0ZXJhdG9yIGl0ZXIoKnRoaXMpOworICBJdGVyYXRvciBpdGVyKCp0aGlzLCBSYXdQY0Rlc2NyaXB0b3JzOjprRGVvcHQgfCBSYXdQY0Rlc2NyaXB0b3JzOjprSWNDYWxsKTsKICAgd2hpbGUgKGl0ZXIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyLk5leHQoKTsKICAgICBSYXdQY0Rlc2NyaXB0b3JzOjpLaW5kIGtpbmQgPSByZWMua2luZCgpOwogICAgIC8vICdkZW9wdF9pZCcgaXMgc2V0IGZvciBrRGVvcHQgYW5kIGtJY0NhbGwgYW5kIG11c3QgYmUgdW5pcXVlIGZvciBvbmUga2luZC4KICAgICBpbnRwdHJfdCBkZW9wdF9pZCA9IElzb2xhdGU6OmtOb0Rlb3B0SWQ7Ci0gICAgaWYgKChraW5kICE9IFJhd1BjRGVzY3JpcHRvcnM6OmtEZW9wdCkgfHwKLSAgICAgICAgKGtpbmQgIT0gUmF3UGNEZXNjcmlwdG9yczo6a0ljQ2FsbCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KIAogICAgIGRlb3B0X2lkID0gcmVjLmRlb3B0X2lkOwogICAgIGlmIChJc29sYXRlOjpJc0Rlb3B0QWZ0ZXIoZGVvcHRfaWQpKSB7CkBAIC0xMDMyNiw3ICsxMDM2Myw3IEBACiAgICAgfQogCiAgICAgSXRlcmF0b3IgbmVzdGVkKGl0ZXIpOwotICAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgeworICAgIHdoaWxlIChuZXN0ZWQuSGFzTmV4dCgpKSB7CiAgICAgICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIG5lc3RlZF9yZWMgPSBuZXN0ZWQuTmV4dCgpOwogICAgICAgaWYgKGtpbmQgPT0gbmVzdGVkX3JlYy5raW5kKCkpIHsKICAgICAgICAgaWYgKGRlb3B0X2lkICE9IElzb2xhdGU6OmtOb0Rlb3B0SWQpIHsKQEAgLTEwMzQwLDcgKzEwMzc3LDcgQEAKIAogCiB1d29yZCBQY0Rlc2NyaXB0b3JzOjpHZXRQY0ZvcktpbmQoUmF3UGNEZXNjcmlwdG9yczo6S2luZCBraW5kKSBjb25zdCB7Ci0gIEl0ZXJhdG9yIGl0ZXIoKnRoaXMpOworICBJdGVyYXRvciBpdGVyKCp0aGlzLCBSYXdQY0Rlc2NyaXB0b3JzOjprQW55S2luZCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7CiAgICAgaWYgKHJlYy5raW5kKCkgPT0ga2luZCkgewpAQCAtMTE4NDIsNyArMTE4NzksNyBAQAogCiBpbnRwdHJfdCBDb2RlOjpHZXRUb2tlbkluZGV4T2ZQQyh1d29yZCBwYykgY29uc3QgewogICBjb25zdCBQY0Rlc2NyaXB0b3JzJiBkZXNjcmlwdG9ycyA9IFBjRGVzY3JpcHRvcnM6OkhhbmRsZShwY19kZXNjcmlwdG9ycygpKTsKLSAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjcmlwdG9ycyk7CisgIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMsIFJhd1BjRGVzY3JpcHRvcnM6OmtBbnlLaW5kKTsKICAgd2hpbGUgKGl0ZXIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyLk5leHQoKTsKICAgICBpZiAocmVjLnBjID09IHBjKSB7CkBAIC0xMTg1NiwxMCArMTE4OTMsMTAgQEAKIHV3b3JkIENvZGU6OkdldFBjRm9yRGVvcHRJZChpbnRwdHJfdCBkZW9wdF9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdQY0Rlc2NyaXB0b3JzOjpLaW5kIGtpbmQpIGNvbnN0IHsKICAgY29uc3QgUGNEZXNjcmlwdG9ycyYgZGVzY3JpcHRvcnMgPSBQY0Rlc2NyaXB0b3JzOjpIYW5kbGUocGNfZGVzY3JpcHRvcnMoKSk7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMpOworICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzLCBraW5kKTsKICAgd2hpbGUgKGl0ZXIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyLk5leHQoKTsKLSAgICBpZiAoKHJlYy5kZW9wdF9pZCA9PSBkZW9wdF9pZCkgJiYgKHJlYy5raW5kKCkgPT0ga2luZCkpIHsKKyAgICBpZiAocmVjLmRlb3B0X2lkID09IGRlb3B0X2lkKSB7CiAgICAgICB1d29yZCBwYyA9IHJlYy5wYzsKICAgICAgIEFTU0VSVChDb250YWluc0luc3RydWN0aW9uQXQocGMpKTsKICAgICAgIHJldHVybiBwYzsKQEAgLTExODcxLDEwICsxMTkwOCwxMCBAQAogCiBpbnRwdHJfdCBDb2RlOjpHZXREZW9wdElkRm9yT3NyKHV3b3JkIHBjKSBjb25zdCB7CiAgIGNvbnN0IFBjRGVzY3JpcHRvcnMmIGRlc2NyaXB0b3JzID0gUGNEZXNjcmlwdG9yczo6SGFuZGxlKHBjX2Rlc2NyaXB0b3JzKCkpOwotICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzKTsKKyAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjcmlwdG9ycywgUmF3UGNEZXNjcmlwdG9yczo6a09zckVudHJ5KTsKICAgd2hpbGUgKGl0ZXIuSGFzTmV4dCgpKSB7CiAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPSBpdGVyLk5leHQoKTsKLSAgICBpZiAoKHJlYy5wYyA9PSBwYykgJiYgKHJlYy5raW5kKCkgPT0gUmF3UGNEZXNjcmlwdG9yczo6a09zckVudHJ5KSkgeworICAgIGlmIChyZWMucGMgPT0gcGMpIHsKICAgICAgIHJldHVybiByZWMuZGVvcHRfaWQ7CiAgICAgfQogICB9CkBAIC0xMjc2MiwyNCArMTI3OTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIHBhcmFtX25hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJyYXkmIHBhcmFtX3ZhbHVlcykgY29uc3QgewogICBjb25zdCBDbGFzcyYgY2xzID0gQ2xhc3M6OkhhbmRsZShjbGF6eigpKTsKLSAgY29uc3QgUGF0Y2hDbGFzcyYgdGVtcF9jbGFzcyA9IFBhdGNoQ2xhc3M6OkhhbmRsZSgKLSAgICAgIE1ha2VUZW1wUGF0Y2hDbGFzcyhjbHMsIGV4cHIsIHBhcmFtX25hbWVzKSk7Ci0gIGNvbnN0IFN0cmluZyYgZXZhbF9mdW5jX25hbWUgPSBTdHJpbmc6OkhhbmRsZShTeW1ib2xzOjpOZXcoIjpldmFsIikpOwogICBjb25zdCBGdW5jdGlvbiYgZXZhbF9mdW5jID0KLSAgICAgIEZ1bmN0aW9uOjpIYW5kbGUoRnVuY3Rpb246Ok5ldyhldmFsX2Z1bmNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYXdGdW5jdGlvbjo6a1JlZ3VsYXJGdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIC8vIE5vdCBzdGF0aWMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgY29uc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgYWJzdHJhY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgZXh0ZXJuYWwuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICAvLyBOb3QgbmF0aXZlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpOwotICBldmFsX2Z1bmMuc2V0X3Jlc3VsdF90eXBlKFR5cGU6OkhhbmRsZShUeXBlOjpEeW5hbWljVHlwZSgpKSk7Ci0gIGV2YWxfZnVuYy5zZXRfbnVtX2ZpeGVkX3BhcmFtZXRlcnMoMSArIHBhcmFtX3ZhbHVlcy5MZW5ndGgoKSk7Ci0gIGV2YWxfZnVuYy5TZXROdW1PcHRpb25hbFBhcmFtZXRlcnMoMCwgdHJ1ZSk7Ci0gIGV2YWxfZnVuYy5TZXRJc09wdGltaXphYmxlKGZhbHNlKTsKLQorICAgICAgRnVuY3Rpb246OkhhbmRsZShFdmFsdWF0ZUhlbHBlcihjbHMsIGV4cHIsIHBhcmFtX25hbWVzLCBmYWxzZSkpOwogICBjb25zdCBBcnJheSYgYXJncyA9IEFycmF5OjpIYW5kbGUoQXJyYXk6Ok5ldygxICsgcGFyYW1fdmFsdWVzLkxlbmd0aCgpKSk7CiAgIE9iamVjdCYgcGFyYW0gPSBPYmplY3Q6OkhhbmRsZSgpOwogICBhcmdzLlNldEF0KDAsICp0aGlzKTsKQEAgLTE1MjI4LDggKzE1MjQ5LDcgQEAKICAgLy8gSW4gMzItYml0IG1vZGUsIHRoZSByZXN1bHQgb2YgYW55IG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBTbWlzIHdpbGwgZml0IGluIGEKICAgLy8gMzItYml0IHNpZ25lZCByZXN1bHQsIGV4Y2VwdCB0aGUgcHJvZHVjdCBvZiB0d28gU21pcywgd2hpY2ggd2lsbCBiZSA2NC1iaXQuCiAgIC8vIEluIDY0LWJpdCBtb2RlLCB0aGUgcmVzdWx0IG9mIGFueSBvcGVyYXRpb24gYmV0d2VlbiB0d28gU21pcyB3aWxsIGZpdCBpbiBhCi0gIC8vIDY0LWJpdCBzaWduZWQgcmVzdWx0LCBleGNlcHQgdGhlIHByb2R1Y3Qgb2YgdHdvIFNtaXMgKHVubGVzcyB0aGUgU21pcyBhcmUKLSAgLy8gMzItYml0IG9yIGxlc3MpLgorICAvLyA2NC1iaXQgc2lnbmVkIHJlc3VsdCwgZXhjZXB0IHRoZSBwcm9kdWN0IG9mIHR3byBTbWlzIChzZWUgYmVsb3cpLgogICBpZiAoSXNTbWkoKSAmJiBvdGhlci5Jc1NtaSgpKSB7CiAgICAgY29uc3QgaW50cHRyX3QgbGVmdF92YWx1ZSA9IFNtaTo6VmFsdWUoU21pOjpSYXdDYXN0KHJhdygpKSk7CiAgICAgY29uc3QgaW50cHRyX3QgcmlnaHRfdmFsdWUgPSBTbWk6OlZhbHVlKFNtaTo6UmF3Q2FzdChvdGhlci5yYXcoKSkpOwpAQCAtMTUyNDQsMTAgKzE1MjY0LDEyIEBACiAgICAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhzdGF0aWNfY2FzdDxpbnQ2NF90PihsZWZ0X3ZhbHVlKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ2NF90PihyaWdodF92YWx1ZSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEluIDY0LWJpdCBtb2RlLCB0aGUgcHJvZHVjdCBvZiB0d28gMzItYml0IHNpZ25lZCBpbnRlZ2VycyBmaXRzIGluIGEKLSAgICAgICAgICAvLyA2NC1iaXQgcmVzdWx0LgorICAgICAgICAgIC8vIEluIDY0LWJpdCBtb2RlLCB0aGUgcHJvZHVjdCBvZiB0d28gc2lnbmVkIGludGVnZXJzIGZpdHMgaW4gYQorICAgICAgICAgIC8vIDY0LWJpdCByZXN1bHQgaWYgdGhlIHN1bSBvZiB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZWlyIGFic29sdXRlCisgICAgICAgICAgLy8gdmFsdWVzIGlzIHNtYWxsZXIgdGhhbiA2Mi4KICAgICAgICAgICBBU1NFUlQoc2l6ZW9mKGludHB0cl90KSA9PSBzaXplb2YoaW50NjRfdCkpOwotICAgICAgICAgIGlmIChVdGlsczo6SXNJbnQoMzIsIGxlZnRfdmFsdWUpICYmIFV0aWxzOjpJc0ludCgzMiwgcmlnaHRfdmFsdWUpKSB7CisgICAgICAgICAgaWYgKChVdGlsczo6SGlnaGVzdEJpdChsZWZ0X3ZhbHVlKSArCisgICAgICAgICAgICAgICBVdGlsczo6SGlnaGVzdEJpdChyaWdodF92YWx1ZSkpIDwgNjIpIHsKICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobGVmdF92YWx1ZSAqIHJpZ2h0X3ZhbHVlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE1MjcxLDQyICsxNTI5Myw0MSBAQAogICAgICAgICBVTklNUExFTUVOVEVEKCk7CiAgICAgfQogICB9Ci0gIC8vIEluIDMyLWJpdCBtb2RlLCB0aGUgcmVzdWx0IG9mIGFueSBvcGVyYXRpb24gYmV0d2VlbiB0d28gNjMtYml0IHNpZ25lZAotICAvLyBpbnRlZ2VycyAob3IgMzItYml0IGZvciBtdWx0aXBsaWNhdGlvbikgd2lsbCBmaXQgaW4gYSA2NC1iaXQgc2lnbmVkIHJlc3VsdC4KKyAgLy8gSW4gMzItYml0IG1vZGUsIHRoZSByZXN1bHQgb2YgYW55IG9wZXJhdGlvbiAoZXhjZXB0IG11bHRpcGxpY2F0aW9uKSBiZXR3ZWVuCisgIC8vIHR3byA2My1iaXQgc2lnbmVkIGludGVnZXJzIHdpbGwgZml0IGluIGEgNjQtYml0IHNpZ25lZCByZXN1bHQuCisgIC8vIEZvciB0aGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IHRvIGZpdCwgdGhlIHN1bSBvZiB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZQorICAvLyBhYnNvbHV0ZSB2YWx1ZXMgb2YgdGhlIG9wZXJhbmRzIG11c3QgYmUgc21hbGxlciB0aGFuIDYyLgogICAvLyBJbiA2NC1iaXQgbW9kZSwgNjMtYml0IHNpZ25lZCBpbnRlZ2VycyBhcmUgU21pcywgYWxyZWFkeSBwcm9jZXNzZWQgYWJvdmUuCiAgIGlmICgoU21pOjprQml0cyA8IDMyKSAmJiAhSXNCaWdpbnQoKSAmJiAhb3RoZXIuSXNCaWdpbnQoKSkgewogICAgIGNvbnN0IGludDY0X3QgbGVmdF92YWx1ZSA9IEFzSW50NjRWYWx1ZSgpOwotICAgIGlmIChVdGlsczo6SXNJbnQoNjMsIGxlZnRfdmFsdWUpKSB7Ci0gICAgICBjb25zdCBpbnQ2NF90IHJpZ2h0X3ZhbHVlID0gb3RoZXIuQXNJbnQ2NFZhbHVlKCk7Ci0gICAgICBpZiAoVXRpbHM6OklzSW50KDYzLCByaWdodF92YWx1ZSkpIHsKLSAgICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKLSAgICAgICAgY2FzZSBUb2tlbjo6a0FERDoKLSAgICAgICAgICByZXR1cm4gSW50ZWdlcjo6TmV3KGxlZnRfdmFsdWUgKyByaWdodF92YWx1ZSk7Ci0gICAgICAgIGNhc2UgVG9rZW46OmtTVUI6Ci0gICAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhsZWZ0X3ZhbHVlIC0gcmlnaHRfdmFsdWUpOwotICAgICAgICBjYXNlIFRva2VuOjprTVVMOiB7Ci0gICAgICAgICAgaWYgKFV0aWxzOjpJc0ludCgzMiwgbGVmdF92YWx1ZSkgJiYgVXRpbHM6OklzSW50KDMyLCByaWdodF92YWx1ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobGVmdF92YWx1ZSAqIHJpZ2h0X3ZhbHVlKTsKKyAgICBjb25zdCBpbnQ2NF90IHJpZ2h0X3ZhbHVlID0gb3RoZXIuQXNJbnQ2NFZhbHVlKCk7CisgICAgaWYgKG9wZXJhdGlvbiA9PSBUb2tlbjo6a01VTCkgeworICAgICAgaWYgKChVdGlsczo6SGlnaGVzdEJpdChsZWZ0X3ZhbHVlKSArCisgICAgICAgICAgIFV0aWxzOjpIaWdoZXN0Qml0KHJpZ2h0X3ZhbHVlKSkgPCA2MikgeworICAgICAgICByZXR1cm4gSW50ZWdlcjo6TmV3KGxlZnRfdmFsdWUgKiByaWdodF92YWx1ZSk7CisgICAgICB9CisgICAgICAvLyBQZXJmb3JtIGEgQmlnaW50IG11bHRpcGxpY2F0aW9uIGJlbG93LgorICAgIH0gZWxzZSBpZiAoVXRpbHM6OklzSW50KDYzLCBsZWZ0X3ZhbHVlKSAmJiBVdGlsczo6SXNJbnQoNjMsIHJpZ2h0X3ZhbHVlKSkgeworICAgICAgc3dpdGNoIChvcGVyYXRpb24pIHsKKyAgICAgIGNhc2UgVG9rZW46OmtBREQ6CisgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobGVmdF92YWx1ZSArIHJpZ2h0X3ZhbHVlKTsKKyAgICAgIGNhc2UgVG9rZW46OmtTVUI6CisgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobGVmdF92YWx1ZSAtIHJpZ2h0X3ZhbHVlKTsKKyAgICAgIGNhc2UgVG9rZW46OmtUUlVOQ0RJVjoKKyAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhsZWZ0X3ZhbHVlIC8gcmlnaHRfdmFsdWUpOworICAgICAgY2FzZSBUb2tlbjo6a01PRDogeworICAgICAgICBjb25zdCBpbnQ2NF90IHJlbWFpbmRlciA9IGxlZnRfdmFsdWUgJSByaWdodF92YWx1ZTsKKyAgICAgICAgaWYgKHJlbWFpbmRlciA8IDApIHsKKyAgICAgICAgICBpZiAocmlnaHRfdmFsdWUgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlcjo6TmV3KHJlbWFpbmRlciAtIHJpZ2h0X3ZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhyZW1haW5kZXIgKyByaWdodF92YWx1ZSk7CiAgICAgICAgICAgfQotICAgICAgICAgIC8vIFBlcmZvcm0gYSBCaWdpbnQgbXVsdGlwbGljYXRpb24gYmVsb3cuCi0gICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBUb2tlbjo6a1RSVU5DRElWOgotICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcobGVmdF92YWx1ZSAvIHJpZ2h0X3ZhbHVlKTsKLSAgICAgICAgY2FzZSBUb2tlbjo6a01PRDogewotICAgICAgICAgIGNvbnN0IGludDY0X3QgcmVtYWluZGVyID0gbGVmdF92YWx1ZSAlIHJpZ2h0X3ZhbHVlOwotICAgICAgICAgIGlmIChyZW1haW5kZXIgPCAwKSB7Ci0gICAgICAgICAgICBpZiAocmlnaHRfdmFsdWUgPCAwKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcocmVtYWluZGVyIC0gcmlnaHRfdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXI6Ok5ldyhyZW1haW5kZXIgKyByaWdodF92YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBJbnRlZ2VyOjpOZXcocmVtYWluZGVyKTsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIFVOSU1QTEVNRU5URUQoKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gSW50ZWdlcjo6TmV3KHJlbWFpbmRlcik7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBVTklNUExFTUVOVEVEKCk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL29iamVjdC5oIGIvcnVudGltZS92bS9vYmplY3QuaAppbmRleCAzZDYwMDZlLi4zNWUxOTg3IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL29iamVjdC5oCisrKyBiL3J1bnRpbWUvdm0vb2JqZWN0LmgKQEAgLTE5ODQsNiArMTk4NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiYgcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB0b2tlbl9wb3MpOwogCisgIHN0YXRpYyBSYXdGdW5jdGlvbiogTmV3RXZhbEZ1bmN0aW9uKGNvbnN0IENsYXNzJiBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NyaXB0JiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfc3RhdGljKTsKKwogICAvLyBDcmVhdGVzIGEgbmV3IHN0YXRpYyBpbml0aWFsaXplciBmdW5jdGlvbiB3aGljaCBpcyBpbnZva2VkIGluIHRoZSBpbXBsaWNpdAogICAvLyBzdGF0aWMgZ2V0dGVyIGZ1bmN0aW9uLgogICBzdGF0aWMgUmF3RnVuY3Rpb24qIE5ld1N0YXRpY0luaXRpYWxpemVyKGNvbnN0IEZpZWxkJiBmaWVsZCk7CkBAIC0yMDU4LDYgKzIwNjIsOCBAQAogICB2b2lkIHNldF9pbXBsaWNpdF9jbG9zdXJlX2Z1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJiB2YWx1ZSkgY29uc3Q7CiAgIFJhd0luc3RhbmNlKiBpbXBsaWNpdF9zdGF0aWNfY2xvc3VyZSgpIGNvbnN0OwogICB2b2lkIHNldF9pbXBsaWNpdF9zdGF0aWNfY2xvc3VyZShjb25zdCBJbnN0YW5jZSYgY2xvc3VyZSkgY29uc3Q7CisgIFJhd1NjcmlwdCogZXZhbF9zY3JpcHQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZXZhbF9zY3JpcHQoY29uc3QgU2NyaXB0JiB2YWx1ZSkgY29uc3Q7CiAgIHZvaWQgc2V0X251bV9vcHRpb25hbF9wYXJhbWV0ZXJzKGludHB0cl90IHZhbHVlKSBjb25zdDsgIC8vIEVuY29kZWQgdmFsdWUuCiAgIHZvaWQgc2V0X2tpbmRfdGFnKGludHB0cl90IHZhbHVlKSBjb25zdDsKICAgdm9pZCBzZXRfZGF0YShjb25zdCBPYmplY3QmIHZhbHVlKSBjb25zdDsKQEAgLTMwMzQsMjQgKzMwNDAsNDYgQEAKIAogICBjbGFzcyBJdGVyYXRvciA6IFZhbHVlT2JqZWN0IHsKICAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVyYXRvcihjb25zdCBQY0Rlc2NyaXB0b3JzJiBkZXNjcmlwdG9ycykKLSAgICAgICAgOiBkZXNjcmlwdG9yc18oZGVzY3JpcHRvcnMpLCBjdXJyZW50X2l4XygwKSB7fQorICAgIEl0ZXJhdG9yKGNvbnN0IFBjRGVzY3JpcHRvcnMmIGRlc2NyaXB0b3JzLCBpbnRwdHJfdCBraW5kX21hc2spCisgICAgICAgIDogZGVzY3JpcHRvcnNfKGRlc2NyaXB0b3JzKSwga2luZF9tYXNrXyhraW5kX21hc2spLCBjdXJyZW50X2l4XygwKSB7CisgICAgICBNb3ZlVG9NYXRjaGluZygpOworICAgIH0KKworICAgIGJvb2wgSGFzTmV4dCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfaXhfIDwgZGVzY3JpcHRvcnNfLkxlbmd0aCgpOyB9CisKKyAgICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIE5leHQoKSB7CisgICAgICBBU1NFUlQoSGFzTmV4dCgpKTsKKyAgICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyogcmVzID0KKyAgICAgICAgIGRlc2NyaXB0b3JzXy5yZWNBdChjdXJyZW50X2l4XysrKTsKKyAgICAgIE1vdmVUb01hdGNoaW5nKCk7CisgICAgICByZXR1cm4gKnJlczsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFBjRGVzY3JpcHRvcnM7CiAKICAgICAvLyBGb3IgbmVzdGVkIGl0ZXJhdGlvbnMsIHN0YXJ0aW5nIGF0IGVsZW1lbnQgYWZ0ZXIuCiAgICAgZXhwbGljaXQgSXRlcmF0b3IoY29uc3QgSXRlcmF0b3ImIGl0ZXIpCiAgICAgICAgIDogVmFsdWVPYmplY3QoKSwKICAgICAgICAgICBkZXNjcmlwdG9yc18oaXRlci5kZXNjcmlwdG9yc18pLAorICAgICAgICAgIGtpbmRfbWFza18oaXRlci5raW5kX21hc2tfKSwKICAgICAgICAgICBjdXJyZW50X2l4XyhpdGVyLmN1cnJlbnRfaXhfKSB7fQogCi0gICAgYm9vbCBIYXNOZXh0KCkgeyByZXR1cm4gY3VycmVudF9peF8gPCBkZXNjcmlwdG9yc18uTGVuZ3RoKCk7IH0KLQotICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgTmV4dCgpIHsKLSAgICAgIEFTU0VSVChIYXNOZXh0KCkpOwotICAgICAgcmV0dXJuICpkZXNjcmlwdG9yc18ucmVjQXQoY3VycmVudF9peF8rKyk7CisgICAgLy8gTW92ZXMgdG8gcmVjb3JkIHRoYXQgbWF0Y2hlcyBraW5kX21hc2tfLgorICAgIHZvaWQgTW92ZVRvTWF0Y2hpbmcoKSB7CisgICAgICB3aGlsZSAoY3VycmVudF9peF8gPCBkZXNjcmlwdG9yc18uTGVuZ3RoKCkpIHsKKyAgICAgICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMgPQorICAgICAgICAgICAgKmRlc2NyaXB0b3JzXy5yZWNBdChjdXJyZW50X2l4Xyk7CisgICAgICAgIGlmICgocmVjLmtpbmRfICYga2luZF9tYXNrXykgIT0gMCkgeworICAgICAgICAgIHJldHVybjsgIC8vIEN1cnJlbnQgaXMgdmFsaWQuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytjdXJyZW50X2l4XzsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KIAotICAgcHJpdmF0ZToKICAgICBjb25zdCBQY0Rlc2NyaXB0b3JzJiBkZXNjcmlwdG9yc187CisgICAgY29uc3QgaW50cHRyX3Qga2luZF9tYXNrXzsKICAgICBpbnRwdHJfdCBjdXJyZW50X2l4XzsKICAgfTsKIApkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9vYmplY3RfdGVzdC5jYyBiL3J1bnRpbWUvdm0vb2JqZWN0X3Rlc3QuY2MKaW5kZXggYTgwYzQ5Ni4uNzZlMTIzYyAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9vYmplY3RfdGVzdC5jYworKysgYi9ydW50aW1lL3ZtL29iamVjdF90ZXN0LmNjCkBAIC0yNzQ1LDcgKzI3NDUsNyBAQAogCiAgIC8vIFZlcmlmeSB0aGUgUGNEZXNjcmlwdG9yIGVudHJpZXMgYnkgYWNjZXNzaW5nIHRoZW0uCiAgIGNvbnN0IFBjRGVzY3JpcHRvcnMmIHBjX2Rlc2NzID0gUGNEZXNjcmlwdG9yczo6SGFuZGxlKGNvZGUucGNfZGVzY3JpcHRvcnMoKSk7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIocGNfZGVzY3MpOworICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKHBjX2Rlc2NzLCBSYXdQY0Rlc2NyaXB0b3JzOjprQW55S2luZCk7CiAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjMCA9IGl0ZXIuTmV4dCgpOwogICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIHJlYzEgPSBpdGVyLk5leHQoKTsKICAgY29uc3QgUmF3UGNEZXNjcmlwdG9yczo6UGNEZXNjcmlwdG9yUmVjJiByZWMyID0gaXRlci5OZXh0KCk7CmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL3Jhd19vYmplY3QuaCBiL3J1bnRpbWUvdm0vcmF3X29iamVjdC5oCmluZGV4IDlkMzljMzMuLjM0YjcwMWIgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vcmF3X29iamVjdC5oCisrKyBiL3J1bnRpbWUvdm0vcmF3X29iamVjdC5oCkBAIC05MDQsMTQgKzkwNCwxNSBAQAogY2xhc3MgUmF3UGNEZXNjcmlwdG9ycyA6IHB1YmxpYyBSYXdPYmplY3QgewogIHB1YmxpYzoKICAgZW51bSBLaW5kIHsKLSAgICBrRGVvcHQsICAgICAgICAgICAgLy8gRGVvcHRpbWl6YXRpb24gY29udGludWF0aW9uIHBvaW50LgotICAgIGtJY0NhbGwsICAgICAgICAgICAvLyBJQyBjYWxsLgotICAgIGtPcHRTdGF0aWNDYWxsLCAgICAvLyBDYWxsIGRpcmVjdGx5IHRvIGtub3duIHRhcmdldCwgZS5nLiBzdGF0aWMgY2FsbC4KLSAgICBrVW5vcHRTdGF0aWNDYWxsLCAgLy8gQ2FsbCB0byBhIGtub3duIHRhcmdldCB2aWEgYSBzdHViLgotICAgIGtDbG9zdXJlQ2FsbCwgICAgICAvLyBDbG9zdXJlIGNhbGwuCi0gICAga1J1bnRpbWVDYWxsLCAgICAgIC8vIFJ1bnRpbWUgY2FsbC4KLSAgICBrT3NyRW50cnksICAgICAgICAgLy8gT1NSIGVudHJ5IHBvaW50IGluIHVub3B0aW1pemVkIGNvZGUuCi0gICAga090aGVyCisgICAga0Rlb3B0ICAgICAgICAgICA9IDEsICAvLyBEZW9wdGltaXphdGlvbiBjb250aW51YXRpb24gcG9pbnQuCisgICAga0ljQ2FsbCAgICAgICAgICA9IGtEZW9wdCA8PCAxLCAgLy8gSUMgY2FsbC4KKyAgICBrT3B0U3RhdGljQ2FsbCAgID0ga0ljQ2FsbCA8PCAxLCAgLy8gQ2FsbCBkaXJlY3RseSB0byBrbm93biB0YXJnZXQuCisgICAga1Vub3B0U3RhdGljQ2FsbCA9IGtPcHRTdGF0aWNDYWxsIDw8IDEsICAvLyBDYWxsIHRvIGEga25vd24gdGFyZ2V0IHZpYSBzdHViLgorICAgIGtDbG9zdXJlQ2FsbCAgICAgPSBrVW5vcHRTdGF0aWNDYWxsIDw8IDEsICAvLyBDbG9zdXJlIGNhbGwuCisgICAga1J1bnRpbWVDYWxsICAgICA9IGtDbG9zdXJlQ2FsbCA8PCAxLCAgLy8gUnVudGltZSBjYWxsLgorICAgIGtPc3JFbnRyeSAgICAgICAgPSBrUnVudGltZUNhbGwgPDwgMSwgIC8vIE9TUiBlbnRyeSBwb2ludCBpbiB1bm9wdC4gY29kZS4KKyAgICBrT3RoZXIgICAgICAgICAgID0ga09zckVudHJ5IDw8IDEsCisgICAga0FueUtpbmQgICAgICAgICA9IDB4RkYKICAgfTsKIAogICBzdHJ1Y3QgUGNEZXNjcmlwdG9yUmVjIHsKQEAgLTkxOSw3ICs5MjAsNyBAQAogICAgIGludDMyX3QgZGVvcHRfaWQ7CiAgICAgaW50MzJfdCB0b2tlbl9wb3M7ICAvLyBPciBkZW9wdCByZWFzb24uCiAgICAgaW50MTZfdCB0cnlfaW5kZXg7ICAvLyBPciBkZW9wdCBpbmRleC4KLSAgICBpbnQ4X3Qga2luZF87CisgICAgdWludDhfdCBraW5kXzsKIAogICAgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PEtpbmQ+KGtpbmRfKTsgfQogICB9OwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zaW11bGF0b3JfYXJtLmNjIGIvcnVudGltZS92bS9zaW11bGF0b3JfYXJtLmNjCmluZGV4IDQ5NDY2NDIuLjE0Zjk2OTQgMTAwNjQ0Ci0tLSBhL3J1bnRpbWUvdm0vc2ltdWxhdG9yX2FybS5jYworKysgYi9ydW50aW1lL3ZtL3NpbXVsYXRvcl9hcm0uY2MKQEAgLTI2OSw3ICsyNjksNyBAQAogICBpbnRwdHJfdCB0b2tlbl9wb3MgPSAtMTsKICAgY29uc3QgUGNEZXNjcmlwdG9ycyYgZGVzY3JpcHRvcnMgPQogICAgICAgUGNEZXNjcmlwdG9yczo6SGFuZGxlKGNvZGUucGNfZGVzY3JpcHRvcnMoKSk7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMpOworICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzLCBSYXdQY0Rlc2NyaXB0b3JzOjprQW55S2luZCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7CiAgICAgaWYgKHJlYy5wYyA9PSBwYykgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zdGFja19mcmFtZS5jYyBiL3J1bnRpbWUvdm0vc3RhY2tfZnJhbWUuY2MKaW5kZXggNjkyYTM1OC4uMGFlNTFhNSAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9zdGFja19mcmFtZS5jYworKysgYi9ydW50aW1lL3ZtL3N0YWNrX2ZyYW1lLmNjCkBAIC0yMjQsNyArMjI0LDcgQEAKICAgUkVVU0FCTEVfUENfREVTQ1JJUFRPUlNfSEFORExFU0NPUEUoaXNvbGF0ZSk7CiAgIFBjRGVzY3JpcHRvcnMmIGRlc2NyaXB0b3JzID0gcmV1c2VkX3BjX2Rlc2NyaXB0b3JzX2hhbmRsZS5IYW5kbGUoKTsKICAgZGVzY3JpcHRvcnMgPSBjb2RlLnBjX2Rlc2NyaXB0b3JzKCk7Ci0gIFBjRGVzY3JpcHRvcnM6Okl0ZXJhdG9yIGl0ZXIoZGVzY3JpcHRvcnMpOworICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzLCBSYXdQY0Rlc2NyaXB0b3JzOjprQW55S2luZCk7CiAgIHdoaWxlIChpdGVyLkhhc05leHQoKSkgewogICAgIGNvbnN0IFJhd1BjRGVzY3JpcHRvcnM6OlBjRGVzY3JpcHRvclJlYyYgcmVjID0gaXRlci5OZXh0KCk7CiAgICAgaWYgKChyZWMucGMgPT0gcGMoKSkgJiYgKHJlYy50cnlfaW5kZXggIT0gLTEpKSB7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgY29uc3QgUGNEZXNjcmlwdG9ycyYgZGVzY3JpcHRvcnMgPQogICAgICAgUGNEZXNjcmlwdG9yczo6SGFuZGxlKGNvZGUucGNfZGVzY3JpcHRvcnMoKSk7CiAgIEFTU0VSVCghZGVzY3JpcHRvcnMuSXNOdWxsKCkpOwotICBQY0Rlc2NyaXB0b3JzOjpJdGVyYXRvciBpdGVyKGRlc2NyaXB0b3JzKTsKKyAgUGNEZXNjcmlwdG9yczo6SXRlcmF0b3IgaXRlcihkZXNjcmlwdG9ycywgUmF3UGNEZXNjcmlwdG9yczo6a0FueUtpbmQpOwogICB3aGlsZSAoaXRlci5IYXNOZXh0KCkpIHsKICAgICBjb25zdCBSYXdQY0Rlc2NyaXB0b3JzOjpQY0Rlc2NyaXB0b3JSZWMmIHJlYyA9IGl0ZXIuTmV4dCgpOwogICAgIGlmIChyZWMucGMgPT0gcGMoKSkgewpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zdHViX2NvZGVfYXJtLmNjIGIvcnVudGltZS92bS9zdHViX2NvZGVfYXJtLmNjCmluZGV4IDhjMTlhMzQuLjE3OGZjOTFiIDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3N0dWJfY29kZV9hcm0uY2MKKysrIGIvcnVudGltZS92bS9zdHViX2NvZGVfYXJtLmNjCkBAIC0xMzYyLDExICsxMzYyLDExIEBACiAgIGNvbnN0IGludHB0cl90IHRhcmdldF9vZmZzZXQgPSBJQ0RhdGE6OlRhcmdldEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKICAgY29uc3QgaW50cHRyX3QgY291bnRfb2Zmc2V0ID0gSUNEYXRhOjpDb3VudEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKICAgX18gTG9hZEZyb21PZmZzZXQoa1dvcmQsIFIwLCBSNiwgdGFyZ2V0X29mZnNldCk7CisKKyAgLy8gVXBkYXRlIGNvdW50ZXIuCiAgIF9fIExvYWRGcm9tT2Zmc2V0KGtXb3JkLCBSMSwgUjYsIGNvdW50X29mZnNldCk7CiAgIF9fIGFkZHMoUjEsIFIxLCBPcGVyYW5kKFNtaTo6UmF3VmFsdWUoMSkpKTsKLSAgX18gU3RvcmVUb09mZnNldChrV29yZCwgUjEsIFI2LCBjb3VudF9vZmZzZXQpOwotICBfXyBiKCZjYWxsX3RhcmdldF9mdW5jdGlvbiwgVkMpOyAgLy8gTm8gb3ZlcmZsb3cuCi0gIF9fIExvYWRJbW1lZGlhdGUoUjEsIFNtaTo6UmF3VmFsdWUoU21pOjprTWF4VmFsdWUpKTsKKyAgX18gTG9hZEltbWVkaWF0ZShSMSwgU21pOjpSYXdWYWx1ZShTbWk6OmtNYXhWYWx1ZSksIFZTKTsgIC8vIE92ZXJmbG93LgogICBfXyBTdG9yZVRvT2Zmc2V0KGtXb3JkLCBSMSwgUjYsIGNvdW50X29mZnNldCk7CiAKICAgX18gQmluZCgmY2FsbF90YXJnZXRfZnVuY3Rpb24pOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zdHViX2NvZGVfYXJtNjQuY2MgYi9ydW50aW1lL3ZtL3N0dWJfY29kZV9hcm02NC5jYwppbmRleCA0OWExYmUyLi40ZjE0MmY4IDEwMDY0NAotLS0gYS9ydW50aW1lL3ZtL3N0dWJfY29kZV9hcm02NC5jYworKysgYi9ydW50aW1lL3ZtL3N0dWJfY29kZV9hcm02NC5jYwpAQCAtMTQ2MiwxMSArMTQ2MiwxMiBAQAogICBjb25zdCBpbnRwdHJfdCB0YXJnZXRfb2Zmc2V0ID0gSUNEYXRhOjpUYXJnZXRJbmRleEZvcihudW1fYXJncykgKiBrV29yZFNpemU7CiAgIGNvbnN0IGludHB0cl90IGNvdW50X29mZnNldCA9IElDRGF0YTo6Q291bnRJbmRleEZvcihudW1fYXJncykgKiBrV29yZFNpemU7CiAgIF9fIExvYWRGcm9tT2Zmc2V0KFIwLCBSNiwgdGFyZ2V0X29mZnNldCwga05vUFApOworCisgIC8vIFVwZGF0ZSBjb3VudGVyLgogICBfXyBMb2FkRnJvbU9mZnNldChSMSwgUjYsIGNvdW50X29mZnNldCwga05vUFApOwogICBfXyBhZGRzKFIxLCBSMSwgT3BlcmFuZChTbWk6OlJhd1ZhbHVlKDEpKSk7Ci0gIF9fIFN0b3JlVG9PZmZzZXQoUjEsIFI2LCBjb3VudF9vZmZzZXQsIGtOb1BQKTsKLSAgX18gYigmY2FsbF90YXJnZXRfZnVuY3Rpb24sIFZDKTsgIC8vIE5vIG92ZXJmbG93LgotICBfXyBMb2FkSW1tZWRpYXRlKFIxLCBTbWk6OlJhd1ZhbHVlKFNtaTo6a01heFZhbHVlKSwga05vUFApOworICBfXyBMb2FkSW1tZWRpYXRlKFIyLCBTbWk6OlJhd1ZhbHVlKFNtaTo6a01heFZhbHVlKSwga05vUFApOworICBfXyBjc2VsKFIxLCBSMiwgUjEsIFZTKTsgIC8vIE92ZXJmbG93LgogICBfXyBTdG9yZVRvT2Zmc2V0KFIxLCBSNiwgY291bnRfb2Zmc2V0LCBrTm9QUCk7CiAKICAgX18gQmluZCgmY2FsbF90YXJnZXRfZnVuY3Rpb24pOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zdHViX2NvZGVfaWEzMi5jYyBiL3J1bnRpbWUvdm0vc3R1Yl9jb2RlX2lhMzIuY2MKaW5kZXggNTRlYmE5Yy4uMjYzZDY5NCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9zdHViX2NvZGVfaWEzMi5jYworKysgYi9ydW50aW1lL3ZtL3N0dWJfY29kZV9pYTMyLmNjCkBAIC0xMzI1LDcgKzEzMjUsNyBAQAogICAvLyBhcmd1bWVudHMgZGVzY3JpcHRvciBhcnJheSBhbmQgdGhlbiBhY2Nlc3MgdGhlIHJlY2VpdmVyIGZyb20gdGhlIHN0YWNrKS4KICAgX18gbW92bChFQVgsIEZpZWxkQWRkcmVzcyhFRFgsIEFyZ3VtZW50c0Rlc2NyaXB0b3I6OmNvdW50X29mZnNldCgpKSk7CiAgIF9fIG1vdmwoRUFYLCBBZGRyZXNzKEVTUCwgRUFYLCBUSU1FU18yLCAwKSk7ICAvLyBFQVggKGFyZ3VtZW50X2NvdW50KSBpcyBzbWkuCi0gIF9fIExvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoRUFYLCBFQVgpOworICBfXyBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKEVBWCwgRUFYLCBFREkpOwogCiAgIC8vIEVBWDogcmVjZWl2ZXIncyBjbGFzcyBJRCAoc21pKS4KICAgX18gbW92bChFREksIEFkZHJlc3MoRUJYLCAwKSk7ICAvLyBGaXJzdCBjbGFzcyBpZCAoc21pKSB0byBjaGVjay4KQEAgLTEzMzcsNyArMTMzNyw3IEBACiAgICAgICAvLyBJZiBub3QgdGhlIGZpcnN0LCBsb2FkIHRoZSBuZXh0IGFyZ3VtZW50J3MgY2xhc3MgSUQuCiAgICAgICBfXyBtb3ZsKEVBWCwgRmllbGRBZGRyZXNzKEVEWCwgQXJndW1lbnRzRGVzY3JpcHRvcjo6Y291bnRfb2Zmc2V0KCkpKTsKICAgICAgIF9fIG1vdmwoRUFYLCBBZGRyZXNzKEVTUCwgRUFYLCBUSU1FU18yLCAtIGkgKiBrV29yZFNpemUpKTsKLSAgICAgIF9fIExvYWRUYWdnZWRDbGFzc0lkTWF5QmVTbWkoRUFYLCBFQVgpOworICAgICAgX18gTG9hZFRhZ2dlZENsYXNzSWRNYXlCZVNtaShFQVgsIEVBWCwgRURJKTsKIAogICAgICAgLy8gRUFYOiBuZXh0IGFyZ3VtZW50IGNsYXNzIElEIChzbWkpLgogICAgICAgX18gbW92bChFREksIEFkZHJlc3MoRUJYLCBpICoga1dvcmRTaXplKSk7CkBAIC0xMzU2LDcgKzEzNTYsNyBAQAogICBpZiAobnVtX2FyZ3MgPiAxKSB7CiAgICAgX18gbW92bChFQVgsIEZpZWxkQWRkcmVzcyhFRFgsIEFyZ3VtZW50c0Rlc2NyaXB0b3I6OmNvdW50X29mZnNldCgpKSk7CiAgICAgX18gbW92bChFQVgsIEFkZHJlc3MoRVNQLCBFQVgsIFRJTUVTXzIsIDApKTsKLSAgICBfXyBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKEVBWCwgRUFYKTsKKyAgICBfXyBMb2FkVGFnZ2VkQ2xhc3NJZE1heUJlU21pKEVBWCwgRUFYLCBFREkpOwogICB9CiAKICAgY29uc3QgaW50cHRyX3QgZW50cnlfc2l6ZSA9IElDRGF0YTo6VGVzdEVudHJ5TGVuZ3RoRm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKQEAgLTE0MDIsMTIgKzE0MDIsMTUgQEAKICAgLy8gRUJYOiBQb2ludGVyIHRvIGFuIElDIGRhdGEgY2hlY2sgZ3JvdXAuCiAgIGNvbnN0IGludHB0cl90IHRhcmdldF9vZmZzZXQgPSBJQ0RhdGE6OlRhcmdldEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKICAgY29uc3QgaW50cHRyX3QgY291bnRfb2Zmc2V0ID0gSUNEYXRhOjpDb3VudEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKLSAgX18gbW92bChFQVgsIEFkZHJlc3MoRUJYLCB0YXJnZXRfb2Zmc2V0KSk7Ci0gIF9fIGFkZGwoQWRkcmVzcyhFQlgsIGNvdW50X29mZnNldCksIEltbWVkaWF0ZShTbWk6OlJhd1ZhbHVlKDEpKSk7Ci0gIF9fIGooTk9fT1ZFUkZMT1csICZjYWxsX3RhcmdldF9mdW5jdGlvbiwgQXNzZW1ibGVyOjprTmVhckp1bXApOwotICBfXyBtb3ZsKEFkZHJlc3MoRUJYLCBjb3VudF9vZmZzZXQpLAotICAgICAgICAgIEltbWVkaWF0ZShTbWk6OlJhd1ZhbHVlKFNtaTo6a01heFZhbHVlKSkpOwogCisgIC8vIFVwZGF0ZSBjb3VudGVyLgorICBfXyBtb3ZsKEVBWCwgQWRkcmVzcyhFQlgsIGNvdW50X29mZnNldCkpOworICBfXyBhZGRsKEVBWCwgSW1tZWRpYXRlKFNtaTo6UmF3VmFsdWUoMSkpKTsKKyAgX18gbW92bChFREksIEltbWVkaWF0ZShTbWk6OlJhd1ZhbHVlKFNtaTo6a01heFZhbHVlKSkpOworICBfXyBjbW92bm8oRURJLCBFQVgpOworICBfXyBtb3ZsKEFkZHJlc3MoRUJYLCBjb3VudF9vZmZzZXQpLCBFREkpOworCisgIF9fIG1vdmwoRUFYLCBBZGRyZXNzKEVCWCwgdGFyZ2V0X29mZnNldCkpOwogICBfXyBCaW5kKCZjYWxsX3RhcmdldF9mdW5jdGlvbik7CiAgIC8vIEVBWDogVGFyZ2V0IGZ1bmN0aW9uLgogICBfXyBtb3ZsKEVCWCwgRmllbGRBZGRyZXNzKEVBWCwgRnVuY3Rpb246Omluc3RydWN0aW9uc19vZmZzZXQoKSkpOwpkaWZmIC0tZ2l0IGEvcnVudGltZS92bS9zdHViX2NvZGVfbWlwcy5jYyBiL3J1bnRpbWUvdm0vc3R1Yl9jb2RlX21pcHMuY2MKaW5kZXggNzc1MzMwYS4uMGYyNmFiYiAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9zdHViX2NvZGVfbWlwcy5jYworKysgYi9ydW50aW1lL3ZtL3N0dWJfY29kZV9taXBzLmNjCkBAIC0xNTQwLDE1ICsxNTQwLDE0IEBACiAgIGNvbnN0IGludHB0cl90IHRhcmdldF9vZmZzZXQgPSBJQ0RhdGE6OlRhcmdldEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKICAgY29uc3QgaW50cHRyX3QgY291bnRfb2Zmc2V0ID0gSUNEYXRhOjpDb3VudEluZGV4Rm9yKG51bV9hcmdzKSAqIGtXb3JkU2l6ZTsKICAgX18gbHcoVDMsIEFkZHJlc3MoVDAsIHRhcmdldF9vZmZzZXQpKTsKKworICAvLyBVcGRhdGUgY291bnRlci4KICAgX18gbHcoVDQsIEFkZHJlc3MoVDAsIGNvdW50X29mZnNldCkpOwotCi0gIF9fIEFkZEltbWVkaWF0ZURldGVjdE92ZXJmbG93KFQ0LCBUNCwgU21pOjpSYXdWYWx1ZSgxKSwgVDUsIFQ2KTsKLQotICBfXyBiZ2V6KFQ1LCAmY2FsbF90YXJnZXRfZnVuY3Rpb24pOyAgLy8gTm8gb3ZlcmZsb3cuCi0gIF9fIGRlbGF5X3Nsb3QoKS0+c3coVDQsIEFkZHJlc3MoVDAsIGNvdW50X29mZnNldCkpOwotCi0gIF9fIExvYWRJbW1lZGlhdGUoVDEsIFNtaTo6UmF3VmFsdWUoU21pOjprTWF4VmFsdWUpKTsKLSAgX18gc3coVDEsIEFkZHJlc3MoVDAsIGNvdW50X29mZnNldCkpOworICBfXyBBZGRJbW1lZGlhdGVEZXRlY3RPdmVyZmxvdyhUNywgVDQsIFNtaTo6UmF3VmFsdWUoMSksIFQ1LCBUNik7CisgIF9fIHNsdChDTVBSRVMxLCBUNSwgWlIpOyAgLy8gVDUgaXMgPCAwIGlmIHRoZXJlIHdhcyBvdmVyZmxvdy4KKyAgX18gTG9hZEltbWVkaWF0ZShUNCwgU21pOjpSYXdWYWx1ZShTbWk6OmtNYXhWYWx1ZSkpOworICBfXyBtb3Z6KFQ0LCBUNywgQ01QUkVTMSk7CisgIF9fIHN3KFQ0LCBBZGRyZXNzKFQwLCBjb3VudF9vZmZzZXQpKTsKIAogICBfXyBCaW5kKCZjYWxsX3RhcmdldF9mdW5jdGlvbik7CiAgIC8vIFQwIDwtIFQzOiBUYXJnZXQgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9ydW50aW1lL3ZtL3N0dWJfY29kZV94NjQuY2MgYi9ydW50aW1lL3ZtL3N0dWJfY29kZV94NjQuY2MKaW5kZXggZDExMjdlMS4uNjZlYjI0MCAxMDA2NDQKLS0tIGEvcnVudGltZS92bS9zdHViX2NvZGVfeDY0LmNjCisrKyBiL3J1bnRpbWUvdm0vc3R1Yl9jb2RlX3g2NC5jYwpAQCAtMTM3MCwxMCArMTM3MCwxMyBAQAogICBjb25zdCBpbnRwdHJfdCB0YXJnZXRfb2Zmc2V0ID0gSUNEYXRhOjpUYXJnZXRJbmRleEZvcihudW1fYXJncykgKiBrV29yZFNpemU7CiAgIGNvbnN0IGludHB0cl90IGNvdW50X29mZnNldCA9IElDRGF0YTo6Q291bnRJbmRleEZvcihudW1fYXJncykgKiBrV29yZFNpemU7CiAgIF9fIG1vdnEoUkFYLCBBZGRyZXNzKFIxMiwgdGFyZ2V0X29mZnNldCkpOwotICBfXyBhZGRxKEFkZHJlc3MoUjEyLCBjb3VudF9vZmZzZXQpLCBJbW1lZGlhdGUoU21pOjpSYXdWYWx1ZSgxKSkpOwotICBfXyBqKE5PX09WRVJGTE9XLCAmY2FsbF90YXJnZXRfZnVuY3Rpb24sIEFzc2VtYmxlcjo6a05lYXJKdW1wKTsKLSAgX18gbW92cShBZGRyZXNzKFIxMiwgY291bnRfb2Zmc2V0KSwKLSAgICAgICAgICBJbW1lZGlhdGUoU21pOjpSYXdWYWx1ZShTbWk6OmtNYXhWYWx1ZSkpKTsKKworICAvLyBVcGRhdGUgY291bnRlci4KKyAgX18gbW92cShSOCwgQWRkcmVzcyhSMTIsIGNvdW50X29mZnNldCkpOworICBfXyBhZGRxKFI4LCBJbW1lZGlhdGUoU21pOjpSYXdWYWx1ZSgxKSkpOworICBfXyBtb3ZxKFI5LCBJbW1lZGlhdGUoU21pOjpSYXdWYWx1ZShTbWk6OmtNYXhWYWx1ZSkpKTsKKyAgX18gY21vdm5vcShSOSwgUjgpOworICBfXyBtb3ZxKEFkZHJlc3MoUjEyLCBjb3VudF9vZmZzZXQpLCBSOSk7CiAKICAgX18gQmluZCgmY2FsbF90YXJnZXRfZnVuY3Rpb24pOwogICAvLyBSQVg6IFRhcmdldCBmdW5jdGlvbi4KZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfYmFja2VuZC9kYXJ0X3RyZWUuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfYmFja2VuZC9kYXJ0X3RyZWUuZGFydAppbmRleCA3MTQ5ZGI4Li5hMDYwYjk4IDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9kYXJ0X2JhY2tlbmQvZGFydF90cmVlLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vZGFydF9iYWNrZW5kL2RhcnRfdHJlZS5kYXJ0CkBAIC05NzksOSArOTc5LDkgQEAKICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uRGVjbGFyYXRpb24odmFyaWFibGUsIGZ1bmN0aW9uLCB2aXNpdChub2RlLmJvZHkpKTsKICAgfQogCi0gIFN0YXRlbWVudCB2aXNpdEFzQ2FzdChpci5Bc0Nhc3Qgbm9kZSkgeworICBTdGF0ZW1lbnQgdmlzaXRUeXBlT3BlcmF0b3IoaXIuVHlwZU9wZXJhdG9yIG5vZGUpIHsKICAgICBFeHByZXNzaW9uIHJlY2VpdmVyID0gZ2V0VmFyaWFibGVSZWZlcmVuY2Uobm9kZS5yZWNlaXZlcik7Ci0gICAgRXhwcmVzc2lvbiBjb25jYXQgPSBuZXcgVHlwZU9wZXJhdG9yKHJlY2VpdmVyLCBub2RlLnR5cGUsICJhcyIpOworICAgIEV4cHJlc3Npb24gY29uY2F0ID0gbmV3IFR5cGVPcGVyYXRvcihyZWNlaXZlciwgbm9kZS50eXBlLCBub2RlLm9wZXJhdG9yKTsKICAgICByZXR1cm4gY29udGludWVXaXRoRXhwcmVzc2lvbihub2RlLmNvbnRpbnVhdGlvbiwgY29uY2F0KTsKICAgfQogCkBAIC0xMDg2LDEyICsxMDg2LDYgQEAKICAgICB9CiAgIH0KIAotICBFeHByZXNzaW9uIHZpc2l0SXNDaGVjayhpci5Jc0NoZWNrIG5vZGUpIHsKLSAgICByZXR1cm4gbmV3IFR5cGVPcGVyYXRvcihnZXRWYXJpYWJsZVJlZmVyZW5jZShub2RlLnJlY2VpdmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIik7Ci0gIH0KLQogICBFeHByZXNzaW9uIHZpc2l0UGFyYW1ldGVyKGlyLlBhcmFtZXRlciBub2RlKSB7CiAgICAgLy8gQ29udGludWF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCB2aXNpdGVkIChjb250aW51YXRpb25zIHRoZW1zZWx2ZXMgYXJlCiAgICAgLy8gbm90IHZpc2l0ZWQgeWV0KS4KZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfYmFja2VuZC9wbGFjZWhvbGRlcl9jb2xsZWN0b3IuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfYmFja2VuZC9wbGFjZWhvbGRlcl9jb2xsZWN0b3IuZGFydAppbmRleCBhMTVhNWI2Li45YjYyMjkxIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9kYXJ0X2JhY2tlbmQvcGxhY2Vob2xkZXJfY29sbGVjdG9yLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vZGFydF9iYWNrZW5kL3BsYWNlaG9sZGVyX2NvbGxlY3Rvci5kYXJ0CkBAIC04Miw2ICs4Miw3IEBACiAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkgewogICAgICAgY29sbGVjdG9yLnRyeU1ha2VNZW1iZXJQbGFjZWhvbGRlcihub2RlLnNlbGVjdG9yKTsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuaXNFcnJvbmVvdXMpIHsKKyAgICAgIGNvbGxlY3Rvci5tYWtlVW5yZXNvbHZlZFBsYWNlaG9sZGVyKG5vZGUpOwogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoZWxlbWVudC5pc1ByZWZpeCkgewogICAgICAgLy8gTm9kZSBpcyBwcmVmaXggcGFydCBpbiBjYXNlIG9mIHNvdXJjZSAnbGliLnNvbWVzZXR0ZXIgPSA1OycKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfdHlwZXMuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2RhcnRfdHlwZXMuZGFydAppbmRleCA5M2YzODU0Li4xZGYyMWM2IDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9kYXJ0X3R5cGVzLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vZGFydF90eXBlcy5kYXJ0CkBAIC0xNCw2ICsxNCw3IEBACiAgICAgICAgICBUeXBlRGVjbGFyYXRpb25FbGVtZW50WCwKICAgICAgICAgIFR5cGVkZWZFbGVtZW50WDsKIGltcG9ydCAnZWxlbWVudHMvZWxlbWVudHMuZGFydCc7CitpbXBvcnQgJ2hlbHBlcnMvaGVscGVycy5kYXJ0JzsKIGltcG9ydCAnb3JkZXJlZF90eXBlc2V0LmRhcnQnIHNob3cgT3JkZXJlZFR5cGVTZXQ7CiBpbXBvcnQgJ3V0aWwvdXRpbC5kYXJ0JyBzaG93IENVUlJFTlRfRUxFTUVOVF9TUEFOTkFCTEUsIGVxdWFsRWxlbWVudHM7CiAKQEAgLTEwNjgsMTIgKzEwNjksMTIgQEAKICAgYm9vbCB2aXNpdFR5cGVWYXJpYWJsZVR5cGUoVHlwZVZhcmlhYmxlVHlwZSB0LCBEYXJ0VHlwZSBzKSB7CiAgICAgLy8gSWRlbnRpdHkgY2hlY2sgaXMgaGFuZGxlZCBpbiBbaXNTdWJ0eXBlXS4KICAgICBEYXJ0VHlwZSBib3VuZCA9IHQuZWxlbWVudC5ib3VuZDsKLSAgICBpZiAoYm91bmQuZWxlbWVudC5pc1R5cGVWYXJpYWJsZSkgeworICAgIGlmIChib3VuZC5pc1R5cGVWYXJpYWJsZSkgewogICAgICAgLy8gVGhlIGJvdW5kIGlzIHBvdGVudGlhbGx5IGN5Y2xpYyBzbyB3ZSBuZWVkIHRvIGJlIGV4dHJhIGNhcmVmdWwuCiAgICAgICBTZXQ8VHlwZVZhcmlhYmxlRWxlbWVudD4gc2VlblR5cGVWYXJpYWJsZXMgPQogICAgICAgICAgIG5ldyBTZXQ8VHlwZVZhcmlhYmxlRWxlbWVudD4oKTsKICAgICAgIHNlZW5UeXBlVmFyaWFibGVzLmFkZCh0LmVsZW1lbnQpOwotICAgICAgd2hpbGUgKGJvdW5kLmVsZW1lbnQuaXNUeXBlVmFyaWFibGUpIHsKKyAgICAgIHdoaWxlIChib3VuZC5pc1R5cGVWYXJpYWJsZSkgewogICAgICAgICBUeXBlVmFyaWFibGVFbGVtZW50IGVsZW1lbnQgPSBib3VuZC5lbGVtZW50OwogICAgICAgICBpZiAoaWRlbnRpY2FsKGJvdW5kLmVsZW1lbnQsIHMuZWxlbWVudCkpIHsKICAgICAgICAgICAvLyBbdF0gZXh0ZW5kcyBbc10uCmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9oZWxwZXJzL2RlYnVnX2NvbGxlY3Rpb24uZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0CmluZGV4IDAxN2U4ZGUuLjQyZTI4YzAgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2hlbHBlcnMvZGVidWdfY29sbGVjdGlvbi5kYXJ0CkBAIC02NCw0ICs2NCwyNjYgQEAKICAgYm9vbCBnZXQgaXNFbXB0eSA9PiBtYXAuaXNFbXB0eTsKIAogICBib29sIGdldCBpc05vdEVtcHR5ID0+IG1hcC5pc05vdEVtcHR5OworfQorCitjbGFzcyBEZWJ1Z0l0ZXJhYmxlPEU+IGltcGxlbWVudHMgSXRlcmFibGU8RT4geworICBmaW5hbCBJdGVyYWJsZTxFPiBpdGVyYWJsZTsKKworICBEZWJ1Z0l0ZXJhYmxlKHRoaXMuaXRlcmFibGUpOworCisgIEl0ZXJhdG9yPEU+IGdldCBpdGVyYXRvciA9PiBpdGVyYWJsZS5pdGVyYXRvcjsKKworICBJdGVyYWJsZSBtYXAoZihFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5tYXAoZik7CisKKyAgSXRlcmFibGU8RT4gd2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLndoZXJlKHRlc3QpOworCisgIEl0ZXJhYmxlIGV4cGFuZChJdGVyYWJsZSBmKEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLmV4cGFuZChmKTsKKworICBib29sIGNvbnRhaW5zKE9iamVjdCBlbGVtZW50KSA9PiBpdGVyYWJsZS5jb250YWlucyhlbGVtZW50KTsKKworICB2b2lkIGZvckVhY2godm9pZCBmKEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLmZvckVhY2goZik7CisKKyAgRSByZWR1Y2UoRSBjb21iaW5lKEUgdmFsdWUsIEUgZWxlbWVudCkpID0+IGl0ZXJhYmxlLnJlZHVjZShjb21iaW5lKTsKKworICBkeW5hbWljIGZvbGQodmFyIGluaXRpYWxWYWx1ZSwKKyAgICAgICAgICAgICAgIGR5bmFtaWMgY29tYmluZSh2YXIgcHJldmlvdXNWYWx1ZSwgRSBlbGVtZW50KSkgeworICAgIHJldHVybiBpdGVyYWJsZS5mb2xkKGluaXRpYWxWYWx1ZSwgY29tYmluZSk7CisgIH0KKworICBib29sIGV2ZXJ5KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5ldmVyeSh0ZXN0KTsKKworICBTdHJpbmcgam9pbihbU3RyaW5nIHNlcGFyYXRvciA9ICIiXSkgPT4gaXRlcmFibGUuam9pbihzZXBhcmF0b3IpOworCisgIGJvb2wgYW55KGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5hbnkodGVzdCk7CisKKyAgTGlzdDxFPiB0b0xpc3QoeyBib29sIGdyb3dhYmxlOiB0cnVlIH0pIHsKKyAgICByZXR1cm4gaXRlcmFibGUudG9MaXN0KGdyb3dhYmxlOiBncm93YWJsZSk7CisgIH0KKworICBTZXQ8RT4gdG9TZXQoKSA9PiBpdGVyYWJsZS50b1NldCgpOworCisgIGludCBnZXQgbGVuZ3RoID0+IGl0ZXJhYmxlLmxlbmd0aDsKKworICBib29sIGdldCBpc0VtcHR5ID0+IGl0ZXJhYmxlLmlzRW1wdHk7CisKKyAgYm9vbCBnZXQgaXNOb3RFbXB0eSA9PiBpdGVyYWJsZS5pc05vdEVtcHR5OworCisgIEl0ZXJhYmxlPEU+IHRha2UoaW50IG4pID0+IGl0ZXJhYmxlLnRha2Uobik7CisKKyAgSXRlcmFibGU8RT4gdGFrZVdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgPT4gaXRlcmFibGUudGFrZVdoaWxlKHRlc3QpOworCisgIEl0ZXJhYmxlPEU+IHNraXAoaW50IG4pID0+IGl0ZXJhYmxlLnNraXAobik7CisKKyAgSXRlcmFibGU8RT4gc2tpcFdoaWxlKGJvb2wgdGVzdChFIHZhbHVlKSkgPT4gaXRlcmFibGUuc2tpcFdoaWxlKHRlc3QpOworCisgIEUgZ2V0IGZpcnN0ID0+IGl0ZXJhYmxlLmZpcnN0OworCisgIEUgZ2V0IGxhc3QgPT4gaXRlcmFibGUubGFzdDsKKworICBFIGdldCBzaW5nbGUgPT4gaXRlcmFibGUuc2luZ2xlOworCisgIEUgZmlyc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwgeyBFIG9yRWxzZSgpIH0pIHsKKyAgICByZXR1cm4gaXRlcmFibGUuZmlyc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CisgIH0KKworICBFIGxhc3RXaGVyZShib29sIHRlc3QoRSBlbGVtZW50KSwge0Ugb3JFbHNlKCl9KSB7CisgICAgcmV0dXJuIGl0ZXJhYmxlLmxhc3RXaGVyZSh0ZXN0LCBvckVsc2U6IG9yRWxzZSk7CisgIH0KKworICBFIHNpbmdsZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBpdGVyYWJsZS5zaW5nbGVXaGVyZSh0ZXN0KTsKKworICBFIGVsZW1lbnRBdChpbnQgaW5kZXgpID0+IGl0ZXJhYmxlLmVsZW1lbnRBdChpbmRleCk7CisKK30KKworY2xhc3MgRGVidWdMaXN0PEU+IGV4dGVuZHMgRGVidWdJdGVyYWJsZTxFPiBpbXBsZW1lbnRzIExpc3Q8RT4geworICBEZWJ1Z0NhbGxiYWNrIGFkZENhbGxiYWNrOworCisgIERlYnVnTGlzdChMaXN0PEU+IGxpc3QsIHt0aGlzLmFkZENhbGxiYWNrfSkgOiBzdXBlcihsaXN0KTsKKworICBMaXN0PEU+IGdldCBsaXN0ID0+IGl0ZXJhYmxlOworCisgIEUgb3BlcmF0b3IgW10oaW50IGluZGV4KSA9PiBsaXN0W2luZGV4XTsKKworICB2b2lkIG9wZXJhdG9yIFtdPShpbnQgaW5kZXgsIEUgdmFsdWUpIHsKKyAgICBsaXN0W2luZGV4XSA9IHZhbHVlOworICB9CisKKyAgaW50IGdldCBsZW5ndGggPT4gbGlzdC5sZW5ndGg7CisKKyAgdm9pZCBzZXQgbGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKKyAgICBsaXN0Lmxlbmd0aCA9IG5ld0xlbmd0aDsKKyAgfQorCisgIHZvaWQgYWRkKEUgdmFsdWUpIHsKKyAgICBpZiAoYWRkQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgYWRkQ2FsbGJhY2soJ2FkZCcsIHZhbHVlLCBudWxsKTsKKyAgICB9CisgICAgbGlzdC5hZGQodmFsdWUpOworICB9CisKKyAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gaXRlcmFibGUpID0+IGxpc3QuYWRkQWxsKGl0ZXJhYmxlKTsKKworICBJdGVyYWJsZTxFPiBnZXQgcmV2ZXJzZWQgPT4gbGlzdC5yZXZlcnNlZDsKKworICB2b2lkIHNvcnQoW2ludCBjb21wYXJlKEUgYSwgRSBiKV0pID0+IGxpc3Quc29ydChjb21wYXJlKTsKKworICB2b2lkIHNodWZmbGUoW3JhbmRvbV0pID0+IGxpc3Quc2h1ZmZsZShyYW5kb20pOworCisgIGludCBpbmRleE9mKEUgZWxlbWVudCwgW2ludCBzdGFydCA9IDBdKSA9PiBsaXN0LmluZGV4T2YoZWxlbWVudCwgc3RhcnQpOworCisgIGludCBsYXN0SW5kZXhPZihFIGVsZW1lbnQsIFtpbnQgc3RhcnRdKSA9PiBsaXN0Lmxhc3RJbmRleE9mKGVsZW1lbnQsIHN0YXJ0KTsKKworICB2b2lkIGNsZWFyKCkgPT4gbGlzdC5jbGVhcigpOworCisgIHZvaWQgaW5zZXJ0KGludCBpbmRleCwgRSBlbGVtZW50KSA9PiBsaXN0Lmluc2VydChpbmRleCwgZWxlbWVudCk7CisKKyAgdm9pZCBpbnNlcnRBbGwoaW50IGluZGV4LCBJdGVyYWJsZTxFPiBpdGVyYWJsZSkgeworICAgIGxpc3QuaW5zZXJ0QWxsKGluZGV4LCBpdGVyYWJsZSk7CisgIH0KKworICB2b2lkIHNldEFsbChpbnQgaW5kZXgsIEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSA9PiBsaXN0LnNldEFsbChpbmRleCwgaXRlcmFibGUpOworCisgIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gbGlzdC5yZW1vdmUodmFsdWUpOworCisgIEUgcmVtb3ZlQXQoaW50IGluZGV4KSA9PiBsaXN0LnJlbW92ZUF0KGluZGV4KTsKKworICBFIHJlbW92ZUxhc3QoKSA9PiBsaXN0LnJlbW92ZUxhc3QoKTsKKworICB2b2lkIHJlbW92ZVdoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBsaXN0LnJlbW92ZVdoZXJlKHRlc3QpOworCisgIHZvaWQgcmV0YWluV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IGxpc3QucmV0YWluV2hlcmUodGVzdCk7CisKKyAgTGlzdDxFPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSA9PiBsaXN0LnN1Ymxpc3Qoc3RhcnQsIGVuZCk7CisKKyAgSXRlcmFibGU8RT4gZ2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSA9PiBsaXN0LmdldFJhbmdlKHN0YXJ0LCBlbmQpOworCisgIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiBpdGVyYWJsZSwgW2ludCBza2lwQ291bnQgPSAwXSkgeworICAgIGxpc3Quc2V0UmFuZ2Uoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CisgIH0KKworICB2b2lkIHJlbW92ZVJhbmdlKGludCBzdGFydCwgaW50IGVuZCkgeworICAgIGxpc3QucmVtb3ZlUmFuZ2Uoc3RhcnQsIGVuZCk7CisgIH0KKworICB2b2lkIGZpbGxSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIFtFIGZpbGxWYWx1ZV0pIHsKKyAgICBsaXN0LmZpbGxSYW5nZShzdGFydCwgZW5kLCBmaWxsVmFsdWUpOworICB9CisKKyAgdm9pZCByZXBsYWNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxFPiByZXBsYWNlbWVudCkgeworICAgIGxpc3QucmVwbGFjZVJhbmdlKHN0YXJ0LCBlbmQsIHJlcGxhY2VtZW50KTsKKyAgfQorCisgIE1hcDxpbnQsIEU+IGFzTWFwKCkgPT4gbGlzdC5hc01hcCgpOworfQorCitjbGFzcyBEZWJ1Z1NldDxFPiBleHRlbmRzIERlYnVnSXRlcmFibGU8RT4gaW1wbGVtZW50cyBTZXQ8RT4geworICBEZWJ1Z0NhbGxiYWNrIGFkZENhbGxiYWNrOworCisgIERlYnVnU2V0KFNldDxFPiBzZXQsIHt0aGlzLmFkZENhbGxiYWNrfSkgOiBzdXBlcihzZXQpOworCisgIFNldDxFPiBnZXQgc2V0ID0+IGl0ZXJhYmxlOworCisgIGJvb2wgY29udGFpbnMoT2JqZWN0IHZhbHVlKSA9PiBzZXQuY29udGFpbnModmFsdWUpOworCisgIGJvb2wgYWRkKEUgdmFsdWUpIHsKKyAgICBpZiAoYWRkQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgYWRkQ2FsbGJhY2soJ2FkZCcsIHZhbHVlLCBudWxsKTsKKyAgICB9CisgICAgcmV0dXJuIHNldC5hZGQodmFsdWUpOworICB9CisKKyAgdm9pZCBhZGRBbGwoSXRlcmFibGU8RT4gZWxlbWVudHMpID0+IHNldC5hZGRBbGwoZWxlbWVudHMpOworCisgIGJvb2wgcmVtb3ZlKE9iamVjdCB2YWx1ZSkgPT4gc2V0LnJlbW92ZSh2YWx1ZSk7CisKKyAgRSBsb29rdXAoT2JqZWN0IG9iamVjdCkgPT4gc2V0Lmxvb2t1cChvYmplY3QpOworCisgIHZvaWQgcmVtb3ZlQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpID0+IHNldC5yZW1vdmVBbGwoZWxlbWVudHMpOworCisgIHZvaWQgcmV0YWluQWxsKEl0ZXJhYmxlPE9iamVjdD4gZWxlbWVudHMpID0+IHNldC5yZXRhaW5BbGwoZWxlbWVudHMpOworCisgIHZvaWQgcmVtb3ZlV2hlcmUoYm9vbCB0ZXN0KEUgZWxlbWVudCkpID0+IHNldC5yZW1vdmVXaGVyZSh0ZXN0KTsKKworICB2b2lkIHJldGFpbldoZXJlKGJvb2wgdGVzdChFIGVsZW1lbnQpKSA9PiBzZXQucmV0YWluV2hlcmUodGVzdCk7CisKKyAgYm9vbCBjb250YWluc0FsbChJdGVyYWJsZTxPYmplY3Q+IG90aGVyKSA9PiBzZXQuY29udGFpbnNBbGwob3RoZXIpOworCisgIFNldDxFPiBpbnRlcnNlY3Rpb24oU2V0PE9iamVjdD4gb3RoZXIpID0+IHNldC5pbnRlcnNlY3Rpb24ob3RoZXIpOworCisgIFNldDxFPiB1bmlvbihTZXQ8RT4gb3RoZXIpID0+IHNldC51bmlvbihvdGhlcik7CisKKyAgU2V0PEU+IGRpZmZlcmVuY2UoU2V0PEU+IG90aGVyKSA9PiBzZXQuZGlmZmVyZW5jZShvdGhlcik7CisKKyAgdm9pZCBjbGVhcigpID0+IHNldC5jbGVhcigpOworCisgIFNldDxFPiB0b1NldCgpID0+IHNldC50b1NldCgpOworfQorCisvLy8gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgcnVudGltZSB0eXBlIG9mIFtvYmplY3RdIGlzIG5vdCBpbgorLy8vIFtydW50aW1lVHlwZXNdLgorLy8vCisvLy8gVXNlIHRoaXMgdG8gZ3JhZHVhbGx5IGJ1aWxkIHRoZSBzZXQgb2YgYWN0dWFsIHJ1bnRpbWUgdmFsdWVzIG9mIFtvYmplY3RdCisvLy8gYXQgdGhlIGNhbGwgc2l0ZSBieSBydW5uaW5nIHRlc3QgcHJvZ3JhbXMgYW5kIGFkZGluZyB0byBbcnVudGltZVR5cGVzXSB3aGVuCisvLy8gbmV3IHR5cGUgYXJlIGZvdW5kLgordm9pZCBhc3NlcnRUeXBlKFN0cmluZyBuYW1lLCBMaXN0PFN0cmluZz4gcnVudGltZVR5cGVzLCB2YXIgb2JqZWN0LAorICAgICAgICAgICAgICAgIHtib29sIHNob3dPYmplY3RzOiBmYWxzZX0pIHsKKyAgU3RyaW5nIHJ1bnRpbWVUeXBlID0gJyR7b2JqZWN0LnJ1bnRpbWVUeXBlfSc7CisgIGlmIChydW50aW1lVHlwZXMgIT0gbnVsbCAmJiBydW50aW1lVHlwZXMuY29udGFpbnMocnVudGltZVR5cGUpKSByZXR1cm47CisgIHRocm93ICckbmFtZTogJHJ1bnRpbWVUeXBlJworICAgICAgICAnJHtzaG93T2JqZWN0cyA/ICcgKCRvYmplY3QpJyA6ICcnfSc7Cit9CisKKy8vLyBDYWxsYmFjayBmb3IgdGhlIFthZGRDYWxsYmFja10gb2YgW0RlYnVnTWFwXSB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gaWYKKy8vLyB0aGUgcnVudGltZSB0eXBlIG9mIGtleS92YWx1ZSBwYWlycyBhcmUgbm90IGluIFtydW50aW1lVHlwZXNdLgorLy8vCisvLy8gVXNlIHRoaXMgdG8gZ3JhZHVhbGx5IGJ1aWxkIHRoZSBzZXQgb2YgYWN0dWFsIHJ1bnRpbWUgdmFsdWVzIG9mIGtleS92YWx1ZQorLy8vIHBhaXJzIG9mIGEgbWFwIGJ5IHJ1bm5pbmcgdGVzdCBwcm9ncmFtcyBhbmQgYWRkaW5nIHRvIFtydW50aW1lVHlwZXNdIHdoZW4KKy8vLyBuZXcgdHlwZSBhcmUgZm91bmQuCitjbGFzcyBNYXBUeXBlQXNzZXJ0ZXIgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBydW50aW1lVHlwZXM7CisgIGZpbmFsIGJvb2wgc2hvd09iamVjdHM7CisKKyAgY29uc3QgTWFwVHlwZUFzc2VydGVyKHRoaXMubmFtZSwgdGhpcy5ydW50aW1lVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHtib29sIHRoaXMuc2hvd09iamVjdHM6IGZhbHNlfSk7CisKKyAgdm9pZCBjYWxsKFN0cmluZyBtZXRob2ROYW1lLCB2YXIga2V5LCB2YXIgdmFsdWUpIHsKKyAgICBjaGVjayhrZXksIHZhbHVlLCAnJG1ldGhvZE5hbWU6ICcpOworICB9CisKKyAgdm9pZCBjaGVjayh2YXIga2V5LCB2YXIgdmFsdWUsIFtTdHJpbmcgdGV4dCA9ICcnXSkgeworICAgIFN0cmluZyBrZXlUeXBlID0gJyR7a2V5LnJ1bnRpbWVUeXBlfSc7CisgICAgU3RyaW5nIHZhbHVlVHlwZSA9ICcke3ZhbHVlLnJ1bnRpbWVUeXBlfSc7CisgICAgTGlzdDxTdHJpbmc+IHZhbHVlc1R5cGVzID0gcnVudGltZVR5cGVzW2tleVR5cGVdOworICAgIGlmICh2YWx1ZXNUeXBlcyAhPSBudWxsICYmIHZhbHVlc1R5cGVzLmNvbnRhaW5zKHZhbHVlVHlwZSkpIHJldHVybjsKKyAgICB0aHJvdyAnJG5hbWU6ICR0ZXh0JGtleVR5cGUgPT4gJHZhbHVlVHlwZScKKyAgICAgICAgICAnJHtzaG93T2JqZWN0cyA/ICcgKCRrZXkgPT4gJHZhbHVlKScgOiAnJ30nOworICB9Cit9CisKKy8vLyBDYWxsYmFjayBmb3IgdGhlIFthZGRDYWxsYmFja10gb2YgW0RlYnVnU2V0XSBvciBbRGVidWdMaXN0XSAgdGhhdCB0aHJvd3MgYW4KKy8vLyBleGNlcHRpb24gaWYgdGhlIHJ1bnRpbWUgdHlwZSBvZiB0aGUgZWxlbWVudHMgYXJlIG5vdCBpbiBbcnVudGltZVR5cGVzXS4KKy8vLworLy8vIFVzZSB0aGlzIHRvIGdyYWR1YWxseSBidWlsZCB0aGUgc2V0IG9mIGFjdHVhbCBydW50aW1lIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMKKy8vLyBvZiBhIGNvbGxlY3Rpb24gYnkgcnVubmluZyB0ZXN0IHByb2dyYW1zIGFuZCBhZGRpbmcgdG8gW3J1bnRpbWVUeXBlc10gd2hlbgorLy8vIG5ldyB0eXBlIGFyZSBmb3VuZC4KK2NsYXNzIENvbGxlY3Rpb25UeXBlQXNzZXJ0ZXIgeworICBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgZmluYWwgTGlzdDxTdHJpbmc+IHJ1bnRpbWVUeXBlczsKKyAgZmluYWwgYm9vbCBzaG93T2JqZWN0czsKKworICBjb25zdCBDb2xsZWN0aW9uVHlwZUFzc2VydGVyKHRoaXMubmFtZSwgdGhpcy5ydW50aW1lVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHtib29sIHRoaXMuc2hvd09iamVjdHM6IGZhbHNlfSk7CisKKyAgdm9pZCBjYWxsKFN0cmluZyBtZXRob2ROYW1lLCB2YXIgZWxlbWVudCwgXykgeworICAgIGNoZWNrKGVsZW1lbnQsICckbWV0aG9kTmFtZTogJyk7CisgIH0KKworICB2b2lkIGNoZWNrKHZhciBlbGVtZW50LCBbU3RyaW5nIHRleHQgPSAnJ10pIHsKKyAgICBTdHJpbmcgZWxlbWVudFR5cGUgPSAnJHtlbGVtZW50LnJ1bnRpbWVUeXBlfSc7CisgICAgaWYgKHJ1bnRpbWVUeXBlcy5jb250YWlucyhlbGVtZW50VHlwZSkpIHJldHVybjsKKyAgICB0aHJvdyAnJG5hbWU6ICR0ZXh0JGVsZW1lbnRUeXBlJworICAgICAgICAgICcke3Nob3dPYmplY3RzID8gJyAoJGVsZW1lbnQpJyA6ICcnfSc7CisgIH0KIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl9idWlsZGVyLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl9idWlsZGVyLmRhcnQKaW5kZXggOGJlMTk4ZC4uZjBkN2IzMCAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vaXIvaXJfYnVpbGRlci5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2lyL2lyX2J1aWxkZXIuZGFydApAQCAtMTI2MiwyMCArMTI2MiwxMyBAQAogICAgICAgYXNzZXJ0KG5vZGUuYXJndW1lbnRzLnRhaWwuaXNFbXB0eSk7CiAgICAgICByZXR1cm4gYnVpbGROZWdhdGlvbih2aXNpdER5bmFtaWNTZW5kKG5vZGUpKTsKICAgICB9Ci0gICAgaWYgKG9wLnNvdXJjZSA9PSAiaXMiKSB7CisgICAgaWYgKG9wLnNvdXJjZSA9PSAiaXMiIHx8IG9wLnNvdXJjZSA9PSAiYXMiKSB7CiAgICAgICBEYXJ0VHlwZSB0eXBlID0gZWxlbWVudHMuZ2V0VHlwZShub2RlLnR5cGVBbm5vdGF0aW9uRnJvbUlzQ2hlY2tPckNhc3QpOwogICAgICAgaXIuUHJpbWl0aXZlIHJlY2VpdmVyID0gdmlzaXQobm9kZS5yZWNlaXZlcik7Ci0gICAgICBpci5Jc0NoZWNrIGlzQ2hlY2sgPSBuZXcgaXIuSXNDaGVjayhyZWNlaXZlciwgdHlwZSk7Ci0gICAgICBhZGQobmV3IGlyLkxldFByaW0oaXNDaGVjaykpOwotICAgICAgcmV0dXJuIG5vZGUuaXNJc05vdENoZWNrID8gYnVpbGROZWdhdGlvbihpc0NoZWNrKSA6IGlzQ2hlY2s7CisgICAgICBpci5QcmltaXRpdmUgY2hlY2sgPSBjb250aW51ZVdpdGhFeHByZXNzaW9uKAorICAgICAgICAgIChrKSA9PiBuZXcgaXIuVHlwZU9wZXJhdG9yKG9wLnNvdXJjZSwgcmVjZWl2ZXIsIHR5cGUsIGspKTsKKyAgICAgIHJldHVybiBub2RlLmlzSXNOb3RDaGVjayA/IGJ1aWxkTmVnYXRpb24oY2hlY2spIDogY2hlY2s7CiAgICAgfQotICAgIGlmIChvcC5zb3VyY2UgPT0gImFzIikgewotICAgICAgRGFydFR5cGUgdHlwZSA9IGVsZW1lbnRzLmdldFR5cGUobm9kZS50eXBlQW5ub3RhdGlvbkZyb21Jc0NoZWNrT3JDYXN0KTsKLSAgICAgIGlyLlByaW1pdGl2ZSByZWNlaXZlciA9IHZpc2l0KG5vZGUucmVjZWl2ZXIpOwotICAgICAgcmV0dXJuIGNvbnRpbnVlV2l0aEV4cHJlc3Npb24oCi0gICAgICAgICAgKGspID0+IG5ldyBpci5Bc0Nhc3QocmVjZWl2ZXIsIHR5cGUsIGspKTsKLSAgICB9Ci0gICAgY29tcGlsZXIuaW50ZXJuYWxFcnJvcihub2RlLCAiVW5rbm93biBvcGVyYXRvciAnJHtvcC5zb3VyY2V9JyIpOwogICB9CiAKICAgLy8gQnVpbGQoU3RhdGljU2VuZChmLCBhcmd1bWVudHMpLCBDKSA9IENbQydbSW52b2tlU3RhdGljKGYsIHhzKV1dCmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl9ub2Rlcy5kYXJ0IGIvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vaXIvaXJfbm9kZXMuZGFydAppbmRleCAzZjBmYTc4Li5kYWU1NTAyIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl9ub2Rlcy5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2NvbXBpbGVyL2ltcGxlbWVudGF0aW9uL2lyL2lyX25vZGVzLmRhcnQKQEAgLTIzNywxNiArMjM3LDI2IEBACiAgIGFjY2VwdChWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJbnZva2VDb25zdHJ1Y3Rvcih0aGlzKTsKIH0KIAotY2xhc3MgQXNDYXN0IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisvLy8gImFzIiBjYXN0cyBhbmQgImlzIiBjaGVja3MuCisvLyBXZSBtaWdodCB3YW50IHRvIHR1cm4gImlzIi1jaGVja3MgaW50byBhIFtQcmltaXRpdmVdIGFzIGl0IGNhbiBuZXZlciBkaXZlcmdlLgorLy8gQnV0IHRoZW4gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgZm9yIGlzLWNoZWNrcyB3aXRoIGFuIGVycm9uZW91cyAudHlwZSBhcworLy8gdGhlc2Ugd2lsbCB0aHJvdy4KK2NsYXNzIFR5cGVPcGVyYXRvciBleHRlbmRzIEV4cHJlc3Npb24gewogICBmaW5hbCBSZWZlcmVuY2UgcmVjZWl2ZXI7CiAgIGZpbmFsIERhcnRUeXBlIHR5cGU7CiAgIGZpbmFsIFJlZmVyZW5jZSBjb250aW51YXRpb247CisgIGZpbmFsIFN0cmluZyBvcGVyYXRvcjsKIAotICBBc0Nhc3QoUHJpbWl0aXZlIHJlY2VpdmVyLCB0aGlzLnR5cGUsIENvbnRpbnVhdGlvbiBjb250KQorICBUeXBlT3BlcmF0b3IodGhpcy5vcGVyYXRvciwKKyAgICAgICAgICAgICAgICBQcmltaXRpdmUgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgdGhpcy50eXBlLAorICAgICAgICAgICAgICAgIENvbnRpbnVhdGlvbiBjb250KQogICAgICAgOiB0aGlzLnJlY2VpdmVyID0gbmV3IFJlZmVyZW5jZShyZWNlaXZlciksCi0gICAgICAgIHRoaXMuY29udGludWF0aW9uID0gbmV3IFJlZmVyZW5jZShjb250KTsKKyAgICAgICAgdGhpcy5jb250aW51YXRpb24gPSBuZXcgUmVmZXJlbmNlKGNvbnQpIHsKKyAgICBhc3NlcnQob3BlcmF0b3IgPT0gImlzIiB8fCBvcGVyYXRvciA9PSAiYXMiKTsKKyAgfQogCi0gIGFjY2VwdChWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRBc0Nhc3QodGhpcyk7CisgIGFjY2VwdChWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRUeXBlT3BlcmF0b3IodGhpcyk7CiB9CiAKIC8vLyBJbnZva2UgW3RvU3RyaW5nXSBvbiBlYWNoIGFyZ3VtZW50IGFuZCBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0cy4KQEAgLTQ0NywxOCArNDU3LDYgQEAKICAgYWNjZXB0KFZpc2l0b3IgdmlzaXRvcikgPT4gdmlzaXRvci52aXNpdENyZWF0ZUZ1bmN0aW9uKHRoaXMpOwogfQogCi1jbGFzcyBJc0NoZWNrIGV4dGVuZHMgUHJpbWl0aXZlIHsKLSAgZmluYWwgUmVmZXJlbmNlIHJlY2VpdmVyOwotICBmaW5hbCBEYXJ0VHlwZSB0eXBlOwotCi0gIGRhcnQyanMuQ29uc3RhbnQgZ2V0IGNvbnN0YW50ID0+IG51bGw7Ci0KLSAgSXNDaGVjayhQcmltaXRpdmUgcmVjZWl2ZXIsIHRoaXMudHlwZSkKLSAgICAgIDogdGhpcy5yZWNlaXZlciA9IG5ldyBSZWZlcmVuY2UocmVjZWl2ZXIpOwotCi0gIGFjY2VwdChWaXNpdG9yIHZpc2l0b3IpID0+IHZpc2l0b3IudmlzaXRJc0NoZWNrKHRoaXMpOwotfQotCiBjbGFzcyBQYXJhbWV0ZXIgZXh0ZW5kcyBQcmltaXRpdmUgewogICBQYXJhbWV0ZXIoRWxlbWVudCBlbGVtZW50KSB7CiAgICAgc3VwZXIuaGludCA9IGVsZW1lbnQ7CkBAIC01MjksMTQgKzUyNywxMyBAQAogICBUIHZpc2l0SW52b2tlQ29uc3RydWN0b3IoSW52b2tlQ29uc3RydWN0b3Igbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogICBUIHZpc2l0Q29uY2F0ZW5hdGVTdHJpbmdzKENvbmNhdGVuYXRlU3RyaW5ncyBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgIFQgdmlzaXRCcmFuY2goQnJhbmNoIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKLSAgVCB2aXNpdEFzQ2FzdChBc0Nhc3Qgbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOworICBUIHZpc2l0VHlwZU9wZXJhdG9yKFR5cGVPcGVyYXRvciBub2RlKSA9PiB2aXNpdEV4cHJlc3Npb24obm9kZSk7CiAgIFQgdmlzaXRTZXRDbG9zdXJlVmFyaWFibGUoU2V0Q2xvc3VyZVZhcmlhYmxlIG5vZGUpID0+IHZpc2l0RXhwcmVzc2lvbihub2RlKTsKICAgVCB2aXNpdERlY2xhcmVGdW5jdGlvbihEZWNsYXJlRnVuY3Rpb24gbm9kZSkgPT4gdmlzaXRFeHByZXNzaW9uKG5vZGUpOwogCiAgIC8vIERlZmluaXRpb25zLgogICBUIHZpc2l0TGl0ZXJhbExpc3QoTGl0ZXJhbExpc3Qgbm9kZSkgPT4gdmlzaXRQcmltaXRpdmUobm9kZSk7CiAgIFQgdmlzaXRMaXRlcmFsTWFwKExpdGVyYWxNYXAgbm9kZSkgPT4gdmlzaXRQcmltaXRpdmUobm9kZSk7Ci0gIFQgdmlzaXRJc0NoZWNrKElzQ2hlY2sgbm9kZSkgPT4gdmlzaXRQcmltaXRpdmUobm9kZSk7CiAgIFQgdmlzaXRDb25zdGFudChDb25zdGFudCBub2RlKSA9PiB2aXNpdFByaW1pdGl2ZShub2RlKTsKICAgVCB2aXNpdFRoaXMoVGhpcyBub2RlKSA9PiB2aXNpdFByaW1pdGl2ZShub2RlKTsKICAgVCB2aXNpdFJlaWZ5VHlwZVZhcihSZWlmeVR5cGVWYXIgbm9kZSkgPT4gdmlzaXRQcmltaXRpdmUobm9kZSk7CkBAIC03ODcsMTAgKzc4NCw2IEBACiAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCh2aXNpdFJlZmVyZW5jZSk7CiAgIH0KIAotICB2b2lkIHZpc2l0QXNDYXN0KEFzQ2FzdCBub2RlKSB7Ci0gICAgdmlzaXRSZWZlcmVuY2Uobm9kZS5yZWNlaXZlcik7Ci0gIH0KLQogICB2b2lkIHZpc2l0SW52b2tlQ29udGludWF0aW9uKEludm9rZUNvbnRpbnVhdGlvbiBub2RlKSB7CiAgICAgbm9kZS5hcmd1bWVudHMuZm9yRWFjaCh2aXNpdFJlZmVyZW5jZSk7CiAgIH0KQEAgLTgyNyw3ICs4MjAsNyBAQAogICAgIH0KICAgfQogCi0gIHZvaWQgdmlzaXRJc0NoZWNrKElzQ2hlY2sgbm9kZSkgeworICB2b2lkIHZpc2l0VHlwZU9wZXJhdG9yKFR5cGVPcGVyYXRvciBub2RlKSB7CiAgICAgdmlzaXRSZWZlcmVuY2Uobm9kZS5yZWNlaXZlcik7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc2RrL2xpYi9faW50ZXJuYWwvY29tcGlsZXIvaW1wbGVtZW50YXRpb24vaXIvaXJfdHJhY2VyLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl90cmFjZXIuZGFydAppbmRleCBmMTY3YmE3Li43MjJkNzVjIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl90cmFjZXIuZGFydAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9jb21waWxlci9pbXBsZW1lbnRhdGlvbi9pci9pcl90cmFjZXIuZGFydApAQCAtMTY1LDE4ICsxNjUsMTIgQEAKICAgICBwcmludFN0bXQoZHVtbXksICJMaXRlcmFsTWFwICgke2VudHJpZXMuam9pbignLCAnKX0pIik7CiAgIH0KIAotICB2aXNpdElzQ2hlY2soaXIuSXNDaGVjayBub2RlKSB7CisgIHZpc2l0VHlwZU9wZXJhdG9yKGlyLlR5cGVPcGVyYXRvciBub2RlKSB7CiAgICAgU3RyaW5nIGR1bW15ID0gbmFtZXMubmFtZShub2RlKTsKKyAgICBTdHJpbmcgb3BlcmF0b3IgPSBub2RlLm9wZXJhdG9yOwogICAgIExpc3Q8U3RyaW5nPiBlbnRyaWVzID0gbmV3IExpc3Q8U3RyaW5nPigpOwogICAgIFN0cmluZyByZWNlaXZlciA9IGZvcm1hdFJlZmVyZW5jZShub2RlLnJlY2VpdmVyKTsKLSAgICBwcmludFN0bXQoZHVtbXksICJJc0NoZWNrICgkcmVjZWl2ZXIgJHtub2RlLnR5cGV9KSIpOwotICB9Ci0KLSAgdmlzaXRBc0Nhc3QoaXIuQXNDYXN0IG5vZGUpIHsKLSAgICBTdHJpbmcgZHVtbXkgPSBuYW1lcy5uYW1lKG5vZGUpOwotICAgIExpc3Q8U3RyaW5nPiBlbnRyaWVzID0gbmV3IExpc3Q8U3RyaW5nPigpOwotICAgIFN0cmluZyByZWNlaXZlciA9IGZvcm1hdFJlZmVyZW5jZShub2RlLnJlY2VpdmVyKTsKLSAgICBwcmludFN0bXQoZHVtbXksICJBc0Nhc3QgKCRyZWNlaXZlciAke25vZGUudHlwZX0pIik7CisgICAgcHJpbnRTdG10KGR1bW15LCAiVHlwZU9wZXJhdG9yICgkb3BlcmF0b3IgJHJlY2VpdmVyICR7bm9kZS50eXBlfSkiKTsKICAgfQogCiAgIHZpc2l0SW52b2tlQ29udGludWF0aW9uKGlyLkludm9rZUNvbnRpbnVhdGlvbiBub2RlKSB7CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9saWIvbmF0aXZlX3R5cGVkX2RhdGEuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2xpYi9uYXRpdmVfdHlwZWRfZGF0YS5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNmU1NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9saWIvbmF0aXZlX3R5cGVkX2RhdGEuZGFydApAQCAtMCwwICsxLDE5OTIgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCisvLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLyoqCisgKiBTcGVjaWFsaXplZCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywKKyAqIHdpdGggU0lNRCBzdXBwb3J0IGFuZCBlZmZpY2llbnQgbGlzdHMuCisgKi8KK2xpYnJhcnkgZGFydC50eXBlZF9kYXRhLmltcGxlbWVudGF0aW9uOworCitpbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7CitpbXBvcnQgJ2RhcnQ6X2ludGVybmFsJzsKK2ltcG9ydCAnZGFydDpfaW50ZXJjZXB0b3JzJyBzaG93IEpTSW5kZXhhYmxlLCBKU1VJbnQzMiwgSlNVSW50MzE7CitpbXBvcnQgJ2RhcnQ6X2pzX2hlbHBlcicKKyAgICBzaG93IENyZWF0ZXMsIEphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yLCBKU05hbWUsIE51bGwsIFJldHVybnM7CitpbXBvcnQgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJyBzaG93IEpTOworaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIE1hdGg7CisKK2ltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKKworY2xhc3MgTmF0aXZlQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIEJ5dGVCdWZmZXIgbmF0aXZlICJBcnJheUJ1ZmZlciIgeworICBASlNOYW1lKCdieXRlTGVuZ3RoJykKKyAgZmluYWwgaW50IGxlbmd0aEluQnl0ZXM7CisKKyAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gQnl0ZUJ1ZmZlcjsKKworICBVaW50OExpc3QgYXNVaW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZVVpbnQ4TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBJbnQ4TGlzdCBhc0ludDhMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQ4TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgeworICAgIHJldHVybiBuZXcgTmF0aXZlVWludDhDbGFtcGVkTGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgeworICAgIHJldHVybiBuZXcgTmF0aXZlVWludDE2TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKyAgSW50MTZMaXN0IGFzSW50MTZMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQxNkxpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICB9CisKKyAgVWludDMyTGlzdCBhc1VpbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZVVpbnQzMkxpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICB9CisKKyAgSW50MzJMaXN0IGFzSW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMkxpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICB9CisKKyAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVWludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7CisgIH0KKworICBJbnQ2NExpc3QgYXNJbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSW50NjRMaXN0IG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4iKTsKKyAgfQorCisgIEludDMyeDRMaXN0IGFzSW50MzJ4NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKKyAgICBOYXRpdmVVaW50MzJMaXN0IHN0b3JhZ2UgPQorICAgICAgICB0aGlzLmFzVWludDMyTGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGggIT0gbnVsbCA/IGxlbmd0aCAqIDQgOiBudWxsKTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDRMaXN0Ll9leHRlcm5hbFN0b3JhZ2Uoc3RvcmFnZSk7CisgIH0KKworICBGbG9hdDMyTGlzdCBhc0Zsb2F0MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyTGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBGbG9hdDY0TGlzdCBhc0Zsb2F0NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBGbG9hdDMyeDRMaXN0IGFzRmxvYXQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgeworICAgIE5hdGl2ZUZsb2F0MzJMaXN0IHN0b3JhZ2UgPQorICAgICAgICB0aGlzLmFzRmxvYXQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoICE9IG51bGwgPyBsZW5ndGggKiA0IDogbnVsbCk7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDRMaXN0Ll9leHRlcm5hbFN0b3JhZ2Uoc3RvcmFnZSk7CisgIH0KKworICBGbG9hdDY0eDJMaXN0IGFzRmxvYXQ2NHgyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgeworICAgIE5hdGl2ZUZsb2F0NjRMaXN0IHN0b3JhZ2UgPQorICAgICAgICB0aGlzLmFzRmxvYXQ2NExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoICE9IG51bGwgPyBsZW5ndGggKiAyIDogbnVsbCk7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDJMaXN0Ll9leHRlcm5hbFN0b3JhZ2Uoc3RvcmFnZSk7CisgIH0KKworICBCeXRlRGF0YSBhc0J5dGVEYXRhKFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVCeXRlRGF0YS52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KK30KKworCisKKy8qKgorICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBGbG9hdDMyeDQgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKKyAqIFtUeXBlZERhdGFdLiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCisgKiBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBOYXRpdmVGbG9hdDMyeDRMaXN0CisgICAgZXh0ZW5kcyBPYmplY3Qgd2l0aCBMaXN0TWl4aW48RmxvYXQzMng0PiwgRml4ZWRMZW5ndGhMaXN0TWl4aW48RmxvYXQzMng0PgorICAgIGltcGxlbWVudHMgRmxvYXQzMng0TGlzdCB7CisKKyAgZmluYWwgTmF0aXZlRmxvYXQzMkxpc3QgX3N0b3JhZ2U7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBbRmxvYXQzMng0TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKKyAgICogYWxsIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KKyAgICovCisgIE5hdGl2ZUZsb2F0MzJ4NExpc3QoaW50IGxlbmd0aCkKKyAgICAgIDogX3N0b3JhZ2UgPSBuZXcgTmF0aXZlRmxvYXQzMkxpc3QobGVuZ3RoICogNCk7CisKKyAgTmF0aXZlRmxvYXQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKHRoaXMuX3N0b3JhZ2UpOworCisgIE5hdGl2ZUZsb2F0MzJ4NExpc3QuX3Nsb3dGcm9tTGlzdChMaXN0PEZsb2F0MzJ4ND4gbGlzdCkKKyAgICAgIDogX3N0b3JhZ2UgPSBuZXcgTmF0aXZlRmxvYXQzMkxpc3QobGlzdC5sZW5ndGggKiA0KSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICB2YXIgZSA9IGxpc3RbaV07CisgICAgICBfc3RvcmFnZVsoaSAqIDQpICsgMF0gPSBlLng7CisgICAgICBfc3RvcmFnZVsoaSAqIDQpICsgMV0gPSBlLnk7CisgICAgICBfc3RvcmFnZVsoaSAqIDQpICsgMl0gPSBlLno7CisgICAgICBfc3RvcmFnZVsoaSAqIDQpICsgM10gPSBlLnc7CisgICAgfQorICB9CisKKyAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gRmxvYXQzMng0TGlzdDsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAorICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgorICAgKi8KKyAgZmFjdG9yeSBOYXRpdmVGbG9hdDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQzMng0PiBsaXN0KSB7CisgICAgaWYgKGxpc3QgaXMgTmF0aXZlRmxvYXQzMng0TGlzdCkgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDRMaXN0Ll9leHRlcm5hbFN0b3JhZ2UoCisgICAgICAgICAgbmV3IE5hdGl2ZUZsb2F0MzJMaXN0LmZyb21MaXN0KGxpc3QuX3N0b3JhZ2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDRMaXN0Ll9zbG93RnJvbUxpc3QobGlzdCk7CisgICAgfQorICB9CisKKyAgQnl0ZUJ1ZmZlciBnZXQgYnVmZmVyID0+IF9zdG9yYWdlLmJ1ZmZlcjsKKworICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXMgPT4gX3N0b3JhZ2UubGVuZ3RoSW5CeXRlczsKKworICBpbnQgZ2V0IG9mZnNldEluQnl0ZXMgPT4gX3N0b3JhZ2Uub2Zmc2V0SW5CeXRlczsKKworICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyA9PiBGbG9hdDMyeDRMaXN0LkJZVEVTX1BFUl9FTEVNRU5UOworCisgIHZvaWQgX2ludmFsaWRJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGxpc3QgaW5kZXggJGluZGV4Jyk7CisgICAgfQorICB9CisKKyAgdm9pZCBfY2hlY2tJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKKyAgICBpZiAoSlMoJ2Jvb2wnLCAnKCMgPj4+IDAgIT0gIyknLCBpbmRleCwgaW5kZXgpIHx8IGluZGV4ID49IGxlbmd0aCkgeworICAgICAgX2ludmFsaWRJbmRleChpbmRleCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBpbnQgX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZW5ndGgpIHsKKyAgICAvLyBGb3IgYHN1Ymxpc3RgIHRoZSBbc3RhcnRdIGFuZCBbZW5kXSBpbmRpY2VzIGFyZSBhbGxvd2VkIHRvIGJlIGVxdWFsIHRvCisgICAgLy8gW2xlbmd0aF0uIEhvd2V2ZXIsIFtfY2hlY2tJbmRleF0gb25seSBhbGxvd3MgaW5kaWNlcyBpbiB0aGUgcmFuZ2UKKyAgICAvLyAwIC4uIGxlbmd0aCAtIDEuIFdlIHRoZXJlZm9yZSBpbmNyZW1lbnQgdGhlIFtsZW5ndGhdIGFyZ3VtZW50IGJ5IG9uZQorICAgIC8vIGZvciB0aGUgW19jaGVja0luZGV4XSBjaGVja3MuCisgICAgX2NoZWNrSW5kZXgoc3RhcnQsIGxlbmd0aCArIDEpOworICAgIGlmIChlbmQgPT0gbnVsbCkgcmV0dXJuIGxlbmd0aDsKKyAgICBfY2hlY2tJbmRleChlbmQsIGxlbmd0aCArIDEpOworICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGVuZCk7CisgICAgcmV0dXJuIGVuZDsKKyAgfQorCisgIGludCBnZXQgbGVuZ3RoID0+IF9zdG9yYWdlLmxlbmd0aCB+LyA0OworCisgIEZsb2F0MzJ4NCBvcGVyYXRvcltdKGludCBpbmRleCkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMF07CisgICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAxXTsKKyAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDJdOworICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWyhpbmRleCAqIDQpICsgM107CisgICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcltdPShpbnQgaW5kZXgsIE5hdGl2ZUZsb2F0MzJ4NCB2YWx1ZSkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMF0gPSB2YWx1ZS5fc3RvcmFnZVswXTsKKyAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDFdID0gdmFsdWUuX3N0b3JhZ2VbMV07CisgICAgX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAyXSA9IHZhbHVlLl9zdG9yYWdlWzJdOworICAgIF9zdG9yYWdlWyhpbmRleCAqIDQpICsgM10gPSB2YWx1ZS5fc3RvcmFnZVszXTsKKyAgfQorCisgIExpc3Q8RmxvYXQzMng0PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAorICAgICAgICBfc3RvcmFnZS5zdWJsaXN0KHN0YXJ0ICogNCwgZW5kICogNCkpOworICB9Cit9CisKKworLyoqCisgKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIEludDMyeDQgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKKyAqIFtUeXBlZERhdGFdLiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCisgKiBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBOYXRpdmVJbnQzMng0TGlzdAorICAgIGV4dGVuZHMgT2JqZWN0IHdpdGggTGlzdE1peGluPEludDMyeDQ+LCBGaXhlZExlbmd0aExpc3RNaXhpbjxJbnQzMng0PgorICAgIGltcGxlbWVudHMgSW50MzJ4NExpc3QgeworCisgIGZpbmFsIFVpbnQzMkxpc3QgX3N0b3JhZ2U7CisKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBbSW50MzJ4NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksCisgICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCisgICAqLworICBOYXRpdmVJbnQzMng0TGlzdChpbnQgbGVuZ3RoKSA6IF9zdG9yYWdlID0gbmV3IE5hdGl2ZVVpbnQzMkxpc3QobGVuZ3RoICogNCk7CisKKyAgTmF0aXZlSW50MzJ4NExpc3QuX2V4dGVybmFsU3RvcmFnZShVaW50MzJMaXN0IHN0b3JhZ2UpIDogX3N0b3JhZ2UgPSBzdG9yYWdlOworCisgIE5hdGl2ZUludDMyeDRMaXN0Ll9zbG93RnJvbUxpc3QoTGlzdDxJbnQzMng0PiBsaXN0KQorICAgICAgOiBfc3RvcmFnZSA9IG5ldyBOYXRpdmVVaW50MzJMaXN0KGxpc3QubGVuZ3RoICogNCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgeworICAgICAgdmFyIGUgPSBsaXN0W2ldOworICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDBdID0gZS54OworICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDFdID0gZS55OworICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDJdID0gZS56OworICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDNdID0gZS53OworICAgIH0KKyAgfQorCisgIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlID0+IEludDMyeDRMaXN0OworCisgIC8qKgorICAgKiBDcmVhdGVzIGEgW0ludDMyeDRMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAorICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgorICAgKi8KKyAgZmFjdG9yeSBOYXRpdmVJbnQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEludDMyeDQ+IGxpc3QpIHsKKyAgICBpZiAobGlzdCBpcyBOYXRpdmVJbnQzMng0TGlzdCkgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAorICAgICAgICAgIG5ldyBOYXRpdmVVaW50MzJMaXN0LmZyb21MaXN0KGxpc3QuX3N0b3JhZ2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0TGlzdC5fc2xvd0Zyb21MaXN0KGxpc3QpOworICAgIH0KKyAgfQorCisgIEJ5dGVCdWZmZXIgZ2V0IGJ1ZmZlciA9PiBfc3RvcmFnZS5idWZmZXI7CisKKyAgaW50IGdldCBsZW5ndGhJbkJ5dGVzID0+IF9zdG9yYWdlLmxlbmd0aEluQnl0ZXM7CisKKyAgaW50IGdldCBvZmZzZXRJbkJ5dGVzID0+IF9zdG9yYWdlLm9mZnNldEluQnl0ZXM7CisKKyAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgPT4gSW50MzJ4NExpc3QuQllURVNfUEVSX0VMRU1FTlQ7CisKKyAgdm9pZCBfaW52YWxpZEluZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgeworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgbGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgbGlzdCBpbmRleCAkaW5kZXgnKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9jaGVja0luZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgeworICAgIGlmIChKUygnYm9vbCcsICcoIyA+Pj4gMCAhPSAjKScsIGluZGV4LCBpbmRleCkKKyAgICAgICAgfHwgSlMoJ2Jvb2wnLCAnIyA+PSAjJywgaW5kZXgsIGxlbmd0aCkpIHsKKyAgICAgIF9pbnZhbGlkSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgfQorICB9CisKKyAgaW50IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGVuZ3RoKSB7CisgICAgLy8gRm9yIGBzdWJsaXN0YCB0aGUgW3N0YXJ0XSBhbmQgW2VuZF0gaW5kaWNlcyBhcmUgYWxsb3dlZCB0byBiZSBlcXVhbCB0bworICAgIC8vIFtsZW5ndGhdLiBIb3dldmVyLCBbX2NoZWNrSW5kZXhdIG9ubHkgYWxsb3dzIGluZGljZXMgaW4gdGhlIHJhbmdlCisgICAgLy8gMCAuLiBsZW5ndGggLSAxLiBXZSB0aGVyZWZvcmUgaW5jcmVtZW50IHRoZSBbbGVuZ3RoXSBhcmd1bWVudCBieSBvbmUKKyAgICAvLyBmb3IgdGhlIFtfY2hlY2tJbmRleF0gY2hlY2tzLgorICAgIF9jaGVja0luZGV4KHN0YXJ0LCBsZW5ndGggKyAxKTsKKyAgICBpZiAoZW5kID09IG51bGwpIHJldHVybiBsZW5ndGg7CisgICAgX2NoZWNrSW5kZXgoZW5kLCBsZW5ndGggKyAxKTsKKyAgICBpZiAoc3RhcnQgPiBlbmQpIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBlbmQpOworICAgIHJldHVybiBlbmQ7CisgIH0KKworICBpbnQgZ2V0IGxlbmd0aCA9PiBfc3RvcmFnZS5sZW5ndGggfi8gNDsKKworICBJbnQzMng0IG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgaW50IF94ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAwXTsKKyAgICBpbnQgX3kgPSBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDFdOworICAgIGludCBfeiA9IF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMl07CisgICAgaW50IF93ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAzXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgdm9pZCBvcGVyYXRvcltdPShpbnQgaW5kZXgsIE5hdGl2ZUludDMyeDQgdmFsdWUpIHsKKyAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKKyAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDBdID0gdmFsdWUuX3N0b3JhZ2VbMF07CisgICAgX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAxXSA9IHZhbHVlLl9zdG9yYWdlWzFdOworICAgIF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMl0gPSB2YWx1ZS5fc3RvcmFnZVsyXTsKKyAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDNdID0gdmFsdWUuX3N0b3JhZ2VbM107CisgIH0KKworICBMaXN0PEludDMyeDQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKKyAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAorICAgICAgICBfc3RvcmFnZS5zdWJsaXN0KHN0YXJ0ICogNCwgZW5kICogNCkpOworICB9Cit9CisKKworLyoqCisgKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIEZsb2F0NjR4MiBudW1iZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQorICogW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJhYmx5IG1vcmUKKyAqIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIE5hdGl2ZUZsb2F0NjR4Mkxpc3QKKyAgICBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxGbG9hdDY0eDI+LCBGaXhlZExlbmd0aExpc3RNaXhpbjxGbG9hdDY0eDI+CisgICAgaW1wbGVtZW50cyBGbG9hdDY0eDJMaXN0IHsKKworICBmaW5hbCBOYXRpdmVGbG9hdDY0TGlzdCBfc3RvcmFnZTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLAorICAgKiBhbGwgb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgorICAgKi8KKyAgTmF0aXZlRmxvYXQ2NHgyTGlzdChpbnQgbGVuZ3RoKQorICAgICAgOiBfc3RvcmFnZSA9IG5ldyBOYXRpdmVGbG9hdDY0TGlzdChsZW5ndGggKiAyKTsKKworICBOYXRpdmVGbG9hdDY0eDJMaXN0Ll9leHRlcm5hbFN0b3JhZ2UodGhpcy5fc3RvcmFnZSk7CisKKyAgTmF0aXZlRmxvYXQ2NHgyTGlzdC5fc2xvd0Zyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBsaXN0KQorICAgICAgOiBfc3RvcmFnZSA9IG5ldyBOYXRpdmVGbG9hdDY0TGlzdChsaXN0Lmxlbmd0aCAqIDIpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICAgIHZhciBlID0gbGlzdFtpXTsKKyAgICAgIF9zdG9yYWdlWyhpICogMikgKyAwXSA9IGUueDsKKyAgICAgIF9zdG9yYWdlWyhpICogMikgKyAxXSA9IGUueTsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAorICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgorICAgKi8KKyAgZmFjdG9yeSBOYXRpdmVGbG9hdDY0eDJMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBsaXN0KSB7CisgICAgaWYgKGxpc3QgaXMgTmF0aXZlRmxvYXQ2NHgyTGlzdCkgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDJMaXN0Ll9leHRlcm5hbFN0b3JhZ2UoCisgICAgICAgICAgbmV3IE5hdGl2ZUZsb2F0NjRMaXN0LmZyb21MaXN0KGxpc3QuX3N0b3JhZ2UpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDJMaXN0Ll9zbG93RnJvbUxpc3QobGlzdCk7CisgICAgfQorICB9CisKKyAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gRmxvYXQ2NHgyTGlzdDsKKworICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gX3N0b3JhZ2UuYnVmZmVyOworCisgIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfc3RvcmFnZS5sZW5ndGhJbkJ5dGVzOworCisgIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfc3RvcmFnZS5vZmZzZXRJbkJ5dGVzOworCisgIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IEZsb2F0NjR4Mkxpc3QuQllURVNfUEVSX0VMRU1FTlQ7CisKKyAgdm9pZCBfaW52YWxpZEluZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgeworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgbGVuZ3RoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgbGlzdCBpbmRleCAkaW5kZXgnKTsKKyAgICB9CisgIH0KKworICB2b2lkIF9jaGVja0luZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgeworICAgIGlmIChKUygnYm9vbCcsICcoIyA+Pj4gMCAhPSAjKScsIGluZGV4LCBpbmRleCkgfHwgaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICBfaW52YWxpZEluZGV4KGluZGV4LCBsZW5ndGgpOworICAgIH0KKyAgfQorCisgIGludCBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCkgeworICAgIC8vIEZvciBgc3VibGlzdGAgdGhlIFtzdGFydF0gYW5kIFtlbmRdIGluZGljZXMgYXJlIGFsbG93ZWQgdG8gYmUgZXF1YWwgdG8KKyAgICAvLyBbbGVuZ3RoXS4gSG93ZXZlciwgW19jaGVja0luZGV4XSBvbmx5IGFsbG93cyBpbmRpY2VzIGluIHRoZSByYW5nZQorICAgIC8vIDAgLi4gbGVuZ3RoIC0gMS4gV2UgdGhlcmVmb3JlIGluY3JlbWVudCB0aGUgW2xlbmd0aF0gYXJndW1lbnQgYnkgb25lCisgICAgLy8gZm9yIHRoZSBbX2NoZWNrSW5kZXhdIGNoZWNrcy4KKyAgICBfY2hlY2tJbmRleChzdGFydCwgbGVuZ3RoICsgMSk7CisgICAgaWYgKGVuZCA9PSBudWxsKSByZXR1cm4gbGVuZ3RoOworICAgIF9jaGVja0luZGV4KGVuZCwgbGVuZ3RoICsgMSk7CisgICAgaWYgKHN0YXJ0ID4gZW5kKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgZW5kKTsKKyAgICByZXR1cm4gZW5kOworICB9CisKKyAgaW50IGdldCBsZW5ndGggPT4gX3N0b3JhZ2UubGVuZ3RoIH4vIDI7CisKKyAgRmxvYXQ2NHgyIG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbKGluZGV4ICogMikgKyAwXTsKKyAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsoaW5kZXggKiAyKSArIDFdOworICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKF94LCBfeSk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yW109KGludCBpbmRleCwgTmF0aXZlRmxvYXQ2NHgyIHZhbHVlKSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgX3N0b3JhZ2VbKGluZGV4ICogMikgKyAwXSA9IHZhbHVlLl9zdG9yYWdlWzBdOworICAgIF9zdG9yYWdlWyhpbmRleCAqIDIpICsgMV0gPSB2YWx1ZS5fc3RvcmFnZVsxXTsKKyAgfQorCisgIExpc3Q8RmxvYXQ2NHgyPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQ2NHgyTGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAorICAgICAgICBfc3RvcmFnZS5zdWJsaXN0KHN0YXJ0ICogMiwgZW5kICogMikpOworICB9Cit9CisKK2NsYXNzIE5hdGl2ZVR5cGVkRGF0YSBpbXBsZW1lbnRzIFR5cGVkRGF0YSBuYXRpdmUgIkFycmF5QnVmZmVyVmlldyIgeworICAvKioKKyAgICogUmV0dXJucyB0aGUgYnl0ZSBidWZmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgQENyZWF0ZXMoJ05hdGl2ZUJ5dGVCdWZmZXInKQorICAvLyBNYXkgYmUgTnVsbCBmb3IgSUUncyBDYW52YXNQaXhlbEFycmF5LgorICBAUmV0dXJucygnTmF0aXZlQnl0ZUJ1ZmZlcnxOdWxsJykKKyAgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHZpZXcsIGluIGJ5dGVzLgorICAgKi8KKyAgQEpTTmFtZSgnYnl0ZUxlbmd0aCcpCisgIGZpbmFsIGludCBsZW5ndGhJbkJ5dGVzOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgaW4gYnl0ZXMgaW50byB0aGUgdW5kZXJseWluZyBieXRlIGJ1ZmZlciBvZiB0aGlzIHZpZXcuCisgICAqLworICBASlNOYW1lKCdieXRlT2Zmc2V0JykKKyAgZmluYWwgaW50IG9mZnNldEluQnl0ZXM7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBlbGVtZW50IGluIHRoaXMKKyAgICogbGlzdC4KKyAgICovCisgIEBKU05hbWUoJ0JZVEVTX1BFUl9FTEVNRU5UJykKKyAgZmluYWwgaW50IGVsZW1lbnRTaXplSW5CeXRlczsKKworICB2b2lkIF9pbnZhbGlkSW5kZXgoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKGluZGV4LCAwLCBsZW5ndGgpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBsaXN0IGluZGV4ICRpbmRleCcpOworICAgIH0KKyAgfQorCisgIHZvaWQgX2NoZWNrSW5kZXgoaW50IGluZGV4LCBpbnQgbGVuZ3RoKSB7CisgICAgaWYgKEpTKCdib29sJywgJygjID4+PiAwKSAhPT0gIycsIGluZGV4LCBpbmRleCkgfHwKKyAgICAgICAgSlMoJ2ludCcsICcjJywgaW5kZXgpID49IGxlbmd0aCkgeyAgLy8gJ2ludCcgZ3VhcmFudGVlZCBieSBhYm92ZSB0ZXN0LgorICAgICAgX2ludmFsaWRJbmRleChpbmRleCwgbGVuZ3RoKTsKKyAgICB9CisgIH0KKworICBpbnQgX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZW5ndGgpIHsKKyAgICAvLyBGb3IgYHN1Ymxpc3RgIHRoZSBbc3RhcnRdIGFuZCBbZW5kXSBpbmRpY2VzIGFyZSBhbGxvd2VkIHRvIGJlIGVxdWFsIHRvCisgICAgLy8gW2xlbmd0aF0uIEhvd2V2ZXIsIFtfY2hlY2tJbmRleF0gb25seSBhbGxvd3MgaW5kaWNlcyBpbiB0aGUgcmFuZ2UKKyAgICAvLyAwIC4uIGxlbmd0aCAtIDEuIFdlIHRoZXJlZm9yZSBpbmNyZW1lbnQgdGhlIFtsZW5ndGhdIGFyZ3VtZW50IGJ5IG9uZQorICAgIC8vIGZvciB0aGUgW19jaGVja0luZGV4XSBjaGVja3MuCisgICAgX2NoZWNrSW5kZXgoc3RhcnQsIGxlbmd0aCArIDEpOworICAgIGlmIChlbmQgPT0gbnVsbCkgcmV0dXJuIGxlbmd0aDsKKyAgICBfY2hlY2tJbmRleChlbmQsIGxlbmd0aCArIDEpOworICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGVuZCk7CisgICAgcmV0dXJuIGVuZDsKKyAgfQorfQorCisKKy8vIFZhbGlkYXRlcyB0aGUgdW5uYW1lZCBjb25zdHJ1Y3RvciBsZW5ndGggYXJndW1lbnQuICBDaGVja2luZyBpcyBuZWNlc3NhcnkKKy8vIGJlY2F1c2UgcGFzc2luZyB1bnZhbGlkYXRlZCB2YWx1ZXMgdG8gdGhlIG5hdGl2ZSBjb25zdHJ1Y3RvcnMgY2FuIGNhdXNlCisvLyBjb252ZXJzaW9ucyBvciBjcmVhdGUgdmlld3MuCitpbnQgX2NoZWNrTGVuZ3RoKGxlbmd0aCkgeworICBpZiAobGVuZ3RoIGlzISBpbnQpIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGxlbmd0aCAkbGVuZ3RoJyk7CisgIHJldHVybiBsZW5ndGg7Cit9CisKKy8vIFZhbGlkYXRlcyBgLnZpZXdgIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4gIENoZWNraW5nIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCisvLyBwYXNzaW5nIHVudmFsaWRhdGVkIHZhbHVlcyB0byB0aGUgbmF0aXZlIGNvbnN0cnVjdG9ycyBjYW4gY2F1c2UgY29udmVyc2lvbnMKKy8vIChlLmcuIFN0cmluZyBhcmd1bWVudHMpIG9yIGNyZWF0ZSB0eXBlZCBkYXRhIG9iamVjdHMgdGhhdCBhcmUgbm90IGFjdHVhbGx5CisvLyB2aWV3cyBvZiB0aGUgaW5wdXQuCit2b2lkIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpIHsKKyAgaWYgKGJ1ZmZlciBpcyEgTmF0aXZlQnl0ZUJ1ZmZlcikgeworICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZpZXcgYnVmZmVyJyk7CisgIH0KKyAgaWYgKG9mZnNldEluQnl0ZXMgaXMhIGludCkgeworICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZpZXcgb2Zmc2V0SW5CeXRlcyAkb2Zmc2V0SW5CeXRlcycpOworICB9CisgIGlmIChsZW5ndGggIT0gbnVsbCAmJiBsZW5ndGggaXMhIGludCkgeworICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIHZpZXcgbGVuZ3RoICRsZW5ndGgnKTsKKyAgfQorfQorCisvLyBFbnN1cmVzIHRoYXQgW2xpc3RdIGlzIGEgSmF2YVNjcmlwdCBBcnJheSBvciBhIHR5cGVkIGFycmF5LiAgSWYgbmVjZXNzYXJ5LAorLy8gcmV0dXJucyBhIGNvcHkgb2YgdGhlIGxpc3QuCitMaXN0IF9lbnN1cmVOYXRpdmVMaXN0KExpc3QgbGlzdCkgeworICBpZiAobGlzdCBpcyBKU0luZGV4YWJsZSkgcmV0dXJuIGxpc3Q7CisgIExpc3QgcmVzdWx0ID0gbmV3IExpc3QobGlzdC5sZW5ndGgpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKKyAgICByZXN1bHRbaV0gPSBsaXN0W2ldOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKKworY2xhc3MgTmF0aXZlQnl0ZURhdGEgZXh0ZW5kcyBOYXRpdmVUeXBlZERhdGEgaW1wbGVtZW50cyBCeXRlRGF0YQorICAgIG5hdGl2ZSAiRGF0YVZpZXciIHsKKyAgLyoqCisgICAqIENyZWF0ZXMgYSBbQnl0ZURhdGFdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgorICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCisgICAqLworICBmYWN0b3J5IE5hdGl2ZUJ5dGVEYXRhKGludCBsZW5ndGgpID0+IF9jcmVhdGUxKF9jaGVja0xlbmd0aChsZW5ndGgpKTsKKworICAvKioKKyAgICogQ3JlYXRlcyBhbiBbQnl0ZURhdGFdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiB0aGUgc3BlY2lmaWVkCisgICAqIGJ5dGUgYnVmZmVyLiBDaGFuZ2VzIGluIHRoZSBbQnl0ZURhdGFdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQorICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKKyAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgorICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcworICAgKiB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKKyAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KKyAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KKyAgICovCisgIGZhY3RvcnkgTmF0aXZlQnl0ZURhdGEudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKSB7CisgICAgX2NoZWNrVmlld0FyZ3VtZW50cyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgICAgcmV0dXJuIGxlbmd0aCA9PSBudWxsCisgICAgICAgID8gX2NyZWF0ZTIoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzKQorICAgICAgICA6IF9jcmVhdGUzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKKyAgfQorCisgIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlID0+IEJ5dGVEYXRhOworCisgIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IDE7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAorICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gSUVFRSA3NTQKKyAgICogc2luZ2xlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQgZm9ybWF0IChiaW5hcnkzMikuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgbnVtIGdldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX2dldEZsb2F0MzIoYnl0ZU9mZnNldCwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOID09IGVuZGlhbik7CisKKyAgQEpTTmFtZSgnZ2V0RmxvYXQzMicpCisgIEBSZXR1cm5zKCdudW0nKQorICBudW0gX2dldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBlaWdodCBieXRlcyBhdAorICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gSUVFRSA3NTQKKyAgICogZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQgZm9ybWF0IChiaW5hcnk2NCkuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgbnVtIGdldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX2dldEZsb2F0NjQoYnl0ZU9mZnNldCwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOID09IGVuZGlhbik7CisKKyAgQEpTTmFtZSgnZ2V0RmxvYXQ2NCcpCisgIEBSZXR1cm5zKCdudW0nKQorICBudW0gX2dldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSB0d28gYnl0ZXMgYXQKKyAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CisgICAqIGZvcm0uCisgICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDI8c3VwPjE1PC9zdXA+IGFuZCAyPHN1cD4xNTwvc3VwPiAtIDEsCisgICAqIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCisgICAqLworICBpbnQgZ2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX2dldEludDE2KGJ5dGVPZmZzZXQsIEVuZGlhbm5lc3MuTElUVExFX0VORElBTiA9PSBlbmRpYW4pOworCisgIEBKU05hbWUoJ2dldEludDE2JykKKyAgQFJldHVybnMoJ2ludCcpCisgIGludCBfZ2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3VyIGJ5dGVzIGF0CisgICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB0d28ncyBjb21wbGVtZW50IGJpbmFyeQorICAgKiBmb3JtLgorICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAyPHN1cD4zMTwvc3VwPiBhbmQgMjxzdXA+MzE8L3N1cD4gLSAxLAorICAgKiBpbmNsdXNpdmUuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgaW50IGdldEludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KKyAgICAgIF9nZXRJbnQzMihieXRlT2Zmc2V0LCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdnZXRJbnQzMicpCisgIEBSZXR1cm5zKCdpbnQnKQorICBpbnQgX2dldEludDMyKGludCBieXRlT2Zmc2V0LCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgYXQKKyAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CisgICAqIGZvcm0uCisgICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsCisgICAqIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCisgICAqLworICBpbnQgZ2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0ludDY0IGFjY2Vzc29yIG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4nKTsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGUgYXQgdGhlCisgICAqIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5CisgICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpIG5hdGl2ZTsKKworICAvKioKKyAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nCisgICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKKyAgICogZm9ybS4KKyAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjE2PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgorICAgKgorICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKKyAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIGludCBnZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX2dldFVpbnQxNihieXRlT2Zmc2V0LCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdnZXRVaW50MTYnKQorICBAUmV0dXJucygnSlNVSW50MzEnKQorICBpbnQgX2dldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nCisgICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKKyAgICogZm9ybS4KKyAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjMyPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgorICAgKgorICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKKyAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIGludCBnZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX2dldFVpbnQzMihieXRlT2Zmc2V0LCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdnZXRVaW50MzInKQorICBAUmV0dXJucygnSlNVSW50MzInKQorICBpbnQgX2dldFVpbnQzMihpbnQgYnl0ZU9mZnNldCwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOworCisgIC8qKgorICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBlaWdodCBieXRlcyBzdGFydGluZworICAgKiBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5CisgICAqIGZvcm0uCisgICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kICAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCisgICAqLworICBpbnQgZ2V0VWludDY0KGludCBieXRlT2Zmc2V0LCBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVaW50NjQgYWNjZXNzb3Igbm90IHN1cHBvcnRlZCBieSBkYXJ0MmpzLicpOworICB9CisKKyAgLyoqCisgICAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmllZAorICAgKiBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeSBmb3JtLiBUaGUKKyAgICogcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAyNTUsIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgaW50IGdldFVpbnQ4KGludCBieXRlT2Zmc2V0KSBuYXRpdmU7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcworICAgKiBvYmplY3QgdG8gdGhlIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50CisgICAqIChiaW5hcnkzMikgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLgorICAgKgorICAgKiAqKk5vdGUgdGhhdCB0aGlzIG1ldGhvZCBjYW4gbG9zZSBwcmVjaXNpb24uKiogVGhlIGlucHV0IFt2YWx1ZV0gaXMKKyAgICogYSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUsIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIDMyLWJpdAorICAgKiBmbG9hdGluZyBwb2ludCB2YWx1ZSBieSBJRUVFIDc1NCByb3VuZGluZyBydWxlcyBiZWZvcmUgaXQgaXMgc3RvcmVkLgorICAgKiBJZiBbdmFsdWVdIGNhbm5vdCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgYmluYXJ5MzIsIGl0IHdpbGwgYmUKKyAgICogY29udmVydGVkIHRvIHRoZSBuZWFyZXN0IGJpbmFyeTMyIHZhbHVlLiAgSWYgdHdvIGJpbmFyeTMyIHZhbHVlcyBhcmUKKyAgICogZXF1YWxseSBjbG9zZSwgdGhlIG9uZSB3aG9zZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgaXMgemVybyB3aWxsIGJlIHVzZWQuCisgICAqIE5vdGUgdGhhdCBmaW5pdGUgKGJ1dCBsYXJnZSkgdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gaW5maW5pdHksIGFuZAorICAgKiBzbWFsbCBub24temVybyB2YWx1ZXMgY2FuIGJlIGNvbnZlcnRlZCB0byB6ZXJvLgorICAgKgorICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKKyAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIHZvaWQgc2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgbnVtIHZhbHVlLAorICAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+CisgICAgICBfc2V0RmxvYXQzMihieXRlT2Zmc2V0LCB2YWx1ZSwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOID09IGVuZGlhbik7CisKKyAgQEpTTmFtZSgnc2V0RmxvYXQzMicpCisgIHZvaWQgX3NldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIG51bSB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCisgICAqIG9iamVjdCB0byB0aGUgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKKyAgICogKGJpbmFyeTY0KSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0uCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgdm9pZCBzZXRGbG9hdDY0KGludCBieXRlT2Zmc2V0LCBudW0gdmFsdWUsCisgICAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KKyAgICAgIF9zZXRGbG9hdDY0KGJ5dGVPZmZzZXQsIHZhbHVlLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdzZXRGbG9hdDY0JykKKyAgdm9pZCBfc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgbnVtIHZhbHVlLCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHR3byBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCisgICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAorICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgbGllCisgICAqIGJldHdlZW4gMjxzdXA+MTU8L3N1cD4gYW5kIDI8c3VwPjE1PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgorICAgKgorICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKKyAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KKyAgICAgIF9zZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSwgRW5kaWFubmVzcy5MSVRUTEVfRU5ESUFOID09IGVuZGlhbik7CisKKyAgQEpTTmFtZSgnc2V0SW50MTYnKQorICB2b2lkIF9zZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGZvdXIgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcworICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKKyAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gZm91ciBieXRlcy4gSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBsaWUKKyAgICogYmV0d2VlbiAyPHN1cD4zMTwvc3VwPiBhbmQgMjxzdXA+MzE8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgdm9pZCBzZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgorICAgICAgX3NldEludDMyKGJ5dGVPZmZzZXQsIHZhbHVlLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdzZXRJbnQzMicpCisgIHZvaWQgX3NldEludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKKworICAvKioKKyAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcworICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKKyAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgbGllCisgICAqIGJldHdlZW4gMjxzdXA+NjM8L3N1cD4gYW5kIDI8c3VwPjYzPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgorICAgKgorICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKKyAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIHZvaWQgc2V0SW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdJbnQ2NCBhY2Nlc3NvciBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuJyk7CisgIH0KKworICAvKioKKyAgICogU2V0cyB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCB0byB0aGUKKyAgICogdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLCB3aGljaAorICAgKiBtdXN0IGZpdCBpbiBhIHNpbmdsZSBieXRlLiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KKyAgICogLTEyOCBhbmQgMTI3LCBpbmNsdXNpdmUuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KKyAgICovCisgIHZvaWQgc2V0SW50OChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlKSBuYXRpdmU7CisKKyAgLyoqCisgICAqIFNldHMgdGhlIHR3byBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAorICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKKyAgICogd2hpY2ggbXVzdCBmaXQgaW4gdHdvIGJ5dGVzLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KKyAgICogMCBhbmQgMjxzdXA+MTY8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgdm9pZCBzZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+CisgICAgICBfc2V0VWludDE2KGJ5dGVPZmZzZXQsIHZhbHVlLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdzZXRVaW50MTYnKQorICB2b2lkIF9zZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0CisgICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAorICAgKiB3aGljaCBtdXN0IGZpdCBpbiBmb3VyIGJ5dGVzLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KKyAgICogMCBhbmQgMjxzdXA+MzI8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCisgICAqCisgICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgorICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgdm9pZCBzZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+CisgICAgICBfc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlLCBFbmRpYW5uZXNzLkxJVFRMRV9FTkRJQU4gPT0gZW5kaWFuKTsKKworICBASlNOYW1lKCdzZXRVaW50MzInKQorICB2b2lkIF9zZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOworCisgIC8qKgorICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAorICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKKyAgICogd2hpY2ggbXVzdCBmaXQgaW4gZWlnaHQgYnl0ZXMuIGluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbgorICAgKiAwIGFuZCAyPHN1cD42NDwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCisgICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCisgICAqLworICB2b2lkIHNldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLAorICAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgeworICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCdVaW50NjQgYWNjZXNzb3Igbm90IHN1cHBvcnRlZCBieSBkYXJ0MmpzLicpOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIGJ5dGUgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QgdG8gdGhlCisgICAqIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0CisgICAqIGluIGEgc2luZ2xlIGJ5dGUuIGluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyNTUsCisgICAqIGluY2x1c2l2ZS4KKyAgICoKKyAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsCisgICAqIG9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgorICAgKi8KKyAgdm9pZCBzZXRVaW50OChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlKSBuYXRpdmU7CisKKyAgc3RhdGljIE5hdGl2ZUJ5dGVEYXRhIF9jcmVhdGUxKGFyZykgPT4KKyAgICAgIEpTKCdOYXRpdmVCeXRlRGF0YScsICduZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKCMpKScsIGFyZyk7CisKKyAgc3RhdGljIE5hdGl2ZUJ5dGVEYXRhIF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+CisgICAgICBKUygnTmF0aXZlQnl0ZURhdGEnLCAnbmV3IERhdGFWaWV3KCMsICMpJywgYXJnMSwgYXJnMik7CisKKyAgc3RhdGljIE5hdGl2ZUJ5dGVEYXRhIF9jcmVhdGUzKGFyZzEsIGFyZzIsIGFyZzMpID0+CisgICAgICBKUygnTmF0aXZlQnl0ZURhdGEnLCAnbmV3IERhdGFWaWV3KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Cit9CisKKworYWJzdHJhY3QgY2xhc3MgTmF0aXZlVHlwZWRBcnJheSBleHRlbmRzIE5hdGl2ZVR5cGVkRGF0YQorICAgIGltcGxlbWVudHMgSmF2YVNjcmlwdEluZGV4aW5nQmVoYXZpb3IgeworICBpbnQgZ2V0IGxlbmd0aCA9PiBKUygnSlNVSW50MzInLCAnIy5sZW5ndGgnLCB0aGlzKTsKKworICBib29sIF9zZXRSYW5nZUZhc3QoaW50IHN0YXJ0LCBpbnQgZW5kLAorICAgICAgTmF0aXZlVHlwZWRBcnJheSBzb3VyY2UsIGludCBza2lwQ291bnQpIHsKKyAgICBpbnQgdGFyZ2V0TGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgX2NoZWNrSW5kZXgoc3RhcnQsIHRhcmdldExlbmd0aCArIDEpOworICAgIF9jaGVja0luZGV4KGVuZCwgdGFyZ2V0TGVuZ3RoICsgMSk7CisgICAgaWYgKHN0YXJ0ID4gZW5kKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgZW5kKTsKKyAgICBpbnQgY291bnQgPSBlbmQgLSBzdGFydDsKKworICAgIGlmIChza2lwQ291bnQgPCAwKSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihza2lwQ291bnQpOworCisgICAgaW50IHNvdXJjZUxlbmd0aCA9IHNvdXJjZS5sZW5ndGg7CisgICAgaWYgKHNvdXJjZUxlbmd0aCAtIHNraXBDb3VudCA8IGNvdW50KSAgeworICAgICAgdGhyb3cgbmV3IFN0YXRlRXJyb3IoJ05vdCBlbm91Z2ggZWxlbWVudHMnKTsKKyAgICB9CisKKyAgICBpZiAoc2tpcENvdW50ICE9IDAgfHwgc291cmNlTGVuZ3RoICE9IGNvdW50KSB7CisgICAgICAvLyBDcmVhdGUgYSB2aWV3IG9mIHRoZSBleGFjdCBzdWJyYW5nZSB0aGF0IGlzIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UuCisgICAgICBzb3VyY2UgPSBKUygnJywgJyMuc3ViYXJyYXkoIywgIyknLAorICAgICAgICAgIHNvdXJjZSwgc2tpcENvdW50LCBza2lwQ291bnQgKyBjb3VudCk7CisgICAgfQorICAgIEpTKCd2b2lkJywgJyMuc2V0KCMsICMpJywgdGhpcywgc291cmNlLCBzdGFydCk7CisgIH0KK30KKworYWJzdHJhY3QgY2xhc3MgTmF0aXZlVHlwZWRBcnJheU9mRG91YmxlCisgICAgZXh0ZW5kcyBOYXRpdmVUeXBlZEFycmF5CisgICAgICAgIHdpdGggTGlzdE1peGluPGRvdWJsZT4sIEZpeGVkTGVuZ3RoTGlzdE1peGluPGRvdWJsZT4geworCisgIG51bSBvcGVyYXRvcltdKGludCBpbmRleCkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIHJldHVybiBKUygnbnVtJywgJyNbI10nLCB0aGlzLCBpbmRleCk7CisgIH0KKworICB2b2lkIG9wZXJhdG9yW109KGludCBpbmRleCwgbnVtIHZhbHVlKSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgSlMoJ3ZvaWQnLCAnI1sjXSA9ICMnLCB0aGlzLCBpbmRleCwgdmFsdWUpOworICB9CisKKyAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPGRvdWJsZT4gaXRlcmFibGUsCisgICAgICAgICAgICAgICAgW2ludCBza2lwQ291bnQgPSAwXSkgeworICAgIGlmIChpdGVyYWJsZSBpcyBOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUpIHsKKyAgICAgIF9zZXRSYW5nZUZhc3Qoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOworICB9Cit9CisKK2Fic3RyYWN0IGNsYXNzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAorICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheQorICAgICAgICB3aXRoIExpc3RNaXhpbjxpbnQ+LCBGaXhlZExlbmd0aExpc3RNaXhpbjxpbnQ+CisgICAgaW1wbGVtZW50cyBMaXN0PGludD4geworCisgIC8vIG9wZXJhdG9yW10oKSBpcyBub3QgaGVyZSBzaW5jZSBkaWZmZXJlbnQgdmVyc2lvbnMgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuCisgIC8vIHR5cGVzCisKKyAgdm9pZCBvcGVyYXRvcltdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIEpTKCd2b2lkJywgJyNbI10gPSAjJywgdGhpcywgaW5kZXgsIHZhbHVlKTsKKyAgfQorCisgIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxpbnQ+IGl0ZXJhYmxlLAorICAgICAgICAgICAgICAgIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKKyAgICBpZiAoaXRlcmFibGUgaXMgTmF0aXZlVHlwZWRBcnJheU9mSW50KSB7CisgICAgICBfc2V0UmFuZ2VGYXN0KHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdXBlci5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKKyAgfQorfQorCisKK2NsYXNzIE5hdGl2ZUZsb2F0MzJMaXN0CisgICAgZXh0ZW5kcyBOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUKKyAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0CisgICAgbmF0aXZlICJGbG9hdDMyQXJyYXkiIHsKKworICBmYWN0b3J5IE5hdGl2ZUZsb2F0MzJMaXN0KGludCBsZW5ndGgpID0+IF9jcmVhdGUxKF9jaGVja0xlbmd0aChsZW5ndGgpKTsKKworICBmYWN0b3J5IE5hdGl2ZUZsb2F0MzJMaXN0LmZyb21MaXN0KExpc3Q8ZG91YmxlPiBlbGVtZW50cykgPT4KKyAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVGbG9hdDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKKyAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKKyAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKKyAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCisgICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICB9CisKKyAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gRmxvYXQzMkxpc3Q7CisKKyAgTGlzdDxkb3VibGU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKKyAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CisgICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVGbG9hdDMyTGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7CisgICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7CisgIH0KKworICBzdGF0aWMgTmF0aXZlRmxvYXQzMkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgorICAgICAgSlMoJ05hdGl2ZUZsb2F0MzJMaXN0JywgJ25ldyBGbG9hdDMyQXJyYXkoIyknLCBhcmcpOworCisgIHN0YXRpYyBOYXRpdmVGbG9hdDMyTGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgorICAgICAgSlMoJ05hdGl2ZUZsb2F0MzJMaXN0JywgJ25ldyBGbG9hdDMyQXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKKworICBzdGF0aWMgTmF0aXZlRmxvYXQzMkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KKyAgICAgIEpTKCdOYXRpdmVGbG9hdDMyTGlzdCcsICduZXcgRmxvYXQzMkFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Cit9CisKKworY2xhc3MgTmF0aXZlRmxvYXQ2NExpc3QKKyAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkRvdWJsZQorICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QKKyAgICBuYXRpdmUgIkZsb2F0NjRBcnJheSIgeworCisgIGZhY3RvcnkgTmF0aXZlRmxvYXQ2NExpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOworCisgIGZhY3RvcnkgTmF0aXZlRmxvYXQ2NExpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSA9PgorICAgICAgX2NyZWF0ZTEoX2Vuc3VyZU5hdGl2ZUxpc3QoZWxlbWVudHMpKTsKKworICBmYWN0b3J5IE5hdGl2ZUZsb2F0NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBGbG9hdDY0TGlzdDsKKworICBMaXN0PGRvdWJsZT4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgeworICAgIGVuZCA9IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKKyAgICB2YXIgc291cmNlID0gSlMoJ05hdGl2ZUZsb2F0NjRMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKKyAgfQorCisgIHN0YXRpYyBOYXRpdmVGbG9hdDY0TGlzdCBfY3JlYXRlMShhcmcpID0+CisgICAgICBKUygnTmF0aXZlRmxvYXQ2NExpc3QnLCAnbmV3IEZsb2F0NjRBcnJheSgjKScsIGFyZyk7CisKKyAgc3RhdGljIE5hdGl2ZUZsb2F0NjRMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+CisgICAgICBKUygnTmF0aXZlRmxvYXQ2NExpc3QnLCAnbmV3IEZsb2F0NjRBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOworCisgIHN0YXRpYyBOYXRpdmVGbG9hdDY0TGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgorICAgICAgSlMoJ05hdGl2ZUZsb2F0NjRMaXN0JywgJ25ldyBGbG9hdDY0QXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKK30KKworCitjbGFzcyBOYXRpdmVJbnQxNkxpc3QKKyAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAorICAgIGltcGxlbWVudHMgSW50MTZMaXN0CisgICAgbmF0aXZlICJJbnQxNkFycmF5IiB7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQxNkxpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOworCisgIGZhY3RvcnkgTmF0aXZlSW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQxNkxpc3QudmlldyhOYXRpdmVCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBJbnQxNkxpc3Q7CisKKyAgaW50IG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgcmV0dXJuIEpTKCdpbnQnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKKyAgfQorCisgIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlSW50MTZMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKKyAgfQorCisgIHN0YXRpYyBOYXRpdmVJbnQxNkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDE2TGlzdCcsICduZXcgSW50MTZBcnJheSgjKScsIGFyZyk7CisKKyAgc3RhdGljIE5hdGl2ZUludDE2TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDE2TGlzdCcsICduZXcgSW50MTZBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOworCisgIHN0YXRpYyBOYXRpdmVJbnQxNkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KKyAgICAgIEpTKCdOYXRpdmVJbnQxNkxpc3QnLCAnbmV3IEludDE2QXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKK30KKworCitjbGFzcyBOYXRpdmVJbnQzMkxpc3QKKyAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAorICAgIGltcGxlbWVudHMgSW50MzJMaXN0CisgICAgbmF0aXZlICJJbnQzMkFycmF5IiB7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQzMkxpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOworCisgIGZhY3RvcnkgTmF0aXZlSW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQzMkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBJbnQzMkxpc3Q7CisKKyAgaW50IG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgcmV0dXJuIEpTKCdpbnQnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKKyAgfQorCisgIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlSW50MzJMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKKyAgfQorCisgIHN0YXRpYyBOYXRpdmVJbnQzMkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDMyTGlzdCcsICduZXcgSW50MzJBcnJheSgjKScsIGFyZyk7CisKKyAgc3RhdGljIE5hdGl2ZUludDMyTGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDMyTGlzdCcsICduZXcgSW50MzJBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOworCisgIHN0YXRpYyBOYXRpdmVJbnQzMkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KKyAgICAgIEpTKCdOYXRpdmVJbnQzMkxpc3QnLCAnbmV3IEludDMyQXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKK30KKworCitjbGFzcyBOYXRpdmVJbnQ4TGlzdAorICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50CisgICAgaW1wbGVtZW50cyBJbnQ4TGlzdAorICAgIG5hdGl2ZSAiSW50OEFycmF5IiB7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQ4TGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+CisgICAgICBfY3JlYXRlMShfZW5zdXJlTmF0aXZlTGlzdChlbGVtZW50cykpOworCisgIGZhY3RvcnkgTmF0aXZlSW50OExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBJbnQ4TGlzdDsKKworICBpbnQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKKyAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKKyAgICByZXR1cm4gSlMoJ2ludCcsICcjWyNdJywgdGhpcywgaW5kZXgpOworICB9CisKKyAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKKyAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CisgICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVJbnQ4TGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7CisgICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7CisgIH0KKworICBzdGF0aWMgTmF0aXZlSW50OExpc3QgX2NyZWF0ZTEoYXJnKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDhMaXN0JywgJ25ldyBJbnQ4QXJyYXkoIyknLCBhcmcpOworCisgIHN0YXRpYyBOYXRpdmVJbnQ4TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgorICAgICAgSlMoJ05hdGl2ZUludDhMaXN0JywgJ25ldyBJbnQ4QXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKKworICBzdGF0aWMgSW50OExpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KKyAgICAgIEpTKCdOYXRpdmVJbnQ4TGlzdCcsICduZXcgSW50OEFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Cit9CisKKworY2xhc3MgTmF0aXZlVWludDE2TGlzdAorICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50CisgICAgaW1wbGVtZW50cyBVaW50MTZMaXN0CisgICAgbmF0aXZlICJVaW50MTZBcnJheSIgeworCisgIGZhY3RvcnkgTmF0aXZlVWludDE2TGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVVaW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBsaXN0KSA9PgorICAgICAgX2NyZWF0ZTEoX2Vuc3VyZU5hdGl2ZUxpc3QobGlzdCkpOworCisgIGZhY3RvcnkgTmF0aXZlVWludDE2TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBVaW50MTZMaXN0OworCisgIGludCBvcGVyYXRvcltdKGludCBpbmRleCkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIHJldHVybiBKUygnSlNVSW50MzEnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKKyAgfQorCisgIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlVWludDE2TGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7CisgICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7CisgIH0KKworICBzdGF0aWMgTmF0aXZlVWludDE2TGlzdCBfY3JlYXRlMShhcmcpID0+CisgICAgICBKUygnTmF0aXZlVWludDE2TGlzdCcsICduZXcgVWludDE2QXJyYXkoIyknLCBhcmcpOworCisgIHN0YXRpYyBOYXRpdmVVaW50MTZMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+CisgICAgICBKUygnTmF0aXZlVWludDE2TGlzdCcsICduZXcgVWludDE2QXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKKworICBzdGF0aWMgTmF0aXZlVWludDE2TGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgorICAgICAgSlMoJ05hdGl2ZVVpbnQxNkxpc3QnLCAnbmV3IFVpbnQxNkFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Cit9CisKKworY2xhc3MgTmF0aXZlVWludDMyTGlzdAorICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50CisgICAgaW1wbGVtZW50cyBVaW50MzJMaXN0CisgICAgbmF0aXZlICJVaW50MzJBcnJheSIgeworCisgIGZhY3RvcnkgTmF0aXZlVWludDMyTGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVVaW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVVaW50MzJMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRJbkJ5dGVzLCBpbnQgbGVuZ3RoKSB7CisgICAgX2NoZWNrVmlld0FyZ3VtZW50cyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgICAgcmV0dXJuIGxlbmd0aCA9PSBudWxsCisgICAgICAgID8gX2NyZWF0ZTIoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzKQorICAgICAgICA6IF9jcmVhdGUzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKKyAgfQorCisgIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlID0+IFVpbnQzMkxpc3Q7CisKKyAgaW50IG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgcmV0dXJuIEpTKCdKU1VJbnQzMicsICcjWyNdJywgdGhpcywgaW5kZXgpOworICB9CisKKyAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKKyAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CisgICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVVaW50MzJMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKKyAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKKyAgfQorCisgIHN0YXRpYyBOYXRpdmVVaW50MzJMaXN0IF9jcmVhdGUxKGFyZykgPT4KKyAgICAgIEpTKCdOYXRpdmVVaW50MzJMaXN0JywgJ25ldyBVaW50MzJBcnJheSgjKScsIGFyZyk7CisKKyAgc3RhdGljIE5hdGl2ZVVpbnQzMkxpc3QgX2NyZWF0ZTIoYXJnMSwgYXJnMikgPT4KKyAgICAgIEpTKCdOYXRpdmVVaW50MzJMaXN0JywgJ25ldyBVaW50MzJBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOworCisgIHN0YXRpYyBOYXRpdmVVaW50MzJMaXN0IF9jcmVhdGUzKGFyZzEsIGFyZzIsIGFyZzMpID0+CisgICAgICBKUygnTmF0aXZlVWludDMyTGlzdCcsICduZXcgVWludDMyQXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKK30KKworCitjbGFzcyBOYXRpdmVVaW50OENsYW1wZWRMaXN0CisgICAgZXh0ZW5kcyBOYXRpdmVUeXBlZEFycmF5T2ZJbnQKKyAgICBpbXBsZW1lbnRzIFVpbnQ4Q2xhbXBlZExpc3QKKyAgICBuYXRpdmUgIlVpbnQ4Q2xhbXBlZEFycmF5LENhbnZhc1BpeGVsQXJyYXkiIHsKKworICBmYWN0b3J5IE5hdGl2ZVVpbnQ4Q2xhbXBlZExpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOworCisgIGZhY3RvcnkgTmF0aXZlVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+CisgICAgICBfY3JlYXRlMShfZW5zdXJlTmF0aXZlTGlzdChlbGVtZW50cykpOworCisgIGZhY3RvcnkgTmF0aXZlVWludDhDbGFtcGVkTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBVaW50OENsYW1wZWRMaXN0OworCisgIGludCBnZXQgbGVuZ3RoID0+IEpTKCdKU1VJbnQzMicsICcjLmxlbmd0aCcsIHRoaXMpOworCisgIGludCBvcGVyYXRvcltdKGludCBpbmRleCkgeworICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOworICAgIHJldHVybiBKUygnSlNVSW50MzEnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKKyAgfQorCisgIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7CisgICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOworICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywKKyAgICAgICAgdGhpcywgc3RhcnQsIGVuZCk7CisgICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7CisgIH0KKworICBzdGF0aWMgTmF0aXZlVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlMShhcmcpID0+CisgICAgICBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICduZXcgVWludDhDbGFtcGVkQXJyYXkoIyknLCBhcmcpOworCisgIHN0YXRpYyBOYXRpdmVVaW50OENsYW1wZWRMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+CisgICAgICBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICduZXcgVWludDhDbGFtcGVkQXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKKworICBzdGF0aWMgTmF0aXZlVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgorICAgICAgSlMoJ05hdGl2ZVVpbnQ4Q2xhbXBlZExpc3QnLCAnbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCMsICMsICMpJywKKyAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMpOworfQorCisKK2NsYXNzIE5hdGl2ZVVpbnQ4TGlzdAorICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50CisgICAgaW1wbGVtZW50cyBVaW50OExpc3QKKyAgICAvLyBPbiBzb21lIGJyb3dzZXJzIFVpbnQ4Q2xhbXBlZEFycmF5IGlzIGEgc3VidHlwZSBvZiBVaW50OEFycmF5LiAgTWFya2luZworICAgIC8vIFVpbnQ4TGlzdCBhcyAhbm9ubGVhZiBlbnN1cmVzIHRoYXQgdGhlIG5hdGl2ZSBkaXNwYXRjaCBjb3JyZWN0bHkgaGFuZGxlcworICAgIC8vIHRoZSBwb3RlbnRpYWwgZm9yIFVpbnQ4Q2xhbXBlZEFycmF5IHRvICdhY2NpZGVudGFsbHknIHBpY2sgdXAgdGhlCisgICAgLy8gZGlzcGF0Y2ggcmVjb3JkIGZvciBVaW50OExpc3QuCisgICAgbmF0aXZlICJVaW50OEFycmF5LCFub25sZWFmIiB7CisKKyAgZmFjdG9yeSBOYXRpdmVVaW50OExpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOworCisgIGZhY3RvcnkgTmF0aXZlVWludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7CisKKyAgZmFjdG9yeSBOYXRpdmVVaW50OExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgeworICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOworICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAorICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKKyAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7CisgIH0KKworICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBVaW50OExpc3Q7CisKKyAgaW50IGdldCBsZW5ndGggPT4gSlMoJ0pTVUludDMyJywgJyMubGVuZ3RoJywgdGhpcyk7CisKKyAgaW50IG9wZXJhdG9yW10oaW50IGluZGV4KSB7CisgICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7CisgICAgcmV0dXJuIEpTKCdKU1VJbnQzMScsICcjWyNdJywgdGhpcywgaW5kZXgpOworICB9CisKKyAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKKyAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7CisgICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVVaW50OExpc3QnLCAnIy5zdWJhcnJheSgjLCAjKScsIHRoaXMsIHN0YXJ0LCBlbmQpOworICAgIHJldHVybiBfY3JlYXRlMShzb3VyY2UpOworICB9CisKKyAgc3RhdGljIE5hdGl2ZVVpbnQ4TGlzdCBfY3JlYXRlMShhcmcpID0+CisgICAgICBKUygnTmF0aXZlVWludDhMaXN0JywgJ25ldyBVaW50OEFycmF5KCMpJywgYXJnKTsKKworICBzdGF0aWMgTmF0aXZlVWludDhMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+CisgICAgICBKUygnTmF0aXZlVWludDhMaXN0JywgJ25ldyBVaW50OEFycmF5KCMsICMpJywgYXJnMSwgYXJnMik7CisKKyAgc3RhdGljIE5hdGl2ZVVpbnQ4TGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgorICAgICAgSlMoJ05hdGl2ZVVpbnQ4TGlzdCcsICduZXcgVWludDhBcnJheSgjLCAjLCAjKScsIGFyZzEsIGFyZzIsIGFyZzMpOworfQorCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgRGFydCBGbG9hdDMyeDQgaW1tdXRhYmxlIHZhbHVlIHR5cGUgYW5kIG9wZXJhdGlvbnMuCisgKiBGbG9hdDMyeDQgc3RvcmVzIDQgMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiAibGFuZXMiLgorICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KKyAqLworY2xhc3MgTmF0aXZlRmxvYXQzMng0IGltcGxlbWVudHMgRmxvYXQzMng0IHsKKyAgZmluYWwgX3N0b3JhZ2UgPSBuZXcgRmxvYXQzMkxpc3QoNCk7CisKKyAgTmF0aXZlRmxvYXQzMng0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHosIGRvdWJsZSB3KSB7CisgICAgX3N0b3JhZ2VbMF0gPSB4OworICAgIF9zdG9yYWdlWzFdID0geTsKKyAgICBfc3RvcmFnZVsyXSA9IHo7CisgICAgX3N0b3JhZ2VbM10gPSB3OworICB9CisKKyAgTmF0aXZlRmxvYXQzMng0LnNwbGF0KGRvdWJsZSB2KSB7CisgICAgX3N0b3JhZ2VbMF0gPSB2OworICAgIF9zdG9yYWdlWzFdID0gdjsKKyAgICBfc3RvcmFnZVsyXSA9IHY7CisgICAgX3N0b3JhZ2VbM10gPSB2OworICB9CisKKyAgTmF0aXZlRmxvYXQzMng0Lnplcm8oKTsKKyAgLy8vIFJldHVybnMgYSBiaXQtd2lzZSBjb3B5IG9mIFt4XSBhcyBhIEZsb2F0MzJ4NC4KKworICBOYXRpdmVGbG9hdDMyeDQuZnJvbUludDMyeDRCaXRzKE5hdGl2ZUludDMyeDQgeCkgeworICAgIHZhciB2aWV3ID0geC5fc3RvcmFnZS5idWZmZXIuYXNGbG9hdDMyTGlzdCgpOworICAgIF9zdG9yYWdlWzBdID0gdmlld1swXTsKKyAgICBfc3RvcmFnZVsxXSA9IHZpZXdbMV07CisgICAgX3N0b3JhZ2VbMl0gPSB2aWV3WzJdOworICAgIF9zdG9yYWdlWzNdID0gdmlld1szXTsKKyAgfQorCisgIE5hdGl2ZUZsb2F0MzJ4NC5mcm9tRmxvYXQ2NHgyKE5hdGl2ZUZsb2F0NjR4MiB2KSB7CisgICAgX3N0b3JhZ2VbMF0gPSB2Ll9zdG9yYWdlWzBdOworICAgIF9zdG9yYWdlWzFdID0gdi5fc3RvcmFnZVsxXTsKKyAgfQorCisgIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICByZXR1cm4gJ1ske19zdG9yYWdlWzBdfSwgJHtfc3RvcmFnZVsxXX0sICR7X3N0b3JhZ2VbMl19LCAke19zdG9yYWdlWzNdfV0nOworICB9CisKKyAgIC8vLyBBZGRpdGlvbiBvcGVyYXRvci4KKyAgRmxvYXQzMng0IG9wZXJhdG9yKyhOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSArIG90aGVyLl9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdICsgb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl0gKyBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSArIG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBOZWdhdGUgb3BlcmF0b3IuCisgIEZsb2F0MzJ4NCBvcGVyYXRvci0oKSB7CisgICAgZG91YmxlIF94ID0gLV9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IC1fc3RvcmFnZVsxXTsKKyAgICBkb3VibGUgX3ogPSAtX3N0b3JhZ2VbMl07CisgICAgZG91YmxlIF93ID0gLV9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KKyAgRmxvYXQzMng0IG9wZXJhdG9yLShOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSAtIG90aGVyLl9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdIC0gb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl0gLSBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSAtIG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBNdWx0aXBsaWNhdGlvbiBvcGVyYXRvci4KKyAgRmxvYXQzMng0IG9wZXJhdG9yKihOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSAqIG90aGVyLl9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdICogb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl0gKiBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSAqIG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBEaXZpc2lvbiBvcGVyYXRvci4KKyAgRmxvYXQzMng0IG9wZXJhdG9yLyhOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSAvIG90aGVyLl9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdIC8gb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl0gLyBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSAvIG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZWxhdGlvbmFsIGxlc3MgdGhhbi4KKyAgSW50MzJ4NCBsZXNzVGhhbihOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBib29sIF9jeCA9IF9zdG9yYWdlWzBdIDwgb3RoZXIuX3N0b3JhZ2VbMF07CisgICAgYm9vbCBfY3kgPSBfc3RvcmFnZVsxXSA8IG90aGVyLl9zdG9yYWdlWzFdOworICAgIGJvb2wgX2N6ID0gX3N0b3JhZ2VbMl0gPCBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBib29sIF9jdyA9IF9zdG9yYWdlWzNdIDwgb3RoZXIuX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF9jeCA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jeSA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jeiA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jdyA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCk7CisgIH0KKworICAvLy8gUmVsYXRpb25hbCBsZXNzIHRoYW4gb3IgZXF1YWwuCisgIEludDMyeDQgbGVzc1RoYW5PckVxdWFsKE5hdGl2ZUZsb2F0MzJ4NCBvdGhlcikgeworICAgIGJvb2wgX2N4ID0gX3N0b3JhZ2VbMF0gPD0gb3RoZXIuX3N0b3JhZ2VbMF07CisgICAgYm9vbCBfY3kgPSBfc3RvcmFnZVsxXSA8PSBvdGhlci5fc3RvcmFnZVsxXTsKKyAgICBib29sIF9jeiA9IF9zdG9yYWdlWzJdIDw9IG90aGVyLl9zdG9yYWdlWzJdOworICAgIGJvb2wgX2N3ID0gX3N0b3JhZ2VbM10gPD0gb3RoZXIuX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF9jeCA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jeSA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jeiA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jdyA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCk7CisgIH0KKworICAvLy8gUmVsYXRpb25hbCBncmVhdGVyIHRoYW4uCisgIEludDMyeDQgZ3JlYXRlclRoYW4oTmF0aXZlRmxvYXQzMng0IG90aGVyKSB7CisgICAgYm9vbCBfY3ggPSBfc3RvcmFnZVswXSA+IG90aGVyLl9zdG9yYWdlWzBdOworICAgIGJvb2wgX2N5ID0gX3N0b3JhZ2VbMV0gPiBvdGhlci5fc3RvcmFnZVsxXTsKKyAgICBib29sIF9jeiA9IF9zdG9yYWdlWzJdID4gb3RoZXIuX3N0b3JhZ2VbMl07CisgICAgYm9vbCBfY3cgPSBfc3RvcmFnZVszXSA+IG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfY3ggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3kgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3ogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3cgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDApOworICB9CisKKyAgLy8vIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsLgorICBJbnQzMng0IGdyZWF0ZXJUaGFuT3JFcXVhbChOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBib29sIF9jeCA9IF9zdG9yYWdlWzBdID49IG90aGVyLl9zdG9yYWdlWzBdOworICAgIGJvb2wgX2N5ID0gX3N0b3JhZ2VbMV0gPj0gb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgYm9vbCBfY3ogPSBfc3RvcmFnZVsyXSA+PSBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBib29sIF9jdyA9IF9zdG9yYWdlWzNdID49IG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfY3ggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3kgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3ogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3cgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDApOworICB9CisKKyAgLy8vIFJlbGF0aW9uYWwgZXF1YWwuCisgIEludDMyeDQgZXF1YWwoTmF0aXZlRmxvYXQzMng0IG90aGVyKSB7CisgICAgYm9vbCBfY3ggPSBfc3RvcmFnZVswXSA9PSBvdGhlci5fc3RvcmFnZVswXTsKKyAgICBib29sIF9jeSA9IF9zdG9yYWdlWzFdID09IG90aGVyLl9zdG9yYWdlWzFdOworICAgIGJvb2wgX2N6ID0gX3N0b3JhZ2VbMl0gPT0gb3RoZXIuX3N0b3JhZ2VbMl07CisgICAgYm9vbCBfY3cgPSBfc3RvcmFnZVszXSA9PSBvdGhlci5fc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX2N4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgX2N5ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgX2N6ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgX2N3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwKTsKKyAgfQorCisgIC8vLyBSZWxhdGlvbmFsIG5vdC1lcXVhbC4KKyAgSW50MzJ4NCBub3RFcXVhbChOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBib29sIF9jeCA9IF9zdG9yYWdlWzBdICE9IG90aGVyLl9zdG9yYWdlWzBdOworICAgIGJvb2wgX2N5ID0gX3N0b3JhZ2VbMV0gIT0gb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgYm9vbCBfY3ogPSBfc3RvcmFnZVsyXSAhPSBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBib29sIF9jdyA9IF9zdG9yYWdlWzNdICE9IG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfY3ggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3kgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3ogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCisgICAgICAgICAgICAgICAgICAgICAgICBfY3cgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDApOworICB9CisKKyAgLy8vIFJldHVybnMgYSBjb3B5IG9mIFt0aGlzXSBlYWNoIGxhbmUgYmVpbmcgc2NhbGVkIGJ5IFtzXS4KKyAgRmxvYXQzMng0IHNjYWxlKGRvdWJsZSBzKSB7CisgICAgZG91YmxlIF94ID0gcyAqIF9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IHMgKiBfc3RvcmFnZVsxXTsKKyAgICBkb3VibGUgX3ogPSBzICogX3N0b3JhZ2VbMl07CisgICAgZG91YmxlIF93ID0gcyAqIF9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGlzIFtGbG9hdDMyeDRdLgorICBGbG9hdDMyeDQgYWJzKCkgeworICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdLmFicygpOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdLmFicygpOworICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdLmFicygpOworICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdLmFicygpOworICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBDbGFtcHMgW3RoaXNdIHRvIGJlIGluIHRoZSByYW5nZSBbbG93ZXJMaW1pdF0tW3VwcGVyTGltaXRdLgorICBOYXRpdmVGbG9hdDMyeDQgY2xhbXAoTmF0aXZlRmxvYXQzMng0IGxvd2VyTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBOYXRpdmVGbG9hdDMyeDQgdXBwZXJMaW1pdCkgeworICAgIGRvdWJsZSBfbHggPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfbHkgPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzFdOworICAgIGRvdWJsZSBfbHogPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzJdOworICAgIGRvdWJsZSBfbHcgPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzNdOworICAgIGRvdWJsZSBfdXggPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfdXkgPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzFdOworICAgIGRvdWJsZSBfdXogPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzJdOworICAgIGRvdWJsZSBfdXcgPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzNdOworICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdOworICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdOworICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdOworICAgIC8vIE1BWChNSU4oc2VsZiwgdXBwZXIpLCBsb3dlcikuCisgICAgX3ggPSBfeCA+IF91eCA/IF91eCA6IF94OworICAgIF95ID0gX3kgPiBfdXkgPyBfdXkgOiBfeTsKKyAgICBfeiA9IF96ID4gX3V6ID8gX3V6IDogX3o7CisgICAgX3cgPSBfdyA+IF91dyA/IF91dyA6IF93OworICAgIF94ID0gX3ggPCBfbHggPyBfbHggOiBfeDsKKyAgICBfeSA9IF95IDwgX2x5ID8gX2x5IDogX3k7CisgICAgX3ogPSBfeiA8IF9seiA/IF9seiA6IF96OworICAgIF93ID0gX3cgPCBfbHcgPyBfbHcgOiBfdzsKKyAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuCisgIGRvdWJsZSBnZXQgeCA9PiBfc3RvcmFnZVswXTsKKyAgLy8vIEV4dHJhY3RlZCB5IHZhbHVlLgorICBkb3VibGUgZ2V0IHkgPT4gX3N0b3JhZ2VbMV07CisgIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4KKyAgZG91YmxlIGdldCB6ID0+IF9zdG9yYWdlWzJdOworICAvLy8gRXh0cmFjdGVkIHcgdmFsdWUuCisgIGRvdWJsZSBnZXQgdyA9PiBfc3RvcmFnZVszXTsKKworICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXQgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KKyAgaW50IGdldCBzaWduTWFzayB7CisgICAgdmFyIHZpZXcgPSBuZXcgTmF0aXZlVWludDMyTGlzdC52aWV3KF9zdG9yYWdlLmJ1ZmZlciwgMCwgbnVsbCk7CisgICAgdmFyIG14ID0gKHZpZXdbMF0gJiAweDgwMDAwMDAwKSA+PiAzMTsKKyAgICB2YXIgbXkgPSAodmlld1sxXSAmIDB4ODAwMDAwMDApID4+IDMxOworICAgIHZhciBteiA9ICh2aWV3WzJdICYgMHg4MDAwMDAwMCkgPj4gMzE7CisgICAgdmFyIG13ID0gKHZpZXdbM10gJiAweDgwMDAwMDAwKSA+PiAzMTsKKyAgICByZXR1cm4gbXggfCBteSA8PCAxIHwgbXogPDwgMiB8IG13IDw8IDM7CisgIH0KKworICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgorICBGbG9hdDMyeDQgc2h1ZmZsZShpbnQgbSkgeworICAgIGlmICgobSA8IDApIHx8IChtID4gMjU1KSkgeworICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ21hc2sgJG0gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAuLjI1NiknKTsKKyAgICB9CisgICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbbSAmIDB4M107CisgICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbKG0gPj4gMikgJiAweDNdOworICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWyhtID4+IDQpICYgMHgzXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVsobSA+PiA2KSAmIDB4M107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzIGluIFt0aGlzXSBhbmQgW290aGVyXS4gVGhlIHJldHVybmVkCisgIC8vLyBGbG9hdDMyeDQgd2lsbCBoYXZlIFhZIGxhbmVzIGZyb20gW3RoaXNdIGFuZCBaVyBsYW5lcyBmcm9tIFtvdGhlcl0uCisgIC8vLyBVc2VzIHRoZSBzYW1lIFttYXNrXSBhcyBbc2h1ZmZsZV0uCisgIEZsb2F0MzJ4NCBzaHVmZmxlTWl4KE5hdGl2ZUZsb2F0MzJ4NCBvdGhlciwgaW50IG0pIHsKKyAgICBpZiAoKG0gPCAwKSB8fCAobSA+IDI1NSkpIHsKKyAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdtYXNrICRtIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4yNTYpJyk7CisgICAgfQorICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlW20gJiAweDNdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWyhtID4+IDIpICYgMHgzXTsKKyAgICBkb3VibGUgX3ogPSBvdGhlci5fc3RvcmFnZVsobSA+PiA0KSAmIDB4M107CisgICAgZG91YmxlIF93ID0gb3RoZXIuX3N0b3JhZ2VbKG0gPj4gNikgJiAweDNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3hdIGxhbmUuCisgIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgeCkgeworICAgIGRvdWJsZSBfeCA9IHg7CisgICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl07CisgICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIENvcHkgW3RoaXNdIGFuZCByZXBsYWNlIHRoZSBbeV0gbGFuZS4KKyAgRmxvYXQzMng0IHdpdGhZKGRvdWJsZSB5KSB7CisgICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF07CisgICAgZG91YmxlIF95ID0geTsKKyAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gQ29weSBbdGhpc10gYW5kIHJlcGxhY2UgdGhlIFt6XSBsYW5lLgorICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXTsKKyAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXTsKKyAgICBkb3VibGUgX3ogPSB6OworICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3ddIGxhbmUuCisgIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgdykgeworICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdOworICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdOworICAgIGRvdWJsZSBfdyA9IHc7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtaW5pbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgorICBGbG9hdDMyeDQgbWluKE5hdGl2ZUZsb2F0MzJ4NCBvdGhlcikgeworICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdIDwgb3RoZXIuX3N0b3JhZ2VbMF0gPworICAgICAgICBfc3RvcmFnZVswXSA6IG90aGVyLl9zdG9yYWdlWzBdOworICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdIDwgb3RoZXIuX3N0b3JhZ2VbMV0gPworICAgICAgICBfc3RvcmFnZVsxXSA6IG90aGVyLl9zdG9yYWdlWzFdOworICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdIDwgb3RoZXIuX3N0b3JhZ2VbMl0gPworICAgICAgICBfc3RvcmFnZVsyXSA6IG90aGVyLl9zdG9yYWdlWzJdOworICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdIDwgb3RoZXIuX3N0b3JhZ2VbM10gPworICAgICAgICBfc3RvcmFnZVszXSA6IG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWF4aW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KKyAgRmxvYXQzMng0IG1heChOYXRpdmVGbG9hdDMyeDQgb3RoZXIpIHsKKyAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSA+IG90aGVyLl9zdG9yYWdlWzBdID8KKyAgICAgICAgX3N0b3JhZ2VbMF0gOiBvdGhlci5fc3RvcmFnZVswXTsKKyAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSA+IG90aGVyLl9zdG9yYWdlWzFdID8KKyAgICAgICAgX3N0b3JhZ2VbMV0gOiBvdGhlci5fc3RvcmFnZVsxXTsKKyAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsyXSA+IG90aGVyLl9zdG9yYWdlWzJdID8KKyAgICAgICAgX3N0b3JhZ2VbMl0gOiBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSA+IG90aGVyLl9zdG9yYWdlWzNdID8KKyAgICAgICAgX3N0b3JhZ2VbM10gOiBvdGhlci5fc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgW3RoaXNdLgorICBGbG9hdDMyeDQgc3FydCgpIHsKKyAgICBkb3VibGUgX3ggPSBNYXRoLnNxcnQoX3N0b3JhZ2VbMF0pOworICAgIGRvdWJsZSBfeSA9IE1hdGguc3FydChfc3RvcmFnZVsxXSk7CisgICAgZG91YmxlIF96ID0gTWF0aC5zcXJ0KF9zdG9yYWdlWzJdKTsKKyAgICBkb3VibGUgX3cgPSBNYXRoLnNxcnQoX3N0b3JhZ2VbM10pOworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIFt0aGlzXS4KKyAgRmxvYXQzMng0IHJlY2lwcm9jYWwoKSB7CisgICAgZG91YmxlIF94ID0gMS4wIC8gX3N0b3JhZ2VbMF07CisgICAgZG91YmxlIF95ID0gMS4wIC8gX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF96ID0gMS4wIC8gX3N0b3JhZ2VbMl07CisgICAgZG91YmxlIF93ID0gMS4wIC8gX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSByZWNpcHJvY2FsIG9mIFt0aGlzXS4KKyAgRmxvYXQzMng0IHJlY2lwcm9jYWxTcXJ0KCkgeworICAgIGRvdWJsZSBfeCA9IE1hdGguc3FydCgxLjAgLyBfc3RvcmFnZVswXSk7CisgICAgZG91YmxlIF95ID0gTWF0aC5zcXJ0KDEuMCAvIF9zdG9yYWdlWzFdKTsKKyAgICBkb3VibGUgX3ogPSBNYXRoLnNxcnQoMS4wIC8gX3N0b3JhZ2VbMl0pOworICAgIGRvdWJsZSBfdyA9IE1hdGguc3FydCgxLjAgLyBfc3RvcmFnZVszXSk7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9Cit9CisKKworLyoqCisgKiBJbnRlcmZhY2Ugb2YgRGFydCBJbnQzMng0IGFuZCBvcGVyYXRpb25zLgorICogSW50MzJ4NCBzdG9yZXMgNCAzMi1iaXQgYml0LW1hc2tzIGluICJsYW5lcyIuCisgKiBUaGUgbGFuZXMgYXJlICJ4IiwgInkiLCAieiIsIGFuZCAidyIgcmVzcGVjdGl2ZWx5LgorICovCitjbGFzcyBOYXRpdmVJbnQzMng0IGltcGxlbWVudHMgSW50MzJ4NCB7CisgIGZpbmFsIF9zdG9yYWdlID0gbmV3IE5hdGl2ZUludDMyTGlzdCg0KTsKKworICBOYXRpdmVJbnQzMng0KGludCB4LCBpbnQgeSwgaW50IHosIGludCB3KSB7CisgICAgX3N0b3JhZ2VbMF0gPSB4OworICAgIF9zdG9yYWdlWzFdID0geTsKKyAgICBfc3RvcmFnZVsyXSA9IHo7CisgICAgX3N0b3JhZ2VbM10gPSB3OworICB9CisKKyAgTmF0aXZlSW50MzJ4NC5ib29sKGJvb2wgeCwgYm9vbCB5LCBib29sIHosIGJvb2wgdykgeworICAgIF9zdG9yYWdlWzBdID0geCA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MDsKKyAgICBfc3RvcmFnZVsxXSA9IHkgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDA7CisgICAgX3N0b3JhZ2VbMl0gPSB6ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOworICAgIF9zdG9yYWdlWzNdID0gdyA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgYml0LXdpc2UgY29weSBvZiBbeF0gYXMgYSBJbnQzMng0LgorICBOYXRpdmVJbnQzMng0LmZyb21GbG9hdDMyeDRCaXRzKE5hdGl2ZUZsb2F0MzJ4NCB4KSB7CisgICAgdmFyIHZpZXcgPSBuZXcgTmF0aXZlVWludDMyTGlzdC52aWV3KHguX3N0b3JhZ2UuYnVmZmVyLCAwLCBudWxsKTsKKyAgICBfc3RvcmFnZVswXSA9IHZpZXdbMF07CisgICAgX3N0b3JhZ2VbMV0gPSB2aWV3WzFdOworICAgIF9zdG9yYWdlWzJdID0gdmlld1syXTsKKyAgICBfc3RvcmFnZVszXSA9IHZpZXdbM107CisgIH0KKworICBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgcmV0dXJuICdbJHtfc3RvcmFnZVswXX0sICR7X3N0b3JhZ2VbMV19LCAke19zdG9yYWdlWzJdfSwgJHtfc3RvcmFnZVszXX1dJzsKKyAgfQorCisgIC8vLyBUaGUgYml0LXdpc2Ugb3Igb3BlcmF0b3IuCisgIEludDMyeDQgb3BlcmF0b3J8KE5hdGl2ZUludDMyeDQgb3RoZXIpIHsKKyAgICBpbnQgX3ggPSBfc3RvcmFnZVswXSB8IG90aGVyLl9zdG9yYWdlWzBdOworICAgIGludCBfeSA9IF9zdG9yYWdlWzFdIHwgb3RoZXIuX3N0b3JhZ2VbMV07CisgICAgaW50IF96ID0gX3N0b3JhZ2VbMl0gfCBvdGhlci5fc3RvcmFnZVsyXTsKKyAgICBpbnQgX3cgPSBfc3RvcmFnZVszXSB8IG90aGVyLl9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gVGhlIGJpdC13aXNlIGFuZCBvcGVyYXRvci4KKyAgSW50MzJ4NCBvcGVyYXRvciYoTmF0aXZlSW50MzJ4NCBvdGhlcikgeworICAgIGludCBfeCA9IF9zdG9yYWdlWzBdICYgb3RoZXIuX3N0b3JhZ2VbMF07CisgICAgaW50IF95ID0gX3N0b3JhZ2VbMV0gJiBvdGhlci5fc3RvcmFnZVsxXTsKKyAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXSAmIG90aGVyLl9zdG9yYWdlWzJdOworICAgIGludCBfdyA9IF9zdG9yYWdlWzNdICYgb3RoZXIuX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBUaGUgYml0LXdpc2UgeG9yIG9wZXJhdG9yLgorICBJbnQzMng0IG9wZXJhdG9yXihOYXRpdmVJbnQzMng0IG90aGVyKSB7CisgICAgaW50IF94ID0gX3N0b3JhZ2VbMF0gXiBvdGhlci5fc3RvcmFnZVswXTsKKyAgICBpbnQgX3kgPSBfc3RvcmFnZVsxXSBeIG90aGVyLl9zdG9yYWdlWzFdOworICAgIGludCBfeiA9IF9zdG9yYWdlWzJdIF4gb3RoZXIuX3N0b3JhZ2VbMl07CisgICAgaW50IF93ID0gX3N0b3JhZ2VbM10gXiBvdGhlci5fc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgSW50MzJ4NCBvcGVyYXRvcisoTmF0aXZlSW50MzJ4NCBvdGhlcikgeworICAgIHZhciByID0gbmV3IE5hdGl2ZUludDMyeDQoMCwgMCwgMCwgMCk7CisgICAgci5fc3RvcmFnZVswXSA9IChfc3RvcmFnZVswXSArIG90aGVyLl9zdG9yYWdlWzBdKTsKKyAgICByLl9zdG9yYWdlWzFdID0gKF9zdG9yYWdlWzFdICsgb3RoZXIuX3N0b3JhZ2VbMV0pOworICAgIHIuX3N0b3JhZ2VbMl0gPSAoX3N0b3JhZ2VbMl0gKyBvdGhlci5fc3RvcmFnZVsyXSk7CisgICAgci5fc3RvcmFnZVszXSA9IChfc3RvcmFnZVszXSArIG90aGVyLl9zdG9yYWdlWzNdKTsKKyAgICByZXR1cm4gcjsKKyAgfQorCisgIEludDMyeDQgb3BlcmF0b3ItKE5hdGl2ZUludDMyeDQgb3RoZXIpIHsKKyAgICB2YXIgciA9IG5ldyBOYXRpdmVJbnQzMng0KDAsIDAsIDAsIDApOworICAgIHIuX3N0b3JhZ2VbMF0gPSAoX3N0b3JhZ2VbMF0gLSBvdGhlci5fc3RvcmFnZVswXSk7CisgICAgci5fc3RvcmFnZVsxXSA9IChfc3RvcmFnZVsxXSAtIG90aGVyLl9zdG9yYWdlWzFdKTsKKyAgICByLl9zdG9yYWdlWzJdID0gKF9zdG9yYWdlWzJdIC0gb3RoZXIuX3N0b3JhZ2VbMl0pOworICAgIHIuX3N0b3JhZ2VbM10gPSAoX3N0b3JhZ2VbM10gLSBvdGhlci5fc3RvcmFnZVszXSk7CisgICAgcmV0dXJuIHI7CisgIH0KKworICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHggbGFuZS4KKyAgaW50IGdldCB4ID0+IF9zdG9yYWdlWzBdOworICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHkgbGFuZS4KKyAgaW50IGdldCB5ID0+IF9zdG9yYWdlWzFdOworICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHogbGFuZS4KKyAgaW50IGdldCB6ID0+IF9zdG9yYWdlWzJdOworICAvLy8gRXh0cmFjdCAzMi1iaXQgbWFzayBmcm9tIHcgbGFuZS4KKyAgaW50IGdldCB3ID0+IF9zdG9yYWdlWzNdOworCisgIC8vLyBFeHRyYWN0IHRoZSB0b3AgYml0IGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCA0IGJpdHMuCisgIGludCBnZXQgc2lnbk1hc2sgeworICAgIGludCBteCA9IChfc3RvcmFnZVswXSAmIDB4ODAwMDAwMDApID4+IDMxOworICAgIGludCBteSA9IChfc3RvcmFnZVsxXSAmIDB4ODAwMDAwMDApID4+IDMxOworICAgIGludCBteiA9IChfc3RvcmFnZVsyXSAmIDB4ODAwMDAwMDApID4+IDMxOworICAgIGludCBtdyA9IChfc3RvcmFnZVszXSAmIDB4ODAwMDAwMDApID4+IDMxOworICAgIHJldHVybiBteCB8IG15IDw8IDEgfCBteiA8PCAyIHwgbXcgPDwgMzsKKyAgfQorCisgIC8vLyBTaHVmZmxlIHRoZSBsYW5lIHZhbHVlcy4gW21hc2tdIG11c3QgYmUgb25lIG9mIHRoZSAyNTYgc2h1ZmZsZSBjb25zdGFudHMuCisgIEludDMyeDQgc2h1ZmZsZShpbnQgbWFzaykgeworICAgIGlmICgobWFzayA8IDApIHx8IChtYXNrID4gMjU1KSkgeworICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ21hc2sgJG1hc2sgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAuLjI1NiknKTsKKyAgICB9CisgICAgaW50IF94ID0gX3N0b3JhZ2VbbWFzayAmIDB4M107CisgICAgaW50IF95ID0gX3N0b3JhZ2VbKG1hc2sgPj4gMikgJiAweDNdOworICAgIGludCBfeiA9IF9zdG9yYWdlWyhtYXNrID4+IDQpICYgMHgzXTsKKyAgICBpbnQgX3cgPSBfc3RvcmFnZVsobWFzayA+PiA2KSAmIDB4M107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBTaHVmZmxlIHRoZSBsYW5lIHZhbHVlcyBpbiBbdGhpc10gYW5kIFtvdGhlcl0uIFRoZSByZXR1cm5lZAorICAvLy8gSW50MzJ4NCB3aWxsIGhhdmUgWFkgbGFuZXMgZnJvbSBbdGhpc10gYW5kIFpXIGxhbmVzIGZyb20gW290aGVyXS4KKyAgLy8vIFVzZXMgdGhlIHNhbWUgW21hc2tdIGFzIFtzaHVmZmxlXS4KKyAgSW50MzJ4NCBzaHVmZmxlTWl4KE5hdGl2ZUludDMyeDQgb3RoZXIsIGludCBtYXNrKSB7CisgICAgaWYgKChtYXNrIDwgMCkgfHwgKG1hc2sgPiAyNTUpKSB7CisgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWFzayAkbWFzayBtdXN0IGJlIGluIHRoZSByYW5nZSBbMC4uMjU2KScpOworICAgIH0KKyAgICBpbnQgX3ggPSBfc3RvcmFnZVttYXNrICYgMHgzXTsKKyAgICBpbnQgX3kgPSBfc3RvcmFnZVsobWFzayA+PiAyKSAmIDB4M107CisgICAgaW50IF96ID0gb3RoZXIuX3N0b3JhZ2VbKG1hc2sgPj4gNCkgJiAweDNdOworICAgIGludCBfdyA9IG90aGVyLl9zdG9yYWdlWyhtYXNrID4+IDYpICYgMHgzXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHggdmFsdWUuCisgIEludDMyeDQgd2l0aFgoaW50IHgpIHsKKyAgICBpbnQgX3ggPSB4OworICAgIGludCBfeSA9IF9zdG9yYWdlWzFdOworICAgIGludCBfeiA9IF9zdG9yYWdlWzJdOworICAgIGludCBfdyA9IF9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KKyAgSW50MzJ4NCB3aXRoWShpbnQgeSkgeworICAgIGludCBfeCA9IF9zdG9yYWdlWzBdOworICAgIGludCBfeSA9IHk7CisgICAgaW50IF96ID0gX3N0b3JhZ2VbMl07CisgICAgaW50IF93ID0gX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB6IHZhbHVlLgorICBJbnQzMng0IHdpdGhaKGludCB6KSB7CisgICAgaW50IF94ID0gX3N0b3JhZ2VbMF07CisgICAgaW50IF95ID0gX3N0b3JhZ2VbMV07CisgICAgaW50IF96ID0gejsKKyAgICBpbnQgX3cgPSBfc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHcgdmFsdWUuCisgIEludDMyeDQgd2l0aFcoaW50IHcpIHsKKyAgICBpbnQgX3ggPSBfc3RvcmFnZVswXTsKKyAgICBpbnQgX3kgPSBfc3RvcmFnZVsxXTsKKyAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXTsKKyAgICBpbnQgX3cgPSB3OworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KKyAgYm9vbCBnZXQgZmxhZ1ggPT4gX3N0b3JhZ2VbMF0gIT0gMHgwOworICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KKyAgYm9vbCBnZXQgZmxhZ1kgPT4gX3N0b3JhZ2VbMV0gIT0gMHgwOworICAvLy8gRXh0cmFjdGVkIHogdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KKyAgYm9vbCBnZXQgZmxhZ1ogPT4gX3N0b3JhZ2VbMl0gIT0gMHgwOworICAvLy8gRXh0cmFjdGVkIHcgdmFsdWUuIFJldHVybnMgZmFsc2UgZm9yIDAsIHRydWUgZm9yIGFueSBvdGhlciB2YWx1ZS4KKyAgYm9vbCBnZXQgZmxhZ1cgPT4gX3N0b3JhZ2VbM10gIT0gMHgwOworCisgIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB4IHZhbHVlLgorICBJbnQzMng0IHdpdGhGbGFnWChib29sIHgpIHsKKyAgICBpbnQgX3ggPSB4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOworICAgIGludCBfeSA9IF9zdG9yYWdlWzFdOworICAgIGludCBfeiA9IF9zdG9yYWdlWzJdOworICAgIGludCBfdyA9IF9zdG9yYWdlWzNdOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KKyAgSW50MzJ4NCB3aXRoRmxhZ1koYm9vbCB5KSB7CisgICAgaW50IF94ID0gX3N0b3JhZ2VbMF07CisgICAgaW50IF95ID0geSA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MDsKKyAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXTsKKyAgICBpbnQgX3cgPSBfc3RvcmFnZVszXTsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyeDQoX3gsIF95LCBfeiwgX3cpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCisgIEludDMyeDQgd2l0aEZsYWdaKGJvb2wgeikgeworICAgIGludCBfeCA9IF9zdG9yYWdlWzBdOworICAgIGludCBfeSA9IF9zdG9yYWdlWzFdOworICAgIGludCBfeiA9IHogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDA7CisgICAgaW50IF93ID0gX3N0b3JhZ2VbM107CisgICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQzMng0KF94LCBfeSwgX3osIF93KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB3IHZhbHVlLgorICBJbnQzMng0IHdpdGhGbGFnVyhib29sIHcpIHsKKyAgICBpbnQgX3ggPSBfc3RvcmFnZVswXTsKKyAgICBpbnQgX3kgPSBfc3RvcmFnZVsxXTsKKyAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXTsKKyAgICBpbnQgX3cgPSB3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOworICAgIHJldHVybiBuZXcgTmF0aXZlSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7CisgIH0KKworICAvLy8gTWVyZ2UgW3RydWVWYWx1ZV0gYW5kIFtmYWxzZVZhbHVlXSBiYXNlZCBvbiBbdGhpc10nIGJpdCBtYXNrOgorICAvLy8gU2VsZWN0IGJpdCBmcm9tIFt0cnVlVmFsdWVdIHdoZW4gYml0IGluIFt0aGlzXSBpcyBvbi4KKyAgLy8vIFNlbGVjdCBiaXQgZnJvbSBbZmFsc2VWYWx1ZV0gd2hlbiBiaXQgaW4gW3RoaXNdIGlzIG9mZi4KKyAgRmxvYXQzMng0IHNlbGVjdChOYXRpdmVGbG9hdDMyeDQgdHJ1ZVZhbHVlLCBOYXRpdmVGbG9hdDMyeDQgZmFsc2VWYWx1ZSkgeworICAgIHZhciB0cnVlVmlldyA9IHRydWVWYWx1ZS5fc3RvcmFnZS5idWZmZXIuYXNJbnQzMkxpc3QoKTsKKyAgICB2YXIgZmFsc2VWaWV3ID0gZmFsc2VWYWx1ZS5fc3RvcmFnZS5idWZmZXIuYXNJbnQzMkxpc3QoKTsKKyAgICBpbnQgY214ID0gX3N0b3JhZ2VbMF07CisgICAgaW50IGNteSA9IF9zdG9yYWdlWzFdOworICAgIGludCBjbXogPSBfc3RvcmFnZVsyXTsKKyAgICBpbnQgY213ID0gX3N0b3JhZ2VbM107CisgICAgaW50IHN0eCA9IHRydWVWaWV3WzBdOworICAgIGludCBzdHkgPSB0cnVlVmlld1sxXTsKKyAgICBpbnQgc3R6ID0gdHJ1ZVZpZXdbMl07CisgICAgaW50IHN0dyA9IHRydWVWaWV3WzNdOworICAgIGludCBzZnggPSBmYWxzZVZpZXdbMF07CisgICAgaW50IHNmeSA9IGZhbHNlVmlld1sxXTsKKyAgICBpbnQgc2Z6ID0gZmFsc2VWaWV3WzJdOworICAgIGludCBzZncgPSBmYWxzZVZpZXdbM107CisgICAgaW50IF94ID0gKGNteCAmIHN0eCkgfCAofmNteCAmIHNmeCk7CisgICAgaW50IF95ID0gKGNteSAmIHN0eSkgfCAofmNteSAmIHNmeSk7CisgICAgaW50IF96ID0gKGNteiAmIHN0eikgfCAofmNteiAmIHNmeik7CisgICAgaW50IF93ID0gKGNtdyAmIHN0dykgfCAofmNtdyAmIHNmdyk7CisgICAgdmFyIHIgPSBuZXcgTmF0aXZlRmxvYXQzMng0KDAuMCwgMC4wLCAwLjAsIDAuMCk7CisgICAgdmFyIHJWaWV3ID0gci5fc3RvcmFnZS5idWZmZXIuYXNJbnQzMkxpc3QoKTsKKyAgICByVmlld1swXSA9IF94OworICAgIHJWaWV3WzFdID0gX3k7CisgICAgclZpZXdbMl0gPSBfejsKKyAgICByVmlld1szXSA9IF93OworICAgIHJldHVybiByOworICB9Cit9CisKK2NsYXNzIE5hdGl2ZUZsb2F0NjR4MiBpbXBsZW1lbnRzIEZsb2F0NjR4MiB7CisgIGZpbmFsIF9zdG9yYWdlID0gbmV3IEZsb2F0NjRMaXN0KDIpOworCisgIE5hdGl2ZUZsb2F0NjR4Mihkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgICBfc3RvcmFnZVswXSA9IHg7CisgICAgX3N0b3JhZ2VbMV0gPSB5OworICB9CisKKyAgTmF0aXZlRmxvYXQ2NHgyLnNwbGF0KGRvdWJsZSB2KSB7CisgICAgX3N0b3JhZ2VbMF0gPSB2OworICAgIF9zdG9yYWdlWzFdID0gdjsKKyAgfQorCisgIE5hdGl2ZUZsb2F0NjR4Mi56ZXJvKCk7CisKKyAgTmF0aXZlRmxvYXQ2NHgyLmZyb21GbG9hdDMyeDQoTmF0aXZlRmxvYXQzMng0IHYpIHsKKyAgICBfc3RvcmFnZVswXSA9IHYuX3N0b3JhZ2VbMF07CisgICAgX3N0b3JhZ2VbMV0gPSB2Ll9zdG9yYWdlWzFdOworICB9CisKKyAgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAnWyR7X3N0b3JhZ2VbMF19LCAke19zdG9yYWdlWzFdfV0nOworICB9CisKKyAgLy8vIEFkZGl0aW9uIG9wZXJhdG9yLgorICBGbG9hdDY0eDIgb3BlcmF0b3IrKE5hdGl2ZUZsb2F0NjR4MiBvdGhlcikgeworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQ2NHgyKF9zdG9yYWdlWzBdICsgb3RoZXIuX3N0b3JhZ2VbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2VbMV0gKyBvdGhlci5fc3RvcmFnZVsxXSk7CisgIH0KKworICAvLy8gTmVnYXRlIG9wZXJhdG9yLgorICBGbG9hdDY0eDIgb3BlcmF0b3ItKCkgeworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQ2NHgyKC1fc3RvcmFnZVswXSwgLV9zdG9yYWdlWzFdKTsKKyAgfQorCisgIC8vLyBTdWJ0cmFjdGlvbiBvcGVyYXRvci4KKyAgRmxvYXQ2NHgyIG9wZXJhdG9yLShOYXRpdmVGbG9hdDY0eDIgb3RoZXIpIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0NjR4Mihfc3RvcmFnZVswXSAtIG90aGVyLl9zdG9yYWdlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdG9yYWdlWzFdIC0gb3RoZXIuX3N0b3JhZ2VbMV0pOworICB9CisgIC8vLyBNdWx0aXBsaWNhdGlvbiBvcGVyYXRvci4KKyAgRmxvYXQ2NHgyIG9wZXJhdG9yKihOYXRpdmVGbG9hdDY0eDIgb3RoZXIpIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0NjR4Mihfc3RvcmFnZVswXSAqIG90aGVyLl9zdG9yYWdlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RvcmFnZVsxXSAqIG90aGVyLl9zdG9yYWdlWzFdKTsKKyAgfQorICAvLy8gRGl2aXNpb24gb3BlcmF0b3IuCisgIEZsb2F0NjR4MiBvcGVyYXRvci8oTmF0aXZlRmxvYXQ2NHgyIG90aGVyKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoX3N0b3JhZ2VbMF0gLyBvdGhlci5fc3RvcmFnZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2VbMV0gLyBvdGhlci5fc3RvcmFnZVsxXSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIGNvcHkgb2YgW3RoaXNdIGVhY2ggbGFuZSBiZWluZyBzY2FsZWQgYnkgW3NdLgorICBGbG9hdDY0eDIgc2NhbGUoZG91YmxlIHMpIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0NjR4Mihfc3RvcmFnZVswXSAqIHMsIF9zdG9yYWdlWzFdICogcyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQ2NHgyXS4KKyAgRmxvYXQ2NHgyIGFicygpIHsKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUZsb2F0NjR4Mihfc3RvcmFnZVswXS5hYnMoKSwgX3N0b3JhZ2VbMV0uYWJzKCkpOworICB9CisKKyAgLy8vIENsYW1wcyBbdGhpc10gdG8gYmUgaW4gdGhlIHJhbmdlIFtsb3dlckxpbWl0XS1bdXBwZXJMaW1pdF0uCisgIEZsb2F0NjR4MiBjbGFtcChOYXRpdmVGbG9hdDY0eDIgbG93ZXJMaW1pdCwKKyAgICAgICAgICAgICAgICAgIE5hdGl2ZUZsb2F0NjR4MiB1cHBlckxpbWl0KSB7CisgICAgZG91YmxlIF9seCA9IGxvd2VyTGltaXQuX3N0b3JhZ2VbMF07CisgICAgZG91YmxlIF9seSA9IGxvd2VyTGltaXQuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF91eCA9IHVwcGVyTGltaXQuX3N0b3JhZ2VbMF07CisgICAgZG91YmxlIF91eSA9IHVwcGVyTGltaXQuX3N0b3JhZ2VbMV07CisgICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF07CisgICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbMV07CisgICAgLy8gTUFYKE1JTihzZWxmLCB1cHBlciksIGxvd2VyKS4KKyAgICBfeCA9IF94ID4gX3V4ID8gX3V4IDogX3g7CisgICAgX3kgPSBfeSA+IF91eSA/IF91eSA6IF95OworICAgIF94ID0gX3ggPCBfbHggPyBfbHggOiBfeDsKKyAgICBfeSA9IF95IDwgX2x5ID8gX2x5IDogX3k7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoX3gsIF95KTsKKyAgfQorCisgIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4KKyAgZG91YmxlIGdldCB4ID0+IF9zdG9yYWdlWzBdOworICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuCisgIGRvdWJsZSBnZXQgeSA9PiBfc3RvcmFnZVsxXTsKKworICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXRzIGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCAyIGJpdHMuCisgIGludCBnZXQgc2lnbk1hc2sgeworICAgIHZhciB2aWV3ID0gX3N0b3JhZ2UuYnVmZmVyLmFzVWludDMyTGlzdCgpOworICAgIHZhciBteCA9ICh2aWV3WzFdICYgMHg4MDAwMDAwMCkgPj4gMzE7CisgICAgdmFyIG15ID0gKHZpZXdbM10gJiAweDgwMDAwMDAwKSA+PiAzMTsKKyAgICByZXR1cm4gbXggfCBteSA8PCAxOworICB9CisKKyAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0NjR4Ml0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KKyAgRmxvYXQ2NHgyIHdpdGhYKGRvdWJsZSB4KSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoeCwgX3N0b3JhZ2VbMV0pOworICB9CisKKyAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0NjR4Ml0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KKyAgRmxvYXQ2NHgyIHdpdGhZKGRvdWJsZSB5KSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoX3N0b3JhZ2VbMF0sIHkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtaW5pbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgorICBGbG9hdDY0eDIgbWluKE5hdGl2ZUZsb2F0NjR4MiBvdGhlcikgeworICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQ2NHgyKAorICAgICAgICBfc3RvcmFnZVswXSA8IG90aGVyLl9zdG9yYWdlWzBdID8gX3N0b3JhZ2VbMF0gOiBvdGhlci5fc3RvcmFnZVswXSwKKyAgICAgICAgX3N0b3JhZ2VbMV0gPCBvdGhlci5fc3RvcmFnZVsxXSA/IF9zdG9yYWdlWzFdIDogb3RoZXIuX3N0b3JhZ2VbMV0pOworCisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIG1heGltdW0gdmFsdWUgaW4gW3RoaXNdIG9yIFtvdGhlcl0uCisgIEZsb2F0NjR4MiBtYXgoTmF0aXZlRmxvYXQ2NHgyIG90aGVyKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoCisgICAgICAgIF9zdG9yYWdlWzBdID4gb3RoZXIuX3N0b3JhZ2VbMF0gPyBfc3RvcmFnZVswXSA6IG90aGVyLl9zdG9yYWdlWzBdLAorICAgICAgICBfc3RvcmFnZVsxXSA+IG90aGVyLl9zdG9yYWdlWzFdID8gX3N0b3JhZ2VbMV0gOiBvdGhlci5fc3RvcmFnZVsxXSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIHNxdWFyZSByb290IG9mIFt0aGlzXS4KKyAgRmxvYXQ2NHgyIHNxcnQoKSB7CisgICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDY0eDIoTWF0aC5zcXJ0KF9zdG9yYWdlWzBdKSwgTWF0aC5zcXJ0KF9zdG9yYWdlWzFdKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL2xpYi90eXBlZF9kYXRhX3BhdGNoLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9saWIvdHlwZWRfZGF0YV9wYXRjaC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjk2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9saWIvdHlwZWRfZGF0YV9wYXRjaC5kYXJ0CkBAIC0wLDAgKzEsMTc1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKworaW1wb3J0ICdkYXJ0Ol9pbnRlcm5hbCcgc2hvdyBGaXhlZExlbmd0aExpc3RNaXhpbjsKK2ltcG9ydCAnZGFydDpfZm9yZWlnbl9oZWxwZXInIHNob3cgSlM7CitpbXBvcnQgJ2RhcnQ6bWF0aCcgYXMgTWF0aDsKK2ltcG9ydCAnZGFydDpfaW50ZXJuYWwnOworaW1wb3J0ICdkYXJ0Ol9pbnRlcmNlcHRvcnMnIHNob3cgSlNJbmRleGFibGUsIEpTVUludDMyLCBKU1VJbnQzMTsKK2ltcG9ydCAnZGFydDpfanNfaGVscGVyJworICAgIHNob3cgQ3JlYXRlcywgSmF2YVNjcmlwdEluZGV4aW5nQmVoYXZpb3IsIEpTTmFtZSwgTnVsbCwgUmV0dXJucywgcGF0Y2g7CitpbXBvcnQgJ2RhcnQ6X25hdGl2ZV90eXBlZF9kYXRhJzsKKworQHBhdGNoIGNsYXNzIEJ5dGVEYXRhIHsKKyAgQHBhdGNoIGZhY3RvcnkgQnl0ZURhdGEoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVCeXRlRGF0YShsZW5ndGgpOworfQorCisKK0BwYXRjaCBjbGFzcyBGbG9hdDMyTGlzdCB7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJMaXN0KGludCBsZW5ndGgpID0+CisgICAgICBuZXcgTmF0aXZlRmxvYXQzMkxpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDMyTGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlRmxvYXQzMkxpc3QuZnJvbUxpc3QoZWxlbWVudHMpOworfQorCisKK0BwYXRjaCBjbGFzcyBGbG9hdDY0TGlzdCB7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0NjRMaXN0KGludCBsZW5ndGgpID0+CisgICAgICBuZXcgTmF0aXZlRmxvYXQ2NExpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDY0TGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlRmxvYXQ2NExpc3QuZnJvbUxpc3QoZWxlbWVudHMpOworfQorCisKK0BwYXRjaCBjbGFzcyBJbnQxNkxpc3QgeworICBAcGF0Y2ggZmFjdG9yeSBJbnQxNkxpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVJbnQxNkxpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBJbnQxNkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgorICAgICAgbmV3IE5hdGl2ZUludDE2TGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Cit9CisKK0BwYXRjaCBjbGFzcyBJbnQzMkxpc3QgeworICBAcGF0Y2ggZmFjdG9yeSBJbnQzMkxpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVJbnQzMkxpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBJbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgorICAgICAgbmV3IE5hdGl2ZUludDMyTGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Cit9CisKKworQHBhdGNoIGNsYXNzIEludDhMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgSW50OExpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVJbnQ4TGlzdChsZW5ndGgpOworCisgIEBwYXRjaCBmYWN0b3J5IEludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIG5ldyBOYXRpdmVJbnQ4TGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Cit9CisKKworQHBhdGNoIGNsYXNzIFVpbnQzMkxpc3QgeworICBAcGF0Y2ggZmFjdG9yeSBVaW50MzJMaXN0KGludCBsZW5ndGgpID0+CisgICAgICBuZXcgTmF0aXZlVWludDMyTGlzdChsZW5ndGgpOworCisgIEBwYXRjaCBmYWN0b3J5IFVpbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgorICAgICAgbmV3IE5hdGl2ZVVpbnQzMkxpc3QuZnJvbUxpc3QoZWxlbWVudHMpOworfQorCisKK0BwYXRjaCBjbGFzcyBVaW50MTZMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgVWludDE2TGlzdChpbnQgbGVuZ3RoKSA9PgorICAgICAgbmV3IE5hdGl2ZVVpbnQxNkxpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBVaW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KKyAgICAgIG5ldyBOYXRpdmVVaW50MTZMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKK30KKworCitAcGF0Y2ggY2xhc3MgVWludDhDbGFtcGVkTGlzdCB7CisgIEBwYXRjaCBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVVaW50OENsYW1wZWRMaXN0KGxlbmd0aCk7CisKKyAgQHBhdGNoIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlVWludDhDbGFtcGVkTGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Cit9CisKKworQHBhdGNoIGNsYXNzIFVpbnQ4TGlzdCB7CisgIEBwYXRjaCBmYWN0b3J5IFVpbnQ4TGlzdChpbnQgbGVuZ3RoKSA9PgorICAgICAgbmV3IE5hdGl2ZVVpbnQ4TGlzdChsZW5ndGgpOworCisgIEBwYXRjaCBmYWN0b3J5IFVpbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlVWludDhMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKK30KKworCitAcGF0Y2ggY2xhc3MgSW50NjRMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgSW50NjRMaXN0KGludCBsZW5ndGgpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSW50NjRMaXN0IG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4iKTsKKyAgfQorCisgIEBwYXRjaCBmYWN0b3J5IEludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiSW50NjRMaXN0IG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4iKTsKKyAgfQorfQorCisKK0BwYXRjaCBjbGFzcyBVaW50NjRMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgVWludDY0TGlzdChpbnQgbGVuZ3RoKSB7CisgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIlVpbnQ2NExpc3Qgbm90IHN1cHBvcnRlZCBieSBkYXJ0MmpzLiIpOworICB9CisKKyAgQHBhdGNoIGZhY3RvcnkgVWludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpIHsKKyAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVWludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7CisgIH0KK30KKworQHBhdGNoIGNsYXNzIEludDMyeDRMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgSW50MzJ4NExpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVJbnQzMng0TGlzdChsZW5ndGgpOworCisgIEBwYXRjaCBmYWN0b3J5IEludDMyeDRMaXN0LmZyb21MaXN0KExpc3Q8SW50MzJ4ND4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlSW50MzJ4NExpc3QuZnJvbUxpc3QoZWxlbWVudHMpOworfQorCitAcGF0Y2ggY2xhc3MgRmxvYXQzMng0TGlzdCB7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NExpc3QoaW50IGxlbmd0aCkgPT4KKyAgICAgIG5ldyBOYXRpdmVGbG9hdDMyeDRMaXN0KGxlbmd0aCk7CisKKyAgQHBhdGNoIGZhY3RvcnkgRmxvYXQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEZsb2F0MzJ4ND4gZWxlbWVudHMpID0+CisgICAgICBuZXcgTmF0aXZlRmxvYXQzMng0TGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Cit9CisKK0BwYXRjaCBjbGFzcyBGbG9hdDY0eDJMaXN0IHsKKyAgQHBhdGNoIGZhY3RvcnkgRmxvYXQ2NHgyTGlzdChpbnQgbGVuZ3RoKSA9PgorICAgICAgbmV3IE5hdGl2ZUZsb2F0NjR4Mkxpc3QobGVuZ3RoKTsKKworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDY0eDJMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBlbGVtZW50cykgPT4KKyAgICAgIG5ldyBOYXRpdmVGbG9hdDY0eDJMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKK30KKworQHBhdGNoIGNsYXNzIEZsb2F0MzJ4NCB7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NChkb3VibGUgeCwgZG91YmxlIHksIGRvdWJsZSB6LCBkb3VibGUgdykgPT4KKyAgICAgIG5ldyBOYXRpdmVGbG9hdDMyeDQoeCwgeSwgeiwgdyk7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NC5zcGxhdChkb3VibGUgdikgPT4KKyAgICAgIG5ldyBOYXRpdmVGbG9hdDMyeDQuc3BsYXQodik7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NC56ZXJvKCkgPT4gbmV3IE5hdGl2ZUZsb2F0MzJ4NC56ZXJvKCk7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NC5mcm9tSW50MzJ4NEJpdHMoSW50MzJ4NCB4KSA9PgorICAgICAgbmV3IE5hdGl2ZUZsb2F0MzJ4NC5mcm9tSW50MzJ4NEJpdHMoeCk7CisgIEBwYXRjaCBmYWN0b3J5IEZsb2F0MzJ4NC5mcm9tRmxvYXQ2NHgyKEZsb2F0NjR4MiB2KSA9PgorICAgICAgbmV3IE5hdGl2ZUZsb2F0MzJ4NC5mcm9tRmxvYXQ2NHgyKHYpOworfQorCitAcGF0Y2ggY2xhc3MgSW50MzJ4NCB7CisgIEBwYXRjaCBmYWN0b3J5IEludDMyeDQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpCisgICAgICA9PiBuZXcgTmF0aXZlSW50MzJ4NCh4LCB5LCB6ICwgdyk7CisgIEBwYXRjaCBmYWN0b3J5IEludDMyeDQuYm9vbChib29sIHgsIGJvb2wgeSwgYm9vbCB6LCBib29sIHcpCisgICAgICA9PiBuZXcgTmF0aXZlSW50MzJ4NC5ib29sKHgsIHksIHosIHcpOworICBAcGF0Y2ggZmFjdG9yeSBJbnQzMng0LmZyb21GbG9hdDMyeDRCaXRzKEZsb2F0MzJ4NCB4KQorICAgICAgPT4gbmV3IE5hdGl2ZUludDMyeDQuZnJvbUZsb2F0MzJ4NEJpdHMoeCk7Cit9CisKK0BwYXRjaCBjbGFzcyBGbG9hdDY0eDIgeworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDY0eDIoZG91YmxlIHgsIGRvdWJsZSB5KSA9PiBuZXcgTmF0aXZlRmxvYXQ2NHgyKHgsIHkpOworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDY0eDIuc3BsYXQoZG91YmxlIHYpCisgICAgICA9PiBuZXcgTmF0aXZlRmxvYXQ2NHgyLnNwbGF0KHYpOworICBAcGF0Y2ggZmFjdG9yeSBGbG9hdDY0eDIuemVybygpCisgICAgICA9PiBuZXcgTmF0aXZlRmxvYXQ2NHgyLnplcm8oKTsKKyAgQHBhdGNoIGZhY3RvcnkgRmxvYXQ2NHgyLmZyb21GbG9hdDMyeDQoRmxvYXQzMng0IHYpCisgICAgICA9PiBuZXcgTmF0aXZlRmxvYXQ2NHgyLmZyb21GbG9hdDMyeDQodik7Cit9CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9saWJyYXJpZXMuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL2xpYnJhcmllcy5kYXJ0CmluZGV4IGI2MDBhZjQuLmUzY2U0MzUgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL2xpYnJhcmllcy5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL2xpYnJhcmllcy5kYXJ0CkBAIC0zMyw3ICszMyw3IEBACiAgICAgICBpbXBsZW1lbnRhdGlvbjogdHJ1ZSwKICAgICAgIGRvY3VtZW50ZWQ6IGZhbHNlLAogICAgICAgcGxhdGZvcm1zOiBWTV9QTEFURk9STSksCi0gCisKICAgIl9jaHJvbWUiOiBjb25zdCBMaWJyYXJ5SW5mbygKICAgICAgICJfY2hyb21lL2RhcnQyanMvY2hyb21lX2RhcnQyanMuZGFydCIsCiAgICAgICBkb2N1bWVudGVkOiBmYWxzZSwKQEAgLTExNSwxMCArMTE1LDEwIEBACiAgICJ0eXBlZF9kYXRhIjogY29uc3QgTGlicmFyeUluZm8oCiAgICAgICAidHlwZWRfZGF0YS90eXBlZF9kYXRhLmRhcnQiLAogICAgICAgbWF0dXJpdHk6IE1hdHVyaXR5LlNUQUJMRSwKLSAgICAgIGRhcnQyanNQYXRoOiAidHlwZWRfZGF0YS9kYXJ0MmpzL3R5cGVkX2RhdGFfZGFydDJqcy5kYXJ0IiksCisgICAgICBkYXJ0MmpzUGF0Y2hQYXRoOiAiX2ludGVybmFsL2xpYi90eXBlZF9kYXRhX3BhdGNoLmRhcnQiKSwKIAogICAiX25hdGl2ZV90eXBlZF9kYXRhIjogY29uc3QgTGlicmFyeUluZm8oCi0gICAgICAidHlwZWRfZGF0YS9kYXJ0MmpzL25hdGl2ZV90eXBlZF9kYXRhX2RhcnQyanMuZGFydCIsCisgICAgICAiX2ludGVybmFsL2xpYi9uYXRpdmVfdHlwZWRfZGF0YS5kYXJ0IiwKICAgICAgIGNhdGVnb3J5OiAiSW50ZXJuYWwiLAogICAgICAgaW1wbGVtZW50YXRpb246IHRydWUsCiAgICAgICBkb2N1bWVudGVkOiBmYWxzZSwKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQuZGFydAppbmRleCA1ZjBkZjY0Li4xZjVhYzJhIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9jb21tYW5kLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvY29tbWFuZC5kYXJ0CkBAIC02Nyw3ICs2Nyw3IEBACiAgIC8vLyBbY29tbWFuZHNdLgogICBzdGF0aWMgdm9pZCB1c2FnZUVycm9yV2l0aENvbW1hbmRzKE1hcDxTdHJpbmcsIFB1YkNvbW1hbmQ+IGNvbW1hbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSkgewotICAgIHRocm93IG5ldyBVc2FnZUV4Y2VwdGlvbihtZXNzYWdlKS4uYmluZFVzYWdlKF9saXN0Q29tbWFuZHMoY29tbWFuZHMpKTsKKyAgICB0aHJvdyBuZXcgVXNhZ2VFeGNlcHRpb24obWVzc2FnZSwgX2xpc3RDb21tYW5kcyhjb21tYW5kcykpOwogICB9CiAKICAgLy8vIFdyaXRlcyBbY29tbWFuZHNdIGluIGEgbmljZWx5IGZvcm1hdHRlZCBsaXN0IHRvIFtidWZmZXJdLgpAQCAtMTkwLDEwICsxOTAsNyBAQAogICAgICAgZW50cnlwb2ludCA9IG5ldyBFbnRyeXBvaW50KHBhdGguY3VycmVudCwgY2FjaGUpOwogICAgIH0KIAotICAgIHJldHVybiBzeW5jRnV0dXJlKG9uUnVuKS5jYXRjaEVycm9yKChlcnJvcikgewotICAgICAgaWYgKGVycm9yIGlzIFVzYWdlRXhjZXB0aW9uKSBlcnJvci5iaW5kVXNhZ2UoX2dldFVzYWdlKCkpOwotICAgICAgdGhyb3cgZXJyb3I7Ci0gICAgfSk7CisgICAgcmV0dXJuIHN5bmNGdXR1cmUob25SdW4pOwogICB9CiAKICAgLy8vIE92ZXJyaWRlIHRoaXMgdG8gcGVyZm9ybSB0aGUgc3BlY2lmaWMgY29tbWFuZC4KQEAgLTIxNiw2ICsyMTMsMTIgQEAKICAgICBsb2cubWVzc2FnZSgnJGRlc2NyaXB0aW9uXG5cbiR7X2dldFVzYWdlKCl9Jyk7CiAgIH0KIAorICAvLy8gVGhyb3cgYSBbVXNhZ2VFeGNlcHRpb25dIGZvciBhIHVzYWdlIGVycm9yIG9mIHRoaXMgY29tbWFuZCB3aXRoCisgIC8vLyBbbWVzc2FnZV0uCisgIHZvaWQgdXNhZ2VFcnJvcihTdHJpbmcgbWVzc2FnZSkgeworICAgIHRocm93IG5ldyBVc2FnZUV4Y2VwdGlvbihtZXNzYWdlLCBfZ2V0VXNhZ2UoKSk7CisgIH0KKwogICAvLy8gUGFyc2VzIGEgdXNlci1zdXBwbGllZCBpbnRlZ2VyIFtpbnRTdHJpbmddIG5hbWVkIFtuYW1lXS4KICAgLy8vCiAgIC8vLyBJZiB0aGUgcGFyc2luZyBmYWlscywgcHJpbnRzIGEgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdHMuCkBAIC0yMjcsMTEgKzIzMCw2IEBACiAgICAgfQogICB9CiAKLSAgLy8vIEZhaWxzIHdpdGggYSB1c2FnZSBlcnJvciBbbWVzc2FnZV0gZm9yIHRoaXMgY29tbWFuZC4KLSAgdm9pZCB1c2FnZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgdGhyb3cgbmV3IFVzYWdlRXhjZXB0aW9uKG1lc3NhZ2UpLi5iaW5kVXNhZ2UoX2dldFVzYWdlKCkpOwotICB9Ci0KICAgLy8vIEdlbmVyYXRlcyBhIHN0cmluZyBvZiB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBjb21tYW5kLgogICBTdHJpbmcgX2dldFVzYWdlKCkgewogICAgIHZhciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9jb21tYW5kL2dsb2JhbF9ydW4uZGFydCBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQvZ2xvYmFsX3J1bi5kYXJ0CmluZGV4IGJkZmZiOTMuLjExZjA4YzAgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQvZ2xvYmFsX3J1bi5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQvZ2xvYmFsX3J1bi5kYXJ0CkBAIC00Myw3ICs0Myw3IEBACiAgICAgdmFyIGFyZ3MgPSBjb21tYW5kT3B0aW9ucy5yZXN0LnNraXAoMik7CiAKICAgICByZXR1cm4gZ2xvYmFscy5maW5kKHBhY2thZ2UpLnRoZW4oKGVudHJ5cG9pbnQpIHsKLSAgICAgIHJldHVybiBydW5FeGVjdXRhYmxlKGVudHJ5cG9pbnQsIHBhY2thZ2UsIGV4ZWN1dGFibGUsIGFyZ3MpOworICAgICAgcmV0dXJuIHJ1bkV4ZWN1dGFibGUodGhpcywgZW50cnlwb2ludCwgcGFja2FnZSwgZXhlY3V0YWJsZSwgYXJncyk7CiAgICAgfSkudGhlbihmbHVzaFRoZW5FeGl0KTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvY29tbWFuZC9ydW4uZGFydCBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2NvbW1hbmQvcnVuLmRhcnQKaW5kZXggNWQ4YWFhOS4uZTFmMzE2NiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvY29tbWFuZC9ydW4uZGFydAorKysgYi9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9jb21tYW5kL3J1bi5kYXJ0CkBAIC00NCw3ICs0NCw3IEBACiAgICAgICBleGVjdXRhYmxlID0gY29tcG9uZW50c1sxXTsKICAgICB9CiAKLSAgICByZXR1cm4gcnVuRXhlY3V0YWJsZShlbnRyeXBvaW50LCBwYWNrYWdlLCBleGVjdXRhYmxlLCBhcmdzKQorICAgIHJldHVybiBydW5FeGVjdXRhYmxlKHRoaXMsIGVudHJ5cG9pbnQsIHBhY2thZ2UsIGV4ZWN1dGFibGUsIGFyZ3MpCiAgICAgICAgIC50aGVuKGZsdXNoVGhlbkV4aXQpOwogICB9CiB9CmRpZmYgLS1naXQgYS9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9leGNlcHRpb25zLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9leGNlcHRpb25zLmRhcnQKaW5kZXggN2JiYmIzNC4uNzRhZjUzOSAxMDA2NDQKLS0tIGEvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvZXhjZXB0aW9ucy5kYXJ0CisrKyBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2V4Y2VwdGlvbnMuZGFydApAQCAtNTMsMjMgKzUzLDEwIEBACiAgIC8vLyBUaGUgY29tbWFuZCB1c2FnZSBpbmZvcm1hdGlvbi4KICAgU3RyaW5nIF91c2FnZTsKIAotICBVc2FnZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkKKyAgVXNhZ2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIHRoaXMuX3VzYWdlKQogICAgICAgOiBzdXBlcihtZXNzYWdlKTsKIAotICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgaWYgKF91c2FnZSA9PSBudWxsKSByZXR1cm4gbWVzc2FnZTsKLSAgICByZXR1cm4gIiRtZXNzYWdlXG5cbiRfdXNhZ2UiOwotICB9Ci0KLSAgLy8vIEF0dGFjaCB1c2FnZSBpbmZvcm1hdGlvbiB0byB0aGUgZXhjZXB0aW9uLgotICAvLy8KLSAgLy8vIFRoaXMgaXMgZG9uZSBhZnRlciB0aGUgZXhjZXB0aW9uIGlzIGNyZWF0ZWQgc28gdGhhdCBjb2RlIG91dHNpZGUgb2YgdGhlCi0gIC8vLyBjb21tYW5kIGNhbiBzdGlsbCBnZW5lcmF0ZSB1c2FnZSBlcnJvcnMuCi0gIHZvaWQgYmluZFVzYWdlKFN0cmluZyB1c2FnZSkgewotICAgIC8vIE9ubHkgYmluZCBpZiBub3QgYWxyZWFkeSBib3VuZC4KLSAgICBpZiAoX3VzYWdlICE9IG51bGwpIHJldHVybjsKLSAgICBfdXNhZ2UgPSB1c2FnZTsKLSAgfQorICBTdHJpbmcgdG9TdHJpbmcoKSA9PiAiJG1lc3NhZ2VcblxuJF91c2FnZSI7CiB9CiAKIC8vLyBBIGNsYXNzIGZvciBlcnJvcnMgaW4gYSBjb21tYW5kJ3MgaW5wdXQgZGF0YS4KZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2V4ZWN1dGFibGUuZGFydCBiL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL2V4ZWN1dGFibGUuZGFydAppbmRleCBhYjYzNzY1Li5lN2QxYzEwIDEwMDY0NAotLS0gYS9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy9leGVjdXRhYmxlLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvZXhlY3V0YWJsZS5kYXJ0CkBAIC0xMyw2ICsxMyw3IEBACiAKIGltcG9ydCAnYmFyYmFjay9hc3NldF9lbnZpcm9ubWVudC5kYXJ0JzsKIGltcG9ydCAnYmFyYmFjay9iYXJiYWNrX3NlcnZlci5kYXJ0JzsKK2ltcG9ydCAnY29tbWFuZC5kYXJ0JzsKIGltcG9ydCAnZW50cnlwb2ludC5kYXJ0JzsKIGltcG9ydCAnZXhpdF9jb2Rlcy5kYXJ0JyBhcyBleGl0X2NvZGVzOwogaW1wb3J0ICdsb2cuZGFydCcgYXMgbG9nOwpAQCAtMjgsOCArMjksOCBAQAogLy8vIEFyZ3VtZW50cyBmcm9tIFthcmdzXSB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc3Bhd25lZCBEYXJ0IGFwcGxpY2F0aW9uLgogLy8vCiAvLy8gUmV0dXJucyB0aGUgZXhpdCBjb2RlIG9mIHRoZSBzcGF3bmVkIGFwcC4KLUZ1dHVyZTxpbnQ+IHJ1bkV4ZWN1dGFibGUoRW50cnlwb2ludCBlbnRyeXBvaW50LCBTdHJpbmcgcGFja2FnZSwKLSAgICBTdHJpbmcgZXhlY3V0YWJsZSwgSXRlcmFibGU8U3RyaW5nPiBhcmdzKSB7CitGdXR1cmU8aW50PiBydW5FeGVjdXRhYmxlKFB1YkNvbW1hbmQgY29tbWFuZCwgRW50cnlwb2ludCBlbnRyeXBvaW50LAorICAgIFN0cmluZyBwYWNrYWdlLCBTdHJpbmcgZXhlY3V0YWJsZSwgSXRlcmFibGU8U3RyaW5nPiBhcmdzKSB7CiAgIC8vIElmIHRoZSBjb21tYW5kIGhhcyBhIHBhdGggc2VwYXJhdG9yLCB0aGVuIGl0J3MgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZQogICAvLyByb290IG9mIHRoZSBwYWNrYWdlLiBPdGhlcndpc2UsIGl0J3MgaW1wbGljaXRseSB1bmRlcnN0b29kIHRvIGJlIGluCiAgIC8vICJiaW4iLgpAQCAtMzcsNyArMzgsOCBAQAogICB2YXIgcGFydHMgPSBwLnNwbGl0KGV4ZWN1dGFibGUpOwogICBpZiAocGFydHMubGVuZ3RoID4gMSkgewogICAgIGlmIChwYWNrYWdlICE9IGVudHJ5cG9pbnQucm9vdC5uYW1lKSB7Ci0gICAgICB1c2FnZUVycm9yKCJDYW5ub3QgcnVuIGFuIGV4ZWN1dGFibGUgaW4gYSBzdWJkaXJlY3Rvcnkgb2YgYSBkZXBlbmRlbmN5LiIpOworICAgICAgY29tbWFuZC51c2FnZUVycm9yKAorICAgICAgICAgICJDYW5ub3QgcnVuIGFuIGV4ZWN1dGFibGUgaW4gYSBzdWJkaXJlY3Rvcnkgb2YgYSBkZXBlbmRlbmN5LiIpOwogICAgIH0KIAogICAgIHJvb3REaXIgPSBwYXJ0cy5maXJzdDsKZGlmZiAtLWdpdCBhL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL3V0aWxzLmRhcnQgYi9zZGsvbGliL19pbnRlcm5hbC9wdWIvbGliL3NyYy91dGlscy5kYXJ0CmluZGV4IDY4YzBjNzQuLjNjMmUxYWEgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvX2ludGVybmFsL3B1Yi9saWIvc3JjL3V0aWxzLmRhcnQKKysrIGIvc2RrL2xpYi9faW50ZXJuYWwvcHViL2xpYi9zcmMvdXRpbHMuZGFydApAQCAtODQ2LDYgKzg0NiwzIEBACiAvLy8KIC8vLyBUaGlzIHdpbGwgcmVwb3J0IHRoZSBlcnJvciBhbmQgY2F1c2UgcHViIHRvIGV4aXQgd2l0aCBbZXhpdF9jb2Rlcy5EQVRBXS4KIHZvaWQgZGF0YUVycm9yKFN0cmluZyBtZXNzYWdlKSA9PiB0aHJvdyBuZXcgRGF0YUV4Y2VwdGlvbihtZXNzYWdlKTsKLQotLy8vIFRocm93IGEgW1VzYWdlRXhjZXB0aW9uXSBmb3IgYSB1c2FnZSBlcnJvciBvZiBhIGNvbW1hbmQgd2l0aCBbbWVzc2FnZV0uCi12b2lkIHVzYWdlRXJyb3IoU3RyaW5nIG1lc3NhZ2UpID0+IHRocm93IG5ldyBVc2FnZUV4Y2VwdGlvbihtZXNzYWdlKTsKZGlmZiAtLWdpdCBhL3Nkay9saWIvYXN5bmMvc3RyZWFtX2ltcGwuZGFydCBiL3Nkay9saWIvYXN5bmMvc3RyZWFtX2ltcGwuZGFydAppbmRleCAwMTMzZjY4Li4yMDMxNGM4IDEwMDY0NAotLS0gYS9zZGsvbGliL2FzeW5jL3N0cmVhbV9pbXBsLmRhcnQKKysrIGIvc2RrL2xpYi9hc3luYy9zdHJlYW1faW1wbC5kYXJ0CkBAIC0zNTQsMTAgKzM1NCw3IEBACiAgICAgICAvLyBmdXR1cmUgdG8gZmluaXNoIHdlIG11c3Qgbm90IHJlcG9ydCB0aGUgZXJyb3IuCiAgICAgICBpZiAoX2lzQ2FuY2VsZWQgJiYgIV93YWl0c0ZvckNhbmNlbCkgcmV0dXJuOwogICAgICAgX3N0YXRlIHw9IF9TVEFURV9JTl9DQUxMQkFDSzsKLSAgICAgIGlmICghX3pvbmUuaW5TYW1lRXJyb3Jab25lKFpvbmUuY3VycmVudCkpIHsKLSAgICAgICAgLy8gRXJyb3JzIGFyZSBub3QgYWxsb3dlZCB0byB0cmF2ZXJzZSB6b25lIGJvdW5kYXJpZXMuCi0gICAgICAgIFpvbmUuY3VycmVudC5oYW5kbGVVbmNhdWdodEVycm9yKGVycm9yLCBzdGFja1RyYWNlKTsKLSAgICAgIH0gZWxzZSBpZiAoX29uRXJyb3IgaXMgWm9uZUJpbmFyeUNhbGxiYWNrKSB7CisgICAgICBpZiAoX29uRXJyb3IgaXMgWm9uZUJpbmFyeUNhbGxiYWNrKSB7CiAgICAgICAgIF96b25lLnJ1bkJpbmFyeUd1YXJkZWQoX29uRXJyb3IsIGVycm9yLCBzdGFja1RyYWNlKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIF96b25lLnJ1blVuYXJ5R3VhcmRlZChfb25FcnJvciwgZXJyb3IpOwpkaWZmIC0tZ2l0IGEvc2RrL2xpYi9odG1sL2RhcnQyanMvaHRtbF9kYXJ0MmpzLmRhcnQgYi9zZGsvbGliL2h0bWwvZGFydDJqcy9odG1sX2RhcnQyanMuZGFydAppbmRleCAyZmNmMDFhLi4xNmZjNWNjIDEwMDY0NAotLS0gYS9zZGsvbGliL2h0bWwvZGFydDJqcy9odG1sX2RhcnQyanMuZGFydAorKysgYi9zZGsvbGliL2h0bWwvZGFydDJqcy9odG1sX2RhcnQyanMuZGFydApAQCAtMTE5ODEsNyArMTE5ODEsNyBAQAogCiAKIEBEb21OYW1lKCdFdmVudCcpCi1jbGFzcyBFdmVudCBleHRlbmRzIEludGVyY2VwdG9yIG5hdGl2ZSAiRXZlbnQsSW5wdXRFdmVudCIgeworY2xhc3MgRXZlbnQgZXh0ZW5kcyBJbnRlcmNlcHRvciBuYXRpdmUgIkV2ZW50LElucHV0RXZlbnQsQ2xpcGJvYXJkRXZlbnQiIHsKICAgLy8gSW4gSlMsIGNhbkJ1YmJsZSBhbmQgY2FuY2VsYWJsZSBhcmUgdGVjaG5pY2FsbHkgcmVxdWlyZWQgcGFyYW1ldGVycyB0bwogICAvLyBpbml0KkV2ZW50LiBJbiBwcmFjdGljZSwgdGhvdWdoLCBpZiB0aGV5IGFyZW4ndCBwcm92aWRlZCB0aGV5IHNpbXBseQogICAvLyBkZWZhdWx0IHRvIGZhbHNlIChzaW5jZSB0aGF0J3MgQm9vbGVhbih1bmRlZmluZWQpKS4KQEAgLTEyMDkwLDYgKzEyMDkwLDcgQEAKICAgQERvbU5hbWUoJ0V2ZW50LmNsaXBib2FyZERhdGEnKQogICBARG9jc0VkaXRhYmxlKCkKICAgQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5DSFJPTUUpCisgIEBTdXBwb3J0ZWRCcm93c2VyKFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCkKICAgQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5TQUZBUkkpCiAgIEBFeHBlcmltZW50YWwoKQogICAvLyBQYXJ0IG9mIGNvcHkvcGFzdGUKZGlmZiAtLWdpdCBhL3Nkay9saWIvaHRtbC9kYXJ0aXVtL2h0bWxfZGFydGl1bS5kYXJ0IGIvc2RrL2xpYi9odG1sL2RhcnRpdW0vaHRtbF9kYXJ0aXVtLmRhcnQKaW5kZXggY2M2NTNmNy4uMTQyMmY4YiAxMDA2NDQKLS0tIGEvc2RrL2xpYi9odG1sL2RhcnRpdW0vaHRtbF9kYXJ0aXVtLmRhcnQKKysrIGIvc2RrL2xpYi9odG1sL2RhcnRpdW0vaHRtbF9kYXJ0aXVtLmRhcnQKQEAgLTEyMzQ1LDYgKzEyMzQ1LDcgQEAKICAgQERvbU5hbWUoJ0V2ZW50LmNsaXBib2FyZERhdGEnKQogICBARG9jc0VkaXRhYmxlKCkKICAgQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5DSFJPTUUpCisgIEBTdXBwb3J0ZWRCcm93c2VyKFN1cHBvcnRlZEJyb3dzZXIuRklSRUZPWCkKICAgQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5TQUZBUkkpCiAgIEBFeHBlcmltZW50YWwoKQogICAvLyBQYXJ0IG9mIGNvcHkvcGFzdGUKZGlmZiAtLWdpdCBhL3Nkay9saWIvaW8vaHR0cF9pbXBsLmRhcnQgYi9zZGsvbGliL2lvL2h0dHBfaW1wbC5kYXJ0CmluZGV4IDdiODBkNmEuLjk3MTE4NmQgMTAwNjQ0Ci0tLSBhL3Nkay9saWIvaW8vaHR0cF9pbXBsLmRhcnQKKysrIGIvc2RrL2xpYi9pby9odHRwX2ltcGwuZGFydApAQCAtMTI4MCw3ICsxMjgwLDkgQEAKICAgICAgICAgICBfc3Vic2NyaXB0aW9uLnBhdXNlKCk7CiAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoZSByZXNwb25zZSBpcyBub3QgaGVyZSwgdW50aWwgd2UgaGF2ZSBzZW5kIHRoZSByZXF1ZXN0LgogICAgICAgICAgIGlmIChfbmV4dFJlc3BvbnNlQ29tcGxldGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBIdHRwRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHJlc3BvbnNlLiIsIHVyaTogX2N1cnJlbnRVcmkpOworICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgcmVzcG9uc2UgKHVuc29saWNpdGVkIHJlc3BvbnNlIHdpdGhvdXQgcmVxdWVzdCkuIiwKKyAgICAgICAgICAgICAgICB1cmk6IF9jdXJyZW50VXJpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgX25leHRSZXNwb25zZUNvbXBsZXRlci5jb21wbGV0ZShpbmNvbWluZyk7CiAgICAgICAgICAgX25leHRSZXNwb25zZUNvbXBsZXRlciA9IG51bGw7CmRpZmYgLS1naXQgYS9zZGsvbGliL3R5cGVkX2RhdGEvZGFydDJqcy9uYXRpdmVfdHlwZWRfZGF0YV9kYXJ0MmpzLmRhcnQgYi9zZGsvbGliL3R5cGVkX2RhdGEvZGFydDJqcy9uYXRpdmVfdHlwZWRfZGF0YV9kYXJ0MmpzLmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3Mzg3NTQuLjAwMDAwMDAKLS0tIGEvc2RrL2xpYi90eXBlZF9kYXRhL2RhcnQyanMvbmF0aXZlX3R5cGVkX2RhdGFfZGFydDJqcy5kYXJ0CisrKyAvZGV2L251bGwKQEAgLTEsOTc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi0vLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQotLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLyoqCi0gKiBTcGVjaWFsaXplZCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywKLSAqIHdpdGggU0lNRCBzdXBwb3J0IGFuZCBlZmZpY2llbnQgbGlzdHMuCi0gKi8KLWxpYnJhcnkgZGFydC50eXBlZF9kYXRhLmltcGxlbWVudGF0aW9uOwotCi1pbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbic7Ci1pbXBvcnQgJ2RhcnQ6X2ludGVybmFsJzsKLWltcG9ydCAnZGFydDpfaW50ZXJjZXB0b3JzJyBzaG93IEpTSW5kZXhhYmxlLCBKU1VJbnQzMiwgSlNVSW50MzE7Ci1pbXBvcnQgJ2RhcnQ6X2pzX2hlbHBlcicKLSAgICBzaG93IENyZWF0ZXMsIEphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yLCBKU05hbWUsIE51bGwsIFJldHVybnM7Ci1pbXBvcnQgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJyBzaG93IEpTOwotaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIE1hdGg7Ci0KLWltcG9ydCAnZGFydDp0eXBlZF9kYXRhJzsKLQotLyoqCi0gKiBEZXNjcmliZXMgZW5kaWFubmVzcyB0byBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCi0gKi8KLWNsYXNzIEVuZGlhbm5lc3MgewotICBjb25zdCBFbmRpYW5uZXNzLl8odGhpcy5fbGl0dGxlRW5kaWFuKTsKLQotICBzdGF0aWMgY29uc3QgRW5kaWFubmVzcyBCSUdfRU5ESUFOID0gY29uc3QgRW5kaWFubmVzcy5fKGZhbHNlKTsKLSAgc3RhdGljIGNvbnN0IEVuZGlhbm5lc3MgTElUVExFX0VORElBTiA9IGNvbnN0IEVuZGlhbm5lc3MuXyh0cnVlKTsKLSAgc3RhdGljIGZpbmFsIEVuZGlhbm5lc3MgSE9TVF9FTkRJQU4gPQotICAgIChuZXcgQnl0ZURhdGEudmlldyhuZXcgSW50MTZMaXN0LmZyb21MaXN0KFsxXSkuYnVmZmVyKSkuZ2V0SW50OCgwKSA9PSAxCi0gICAgICA/IExJVFRMRV9FTkRJQU4KLSAgICAgIDogQklHX0VORElBTjsKLQotICBmaW5hbCBib29sIF9saXR0bGVFbmRpYW47Ci19Ci0KLQotY2xhc3MgTmF0aXZlQnl0ZUJ1ZmZlciBpbXBsZW1lbnRzIEJ5dGVCdWZmZXIgbmF0aXZlICJBcnJheUJ1ZmZlciIgewotICBASlNOYW1lKCdieXRlTGVuZ3RoJykKLSAgZmluYWwgaW50IGxlbmd0aEluQnl0ZXM7Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gQnl0ZUJ1ZmZlcjsKLQotICBVaW50OExpc3QgYXNVaW50OExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKLSAgICByZXR1cm4gbmV3IE5hdGl2ZVVpbnQ4TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLSAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewotICAgIHJldHVybiBuZXcgTmF0aXZlSW50OExpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0gIFVpbnQ4Q2xhbXBlZExpc3QgYXNVaW50OENsYW1wZWRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgcmV0dXJuIG5ldyBOYXRpdmVVaW50OENsYW1wZWRMaXN0LnZpZXcodGhpcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgfQotICBVaW50MTZMaXN0IGFzVWludDE2TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewotICAgIHJldHVybiBuZXcgTmF0aXZlVWludDE2TGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLSAgSW50MTZMaXN0IGFzSW50MTZMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgcmV0dXJuIG5ldyBOYXRpdmVJbnQxNkxpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0gIFVpbnQzMkxpc3QgYXNVaW50MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgcmV0dXJuIG5ldyBOYXRpdmVVaW50MzJMaXN0LnZpZXcodGhpcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgfQotICBJbnQzMkxpc3QgYXNJbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKLSAgICByZXR1cm4gbmV3IE5hdGl2ZUludDMyTGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLSAgVWludDY0TGlzdCBhc1VpbnQ2NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVWludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLSAgSW50NjRMaXN0IGFzSW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLSAgSW50MzJ4NExpc3QgYXNJbnQzMng0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewotICAgIHRocm93IG5ldyBVbmltcGxlbWVudGVkRXJyb3IoKTsKLSAgfQotICBGbG9hdDMyTGlzdCBhc0Zsb2F0MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgcmV0dXJuIG5ldyBOYXRpdmVGbG9hdDMyTGlzdC52aWV3KHRoaXMsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLSAgRmxvYXQ2NExpc3QgYXNGbG9hdDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewotICAgIHJldHVybiBuZXcgTmF0aXZlRmxvYXQ2NExpc3Qudmlldyh0aGlzLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0gIEZsb2F0MzJ4NExpc3QgYXNGbG9hdDMyeDRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwotICB9Ci0gIEZsb2F0NjR4Mkxpc3QgYXNGbG9hdDY0eDJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgdGhyb3cgbmV3IFVuaW1wbGVtZW50ZWRFcnJvcigpOwotICB9Ci0gIEJ5dGVEYXRhIGFzQnl0ZURhdGEoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pIHsKLSAgICByZXR1cm4gbmV3IE5hdGl2ZUJ5dGVEYXRhLnZpZXcodGhpcywgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgfQotfQotCi1jbGFzcyBOYXRpdmVUeXBlZERhdGEgaW1wbGVtZW50cyBUeXBlZERhdGEgbmF0aXZlICJBcnJheUJ1ZmZlclZpZXciIHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJ5dGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KLSAgICovCi0gIEBDcmVhdGVzKCdOYXRpdmVCeXRlQnVmZmVyJykKLSAgLy8gTWF5IGJlIE51bGwgZm9yIElFJ3MgQ2FudmFzUGl4ZWxBcnJheS4KLSAgQFJldHVybnMoJ05hdGl2ZUJ5dGVCdWZmZXJ8TnVsbCcpCi0gIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyB2aWV3LCBpbiBieXRlcy4KLSAgICovCi0gIEBKU05hbWUoJ2J5dGVMZW5ndGgnKQotICBmaW5hbCBpbnQgbGVuZ3RoSW5CeXRlczsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgb2Zmc2V0IGluIGJ5dGVzIGludG8gdGhlIHVuZGVybHlpbmcgYnl0ZSBidWZmZXIgb2YgdGhpcyB2aWV3LgotICAgKi8KLSAgQEpTTmFtZSgnYnl0ZU9mZnNldCcpCi0gIGZpbmFsIGludCBvZmZzZXRJbkJ5dGVzOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggZWxlbWVudCBpbiB0aGlzCi0gICAqIGxpc3QuCi0gICAqLwotICBASlNOYW1lKCdCWVRFU19QRVJfRUxFTUVOVCcpCi0gIGZpbmFsIGludCBlbGVtZW50U2l6ZUluQnl0ZXM7Ci0KLSAgdm9pZCBfaW52YWxpZEluZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7Ci0gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgbGlzdCBpbmRleCAkaW5kZXgnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIF9jaGVja0luZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgewotICAgIGlmIChKUygnYm9vbCcsICcoIyA+Pj4gMCkgIT09ICMnLCBpbmRleCwgaW5kZXgpIHx8Ci0gICAgICAgIEpTKCdpbnQnLCAnIycsIGluZGV4KSA+PSBsZW5ndGgpIHsgIC8vICdpbnQnIGd1YXJhbnRlZWQgYnkgYWJvdmUgdGVzdC4KLSAgICAgIF9pbnZhbGlkSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgfQotICB9Ci0KLSAgaW50IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgbGVuZ3RoKSB7Ci0gICAgLy8gRm9yIGBzdWJsaXN0YCB0aGUgW3N0YXJ0XSBhbmQgW2VuZF0gaW5kaWNlcyBhcmUgYWxsb3dlZCB0byBiZSBlcXVhbCB0bwotICAgIC8vIFtsZW5ndGhdLiBIb3dldmVyLCBbX2NoZWNrSW5kZXhdIG9ubHkgYWxsb3dzIGluZGljZXMgaW4gdGhlIHJhbmdlCi0gICAgLy8gMCAuLiBsZW5ndGggLSAxLiBXZSB0aGVyZWZvcmUgaW5jcmVtZW50IHRoZSBbbGVuZ3RoXSBhcmd1bWVudCBieSBvbmUKLSAgICAvLyBmb3IgdGhlIFtfY2hlY2tJbmRleF0gY2hlY2tzLgotICAgIF9jaGVja0luZGV4KHN0YXJ0LCBsZW5ndGggKyAxKTsKLSAgICBpZiAoZW5kID09IG51bGwpIHJldHVybiBsZW5ndGg7Ci0gICAgX2NoZWNrSW5kZXgoZW5kLCBsZW5ndGggKyAxKTsKLSAgICBpZiAoc3RhcnQgPiBlbmQpIHRocm93IG5ldyBSYW5nZUVycm9yLnJhbmdlKHN0YXJ0LCAwLCBlbmQpOwotICAgIHJldHVybiBlbmQ7Ci0gIH0KLX0KLQotCi0vLyBWYWxpZGF0ZXMgdGhlIHVubmFtZWQgY29uc3RydWN0b3IgbGVuZ3RoIGFyZ3VtZW50LiAgQ2hlY2tpbmcgaXMgbmVjZXNzYXJ5Ci0vLyBiZWNhdXNlIHBhc3NpbmcgdW52YWxpZGF0ZWQgdmFsdWVzIHRvIHRoZSBuYXRpdmUgY29uc3RydWN0b3JzIGNhbiBjYXVzZQotLy8gY29udmVyc2lvbnMgb3IgY3JlYXRlIHZpZXdzLgotaW50IF9jaGVja0xlbmd0aChsZW5ndGgpIHsKLSAgaWYgKGxlbmd0aCBpcyEgaW50KSB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCBsZW5ndGggJGxlbmd0aCcpOwotICByZXR1cm4gbGVuZ3RoOwotfQotCi0vLyBWYWxpZGF0ZXMgYC52aWV3YCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuICBDaGVja2luZyBpcyBuZWNlc3NhcnkgYmVjYXVzZQotLy8gcGFzc2luZyB1bnZhbGlkYXRlZCB2YWx1ZXMgdG8gdGhlIG5hdGl2ZSBjb25zdHJ1Y3RvcnMgY2FuIGNhdXNlIGNvbnZlcnNpb25zCi0vLyAoZS5nLiBTdHJpbmcgYXJndW1lbnRzKSBvciBjcmVhdGUgdHlwZWQgZGF0YSBvYmplY3RzIHRoYXQgYXJlIG5vdCBhY3R1YWxseQotLy8gdmlld3Mgb2YgdGhlIGlucHV0Lgotdm9pZCBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKSB7Ci0gIGlmIChidWZmZXIgaXMhIE5hdGl2ZUJ5dGVCdWZmZXIpIHsKLSAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB2aWV3IGJ1ZmZlcicpOwotICB9Ci0gIGlmIChvZmZzZXRJbkJ5dGVzIGlzISBpbnQpIHsKLSAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB2aWV3IG9mZnNldEluQnl0ZXMgJG9mZnNldEluQnl0ZXMnKTsKLSAgfQotICBpZiAobGVuZ3RoICE9IG51bGwgJiYgbGVuZ3RoIGlzISBpbnQpIHsKLSAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcignSW52YWxpZCB2aWV3IGxlbmd0aCAkbGVuZ3RoJyk7Ci0gIH0KLX0KLQotLy8gRW5zdXJlcyB0aGF0IFtsaXN0XSBpcyBhIEphdmFTY3JpcHQgQXJyYXkgb3IgYSB0eXBlZCBhcnJheS4gIElmIG5lY2Vzc2FyeSwKLS8vIHJldHVybnMgYSBjb3B5IG9mIHRoZSBsaXN0LgotTGlzdCBfZW5zdXJlTmF0aXZlTGlzdChMaXN0IGxpc3QpIHsKLSAgaWYgKGxpc3QgaXMgSlNJbmRleGFibGUpIHJldHVybiBsaXN0OwotICBMaXN0IHJlc3VsdCA9IG5ldyBMaXN0KGxpc3QubGVuZ3RoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgcmVzdWx0W2ldID0gbGlzdFtpXTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLWNsYXNzIE5hdGl2ZUJ5dGVEYXRhIGV4dGVuZHMgTmF0aXZlVHlwZWREYXRhIGltcGxlbWVudHMgQnl0ZURhdGEKLSAgICBuYXRpdmUgIkRhdGFWaWV3IiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0J5dGVEYXRhXSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKLSAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgotICAgKi8KLSAgZmFjdG9yeSBOYXRpdmVCeXRlRGF0YShpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gW0J5dGVEYXRhXSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlIHNwZWNpZmllZAotICAgKiBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW0J5dGVEYXRhXSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqLwotICBmYWN0b3J5IE5hdGl2ZUJ5dGVEYXRhLnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgewotICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAotICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKLSAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLQotICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBCeXRlRGF0YTsKLQotICBpbnQgZ2V0IGVsZW1lbnRTaXplSW5CeXRlcyA9PiAxOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGZvdXIgYnl0ZXMgYXQKLSAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIElFRUUgNzU0Ci0gICAqIHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50IGZvcm1hdCAoYmluYXJ5MzIpLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIG51bSBnZXRGbG9hdDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KLSAgICAgIF9nZXRGbG9hdDMyKGJ5dGVPZmZzZXQsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdnZXRGbG9hdDMyJykKLSAgQFJldHVybnMoJ251bScpCi0gIG51bSBfZ2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIGF0Ci0gICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAotICAgKiBkb3VibGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGJpbmFyeTY0KS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBudW0gZ2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+Ci0gICAgICBfZ2V0RmxvYXQ2NChieXRlT2Zmc2V0LCBlbmRpYW4uX2xpdHRsZUVuZGlhbik7Ci0KLSAgQEpTTmFtZSgnZ2V0RmxvYXQ2NCcpCi0gIEBSZXR1cm5zKCdudW0nKQotICBudW0gX2dldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSB0d28gYnl0ZXMgYXQKLSAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5Ci0gICAqIGZvcm0uCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDI8c3VwPjE1PC9zdXA+IGFuZCAyPHN1cD4xNTwvc3VwPiAtIDEsCi0gICAqIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBpbnQgZ2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgotICAgICAgX2dldEludDE2KGJ5dGVPZmZzZXQsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdnZXRJbnQxNicpCi0gIEBSZXR1cm5zKCdpbnQnKQotICBpbnQgX2dldEludDE2KGludCBieXRlT2Zmc2V0LCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBhdAotICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMjxzdXA+MzE8L3N1cD4gYW5kIDI8c3VwPjMxPC9zdXA+IC0gMSwKLSAgICogaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRJbnQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+Ci0gICAgICBfZ2V0SW50MzIoYnl0ZU9mZnNldCwgZW5kaWFuLl9saXR0bGVFbmRpYW4pOwotCi0gIEBKU05hbWUoJ2dldEludDMyJykKLSAgQFJldHVybnMoJ2ludCcpCi0gIGludCBfZ2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBlaWdodCBieXRlcyBhdAotICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMjxzdXA+NjM8L3N1cD4gYW5kIDI8c3VwPjYzPC9zdXA+IC0gMSwKLSAgICogaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignSW50NjQgYWNjZXNzb3Igbm90IHN1cHBvcnRlZCBieSBkYXJ0MmpzLicpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIChwb3NzaWJseSBuZWdhdGl2ZSkgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgYnl0ZSBhdCB0aGUKLSAgICogc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKLSAgICogcmVwcmVzZW50YXRpb24uIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIC0xMjggYW5kIDEyNywgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBpbnQgZ2V0SW50OChpbnQgYnl0ZU9mZnNldCkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSB0d28gYnl0ZXMgc3RhcnRpbmcKLSAgICogYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeQotICAgKiBmb3JtLgotICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAgMjxzdXA+MTY8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDJgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgaW50IGdldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+Ci0gICAgICBfZ2V0VWludDE2KGJ5dGVPZmZzZXQsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdnZXRVaW50MTYnKQotICBAUmV0dXJucygnSlNVSW50MzEnKQotICBpbnQgX2dldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nCi0gICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjMyPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgotICAgICAgX2dldFVpbnQzMihieXRlT2Zmc2V0LCBlbmRpYW4uX2xpdHRsZUVuZGlhbik7Ci0KLSAgQEpTTmFtZSgnZ2V0VWludDMyJykKLSAgQFJldHVybnMoJ0pTVUludDMyJykKLSAgaW50IF9nZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcKLSAgICogYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHVuc2lnbmVkIGJpbmFyeQotICAgKiBmb3JtLgotICAgKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAwIGFuZCAgMjxzdXA+NjQ8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgaW50IGdldFVpbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVWludDY0IGFjY2Vzc29yIG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4nKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQKLSAgICogW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkgZm9ybS4gVGhlCi0gICAqIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgMjU1LCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRVaW50OChpbnQgYnl0ZU9mZnNldCkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSBJRUVFIDc1NCBzaW5nbGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludAotICAgKiAoYmluYXJ5MzIpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KLSAgICoKLSAgICogKipOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIGxvc2UgcHJlY2lzaW9uLioqIFRoZSBpbnB1dCBbdmFsdWVdIGlzCi0gICAqIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byAzMi1iaXQKLSAgICogZmxvYXRpbmcgcG9pbnQgdmFsdWUgYnkgSUVFRSA3NTQgcm91bmRpbmcgcnVsZXMgYmVmb3JlIGl0IGlzIHN0b3JlZC4KLSAgICogSWYgW3ZhbHVlXSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGJpbmFyeTMyLCBpdCB3aWxsIGJlCi0gICAqIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdCBiaW5hcnkzMiB2YWx1ZS4gIElmIHR3byBiaW5hcnkzMiB2YWx1ZXMgYXJlCi0gICAqIGVxdWFsbHkgY2xvc2UsIHRoZSBvbmUgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHplcm8gd2lsbCBiZSB1c2VkLgotICAgKiBOb3RlIHRoYXQgZmluaXRlIChidXQgbGFyZ2UpIHZhbHVlcyBjYW4gYmUgY29udmVydGVkIHRvIGluZmluaXR5LCBhbmQKLSAgICogc21hbGwgbm9uLXplcm8gdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gemVyby4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIG51bSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgotICAgICAgX3NldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdzZXRGbG9hdDMyJykKLSAgdm9pZCBfc2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgbnVtIHZhbHVlLCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSBJRUVFIDc1NCBkb3VibGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludAotICAgKiAoYmluYXJ5NjQpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldEZsb2F0NjQoaW50IGJ5dGVPZmZzZXQsIG51bSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSA9PgotICAgICAgX3NldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdzZXRGbG9hdDY0JykKLSAgdm9pZCBfc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgbnVtIHZhbHVlLCBbYm9vbCBsaXR0bGVFbmRpYW5dKSBuYXRpdmU7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHR3byBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCi0gICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAotICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgbGllCi0gICAqIGJldHdlZW4gMjxzdXA+MTU8L3N1cD4gYW5kIDI8c3VwPjE1PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KLSAgICAgIF9zZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSwgZW5kaWFuLl9saXR0bGVFbmRpYW4pOwotCi0gIEBKU05hbWUoJ3NldEludDE2JykKLSAgdm9pZCBfc2V0SW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0gICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgbGllCi0gICAqIGJldHdlZW4gMjxzdXA+MzE8L3N1cD4gYW5kIDI8c3VwPjMxPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KLSAgICAgIF9zZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSwgZW5kaWFuLl9saXR0bGVFbmRpYW4pOwotCi0gIEBKU05hbWUoJ3NldEludDMyJykKLSAgdm9pZCBfc2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBlaWdodCBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzCi0gICAqIG9iamVjdCB0byB0aGUgdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZAotICAgKiBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdCBpbiBlaWdodCBieXRlcy4gSW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBsaWUKLSAgICogYmV0d2VlbiAyPHN1cD42Mzwvc3VwPiBhbmQgMjxzdXA+NjM8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLAotICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoJ0ludDY0IGFjY2Vzc29yIG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4nKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQotICAgKiB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoCi0gICAqIG11c3QgZml0IGluIGEgc2luZ2xlIGJ5dGUuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbgotICAgKiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpIG5hdGl2ZTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0Ci0gICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAotICAgKiB3aGljaCBtdXN0IGZpdCBpbiB0d28gYnl0ZXMuIGluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbgotICAgKiAwIGFuZCAyPHN1cD4xNjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldFVpbnQxNihpbnQgYnl0ZU9mZnNldCwgaW50IHZhbHVlLAotICAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSkgPT4KLSAgICAgIF9zZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUsIGVuZGlhbi5fbGl0dGxlRW5kaWFuKTsKLQotICBASlNOYW1lKCdzZXRVaW50MTYnKQotICB2b2lkIF9zZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwgW2Jvb2wgbGl0dGxlRW5kaWFuXSkgbmF0aXZlOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0Ci0gICAqIHRvIHRoZSB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLAotICAgKiB3aGljaCBtdXN0IGZpdCBpbiBmb3VyIGJ5dGVzLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KLSAgICogMCBhbmQgMjxzdXA+MzI8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDRgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRVaW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pID0+Ci0gICAgICBfc2V0VWludDMyKGJ5dGVPZmZzZXQsIHZhbHVlLCBlbmRpYW4uX2xpdHRsZUVuZGlhbik7Ci0KLSAgQEpTTmFtZSgnc2V0VWludDMyJykKLSAgdm9pZCBfc2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsIFtib29sIGxpdHRsZUVuZGlhbl0pIG5hdGl2ZTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKLSAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCi0gICAqIHdoaWNoIG11c3QgZml0IGluIGVpZ2h0IGJ5dGVzLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KLSAgICogMCBhbmQgMjxzdXA+NjQ8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcignVWludDY0IGFjY2Vzc29yIG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4nKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQotICAgKiB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdAotICAgKiBpbiBhIHNpbmdsZSBieXRlLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LAotICAgKiBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLAotICAgKiBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0VWludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSkgbmF0aXZlOwotCi0gIHN0YXRpYyBOYXRpdmVCeXRlRGF0YSBfY3JlYXRlMShhcmcpID0+Ci0gICAgICBKUygnTmF0aXZlQnl0ZURhdGEnLCAnbmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigjKSknLCBhcmcpOwotCi0gIHN0YXRpYyBOYXRpdmVCeXRlRGF0YSBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZUJ5dGVEYXRhJywgJ25ldyBEYXRhVmlldygjLCAjKScsIGFyZzEsIGFyZzIpOwotCi0gIHN0YXRpYyBOYXRpdmVCeXRlRGF0YSBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgotICAgICAgSlMoJ05hdGl2ZUJ5dGVEYXRhJywgJ25ldyBEYXRhVmlldygjLCAjLCAjKScsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi0KLWFic3RyYWN0IGNsYXNzIE5hdGl2ZVR5cGVkQXJyYXkgZXh0ZW5kcyBOYXRpdmVUeXBlZERhdGEKLSAgICBpbXBsZW1lbnRzIEphdmFTY3JpcHRJbmRleGluZ0JlaGF2aW9yIHsKLSAgaW50IGdldCBsZW5ndGggPT4gSlMoJ0pTVUludDMyJywgJyMubGVuZ3RoJywgdGhpcyk7Ci0KLSAgYm9vbCBfc2V0UmFuZ2VGYXN0KGludCBzdGFydCwgaW50IGVuZCwKLSAgICAgIE5hdGl2ZVR5cGVkQXJyYXkgc291cmNlLCBpbnQgc2tpcENvdW50KSB7Ci0gICAgaW50IHRhcmdldExlbmd0aCA9IHRoaXMubGVuZ3RoOwotICAgIF9jaGVja0luZGV4KHN0YXJ0LCB0YXJnZXRMZW5ndGggKyAxKTsKLSAgICBfY2hlY2tJbmRleChlbmQsIHRhcmdldExlbmd0aCArIDEpOwotICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGVuZCk7Ci0gICAgaW50IGNvdW50ID0gZW5kIC0gc3RhcnQ7Ci0KLSAgICBpZiAoc2tpcENvdW50IDwgMCkgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3Ioc2tpcENvdW50KTsKLQotICAgIGludCBzb3VyY2VMZW5ndGggPSBzb3VyY2UubGVuZ3RoOwotICAgIGlmIChzb3VyY2VMZW5ndGggLSBza2lwQ291bnQgPCBjb3VudCkgIHsKLSAgICAgIHRocm93IG5ldyBTdGF0ZUVycm9yKCdOb3QgZW5vdWdoIGVsZW1lbnRzJyk7Ci0gICAgfQotCi0gICAgaWYgKHNraXBDb3VudCAhPSAwIHx8IHNvdXJjZUxlbmd0aCAhPSBjb3VudCkgewotICAgICAgLy8gQ3JlYXRlIGEgdmlldyBvZiB0aGUgZXhhY3Qgc3VicmFuZ2UgdGhhdCBpcyBjb3BpZWQgZnJvbSB0aGUgc291cmNlLgotICAgICAgc291cmNlID0gSlMoJycsICcjLnN1YmFycmF5KCMsICMpJywKLSAgICAgICAgICBzb3VyY2UsIHNraXBDb3VudCwgc2tpcENvdW50ICsgY291bnQpOwotICAgIH0KLSAgICBKUygndm9pZCcsICcjLnNldCgjLCAjKScsIHRoaXMsIHNvdXJjZSwgc3RhcnQpOwotICB9Ci19Ci0KLWFic3RyYWN0IGNsYXNzIE5hdGl2ZVR5cGVkQXJyYXlPZkRvdWJsZQotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheQotICAgICAgICB3aXRoIExpc3RNaXhpbjxkb3VibGU+LCBGaXhlZExlbmd0aExpc3RNaXhpbjxkb3VibGU+Ci0gICAgaW1wbGVtZW50cyBMaXN0PGRvdWJsZT4gewotCi0gIG51bSBvcGVyYXRvcltdKGludCBpbmRleCkgewotICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIHJldHVybiBKUygnbnVtJywgJyNbI10nLCB0aGlzLCBpbmRleCk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yW109KGludCBpbmRleCwgbnVtIHZhbHVlKSB7Ci0gICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgSlMoJ3ZvaWQnLCAnI1sjXSA9ICMnLCB0aGlzLCBpbmRleCwgdmFsdWUpOwotICB9Ci0KLSAgdm9pZCBzZXRSYW5nZShpbnQgc3RhcnQsIGludCBlbmQsIEl0ZXJhYmxlPGRvdWJsZT4gaXRlcmFibGUsCi0gICAgICAgICAgICAgICAgW2ludCBza2lwQ291bnQgPSAwXSkgewotICAgIGlmIChpdGVyYWJsZSBpcyBOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUpIHsKLSAgICAgIF9zZXRSYW5nZUZhc3Qoc3RhcnQsIGVuZCwgaXRlcmFibGUsIHNraXBDb3VudCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN1cGVyLnNldFJhbmdlKHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwotICB9Ci19Ci0KLWFic3RyYWN0IGNsYXNzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheQotICAgICAgICB3aXRoIExpc3RNaXhpbjxpbnQ+LCBGaXhlZExlbmd0aExpc3RNaXhpbjxpbnQ+Ci0gICAgaW1wbGVtZW50cyBMaXN0PGludD4gewotCi0gIC8vIG9wZXJhdG9yW10oKSBpcyBub3QgaGVyZSBzaW5jZSBkaWZmZXJlbnQgdmVyc2lvbnMgaGF2ZSBkaWZmZXJlbnQgcmV0dXJuCi0gIC8vIHR5cGVzCi0KLSAgdm9pZCBvcGVyYXRvcltdPShpbnQgaW5kZXgsIGludCB2YWx1ZSkgewotICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIEpTKCd2b2lkJywgJyNbI10gPSAjJywgdGhpcywgaW5kZXgsIHZhbHVlKTsKLSAgfQotCi0gIHZvaWQgc2V0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kLCBJdGVyYWJsZTxpbnQ+IGl0ZXJhYmxlLAotICAgICAgICAgICAgICAgIFtpbnQgc2tpcENvdW50ID0gMF0pIHsKLSAgICBpZiAoaXRlcmFibGUgaXMgTmF0aXZlVHlwZWRBcnJheU9mSW50KSB7Ci0gICAgICBfc2V0UmFuZ2VGYXN0KHN0YXJ0LCBlbmQsIGl0ZXJhYmxlLCBza2lwQ291bnQpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzdXBlci5zZXRSYW5nZShzdGFydCwgZW5kLCBpdGVyYWJsZSwgc2tpcENvdW50KTsKLSAgfQotfQotCi0KLWNsYXNzIE5hdGl2ZUZsb2F0MzJMaXN0Ci0gICAgZXh0ZW5kcyBOYXRpdmVUeXBlZEFycmF5T2ZEb3VibGUKLSAgICBpbXBsZW1lbnRzIEZsb2F0MzJMaXN0Ci0gICAgbmF0aXZlICJGbG9hdDMyQXJyYXkiIHsKLQotICBmYWN0b3J5IE5hdGl2ZUZsb2F0MzJMaXN0KGludCBsZW5ndGgpID0+IF9jcmVhdGUxKF9jaGVja0xlbmd0aChsZW5ndGgpKTsKLQotICBmYWN0b3J5IE5hdGl2ZUZsb2F0MzJMaXN0LmZyb21MaXN0KExpc3Q8ZG91YmxlPiBlbGVtZW50cykgPT4KLSAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVGbG9hdDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKLSAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKLSAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCi0gICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gRmxvYXQzMkxpc3Q7Ci0KLSAgTGlzdDxkb3VibGU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKLSAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7Ci0gICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVGbG9hdDMyTGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7Ci0gICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7Ci0gIH0KLQotICBzdGF0aWMgTmF0aXZlRmxvYXQzMkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZUZsb2F0MzJMaXN0JywgJ25ldyBGbG9hdDMyQXJyYXkoIyknLCBhcmcpOwotCi0gIHN0YXRpYyBOYXRpdmVGbG9hdDMyTGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZUZsb2F0MzJMaXN0JywgJ25ldyBGbG9hdDMyQXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKLQotICBzdGF0aWMgTmF0aXZlRmxvYXQzMkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVGbG9hdDMyTGlzdCcsICduZXcgRmxvYXQzMkFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLQotY2xhc3MgTmF0aXZlRmxvYXQ2NExpc3QKLSAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkRvdWJsZQotICAgIGltcGxlbWVudHMgRmxvYXQ2NExpc3QKLSAgICBuYXRpdmUgIkZsb2F0NjRBcnJheSIgewotCi0gIGZhY3RvcnkgTmF0aXZlRmxvYXQ2NExpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOwotCi0gIGZhY3RvcnkgTmF0aXZlRmxvYXQ2NExpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSA9PgotICAgICAgX2NyZWF0ZTEoX2Vuc3VyZU5hdGl2ZUxpc3QoZWxlbWVudHMpKTsKLQotICBmYWN0b3J5IE5hdGl2ZUZsb2F0NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKLSAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKLSAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCi0gICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gRmxvYXQ2NExpc3Q7Ci0KLSAgTGlzdDxkb3VibGU+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKLSAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7Ci0gICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVGbG9hdDY0TGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7Ci0gICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7Ci0gIH0KLQotICBzdGF0aWMgTmF0aXZlRmxvYXQ2NExpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZUZsb2F0NjRMaXN0JywgJ25ldyBGbG9hdDY0QXJyYXkoIyknLCBhcmcpOwotCi0gIHN0YXRpYyBOYXRpdmVGbG9hdDY0TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZUZsb2F0NjRMaXN0JywgJ25ldyBGbG9hdDY0QXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKLQotICBzdGF0aWMgTmF0aXZlRmxvYXQ2NExpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVGbG9hdDY0TGlzdCcsICduZXcgRmxvYXQ2NEFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLQotY2xhc3MgTmF0aXZlSW50MTZMaXN0Ci0gICAgZXh0ZW5kcyBOYXRpdmVUeXBlZEFycmF5T2ZJbnQKLSAgICBpbXBsZW1lbnRzIEludDE2TGlzdAotICAgIG5hdGl2ZSAiSW50MTZBcnJheSIgewotCi0gIGZhY3RvcnkgTmF0aXZlSW50MTZMaXN0KGludCBsZW5ndGgpID0+IF9jcmVhdGUxKF9jaGVja0xlbmd0aChsZW5ndGgpKTsKLQotICBmYWN0b3J5IE5hdGl2ZUludDE2TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+Ci0gICAgICBfY3JlYXRlMShfZW5zdXJlTmF0aXZlTGlzdChlbGVtZW50cykpOwotCi0gIGZhY3RvcnkgTmF0aXZlSW50MTZMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSB7Ci0gICAgX2NoZWNrVmlld0FyZ3VtZW50cyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIGxlbmd0aCA9PSBudWxsCi0gICAgICAgID8gX2NyZWF0ZTIoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzKQotICAgICAgICA6IF9jcmVhdGUzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgfQotCi0gIFR5cGUgZ2V0IHJ1bnRpbWVUeXBlID0+IEludDE2TGlzdDsKLQotICBpbnQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gSlMoJ2ludCcsICcjWyNdJywgdGhpcywgaW5kZXgpOwotICB9Ci0KLSAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKLSAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7Ci0gICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVJbnQxNkxpc3QnLCAnIy5zdWJhcnJheSgjLCAjKScsIHRoaXMsIHN0YXJ0LCBlbmQpOwotICAgIHJldHVybiBfY3JlYXRlMShzb3VyY2UpOwotICB9Ci0KLSAgc3RhdGljIE5hdGl2ZUludDE2TGlzdCBfY3JlYXRlMShhcmcpID0+Ci0gICAgICBKUygnTmF0aXZlSW50MTZMaXN0JywgJ25ldyBJbnQxNkFycmF5KCMpJywgYXJnKTsKLQotICBzdGF0aWMgTmF0aXZlSW50MTZMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+Ci0gICAgICBKUygnTmF0aXZlSW50MTZMaXN0JywgJ25ldyBJbnQxNkFycmF5KCMsICMpJywgYXJnMSwgYXJnMik7Ci0KLSAgc3RhdGljIE5hdGl2ZUludDE2TGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgotICAgICAgSlMoJ05hdGl2ZUludDE2TGlzdCcsICduZXcgSW50MTZBcnJheSgjLCAjLCAjKScsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi0KLWNsYXNzIE5hdGl2ZUludDMyTGlzdAotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50Ci0gICAgaW1wbGVtZW50cyBJbnQzMkxpc3QKLSAgICBuYXRpdmUgIkludDMyQXJyYXkiIHsKLQotICBmYWN0b3J5IE5hdGl2ZUludDMyTGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVJbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgotICAgICAgX2NyZWF0ZTEoX2Vuc3VyZU5hdGl2ZUxpc3QoZWxlbWVudHMpKTsKLQotICBmYWN0b3J5IE5hdGl2ZUludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgewotICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAotICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKLSAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLQotICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBJbnQzMkxpc3Q7Ci0KLSAgaW50IG9wZXJhdG9yW10oaW50IGluZGV4KSB7Ci0gICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIEpTKCdpbnQnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKLSAgfQotCi0gIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7Ci0gICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOwotICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlSW50MzJMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKLSAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKLSAgfQotCi0gIHN0YXRpYyBOYXRpdmVJbnQzMkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZUludDMyTGlzdCcsICduZXcgSW50MzJBcnJheSgjKScsIGFyZyk7Ci0KLSAgc3RhdGljIE5hdGl2ZUludDMyTGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZUludDMyTGlzdCcsICduZXcgSW50MzJBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOwotCi0gIHN0YXRpYyBOYXRpdmVJbnQzMkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVJbnQzMkxpc3QnLCAnbmV3IEludDMyQXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KLQotCi1jbGFzcyBOYXRpdmVJbnQ4TGlzdAotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50Ci0gICAgaW1wbGVtZW50cyBJbnQ4TGlzdAotICAgIG5hdGl2ZSAiSW50OEFycmF5IiB7Ci0KLSAgZmFjdG9yeSBOYXRpdmVJbnQ4TGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVJbnQ4TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+Ci0gICAgICBfY3JlYXRlMShfZW5zdXJlTmF0aXZlTGlzdChlbGVtZW50cykpOwotCi0gIGZhY3RvcnkgTmF0aXZlSW50OExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgewotICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAotICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKLSAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLQotICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBJbnQ4TGlzdDsKLQotICBpbnQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gSlMoJ2ludCcsICcjWyNdJywgdGhpcywgaW5kZXgpOwotICB9Ci0KLSAgTGlzdDxpbnQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKLSAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7Ci0gICAgdmFyIHNvdXJjZSA9IEpTKCdOYXRpdmVJbnQ4TGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywgdGhpcywgc3RhcnQsIGVuZCk7Ci0gICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7Ci0gIH0KLQotICBzdGF0aWMgTmF0aXZlSW50OExpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZUludDhMaXN0JywgJ25ldyBJbnQ4QXJyYXkoIyknLCBhcmcpOwotCi0gIHN0YXRpYyBOYXRpdmVJbnQ4TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZUludDhMaXN0JywgJ25ldyBJbnQ4QXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKLQotICBzdGF0aWMgSW50OExpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVJbnQ4TGlzdCcsICduZXcgSW50OEFycmF5KCMsICMsICMpJywgYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLQotY2xhc3MgTmF0aXZlVWludDE2TGlzdAotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50Ci0gICAgaW1wbGVtZW50cyBVaW50MTZMaXN0Ci0gICAgbmF0aXZlICJVaW50MTZBcnJheSIgewotCi0gIGZhY3RvcnkgTmF0aXZlVWludDE2TGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVVaW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBsaXN0KSA9PgotICAgICAgX2NyZWF0ZTEoX2Vuc3VyZU5hdGl2ZUxpc3QobGlzdCkpOwotCi0gIGZhY3RvcnkgTmF0aXZlVWludDE2TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKLSAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKLSAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCi0gICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gVWludDE2TGlzdDsKLQotICBpbnQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gSlMoJ0pTVUludDMxJywgJyNbI10nLCB0aGlzLCBpbmRleCk7Ci0gIH0KLQotICBMaXN0PGludD4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewotICAgIGVuZCA9IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKLSAgICB2YXIgc291cmNlID0gSlMoJ05hdGl2ZVVpbnQxNkxpc3QnLCAnIy5zdWJhcnJheSgjLCAjKScsIHRoaXMsIHN0YXJ0LCBlbmQpOwotICAgIHJldHVybiBfY3JlYXRlMShzb3VyY2UpOwotICB9Ci0KLSAgc3RhdGljIE5hdGl2ZVVpbnQxNkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQxNkxpc3QnLCAnbmV3IFVpbnQxNkFycmF5KCMpJywgYXJnKTsKLQotICBzdGF0aWMgTmF0aXZlVWludDE2TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQxNkxpc3QnLCAnbmV3IFVpbnQxNkFycmF5KCMsICMpJywgYXJnMSwgYXJnMik7Ci0KLSAgc3RhdGljIE5hdGl2ZVVpbnQxNkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVVaW50MTZMaXN0JywgJ25ldyBVaW50MTZBcnJheSgjLCAjLCAjKScsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi0KLWNsYXNzIE5hdGl2ZVVpbnQzMkxpc3QKLSAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAotICAgIGltcGxlbWVudHMgVWludDMyTGlzdAotICAgIG5hdGl2ZSAiVWludDMyQXJyYXkiIHsKLQotICBmYWN0b3J5IE5hdGl2ZVVpbnQzMkxpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOwotCi0gIGZhY3RvcnkgTmF0aXZlVWludDMyTGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+Ci0gICAgICBfY3JlYXRlMShfZW5zdXJlTmF0aXZlTGlzdChlbGVtZW50cykpOwotCi0gIGZhY3RvcnkgTmF0aXZlVWludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKLSAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKLSAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCi0gICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gVWludDMyTGlzdDsKLQotICBpbnQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gSlMoJ0pTVUludDMyJywgJyNbI10nLCB0aGlzLCBpbmRleCk7Ci0gIH0KLQotICBMaXN0PGludD4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewotICAgIGVuZCA9IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKLSAgICB2YXIgc291cmNlID0gSlMoJ05hdGl2ZVVpbnQzMkxpc3QnLCAnIy5zdWJhcnJheSgjLCAjKScsIHRoaXMsIHN0YXJ0LCBlbmQpOwotICAgIHJldHVybiBfY3JlYXRlMShzb3VyY2UpOwotICB9Ci0KLSAgc3RhdGljIE5hdGl2ZVVpbnQzMkxpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQzMkxpc3QnLCAnbmV3IFVpbnQzMkFycmF5KCMpJywgYXJnKTsKLQotICBzdGF0aWMgTmF0aXZlVWludDMyTGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQzMkxpc3QnLCAnbmV3IFVpbnQzMkFycmF5KCMsICMpJywgYXJnMSwgYXJnMik7Ci0KLSAgc3RhdGljIE5hdGl2ZVVpbnQzMkxpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVVaW50MzJMaXN0JywgJ25ldyBVaW50MzJBcnJheSgjLCAjLCAjKScsIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi0KLWNsYXNzIE5hdGl2ZVVpbnQ4Q2xhbXBlZExpc3QKLSAgICBleHRlbmRzIE5hdGl2ZVR5cGVkQXJyYXlPZkludAotICAgIGltcGxlbWVudHMgVWludDhDbGFtcGVkTGlzdAotICAgIG5hdGl2ZSAiVWludDhDbGFtcGVkQXJyYXksQ2FudmFzUGl4ZWxBcnJheSIgewotCi0gIGZhY3RvcnkgTmF0aXZlVWludDhDbGFtcGVkTGlzdChpbnQgbGVuZ3RoKSA9PiBfY3JlYXRlMShfY2hlY2tMZW5ndGgobGVuZ3RoKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVVaW50OENsYW1wZWRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVVaW50OENsYW1wZWRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0SW5CeXRlcywgaW50IGxlbmd0aCkgewotICAgIF9jaGVja1ZpZXdBcmd1bWVudHMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICAgIHJldHVybiBsZW5ndGggPT0gbnVsbAotICAgICAgICA/IF9jcmVhdGUyKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcykKLSAgICAgICAgOiBfY3JlYXRlMyhidWZmZXIsIG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0gIH0KLQotICBUeXBlIGdldCBydW50aW1lVHlwZSA9PiBVaW50OENsYW1wZWRMaXN0OwotCi0gIGludCBnZXQgbGVuZ3RoID0+IEpTKCdKU1VJbnQzMicsICcjLmxlbmd0aCcsIHRoaXMpOwotCi0gIGludCBvcGVyYXRvcltdKGludCBpbmRleCkgewotICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIHJldHVybiBKUygnSlNVSW50MzEnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKLSAgfQotCi0gIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7Ci0gICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOwotICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICcjLnN1YmFycmF5KCMsICMpJywKLSAgICAgICAgdGhpcywgc3RhcnQsIGVuZCk7Ci0gICAgcmV0dXJuIF9jcmVhdGUxKHNvdXJjZSk7Ci0gIH0KLQotICBzdGF0aWMgTmF0aXZlVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlMShhcmcpID0+Ci0gICAgICBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICduZXcgVWludDhDbGFtcGVkQXJyYXkoIyknLCBhcmcpOwotCi0gIHN0YXRpYyBOYXRpdmVVaW50OENsYW1wZWRMaXN0IF9jcmVhdGUyKGFyZzEsIGFyZzIpID0+Ci0gICAgICBKUygnTmF0aXZlVWludDhDbGFtcGVkTGlzdCcsICduZXcgVWludDhDbGFtcGVkQXJyYXkoIywgIyknLCBhcmcxLCBhcmcyKTsKLQotICBzdGF0aWMgTmF0aXZlVWludDhDbGFtcGVkTGlzdCBfY3JlYXRlMyhhcmcxLCBhcmcyLCBhcmczKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQ4Q2xhbXBlZExpc3QnLCAnbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KCMsICMsICMpJywKLSAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi0KLWNsYXNzIE5hdGl2ZVVpbnQ4TGlzdAotICAgIGV4dGVuZHMgTmF0aXZlVHlwZWRBcnJheU9mSW50Ci0gICAgaW1wbGVtZW50cyBVaW50OExpc3QKLSAgICAvLyBPbiBzb21lIGJyb3dzZXJzIFVpbnQ4Q2xhbXBlZEFycmF5IGlzIGEgc3VidHlwZSBvZiBVaW50OEFycmF5LiAgTWFya2luZwotICAgIC8vIFVpbnQ4TGlzdCBhcyAhbm9ubGVhZiBlbnN1cmVzIHRoYXQgdGhlIG5hdGl2ZSBkaXNwYXRjaCBjb3JyZWN0bHkgaGFuZGxlcwotICAgIC8vIHRoZSBwb3RlbnRpYWwgZm9yIFVpbnQ4Q2xhbXBlZEFycmF5IHRvICdhY2NpZGVudGFsbHknIHBpY2sgdXAgdGhlCi0gICAgLy8gZGlzcGF0Y2ggcmVjb3JkIGZvciBVaW50OExpc3QuCi0gICAgbmF0aXZlICJVaW50OEFycmF5LCFub25sZWFmIiB7Ci0KLSAgZmFjdG9yeSBOYXRpdmVVaW50OExpc3QoaW50IGxlbmd0aCkgPT4gX2NyZWF0ZTEoX2NoZWNrTGVuZ3RoKGxlbmd0aCkpOwotCi0gIGZhY3RvcnkgTmF0aXZlVWludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIF9jcmVhdGUxKF9lbnN1cmVOYXRpdmVMaXN0KGVsZW1lbnRzKSk7Ci0KLSAgZmFjdG9yeSBOYXRpdmVVaW50OExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldEluQnl0ZXMsIGludCBsZW5ndGgpIHsKLSAgICBfY2hlY2tWaWV3QXJndW1lbnRzKGJ1ZmZlciwgb2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLSAgICByZXR1cm4gbGVuZ3RoID09IG51bGwKLSAgICAgICAgPyBfY3JlYXRlMihidWZmZXIsIG9mZnNldEluQnl0ZXMpCi0gICAgICAgIDogX2NyZWF0ZTMoYnVmZmVyLCBvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotICB9Ci0KLSAgVHlwZSBnZXQgcnVudGltZVR5cGUgPT4gVWludDhMaXN0OwotCi0gIGludCBnZXQgbGVuZ3RoID0+IEpTKCdKU1VJbnQzMicsICcjLmxlbmd0aCcsIHRoaXMpOwotCi0gIGludCBvcGVyYXRvcltdKGludCBpbmRleCkgewotICAgIF9jaGVja0luZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIHJldHVybiBKUygnSlNVSW50MzEnLCAnI1sjXScsIHRoaXMsIGluZGV4KTsKLSAgfQotCi0gIExpc3Q8aW50PiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7Ci0gICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOwotICAgIHZhciBzb3VyY2UgPSBKUygnTmF0aXZlVWludDhMaXN0JywgJyMuc3ViYXJyYXkoIywgIyknLCB0aGlzLCBzdGFydCwgZW5kKTsKLSAgICByZXR1cm4gX2NyZWF0ZTEoc291cmNlKTsKLSAgfQotCi0gIHN0YXRpYyBOYXRpdmVVaW50OExpc3QgX2NyZWF0ZTEoYXJnKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQ4TGlzdCcsICduZXcgVWludDhBcnJheSgjKScsIGFyZyk7Ci0KLSAgc3RhdGljIE5hdGl2ZVVpbnQ4TGlzdCBfY3JlYXRlMihhcmcxLCBhcmcyKSA9PgotICAgICAgSlMoJ05hdGl2ZVVpbnQ4TGlzdCcsICduZXcgVWludDhBcnJheSgjLCAjKScsIGFyZzEsIGFyZzIpOwotCi0gIHN0YXRpYyBOYXRpdmVVaW50OExpc3QgX2NyZWF0ZTMoYXJnMSwgYXJnMiwgYXJnMykgPT4KLSAgICAgIEpTKCdOYXRpdmVVaW50OExpc3QnLCAnbmV3IFVpbnQ4QXJyYXkoIywgIywgIyknLCBhcmcxLCBhcmcyLCBhcmczKTsKLX0KZGlmZiAtLWdpdCBhL3Nkay9saWIvdHlwZWRfZGF0YS9kYXJ0MmpzL3R5cGVkX2RhdGFfZGFydDJqcy5kYXJ0IGIvc2RrL2xpYi90eXBlZF9kYXRhL2RhcnQyanMvdHlwZWRfZGF0YV9kYXJ0MmpzLmRhcnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTA0ZGUuLjAwMDAwMDAKLS0tIGEvc2RrL2xpYi90eXBlZF9kYXRhL2RhcnQyanMvdHlwZWRfZGF0YV9kYXJ0MmpzLmRhcnQKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMywgdGhlIERhcnQgcHJvamVjdCBhdXRob3JzLiAgUGxlYXNlIHNlZSB0aGUgQVVUSE9SUyBmaWxlCi0vLyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQotLy8gQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLyoqCi0gKiBTcGVjaWFsaXplZCBpbnRlZ2VycyBhbmQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywKLSAqIHdpdGggU0lNRCBzdXBwb3J0IGFuZCBlZmZpY2llbnQgbGlzdHMuCi0gKi8KLWxpYnJhcnkgZGFydC50eXBlZF9kYXRhOwotCi1pbXBvcnQgJ2RhcnQ6Y29sbGVjdGlvbicgc2hvdyBMaXN0TWl4aW47Ci1pbXBvcnQgJ2RhcnQ6X2ludGVybmFsJyBzaG93IEZpeGVkTGVuZ3RoTGlzdE1peGluOwotaW1wb3J0ICdkYXJ0Ol9uYXRpdmVfdHlwZWRfZGF0YSc7Ci1pbXBvcnQgJ2RhcnQ6X2ZvcmVpZ25faGVscGVyJyBzaG93IEpTOwotaW1wb3J0ICdkYXJ0Om1hdGgnIGFzIE1hdGg7Ci0KLWV4cG9ydCAnZGFydDpfbmF0aXZlX3R5cGVkX2RhdGEnIHNob3cgRW5kaWFubmVzczsKLQotCi0vKioKLSAqIEEgc2VxdWVuY2Ugb2YgYnl0ZXMgdW5kZXJseWluZyBhIHR5cGVkIGRhdGEgb2JqZWN0LgotICogVXNlZCB0byBwcm9jZXNzIGxhcmdlIHF1YW50aXRpZXMgb2YgYmluYXJ5IG9yIG51bWVyaWNhbCBkYXRhCi0gKiBtb3JlIGVmZmljaWVudGx5IHVzaW5nIGEgdHlwZWQgdmlldy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQnl0ZUJ1ZmZlciB7Ci0gIGludCBnZXQgbGVuZ3RoSW5CeXRlczsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBbVWludDhMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgVWludDhMaXN0IGFzVWludDhMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgW0ludDhMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgSW50OExpc3QgYXNJbnQ4TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFtVaW50OENsYW1wZWRdIHZpZXcgb2YgdGhpcyBidWZmZXIuCi0gICAqLwotICBVaW50OENsYW1wZWRMaXN0IGFzVWludDhDbGFtcGVkTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFtVaW50MTZMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgVWludDE2TGlzdCBhc1VpbnQxNkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBbSW50MTZMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgSW50MTZMaXN0IGFzSW50MTZMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgW1VpbnQzMkxpc3RdIHZpZXcgb2YgdGhpcyBidWZmZXIuCi0gICAqLwotICBVaW50MzJMaXN0IGFzVWludDMyTGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFtJbnQzMkxpc3RdIHZpZXcgb2YgdGhpcyBidWZmZXIuCi0gICAqLwotICBJbnQzMkxpc3QgYXNJbnQzMkxpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBbVWludDY0TGlzdF0gdmlldyBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIFVpbnQ2NExpc3QgYXNVaW50NjRMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgW0ludDY0TGlzdF0gdmlldyBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIEludDY0TGlzdCBhc0ludDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFtJbnQzMng0TGlzdF0gdmlldyBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIEludDMyeDRMaXN0IGFzSW50MzJ4NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBbRmxvYXQzMkxpc3RdIHZpZXcgb2YgdGhpcyBidWZmZXIuCi0gICAqLwotICBGbG9hdDMyTGlzdCBhc0Zsb2F0MzJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgW0Zsb2F0NjRMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgRmxvYXQ2NExpc3QgYXNGbG9hdDY0TGlzdChbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFtGbG9hdDMyeDRMaXN0XSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgRmxvYXQzMng0TGlzdCBhc0Zsb2F0MzJ4NExpc3QoW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pOwotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBbRmxvYXQ2NHgyTGlzdF0gdmlldyBvZiB0aGlzIGJ1ZmZlci4KLSAgICovCi0gIEZsb2F0NjR4Mkxpc3QgYXNGbG9hdDY0eDJMaXN0KFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKTsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgW0J5dGVEYXRhXSB2aWV3IG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgQnl0ZURhdGEgYXNCeXRlRGF0YShbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSk7Ci19Ci0KLQotLyoqCi0gKiBBIHR5cGVkIHZpZXcgb2YgYSBzZXF1ZW5jZSBvZiBieXRlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVHlwZWREYXRhIHsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJ5dGUgYnVmZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG9iamVjdC4KLSAgICovCi0gIEJ5dGVCdWZmZXIgZ2V0IGJ1ZmZlcjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgdmlldywgaW4gYnl0ZXMuCi0gICAqLwotICBpbnQgZ2V0IGxlbmd0aEluQnl0ZXM7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG9mZnNldCBpbiBieXRlcyBpbnRvIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYnVmZmVyIG9mIHRoaXMgdmlldy4KLSAgICovCi0gIGludCBnZXQgb2Zmc2V0SW5CeXRlczsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGVsZW1lbnQgaW4gdGhpcwotICAgKiBsaXN0LgotICAgKi8KLSAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXM7Ci19Ci0KLQotLyoqCi0gKiBBIGZpeGVkLWxlbmd0aCwgcmFuZG9tLWFjY2VzcyBzZXF1ZW5jZSBvZiBieXRlcyB0aGF0IGFsc28gcHJvdmlkZXMgcmFuZG9tCi0gKiBhbmQgdW5hbGlnbmVkIGFjY2VzcyB0byB0aGUgZml4ZWQtd2lkdGggaW50ZWdlcnMgYW5kIGZsb2F0aW5nIHBvaW50Ci0gKiBudW1iZXJzIHJlcHJlc2VudGVkIGJ5IHRob3NlIGJ5dGVzLgotICogQnl0ZURhdGEgbWF5IGJlIHVzZWQgdG8gcGFjayBhbmQgdW5wYWNrIGRhdGEgZnJvbSBleHRlcm5hbCBzb3VyY2VzCi0gKiAoc3VjaCBhcyBuZXR3b3JrcyBvciBmaWxlcyBzeXN0ZW1zKSwgYW5kIHRvIHByb2Nlc3MgbGFyZ2UgcXVhbnRpdGllcwotICogb2YgbnVtZXJpY2FsIGRhdGEgbW9yZSBlZmZpY2llbnRseSB0aGFuIHdvdWxkIGJlIHBvc3NpYmxlCi0gKiB3aXRoIG9yZGluYXJ5IFtMaXN0XSBpbXBsZW1lbnRhdGlvbnMuIEJ5dGVEYXRhIGNhbiBzYXZlIHNwYWNlLCBieQotICogZWxpbWluYXRpbmcgdGhlIG5lZWQgZm9yIG9iamVjdCBoZWFkZXJzLCBhbmQgdGltZSwgYnkgZWxpbWluYXRpbmcgdGhlCi0gKiBuZWVkIGZvciBkYXRhIGNvcGllcy4gRmluYWxseSwgQnl0ZURhdGEgbWF5IGJlIHVzZWQgdG8gaW50ZW50aW9uYWxseQotICogcmVpbnRlcnByZXQgdGhlIGJ5dGVzIHJlcHJlc2VudGluZyBvbmUgYXJpdGhtZXRpYyB0eXBlIGFzIGFub3RoZXIuCi0gKiBGb3IgZXhhbXBsZSB0aGlzIGNvZGUgZnJhZ21lbnQgZGV0ZXJtaW5lIHdoYXQgMzItYml0IHNpZ25lZCBpbnRlZ2VyCi0gKiBpcyByZXByZXNlbnRlZCBieSB0aGUgYnl0ZXMgb2YgYSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOgotICoKLSAqICAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4TGlzdCg4KS5idWZmZXI7Ci0gKiAgICAgdmFyIGJkYXRhID0gbmV3IEJ5dGVEYXRhLnZpZXcoYnVmZmVyKTsKLSAqICAgICBiZGF0YS5zZXRGbG9hdDMyKDAsIDMuMDQpOwotICogICAgIGludCBodWggPSBiZGF0YS5nZXRJbnQzMigwKTsKLSAqLwotYWJzdHJhY3QgY2xhc3MgQnl0ZURhdGEgZXh0ZW5kcyBUeXBlZERhdGEgewotICAvKioKLSAgICogQ3JlYXRlcyBhIFtCeXRlRGF0YV0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgQnl0ZURhdGEoaW50IGxlbmd0aCkgPT4gbmV3IE5hdGl2ZUJ5dGVEYXRhKGxlbmd0aCk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gW0J5dGVEYXRhXSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlIHNwZWNpZmllZAotICAgKiBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW0J5dGVEYXRhXSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqLwotICBmYWN0b3J5IEJ5dGVEYXRhLnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KLSAgICAgIGJ1ZmZlci5hc0J5dGVEYXRhKG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0KLSAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgPT4gMTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudGVkIGJ5IHRoZSBmb3VyIGJ5dGVzIGF0Ci0gICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAotICAgKiBzaW5nbGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGJpbmFyeTMyKS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBudW0gZ2V0RmxvYXQzMihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIGF0Ci0gICAqIHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiBJRUVFIDc1NAotICAgKiBkb3VibGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludCBmb3JtYXQgKGJpbmFyeTY0KS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBudW0gZ2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHR3byBieXRlcyBhdAotICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMjxzdXA+MTU8L3N1cD4gYW5kIDI8c3VwPjE1PC9zdXA+IC0gMSwKLSAgICogaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRJbnQxNihpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGZvdXIgYnl0ZXMgYXQKLSAgICogdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5Ci0gICAqIGZvcm0uCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDI8c3VwPjMxPC9zdXA+IGFuZCAyPHN1cD4zMTwvc3VwPiAtIDEsCi0gICAqIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBpbnQgZ2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IG5lZ2F0aXZlKSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBlaWdodCBieXRlcyBhdAotICAgKiB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdHdvJ3MgY29tcGxlbWVudCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMjxzdXA+NjM8L3N1cD4gYW5kIDI8c3VwPjYzPC9zdXA+IC0gMSwKLSAgICogaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRJbnQ2NChpbnQgYnl0ZU9mZnNldCwgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgbmVnYXRpdmUpIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGJ5dGUgYXQgdGhlCi0gICAqIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QsIGluIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5Ci0gICAqIHJlcHJlc2VudGF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYmV0d2VlbiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgaW50IGdldEludDgoaW50IGJ5dGVPZmZzZXQpIDsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgdHdvIGJ5dGVzIHN0YXJ0aW5nCi0gICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjE2PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRVaW50MTYoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgZm91ciBieXRlcyBzdGFydGluZwotICAgKiBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5Ci0gICAqIGZvcm0uCi0gICAqIFRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kICAyPHN1cD4zMjwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBpbnQgZ2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHBvc2l0aXZlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nCi0gICAqIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0LCBpbiB1bnNpZ25lZCBiaW5hcnkKLSAgICogZm9ybS4KLSAgICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGJldHdlZW4gMCBhbmQgIDI8c3VwPjY0PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIGludCBnZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9zaXRpdmUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgYnl0ZSBhdCB0aGUgc3BlY2lmaWVkCi0gICAqIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdCwgaW4gdW5zaWduZWQgYmluYXJ5IGZvcm0uIFRoZQotICAgKiByZXR1cm4gdmFsdWUgd2lsbCBiZSBiZXR3ZWVuIDAgYW5kIDI1NSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICBpbnQgZ2V0VWludDgoaW50IGJ5dGVPZmZzZXQpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSBJRUVFIDc1NCBzaW5nbGUtcHJlY2lzaW9uIGJpbmFyeSBmbG9hdGluZy1wb2ludAotICAgKiAoYmluYXJ5MzIpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXS4KLSAgICoKLSAgICogKipOb3RlIHRoYXQgdGhpcyBtZXRob2QgY2FuIGxvc2UgcHJlY2lzaW9uLioqIFRoZSBpbnB1dCBbdmFsdWVdIGlzCi0gICAqIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLCB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCB0byAzMi1iaXQKLSAgICogZmxvYXRpbmcgcG9pbnQgdmFsdWUgYnkgSUVFRSA3NTQgcm91bmRpbmcgcnVsZXMgYmVmb3JlIGl0IGlzIHN0b3JlZC4KLSAgICogSWYgW3ZhbHVlXSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGJpbmFyeTMyLCBpdCB3aWxsIGJlCi0gICAqIGNvbnZlcnRlZCB0byB0aGUgbmVhcmVzdCBiaW5hcnkzMiB2YWx1ZS4gIElmIHR3byBiaW5hcnkzMiB2YWx1ZXMgYXJlCi0gICAqIGVxdWFsbHkgY2xvc2UsIHRoZSBvbmUgd2hvc2UgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGlzIHplcm8gd2lsbCBiZSB1c2VkLgotICAgKiBOb3RlIHRoYXQgZmluaXRlIChidXQgbGFyZ2UpIHZhbHVlcyBjYW4gYmUgY29udmVydGVkIHRvIGluZmluaXR5LCBhbmQKLSAgICogc21hbGwgbm9uLXplcm8gdmFsdWVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gemVyby4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgNGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldEZsb2F0MzIoaW50IGJ5dGVPZmZzZXQsIG51bSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwotICAgKiBvYmplY3QgdG8gdGhlIElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50Ci0gICAqIChiaW5hcnk2NCkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA4YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0RmxvYXQ2NChpbnQgYnl0ZU9mZnNldCwgbnVtIHZhbHVlLAotICAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0d28gYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcwotICAgKiBvYmplY3QgdG8gdGhlIHR3bydzIGNvbXBsZW1lbnQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQKLSAgICogW3ZhbHVlXSwgd2hpY2ggbXVzdCBmaXQgaW4gdHdvIGJ5dGVzLiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQotICAgKiBiZXR3ZWVuIDI8c3VwPjE1PC9zdXA+IGFuZCAyPHN1cD4xNTwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgMmAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldEludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBmb3VyIGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0gICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGZvdXIgYnl0ZXMuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgbGllCi0gICAqIGJldHdlZW4gMjxzdXA+MzE8L3N1cD4gYW5kIDI8c3VwPjMxPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0SW50MzIoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICBbRW5kaWFubmVzcyBlbmRpYW49RW5kaWFubmVzcy5CSUdfRU5ESUFOXSk7Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGVpZ2h0IGJ5dGVzIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMKLSAgICogb2JqZWN0IHRvIHRoZSB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkCi0gICAqIFt2YWx1ZV0sIHdoaWNoIG11c3QgZml0IGluIGVpZ2h0IGJ5dGVzLiBJbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGxpZQotICAgKiBiZXR3ZWVuIDI8c3VwPjYzPC9zdXA+IGFuZCAyPHN1cD42Mzwvc3VwPiAtIDEsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGBieXRlT2Zmc2V0ICsgOGAgaXMgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhpcyBvYmplY3QuCi0gICAqLwotICB2b2lkIHNldEludDY0KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQotICAgKiB0d28ncyBjb21wbGVtZW50IGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sIHdoaWNoCi0gICAqIG11c3QgZml0IGluIGEgc2luZ2xlIGJ5dGUuIEluIG90aGVyIHdvcmRzLCBbdmFsdWVdIG11c3QgYmUgYmV0d2VlbgotICAgKiAtMTI4IGFuZCAxMjcsIGluY2x1c2l2ZS4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbYnl0ZU9mZnNldF0gaXMgbmVnYXRpdmUsIG9yCi0gICAqIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRJbnQ4KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUpOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0d28gYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKLSAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCi0gICAqIHdoaWNoIG11c3QgZml0IGluIHR3byBieXRlcy4gaW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuCi0gICAqIDAgYW5kIDI8c3VwPjE2PC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyAyYCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0VWludDE2KGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZm91ciBieXRlcyBzdGFydGluZyBhdCB0aGUgc3BlY2lmaWVkIFtieXRlT2Zmc2V0XSBpbiB0aGlzIG9iamVjdAotICAgKiB0byB0aGUgdW5zaWduZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgW3ZhbHVlXSwKLSAgICogd2hpY2ggbXVzdCBmaXQgaW4gZm91ciBieXRlcy4gaW4gb3RoZXIgd29yZHMsIFt2YWx1ZV0gbXVzdCBiZSBiZXR3ZWVuCi0gICAqIDAgYW5kIDI8c3VwPjMyPC9zdXA+IC0gMSwgaW5jbHVzaXZlLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtieXRlT2Zmc2V0XSBpcyBuZWdhdGl2ZSwgb3IKLSAgICogYGJ5dGVPZmZzZXQgKyA0YCBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0VWludDMyKGludCBieXRlT2Zmc2V0LCBpbnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgIFtFbmRpYW5uZXNzIGVuZGlhbj1FbmRpYW5uZXNzLkJJR19FTkRJQU5dKTsKLQotICAvKioKLSAgICogU2V0cyB0aGUgZWlnaHQgYnl0ZXMgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBbYnl0ZU9mZnNldF0gaW4gdGhpcyBvYmplY3QKLSAgICogdG8gdGhlIHVuc2lnbmVkIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc3BlY2lmaWVkIFt2YWx1ZV0sCi0gICAqIHdoaWNoIG11c3QgZml0IGluIGVpZ2h0IGJ5dGVzLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4KLSAgICogMCBhbmQgMjxzdXA+NjQ8L3N1cD4gLSAxLCBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLCBvcgotICAgKiBgYnl0ZU9mZnNldCArIDhgIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoaXMgb2JqZWN0LgotICAgKi8KLSAgdm9pZCBzZXRVaW50NjQoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgW0VuZGlhbm5lc3MgZW5kaWFuPUVuZGlhbm5lc3MuQklHX0VORElBTl0pOwotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgW2J5dGVPZmZzZXRdIGluIHRoaXMgb2JqZWN0IHRvIHRoZQotICAgKiB1bnNpZ25lZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNwZWNpZmllZCBbdmFsdWVdLCB3aGljaCBtdXN0IGZpdAotICAgKiBpbiBhIHNpbmdsZSBieXRlLiBpbiBvdGhlciB3b3JkcywgW3ZhbHVlXSBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjU1LAotICAgKiBpbmNsdXNpdmUuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW2J5dGVPZmZzZXRdIGlzIG5lZ2F0aXZlLAotICAgKiBvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGlzIG9iamVjdC4KLSAgICovCi0gIHZvaWQgc2V0VWludDgoaW50IGJ5dGVPZmZzZXQsIGludCB2YWx1ZSk7Ci19Ci0KLQotLyoqCi0gKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIElFRUUgNzU0IHNpbmdsZS1wcmVjaXNpb24gYmluYXJ5IGZsb2F0aW5nLXBvaW50Ci0gKiBudW1iZXJzICB0aGF0IGlzIHZpZXdhYmxlIGFzIGEgW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzCi0gKiBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5IG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuCi0gKiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCi0gKi8KLWFic3RyYWN0IGNsYXNzIEZsb2F0MzJMaXN0IGltcGxlbWVudHMgVHlwZWREYXRhLCBMaXN0PGRvdWJsZT4gewotICAvKioKLSAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgRmxvYXQzMkxpc3QoaW50IGxlbmd0aCkgPSBOYXRpdmVGbG9hdDMyTGlzdDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gd2l0aCB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKLSAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KLSAgICovCi0gIGZhY3RvcnkgRmxvYXQzMkxpc3QuZnJvbUxpc3QoTGlzdDxkb3VibGU+IGVsZW1lbnRzKSA9PgotICAgICAgbmV3IE5hdGl2ZUZsb2F0MzJMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtGbG9hdDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZSBzcGVjaWZpZWQKLSAgICogYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtGbG9hdDMyTGlzdF0gd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBieXRlCi0gICAqIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4gSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleCBvZiB0aGUgcmVnaW9uIGlzIG5vdAotICAgKiBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluIHRoZSBieXRlIGJ1ZmZlcikuCi0gICAqIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gbnVsbCwgd2hpY2ggaW5kaWNhdGVzCi0gICAqIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgotICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgotICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgotICAgKgotICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgotICAgKiBCWVRFU19QRVJfRUxFTUVOVC4KLSAgICovCi0gIGZhY3RvcnkgRmxvYXQzMkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgotICAgICAgYnVmZmVyLmFzRmxvYXQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gNDsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgSUVFRSA3NTQgZG91YmxlLXByZWNpc2lvbiBiaW5hcnkgZmxvYXRpbmctcG9pbnQKLSAqIG51bWJlcnMgIHRoYXQgaXMgdmlld2FibGUgYXMgYSBbVHlwZWREYXRhXS4gRm9yIGxvbmcgbGlzdHMsIHRoaXMKLSAqIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkgbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4KLSAqIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgRmxvYXQ2NExpc3QgaW1wbGVtZW50cyBUeXBlZERhdGEsIExpc3Q8ZG91YmxlPiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKLSAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgotICAgKi8KLSAgZmFjdG9yeSBGbG9hdDY0TGlzdChpbnQgbGVuZ3RoKSA9IE5hdGl2ZUZsb2F0NjRMaXN0OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAotICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgotICAgKi8KLSAgZmFjdG9yeSBGbG9hdDY0TGlzdC5mcm9tTGlzdChMaXN0PGRvdWJsZT4gZWxlbWVudHMpID0+Ci0gICAgICBuZXcgTmF0aXZlRmxvYXQ2NExpc3QuZnJvbUxpc3QoZWxlbWVudHMpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0Zsb2F0NjRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlIHNwZWNpZmllZAotICAgKiBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW0Zsb2F0NjRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgZmFjdG9yeSBGbG9hdDY0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+Ci0gICAgICBidWZmZXIuYXNGbG9hdDY0TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQgQllURVNfUEVSX0VMRU1FTlQgPSA4OwotfQotCi0KLS8qKgotICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAxNi1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQotICogW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKLSAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSW50MTZMaXN0IGV4dGVuZHMgVHlwZWREYXRhIGltcGxlbWVudHMgTGlzdDxpbnQ+IHsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gW0ludDE2TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgSW50MTZMaXN0KGludCBsZW5ndGgpID0gTmF0aXZlSW50MTZMaXN0OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0ludDE2TGlzdF0gd2l0aCB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKLSAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KLSAgICovCi0gIGZhY3RvcnkgSW50MTZMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIG5ldyBOYXRpdmVJbnQxNkxpc3QuZnJvbUxpc3QoZWxlbWVudHMpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGFuIFtJbnQxNkxpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiB0aGUgc3BlY2lmaWVkCi0gICAqIGJ5dGUgYnVmZmVyLiBDaGFuZ2VzIGluIHRoZSBbSW50MTZMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgZmFjdG9yeSBJbnQxNkxpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KLSAgICAgIGJ1ZmZlci5hc0ludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQgQllURVNfUEVSX0VMRU1FTlQgPSAyOwotfQotCi0KLS8qKgotICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAzMi1iaXQgc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQotICogW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKLSAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSW50MzJMaXN0IGltcGxlbWVudHMgVHlwZWREYXRhLCBMaXN0PGludD4gewotICAvKioKLSAgICogQ3JlYXRlcyBhbiBbSW50MzJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwgb2YKLSAgICogd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgotICAgKi8KLSAgZmFjdG9yeSBJbnQzMkxpc3QoaW50IGxlbmd0aCkgPSBOYXRpdmVJbnQzMkxpc3Q7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbSW50MzJMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAotICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgotICAgKi8KLSAgZmFjdG9yeSBJbnQzMkxpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgotICAgICAgbmV3IE5hdGl2ZUludDMyTGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gW0ludDMyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZSBzcGVjaWZpZWQKLSAgICogYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtJbnQzMkxpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQotICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKLSAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgotICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcwotICAgKiB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKLSAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KLSAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KLSAgICoKLSAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKLSAgICogQllURVNfUEVSX0VMRU1FTlQuCi0gICAqLwotICBmYWN0b3J5IEludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgotICAgICAgYnVmZmVyLmFzSW50MzJMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBCWVRFU19QRVJfRUxFTUVOVCA9IDQ7Ci19Ci0KLQotLyoqCi0gKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDgtYml0IHNpZ25lZCBpbnRlZ2Vycy4KLSAqIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKLSAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSW50OExpc3QgaW1wbGVtZW50cyBUeXBlZERhdGEsIExpc3Q8aW50PiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIFtJbnQ4TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgSW50OExpc3QoaW50IGxlbmd0aCkgPSBOYXRpdmVJbnQ4TGlzdDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtJbnQ4TGlzdF0gd2l0aCB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKLSAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KLSAgICovCi0gIGZhY3RvcnkgSW50OExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGVsZW1lbnRzKSA9PgotICAgICAgbmV3IE5hdGl2ZUludDhMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBbSW50OExpc3RdIF92aWV3XyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBpbiB0aGUgc3BlY2lmaWVkCi0gICAqIGJ5dGUgYnVmZmVyLiBDaGFuZ2VzIGluIHRoZSBbSW50OExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQotICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKLSAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgotICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcwotICAgKiB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKLSAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KLSAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KLSAgICovCi0gIGZhY3RvcnkgSW50OExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgotICAgICAgYnVmZmVyLmFzSW50OExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gMTsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgMTYtYml0IHVuc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQotICogW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKLSAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVWludDE2TGlzdCBpbXBsZW1lbnRzIFR5cGVkRGF0YSwgTGlzdDxpbnQ+IHsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsCi0gICAqIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgVWludDE2TGlzdChpbnQgbGVuZ3RoKSA9IE5hdGl2ZVVpbnQxNkxpc3Q7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gd2l0aCB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKLSAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KLSAgICovCi0gIGZhY3RvcnkgVWludDE2TGlzdC5mcm9tTGlzdChMaXN0PGludD4gZWxlbWVudHMpID0+Ci0gICAgICBuZXcgTmF0aXZlVWludDE2TGlzdC5mcm9tTGlzdChlbGVtZW50cyk7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbVWludDE2TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluCi0gICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtVaW50MTZMaXN0XSB3aWxsIGJlCi0gICAqIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4Ci0gICAqIG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4KLSAgICogdGhlIGJ5dGUgYnVmZmVyKS4gSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLAotICAgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgZmFjdG9yeSBVaW50MTZMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgb2Zmc2V0SW5CeXRlcyA9IDAsIGludCBsZW5ndGhdKSA9PgotICAgICAgYnVmZmVyLmFzVWludDE2TGlzdChvZmZzZXRJbkJ5dGVzLCBsZW5ndGgpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQgQllURVNfUEVSX0VMRU1FTlQgPSAyOwotfQotCi0KLS8qKgotICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCi0gKiBbVHlwZWREYXRhXS4gRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQotICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgotICovCi1hYnN0cmFjdCBjbGFzcyBVaW50MzJMaXN0IGltcGxlbWVudHMgVHlwZWREYXRhLCBMaXN0PGludD4gewotICAvKioKLSAgICogQ3JlYXRlcyBhIFtVaW50MzJMaXN0XSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aCAoaW4gZWxlbWVudHMpLCBhbGwKLSAgICogb2Ygd2hvc2UgZWxlbWVudHMgYXJlIGluaXRpYWxseSB6ZXJvLgotICAgKi8KLSAgZmFjdG9yeSBVaW50MzJMaXN0KGludCBsZW5ndGgpID0gTmF0aXZlVWludDMyTGlzdDsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtVaW50MzJMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAotICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgotICAgKi8KLSAgZmFjdG9yeSBVaW50MzJMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIG5ldyBOYXRpdmVVaW50MzJMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtVaW50MzJMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4KLSAgICogdGhlIHNwZWNpZmllZCBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW1VpbnQzMl0gd2lsbCBiZQotICAgKiB2aXNpYmxlIGluIHRoZSBieXRlIGJ1ZmZlciBhbmQgdmljZSB2ZXJzYS4gSWYgdGhlIFtvZmZzZXRJbkJ5dGVzXSBpbmRleAotICAgKiBvZiB0aGUgcmVnaW9uIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8gKHRoZSBmaXJzdCBieXRlIGluCi0gICAqIHRoZSBieXRlIGJ1ZmZlcikuIElmIHRoZSBsZW5ndGggaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gbnVsbCwKLSAgICogd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIHZpZXcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBieXRlIGJ1ZmZlci4KLSAgICoKLSAgICogVGhyb3dzIFtSYW5nZUVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gb3IgW2xlbmd0aF0gYXJlIG5lZ2F0aXZlLCBvcgotICAgKiBpZiBbb2Zmc2V0SW5CeXRlc10gKyAoW2xlbmd0aF0gKiBlbGVtZW50U2l6ZUluQnl0ZXMpIGlzIGdyZWF0ZXIgdGhhbgotICAgKiB0aGUgbGVuZ3RoIG9mIFtidWZmZXJdLgotICAgKgotICAgKiBUaHJvd3MgW0FyZ3VtZW50RXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBpcyBub3QgYSBtdWx0aXBsZSBvZgotICAgKiBCWVRFU19QRVJfRUxFTUVOVC4KLSAgICovCi0gIGZhY3RvcnkgVWludDMyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbaW50IG9mZnNldEluQnl0ZXMgPSAwLCBpbnQgbGVuZ3RoXSkgPT4KLSAgICAgIGJ1ZmZlci5hc1VpbnQzMkxpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gNDsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgOC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuCi0gKiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5Ci0gKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCi0gKiBJbmRleGVkIHN0b3JlIGNsYW1wcyB0aGUgdmFsdWUgdG8gcmFuZ2UgMC4uMHhGRi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVWludDhDbGFtcGVkTGlzdCBpbXBsZW1lbnRzIFR5cGVkRGF0YSwgTGlzdDxpbnQ+IHsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgVWludDhDbGFtcGVkTGlzdChpbnQgbGVuZ3RoKSA9IE5hdGl2ZVVpbnQ4Q2xhbXBlZExpc3Q7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbVWludDhDbGFtcGVkTGlzdF0gb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgW2VsZW1lbnRzXQotICAgKiBsaXN0IGFuZCBjb3BpZXMgb3ZlciB0aGUgdmFsdWVzIGNsYW1waW5nIHdoZW4gbmVlZGVkLgotICAgKi8KLSAgZmFjdG9yeSBVaW50OENsYW1wZWRMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIG5ldyBOYXRpdmVVaW50OENsYW1wZWRMaXN0LmZyb21MaXN0KGVsZW1lbnRzKTsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtVaW50OENsYW1wZWRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlCi0gICAqIHNwZWNpZmllZCBieXRlIFtidWZmZXJdLiBDaGFuZ2VzIGluIHRoZSBbVWludDhMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlCi0gICAqIGJ5dGUgYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMKLSAgICogbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMgdGhhdAotICAgKiB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqLwotICBmYWN0b3J5IFVpbnQ4Q2xhbXBlZExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+Ci0gICAgICBidWZmZXIuYXNVaW50OENsYW1wZWRMaXN0KG9mZnNldEluQnl0ZXMsIGxlbmd0aCk7Ci0KLSAgc3RhdGljIGNvbnN0IGludCBCWVRFU19QRVJfRUxFTUVOVCA9IDE7Ci19Ci0KLQotLyoqCi0gKiBBIGZpeGVkLWxlbmd0aCBsaXN0IG9mIDgtYml0IHVuc2lnbmVkIGludGVnZXJzLgotICogRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gY2FuIGJlIGNvbnNpZGVyYWJseQotICogbW9yZSBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgotICovCi1hYnN0cmFjdCBjbGFzcyBVaW50OExpc3QgaW1wbGVtZW50cyBUeXBlZERhdGEsIExpc3Q8aW50PiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwgYWxsIG9mCi0gICAqIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIGZhY3RvcnkgVWludDhMaXN0KGludCBsZW5ndGgpID0gTmF0aXZlVWludDhMaXN0OwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gd2l0aCB0aGUgc2FtZSBzaXplIGFzIHRoZSBbZWxlbWVudHNdIGxpc3QKLSAgICogYW5kIGNvcGllcyBvdmVyIHRoZSBlbGVtZW50cy4KLSAgICovCi0gIGZhY3RvcnkgVWludDhMaXN0LmZyb21MaXN0KExpc3Q8aW50PiBlbGVtZW50cykgPT4KLSAgICAgIG5ldyBOYXRpdmVVaW50OExpc3QuZnJvbUxpc3QoZWxlbWVudHMpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1VpbnQ4TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZSBzcGVjaWZpZWQKLSAgICogYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtVaW50OExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQotICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKLSAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgotICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcwotICAgKiB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKLSAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KLSAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KLSAgICovCi0gIGZhY3RvcnkgVWludDhMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgW2ludCBvZmZzZXRJbkJ5dGVzID0gMCwgaW50IGxlbmd0aF0pID0+Ci0gICAgICBidWZmZXIuYXNVaW50OExpc3Qob2Zmc2V0SW5CeXRlcywgbGVuZ3RoKTsKLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gMTsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgNjQtYml0IHNpZ25lZCBpbnRlZ2VycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKLSAqIFtUeXBlZERhdGFdLiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgY29uc2lkZXJhYmx5Ci0gKiBtb3JlIHNwYWNlLSBhbmQgdGltZS1lZmZpY2llbnQgdGhhbiB0aGUgZGVmYXVsdCBbTGlzdF0gaW1wbGVtZW50YXRpb24uCi0gKi8KLWFic3RyYWN0IGNsYXNzIEludDY0TGlzdCBleHRlbmRzIFR5cGVkRGF0YSBpbXBsZW1lbnRzIExpc3Q8aW50PiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIFtJbnQ2NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbCBvZgotICAgKiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCi0gICAqLwotICBmYWN0b3J5IEludDY0TGlzdChpbnQgbGVuZ3RoKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtJbnQ2NExpc3RdIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0Ci0gICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCi0gICAqLwotICBmYWN0b3J5IEludDY0TGlzdC5mcm9tTGlzdChMaXN0PGludD4gbGlzdCkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJJbnQ2NExpc3Qgbm90IHN1cHBvcnRlZCBieSBkYXJ0MmpzLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4gW0ludDY0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZSBzcGVjaWZpZWQKLSAgICogYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtJbnQ2NExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZSBidWZmZXIKLSAgICogYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKLSAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgotICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcyB0aGF0Ci0gICAqIHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKLSAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KLSAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KLSAgICoKLSAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKLSAgICogQllURVNfUEVSX0VMRU1FTlQuCi0gICAqLwotICBmYWN0b3J5IEludDY0TGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLCBbaW50IGJ5dGVPZmZzZXQsIGludCBsZW5ndGhdKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRXJyb3IoIkludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gODsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgNjQtYml0IHVuc2lnbmVkIGludGVnZXJzIHRoYXQgaXMgdmlld2FibGUgYXMgYQotICogW1R5cGVkRGF0YV0uIEZvciBsb25nIGxpc3RzLCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSBjb25zaWRlcmFibHkKLSAqIG1vcmUgc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgVWludDY0TGlzdCBleHRlbmRzIFR5cGVkRGF0YSBpbXBsZW1lbnRzIExpc3Q8aW50PiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1VpbnQ2NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksIGFsbAotICAgKiBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCi0gICAqLwotICBmYWN0b3J5IFVpbnQ2NExpc3QoaW50IGxlbmd0aCkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZEVycm9yKCJVaW50NjRMaXN0IG5vdCBzdXBwb3J0ZWQgYnkgZGFydDJqcy4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW1VpbnQ2NExpc3RdIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0Ci0gICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCi0gICAqLwotICBmYWN0b3J5IFVpbnQ2NExpc3QuZnJvbUxpc3QoTGlzdDxpbnQ+IGxpc3QpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVWludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiBbVWludDY0TGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluCi0gICAqIHRoZSBzcGVjaWZpZWQgYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtVaW50NjRMaXN0XSB3aWxsIGJlCi0gICAqIHZpc2libGUgaW4gdGhlIGJ5dGUgYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdCi0gICAqIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0Ci0gICAqIGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4gSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cwotICAgKiB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUKLSAgICogYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgZmFjdG9yeSBVaW50NjRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsIFtpbnQgYnl0ZU9mZnNldCwgaW50IGxlbmd0aF0pIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcigiVWludDY0TGlzdCBub3Qgc3VwcG9ydGVkIGJ5IGRhcnQyanMuIik7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gODsKLX0KLQotCi0vKioKLSAqIEEgZml4ZWQtbGVuZ3RoIGxpc3Qgb2YgRmxvYXQzMng0IG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCi0gKiBbVHlwZWREYXRhXS4gRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBjb25zaWRlcmFibHkgbW9yZQotICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgRmxvYXQzMng0TGlzdAotICAgIGV4dGVuZHMgT2JqZWN0IHdpdGggTGlzdE1peGluPEZsb2F0MzJ4ND4sIEZpeGVkTGVuZ3RoTGlzdE1peGluPEZsb2F0MzJ4ND4KLSAgICBpbXBsZW1lbnRzIExpc3Q8RmxvYXQzMng0PiwgVHlwZWREYXRhIHsKLQotICBmaW5hbCBGbG9hdDMyTGlzdCBfc3RvcmFnZTsKLQotICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gX3N0b3JhZ2UuYnVmZmVyOwotCi0gIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfc3RvcmFnZS5sZW5ndGhJbkJ5dGVzOwotCi0gIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfc3RvcmFnZS5vZmZzZXRJbkJ5dGVzOwotCi0gIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IEJZVEVTX1BFUl9FTEVNRU5UOwotCi0gIHZvaWQgX2ludmFsaWRJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGxpc3QgaW5kZXggJGluZGV4Jyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBfY2hlY2tJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLSAgICBpZiAoSlMoJ2Jvb2wnLCAnKCMgPj4+IDAgIT0gIyknLCBpbmRleCwgaW5kZXgpIHx8IGluZGV4ID49IGxlbmd0aCkgewotICAgICAgX2ludmFsaWRJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICB9Ci0gIH0KLQotICBpbnQgX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZW5ndGgpIHsKLSAgICAvLyBGb3IgYHN1Ymxpc3RgIHRoZSBbc3RhcnRdIGFuZCBbZW5kXSBpbmRpY2VzIGFyZSBhbGxvd2VkIHRvIGJlIGVxdWFsIHRvCi0gICAgLy8gW2xlbmd0aF0uIEhvd2V2ZXIsIFtfY2hlY2tJbmRleF0gb25seSBhbGxvd3MgaW5kaWNlcyBpbiB0aGUgcmFuZ2UKLSAgICAvLyAwIC4uIGxlbmd0aCAtIDEuIFdlIHRoZXJlZm9yZSBpbmNyZW1lbnQgdGhlIFtsZW5ndGhdIGFyZ3VtZW50IGJ5IG9uZQotICAgIC8vIGZvciB0aGUgW19jaGVja0luZGV4XSBjaGVja3MuCi0gICAgX2NoZWNrSW5kZXgoc3RhcnQsIGxlbmd0aCArIDEpOwotICAgIGlmIChlbmQgPT0gbnVsbCkgcmV0dXJuIGxlbmd0aDsKLSAgICBfY2hlY2tJbmRleChlbmQsIGxlbmd0aCArIDEpOwotICAgIGlmIChzdGFydCA+IGVuZCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2Uoc3RhcnQsIDAsIGVuZCk7Ci0gICAgcmV0dXJuIGVuZDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJ4NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksCi0gICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCi0gICAqLwotICBGbG9hdDMyeDRMaXN0KGludCBsZW5ndGgpIDogX3N0b3JhZ2UgPSBuZXcgRmxvYXQzMkxpc3QobGVuZ3RoKjQpOwotCi0gIEZsb2F0MzJ4NExpc3QuX2V4dGVybmFsU3RvcmFnZShGbG9hdDMyTGlzdCBzdG9yYWdlKSA6IF9zdG9yYWdlID0gc3RvcmFnZTsKLQotICBGbG9hdDMyeDRMaXN0Ll9zbG93RnJvbUxpc3QoTGlzdDxGbG9hdDMyeDQ+IGxpc3QpCi0gICAgICA6IF9zdG9yYWdlID0gbmV3IEZsb2F0MzJMaXN0KGxpc3QubGVuZ3RoICogNCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGUgPSBsaXN0W2ldOwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDBdID0gZS54OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDFdID0gZS55OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDJdID0gZS56OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDNdID0gZS53OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0Zsb2F0MzJ4NExpc3RdIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyB0aGUgW2VsZW1lbnRzXSBsaXN0Ci0gICAqIGFuZCBjb3BpZXMgb3ZlciB0aGUgZWxlbWVudHMuCi0gICAqLwotICBmYWN0b3J5IEZsb2F0MzJ4NExpc3QuZnJvbUxpc3QoTGlzdDxGbG9hdDMyeDQ+IGxpc3QpIHsKLSAgICBpZiAobGlzdCBpcyBGbG9hdDMyeDRMaXN0KSB7Ci0gICAgICBGbG9hdDMyeDRMaXN0IG5hdGl2ZUxpc3QgPSBsaXN0IGFzIEZsb2F0MzJ4NExpc3Q7Ci0gICAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QuX2V4dGVybmFsU3RvcmFnZSgKLSAgICAgICAgICBuZXcgRmxvYXQzMkxpc3QuZnJvbUxpc3QobmF0aXZlTGlzdC5fc3RvcmFnZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QuX3Nsb3dGcm9tTGlzdChsaXN0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtGbG9hdDMyeDRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlIHNwZWNpZmllZAotICAgKiBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW0Zsb2F0MzJ4NExpc3RdIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgYnl0ZQotICAgKiBidWZmZXIgYW5kIHZpY2UgdmVyc2EuIElmIHRoZSBbb2Zmc2V0SW5CeXRlc10gaW5kZXggb2YgdGhlIHJlZ2lvbiBpcyBub3QKLSAgICogc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB6ZXJvICh0aGUgZmlyc3QgYnl0ZSBpbiB0aGUgYnl0ZSBidWZmZXIpLgotICAgKiBJZiB0aGUgbGVuZ3RoIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIG51bGwsIHdoaWNoIGluZGljYXRlcwotICAgKiB0aGF0IHRoZSB2aWV3IGV4dGVuZHMgdG8gdGhlIGVuZCBvZiB0aGUgYnl0ZSBidWZmZXIuCi0gICAqCi0gICAqIFRocm93cyBbUmFuZ2VFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIG9yIFtsZW5ndGhdIGFyZSBuZWdhdGl2ZSwgb3IKLSAgICogaWYgW29mZnNldEluQnl0ZXNdICsgKFtsZW5ndGhdICogZWxlbWVudFNpemVJbkJ5dGVzKSBpcyBncmVhdGVyIHRoYW4KLSAgICogdGhlIGxlbmd0aCBvZiBbYnVmZmVyXS4KLSAgICoKLSAgICogVGhyb3dzIFtBcmd1bWVudEVycm9yXSBpZiBbb2Zmc2V0SW5CeXRlc10gaXMgbm90IGEgbXVsdGlwbGUgb2YKLSAgICogQllURVNfUEVSX0VMRU1FTlQuCi0gICAqLwotICBGbG9hdDMyeDRMaXN0LnZpZXcoQnl0ZUJ1ZmZlciBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBbaW50IGJ5dGVPZmZzZXQgPSAwLCBpbnQgbGVuZ3RoXSkKLSAgICAgIDogX3N0b3JhZ2UgPSBidWZmZXIuYXNGbG9hdDMyTGlzdChieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAhPSBudWxsID8gbGVuZ3RoICogNCA6IG51bGwpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQgQllURVNfUEVSX0VMRU1FTlQgPSAxNjsKLQotICBpbnQgZ2V0IGxlbmd0aCA9PiBfc3RvcmFnZS5sZW5ndGggfi8gNDsKLQotICBGbG9hdDMyeDQgb3BlcmF0b3JbXShpbnQgaW5kZXgpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDBdOwotICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMV07Ci0gICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAyXTsKLSAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDNdOwotICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIHZvaWQgb3BlcmF0b3JbXT0oaW50IGluZGV4LCBGbG9hdDMyeDQgdmFsdWUpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDBdID0gdmFsdWUuX3N0b3JhZ2VbMF07Ci0gICAgX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAxXSA9IHZhbHVlLl9zdG9yYWdlWzFdOwotICAgIF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMl0gPSB2YWx1ZS5fc3RvcmFnZVsyXTsKLSAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDNdID0gdmFsdWUuX3N0b3JhZ2VbM107Ci0gIH0KLQotICBMaXN0PEZsb2F0MzJ4ND4gc3VibGlzdChpbnQgc3RhcnQsIFtpbnQgZW5kXSkgewotICAgIGVuZCA9IF9jaGVja1N1Ymxpc3RBcmd1bWVudHMoc3RhcnQsIGVuZCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NExpc3QuX2V4dGVybmFsU3RvcmFnZSgKLSAgICAgICAgX3N0b3JhZ2Uuc3VibGlzdChzdGFydCAqIDQsIGVuZCAqIDQpKTsKLSAgfQotfQotCi0KLS8qKgotICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBJbnQzMng0IG51bWJlcnMgdGhhdCBpcyB2aWV3YWJsZSBhcyBhCi0gKiBbVHlwZWREYXRhXS4gRm9yIGxvbmcgbGlzdHMsIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCBiZSBjb25zaWRlcmFibHkgbW9yZQotICogc3BhY2UtIGFuZCB0aW1lLWVmZmljaWVudCB0aGFuIHRoZSBkZWZhdWx0IFtMaXN0XSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotY2xhc3MgSW50MzJ4NExpc3QKLSAgICBleHRlbmRzIE9iamVjdCB3aXRoIExpc3RNaXhpbjxJbnQzMng0PiwgRml4ZWRMZW5ndGhMaXN0TWl4aW48SW50MzJ4ND4KLSAgICBpbXBsZW1lbnRzIExpc3Q8SW50MzJ4ND4sIFR5cGVkRGF0YSB7Ci0KLSAgZmluYWwgVWludDMyTGlzdCBfc3RvcmFnZTsKLQotICBCeXRlQnVmZmVyIGdldCBidWZmZXIgPT4gX3N0b3JhZ2UuYnVmZmVyOwotCi0gIGludCBnZXQgbGVuZ3RoSW5CeXRlcyA9PiBfc3RvcmFnZS5sZW5ndGhJbkJ5dGVzOwotCi0gIGludCBnZXQgb2Zmc2V0SW5CeXRlcyA9PiBfc3RvcmFnZS5vZmZzZXRJbkJ5dGVzOwotCi0gIGludCBnZXQgZWxlbWVudFNpemVJbkJ5dGVzID0+IEJZVEVTX1BFUl9FTEVNRU5UOwotCi0gIHZvaWQgX2ludmFsaWRJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewotICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IucmFuZ2UoaW5kZXgsIDAsIGxlbmd0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBBcmd1bWVudEVycm9yKCdJbnZhbGlkIGxpc3QgaW5kZXggJGluZGV4Jyk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBfY2hlY2tJbmRleChpbnQgaW5kZXgsIGludCBsZW5ndGgpIHsKLSAgICBpZiAoSlMoJ2Jvb2wnLCAnKCMgPj4+IDAgIT0gIyknLCBpbmRleCwgaW5kZXgpCi0gICAgICAgIHx8IEpTKCdib29sJywgJyMgPj0gIycsIGluZGV4LCBsZW5ndGgpKSB7Ci0gICAgICBfaW52YWxpZEluZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIGludCBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCkgewotICAgIC8vIEZvciBgc3VibGlzdGAgdGhlIFtzdGFydF0gYW5kIFtlbmRdIGluZGljZXMgYXJlIGFsbG93ZWQgdG8gYmUgZXF1YWwgdG8KLSAgICAvLyBbbGVuZ3RoXS4gSG93ZXZlciwgW19jaGVja0luZGV4XSBvbmx5IGFsbG93cyBpbmRpY2VzIGluIHRoZSByYW5nZQotICAgIC8vIDAgLi4gbGVuZ3RoIC0gMS4gV2UgdGhlcmVmb3JlIGluY3JlbWVudCB0aGUgW2xlbmd0aF0gYXJndW1lbnQgYnkgb25lCi0gICAgLy8gZm9yIHRoZSBbX2NoZWNrSW5kZXhdIGNoZWNrcy4KLSAgICBfY2hlY2tJbmRleChzdGFydCwgbGVuZ3RoICsgMSk7Ci0gICAgaWYgKGVuZCA9PSBudWxsKSByZXR1cm4gbGVuZ3RoOwotICAgIF9jaGVja0luZGV4KGVuZCwgbGVuZ3RoICsgMSk7Ci0gICAgaWYgKHN0YXJ0ID4gZW5kKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgZW5kKTsKLSAgICByZXR1cm4gZW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbSW50MzJ4NExpc3RdIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIChpbiBlbGVtZW50cyksCi0gICAqIGFsbCBvZiB3aG9zZSBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IHplcm8uCi0gICAqLwotICBJbnQzMng0TGlzdChpbnQgbGVuZ3RoKSA6IF9zdG9yYWdlID0gbmV3IFVpbnQzMkxpc3QobGVuZ3RoICogNCk7Ci0KLSAgSW50MzJ4NExpc3QuX2V4dGVybmFsU3RvcmFnZShVaW50MzJMaXN0IHN0b3JhZ2UpIDogX3N0b3JhZ2UgPSBzdG9yYWdlOwotCi0gIEludDMyeDRMaXN0Ll9zbG93RnJvbUxpc3QoTGlzdDxJbnQzMng0PiBsaXN0KQotICAgICAgOiBfc3RvcmFnZSA9IG5ldyBVaW50MzJMaXN0KGxpc3QubGVuZ3RoICogNCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGUgPSBsaXN0W2ldOwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDBdID0gZS54OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDFdID0gZS55OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDJdID0gZS56OwotICAgICAgX3N0b3JhZ2VbKGkgKiA0KSArIDNdID0gZS53OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0ludDMyeDRMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAotICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgotICAgKi8KLSAgZmFjdG9yeSBJbnQzMng0TGlzdC5mcm9tTGlzdChMaXN0PEludDMyeDQ+IGxpc3QpIHsKLSAgICBpZiAobGlzdCBpcyBJbnQzMng0TGlzdCkgewotICAgICAgcmV0dXJuIG5ldyBJbnQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAotICAgICAgICAgIG5ldyBVaW50MzJMaXN0LmZyb21MaXN0KGxpc3QuX3N0b3JhZ2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBJbnQzMng0TGlzdC5fc2xvd0Zyb21MaXN0KGxpc3QpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgW0ludDMyeDRMaXN0XSBfdmlld18gb2YgdGhlIHNwZWNpZmllZCByZWdpb24gaW4gdGhlIHNwZWNpZmllZAotICAgKiBieXRlIGJ1ZmZlci4gQ2hhbmdlcyBpbiB0aGUgW0ludDMyeDRMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgSW50MzJ4NExpc3QudmlldyhCeXRlQnVmZmVyIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIFtpbnQgYnl0ZU9mZnNldCA9IDAsIGludCBsZW5ndGhdKQotICAgICAgOiBfc3RvcmFnZSA9IGJ1ZmZlci5hc1VpbnQzMkxpc3QoYnl0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAhPSBudWxsID8gbGVuZ3RoICogNCA6IG51bGwpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQgQllURVNfUEVSX0VMRU1FTlQgPSAxNjsKLQotICBpbnQgZ2V0IGxlbmd0aCA9PiBfc3RvcmFnZS5sZW5ndGggfi8gNDsKLQotICBJbnQzMng0IG9wZXJhdG9yW10oaW50IGluZGV4KSB7Ci0gICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgaW50IF94ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAwXTsKLSAgICBpbnQgX3kgPSBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDFdOwotICAgIGludCBfeiA9IF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMl07Ci0gICAgaW50IF93ID0gX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAzXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgdm9pZCBvcGVyYXRvcltdPShpbnQgaW5kZXgsIEludDMyeDQgdmFsdWUpIHsKLSAgICBfY2hlY2tJbmRleChpbmRleCwgbGVuZ3RoKTsKLSAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDBdID0gdmFsdWUuX3N0b3JhZ2VbMF07Ci0gICAgX3N0b3JhZ2VbKGluZGV4ICogNCkgKyAxXSA9IHZhbHVlLl9zdG9yYWdlWzFdOwotICAgIF9zdG9yYWdlWyhpbmRleCAqIDQpICsgMl0gPSB2YWx1ZS5fc3RvcmFnZVsyXTsKLSAgICBfc3RvcmFnZVsoaW5kZXggKiA0KSArIDNdID0gdmFsdWUuX3N0b3JhZ2VbM107Ci0gIH0KLQotICBMaXN0PEludDMyeDQ+IHN1Ymxpc3QoaW50IHN0YXJ0LCBbaW50IGVuZF0pIHsKLSAgICBlbmQgPSBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKHN0YXJ0LCBlbmQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0TGlzdC5fZXh0ZXJuYWxTdG9yYWdlKF9zdG9yYWdlLnN1Ymxpc3Qoc3RhcnQqNCwgZW5kKjQpKTsKLSAgfQotfQotCi0KLS8qKgotICogQSBmaXhlZC1sZW5ndGggbGlzdCBvZiBGbG9hdDY0eDIgbnVtYmVycyB0aGF0IGlzIHZpZXdhYmxlIGFzIGEKLSAqIFtUeXBlZERhdGFdLiBGb3IgbG9uZyBsaXN0cywgdGhpcyBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGNvbnNpZGVyYWJseSBtb3JlCi0gKiBzcGFjZS0gYW5kIHRpbWUtZWZmaWNpZW50IHRoYW4gdGhlIGRlZmF1bHQgW0xpc3RdIGltcGxlbWVudGF0aW9uLgotICovCi1jbGFzcyBGbG9hdDY0eDJMaXN0Ci0gICAgZXh0ZW5kcyBPYmplY3Qgd2l0aCBMaXN0TWl4aW48RmxvYXQ2NHgyPiwgRml4ZWRMZW5ndGhMaXN0TWl4aW48RmxvYXQ2NHgyPgotICAgIGltcGxlbWVudHMgTGlzdDxGbG9hdDY0eDI+LCBUeXBlZERhdGEgewotCi0gIGZpbmFsIEZsb2F0NjRMaXN0IF9zdG9yYWdlOwotCi0gIEJ5dGVCdWZmZXIgZ2V0IGJ1ZmZlciA9PiBfc3RvcmFnZS5idWZmZXI7Ci0KLSAgaW50IGdldCBsZW5ndGhJbkJ5dGVzID0+IF9zdG9yYWdlLmxlbmd0aEluQnl0ZXM7Ci0KLSAgaW50IGdldCBvZmZzZXRJbkJ5dGVzID0+IF9zdG9yYWdlLm9mZnNldEluQnl0ZXM7Ci0KLSAgaW50IGdldCBlbGVtZW50U2l6ZUluQnl0ZXMgPT4gQllURVNfUEVSX0VMRU1FTlQ7Ci0KLSAgdm9pZCBfaW52YWxpZEluZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7Ci0gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShpbmRleCwgMCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoJ0ludmFsaWQgbGlzdCBpbmRleCAkaW5kZXgnKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIF9jaGVja0luZGV4KGludCBpbmRleCwgaW50IGxlbmd0aCkgewotICAgIGlmIChKUygnYm9vbCcsICcoIyA+Pj4gMCAhPSAjKScsIGluZGV4LCBpbmRleCkgfHwgaW5kZXggPj0gbGVuZ3RoKSB7Ci0gICAgICBfaW52YWxpZEluZGV4KGluZGV4LCBsZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIGludCBfY2hlY2tTdWJsaXN0QXJndW1lbnRzKGludCBzdGFydCwgaW50IGVuZCwgaW50IGxlbmd0aCkgewotICAgIC8vIEZvciBgc3VibGlzdGAgdGhlIFtzdGFydF0gYW5kIFtlbmRdIGluZGljZXMgYXJlIGFsbG93ZWQgdG8gYmUgZXF1YWwgdG8KLSAgICAvLyBbbGVuZ3RoXS4gSG93ZXZlciwgW19jaGVja0luZGV4XSBvbmx5IGFsbG93cyBpbmRpY2VzIGluIHRoZSByYW5nZQotICAgIC8vIDAgLi4gbGVuZ3RoIC0gMS4gV2UgdGhlcmVmb3JlIGluY3JlbWVudCB0aGUgW2xlbmd0aF0gYXJndW1lbnQgYnkgb25lCi0gICAgLy8gZm9yIHRoZSBbX2NoZWNrSW5kZXhdIGNoZWNrcy4KLSAgICBfY2hlY2tJbmRleChzdGFydCwgbGVuZ3RoICsgMSk7Ci0gICAgaWYgKGVuZCA9PSBudWxsKSByZXR1cm4gbGVuZ3RoOwotICAgIF9jaGVja0luZGV4KGVuZCwgbGVuZ3RoICsgMSk7Ci0gICAgaWYgKHN0YXJ0ID4gZW5kKSB0aHJvdyBuZXcgUmFuZ2VFcnJvci5yYW5nZShzdGFydCwgMCwgZW5kKTsKLSAgICByZXR1cm4gZW5kOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gb2YgdGhlIHNwZWNpZmllZCBsZW5ndGggKGluIGVsZW1lbnRzKSwKLSAgICogYWxsIG9mIHdob3NlIGVsZW1lbnRzIGFyZSBpbml0aWFsbHkgemVyby4KLSAgICovCi0gIEZsb2F0NjR4Mkxpc3QoaW50IGxlbmd0aCkgOiBfc3RvcmFnZSA9IG5ldyBGbG9hdDY0TGlzdChsZW5ndGggKiAyKTsKLQotICBGbG9hdDY0eDJMaXN0Ll9leHRlcm5hbFN0b3JhZ2UoRmxvYXQ2NExpc3Qgc3RvcmFnZSkgOiBfc3RvcmFnZSA9IHN0b3JhZ2U7Ci0KLSAgRmxvYXQ2NHgyTGlzdC5fc2xvd0Zyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBsaXN0KQotICAgICAgOiBfc3RvcmFnZSA9IG5ldyBGbG9hdDY0TGlzdChsaXN0Lmxlbmd0aCAqIDIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBlID0gbGlzdFtpXTsKLSAgICAgIF9zdG9yYWdlWyhpICogMikgKyAwXSA9IGUueDsKLSAgICAgIF9zdG9yYWdlWyhpICogMikgKyAxXSA9IGUueTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIFtGbG9hdDY0eDJMaXN0XSB3aXRoIHRoZSBzYW1lIHNpemUgYXMgdGhlIFtlbGVtZW50c10gbGlzdAotICAgKiBhbmQgY29waWVzIG92ZXIgdGhlIGVsZW1lbnRzLgotICAgKi8KLSAgZmFjdG9yeSBGbG9hdDY0eDJMaXN0LmZyb21MaXN0KExpc3Q8RmxvYXQ2NHgyPiBsaXN0KSB7Ci0gICAgaWYgKGxpc3QgaXMgRmxvYXQ2NHgyTGlzdCkgewotICAgICAgRmxvYXQ2NHgyTGlzdCBuYXRpdmVMaXN0ID0gbGlzdCBhcyBGbG9hdDY0eDJMaXN0OwotICAgICAgcmV0dXJuIG5ldyBGbG9hdDY0eDJMaXN0Ll9leHRlcm5hbFN0b3JhZ2UoCi0gICAgICAgICAgbmV3IEZsb2F0NjRMaXN0LmZyb21MaXN0KG5hdGl2ZUxpc3QuX3N0b3JhZ2UpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBGbG9hdDY0eDJMaXN0Ll9zbG93RnJvbUxpc3QobGlzdCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBbRmxvYXQ2NHgyTGlzdF0gX3ZpZXdfIG9mIHRoZSBzcGVjaWZpZWQgcmVnaW9uIGluIHRoZSBzcGVjaWZpZWQKLSAgICogYnl0ZSBidWZmZXIuIENoYW5nZXMgaW4gdGhlIFtGbG9hdDY0eDJMaXN0XSB3aWxsIGJlIHZpc2libGUgaW4gdGhlIGJ5dGUKLSAgICogYnVmZmVyIGFuZCB2aWNlIHZlcnNhLiBJZiB0aGUgW29mZnNldEluQnl0ZXNdIGluZGV4IG9mIHRoZSByZWdpb24gaXMgbm90Ci0gICAqIHNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gemVybyAodGhlIGZpcnN0IGJ5dGUgaW4gdGhlIGJ5dGUgYnVmZmVyKS4KLSAgICogSWYgdGhlIGxlbmd0aCBpcyBub3Qgc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byBudWxsLCB3aGljaCBpbmRpY2F0ZXMKLSAgICogdGhhdCB0aGUgdmlldyBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGJ5dGUgYnVmZmVyLgotICAgKgotICAgKiBUaHJvd3MgW1JhbmdlRXJyb3JdIGlmIFtvZmZzZXRJbkJ5dGVzXSBvciBbbGVuZ3RoXSBhcmUgbmVnYXRpdmUsIG9yCi0gICAqIGlmIFtvZmZzZXRJbkJ5dGVzXSArIChbbGVuZ3RoXSAqIGVsZW1lbnRTaXplSW5CeXRlcykgaXMgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSBsZW5ndGggb2YgW2J1ZmZlcl0uCi0gICAqCi0gICAqIFRocm93cyBbQXJndW1lbnRFcnJvcl0gaWYgW29mZnNldEluQnl0ZXNdIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0gICAqIEJZVEVTX1BFUl9FTEVNRU5ULgotICAgKi8KLSAgRmxvYXQ2NHgyTGlzdC52aWV3KEJ5dGVCdWZmZXIgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgW2ludCBieXRlT2Zmc2V0ID0gMCwgaW50IGxlbmd0aF0pCi0gICAgICA6IF9zdG9yYWdlID0gYnVmZmVyLmFzRmxvYXQ2NExpc3QoYnl0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggIT0gbnVsbCA/IGxlbmd0aCAqIDIgOiBudWxsKTsKLQotICBzdGF0aWMgY29uc3QgaW50IEJZVEVTX1BFUl9FTEVNRU5UID0gMTY7Ci0KLSAgaW50IGdldCBsZW5ndGggPT4gX3N0b3JhZ2UubGVuZ3RoIH4vIDI7Ci0KLSAgRmxvYXQ2NHgyIG9wZXJhdG9yW10oaW50IGluZGV4KSB7Ci0gICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbKGluZGV4ICogMikgKyAwXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsoaW5kZXggKiAyKSArIDFdOwotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKF94LCBfeSk7Ci0gIH0KLQotICB2b2lkIG9wZXJhdG9yW109KGludCBpbmRleCwgRmxvYXQ2NHgyIHZhbHVlKSB7Ci0gICAgX2NoZWNrSW5kZXgoaW5kZXgsIGxlbmd0aCk7Ci0gICAgX3N0b3JhZ2VbKGluZGV4ICogMikgKyAwXSA9IHZhbHVlLl9zdG9yYWdlWzBdOwotICAgIF9zdG9yYWdlWyhpbmRleCAqIDIpICsgMV0gPSB2YWx1ZS5fc3RvcmFnZVsxXTsKLSAgfQotCi0gIExpc3Q8RmxvYXQ2NHgyPiBzdWJsaXN0KGludCBzdGFydCwgW2ludCBlbmRdKSB7Ci0gICAgZW5kID0gX2NoZWNrU3VibGlzdEFyZ3VtZW50cyhzdGFydCwgZW5kLCBsZW5ndGgpOwotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyTGlzdC5fZXh0ZXJuYWxTdG9yYWdlKAotICAgICAgICBfc3RvcmFnZS5zdWJsaXN0KHN0YXJ0ICogMiwgZW5kICogMikpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2Ugb2YgRGFydCBGbG9hdDMyeDQgaW1tdXRhYmxlIHZhbHVlIHR5cGUgYW5kIG9wZXJhdGlvbnMuCi0gKiBGbG9hdDMyeDQgc3RvcmVzIDQgMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBpbiAibGFuZXMiLgotICogVGhlIGxhbmVzIGFyZSAieCIsICJ5IiwgInoiLCBhbmQgInciIHJlc3BlY3RpdmVseS4KLSAqLwotY2xhc3MgRmxvYXQzMng0IHsKLSAgZmluYWwgX3N0b3JhZ2UgPSBuZXcgRmxvYXQzMkxpc3QoNCk7Ci0KLSAgRmxvYXQzMng0KGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHosIGRvdWJsZSB3KSB7Ci0gICAgX3N0b3JhZ2VbMF0gPSB4OwotICAgIF9zdG9yYWdlWzFdID0geTsKLSAgICBfc3RvcmFnZVsyXSA9IHo7Ci0gICAgX3N0b3JhZ2VbM10gPSB3OwotICB9Ci0gIEZsb2F0MzJ4NC5zcGxhdChkb3VibGUgdikgewotICAgIF9zdG9yYWdlWzBdID0gdjsKLSAgICBfc3RvcmFnZVsxXSA9IHY7Ci0gICAgX3N0b3JhZ2VbMl0gPSB2OwotICAgIF9zdG9yYWdlWzNdID0gdjsKLSAgfQotICBGbG9hdDMyeDQuemVybygpOwotICAvLy8gUmV0dXJucyBhIGJpdC13aXNlIGNvcHkgb2YgW3hdIGFzIGEgRmxvYXQzMng0LgotICBGbG9hdDMyeDQuZnJvbUludDMyeDRCaXRzKEludDMyeDQgeCkgewotICAgIHZhciB2aWV3ID0gbmV3IEZsb2F0MzJMaXN0LnZpZXcoeC5fc3RvcmFnZS5idWZmZXIpOwotICAgIF9zdG9yYWdlWzBdID0gdmlld1swXTsKLSAgICBfc3RvcmFnZVsxXSA9IHZpZXdbMV07Ci0gICAgX3N0b3JhZ2VbMl0gPSB2aWV3WzJdOwotICAgIF9zdG9yYWdlWzNdID0gdmlld1szXTsKLSAgfQotICBGbG9hdDMyeDQuZnJvbUZsb2F0NjR4MihGbG9hdDY0eDIgdikgewotICAgIF9zdG9yYWdlWzBdID0gdi5fc3RvcmFnZVswXTsKLSAgICBfc3RvcmFnZVsxXSA9IHYuX3N0b3JhZ2VbMV07Ci0gIH0KLQotICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdbJHtfc3RvcmFnZVswXX0sICR7X3N0b3JhZ2VbMV19LCAke19zdG9yYWdlWzJdfSwgJHtfc3RvcmFnZVszXX1dJzsKLSAgfQotCi0gICAvLy8gQWRkaXRpb24gb3BlcmF0b3IuCi0gIEZsb2F0MzJ4NCBvcGVyYXRvcisoRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF0gKyBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSArIG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdICsgb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM10gKyBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gTmVnYXRlIG9wZXJhdG9yLgotICBGbG9hdDMyeDQgb3BlcmF0b3ItKCkgewotICAgIGRvdWJsZSBfeCA9IC1fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSAtX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF96ID0gLV9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdyA9IC1fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gU3VidHJhY3Rpb24gb3BlcmF0b3IuCi0gIEZsb2F0MzJ4NCBvcGVyYXRvci0oRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF0gLSBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSAtIG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdIC0gb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM10gLSBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCi0gIEZsb2F0MzJ4NCBvcGVyYXRvciooRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF0gKiBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSAqIG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdICogb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM10gKiBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gRGl2aXNpb24gb3BlcmF0b3IuCi0gIEZsb2F0MzJ4NCBvcGVyYXRvci8oRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF0gLyBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSAvIG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdIC8gb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM10gLyBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmVsYXRpb25hbCBsZXNzIHRoYW4uCi0gIEludDMyeDQgbGVzc1RoYW4oRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgYm9vbCBfY3ggPSBfc3RvcmFnZVswXSA8IG90aGVyLl9zdG9yYWdlWzBdOwotICAgIGJvb2wgX2N5ID0gX3N0b3JhZ2VbMV0gPCBvdGhlci5fc3RvcmFnZVsxXTsKLSAgICBib29sIF9jeiA9IF9zdG9yYWdlWzJdIDwgb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgYm9vbCBfY3cgPSBfc3RvcmFnZVszXSA8IG90aGVyLl9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfY3ggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3kgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3ogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3cgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDApOwotICB9Ci0KLSAgLy8vIFJlbGF0aW9uYWwgbGVzcyB0aGFuIG9yIGVxdWFsLgotICBJbnQzMng0IGxlc3NUaGFuT3JFcXVhbChGbG9hdDMyeDQgb3RoZXIpIHsKLSAgICBib29sIF9jeCA9IF9zdG9yYWdlWzBdIDw9IG90aGVyLl9zdG9yYWdlWzBdOwotICAgIGJvb2wgX2N5ID0gX3N0b3JhZ2VbMV0gPD0gb3RoZXIuX3N0b3JhZ2VbMV07Ci0gICAgYm9vbCBfY3ogPSBfc3RvcmFnZVsyXSA8PSBvdGhlci5fc3RvcmFnZVsyXTsKLSAgICBib29sIF9jdyA9IF9zdG9yYWdlWzNdIDw9IG90aGVyLl9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfY3ggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3kgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3ogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBfY3cgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDApOwotICB9Ci0KLSAgLy8vIFJlbGF0aW9uYWwgZ3JlYXRlciB0aGFuLgotICBJbnQzMng0IGdyZWF0ZXJUaGFuKEZsb2F0MzJ4NCBvdGhlcikgewotICAgIGJvb2wgX2N4ID0gX3N0b3JhZ2VbMF0gPiBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBib29sIF9jeSA9IF9zdG9yYWdlWzFdID4gb3RoZXIuX3N0b3JhZ2VbMV07Ci0gICAgYm9vbCBfY3ogPSBfc3RvcmFnZVsyXSA+IG90aGVyLl9zdG9yYWdlWzJdOwotICAgIGJvb2wgX2N3ID0gX3N0b3JhZ2VbM10gPiBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX2N4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N5ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N6ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwKTsKLSAgfQotCi0gIC8vLyBSZWxhdGlvbmFsIGdyZWF0ZXIgdGhhbiBvciBlcXVhbC4KLSAgSW50MzJ4NCBncmVhdGVyVGhhbk9yRXF1YWwoRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgYm9vbCBfY3ggPSBfc3RvcmFnZVswXSA+PSBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBib29sIF9jeSA9IF9zdG9yYWdlWzFdID49IG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGJvb2wgX2N6ID0gX3N0b3JhZ2VbMl0gPj0gb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgYm9vbCBfY3cgPSBfc3RvcmFnZVszXSA+PSBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX2N4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N5ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N6ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwKTsKLSAgfQotCi0gIC8vLyBSZWxhdGlvbmFsIGVxdWFsLgotICBJbnQzMng0IGVxdWFsKEZsb2F0MzJ4NCBvdGhlcikgewotICAgIGJvb2wgX2N4ID0gX3N0b3JhZ2VbMF0gPT0gb3RoZXIuX3N0b3JhZ2VbMF07Ci0gICAgYm9vbCBfY3kgPSBfc3RvcmFnZVsxXSA9PSBvdGhlci5fc3RvcmFnZVsxXTsKLSAgICBib29sIF9jeiA9IF9zdG9yYWdlWzJdID09IG90aGVyLl9zdG9yYWdlWzJdOwotICAgIGJvb2wgX2N3ID0gX3N0b3JhZ2VbM10gPT0gb3RoZXIuX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF9jeCA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jeSA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jeiA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9jdyA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MCk7Ci0gIH0KLQotICAvLy8gUmVsYXRpb25hbCBub3QtZXF1YWwuCi0gIEludDMyeDQgbm90RXF1YWwoRmxvYXQzMng0IG90aGVyKSB7Ci0gICAgYm9vbCBfY3ggPSBfc3RvcmFnZVswXSAhPSBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBib29sIF9jeSA9IF9zdG9yYWdlWzFdICE9IG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGJvb2wgX2N6ID0gX3N0b3JhZ2VbMl0gIT0gb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgYm9vbCBfY3cgPSBfc3RvcmFnZVszXSAhPSBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX2N4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N5ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N6ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgX2N3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwKTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIGEgY29weSBvZiBbdGhpc10gZWFjaCBsYW5lIGJlaW5nIHNjYWxlZCBieSBbc10uCi0gIEZsb2F0MzJ4NCBzY2FsZShkb3VibGUgcykgewotICAgIGRvdWJsZSBfeCA9IHMgKiBfc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBzICogX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF96ID0gcyAqIF9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdyA9IHMgKiBfc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQzMng0XS4KLSAgRmxvYXQzMng0IGFicygpIHsKLSAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXS5hYnMoKTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXS5hYnMoKTsKLSAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsyXS5hYnMoKTsKLSAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXS5hYnMoKTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gQ2xhbXBzIFt0aGlzXSB0byBiZSBpbiB0aGUgcmFuZ2UgW2xvd2VyTGltaXRdLVt1cHBlckxpbWl0XS4KLSAgRmxvYXQzMng0IGNsYW1wKEZsb2F0MzJ4NCBsb3dlckxpbWl0LCBGbG9hdDMyeDQgdXBwZXJMaW1pdCkgewotICAgIGRvdWJsZSBfbHggPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzBdOwotICAgIGRvdWJsZSBfbHkgPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfbHogPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfbHcgPSBsb3dlckxpbWl0Ll9zdG9yYWdlWzNdOwotICAgIGRvdWJsZSBfdXggPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzBdOwotICAgIGRvdWJsZSBfdXkgPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfdXogPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdXcgPSB1cHBlckxpbWl0Ll9zdG9yYWdlWzNdOwotICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdOwotICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdOwotICAgIC8vIE1BWChNSU4oc2VsZiwgdXBwZXIpLCBsb3dlcikuCi0gICAgX3ggPSBfeCA+IF91eCA/IF91eCA6IF94OwotICAgIF95ID0gX3kgPiBfdXkgPyBfdXkgOiBfeTsKLSAgICBfeiA9IF96ID4gX3V6ID8gX3V6IDogX3o7Ci0gICAgX3cgPSBfdyA+IF91dyA/IF91dyA6IF93OwotICAgIF94ID0gX3ggPCBfbHggPyBfbHggOiBfeDsKLSAgICBfeSA9IF95IDwgX2x5ID8gX2x5IDogX3k7Ci0gICAgX3ogPSBfeiA8IF9seiA/IF9seiA6IF96OwotICAgIF93ID0gX3cgPCBfbHcgPyBfbHcgOiBfdzsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gRXh0cmFjdGVkIHggdmFsdWUuCi0gIGRvdWJsZSBnZXQgeCA9PiBfc3RvcmFnZVswXTsKLSAgLy8vIEV4dHJhY3RlZCB5IHZhbHVlLgotICBkb3VibGUgZ2V0IHkgPT4gX3N0b3JhZ2VbMV07Ci0gIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4KLSAgZG91YmxlIGdldCB6ID0+IF9zdG9yYWdlWzJdOwotICAvLy8gRXh0cmFjdGVkIHcgdmFsdWUuCi0gIGRvdWJsZSBnZXQgdyA9PiBfc3RvcmFnZVszXTsKLQotICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXQgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KLSAgaW50IGdldCBzaWduTWFzayB7Ci0gICAgdmFyIHZpZXcgPSBuZXcgVWludDMyTGlzdC52aWV3KF9zdG9yYWdlLmJ1ZmZlcik7Ci0gICAgdmFyIG14ID0gKHZpZXdbMF0gJiAweDgwMDAwMDAwKSA+PiAzMTsKLSAgICB2YXIgbXkgPSAodmlld1sxXSAmIDB4ODAwMDAwMDApID4+IDMxOwotICAgIHZhciBteiA9ICh2aWV3WzJdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgdmFyIG13ID0gKHZpZXdbM10gJiAweDgwMDAwMDAwKSA+PiAzMTsKLSAgICByZXR1cm4gbXggfCBteSA8PCAxIHwgbXogPDwgMiB8IG13IDw8IDM7Ci0gIH0KLQotICAvLy8gTWFzayBwYXNzZWQgdG8gW3NodWZmbGVdIGFuZCBbc2h1ZmZsZU1peF0uCi0gIHN0YXRpYyBjb25zdCBpbnQgWFhYWCA9IDB4MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFhZID0gMHg0MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFhaID0gMHg4MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFhXID0gMHhDMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFlYID0gMHgxMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFlZID0gMHg1MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFlaID0gMHg5MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFlXID0gMHhEMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFpYID0gMHgyMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFpZID0gMHg2MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFpaID0gMHhBMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFpXID0gMHhFMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFdYID0gMHgzMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFdZID0gMHg3MDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFdaID0gMHhCMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWFdXID0gMHhGMDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVhYID0gMHg0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWFkgPSAweDQ0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWFogPSAweDg0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWFcgPSAweEM0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWVggPSAweDE0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWVkgPSAweDU0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWVogPSAweDk0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWVcgPSAweEQ0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWlggPSAweDI0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWlkgPSAweDY0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWlogPSAweEE0OwotICBzdGF0aWMgY29uc3QgaW50IFhZWlcgPSAweEU0OwotICBzdGF0aWMgY29uc3QgaW50IFhZV1ggPSAweDM0OwotICBzdGF0aWMgY29uc3QgaW50IFhZV1kgPSAweDc0OwotICBzdGF0aWMgY29uc3QgaW50IFhZV1ogPSAweEI0OwotICBzdGF0aWMgY29uc3QgaW50IFhZV1cgPSAweEY0OwotICBzdGF0aWMgY29uc3QgaW50IFhaWFggPSAweDg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpYWSA9IDB4NDg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpYWiA9IDB4ODg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpYVyA9IDB4Qzg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpZWCA9IDB4MTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpZWSA9IDB4NTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpZWiA9IDB4OTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpZVyA9IDB4RDg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpaWCA9IDB4Mjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpaWSA9IDB4Njg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpaWiA9IDB4QTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpaVyA9IDB4RTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpXWCA9IDB4Mzg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpXWSA9IDB4Nzg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpXWiA9IDB4Qjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFpXVyA9IDB4Rjg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdYWCA9IDB4QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1hZID0gMHg0QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1haID0gMHg4QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1hXID0gMHhDQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1lYID0gMHgxQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1lZID0gMHg1QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1laID0gMHg5QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1lXID0gMHhEQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1pYID0gMHgyQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1pZID0gMHg2QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1paID0gMHhBQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1pXID0gMHhFQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1dYID0gMHgzQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1dZID0gMHg3QzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1daID0gMHhCQzsKLSAgc3RhdGljIGNvbnN0IGludCBYV1dXID0gMHhGQzsKLSAgc3RhdGljIGNvbnN0IGludCBZWFhYID0gMHgxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWFkgPSAweDQxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWFogPSAweDgxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWFcgPSAweEMxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWVggPSAweDExOwotICBzdGF0aWMgY29uc3QgaW50IFlYWVkgPSAweDUxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWVogPSAweDkxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWVcgPSAweEQxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWlggPSAweDIxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWlkgPSAweDYxOwotICBzdGF0aWMgY29uc3QgaW50IFlYWlogPSAweEExOwotICBzdGF0aWMgY29uc3QgaW50IFlYWlcgPSAweEUxOwotICBzdGF0aWMgY29uc3QgaW50IFlYV1ggPSAweDMxOwotICBzdGF0aWMgY29uc3QgaW50IFlYV1kgPSAweDcxOwotICBzdGF0aWMgY29uc3QgaW50IFlYV1ogPSAweEIxOwotICBzdGF0aWMgY29uc3QgaW50IFlYV1cgPSAweEYxOwotICBzdGF0aWMgY29uc3QgaW50IFlZWFggPSAweDU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlYWSA9IDB4NDU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlYWiA9IDB4ODU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlYVyA9IDB4QzU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlZWCA9IDB4MTU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlZWSA9IDB4NTU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlZWiA9IDB4OTU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlZVyA9IDB4RDU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlaWCA9IDB4MjU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlaWSA9IDB4NjU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlaWiA9IDB4QTU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlaVyA9IDB4RTU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlXWCA9IDB4MzU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlXWSA9IDB4NzU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlXWiA9IDB4QjU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVlXVyA9IDB4RjU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpYWCA9IDB4OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlhZID0gMHg0OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlhaID0gMHg4OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlhXID0gMHhDOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWllYID0gMHgxOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWllZID0gMHg1OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWllaID0gMHg5OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWllXID0gMHhEOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlpYID0gMHgyOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlpZID0gMHg2OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlpaID0gMHhBOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWlpXID0gMHhFOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWldYID0gMHgzOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWldZID0gMHg3OTsKLSAgc3RhdGljIGNvbnN0IGludCBZWldaID0gMHhCOTsKLSAgc3RhdGljIGNvbnN0IGludCBZWldXID0gMHhGOTsKLSAgc3RhdGljIGNvbnN0IGludCBZV1hYID0gMHhEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWFkgPSAweDREOwotICBzdGF0aWMgY29uc3QgaW50IFlXWFogPSAweDhEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWFcgPSAweENEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWVggPSAweDFEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWVkgPSAweDVEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWVogPSAweDlEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWVcgPSAweEREOwotICBzdGF0aWMgY29uc3QgaW50IFlXWlggPSAweDJEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWlkgPSAweDZEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWlogPSAweEFEOwotICBzdGF0aWMgY29uc3QgaW50IFlXWlcgPSAweEVEOwotICBzdGF0aWMgY29uc3QgaW50IFlXV1ggPSAweDNEOwotICBzdGF0aWMgY29uc3QgaW50IFlXV1kgPSAweDdEOwotICBzdGF0aWMgY29uc3QgaW50IFlXV1ogPSAweEJEOwotICBzdGF0aWMgY29uc3QgaW50IFlXV1cgPSAweEZEOwotICBzdGF0aWMgY29uc3QgaW50IFpYWFggPSAweDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhYWSA9IDB4NDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhYWiA9IDB4ODI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhYVyA9IDB4QzI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhZWCA9IDB4MTI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhZWSA9IDB4NTI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhZWiA9IDB4OTI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhZVyA9IDB4RDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhaWCA9IDB4MjI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhaWSA9IDB4NjI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhaWiA9IDB4QTI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhaVyA9IDB4RTI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhXWCA9IDB4MzI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhXWSA9IDB4NzI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhXWiA9IDB4QjI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlhXVyA9IDB4RjI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllYWCA9IDB4NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVhZID0gMHg0NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVhaID0gMHg4NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVhXID0gMHhDNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVlYID0gMHgxNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVlZID0gMHg1NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVlaID0gMHg5NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVlXID0gMHhENjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVpYID0gMHgyNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVpZID0gMHg2NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVpaID0gMHhBNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVpXID0gMHhFNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVdYID0gMHgzNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVdZID0gMHg3NjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVdaID0gMHhCNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWVdXID0gMHhGNjsKLSAgc3RhdGljIGNvbnN0IGludCBaWlhYID0gMHhBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWFkgPSAweDRBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWFogPSAweDhBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWFcgPSAweENBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWVggPSAweDFBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWVkgPSAweDVBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWVogPSAweDlBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWVcgPSAweERBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWlggPSAweDJBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWlkgPSAweDZBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWlogPSAweEFBOwotICBzdGF0aWMgY29uc3QgaW50IFpaWlcgPSAweEVBOwotICBzdGF0aWMgY29uc3QgaW50IFpaV1ggPSAweDNBOwotICBzdGF0aWMgY29uc3QgaW50IFpaV1kgPSAweDdBOwotICBzdGF0aWMgY29uc3QgaW50IFpaV1ogPSAweEJBOwotICBzdGF0aWMgY29uc3QgaW50IFpaV1cgPSAweEZBOwotICBzdGF0aWMgY29uc3QgaW50IFpXWFggPSAweEU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldYWSA9IDB4NEU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldYWiA9IDB4OEU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldYVyA9IDB4Q0U7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldZWCA9IDB4MUU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldZWSA9IDB4NUU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldZWiA9IDB4OUU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldZVyA9IDB4REU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldaWCA9IDB4MkU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldaWSA9IDB4NkU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldaWiA9IDB4QUU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldaVyA9IDB4RUU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldXWCA9IDB4M0U7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldXWSA9IDB4N0U7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldXWiA9IDB4QkU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWldXVyA9IDB4RkU7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hYWCA9IDB4MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFhZID0gMHg0MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFhaID0gMHg4MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFhXID0gMHhDMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFlYID0gMHgxMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFlZID0gMHg1MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFlaID0gMHg5MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFlXID0gMHhEMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFpYID0gMHgyMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFpZID0gMHg2MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFpaID0gMHhBMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFpXID0gMHhFMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFdYID0gMHgzMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFdZID0gMHg3MzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFdaID0gMHhCMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWFdXID0gMHhGMzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVhYID0gMHg3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWFkgPSAweDQ3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWFogPSAweDg3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWFcgPSAweEM3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWVggPSAweDE3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWVkgPSAweDU3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWVogPSAweDk3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWVcgPSAweEQ3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWlggPSAweDI3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWlkgPSAweDY3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWlogPSAweEE3OwotICBzdGF0aWMgY29uc3QgaW50IFdZWlcgPSAweEU3OwotICBzdGF0aWMgY29uc3QgaW50IFdZV1ggPSAweDM3OwotICBzdGF0aWMgY29uc3QgaW50IFdZV1kgPSAweDc3OwotICBzdGF0aWMgY29uc3QgaW50IFdZV1ogPSAweEI3OwotICBzdGF0aWMgY29uc3QgaW50IFdZV1cgPSAweEY3OwotICBzdGF0aWMgY29uc3QgaW50IFdaWFggPSAweEI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pYWSA9IDB4NEI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pYWiA9IDB4OEI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pYVyA9IDB4Q0I7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pZWCA9IDB4MUI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pZWSA9IDB4NUI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pZWiA9IDB4OUI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pZVyA9IDB4REI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1paWCA9IDB4MkI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1paWSA9IDB4NkI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1paWiA9IDB4QUI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1paVyA9IDB4RUI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pXWCA9IDB4M0I7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pXWSA9IDB4N0I7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pXWiA9IDB4QkI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1pXVyA9IDB4RkI7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dYWCA9IDB4RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1hZID0gMHg0RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1haID0gMHg4RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1hXID0gMHhDRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1lYID0gMHgxRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1lZID0gMHg1RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1laID0gMHg5RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1lXID0gMHhERjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1pYID0gMHgyRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1pZID0gMHg2RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1paID0gMHhBRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1pXID0gMHhFRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1dYID0gMHgzRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1dZID0gMHg3RjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1daID0gMHhCRjsKLSAgc3RhdGljIGNvbnN0IGludCBXV1dXID0gMHhGRjsKLQotICAvLy8gU2h1ZmZsZSB0aGUgbGFuZSB2YWx1ZXMuIFttYXNrXSBtdXN0IGJlIG9uZSBvZiB0aGUgMjU2IHNodWZmbGUgY29uc3RhbnRzLgotICBGbG9hdDMyeDQgc2h1ZmZsZShpbnQgbSkgewotICAgIGlmICgobSA8IDApIHx8IChtID4gMjU1KSkgewotICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ21hc2sgJG0gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAuLjI1NiknKTsKLSAgICB9Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbbSAmIDB4M107Ci0gICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbKG0gPj4gMikgJiAweDNdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWyhtID4+IDQpICYgMHgzXTsKLSAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVsobSA+PiA2KSAmIDB4M107Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzIGluIFt0aGlzXSBhbmQgW290aGVyXS4gVGhlIHJldHVybmVkCi0gIC8vLyBGbG9hdDMyeDQgd2lsbCBoYXZlIFhZIGxhbmVzIGZyb20gW3RoaXNdIGFuZCBaVyBsYW5lcyBmcm9tIFtvdGhlcl0uCi0gIC8vLyBVc2VzIHRoZSBzYW1lIFttYXNrXSBhcyBbc2h1ZmZsZV0uCi0gIEZsb2F0MzJ4NCBzaHVmZmxlTWl4KEZsb2F0MzJ4NCBvdGhlciwgaW50IG0pIHsKLSAgICBpZiAoKG0gPCAwKSB8fCAobSA+IDI1NSkpIHsKLSAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdtYXNrICRtIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4yNTYpJyk7Ci0gICAgfQotICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlW20gJiAweDNdOwotICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWyhtID4+IDIpICYgMHgzXTsKLSAgICBkb3VibGUgX3ogPSBvdGhlci5fc3RvcmFnZVsobSA+PiA0KSAmIDB4M107Ci0gICAgZG91YmxlIF93ID0gb3RoZXIuX3N0b3JhZ2VbKG0gPj4gNikgJiAweDNdOwotICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3hdIGxhbmUuCi0gIEZsb2F0MzJ4NCB3aXRoWChkb3VibGUgeCkgewotICAgIGRvdWJsZSBfeCA9IHg7Ci0gICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF96ID0gX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIENvcHkgW3RoaXNdIGFuZCByZXBsYWNlIHRoZSBbeV0gbGFuZS4KLSAgRmxvYXQzMng0IHdpdGhZKGRvdWJsZSB5KSB7Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF07Ci0gICAgZG91YmxlIF95ID0geTsKLSAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsyXTsKLSAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gQ29weSBbdGhpc10gYW5kIHJlcGxhY2UgdGhlIFt6XSBsYW5lLgotICBGbG9hdDMyeDQgd2l0aFooZG91YmxlIHopIHsKLSAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXTsKLSAgICBkb3VibGUgX3ogPSB6OwotICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBDb3B5IFt0aGlzXSBhbmQgcmVwbGFjZSB0aGUgW3ddIGxhbmUuCi0gIEZsb2F0MzJ4NCB3aXRoVyhkb3VibGUgdykgewotICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdOwotICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdyA9IHc7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtaW5pbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgotICBGbG9hdDMyeDQgbWluKEZsb2F0MzJ4NCBvdGhlcikgewotICAgIGRvdWJsZSBfeCA9IF9zdG9yYWdlWzBdIDwgb3RoZXIuX3N0b3JhZ2VbMF0gPwotICAgICAgICBfc3RvcmFnZVswXSA6IG90aGVyLl9zdG9yYWdlWzBdOwotICAgIGRvdWJsZSBfeSA9IF9zdG9yYWdlWzFdIDwgb3RoZXIuX3N0b3JhZ2VbMV0gPwotICAgICAgICBfc3RvcmFnZVsxXSA6IG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGRvdWJsZSBfeiA9IF9zdG9yYWdlWzJdIDwgb3RoZXIuX3N0b3JhZ2VbMl0gPwotICAgICAgICBfc3RvcmFnZVsyXSA6IG90aGVyLl9zdG9yYWdlWzJdOwotICAgIGRvdWJsZSBfdyA9IF9zdG9yYWdlWzNdIDwgb3RoZXIuX3N0b3JhZ2VbM10gPwotICAgICAgICBfc3RvcmFnZVszXSA6IG90aGVyLl9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIHRoZSBsYW5lLXdpc2UgbWF4aW11bSB2YWx1ZSBpbiBbdGhpc10gb3IgW290aGVyXS4KLSAgRmxvYXQzMng0IG1heChGbG9hdDMyeDQgb3RoZXIpIHsKLSAgICBkb3VibGUgX3ggPSBfc3RvcmFnZVswXSA+IG90aGVyLl9zdG9yYWdlWzBdID8KLSAgICAgICAgX3N0b3JhZ2VbMF0gOiBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBkb3VibGUgX3kgPSBfc3RvcmFnZVsxXSA+IG90aGVyLl9zdG9yYWdlWzFdID8KLSAgICAgICAgX3N0b3JhZ2VbMV0gOiBvdGhlci5fc3RvcmFnZVsxXTsKLSAgICBkb3VibGUgX3ogPSBfc3RvcmFnZVsyXSA+IG90aGVyLl9zdG9yYWdlWzJdID8KLSAgICAgICAgX3N0b3JhZ2VbMl0gOiBvdGhlci5fc3RvcmFnZVsyXTsKLSAgICBkb3VibGUgX3cgPSBfc3RvcmFnZVszXSA+IG90aGVyLl9zdG9yYWdlWzNdID8KLSAgICAgICAgX3N0b3JhZ2VbM10gOiBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEZsb2F0MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgc3F1YXJlIHJvb3Qgb2YgW3RoaXNdLgotICBGbG9hdDMyeDQgc3FydCgpIHsKLSAgICBkb3VibGUgX3ggPSBNYXRoLnNxcnQoX3N0b3JhZ2VbMF0pOwotICAgIGRvdWJsZSBfeSA9IE1hdGguc3FydChfc3RvcmFnZVsxXSk7Ci0gICAgZG91YmxlIF96ID0gTWF0aC5zcXJ0KF9zdG9yYWdlWzJdKTsKLSAgICBkb3VibGUgX3cgPSBNYXRoLnNxcnQoX3N0b3JhZ2VbM10pOwotICAgIHJldHVybiBuZXcgRmxvYXQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIHRoZSByZWNpcHJvY2FsIG9mIFt0aGlzXS4KLSAgRmxvYXQzMng0IHJlY2lwcm9jYWwoKSB7Ci0gICAgZG91YmxlIF94ID0gMS4wIC8gX3N0b3JhZ2VbMF07Ci0gICAgZG91YmxlIF95ID0gMS4wIC8gX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF96ID0gMS4wIC8gX3N0b3JhZ2VbMl07Ci0gICAgZG91YmxlIF93ID0gMS4wIC8gX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIHRoZSByZWNpcHJvY2FsIG9mIFt0aGlzXS4KLSAgRmxvYXQzMng0IHJlY2lwcm9jYWxTcXJ0KCkgewotICAgIGRvdWJsZSBfeCA9IE1hdGguc3FydCgxLjAgLyBfc3RvcmFnZVswXSk7Ci0gICAgZG91YmxlIF95ID0gTWF0aC5zcXJ0KDEuMCAvIF9zdG9yYWdlWzFdKTsKLSAgICBkb3VibGUgX3ogPSBNYXRoLnNxcnQoMS4wIC8gX3N0b3JhZ2VbMl0pOwotICAgIGRvdWJsZSBfdyA9IE1hdGguc3FydCgxLjAgLyBfc3RvcmFnZVszXSk7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci19Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2Ugb2YgRGFydCBJbnQzMng0IGFuZCBvcGVyYXRpb25zLgotICogSW50MzJ4NCBzdG9yZXMgNCAzMi1iaXQgYml0LW1hc2tzIGluICJsYW5lcyIuCi0gKiBUaGUgbGFuZXMgYXJlICJ4IiwgInkiLCAieiIsIGFuZCAidyIgcmVzcGVjdGl2ZWx5LgotICovCi1jbGFzcyBJbnQzMng0IHsKLSAgZmluYWwgX3N0b3JhZ2UgPSBuZXcgSW50MzJMaXN0KDQpOwotCi0gIEludDMyeDQoaW50IHgsIGludCB5LCBpbnQgeiwgaW50IHcpIHsKLSAgICBfc3RvcmFnZVswXSA9IHg7Ci0gICAgX3N0b3JhZ2VbMV0gPSB5OwotICAgIF9zdG9yYWdlWzJdID0gejsKLSAgICBfc3RvcmFnZVszXSA9IHc7Ci0gIH0KLQotICBJbnQzMng0LmJvb2woYm9vbCB4LCBib29sIHksIGJvb2wgeiwgYm9vbCB3KSB7Ci0gICAgX3N0b3JhZ2VbMF0gPSB4ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOwotICAgIF9zdG9yYWdlWzFdID0geSA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MDsKLSAgICBfc3RvcmFnZVsyXSA9IHogPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDA7Ci0gICAgX3N0b3JhZ2VbM10gPSB3ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBiaXQtd2lzZSBjb3B5IG9mIFt4XSBhcyBhIEludDMyeDQuCi0gIEludDMyeDQuZnJvbUZsb2F0MzJ4NEJpdHMoRmxvYXQzMng0IHgpIHsKLSAgICB2YXIgdmlldyA9IG5ldyBVaW50MzJMaXN0LnZpZXcoeC5fc3RvcmFnZS5idWZmZXIpOwotICAgIF9zdG9yYWdlWzBdID0gdmlld1swXTsKLSAgICBfc3RvcmFnZVsxXSA9IHZpZXdbMV07Ci0gICAgX3N0b3JhZ2VbMl0gPSB2aWV3WzJdOwotICAgIF9zdG9yYWdlWzNdID0gdmlld1szXTsKLSAgfQotCi0gIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gJ1ske19zdG9yYWdlWzBdfSwgJHtfc3RvcmFnZVsxXX0sICR7X3N0b3JhZ2VbMl19LCAke19zdG9yYWdlWzNdfV0nOwotICB9Ci0KLSAgLy8vIFRoZSBiaXQtd2lzZSBvciBvcGVyYXRvci4KLSAgSW50MzJ4NCBvcGVyYXRvcnwoSW50MzJ4NCBvdGhlcikgewotICAgIGludCBfeCA9IF9zdG9yYWdlWzBdIHwgb3RoZXIuX3N0b3JhZ2VbMF07Ci0gICAgaW50IF95ID0gX3N0b3JhZ2VbMV0gfCBvdGhlci5fc3RvcmFnZVsxXTsKLSAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXSB8IG90aGVyLl9zdG9yYWdlWzJdOwotICAgIGludCBfdyA9IF9zdG9yYWdlWzNdIHwgb3RoZXIuX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBUaGUgYml0LXdpc2UgYW5kIG9wZXJhdG9yLgotICBJbnQzMng0IG9wZXJhdG9yJihJbnQzMng0IG90aGVyKSB7Ci0gICAgaW50IF94ID0gX3N0b3JhZ2VbMF0gJiBvdGhlci5fc3RvcmFnZVswXTsKLSAgICBpbnQgX3kgPSBfc3RvcmFnZVsxXSAmIG90aGVyLl9zdG9yYWdlWzFdOwotICAgIGludCBfeiA9IF9zdG9yYWdlWzJdICYgb3RoZXIuX3N0b3JhZ2VbMl07Ci0gICAgaW50IF93ID0gX3N0b3JhZ2VbM10gJiBvdGhlci5fc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFRoZSBiaXQtd2lzZSB4b3Igb3BlcmF0b3IuCi0gIEludDMyeDQgb3BlcmF0b3JeKEludDMyeDQgb3RoZXIpIHsKLSAgICBpbnQgX3ggPSBfc3RvcmFnZVswXSBeIG90aGVyLl9zdG9yYWdlWzBdOwotICAgIGludCBfeSA9IF9zdG9yYWdlWzFdIF4gb3RoZXIuX3N0b3JhZ2VbMV07Ci0gICAgaW50IF96ID0gX3N0b3JhZ2VbMl0gXiBvdGhlci5fc3RvcmFnZVsyXTsKLSAgICBpbnQgX3cgPSBfc3RvcmFnZVszXSBeIG90aGVyLl9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICBJbnQzMng0IG9wZXJhdG9yKyhJbnQzMng0IG90aGVyKSB7Ci0gICAgdmFyIHIgPSBuZXcgSW50MzJ4NCgwLCAwLCAwLCAwKTsKLSAgICByLl9zdG9yYWdlWzBdID0gKF9zdG9yYWdlWzBdICsgb3RoZXIuX3N0b3JhZ2VbMF0pOwotICAgIHIuX3N0b3JhZ2VbMV0gPSAoX3N0b3JhZ2VbMV0gKyBvdGhlci5fc3RvcmFnZVsxXSk7Ci0gICAgci5fc3RvcmFnZVsyXSA9IChfc3RvcmFnZVsyXSArIG90aGVyLl9zdG9yYWdlWzJdKTsKLSAgICByLl9zdG9yYWdlWzNdID0gKF9zdG9yYWdlWzNdICsgb3RoZXIuX3N0b3JhZ2VbM10pOwotICAgIHJldHVybiByOwotICB9Ci0KLSAgSW50MzJ4NCBvcGVyYXRvci0oSW50MzJ4NCBvdGhlcikgewotICAgIHZhciByID0gbmV3IEludDMyeDQoMCwgMCwgMCwgMCk7Ci0gICAgci5fc3RvcmFnZVswXSA9IChfc3RvcmFnZVswXSAtIG90aGVyLl9zdG9yYWdlWzBdKTsKLSAgICByLl9zdG9yYWdlWzFdID0gKF9zdG9yYWdlWzFdIC0gb3RoZXIuX3N0b3JhZ2VbMV0pOwotICAgIHIuX3N0b3JhZ2VbMl0gPSAoX3N0b3JhZ2VbMl0gLSBvdGhlci5fc3RvcmFnZVsyXSk7Ci0gICAgci5fc3RvcmFnZVszXSA9IChfc3RvcmFnZVszXSAtIG90aGVyLl9zdG9yYWdlWzNdKTsKLSAgICByZXR1cm4gcjsKLSAgfQotCi0gIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geCBsYW5lLgotICBpbnQgZ2V0IHggPT4gX3N0b3JhZ2VbMF07Ci0gIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geSBsYW5lLgotICBpbnQgZ2V0IHkgPT4gX3N0b3JhZ2VbMV07Ci0gIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20geiBsYW5lLgotICBpbnQgZ2V0IHogPT4gX3N0b3JhZ2VbMl07Ci0gIC8vLyBFeHRyYWN0IDMyLWJpdCBtYXNrIGZyb20gdyBsYW5lLgotICBpbnQgZ2V0IHcgPT4gX3N0b3JhZ2VbM107Ci0KLSAgLy8vIEV4dHJhY3QgdGhlIHRvcCBiaXQgZnJvbSBlYWNoIGxhbmUgcmV0dXJuIHRoZW0gaW4gdGhlIGZpcnN0IDQgYml0cy4KLSAgaW50IGdldCBzaWduTWFzayB7Ci0gICAgaW50IG14ID0gKF9zdG9yYWdlWzBdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgaW50IG15ID0gKF9zdG9yYWdlWzFdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgaW50IG16ID0gKF9zdG9yYWdlWzJdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgaW50IG13ID0gKF9zdG9yYWdlWzNdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgcmV0dXJuIG14IHwgbXkgPDwgMSB8IG16IDw8IDIgfCBtdyA8PCAzOwotICB9Ci0KLSAgLy8vIE1hc2sgcGFzc2VkIHRvIFtzaHVmZmxlXSBhbmQgW3NodWZmbGVNaXhdLgotICBzdGF0aWMgY29uc3QgaW50IFhYWFggPSAweDA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhYWSA9IDB4NDA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhYWiA9IDB4ODA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhYVyA9IDB4QzA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhZWCA9IDB4MTA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhZWSA9IDB4NTA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhZWiA9IDB4OTA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhZVyA9IDB4RDA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhaWCA9IDB4MjA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhaWSA9IDB4NjA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhaWiA9IDB4QTA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhaVyA9IDB4RTA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhXWCA9IDB4MzA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhXWSA9IDB4NzA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhXWiA9IDB4QjA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFhXVyA9IDB4RjA7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFlYWCA9IDB4NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVhZID0gMHg0NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVhaID0gMHg4NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVhXID0gMHhDNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVlYID0gMHgxNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVlZID0gMHg1NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVlaID0gMHg5NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVlXID0gMHhENDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVpYID0gMHgyNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVpZID0gMHg2NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVpaID0gMHhBNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVpXID0gMHhFNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVdYID0gMHgzNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVdZID0gMHg3NDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVdaID0gMHhCNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWVdXID0gMHhGNDsKLSAgc3RhdGljIGNvbnN0IGludCBYWlhYID0gMHg4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWFkgPSAweDQ4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWFogPSAweDg4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWFcgPSAweEM4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWVggPSAweDE4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWVkgPSAweDU4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWVogPSAweDk4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWVcgPSAweEQ4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWlggPSAweDI4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWlkgPSAweDY4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWlogPSAweEE4OwotICBzdGF0aWMgY29uc3QgaW50IFhaWlcgPSAweEU4OwotICBzdGF0aWMgY29uc3QgaW50IFhaV1ggPSAweDM4OwotICBzdGF0aWMgY29uc3QgaW50IFhaV1kgPSAweDc4OwotICBzdGF0aWMgY29uc3QgaW50IFhaV1ogPSAweEI4OwotICBzdGF0aWMgY29uc3QgaW50IFhaV1cgPSAweEY4OwotICBzdGF0aWMgY29uc3QgaW50IFhXWFggPSAweEM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdYWSA9IDB4NEM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdYWiA9IDB4OEM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdYVyA9IDB4Q0M7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdZWCA9IDB4MUM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdZWSA9IDB4NUM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdZWiA9IDB4OUM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdZVyA9IDB4REM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdaWCA9IDB4MkM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdaWSA9IDB4NkM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdaWiA9IDB4QUM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdaVyA9IDB4RUM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdXWCA9IDB4M0M7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdXWSA9IDB4N0M7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdXWiA9IDB4QkM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWFdXVyA9IDB4RkM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVhYWCA9IDB4MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFhZID0gMHg0MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFhaID0gMHg4MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFhXID0gMHhDMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFlYID0gMHgxMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFlZID0gMHg1MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFlaID0gMHg5MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFlXID0gMHhEMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFpYID0gMHgyMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFpZID0gMHg2MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFpaID0gMHhBMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFpXID0gMHhFMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFdYID0gMHgzMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFdZID0gMHg3MTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFdaID0gMHhCMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWFdXID0gMHhGMTsKLSAgc3RhdGljIGNvbnN0IGludCBZWVhYID0gMHg1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWFkgPSAweDQ1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWFogPSAweDg1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWFcgPSAweEM1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWVggPSAweDE1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWVkgPSAweDU1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWVogPSAweDk1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWVcgPSAweEQ1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWlggPSAweDI1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWlkgPSAweDY1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWlogPSAweEE1OwotICBzdGF0aWMgY29uc3QgaW50IFlZWlcgPSAweEU1OwotICBzdGF0aWMgY29uc3QgaW50IFlZV1ggPSAweDM1OwotICBzdGF0aWMgY29uc3QgaW50IFlZV1kgPSAweDc1OwotICBzdGF0aWMgY29uc3QgaW50IFlZV1ogPSAweEI1OwotICBzdGF0aWMgY29uc3QgaW50IFlZV1cgPSAweEY1OwotICBzdGF0aWMgY29uc3QgaW50IFlaWFggPSAweDk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpYWSA9IDB4NDk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpYWiA9IDB4ODk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpYVyA9IDB4Qzk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpZWCA9IDB4MTk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpZWSA9IDB4NTk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpZWiA9IDB4OTk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpZVyA9IDB4RDk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpaWCA9IDB4Mjk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpaWSA9IDB4Njk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpaWiA9IDB4QTk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpaVyA9IDB4RTk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpXWCA9IDB4Mzk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpXWSA9IDB4Nzk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpXWiA9IDB4Qjk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVpXVyA9IDB4Rjk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWVdYWCA9IDB4RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1hZID0gMHg0RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1haID0gMHg4RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1hXID0gMHhDRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1lYID0gMHgxRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1lZID0gMHg1RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1laID0gMHg5RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1lXID0gMHhERDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1pYID0gMHgyRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1pZID0gMHg2RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1paID0gMHhBRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1pXID0gMHhFRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1dYID0gMHgzRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1dZID0gMHg3RDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1daID0gMHhCRDsKLSAgc3RhdGljIGNvbnN0IGludCBZV1dXID0gMHhGRDsKLSAgc3RhdGljIGNvbnN0IGludCBaWFhYID0gMHgyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWFkgPSAweDQyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWFogPSAweDgyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWFcgPSAweEMyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWVggPSAweDEyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWVkgPSAweDUyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWVogPSAweDkyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWVcgPSAweEQyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWlggPSAweDIyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWlkgPSAweDYyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWlogPSAweEEyOwotICBzdGF0aWMgY29uc3QgaW50IFpYWlcgPSAweEUyOwotICBzdGF0aWMgY29uc3QgaW50IFpYV1ggPSAweDMyOwotICBzdGF0aWMgY29uc3QgaW50IFpYV1kgPSAweDcyOwotICBzdGF0aWMgY29uc3QgaW50IFpYV1ogPSAweEIyOwotICBzdGF0aWMgY29uc3QgaW50IFpYV1cgPSAweEYyOwotICBzdGF0aWMgY29uc3QgaW50IFpZWFggPSAweDY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllYWSA9IDB4NDY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllYWiA9IDB4ODY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllYVyA9IDB4QzY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllZWCA9IDB4MTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllZWSA9IDB4NTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllZWiA9IDB4OTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllZVyA9IDB4RDY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllaWCA9IDB4MjY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllaWSA9IDB4NjY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllaWiA9IDB4QTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllaVyA9IDB4RTY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllXWCA9IDB4MzY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllXWSA9IDB4NzY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllXWiA9IDB4QjY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWllXVyA9IDB4RjY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgWlpYWCA9IDB4QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlhZID0gMHg0QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlhaID0gMHg4QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlhXID0gMHhDQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWllYID0gMHgxQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWllZID0gMHg1QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWllaID0gMHg5QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWllXID0gMHhEQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlpYID0gMHgyQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlpZID0gMHg2QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlpaID0gMHhBQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWlpXID0gMHhFQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWldYID0gMHgzQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWldZID0gMHg3QTsKLSAgc3RhdGljIGNvbnN0IGludCBaWldaID0gMHhCQTsKLSAgc3RhdGljIGNvbnN0IGludCBaWldXID0gMHhGQTsKLSAgc3RhdGljIGNvbnN0IGludCBaV1hYID0gMHhFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWFkgPSAweDRFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWFogPSAweDhFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWFcgPSAweENFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWVggPSAweDFFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWVkgPSAweDVFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWVogPSAweDlFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWVcgPSAweERFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWlggPSAweDJFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWlkgPSAweDZFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWlogPSAweEFFOwotICBzdGF0aWMgY29uc3QgaW50IFpXWlcgPSAweEVFOwotICBzdGF0aWMgY29uc3QgaW50IFpXV1ggPSAweDNFOwotICBzdGF0aWMgY29uc3QgaW50IFpXV1kgPSAweDdFOwotICBzdGF0aWMgY29uc3QgaW50IFpXV1ogPSAweEJFOwotICBzdGF0aWMgY29uc3QgaW50IFpXV1cgPSAweEZFOwotICBzdGF0aWMgY29uc3QgaW50IFdYWFggPSAweDM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hYWSA9IDB4NDM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hYWiA9IDB4ODM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hYVyA9IDB4QzM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hZWCA9IDB4MTM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hZWSA9IDB4NTM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hZWiA9IDB4OTM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hZVyA9IDB4RDM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1haWCA9IDB4MjM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1haWSA9IDB4NjM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1haWiA9IDB4QTM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1haVyA9IDB4RTM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hXWCA9IDB4MzM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hXWSA9IDB4NzM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hXWiA9IDB4QjM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1hXVyA9IDB4RjM7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1lYWCA9IDB4NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVhZID0gMHg0NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVhaID0gMHg4NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVhXID0gMHhDNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVlYID0gMHgxNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVlZID0gMHg1NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVlaID0gMHg5NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVlXID0gMHhENzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVpYID0gMHgyNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVpZID0gMHg2NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVpaID0gMHhBNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVpXID0gMHhFNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVdYID0gMHgzNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVdZID0gMHg3NzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVdaID0gMHhCNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWVdXID0gMHhGNzsKLSAgc3RhdGljIGNvbnN0IGludCBXWlhYID0gMHhCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWFkgPSAweDRCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWFogPSAweDhCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWFcgPSAweENCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWVggPSAweDFCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWVkgPSAweDVCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWVogPSAweDlCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWVcgPSAweERCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWlggPSAweDJCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWlkgPSAweDZCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWlogPSAweEFCOwotICBzdGF0aWMgY29uc3QgaW50IFdaWlcgPSAweEVCOwotICBzdGF0aWMgY29uc3QgaW50IFdaV1ggPSAweDNCOwotICBzdGF0aWMgY29uc3QgaW50IFdaV1kgPSAweDdCOwotICBzdGF0aWMgY29uc3QgaW50IFdaV1ogPSAweEJCOwotICBzdGF0aWMgY29uc3QgaW50IFdaV1cgPSAweEZCOwotICBzdGF0aWMgY29uc3QgaW50IFdXWFggPSAweEY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dYWSA9IDB4NEY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dYWiA9IDB4OEY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dYVyA9IDB4Q0Y7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dZWCA9IDB4MUY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dZWSA9IDB4NUY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dZWiA9IDB4OUY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dZVyA9IDB4REY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1daWCA9IDB4MkY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1daWSA9IDB4NkY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1daWiA9IDB4QUY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1daVyA9IDB4RUY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dXWCA9IDB4M0Y7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dXWSA9IDB4N0Y7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dXWiA9IDB4QkY7Ci0gIHN0YXRpYyBjb25zdCBpbnQgV1dXVyA9IDB4RkY7Ci0KLSAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzLiBbbWFza10gbXVzdCBiZSBvbmUgb2YgdGhlIDI1NiBzaHVmZmxlIGNvbnN0YW50cy4KLSAgSW50MzJ4NCBzaHVmZmxlKGludCBtYXNrKSB7Ci0gICAgaWYgKChtYXNrIDwgMCkgfHwgKG1hc2sgPiAyNTUpKSB7Ci0gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWFzayAkbWFzayBtdXN0IGJlIGluIHRoZSByYW5nZSBbMC4uMjU2KScpOwotICAgIH0KLSAgICBpbnQgX3ggPSBfc3RvcmFnZVttYXNrICYgMHgzXTsKLSAgICBpbnQgX3kgPSBfc3RvcmFnZVsobWFzayA+PiAyKSAmIDB4M107Ci0gICAgaW50IF96ID0gX3N0b3JhZ2VbKG1hc2sgPj4gNCkgJiAweDNdOwotICAgIGludCBfdyA9IF9zdG9yYWdlWyhtYXNrID4+IDYpICYgMHgzXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFNodWZmbGUgdGhlIGxhbmUgdmFsdWVzIGluIFt0aGlzXSBhbmQgW290aGVyXS4gVGhlIHJldHVybmVkCi0gIC8vLyBJbnQzMng0IHdpbGwgaGF2ZSBYWSBsYW5lcyBmcm9tIFt0aGlzXSBhbmQgWlcgbGFuZXMgZnJvbSBbb3RoZXJdLgotICAvLy8gVXNlcyB0aGUgc2FtZSBbbWFza10gYXMgW3NodWZmbGVdLgotICBJbnQzMng0IHNodWZmbGVNaXgoSW50MzJ4NCBvdGhlciwgaW50IG1hc2spIHsKLSAgICBpZiAoKG1hc2sgPCAwKSB8fCAobWFzayA+IDI1NSkpIHsKLSAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdtYXNrICRtYXNrIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLi4yNTYpJyk7Ci0gICAgfQotICAgIGludCBfeCA9IF9zdG9yYWdlW21hc2sgJiAweDNdOwotICAgIGludCBfeSA9IF9zdG9yYWdlWyhtYXNrID4+IDIpICYgMHgzXTsKLSAgICBpbnQgX3ogPSBvdGhlci5fc3RvcmFnZVsobWFzayA+PiA0KSAmIDB4M107Ci0gICAgaW50IF93ID0gb3RoZXIuX3N0b3JhZ2VbKG1hc2sgPj4gNikgJiAweDNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KLSAgSW50MzJ4NCB3aXRoWChpbnQgeCkgewotICAgIGludCBfeCA9IHg7Ci0gICAgaW50IF95ID0gX3N0b3JhZ2VbMV07Ci0gICAgaW50IF96ID0gX3N0b3JhZ2VbMl07Ci0gICAgaW50IF93ID0gX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgotICBJbnQzMng0IHdpdGhZKGludCB5KSB7Ci0gICAgaW50IF94ID0gX3N0b3JhZ2VbMF07Ci0gICAgaW50IF95ID0geTsKLSAgICBpbnQgX3ogPSBfc3RvcmFnZVsyXTsKLSAgICBpbnQgX3cgPSBfc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHogdmFsdWUuCi0gIEludDMyeDQgd2l0aFooaW50IHopIHsKLSAgICBpbnQgX3ggPSBfc3RvcmFnZVswXTsKLSAgICBpbnQgX3kgPSBfc3RvcmFnZVsxXTsKLSAgICBpbnQgX3ogPSB6OwotICAgIGludCBfdyA9IF9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgdyB2YWx1ZS4KLSAgSW50MzJ4NCB3aXRoVyhpbnQgdykgewotICAgIGludCBfeCA9IF9zdG9yYWdlWzBdOwotICAgIGludCBfeSA9IF9zdG9yYWdlWzFdOwotICAgIGludCBfeiA9IF9zdG9yYWdlWzJdOwotICAgIGludCBfdyA9IHc7Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgotICBib29sIGdldCBmbGFnWCA9PiBfc3RvcmFnZVswXSAhPSAweDA7Ci0gIC8vLyBFeHRyYWN0ZWQgeSB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgotICBib29sIGdldCBmbGFnWSA9PiBfc3RvcmFnZVsxXSAhPSAweDA7Ci0gIC8vLyBFeHRyYWN0ZWQgeiB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgotICBib29sIGdldCBmbGFnWiA9PiBfc3RvcmFnZVsyXSAhPSAweDA7Ci0gIC8vLyBFeHRyYWN0ZWQgdyB2YWx1ZS4gUmV0dXJucyBmYWxzZSBmb3IgMCwgdHJ1ZSBmb3IgYW55IG90aGVyIHZhbHVlLgotICBib29sIGdldCBmbGFnVyA9PiBfc3RvcmFnZVszXSAhPSAweDA7Ci0KLSAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHggdmFsdWUuCi0gIEludDMyeDQgd2l0aEZsYWdYKGJvb2wgeCkgewotICAgIGludCBfeCA9IHggPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDA7Ci0gICAgaW50IF95ID0gX3N0b3JhZ2VbMV07Ci0gICAgaW50IF96ID0gX3N0b3JhZ2VbMl07Ci0gICAgaW50IF93ID0gX3N0b3JhZ2VbM107Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBSZXR1cm5zIGEgbmV3IFtJbnQzMng0XSBjb3BpZWQgZnJvbSBbdGhpc10gd2l0aCBhIG5ldyB5IHZhbHVlLgotICBJbnQzMng0IHdpdGhGbGFnWShib29sIHkpIHsKLSAgICBpbnQgX3ggPSBfc3RvcmFnZVswXTsKLSAgICBpbnQgX3kgPSB5ID09IHRydWUgPyAweEZGRkZGRkZGIDogMHgwOwotICAgIGludCBfeiA9IF9zdG9yYWdlWzJdOwotICAgIGludCBfdyA9IF9zdG9yYWdlWzNdOwotICAgIHJldHVybiBuZXcgSW50MzJ4NChfeCwgX3ksIF96LCBfdyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyBhIG5ldyBbSW50MzJ4NF0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeiB2YWx1ZS4KLSAgSW50MzJ4NCB3aXRoRmxhZ1ooYm9vbCB6KSB7Ci0gICAgaW50IF94ID0gX3N0b3JhZ2VbMF07Ci0gICAgaW50IF95ID0gX3N0b3JhZ2VbMV07Ci0gICAgaW50IF96ID0geiA9PSB0cnVlID8gMHhGRkZGRkZGRiA6IDB4MDsKLSAgICBpbnQgX3cgPSBfc3RvcmFnZVszXTsKLSAgICByZXR1cm4gbmV3IEludDMyeDQoX3gsIF95LCBfeiwgX3cpOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBuZXcgW0ludDMyeDRdIGNvcGllZCBmcm9tIFt0aGlzXSB3aXRoIGEgbmV3IHcgdmFsdWUuCi0gIEludDMyeDQgd2l0aEZsYWdXKGJvb2wgdykgewotICAgIGludCBfeCA9IF9zdG9yYWdlWzBdOwotICAgIGludCBfeSA9IF9zdG9yYWdlWzFdOwotICAgIGludCBfeiA9IF9zdG9yYWdlWzJdOwotICAgIGludCBfdyA9IHcgPT0gdHJ1ZSA/IDB4RkZGRkZGRkYgOiAweDA7Ci0gICAgcmV0dXJuIG5ldyBJbnQzMng0KF94LCBfeSwgX3osIF93KTsKLSAgfQotCi0gIC8vLyBNZXJnZSBbdHJ1ZVZhbHVlXSBhbmQgW2ZhbHNlVmFsdWVdIGJhc2VkIG9uIFt0aGlzXScgYml0IG1hc2s6Ci0gIC8vLyBTZWxlY3QgYml0IGZyb20gW3RydWVWYWx1ZV0gd2hlbiBiaXQgaW4gW3RoaXNdIGlzIG9uLgotICAvLy8gU2VsZWN0IGJpdCBmcm9tIFtmYWxzZVZhbHVlXSB3aGVuIGJpdCBpbiBbdGhpc10gaXMgb2ZmLgotICBGbG9hdDMyeDQgc2VsZWN0KEZsb2F0MzJ4NCB0cnVlVmFsdWUsIEZsb2F0MzJ4NCBmYWxzZVZhbHVlKSB7Ci0gICAgdmFyIHRydWVWaWV3ID0gbmV3IEludDMyTGlzdC52aWV3KHRydWVWYWx1ZS5fc3RvcmFnZS5idWZmZXIpOwotICAgIHZhciBmYWxzZVZpZXcgPSBuZXcgSW50MzJMaXN0LnZpZXcoZmFsc2VWYWx1ZS5fc3RvcmFnZS5idWZmZXIpOwotICAgIGludCBjbXggPSBfc3RvcmFnZVswXTsKLSAgICBpbnQgY215ID0gX3N0b3JhZ2VbMV07Ci0gICAgaW50IGNteiA9IF9zdG9yYWdlWzJdOwotICAgIGludCBjbXcgPSBfc3RvcmFnZVszXTsKLSAgICBpbnQgc3R4ID0gdHJ1ZVZpZXdbMF07Ci0gICAgaW50IHN0eSA9IHRydWVWaWV3WzFdOwotICAgIGludCBzdHogPSB0cnVlVmlld1syXTsKLSAgICBpbnQgc3R3ID0gdHJ1ZVZpZXdbM107Ci0gICAgaW50IHNmeCA9IGZhbHNlVmlld1swXTsKLSAgICBpbnQgc2Z5ID0gZmFsc2VWaWV3WzFdOwotICAgIGludCBzZnogPSBmYWxzZVZpZXdbMl07Ci0gICAgaW50IHNmdyA9IGZhbHNlVmlld1szXTsKLSAgICBpbnQgX3ggPSAoY214ICYgc3R4KSB8ICh+Y214ICYgc2Z4KTsKLSAgICBpbnQgX3kgPSAoY215ICYgc3R5KSB8ICh+Y215ICYgc2Z5KTsKLSAgICBpbnQgX3ogPSAoY216ICYgc3R6KSB8ICh+Y216ICYgc2Z6KTsKLSAgICBpbnQgX3cgPSAoY213ICYgc3R3KSB8ICh+Y213ICYgc2Z3KTsKLSAgICB2YXIgciA9IG5ldyBGbG9hdDMyeDQoMC4wLCAwLjAsIDAuMCwgMC4wKTsKLSAgICB2YXIgclZpZXcgPSBuZXcgSW50MzJMaXN0LnZpZXcoci5fc3RvcmFnZS5idWZmZXIpOwotICAgIHJWaWV3WzBdID0gX3g7Ci0gICAgclZpZXdbMV0gPSBfeTsKLSAgICByVmlld1syXSA9IF96OwotICAgIHJWaWV3WzNdID0gX3c7Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLX0KLQotY2xhc3MgRmxvYXQ2NHgyIHsKLSAgZmluYWwgX3N0b3JhZ2UgPSBuZXcgRmxvYXQ2NExpc3QoMik7Ci0KLSAgRmxvYXQ2NHgyKGRvdWJsZSB4LCBkb3VibGUgeSkgewotICAgIF9zdG9yYWdlWzBdID0geDsKLSAgICBfc3RvcmFnZVsxXSA9IHk7Ci0gIH0KLQotICBGbG9hdDY0eDIuc3BsYXQoZG91YmxlIHYpIHsKLSAgICBfc3RvcmFnZVswXSA9IHY7Ci0gICAgX3N0b3JhZ2VbMV0gPSB2OwotICB9Ci0KLSAgRmxvYXQ2NHgyLnplcm8oKTsKLQotICBGbG9hdDY0eDIuZnJvbUZsb2F0MzJ4NChGbG9hdDMyeDQgdikgewotICAgIF9zdG9yYWdlWzBdID0gdi5fc3RvcmFnZVswXTsKLSAgICBfc3RvcmFnZVsxXSA9IHYuX3N0b3JhZ2VbMV07Ci0gIH0KLQotICBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuICdbJHtfc3RvcmFnZVswXX0sICR7X3N0b3JhZ2VbMV19XSc7Ci0gIH0KLQotICAvLy8gQWRkaXRpb24gb3BlcmF0b3IuCi0gIEZsb2F0NjR4MiBvcGVyYXRvcisoRmxvYXQ2NHgyIG90aGVyKSB7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoX3N0b3JhZ2VbMF0gKyBvdGhlci5fc3RvcmFnZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBfc3RvcmFnZVsxXSArIG90aGVyLl9zdG9yYWdlWzFdKTsKLSAgfQotCi0gIC8vLyBOZWdhdGUgb3BlcmF0b3IuCi0gIEZsb2F0NjR4MiBvcGVyYXRvci0oKSB7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoLV9zdG9yYWdlWzBdLCAtX3N0b3JhZ2VbMV0pOwotICB9Ci0KLSAgLy8vIFN1YnRyYWN0aW9uIG9wZXJhdG9yLgotICBGbG9hdDY0eDIgb3BlcmF0b3ItKEZsb2F0NjR4MiBvdGhlcikgewotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKF9zdG9yYWdlWzBdIC0gb3RoZXIuX3N0b3JhZ2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2VbMV0gLSBvdGhlci5fc3RvcmFnZVsxXSk7Ci0gIH0KLSAgLy8vIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yLgotICBGbG9hdDY0eDIgb3BlcmF0b3IqKEZsb2F0NjR4MiBvdGhlcikgewotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKF9zdG9yYWdlWzBdICogb3RoZXIuX3N0b3JhZ2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2VbMV0gKiBvdGhlci5fc3RvcmFnZVsxXSk7Ci0gIH0KLSAgLy8vIERpdmlzaW9uIG9wZXJhdG9yLgotICBGbG9hdDY0eDIgb3BlcmF0b3IvKEZsb2F0NjR4MiBvdGhlcikgewotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKF9zdG9yYWdlWzBdIC8gb3RoZXIuX3N0b3JhZ2VbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2VbMV0gLyBvdGhlci5fc3RvcmFnZVsxXSk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyBhIGNvcHkgb2YgW3RoaXNdIGVhY2ggbGFuZSBiZWluZyBzY2FsZWQgYnkgW3NdLgotICBGbG9hdDY0eDIgc2NhbGUoZG91YmxlIHMpIHsKLSAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mihfc3RvcmFnZVswXSAqIHMsIF9zdG9yYWdlWzFdICogcyk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhpcyBbRmxvYXQ2NHgyXS4KLSAgRmxvYXQ2NHgyIGFicygpIHsKLSAgICByZXR1cm4gbmV3IEZsb2F0NjR4Mihfc3RvcmFnZVswXS5hYnMoKSwgX3N0b3JhZ2VbMV0uYWJzKCkpOwotICB9Ci0KLSAgLy8vIENsYW1wcyBbdGhpc10gdG8gYmUgaW4gdGhlIHJhbmdlIFtsb3dlckxpbWl0XS1bdXBwZXJMaW1pdF0uCi0gIEZsb2F0NjR4MiBjbGFtcChGbG9hdDY0eDIgbG93ZXJMaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZsb2F0NjR4MiB1cHBlckxpbWl0KSB7Ci0gICAgZG91YmxlIF9seCA9IGxvd2VyTGltaXQuX3N0b3JhZ2VbMF07Ci0gICAgZG91YmxlIF9seSA9IGxvd2VyTGltaXQuX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF91eCA9IHVwcGVyTGltaXQuX3N0b3JhZ2VbMF07Ci0gICAgZG91YmxlIF91eSA9IHVwcGVyTGltaXQuX3N0b3JhZ2VbMV07Ci0gICAgZG91YmxlIF94ID0gX3N0b3JhZ2VbMF07Ci0gICAgZG91YmxlIF95ID0gX3N0b3JhZ2VbMV07Ci0gICAgLy8gTUFYKE1JTihzZWxmLCB1cHBlciksIGxvd2VyKS4KLSAgICBfeCA9IF94ID4gX3V4ID8gX3V4IDogX3g7Ci0gICAgX3kgPSBfeSA+IF91eSA/IF91eSA6IF95OwotICAgIF94ID0gX3ggPCBfbHggPyBfbHggOiBfeDsKLSAgICBfeSA9IF95IDwgX2x5ID8gX2x5IDogX3k7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoX3gsIF95KTsKLSAgfQotCi0gIC8vLyBFeHRyYWN0ZWQgeCB2YWx1ZS4KLSAgZG91YmxlIGdldCB4ID0+IF9zdG9yYWdlWzBdOwotICAvLy8gRXh0cmFjdGVkIHkgdmFsdWUuCi0gIGRvdWJsZSBnZXQgeSA9PiBfc3RvcmFnZVsxXTsKLQotICAvLy8gRXh0cmFjdCB0aGUgc2lnbiBiaXRzIGZyb20gZWFjaCBsYW5lIHJldHVybiB0aGVtIGluIHRoZSBmaXJzdCAyIGJpdHMuCi0gIGludCBnZXQgc2lnbk1hc2sgewotICAgIHZhciB2aWV3ID0gbmV3IFVpbnQzMkxpc3Qudmlldyhfc3RvcmFnZS5idWZmZXIpOwotICAgIHZhciBteCA9ICh2aWV3WzFdICYgMHg4MDAwMDAwMCkgPj4gMzE7Ci0gICAgdmFyIG15ID0gKHZpZXdbM10gJiAweDgwMDAwMDAwKSA+PiAzMTsKLSAgICByZXR1cm4gbXggfCBteSA8PCAxOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0NjR4Ml0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeCB2YWx1ZS4KLSAgRmxvYXQ2NHgyIHdpdGhYKGRvdWJsZSB4KSB7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoeCwgX3N0b3JhZ2VbMV0pOwotICB9Ci0KLSAgLy8vIFJldHVybnMgYSBuZXcgW0Zsb2F0NjR4Ml0gY29waWVkIGZyb20gW3RoaXNdIHdpdGggYSBuZXcgeSB2YWx1ZS4KLSAgRmxvYXQ2NHgyIHdpdGhZKGRvdWJsZSB5KSB7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoX3N0b3JhZ2VbMF0sIHkpOwotICB9Ci0KLSAgLy8vIFJldHVybnMgdGhlIGxhbmUtd2lzZSBtaW5pbXVtIHZhbHVlIGluIFt0aGlzXSBvciBbb3RoZXJdLgotICBGbG9hdDY0eDIgbWluKEZsb2F0NjR4MiBvdGhlcikgewotICAgIHJldHVybiBuZXcgRmxvYXQ2NHgyKAotICAgICAgICBfc3RvcmFnZVswXSA8IG90aGVyLl9zdG9yYWdlWzBdID8gX3N0b3JhZ2VbMF0gOiBvdGhlci5fc3RvcmFnZVswXSwKLSAgICAgICAgX3N0b3JhZ2VbMV0gPCBvdGhlci5fc3RvcmFnZVsxXSA/IF9zdG9yYWdlWzFdIDogb3RoZXIuX3N0b3JhZ2VbMV0pOwotCi0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIG1heGltdW0gdmFsdWUgaW4gW3RoaXNdIG9yIFtvdGhlcl0uCi0gIEZsb2F0NjR4MiBtYXgoRmxvYXQ2NHgyIG90aGVyKSB7Ci0gICAgcmV0dXJuIG5ldyBGbG9hdDY0eDIoCi0gICAgICAgIF9zdG9yYWdlWzBdID4gb3RoZXIuX3N0b3JhZ2VbMF0gPyBfc3RvcmFnZVswXSA6IG90aGVyLl9zdG9yYWdlWzBdLAotICAgICAgICBfc3RvcmFnZVsxXSA+IG90aGVyLl9zdG9yYWdlWzFdID8gX3N0b3JhZ2VbMV0gOiBvdGhlci5fc3RvcmFnZVsxXSk7Ci0gIH0KLQotICAvLy8gUmV0dXJucyB0aGUgbGFuZS13aXNlIHNxdWFyZSByb290IG9mIFt0aGlzXS4KLSAgRmxvYXQ2NHgyIHNxcnQoKSB7Ci0gICAgICByZXR1cm4gbmV3IEZsb2F0NjR4MihNYXRoLnNxcnQoX3N0b3JhZ2VbMF0pLCBNYXRoLnNxcnQoX3N0b3JhZ2VbMV0pKTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9zaXRlL3RyeS9wb2kvcG9pLmRhcnQgYi9zaXRlL3RyeS9wb2kvcG9pLmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI0YmNkOQotLS0gL2Rldi9udWxsCisrKyBiL3NpdGUvdHJ5L3BvaS9wb2kuZGFydApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2xpYnJhcnkgdHJ5ZGFydC5wb2k7CisKK2ltcG9ydCAnZGFydDphc3luYycgc2hvdworICAgIEZ1dHVyZTsKKworaW1wb3J0ICdkYXJ0OmlvJyBzaG93CisgICAgUGxhdGZvcm07CisKK2ltcG9ydCAncGFja2FnZTpkYXJ0MmpzX2luY3JlbWVudGFsL2RhcnQyanNfaW5jcmVtZW50YWwuZGFydCcgc2hvdworICAgIHJldXNlQ29tcGlsZXI7CisKK2ltcG9ydCAncGFja2FnZTpjb21waWxlci9pbXBsZW1lbnRhdGlvbi9zb3VyY2VfZmlsZV9wcm92aWRlci5kYXJ0JyBzaG93CisgICAgRm9ybWF0dGluZ0RpYWdub3N0aWNIYW5kbGVyLAorICAgIFNvdXJjZUZpbGVQcm92aWRlcjsKKworaW1wb3J0ICdwYWNrYWdlOmNvbXBpbGVyL2NvbXBpbGVyLmRhcnQnIGFzIGFwaSBzaG93CisgICAgRGlhZ25vc3RpYzsKKworRnV0dXJlIGRvbmVGdXR1cmU7CisKK3ZvaWQgbWFpbihMaXN0PFN0cmluZz4gYXJndW1lbnRzKSB7CisgIFVyaSBzY3JpcHQgPSBVcmkuYmFzZS5yZXNvbHZlKGFyZ3VtZW50cy5maXJzdCk7CisgIGludCBwb3NpdGlvbiA9IGludC5wYXJzZShhcmd1bWVudHNbMV0pOworICBGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIgaGFuZGxlciA9IG5ldyBGb3JtYXR0aW5nRGlhZ25vc3RpY0hhbmRsZXIoKTsKKyAgaGFuZGxlcgorICAgICAgLi52ZXJib3NlID0gdHJ1ZQorICAgICAgLi5lbmFibGVDb2xvcnMgPSB0cnVlOworCisgIFVyaSBsaWJyYXJ5Um9vdCA9IFVyaS5iYXNlLnJlc29sdmUoJ3Nkay8nKTsKKyAgVXJpIHBhY2thZ2VSb290ID0gVXJpLmJhc2UucmVzb2x2ZVVyaSgKKyAgICAgIG5ldyBVcmkuZmlsZSgnJHtQbGF0Zm9ybS5wYWNrYWdlUm9vdH0vJykpOworCisgIHZhciBvcHRpb25zID0gWworICAgICAgJy0tYW5hbHl6ZS1tYWluJywKKyAgICAgICctLWFuYWx5emUtb25seScsCisgICAgICAnLS1uby1zb3VyY2UtbWFwcycsCisgICAgICAnLS12ZXJib3NlJywKKyAgICAgICctLWNhdGVnb3JpZXM9Q2xpZW50LFNlcnZlcicsCisgIF07CisKKyAgdmFyIGNhY2hlZENvbXBpbGVyID0gbnVsbDsKKyAgY2FjaGVkQ29tcGlsZXIgPSByZXVzZUNvbXBpbGVyKAorICAgICAgZGlhZ25vc3RpY0hhbmRsZXI6IGhhbmRsZXIsCisgICAgICBpbnB1dFByb3ZpZGVyOiBoYW5kbGVyLnByb3ZpZGVyLAorICAgICAgb3B0aW9uczogb3B0aW9ucywKKyAgICAgIGNhY2hlZENvbXBpbGVyOiBjYWNoZWRDb21waWxlciwKKyAgICAgIGxpYnJhcnlSb290OiBsaWJyYXJ5Um9vdCwKKyAgICAgIHBhY2thZ2VSb290OiBwYWNrYWdlUm9vdCwKKyAgICAgIHBhY2thZ2VzQXJlSW1tdXRhYmxlOiB0cnVlKTsKKworICBkb25lRnV0dXJlID0gY2FjaGVkQ29tcGlsZXIucnVuKHNjcmlwdCkudGhlbigoc3VjY2VzcykgeworICAgIGlmIChzdWNjZXNzICE9IHRydWUpIHsKKyAgICAgIHRocm93ICdDb21waWxhdGlvbiBmYWlsZWQnOworICAgIH0KKyAgICBoYW5kbGVyKAorICAgICAgICBzY3JpcHQsIHBvc2l0aW9uLCBwb3NpdGlvbiArIDEsCisgICAgICAgICdQb2ludCBvZiBpbnRlcmVzdC4nLCBhcGkuRGlhZ25vc3RpYy5ISU5UKTsKKyAgfSk7Cit9CmRpZmYgLS1naXQgYS9zaXRlL3RyeS9zcmMvZWRpdG9yLmRhcnQgYi9zaXRlL3RyeS9zcmMvZWRpdG9yLmRhcnQKaW5kZXggZTg1MjNkNS4uZWRiNWY3ZSAxMDA2NDQKLS0tIGEvc2l0ZS90cnkvc3JjL2VkaXRvci5kYXJ0CisrKyBiL3NpdGUvdHJ5L3NyYy9lZGl0b3IuZGFydApAQCAtMjM0LDYgKzIzNCw4IEBACiAKIERlY29yYXRpb24gZ2V0RGVjb3JhdGlvbihUb2tlbiB0b2tlbikgewogICBpZiAodG9rZW4gaXMgRXJyb3JUb2tlbikgeworICAgIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHNpZGUgZWZmZWN0cyBmcm9tIHRoaXMgbWV0aG9kLiBJdCBvbmx5IGxlYWRzIHRvCisgICAgLy8gY29uZnVzaW9uLgogICAgIGlzTWFsZm9ybWVkSW5wdXQgPSB0cnVlOwogICAgIHJldHVybiBuZXcgRGlhZ25vc3RpY0RlY29yYXRpb24oJ2Vycm9yJywgdG9rZW4uYXNzZXJ0aW9uTWVzc2FnZSk7CiAgIH0KQEAgLTI1MSw2ICsyNTMsOCBAQAogICBpZiAodG9rZW5JbmZvID09ICdrZXl3b3JkJykgcmV0dXJuIGN1cnJlbnRUaGVtZS5rZXl3b3JkOwogICBpZiAodG9rZW5JbmZvID09ICdjb21tZW50JykgcmV0dXJuIGN1cnJlbnRUaGVtZS5zaW5nbGVMaW5lQ29tbWVudDsKICAgaWYgKHRva2VuSW5mbyA9PSAnbWFsZm9ybWVkIGlucHV0JykgeworICAgIC8vIFRPRE8oYWhlKTogUmVtb3ZlIHNpZGUgZWZmZWN0cyBmcm9tIHRoaXMgbWV0aG9kLiBJdCBvbmx5IGxlYWRzIHRvCisgICAgLy8gY29uZnVzaW9uLgogICAgIGlzTWFsZm9ybWVkSW5wdXQgPSB0cnVlOwogICAgIHJldHVybiBuZXcgRGlhZ25vc3RpY0RlY29yYXRpb24oJ2Vycm9yJywgdG9rZW5WYWx1ZSk7CiAgIH0KZGlmZiAtLWdpdCBhL3NpdGUvdHJ5L3NyYy9pbnRlcmFjdGlvbl9tYW5hZ2VyLmRhcnQgYi9zaXRlL3RyeS9zcmMvaW50ZXJhY3Rpb25fbWFuYWdlci5kYXJ0CmluZGV4IDk3YzA2ZDQuLjhlZTJjYjMgMTAwNjQ0Ci0tLSBhL3NpdGUvdHJ5L3NyYy9pbnRlcmFjdGlvbl9tYW5hZ2VyLmRhcnQKKysrIGIvc2l0ZS90cnkvc3JjL2ludGVyYWN0aW9uX21hbmFnZXIuZGFydApAQCAtMjUsNiArMjUsOSBAQAogICAgIEJlZ2luR3JvdXBUb2tlbiwKICAgICBFT0ZfVE9LRU4sCiAgICAgRXJyb3JUb2tlbiwKKyAgICBTVFJJTkdfSU5URVJQT0xBVElPTl9JREVOVElGSUVSX1RPS0VOLAorICAgIFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOLAorICAgIFNUUklOR19UT0tFTiwKICAgICBTdHJpbmdTY2FubmVyLAogICAgIFRva2VuLAogICAgIFVubWF0Y2hlZFRva2VuLApAQCAtMzMsNiArMzYsMTIgQEAKIGltcG9ydCAncGFja2FnZTpjb21waWxlci9pbXBsZW1lbnRhdGlvbi9zb3VyY2VfZmlsZS5kYXJ0JyBzaG93CiAgICAgU3RyaW5nU291cmNlRmlsZTsKIAoraW1wb3J0ICdwYWNrYWdlOmNvbXBpbGVyL2ltcGxlbWVudGF0aW9uL3N0cmluZ192YWxpZGF0b3IuZGFydCcgc2hvdworICAgIFN0cmluZ1ZhbGlkYXRvcjsKKworaW1wb3J0ICdwYWNrYWdlOmNvbXBpbGVyL2ltcGxlbWVudGF0aW9uL3RyZWUvdHJlZS5kYXJ0JyBzaG93CisgICAgU3RyaW5nUXVvdGluZzsKKwogaW1wb3J0ICdjb21waWxhdGlvbi5kYXJ0JyBzaG93CiAgICAgY3VycmVudFNvdXJjZSwKICAgICBzdGFydENvbXBpbGF0aW9uOwpAQCAtNzMsNyArODIsNiBAQAogaW1wb3J0ICdzaGFkb3dfcm9vdC5kYXJ0JyBzaG93CiAgICAgZ2V0U2hhZG93Um9vdCwKICAgICBnZXRUZXh0LAotICAgIHJlbW92ZVNoYWRvd1Jvb3RQb2x5ZmlsbCwKICAgICBzZXRTaGFkb3dSb290OwogCiBpbXBvcnQgJ2lmcmFtZV9lcnJvcl9oYW5kbGVyLmRhcnQnIHNob3cKQEAgLTQyNiw2MCArNDM0LDcwIEBACiAgICAgICBpZiAobm9kZSBpcyBFbGVtZW50ICYmIG5vZGUuY2xhc3Nlcy5jb250YWlucygnbGluZU51bWJlcicpKSB7CiAgICAgICAgIHByaW50KCdTaW5nbGUgbGluZSBjaGFuZ2U6ICR7bm9kZS5vdXRlckh0bWx9Jyk7CiAKLSAgICAgICAgcmVtb3ZlU2hhZG93Um9vdFBvbHlmaWxsKG5vZGUpOwotCi0gICAgICAgIFN0cmluZyBjdXJyZW50VGV4dCA9IG5vZGUudGV4dDsKLQotICAgICAgICB0cnlTZWxlY3Rpb24gPSB0cnlTZWxlY3Rpb24uY29weVdpdGhSb290KG5vZGUpOwotICAgICAgICB0cnlTZWxlY3Rpb24udXBkYXRlVGV4dChjdXJyZW50VGV4dCk7Ci0KLSAgICAgICAgZWRpdG9yLmlzTWFsZm9ybWVkSW5wdXQgPSBmYWxzZTsKLSAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgIExpc3Q8Tm9kZT4gbm9kZXMgPSA8Tm9kZT5bXTsKLQotICAgICAgICBTdHJpbmcgc3RhdGUgPSAnJzsKLSAgICAgICAgRWxlbWVudCBwcmV2aW91c0xpbmUgPSBub2RlLnByZXZpb3VzRWxlbWVudFNpYmxpbmc7Ci0gICAgICAgIGlmIChwcmV2aW91c0xpbmUgIT0gbnVsbCkgewotICAgICAgICAgIHN0YXRlID0gcHJldmlvdXNMaW5lLmdldEF0dHJpYnV0ZSgnZGFydC1zdGF0ZScpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoU3RyaW5nIGxpbmUgaW4gc3BsaXRMaW5lcyhjdXJyZW50VGV4dCkpIHsKLSAgICAgICAgICBMaXN0PE5vZGU+IGxpbmVOb2RlcyA9IDxOb2RlPltdOwotICAgICAgICAgIHN0YXRlID0gdG9rZW5pemVBbmRIaWdobGlnaHQoCi0gICAgICAgICAgICAgIGxpbmUsIHN0YXRlLCBvZmZzZXQsIHRyeVNlbGVjdGlvbiwgbGluZU5vZGVzKTsKLSAgICAgICAgICBvZmZzZXQgKz0gbGluZS5sZW5ndGg7Ci0gICAgICAgICAgbm9kZXMuYWRkKG1ha2VMaW5lKGxpbmVOb2Rlcywgc3RhdGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG5vZGUucGFyZW50Lmluc2VydEFsbEJlZm9yZShub2Rlcywgbm9kZSk7Ci0gICAgICAgIG5vZGUucmVtb3ZlKCk7Ci0gICAgICAgIGlmIChtYWluRWRpdG9yUGFuZS5jb250YWlucyh0cnlTZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHsKLSAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGFuY2hvciBub2RlIGlzIHJlbW92ZWQgYnkgdGhlIGFib3ZlIGNhbGwuIFRoaXMgaGFzCi0gICAgICAgICAgLy8gb25seSBiZWVuIG9ic2VydmVkIGluIEZpcmVmb3gsIGFuZCBpcyBoYXJkIHRvIHJlcHJvZHVjZS4KLSAgICAgICAgICB0cnlTZWxlY3Rpb24uYWRqdXN0KHNlbGVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPKGFoZSk6IFdlIGtub3cgYWxtb3N0IGV4YWN0bHkgd2hhdCBoYXMgY2hhbmdlZC4gIEl0IGNvdWxkIGJlCi0gICAgICAgIC8vIG1vcmUgZWZmaWNpZW50IHRvIG9ubHkgY29tbXVuaWNhdGUgd2hhdCBjaGFuZ2VkLgotICAgICAgICBjb250ZXh0LmN1cnJlbnRDb21waWxhdGlvblVuaXQuY29udGVudCA9IGdldFRleHQobWFpbkVkaXRvclBhbmUpOwotCi0gICAgICAgIC8vIERpc2NhcmQgaGlnaGxpZ2h0aW5nIG11dGF0aW9ucy4KLSAgICAgICAgb2JzZXJ2ZXIudGFrZVJlY29yZHMoKTsKKyAgICAgICAgdXBkYXRlSGlnaGxpZ2h0aW5nKG5vZGUsIHNlbGVjdGlvbiwgdHJ5U2VsZWN0aW9uLCBtYWluRWRpdG9yUGFuZSk7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICB9CiAKLSAgICBTdHJpbmcgY3VycmVudFRleHQgPSBnZXRUZXh0KG1haW5FZGl0b3JQYW5lKTsKKyAgICB1cGRhdGVIaWdobGlnaHRpbmcobWFpbkVkaXRvclBhbmUsIHNlbGVjdGlvbiwgdHJ5U2VsZWN0aW9uKTsKKyAgfQorCisgIHZvaWQgdXBkYXRlSGlnaGxpZ2h0aW5nKAorICAgICAgRWxlbWVudCBub2RlLAorICAgICAgU2VsZWN0aW9uIHNlbGVjdGlvbiwKKyAgICAgIFRyeVNlbGVjdGlvbiB0cnlTZWxlY3Rpb24sCisgICAgICBbRWxlbWVudCByb290XSkgeworICAgIFN0cmluZyBzdGF0ZSA9ICcnOworICAgIFN0cmluZyBjdXJyZW50VGV4dCA9IGdldFRleHQobm9kZSk7CisgICAgaWYgKHJvb3QgIT0gbnVsbCkgeworICAgICAgLy8gU2luZ2xlIGxpbmUgY2hhbmdlLgorICAgICAgdHJ5U2VsZWN0aW9uID0gdHJ5U2VsZWN0aW9uLmNvcHlXaXRoUm9vdChub2RlKTsKKyAgICAgIEVsZW1lbnQgcHJldmlvdXNMaW5lID0gbm9kZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nOworICAgICAgaWYgKHByZXZpb3VzTGluZSAhPSBudWxsKSB7CisgICAgICAgIHN0YXRlID0gcHJldmlvdXNMaW5lLmdldEF0dHJpYnV0ZSgnZGFydC1zdGF0ZScpOworICAgICAgfQorCisgICAgICBub2RlLnBhcmVudC5pbnNlcnRBbGxCZWZvcmUoCisgICAgICAgICAgY3JlYXRlSGlnaGxpZ2h0ZWROb2Rlcyh0cnlTZWxlY3Rpb24sIGN1cnJlbnRUZXh0LCBzdGF0ZSksCisgICAgICAgICAgbm9kZSk7CisgICAgICBub2RlLnJlbW92ZSgpOworICAgIH0gZWxzZSB7CisgICAgICByb290ID0gbm9kZTsKKyAgICAgIGVkaXRvci5zZWVuSWRlbnRpZmllcnMgPSBuZXcgU2V0PFN0cmluZz4uZnJvbShtb2NrLmlkZW50aWZpZXJzKTsKKworICAgICAgLy8gRmFpbCBzYWZlOiBuZXcgW25vZGVzXSBhcmUgY29tcHV0ZWQgYmVmb3JlIGNsZWFyaW5nIG9sZCBub2Rlcy4KKyAgICAgIExpc3Q8Tm9kZT4gbm9kZXMgPQorICAgICAgICAgIGNyZWF0ZUhpZ2hsaWdodGVkTm9kZXModHJ5U2VsZWN0aW9uLCBjdXJyZW50VGV4dCwgc3RhdGUpOworCisgICAgICBub2RlLm5vZGVzCisgICAgICAgICAgLi5jbGVhcigpCisgICAgICAgICAgLi5hZGRBbGwobm9kZXMpOworICAgIH0KKworICAgIGlmIChtYWluRWRpdG9yUGFuZS5jb250YWlucyh0cnlTZWxlY3Rpb24uYW5jaG9yTm9kZSkpIHsKKyAgICAgIC8vIFNvbWV0aW1lcyB0aGUgYW5jaG9yIG5vZGUgaXMgcmVtb3ZlZCBieSB0aGUgYWJvdmUgY2FsbC4gVGhpcyBoYXMKKyAgICAgIC8vIG9ubHkgYmVlbiBvYnNlcnZlZCBpbiBGaXJlZm94LCBhbmQgaXMgaGFyZCB0byByZXByb2R1Y2UuCisgICAgICB0cnlTZWxlY3Rpb24uYWRqdXN0KHNlbGVjdGlvbik7CisgICAgfQorCisgICAgLy8gVE9ETyhhaGUpOiBXZSBrbm93IGFsbW9zdCBleGFjdGx5IHdoYXQgaGFzIGNoYW5nZWQuICBJdCBjb3VsZCBiZQorICAgIC8vIG1vcmUgZWZmaWNpZW50IHRvIG9ubHkgY29tbXVuaWNhdGUgd2hhdCBjaGFuZ2VkLgorICAgIGNvbnRleHQuY3VycmVudENvbXBpbGF0aW9uVW5pdC5jb250ZW50ID0gZ2V0VGV4dChyb290KTsKKworICAgIC8vIERpc2NhcmQgaGlnaGxpZ2h0aW5nIG11dGF0aW9ucy4KKyAgICBvYnNlcnZlci50YWtlUmVjb3JkcygpOworICB9CisKKyAgTGlzdDxOb2RlPiBjcmVhdGVIaWdobGlnaHRlZE5vZGVzKAorICAgICAgVHJ5U2VsZWN0aW9uIHRyeVNlbGVjdGlvbiwKKyAgICAgIFN0cmluZyBjdXJyZW50VGV4dCwKKyAgICAgIFN0cmluZyBzdGF0ZSkgewogICAgIHRyeVNlbGVjdGlvbi51cGRhdGVUZXh0KGN1cnJlbnRUZXh0KTsKIAotICAgIGNvbnRleHQuY3VycmVudENvbXBpbGF0aW9uVW5pdC5jb250ZW50ID0gY3VycmVudFRleHQ7Ci0KLSAgICBlZGl0b3Iuc2VlbklkZW50aWZpZXJzID0gbmV3IFNldDxTdHJpbmc+LmZyb20obW9jay5pZGVudGlmaWVycyk7Ci0KICAgICBlZGl0b3IuaXNNYWxmb3JtZWRJbnB1dCA9IGZhbHNlOwogICAgIGludCBvZmZzZXQgPSAwOwogICAgIExpc3Q8Tm9kZT4gbm9kZXMgPSA8Tm9kZT5bXTsKIAotICAgIFN0cmluZyBzdGF0ZSA9ICcnOwogICAgIGZvciAoU3RyaW5nIGxpbmUgaW4gc3BsaXRMaW5lcyhjdXJyZW50VGV4dCkpIHsKICAgICAgIExpc3Q8Tm9kZT4gbGluZU5vZGVzID0gPE5vZGU+W107CiAgICAgICBzdGF0ZSA9CkBAIC00ODgsMTMgKzUwNiw3IEBACiAgICAgICBub2Rlcy5hZGQobWFrZUxpbmUobGluZU5vZGVzLCBzdGF0ZSkpOwogICAgIH0KIAotICAgIG1haW5FZGl0b3JQYW5lCi0gICAgICAgIC4ubm9kZXMuY2xlYXIoKQotICAgICAgICAuLm5vZGVzLmFkZEFsbChub2Rlcyk7Ci0gICAgdHJ5U2VsZWN0aW9uLmFkanVzdChzZWxlY3Rpb24pOwotCi0gICAgLy8gRGlzY2FyZCBoaWdobGlnaHRpbmcgbXV0YXRpb25zLgotICAgIG9ic2VydmVyLnRha2VSZWNvcmRzKCk7CisgICAgcmV0dXJuIG5vZGVzOwogICB9CiAKICAgdm9pZCBvblNlbGVjdGlvbkNoYW5nZShFdmVudCBldmVudCkgewpAQCAtMTEzNSw2ICsxMTQ3LDE0IEBACiAgICAgICBpZiAodG9rZW4gaXMgQmVnaW5Hcm91cFRva2VuICYmIHRva2VuLmVuZEdyb3VwICE9IG51bGwpIHsKICAgICAgICAgZm9sbG93ID0gdG9rZW4uZW5kR3JvdXAubmV4dDsKICAgICAgIH0KKyAgICAgIGlmICh0b2tlbi5raW5kID09IFNUUklOR19UT0tFTikgeworICAgICAgICBmb2xsb3cgPSBmb2xsb3dTdHJpbmcoZm9sbG93KTsKKyAgICAgICAgaWYgKGZvbGxvdyBpcyBVbm1hdGNoZWRUb2tlbikgeworICAgICAgICAgIGlmICgnJHtmb2xsb3cuYmVnaW4udmFsdWV9JyA9PSByJyR7JykgeworICAgICAgICAgICAgbmV3U3RhdGUgKz0gJyR7ZXh0cmFjdFF1b3RlKHRva2VuLnZhbHVlKX0nOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQogICAgICAgaWYgKGZvbGxvdyBpcyBFcnJvclRva2VuICYmIGZvbGxvdy5jaGFyT2Zmc2V0ID09IHRva2VuLmNoYXJPZmZzZXQpIHsKICAgICAgICAgaWYgKGZvbGxvdyBpcyBVbm1hdGNoZWRUb2tlbikgewogICAgICAgICAgIG5ld1N0YXRlICs9ICcke2ZvbGxvdy5iZWdpbi52YWx1ZX0nOwpAQCAtMTE0OSw3ICsxMTY5LDEzIEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBEZWNvcmF0aW9uIGRlY29yYXRpb24gPSBlZGl0b3IuZ2V0RGVjb3JhdGlvbih0b2tlblRvRGVjb3JhdGUpOworICAgIERlY29yYXRpb24gZGVjb3JhdGlvbjsKKyAgICBpZiAoY2hhck9mZnNldCAtIHN0YXRlLmxlbmd0aCA9PSBsaW5lLmxlbmd0aCAtIDEgJiYgbGluZS5lbmRzV2l0aCgnXG4nKSkgeworICAgICAgLy8gRG9uJ3QgYWRkIGRlY29yYXRpb25zIHRvIHRyYWlsaW5nIG5ld2xpbmUuCisgICAgICBkZWNvcmF0aW9uID0gbnVsbDsKKyAgICB9IGVsc2UgeworICAgICAgZGVjb3JhdGlvbiA9IGVkaXRvci5nZXREZWNvcmF0aW9uKHRva2VuVG9EZWNvcmF0ZSk7CisgICAgfQogCiAgICAgaWYgKGRlY29yYXRpb24gPT0gbnVsbCkgY29udGludWU7CiAKQEAgLTEyODIsMyArMTMwOCwzMyBAQAogICAgICAgICAgICcke3NlbGVjdGlvbi5hbmNob3JOb2RlfUAke3NlbGVjdGlvbi5hbmNob3JPZmZzZXR9LicpOwogICB9CiB9CisKKy8vLyBDb21wdXRlIHRoZSB0b2tlbiBmb2xsb3dpbmcgYSBzdHJpbmcuIENvbXBhcmUgdG8gcGFyc2VTaW5nbGVMaXRlcmFsU3RyaW5nCisvLy8gaW4gcGFyc2VyLmRhcnQuCitUb2tlbiBmb2xsb3dTdHJpbmcoVG9rZW4gdG9rZW4pIHsKKyAgLy8gVE9ETyhhaGUpOiBJIHNob3VsZCBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhpcyBpZiBJIGNoYW5nZSB0aGUgc2Nhbm5lciB0bworICAvLyBjcmVhdGUgQmVnaW5Hcm91cFRva2VuIGZvciBzdHJpbmdzLgorICBpbnQga2luZCA9IHRva2VuLmtpbmQ7CisgIHdoaWxlIChraW5kICE9IEVPRl9UT0tFTikgeworICAgIGlmIChraW5kID09IFNUUklOR19JTlRFUlBPTEFUSU9OX1RPS0VOKSB7CisgICAgICAvLyBMb29raW5nIGF0ICR7ZXhwcmVzc2lvbn0uCisgICAgICBCZWdpbkdyb3VwVG9rZW4gYmVnaW4gPSB0b2tlbjsKKyAgICAgIHRva2VuID0gYmVnaW4uZW5kR3JvdXAubmV4dDsKKyAgICB9IGVsc2UgaWYgKGtpbmQgPT0gU1RSSU5HX0lOVEVSUE9MQVRJT05fSURFTlRJRklFUl9UT0tFTikgeworICAgICAgLy8gTG9va2luZyBhdCAkaWRlbnRpZmllci4KKyAgICAgIHRva2VuID0gdG9rZW4ubmV4dC5uZXh0OworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdG9rZW47CisgICAgfQorICAgIGtpbmQgPSB0b2tlbi5raW5kOworICAgIGlmIChraW5kICE9IFNUUklOR19UT0tFTikgcmV0dXJuIHRva2VuOworICAgIHRva2VuID0gdG9rZW4ubmV4dDsKKyAgICBraW5kID0gdG9rZW4ua2luZDsKKyAgfQorICByZXR1cm4gdG9rZW47Cit9CisKK1N0cmluZyBleHRyYWN0UXVvdGUoU3RyaW5nIHN0cmluZykgeworICBTdHJpbmdRdW90aW5nIHEgPSBTdHJpbmdWYWxpZGF0b3IucXVvdGluZ0Zyb21TdHJpbmcoc3RyaW5nKTsKKyAgcmV0dXJuIChxLnJhdyA/ICdyJyA6ICcnKSArIChxLnF1b3RlQ2hhciAqIHEubGVmdFF1b3RlTGVuZ3RoKTsKK30KZGlmZiAtLWdpdCBhL3NpdGUvdHJ5L3NyYy9zaGFkb3dfcm9vdC5kYXJ0IGIvc2l0ZS90cnkvc3JjL3NoYWRvd19yb290LmRhcnQKaW5kZXggMmI5YmExZC4uMTEwZWZiMyAxMDA2NDQKLS0tIGEvc2l0ZS90cnkvc3JjL3NoYWRvd19yb290LmRhcnQKKysrIGIvc2l0ZS90cnkvc3JjL3NoYWRvd19yb290LmRhcnQKQEAgLTQxLDE1ICs0MSw2IEBACiAgIH0KIH0KIAotdm9pZCByZW1vdmVTaGFkb3dSb290UG9seWZpbGwoRWxlbWVudCByb290KSB7Ci0gIGlmICghU2hhZG93Um9vdC5zdXBwb3J0ZWQpIHsKLSAgICBMaXN0PE5vZGU+IHBvbHlmaWxsID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbdHJ5LWRhcnQtc2hhZG93LXJvb3RdJyk7Ci0gICAgZm9yIChFbGVtZW50IGVsZW1lbnQgaW4gcG9seWZpbGwpIHsKLSAgICAgIGVsZW1lbnQucmVtb3ZlKCk7Ci0gICAgfQotICB9Ci19Ci0KIFN0cmluZyBnZXRUZXh0KEVsZW1lbnQgbm9kZSkgewogICBpZiAoU2hhZG93Um9vdC5zdXBwb3J0ZWQpIHJldHVybiBub2RlLnRleHQ7CiAgIFN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9jbzE5L2NvMTktZGFydDJkYXJ0LnN0YXR1cyBiL3Rlc3RzL2NvMTkvY28xOS1kYXJ0MmRhcnQuc3RhdHVzCmluZGV4IDNiYzQ2ZjMuLjY5ZDYzN2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NvMTkvY28xOS1kYXJ0MmRhcnQuc3RhdHVzCisrKyBiL3Rlc3RzL2NvMTkvY28xOS1kYXJ0MmRhcnQuc3RhdHVzCkBAIC0yLDYgKzIsMTEgQEAKICMgZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKICMgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorWyAkY29tcGlsZXIgPT0gZGFydDJkYXJ0ICYmICRidWlsZGVyX3RhZyA9PSBuZXdfYmFja2VuZCBdCitMaWJUZXN0L2NvbGxlY3Rpb24vTGlzdEJhc2UvTGlzdEJhc2VfY2xhc3NfQTAxX3QwMjogQ3Jhc2ggIyBpc3N1ZSAxOTk1MworTGliVGVzdC9jb2xsZWN0aW9uL0xpc3RNaXhpbi9MaXN0TWl4aW5fY2xhc3NfQTAxX3QwMjogQ3Jhc2ggIyBpc3N1ZSAxOTk1MworTGliVGVzdC9jb3JlL0xpc3QvTGlzdF9jbGFzc19BMDFfdDAyOiBDcmFzaCAjIGlzc3VlIDE5OTUzCisKIFsgJGNvbXBpbGVyID09IGRhcnQyZGFydCBdCiBMYW5ndWFnZS8wN19DbGFzc2VzLzA3X0NsYXNzZXNfQTEzX3QwMjogRmFpbCAjIE1pc3NpbmcgQ1QgZXJyb3Igb24gbWVtYmVyIHdpdGggc2FtZSBuYW1lIGEgdHlwZSBwYXJhbWV0ZXIKIExhbmd1YWdlLzA3X0NsYXNzZXMvMDdfQ2xhc3Nlc19BMTNfdDAzOiBGYWlsICMgTWlzc2luZyBDVCBlcnJvciBvbiBtZW1iZXIgd2l0aCBzYW1lIG5hbWUgYSB0eXBlIHBhcmFtZXRlcgpAQCAtMjIsOSArMjcsNiBAQAogTGliVGVzdC9hc3luYy9EZWZlcnJlZExpYnJhcnkvRGVmZXJyZWRMaWJyYXJ5X0EwMV90MDE6IENvbXBpbGVUaW1lRXJyb3IgIyBkYXJ0IGlzc3VlIDE3NTIzCiAKIExhbmd1YWdlLzEyX0V4cHJlc3Npb25zLzE4X0Fzc2lnbm1lbnRfQTA0X3QwOTogUnVudGltZUVycm9yICMgY28xOS1yb2xsIHI2Njc6IFBsZWFzZSB0cmlhZ2UgdGhpcyBmYWlsdXJlCi1MYW5ndWFnZS8xNF9MaWJyYXJpZXNfYW5kX1NjcmlwdHMvMV9JbXBvcnRzX0EwN190MDI6IFJ1bnRpbWVFcnJvciAjIGNvMTktcm9sbCByNjY3OiBQbGVhc2UgdHJpYWdlIHRoaXMgZmFpbHVyZQotTGFuZ3VhZ2UvMTRfTGlicmFyaWVzX2FuZF9TY3JpcHRzLzFfSW1wb3J0c19BMDdfdDAzOiBSdW50aW1lRXJyb3IgIyBjbzE5LXJvbGwgcjY2NzogUGxlYXNlIHRyaWFnZSB0aGlzIGZhaWx1cmUKLUxhbmd1YWdlLzE0X0xpYnJhcmllc19hbmRfU2NyaXB0cy8xX0ltcG9ydHNfQTA3X3QwNDogUnVudGltZUVycm9yICMgY28xOS1yb2xsIHI2Njc6IFBsZWFzZSB0cmlhZ2UgdGhpcyBmYWlsdXJlCiAKIExhbmd1YWdlLzA3X0NsYXNzZXMvOV9TdXBlcmNsYXNzZXMvMV9Jbmhlcml0YW5jZV9hbmRfT3ZlcnJpZGluZ19BMDFfdDAzOiBGYWlsICMgVE9ETyhkYXJ0MmRhcnQtdGVhbSk6IFBsZWFzZSB0cmlhZ2UgdGhpcyBmYWlsdXJlLgogCmRpZmYgLS1naXQgYS90ZXN0cy9jb21waWxlci9kYXJ0MmpzL21lbW9yeV9jb21waWxlci5kYXJ0IGIvdGVzdHMvY29tcGlsZXIvZGFydDJqcy9tZW1vcnlfY29tcGlsZXIuZGFydAppbmRleCA1NTQwOTg2Li4yMzMxMDA0YiAxMDA2NDQKLS0tIGEvdGVzdHMvY29tcGlsZXIvZGFydDJqcy9tZW1vcnlfY29tcGlsZXIuZGFydAorKysgYi90ZXN0cy9jb21waWxlci9kYXJ0MmpzL21lbW9yeV9jb21waWxlci5kYXJ0CkBAIC0xMjUsNyArMTI1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3dEaWFnbm9zdGljczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICBVcmkgcGFja2FnZVJvb3R9KSB7CiAgIFVyaSBsaWJyYXJ5Um9vdCA9IFVyaS5iYXNlLnJlc29sdmUoJ3Nkay8nKTsKLSAgVXJpIHNjcmlwdCA9IFVyaS5iYXNlLnJlc29sdmVVcmkoUGxhdGZvcm0uc2NyaXB0KTsKICAgaWYgKHBhY2thZ2VSb290ID09IG51bGwpIHsKICAgICBwYWNrYWdlUm9vdCA9IFVyaS5iYXNlLnJlc29sdmVVcmkobmV3IFVyaS5maWxlKCcke1BsYXRmb3JtLnBhY2thZ2VSb290fS8nKSk7CiAgIH0KQEAgLTIzOCw3ICsyMzcsNiBAQAogICBVcmkgbGlicmFyeVJvb3QgPSBVcmkuYmFzZS5yZXNvbHZlKCdzZGsvJyk7CiAgIFVyaSBwYWNrYWdlUm9vdCA9IFVyaS5iYXNlLnJlc29sdmVVcmkoCiAgICAgICBuZXcgVXJpLmZpbGUoJyR7UGxhdGZvcm0ucGFja2FnZVJvb3R9LycpKTsKLSAgVXJpIHNjcmlwdCA9IFVyaS5iYXNlLnJlc29sdmVVcmkoUGxhdGZvcm0uc2NyaXB0KTsKIAogICB2YXIgcHJvdmlkZXIgPSBuZXcgTWVtb3J5U291cmNlRmlsZVByb3ZpZGVyKG1lbW9yeVNvdXJjZUZpbGVzKTsKICAgdmFyIGhhbmRsZXIgPQpkaWZmIC0tZ2l0IGEvdGVzdHMvY29yZWxpYi9jb3JlbGliLnN0YXR1cyBiL3Rlc3RzL2NvcmVsaWIvY29yZWxpYi5zdGF0dXMKaW5kZXggMzVlOTdjNC4uYWQ2YTc1YSAxMDA2NDQKLS0tIGEvdGVzdHMvY29yZWxpYi9jb3JlbGliLnN0YXR1cworKysgYi90ZXN0cy9jb3JlbGliL2NvcmVsaWIuc3RhdHVzCkBAIC0yOCw3ICsyOCw3IEBACiBzdHJpbmdfZnJvbV9lbnZpcm9ubWVudF9kZWZhdWx0X3ZhbHVlOiBTa2lwCiBzdHJpbmdfZnJvbV9lbnZpcm9ubWVudF90ZXN0OiBTa2lwCiAKLVsgJGNvbXBpbGVyID09IGRhcnRhbmFseXplciB8fCAkY29tcGlsZXIgPT0gZGFydDJhbmFseXplcl0KK1sgJGNvbXBpbGVyID09IGRhcnQyYW5hbHl6ZXJdCiBib29sX2Zyb21fZW52aXJvbm1lbnQyX3Rlc3QvMDE6IEZhaWwgIyBJc3N1ZSAxODc1NQogYm9vbF9mcm9tX2Vudmlyb25tZW50Ml90ZXN0LzAyOiBGYWlsICMgSXNzdWUgMTg3NTUKIGJvb2xfZnJvbV9lbnZpcm9ubWVudDJfdGVzdC8wMzogRmFpbCAjIElzc3VlIDE4NzU1CmRpZmYgLS1naXQgYS90ZXN0cy9odG1sL2h0bWwuc3RhdHVzIGIvdGVzdHMvaHRtbC9odG1sLnN0YXR1cwppbmRleCA1ZDQzYTc3Li40YjUzOWY1IDEwMDY0NAotLS0gYS90ZXN0cy9odG1sL2h0bWwuc3RhdHVzCisrKyBiL3Rlc3RzL2h0bWwvaHRtbC5zdGF0dXMKQEAgLTQ1OSwxMiArNDU5LDYgQEAKIGFzeW5jX3Rlc3Q6IFRpbWVvdXQgIyBJc3N1ZSAxMzcxOTogUGxlYXNlIHRyaWFnZSB0aGlzIGZhaWx1cmUuCiBlbGVtZW50X29mZnNldF90ZXN0L29mZnNldDogUGFzcywgRmFpbCAjIElzc3VlIDEzNzE5LCAxMzI5NgogCi1bICRjb21waWxlciA9PSBub25lICYmICRydW50aW1lID09IGRydCAmJiAkc3lzdGVtID09IGxpbnV4ICYmICRhcmNoID09IHg2NCBdCi1pbmRleGVkZGJfNV90ZXN0OiBQYXNzLCBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxOTc3OCwgMTk1MDMKLQotWyAkY29tcGlsZXIgPT0gbm9uZSAmJiAkcnVudGltZSA9PSBkYXJ0aXVtICYmICRzeXN0ZW0gPT0gbGludXggJiYgJGFyY2ggPT0gaWEzMiBdCi1pbmRleGVkZGJfNV90ZXN0OiBQYXNzLCBUaW1lb3V0ICMgSXNzdWUgMTk3NzgsIDE5NTAzCi0KIFsgJGNvbXBpbGVyID09IGRhcnRhbmFseXplciB8fCAkY29tcGlsZXIgPT0gZGFydDJhbmFseXplciBdCiBhdWRpb2NvbnRleHRfdGVzdDogU3RhdGljV2FybmluZwogY3VzdG9tL2RvY3VtZW50X3JlZ2lzdGVyX2Jhc2ljX3Rlc3Q6IFN0YXRpY1dhcm5pbmcKZGlmZiAtLWdpdCBhL3Rlc3RzL2xhbmd1YWdlL2xhbmd1YWdlLnN0YXR1cyBiL3Rlc3RzL2xhbmd1YWdlL2xhbmd1YWdlLnN0YXR1cwppbmRleCBkOTUxMDk3Li40OWY2ZmIxIDEwMDY0NAotLS0gYS90ZXN0cy9sYW5ndWFnZS9sYW5ndWFnZS5zdGF0dXMKKysrIGIvdGVzdHMvbGFuZ3VhZ2UvbGFuZ3VhZ2Uuc3RhdHVzCkBAIC04NSw4ICs4NSwxMSBAQAogIyBwcm9ibGVtcyBpbiBjb21waWxlIHRpbWUgY29uc3RhbnRzLgogdHlwZV9jaGVja19jb25zdF9mdW5jdGlvbl90eXBlZGVmMl90ZXN0LzAwOiBGYWlsLCBPSwogCi1bICgkY29tcGlsZXIgPT0gbm9uZSB8fCAkY29tcGlsZXIgPT0gZGFydDJkYXJ0KSAmJiAkcnVudGltZSAhPSBub25lIF0KLWR5bmFtaWNfcHJlZml4X2NvcmVfdGVzdC8wMTogRmFpbCAjIElzc3VlIDEyNDc4CitbICRjb21waWxlciA9PSBub25lICYmICRydW50aW1lICE9IG5vbmUgXQorZHluYW1pY19wcmVmaXhfY29yZV90ZXN0LzAxOiBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxMjQ3OAorCitbICRjb21waWxlciA9PSBkYXJ0MmRhcnQgJiYgJHJ1bnRpbWUgIT0gbm9uZSAmJiAkYnVpbGRlcl90YWcgIT0gbmV3X2JhY2tlbmQgXQorZHluYW1pY19wcmVmaXhfY29yZV90ZXN0LzAxOiBSdW50aW1lRXJyb3IgIyBJc3N1ZSAxMjQ3OAogCiBbICRjb21waWxlciA9PSBub25lICYmICgkcnVudGltZSA9PSB2bSB8fCAkcnVudGltZSA9PSBkcnQgfHwgJHJ1bnRpbWUgPT0gZGFydGl1bXx8ICRydW50aW1lID09IENvbnRlbnRTaGVsbE9uQW5kcm9pZCkgXQogZHluYW1pY19wcmVmaXhfY29yZV90ZXN0L25vbmU6IEZhaWwgIyBJc3N1ZSAxMjQ3OApAQCAtMTEyLDcgKzExNSw2IEBACiBmaXJzdF9jbGFzc190eXBlc19saXRlcmFsc190ZXN0OiBQYXNzLCBGYWlsICMgSXNzdWUgMTM3MTk6IFBsZWFzZSB0cmlhZ2UgdGhpcyBmYWlsdXJlLgogCiBbICRjb21waWxlciA9PSBub25lICYmICggJHJ1bnRpbWUgPT0gZGFydGl1bSB8fCAkcnVudGltZSA9PSBkcnQgfHwgJHJ1bnRpbWUgPT0gQ29udGVudFNoZWxsT25BbmRyb2lkKSBdCi1kZWZlcnJlZF8qOiBTa2lwICMgTGF6eSBkZWZlcnJlZCBsb2FkaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gRGFydGl1bQogaXNzdWUxMzQ3NF90ZXN0OiBQYXNzLCBGYWlsICMgSXNzdWUgMTQ2NTEuCiB0eXBlZF9tZXNzYWdlX3Rlc3Q6IENyYXNoLCBGYWlsICMgSXNzdWUgMTM5MjEsIDE0NDAwCiB2bS9vcHRpbWl6ZWRfZ3VhcmRlZF9maWVsZF9pc29sYXRlc190ZXN0OiBGYWlsICMgSXNzdWUgMTM5MjEuCmRpZmYgLS1naXQgYS90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzXzE5NzI4X3Rlc3QuZGFydCBiL3Rlc3RzL2xhbmd1YWdlL3JlZ3Jlc3NfMTk3MjhfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZGJhNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9sYW5ndWFnZS9yZWdyZXNzXzE5NzI4X3Rlc3QuZGFydApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaXNzdWUgMTk3MjguCisKK2NsYXNzIEM8VCBleHRlbmRzIGR5bmFtaWM+IHsKKyAgVCBmaWVsZDsKKworICB0ZXN0KCkgeworICAgIGZpZWxkID0gMDsKKyAgICBpbnQgaSA9IGZpZWxkOworICB9Cit9CisKK3ZvaWQgbWFpbigpIHsKKyAgbmV3IEMoKS50ZXN0KCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvbGFuZ3VhZ2Uvc3RyaW5nX2ludGVycG9sYXRpb25fbmV3bGluZV90ZXN0LmRhcnQgYi90ZXN0cy9sYW5ndWFnZS9zdHJpbmdfaW50ZXJwb2xhdGlvbl9uZXdsaW5lX3Rlc3QuZGFydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWFkMDRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbGFuZ3VhZ2Uvc3RyaW5nX2ludGVycG9sYXRpb25fbmV3bGluZV90ZXN0LmRhcnQKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLy8gVGVzdCBvZiBuZXdsaW5lcyBpbiBpbnRlcnBvbGF0ZWQgc3RyaW5ncy4KKworbWFpbigpIHsKKyAgU3RyaW5nIGV4cGVjdGVkID0gJ1tbe3t9OiB7fX1dXSc7CisgIFN0cmluZyBhID0gIiR7IFsgIiR7IFsgJyR7IHsgJyR7IHsgfSB9JyA6IHsgfSB9IH0nIF0gfSIgXSB9IjsKKyAgU3RyaW5nIGIgPSAiJHsgWyAiJHsgWyAnJHsgeyAnJHsKKyAgICAgIHsgfSB9JyA6IHsgfSB9IH0nIF0gfSIgXSB9IjsKKyAgU3RyaW5nIGMgPSAiJHsgWyAiJHsgWyAnJHsgeyAnJHsKKyAgICAgIHsKKyAgICAgIH0gfScgOiB7CisgICAgICB9IH0gfScgXSB9IiBdIH0iOworICBpZiAoZXhwZWN0ZWQgIT0gYSkgdGhyb3cgJ2V4cGVjdGVkYTogJGV4cGVjdGVkICE9ICRhJzsKKyAgaWYgKGEgIT0gYikgdGhyb3cgJ2FiOiAkYSAhPSAkYic7CisgIGlmIChiICE9IGMpIHRocm93ICdiYzogJGIgIT0gJGMnOworICBwcmludCgnJGEkYiRjJyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMTdfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczE3X3Rlc3QuZGFydAppbmRleCBiNTcxNzMyLi5iOWNmZmNhIDEwMDY0NAotLS0gYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMTdfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMxN190ZXN0LmRhcnQKQEAgLTI3LDIwICsyNywyMCBAQAogICAgICAgICAubGlzdGVuKCh4KSB7IGV2ZW50cy5hZGQoInN0cmVhbSAkeCIpOyB9KTsKICAgICB9KS5saXN0ZW4oKHgpIHsgZXZlbnRzLmFkZCh4KTsgfSk7CiAgICAgY29udHJvbGxlci5hZGQoMSk7Ci0gICAgLy8gRXJyb3JzIGFyZSBub3QgYWxsb3dlZCB0byB0cmF2ZXJzZSBib3VuZGFyaWVzLiBUaGlzIGVycm9yIHNob3VsZCBiZQotICAgIC8vIGNhdWdodCBieSB0aGUgb3V0ZXIgY2F0Y2hFcnJvcnMuCiAgICAgY29udHJvbGxlci5hZGRFcnJvcigyKTsKKyAgICBuZXcgRnV0dXJlLmVycm9yKCJvdXRlciBlcnJvciIpOwogICAgIGNvbnRyb2xsZXIuY2xvc2UoKTsKICAgfSkubGlzdGVuKCh4KSB7CiAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoIm91dGVyOiAkeCIpOwotICAgICAgICAgICAgICBpZiAoeCA9PSAyKSBkb25lLmNvbXBsZXRlKHRydWUpOworICAgICAgICAgICAgICBpZiAoeCA9PSAib3V0ZXIgZXJyb3IiKSBkb25lLmNvbXBsZXRlKHRydWUpOwogICAgICAgICAgICAgfSwgb25Eb25lOiAoKSB7IEV4cGVjdC5mYWlsKCJVbmV4cGVjdGVkIGNhbGxiYWNrIik7IH0pOwogCiAgIGRvbmUuZnV0dXJlLndoZW5Db21wbGV0ZSgoKSB7CiAgICAgVGltZXIucnVuKCgpIHsKICAgICAgIEV4cGVjdC5saXN0RXF1YWxzKFsibWFwIDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIDEwMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRlcjogMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSAxMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gZXJyb3IgMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyOiBvdXRlciBlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzKTsKICAgICAgIGFzeW5jRW5kKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjNfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczIzX3Rlc3QuZGFydAppbmRleCA3Y2Y1Mjk0Li4zZjFiN2M4IDEwMDY0NAotLS0gYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjNfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMyM190ZXN0LmRhcnQKQEAgLTIwLDYgKzIwLDggQEAKICAgY2F0Y2hFcnJvcnMoKCkgewogICAgIGNhdGNoRXJyb3JzKCgpIHsKICAgICAgIGNvbnRyb2xsZXIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcigpOworCisgICAgICAvLyBBc3NpZ24gdG8gImdsb2JhbCIgYHN0cmVhbWAuCiAgICAgICBzdHJlYW0gPSBjb250cm9sbGVyLnN0cmVhbQogICAgICAgICAubWFwKCh4KSB7CiAgICAgICAgICAgZXZlbnRzLmFkZCgibWFwICR4Iik7CkBAIC0yOCwxOCArMzAsMjUgQEAKICAgICAgICAgLnRyYW5zZm9ybShuZXcgU3RyZWFtVHJhbnNmb3JtZXIuZnJvbUhhbmRsZXJzKAogICAgICAgICAgICAgaGFuZGxlRXJyb3I6IChlLCBzdCwgc2luaykgeyBzaW5rLmFkZCgiZXJyb3IgJGUiKTsgfSkpCiAgICAgICAgIC5hc0Jyb2FkY2FzdFN0cmVhbSgpOworCisgICAgICAvLyBMaXN0ZW4gdG8gYHN0cmVhbWAgaW4gdGhlIGlubmVyIHpvbmUuCiAgICAgICBzdHJlYW0ubGlzdGVuKCh4KSB7IGV2ZW50cy5hZGQoInN0cmVhbSAkeCIpOyB9KTsKICAgICB9KS5saXN0ZW4oKHgpIHsgZXZlbnRzLmFkZCh4KTsgfSkKICAgICAgIC5hc0Z1dHVyZSgpLnRoZW4oKF8pIHsgRXhwZWN0LmZhaWwoIlVuZXhwZWN0ZWQgY2FsbGJhY2siKTsgfSk7CisKKyAgICAvLyBMaXN0ZW4gdG8gYHN0cmVhbWAgaW4gdGhlIG91dGVyIHpvbmUuCiAgICAgc3RyZWFtLmxpc3RlbigoeCkgeyBldmVudHMuYWRkKCJzdHJlYW0yICR4Iik7IH0pOworCisgICAgLy8gRmVlZCB0aGUgY29udHJvbGxlciBmcm9tIHRoZSBvdXRlciB6b25lLgogICAgIGNvbnRyb2xsZXIuYWRkKDEpOwotICAgIC8vIEVycm9ycyBhcmUgbm90IGFsbG93ZWQgdG8gdHJhdmVyc2UgYm91bmRhcmllcy4gVGhpcyBlcnJvciBzaG91bGQgYmUKLSAgICAvLyBjYXVnaHQgYnkgdGhlIG91dGVyIGNhdGNoRXJyb3JzLgotICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoMik7CisgICAgLy8gYGFkZEVycm9yYCBkb2VzIG5vdCBjb3VudCBhcyB6b25lLXRyYXZlcnNhbC4gSXQgc2hvdWxkIGJlIGNhdWdodCBieQorICAgIC8vIHRoZSBpbm5lciBlcnJvciBoYW5kbGVyLgorICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoImlubmVyIGVycm9yIik7CisgICAgbmV3IEZ1dHVyZS5lcnJvcigiY2F1Z2h0IGJ5IG91dGVyIik7CiAgICAgY29udHJvbGxlci5jbG9zZSgpOwogICB9KS5saXN0ZW4oKHgpIHsKICAgICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoIm91dGVyOiAkeCIpOwotICAgICAgICAgICAgICAgICAgaWYgKHggPT0gMikgZG9uZS5jb21wbGV0ZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgIGlmICh4ID09ICJjYXVnaHQgYnkgb3V0ZXIiKSBkb25lLmNvbXBsZXRlKHRydWUpOwogICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBvbkRvbmU6ICgpIHsgRXhwZWN0LmZhaWwoIlVuZXhwZWN0ZWQgY2FsbGJhY2siKTsgfSk7CiAKQEAgLTQ3LDkgKzU2LDExIEBACiAgICAgLy8gR2l2ZSBoYW5kbGVycyB0aW1lIHRvIHJ1bi4KICAgICBUaW1lci5ydW4oKCkgewogICAgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWyJtYXAgMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIDEwMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiAxMDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyOiAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIDEwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbTIgMTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIGVycm9yIGlubmVyIGVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiBlcnJvciBpbm5lciBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyOiBjYXVnaHQgYnkgb3V0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyk7CiAgICAgICBhc3luY0VuZCgpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczI0X3Rlc3QuZGFydCBiL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMyNF90ZXN0LmRhcnQKaW5kZXggMTI3ZjE4ZS4uMzA5NjExYSAxMDA2NDQKLS0tIGEvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczI0X3Rlc3QuZGFydAorKysgYi90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjRfdGVzdC5kYXJ0CkBAIC0yMCw2ICsyMCw4IEBACiAgIGNhdGNoRXJyb3JzKCgpIHsKICAgICBjYXRjaEVycm9ycygoKSB7CiAgICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKworICAgICAgLy8gQXNzaWduIHRvIHRoZSAiZ2xvYmFsIiBgc3RyZWFtYC4KICAgICAgIHN0cmVhbSA9IGNvbnRyb2xsZXIuc3RyZWFtCiAgICAgICAgIC5tYXAoKHgpIHsKICAgICAgICAgICBldmVudHMuYWRkKCJtYXAgJHgiKTsKQEAgLTI4LDYgKzMwLDggQEAKICAgICAgICAgLnRyYW5zZm9ybShuZXcgU3RyZWFtVHJhbnNmb3JtZXIuZnJvbUhhbmRsZXJzKAogICAgICAgICAgICAgaGFuZGxlRXJyb3I6IChlLCBzdCwgc2luaykgeyBzaW5rLmFkZCgiZXJyb3IgJGUiKTsgfSkpCiAgICAgICAgIC5hc0Jyb2FkY2FzdFN0cmVhbSgpOworCisgICAgICAvLyBMaXN0ZW4gdG8gdGhlIGBzdHJlYW1gIGluIHRoZSBpbm5lciB6b25lIChidXQgd2FpdCBpbiBhIG1pY3JvdGFzaykuCiAgICAgICBzY2hlZHVsZU1pY3JvdGFzaygoKSB7CiAgICAgICAgIHN0cmVhbS5saXN0ZW4oKHgpIHsKICAgICAgICAgICBldmVudHMuYWRkKCJzdHJlYW0gJHgiKTsKQEAgLTM2LDEyICs0MCwxMyBAQAogICAgICAgfSk7CiAgICAgfSkubGlzdGVuKCh4KSB7IGV2ZW50cy5hZGQoeCk7IH0pCiAgICAgICAuYXNGdXR1cmUoKS50aGVuKChfKSB7IEV4cGVjdC5mYWlsKCJVbmV4cGVjdGVkIGNhbGxiYWNrIik7IH0pOworCisgICAgLy8gTGlzdGVuIHRvIGBzdHJlYW1gIGZyb20gdGhlIG91dGVyIHpvbmUuCiAgICAgc3RyZWFtLmxpc3RlbigoeCkgeyBldmVudHMuYWRkKCJzdHJlYW0yICR4Iik7IH0pOworCisgICAgLy8gRmVlZCB0aGUgY29udHJvbGxlciwgYnV0IHdhaXQgaW4gYSBtaWNyb3Rhc2suCiAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgY29udHJvbGxlci5hZGQoMSk7Ci0gICAgICAvLyBFcnJvcnMgYXJlIG5vdCBhbGxvd2VkIHRvIHRyYXZlcnNlIGJvdW5kYXJpZXMsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlCi0gICAgICAvLyBmaXJzdCBsaXN0ZW5lciBvZiB0aGUgYnJvYWRjYXN0IHN0cmVhbSBpcyBpbiB0aGUgc2FtZSBlcnJvci16b25lLiBTbwotICAgICAgLy8gdGhpcyBzaG91bGQgd29yay4KICAgICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoMik7CiAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7CiAgICAgfSk7CkBAIC01MiwxMCArNTcsMTAgQEAKICAgICAvLyBHaXZlIGhhbmRsZXJzIHRpbWUgdG8gY29tcGxldGUuCiAgICAgVGltZXIucnVuKCgpIHsKICAgICAgIEV4cGVjdC5saXN0RXF1YWxzKFsibWFwIDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiAxMDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIDEwMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0yIGVycm9yIDIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIGVycm9yIDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0yIDEwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSAxMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0yIGVycm9yIDIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gZXJyb3IgMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzKTsKICAgICAgIGFzeW5jRW5kKCk7CmRpZmYgLS1naXQgYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjZfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczI2X3Rlc3QuZGFydAppbmRleCAxNzE3YjI0Li42ZDQ3MWI4IDEwMDY0NAotLS0gYS90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjZfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMyNl90ZXN0LmRhcnQKQEAgLTE0LDExICsxNCwxMiBAQAogICB2YXIgZXZlbnRzID0gW107CiAgIFN0cmVhbUNvbnRyb2xsZXIgY29udHJvbGxlcjsKICAgU3RyZWFtIHN0cmVhbTsKLSAgLy8gVGVzdCBgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3RgIHN0cmVhbXMuIE5vdGUgdGhhdCB0aGUgbmVzdGVkIGxpc3RlbmVyCi0gIC8vIGRvZXNuJ3Qgc2VlIHRoZSBlcnJvciwgYnV0IHRoZSBvdXRlciBvbmUgZG9lcy4KKyAgLy8gVGVzdCBgU3RyZWFtQ29udHJvbGxlci5icm9hZGNhc3RgIHN0cmVhbXMuCiAgIGNhdGNoRXJyb3JzKCgpIHsKICAgICBjYXRjaEVycm9ycygoKSB7CiAgICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIuYnJvYWRjYXN0KCk7CisKKyAgICAgIC8vIExpc3RlbiB0byB0aGUgc3RyZWFtIGZyb20gdGhlIGlubmVyIHpvbmUuCiAgICAgICBjb250cm9sbGVyLnN0cmVhbQogICAgICAgICAubWFwKCh4KSB7CiAgICAgICAgICAgZXZlbnRzLmFkZCgibWFwICR4Iik7CkBAIC0yNywxOSArMjgsMjIgQEAKICAgICAgICAgLnRyYW5zZm9ybShuZXcgU3RyZWFtVHJhbnNmb3JtZXIuZnJvbUhhbmRsZXJzKAogICAgICAgICAgICAgaGFuZGxlRXJyb3I6IChlLCBzdCwgc2luaykgeyBzaW5rLmFkZCgiZXJyb3IgJGUiKTsgfSkpCiAgICAgICAgIC5saXN0ZW4oKHgpIHsgZXZlbnRzLmFkZCgic3RyZWFtICR4Iik7IH0pOworCiAgICAgfSkubGlzdGVuKCh4KSB7IGV2ZW50cy5hZGQoeCk7IH0pCiAgICAgICAuYXNGdXR1cmUoKS50aGVuKChfKSB7IEV4cGVjdC5mYWlsKCJVbmV4cGVjdGVkIGNhbGxiYWNrIik7IH0pOworCisgICAgLy8gTGlzdGVuIHRvIHRoZSBzdHJlYW0gZnJvbSB0aGUgb3V0ZXIgem9uZS4KICAgICBjb250cm9sbGVyLnN0cmVhbS5saXN0ZW4oKHgpIHsgZXZlbnRzLmFkZCgic3RyZWFtMiAkeCIpOyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yOiAoeCkgeyBldmVudHMuYWRkKCJzdHJlYW0yIGVycm9yICR4Iik7IH0pOworCisgICAgLy8gRmVlZCB0aGUgY29udHJvbGxlci4KICAgICBjb250cm9sbGVyLmFkZCgxKTsKLSAgICAvLyBFcnJvcnMgYXJlIG5vdCBhbGxvd2VkIHRvIHRyYXZlcnNlIGJvdW5kYXJpZXMsIGJ1dCBpbiB0aGlzIGNhc2UgdGhlCi0gICAgLy8gZmlyc3QgbGlzdGVuZXIgb2YgdGhlIGJyb2FkY2FzdCBzdHJlYW0gaXMgaW4gdGhlIHNhbWUgZXJyb3Item9uZS4gU28KLSAgICAvLyB0aGlzIHNob3VsZCB3b3JrLgotICAgIGNvbnRyb2xsZXIuYWRkRXJyb3IoMik7CisgICAgY29udHJvbGxlci5hZGRFcnJvcigiaW5uZXIgc3RyZWFtIik7CisgICAgbmV3IEZ1dHVyZS5lcnJvcigib3V0ZXIgZXJyb3IiKTsKICAgICBjb250cm9sbGVyLmNsb3NlKCk7CiAgIH0pLmxpc3RlbigoeCkgewogICAgICAgICAgICAgICBldmVudHMuYWRkKCJvdXRlcjogJHgiKTsKLSAgICAgICAgICAgICAgaWYgKHggPT0gMikgZG9uZS5jb21wbGV0ZSh0cnVlKTsKKyAgICAgICAgICAgICAgaWYgKHggPT0gIm91dGVyIGVycm9yIikgZG9uZS5jb21wbGV0ZSh0cnVlKTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBvbkRvbmU6ICgpIHsgRXhwZWN0LmZhaWwoIlVuZXhwZWN0ZWQgY2FsbGJhY2siKTsgfSk7CiAKQEAgLTQ5LDggKzUzLDkgQEAKICAgICAgIEV4cGVjdC5saXN0RXF1YWxzKFsibWFwIDEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtIDEwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0yIDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiBlcnJvciAyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyOiAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSBlcnJvciBpbm5lciBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiBlcnJvciBpbm5lciBzdHJlYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0ZXI6IG91dGVyIGVycm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMpOwogICAgICAgYXN5bmNFbmQoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMyN190ZXN0LmRhcnQgYi90ZXN0cy9saWIvYXN5bmMvY2F0Y2hfZXJyb3JzMjdfdGVzdC5kYXJ0CmluZGV4IDlhOGFiOGIuLmJmYTJiZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2xpYi9hc3luYy9jYXRjaF9lcnJvcnMyN190ZXN0LmRhcnQKKysrIGIvdGVzdHMvbGliL2FzeW5jL2NhdGNoX2Vycm9yczI3X3Rlc3QuZGFydApAQCAtMTQsMzYgKzE0LDQyIEBACiAgIHZhciBldmVudHMgPSBbXTsKICAgU3RyZWFtQ29udHJvbGxlciBjb250cm9sbGVyOwogICBTdHJlYW0gc3RyZWFtOwotICAvLyBUZXN0IHRoYXQgdGhlIGZpcnN0IGxpc3RlbiBvbiBhIGBhc0Jyb2FkY2FzdFN0cmVhbWAgZGV0ZXJtaW5lcyB0aGUKLSAgLy8gem9uZSB0aGUgc3Vic2NyaXB0aW9uIGxpdmVzIGluLiBUaGUgaW5uZXIgbGlzdGVuIGhhcHBlbnMgZmlyc3QsIGFuZAotICAvLyB0aGUgb3V0ZXIgbGlzdGVuZXIgbXVzdCBub3Qgc2VlIHRoZSBlcnJvciBzaW5jZSBpdCB3b3VsZCBjcm9zcyBhCi0gIC8vIHpvbmUgYm91bmRhcnkuIEl0IGlzIHRoZXJlZm9yZSBnaXZlbiB0byB0aGUgaW5uZXIgYGNhdGNoRXJyb3JzYC4KKyAgLy8gVGVzdCB0aGF0IHN0cmVhbXMgbGl2ZSBpbiB0aGUgem9uZSB0aGV5IGhhdmUgYmVlbiBsaXN0ZW5lZCB0b28uCisgIC8vIEl0IGRvZXNuJ3QgbWF0dGVyIGhvdyBtYW55IHpvbmUtYm91bmRhcmllcyB0aGUgc3RyZWFtIHRyYXZlcnNlcy4gV2hhdAorICAvLyBjb3VudHMgaXMgdGhlIHpvbmUgd2hlcmUgYGxpc3RlbmAgd2FzIGludm9rZWQuCiAgIGNhdGNoRXJyb3JzKCgpIHsKICAgICBjYXRjaEVycm9ycygoKSB7CiAgICAgICBjb250cm9sbGVyID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKworICAgICAgLy8gQXNzaWdubWVudCB0byAiZ2xvYmFsIiBgc3RyZWFtYC4KICAgICAgIHN0cmVhbSA9IGNvbnRyb2xsZXIuc3RyZWFtCiAgICAgICAgIC5tYXAoKHgpIHsKICAgICAgICAgICBldmVudHMuYWRkKCJtYXAgJHgiKTsKICAgICAgICAgICByZXR1cm4geCArIDEwMDsKICAgICAgICAgfSkKICAgICAgICAgLmFzQnJvYWRjYXN0U3RyZWFtKCk7CisKKyAgICAgIC8vIENvbnN1bWUgc3RyZWFtIGluIHRoZSBuZXN0ZWQgem9uZS4KICAgICAgIHN0cmVhbQogICAgICAgICAudHJhbnNmb3JtKG5ldyBTdHJlYW1UcmFuc2Zvcm1lci5mcm9tSGFuZGxlcnMoCiAgICAgICAgICAgICBoYW5kbGVFcnJvcjogKGUsIHN0LCBzaW5rKSB7IHNpbmsuYWRkKCJlcnJvciAkZSIpOyB9KSkKICAgICAgICAgLmxpc3RlbigoeCkgeyBldmVudHMuYWRkKCJzdHJlYW0gJHgiKTsgfSk7CisKKyAgICAgIC8vIEZlZWQgdGhlIGNvbnRyb2xsZXIgaW4gdGhlIG5lc3RlZCB6b25lLgogICAgICAgc2NoZWR1bGVNaWNyb3Rhc2soKCkgewogICAgICAgICBjb250cm9sbGVyLmFkZCgxKTsKLSAgICAgICAgLy8gRXJyb3JzIGFyZSBub3QgYWxsb3dlZCB0byB0cmF2ZXJzZSBib3VuZGFyaWVzLCBidXQgaW4gdGhpcyBjYXNlIHRoZQotICAgICAgICAvLyBmaXJzdCBsaXN0ZW5lciBvZiB0aGUgYnJvYWRjYXN0IHN0cmVhbSBpcyBpbiB0aGUgc2FtZSBlcnJvci16b25lLiBTbwotICAgICAgICAvLyB0aGlzIHNob3VsZCB3b3JrLgogICAgICAgICBjb250cm9sbGVyLmFkZEVycm9yKDIpOwogICAgICAgICBjb250cm9sbGVyLmNsb3NlKCk7CisgICAgICAgIG5ldyBGdXR1cmUuZXJyb3IoImRvbmUiKTsKICAgICAgIH0pOworCiAgICAgfSkubGlzdGVuKCh4KSB7Ci0gICAgICAgICAgICAgICAgZXZlbnRzLmFkZCh4KTsKLSAgICAgICAgICAgICAgICBpZiAoeCA9PSAyKSBkb25lLmNvbXBsZXRlKHRydWUpOworICAgICAgICAgICAgICAgIGV2ZW50cy5hZGQoImxpc3RlbjogJHgiKTsKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAiZG9uZSIpIGRvbmUuY29tcGxldGUodHJ1ZSk7CiAgICAgICAgICAgICAgIH0pCiAgICAgICAuYXNGdXR1cmUoKS50aGVuKChfKSB7IEV4cGVjdC5mYWlsKCJVbmV4cGVjdGVkIGNhbGxiYWNrIik7IH0pOworCisgICAgLy8gTGlzdGVuIHRvIHN0cmVhbSBpbiBvdXRlciB6b25lLgogICAgIHN0cmVhbS5saXN0ZW4oKHgpIHsgZXZlbnRzLmFkZCgic3RyZWFtMiAkeCIpOyB9KTsKICAgfSkubGlzdGVuKCh4KSB7IGV2ZW50cy5hZGQoIm91dGVyOiAkeCIpOyB9LAogICAgICAgICAgICAgb25Eb25lOiAoKSB7IEV4cGVjdC5mYWlsKCJVbmV4cGVjdGVkIGNhbGxiYWNrIik7IH0pOwpAQCAtNTIsMTAgKzU4LDExIEBACiAgICAgLy8gR2l2ZSBoYW5kbGVycyB0aW1lIHRvIHJ1bi4KICAgICBUaW1lci5ydW4oKCkgewogICAgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWyJtYXAgMSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gMTAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbTIgMTAxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInN0cmVhbSBlcnJvciAyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgLy8gQ2F1Z2h0IGJ5IHRoZSBpbm5lciBgY2F0Y2hFcnJvcnNgLgorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gMTAxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtMiAxMDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gZXJyb3IgMiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImxpc3RlbjogZG9uZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm91dGVyOiAyIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudHMpOwogICAgICAgYXN5bmNFbmQoKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fem9uZXNfdGVzdC5kYXJ0IGIvdGVzdHMvbGliL2FzeW5jL3N0cmVhbV96b25lc190ZXN0LmRhcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5NDFmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2xpYi9hc3luYy9zdHJlYW1fem9uZXNfdGVzdC5kYXJ0CkBAIC0wLDAgKzEsMTg3IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorLy8gZm9yIGRldGFpbHMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEKKy8vIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKK2ltcG9ydCAncGFja2FnZTphc3luY19oZWxwZXIvYXN5bmNfaGVscGVyLmRhcnQnOworaW1wb3J0ICJwYWNrYWdlOmV4cGVjdC9leHBlY3QuZGFydCI7CitpbXBvcnQgJ2RhcnQ6YXN5bmMnOworCisvLy8gU3RyZWFtQ29udHJvbGxlciBpbiBuZXN0ZWQgcnVuWm9uZWQuIFRyaXZpYWwuCit0ZXN0MSgpIHsKKyAgdmFyIGV2ZW50cyA9IFtdOworICB2YXIgZG9uZSA9IG5ldyBDb21wbGV0ZXIoKTsKKyAgcnVuWm9uZWQoKCkgeworICAgIHJ1blpvbmVkKCgpIHsKKyAgICAgIHZhciBjID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgICAgIGMuc3RyZWFtLmxpc3RlbigKKyAgICAgICAgICAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiAkeCIpLAorICAgICAgICAgICBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiBlcnJvciAkeCIpLAorICAgICAgICAgICBvbkRvbmU6IGRvbmUuY29tcGxldGUpOworICAgICAgYy5hZGQoMSk7CisgICAgICBjLmFkZEVycm9yKDIpOworICAgICAgYy5jbG9zZSgpOworICAgIH0sIG9uRXJyb3I6ICh4KSA9PiBldmVudHMuYWRkKCJyemE6IGVycm9yICR4IikpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnpiOiBlcnJvciAkeCIpKTsKKyAgcmV0dXJuIFtkb25lLmZ1dHVyZSwgKCkgeworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsic3RyZWFtOiAxIiwgInN0cmVhbTogZXJyb3IgMiJdLCBldmVudHMpOworICB9XTsKK30KKworLy8vIEFkZGluZyBlcnJvcnMgdG8gdGhlIHN0cmVhbSBjb250cm9sbGVyIGZyb20gYW4gb3V0c2lkZSB6b25lLgordGVzdDIoKSB7CisgIHZhciBldmVudHMgPSBbXTsKKyAgdmFyIGRvbmUgPSBuZXcgQ29tcGxldGVyKCk7CisgIHJ1blpvbmVkKCgpIHsKKyAgICB2YXIgYzsKKyAgICBydW5ab25lZCgoKSB7CisgICAgICBjID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgICAgIGMuc3RyZWFtLmxpc3RlbigKKyAgICAgICAgICAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiAkeCIpLAorICAgICAgICAgICBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiBlcnJvciAkeCIpLAorICAgICAgICAgICBvbkRvbmU6IGRvbmUuY29tcGxldGUpOworICAgIH0sIG9uRXJyb3I6ICh4KSA9PiBldmVudHMuYWRkKCJyemE6IGVycm9yICR4IikpOworICAgIGMuYWRkKDEpOworICAgIGMuYWRkRXJyb3IoMik7CisgICAgYy5jbG9zZSgpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnpiOiBlcnJvciAkeCIpKTsKKyAgcmV0dXJuIFtkb25lLmZ1dHVyZSwgKCkgeworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsic3RyZWFtOiAxIiwgInN0cmVhbTogZXJyb3IgMiJdLCBldmVudHMpOworICB9XTsKK30KKworLy8vIEFkZGluZyBlcnJvcnMgdG8gdGhlIHN0cmVhbSBjb250cm9sbGVyIGZyb20gYSBtb3JlIG5lc3RlZCB6b25lLgordGVzdDMoKSB7CisgIHZhciBldmVudHMgPSBbXTsKKyAgdmFyIGRvbmUgPSBuZXcgQ29tcGxldGVyKCk7CisgIHJ1blpvbmVkKCgpIHsKKyAgICB2YXIgYyA9IG5ldyBTdHJlYW1Db250cm9sbGVyKCk7CisgICAgYy5zdHJlYW0ubGlzdGVuKAorICAgICAgICAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiAkeCIpLAorICAgICAgICAgIG9uRXJyb3I6ICh4KSA9PiBldmVudHMuYWRkKCJzdHJlYW06IGVycm9yICR4IiksCisgICAgICAgICAgb25Eb25lOiBkb25lLmNvbXBsZXRlKTsKKyAgICBydW5ab25lZCgoKSB7CisgICAgICBjLmFkZCgxKTsKKyAgICAgIGMuYWRkRXJyb3IoMik7CisgICAgICBjLmNsb3NlKCk7CisgICAgfSwgb25FcnJvcjogKHgpID0+IGV2ZW50cy5hZGQoInJ6YTogZXJyb3IgJHgiKSk7CisgIH0sIG9uRXJyb3I6ICh4KSA9PiBldmVudHMuYWRkKCJyemI6IGVycm9yICR4IikpOworICByZXR1cm4gW2RvbmUuZnV0dXJlLCAoKSB7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWyJzdHJlYW06IDEiLCAic3RyZWFtOiBlcnJvciAyIl0sIGV2ZW50cyk7CisgIH1dOworfQorCisvLy8gRmVlZGluZyBhIHN0cmVhbSBmcm9tIGEgZGlmZmVyZW50IHpvbmUgaW50byBhbm90aGVyIGNvbnRyb2xsZXIuCit0ZXN0NCgpIHsKKyAgdmFyIGV2ZW50cyA9IFtdOworICB2YXIgZG9uZSA9IG5ldyBDb21wbGV0ZXIoKTsKKyAgcnVuWm9uZWQoKCkgeworICAgIHZhciBjID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgICBjLnN0cmVhbS5saXN0ZW4oCisgICAgICAgICh4KSA9PiBldmVudHMuYWRkKCJzdHJlYW06ICR4IiksCisgICAgICAgICAgb25FcnJvcjogKHgpID0+IGV2ZW50cy5hZGQoInN0cmVhbTogZXJyb3IgJHgiKSwKKyAgICAgICAgICBvbkRvbmU6IGRvbmUuY29tcGxldGUpOworICAgIHJ1blpvbmVkKCgpIHsKKyAgICAgIHZhciBjMiA9IG5ldyBTdHJlYW1Db250cm9sbGVyKCk7CisgICAgICBjLmFkZFN0cmVhbShjMi5zdHJlYW0pLndoZW5Db21wbGV0ZShjLmNsb3NlKTsKKyAgICAgIGMyLmFkZCgxKTsKKyAgICAgIGMyLmFkZEVycm9yKDIpOworICAgICAgYzIuY2xvc2UoKTsKKyAgICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnphOiBlcnJvciAkeCIpKTsKKyAgfSwgb25FcnJvcjogKHgpID0+IGV2ZW50cy5hZGQoInJ6YjogZXJyb3IgJHgiKSk7CisgIHJldHVybiBbZG9uZS5mdXR1cmUsICgpIHsKKyAgICBFeHBlY3QubGlzdEVxdWFscyhbInN0cmVhbTogMSIsICJzdHJlYW06IGVycm9yIDIiXSwgZXZlbnRzKTsKKyAgfV07Cit9CisKKy8vLyBGZWVkaW5nIGEgc3RyZWFtIGZyb20gYSBkaWZmZXJlbnQgem9uZSBpbnRvIGFub3RoZXIgY29udHJvbGxlci4KKy8vLyBUaGlzIHRpbWUgbmVzdGluZyBpcyByZXZlcnNlZCB3cnQgdGVzdDQuCit0ZXN0NSgpIHsKKyAgdmFyIGV2ZW50cyA9IFtdOworICB2YXIgZG9uZSA9IG5ldyBDb21wbGV0ZXIoKTsKKyAgcnVuWm9uZWQoKCkgeworICAgIHZhciBjOworICAgIHJ1blpvbmVkKCgpIHsKKyAgICAgIGMgPSBuZXcgU3RyZWFtQ29udHJvbGxlcigpOworICAgICAgYy5zdHJlYW0ubGlzdGVuKAorICAgICAgICAgICh4KSA9PiBldmVudHMuYWRkKCJzdHJlYW06ICR4IiksCisgICAgICAgICAgICBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgic3RyZWFtOiBlcnJvciAkeCIpLAorICAgICAgICAgICAgb25Eb25lOiBkb25lLmNvbXBsZXRlKTsKKyAgICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnphOiBlcnJvciAkeCIpKTsKKyAgICB2YXIgYzIgPSBuZXcgU3RyZWFtQ29udHJvbGxlcigpOworICAgIGMuYWRkU3RyZWFtKGMyLnN0cmVhbSkud2hlbkNvbXBsZXRlKGMuY2xvc2UpOworICAgIGMyLmFkZCgxKTsKKyAgICBjMi5hZGRFcnJvcigyKTsKKyAgICBjMi5jbG9zZSgpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnpiOiBlcnJvciAkeCIpKTsKKyAgcmV0dXJuIFtkb25lLmZ1dHVyZSwgKCkgeworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsic3RyZWFtOiAxIiwgInN0cmVhbTogZXJyb3IgMiJdLCBldmVudHMpOworICB9XTsKK30KKworCit0ZXN0NigpIHsKKyAgdmFyIGV2ZW50cyA9IFtdOworICB2YXIgZG9uZSA9IG5ldyBDb21wbGV0ZXIoKTsKKyAgdmFyIGM7CisgIHJ1blpvbmVkKCgpIHsKKyAgICBjID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgICBjLnN0cmVhbS5saXN0ZW4oCisgICAgICAgICh4KSA9PiBldmVudHMuYWRkKCJzdHJlYW06ICR4IiksCisgICAgICAgICAgb25FcnJvcjogKHgpID0+IGV2ZW50cy5hZGQoInN0cmVhbTogZXJyb3IgJHgiKSwKKyAgICAgICAgICBvbkRvbmU6IGRvbmUuY29tcGxldGUpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnphOiBlcnJvciAkeCIpKTsKKyAgcnVuWm9uZWQoKCkgeworICAgIHZhciBjMiA9IG5ldyBTdHJlYW1Db250cm9sbGVyKCk7CisgICAgYy5hZGRTdHJlYW0oYzIuc3RyZWFtKS53aGVuQ29tcGxldGUoYy5jbG9zZSk7CisgICAgYzIuYWRkKDEpOworICAgIGMyLmFkZEVycm9yKDIpOworICAgIGMyLmNsb3NlKCk7CisgIH0sIG9uRXJyb3I6ICh4KSA9PiBldmVudHMuYWRkKCJyemI6IGVycm9yICR4IikpOworICByZXR1cm4gW2RvbmUuZnV0dXJlLCAoKSB7CisgICAgRXhwZWN0Lmxpc3RFcXVhbHMoWyJzdHJlYW06IDEiLCAic3RyZWFtOiBlcnJvciAyIl0sIGV2ZW50cyk7CisgIH1dOworfQorCisvLy8gQWRkaW5nIGVycm9ycyB0byB0aGUgc3RyZWFtIGNvbnRyb2xsZXIgZnJvbSBhIHBhcmFsbGVsIHpvbmUuCit0ZXN0NygpIHsKKyAgdmFyIGV2ZW50cyA9IFtdOworICB2YXIgZG9uZSA9IG5ldyBDb21wbGV0ZXIoKTsKKyAgdmFyIGM7CisgIHJ1blpvbmVkKCgpIHsKKyAgICBjID0gbmV3IFN0cmVhbUNvbnRyb2xsZXIoKTsKKyAgICBjLnN0cmVhbS5saXN0ZW4oCisgICAgICAgICh4KSA9PiBldmVudHMuYWRkKCJzdHJlYW06ICR4IiksCisgICAgICAgICAgb25FcnJvcjogKHgpID0+IGV2ZW50cy5hZGQoInN0cmVhbTogZXJyb3IgJHgiKSwKKyAgICAgICAgICBvbkRvbmU6IGRvbmUuY29tcGxldGUpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnphOiBlcnJvciAkeCIpKTsKKyAgcnVuWm9uZWQoKCkgeworICAgIGMuYWRkKDEpOworICAgIGMuYWRkRXJyb3IoMik7CisgICAgYy5jbG9zZSgpOworICB9LCBvbkVycm9yOiAoeCkgPT4gZXZlbnRzLmFkZCgicnpiOiBlcnJvciAkeCIpKTsKKyAgcmV0dXJuIFtkb25lLmZ1dHVyZSwgKCkgeworICAgIEV4cGVjdC5saXN0RXF1YWxzKFsic3RyZWFtOiAxIiwgInN0cmVhbTogZXJyb3IgMiJdLCBldmVudHMpOworICB9XTsKK30KKworbWFpbigpIHsKKyAgYXN5bmNTdGFydCgpOworCisgIHZhciB0ZXN0cyA9IFsKKyAgICB0ZXN0MSgpLAorICAgIHRlc3QyKCksCisgICAgdGVzdDMoKSwKKyAgICB0ZXN0NCgpLAorICAgIHRlc3Q1KCksCisgICAgdGVzdDYoKSwKKyAgICB0ZXN0NygpLAorICBdOworCisgIEZ1dHVyZS53YWl0KHRlc3RzLm1hcCgobCkgPT4gbC5maXJzdCkpLnRoZW4oKF8pIHsKKyAgICAvLyBHaXZlIHRpbWUgdG8gY29tcGxldGUgYWxsIHBlbmRpbmcgYWN0aW9ucy4KKyAgICBUaW1lci5ydW4oKCkgeworICAgICAgdGVzdHMuZm9yRWFjaCgobCkgPT4gKGwubGFzdCkoKSk7CisgICAgICBhc3luY0VuZCgpOworICAgIH0pOworICB9KTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2xpYi9saWIuc3RhdHVzIGIvdGVzdHMvbGliL2xpYi5zdGF0dXMKaW5kZXggOWVkYzcyMC4uNjVhOWQ1OCAxMDA2NDQKLS0tIGEvdGVzdHMvbGliL2xpYi5zdGF0dXMKKysrIGIvdGVzdHMvbGliL2xpYi5zdGF0dXMKQEAgLTI1OSw3ICsyNTksNiBAQAogbWlycm9ycy9taXJyb3JzX3JlYWRlcl90ZXN0OiBTa2lwICMgRGFydGl1bSBkZWJ1ZyB1c2VzIC1PMCwgc28gdGhpcyB3aWxsIGp1c3QgdGltZW91dCBhbmQgd2FzdGUgYm90IGN5Y2xlcy4KIG1pcnJvcnMvbGlicmFyeV91cmlfaW9fdGVzdDogU2tpcCAjIE5vdCBpbnRlbmRlZCBmb3IgZHJ0IGFzIGl0IHVzZXMgZGFydDppby4KIG1pcnJvcnMvbG9jYWxfaXNvbGF0ZV90ZXN0OiBTa2lwICMgaHR0cDovL2RhcnRidWcuY29tLzEyMTg4Ci1taXJyb3JzL2RlZmVycmVkKjogU2tpcCAjIExhenkgZGVmZXJyZWQgbG9hZGluZyBub3QgeWV0IGltcGxlbWVudGVkLiBJc3N1ZSAxOTQ0OS4gQ3Jhc2hlcyBkcnQgaW4gY2hlY2tlZCBtb2RlLgogCiBbICRjb21waWxlciA9PSBub25lICYmICRydW50aW1lID09IGRydCAmJiAkc3lzdGVtID09IHdpbmRvd3MgXQogYXN5bmMvbXVsdGlwbGVfdGltZXJfdGVzdDogRmFpbCwgUGFzcyAjIFNlZSBJc3N1ZSAxMDk4MgpkaWZmIC0tZ2l0IGEvdGVzdHMvdHJ5L3BvaS9wb2lfdGVzdC5kYXJ0IGIvdGVzdHMvdHJ5L3BvaS9wb2lfdGVzdC5kYXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzhjYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy90cnkvcG9pL3BvaV90ZXN0LmRhcnQKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDE0LCB0aGUgRGFydCBwcm9qZWN0IGF1dGhvcnMuICBQbGVhc2Ugc2VlIHRoZSBBVVRIT1JTIGZpbGUKKy8vIGZvciBkZXRhaWxzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhCisvLyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitsaWJyYXJ5IHRyeWRhcnQucG9pX3Rlc3Q7CisKK2ltcG9ydCAnZGFydDppbycgc2hvdworICAgIFBsYXRmb3JtOworCitpbXBvcnQgJ3BhY2thZ2U6dHJ5L3BvaS9wb2kuZGFydCcgYXMgcG9pOworCitpbXBvcnQgJ3BhY2thZ2U6YXN5bmNfaGVscGVyL2FzeW5jX2hlbHBlci5kYXJ0JzsKKwordm9pZCBtYWluKCkgeworICBwb2kubWFpbig8U3RyaW5nPltQbGF0Zm9ybS5zY3JpcHQudG9GaWxlUGF0aCgpLCAnMzM5J10pOworICBhc3luY1Rlc3QoKCkgPT4gcG9pLmRvbmVGdXR1cmUpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvdHJ5L3RyeS5zdGF0dXMgYi90ZXN0cy90cnkvdHJ5LnN0YXR1cwppbmRleCA1NzAzNjJkLi5hYzVhYTM3IDEwMDY0NAotLS0gYS90ZXN0cy90cnkvdHJ5LnN0YXR1cworKysgYi90ZXN0cy90cnkvdHJ5LnN0YXR1cwpAQCAtNywxMyArNywxNiBAQAogIyBkYXJ0MmpzLWNocm9tZQogIyBkYXJ0MmpzLWZmIChGaXJlZm94KQogWyAkY29tcGlsZXIgIT0gZGFydDJqcyB8fCAoJHJ1bnRpbWUgIT0gZHJ0ICYmICRydW50aW1lICE9IGNocm9tZSAmJiAkcnVudGltZSAhPSBmZiAmJiAkcnVudGltZSAhPSBzYWZhcmkpIF0KLSo6IFNraXAKK3dlYi8qOiBTa2lwCiAKIFsgJGNvbXBpbGVyID09IGRhcnQyanMgJiYgJHJ1bnRpbWUgPT0gZHJ0IF0KLWVuZF90b19lbmRfdGVzdDogRmFpbCwgUGFzcyAjIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zMzQ3Cit3ZWIvZW5kX3RvX2VuZF90ZXN0OiBGYWlsLCBQYXNzICMgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMzNDcKIAogWyAkY3NwIF0KLWVuZF90b19lbmRfdGVzdDogRmFpbCwgT0sgIyBodHRwOi8vZGFydGJ1Zy5jb20vMTc5MzUKK3dlYi9lbmRfdG9fZW5kX3Rlc3Q6IEZhaWwsIE9LICMgaHR0cDovL2RhcnRidWcuY29tLzE3OTM1CiAKIFsgJHJ1bnRpbWUgPT0gc2FmYXJpIF0KLWN1cnNvcl9wb3NpdGlvbl90ZXN0OiBGYWlsICMgaHR0cDovL2RhcnRidWcuY29tLzE5ODM2Cit3ZWIvY3Vyc29yX3Bvc2l0aW9uX3Rlc3Q6IEZhaWwgIyBodHRwOi8vZGFydGJ1Zy5jb20vMTk4MzYKKworWyAkYnJvd3NlciBdCitwb2kvcG9pX3Rlc3Q6IFNraXBCeURlc2lnbiAjIFVzZXMgZGFydDppby4KZGlmZiAtLWdpdCBhL3Rlc3RzL3RyeS9jdXJzb3JfcG9zaXRpb25fdGVzdC5kYXJ0IGIvdGVzdHMvdHJ5L3dlYi9jdXJzb3JfcG9zaXRpb25fdGVzdC5kYXJ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90cnkvY3Vyc29yX3Bvc2l0aW9uX3Rlc3QuZGFydApyZW5hbWUgdG8gdGVzdHMvdHJ5L3dlYi9jdXJzb3JfcG9zaXRpb25fdGVzdC5kYXJ0CmRpZmYgLS1naXQgYS90ZXN0cy90cnkvZW5kX3RvX2VuZF90ZXN0LmRhcnQgYi90ZXN0cy90cnkvd2ViL2VuZF90b19lbmRfdGVzdC5kYXJ0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90cnkvZW5kX3RvX2VuZF90ZXN0LmRhcnQKcmVuYW1lIHRvIHRlc3RzL3RyeS93ZWIvZW5kX3RvX2VuZF90ZXN0LmRhcnQKZGlmZiAtLWdpdCBhL3Rlc3RzL3RyeS9pbnRlcm5hbF9lcnJvcl90ZXN0LmRhcnQgYi90ZXN0cy90cnkvd2ViL2ludGVybmFsX2Vycm9yX3Rlc3QuZGFydApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSB0ZXN0cy90cnkvaW50ZXJuYWxfZXJyb3JfdGVzdC5kYXJ0CnJlbmFtZSB0byB0ZXN0cy90cnkvd2ViL2ludGVybmFsX2Vycm9yX3Rlc3QuZGFydAppbmRleCA5Y2FkNTVlLi4wNWY0NDdjIDEwMDY0NAotLS0gYS90ZXN0cy90cnkvaW50ZXJuYWxfZXJyb3JfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL3RyeS93ZWIvaW50ZXJuYWxfZXJyb3JfdGVzdC5kYXJ0CkBAIC0xOSw4ICsxOSw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6dHJ5L3NyYy91c2VyX29wdGlvbi5kYXJ0JyBzaG93CiAgICAgVXNlck9wdGlvbjsKIAotaW1wb3J0ICcuLi8uLi9wa2cvZXhwZWN0L2xpYi9leHBlY3QuZGFydCc7Ci1pbXBvcnQgJy4uLy4uL3BrZy9hc3luY19oZWxwZXIvbGliL2FzeW5jX2hlbHBlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCc7CiAKIG1haW4oKSB7CiAgIFVzZXJPcHRpb24uc3RvcmFnZSA9IHt9OwpkaWZmIC0tZ2l0IGEvdGVzdHMvdHJ5L21vY2tfdHJ5LmRhcnQgYi90ZXN0cy90cnkvd2ViL21vY2tfdHJ5LmRhcnQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL3RyeS9tb2NrX3RyeS5kYXJ0CnJlbmFtZSB0byB0ZXN0cy90cnkvd2ViL21vY2tfdHJ5LmRhcnQKZGlmZiAtLWdpdCBhL3Rlc3RzL3RyeS9wYXN0ZV9jb250ZW50X3Jld3JpdGluZ190ZXN0LmRhcnQgYi90ZXN0cy90cnkvd2ViL3Bhc3RlX2NvbnRlbnRfcmV3cml0aW5nX3Rlc3QuZGFydApzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSB0ZXN0cy90cnkvcGFzdGVfY29udGVudF9yZXdyaXRpbmdfdGVzdC5kYXJ0CnJlbmFtZSB0byB0ZXN0cy90cnkvd2ViL3Bhc3RlX2NvbnRlbnRfcmV3cml0aW5nX3Rlc3QuZGFydAppbmRleCA2NTgzYzc1Li4yMGUwMTU5IDEwMDY0NAotLS0gYS90ZXN0cy90cnkvcGFzdGVfY29udGVudF9yZXdyaXRpbmdfdGVzdC5kYXJ0CisrKyBiL3Rlc3RzL3RyeS93ZWIvcGFzdGVfY29udGVudF9yZXdyaXRpbmdfdGVzdC5kYXJ0CkBAIC0xNyw4ICsxNyw4IEBACiBpbXBvcnQgJ3BhY2thZ2U6dHJ5L3NyYy91c2VyX29wdGlvbi5kYXJ0JyBzaG93CiAgICAgVXNlck9wdGlvbjsKIAotaW1wb3J0ICcuLi8uLi9wa2cvZXhwZWN0L2xpYi9leHBlY3QuZGFydCc7Ci1pbXBvcnQgJy4uLy4uL3BrZy9hc3luY19oZWxwZXIvbGliL2FzeW5jX2hlbHBlci5kYXJ0JzsKK2ltcG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOworaW1wb3J0ICdwYWNrYWdlOmFzeW5jX2hlbHBlci9hc3luY19oZWxwZXIuZGFydCc7CiAKIGNvbnN0IE1hcDxTdHJpbmcsIFN0cmluZz4gdGVzdHMgPSBjb25zdCA8U3RyaW5nLCBTdHJpbmc+IHsKICAgJzxzcGFuPjxwPi8vLi4uPC9wPn08L3NwYW4+JzogJy8vLi4uXG59JywKQEAgLTMxLDYgKzMxLDE1IEBACiAgICdyIiIiXG5cblwnIiIiJzogJ3IiIiJcblxuXCciIiInLAogICAnIic6ICc8RElBR05PU1RJQz4iPC9ESUFHTk9TVElDPicsCiAgICcvKipcbiovJzogJy8qKlxuKi8nLAorCisgIC8vIFRoZSBmb2xsb3dpbmcgY2FzZSB0ZXN0cyB0aGF0IHNpbmdsZSBsaW5lIHN0cmluZ3MgY2FuIHNwYW4gbXVsdGlwbGUgbGluZXMKKyAgLy8gdmlhICR7fS4gVGhlIHN0cmluZyBpcyBjb25zdHJ1Y3RlZCBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRlbGwgaWYgdGhlCisgIC8vIGxpbmUtYmFzZXMgc2Nhbm5lciAoaW5jb3JyZWN0bHkpIHJldmVyc2VzIHRoZSBvcmRlciBvZiB0aGUgc3RyaW5nIHF1b3RlcworICAvLyBpbiBpdHMgc3RhdGUgc3RyaW5nLiBUaGUgZXhhbXBsZSBzdHJpbmcgaXMgYSBjb21wbGljYXRlZCB3YXkgb2Ygd3JpdGluZzoKKyAgLy8gJ1tbe3t9OiB7fX1dXScuIFNlZSBhbHNvCisgIC8vIHRlc3RzL2xhbmd1YWdlL3N0cmluZ19pbnRlcnBvbGF0aW9uX25ld2xpbmVfdGVzdC5kYXJ0LgorICAnIlwkeyBbICJcJHsgWyBcJ1wkeyB7IFwnXCR7XG57XG59IH1cJyA6IHtcbn0gfSB9XCcgXSB9IiBdIH0iJzoKKyAgJyJcJHsgWyAiXCR7IFsgXCdcJHsgeyBcJ1wke1xue1xufSB9XCcgOiB7XG59IH0gfVwnIF0gfSIgXSB9IicsCiB9OwogCiBMaXN0PE5vZGU+IHF1ZXJ5RGlhZ25vc3RpY05vZGVzKCkgewpkaWZmIC0tZ2l0IGEvdGVzdHMvdHJ5L3NvdXJjZV91cGRhdGVfdGVzdC5kYXJ0IGIvdGVzdHMvdHJ5L3dlYi9zb3VyY2VfdXBkYXRlX3Rlc3QuZGFydApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdHJ5L3NvdXJjZV91cGRhdGVfdGVzdC5kYXJ0CnJlbmFtZSB0byB0ZXN0cy90cnkvd2ViL3NvdXJjZV91cGRhdGVfdGVzdC5kYXJ0CmRpZmYgLS1naXQgYS90ZXN0cy90cnkvdGVzdF9jYXNlLmRhcnQgYi90ZXN0cy90cnkvd2ViL3Rlc3RfY2FzZS5kYXJ0CnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHRlc3RzL3RyeS90ZXN0X2Nhc2UuZGFydApyZW5hbWUgdG8gdGVzdHMvdHJ5L3dlYi90ZXN0X2Nhc2UuZGFydAppbmRleCAyMDU0MmYyLi41Y2IzODQ2IDEwMDY0NAotLS0gYS90ZXN0cy90cnkvdGVzdF9jYXNlLmRhcnQKKysrIGIvdGVzdHMvdHJ5L3dlYi90ZXN0X2Nhc2UuZGFydApAQCAtOSw3ICs5LDcgQEAKIAogaW1wb3J0ICdkYXJ0OmFzeW5jJzsKIAotaW1wb3J0ICcuLi8uLi9wa2cvYXN5bmNfaGVscGVyL2xpYi9hc3luY19oZWxwZXIuZGFydCc7CitpbXBvcnQgJ3BhY2thZ2U6YXN5bmNfaGVscGVyL2FzeW5jX2hlbHBlci5kYXJ0JzsKIAogdHlwZWRlZiB2b2lkIFZvaWRGdW5jdGlvbigpOwogCmRpZmYgLS1naXQgYS90ZXN0cy90cnkvdGVzdF90cnkuZGFydCBiL3Rlc3RzL3RyeS93ZWIvdGVzdF90cnkuZGFydApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSB0ZXN0cy90cnkvdGVzdF90cnkuZGFydApyZW5hbWUgdG8gdGVzdHMvdHJ5L3dlYi90ZXN0X3RyeS5kYXJ0CmluZGV4IDc0M2Y5MjkuLjUyYjhlODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3RyeS90ZXN0X3RyeS5kYXJ0CisrKyBiL3Rlc3RzL3RyeS93ZWIvdGVzdF90cnkuZGFydApAQCAtMTMsNyArMTMsNyBAQAogZXhwb3J0ICdwYWNrYWdlOnRyeS9zcmMvdWkuZGFydCcgc2hvdwogICAgIG1haW5FZGl0b3JQYW5lOwogCi1leHBvcnQgJy4uLy4uL3BrZy9leHBlY3QvbGliL2V4cGVjdC5kYXJ0JzsKK2V4cG9ydCAncGFja2FnZTpleHBlY3QvZXhwZWN0LmRhcnQnOwogCiBleHBvcnQgJ3Rlc3RfY2FzZS5kYXJ0JzsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvVkVSU0lPTiBiL3Rvb2xzL1ZFUlNJT04KaW5kZXggOWQ1YzgwMC4uZmJkNDQwNSAxMDA2NDQKLS0tIGEvdG9vbHMvVkVSU0lPTgorKysgYi90b29scy9WRVJTSU9OCkBAIC0yNyw1ICsyNyw1IEBACiBNQUpPUiAxCiBNSU5PUiA2CiBQQVRDSCAwCi1QUkVSRUxFQVNFIDIKK1BSRVJFTEVBU0UgMwogUFJFUkVMRUFTRV9QQVRDSCAwCmRpZmYgLS1naXQgYS90b29scy9ib3RzL2NvbXBpbGVyLnB5IGIvdG9vbHMvYm90cy9jb21waWxlci5weQppbmRleCBmYjBjMWM5Li42MTZmYzg5IDEwMDY0NAotLS0gYS90b29scy9ib3RzL2NvbXBpbGVyLnB5CisrKyBiL3Rvb2xzL2JvdHMvY29tcGlsZXIucHkKQEAgLTI3OCw3ICsyNzgsNyBAQAogICAgIHVuaXRfdGVzdF9mbGFncyA9IFtmbGFnIGZvciBmbGFnIGluIGZsYWdzIGlmIGZsYWcuc3RhcnRzd2l0aCgnLS1zaGFyZCcpXQogICAgICMgUnVuIHRoZSB1bml0IHRlc3RzIGluIGNoZWNrZWQgbW9kZSAodGhlIFZNJ3MgY2hlY2tlZCBtb2RlKS4KICAgICB1bml0X3Rlc3RfZmxhZ3MuYXBwZW5kKCctLWNoZWNrZWQnKQotICAgIFRlc3RTdGVwKCJkYXJ0MmpzX3VuaXQiLCBtb2RlLCBzeXN0ZW0sICdub25lJywgJ3ZtJywgWydkYXJ0MmpzJ10sCisgICAgVGVzdFN0ZXAoImRhcnQyanNfdW5pdCIsIG1vZGUsIHN5c3RlbSwgJ25vbmUnLCAndm0nLCBbJ2RhcnQyanMnLCAndHJ5J10sCiAgICAgICAgICAgICAgdW5pdF90ZXN0X2ZsYWdzLCBhcmNoKQogCiAgIGlmIGNvbXBpbGVyID09ICdkYXJ0MmpzJyBhbmQgcnVudGltZSBpbiBbJ2llMTAnLCAnaWUxMSddOgpkaWZmIC0tZ2l0IGEvdG9vbHMvYm90cy9wYWNrYWdlcy5weSBiL3Rvb2xzL2JvdHMvcGFja2FnZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViYWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2JvdHMvcGFja2FnZXMucHkKQEAgLTAsMCArMSwzMSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIyBDb3B5cmlnaHQgKGMpIDIwMTQsIHRoZSBEYXJ0IHByb2plY3QgYXV0aG9ycy4gIFBsZWFzZSBzZWUgdGhlIEFVVEhPUlMgZmlsZQorIyBmb3IgZGV0YWlscy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYQorIyBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworaW1wb3J0IGJvdAoraW1wb3J0IGJvdF91dGlscworCit1dGlscyA9IGJvdF91dGlscy5HZXRVdGlscygpCisKK1BBQ0tBR0VTX0JVSUxERVIgPSByJ3BhY2thZ2VzLSh3aW5kb3dzfGxpbnV4fG1hYyktKGNvcmUtZWxlbWVudHN8cG9seW1lciknCisKK2RlZiBQYWNrYWdlc0NvbmZpZyhuYW1lLCBpc19idWlsZGJvdCk6CisgIHBhY2thZ2VzX3BhdHRlcm4gPSByZS5tYXRjaChQQUNLQUdFU19CVUlMREVSLCBuYW1lKQorICBpZiBub3QgcGFja2FnZXNfcGF0dGVybjoKKyAgICByZXR1cm4gTm9uZQorICBzeXN0ZW0gPSBwYWNrYWdlc19wYXR0ZXJuLmdyb3VwKDEpCisgIAorICByZXR1cm4gYm90LkJ1aWxkSW5mbygnbm9uZScsICd2bScsICdyZWxlYXNlJywgc3lzdGVtLCBjaGVja2VkPVRydWUpCisKK2RlZiBQYWNrYWdlc1N0ZXBzKGJ1aWxkX2luZm8pOgorICB3aXRoIGJvdC5CdWlsZFN0ZXAoJ1Rlc3RpbmcgcGFja2FnZXMnKToKKyAgICBib3RfbmFtZSwgXyA9IGJvdC5HZXRCb3ROYW1lKCkKKyAgICBwcmludCBib3RfbmFtZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBib3QuUnVuQm90KFBhY2thZ2VzQ29uZmlnLCBQYWNrYWdlc1N0ZXBzKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZGRiZy5kYXJ0IGIvdG9vbHMvZGRiZy5kYXJ0CmluZGV4IGVjOTRmMmUuLjFkMTE5OWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RkYmcuZGFydAorKysgYi90b29scy9kZGJnLmRhcnQKQEAgLTIzLDYgKzIzLDcgQEAKICAgTWFwPGludCxpbnQ+IHRva2VuVG9MaW5lID0gbnVsbDsKIH0KIAorY29uc3QgVW5rbm93bkxvY2F0aW9uID0gY29uc3Qge307CiAKIGNsYXNzIFRhcmdldElzb2xhdGUgewogICBpbnQgaWQ7CkBAIC0zMSw2ICszMiw3IEBACiAKICAgVGFyZ2V0SXNvbGF0ZSh0aGlzLmlkKTsKICAgYm9vbCBnZXQgaXNQYXVzZWQgPT4gcGF1c2VkTG9jYXRpb24gIT0gbnVsbDsKKyAgU3RyaW5nIGdldCBwYXVzZWRVcmwgPT4gcGF1c2VkTG9jYXRpb24gIT0gbnVsbCA/IHBhdXNlZExvY2F0aW9uWyJ1cmwiXSA6IG51bGw7CiAKICAgTWFwPFN0cmluZywgVGFyZ2V0U2NyaXB0PiBzY3JpcHRzID0ge307CiB9CkBAIC01NzUsOSArNTc3LDggQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgICAgdmFyIHVybCwgbGluZTsKLSAgICBpZiAoYXJncy5sZW5ndGggPT0gMiAmJiBjdXJyZW50SXNvbGF0ZS5wYXVzZWRMb2NhdGlvbiAhPSBudWxsKSB7Ci0gICAgICB1cmwgPSBjdXJyZW50SXNvbGF0ZS5wYXVzZWRMb2NhdGlvblsidXJsIl07Ci0gICAgICBhc3NlcnQodXJsICE9IG51bGwpOworICAgIGlmIChhcmdzLmxlbmd0aCA9PSAyICYmIGN1cnJlbnRJc29sYXRlLnBhdXNlZFVybCAhPSBudWxsKSB7CisgICAgICB1cmwgPSBjdXJyZW50SXNvbGF0ZS5wYXVzZWRVcmw7CiAgICAgICBsaW5lID0gaW50LnBhcnNlKGFyZ3NbMV0pOwogICAgIH0gZWxzZSB7CiAgICAgICB1cmwgPSBhcmdzWzFdOwpAQCAtMTExMSwxNCArMTExMiwxNSBAQAogICBhc3NlcnQoaXNvbGF0ZSAhPSBudWxsKTsKICAgYXNzZXJ0KCFpc29sYXRlLmlzUGF1c2VkKTsKICAgdmFyIGxvY2F0aW9uID0gbXNnWyJwYXJhbXMiXVsibG9jYXRpb24iXTs7Ci0gIGFzc2VydChsb2NhdGlvbiAhPSBudWxsKTsKICAgc2V0Q3VycmVudElzb2xhdGUoaXNvbGF0ZSk7Ci0gIGlzb2xhdGUucGF1c2VkTG9jYXRpb24gPSBsb2NhdGlvbjsKKyAgaXNvbGF0ZS5wYXVzZWRMb2NhdGlvbiA9IChsb2NhdGlvbiA9PSBudWxsKSA/IFVua25vd25Mb2NhdGlvbiA6IGxvY2F0aW9uOwogICBpZiAocmVhc29uID09ICJicmVha3BvaW50IikgeworICAgIGFzc2VydChsb2NhdGlvbiAhPSBudWxsKTsKICAgICB2YXIgYnBJZCA9IChtc2dbInBhcmFtcyJdWyJicmVha3BvaW50SWQiXSk7CiAgICAgdmFyIGxhYmVsID0gKGJwSWQgIT0gbnVsbCkgPyAiQnJlYWtwb2ludCAkYnBJZCIgOiBudWxsOwogICAgIHJldHVybiBwcmludExvY2F0aW9uKGxhYmVsLCBsb2NhdGlvbik7CiAgIH0gZWxzZSBpZiAocmVhc29uID09ICJpbnRlcnJ1cHRlZCIpIHsKKyAgICBhc3NlcnQobG9jYXRpb24gIT0gbnVsbCk7CiAgICAgcmV0dXJuIHByaW50TG9jYXRpb24oIkludGVycnVwdGVkIiwgbG9jYXRpb24pOwogICB9IGVsc2UgewogICAgIGFzc2VydChyZWFzb24gPT0gImV4Y2VwdGlvbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvZG9tL3NjcmlwdHMvZGFydG1ldGFkYXRhLnB5IGIvdG9vbHMvZG9tL3NjcmlwdHMvZGFydG1ldGFkYXRhLnB5CmluZGV4IGE4NjQyNGYuLjNmZDVjYzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2RvbS9zY3JpcHRzL2RhcnRtZXRhZGF0YS5weQorKysgYi90b29scy9kb20vc2NyaXB0cy9kYXJ0bWV0YWRhdGEucHkKQEAgLTQ2OSw3ICs0NjksMTIgQEAKICAgIyBQbGFjZWhvbGRlciB0byBhZGQgZXhwZXJpbWVudGFsIGZsYWcsIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIGlzCiAgICMgcGVuZGluZyBpbiBhIHNlcGFyYXRlIENMLgogICAnRWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3InOiBbJ0BFeHBlcmltZW50YWwoKSddLAotICAnRXZlbnQuY2xpcGJvYXJkRGF0YSc6IF93ZWJraXRfZXhwZXJpbWVudGFsX2Fubm90YXRpb25zLAorICAnRXZlbnQuY2xpcGJvYXJkRGF0YSc6IFsKKyAgICAiQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5DSFJPTUUpIiwKKyAgICAiQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5GSVJFRk9YKSIsCisgICAgIkBTdXBwb3J0ZWRCcm93c2VyKFN1cHBvcnRlZEJyb3dzZXIuU0FGQVJJKSIsCisgICAgIkBFeHBlcmltZW50YWwoKSIsCisgIF0sCiAgICdGb3JtRGF0YSc6IF9hbGxfYnV0X2llOV9hbm5vdGF0aW9ucywKICAgJ0hhc2hDaGFuZ2VFdmVudCc6IFsKICAgICAiQFN1cHBvcnRlZEJyb3dzZXIoU3VwcG9ydGVkQnJvd3Nlci5DSFJPTUUpIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2RvbS9zY3JpcHRzL2dlbmVyYXRvci5weSBiL3Rvb2xzL2RvbS9zY3JpcHRzL2dlbmVyYXRvci5weQppbmRleCA0M2NhMTdmLi43NjAwMzk5IDEwMDY0NAotLS0gYS90b29scy9kb20vc2NyaXB0cy9nZW5lcmF0b3IucHkKKysrIGIvdG9vbHMvZG9tL3NjcmlwdHMvZ2VuZXJhdG9yLnB5CkBAIC0xMjQsNyArMTI0LDcgQEAKICAgICAgICAgJ0FwcGxpY2F0aW9uQ2FjaGUsRE9NQXBwbGljYXRpb25DYWNoZSxPZmZsaW5lUmVzb3VyY2VMaXN0JywKIAogICAgICdFdmVudCc6Ci0gICAgICAgICdFdmVudCxJbnB1dEV2ZW50JywKKyAgICAgICAgJ0V2ZW50LElucHV0RXZlbnQsQ2xpcGJvYXJkRXZlbnQnLAogCiAgICAgJ0hUTUxUYWJsZUNlbGxFbGVtZW50JzoKICAgICAgICAgJ0hUTUxUYWJsZUNlbGxFbGVtZW50LEhUTUxUYWJsZURhdGFDZWxsRWxlbWVudCxIVE1MVGFibGVIZWFkZXJDZWxsRWxlbWVudCcsCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL2RhcnQvYnJvd3Nlcl9jb250cm9sbGVyLmRhcnQgYi90b29scy90ZXN0aW5nL2RhcnQvYnJvd3Nlcl9jb250cm9sbGVyLmRhcnQKaW5kZXggZjYyYWY0Ni4uMWY0Mzg0NSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9kYXJ0L2Jyb3dzZXJfY29udHJvbGxlci5kYXJ0CisrKyBiL3Rvb2xzL3Rlc3RpbmcvZGFydC9icm93c2VyX2NvbnRyb2xsZXIuZGFydApAQCAtOTEsNyArOTEsNyBAQAogICAgIGNvbnN0IFsnc2FmYXJpJywgJ2ZmJywgJ2ZpcmVmb3gnLCAnY2hyb21lJywgJ2llOScsICdpZTEwJywKICAgICAgICAgICAgJ2llMTEnLCAnZGFydGl1bSddOwogCi0gIHN0YXRpYyBjb25zdCBMaXN0PFN0cmluZz4gQlJPV1NFUlNfV0lUSF9XSU5ET1dfU1VQUE9SVCA9IGNvbnN0IFtdOworICBzdGF0aWMgY29uc3QgTGlzdDxTdHJpbmc+IEJST1dTRVJTX1dJVEhfV0lORE9XX1NVUFBPUlQgPSBjb25zdCBbJ2llMTEnXTsKIAogICAvLyBUT0RPKGt1c3Rlcm1hbm4pOiBhZGQgc3RhbmRhcmQgc3VwcG9ydCBmb3IgY2hyb21lIG9uIGFuZHJvaWQKICAgc3RhdGljIGJvb2wgc3VwcG9ydGVkQnJvd3NlcihTdHJpbmcgbmFtZSkgewo=