ZGlmZiAtLWdpdCBhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCAzYTA1YWYwLi43NzEyNmNjIDEwMDY0NAotLS0gYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xOTcsNyArMTk3LDcgQEAKIG9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQogb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00CitvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT04CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fZmllbGQ9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbG9jYWxfdmFyaWFibGU9aW5zZXJ0CiBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb25fb25fbWV0aG9kPWluc2VydApkaWZmIC0tZ2l0IGEvaXZ5LnhtbCBiL2l2eS54bWwKaW5kZXggZGJlYTI5My4uOTk0MTQ2ZCAxMDA2NDQKLS0tIGEvaXZ5LnhtbAorKysgYi9pdnkueG1sCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICA8IS0tIHRlc3QgLS0+CiAgICAgCiAgICAgPCEtLSBOb3RlOiBBbnQgZG9lc24ndCBjb250YWluIGp1bml0LmphciBhbnltb3JlLCBzbyB3ZSBhZGQgaXQgdG8gY29uZiAidGVzdCIgdG9vLiAtLT4KLSAgICA8ZGVwZW5kZW5jeSBvcmc9Imp1bml0IiBuYW1lPSJqdW5pdCIgcmV2PSIzLjciIGNvbmY9ImJ1aWxkLnRlc3QtPmRlZmF1bHQ7IHRlc3QtPmRlZmF1bHQiIC8+CisgICAgPGRlcGVuZGVuY3kgb3JnPSJqdW5pdCIgbmFtZT0ianVuaXQiIHJldj0iNC4xMSIgY29uZj0iYnVpbGQudGVzdC0+ZGVmYXVsdDsgdGVzdC0+ZGVmYXVsdCIgLz4KICAgICAKICAgICA8IS0tIGRvY3MgLS0+CiAgICAgCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0FyZ3VtZW50VHlwZXMuamF2YSBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQXJndW1lbnRUeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxM2Y4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0FyZ3VtZW50VHlwZXMuamF2YQpAQCAtMCwwICsxLDU0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgVmlzaWdvdGggU29mdHdhcmUgU29jaWV0eS4gQWxsIHJpZ2h0cworICogcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCisgKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQorICogICAgICAgIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHkgKGh0dHA6Ly93d3cudmlzaWdvdGhzLm9yZy8pLiIKKyAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCisgKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KKyAqCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lICJGcmVlTWFya2VyIiwgIlZpc2lnb3RoIiwgbm9yIGFueSBvZiB0aGUgbmFtZXMgb2YgdGhlIAorICogICAgcHJvamVjdCBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KKyAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IHZpc2lnb3Roc0B2aXNpZ290aHMub3JnLgorICoKKyAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJGcmVlTWFya2VyIiBvciAiVmlzaWdvdGgiCisgKiAgICBub3IgbWF5ICJGcmVlTWFya2VyIiBvciAiVmlzaWdvdGgiIGFwcGVhciBpbiB0aGVpciBuYW1lcworICogICAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHkuCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAorICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFZJU0lHT1RIIFNPRlRXQVJFIFNPQ0lFVFkgT1IKKyAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQorICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBWaXNpZ290aCBTb2Z0d2FyZSBTb2NpZXR5LiBGb3IgbW9yZQorICogaW5mb3JtYXRpb24gb24gdGhlIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHksIHBsZWFzZSBzZWUKKyAqIGh0dHA6Ly93d3cudmlzaWdvdGhzLm9yZy8KKyAqLworcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuVmVyc2lvbjsKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLnV0aWxpdHkuQ2xhc3NVdGlsOworCisKKy8qKgorICogVGhlIGFyZ3VtZW50IHR5cGVzIG9mIGEgbWV0aG9kIGNhbGw7IHVzYWJsZSBhcyBjYWNoZSBrZXkuCisgKiAKKyAqIEBhdXRob3IgQXR0aWxhIFN6ZWdlZGkKKyAqLworZmluYWwgY2xhc3MgQXJndW1lbnRUeXBlcyB7CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJR19NQU5USVNTQV9MT1NTX1BSSUNFID0gNDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50czsgZm9yIHZhcmFncyB0aGlzIGNvbnRhaW5zIHRoZSBleHBsb2RlZCBsaXN0IChub3QgdGhlIGFycmF5KS4gCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc1tdIHR5cGVzOworICAgIAorICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBidWdmaXhlZDsKKyAgICAKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXJncyBUaGUgYWN0dWFsIGFyZ3VtZW50cy4gQSB2YXJhcmdzIGFyZ3VtZW50IHNob3VsZCBiZSBwcmVzZW50IGV4cGxvZGVkLCBubyBhcyBhbiBhcnJheS4KKyAgICAgKiBAcGFyYW0gYnVnZml4ZWQgSW50cm9kdWNlZCBpbiAyLjMuMjEsIHNldHMgdGhpcyBvYmplY3QgdG8gYSBtb2RlIHRoYXQgd29ya3Mgd2VsbCB3aXRoIHtAbGluayBCZWFuc1dyYXBwZXJ9LXMKKyAgICAgKiAgICAgIGNyZWF0ZWQgd2l0aCB7QGxpbmsgVmVyc2lvbn0gMi4zLjIxIG9yIGhpZ2hlci4KKyAgICAgKi8KKyAgICBBcmd1bWVudFR5cGVzKE9iamVjdFtdIGFyZ3MsIGJvb2xlYW4gYnVnZml4ZWQpIHsKKyAgICAgICAgaW50IGwgPSBhcmdzLmxlbmd0aDsKKyAgICAgICAgdHlwZXMgPSBuZXcgQ2xhc3NbbF07CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyArK2kpIHsKKyAgICAgICAgICAgIE9iamVjdCBvYmogPSBhcmdzW2ldOworICAgICAgICAgICAgdHlwZXNbaV0gPSBvYmogPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IChidWdmaXhlZCA/IE51bGwuY2xhc3MgOiBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIDogb2JqLmdldENsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5idWdmaXhlZCA9IGJ1Z2ZpeGVkOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDA7CisgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaGFzaCBePSB0eXBlc1tpXS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYobyBpbnN0YW5jZW9mIEFyZ3VtZW50VHlwZXMpIHsKKyAgICAgICAgICAgIEFyZ3VtZW50VHlwZXMgY3MgPSAoQXJndW1lbnRUeXBlcylvOworICAgICAgICAgICAgaWYoY3MudHlwZXMubGVuZ3RoICE9IHR5cGVzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmKGNzLnR5cGVzW2ldICE9IHR5cGVzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gUG9zc2libHkge0BsaW5rIEVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yI05PX1NVQ0hfTUVUSE9EfSBvcgorICAgICAqICAgICAgICAge0BsaW5rIEVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yI0FNQklHVU9VU19NRVRIT0R9LiAKKyAgICAgKi8KKyAgICBNYXliZUVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIGdldE1vc3RTcGVjaWZpYyhMaXN0Lyo8Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yPiovIG1lbWJlckRlc2NzLCBib29sZWFuIHZhckFyZykKKyAgICB7CisgICAgICAgIExpbmtlZExpc3QvKjxDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3I+Ki8gYXBwbGljYWJsZXMgPSBnZXRBcHBsaWNhYmxlcyhtZW1iZXJEZXNjcywgdmFyQXJnKTsKKyAgICAgICAgaWYoYXBwbGljYWJsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRW1wdHlDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IuTk9fU1VDSF9NRVRIT0Q7CisgICAgICAgIH0KKyAgICAgICAgaWYoYXBwbGljYWJsZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSBhcHBsaWNhYmxlcy5nZXRGaXJzdCgpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBMaW5rZWRMaXN0Lyo8Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yPiovIG1heGltYWxzID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBhcHBsaWNhYmxlc0l0ZXIgPSBhcHBsaWNhYmxlcy5pdGVyYXRvcigpOyBhcHBsaWNhYmxlc0l0ZXIuaGFzTmV4dCgpOykKKyAgICAgICAgeworICAgICAgICAgICAgQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIGFwcGxpY2FibGUgPSAoQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSBhcHBsaWNhYmxlc0l0ZXIubmV4dCgpOworICAgICAgICAgICAgYm9vbGVhbiBsZXNzU3BlY2lmaWMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoSXRlcmF0b3IgbWF4aW1hbHNJdGVyID0gbWF4aW1hbHMuaXRlcmF0b3IoKTsgCisgICAgICAgICAgICAgICAgbWF4aW1hbHNJdGVyLmhhc05leHQoKTspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIG1heGltYWwgPSAoQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSBtYXhpbWFsc0l0ZXIubmV4dCgpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBjbXBSZXMgPSBjb21wYXJlUGFyYW1ldGVyTGlzdFByZWZlcmFiaWxpdHkoYXBwbGljYWJsZS5wYXJhbVR5cGVzLCBtYXhpbWFsLnBhcmFtVHlwZXMsIHZhckFyZyk7IAorICAgICAgICAgICAgICAgIGlmIChjbXBSZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1heGltYWxzSXRlci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNtcFJlcyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbGVzc1NwZWNpZmljID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZighbGVzc1NwZWNpZmljKSB7CisgICAgICAgICAgICAgICAgbWF4aW1hbHMuYWRkTGFzdChhcHBsaWNhYmxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihtYXhpbWFscy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICByZXR1cm4gRW1wdHlDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IuQU1CSUdVT1VTX01FVEhPRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgbWF4aW1hbHMuZ2V0Rmlyc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWxscyBpZiBhbW9uZyB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgdHdvIG1ldGhvZHMsIHdoaWNoIG9uZSBmaXRzIHRoaXMgYXJndW1lbnQgbGlzdCBiZXR0ZXIuCisgICAgICogVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBwYXJhbWV0ZXIgbGlzdHMgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBhcmd1bWVudCBsaXN0czsgaWYgdGhhdCdzIG5vdCBlbnN1cmVkLAorICAgICAqIHdoYXQgdGhlIHJlc3VsdCB3aWxsIGJlIGlzIHVuZGVmaW5lZC4KKyAgICAgKiAKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBiZWhhdmVzIGRpZmZlcmVudGx5IGluIHtAY29kZSBidWdmaXhlZH0tbW9kZSAodXNlZCB3aGVuIGEge0BsaW5rIEJlYW5zV3JhcHBlcn0gaXMgY3JlYXRlZCB3aXRoCisgICAgICogaW5jb21wYXRpYmxlIGltcHJvdmVtZW50cyBzZXQgdG8gMi4zLjIxIG9yIGhpZ2hlcikuIEJlbG93IHdlIGRlc2NyaWJlIHRoZSBidWdmaXhlZCBiZWhhdmlvciBvbmx5LiAKKyAgICAgKiAgCisgICAgICogPHA+VGhlIGRlY2lzaW9uIGlzIG1hZGUgYnkgY29tcGFyaW5nIHRoZSBwcmVmZXJhYmlsaXR5IG9mIGVhY2ggcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBzYW1lIHBvc2l0aW9uIGluIGEgbG9vcC4KKyAgICAgKiBBdCB0aGUgZW5kLCB0aGUgcGFyYW1ldGVyIGxpc3Qgd2l0aCB0aGUgbW9yZSBwcmVmZXJyZWQgcGFyYW1ldGVycyB3aWxsIGJlIHRoZSBwcmVmZXJyZWQgb25lLiBJZiBib3RoIHBhcmFtZXRlcgorICAgICAqIGxpc3RzIGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgcHJlZmVycmVkIHBhcmFtZXRlcnMsIHRoZSBvbmUgdGhhdCBoYXMgdGhlIGZpcnN0IChsb3dlciBpbmRleCkgcHJlZmVycmVkIHBhcmFtZXRlcgorICAgICAqIGlzIHRoZSBwcmVmZXJyZWQgb25lLiBPdGhlcndpc2UgdGhlIHR3byBwYXJhbWV0ZXIgbGlzdCBhcmUgY29uc2lkZXJlZCB0byBiZSBlcXVhbCBpbiB0ZXJtcyBvZiBwcmVmZXJhYmlsaXR5LgorICAgICAqIAorICAgICAqIDxwPklmIHRoZXJlJ3Mgbm8gbnVtZXJpY2FsIGNvbnZlcnNpb24gaW52b2x2ZWQsIHRoZSBwcmVmZXJhYmlsaXR5IG9mIHR3byBwYXJhbWV0ZXIgdHlwZXMgaXMgZGVjaWRlZCBvbiBob3cKKyAgICAgKiBzcGVjaWZpYyB0aGVpciB0eXBlcyBhcmUuIEZvciBleGFtcGxlLCB7QGNvZGUgU3RyaW5nfSBpcyBtb3JlIHNwZWNpZmljIHRoYW4ge0BsaW5rIE9iamVjdH0gKGJlY2F1c2UKKyAgICAgKiB7QGNvZGUgT2JqZWN0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKX0tcyksIGFuZCBzbyB7QGNvZGUgU3RyaW5nfSBpcyBwcmVmZXJyZWQuIFByaW1pdGl2ZQorICAgICAqIHR5cGVzIGFyZSBjb25zaWRlcmVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBib3hpbmcgY2xhc3MgKGxpa2Uge0Bjb2RlIGJvb2xlYW59IGlzIG1vcmUKKyAgICAgKiBzcGVjaWZpYyB0aGFuIHtAY29kZSBCb29sZWFufSwgYmVjYXVzZSB0aGUgZm9ybWVyIGNhbid0IHN0b3JlIHtAY29kZSBudWxsfSkuIFRoZSBwcmVmZXJhYmlsaXR5IGRlY2lzaW9uIGdldHMKKyAgICAgKiB0cmlja2llciB3aGVuIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSBvZiBudW1lcmljYWwgY29udmVyc2lvbiBmcm9tIHRoZSBhY3R1YWwgYXJndW1lbnQgdHlwZSB0byB0aGUgdHlwZSBvZiBzb21lIG9mCisgICAgICogdGhlIHBhcmFtZXRlcnMuIElmIHN1Y2ggY29udmVyc2lvbiBpcyBvbmx5IHBvc3NpYmxlIGZvciBvbmUgb2YgdGhlIGNvbXBldGluZyBwYXJhbWV0ZXIgdHlwZXMsIHRoYXQgcGFyYW1ldGVyCisgICAgICogYXV0b21hdGljYWxseSB3aW5zLiBJZiBpdCdzIHBvc3NpYmxlIGZvciBib3RoLCB7QGxpbmsgT3ZlcmxvYWRlZE51bWJlclV0aWwjZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2V9IHdpbGwKKyAgICAgKiBiZSB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgY29udmVyc2lvbiAicHJpY2UiLCBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIHdpdGggbG93ZXN0IHByaWNlIHdpbnMuICAgCisgICAgICogCisgICAgICogQHBhcmFtIHBhcmFtVHlwZXMxIFRoZSBwYXJhbWV0ZXIgdHlwZXMgb2Ygb25lIG9mIHRoZSBjb21wZXRpbmcgbWV0aG9kcworICAgICAqIEBwYXJhbSBwYXJhbVR5cGVzMiBUaGUgcGFyYW1ldGVyIHR5cGVzIG9mIHRoZSBvdGhlciBjb21wZXRpbmcgbWV0aG9kCisgICAgICogQHBhcmFtIHZhckFyZyBXaGV0aGVyIHRoZXNlIGNvbXBldGluZyBtZXRob2RzIGFyZSB2YXJhcmdzIG1ldGhvZHMuIAorICAgICAqIEByZXR1cm4gTW9yZSB0aGFuIDAgaWYgdGhlIGZpcnN0IHBhcmFtZXRlciBsaXN0IGlzIHByZWZlcnJlZCwgbGVzcyB0aGVuIDAgaWYgdGhlIG90aGVyIGlzIHByZWZlcnJlZCwKKyAgICAgKiAgICAgICAgMCBpZiB0aGVyZSdzIG5vIGRlY2lzaW9uIAorICAgICAqLworICAgIGludCBjb21wYXJlUGFyYW1ldGVyTGlzdFByZWZlcmFiaWxpdHkoQ2xhc3NbXSBwYXJhbVR5cGVzMSwgQ2xhc3NbXSBwYXJhbVR5cGVzMiwgYm9vbGVhbiB2YXJBcmcpIHsKKyAgICAgICAgZmluYWwgaW50IGFyZ1R5cGVzTGVuID0gdHlwZXMubGVuZ3RoOyAKKyAgICAgICAgZmluYWwgaW50IHBhcmFtVHlwZXMxTGVuID0gcGFyYW1UeXBlczEubGVuZ3RoOworICAgICAgICBmaW5hbCBpbnQgcGFyYW1UeXBlczJMZW4gPSBwYXJhbVR5cGVzMi5sZW5ndGg7CisgICAgICAgIC8vYXNzZXJ0IHZhckFyZyB8fCBwYXJhbVR5cGVzMUxlbiA9PSBwYXJhbVR5cGVzMkxlbjsKKyAgICAgICAgCisgICAgICAgIGlmIChidWdmaXhlZCkgeworICAgICAgICAgICAgaW50IHBhcmFtTGlzdDFXZWFrV2luQ250ID0gMDsKKyAgICAgICAgICAgIGludCBwYXJhbUxpc3QyV2Vha1dpbkNudCA9IDA7CisgICAgICAgICAgICBpbnQgcGFyYW1MaXN0MVdpbkNudCA9IDA7CisgICAgICAgICAgICBpbnQgcGFyYW1MaXN0MldpbkNudCA9IDA7CisgICAgICAgICAgICBpbnQgcGFyYW1MaXN0MVN0cm9uZ1dpbkNudCA9IDA7CisgICAgICAgICAgICBpbnQgcGFyYW1MaXN0MlN0cm9uZ1dpbkNudCA9IDA7CisgICAgICAgICAgICBpbnQgZmlyc3RXaW5lclBhcmFtTGlzdCA9IDA7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ1R5cGVzTGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBwYXJhbVR5cGUxID0gZ2V0UGFyYW1UeXBlKHBhcmFtVHlwZXMxLCBwYXJhbVR5cGVzMUxlbiwgaSwgdmFyQXJnKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBwYXJhbVR5cGUyID0gZ2V0UGFyYW1UeXBlKHBhcmFtVHlwZXMyLCBwYXJhbVR5cGVzMkxlbiwgaSwgdmFyQXJnKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2luZXJQYXJhbTsgIC8vIDEgPT4gcGFyYW1UeXBlMTsgLTEgPT4gcGFyYW1UeXBlMjsgMCA9PiBkcmF3CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtVHlwZTEgPT0gcGFyYW1UeXBlMikgeworICAgICAgICAgICAgICAgICAgICB3aW5lclBhcmFtID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBhcmdUeXBlID0gdHlwZXNbaV07CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXJnSXNOdW0gPSBOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmdUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1Db252UHJpY2UxOworICAgICAgICAgICAgICAgICAgICBpZiAoYXJnSXNOdW0gJiYgQ2xhc3NVdGlsLmlzTnVtZXJpY2FsKHBhcmFtVHlwZTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBub25QcmltUGFyYW1UeXBlMSA9IHBhcmFtVHlwZTEuaXNQcmltaXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENsYXNzVXRpbC5wcmltaXRpdmVDbGFzc1RvQm94aW5nQ2xhc3MocGFyYW1UeXBlMSkgOiBwYXJhbVR5cGUxOyAKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bUNvbnZQcmljZTEgPSBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZShhcmdUeXBlLCBub25QcmltUGFyYW1UeXBlMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBudW1Db252UHJpY2UxID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gbnVtQ29udlByaWNlMSBpcyBJbnRlZ2VyLk1BWF9WQUxVRSBpZiBlaXRoZXI6CisgICAgICAgICAgICAgICAgICAgIC8vIC0gYXJnVHlwZSBhbmQgcGFyYW1UeXBlMSBhcmVuJ3QgYm90aCBudW1lcmljYWwKKyAgICAgICAgICAgICAgICAgICAgLy8gLSBGTSBkb2Vzbid0IGtub3cgc29tZSBvZiB0aGUgbnVtZXJpY2FsIHR5cGVzLCBvciB0aGUgY29udmVyc2lvbiBiZXR3ZWVuIHRoZW0gaXMgbm90IGFsbG93ZWQgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtQ29udlByaWNlMjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ0lzTnVtICYmIENsYXNzVXRpbC5pc051bWVyaWNhbChwYXJhbVR5cGUyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgbm9uUHJpbVBhcmFtVHlwZTIgPSBwYXJhbVR5cGUyLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDbGFzc1V0aWwucHJpbWl0aXZlQ2xhc3NUb0JveGluZ0NsYXNzKHBhcmFtVHlwZTIpIDogcGFyYW1UeXBlMjsgCisgICAgICAgICAgICAgICAgICAgICAgICBudW1Db252UHJpY2UyID0gT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoYXJnVHlwZSwgbm9uUHJpbVBhcmFtVHlwZTIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ29udlByaWNlMiA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZiAobnVtQ29udlByaWNlMSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bUNvbnZQcmljZTIgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHsgIC8vIE5vIG51bWVyaWNhbCBjb252ZXJzaW9ucyBhbnl3aGVyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByID0gY29tcGFyZVBhcmFtZXRlckxpc3RQcmVmZXJhYmlsaXR5X2NtcFR5cGVTcGVjaWZpY3R5KHBhcmFtVHlwZTEsIHBhcmFtVHlwZTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lclBhcmFtID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QxV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QxV2Vha1dpbkNudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lclBhcmFtID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyIDwgLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTGlzdDJXaW5DbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTGlzdDJXZWFrV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lclBhcmFtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgLy8gTm8gbnVtLiBjb252LiBvZiBwYXJhbTEsIG51bS4gY29udi4gb2YgcGFyYW0yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZXJQYXJhbSA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTGlzdDJXaW5DbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChudW1Db252UHJpY2UyID09IEludGVnZXIuTUFYX1ZBTFVFKSB7ICAvLyBOdW0uIGNvbnYuIG9mIHBhcmFtMSwgbm90IG9mIHBhcmFtMgorICAgICAgICAgICAgICAgICAgICAgICAgd2luZXJQYXJhbSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QxV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBOdW0uIGNvbnYuIG9mIGJvdGggcGFyYW0xIGFuZCBwYXJhbTIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db252UHJpY2UxICE9IG51bUNvbnZQcmljZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtQ29udlByaWNlMSA8IG51bUNvbnZQcmljZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZXJQYXJhbSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db252UHJpY2UxIDwgQklHX01BTlRJU1NBX0xPU1NfUFJJQ0UgJiYgbnVtQ29udlByaWNlMiA+IEJJR19NQU5USVNTQV9MT1NTX1BSSUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QxU3Ryb25nV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QxV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5lclBhcmFtID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudW1Db252UHJpY2UyIDwgQklHX01BTlRJU1NBX0xPU1NfUFJJQ0UgJiYgbnVtQ29udlByaWNlMSA+IEJJR19NQU5USVNTQV9MT1NTX1BSSUNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QyU3Ryb25nV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbUxpc3QyV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVyUGFyYW0gPSAocGFyYW1UeXBlMS5pc1ByaW1pdGl2ZSgpID8gMSA6IDApIC0gKHBhcmFtVHlwZTIuaXNQcmltaXRpdmUoKSA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZXJQYXJhbSA9PSAxKSBwYXJhbUxpc3QxV2Vha1dpbkNudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdpbmVyUGFyYW0gPT0gLTEpIHBhcmFtTGlzdDJXZWFrV2luQ250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9ICAvLyB3aGVuIHBhcmFtVHlwZTEgIT0gcGFyYW1UeXBlMgorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChmaXJzdFdpbmVyUGFyYW1MaXN0ID09IDAgJiYgd2luZXJQYXJhbSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0V2luZXJQYXJhbUxpc3QgPSB3aW5lclBhcmFtOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAvLyBmb3IgZWFjaCBwYXJhbWV0ZXIgdHlwZXMKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHBhcmFtTGlzdDFTdHJvbmdXaW5DbnQgIT0gcGFyYW1MaXN0MlN0cm9uZ1dpbkNudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbUxpc3QxU3Ryb25nV2luQ250IC0gcGFyYW1MaXN0MlN0cm9uZ1dpbkNudDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1MaXN0MVdpbkNudCAhPSBwYXJhbUxpc3QyV2luQ250KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtTGlzdDFXaW5DbnQgLSBwYXJhbUxpc3QyV2luQ250OworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbUxpc3QxV2Vha1dpbkNudCAhPSBwYXJhbUxpc3QyV2Vha1dpbkNudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbUxpc3QxV2Vha1dpbkNudCAtIHBhcmFtTGlzdDJXZWFrV2luQ250OworICAgICAgICAgICAgfSBlbHNlIGlmIChmaXJzdFdpbmVyUGFyYW1MaXN0ICE9IDApIHsgIC8vIHBhcmFtTGlzdDFXaW5DbnQgPT0gcGFyYW1MaXN0MldpbkNudAorICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdFdpbmVyUGFyYW1MaXN0OworICAgICAgICAgICAgfSBlbHNlIHsgLy8gc3RpbGwgdW5kZWNpZGVkCisgICAgICAgICAgICAgICAgaWYgKHZhckFyZykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1UeXBlczFMZW4gPT0gcGFyYW1UeXBlczJMZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhZCBhIDAtbGVuZ3RoIHZhcmFyZ3MgYXJyYXkgaW4gYm90aCBtZXRob2RzLCB3ZSBhbHNvIGNvbXBhcmUgdGhlIHR5cGVzIGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgdGhlIHZhcmFyZ3MgcGFyYW1ldGVyLCBsaWtlIGlmIHdlIGhhZCBhIHNpbmdsZSB2YXJhcmdzIGFyZ3VtZW50LiBIb3dldmVyLCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aW1lIHdlIGRvbid0IGhhdmUgYW4gYXJndW1lbnQgdHlwZSwgc28gd2UgY2FuIG9ubHkgZGVjaWRlIGJhc2VkIG9uIHR5cGUgc3BlY2lmaWNpdHk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnVHlwZXNMZW4gPT0gcGFyYW1UeXBlczFMZW4gLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlMSA9IGdldFBhcmFtVHlwZShwYXJhbVR5cGVzMSwgcGFyYW1UeXBlczFMZW4sIGFyZ1R5cGVzTGVuLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGUyID0gZ2V0UGFyYW1UeXBlKHBhcmFtVHlwZXMyLCBwYXJhbVR5cGVzMkxlbiwgYXJnVHlwZXNMZW4sIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDbGFzc1V0aWwuaXNOdW1lcmljYWwocGFyYW1UeXBlMSkgJiYgQ2xhc3NVdGlsLmlzTnVtZXJpY2FsKHBhcmFtVHlwZTIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gT3ZlcmxvYWRlZE51bWJlclV0aWwuY29tcGFyZU51bWJlclR5cGVTcGVjaWZpY2l0eShwYXJhbVR5cGUxLCBwYXJhbVR5cGUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIgIT0gMCkgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGxzIHRocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVQYXJhbWV0ZXJMaXN0UHJlZmVyYWJpbGl0eV9jbXBUeXBlU3BlY2lmaWN0eShwYXJhbVR5cGUxLCBwYXJhbVR5cGUyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbWV0aG9kIHdpdGggbW9yZSBmaXhlZCBwYXJhbWV0ZXJzIHdpbnM6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1UeXBlczFMZW4gLSBwYXJhbVR5cGVzMkxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gbm9uLWJ1Z2ZpeGVkIChiYWNrd2FyZC1jb21wYXRpYmxlKSBtb2RlCisgICAgICAgICAgICBib29sZWFuIHBhcmFtVHlwZXMxSGFzQU1vcmVTcGVjaWZpYyA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBwYXJhbVR5cGVzMkhhc0FNb3JlU3BlY2lmaWMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzMUxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlMSA9IGdldFBhcmFtVHlwZShwYXJhbVR5cGVzMSwgcGFyYW1UeXBlczFMZW4sIGksIHZhckFyZyk7CisgICAgICAgICAgICAgICAgQ2xhc3MgcGFyYW1UeXBlMiA9IGdldFBhcmFtVHlwZShwYXJhbVR5cGVzMiwgcGFyYW1UeXBlczJMZW4sIGksIHZhckFyZyk7CisgICAgICAgICAgICAgICAgaWYocGFyYW1UeXBlMSAhPSBwYXJhbVR5cGUyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZXMxSGFzQU1vcmVTcGVjaWZpYyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlczFIYXNBTW9yZVNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBNZXRob2RVdGlsaXRpZXMuaXNNb3JlT3JTYW1lU3BlY2lmaWNQYXJhbWV0ZXJUeXBlKHBhcmFtVHlwZTEsIHBhcmFtVHlwZTIsIGZhbHNlLCAwKSAhPSAwOworICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGVzMkhhc0FNb3JlU3BlY2lmaWMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZXMySGFzQU1vcmVTcGVjaWZpYworICAgICAgICAgICAgICAgICAgICAgICAgfHwgTWV0aG9kVXRpbGl0aWVzLmlzTW9yZU9yU2FtZVNwZWNpZmljUGFyYW1ldGVyVHlwZShwYXJhbVR5cGUyLCBwYXJhbVR5cGUxLCBmYWxzZSwgMCkgIT0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHBhcmFtVHlwZXMxSGFzQU1vcmVTcGVjaWZpYykgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVR5cGVzMkhhc0FNb3JlU3BlY2lmaWMgPyAwIDogMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZihwYXJhbVR5cGVzMkhhc0FNb3JlU3BlY2lmaWMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFRyaXZpYWwgY29tcGFyaXNvbiB0eXBlIHNwZWNpZmljaXRpZXM7IHVuYXdhcmUgb2YgbnVtZXJpY2FsIGNvbnZlcnNpb25zLiAKKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuIExlc3MtdGhhbi0wLCAwLCBvciBtb3JlLXRoYW4tMCBkZXBlbmRpbmcgb24gd2hpY2ggc2lkZSBpcyBtb3JlIHNwZWNpZmljLiBUaGUgYWJzb2x1dGUgdmFsdWUgaXMgMSBpZgorICAgICAqICAgICB0aGUgZGlmZmVyZW5jZSBpcyBvbmx5IGluIHByaW1pdGl2ZSBWUyBub24tcHJpbWl0aXZlLCBtb3JlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBjb21wYXJlUGFyYW1ldGVyTGlzdFByZWZlcmFiaWxpdHlfY21wVHlwZVNwZWNpZmljdHkoZmluYWwgQ2xhc3MgcGFyYW1UeXBlMSwgZmluYWwgQ2xhc3MgcGFyYW1UeXBlMikgeworICAgICAgICAvLyBUaGUgbW9yZSBzcGVjaWZpYyAoc21hbGxlcikgdHlwZSB3aW5zLgorICAgICAgICAKKyAgICAgICAgZmluYWwgQ2xhc3Mgbm9uUHJpbVBhcmFtVHlwZTEgPSBwYXJhbVR5cGUxLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgICAgICA/IENsYXNzVXRpbC5wcmltaXRpdmVDbGFzc1RvQm94aW5nQ2xhc3MocGFyYW1UeXBlMSkgOiBwYXJhbVR5cGUxOyAKKyAgICAgICAgZmluYWwgQ2xhc3Mgbm9uUHJpbVBhcmFtVHlwZTIgPSBwYXJhbVR5cGUyLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgICAgICA/IENsYXNzVXRpbC5wcmltaXRpdmVDbGFzc1RvQm94aW5nQ2xhc3MocGFyYW1UeXBlMikgOiBwYXJhbVR5cGUyOworICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAobm9uUHJpbVBhcmFtVHlwZTEgPT0gbm9uUHJpbVBhcmFtVHlwZTIpIHsKKyAgICAgICAgICAgIGlmIChub25QcmltUGFyYW1UeXBlMSAhPSBwYXJhbVR5cGUxKSB7CisgICAgICAgICAgICAgICAgaWYgKG5vblByaW1QYXJhbVR5cGUyICE9IHBhcmFtVHlwZTIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyBpZGVudGljYWwgcHJpbS4gdHlwZXM7IHNob3VsZG4ndCBldmVyIGJlIHJlYWNoZWQKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgIC8vIHBhcmFtMSBpcyBwcmltLiwgcGFyYW0yIGlzIG5vbiBwcmltLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobm9uUHJpbVBhcmFtVHlwZTIgIT0gcGFyYW1UeXBlMikgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsgIC8vIHBhcmFtMSBpcyBub24tcHJpbS4sIHBhcmFtMiBpcyBwcmltLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgIC8vIGlkZW50aWNhbCBub24tcHJpbS4gdHlwZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChub25QcmltUGFyYW1UeXBlMi5pc0Fzc2lnbmFibGVGcm9tKG5vblByaW1QYXJhbVR5cGUxKSkgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0gZWxzZSBpZiAobm9uUHJpbVBhcmFtVHlwZTEuaXNBc3NpZ25hYmxlRnJvbShub25QcmltUGFyYW1UeXBlMikpIHsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHVucmVsYXRlZCB0eXBlcworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0UGFyYW1UeXBlKENsYXNzW10gcGFyYW1UeXBlcywgaW50IHBhcmFtVHlwZXNMZW4sIGludCBpLCBib29sZWFuIHZhckFyZykgeworICAgICAgICByZXR1cm4gdmFyQXJnICYmIGkgPj0gcGFyYW1UeXBlc0xlbiAtIDEKKyAgICAgICAgICAgICAgICA/IHBhcmFtVHlwZXNbcGFyYW1UeXBlc0xlbiAtIDFdLmdldENvbXBvbmVudFR5cGUoKQorICAgICAgICAgICAgICAgIDogcGFyYW1UeXBlc1tpXTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgbWV0aG9kcyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIGFjdHVhbAorICAgICAqIHBhcmFtZXRlciB0eXBlcyByZXByZXNlbnRlZCBieSB0aGlzIEFyZ3VtZW50VHlwZXMgb2JqZWN0LgorICAgICAqLworICAgIExpbmtlZExpc3QvKjxDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3I+Ki8gZ2V0QXBwbGljYWJsZXMoTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBtZW1iZXJEZXNjcywgYm9vbGVhbiB2YXJBcmcpIHsKKyAgICAgICAgTGlua2VkTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKKyAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1lbWJlckRlc2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKKyAgICAgICAgICAgIENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjID0gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgaXQubmV4dCgpOworICAgICAgICAgICAgaWYoaXNBcHBsaWNhYmxlKG1lbWJlckRlc2MsIHZhckFyZykpIHsKKyAgICAgICAgICAgICAgICBsaXN0LmFkZChtZW1iZXJEZXNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCBtZXRob2QgaXMgYXBwbGljYWJsZSB0byBhY3R1YWwKKyAgICAgKiBwYXJhbWV0ZXIgdHlwZXMgcmVwcmVzZW50ZWQgYnkgdGhpcyBBcmd1bWVudFR5cGVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjLCBib29sZWFuIHZhckFyZykgeworICAgICAgICBmaW5hbCBDbGFzc1tdIHBhcmFtVHlwZXMgPSBtZW1iZXJEZXNjLnBhcmFtVHlwZXM7IAorICAgICAgICBmaW5hbCBpbnQgY2wgPSB0eXBlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIGludCBmbCA9IHBhcmFtVHlwZXMubGVuZ3RoIC0gKHZhckFyZyA/IDEgOiAwKTsKKyAgICAgICAgaWYodmFyQXJnKSB7CisgICAgICAgICAgICBpZihjbCA8IGZsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYoY2wgIT0gZmwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGZsOyArK2kpIHsKKyAgICAgICAgICAgIGlmKCFpc01ldGhvZEludm9jYXRpb25Db252ZXJ0aWJsZShwYXJhbVR5cGVzW2ldLCB0eXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYodmFyQXJnKSB7CisgICAgICAgICAgICBDbGFzcyB2YXJBcmdQYXJhbVR5cGUgPSBwYXJhbVR5cGVzW2ZsXS5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSBmbDsgaSA8IGNsOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZighaXNNZXRob2RJbnZvY2F0aW9uQ29udmVydGlibGUodmFyQXJnUGFyYW1UeXBlLCB0eXBlc1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSB0eXBlIHJlcHJlc2VudGVkIGJ5IGEgY2xhc3Mgb2JqZWN0IGlzCisgICAgICogY29udmVydGlibGUgdG8gYW5vdGhlciB0eXBlIHJlcHJlc2VudGVkIGJ5IGEgY2xhc3Mgb2JqZWN0IHVzaW5nIGEgCisgICAgICogbWV0aG9kIGludm9jYXRpb24gY29udmVyc2lvbiwgdHJlYXRpbmcgb2JqZWN0IHR5cGVzIG9mIHByaW1pdGl2ZSAKKyAgICAgKiB0eXBlcyBhcyBpZiB0aGV5IHdlcmUgcHJpbWl0aXZlIHR5cGVzICh0aGF0IGlzLCBhIEJvb2xlYW4gYWN0dWFsIAorICAgICAqIHBhcmFtZXRlciB0eXBlIG1hdGNoZXMgYm9vbGVhbiBwcmltaXRpdmUgZm9ybWFsIHR5cGUpLiBUaGlzIGJlaGF2aW9yCisgICAgICogaXMgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSBhcHBsaWNhYmxlIG1ldGhvZHMgZm9yIAorICAgICAqIGFuIGFjdHVhbCBwYXJhbWV0ZXIgbGlzdCwgYW5kIHByaW1pdGl2ZSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYnkgCisgICAgICogdGhlaXIgb2JqZWN0IGR1YWxzIGluIHJlZmxlY3RpdmUgbWV0aG9kIGNhbGxzLgorICAgICAqIEBwYXJhbSBmb3JtYWwgdGhlIHBhcmFtZXRlciB0eXBlIHRvIHdoaWNoIHRoZSBhY3R1YWwgCisgICAgICogcGFyYW1ldGVyIHR5cGUgc2hvdWxkIGJlIGNvbnZlcnRpYmxlOyBwb3NzaWJseSBhIHByaW1pdGl2ZSB0eXBlCisgICAgICogQHBhcmFtIGFjdHVhbCB0aGUgYXJndW1lbnQgdHlwZTsgbm90IGEgcHJpbWl0aXZlIHR5cGUsIG1heWJlIHtAbGluayBOdWxsfS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgZWl0aGVyIGZvcm1hbCB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSBhY3R1YWwgdHlwZSwgCisgICAgICogb3IgdGhlIGZvcm1hbCB0eXBlIGlzIGEgcHJpbWl0aXZlIHR5cGUgYW5kIHRoZSBhY3R1YWwgdHlwZSBpcyBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QKKyAgICAgKiB0eXBlIG9yIGFuIG9iamVjdCB0eXBlIG9mIGEgcHJpbWl0aXZlIHR5cGUgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvCisgICAgICogdGhlIGZvcm1hbCB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc01ldGhvZEludm9jYXRpb25Db252ZXJ0aWJsZShmaW5hbCBDbGFzcyBmb3JtYWwsIGZpbmFsIENsYXNzIGFjdHVhbCkgeworICAgICAgICAvLyBDaGVjayBmb3IgaWRlbnRpdHkgb3Igd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24KKyAgICAgICAgaWYoZm9ybWFsLmlzQXNzaWduYWJsZUZyb20oYWN0dWFsKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoYWN0dWFsID09IE51bGwuY2xhc3MgJiYgYnVnZml4ZWQpIHsKKyAgICAgICAgICAgIHJldHVybiAhZm9ybWFsLmlzUHJpbWl0aXZlKCk7CisgICAgICAgIH0gZWxzZSBpZiAoYnVnZml4ZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGZvcm1hbE5QOworICAgICAgICAgICAgaWYgKGZvcm1hbC5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgZm9ybWFsTlAgPSBDbGFzc1V0aWwucHJpbWl0aXZlQ2xhc3NUb0JveGluZ0NsYXNzKGZvcm1hbCk7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSBmb3JtYWxOUCkgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGFyYWN0ZXIgYW5kIGNoYXIsIGV0Yy4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3JtYWxOUCA9IGZvcm1hbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhY3R1YWwpICYmIE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGZvcm1hbE5QKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZShhY3R1YWwsIGZvcm1hbE5QKSAhPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBpZiAhYnVnZml4ZWQKKyAgICAgICAgICAgIC8vIFRoaXMgbm9uLWJ1Z2ZpeGVkIChiYWNrd2FyZC1jb21wYXRpYmlsZSkgYnJhbmNoOgorICAgICAgICAgICAgLy8gLSBEb2Vzbid0IGNvbnZlcnQgKnRvKiBub24tcHJpbWl0aXZlIG51bWVyaWNhbCB0eXBlcyAodW5sZXNzIHRoZSBhcmd1bWVudCBpcyBhIEJpZ0RlY2ltYWwpLgorICAgICAgICAgICAgLy8gICAoVGhpcyBpcyBsaWtlIGluIEphdmEgbGFuZ3VhZ2UsIHdoaWNoIGFsc28gZG9lc24ndCBjb2VyY2UgdG8gbm9uLXByaW1pdGl2ZSBudW1lcmljYWwgdHlwZXMuKSAKKyAgICAgICAgICAgIC8vIC0gRG9lc24ndCBzdXBwb3J0IEJpZ0ludGVnZXIgY29udmVyc2lvbnMKKyAgICAgICAgICAgIC8vIC0gRG9lc24ndCBzdXBwb3J0IE51bWJlcldpdGhGYWxsYmFja1R5cGUtcy4gVGhvc2UgYXJlIG9ubHkgcHJvZHVjZWQgaW4gYnVnZml4ZWQgbW9kZSBhbnl3YXkuIAorICAgICAgICAgICAgaWYoZm9ybWFsLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgYm94aW5nIHdpdGggd2lkZW5pbmcgcHJpbWl0aXZlIGNvbnZlcnNpb24uIE5vdGUgdGhhdCAKKyAgICAgICAgICAgICAgICAvLyBhY3R1YWwgcGFyYW1ldGVycyBhcmUgbmV2ZXIgcHJpbWl0aXZlcy4KKyAgICAgICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGRvIHRoZSBzYW1lIHdpdGggYm94aW5nIHR5cGVzLi4uIHRoYXQgd2FzIGEgYnVnLgorICAgICAgICAgICAgICAgIGlmKGZvcm1hbCA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PSBCb29sZWFuLmNsYXNzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWFsID09IERvdWJsZS5UWVBFICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgKGFjdHVhbCA9PSBEb3VibGUuY2xhc3MgfHwgYWN0dWFsID09IEZsb2F0LmNsYXNzIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9PSBMb25nLmNsYXNzIHx8IGFjdHVhbCA9PSBJbnRlZ2VyLmNsYXNzIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9PSBTaG9ydC5jbGFzcyB8fCBhY3R1YWwgPT0gQnl0ZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWFsID09IEludGVnZXIuVFlQRSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgIChhY3R1YWwgPT0gSW50ZWdlci5jbGFzcyB8fCBhY3R1YWwgPT0gU2hvcnQuY2xhc3MgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID09IEJ5dGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbCA9PSBMb25nLlRZUEUgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAoYWN0dWFsID09IExvbmcuY2xhc3MgfHwgYWN0dWFsID09IEludGVnZXIuY2xhc3MgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID09IFNob3J0LmNsYXNzIHx8IGFjdHVhbCA9PSBCeXRlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwgPT0gRmxvYXQuVFlQRSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgIChhY3R1YWwgPT0gRmxvYXQuY2xhc3MgfHwgYWN0dWFsID09IExvbmcuY2xhc3MgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID09IEludGVnZXIuY2xhc3MgfHwgYWN0dWFsID09IFNob3J0LmNsYXNzIHx8IAorICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9PSBCeXRlLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PSBDaGFyYWN0ZXIuY2xhc3M7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZvcm1hbCA9PSBCeXRlLlRZUEUgJiYgYWN0dWFsID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGZvcm1hbCA9PSBTaG9ydC5UWVBFICYmCisgICAgICAgICAgICAgICAgICAgKGFjdHVhbCA9PSBTaG9ydC5jbGFzcyB8fCBhY3R1YWwgPT0gQnl0ZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCaWdEZWNpbWFsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYWN0dWFsKSAmJiBDbGFzc1V0aWwuaXNOdW1lcmljYWwoZm9ybWFsKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIEJpZ0RlY2ltYWxzIGFzIHdlIGRlZW0gQmlnRGVjaW1hbCB0byBiZQorICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0aWJsZSB0byBhbnkgbnVtZXJpYyB0eXBlIC0gZWl0aGVyIG9iamVjdCBvciBwcmltaXRpdmUuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGFjdHVhbGx5IGNhdXNlIHVzIHRyb3VibGUgYXMgdGhpcyBpcyBhIG5hcnJvd2luZyAKKyAgICAgICAgICAgICAgICAgICAgLy8gY29udmVyc2lvbiwgbm90IHdpZGVuaW5nLiAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIFN5bWJvbGl6ZXMgdGhlIGNsYXNzIG9mIG51bGwgKGl0J3MgbWlzc2luZyBmcm9tIEphdmEpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE51bGwgeworICAgICAgICAKKyAgICAgICAgLy8gQ2FuJ3QgYmUgaW5zdGFudGlhdGVkCisgICAgICAgIHByaXZhdGUgTnVsbCgpIHsgfQorICAgICAgICAKKyAgICB9CisgICAgCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9CZWFuc1dyYXBwZXIuamF2YSBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQmVhbnNXcmFwcGVyLmphdmEKaW5kZXggNDQ2Mzc1Ni4uYTllN2E5MCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9CZWFuc1dyYXBwZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0JlYW5zV3JhcHBlci5qYXZhCkBAIC01MTQsNyArNTE0LDExIEBACiAgICAgICovCiAgICAgcHVibGljIFZlcnNpb24gZ2V0SW5jb21wYXRpYmxlSW1wcm92ZW1lbnRzKCkgewogICAgICAgICByZXR1cm4gaW5jb21wYXRpYmxlSW1wcm92ZW1lbnRzOwotICAgIH0gICAgCisgICAgfQorICAgIAorICAgIGJvb2xlYW4gaXMyMzIxQnVnZml4ZWQoKSB7CisgICAgICAgIHJldHVybiBnZXRJbmNvbXBhdGlibGVJbXByb3ZlbWVudHMoKS5pbnRWYWx1ZSgpID49IDIwMDMwMjE7CisgICAgfQogICAgIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIHdyYXBwZXIuIFRoaXMgaW5zdGFuY2UgaXMgdXNlZApAQCAtNjUyLDI5ICs2NTYsNTIgQEAKICAgICBwdWJsaWMgT2JqZWN0IHVud3JhcChUZW1wbGF0ZU1vZGVsIG1vZGVsLCBDbGFzcyBoaW50KSAKICAgICB0aHJvd3MgVGVtcGxhdGVNb2RlbEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IHVud3JhcEludGVybmFsKG1vZGVsLCBoaW50KTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IHRyeVVud3JhcChtb2RlbCwgaGludCk7CiAgICAgICAgIGlmKG9iaiA9PSBDQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgIHRocm93IG5ldyBUZW1wbGF0ZU1vZGVsRXhjZXB0aW9uKCJDYW4gbm90IHVud3JhcCBtb2RlbCBvZiB0eXBlICIgKyAKICAgICAgICAgICAgICAgbW9kZWwuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHRvIHR5cGUgIiArIGhpbnQuZ2V0TmFtZSgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gb2JqOwogICAgIH0KKworICAgIC8qKgorICAgICAqIFNhbWUgYXMge0BsaW5rICN0cnlVbndyYXAoVGVtcGxhdGVNb2RlbCwgQ2xhc3MsIGludCl9IHdpdGggMCBsYXN0IGFyZ3VtZW50LgorICAgICAqLworICAgIE9iamVjdCB0cnlVbndyYXAoVGVtcGxhdGVNb2RlbCBtb2RlbCwgQ2xhc3MgaGludCkgdGhyb3dzIFRlbXBsYXRlTW9kZWxFeGNlcHRpb24KKyAgICB7CisgICAgICAgIHJldHVybiB0cnlVbndyYXAobW9kZWwsIGhpbnQsIDApOworICAgIH0KICAgICAKLSAgICBPYmplY3QgdW53cmFwSW50ZXJuYWwoVGVtcGxhdGVNb2RlbCBtb2RlbCwgQ2xhc3MgaGludCkgCisgICAgLyoqCisgICAgICogQHBhcmFtIHRhcmdldE51bVR5cGVzIFVzZWQgd2hlbiB1bndyYXBwaW5nIGZvciBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIHNvIHRoZSBoaW50IGlzIHRvbyBnZW5lcmljOyAwIG90aGVyd2lzZS4KKyAgICAgKiAgICAgICAgVGhpcyB3aWxsIGJlIGlnbm9yZWQgaWYgdGhlIGhpbnQgaXMgYWxyZWFkeSBhIGNvbmNyZXRlIG51bWVyaWNhbCB0eXBlLiAoV2l0aCBvdmVybG9hZGVkIG1ldGhvZHMgdGhlIGhpbnQKKyAgICAgKiAgICAgICAgaXMgb2Z0ZW4ge0BsaW5rIE51bWJlcn0gb3Ige0BsaW5rIE9iamVjdH0sIGJlY2F1c2UgdGhlIHVud3JhcHBpbmcgaGFzIHRvIGhhcHBlbiBiZWZvcmUgY2hvb3NpbmcgdGhlCisgICAgICogICAgICAgIGNvbmNyZXRlIG92ZXJsb2FkZWQgbWV0aG9kLikKKyAgICAgKiBAcmV0dXJuIHtAbGluayAjQ0FOX05PVF9VTldSQVB9IG9yIHRoZSB1bndyYXBwZWQgb2JqZWN0LgorICAgICAqLworICAgIE9iamVjdCB0cnlVbndyYXAoVGVtcGxhdGVNb2RlbCBtb2RlbCwgQ2xhc3MgaGludCwgaW50IHRhcmdldE51bVR5cGVzKSAKICAgICB0aHJvd3MgVGVtcGxhdGVNb2RlbEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgcmV0dXJuIHVud3JhcChtb2RlbCwgaGludCwgbnVsbCk7CisgICAgICAgIE9iamVjdCByZXMgPSB0cnlVbndyYXAobW9kZWwsIGhpbnQsIG51bGwpOworICAgICAgICBpZiAodGFyZ2V0TnVtVHlwZXMgIT0gMAorICAgICAgICAgICAgICAgICYmICh0YXJnZXROdW1UeXBlcyAmIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQpICE9IDAKKyAgICAgICAgICAgICAgICAmJiByZXMgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBPdmVybG9hZGVkTnVtYmVyVXRpbC5hZGRGYWxsYmFja1R5cGUoKE51bWJlcikgcmVzLCB0YXJnZXROdW1UeXBlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CiAgICAgfQogCi0gICAgcHJpdmF0ZSBPYmplY3QgdW53cmFwKFRlbXBsYXRlTW9kZWwgbW9kZWwsIENsYXNzIGhpbnQsIE1hcCByZWN1cnNpb25TdG9wcykgCisgICAgcHJpdmF0ZSBPYmplY3QgdHJ5VW53cmFwKFRlbXBsYXRlTW9kZWwgbW9kZWwsIENsYXNzIGhpbnQsIE1hcCByZWN1cnNpb25TdG9wcykgCiAgICAgdGhyb3dzIFRlbXBsYXRlTW9kZWxFeGNlcHRpb24KICAgICB7CiAgICAgICAgIGlmKG1vZGVsID09IG51bGwgfHwgbW9kZWwgPT0gbnVsbE1vZGVsKSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBpc0Jvb2xlYW4gPSBCb29sZWFuLlRZUEUgPT0gaGludDsKLSAgICAgICAgYm9vbGVhbiBpc0NoYXIgPSBDaGFyYWN0ZXIuVFlQRSA9PSBoaW50OworICAgICAgICBpZiAoaXMyMzIxQnVnZml4ZWQoKSAmJiBoaW50LmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGhpbnQgPSBDbGFzc1V0aWwucHJpbWl0aXZlQ2xhc3NUb0JveGluZ0NsYXNzKGhpbnQpOyAgICAgICAgICAgIAorICAgICAgICB9CiAgICAgICAgIAogICAgICAgICAvLyBUaGlzIGlzIGZvciB0cmFuc3BhcmVudCBpbnRlcm9wIHdpdGggb3RoZXIgd3JhcHBlcnMgKGFuZCBvdXJzZWx2ZXMpCiAgICAgICAgIC8vIFBhc3NpbmcgdGhlIGhpbnQgYWxsb3dzIGkuZS4gYSBKeXRob24tYXdhcmUgbWV0aG9kIHRoYXQgZGVjbGFyZXMgYQpAQCAtNjg3LDEzICs3MTQsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBhZGFwdGVkOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gQXR0ZW1wdCBudW1lcmljIGNvbnZlcnNpb24gCi0gICAgICAgICAgICBpZihhZGFwdGVkIGluc3RhbmNlb2YgTnVtYmVyICYmICgoaGludC5pc1ByaW1pdGl2ZSgpICYmICFpc0NoYXIgJiYgCi0gICAgICAgICAgICAgICAgICAgICFpc0Jvb2xlYW4pIHx8IE5VTUJFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGhpbnQpKSkgewotICAgICAgICAgICAgICAgIE51bWJlciBudW1iZXIgPSBjb252ZXJ0VW53cmFwcGVkTnVtYmVyKGhpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTnVtYmVyKWFkYXB0ZWQpOwotICAgICAgICAgICAgICAgIGlmKG51bWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoYWRhcHRlZCBpbnN0YW5jZW9mIE51bWJlciAmJiBDbGFzc1V0aWwuaXNOdW1lcmljYWwoaGludCkpIHsKKyAgICAgICAgICAgICAgICBOdW1iZXIgbnVtYmVyID0gZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUoKE51bWJlcikgYWRhcHRlZCwgaGludCwgaXMyMzIxQnVnZml4ZWQoKSk7CisgICAgICAgICAgICAgICAgaWYobnVtYmVyICE9IG51bGwpIHJldHVybiBudW1iZXI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCkBAIC03MDMsMTAgKzcyNiw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBBdHRlbXB0IG51bWVyaWMgY29udmVyc2lvbiAKLSAgICAgICAgICAgIGlmKHdyYXBwZWQgaW5zdGFuY2VvZiBOdW1iZXIgJiYgKChoaW50LmlzUHJpbWl0aXZlKCkgJiYgIWlzQ2hhciAmJiAKLSAgICAgICAgICAgICAgICAgICAgIWlzQm9vbGVhbikgfHwgTlVNQkVSX0NMQVNTLmlzQXNzaWduYWJsZUZyb20oaGludCkpKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIG51bWJlciA9IGNvbnZlcnRVbndyYXBwZWROdW1iZXIoaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIpd3JhcHBlZCk7CisgICAgICAgICAgICBpZih3cmFwcGVkIGluc3RhbmNlb2YgTnVtYmVyICYmIENsYXNzVXRpbC5pc051bWVyaWNhbChoaW50KSkgeworICAgICAgICAgICAgICAgIE51bWJlciBudW1iZXIgPSBmb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZSgoTnVtYmVyKSB3cmFwcGVkLCBoaW50LCBpczIzMjFCdWdmaXhlZCgpKTsKICAgICAgICAgICAgICAgICBpZihudW1iZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOwogICAgICAgICAgICAgICAgIH0KQEAgLTcxOCw2ICs3MzksNyBAQAogICAgICAgICAvLyBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGludGVyZmFjZSBpbiBtdWx0aS1pbnRlcmZhY2UgbW9kZWxzIHdoZW4gd2UKICAgICAgICAgLy8ga25vdyB3aGF0IGlzIGV4cGVjdGVkIGFzIHRoZSByZXR1cm4gdHlwZS4KIAorICAgICAgICAvLyBKYXZhIDU6IEFsc28gc2hvdWxkIGNoZWNrIGZvciBDaGFyU2VxdWVuY2UgYXQgdGhlIGVuZAogICAgICAgICBpZihTVFJJTkdfQ0xBU1MgPT0gaGludCkgewogICAgICAgICAgICAgaWYobW9kZWwgaW5zdGFuY2VvZiBUZW1wbGF0ZVNjYWxhck1vZGVsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuICgoVGVtcGxhdGVTY2FsYXJNb2RlbCltb2RlbCkuZ2V0QXNTdHJpbmcoKTsKQEAgLTcyNywxOCArNzQ5LDE3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmltaXRpdmUgbnVtZXJpYyB0eXBlcyAmIE51bWJlci5jbGFzcyBhbmQgaXRzIHN1YmNsYXNzZXMKLSAgICAgICAgaWYoKGhpbnQuaXNQcmltaXRpdmUoKSAmJiAhaXNDaGFyICYmICFpc0Jvb2xlYW4pIAotICAgICAgICAgICAgICAgIHx8IE5VTUJFUl9DTEFTUy5pc0Fzc2lnbmFibGVGcm9tKGhpbnQpKSB7CisgICAgICAgIGlmKENsYXNzVXRpbC5pc051bWVyaWNhbChoaW50KSkgewogICAgICAgICAgICAgaWYobW9kZWwgaW5zdGFuY2VvZiBUZW1wbGF0ZU51bWJlck1vZGVsKSB7Ci0gICAgICAgICAgICAgICAgTnVtYmVyIG51bWJlciA9IGNvbnZlcnRVbndyYXBwZWROdW1iZXIoaGludCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAoKFRlbXBsYXRlTnVtYmVyTW9kZWwpbW9kZWwpLmdldEFzTnVtYmVyKCkpOworICAgICAgICAgICAgICAgIE51bWJlciBudW1iZXIgPSBmb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVGVtcGxhdGVOdW1iZXJNb2RlbCltb2RlbCkuZ2V0QXNOdW1iZXIoKSwgaGludCwgaXMyMzIxQnVnZml4ZWQoKSk7CiAgICAgICAgICAgICAgICAgaWYobnVtYmVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGlmKGlzQm9vbGVhbiB8fCBCT09MRUFOX0NMQVNTID09IGhpbnQpIHsKKyAgICAgICAgaWYoQm9vbGVhbi5UWVBFID09IGhpbnQgfHwgQk9PTEVBTl9DTEFTUyA9PSBoaW50KSB7CiAgICAgICAgICAgICBpZihtb2RlbCBpbnN0YW5jZW9mIFRlbXBsYXRlQm9vbGVhbk1vZGVsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuICgoVGVtcGxhdGVCb29sZWFuTW9kZWwpbW9kZWwpLmdldEFzQm9vbGVhbigpIAogICAgICAgICAgICAgICAgID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKQEAgLTc5NSw4ICs4MTYsNyBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gc2VxLnNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSB1bndyYXAoc2VxLmdldChpKSwgY29tcG9uZW50VHlwZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2lvblN0b3BzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSB0cnlVbndyYXAoc2VxLmdldChpKSwgY29tcG9uZW50VHlwZSwgcmVjdXJzaW9uU3RvcHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYodmFsID09IENBTl9OT1RfVU5XUkFQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENBTl9OT1RfVU5XUkFQOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtODEyLDcgKzgzMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIC8vIEFsbG93IG9uZS1jaGFyIHN0cmluZ3MgdG8gYmUgY29lcmNlZCB0byBjaGFyYWN0ZXJzCi0gICAgICAgIGlmKGlzQ2hhciB8fCBoaW50ID09IENIQVJBQ1RFUl9DTEFTUykgeworICAgICAgICBpZihDaGFyYWN0ZXIuVFlQRSA9PSBoaW50IHx8IGhpbnQgPT0gQ0hBUkFDVEVSX0NMQVNTKSB7CiAgICAgICAgICAgICBpZihtb2RlbCBpbnN0YW5jZW9mIFRlbXBsYXRlU2NhbGFyTW9kZWwpIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICgoVGVtcGxhdGVTY2FsYXJNb2RlbCltb2RlbCkuZ2V0QXNTdHJpbmcoKTsKICAgICAgICAgICAgICAgICBpZihzLmxlbmd0aCgpID09IDEpIHsKQEAgLTg3OSw1NyArODk5LDY0IEBACiAgICAgICAgIHJldHVybiBDQU5fTk9UX1VOV1JBUDsKICAgICB9CiAKLSAgICBwcml2YXRlIHN0YXRpYyBOdW1iZXIgY29udmVydFVud3JhcHBlZE51bWJlcihDbGFzcyBoaW50LCBOdW1iZXIgbnVtYmVyKQotICAgIHsKLSAgICAgICAgaWYoaGludCA9PSBJbnRlZ2VyLlRZUEUgfHwgaGludCA9PSBJbnRlZ2VyLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVtYmVyIGluc3RhbmNlb2YgSW50ZWdlciA/IChJbnRlZ2VyKW51bWJlciA6IAotICAgICAgICAgICAgICAgIG5ldyBJbnRlZ2VyKG51bWJlci5pbnRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IExvbmcuVFlQRSB8fCBoaW50ID09IExvbmcuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBMb25nID8gKExvbmcpbnVtYmVyIDogCi0gICAgICAgICAgICAgICAgbmV3IExvbmcobnVtYmVyLmxvbmdWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IEZsb2F0LlRZUEUgfHwgaGludCA9PSBGbG9hdC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG51bWJlciBpbnN0YW5jZW9mIEZsb2F0ID8gKEZsb2F0KW51bWJlciA6IAotICAgICAgICAgICAgICAgIG5ldyBGbG9hdChudW1iZXIuZmxvYXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IERvdWJsZS5UWVBFIAotICAgICAgICAgICAgICAgIHx8IGhpbnQgPT0gRG91YmxlLmNsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVtYmVyIGluc3RhbmNlb2YgRG91YmxlID8gKERvdWJsZSludW1iZXIgOiAKLSAgICAgICAgICAgICAgICBuZXcgRG91YmxlKG51bWJlci5kb3VibGVWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IEJ5dGUuVFlQRSB8fCBoaW50ID09IEJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBCeXRlID8gKEJ5dGUpbnVtYmVyIDogCi0gICAgICAgICAgICAgICAgbmV3IEJ5dGUobnVtYmVyLmJ5dGVWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IFNob3J0LlRZUEUgfHwgaGludCA9PSBTaG9ydC5jbGFzcykgewotICAgICAgICAgICAgcmV0dXJuIG51bWJlciBpbnN0YW5jZW9mIFNob3J0ID8gKFNob3J0KW51bWJlciA6IAotICAgICAgICAgICAgICAgIG5ldyBTaG9ydChudW1iZXIuc2hvcnRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZihoaW50ID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1iZXIgaW5zdGFuY2VvZiBCaWdJbnRlZ2VyID8gbnVtYmVyIDogCi0gICAgICAgICAgICAgICAgbmV3IEJpZ0ludGVnZXIobnVtYmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGhpbnQgPT0gQmlnRGVjaW1hbC5jbGFzcykgewotICAgICAgICAgICAgaWYobnVtYmVyIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBudW1iZXIgdG8gdGhlIHRhcmdldCB0eXBlIGFnZ3Jlc3NpdmVseSAocG9zc2libHkgd2l0aCBvdmVyZmxvdyBvciBzaWduaWZpY2FudCBsb3NzIG9mIHByZWNpc2lvbikuCisgICAgICogQHBhcmFtIG4gTm9uLXtAY29kZSBudWxsfQorICAgICAqIEByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIHRoZSBjb252ZXJzaW9uIGhhcyBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIE51bWJlciBmb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShmaW5hbCBOdW1iZXIgbiwgZmluYWwgQ2xhc3MgdGFyZ2V0VHlwZSwgYm9vbGVhbiBidWdmaXhlZCkgeworICAgICAgICAvLyBXZSB0cnkgdG8gb3JkZXIgdGhlIGNvbmRpdGlvbnMgYnkgZGVjcmVhc2luZyBwcm9iYWJpbGl0eS4KKyAgICAgICAgaWYgKHRhcmdldFR5cGUgPT0gbi5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRUeXBlID09IEludGVnZXIuVFlQRSB8fCB0YXJnZXRUeXBlID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgSW50ZWdlciA/IChJbnRlZ2VyKSBuIDogbmV3IEludGVnZXIobi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRUeXBlID09IExvbmcuVFlQRSB8fCB0YXJnZXRUeXBlID09IExvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgTG9uZyA/IChMb25nKSBuIDogbmV3IExvbmcobi5sb25nVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0VHlwZSA9PSBEb3VibGUuVFlQRSB8fCB0YXJnZXRUeXBlID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG4gaW5zdGFuY2VvZiBEb3VibGUgPyAoRG91YmxlKSBuIDogbmV3IERvdWJsZShuLmRvdWJsZVZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYodGFyZ2V0VHlwZSA9PSBCaWdEZWNpbWFsLmNsYXNzKSB7CisgICAgICAgICAgICBpZihuIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCgoQmlnSW50ZWdlcikgbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4gaW5zdGFuY2VvZiBMb25nKSB7CisgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSBjYW4ndCByZXByZXNlbnQgbG9uZyBhY2N1cmF0ZWx5IGFzIGRvdWJsZQorICAgICAgICAgICAgICAgIHJldHVybiBCaWdEZWNpbWFsLnZhbHVlT2Yobi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbChuLmRvdWJsZVZhbHVlKCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobnVtYmVyIGluc3RhbmNlb2YgQmlnSW50ZWdlcikgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnRGVjaW1hbCgoQmlnSW50ZWdlciludW1iZXIpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT0gRmxvYXQuVFlQRSB8fCB0YXJnZXRUeXBlID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbiBpbnN0YW5jZW9mIEZsb2F0ID8gKEZsb2F0KSBuIDogbmV3IEZsb2F0KG4uZmxvYXRWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YXJnZXRUeXBlID09IEJ5dGUuVFlQRSB8fCB0YXJnZXRUeXBlID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgQnl0ZSA/IChCeXRlKSBuIDogbmV3IEJ5dGUobi5ieXRlVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFyZ2V0VHlwZSA9PSBTaG9ydC5UWVBFIHx8IHRhcmdldFR5cGUgPT0gU2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuIGluc3RhbmNlb2YgU2hvcnQgPyAoU2hvcnQpIG4gOiBuZXcgU2hvcnQobi5zaG9ydFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHRhcmdldFR5cGUgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBCaWdJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1Z2ZpeGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyQmlnRGVjaW1hbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyQmlnRGVjaW1hbCkgbikuYmlnSW50ZWdlclZhbHVlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuIGluc3RhbmNlb2YgQmlnRGVjaW1hbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSBuKS50b0JpZ0ludGVnZXIoKTsgCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZihuLmxvbmdWYWx1ZSgpKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHdyb25nLCBiZWNhdXNlIHNvbWV0aGluZyBsaWtlICIxMjMuNCIgd2lsbCBjYXVzZSBOdW1iZXJGb3JtYXRFeGNlcHRpb24gaW5zdGVhZCBvZiBmbG9vcmluZy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIobi50b1N0cmluZygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKG51bWJlciBpbnN0YW5jZW9mIExvbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbid0IHJlcHJlc2VudCBsb25nIGFjY3VyYXRlbHkgYXMgYSAKLSAgICAgICAgICAgICAgICAvLyBkb3VibGUKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0RlY2ltYWwobnVtYmVyLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgTnVtYmVyIG9yaU4gPSBuIGluc3RhbmNlb2YgT3ZlcmxvYWRlZE51bWJlclV0aWwuTnVtYmVyV2l0aEZhbGxiYWNrVHlwZQorICAgICAgICAgICAgICAgICAgICA/ICgoT3ZlcmxvYWRlZE51bWJlclV0aWwuTnVtYmVyV2l0aEZhbGxiYWNrVHlwZSkgbikuZ2V0U291cmNlTnVtYmVyKCkgOiBuOyAKKyAgICAgICAgICAgIGlmICh0YXJnZXRUeXBlLmlzSW5zdGFuY2Uob3JpTikpIHsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uc3RhbmRhcmQgTnVtYmVyIHN1YmNsYXNzZXMgYXMgd2VsbCBhcyBkaXJlY3RseSBqYXZhLmxhbmcuTnVtYmVyLgorICAgICAgICAgICAgICAgIHJldHVybiBvcmlOOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBGYWlscworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsKG51bWJlci5kb3VibGVWYWx1ZSgpKTsKICAgICAgICAgfQotICAgICAgICAvLyBIYW5kbGUgbm9uc3RhbmRhcmQgTnVtYmVyIHN1YmNsYXNzZXMgYXMgd2VsbCBhcyBkaXJlY3RseSAKLSAgICAgICAgLy8gamF2YS5sYW5nLk51bWJlciB0b28KLSAgICAgICAgaWYoaGludC5pc0luc3RhbmNlKG51bWJlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQogICAgIAogICAgIC8qKgpAQCAtMTcyNiw2ICsxNzUzLDcgQEAKICAgICAgKiBDb252ZXJ0cyBhbnkge0BsaW5rIEJpZ0RlY2ltYWx9cyBpbiB0aGUgcGFzc2VkIGFycmF5IHRvIHRoZSB0eXBlIG9mCiAgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgZm9ybWFsIGFyZ3VtZW50IG9mIHRoZSBtZXRob2QuCiAgICAgICovCisgICAgLy8gVW51c2VkPwogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb2VyY2VCaWdEZWNpbWFscyhBY2Nlc3NpYmxlT2JqZWN0IGNhbGxhYmxlLCBPYmplY3RbXSBhcmdzKQogICAgIHsKICAgICAgICAgQ2xhc3NbXSBmb3JtYWxUeXBlcyA9IG51bGw7CkBAIC0xNzc1LDcgKzE4MDMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY29lcmNlQmlnRGVjaW1hbChCaWdEZWNpbWFsIGJkLCBDbGFzcyBmb3JtYWxUeXBlKSB7CiAgICAgICAgIC8vIGludCBpcyBleHBlY3RlZCBpbiBtb3N0IHNpdHVhdGlvbnMsIHNvIHdlIGNoZWNrIGl0IGZpcnN0CiAgICAgICAgIGlmKGZvcm1hbFR5cGUgPT0gSW50ZWdlci5UWVBFIHx8IGZvcm1hbFR5cGUgPT0gSW50ZWdlci5jbGFzcykgewpAQCAtMTc5OCw4ICsxODI2LDkgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmKEJJR0lOVEVHRVJfQ0xBU1MuaXNBc3NpZ25hYmxlRnJvbShmb3JtYWxUeXBlKSkgewogICAgICAgICAgICAgcmV0dXJuIGJkLnRvQmlnSW50ZWdlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGJkOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZDsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0Jhc2VkTW9kZWxGYWN0b3J5IGNyZWF0ZUVudW1Nb2RlbHMoQmVhbnNXcmFwcGVyIHdyYXBwZXIpIHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQ2xhc3NTdHJpbmcuamF2YSBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQ2xhc3NTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA1MjM4Zi4uMDAwMDAwMAotLS0gYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0NsYXNzU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgVmlzaWdvdGggU29mdHdhcmUgU29jaWV0eS4gQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCi0gKiAgICBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHkgKGh0dHA6Ly93d3cudmlzaWdvdGhzLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnZW1lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBOZWl0aGVyIHRoZSBuYW1lICJGcmVlTWFya2VyIiwgIlZpc2lnb3RoIiwgbm9yIGFueSBvZiB0aGUgbmFtZXMgb2YgdGhlIAotICogICAgcHJvamVjdCBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IHZpc2lnb3Roc0B2aXNpZ290aHMub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJGcmVlTWFya2VyIiBvciAiVmlzaWdvdGgiCi0gKiAgICBub3IgbWF5ICJGcmVlTWFya2VyIiBvciAiVmlzaWdvdGgiIGFwcGVhciBpbiB0aGVpciBuYW1lcwotICogICAgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHkuCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFZJU0lHT1RIIFNPRlRXQVJFIFNPQ0lFVFkgT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBWaXNpZ290aCBTb2Z0d2FyZSBTb2NpZXR5LiBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIFZpc2lnb3RoIFNvZnR3YXJlIFNvY2lldHksIHBsZWFzZSBzZWUKLSAqIGh0dHA6Ly93d3cudmlzaWdvdGhzLm9yZy8KLSAqLwotcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKLQotaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIEBhdXRob3IgQXR0aWxhIFN6ZWdlZGkKLSAqLwotZmluYWwgY2xhc3MgQ2xhc3NTdHJpbmcKLXsKLSAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gY2xhc3NlczsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYnVnZml4ZWQ7Ci0gICAgCi0gICAgQ2xhc3NTdHJpbmcoT2JqZWN0W10gb2JqZWN0cywgYm9vbGVhbiBidWdmaXhlZCkgewotICAgICAgICBpbnQgbCA9IG9iamVjdHMubGVuZ3RoOwotICAgICAgICBjbGFzc2VzID0gbmV3IENsYXNzW2xdOwotICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgbDsgKytpKSB7Ci0gICAgICAgICAgICBPYmplY3Qgb2JqID0gb2JqZWN0c1tpXTsKLSAgICAgICAgICAgIGNsYXNzZXNbaV0gPSBvYmogPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICA/IChidWdmaXhlZCA/IE51bGwuY2xhc3MgOiBPYmplY3QuY2xhc3MpCi0gICAgICAgICAgICAgICAgICAgIDogb2JqLmdldENsYXNzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5idWdmaXhlZCA9IGJ1Z2ZpeGVkOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjbGFzc2VzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBoYXNoIF49IGNsYXNzZXNbaV0uaGFzaENvZGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmKG8gaW5zdGFuY2VvZiBDbGFzc1N0cmluZykgewotICAgICAgICAgICAgQ2xhc3NTdHJpbmcgY3MgPSAoQ2xhc3NTdHJpbmcpbzsKLSAgICAgICAgICAgIGlmKGNzLmNsYXNzZXMubGVuZ3RoICE9IGNsYXNzZXMubGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGNsYXNzZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZihjcy5jbGFzc2VzW2ldICE9IGNsYXNzZXNbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHJldHVybiBQb3NzaWJseSB7QGxpbmsgRW1wdHlDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IjTk9fU1VDSF9NRVRIT0R9IG9yIHtAbGluayBFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciNBTUJJR1VPVVNfTUVUSE9EfS4gCi0gICAgICovCi0gICAgTWF5YmVFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBnZXRNb3N0U3BlY2lmaWMoTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBtZW1iZXJEZXNjcywgYm9vbGVhbiB2YXJBcmcpCi0gICAgewotICAgICAgICBMaW5rZWRMaXN0Lyo8Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yPiovIGFwcGxpY2FibGVzID0gZ2V0QXBwbGljYWJsZXMobWVtYmVyRGVzY3MsIHZhckFyZyk7Ci0gICAgICAgIGlmKGFwcGxpY2FibGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIEVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yLk5PX1NVQ0hfTUVUSE9EOwotICAgICAgICB9Ci0gICAgICAgIGlmKGFwcGxpY2FibGVzLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgYXBwbGljYWJsZXMuZ2V0Rmlyc3QoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgTGlua2VkTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBtYXhpbWFscyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgYXBwbGljYWJsZXNJdGVyID0gYXBwbGljYWJsZXMuaXRlcmF0b3IoKTsgYXBwbGljYWJsZXNJdGVyLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICAgIENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBhcHBsaWNhYmxlID0gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgYXBwbGljYWJsZXNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gbGVzc1NwZWNpZmljID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIG1heGltYWxzSXRlciA9IG1heGltYWxzLml0ZXJhdG9yKCk7IAotICAgICAgICAgICAgICAgIG1heGltYWxzSXRlci5oYXNOZXh0KCk7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtYXhpbWFsID0gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgbWF4aW1hbHNJdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goY29tcGFyZVBhcmFtZXRlclR5cGVzU3BlY2lmaWNpdHkoYXBwbGljYWJsZS5wYXJhbVR5cGVzLCBtYXhpbWFsLnBhcmFtVHlwZXMsIHZhckFyZykpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbWFsc0l0ZXIucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIC0xOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZXNzU3BlY2lmaWMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZighbGVzc1NwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgbWF4aW1hbHMuYWRkTGFzdChhcHBsaWNhYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZihtYXhpbWFscy5zaXplKCkgPiAxKSB7Ci0gICAgICAgICAgICByZXR1cm4gRW1wdHlDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IuQU1CSUdVT1VTX01FVEhPRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgbWF4aW1hbHMuZ2V0Rmlyc3QoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgY29tcGFyZVBhcmFtZXRlclR5cGVzU3BlY2lmaWNpdHkoQ2xhc3NbXSBwYXJhbVR5cGVzMSwgQ2xhc3NbXSBwYXJhbVR5cGVzMiwgYm9vbGVhbiB2YXJBcmcpIHsKLSAgICAgICAgZmluYWwgaW50IHBhcmFtVHlwZXMxTGVuID0gcGFyYW1UeXBlczEubGVuZ3RoOwotICAgICAgICBmaW5hbCBpbnQgcGFyYW1UeXBlczJMZW4gPSBwYXJhbVR5cGVzMi5sZW5ndGg7Ci0gICAgICAgIC8vYXNzZXJ0IHZhckFyZyB8fCBjbDEgPT0gY2wyOwotICAgICAgICAKLSAgICAgICAgaWYgKGJ1Z2ZpeGVkKSB7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFdpbm5lciA9IDA7Ci0gICAgICAgICAgICBpbnQgY3VycmVudEhpZ2hTY29yZSA9IDA7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlczFMZW47ICsraSkgewotICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZTEgPSBnZXRQYXJhbVR5cGUocGFyYW1UeXBlczEsIHBhcmFtVHlwZXMxTGVuLCBpLCB2YXJBcmcpOwotICAgICAgICAgICAgICAgIENsYXNzIHBhcmFtVHlwZTIgPSBnZXRQYXJhbVR5cGUocGFyYW1UeXBlczIsIHBhcmFtVHlwZXMyTGVuLCBpLCB2YXJBcmcpOwotICAgICAgICAgICAgICAgIGlmKHBhcmFtVHlwZTEgIT0gcGFyYW1UeXBlMikgewotICAgICAgICAgICAgICAgICAgICBpbnQgc2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBzY29yZSA9IE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlMSwgcGFyYW1UeXBlMiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50V2lubmVyID09IC0xID8gY3VycmVudEhpZ2hTY29yZSAtIDEgOiBjdXJyZW50SGlnaFNjb3JlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gY3VycmVudEhpZ2hTY29yZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEhpZ2hTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFdpbm5lciA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcmUgPT0gY3VycmVudEhpZ2hTY29yZSAmJiBjdXJyZW50V2lubmVyID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50V2lubmVyID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHNjb3JlID0gTWV0aG9kVXRpbGl0aWVzLmlzTW9yZU9yU2FtZVNwZWNpZmljUGFyYW1ldGVyVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGUyLCBwYXJhbVR5cGUxLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5uZXIgPT0gMSA/IGN1cnJlbnRIaWdoU2NvcmUgLSAxIDogY3VycmVudEhpZ2hTY29yZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA+IGN1cnJlbnRIaWdoU2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRIaWdoU2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXaW5uZXIgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY29yZSA9PSBjdXJyZW50SGlnaFNjb3JlICYmIGN1cnJlbnRXaW5uZXIgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFdpbm5lciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY3VycmVudFdpbm5lcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gcGFyYW1UeXBlczFIYXNBTW9yZVNwZWNpZmljID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIHBhcmFtVHlwZXMySGFzQU1vcmVTcGVjaWZpYyA9IGZhbHNlOwotICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHBhcmFtVHlwZXMxTGVuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGUxID0gZ2V0UGFyYW1UeXBlKHBhcmFtVHlwZXMxLCBwYXJhbVR5cGVzMUxlbiwgaSwgdmFyQXJnKTsKLSAgICAgICAgICAgICAgICBDbGFzcyBwYXJhbVR5cGUyID0gZ2V0UGFyYW1UeXBlKHBhcmFtVHlwZXMyLCBwYXJhbVR5cGVzMkxlbiwgaSwgdmFyQXJnKTsKLSAgICAgICAgICAgICAgICBpZihwYXJhbVR5cGUxICE9IHBhcmFtVHlwZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlczFIYXNBTW9yZVNwZWNpZmljID0gCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGVzMUhhc0FNb3JlU3BlY2lmaWMKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUocGFyYW1UeXBlMSwgcGFyYW1UeXBlMiwgZmFsc2UsIDApICE9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtVHlwZXMySGFzQU1vcmVTcGVjaWZpYyA9IAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1UeXBlczJIYXNBTW9yZVNwZWNpZmljCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBNZXRob2RVdGlsaXRpZXMuaXNNb3JlT3JTYW1lU3BlY2lmaWNQYXJhbWV0ZXJUeXBlKHBhcmFtVHlwZTIsIHBhcmFtVHlwZTEsIGZhbHNlLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYocGFyYW1UeXBlczFIYXNBTW9yZVNwZWNpZmljKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtVHlwZXMySGFzQU1vcmVTcGVjaWZpYyA/IDAgOiAxOwotICAgICAgICAgICAgfSBlbHNlIGlmKHBhcmFtVHlwZXMySGFzQU1vcmVTcGVjaWZpYykgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3MgZ2V0UGFyYW1UeXBlKENsYXNzW10gcGFyYW1UeXBlcywgaW50IHBhcmFtVHlwZXNMZW4sIGludCBpLCBib29sZWFuIHZhckFyZykgewotICAgICAgICByZXR1cm4gdmFyQXJnICYmIGkgPj0gcGFyYW1UeXBlc0xlbiAtIDEKLSAgICAgICAgICAgICAgICA/IHBhcmFtVHlwZXNbcGFyYW1UeXBlc0xlbiAtIDFdLmdldENvbXBvbmVudFR5cGUoKQotICAgICAgICAgICAgICAgIDogcGFyYW1UeXBlc1tpXTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbGwgbWV0aG9kcyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIGFjdHVhbAotICAgICAqIHBhcmFtZXRlciBjbGFzc2VzIHJlcHJlc2VudGVkIGJ5IHRoaXMgQ2xhc3NTdHJpbmcgb2JqZWN0LgotICAgICAqLwotICAgIExpbmtlZExpc3QvKjxDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3I+Ki8gZ2V0QXBwbGljYWJsZXMoTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBtZW1iZXJEZXNjcywgYm9vbGVhbiB2YXJBcmcpIHsKLSAgICAgICAgTGlua2VkTGlzdC8qPENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpdCA9IG1lbWJlckRlc2NzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLSAgICAgICAgICAgIENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjID0gKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgaXQubmV4dCgpOwotICAgICAgICAgICAgaWYoaXNBcHBsaWNhYmxlKG1lbWJlckRlc2MsIHZhckFyZykpIHsKLSAgICAgICAgICAgICAgICBsaXN0LmFkZChtZW1iZXJEZXNjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCBtZXRob2QgaXMgYXBwbGljYWJsZSB0byBhY3R1YWwKLSAgICAgKiBwYXJhbWV0ZXIgY2xhc3NlcyByZXByZXNlbnRlZCBieSB0aGlzIENsYXNzU3RyaW5nIG9iamVjdC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjLCBib29sZWFuIHZhckFyZykgewotICAgICAgICBmaW5hbCBDbGFzc1tdIGZvcm1hbFR5cGVzID0gbWVtYmVyRGVzYy5wYXJhbVR5cGVzOyAKLSAgICAgICAgZmluYWwgaW50IGNsID0gY2xhc3Nlcy5sZW5ndGg7Ci0gICAgICAgIGZpbmFsIGludCBmbCA9IGZvcm1hbFR5cGVzLmxlbmd0aCAtICh2YXJBcmcgPyAxIDogMCk7Ci0gICAgICAgIGlmKHZhckFyZykgewotICAgICAgICAgICAgaWYoY2wgPCBmbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmKGNsICE9IGZsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBmbDsgKytpKSB7Ci0gICAgICAgICAgICBpZighaXNNZXRob2RJbnZvY2F0aW9uQ29udmVydGlibGUoZm9ybWFsVHlwZXNbaV0sIGNsYXNzZXNbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmKHZhckFyZykgewotICAgICAgICAgICAgQ2xhc3MgdmFyQXJnVHlwZSA9IGZvcm1hbFR5cGVzW2ZsXS5nZXRDb21wb25lbnRUeXBlKCk7Ci0gICAgICAgICAgICBmb3IoaW50IGkgPSBmbDsgaSA8IGNsOyArK2kpIHsKLSAgICAgICAgICAgICAgICBpZighaXNNZXRob2RJbnZvY2F0aW9uQ29udmVydGlibGUodmFyQXJnVHlwZSwgY2xhc3Nlc1tpXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSB0eXBlIHJlcHJlc2VudGVkIGJ5IGEgY2xhc3Mgb2JqZWN0IGlzCi0gICAgICogY29udmVydGlibGUgdG8gYW5vdGhlciB0eXBlIHJlcHJlc2VudGVkIGJ5IGEgY2xhc3Mgb2JqZWN0IHVzaW5nIGEgCi0gICAgICogbWV0aG9kIGludm9jYXRpb24gY29udmVyc2lvbiwgdHJlYXRpbmcgb2JqZWN0IHR5cGVzIG9mIHByaW1pdGl2ZSAKLSAgICAgKiB0eXBlcyBhcyBpZiB0aGV5IHdlcmUgcHJpbWl0aXZlIHR5cGVzICh0aGF0IGlzLCBhIEJvb2xlYW4gYWN0dWFsIAotICAgICAqIHBhcmFtZXRlciB0eXBlIG1hdGNoZXMgYm9vbGVhbiBwcmltaXRpdmUgZm9ybWFsIHR5cGUpLiBUaGlzIGJlaGF2aW9yCi0gICAgICogaXMgYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSBhcHBsaWNhYmxlIG1ldGhvZHMgZm9yIAotICAgICAqIGFuIGFjdHVhbCBwYXJhbWV0ZXIgbGlzdCwgYW5kIHByaW1pdGl2ZSB0eXBlcyBhcmUgcmVwcmVzZW50ZWQgYnkgCi0gICAgICogdGhlaXIgb2JqZWN0IGR1YWxzIGluIHJlZmxlY3RpdmUgbWV0aG9kIGNhbGxzLgotICAgICAqIEBwYXJhbSBmb3JtYWwgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgdHlwZSB0byB3aGljaCB0aGUgYWN0dWFsIAotICAgICAqIHBhcmFtZXRlciB0eXBlIHNob3VsZCBiZSBjb252ZXJ0aWJsZQotICAgICAqIEBwYXJhbSBhY3R1YWwgdGhlIGFjdHVhbCBwYXJhbWV0ZXIgdHlwZS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgZWl0aGVyIGZvcm1hbCB0eXBlIGlzIGFzc2lnbmFibGUgZnJvbSBhY3R1YWwgdHlwZSwgCi0gICAgICogb3IgZm9ybWFsIGlzIGEgcHJpbWl0aXZlIHR5cGUgYW5kIGFjdHVhbCBpcyBpdHMgY29ycmVzcG9uZGluZyBvYmplY3QKLSAgICAgKiB0eXBlIG9yIGFuIG9iamVjdCB0eXBlIG9mIGEgcHJpbWl0aXZlIHR5cGUgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvCi0gICAgICogdGhlIGZvcm1hbCB0eXBlLgotICAgICAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBpc01ldGhvZEludm9jYXRpb25Db252ZXJ0aWJsZShDbGFzcyBmb3JtYWwsIENsYXNzIGFjdHVhbCkgewotICAgICAgICAvLyBDaGVjayBmb3IgaWRlbnRpdHkgb3Igd2lkZW5pbmcgcmVmZXJlbmNlIGNvbnZlcnNpb24KLSAgICAgICAgaWYoZm9ybWFsLmlzQXNzaWduYWJsZUZyb20oYWN0dWFsKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChhY3R1YWwgPT0gTnVsbC5jbGFzcyAmJiBidWdmaXhlZCkgewotICAgICAgICAgICAgcmV0dXJuICFmb3JtYWwuaXNQcmltaXRpdmUoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gQ2hlY2sgZm9yIGJveGluZyB3aXRoIHdpZGVuaW5nIHByaW1pdGl2ZSBjb252ZXJzaW9uLiBOb3RlIHRoYXQgCi0gICAgICAgIC8vIGFjdHVhbCBwYXJhbWV0ZXJzIGFyZSBuZXZlciBwcmltaXRpdmVzLgotICAgICAgICAvLyBGSVhNRTogV2h5IHdlIGRvbid0IGRvIHRoZSBzYW1lIHdpdGggYm94aW5nIHR5cGVzIHRvbz8KLSAgICAgICAgaWYoZm9ybWFsLmlzUHJpbWl0aXZlKCkpIHsKLSAgICAgICAgICAgIGlmKGZvcm1hbCA9PSBCb29sZWFuLlRZUEUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsID09IEJvb2xlYW4uY2xhc3M7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1hbCA9PSBEb3VibGUuVFlQRSAmJiAKLSAgICAgICAgICAgICAgICAgICAgKGFjdHVhbCA9PSBEb3VibGUuY2xhc3MgfHwgYWN0dWFsID09IEZsb2F0LmNsYXNzIHx8IAotICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID09IExvbmcuY2xhc3MgfHwgYWN0dWFsID09IEludGVnZXIuY2xhc3MgfHwgCi0gICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPT0gU2hvcnQuY2xhc3MgfHwgYWN0dWFsID09IEJ5dGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwgPT0gSW50ZWdlci5UWVBFICYmIAotICAgICAgICAgICAgICAgICAgICAoYWN0dWFsID09IEludGVnZXIuY2xhc3MgfHwgYWN0dWFsID09IFNob3J0LmNsYXNzIHx8IAotICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID09IEJ5dGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwgPT0gTG9uZy5UWVBFICYmIAotICAgICAgICAgICAgICAgICAgICAoYWN0dWFsID09IExvbmcuY2xhc3MgfHwgYWN0dWFsID09IEludGVnZXIuY2xhc3MgfHwgCi0gICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPT0gU2hvcnQuY2xhc3MgfHwgYWN0dWFsID09IEJ5dGUuY2xhc3MpKSB7Ci0gICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYWwgPT0gRmxvYXQuVFlQRSAmJiAKLSAgICAgICAgICAgICAgICAgICAgKGFjdHVhbCA9PSBGbG9hdC5jbGFzcyB8fCBhY3R1YWwgPT0gTG9uZy5jbGFzcyB8fCAKLSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9PSBJbnRlZ2VyLmNsYXNzIHx8IGFjdHVhbCA9PSBTaG9ydC5jbGFzcyB8fCAKLSAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9PSBCeXRlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWFsID09IENoYXJhY3Rlci5UWVBFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbCA9PSBDaGFyYWN0ZXIuY2xhc3M7Ci0gICAgICAgICAgICB9IGVsc2UgaWYoZm9ybWFsID09IEJ5dGUuVFlQRSAmJiBhY3R1YWwgPT0gQnl0ZS5jbGFzcykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmKGZvcm1hbCA9PSBTaG9ydC5UWVBFICYmCi0gICAgICAgICAgICAgICAoYWN0dWFsID09IFNob3J0LmNsYXNzIHx8IGFjdHVhbCA9PSBCeXRlLmNsYXNzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChCaWdEZWNpbWFsLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYWN0dWFsKSAmJiBpc051bWVyaWNhbChmb3JtYWwpKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBCaWdEZWNpbWFscyBhcyB3ZSBkZWVtIEJpZ0RlY2ltYWwgdG8gYmUKLSAgICAgICAgICAgICAgICAvLyBjb252ZXJ0aWJsZSB0byBhbnkgbnVtZXJpYyB0eXBlIC0gZWl0aGVyIG9iamVjdCBvciBwcmltaXRpdmUuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gYWN0dWFsbHkgY2F1c2UgdXMgdHJvdWJsZSBhcyB0aGlzIGlzIGEgbmFycm93aW5nIAotICAgICAgICAgICAgICAgIC8vIGNvbnZlcnNpb24sIG5vdCB3aWRlbmluZy4gCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNOdW1lcmljYWwoQ2xhc3MgdHlwZSkgewotICAgICAgICByZXR1cm4gTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlLmlzUHJpbWl0aXZlKCkgJiYgdHlwZSAhPSBCb29sZWFuLlRZUEUgJiYgdHlwZSAhPSBDaGFyYWN0ZXIuVFlQRTsKLSAgICB9Ci0gCi0gICAgLyoqCi0gICAgICogU3ltYm9saXplcyB0aGUgY2xhc3Mgb2YgbnVsbCAoaXQncyBtaXNzaW5nIGZyb20gSmF2YSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbCB7Ci0gICAgICAgIAotICAgICAgICAvLyBDYW4ndCBiZSBpbnN0YW50aWF0ZWQKLSAgICAgICAgcHJpdmF0ZSBOdWxsKCkgeyB9Ci0gICAgICAgIAotICAgIH0KLSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL01ldGhvZFV0aWxpdGllcy5qYXZhIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9NZXRob2RVdGlsaXRpZXMuamF2YQppbmRleCBhYmNmNGU2Li4zYzA3MzI0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL01ldGhvZFV0aWxpdGllcy5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvTWV0aG9kVXRpbGl0aWVzLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAvKioKICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHR5cGUgZ2l2ZW4gYXMgdGhlIDFzdCBhcmd1bWVudCBpcyBjb252ZXJ0aWJsZSB0byB0aGUgdHlwZSBnaXZlbiBhcyB0aGUgMm5kIGFyZ3VtZW50CiAgICAgICogZm9yIG1ldGhvZCBjYWxsIGFyZ3VtZW50IGNvbnZlcnNpb24uIFRoaXMgZm9sbG93cyB0aGUgcnVsZXMgb2YgdGhlIEphdmEgcmVmbGVjdGlvbi1iYXNlZCBtZXRob2QgY2FsbCwgZXhjZXB0Ci0gICAgICogdGhhdCBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSB2YWx1ZSBoZXJlLCBhIGJveGVkIGNhbGxzIGlzIG5ldmVyIHNlZW5zIGFzIGNvbnZlcnRhYmxlIHRvIGEgcHJpbXRpdmllIHR5cGUuIAorICAgICAqIHRoYXQgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgdmFsdWUgaGVyZSwgYSBib3hlZCBjbGFzcyBpcyBuZXZlciBzZWVuIGFzIGNvbnZlcnRpYmxlIHRvIGEgcHJpbWl0aXZlIHR5cGUuIAogICAgICAqIAogICAgICAqIEByZXR1cm4gMCBtZWFucyB7QGNvZGUgZmFsc2V9LCBub24tMCBtZWFucyB7QGNvZGUgdHJ1ZX0uCiAgICAgICogICAgICAgICBUaGF0IGlzLCAwIGlzIHJldHVybmVkIGxlc3Mgc3BlY2lmaWNpdHkgb3IgaW5jb21wYXJhYmxlIHNwZWNpZmljaXR5LCBhbHNvIHdoZW4gaWYKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZEZpeEFyZ3NNZXRob2RzLmphdmEgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRGaXhBcmdzTWV0aG9kcy5qYXZhCmluZGV4IDdiNTVlZTcuLjJhYTQ5M2EgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZEZpeEFyZ3NNZXRob2RzLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9PdmVybG9hZGVkRml4QXJnc01ldGhvZHMuamF2YQpAQCAtNTEsNyArNTEsNiBAQAogICovCiBwYWNrYWdlIGZyZWVtYXJrZXIuZXh0LmJlYW5zOwogCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC02Myw4ICs2Miw3IEBACiAgKiBTdG9yZXMgdGhlIG5vbi12YXJhcmdzIG1ldGhvZHMgZm9yIGEge0BsaW5rIE92ZXJsb2FkZWRNZXRob2RzfSBvYmplY3QuCiAgKiBAYXV0aG9yIEF0dGlsYSBTemVnZWRpCiAgKi8KLWNsYXNzIE92ZXJsb2FkZWRGaXhBcmdzTWV0aG9kcyBleHRlbmRzIE92ZXJsb2FkZWRNZXRob2RzU3Vic2V0Ci17CitjbGFzcyBPdmVybG9hZGVkRml4QXJnc01ldGhvZHMgZXh0ZW5kcyBPdmVybG9hZGVkTWV0aG9kc1N1YnNldCB7CiAgICAgCiAgICAgT3ZlcmxvYWRlZEZpeEFyZ3NNZXRob2RzKEJlYW5zV3JhcHBlciBiZWFuc1dyYXBwZXIpIHsKICAgICAgICAgc3VwZXIoYmVhbnNXcmFwcGVyKTsKQEAgLTc0LDcgKzcyLDcgQEAKICAgICAgICAgcmV0dXJuIG1lbWJlckRlc2MucGFyYW1UeXBlczsKICAgICB9CiAgICAgCi0gICAgdm9pZCBhZnRlcldpZGVuaW5nVW53cmFwcGluZ0hpbnRzKENsYXNzW10gcGFyYW1UeXBlcykgeworICAgIHZvaWQgYWZ0ZXJXaWRlbmluZ1Vud3JhcHBpbmdIaW50cyhDbGFzc1tdIHBhcmFtVHlwZXMsIGludFtdIHBhcmFtTnVtZXJpY2FsVHlwZXMpIHsKICAgICAgICAgLy8gRG8gbm90aGluZwogICAgIH0KIApAQCAtODksMTUgKzg3LDI0IEBACiAgICAgICAgIGlmKHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudC5sZW5ndGggPD0gYXJnQ291bnQpIHsKICAgICAgICAgICAgIHJldHVybiBFbXB0eU1lbWJlckFuZEFyZ3VtZW50cy5OT19TVUNIX01FVEhPRDsKICAgICAgICAgfQotICAgICAgICBDbGFzc1tdIHVud2FycHBpbmdBcmd1bWVudFR5cGVzID0gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W2FyZ0NvdW50XTsKLSAgICAgICAgaWYodW53YXJwcGluZ0FyZ3VtZW50VHlwZXMgPT0gbnVsbCkgeworICAgICAgICBDbGFzc1tdIHVud2FycHBpbmdIaW50cyA9IHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFthcmdDb3VudF07CisgICAgICAgIGlmKHVud2FycHBpbmdIaW50cyA9PSBudWxsKSB7CiAgICAgICAgICAgICByZXR1cm4gRW1wdHlNZW1iZXJBbmRBcmd1bWVudHMuTk9fU1VDSF9NRVRIT0Q7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIE9iamVjdFtdIHBvam9BcmdzID0gbmV3IE9iamVjdFthcmdDb3VudF07CisgICAgICAgIAorICAgICAgICBpbnRbXSBwb3NzaWJsZU51bWVyaWNhbFR5cGVzID0gZ2V0UG9zc2libGVOdW1lcmljYWxUeXBlcyhhcmdDb3VudCk7CisgICAgICAgIGlmIChwb3NzaWJsZU51bWVyaWNhbFR5cGVzID09IEFMTF9aRVJPU19BUlJBWSkgeworICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlcyA9IG51bGw7CisgICAgICAgIH0KKwogICAgICAgICBJdGVyYXRvciBpdCA9IHRtQXJncy5pdGVyYXRvcigpOwogICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJnQ291bnQ7ICsraSkgewotICAgICAgICAgICAgT2JqZWN0IHBvam8gPSB3LnVud3JhcEludGVybmFsKChUZW1wbGF0ZU1vZGVsKWl0Lm5leHQoKSwgdW53YXJwcGluZ0FyZ3VtZW50VHlwZXNbaV0pOworICAgICAgICAgICAgT2JqZWN0IHBvam8gPSB3LnRyeVVud3JhcCgKKyAgICAgICAgICAgICAgICAgICAgKFRlbXBsYXRlTW9kZWwpIGl0Lm5leHQoKSwKKyAgICAgICAgICAgICAgICAgICAgdW53YXJwcGluZ0hpbnRzW2ldLAorICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZU51bWVyaWNhbFR5cGVzICE9IG51bGwgPyBwb3NzaWJsZU51bWVyaWNhbFR5cGVzW2ldIDogMCk7CiAgICAgICAgICAgICBpZihwb2pvID09IEJlYW5zV3JhcHBlci5DQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eU1lbWJlckFuZEFyZ3VtZW50cy5OT19TVUNIX01FVEhPRDsKICAgICAgICAgICAgIH0KQEAgLTEwNyw3ICsxMTQsMTYgQEAKICAgICAgICAgTWF5YmVFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtYXliZUVtdHB5TWVtYmVyRGVzYyA9IGdldE1lbWJlckRlc2NyaXB0b3JGb3JBcmdzKHBvam9BcmdzLCBmYWxzZSk7CiAgICAgICAgIGlmKG1heWJlRW10cHlNZW1iZXJEZXNjIGluc3RhbmNlb2YgQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSB7CiAgICAgICAgICAgICBDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IgbWVtYmVyRGVzYyA9IChDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IpIG1heWJlRW10cHlNZW1iZXJEZXNjOwotICAgICAgICAgICAgQmVhbnNXcmFwcGVyLmNvZXJjZUJpZ0RlY2ltYWxzKG1lbWJlckRlc2MucGFyYW1UeXBlcywgcG9qb0FyZ3MpOworICAgICAgICAgICAgaWYgKGJ1Z2ZpeGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvc3NpYmxlTnVtZXJpY2FsVHlwZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgb3ZlcmxvYWRlZCBtZXRob2Qgc2VsZWN0aW9uIGhhcyBhbHJlYWR5IGFjY291bnRlZCBmb3Igb3ZlcmZsb3cgZXJyb3JzIHdoZW4gdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAvLyB3YXMgc2VsZWN0ZWQuIFNvIHRoaXMgZm9yY2VkIGNvbnZlcnNpb24gc2hvdWxkbid0IGNhdXNlIHN1Y2ggY29ycnVwdGlvbi4gRXhjZXB0LCBjb252ZXJzaW9uIGZyb20KKyAgICAgICAgICAgICAgICAgICAgLy8gQmlnRGVjaW1hbCBpcyBhbGxvd2VkIHRvIG92ZXJmbG93IGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICBmb3JjZU51bWJlckFyZ3VtZW50c1RvUGFyYW1ldGVyVHlwZXMocG9qb0FyZ3MsIG1lbWJlckRlc2MucGFyYW1UeXBlcywgcG9zc2libGVOdW1lcmljYWxUeXBlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBCZWFuc1dyYXBwZXIuY29lcmNlQmlnRGVjaW1hbHMobWVtYmVyRGVzYy5wYXJhbVR5cGVzLCBwb2pvQXJncyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gbmV3IE1lbWJlckFuZEFyZ3VtZW50cyhtZW1iZXJEZXNjLm1lbWJlciwgcG9qb0FyZ3MpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIEVtcHR5TWVtYmVyQW5kQXJndW1lbnRzLmZyb20oKEVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSBtYXliZUVtdHB5TWVtYmVyRGVzYyk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRNZXRob2RzU3Vic2V0LmphdmEgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRNZXRob2RzU3Vic2V0LmphdmEKaW5kZXggMmNiMjgyYi4uY2NjMThlNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9PdmVybG9hZGVkTWV0aG9kc1N1YnNldC5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQuamF2YQpAQCAtNjIsMTggKzYyLDMyIEBACiAKIGltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLlRlbXBsYXRlTW9kZWxFeGNlcHRpb247CiBpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS51dGlsaXR5LkNsYXNzVXRpbDsKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLnV0aWxpdHkuTnVsbEFyZ3VtZW50RXhjZXB0aW9uOwogCiAvKioKICAqIEBhdXRob3IgQXR0aWxhIFN6ZWdlZGkKICAqLwogYWJzdHJhY3QgY2xhc3MgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQgeworICAgIAorICAgIC8qKiAKKyAgICAgKiBVc2VkIGZvciBhbiBvcHRpbWl6YXRpb24gdHJpY2sgdG8gc3Vic3RpdHV0ZSBhbiBhcnJheSBvZiB3aGF0ZXZlciBzaXplIHRoYXQgY29udGFpbnMgb25seSAwLXMuIFNpbmNlIHRoaXMgYXJyYXkKKyAgICAgKiBpcyAwIGxvbmcsIHRoaXMgbWVhbnMgdGhhdCB0aGUgY29kZSB0aGF0IHJlYWRzIHRoZSBpbnRbXSBhbHdheXMgaGF2ZSB0byBjaGVjayBpZiB0aGUgaW50W10gaGFzIHRoaXMgdmFsdWUsIGFuZAorICAgICAqIHRoZW4gaXQgaGFzIHRvIGFjdCBsaWtlIGlmIHdhcyBhbGwgMC1zLiAgCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludFtdIEFMTF9aRVJPU19BUlJBWSA9IG5ldyBpbnRbMF07CiAKICAgICBwcml2YXRlIENsYXNzWy8qbnVtYmVyIG9mIGFyZ3MqL11bLyphcmcgaW5kZXgqL10gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50OwogICAgIAorICAgIC8qKgorICAgICAqIFRlbGxzIHdoYXQgbnVtZXJpY2FsIHR5cGVzIG9jY3VyIGF0IGEgZ2l2ZW4gcGFyYW1ldGVyIHBvc2l0aW9uIHdpdGggYSBiaXQgZmllbGQsIGFsc28gaWYgdGhlCisgICAgICogdW53cmFwcGluZyB3aWxsIGRvIHByb3BlciBjb252ZXJzaW9uLiBTZWUge0BsaW5rIE92ZXJsb2FkZWROdW1iZXJVdGlsI0ZMQUdfSU5URUdFUn0sIGV0Yy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFsvKm51bWJlciBvZiBhcmdzKi9dWy8qYXJnIGluZGV4Ki9dIHBvc3NpYmxlTnVtZXJpY2FsVHlwZXNCeVBhcmFtQ291bnQ7CisgICAgCiAgICAgLy8gVE9ETzogVGhpcyBjYW4gY2F1c2UgbWVtb3J5LWxlYWsgd2hlbiBjbGFzc2VzIGFyZSByZS1sb2FkZWQuIEhvd2V2ZXIsIGZpcnN0IHRoZSBnZW5lcmljQ2xhc3NJbnRyb3NwZWN0aW9uQ2FjaGUKICAgICAvLyBhbmQgc3VjaCBuZWVkIHRvIGJlIGZpeGVkIGluIHRoaXMgcmVnYXJkLiAKICAgICAvLyBKYXZhIDU6IFVzZSBDb25jdXJyZW50SGFzaE1hcDoKLSAgICBwcml2YXRlIGZpbmFsIE1hcC8qPENsYXNzU3RyaW5nLCBNYXliZUVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yPiovIGFyZ1R5cGVzVG9NZW1iZXJEZXNjQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgTWFwLyo8QXJndW1lbnRUeXBlcywgTWF5YmVFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcj4qLyBhcmdUeXBlc1RvTWVtYmVyRGVzY0NhY2hlID0gbmV3IEhhc2hNYXAoKTsKICAgICAKICAgICBwcml2YXRlIGZpbmFsIExpc3QvKjxDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3I+Ki8gbWVtYmVyRGVzY3MgPSBuZXcgTGlua2VkTGlzdCgpOwogICAgIApAQCAtODEsNTYgKzk1LDczIEBACiAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gYnVnZml4ZWQ7CiAgICAgCiAgICAgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQoQmVhbnNXcmFwcGVyIGJlYW5zV3JhcHBlcikgewotICAgICAgICBidWdmaXhlZCA9IGJlYW5zV3JhcHBlci5nZXRJbmNvbXBhdGlibGVJbXByb3ZlbWVudHMoKS5pbnRWYWx1ZSgpID49IDIwMDMwMjE7CisgICAgICAgIGJ1Z2ZpeGVkID0gYmVhbnNXcmFwcGVyLmlzMjMyMUJ1Z2ZpeGVkKCk7CiAgICAgfQogICAgIAogICAgIHZvaWQgYWRkQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjKSB7Ci0gICAgICAgIGZpbmFsIGludCBwYXJhbUNvdW50ID0gbWVtYmVyRGVzYy5wYXJhbVR5cGVzLmxlbmd0aDsKLSAgICAgICAgCiAgICAgICAgIG1lbWJlckRlc2NzLmFkZChtZW1iZXJEZXNjKTsKICAgICAgICAgCi0gICAgICAgIGZpbmFsIENsYXNzW10gcHJlcHJvY2Vzc2VkUGFyYW1UeXBlcyA9IHByZXByb2Nlc3NQYXJhbWV0ZXJUeXBlcyhtZW1iZXJEZXNjKTsKKyAgICAgICAgLy8gV2FybmluZzogRG8gbm90IG1vZGlmeSB0aGlzIGFycmF5LCBvciBwdXQgaXQgaW50byB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQgYnkgcmVmZXJlbmNlLCBhcyB0aGUgYXJyYXlzCisgICAgICAgIC8vIGluc2lkZSB0aGF0IGFyZSBtb2RpZmllZCEKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBwcmVwZWRQYXJhbVR5cGVzID0gcHJlcHJvY2Vzc1BhcmFtZXRlclR5cGVzKG1lbWJlckRlc2MpOworICAgICAgICBmaW5hbCBpbnQgcGFyYW1Db3VudCA9IHByZXBlZFBhcmFtVHlwZXMubGVuZ3RoOyAgLy8gTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBvcmlnaW5hbCBwYXJhbSBsaXN0CiAgICAgICAgIAotICAgICAgICBmaW5hbCBDbGFzc1tdIHVud3JhcHBpbmdIaW50cyA9IChDbGFzc1tdKSBwcmVwcm9jZXNzZWRQYXJhbVR5cGVzLmNsb25lKCk7CiAgICAgICAgIC8vIE1lcmdlIHRoZXNlIHVud3JhcHBpbmcgaGludHMgd2l0aCB0aGUgZXhpc3RpbmcgdGFibGUgb2YgaGludHM6CiAgICAgICAgIGlmICh1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50ID0gbmV3IENsYXNzW3BhcmFtQ291bnQgKyAxXVtdOwotICAgICAgICAgICAgdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W3BhcmFtQ291bnRdID0gdW53cmFwcGluZ0hpbnRzOworICAgICAgICAgICAgdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W3BhcmFtQ291bnRdID0gKENsYXNzW10pIHByZXBlZFBhcmFtVHlwZXMuY2xvbmUoKTsKICAgICAgICAgfSBlbHNlIGlmICh1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQubGVuZ3RoIDw9IHBhcmFtQ291bnQpIHsKICAgICAgICAgICAgIENsYXNzW11bXSBuZXdVbndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQgPSBuZXcgQ2xhc3NbcGFyYW1Db3VudCArIDFdW107CiAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudCwgMCwgbmV3VW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50LCAwLAogICAgICAgICAgICAgICAgICAgICB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQubGVuZ3RoKTsKICAgICAgICAgICAgIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudCA9IG5ld1Vud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudDsKLSAgICAgICAgICAgIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFtwYXJhbUNvdW50XSA9IHVud3JhcHBpbmdIaW50czsKKyAgICAgICAgICAgIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFtwYXJhbUNvdW50XSA9IChDbGFzc1tdKSBwcmVwZWRQYXJhbVR5cGVzLmNsb25lKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDbGFzc1tdIHByZXZVbndyYXBwaW5nSGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbcGFyYW1Db3VudF07IAotICAgICAgICAgICAgaWYgKHByZXZVbndyYXBwaW5nSGludHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFtwYXJhbUNvdW50XSA9IHVud3JhcHBpbmdIaW50czsKKyAgICAgICAgICAgIENsYXNzW10gdW53cmFwcGluZ0hpbnRzID0gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W3BhcmFtQ291bnRdOyAKKyAgICAgICAgICAgIGlmICh1bndyYXBwaW5nSGludHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFtwYXJhbUNvdW50XSA9IChDbGFzc1tdKSBwcmVwZWRQYXJhbVR5cGVzLmNsb25lKCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBwcmV2VW53cmFwcGluZ0hpbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgcGFyYW1JZHggPSAwOyBwYXJhbUlkeCA8IHByZXBlZFBhcmFtVHlwZXMubGVuZ3RoOyBwYXJhbUlkeCsrKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHBhcmFtZXRlciBsaXN0IGxlbmd0aCwgd2UgbWVyZ2UgdGhlIGFyZ3VtZW50IHR5cGUgYXJyYXlzIGludG8gYSBzaW5nbGUgQ2xhc3NbXSB0aGF0Ci0gICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlcyB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24gdHlwZXMgb2YgZWFjaCBwb3NpdGlvbi4gSGVuY2Ugd2Ugd2lsbCBwb3NzaWJseSB1c2UgYSB0b28gZ2VuZXJpYworICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZXMgdGhlIG1vc3Qgc3BlY2lmaWMgY29tbW9uIHR5cGVzIGZvciBlYWNoIHBvc2l0aW9uLiBIZW5jZSB3ZSB3aWxsIHBvc3NpYmx5IHVzZSBhIHRvbyBnZW5lcmljCiAgICAgICAgICAgICAgICAgICAgIC8vIGhpbnQgZm9yIHRoZSB1bndyYXBwaW5nLiBGb3IgY29ycmVjdCBiZWhhdmlvciwgZm9yIGVhY2ggb3ZlcmxvYWRlZCBtZXRob2RzIGl0cyBvd24gcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGVzIHNob3VsZCBiZSB1c2VkIGFzIGEgaGludC4gQnV0IHdpdGhvdXQgdW53cmFwcGluZyB0aGUgYXJndW1lbnRzLCB3ZSBjb3VsZG4ndCBzZWxlY3QgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJsb2FkZWQgbWV0aG9kLiBTbyB0aGlzIGlzIGEgY2lyY3VsYXIgcmVmZXJlbmNlIHByb2JsZW0uIFdlIGNvdWxkIHRyeSBzZWxlY3RpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBiYXNlZCBvbiB0aGUgd3JhcHBlZCB2YWx1ZSwgYnV0IHRoYXQncyBxdWl0ZSB0cmlja3ksIGFuZCB0aGUgcmVzdWx0IG9mIHN1Y2ggc2VsZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBjYWNoZWFibGUgKHRoZSBUTSB0eXBlcyBhcmUgbm90IGVub3VnaCBhcyBjYWNoZSBrZXkgdGhlbi4gU28gd2UganVzdCB1c2UgdGhpcworICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgY2FjaGVhYmxlICh0aGUgVE0gdHlwZXMgYXJlIG5vdCBlbm91Z2ggYXMgY2FjaGUga2V5IHRoZW4pLiBTbyB3ZSBqdXN0IHVzZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXByb21pc2UuCi0gICAgICAgICAgICAgICAgICAgIHByZXZVbndyYXBwaW5nSGludHNbaV0gPSBnZXRDb21tb25TdXBlcnR5cGVGb3JVbndyYXBwaW5nSGludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2VW53cmFwcGluZ0hpbnRzW2ldLCB1bndyYXBwaW5nSGludHNbaV0pOworICAgICAgICAgICAgICAgICAgICB1bndyYXBwaW5nSGludHNbcGFyYW1JZHhdID0gZ2V0Q29tbW9uU3VwZXJ0eXBlRm9yVW53cmFwcGluZ0hpbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwcGluZ0hpbnRzW3BhcmFtSWR4XSwgcHJlcGVkUGFyYW1UeXBlc1twYXJhbUlkeF0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGludFtdIHBhcmFtTnVtZXJpY2FsVHlwZXMgPSBBTExfWkVST1NfQVJSQVk7CisgICAgICAgIGlmIChidWdmaXhlZCkgeworICAgICAgICAgICAgLy8gRmlsbCBwb3NzaWJsZU51bWVyaWNhbFR5cGVzQnlQYXJhbUNvdW50IChpZiBuZWNlc3NhcnkpCisgICAgICAgICAgICBmb3IgKGludCBwYXJhbUlkeCA9IDA7IHBhcmFtSWR4IDwgcGFyYW1Db3VudDsgcGFyYW1JZHgrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBudW1UeXBlID0gT3ZlcmxvYWRlZE51bWJlclV0aWwuY2xhc3NUb1R5cGVGbGFncyhwcmVwZWRQYXJhbVR5cGVzW3BhcmFtSWR4XSk7CisgICAgICAgICAgICAgICAgaWYgKG51bVR5cGUgIT0gMCkgeyAgLy8gSXQncyBhIG51bWVyaWNhbCB0eXBlCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbU51bWVyaWNhbFR5cGVzID09IEFMTF9aRVJPU19BUlJBWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1OdW1lcmljYWxUeXBlcyA9IG5ldyBpbnRbcGFyYW1Db3VudF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGFyYW1OdW1lcmljYWxUeXBlc1twYXJhbUlkeF0gPSBudW1UeXBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lcmdlSW5OdW1lcmljYWxUeXBlcyhwYXJhbUNvdW50LCBwYXJhbU51bWVyaWNhbFR5cGVzKTsKKyAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgYWZ0ZXJXaWRlbmluZ1Vud3JhcHBpbmdIaW50cyhidWdmaXhlZCA/IHByZXByb2Nlc3NlZFBhcmFtVHlwZXMgOiB1bndyYXBwaW5nSGludHMpOworICAgICAgICBhZnRlcldpZGVuaW5nVW53cmFwcGluZ0hpbnRzKAorICAgICAgICAgICAgICAgIGJ1Z2ZpeGVkID8gcHJlcGVkUGFyYW1UeXBlcyA6IHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudFtwYXJhbUNvdW50XSwKKyAgICAgICAgICAgICAgICBwYXJhbU51bWVyaWNhbFR5cGVzKTsKICAgICB9CiAgICAgCiAgICAgQ2xhc3NbXVtdIGdldFVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudCgpIHsKICAgICAgICAgcmV0dXJuIHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudDsKICAgICB9CiAgICAgCi0gICAgTWF5YmVFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBnZXRNZW1iZXJEZXNjcmlwdG9yRm9yQXJncyhPYmplY3RbXSBhcmdzLCBib29sZWFuIHZhckFyZykgewotICAgICAgICBDbGFzc1N0cmluZyBhcmdUeXBlcyA9IG5ldyBDbGFzc1N0cmluZyhhcmdzLCBidWdmaXhlZCk7CisgICAgZmluYWwgTWF5YmVFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBnZXRNZW1iZXJEZXNjcmlwdG9yRm9yQXJncyhPYmplY3RbXSBhcmdzLCBib29sZWFuIHZhckFyZykgeworICAgICAgICBBcmd1bWVudFR5cGVzIGFyZ1R5cGVzID0gbmV3IEFyZ3VtZW50VHlwZXMoYXJncywgYnVnZml4ZWQpOwogICAgICAgICBNYXliZUVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIG1lbWJlckRlc2M7CiAgICAgICAgIHN5bmNocm9uaXplZChhcmdUeXBlc1RvTWVtYmVyRGVzY0NhY2hlKSB7CiAgICAgICAgICAgICBtZW1iZXJEZXNjID0gKE1heWJlRW1wdHlDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IpIGFyZ1R5cGVzVG9NZW1iZXJEZXNjQ2FjaGUuZ2V0KGFyZ1R5cGVzKTsKQEAgLTE0NywxOSArMTc4LDE4IEBACiAgICAgfQogICAgIAogICAgIGFic3RyYWN0IENsYXNzW10gcHJlcHJvY2Vzc1BhcmFtZXRlclR5cGVzKENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvciBtZW1iZXJEZXNjKTsKLSAgICBhYnN0cmFjdCB2b2lkIGFmdGVyV2lkZW5pbmdVbndyYXBwaW5nSGludHMoQ2xhc3NbXSBwYXJhbVR5cGVzKTsKKyAgICBhYnN0cmFjdCB2b2lkIGFmdGVyV2lkZW5pbmdVbndyYXBwaW5nSGludHMoQ2xhc3NbXSBwYXJhbVR5cGVzLCBpbnRbXSBwYXJhbU51bWVyaWNhbFR5cGVzKTsKICAgICAKICAgICBhYnN0cmFjdCBNYXliZUVtcHR5TWVtYmVyQW5kQXJndW1lbnRzIGdldE1lbWJlckFuZEFyZ3VtZW50cyhMaXN0Lyo8VGVtcGxhdGVNb2RlbD4qLyB0bUFyZ3MsIAogICAgICAgICAgICAgQmVhbnNXcmFwcGVyIHcpIHRocm93cyBUZW1wbGF0ZU1vZGVsRXhjZXB0aW9uOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24gY2xhc3MgKG9yIGludGVyZmFjZSkgb2YgdHdvIHBhcmFtZXRlciB0eXBlcyBmb3IgdGhlIHB1cnBvc2Ugb2YgdW53cmFwcGluZy4KLSAgICAgKiBUaGlzIGlzIHRyaWNraWVyIHRoZW4gZmluZGluZyB0aGUgbW9zdCBzcGVjaWZpYyBvdmVybGFwcGluZyBzdXBlcmNsYXNzIG9mIHR3byBjbGFzc2VzLCBiZWNhdXNlOgorICAgICAqIFRoaXMgaXMgdHJpY2tpZXIgdGhhbiBmaW5kaW5nIHRoZSBtb3N0IHNwZWNpZmljIG92ZXJsYXBwaW5nIHN1cGVyY2xhc3Mgb2YgdHdvIGNsYXNzZXMsIGJlY2F1c2U6CiAgICAgICogPHVsPgogICAgICAqICAgPGxpPkl0IGNvbnNpZGVycyBwcmltaXRpdmUgY2xhc3NlcyBhcyB0aGUgc3ViY2xhc3NlcyBvZiB0aGUgYm94aW5nIGNsYXNzZXMuPC9saT4KLSAgICAgKiAgIDxsaT5JdCBjb25zaWRlcnMgd2lkZW5pbmcgbnVtZXJpY2FsIGNvbnZlcnNpb24gYXMgaWYgdGhlIG5hcnJvd2VyIHR5cGUgaXMgc3ViY2xhc3MuPC9saT4KICAgICAgKiAgIDxsaT5JZiB0aGUgb25seSBjb21tb24gY2xhc3MgaXMge0BsaW5rIE9iamVjdH0sIGl0IHdpbGwgdHJ5IHRvIGZpbmQgYSBjb21tb24gaW50ZXJmYWNlLiBJZiB0aGVyZSBhcmUgbW9yZQotICAgICAqICAgICAgIG9mIHRoZW0sIGl0IHdpbGwgc3RhcnQgcmVtb3ZpbmcgdGhvc2UgdGhhdCBhcmUga25vd24gdG8gYmUgdW5pbnRlcmVzdGluZyBhcyB1bndyYXBwaW5nIGhpbnQuPC9saT4KKyAgICAgKiAgICAgICBvZiB0aGVtLCBpdCB3aWxsIHN0YXJ0IHJlbW92aW5nIHRob3NlIHRoYXQgYXJlIGtub3duIHRvIGJlIHVuaW50ZXJlc3RpbmcgYXMgdW53cmFwcGluZyBoaW50cy48L2xpPgogICAgICAqIDwvdWw+CiAgICAgICogCiAgICAgICogQHBhcmFtIGMxIFBhcmFtZXRlciB0eXBlIDEKQEAgLTE4MCw3ICsyMTAsNyBAQAogICAgICAgICAgICAgICAgIGMxV2FzUHJpbSA9IGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBjMSBwcmltaXRpdmUgY2xhc3MgdG8gYm94aW5nIGNsYXNzOgorICAgICAgICAgICAgLy8gYzIgcHJpbWl0aXZlIGNsYXNzIHRvIGJveGluZyBjbGFzczoKICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYzJXYXNQcmltOyAKICAgICAgICAgICAgIGlmIChjMi5pc1ByaW1pdGl2ZSgpKSB7CiAgICAgICAgICAgICAgICAgYzIgPSBDbGFzc1V0aWwucHJpbWl0aXZlQ2xhc3NUb0JveGluZ0NsYXNzKGMyKTsKQEAgLTE5MCwxMyArMjIwLDE1IEBACiAgICAgICAgICAgICB9CiAgICAgCiAgICAgICAgICAgICBpZiAoYzEgPT0gYzIpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiBpdCB3YXMgbGlrZSBpbnQgYW5kIEludGVnZXIsIGJvb2xlYW4gYW5kIEJvb2xlYW4sIGV0Yy4KKyAgICAgICAgICAgICAgICAvLyBJZiBpdCB3YXMgbGlrZSBpbnQgYW5kIEludGVnZXIsIGJvb2xlYW4gYW5kIEJvb2xlYW4sIGV0Yy4sIHdlIHJldHVybiB0aGUgYm94aW5nIHR5cGUgKGFzIHRoYXQncyB0aGUKKyAgICAgICAgICAgICAgICAvLyBsZXNzIHNwZWNpZmljLCBiZWNhdXNlIGl0IGFsbG93cyBudWxsLikKICAgICAgICAgICAgICAgICAvLyAoSWYgaXQgd2FzIHR3byBlcXVpdmFsZW50IHByaW1pdGl2ZXMsIHdlIGRvbid0IGdldCBoZXJlLCBiZWNhdXNlIG9mIHRoZSAxc3QgbGluZSBvZiB0aGUgbWV0aG9kLikgCiAgICAgICAgICAgICAgICAgcmV0dXJuIGMxOwogICAgICAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjMSkgJiYgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYzIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0aGUgdW53cmFwcGVyIHRvIGNvbnZlcnQgdG8gYSBudW1lcmljYWwgc3VwZXItdHlwZSBhcyBpdCdzIG5vdCB5ZXQga25vd24gd2hhdCB0aGUKLSAgICAgICAgICAgICAgICAvLyBhY3R1YWwgbnVtYmVyIHR5cGUgb2YgdGhlIGNob3NlbiBtZXRob2Qgd2lsbCBiZS4gKEVzcGVjaWFsbHkgYXMgZml4ZWQgcG9pbnQgdG8gZmxvYXRpbmcgcG9pbnQgY2FuIGJlCi0gICAgICAgICAgICAgICAgLy8gbG9zc3kuKQorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdGhlIHVud3JhcHBlciB0byBjb252ZXJ0IHRvIGEgbnVtZXJpY2FsIHN1cGVyLXR5cGUgWypdIGFzIGl0J3Mgbm90IHlldCBrbm93biB3aGF0IHRoZQorICAgICAgICAgICAgICAgIC8vIGFjdHVhbCBudW1iZXIgdHlwZSBvZiB0aGUgY2hvc2VuIG1ldGhvZCB3aWxsIGJlLiBXZSB3aWxsIHBvc3Rwb25lIHRoZSBhY3R1YWwgbnVtZXJpY2FsIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAvLyB1bnRpbCB0aGF0LCBlc3BlY2lhbGx5IGFzIHNvbWUgY29udmVyc2lvbnMgKGxpa2UgZml4ZWQgcG9pbnQgdG8gZmxvYXRpbmcgcG9pbnQpIGNhbiBiZSBsb3NzeS4KKyAgICAgICAgICAgICAgICAvLyAqIE51bWVyaWNhbCBzdXBlci10eXBlOiBMaWtlIGxvbmcgPiBpbnQgPiBzaG9ydCA+IGJ5dGUuICAKICAgICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyLmNsYXNzOwogICAgICAgICAgICAgfSBlbHNlIGlmIChjMVdhc1ByaW0gfHwgYzJXYXNQcmltKSB7CiAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGVzZSBhbGwgc3RhbmQ6CkBAIC0yMTgsNyArMjUwLDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKLSAgICAgICAgLy8gSWYgYnV4Zml4ZWQgaXMgdHJ1ZSBhbmQgYW55IG9mIHRoZSBjbGFzc2VzIHdhcyBhIHByaW1pdGl2ZSB0eXBlLCB3ZSBuZXZlciByZWFjaCB0aGlzIHBvaW50LgorICAgICAgICAvLyBXZSBuZXZlciBnZXQgdG8gdGhpcyBwb2ludCBpZiBidXhmaXhlZCBpcyB0cnVlIGFuZCBhbnkgb2YgdGhlc2Ugc3RhbmRzOgorICAgICAgICAvLyAtIE9uZSBvZiBjbGFzc2VzIHdhcyBhIHByaW1pdGl2ZSB0eXBlCisgICAgICAgIC8vIC0gT25lIG9mIGNsYXNzZXMgd2FzIGEgbnVtZXJpY2FsIHR5cGUgKGVpdGhlciBib3hpbmcgdHlwZSBvciBwcmltaXRpdmUpCiAgICAgICAgIAogICAgICAgICBTZXQgY29tbW9uVHlwZXMgPSBNZXRob2RVdGlsaXRpZXMuZ2V0QXNzaWduYWJsZXMoYzEsIGMyKTsKICAgICAgICAgY29tbW9uVHlwZXMucmV0YWluQWxsKE1ldGhvZFV0aWxpdGllcy5nZXRBc3NpZ25hYmxlcyhjMiwgYzEpKTsKQEAgLTIzNywxNSArMjcxLDE4IEBACiAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcyljb21tb25UeXBlc0l0ZXIubmV4dCgpOwogICAgICAgICAgICAgZm9yIChJdGVyYXRvciBtYXhJdGVyID0gbWF4Lml0ZXJhdG9yKCk7IG1heEl0ZXIuaGFzTmV4dCgpOykgewogICAgICAgICAgICAgICAgIENsYXNzIG1heENsYXp6ID0gKENsYXNzKW1heEl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgIGlmKE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUobWF4Q2xhenosIGNsYXp6LCBidWdmaXhlZCwgMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmKE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUobWF4Q2xhenosIGNsYXp6LCBmYWxzZSAvKmJ1Z2ZpeGVkIFsxXSovLCAwKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXp6IGNhbid0IGJlIG1heGltYWwsIGlmIHRoZXJlJ3MgYWxyZWFkeSBhIG1vcmUgc3BlY2lmaWMgb3IgZXF1YWwgbWF4aW1hbCB0aGFuIGl0LgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsaXN0Q29tbW9uVHlwZXM7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUoY2xhenosIG1heENsYXp6LCBidWdmaXhlZCwgMCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmKE1ldGhvZFV0aWxpdGllcy5pc01vcmVPclNhbWVTcGVjaWZpY1BhcmFtZXRlclR5cGUoY2xhenosIG1heENsYXp6LCBmYWxzZSAvKmJ1Z2ZpeGVkIFsxXSovLCAwKSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIGl0J3MgbW9yZSBzcGVjaWZpYyB0aGFuIGEgY3VycmVudGx5IG1heGltYWwgZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBjdXJyZW50bHkgbWF4aW1hbCBpcyBubyBsb25nZXIgYSBtYXhpbWFsLgogICAgICAgICAgICAgICAgICAgICBtYXhJdGVyLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyAxOiBXZSBkb24ndCB1c2UgYnVnZml4ZWQgYXQgdGhlICJbMV0iLW1hcmtlZCBwb2ludHMgYmVjYXVzZSBpdCdzIHNsb3dlciBhbmQgZG9lc24ndCBtYWtlIGFueQorICAgICAgICAgICAgICAgIC8vICAgIGRpZmZlcmVuY2UgaGVyZSBhcyBpdCdzIGVuc3VyZWQgdGhhdCBub3IgYzEgbm9yIGMyIGlzIHByaW1pdGl2ZSBvciBudW1lcmljYWwuIFRoZSBidWdmaXggaGFzIG9ubHkKKyAgICAgICAgICAgICAgICAvLyAgICBhZmZlY3RlZCB0aGUgdHJlYXRtZW50IG9mIHByaW1pdGl2ZXMgYW5kIG51bWVyaWNhbCB0eXBlcy4gCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgbm8gY3VycmVudCBtYXhpbWFsIGlzIG1vcmUgc3BlY2lmaWMgdGhhbiB0aGUKICAgICAgICAgICAgIC8vIGN1cnJlbnQgY2xhc3MsIHNvIGNsYXp6IGlzIGEgbmV3IG1heGltYWwgc28gZmFyLgpAQCAtMjg4LDQgKzMyNSwxMTIgQEAKICAgICAgICAgcmV0dXJuIChDbGFzcykgbWF4LmdldCgwKTsKICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbnVtZXJpY2FsIHR5cGUgImZsYWdzIiBvZiBlYWNoIHBhcmFtZXRlciBwb3NpdGlvbnMsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSdzIG5vIG1ldGhvZCB3aXRoIHRoaXMKKyAgICAgKiBwYXJhbWV0ZXIgY291bnQgb3IgaWYgd2UgYXJlbid0IGluIHByZS0yLjMuMjEgbW9kZSwge0BsaW5rICNBTExfWkVST1NfQVJSQVl9IGlmIHRoZXJlIHdlcmUgbm8gbnVtZXJpY2FsCisgICAgICogcGFyYW1ldGVycy4gVGhlIHJldHVybmVkIHtAY29kZSBpbnR9LXMgYXJlIG9uIG9yIG1vcmUge0BsaW5rIE92ZXJsb2FkZWROdW1iZXJVdGlsfX0ge0Bjb2RlIEZMQUdfLi4ufSBjb25zdGFudHMKKyAgICAgKiBiaW5hcnkgIm9yIi1lZCB0b2dldGhlci4gIAorICAgICAqLworICAgIGZpbmFsIHByb3RlY3RlZCBpbnRbXSBnZXRQb3NzaWJsZU51bWVyaWNhbFR5cGVzKGludCBwYXJhbUNvdW50KSB7CisgICAgICAgIHJldHVybiBwb3NzaWJsZU51bWVyaWNhbFR5cGVzQnlQYXJhbUNvdW50ICE9IG51bGwgJiYgcG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudC5sZW5ndGggPiBwYXJhbUNvdW50CisgICAgICAgICAgICAgICAgPyBwb3NzaWJsZU51bWVyaWNhbFR5cGVzQnlQYXJhbUNvdW50W3BhcmFtQ291bnRdCisgICAgICAgICAgICAgICAgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBkc3RQYXJhbUNvdW50IFRoZSBwYXJhbWV0ZXIgY291bnQgZm9yIHdoaWNoIHdlIHdhbnQgdG8gbWVyZ2UgaW4gdGhlIHBvc3NpYmxlIG51bWVyaWNhbCB0eXBlcyAKKyAgICAgKiBAcGFyYW0gc3JjTnVtVHlwZXNCeVBhcmFtSWR4IElmIHNob3J0ZXIgdGhhbiB7QGNvZGUgZHN0UGFyYW1Db3VudH0sIGl0J3MgbGFzdCBpdGVtIHdpbGwgYmUgcmVwZWF0ZWQgdW50aWwKKyAgICAgKiAgICAgICAgZHN0UGFyYW1Db3VudCBsZW5ndGggaXMgcmVhY2hlZC4gSWYgbG9uZ2VyLCB0aGUgZXhjZXNzaXZlIGl0ZW1zIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiAgICAgICAgTWF5YmUge0BsaW5rICNBTExfWkVST1NfQVJSQVl9LiBDYW50J2JlIGEgMC1sZW5ndGggYXJyYXkuIENhbid0IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBmaW5hbCBwcm90ZWN0ZWQgdm9pZCBtZXJnZUluTnVtZXJpY2FsVHlwZXMoaW50IGRzdFBhcmFtQ291bnQsIGludFtdIHNyY051bVR5cGVzQnlQYXJhbUlkeCkgeworICAgICAgICBOdWxsQXJndW1lbnRFeGNlcHRpb24uY2hlY2soInNyY051bVR5cGVzQnlQYXJhbUlkeCIsIHNyY051bVR5cGVzQnlQYXJhbUlkeCk7CisgICAgICAgIGlmIChkc3RQYXJhbUNvdW50ID09IDApIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIC8vIEVuc3VyZSB0aGF0IHBvc3NpYmxlTnVtZXJpY2FsVHlwZXNCeVBhcmFtQ291bnRbZHN0UGFyYW1Db3VudF0gZXhpc3RzOgorICAgICAgICBpZiAocG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb3NzaWJsZU51bWVyaWNhbFR5cGVzQnlQYXJhbUNvdW50ID0gbmV3IGludFtkc3RQYXJhbUNvdW50ICsgMV1bXTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3NzaWJsZU51bWVyaWNhbFR5cGVzQnlQYXJhbUNvdW50Lmxlbmd0aCA8PSBkc3RQYXJhbUNvdW50KSB7CisgICAgICAgICAgICBpZiAoc3JjTnVtVHlwZXNCeVBhcmFtSWR4ID09IG51bGwpIHJldHVybjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50W11bXSBuZXdOdW1lcmljYWxUeXBlQnlQYXJhbUNvdW50ID0gbmV3IGludFtkc3RQYXJhbUNvdW50ICsgMV1bXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudCwgMCwgbmV3TnVtZXJpY2FsVHlwZUJ5UGFyYW1Db3VudCwgMCwKKyAgICAgICAgICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudC5sZW5ndGgpOworICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudCA9IG5ld051bWVyaWNhbFR5cGVCeVBhcmFtQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZpbmFsIGludCBzcmNQYXJhbUNvdW50ID0gc3JjTnVtVHlwZXNCeVBhcmFtSWR4Lmxlbmd0aDsKKyAgICAgICAgCisgICAgICAgIGludFtdIGRzdE51bVR5cGVzQnlQYXJhbUlkeCA9IHBvc3NpYmxlTnVtZXJpY2FsVHlwZXNCeVBhcmFtQ291bnRbZHN0UGFyYW1Db3VudF07CisgICAgICAgIGlmIChkc3ROdW1UeXBlc0J5UGFyYW1JZHggPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgbWV0aG9kIGFkZGVkIHdpdGggdGhpcyBudW1iZXIgb2YgcGFyYW1zID0+IG5vIG1lcmdpbmcKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHNyY051bVR5cGVzQnlQYXJhbUlkeCAhPSBBTExfWkVST1NfQVJSQVkpIHsKKyAgICAgICAgICAgICAgICBkc3ROdW1UeXBlc0J5UGFyYW1JZHggPSBuZXcgaW50W2RzdFBhcmFtQ291bnRdOworICAgICAgICAgICAgICAgIGZvciAoaW50IHBhcmFtSWR4ID0gMDsgcGFyYW1JZHggPCBkc3RQYXJhbUNvdW50OyBwYXJhbUlkeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdE51bVR5cGVzQnlQYXJhbUlkeFtwYXJhbUlkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNyY051bVR5cGVzQnlQYXJhbUlkeFtwYXJhbUlkeCA8IHNyY1BhcmFtQ291bnQgPyBwYXJhbUlkeCA6IHNyY1BhcmFtQ291bnQgLSAxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdE51bVR5cGVzQnlQYXJhbUlkeCA9IEFMTF9aRVJPU19BUlJBWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudFtkc3RQYXJhbUNvdW50XSA9IGRzdE51bVR5cGVzQnlQYXJhbUlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGRzdE51bVR5cGVzQnlQYXJhbUlkeCAhPSBudWxsLCBzbyB3ZSBuZWVkIHRvIG1lcmdlIGludG8gaXQuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChzcmNOdW1UeXBlc0J5UGFyYW1JZHggPT0gZHN0TnVtVHlwZXNCeVBhcmFtSWR4KSB7CisgICAgICAgICAgICAgICAgLy8gVXNlZCB0byBvY2N1ciB3aGVuIGJvdGggYXJlIEFMTF9aRVJPU19BUlJBWQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXMgd2Ugd2lsbCB3cml0ZSBkc3ROdW1UeXBlc0J5UGFyYW1JZHgsIGl0IGNhbid0IHJlbWFpbiBBTExfWkVST1NfQVJSQVkgYW55bW9yZS4gCisgICAgICAgICAgICBpZiAoZHN0TnVtVHlwZXNCeVBhcmFtSWR4ID09IEFMTF9aRVJPU19BUlJBWSAmJiBkc3RQYXJhbUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGRzdE51bVR5cGVzQnlQYXJhbUlkeCA9IG5ldyBpbnRbZHN0UGFyYW1Db3VudF07CisgICAgICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlc0J5UGFyYW1Db3VudFtkc3RQYXJhbUNvdW50XSA9IGRzdE51bVR5cGVzQnlQYXJhbUlkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgcGFyYW1JZHggPSAwOyBwYXJhbUlkeCA8IGRzdFBhcmFtQ291bnQ7IHBhcmFtSWR4KyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3JjUGFyYW1OdW1UeXBlcworICAgICAgICAgICAgICAgICAgICAgICAgPSBzcmNOdW1UeXBlc0J5UGFyYW1JZHggIT0gQUxMX1pFUk9TX0FSUkFZCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzcmNOdW1UeXBlc0J5UGFyYW1JZHhbcGFyYW1JZHggPCBzcmNQYXJhbUNvdW50ID8gcGFyYW1JZHggOiBzcmNQYXJhbUNvdW50IC0gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGRzdFBhcmFtTnVtVHlwZXMgPSBkc3ROdW1UeXBlc0J5UGFyYW1JZHhbcGFyYW1JZHhdOworICAgICAgICAgICAgICAgIGlmIChkc3RQYXJhbU51bVR5cGVzICE9IHNyY1BhcmFtTnVtVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0TnVtVHlwZXNCeVBhcmFtSWR4W3BhcmFtSWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZHN0UGFyYW1OdW1UeXBlcyB8IHNyY1BhcmFtTnVtVHlwZXMgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UOyAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGlmIGEgcGFyYW1ldGVyIGlzIG5vbi1udW1lcmljYWwsIGl0cyBwYXJhTnVtVHlwZXMgaXMgMC4gU28gaWYgd2UgaGF2ZSBhIG5vbi1udW1iZXIgYW5kCisgICAgICAgICAgICAgICAgLy8gYSBzb21lIGtpbmQgb2YgbnVtYmVyIChub24tMCksIHRoZSBtZXJnZWQgcmVzdWx0IHdpbGwgYmUgbWFya2VkIHdpdGggRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVC4KKyAgICAgICAgICAgICAgICAvLyAoSS5lLiwgdGhlIHNhbWUgaGFwcGVucyBhcyB3aXRoIHR3byBkaWZmZXJlbnQgbnVtZXJpY2FsIHR5cGVzLikKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgdm9pZCBmb3JjZU51bWJlckFyZ3VtZW50c1RvUGFyYW1ldGVyVHlwZXMoCisgICAgICAgICAgICBPYmplY3RbXSBhcmdzLCBDbGFzc1tdIHBhcmFtVHlwZXMsIGludFtdIHVud3JhcHBpbmdOdW1UeXBlc0J5UGFyYW1JbmRleCkgeworICAgICAgICBmaW5hbCBpbnQgcGFyYW1UeXBlc0xlbiA9IHBhcmFtVHlwZXMubGVuZ3RoOworICAgICAgICBmaW5hbCBpbnQgYXJnc0xlbiA9IGFyZ3MubGVuZ3RoOworICAgICAgICBmb3IgKGludCBhcmdJZHggPSAwOyBhcmdJZHggPCBhcmdzTGVuOyBhcmdJZHgrKykgeworICAgICAgICAgICAgZmluYWwgaW50IHBhcmFtVHlwZUlkeCA9IGFyZ0lkeCA8IHBhcmFtVHlwZXNMZW4gPyBhcmdJZHggOiBwYXJhbVR5cGVzTGVuIC0gMTsKKyAgICAgICAgICAgIGZpbmFsIGludCB1bndyYXBwaW5nTnVtVHlwZXMgPSB1bndyYXBwaW5nTnVtVHlwZXNCeVBhcmFtSW5kZXhbcGFyYW1UeXBlSWR4XTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gRm9yY2luZyB0aGUgbnVtYmVyIHR5cGUgY2FuIG9ubHkgYmUgaW50ZXJlc3RpbmcgaWYgdGhlcmUgYXJlIG51bWVyaWNhbCBwYXJhbWV0ZXIgdHlwZXMgb24gdGhhdCBpbmRleCwKKyAgICAgICAgICAgIC8vIGFuZCB0aGUgdW53cmFwcGluZyB3YXMgbm90IHRvIGFuIGV4YWN0IG51bWVyaWNhbCB0eXBlLgorICAgICAgICAgICAgaWYgKHVud3JhcHBpbmdOdW1UeXBlcyAhPSAwCisgICAgICAgICAgICAgICAgICAgICYmICh1bndyYXBwaW5nTnVtVHlwZXMgJiBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFyZyA9IGFyZ3NbYXJnSWR4XTsKKyAgICAgICAgICAgICAgICAvLyBJZiBhcmcgaXNuJ3QgYSBudW1iZXIsIHdlIGNhbid0IGRvIGFueSBjb252ZXJzaW9ucyBhbnl3YXksIHJlZ2FyZGxlc3Mgb2YgdGhlIHBhcmFtIHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKGFyZyBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyB0YXJnZXRUeXBlID0gcGFyYW1UeXBlc1twYXJhbVR5cGVJZHhdOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBOdW1iZXIgY29udmVydGVkQXJnID0gQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOdW1iZXIpIGFyZywgdGFyZ2V0VHlwZSwgYnVnZml4ZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkQXJnICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJnSWR4XSA9IGNvbnZlcnRlZEFyZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE51bWJlclV0aWwuamF2YSBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE51bWJlclV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2M2NzNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9PdmVybG9hZGVkTnVtYmVyVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTI0OCBAQAorcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZU51bWJlck1vZGVsOworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUudXRpbGl0eS5DbGFzc1V0aWw7CitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS51dGlsaXR5Lk51bWJlclV0aWw7CisKKy8qKgorICogRXZlcnl0aGluZyByZWxhdGVkIHRvIGNvZXJjaW9uIHRvIGFtYmlndW91cyBudW1lcmljYWwgdHlwZXMuICAKKyAqLworY2xhc3MgT3ZlcmxvYWRlZE51bWJlclV0aWwgeworCisgICAgLy8gQ2FuJ3QgYmUgaW5zdGFudGlhdGVkCisgICAgcHJpdmF0ZSBPdmVybG9hZGVkTnVtYmVyVXRpbCgpIHsgfQorICAgIAorICAgIC8qKiBUaGUgdW53cmFwcGluZyBoaW50IHdpbGwgbm90IGJlIGEgc3BlY2lmaWMgbnVtZXJpY2FsIHR5cGUuICovCisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UID0gMTsKKyAgICAKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQllURSA9IDQ7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX1NIT1JUID0gODsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfSU5URUdFUiA9IDE2OworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19MT05HID0gMzI7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0ZMT0FUID0gNjQ7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0RPVUJMRSA9IDEyODsKKyAgICBzdGF0aWMgZmluYWwgaW50IEZMQUdfQklHX0lOVEVHRVIgPSAyNTY7CisgICAgc3RhdGljIGZpbmFsIGludCBGTEFHX0JJR19ERUNJTUFMID0gNTEyOworICAgIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19VTktOT1dOX1RZUEUgPSAxMDI0OworICAgIAorICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19LTk9XTl9JTlRFR0VSUyA9IEZMQUdfQllURSB8IEZMQUdfU0hPUlQgfCBGTEFHX0lOVEVHRVIgfCBGTEFHX0xPTkcgfCBGTEFHX0JJR19JTlRFR0VSOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19LTk9XTl9OT05JTlRFR0VSUyA9IEZMQUdfRkxPQVQgfCBGTEFHX0RPVUJMRSB8IEZMQUdfQklHX0RFQ0lNQUw7CisgICAgc3RhdGljIGZpbmFsIGludCBNQVNLX0FMTF9LTk9XTl9UWVBFUyA9IE1BU0tfS05PV05fSU5URUdFUlMgfCBNQVNLX0tOT1dOX05PTklOVEVHRVJTOworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFTS19BTExfVFlQRVMgPSBNQVNLX0FMTF9LTk9XTl9UWVBFUyB8IEZMQUdfVU5LTk9XTl9UWVBFOworCisgICAgLyoqIFRoZSBoaWdoZXN0IGxvbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGRvdWJsZSB3aXRob3V0IHByZWNpc2lvbiBsb3NzOiAyKio1My4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9ET1VCTEVfT1JfTE9ORyA9IDkwMDcxOTkyNTQ3NDA5OTJMOworICAgIC8qKiBUaGUgbG93ZXN0IGxvbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGRvdWJsZSB3aXRob3V0IHByZWNpc2lvbiBsb3NzOiAtKDIqKjUzKS4gKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTl9ET1VCTEVfT1JfTE9ORyA9IC05MDA3MTk5MjU0NzQwOTkyTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0RPVUJMRV9PUl9MT05HX0xPR18yID0gNTM7CisgICAgCisgICAgLyoqIFRoZSBoaWdoZXN0IGxvbmcgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGZsb2F0IHdpdGhvdXQgcHJlY2lzaW9uIGxvc3M6IDIqKjI0LiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRkxPQVRfT1JfSU5UID0gMTY3NzcyMTY7CisgICAgLyoqIFRoZSBsb3dlc3QgbG9uZyB0aGF0IGNhbiBiZSBzdG9yZWQgaW4gZmxvYXQgd2l0aG91dCBwcmVjaXNpb24gbG9zczogLSgyKioyNCkuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9GTE9BVF9PUl9JTlQgPSAtMTY3NzcyMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9GTE9BVF9PUl9JTlRfTE9HXzIgPSAyNDsKKworICAgIHN0YXRpYyBib29sZWFuIGhhc0NvbW1vbkZsYWdzKENsYXNzIHBDbGFzcywgaW50IG51bWJlclR5cGVGbGFncykgeworICAgICAgICAgcmV0dXJuIChPdmVybG9hZGVkTnVtYmVyVXRpbC5jbGFzc1RvVHlwZUZsYWdzKHBDbGFzcykgJiBudW1iZXJUeXBlRmxhZ3MpICE9IDA7CisgICAgfQorCisgICAgc3RhdGljIGludCBjbGFzc1RvVHlwZUZsYWdzKENsYXNzIHBDbGFzcykgeworICAgICAgICBpZiAocENsYXNzLmlzUHJpbWl0aXZlKCkpIHsKKyAgICAgICAgICAgIGlmIChwQ2xhc3MgPT0gSW50ZWdlci5UWVBFKSByZXR1cm4gRkxBR19JTlRFR0VSOworICAgICAgICAgICAgZWxzZSBpZiAocENsYXNzID09IExvbmcuVFlQRSkgcmV0dXJuIEZMQUdfTE9ORzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBDbGFzcyA9PSBEb3VibGUuVFlQRSkgcmV0dXJuIEZMQUdfRE9VQkxFOworICAgICAgICAgICAgZWxzZSBpZiAocENsYXNzID09IEZsb2F0LlRZUEUpIHJldHVybiBGTEFHX0ZMT0FUOworICAgICAgICAgICAgZWxzZSBpZiAocENsYXNzID09IEJ5dGUuVFlQRSkgcmV0dXJuIEZMQUdfQllURTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBDbGFzcyA9PSBTaG9ydC5UWVBFKSByZXR1cm4gRkxBR19TSE9SVDsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocENsYXNzKSkgeworICAgICAgICAgICAgaWYgKHBDbGFzcyA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gRkxBR19JTlRFR0VSOworICAgICAgICAgICAgZWxzZSBpZiAocENsYXNzID09IExvbmcuY2xhc3MpIHJldHVybiBGTEFHX0xPTkc7CisgICAgICAgICAgICBlbHNlIGlmIChwQ2xhc3MgPT0gRG91YmxlLmNsYXNzKSByZXR1cm4gRkxBR19ET1VCTEU7CisgICAgICAgICAgICBlbHNlIGlmIChwQ2xhc3MgPT0gRmxvYXQuY2xhc3MpIHJldHVybiBGTEFHX0ZMT0FUOworICAgICAgICAgICAgZWxzZSBpZiAocENsYXNzID09IEJ5dGUuY2xhc3MpIHJldHVybiBGTEFHX0JZVEU7CisgICAgICAgICAgICBlbHNlIGlmIChwQ2xhc3MgPT0gU2hvcnQuY2xhc3MpIHJldHVybiBGTEFHX1NIT1JUOworICAgICAgICAgICAgZWxzZSBpZiAoQmlnRGVjaW1hbC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBDbGFzcykpIHJldHVybiBGTEFHX0JJR19ERUNJTUFMOworICAgICAgICAgICAgZWxzZSBpZiAoQmlnSW50ZWdlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBDbGFzcykpIHJldHVybiBGTEFHX0JJR19JTlRFR0VSOworICAgICAgICAgICAgZWxzZSByZXR1cm4gRkxBR19VTktOT1dOX1RZUEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEF0dGFjaGVzIHRoZSBsb3dlc3QgYWx0ZXJuYXRpdmUgbnVtYmVyIHR5cGUgdG8gdGhlIHBhcmFtZXRlciBudW1iZXIgdmlhIHtAbGluayBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlfSwgaWYKKyAgICAgKiB0aGF0J3MgdXNlZnVsIGFjY29yZGluZyB0aGUgcG9zc2libGUgdGFyZ2V0IG51bWJlciB0eXBlcy4gVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBhcHBsaWVkIG9uIHRoZSBtZXRob2QgY2FsbAorICAgICAqIGFyZ3VtZW50IGxpc3QgYmVmb3JlIG92ZXJsb2FkZWQgbWV0aG9kIHNlbGVjdGlvbi4KKyAgICAgKiAKKyAgICAgKiA8cD5Ob3RlIHRoYXQgYXMgb2YgdGhpcyB3cml0aW5nLCB0aGlzIG1ldGhvZCBpcyBvbmx5IHVzZWQgd2hlbgorICAgICAqIHtAbGluayBCZWFuc1dyYXBwZXIjZ2V0SW5jb21wYXRpYmxlSW1wcm92ZW1lbnRzKCl9ID49IDIuMy4yMS4KKyAgICAgKiAKKyAgICAgKiA8cD5XaHkncyB0aGlzIG5lZWRlZCwgaG93IGl0IHdvcmtzOiBPdmVybG9hZGVkIG1ldGhvZHMgc2VsZWN0aW9uIG9ubHkgc2VsZWN0cyBtZXRob2RzIHdoZXJlIHRoZSA8ZW0+dHlwZTwvZW0+CisgICAgICogKG5vdCB0aGUgdmFsdWUhKSBvZiB0aGUgYXJndW1lbnQgaXMgInNtYWxsZXIiIG9yIHRoZSBzYW1lIGFzIHRoZSBwYXJhbWV0ZXIgdHlwZS4gVGhpcyBpcyBzaW1pbGFyIHRvIGhvdyBpdCdzIGluCisgICAgICogdGhlIEphdmEgbGFuZ3VhZ2UuIFRoYXQgaXQgb25seSBkZWNpZGVzIGJhc2VkIG9uIHRoZSBwYXJhbWV0ZXIgdHlwZSBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGlzIHdheQorICAgICAqIHtAbGluayBPdmVybG9hZGVkTWV0aG9kc1N1YnNldH0gY2FuIGNhY2hlIG1ldGhvZCBsb29rdXAgZGVjaXNpb25zIHVzaW5nIHRoZSB0eXBlcyBhcyB0aGUgY2FjaGUga2V5LiBQcm9ibGVtIGlzLAorICAgICAqIHNpbmNlIHlvdSBkb24ndCBkZWNsYXJlIHRoZSBleGFjdCBudW1lcmljYWwgdHlwZXMgaW4gRlRMLCBhbmQgRlRMIGhhcyBvbmx5IGEgc2luZ2xlIGdlbmVyaWMgbnVtZXJpYyB0eXBlCisgICAgICogYW55d2F5LCB3aGF0IEphdmEgdHlwZSBhIHtAbGluayBUZW1wbGF0ZU51bWJlck1vZGVsfSB1c2VzIGludGVybmFsbHkgaXMgb2Z0ZW4gc2VlbiBhcyBhIHRlY2huaWNhbCBkZXRhaWwgb2Ygd2hpY2gKKyAgICAgKiB0aGUgdGVtcGxhdGUgYXV0aG9yIGNhbid0IGFsd2F5cyBrZWVwIHRyYWNrIG9mLiBTbyB3ZSBpbnZlc3RpZ2F0ZSB0aGUgPGVtPnZhbHVlPC9lbT4gb2YgdGhlIG51bWJlciB0b28sCisgICAgICogdGhlbiBjb2VyY2UgaXQgZG93biB3aXRob3V0IG92ZXJmbG93IHRvIGEgdHlwZSB0aGF0IHdpbGwgbWF0Y2ggdGhlIG1vc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAoVGhpcworICAgICAqIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGFzIEZUTCBvZnRlbiBzdG9yZXMgbnVtYmVycyBpbiB7QGxpbmsgQmlnRGVjaW1hbH0tcywgd2hpY2ggd2lsbCBoYXJkbHkgZXZlciBtYXRjaCBhbnkKKyAgICAgKiBtZXRob2QgcGFyYW1ldGVycy4pIFdlIGNvdWxkIHNpbXBseSByZXR1cm4gdGhhdCBudW1iZXIsIGxpa2Uge0Bjb2RlIEJ5dGUoMCl9IGZvciBhbiB7QGNvZGUgSW50ZWdlcigwKX0sCisgICAgICogaG93ZXZlciwgdGhlbiB3ZSB3b3VsZCBsb3NlIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHRoZSBvcmlnaW5hbCB0eXBlIHdhcy4gVGhlIG9yaWdpbmFsIHR5cGUgaXMgc29tZXRpbWVzCisgICAgICogaW1wb3J0YW50LCBhcyBpbiBhbWJpZ3VvdXMgc2l0dWF0aW9ucyB0aGUgbWV0aG9kIHdoZXJlIHRoZSB0aGVyZSdzIGFuIGV4YWN0IHR5cGUgbWF0Y2ggc2hvdWxkIGJlIHNlbGVjdGVkIChsaWtlLAorICAgICAqIHdoZW4gc29tZW9uZSB3YW50cyB0byBzZWxlY3QgYW4gb3ZlcmxvYWQgZXhwbGljaXRseSB3aXRoIHtAY29kZSBtKHg/aW50KX0pLiBBbHNvLCBpZiBhbiBvdmVybG9hZCB3aW5zIHdoZXJlCisgICAgICogdGhlIHBhcmFtZXRlciB0eXBlIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbnVtYmVyIGlzIHtAY29kZSBOdW1iZXJ9IG9yIHtAY29kZSBPYmplY3R9IChvciB7QGNvZGUgQ29tcGFyYWJsZX0KKyAgICAgKiBldGMuKSwgaXQncyBleHBlY3RlZCB0aGF0IHdlIHBhc3MgaW4gdGhlIG9yaWdpbmFsIHZhbHVlIChhbiB7QGNvZGUgSW50ZWdlcn0gaW4gdGhpcyBleGFtcGxlKSwgZXNwZWNpYWxseSBpZiB0aGF0CisgICAgICogdmFsdWUgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiBhbm90aGVyIEphdmEgbWV0aG9kLiBUaGF0J3Mgd2h5IHdlIHVzZQorICAgICAqIHtAbGluayBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlfSBudW1lcmljYWwgY2xhc3NlcyBsaWtlIHtAbGluayBJbnRlZ2VyT3JCeXRlfSwgd2hpY2ggcmVwcmVzZW50cyBib3RoIHRoZSBvcmlnaW5hbAorICAgICAqIHR5cGUgYW5kIHRoZSBjb2VyY2VkIHR5cGUsIGFsbCBlbmNvZGVkIGludG8gdGhlIGNsYXNzIG9mIHRoZSB2YWx1ZSwgd2hpY2ggaXMgdXNlZCBhcyB0aGUgb3ZlcmxvYWRlZCBtZXRob2QgbG9va3VwCisgICAgICogY2FjaGUga2V5LgorICAgICAqICAKKyAgICAgKiA8cD5TZWUgYWxzbzogPHR0PnNyY1xtYWluXG1pc2Ncb3ZlcmxvYWRlZE51bWJlclJ1bGVzXHByaWNlcy5vZHM8L3R0Pi4KKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gbnVtIHRoZSBudW1iZXIgdG8gY29lcmNlCisgICAgICogQHBhcmFtIHRhcmdldE51bVR5cGVzIGEgYml0LXNldCBvZiB7QGxpbmsgI0ZMQUdfSU5URUdFUn0gYW5kIHN1Y2guCisgICAgICogCisgICAgICogQHJldHVybnMgVGhlIG9yaWdpbmFsIG51bWJlciBvciBhIHtAbGluayBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlfSwgZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgdmFsdWUgYW5kIHRoZSB0eXBlcworICAgICAqICAgICBpbmRpY2F0ZWQgaW4gdGhlIHtAY29kZSB0YXJnZXROdW1UeXBlc30gcGFyYW1ldGVyLgorICAgICAqLworICAgIHN0YXRpYyBOdW1iZXIgYWRkRmFsbGJhY2tUeXBlKE51bWJlciBudW0sIGludCB0YXJnZXROdW1UeXBlcykgeworICAgICAgICAvLyBKYXZhIDU6IHVzZSB2YWx1ZU9mIHdoZXJlIHBvc3NpYmxlCisgICAgICAgIGZpbmFsIENsYXNzIG51bUNsYXNzID0gbnVtLmdldENsYXNzKCk7CisgICAgICAgIGlmIChudW1DbGFzcyA9PSBCaWdEZWNpbWFsLmNsYXNzKSB7CisgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCB0aGUgYmFja3dhcmQtY29tcGF0aWJsZSBtb2RlIHRoYXQgZG9lc24ndCBwcmV2ZW50IHJvbGwgb3ZlcnMgYW5kIG1hZ25pdHVkZSBsb3NzLgorICAgICAgICAgICAgLy8gSG93ZXZlciwgd2UgcHVzaCB0aGUgb3ZlcmxvYWRlZCBzZWxlY3Rpb24gdG8gdGhlIHJpZ2h0IGRpcmVjdGlvbiwgc28gd2Ugd2lsbCBhdCBsZWFzdCBpbmRpY2F0ZSBpZiB0aGUKKyAgICAgICAgICAgIC8vIG51bWJlciBoYXMgZGVjaW1hbHMuCisgICAgICAgICAgICBCaWdEZWNpbWFsIG4gPSAoQmlnRGVjaW1hbCkgbnVtOyAKKyAgICAgICAgICAgIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBNQVNLX0tOT1dOX0lOVEVHRVJTKSAhPSAwICYmICh0YXJnZXROdW1UeXBlcyAmIE1BU0tfS05PV05fTk9OSU5URUdFUlMpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgTnVtYmVyVXRpbC5pc0JpZ0RlY2ltYWxJbnRlZ2VyKG4pIC8qIDwtIGNhbiBiZSBleHBlbnNpdmUgKi8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJCaWdEZWNpbWFsKG4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFaXRoZXIgaXQgd2FzIGEgbm9uLWludGVnZXIsIG9yIGl0IGRpZG4ndCBtYXRlciB3aGF0IGl0IHdhcywgYXMgd2UgZG9uJ3QgaGF2ZSBib3RoIGludGVnZXIgYW5kCisgICAgICAgICAgICAgICAgLy8gbm9uLWludGVnZXIgdGFyZ2V0IHR5cGVzLiAKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChudW1DbGFzcyA9PSBJbnRlZ2VyLmNsYXNzKSB7CisgICAgICAgICAgICBpbnQgcG4gPSBudW0uaW50VmFsdWUoKTsKKyAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB0cnkgdG8gcmV0dXJuIHRoZSBtb3N0IHNwZWNpZmljIHR5cGUgKGkuZS4sIHRoZSBudW1lcmljYWwgdHlwZSB3aXRoIHRoZSBzbWFsbGVzdCByYW5nZSksIGJ1dAorICAgICAgICAgICAgLy8gb25seSBhbW9uZyB0aGUgdHlwZXMgdGhhdCBhcmUgcG9zc2libGUgdGFyZ2V0cy4gTGlrZSBpZiB0aGUgb25seSB0YXJnZXQgaXMgaW50IGFuZCB0aGUgdmFsdWUgaXMgMSwgd2UKKyAgICAgICAgICAgIC8vIHdpbGwgcmV0dXJuIEludGVnZXIgMSwgbm90IEJ5dGUgMSwgZXZlbiB0aG91Z2ggYnl0ZSBpcyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBpbnQgc28gaXQgd291bGQKKyAgICAgICAgICAgIC8vIHdvcmsgdG9vLiBXaHkgd2UgYXZvaWQgdW5uZWNlc3NhcmlseSBzcGVjaWZpYyB0eXBlcyBpcyB0aGF0IHRoZXkgZ2VuZXJhdGUgbW9yZSBvdmVybG9hZGVkIG1ldGhvZCBsb29rdXAKKyAgICAgICAgICAgIC8vIGNhY2hlIGVudHJpZXMsIHNpbmNlIHRoZSBjYWNoZSBrZXkgaXMgdGhlIGFycmF5IG9mIHR5cGVzIG9mIHRoZSBhcmd1bWVudCB2YWx1ZXMuIFNvIHdlIHdhbnQgYXMgZmV3CisgICAgICAgICAgICAvLyBwZXJtdXRhdGlvbnMgYXMgcG9zc2libGUuIAorICAgICAgICAgICAgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfQllURSkgIT0gMCAmJiBwbiA8PSBCeXRlLk1BWF9WQUxVRSAmJiBwbiA+PSBCeXRlLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZWdlck9yQnl0ZSgoSW50ZWdlcikgbnVtLCAoYnl0ZSkgcG4pOworICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX1NIT1JUKSAhPSAwICYmIHBuIDw9IFNob3J0Lk1BWF9WQUxVRSAmJiBwbiA+PSBTaG9ydC5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVnZXJPclNob3J0KChJbnRlZ2VyKSBudW0sIChzaG9ydCkgcG4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG51bUNsYXNzID09IExvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgcG4gPSBudW0ubG9uZ1ZhbHVlKCk7IAorICAgICAgICAgICAgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfQllURSkgIT0gMCAmJiBwbiA8PSBCeXRlLk1BWF9WQUxVRSAmJiBwbiA+PSBCeXRlLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ09yQnl0ZSgoTG9uZykgbnVtLCAoYnl0ZSkgcG4pOworICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX1NIT1JUKSAhPSAwICYmIHBuIDw9IFNob3J0Lk1BWF9WQUxVRSAmJiBwbiA+PSBTaG9ydC5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmdPclNob3J0KChMb25nKSBudW0sIChzaG9ydCkgcG4pOworICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0lOVEVHRVIpICE9IDAgJiYgcG4gPD0gSW50ZWdlci5NQVhfVkFMVUUgJiYgcG4gPj0gSW50ZWdlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmdPckludGVnZXIoKExvbmcpIG51bSwgKGludCkgcG4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG51bUNsYXNzID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgZmluYWwgZG91YmxlIGRvdWJsZU4gPSBudW0uZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQ2FuIHdlIHN0b3JlIGl0IGluIGFuIGludGVnZXIgdHlwZT8KKyAgICAgICAgICAgIGNoZWNrSWZXaG9sZU51bWJlcjogZG8geworICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBNQVNLX0tOT1dOX0lOVEVHRVJTKSA9PSAwKSBicmVhayBjaGVja0lmV2hvbGVOdW1iZXI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVGhlcmUncyBubyBob3BlIHRvIGJlIDEtcHJlY2lzZSBvdXRzaWRlIHRoaXMgcmVnaW9uLiAoQWx0aG91Z2ggcHJvYmxlbXMgY2FuIG9jY3VyIGV2ZW4gaW5zaWRlIGl0Li4uKQorICAgICAgICAgICAgICAgIGlmIChkb3VibGVOID4gTUFYX0RPVUJMRV9PUl9MT05HIHx8IGRvdWJsZU4gPCBNSU5fRE9VQkxFX09SX0xPTkcpIGJyZWFrIGNoZWNrSWZXaG9sZU51bWJlcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsb25nIGxvbmdOID0gbnVtLmxvbmdWYWx1ZSgpOyAKKyAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IGRvdWJsZU4gLSBsb25nTjsKKyAgICAgICAgICAgICAgICBib29sZWFuIGV4YWN0OyAgLy8gV2Ugd2lsbCB0cnkgdG8gaWdub3JlIHByZWNpc2lvbiBnbGl0Y2hlcyAobGlrZSAwLjMgLSAwLjIgLSAwLjEgPSAtMi43RS0xNykKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmIDwgMC4wMDAwMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDAuOTk5OTk5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ04rKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNoZWNrSWZXaG9sZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyA9PiBkaWZmIDwgMAorICAgICAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IC0wLjAwMDAwMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgLTAuOTk5OTk5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ04tLTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGNoZWNrSWZXaG9sZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCB0aGlzLCBpdCBjYW4gYmUgdHJlYXRlZCBhcyBhIHdob2xlIG51bWJlci4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19CWVRFKSAhPSAwICYmIGxvbmdOIDw9IEJ5dGUuTUFYX1ZBTFVFICYmIGxvbmdOID49IEJ5dGUuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlT3JCeXRlKChEb3VibGUpIG51bSwgKGJ5dGUpIGxvbmdOKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfU0hPUlQpICE9IDAgJiYgbG9uZ04gPD0gU2hvcnQuTUFYX1ZBTFVFICYmIGxvbmdOID49IFNob3J0Lk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZU9yU2hvcnQoKERvdWJsZSkgbnVtLCAoc2hvcnQpIGxvbmdOKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfSU5URUdFUikgIT0gMCAmJiBsb25nTiA8PSBJbnRlZ2VyLk1BWF9WQUxVRSAmJiBsb25nTiA+PSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW50TiA9IChpbnQpIGxvbmdOOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gSmF2YSA1OiByZW1vdmUgdGhlICI/IChOdW1iZXIpIiBhbmQgIjogKE51bWJlcikiIGNhc3RzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0ZMT0FUKSAhPSAwICYmIGludE4gPj0gTUlOX0ZMT0FUX09SX0lOVCAmJiBpbnROIDw9IE1BWF9GTE9BVF9PUl9JTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKE51bWJlcikgbmV3IERvdWJsZU9ySW50ZWdlck9yRmxvYXQoKERvdWJsZSkgbnVtLCBpbnROKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoTnVtYmVyKSBuZXcgRG91YmxlT3JJbnRlZ2VyKChEb3VibGUpIG51bSwgaW50Tik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0xPTkcpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4YWN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZU9yTG9uZygoRG91YmxlKSBudW0sIGxvbmdOKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGRlYWwgd2l0aCBub24tZXhhY3QgbnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZSBvZiBpbnQsIGFzIHdlIGFscmVhZHkgcmVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVMUCAyLjM4NDE4NTc5MTAxNTYyNUUtNyB0aGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb25nTiA+PSBJbnRlZ2VyLk1JTl9WQUxVRSAmJiBsb25nTiA8PSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlT3JMb25nKChEb3VibGUpIG51bSwgbG9uZ04pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBjaGVja0lmV2hvbGVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gVGhpcyBwb2ludCBpcyByZWFjaGVkIGlmIHRoZSBkb3VibGUgdmFsdWUgd2FzIG91dCBvZiB0aGUgcmFuZ2Ugb2YgdGFyZ2V0IGludGVnZXIgdHlwZShzKS4gCisgICAgICAgICAgICAgICAgLy8gRmFsbHMgdGhyb3VnaCEKKyAgICAgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsKKyAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoIHRoaXMgdGhhdCBtZWFucyB0aGF0IGl0IGNhbid0IGJlIHRyZWF0ZWQgYXMgYSB3aG9sZSBudW1iZXIuCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0ZMT0FUKSAhPSAwICYmIGRvdWJsZU4gPj0gLUZsb2F0Lk1BWF9WQUxVRSAmJiBkb3VibGVOIDw9IEZsb2F0Lk1BWF9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlT3JGbG9hdCgoRG91YmxlKSBudW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTaW1wbHkgRG91YmxlOgorICAgICAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobnVtQ2xhc3MgPT0gRmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIGZsb2F0IGZsb2F0TiA9IG51bS5mbG9hdFZhbHVlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIENhbiB3ZSBzdG9yZSBpdCBpbiBhbiBpbnRlZ2VyIHR5cGU/CisgICAgICAgICAgICBjaGVja0lmV2hvbGVOdW1iZXI6IGRvIHsKKyAgICAgICAgICAgICAgICBpZiAoKHRhcmdldE51bVR5cGVzICYgTUFTS19LTk9XTl9JTlRFR0VSUykgPT0gMCkgYnJlYWsgY2hlY2tJZldob2xlTnVtYmVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gaG9wZSB0byBiZSAxLXByZWNpc2Ugb3V0c2lkZSB0aGlzIHJlZ2lvbi4gKEFsdGhvdWdoIHByb2JsZW1zIGNhbiBvY2N1ciBldmVuIGluc2lkZSBpdC4uLikKKyAgICAgICAgICAgICAgICBpZiAoZmxvYXROID4gTUFYX0ZMT0FUX09SX0lOVCB8fCBmbG9hdE4gPCBNSU5fRkxPQVRfT1JfSU5UKSBicmVhayBjaGVja0lmV2hvbGVOdW1iZXI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IGludE4gPSBudW0uaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IGZsb2F0TiAtIGludE47CisgICAgICAgICAgICAgICAgYm9vbGVhbiBleGFjdDsgIC8vIFdlIHdpbGwgdHJ5IHRvIGlnbm9yZSBwcmVjaXNpb24gZ2xpdGNoZXMgKGxpa2UgMC4zIC0gMC4yIC0gMC4xID0gLTIuN0UtMTcpCisgICAgICAgICAgICAgICAgaWYgKGRpZmYgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBleGFjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSByZWFjaCBVTFAgNy42MjkzOTQ1RS02IHdpdGggYnl0ZXMsIHNvIHdlIGRvbid0IGNvbnRpbnVlIHdpdGggc2hvcnRzLgorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW50TiA+PSBCeXRlLk1JTl9WQUxVRSAmJiBpbnROIDw9IEJ5dGUuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPCAwLjAwMDAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlmZiA+IDAuOTk5OTkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludE4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2hlY2tJZldob2xlTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLy8gPT4gZGlmZiA8IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gLTAuMDAwMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDwgLTAuOTk5OTkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludE4tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2hlY2tJZldob2xlTnVtYmVyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgY2hlY2tJZldob2xlTnVtYmVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCB0aGlzLCBpdCBjYW4gYmUgdHJlYXRlZCBhcyBhIHdob2xlIG51bWJlci4KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19CWVRFKSAhPSAwICYmIGludE4gPD0gQnl0ZS5NQVhfVkFMVUUgJiYgaW50TiA+PSBCeXRlLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0T3JCeXRlKChGbG9hdCkgbnVtLCAoYnl0ZSkgaW50Tik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX1NIT1JUKSAhPSAwICYmIGludE4gPD0gU2hvcnQuTUFYX1ZBTFVFICYmIGludE4gPj0gU2hvcnQuTUlOX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXRPclNob3J0KChGbG9hdCkgbnVtLCAoc2hvcnQpIGludE4pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19JTlRFR0VSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXRPckludGVnZXIoKEZsb2F0KSBudW0sIGludE4pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19MT05HKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGV2ZW4gZ28gb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgaW50ZWdlcnMsIHNvIHdlIGRvbid0IG5lZWQgTG9uZyB2YXJpYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKE51bWJlcikgbmV3IEZsb2F0T3JJbnRlZ2VyKChGbG9hdCkgbnVtLCBpbnROKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKE51bWJlcikgbmV3IEZsb2F0T3JCeXRlKChGbG9hdCkgbnVtLCAoYnl0ZSkgaW50Tik7ICAvLyBhcyAhZXhhY3QgaW1wbGllcyAoLTEyOC4uMTI3KQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBUaGlzIHBvaW50IGlzIHJlYWNoZWQgaWYgdGhlIGZsb2F0IHZhbHVlIHdhcyBvdXQgb2YgdGhlIHJhbmdlIG9mIHRhcmdldCBpbnRlZ2VyIHR5cGUocykuIAorICAgICAgICAgICAgICAgIC8vIEZhbGxzIHRocm91Z2ghCisgICAgICAgICAgICB9IHdoaWxlIChmYWxzZSk7CisgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaCB0aGlzIHRoYXQgbWVhbnMgdGhhdCBpdCBjYW4ndCBiZSB0cmVhdGVkIGFzIGEgd2hvbGUgbnVtYmVyLiBTbyBpdCdzIHNpbXBseSBhIEZsb2F0OgorICAgICAgICAgICAgcmV0dXJuIG51bTsKKyAgICAgICAgfSBlbHNlIGlmIChudW1DbGFzcyA9PSBCeXRlLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICB9IGVsc2UgaWYgKG51bUNsYXNzID09IFNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICBzaG9ydCBwbiA9IG51bS5zaG9ydFZhbHVlKCk7IAorICAgICAgICAgICAgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfQllURSkgIT0gMCAmJiBwbiA8PSBCeXRlLk1BWF9WQUxVRSAmJiBwbiA+PSBCeXRlLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnRPckJ5dGUoKFNob3J0KSBudW0sIChieXRlKSBwbik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobnVtQ2xhc3MgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgaWYgKCh0YXJnZXROdW1UeXBlcworICAgICAgICAgICAgICAgICAgICAmICgoTUFTS19LTk9XTl9JTlRFR0VSUyB8IE1BU0tfS05PV05fTk9OSU5URUdFUlMpIF4gKEZMQUdfQklHX0lOVEVHRVIgfCBGTEFHX0JJR19ERUNJTUFMKSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICBCaWdJbnRlZ2VyIGJpTnVtID0gKEJpZ0ludGVnZXIpIG51bTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYml0TGVuZ3RoID0gYmlOdW0uYml0TGVuZ3RoKCk7ICAvLyBEb2Vzbid0IGluY2x1ZGUgc2lnbiBiaXQsIHNvIGl0J3Mgb25lIGxlc3MgdGhhbiBleHBlY3RlZAorICAgICAgICAgICAgICAgIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0JZVEUpICE9IDAgJiYgYml0TGVuZ3RoIDw9IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyT3JCeXRlKGJpTnVtKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0YXJnZXROdW1UeXBlcyAmIEZMQUdfU0hPUlQpICE9IDAgJiYgYml0TGVuZ3RoIDw9IDE1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmlnSW50ZWdlck9yU2hvcnQoYmlOdW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19JTlRFR0VSKSAhPSAwICYmIGJpdExlbmd0aCA8PSAzMSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXJPckludGVnZXIoYmlOdW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19MT05HKSAhPSAwICYmIGJpdExlbmd0aCA8PSA2MykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXJPckxvbmcoYmlOdW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhcmdldE51bVR5cGVzICYgRkxBR19GTE9BVCkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJpdExlbmd0aCA8PSBNQVhfRkxPQVRfT1JfSU5UX0xPR18yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYml0TGVuZ3RoID09IE1BWF9GTE9BVF9PUl9JTlRfTE9HXzIgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmlOdW0uZ2V0TG93ZXN0U2V0Qml0KCkgPj0gTUFYX0ZMT0FUX09SX0lOVF9MT0dfMikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyT3JGbG9hdChiaU51bSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGFyZ2V0TnVtVHlwZXMgJiBGTEFHX0RPVUJMRSkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJpdExlbmd0aCA8PSBNQVhfRE9VQkxFX09SX0xPTkdfTE9HXzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBiaXRMZW5ndGggPT0gTUFYX0RPVUJMRV9PUl9MT05HX0xPR18yICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGJpTnVtLmdldExvd2VzdFNldEJpdCgpID49IE1BWF9ET1VCTEVfT1JfTE9OR19MT0dfMikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdJbnRlZ2VyT3JEb3VibGUoYmlOdW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBObyByZWxldmFudCBjb2VyY2lvbiB0YXJnZXQgdHlwZXM7IHJldHVybiB0aGUgQmlnSW50ZWdlciBhcyBpczoKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVW5rbm93biBudW1iZXIgdHlwZToKKyAgICAgICAgICAgIHJldHVybiBudW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgaW50ZXJmYWNlIEJ5dGVTb3VyY2UgeyBCeXRlIGJ5dGVWYWx1ZSgpOyB9CisgICAgc3RhdGljIGludGVyZmFjZSBTaG9ydFNvdXJjZSB7IFNob3J0IHNob3J0VmFsdWUoKTsgfQorICAgIHN0YXRpYyBpbnRlcmZhY2UgSW50ZWdlclNvdXJjZSB7IEludGVnZXIgaW50ZWdlclZhbHVlKCk7IH0KKyAgICBzdGF0aWMgaW50ZXJmYWNlIExvbmdTb3VyY2UgeyBMb25nIGxvbmdWYWx1ZSgpOyB9CisgICAgc3RhdGljIGludGVyZmFjZSBGbG9hdFNvdXJjZSB7IEZsb2F0IGZsb2F0VmFsdWUoKTsgfQorICAgIHN0YXRpYyBpbnRlcmZhY2UgRG91YmxlU291cmNlIHsgRG91YmxlIGRvdWJsZVZhbHVlKCk7IH0KKyAgICBzdGF0aWMgaW50ZXJmYWNlIEJpZ0ludGVnZXJTb3VyY2UgeyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpOyB9CisgICAgc3RhdGljIGludGVyZmFjZSBCaWdEZWNpbWFsU291cmNlIHsgQmlnRGVjaW1hbCBiaWdEZWNpbWFsVmFsdWUoKTsgfQorICAgIAorICAgIC8qKgorICAgICAqIFN1cGVyY2xhc3Mgb2YgIk9yIi1lZCBudW1lcmljYWwgdHlwZXMuIFdpdGggYW4gZXhhbXBsZSwgYSB7QGNvZGUgaW50fSAxIGhhcyB0aGUgZmFsbGJhY2sgdHlwZSB7QGNvZGUgYnl0ZX0sIGFzCisgICAgICogdGhhdCdzIHRoZSBzbWFsbGVzdCB0eXBlIHRoYXQgY2FuIHN0b3JlIHRoZSB2YWx1ZSwgc28gaXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIHtAbGluayBJbnRlZ2VyT3JCeXRlfS4KKyAgICAgKiBUaGlzIGlzIHVzZWZ1bCBhcyBvdmVybG9hZGVkIG1ldGhvZCBzZWxlY3Rpb24gb25seSBleGFtaW5lcyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnRzLCBub3QgdGhlIHZhbHVlIG9mIHRoZW0sCisgICAgICogYnV0IHdpdGggIk9yIi1lZCB0eXBlcyB3ZSBjYW4gZW5jb2RlIHRoaXMgdmFsdWUtcmVsYXRlZCBpbmZvcm1hdGlvbiBpbnRvIHRoZSBhcmd1bWVudCB0eXBlLCBoZW5jZSBpbmZsdWVuY2luZyB0aGUKKyAgICAgKiBtZXRob2Qgc2VsZWN0aW9uLgorICAgICAqLworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlIGV4dGVuZHMgTnVtYmVyIGltcGxlbWVudHMgQ29tcGFyYWJsZSB7CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTnVtYmVyIGdldFNvdXJjZU51bWJlcigpOworCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlTnVtYmVyKCkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VOdW1iZXIoKS5sb25nVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBmbG9hdFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZU51bWJlcigpLmZsb2F0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlTnVtYmVyKCkuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlIGJ5dGVWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTb3VyY2VOdW1iZXIoKS5ieXRlVmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZU51bWJlcigpLnNob3J0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0U291cmNlTnVtYmVyKCkuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqICE9IG51bGwgJiYgdGhpcy5nZXRDbGFzcygpID09IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZU51bWJlcigpLmVxdWFscygoKE51bWJlcldpdGhGYWxsYmFja1R5cGUpIG9iaikuZ2V0U291cmNlTnVtYmVyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvdXJjZU51bWJlcigpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBoYXZlIHRvIGltcGxlbWVudCB0aGlzLCBzbyB0aGF0IGlmIGEgcG90ZW50aWFsIG1hdGNoaW5nIG1ldGhvZCBleHBlY3RzIGEgQ29tcGFyYWJsZSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQKKyAgICAgICAgLy8gYnkgYWxsIHRoZSBzdXBwb3J0ZWQgbnVtZXJpY2FsIHR5cGVzLCB0aGUgIk9yIiB0eXBlIHdpbGwgYmUgYSBtYXRjaC4gCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvKSB7CisgICAgICAgICAgICBOdW1iZXIgbiA9IGdldFNvdXJjZU51bWJlcigpOworICAgICAgICAgICAgaWYgKG4gaW5zdGFuY2VvZiBDb21wYXJhYmxlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoQ29tcGFyYWJsZSkgbikuY29tcGFyZVRvKG8pOyAKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihuLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpcyBub3QgQ29tcGFyYWJsZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBhIHtAbGluayBCaWdEZWNpbWFsfSB0aGF0IHN0b3JlcyBhIHdob2xlIG51bWJlci4gV2hlbiBzZWxlY3RpbmcgYSBvdmVybG9hZGVkIG1ldGhvZCwgRnJlZU1hcmtlciB0cmllcyB0bworICAgICAqIGFzc29jaWF0ZSB7QGxpbmsgQmlnRGVjaW1hbH0gdmFsdWVzIHRvIHBhcmFtZXRlcnMgb2YgdHlwZXMgdGhhdCBjYW4gaG9sZCBub24td2hvbGUgbnVtYmVycywgdW5sZXNzIHRoZQorICAgICAqIHtAbGluayBCaWdEZWNpbWFsfSBpcyB3cmFwcGVkIGludG8gdGhpcyBjbGFzcywgaW4gd2hpY2ggY2FzZSBpdCBkb2VzIHRoZSBvcHBvc2l0ZS4gVGhpcyBtZWNoYW5pc20gaXMsIGhvd2V2ZXIsCisgICAgICogdG9vIHJvdWdoIHRvIHByZXZlbnQgcm9sbCBvdmVycyBvciBtYWduaXR1ZGUgbG9zc2VzLiBUaG9zZSBhcmUgbm90IHlldCBoYW5kbGVkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICh0aGV5CisgICAgICogd2VyZSBzdXBwcmVzc2VkIGVhcmxpZXIgdG9vKS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgSW50ZWdlckJpZ0RlY2ltYWwgZXh0ZW5kcyBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJpZ0RlY2ltYWwgbjsKKyAgICAgICAgCisgICAgICAgIEludGVnZXJCaWdEZWNpbWFsKEJpZ0RlY2ltYWwgbikgeworICAgICAgICAgICAgdGhpcy5uID0gbjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBOdW1iZXIgZ2V0U291cmNlTnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXJWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuLnRvQmlnSW50ZWdlcigpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBMb25nT3JTbWFsbGVySW50ZWdlciBleHRlbmRzIE51bWJlcldpdGhGYWxsYmFja1R5cGUgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb25nIG47CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgTG9uZ09yU21hbGxlckludGVnZXIoTG9uZyBuKSB7CisgICAgICAgICAgICB0aGlzLm4gPSBuOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE51bWJlciBnZXRTb3VyY2VOdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuLmxvbmdWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgTG9uZ09yQnl0ZSBleHRlbmRzIExvbmdPclNtYWxsZXJJbnRlZ2VyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSB3OyAKKworICAgICAgICBMb25nT3JCeXRlKExvbmcgbiwgYnl0ZSB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgc3RhdGljIGNsYXNzIExvbmdPclNob3J0IGV4dGVuZHMgTG9uZ09yU21hbGxlckludGVnZXIgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCB3OyAKKworICAgICAgICBMb25nT3JTaG9ydChMb25nIG4sIHNob3J0IHcpIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBMb25nT3JJbnRlZ2VyIGV4dGVuZHMgTG9uZ09yU21hbGxlckludGVnZXIgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdzsgCisKKyAgICAgICAgTG9uZ09ySW50ZWdlcihMb25nIG4sIGludCB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBJbnRlZ2VyT3JTbWFsbGVySW50ZWdlciBleHRlbmRzIE51bWJlcldpdGhGYWxsYmFja1R5cGUgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIG47CisgICAgICAgIAorICAgICAgICBwcm90ZWN0ZWQgSW50ZWdlck9yU21hbGxlckludGVnZXIoSW50ZWdlciBuKSB7CisgICAgICAgICAgICB0aGlzLm4gPSBuOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE51bWJlciBnZXRTb3VyY2VOdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbi5pbnRWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgY2xhc3MgSW50ZWdlck9yQnl0ZSBleHRlbmRzIEludGVnZXJPclNtYWxsZXJJbnRlZ2VyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSB3OyAKKworICAgICAgICBJbnRlZ2VyT3JCeXRlKEludGVnZXIgbiwgYnl0ZSB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgc3RhdGljIGNsYXNzIEludGVnZXJPclNob3J0IGV4dGVuZHMgSW50ZWdlck9yU21hbGxlckludGVnZXIgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCB3OyAKKworICAgICAgICBJbnRlZ2VyT3JTaG9ydChJbnRlZ2VyIG4sIHNob3J0IHcpIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBjbGFzcyBTaG9ydE9yQnl0ZSBleHRlbmRzIE51bWJlcldpdGhGYWxsYmFja1R5cGUgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTaG9ydCBuOworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgdzsKKyAgICAgICAgCisgICAgICAgIHByb3RlY3RlZCBTaG9ydE9yQnl0ZShTaG9ydCBuLCBieXRlIHcpIHsKKyAgICAgICAgICAgIHRoaXMubiA9IG47CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE51bWJlciBnZXRTb3VyY2VOdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG4uc2hvcnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEb3VibGVPcldob2xlTnVtYmVyIGV4dGVuZHMgTnVtYmVyV2l0aEZhbGxiYWNrVHlwZSB7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIERvdWJsZSBuOyAKKworICAgICAgICBwcm90ZWN0ZWQgRG91YmxlT3JXaG9sZU51bWJlcihEb3VibGUgbikgeworICAgICAgICAgICAgdGhpcy5uID0gbjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBOdW1iZXIgZ2V0U291cmNlTnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbi5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG91YmxlT3JCeXRlIGV4dGVuZHMgRG91YmxlT3JXaG9sZU51bWJlciB7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgdzsKKworICAgICAgICBEb3VibGVPckJ5dGUoRG91YmxlIG4sIGJ5dGUgdykgeworICAgICAgICAgICAgc3VwZXIobik7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgYnl0ZSBieXRlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHNob3J0IHNob3J0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIERvdWJsZU9yU2hvcnQgZXh0ZW5kcyBEb3VibGVPcldob2xlTnVtYmVyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZmluYWwgc2hvcnQgdzsKKworICAgICAgICBEb3VibGVPclNob3J0KERvdWJsZSBuLCBzaG9ydCB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEb3VibGVPckludGVnZXJPckZsb2F0IGV4dGVuZHMgRG91YmxlT3JXaG9sZU51bWJlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdzsKKworICAgICAgICBEb3VibGVPckludGVnZXJPckZsb2F0KERvdWJsZSBuLCBpbnQgdykgeworICAgICAgICAgICAgc3VwZXIobik7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgaW50IGludFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBsb25nIGxvbmdWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRG91YmxlT3JJbnRlZ2VyIGV4dGVuZHMgRG91YmxlT3JXaG9sZU51bWJlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdzsKKworICAgICAgICBEb3VibGVPckludGVnZXIoRG91YmxlIG4sIGludCB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBEb3VibGVPckxvbmcgZXh0ZW5kcyBEb3VibGVPcldob2xlTnVtYmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgdzsKKworICAgICAgICBEb3VibGVPckxvbmcoRG91YmxlIG4sIGxvbmcgdykgeworICAgICAgICAgICAgc3VwZXIobik7CisgICAgICAgICAgICB0aGlzLncgPSB3OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIERvdWJsZU9yRmxvYXQgZXh0ZW5kcyBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZmluYWwgRG91YmxlIG47CisKKyAgICAgICAgRG91YmxlT3JGbG9hdChEb3VibGUgbikgeworICAgICAgICAgICAgdGhpcy5uID0gbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbi5mbG9hdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBkb3VibGUgZG91YmxlVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbi5kb3VibGVWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE51bWJlciBnZXRTb3VyY2VOdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmxvYXRPcldob2xlTnVtYmVyIGV4dGVuZHMgTnVtYmVyV2l0aEZhbGxiYWNrVHlwZSB7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIEZsb2F0IG47IAorCisgICAgICAgIEZsb2F0T3JXaG9sZU51bWJlcihGbG9hdCBuKSB7CisgICAgICAgICAgICB0aGlzLm4gPSBuOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIE51bWJlciBnZXRTb3VyY2VOdW1iZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGZsb2F0IGZsb2F0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbi5mbG9hdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGbG9hdE9yQnl0ZSBleHRlbmRzIEZsb2F0T3JXaG9sZU51bWJlciB7CisgICAgICAgIAorICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgdzsKKworICAgICAgICBGbG9hdE9yQnl0ZShGbG9hdCBuLCBieXRlIHcpIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGJ5dGUgYnl0ZVZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBGbG9hdE9yU2hvcnQgZXh0ZW5kcyBGbG9hdE9yV2hvbGVOdW1iZXIgeworICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCB3OworCisgICAgICAgIEZsb2F0T3JTaG9ydChGbG9hdCBuLCBzaG9ydCB3KSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgICAgIHRoaXMudyA9IHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBzaG9ydCBzaG9ydFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHc7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEZsb2F0T3JJbnRlZ2VyIGV4dGVuZHMgRmxvYXRPcldob2xlTnVtYmVyIHsKKyAgICAgICAgCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHc7CisKKyAgICAgICAgRmxvYXRPckludGVnZXIoRmxvYXQgbiwgaW50IHcpIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICAgICAgdGhpcy53ID0gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIGludCBpbnRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgbG9uZyBsb25nVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlck9yUHJpbWl0aXZlIGV4dGVuZHMgTnVtYmVyV2l0aEZhbGxiYWNrVHlwZSB7CisKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEJpZ0ludGVnZXIgbjsKKyAgICAgICAgCisgICAgICAgIEJpZ0ludGVnZXJPclByaW1pdGl2ZShCaWdJbnRlZ2VyIG4pIHsKKyAgICAgICAgICAgIHRoaXMubiA9IG47CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTnVtYmVyIGdldFNvdXJjZU51bWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlck9yQnl0ZSBleHRlbmRzIEJpZ0ludGVnZXJPclByaW1pdGl2ZSB7CisKKyAgICAgICAgQmlnSW50ZWdlck9yQnl0ZShCaWdJbnRlZ2VyIG4pIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgZmluYWwgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJPclNob3J0IGV4dGVuZHMgQmlnSW50ZWdlck9yUHJpbWl0aXZlIHsKKworICAgICAgICBCaWdJbnRlZ2VyT3JTaG9ydChCaWdJbnRlZ2VyIG4pIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgZmluYWwgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJPckludGVnZXIgZXh0ZW5kcyBCaWdJbnRlZ2VyT3JQcmltaXRpdmUgeworCisgICAgICAgIEJpZ0ludGVnZXJPckludGVnZXIoQmlnSW50ZWdlciBuKSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIAorICAgIGZpbmFsIHN0YXRpYyBjbGFzcyBCaWdJbnRlZ2VyT3JMb25nIGV4dGVuZHMgQmlnSW50ZWdlck9yUHJpbWl0aXZlIHsKKworICAgICAgICBCaWdJbnRlZ2VyT3JMb25nKEJpZ0ludGVnZXIgbikgeworICAgICAgICAgICAgc3VwZXIobik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCaWdJbnRlZ2VyT3JGUFByaW1pdGl2ZSBleHRlbmRzIEJpZ0ludGVnZXJPclByaW1pdGl2ZSB7CisKKyAgICAgICAgQmlnSW50ZWdlck9yRlBQcmltaXRpdmUoQmlnSW50ZWdlciBuKSB7CisgICAgICAgICAgICBzdXBlcihuKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBGYXN0ZXIgdmVyc2lvbiBvZiB7QGxpbmsgQmlnRGVjaW1hbCNmbG9hdFZhbHVlKCl9LCB1dGlsaXplcyB0aGF0IHRoZSBudW1iZXIga25vd24gdG8gZml0IGludG8gYSBsb25nLiAqLworICAgICAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuLmxvbmdWYWx1ZSgpOyAKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyoqIEZhc3RlciB2ZXJzaW9uIG9mIHtAbGluayBCaWdEZWNpbWFsI2RvdWJsZVZhbHVlKCl9LCB1dGlsaXplcyB0aGF0IHRoZSBudW1iZXIga25vd24gdG8gZml0IGludG8gYSBsb25nLiAqLworICAgICAgICBwdWJsaWMgZG91YmxlIGRvdWJsZVZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG4ubG9uZ1ZhbHVlKCk7IAorICAgICAgICB9CisKKyAgICB9CisgICAgCisgICAgZmluYWwgc3RhdGljIGNsYXNzIEJpZ0ludGVnZXJPckZsb2F0IGV4dGVuZHMgQmlnSW50ZWdlck9yRlBQcmltaXRpdmUgeworCisgICAgICAgIEJpZ0ludGVnZXJPckZsb2F0KEJpZ0ludGVnZXIgbikgeworICAgICAgICAgICAgc3VwZXIobik7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKKyAgICBmaW5hbCBzdGF0aWMgY2xhc3MgQmlnSW50ZWdlck9yRG91YmxlIGV4dGVuZHMgQmlnSW50ZWdlck9yRlBQcmltaXRpdmUgeworCisgICAgICAgIEJpZ0ludGVnZXJPckRvdWJsZShCaWdJbnRlZ2VyIG4pIHsKKyAgICAgICAgICAgIHN1cGVyKG4pOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbm9uLW5lZ2F0aXZlIG51bWJlciB0aGF0IGluZGljYXRlcyBob3cgbXVjaCB3ZSB3YW50IHRvIGF2b2lkIGEgZ2l2ZW4gbnVtZXJpY2FsIHR5cGUgY29udmVyc2lvbi4gU2luY2UKKyAgICAgKiB3ZSBvbmx5IGNvbnNpZGVyIHRoZSB0eXBlcyBoZXJlLCBub3QgdGhlIGFjdHVhbCB2YWx1ZSwgd2UgYWx3YXlzIGNvbnNpZGVyIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLiBMaWtlIGl0IHdpbGwKKyAgICAgKiBzYXkgdGhhdCBjb252ZXJ0aW5nIGludCB0byBzaG9ydCBpcyBub3QgYWxsb3dlZCwgYWx0aG91Z2ggaW50IDEgY2FuIGJlIGNvbnZlcnRlZCB0byBieXRlIHdpdGhvdXQgbG9zcy4gVG8gYWNjb3VudAorICAgICAqIGZvciBzdWNoIHNpdHVhdGlvbnMsICJPciItZWQgdHlwZXMsIGxpa2Uge0BsaW5rIEludGVnZXJPckJ5dGV9IGhhcyB0byBiZSB1c2VkLiAKKyAgICAgKiAKKyAgICAgKiBAcGFyYW0gZnJvbUMgdGhlIG5vbi1wcmltaXRpdmUgdHlwZSBvZiB0aGUgYXJndW1lbnQgKHdpdGggb3RoZXIgd29yZHMsIHRoZSBhY3R1YWwgdHlwZSkuCisgICAgICogICAgICAgIE11c3QgYmUge0BsaW5rIE51bWJlcn0gb3IgaXRzIHN1YmNsYXNzLiBUaGlzIGlzIHBvc3NpYmx5IGFuIHtAbGluayBOdW1iZXJXaXRoRmFsbGJhY2tUeXBlfSBzdWJjbGFzcy4KKyAgICAgKiBAcGFyYW0gdG9DIHRoZSA8ZW0+bm9uLXByaW1pdGl2ZTwvZW0+IHR5cGUgb2YgdGhlIHRhcmdldCBwYXJhbWV0ZXIgKHdpdGggb3RoZXIgd29yZHMsIHRoZSBmb3JtYXQgdHlwZSkuCisgICAgICogICAgICAgIE11c3QgYmUgYSB7QGxpbmsgTnVtYmVyfSBzdWJjbGFzcywgbm90IHtAbGluayBOdW1iZXJ9IGl0c2VsZi4KKyAgICAgKiAgICAgICAgTXVzdCA8ZW0+bm90PC9lbT4gYmUge0BsaW5rIE51bWJlcldpdGhGYWxsYmFja1R5cGV9IG9yIGl0cyBzdWJjbGFzcy4KKyAgICAgKiAKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIDxwPlRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAqICAgICA8dWw+CisgICAgICogICAgICAgPGxpPjA6IE5vIGNvbnZlcnNpb24gaXMgbmVlZGVkCisgICAgICogICAgICAgPGxpPlswLCAzMDAwMCk6IExvc3NsZXNzIGNvbnZlcnNpb24KKyAgICAgKiAgICAgICA8bGk+WzMwMDAwLCA0MDAwMCk6IFNtYWxsZXIgcHJlY2lzaW9uIGxvc3MgaW4gbWFudGlzc2EgaXMgcG9zc2libGUuCisgICAgICogICAgICAgPGxpPls0MDAwMCwgNTAwMDApOiBCaWdnZXIgcHJlY2lzaW9uIGxvc3MgaW4gbWFudGlzc2EgaXMgcG9zc2libGUuCisgICAgICogICAgICAgPGxpPntAbGluayBJbnRlZ2VyI01BWF9WQUxVRX06IENvbnZlcnNpb24gbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBtYWduaXR1ZGUgbG9zcyBvciBvdmVyZmxvdzwvbGk+CisgICAgICogICAgIDwvdWw+CisgICAgICogCisgICAgICogICAgIDxwPkF0IHNvbWUgcGxhY2VzLCB3ZSBvbmx5IGNhcmUgaWYgdGhlIGNvbnZlcnNpb24gaXMgcG9zc2libGUsIGkuZS4sIHdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBpcworICAgICAqICAgICB7QGxpbmsgSW50ZWdlciNNQVhfVkFMVUV9IG9yIG5vdC4gQnV0IHdoZW4gbXVsdGlwbGUgb3ZlcmxvYWRlZCBtZXRob2RzIGhhdmUgYW4gYXJndW1lbnQgdHlwZSB0byB3aGljaCB3ZQorICAgICAqICAgICBjb3VsZCBjb252ZXJ0IHRvLCB0aGlzIG51bWJlciB3aWxsIGluZmx1ZW5jZSB3aGljaCBvZiB0aG9zZSB3aWxsIGJlIGNob3Nlbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKENsYXNzIGZyb21DLCBDbGFzcyB0b0MpIHsKKyAgICAgICAgLy8gRE8gTk9UIEVESVQsIGdlbmVyYXRlZCBjb2RlIQorICAgICAgICAvLyBTZWU6IHNyY1xtYWluXG1pc2Ncb3ZlcmxvYWRlZE51bWJlclJ1bGVzXFJFQURNRS50eHQKKyAgICAgICAgaWYgKHRvQyA9PSBmcm9tQykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAodG9DID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChmcm9tQyA9PSBJbnRlZ2VyQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDMxMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDQxMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZy5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQnl0ZS5jbGFzcykgcmV0dXJuIDEwMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09ySW50ZWdlci5jbGFzcykgcmV0dXJuIDIxMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JGbG9hdC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDIyMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjIwMDM7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckxvbmcuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJPckJ5dGUuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JCeXRlLmNsYXNzKSByZXR1cm4gMjIwMDM7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JCeXRlLmNsYXNzKSByZXR1cm4gMjEwMDM7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBTaG9ydC5jbGFzcykgcmV0dXJuIDEwMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yU2hvcnQuY2xhc3MpIHJldHVybiAyMTAwMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0T3JCeXRlLmNsYXNzKSByZXR1cm4gMTAwMDM7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDIxMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPckJ5dGUuY2xhc3MpIHJldHVybiAyMTAwMzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JTaG9ydC5jbGFzcykgcmV0dXJuIDIxMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDE2MDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yTG9uZy5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDE2MDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JTaG9ydC5jbGFzcykgcmV0dXJuIDIyMDAzOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAxNjAwMzsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSBMb25nLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoZnJvbUMgPT0gSW50ZWdlci5jbGFzcykgcmV0dXJuIDEwMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlckJpZ0RlY2ltYWwuY2xhc3MpIHJldHVybiAzMTAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0RlY2ltYWwuY2xhc3MpIHJldHVybiA0MTAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZS5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJ5dGUuY2xhc3MpIHJldHVybiAxMDAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckludGVnZXIuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JGbG9hdC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDIxMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjEwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckxvbmcuY2xhc3MpIHJldHVybiAyMTAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJPckJ5dGUuY2xhc3MpIHJldHVybiAxMDAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yQnl0ZS5jbGFzcykgcmV0dXJuIDIxMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yQnl0ZS5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBTaG9ydC5jbGFzcykgcmV0dXJuIDEwMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yU2hvcnQuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gU2hvcnRPckJ5dGUuY2xhc3MpIHJldHVybiAxMDAwNDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjEwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9yQnl0ZS5jbGFzcykgcmV0dXJuIDIxMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPclNob3J0LmNsYXNzKSByZXR1cm4gMjEwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMTUwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JMb25nLmNsYXNzKSByZXR1cm4gMTUwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMTUwMDQ7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyT3JTaG9ydC5jbGFzcykgcmV0dXJuIDEwMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JTaG9ydC5jbGFzcykgcmV0dXJuIDIxMDA0OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAxNTAwNDsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSBEb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChmcm9tQyA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjAwMDc7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDMyMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDMyMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZy5jbGFzcykgcmV0dXJuIDMwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXQuY2xhc3MpIHJldHVybiAxMDAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJ5dGUuY2xhc3MpIHJldHVybiAyMDAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckludGVnZXIuY2xhc3MpIHJldHVybiAyMTAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yRmxvYXQuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXIuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JMb25nLmNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJPckJ5dGUuY2xhc3MpIHJldHVybiAyMDAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yQnl0ZS5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JCeXRlLmNsYXNzKSByZXR1cm4gMjEwMDc7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBTaG9ydC5jbGFzcykgcmV0dXJuIDIwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yU2hvcnQuY2xhc3MpIHJldHVybiAyMTAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0T3JCeXRlLmNsYXNzKSByZXR1cm4gMjAwMDc7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDEwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPckJ5dGUuY2xhc3MpIHJldHVybiAxMDAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JTaG9ydC5jbGFzcykgcmV0dXJuIDEwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDIwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yTG9uZy5jbGFzcykgcmV0dXJuIDMwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzKSByZXR1cm4gMjAwMDc7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDIwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDIwMDA3OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAyMDAwNzsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yU2hvcnQuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAyMDAwNzsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSBGbG9hdC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGZyb21DID09IEludGVnZXIuY2xhc3MpIHJldHVybiAzMDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gMzMwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gMzMwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nLmNsYXNzKSByZXR1cm4gNDAwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGUuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJ5dGUuY2xhc3MpIHJldHVybiAyMDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckludGVnZXIuY2xhc3MpIHJldHVybiAzMDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yRmxvYXQuY2xhc3MpIHJldHVybiAzMDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9ySW50ZWdlck9yRmxvYXQuY2xhc3MpIHJldHVybiAyMzAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDMwMDA2OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JMb25nLmNsYXNzKSByZXR1cm4gNDAwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMjQwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckJ5dGUuY2xhc3MpIHJldHVybiAyMzAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckJ5dGUuY2xhc3MpIHJldHVybiAyNDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0LmNsYXNzKSByZXR1cm4gMjAwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JTaG9ydC5jbGFzcykgcmV0dXJuIDI0MDA2OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gU2hvcnRPckJ5dGUuY2xhc3MpIHJldHVybiAyMDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JCeXRlLmNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JTaG9ydC5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMzAwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JMb25nLmNsYXNzKSByZXR1cm4gNDAwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MpIHJldHVybiA0MDAwNjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gMjQwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMjQwMDY7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyT3JTaG9ydC5jbGFzcykgcmV0dXJuIDI0MDA2OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JTaG9ydC5jbGFzcykgcmV0dXJuIDIzMDA2OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAyNDAwNjsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSBCeXRlLmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoZnJvbUMgPT0gSW50ZWdlci5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlckJpZ0RlY2ltYWwuY2xhc3MpIHJldHVybiAzNTAwMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0RlY2ltYWwuY2xhc3MpIHJldHVybiA0NTAwMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmcuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZS5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yRmxvYXQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9ySW50ZWdlck9yRmxvYXQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9ySW50ZWdlci5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JMb25nLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMjIwMDE7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckJ5dGUuY2xhc3MpIHJldHVybiAyNTAwMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IExvbmdPckJ5dGUuY2xhc3MpIHJldHVybiAyMzAwMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JTaG9ydC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gU2hvcnRPckJ5dGUuY2xhc3MpIHJldHVybiAyMTAwMTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9yQnl0ZS5jbGFzcykgcmV0dXJuIDIzMDAxOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPclNob3J0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JMb25nLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMTgwMDE7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyT3JTaG9ydC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JTaG9ydC5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSBTaG9ydC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGZyb21DID09IEludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gMzQwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gNDQwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGUuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMTAwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yTG9uZy5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDIxMDAyOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JCeXRlLmNsYXNzKSByZXR1cm4gMjQwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JCeXRlLmNsYXNzKSByZXR1cm4gMjIwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JTaG9ydC5jbGFzcykgcmV0dXJuIDIyMDAyOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gU2hvcnRPckJ5dGUuY2xhc3MpIHJldHVybiAwOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPckludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JCeXRlLmNsYXNzKSByZXR1cm4gMjIwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9yU2hvcnQuY2xhc3MpIHJldHVybiAyMjAwMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckludGVnZXIuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckxvbmcuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckRvdWJsZS5jbGFzcykgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yRmxvYXQuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckJ5dGUuY2xhc3MpIHJldHVybiAxNzAwMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJPclNob3J0LmNsYXNzKSByZXR1cm4gMjEwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPclNob3J0LmNsYXNzKSByZXR1cm4gMjQwMDI7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JTaG9ydC5jbGFzcykgcmV0dXJuIDE3MDAyOworICAgICAgICAgICAgZWxzZSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIH0gZWxzZSBpZiAodG9DID09IEJpZ0RlY2ltYWwuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChmcm9tQyA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBJbnRlZ2VyQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGUuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0LmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMTAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckZsb2F0LmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXIuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yTG9uZy5jbGFzcykgcmV0dXJuIDIwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDIwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JCeXRlLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JCeXRlLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBTaG9ydC5jbGFzcykgcmV0dXJuIDIwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yU2hvcnQuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0T3JCeXRlLmNsYXNzKSByZXR1cm4gMjAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDIwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPckJ5dGUuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JTaG9ydC5jbGFzcykgcmV0dXJuIDIwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDEwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yTG9uZy5jbGFzcykgcmV0dXJuIDEwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzKSByZXR1cm4gMTAwMDg7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDEwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDEwMDA4OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yU2hvcnQuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yU2hvcnQuY2xhc3MpIHJldHVybiAyMDAwODsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPclNob3J0LmNsYXNzKSByZXR1cm4gMTAwMDg7CisgICAgICAgICAgICBlbHNlIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIGlmICh0b0MgPT0gQmlnSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgaWYgKGZyb21DID09IEludGVnZXIuY2xhc3MpIHJldHVybiAxMDAwNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gNDAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGUuY2xhc3MpIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckZsb2F0LmNsYXNzKSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXJPckZsb2F0LmNsYXNzKSByZXR1cm4gMjEwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPckludGVnZXIuY2xhc3MpIHJldHVybiAyMTAwNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IERvdWJsZU9yTG9uZy5jbGFzcykgcmV0dXJuIDIxMDA1OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gSW50ZWdlck9yQnl0ZS5jbGFzcykgcmV0dXJuIDEwMDA1OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRG91YmxlT3JCeXRlLmNsYXNzKSByZXR1cm4gMjEwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBMb25nT3JCeXRlLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBTaG9ydC5jbGFzcykgcmV0dXJuIDEwMDA1OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gTG9uZ09yU2hvcnQuY2xhc3MpIHJldHVybiAxMDAwNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IFNob3J0T3JCeXRlLmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBGbG9hdE9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDI1MDA1OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gRmxvYXRPckJ5dGUuY2xhc3MpIHJldHVybiAyNTAwNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEZsb2F0T3JTaG9ydC5jbGFzcykgcmV0dXJuIDI1MDA1OworICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUMgPT0gQmlnSW50ZWdlck9ySW50ZWdlci5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JMb25nLmNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEJpZ0ludGVnZXJPckRvdWJsZS5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JGbG9hdC5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JCeXRlLmNsYXNzKSByZXR1cm4gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyb21DID09IEludGVnZXJPclNob3J0LmNsYXNzKSByZXR1cm4gMTAwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBEb3VibGVPclNob3J0LmNsYXNzKSByZXR1cm4gMjEwMDU7CisgICAgICAgICAgICBlbHNlIGlmIChmcm9tQyA9PSBCaWdJbnRlZ2VyT3JTaG9ydC5jbGFzcykgcmV0dXJuIDA7CisgICAgICAgICAgICBlbHNlIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFVua25vd24gdG9DOyB3ZSBkb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IHRvIGl0OgorICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICB9ICAgICAgICAKKyAgICB9CisKKyAgICBzdGF0aWMgaW50IGNvbXBhcmVOdW1iZXJUeXBlU3BlY2lmaWNpdHkoQ2xhc3MgYzEsIENsYXNzIGMyKSB7CisgICAgICAgIC8vIERPIE5PVCBFRElULCBnZW5lcmF0ZWQgY29kZSEKKyAgICAgICAgLy8gU2VlOiBzcmNcbWFpblxtaXNjXG92ZXJsb2FkZWROdW1iZXJSdWxlc1xSRUFETUUudHh0CisgICAgICAgIGMxID0gQ2xhc3NVdGlsLnByaW1pdGl2ZUNsYXNzVG9Cb3hpbmdDbGFzcyhjMSk7CisgICAgICAgIGMyID0gQ2xhc3NVdGlsLnByaW1pdGl2ZUNsYXNzVG9Cb3hpbmdDbGFzcyhjMik7CisgICAgICAgIAorICAgICAgICBpZiAoYzEgPT0gYzIpIHJldHVybiAwOworICAgICAgICAKKyAgICAgICAgaWYgKGMxID09IEludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjMiA9PSBMb25nLmNsYXNzKSByZXR1cm4gNCAtIDM7CisgICAgICAgICAgICBpZiAoYzIgPT0gRG91YmxlLmNsYXNzKSByZXR1cm4gNyAtIDM7CisgICAgICAgICAgICBpZiAoYzIgPT0gRmxvYXQuY2xhc3MpIHJldHVybiA2IC0gMzsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMSAtIDM7CisgICAgICAgICAgICBpZiAoYzIgPT0gU2hvcnQuY2xhc3MpIHJldHVybiAyIC0gMzsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDM7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSAzOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IExvbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjMiA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMyAtIDQ7CisgICAgICAgICAgICBpZiAoYzIgPT0gRG91YmxlLmNsYXNzKSByZXR1cm4gNyAtIDQ7CisgICAgICAgICAgICBpZiAoYzIgPT0gRmxvYXQuY2xhc3MpIHJldHVybiA2IC0gNDsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMSAtIDQ7CisgICAgICAgICAgICBpZiAoYzIgPT0gU2hvcnQuY2xhc3MpIHJldHVybiAyIC0gNDsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDQ7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSA0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgaWYgKGMyID09IEludGVnZXIuY2xhc3MpIHJldHVybiAzIC0gNzsKKyAgICAgICAgICAgIGlmIChjMiA9PSBMb25nLmNsYXNzKSByZXR1cm4gNCAtIDc7CisgICAgICAgICAgICBpZiAoYzIgPT0gRmxvYXQuY2xhc3MpIHJldHVybiA2IC0gNzsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMSAtIDc7CisgICAgICAgICAgICBpZiAoYzIgPT0gU2hvcnQuY2xhc3MpIHJldHVybiAyIC0gNzsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDc7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSA3OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IEZsb2F0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoYzIgPT0gSW50ZWdlci5jbGFzcykgcmV0dXJuIDMgLSA2OworICAgICAgICAgICAgaWYgKGMyID09IExvbmcuY2xhc3MpIHJldHVybiA0IC0gNjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBEb3VibGUuY2xhc3MpIHJldHVybiA3IC0gNjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCeXRlLmNsYXNzKSByZXR1cm4gMSAtIDY7CisgICAgICAgICAgICBpZiAoYzIgPT0gU2hvcnQuY2xhc3MpIHJldHVybiAyIC0gNjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDY7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSA2OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IEJ5dGUuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjMiA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMyAtIDE7CisgICAgICAgICAgICBpZiAoYzIgPT0gTG9uZy5jbGFzcykgcmV0dXJuIDQgLSAxOworICAgICAgICAgICAgaWYgKGMyID09IERvdWJsZS5jbGFzcykgcmV0dXJuIDcgLSAxOworICAgICAgICAgICAgaWYgKGMyID09IEZsb2F0LmNsYXNzKSByZXR1cm4gNiAtIDE7CisgICAgICAgICAgICBpZiAoYzIgPT0gU2hvcnQuY2xhc3MpIHJldHVybiAyIC0gMTsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDE7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSAxOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IFNob3J0LmNsYXNzKSB7CisgICAgICAgICAgICBpZiAoYzIgPT0gSW50ZWdlci5jbGFzcykgcmV0dXJuIDMgLSAyOworICAgICAgICAgICAgaWYgKGMyID09IExvbmcuY2xhc3MpIHJldHVybiA0IC0gMjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBEb3VibGUuY2xhc3MpIHJldHVybiA3IC0gMjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBGbG9hdC5jbGFzcykgcmV0dXJuIDYgLSAyOworICAgICAgICAgICAgaWYgKGMyID09IEJ5dGUuY2xhc3MpIHJldHVybiAxIC0gMjsKKyAgICAgICAgICAgIGlmIChjMiA9PSBCaWdEZWNpbWFsLmNsYXNzKSByZXR1cm4gOCAtIDI7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSAyOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IEJpZ0RlY2ltYWwuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjMiA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMyAtIDg7CisgICAgICAgICAgICBpZiAoYzIgPT0gTG9uZy5jbGFzcykgcmV0dXJuIDQgLSA4OworICAgICAgICAgICAgaWYgKGMyID09IERvdWJsZS5jbGFzcykgcmV0dXJuIDcgLSA4OworICAgICAgICAgICAgaWYgKGMyID09IEZsb2F0LmNsYXNzKSByZXR1cm4gNiAtIDg7CisgICAgICAgICAgICBpZiAoYzIgPT0gQnl0ZS5jbGFzcykgcmV0dXJuIDEgLSA4OworICAgICAgICAgICAgaWYgKGMyID09IFNob3J0LmNsYXNzKSByZXR1cm4gMiAtIDg7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnSW50ZWdlci5jbGFzcykgcmV0dXJuIDUgLSA4OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMxID09IEJpZ0ludGVnZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChjMiA9PSBJbnRlZ2VyLmNsYXNzKSByZXR1cm4gMyAtIDU7CisgICAgICAgICAgICBpZiAoYzIgPT0gTG9uZy5jbGFzcykgcmV0dXJuIDQgLSA1OworICAgICAgICAgICAgaWYgKGMyID09IERvdWJsZS5jbGFzcykgcmV0dXJuIDcgLSA1OworICAgICAgICAgICAgaWYgKGMyID09IEZsb2F0LmNsYXNzKSByZXR1cm4gNiAtIDU7CisgICAgICAgICAgICBpZiAoYzIgPT0gQnl0ZS5jbGFzcykgcmV0dXJuIDEgLSA1OworICAgICAgICAgICAgaWYgKGMyID09IFNob3J0LmNsYXNzKSByZXR1cm4gMiAtIDU7CisgICAgICAgICAgICBpZiAoYzIgPT0gQmlnRGVjaW1hbC5jbGFzcykgcmV0dXJuIDggLSA1OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRWYXJBcmdzTWV0aG9kcy5qYXZhIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9PdmVybG9hZGVkVmFyQXJnc01ldGhvZHMuamF2YQppbmRleCAzYjQ5YTVkLi5jZTU2NmJiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRWYXJBcmdzTWV0aG9kcy5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZFZhckFyZ3NNZXRob2RzLmphdmEKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIDAsIHBhY2tlZEFyZ3MsIDAsIGZpeEFyZ0NvdW50KTsKICAgICAgICAgICAgICAgICBPYmplY3QgdmFyYXJncyA9IEFycmF5Lm5ld0luc3RhbmNlKHZhckFyZ3NDb21wVHlwZSwgdG90YWxBcmdDb3VudCAtIGZpeEFyZ0NvdW50KTsKICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSBmaXhBcmdDb3VudDsgaSA8IHRvdGFsQXJnQ291bnQ7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gdy51bndyYXBJbnRlcm5hbCgoVGVtcGxhdGVNb2RlbCltb2RlbEFyZ3MuZ2V0KGkpLCB2YXJBcmdzQ29tcFR5cGUpOworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gdy50cnlVbndyYXAoKFRlbXBsYXRlTW9kZWwpbW9kZWxBcmdzLmdldChpKSwgdmFyQXJnc0NvbXBUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgaWYodmFsID09IEJlYW5zV3JhcHBlci5DQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBwYWNrZWRBcmdzOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHcudW53cmFwSW50ZXJuYWwoKFRlbXBsYXRlTW9kZWwpbW9kZWxBcmdzLmdldChmaXhBcmdDb3VudCksIHZhckFyZ3NDb21wVHlwZSk7CisgICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IHcudHJ5VW53cmFwKChUZW1wbGF0ZU1vZGVsKW1vZGVsQXJncy5nZXQoZml4QXJnQ291bnQpLCB2YXJBcmdzQ29tcFR5cGUpOwogICAgICAgICAgICAgICAgIGlmKHZhbCA9PSBCZWFuc1dyYXBwZXIuQ0FOX05PVF9VTldSQVApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQyLDczICsxNDIsNzkgQEAKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGFyZ1BhY2tlciA9IGNhbm9uaWNhbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICBhcmdQYWNrZXJzLnB1dChtZW1iZXJEZXNjLm1lbWJlciwgYXJnUGFja2VyKTsKKyAgICAgICAgfQogICAgICAgICAKICAgICAgICAgcmV0dXJuIHByZXByb2Nlc3NlZFBhcmFtVHlwZXM7CiAgICAgfQogCi0gICAgdm9pZCBhZnRlcldpZGVuaW5nVW53cmFwcGluZ0hpbnRzKENsYXNzW10gcGFyYW1UeXBlcykgewotICAgICAgICBmaW5hbCBpbnQgcGFyYW1Db3VudCA9IHBhcmFtVHlwZXMubGVuZ3RoOwotICAgICAgICBmaW5hbCBDbGFzc1tdW10gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50ID0gZ2V0VW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50KCk7Ci0gICAgICAgIGZpbmFsIENsYXNzW10gaGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbcGFyYW1Db3VudF07Ci0KKyAgICB2b2lkIGFmdGVyV2lkZW5pbmdVbndyYXBwaW5nSGludHMoQ2xhc3NbXSBwYXJhbVR5cGVzLCBpbnRbXSBwYXJhbU51bWVyaWNhbFR5cGVzKSB7CiAgICAgICAgIC8vIE92ZXJ2aWV3CiAgICAgICAgIC8vIC0tLS0tLS0tCiAgICAgICAgIC8vCiAgICAgICAgIC8vIFNvIGZhciwgbSh0MSwgdDIuLi4pIHdhcyB0cmVhdGVkIGJ5IHRoZSBoaW50IHdpZGVuaW5nIGxpa2UgbSh0MSwgdDIpLiBTbyBub3cgd2UgaGF2ZSB0byBjb250aW51ZSBoaW50CiAgICAgICAgIC8vIHdpZGVuaW5nIGxpa2UgaWYgd2UgaGFkIGZ1cnRoZXIgbWV0aG9kczoKLSAgICAgICAgLy8gLSBtKHQxKSwgYmVjYXVzZSBhIHZhcmFyZyBhcnJheSBjYW4gYmUgMCBsb25nCi0gICAgICAgIC8vIC0gbSh0MSwgdDIpLCBtKHQxLCB0MiwgdDIpLCAsIG0odDEsIHQyLCB0MiwgdDIpLCAuLi4KKyAgICAgICAgLy8gLSBtKHQxLCB0MiwgdDIpLCBtKHQxLCB0MiwgdDIsIHQyKSwgLi4uCisgICAgICAgIC8vIC0gbSh0MSksIGJlY2F1c2UgYSB2YXJhcmdzIGFycmF5IGNhbiBiZSAwIGxvbmcKICAgICAgICAgLy8KICAgICAgICAgLy8gQnV0IHdlIGNhbid0IGRvIHRoYXQgZm9yIHJlYWwsIGJlY2F1c2Ugd2UgaGFkIHRvIGFkZCBpbmZpbml0ZSBudW1iZXIgb2YgbWV0aG9kcy4gQWxzbywgZm9yIGVmZmljaWVuY3kgd2UKICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0byBjcmVhdGUgdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50IGVudHJpZXMgYXQgdGhlIGluZGljZXMgd2hpY2ggYXJlIHN0aWxsIHVudXNlZC4KICAgICAgICAgLy8gU28gd2Ugb25seSB1cGRhdGUgdGhlIGFscmVhZHkgZXhpc3RpbmcgaGludHMuIFJlbWVtYmVyIHRoYXQgd2UgYWxyZWFkeSBoYXZlIG0odDEsIHQyKSB0aGVyZS4KICAgICAgICAgCi0gICAgICAgIC8vIFRoZSBjYXNlIG9mIG0odDEsIHQyKSwgbSh0MSwgdDIsIHQyKSwgLCBtKHQxLCB0MiwgdDIsIHQyKSwgLi4uLCB3aGVyZSBtIGlzIGFuICplYXJsaWVyKiBhZGRlZCBtZXRob2QuCisgICAgICAgIGZpbmFsIGludCBwYXJhbUNvdW50ID0gcGFyYW1UeXBlcy5sZW5ndGg7CisgICAgICAgIGZpbmFsIENsYXNzW11bXSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQgPSBnZXRVbndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSBjYXNlIG9mIGUodDEsIHQyKSwgZSh0MSwgdDIsIHQyKSwgZSh0MSwgdDIsIHQyLCB0MiksIC4uLiwgd2hlcmUgZSBpcyBhbiAqZWFybGllciogYWRkZWQgbWV0aG9kLgogICAgICAgICAvLyBXaGVuIHRoYXQgd2FzIGFkZGVkLCB0aGlzIG1ldGhvZCB3YXNuJ3QgYWRkZWQgeWV0LCBzbyBpdCBoYWQgbm8gY2hhbmNlIHVwZGF0aW5nIHRoZSBoaW50cyBvZiB0aGlzIG1ldGhvZCwKICAgICAgICAgLy8gc28gd2UgZG8gdGhhdCBub3c6CiAgICAgICAgIC8vIEZJWE1FOiBPbmx5IG5lZWRlZCBpZiBtKHQxLCB0Mikgd2FzIGZpbGxlZCBhbiBlbXB0eSBzbG90LCBvdGhlcndpc2Ugd2hhdGV2ZXIgd2FzIHRoZXJlIHdhcyBhbHJlYWR5CiAgICAgICAgIC8vIHdpZGVuZWQgYnkgdGhlIHByZWNlZGluZyBoaW50cywgc28gdGhpcyB3aWxsIGJlIGEgbm8tb3AuCiAgICAgICAgIGZvcihpbnQgaSA9IHBhcmFtQ291bnQgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgQ2xhc3NbXSBwcmV2aW91c0hpbnRzID0gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W2ldOworICAgICAgICAgICAgZmluYWwgQ2xhc3NbXSBwcmV2aW91c0hpbnRzID0gdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50W2ldOwogICAgICAgICAgICAgaWYocHJldmlvdXNIaW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2lkZW5Ub0NvbW1vblN1cGVydHlwZXNGb3JVbndyYXBwaW5nSGludChoaW50cywgcHJldmlvdXNIaW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgd2lkZW5IaW50c1RvQ29tbW9uU3VwZXJ0eXBlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0hpbnRzLCBnZXRQb3NzaWJsZU51bWVyaWNhbFR5cGVzKGkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsgIC8vIHdlIG9ubHkgZG8gdGhpcyBmb3IgdGhlIGZpcnN0IGhpdCwgYXMgdGhlIG1ldGhvZHMgYmVmb3JlIHRoYXQgaGFzIGFscmVhZHkgd2lkZW5lZCBpdC4KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAvLyBUaGUgY2FzZSBvZiBtKHQxKSwgd2hlcmUgbSBpcyBhbiAqZWFybGllciogYWRkZWQgbWV0aG9kLgorICAgICAgICAvLyBUaGUgY2FzZSBvZiBlKHQxKSwgd2hlcmUgZSBpcyBhbiAqZWFybGllciogYWRkZWQgbWV0aG9kLgogICAgICAgICAvLyBXaGVuIHRoYXQgd2FzIGFkZGVkLCB0aGlzIG1ldGhvZCB3YXNuJ3QgYWRkZWQgeWV0LCBzbyBpdCBoYWQgbm8gY2hhbmNlIHVwZGF0aW5nIHRoZSBoaW50cyBvZiB0aGlzIG1ldGhvZCwKICAgICAgICAgLy8gc28gd2UgZG8gdGhhdCBub3c6CiAgICAgICAgIC8vIEZJWE1FOiBTYW1lIGFzIGFib3ZlOyBpdCdzIG9mdGVuIHVubmVjZXNzYXJ5LgogICAgICAgICBpZihwYXJhbUNvdW50ICsgMSA8IHVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudC5sZW5ndGgpIHsKICAgICAgICAgICAgIENsYXNzW10gb25lTG9uZ2VySGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbcGFyYW1Db3VudCArIDFdOwogICAgICAgICAgICAgaWYob25lTG9uZ2VySGludHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdpZGVuVG9Db21tb25TdXBlcnR5cGVzRm9yVW53cmFwcGluZ0hpbnQoaGludHMsIG9uZUxvbmdlckhpbnRzKTsKKyAgICAgICAgICAgICAgICB3aWRlbkhpbnRzVG9Db21tb25TdXBlcnR5cGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uZUxvbmdlckhpbnRzLCBnZXRQb3NzaWJsZU51bWVyaWNhbFR5cGVzKHBhcmFtQ291bnQgKyAxKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIC8vIFRoZSBjYXNlIG9mIG0odDEsIHQyKSwgbSh0MSwgdDIsIHQyKSwgLCBtKHQxLCB0MiwgdDIsIHQyKSwgLi4uLCB3aGVyZSBtIGlzIHRoZSBjdXJyZW50bHkgYWRkZWQgbWV0aG9kLgorICAgICAgICAvLyBUaGUgY2FzZSBvZiBtKHQxLCB0MiwgdDIpLCBtKHQxLCB0MiwgdDIsIHQyKSwgLi4uLCB3aGVyZSBtIGlzIHRoZSBjdXJyZW50bHkgYWRkZWQgbWV0aG9kLgogICAgICAgICAvLyBVcGRhdGUgdGhlIGxvbmdlciBoaW50cy1hcnJheXM6ICAKLSAgICAgICAgLy8gRklYTUUgU2hvdWxkbid0IHRoZXNlIHVzZSB0aGUgb3JpZ2luYWwgaGludCBhcnJheSBpbnN0ZWFkIG9mIHRoZSB3aWRlbmVkIG9uZT8KLSAgICAgICAgZm9yKGludCBpID0gcGFyYW1Db3VudCArIDE7IGkgPCB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQubGVuZ3RoOyArK2kpIHsKLSAgICAgICAgICAgIENsYXNzW10gbG9uZ2VySGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbaV07Ci0gICAgICAgICAgICBpZihsb25nZXJIaW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2lkZW5Ub0NvbW1vblN1cGVydHlwZXNGb3JVbndyYXBwaW5nSGludChsb25nZXJIaW50cywgcGFyYW1UeXBlcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvcihpbnQgaSA9IHBhcmFtQ291bnQgKyAxOyBpIDwgdW53cmFwcGluZ0hpbnRzQnlQYXJhbUNvdW50Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB3aWRlbkhpbnRzVG9Db21tb25TdXBlcnR5cGVzKAorICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGVzLCBwYXJhbU51bWVyaWNhbFR5cGVzKTsKICAgICAgICAgfQogICAgICAgICAvLyBUaGUgY2FzZSBvZiBtKHQxKSB3aGVyZSBtIGlzIHRoZSBjdXJyZW50bHkgYWRkZWQgbWV0aG9kLgogICAgICAgICAvLyB1cGRhdGUgdGhlIG9uZS1zaG9ydGVyIGhpbnRzLWFycmF5OiAgCiAgICAgICAgIGlmKHBhcmFtQ291bnQgPiAwKSB7ICAvLyAoc2hvdWxkIGJlIGFsd2F5cyB0cnVlLCBvciBlbHNlIGl0IHdhc24ndCBhIHZhcmFncyBtZXRob2QpCi0gICAgICAgICAgICBDbGFzc1tdIG9uZVNob3J0ZXJVbndyYXBwaW5nSGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbcGFyYW1Db3VudCAtIDFdOwotICAgICAgICAgICAgaWYob25lU2hvcnRlclVud3JhcHBpbmdIaW50cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgd2lkZW5Ub0NvbW1vblN1cGVydHlwZXNGb3JVbndyYXBwaW5nSGludChvbmVTaG9ydGVyVW53cmFwcGluZ0hpbnRzLCBwYXJhbVR5cGVzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdpZGVuSGludHNUb0NvbW1vblN1cGVydHlwZXMoCisgICAgICAgICAgICAgICAgICAgIHBhcmFtQ291bnQgLSAxLAorICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGVzLCBwYXJhbU51bWVyaWNhbFR5cGVzKTsKICAgICAgICAgfQogICAgICAgICAKICAgICB9CiAgICAgCi0gICAgcHJpdmF0ZSB2b2lkIHdpZGVuVG9Db21tb25TdXBlcnR5cGVzRm9yVW53cmFwcGluZ0hpbnQoQ2xhc3NbXSB0eXBlc1RvV2lkZW4sIENsYXNzW10gd2lkZW5pbmdUeXBlcykgeworICAgIHByaXZhdGUgdm9pZCB3aWRlbkhpbnRzVG9Db21tb25TdXBlcnR5cGVzKAorICAgICAgICAgICAgaW50IHBhcmFtQ291bnRPZldpZGVuZWQsIENsYXNzW10gd2lkZW5pbmdUeXBlcywgaW50W10gd2lkZW5pbmdOdW1UeXBlcykgeworICAgICAgICBmaW5hbCBDbGFzc1tdIHR5cGVzVG9XaWRlbiA9IGdldFVud3JhcHBpbmdIaW50c0J5UGFyYW1Db3VudCgpW3BhcmFtQ291bnRPZldpZGVuZWRdOworICAgICAgICBpZiAodHlwZXNUb1dpZGVuID09IG51bGwpIHsgCisgICAgICAgICAgICByZXR1cm47ICAvLyBubyBzdWNoIG92ZXJsb2FkIGV4aXN0czsgbm90aGluZyB0byB3aWRlbgorICAgICAgICB9CisgICAgICAgIAogICAgICAgICBmaW5hbCBpbnQgdHlwZXNUb1dpZGVuTGVuID0gdHlwZXNUb1dpZGVuLmxlbmd0aDsKICAgICAgICAgZmluYWwgaW50IHdpZGVuaW5nVHlwZXNMZW4gPSB3aWRlbmluZ1R5cGVzLmxlbmd0aDsKICAgICAgICAgaW50IG1pbiA9IE1hdGgubWluKHdpZGVuaW5nVHlwZXNMZW4sIHR5cGVzVG9XaWRlbkxlbik7CkBAIC0yMjEsNiArMjI3LDEwIEBACiAgICAgICAgICAgICAgICAgdHlwZXNUb1dpZGVuW2ldID0gZ2V0Q29tbW9uU3VwZXJ0eXBlRm9yVW53cmFwcGluZ0hpbnQodHlwZXNUb1dpZGVuW2ldLCB2YXJhcmdzQ29tcG9uZW50VHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChidWdmaXhlZCkgeworICAgICAgICAgICAgbWVyZ2VJbk51bWVyaWNhbFR5cGVzKHBhcmFtQ291bnRPZldpZGVuZWQsIHdpZGVuaW5nTnVtVHlwZXMpOworICAgICAgICB9CiAgICAgfQogICAgIAogICAgIE1heWJlRW1wdHlNZW1iZXJBbmRBcmd1bWVudHMgZ2V0TWVtYmVyQW5kQXJndW1lbnRzKExpc3QgdG1BcmdzLCBCZWFuc1dyYXBwZXIgdykgCkBAIC0yMjksMzAgKzIzOSwzOSBAQAogICAgICAgICAgICAgLy8gbnVsbCBpcyB0cmVhdGVkIGFzIGVtcHR5IGFyZ3MKICAgICAgICAgICAgIHRtQXJncyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7CiAgICAgICAgIH0KLSAgICAgICAgaW50IGwgPSB0bUFyZ3Muc2l6ZSgpOworICAgICAgICBpbnQgYXJnc0xlbiA9IHRtQXJncy5zaXplKCk7CiAgICAgICAgIENsYXNzW11bXSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQgPSBnZXRVbndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQoKTsKLSAgICAgICAgT2JqZWN0W10gcG9qb0FyZ3MgPSBuZXcgT2JqZWN0W2xdOworICAgICAgICBPYmplY3RbXSBwb2pvQXJncyA9IG5ldyBPYmplY3RbYXJnc0xlbl07CisgICAgICAgIGludFtdIHBvc3NpYmxlTnVtZXJpY2FsVHlwZXMgPSBudWxsOwogICAgICAgICAvLyBTdGFydGluZyBmcm9tIGFyZ3MubGVuZ3RoICsgMSBhcyB3ZSBtdXN0IHRyeSB0byBtYXRjaCBhZ2FpbnN0IGEgY2FzZQogICAgICAgICAvLyB3aGVyZSBhbGwgc3BlY2lmaWVkIGFyZ3MgYXJlIGZpeGFyZ3MsIGFuZCB0aGUgdmFyYXJnIHBvcnRpb24gCiAgICAgICAgIC8vIGNvbnRhaW5zIHplcm8gYXJncwotICAgICAgICBvdXRlcjogIGZvcihpbnQgaiA9IE1hdGgubWluKGwgKyAxLCB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQubGVuZ3RoIC0gMSk7IGogPj0gMDsgLS1qKSB7Ci0gICAgICAgICAgICBDbGFzc1tdIHVud2FyYXBwaW5nQXJnVHlwZXMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbal07Ci0gICAgICAgICAgICBpZih1bndhcmFwcGluZ0FyZ1R5cGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZihqID09IDApIHsKKyAgICAgICAgb3V0ZXI6IGZvcihpbnQgcGFyYW1Db3VudCA9IE1hdGgubWluKGFyZ3NMZW4gKyAxLCB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnQubGVuZ3RoIC0gMSk7IHBhcmFtQ291bnQgPj0gMDsgLS1wYXJhbUNvdW50KSB7CisgICAgICAgICAgICBDbGFzc1tdIHVud2FyYXBwaW5nSGludHMgPSB1bndyYXBwaW5nSGludHNCeVBhcmFtQ291bnRbcGFyYW1Db3VudF07CisgICAgICAgICAgICBpZih1bndhcmFwcGluZ0hpbnRzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1Db3VudCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eU1lbWJlckFuZEFyZ3VtZW50cy5OT19TVUNIX01FVEhPRDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUcnkgdG8gbWFyc2hhbCB0aGUgYXJndW1lbnRzCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBvc3NpYmxlTnVtZXJpY2FsVHlwZXMgPSBnZXRQb3NzaWJsZU51bWVyaWNhbFR5cGVzKHBhcmFtQ291bnQpOworICAgICAgICAgICAgaWYgKHBvc3NpYmxlTnVtZXJpY2FsVHlwZXMgPT0gQUxMX1pFUk9TX0FSUkFZKSB7CisgICAgICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFRyeSB0byB1bndyYXAgdGhlIGFyZ3VtZW50cwogICAgICAgICAgICAgSXRlcmF0b3IgaXQgPSB0bUFyZ3MuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBsOyArK2kpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgcG9qbyA9IHcudW53cmFwSW50ZXJuYWwoKFRlbXBsYXRlTW9kZWwpaXQubmV4dCgpLCBpIDwgaiA/IHVud2FyYXBwaW5nQXJnVHlwZXNbaV0gOiB1bndhcmFwcGluZ0FyZ1R5cGVzW2ogLSAxXSk7CisgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYXJnc0xlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcmFtSWR4ID0gaSA8IHBhcmFtQ291bnQgPyBpIDogcGFyYW1Db3VudCAtIDE7CisgICAgICAgICAgICAgICAgT2JqZWN0IHBvam8gPSB3LnRyeVVud3JhcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChUZW1wbGF0ZU1vZGVsKWl0Lm5leHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud2FyYXBwaW5nSGludHNbcGFyYW1JZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVOdW1lcmljYWxUeXBlcyAhPSBudWxsID8gcG9zc2libGVOdW1lcmljYWxUeXBlc1twYXJhbUlkeF0gOiAwKTsKICAgICAgICAgICAgICAgICBpZihwb2pvID09IEJlYW5zV3JhcHBlci5DQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYocG9qbyAhPSBwb2pvQXJnc1tpXSkgewotICAgICAgICAgICAgICAgICAgICBwb2pvQXJnc1tpXSA9IHBvam87Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBvam9BcmdzW2ldID0gcG9qbzsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjAsMTEgKzI3OSwyMCBAQAogICAgICAgICBNYXliZUVtcHR5Q2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIG1heWJlRW10cHlNZW1iZXJEZXNjID0gZ2V0TWVtYmVyRGVzY3JpcHRvckZvckFyZ3MocG9qb0FyZ3MsIHRydWUpOwogICAgICAgICBpZihtYXliZUVtdHB5TWVtYmVyRGVzYyBpbnN0YW5jZW9mIENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgewogICAgICAgICAgICAgQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yIG1lbWJlckRlc2MgPSAoQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKSBtYXliZUVtdHB5TWVtYmVyRGVzYzsKLSAgICAgICAgICAgIHBvam9BcmdzID0gKChBcmd1bWVudFBhY2tlcilhcmdQYWNrZXJzLmdldChtZW1iZXJEZXNjLm1lbWJlcikpLnBhY2tBcmdzKHBvam9BcmdzLCB0bUFyZ3MsIHcpOworICAgICAgICAgICAgcG9qb0FyZ3MgPSAoKEFyZ3VtZW50UGFja2VyKSBhcmdQYWNrZXJzLmdldChtZW1iZXJEZXNjLm1lbWJlcikpLnBhY2tBcmdzKHBvam9BcmdzLCB0bUFyZ3MsIHcpOwogICAgICAgICAgICAgaWYocG9qb0FyZ3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFbXB0eU1lbWJlckFuZEFyZ3VtZW50cy5OT19TVUNIX01FVEhPRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJlYW5zV3JhcHBlci5jb2VyY2VCaWdEZWNpbWFscyhtZW1iZXJEZXNjLnBhcmFtVHlwZXMsIHBvam9BcmdzKTsKKyAgICAgICAgICAgIGlmIChidWdmaXhlZCkgeworICAgICAgICAgICAgICAgIGlmIChwb3NzaWJsZU51bWVyaWNhbFR5cGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kIHNlbGVjdGlvbiBoYXMgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIG92ZXJmbG93IGVycm9ycyB3aGVuIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FzIHNlbGVjdGVkLiBTbyB0aGlzIGZvcmNlZCBjb252ZXJzaW9uIHNob3VsZG4ndCBjYXVzZSBzdWNoIGNvcnJ1cHRpb24uIEV4Y2VwdCwgY29udmVyc2lvbiBmcm9tCisgICAgICAgICAgICAgICAgICAgIC8vIEJpZ0RlY2ltYWwgaXMgYWxsb3dlZCB0byBvdmVyZmxvdyBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4KKyAgICAgICAgICAgICAgICAgICAgZm9yY2VOdW1iZXJBcmd1bWVudHNUb1BhcmFtZXRlclR5cGVzKHBvam9BcmdzLCBtZW1iZXJEZXNjLnBhcmFtVHlwZXMsIHBvc3NpYmxlTnVtZXJpY2FsVHlwZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQmVhbnNXcmFwcGVyLmNvZXJjZUJpZ0RlY2ltYWxzKG1lbWJlckRlc2MucGFyYW1UeXBlcywgcG9qb0FyZ3MpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG5ldyBNZW1iZXJBbmRBcmd1bWVudHMobWVtYmVyRGVzYy5tZW1iZXIsIHBvam9BcmdzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBFbXB0eU1lbWJlckFuZEFyZ3VtZW50cy5mcm9tKChFbXB0eUNhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcikgbWF5YmVFbXRweU1lbWJlckRlc2MpOyAvLyBlaXRoZXIgTk9UX0ZPVU5EIG9yIEFNQklHVU9VUwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9TaW1wbGVNZW1iZXJNb2RlbC5qYXZhIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9TaW1wbGVNZW1iZXJNb2RlbC5qYXZhCmluZGV4IGI1Njk2ZWUuLjU5MDM4NDcgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvU2ltcGxlTWVtYmVyTW9kZWwuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL1NpbXBsZU1lbWJlck1vZGVsLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICB3aGlsZSAoYXJnSWR4IDwgbm9ybWFsQXJnQ250KSB7CiAgICAgICAgICAgICBDbGFzcyBhcmdUeXBlID0gYXJnVHlwZXNbYXJnSWR4XTsKICAgICAgICAgICAgIFRlbXBsYXRlTW9kZWwgYXJnVmFsID0gKFRlbXBsYXRlTW9kZWwpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIE9iamVjdCB1bndyYXBwZWRBcmdWYWwgPSB3LnVud3JhcEludGVybmFsKGFyZ1ZhbCwgYXJnVHlwZSk7CisgICAgICAgICAgICBPYmplY3QgdW53cmFwcGVkQXJnVmFsID0gdy50cnlVbndyYXAoYXJnVmFsLCBhcmdUeXBlKTsKICAgICAgICAgICAgIGlmKHVud3JhcHBlZEFyZ1ZhbCA9PSBCZWFuc1dyYXBwZXIuQ0FOX05PVF9VTldSQVApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVBcmd1bWVudFR5cGVNaXNtYXJjaEV4Y2VwdGlvbihhcmdJZHgsIGFyZ1ZhbCwgYXJnVHlwZSk7CiAgICAgICAgICAgICB9CkBAIC0xNDMsNyArMTQzLDcgQEAKICAgICAgICAgICAgICAgICAvLyBXZSBmaXJzdCB0cnkgdG8gdHJlYXQgdGhlIGxhc3QgYXJndW1lbnQgYXMgYSB2YXJhcmcgKmFycmF5Ki4KICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGNvbnNpc3RlbnQgdG8gd2hhdCBPdmVybG9hZGVkVmFyQXJnTWV0aG9kIGRvZXMuCiAgICAgICAgICAgICAgICAgaWYgKGFyZ3NMZW4gLSBhcmdJZHggPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHVud3JhcHBlZEFyZ1ZhbCA9IHcudW53cmFwSW50ZXJuYWwoYXJnVmFsLCB2YXJhcmdUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh1bndyYXBwZWRBcmdWYWwgPSB3LnRyeVVud3JhcChhcmdWYWwsIHZhcmFyZ1R5cGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IEJlYW5zV3JhcHBlci5DQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgICAgICAgICAgICAvLyBJdCB3YXMgYSB2YXJhcmcgYXJyYXkuCiAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZEFyZ3NbYXJnSWR4KytdID0gdW53cmFwcGVkQXJnVmFsOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YXJhcmdBcnJheSA9IEFycmF5Lm5ld0luc3RhbmNlKHZhcmFyZ0l0ZW1UeXBlLCB2YXJhcmdBcnJheUxlbik7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IHZhcmFyZ0lkeCA9IDA7IHZhcmFyZ0lkeCA8IHZhcmFyZ0FycmF5TGVuOyB2YXJhcmdJZHgrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVNb2RlbCB2YXJhcmdWYWwgPSAoVGVtcGxhdGVNb2RlbCkgKHZhcmFyZ0lkeCA9PSAwID8gYXJnVmFsIDogaXQubmV4dCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB1bndyYXBwZWRWYXJhcmdWYWwgPSB3LnVud3JhcEludGVybmFsKHZhcmFyZ1ZhbCwgdmFyYXJnSXRlbVR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHVud3JhcHBlZFZhcmFyZ1ZhbCA9IHcudHJ5VW53cmFwKHZhcmFyZ1ZhbCwgdmFyYXJnSXRlbVR5cGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYodW53cmFwcGVkVmFyYXJnVmFsID09IEJlYW5zV3JhcHBlci5DQU5fTk9UX1VOV1JBUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZUFyZ3VtZW50VHlwZU1pc21hcmNoRXhjZXB0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnSWR4ICsgdmFyYXJnSWR4LCB2YXJhcmdWYWwsIHZhcmFyZ0l0ZW1UeXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci90ZW1wbGF0ZS91dGlsaXR5L0NsYXNzVXRpbC5qYXZhIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvQ2xhc3NVdGlsLmphdmEKaW5kZXggYjdkOWNiNi4uY2Q1ZGVlZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvQ2xhc3NVdGlsLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvQ2xhc3NVdGlsLmphdmEKQEAgLTM5MSw1ICszOTEsMTcgQEAKICAgICAgICAgaWYgKGJveGluZ0NsYXNzID09IFZvaWQuY2xhc3MpIHJldHVybiB2b2lkLmNsYXNzOyAgLy8gbm90IHJlYWxseSBhIHByaW1pdGl2ZSwgYnV0IHdlIG5vcm1hbGl6ZSB0byBpdAogICAgICAgICByZXR1cm4gYm94aW5nQ2xhc3M7CiAgICAgfQorCisgICAgLyoqCisgICAgICogVGVsbHMgaWYgYSB0eXBlIGlzIG51bWVyaWNhbDsgd29ya3MgYm90aCBmb3IgcHJpbWl0aXZlIHR5cGVzIGFuZCBjbGFzc2VzLgorICAgICAqIAorICAgICAqIEBwYXJhbSB0eXBlIGNhbid0IGJlIHtAY29kZSBudWxsfQorICAgICAqIAorICAgICAqIEBzaW5jZS4gMi4zLjIxCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVtZXJpY2FsKENsYXNzIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpCisgICAgICAgICAgICAgICAgfHwgdHlwZS5pc1ByaW1pdGl2ZSgpICYmIHR5cGUgIT0gQm9vbGVhbi5UWVBFICYmIHR5cGUgIT0gQ2hhcmFjdGVyLlRZUEUgJiYgdHlwZSAhPSBWb2lkLlRZUEU7CisgICAgfQogICAgIAogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvTnVtYmVyVXRpbC5qYXZhIGIvc3JjL21haW4vamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvTnVtYmVyVXRpbC5qYXZhCmluZGV4IDBkODBjYzAuLjBmOWJkNjQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvZnJlZW1hcmtlci90ZW1wbGF0ZS91dGlsaXR5L051bWJlclV0aWwuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL2ZyZWVtYXJrZXIvdGVtcGxhdGUvdXRpbGl0eS9OdW1iZXJVdGlsLmphdmEKQEAgLTc2LDYgKzc2LDE4IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgCisgICAgLyoqCisgICAgICogVGVsbHMgaWYgYSB7QGxpbmsgQmlnRGVjaW1hbH0gc3RvcmVzIGEgd2hvbGUgbnVtYmVyLiBGb3IgZXhhbXBsZSwgaXQgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gZm9yIHtAY29kZSAxLjAwMDB9LAorICAgICAqIGJ1dCB7QGNvZGUgZmFsc2V9IGZvciB7QGNvZGUgMS4wMDAxfS4KKyAgICAgKiBAc2luY2UgMi4zLjIxCisgICAgICovCisgICAgc3RhdGljIHB1YmxpYyBib29sZWFuIGlzQmlnRGVjaW1hbEludGVnZXIoQmlnRGVjaW1hbCBiZCkgeworICAgICAgICAgICAgcmV0dXJuIGJkLnNjYWxlKCkgPD0gMCAgLy8gQSBmYXN0IGNoZWNrIHRoYXQgd2hvbGUgbnVtYmVycyB1c3VhbGx5IChub3QgYWx3YXlzKSBtYXRjaAorICAgICAgICAgICAgICAgICAgIHx8IGJkLnNldFNjYWxlKDAsIEJpZ0RlY2ltYWwuUk9VTkRfRE9XTikuY29tcGFyZVRvKGJkKSA9PSAwOyAgLy8gVGhpcyBpcyByYXRoZXIgc2xvdworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGBiZC5zaWdudW0oKSA9PSAwIHx8IGJkLnN0cmlwVHJhaWxpbmdaZXJvcygpLnNjYWxlKCkgPD0gMGAgd2FzIGFsc28gdHJpZWQgZm9yIHRoZSBsYXN0CisgICAgICAgICAgICAvLyBjb25kaXRpb24sIGJ1dCBzdHJpcFRyYWlsaW5nWmVyb3Mgd2FzIHNsb3dlciB0aGFuIHNldFNjYWxlICsgY29tcGFyZVRvLgorICAgIH0KKyAgICAKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzTm9uRlBOdW1iZXJPZlN1cHBvcnRlZENsYXNzKE51bWJlciBudW0pIHsKICAgICAgICAgcmV0dXJuIG51bSBpbnN0YW5jZW9mIEludGVnZXIgfHwgbnVtIGluc3RhbmNlb2YgQmlnRGVjaW1hbCB8fCBudW0gaW5zdGFuY2VvZiBMb25nCiAgICAgICAgICAgICAgICAgfHwgbnVtIGluc3RhbmNlb2YgU2hvcnQgfHwgbnVtIGluc3RhbmNlb2YgQnl0ZSB8fCBudW0gaW5zdGFuY2VvZiBCaWdJbnRlZ2VyOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vbWlzYy9vdmVybG9hZGVkTnVtYmVyUnVsZXMvUkVBRE1FLnR4dCBiL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhNDBlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL1JFQURNRS50eHQKQEAgLTAsMCArMSwxMiBAQAorVGhpcyBGTVBQIHByb2plY3QgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgc291cmNlIGNvZGUgb2Ygc29tZQorYGZyZWVtYXJrZXIuZXh0LmJlYW5zLk92ZXJsb2FkZWROdW1iZXJVdGlsYCBtZXRob2RzIGJhc2VkIG9uIHRoZQorY29udGVudCBvZiBgcHJpY2VzLm9kc2AgKExpYnJlT2ZmaWNlIHNwcmVhZHNoZWV0KS4KKworVXNhZ2U6CisxLiBFZGl0IGBwcmljZXMub2RzYAorMy4gSWYgeW91IGhhdmUgaW50cm9kdWNlZCBuZXcgdHlwZXMgaW4gaXQsIGFsc28gdXBkYXRlIGB0b0NzRnJlcVNvcnRlZGAgYW5kCisgICBgdG9Dc0Nvc3RCb29zdHNgIGFuZCBgdG9Dc0NvbnRDb3N0c2AgaW4gYGNvbmZpZy5mbXBwYC4KKzQuIFNhdmUgaXQgaW50byBgcHJpY2VzLmNzdmAgKHVzZSBjb21tYSBhcyBmaWVsZCBzZXBhcmF0b3IpCis1LiBSdW4gRk1QUCBmcm9tIHRoaXMgZGlyZWN0b3J5LiBJdCB3aWxsIGdlbmVyYXRlCisgICBgPGZyZWVtYXJrZXJQcm9qZWN0RGlyPi9idWlsZC9nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZS5qYXZhYC4KKzYuIENvcHktcGFzZSBpdHMgY29udGVudCBpbnRvIGBPdmVybG9hZGVkTnVtYmVyVXRpbC5qYXZhYC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9taXNjL292ZXJsb2FkZWROdW1iZXJSdWxlcy9jb25maWcuZm1wcCBiL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL2NvbmZpZy5mbXBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTdjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9taXNjL292ZXJsb2FkZWROdW1iZXJSdWxlcy9jb25maWcuZm1wcApAQCAtMCwwICsxLDU2IEBACitzb3VyY2VzOiBnZW5lcmF0b3IuZnRsCitvdXRwdXRGaWxlOiAuLi8uLi8uLi8uLi9idWlsZC9vdmVybG9hZGVkTnVtYmVyUnVsZXMuamF2YQorZGF0YTogeworICB0OiBjc3YocHJpY2VzLmNzdiwgeyBzZXBhcmF0b3I6ICcsJyB9KQorICAKKyAgIyBDb252ZXJzaW9uIHRhcmdldCB0eXBlcyBzb3J0ZWQgYnkgZGVjcmVhc2luZyBwcm9iYWJsaXR5IG9mIG9jY3VyZW5jZQorICB0b0NzRnJlcVNvcnRlZDogWyBJbnRlZ2VyLCBMb25nLCBEb3VibGUsIEZsb2F0LCBCeXRlLCBTaG9ydCwgQmlnRGVjaW1hbCwgQmlnSW50ZWdlciBdCisgIAorICAjIENvbnZlcnNpb24gdGFyZ2V0IHR5cGVzIGFzc29jaWF0ZWQgdG8gY29udmVyc2lvbiBwcmljZSBib29zdC4gVGhlIHByaWNlcyBmcm9tIHRoZSBzcHJlYWRzaGVldAorICAjIHdpbGwgYmUgbXVsdGlwaWVkIGJ5IDEwMDAwIGFuZCB0aGUgYm9vc3Qgd2lsbCBiZSBhZGRlZCB0byBpdC4gVGh1cywgaWYgdGhlIHByaWNlIG9mIHR3byBwb3NzaWJsZQorICAjIHRhcmdldHMgYXJlIHRoZSBzYW1lIGFjY29yZGluZyB0aGUgc3ByZWFkc2hlZXQgKGFuZCBvbmx5IHRoZW4hKSwgdGhlIGNob2ljZSB3aWxsIGRlcGVuZCBvbgorICAjIHRoaXMgYm9vc3QuCisgICMgVGhlIG1vcmUgc3BlY2lmaWMgdGhlICh0aGUgc21hbGxlcikgdHlwZSBpcywgdGhlIGxvd2VyIHRoZSBib29zdCBzaG91bGQgYmUuIFRoaXMgaXMgaW1wcm90YW50LAorICAjIGJlY2F1c2UgdGhpcyBudW1iZXIgaXMgYWxzbyB1c2VkIGZvciBjb21wYXJpbmcgdGhlIHNwZWNpZmljaXR5IG9mIG51bWVyaWNhbCB0eXBlcyB3aGVyZQorICAjIHRoZXJlJ3Mgbm8gYXJndW1lbnQgdHlwZSBhdmFpbGFibGUuCisgICMgTm90ZSB3aGVyZSB0aGUgcHJpY2UgZnJvbSB0aGUgc3ByZWFkc2hlZXQgaXMgMCBvciAiLSIgb3IgIk4vQSIsIHRoZSBib29zdCBpcyBub3QgdXNlZC4KKyAgdG9Dc0Nvc3RCb29zdHM6IHsKKyAgICAnQnl0ZSc6IDEsICdTaG9ydCc6IDIsICdJbnRlZ2VyJzogMywgJ0xvbmcnOiA0LCAnQmlnSW50ZWdlcic6IDUsCisgICAgJ0Zsb2F0JzogNiwgJ0RvdWJsZSc6IDcsCisgICAgJ0JpZ0RlY2ltYWwnOiA4CisgIH0KKyAgCisgICMgQ29udmVyc2lvbiBzb3VyY2UgdHlwZXMgc29ydGVkIGJ5IGRlY3JlYXNpbmcgcHJvYmFibGl0eSBvZiBvY2N1cmVuY2UKKyAgZnJvbUNzRnJlcVNvcnRlZDogWworICAgIEludGVnZXIsIAorICAgIEludGVnZXJCaWdEZWNpbWFsLCAKKyAgICBCaWdEZWNpbWFsLCAKKyAgICBMb25nLCAKKyAgICBEb3VibGUsIAorICAgIEZsb2F0LCAKKyAgICBCeXRlLCAKKyAgICBCaWdJbnRlZ2VyLAorICAgIExvbmdPckludGVnZXIKKyAgICBEb3VibGVPckZsb2F0LCAKKyAgICBEb3VibGVPckludGVnZXJPckZsb2F0LCAKKyAgICBEb3VibGVPckludGVnZXIsIAorICAgIERvdWJsZU9yTG9uZywgCisgICAgSW50ZWdlck9yQnl0ZSwKKyAgICBEb3VibGVPckJ5dGUsIAorICAgIExvbmdPckJ5dGUKKyAgICBTaG9ydCwgCisgICAgTG9uZ09yU2hvcnQKKyAgICBTaG9ydE9yQnl0ZQorICAgIEZsb2F0T3JJbnRlZ2VyLCAKKyAgICBGbG9hdE9yQnl0ZSwgCisgICAgRmxvYXRPclNob3J0LCAKKyAgICBCaWdJbnRlZ2VyT3JJbnRlZ2VyLCAKKyAgICBCaWdJbnRlZ2VyT3JMb25nLCAKKyAgICBCaWdJbnRlZ2VyT3JEb3VibGUsICAgCisgICAgQmlnSW50ZWdlck9yRmxvYXQsIAorICAgIEJpZ0ludGVnZXJPckJ5dGUsIAorICAgIEludGVnZXJPclNob3J0LAorICAgIERvdWJsZU9yU2hvcnQsIAorICAgIEJpZ0ludGVnZXJPclNob3J0LCAKKyAgXQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL2dlbmVyYXRvci5mdGwgYi9zcmMvbWFpbi9taXNjL292ZXJsb2FkZWROdW1iZXJSdWxlcy9nZW5lcmF0b3IuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDc0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9taXNjL292ZXJsb2FkZWROdW1iZXJSdWxlcy9nZW5lcmF0b3IuZnRsCkBAIC0wLDAgKzEsNjIgQEAKKyAgICBzdGF0aWMgaW50IGdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKENsYXNzIGZyb21DLCBDbGFzcyB0b0MpIHsKKyAgICAgICAgLy8gRE8gTk9UIEVESVQsIGdlbmVyYXRlZCBjb2RlIQorICAgICAgICAvLyBTZWU6IHNyY1xtYWluXG1pc2Ncb3ZlcmxvYWRlZE51bWJlclJ1bGVzXFJFQURNRS50eHQKKyAgICAgICAgaWYgKHRvQyA9PSBmcm9tQykgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIDwjbGlzdCB0b0NzRnJlcVNvcnRlZCBhcyB0b0M+PCN0PgorICAgICAgICB9IGVsc2UgaWYgKHRvQyA9PSAke3RvQ30uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICA8I2Fzc2lnbiBmaXJzdEZyb21DID0gdHJ1ZT4KKyAgICAgICAgICAgICAgICA8I2xpc3QgZnJvbUNzRnJlcVNvcnRlZCBhcyBmcm9tQz4KKyAgICAgICAgICAgICAgICAgICAgPCNpZiB0b0MgIT0gZnJvbUM+CisgICAgICAgICAgICA8I2Fzc2lnbiByb3cgPSBbXT4KKyAgICAgICAgICAgIDwjbGlzdCB0IGFzIGk+CisgICAgICAgICAgICAgICAgPCNpZiBpWzBdID09IGZyb21DPgorICAgICAgICAgICAgICAgICAgICA8I2Fzc2lnbiByb3cgPSBpPgorICAgICAgICAgICAgICAgICAgICA8I2JyZWFrPgorICAgICAgICAgICAgICAgIDwvI2lmPgorICAgICAgICAgICAgPC8jbGlzdD4KKyAgICAgICAgICAgIDwjaWYgIXJvdz9oYXNfY29udGVudD48I3N0b3AgIk5vdCBmb3VuZDogIiArIGZyb21DPjwvI2lmPgorICAgICAgICAgICAgPCNpZiAhZmlyc3RGcm9tQz5lbHNlIDwvI2lmPmlmIChmcm9tQyA9PSAke2Zyb21DfS5jbGFzcykgcmV0dXJuICR7dG9QcmljZShyb3dbdG9DXSwgdG9Dc0Nvc3RCb29zdHNbdG9DXSl9OworICAgICAgICAgICAgPCNhc3NpZ24gZmlyc3RGcm9tQyA9IGZhbHNlPgorICAgICAgICAgICAgICAgICAgICA8LyNpZj4KKyAgICAgICAgICAgICAgICA8LyNsaXN0PgorICAgICAgICAgICAgZWxzZSByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgIDwvI2xpc3Q+CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVbmtub3duIHRvQzsgd2UgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCB0byBpdDoKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfSAgICAgICAgCisgICAgfQorCisgICAgc3RhdGljIGludCBjb21wYXJlTnVtYmVyVHlwZVNwZWNpZmljaXR5KENsYXNzIGMxLCBDbGFzcyBjMikgeworICAgICAgICAvLyBETyBOT1QgRURJVCwgZ2VuZXJhdGVkIGNvZGUhCisgICAgICAgIC8vIFNlZTogc3JjXG1haW5cbWlzY1xvdmVybG9hZGVkTnVtYmVyUnVsZXNcUkVBRE1FLnR4dAorICAgICAgICBjMSA9IENsYXNzVXRpbC5wcmltaXRpdmVDbGFzc1RvQm94aW5nQ2xhc3MoYzEpOworICAgICAgICBjMiA9IENsYXNzVXRpbC5wcmltaXRpdmVDbGFzc1RvQm94aW5nQ2xhc3MoYzIpOworICAgICAgICAKKyAgICAgICAgaWYgKGMxID09IGMyKSByZXR1cm4gMDsKKyAgICAgICAgCisgICAgICAgIDwjbGlzdCB0b0NzRnJlcVNvcnRlZCBhcyBjMT48I3Q+CisgICAgICAgIGlmIChjMSA9PSAke2MxfS5jbGFzcykgeworICAgICAgICAgIDwjbGlzdCB0b0NzRnJlcVNvcnRlZCBhcyBjMj48I2lmIGMxICE9IGMyPjwjdD4KKyAgICAgICAgICAgIGlmIChjMiA9PSAke2MyfS5jbGFzcykgcmV0dXJuICR7dG9Dc0Nvc3RCb29zdHNbYzJdfSAtICR7dG9Dc0Nvc3RCb29zdHNbYzFdfTsKKyAgICAgICAgICA8LyNpZj48LyNsaXN0PgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgPC8jbGlzdD4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCis8I2Z1bmN0aW9uIHRvUHJpY2UgY2VsbFZhbHVlLCBib29zdD4KKyAgICA8I2lmIGNlbGxWYWx1ZT9zdGFydHNfd2l0aCgiQkMgIik+CisgICAgICAgIDwjbG9jYWwgY2VsbFZhbHVlID0gY2VsbFZhbHVlWzMuLl0+CisgICAgPCNlbHNlaWYgY2VsbFZhbHVlID09ICctJyB8fCBjZWxsVmFsdWUgPT0gJ04vQSc+CisgICAgICAgIDwjcmV0dXJuICdJbnRlZ2VyLk1BWF9WQUxVRSc+CisgICAgPC8jaWY+CisgICAgPCNsb2NhbCBjZWxsVmFsdWUgPSBjZWxsVmFsdWU/bnVtYmVyPgorICAgIDwjaWYgY2VsbFZhbHVlICE9IDA+CisgICAgICAgIDwjcmV0dXJuIGNlbGxWYWx1ZSAqIDEwMDAwICsgYm9vc3Q+CisgICAgPCNlbHNlPgorICAgICAgICA8I3JldHVybiAwPgorICAgIDwvI2lmPgorPC8jZnVuY3Rpb24+CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9taXNjL292ZXJsb2FkZWROdW1iZXJSdWxlcy9wcmljZXMuY3N2IGIvc3JjL21haW4vbWlzYy9vdmVybG9hZGVkTnVtYmVyUnVsZXMvcHJpY2VzLmNzdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJkN2JhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vbWlzYy9vdmVybG9hZGVkTnVtYmVyUnVsZXMvcHJpY2VzLmNzdgpAQCAtMCwwICsxLDQ4IEBACissQnl0ZSxTaG9ydCxJbnRlZ2VyLExvbmcsQmlnSW50ZWdlcixGbG9hdCxEb3VibGUsQmlnRGVjaW1hbCwsTm90ZQorQnl0ZSwwLDEsMSwxLDEsMiwyLDIsLAorU2hvcnRPckJ5dGUsMi4xLDAsMSwxLDEsMiwyLDIsLAorU2hvcnQsLSwwLDEsMSwxLDIsMiwyLCwKK0ludGVnZXJPckJ5dGUsMi4yLDIuMSwwLDEsMSwyLjQsMiwyLCwKK0ludGVnZXJPclNob3J0LC0sMi4xLDAsMSwxLDIuNCwyLDIsLAorSW50ZWdlciwtLC0sMCwxLDEsMywyLDIsLAorTG9uZ09yQnl0ZSwyLjMsMi4yLDIuMSwwLDEsMi40LDIuMSwyLCwKK0xvbmdPclNob3J0LC0sMi4yLDIuMSwwLDEsMi40LDIuMSwyLCwKK0xvbmdPckludGVnZXIsLSwtLDIuMSwwLDEsMywyLjEsMiwsCitMb25nLC0sLSwtLDAsMSw0LDMsMiwsCitCaWdJbnRlZ2VyT3JCeXRlLDEuOCwxLjcsMS42LDEuNSwwLDIuNCwyLDEsLAorQmlnSW50ZWdlck9yU2hvcnQsLSwxLjcsMS42LDEuNSwwLDIuNCwyLDEsLAorQmlnSW50ZWdlck9ySW50ZWdlciwtLC0sMS42LDEuNSwwLDMsMiwxLCwKK0JpZ0ludGVnZXJPckxvbmcsLSwtLC0sMS41LDAsNCwzLDEsLAorQmlnSW50ZWdlck9yRmxvYXQsTi9BLE4vQSxOL0EsTi9BLDAsMi40LDIsMSwsIkNvbmRpdGlvbjogTm8gd2hvbGUtbnVtYmVyIHRhcmdldCB0eXBlcyBleGlzdCwgYW5kIGFicyh2YWx1ZSkgPD0gMioqMjQiCitCaWdJbnRlZ2VyT3JEb3VibGUsTi9BLE4vQSxOL0EsTi9BLDAsNCwyLDEsLCJDb25kaXRpb246IE5vIHdob2xlLW51bWJlciB0YXJnZXQgdHlwZXMgZXhpc3QsIGFuZCBhYnModmFsdWUpIDw9IDIqKjUzIgorQmlnSW50ZWdlciwtLC0sLSwtLDAsLSwtLDEsLAorRmxvYXRPckJ5dGUsMi4zLDIuMiwyLjEsMi4xLDIuNSwwLDEsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gW1QuTUlOX1ZBTFVFIC4uIFQuTUFYX1ZBTFVFXSIKK0Zsb2F0T3JTaG9ydCwtLDIuMiwyLjEsMi4xLDIuNSwwLDEsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gW1QuTUlOX1ZBTFVFIC4uIFQuTUFYX1ZBTFVFXSIKK0Zsb2F0T3JJbnRlZ2VyLC0sLSwyLjEsMi4xLDIuNSwwLDEsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gWy0xNjc3NzIxNiAuLiAxNjc3NzIxNl0iCitGbG9hdCwtLC0sLSwtLC0sMCwxLDIsLAorRG91YmxlT3JCeXRlLDIuNSwyLjQsMi4yLDIuMSwyLjEsMi4zLDAsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gW1QuTUlOX1ZBTFVFIC4uIFQuTUFYX1ZBTFVFXSIKK0RvdWJsZU9yU2hvcnQsLSwyLjQsMi4yLDIuMSwyLjEsMi4zLDAsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gW1QuTUlOX1ZBTFVFIC4uIFQuTUFYX1ZBTFVFXSIKK0RvdWJsZU9ySW50ZWdlck9yRmxvYXQsLSwtLDIuMiwyLjEsMi4xLDIuMywwLDIsLCJDb25kaXRpb246IGZyYWN0aW9uID09IDAsIGluIFstMTY3NzcyMTYgLi4gMTY3NzcyMTZdIgorRG91YmxlT3JJbnRlZ2VyLC0sLSwyLjIsMi4xLDIuMSwzLDAsMiwsIkNvbmRpdGlvbjogZnJhY3Rpb24gPT0gMCwgaW4gW1QuTUlOX1ZBTFVFIC4uIFQuTUFYX1ZBTFVFXSIKK0RvdWJsZU9yTG9uZywtLC0sLSwyLjEsMi4xLDQsMCwyLCwiQ29uZGl0aW9uOiBmcmFjdGlvbiA9PSAwLCBpbiBbLTkwMDcxOTkyNTQ3NDA5OTIuLjkwMDcxOTkyNTQ3NDA5OTJdIgorRG91YmxlT3JGbG9hdCwtLC0sLSwtLC0sMywwLDIsLENvbmRpdGlvbjogbm8gbWFnbml0dWRlIGxvc3MKK0RvdWJsZSwtLC0sLSwtLC0sLSwwLDIsLAorSW50ZWdlckJpZ0RlY2ltYWwsMy41LDMuNCwzLjEsMy4xLDEsMy4zLDMuMiwwLCxDb25kaXRpb246IGZyYWN0aW9uID09IDA7IGZvciBCQyB3ZSBjb252ZXJ0IHJhdGhlciCTYnJhdmVseZQgaGVyZS4KK0JpZ0RlY2ltYWwsNC41LDQuNCw0LjEsNC4xLDQsMy4zLDMuMiwwLCxDb25kaXRpb246IGZyYWN0aW9uICE9IDA7IGZvciBCQyB3ZSBjb252ZXJ0IHJhdGhlciCTYnJhdmVseZQgaGVyZS4KKywsLCwsLCwsLCwKKyxMZWdlbmQ6LCwsLCwsLCwsCissLCJUaGUgbnVtYmVycyBhcmUgdGhlIIRwcmljZZQgb2YgdGhlIGNvbnZlcnNpb24sIGFuZCB0aGV5IHRlbGwgaG93IG11Y2ggd2UgdHJ5IHRvIGF2b2lkIGl0ICh3aGVuIHNlbGVjdGluZyBhbW9uZyBvdmVybG9hZGVkIG1ldGhvZHMpOiIsLCwsLCwsLAorLCwsLCwsLCwsLAorLCwwLE5vIGNvbnZlcnNpb24sLCwsLCwsCissLDEsTG9zc2xlc3MgY29udmVyc2lvbiwsLCwsLCwKKywsMiwiVXAgdG8gYnV0IGV4Y2x1ZGluZyAzLCBsb3NzbGVzcyBidXQgY2VydGFpbmx5IHVuaW50ZW5kZWQgY29udmVyc2lvbi4iLCwsLCwsLAorLCwzLFNtYWxsZXIgcHJlY2lzaW9uIGxvc3MgaW4gbWFudGlzc2EuLCwsLCwsLAorLCw0LEJpZ2dlciBwcmVjaXNpb24gbG9zcyBpbiBtYW50aXNzYS4sLCwsLCwsCissLC0sTWFnbml0dWRlIGxvc3Mgb3Igb3ZlcmZsb3cgPT4gbm90IGFsbG93ZWQsLCwsLCwsCissLE4vQSxEb2Vzbid0IG1hdGVyIChOb3QgQXBwbGljYWJsZSksLCwsLCwsCissLCwsLCwsLCwsCissTm90ZXM6LCwsLCwsLCwsCissLSwiRm9vT3JCYXIgdHlwZXMgbWVhbiB0aGF0IHRoZSBhcmd1bWVudCdzIHR5cGUgd2FzIEZvbywgYnV0IHRoZSB2YWx1ZSBhbHNvIGZpdHMgaW50byB0aGUgbW9yZSBzcGVjaWZpYyBCYXIgdHlwZS4iLCwsLCwsLCwKKywsIlRoaXMgcG9zc2liaWxpdHkgc2hvdWxkIG9ubHkgYmUgdXRpbGl6ZWQgYXMgYSBsYXN0IHJlc29ydCwgdG8ga2VlcCB0aGUgbWV0aG9kIHNlbGVjdGlvbiBzdGFibGUgKGFsd2F5cyBzZWxlY3RzIHRoZSBzYW1lIG1ldGhvZCkgZm9yIEZvby1zIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZS4iLCwsLCwsLCwKKywsIlRoaXMgaXMgd2h5IHRoZSBjb2x1bW4gb2YgQmFyLXMgdGVuZHMgdG8gdXNlIGhpZ2hlciBjb3N0cyB0aGFuIHRoZSBsZXNzIGZpdHRpbmcgY29sdW1ucyB0aGF0IGFyZSwgaG93ZXZlciwgYWxzbyBzZWxlY3RhYmxlIGZvciBoaWdoZXIgdmFsdWVzIG9mIHR5cGUgRm9vLiIsLCwsLCwsLAorLC0sIkJldHdlZW4gc2FtZS1wcmljZSBjb252ZXJzaW9ucyB0aGUgb25lIGluIHRoZSBsZWZ0bW9zdCBjb2x1bW4gKGkuZS4sIHRoZSBzbWFsbGVzdCB0eXBlKSB3aW5zLiBUaGlzIGlzIHJlYWxpemVkIGluIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yLiIsLCwsLCwsLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vbWlzYy9vdmVybG9hZGVkTnVtYmVyUnVsZXMvcHJpY2VzLm9kcyBiL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL3ByaWNlcy5vZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlYWJjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tYWluL21pc2Mvb3ZlcmxvYWRlZE51bWJlclJ1bGVzL3ByaWNlcy5vZHMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL21hbnVhbC9ib29rLnhtbCBiL3NyYy9tYW51YWwvYm9vay54bWwKaW5kZXggZjc5YzU1Mi4uYTA0YzhiNyAxMDA2NDQKLS0tIGEvc3JjL21hbnVhbC9ib29rLnhtbAorKysgYi9zcmMvbWFudWFsL2Jvb2sueG1sCkBAIC0yMDM3Miw4OSArMjAzNzIsMTYzIEBACiAgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdFdyYXBwZXI8L2xpdGVyYWw+IGluc3RlYWQuIChBcwogICAgICAgICAgICAgICA8bGl0ZXJhbD5PYmplY3RXcmFwcGVyPC9saXRlcmFsPiBvYmplY3RzIGFyZSBvZnRlbiBzaGFyZWQgYW1vbmcKICAgICAgICAgICAgICAgbXVsdGlwbGUgPGxpdGVyYWw+Q29uZmlndXJhdGlvbjwvbGl0ZXJhbD4tcywgdGhleSBjYW4ndCB1c2UgdGhhdAotICAgICAgICAgICAgICBzZXR0aW5nIG9mIHRoZSA8bGl0ZXJhbD5Db25maWd1cmF0aW9uPC9saXRlcmFsPi4pPC9wYXJhPgorICAgICAgICAgICAgICBzZXR0aW5nIG9mIHRoZSA8bGl0ZXJhbD5Db25maWd1cmF0aW9uPC9saXRlcmFsPi4pIEluIG5ldyBvcgorICAgICAgICAgICAgICBhY3RpdmVseSBkZXZlbG9wZWQgcHJvamVjdHMgaXQncyByZWNvbW1lbmRlZCB0byB1c2UKKyAgICAgICAgICAgICAgPGxpdGVyYWw+VmVyc2lvbigyLCAzLCAyMSk8L2xpdGVyYWw+IG9yIGhpZ2hlci48L3BhcmE+CiAgICAgICAgICAgICA8L2xpc3RpdGVtPgogCiAgICAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICAgIDxwYXJhPkZpeGVzIGluIHRoZSBvdmVybG9hZGVkIG1ldGhvZCBzZWxlY3Rpb24gcnVsZXMgd2hlbgotICAgICAgICAgICAgICA8bGl0ZXJhbD5CZWFuc1dyYXBwZXI8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgIDxwYXJhPkZpeGVzIGFuZCByZXdvcmtpbmdzIGluIHRoZSBvdmVybG9hZGVkIG1ldGhvZCBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgcnVsZXMgd2hlbiA8bGl0ZXJhbD5CZWFuc1dyYXBwZXI8L2xpdGVyYWw+IG9yCiAgICAgICAgICAgICAgIDxsaXRlcmFsPkRlZmF1bHRPYmplY3RXcmFwcGVyPC9saXRlcmFsPiBpcyB1c2VkIChhbG1vc3QgYWxsCi0gICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB1c2UgdGhlc2UpLCBidXQgb25seSBpZiB5b3UgY3JlYXRlCisgICAgICAgICAgICAgIGFwcGxpY2F0aW9ucyB1c2UgdGhlc2UpLCBidXQgb25seSBpZiB5b3UgY3JlYXRlIHRoZQogICAgICAgICAgICAgICA8bGl0ZXJhbD5CZWFuc1dyYXBwZXI8L2xpdGVyYWw+LzxsaXRlcmFsPkRlZmF1bHRPYmplY3RXcmFwcGVyPC9saXRlcmFsPgogICAgICAgICAgICAgICB3aXRoIGNvbnN0cnVjdG9yIHBhcmFtZXRlciA8bGl0ZXJhbD5WZXJzaW9uKDIsIDMsIDIxKTwvbGl0ZXJhbD4KLSAgICAgICAgICAgICAgKG9yIGhpZ2hlcikuIFRoZXJlJ3MgYSB2ZXJ5IGxpdHRsZSBjaGFuY2UgdGhhdCBiZWNhdXNlIG9mIHRoZXNlCi0gICAgICAgICAgICAgIGZpeGVzLCBhIGRpZmZlcmVudCBvdmVybG9hZGVkIG1ldGhvZCB3aWxsIGNob3NlbiB0aGFuIGJlZm9yZQotICAgICAgICAgICAgICAod2hpY2ggaW4gdGhlb3J5IGNvdWxkIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGFwcGxpY2F0aW9uKSwKLSAgICAgICAgICAgICAgb3IgYW1iaWd1aXR5IGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgd2hlcmUgZWFybGllciBpdCBoYXMgb25seQotICAgICAgICAgICAgICBzZWVuIG9uZSBjaG9pY2UsIGhlbmNlIHRoZSBmaXhlcyBhcmVuJ3QgYXV0b21hdGljYWxseSBhY3RpdmUgKGF0Ci0gICAgICAgICAgICAgIGxlYXN0IG5vdCB1bml0IEZyZWVNYXJrZXIgMi40KS4gQnV0IHRoZSBmaXggbW9zdGx5IG9ubHkgZWZmZWN0Ci0gICAgICAgICAgICAgIGNhbGxzIHRoYXQgd2VyZSBmYWlsaW5nIGVhcmxpZXIsIHNvIGl0J3MgcmVjb21tZW5kZWQgdG8gYWN0aXZlCi0gICAgICAgICAgICAgIGl0IGZvciBwcm9qZWN0IHRoYXQgYXJlIHN0aWxsIGFjdGl2ZWx5IGRldmVsb3BlZC4gVGhlIGZpeGVzCi0gICAgICAgICAgICAgIGFyZTo8L3BhcmE+CisgICAgICAgICAgICAgIG9yIGhpZ2hlci4gVGhlcmUncyBhIGxpdHRsZSBjaGFuY2UgdGhhdCBiZWNhdXNlIG9mIHRoZXNlCisgICAgICAgICAgICAgIGNoYW5nZXMsIGEgZGlmZmVyZW50IG92ZXJsb2FkZWQgbWV0aG9kIHdpbGwgY2hvc2VuIHRoYW4gYmVmb3JlLAorICAgICAgICAgICAgICBvciBldmVuIHRoYXQgYW1iaWd1aXR5IGVycm9yIHdpbGwgYXJpc2Ugd2hlcmUgZWFybGllciB0aGV5CisgICAgICAgICAgICAgIGRpZG4ndCAoYWx0aG91Z2ggdGhlIG9wcG9zaXRlIGlzIG11Y2ggbW9yZSBwcm9iYWJsZSksIGhlbmNlIHRoZQorICAgICAgICAgICAgICBmaXhlcyBhcmVuJ3QgYXV0b21hdGljYWxseSBhY3RpdmUsIGF0IGxlYXN0IG5vdCB1bml0IEZyZWVNYXJrZXIKKyAgICAgICAgICAgICAgMi40LiBCdXQgdGhlIGZpeCBtb3N0bHkgb25seSBlZmZlY3QgY2FsbHMgdGhhdCB3ZXJlIGZhaWxpbmcgb3IKKyAgICAgICAgICAgICAgaGFzIGNob3NlbiB0aGVuIHdyb25nIG1ldGhvZCwgc28gaXQncyByZWNvbW1lbmRlZCB0byBhY3RpdmF0ZSBpdAorICAgICAgICAgICAgICBmb3IgcHJvamVjdHMgdGhhdCBhcmUgc3RpbGwgYWN0aXZlbHkgZGV2ZWxvcGVkLiBUaGlzIGZpeAorICAgICAgICAgICAgICBpbmNsdWRlcyBudW1lcm91cyBjaGFuZ2VzOjwvcGFyYT4KIAogICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgogICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KLSAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPm51bGw8L2xpdGVyYWw+IGFyZ3VtZW50IHZhbHVlcyBoYXMgb25seQotICAgICAgICAgICAgICAgICAgbWF0Y2hlZCBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICBoYWQgPGxpdGVyYWw+T2JqZWN0PC9saXRlcmFsPiB0eXBlLCBub3QgYSBzdWJjbGFzcyBvZiBpdC4KLSAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG1vc3Qgcmlza3kgZml4IHJlZ2FyZGluZyBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LAotICAgICAgICAgICAgICAgICAgYXMgd2hlbiB0aGUgYXJndW1lbnQgaXMgPGxpdGVyYWw+bnVsbDwvbGl0ZXJhbD4sIGVhcmxpZXIgaXQKLSAgICAgICAgICAgICAgICAgIGhhcyBjaG9zZW4gdGhlIG92ZXJsb2FkIHRoYXQgaGFzIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4KLSAgICAgICAgICAgICAgICAgIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiwgd2hpbGUgYWZ0ZXIgdGhlIGZpeCBpdCBhbHNvIGNvbnNpZGVycwotICAgICAgICAgICAgICAgICAgdGhlIG90aGVyIG92ZXJsb2FkcyB3aXRoIGEgbm9uLXByaW1pdGl2ZSB0eXBlIGF0IHRoZSBnaXZlbgotICAgICAgICAgICAgICAgICAgcG9zaXRpb24uIEluIHRoYXQgY2FzZSB0aGUgb3ZlcmxvYWQgd2l0aCB0aGUKLSAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4gcGFyYW1ldGVyIHdpbGwgZmFsbCBvdXQgKHNvIGZhciBzbwotICAgICAgICAgICAgICAgICAgZ29vZCksIGJ1dCBpZiB0aGVyZSBhcmUgdHdvIG90aGVyIGNhbmRpZGF0ZXMsIHdob3NlCi0gICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdHlwZXMgYXQgdGhhdCBwb3NpdGlvbiBhcmVuJ3QgaW4KLSAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmluc3RhbmNlb2Y8L2xpdGVyYWw+IHJlbGF0aW9uc2hpcCBhdCBzb21lCi0gICAgICAgICAgICAgICAgICBkaXJlY3Rpb24sIHRoZWlyIHJlbGF0aXZlIHNwZWNpZmljaXR5IGlzIHVuZGVjaWRhYmxlIGFuZCBzbwotICAgICAgICAgICAgICAgICAgdGhlcmUgd2lsbCBiZSBhbWJpZ3VpdHkgZXhjZXB0aW9uLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgIDxwYXJhPkVhcmxpZXIsIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+IGFyZ3VtZW50IHZhbHVlcyBoYXMKKyAgICAgICAgICAgICAgICAgIG9ubHkgbWF0Y2hlZCBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBoYWQgPGxpdGVyYWw+T2JqZWN0PC9saXRlcmFsPiB0eXBlLCBub3QgYSBzdWJjbGFzcworICAgICAgICAgICAgICAgICAgb2YgaXQuIE5vdyBpdCBjb25zaWRlcnMgYWxsIG92ZXJsb2FkcyB3aGVyZSB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICB0eXBlIGlzIG5vbi1wcmltaXRpdmUsIGFuZCBqdXN0IGxpa2UgdGhlIEphdmEgbGFuZ3VhZ2UsIGl0CisgICAgICAgICAgICAgICAgICBjaG9zZXMgdGhlIG9uZSB3aXRoIHRoZSBtb3N0IHNwZWNpZmljIHR5cGUgYW1vbmcgdGhlbS4gVGhpcworICAgICAgICAgICAgICAgICAgaXMgdGhlIG1vc3QgaW1wb3J0YW50IGZpeCwgYW5kIGFsc28gdGhlIG1vc3Qgcmlza3kgb25lCisgICAgICAgICAgICAgICAgICByZWdhcmRpbmcgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4gTGlrZSBpZiB5b3UgaGF2ZQorICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+bShPYmplY3Qgbyk8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5tKFN0cmluZworICAgICAgICAgICAgICAgICAgcyk8L2xpdGVyYWw+IGluIGEgSmF2YSBjbGFzcywgZWFybGllciBmb3IgYQorICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+bShudWxsKTwvbGl0ZXJhbD4gY2FsbCBpbiB0aGUgdGVtcGxhdGUgaXQgaGFzCisgICAgICAgICAgICAgICAgICBjaG9zZW4gPGxpdGVyYWw+bShPYmplY3Qgbyk8L2xpdGVyYWw+LCBidXQgbm93IGl0IHdpbGwKKyAgICAgICAgICAgICAgICAgIGNob29zZSA8bGl0ZXJhbD5tKFN0cmluZyBzKTwvbGl0ZXJhbD4gaW5zdGVhZCAoYmVjYXVzZQorICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiBpcyBhbHNvCisgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5udWxsPC9saXRlcmFsPi1hYmxlIGFuZCBpcyBtb3JlIHNwZWNpZmljIHRoZW4KKyAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4pLiBGdXJ0aGVybW9yZSwgaWYgeW91IGFsc28gaGFkCisgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5tKEZpbGUgZik8L2xpdGVyYWw+IGluIHRoZSBzYW1lIGNsYXNzLCBub3cgaXQgd2lsbAorICAgICAgICAgICAgICAgICAgY2F1c2UgYW4gYW1iaWd1aXR5IGV4Y2VwdGlvbiwgc2luY2UgdGhlIHNwZWNpZmljaXR5IG9mCisgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GaWxlPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiBjYW4ndAorICAgICAgICAgICAgICAgICAgYmUgY29tcGFyZWQgKHNhbWUgcnVsZSBhcyB1bmRlciBKYXZhIGxhbmd1YWdlKSwgd2hpbGUKKyAgICAgICAgICAgICAgICAgIGVhcmxpZXIgdGhhdCB3YXNuJ3QgYSBwcm9ibGVtIGFzIG9ubHkgPGxpdGVyYWw+bShPYmplY3QKKyAgICAgICAgICAgICAgICAgIG8pPC9saXRlcmFsPiB3YXMgc2VlbiBhcyBhcHBsaWNhYmxlLjwvcGFyYT4KICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgogCiAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgICAgPHBhcmE+VE9ETzogbnVtYmVyIGNvbnZlcnNpb25zPC9wYXJhPgotICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+Ci0KLSAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Ci0gICAgICAgICAgICAgICAgICA8cGFyYT5UT0RPOiBtZXRob2Qgb3JkZXIgZGVwZW5kZW5jZTwvcGFyYT4KLSAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgotCi0gICAgICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgICAgPHBhcmE+QW1iaWd1aXR5IGlzIG5vdyByZXNvbHZlZCBpbiBzb21lIGNhc2VzIHdoZXJlIGVhcmxpZXIKLSAgICAgICAgICAgICAgICAgIGl0IHdhcyBhbiBlcnJvci4gQW1iaWd1aXRpZXMgd2FzIGFuZCBhcmUgcmVzb2x2ZWQgYnkKLSAgICAgICAgICAgICAgICAgIHNlbGVjdGluZyB0aGUgY29tcGF0aWJsZSBtZXRob2RzIHRoZW4gY2hvb3NpbmcgdGhlIG9uZSB3aXRoCi0gICAgICAgICAgICAgICAgICB0aGUgbW9zdCBzcGVjaWZpYyBwYXJhbWV0ZXIgdHlwZXMgYW1vbmcgdGhlbS4gSG93IHRoZQotICAgICAgICAgICAgICAgICAgc3BlY2lmaWNpdHkgb2YgdGhlIHBhcmFtZXRlciB0eXBlcyBpcyBjYWxjdWxhdGVkIHdhcwotICAgICAgICAgICAgICAgICAgZXh0ZW5kZWQ6PC9wYXJhPgorICAgICAgICAgICAgICAgICAgPHBhcmE+VGhlIGJlaGF2aW9yIG9mIG51bWJlcnMgd2l0aCBvdmVybG9hZGVkIG1ldGhvZAorICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uIHdhcyBoZWF2aWx5IHJld29ya2VkOjwvcGFyYT4KIAogICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgotICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPldoZW4gY29tcGFyaW5nIHRoZSBzcGVjaWZpY2l0eSBvZiB0d28gcGFyYW1ldGVycwotICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIGF0IHRoZSBzYW1lIHBhcmFtZXRlciBwb3NpdGlvbjogVGhlIGFsZ29yaXRobSBub3cKLSAgICAgICAgICAgICAgICAgICAgICBjb25zaWRlcnMgYSBwcmltaXRpdmUgdHlwZSBhcyBtb3JlIHNwZWNpZmljIHRoYXQgaXRzCi0gICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBib3hpbmcgY2xhc3MuIEFsc28sIHRoZSBub3cgaXQgY29uc2lkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgd2lkZW5pbmcgY29udmVyc2lvbiBmcm9tIHByaW1pdGl2ZSBudW1lcmljYWwgdHlwZXMgdG8KLSAgICAgICAgICAgICAgICAgICAgICBudW1lcmljYWwgY2xhc3NlcywgYW5kIGZyb20gbnVtZXJpY2FsIGNsYXNzIHR5cGVzIHRvCi0gICAgICAgICAgICAgICAgICAgICAgb3RoZXIgbnVtZXJpY2FsIGNsYXNzIHR5cGVzLCBhbmQgaWYgdGhlIHRhcmdldCBpcyB3aWRlcgotICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIHNvdXJjZSwgdGhlbiB0aGUgc291cmNlIGlzIGNvbnNpZGVyZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICBtb3JlIHNwZWNpZmljLiAoRWFybGllciB0aGlzIGhhcyBvbmx5IHdvcmtlZCBhbW9uZyB0d28KLSAgICAgICAgICAgICAgICAgICAgICBwcmltaXRpdmUgdHlwZXMpLiBGdXJ0aGVybW9yZSwgaXQgY29uc2lkZXJzIGFueQotICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZSBudW1lcmljYWwgdHlwZSBhcyBtb3JlIHNwZWNpZmljIHRoYW4KLSAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5OdW1iZXI8L2xpdGVyYWw+LjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5JZiBwb3NzaWJsZSwgaXQgbm93IGFsd2F5cyBjaG9zZXMgdGhlIG92ZXJsb2FkCisgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgb3ZlcmZsb3cgYW5kIHRydW5jYXRpb24gdG8gaW50ZWdlciAobGlrZSAxLjUgdG8gMSkKKyAgICAgICAgICAgICAgICAgICAgICBpcyBhdm9pZGVkLiBBbW9uZyB0aGUgbWV0aG9kcyB3aGVyZSBubyBzdWNoIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgICAgICAgbG9zcyBvY2N1cnMsIGl0IGNob3NlcyB0aGUgb3ZlcmxvYWQgd2l0aCB0aGUgbGVhc3QgcmlzaworICAgICAgICAgICAgICAgICAgICAgIG9mIHByZWNpc2lvbiBsb3NzICh1bmxlc3Mgb3RoZXIgY29uZGl0aW9ucyB3aXRoIGhpZ2hlcgorICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5IHN1Z2dlc3Qgb3RoZXJ3aXNlKS4gRWFybGllciwgdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbiB3YXMgcHJvbmUgdG8gZG8gY2hvaWNlcyB0aGF0IGxlZCB0byBvdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgIG9yIHByZWNpc2lvbiBsb3NzLCBlc3BlY2lhbGx5IHdoZW4gdGhlIHBhcmFtZXRlciB3YXMgYQorICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYWwgd2l0aCBkZWNpbWFscy48L3BhcmE+CiAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CiAKICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPk92ZXJsb2FkZWQgbWV0aG9kIGNhbGwgY2FuIG5vdyBjb252ZXJ0IHRvCisgICAgICAgICAgICAgICAgICAgICAgbm9uLXByaW1pdGl2ZSBudW1lcmljYWwgdHlwZXMsIGxpa2UgYQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkJ5dGU8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmJ5dGU8L2xpdGVyYWw+IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8gPGxpdGVyYWw+SW50ZWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgcGFyYW1ldGVyIHR5cGUgaXMgPGxpdGVyYWw+SW50ZWdlcjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgKFRoaXMgaGFzIGFsd2F5cyB3b3JrZWQgZm9yIG5vbi1vdmVybG9hZGVkIG1ldGhvZHMuKQorICAgICAgICAgICAgICAgICAgICAgIEVhcmxpZXIgd2hlcmUgc3VjaCBjb252ZXJzaW9uIHdhcyBuZWVkZWQsIHRoZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICB3YXNuJ3Qgc2VlbiBzZWVuIGFwcGxpY2FibGUuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5NZXRob2Qgc2VsZWN0aW9uIGlzIG5vdyBub3Qgb25seSBiYXNlZCBvbiB0aGUgdHlwZQorICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB3cmFwcGVkIG51bWJlciwgYnV0IGFsc28gb24gaXRzIHZhbHVlLiBGb3IKKyAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlLCBhIDxsaXRlcmFsPkxvbmc8L2xpdGVyYWw+IHdpdGggdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4xPC9saXRlcmFsPiBpcyBub3cgc2VlbiB0byBiZSBjb21wYXRpYmxlIHdpdGggYQorICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB3aXRoIHBhcmFtZXRlciB0eXBlIDxsaXRlcmFsPmludDwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zaG9ydDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+Ynl0ZTwvbGl0ZXJhbD4sIGFzCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+MTwvbGl0ZXJhbD4gY2FuIGJlIHN0b3JlZCBpbiB0aG9zZSB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgbG9zcy4gVGhpcyBpcyBpbXBvcnRhbnQgYXMgdW5saWtlIGluIEphdmEgbGFuZ3VhZ2UsIGluCisgICAgICAgICAgICAgICAgICAgICAgRlRMIHlvdSBkb2Vzbid0IGhhdmUgc3RyaWN0IGNvbnRyb2wgb3ZlciB0aGUgbnVtZXJpY2FsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZXMgKHRoZSB0eXBlIG9mIHRoZSB3cmFwcGVkIG51bWJlciwgYWN0dWFsbHkpLCBhcyBGVEwKKyAgICAgICAgICAgICAgICAgICAgICBoYXMgbm8gdHlwZSBkZWNsYXJhdGlvbnMuIChJZiBtdWx0aXBsZSBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyBhcmUgYXZhaWxhYmxlLCBpdCB3aWxsIHN0aWxsIHRyeSB0byBjaG9zZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBvbmUgd2l0aCB0aGUgc2FtZSBvciBiaWdnZXIgdHlwZSBmaXJzdC4pPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Db252ZXJzaW9uIGZyb20vdG8gPGxpdGVyYWw+QmlnSW50ZWdlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBpcyBub3cgc3VwcG9ydGVkLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICA8cGFyYT5NZXRob2QgY2hvaWNlIGFtYmlndWl0eSBlcnJvcnMgbm93IG9jY3VyIG11Y2ggbGVzcworICAgICAgICAgICAgICAgICAgb2Z0ZW4uIEFtYmlndWl0aWVzIHdhcyBhbmQgYXJlIHJlc29sdmVkIGJ5IHNlbGVjdGluZyB0aGUKKyAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgbWV0aG9kcyB0aGVuIGNob29zaW5nIHRoZSBvbmUgd2l0aCB0aGUgbW9zdAorICAgICAgICAgICAgICAgICAgc3BlY2lmaWMgcGFyYW1ldGVyIHR5cGVzIGFtb25nIHRoZW0uIFRoZSBjaGFuZ2VzIGFyZTo8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5XaGVuIGNvbXBhcmluZyB0aGUgb3ZlcmFsbCBzcGVjaWZpY2l0eSBvZiB0d28KICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgbGlzdHM6IEVhcmxpZXIgdGhlIG1vcmUgc3BlY2lmaWMgcGFyYW1ldGVyCiAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB3YXMgdGhlIG9uZSB0aGF0IGhhZCBzb21lIHBhcmFtZXRlcnMgdGhhdCB3b24gaW4KICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2l0eSwgYW5kIGlmIGJvdGggaGFkIHN1Y2ggcGFyYW1ldGVycyB0aGVuIGl0IHdhcwotICAgICAgICAgICAgICAgICAgICAgIGFuIGFtYmlndWl0eS4gVGhpcyBydWxlIGNoYW5nZXMgaW4gdGhhdCBub3cgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWNpdHkgd2lucyBoYXMgYSBzY29yZSwgYW5kIHRoZSBwYXJhbWV0ZXIgbGlzdAotICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIHBhcmFtZXRlciB3aXRoIHRoZSBoaWdoZXN0IHNjb3JlIHdpbnMuCi0gICAgICAgICAgICAgICAgICAgICAgVGhlIHNjb3JlcyBmcm9tIGxvd2VzdCB0byBoaWdoZXN0OiBwcmltaXRpdmUgd2lucyBvdmVyCi0gICAgICAgICAgICAgICAgICAgICAgYm94aW5nIHR5cGUsIG5hcnJvd2VyIG51bWVyaWNhbCB0eXBlIHdpbnMgb3ZlciB3aWRlcgotICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWNhbCB0eXBlLCBhbmQgc3ViY2xhc3Mgd2lucyBvdmVyCi0gICAgICAgICAgICAgICAgICAgICAgc3VwZXItY2xhc3MuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgIGFuIGFtYmlndWl0eS4gTm93IGl0J3MgZW5vdWdoIGlmIGEgbWV0aG9kIGhhcyBtb3JlIHN1Y2gKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHdoZXJlIGl0J3MgYSBiZXR0ZXIgbWF0Y2ggdGhhbiB0aGUgb3RoZXIgaGFzLAorICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSB0d28gbWV0aG9kcyBhcmUgc3RpbGwgZXF1YWwsIGlmIGl0IGhhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBiZXR0ZXIgbWF0Y2hpbmcgcGFyYW1ldGVyLiBXaGlsZSB0aGlzIGNhbiBsZWFkIHRvCisgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcyB0aGF0IHNlZW0gYXJiaXRyYXJ5IChidXQgYXJlIHN0aWxsCisgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pc3RpYyksIGFzIHRoZXJlIGlzIG5vIGF1dG9tYXRlZCB3YXkgb2YKKyAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlcmluZyBtZXRob2Qgc2VsZWN0aW9uIGFtYmlndWl0aWVzIGluIHRlbXBsYXRlcworICAgICAgICAgICAgICAgICAgICAgICh1bmxpa2UgaW4gSmF2YSBzb3VyY2UgY29kZSwgd2hlcmUgdGhleSB3aWxsIGJlIGRldGVjdGVkCisgICAgICAgICAgICAgICAgICAgICAgZHVyaW5nIGNvbXBpbGF0aW9uKSwgZXNwZWNpYWxseSBhcyBvdmVybG9hZGVkIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgIGhhcyB0byByZWx5IG9uIHRoZSA8ZW1waGFzaXM+cnVudGltZTwvZW1waGFzaXM+IHR5cGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWVzIHdoaWNoIG1ha2VzIHByb3BlciB0ZXN0aW5nIGhhcmQsIHRoaXMgd2FzCisgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJlZCB0byBiZSBhIGJldHRlciBjb21wcm9taXNlIHRoYW4gdGhyb3dpbmcgYW4KKyAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gd2hlbmV2ZXIgdGhlIGNob2ljZSBvZiB0aGUgbWV0aG9kIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgIG9idmlvdXMuIEFsc28gbm90ZSB0aGF0IGluIGZhY3QgaXQncyBtb3JlIGNvbXBsaWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgdGhlbiBjb3VudGluZyB0aGUgPHF1b3RlPndpbm5lcjwvcXVvdGU+IHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucyBmb3IgZWFjaCBtZXRob2RzLCBhcyBjZXJ0YWluIGtpbmQgb2Ygd2lucyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICBzdHJvbmdlciB0aGFuIGFueSBudW1iZXIgb2YgdGhlIG90aGVyczogd2lucyB0aGVyZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICBvdGhlciBwb3NzaWJpbGl0eSBpcyByaXNraW5nIHRoZSBsb3NzIG9mIHN1YnN0YW50aWFsCisgICAgICAgICAgICAgICAgICAgICAgbWFudGlzc2EgcHJlY2lzaW9uIGFyZSB0aGUgc3Ryb25nZXN0IChsaWtlIGRyb3BwaW5nCisgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbHMgdmVyc3VzIG5vdCB0byksIHdpbnMgd2hlcmUgdGhlIHByaW1pdGl2ZSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgd2lucyBvdmVyIHRoZSBib3hlZCBjbGFzcyBpcyB0aGUgd2Vha2VzdCAobGlrZQorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmludDwvbGl0ZXJhbD4gdmVyc3VzCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SW50ZWdlcjwvbGl0ZXJhbD4pLCBzdWJjbGFzc2luZyB3aW5zIChsaWtlCisgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiB2ZXJzdXMKKyAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5PYmplY3Q8L2xpdGVyYWw+KSBhcmUgYmV0d2VlbiB0aGVzZSB0d28uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5XaGVuIGNvbXBhcmluZyB0aGUgc3BlY2lmaWNpdHkgb2YgdHdvIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlcyBhdCB0aGUgc2FtZSBwYXJhbWV0ZXIgcG9zaXRpb246IFRoZSBhbGdvcml0aG0gbm93CisgICAgICAgICAgICAgICAgICAgICAgY29uc2lkZXJzIGEgcHJpbWl0aXZlIHR5cGUgYXMgbW9yZSBzcGVjaWZpYyB0aGF0IGl0cworICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgYm94aW5nIGNsYXNzIChsaWtlIDxsaXRlcmFsPmludDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICBpcyBjb25zaWRlcmVkIHRvIGJlIG1vcmUgc3BlY2lmaWMgdGhhbgorICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkludGVnZXI8L2xpdGVyYWw+KS48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPlRoZSB3YXMgYSBidWcgd2l0aCBvdmVybG9hZGVkIHZhcmFyZ3MgbWV0aG9kcyBvZgorICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBwYXJhbWV0ZXIgY291bnRzLCB3aGVyZSBzb21ldGltZXMgdGhlIGxhc3QKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIG9mIHRoZSBjb21wYXJlZCBtZXRob2RzIHdhcyBpZ25vcmVkLCB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAgIHRha2luZyBhd2F5IGEgcG90ZW50aWFsIGRlY2lkaW5nIGZhY3RvciBhbmQgdGh1cyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICBsZWFkIHRvIGFtYmlndWl0eSBlcnJvci4gV2hldGhlciB0aGlzIGhhcHBlbmVkIGRlcGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIEphdmEgcmVmbGVjdGlvbiBBUEkgaGFzCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgdGhlIG1ldGhvZHMsIHdoaWNoIGlzIHVuZG9jdW1lbnRlZCBhbmQga25vd24gdG8KKyAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgYXQgbGVhc3QgYWZ0ZXIgc29tZSBKYXZhIHVwZGF0ZXMsIGJyZWFraW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLjwvcGFyYT4KICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgogICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CkBAIC0yMDQ2NiwyMSArMjA1NDAsMjMgQEAKICAgICAgICAgICAgICAgICAgIHVud3JhcHBpbmcgaGludCBoYXMgaW5mbHVlbmNlIHdoZW4gdGhlcmUncyBhbiBhbWJpZ3VpdHkKICAgICAgICAgICAgICAgICAgIHJlZ2FyZGluZyBob3cgdG8gY3JlYXRlIGEgSmF2YSBvYmplY3QgZm9ybSBhbiBGVEwgdmFsdWUuIEluCiAgICAgICAgICAgICAgICAgICB0aGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgY2FzZXMsIGEgdG9vIGdlbmVyaWMgaGludCBoYXMgbm8KLSAgICAgICAgICAgICAgICAgIGVmZmVjdC4pIChUaGlzIGlzIGEgaGlnaGx5IHRlY2huaWNhbCB0b3BpYy4gVGhlIGxpbWl0YXRpb24KLSAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcHBsaWVkIGFsZ29yaXRobSBpcyB0aGF0LCBhIHNpbmdsZSBjb21tb24gdW53cmFwcGluZwotICAgICAgICAgICAgICAgICAgaGludCBjbGFzcyBpcyBjaG9zZW4gZm9yIGEgZ2l2ZW4gYXJndW1lbnQgcG9zaXRpb24gc2hhcmVkIGJ5Ci0gICAgICAgICAgICAgICAgICB0aGUgb3ZlcmxvYWRzIHRoYXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBwYXJhbWV0ZXJzLiBUaGUKLSAgICAgICAgICAgICAgICAgIGlzc3VlIHdpdGggdGhlIHRvbyBnZW5lcmljIGhpbnRzIGhhZCBzZXZlcmFsIGluc3RhbmNlczogKGEpCi0gICAgICAgICAgICAgICAgICBXaGVuIHRoZSBtb3N0IHNwZWNpZmljIGNvbW1vbiBjbGFzcy9pbnRlcmZhY2Ugb2YgdHdvCi0gICAgICAgICAgICAgICAgICBzYW1lLXBvc2l0aW9uIHBhcmFtZXRlciB0eXBlcyB3ZXJlIHNlYXJjaGVkLCBpZiB0aGVyZSB3YXMKLSAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGNvbW1vbiBjbGFzcy9pbnRlcmZhY2VzIHRoYXQgaGFkIG5vIHJlbGF0aW9uc2hpcAotICAgICAgICAgICAgICAgICAgKHRoaXMgaXMgYWx3YXlzIGF0IG1vc3Qgb25lIGNsYXNzIGFuZCBvbmUgb3IgbW9yZSB1bnJlbGF0ZWQKLSAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMpLCBkdWUgdG8gdGhlIGFtYmlndWl0eSBpdCBoYXMgZmVsdCBiYWNrIHRvIHVzaW5nCi0gICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5PYmplY3Q8L2xpdGVyYWw+IGFzIHRoZSB1bndyYXBwaW5nIGhpbnQuIE5vdyBpZgotICAgICAgICAgICAgICAgICAgdGhlcmUncyBhIG5vbi08bGl0ZXJhbD5PYmplY3Q8L2xpdGVyYWw+IGNsYXNzIGFtb25nIHRoZW0gaW4KLSAgICAgICAgICAgICAgICAgIHN1Y2ggY2FzZSwgaXQgd2lsbCBiZSBjaG9zZW4gYXMgdGhlIGhpbnQuIE90aGVyd2lzZSBpZiBvbmx5Ci0gICAgICAgICAgICAgICAgICBhIHNpbmdsZSBpbnRlcmZhY2UgcmVtYWlucyBieSByZW1vdmluZwotICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q2xvbmVhYmxlPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgIGVmZmVjdC4pIChUaGlzIGlzIGEgaGlnaGx5IHRlY2huaWNhbCB0b3BpYy4gVGhlIHdheSBpdCB3b3JrcworICAgICAgICAgICAgICAgICAgaXMgdGhhdCBhIHNpbmdsZSBjb21tb24gdW53cmFwcGluZyBoaW50IGNsYXNzIGlzIGNob3NlbiBmb3IKKyAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gYXJndW1lbnQgcG9zaXRpb24gc2hhcmVkIGJ5IHRoZSBvdmVybG9hZHMgdGhhdCBoYXMKKyAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIG51bWJlciBvZiBwYXJhbWV0ZXJzLCBhbmQgdGhhdCBoaW50IGNsYXNzIGhhcyB0byBiZQorICAgICAgICAgICAgICAgICAgYXMgc3BlY2lmaWMgYXMgcG9zc2libGUgd2hpbGUgaXQgbXVzdCBmaXQgYWxsIHRob3NlCisgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdHlwZXMuIFRoZSBpc3N1ZSB3aXRoIHRoZSB0b28gZ2VuZXJpYyBoaW50cyBoYWQKKyAgICAgICAgICAgICAgICAgIHNldmVyYWwgaW5zdGFuY2VzOiAoYSkgV2hlbiB0aGUgbW9zdCBzcGVjaWZpYyBjb21tb24KKyAgICAgICAgICAgICAgICAgIGNsYXNzL2ludGVyZmFjZSBvZiB0d28gc2FtZS1wb3NpdGlvbiBwYXJhbWV0ZXIgdHlwZXMgd2VyZQorICAgICAgICAgICAgICAgICAgc2VhcmNoZWQsIGlmIHRoZXJlIHdhcyBtdWx0aXBsZSBjb21tb24gY2xhc3MvaW50ZXJmYWNlcyB0aGF0CisgICAgICAgICAgICAgICAgICBoYWQgbm8gcmVsYXRpb25zaGlwICh0aGlzIGlzIGFsd2F5cyBhdCBtb3N0IG9uZSBjbGFzcyBhbmQKKyAgICAgICAgICAgICAgICAgIG9uZSBvciBtb3JlIHVucmVsYXRlZCBpbnRlcmZhY2VzKSwgZHVlIHRvIHRoZSBhbWJpZ3VpdHkgaXQKKyAgICAgICAgICAgICAgICAgIGhhcyBmZWx0IGJhY2sgdG8gdXNpbmcgPGxpdGVyYWw+T2JqZWN0PC9saXRlcmFsPiBhcyB0aGUKKyAgICAgICAgICAgICAgICAgIHVud3JhcHBpbmcgaGludC4gTm93IGlmIHRoZXJlJ3MgYQorICAgICAgICAgICAgICAgICAgbm9uLTxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4gY2xhc3MgYW1vbmcgdGhlbSBpbiBzdWNoIGNhc2UsCisgICAgICAgICAgICAgICAgICBpdCB3aWxsIGJlIGNob3NlbiBhcyB0aGUgaGludCAoaS5lLiwgd2UgaWdub3JlIHRoZSBjb21tb24KKyAgICAgICAgICAgICAgICAgIGludGVyZmFjZXMpLiBPdGhlcndpc2UgaWYgb25seSBhIHNpbmdsZSBpbnRlcmZhY2UgcmVtYWlucyBieQorICAgICAgICAgICAgICAgICAgcmVtb3ZpbmcgPGxpdGVyYWw+Q2xvbmVhYmxlPC9saXRlcmFsPiwKICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNlcmlhbGl6YWJsZTwvbGl0ZXJhbD4sIGFuZAogICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q29tcGFyYWJsZTwvbGl0ZXJhbD4gKGluIHRoYXQgb3JkZXIpLCB0aGF0IHdpbGwgYmUKICAgICAgICAgICAgICAgICAgIGNob3Nlbi4gT25seSB0aGVuIGl0IGZhbGxzIGJhY2sgdG8KQEAgLTIwNDg4LDcgKzIwNTY0LDggQEAKICAgICAgICAgICAgICAgICAgIGNsYXNzIG9mIGEgcHJpbWl0aXZlIHR5cGUgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGJveGluZyBjbGFzcwogICAgICAgICAgICAgICAgICAgd2FzIHNvbWV0aW1lcyA8bGl0ZXJhbD5PYmplY3Q8L2xpdGVyYWw+IGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICAgICAgICBib3hpbmcgY2xhc3MuIFRoaXMgZGVwZW5kZWQgb24gSmF2YSdzIHRoZSBpbnRlcm5hbCBvcmRlcmluZwotICAgICAgICAgICAgICAgICAgb2YgdGhlIG1ldGhvZHMsIGFuZCBzbyB3ZXJlIHF1aXRlIHVucHJlZGljdGFibGUuIChjKSBUaGUKKyAgICAgICAgICAgICAgICAgIG9mIHRoZSBtZXRob2RzLCBhbmQgc28gd2VyZSBxdWl0ZSB1bnByZWRpY3RhYmxlLCBsaWtlIGNvdWxkCisgICAgICAgICAgICAgICAgICBjaGFuZ2UgYWZ0ZXIgdXBncmFkaW5nIEphdmEgdW5kZXIgdGhlIGFwcGxpY2F0aW9uLiAoYykgVGhlCiAgICAgICAgICAgICAgICAgICBjb21tb24gc3VwZXJjbGFzcyBvZiBhIG51bWVyaWNhbCBwcmltaXRpdmUgdmFsdWUgYW5kIGEKICAgICAgICAgICAgICAgICAgIG51bWVyaWNhbCBub24tcHJpbWl0aXZlIHZhbHVlIHdhcyBhbHdheXMKICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4sIG5vdyBpZiB0aGV5IGFyZSBwcmltaXRpdmUtYm94aW5nCkBAIC0yMDQ5NywxMiArMjA1NzQsMzggQEAKICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIHdhcyBub3QgdGhlIHNhbWUgaW4gYWxsIHRoZSBvdmVybG9hZGVkIHZhcmFyZ3MKICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIHNvbWV0aW1lcyBzb21lIHZhcmFyZ3MgYXJndW1lbnRzIHdoZXJlIHVud3JhcHBlZAogICAgICAgICAgICAgICAgICAgd2l0aCB0b28gZ2VuZXJpYyBoaW50cy4gV2hlbiB0aGlzIGhhcHBlbmVkIHdhcyB1bnByZWRpY3RhYmxlCi0gICAgICAgICAgICAgICAgICBhcyBpdCBkZXBlbmRlZCBvbiB0aGUgaW50ZXJuYWwgbWV0aG9kIG9yZGVyaW5nLik8L3BhcmE+CisgICAgICAgICAgICAgICAgICBhcyBpdCBkZXBlbmRlZCBvbiB0aGUgaW50ZXJuYWwgbWV0aG9kIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICBhZ2Fpbi4pPC9wYXJhPgogICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgogICAgICAgICAgICAgPC9saXN0aXRlbT4KIAogICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICA8cGFyYT5CdWcgZml4ZWQsIGZpeCBpcyBhY3RpdmUgb25seSBpZiB5b3UgY3JlYXRlIHRoZQorICAgICAgICAgICAgICA8bGl0ZXJhbD5CZWFuc1dyYXBwZXI8L2xpdGVyYWw+LzxsaXRlcmFsPkRlZmF1bHRPYmplY3RXcmFwcGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICB3aXRoIGNvbnN0cnVjdG9yIHBhcmFtZXRlciA8bGl0ZXJhbD5WZXJzaW9uKDIsIDMsIDIxKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgb3IgaGlnaGVyOiBXaGVuIDxsaXRlcmFsPkJlYW5zV3JhcHBlcjwvbGl0ZXJhbD4gKGFuZCBzbyBhbHNvCisgICAgICAgICAgICAgIDxsaXRlcmFsPkRlZmF1bHRPYmplY3RXcmFwcGVyPC9saXRlcmFsPikgaGFzIHVud3JhcHBlZCBtZXRob2QKKyAgICAgICAgICAgICAgY2FsbCBhcmd1bWVudHMgYmVmb3JlIGNhbGxpbmcgYSBKYXZhIG1ldGhvZCwgd2hlbiB0aGUgYXJndW1lbnQKKyAgICAgICAgICAgICAgd2FzIGEgPGxpdGVyYWw+QWRhcHRlclRlbXBsYXRlTW9kZWw8L2xpdGVyYWw+IGFuZCB0aGUgdGFyZ2V0CisgICAgICAgICAgICAgIHBhcmFtZXRlciB0eXBlIHdhcyBwcmltaXRpdmUsCisgICAgICAgICAgICAgIDxsaXRlcmFsPkFkYXB0ZXJUZW1wbGF0ZU1vZGVsLmdldEFkYXB0ZWRPYmplY3QoQ2xhc3MKKyAgICAgICAgICAgICAgaGludCk8L2xpdGVyYWw+IGhhcyByZWNlaXZlZCB0aGUgcHJpbWl0aXZlIHR5cGUgb2YgdGhlIHRhcmdldAorICAgICAgICAgICAgICBwYXJhbWV0ZXIgKGxpa2UgPGxpdGVyYWw+aW50PC9saXRlcmFsPiBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgIDxsaXRlcmFsPkludGVnZXI8L2xpdGVyYWw+KSBhcyB0aGUgaGludC4gVGhpcyBkaWQgbm90IG1ha2Ugc2Vuc2UKKyAgICAgICAgICAgICAgc2luY2UgPGxpdGVyYWw+Z2V0QWRhcHRlZE9iamVjdDwvbGl0ZXJhbD4gY2FuIG9ubHkgcmV0dXJuCisgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4tcywgbm90IHByaW1pdGl2ZSB2YWx1ZXMuIEZ1cnRoZXJtb3JlLAorICAgICAgICAgICAgICA8bGl0ZXJhbD5CZWFuc1dyYXBwZXI8L2xpdGVyYWw+IGhhcyBleHBlY3RlZCB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICAgICAgICAgICAgdG8gYmUgb2YgdGhlIHByaW1pdGl2ZSB0eXBlLCBvdGhlcndpc2UgaXQgaGFzIGRpc2NhcmRlZCBpdC4KKyAgICAgICAgICAgICAgRXhhY3RseSB0aGUgc2FtZSBwcm9ibGVtIG9jY3VycyB3aXRoCisgICAgICAgICAgICAgIDxsaXRlcmFsPldyYXBwZXJUZW1wbGF0ZU1vZGVsPC9saXRlcmFsPi4gVGh1cywgdWx0aW1hdGVseSwgaWYKKyAgICAgICAgICAgICAgdGhlIHRhcmdldCBwYXJhbWV0ZXIgdHlwZSB3YXMgcHJpbWl0aXZlIGFuZCBzb21lIG9mIHRoZXNlCisgICAgICAgICAgICAgIGludGVyZmFjZXMgd2VyZSBpbXBsZW1lbnRlZCwgdGhlaXIgcmV0dXJuIHZhbHVlIHdhcyBhbHdheXMKKyAgICAgICAgICAgICAgZGlzY2FyZGVkLCBpbnN0ZWFkIEZyZWVNYXJrZXIgaGFzIGZlbHQgYmFjayB0byBvdGhlciBtZWFucyBvZgorICAgICAgICAgICAgICB1bndyYXBwaW5nLjwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+UGFyc2VFeGNlcHRpb248L2xpdGVyYWw+LXMgbm93IGFsc28gc3RvcmUgdGhlCiAgICAgICAgICAgICAgIGVuZC1sb2NhdGlvbiBvZiB0aGUgZXJyb3IsIG5vdCBqdXN0IGl0cyBzdGFydC1sb2NhdGlvbi4gVGhpcyBpcwogICAgICAgICAgICAgICB1c2VmdWwgaWYgeW91IHdhbnQgdG8gdW5kZXJsaW5lIHRoZSBlcnJvciBpbiB0aGUgc291cmNlIGNvZGUsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0JlYW5zV3JhcHBlcldpdGhTaG9ydGVkTWV0aG9kcy5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9CZWFuc1dyYXBwZXJXaXRoU2hvcnRlZE1ldGhvZHMuamF2YQppbmRleCBkZTE2N2ViLi4wYWVlMjk5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0JlYW5zV3JhcHBlcldpdGhTaG9ydGVkTWV0aG9kcy5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQmVhbnNXcmFwcGVyV2l0aFNob3J0ZWRNZXRob2RzLmphdmEKQEAgLTI3LDEzICsyNywxMiBAQAogICAgIEBPdmVycmlkZQogICAgIE1ldGhvZERlc2NyaXB0b3JbXSBzaG9ydE1ldGhvZERlc2NyaXB0b3JzKE1ldGhvZERlc2NyaXB0b3JbXSBtZXRob2REZXNjcmlwdG9ycykgewogICAgICAgICBBcnJheUxpc3Q8TWV0aG9kRGVzY3JpcHRvcj4gbHMgPSBuZXcgQXJyYXlMaXN0PE1ldGhvZERlc2NyaXB0b3I+KEFycmF5cy5hc0xpc3QobWV0aG9kRGVzY3JpcHRvcnMpKTsKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxzLCBuZXcgQ29tcGFyYXRvcjxNZXRob2REZXNjcmlwdG9yPigpIHsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZXRob2REZXNjcmlwdG9yIG8xLCBNZXRob2REZXNjcmlwdG9yIG8yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gbzEuZ2V0TWV0aG9kKCkudG9TdHJpbmcoKS5jb21wYXJlVG8obzIuZ2V0TWV0aG9kKCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYyA/IC1yZXMgOiByZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChscywgbmV3IENvbXBhcmF0b3I8TWV0aG9kRGVzY3JpcHRvcj4oKSB7CisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWV0aG9kRGVzY3JpcHRvciBvMSwgTWV0aG9kRGVzY3JpcHRvciBvMikgeworICAgICAgICAgICAgICAgIGludCByZXMgPSBvMS5nZXRNZXRob2QoKS50b1N0cmluZygpLmNvbXBhcmVUbyhvMi5nZXRNZXRob2QoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzYyA/IC1yZXMgOiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwogICAgICAgICByZXR1cm4gbHMudG9BcnJheShuZXcgTWV0aG9kRGVzY3JpcHRvcltscy5zaXplKCldKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQ29tbW9uU3VwZXJ0eXBlRm9yVW53cmFwcGluZ0hpbnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0NvbW1vblN1cGVydHlwZUZvclVud3JhcHBpbmdIaW50VGVzdC5qYXZhCmluZGV4IGQ1Yjg3NzUuLjk3NzE4ZGEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvQ29tbW9uU3VwZXJ0eXBlRm9yVW53cmFwcGluZ0hpbnRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9Db21tb25TdXBlcnR5cGVGb3JVbndyYXBwaW5nSGludFRlc3QuamF2YQpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgdm9pZCBhZnRlcldpZGVuaW5nVW53cmFwcGluZ0hpbnRzKENsYXNzW10gcGFyYW1UeXBlcykgeworICAgICAgICB2b2lkIGFmdGVyV2lkZW5pbmdVbndyYXBwaW5nSGludHMoQ2xhc3NbXSBwYXJhbVR5cGVzLCBpbnRbXSBwYXJhbU51bWVyaWNhbFR5cGVzKSB7CiAgICAgICAgICAgICAvLyBEbyBub3RoaW5nCiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9Jc0FwcGxpY2FibGVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL0lzQXBwbGljYWJsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI3NDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9Jc0FwcGxpY2FibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKK3BhY2thZ2UgZnJlZW1hcmtlci5leHQuYmVhbnM7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCitwdWJsaWMgY2xhc3MgSXNBcHBsaWNhYmxlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBJc0FwcGxpY2FibGVUZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlKCkgeworICAgICAgICBBcmd1bWVudFR5cGVzIGF0cyA9IG5ldyBBcmd1bWVudFR5cGVzKG5ldyBPYmplY3RbXSB7IG5ldyBPYmplY3QoKSB9LCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgQ2hhclNlcXVlbmNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgSW50ZWdlci5UWVBFKTsKKyAgICAgICAgCisgICAgICAgIGF0cyA9IG5ldyBBcmd1bWVudFR5cGVzKG5ldyBPYmplY3RbXSB7ICIiIH0sIHRydWUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIENoYXJTZXF1ZW5jZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBJbnRlZ2VyLlRZUEUpOworCisgICAgICAgIGF0cyA9IG5ldyBBcmd1bWVudFR5cGVzKG5ldyBPYmplY3RbXSB7IDEgfSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBPYmplY3QuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgQ2hhclNlcXVlbmNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBTaG9ydC5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBTaG9ydC5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgSW50ZWdlci5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEZsb2F0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEZsb2F0LlRZUEUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgRG91YmxlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIERvdWJsZS5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEJpZ0RlY2ltYWwuY2xhc3MpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgQmlnSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgYXRzID0gbmV3IEFyZ3VtZW50VHlwZXMobmV3IE9iamVjdFtdIHsgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJPckJ5dGUoMSwgKGJ5dGUpIDEpIH0sIHRydWUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIENoYXJTZXF1ZW5jZS5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgU2hvcnQuY2xhc3MpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgU2hvcnQuVFlQRSk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEludGVnZXIuVFlQRSk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBGbG9hdC5jbGFzcyk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBGbG9hdC5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIERvdWJsZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBEb3VibGUuVFlQRSk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBCaWdEZWNpbWFsLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEJpZ0ludGVnZXIuY2xhc3MpOworICAgICAgICAKKyAgICAgICAgYXRzID0gbmV3IEFyZ3VtZW50VHlwZXMobmV3IE9iamVjdFtdIHsgMS4wZiB9LCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBDaGFyU2VxdWVuY2UuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgSW50ZWdlci5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEZsb2F0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEZsb2F0LlRZUEUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgRG91YmxlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIERvdWJsZS5UWVBFKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIEJpZ0RlY2ltYWwuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgQmlnSW50ZWdlci5jbGFzcyk7CisgICAgICAgIAorICAgICAgICBhdHMgPSBuZXcgQXJndW1lbnRUeXBlcyhuZXcgT2JqZWN0W10geyBudWxsIH0sIHRydWUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIEludGVnZXIuVFlQRSk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBCb29sZWFuLlRZUEUpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MpOworICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cyk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aSgpIHsKKyAgICAgICAgQXJndW1lbnRUeXBlcyBhdHMgPSBuZXcgQXJndW1lbnRUeXBlcyhuZXcgT2JqZWN0W10geyBuZXcgT2JqZWN0KCksICIiLCAxLCB0cnVlIH0sIHRydWUpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcywgU3RyaW5nLmNsYXNzLCBOdW1iZXIuY2xhc3MsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgT2JqZWN0LmNsYXNzLCBDaGFyU2VxdWVuY2UuY2xhc3MsIEludGVnZXIuY2xhc3MsIFNlcmlhbGl6YWJsZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCBPYmplY3QuY2xhc3MsIENvbXBhcmFibGUuY2xhc3MsIEludGVnZXIuVFlQRSwgU2VyaWFsaXphYmxlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcywgU3RyaW5nLmNsYXNzLCBOdW1iZXIuY2xhc3MsIE51bWJlci5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBPYmplY3QuY2xhc3MsIFN0cmluZ0J1ZmZlci5jbGFzcywgTnVtYmVyLmNsYXNzLCBCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIGludC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzKTsKKyAgICB9ICAgIAorCisgICAgcHVibGljIHZvaWQgdGVzdE5vUGFyYW0oKSB7CisgICAgICAgIEFyZ3VtZW50VHlwZXMgYXRzID0gbmV3IEFyZ3VtZW50VHlwZXMobmV3IE9iamVjdFtdIHsgfSwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzKTsKKyAgICAgICAgYXNzZXJ0Tm90QXBwbGljYWJsZShhdHMsIE9iamVjdC5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmFncygpIHsKKyAgICAgICAgT2JqZWN0W11bXSBhcmdMaXN0cyA9IG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICIiLCAxLCAyLCAzIH0sCisgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAiIiwgMSwgKGJ5dGUpIDIsIDMgfSwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICIiLCAxfSwKKyAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICIiIH0sCisgICAgICAgIH07CisgICAgICAgIGZvciAoT2JqZWN0W10gYXJncyA6IGFyZ0xpc3RzKSB7CisgICAgICAgICAgICBBcmd1bWVudFR5cGVzIGF0cyA9IG5ldyBBcmd1bWVudFR5cGVzKGFyZ3MsIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIHRydWUsIFN0cmluZy5jbGFzcywgaW50W10uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIHRydWUsIFN0cmluZy5jbGFzcywgSW50ZWdlcltdLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEFwcGxpY2FibGUoYXRzLCB0cnVlLCBPYmplY3QuY2xhc3MsIENvbXBhcmFibGVbXS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRBcHBsaWNhYmxlKGF0cywgdHJ1ZSwgT2JqZWN0LmNsYXNzLCBPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnROb3RBcHBsaWNhYmxlKGF0cywgdHJ1ZSwgU3RyaW5nQnVpbGRlci5jbGFzcywgaW50W10uY2xhc3MpOworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCB0cnVlLCBTdHJpbmcuY2xhc3MsIFN0cmluZ1tdLmNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIHRydWUsIFN0cmluZy5jbGFzcywgU3RyaW5nW10uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb3RBcHBsaWNhYmxlKEFyZ3VtZW50VHlwZXMgYXRzLCBDbGFzcy4uLiBwYXJhbVR5cGVzKSB7CisgICAgICAgIGFzc2VydE5vdEFwcGxpY2FibGUoYXRzLCBmYWxzZSwgcGFyYW1UeXBlcyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBhc3NlcnROb3RBcHBsaWNhYmxlKEFyZ3VtZW50VHlwZXMgYXRzLCBib29sZWFuIHZhcmFyZ3MsIENsYXNzLi4uIHBhcmFtVHlwZXMpIHsKKyAgICAgICAgTGlzdCB0ZXN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIHRlc3RlZC5hZGQobmV3IENhbGxhYmxlTWVtYmVyRGVzY3JpcHRvcigoTWV0aG9kKSBudWxsLCBwYXJhbVR5cGVzKSk7CisgICAgICAgIGlmIChhdHMuZ2V0QXBwbGljYWJsZXModGVzdGVkLCB2YXJhcmdzKS5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZmFpbCgiUGFyYW1ldGVyIHR5cGVzIHdlcmUgYXBwbGljYWJsZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFwcGxpY2FibGUoQXJndW1lbnRUeXBlcyBhdHMsIENsYXNzPD8+Li4uIHBhcmFtVHlwZXMpIHsKKyAgICAgICAgYXNzZXJ0QXBwbGljYWJsZShhdHMsIGZhbHNlLCBwYXJhbVR5cGVzKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydEFwcGxpY2FibGUoQXJndW1lbnRUeXBlcyBhdHMsIGJvb2xlYW4gdmFyYXJncywgQ2xhc3M8Pz4uLi4gcGFyYW1UeXBlcykgeworICAgICAgICBMaXN0IHRlc3RlZCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdGVzdGVkLmFkZChuZXcgQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKChNZXRob2QpIG51bGwsIHBhcmFtVHlwZXMpKTsKKyAgICAgICAgaWYgKGF0cy5nZXRBcHBsaWNhYmxlcyh0ZXN0ZWQsIHZhcmFyZ3MpLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICBmYWlsKCJQYXJhbWV0ZXIgdHlwZXMgd2VyZW4ndCBhcHBsaWNhYmxlIik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvTWlzY051bWVyaWNhbE9wZXJhdGlvbnNUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL01pc2NOdW1lcmljYWxPcGVyYXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWY0ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL01pc2NOdW1lcmljYWxPcGVyYXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACitwYWNrYWdlIGZyZWVtYXJrZXIuZXh0LmJlYW5zOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5WZXJzaW9uOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitwdWJsaWMgY2xhc3MgTWlzY051bWVyaWNhbE9wZXJhdGlvbnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIE1pc2NOdW1lcmljYWxPcGVyYXRpb25zVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKCkgeworICAgICAgICAvLyBVc3VhbCB0eXBlIHRvIHRvIGFsbCBvdGhlciB0eXBlczoKKyAgICAgICAgRG91YmxlIG4gPSBEb3VibGUudmFsdWVPZigxMjMuNzUpOworICAgICAgICBhc3NlcnRFcXVhbHMoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIFNob3J0LmNsYXNzLCBmYWxzZSksIFNob3J0LnZhbHVlT2Yobi5zaG9ydFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShuLCBTaG9ydC5UWVBFLCBmYWxzZSksIFNob3J0LnZhbHVlT2Yobi5zaG9ydFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShuLCBCeXRlLmNsYXNzLCBmYWxzZSksIEJ5dGUudmFsdWVPZihuLmJ5dGVWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgQnl0ZS5UWVBFLCBmYWxzZSksIEJ5dGUudmFsdWVPZihuLmJ5dGVWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgSW50ZWdlci5jbGFzcywgZmFsc2UpLCBJbnRlZ2VyLnZhbHVlT2Yobi5pbnRWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgSW50ZWdlci5UWVBFLCBmYWxzZSksIEludGVnZXIudmFsdWVPZihuLmludFZhbHVlKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShuLCBMb25nLmNsYXNzLCBmYWxzZSksIExvbmcudmFsdWVPZihuLmxvbmdWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgTG9uZy5UWVBFLCBmYWxzZSksIExvbmcudmFsdWVPZihuLmxvbmdWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgRmxvYXQuY2xhc3MsIGZhbHNlKSwgRmxvYXQudmFsdWVPZihuLmZsb2F0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIEZsb2F0LlRZUEUsIGZhbHNlKSwgRmxvYXQudmFsdWVPZihuLmZsb2F0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShuLCBEb3VibGUuY2xhc3MsIGZhbHNlKSA9PSBuKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgRG91YmxlLlRZUEUsIGZhbHNlKSA9PSBuKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobiwgQmlnSW50ZWdlci5jbGFzcywgZmFsc2UpLCBuZXcgQmlnSW50ZWdlcigiMTIzIikpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIEJpZ0ludGVnZXIuY2xhc3MsIHRydWUpLCBuZXcgQmlnSW50ZWdlcigiMTIzIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIEJpZ0RlY2ltYWwuY2xhc3MsIGZhbHNlKSwgbmV3IEJpZ0RlY2ltYWwoIjEyMy43NSIpKTsKKyAgICAgICAgCisgICAgICAgIC8vIENhc2VzIG9mIGNvbnZlcnNpb24gdG8gQmlnRGVjaW1hbDoKKyAgICAgICAgQmlnRGVjaW1hbCBiZCA9IG5ldyBCaWdEZWNpbWFsKCIxMjMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShuZXcgQmlnSW50ZWdlcigiMTIzIiksIEJpZ0RlY2ltYWwuY2xhc3MsIGZhbHNlKSwgYmQpOworICAgICAgICBhc3NlcnRUcnVlKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShiZCwgQmlnRGVjaW1hbC5jbGFzcywgZmFsc2UpID09IGJkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShMb25nLnZhbHVlT2YoMTIzKSwgQmlnRGVjaW1hbC5jbGFzcywgZmFsc2UpLCBiZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUoRG91YmxlLnZhbHVlT2YoMTIzKSwgQmlnRGVjaW1hbC5jbGFzcywgZmFsc2UpLCBiZCk7CisgICAgICAgIAorICAgICAgICAvLyBDYXNlcyBvZiBjb252ZXJzaW9uIHRvIEJpZ0ludGVnZXI6CisgICAgICAgIEJpZ0ludGVnZXIgYmkgPSBuZXcgQmlnSW50ZWdlcigiMTIzIik7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUobmV3IEJpZ0RlY2ltYWwoIjEyMy42IiksIEJpZ0ludGVnZXIuY2xhc3MsIHRydWUpLCBiaSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUoCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJCaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKCIxMjMiKSksIEJpZ0ludGVnZXIuY2xhc3MsIHRydWUpLCBiaSk7CisgICAgICAgIGFzc2VydFRydWUoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKGJpLCBCaWdJbnRlZ2VyLmNsYXNzLCB0cnVlKSA9PSBiaSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUoTG9uZy52YWx1ZU9mKDEyMyksIEJpZ0ludGVnZXIuY2xhc3MsIHRydWUpLCBiaSk7CisgICAgICAgIGFzc2VydEVxdWFscyhCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUoRG91YmxlLnZhbHVlT2YoMTIzLjYpLCBCaWdJbnRlZ2VyLmNsYXNzLCB0cnVlKSwgYmkpOworCisgICAgICAgIGFzc2VydFRydWUoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIE51bWJlci5jbGFzcywgdHJ1ZSkgPT0gbik7CisgICAgICAgIGFzc2VydE51bGwoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKG4sIFJhdGlvbmFsTnVtYmVyLmNsYXNzLCB0cnVlKSk7CisgICAgICAgIFJhdGlvbmFsTnVtYmVyIHIgPSBuZXcgUmF0aW9uYWxOdW1iZXIoMSwgMik7CisgICAgICAgIGFzc2VydFRydWUoQmVhbnNXcmFwcGVyLmZvcmNlVW53cmFwcGVkTnVtYmVyVG9UeXBlKHIsIFJhdGlvbmFsTnVtYmVyLmNsYXNzLCB0cnVlKSA9PSByKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShCZWFuc1dyYXBwZXIuZm9yY2VVbndyYXBwZWROdW1iZXJUb1R5cGUociwgTnVtYmVyLmNsYXNzLCB0cnVlKSA9PSByKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShyLCBEb3VibGUuY2xhc3MsIHRydWUpLCBEb3VibGUudmFsdWVPZigwLjUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShyLCBCaWdEZWNpbWFsLmNsYXNzLCB0cnVlKSwgbmV3IEJpZ0RlY2ltYWwoIjAuNSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEJlYW5zV3JhcHBlci5mb3JjZVVud3JhcHBlZE51bWJlclRvVHlwZShyLCBCaWdJbnRlZ2VyLmNsYXNzLCB0cnVlKSwgQmlnSW50ZWdlci5aRVJPKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisgICAgcHVibGljIHZvaWQgdGVzdEZvcmNlTnVtYmVyQXJndW1lbnRzVG9QYXJhbWV0ZXJUeXBlcygpIHsKKyAgICAgICAgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQgb21zID0gbmV3IE92ZXJsb2FkZWRGaXhBcmdzTWV0aG9kcyhuZXcgQmVhbnNXcmFwcGVyKG5ldyBWZXJzaW9uKDIsIDMsIDIxKSkpOworICAgICAgICBDbGFzc1tdIHBhcmFtVHlwZXMgPSBuZXcgQ2xhc3NbXSB7IFNob3J0LlRZUEUsIFNob3J0LmNsYXNzLCBEb3VibGUuVFlQRSwgQmlnRGVjaW1hbC5jbGFzcywgQmlnSW50ZWdlci5jbGFzcyB9OworICAgICAgICBPYmplY3RbXSBhcmdzOworICAgICAgICAKKyAgICAgICAgYXJncyA9IG5ld0FyZ3MoKTsKKyAgICAgICAgb21zLmZvcmNlTnVtYmVyQXJndW1lbnRzVG9QYXJhbWV0ZXJUeXBlcyhhcmdzLCBwYXJhbVR5cGVzLCBuZXcgaW50W10geyAweEZGRkYsIDB4RkZGRiwgMHhGRkZGLCAweEZGRkYsIDB4RkZGRiB9KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgKHNob3J0KSAxMjMsIChzaG9ydCkgMTIzLCAxMjMuNzUsIG5ldyBCaWdEZWNpbWFsKCIxMjMuNzUiKSwgQmlnSW50ZWdlci52YWx1ZU9mKDEyMykgfSk7CisgICAgICAgIAorICAgICAgICBhcmdzID0gbmV3QXJncygpOworICAgICAgICBvbXMuZm9yY2VOdW1iZXJBcmd1bWVudHNUb1BhcmFtZXRlclR5cGVzKGFyZ3MsIHBhcmFtVHlwZXMsIG5ldyBpbnRbXSB7IDAsIDAsIDAsIDAsIDAgfSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhhcmdzLCBuZXdBcmdzKCkpOworICAgICAgICAKKyAgICAgICAgYXJncyA9IG5ld0FyZ3MoKTsKKyAgICAgICAgb21zLmZvcmNlTnVtYmVyQXJndW1lbnRzVG9QYXJhbWV0ZXJUeXBlcyhhcmdzLCBwYXJhbVR5cGVzLCBuZXcgaW50W10geyA4LCA4LCA4LCA4LCA4IH0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMoYXJncywgbmV3QXJncygpKTsKKyAgICAgICAgCisgICAgICAgIGFyZ3MgPSBuZXdBcmdzKCk7CisgICAgICAgIG9tcy5mb3JjZU51bWJlckFyZ3VtZW50c1RvUGFyYW1ldGVyVHlwZXMoYXJncywgcGFyYW1UeXBlcywgbmV3IGludFtdIHsgMHhGRkZGLCAwLCAweEZGRkYsIDAsIDB4RkZGRiB9KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzKAorICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgKHNob3J0KSAxMjMsIDEyMy43NSwgMTIzLjc1LCAxMjMuNzUsIEJpZ0ludGVnZXIudmFsdWVPZigxMjMpIH0pOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorICAgIHByaXZhdGUgT2JqZWN0W10gbmV3QXJncygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RbXSB7IDEyMy43NSwgMTIzLjc1LCAxMjMuNzUsIDEyMy43NSwgMTIzLjc1IH07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRNZXRob2RzTnVtZXJpY2FsRmxhZ3NUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL092ZXJsb2FkZWRNZXRob2RzTnVtZXJpY2FsRmxhZ3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjNTg5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE1ldGhvZHNOdW1lcmljYWxGbGFnc1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzOCBAQAorcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKKworaW1wb3J0IGphdmEuYmVhbnMuTWV0aG9kRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLlZlcnNpb247CisKK3B1YmxpYyBjbGFzcyBPdmVybG9hZGVkTWV0aG9kc051bWVyaWNhbEZsYWdzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKworICAgIHB1YmxpYyBPdmVybG9hZGVkTWV0aG9kc051bWVyaWNhbEZsYWdzVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBCZWFuc1dyYXBwZXIgYncgPSBuZXcgQmVhbnNXcmFwcGVyKG5ldyBWZXJzaW9uKDIsIDMsIDIxKSk7IAorCisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZU51bVR5cGUoKSB7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFNpbmdsZVR5cGVDLmNsYXNzLCAibUludCIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQpOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhTaW5nbGVUeXBlQy5jbGFzcywgIm1Mb25nIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcpOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhTaW5nbGVUeXBlQy5jbGFzcywgIm1TaG9ydCIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVCk7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFNpbmdsZVR5cGVDLmNsYXNzLCAibUJ5dGUiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfQllURSwKKyAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoU2luZ2xlVHlwZUMuY2xhc3MsICJtRG91YmxlIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFNpbmdsZVR5cGVDLmNsYXNzLCAibUZsb2F0IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoU2luZ2xlVHlwZUMuY2xhc3MsICJtVW5rbm93biIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19VTktOT1dOX1RZUEUpOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoU2luZ2xlVHlwZUMuY2xhc3MsICJtVmFyUGFyYW1DbnQiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfQklHX0RFQ0lNQUwpOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhTaW5nbGVUeXBlQy5jbGFzcywgIm1WYXJQYXJhbUNudCIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CSUdfSU5URUdFUiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFNpbmdsZVR5cGVDLmNsYXNzLCAibVZhclBhcmFtQ250IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FULAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUik7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBwdWJsaWMgY2xhc3MgU2luZ2xlVHlwZUMgeworICAgICAgICBwdWJsaWMgdm9pZCBtSW50KGludCBhMSwgU3RyaW5nIGEyKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbUludChpbnQgYTEsIGludCBhMikgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG1Mb25nKGxvbmcgYTEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtTG9uZyhMb25nIGExKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbVNob3J0KHNob3J0IGExKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbUJ5dGUoYnl0ZSBhMSwgYm9vbGVhbiBhMikgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG1CeXRlKGJ5dGUgYTEsIFN0cmluZyBhMikgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG1CeXRlKGJ5dGUgYTEsIE9iamVjdCBhMikgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG1Eb3VibGUoZG91YmxlIGExKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbUZsb2F0KGZsb2F0IGExKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbVVua25vd24oUmF0aW9uYWxOdW1iZXIgYTEpIHsgfTsKKyAgICAgICAgcHVibGljIHZvaWQgbVZhclBhcmFtQ250KEJpZ0RlY2ltYWwgYTEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtVmFyUGFyYW1DbnQoQmlnSW50ZWdlciBhMSwgRG91YmxlIGEyKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbVZhclBhcmFtQ250KERvdWJsZSBhMSwgRmxvYXQgYTIsIEludGVnZXIgYTMpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtVmFyUGFyYW1DbnQoT2JqZWN0IGExLCBjaGFyIGEyLCBib29sZWFuIGEzLCBGaWxlIGE0LCBNYXAgYTUsIEJvb2xlYW4gYTYpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtVmFyUGFyYW1DbnQoTG9uZyBhMSwgaW50IGEyLCBzaG9ydCBhMywgYnl0ZSBhNCwgZG91YmxlIGE1LCBmbG9hdCBhNikgeyB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTnVtVHlwZSgpIHsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoTXVsdGlUeXBlQy5jbGFzcywgIm0xIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UIAorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CWVRFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoTXVsdGlUeXBlQy5jbGFzcywgIm0yIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UIAorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVCB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfTE9ORyB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKE11bHRpVHlwZUMuY2xhc3MsICJtMyIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVCAKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfQklHX0RFQ0lNQUx8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfQklHX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CSUdfSU5URUdFUiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JJR19ERUNJTUFMIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19VTktOT1dOX1RZUEUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoTXVsdGlUeXBlQy5jbGFzcywgIm00IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhNdWx0aVR5cGVDLmNsYXNzLCAibTUiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhNdWx0aVR5cGVDLmNsYXNzLCAibTYiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUgorICAgICAgICAgICAgICAgICk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRQb3NzaWJsZVBhcmFtVHlwZXMoTXVsdGlUeXBlQy5jbGFzcywgIm02IiwgZmFsc2UsIDIpLCBPdmVybG9hZGVkTWV0aG9kc1N1YnNldC5BTExfWkVST1NfQVJSQVkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UG9zc2libGVQYXJhbVR5cGVzKE11bHRpVHlwZUMuY2xhc3MsICJtNiIsIHRydWUsIDIpLCBPdmVybG9hZGVkTWV0aG9kc1N1YnNldC5BTExfWkVST1NfQVJSQVkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UG9zc2libGVQYXJhbVR5cGVzKE11bHRpVHlwZUMuY2xhc3MsICJtNiIsIGZhbHNlLCAzKSwgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQuQUxMX1pFUk9TX0FSUkFZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFBvc3NpYmxlUGFyYW1UeXBlcyhNdWx0aVR5cGVDLmNsYXNzLCAibTYiLCB0cnVlLCAzKSwgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQuQUxMX1pFUk9TX0FSUkFZKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoTXVsdGlUeXBlQy5jbGFzcywgIm02IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSwKKyAgICAgICAgICAgICAgICAwCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBNdWx0aVR5cGVDIHsKKyAgICAgICAgcHVibGljIHZvaWQgbTEoYnl0ZSBhMSkgeyB9OworICAgICAgICBwdWJsaWMgdm9pZCBtMShpbnQgYTEpIHsgfTsKKyAgICAgICAgcHVibGljIHZvaWQgbTEoZG91YmxlIGEyKSB7IH07CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMihzaG9ydCBhMSkgeyB9OworICAgICAgICBwdWJsaWMgdm9pZCBtMihsb25nIGExKSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG0yKGZsb2F0IGExKSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG0yKGNoYXIgYTEpIHsgfTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG0zKEJpZ0ludGVnZXIgYTEsIEJpZ0ludGVnZXIgYTIsIEJpZ0RlY2ltYWwgYTMpIHsgfTsKKyAgICAgICAgcHVibGljIHZvaWQgbTMoQmlnRGVjaW1hbCBhMSwgQmlnSW50ZWdlciBhMiwgUmF0aW9uYWxOdW1iZXIgYTMpIHsgfTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG00KGZsb2F0IGExKSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG00KGNoYXIgYTEpIHsgfTsKKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG01KEZsb2F0IGExKSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG01KERvdWJsZSBhMSkgeyB9OworICAgICAgICBwdWJsaWMgdm9pZCBtNShFbnVtIGExKSB7IH07CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtNihpbnQgYTEpIHsgfTsKKyAgICAgICAgcHVibGljIHZvaWQgbTYoU3RyaW5nIGExLCBjaGFyIGEyKSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG02KFN0cmluZyBhMSwgY2hhciBhMiwgYm9vbGVhbiBhMykgeyB9OworICAgICAgICBwdWJsaWMgdm9pZCBtNihTdHJpbmcgYTEsIGNoYXIgYTIsIGNoYXIgYTMpIHsgfTsKKyAgICAgICAgcHVibGljIHZvaWQgbTYoZG91YmxlIGExLCBpbnQgYTIsIFN0cmluZyBhMywgU3RyaW5nIGE0KSB7IH07CisgICAgICAgIHB1YmxpYyB2b2lkIG02KFN0cmluZyBhMSwgaW50IGEyLCBkb3VibGUgYTMsIFN0cmluZyBhNCkgeyB9OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJBcmdzKCkgeworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm0xIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIKKyAgICAgICAgICAgICAgICApOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm0yIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMyIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMyIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMyIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5ULAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JJR19ERUNJTUFMIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm00IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtNSIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgCisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFZhckFyZ3NDLmNsYXNzLCAibTYiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfTE9ORyB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtNyIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CWVRFCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5ULAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVAorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVAorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtOCIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVAorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm05IiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JZVEUKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMTAiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRQorICAgICAgICAgICAgICAgICk7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKFZhckFyZ3NDLmNsYXNzLCAibTEwIiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMTEiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfU0hPUlQKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICApOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm0xMSIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVAorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVCwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRQorICAgICAgICAgICAgICAgIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19XSURFTkVEX1VOV1JBUFBJTkdfSElOVAorICAgICAgICAgICAgICAgICk7CisgICAgICAgIAorICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm0xMiIsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMTIiLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfU0hPUlQKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JZVEUKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUKKyAgICAgICAgICAgICAgICB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfV0lERU5FRF9VTldSQVBQSU5HX0hJTlQKKyAgICAgICAgICAgICAgICApOworICAgICAgICAKKyAgICAgICAgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoVmFyQXJnc0MuY2xhc3MsICJtMTMiLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUpOworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhWYXJBcmdzQy5jbGFzcywgIm0xMyIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfVU5LTk9XTl9UWVBFCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5ULAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HCisgICAgICAgICAgICAgICAgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1dJREVORURfVU5XUkFQUElOR19ISU5UCisgICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHB1YmxpYyBjbGFzcyBWYXJBcmdzQyB7CisgICAgICAgIHB1YmxpYyB2b2lkIG0xKGludC4uLiB2YSkgeyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMihkb3VibGUgYTEsIGludC4uLiB2YSkgeyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMyhpbnQuLi4gdmEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtMyhpbnQgYTEsIGRvdWJsZS4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG0zKGludCBhMSwgZG91YmxlIGEyLCBCaWdEZWNpbWFsLi4uIHZhKSB7IH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG00KGludC4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG00KGxvbmcuLi4gdmEpIHsgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG01KExvbmcuLi4gdmEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtNShsb25nLi4uIHZhKSB7IH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG02KGxvbmcuLi4gdmEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtNihTdHJpbmcuLi4gdmEpIHsgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIHZvaWQgbTcoaW50IGExLCBkb3VibGUuLi4gdmEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtNyhieXRlIGExLCBmbG9hdC4uLiB2YSkgeyB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbTgoaW50IGExLCBkb3VibGUuLi4gdmEpIHsgfQorICAgICAgICBwdWJsaWMgdm9pZCBtOChpbnQgYTEsIGZsb2F0Li4uIHZhKSB7IH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG05KGludCBhMSwgZG91YmxlLi4uIHZhKSB7IH0KKyAgICAgICAgcHVibGljIHZvaWQgbTkoYnl0ZSBhMSwgZG91YmxlLi4uIHZhKSB7IH0KKyAgICAgICAgCisgICAgICAgIHB1YmxpYyB2b2lkIG0xMChpbnQgYTEsIGRvdWJsZSBhMiwgbG9uZy4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG0xMChpbnQgYTEsIGRvdWJsZS4uLiB2YSkgeyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMTEoaW50IGExLCBzaG9ydCBhMiwgbG9uZy4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG0xMShpbnQgYTEsIGRvdWJsZS4uLiB2YSkgeyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMTIoaW50IGExLCBzaG9ydCBhMiwgYnl0ZSBhMywgbG9uZy4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG0xMihpbnQgYTEsIGRvdWJsZS4uLiB2YSkgeyB9CisgICAgICAgIAorICAgICAgICBwdWJsaWMgdm9pZCBtMTMoY2hhciBhMSwgZG91YmxlIGEyLCBSYXRpb25hbE51bWJlciBhMywgTG9uZy4uLiB2YSkgeyB9CisgICAgICAgIHB1YmxpYyB2b2lkIG0xMyhjaGFyIGExLCBEb3VibGUuLi4gdmEpIHsgfQorICAgIH0KKworICAgIHByaXZhdGUgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQgbmV3T3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQoQ2xhc3MgY2wsIFN0cmluZyBtZXRob2ROYW1lLCBmaW5hbCBib29sZWFuIGRlc2MpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kW10gbXMgPSBjbC5nZXRNZXRob2RzKCk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBMaXN0PE1ldGhvZD4gZmlsdGVyZWRNZXRob2RzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogbXMpIHsKKyAgICAgICAgICAgIGlmIChtLmdldE5hbWUoKS5lcXVhbHMobWV0aG9kTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZE1ldGhvZHMuYWRkKG0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEFzIHRoZSBvcmRlciBpbiB3aGljaCBnZXRNZXRob2RzKCkgcmV0dXJucyB0aGUgbWV0aG9kcyBpcyB1bmRlZmluZWQsIHdlIHNvcnQgdGhlbSBmb3IgdGVzdCBwcmVkaWN0YWJpbGl0eTogCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoZmlsdGVyZWRNZXRob2RzLCBuZXcgQ29tcGFyYXRvcjxNZXRob2Q+KCkgeworICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1ldGhvZCBvMSwgTWV0aG9kIG8yKSB7CisgICAgICAgICAgICAgICAgaW50IHJlcyA9IG8xLnRvU3RyaW5nKCkuY29tcGFyZVRvKG8yLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBkZXNjID8gLXJlcyA6IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICBmaW5hbCBPdmVybG9hZGVkTWV0aG9kc1N1YnNldCBvbXMgPSBjbC5nZXROYW1lKCkuaW5kZXhPZigiVmFyQXJncyIpID09IC0xCisgICAgICAgICAgICAgICAgPyBuZXcgT3ZlcmxvYWRlZEZpeEFyZ3NNZXRob2RzKGJ3KSA6IG5ldyBPdmVybG9hZGVkVmFyQXJnc01ldGhvZHMoYncpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogZmlsdGVyZWRNZXRob2RzKSB7CisgICAgICAgICAgICBvbXMuYWRkQ2FsbGFibGVNZW1iZXJEZXNjcmlwdG9yKG5ldyBDYWxsYWJsZU1lbWJlckRlc2NyaXB0b3IobSwgbS5nZXRQYXJhbWV0ZXJUeXBlcygpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9tczsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKENsYXNzIGNsLCBTdHJpbmcgbWV0aG9kTmFtZSwgaW50Li4uIGV4cGVjdGVkUGFyYW1UeXBlcykgeworICAgICAgICBjaGVja1Bvc3NpYmxlUGFyYW1UeXBlcyhjbCwgbWV0aG9kTmFtZSwgZmFsc2UsIGV4cGVjdGVkUGFyYW1UeXBlcyk7CisgICAgICAgIGNoZWNrUG9zc2libGVQYXJhbVR5cGVzKGNsLCBtZXRob2ROYW1lLCB0cnVlLCBleHBlY3RlZFBhcmFtVHlwZXMpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tQb3NzaWJsZVBhcmFtVHlwZXMoQ2xhc3MgY2wsIFN0cmluZyBtZXRob2ROYW1lLCBib29sZWFuIHJldk1ldE9yZGVyLCBpbnQuLi4gZXhwZWN0ZWRQYXJhbVR5cGVzKSB7CisgICAgICAgIGludFtdIGFjdHVhbFBhcmFtVHlwZXMgPSBnZXRQb3NzaWJsZVBhcmFtVHlwZXMoY2wsIG1ldGhvZE5hbWUsIHJldk1ldE9yZGVyLCBleHBlY3RlZFBhcmFtVHlwZXMubGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChhY3R1YWxQYXJhbVR5cGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUGFyYW1UeXBlcy5sZW5ndGgsIGFjdHVhbFBhcmFtVHlwZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFBhcmFtVHlwZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFBhcmFtVHlwZXNbaV0sIGFjdHVhbFBhcmFtVHlwZXNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnRbXSBnZXRQb3NzaWJsZVBhcmFtVHlwZXMoQ2xhc3MgY2wsIFN0cmluZyBtZXRob2ROYW1lLCBib29sZWFuIHJldk1ldE9yZGVyLCBpbnQgcGFyYW1DbnQpIHsKKyAgICAgICAgT3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQgb21zID0gbmV3T3ZlcmxvYWRlZE1ldGhvZHNTdWJzZXQoY2wsIG1ldGhvZE5hbWUsIHJldk1ldE9yZGVyKTsKKyAgICAgICAgaW50W10gYWN0dWFsUGFyYW1UeXBlcyA9IG9tcy5nZXRQb3NzaWJsZU51bWVyaWNhbFR5cGVzKHBhcmFtQ250KTsKKyAgICAgICAgcmV0dXJuIGFjdHVhbFBhcmFtVHlwZXM7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9PdmVybG9hZGVkTnVtYmVyVXRpbFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE51bWJlclV0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxODI4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci9leHQvYmVhbnMvT3ZlcmxvYWRlZE51bWJlclV0aWxUZXN0LmphdmEKQEAgLTAsMCArMSw1NjYgQEAKK3BhY2thZ2UgZnJlZW1hcmtlci5leHQuYmVhbnM7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCitwdWJsaWMgY2xhc3MgT3ZlcmxvYWRlZE51bWJlclV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIE92ZXJsb2FkZWROdW1iZXJVdGlsVGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEludGVnZXJDb2VyY2lvbnMoKSB7CisgICAgICAgIGNpcEVxdShuZXcgQnl0ZShCeXRlLk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUobmV3IEJ5dGUoKGJ5dGUpIDApKTsKKyAgICAgICAgY2lwRXF1KG5ldyBCeXRlKEJ5dGUuTUlOX1ZBTFVFKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUobmV3IFNob3J0KEJ5dGUuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuU2hvcnRPckJ5dGUoKHNob3J0KSBCeXRlLk1BWF9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBTaG9ydCgoc2hvcnQpIDApLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5TaG9ydE9yQnl0ZSgoc2hvcnQpIDAsIChieXRlKSAwKSk7CisgICAgICAgIGNpcEVxdShuZXcgU2hvcnQoQnl0ZS5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5TaG9ydE9yQnl0ZSgoc2hvcnQpIEJ5dGUuTUlOX1ZBTFVFLCBCeXRlLk1JTl9WQUxVRSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBTaG9ydCgoc2hvcnQpIChCeXRlLk1BWF9WQUxVRSArIDEpKSk7CisgICAgICAgIGNpcEVxdShuZXcgU2hvcnQoKHNob3J0KSAoQnl0ZS5NSU5fVkFMVUUgLSAxKSkpOworICAgICAgICBjaXBFcXUobmV3IFNob3J0KFNob3J0Lk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUobmV3IFNob3J0KFNob3J0Lk1JTl9WQUxVRSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKEJ5dGUuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuSW50ZWdlck9yQnl0ZSgoaW50KSBCeXRlLk1BWF9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKDApLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyT3JCeXRlKDAsIChieXRlKSAwKSk7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihCeXRlLk1JTl9WQUxVRSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJPckJ5dGUoKGludCkgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUobmV3IEludGVnZXIoQnl0ZS5NQVhfVkFMVUUgKyAxKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuSW50ZWdlck9yU2hvcnQoQnl0ZS5NQVhfVkFMVUUgKyAxLCAoc2hvcnQpIChCeXRlLk1BWF9WQUxVRSArIDEpKSk7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihCeXRlLk1JTl9WQUxVRSAtIDEpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyT3JTaG9ydChCeXRlLk1JTl9WQUxVRSAtIDEsIChzaG9ydCkgKEJ5dGUuTUlOX1ZBTFVFIC0gMSkpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKFNob3J0Lk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJPclNob3J0KChpbnQpIFNob3J0Lk1BWF9WQUxVRSwgU2hvcnQuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihTaG9ydC5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyT3JTaG9ydCgoaW50KSBTaG9ydC5NSU5fVkFMVUUsIFNob3J0Lk1JTl9WQUxVRSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKFNob3J0Lk1BWF9WQUxVRSArIDEpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKFNob3J0Lk1JTl9WQUxVRSAtIDEpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKEludGVnZXIuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihJbnRlZ2VyLk1JTl9WQUxVRSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKEJ5dGUuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09yQnl0ZSgobG9uZykgQnl0ZS5NQVhfVkFMVUUsIEJ5dGUuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShuZXcgTG9uZygwKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09yQnl0ZSgobG9uZykgMCwgKGJ5dGUpIDApKTsKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKEJ5dGUuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09yQnl0ZSgobG9uZykgQnl0ZS5NSU5fVkFMVUUsIEJ5dGUuTUlOX1ZBTFVFKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUobmV3IExvbmcoQnl0ZS5NQVhfVkFMVUUgKyAxKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09yU2hvcnQoKGxvbmcpIChCeXRlLk1BWF9WQUxVRSArIDEpLCAoc2hvcnQpIChCeXRlLk1BWF9WQUxVRSArIDEpKSk7CisgICAgICAgIGNpcEVxdShuZXcgTG9uZyhCeXRlLk1JTl9WQUxVRSAtIDEpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JTaG9ydCgobG9uZykgKEJ5dGUuTUlOX1ZBTFVFIC0gMSksIChzaG9ydCkgKEJ5dGUuTUlOX1ZBTFVFIC0gMSkpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKFNob3J0Lk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkxvbmdPclNob3J0KChsb25nKSBTaG9ydC5NQVhfVkFMVUUsIFNob3J0Lk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUobmV3IExvbmcoU2hvcnQuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09yU2hvcnQoKGxvbmcpIFNob3J0Lk1JTl9WQUxVRSwgU2hvcnQuTUlOX1ZBTFVFKSk7CisKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKFNob3J0Lk1BWF9WQUxVRSArIDEpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JJbnRlZ2VyKChsb25nKSBTaG9ydC5NQVhfVkFMVUUgKyAxLCBTaG9ydC5NQVhfVkFMVUUgKyAxKSk7CisgICAgICAgIGNpcEVxdShuZXcgTG9uZyhTaG9ydC5NSU5fVkFMVUUgLSAxKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09ySW50ZWdlcigobG9uZykgU2hvcnQuTUlOX1ZBTFVFIC0gMSwgU2hvcnQuTUlOX1ZBTFVFIC0gMSkpOworICAgICAgICBjaXBFcXUobmV3IExvbmcoSW50ZWdlci5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JJbnRlZ2VyKChsb25nKSBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKEludGVnZXIuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09ySW50ZWdlcigobG9uZykgSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUobmV3IExvbmcoSW50ZWdlci5NQVhfVkFMVUUgKyAxTCkpOworICAgICAgICBjaXBFcXUobmV3IExvbmcoSW50ZWdlci5NSU5fVkFMVUUgLSAxTCkpOworICAgICAgICBjaXBFcXUobmV3IExvbmcoTG9uZy5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKExvbmcuTUlOX1ZBTFVFKSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ2VyTm9Db2VyY2lvbnMoKSB7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihCeXRlLk1BWF9WQUxVRSksIG5ldyBJbnRlZ2VyKEJ5dGUuTUFYX1ZBTFVFKSwgMCk7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcigwKSwgbmV3IEludGVnZXIoMCksIDApOworICAgICAgICBjaXBFcXUobmV3IEludGVnZXIoQnl0ZS5NSU5fVkFMVUUpLCBuZXcgSW50ZWdlcihCeXRlLk1JTl9WQUxVRSksIDApOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlckxpbWl0ZWRDb2VyY2lvbnMoKSB7CisgICAgICAgIGNpcEVxdShuZXcgSW50ZWdlcihCeXRlLk1BWF9WQUxVRSksIG5ldyBJbnRlZ2VyKEJ5dGUuTUFYX1ZBTFVFKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKDApLCBuZXcgSW50ZWdlcigwKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSKTsKKyAgICAgICAgY2lwRXF1KG5ldyBJbnRlZ2VyKEJ5dGUuTUlOX1ZBTFVFKSwgbmV3IEludGVnZXIoQnl0ZS5NSU5fVkFMVUUpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBMb25nKEludGVnZXIuTUFYX1ZBTFVFICsgMUwpLCBuZXcgTG9uZyhJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSKTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaW50IG4gPSAtMTsgbiA8IDI7IG4rKykgeworICAgICAgICAgICAgZmluYWwgTG9uZyBsb25nTiA9IG5ldyBMb25nKG4pOworICAgICAgICAgICAgY2lwRXF1KGxvbmdOLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuTG9uZ09ySW50ZWdlcihsb25nTiwgbiksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUik7CisgICAgICAgICAgICBjaXBFcXUobG9uZ04sIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JTaG9ydChsb25nTiwgKHNob3J0KSBuKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVCk7CisgICAgICAgICAgICBjaXBFcXUobG9uZ04sIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JCeXRlKGxvbmdOLCAoYnl0ZSkgbiksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfQllURSk7CisgICAgICAgICAgICBjaXBFcXUobG9uZ04sIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Mb25nT3JTaG9ydChsb25nTiwgKHNob3J0KSBuKSwKKyAgICAgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVCB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnRGVjaW1hbENvZXJjaW9ucygpIHsKKyAgICAgICAgY2lwRXF1KG5ldyBCaWdEZWNpbWFsKDEyMyksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyQmlnRGVjaW1hbChuZXcgQmlnRGVjaW1hbCgxMjMpKSk7CisgICAgICAgIGNpcEVxdShuZXcgQmlnRGVjaW1hbCgxMjMpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuSW50ZWdlckJpZ0RlY2ltYWwobmV3IEJpZ0RlY2ltYWwoMTIzKSksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIpOworICAgICAgICBjaXBFcXUobmV3IEJpZ0RlY2ltYWwoMTIzKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSKTsKKyAgICAgICAgY2lwRXF1KG5ldyBCaWdEZWNpbWFsKDEyMyksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfTE9ORyk7CisgICAgICAgIGNpcEVxdShuZXcgQmlnRGVjaW1hbCgxMjMpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGNpcEVxdShuZXcgQmlnRGVjaW1hbCgxMjMpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBCaWdEZWNpbWFsKDEyMy41KSk7CisgICAgICAgIC8vIE5vdCB3YXN0aW5nIHRpbWUgd2l0aCBjaGVjayBpZiBpdCdzIGEgd2hvbGUgbnVtYmVyIGlmIHdlIG9ubHkgaGF2ZSBpbnRlZ2VyLW9ubHkgb3Igbm9uLWludGVnZXItb25seSB0YXJnZXRzOiAgCisgICAgICAgIGNpcEVxdShuZXcgQmlnRGVjaW1hbCgxMjMuNSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUiB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfTE9ORyk7CisgICAgICAgIGNpcEVxdShuZXcgQmlnRGVjaW1hbCgxMjMuNSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVCk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUobmV3IEJpZ0RlY2ltYWwoMC4wMSkpOworICAgICAgICBjaXBFcXUobmV3IEJpZ0RlY2ltYWwoLTAuMDEpKTsKKyAgICAgICAgY2lwRXF1KEJpZ0RlY2ltYWwuWkVSTywgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJCaWdEZWNpbWFsKEJpZ0RlY2ltYWwuWkVSTykpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duTnVtYmVyQ29lcmNpb24oKSB7CisgICAgICAgIGNpcEVxdShuZXcgUmF0aW9uYWxOdW1iZXIoMiwgMykpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVDb2VyY2lvbigpIHsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDEuNSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KDEuNSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoLTAuMTI1KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoLTAuMTI1KSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihGbG9hdC5NQVhfVkFMVUUpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JGbG9hdCgoZG91YmxlKSBGbG9hdC5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKC1GbG9hdC5NQVhfVkFMVUUpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JGbG9hdCgoZG91YmxlKSAtRmxvYXQuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihGbG9hdC5NQVhfVkFMVUUgKiAxMC4wKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZigtRmxvYXQuTUFYX1ZBTFVFICogMTAuMCkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDApLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JCeXRlKDAuMCwgKGJ5dGUpIDApKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSgoZG91YmxlKSBCeXRlLk1BWF9WQUxVRSwgQnl0ZS5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUlOX1ZBTFVFKSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSgoZG91YmxlKSBCeXRlLk1JTl9WQUxVRSwgQnl0ZS5NSU5fVkFMVUUpKTsKKyAgICAgICAgCisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihCeXRlLk1BWF9WQUxVRSArIDEpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JTaG9ydCgoZG91YmxlKQorICAgICAgICAgICAgICAgIChCeXRlLk1BWF9WQUxVRSArIDEpLCAoc2hvcnQpIChCeXRlLk1BWF9WQUxVRSArIDEpKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihCeXRlLk1JTl9WQUxVRSAtIDEpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JTaG9ydCgoZG91YmxlKQorICAgICAgICAgICAgICAgIChCeXRlLk1JTl9WQUxVRSAtIDEpLCAoc2hvcnQpIChCeXRlLk1JTl9WQUxVRSAtIDEpKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoU2hvcnQuTUFYX1ZBTFVFICsgMSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlck9yRmxvYXQoKGRvdWJsZSkgU2hvcnQuTUFYX1ZBTFVFICsgMSwgU2hvcnQuTUFYX1ZBTFVFICsgMSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoU2hvcnQuTUlOX1ZBTFVFIC0gMSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlck9yRmxvYXQoKGRvdWJsZSkgU2hvcnQuTUlOX1ZBTFVFIC0gMSwgU2hvcnQuTUlOX1ZBTFVFLSAgMSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoMTY3NzcyMTYpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyT3JGbG9hdCgxNjc3NzIxNi4wLCAxNjc3NzIxNikpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoLTE2Nzc3MjE2KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlck9yRmxvYXQoLTE2Nzc3MjE2LjAsIC0xNjc3NzIxNikpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyKChkb3VibGUpIEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckludGVnZXIoKGRvdWJsZSkgSW50ZWdlci5NSU5fVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUgKyAxTCksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZyhEb3VibGUudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSwgSW50ZWdlci5NQVhfVkFMVUUgKyAxTCkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUgLSAxTCksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZyhEb3VibGUudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMKSwgSW50ZWdlci5NSU5fVkFMVUUgLSAxTCkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KChkb3VibGUpIExvbmcuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihMb25nLk1JTl9WQUxVRSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoKGRvdWJsZSkgTG9uZy5NSU5fVkFMVUUpKTsKKworICAgICAgICAvLyBXaGVuIG9ubHkgY2VydGFpbiB0YXJnZXQgdHlwZXMgYXJlIHByZXNlbnQ6CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZig1KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSg1LjAsIChieXRlKSA1KSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CWVRFKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JCeXRlKDUuMCwgKGJ5dGUpIDUpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JZVEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1NIT1JUKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKC0xMjkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0JZVEUpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoNSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPclNob3J0KDUuMCwgKHNob3J0KSA1KSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19TSE9SVCk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZig1KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlcig1LjAsIDUpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoNSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcoNS4wLCA1KSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JGbG9hdCg1LjApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUpLCBEb3VibGUudmFsdWVPZig1KSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoNSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KDUuMCksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUuOSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KDUuOSksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUuOSksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoNS45KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoNS45KSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDUuOSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUik7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihMb25nLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoKGRvdWJsZSkgTG9uZy5NQVhfVkFMVUUpLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVCk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihMb25nLk1BWF9WQUxVRSksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KChkb3VibGUpIExvbmcuTUlOX1ZBTFVFKSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoRmxvYXQuTUFYX1ZBTFVFICogMTApLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVCk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZigtRmxvYXQuTUFYX1ZBTFVFICogMTApLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVCk7CisgICAgICAgIAorICAgICAgICAvLyBSb3VuZGVkIHZhbHVlczoKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDAuMDAwMDAwOSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSgwLjAwMDAwMDksIChieXRlKSAwKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZigtMC4wMDAwMDA5KSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JCeXRlKC0wLjAwMDAwMDksIChieXRlKSAwKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZigwLjk5OTk5OTEpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckJ5dGUoMC45OTk5OTkxLCAoYnl0ZSkgMSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoLTAuOTk5OTk5MSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSgtMC45OTk5OTkxLCAoYnl0ZSkgLTEpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDAuMDAwMDAwOSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yU2hvcnQoMC4wMDAwMDA5LCAoc2hvcnQpIDApLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfU0hPUlQgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZigwLjAwMDAwMDkpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyKDAuMDAwMDAwOSwgMCksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19JTlRFR0VSIHwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoMC4wMDAwMDA5KSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZygwLjAwMDAwMDksIDApLAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfTE9ORyB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDAuMDAwMDAwOSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZSgwLjAwMDAwMDksIChieXRlKSAwKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19CWVRFKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDAuMDAwMDAwOSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yU2hvcnQoMC4wMDAwMDA5LCAoc2hvcnQpIDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX1NIT1JUKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKDAuMDAwMDAwOSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlcigwLjAwMDAwMDksIDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0lOVEVHRVIpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoMC4wMDAwMDA5KSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JMb25nKDAuMDAwMDAwOSwgMEwpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoMC45OTk5OTk5KSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyKDAuOTk5OTk5OSwgMSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfSU5URUdFUik7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihCeXRlLk1BWF9WQUxVRSArIDAuOWUtNiksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yQnl0ZShCeXRlLk1BWF9WQUxVRSArIDAuOWUtNiwgQnl0ZS5NQVhfVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUlOX1ZBTFVFIC0gMC45ZS02KSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JCeXRlKEJ5dGUuTUlOX1ZBTFVFIC0gMC45ZS02LCBCeXRlLk1JTl9WQUxVRSkpOworICAgICAgICBjaXBFcXUoRG91YmxlLnZhbHVlT2YoQnl0ZS5NQVhfVkFMVUUgKyAxLjFlLTYpLAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckZsb2F0KEJ5dGUuTUFYX1ZBTFVFICsgMS4xZS02KSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihCeXRlLk1JTl9WQUxVRSAtIDEuMWUtNiksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoQnl0ZS5NSU5fVkFMVUUgLSAxLjFlLTYpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFICsgMC45OTk5OTkxKSwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JTaG9ydCgKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGUuTUFYX1ZBTFVFICsgMC45OTk5OTkxLCAoc2hvcnQpIChCeXRlLk1BWF9WQUxVRSArIDEpKSk7CisgICAgICAgIGNpcEVxdShEb3VibGUudmFsdWVPZihCeXRlLk1JTl9WQUxVRSAtIDAuOTk5OTk5MSksCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yU2hvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlLk1JTl9WQUxVRSAtIDAuOTk5OTk5MSwgKHNob3J0KSAoQnl0ZS5NSU5fVkFMVUUgLSAxKSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFICsgMSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPclNob3J0KChkb3VibGUpCisgICAgICAgICAgICAgICAgKEJ5dGUuTUFYX1ZBTFVFICsgMSksIChzaG9ydCkgKEJ5dGUuTUFYX1ZBTFVFICsgMSkpKTsKKyAgICAgICAgY2lwRXF1KERvdWJsZS52YWx1ZU9mKEJ5dGUuTUlOX1ZBTFVFIC0gMSksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPclNob3J0KChkb3VibGUpCisgICAgICAgICAgICAgICAgKEJ5dGUuTUlOX1ZBTFVFIC0gMSksIChzaG9ydCkgKEJ5dGUuTUlOX1ZBTFVFIC0gMSkpKTsKKyAgICAgICAgCisgICAgICAgIGNpcEVxdShTaG9ydC5NQVhfVkFMVUUgKyAwLjk5OTk5OTEsCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlck9yRmxvYXQoU2hvcnQuTUFYX1ZBTFVFICsgMC45OTk5OTkxLCBTaG9ydC5NQVhfVkFMVUUgKyAxKSk7CisgICAgICAgIGNpcEVxdShTaG9ydC5NSU5fVkFMVUUgLSAwLjk5OTk5OTEsCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlck9yRmxvYXQoU2hvcnQuTUlOX1ZBTFVFIC0gMC45OTk5OTkxLCBTaG9ydC5NSU5fVkFMVUUgLSAxKSk7CisgICAgICAgIGNpcEVxdSgxNjc3NzIxNiArIDAuOWUtNiwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyT3JGbG9hdCgxNjc3NzIxNiArIDAuOWUtNiwgMTY3NzcyMTYpKTsKKyAgICAgICAgY2lwRXF1KC0xNjc3NzIxNiAtIDAuOWUtNiwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyT3JGbG9hdCgtMTY3NzcyMTYgLSAwLjllLTYsIC0xNjc3NzIxNikpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KEludGVnZXIuTUFYX1ZBTFVFICsgMC45ZS02LAorICAgICAgICAgICAgICAgIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckludGVnZXIoSW50ZWdlci5NQVhfVkFMVUUgKyAwLjllLTYsIEludGVnZXIuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShJbnRlZ2VyLk1JTl9WQUxVRSAtIDAuOWUtNiwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyKEludGVnZXIuTUlOX1ZBTFVFIC0gMC45ZS02LCBJbnRlZ2VyLk1JTl9WQUxVRSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KEludGVnZXIuTUFYX1ZBTFVFICsgMUwgKyAwLjllLTYsCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoSW50ZWdlci5NQVhfVkFMVUUgKyAxTCArIDAuOWUtNikpOworICAgICAgICBjaXBFcXUoSW50ZWdlci5NSU5fVkFMVUUgLSAxTCAtIDAuOWUtNiwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JGbG9hdChJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMIC0gMC45ZS02KSk7CisgICAgICAgIGNpcEVxdShMb25nLk1BWF9WQUxVRSArIDAuOWUtNiwKKyAgICAgICAgICAgICAgICBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JGbG9hdChMb25nLk1BWF9WQUxVRSArIDAuOWUtNikpOworICAgICAgICBjaXBFcXUoTG9uZy5NSU5fVkFMVUUgLSAwLjllLTYsCisgICAgICAgICAgICAgICAgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQoTG9uZy5NSU5fVkFMVUUgLSAwLjllLTYpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXRDb2VyY2lvbigpIHsKKyAgICAgICAgY2lwRXF1KDEuMDAwMDJmKTsKKyAgICAgICAgY2lwRXF1KC0xLjAwMDAyZik7CisgICAgICAgIGNpcEVxdSgxLjk5OTk4OWYpOworICAgICAgICBjaXBFcXUoLTEuOTk5OTg5Zik7CisgICAgICAgIGNpcEVxdSgxNjc3NzIxOGYpOworICAgICAgICBjaXBFcXUoLTE2Nzc3MjE4Zik7CisgICAgICAgIAorICAgICAgICBjaXBFcXUoMWYsIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZSgxZiwgKGJ5dGUpIDEpKTsKKyAgICAgICAgY2lwRXF1KC0xZiwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JCeXRlKC0xZiwgKGJ5dGUpIC0xKSk7CisgICAgICAgIGNpcEVxdSgxLjAwMDAwOWYsIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZSgxLjAwMDAwOWYsIChieXRlKSAxKSk7CisgICAgICAgIGNpcEVxdSgtMS4wMDAwMDlmLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRmxvYXRPckJ5dGUoLTEuMDAwMDA5ZiwgKGJ5dGUpIC0xKSk7CisgICAgICAgIGNpcEVxdSgxLjk5OTk5MWYsIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZSgxLjk5OTk5MWYsIChieXRlKSAyKSk7CisgICAgICAgIGNpcEVxdSgtMS45OTk5OTFmLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRmxvYXRPckJ5dGUoLTEuOTk5OTkxZiwgKGJ5dGUpIC0yKSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUoMTAwMGYsIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yU2hvcnQoMTAwMGYsIChzaG9ydCkgMTAwMCkpOworICAgICAgICBjaXBFcXUoLTEwMDBmLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRmxvYXRPclNob3J0KC0xMDAwZiwgKHNob3J0KSAtMTAwMCkpOworICAgICAgICBjaXBFcXUoMTAwMC4wMDAwNmYpOworCisgICAgICAgIGNpcEVxdSg2MDAwMGYsIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9ySW50ZWdlcig2MDAwMGYsIDYwMDAwKSk7CisgICAgICAgIGNpcEVxdSgtNjAwMDBmLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRmxvYXRPckludGVnZXIoLTYwMDAwZiwgLTYwMDAwKSk7CisgICAgICAgIGNpcEVxdSg2MDAwMC4wMDRmKTsKKworICAgICAgICBjaXBFcXUoMTAwZiwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JCeXRlKDEwMGYsIChieXRlKSAxMDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5NQVNLX0tOT1dOX0lOVEVHRVJTKTsKKyAgICAgICAgY2lwRXF1KDEwMDBmLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuRmxvYXRPclNob3J0KDEwMDBmLCAoc2hvcnQpIDEwMDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5NQVNLX0tOT1dOX0lOVEVHRVJTKTsKKyAgICAgICAgY2lwRXF1KDYwMDAwZiwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JJbnRlZ2VyKDYwMDAwZiwgNjAwMDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5NQVNLX0tOT1dOX0lOVEVHRVJTKTsKKyAgICAgICAgY2lwRXF1KDYwMDAwZiwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JJbnRlZ2VyKDYwMDAwZiwgNjAwMDApLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0xPTkcpOworICAgICAgICBjaXBFcXUoKGZsb2F0KSBJbnRlZ2VyLk1BWF9WQUxVRSwgKGZsb2F0KSBJbnRlZ2VyLk1BWF9WQUxVRSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19MT05HKTsKKyAgICAgICAgY2lwRXF1KChmbG9hdCkgLUludGVnZXIuTUFYX1ZBTFVFLCAoZmxvYXQpIC1JbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgICAgIAorICAgICAgICBjaXBFcXUoMC41ZiwgMC41ZiwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KDAuNWYsIDAuNWYsIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRE9VQkxFKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0ludGVnZXJDb2VyY2lvbigpIHsKKyAgICAgICAgQmlnSW50ZWdlciBiaTsKKyAgICAgICAgCisgICAgICAgIGNpcEVxdShCaWdJbnRlZ2VyLlpFUk8sIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JCeXRlKEJpZ0ludGVnZXIuWkVSTykpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFKSk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckJ5dGUoYmkpKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihCeXRlLk1JTl9WQUxVRSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JCeXRlKGJpKSk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKEJ5dGUuTUFYX1ZBTFVFICsgMSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JTaG9ydChiaSkpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKEJ5dGUuTUlOX1ZBTFVFIC0gMSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JTaG9ydChiaSkpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKFNob3J0Lk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JTaG9ydChiaSkpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKFNob3J0Lk1JTl9WQUxVRSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JTaG9ydChiaSkpOworICAgICAgICAKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihTaG9ydC5NQVhfVkFMVUUgKyAxKSk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckludGVnZXIoYmkpKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihTaG9ydC5NSU5fVkFMVUUgLSAxKSk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckludGVnZXIoYmkpKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JJbnRlZ2VyKGJpKSk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9ySW50ZWdlcihiaSkpOworICAgICAgICAKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihJbnRlZ2VyLk1BWF9WQUxVRSArIDFMKSk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckxvbmcoYmkpKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMKSk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckxvbmcoYmkpKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihMb25nLk1BWF9WQUxVRSkpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JMb25nKGJpKSk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yTG9uZyhiaSkpOworICAgICAgICAKKyAgICAgICAgY2lwRXF1KG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSkuYWRkKEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIGNpcEVxdShuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihMb25nLk1JTl9WQUxVRSkpLnN1YnRyYWN0KEJpZ0ludGVnZXIuT05FKSk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCIwIik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckZsb2F0KGJpKSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSB8IE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JGbG9hdChiaSksCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckZsb2F0KGJpKSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRG91YmxlKGJpKSwKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcigiMTY3NzcyMTUiKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRmxvYXQoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5NQVNLX0tOT1dOX05PTklOVEVHRVJTKTsKKyAgICAgICAgYmkgPSBuZXcgQmlnSW50ZWdlcigiLTE2Nzc3MjE1Iik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckZsb2F0KGJpKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCIxNjc3NzIxNiIpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JGbG9hdChiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCItMTY3NzcyMTYiKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRmxvYXQoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5NQVNLX0tOT1dOX05PTklOVEVHRVJTKTsKKyAgICAgICAgCisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoIjE2Nzc3MjE3Iik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckRvdWJsZShiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBjaXBFcXUoYmksIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZMQUdfRkxPQVQpOworICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCItMTY3NzcyMTciKTsKKyAgICAgICAgY2lwRXF1KGJpLCBuZXcgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRG91YmxlKGJpKSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19GTE9BVCk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCI5MDA3MTk5MjU0NzQwOTkxIik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckRvdWJsZShiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoIi05MDA3MTk5MjU0NzQwOTkxIik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckRvdWJsZShiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCI5MDA3MTk5MjU0NzQwOTkyIik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckRvdWJsZShiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoIi05MDA3MTk5MjU0NzQwOTkyIik7CisgICAgICAgIGNpcEVxdShiaSwgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckRvdWJsZShiaSksIE92ZXJsb2FkZWROdW1iZXJVdGlsLk1BU0tfS05PV05fTk9OSU5URUdFUlMpOworICAgICAgICBjaXBFcXUoYmksIG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUoYmkpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCI5MDA3MTk5MjU0NzQwOTkzIik7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KGJpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KGJpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoIi05MDA3MTk5MjU0NzQwOTkzIik7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuRkxBR19ET1VCTEUgfCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KGJpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0ZMT0FUKTsKKyAgICAgICAgY2lwRXF1KGJpLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5GTEFHX0RPVUJMRSk7CisgICAgICAgIAorICAgICAgICBiaSA9IG5ldyBCaWdJbnRlZ2VyKCI5MDA3MTk5MjU0NzQwOTk0Iik7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgICAgIGJpID0gbmV3IEJpZ0ludGVnZXIoIi05MDA3MTk5MjU0NzQwOTk0Iik7CisgICAgICAgIGNpcEVxdShiaSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuTUFTS19LTk9XTl9OT05JTlRFR0VSUyk7CisgICAgfQorICAgIAorICAgIHByaXZhdGUgdm9pZCBjaXBFcXUoTnVtYmVyIGFjdHVhbEFuZEV4cGVjdGVkKSB7CisgICAgICAgIGNpcEVxdShhY3R1YWxBbmRFeHBlY3RlZCwgYWN0dWFsQW5kRXhwZWN0ZWQsIC0xKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSB2b2lkIGNpcEVxdShOdW1iZXIgYWN0dWFsLCBOdW1iZXIgZXhwZWN0ZWQpIHsKKyAgICAgICAgY2lwRXF1KGFjdHVhbCwgZXhwZWN0ZWQsIC0xKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2lwRXF1KE51bWJlciBhY3R1YWxBbmRFeHBlY3RlZCwgaW50IGZsYWdzKSB7CisgICAgICAgIGNpcEVxdShhY3R1YWxBbmRFeHBlY3RlZCwgYWN0dWFsQW5kRXhwZWN0ZWQsIGZsYWdzKTsKKyAgICB9CisgICAgCisgICAgQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCisgICAgcHJpdmF0ZSB2b2lkIGNpcEVxdShOdW1iZXIgYWN0dWFsLCBOdW1iZXIgZXhwZWN0ZWQsIGludCBmbGFncykgeworICAgICAgICBOdW1iZXIgcmVzID0gT3ZlcmxvYWRlZE51bWJlclV0aWwuYWRkRmFsbGJhY2tUeXBlKGFjdHVhbCwgZmxhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0Q2xhc3MoKSwgcmVzLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlcyk7CisgICAgICAgIAorICAgICAgICAvLyBTb21lIG51bWJlciB0eXBlcyB3cmFwIHRoZSBudW1iZXIgd2l0aCBtdWx0aXBsZSB0eXBlcyBhbmQgZXF1YWxzKCkgb25seSBjb21wYXJlcyBvbmUgb2YgdGhlbS4gU28gd2UgdHJ5IHRvCisgICAgICAgIC8vIGNhdGNoIGFueSBpbmNvbnNpc3RlbmN5OgorICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuYnl0ZVZhbHVlKCksIHJlcy5ieXRlVmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaG9ydFZhbHVlKCksIHJlcy5zaG9ydFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuaW50VmFsdWUoKSwgcmVzLmludFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubG9uZ1ZhbHVlKCksIHJlcy5sb25nVmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5mbG9hdFZhbHVlKCksIHJlcy5mbG9hdFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZG91YmxlVmFsdWUoKSwgcmVzLmRvdWJsZVZhbHVlKCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoKSB7CisgICAgICAgIC8vIFVua25vd24gbnVtYmVyIHR5cGVzOgorICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIFJhdGlvbmFsTnVtYmVyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgSW50ZWdlci5jbGFzcywgUmF0aW9uYWxOdW1iZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBSYXRpb25hbE51bWJlci5jbGFzcywgRmxvYXQuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBGbG9hdC5jbGFzcywgUmF0aW9uYWxOdW1iZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIFJhdGlvbmFsTnVtYmVyLmNsYXNzLCBSYXRpb25hbE51bWJlci5jbGFzcykpOworICAgICAgICAKKyAgICAgICAgLy8gRnVsbHkgY2hlY2sgc29tZSByb3dzIChub3QgYWxsIG9mIHRoZW07IHRoZSBjb2RlIGlzIGdlbmVyYXRlZCBhbnl3YXlzKToKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEludGVnZXIuY2xhc3MsIEJ5dGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzLCBTaG9ydC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgSW50ZWdlci5jbGFzcywgSW50ZWdlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDQsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEludGVnZXIuY2xhc3MsIExvbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDA1LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzLCBCaWdJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMDAwNiwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgSW50ZWdlci5jbGFzcywgRmxvYXQuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA3LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzLCBEb3VibGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoNDUwMDEsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsIEJ5dGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQ0MDAyLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLmNsYXNzLCBTaG9ydC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDEwMDMsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQxMDA0LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLmNsYXNzLCBMb25nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAwNSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC5jbGFzcywgQmlnSW50ZWdlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzMwMDYsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEJpZ0RlY2ltYWwuY2xhc3MsIEZsb2F0LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMjAwNywgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgQmlnRGVjaW1hbC5jbGFzcywgRG91YmxlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIAorICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZy5jbGFzcywgQnl0ZS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5NQVhfVkFMVUUsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZy5jbGFzcywgU2hvcnQuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcuY2xhc3MsIEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxMDA0LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcuY2xhc3MsIExvbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxMDA1LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcuY2xhc3MsIEJpZ0ludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMDA2LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcuY2xhc3MsIEZsb2F0LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5Eb3VibGVPckxvbmcuY2xhc3MsIERvdWJsZS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZy5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICAKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIEJ5dGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuTUFYX1ZBTFVFLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIFNob3J0LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzLCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLk1BWF9WQUxVRSwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzLCBMb25nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIEJpZ0ludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMDA2LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIEZsb2F0LmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAwNywgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRG91YmxlLmNsYXNzLCBEb3VibGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgCisgICAgICAgIC8vIENoZWNrIGlmIGFsbCBmcm9tQyBpcyBwcmVzZW50OgorICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEJ5dGUuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBTaG9ydC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEludGVnZXIuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBMb25nLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAwOCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgQmlnSW50ZWdlci5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIEZsb2F0LmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAwOCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgRG91YmxlLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBCaWdEZWNpbWFsLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyQmlnRGVjaW1hbC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yRmxvYXQuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZS5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yU2hvcnQuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZS5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JTaG9ydC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkZsb2F0T3JJbnRlZ2VyLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAwOCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JCeXRlLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAwOCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuRG91YmxlT3JJbnRlZ2VyT3JGbG9hdC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9ySW50ZWdlci5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkRvdWJsZU9yTG9uZy5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckJ5dGUuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JTaG9ydC5jbGFzcywgQmlnRGVjaW1hbC5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwMDgsIE92ZXJsb2FkZWROdW1iZXJVdGlsLmdldEFyZ3VtZW50Q29udmVyc2lvblByaWNlKAorICAgICAgICAgICAgICAgIE92ZXJsb2FkZWROdW1iZXJVdGlsLkJpZ0ludGVnZXJPckludGVnZXIuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JMb25nLmNsYXNzLCBCaWdEZWNpbWFsLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAwOCwgT3ZlcmxvYWRlZE51bWJlclV0aWwuZ2V0QXJndW1lbnRDb252ZXJzaW9uUHJpY2UoCisgICAgICAgICAgICAgICAgT3ZlcmxvYWRlZE51bWJlclV0aWwuQmlnSW50ZWdlck9yRmxvYXQuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMDA4LCBPdmVybG9hZGVkTnVtYmVyVXRpbC5nZXRBcmd1bWVudENvbnZlcnNpb25QcmljZSgKKyAgICAgICAgICAgICAgICBPdmVybG9hZGVkTnVtYmVyVXRpbC5CaWdJbnRlZ2VyT3JEb3VibGUuY2xhc3MsIEJpZ0RlY2ltYWwuY2xhc3MpKTsKKyAgICB9CisgICAgCit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL1BhcmFtZXRlckxpc3RQcmVmZXJhYmlsaXR5VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9QYXJhbWV0ZXJMaXN0UHJlZmVyYWJpbGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA4NTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9QYXJhbWV0ZXJMaXN0UHJlZmVyYWJpbGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLnV0aWxpdHkuTnVtYmVyVXRpbDsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKKworQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyTGlzdFByZWZlcmFiaWxpdHlUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgcHVibGljIFBhcmFtZXRlckxpc3RQcmVmZXJhYmlsaXR5VGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdE51bWJlcmljYWwoKSB7CisgICAgICAgIC8vIE5vdGU6IHRoZSBzaWduYXR1cmUgbGlzdHMgY29uc2lzdHMgb2YgdGhlIHNhbWUgZWxlbWVudHMsIG9ubHkgdGhlaXIgb3JkZXIgY2hhbmdlcyBkZXBlbmRpbmcgb24gdGhlIHR5cGUKKyAgICAgICAgLy8gb2YgdGhlIGFyZ3VtZW50IHZhbHVlLgorICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBieXRlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQnl0ZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHNob3J0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2hvcnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgbG9uZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IExvbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCaWdJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZmxvYXQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBGbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGRvdWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IERvdWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEJpZ0RlY2ltYWwuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBOdW1iZXIuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTZXJpYWxpemFibGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgKGJ5dGUpIDEgfSk7CisgICAgICAgIAorICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEJpZ0RlY2ltYWwuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCaWdJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGxvbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBMb25nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZmxvYXQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBGbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHNob3J0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2hvcnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBieXRlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQnl0ZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE51bWJlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFNlcmlhbGl6YWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IE92ZXJsb2FkZWROdW1iZXJVdGlsLkludGVnZXJCaWdEZWNpbWFsKG5ldyBCaWdEZWNpbWFsKCIxIikpIH0pOworCisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQmlnRGVjaW1hbC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGRvdWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IERvdWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGZsb2F0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRmxvYXQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCaWdJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGxvbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBMb25nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgc2hvcnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTaG9ydC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGJ5dGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCeXRlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTnVtYmVyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2VyaWFsaXphYmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgQmlnRGVjaW1hbCgiMSIpIC8qIHBvc3NpYmx5IG5vbi1pbnRlZ2VyICovIH0pOworICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBmbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEZsb2F0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQmlnRGVjaW1hbC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGludC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEludGVnZXIuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTG9uZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHNob3J0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2hvcnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBieXRlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQnl0ZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEJpZ0ludGVnZXIuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBOdW1iZXIuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTZXJpYWxpemFibGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5GbG9hdE9yQnl0ZSgxZiwgKGJ5dGUpIDEpIH0pOworICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgbG9uZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IExvbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCaWdJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQmlnRGVjaW1hbC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHNob3J0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2hvcnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBmbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEZsb2F0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvLyBUd28gaW5jb21wYXRpYmxlcyByZW1vdmVkLCB3b3VsZCBiZSByZW1vdmVkIGluIHJlYWxpdHk6CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYnl0ZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEJ5dGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTnVtYmVyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU2VyaWFsaXphYmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IG5ldyBPdmVybG9hZGVkTnVtYmVyVXRpbC5JbnRlZ2VyT3JTaG9ydCgxLCAoc2hvcnQpIDEpIH0pOworICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgTG9uZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEJpZ0ludGVnZXIuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCaWdEZWNpbWFsLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgRG91YmxlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgZmxvYXQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBGbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGJ5dGUgYW5kIHNob3J0ICBhcyB0aGUgd291bGQgYmUgZXF1YWwgd2l0aCBpbnQgKGFsbCBpbnZhbGlkIHRhcmdldCB0eXBlcykKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSwgIC8vIEluIHJlYWxpdHksIHRoaXMgYW5kIEludGVnZXIgYXJlIHJlbW92ZWQgYXMgbm90LWFwcGxpY2FibGUgb3ZlcmxvYWRzCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE51bWJlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFNlcmlhbGl6YWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAxTCB9KTsKKyAgICAgICAgCisgICAgICAgIC8vIFVuZGVjaWRhYmxlIGNvbXBhcmlzb25zOgorICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0VxdSgKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQnl0ZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTaG9ydC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IExvbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQmlnSW50ZWdlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBGbG9hdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAxLjAgfSk7CisgICAgICAgIAorICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zRXF1KAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBieXRlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IHNob3J0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGludC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBsb25nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGZsb2F0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IDEuMCB9KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUlzTW9yZVNwZWNpZmljKCkgeworICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGJvb2xlYW4uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBCb29sZWFuLmNsYXNzIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7IHRydWUgfSk7CisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgY2hhci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IENoYXJhY3Rlci5jbGFzcyB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAneCcgfSk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0hpZXJhcmNoeSgpIHsKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBMaW5rZWRIYXNoTWFwLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSGFzaE1hcC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE1hcC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyBuZXcgTGlua2VkSGFzaE1hcCgpIH0pOworICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IExpbmtlZEhhc2hNYXAuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDbG9uZWFibGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbmV3IExpbmtlZEhhc2hNYXAoKSB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtZXJpY2FsV2l0aE5vbk51bWVyaWNhbCgpIHsKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ29tcGFyYWJsZS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMSB9KTsKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgY2hhci5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IENoYXJhY3Rlci5jbGFzcyB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgMSB9KTsKKyAgICB9CisgICAgCisgICAgcHVibGljIHZvaWQgdGVzdFVucmVsYXRlZCgpIHsKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0VxdSgKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTZXJpYWxpemFibGUuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDaGFyU2VxdWVuY2UuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDb21wYXJhYmxlLmNsYXNzIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJzIiB9KTsKKyAgICAgICAgCisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNFcXUoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSGFzaE1hcC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFRyZWVNYXAuY2xhc3MgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgbnVsbCB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlQYXJhbWV0ZXIoKSB7CisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCBPYmplY3QuY2xhc3MsIFN0cmluZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiIH0pOworICAgICAgICAKKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ2hhclNlcXVlbmNlLmNsYXNzLCBDaGFyU2VxdWVuY2UuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDaGFyU2VxdWVuY2UuY2xhc3MsIE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgT2JqZWN0LmNsYXNzLCBDaGFyU2VxdWVuY2UuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBPYmplY3QuY2xhc3MsIE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgImEiLCAiYiIgfSk7CisgICAgICAgIAorICAgICAgICAvKiogU3ViY2xhc3NpbmcgaXMgbW9yZSBpbXBvcnRhbnQgdGhhbiBwcmltaXRpdmUtVlMtYm94ZWQ6ICovCisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQ2hhclNlcXVlbmNlLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyB0cnVlLCBmYWxzZSwgdHJ1ZSwgImEiIH0pOworICAgICAgICAKKyAgICAgICAgLyoqIFN1YmNsYXNzaW5nIGlzIG1vcmUgaW1wb3J0YW50IHRoYW4gcHJpbWl0aXZlLVZTLWJveGVkOiAqLworICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IGludC5jbGFzcywgaW50LmNsYXNzLCBpbnQuY2xhc3MsIFN0cmluZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEludGVnZXIuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MsIEludGVnZXIuY2xhc3MsIFN0cmluZy5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEludGVnZXIuY2xhc3MsIGludC5jbGFzcywgSW50ZWdlci5jbGFzcywgU3RyaW5nLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5jbGFzcywgSW50ZWdlci5jbGFzcywgaW50LmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBTdHJpbmcuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBDaGFyU2VxdWVuY2UuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBpbnQuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBPYmplY3QuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzLCBpbnQuY2xhc3MsIGludC5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgaW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBPYmplY3QuY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBJbnRlZ2VyLmNsYXNzLCBpbnQuY2xhc3MsIEludGVnZXIuY2xhc3MsIE9iamVjdC5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IEludGVnZXIuY2xhc3MsIEludGVnZXIuY2xhc3MsIGludC5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgSW50ZWdlci5jbGFzcywgSW50ZWdlci5jbGFzcywgSW50ZWdlci5jbGFzcywgT2JqZWN0LmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAxLCAyLCAzLCAiYSIgfSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmFyZ3MoKSB7CisgICAgICAgIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoCisgICAgICAgICAgICAgICAgbmV3IENsYXNzW11bXSB7CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBTdHJpbmdbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgQ2hhclNlcXVlbmNlW10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAiYSIsICJiIiwgImMiIH0sCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICAgIAorICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgaW50W10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIEludGVnZXJbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgbG9uZ1tdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBMb25nW10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIGRvdWJsZVtdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgU3RyaW5nLmNsYXNzLCBEb3VibGVbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgU2VyaWFsaXphYmxlW10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIE9iamVjdFtdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10geyAiYSIsIDEsIDIsIDMgfSwKKyAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgICAgCisgICAgICAgIC8vIDAtbG9uZyB2YXJhcmdzIGxpc3Q7IGluIGNhc2Ugb2YgYW1iaWd1aXR5LCB0aGUgdmFyYXJncyBjb21wb25lbnQgdHlwZSBkZWNpZGVzOgorICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdW10geworICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgT2JqZWN0W10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDaGFyU2VxdWVuY2UuY2xhc3MsIGludFtdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ2hhclNlcXVlbmNlLmNsYXNzLCBJbnRlZ2VyW10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDaGFyU2VxdWVuY2UuY2xhc3MsIGxvbmdbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IENoYXJTZXF1ZW5jZS5jbGFzcywgTG9uZ1tdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ2hhclNlcXVlbmNlLmNsYXNzLCBkb3VibGVbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IENoYXJTZXF1ZW5jZS5jbGFzcywgRG91YmxlW10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBDaGFyU2VxdWVuY2UuY2xhc3MsIFNlcmlhbGl6YWJsZVtdLmNsYXNzIH0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHsgQ2hhclNlcXVlbmNlLmNsYXNzLCBPYmplY3RbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IE9iamVjdC5jbGFzcywgaW50W10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJhIiB9LAorICAgICAgICAgICAgICAgIHRydWUpOworICAgICAgICAKKyAgICAgICAgCisgICAgICAgIC8vIERpZmZlcmVudCBmaXhlZCBwcmVmaXggbGVuZ3RoOyBpbiB0aGUgY2FzZSBvZiBhbWJpZ3VpdHksIHRoZSBvbmUgd2l0aCBoaWdoZXIgZml4ZWQgcGFyYW0gY291bnQgd2lucy4KKyAgICAgICAgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYygKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXVtdIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzW10geyBTdHJpbmcuY2xhc3MsIGludC5jbGFzcywgaW50LmNsYXNzLCBpbnRbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgaW50LmNsYXNzLCBpbnRbXS5jbGFzcyB9LAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7IFN0cmluZy5jbGFzcywgaW50W10uY2xhc3MgfSwKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7ICJhIiwgMSwgMiwgMyB9LAorICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHZvaWQgdGVzdEFsbENtcFBlcm11dGF0aW9uc0luYyhDbGFzc1tdW10gc29ydGVkU2lnbmF0dXJlcywgT2JqZWN0W10gYXJncykgeworICAgICAgICB0ZXN0QWxsQ21wUGVybXV0YXRpb25zSW5jKHNvcnRlZFNpZ25hdHVyZXMsIGFyZ3MsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyBhbGwgaXRlbXMgd2l0aCBhbGwgb3RoZXIgaXRlbXMgaW4gdGhlIHByb3ZpZGVkIGRlc2NlbmRpbmcgc29ydGVkIGFycmF5IG9mIHNpZ25hdHVyZXMsIGNoZWNraW5nIHRoYXQKKyAgICAgKiBmb3IgYWxsIHZhbGlkIGluZGV4ZXMgaSBhbmQgaiwgd2hlcmUgaiA+IGksIGl0IHN0YW5kcyB0aGF0IHNvcnRlZFNpZ25hdHVyZXNbaV0gPiBzb3J0ZWRTaWduYXR1cmVzW2pdLgorICAgICAqIFRoZSBjb21wYXJpc29ucyBhcmUgZG9uZSB3aXRoIGJvdGggb3BlcmFuZCBvcmRlcnMsIGFsc28gZWFjaCBpdGVtcyBpcyBjb21wYXJlZCB0byBpdHNlbGYgdG9vLgorICAgICAqIAorICAgICAqIEBwYXJhbSBzb3J0ZWRTaWduYXR1cmVzIG1ldGhvZCBzaWduYXR1cmVzIHNvcnRlZCBieSBkZWNyZWFzaW5nIHNwZWNpZmljaXR5CisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RBbGxDbXBQZXJtdXRhdGlvbnNJbmMoQ2xhc3NbXVtdIHNvcnRlZFNpZ25hdHVyZXMsIE9iamVjdFtdIGFyZ3MsIGJvb2xlYW4gdmFyYXJncykgeworICAgICAgICBmaW5hbCBBcmd1bWVudFR5cGVzIGFyZ1RzID0gbmV3IEFyZ3VtZW50VHlwZXMoYXJncywgdHJ1ZSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkU2lnbmF0dXJlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzb3J0ZWRTaWduYXR1cmVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJzb3J0ZWRTaWduYXR1cmVzWyIgKyBpICsgIl0gPD09PiBzb3J0ZWRTaWduYXR1cmVzIFsiICsgaiArICJdIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlclV0aWwuZ2V0U2lnbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnZhbHVlT2YoaikuY29tcGFyZVRvKGkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE51bWJlclV0aWwuZ2V0U2lnbnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdUcy5jb21wYXJlUGFyYW1ldGVyTGlzdFByZWZlcmFiaWxpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkU2lnbmF0dXJlc1tpXSwgc29ydGVkU2lnbmF0dXJlc1tqXSwgdmFyYXJncykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QWxsQ21wUGVybXV0YXRpb25zRXF1KENsYXNzW11bXSBzaWduYXR1cmVzLCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIGZpbmFsIEFyZ3VtZW50VHlwZXMgYXJnVHMgPSBuZXcgQXJndW1lbnRUeXBlcyhhcmdzLCB0cnVlKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaWduYXR1cmVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpZ25hdHVyZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInNvcnRlZFNpZ25hdHVyZXNbIiArIGkgKyAiXSA8PT0+IHNvcnRlZFNpZ25hdHVyZXMgWyIgKyBqICsgIl0iLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1RzLmNvbXBhcmVQYXJhbWV0ZXJMaXN0UHJlZmVyYWJpbGl0eShzaWduYXR1cmVzW2ldLCBzaWduYXR1cmVzW2pdLCBmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9SYXRpb25hbE51bWJlci5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL2V4dC9iZWFucy9SYXRpb25hbE51bWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE2M2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvZXh0L2JlYW5zL1JhdGlvbmFsTnVtYmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorcGFja2FnZSBmcmVlbWFya2VyLmV4dC5iZWFuczsKKworcHVibGljIGZpbmFsIGNsYXNzIFJhdGlvbmFsTnVtYmVyIGV4dGVuZHMgTnVtYmVyIHsKKyAgICAKKyAgICBmaW5hbCBpbnQgZGl2aWRlbnQ7CisgICAgZmluYWwgaW50IGRpdmlzb3I7CisgICAgCisgICAgcHVibGljIFJhdGlvbmFsTnVtYmVyKGludCBkaXZpZGVudCwgaW50IGRpdmlzb3IpIHsKKyAgICAgICAgdGhpcy5kaXZpZGVudCA9IGRpdmlkZW50OworICAgICAgICB0aGlzLmRpdmlzb3IgPSBkaXZpc29yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaW50VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBkaXZpZGVudCAvIGRpdmlzb3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgbG9uZ1ZhbHVlKCkgeworICAgICAgICByZXR1cm4gZGl2aWRlbnQgLyAobG9uZykgZGl2aXNvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmxvYXQgZmxvYXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIChmbG9hdCkgKGRpdmlkZW50IC8gKGRvdWJsZSkgZGl2aXNvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBkb3VibGVWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRpdmlkZW50IC8gKGRvdWJsZSkgZGl2aXNvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldERpdmlkZW50KCkgeworICAgICAgICByZXR1cm4gZGl2aWRlbnQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREaXZpc29yKCkgeworICAgICAgICByZXR1cm4gZGl2aXNvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKKyAgICAgICAgaW50IHJlc3VsdCA9IDE7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZGl2aWRlbnQ7CisgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgZGl2aXNvcjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAodGhpcyA9PSBvYmopCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgUmF0aW9uYWxOdW1iZXIgb3RoZXIgPSAoUmF0aW9uYWxOdW1iZXIpIG9iajsKKyAgICAgICAgaWYgKGRpdmlkZW50ICE9IG90aGVyLmRpdmlkZW50KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZGl2aXNvciAhPSBvdGhlci5kaXZpc29yKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZGl2aWRlbnQgKyAiLyIgKyBkaXZpc29yOworICAgIH0KKyAgICAKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVtcGxhdGUvdXRpbGl0eS9OdW1iZXJVdGlsVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3RlbXBsYXRlL3V0aWxpdHkvTnVtYmVyVXRpbFRlc3QuamF2YQppbmRleCAzNzU5Y2Q2Li4yYmZiM2VhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVtcGxhdGUvdXRpbGl0eS9OdW1iZXJVdGlsVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci90ZW1wbGF0ZS91dGlsaXR5L051bWJlclV0aWxUZXN0LmphdmEKQEAgLTYwLDUgKzYwLDM3IEBACiAgICAgICAgIGFzc2VydEVxdWFscygwLCBOdW1iZXJVdGlsLmdldFNpZ251bShCaWdJbnRlZ2VyLnZhbHVlT2YoMCkpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBOdW1iZXJVdGlsLmdldFNpZ251bShCaWdJbnRlZ2VyLnZhbHVlT2YoLTMpKSk7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc0JpZ0RlY2ltYWxJbnRlZ2VyKCkgeworICAgICAgICBCaWdEZWNpbWFsIG4xID0gbmV3IEJpZ0RlY2ltYWwoIjEuMTI1Iik7CisgICAgICAgIGlmIChuMS5wcmVjaXNpb24oKSAhPSA0IHx8IG4xLnNjYWxlKCkgIT0gMykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldyb25nOiAiICsgIG4xKTsKKyAgICAgICAgfQorICAgICAgICBCaWdEZWNpbWFsIG4yID0gbmV3IEJpZ0RlY2ltYWwoIjEuMTI1Iikuc3VidHJhY3QobmV3IEJpZ0RlY2ltYWwoIjAuMDA1IikpOworICAgICAgICBpZiAobjIucHJlY2lzaW9uKCkgIT0gNCB8fCBuMi5zY2FsZSgpICE9IDMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcm9uZzogIiArICBuMik7CisgICAgICAgIH0KKyAgICAgICAgQmlnRGVjaW1hbCBuMyA9IG5ldyBCaWdEZWNpbWFsKCIxMjMiKTsKKyAgICAgICAgQmlnRGVjaW1hbCBuNCA9IG5ldyBCaWdEZWNpbWFsKCI2MDAwIik7CisgICAgICAgIEJpZ0RlY2ltYWwgbjUgPSBuZXcgQmlnRGVjaW1hbCgiMS4xMjM0NSIpLnN1YnRyYWN0KG5ldyBCaWdEZWNpbWFsKCIwLjEyMzQ1IikpOworICAgICAgICBpZiAobjUucHJlY2lzaW9uKCkgIT0gNiB8fCBuNS5zY2FsZSgpICE9IDUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXcm9uZzogIiArICBuNSk7CisgICAgICAgIH0KKyAgICAgICAgQmlnRGVjaW1hbCBuNiA9IG5ldyBCaWdEZWNpbWFsKCIwIik7IAorICAgICAgICBCaWdEZWNpbWFsIG43ID0gbmV3IEJpZ0RlY2ltYWwoIjAuMDAxIikuc3VidHJhY3QobmV3IEJpZ0RlY2ltYWwoIjAuMDAxIikpOyAKKyAgICAgICAgQmlnRGVjaW1hbCBuOCA9IG5ldyBCaWdEZWNpbWFsKCI2MDAwMC41Iikuc3VidHJhY3QobmV3IEJpZ0RlY2ltYWwoIjAuNSIpKTsgCisgICAgICAgIEJpZ0RlY2ltYWwgbjkgPSBuZXcgQmlnRGVjaW1hbCgiNiIpLm1vdmVQb2ludFJpZ2h0KDMpLnNldFNjYWxlKC0zKTsKKyAgICAgICAgCisgICAgICAgIEJpZ0RlY2ltYWxbXSBucyA9IG5ldyBCaWdEZWNpbWFsW10geworICAgICAgICAgICAgICAgIG4xLCBuMiwgbjMsIG40LCBuNSwgbjYsIG43LCBuOCwgbjksCisgICAgICAgICAgICAgICAgbjEubmVnYXRlKCksIG4yLm5lZ2F0ZSgpLCBuMy5uZWdhdGUoKSwgbjQubmVnYXRlKCksIG41Lm5lZ2F0ZSgpLCBuNi5uZWdhdGUoKSwgbjcubmVnYXRlKCksIG44Lm5lZ2F0ZSgpLAorICAgICAgICAgICAgICAgIG45Lm5lZ2F0ZSgpLAorICAgICAgICB9OworICAgICAgICAKKyAgICAgICAgZm9yIChCaWdEZWNpbWFsIG4gOiBucykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG4uZG91YmxlVmFsdWUoKSA9PSBuLmxvbmdWYWx1ZSgpLCBOdW1iZXJVdGlsLmlzQmlnRGVjaW1hbEludGVnZXIobikpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9UZW1wbGF0ZVRlc3RDYXNlLmphdmEgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL1RlbXBsYXRlVGVzdENhc2UuamF2YQppbmRleCBkNTYzZDhkLi44YjFmMzFkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL1RlbXBsYXRlVGVzdENhc2UuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL1RlbXBsYXRlVGVzdENhc2UuamF2YQpAQCAtOTEsNiArOTEsNyBAQAogaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuVGVtcGxhdGVOb2RlTW9kZWw7CiBpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZVNjYWxhck1vZGVsOwogaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuVGVtcGxhdGVTZXF1ZW5jZU1vZGVsOworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUudXRpbGl0eS5OdWxsQXJndW1lbnRFeGNlcHRpb247CiBpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS51dGlsaXR5Lk51bGxXcml0ZXI7CiBpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS51dGlsaXR5LlN0cmluZ1V0aWw7CiBpbXBvcnQgZnJlZW1hcmtlci50ZXN0LnRlbXBsYXRlc3VpdGUubW9kZWxzLkJvb2xlYW5BbmRTdHJpbmdUZW1wbGF0ZU1vZGVsOwpAQCAtMTE5LDExICsxMjAsMTcgQEAKICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbm9PdXRwdXQ7CiAgICAgCiAgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworCisgICAgcHVibGljIFRlbXBsYXRlVGVzdENhc2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBudWxsLCBudWxsLCBmYWxzZSk7CisgICAgfQogICAgIAogICAgIHB1YmxpYyBUZW1wbGF0ZVRlc3RDYXNlKFN0cmluZyBuYW1lLCBTdHJpbmcgdGVtcGxhdGVOYW1lLCBTdHJpbmcgZXhwZWN0ZWRGaWxlTmFtZSwgYm9vbGVhbiBub091dHB1dCkgewogICAgICAgICBzdXBlcihuYW1lKTsKLSAgICAgICAgdGhpcy50ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0gICAgICAgIHRoaXMuZXhwZWN0ZWRGaWxlTmFtZSA9IGV4cGVjdGVkRmlsZU5hbWU7CisgICAgICAgIAorICAgICAgICBOdWxsQXJndW1lbnRFeGNlcHRpb24uY2hlY2soIm5hbWUiLCBuYW1lKTsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWUgIT0gbnVsbCA/IHRlbXBsYXRlTmFtZSA6IG5hbWUgKyAiLmZ0bCI7CisgICAgICAgIHRoaXMuZXhwZWN0ZWRGaWxlTmFtZSA9IGV4cGVjdGVkRmlsZU5hbWUgIT0gbnVsbCA/IGV4cGVjdGVkRmlsZU5hbWUgOiBuYW1lICsgIi50eHQiOwogICAgICAgICB0aGlzLm5vT3V0cHV0ID0gbm9PdXRwdXQ7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9UZW1wbGF0ZVRlc3RTdWl0ZS5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9UZW1wbGF0ZVRlc3RTdWl0ZS5qYXZhCmluZGV4IDJkNGQzMGUuLjg0OTU2MmQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvVGVtcGxhdGVUZXN0U3VpdGUuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL1RlbXBsYXRlVGVzdFN1aXRlLmphdmEKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChuLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ0ZXN0Y2FzZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFRlc3RDYXNlIHRjID0gY3JlYXRlVGVzdENhc2VGcm9tTm9kZSgoRWxlbWVudCkgbiwgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVUZXN0Q2FzZSB0YyA9IGNyZWF0ZVRlc3RDYXNlRnJvbU5vZGUoKEVsZW1lbnQpIG4sIGZpbHRlcik7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0YyAhPSBudWxsKSBhZGRUZXN0KHRjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0xNjQsNDQgKzE2NCwzMiBAQAogICAgICAqIGl0IG11c3QgZXh0ZW5kIHtAbGluayBUZXN0Q2FzZX0gYW5kIGhhdmUgYSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlcnMgYXMgb2YKICAgICAgKiB7QGxpbmsgVGVtcGxhdGVUZXN0Q2FzZSNUZW1wbGF0ZVRlc3RDYXNlKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfS4KICAgICAgKi8KLSAgICBwcml2YXRlIFRlc3RDYXNlIGNyZWF0ZVRlc3RDYXNlRnJvbU5vZGUoRWxlbWVudCBlLCBQYXR0ZXJuIGZpbHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBUZW1wbGF0ZVRlc3RDYXNlIGNyZWF0ZVRlc3RDYXNlRnJvbU5vZGUoRWxlbWVudCBlLCBQYXR0ZXJuIGZpbHRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gU3RyaW5nVXRpbC5lbXB0eVRvTnVsbChlLmdldEF0dHJpYnV0ZSgibmFtZSIpKTsKICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCBYTUw6IHRoZSBcIm5hbWVcIiBhdHRyaWJ1dGUgaXMgbWFuZGF0b3J5LiIpOwogICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwgJiYgIWZpbHRlci5tYXRjaGVyKG5hbWUpLm1hdGNoZXMoKSkgcmV0dXJuIG51bGw7CiAgICAgICAgIAogICAgICAgICBTdHJpbmcgdGVtcGxhdGVOYW1lID0gU3RyaW5nVXRpbC5lbXB0eVRvTnVsbChlLmdldEF0dHJpYnV0ZSgidGVtcGxhdGUiKSk7Ci0gICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCkgdGVtcGxhdGVOYW1lID0gbmFtZSArICIuZnRsIjsKIAogICAgICAgICBTdHJpbmcgZXhwZWN0ZWRGaWxlTmFtZSA9IFN0cmluZ1V0aWwuZW1wdHlUb051bGwoZS5nZXRBdHRyaWJ1dGUoImV4cGVjdGVkIikpOwotICAgICAgICBpZiAoZXhwZWN0ZWRGaWxlTmFtZSA9PSBudWxsKSBleHBlY3RlZEZpbGVOYW1lID0gbmFtZSArICIudHh0IjsKICAgICAgICAgCiAgICAgICAgIFN0cmluZyBub091dHB1dFN0ciA9IFN0cmluZ1V0aWwuZW1wdHlUb051bGwoZS5nZXRBdHRyaWJ1dGUoIm5vb3V0cHV0IikpOwogICAgICAgICBib29sZWFuIG5vT3V0cHV0ID0gbm9PdXRwdXRTdHIgPT0gbnVsbCA/IGZhbHNlIDogU3RyaW5nVXRpbC5nZXRZZXNObyhub091dHB1dFN0cik7CiAgICAgICAgIAotICAgICAgICBTdHJpbmcgY2xhc3NuYW1lID0gU3RyaW5nVXRpbC5lbXB0eVRvTnVsbChlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoY2xhc3NuYW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIENsYXNzIGNsID0gQ2xhc3MuZm9yTmFtZShjbGFzc25hbWUpOwotICAgICAgICAgICAgQ29uc3RydWN0b3IgY29ucyA9IGNsLmdldENvbnN0cnVjdG9yKG5ldyBDbGFzc1tdIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzc30pOwotICAgICAgICAgICAgcmV0dXJuIChUZXN0Q2FzZSkgY29ucy5uZXdJbnN0YW5jZShuZXcgT2JqZWN0IFtdIHsKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwgdGVtcGxhdGVOYW1lLCBleHBlY3RlZEZpbGVOYW1lLCBCb29sZWFuLnZhbHVlT2Yobm9PdXRwdXQpfSk7Ci0gICAgICAgIH0gZWxzZSB7IAotCSAgICAgICAgVGVtcGxhdGVUZXN0Q2FzZSByZXN1bHQgPSBuZXcgVGVtcGxhdGVUZXN0Q2FzZShuYW1lLCB0ZW1wbGF0ZU5hbWUsIGV4cGVjdGVkRmlsZU5hbWUsIG5vT3V0cHV0KTsKLQkgICAgICAgIGZvciAoSXRlcmF0b3IgaXQ9Y29uZmlnUGFyYW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCSAgICAgICAgICAgIE1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkgICAgICAgICAgICByZXN1bHQuc2V0Q29uZmlnUGFyYW0oZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgZW50cnkuZ2V0VmFsdWUoKS50b1N0cmluZygpKTsKLQkgICAgICAgIH0KLQkgICAgICAgIE5vZGVMaXN0IGNvbmZpZ3MgPSBlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJjb25maWciKTsKLQkgICAgICAgIGZvciAoaW50IGk9MDsgaTxjb25maWdzLmdldExlbmd0aCgpOyBpKyspICB7Ci0JICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHMgPSBjb25maWdzLml0ZW0oaSkuZ2V0QXR0cmlidXRlcygpOwotCSAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajxhdHRzLmdldExlbmd0aCgpOyBqKyspIHsKLQkgICAgICAgICAgICAgICAgQXR0ciBhdHQgPSAoQXR0cikgYXR0cy5pdGVtKGopOwotCSAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q29uZmlnUGFyYW0oYXR0LmdldE5hbWUoKSwgYXR0LmdldFZhbHVlKCkpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIFRlbXBsYXRlVGVzdENhc2UgcmVzdWx0ID0gbmV3IFRlbXBsYXRlVGVzdENhc2UobmFtZSwgdGVtcGxhdGVOYW1lLCBleHBlY3RlZEZpbGVOYW1lLCBub091dHB1dCk7CisgICAgICAgIGZvciAoSXRlcmF0b3IgaXQ9Y29uZmlnUGFyYW1zLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgeworICAgICAgICAgICAgTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOworICAgICAgICAgICAgcmVzdWx0LnNldENvbmZpZ1BhcmFtKGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCksIGVudHJ5LmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgTm9kZUxpc3QgY29uZmlncyA9IGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImNvbmZpZyIpOworICAgICAgICBmb3IgKGludCBpPTA7IGk8Y29uZmlncy5nZXRMZW5ndGgoKTsgaSsrKSAgeworICAgICAgICAgICAgTmFtZWROb2RlTWFwIGF0dHMgPSBjb25maWdzLml0ZW0oaSkuZ2V0QXR0cmlidXRlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPGF0dHMuZ2V0TGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgIEF0dHIgYXR0ID0gKEF0dHIpIGF0dHMuaXRlbShqKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuc2V0Q29uZmlnUGFyYW0oYXR0LmdldE5hbWUoKSwgYXR0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvbW9kZWxzL092ZXJsb2FkZWRNZXRob2RzMi5qYXZhIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9tb2RlbHMvT3ZlcmxvYWRlZE1ldGhvZHMyLmphdmEKaW5kZXggZDc2MzNiMi4uOTk1ODI4ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9tb2RlbHMvT3ZlcmxvYWRlZE1ldGhvZHMyLmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS9tb2RlbHMvT3ZlcmxvYWRlZE1ldGhvZHMyLmphdmEKQEAgLTEsOSArMSwxOCBAQAogcGFja2FnZSBmcmVlbWFya2VyLnRlc3QudGVtcGxhdGVzdWl0ZS5tb2RlbHM7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CiBpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CiAKK2ltcG9ydCBmcmVlbWFya2VyLmV4dC5iZWFucy5SYXRpb25hbE51bWJlcjsKK2ltcG9ydCBmcmVlbWFya2VyLmV4dC51dGlsLldyYXBwZXJUZW1wbGF0ZU1vZGVsOworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuQWRhcHRlclRlbXBsYXRlTW9kZWw7CitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZUJvb2xlYW5Nb2RlbDsKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLlRlbXBsYXRlTW9kZWxFeGNlcHRpb247CitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZU51bWJlck1vZGVsOworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUudXRpbGl0eS5TdHJpbmdVdGlsOworCiBwdWJsaWMgY2xhc3MgT3ZlcmxvYWRlZE1ldGhvZHMyIHsKIAogICAgIHB1YmxpYyBTdHJpbmcgbVZhcmFyZ3MoU3RyaW5nLi4uIGExKSB7CkBAIC0xNyw2ICsyNiwxMCBAQAogICAgIHB1YmxpYyBCaWdJbnRlZ2VyIGJpZ0ludGVnZXIoQmlnRGVjaW1hbCBuKSB7CiAgICAgICAgIHJldHVybiBuLnRvQmlnSW50ZWdlcigpOwogICAgIH0KKworICAgIHB1YmxpYyBSYXRpb25hbE51bWJlciByYXRpb25hbChpbnQgYSwgaW50IGIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSYXRpb25hbE51bWJlcihhLCBiKTsKKyAgICB9CiAgICAgCiAgICAgcHVibGljIFN0cmluZyBtVmFyYXJncyhGaWxlIGExLCBTdHJpbmcuLi4gYTIpIHsKICAgICAgICAgcmV0dXJuICJtVmFyYXJncyhGaWxlIGExLCBTdHJpbmcuLi4gYTIpIjsKQEAgLTIyMyw0ICsyMzYsMzQ1IEBACiAgICAgICAgIHJldHVybiAibURlY2ltYWxMb3NzKGRvdWJsZSBhMSA9ICIgKyBhMSArICIpIjsKICAgICB9CiAgICAgCisgICAgcHVibGljIFN0cmluZyBtTnVtQ29udmVyc2lvbkxvc2VzMShieXRlIGksIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIHJldHVybiAiYnl0ZSAiICsgaTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBtTnVtQ29udmVyc2lvbkxvc2VzMShkb3VibGUgaSwgT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKKyAgICAgICAgcmV0dXJuICJkb3VibGUgIiArIGk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBtTnVtQ29udmVyc2lvbkxvc2VzMShOdW1iZXIgaSwgU3RyaW5nIG8xLCBTdHJpbmcgbzIpIHsKKyAgICAgICAgcmV0dXJuICJOdW1iZXIgIiArIGkgKyAiICIgKyBpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bUNvbnZlcnNpb25Mb3NlczIoaW50IGksIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIHJldHVybiAiaW50ICIgKyBpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bUNvbnZlcnNpb25Mb3NlczIobG9uZyBpLCBPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICByZXR1cm4gImxvbmcgIiArIGk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBtTnVtQ29udmVyc2lvbkxvc2VzMihOdW1iZXIgaSwgU3RyaW5nIG8xLCBTdHJpbmcgbzIpIHsKKyAgICAgICAgcmV0dXJuICJOdW1iZXIgIiArIGkgKyAiICIgKyBpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bUNvbnZlcnNpb25Mb3NlczMoaW50IGksIE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7CisgICAgICAgIHJldHVybiAiaW50ICIgKyBpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bUNvbnZlcnNpb25Mb3NlczMoU2VyaWFsaXphYmxlIGksIFN0cmluZyBvMSwgU3RyaW5nIG8yKSB7CisgICAgICAgIHJldHVybiAiU2VyaWFsaXphYmxlICIgKyBpICsgIiAiICsgaS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBuSW50QW5kTG9uZyhpbnQgaSkgeworICAgICAgICByZXR1cm4gIm5JbnRBbmRMb25nKGludCAiICsgaSArICIpIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBuSW50QW5kTG9uZyhsb25nIGkpIHsKKyAgICAgICAgcmV0dXJuICJuSW50QW5kTG9uZyhsb25nICIgKyBpICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbkludEFuZFNob3J0KGludCBpKSB7CisgICAgICAgIHJldHVybiAibkludEFuZFNob3J0KGludCAiICsgaSArICIpIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBuSW50QW5kU2hvcnQoc2hvcnQgaSkgeworICAgICAgICByZXR1cm4gIm5JbnRBbmRTaG9ydChzaG9ydCAiICsgaSArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG5Mb25nQW5kU2hvcnQobG9uZyBpKSB7CisgICAgICAgIHJldHVybiAibkxvbmdBbmRTaG9ydChsb25nICIgKyBpICsgIikiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIG5Mb25nQW5kU2hvcnQoc2hvcnQgaSkgeworICAgICAgICByZXR1cm4gIm5Mb25nQW5kU2hvcnQoc2hvcnQgIiArIGkgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzMShTdHJpbmcgcywgaW50Li4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczEoU3RyaW5nIHMgPSAiICsgU3RyaW5nVXRpbC5qUXVvdGUocykgKyAiLCBpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmFyZ3MxKFN0cmluZyBzLCBkb3VibGUuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzMShTdHJpbmcgcyA9ICIgKyBTdHJpbmdVdGlsLmpRdW90ZShzKSArICIsIGRvdWJsZS4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmFyYXJnczEoU3RyaW5nIHMsIE9iamVjdC4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3MxKFN0cmluZyBzID0gIiArIFN0cmluZ1V0aWwualF1b3RlKHMpICsgIiwgT2JqZWN0Li4uIHhzID0gWyIgKyBhcnJheVRvU3RyaW5nKHhzKSArICJdKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzMShPYmplY3QgcywgT2JqZWN0Li4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczEoT2JqZWN0IHMgPSAiICsgcyArICIsIE9iamVjdC4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmFyYXJnczIoaW50Li4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczIoaW50Li4uIHhzID0gWyIgKyBhcnJheVRvU3RyaW5nKHhzKSArICJdKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzMihkb3VibGUuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmFyZ3MzKFN0cmluZy4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3MzKFN0cmluZy4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmFyYXJnczMoQ29tcGFyYWJsZS4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3MzKENvbXBhcmFibGUuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzMyhPYmplY3QuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzMyhPYmplY3QuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNChJbnRlZ2VyLi4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczQoSW50ZWdlci4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdmFyYXJnczQoaW50Li4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczQoaW50Li4uIHhzID0gWyIgKyBhcnJheVRvU3RyaW5nKHhzKSArICJdKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNShpbnQuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzNShpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNShpbnQgYTEsIGludC4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3M1KGludCBhMSA9ICIgKyBhMSArICIsIGludC4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmFyZ3M1KGludCBhMSwgaW50IGEyLCBpbnQuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzNShpbnQgYTEgPSAiICsgYTEgKyAiLCBpbnQgYTIgPSAiICsgYTIgKyAiLCBpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmFyZ3M1KGludCBhMSwgaW50IGEyLCBpbnQgYTMsIGludC4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3M1KGludCBhMSA9ICIgKyBhMSArICIsIGludCBhMiA9ICIgKyBhMiArICIsIGludCBhMyA9ICIgKyBhMworICAgICAgICAgICAgICAgICsgIiwgaW50Li4uIHhzID0gWyIgKyBhcnJheVRvU3RyaW5nKHhzKSArICJdKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNihTdHJpbmcgYTEsIGludC4uLiB4cykgeworICAgICAgICByZXR1cm4gInZhcmFyZ3M2KFN0cmluZyBhMSA9ICIgKyBhMSArICIsIGludC4uLiB4cyA9IFsiICsgYXJyYXlUb1N0cmluZyh4cykgKyAiXSkiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIHZhcmFyZ3M2KE9iamVjdCBhMSwgaW50IGEyLCBpbnQuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzNihPYmplY3QgYTEgPSAiICsgYTEgKyAiLCBpbnQgYTIgPSAiICsgYTIgKyAiLCBpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNyhpbnQuLi4geHMpIHsKKyAgICAgICAgcmV0dXJuICJ2YXJhcmdzNyhpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyB2YXJhcmdzNyhzaG9ydCBhMSwgaW50Li4uIHhzKSB7CisgICAgICAgIHJldHVybiAidmFyYXJnczcoc2hvcnQgYTEgPSAiICsgYTEgKyAiLCBpbnQuLi4geHMgPSBbIiArIGFycmF5VG9TdHJpbmcoeHMpICsgIl0pIjsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBTdHJpbmcgYXJyYXlUb1N0cmluZyhpbnRbXSB4cykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChpbnQgeCA6IHhzKSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgIT0gMCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgc2IuYXBwZW5kKHgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGFycmF5VG9TdHJpbmcoZG91YmxlW10geHMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZG91YmxlIHggOiB4cykgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpICE9IDApIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBhcnJheVRvU3RyaW5nKE9iamVjdFtdIHhzKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKE9iamVjdCB4IDogeHMpIHsKKyAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSAhPSAwKSBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoeCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbU51bGxBbWJpZ3VvdXMoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJtTnVsbEFtYmlndW91cyhTdHJpbmcgcyA9ICIgKyBzICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bGxBbWJpZ3VvdXMoaW50IGkpIHsKKyAgICAgICAgcmV0dXJuICJtTnVsbEFtYmlndW91cyhpbnQgaSA9ICIgKyBpICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbU51bGxBbWJpZ3VvdXMoRmlsZSBmKSB7CisgICAgICAgIHJldHVybiAibU51bGxBbWJpZ3VvdXMoRmlsZSBmID0gIiArIGYgKyAiKSI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbU51bGxBbWJpZ3VvdXMyKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiAibU51bGxOb25BbWJpZ3VvdXMoU3RyaW5nIHMgPSAiICsgcyArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG1OdWxsQW1iaWd1b3VzMihGaWxlIGYpIHsKKyAgICAgICAgcmV0dXJuICJtTnVsbEFtYmlndW91cyhGaWxlIGYgPSAiICsgZiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG1OdWxsQW1iaWd1b3VzMihPYmplY3QgbykgeworICAgICAgICByZXR1cm4gIm1OdWxsQW1iaWd1b3VzKE9iamVjdCBvID0gIiArIG8gKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBtTnVsbE5vbkFtYmlndW91cyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIm1OdWxsTm9uQW1iaWd1b3VzKFN0cmluZyBzID0gIiArIHMgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBtTnVsbE5vbkFtYmlndW91cyhpbnQgaSkgeworICAgICAgICByZXR1cm4gIm1OdWxsTm9uQW1iaWd1b3VzKGludCBpID0gIiArIGkgKyAiKSI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbVZhcmFyZ3NJZ25vcmVkVGFpbChpbnQgaSwgZG91YmxlLi4uIGRzKSB7CisgICAgICAgIHJldHVybiAibVZhcmFyZ3NJZ25vcmVkVGFpbChpbnQgaSA9ICIgKyBpICsgIiwgZG91YmxlLi4uIGRzID0gWyIgKyBhcnJheVRvU3RyaW5nKGRzKSArICJdKSI7IAorICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIG1WYXJhcmdzSWdub3JlZFRhaWwoaW50Li4uIGlzKSB7CisgICAgICAgIHJldHVybiAibVZhcmFyZ3NJZ25vcmVkVGFpbChpbnQuLi4gaXMgPSBbIiArIGFycmF5VG9TdHJpbmcoaXMpICsgIl0pIjsgCisgICAgfQorICAgIAorICAgIHB1YmxpYyBTdHJpbmcgbUxvd1JhbmtXaW5zKGludCB4LCBpbnQgeSwgT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuICJtTG93UmFua1dpbnMoaW50IHggPSAiICsgeCArICIsIGludCB5ID0gIiArIHkgKyAiLCBPYmplY3QgbyA9ICIgKyBvICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbUxvd1JhbmtXaW5zKEludGVnZXIgeCwgSW50ZWdlciB5LCBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIm1Mb3dSYW5rV2lucyhJbnRlZ2VyIHggPSAiICsgeCArICIsIEludGVnZXIgeSA9ICIgKyB5ICsgIiwgU3RyaW5nIHMgPSAiICsgcyArICIpIjsKKyAgICB9CisgICAgCisgICAgcHVibGljIFN0cmluZyBtUmFyZVdyYXBwaW5ncyhGaWxlIGYsIGRvdWJsZSBkMSwgRG91YmxlIGQyLCBkb3VibGUgZDMsIGJvb2xlYW4gYikgeworICAgICAgICByZXR1cm4gIm1SYXJlV3JhcHBpbmdzKEZpbGUgZiA9ICIgKyBmICsgIiwgZG91YmxlIGQxID0gIiArIGQxICsgIiwgRG91YmxlIGQyID0gIiArIGQyCisgICAgICAgICAgICAgICAgKyAiLCBkb3VibGUgZDMgPSAiICsgZDMgKyAiLCBiID0gIiArIGIgKyAiKSI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBtUmFyZVdyYXBwaW5ncyhPYmplY3QgbywgZG91YmxlIGQxLCBEb3VibGUgZDIsIERvdWJsZSBkMywgYm9vbGVhbiBiKSB7CisgICAgICAgIHJldHVybiAibVJhcmVXcmFwcGluZ3MoT2JqZWN0IG8gPSAiICsgbyArICIsIGRvdWJsZSBkMSA9ICIgKyBkMSArICIsIERvdWJsZSBkMiA9ICIgKyBkMgorICAgICAgICAgICAgICAgICsgIiwgZG91YmxlIGQzID0gIiArIGQzICsgIiwgYiA9ICIgKyBiICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgbVJhcmVXcmFwcGluZ3MoU3RyaW5nIHMsIGRvdWJsZSBkMSwgRG91YmxlIGQyLCBEb3VibGUgZDMsIGJvb2xlYW4gYikgeworICAgICAgICByZXR1cm4gIm1SYXJlV3JhcHBpbmdzKFN0cmluZyBzID0gIiArIHMgKyAiLCBkb3VibGUgZDEgPSAiICsgZDEgKyAiLCBEb3VibGUgZDIgPSAiICsgZDIKKyAgICAgICAgICAgICAgICArICIsIGRvdWJsZSBkMyA9ICIgKyBkMyArICIsIGIgPSAiICsgYiArICIpIjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG1SYXJlV3JhcHBpbmdzMihTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIm1SYXJlV3JhcHBpbmdzMihTdHJpbmcgcyA9ICIgKyBzICsgIikiOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgU3RyaW5nIG1SYXJlV3JhcHBpbmdzMihieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuICJtUmFyZVdyYXBwaW5nczIoYnl0ZSBiID0gIiArIGIgKyAiKSI7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZSgiZmlsZSIpOworICAgIH0KKworICAgIHB1YmxpYyBUZW1wbGF0ZU51bWJlck1vZGVsIGdldEFkYXB0ZWROdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBZGFwdGVyTnVtYmVyTW9kZWwoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVtcGxhdGVOdW1iZXJNb2RlbCBnZXRXcmFwcGVyTnVtYmVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE15V3JhcHBlck51bWJlck1vZGVsKCk7CisgICAgfQorCisgICAgcHVibGljIFRlbXBsYXRlQm9vbGVhbk1vZGVsIGdldFN0cmluZ0FkYXB0ZWRUb0Jvb2xlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlTdHJpbmdBZGFwdGVkVG9Cb29sZWFuTW9kZWwoKTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFRlbXBsYXRlQm9vbGVhbk1vZGVsIGdldFN0cmluZ0FkYXB0ZWRUb0Jvb2xlYW4yKCkgeworICAgICAgICByZXR1cm4gbmV3IE15U3RyaW5nQWRhcHRlZFRvQm9vbGVhbk1vZGVsMigpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVGVtcGxhdGVCb29sZWFuTW9kZWwgZ2V0U3RyaW5nV3JhcHBlZEFzQm9vbGVhbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeVN0cmluZ1dyYXBwZXJBc0Jvb2xlYW5Nb2RlbCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgVGVtcGxhdGVCb29sZWFuTW9kZWwgZ2V0Qm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuKCkgeworICAgICAgICByZXR1cm4gbmV3IE15Qm9vbGVhbldyYXBwZXJBc0Fub3RoZXJCb29sZWFuTW9kZWwoKTsgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15QWRhcHRlck51bWJlck1vZGVsIGltcGxlbWVudHMgVGVtcGxhdGVOdW1iZXJNb2RlbCwgQWRhcHRlclRlbXBsYXRlTW9kZWwgeworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlZE9iamVjdChDbGFzcyBoaW50KSB7CisgICAgICAgICAgICBpZiAoaGludCA9PSBkb3VibGUuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2YoMTIzLjAwMDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChoaW50ID09IERvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZigxMjMuMDAwMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YoMTI0TCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTnVtYmVyIGdldEFzTnVtYmVyKCkgdGhyb3dzIFRlbXBsYXRlTW9kZWxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigxMjIpOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVdyYXBwZXJOdW1iZXJNb2RlbCBpbXBsZW1lbnRzIFRlbXBsYXRlTnVtYmVyTW9kZWwsIFdyYXBwZXJUZW1wbGF0ZU1vZGVsIHsKKworICAgICAgICBwdWJsaWMgTnVtYmVyIGdldEFzTnVtYmVyKCkgdGhyb3dzIFRlbXBsYXRlTW9kZWxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigxMjIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRXcmFwcGVkT2JqZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIERvdWJsZS52YWx1ZU9mKDEyMy4wMDAxKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlTdHJpbmdXcmFwcGVyQXNCb29sZWFuTW9kZWwgaW1wbGVtZW50cyBUZW1wbGF0ZUJvb2xlYW5Nb2RlbCwgV3JhcHBlclRlbXBsYXRlTW9kZWwgeworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlZE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAieWVzIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEFzQm9vbGVhbigpIHRocm93cyBUZW1wbGF0ZU1vZGVsRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIAorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15Qm9vbGVhbldyYXBwZXJBc0Fub3RoZXJCb29sZWFuTW9kZWwgaW1wbGVtZW50cyBUZW1wbGF0ZUJvb2xlYW5Nb2RlbCwgV3JhcHBlclRlbXBsYXRlTW9kZWwgeworCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0V3JhcHBlZE9iamVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRBc0Jvb2xlYW4oKSB0aHJvd3MgVGVtcGxhdGVNb2RlbEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15U3RyaW5nQWRhcHRlZFRvQm9vbGVhbk1vZGVsIGltcGxlbWVudHMgVGVtcGxhdGVCb29sZWFuTW9kZWwsIEFkYXB0ZXJUZW1wbGF0ZU1vZGVsIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZWRPYmplY3QoQ2xhc3MgaGludCkgeworICAgICAgICAgICAgaWYgKGhpbnQgIT0gQm9vbGVhbi5jbGFzcyAmJiBoaW50ICE9IGJvb2xlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInllcyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRBc0Jvb2xlYW4oKSB0aHJvd3MgVGVtcGxhdGVNb2RlbEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlTdHJpbmdBZGFwdGVkVG9Cb29sZWFuTW9kZWwyIGltcGxlbWVudHMgVGVtcGxhdGVCb29sZWFuTW9kZWwsIEFkYXB0ZXJUZW1wbGF0ZU1vZGVsIHsKKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZWRPYmplY3QoQ2xhc3MgaGludCkgeworICAgICAgICAgICAgcmV0dXJuICJ5ZXMiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0QXNCb29sZWFuKCkgdGhyb3dzIFRlbXBsYXRlTW9kZWxFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgfQorICAgIAogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL3RlbXBsYXRlcy9vdmVybG9hZGVkLW1ldGhvZHMtMi1kZXNjLWljaS0yLjMuMjAuZnRsIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL3RlbXBsYXRlcy9vdmVybG9hZGVkLW1ldGhvZHMtMi1kZXNjLWljaS0yLjMuMjAuZnRsCmluZGV4IDM1YjZmMWUuLjMyMDA3MjMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItZGVzYy1pY2ktMi4zLjIwLmZ0bAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvdGVtcGxhdGVzL292ZXJsb2FkZWQtbWV0aG9kcy0yLWRlc2MtaWNpLTIuMy4yMC5mdGwKQEAgLTMsNSArMywxOCBAQAogPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJubyBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLm1JbnRQcmltVlNCb3hlZCgxMjM/bG9uZyl9PC9APgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tSW50UHJpbVZTQm94ZWQoMTIzP3Nob3J0KSBleHBlY3RlZD0ibUludFByaW1WU0JveGVkKGludCBhMSA9IDEyMykiIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1JbnRQcmltVlNCb3hlZCgxMjMpIGV4cGVjdGVkPSJtSW50UHJpbVZTQm94ZWQoaW50IGExID0gMTIzKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczQoMSwgMiwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3M0KGludC4uLiB4cyA9IFsxLCAyLCAzXSknIC8+CisKKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tVmFyYXJnc0lnbm9yZWRUYWlsKDEsIDIsIDMpfTwvQD4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tVmFyYXJnc0lnbm9yZWRUYWlsKDEsIDIsIDMuNSl9PC9APgorCis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1Mb3dSYW5rV2lucygxLCAyLCAnYScpIGV4cGVjdGVkPSdtTG93UmFua1dpbnMoaW50IHggPSAxLCBpbnQgeSA9IDIsIE9iamVjdCBvID0gYSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLmZpbGUsIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5zdHJpbmdXcmFwcGVkQXNCb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKEZpbGUgZiA9IGZpbGUsIGRvdWJsZSBkMSA9IDEyMy4wMDAxLCBEb3VibGUgZDIgPSAxMjMuMDAwMiwgZG91YmxlIGQzID0gMTI0LjAsIGIgPSB0cnVlKScgLz4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tUmFyZVdyYXBwaW5ncyhvYmouc3RyaW5nV3JhcHBlZEFzQm9vbGVhbiwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLnN0cmluZ0FkYXB0ZWRUb0Jvb2xlYW4pfTwvQD4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tUmFyZVdyYXBwaW5ncyhvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuLCAwLCAwLCAwLCBvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuKX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubVJhcmVXcmFwcGluZ3Mob2JqLmFkYXB0ZWROdW1iZXIsIDAsIDAsIDAsICFvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuKX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubVJhcmVXcmFwcGluZ3Mob2JqLmJvb2xlYW5XcmFwcGVkQXNBbm90aGVyQm9vbGVhbiwgMCwgMCwgMCwgIW9iai5zdHJpbmdBZGFwdGVkVG9Cb29sZWFuKX08L0A+CiAKIDwjaW5jbHVkZSAnb3ZlcmxvYWRlZC1tZXRob2RzLTItaWNpLTIuMy4yMC5mdGwnPgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL3RlbXBsYXRlcy9vdmVybG9hZGVkLW1ldGhvZHMtMi1pY2ktMi4zLjIwLmZ0bCBiL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItaWNpLTIuMy4yMC5mdGwKaW5kZXggM2QzYzk0MS4uMmExYzM0ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL3RlbXBsYXRlcy9vdmVybG9hZGVkLW1ldGhvZHMtMi1pY2ktMi4zLjIwLmZ0bAorKysgYi9zcmMvdGVzdC9yZXNvdXJjZXMvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvdGVtcGxhdGVzL292ZXJsb2FkZWQtbWV0aG9kcy0yLWljaS0yLjMuMjAuZnRsCkBAIC03NCw0ICs3NCw4MCBAQAogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKCd4JykgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoT2JqZWN0IGExID0geCkiIC8+CiAKIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubURlY2ltYWxMb3NzKDEuNSkgZXhwZWN0ZWQ9Im1EZWNpbWFsTG9zcyhpbnQgYTEgPSAxKSIgLz48Iy0tIFllcywgYnVnZ3kuLi4gLS0+Ci08QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1EZWNpbWFsTG9zcygxLjU/ZG91YmxlKSBleHBlY3RlZD0ibURlY2ltYWxMb3NzKGRvdWJsZSBhMSA9IDEuNSkiIC8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tRGVjaW1hbExvc3MoMS41P2RvdWJsZSkgZXhwZWN0ZWQ9Im1EZWNpbWFsTG9zcyhkb3VibGUgYTEgPSAxLjUpIiAvPgorCis8Iy0tIEJpZ0RlY2ltYWwgY29udmVyc2lvbnMgY2hvc2UgdGhlIHNtYWxsZXN0IHRhcmdldCB0eXBlIGJlZm9yZSBJY0kgMi4zLjMxLCBpbmNyZWFzaW5nIHRoZSByaXNrIG9mIG92ZXJmbG93czogLS0+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm5JbnRBbmRMb25nKDEpIGV4cGVjdGVkPSJuSW50QW5kTG9uZyhpbnQgMSkiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm5JbnRBbmRMb25nKDE/bG9uZykgZXhwZWN0ZWQ9Im5JbnRBbmRMb25nKGxvbmcgMSkiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm5JbnRBbmRTaG9ydCgxKSBleHBlY3RlZD0ibkludEFuZFNob3J0KHNob3J0IDEpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5uSW50QW5kU2hvcnQoMT9zaG9ydCkgZXhwZWN0ZWQ9Im5JbnRBbmRTaG9ydChzaG9ydCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkludEFuZFNob3J0KDE/aW50KSBleHBlY3RlZD0ibkludEFuZFNob3J0KGludCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkxvbmdBbmRTaG9ydCgxKSBleHBlY3RlZD0ibkxvbmdBbmRTaG9ydChzaG9ydCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkxvbmdBbmRTaG9ydCgxP3Nob3J0KSBleHBlY3RlZD0ibkxvbmdBbmRTaG9ydChzaG9ydCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkxvbmdBbmRTaG9ydCgxP2xvbmcpIGV4cGVjdGVkPSJuTG9uZ0FuZFNob3J0KGxvbmcgMSkiIC8+CisKKzwjLS0gVXN1YWwgd3JvbmcgY2hvaWNlIG9uIG51bGw6IC0tPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMShudWxsLCAxLCAyLCAzLjUpIGV4cGVjdGVkPSd2YXJhcmdzMShPYmplY3QgcyA9IG51bGwsIE9iamVjdC4uLiB4cyA9IFsxLCAyLCAzLjVdKScgLz4KKworPCMtLSBTb21lIGJ1Z3MgdGhhdCBjYXVzZSBsb29zaW5nIG9mIGRlY2ltYWxzIHdpbGwgb2NjdXIgaGVyZS4uLiAtLT4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai52YXJhcmdzMSgncycsIDEsIDIsIDMuNSl9PC9APgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgncycsIDEsIDIsICdjJykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gInMiLCBPYmplY3QuLi4geHMgPSBbMSwgMiwgY10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgncycsIDEsICdiJywgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gInMiLCBPYmplY3QuLi4geHMgPSBbMSwgYiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgncycsICdhJywgMiwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gInMiLCBPYmplY3QuLi4geHMgPSBbYSwgMiwgM10pJyAvPgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3MxKCdzJywgMSwgMiwgMyl9PC9APgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3MxKCdzJywgMS4xLCAyLjEsIDMuMSl9PC9APgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgncycsICdhJywgJ2InLCAnYycpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9ICJzIiwgT2JqZWN0Li4uIHhzID0gW2EsIGIsIGNdKScgLz4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj48QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKCdzJywgMT9kb3VibGUsIDI/Ynl0ZSwgMz9ieXRlKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSAicyIsIGludC4uLiB4cyA9IFsxLCAyLCAzXSknIC8+PC9APgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgwLCAxLCAyLCAzKSBleHBlY3RlZD0ndmFyYXJnczEoT2JqZWN0IHMgPSAwLCBPYmplY3QuLi4geHMgPSBbMSwgMiwgM10pJyAvPgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3MxKCdzJywgMT9kb3VibGUsIDI/ZG91YmxlLCAzP2RvdWJsZSl9PC9APgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3MxKCdzJyl9PC9APgorCis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MyKDEsIDIuNSwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MyKGludC4uLiB4cyA9IFsxLCAyLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MyKDEsIDIuNT9kb3VibGUsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbMS4wLCAyLjUsIDMuMF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMigxP2ludCwgMi41P2RvdWJsZSwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MyKGRvdWJsZS4uLiB4cyA9IFsxLjAsIDIuNSwgMy4wXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MyKDE/bG9uZywgMi41P2RvdWJsZSwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MyKGRvdWJsZS4uLiB4cyA9IFsxLjAsIDIuNSwgMy4wXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MyKDE/bG9uZywgMj9kb3VibGUsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbMS4wLCAyLjAsIDMuMF0pJyAvPgorCis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKDEsIDIsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMyhDb21wYXJhYmxlLi4uIHhzID0gWzEsIDIsIDNdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczMoJ2EnLCAnYicsICdjJykgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKFN0cmluZy4uLiB4cyA9IFthLCBiLCBjXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKDEsICdiJywgJ2MnKSBleHBlY3RlZD0ndmFyYXJnczMoQ29tcGFyYWJsZS4uLiB4cyA9IFsxLCBiLCBjXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKCdhJywgJ2InLCAzKSBleHBlY3RlZD0ndmFyYXJnczMoQ29tcGFyYWJsZS4uLiB4cyA9IFthLCBiLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKCdhJywgW10sIDMpIGV4cGVjdGVkPSd2YXJhcmdzMyhPYmplY3QuLi4geHMgPSBbYSwgW10sIDNdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczMobnVsbCwgJ2InLCBudWxsKSBleHBlY3RlZD0ndmFyYXJnczMoT2JqZWN0Li4uIHhzID0gW251bGwsIGIsIG51bGxdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczMobnVsbCwgMiwgbnVsbCkgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKE9iamVjdC4uLiB4cyA9IFtudWxsLCAyLCBudWxsXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKG51bGwsIFtdLCBudWxsKSBleHBlY3RlZD0ndmFyYXJnczMoT2JqZWN0Li4uIHhzID0gW251bGwsIFtdLCBudWxsXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKG51bGwsIG51bGwsIG51bGwpIGV4cGVjdGVkPSd2YXJhcmdzMyhPYmplY3QuLi4geHMgPSBbbnVsbCwgbnVsbCwgbnVsbF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMygpIGV4cGVjdGVkPSd2YXJhcmdzMyhTdHJpbmcuLi4geHMgPSBbXSknIC8+CisKKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai52YXJhcmdzNChudWxsLCBudWxsLCBudWxsKX08L0A+CisKKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai52YXJhcmdzNSgxLCAyLCAzLCA0LCA1KX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im11bHRpcGxlIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoudmFyYXJnczUoMSwgMiwgMywgNCl9PC9APgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3M1KDEsIDIsIDMpfTwvQD4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai52YXJhcmdzNSgxLCAyKX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im11bHRpcGxlIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoudmFyYXJnczUoMSl9PC9APgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNSgpIGV4cGVjdGVkPSd2YXJhcmdzNShpbnQuLi4geHMgPSBbXSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczYoJ3MnLCAyKSBleHBlY3RlZD0ndmFyYXJnczYoU3RyaW5nIGExID0gcywgaW50Li4uIHhzID0gWzJdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczYoJ3MnKSBleHBlY3RlZD0ndmFyYXJnczYoU3RyaW5nIGExID0gcywgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNigxLCAyKSBleHBlY3RlZD0ndmFyYXJnczYoT2JqZWN0IGExID0gMSwgaW50IGEyID0gMiwgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJubyBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3M2KDEpfTwvQD4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNygxP2ludCwgMj9pbnQpIGV4cGVjdGVkPSd2YXJhcmdzNyhpbnQuLi4geHMgPSBbMSwgMl0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNygxP3Nob3J0LCAyP2ludCkgZXhwZWN0ZWQ9J3ZhcmFyZ3M3KHNob3J0IGExID0gMSwgaW50Li4uIHhzID0gWzJdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVsbEFtYmlndW91cygnYScpIGV4cGVjdGVkPSdtTnVsbEFtYmlndW91cyhTdHJpbmcgcyA9IGEpJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVsbEFtYmlndW91cygxMjMpIGV4cGVjdGVkPSdtTnVsbEFtYmlndW91cyhpbnQgaSA9IDEyMyknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdWxsQW1iaWd1b3VzKDEuOSkgZXhwZWN0ZWQ9J21OdWxsQW1iaWd1b3VzKGludCBpID0gMSknIC8+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubU51bGxBbWJpZ3VvdXMoMT9kb3VibGUpfTwvQD4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tTnVsbEFtYmlndW91cygxLjk/ZG91YmxlKX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubU51bGxBbWJpZ3VvdXMobnVsbCl9PC9APgorCis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdWxsQW1iaWd1b3VzMihudWxsKSBleHBlY3RlZD0nbU51bGxBbWJpZ3VvdXMoT2JqZWN0IG8gPSBudWxsKScgLz4KKworPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJubyBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLm1OdWxsTm9uQW1iaWd1b3VzKG51bGwpfTwvQD4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tUmFyZVdyYXBwaW5ncyhvYmouc3RyaW5nQWRhcHRlZFRvQm9vbGVhbjIsIG9iai53cmFwcGVyTnVtYmVyLCBvYmoud3JhcHBlck51bWJlciwgb2JqLndyYXBwZXJOdW1iZXIsIG9iai5zdHJpbmdBZGFwdGVkVG9Cb29sZWFuMikKKyAgICAgICAgICAgICAgIGV4cGVjdGVkPSdtUmFyZVdyYXBwaW5ncyhTdHJpbmcgcyA9IHllcywgZG91YmxlIGQxID0gMTIzLjAwMDEsIERvdWJsZSBkMiA9IDEyMy4wMDAxLCBkb3VibGUgZDMgPSAxMjMuMDAwMSwgYiA9IHRydWUpJyAvPgorICAgICAgICAgICAgICAgCis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubVJhcmVXcmFwcGluZ3MyKG9iai5hZGFwdGVkTnVtYmVyKX08L0A+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvdGVtcGxhdGVzL292ZXJsb2FkZWQtbWV0aG9kcy0yLWljaS0yLjMuMjEuZnRsIGIvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZyZWVtYXJrZXIvdGVzdC90ZW1wbGF0ZXN1aXRlL3RlbXBsYXRlcy9vdmVybG9hZGVkLW1ldGhvZHMtMi1pY2ktMi4zLjIxLmZ0bAppbmRleCA2ZTE4NzU4Li5kMzFmYTY3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZXNvdXJjZXMvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvdGVtcGxhdGVzL292ZXJsb2FkZWQtbWV0aG9kcy0yLWljaS0yLjMuMjEuZnRsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItaWNpLTIuMy4yMS5mdGwKQEAgLTYsOCArNiw4IEBACiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdWxsMSgxMjMpIGV4cGVjdGVkPSJtTnVsbDEoaW50IGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bGwyKG51bGwpIGV4cGVjdGVkPSJtTnVsbDIoU3RyaW5nIGExID0gbnVsbCkiIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1WYXJhcmdzKCdhJywgbnVsbCkgZXhwZWN0ZWQ9Im1WYXJhcmdzKFN0cmluZy4uLiBhMSA9IGFudWxsKSIgLz4KLTxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tVmFyYXJncyhudWxsLCAnYScpfTwvQD4KLTxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tU3BlY2lmaWNpdHkoJ2EnLCAnYicpfTwvQD4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVZhcmFyZ3MobnVsbCwgJ2EnKSBleHBlY3RlZD0ibVZhcmFyZ3MoRmlsZSBhMSwgU3RyaW5nLi4uIGEyKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVNwZWNpZmljaXR5KCdhJywgJ2InKSBleHBlY3RlZD0ibVNwZWNpZmljaXR5KFN0cmluZyBhMSwgT2JqZWN0IGEyKSIgLz4KIAogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tQ2hhcignYScpIGV4cGVjdGVkPSdtQ2hhcihjaGFyIGExID0gYSknIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1Cb29sZWFuKHRydWUpIGV4cGVjdGVkPSJtQm9vbGVhbihib29sZWFuIGExID0gdHJ1ZSkiIC8+CkBAIC0xNiwyNSArMTYsMjUgQEAKIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubUludE5vbk92ZXJsb2FkZWQoMTIzP2xvbmcpIGV4cGVjdGVkPTEyMyAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tSW50Tm9uT3ZlcmxvYWRlZCgxMjMpIGV4cGVjdGVkPTEyMyAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tSW50Tm9uT3ZlcmxvYWRlZCgxMjMuNSkgZXhwZWN0ZWQ9MTIzIC8+Ci08QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1JbnROb25PdmVybG9hZGVkKDIxNDc0ODM2NDgpIGV4cGVjdGVkPS0yMTQ3NDgzNjQ4IC8+IDwjLS0gRklYTUUgb3ZlcmZsb3cgLS0+Ci08QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+PEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRWU0JveGVkKDEyMy41KSBleHBlY3RlZD0xMjMgLz48L0A+PCMtLSBGSVhNRSAtLT4KLTxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj48QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZFZTQm94ZWQoMTIzP2ludCkgZXhwZWN0ZWQ9MTIzIC8+PC9APjwjLS0gRklYTUUgLS0+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1JbnROb25PdmVybG9hZGVkKDIxNDc0ODM2NDgpIGV4cGVjdGVkPS0yMTQ3NDgzNjQ4IC8+IDwjLS0gb3ZlcmZsb3cgLS0+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZFZTQm94ZWQoMTIzLjUpIGV4cGVjdGVkPSdtTnVtQm94ZWRWU0JveGVkKExvbmcgYTEgPSAxMjMpJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRWU0JveGVkKDEyMz9pbnQpIGV4cGVjdGVkPSdtTnVtQm94ZWRWU0JveGVkKExvbmcgYTEgPSAxMjMpJyAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRWU0JveGVkKDEyMz9sb25nKSBleHBlY3RlZD0ibU51bUJveGVkVlNCb3hlZChMb25nIGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUJveGVkVlNCb3hlZCgxMjM/c2hvcnQpIGV4cGVjdGVkPSJtTnVtQm94ZWRWU0JveGVkKFNob3J0IGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIAotICAgIGFjdHVhbD1vYmoubU51bVVuYW1iaWdvdXMoMjE0NzQ4MzY0OCkgZXhwZWN0ZWQ9Im1OdW1VbmFtYmlnb3VzKEludGVnZXIgYTEgPSAtMjE0NzQ4MzY0OCkiIC8+IDwjLS0gRklYTUUgb3ZlcmZsb3cgLS0+CisgICAgYWN0dWFsPW9iai5tTnVtVW5hbWJpZ291cygyMTQ3NDgzNjQ4KSBleHBlY3RlZD0ibU51bVVuYW1iaWdvdXMoSW50ZWdlciBhMSA9IC0yMTQ3NDgzNjQ4KSIgLz4gPCMtLSBvdmVyZmxvdyAtLT4KIAogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tSW50UHJpbVZTQm94ZWQoMTIzP2ludCkgZXhwZWN0ZWQ9Im1JbnRQcmltVlNCb3hlZChpbnQgYTEgPSAxMjMpIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tSW50UHJpbVZTQm94ZWQoMTIzP3Nob3J0KSBleHBlY3RlZD0ibUludFByaW1WU0JveGVkKGludCBhMSA9IDEyMykiIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1JbnRQcmltVlNCb3hlZCgxMjMpIGV4cGVjdGVkPSJtSW50UHJpbVZTQm94ZWQoaW50IGExID0gMTIzKSIgLz4KLTwjLS0gVGhpcyBkb2Vzbid0IGZhaWwgYXMgdGhlIGhpbnQgd2lsbCBiZSBJbnRlZ2VyLCBhbmQgdGh1cyB1bndyYXBwaW5nIHdpbGwgdHJ1bmNhdGUgdGhlIExvbmcgdG8gdGhhdDogLS0+Cis8Iy0tIFRoaXMgZG9lc24ndCBmYWlsIGFzIDEyM0wgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQgd2l0aG91dCBsb3NzOiAtLT4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubUludFByaW1WU0JveGVkKDEyMz9sb25nKSBleHBlY3RlZD0ibUludFByaW1WU0JveGVkKGludCBhMSA9IDEyMykiIC8+CiAKIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1WU1ByaW0oMTIzP3Nob3J0KSBleHBlY3RlZD0ibU51bVByaW1WU1ByaW0oc2hvcnQgYTEgPSAxMjMpIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbVZTUHJpbSgxMjM/aW50KSBleHBlY3RlZD0ibU51bVByaW1WU1ByaW0obG9uZyBhMSA9IDEyMykiIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1QcmltVlNQcmltKDEyMz9sb25nKSBleHBlY3RlZD0ibU51bVByaW1WU1ByaW0obG9uZyBhMSA9IDEyMykiIC8+Ci08QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im5vIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubU51bVByaW1WU1ByaW0oMTIzP2RvdWJsZSl9PC9APjwjLS0gRklYTUU/IC0tPgotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbVZTUHJpbSgxMjM0NTYpIGV4cGVjdGVkPSJtTnVtUHJpbVZTUHJpbShzaG9ydCBhMSA9IC03NjE2KSIgLz48Iy0tIEZJWE1FIG92ZXJmbG93LCBoYWQgdG8gY2hvb3NlIGxvbmcgLS0+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1QcmltVlNQcmltKDEyMz9kb3VibGUpIGV4cGVjdGVkPSJtTnVtUHJpbVZTUHJpbShsb25nIGExID0gMTIzKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1WU1ByaW0oMTIzNDU2KSBleHBlY3RlZD0ibU51bVByaW1WU1ByaW0obG9uZyBhMSA9IDEyMzQ1NikiIC8+CiAKIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1BbGwoMTIzP2J5dGUpIGV4cGVjdGVkPSJtTnVtUHJpbUFsbChieXRlIGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1BbGwoMTIzP3Nob3J0KSBleHBlY3RlZD0ibU51bVByaW1BbGwoc2hvcnQgYTEgPSAxMjMpIiAvPgpAQCAtNDIsNyArNDIsNyBAQAogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUFsbCgxMjM/bG9uZykgZXhwZWN0ZWQ9Im1OdW1QcmltQWxsKGxvbmcgYTEgPSAxMjMpIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUFsbCgxMjM/ZmxvYXQpIGV4cGVjdGVkPSJtTnVtUHJpbUFsbChmbG9hdCBhMSA9IDEyMy4wKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1BbGwoMTIzP2RvdWJsZSkgZXhwZWN0ZWQ9Im1OdW1QcmltQWxsKGRvdWJsZSBhMSA9IDEyMy4wKSIgLz4KLTxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tTnVtUHJpbUFsbCgxMjMpfTwvQD48Iy0tIEZJWE1FIC0tPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUFsbCgxMjMpIGV4cGVjdGVkPSJtTnVtUHJpbUFsbChCaWdEZWNpbWFsIGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1BbGwob2JqLmJpZ0ludGVnZXIoMTIzKSkgZXhwZWN0ZWQ9Im1OdW1QcmltQWxsKEJpZ0ludGVnZXIgYTEgPSAxMjMpIiAvPgogCiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEFsbCgxMjM/Ynl0ZSkgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEFsbChCeXRlIGExID0gMTIzKSIgLz4KQEAgLTYxLDM2ICs2MSwxNDQgQEAKIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1BbGwybmQoMTIzP2Zsb2F0KSBleHBlY3RlZD0ibU51bVByaW1BbGwybmQoZG91YmxlIGExID0gMTIzLjApIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUFsbDJuZCgxMjM/ZG91YmxlKSBleHBlY3RlZD0ibU51bVByaW1BbGwybmQoZG91YmxlIGExID0gMTIzLjApIiAvPgogCi08Iy0tIEZJWE1FCiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEFsbDJuZCgxMjM/Ynl0ZSkgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEFsbDJuZChTaG9ydCBhMSA9IDEyMykiIC8+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEFsbDJuZCgxMjM/c2hvcnQpIGV4cGVjdGVkPSJtTnVtQm94ZWRBbGwybmQoU2hvcnQgYTEgPSAxMjMpIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRBbGwybmQoMTIzP2ludCkgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEFsbDJuZChMb25nIGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUJveGVkQWxsMm5kKDEyMz9sb25nKSBleHBlY3RlZD0ibU51bUJveGVkQWxsMm5kKExvbmcgYTEgPSAxMjMpIiAvPgogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRBbGwybmQoMTIzP2Zsb2F0KSBleHBlY3RlZD0ibU51bUJveGVkQWxsMm5kKERvdWJsZSBhMSA9IDEyMy4wKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUJveGVkQWxsMm5kKDEyMz9kb3VibGUpIGV4cGVjdGVkPSJtTnVtQm94ZWRBbGwybmQoRG91YmxlIGExID0gMTIzLjApIiAvPgotIC0tPgogIAogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIoMTIzP2ludCkgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihsb25nIGExID0gMTIzKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1GYWxsYmFja1RvTnVtYmVyKDEyMz9sb25nKSBleHBlY3RlZD0ibU51bVByaW1GYWxsYmFja1RvTnVtYmVyKGxvbmcgYTEgPSAxMjMpIiAvPgotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIoMTIzP2RvdWJsZSkgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihOdW1iZXIgYTEgPSAxMjMuMCkiIC8+Ci08Iy0tIEZJWE1FCi08QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1QcmltRmFsbGJhY2tUb051bWJlcigxMjMpIGV4cGVjdGVkPSJtTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIoTnVtYmVyIGExID0gMTIzKSIgLz4KLS0tPgotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIob2JqLmJpZ0ludGVnZXIoMTIzKSkgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihOdW1iZXIgYTEgPSAxMjMpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIoMTIzP2RvdWJsZSkgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihsb25nIGExID0gMTIzKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1GYWxsYmFja1RvTnVtYmVyKDEyMy41P2RvdWJsZSkgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihOdW1iZXIgYTEgPSAxMjMuNSkiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1QcmltRmFsbGJhY2tUb051bWJlcigxMjMpIGV4cGVjdGVkPSJtTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIobG9uZyBhMSA9IDEyMykiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1QcmltRmFsbGJhY2tUb051bWJlcihvYmouYmlnSW50ZWdlcigxMjMpKSBleHBlY3RlZD0ibU51bVByaW1GYWxsYmFja1RvTnVtYmVyKGxvbmcgYTEgPSAxMjMpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtUHJpbUZhbGxiYWNrVG9OdW1iZXIob2JqLmJpZ0ludGVnZXIoOTIyMzM3MjAzNjg1NDc3NTgwOCkpCisgICAgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihOdW1iZXIgYTEgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4KSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1GYWxsYmFja1RvTnVtYmVyKG9iai5yYXRpb25hbCgyNDYsIDIpKSBleHBlY3RlZD0ibU51bVByaW1GYWxsYmFja1RvTnVtYmVyKE51bWJlciBhMSA9IDI0Ni8yKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bVByaW1GYWxsYmFja1RvTnVtYmVyKCd4JykgZXhwZWN0ZWQ9Im1OdW1QcmltRmFsbGJhY2tUb051bWJlcihPYmplY3QgYTEgPSB4KSIgLz4KIAotPCMtLSBGSVhNRQogPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMz9pbnQpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKExvbmcgYTEgPSAxMjMpIiAvPgotLS0+CiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoMTIzP2xvbmcpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKExvbmcgYTEgPSAxMjMpIiAvPgotPCMtLSBGSVhNRQotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMz9kb3VibGUpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKE51bWJlciBhMSA9IDEyMy4wKSIgLz4KLS0tPgotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMykgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoTnVtYmVyIGExID0gMTIzKSIgLz4KLTxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUJveGVkRmFsbGJhY2tUb051bWJlcihvYmouYmlnSW50ZWdlcigxMjMpKSBleHBlY3RlZD0ibU51bUJveGVkRmFsbGJhY2tUb051bWJlcihOdW1iZXIgYTEgPSAxMjMpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMz9kb3VibGUpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKExvbmcgYTEgPSAxMjMpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMy41P2RvdWJsZSkgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoTnVtYmVyIGExID0gMTIzLjUpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKDEyMykgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoTG9uZyBhMSA9IDEyMykiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIob2JqLmJpZ0ludGVnZXIoMTIzKSkgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoTG9uZyBhMSA9IDEyMykiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIob2JqLmJpZ0ludGVnZXIoOTIyMzM3MjAzNjg1NDc3NTgwOCkpCisgICAgZXhwZWN0ZWQ9Im1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIoTnVtYmVyIGExID0gOTIyMzM3MjAzNjg1NDc3NTgwOCkiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Cb3hlZEZhbGxiYWNrVG9OdW1iZXIob2JqLnJhdGlvbmFsKDI0NiwgMikpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKE51bWJlciBhMSA9IDI0Ni8yKSIgLz4KIDxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUJveGVkRmFsbGJhY2tUb051bWJlcigneCcpIGV4cGVjdGVkPSJtTnVtQm94ZWRGYWxsYmFja1RvTnVtYmVyKE9iamVjdCBhMSA9IHgpIiAvPgogCi08Iy0tIEZJWE1FCiA8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1EZWNpbWFsTG9zcygxLjUpIGV4cGVjdGVkPSJtRGVjaW1hbExvc3MoZG91YmxlIGExID0gMS41KSIgLz4KLS0tPgotPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tRGVjaW1hbExvc3MoMS41P2RvdWJsZSkgZXhwZWN0ZWQ9Im1EZWNpbWFsTG9zcyhkb3VibGUgYTEgPSAxLjUpIiAvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubURlY2ltYWxMb3NzKDEuNT9kb3VibGUpIGV4cGVjdGVkPSJtRGVjaW1hbExvc3MoZG91YmxlIGExID0gMS41KSIgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQ29udmVyc2lvbkxvc2VzMSgxP2RvdWJsZSwgJycsICcnKSBleHBlY3RlZD0iTnVtYmVyIDEuMCBqYXZhLmxhbmcuRG91YmxlIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQ29udmVyc2lvbkxvc2VzMSgxP3Nob3J0LCAnJywgJycpIGV4cGVjdGVkPSJOdW1iZXIgMSBqYXZhLmxhbmcuU2hvcnQiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Db252ZXJzaW9uTG9zZXMxKDE/bG9uZywgJycsICcnKSBleHBlY3RlZD0iTnVtYmVyIDEgamF2YS5sYW5nLkxvbmciIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Db252ZXJzaW9uTG9zZXMyKDE/ZG91YmxlLCAnJywgJycpIGV4cGVjdGVkPSJOdW1iZXIgMS4wIGphdmEubGFuZy5Eb3VibGUiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Db252ZXJzaW9uTG9zZXMyKDE/c2hvcnQsICcnLCAnJykgZXhwZWN0ZWQ9Ik51bWJlciAxIGphdmEubGFuZy5TaG9ydCIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUNvbnZlcnNpb25Mb3NlczIoMT9sb25nLCAnJywgJycpIGV4cGVjdGVkPSJOdW1iZXIgMSBqYXZhLmxhbmcuTG9uZyIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUNvbnZlcnNpb25Mb3NlczMoMT9kb3VibGUsICcnLCAnJykgZXhwZWN0ZWQ9IlNlcmlhbGl6YWJsZSAxLjAgamF2YS5sYW5nLkRvdWJsZSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubU51bUNvbnZlcnNpb25Mb3NlczMoMT9pbnQsICcnLCAnJykgZXhwZWN0ZWQ9IlNlcmlhbGl6YWJsZSAxIGphdmEubGFuZy5JbnRlZ2VyIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVtQ29udmVyc2lvbkxvc2VzMygxP3Nob3J0LCAnJywgJycpIGV4cGVjdGVkPSJTZXJpYWxpemFibGUgMSBqYXZhLmxhbmcuU2hvcnQiIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdW1Db252ZXJzaW9uTG9zZXMzKDE/bG9uZywgJycsICcnKSBleHBlY3RlZD0iU2VyaWFsaXphYmxlIDEgamF2YS5sYW5nLkxvbmciIC8+CisKKzwjLS0gQmlnRGVjaW1hbC10by1pbnQgaXMgcHJlZmVycmVkIG92ZXIgdG8tbG9uZyBmb3IgQkMgYW5kIHVzZXIgZXhwZWN0YXRpb25zOiAtLT4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkludEFuZExvbmcoMSkgZXhwZWN0ZWQ9Im5JbnRBbmRMb25nKGludCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkludEFuZExvbmcoMT9sb25nKSBleHBlY3RlZD0ibkludEFuZExvbmcobG9uZyAxKSIgLz4KKzwjLS0gQmlnRGVjaW1hbC10by1zaG9ydCBpcywgaG93ZXZlciB1bmZhdm9yZWQgZHVlIHRvIHRoZSBoaWdoZXIgY2hhbmNlIG9mIG92ZXJmbG93OiAtLT4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkludEFuZFNob3J0KDEpIGV4cGVjdGVkPSJuSW50QW5kU2hvcnQoaW50IDEpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5uSW50QW5kU2hvcnQoMT9zaG9ydCkgZXhwZWN0ZWQ9Im5JbnRBbmRTaG9ydChzaG9ydCAxKSIgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubkxvbmdBbmRTaG9ydCgxKSBleHBlY3RlZD0ibkxvbmdBbmRTaG9ydChsb25nIDEpIiAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5uTG9uZ0FuZFNob3J0KDE/c2hvcnQpIGV4cGVjdGVkPSJuTG9uZ0FuZFNob3J0KHNob3J0IDEpIiAvPgorCis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEsIDIsIDMuNSkgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gbnVsbCwgZG91YmxlLi4uIHhzID0gWzEuMCwgMi4wLCAzLjVdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczEobnVsbCwgMSwgMi41LCAzKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSBudWxsLCBkb3VibGUuLi4geHMgPSBbMS4wLCAyLjUsIDMuMF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMShudWxsLCAxLjUsIDIsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIGRvdWJsZS4uLiB4cyA9IFsxLjUsIDIuMCwgMy4wXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEsIDIsICdjJykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gbnVsbCwgT2JqZWN0Li4uIHhzID0gWzEsIDIsIGNdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczEobnVsbCwgMSwgJ2InLCAzKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSBudWxsLCBPYmplY3QuLi4geHMgPSBbMSwgYiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMShudWxsLCAnYScsIDIsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIE9iamVjdC4uLiB4cyA9IFthLCAyLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKCdzJywgMSwgMiwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gInMiLCBpbnQuLi4geHMgPSBbMSwgMiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMSgncycsIDEuMSwgMi4xLCAzLjEpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9ICJzIiwgZG91YmxlLi4uIHhzID0gWzEuMSwgMi4xLCAzLjFdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczEoJ3MnLCAnYScsICdiJywgJ2MnKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSAicyIsIE9iamVjdC4uLiB4cyA9IFthLCBiLCBjXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEsIDIsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIGludC4uLiB4cyA9IFsxLCAyLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEuMSwgMi4xLCAzLjEpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIGRvdWJsZS4uLiB4cyA9IFsxLjEsIDIuMSwgMy4xXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsICdhJywgJ2InLCAnYycpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIE9iamVjdC4uLiB4cyA9IFthLCBiLCBjXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEsIDIsIDM/ZG91YmxlKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSBudWxsLCBpbnQuLi4geHMgPSBbMSwgMiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMShudWxsLCAxLCAyP2RvdWJsZSwgMz9kb3VibGUpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIGRvdWJsZS4uLiB4cyA9IFsxLjAsIDIuMCwgMy4wXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDEsIDI/ZmxvYXQsIDM/ZmxvYXQpIGV4cGVjdGVkPSd2YXJhcmdzMShTdHJpbmcgcyA9IG51bGwsIGRvdWJsZS4uLiB4cyA9IFsxLjAsIDIuMCwgMy4wXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MxKG51bGwsIDE/ZG91YmxlLCAyP2J5dGUsIDM/Ynl0ZSkgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKFN0cmluZyBzID0gbnVsbCwgaW50Li4uIHhzID0gWzEsIDIsIDNdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczEoMCwgMSwgMiwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MxKE9iamVjdCBzID0gMCwgT2JqZWN0Li4uIHhzID0gWzEsIDIsIDNdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczEoJ3MnKSBleHBlY3RlZD0ndmFyYXJnczEoU3RyaW5nIHMgPSAicyIsIGludC4uLiB4cyA9IFtdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMigxLCAyLjUsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbMS4wLCAyLjUsIDMuMF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMigxLCAyLjU/ZG91YmxlLCAzKSBleHBlY3RlZD0ndmFyYXJnczIoZG91YmxlLi4uIHhzID0gWzEuMCwgMi41LCAzLjBdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczIoMT9pbnQsIDIuNT9kb3VibGUsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbMS4wLCAyLjUsIDMuMF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMigxP2xvbmcsIDIuNT9kb3VibGUsIDMpIGV4cGVjdGVkPSd2YXJhcmdzMihkb3VibGUuLi4geHMgPSBbMS4wLCAyLjUsIDMuMF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMigxP2xvbmcsIDI/ZG91YmxlLCAzKSBleHBlY3RlZD0ndmFyYXJnczIoaW50Li4uIHhzID0gWzEsIDIsIDNdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMygxLCAyLCAzKSBleHBlY3RlZD0ndmFyYXJnczMoQ29tcGFyYWJsZS4uLiB4cyA9IFsxLCAyLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKCdhJywgJ2InLCAnYycpIGV4cGVjdGVkPSd2YXJhcmdzMyhTdHJpbmcuLi4geHMgPSBbYSwgYiwgY10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMygxLCAnYicsICdjJykgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKENvbXBhcmFibGUuLi4geHMgPSBbMSwgYiwgY10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMygnYScsICdiJywgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKENvbXBhcmFibGUuLi4geHMgPSBbYSwgYiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzMygnYScsIFtdLCAzKSBleHBlY3RlZD0ndmFyYXJnczMoT2JqZWN0Li4uIHhzID0gW2EsIFtdLCAzXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKG51bGwsICdiJywgbnVsbCkgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKFN0cmluZy4uLiB4cyA9IFtudWxsLCBiLCBudWxsXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKG51bGwsIDIsIG51bGwpIGV4cGVjdGVkPSd2YXJhcmdzMyhDb21wYXJhYmxlLi4uIHhzID0gW251bGwsIDIsIG51bGxdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczMobnVsbCwgW10sIG51bGwpIGV4cGVjdGVkPSd2YXJhcmdzMyhPYmplY3QuLi4geHMgPSBbbnVsbCwgW10sIG51bGxdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczMobnVsbCwgbnVsbCwgbnVsbCkgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKFN0cmluZy4uLiB4cyA9IFtudWxsLCBudWxsLCBudWxsXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3MzKCkgZXhwZWN0ZWQ9J3ZhcmFyZ3MzKFN0cmluZy4uLiB4cyA9IFtdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNChudWxsKSBleHBlY3RlZD0ndmFyYXJnczQoSW50ZWdlci4uLiB4cyA9IFtudWxsXSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3M0KG51bGwsIG51bGwsIG51bGwpIGV4cGVjdGVkPSd2YXJhcmdzNChJbnRlZ2VyLi4uIHhzID0gW251bGwsIG51bGwsIG51bGxdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczQoMSwgbnVsbCwgMikgZXhwZWN0ZWQ9J3ZhcmFyZ3M0KEludGVnZXIuLi4geHMgPSBbMSwgbnVsbCwgMl0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNCgxKSBleHBlY3RlZD0ndmFyYXJnczQoaW50Li4uIHhzID0gWzFdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczQoMSwgMiwgMykgZXhwZWN0ZWQ9J3ZhcmFyZ3M0KGludC4uLiB4cyA9IFsxLCAyLCAzXSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczUoMSwgMiwgMywgNCwgNSkgZXhwZWN0ZWQ9J3ZhcmFyZ3M1KGludCBhMSA9IDEsIGludCBhMiA9IDIsIGludCBhMyA9IDMsIGludC4uLiB4cyA9IFs0LCA1XSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLnZhcmFyZ3M1KDEsIDIsIDMsIDQpIGV4cGVjdGVkPSd2YXJhcmdzNShpbnQgYTEgPSAxLCBpbnQgYTIgPSAyLCBpbnQgYTMgPSAzLCBpbnQuLi4geHMgPSBbNF0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNSgxLCAyLCAzKSBleHBlY3RlZD0ndmFyYXJnczUoaW50IGExID0gMSwgaW50IGEyID0gMiwgaW50IGEzID0gMywgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNSgxLCAyKSBleHBlY3RlZD0ndmFyYXJnczUoaW50IGExID0gMSwgaW50IGEyID0gMiwgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNSgxKSBleHBlY3RlZD0ndmFyYXJnczUoaW50IGExID0gMSwgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNSgpIGV4cGVjdGVkPSd2YXJhcmdzNShpbnQuLi4geHMgPSBbXSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczYoJ3MnLCAyKSBleHBlY3RlZD0ndmFyYXJnczYoU3RyaW5nIGExID0gcywgaW50Li4uIHhzID0gWzJdKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoudmFyYXJnczYoJ3MnKSBleHBlY3RlZD0ndmFyYXJnczYoU3RyaW5nIGExID0gcywgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNigxLCAyKSBleHBlY3RlZD0ndmFyYXJnczYoT2JqZWN0IGExID0gMSwgaW50IGEyID0gMiwgaW50Li4uIHhzID0gW10pJyAvPgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJubyBjb21wYXRpYmxlIG92ZXJsb2FkZWQiPiR7b2JqLnZhcmFyZ3M2KDEpfTwvQD4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNygxP2ludCwgMj9pbnQpIGV4cGVjdGVkPSd2YXJhcmdzNyhpbnQuLi4geHMgPSBbMSwgMl0pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai52YXJhcmdzNygxP3Nob3J0LCAyP2ludCkgZXhwZWN0ZWQ9J3ZhcmFyZ3M3KHNob3J0IGExID0gMSwgaW50Li4uIHhzID0gWzJdKScgLz4KKworPCMtLSBUZXN0cyB0aGF0IGEgcHJlLTIuMy4yMSBidWcgaXMgZml4ZWQgbm93OiAtLT4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVZhcmFyZ3NJZ25vcmVkVGFpbCgxLCAyLCAzKSBleHBlY3RlZD0nbVZhcmFyZ3NJZ25vcmVkVGFpbChpbnQuLi4gaXMgPSBbMSwgMiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tVmFyYXJnc0lnbm9yZWRUYWlsKDEsIDIsIDMuNSkgZXhwZWN0ZWQ9J21WYXJhcmdzSWdub3JlZFRhaWwoaW50IGkgPSAxLCBkb3VibGUuLi4gZHMgPSBbMi4wLCAzLjVdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVsbEFtYmlndW91cygnYScpIGV4cGVjdGVkPSdtTnVsbEFtYmlndW91cyhTdHJpbmcgcyA9IGEpJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVsbEFtYmlndW91cygxMjMpIGV4cGVjdGVkPSdtTnVsbEFtYmlndW91cyhpbnQgaSA9IDEyMyknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdWxsQW1iaWd1b3VzKDEuOSkgZXhwZWN0ZWQ9J21OdWxsQW1iaWd1b3VzKGludCBpID0gMSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1OdWxsQW1iaWd1b3VzKDE/ZG91YmxlKSBleHBlY3RlZD0nbU51bGxBbWJpZ3VvdXMoaW50IGkgPSAxKScgLz4KKzxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibm8gY29tcGF0aWJsZSBvdmVybG9hZGVkIj4ke29iai5tTnVsbEFtYmlndW91cygxLjk/ZG91YmxlKX08L0A+Cis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im11bHRpcGxlIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubU51bGxBbWJpZ3VvdXMobnVsbCl9PC9APgorCis8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im11bHRpcGxlIGNvbXBhdGlibGUgb3ZlcmxvYWRlZCI+JHtvYmoubU51bGxBbWJpZ3VvdXMyKG51bGwpfTwvQD4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTnVsbE5vbkFtYmlndW91cyhudWxsKSBleHBlY3RlZD0nbU51bGxOb25BbWJpZ3VvdXMoU3RyaW5nIHMgPSBudWxsKScgLz4KKworPCMtLSBUaGUgcHJpbWl0aXZlIGludC1zIHdpbGwgd2luIHR3aWNlLCBidXQgdGhlbiBTdHJpbmcgd2lucyBvdmVyIE9iamVjdCwgd2hpY2ggaXMgc3Ryb25nZXI6IC0tPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTG93UmFua1dpbnMoMSwgMiwgJ2EnKSBleHBlY3RlZD0nbUxvd1JhbmtXaW5zKEludGVnZXIgeCA9IDEsIEludGVnZXIgeSA9IDIsIFN0cmluZyBzID0gYSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLmZpbGUsIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5zdHJpbmdXcmFwcGVkQXNCb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKEZpbGUgZiA9IGZpbGUsIGRvdWJsZSBkMSA9IDEyMy4wMDAyLCBEb3VibGUgZDIgPSAxMjMuMDAwMiwgZG91YmxlIGQzID0gMTIzLjAwMDIsIGIgPSB0cnVlKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLnN0cmluZ1dyYXBwZWRBc0Jvb2xlYW4sIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5zdHJpbmdBZGFwdGVkVG9Cb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKFN0cmluZyBzID0geWVzLCBkb3VibGUgZDEgPSAxMjMuMDAwMiwgRG91YmxlIGQyID0gMTIzLjAwMDIsIGRvdWJsZSBkMyA9IDEyMy4wMDAyLCBiID0gdHJ1ZSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1SYXJlV3JhcHBpbmdzKG9iai5zdHJpbmdBZGFwdGVkVG9Cb29sZWFuMiwgb2JqLndyYXBwZXJOdW1iZXIsIG9iai53cmFwcGVyTnVtYmVyLCBvYmoud3JhcHBlck51bWJlciwgb2JqLnN0cmluZ0FkYXB0ZWRUb0Jvb2xlYW4yKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKFN0cmluZyBzID0geWVzLCBkb3VibGUgZDEgPSAxMjMuMDAwMSwgRG91YmxlIGQyID0gMTIzLjAwMDEsIGRvdWJsZSBkMyA9IDEyMy4wMDAxLCBiID0gdHJ1ZSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1SYXJlV3JhcHBpbmdzKG9iai5ib29sZWFuV3JhcHBlZEFzQW5vdGhlckJvb2xlYW4sIDAsIDAsIDAsIG9iai5ib29sZWFuV3JhcHBlZEFzQW5vdGhlckJvb2xlYW4pCisgICAgICAgICAgICAgICBleHBlY3RlZD0nbVJhcmVXcmFwcGluZ3MoT2JqZWN0IG8gPSB0cnVlLCBkb3VibGUgZDEgPSAwLjAsIERvdWJsZSBkMiA9IDAuMCwgZG91YmxlIGQzID0gMC4wLCBiID0gdHJ1ZSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1SYXJlV3JhcHBpbmdzKG9iai5hZGFwdGVkTnVtYmVyLCAwLCAwLCAwLCAhb2JqLmJvb2xlYW5XcmFwcGVkQXNBbm90aGVyQm9vbGVhbikKKyAgICAgICAgICAgICAgIGV4cGVjdGVkPSdtUmFyZVdyYXBwaW5ncyhPYmplY3QgbyA9IDEyNCwgZG91YmxlIGQxID0gMC4wLCBEb3VibGUgZDIgPSAwLjAsIGRvdWJsZSBkMyA9IDAuMCwgYiA9IHRydWUpJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tUmFyZVdyYXBwaW5ncyhvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuLCAwLCAwLCAwLCAhb2JqLnN0cmluZ0FkYXB0ZWRUb0Jvb2xlYW4pCisgICAgICAgICAgICAgICBleHBlY3RlZD0nbVJhcmVXcmFwcGluZ3MoT2JqZWN0IG8gPSB0cnVlLCBkb3VibGUgZDEgPSAwLjAsIERvdWJsZSBkMiA9IDAuMCwgZG91YmxlIGQzID0gMC4wLCBiID0gdHJ1ZSknIC8+CisgICAgICAgICAgICAgICAKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3MyKG9iai5hZGFwdGVkTnVtYmVyKSBleHBlY3RlZD0nbVJhcmVXcmFwcGluZ3MyKGJ5dGUgYiA9IDEyNCknIC8+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZXNvdXJjZXMvZnJlZW1hcmtlci90ZXN0L3RlbXBsYXRlc3VpdGUvdGVtcGxhdGVzL292ZXJsb2FkZWQtbWV0aG9kcy0yLWluYy1pY2ktMi4zLjIwLmZ0bCBiL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItaW5jLWljaS0yLjMuMjAuZnRsCmluZGV4IDU2NDRlYjEuLmY5MWQ3ZDggMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItaW5jLWljaS0yLjMuMjAuZnRsCisrKyBiL3NyYy90ZXN0L3Jlc291cmNlcy9mcmVlbWFya2VyL3Rlc3QvdGVtcGxhdGVzdWl0ZS90ZW1wbGF0ZXMvb3ZlcmxvYWRlZC1tZXRob2RzLTItaW5jLWljaS0yLjMuMjAuZnRsCkBAIC0zLDUgKzMsMjIgQEAKIDxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZCI+JHtvYmoubUludFByaW1WU0JveGVkKDEyMz9sb25nKX08L0A+CiA8QGFzc2VydEZhaWxzIG1lc3NhZ2U9Im11bHRpcGxlIGNvbXBhdGlibGUgb3ZlcmxvYWQiPiR7b2JqLm1JbnRQcmltVlNCb3hlZCgxMjM/c2hvcnQpfTwvQD4KIDxAYXNzZXJ0RmFpbHMgbWVzc2FnZT0ibXVsdGlwbGUgY29tcGF0aWJsZSBvdmVybG9hZCI+JHtvYmoubUludFByaW1WU0JveGVkKDEyMyl9PC9APgorPEBhc3NlcnRGYWlscyBtZXNzYWdlPSJtdWx0aXBsZSBjb21wYXRpYmxlIG92ZXJsb2FkIj4ke29iai52YXJhcmdzNCgxLCAyLCAzKX08L0A+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVZhcmFyZ3NJZ25vcmVkVGFpbCgxLCAyLCAzKSBleHBlY3RlZD0nbVZhcmFyZ3NJZ25vcmVkVGFpbChpbnQuLi4gaXMgPSBbMSwgMiwgM10pJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tVmFyYXJnc0lnbm9yZWRUYWlsKDEsIDIsIDMuNSkgZXhwZWN0ZWQ9J21WYXJhcmdzSWdub3JlZFRhaWwoaW50Li4uIGlzID0gWzEsIDIsIDNdKScgLz4KKworPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tTG93UmFua1dpbnMoMSwgMiwgJ2EnKSBleHBlY3RlZD0nbUxvd1JhbmtXaW5zKEludGVnZXIgeCA9IDEsIEludGVnZXIgeSA9IDIsIFN0cmluZyBzID0gYSknIC8+CisKKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLmZpbGUsIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5zdHJpbmdXcmFwcGVkQXNCb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKEZpbGUgZiA9IGZpbGUsIGRvdWJsZSBkMSA9IDEyMy4wMDAxLCBEb3VibGUgZDIgPSAxMjMuMDAwMiwgZG91YmxlIGQzID0gMTIzLjAwMDIsIGIgPSB0cnVlKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLnN0cmluZ1dyYXBwZWRBc0Jvb2xlYW4sIG9iai5hZGFwdGVkTnVtYmVyLCBvYmouYWRhcHRlZE51bWJlciwgb2JqLmFkYXB0ZWROdW1iZXIsIG9iai5zdHJpbmdBZGFwdGVkVG9Cb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKFN0cmluZyBzID0geWVzLCBkb3VibGUgZDEgPSAxMjMuMDAwMSwgRG91YmxlIGQyID0gMTIzLjAwMDIsIGRvdWJsZSBkMyA9IDEyMy4wMDAyLCBiID0gZmFsc2UpJyAvPgorPEBhc3NlcnRFcXVhbHMgYWN0dWFsPW9iai5tUmFyZVdyYXBwaW5ncyhvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuLCAwLCAwLCAwLCBvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKE9iamVjdCBvID0gdHJ1ZSwgZG91YmxlIGQxID0gMC4wLCBEb3VibGUgZDIgPSAwLjAsIGRvdWJsZSBkMyA9IDAuMCwgYiA9IGZhbHNlKScgLz4KKzxAYXNzZXJ0RXF1YWxzIGFjdHVhbD1vYmoubVJhcmVXcmFwcGluZ3Mob2JqLmFkYXB0ZWROdW1iZXIsIDAsIDAsIDAsICFvYmouYm9vbGVhbldyYXBwZWRBc0Fub3RoZXJCb29sZWFuKQorICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J21SYXJlV3JhcHBpbmdzKE9iamVjdCBvID0gMTI0LCBkb3VibGUgZDEgPSAwLjAsIERvdWJsZSBkMiA9IDAuMCwgZG91YmxlIGQzID0gMC4wLCBiID0gdHJ1ZSknIC8+Cis8QGFzc2VydEVxdWFscyBhY3R1YWw9b2JqLm1SYXJlV3JhcHBpbmdzKG9iai5ib29sZWFuV3JhcHBlZEFzQW5vdGhlckJvb2xlYW4sIDAsIDAsIDAsICFvYmouc3RyaW5nQWRhcHRlZFRvQm9vbGVhbikKKyAgICAgICAgICAgICAgIGV4cGVjdGVkPSdtUmFyZVdyYXBwaW5ncyhPYmplY3QgbyA9IHRydWUsIGRvdWJsZSBkMSA9IDAuMCwgRG91YmxlIGQyID0gMC4wLCBkb3VibGUgZDMgPSAwLjAsIGIgPSB0cnVlKScgLz4KIAogPCNpbmNsdWRlICdvdmVybG9hZGVkLW1ldGhvZHMtMi1pY2ktMi4zLjIwLmZ0bCc+Cg==