ZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvQW5kcm9pZE1hbmlmZXN0LnhtbAppbmRleCBjNDc3NGMyLi4zODlhYzE5IDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJNZWRpYVNjYW5uZXJBY3Rpdml0eSIgYW5kcm9pZDpsYWJlbD0iTWVkaWEgU2Nhbm5lciI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ik1lZGlhU2Nhbm5lckFjdGl2aXR5IiBhbmRyb2lkOmxhYmVsPSJNZWRpYSBQcm92aWRlciI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuVEVTVCIgLz4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9tZWRpYV9zY2FubmVyX2FjdGl2aXR5LnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL2xheW91dC9tZWRpYV9zY2FubmVyX2FjdGl2aXR5LnhtbAppbmRleCA5NzRmNjgzLi40ODA2ODQzIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy9sYXlvdXQvbWVkaWFfc2Nhbm5lcl9hY3Rpdml0eS54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvbGF5b3V0L21lZGlhX3NjYW5uZXJfYWN0aXZpdHkueG1sCkBAIC00LDkgKzQsOSBAQAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgCisKICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgCisKICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KQEAgLTE0LDEyICsxNCw0NSBAQAogICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIC0tPgogCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgCSAJCi0JYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgCi0JYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0JYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KIAotICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIiBhbmRyb2lkOnRleHRTaXplPSIxNnNwIiBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCisgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCisgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE2MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2NhbmNhcmQiCisgICAgICAgIGFuZHJvaWQ6b25DbGljaz0ic3RhcnRTY2FuIiAvPgorCisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSIzMGRpcCI+CisKKyAgICAgICAgPEVkaXRUZXh0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL251bXNvbmdzIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL251bXNvbmdzIgorICAgICAgICAgICAgYW5kcm9pZDpudW1lcmljPSJpbnRlZ2VyIgorICAgICAgICAvPgorCisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW5zZXJ0YnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJpbnNlcnRJdGVtcyIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgogCiA8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL2FwcHMvRGV2ZWxvcG1lbnQvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAppbmRleCAxODFjNGZhLi5kMTQ0YjhmIDEwMDY0NAotLS0gYS9hcHBzL0RldmVsb3BtZW50L3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvYXBwcy9EZXZlbG9wbWVudC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0yMDgsNCArMjA4LDkgQEAKICAgICA8c3RyaW5nIG5hbWU9ImJhZF9iZWhhdmlvcl9hbnJfc2VydmljZV9sYWJlbCI+QU5SIHN0YXJ0aW5nIGEgU2VydmljZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iYmFkX2JlaGF2aW9yX2Fucl9zeXN0ZW1fbGFiZWwiPlN5c3RlbSBBTlIgKGluIEFjdGl2aXR5TWFuYWdlcik8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImJhZF9iZWhhdmlvcl93ZWRnZV9zeXN0ZW1fbGFiZWwiPldlZGdlIHN5c3RlbSAoNSBtaW51dGUgc3lzdGVtIEFOUik8L3N0cmluZz4KKworICAgIDwhLS0gTWVkaWFTY2FubmVyQWN0aXZpdHkgLS0+CisgICAgPHN0cmluZyBuYW1lPSJzY2FuY2FyZCI+U2NhbiBTRCBjYXJkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJudW1zb25ncyI+IyBvZiBhbGJ1bXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Imluc2VydGJ1dHRvbiI+SW5zZXJ0ICUxcyBhbGJ1bXM8L3N0cmluZz4KIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YSBiL2FwcHMvRGV2ZWxvcG1lbnQvc3JjL2NvbS9hbmRyb2lkL2RldmVsb3BtZW50L01lZGlhU2Nhbm5lckFjdGl2aXR5LmphdmEKaW5kZXggZjc4OTEwYS4uMDRmNjQxNCAxMDA2NDQKLS0tIGEvYXBwcy9EZXZlbG9wbWVudC9zcmMvY29tL2FuZHJvaWQvZGV2ZWxvcG1lbnQvTWVkaWFTY2FubmVyQWN0aXZpdHkuamF2YQorKysgYi9hcHBzL0RldmVsb3BtZW50L3NyYy9jb20vYW5kcm9pZC9kZXZlbG9wbWVudC9NZWRpYVNjYW5uZXJBY3Rpdml0eS5qYXZhCkBAIC0xNyw1NiArMTcsMjM5IEBACiBwYWNrYWdlIGNvbS5hbmRyb2lkLmRldmVsb3BtZW50OwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb247CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQub3MuRW52aXJvbm1lbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLk1lZGlhU3RvcmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5NZWRpYVN0b3JlLkF1ZGlvOworaW1wb3J0IGFuZHJvaWQudGV4dC5FZGl0YWJsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFdhdGNoZXI7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CiAKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCiBwdWJsaWMgY2xhc3MgTWVkaWFTY2FubmVyQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eQogeworICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHByaXZhdGUgaW50IG1OdW1Ub0luc2VydCA9IDIwOworICAgIHByaXZhdGUgaW50IG1BcnRpc3RzOworICAgIHByaXZhdGUgaW50IG1BbGJ1bXM7CisgICAgcHJpdmF0ZSBpbnQgbVNvbmdzOworICAgIHByaXZhdGUgQ29udGVudFJlc29sdmVyIG1SZXNvbHZlcjsKKyAgICBwcml2YXRlIFVyaSBtQXVkaW9Vcmk7CisgICAgQ29udGVudFZhbHVlcyBtVmFsdWVzW10gPSBuZXcgQ29udGVudFZhbHVlc1sxMF07CisgICAgUmFuZG9tIG1SYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgU3RyaW5nQnVpbGRlciBtQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKICAgICBwdWJsaWMgTWVkaWFTY2FubmVyQWN0aXZpdHkoKSB7CiAgICAgfQotIAorCiAgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkIG9yIHJlc3VtZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25SZXN1bWUoKSB7Ci0gICAgICAgIHN1cGVyLm9uUmVzdW1lKCk7Ci0gICAgICAgIAorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKKwogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tZWRpYV9zY2FubmVyX2FjdGl2aXR5KTsKLSAgICAgICAgCisKICAgICAgICAgSW50ZW50RmlsdGVyIGludGVudEZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX1NUQVJURUQpOwogICAgICAgICBpbnRlbnRGaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9GSU5JU0hFRCk7CiAgICAgICAgIGludGVudEZpbHRlci5hZGREYXRhU2NoZW1lKCJmaWxlIik7CiAgICAgICAgIHJlZ2lzdGVyUmVjZWl2ZXIobVJlY2VpdmVyLCBpbnRlbnRGaWx0ZXIpOwotICAgICAgICAKLSAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgotICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7Ci0gICAgICAgICAgICAKKworICAgICAgICBFZGl0VGV4dCB0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5udW1zb25ncyk7CisgICAgICAgIHQuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIFN0cmluZyB0ZXh0ID0gcy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1OdW1Ub0luc2VydCA9IEludGVnZXIudmFsdWVPZih0ZXh0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbU51bVRvSW5zZXJ0ID0gMjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKICAgICAgICAgbVRpdGxlID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIG1UaXRsZS5zZXRUZXh0KCJTZW50IEFDVElPTl9NRURJQV9NT1VOVEVEIHRvIHRyaWdnZXIgdGhlIE1lZGlhIFNjYW5uZXIuIik7CisgICAgICAgIG1SZXNvbHZlciA9IGdldENvbnRlbnRSZXNvbHZlcigpOworICAgICAgICBtQXVkaW9VcmkgPSBNZWRpYVN0b3JlLkF1ZGlvLk1lZGlhLkVYVEVSTkFMX0NPTlRFTlRfVVJJOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgbVZhbHVlc1tpXSA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgIH0KKyAgICAgICAgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpOwogICAgIH0KIAogICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgZ29pbmcgaW50byB0aGUgYmFja2dyb3VuZCBvciBiZWluZyBkZXN0cm95ZWQuICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgc3VwZXIub25QYXVzZSgpOworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpIHsKICAgICAgICAgdW5yZWdpc3RlclJlY2VpdmVyKG1SZWNlaXZlcik7CisgICAgICAgIG1JbnNlcnRIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKDApOworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1SZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKEludGVudC5BQ1RJT05fTUVESUFfU0NBTk5FUl9TVEFSVEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsgICAgIAorICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIHN0YXJ0ZWQgc2Nhbm5pbmcgIiArIGludGVudC5nZXREYXRhKCkuZ2V0UGF0aCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVsc2UgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoSW50ZW50LkFDVElPTl9NRURJQV9TQ0FOTkVSX0ZJTklTSEVEKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJNZWRpYSBTY2FubmVyIGZpbmlzaGVkIHNjYW5uaW5nICIgKyBpbnRlbnQuZ2V0RGF0YSgpLmdldFBhdGgoKSk7ICAgICAKKyAgICAgICAgICAgICAgICBtVGl0bGUuc2V0VGV4dCgiTWVkaWEgU2Nhbm5lciBmaW5pc2hlZCBzY2FubmluZyAiICsgaW50ZW50LmdldERhdGEoKS5nZXRQYXRoKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfTsKIAotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlOworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2NhbihWaWV3IHYpIHsKKyAgICAgICAgc2VuZEJyb2FkY2FzdChuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUVESUFfTU9VTlRFRCwgVXJpLnBhcnNlKCJmaWxlOi8vIgorICAgICAgICAgICAgICAgICsgRW52aXJvbm1lbnQuZ2V0RXh0ZXJuYWxTdG9yYWdlRGlyZWN0b3J5KCkpKSk7CisKKyAgICAgICAgbVRpdGxlLnNldFRleHQoIlNlbnQgQUNUSU9OX01FRElBX01PVU5URUQgdG8gdHJpZ2dlciB0aGUgTWVkaWEgU2Nhbm5lci4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0SW5zZXJ0QnV0dG9uVGV4dCgpIHsKKyAgICAgICAgU3RyaW5nIGxhYmVsID0gZ2V0U3RyaW5nKFIuc3RyaW5nLmluc2VydGJ1dHRvbiwgSW50ZWdlci52YWx1ZU9mKG1OdW1Ub0luc2VydCkpOworICAgICAgICBCdXR0b24gYiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLmluc2VydGJ1dHRvbik7CisgICAgICAgIGIuc2V0VGV4dChsYWJlbCk7CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbnNlcnRJdGVtcyhWaWV3IHYpIHsKKyAgICAgICAgaWYgKG1JbnNlcnRIYW5kbGVyLmhhc01lc3NhZ2VzKDApKSB7CisgICAgICAgICAgICBtSW5zZXJ0SGFuZGxlci5yZW1vdmVNZXNzYWdlcygwKTsKKyAgICAgICAgICAgIHNldEluc2VydEJ1dHRvblRleHQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1JbnNlcnRIYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBIYW5kbGVyIG1JbnNlcnRIYW5kbGVyID0gbmV3IEhhbmRsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7CisKKyAgICAgICAgICAgIGlmIChtTnVtVG9JbnNlcnQtLSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBbGJ1bSgpOworICAgICAgICAgICAgICAgIHJ1bk9uVWlUaHJlYWQobURpc3BsYXlVcGRhdGVyKTsKKworICAgICAgICAgICAgICAgIGlmICghaXNGaW5pc2hpbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBzZW5kRW1wdHlNZXNzYWdlKDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICBSdW5uYWJsZSBtRGlzcGxheVVwZGF0ZXIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIG1UaXRsZS5zZXRUZXh0KCJBZGRlZCAiICsgbUFydGlzdHMgKyAiIGFydGlzdHMsICIgKyBtQWxidW1zICsgIiBhbGJ1bXMsICIKKyAgICAgICAgICAgICAgICAgICAgKyBtU29uZ3MgKyAiIHNvbmdzLiIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEFkZCBvbmUgbW9yZSBhbGJ1bSAod2l0aCAxMCBzb25ncykgdG8gdGhlIGRhdGFiYXNlLiBUaGlzIHdpbGwgYmUgYSBjb21waWxhdGlvbiBhbGJ1bSwKKyAgICAvLyB3aXRoIG9uZSBhbGJ1bSBhcnRpc3QgZm9yIHRoZSBhbGJ1bSwgYW5kIGEgc2VwYXJhdGUgYXJ0aXN0IGZvciBlYWNoIHNvbmcuCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsYnVtKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyaW5nIGFsYnVtQXJ0aXN0ID0gIlZhcmlvdXMgQXJ0aXN0cyI7CisgICAgICAgICAgICBTdHJpbmcgYWxidW1OYW1lID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgICAgIGludCBiYXNlWWVhciA9IDE5NjkgKyBtUmFuZG9tLm5leHRJbnQoMzApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlc1tpXS5jbGVhcigpOworICAgICAgICAgICAgICAgIFN0cmluZyBhcnRpc3QgPSBnZXRSYW5kb21OYW1lKCk7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGVudFZhbHVlcyBtYXAgPSBtVmFsdWVzW2ldOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYm9ndXMvIiArIGFsYnVtTmFtZSArICIvIiArIGFydGlzdCArICJfIiArIGkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuVElUTEUsCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRSYW5kb21Xb3JkKDQpICsgIiAiICsgZ2V0UmFuZG9tV29yZCgyKSArICIgIiArIChpICsgMSkpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoTWVkaWFTdG9yZS5NZWRpYUNvbHVtbnMuTUlNRV9UWVBFLCAiYXVkaW8vbXAzIik7CisKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLkFSVElTVCwgYXJ0aXN0KTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KCJhbGJ1bV9hcnRpc3QiLCBhbGJ1bUFydGlzdCk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5BTEJVTSwgYWxidW1OYW1lKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLlRSQUNLLCBpICsgMSk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChBdWRpby5NZWRpYS5EVVJBVElPTiwgNCo2MCoxMDAwKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLklTX01VU0lDLCAxKTsKKyAgICAgICAgICAgICAgICBtYXAucHV0KEF1ZGlvLk1lZGlhLllFQVIsIGJhc2VZZWFyICsgbVJhbmRvbS5uZXh0SW50KDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVzb2x2ZXIuYnVsa0luc2VydChtQXVkaW9VcmksIG1WYWx1ZXMpOworICAgICAgICAgICAgbVNvbmdzICs9IDEwOworICAgICAgICAgICAgbUFsYnVtcysrOworICAgICAgICAgICAgbUFydGlzdHMgKz0gMTE7CisgICAgICAgIH0gY2F0Y2ggKFNRTGl0ZUNvbnN0cmFpbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZy5kKCJAQEBAIiwgImluc2VydCBmYWlsZWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb21lIGNvZGUgdG8gZ2VuZXJhdGUgcmFuZG9tIG5hbWVzLiBUaGlzIGp1c3Qgc3RyaW5ncyB0b2dldGhlciByYW5kb20KKyAgICAgKiBzeWxsYWJsZXMsIGFuZCByYW5kb21seSBpbnNlcnRzIGEgbW9kaWZpZXIgYmV0d2VlbiB0aGUgZmlyc3QKKyAgICAgKiBhbmQgbGFzdCBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nW10gZWxlbWVudHMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgImFiIiwgImFtIiwKKyAgICAgICAgICAgICJicmEiLCAiYnJpIiwKKyAgICAgICAgICAgICJjaSIsICJjbyIsCisgICAgICAgICAgICAiZGUiLCAiZGkiLCAiZG8iLAorICAgICAgICAgICAgImZhIiwgImZpIiwKKyAgICAgICAgICAgICJraSIsCisgICAgICAgICAgICAibGEiLCAibGkiLAorICAgICAgICAgICAgIm1hIiwgIm1lIiwgIm1pIiwgIm1vIiwKKyAgICAgICAgICAgICJuYSIsICJuaSIsCisgICAgICAgICAgICAicGEiLAorICAgICAgICAgICAgInRhIiwgInRpIiwKKyAgICAgICAgICAgICJ2aSIsICJ2byIKKyAgICB9OworCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmFuZG9tV29yZChpbnQgbGVuKSB7CisgICAgICAgIGludCBtYXggPSBlbGVtZW50cy5sZW5ndGg7CisgICAgICAgIG1CdWlsZGVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICAgICAgbUJ1aWxkZXIuYXBwZW5kKGVsZW1lbnRzW21SYW5kb20ubmV4dEludChtYXgpXSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciBjID0gbUJ1aWxkZXIuY2hhckF0KDApOworICAgICAgICBjID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMpOworICAgICAgICBtQnVpbGRlci5zZXRDaGFyQXQoMCwgYyk7CisgICAgICAgIHJldHVybiBtQnVpbGRlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFJhbmRvbU5hbWUoKSB7CisgICAgICAgIGJvb2xlYW4gbG9uZ2ZpcnN0ID0gbVJhbmRvbS5uZXh0SW50KDUpIDwgMzsKKyAgICAgICAgU3RyaW5nIGZpcnN0ID0gZ2V0UmFuZG9tV29yZChsb25nZmlyc3QgPyAzIDogMik7CisgICAgICAgIFN0cmluZyBsYXN0ID0gZ2V0UmFuZG9tV29yZCgzKTsKKyAgICAgICAgc3dpdGNoIChtUmFuZG9tLm5leHRJbnQoNikpIHsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAoIWxhc3Quc3RhcnRzV2l0aCgiRGkiKSkgeworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gImRpICIgKyBsYXN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBsYXN0ID0gInZhbiAiICsgbGFzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBsYXN0ID0gImRlICIgKyBsYXN0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaXJzdCArICIgIiArIGxhc3Q7CisgICAgfQorCisKKwogfQpkaWZmIC0tZ2l0IGEvYnVpbGQvc2RrLmF0cmVlIGIvYnVpbGQvc2RrLmF0cmVlCmluZGV4IDA2OGU3NzkuLjdiZTI1MzIgMTAwNjQ0Ci0tLSBhL2J1aWxkL3Nkay5hdHJlZQorKysgYi9idWlsZC9zZGsuYXRyZWUKQEAgLTI0NCw2ICsyNDQsNyBAQAogZGV2ZWxvcG1lbnQvc2FtcGxlcy9Wb2ljZVJlY29nbml0aW9uU2VydmljZSAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1ZvaWNlUmVjb2duaXRpb25TZXJ2aWNlCiBkZXZlbG9wbWVudC9zYW1wbGVzL1RpY1RhY1RvZUxpYiAgICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVGljVGFjVG9lTGliCiBkZXZlbG9wbWVudC9zYW1wbGVzL1RpY1RhY1RvZU1haW4gICAgICAgICAgICBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vVGljVGFjVG9lTWFpbgorZGV2ZWxvcG1lbnQvc2FtcGxlcy9YbWxBZGFwdGVycyAgICAgICAgICAgICAgc2FtcGxlcy8ke1BMQVRGT1JNX05BTUV9L1htbEFkYXB0ZXJzCiAKICMgTk9USUNFIGZpbGVzIGFyZSBjb3BpZWQgYnkgYnVpbGQvY29yZS9NYWtlZmlsZSBmcm9tIHNkay5naXQKIHNkay9maWxlcy9zZGtfZmlsZXNfTk9USUNFLnR4dCBzYW1wbGVzLyR7UExBVEZPUk1fTkFNRX0vTk9USUNFLnR4dApkaWZmIC0tZ2l0IGEvYnVpbGQvdG9vbHMvd2luZG93c19zZGsubWsgYi9idWlsZC90b29scy93aW5kb3dzX3Nkay5tawppbmRleCA5NjA5MTYwLi4wNTdmMWZjIDEwMDY0NAotLS0gYS9idWlsZC90b29scy93aW5kb3dzX3Nkay5taworKysgYi9idWlsZC90b29scy93aW5kb3dzX3Nkay5tawpAQCAtMzgsNyArMzgsMTAgQEAKIFdJTl9TREtfRElSICAgOj0gJChzdWJzdCAkKEhPU1RfT1MpLSQoSE9TVF9BUkNIKSx3aW5kb3dzLCQoTElOVVhfU0RLX0RJUikpCiBXSU5fU0RLX1pJUCAgIDo9ICQoV0lOX1NES19ESVIpLyQoV0lOX1NES19OQU1FKS56aXAKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB3aW5fc2RrLCAkKFdJTl9TREtfWklQKSkKKyMgQWxzbyBkaXN0ICQoSU5URVJOQUxfU0RLX1RBUkdFVCksIHdoaWNoIGlzIHRoZSBvcmlnaW5hbCBsaW51eCBzZGsgcGFja2FnZS4KKyMgSU5URVJOQUxfU0RLX1RBUkdFVCBpcyBkZWZpbmVkIGluIGJ1aWxkL2NvcmUvTWFrZWZpbGUuCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHdpbl9zZGssICQoV0lOX1NES19aSVApIFwKKyAgICAkKElOVEVSTkFMX1NES19UQVJHRVQpKQogCiAuUEhPTlk6IHdpbl9zZGsgd2luc2RrLXRvb2xzCiAKZGlmZiAtLWdpdCBhL2hvc3Qvd2luZG93cy91c2IvYW5kcm9pZF93aW51c2IuaW5mIGIvaG9zdC93aW5kb3dzL3VzYi9hbmRyb2lkX3dpbnVzYi5pbmYKaW5kZXggYjJkYWY4OS4uMzMxZWQ2ZCAxMDA3NTUKLS0tIGEvaG9zdC93aW5kb3dzL3VzYi9hbmRyb2lkX3dpbnVzYi5pbmYKKysrIGIvaG9zdC93aW5kb3dzL3VzYi9hbmRyb2lkX3dpbnVzYi5pbmYKQEAgLTM4LDE0ICszOCwzMSBAQAogJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMjJCOCZQSURfNDFEQiZNSV8wMQ0KIDsNCiA7R29vZ2xlIE5leHVzT25lDQotJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfMEQwMgorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfMEQwMg0KICVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzBEMDImTUlfMDENCi0lU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8xOEQxJlBJRF80RTExCi0lQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8xOEQxJlBJRF80RTEyJk1JXzAxCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8xOEQxJlBJRF80RTExDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfNEUxMiZNSV8wMQ0KICVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzRFMjImTUlfMDENCi07Ci07IERlbGwncyBNaW5pNQotJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNyZNSV8wMQorOw0KKzsgRGVsbCdzIE1pbmk1DQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNw0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzQxM0MmUElEX0IwMDcmTUlfMDENCis7DQorOyBTYW1zdW5nIFNQSC1NOTAwLCBHVC1JNTcwMCwgU0NILVI4ODANCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODFDDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxQyZNSV8wMQ0KKzsgU2Ftc3VuZyBHVC1JNzUwMA0KKyVTaW5nbGVBZGJJbnRlcmZhY2UlICAgICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY2MDENCislQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82NjAxJk1JXzAxDQorOyBTYW1zdW5nIEdULUk1NTAwDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg4Mg0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4ODImTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMDBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg1MA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4NTAmTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMTBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxRA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4MUQmTUlfMDENCiANCiBbR29vZ2xlLk5UYW1kNjRdDQogOyBIVEMgRHJlYW0NCkBAIC02MSwxMyArNzgsMzAgQEAKIDsNCiA7R29vZ2xlIE5leHVzT25lDQogJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfMEQwMg0KLSVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzBEMDImTUlfMDEKKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzBEMDImTUlfMDENCiAlU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8xOEQxJlBJRF80RTExDQotJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfNEUxMiZNSV8wMQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMThEMSZQSURfNEUxMiZNSV8wMQ0KICVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzE4RDEmUElEXzRFMjImTUlfMDENCi07Ci07IERlbGwncyBNaW5pNQotJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNyZNSV8wMQorOw0KKzsgRGVsbCdzIE1pbmk1DQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfNDEzQyZQSURfQjAwNw0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzQxM0MmUElEX0IwMDcmTUlfMDENCis7DQorOyBTYW1zdW5nIFNQSC1NOTAwLCBHVC1JNTcwMCwgU0NILVI4ODANCislU2luZ2xlQWRiSW50ZXJmYWNlJSAgICAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82ODFDDQorJUNvbXBvc2l0ZUFkYkludGVyZmFjZSUgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxQyZNSV8wMQ0KKzsgU2Ftc3VuZyBHVC1JNzUwMA0KKyVTaW5nbGVBZGJJbnRlcmZhY2UlICAgICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY2MDENCislQ29tcG9zaXRlQWRiSW50ZXJmYWNlJSAgICAgPSBVU0JfSW5zdGFsbCwgVVNCXFZJRF8wNEU4JlBJRF82NjAxJk1JXzAxDQorOyBTYW1zdW5nIEdULUk1NTAwDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg4Mg0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4ODImTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMDBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjg1MA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4NTAmTUlfMDENCis7IFNhbXN1bmcgU0hXLU0xMTBTDQorJVNpbmdsZUFkYkludGVyZmFjZSUgICAgICAgID0gVVNCX0luc3RhbGwsIFVTQlxWSURfMDRFOCZQSURfNjgxRA0KKyVDb21wb3NpdGVBZGJJbnRlcmZhY2UlICAgICA9IFVTQl9JbnN0YWxsLCBVU0JcVklEXzA0RTgmUElEXzY4MUQmTUlfMDENCiANCiBbVVNCX0luc3RhbGxdDQogSW5jbHVkZSA9IHdpbnVzYi5pbmYNCmRpZmYgLS1naXQgYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoIGIvaWRlL2VjbGlwc2UvLmNsYXNzcGF0aAppbmRleCA4ZWRkYzllLi43NTk5NjBhIDEwMDY0NAotLS0gYS9pZGUvZWNsaXBzZS8uY2xhc3NwYXRoCisrKyBiL2lkZS9lY2xpcHNlLy5jbGFzc3BhdGgKQEAgLTI4LDcgKzI4LDYgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJwYWNrYWdlcy9wcm92aWRlcnMvRHJtUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL01lZGlhUHJvdmlkZXIvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0icGFja2FnZXMvcHJvdmlkZXJzL1RlbGVwaG9ueVByb3ZpZGVyL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9hd3QiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9hbS9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9pbnB1dC9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY21kcy9wbS9zcmMiLz4KQEAgLTM2LDIwICszNSwyMyBAQAogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvY29yZS9jb25maWcvc2RrIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2dyYXBoaWNzL2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvaWN1NGovamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9rZXlzdG9yZS9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL2xvY2F0aW9uL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9vYmV4Ii8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL29wZW5nbC9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3BvbGljeSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS9wb2xpY3kvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3NheC9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3NlcnZpY2VzL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVsZXBob255L2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2Jhc2UvdGVzdC1ydW5uZXIvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9iYXNlL3ZvaXAvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS92cG4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImZyYW1ld29ya3MvYmFzZS93aWZpL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJmcmFtZXdvcmtzL2V4L2NvbW1vbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZnJhbWV3b3Jrcy9vcHQvdmNhcmQvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvQXBpRGVtb3Mvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvc2FtcGxlcy9BcGlEZW1vcy90ZXN0cy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zYW1wbGVzL0NvbXBhc3Mvc3JjIi8+CkBAIC02Niw1MCArNjgsMzggQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJkZXZlbG9wbWVudC9zYW1wbGVzL1NuYWtlL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImRldmVsb3BtZW50L3NhbXBsZXMvU25ha2UvdGVzdHMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZGV2ZWxvcG1lbnQvYXBwcy9UZXJtL3NyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvYW5ub3RhdGlvbi9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9hcmNoaXZlL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2F1dGgvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvYXd0LWtlcm5lbC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9jb25jdXJyZW50L3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2NyeXB0by9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9kYWx2aWsvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvaWN1L3NyYy9tYWluL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL2pzb24vc3JjL21haW4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvanVuaXQvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvbG9nZ2luZy9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9sdW5pLWtlcm5lbC9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9sdW5pL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL21hdGgvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvbmlvX2NoYXIvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvbmlvL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL29wZW5zc2wvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvcHJlZnMvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvcmVnZXgvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvc2VjdXJpdHkta2VybmVsL3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL3NlY3VyaXR5L3NyYy9tYWluL2phdmEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJsaWJjb3JlL3NxbC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS9zdW5jb21wYXQvc3JjL21haW4vamF2YSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImxpYmNvcmUvdGV4dC9zcmMvbWFpbi9qYXZhIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS94LW5ldC9zcmMvbWFpbi9qYXZhIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ibGliY29yZS94bWwvc3JjL21haW4vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0FwaURlbW9zX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0Jyb3dzZXJfaW50ZXJtZWRpYXRlcy9zcmMvc3JjIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvQ2FsZW5kYXJQcm92aWRlcl9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9Db250YWN0c1Byb3ZpZGVyX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0VtYWlsX2ludGVybWVkaWF0ZXMvc3JjL3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9BUFBTL0xhdW5jaGVyMl9pbnRlcm1lZGlhdGVzL3NyYy9yZW5kZXJzY3JpcHQvc3JjIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0FQUFMvTWVkaWFQcm92aWRlcl9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9NdXNpY19pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9QaG9uZV9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovQVBQUy9RdWlja1NlYXJjaEJveF9pbnRlcm1lZGlhdGVzL3NyYy9zcmMiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL2NvcmUvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvbG9jYXRpb24vamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvbWVkaWEvamF2YSIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvcmVuZGVyc2NyaXB0L3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvdGVsZXBob255L2phdmEiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3ZvaXAvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9mcmFtZXdvcmtfaW50ZXJtZWRpYXRlcy9zcmMvdnBuL2phdmEiLz4KIAk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZnJhbWV3b3JrX2ludGVybWVkaWF0ZXMvc3JjL3dpZmkvamF2YSIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9zZXJ2aWNlc19pbnRlcm1lZGlhdGVzL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL1IiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC90YWdzb3VwL3NyYyIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2FwYWNoZS1odHRwL3NyYyIvPgorCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImV4dGVybmFsL2JvdW5jeWNhc3RsZS9zcmMvbWFpbi9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvbGlicGhvbmVudW1iZXIvamF2YS9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJleHRlcm5hbC9uaXN0LXNpcC9qYXZhIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iZXh0ZXJuYWwvdGFnc291cC9zcmMiLz4KKwk8Y2xhc3NwYXRoZW50cnkga2luZD0ibGliIiBwYXRoPSJvdXQvdGFyZ2V0L2NvbW1vbi9vYmovSkFWQV9MSUJSQVJJRVMvZ29vZ2xlLWNvbW1vbl9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CisJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0ib3V0L3RhcmdldC9jb21tb24vb2JqL0pBVkFfTElCUkFSSUVTL2dzZi1jbGllbnRfaW50ZXJtZWRpYXRlcy9qYXZhbGliLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJsaWIiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9ndWF2YV9pbnRlcm1lZGlhdGVzL2phdmFsaWIuamFyIi8+CiAJPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImxpYiIgcGF0aD0icGFja2FnZXMvYXBwcy9DYWxjdWxhdG9yL2FyaXR5LTIuMS4yLmphciIvPgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9Im91dC90YXJnZXQvY29tbW9uL29iai9KQVZBX0xJQlJBUklFUy9hbmRyb2lkX3N0dWJzX2N1cnJlbnRfaW50ZXJtZWRpYXRlcy9jbGFzc2VzIi8+CmRpZmYgLS1naXQgYS9wZGsvUGRrLm1rIGIvcGRrL1Bkay5tawppbmRleCA2NzZmNWRjLi5hZmU0ZGM2IDEwMDY0NAotLS0gYS9wZGsvUGRrLm1rCisrKyBiL3Bkay9QZGsubWsKQEAgLTc3LDcgKzc3LDcgQEAKICMgICBkZXNjcmlwdGlvbnMgZm9yIHRoZSBuZXcgaGVhZGVycyBhbmQgcG9pbnQgdG8gdGhlIG5ldyBkb3h5Z2VuIGNyZWF0ZWQgaHRtbC4KIHBka19oZWFkZXJzIDo9IFwKICAgICAkKHBka19sZWdhY3lfaGFyZHdhcmVfZGlyKS9BdWRpb0hhcmR3YXJlSW50ZXJmYWNlLmggXAotICAgICQocGRrX2xlZ2FjeV9oYXJkd2FyZV9kaXIpL2dwcy5oIFwKKyAgICAkKHBka19oYXJkd2FyZV9kaXIpL2dwcy5oIFwKICAgICAkKHBka19sZWdhY3lfaGFyZHdhcmVfZGlyKS93aWZpLmggXAogICAgICQocGRrX2NhbWVyYV9kaXIpL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmggXAogICAgICQocGRrX2hhcmR3YXJlX2Rpcikvc2Vuc29ycy5oIFwKQEAgLTE4Miw3ICsxODIsNiBAQAogCiBMT0NBTF9TUkNfRklMRVMgOj0gcGRrLXRpbWVzdGFtcCBzYW1wbGVzL3NhbXBsZWpuaS9zcmMvY29tL2V4YW1wbGUvam5pZXhhbXBsZS9KTklFeGFtcGxlLmphdmEgIAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IGRldmVsb3BtZW50L3Bkay9wbmRrL3NhbXBsZXMvc2FtcGxlam5pL3NyYy9jb20vZXhhbXBsZS9qbmlleGFtcGxlCi1MT0NBTF9EUk9JRERPQ19TT1VSQ0VfUEFUSCA6PSAkKGZyYW1ld29ya19kb2NzX0xPQ0FMX0RST0lERE9DX1NPVVJDRV9QQVRIKQogTE9DQUxfRFJPSURET0NfSFRNTF9ESVIgOj0gLi4vLi4vLi4vJChwZGtfYXBwX2VuZ19yb290KQogCiBMT0NBTF9NT0RVTEUgOj0gb25saW5lLXBkawpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvYWJvdXQvaW5kZXguamQgYi9wZGsvZG9jcy9hYm91dC9pbmRleC5qZAppbmRleCAyZjk4YjY1Li40M2QyYThkIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9hYm91dC9pbmRleC5qZAorKysgYi9wZGsvZG9jcy9hYm91dC9pbmRleC5qZApAQCAtMywxMCArMywxMCBAQAogZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKIDxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgY3JlYXRlZCBmb3IgbW9iaWxlIHBob25lcyBhbmQKLW90aGVyIGRldmljZXMuICBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IChBT1NQKSBpcyB0YXNrZWQgd2l0aCB0aGUKLW1haW50ZW5hbmNlIGFuZCBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIEFuZHJvaWQuIE1hbnkgZGV2aWNlIG1hbnVmYWN0dXJlcnMgaGF2ZQotYnJvdWdodCB0byBtYXJrZXQgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQsIGFuZCB0aGV5IGFyZSByZWFkaWJseSBhdmFpbGFibGUKLWFyb3VuZCB0aGUgd29ybGQuPC9wPgorb3RoZXIgZGV2aWNlcy4gIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgKEFPU1ApLCBsZWQgYnkgR29vZ2xlLCBpcwordGFza2VkIHdpdGggdGhlIG1haW50ZW5hbmNlIGFuZCBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIEFuZHJvaWQuIE1hbnkgZGV2aWNlCittYW51ZmFjdHVyZXJzIGhhdmUgYnJvdWdodCB0byBtYXJrZXQgZGV2aWNlcyBydW5uaW5nIEFuZHJvaWQsIGFuZCB0aGV5IGFyZQorcmVhZGlibHkgYXZhaWxhYmxlIGFyb3VuZCB0aGUgd29ybGQuPC9wPgogPHA+T3VyIHByaW1hcnkgcHVycG9zZSBpcyB0byBidWlsZCBhbiBleGNlbGxlbnQgc29mdHdhcmUgcGxhdGZvcm0gZm9yIGV2ZXJ5ZGF5CiB1c2Vycy4gQSBudW1iZXIgb2YgY29tcGFuaWVzIGhhdmUgY29tbWl0dGVkIG1hbnkgZW5naW5lZXJzIHRvIGFjaGlldmUgdGhpcwogZ29hbCwgYW5kIHRoZSByZXN1bHQgaXMgYSBmdWxsIHByb2R1Y3Rpb24gcXVhbGl0eSBjb25zdW1lciBwcm9kdWN0IHdob3NlCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9hYm91dC9waGlsb3NvcGh5LmpkIGIvcGRrL2RvY3MvYWJvdXQvcGhpbG9zb3BoeS5qZAppbmRleCAxYWExY2NmLi4xNTYyZTQyIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9hYm91dC9waGlsb3NvcGh5LmpkCisrKyBiL3Bkay9kb2NzL2Fib3V0L3BoaWxvc29waHkuamQKQEAgLTIsNyArMiw3IEBACiBkb2MudHlwZT1hYm91dAogZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKLTxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgZm9yIG1vYmlsZSBwaG9uZXMgYW5kIHNpbWlsYXIKKzxwPkFuZHJvaWQgaXMgYW4gb3Blbi1zb3VyY2Ugc29mdHdhcmUgc3RhY2sgZm9yIG1vYmlsZSBwaG9uZXMgYW5kIG90aGVyCiBkZXZpY2VzLjwvcD4KIDxoMj5PcmlnaW4gYW5kIEdvYWw8L2gyPgogPHA+QW5kcm9pZCB3YXMgb3JpZ2luYXRlZCBieSBhIGdyb3VwIG9mIGNvbXBhbmllcyBrbm93biBhcyB0aGUgT3BlbiBIYW5kc2V0CkBAIC0xNiwxMiArMTYsMTEgQEAKIGlkZWFzIGEgcmVhbGl0eS4gV2Ugd2FudGVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIHdhcyBubyBjZW50cmFsIHBvaW50IG9mCiBmYWlsdXJlLCB3aGVyZSBvbmUgaW5kdXN0cnkgcGxheWVyIGNvdWxkIHJlc3RyaWN0IG9yIGNvbnRyb2wgdGhlIGlubm92YXRpb25zCiBvZiBhbnkgb3RoZXIuIFRoZSBzb2x1dGlvbiB3ZSBjaG9zZSB3YXMgYW4gb3BlbiBhbmQgb3Blbi1zb3VyY2UgcGxhdGZvcm0uPC9wPgotPHA+QnV0IHRoZSB1bHRpbWF0ZSBnb2FsLCBvZiBjb3Vyc2UsIGlzIHRvIGltcHJvdmUgdGhlIG1vYmlsZSBleHBlcmllbmNlIGZvcgotcmVhbCB1c2VycyBieSBmYWNpbGl0YXRpbmcgaW5ub3ZhdGlvbi4gQWNjb3JkaW5nbHksIHRoZSBwcmltYXJ5IGdvYWwgb2YgdGhlCi1BT1NQIGlzIHRvIG1ha2Ugc3VyZSBBbmRyb2lkIGlzIGEgc3VjY2VzcyBhcyBhbiBlbmQgdXNlciBwcm9kdWN0LjwvcD4KKzxwPlRoZSBnb2FsIG9mIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgaXMgdG8gY3JlYXRlIGEgc3VjY2Vzc2Z1bAorcmVhbC13b3JsZCBwcm9kdWN0IHRoYXQgaW1wcm92ZXMgdGhlIG1vYmlsZSBleHBlcmllbmNlIGZvciBlbmQgdXNlcnMuPC9wPgogPGgyPkdvdmVybmFuY2UgUGhpbG9zb3BoeTwvaDI+CiA8cD5UaGUgY29tcGFuaWVzIHRoYXQgaGF2ZSBpbnZlc3RlZCBpbiBBbmRyb2lkIGhhdmUgZG9uZSBzbyBvbiBpdHMgbWVyaXRzLAotYmVjYXVzZSB3ZSBjb2xsZWN0aXZlbHkgYmVsaWV2ZSB0aGF0IGFuIG9wZW4gcGxhdGZvcm0gaXMgbmVjZXNzYXJ5LiBBbmRyb2lkIGlzCitiZWNhdXNlIHdlIGJlbGlldmUgdGhhdCBhbiBvcGVuIHBsYXRmb3JtIGlzIG5lY2Vzc2FyeS4gQW5kcm9pZCBpcwogaW50ZW50aW9uYWxseSBhbmQgZXhwbGljaXRseSBhbiBvcGVuLXNvdXJjZSAtLSBhcyBvcHBvc2VkIHRvIGZyZWUgc29mdHdhcmUgLS0KIGVmZm9ydDogYSBncm91cCBvZiBvcmdhbml6YXRpb25zIHdpdGggc2hhcmVkIG5lZWRzIGhhcyBwb29sZWQKIHJlc291cmNlcyB0byBjb2xsYWJvcmF0ZSBvbiBhIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHNoYXJlZCBwcm9kdWN0LiAKQEAgLTM0LDIwICszMywxOSBAQAogQW55b25lIGNhbiAoYW5kIHdpbGwhKSB1c2UgdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2UKIHdlbGNvbWUgYWxsIHN1Y2ggdXNlcy4gSG93ZXZlciwgaW4gb3JkZXIgdG8gdGFrZSBwYXJ0IGluIHRoZSBzaGFyZWQKIGVjb3N5c3RlbSBvZiBhcHBsaWNhdGlvbnMgdGhhdCB3ZSBhcmUgYnVpbGRpbmcgYXJvdW5kIEFuZHJvaWQsIGRldmljZSBidWlsZGVycwotY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBDb21wYXRpYmlsaXR5IFByb2dyYW0uPC9wPgorbXVzdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgQ29tcGF0aWJpbGl0eSBQcm9ncmFtLjwvcD4KIDxwPlRob3VnaCBBbmRyb2lkIGNvbnNpc3RzIG9mIG11bHRpcGxlIHN1Yi1wcm9qZWN0cywgdGhpcyBpcyBzdHJpY3RseSBhCiBwcm9qZWN0LW1hbmFnZW1lbnQgdGVjaG5pcXVlLiBXZSB2aWV3IGFuZCBtYW5hZ2UgQW5kcm9pZCBhcyBhIHNpbmdsZSwKIGhvbGlzdGljIHNvZnR3YXJlIHByb2R1Y3QsIG5vdCBhICJkaXN0cmlidXRpb24iLCBzcGVjaWZpY2F0aW9uLCBvciBjb2xsZWN0aW9uCi1vZiByZXBsYWNlYWJsZSBwYXJ0cy4gQ29uY2VwdHVhbGx5LCBvdXIgbm90aW9uIGlzIHRoYXQgZGV2aWNlIGJ1aWxkZXJzIHBvcnQKK29mIHJlcGxhY2VhYmxlIHBhcnRzLiBPdXIgaW50ZW50IGlzIHRoYXQgZGV2aWNlIGJ1aWxkZXJzIHBvcnQKIEFuZHJvaWQgdG8gYSBkZXZpY2U7IHRoZXkgZG9uJ3QgaW1wbGVtZW50IGEgc3BlY2lmaWNhdGlvbiBvciBjdXJhdGUgYQogZGlzdHJpYnV0aW9uLjwvcD4KIDxoMj5Ib3cgV2UgV29yazwvaDI+CiA8cD5XZSBrbm93IHRoYXQgcXVhbGl0eSBkb2VzIG5vdCBjb21lIHdpdGhvdXQgaGFyZCB3b3JrLiBBbG9uZyB3aXRoIG1hbnkKIHBhcnRuZXJzLCBHb29nbGUgaGFzIGNvbnRyaWJ1dGVkIGZ1bGwtdGltZSBlbmdpbmVlcnMsIHByb2R1Y3QgbWFuYWdlcnMsIFVJCiBkZXNpZ25lcnMsIFF1YWxpdHkgQXNzdXJhbmNlLCBhbmQgYWxsIHRoZSBvdGhlciByb2xlcyByZXF1aXJlZCB0byBicmluZwotbW9kZXJuIGRldmljZXMgdG8gbWFya2V0LiAgV2UgaW50ZWdyYXRlIHRoZSBvcGVuIHNvdXJjZSBhZG1pbmlzdHJhdGlvbiBhbmQKK21vZGVybiBkZXZpY2VzIHRvIG1hcmtldC4gIFdlIHJvbGwgdGhlIG9wZW4gc291cmNlIGFkbWluaXN0cmF0aW9uIGFuZAogbWFpbnRlbmFuY2UgaW50byB0aGUgbGFyZ2VyIHByb2R1Y3QgZGV2ZWxvcG1lbnQgY3ljbGUuPC9wPgotPHA+SW4gYSBudXRzaGVsbDo8L3A+CiA8dWw+CiA8bGk+QXQgYW55IGdpdmVuIG1vbWVudCwgdGhlcmUgaXMgYSBjdXJyZW50IGxhdGVzdCByZWxlYXNlIG9mIHRoZSBBbmRyb2lkCiBwbGF0Zm9ybS4gVGhpcyB0eXBpY2FsbHkgdGFrZXMgdGhlIGZvcm0gb2YgYSBicmFuY2ggaW4gdGhlIHRyZWUuPC9saT4KQEAgLTU2LDE4ICs1NCw5IEBACiBmZWF0dXJlcywgYW5kIHNvIG9uLjwvbGk+CiA8bGk+SW4gcGFyYWxsZWwsIEdvb2dsZSB3b3JrcyBpbnRlcm5hbGx5IG9uIHRoZSBuZXh0IHZlcnNpb24gb2YgdGhlCiBBbmRyb2lkIHBsYXRmb3JtIGFuZCBmcmFtZXdvcmssIHdvcmtpbmcgYWNjb3JkaW5nIHRvIHRoZSBwcm9kdWN0J3MgbmVlZHMgYW5kCi1nb2Fscy4gU29tZSBvZiB0aGUgd29yayBmcm9tIHRoZSBjdXJyZW50IGxhdGVzdCB0cmVlIHdpbGwgcHJvbW90ZWQgaW50byB0aGVzZQotcmVsZWFzZXMuPC9saT4KLTxsaT5XaGVuIHRoZSAibisxInRoIHZlcnNpb24gaXMgZGV0ZXJtaW5lZCB0byBiZSBuZWFyaW5nIGNvbXBsZXRpb24sIGl0IHdpbGwKLWJlIHB1Ymxpc2hlZCB0byB0aGUgcHVibGljIHNvdXJjZSB0cmVlLCBhbmQgYmVjb21lIHRoZSBuZXcgbGF0ZXN0Ci1yZWxlYXNlLjwvbGk+Ci08bGk+U2luY2UgQW5kcm9pZCBpcyBvcGVuIHNvdXJjZSwgbm90aGluZyBwcmV2ZW50cyBkZXZpY2UgaW1wbGVtZW50ZXJzIGZyb20KLXNoaXBwaW5nIGRldmljZXMgb24gb2xkZXIgKG9ic29sZXRlKSBBbmRyb2lkIGJ1aWxkcy4gSG93ZXZlciwgYWN0aXZlIHdvcmsgd2lsbAotYmUgZm9jdXNlZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybSByZWxlYXNlLjwvbGk+Citnb2Fscy4gV2UgZGV2ZWxvcCB0aGUgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQgYnkgd29ya2luZyB3aXRoIGEgZGV2aWNlIHBhcnRuZXIKK29uIGEgZmxhZ3NoaXAgZGV2aWNlIHdob3NlIHNwZWNpZmljYXRpb25zIGFyZSBjaG9zZW4gdG8gcHVzaCBBbmRyb2lkCitpbiB0aGUgZGlyZWN0aW9uIHdlIGJlbGlldmUgaXQgc2hvdWxkIGdvLjwvbGk+Cis8bGk+V2hlbiB0aGUgIm4rMSJ0aCB2ZXJzaW9uIGlzIHJlYWR5LCBpdCB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgcHVibGljCitzb3VyY2UgdHJlZSwgYW5kIGJlY29tZSB0aGUgbmV3IGxhdGVzdCByZWxlYXNlLjwvbGk+CiA8L3VsPgotPHA+VG8gbWVldCBvdXIgZ29hbHMsIEFuZHJvaWQgbmVlZHMgdG8gYWNoaWV2ZSB3aWRlc3ByZWFkLCBjb21wYXRpYmxlCi1hZG9wdGlvbi4gV2UgYmVsaWV2ZSB0aGF0IHRoZSBiZXN0IHdheSB0byBhY2NvbXBsaXNoIHRoYXQgaXMgdG8gbWFrZSBzdXJlIHRoYXQKLXdlIHNoaXAgaGlnaC1xdWFsaXR5LCBmbGFnc2hpcCBkZXZpY2VzIHdpdGggYW4gaW50ZW5zZSBwcm9kdWN0IGFuZCBlbmQtdXNlcgotZm9jdXMuIFRoZSAibmV4dCByZWxlYXNlIiBvZiBBbmRyb2lkIGlzIGRyaXZlbiBieSB0aGUgcHJvZHVjdCBuZWVkcyBmb3IgdGhlIG5leHQKLWdlbmVyYXRpb24gb2YgbW9iaWxlIGRldmljZXM7IHRoZSByZXN1bHRpbmcgZXhjZWxsZW50IHByb2R1Y3QgaXMgdGhlbiByZWxlYXNlZAotdG8gb3BlbiBzb3VyY2UgYW5kIGJlY29tZXMgdGhlIG5ldyBjdXJyZW50IHZlcnNpb24gb2YgdGhlIHBsYXRmb3JtLjwvcD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5qZCBiL3Bkay9kb2NzL2NvbW11bml0eS9ncm91cHMtY2hhcnRlci5qZAppbmRleCA2ZDViNTAxLi45NTk5MTdlIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21tdW5pdHkvZ3JvdXBzLWNoYXJ0ZXIuamQKKysrIGIvcGRrL2RvY3MvY29tbXVuaXR5L2dyb3Vwcy1jaGFydGVyLmpkCkBAIC0xLDI2ICsxLDY2IEBACiBwYWdlLnRpdGxlPUFuZHJvaWQgRGlzY3Vzc2lvbiBHcm91cHMgQ2hhcnRlcgogZG9jLnR5cGU9Y29tbXVuaXR5Citkb2MuaGlkZW5hdj10cnVlCiBAamQ6Ym9keQotPGgyPgotQXVkaWVuY2UKLTwvaDI+Ci08cD5UaGVzZSBkaXNjdXNzaW9uIGdyb3VwcyBhcmUgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIHRoZSBBbmRyb2lkIHBsYXRmb3JtLiBFdmVyeW9uZSBpcyB3ZWxjb21lIHRvIGpvaW4gaW4sIHByb3ZpZGVkIHlvdSBmb2xsb3cgb3VyIGNvbW11bml0eSdzIHBvbGljaWVzIGRlc2NyaWJlZCBiZWxvdy4gT3VyIHVzZXJzIGhlbHAgZWFjaCBvdGhlciwgYW5kIG1hbnkgZXhwZXJ0cyBwb3N0IHRvIHRoZXNlIGdyb3VwcywgaW5jbHVkaW5nIG1lbWJlcnMgb2YgdGhlIE9wZW4gSGFuZHNldCBBbGxpYW5jZS4KKzxoMj5BdWRpZW5jZTwvaDI+Cis8cD5UaGVzZSBkaXNjdXNzaW9uIGdyb3VwcyBhcmUgaW50ZW5kZWQgZm9yIGRldmVsb3BlcnMgd29ya2luZyB3aXRoIHRoZQorQW5kcm9pZCBwbGF0Zm9ybS4gRXZlcnlvbmUgaXMgd2VsY29tZSB0byBqb2luIGluLCBwcm92aWRlZCB5b3UgZm9sbG93IG91cgorY29tbXVuaXR5J3MgcG9saWNpZXMgZGVzY3JpYmVkIGJlbG93LiBPdXIgdXNlcnMgaGVscCBlYWNoIG90aGVyLCBhbmQgbWFueQorZXhwZXJ0cyBwb3N0IHRvIHRoZXNlIGdyb3VwcywgaW5jbHVkaW5nIG1lbWJlcnMgb2YgdGhlIE9wZW4gSGFuZHNldCBBbGxpYW5jZS4KIDwvcD4KLTxwPk5vIHRvcGljIGlzIG9mZi1saW1pdHMsIHByb3ZpZGVkIGl0IHJlbGF0ZXMgdG8gQW5kcm9pZCBpbiBzb21lIHdheS4gSG93ZXZlciwgc2luY2UgdGhlc2UgYXJlIHZlcnkgYnVzeSBsaXN0cywgc2VhcmNoIHRoZSBhcmNoaXZlcyBiZWZvcmUgcG9zdGluZyB5b3VyIHF1ZXN0aW9uOyB5b3UgbWF5IGZpbmQgeW91ciBxdWVzdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGFuc3dlcmVkLgorPHA+Tm8gdG9waWMgaXMgb2ZmLWxpbWl0cywgcHJvdmlkZWQgaXQgcmVsYXRlcyB0byBBbmRyb2lkIGluIHNvbWUgd2F5LgorSG93ZXZlciwgc2luY2UgdGhlc2UgYXJlIHZlcnkgYnVzeSBsaXN0cywgc2VhcmNoIHRoZSBhcmNoaXZlcyBiZWZvcmUgcG9zdGluZworeW91ciBxdWVzdGlvbjsgeW91IG1heSBmaW5kIHlvdXIgcXVlc3Rpb24gaGFzIGFscmVhZHkgYmVlbiBhbnN3ZXJlZC4KIDwvcD4KLTxoMj4KLU1haWxpbmcgbGlzdCBydWxlcwotPC9oMj4KLTxwPldlIGxvdmUgc2ltcGxpY2l0eSBhbmQgaGF0ZSByZXN0cmljdGlvbnMsIHNvIHdlIGtlZXAgb3VyIHBvbGljaWVzIG1pbmltYWwuIFRoZSBydWxlcyBiZWxvdyBkZXNjcmliZSB3aGF0J3MgZXhwZWN0ZWQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIEFuZHJvaWQgbWFpbGluZyBsaXN0cy4KKzxoMj5NYWlsaW5nIGxpc3QgcnVsZXM8L2gyPgorPHA+V2UgbG92ZSBzaW1wbGljaXR5IGFuZCBoYXRlIHJlc3RyaWN0aW9ucywgc28gd2Uga2VlcCBvdXIgcG9saWNpZXMgbWluaW1hbC4KK1RoZSBydWxlcyBiZWxvdyBkZXNjcmliZSB3aGF0J3MgZXhwZWN0ZWQgb2Ygc3Vic2NyaWJlcnMgdG8gdGhlIEFuZHJvaWQgbWFpbGluZworbGlzdHMuCiA8L3A+CiA8dWw+PGxpPjxiPlBsZWFzZSBiZSBmcmllbmRseTwvYj4KLTxicj5TaG93aW5nIGNvdXJ0ZXN5IGFuZCByZXNwZWN0IHRvIG90aGVycyBpcyBhIHZpdGFsIHBhcnQgb2YgdGhlIEFuZHJvaWQgY3VsdHVyZSwgYW5kIHdlIGV4cGVjdCBldmVyeW9uZSBwYXJ0aWNpcGF0aW5nIGluIHRoZSBBbmRyb2lkIGNvbW11bml0eSB0byBqb2luIHVzIGluIGFjY2VwdGluZyBub3RoaW5nIGxlc3MuIEJlaW5nIGNvdXJ0ZW91cyBkb2VzIG5vdCBtZWFuIHdlIGNhbid0IGNvbnN0cnVjdGl2ZWx5IGRpc2FncmVlIHdpdGggZWFjaCBvdGhlciwgYnV0IGl0IGRvZXMgbWVhbiB0aGF0IHdlIG11c3QgYmUgcG9saXRlIHdoZW4gd2UgZG8gc28uIFRoZXJlJ3MgbmV2ZXIgYSByZWFzb24gdG8gYmUgYW50YWdvbmlzdGljIG9yIGRpc21pc3NpdmUgdG93YXJkIGFueW9uZTsgaWYgeW91IHRoaW5rIHRoZXJlIGlzLCB0aGluayBhZ2FpbiBiZWZvcmUgeW91IHBvc3QuPGJyPjxicj5Nb2JpbGUgZGV2ZWxvcG1lbnQgaXMgc2VyaW91cyBidXNpbmVzcywgYnV0IGl0J3MgYWxzbyBhIGxvdCBvZiBmdW4uIExldCdzIGtlZXAgaXQgdGhhdCB3YXkuIExldCdzIHN0cml2ZSB0byBiZSBvbmUgb2YgdGhlIGZyaWVuZGxpZXN0IGNvbW11bml0aWVzIGluIGFsbCBvZiBvcGVuIHNvdXJjZS48YnI+PGJyPjwvbGk+Cis8YnI+U2hvd2luZyBjb3VydGVzeSBhbmQgcmVzcGVjdCB0byBvdGhlcnMgaXMgYSB2aXRhbCBwYXJ0IG9mIHRoZSBBbmRyb2lkCitjdWx0dXJlLCBhbmQgd2UgZXhwZWN0IGV2ZXJ5b25lIHBhcnRpY2lwYXRpbmcgaW4gdGhlIEFuZHJvaWQgY29tbXVuaXR5IHRvIGpvaW4KK3VzIGluIGFjY2VwdGluZyBub3RoaW5nIGxlc3MuIEJlaW5nIGNvdXJ0ZW91cyBkb2VzIG5vdCBtZWFuIHdlIGNhbid0Citjb25zdHJ1Y3RpdmVseSBkaXNhZ3JlZSB3aXRoIGVhY2ggb3RoZXIsIGJ1dCBpdCBkb2VzIG1lYW4gdGhhdCB3ZSBtdXN0IGJlCitwb2xpdGUgd2hlbiB3ZSBkbyBzby4gVGhlcmUncyBuZXZlciBhIHJlYXNvbiB0byBiZSBhbnRhZ29uaXN0aWMgb3IgZGlzbWlzc2l2ZQordG93YXJkIGFueW9uZTsgaWYgeW91IHRoaW5rIHRoZXJlIGlzLCB0aGluayBhZ2FpbiBiZWZvcmUgeW91Citwb3N0Ljxicj48YnI+TW9iaWxlIGRldmVsb3BtZW50IGlzIHNlcmlvdXMgYnVzaW5lc3MsIGJ1dCBpdCdzIGFsc28gYSBsb3Qgb2YKK2Z1bi4gTGV0J3Mga2VlcCBpdCB0aGF0IHdheS4gTGV0J3Mgc3RyaXZlIHRvIGJlIG9uZSBvZiB0aGUgZnJpZW5kbGllc3QKK2NvbW11bml0aWVzIGluIGFsbCBvZiBvcGVuIHNvdXJjZS48YnI+PGJyPjwvbGk+CisKIDxsaT48Yj5BbGxvd2VkIGRpc2N1c3Npb24gdG9waWNzPC9iPgotPGJyPk1vc3QgdG9waWNzIGFyZSB0ZWNobmljYWwgZGlzY3Vzc2lvbnMgb2YgQW5kcm9pZCBvciB1c2VycyBoZWxwaW5nIGVhY2ggb3RoZXIsIGJ1dCB0aGlzIGdyb3VwIGlzIGludGVuZGVkIGZvciBkaXNjdXNzaW9ucyBvZjxpPmV2ZXJ5dGhpbmc8L2k+Ci1pbiB0aGUgd29ybGQgb2YgQW5kcm9pZC4gV2Ugd2VsY29tZSBhbm5vdW5jZW1lbnRzIGFuZCBkaXNjdXNzaW9uIG9mIHByb2R1Y3RzLCBsaWJyYXJpZXMsIHB1YmxpY2F0aW9ucywgYW5kIG90aGVyIGludGVyZXN0aW5nIEFuZHJvaWQtcmVsYXRlZCBuZXdzLiBXZSBldmVuIHdlbGNvbWUgKHBvbGl0ZSEpIGRpc2N1c3Npb24gb2YgYXJ0aWNsZXMgYW5kIGlkZWFzIGNyaXRpY2FsIG9mIEFuZHJvaWQtLWFmdGVyIGFsbCwgd2UgY2FuJ3QgaW1wcm92ZSBpZiB3ZSBkb24ndCBsaXN0ZW4uIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdGhlIHN1YmplY3QgbWF0dGVyLCBhbmQgd2UgZG9uJ3QgZXhjbHVkZSBkaXNjdXNzaW9ucyBvZiBjb21tZXJjaWFsIHByb2R1Y3RzIGlmIHVzZXJzIGFyZSBpbnRlcmVzdGVkIGluIHRhbGtpbmcgYWJvdXQgdGhlbS48YnI+PGJyPkhvd2V2ZXIsIHdlIGhhdGUgc3BhbSBhbG1vc3QgYXMgcGFzc2lvbmF0ZWx5IGFzIHdlIGxvdmUgY291cnRlc3kgYW5kIHJlc3BlY3QsIHNvIHdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIGxpbWl0IGRpc2N1c3Npb25zIHRoYXQgYW1vdW50IHRvIHNwYW0uIE91dHJpZ2h0IHNwYW0gd2lsbCByZXN1bHQgaW4gdGhlIHNwYW1tZXIgYmVpbmcgaW1tZWRpYXRlbHkgYW5kIHBlcm1hbmVudGx5IGJhbm5lZCBmcm9tIHRoZSBsaXN0LgorPGJyPk1vc3Qgb2Ygb3VyIGdyb3VwcyBhcmUgZm9yIHRlY2huaWNhbCBkaXNjdXNzaW9ucyBvZiBBbmRyb2lkIG9yIHVzZXJzCitoZWxwaW5nIGVhY2ggb3RoZXIuIEdlbmVyYWxseSB3ZSBkb24ndCBwdXQgaGFyZCByZXN0cmljdGlvbnMgb24gdGhlIHRvcGljcworZGlzY3Vzc2VkIGluIHRoZSBncm91cDogYXMgbG9uZyBhcyB0aGUgdG9waWMgaXMgcmVsZXZhbnQgdG8gQW5kcm9pZCBpbiBzb21lCit3YXksIGl0J3Mgd2VsY29tZSBvbiBvdXIgZ3JvdXBzLiAgV2Ugd2VsY29tZSBhbm5vdW5jZW1lbnRzIGFuZCBkaXNjdXNzaW9uIG9mCitwcm9kdWN0cywgbGlicmFyaWVzLCBwdWJsaWNhdGlvbnMsIGFuZCBvdGhlciBpbnRlcmVzdGluZyBBbmRyb2lkLXJlbGF0ZWQgbmV3cywKK2J1dCA8Yj5wbGVhc2UgZG8gbm90IGNyb3NzLXBvc3Q8L2I+LiBQb3N0IG9ubHkgdG8gdGhlIG1vc3QgcmVsZXZhbnQgZ3JvdXAgZm9yCit5b3VyIG1lc3NhZ2UuIFdlIGV2ZW4gd2VsY29tZSAocG9saXRlISkgZGlzY3Vzc2lvbiBvZiBhcnRpY2xlcyBhbmQgaWRlYXMKK2NyaXRpY2FsIG9mIEFuZHJvaWQtLWFmdGVyIGFsbCwgd2UgY2FuJ3QgaW1wcm92ZSBpZiB3ZSBkb24ndCBsaXN0ZW4uPGJyPjxicj4KIDwvbGk+CisKKzxsaT48Yj5Xb3JraW5nIExpc3RzPC9iPgorPGJyPlNvbWUgb2Ygb3VyIGdyb3VwcyBhcmUgY29uc2lkZXJlZCAid29ya2luZyBsaXN0cyIsIGJ5IHdoaWNoIHdlIG1lYW4gdGhhdCB0aGUKK2xpc3QgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBzdXBwb3J0IG9mIHRoZSBjb21wbGV0aW9uIG9mIHNwZWNpZmljIHRhc2tzLiBPbgordGhlc2UgZ3JvdXBzLCB3ZSBkb24ndCB3ZWxjb21lIG9mZi10b3BpYyBjb252ZXJzYXRpb25zLCBhbmQgd2lsbCBnZW5lcmFsbHkgYXNrCit5b3UgdG8gdGFrZSBnZW5lcmFsIGRpc2N1c3Npb25zIHRvIGEgZGlmZmVyZW50IGxpc3QuIFNpbmNlIHRoZXNlIGFyZSBsaXN0cword2hlcmUgcGVvcGxlIGFyZSB0cnlpbmcgdG8gZ2V0IHdvcmsgZG9uZSwgd2Ugd2lsbCBiZSBwcmV0dHkgYWdncmVzc2l2ZSBhYm91dAora2VlcGluZyB0aGUgbm9pc2UgbGV2ZWwgbG93LiBXZSBhc2sgdGhhdCB5b3UgcmVzcGVjdCBvdXIgY29udHJpYnV0b3JzJyB0aW1lCithbmQga2VlcCBnZW5lcmFsIGRpc2N1c3Npb25zIHRvIGFwcHJvcHJpYXRlIGxpc3RzLjxicj48YnI+Cis8L2xpPgorCis8bGk+PGI+U3BhbTwvYj4KKzxicj5XZSBoYXRlIHNwYW0gYWxtb3N0IGFzIHBhc3Npb25hdGVseSBhcyB3ZSBsb3ZlIGNvdXJ0ZXN5IGFuZCByZXNwZWN0LCBzbyB3ZQorcmVzZXJ2ZSB0aGUgcmlnaHQgdG8gbGltaXQgZGlzY3Vzc2lvbnMgdGhhdCBhbW91bnQgdG8gc3BhbS4gT3V0cmlnaHQgc3BhbSB3aWxsCityZXN1bHQgaW4gdGhlIHNwYW1tZXIgYmVpbmcgaW1tZWRpYXRlbHkgYW5kIHBlcm1hbmVudGx5IGJhbm5lZCBmcm9tIHRoZSBsaXN0LgorPGJyPjxicj48L2xpPgogPC91bD4KLTxwPlRoZSBtb3N0IGltcG9ydGFudCBydWxlIGlzIGZyaWVuZGxpbmVzcy4gUmVtZW1iZXI6IGRpc3Jlc3BlY3QgYW5kIHJ1ZGVuZXNzIGFyZSBub3Qgd2VsY29tZSBpbiBvdXIgY29tbXVuaXR5IHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBXZSBkb24ndCBoYXZlIGEgZm9ybWFsIHBvbGljeSBvbiBkZWFsaW5nIHdpdGggdHJvdWJsZW1ha2VycywgYW5kIHdlIGhvcGUgd2UgbmV2ZXIgbmVlZCBvbmUuVGhhdCBzYWlkLCB3ZSBkbyBwbGVkZ2UgdG8gZG8gb3VyIGJlc3QgdG8gYmUgZmFpciwgYW5kIHdlIHdpbGwgYWx3YXlzIHRyeSB0byB3YXJuIHNvbWVvbmUgYmVmb3JlIGJhbm5pbmcgaGltIG9yIGhlci4KKworPHA+VGhlIG1vc3QgaW1wb3J0YW50IHJ1bGUgaXMgZnJpZW5kbGluZXNzLiBSZW1lbWJlcjogZGlzcmVzcGVjdCBhbmQgcnVkZW5lc3MKK2FyZSBub3Qgd2VsY29tZSBpbiBvdXIgY29tbXVuaXR5IHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLiBXZSBkb24ndCBoYXZlIGEKK2Zvcm1hbCBwb2xpY3kgb24gZGVhbGluZyB3aXRoIHRyb3VibGVtYWtlcnMsIGFuZCB3ZSBob3BlIHdlIG5ldmVyIG5lZWQKK29uZS5UaGF0IHNhaWQsIHdlIGRvIHBsZWRnZSB0byBkbyBvdXIgYmVzdCB0byBiZSBmYWlyLCBhbmQgd2Ugd2lsbCBhbHdheXMgdHJ5Cit0byB3YXJuIHNvbWVvbmUgYmVmb3JlIGJhbm5pbmcgaGltIG9yIGhlci4KIDwvcD4KIDxoMj4KIENvbnRhY3RpbmcgdGhlIG1vZGVyYXRvcnMKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbW11bml0eS9pbmRleC5qZCBiL3Bkay9kb2NzL2NvbW11bml0eS9pbmRleC5qZAppbmRleCA2ZTZmNTllLi40NmFkZjM3IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21tdW5pdHkvaW5kZXguamQKKysrIGIvcGRrL2RvY3MvY29tbXVuaXR5L2luZGV4LmpkCkBAIC0xLDcgKzEsNyBAQAotcGFnZS50aXRsZT1Db21tdW5pdHkKK3BhZ2UudGl0bGU9QW5kcm9pZCBDb21tdW5pdHkKIGRvYy50eXBlPWNvbW11bml0eQorZG9jLmhpZGVuYXY9dHJ1ZQogQGpkOmJvZHkKLTxoMT5BbmRyb2lkIENvbW11bml0eTwvaDE+CiA8cD5XZWxjb21lIHRvIHRoZSBBbmRyb2lkIGNvbW11bml0eSE8L3A+CiA8cD5UaGUga2V5IHRvIGFueSBjb21tdW5pdHkgaXMsIG9idmlvdXNseSwgY29tbXVuaWNhdGlvbi4gTGlrZSBtb3N0IHByb2plY3RzLAogQW5kcm9pZCBjb21tdW5pY2F0ZXMgdmlhIG1haWxpbmcgbGlzdHMuIEJlY2F1c2UgQW5kcm9pZCBpcyBhbiBleHRyZW1lbHkgbGFyZ2UKQEAgLTM3LDYgKzM3LDE0IEBACiAKIDxoMj5PcGVuIFNvdXJjZSBQcm9qZWN0IGRpc2N1c3Npb25zPC9oMj4KIDx1bD4KKzxsaT48Yj5hbmRyb2lkLXBsYXRmb3JtPC9iPjxici8+CitUaGlzIGxpc3QgaXMgZm9yIGdlbmVyYWwgZGlzY3Vzc2lvbiBhYm91dCB0aGUgQW5kcm9pZCBvcGVuLXNvdXJjZSBwcm9qZWN0IG9yCit0aGUgcGxhdGZvcm0gdGVjaG5vbG9naWVzLjxici8+PGJyLz4KK1N1YnNjcmliZSB1c2luZyBHb29nbGUgR3JvdXBzOiA8YQoraHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FuZHJvaWQtcGxhdGZvcm0iPmFuZHJvaWQtcGxhdGZvcm08L2E+PGJyLz4KK1N1YnNjcmliZSB2aWEgZW1haWw6IDxhIGhyZWY9Im1haWx0bzphbmRyb2lkLXBsYXRmb3JtK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tIj5hbmRyb2lkLXBsYXRmb3JtK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tPC9hPgorPC9saT4KKwogPGxpPjxiPmFuZHJvaWQtYnVpbGRpbmc8L2I+PGJyLz4KIFN1YnNjcmliZSB0byB0aGlzIGxpc3QgZm9yIGRpc2N1c3Npb24gYW5kIGhlbHAgb24gYnVpbGRpbmcgdGhlIEFuZHJvaWQgc291cmNlCiBjb2RlLCBhbmQgb24gdGhlIGJ1aWxkIHN5c3RlbS4gSWYgeW91J3ZlIGp1c3QgY2hlY2tlZCBvdXQgdGhlIHNvdXJjZSBjb2RlIGFuZApAQCAtNTgsMTQgKzY2LDE0IEBACiBTdWJzY3JpYmUgdmlhIGVtYWlsOiA8YSBocmVmPSJtYWlsdG86YW5kcm9pZC1wb3J0aW5nK3N1YnNjcmliZUBnb29nbGVncm91cHMuY29tIj5hbmRyb2lkLXBvcnRpbmcrc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb208L2E+CiA8L2xpPgogCi08bGk+PGI+YW5kcm9pZC1wbGF0Zm9ybTwvYj48YnIvPgotVGhpcyBsaXN0IGlzIGZvciBkZXZlbG9wZXJzIHdobyB3YW50IHRvIGNvbnRyaWJ1dGUgY29kZSB0byB0aGUgQW5kcm9pZAotdXNlci1zcGFjZSBwcm9qZWN0cywgc3VjaCBhcyB0aGUgY29yZSBzeXN0ZW0gbGlicmFyaWVzLCB0aGUgQW5kcm9pZAotc2VydmljZXMsIHRoZSBwdWJsaWMgQVBJcywgb3IgdGhlIGJ1aWx0LWluIGFwcGxpY2F0aW9ucy4gTm90ZTogY29udHJpYnV0b3JzCis8bGk+PGI+YW5kcm9pZC1jb250cmliPC9iPjxici8+CitUaGlzIGxpc3QgaXMgZm9yIGRldmVsb3BlcnMgd2hvIHdhbnQgdG8gY29udHJpYnV0ZSBjb2RlIHRvIEFuZHJvaWQuIFRoaXMgaXMgYQord29ya2luZyBsaXN0LCBhbmQgaXMgbm90IGFwcHJvcHJpYXRlIGZvciBnZW5lcmFsIGRpc2N1c3Npb24uIFdlIGFzayB0aGF0CitnZW5lcmFsIGRpc2N1c3Npb24gZ28gdG8gYW5kcm9pZC1wbGF0Zm9ybS4gIE5vdGU6IGNvbnRyaWJ1dG9ycwogdG8gdGhlIEFuZHJvaWQga2VybmVsIHNob3VsZCBnbyB0byB0aGUgYW5kcm9pZC1rZXJuZWwgbGlzdCwgYmVsb3cuPGJyLz48YnIvPgogU3Vic2NyaWJlIHVzaW5nIEdvb2dsZSBHcm91cHM6IDxhCi1ocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1wbGF0Zm9ybSI+YW5kcm9pZC1wbGF0Zm9ybTwvYT48YnIvPgotU3Vic2NyaWJlIHZpYSBlbWFpbDogPGEgaHJlZj0ibWFpbHRvOmFuZHJvaWQtcGxhdGZvcm0rc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20iPmFuZHJvaWQtcGxhdGZvcm0rc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb208L2E+CitocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1jb250cmliIj5hbmRyb2lkLWNvbnRyaWI8L2E+PGJyLz4KK1N1YnNjcmliZSB2aWEgZW1haWw6IDxhIGhyZWY9Im1haWx0bzphbmRyb2lkLWNvbnRyaWIrc3Vic2NyaWJlQGdvb2dsZWdyb3Vwcy5jb20iPmFuZHJvaWQtY29udHJpYitzdWJzY3JpYmVAZ29vZ2xlZ3JvdXBzLmNvbTwvYT4KIDwvbGk+CiAKIDxsaT48Yj5hbmRyb2lkLWtlcm5lbDwvYj48YnIvPgpAQCAtODgsMjcgKzk2LDM1IEBACiB1bmRlciAic3Vic2NyaWJlIHZpYSBlbWFpbCIgaW4gdGhlIGxpc3RzIGFib3ZlLjwvcD4KIDxwPlRvIHNldCB1cCBob3cgeW91IHJlY2VpdmUgbWFpbGluZyBsaXN0IHBvc3RpbmdzIGJ5IGVtYWlsOjwvcD4KIDxvbD4KLTxsaT5TaWduIGludG8gdGhlIGdyb3VwIHZpYSB0aGUgR29vZ2xlIEdyb3VwcyBzaXRlLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBhbmRyb2lkLWZyYW1ld29yayBncm91cCB5b3Ugd291bGQKLXZpc2l0IDxhCi1ocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvYW5kcm9pZC1mcmFtZXdvcmsiPmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWZyYW1ld29yazwvYT4uPC9saT4KKzxsaT5TaWduIGludG8gdGhlIGdyb3VwIHZpYSB0aGUgR29vZ2xlIEdyb3VwcyBzaXRlLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBhbmRyb2lkLXBsYXRmb3JtIGdyb3VwIHlvdSB3b3VsZAordmlzaXQgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2FuZHJvaWQtcGxhdGZvcm0iPmh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLXBsYXRmb3JtPC9hPi48L2xpPgogPGxpPkNsaWNrICJFZGl0IG15IG1lbWJlcnNoaXAiIG9uIHRoZSByaWdodCBzaWRlLjwvbGk+CiA8bGk+VW5kZXIgIkhvdyBkbyB5b3Ugd2FudCB0byByZWFkIHRoaXMgZ3JvdXA/IiBzZWxlY3Qgb25lIG9mIHRoZSBlbWFpbCBvcHRpb25zLjwvbGk+CiA8L29sPgogCiA8aDI+QW5kcm9pZCBvbiBJUkM8L2gyPgotPHA+V2UgYWxzbyBoYXZlIGEgcHJlc2VuY2Ugb24gSVJDIHZpYSBGcmVlbm9kZS4gV2UgbWFpbnRhaW4gdHdvIG9mZmljaWFsIElSQwotY2hhbm5lbHMgb24gaXJjLmZyZWVub2RlLm5ldDo8L3A+Cis8cD5XZSBhbHNvIGhhdmUgYSBwcmVzZW5jZSBvbiBJUkMgdmlhIDxhIGhyZWY9Imh0dHA6Ly9mcmVlbm9kZS5uZXQvIj5mcmVlbm9kZTwvYT4uCitXZSBtYWludGFpbiB0d28gb2ZmaWNpYWwgSVJDIGNoYW5uZWxzIG9uCis8YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0LyI+aXJjLmZyZWVub2RlLm5ldDwvYT4gKGFjY2VzcyB2aWEgdGhlIHdlYgorYXQgPGEgaHJlZj0iaHR0cDovL3dlYmNoYXQuZnJlZW5vZGUubmV0LyI+ZnJlZW5vZGUgd2ViY2hhdDwvYT4pOjwvcD4KIDx1bD4KLTxsaT48Yj4jYW5kcm9pZDwvYj4gLSBkZWRpY2F0ZWQgdG8gZ2VuZXJhbCBBbmRyb2lkIGRpc2N1c3Npb24gYW5kIHBvcnRpbmcgY29uY2VybnM8L2xpPgotPGxpPjxiPiNhbmRyb2lkLWRldjwvYj4gLSBkZWRpY2F0ZWQgdG8gZGlzY3Vzc2lvbiBhYm91dCB3cml0aW5nIEFuZHJvaWQgYXBwbGljYXRpb25zPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQiPiNhbmRyb2lkPC9hPjwvYj4KKyAgICAmbWRhc2g7IGRlZGljYXRlZCB0byBnZW5lcmFsIEFuZHJvaWQgZGlzY3Vzc2lvbiBhbmQgcG9ydGluZyBjb25jZXJuczwvbGk+Cis8bGk+PGI+PGEgaHJlZj0iaXJjOi8vaXJjLmZyZWVub2RlLm5ldC9hbmRyb2lkLWRldiI+I2FuZHJvaWQtZGV2PC9hPjwvYj4KKyAgICAmbWRhc2g7IGRlZGljYXRlZCB0byBkaXNjdXNzaW9uIGFib3V0IHdyaXRpbmcgQW5kcm9pZCBhcHBsaWNhdGlvbnM8L2xpPgogPC91bD4KIDxwPlRoZSBjaGFubmVscyBhYm92ZSBhcmUgb2ZmaWNpYWwuIFRoZXJlIGFyZSBhIGZldyBvdGhlciBjaGFubmVscyB0aGUKIGNvbW11bml0eSBpcyB1c2luZywgYnV0IGFyZSBub3Qgb2ZmaWNpYWwuIFRoZXNlIGFyZW4ndCBvZmZpY2lhbCBvciBvZmZpY2lhbGx5CiBtb2RlcmF0ZWQvbWFuYWdlZCwgc28geW91IHVzZSB0aGUgY2hhbm5lbHMgYmVsb3cgYXQgeW91ciBvd24gcmlzay4gVGhlIE9wZW4KIEhhbmRzZXQgQWxsaWFuY2UgZG9lc24ndCBlbmRvcnNlIHRoZXNlIGNoYW5uZWxzLCB0aGVyZSdzIG5vIHdhcnJhbnR5IGV4cHJlc3MKLW9yIGltcGxpZWQsIGFuZCBzbyBvbi4gVGhlcmUgbWF5IGJlIG1vcmUuPC9wPgorb3IgaW1wbGllZCwgYW5kIHNvIG9uLiBUaGVyZSBtYXkgYmUgbW9yZSBjaGFubmVscyB0aGFuIGp1c3QgdGhlc2UgbGlzdGVkLjwvcD4KIDx1bD4KLTxsaT48Yj4jYW5kcm9pZC1vZmZ0b3BpYzwvYj4gLSBmb3IsIHdlbGwsIG9mZi10b3BpYyBkaXNjdXNzaW9uczwvbGk+Ci08bGk+PGI+I2FuZHJvaWQtcm9vdDwvYj4gLSBmb3IgZGlzY3Vzc2lvbiByZWxhdGVkIHRvIG9mZi1sYWJlbCB1c2VzIG9mIGhhcmR3YXJlPC9saT4KLTxsaT48Yj4jYW5kcm9pZGZyYTwvYj4gLSBwb3VyIGRpc2N1dGVyIGQnQW5kcm9pZCBlbiBmcmFuw6dhaXM8L2xpPgorPGxpPjxiPjxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvYW5kcm9pZC1maXJlaG9zZSI+I2FuZHJvaWQtZmlyZWhvc2U8L2E+PC9iPgorICAgICZtZGFzaDsgZGlzcGxheXMgaW4gcmVhbC10aW1lIHRoZSBjb21taXRzIHRvIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3Q8L2xpPgorPGxpPjxiPjxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvYW5kcm9pZC1mciI+I2FuZHJvaWQtZnI8L2E+PC9iPgorICAgICZtZGFzaDsgcG91ciBkaXNjdXRlciBkJ0FuZHJvaWQgZW4gZnJhbsOnYWlzPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQtb2ZmdG9waWMiPiNhbmRyb2lkLW9mZnRvcGljPC9hPjwvYj4KKyAgICAmbWRhc2g7IGZvciwgd2VsbCwgb2ZmLXRvcGljIGRpc2N1c3Npb25zPC9saT4KKzxsaT48Yj48YSBocmVmPSJpcmM6Ly9pcmMuZnJlZW5vZGUubmV0L2FuZHJvaWQtcm9vdCI+I2FuZHJvaWQtcm9vdDwvYT48L2I+CisgICAgJm1kYXNoOyBmb3IgZGlzY3Vzc2lvbiByZWxhdGVkIHRvIG9mZi1sYWJlbCB1c2VzIG9mIGhhcmR3YXJlPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMS92ZXJzaW9ucy5qZCBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvMi4xL3ZlcnNpb25zLmpkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODdhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMS92ZXJzaW9ucy5qZApAQCAtMCwwICsxLDE5IEBACitwYWdlLnRpdGxlPVBlcm1pdHRlZCBWZXJzaW9uIFN0cmluZ3MgZm9yIEFuZHJvaWQgMi4xCitkb2MudHlwZT1jb21wYXRpYmlsaXR5CitAamQ6Ym9keQorPHA+QXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4yLjIgb2YgdGhlIDxhCitocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmIj5BbmRyb2lkIDIuMSBDb21wYXRpYmlsaXR5CitEZWZpbml0aW9uPC9hPiwgb25seSBjZXJ0YWluIHN0cmluZ3MgYXJlIGFsbG93YWJsZSBmb3IgdGhlIHN5c3RlbSBwcm9wZXJ0eQorPGNvZGU+YW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlJFTEVBU0U8L2NvZGU+LiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQKK2FwcGxpY2F0aW9ucyBhbmQgd2ViIHNpdGVzIG1heSByZWx5IG9uIHByZWRpY3RhYmxlIHZhbHVlcyBmb3IgdGhpcyBzdHJpbmcsIGFuZAorc28gdGhhdCBlbmQgdXNlcnMgY2FuIGVhc2lseSBhbmQgcmVsaWFibHkgaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgQW5kcm9pZAorcnVubmluZyBvbiB0aGVpciBkZXZpY2VzLjwvcD4KKzxwPkJlY2F1c2Ugc3Vic2VxdWVudCByZWxlYXNlcyBvZiB0aGUgQW5kcm9pZCBzb2Z0d2FyZSBtYXkgcmV2aXNlIHRoaXMgc3RyaW5nLAorYnV0IG5vdCBjaGFuZ2UgYW55IEFQSSBiZWhhdmlvciwgc3VjaCByZWxlYXNlcyBtYXkgbm90IGJlIGFjY29tcGFuaWVkIGJ5IGEgbmV3CitDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQuIFRoaXMgcGFnZSBsaXN0cyB0aGUgdmVyc2lvbnMgdGhhdCBhcmUKK2FsbG93YWJsZSBieSBhbiBBbmRyb2lkIDIuMS1iYXNlZCBzeXN0ZW0uIFRoZSBvbmx5IHBlcm1pdHRlZCB2YWx1ZXMgZm9yCis8Y29kZT5hbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uUkVMRUFTRTwvY29kZT4gZm9yIEFuZHJvaWQgMi4xIGFyZTo8L3A+Cis8dWw+Cis8bGk+Mi4xPC9saT4KKzxsaT4yLjEtdXBkYXRlMTwvbGk+Cis8L3VsPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS8yLjIvdmVyc2lvbnMuamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5LzIuMi92ZXJzaW9ucy5qZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjUxNTZkCi0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS8yLjIvdmVyc2lvbnMuamQKQEAgLTAsMCArMSwyMCBAQAorcGFnZS50aXRsZT1QZXJtaXR0ZWQgVmVyc2lvbiBTdHJpbmdzIGZvciBBbmRyb2lkIDIuMgorZG9jLnR5cGU9Y29tcGF0aWJpbGl0eQorQGpkOmJvZHkKKzxwPkFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMi4yIG9mIHRoZSA8YQoraHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZiI+QW5kcm9pZCAyLjIgQ29tcGF0aWJpbGl0eQorRGVmaW5pdGlvbjwvYT4sIG9ubHkgY2VydGFpbiBzdHJpbmdzIGFyZSBhbGxvd2FibGUgZm9yIHRoZSBzeXN0ZW0gcHJvcGVydHkKKzxjb2RlPmFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5SRUxFQVNFPC9jb2RlPi4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0CithcHBsaWNhdGlvbnMgYW5kIHdlYiBzaXRlcyBtYXkgcmVseSBvbiBwcmVkaWN0YWJsZSB2YWx1ZXMgZm9yIHRoaXMgc3RyaW5nLCBhbmQKK3NvIHRoYXQgZW5kIHVzZXJzIGNhbiBlYXNpbHkgYW5kIHJlbGlhYmx5IGlkZW50aWZ5IHRoZSB2ZXJzaW9uIG9mIEFuZHJvaWQKK3J1bm5pbmcgb24gdGhlaXIgZGV2aWNlcy48L3A+Cis8cD5CZWNhdXNlIHN1YnNlcXVlbnQgcmVsZWFzZXMgb2YgdGhlIEFuZHJvaWQgc29mdHdhcmUgbWF5IHJldmlzZSB0aGlzIHN0cmluZywKK2J1dCBub3QgY2hhbmdlIGFueSBBUEkgYmVoYXZpb3IsIHN1Y2ggcmVsZWFzZXMgbWF5IG5vdCBiZSBhY2NvbXBhbmllZCBieSBhIG5ldworQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50LiBUaGlzIHBhZ2UgbGlzdHMgdGhlIHZlcnNpb25zIHRoYXQgYXJlCithbGxvd2FibGUgYnkgYW4gQW5kcm9pZCAyLjItYmFzZWQgc3lzdGVtLjwvcD4KKzxwPkN1cnJlbnRseSB0aGUgb25seSBwZXJtaXR0ZWQgdmFsdWUgZm9yCis8Y29kZT5hbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uUkVMRUFTRTwvY29kZT4gZm9yIEFuZHJvaWQgMi4yIGlzIHRoZSBzdHJpbmcKKyIyLjIiLjwvcD4KKzx1bD4KKzxsaT4yLjI8L2xpPgorPC91bD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0xLjYtY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0xLjYtY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTdiNGFkCi0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTEuNi1jZGQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjEtY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjEtY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU1NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC0yLjItY2RkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmMxZTc3Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMi1jZGQucGRmCkBAIC0wLDAgKzEsNDA4MCBAQAorJVBERi0xLjQNCislk4yLniBSZXBvcnRMYWIgR2VuZXJhdGVkIFBERiBkb2N1bWVudCBodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20NCislICdCYXNpY0ZvbnRzJzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxIDAgb2JqDQorJSBUaGUgc3RhbmRhcmQgZm9udHMgZGljdGlvbmFyeQ0KKzw8IC9GMSAyIDAgUg0KKyAvRjIgNCAwIFINCisgL0YzIDEwNSAwIFINCisgL0Y0IDEwNyAwIFIgPj4NCitlbmRvYmoNCislICdGMSc6IGNsYXNzIFBERlR5cGUxRm9udCANCisyIDAgb2JqDQorJSBGb250IEhlbHZldGljYQ0KKzw8IC9CYXNlRm9udCAvSGVsdmV0aWNhDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GMQ0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdGb3JtWG9iLmEzMTEwMjkwOGE1OTJlOGY5NGM3YjRlMDMyZmZjYzM3JzogY2xhc3MgUERGSW1hZ2VYT2JqZWN0IA0KKzMgMCBvYmoNCis8PCAvQml0c1BlckNvbXBvbmVudCA4DQorIC9Db2xvclNwYWNlIC9EZXZpY2VSR0INCisgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9EQ1REZWNvZGUgXQ0KKyAvSGVpZ2h0IDQ5DQorIC9MZW5ndGggMTE1NDgNCisgL1N1YnR5cGUgL0ltYWdlDQorIC9UeXBlIC9YT2JqZWN0DQorIC9XaWR0aCAzNjkgPj4NCitzdHJlYW0NCitzNElBMCEiX2FsOE9gW1whPDwqIyEhKiciczVGLlk4T0dqUDpmOihZOFBEUFEhPEUwIyI3MEg4RSw1UlUhISRrUkZFMThMNjZLQjU9cysoJyEhMy0vISJKdUYhJyJDc0YpWEVBOmVVaWh6enp6enpwPTkzRXpkaywhSUUsNUxTenp6enp6enp6enohIk8kTz1ddGUqIUEiM04hIzAnSj1ddGUqIUMtVmIhIy9tRT1ddGUqIUU5JSEhIzBYIUUtKSdbIUdESDUhIy9wVkA6VD88IUlPa0khJWAuaTtGOkVhIU41dHUhIk5YQDtGOkVhIU9yKzAhIk5JOztGOkVhIVFZNkAhIk8wXkI2NCtSIVNAQVAhJi87JEJsM25OIVhKYyshJyJNI0YoNTFNIV5IX2MhK11WXUByMjJHIWksZXIhO15QTERlJmhKIi8jVm8hJTs+ckVjXzldIjM6SEIhJGtaTD1zKmVGelMjLS9jOU47Jm0hakdkMD1zKmVGejIuSFVkVEJjSVcpNm06SD1zKmVGei0tWkRpJ0BkJ19bYCk/Tz1zKmVGem9ATyREISEhISIoJ250bjFHU3ExISEhISIkYiQqOSJkXTJnbzJibmwjOlRXUXJSXylMcW1aVipyTUJQcCI1M19UXyJNOFxFY3FFX3ohISosRiEhJE1PRWNxRV96ISEqLEYhISRNT0VjcUVfeiEhKixGISElMVBCNjQrUnohISonImQ8Iz9nISEhISJ6ZDwjP2chISEhInpkPCM/ZyEhISEiISEkbklCbDNuTnohJitCUVcuNGpKO1pIZHQxZEQkQFdeJE9hLUM0XTQnJipCZDpkPiFcPCdVRWIxR10iNDFHXSI0MUdgUVFGKDUxTXohIik3bitBPlRmMEsoY2d6enp6enp6enp6enp6enp6enp6ISEka1BGXmtDT3ohIm84MyEiPGFTOi86aWkhIm84MyE5ZUJEOmZJRHAhIm84MyE5ZUtJO2FnWmQhIm84MyE5ZSQvN1MqUlshIm84MyE5ZHMlNnFbTFshIm84MyE5ZWBCNlZbVV0hIm84MyE5ZSQ4N1QnM2QhIm84MyE5ZTArOGwsS2YhIm84MyE5ZSEzPERya3QhIm84MyE5ZUI8OmVVaWghIm84MyE5ZUJENjtkZGAhIm84MyE5ZSE4NzhqMGQhIm84MyE5ZWBCPConJiIhIm84MyE5ZUhHO0gzXHMhIm84MyE5ZTM6OTJZYGkhIm84MyE5ZHMpNnElKFUhIm84MyE5ZTw6Oi50V2YhIm84MyE5ZS09OFE1WmkhIm84MyE5YURSISlOWTwhKSpBaCEmRlUvISZhZzchISRrUURlJmhKeiw0R1I0LUJKMy0hISdrUzg6VVs/enp6ISElK1BHXVdvYyEhI0IpRS1aSjxCNHVCMDYjXmRaQUxucnFESVk6TSs+UFcpMzw5KjwhJ2l0dEJrQD5GOWhiVTshISEhKSEhLmpoISFFOSUhISonIiEjYmg7ISEhISNURTUpciEhISEiISEhJT5URT4vcyEhISEiISEhIVJ6czRbTkAhITMwJSE8RTMmITxFMyYhV2lFKSI5U10sIVdpTi0iOVNjMiJVNS84IlUsJjYjNzFZPyM3KFA8IlVHSkEjUkxlRSQ0NnRCJE9kQ00kamQ3SiROSmlcNk5JNWkhV2lFKSJUbmkxJDNnWTwkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkNDcrSSQ0NytJJDQ3K0kkND9nSyEiZko6MGBjN3IhP3FMRiZITXRHIVdVKDwqcmw5QSJUXFcpITxFMyR6ISEhISIhV3JRLyJwWUQ/JDRIbVAhNDxAPCFXYEIqIVgmVC8iVSJyLiEhLktLIVdyRSomSHJkajBnUSFXOy4wXFJFPjEwWk9lRSUqNkYiP0E7VU90WjFMYkJWI21xRmEoYD01PC03OjJqLlBzIkAyYE5mWTZVWEA0N24/M0Q7Y0hhdD0nL1UvQHE5Ll9CNHUhb0YqKVBKR0JlQ1pLN25yNUxQVWVFUCo7LHFRQyF1LFJcSFJRVjVDL2hXTio4MVsnZD9PXEBLMmZfbzBPNmEybEJGZGFRXnJmJThSLWc+ViZPalE1T2VraXFDJm8oMk1IcEBuQFhxWiJKNipydT9EITxFMyUhPEUzJSE8PCoiISEhISIhV3JRLyJwWUQ/JDRIbVAhNDxDPSFXYD8qIjlTYzMiVSJyLiE8UkhGITxOPzgiOWZyJyJxajQhI0BWVGMrdTRdVCdMSXFVWiwkX2sxSypdV0BXS2onKCprYHEtMU1jZykmYWhMLW4tVycyRSpUVTNeWjsoN1JwIUA4bEpcaDxgYEMrPiU7KVNBblBka0MzK0s+RydBMVZIQGdkJktuYkE9TTJJSVtQYS5RJFIkakQ7VVNPYGBWbDZTcFpFcHBHW15XY1ddIylBJ2BRI3M+YWlgJlxlQ0UuJWZcLCE8ajVmPWFrTk0wcW8oMk1IcEBuQFhxWiM3TCRqLU0xIVlHTUghJ15KXmVHLU5DMDF1IixuR2BGZmE0ZTRjcE0iOmM4OFBDbjE+TCwiTV0+Uzpvay9DYmxuV29oJiNGWW1wc1oqZjZoJzhtSU9dXmNka2khYyZQNy9OZ3RNT2VxYStNLiVBXkg5MStZW0ZgKjVlPCowTWkhSU5zNSluRTdiVCJfbyhablJQUDJOaFsuZzlHM19nTktvLWxMcjV1NFdcP1BvVzVwM0BqdHM4bD88JGJJbXUiaC1HX11ZOWNuQCNLWisvPSZoZ1ddNmhVU0JBT1hYWlFiNXV0RmYtPzBcYkFDIWhXazU0Pz9DSCcrWG87TyxqWkc/cjtMJXE0RFwpWCtgNGxVZmUsMGE5XWltIVA4KD8tayZtZGlPXFAlNE4/biluJFElOGI1RnAhbicpOkEhS2EnWGRUJDBKbmo6VypjcWVqJllaZmpCUidGZSg+LENHaiRHYnFQLDAlQzhPI15ASUc7akNKKiprXGBRYkdbQlJsR0Q/KTJiSCdQIU1vLko3SS5oYWJQS2ZBcCpFYE47L2hsJSpeYEBbJGNQTSZUUEMsZEoqWnAxWykqQ2l0a1ljLXNsPkkrbmdIZk8vTSlWNEMobmsjVUpJQjsxU1lNX0g6QSFzZGosLV4+RDgyRDhEbDJCW1I9PytTISwxNzNyI1hFSDlnXDBdKlpyL2RyZnVUWGRPMHR1SylPXD82SGxtQSs1UjFDJF9OZGVLPyxtYC5mSCdULVhNJjA/LXRoRnIjcFx1WmdhSXI4WnBrNilTISV0U2srT2xCPTpOb1FQIzxQMl06V3IyZj0iRHJLYi8sSHM5Z2c2V3JvXF1wPyFJLzk7PTVsLVE1LVotKzNFTlstKUE/bWwuMytITG1ePTVqYlddcUcvVGBFSm1rb1QrZlctaCxvW3JPZClvTm42UDI9Q1RkRihMVWxXN2JbYCc6IThQWUE8TCw8X0shUWQ0JD5jL2xmSUMxQVBGXUtQMURhQlhpNyU0LmUkW11LVTtaPFtkYl0zMiU7cT5MIl1iPkpaW3VWPT0xaEI5KjAtJyM5OzxVSjo5QSNrM3E6ZD9PRDY4SG5eVyFcdSMrZy9iWUJMQVpSTVpEMGg+TU0lXyRJVU5JJ0UkalwoP05XR1A0QjN1MF9xU01RSSJuPTQ/aVZCLzlJRDpPZyU9ajw3YkFAXilSOWIzaUQ6MCVoUDFkbyVwI2AuQChWa0IpJDJFTFVNKjw5VnJrJTBMQ3RLW1c5PEUpJkckMlVfMUZ0N0wpQ2NMUDJgPEVWYTAmQSVbWTcuWkgnUjlpZiFqZGNacic4KEZiTE4sNVFxaiE1UXFqXmtuNGpbRTJvWmFiXSFSVC1CXFwvXFYyWGZqXU5najZSL0BEPFg0XlAqQzZORUhaXUE9PEI3XV5pVGtvNDArPzEwZmQ8T1gtPjU3MVxqYDJdYGNDQWRHODFyV0pXOjFQQ109QUlyIWhWNydrcisobkhYa1pbRkZsNDdbXCQ5MnQpUEZAck5BZFAhQiYoYWwkZDhXSmVWaks5XSZrTUc2Uy1VcSlzZDAzNmR1RFZKSTlGSCwhJlU6TE9DPEBwL0pTZlFDI1k7RktLP0YlMlJlKVYrdWdZNiFaWjxLPzcoMCs3KSc9QDhda1xEbjouPGxJKCwhV3IsaVdMMWo+KVNIR1IrTiUpQjg9TFRfL1MuTVMvZ1JsM04laFE7Yy5WOCdXM1FgRy4hWE1sTCs6ai9UYkk1M1hSQCZXVCQsUUJRbUxDPjJIcihCL1RWRDlvTi5UOEo+PyJFSjA5KiJsIzBUYWxISSZTI148YV1fZm0uaV1vYV4sREAhXCEmQXNvIjZzWjU7T19dITkoQ2VFXSdKKjpPLnFMXV5hUHE3ISU9UyEhJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhJT1TISElPVMhISU9UyEhOVg4MkhyZmB0XzdwOGpONGBeYV9WSmcrQD48SmlvJDhmZjY2SU5eaUU1WTlfT2JQXil1XjEraS9QWi5faTdXU240aEQiLC0/QDI3Uix0I0JSZl50KzhSMFJwTVVEaz1fVz0mZStFU3NkUHJBKGFzO11ZOmEyV2YoXVkmMnE9WkhWYDdfVTVpYz1yJC5RRDBmR1ovaFtDODZ1YGhjVkk1aCRkTWUuWlB0M2EhXkA4cDRNajFhL3B1Xm8+Oy9HPj90PmQkZ1MyPSFUT11dWDtPVDE7bWhBYyw5MjhzU2VwQWttSHNEaF83aD4vbkFeYVBtNzE1OTtgJDtlPkorc29kT0UhRVAiQlR1LEJhJkhqITEjZT41PkIkJDIlZT1EbkwiZilkKEEjZTAwWl1mSmBwWztIK15RTzlscnM0VSF0Mid1XGFAOjBqKzNgQzNrSDNoNGBLUVYpOFs8aTRzLmg8YistZV5fKTczZjFqKmxIS2JHclgndEBkbm5TJ1pJWloxWCZyVEtpRWtrKzoqUmdXYmIwVD5oXGVWLmY8S11scG8hJz1MKXBWYWE4UkMiL1o1PkBQJjEyYVhyNzV1YCYhLSJlL1glIjhIWUZQXlxCM0dLcDtUOyJSUmwpWzc2YkY/QShbIz9eViFkK0NHXlYlTCxGTiVtYUlYbT0jITctQWdaMXFZSloqb1JeaUswY1dSIVIwN1JsKHFTLDU6Q2cmNCtbL1hxQUQ0QUlEKUBdcXJyPjMoUVQ7c08yZ1o9dHJYKGFGRTlHRj5GL3AmJSJQbEhQKm9gQ18qXi9HUXJyPE4kOl0oVFhddDw1LFhmW1okVCssIi1nU0BdTEs0bVNASk50T3MsaUYhMzpaR2FecVxlV1o+WCxTY2AhMixwSlBEWmQmX1tnLipfTXAhIl1QO24hIk0ndGtKZ1FfXUkjRWZVJkNmKG91PlBcS05CSW5jLyV1Nj9ZQjsjRl0xciZJajpjWVFpJU8+aUk4SkM2KTg6Zik6XDtXWHM/dE5mYnVsR04wQjRCSmRTXVwhPCMiMlY+UEIvZEBrcHBuOCpQLWY8aWAlYDFIY1YrTGVjNCRWOEcvYV5gKm8pdFZCOCpVQ2heaTFqPGc6W24qRGVKY2psRXVxVnI4Yk5WMClDSGhQa1htO0VZYzVCVUosKSUsJix1WF5JYWU7czhNMk4wN2hCWW06UEAhXnBrblVEPHNdNFRLZ2MuZU5CSjghZXM9ZVRtJGpPKVVtbyZUVENEQz4iYjRvWWVVUic8LmVLb3E1SUFhZjUhOWpjKjx0Kl9hJjAtdThUQTZkKEZDbldeLEFsNS1tXzEpI1VGRTItYG0pXUA6Yzs1NTEmcyMzbW91MU1iMUFpYD1gPlNyUyFpcWdsbCkvciI9VCU1UEZVOlEqJCE8JHFBaDowdVB1TGJgRlI7SGg2cDVbdUI+JVA5JCI1KWlUZSRTZ25JZk8wVlVEayk0Rl07SmsqaVdGKixEb2NXOj1IXy1ZcWNoPVIzI0pmLnIwK01gXyhWNVgrLzBcIyxBdV9SUmFsJ2U5ISMoITghQmJGXk1XJC1PaTFrYCRQMyE+TmlWJ01qN0RGKm5GJSU8JW9hNDc5anN0WjkjT1NAYEhvXmBYaFtbOlBpIVs6M0MpM1RzaGlpOUYuX2FgWCcrcWNxIT8nZydqRUBeV3EiT1lpcGxGRTFfYFEwSmxKRFtrZE5aQWYwSnM3KFZqS2tQX3UsJiVRdCpMUkdCPjNiPzhpTztRIT5AWCcuYkpLKHM4LGxVcC86MWspXC87RFVtTGhiPSZyZEMvcVRgUUpGKj1UPnFKJVNlVFlnQjckaDwpSDplQzJCKTdGWyc9dCNnT2hPSkw2SGQ9TCQnWnVhTWlEbWxuZTFqWnRPPGojcmRWMyU3OShTISo+SjJEVzZsdG0zIi1cbSZCJXFQXWYlY3JyPSUxSTA4QzxyMFk6X3JhNllicmY0UmleW1AiRXEnKTkqckpgVzUhOWxBS0Q9K1pHaGhzNztBOEEyT2dDTVRYSnAnalQ7aTVHalgvKTZbRDErcCI4dSxiZTdZY2koNHE4K1gyYWsuKW9eLSZdVVxjVSNDUkNyKlltKXIoPTNPJidtZGcrMldTPFRII0VoNEwhOz8wPGptXlU4WTZGXWEoYCQzJWk7Ni1iYHJYRCpYNUtTYm1CJiNdSicoLWMmLFBzW3JyPldlVztjajc0J1FNIyEwPWwpbHUtOSdAQERHOVE3M1ZqXHNvSnUmX21wbEgoIlZXXEBybStUYGw5KjM1bFRbW18xK2wuPGczdDssK00rSEMlLyInUyFyMTYjVk0zVEspIT9cQmpmTkEsJihTVD5CRChyJT9oU246VCNFJ11wQDg5PSwhViVLSklyI29GZTojVUNMaitFXUhtZyJdYD1UMDk4b0RYaitOIz0pLkpOIm1raU4sYWFOVnVAIlhVKWQxUVtddDRiYSl0bykhVEFLQ1R1Widyal4yQGIndV1vJCc0QSUobHMrTzBuUzRmdCZ1T1tRX2pdbD1HSjtlIi1XMmBsXUEyYTtCOkpAQnBWLlwzK2hyUloyMidNTDpoSjRUZTBSUz02ZyRcJD9yYztmYklJS0czODlDNFVRRXRpaldwLTZwJC4mIWYtTWcyRHVUZWImK00lSF44THUyZF5RKCZKKXFyQSs4K29Lb1tiQzpVO102LSVIVl87QGlPUEJkT05IOFs1bzEzbjtqUiNybWRBOCEhaEtRUVtsNDstMGI5RmBSKi9rb1xsWGpMa3FuZCYqTkJCUGQkKCFfZEdBLmtdOHVIVEg9YTNvSWtzLXJyPFJBZGRBQk0/XiZdZ203N2kwakBeLj80aW9kQDo2Z1YzRm9NSGA7IyM4NyErL1dSa2tIW0FyT0JXJ2dwTVkucVIkOCZkSE91J0c/WVo6VHU8MXBvJF9ROjRsbUM1UWErMmZUM0s4b1Z0UCVPWz5MR2o5Wm08bklRTDNtJiZVO3QlZlpPZih0PUstKUY+YixbNTxIbkFjc1NSU3RNQG8jR04uKF4nQiU4bj85bSU+dUw6MylLIlRBbCQkblZNb0FNJzdLZktHVXVPT0ArUz5FKnJsYChJRHIpNi8hM2ZCJCE5ZC1gNjJwb2ZnbiMxVUdkPzVQP1NoKC1OKU9yRk5PIk4nZSklYlhVR0MqYmxCcltwWF50QmlSV1RVPk1HRFFzI3NwLSFiQmwxXFtzYS1tVXElLmNUJD9mQ2owKzE5IjZhbmhtdHBCYG1bIV9FPks3MjlXR2pPb1RCNzgpNWo9ZiU1aj1GbjgxJzVWJ1kmayssYDNIWShzIXBHXjJYKVBKcmUiam45OVZdMSckXkBiWCl1YiFcb24iYC11MTBMWD8mJGo5b1cjISspcjEhOWJXQE8iQVFHR2NpTz8wR0E2VDpsUTgzMjglcnMvJiZcWyRdTFJSajRfSlBuMVBaLmh1M2NKVmkoLWgkcSZzNDxxI29IbmszVysnI3RpT09jJERELGIvQmJCOUchMjNgaiZJYls3WDJYZ0dqTUomR1IlL15eRFBrMlxyVS1uS3FQaGAqZCpKYmBAWChNNFE4JSI4OVxRV0Anc000QmNuSnQ4LTljKk9uRGw3LnNbQmdwYjxeNXI5byJWcGZMSClTXSFYRVpDIlphWStxaCgodVtRZ1JmYTgwLjVha1JEa2xOZGBBTjVOMj9lazRrKEJsNldnWWlDUDhARm42TiJwdDJqMU5RJkA4RVgiTkwhKGNcLHBhQSJyWE00bGlZMyEsXlE3W0NgJ1NTaGAjISRhV2dHZylJJEtjaFArOElZSyJUSkpSWSlpU19VaDc3WF1MMFZfJS5jIy4wIW9VU19wTUltL2skNFRlWFRRUFYiTlVESEtib1xMR0VjQDdvQWRRcD4rL0ctQCFQWl9CJ0hlO20nQGdlXU9YXE51Sj9ML1Y+VSlFMW9gbWFpPjdDPlBQXSlEMSI+PD5ONEN1ImltP1ApUlxbam0oSWFUT2k4IW8zcy40XDBbRF1xKkFhNDpoPkBKY1wkWW9SaTxaUSZkUFgzK1ojWytCOmcnR1xAdEVGPyxiRihcPzYvbnFnPW9AIUAvTlIqUmJCXWAvJW5LbG0hdDxJcnI8OjxtPyxGKEdjWkIxQDUrJlc1TSUsMHB0O2ojZmdhS09haiJCMm0zZEBici9gajcsZDQ3Km0hbXJnP09wYl1OXCpXNjNrUSQxQFMqPlwuN3QrVlxKYj4yZ0BdclByV3BvIypeQFY6WF9oOTA+OiRqUmFIM2x1TksnRS9ZMyU6OCFQdW1vYEdtIS5gTUtdV20rTEEpWHQ/RTJpMClBVipSSE8jYy5rdCY4YSg/MCUkJlAlSExpZCkxSDU0RlQyJHJqMy51QVEhKzNhJ1xhTC9Ncl07J09gYEowSGRfYTA+JCUiTylidDVzQFc0LW5sSUlIQT5vN0xiaGwjVTFzclgoW0QnWSY6bHBqJnI0JjdRbEk4YEdfc0hCZVdubCcjQzNfOV5rL180TVBBR0FaN0dEW0w0dElGW1wpKWQtZDgsWHU8MytdR2s0bnRSMyVBJWQibFpQNlNCP05AX2lGRWxiSGhhcmcoMEU7LT9yYFR0cVhoNlE/bzNPN19kaiJlbEpyczdIL0ttczQsPktCJDRPXjAhXEArVlhTa2piLFklakFbKSEvLXFiXF9gVEM9Qy9QVUJzNGFOLDVOWm0zTEcwPiRmQ2VPRTRCXi5yVGNWNGNlWCRtMVxFPUpAN0EhR2BpSDhdP0MwUSErVzc9PEEpKy1RWkMiST5gXmJgLGspOVIxT11LK2RkX14uZVNac1xJdG1nLU5MZEVbak9HaycpP0JSNTghL2I4YVooLyNFXV9tQEliIzpjcFY0LCZfZVY/V0ZJIWVXWVhyO2QiIlVAYytLR1VcIkVCJyQ5T0hbXEJwTFI/SEEoU3UoQFxdO2IyIVhEJmtWcCI5bW00T08zWz8nLUg3Xj8uVGZxJGl1VVZsaCFZQ25ndFRKYW0nYztuWy0mcCI+blEmMDRUMyIuKT5IUztbbHRiWl1KbGhUVlRyZS5IYDZYKCkwSW5eMl1eKkMiRCEpNE4vaFcwJix1V0pJdGlELm5POVg5Mi4kbC8pRjsnKUA9bigvaix0XjMzISlEUC1qZF1GSmQtTTlhZks5XXBhQFkibD89clcpclFhUVg0YjtgPkdIWFZFWG0lbDFrbmA4XzhdWmtEdF1kdG9yUygnZWIiXmswOEFsUVxbOUZfYG1bUS46Rz9BdDQzVkFdV0QzWFctJyE4U0pCZy5TISMoXjlHZT5BPSooTVFGV0BUbSQpKG9cXVdqX1YmZidgN1lgYDhPTztTVTxNJGZhYXNtZm4uSm5EbyRAblN1KCRZJTk9amciSVFfQjVmVkdPb1BLKSxrNyNITzpSRVAhNWxqaSgmbjglaGM5W1ZecHBEQnIiTUYwRC1PZTA4dGhDOERoRyVNJlw/R3BrP2dcb2VlVic/SGVnOj9pXG8laSxZJFw3KVteQytEVmdjJCkiYiM8YDhgaFAyclpySyVnLmBNKVAuTz5cKmZNTy1USDI0Z0soYzo/ZFIzM1ArLCVzYTNYYmNuRj5yTXJyQ0cqZU5gT1UzcD9QWXJuUDZ0SU8iV25mPjRxQippI09lP2Q+bi5iQV4/XVVsZ1pQKTNqNWNNI19LXC1eJCFHcnJAWGk9UDhgQ3BtNGtvWjJMP1FfXCZNS2hsbjdjRjRWOVRpZzlBXVlkMCZFXlZgMygubko2Om9kISwrO3VyT2pqcGUjRkh1PGJIQUNvKWFvP0s0a19Yb2c+WHRnWkRWJlJrVjstSFNpWmhXIUVySDtRMiQ/XT8rMlVBM0pVNUpvUmw5JyJZaCJZPTttdG1ZRG1BJy9fUi5vMzlBdU4xOj1pKXM/WiRDNUhqY0FELz08NDAiMVFIXUI8Zi1dXHItNlpeSFgvUi1yTDEsVU09JzUnamRlIWtAMWo6bGg2WTNiRixsWUdvWlwtQFxYKlpgLypAWCcqIVM8R0M2YDlHYnBeR0Q+ZHJnPFAwcD11OHQwa2A6PCpWLzFaRDNLWURJUkJmITQ4TUtsVkVNaCtBJVVFSDknJ045PjE4WjdARGNRTlshLSk5JSIlaSpCRkVhNl01U0RcOzJxSGxmclBtJ1RLWyxaYmM0bnNKSkRjYSQrJ05FQlNpUz1wZioqPWQvYG0xZi41J3VhXElAOyM4ZGB0YT5MRU5AN2peMystOylec0ZrOTItJk1tbmY5LWRhcUhHTCUwZlQ6V05KOGcxKlhZcGhPQy8lb0xkJlswNCImQmVBSGlQbWpfKThKKVJsKXAnRD5cSzFWUnA6Zzw/aXA0cURfbyYmVm5EOSJFWDUzIyROSl50MlZjdSIlPEBxZDxcNCRSVy9CVSMnJj9nSlVcPGQ6WXBoWEpcXEBMMW1NTHBKTU4rOiRKaDUkZDFbc0olQltfN3NUXT1sRjxMVXFXak9sLjVqOF5xLSY+WyRAYmQqRTphLi1oTUgmJjxnKC8sTGZAIjMvJWxxITdHYD1SY29WRF8xOSZeNio6I0RCVWExamZUV1ViQEM6ZGdgM0leImBvV11yPDVXPCJ0cSs6aXBoN0NtVlAnMkQoUnA6X2o9YFY2Sk41Z3Asazstb0MtW1VyKzVCTDhAQHJSTE1vJSFARnBVYSdwSy5gVytfdSc5ITFvSiYyVmR0bFdOLFNvRmZvKyFSUnNHPldkSFpbOSI2ayNkaClHXjRXVUFyTjpTXHBuUWsuX1Q5QU9pO1dkJ1lIN0QxWTlTWDUiQ2JjPCxcOT1hIVE7VVxycERsImM+ZDIjZT5cYnJSJmhxdTklXVNPTyE3cyZtZTQramczXCpaXEo2OWBSYmFRPGksQD9saiNzU3VbKihGWUI9bHRzK0w3IlFlODheKjw0R3AvNlwpRXFqOjYtImM/YVQ3P2VKKWZoXDNYZ25bJC51KyRMZmw4cHE9KDdiVWhOW0NMal1CNmJMN0QrPlAmLlMnNWgpJ2lfKkkwJjskMkkuOT1nMjwkODhybVxhX1tFMkskPDcuaDEjJVQjOkc6WihfSCQpam8uNTpUWD9FQnMzJ28mZVFIP1MlMVVbKGtwTnRcVC46InFxZl9KPV5nMkZzZmcjKUxrZjcjMURHTiF0ck0iTFhjQWIlLiEjcGA/UVo6TWxUQD5vKixLbW1JUWs4ZVJlcG9YRVlJISMvKmkqNE5eW2JuRU9YKGhPMkBuQSFfUVNZakdGYW9aTThjZCdFOFxjNT9PMCEjcldwaD5lO29FLDZcVyNjXVgzLDxacSZvXDtNPURsPVxaR0wxXkNZS25XQ29eK0omP2JqaEJoWU1tJWFSXCRMOlR1by8wUDtwJGQ8QUlVWFVxY0IoRktlVWByPCoiaWA7Pz0zUkBDNEAtIS1CZTlkUE1tOCMzYFgxc3BYZCItVzNZKF4hS0shSjVmbmolJlotN2BQJmwycXFMWFV0QzJmLlxqMDFNJTRhQnEtMy4hS0ZNcm9fZlhQNk5uKWBFdVk9bUIocGVNUXRgSUlXWVNIdSFnI0clYSZsW2RfOSZSU3FjQ0k3WVAuIjpHQDJnU0ZfSDZQKS89JidWXCwxO0M5LF9dT1xcaFF1MSVNRV9VQyk+LVheJD1pOFBnSG9NNzg8RzBXYCwicyhnb01HODM6MmttSllKblFfLHI2YD8mY11uWEhMUCZwOiIpOC0xODBZa3JBQSJtSCxjZjF0UWcyYWFcLVFOaShLbSYpIS5EPWMtV3VCUHM1KkEjV2ZgJmk4OGVsV18tLmNiYi9OR1FZanBtdSJjI1VzNWdtbGg9NUNYS0ljMVB1OGJLaFdgUUwxc0BrZCYnTElDN1hhI0o7U19kbjE3aURTMFspOSNgNk50JCwmcjhNPmg6TyFdIV4hXTV1VzBkZFdfdGZuKkk3OSp1VDwtajRENFQ6TEVWQWpmUD8xZF1LcTRwP2BodW1eW08/KV9gNUk7QiRqYyk9J2JlaSVHdUohNWo5PEdnVW1wSEoxWmhCYiRySWxzTlhAQTsjUl4yTThaQGdSUzJaTmJkaS4uRlIuZSpBIlovSzJsTCs2RnM9a1FZZkpxamFMUC9dQ2NcRlxQaGVeSS9FZVBwXW5mZi9HT3FncnI+cGNhK2olPyNiZmBuTm9AKWxnLy5uQkA6M1VnQDZrN2AsaWUhKTknajwvSTAzYUUwQzhdPVg2ST4+ZE9vSUBJLVlEXGVyWzhlJ2o4bmcjYltCNGFoWmc5SDM3S0k3PEkvPz5XJC9eNUE4WyNpZnBuR0QlOTklcFhGKUxJLDhMb3JsOD1rcG8vUHNYJ1otV1lNay8nN1tLbFFxJS46Qlk0MFZXLUw/OGUzV2ptPWJAX1ttJS5YVFVPMiMsbExBSlpDWS1uOTAlL2BdLW5GUEpXZFRrRy1hVj5cUmlabjhhUHR0XGBHSUBcVXE/c3VePTJkdGZuKTRlclk3bys+JTomMUVJSihBdENRaEIkOENocWEhNmhfbko4YmBETjhsOTUtRzZHK0tjQiI5KGIqajdxOWNLU2RYSzw3Q088QD9GTCJKQG1eNm89OVdAb0c+NHQta3JNRyNGQmNkT2hkZEFbIy41JjprbzE1JEs4dGZnTTwhIiVKZ1o5XUNjOGtSYnBGXzctZEIqRWhyS11TRyE4ZiE1R0piTiw4JjRSJmxeJUQmcEglMC4vYFtETUhCbThbJGE7VzFlaThicWFRUUEwNjNzYzJrSC8xLmdiIkgqRVMvSzg9dSFxM15FU1hzYztjSTtTX0tDOkdBZEVcSXVtUippN2kidSRNXTg0Zj5cbUtyJChxN2oiJWtNcGA5OHUtMnNgZCo3Y2dGTC1WZVtiVDA7KyYtbV1McCRIKylmOGI0YHBeY0JBTC1IVj5EclY6M2dITSUsOVtCUVxQNlE1Ni0+PyJeYGAvbFoqOS9FRDducE1CLipaZzxjUmE7aWIrIilWW28rWUpQNDc7KlY0Ri0hZGRQRidXdTROLFovamRaNHNrWilyTT9rXzpQUTtCWmhDNW4jMU85L1JHak5iPCYwSF04O05EM2M+cS1LZHVpUDdeTTV1ZmhDNCpOPFJBQWJVMW9oVlwhZWJwVFhcOGsjKzppSSFLIUBEJUUqLS9bbU9LcDc5aGVpZVlBKiJtT2lYX0BcQl4yXEFnWTk9MStlO1FMPTU2ZVsqcUJtZEFjU0htUjNab0gvZDkpOjglXEcpR1MuX3RIbzNgNTthKDguZiEjZCIzZTFtN0luSnJyQkIsbTIrY0MqVScrJ0RZdXIkcGslTWI4PmBmKFEvYTtNXjJPLUVlW0BOSTwvKUNOaiw9b1FiKTVpX1NlbSxxS3UxXWxHdTpWckJ1NFIyZVlDPGZIOTg9cWcoYyliYV1bPzxhYVkqKjNkYzJJamt1VmhMIjttJl44a14jM01JLzEvWnBDOSxgPGNJRkQ7V1M3RVo/cCFXKEVXcGBKRyZTSlVZUUBJUydsNEAuc2Y6ZWFZXjpjdF1iUjdVSSJBaUNpYmFOPVYrWT01Qkk0WjoyXWRyJSFqPjEiclNEVyNiV0AkRzU1TkliLDIqUGhsPmBqckRDJzpwLV4+OHJYQTRDKV1kcktrODlgXVRUKWBNZmg/XiMqVmguKz5NPl08Z1lLcVpfOjtnLitqXmo0MnR1ImonO287Nl8zQFo3JSpYIWs9a1JJS1siUEgyRElDaEBcMWA7JjZcR1A/Zy1AUSs1ZV49QSRMaSROUz1WQnUpb2xhKzxQOGhzYUVLSl8qdEQ+ZiFPZVAxXmt0PkJoZ1suMl9cVG4/WldpOGJdQyppN0k+K25AUlY1VmBxYE9GTT5CJVJOaUJXZUxoVj1NREtpYSFbOSY8IyM2dS8zJF9TQztXJyozOV0kLldRPSFEbylBUWFbO2NXIVluVW5TK01iLE81UUY+OGBhXGRILWc9R2pUNU1BJzMqXTNDJ203JE8xYCorT0MwNWUvbz5GUyEmSE9bU0w6akgsUz03W0M/LTUzI0ApPFZtUllBcyldTV5PQC8tYFZFNyQuXyZiMiFPQ2o3aTtTPTJGJ2gsaC0pWDpsMWM2UiV0X2FbLnMhXyFDMF0xX1ZuL1g3RG5PbWwtSnJuKXJyQFxkJkFDOitiWlxWUG5FVEs5SV9YQmJDK1hIIU0hXGVaWXVPL0pAbidVInBMPT5Rbm90Mk0mVDMlV0liNFFQbkdgS0REWjErJUJKdDBhY2ZcVj4+PXRxLzg1bWBWUlJCc1A9TjFtXE9xMUtBNS9PJi42aUo3YywkQjs2Yi4zTCc/ckxGRWphdC1FXFdoQmZrMXN0Tik+YjRmPSJPclRJcjdJTnBzWzglaGdsYGA0ckN1XzxvNmBhTm9AKWxnLy8wIltqa1hEXHRoZ1lFU3RbbywvKkdFSmtNWGlrMVVRbmFUSk9PaiE6VCpWa1VvRyNFZEJMay4mV1dBREZGcFFXZE80Nl1rVSdDQDVjLlBhaCljLWdWSCdJaSpEYF8wWXMmXT5KaV1BJ18zVV9dQUBSKDREJG8rXjoqMTM2ajNLMyc4KmRnO2gjLjBfJSpAaGhKXzdMVixLa0haKl0jaXAobCglI0c1WGktYFU5Z2AnN1I+Nj40WGk3R1k+Pzt1LzIjcCdoWk9vJjouMyZuV2gwKTk2M1NzbScqNkBHJGpJIj9xOEJWTENdIiZQX0wtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1pZyEhLWlnISEtaWchIS1paVshVTVua0M1UXFqITVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1UXFqITVRcWohNVFxaiE1VGckWn4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnRjInOiBjbGFzcyBQREZUeXBlMUZvbnQgDQorNCAwIG9iag0KKyUgRm9udCBIZWx2ZXRpY2EtQm9sZA0KKzw8IC9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQNCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0YyDQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzUgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAobWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgNTUNCisgNjI2LjEyNQ0KKyAxNDUuMTM1DQorIDYzNy4zNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Ny4yNjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU2NC45Mzc1DQorIDExNy41Mjc1DQorIDU3Ni4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NTYuNTc2Mw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA1NTMuNjg3NQ0KKyAxMTQuMTgyNQ0KKyA1NjQuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDU1DQorIDYxMy4zODg3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU0Mi40Mzc1DQorIDEwNy45MzUNCisgNTUzLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MzAuMTENCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTI5LjE4NzUNCisgMTkwLjA0NQ0KKyA1NDAuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyA0MjAuOTg1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDUxNy45Mzc1DQorIDE3Mi4xMg0KKyA1MjkuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzNDQuNjc3NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgNTA0LjY4NzUNCisgMTYxLjY4NzUNCisgNTE1LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNTUNCisgMjkxLjkyNzUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ5My40Mzc1DQorIDE3OC4zNjc1DQorIDUwNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTExIDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Mi44NjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDQ4Mi4xODc1DQorIDE4NC42MjI1DQorIDQ5My40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMSAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NzguODY1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0NjguOTM3NQ0KKyAyMjEuNzI1DQorIDQ4MC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMSAwIFINCisgL1hZWg0KKyA1NQ0KKyAyNDYuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0NTcuNjg3NQ0KKyAxOTUuNDYNCisgNDY4LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTExIDAgUg0KKyAvWFlaDQorIDU1DQorIDE2MC4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTE1DQorIDQ0Ni40Mzc1DQorIDIwNi43MTc1DQorIDQ1Ny42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMyAwIFINCisgL1hZWg0KKyA1NQ0KKyA3MjIuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDExNQ0KKyA0MzUuMTg3NQ0KKyAyMDAuNDcNCisgNDQ2LjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTEzIDAgUg0KKyAvWFlaDQorIDU1DQorIDY1Ny4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDQyMS45Mzc1DQorIDE4MC4wMzI1DQorIDQzMy4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExMyAwIFINCisgL1hZWg0KKyA1NQ0KKyAzMDYuOTIyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA0MTAuNjg3NQ0KKyAxNjAuMDIyNQ0KKyA0MjEuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjE2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMTMgMCBSDQorIC9YWVoNCisgNTUNCisgMjE5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzk3LjQzNzUNCisgMTk3LjUzDQorIDQwOC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MTQuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAzODYuMTg3NQ0KKyAxOTMuMzYNCisgMzk3LjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzIyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTE3IDAgUg0KKyAvWFlaDQorIDU1DQorIDQ4NS43OTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDM3Mi45Mzc1DQorIDE5NC4yMDc1DQorIDM4NC4xODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDExNyAwIFINCisgL1hZWg0KKyA1NQ0KKyAyOTcuNDIyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAzNjEuNjg3NQ0KKyAxNTcuNTMyNQ0KKyAzNzIuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgNTQ4LjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzUwLjQzNzUNCisgMTk2LjI4NQ0KKyAzNjEuNjg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgNDUwLjQyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMzM5LjE4NzUNCisgMTkxLjcwMjUNCisgMzUwLjQzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyMic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzI2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTI1IDAgUg0KKyAvWFlaDQorIDU1DQorIDM4NS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMTAwDQorIDMyNS45Mzc1DQorIDE0Ny45NA0KKyAzMzcuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjIzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgMjY2Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzE0LjY4NzUNCisgMTYxLjY5NQ0KKyAzMjUuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjI0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMjUgMCBSDQorIC9YWVoNCisgNTUNCisgMTU5LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMzAzLjQzNzUNCisgMTQ0LjYxDQorIDMxNC42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisyOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzMyAwIFINCisgL1hZWg0KKyA1NQ0KKyA2NDUuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAyOTIuMTg3NQ0KKyAxNDMuMzU3NQ0KKyAzMDMuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjI2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzMgMCBSDQorIC9YWVoNCisgNTUNCisgNTkyLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMDANCisgMjgwLjkzNzUNCisgMTc0LjE5NzUNCisgMjkyLjE4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyNyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzMxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTMzIDAgUg0KKyAvWFlaDQorIDU1DQorIDQxOC4xMzg4DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDI2Ny42ODc1DQorIDE4OS42MjUNCisgMjc4LjkzNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIyOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzMyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTMzIDAgUg0KKyAvWFlaDQorIDU1DQorIDIwMC4yMDEzDQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDI1Ni40Mzc1DQorIDE5Ny4xMzI1DQorIDI2Ny42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMjknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEzNCAwIFINCisgL1hZWg0KKyA1NQ0KKyA3NDcuMjYzNw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAyNDUuMTg3NQ0KKyAxNTkuNjAyNQ0KKyAyNTYuNDM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzQgMCBSDQorIC9YWVoNCisgNTUNCisgNjc1LjIzNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyAyMzEuOTM3NQ0KKyAxNDcuNTI3NQ0KKyAyNDMuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzUgMCBSDQorIC9YWVoNCisgNTUNCisgNjk4Ljc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMjIwLjY4NzUNCisgMTU1LjAzNQ0KKyAyMzEuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjMyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMzUgMCBSDQorIC9YWVoNCisgNTUNCisgNDgwLjE3MjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMjA5LjQzNzUNCisgMTQ3LjEyMjUNCisgMjIwLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIzMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzM3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQxIDAgUg0KKyAvWFlaDQorIDU1DQorIDc0Ny4yNjM3DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDE5Ni4xODc1DQorIDE3NC4xOTc1DQorIDIwNy40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCiszOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0MSAwIFINCisgL1hZWg0KKyA1NQ0KKyA1NzEuMzI2Mg0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyAxODQuOTM3NQ0KKyAxNTUuODUyNQ0KKyAxOTYuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMzkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDEgMCBSDQorIC9YWVoNCisgNTUNCisgMzIwLjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTcxLjY4NzUNCisgMTI0LjE4DQorIDE4Mi45Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA2MDcuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxNTguNDM3NQ0KKyAyNDQuNjQ1DQorIDE2OS42ODc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA1MTEuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxNDcuMTg3NQ0KKyAxNzEuNjg1DQorIDE1OC40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMzgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0MiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0NiAwIFINCisgL1hZWg0KKyA1NQ0KKyA0NjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDEwMA0KKyAxMzUuOTM3NQ0KKyAyMDUuMDUyNQ0KKyAxNDcuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjM5JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDYgMCBSDQorIC9YWVoNCisgNTUNCisgNDA0Ljc5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTIyLjY4NzUNCisgMTMxLjY5NQ0KKyAxMzMuOTM3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNDQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDYgMCBSDQorIC9YWVoNCisgNTUNCisgMjUzLjkyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgMTExLjQzNzUNCisgMTcxLjcwNzUNCisgMTIyLjY4NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0MSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ2IDAgUg0KKyAvWFlaDQorIDU1DQorIDE2NS4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDEwMC4xODc1DQorIDE2Mi4xMjI1DQorIDExMS40Mzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis0NiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0OCAwIFINCisgL1hZWg0KKyA1NQ0KKyA3MTAuMDQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA4OC45Mzc1DQorIDE2MS4yOQ0KKyAxMDAuMTg3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxJzogY2xhc3MgUERGUGFnZSANCis0NyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDUgMCBSDQorIDYgMCBSDQorIDcgMCBSDQorIDggMCBSDQorIDkgMCBSDQorIDEwIDAgUg0KKyAxMSAwIFINCisgMTIgMCBSDQorIDEzIDAgUg0KKyAxNCAwIFINCisgMTUgMCBSDQorIDE2IDAgUg0KKyAxNyAwIFINCisgMTggMCBSDQorIDE5IDAgUg0KKyAyMCAwIFINCisgMjEgMCBSDQorIDIyIDAgUg0KKyAyMyAwIFINCisgMjQgMCBSDQorIDI1IDAgUg0KKyAyNiAwIFINCisgMjcgMCBSDQorIDI4IDAgUg0KKyAyOSAwIFINCisgMzAgMCBSDQorIDMxIDAgUg0KKyAzMiAwIFINCisgMzMgMCBSDQorIDM0IDAgUg0KKyAzNSAwIFINCisgMzYgMCBSDQorIDM3IDAgUg0KKyAzOCAwIFINCisgMzkgMCBSDQorIDQwIDAgUg0KKyA0MSAwIFINCisgNDIgMCBSDQorIDQzIDAgUg0KKyA0NCAwIFINCisgNDUgMCBSDQorIDQ2IDAgUiBdDQorIC9Db250ZW50cyAyMzcgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0NCisgL1hPYmplY3QgPDwgL0Zvcm1Yb2IuYTMxMTAyOTA4YTU5MmU4Zjk0YzdiNGUwMzJmZmNjMzcgMyAwIFIgPj4gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0Myc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ4IDAgUg0KKyAvWFlaDQorIDU1DQorIDU4My42NzI1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDczMC42Nzc1DQorIDExNS4wMTUNCisgNzQxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0NCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzQ5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTQ4IDAgUg0KKyAvWFlaDQorIDU1DQorIDQxOS41NDc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDcxOS40Mjc1DQorIDE1Mi41Mw0KKyA3MzAuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjQ1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNDggMCBSDQorIC9YWVoNCisgNTUNCisgMzEwLjQyMjUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNzA4LjE3NzUNCisgMTg1Ljg2DQorIDcxOS40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1MSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE0OCAwIFINCisgL1hZWg0KKyA1NQ0KKyAxNjkuMjk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2OTYuOTI3NQ0KKyAxMjYuMjY1DQorIDcwOC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1MiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAzODguNTQ3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2ODUuNjc3NQ0KKyAxNTIuMTENCisgNjk2LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI0OCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzUzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTUyIDAgUg0KKyAvWFlaDQorIDU1DQorIDMyMi42NzI1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDY3NC40Mjc1DQorIDEzNS40Mzc1DQorIDY4NS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNDknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAyNTYuNzk3NQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2NjMuMTc3NQ0KKyAxMTkuNjA1DQorIDY3NC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1MiAwIFINCisgL1hZWg0KKyA1NQ0KKyAyMDIuMTcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2NTEuOTI3NQ0KKyAxMzguNzgyNQ0KKyA2NjMuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjUxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTIgMCBSDQorIC9YWVoNCisgNTUNCisgMTA0LjI5NzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNjQwLjY3NzUNCisgMTczLjc5MjUNCisgNjUxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1Mic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzU3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU0IDAgUg0KKyAvWFlaDQorIDU1DQorIDYxMi4yOTc1DQorIDAgXQ0KKyAvUmVjdCBbIDg1DQorIDYyOS40Mjc1DQorIDE5NS4wNjI1DQorIDY0MC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis1OCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1NCAwIFINCisgL1hZWg0KKyA1NQ0KKyAzNDMuMTcyNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA2MTguMTc3NQ0KKyAxMzUuNDUyNQ0KKyA2MjkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNTkgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTQgMCBSDQorIC9YWVoNCisgNTUNCisgMjIyLjM4ODgNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNjA0LjkyNzUNCisgMTY2LjI3NzUNCisgNjE2LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1NSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzYwIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDYzMi44ODg4DQorIDAgXQ0KKyAvUmVjdCBbIDcwDQorIDU5My42Nzc1DQorIDE3Ny4xMTUNCisgNjA0LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzYxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDUzOC4zNg0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1ODAuNDI3NQ0KKyAxNDQuNjAyNQ0KKyA1OTEuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjU3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNTkgMCBSDQorIC9YWVoNCisgNTUNCisgNDYxLjIzNQ0KKyAwIF0NCisgL1JlY3QgWyA4NQ0KKyA1NjkuMTc3NQ0KKyAxOTAuNDY1DQorIDU4MC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNTgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2MyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE1OSAwIFINCisgL1hZWg0KKyA1NQ0KKyAzODQuMTENCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTU3LjkyNzUNCisgMTgyLjUyMjUNCisgNTY5LjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI1OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzY0IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvWFlaDQorIDU1DQorIDMxOC4yMzUNCisgMCBdDQorIC9SZWN0IFsgODUNCisgNTQ2LjY3NzUNCisgMjE2LjczDQorIDU1Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCis2NSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDE2MiAwIFINCisgL1hZWg0KKyA1NQ0KKyA1OTEuMTM4Nw0KKyAwIF0NCisgL1JlY3QgWyA3MA0KKyA1MzMuNDI3NQ0KKyAxNjEuMjgyNQ0KKyA1NDQuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYxJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjIgMCBSDQorIC9YWVoNCisgNTUNCisgNDUyLjk1MTMNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTIyLjE3NzUNCisgMTQ4LjM3NQ0KKyA1MzMuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjIgMCBSDQorIC9YWVoNCisgNTUNCisgMjI2LjAxMzgNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNTEwLjkyNzUNCisgMTE5LjYwNQ0KKyA1MjIuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjYzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxNjMgMCBSDQorIC9YWVoNCisgNTUNCisgNzQ3LjI2MzcNCisgMCBdDQorIC9SZWN0IFsgNzANCisgNDk5LjY3NzUNCisgMjAwLjA2NQ0KKyA1MTAuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UyJzogY2xhc3MgUERGUGFnZSANCis2OSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDQ4IDAgUg0KKyA0OSAwIFINCisgNTAgMCBSDQorIDUxIDAgUg0KKyA1MiAwIFINCisgNTMgMCBSDQorIDU0IDAgUg0KKyA1NSAwIFINCisgNTYgMCBSDQorIDU3IDAgUg0KKyA1OCAwIFINCisgNTkgMCBSDQorIDYwIDAgUg0KKyA2MSAwIFINCisgNjIgMCBSDQorIDYzIDAgUg0KKyA2NCAwIFINCisgNjUgMCBSDQorIDY2IDAgUg0KKyA2NyAwIFINCisgNjggMCBSIF0NCisgL0NvbnRlbnRzIDIzOCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjY0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MTcuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDEyNS44Njc1DQorIDY2My44NjUNCisgMTcwLjA1DQorIDY3NS4xMTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2NSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzcxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgNDA0LjExNQ0KKyAwIF0NCisgL1JlY3QgWyAzMjYuMzY1DQorIDU2NS44NjUNCisgMzcwLjU0NzUNCisgNTc3LjExNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjY2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorNzIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzOTAuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDMwOS42OTI1DQorIDUyMi42MTUNCisgMzUzLjg3NQ0KKyA1MzMuODY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjcnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzczIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIxMTkudHh0KSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4OS42MjUNCisgNDA1LjE3NzUNCisgMjk3LjE2NzUNCisgNDE2LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI2OCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5L2luZGV4Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjA1LjQ1DQorIDM5MS45Mjc1DQorIDM2OS42Nzc1DQorIDQwMy4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNjknOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzc1IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9zb3VyY2UuYW5kcm9pZC5jb20vKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Ny45NjUNCisgMzc4LjY3NzUNCisgMjU0LjY3MjUNCisgMzg5LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3MCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzYgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvcGFja2FnZXMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxODQuMjMyNQ0KKyAzNjUuNDI3NQ0KKyAzNjMuNDgyNQ0KKyAzNzYuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcxJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis3NyAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL01hbmlmZXN0LnBlcm1pc3Npb24uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzIuOTUyNQ0KKyAzNTIuMTc3NQ0KKyA0MTMuODgyNQ0KKyAzNjMuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjcyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis3OCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0J1aWxkLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTU3Ljk2DQorIDMzOC45Mjc1DQorIDM1OC44ODUNCisgMzUwLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3Myc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorNzkgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3NvdXJjZS5hbmRyb2lkLmNvbS9jb21wYXRpYmlsaXR5LzIuMi92ZXJzaW9ucy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4Ni43MTUNCisgMzI1LjY3NzUNCisgMzczLjQ1DQorIDMzNi45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSNzQnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzgwIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvd2Via2l0L1dlYlZpZXcuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxNzEuNw0KKyAzMTIuNDI3NQ0KKyA0MDAuOTYNCisgMzIzLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3NSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODEgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL3d3dy53aGF0d2cub3JnL3NwZWNzL3dlYi1hcHBzL2N1cnJlbnQtd29yay9tdWx0aXBhZ2UvKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDk1LjAwNQ0KKyAyOTkuMTc3NQ0KKyAzMDcuMTU3NQ0KKyAzMTAuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc2JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4MiAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL3dpZGdldF9kZXNpZ24uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTQuNTI3NQ0KKyAyNzIuNjc3NQ0KKyAzNzQuMjMNCisgMjgzLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3Nyc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODMgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvdWkvbm90aWZpZXJzL25vdGlmaWNhdGlvbnMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTQuOTQNCisgMjU5LjQyNzUNCisgMzQ2LjI5MjUNCisgMjcwLjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI3OCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorODQgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hbmRyb2lkL3JlZmVyZW5jZS9hdmFpbGFibGUtcmVzb3VyY2VzLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTQ4LjcwNQ0KKyAyNDYuMTc3NQ0KKyAzNjguOA0KKyAyNTcuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjc5JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4NSAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL3ByYWN0aWNlcy91aV9ndWlkZWxpbmVzL2ljb25fZGVzaWduLmh0bWwjc3RhdHVzYmFyc3RydWN0dXJlKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2Mi44ODc1DQorIDIzMi45Mjc1DQorIDQ3Ny4xOTc1DQorIDI0NC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODAnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg2IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL1NlYXJjaE1hbmFnZXIuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMjkuNTM1DQorIDIxOS42Nzc1DQorIDM3MS43MzI1DQorIDIzMC45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODEnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg3IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvd2lkZ2V0L1RvYXN0Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgOTYuNjAyNQ0KKyAyMDYuNDI3NQ0KKyAzMTMuMzY3NQ0KKyAyMTcuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjgyJzogY2xhc3MgUERGRGljdGlvbmFyeSANCis4OCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Jlc291cmNlcy9hcnRpY2xlcy9saXZlLXdhbGxwYXBlcnMuaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMjcuNDQyNQ0KKyAxOTMuMTc3NQ0KKyAzNTEuMjY1DQorIDIwNC40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzg5IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9hcHBzLWZvci1hbmRyb2lkKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDEyOS45NTUNCisgMTc5LjkyNzUNCisgMjY5LjE5MjUNCisgMTkxLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4NCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTAgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9kZXZlbG9waW5nL3Rvb2xzL2luZGV4Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjQ1Ljg0NQ0KKyAxNjYuNjc3NQ0KKyA0NTMuODY1DQorIDE3Ny45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODUnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzkxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL2Z1bmRhbWVudGFscy5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE2NC4xMzI1DQorIDE1My40Mjc1DQorIDM2NC42NDUNCisgMTY0LjY3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4Nic6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTIgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvbWFuaWZlc3QvbWFuaWZlc3QtaW50cm8uaHRtbCkgPj4NCisgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL1JlY3QgWyAxMTcuODU3NQ0KKyAxNDAuMTc3NQ0KKyAzNDkuMjAyNQ0KKyAxNTEuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjg3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCis5MyAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2RldmVsb3BpbmcvdG9vbHMvbW9ua2V5Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTM4LjcwNzUNCisgMTI2LjkyNzUNCisgMzU1LjA2DQorIDEzOC4xNzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSODgnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk0IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9wbS9QYWNrYWdlTWFuYWdlci5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE3OS45NjUNCisgMTEzLjY3NzUNCisgNDUyLjE3NzUNCisgMTI0LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI4OSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTUgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS9wcmFjdGljZXMvc2NyZWVuc19zdXBwb3J0Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTY3Ljg4MjUNCisgMTAwLjQyNzUNCisgMzg5LjIzDQorIDExMS42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTAnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk2IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvY29udGVudC9yZXMvQ29uZmlndXJhdGlvbi5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDE4NC45ODI1DQorIDg3LjE3NzUNCisgNDQzLjAyDQorIDk4LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMyc6IGNsYXNzIFBERlBhZ2UgDQorOTcgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyA3MCAwIFINCisgNzEgMCBSDQorIDcyIDAgUg0KKyA3MyAwIFINCisgNzQgMCBSDQorIDc1IDAgUg0KKyA3NiAwIFINCisgNzcgMCBSDQorIDc4IDAgUg0KKyA3OSAwIFINCisgODAgMCBSDQorIDgxIDAgUg0KKyA4MiAwIFINCisgODMgMCBSDQorIDg0IDAgUg0KKyA4NSAwIFINCisgODYgMCBSDQorIDg3IDAgUg0KKyA4OCAwIFINCisgODkgMCBSDQorIDkwIDAgUg0KKyA5MSAwIFINCisgOTIgMCBSDQorIDkzIDAgUg0KKyA5NCAwIFINCisgOTUgMCBSDQorIDk2IDAgUiBdDQorIC9Db250ZW50cyAyMzkgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5MSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorOTggMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAoaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC91dGlsL0Rpc3BsYXlNZXRyaWNzLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTYxLjYxMjUNCisgNzMwLjY3NzUNCisgMzk2LjI4DQorIDc0MS45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTInOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzk5IDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvQ2FtZXJhLmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTYxLjIwNzUNCisgNzE3LjQyNzUNCisgMzk1LjQ3DQorIDcyOC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSOTMnOiBjbGFzcyBQREZEaWN0aW9uYXJ5IA0KKzEwMCAwIG9iag0KKzw8IC9BIDw8IC9TIC9VUkkNCisgL1R5cGUgL0FjdGlvbg0KKyAvVVJJIChodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2hhcmR3YXJlL1NlbnNvckV2ZW50Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTU3LjA1MjUNCisgNzA0LjE3NzUNCisgNDA3LjU4MjUNCisgNzE1LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5NCc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTAxIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vZ3VpZGUvdG9waWNzL3NlY3VyaXR5L3NlY3VyaXR5Lmh0bWwpID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMjIwLjM5NzUNCisgNjkwLjkyNzUNCisgNDI5LjY0NzUNCisgNzAyLjE3NzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5NSc6IGNsYXNzIFBERkRpY3Rpb25hcnkgDQorMTAyIDAgb2JqDQorPDwgL0EgPDwgL1MgL1VSSQ0KKyAvVHlwZSAvQWN0aW9uDQorIC9VUkkgKGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYmx1ZXRvb3RoL3BhY2thZ2Utc3VtbWFyeS5odG1sKSA+Pg0KKyAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvUmVjdCBbIDExOS45NTc1DQorIDY3Ny42Nzc1DQorIDM4OC44MjUNCisgNjg4LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5Nic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM3Ny42MTUNCisgMCBdDQorIC9SZWN0IFsgNDYwLjYxNQ0KKyA0NjIuMzY1DQorIDUwNC43OTc1DQorIDQ3My42MTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5Nyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwNCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM2NC4zNjUNCisgMCBdDQorIC9SZWN0IFsgNDcwLjk5NQ0KKyAzMTEuNzQNCisgNTE1LjE3NzUNCisgMzIyLjk5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnRjMnOiBjbGFzcyBQREZUeXBlMUZvbnQgDQorMTA1IDAgb2JqDQorJSBGb250IENvdXJpZXINCis8PCAvQmFzZUZvbnQgL0NvdXJpZXINCisgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcNCisgL05hbWUgL0YzDQorIC9TdWJ0eXBlIC9UeXBlMQ0KKyAvVHlwZSAvRm9udCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjk4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTA2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzUxLjExNQ0KKyAwIF0NCisgL1JlY3QgWyAzMzYuMjcyNQ0KKyAyNTguOTkNCisgMzgwLjQ1NQ0KKyAyNzAuMjQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdGNCc6IGNsYXNzIFBERlR5cGUxRm9udCANCisxMDcgMCBvYmoNCislIEZvbnQgVGltZXMtUm9tYW4NCis8PCAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuDQorIC9FbmNvZGluZyAvV2luQW5zaUVuY29kaW5nDQorIC9OYW1lIC9GNA0KKyAvU3VidHlwZSAvVHlwZTENCisgL1R5cGUgL0ZvbnQgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVI5OSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEwOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDMzNy44NjUNCisgMCBdDQorIC9SZWN0IFsgMzUwLjE5DQorIDE4Mi45OQ0KKyAzOTQuMzcyNQ0KKyAxOTQuMjQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlNCc6IGNsYXNzIFBERlBhZ2UgDQorMTA5IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgOTggMCBSDQorIDk5IDAgUg0KKyAxMDAgMCBSDQorIDEwMSAwIFINCisgMTAyIDAgUg0KKyAxMDMgMCBSDQorIDEwNCAwIFINCisgMTA2IDAgUg0KKyAxMDggMCBSIF0NCisgL0NvbnRlbnRzIDI0MCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2U1JzogY2xhc3MgUERGUGFnZSANCisxMTAgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNDEgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdQYWdlNic6IGNsYXNzIFBERlBhZ2UgDQorMTExIDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQ29udGVudHMgMjQyIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTAwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTEyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjYuMjUNCisgMzI0LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNjENCisgMjYxLjY3NzUNCisgNDI1Ljc5MjUNCisgMjcyLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlNyc6IGNsYXNzIFBERlBhZ2UgDQorMTEzIDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTEyIDAgUiBdDQorIC9Db250ZW50cyAyNDMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMDEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMTQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzMTEuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ0Ny4yNjUNCisgNjQ1LjY3NzUNCisgNDkxLjQ0NzUNCisgNjU2LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMDInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyAzMTEuMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDE2MC40NTc1DQorIDUwNi40Mjc1DQorIDIwNC42NA0KKyA1MTcuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwMyc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzExNiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY2LjI1DQorIDM5MC44NjUNCisgMCBdDQorIC9SZWN0IFsgMTI1LjQ0NzUNCisgNDI5LjMwMjUNCisgMTY5LjYzDQorIDQ0MC41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTgnOiBjbGFzcyBQREZQYWdlIA0KKzExNyAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDExNCAwIFINCisgMTE1IDAgUg0KKyAxMTYgMCBSIF0NCisgL0NvbnRlbnRzIDI0NCAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzExOCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyOTguMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDUwMC4xNDc1DQorIDUwMy4wNTI1DQorIDU0OC41DQorIDUxNC4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA1JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTE5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI4NC44NjUNCisgMCBdDQorIC9SZWN0IFsgNTE1LjE0NzUNCisgMzUyLjQyNzUNCisgNTUzLjA3NQ0KKyAzNjMuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwNic6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyODQuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDU1DQorIDM0MS4xNzc1DQorIDYzLjM0DQorIDM1Mi40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTA3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTIxIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDI3MS42MTUNCisgMCBdDQorIC9SZWN0IFsgMzEzLjA0NQ0KKyAyMzMuOTI3NQ0KKyAzNjEuMzk3NQ0KKyAyNDUuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMiAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNTguMzY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ0OC4wNg0KKyAyMDEuOTI3NQ0KKyA0OTYuNDEyNQ0KKyAyMTMuMTc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEwOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyMyAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAyNDUuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDEyNC42MTUNCisgMTkwLjY3NzUNCisgMTcyLjk2NzUNCisgMjAxLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMjQgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjMxLjg2NQ0KKyAwIF0NCisgL1JlY3QgWyAxMzIuNTM1DQorIDEyNi42Nzc1DQorIDE4MC44ODc1DQorIDEzNy45Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTknOiBjbGFzcyBQREZQYWdlIA0KKzEyNSAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDExOCAwIFINCisgMTE5IDAgUg0KKyAxMjAgMCBSDQorIDEyMSAwIFINCisgMTIyIDAgUg0KKyAxMjMgMCBSDQorIDEyNCAwIFIgXQ0KKyAvQ29udGVudHMgMjQ1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTExJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTI2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDIxOC42MTUNCisgMCBdDQorIC9SZWN0IFsgMjE3LjkwNzUNCisgNjEyLjE3NzUNCisgMjY2LjI2DQorIDYyMy40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTEyJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTI3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDIwNS4zNjUNCisgMCBdDQorIC9SZWN0IFsgNzMuNzU3NQ0KKyA1NDguMTc3NQ0KKyAxMjIuMTENCisgNTU5LjQyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTMnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMjggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTkyLjExNQ0KKyAwIF0NCisgL1JlY3QgWyAxODguMjk3NQ0KKyAzMTkuNDkNCisgMjM2LjY1DQorIDMzMC43NCBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjExNCc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEyOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxNzguODY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ5OS41OTI1DQorIDE0OC44MDI1DQorIDU0Ny45NDUNCisgMTYwLjA1MjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTY1LjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAyNTcuOTg3NQ0KKyAxMjguMDUyNQ0KKyAzMDYuMzQNCisgMTM5LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTUyLjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzNzMuMDM3NQ0KKyAxMjguMDUyNQ0KKyA0MjEuMzkNCisgMTM5LjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTcnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzIgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMjk4LjExNQ0KKyAwIF0NCisgL1JlY3QgWyA0OTMuNTAyNQ0KKyAxMjguMDUyNQ0KKyA1NDEuODU1DQorIDEzOS4zMDI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTEwJzogY2xhc3MgUERGUGFnZSANCisxMzMgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxMjYgMCBSDQorIDEyNyAwIFINCisgMTI4IDAgUg0KKyAxMjkgMCBSDQorIDEzMCAwIFINCisgMTMxIDAgUg0KKyAxMzIgMCBSIF0NCisgL0NvbnRlbnRzIDI0NiAwIFINCisgL01lZGlhQm94IFsgMA0KKyAwDQorIDYxMg0KKyA3OTIgXQ0KKyAvUGFyZW50IDIzNiAwIFINCisgL1Jlc291cmNlcyA8PCAvRm9udCAxIDAgUg0KKyAvUHJvY1NldCBbIC9QREYNCisgL1RleHQNCisgL0ltYWdlQg0KKyAvSW1hZ2VDDQorIC9JbWFnZUkgXSA+Pg0KKyAvUm90YXRlIDANCisgL1RyYW5zIDw8ICA+Pg0KKyAvVHlwZSAvUGFnZSA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxMSc6IGNsYXNzIFBERlBhZ2UgDQorMTM0IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQ29udGVudHMgMjQ3IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTEyJzogY2xhc3MgUERGUGFnZSANCisxMzUgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNDggMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTgnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzYgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTc4Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMDcuMQ0KKyA2NjMuODY1DQorIDI1NS40NTI1DQorIDY3NS4xMTUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMTknOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxMzcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTc4Ljg2NQ0KKyAwIF0NCisgL1JlY3QgWyAyMzkuNjI3NQ0KKyA2MjguMTE1DQorIDI4Ny45OA0KKyA2MzkuMzY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTIwJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTM4IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDEzOS4xMTUNCisgMCBdDQorIC9SZWN0IFsgOTguMzQyNQ0KKyA1OTIuMzY1DQorIDE0Ni42OTUNCisgNjAzLjYxNSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyMSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzEzOSAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyAxMjUuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDM5Mi43OTI1DQorIDMyOS42Nzc1DQorIDQ0MS4xNDUNCisgMzQwLjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMjInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNDAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgMTEyLjYxNQ0KKyAwIF0NCisgL1JlY3QgWyAzMzIuNjEyNQ0KKyAyNjMuODAyNQ0KKyAzODAuOTY1DQorIDI3NS4wNTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTEzJzogY2xhc3MgUERGUGFnZSANCisxNDEgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxMzYgMCBSDQorIDEzNyAwIFINCisgMTM4IDAgUg0KKyAxMzkgMCBSDQorIDE0MCAwIFIgXQ0KKyAvQ29udGVudHMgMjQ5IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTIzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQyIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAyNzMuNTM1DQorIDcxOS40Mjc1DQorIDMyMS44ODc1DQorIDczMC42Nzc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI0JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQzIDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3NDIuODY1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2MC43NQ0KKyA0NzguMTc3NQ0KKyA1MDkuMTAyNQ0KKyA0ODkuNDI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyNSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE0NCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDk3IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA5OS4zNjUNCisgMCBdDQorIC9SZWN0IFsgMjU5LjQyDQorIDI2My4zMDI1DQorIDMwNy43NzI1DQorIDI3NC41NTI1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI2JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ1IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzODEuNzkNCisgMTc0LjY3NzUNCisgNDMwLjE0MjUNCisgMTg1LjkyNzUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTQnOiBjbGFzcyBQREZQYWdlIA0KKzE0NiAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE0MiAwIFINCisgMTQzIDAgUg0KKyAxNDQgMCBSDQorIDE0NSAwIFIgXQ0KKyAvQ29udGVudHMgMjUwIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI3JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ3IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgOTcgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDk5LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyAzMDQuNzg3NQ0KKyA2MTcuNTUyNQ0KKyAzNTMuMTQNCisgNjI4LjgwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdQYWdlMTUnOiBjbGFzcyBQREZQYWdlIA0KKzE0OCAwIG9iag0KKyUgUGFnZSBkaWN0aW9uYXJ5DQorPDwgL0Fubm90cyBbIDE0NyAwIFIgXQ0KKyAvQ29udGVudHMgMjUxIDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTI4JzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTQ5IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MjkuNjE1DQorIDAgXQ0KKyAvUmVjdCBbIDQyNS41Ng0KKyA1NzQuNDI3NQ0KKyA0NzMuOTEyNQ0KKyA1ODUuNjc3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ0Fubm90Lk5VTUJFUjEyOSc6IGNsYXNzIExpbmtBbm5vdGF0aW9uIA0KKzE1MCAwIG9iag0KKzw8IC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9Db250ZW50cyAoKQ0KKyAvRGVzdCBbIDEwOSAwIFINCisgL1hZWg0KKyA2OS45MjUNCisgNzE2LjM2NQ0KKyAwIF0NCisgL1JlY3QgWyA0MzMuMDY3NQ0KKyAzMzIuMDUyNQ0KKyA0ODEuNDINCisgMzQzLjMwMjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzAnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTEgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcxNi4zNjUNCisgMCBdDQorIC9SZWN0IFsgMzk3LjYzNzUNCisgMjY2LjE3NzUNCisgNDQ1Ljk5DQorIDI3Ny40Mjc1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE2JzogY2xhc3MgUERGUGFnZSANCisxNTIgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNDkgMCBSDQorIDE1MCAwIFINCisgMTUxIDAgUiBdDQorIC9Db250ZW50cyAyNTIgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzEnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTMgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDY4OS44NjUNCisgMCBdDQorIC9SZWN0IFsgMTgwLjg5NQ0KKyAyODYuNjc3NQ0KKyAyMjkuMjQ3NQ0KKyAyOTcuOTI3NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxNyc6IGNsYXNzIFBERlBhZ2UgDQorMTU0IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTUzIDAgUiBdDQorIC9Db250ZW50cyAyNTMgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzInOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTUgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgMTY0LjIyMjUNCisgNTcwLjI0DQorIDIxMi41NzUNCisgNTgxLjQ5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTMzJzogY2xhc3MgTGlua0Fubm90YXRpb24gDQorMTU2IDAgb2JqDQorPDwgL0JvcmRlciBbIDANCisgMA0KKyAwIF0NCisgL0NvbnRlbnRzICgpDQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvWFlaDQorIDY5LjkyNQ0KKyA3MDMuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDQ2NS41ODc1DQorIDQ5My4xMTUNCisgNTEzLjk0DQorIDUwNC4zNjUgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzQnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTcgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgMzQ1LjU1DQorIDM5My40OQ0KKyAzOTMuOTAyNQ0KKyA0MDQuNzQgXQ0KKyAvU3VidHlwZSAvTGluaw0KKyAvVHlwZSAvQW5ub3QgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzUnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNTggMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyAxMDkgMCBSDQorIC9YWVoNCisgNjkuOTI1DQorIDcwMy4xMTUNCisgMCBdDQorIC9SZWN0IFsgNTcuMDg1DQorIDMyNy42MTUNCisgMTA1LjQzNzUNCisgMzM4Ljg2NSBdDQorIC9TdWJ0eXBlIC9MaW5rDQorIC9UeXBlIC9Bbm5vdCA+Pg0KK2VuZG9iag0KKyUgJ1BhZ2UxOCc6IGNsYXNzIFBERlBhZ2UgDQorMTU5IDAgb2JqDQorJSBQYWdlIGRpY3Rpb25hcnkNCis8PCAvQW5ub3RzIFsgMTU1IDAgUg0KKyAxNTYgMCBSDQorIDE1NyAwIFINCisgMTU4IDAgUiBdDQorIC9Db250ZW50cyAyNTQgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdBbm5vdC5OVU1CRVIxMzYnOiBjbGFzcyBMaW5rQW5ub3RhdGlvbiANCisxNjAgMCBvYmoNCis8PCAvQm9yZGVyIFsgMA0KKyAwDQorIDAgXQ0KKyAvQ29udGVudHMgKCkNCisgL0Rlc3QgWyA5NyAwIFINCisgL1hZWg0KKyA2Ni4yNQ0KKyA0MDQuMTE1DQorIDAgXQ0KKyAvUmVjdCBbIDMyMy40MQ0KKyA1MzkuNzQNCisgMzY3LjU5MjUNCisgNTUwLjk5IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnQW5ub3QuTlVNQkVSMTM3JzogY2xhc3MgUERGRGljdGlvbmFyeSANCisxNjEgMCBvYmoNCis8PCAvQSA8PCAvUyAvVVJJDQorIC9UeXBlIC9BY3Rpb24NCisgL1VSSSAobWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20pID4+DQorIC9Cb3JkZXIgWyAwDQorIDANCisgMCBdDQorIC9SZWN0IFsgMTkzLjgzMjUNCisgMTc0LjYxNQ0KKyAyODMuOTY3NQ0KKyAxODUuODY1IF0NCisgL1N1YnR5cGUgL0xpbmsNCisgL1R5cGUgL0Fubm90ID4+DQorZW5kb2JqDQorJSAnUGFnZTE5JzogY2xhc3MgUERGUGFnZSANCisxNjIgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Bbm5vdHMgWyAxNjAgMCBSDQorIDE2MSAwIFIgXQ0KKyAvQ29udGVudHMgMjU1IDAgUg0KKyAvTWVkaWFCb3ggWyAwDQorIDANCisgNjEyDQorIDc5MiBdDQorIC9QYXJlbnQgMjM2IDAgUg0KKyAvUmVzb3VyY2VzIDw8IC9Gb250IDEgMCBSDQorIC9Qcm9jU2V0IFsgL1BERg0KKyAvVGV4dA0KKyAvSW1hZ2VCDQorIC9JbWFnZUMNCisgL0ltYWdlSSBdID4+DQorIC9Sb3RhdGUgMA0KKyAvVHJhbnMgPDwgID4+DQorIC9UeXBlIC9QYWdlID4+DQorZW5kb2JqDQorJSAnUGFnZTIwJzogY2xhc3MgUERGUGFnZSANCisxNjMgMCBvYmoNCislIFBhZ2UgZGljdGlvbmFyeQ0KKzw8IC9Db250ZW50cyAyNTYgMCBSDQorIC9NZWRpYUJveCBbIDANCisgMA0KKyA2MTINCisgNzkyIF0NCisgL1BhcmVudCAyMzYgMCBSDQorIC9SZXNvdXJjZXMgPDwgL0ZvbnQgMSAwIFINCisgL1Byb2NTZXQgWyAvUERGDQorIC9UZXh0DQorIC9JbWFnZUINCisgL0ltYWdlQw0KKyAvSW1hZ2VJIF0gPj4NCisgL1JvdGF0ZSAwDQorIC9UcmFucyA8PCAgPj4NCisgL1R5cGUgL1BhZ2UgPj4NCitlbmRvYmoNCislICdSMTY0JzogY2xhc3MgUERGQ2F0YWxvZyANCisxNjQgMCBvYmoNCislIERvY3VtZW50IFJvb3QNCis8PCAvT3V0bGluZXMgMTY2IDAgUg0KKyAvUGFnZU1vZGUgL1VzZU5vbmUNCisgL1BhZ2VzIDIzNiAwIFINCisgL1R5cGUgL0NhdGFsb2cgPj4NCitlbmRvYmoNCislICdSMTY1JzogY2xhc3MgUERGSW5mbyANCisxNjUgMCBvYmoNCis8PCAvQXV0aG9yICgpDQorIC9DcmVhdGlvbkRhdGUgKEQ6MjAxMDA4MDIxNDM0MTArMDgnMDAnKQ0KKyAvS2V5d29yZHMgKCkNCisgL1Byb2R1Y2VyIChwaXNhIEhUTUwgdG8gUERGIDxodHRwOi8vd3d3Lmh0bWx0b3BkZi5vcmc+KQ0KKyAvU3ViamVjdCAoKQ0KKyAvVGl0bGUgKEFuZHJvaWQgMi4yIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbikgPj4NCitlbmRvYmoNCislICdSMTY2JzogY2xhc3MgUERGT3V0bGluZXMgDQorMTY2IDAgb2JqDQorPDwgL0NvdW50IDExDQorIC9GaXJzdCAxNjcgMCBSDQorIC9MYXN0IDE2NyAwIFINCisgL1R5cGUgL091dGxpbmVzID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2NyAwIG9iag0KKzw8IC9Db3VudCAtMTUNCisgL0Rlc3QgWyA0NyAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxNjggMCBSDQorIC9MYXN0IDIzMCAwIFINCisgL1BhcmVudCAxNjYgMCBSDQorIC9UaXRsZSAoQW5kcm9pZCAyLjIgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2OCAwIG9iag0KKzw8IC9EZXN0IFsgNDcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNjkgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvVGl0bGUgKFRhYmxlIG9mIENvbnRlbnRzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE2OSAwIG9iag0KKzw8IC9EZXN0IFsgOTcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzAgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAxNjggMCBSDQorIC9UaXRsZSAoMS4gSW50cm9kdWN0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MCAwIG9iag0KKzw8IC9EZXN0IFsgOTcgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzEgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAxNjkgMCBSDQorIC9UaXRsZSAoMi4gUmVzb3VyY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MSAwIG9iag0KKzw8IC9Db3VudCAtOA0KKyAvRGVzdCBbIDEwOSAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxNzIgMCBSDQorIC9MYXN0IDE4OCAwIFINCisgL05leHQgMTk0IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTcwIDAgUg0KKyAvVGl0bGUgKDMuIFNvZnR3YXJlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3MiAwIG9iag0KKzw8IC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTczIDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1RpdGxlICgzLjEuIE1hbmFnZWQgQVBJIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTczIDAgb2JqDQorPDwgL0NvdW50IC03DQorIC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDE3NCAwIFINCisgL0xhc3QgMTgwIDAgUg0KKyAvTmV4dCAxODEgMCBSDQorIC9QYXJlbnQgMTcxIDAgUg0KKyAvUHJldiAxNzIgMCBSDQorIC9UaXRsZSAoMy4yLiBTb2Z0IEFQSSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3NCAwIG9iag0KKzw8IC9EZXN0IFsgMTA5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTc1IDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1RpdGxlICgzLjIuMS4gUGVybWlzc2lvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS40LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTc1IDAgb2JqDQorPDwgL0Rlc3QgWyAxMDkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzYgMCBSDQorIC9QYXJlbnQgMTczIDAgUg0KKyAvUHJldiAxNzQgMCBSDQorIC9UaXRsZSAoMy4yLjIuIEJ1aWxkIFBhcmFtZXRlcnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS40LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTc2IDAgb2JqDQorPDwgL0Rlc3QgWyAxMTEgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxNzcgMCBSDQorIC9QYXJlbnQgMTczIDAgUg0KKyAvUHJldiAxNzUgMCBSDQorIC9UaXRsZSAoMy4yLjMuIEludGVudCBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3NyAwIG9iag0KKzw8IC9EZXN0IFsgMTExIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTc4IDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1ByZXYgMTc2IDAgUg0KKyAvVGl0bGUgKDMuMi4zLjEuIENvcmUgQXBwbGljYXRpb24gSW50ZW50cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjQuNCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxNzggMCBvYmoNCis8PCAvRGVzdCBbIDExMSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE3OSAwIFINCisgL1BhcmVudCAxNzMgMCBSDQorIC9QcmV2IDE3NyAwIFINCisgL1RpdGxlICgzLjIuMy4yLiBJbnRlbnQgT3ZlcnJpZGVzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC41JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE3OSAwIG9iag0KKzw8IC9EZXN0IFsgMTExIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTgwIDAgUg0KKyAvUGFyZW50IDE3MyAwIFINCisgL1ByZXYgMTc4IDAgUg0KKyAvVGl0bGUgKDMuMi4zLjMuIEludGVudCBOYW1lc3BhY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNC42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4MCAwIG9iag0KKzw8IC9EZXN0IFsgMTEzIDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxNzMgMCBSDQorIC9QcmV2IDE3OSAwIFINCisgL1RpdGxlICgzLjIuMy40LiBCcm9hZGNhc3QgSW50ZW50cykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODEgMCBvYmoNCis8PCAvRGVzdCBbIDExMyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE4MiAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE3MyAwIFINCisgL1RpdGxlICgzLjMuIE5hdGl2ZSBBUEkgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODIgMCBvYmoNCis8PCAvQ291bnQgLTINCisgL0Rlc3QgWyAxMTMgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMTgzIDAgUg0KKyAvTGFzdCAxODQgMCBSDQorIC9OZXh0IDE4NSAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE4MSAwIFINCisgL1RpdGxlICgzLjQuIFdlYiBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4MyAwIG9iag0KKzw8IC9EZXN0IFsgMTEzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg0IDAgUg0KKyAvUGFyZW50IDE4MiAwIFINCisgL1RpdGxlICgzLjQuMS4gV2ViVmlldyBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNS4xJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NCAwIG9iag0KKzw8IC9EZXN0IFsgMTE3IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxODIgMCBSDQorIC9QcmV2IDE4MyAwIFINCisgL1RpdGxlICgzLjQuMi4gQnJvd3NlciBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NSAwIG9iag0KKzw8IC9EZXN0IFsgMTE3IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg2IDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTgyIDAgUg0KKyAvVGl0bGUgKDMuNS4gQVBJIEJlaGF2aW9yYWwgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjMuNSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODYgMCBvYmoNCis8PCAvRGVzdCBbIDExNyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE4NyAwIFINCisgL1BhcmVudCAxNzEgMCBSDQorIC9QcmV2IDE4NSAwIFINCisgL1RpdGxlICgzLjYuIEFQSSBOYW1lc3BhY2VzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMy42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE4NyAwIG9iag0KKzw8IC9EZXN0IFsgMTI1IDAgUg0KKyAvRml0IF0NCisgL05leHQgMTg4IDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTg2IDAgUg0KKyAvVGl0bGUgKDMuNy4gVmlydHVhbCBNYWNoaW5lIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4zLjcnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTg4IDAgb2JqDQorPDwgL0NvdW50IC01DQorIC9EZXN0IFsgMTI1IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDE4OSAwIFINCisgL0xhc3QgMTkzIDAgUg0KKyAvUGFyZW50IDE3MSAwIFINCisgL1ByZXYgMTg3IDAgUg0KKyAvVGl0bGUgKDMuOC4gVXNlciBJbnRlcmZhY2UgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjYuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxODkgMCBvYmoNCis8PCAvRGVzdCBbIDEyNSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5MCAwIFINCisgL1BhcmVudCAxODggMCBSDQorIC9UaXRsZSAoMy44LjEuIFdpZGdldHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTkwIDAgb2JqDQorPDwgL0Rlc3QgWyAxMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTEgMCBSDQorIC9QYXJlbnQgMTg4IDAgUg0KKyAvUHJldiAxODkgMCBSDQorIC9UaXRsZSAoMy44LjIuIE5vdGlmaWNhdGlvbnMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS42LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTkxIDAgb2JqDQorPDwgL0Rlc3QgWyAxMjUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTIgMCBSDQorIC9QYXJlbnQgMTg4IDAgUg0KKyAvUHJldiAxOTAgMCBSDQorIC9UaXRsZSAoMy44LjMuIFNlYXJjaCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjYuMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxOTIgMCBvYmoNCis8PCAvRGVzdCBbIDEzMyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5MyAwIFINCisgL1BhcmVudCAxODggMCBSDQorIC9QcmV2IDE5MSAwIFINCisgL1RpdGxlICgzLjguNC4gVG9hc3RzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuNi40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5MyAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAxODggMCBSDQorIC9QcmV2IDE5MiAwIFINCisgL1RpdGxlICgzLjguNS4gTGl2ZSBXYWxscGFwZXJzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NCAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTk1IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTcxIDAgUg0KKyAvVGl0bGUgKDQuIFJlZmVyZW5jZSBTb2Z0d2FyZSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi41JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NSAwIG9iag0KKzw8IC9EZXN0IFsgMTMzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMTk2IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTk0IDAgUg0KKyAvVGl0bGUgKDUuIEFwcGxpY2F0aW9uIFBhY2thZ2luZyBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi42JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzE5NiAwIG9iag0KKzw8IC9Db3VudCAtMw0KKyAvRGVzdCBbIDEzNCAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAxOTcgMCBSDQorIC9MYXN0IDE5OSAwIFINCisgL05leHQgMjAwIDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMTk1IDAgUg0KKyAvVGl0bGUgKDYuIE11bHRpbWVkaWEgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjcuMCc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisxOTcgMCBvYmoNCis8PCAvRGVzdCBbIDEzNCAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDE5OCAwIFINCisgL1BhcmVudCAxOTYgMCBSDQorIC9UaXRsZSAoNi4xLiBNZWRpYSBDb2RlY3MpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTk4IDAgb2JqDQorPDwgL0Rlc3QgWyAxMzUgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAxOTkgMCBSDQorIC9QYXJlbnQgMTk2IDAgUg0KKyAvUHJldiAxOTcgMCBSDQorIC9UaXRsZSAoNi4yLiBBdWRpbyBSZWNvcmRpbmcpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS43LjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMTk5IDAgb2JqDQorPDwgL0Rlc3QgWyAxMzUgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDE5NiAwIFINCisgL1ByZXYgMTk4IDAgUg0KKyAvVGl0bGUgKDYuMy4gQXVkaW8gTGF0ZW5jeSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuNyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDAgMCBvYmoNCis8PCAvRGVzdCBbIDE0MSAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwMSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDE5NiAwIFINCisgL1RpdGxlICg3LiBEZXZlbG9wZXIgVG9vbCBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi44JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwMSAwIG9iag0KKzw8IC9Db3VudCAtMTYNCisgL0Rlc3QgWyAxNDEgMCBSDQorIC9GaXQgXQ0KKyAvRmlyc3QgMjAyIDAgUg0KKyAvTGFzdCAyMjAgMCBSDQorIC9OZXh0IDIyMSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIwMCAwIFINCisgL1RpdGxlICg4LiBIYXJkd2FyZSBDb21wYXRpYmlsaXR5KSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwMiAwIG9iag0KKzw8IC9Db3VudCAtMw0KKyAvRGVzdCBbIDE0MSAwIFINCisgL0ZpdCBdDQorIC9GaXJzdCAyMDMgMCBSDQorIC9MYXN0IDIwNSAwIFINCisgL05leHQgMjA2IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1RpdGxlICg4LjEuIERpc3BsYXkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS45LjAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjAzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMDQgMCBSDQorIC9QYXJlbnQgMjAyIDAgUg0KKyAvVGl0bGUgKDguMS4yLiBOb24tU3RhbmRhcmQgRGlzcGxheSBDb25maWd1cmF0aW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjkuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDQgMCBvYmoNCis8PCAvRGVzdCBbIDE0NiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwNSAwIFINCisgL1BhcmVudCAyMDIgMCBSDQorIC9QcmV2IDIwMyAwIFINCisgL1RpdGxlICg4LjEuMy4gRGlzcGxheSBNZXRyaWNzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOS4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwNSAwIG9iag0KKzw8IC9EZXN0IFsgMTQ2IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyMDIgMCBSDQorIC9QcmV2IDIwNCAwIFINCisgL1RpdGxlICg4LjEuNC4gRGVjbGFyZWQgU2NyZWVuIFN1cHBvcnQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjA2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNDYgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMDcgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMDIgMCBSDQorIC9UaXRsZSAoOC4yLiBLZXlib2FyZCkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMDcgMCBvYmoNCis8PCAvRGVzdCBbIDE0NiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIwOCAwIFINCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIwNiAwIFINCisgL1RpdGxlICg4LjMuIE5vbi10b3VjaCBOYXZpZ2F0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4zJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwOCAwIG9iag0KKzw8IC9EZXN0IFsgMTQ2IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjA5IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjA3IDAgUg0KKyAvVGl0bGUgKDguNC4gU2NyZWVuIE9yaWVudGF0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC40JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIwOSAwIG9iag0KKzw8IC9EZXN0IFsgMTQ4IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjEwIDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjA4IDAgUg0KKyAvVGl0bGUgKDguNS4gVG91Y2hzY3JlZW4gaW5wdXQpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjUnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEwIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTEgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMDkgMCBSDQorIC9UaXRsZSAoOC42LiBVU0IpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjYnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjExIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTIgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTAgMCBSDQorIC9UaXRsZSAoOC43LiBOYXZpZ2F0aW9uIGtleXMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjcnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEyIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTMgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTEgMCBSDQorIC9UaXRsZSAoOC44LiBXaXJlbGVzcyBEYXRhIE5ldHdvcmtpbmcpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjgnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjEzIDAgb2JqDQorPDwgL0Rlc3QgWyAxNDggMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTQgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTIgMCBSDQorIC9UaXRsZSAoOC45LiBDYW1lcmEpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjknOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTUgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTMgMCBSDQorIC9UaXRsZSAoOC4xMC4gQWNjZWxlcm9tZXRlcikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTYgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTQgMCBSDQorIC9UaXRsZSAoOC4xMS4gQ29tcGFzcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTIgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMTcgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTUgMCBSDQorIC9UaXRsZSAoOC4xMi4gR1BTKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuOC4xMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMTcgMCBvYmoNCis8PCAvRGVzdCBbIDE1MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIxOCAwIFINCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIxNiAwIFINCisgL1RpdGxlICg4LjEzLiBUZWxlcGhvbnkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjEzJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIxOCAwIG9iag0KKzw8IC9EZXN0IFsgMTUyIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjE5IDAgUg0KKyAvUGFyZW50IDIwMSAwIFINCisgL1ByZXYgMjE3IDAgUg0KKyAvVGl0bGUgKDguMTQuIE1lbW9yeSBhbmQgU3RvcmFnZSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjguMTQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjE5IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjAgMCBSDQorIC9QYXJlbnQgMjAxIDAgUg0KKyAvUHJldiAyMTggMCBSDQorIC9UaXRsZSAoOC4xNS4gQXBwbGljYXRpb24gU2hhcmVkIFN0b3JhZ2UpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS44LjE1JzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIyMCAwIG9iag0KKzw8IC9EZXN0IFsgMTU0IDAgUg0KKyAvRml0IF0NCisgL1BhcmVudCAyMDEgMCBSDQorIC9QcmV2IDIxOSAwIFINCisgL1RpdGxlICg4LjE2LiBCbHVldG9vdGgpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4yLjknOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjIxIDAgb2JqDQorPDwgL0Rlc3QgWyAxNTQgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjIgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAyMDEgMCBSDQorIC9UaXRsZSAoOS4gUGVyZm9ybWFuY2UgQ29tcGF0aWJpbGl0eSkgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTAnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjIyIDAgb2JqDQorPDwgL0NvdW50IC00DQorIC9EZXN0IFsgMTU5IDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDIyMyAwIFINCisgL0xhc3QgMjI2IDAgUg0KKyAvTmV4dCAyMjcgMCBSDQorIC9QYXJlbnQgMTY3IDAgUg0KKyAvUHJldiAyMjEgMCBSDQorIC9UaXRsZSAoMTAuIFNlY3VyaXR5IE1vZGVsIENvbXBhdGliaWxpdHkpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMC4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIyMyAwIG9iag0KKzw8IC9EZXN0IFsgMTU5IDAgUg0KKyAvRml0IF0NCisgL05leHQgMjI0IDAgUg0KKyAvUGFyZW50IDIyMiAwIFINCisgL1RpdGxlICgxMC4xLiBQZXJtaXNzaW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjEnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjUgMCBSDQorIC9QYXJlbnQgMjIyIDAgUg0KKyAvUHJldiAyMjMgMCBSDQorIC9UaXRsZSAoMTAuMi4gVUlEIGFuZCBQcm9jZXNzIElzb2xhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjInOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMjYgMCBSDQorIC9QYXJlbnQgMjIyIDAgUg0KKyAvUHJldiAyMjQgMCBSDQorIC9UaXRsZSAoMTAuMy4gRmlsZXN5c3RlbSBQZXJtaXNzaW9ucykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjEwLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjI2IDAgb2JqDQorPDwgL0Rlc3QgWyAxNTkgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDIyMiAwIFINCisgL1ByZXYgMjI1IDAgUg0KKyAvVGl0bGUgKDEwLjQuIEFsdGVybmF0ZSBFeGVjdXRpb24gRW52aXJvbm1lbnRzKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjcgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIyOCAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyMiAwIFINCisgL1RpdGxlICgxMS4gQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMic6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjggMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIyOSAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyNyAwIFINCisgL1RpdGxlICgxMi4gVXBkYXRhYmxlIFNvZnR3YXJlKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMi4xMyc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMjkgMCBvYmoNCis8PCAvRGVzdCBbIDE2MiAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzMCAwIFINCisgL1BhcmVudCAxNjcgMCBSDQorIC9QcmV2IDIyOCAwIFINCisgL1RpdGxlICgxMy4gQ29udGFjdCBVcykgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjIuMTQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjMwIDAgb2JqDQorPDwgL0NvdW50IC01DQorIC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL0ZpcnN0IDIzMSAwIFINCisgL0xhc3QgMjM1IDAgUg0KKyAvUGFyZW50IDE2NyAwIFINCisgL1ByZXYgMjI5IDAgUg0KKyAvVGl0bGUgKEFwcGVuZGl4IEEgLSBCbHVldG9vdGggVGVzdCBQcm9jZWR1cmUpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMS4wJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzMSAwIG9iag0KKzw8IC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjMyIDAgUg0KKyAvUGFyZW50IDIzMCAwIFINCisgL1RpdGxlIChTZXR1cCBhbmQgSW5zdGFsbGF0aW9uKSA+Pg0KK2VuZG9iag0KKyUgJ091dGxpbmUuMTEuMSc6IGNsYXNzIE91dGxpbmVFbnRyeU9iamVjdCANCisyMzIgMCBvYmoNCis8PCAvRGVzdCBbIDE2MyAwIFINCisgL0ZpdCBdDQorIC9OZXh0IDIzMyAwIFINCisgL1BhcmVudCAyMzAgMCBSDQorIC9QcmV2IDIzMSAwIFINCisgL1RpdGxlIChUZXN0IEJsdWV0b290aCBDb250cm9sIGJ5IEFwcHMpID4+DQorZW5kb2JqDQorJSAnT3V0bGluZS4xMS4yJzogY2xhc3MgT3V0bGluZUVudHJ5T2JqZWN0IA0KKzIzMyAwIG9iag0KKzw8IC9EZXN0IFsgMTYzIDAgUg0KKyAvRml0IF0NCisgL05leHQgMjM0IDAgUg0KKyAvUGFyZW50IDIzMCAwIFINCisgL1ByZXYgMjMyIDAgUg0KKyAvVGl0bGUgKFRlc3QgUGFpcmluZyBhbmQgQ29tbXVuaWNhdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjMnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjM0IDAgb2JqDQorPDwgL0Rlc3QgWyAxNjMgMCBSDQorIC9GaXQgXQ0KKyAvTmV4dCAyMzUgMCBSDQorIC9QYXJlbnQgMjMwIDAgUg0KKyAvUHJldiAyMzMgMCBSDQorIC9UaXRsZSAoVGVzdCBQYWlyaW5nIGFuZCBDb21tdW5pY2F0aW9uIGluIHRoZSBSZXZlcnNlIERpcmVjdGlvbikgPj4NCitlbmRvYmoNCislICdPdXRsaW5lLjExLjQnOiBjbGFzcyBPdXRsaW5lRW50cnlPYmplY3QgDQorMjM1IDAgb2JqDQorPDwgL0Rlc3QgWyAxNjMgMCBSDQorIC9GaXQgXQ0KKyAvUGFyZW50IDIzMCAwIFINCisgL1ByZXYgMjM0IDAgUg0KKyAvVGl0bGUgKFRlc3QgUmUtTGF1bmNoZXMpID4+DQorZW5kb2JqDQorJSAnUjIzNic6IGNsYXNzIFBERlBhZ2VzIA0KKzIzNiAwIG9iag0KKyUgcGFnZSB0cmVlDQorPDwgL0NvdW50IDIwDQorIC9LaWRzIFsgNDcgMCBSDQorIDY5IDAgUg0KKyA5NyAwIFINCisgMTA5IDAgUg0KKyAxMTAgMCBSDQorIDExMSAwIFINCisgMTEzIDAgUg0KKyAxMTcgMCBSDQorIDEyNSAwIFINCisgMTMzIDAgUg0KKyAxMzQgMCBSDQorIDEzNSAwIFINCisgMTQxIDAgUg0KKyAxNDYgMCBSDQorIDE0OCAwIFINCisgMTUyIDAgUg0KKyAxNTQgMCBSDQorIDE1OSAwIFINCisgMTYyIDAgUg0KKyAxNjMgMCBSIF0NCisgL1R5cGUgL1BhZ2VzID4+DQorZW5kb2JqDQorJSAnUjIzNyc6IGNsYXNzIFBERlN0cmVhbSANCisyMzcgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMTc5NiA+Pg0KK3N0cmVhbQ0KK0dhdG08OWxvJkkmQTxHMXJyTDBJZGllR0hhL3IrbFVtWDkjJzw9XDhddGJtPVVTUzUiVT9wIjpjW3FCbDtSJmUhYzwwLGNPQjtMcG4qU2o1LW1KLk5nXSw1KlRwSVMtaVxhL2hVIkxEX0pIX0tKVEtkJWQtWFlVTWglI2JRMG5yVTUyTTpgPDRmPm85MyRrKE1NPSssNz9yampHLilmPTVkOzRYZmBVRmMtcEZFK0NxQlxgMWs4Kjghcjw6SUY2YUwuU2VOXkxXWUlmUk5MUlVtKyo3SzpfNU9gL3NpXSQ4Pm5hLiItNydiLCtgRz1lKnM0RCtnMzJNO2ksWj9JMjNoLDwsOD9bXm9TQl40Y18sR0duZ0hAW10raWkkVyNxa2NfZSc/IzRkXi03SkRza0FjMDsldEQ0USxkXV5HPGpPS1lKMy9QISNzMWImUFQmam9FNTdwX2ZlMmQ2RlspQjImXWtASGB0XlkjSm82OWtCYzNrWmxHLkQmUXBNJlYoQDdiSyhxaV1pYXRMXTVhSiJTPVw3IlBbR1hqUXREMXFSI29NaU1bRWAxM1hMMiwhQSZTLz01VE5OZ2JlNSUtN05EV1AyRlYqQ0RXNypEc0lKIlpgNkBaSjJNQG5Ya2cqM0VVMS4vXU5gWSw7dE9TbF1CWixHaUdDWiJeS3NhSEEwcyVXLUVxJ09MYTwhND5RPz42QyQuS3FgKCtHRjElMlgpR0NRS21fLDM5IU45YHNiYnJRXD8jbWhraytKTzkkIT5VcFpIamFIZCorV2RQPD1AcEtWRE8hRlNMTD83YnVqR2JLXXRYSCxmQkVgSFhKQlBSI2QvKSM8VG8/UC9jMHE7c1o7TCE7P0BmTD0lQl5bTXI8M3AiMjZhZD9VN11HS1QuZW1KbThZJG5ScUBAZ2dENE0kVCVsbXEzdUQ/TGYucy9JdEZ0PnAoOSRtbzZEKVxqVTF0RGhnQTEqXlxFXTB1UmxgVV1RNDssblY6OCIvXSJbRlFqVzFGWVRPTUFLOks0IzMkZyY+Yy8hMEo/ZC9KMCNIPDBpc00vWUM6PyVjMj1RJEdhTlddNkVhdSpePnEyYjxdJFlFREtYV0I2PjRjcHBfIkIsNiZxVTgmQ2AhIVAkOFcrRV5EYCJuUi5gNj4paixkc1NkWjkvO09sMDNgMDNJayRBaDRKLixOZkBNTmI3UW9QYWZpWUg2NDpDcGc5OlR0SlpmJklRPTptRXRpTlguOycuUGtdTyFIT0BDamRdP01iO0RQcU4hM1M+X2IhTjUiYSM/ISYpQnMsPV9qVVoyQVk+XFlab2VkRFBeciIjYXJWaycmQnNrS2c5IVA+NlFyJS5vXyJFU09Db2hCNTVYamFjbWVIJCFUWSxzZ1Iubm1hJjtcQ0o9cTlKcVgxamlaQmgjKWNwMGNYVFVhJStQUmg+YkswIy9QOnRQSj1mOCdaYSJrS3UzX3VUST09XUFgJjFFLjRYTWY8Qm9cNHFkR3FGOTlabFZyIThUTGljOS5TaEtfVDhkVkVZZkpuK2dtRDdlWldNdDBoanVmNmUoYnBESFNVO0pqLFdGPCteOlRubTglMDs3dVI2XCcuTVZ0VCdxQyg1akFnNVchcUF0KVVoJmIrOU9DJUtxZD5GS2I0Y0YsSzdVJ2BdXWJzNlZQJjs7dFZzPFdxInEoQiJmay9QTjJWcDVxPyRsOUZWLEFUMzgrVlA7Pk9rPmttJUM3OS5sMVhXSGlkVldsKUYpbVNAKU9gSCM6OnNrdCQ8IkJtUE48YjUtJE4zNEZWRS4zZShQUCdVY0YpK1ksazo7ZShHNWt0Wj9mNnRWKDJJRyRXQV5xQilwYjZcI0M6UGU+NiM8UVAlKnBtSnIhbCxYOkUkaTFRR0shYVNpIzBuRGRYNyNyKD9DPTQvJltoMTM3MHEpJ3U6WzU4XEJlMylTWWNcLSxgbEldLHBeNzZnRCVRamE6JUw/WDVLS1JpJkI4NW1fM2w6aFU8bCg0V3AuKC5lV2c6dSFaQT03PCxPK1xJayJOU1V0cCxoJyxjM3BcLjs5bURtQDthMy1lZkRvKmUwN0RVdGpcNzYoSFxPNm01TCcoKmxLTHFEXT9yZEgsbTUiaj0waXI9Wl4lTmleIWxJTzpiKUhFK2hRPGRKZypVMj8xMkskKUFxY1dcOCVhXXNNUjtsQyEoO2ZbU1cuOj9gXGdqNiQyN2hNQzxuOSw/SjdecT8qakY3cFYrOi9sIz1lcF5TK1RsYDpITlFWM0JNbC9rIS5tWmN1cmNHbCM1L2gzJXRLbik7OEFbcFA4QCMyTj9OLDJmTE9eMiUwKjtTYWFPb0pHXjJQJidqQ00jclwkXk8rWyxWU1tHRnVSa1YuQGUhJzdjQmFXXH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjIzOCc6IGNsYXNzIFBERlN0cmVhbSANCisyMzggMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggOTQ2ID4+DQorc3RyZWFtDQorR2F0PSltbl9bbCZILlg9czU/LlpQTk1cKDMpMlpTcGBaR2E/allRTU9JRD5wYCRLRFNycUYlNzFoZGdhVko5KCFRWzpwUnE3VUREOi1aLGNHbS8vT19OLlV1b0g6Z0wkczNNbzAvdU5OI0VTU3BmNXFVVGs6bkNrWlA/IipOcEBPR2dkYi9Vb0FrRiZgUC5GRTsoKlFoITBQWkE+Ly4qZFJIUjdgcWVLZzVgVlUjLD9WJXJibElZYFQ+ZWFPWWgrV1cyXCFHY2Q8WmNnYDliKHEta25QRVlNYiQvPCtfTWU2JjFKZFVNPCdnYD4lQz4ocFA2TmkwRmg1TmxPKmNnY1k0RmZBLTxiVms0JzBhZGVJTDtJOk5JMElHOXJmRCYuKnNNdVo1a3A9JypmYzJzV3BxVG9MSUAsR1Q2WWBPYmQxNGZwWmhlMiIrKSxYOVIpTSozM2hlNzRxMThfLToyS2toI21oTWZDJWs0UT9OUW5Ia1syWT0mUz80VSdjcDFbUmozNkM0IjEwaD49TktESTNPM0I6ZSxhPy1DaD85RFFlPjpsYj1uVUZHWWxUNyJWaWNlO2AoTFJEJSJDUGFsJCdiQkFHWmFvdW1SXDFcZEE8V2xcTS9PWVx1QEYiNWMpOGY/Lz1KV05MZkM3X2guckslYzBmaUAkcmw4KHRGMVw1cyEwOmAoREsqdF1EQWRNVSdLdUUxJVJqZl9cVFspYGxaSC0rRlBNQmYxcVYyRUdLVk5SXU43Ui0/KXQ4RFFETDNYK2RHOyZkXFcoJmsoRUhrWkZPVUpPJTooKzQpMktDI1UrNnI0Tik8XmhsYE8zLlZqZjA6RjElYHQuO2snTDBbJ0svMVoxOnEtN1dAWlBRciJOV2xkJ19wZnRvaHA2dDpkUnU+QjJwVHVxZllUVmBJalpGSGBcIVA5SExlUlpXOUovUkdcZjwlOyRKUCpRTVJGZ05abS1xaCFsJGBbW0wwWl5GUFtuZUgpalJnWDpaaWVyajNmSz5JSSIkVC4hOkI1OmpwW2xIQ1k5R3AqQXAncWB1TzdBSzBAZWBORDs3XUAnPnJuYGduVEZVT1NILVRKOk1HPE5jJV88VjhNKXNCXG45VWt1QDA7KFJScnRWPDMmPjJxMjY/SURHMj0tLig1NVVJOlVIbkRIcUxtKEQ1ZVoqR05QPVtHVUxBcy5iLGxoJUdeO1wkYjxwTVZvOSNgX1k6bU48dVxKZlNNJmJMb2FZLDRFcHNUTkxrY1F+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyMzknOiBjbGFzcyBQREZTdHJlYW0gDQorMjM5IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDMyNDcgPj4NCitzdHJlYW0NCitHYXVITj5CQTwoJnE2YTlzLklMdS89XT5ucWkqT0JRYTlaLS9rYj1YJidIQ29AciNcYFlxOUotKTAxMylCdXFFVzRkajZbOTNfVS9IdGciJllQISVJQ15aWyNhM3QiLSkrJjdSYUVWPkBiPThmQVo8WmFqZmElMDhtLm4hVnFUIT5ncEtWN2AzOlBqb2hLXUs3PWRzSWwwSEpAMWQvKlBvWVxMUUoiWlotOzFzOnRsQENRYT5lVkY4ImU8JFIsO19ISCprOVpTcUs0Yi8zVV03PENeMkZNXGdpWHNKSSZtUiJgI2ZpQDBqUiNUa0UnN2JnTlM4J1ZbMzAuZCEwK0hiSkQ+OWNTNWcmcFVNaSM7VDRnaHIiMW1iNTVKXUAsTmhXUVMjciZDJCcyLUdqcT8mXUlbPEgjSmBNXV9QKCdUOjhfIywwSmsyLCs2RD9KLykzcCQ+TG1KRSJkPVJdNWopXk1hPDMxPkkqcDJhYlF0SFNiQ18jWFs5V2xiLjQ9TjlgJjpmUFZBKUlOR0AqZ3A4biwqJU9rS2UvX1FpSUAublpoQy9aNG5pMjJSYiYzRk01aztLXS9MVyNaPVYuTVlJNlkuIVI/c2xlYSxScVI/UFw7OSotN2ReMjBpZ2BdXzI4c0FZaXAuN0xcXmVhNk4xTklcajg9bEleP0RvUCVrbGguWiQ9SCxdcCY8UnI0IVoqLDVnIVU+bXUpaU89QUJNdWYmcTZxRDlJZ2BodGdlRjlmN0xKPDpIb0hXT1A+c0hgPFVrSWgxSlpwNVw0dS4rRFQzImhMOmxtIlkhVSwzVTVFW2srRDRBT1dWT1FeL0YhV3AkMSQhWmlObTRNYiM7X3A9TSxtIWhESE1uZjxlSCw5JXRncDcmRWY7LDNzaSFaTG9PUGppTG1qa0ckTFJWSlNdK0wnMGhmaEltaHNtTydhNkZ1RmFDJ1U8cjFfOjZdVTBiS19QYnFHQiFwZlJKSytZPU8iQzMlWmtqREdDQG0xbCY5PnVbVF5BQD9hOCY4I1ZPYlBVKExES3NKaj1bW2d0RTk7TlFrIm01NXNfayMzI3NTR3UlZSpPcFZxbWdSKkhFXnJURCNuJ0VfJixyNV9VLS85KjE8TUlBZV5NQD1kVzpSWVFcNU1mIWgoZiRWLzpgakZWVy5jdUYyTCY0TlEnTChaI2IpPSs0LCFoWWsyPSghJnJDb21YVUNHRFU6REFbSlZiYltOOks7WCEiLUNSTWM/LSM+SjZVbmVRPTdYW3MoUEZfTU5JSUUjazUqazhBP1YhLi0mXCRQRCgwK2tgQC8xIyU+Tz8qTGliTlFzZ2hOZFc7NWNrX1NkNDEsWkBPVkpMMSJdTVUjamM9dWdDPTMsNzd0LFZpWkE/S2RCc2E7b1ZwcE9jcmBKdCZhWGleIUc4U1MmKmE5J1xkVyc7JyRWcXRuSVhjaGJLWkVzOFoyazoxMF9NPS0uPlJUbDNbM0khSUY0N2xeTk90MEkiZSkoXStmN3BbJ2xjbG1UZztXJy5PLUI4N0sjKCE3STNPJ2JxbFFsRltdMixNc29EP0UtaCk1YmtqMko6M2o9MjYhN1RTMCFLKF9ANGc4Tio1JEtpNzpiPzY5Rz88RjlcbiU3Tzk3Q1YnP0tWPSNxQ29FUSUtQyFyJEtBK1dPLiNfU0ctI2MxbFUiSmlAQ09ENk9sJVUjWyM7NTg/SDpiKSplPENaOGMiPmVrLmZiakAoR005OWk8O3FUZzReWSgxSjNYTjxPPHA4bW9kcGM1JEhnTklxJylERz9TOD5bU3UhXkU1ZGc9ZD86JF8oRkFfVnEqWWJfZEk3USdnWjtMazdpKXQ4MFRwWG5TRl1aQlZXRlJfN14scVU8OTNTLDojIk5oNCxxMk03TFJgPjA7Yl1rXSZuanFmZUFaVTojbnJmXTY3ZCEqWT5SYSxaMFkmdFJSJmVtPTYxb1Y9TnNoXC5bYkgsaXJFTikoKDFtWi5FcGUiKWdpWyFJaG9ZaVwuLHI6VituLzcvVkNeJW1LbC1pWG4/VTIhNFM/aFZxYig9I29MRDpuNFYqaSFVWVgyQVwiOFFWOiU7K3BIXk1jLGxuPGZSQWQlLkE1cl4+W1RmKFIlZUJwQ1JPXic+cVAtU2FiVHUqS14haUp0I3FVWidoNkRScTZMIWw1ZSZhcFpnVEpOQ3JdKmkvKypbMGlvcFVVLydiYWthW2lBSiVbSSIqNmY+XmsjM1NhISomJCMsQCluJ0lnNSZVZmtvS2gkcWlZQzEwW1shKXIvJlBKbWY5ZkZHXnNJaVJqV1tgVFBtSyFrYVJNTk5yWmlvSF9eS2tuS3RBSGgoO0x1XSRmcTlaKC5kUG0sVDZGXFdqPm8hZisyOnFhIkpkIW8idUEoSEUoRi5CWHJXTlEtQFxIY2opcS0+QSQ9XCkrR11LRmxgOj80KCZCa0pVTS8qcFNAM1owSFpAWChaQikkRmJjWnU2LUdkaUlRMXFxaD0sNzVJWDltI21XOWRpO2hAYWYlakFVPSlecCVVW2ZxbWtPU0IlLlxNdTpHPyU0P2twLXV1Q0owVjYuXidAKyZxN3BuTXFcKFA7LUEzXz03SVhGO1MkVSspUC1ZPVYndEBxWiszOS9yOUw9Q3M5U0JBSlZSSGFMVF0mUXFDZ2M8Kl5TdD4oUzwhXygkdVBOImdgWywmViFaIVNxU2c9JmVQRTtVMnFPWDQhQzBZYDNkSkc/cWFldDwjUDgzczJFdDxbJHRgTURCZio3LidkOyV1LWludUcxcyFeJyhPYXAkL3FwVjdyZ00sTlIpRUBxciVCSS46bjBsJEZfXi1sMk4+YD1ASkpUPjFLPidEInBvNkNDbXInNmgxUFJbNCctLmxnWypyKm4kKz9qJUs1MTFXVSJZJ2NyX10sWT1NTHIsSGFZUz5bRk9YSCIxQzNtXWxtLG1lQWlgJWFBXlYsXWJXWyVqVTRFZUsxLGxRNC88PCRWPjlpJUpsIUpaQFpFXSxEZkpRVmIjZHJbX1QoLTQhNipDbT0wNWQ4TThOdEJxaWlpOyNbaUhrI0tIZ0A2ZjZqLmNJZ2o0JjhrcWctSylWPEE/S2xERl8mJlxnWTpzQTRibTZVOVVlJSFkLnRZKkAtVCRJRkcrREwrUyhoMlllcXVKaD9rUmJALW9jYzl0aVIlQ2A8JThgWSZrLFFfQUtuXlpdNjhxLHJEXSpFRWQvITpdIjxnNEgzMj9lQjUzR09NRV5eKUBSPDgwNEhdZG9uSV8hRV1lLW5WJyNOTUkjKmdFIURPTGYmYldRXmZeLVdbWldeZTR1PWM4RDcoUzBtM1VBRnRhQEUsTUhFOiJwZlJNams+ZjZVW2RTbDFhVWMjaGM5ZmwrWExVJlh1R2VsN0hqNSpUOGsnXmckWWxtOkk6KygtUkJKOjxAazI2KmxmMjtrdT5jOlw1YSNEbG9HI1UiTSltKSFibzlEVWw4QjpsWjRJdGIjP0pfLiY7Z1VAVW5uXEFScTYuQVhfUzxmc1MmJnA6JFUrJjNDLDU0LShfIWBlY1ozcCRfLF1GTGpFPFovW2pLX0kwXCkxPkZxcjJLbW4/JCdDOWNzODNqYUAoLWh1SkldNzZsNF1wW2FfNFMuNXRYdFgnRm4kRkdJOz5VU05vYSg6O2Ioai1PZ1wnR3MqbyorXiVUPEk2ay5UcUNCT15kMjhBOSRSSj0mJEQrbkZwYy9oKmhqYzVSJS84KEtBRSdpbkRGVCcsbi0iWy1GOElfIUVoO3VLWi1oLz5NQGJycFUhazY/XUw1PlNNNkFSbmFuND5rb2FFXj5mXm8rKTBZWj1NVTtVTC9uJjUpPD1HM2c0KENoJk5hNyZlXz9SQUpkOjVVIXQ6YGdXQVBuXVJkMztmbUdZQGghO0dzWEBYa3BhTDJcNVFyT0hhb0Y6RCZkYC5TNV5nOXMzKWklWUteaGI6ISJpdEEoREszJiREO3IuL2E5QENoanFRTCldcWJGY0hANSdyXyxVZEpMNjBnIzJaOF4haVVla2cqWCVEcEJQMFJDN0dEKFhUKlRQW2olbDA7KjArazY4NCsia1lsb3JWc14ub2lxJUgxalZaS2xKVm1CXnIxbC9VVzZFT2NtcV5iL3UtTEg6XEZWNlBNNl9zTTI/SHFkR0EpTnM2VjY4WUI5TDlIXWx1XDs9SUplUj8pWiwqN0UjUT5aLG4nRzFhNzYoVV1CRFUpcjY7PzomRzVyJWQ4K1tpT0ZATFI5ZDZWTDxWc1tiMGs5YTA5VVI+Rm1NI1o3OFpIaEkoTzZKUlA8ZHBeaklQbzRTKC5rYCg7QH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI0MCc6IGNsYXNzIFBERlN0cmVhbSANCisyNDAgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjkzNSA+Pg0KK3N0cmVhbQ0KK0dhdWBVPWBgPVcmcTNWVnJXP25BZiE/WWddSUQqMDEzVSszNDNoQUdtQ1s5L0pLYzZGMUYvWG9VY2VZTmdDPFdQQUtDQ1REc1UoMSo4UVZCWUo0cz8vb2ZnaWVVT0ojK24oYi5wOyYmWDghW3JNInVJSUc/Y15kZ21ALyVqZjU2aC8hViY4akxUa0RGbVpPUihObVpNTD5xW0lJRHI2KEVbbzQhaUduY0VRNiFUYm4xcnIxSDBiJSFWVU9WPlZcSG1YMGI8Tyk9bW9vVSxxWSs0a2lPPTVGQFA5XU5jIV84OmJtVW5TO2gmb0tfTWJBJCUqYyk8QkxJQEdhNGlPIUVMaG5UMyQtSGlTOmIpTm5IMWM7XUducjZjK2tVYk1VIWNGN14wcldiTnQxT090cjVRQj0rZ2Q6K3MwM2svbVFaWCFDS2s6SUxbZGpRInJnPEdkNVNicWNfO1xfJlovZ1djXUdBczA5YUE3YG5xYzAsUiljQSFQLVZDTS1wLzVzYTUiIVFCViVpalZwX0BxdDtPNj1JIW4yTjdcXktZcUBNOVBCI2FscSZCXy48LGxkJ1ZlRTdibEoxJmhXNlpyaTx0SzRzRFUjRmklU0BLSDpUY2YkSSZZayhdLW44PE88JzFMO0NDLEFOXkRtKTovWWpCcTpWPVptdWxvMmdnb2lkPlI6T1NYbERjR1RhQ0spIkc7bz9LPVpncCIvT11YZktLPzFPRSpKaCtmL1dDWjRIYStgaWZqcidYZ0BMSC1uO2lVOzdfX10uRF08PjReSS01PUFVND1sNUBBJiI/SVpHSXBUQF4uV1U9dF1RVDBHTHVGJm9FSSk8QmJLYVhzIV5cZ1MzZTEzJVMha0poLyVjWjhMLU8rWzNvVjJzQ0QlRjApb2hAbS5AZVY1TFdRcl1ySS44cEI1SzRJW0gqUXEhbix0azlZZWsqYSVtWEsiJCRKXC8qPDpRbldERChySGRBXzAsbzoybSE9a0A0ZzYsRm0tQ11XYWQnaTEkYDwna05ial1dX0xfJDA8R0w2O200cihYVDVeO3JdRyhVLVE5VSNdXVRkLEhsWkAtJCxKaVdrc18sIVV1cCRWT01fYSc/O2dDTDIkNSdsNj8uX3RiVFdUVnBxZlwvQUFpWF5paT4iLExuSihkSjo/LWdnRDNXc0lvYkpKLW1fJyY4YyVlT0RlWl9xXjhMbkJPMXI9TG9zU1xNSTg0NEJIJkRgPUNJM2sxJEpGJypUVXA/SzUiaiZqKXM4QDdhaF5SZnU+TGtYQklcMk5hOF0rbixBUWJUWlVIN2xzKmRQV1RsWlZgPXBialo+YzhHXnIhcF5fI0k6NyxXWWRSLjsvSipjWlVjTGBPOlhWclU9Sy8kKXE3bS9vZmFVTSZgOF5oPWlLSic+JCZCbjc8ZGRnQGhiTCguJTkuJlEkJSxVSDhYTDtdbDdyR1xgZWQ+Z1BuLFwvMlZTVjlbMCFAMFxscSpCUW5JYUYiL1dtX0RLUGZDaGNaMyZZakZnIThxaTlpNVVHQUstMltiRGQwVkVwJkMuOVUsIzVddElBL2JpLVIyQDNQSy5QYzxscComM04uKFBUaTkyY2QiJy9cYTA2IlwkTC4/YmthMSg7KW0hLSQ1LCQoMDpSKk1xQUZhaio7PS8oYC8sISw9STdOWEguLz9FdFQsJlJLOXBldG5UVGZEaVFmQz83XSIzXSJUKjlyPDw9SlYlaj8xPjEtS24uRlQlciI3azFfQj47bisraTdAblkzakM2dT9UVmZGM28wO0tDUzxARTpqM20xJHFyWE0mOF9ESEgmOyQkQ3NjLnMpPVJiZCExbmtmNHU/TXVLbXJRViJwT0luaihcZyJGdCEkMlkrISpLPFFpbV5OcldMKFpLXFVVdWQybFJnZXAlOFYkbisySGNOV2BlUTphQ14zPk9CRFVyN0RbL09kSy1NJ2k3QT9tIT5zNF9DSnNeZzEsZy1lUihGKUAzOUdnMCEwTUQsKUJFIVpIZWRNXm06Ml1BRz5lVypqIyNPb29qSUhnK1ciKzVDIV1tJi8tZyM5OiUwLSkpUWNTYT5BSEZQTjw/U1dyK0UzQXFVME5lJywjQ2MtRS1xYlQzWyFhNDsiXjU0QmtYKzlHO0tpYS5JZmQmbEotanFkdG5PRXNUJ3BPcWhsTVMpVW9tZEJ1QGk1ai01WUBiKkN1I0NKYGpOS0wrPC9zYD8kTUNmKkFKIy1zYzI2RGJpWkJWUFQqLmNZdTA2LFQ1ayFUUzVoWDE6ZFRcPk9jVEA+dSVZYi9hRklMciwvcEE6KG1sbGleWlsiaD90QycyQWxxUEw2W151KD9JQjYjOiZLY1o+TWlzPmhtSHIwP2I5Z29Bbm1FPjciLG1fYUc9UT9aVDZicG4iXjlYNi5Yc1AwOFtmJllEb0VePGo0QVI0UiJwZE5SWlVlbEk5IktiMDRmLCpdMi5ZP0hWcT1YQyItUSdMaUJYU1tuVkpVL21SJDhIVU0ycVJubkYjJlZZUFBiMTc3JzxkRVpHdS8vVSkzXyxBJSVIby0tQ2pKKSppZDo1NVdaT2IoNDZZcDFDNWYnb04kOlw3XzYyIUxaXGo4JnA2YjZCUSJSX0pZZG8+cVtUbChpU0ElSjJGMXQ9QTciQVtNJVhjU2VQQ1ArWWdgdWBBISgvbExyOTdYXCJVU11tQDUzbSxTRTQ8QWhWaSJJS1RMYjJAVTEtLm8zazJXL2xvSEVUJE0/QEIlbyk8aEEnaS5AUSlYRyJaIyFjWzgwS2FTTzJtXytxZkcjbmlndSNkOD8pPkBjU1AsUEpdPElSOVpFUC1WIm1GKkgjcDJATDJoLSwoW1dgNihJSV8sJUlKZjktKkxYRFE1VlhjMStxbSUibmBrJlltNl5PZ29LNmNxciJzU1xpNFcmVy0ySVFUTXApJGRRQ0NsJ183dUhqOjFRUkFTLGxhS2QpZTBgTyRXYyxEalpfVlIkUGE9N2hHaUg5bFcmPScscVo1X11UUlItUWRcXS1PU2JqSjVcKD1rUShGMjl1dDpaSERdaCJqTWEkV2JmSSRyI1dnclkzOVkiQF1HPDIjXHFqaF1tWStPTylMJSxERCxmJTBrWWxbXDpOMjVbI1dZR1IhZjVvPW4xNjJjaGQoNWg8WCpaPXFqNCExLlAsIms+RWZNUVdkWlFOQjw0PEw5RyYlRkJiMzhgYF0tPCM7OWM8TShiN01BPjZoR0lDXTFLbFIyUGpsQmVQcTJjbCgyVEMza0hgXWUvKnEwVDdkZDpiZ3RtWm9xWVRYVFZkXzlrbi5FN1xiUWcmXWdqPTJxWT1odGQ1WFxgQ1ZdWFhiVSxCPlNocmJHZTJGSUhPUzgsaCJiaFpFUyZgZXNsYzlsYm5CJU1hPTVHPFhcJUMjVz1dczU9c2pnXy9yMHA9PVxqW1Yrc09ycHVEQVUtMHQpRCdUQW4hRm10SWg5SVJTLDE4J0xCJjlMY0Q7QCZjTyNTNWFVRTEnR2peJVp1WlNeM3N0SSdESSJUSVpDcy9tLzpVUExmb1o0TU90YSgyQl8kJnQsQi5Kayxmc0lmJzlmJ11HW09tL010bUxdNSEpYl8kc0s6M0ZqOTo9K0M+ZmlEaVgoIz1JUiY2Q2xJPS5eJiJxPV5KX0FuR3RCTWhlTXBGdDw2ZWY/VWZDXiFJXnImSm0+XUhbR0hERnQ3RWhyTE8raDQ+KSEhOFpnNi1jP2FGRi1PXmUtbTFOJyU0Iz5bQFNeYTVoVCs+WlZISylHKD5oQDcwcEg2Z1QwQVpCak9dKjxmNGxXOjJrJHIkZTE+YUlxQCpoWE1DU0VuJzQ2SVUyWj9ROW0+Jl1idUU6bEpTPWdSUzlVU2cqcm8lXSlVRDpZKmBoaVA8Y3JXYWd0Wjwufj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQxJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAzMTg1ID4+DQorc3RyZWFtDQorR2IhU25sVkg5VihCN14/czIsLHUlcl9dNCspc1hCN1NEclc8TTE7WlB1XjVfMUEzIWBlZkxfMVJsJ2xDaF9TYmg0RlokOkU4KGJzMy0wUTMzVGxvWChfKko2WG11Ri4rLyptLzFxTTgiVlBEWltCayhfNTxaZl86cCVIWDNyX0gyR2pyIT9vMSxYV1wwV3EqKi9LN1djV2hKWihnOnIlPDtEay5dV2dsallbLjk/Vi42bis1OV1LKSxSN2Bgb0xEdD5PU3RPV2tCXz87SHI9QW5yQ1xJNmZmcEhoSjNNNVJ0PS5QMytDLkhsY1VvRSxlPyNoNiQyNCttZkZmJmpLb1hzTiEtYFVKP1IvUGdGTF9CdXFVQkZQQShWPzk2ciZKLUAwQ0VfQ2BVM1Fhcis6RGldKTo0P1oiMC88UmBtSSxDK0A1RkpDUW1gPUlfaUoxJjxrWU00UTdPYGxSIUAnR0wrYDVnXj5sIz0jYVc3XXNNdFlgREEvNlB1UWNMMDBSMjJCNSYtZlFQbExTT01aOE9pN2I1Q0pNOnQwRWFULkUvKSw5NDZCZTc4VzQ2RWNqOU5IYTxiTD1xXEQxIlovbylLKll0TCQ2ME1POEpsWipCVlk4aG5eMGRTZ10rb1kxLildYVFgPTtxZEVucD0rMUtCN3NWb1o/Oz5gZVZoXEsyRURVJlxXXStRKlgsSmhCb0JmWFxIUFolOWkqZCdSc05HUTg2U0cpNj1uI2MlQExbQzdHMDhhSlouODNmPElpbT5cWEchTWNVbjAhVChmZys9NDBGMzc0UihZcCMyXG9xQTBZbnBSJ1tnKlpcNCNJL0dfJUZAK1RYUnQyME0+LkgmO1okTGM3cVg7YCs+TUxyQTFlXVNoOkMmMnUobE5QcUYvQ2hELCJeUGBTWDdObjdnTFo+LylMRC1Ma0llKlwjYS1uYy9vcFU4UEdJYkApPGVdOENoWFRGcEF1YmcibDxTPUIlTlFKUmMiL1IxLkQzJlRCP3I+Z2s/MSlbOXApLU5cMVdLMj5zUEM0OD1kXnI4QWwnPTpgJVA5WG5nITslJD81MkVMN1c5PT5OKF9Lc1k8dFVZIVdZblQ0dU1vW2hDWmpsUG02LzBDPmBYNzgxX0lcSj9dcDYjX1gvM2hEIV1PQk5GXlUpIz8nSUonNyZiaiZFKiFQRGZrTkEmcGAwTFktJl9STEptL1pPal5rbHBaR21pXlZBMlRWVSlINzI1Z3RobDRfLUUhQ29rWixlSDEodGdCXShuYTk7JkxDWm9Ab1MtJzU7PDU/SjcybGpKU2JCOmJxNlkzKDNkaFRsR1dKaF9WZ0lGbk0vajIzS1ptO0NwRkIwRGFCQydTbmwwWSclMEVUSHRgNjcuIiI8NTkpVkNzOyV1bnE9NVg1NmtuYTBiPF4iVj0hIjItInJ1QiRdMmI3ZTxvTlkzXGI2TVMiU0FrZ0NObztWcmNvXWVTX0VzbD0zUFhFKFNgKFFFXysyQ3BdKUY8KDFBKnFHNWhvZG1oMiUyXlt0RShqaCRjZ0ltX3U4QFEkYyNpNU4ocFxFaUxaP05jazViUi1ZOSlCNl1qJTZOZDQ+NT43LDJmLHVvOlhXP25GM2FZTmluQWNUXTpNYio6cV9PaUZFKFBUOWFcJlRBUWk4JW5aKFhUKSQramlUKCVdWlhfZzNyYypDNFRAK09USj04OSRfUjk3KztbUWY5SV5qa2VpUG5FTmlBbDVvJCZ1XSZYSiJtXVs7NnFHcidPQHAsQ1VKS21IalMkWTM7WVZvKTNZazEoODVJXyUlcSlJWi00XCNoLyMoJFUycEBYXGMsckUsYiJIRzsoNz5SQ1U5MEBZXlJfNWYxZ1A9VTI2IWJEdT8oQlgoIy1QW0JlVy8nWnVeZ0cjcT1iUTxqLGE1QDlBKnFRP3NlMSQibDctL0lmSSVHb0ZjSy0+Vy1lWnFdKWY5JCY5V1NmcjooYEomKG9ObFMtNFp1WSIpKDBOJylvZVtQc0RkI0xVbVt1QlghKGdZIWNVKTVRI1xLaHBFOmBiRXBmO19JOWloYmBwNGplTWNKVTVVMHVMZmRXN05fJzIuRVJrLk9sQUdxczROJzkrLVREY25dWmwhcyVkKVNpQDpVdC1NcS1LazwyXGBPOD09NFZbMic1ME9fK0dtbEU5aVpcbStaQk01R2xKJkctJW9dSVJWY0hrM2oiST5ALDdMQTRuOlxkIS0jLlxicztQcSV1alJBQCU6WklSLDh0U1g6WF45QSo8SW0qW0ssTT1xY1E1X0YzdE5wanFLLU1qY0skMGRtVUY2ITIoWztnODMyJzZ1blgzSi8vP2doc0xEQVhzbFpsUDAqL25pNDI4P2FIbWh0WGpdJCgpSnJUI0lFQlFuVFw7MD1mMyxCPkdALFpQbjsvJk0zMCMmKl5YNUUyYj5YPFFQJD5dV0d1NzZLN1YiWF8mJldSKlVyKGtzZmV0aVlxaCU9VVBOJSJabzJ0RitlMF1LMCJebig/YShdN3AuciwsVkBdRztRYEhFP2xOJFpLZUQsYUotIVNbaFwmJl5HZ0ZVOGI/IWkwZF0ybEVCPCsoPXJFVXM5b0YrQEM9bGknS2xDMW07bjlzVl1pZ24nRlwyX1FeUSdZOjtbQG9gQSsnXCF0R29fXDxOJDlxM2RbTTM/Z2luWDlAYCM5SlldSXF0RGInQE5VaixBb1FRJk1iX3U5bXFmTlRuYiZeaD5VT0VacSxMPWwkUC5qSzowOi8wJkFJR25LYURNREhfXXRCPi06UDQ6OExhaClWVkczIStVZFp1UC86STRyLz4kUFdTJW4wLyMvKilzP2lMXFIvaGkkTjZPLkpqP0UvZy5YdGlTKChBRlw3OVw+am0/KDgiWWlnJWRwbCxKUDpGOUZ1XzZlaGtxJCVyJk5dNztrRz8qX0csW05XWk1RI2NTaTQxLC8qb1tBYDJDdFZGJmAtT21yZjVubDpDbk4iSFRRKEJDJ0Yqcj1ULV4wcGhwN1hBJmg6Tj9lOicqTiRKK1ArSUsuQTNnTFtUY1VXJDRrXGJ0TCowYkNFRyRAS1FjWVZCZ2VIcFEqOGZLNGVIcDk0JjA/OlZjOjM8J0VnUz9UMUcuZldoKEApOnJVLHM1P3ByKFA9U28kWjtccE1BVmFhLjEicShNT2RkTz4vKDk1LUFQWSFhYG9RIXBITGYhPk5QImFKXT8iXlZzcFg6Jy5kXj1bSXQrTkByaC5lNnJlck9UOEFmRmsuN29BOD9MRVk+XG0wI2FJZmNgMkZFaSFTUUBJcGJIJF0tTzNUc2o9ci1YWkIoIXI8JFUoMSU7M2NgPD0qZyEnVVskIWVlK0hKTCZFNXEnJUlibTJBPzdMXkhxQCNadCw0I1coSVVVLlxYZiQ3VmYjZG0nTU1QODpbXm4zYm8nclBvNEB1OjhidS4mTHJXUE0sPmRcbjg0UUJMV1gvSStwIlxWNyNYX2RuWmdLMUMqWW1DQDRXJWEuXFkuViFgT0JhM2hrKiZZXl88dVUwOyRVTVcwLlhaOVhhKionSS83cT07VmZKNFkkU0ROLmhoQXJjI1wuVVBiZyJ0ZS5oTFkkQV1IP2woaUJeaV0tajI1aCZuUGNgcE4iNmBPXFh0a2tUJ0Vac0BhTGQlQSwoIUQ/LituMC5hYj9oVkVuYVo3bGFlKzpLODtQOj5TODMuNnU9RyZJS01wMDpBN2tmNGNjMWg1SD0sMS4kUGVVK0psOSwkRik3VVlwIyNBXyYxTSlzRTZGXjo8WTk4bEAwUSxzTDopIUtfYy9mM0YyJ1JxO2o+Wms/X0daXDByJF0kXWglJUQ9a1cjXGBrRCZdJztuaWQsVTcsRTRhVWgiLiVQMWhuUjNWLSwkNSlLZS5nTj5ccj9qVkJNPUFiWVtOQjVbNEg4bjVjRkEzbD90KGhCTTBaLC9SZ1JbI3NaTlNqQ0koaEJNMFlzZipOVkBwUicwQyVZQUdUck1pSUFwJnE/dWwpLS1ZLGU9MkQ0JEQyX20rNVkwZU1BZ1NCWzdaPmdhaGQ/RmFWZEF1Zjs4U1kvOTExUU1kJTxUPUMobiQtXyFxNGMyL1FdW1c5KF8yVD8+Q3UiL1Ilcl9AYW9FdVstJCJdRjtxbzEmYDpXPVJEJGAqIyd0YGQ8I0NqPE9zRUJXMixaZE0pUk0yXz4iJzc3LGFjYENocklMYWE9YE4vMlRfbFhFWG9kMm8rMVFGRTZBfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQyJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyMjc5ID4+DQorc3RyZWFtDQorR2IhO2U9YDwlUyY6UTpacyJOcmNBZF8qSmFfMDxUMmErViVWSi11JignWDdxOT0ycjUsI3NmM2xpJEs8NlFObFMzU1A8KFAsPlwrQSVvSzVyNU9MSnI6L1YjMEVIRFlLS24+Z2khMXFVS0FaQ1YwUk9EN0xKT09pRjIqL1ldW01UWG45UStGWmhFMTA7bm1fQnAhLWBpZCIyI0EtYi0wYEQ6SjFSaCRzaSxuOWtnU2o4LSxtY2cvckRCQzg4Y2kyJDYzJSk5W0tSRzdcKHF1J1FFcHA7SkQwNTFBTkJuQzI5PiRnLXA0RXI1KlFQTTJRT3RuT1crcjU/QUxSZFpzRzVLIVQ9MnMmPGYtRzoqSConLGIqNjpaJCZPQyQ9LjAoM2gkPFQ4JkkpWz0xYjQnWHEpUUc/SkdtIjIoOUpqVWImazpbJTNMQFAwMV91ZDNBaXBvKktgVChZMl5JQjBlNyspSENdNW4hUk87dFRjIXRAKjI7SDhKSClXZFFSY1JfQTtKLkEjYXQtZnNJNkdOTkAmZyROMytvVjY8RypOOis7LEJGKCtjcURcVVsuKFhPLi9aIUA6O3Nfa2wwXVsrNDs8WTRFKiNYXyZkOl5hLC1vKSdGU01STGtePENUX0MuXG4hL0xUYm4uP2B1bmUrMidzW3NRRWM2W0QnaStmK2VyOz9wbmNdczVjRCVaMidLQ1dSZ0lrXE47a2plXjAzTU1kIzsmYFMlPDdJX1c/MVZdajVbci8zVFlKVUFDU2dyVkU4VlBNLzdxSSh0RUomKChQMVFWV1VrUzBfX0NZQE5IRk8raF0sUFpdYi5sX3VUVk02QXBhJzI0LS1AUGZXKUIxJiF1L0VYTU0rb1dpNjdcOkNrQTtEUVIuPFhCdSxWcFd0MWhJKzY3VUJJOi4tXFB1Xj8vQkY6Mi9YLG4tLV00LV9cI0RqLWsqPj9uTnU7NXM/WGMjbVRaJy1iMVkoWG5eMWVwWF5rbjpHcDE3aW51SHMlSU9ja08kc2wlL204XVdbXiY3PFdcK3QzVE03TG9uOmgjLzQhU2xXKUFvNkdNUWg7WiZcJiUvUS5CJHU9TFN0ayY6QiJKREZHUEs4QDomXS01aSM0ZEtna2FWRyhMSj1ML2JJSWsmPD4nWjtDWzNQXCVybVM+cjUuMl4mU05uJ1g0ZjonS0s0KFQ7WjFaX2pYIl9ISlZLczxhQyl1bVE3VS8kSjNcY15IIixWJmw/I3VIPWJtdSpBS15YbU9JT1xpWWlRMFk/RlxtQkF0JFEkJlREc08wOCM9ZipuVixoWlRGYV1lU2szdGtLb3FLT11vcytAYV0qbCRlJG9RODVuNTlMQTRVWzktPlZHVTVkJl0uUkc1cUoiQDI/Nz9JQSI6IVosWihwS1NkMyZjdSpmdUpia1xPPUFkWWE0MTxvLGB1OmRtQGw3YGMyLm50P2YjUU9WWlJnRjBALEo6YUw9NjdNZWI2Wz1iMl5IdXAlMWJVSDE7ZXFQQCdYW2hPVVRtVkRtdVRccDJAcUklMDhOPG0mTiNtZGMhM0lbKDEzMV1gcDMuc0xfWWk+a1dCWE5ScSw8U0Q9QUxxRCQ+ZiopOShvKGxcNV1EOS5TY0hqZHMxaTZLPEEoWkhMcTQhU2E/Tlh0SC1Ea2JfbmVQTztPIzJpJGRgJj1QZCFrOi87MTllKVRnJFdlcTY7OS1DTWthI0VXKVcvZWBlLGhjc0ViSDdcO110WWJNOjFMKmJeRD0kY14sNy5QdXBbLzc/NiYySzNOTHI1MGNUZV1SOldtKThmJ2ohdClGRGYsX2RwXUxJNVckbypLSVxzOj89I1dhUidnK1YxOnVWbylEJTY5M1dEaWUiLTRAXllRWiRvQ2guTDFbamFKLlpDKXJnOm9sWTpkJyxSa05WXmptZC5kIk5QczomLUdMWTFQTW8vaW1GTVY+dDkrU3M3V3IxWi1BImM2PCwhU2E3VkpnSCRVTW9dWz0jXD4rLD1bJlpWYj1fZDQ9ImZCKTUnZ2hSKU9lPVJYOyIwU0VEQ0NLLClzXVhCSGRSQSxiZz0/KCI6aWdFbkBPZC1NSythTlBGWjkhVGM2IjNjLjJBYzJfK2tvRXE6VjpSRUFBOlBgSEcmKSNVKVcjLF0oR0lFWT0wLyFIRl1EQF1CKyhNO1BVb141PCoyZG5DPjVPazktNSopbm4saV4jcihHXUAiayx1IUBlV1ZbSWAiZjN1OjM1WS5JIkhCaFU+VSVpYDkxNV4yZ11PKSZccTYrbUEyP24xT08sLjwmUDdwSk5CQFNUVioqQG1bc2EuWzknT05BQzFeVVlYTEdcdF5HUiFXRDNrRUJJP20yQTJXQmlCX1cua2ZuJktFIzkrbFBuKmIndSVCcj5HWD04VyhgdDpBTTsmWzdEWHFNPmZVZCxaSWxuRE81bi4uT09AJVc1JT89TUthQk5zJ0NILyRnYmo7dW9jKDsnTXAsXD4pQGwyVjgyVVU4Q0YmPkFwcj9QYVkxO15gPDhRdE9gYWZDKFZuUmRhblQnUC5tQG1tRFcyRilNQlZmOk9iKyFvKUMxOiY7OSU2OjFBYUVPV29kRmFRN2AkaVFmTDpDLj5ZTSw0V3VEMTddOV1RPzttTWNkS2tuPThXb2EmJ2RMRDkvOjFXNS45aTBAQSd0aHE3LlZEZyw6KF8kXHBOOjY5TFYvKnE6JltLXUliQ0BuSj4vSkhvaGRzNXFuPCRfUyk0SUVtPGRZTTgmTUM+Z3FHZz5qZUBYM1doLj9ESC5UXGFETTcqQjtBODlHMD0+N2RhR2VxaVpmLW4kXGpAIzYoVzFHdSsuQUpGMCpdPkdEbSk/U0VILipfPUxXWVkodDpBQztoXzlyRV1MZEYrQTZqRHJRXjFrMEluaEwnVXBLIjYibzFfJ0ZaQEVbcXBaMToiIU5qYChFZSlrZyQoUzReaDdkbFFZRF1JVnRGSD5mR1xgUFVMIyVja0pwcFthPDJNQkEmKSEpIykmPGJmUCY0KidBWj8rND03KGByfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQzJzogY2xhc3MgUERGU3RyZWFtIA0KKzI0MyAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzY3ID4+DQorc3RyZWFtDQorR2IhO2VEMCtJQSZjU0Fpci5rNnRSRUBaMSg5KEBvVERZIm4oWVFOXGpRZyg6OidWc2QkWVBYTCFNZ15zZjY4I1IuOGw9R2ZzdEFSWW5LYlUhQmM5Z0c1Iy5kSyw0SDJwQVo2PjMkLHVSSE9pNFxgYClAZlg5N0srUztsRj9xOykkcnE7XjlAcGNlImZFRDVjMiNRJWhJTlYtTG1jZ1NhTGdHXyptPSJgIThLM2ZBNjBtRmJXZ0doRiJmT25Kblo9U09YL04hPE4wYERPJEokWjNVQ2skcGY1NWAmJ1ZYSmBDMDpNRSkpT1A6dFA3cz9WUGxROXAkJzNUPGFwYidRZE1ZaXNiWEVZUDtNNmAoKUxnYFQlTTtLUzFPXmhzTHEjMVZKNHM+ciFdcm9BcCIxS2lZKm1yLXIpKjFgUythN1hjZT5KPGkpaEtOIzJIIm5TdG1RJWMtPzw5XiIyVThmYCYuMV1cUiZhKkY1R1hyQWlLbycpNmhxYWFoay4pVUtbMyFjRSc/Jy81SmxNRVptPTxLa2tMNWo0SC02WlEsaUF0aTBgPy4sKVdlLmRLUHFUakdIVk87RUVoSyg3S2gudExzW0BdbW5PQk5xYjovU1UvRUtsLFthYCdJQG5KcSdtK3AiQj5hOGtEN1wvcFZbKz10MEFLIio8SSRVaE0tKDFyVGgjWFg9P0JmNE0qVlpQKWpVXjBqTGtlU2oyIjJZZlwnNTBCbDdgcU9GN09zS281PSk2Ik4pODotZzc9J2BvTSFTXGVDLElTRlpbOlFAKUpyYkVvYUluXVw2a0pJYF1bZGEpdC5jKS1lQXFLbixxamNKXiYrOGY+YG1cTU10LVRgI1NZbiYqPFZiUl8xbW5VViNOa1VdOzlFX0hCb2pqP0VPNiw0MDMoSWBTKkJdbVVIY18/PTYxOi9bP2pKXC5ZKG5dXiU8JEllayxwNS9kXidBODddMG9vQV5Gb0VFLD41VS1wNj9VR1JFVGUtUDo6Kz45RkQnJnAqbCpuNDsmcXRFbHVOTUxiY25dWk1AYmllPzYpcCozQy5CTDAqQWRcQF47RC09aGpjaWpdVmk4VTFwbTRJODxTIVlEQChQVSFXK2BmSEpMMmdccDgvc09LWVxOZSk2Vl5kU1I0akFbYy49cXVRPkF0SSIkR1pHU0opP2VeNGw2bkYmSFpncVwuciRhJmtiaTM0RiFXQGo3UV42LD8zRChrWGAwbWZvImk5Xl5XQCtyMUxULGhYJ1dJRzNBQG9cRzpWNDQlP1BkVCRDWU9IK1YsTllMTU1KKUFIWzY8LUdiJ0RfcGtUcVlEYD1xT2RRNy05cyxLIyc4QDpyN3NEXWJsTmhDJ15hNj4jMmxzcDlTMVNFXk44JVNbPU5jTScsZ0Q/PGckNCxwZ0pDJDsmbTciOmBpXFJeNyd1QF9sdV8sQCY8V0YhWG4iR1tVU2k/VnRGI0BwY11uZTBnL0RvaCYtYDksPSdwYjgvVUFKWkE4YTAvKE1wdDVYW3EjLkhOQlwwbF9XLT5hPWVWakhuam9NXjAhP2tRZHM0a2k6NGRuP2FyKnFCWEA8KTBIVkMyKkFIOUVsZVdvKCEsL11vP1tnalBeSzw0L3M3LVM1P1ZEIS9hOVRCJ0JIT1dhJ11pKm5AQCg+TGVlQ3I8KzxWZVolUU4iYCJOOF1IUk5JLCQ5LFRrJDExJVFTIUVfOHI5OEkta08kYj0kSDI8Z0ouc006Qk4xaTI7PTJZSClOcGNvU2RDR1ZMIi1XM1JPQ1s3K3Ftb2ZvYDtHNyosXFZPLUtHPVVTWTdQSzYmZ05jLSZOOGZvN2JQZ2suZHFBNUs1ZTchOD5eM01JXUstSzk6alskaUdhQzEpTlVSI3NGUmI+JVx1UigjKWlYQWU/cjondVVsRl9OQi5TTiQzcHI7ZWx0MD5bQmRzKjFJKy1iRTZJNTYyJk5ZKVhkSWclKmtiVDgoMC4lVHEiazRVK2ZLcmtjNjc5YnByRVoyYEJwP2RRKDVPInVlVTs+O1EiUGUrbFxdcGQtSGkiWDlvPU5tRkE7YSsoKlFyOnRVS1pXTXJCTih1PT1ZU2lQcjU0PD9LLmE/dFhoMj5KJkZFRD4nLV5TO0A3UCQmTVchTmpSWDAoJGpxZlciQl80Pk00MUAtdWE7OTJMXV0pRTQ4QjpsPFlkJURySz11KmBwIytTOlJtU05PWEMxRk0uSVRVYSgmUiZibywjWDxdJFdeUSlJVktXbztTVGdRLS1nMzcmREAnMWtFQ3UoI1trVSEwQmlbMSMrJGVTWSFoYjVacSNHYCZya0ZtZGltUTBiMVA1czhRZmdEQWpPKjhZIlg/UjRzclhCWGQ/O25JXF8jKl1ObkZvQWBcYEEoKFJiWWJjai9GI3RbVmtuKlRYcjFqTTciOWkmVUw8Iy8+JSZhJzlFVnFLblwoPiJlJElRQDwnLmlAJ0VqOyoiak9vVmhVNFZiYWo0QVFjKT5cQSwqOyIvXl5tXlg5O2tyWSZfPG90KCdZUlVQKTcuVlQpXUouOyY2JllbakxLUFclcnQoQTFTbXFOMF5FWkouYy1JS2deLkchYlVVOWFxYExHYS9HVlFUJktHZ0M1WT0xL0E/SClZai1WR1dobEhtKicibTRrTjpNPllzPnJZIS5nISdZQTAuKGx1QVtuKUE4OSlENElkQj9ecjYqcjlMXkQ3O2lDWjtiTl43czZfPkpMcz83JU8sO20uKlFJK1lBOTxWJzVCOTMlS2pnNyFoNFovcE87TGd0ZCcxZlZKKSkwJFpvWGc0Y0FjbkgjPEUyVE0pJDtYTWpXPW1bO0lEPCFZN2ctK2NabDY0KGtvSHQpZjleRDJjOmJFdTxQJnIpQUpjNEMkaDgmNkU9JGshOW9TbT0taCksJzEkbjxFPictTGhdcUtKXGchRGkrWjxRMCFPbzxOWDlmZ00pOy9KPmBaSDJhTktFJm5QUE8wUThOUmpMMFkiKGJrNUBHLkNibiJxZFtUKGxuXVA7USYtIys7O01oImA3XmgmVyc8a2ksOlRobnBMO0g3NkBqR2M3ZVI6NVphV2ItQythXFsyblAmLGJiImtVRjxmcmVhOCp0JjdBXlZMOllBPWVuOFRpZkcyXl42KU0mZCFmMzRxWCsyam1IZCs/RTs9bzVFL2UsaUJRZmtpXTJbNSxob15IQ3NQaytJPGNJWlJjY0A0Okplcl83OiMvZGdYcDwpYz8lOiRDKShbMz1KXSoiMG5FK1s7QUI1bTFTPTprWklEVThrOyNFRiJVMD01ODtULk8vLiVoJyxiN0JzY05rNlJvT1RNZWkvbHFtOWxCISckRl5GLHFSJl5sLGdIQj9OZilyTWgiODZHJ0hGNWxiV0Qya0hdL245VmNdJHRYMSgiQm1iSG49cChlN0NcQCFDQCNiL0I4KGZiP2ErciJcL1RQKHBnNTVaYydsUFIrMyJLJlA9Lm0sOlk5Tl5NKyFwdUdUPEFSVS1GP3E4bm5eQDdgayxBYU4jJk5UaDAlPHI/N0pyaCU+MWRVIkFXaEllI004RTprNT0+PEpcJClKSVddcUJwUHVyc1k+MSs0QkRJbVBYNCtCdUclXDdzM2t1LURmQjonI1JtIkRQPyhHcls0YEgoZ0JtY1k8ZmdKRFpwWGhicl1SQkJZWF1IX21+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNDQnOiBjbGFzcyBQREZTdHJlYW0gDQorMjQ0IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI2MDUgPj4NCitzdHJlYW0NCitHYiFTbT5BcjdjJzdDQ1FzIkZ0MzpeVko4TVBNWDg3MCxKbj5DVzdjVmlkLjpXO0VlQz00L0cuUHRUOUleW0tCIThQdW9JO2lZJy1KSVB0MmZxJDxTMU05YEg9U1FJblQwV20pMTUyJlpnTChQIjNYPUROL2tkcVZEIzQoX2h0bCoxKnFyblYlJS1NQjQnVTxSMzNxamNiZFNSPWk1KlwwQj1PdHRDdWhxTWQiPyRAW2EiOyJZInEuVWJiSGFBcktUJS8yZ1BNUiVsIXJnbixBZ1VyayYwaVwoZXB0Ijg+W0QoX11CX0VzQipKRXBmQ2dNWzJNRGYuWidxYUhdR19RUyxXJjE3Y05YXmtDJFovbWlwYl9zQk9AaG0rMDBnTT9GJTk6T1NBNjhnMDspXkZnYmRDWmk4P15qTi5tMSdCYGVFYFFxa3UsPFM4IzpgWCVMKWsnaDAmMmJnIlhYRWVTPlNVLldVcS5pOj5dNyQ4XENFLmlvKVY5KWlhN1M+U0FcTWQiTnJuS2M9Vyk3ITVIUD5Yam5XdG84YmNTIU0nLVlLIUYzdW4mJGBSWihkZ09BR0dtWVVPSV5WXi8lRVY4VmxpYlQ6a2FmZWU3L2wiLW87M11yJExYJThLJj5bRT8sUiRNN2t1XDEpUjIjSDhJdHNESixfVXQkTWlvX10/aU8xWlApSGxsVGgraTM2KC1vRzZsa25AL2lmOFYxKUtfKylYc1tbLk1PQk5NIWlDVFNIZk1xQ1ckLzVlYGtjK2Rpci1QZmZjLHVsZT5tNFBCWjErVmJcOFpvQCQzX286VDxyOk10Pms3LTxYZD9fMEpUXl9tWzghJGE/PFoqPzcpZFlQX15MPE9mPWYhUGMxKlNBPTRhJ3FmcVc7ZUpebiJtT0ZdIT0/ZEthRzFdSnVEKTs6aD5yaEgoZV9BJmNbISJIL1YnMSRVM1UuYTxTa1ApNDIzQipcOGcqPWJyOyU2PTJwKkYwPUZzKklNP0JEPyFZOFsqL1dHcUNsZikpOWAiZ2NuX2J0VCs1SmghUHNpbjhvSCJDT2RcTGFXaCpvS2RZIS0pPUxBLXNnNHI0SjciZHVAci9cJlYsZmpPdDwtTidzTC9SUEVLTEBlKCxRI2AyKSY2ZyduQ20oaVBZIS1iIyYzKXRkXE1dSSRqZnNeVTdmVVA+KF1AWitvUGRXLyc1MVhWKC1gbmBzMEErQ1hzQjhoS1pRJiQ0YkhxSz1lWDVSKixbQjpAZSRIVGUhPXAzNVtTSiY8YiNEXTkvXTZdaTpSN29WXTkhSlctcCtgN1doU0JvbFFHaV5jKjlAMzI4JUJcW0ZBUzFxRGBNOSVEQS0vSDNHMVJRUkI4NiNsKzQnJmpScmUkOyI8PixHOl9OUDBAWmcqWj4iTnByNkIhSSgpQDZob3Ijc21rVlo5WCk/MltIKGgmLDdwXTNRRGpHVWtRbCc/TDBSTC5TcmQrQUtwSlY9UF8vX2tlS15EVTBWYkMnYlhvO2Q/Zy43YVJZUlEuUHQ8cGsyQjFXbzQkUDQ/OF45XXBoWDQiJzc1TCRAOkBGTTNuRFBEIlBSOCNRQC9iX1NcYGNASTBXcyREbzJdVjgtKS84IkptVHJmVkJUWDwpVjU6JEdAbTMiLyRCdG1PbClHblk2R2ZoLU9wQEEkMVM9IlQrQyRSSnBbLUBsQUVmPSlONUs4JTRdZkM/TjBQWlA0PjQlNEYnbEFKZFZJaXNIcWs/Y0ImKj4/Syc7KEBhWDsjYUlgUUAma2JwSkQrbFQjZVJTVFE2XDZwaCZrKDBrajlwJDhnN09zXDxNaS9Zc2tia1EyOT1dLko8K0BdMmhrY2VNbk07V0lgVkBlb1heITY/MWAsY191NyhsPDhiOi1VLyxhKm1RLzFAOnFDPkYsLU88Kk8rMDNvPmVSMmJFKj1FV19RSCNCPWpMVE4jW0thWi9kRicmdS5YblRzdDJbM0xycUhtTzhrLTE3QVRJPSFiYiNnTFdhTVxZLSE2Z1kyZjdcUVMkaStvaHNmSjRSNUYjU2NTNTxQV2AxanBDU2InIjFFcWFIWGQ1RWBIZydBOC91LU42RlliTU9JNzI8PW5pWWFDOytiYjRQVSQiNTVYT2xdJT5nWC8mMTozKWgzR09oajQ2UCgjWVtoSChdQj8sXF1uOzNlMVUiRUgqc2k0K1xnMU1DRWIwKXM5XVY6TC8rcE9kRURXVywkbmMpbjdNTXBBN2xpOllWNyFwbnRVO2pmS09Mc1RWSSdDJEpRV0VPSysrZTBvS1g0S05QLiohRG08Mz5uJnAwVSZOXDooci9AKztRcmQ2V11PPlFqQUNjNWNFKzU+Iz1zJ0pgSzNLJShUSTplIVMhb2dCVkgpSl5WVC1sPUtpNzZMWTAzPiI6PWY4IWo4KyJQOUIrM0AkLnJmJ2M2cTFiJiQmWzpSO2gsPyhOMj4pQjVmWSdOKzM3YyNHZEYlMFFKb3BgNkM6YV1wZk82QmxLViV1aj5uUEdGPztXWzBCcVtoVk1rclw1WFo7YyNPPSRmdTghJGVqcE83XFNOZiJcMi4uXjAwQG9xRkU1bUJSPlluYms1U2c2MXRBImEqUlEqTl1YQmxbVHBnKVQxVVw7WSpPQ2R1SGtCWTZaJDdvSXAhXjhWcWlWJio8OE1qUV1kXVxjQyNcTiI9XiM6MS9tbk1vWjdrPy03RGApS1paK2xRUFNKIjRKMHEjRj9FZnBuOT4jR2dcQlg2QmNhQjdaRSFbWUxnLlp0LTUtNnJkQl8+YD8oJl1KIyVnUiRFQHAkKiQ1cGs4SDJMRnRRYGBYZ3RhUVhQKVs/US9FLTtmbFpwTkMkaExPIT1HQHFhYG8iMDJgLlEmMjMwSS8uKyklPSc6by4xLzlPQSpcW2ZnJmdBMkUzUWBmcydpWDBDbUclJ10lNFZWdCpSKyEuJ05LL2lkMkQmcWphNC9FI1paUUskLUhBMV1nQyxrV21HQWhUR0xGP19RWGBlMjw2OlQ7P0svZyo9cW1tLkw6KzkiSF51OiRUbkEjR0lCOVYxRERvZT5tXSgpUk1ZSlw6QUtOVSNtLy00Qj40dSVgaywvPVpacSNUPk8oNW1UPSZrWS5paSk8aHJmSDNhbyE6Tlg0MkJJQXJPJXE/JmdkRStMW1gpQCs4QnNFMVg/QmJnckkxW0A4cUdvW0I3Z1cmSDBITlxfVGJiXG9VYDU5XmczSik+Ni9nK1FPMUM7ZGhsV1cvaCxKKm8vNSJDcStkMFRkRUYnMCxETV4lO0AuR21AJVErMDxqOEFtai5HM2wpVkBORU1nWSpvUmYtWzIiL1liTHInNlg/bD9OND9Ab1BlMzwjXERRbmxKWTMqUFcobUBCIyhqcUJJSV8wVmQyN1hnUDlJJGBtVzs0V1BCTSk9Qjs9UUUyJjg0Ij9JWj4jTGw0X0Jrb2ZuR1Q7Lj4tZzByVyw1MT9LMn4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI0NSc6IGNsYXNzIFBERlN0cmVhbSANCisyNDUgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjkwMiA+Pg0KK3N0cmVhbQ0KK0dhdWBVZ04pJmkmVWVrZ3MuTig9Q04hJlU2JVRvbDA5S2JKZi11Jzs/LTBXVlBfVUQ5LFVXWEluLWdFbG9DX0E5Xy4+bGcnV2E5YFAzYUJEXGIpQ1VJQ2FiPl9BSWJocl1lWy4/PTFWPUlMJSplXyJBVl8uIz9nWCIyKTxycnAxJG1MQHQlPSJIdUVdUixPUmxvKzkzYmsjbm8qOlcoOV9HMGNmPldhV05lLCQ8LSdFMUs5MyM1QitnVl0/U2lONCdfdE80aD0sTWpKRF0wPV8iUUdRNChcXkdJJF00dT9qYDo0bmJNb0lMOCRKaFVeS11VXl5zUCc2X3QwNCpGZU1ab1M+RydSX0pwcGZhTmgxaGlScidvUEI9RyJcUTwrW209VjZUT1tvQDVfcm9dWzheUCg6WEo6Zk9KcGBUXEgpWUQnRD8hVTBlbVw5Vk1gR1JNQVRTLWomLiJgNk5QMTJASXA0Ly9vby0uQE5TQT90ISpyKWRdPThfSSMnKWZLJjhyZWtbbmJ0QXNaREMmUWVxN1FzOmRXW0graU1DJDpdKF1zUihfXEM6XEZfMzFBIWk6L2tuJl9YX1YkWHRjVGtXJjQ0XnFvOWJqIyFnRjw9Qis2VTRnNyltcjomaCEkRlxSZVVfcmlmQ1o0Ry09cD49bD9yZSNMNEo7SWphNy1VdC0+WEtFIS4zN2BvcGktYyhSN2lCcm5QTHJfP0g/K2xLYztfbUhjOGJyUy44aC82XFdJdWMjMzZ0bFtOUFU0aUZvSWUpYSkzTGJKMGhKXCRHSyM+YnBPRDd1VDNvVzNxTE9XPVk6K1hKdW5XK0IqUz4zXlpzXThVRGdaVzxjV2BQTCRoWERfOWE4LXA0UChGYjBFIy1lIUlLcSFJPGQkbyYrNVw/X3NWKGpIOG9FSkw8T0lHbVBGSU0mLFA1anJhM0BDN0oxTipLImNhRmY7LGE7bS5GZm5gbzNTJiNRbExMK1pKO1dQKSZfK0RBJkk7RD1tXXM1azdOUmpSdSMyZG40PGIzYHFWUixNJVllL2ZfKGFSJEAmcmpPNWk2JSRRcFM2a15aVW5xcl5SO0RNW2skcUpkWExBIUVPYCZeYk5cTGFvKnJEM0laODZWTyIxbzYnNlgsJHB0VDcyK15GZVxjL0BVR0RUL0loRnJZSW0zMjxZaC0xWihmamduJkVQMU5cVFBEO1QsYi5Wa0cwOmtcSi1KLV44VUIqOyw4JWNCTmtMR1djNShAZVpHS1Fxayg3ZF1NJTE6SC5cM0AybkRKR0hQRi5mS0plc1tTRVFVVy1UMz9yPy9eN2RwUEU3MWciTF91c0FXQ190ZzRaX1RoTi1VOzppJSc/dFg3QGNdYCwkMlFhayclZ3FlNjw4S1BLXzAsUU5ja1NRPCFvMF10L1EtOWEjJ2M4JWheUTNdaStqRUNrYSVqXFszZHRhQ2gtWkxMPmRaImhWXkojNlgkPksjOz9YajtGT3VLLFYua28+J2IocmVFT0BEIWlaKW0nO2hpW2glJmwmNzZZWXIlJ2A3Ri1lS0BxXTdlJnArZUNeRyF1ZDkhPzVAVTpAJFhgREJRMT5GPUIwVVNKLWNYQU4hN0ojWDNeK1tMQmlhVWw6MGI5Uy5nKUg2cTI4MjovYlFJV3UxMV9iMHBhRy4oX1BtPStEdU8uLlVQaFBQJV4lNThiP3MqaEohTkc5YyU3Vzk0NkptZCxDOzRPTiFicDZITzxoTVgoTXNMTFMkLDc8Pj0uSCwsLTNVbjQnM3RsNSY3VS5jW05DWC1EXSpjLmchQSJoKi1PUDJbJGgrbGJLRjEraGNfTENkWFcjcGA7X2k/JkskWl5YWWI3NjRfaVBTSzU1R0widW4lT1hlKFMkSGkwbWc2T1pQVWVMLilfKEJpJms4Q2luP0gqZS1FPjU2LkkzZ1ZHRm1edSQ0RCJZN2JMc14uTyxsVDhWR1BsLEptUidQYFNMRzk7TSp1ZjsvKS1iZDpmUFFBQlVbYlhJWkY1LlAkMDRgOS5YRDczNkZDKF51YldtZVohbSssIXJDNzhgQj5ZaGZPQFAvZGBVKk1hZ14qOFAsUEsyLEgyXE02YSExdGsqXlw6SVtuakVxVFUqW1FLLC5hWTNXcFVAUzwwV1Y5U1dZQGZHY2Y4JT0hUT4pJ21ZakZbLkM7MW8obERRPk8odWdUa0YsLmAkQTJfbCpaKDRCaDxGPEVdSWFISm00YyFqKStlbXI0XjlxXDRwOSdwOXUuSGpoPEhkNylbKWs1OEImKz8kcygiY0M9J0cwdF1HbTwwbyEsZDNscWUhVzVxRClkMW5SRyJuXi9VbUxvMFYzZjpaXDdrS1cxKVRuTDM1bGs/ISdgKClRKCw7bVZHWypkRTgmY0VpZ1BYLS1yQVU7IlUqRGMzRywxOyttVjFuLj8qUS9MUyhHWS9gVjhMOHJvUlI1VVNfZjw8RzFgLW1XR2w3SCUnLUNIPCxjYjpvM0FCPCU4a0A8YUc4SktJSVUkQ1Nlc0NVVWRXT3VcIjlfM0E1TSQyPlhJb1ZQKnMxWSFNPipScSEyR04kRE9GUzF1QksxTVBzQTsiTydnaV4lPDQ5ZFlXTW90Yj89P0lMXCoxRkY3JjllRmhHW081LShUNElMKm1NNzlcLlc1YHBaMSdZYlQ0LHFARz1bXC0rZlNLLT87S2glcHVyWkYlOy9lYm1QOFoxak1YSV1GPGBIUyhlQFo5a1JDTyNKNGk8UUtLYDlkO0dzNS5hQyxjN25oQCJJYEVHXlw/Ri9nWzNzcEElam9HLC0nJmQnVj1fQG1Ec1pnbmhxSFlQSnJuRUsuVmo7bUBhUV1aQTs8M1w3XEo9LTxXc2dcUlRSX05GYVhjV1dFX0pcRGxPP2tKTCtcST1OV2RhR049Xl5vMkFWIVtaIyYkaWVLOldwcENaXSJlVlJPMm5Wc04sNGxPJEolRTdsaVJWSCExIlxOb1lVOzUrcExyXjRwMmlELVZHdG5OUE8+LFU2bUkpXUM3UXNsRWwpNmwzdShDWXI2QzpWXV0yT0JlTE8+XS8rOmxUbFw6KEE7ImVYJi9xQF4+XHBoWmEzWCRoNVxrWFZJcFYzVyxOJytANVxzOzZaLEtyOT5EOTtebiwsTUBsWEZxSGRdUHAlUD89RVczU1JRKGdTalA9RS1GSUoyUGc1KFNbYS5fMUVZTktAPWcmTUZPViZFJDttakRqWDRgaDJVPi5VPj8va1BGTiNfPjBkcFshIjZeXlt0Mi5CP3IpP3U6KmEqXCE1XjsrJXQtIUpBRiVeODckKk0wTDVDSkE9ZFNtcDRBT0FSN2RBbV9mQT5KZSNncGEuPkpQXkRLV1ZCVT5XPiEqXW88dHNecjFBYz9UYD5NVTAxbEJgdD9pMFVaZF4ySVxDW0xxIXFxZ15CUWgyPyE7IzRNZjw4VXQiSEZFSWBLSWN0UT5EMl8oWVcoJ1JMa2xQYllQXVY/TGNrUUFDXDBINi5rKy4+JldeLCcqO1tcVTVQYy8qcS9rYWgwK0o+VG9eUVZlSWBrISg6cCFPQEddbFg8ajRgcEZEaklZRVJtUForRjhKdGJeIjsuTU0nR1g/OjJYZFA4YkddTzluVl09I2lNOHRWJzBDbmFWTT9WXzMpP19sc0ZYb0ZzJy5Ub1dePGpANDtzKERRV0xOTCM1ME5vTyY5aiRDcmdiYD9aS0w7JjI3O14lSkRAYnNwRmBkXjVSIy9XO2MzMVMzVSM5IU00VzIlVCpjUy4/YFhBQXBlX2xlQT5MMiE8NlJsOVBQUG1yQUtbQEdPQi8iMDU/J1pmblxkaFZXKiglLF8+MlwmMUwxSWoucU9xNlUpJG9sVWU7fj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ2JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0NiAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNzQ3ID4+DQorc3RyZWFtDQorR2IhO2VnTiklLiZxKlBVcmg3TGdqKHVnV09lUWEiOlluJm1QOFwodE0zWmZLPjBkOj1KZWxvX15fIS5RclZebUEsWGs+NjlPRlovO1JyLyE1YlFOZkZTPmgiX1t1a0NwQVpOQ3ByPEdicjIxJ1MhL2ghWGNqTzklJDFBWTU/W10+M3JHKSplS0hUY11Ac2szJ21fYkgiW3M/SF1hOkg6cEgyUyhfb3BeWjRoSj1zJTcwXktwQDVsSi0ubypjNC9OTDFmTUFuUEpMTXBTajU/UmouMClxRj5xbUNuSkQ7VWYoRlBib0ZhI25OPSpzX2FcXllpbD5FPWM5RW5yLTVaTikzRWlMRyleOiYySGwkUWlkRkJqQSFjJVROQTVRMSZmc0NfbT9cL15nPjhnJlpxX1VdWUhINzArcyFRN1AmMnFQXzJUJGklLiNJLC9eLDlibWk5QiJYMS08a1AzLTdXOz8yIjFnXVJuajBtS3Q/cmU4bTVKPlxEXl5SRyg8PyRiaVJccVh1S3IyQmc/SUMjSlUlYlwtY0ZkIT5laSNEZmElO18hJ1ZJPnM9SXVFN0VfRjAjQmZMTVFUQjMuLmdXblNiJF1GJipPMEZKPFcoXkVxRG0zQWEkLFFbW1YnbVdNbktxNy9ROFhJdEBsImpAJilKWlZlYnEhQlE4akxUQkdjZiROPl1AaWo8VlVlM1wyXms3JiptN2JdW0M9TTBadFxlQS42TmZOUDNUWSgkM0FqbWlKJi1cR3Ambzk9KiNfaj9ZSU5HVnFXI2chQnJIbFxRP1NfXFReSm5RZmhfV2Q3LlciVTxRaCIxSlciTl5DZzBIKj8+VyQ3V1QxXFYkKCpsLCc8Wz5UMj9LbjBwP3FHKyowVExXSm4iW1QpXC9yYF9LaSVVIlQsaUBVbzBlaCgkUEs+RS9XMl83PV5FXkNFSldPWWliTTFmRCRDOjRBLlcsSzdcRiImI1gkUnFgNyQ2UmdEJztxV2ZrZ0hybi0lNCw5IilQWipbPlVjS2NWY1pkbWopP0JmdGstKFlBS1lrTFptX3BsaUxfJiE6VGomb0tcSExDPTU+RG1GLk1pVGc0YTQpXW0jaVUlNm5MRC47RycrO2tSLjdQP186ZVZgKWY1QkVINlNqLFA+KlhnJ1JtMVdgaCFEZF9eTS0zOD9FKGVMQFpZNWktITFOLidVW2FIQ3I3dFlNOEwpKm4xQS9jWjNYUWFTNDtjciRjKkxsaj00LWFZYFxKW1Awbm5sUkJhMzlKVlUlI2ZnLStMUWFbXHIvKi1Gc2dvU2ZQNkFxXDUsX1MwTThtXy9RaioySypuLEhLXk5damxkQ0NeQmFBPT48UzRUNFhkcTJgajUqTGI4LSpIa1JIUjNNMElQJnJQUTdYXylMXFZwbkJAVzNtOnIhZWUyWV5rSiNcJztIWGtgST8iPWNcXERRRj47M01NK0xTLi03UidXIjVVJVE3RkZKPTxmTDNBST9XMGFkdUYsPXRGTyNCL0F0XEo9LGEwX3VXdUsoLEA8b0I/XkVzQWdqa0MnLiVAVE0laDA3XTxQUE0lJTpYcFoqQitSYFE5LXBWcjUuQylwPEBuTm5WdGolNExQIlFMLCM8O3FyclsqW0ZMOnMnQiMkaEZFYyRmSXJUaUpzQzFfViQzX09nXmRGJGU7UlshUWpTNXRQKFxyY1BFYGw4bShhLz1CY1A5SixdXiw7SW1kO1U6dSMuaS5MSVc4MDM8c0ZVZCRgRmk4VGFKRClqL0dCXDJqW0dgRDs9IzgxUklaI2VfJSU0Uz1OTUgtb2RlUVwlTi0xOT5aT1NoPkNpZGc4al89VkptUjRQSEwqXTE8ZmNgbGJGMWElJyRtSkg6SzA+dGAoVjtyRDRbMzZgJk10TipdO1IuXzFcWm49RU5HNWosWnAtXzspVkUiM2pbXWNFNDJMRkU+ZGtzYD4vX25yJXBXbCsjOy9CXFA2WidiYHVMQjBjXjNSOjZTXk83KzFTVzhoaSpjWyZsIzw4W1ZfQS4kSGNzQWAhMj9qYjFNLCNVZDhPW204MFQ5ZiM3dStPK3VzVWNgK2lvLW8yI0ZDTWNAOVdxQTZoVEVDJ1ZlKG0/bUlCKmhEP0YhZVFrNixjXU5cdVVpVzNfc29QbnRAblxzIzkkYC5SIW9lW1oyJzcuNjVSPCM5VHInazBhLEZmQj1eWGE/Tl5kR0UoQGwlTC5WKicnV29lVXQ2LmFtXixcWFJjLzxhMkpXOEhHX0orQDlvRUU1QzkmaTgmSzokNT0/XFxpQWQ4ZS9FWWZCayxCVls1T28pbCVObTA/NVAjJDw8MitgQm48ZFQkcnRcNltdI1tJOnJjVihsaFRVSTAmXylGdCJILkNjLTZdXSNZOCVQbC9oZz1ePFlVTEwsJVgkU2lTZSg2XEkuMSJaKExtXTM/M0BfYW1oT09eIVlGMWstWCNYUFA5Nmo/TWRZSzE8P1EvNG1DYlJlIWs4WSlPMmEtUW9WP0dYJkdlRHJEc2ZNP0dHYW5LNCs2bW1YSkBdPltndGhpMCliY25MUT4kR2BEYD4tP0tDZkJdSz48JTApLyNOaCdTUEI+LT1YMi1AXW88NiRUU2kuc2xxRCVIOShDZDcvYldhZydwRnMqLktdNl05Z009Nl5LVD1LKFVdW25TUT4tOlpTUlxCL0lucVdhOU8kPV5nRVFjVmE7Mjo2YmpeMVlYPCooSTtoJ0xSLkptK0A/alxWcS1HPzYmSipeZiJzRzdUIlBsMjNpOTU7VUVyQSdyRyoxOjlfaWIjI3NYbG5RaUMtdWpHOE4vWjUjUGgqR2YpLUNNbFtTcWBhbyQzWXMuTUY5ImNiTnBOcWtIZz9Hb1IzOWFAUGlbRT1fP0hnO2g8TGZNZ2UnTDFhNC1VRkpjKClkUClCVyltP0ArZEhWL2dZNWVpJmxOQi1RQ2xpRVNsUSNJZEhwYjRLJzBcU2kwaSQ+YjVPWzxJX1JjMCItWSQoWUQ8Pmk6M1U7VTpWOXQ8NGsxNCRddTA+KlZTIz1uWVtpY11rNFJ1THFiOk9kPUBoV3RVbG1nN1hhYk5gLWhAVDIhYWVSNk83RDtEZ0RHPElkNE11KFIiKFFWcFZYZG5pOEFVOWZFZkNBKXBhL0ZmRWdZazJcNUBZKWMlN0poNjJWLWJFPUZjIkQoayc6SFhzI1NqNEp0XGpPdGRfa2smKF89RmpSR01cOz9MK2A9JSQ+bShJVDFUXy4kJ21LVUA0ak8+QWBjZT8xMzNUL0c7dXJtKlhwSDBqT1tmJWJxIytjQSlBNVpdLCdeUU06KiplbztGYG0xbXJUYHE4KERoMVxsODRGRz5OK2VHJiJuaFVpbVkhZSdOYipQaE1oS111PVheRFhWZmtKQ1BbJjQ/WmkwaD9vVDRzWWNIW1pWaS5yLEQiTnM2dEhkJyxOMypNZCw4KGlLOSNuOyxTQjlZZShgTzdFMTtgcC8kcFBKSVU/cCJoLj8/KUZJaiNbSlI9KD00Tj5McCxiYDRHP2BUPGo2XkRMLVw4ZklVUmVFYVpJcDgtK0VWcFFHOjJjXkRYNjJTXEotSDVEJG5Sb0kzIiUsXzBLTnU6JEtDQSpXKEpEZ2glbS5UMmtCOV1jVjZkcFElYE1dUktPJy04SCtMfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ3JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0NyAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCA0MzIyID4+DQorc3RyZWFtDQorR2IhO2c/JERkSig0RGdfayEvJmFeIWRQLkpGVkFnXkg4bz0xUUE8XUxWQWllVmJGcToob05TcGxgWj4lNV5YU0RDJTFcMUIyLFopaEZAZmI5QiY7dWAyOCMpcEFeVkBPQ3E0LHA8IlA9OTlzQVFHYTpqY24mV102WUo1SHRzI0NoTXBQQS09Ri5bMk5qVU86bjclI3BBQjkpO0ErMkBlQVVIM05kRiI3WkhaSFMtYj07N1kmVHVPWSk2XjlTLD5NUEFUYSpDIjtKITkhLz1TNzBKczFYREQ1SiNPbFNcU15CK1VRUV1CIXJMLEg1U2BHalRgJU86TU87QWlPaGUrLS1qX2RXMys4Rk1kNVZ0MTxKTlUmcztAJltaL0dqM18+UCsqX0VvNURfTV1JNGFJUHNlczgtc2EzZVNFKFwoZE8nOWFdclZLIUFpOHQnXzVmb18xV1lFaV80OlhmMUYsI09lbFg/IiZlYkk5UWs/aWNHODl0Rl1OQUBMSDZvOmRNcl1dXVIxYV1KI1dOaV82cjlwJl0kLyglKj5mNVs4WkdZNF5UTUhtampuRTdEIixgQ11HUFtBLjdIciFERTc9R3A9RzAvbTRoIVVBK1Mwal8tJDpJdHI5PkI7cmQuLjooOk1lbnJfUV9xT1tQX0RrMkAxcWYtK3JkJi0/NXRZLllrZ11sX2Q7QChiMlY3K0RaY1NMJGkoKy47YGVfTEwuYCFqSUNDO14nPEZIKDdjSFwxJWE8Q21CZFViRy1qS2NqVVdkKzxnQEsnImt0NS1hJGgvPmoqXDBfbm1wOF9PRUhbdTlIaW05Z05aKWducE5nTWowSGMrTmMuTzw4LDBuZWwlbjxcKmMoUz5EOVswN1xCP15oQlFKJV0xOF5yX1EiMU9Vb1gidHIzbVZfQyEiKm48bS5CL10rZ1JqZks9NWs3RDxRZ2dkQzVMJ1JzUyZPWyxsSVJsYGBwbk5uQTowYy04R2FOWEhbW3BRVWFSWDQob2JQa1RpKz9XPV8+UypYXF0yNWZfTTZdNSRtaUZQZFg0MzAuLT89XzpoVHFVTVw3YEM3LS5hPkJoQCtzcUlyQ3RDTE5gTEFHTmBPPG5sPzU+XiUja1ZRU2xRTDJlNDpoSUU3VlwxM2pINyNXL1hndV9pTF8mLkEuRWltaDtYaFNJQSloVmAtW3U7cSxELmlcXEItLXJfcThrMzQ/Skc1PVsyZCE6Mz1LVVk9Iyw0IyozPSEhbk9mU1xvY2xfVnRSQCVoXFtFKyRAaU9LRFxAcklHXjRtSkguPFtVIm9gTllGO0FNISopOCgwJUxhZkVqa1lHQzo6SEI8cVRXNGtLLF47UjskdEJHWVVMPVRcY3Q7OzpHY1BmN3FZRTk+SD5QJ1haaW5QSkgyam5ldE1ucDFsZWo+RURZJVtVNjctKXAjNmxhYSo3Y1d0NUkxcUxXTiNGPSJucipDW2BJLmZcI1pRP2YpV0xOQTs8RjAzNVdMJWBiLDNZbD5ebTJhUilmb0NlM144KmhoRT0pTVwlRk86KEMqS2pSI1FuKEFHIlBnL0JpTHIxLl5XbCYpNmhhMVZMdHBNZ1VfXD8nWSVTVGpDRGZEWG42QDIhTVNGMDAsaWZsb05oaGxdLUFLL0NQb1k9SjZOOGo+bl9dNidwPUhmbChZaj87M0QxOXRqbk9HQXVCcVckNlAtIS9qJz84OVlAJE8tajVcS1ElZ2dMIzpiYmY0Xl0jSyI3IU8kbnE7O2g0aTFgcD9fSjYtMkRSamMjMSF0VCFaZj5pcHUzcztcLSpLbFRNQS5YaXVeOzRMKiEpPlsyczYmRFVTLGQxNjlcUS0saWJrMCJGJThSclNoKmQ6J3AzOFpZSjpNRy0hJVNgJmFxalZKVGVRZC1OJSpkcHQ2WSl1UVFXME1Ibyw7ayRuMk8obkdfYGw8JGJyNE1TJC1jVVo2QmhEaVA7XllXZGNEQmEvakp0RktVKTpdN2xyJHJvMnUmcWUnTlNHKD9xVmdJXyVsblJOb3JHXiIlR1RELFxQZFkjPz5VOlFaNlFJUFZLOGs4J1pNPjxUY0o2JE5oTGRrbWxwLlswNipdYy5XMSlxNF1CNFgmdDlxUk8jXmkxK0g6TDheXkVjYVteWDRdcGEhUXB1OSJdZiRfIjY6RTczXik2NmkxWzphSURVSUVOI3NFJCpeSjE1cmUmN1ApampuazQ9JUlxYkYtY0EzQ0hWU19yaFJLKTMsZy01bj5MZm5LcWwzYFw5TkdcYjpPMjxmWiNcX0w1Yz8+cDJDXXA2IjUhZCthaHRXKDxaS1shQGErTFk9Mjk5QnRHMjVWYTZgI0JETjUtXnUhNi9tRWdrSFZlJGU/YkE2OD1xYDhvMzM0SVBgYlwxK29EYWEzMHNvLUducFZQLGhzZDVlQmpUPCVHXXVTP2BQaT1ZXkdyQDkkRWNmXT9iQmtHTXU1VnVMKXFxVGFBcWkzW0tfViJGJ0ljR0dnY29ELShDMWhqKVZcWEdQNiVQcSdsLUQ0RSRmZzVrKmhZOkBqYjVIZ2JfSTNoYVs/ZXE7YC9cK01qLjJfPyE/YVwkamhvMXVmRDkhIiFOIi02cztkcDpnSyhKa2lYPWYuQGIuMCcsNktKYVU+R289Rk9cVkkyTiIjUy1mYyI3ajZmM1xuLDE1bkVQaE5DWltFTGdjLDttNT5QV1JFVmxDU29Dc0UzOzNdW0xrbXIhIVdNWmhxZjdpSFBUPFEqOVFoZktwZWhkY2NGSmBQTlFIPkNZLmNOazdSMUxfR2BYMiNILidbIVZRW2NjIWovU1IyU283SF88PEMyM0s6KFY8QC9qbFtuKkdrT11lYWZEMj4yMFJBMTlHSWs+aXFBNTFSZCg9cyQqOChHXzE+Y11rL2JbMnNddWUnMFFvaTwzKTUlLGJBcTFNJVQpaFE3TjxYZXRKKGgwYDhVTCsoYkVvRVdBdD1ibDE0Li9pLGhbdGtCQiFhMVVMIWZQW2BFQHBmUVZTPFxOTkApJU1MNGZcUUVmVDA1UEUha0NbSzhxVV1YbSktUWhaOFhaXVsjPiolXWpOI2JCUSpsWiUtMTo2dEBkOGxqcExfbkpqOV83IWdXLElQamxzbjkxJVkiQVVyMGtjS04jVz9HXW1OKFVNS15iYlwkLChvLmRUQ2RCbF4ya0ctLnNnQCtzLFVNSmRXakFXQEFvbGlMcCthdE1iaUddYGZpR11UYmlHXUlZX2c8JkkydDtuWnByKDlqOCo8X1gyUi9cQS4kPjBoUlpDcEZNMmZeYUkqWUw7OEspQS4nPF4ySUtwMXVBIl9XMG9uJjIpIWI0KWdrb0VjRExDZCs6JycoOjUoTFY1SGhkJiY7O2g3PSs3JiNaaklfXVMmTC1OYmZFakdKQTJlTj1tKW8hUypmOmkiU1U8bz4lQnJFaEYiJVsqIi5hPnArdVdsRT1NO1gxRyFHYEZFUCpBW0dbPFpKb0kzVS1QP25NTVQyJyYoXSldRSNZXmJEOihgZVQiM2EzK1VLSV0zUFtuSF5yQD5cZDQvW3EkciNdaVg7XV8kOUsoZG1TdCVybERpXjtvST5JdWtsTzFOJThBSmRHSlU+Q01dJVFWNFtuIWlrWV0pMXJuWkxvLUw6a0Y5U1NMQSJAbmJXKCVEZUdwIzdcWUsrTzpqYWRUNF5yXDowUzVmUkBIVShTX1M7cThpT043ODZWXC10XSdKZz4tTy86ZHBsQ3NmMGNIbmVTcWwjbjJoPClfIkMnZWcydTZKLl4yQHRlLDQ6JEQ3ZDwkQzpqTDhEMF8mcyJhdCNaM0g5UHVXb3I5dUVYKD9NZl5jImI+bGpbOWM3b2VlazlKTGFwI0UwbkVNPFFxZWk/R19aVlRTQ05YYUNMXVdpYVgub3JmTkhXSSVIbDYwZC1Gbm4sTkJdWWRCTyxuJiVFVEc8Ll5vVSleTShpKUg+NypeVk9yaUNNZ1ZwQjhCOzZlLjcwYC8jdSI/Z1pDQUhXJEl0N0JzRWJZLlBPT0QmUVIpNmBVJlRVMHFDX15DMiRuIiReNl9ALGYlSiYqOkJSO2IoIio0XFo/N1BKSmhhZFw1bz9oMjgxN20nKnFeNlFGTTVdVGE4cEghYGw2R1kyNGk3I2dOUFM8aUA9SWhXMWdGWS07JiU0bV1McGU3S2YwQT5HXEwwS0NtKlolOmgoYkJMP0RtKUIsW0xDZl5ua25zcDwkI0dXMTNsMDYjKERbXDoqNWNsTVYuVjItLUVvTGJrbGFaKjZzKi4sLlpMViJRLC5MMUkzPV04PGNYL1ovVl4jV2prYD5jUltQPUU+cjIkQTB0cSVvQ2Jjb2NuW28lJiYvOkJlN1JKbyVcJWldMFU5X1tNLil0aW9RcE9WSygpUks8Zz4uYHRUWUg5KUQ9TUkyN1RxZVFYW2AvbD4jPWxaaTxXUiRIPG1gKCY+Rz40LlZpRThmay8uNFsoTUlhLGJpRi49QTYvSUVAcmotQGxmSUZaNCVNNEQyIktRYlA3SCIsLSghXmBQZWsrZExDTCs2I0YmVzRYOGM2KTpNck83VmoyU2RtcGVxbSlFTz9JdD1YJzheQmUsOEIxPz4kQ3RTaFIwXF9tZmAiNDInLmM5W0A1L1lTP1JVI0pWLlV1Jy0+Jk40MnJLc3BvJSVrZFdMVj89MTlRYVEkM1BEbCIqXmpuK0BJT0c8OjdSaDE5LyxEU08/R2YjRS1eJiFsSyptOzw4aU0tRExuVmRuKXJtSGEmbSk7ZC1jSD0mYmhLWC5AcHEoZzJDLCgyVF1COCYqTC8zc1dDT0xYYE1qOz9fYFBDNmlgYVtgZHVPUHFzYVNxTzRWbGRBKThdcG5uRk5XaiFHJ0U+YUcuIkEuMSNiNG9UWlxmaHJcQEAwZm9BPEVnT0lsM289UEhjIVtrbGFXcE0+SSE7KHFNRj5ScGhbWllbbC5rOXNDIlA8PnNcRD0sK2s3W1MrMlBJbz9iLCFWQFZZI1g7QSI4KComc2YyX3FqZi8sJUREMzAiWCdHLiFSQklfMUohSilbQjcrS1hgRyFRMDI7YT8vPVRyRyxGIkBSJkxYK2whVk1WM0FhRiUvNGQhTzR0R2lealxDZThTLVckR0YwRy5MOG8lLzAzSlErYjxtLFInKj1OPTlqYGpqOWllSDIsMitUPUEwaT0ob0Y/SjNZb1NBQFRKVjUiJ3VqMmpEK2gtKi1fTiZmLywlVEwiX2sxPyNwO1g7KUwyPEokPiRNJ2M8ZmBHXFs3ZDBuQ2kvOVw4ZGBya1clRj0oJUR1aU1sZC5gUGU4amxadWwnK1s2T0BDXVY8Y2QjZSc2TiNzUlJAYDlDYkRDQmpyKWJNJzZuMmBeXSRFWzQ/OTROYyI4cThqQjxic19tTzxYJFppWXVfZzdFKEFgVShYbzI/OCEvUUB0U01HTUJpYytZY1tfSWRKM1xaPClaWD5KWis/QG5eaV09cFhaIitNQlc/cl03MnJzXC02VkFjTj05RzJXJmkoMmk+X15YNVtGb1dMUCEnU25Sbm1mPElxSjUvc2NUXC9AYVxaKT1rMEtkcGdJRE02RDZsajliL1RvLDprUnBcJmVIZzltIlcxckc0InJJZSxnPi5wJFRZRXUuMGMudURecC1EPyoqJDE4Ujg6SDdZZkdFOjxxbFBwKHVYJ1FUQiMzYyssXjRgKXJZakNoPC85Zko3ZypTTmlXJigvQyVBRCRHUCQhSHVDXzdvcD5bWjAyZVgyfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ4JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0OCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDIwID4+DQorc3RyZWFtDQorR2IiLyhnTVliKiY6SDRZSWkmO2orUGgwPmUrW3NWSDo4NTYqZEA/KTA9NCxPZ2UrOzU7S2ZgXF5HRFoyYkhWXjJEN1c4cSwiPnM1MS0lSTxCJy49KTVvOVFncV1EWzg6VCFYTiJVIT4ua29BPXUocjVjJDRKMUtGcFZqZ0pxPW5uL11qPEI2aWNoaTYxSDhnbls6JWVXWmVjNm9wW0AoQFhQUlYxOUxfQzpWU0g7YVtySGlNRT8jQyRiSENgayRUTWIzIztIKV1WU0JiMTVJZj0zbEhQKkJlcjc0KD4tKzhUcXFsOS9nJF0uRDJISU9sPGUtMT9gSUlaO2NPcDgrVk5xOS0sbis+LDY2X0JtUERgOF9BSSgpKzI5NTAhbllNPU5VYSEsTGsiOCJAbj9KZ0tLUyEjaCt1QjxvQHNYLlNRKzg4WS8uTE9cRCdxLVwyJVFldDcwZ1tyQ0txLGhaLEZzJ0RUPUtgZD5JN0UvWFpsdTBqTW40JUFxM2ZWLzlkQFxTZlEyJjc5RWNJKTdAV1dtXUMxbzQzK2JdIU8oMzhdNmRlImlnKmFfSlJdcz0uLT1GOCJHUT1hWVpmS1xbZHRUMU48J1loNUFsTkMzKyghPT4iJmtDPUIySG5jVEwycEhYIzAlTVgyIkFnMTAxPUBRYVBaXS9OMm46JV8lJDtQRk9DLEc+Xmx0VCJwVEs9LVAtQmZKQFlcbC1ZKklJTD1LI3ROdTpUcmJVUDxibjkoVm8mVE9wWEMxOyFDTV9NdFRYNjdtWG40J09KZSVGckUnY0snUnAsK3Azay80QVNSN2QxSFFpSzVfTFRjTC1IQHFVSlouT1VHQDctcUhjUEgvTUheJXA7KSFEZlE4SWhuTEAqLChHW1ZcakY4TmtKL2VmLDlhMjEiSUc3LGUrSy9FXDo7JWlcXVJPdSheKEBaOmllREYjYWdJOTA7WytaOzEkc0swR24qP05Wc2B1RVQwb0tcXTQ/aylvcSxYNEVjSUE8Vm5yQ14iK3NAXi9gVFhdTEc/UioxMU0xLjA2XkFKPVBYaWAkRFtbJElCWTslciFHbzdHIT45OVpAPE5IIylxcT5aZDc4V0JzXitiZCFrYVhCKkhmQDVGRkQqbS0iQigpczhEQWMuZilMcCspJSxZXV5SWDAzLmUnM0kzVSNvNC8yNnRxUU1eZiJpRUAkLjNGLC1sLnMrZjkwT2tYJmNqUGJJbm9QR0ZDUWgxPjFTTGNNZiZxW2JwVGkibSwzZidVPnRJam1lcF0nYUVeYDViNjNLQzojRF4rZFZaMDxoZ0BiWGE3TmRdT010MV1tK1tSKl0rMmsmQiRDYmVVLlk7ZFpcLjYzQzgjT2hnZV9nJidDYSYqVCRDczVDPC5pczlFTFAvdEdaMmVTP2hMTkpnMiJyaitwQjczN183Yz48c2ZzUUVdO2dpTnBuI04rIj5PTD80SUZCPUQ2YTxkTSN0YlcvOEtvPT81RjJqSEo7TiI1IVlsPXQ1WVdASy4sVyl0SUhNQT8yYSpkL2ZTJENNVERxMF06JXEnPzQnS1lpYWghTS8xPVJlNzxANG0tTF02QiYtNXBHbWxYPylNPEpIbllaYEhUMDhFRlNSSG1HUFBYO1M4Ii9rSFdYaXMmSE4sajMzZDZaTTtPQCslOTghdEtKcFFcaSFLJFYhMy9tSG5nVypwcStMPEBlZzI8OkBRSzprX1c2M3FiXURvYGhBKS82c3JLak09ISJpVyVQJzJvKWwlajQ4TFVkTiVUNDlJPyFTU3JxMF1jNmAqPkxPITs5bTtrRXJgJjhvO0dYYm4/PFYrajU3aykqdDpJZj1lU1A+MERkQGxUP0ZOUVtMLUJqRT1WayZuXj1IT1BXXyRoPmZUIlRtQEdVOFEsI1pBJl5dQVIoNEU3KlNEU3EhU09qPFNBa0lGPi1zRkpedFEtITRHaD4+VyFcLnNFUFxbRlpbLzxPVFxCSllgbHUwNC1cMCs7TWNdNDc7ZUtHQVFfdUNCVlRwZ2JHZStSby40bzMnPWFaSSdeVG1wKz1tdThCKUpBNk0mOWY2SmZEKzdkS2dkJS9bbUBkM1NDYy1MIUNuJ2ZBQysiMXQ+LyVLJXIlIUgyZjZOTVU8VUJ1TTwtNi5NUUlqKUM+JmIrTCUuX1YxOD9hL250az1cXnBvTU04JkxfVXImPFc6RCZNYXAoQXQ2Ryg5Ik5rb1RSPjc3bDRcbzBoTzxmbFVgcj4uNlwyVXM7XW46a1IoZitNczBlWzBWTi5SUXIxUk1wMls7ckAjaC5LcjZxMSw0XzZBbS0qWyxVWldpIWxUST02OUtsNi5wZWlJUV4iWXRxczMoPXBGKlclWylnQzwhbUVOJ1s8c1Rnbi1DPHEoJCw4QFQkNypIYDxiKW9bLSleYTFBbkU7WHFzOikrWVJyPzkhayhiW2RRdWcobTcrOXJdMUJkJnM7S2JnJUs7SFUvN2pWI1xjMTFoXCZCNCtdTHNpLVk0LyRGUEFbbDw/US41JEBYJiQySEhWa3JcOi9nQU9NYHM4cCRoTk9da1YrL11rMmMzPnJnX2hOPk0jIiNKMWBpbERpQVxOQWhCOVcrNzYwWEo8cCgrQlshWmxIPTA8VGlPZDAqWHRQKHQ7XVY0YihpOFg1MVY8JnRVIStWKllwWiMoOCJdNi9TRCFvNms5SUZuLV4rYlt0LTpcX3MqYmFpYFlPbldTVVpaMVBPWkFRVGhYMFksP10wW11FYmUnUStiMFg5bSNPdFlgQjcyMEonZz44WSZFcy9TZl1PZWoiajcxaENtUGF1J1FlR0YhIy89OmJRUytLdW9YUDpfYG1STiVKVk8wYklyYTBnYiRjZzNCcj1aPXJCbW83RGc0ZiVnX2dhU25VNjMjW0ZgbHFVdS5rbiFgZ0k2USs3STZoUzdmYmwmYiZYZi5Rb2tmOkhuN2s1WWExIidmRklpaFwrO2hyPCM9SGk1JWMjc1Q7XzowZGdwPT8jJ3VjanE7TUAhO0ZWTmEuZFZbal1cWmJLMWVFPlVRTixWRDZMPyFELUQ/UzEpQUU9ZWA4bSMjYktbVkZnLnVsKjxDLWB1WjhgbmI+Oi1mT1RCI04tQ2EmXFEkSFgvcWAsLGlcRFFbNGFPV1dZWyI6MDJcSiZjYDlxTG1maj4wZDpGOCIpYk8zKDNXO1lOMWY3YHRPS19bIV8wWjNqOXJySjBTMUwwfj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjQ5JzogY2xhc3MgUERGU3RyZWFtIA0KKzI0OSAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAzOTI5ID4+DQorc3RyZWFtDQorR2IhO2Y4VSZ0IiZcZS0qcnMuPlJhY2VeL1hpWzAoLUFuLy46MkVSZSoyNEZHREZpImFRU3VzTzdldV9WIWs8ZCoiW0wsUUdcZlUqTFQkMmRtamhAZ1pIMy9zZ1xnTV82SElKM2pNczI7WW9Says6TWVBSmFOWHRca0Y6KSxeQEZMMy0xNix1RU5IcVxTXik7Rz5oSl4qLnAwPGlqLS9aWFlKQDBvMyF1YStsJyVUaWZYOnQsP2xxTjlRQipYN3ItLy0qYz48NFtFcTpmbHEnMStgUksqKGRzNVddWjFrRT9JXEA3PEZebiYrLFFFKz1bW1VWPGoyXDg5V1hDVzVKQDYpOEwvW1g1Zy8/bTIxSFhfISdAbF8qQVpDKFA9OTZSXCRtXDJaaj9SRVlYYGsyXkhpQ2JoXEEsMWU2RC1KNlkmOUczaixZRTU3OTM+QGFeZmFqJk8yInJXT0NHdVpBVS1raS9MLVZILUk4RjJfKWlFQ1FZMCtBTDJCSkdHMyNnMHJiQFNdKkV1Ji5kQC8pRmJCXmRDWioqWDExVT51ci5zSDM9Oj0+T1VuZjNxTFRDZkpRcU5nOz5CPFJMSEdAQSNgR1omaWdSJyVjK1VDMV9ERnFGL2kwSjcmZUteZ142P2JdM2ltNXBWLlNCdEk4XD5vcFUoKDg9VzYqUFZNUEE/LkAoJlFZJy8rJ0NkaHEqJWRtZS4xUGs8LkhcMFFNTzZRdEZZblRgcS1aXUEiRVBtKmIzak9hbG1rX0JHQkRfTVcwJV9cU2RGVTcqc3VpbnNcNnEwcVMkI1hDWClMTWwsYF9XVjVFXkpFSXUhIUttVGVwQjU2IWpTNTNOTTs9NEUyYCMwNldvU0tqU0ldaUosKyRlXl1XJSI+WCNQJF1SJ1tjcE4uTERrTiRPLDNLVVFjVmhDNF1fPUB1Rkw8TD5PVj9wSUZCYzddbS41T2xpbzk8ZU0hSEhoUVlkRXJlWT8mZVwwSmY6ZmNXV0FcaGdyMCM9S0NxdUpBLmNKO3RPMWduUklrU0FYOE5xUT8xdFVedHJtamlkM3BLYFxASTE3S0ZLJiNNR0d0WSMzIW9KRiFqOmNeVTxqK2FdWz8palc+QVc3YUtJPV00amRuY0ViJ11PYE4zKSoqMTIsUnJGOW9nKl9YbFhMVmhrPStZZ0hTUWE7aSozVnI9a1o3NjZ0R2dtYk9zZXUqSXJbdWIwJS9ZLypZLyE9KmF1ZTROUmc2IWg9TEcwMU5hJFNFIyxBVjxgQDpgPjFDLlwwXmwwOiJYTlE1SmtGOilqOFE8Y2luL0hkM3Rrbys7JlI3W3U2cSEmPS90YSFabUJXaD5YRFpGXyNnYV5LJTBKPjMkXksycFcwSktdQEFAJW1ZKSVLL19CSSVANUBsP0VgS288NTkhMC9CLCUsRytnTXBSdERfb0dzVSJBJ1dgXjIhLzM2M2BaallVLVBMTTInW0FyRDJnXypscFgtbEIoRTNhSTk9MFddK0csaFRkTHBxKzJpZSxOXkhsZD9bTEY+JTkrIls8Pjl0JGwnaGFKPV88JVRoPT5UTkwuIVciXmxwOFNCIk1jTiZOJk0xa05mKC4jIVMjLUNXYHNAVGZzKE49OkJwW0NBNyleSzxWYiQ0V29vKWVvWyVUSHJJJy8rTkNnZ0FKdGU+W1pEMltfWG5PUXBnUGsmUEIuN1omOC11S0FuMV1WQ189Si0oMyRiJllbYk9ASmpvVU9UOC9sZyExT0tIR05XPEIxZzlbTVsnOyFRI1NwZnJoOGQ+bUBrI2ddUS86b08/RWpcTFRBSXVSOStMJ2VhIUpFWjFAWWZxPyomTygySm43JE46MUZkO25NZi0zT01OYihhVVhzS1hlJTYjcHM+WCs0PT9NLnI5dUU8JT9JQEJcWTsqKFlAQ2E4cVw9dCkvTzFKVXFAQTlmQlJUYUchKEhCWjU8NjBNaTYtPjYqPWdxJW1pX2RXQ2VMQkVYQjlUYGctV0E6YUpbXVtbX3A2XE1APTVEJ1wzPHNhSCZlb0NhJC5dcS0pRmNiQERjUSczOSJXOXBNTkVuT1kxYzZVY0h1bkssZEZiaV5PVTBNLDVRaWg0Mmo4YChzKmc8IkJRNV1KK0Nxb11kIldSbVBMcE9tVXE4WVZfVS88LjwmU0t0Sz0yO2QkIyNRLnI0WVYmTkNaR1Q8XkJJWURXIl1JXVlaIj5IMFVURFRCXVBOLyNxbXFpL1QhajZbVUckals/bTgyWVplW040P11gU3UmTksiTCNiUF9uIls2Z01LQ2Q0dVlCXFxJb1ZwXTsxKHFWMnF0NTpBZjVaa29US0lZNDAncHBsU2hEXCFSYWcvNEMiWmhpS01OXUlyOE5nQGZAVU5mYURUO0FMZzMqKiVyLyhYS1c5aTZWPjBkYDcvO2w4YG1ZL24/R0AxIzkub1AwaV9AdFVoND4oOHIsQipycTNLOGpaUW1bbmc6KF9IQUldYSxPR1RFVGVSX0wqYTswYm4iYEZKUEZfVTRVbFAhUGdkS2ZLLlZYU2ZkMnAiWCs5b2BmUWkpbGlZKWVcODk5QFxhal9ZOUApZl1VdWpjcipTKDkxcD1YIjsmLiNPRFUsXFc3XSdnSipfMGZWKCtHXlcxPic4UT9JSkxGcmZJRC9iT2o1bzVQKExLVms7cFxIY2NcVyNkOllUXm1CLCphbjNHYlJoZzFXJzwsWTUrNlxfM0RHRElpUmdGdEkrY0NPUUFeYzIqVF4rUVRqOkFdUkU1X241XlFoS0JLTTNwbTxFOThjTSkmLTw0bjwqIzFYZkM7KWVYSkxrLkJeYEY4SFRQQDQibV84bmlfWytHI2AqKyZwWVdSVTAiS2whcWpsZCJeIUZULkIiXDhNOSJcUDlncTNqQEI4KyVWRmZiNEdtIT5cV3J1UCMnJU82QlxHLjZOQ0Y5RFpnOlQmdW4vNVg/c1MuVyNFNi4hWnEjcURgals8czVOMDNocU1tT0lRWF1aK0knPz0qVGhyLC9sXk5ub3MvU05jNUBVVjJfUjdpcEtGOkdRbUsxajdON2BwRFUxTDheVGs7X3BKaEUyI1BNc0deMTVSLltQU0tBJktPaVxaPCRgbjQyZk5ZLmFVPC8sUG8xXGl0IVxoLig5WUJeWC8zcDVfOzwuPmdSbSxmM1FXMWUqSDNeTjRkRUFyRCMiNjpHYzddLWI5WlokPlI0cUZhLkwwMz1kXElYaFpgTHFqPmxecmw8YmQnQyptVlBpRj9TZktNcilZK2xrNmBVQSgtQU0pIi1SKylQSCw0LXFUPnBoSWhOSktWZz08RmhdIXRIcGNiOzYuPTgiRmIhLGItLzE7XElAZ1BkYD1raUBJOiowTFspakkzVEJNJyYpNV4wSlIoci85LilfY3NLdSVhVT8hKkBpRVcqUTczOFUkLUk8MCw5Imk/J0ctQVQwSm9OXy8+NChNX2NidFNVUzZpZzJVWSkpPEpEY2gscS8wO1k5TXBWNiRdMFc9WkIzU1hNa2NhaUBMWkM2LEhkYXFUKFNCNHUodWg0N3JMMGdOS0JJLFdwS0NnMGgqJEdsITRfX2NIRiUmXDQyOGgiKHIwXzotR0kiUyM1L2VAWHBRQ1ZWc05sMlFqYzJmOmhoM0h0JU05SVkyVkozci1MQGJmJy0mZm1sIWlEKEhGJlVaWmM5U1JYJmBrSj5xbWRxKlpvJ1EmXVIzJD8oak4lW1pFUD5rLkgyPiQ3ZC82MyQnM2BBYmUmUSJTPSdkR1oib2RmYyNobz1RVFVSO1s7dGVITFEwRkRpOkswTSJucEo/RVE/Y3BxQkF1JG5sKi9QWUltTlA8SyFRZCYkSFYxVW5IV1ZaV2I7NlQpPVZTKVxYYTpdaURvcD81OT8jL1k9VHM4NFtjOWdcP29AVSpfazopXjhNT1FPQi85JTQyTy5xVG4xdCZqKW42VW0vKFZbbllgLUsnP19kVi9NIjFpZFpUPTxcYDViYGsjIkVKPTZYcUksbm1cOWYzT2l1N2czVTRWO0RsTzlbcyYpQjQ1Qm8ncjV1O0lSZFd1MG9DKDxJMjFISG9TO3Q+J1BLW2ctRFZfSldebTFgJFFYTGVJT0lNZzN0XEZgX25MVVg5OV8mKjhXbHApa1U+WkQ3RGZZOThLbydSM1pAa0VkO1hiUlApK2pYTmVUYFcxYFczWCxiZV9EVVMxSTQlN18+PDNOdDlfKWw1Z2swZjotUUc8bHM4NVxabzpZSzhAYiNbbyheUSUlQltZQGEnSiJZKihWQylcL3NJN2U1SzVyRDUlX2IqRWRUMkhTZjplX1NNWWdVcUdWailvXDwwS14sWEU2O2suQWJ1b0svRW03TDNdTy5CWU04L1YjTidHK3BmWUxGUT48aVYkSjcyNyVocz1xdTUtSTtTIys+OE9AOWhVUyhDMyU2cGQ8TS5nI1VCXXJBZV9cJm4/K3JYS0MpWiNdSEUuaHRoTGtfMVRMLURGaiosMlk+XnJlP0xQUUlIJi48RSJMX09gdW88UVNvcEJbZyRhR29HOUBBTnNwcTlHZzA7Y1dCPTE2TWFaS1sjLDNeWUw5TUpvSD9HNSgpOHI9Vi0tQ1M2W1I2NC5YOFsiWl1gYWxuPitgL1BXInRjMyQhQXBeOCEjQyVNKi45a0A9KGJiUU1PNWMlaUZvJmFBZiNwK1NoUm0lQD1rMFdOTS05Z2BzVihzOkFaaiNYPGwxXnFGLFRqNThkWTEkITs2WjpgdWIxLyQmM2okbWdncj9JVVVKJy9VXnQ2TWYsT1QxUzY6NCY6XXQjJDNCblZeISotMmNPPzpIZmhZKWIiT05hImtKVm5JZChkOyNKIV5jNW08S3E3cW9FRDNQSmRmSlFwOWJfZClIY0BlUjdTRiZXO2A3TSpDJHVlV29HVEcpT0E9SyE2RExALmE1Y0I4cG4hUy9ETGdgMDs2NWBCWnIuNzROayNJIzA7QkhFSldGZjhOYSEwQGcxImJfV3RlUSNGTlVEaF9BNm9jSEVFXFVVL050aFEqal9gZFZJc28mPXAqVVksSz1uUFs1bDxMP09sSC41XTFuIipnPjxXa1ZoMiYlZ2AlSElCS0Y9MlA6YTFgWnFIX201dEhHNydCVTdTbXRXK1lWRGghJyJeIixvOUp1NjlrY3RVU15rLjByNiNyRkZaOGEkNy1LZSlGP1tvPmJlL2M7LGg9JTMiZlMwYW0zJS4iZ1spXF1Efj5lbmRzdHJlYW0NCitlbmRvYmoNCislICdSMjUwJzogY2xhc3MgUERGU3RyZWFtIA0KKzI1MCAwIG9iag0KKyUgcGFnZSBzdHJlYW0NCis8PCAvRmlsdGVyIFsgL0FTQ0lJODVEZWNvZGUNCisgL0ZsYXRlRGVjb2RlIF0NCisgL0xlbmd0aCAyNDIxID4+DQorc3RyZWFtDQorR2IhU25DTiVyYydgRD5ccysvN1hcak9cRjAwY21SNWUiMj5jbyI3LSVuM2JpIiJoblkoVk4uLUVQNV9vSFYkaHFqMkA2aChNZWEuSlBBdVVIMSdZJWs+SDpqJXQ1TXMyYlhNUUdzXCs7Ryk1MUFhYyYyQ291Wjk9bm5OND1qQDkvMVtYNnBHZjs0KiJtYik4dDhDc2lwa2IuKiFERXNNIzpMSS8iSWFFVFRxWjMqMWAsUjIxTEBPZWohdWcpQkhocDdYOF1VQG5PaWNLa25zdDctSGk4OmlJPF42YzI/ViFwRC5oPm1CX20vUHAkPjdCPlw/UzAwLUddLiM9RFRzNkpSJF4lZTQmWidVLydYYEFmKy0zJVwyJlAyRC5ZJzlWPzE6TyQnSTY9ZCY+QDQhOiVIJ1VvRFNXYjZCPWlzO28sSzU2SjxObjtoMTRpOWM5WyQuRG1wWF0zUUJTZS1OJGkvWWxcZG1CZ0VrMCU9bTRURE4jQW8mZy9UT106UGZfYUU5TDVvZzBvN0pAaDFgZFheTHVYSUoqRE9ZP0Yzc2pyY0dsOzBZaDpvOzQzSXFGYmxycDVYSUQqVi0rRzEnbGptNUIpbVExP0BfUFw6L2tOaTo3WmpBIzlzciZhUlwscFA3JEtKTmJQc2oiMC9CWk1eMFAvQSxTOVkvbDFxcCdGQzJOMm84R0E/Nm5ON2FlQFwrcCovMUNrWGhxS0lOWTwqMkEoSUFPUFdCJ0pnPTZrYlVcUCwqSmREOjxDTltLTFY4QU1WVjVML2tAY04oSE50Ti88NyVfRkpyW1NkODVPLSwpJiRiczQtbDIhVkFtbyFJT21JIyFzUCZYRzV1VSRfOGVcMFtURi44YVZMcU04XjlLLihxMjQoK3NbTSRlUHVVSEkpal5kJzsoVE1dbmI/Ol4sbVZBMi1LLTk4bSluQjw3JSJdLUdXOCpmMlg0LVdjbCkxZz9qMGojaTA9RUs0TzxHZkREb2U6RUleWWNPYGlZRmAtNE1xPyMyW1oqcDNVKmdBbTxcLkUoW0FJby9GNDo8LS80NjVaSlsiO3BdTElIKWk7OkRYO14lJlpsbTRwTCtUPD9IIy4sKk1QIyMuNWtfdDNhLTtiazNPRiVKYSUra0NWITRyZzZgQSxIIkdtZGtDPjdaN2wycWhhQl4wK3VqV1E0LDQkOFJPZTtBOUtqKnVpWFY1cC8kQyFGQCJuNTZJUmA6Jz9HWUZRITlTUUMqRmQ3UURhY1hsOC1KKCg8XjJaPTw1Wz4haVhgLkNtW05tXlAidTA4N1BZW05aWXM1ZGFvbGkhOFo6QHVIVD5vci1JbG45M04wNEI0MXUtYGhoTGdxbmxkNkQ7J29DNWRGbzlhJCJLY2JqWm4rYjoyJSxkPF1VR2MoVW1ALilPXz1fQDRDZSchdDdQJ1c5WUxNNzEqaSVAPStbLVUxJiMpIjBSTiVZOzJidFRCTzovKl1AOUY6bDEmQ1xuVzNNKERdZGZPb0xaIUQkNmxzYVFMIShLWW5nKmZfPm48dC4wbGJtQztDS1FYTjduIzJfW08qPmZmZSc5W2RlYTJ1Jzo8bE1mTC5yNFttXGMrQ1wpKjcmcyhhYk84cyRHQGxTVXEybls/QURKNWZsLHRAWSNsRGU+Rio+aVRGPTVaLiMqLCRZQzJqTFUsW1wsLFkvPDdcZ21HTThoJSFENiUwXTpCXCI6QW5uQExzPDtZLjgkIltXSkljalxrZ1hgKTpXMyE4a1g3bCVIcnAoXk1ITTJxOjhXREsuIjMkTGY0YkozYy1zbFwiKz00Ty5zZjdOX2ZDWG9tMXUrNzc7Ii1WdUxYZXRWaScoSyxxUmVdSnVESGQoLkYyNVQzWjE6SmticlA1PStjZVZUIVNmaWE/MS9NJj0mQzRQclFYJkpaOCZBOCo5YWg7QEc9PzgyaWthb2AvNDwvYEg7M200ZjchVjBGbCo1RCNoaUAtYSldJ2ZgPEFpTzE0IWNaamZ0ZkFnLyMlNkNzUzRXQiFgQiExLVQtSV0ncSlqS2BMTFM8PCY/S3BvOj5lKzBQRWhlMURdcTpOYGQtUkZcIj0iNCU8XmAzXygxLSpSSUFmJS50OEV0WFwpPVFkKHFWWEEkIVYoSU1JLCJuJypOPjRYckNvZS4pbGxwUS42NlglSHA9OU1LOzsvRmRoRldRYDhhXCJhPjAjSj0hL1lrKGhrQGEhbWdrMy4jbVk0NWRELG1yOkpoYFU7L09yRVc8dFFNJTo7Z2NZVHJPSihPMz1FUltVLydVQHI0NFQnUGE0aVN1bl9ZZkA4Xz5YaipuVS5EZk9kXyUrOkNeUzdtM19AJk9PT0NOS11ddG0vYjQpJi9cI0JBPlI1NS5gZjRKJSxmVS9CWmEwISQ0ZT5tWyQsLUZKRzkqQnJzVlFzPlY/KEdjUykiXEhOJlxuQ2RZUmYrTzxlSmxvM0ZDMnVDYG4jWyxIVXJnVW9cLHIsXCMldVRqOWxMN2syVUpFI0pkKHEmSip1MEszKVUvL0s6MygpMk4zbShMK0JtI2N0ZDAuZFluIiotb0o0ck8wPm5VMGwrLUBWYFpmYGJ1N3M1YV8yWGMvO14oc1MzaTNxKUIlPFNTI2YjQXBvUVhjWj5JbGg1X2tdP044XkpQLTYjKkIqV3Q9aUdITSpDKlhfNEdfcS88UDU7ISloZlJIPGU1YkkkUDBmXF0lLj9OZlIhLi9lXjc7MkU6czFNPSEmY10wIUkwU2diKF9JJkNrRypBLER1XmZdLFMiQTUjKyw1I2MmcG1wPDsoMGpoWzlDOi9yVT0rNmU6ViZtU25cclRtQVo6I0QyQkA4aCtCY1M9WmpqZDNzYnNuY1lsbipwJWlVcDEpbF9wO1o4NWc0YypmZ2g+VzcpamZmKkI4aFtJVyo6MFk9I1pZXjw+L21vP0RVUzQySSxscF9fbWMvQFA2PV9ZSVhVUS9FSEB0TS47Ym8/KkJsUi5pMS4qUU5rcl9BPmNmPSMjJ0JRJSZERl9eSlNldSpUT2pLM19BQGszLkVRKk5mMllhPVc0a3IxP0E7QkYlRyhZVypRL1ghcW4iUjxvaidjIiRlV2JuNG06Ym8ibllXXCI2XytSRC5YcCI2ZCU/UUttXiUmSi04ZnE1KFdOUSdNR1sjVVI7XVt1RiFoaUlSYG8yLDpdWF9eUU8hR1ghYmtmVE1ZLzZadTRvI28rbDA3N34+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI1MSc6IGNsYXNzIFBERlN0cmVhbSANCisyNTEgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjI4NiA+Pg0KK3N0cmVhbQ0KK0diIVNtZ04pJSwmOk1rdXJhRl5MRkNcSyEsdWE2JCpCQkhYUz0+YVQzY3VNZSZzQ1YnISFAYUxyOmYiTjhWcjxGUytcZ1VoNkZzNDhSKiRER0wnUzQ1VGciLXMkK1UrOjhXIiIvOlxqcmtvPjlVKW8yKSdTNSguanFWal8qNGFdNT4wUCdcYmtOcHQ3P3BBPm1aKyhrWmk9T1MkKzVzNjlBdHRgUSVZbGFfK1VBb0tgcT0mZFFqbWNRXkFmdHNmRipGMEAvO2ZVSitfUjJwUmErYE84JU8oJypmLTguYUBcaiRdXD0jRkhDO2k8XGI3JmM5PiIjP3BwXUoiMUp1K0JPYUhpQCldSE1eZyVoLjJ0YHFxWiZrNEY9PzRfdGlZUWY6V3VlQC82QV5zXW4+LWhENUQ+QmBJTXU6ZWQ1IzlpPFhzbUAsOm4yQWVRYV8hajYqYEEzWG8mOGMqV2BNQ0dxS2VhUzVwQyNrckwocGpEUS44SXFXdE5WYVBQSWVWOXJDUzlQJ3EvQCVRa14nb0lYP1JbRU5eZkIqbUJjUjlYb0xYclVVV2NRQ3VCMkA0Q1VZXjtkQ19DUmkhOl84NihuV105cEt1aHIpUENCNFYyZ28tK2luIjBNTyhdN2VSZmRJdTBfR2RVWCpCb1lgcU5DX3JUWV1oLyxZbnJAcF0pKDQ0QDY6KDopdWMjKGNxOyxrRmskQlZpU1onTXItLUo5cid0bU8raGRhdV1cailHKzdHanFUcEpDOzBDRktkXk9NR2dJPj4mcCZYWz4nJidsPV47QGo9dT1BNS5qQE43WnVFWDdgUUUhUCxaKSwuMTxbT1xKLzk7YE1hbDhhKTwmIlo1N1BlQSRIWihBNVJBLlNcM1tqblhyWk9hcTxkTkZKQis8NTlqPEooLiY7VHBxLUVpQmZoV1M5Yj9QY2dQTVU6SDMhOTFIWzUrVkhmJWFiR0NPUktvcnUwcWJpbiRxS2k/amJDbThbaVx0PF8zVGRWakxpXkIkUkcxPydFXDpgTEtEZGpqPjJQJTY7LGgjNW8lSEphdTQ7NSFaKD5eRXRWJmYxXTEhJT9ARmttSW1PXS5BRk9TWmRUdGlcbSR1Jm0pYVM3cWI8SnRfLT9lJl4qITcjQiJkNGhNVSlsQSs7WCFSc1FCO2QxJiF1ITI9PGwjTFs8OVBOZ25hUk1ydHJnNDQrZkZWX1lkYks3UDkhbDsobW1JWEJgUHRPbSlxOE86a1pJbSFPanUsV2cqVjNDPSU8JDc4MDlhRmBzWFBPPHNcTD9zSnNoXENxWi9pZ0JWRCtHVltmRVI7RyFbKWo1MTstLi1vK2tFXiwvUkNkUmpyW1hFPHVoIz5Mc2NXb1t0UHUqUzwxbHFjckJlYmUkQjY1b2AnWlNFaFMlPjJgOExiSlwoVDFmZG1CYl4mM0heMWRnWllWTmxxL3FgcDc1NVJfPFleOHNAME5qWWphaV1pR0ZmIVhmTDwrYWFeNVBsIUF1MjhJQ2lyYjhnOC0+PSgvLWhWO1Q7QWVCUi4iZnFUT2JTWjojWVhUb19uLCwmIjNtWyg0Oz9ERl49LW9eRVNtZ1p0LkMyWWc1KyxwOnIqLEY0XiVgPWJfQ1FINFRnVlgsdVxmO2hMUSMzUEosZFJEJixdMVBmLUpzaVI6IiVVVXFjRjtWXU1LN1E6XWFbJ1RxUkgvPzNYVGYqbEwkKyVNQWEoYy8lTVVfcSgrLzBrQ2NcaEAjKj49UWBGLURUbW5tKWZPNVMrUiVlYjFrVCMkPDlXNCs4NGBHdWoxJDZYJCM+NUhbQCIhbXM7R1FlYU0kJEs5PFNPOGJoIWU4cUVYI1RYRypOSHVyM046bSxnNGFTLmtXVjVUTjluLlttPGJISjsvZUUkKFQ1PTY4RSMkOjdQMko2KVdtN09ZcTw9JWRqSVBrcjRPUGshIVBlPDRCOzZPaltMSTZDcjBWZWthIVtAXUo4QyluQVI2cipvP1NYViRtQC87Ly9CK2g8ITZKMDY4Jm9nJCQ/W0ZyYiFBYTAsJ3JuM2BJZlwtXVlcSUc3ODFmRThVLUZhdSlPWThCTSFcWltucSg+cClkYSJpQFdpcmpSLDlxSS0oMFZEPzVJaV8sNzhvcm9TZm9xRWQ0PUhLX0glW1hFLl9QbTFMMm1jUlNPOkVSPmZeYkg1LFY1SSpjcTtaLitZJS1kLURUPCIpOkUlOyFMQSZdXV5ELVlcN0NqPXRpdWg/XlVBanRkb1hHQEA4YW1aJFpGWDpiLC5GU0ZMa1pMQjNcXCJoKlczVHM/blFNVkxvOnJ0L1c9YClJLkArJUZcWE87R2lhUVU0U2YpP1wjSm02QUZgLSxNJmZkNmY3QUlXKF9zKFduOkpKQUwlaCNiN3A5b1FwUT0mKGhZM05ZaTw4bldHbktya0VLNzs7LGQhXF4/PDdmJCRCNSFHMmhQK0BXKlREJTNealBCQDcqSWRrXnJxTD1AN2Y8bllvVipPZG1bRVBTbVxLKS9daTk1OnBbMzlbIWgnMzhJMWJGIlI/U1JKT1ImLURkVG9ocD9IUWZoJy4jIWM9MDc9OmdBST0sR1UrUzVrOXAoIXA+R2MtYmVGSS8zXixYJlFORlAwbWNHSDZYKDhHOF4+Si8xYk8vMTJuTGBUNWg6cWZFYidsOGU9MDwhJDYqQGtjcURuWkVDdERqW0khMTRSMkRrM3IzXSYocDRJZjsrTUZMXEpUMkxEdT86S2FyW1AnM14jVmNXJXB0WT5LOF42I2hGJU5cMi9qM0MxY2BsP0Eibm1UPFZOZzg4a2swYko7az1CN10/OnVGcF9NcUdbKExRQk4/Yic3Wl1BW21uK2NgKHBxM0M/T145YzhIZTdVNF4vXDg3XkpualRodDE9IVY2ZVQrJm5RV1JjJV88aUg8PVBdUCcnUjw3dFpUUmksNjozPiUzI1dnXz4idG9fcioqKlVJTEphXVZqQkc3bkBmPEdJZF42IyVcPGQ/KC41PHUuNFxHRURIN14wUnBlRDdwLjcrOGw7UVchKCp+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTInOiBjbGFzcyBQREZTdHJlYW0gDQorMjUyIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI3MjkgPj4NCitzdHJlYW0NCitHYiE7ZUQvXC9nJylsNDFzKy9mVWs4bkhCLSw3TzhxaWphQkcmYmRNWTIpL2oyTiowUWthNVJHRkBkc11wWGU6Mi5FUEtLKEhHMiszNWMoQl1hVFpQY1RMZS1qLGxQJ0drUT9LJkchImJxPTJsWFNrbktBaVhQLjZiV2gydW9ATDFbZlQyQGA0clAna1ZuaVlxV0VvNmhjUlowR1RLaHJEJlVBZCYkRVNSODYzM1g5N3FBMiZjX0dGdW0sTnMoKlQ8MDBxa05STmB1RGM6bzA6PW9tcm5OIW1INy40amxgUHUiVEluSDQxZnA+LzNRRidiNFlNY2toTEdMP3NRLjdHJlBnclhRO3BUY0AuJmlwOyJkSkktIjRELkRuZ21XUTxoUFJuSWVSaUVtJGksOUR1J1lLX3NHLHM5Ni5rakFubVVuVUFWcGprRVRLLz0naTtoP2p1a2goN0gtbHI5PyNpaktxailHY0koaFhGLk4lQUo5PS1XV2ksXEckOzNENmtrYEdKbzluKE85KS51QEU3LTxEOiVGKWxbYi1PV1tZQEVASiRgKmIwTjpTYWVCQkcjPU4vQ0liQSpzQCdVQjV0UmxpRmM3WSlqWjRpOi0nbyZfJix0KWlxR2JZWHJyb0Bsa00uVFNINUhAWzpDSExPdDtVJ2YlKVJhP0g0NyM3X2ZDRkxPWzpYS28lYUFWZWNydFdOSDJZcjFaYU5tOGBKZ08tYkpDOm4+Yz9CPSU/KVkmNWxLSVFJP2NeV0dyMkphPEMhJEVzMzpHJnVKZU0mRSksK3U5ZDBKMG8lYT42S2c0cF1DP0UzdTIwI18qXlQzWzU4a05CKk5lazlnVDAmPChzKkI2a1xqYWRiJ1h0TGxsaz0mVk1kdEl0SWA2K3VWVEgnInJpLS1SPyc3UTh0bl5ZbVxrcjgzZ1RPVzJSMTtiJiIpb2VnL11dYGs/X3UtYlpjLnFPRUZaaEFaWFVPXjlcV20iZTNgMGkqJS9ucjtCKi1uZFcrYVosVEkobG5oKlNlPXE4XD5KVVUoWy5JTTBmK0AiWmVNLEU1TUMmNERwTGwvUF46WzwsKipkUlUnQmRzUVRIMFVUR0psLy1adG1LI0hmMS0waW1MRWpzVVVoQzJTJl8+dFVBOUY0VUg6aG4/O11QWkVuNlpCT04pXS81Syg2NFxwRCgmSTdsaWBwbU1xWWEzcj5GVm1MQ0VkQVBHaVhMbV4maUZSaCpAQCY+LjcjbEJKUUQzakRyVkZLNGZDOHMmXmxhVjAwRUBXRypzOj48ZiMnaSFWSCYsc0I1UEBzRkNXTSs5OFRGZUdjOy08O21SY0pxZjBWUmY9VGRPKDpcNT9AQ0EzZ2leREUwKzQ9JTAsXj1aPVs5LU9vXEMia0EkRENBPTRsazZYZUhlP2JaTiNtbTAjQUFWPjNwUUQ+V21rL2JfNGYsVnNTYiZFYV9VQGw8UT5iTisxU2AiUmc7VFAiSSwyUS11Rk0+JSJrZGs9VlcjJVM6cTMjPG9HbyQlQHBQLl5vIlI5bihvJ1oxT1BSTi4tKks+bj9VIXFCbFwyYVFqIW9OT2lubGVfIS9NUGRwTk9LU0IzL2NmYDNXUm5NTUMnZWNHTlBQaUktUXBLYFA4KmRMMDg1UXIrPiFTXVllbEFpRUJoQ2pIJ141Li45MGdJUmFHQGZMLE06K0cmcWpRcGRJL1JCSjtDV049NmFaY3BLZ2I9W1xyT0tJMiZKP0JNaTtaXExNPF8sMTwsaGZbKyhvcTpiXnJBWVohRipVbUpUQklEak8+ZzBaRUhVQF51Y3JzZ3RURzZRU2BJRyM/dWo6XTNkUWlAYkcmKGlcPnFlUSZYaTI9NDVzVj5JUDldSCMhcyVhNCQ+PklISy0iLionNUteJFFAWidiQkRTLmZPUD5bWlcqI1AtXSoyRkhebytUUnQsNVpVaD4tVT8mYi9OaG4vPVdXXmBzRGhsaFAja0FjMy89Yi83P3JnMXEjJjEsa1U8Xz4qV0ptVi0tImVQLGJKZS5WIjFXYGdQYV9EUDMlTUw/XGkmRFVvaV8hcVdlZltOTWRrXVktMEkjZSZZT1tfXUF1ZDZFUyw3I0s/bEhXK0ZKLzo3RUJTZWolZkVBJmlwXkNBYjspVVJoPGtLTltuIVU1YDlwNC8sUjA9RDEtXVdyNl1AQ0xecUEmYlFjUV1cZTJhY2pVPi1tMDJTbGErazNbKz44OWlkXC8uJnNDNWtuKmVxaSJccSRBZmkwX1BJLGIuJ1ZlLyIpaEklJW5BWC9uYTdZSHBmLG45OGkxNDoyUV9DZz87UmwiQyFRUlFeSzYyXFVqT1RiL086L1VpN1g3WyM+J10mLjtcQjRdcjU/QF5SOWIybigzXDw4RXFNIig8MnFMVGxUSy4/PDduZmc6TChhZGcvYTxPIWonYFhWYCpAZmtWUi43XFNJZHFRJGxTVUBdT2pgbl5YTVFlTV9bXl9AUkZrbmM/NFkwYERILGtmUWY/ZWdnUF9ETkNZXGM8VCEzRypiI0JdbD4payhWKltPS1EkQlQwY1NXci1SRj5FP1ZjRixnQkZbXW1GNFU5cElqJVcpbGwyWUBfJyk7Oz5wVE9dR0ouZ1E/LConOT9qZ1ZYZFBENj81UChAXXNjO29YKWFNIUYuOlxgRC4/IlNVYmAoSilfVVAmVGhxO1onMDc8MiZLalAiVl5VZTcnKWAtVyYxQlVRYFNjSGxoWy0wVjFyVktdO1o9MEZdInNOMypnZi49VClkPERvNV1HYWIuVitVQjU7RCViViNrYDtdZUdbMCN1SXMlIz9VJj9fQDMyWFNbVk0hXXU/WEJyVElFcmVKMmxRNyU5bk9KaDVYREFOQFIvKjAhcElOKDNlVj1mQHRFZUQtbWtYNTZJJilMbyk7R0dOZEppKV1TNmghYCRNNzNFPTRCNUYuc1xTLl1CXmVLIWs6PD4rblhaOyFfJkg8R19wP0M9MDdWZSNsLVFAM1RVNyVAMiknITw7dVRZVjljJCRnZzdGOkNrYF4wKlAvXzc5Ry9RV1ApcylyZk1obCg8QEtsRj9IS0ZGIm0iMWwxRC9LQic7LzEjKltuWEo/NGIxYEE2PE43NWxHSk9uZGFgI2tSaigtQC4qcHFOU1kpU1tKM241R0NaLjgmKzZfRFtAYFopMkFoV1g6QFdEYy8uPypyLD5Mc1U0Si1lcSUsSSMqcmxPKlBYa04qJiZkc1ZRJjc1Xzc5aCQ3T2wwYyYtRDwvRG1cL2hYJCNjRmcwLFcqTyxadDViNUVQNE1rLUBeLm4sMTo5bW5UKUBEMydeVyFaKl5XJ1kxPkRMaStAZlNCZDNzTF9QK2pgVyIiV1c/UyswTGg5bE03TmNqK19RTVMyK1VcYVNaLSc8I0JlcWtSR3VUJVxES15eQkZGSjRQW2U0TWdsI24mIVEhLG1BQio5dUVxaTIhbV8nYGA8XlMxSyRoNC1USmJkV01WPzhuQko4Iko3cWxQJTksWUNHb1JaLzhbQzFRTSgxUT1ULi0vPUZqVlFpJ3FDa25PZCciV2VGZEY3VWcxQkAqKzcqPW1hM2giNEt1MzJHVm0tVzRlJG9iYVtcckxuXmJQTG0jOyNBWyFRclZ+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTMnOiBjbGFzcyBQREZTdHJlYW0gDQorMjUzIDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI4MTAgPj4NCitzdHJlYW0NCitHYiEjXWdOKSUuJnEqUFVyaDQrNmYlSDMoT2gxIk4qJzlTNC09YCs1YmZuWE1DQzI3LyNubWtIISlnLHJsYUlmVS5JKEIzOjFkRzA/Jjs4N2RYQ3Q2VCo/OSUpbyJjN0RrJGw2OV0+KyEmQWVeTUVzVEJEKFQtWlpDQVJrXUJEMyZUX2c+W0ZVMHU/YzNJQig+MyJPMkZfNF1UalVFNDZDNUpwTD1DODQnS20uWG5WNjVUcSUpVjpsLSM9NEVaQ3FGVmxKP3M0YSFpQ0lhb14/XHA/ZWl1am8jISw5ZWRURGpkKyJOXSRrI1FrKGNKVmJQLTc8dTYpNiRRO20lbUEkKj5ia3MiS2tYUC0kYUskbV1JREsyTTo/IXFbSTFTbmJTOFtVcWszUkgwSERhSGRmMEVNTCNIVkBwcyUyZzMvTCpsJktJXD0lNlIpPUY7Ti0mSjozQkk2WzRAYDh0UlpcMFxNQWY0RC5ySzxSWl9bTTwmVl5ubXI2NDVdNFFiWS1oUTNjOnJWUlBAKzxXZko5NyZ1IkZWKS0xbV9HLzpqXktGZjZBT2FsJEpYR2QvVWQjOiZfZ21FUltaPzZtbD9vXVtObDVWYDlIMUZ1W0o3dFJFPW1iVEFXLmhtXmhHZiYqIUBwJUc9anNCP0lHTStCaz8qPFhJLitXYmZWbzJBbE4yW2p1YFtuWWgpIyNUKDZrM29qNi0hNXFpIjYsQ0toMV9hIT4kMzomNiRSOW9KIyxjPzhNcT00PSFdP0EqcjcpU204al0lRE0lV1w6MUZJKnM5Qk1MQ1s0UFc8LWUiNDJxNTpVYEc3XkpfMGBrPkFjTHVraVRNXj8qbTdpLVNVOFolYUhDVz1hRm1iRUZvLiQ8WWtGa0ZKbGNaMSM7N2A1UVciRiRwW1VJQSlObUNwNiwvTStLOSgzMGRmYEIjQlFoMCg3MVYvXmlfLkQ5RXIzbEBkPyVsYWNFRCZvaU9IUzM5KFBqVDFgXEJkaT5PX3JwPDZXNU4sOjcxcm1NWSlZOlRIPz1hLEBTc2VGbzApOEVPZmNnS0AuSWpeRTNqaCJuZVdHJippM3QjKzE8Jj9FR0ptTXVdR1cka1Q0ayVydWBEcWRDJSJEIihMNWtzTnV1Y2ZbaFFsVjAmLmwlNjU0Yl4pXT0ocGwmRS9NUC8oTUFuc04hbSFWV3JsXm9GW3FQQzopI2cuWjByI1lcayRqSTpdLFFrYSVwX3RSWSxKR0dXNWQlYTAhYz5rVF8iK19OJTJuQmh1KywlPlE7bV9nbk5TZzkvdG40YUUkdUxXO0ktWiI4PW9ZKTRTUjNqW1ZBbDcqLiNaUTxgVS06cEo0WCRrKWkhbTVDTUwkbjRgQDUvSCU8Wy50SktdPkVQWUJAN18wLmtPYE80TV1lI2kmXzYhPSVJOlhNOzsiJmouJ0hJakt1NSFVQVYrJjhWTyMjJ2A8Lk9HJ2BpJWVhTHRmZ1JsT1RyZzZCX0RvWmUhOjhpWSJgPFI3X15KQlBoKTRwMW5gJFpuY0BsPUNoLklxSWc3LT0rQykrT2EwOTI3LFZIQnA6WiQ6ViE1Z0g3T3FoS0tPJW5cO2AqPGFvQSJqI04kLU5cMW5KLW9sVkBjbVNtMDxSIStKJCcuWUwvbD9SQ0ExRmklWDBnKUlkckNSL1FlU2YjV1Iqa0AiZDtoX2xbVy4hVkZwWElVcUdGWWosOUlzKnNUMFRUQ3JUXEc8NFVtcmBkKiU+VTBBUzxcMVU7VjldQywrUzg3azwjLCE+Vj9AQW05SjAwMUVPZFBDUFp1cV83YSxmZU0/MWA5WiNwb1UwY2wiOD1LU1Akal1QbVdNcz5UZlQhTV9xRmQ4QjddY0tzWE5yPjchZzVNclM2MTU1Ok8wbz0lZ2Q/OydUXGgiL0RkPEdwVXMtKyZFWFxkSk11JHE7bFVObys5OkAmRnIvTUJHZWQyXkdoLUhAOSsjPHBAXk5CKVEub0M1KDsyW2cuSSFaNFM9dD5CJVdyZG1nU2VFbl43WDE5Y2VgPDheNTA7Ik0vX3FGSVNIWkZqJ1VEWGNCXihzVmY+W1dua0AlMjJQJ1dBJEBVOmtYWy83QTtoNTBJQ2dzcGYtNk5BanVvQF9bPTZfXixuWmlyTlpjbT1AZDNEcF9xJ0RDU1pxWEchR0RhKGkhXC4xcD87IUhNTkNKYyl0XC9PTEMwYUhabjxhJiIxcT9AK1gjOVI7MGNeL1BMYk9YYnVlLUxQOS5zZFshR3A2O1tcMlZBMmFzKmpeMCRJLWRPJkVpI0lKQSgmQVZwWXFcZWcuNjwlI1FHOUdRTWdVVlBDNmolPWIrciJLWzQobWdVIkJaQkgwJEJMPF9zLEhLNk5KaXMuJEJNRnIrNipbTmssWGIqUkJMJUBbWW9SWUZCNF9fSSJJYC1uRjYhQyVSPS49MDRgP2FOSjlAIjAnXE0zakJmb2ddNyc7S1IwJWFNJHFFR2QjPDc3ODZ1clVoK1IwR09jUWwzUC1YaW5uRk1ASjRadGxsciY6QGtxTllUYW1IWWxVT1RgMCo6KTA+XU9lYi9oNms7LmolPj9iaWlvK2o+ZC5zTnAvVi5sLjpJb2JzO2NnbFJ0Xzs3VTZvK2staWZKZzRiaHMtYlZscCRRZUNAJm1wRTY2XT81Tzw0KFpfJksuWTRFUSVRVCklaGZeWi9TWUFSTl9JPCJxLCRbPEVsWHVUX0ZbJDs2UTxgK1haZHRbIzdOaFYhbFEmPk4vNEo7PDdYMWFGTC5FQFk/LFNxP1VNL0xPLklwQFxiMixYRS5WSEI8RjJXUiVnNz5GZkhDKHVmZk8qTF5pbDQlKmFjcmFQP2ZBOiE4QiFqK1FWUmBeISY0MmxOPUErbTRDcj5kJmtgTmdpQEgiK25qRFNNaVxccylgVSRaMCVFSjtYOE1MKFg/LS5JTyJNcF4pYD1iVlcnUXBuUS1qbSdSPF11aStORF5NVSsxMk1BOT5pbUo2a0RAJGY7IlxXSiUrMCpzR0xYImc7MSs+aVRoPDZETjE3LXUqLy1cZm9DKW80TDpQZSRwLiowMjArK0cmVl5SImhUTzRtT14sYihcYCRnLVRESG5oWzs7KjZiRitfKSVkLzJONG9TWCEnWGEldC1LdVJMQDtLSkpzVypLZUs7SVVjSz0mSFM3UEEzXENwPEtIMiVkPlQqSlBwVHE9SkNgYFdbNmJIYnQ3TlxTTitZLWE5SCtUPGxBJV1WZ1o3VHEtLjtaWSY9XmkvYXRdKV5CLyxjL0MxPmM8OXUla3JLWTouVWtVXCtdYShUQSEoai49QkNZJjxMaE06Zz5dXSZUOTJlQFhucDIhNmlNUTswO2s9aj00Lio4YC44YFJXPFZOMWVca3JQXGU/Ny43LVwhY0Fqcl9qOSdtNSs6SChsay1tXlZpWTI4M3E+Xls9T3VeWzc7LTQ3aWM0bzYvS1hZT0lYQG1WVmorSGNiLSRIY2JLPUtDOWctYyExU1xpTzpWRVQlTU1naUhDJV9RWShEYTNocFYrLVlBVVRJPUtuViNfJk5IczI9PSRvSk0wOnMvRSVDXS9KL0RbPlJhWGtkQSVBQkBmZCpbcjVGWi1tJGc4cD9CdFNhWy4vPT9WXi0kaCIuSWw/TEFJIkxDSkYjOz0zRGtIYjkmLW9qKWE5O1tkWlxkPztZM0NgZ3QvR0FFTF9wTlBBTzVDcVdSTWB1bCYzTlwlL0IqXlZMcC0yTWdjWC1+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTQnOiBjbGFzcyBQREZTdHJlYW0gDQorMjU0IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDI4MDQgPj4NCitzdHJlYW0NCitHYiE7ZT1gYD1lJnE1JWlzJE9RJ1AqLXJYNEwvMHFWLSVvOD5xOW49SEZMPzZxXy8pLGlrdGhPYFcyN3FuJ2FGUEBmViopVyZVcmZVYHVLbV0+KlVqbFtdOW5yZCtEczonJig5XyJlb1s0PEc9aG4zU0xVYEVSVCNHa3A/X3JxIS9LOyRhbyk5SSQoVkMlcFEwWDRzL0QpZ0hmN3BGZm4zV2E8JFplPHMjVD1KWGwjJVgtbi9bLF1ZbUJNMkcsaycoZShjK1xiSkRtOSI7RHVZYXBxYyNmWGRbK1BZOVBTUzQtMW5ZL0RhTnF1WGMuMXQ7VTViYmRZLj5eLkFBb1o2YE5RNzw0VVh0JmVWSDphOi1xMjE1amJnJjFOKXE1OSYlTTgkWWckIiohXm9FaEMvKGVGQzBgJmhoZlU8XGQ4LV11XVZsW0lQaEVDS1Z1VzhAMEdHJDdHU0I9R21ScFM+UzgtKCtbNGY6bld1czstRyMpTUlIRTctMEQiJlVXTUFRUDdRTWxXYiFFa0xASSM5TkJIOmpGKlhzNnJaKjdoLjBQNjZpISQ5UVdoVFFNLUZDaEZNODhmV2MyI1dXTksoYUdCRTVvUTxWcV0tamxyZzZgWkskdC1JSEssSm1eYkhKNzEpcXB0M1IxKk4nUikhVFdDdFFVKiNqM0UnTExjSFZVSXAtS05HZENpNyotbVpfZGgnQllLZm9kcDlLW0EnbD9hMkA4SkFtNXBNVywzbTlNUVZRNm4/UVFLI2xySUQhJTJSJFJqWHROWjFWZiJqO2dJOS0hTSdBRTxvMEVaJCt1Vmc7dT1vY2RXJjtDbDdvaWZFSC9oK19GaSRrOV5XYV08ZUJJcEpaSmJFYF5HLFFYPUhhdUx1bEwrZHNDaFNiZyYmWWt0XjhUJHFSI2RURTQ7THQqNk5xOU0zZjVeJnFxZz1eXDskSUpUMSsoM0JIZCs+aEtgaTtlMnA4O1VRR1k8Oz1gW2lmJWYsWjBFZGhYImRDQ1wuUUpiVWwrNCdMNWJIUF4lUzpJXktTcycyV2Q7RVooVzdPQjtQXCFDIT9eQ1NQSCxzN0dNJSNDIW5xPThbQDlpWDooXjwpU086VkFhTklTaW8tTTAqSnJxRVRcTzo2STg5V3NuSiEzWTA4SksmP2BnZWJLL1wpJClsaXE0UVE4QFNKPUhTcCVsQXVGK0liXixnXDk4WmhISEpNV0ZKWWUsX19lPipnaVIhTlFhLzFlU3AxXyg8YUlfNCQ/b1UhPF0zQC86aFgoOnVIUFxUNUtnVzJaRzMsVTlcKkYoMXBGXmsyZjRPOmpaOSg0T0tuYjYyKTMyLEsqSU5XQ1ZMSCE1WS1ZRE9jcCstQydTZmFGYi5HP2xlbk5XPm1gbnJEaSVoW2pQTSJAdS85RCpeLm0xLmBuOHVMJVZdKikoQUEyOGpwbDdTNGFWO2BLMmMpM1hKXXBXQWxxbDN0PGRxMVIyYHJeNmlYIi5WYVYvb1FIaWFFR1hbb1s1PmpPblFVWDQnb2hDYkdXO2wqWllBZlNjWDQ5S2ZxcGNjLmAxTTdia20mM0ArJlU4JUpDI0RJVjdbLlJjQzpyVjMmTDY8WilPOWxwVzcnXHVxalUlLyNSaltsO2xYaHBFS0YhI29oZTAvalphJiVPRSUscTNMQ0E/Uj5EPk4rXWBPa24zaHVlbk43T1lmYF49XGs6PC5xJSMlcC5cQz10ZUwjOWtdLmc+dCciLSdtZmFLSmpqMS5PclskTkBeJjFKN1lNUjk+QlZqQko0cyU7K21PRDY6OEw6VmlhSWJzcGhAImBoSSoxJjUuWSlNJlchPGJHJVtPYitVNjVtWVQ8NVgrXzsnWSxBI1c6dDxdVyNsXVBWSCpYWWsnO01YL14/ZmFcXVNLYCNAbC9OJz01VkBZMEwxLCRSMGlqTiMkNlA/dCw9XFZqXDBcIUBMOWY4WEM0Pk5ZOHBSRFUrJFg4NCV1JWwlRSQrTWQoNmw3OG9jO11cPjReWTglc0k5I3JhNnBhLSotViFIOUMnTWA4SD8jT25XbCtEJUs2WXBMRTJBWStpQV47NUxVT3NiRlBPUDYkSFE0cl4/KyFVNyVOQG40KiQ0UlBKYTNHS3B0JD5ibTVTU2BhZTBUNW47PzcyWFlHaiJZJGhmNGJWS1lBVyIqSV1HP1tvYCFTTXVoaEheJmQvKU9cV1A/Zz8pLD5ySEFXQC8sNW5MUXQkTlhxK1s9OlYncDhvL1MsV1w7dUNKJmpNQVxFPjxrSTlXdTtWVz5xcV1lL3MuLSdqSk1pIU5TSF1zN3JJYld0TkIkUTJVSl9AZ2k+WzNsVXM2NzgzYVNSK0xIKFxuUVI3bD5CYjJBSWlMLjs9Q2lCUnRmaG9VcnUpLm07WTlyJksoLCI7PC9hZ2FpYFhfLUZgbGRYTG1ZNE5haSMnXU8zYissampbPDxDc1oiZSlhKkI2dGJlTi9GXik2KCpSKi0mOzVfR1c4WEAsS0FzZERrLChSQTpoVz1GJFAwIjBKNTRfUTBGbERcJTUuLkJTIlxbN11GYmZZOl9uO2MmQjZpUjxhLk1KT0BpR1A9TVFNKkYzNzdUSFolIWopLXBaQW1fXXIyVEokOGBaMkVUakE0YCMzcismKy1aSiInXmxuWy9HdT1GPj5TUXNnZSleakpFU1F1TC8hNFRpZl5DPDJQdDBaXSs2dEMsNXBkSDctdXBeSjRpXzpVUyxBSk9hLkldYy9GXEIoPllxJDdhUVslclReRmpbXVshcjBRUGxKW2hOJU8nRTVGVSpWWDRsdTtiWDRSU3M8NjVkWy4mamRgZEBiWS1tXE9TbC9FTjtcRV82WyMsaEY9MmQ+IT0xWm1NaWdSdFdoRUE9IUJbbltiL21hYm5CaFRkYEZIPD40K2lJajUwa2AvTCIkYXFUVWNuTiYpREsuc2pwNjNRIjxCZTlYb0olYjY1KzNIazxlXiFhbktOa0Y3SiVvPjMvKE43XElGKkEvOTtLXmpVbGZNTGxwWV9IN0k5Y1AycmMrXixQXk5rJUliNXRKN0VnMmFiPWg1O3M8M1AzNl0iTGpFclsvdWgiXj4mZy4laklTbklaRl1NWDZTLEYvRUMzNituSz02cnJaZUJBO0pjQWNFYCZNWDlrWVVgOi1oMzJwMGs8IVMhJGBmYEBEKy1XUVhAJ2w/KDhRTilsQ25bdWwxRGhVUUtMR1Vgakg3UEJdVT8pNUg6czQ0VjJyL18xTidYI0I+RkVMR2xSdG9DUElAOEwhciRBV2JVcHRZaFhzKmVbOHM8ayJzNjVwVjJLWkwpSTQuW1MvI1ZsI0NgVyRfRWg5MGtSbUZzYVxXJWNrcCdSQmspTU9bKidZZiUqSCxiYWQsciFzbFxGcksvKjUkR2k0ckorQ1t1LFBKVUteZTJhQDw+cnA9OUYyKy9nb0MxaS1CaydcQHUpaCk4WDhacjQ4SEpfKClRaGtacVBHLGRKZkhLTVM1Oy1ML19gLVVBRywnXFVvLzIobS8+PVVua1hIMjE2KmI5bEM8XmVaUWRuQ29XSXVtQXFNVURZYHQ/RiU6RSciZVRLXCh1KzM2T0AkRVwkYSEtXDJiQlElJm42JCRANUNvQk4rTjEiZDdCbyFfMkI8PGVtbDxRT2JgcUYvJTVLJXE6PENBSV9dQ2RpZVljXUtyS0JnNiYwQDtnV0FQMXJjR0giQi4wPildJjQxM0FnRD9+PmVuZHN0cmVhbQ0KK2VuZG9iag0KKyUgJ1IyNTUnOiBjbGFzcyBQREZTdHJlYW0gDQorMjU1IDAgb2JqDQorJSBwYWdlIHN0cmVhbQ0KKzw8IC9GaWx0ZXIgWyAvQVNDSUk4NURlY29kZQ0KKyAvRmxhdGVEZWNvZGUgXQ0KKyAvTGVuZ3RoIDIzNzcgPj4NCitzdHJlYW0NCitHYiEjXD5CQU9XJzdKMiNyVz1LQzouSm5ibEpBR004TT9MUj0vVjxHU1BJVz1MXWYiTCxlc3Rhcjk8LDUvM20qdC9ERzgiUjdvYCI2XWYrT2ZzPj04JltFU1pLXlM6Z0JDKjVGcXRjKTBLYjdPYy8wIm4pW1gtLTI/VGlvNGFvLW5jbF1YJl1VMG9tcTJiMjFdRnI8M2FLJVkpVzdNQnRCciMnWWVnT2orU0hvYl06Uzp0QyVBYUUyP2NAUT9DM0hUYm4lRClsXjBBNVVtPkNHVW5zMkZxYUM0PyE/ZT0nTXNJYC5jSjJLWHNjTz1CU21wRl1eYCVxZFwyKVZLOGk4YWZlWDgkPVp1OSNbbz9BWWxLUEtqayJuPWckRSdmLjMwVzkjWSJYLyslTXEyQzJGSl5pW11MX1oqK09ONXIxV0wwO2RmPFxWRWtaSV0mcig5b0piQDEnK0xXQV8sYlohT15kUSc+SjNaX0dOT2JjVEM7IjprS1wwP1NMaVZNY2Y1aV1fNzVNXWBILitfQ19wX1prM0ZFIU5sbUhMQ00wLFtEZjg9Km11NEVbTlpKXzU5OWRZWj9IKy50YTJHP14rYUtwRms+bD1KYmNqMlJNNj5IMUMkPklvKiZsaVRDO1wiYEZIS0h0NFpnRlQxZWQ6Z1gpcVFxOCQqPDw8bDJuZ05qYSdmaEk8aFsmcyY5PmpURkdWTGosT1VHX0BMcXBYLjRyaTRuYUdtMiVKSWFyJTRcTVRVZlwzWDxlMl9DJFUuMjI2MHFtN0hHTlQlVylXYyxmWmQnSzorOSdDQURkYFYvWT1IRXM3L2BBLlwjaUpHY3JjbE5QZE9mOyNBNC0tK1I/R3NMbGVCRU4mTGI8OT5PQj9WRmMhWTJqX05EIjxHQUZdaidycSY/c11OPjorP1EsW1JyV2wrRm91JjtfJ2lTOjs2W2RoKio1MzReVTAkUVhgL1EqQ11uTTpgclU6KSlycUFdUUglaT1nK10vIlZaXiYobHMzUTMvSU0qKU9MNEhRKkFzbFk3dDUnTjNuI2EhaE9TLScoaCEiRUNgK1IqIXNKK0JLSGJWMDxqaCFxc1dISV4/XmE0Jz87ZXIqa0tlb0xkVGVuRUVKOj5JLmRGbj9wSzlRLDw9byE8dFBjOHNGc1QyZy5BcTguWUtgKlE7aEZaOFE9PlFkUWU3VjgyblsxZjEhTl05UkA+IThhOFVwNE9FOjcidDVmNzEuNlslRUhyOj8ibzFKQktEVC1yXCZqUG1HZnJFQGM4YC5Ib1xBLEBESDQ2XVJdWWJeY2JtLitMOCowK21QKy00PCtSQ0MiLClKclNrIkY1KEJHMzFuPW0zT0gjI10xYUgiQEw6O2NWIWNQTm4xOkRTMSMpcEgtZy4uZkNUMlcnV2RnUFNnSDpbQiFFJ2MlZj10U1hIQTpIU1ddRkQ3Rlk7TyhXakFFUE0mLHFkXypMRTI7TUZPI2dLPD5UREQhQC9cPyleJkUobGE+XTxfRm9nNGRDbjtiXFVpZiZGIy1LbTRDai1DWGw7SUo2YUlYLGUoU0FyU1ddYk1wZWlrOlkuT0Q/VFdnWVBTWWNaNyw+XFVXRCRzSzRQM1hANigzdGdnLztWRidWJ2lMV2wzcElQYzgmJUkiV2lUTmspLSlBQTRBIVdkWTpjaDU7Tj1QXGQwVSUyUVorR1xQcStpRidBW1tPcChQJz0pUj5SME44ZTJsVi5jRVxuMW9JMHBYMSVIS0UoLy5tIm5MTjlQZyhmPkI4SVVaTSlwZT9fKThlX1BfVl1nVlg0a180RnFhUzRwWT9eVSQ8dVhMMWFNNihNb0Y9aCNUV1NBZyJDZGkjaXNaQXVnMGwiPDNfaz1aIV02LlUnOzdESTxHIU5ZS0o7YmdCYGNkQUxBVlVOaSlDT0JXWFlMQT5RTy9VTztVWSdPcS9NP1FJWCEhWkR0JnI6OnJaSjk6STZVMyFzNyFOVHEwWiZPaTxcUTMicyFPYDlWaz1rNU0qW1c0MkgjR11WcmpaWEJiXHEqNzpQKUZTLlByKExAXEouS1BAaWxQOCtcUTg8RD5XY0BoXjIwa1cvJVJVLjw+QGUuXm5ZLT89XCgoP0VnSEZVaypvLS48MFh0XSshdTBca1NCQj0+V2ByLjZeYGtyITxLQ1R0VUFPY3NAbGxGKClPPUpOUEVmUi80bypMKmpUdGU8YkxtWF1wMmJlOyFaIyJPc242cSJnZGFyLiZVKk1cKzNjKzFEKyFXUW04SWdUPF4oR3RRPTlvYmpxVCMhazM0aEtOOWBXbDBVMHE/JmZHYyRpYzReWHUyNUNXT2dKSkBhZylMPVlcQCd0U3JhaGw5QkFgOyY6X1ZeWFlyIkhfJU1DK0Q7YD4lPjU0TyYuZmNOLVxoXjY4KUJWJTRCOFUpPz8hKkpBdUptaHRkOCxaYFN0Wl5PK0tRTm87Ny5VY3M6PUUqUmBKKjcsZmwxbFFDLVssc3BoJVVDMlJcZyIzSWM0cExtRmljUjxXIU9LU21PVWk2ZDo2O1hiTFtyR0hPIWkjSzxoTnFWQ0RvXk5HYkRfb1svckNeVFBuKlpSMXNXSkdsUk8zL2pELkBGMEpvXV43KldbR0Z0LlxvPVpuRDIjJmlRPXFBREBsLVpILlR1Y2EmT2hXOU9uJWhSQmNRJFc5YGJ1PjhOTGFeZzZIXjE4YlpJMTBxUC08VnM6TlVWbk5wNSo/KThsX10nRkBDKilvOCliXmddNDZWLGtgPjRZWS5kSDA9J2o3JjhCbmw8alVxN1IzLyhlKS5mXjcpTUVvMEYsPyRGKjUnSS9ac2wxKCJyYilvQE1XU2NVKj5oR1JZUzpZc0Y7PTYzOGhVMDckZSc0Qz48WW1WRCVwYnVQWHRJRVU0US5uaWdlSis+SSZKL25pKWExK29pJTw5RSV1V1tFO25IbWFxN0FFI1gqLjoxJlhoOmJec2o3TDhSLGZMU0ssSys1cUspX10rJzlPLnBwKFIqSWI9OjhlIShWJ3MrRWIhZGJeKkhZaT1FVEpnIUdRbiZdUiM9TSwlLVU0SnFOY0orIydiR0xYaC1TPmM/TGVlY0o+biNiIkFSJ0trbSROMHBTW2pcK1ZNNG8mbyY8MSFPaUFCLj89akkjJ1FFcTZSZzk1Wz8ncH4+ZW5kc3RyZWFtDQorZW5kb2JqDQorJSAnUjI1Nic6IGNsYXNzIFBERlN0cmVhbSANCisyNTYgMCBvYmoNCislIHBhZ2Ugc3RyZWFtDQorPDwgL0ZpbHRlciBbIC9BU0NJSTg1RGVjb2RlDQorIC9GbGF0ZURlY29kZSBdDQorIC9MZW5ndGggMjA3MCA+Pg0KK3N0cmVhbQ0KK0diITtmPyQiXlonUmZGRHMyMUQ/MXRfbV9bXXA5aTk9IXIsQjpBM1hrV1wpc2ZFMFJUUTdMKE5yOzQwamJWb2hUQ001YV8pJ1tiXmVeO3BYaz1UY2dLLS9fQ05BSCpjIVc7Y00ia1NDQyNpKVQzS3UkOSgyZ0c7ZExcXE8zaiQ9SkRjXFZeTkI8QnNDW1E/LWBVNW5cZyFESGs4X0gsSl04ITI3LiF1UFMsXGRoYk5xbXNoaCQkO0xTbys+SWxwR3MqRXBeVnBAOV9WbzxwVyozUFFWRDY+MmZxYDM6RGVjQHE0MkVVaG0xPnIqJiRxL0NLMDB0SFZuQD8jSG1PWjxuQW43Ly4uZ25sbUglKSltN1ZQLmFIUUkjI20pSS85ampQO1U/ZU0/YWktKyxIJ2taTDMhJTdbR2dtJGEwMS1iP3BgaEBCKkQuS2FBU21JRnBQUSc7XFc9VFZlJjFAYCdpVGwyJ0U8OXJdZ1ZxTS5BQDFKZFFtZmtKMFNpOUFxWCUiRDgkZ0k9TTRbayU0ZGBiS2taIm46PUBhXj4mZEglRl5TRy1Ac0NHM2ZlUVBQclhhc19cKjxtJ3AhVkk2YFIjSmspZHBwKC9ybGZMO288O2s2ZTd0PDJTbWcnXFo6cShzVytjOyEpKmtVPElcRU5yZEtOXSdGPy5YJSInS0g3bkhDUDMrNmJbQW0sND1jcSxAYkgpIVhiQVAmTSVZMUA8NlVATSkiLmtfcGFrTVlbJXFzWDo1ZTpIQlxUSiFqPTJvaCRbOk0yVjtsQD86RkA1QU5hJzMkLCFCLzBAbCttKmBDQ3I5YWFNa1psWzAmc29pO2xnakY4bmYjYTRnMFw/ZlooRzk3XkpbWmVvSlVGITJza1hhPThxLFM1OEtadEUsL0hzWV5dI0tJNEJyZ2xRYilqKGpYcUFQXykpTlJwaGhtbFRwL0NTNHVMPjpjbic2Xip1MmRtImlGTFUhVmdmPU0tcSsrM2QrdVV1VFJYakRPamZQbEBMVEJKJ2pkOjBbbG9WQikxZ1dzRFwqUyZVRyozVi80OldCJyJYVjghbVcxUzovJSI7bmpBT1w1NnNfWWJKVyhzNUtvdDtdSlUpSFQ2WWBMNztHNFc9Qm9qSj0mTkRSMC8tb18vSCNnQCpRMDFsajxjLTRMcXVUMj1YRypddDcicy0wLCQmYEUoL2hXPF9SInFgVCxFLzIyUiYmRkBZVXFzNVdWMEU5UD0kRDBGMF43JkZQSkNTWS1xcUhKPVJxaiRgaHFZX1VNPT5kbFxvJWZWY29aN3RHQFNQKUUib1daRkZdWzVwMFoqUS9XRWgrTmBsLGteJylWJHBGXDsoO1lpKFpdL0JncXNqTkVuMV8/ZE81P29KJXNGOUNxaUg2SWpXQFVZJEwmYkEuZnFiITElbDxeZmFDcmJfJyVGMSJqYVE+WElQZkEuQnVgQlBxKlJwa2NSVywxKD9yT3EwbCZXLzo9R1VgO141cThTaWttVDZuT1MpLG1tQEkoZDFlU1EqOFhbVl8lOWBKSW9YOC1nQEhpTyE6UkVDRUxtJXInaEtTXzZdYmE5VHMmLVsmMVRNRjsrVSIkPFlsSWMyOVIkOCgpVVNVPUY7MyItQU9DOF9uW1UpNE5tXS5cLGlyTUxOVWF1cXBSVl1XRnRIPUtQPS9dRzIlcT1EZCpmYylIOFByLzRXNlBCSWIzZGYvWkgtbyRkPzMxSCdUNT5cdERxdXAjanA7clNLS0hoSXQkOTFRSDVIMFk3bWI2YF8tUENQKFhlTi0nOE1iJz0mMjZoQm06aVcubk8jZ081KUpObDplYCJJdTlLVHJlN1lkb0VPIkBUUl0kWEJkIU0+akYmbmJtLmlTbT5oa0c4Z19eUTZIbFg4IUEmNzBoXVpmUFtsbUhQRUwwcko2a1Y6WVJxLE1ASyI/RiJjWHRuNyMnaFs8NzFnVWUwLF1tbXJfRkhJNmpWZj9EaCZWKj8uXjdRcXNjYSFgTVlNUC9bXEg7NXREWDVPYVY0S285aW8ldEczWWYjYnVnQ19YYSlcUVAiRTUuQj1zMFJoVClqWUV0W15mNEJET2psP1QnO1ZhNllLJDpTI28oOik1T3RsM0RGV09bTXM5PkZMbTdDXGN1RGpYMmgpMmFpSDtpX2pYV2lhJm1OZl0iQTZRJnFQVk1BTmhSZi1VQUhbQWA6TEdDND0jbz1wOiJEK1A1KDpkX1gkdXBBJWVYcUxkdCRUOWdyPExwYD5QSi4vSTJDTnQ9PTFXTigtUF8zLTVeY2JzZSdlckJVQDE5SihlcTNBQ2ghUyQibkVrQiQ2QU5uQC40cmVIZFNEYFQsXzxKN2lBcVN1NmlLYz4sW3FiZnNoSVVcc3FbYF5HN0dqUW1Pcyk8K2xINm5xNFFvL2FOKWhrWlZBIlxsQmRBTnUpaj07dVJbWE05N1dlJyxANVAwUSRaN1wzaEslSlc1L1lvMCgnSUBTNDxfNmpZPmg/VkYkcz91YF5zblNqMjo/WmAoWSo/K3RtZlllKFFBXUNQKCExMldgcSkvdVFrJ3JjQ0pKXENBYlhgTWJZTXJbXnFfMU0mMThMbENHYSQ4R2ZPVVMjTjZqLiVlPjdkQGd0LlYqIk9WV18mM0I2JiQ6SVdvZFVAQm4wbFROMDB1ayhabGtwdEFoaCo7c0ExKGI/XCwjT2YkVDxjSUBkKVgpcTwkSEEvbzVtPkRsJSpeJjxIK2kyZERoUWBHcldCTSQoNm5+PmVuZHN0cmVhbQ0KK2VuZG9iag0KK3hyZWYNCiswIDI1Nw0KKzAwMDAwMDAwMDAgNjU1MzUgZg0KKzAwMDAwMDAxMTMgMDAwMDAgbg0KKzAwMDAwMDAyNDkgMDAwMDAgbg0KKzAwMDAwMDA0NTUgMDAwMDAgbg0KKzAwMDAwMTIyMzkgMDAwMDAgbg0KKzAwMDAwMTI0MjYgMDAwMDAgbg0KKzAwMDAwMTI2NjggMDAwMDAgbg0KKzAwMDAwMTI4OTcgMDAwMDAgbg0KKzAwMDAwMTMxMjYgMDAwMDAgbg0KKzAwMDAwMTMzNTUgMDAwMDAgbg0KKzAwMDAwMTM1ODIgMDAwMDAgbg0KKzAwMDAwMTM4MTAgMDAwMDAgbg0KKzAwMDAwMTQwNDIgMDAwMDAgbg0KKzAwMDAwMTQyNzQgMDAwMDAgbg0KKzAwMDAwMTQ1MDYgMDAwMDAgbg0KKzAwMDAwMTQ3MzcgMDAwMDAgbg0KKzAwMDAwMTQ5NjcgMDAwMDAgbg0KKzAwMDAwMTUxOTkgMDAwMDAgbg0KKzAwMDAwMTU0MjkgMDAwMDAgbg0KKzAwMDAwMTU2NjEgMDAwMDAgbg0KKzAwMDAwMTU4OTMgMDAwMDAgbg0KKzAwMDAwMTYxMjMgMDAwMDAgbg0KKzAwMDAwMTYzNTMgMDAwMDAgbg0KKzAwMDAwMTY1ODUgMDAwMDAgbg0KKzAwMDAwMTY4MTcgMDAwMDAgbg0KKzAwMDAwMTcwNDggMDAwMDAgbg0KKzAwMDAwMTcyODAgMDAwMDAgbg0KKzAwMDAwMTc1MTAgMDAwMDAgbg0KKzAwMDAwMTc3NDEgMDAwMDAgbg0KKzAwMDAwMTc5NzEgMDAwMDAgbg0KKzAwMDAwMTgyMDMgMDAwMDAgbg0KKzAwMDAwMTg0MzUgMDAwMDAgbg0KKzAwMDAwMTg2NjYgMDAwMDAgbg0KKzAwMDAwMTg4OTggMDAwMDAgbg0KKzAwMDAwMTkxMzAgMDAwMDAgbg0KKzAwMDAwMTkzNjEgMDAwMDAgbg0KKzAwMDAwMTk1OTIgMDAwMDAgbg0KKzAwMDAwMTk4MjQgMDAwMDAgbg0KKzAwMDAwMjAwNTYgMDAwMDAgbg0KKzAwMDAwMjAyODggMDAwMDAgbg0KKzAwMDAwMjA1MTggMDAwMDAgbg0KKzAwMDAwMjA3NDkgMDAwMDAgbg0KKzAwMDAwMjA5ODAgMDAwMDAgbg0KKzAwMDAwMjEyMTIgMDAwMDAgbg0KKzAwMDAwMjE0NDMgMDAwMDAgbg0KKzAwMDAwMjE2NzUgMDAwMDAgbg0KKzAwMDAwMjE5MDcgMDAwMDAgbg0KKzAwMDAwMjIxMjAgMDAwMDAgbg0KKzAwMDAwMjI4NTggMDAwMDAgbg0KKzAwMDAwMjMwODkgMDAwMDAgbg0KKzAwMDAwMjMzMTkgMDAwMDAgbg0KKzAwMDAwMjM1NDkgMDAwMDAgbg0KKzAwMDAwMjM3ODAgMDAwMDAgbg0KKzAwMDAwMjQwMTAgMDAwMDAgbg0KKzAwMDAwMjQyNDIgMDAwMDAgbg0KKzAwMDAwMjQ0NzMgMDAwMDAgbg0KKzAwMDAwMjQ3MDUgMDAwMDAgbg0KKzAwMDAwMjQ5MzcgMDAwMDAgbg0KKzAwMDAwMjUxNjkgMDAwMDAgbg0KKzAwMDAwMjU0MDEgMDAwMDAgbg0KKzAwMDAwMjU2MzMgMDAwMDAgbg0KKzAwMDAwMjU4NjQgMDAwMDAgbg0KKzAwMDAwMjYwOTQgMDAwMDAgbg0KKzAwMDAwMjYzMjQgMDAwMDAgbg0KKzAwMDAwMjY1NTQgMDAwMDAgbg0KKzAwMDAwMjY3ODMgMDAwMDAgbg0KKzAwMDAwMjcwMTUgMDAwMDAgbg0KKzAwMDAwMjcyNDYgMDAwMDAgbg0KKzAwMDAwMjc0NzcgMDAwMDAgbg0KKzAwMDAwMjc2OTIgMDAwMDAgbg0KKzAwMDAwMjgxODEgMDAwMDAgbg0KKzAwMDAwMjg0MTYgMDAwMDAgbg0KKzAwMDAwMjg2NTIgMDAwMDAgbg0KKzAwMDAwMjg4ODcgMDAwMDAgbg0KKzAwMDAwMjkxNDEgMDAwMDAgbg0KKzAwMDAwMjk0MDkgMDAwMDAgbg0KKzAwMDAwMjk2NTQgMDAwMDAgbg0KKzAwMDAwMjk5MjYgMDAwMDAgbg0KKzAwMDAwMzAyMTcgMDAwMDAgbg0KKzAwMDAwMzA0OTQgMDAwMDAgbg0KKzAwMDAwMzA3NjggMDAwMDAgbg0KKzAwMDAwMzEwNDkgMDAwMDAgbg0KKzAwMDAwMzEzMjcgMDAwMDAgbg0KKzAwMDAwMzE2MjIgMDAwMDAgbg0KKzAwMDAwMzE5MTMgMDAwMDAgbg0KKzAwMDAwMzIxOTQgMDAwMDAgbg0KKzAwMDAwMzI1MDggMDAwMDAgbg0KKzAwMDAwMzI3OTYgMDAwMDAgbg0KKzAwMDAwMzMwNzkgMDAwMDAgbg0KKzAwMDAwMzMzNjYgMDAwMDAgbg0KKzAwMDAwMzM2MjYgMDAwMDAgbg0KKzAwMDAwMzM5MDYgMDAwMDAgbg0KKzAwMDAwMzQxODQgMDAwMDAgbg0KKzAwMDAwMzQ0NzQgMDAwMDAgbg0KKzAwMDAwMzQ3NTUgMDAwMDAgbg0KKzAwMDAwMzUwNTEgMDAwMDAgbg0KKzAwMDAwMzUzMzQgMDAwMDAgbg0KKzAwMDAwMzU2MTIgMDAwMDAgbg0KKzAwMDAwMzYxNTQgMDAwMDAgbg0KKzAwMDAwMzY0NDMgMDAwMDAgbg0KKzAwMDAwMzY3MjggMDAwMDAgbg0KKzAwMDAwMzcwMjEgMDAwMDAgbg0KKzAwMDAwMzczMDYgMDAwMDAgbg0KKzAwMDAwMzc2MDQgMDAwMDAgbg0KKzAwMDAwMzc4NDEgMDAwMDAgbg0KKzAwMDAwMzgwNjIgMDAwMDAgbg0KKzAwMDAwMzgyMzkgMDAwMDAgbg0KKzAwMDAwMzg0NjAgMDAwMDAgbg0KKzAwMDAwMzg2NDUgMDAwMDAgbg0KKzAwMDAwMzg4NjMgMDAwMDAgbg0KKzAwMDAwMzkyMzYgMDAwMDAgbg0KKzAwMDAwMzk1MDkgMDAwMDAgbg0KKzAwMDAwMzk3OTkgMDAwMDAgbg0KKzAwMDAwNDAwMjEgMDAwMDAgbg0KKzAwMDAwNDAzMzMgMDAwMDAgbg0KKzAwMDAwNDA1NzMgMDAwMDAgbg0KKzAwMDAwNDA4MTIgMDAwMDAgbg0KKzAwMDAwNDEwMzQgMDAwMDAgbg0KKzAwMDAwNDEzNjYgMDAwMDAgbg0KKzAwMDAwNDE2MDUgMDAwMDAgbg0KKzAwMDAwNDE4NDYgMDAwMDAgbg0KKzAwMDAwNDIwNzkgMDAwMDAgbg0KKzAwMDAwNDIzMjAgMDAwMDAgbg0KKzAwMDAwNDI1NjAgMDAwMDAgbg0KKzAwMDAwNDI4MDEgMDAwMDAgbg0KKzAwMDAwNDMwMjUgMDAwMDAgbg0KKzAwMDAwNDMzOTcgMDAwMDAgbg0KKzAwMDAwNDM2MzcgMDAwMDAgbg0KKzAwMDAwNDM4NzYgMDAwMDAgbg0KKzAwMDAwNDQxMTIgMDAwMDAgbg0KKzAwMDAwNDQzNTMgMDAwMDAgbg0KKzAwMDAwNDQ1OTMgMDAwMDAgbg0KKzAwMDAwNDQ4MzMgMDAwMDAgbg0KKzAwMDAwNDUwNTggMDAwMDAgbg0KKzAwMDAwNDU0MTQgMDAwMDAgbg0KKzAwMDAwNDU2ODggMDAwMDAgbg0KKzAwMDAwNDU5NzggMDAwMDAgbg0KKzAwMDAwNDYyMTUgMDAwMDAgbg0KKzAwMDAwNDY0NTMgMDAwMDAgbg0KKzAwMDAwNDY2OTEgMDAwMDAgbg0KKzAwMDAwNDY5MzIgMDAwMDAgbg0KKzAwMDAwNDcxNTcgMDAwMDAgbg0KKzAwMDAwNDc1MDkgMDAwMDAgbg0KKzAwMDAwNDc3NDkgMDAwMDAgbg0KKzAwMDAwNDc5OTAgMDAwMDAgbg0KKzAwMDAwNDgyMjkgMDAwMDAgbg0KKzAwMDAwNDg0NTIgMDAwMDAgbg0KKzAwMDAwNDg3OTQgMDAwMDAgbg0KKzAwMDAwNDkwMTcgMDAwMDAgbg0KKzAwMDAwNDkzMjkgMDAwMDAgbg0KKzAwMDAwNDk1NzAgMDAwMDAgbg0KKzAwMDAwNDk4MTEgMDAwMDAgbg0KKzAwMDAwNTAwMzYgMDAwMDAgbg0KKzAwMDAwNTAzNjggMDAwMDAgbg0KKzAwMDAwNTA1OTQgMDAwMDAgbg0KKzAwMDAwNTA5MDYgMDAwMDAgbg0KKzAwMDAwNTExNDQgMDAwMDAgbg0KKzAwMDAwNTEzODMgMDAwMDAgbg0KKzAwMDAwNTE2MjAgMDAwMDAgbg0KKzAwMDAwNTE4NDMgMDAwMDAgbg0KKzAwMDAwNTIxODUgMDAwMDAgbg0KKzAwMDAwNTI0MTkgMDAwMDAgbg0KKzAwMDAwNTI2NTYgMDAwMDAgbg0KKzAwMDAwNTI5NjIgMDAwMDAgbg0KKzAwMDAwNTMyMzcgMDAwMDAgbg0KKzAwMDAwNTMzNzkgMDAwMDAgbg0KKzAwMDAwNTM2MjMgMDAwMDAgbg0KKzAwMDAwNTM3NTIgMDAwMDAgbg0KKzAwMDAwNTM5NTggMDAwMDAgbg0KKzAwMDAwNTQxMTUgMDAwMDAgbg0KKzAwMDAwNTQyODYgMDAwMDAgbg0KKzAwMDAwNTQ0NTQgMDAwMDAgbg0KKzAwMDAwNTQ2NjcgMDAwMDAgbg0KKzAwMDAwNTQ4MzggMDAwMDAgbg0KKzAwMDAwNTUwNjcgMDAwMDAgbg0KKzAwMDAwNTUyMjYgMDAwMDAgbg0KKzAwMDAwNTU0MDYgMDAwMDAgbg0KKzAwMDAwNTU1OTAgMDAwMDAgbg0KKzAwMDAwNTU3ODAgMDAwMDAgbg0KKzAwMDAwNTU5NjIgMDAwMDAgbg0KKzAwMDAwNTYxNDUgMDAwMDAgbg0KKzAwMDAwNTYzMTIgMDAwMDAgbg0KKzAwMDAwNTY0OTggMDAwMDAgbg0KKzAwMDAwNTY3MjIgMDAwMDAgbg0KKzAwMDAwNTY4OTEgMDAwMDAgbg0KKzAwMDAwNTcwNjAgMDAwMDAgbg0KKzAwMDAwNTcyNTAgMDAwMDAgbg0KKzAwMDAwNTc0MjYgMDAwMDAgbg0KKzAwMDAwNTc2MTcgMDAwMDAgbg0KKzAwMDAwNTc4MzYgMDAwMDAgbg0KKzAwMDAwNTc5OTEgMDAwMDAgbg0KKzAwMDAwNTgxNjggMDAwMDAgbg0KKzAwMDAwNTgzMzggMDAwMDAgbg0KKzAwMDAwNTg1MDggMDAwMDAgbg0KKzAwMDAwNTg2NzEgMDAwMDAgbg0KKzAwMDAwNTg4NjMgMDAwMDAgbg0KKzAwMDAwNTkwNTggMDAwMDAgbg0KKzAwMDAwNTkyODcgMDAwMDAgbg0KKzAwMDAwNTk0NDUgMDAwMDAgbg0KKzAwMDAwNTk2MjIgMDAwMDAgbg0KKzAwMDAwNTk3ODEgMDAwMDAgbg0KKzAwMDAwNTk5NjkgMDAwMDAgbg0KKzAwMDAwNjAxOTcgMDAwMDAgbg0KKzAwMDAwNjAzOTUgMDAwMDAgbg0KKzAwMDAwNjA1NzggMDAwMDAgbg0KKzAwMDAwNjA3NTcgMDAwMDAgbg0KKzAwMDAwNjA5MjggMDAwMDAgbg0KKzAwMDAwNjEwOTggMDAwMDAgbg0KKzAwMDAwNjEyODAgMDAwMDAgbg0KKzAwMDAwNjE0NjAgMDAwMDAgbg0KKzAwMDAwNjE2MzkgMDAwMDAgbg0KKzAwMDAwNjE4MDQgMDAwMDAgbg0KKzAwMDAwNjE5ODEgMDAwMDAgbg0KKzAwMDAwNjIxNjcgMDAwMDAgbg0KKzAwMDAwNjIzMzUgMDAwMDAgbg0KKzAwMDAwNjI1MTIgMDAwMDAgbg0KKzAwMDAwNjI2ODMgMDAwMDAgbg0KKzAwMDAwNjI4NTAgMDAwMDAgbg0KKzAwMDAwNjMwMjMgMDAwMDAgbg0KKzAwMDAwNjMyMDUgMDAwMDAgbg0KKzAwMDAwNjMzOTUgMDAwMDAgbg0KKzAwMDAwNjM1NTEgMDAwMDAgbg0KKzAwMDAwNjM3MzcgMDAwMDAgbg0KKzAwMDAwNjM5NzIgMDAwMDAgbg0KKzAwMDAwNjQxMzEgMDAwMDAgbg0KKzAwMDAwNjQzMjAgMDAwMDAgbg0KKzAwMDAwNjQ1MDYgMDAwMDAgbg0KKzAwMDAwNjQ2ODYgMDAwMDAgbg0KKzAwMDAwNjQ4NzIgMDAwMDAgbg0KKzAwMDAwNjUwNTIgMDAwMDAgbg0KKzAwMDAwNjUyMjQgMDAwMDAgbg0KKzAwMDAwNjU0NDggMDAwMDAgbg0KKzAwMDAwNjU2MTIgMDAwMDAgbg0KKzAwMDAwNjU4MDAgMDAwMDAgbg0KKzAwMDAwNjU5ODggMDAwMDAgbg0KKzAwMDAwNjYyMDEgMDAwMDAgbg0KKzAwMDAwNjYzNDEgMDAwMDAgbg0KKzAwMDAwNjY2NDAgMDAwMDAgbg0KKzAwMDAwNjg1ODEgMDAwMDAgbg0KKzAwMDAwNjk2NzEgMDAwMDAgbg0KKzAwMDAwNzMwNjMgMDAwMDAgbg0KKzAwMDAwNzYxNDMgMDAwMDAgbg0KKzAwMDAwNzk0NzMgMDAwMDAgbg0KKzAwMDAwODE4OTcgMDAwMDAgbg0KKzAwMDAwODQ4MDkgMDAwMDAgbg0KKzAwMDAwODc1NTkgMDAwMDAgbg0KKzAwMDAwOTA2MDYgMDAwMDAgbg0KKzAwMDAwOTM0OTggMDAwMDAgbg0KKzAwMDAwOTc5NjUgMDAwMDAgbg0KKzAwMDAxMDA1MzAgMDAwMDAgbg0KKzAwMDAxMDQ2MDQgMDAwMDAgbg0KKzAwMDAxMDcxNzAgMDAwMDAgbg0KKzAwMDAxMDk2MDEgMDAwMDAgbg0KKzAwMDAxMTI0NzUgMDAwMDAgbg0KKzAwMDAxMTU0MzAgMDAwMDAgbg0KKzAwMDAxMTgzNzkgMDAwMDAgbg0KKzAwMDAxMjA5MDEgMDAwMDAgbg0KK3RyYWlsZXINCis8PCAvSUQgDQorICUgUmVwb3J0TGFiIGdlbmVyYXRlZCBQREYgZG9jdW1lbnQgLS0gZGlnZXN0IChodHRwOi8vd3d3LnJlcG9ydGxhYi5jb20pIA0KKyBbKFwwMjI+XDIxM1wzMzRWXDIzM1wyNDdcMzY2XDI2NFwzMjJcMjExXDAyMVwwMDFcMjUyXDMzN1wyMTMpIChcMDIyPlwyMTNcMzM0VlwyMzNcMjQ3XDM2NlwyNjRcMzIyXDIxMVwwMjFcMDAxXDI1MlwzMzdcMjEzKV0gDQorDQorIC9JbmZvIDE2NSAwIFINCisgL1Jvb3QgMTY0IDAgUg0KKyAvU2l6ZSAyNTcgPj4NCitzdGFydHhyZWYNCisxMjMwODgNCislJUVPRg0KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZiBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTZiNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9hbmRyb2lkLWN0cy1tYW51YWwtcjQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbXBhdGliaWxpdHlfdG9jLmNzCmluZGV4IDU2ODhkMTQuLjUzNmY3NzIgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29tcGF0aWJpbGl0eV90b2MuY3MKKysrIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jb21wYXRpYmlsaXR5X3RvYy5jcwpAQCAtNywxMiArNywxMiBAQAogPHVsPgogICA8bGk+PGgyPkdldHRpbmcgU3RhcnRlZDwvaDI+PHVsPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L292ZXJ2aWV3Lmh0bWwiPkNvbXBhdGliaWxpdHkgT3ZlcnZpZXc8L2E+PC9saT4KLSAgICA8bGk+PGEgaHJlZj0iIj5DdXJyZW50IENERDwvYT48L2xpPgorICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4xLWNkZC5wZGYiPkN1cnJlbnQgQ0REPC9hPjwvbGk+CiAgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvY3RzLWludHJvLmh0bWwiPkNUUyBJbnRyb2R1Y3Rpb248L2E+PC9saT4KICAgPC91bD48L2xpPgogCiAgIDxsaT48aDI+TW9yZSBJbmZvcm1hdGlvbjwvaDI+PHVsPgotICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5kb3dubG9hZHMvaW5kZXguaHRtbCI+RG93bmxvYWRzPC9hPjwvbGk+CisgICAgPGxpPjxhIGhyZWY9Ijw/Y3MgdmFyOnRvcm9vdCA/PmNvbXBhdGliaWxpdHkvZG93bmxvYWRzLmh0bWwiPkRvd25sb2FkczwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5mYXFzLmh0bWwjY29tcGF0aWJpbGl0eSI+RkFRczwvYT48L2xpPgogICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuaHRtbCI+Q29udGFjdCBVczwvYT48L2xpPgogICA8L3VsPjwvbGk+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuamQKaW5kZXggYmE0ZTg4Ny4uMmFhMmFhMSAxMDA2NDQKLS0tIGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jb250YWN0LXVzLmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvY29udGFjdC11cy5qZApAQCAtNywxMyArNywxMiBAQAogb3V0IG9mIGFueSBvZiB0aGVzZSBvcHRpb25zLCBwbGVhc2UgZmlyc3QgcmVhZCAiR2V0dGluZyB0aGUgTW9zdCBmcm9tIE91cgogTGlzdHMiIG9uIHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Y29tbXVuaXR5L2luZGV4Lmh0bWwiPkNvbW11bml0eSBwYWdlLjwvYT48L3A+CiAKLTxoMz5EaXNjdXNzaW9uIEdyb3VwPC9oMz4KKzxoMz5Gb3IgR2VuZXJhbCBEaXNjdXNzaW9uPC9oMz4KIDxwPlRoZSBwcmVmZXJyZWQgd2F5IHRvIHJlYWNoIHVzIGlzIHZpYSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9hbmRyb2lkLWNvbXBhdGliaWxpdHkiPmFuZHJvaWQtY29tcGF0aWJpbGl0eQotbWFpbGluZyBsaXN0PC9hPi4gVXNlIHRoaXMgbGlzdCBmb3IgYWxsIHlvdXIgY29tcGF0aWJpbGl0eS1yZWxhdGVkIHF1ZXN0aW9ucy4KLVBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoaXMgaXMgYSBwdWJsaWMgZm9ydW0uPC9wPgoraHJlZj0ibWFpbHRvOmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20iPmNvbXBhdGliaWxpdHlAYW5kcm9pZC5jb20KK2FkZHJlc3M8L2E+LjwvcD4KIAotPGgzPkNUUyBUZWNobmljYWwgUXVlc3Rpb25zPC9oMz4KKzxoMz5Gb3IgQ1RTIFRlY2huaWNhbCBRdWVzdGlvbnM8L2gzPgogPHA+SWYgeW91IGhhdmUgc3BlY2lmaWMgaXNzdWVzIHdpdGggdGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSB0aGF0IHJlcXVpcmUKIHlvdSB0byBkaXNjbG9zZSBpbmZvcm1hdGlvbiB5b3UnZCBwcmVmZXIgbm90IHRvIGJlIHB1YmxpYywgeW91IGNhbiBjb250YWN0IGFuCiBlbWFpbCBhZGRyZXNzIHdlJ3ZlIHNldCB1cCBzcGVjaWZpY2FsbHkgdGhpcyBwdXJwb3NlOiA8YQpAQCAtMjMsOSArMjIsOSBAQAogbGlzdC4gTm90ZSBhbHNvIHRoYXQgdGhpcyBsaXN0IGlzIGZvciBzcGVjaWZpYyB0ZWNobmljYWwgcXVlc3Rpb25zOyBnZW5lcmFsCiBpbnF1aXJpZXMgd2lsbCBhbHNvIGJlIGRpcmVjdGVkIGJhY2sgdG8gdGhlIGFuZHJvaWQtY29tcGF0aWJpbGl0eSBsaXN0LjwvcD4KIAotPGgzPlByaXZhdGUgSW5xdWlyaWVzPC9oMz4KKzxoMz5Gb3IgQnVzaW5lc3MgSW5xdWlyaWVzPC9oMz4KIDxwPkZpbmFsbHksIGJ1c2luZXNzIGlucXVpcmllcyBhYm91dCB0aGUgY29tcGF0aWJpbGl0eSBwcm9ncmFtLCBpbmNsdWRpbmcKIHJlcXVlc3RzIHRvIHVzZSBicmFuZGluZyBlbGVtZW50cyBhbmQgc28gb24sIGNhbiBiZSBzZW50IHRvIHRoZSBhZGRyZXNzIDxhCi1ocmVmPSJtYWlsdG86Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbSI+Y29tcGF0aWJpbGl0eUBhbmRyb2lkLmNvbTwvYT4uIExpa2UKK2hyZWY9Im1haWx0bzphbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tIj5hbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tPC9hPi4gTGlrZQogdGhlIENUUyBhZGRyZXNzLCB0aGlzIGFkZHJlc3MgaXMgZm9yIHNwZWNpZmljLCBwcml2YXRlIGlucXVpcmllczsgZ2VuZXJhbAogcXVlc3Rpb25zIHdpbGwgYmUgZGlyZWN0ZWQgYmFjayB0byB0aGUgYW5kcm9pZC1jb21wYXRpYmlsaXR5IGxpc3QuPC9wPgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9jdHMtaW50cm8uamQgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZAppbmRleCBmMWQyMzU5Li5mMTU4Y2E4IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZAorKysgYi9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5qZApAQCAtMTMsMTAgKzEzLDE0IEBACiAKIDxoMz5Xb3JrZmxvdzwvaDM+CiA8b2w+Ci08bGk+T2J0YWluIHRoZSBDVFMgc291cmNlIGNvZGUuIFRoZSBDVFMgaXMgaW5jbHVkZWQgaW4gdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgYXZhaWxhYmxlIGZyb20gdGhlIEFuZHJvaWQKLU9wZW4gU291cmNlIFByb2plY3QuIChUbyBnZXQgYSBjb3B5IG9mIHRoYXQgc291cmNlIGNvZGUsIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPnJlYWQgdGhpcyBwYWdlLjwvYT48L2xpPgorPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2Rvd25sb2Fkcy5odG1sIj5Eb3dubG9hZDwvYT4gdGhlIENUUy4KIDxsaT5BdHRhY2ggYXQgbGVhc3Qgb25lIGRldmljZSAob3IgZW11bGF0b3IpIHRvIHlvdXIgbWFjaGluZS48L2xpPgorPGxpPkZvciBDVFMgMi4xIFIyIGFuZCBiZXlvbmQsIHNldHVwIHlvdXIgZGV2aWNlIChvciBlbXVsYXRvcikgdG8gcnVuIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3RzOgorICAgIDxvbD4KKyAgICAgICAgPGxpPmFkYiBpbnN0YWxsIC1yIGFuZHJvaWQtY3RzL3JlcG9zaXRvcnkvdGVzdGNhc2VzL0N0c0RlbGVnYXRpbmdBY2Nlc3NpYmlsaXR5U2VydmljZS5hcGs8L2xpPgorICAgICAgICA8bGk+T24gdGhlIGRldmljZSwgZW5hYmxlIFNldHRpbmdzID4gQWNjZXNzaWJpbGl0eSA+IEFjY2Vzc2liaWxpdHkgPiBEZWxlZ2F0aW5nIEFjY2Vzc2liaWxpdHkgU2VydmljZTwvbGk+CisgICAgPC9vbD4KKzwvbGk+CiA8bGk+TGF1bmNoIHRoZSBDVFMuIFRoZSBDVFMgdGVzdCBoYXJuZXNzIGxvYWRzIHRoZSB0ZXN0IHBsYW4gb250byB0aGUgYXR0YWNoZWQgZGV2aWNlcy4gRm9yIGVhY2ggdGVzdCBpbiB0aGUgdGVzdCBoYXJuZXNzOgogICAgIDx1bD4KICAgICA8bGk+VGhlIHRlc3QgaGFybmVzcyBwdXNoZXMgYSAuYXBrIGZpbGUgdG8gZWFjaCBkZXZpY2UsIGV4ZWN1dGVzIHRoZSB0ZXN0IHRocm91Z2ggaW5zdHJ1bWVudGF0aW9uLCBhbmQgcmVjb3JkcyB0ZXN0IHJlc3VsdHMuPC9saT4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvZG93bmxvYWRzLmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9kb3dubG9hZHMuamQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3NWU0MQotLS0gL2Rldi9udWxsCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvZG93bmxvYWRzLmpkCkBAIC0wLDAgKzEsNDggQEAKK3BhZ2UudGl0bGU9QW5kcm9pZCBDb21wYXRpYmlsaXR5IERvd25sb2FkcworZG9jLnR5cGU9Y29tcGF0aWJpbGl0eQorQGpkOmJvZHkKKzxwPlRoYW5rcyBmb3IgeW91ciBpbnRlcmVzdCBpbiBBbmRyb2lkIENvbXBhdGliaWxpdHkhIFRoZSBsaW5rcyBiZWxvdyBhbGxvdworeW91IHRvIGFjY2VzcyB0aGUga2V5IGRvY3VtZW50cyBhbmQgaW5mb3JtYXRpb24uPC9wPgorCis8aDI+QW5kcm9pZCAyLjI8L2gyPgorPHA+QW5kcm9pZCAyLjIgaXMgdGhlIHJlbGVhc2Ugb2YgdGhlIGRldmVsb3BtZW50IG1pbGVzdG9uZSBjb2RlLW5hbWVkCitGcm9Zby4gQW5kcm9pZCAyLjIgaXMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBBbmRyb2lkLiBTb3VyY2UgY29kZSBmb3IgQW5kcm9pZAorMi4yIGlzIGZvdW5kIGluIHRoZSAnZnJveW8nIGJyYW5jaCBpbiB0aGUgb3Blbi1zb3VyY2UgdHJlZS4KKzwvcD4KKzx1bD4KKyAgPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2FuZHJvaWQtMi4yLWNkZC5wZGYiPkFuZHJvaWQgMi4yIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKTwvYT48L2xpPgorICA8bGk+PGEgaHJlZj0iaHR0cDovL2RsLmdvb2dsZS5jb20vZGwvYW5kcm9pZC9jdHMvYW5kcm9pZC1jdHMtMi4yX3IyLXg4Ni56aXAiPkFuZHJvaWQgMi4yIFIyIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSAoQ1RTKTwvYT48L2xpPgorPC91bD4KKworPGgyPkFuZHJvaWQgMi4xPC9oMj4KKzxwPkFuZHJvaWQgMi4xIGlzIHRoZSByZWxlYXNlIG9mIHRoZSBkZXZlbG9wbWVudCBtaWxlc3RvbmUgY29kZS1uYW1lZAorRWNsYWlyLiBTb3VyY2UgY29kZSBmb3IgQW5kcm9pZCAyLjEgaXMgZm91bmQgaW4gdGhlICdlY2xhaXInIGJyYW5jaCBpbiB0aGUKK29wZW4tc291cmNlIHRyZWUuIE5vdGUgdGhhdCBmb3IgdGVjaG5pY2FsIHJlYXNvbnMsIHRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkKK3Byb2dyYW0gZm9yIEFuZHJvaWQgMi4wIG9yIDIuMC4xLCBhbmQgbmV3IGRldmljZXMgbXVzdCB1c2UgQW5kcm9pZCAyLjEuCis8L3A+Cis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTIuMS1jZGQucGRmIj5BbmRyb2lkIDIuMSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgKENERCk8L2E+PC9saT4KKyAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kbC5nb29nbGUuY29tL2RsL2FuZHJvaWQvY3RzL2FuZHJvaWQtY3RzLTIuMV9yMy14ODYuemlwIj5BbmRyb2lkIDIuMSBSMyBDb21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgKENUUyk8L2E+PC9saT4KKzwvdWw+CisKKzxoMj5BbmRyb2lkIDEuNjwvaDI+Cis8cD5BbmRyb2lkIDEuNiB3YXMgdGhlIHJlbGVhc2Ugb2YgdGhlIGRldmVsb3BtZW50IG1pbGVzdG9uZSBjb2RlLW5hbWVkIERvbnV0LgorQW5kcm9pZCAxLjYgd2FzIG9ic29sZXRlZCBieSBBbmRyb2lkIDIuMS4gU291cmNlIGNvZGUgZm9yIEFuZHJvaWQgMS42IGlzIGZvdW5kCitpbiB0aGUgJ2RvbnV0JyBicmFuY2ggaW4gdGhlIG9wZW4tc291cmNlIHRyZWUuCis8dWw+CisgIDxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9hbmRyb2lkLTEuNi1jZGQucGRmIj5BbmRyb2lkIDEuNiBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgKENERCk8L2E+PC9saT4KKzwvdWw+CisKKzxoMj5Db21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgTWFudWFsPC9oMj4KKzxwPlRoZSBDVFMgdXNlciBtYW51YWwgaXMgYXBwbGljYWJsZSB0byBhbnkgQ1RTIHZlcnNpb24sIGJ1dCBDVFMgMi4xIFIyIGFuZAorYmV5b25kIHJlcXVpcmUKKzxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2N0cy1pbnRyby5odG1sIj5hZGRpdGlvbmFsIHN0ZXBzPC9hPgordG8gcnVuIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3RzLgorPHVsPgorICA8bGk+PGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvYW5kcm9pZC1jdHMtbWFudWFsLXI0LnBkZiI+Q29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIChDVFMpIFVzZXIgTWFudWFsPC9hPjwvbGk+Cis8L3VsPgorCis8aDI+T2xkZXIgQW5kcm9pZCBWZXJzaW9uczwvaDI+Cis8cD5UaGVyZSBpcyBubyBDb21wYXRpYmlsaXR5IFByb2dyYW0gZm9yIG9sZGVyIHZlcnNpb25zIG9mIEFuZHJvaWQsIHN1Y2ggYXMgQW5kcm9pZAorMS41IChrbm93biBpbiBkZXZlbG9wbWVudCBhcyBDdXBjYWtlKS4gTmV3IGRldmljZXMgaW50ZW5kZWQgdG8gYmUgQW5kcm9pZAorY29tcGF0aWJsZSBtdXN0IHNoaXAgd2l0aCBBbmRyb2lkIDEuNiBvciBsYXRlci48L3A+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2luZGV4LmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9pbmRleC5qZAppbmRleCAwYzM5YTk4Li41NWJlMDUyIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L2luZGV4LmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvaW5kZXguamQKQEAgLTEsMTcgKzEsMjEgQEAKIHBhZ2UudGl0bGU9QW5kcm9pZCBDb21wYXRpYmlsaXR5CiBkb2MudHlwZT1jb21wYXRpYmlsaXR5CiBAamQ6Ym9keQotPHA+QW5kcm9pZCBpcyBhbiBvcGVuIHNvdXJjZSBwcm9kdWN0LCBhbmQgYW55b25lIGNhbiB1c2UgdGhlIHNvdXJjZSBjb2RlIHRvIGJ1aWxkCi1kZXZpY2VzLiBUaGUgcHVycG9zZSBvZiB0aGUgQW5kcm9pZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gaXMgdG8gaGVscCBBbmRyb2lkCi1kZXZpY2UgaW1wbGVtZW50YXRpb25zIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggYWxsIGFwcHMuPC9wPgotPHA+QSBkZXZpY2UgaXMgY29uc2lkZXJlZCBjb21wYXRpYmxlIGlmIGV4aXN0aW5nIGFuZCBuZXcgdGhpcmQtcGFydHkKLWFwcGxpY2F0aW9ucyBydW4gY29ycmVjdGx5IG9uIGl0LiBQb29yIGRldmljZSBpbXBsZW1lbnRhdGlvbnMgdGhhdCBjaGFuZ2UgQVBJcwotb3IgYWx0ZXIgYmVoYXZpb3JzIHdpbGwgYnJlYWsgdGhlc2UgYXBwcyBhbmQgc28gYXJlIG5vdCBjb21wYXRpYmxlLiBUaGUKLUFuZHJvaWQgY29tcGF0aWJpbGl0eSBwcm9ncmFtJ3MgYWltIGlzIHRvIGVuc3VyZSB0aGF0IHRoZXNlIEFQSXMgYXJlCi1jb25zaXN0ZW50bHkgaW1wbGVtZW50ZWQgYWNyb3NzIGRldmljZXMuPC9wPgotPHA+VGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlIGFuZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gaXMKLTEuNiwgd2hpY2ggcm91Z2hseSBjb3JyZXNwb25kZWQgdG8gdGhlIERvbnV0IGJyYW5jaC4gIFRoZSBjb21wYXRpYmlsaXR5Ci1wcm9ncmFtIGZvciBBbmRyb2lkIDIueCAoY29ycmVzcG9uZGluZyB0byBFY2xhaXIpIGlzIGNvbWluZyBzb29uLjwvcD4KKzxwPkFuZHJvaWQncyBwdXJwb3NlIGlzIHRvIGVzdGFibGlzaCBhbiBvcGVuIHBsYXRmb3JtIGZvciBkZXZlbG9wZXJzIHRvIGJ1aWxkCitpbm5vdmF0aXZlIG1vYmlsZSBhcHBzLiBUaHJlZSBrZXkgY29tcG9uZW50cyB3b3JrIHRvZ2V0aGVyIHRvIHJlYWxpemUgdGhpcworcGxhdGZvcm0uPC9wPgorPHA+VGhlIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBQcm9ncmFtIGRlZmluZXMgdGhlIHRlY2huaWNhbCBkZXRhaWxzIG9mIEFuZHJvaWQKK3BsYXRmb3JtIGFuZCBwcm92aWRlcyB0b29scyB1c2VkIGJ5IE9FTXMgdG8gZW5zdXJlIHRoYXQgZGV2ZWxvcGVyc+KAmSBhcHBzIHJ1bgorb24gYSB2YXJpZXR5IG9mIGRldmljZXMuIFRoZSBBbmRyb2lkIFNESyBwcm92aWRlcyBidWlsdC1pbiB0b29scyB0aGF0CitEZXZlbG9wZXJzIHVzZSB0byBjbGVhcmx5IHN0YXRlIHRoZSBkZXZpY2UgZmVhdHVyZXMgdGhlaXIgYXBwcyByZXF1aXJlLiBBbmQKK0FuZHJvaWQgTWFya2V0IHNob3dzIGFwcHMgb25seSB0byB0aG9zZSBkZXZpY2VzIHRoYXQgY2FuIHByb3Blcmx5IHJ1bgordGhlbS48L3A+Cis8cD5UaGVzZSBwYWdlcyBkZXNjcmliZSB0aGUgQW5kcm9pZCBDb21wYXRpYmlsaXR5IFByb2dyYW0gYW5kIGhvdyB0byBnZXQKK2FjY2VzcyB0byBjb21wYXRpYmlsaXR5IGluZm9ybWF0aW9uIGFuZCB0b29scy4gVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZQorQW5kcm9pZCBzb3VyY2UgY29kZSBhbmQgY29tcGF0aWJpbGl0eSBwcm9ncmFtIGlzIDIuMSwgd2hpY2ggcm91Z2hseQorY29ycmVzcG9uZGVkIHRvIHRoZSBFY2xhaXIgYnJhbmNoLjwvcD4KKworCiA8aDI+V2h5IGJ1aWxkIGNvbXBhdGlibGUgQW5kcm9pZCBkZXZpY2VzPzwvaDI+CiA8aDM+VXNlcnMgd2FudCBhIGN1c3RvbWl6YWJsZSBkZXZpY2UuPC9oMz4KIDxwPkEgbW9iaWxlIHBob25lIGlzIGEgaGlnaGx5IHBlcnNvbmFsLCBhbHdheXMtb24sIGFsd2F5cy1wcmVzZW50IGdhdGV3YXkgdG8KQEAgLTIwLDcgKzI0LDcgQEAKIHBsYXRmb3JtIGZvciBydW5uaW5nIGFmdGVyLW1hcmtldCBhcHBsaWNhdGlvbnMuPC9wPgogCiA8aDM+RGV2ZWxvcGVycyBvdXRudW1iZXIgdXMgYWxsLjwvaDM+Ci08cD5ObyBkZXZpY2UgbWFudWZhY3R1cmVyIGNhbiBob3BlIHRvIHdyaXRlIGFsbCB0aGUgc29mdHdhcmUgdGhhdCBhbnlvbmUgY291bGQKKzxwPk5vIGRldmljZSBtYW51ZmFjdHVyZXIgY2FuIGhvcGUgdG8gd3JpdGUgYWxsIHRoZSBzb2Z0d2FyZSB0aGF0IGEgcGVyc29uIGNvdWxkCiBjb25jZWl2YWJseSBuZWVkLiBXZSBuZWVkIHRoaXJkLXBhcnR5IGRldmVsb3BlcnMgdG8gd3JpdGUgdGhlIGFwcHMgdXNlcnMgd2FudCwKIHNvIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgYWltcyB0byBtYWtlIGl0IGFzIGVhc3kgYW5kIG9wZW4gYXMKIHBvc3NpYmxlIGZvciBkZXZlbG9wZXJzIHRvIGJ1aWxkIGFwcHMuPC9wPgpAQCAtMzgsMzAgKzQyLDIzIEBACiBzdXJlIHlvdXIgZGV2aWNlIGlzIGNvbXBhdGlibGUgd2l0aCBBbmRyb2lkLiBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZQogQW5kcm9pZCBjb21wYXRpYmlsaXR5IHByb2dyYW0gaW4gZ2VuZXJhbCwgc2VlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9vdmVydmlldy5odG1sIj50aGUgcHJvZ3JhbSBvdmVydmlldzwvYT4uPC9wPgotPHA+QnVpbGRpbmcgYSBjb21wYXRpYmxlIGRldmljZSBpcyBhIGZvdXItc3RlcCBwcm9jZXNzOjwvcD4KKzxwPkJ1aWxkaW5nIGEgY29tcGF0aWJsZSBkZXZpY2UgaXMgYSB0aHJlZS1zdGVwIHByb2Nlc3M6PC9wPgogPG9sPgotICA8bGk+PGI+T2J0YWluIHRoZSBBbmRyb2lkIHNvZnR3YXJlIHN0YWNrIHNvdXJjZSBjb2RlPC9iPjxwPlRoaXMgaXMgdGhlCisgIDxsaT48Yj5PYnRhaW4gdGhlIEFuZHJvaWQgc29mdHdhcmUgc291cmNlIGNvZGU8L2I+PHA+VGhpcyBpcyB0aGUKICAgPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9pbmRleC5odG1sIj5zb3VyY2UgY29kZSBmb3IgdGhlIEFuZHJvaWQKICAgcGxhdGZvcm08L2E+LCB0aGF0IHlvdSBwb3J0IHRvIHlvdXIgaGFyZHdhcmUuPC9wPjwvbGk+Ci0gIDxsaT48Yj5Db21wbHkgd2l0aCBBbmRyb2lkIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudDwvYj48cD4KLSAgVGhpcyBkb2N1bWVudCBlbnVtZXJhdGVzIHRoZSBzb2Z0d2FyZSBhbmQgdGhlIGhhcmR3YXJlIGZlYXR1cmVzIG9mCisgIDxsaT48Yj5Db21wbHkgd2l0aCBBbmRyb2lkIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKTwvYj48cD4KKyAgVGhlIENERCBlbnVtZXJhdGVzIHRoZSBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUgcmVxdWlyZW1lbnRzIG9mCiAgIGEgY29tcGF0aWJsZSBBbmRyb2lkIGRldmljZS48L3A+PC9saT4KICAgPGxpPjxiPlBhc3MgdGhlIENvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSAoQ1RTKTwvYj48cD5Zb3UgY2FuIHVzZSB0aGUgQ1RTCiAgIChpbmNsdWRlZCBpbiB0aGUgQW5kcm9pZCBzb3VyY2UgY29kZSkgYXMgYW4gb25nb2luZyBhaWQgdG8gY29tcGF0aWJpbGl0eQogICBkdXJpbmcgdGhlIGRldmVsb3BtZW50IHByb2Nlc3MuPC9wPjwvbGk+Ci0gIDxsaT48Yj5TdWJtaXQgQ1RTIHJlcG9ydDwvYj48cD5bT3B0aW9uYWxdIFlvdSBjYW4gYWxzbyBzdWJtaXQgeW91ciBDVFMgcmVwb3J0LAotICBzbyB0aGF0IGl0IGNhbiBiZSB2YWxpZGF0ZWQgYW5kIHJlY29yZGVkLjwvcD48cD48aT5Ob3RlOgotICB0aGUgc3VibWlzc2lvbiBzeXN0ZW0gaXMgY3VycmVudGx5IHVuZGVyIGNvbnN0cnVjaXRvbiwgYW5kIGlzIG5vdCBjdXJyZW50bHkKLSAgYXZhaWxhYmxlLjwvaT48L3A+PC9saT4KIDwvb2w+CiAKLTxoMj5CZW5lZml0cyBvZiBjb21wYXRpYmlsaXR5PC9oMj4KLTxwPkJ5IHN1Ym1pdHRpbmcgYSB2YWxpZGF0ZWQgQ1RTIHJlcG9ydCwgeW91IHJlY2VpdmUgcHVibGljIHJlY29nbml0aW9uIG9mCi15b3VyIGRldmljZSdzIGNvbXBhdGliaWxpdHkuIFRoaXMgYWxzbyBvcGVucyB1cCBhZGRpdGlvbmFsIG9wdGlvbnMgeW91IGNhbgotcHVyc3VlIHN1Y2ggYXMgdXNlIG9mIHRoZSBBbmRyb2lkIGJyYW5kaW5nLCBhY2Nlc3MgdG8gQW5kcm9pZCBNYXJrZXQsIGFuZAotbW9yZS48L3A+Ci08cD5BcyBhIGNvbnNlcXVlbmNlIG9mIHNvbWUgbGVnYWwgcXVpcmtzLCB3ZSBhcmVuJ3QgYWJsZSB0byBvZmZlciBhdXRvbWF0aWMKLWxpY2Vuc2luZyBvZiBlaXRoZXIgdGhlIEFuZHJvaWQgTWFya2V0IG9yIGJyYW5kaW5nLiBUbyBhY3R1YWxseSBvYnRhaW4gYWNjZXNzCi10byB0aGVzZSBwcm9ncmFtcywgeW91IHdpbGwgbmVlZCB0byA8YQotaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvY29udGFjdC11cy5odG1sIj5jb250YWN0IHVzPC9hPiB0byBvYnRhaW4gYQotbGljZW5zZS48L3A+Cis8aDI+Sm9pbmluZyB0aGUgRWNvc3lzdGVtPC9oMj4KKzxwPk9uY2UgeW91J3ZlIGJ1aWx0IGEgY29tcGF0aWJsZSBkZXZpY2UsIHlvdSBtYXkgd2lzaCB0byBpbmNsdWRlIEFuZHJvaWQKK01hcmtldCB0byBwcm92aWRlIHlvdXIgdXNlcnMgYWNjZXNzIHRvIHRoZSB0aGlyZC1wYXJ0eSBhcHAgZWNvc3lzdGVtLgorVW5mb3J0dW5hdGVseSwgZm9yIGEgdmFyaWV0eSBvZiBsZWdhbCBhbmQgYnVzaW5lc3MgcmVhc29ucywgd2UgYXJlbid0IGFibGUgdG8KK2F1dG9tYXRpY2FsbHkgbGljZW5zZSBBbmRyb2lkIE1hcmtldCB0byBhbGwgY29tcGF0aWJsZSBkZXZpY2VzLiBUbyBpbnF1aXJlCithYm91dCBhY2Nlc3MgYWJvdXQgQW5kcm9pZCBNYXJrZXQsIHlvdSBjYW4gPGEKK2hyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2NvbnRhY3QtdXMuaHRtbCI+Y29udGFjdCB1czwvYT48L3A+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L292ZXJ2aWV3LmpkIGIvcGRrL2RvY3MvY29tcGF0aWJpbGl0eS9vdmVydmlldy5qZAppbmRleCAwMzllMmMyLi4zMWE0ODMyIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9jb21wYXRpYmlsaXR5L292ZXJ2aWV3LmpkCisrKyBiL3Bkay9kb2NzL2NvbXBhdGliaWxpdHkvb3ZlcnZpZXcuamQKQEAgLTM1LDExICszNSwxMyBAQAogY29tcGF0aWJsZS48L3A+PC9saT4KIDxsaT48Yj5NaW5pbWl6ZSBjb3N0cyBhbmQgb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoCiBjb21wYXRpYmlsaXR5LjwvYj48cD5FbnN1cmluZyBjb21wYXRpYmlsaXR5IHNob3VsZCBiZSBlYXN5IGFuZCBpbmV4cGVuc2l2ZSB0bwotZGV2aWNlIG1hbnVmYWN0dXJlcnMuIFRoZSB0ZXN0aW5nIHRvb2wgKENUUykgaXMgZnJlZSBhbmQgd2lsbCBzb29uIGJlIGF2YWlsYWJsZQotaW4gb3BlbiBzb3VyY2UuIENUUyBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGZvciBjb250aW51b3VzIHNlbGYtdGVzdGluZyBkdXJpbmcKLXRoZSBkZXZpY2UgZGV2ZWxvcG1lbnQgcHJvY2VzcyB0byBlbGltaW5hdGUgdGhlIGNvc3Qgb2YgY2hhbmdpbmcgeW91ciB3b3JrZmxvdwotb3Igc2VuZGluZyB5b3VyIGRldmljZSB0byBhIHRoaXJkIHBhcnR5IGZvciB0ZXN0aW5nLiBNZWFud2hpbGUsIHRoZXJlIGFyZSBubwotcmVxdWlyZWQgY2VydGlmaWNhdGlvbnMsIGFuZCB0aHVzIG5vIGNvcnJlc3BvbmRpbmcgY29zdHMgYW5kIGZlZXMuPC9wPjwvbGk+CitkZXZpY2UgbWFudWZhY3R1cmVycy4gVGhlIHRlc3RpbmcgdG9vbCAoQ1RTKSBpcyBmcmVlLCBvcGVuIHNvdXJjZSwgYW5kCithdmFpbGFibGUgZm9yIDxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2Rvd25sb2Fkcy5odG1sIj5kb3dubG9hZDwvYT4uIAorQ1RTIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZm9yIGNvbnRpbnVvdXMgc2VsZi10ZXN0aW5nCitkdXJpbmcgdGhlIGRldmljZSBkZXZlbG9wbWVudCBwcm9jZXNzIHRvIGVsaW1pbmF0ZSB0aGUgY29zdCBvZiBjaGFuZ2luZyB5b3VyCit3b3JrZmxvdyBvciBzZW5kaW5nIHlvdXIgZGV2aWNlIHRvIGEgdGhpcmQgcGFydHkgZm9yIHRlc3RpbmcuIE1lYW53aGlsZSwgdGhlcmUKK2FyZSBubyByZXF1aXJlZCBjZXJ0aWZpY2F0aW9ucywgYW5kIHRodXMgbm8gY29ycmVzcG9uZGluZyBjb3N0cyBhbmQKK2ZlZXMuPC9wPjwvbGk+CiA8L3VsPgogPHA+VGhlIEFuZHJvaWQgY29tcGF0aWJpbGl0eSBwcm9ncmFtIGNvbnNpc3RzIG9mIHRocmVlIGtleSBjb21wb25lbnRzOjwvcD4KIDx1bD4KQEAgLTc2LDggKzc4LDkgQEAKIHNpbXBseSBleGFtaW5lIDxhIGhyZWY9IiI+dGhlIGxhdGVzdCBDREQ8L2E+LjwvcD4KIAogPGgzPkNvbXBhdGliaWxpdHkgVGVzdCBTdWl0ZSAoQ1RTKTwvaDM+Ci08cD5UaGUgQ1RTIGlzIGEgZnJlZSwgY29tbWVyY2lhbC1ncmFkZSB0ZXN0IHN1aXRlLCBhdmFpbGFibGUgYWxvbmcgd2l0aCB0aGUKLUFuZHJvaWQgc291cmNlIGNvZGUuIFRoZSBDVFMgcmVwcmVzZW50cyB0aGUgIm1lY2hhbmlzbSIgb2YgY29tcGF0aWJpbGl0eS48L3A+Cis8cD5UaGUgQ1RTIGlzIGEgZnJlZSwgY29tbWVyY2lhbC1ncmFkZSB0ZXN0IHN1aXRlLCBhdmFpbGFibGUgZm9yCis8YSBocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9kb3dubG9hZHMuaHRtbCI+ZG93bmxvYWQ8L2E+LgorVGhlIENUUyByZXByZXNlbnRzIHRoZSAibWVjaGFuaXNtIiBvZiBjb21wYXRpYmlsaXR5LjwvcD4KIDxwPlRoZSBDVFMgcnVucyBvbiBhIGRlc2t0b3AgbWFjaGluZSBhbmQgZXhlY3V0ZXMgdGVzdCBjYXNlcyBkaXJlY3RseSBvbgogYXR0YWNoZWQgZGV2aWNlcyBvciBhbiBlbXVsYXRvci4gVGhlIENUUyBpcyBhIHNldCBvZiB1bml0IHRlc3RzIGRlc2lnbmVkIHRvIGJlCiBpbnRlZ3JhdGVkIGludG8gdGhlIGRhaWx5IHdvcmtmbG93IChzdWNoIGFzIHZpYSBhIGNvbnRpbnVvdXMgYnVpbGQgc3lzdGVtKSBvZgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvZG93bmxvYWRzL2Rvd25sb2Fkc190b2MuY3MgYi9wZGsvZG9jcy9kb3dubG9hZHMvZG93bmxvYWRzX3RvYy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmNDNhZi4uMDAwMDAwMAotLS0gYS9wZGsvZG9jcy9kb3dubG9hZHMvZG93bmxvYWRzX3RvYy5jcworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+Ci08IS0tCi1mdW5jdGlvbiBub3RoaW5nKCkge30KLS0tPgotPC9zY3JpcHQ+Ci0KLTx1bD4KLSAgPGxpPjxoMj5QREs8L2gyPjx1bD4KLSAgICA8bGk+PGEgaHJlZj0iIj5QREsgMS42PC9hPjwvbGk+Ci0gIDwvdWw+PC9saT4KLQotICA8bGk+PGgyPkNvbXBhdGliaWxpdHk8L2gyPjx1bD4KLSAgICA8bGk+PGEgaHJlZj0iIj5BbmRyb2lkIDEuNjwvYT48L2xpPgotICA8L3VsPjwvbGk+Ci08L3VsPgotCi08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci08IS0tCi0gICAgYnVpbGRUb2dnbGVMaXN0cygpOwotLy8tLT4KLTwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3MvZG93bmxvYWRzL2luZGV4LmpkIGIvcGRrL2RvY3MvZG93bmxvYWRzL2luZGV4LmpkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY1YTJmLi4wMDAwMDAwCi0tLSBhL3Bkay9kb2NzL2Rvd25sb2Fkcy9pbmRleC5qZAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLXBhZ2UudGl0bGU9RG93bmxvYWRzCi1kb2MudHlwZT1kb3dubG9hZHMKLWRvYy5oaWRlbmF2PXRydWUKLUBqZDpib2R5Ci08cD5UaGlzIHBhZ2UgcHJvdmlkZXMgYWNjZXNzIHRvIHZhcmlvdXMgZG93bmxvYWRzLiBOb3RlIHRoYXQgaWYgeW91J3JlIGxvb2tpbmcKLWZvciB0aGUgQW5kcm9pZCBTREsgKGZvciBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzKSwgeW91IHNob3VsZCB2aXNpdCA8YQotaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zZGsvaW5kZXguaHRtbCI+ZGV2ZWxvcGVyLmFuZHJvaWQuY29tPC9hPi48L3A+Ci0KLTxoMj5Db21wYXRpYmlsaXR5PC9oMj4KLTxwPlRoZSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgY2FuIGJlIGRvd25sb2FkZWQgYmVsb3cuIFRoZQotQ29tcGF0aWJpbGl0eSBUZXN0IFN1aXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgb3Blbi1zb3VyY2UgdHJlZS48L3A+Ci08dGFibGUgY2xhc3M9ImRvd25sb2FkIj4gCi0gIDx0cj4gCi0gICAgICA8dGg+SXRlbTwvdGg+IAotICAgICAgPHRoPkZpbGU8L3RoPiAKLSAgICAgIDx0aD5TaXplPC90aD4gCi0gIDwvdHI+IAotICA8dHI+IAotICAgIDx0ZD5BbmRyb2lkIENERCAyLjE8L3RkPiAKLSAgICA8dGQ+PGEgaHJlZj0iIj5hbmRyb2lkLWNkZC0yLjEucGRmPC9hPjwvdGQ+IAotICAgIDx0ZD4yMzA3MDgwNSBieXRlczwvdGQ+IAotICA8L3RyPiAKLSAgPHRyIGNsYXNzPSJhbHQtY29sb3IiPiAKLSAgICA8dGQ+QW5kcm9pZCBDVFMgMi4xIE1hbnVhbDwvdGQ+IAotICAgIDx0ZD48YSBocmVmPSIiPmFuZHJvaWQtY3RzLW1hbnVhbC0yLjEuMC5wZGY8L2E+PC90ZD4gCi0gICAgPHRkPjIzMDcwODA1IGJ5dGVzPC90ZD4gCi0gIDwvdHI+IAotICA8dHI+IAotICAgIDx0ZD5BbmRyb2lkIENERCAxLjY8L3RkPiAKLSAgICA8dGQ+PGEgaHJlZj0iIj5hbmRyb2lkLWNkZC0xLjYucGRmPC9hPjwvdGQ+IAotICAgIDx0ZD4yMzA3MDgwNSBieXRlczwvdGQ+IAotICA8L3RyPiAKLSAgPHRyIGNsYXNzPSJhbHQtY29sb3IiPiAKLSAgICA8dGQ+QW5kcm9pZCBDVFMgMS42IE1hbnVhbDwvdGQ+IAotICAgIDx0ZD48YSBocmVmPSIiPmFuZHJvaWQtY3RzLW1hbnVhbC0xLjYuNC5wZGY8L2E+PC90ZD4gCi0gICAgPHRkPjIzMDcwODA1IGJ5dGVzPC90ZD4gCi0gIDwvdHI+IAotPC90YWJsZT4gCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gYnVpbGQgYW4gQW5kcm9pZC1jb21wYXRpYmxlIGRldmljZSwgc2VlIHRoZQotPGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCI+Q29tcGF0aWJpbGl0eTwvYT4gcGFnZS4gTm90ZSB0aGF0Ci10aGVyZSBpcyBubyBjb21wYXRpYmlsaXR5IHByb2dyYW0gZm9yIEFuZHJvaWQgMS41IGFuZCBlYXJsaWVyLiBOb3RlIGFsc28gdGhhdAotdGhlcmUgaXMgbm8gY29tcGF0aWJpbGl0eSBwcm9ncmFtIGZvciBBbmRyb2lkIDIuMCwgc2luY2UgaXQgd2FzIHN1cGVyY2VkZWQgYnkKLUFuZHJvaWQgMi4xIGFmdGVyIG9ubHkgYSBmZXcgd2Vla3MuCi08L3A+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9mYXFzLmpkIGIvcGRrL2RvY3MvZmFxcy5qZAppbmRleCBhNTVkMzgwLi4wMGRiMDI2IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9mYXFzLmpkCisrKyBiL3Bkay9kb2NzL2ZhcXMuamQKQEAgLTc0LDggKzc0LDggQEAKIDxwPkZpbmFsbHksIEdvb2dsZSB3b3JrcyBvbiB0aGUgbmV4dCB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHBsYXRmb3JtIGluIHRhbmRlbQogICB3aXRoIGRldmVsb3BpbmcgYSBmbGFnc2hpcCBkZXZpY2UuIFRoaXMgYnJhbmNoIHB1bGxzIGluIGNoYW5nZXMgZnJvbSB0aGUKICAgZXhwZXJpbWVudGFsIGFuZCBzdGFibGUgYnJhbmNoZXMgYXMgYXBwcm9wcmlhdGUuPC9wPgotPHA+WW91IGNhbiBmaW5kIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcyB0b3BpYyBhdCBvdXIgQnJhbmNoZXMgUmVsZWFzZXMKLSAgcGFnZS48L3A+Cis8cD5Zb3UgY2FuIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHRvcGljIGF0IG91ciA8YQoraHJlZj0ie0Bkb2NSb290fXNvdXJjZS9jb2RlLWxpbmVzLmh0bWwiPkJyYW5jaGVzIGFuZCBSZWxlYXNlczwvYT4gcGFnZS48L3A+CiAKIDxoMz5XaHkgYXJlIHBhcnRzIG9mIEFuZHJvaWQgZGV2ZWxvcGVkIGluIHByaXZhdGU/PC9oMz4KIDxwPkl0IHR5cGljYWxseSB0YWtlcyBvdmVyIGEgeWVhciB0byBicmluZyBhIGRldmljZSB0byBtYXJrZXQsIGJ1dCBvZiBjb3Vyc2UKQEAgLTg2LDE2ICs4NiwxNiBAQAogPHA+VG8gYWRkcmVzcyB0aGlzLCBzb21lIHBhcnRzIG9mIHRoZSBuZXh0IHZlcnNpb24gb2YgQW5kcm9pZCBpbmNsdWRpbmcgdGhlCiAgIGNvcmUgcGxhdGZvcm0gQVBJcyBhcmUgZGV2ZWxvcGVkIGluIGEgcHJpdmF0ZSBicmFuY2guIFRoZXNlIEFQSXMgY29uc3RpdHV0ZQogICB0aGUgbmV4dCB2ZXJzaW9uIG9mIEFuZHJvaWQuIE91ciBhaW0gaXMgdG8gZm9jdXMgYXR0ZW50aW9uIG9uIHRoZSBjdXJyZW50Ci0gIHN0YWJsZSB2ZXJzaW9uIG9mIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlLCB3aGlsZSB3ZSByZWZpbmUgdGhlIG5leHQgdmVyc2lvbgotICBvZiB0aGUgcGxhdGZvcm0gdXNpbmcgdGhlIGZsYWdzaGlwIEFuZHJvaWQgZGV2aWNlcy4gVGhpcyBhbGxvd3MgZGV2ZWxvcGVycworICBzdGFibGUgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBzb3VyY2UgY29kZSwgd2hpbGUgd2UgY3JlYXRlIHRoZSBuZXh0IHZlcnNpb24KKyAgb2YgdGhlIHBsYXRmb3JtIGFzIGRyaXZlbiBieSBmbGFnc2hpcCBBbmRyb2lkIGRldmljZXMuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMKICAgYW5kIE9FTXMgdG8gZm9jdXMgb24gYSBzaW5nbGUgdmVyc2lvbiB3aXRob3V0IGhhdmluZyB0byB0cmFjayB1bmZpbmlzaGVkCi0gIGZ1dHVyZSB3b3JrIGp1c3QgdG8ga2VlcCB1cC5PdGhlciBwYXJ0cyBvZiB0aGUgQW5kcm9pZCBzeXN0ZW0gdGhhdCBhcmVuJ3QKKyAgZnV0dXJlIHdvcmsganVzdCB0byBrZWVwIHVwLiBPdGhlciBwYXJ0cyBvZiB0aGUgQW5kcm9pZCBzeXN0ZW0gdGhhdCBhcmVuJ3QKICAgcmVsYXRlZCB0byBhcHBsaWNhdGlvbiBjb21wYXRpYmlsaXR5IGFyZSBkZXZlbG9wZWQgaW4gdGhlIG9wZW4sIGhvd2V2ZXIuCiAgIEl0J3Mgb3VyIGludGVudGlvbiB0byBtb3ZlIG1vcmUgb2YgdGhlc2UgcGFydHMgdG8gb3BlbiBkZXZlbG9wbWVudCBvdmVyCiAgIHRpbWUuPC9wPgogCiA8aDM+V2hlbiBhcmUgc291cmNlIGNvZGUgcmVsZWFzZXMgbWFkZT88L2gzPgotPHA+V2hlbiB0aGV5IGFyZSByZWFkeS4gU29tZSBwYXJ0cyBvZiBBbmRyb2lkIGFyZSBkZXZlbG9wZWQgaW4gdGhlIG9wZW4sIGFuZAorPHA+V2hlbiB0aGV5IGFyZSByZWFkeS4gU29tZSBwYXJ0cyBvZiBBbmRyb2lkIGFyZSBkZXZlbG9wZWQgaW4gdGhlIG9wZW4sCiAgIHNvIHRoYXQgc291cmNlIGNvZGUgaXMgYWx3YXlzIGF2YWlsYWJsZS4gT3RoZXIgcGFydHMgYXJlIGRldmVsb3BlZCBmaXJzdCBpbgogICBhIHByaXZhdGUgdHJlZSwgYW5kIHRoYXQgc291cmNlIGNvZGUgaXMgcmVsZWFzZWQgd2hlbiB0aGUgbmV4dCBwbGF0Zm9ybQogICB2ZXJzaW9uIGlzIHJlYWR5LjwvcD4KQEAgLTE0Myw4ICsxNDMsNyBAQAogICAiQW5kcm9pZCBjb21wYXRpYmxlIGRldmljZXMiIGZyb20gZGV2aWNlcyB0aGF0IG1lcmVseSBydW4gZGVyaXZhdGl2ZXMgb2YgdGhlCiAgIHNvdXJjZSBjb2RlLiBXZSB3ZWxjb21lIGFsbCB1c2VzIG9mIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlLCBidXQgb25seQogICBBbmRyb2lkIGNvbXBhdGlibGUgZGV2aWNlcyAtLSBhcyBkZWZpbmVkIGFuZCB0ZXN0ZWQgYnkgdGhlIEFuZHJvaWQKLSAgQ29tcGF0aWJpbGl0eSBQcm9ncmFtIC0tIG1heSBjYWxsIHRoZW1zZWx2ZXMgIkFuZHJvaWQiIGFuZCBwYXJ0aWNpcGF0ZSBpbgotICB0aGUgQW5kcm9pZCBlY29zeXN0ZW0uPC9wPgorICBDb21wYXRpYmlsaXR5IFByb2dyYW0gLS0gbWF5IHBhcnRpY2lwYXRlIGluIHRoZSBBbmRyb2lkIGVjb3N5c3RlbS48L3A+CiAKIDxoMz5Ib3cgY2FuIEkgY29udHJpYnV0ZSB0byBBbmRyb2lkPzwvaDM+CiA8cD5UaGVyZSBhcmUgYSBudW1iZXIgb2Ygd2F5cyB5b3UgY2FuIGNvbnRyaWJ1dGUgdG8gQW5kcm9pZC4gWW91IGNhbiByZXBvcnQKQEAgLTE3MCw4ICsxNjksOSBAQAogPHA+T25jZSBzdWJtaXR0ZWQsIGNoYW5nZXMgbmVlZCB0byBiZSBhY2NlcHRlZCBieSBhIGRlc2lnbmF0ZWQgQXBwcm92ZXIuCiAgIEFwcHJvdmVycyBhcmUgdHlwaWNhbGx5IEdvb2dsZSBlbXBsb3llZXMsIGJ1dCB0aGUgc2FtZSBhcHByb3ZlcnMgYXJlCiAgIHJlc3BvbnNpYmxlIGZvciBhbGwgc3VibWlzc2lvbnMsIHJlZ2FyZGxlc3Mgb2Ygb3JpZ2luLjwvcD4KLTxwPllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMgYXQgdGhlIFN1Ym1pdHRpbmcgUGF0Y2hlcwotICBwYWdlLjwvcD4KKzxwPllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgdG9waWMgYXQgdGhlIDxhCisgICBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL3N1Ym1pdC1wYXRjaGVzLmh0bWwiPlN1Ym1pdHRpbmcgUGF0Y2hlczwvYT4KKyAgIHBhZ2UuPC9wPgogCiA8YSBuYW1lPSJjb21wYXRpYmlsaXR5Ij48L2E+PGgyPkNvbXBhdGliaWxpdHk8L2gyPgogPGgzPldoYXQgZG9lcyAiY29tcGF0aWJpbGl0eSIgbWVhbj88L2gzPgpAQCAtMTg1LDcgKzE4NSw3IEBACiA8cD5JbiBvdGhlciB3b3JkcywgY29tcGF0aWJpbGl0eSBpcyBhIHByZXJlcXVpc2l0ZSB0byBwYXJ0aWNpcGF0ZSBpbiB0aGUKICAgQW5kcm9pZCBhcHBzIGVjb3N5c3RlbS4gQW55b25lIGlzIHdlbGNvbWUgdG8gdXNlIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlLAogICBidXQgaWYgdGhlIGRldmljZSBpc24ndCBjb21wYXRpYmxlLCBpdCdzIG5vdCBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIEFuZHJvaWQKLSAgZWNvc3lzdGVtLCBhbmQgaXJyZWxldmFudCB0byBkZXZlbG9wZXJzLjwvcD4KKyAgZWNvc3lzdGVtLjwvcD4KIAogPGgzPldoYXQgaXMgdGhlIHJvbGUgb2YgQW5kcm9pZCBNYXJrZXQgaW4gY29tcGF0aWJpbGl0eT88L2gzPgogPHA+RGV2aWNlcyB0aGF0IGFyZSBBbmRyb2lkIGNvbXBhdGlibGUgbWF5IHNlZWsgdG8gbGljZW5zZSB0aGUgQW5kcm9pZCBNYXJrZXQKQEAgLTIwMCwxMSArMjAwLDExIEBACiAgIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbiBEb2N1bWVudCAoQ0REKSBzcGVsbHMgb3V0IHRoZSBzcGVjaWZpYyBkZXZpY2UKICAgY29uZmlndXJhdGlvbnMgdGhhdCB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGF0aWJsZS48L3A+CiA8cD5Gb3IgZXhhbXBsZSwgdGhvdWdoIHRoZSBBbmRyb2lkIHNvdXJjZSBjb2RlIGNvdWxkIGJlIHBvcnRlZCB0byBydW4gb24gYQotICBkZXZpY2UgdGhhdCBkb2Vzbid0IGhhdmUgYSBjYW1lcmEsIHRoZSBDREQgcmVxdWlyZXMgdGhhdCBpbiBvcmRlciB0byBiZQotICBjb21wYXRpYmxlLCBhbGwgZGV2aWNlcyBtdXN0IGhhdmUgYSBjYW1lcmEuIFRoaXMgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVseQotICBvbiBhIGNvbnNpc3RlbnQgc2V0IG9mIGRldmljZSBjYXBhYmlsaXRpZXMgd2hlbiB3cml0aW5nIHRoZWlyIGFwcHMuPC9wPgorICBwaG9uZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNhbWVyYSwgdGhlIENERCByZXF1aXJlcyB0aGF0IGluIG9yZGVyIHRvIGJlCisgIGNvbXBhdGlibGUsIGFsbCBwaG9uZXMgbXVzdCBoYXZlIGEgY2FtZXJhLiBUaGlzIGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlbHkKKyAgb24gYSBjb25zaXN0ZW50IHNldCBvZiBjYXBhYmlsaXRpZXMgd2hlbiB3cml0aW5nIHRoZWlyIGFwcHMuPC9wPgogPHA+VGhlIENERCB3aWxsIGV2b2x2ZSBvdmVyIHRpbWUgdG8gcmVmbGVjdCBtYXJrZXQgcmVhbGl0aWVzLiBGb3IgaW5zdGFuY2UsCi0gIHRoZSAxLjYgQ0REIG9ubHkgYWxsb3dzIGNlbGwgcGhvbmVzLCBidXQgdGhlIDIueCBDREQgYWxsb3dzIGRldmljZXMgdG8gb21pdAorICB0aGUgMS42IENERCBvbmx5IGFsbG93cyBjZWxsIHBob25lcywgYnV0IHRoZSAyLjEgQ0REIGFsbG93cyBkZXZpY2VzIHRvIG9taXQKICAgdGVsZXBob255IGhhcmR3YXJlLCBhbGxvd2luZyBmb3Igbm9uLXBob25lIGRldmljZXMgc3VjaCBhcyB0YWJsZXQtc3R5bGUKICAgbXVzaWMgcGxheWVycyB0byBiZSBjb21wYXRpYmxlLiBBcyB3ZSBtYWtlIHRoZXNlIGNoYW5nZXMsIHdlIHdpbGwgYWxzbwogICBhdWdtZW50IEFuZHJvaWQgTWFya2V0IHRvIGFsbG93IGRldmVsb3BlcnMgdG8gcmV0YWluIGNvbnRyb2wgb3ZlciB3aGVyZQpAQCAtMjE0LDEzICsyMTQsMTAgQEAKICAgZGV2aWNlcy48L3A+CiAKIDxoMz5JZiBteSBkZXZpY2UgaXMgY29tcGF0aWJsZSwgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGhhdmUgYWNjZXNzIHRvIEFuZHJvaWQgTWFya2V0IGFuZCBicmFuZGluZz88L2gzPgotPHA+QW5kcm9pZCBNYXJrZXQgaXMgYSBzZXJ2aWNlIG9wZXJhdGVkIGJ5IEdvb2dsZS4gRm9yIGxlZ2FsIGFuZCBidXNpbmVzcwotICByZWFzb25zLCBHb29nbGUgaXNuJ3QgYWJsZSB0byBtYWtlIHRoYXQgc2VydmljZSBhdmFpbGFibGUgaW4gYWxsIHBhcnRzIG9mCi0gIHRoZSB3b3JsZC4gU2ltaWxhcmx5LCBHb29nbGUgaXMgdW5hYmxlIHRvIGxpY2Vuc2UgdGhlIEFuZHJvaWQgdHJhZGVtYXJrIGZvcgotICB1c2UgaW4gYWxsIGNhc2VzLjwvcD4KLTxwPkFzIGEgcmVzdWx0LCBhY2hpZXZpbmcgY29tcGF0aWJpbGl0eSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IGVudGl0bGUgYQotICBkZXZpY2UgdG8gaW5jbHVkZSBBbmRyb2lkIE1hcmtldCBvciB1c2UgdGhlIEFuZHJvaWQgbmFtZS4gRGV2aWNlCi0gIG1hbnVmYWN0dXJlcnMgc2hvdWxkIGNvbnRhY3QgR29vZ2xlIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhvc2UgdG9vbHMuPC9wPgorPHA+QW5kcm9pZCBNYXJrZXQgaXMgYSBzZXJ2aWNlIG9wZXJhdGVkIGJ5IEdvb2dsZS4gQWNoaWV2aW5nIGNvbXBhdGliaWxpdHkgaXMKKyAgIGEgcHJlcmVxdWlzaXRlIGZvciBvYnRhaW5pbmcgYWNjZXNzIHRvIHRoZSBBbmRyb2lkIE1hcmtldCBzb2Z0d2FyZSBhbmQgYnJhbmRpbmcuCisgICBEZXZpY2UgbWFudWZhY3R1cmVycyBzaG91bGQgY29udGFjdCBHb29nbGUgdG8gb2J0YWluIGFjY2VzcyB0byBBbmRyb2lkCisgICBNYXJrZXQuPC9wPgogCiA8aDM+SWYgSSBhbSBub3QgYSBtYW51ZmFjdHVyZXIsIGhvdyBjYW4gSSBnZXQgQW5kcm9pZCBNYXJrZXQ/PC9oMz4KIDxwPkFuZHJvaWQgTWFya2V0IGlzIG9ubHkgbGljZW5zZWQgdG8gaGFuZHNldCBtYW51ZmFjdHVyZXJzIHNoaXBwaW5nIGRldmljZXMuCkBAIC0yMjksOSArMjI2LDkgQEAKIAogPGgzPkhvdyBjYW4gSSBnZXQgYWNjZXNzIHRvIHRoZSBHb29nbGUgYXBwcyBmb3IgQW5kcm9pZCwgc3VjaCBhcyBNYXBzPzwvaDM+CiA8cD5UaGUgR29vZ2xlIGFwcHMgZm9yIEFuZHJvaWQsIHN1Y2ggYXMgWW91VHViZSwgR29vZ2xlIE1hcHMgYW5kIE5hdmlnYXRpb24sCi0gIEdtYWlsLCBhbmQgc28gb24gYXJlIG5vdCBwYXJ0IG9mIEFuZHJvaWQsIGFuZCBhcmUgbGljZW5zZWQgc2VwYXJhdGVseS4KLSAgQ29udGFjdCBhbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tIGZvciBpbnF1aXJpZXMgcmVsYXRlZCB0byB0aG9zZQotICBhcHBzLjwvcD4KKyAgR21haWwsIGFuZCBzbyBvbiBhcmUgR29vZ2xlIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgQW5kcm9pZCwgYW5kCisgIGFyZSBsaWNlbnNlZCBzZXBhcmF0ZWx5LiAgQ29udGFjdCBhbmRyb2lkLXBhcnRuZXJzaGlwc0Bnb29nbGUuY29tIGZvcgorICBpbnF1aXJpZXMgcmVsYXRlZCB0byB0aG9zZSBhcHBzLjwvcD4KIAogPGgzPklzIGNvbXBhdGliaWxpdHkgbWFuZGF0b3J5PzwvaDM+CiA8cD5Oby4gVGhlIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBQcm9ncmFtIGlzIG9wdGlvbmFsLiBTaW5jZSB0aGUgQW5kcm9pZCBzb3VyY2UKQEAgLTI0Niw3ICsyNDMsNyBAQAogICB0ZXN0IGEgZGV2aWNlLjwvcD4KIAogPGgzPkhvdyBsb25nIGRvZXMgY29tcGF0aWJpbGl0eSB0YWtlPzwvaDM+Ci08cD5UaGUgcHJvY2VzcyBpcyBhdXRvbWF0aWMuIFRoZSBDb21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgZ2VuZXJhdGVzIGEgcmVwb3J0Cis8cD5UaGUgcHJvY2VzcyBpcyBhdXRvbWF0ZWQuIFRoZSBDb21wYXRpYmlsaXR5IFRlc3QgU3VpdGUgZ2VuZXJhdGVzIGEgcmVwb3J0CiAgIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIEdvb2dsZSB0byB2ZXJpZnkgY29tcGF0aWJpbGl0eS4gRXZlbnR1YWxseSB3ZSBpbnRlbmQKICAgdG8gcHJvdmlkZSBzZWxmLXNlcnZpY2UgdG9vbHMgdG8gdXBsb2FkIHRoZXNlIHJlcG9ydHMgdG8gYSBwdWJsaWMgZGF0YWJhc2UuPC9wPgogCkBAIC0yNzEsMTIgKzI2OCwxNSBAQAogICBnZW5lcmFsbHkgaGF2ZSBtdWNoIGVmZmVjdCBvbiB0aGlyZC1wYXJ0eSBhcHBzLiBBcyBzdWNoLCBkZXZpY2UgYnVpbGRlcnMgYXJlCiAgIGZyZWUgdG8gY3VzdG9taXplIHRoZSB1c2VyIGludGVyZmFjZSBhcyBtdWNoIGFzIHRoZXkgbGlrZS4gVGhlIENvbXBhdGliaWxpdHkKICAgRGVmaW5pdGlvbiBEb2N1bWVudCBkb2VzIHJlc3RyaWN0IHRoZSBkZWdyZWUgdG8gd2hpY2ggT0VNcyBtYXkgYWx0ZXIgdGhlCi0gIHN5c3RlbSB1c2VyIGludGVyZmFjZSBmb3IgdGhlIGZldyBhcmVhcyB0aGF0IGRvIGltcGFjdCB0aGlyZC1wYXJ0eSBhcHBzLjwvcD4KKyAgc3lzdGVtIHVzZXIgaW50ZXJmYWNlIGZvciBhcmVhcyB0aGF0IGRvIGltcGFjdCB0aGlyZC1wYXJ0eSBhcHBzLjwvcD4KIAogPGgzPldoZW4gYXJlIGNvbXBhdGliaWxpdHkgZGVmaW5pdGlvbnMgcmVsZWFzZWQgZm9yIG5ldyBBbmRyb2lkIHZlcnNpb25zPzwvaDM+CiA8cD5PdXIgZ29hbCBpcyB0byByZWxlYXNlIG5ldyB2ZXJzaW9ucyBvZiBBbmRyb2lkIENvbXBhdGliaWxpdHkgRGVmaW5pdGlvbgogICBEb2N1bWVudHMgKENERHMpIG9uY2UgdGhlIGNvcnJlc3BvbmRpbmcgQW5kcm9pZCBwbGF0Zm9ybSB2ZXJzaW9uIGhhcwotICBjb252ZXJnZWQgZW5vdWdoIHRvIHBlcm1pdCBpdC4gU2luY2UgdGhlIENERHM8L3A+CisgIGNvbnZlcmdlZCBlbm91Z2ggdG8gcGVybWl0IGl0LiBXaGlsZSB3ZSBjYW4ndCByZWxlYXNlIGEgZmluYWwgZHJhZnQgb2YgYSBDREQKKyAgZm9yIGFuIEFuZHJvaWQgc29mdHdhcmUgdmVyc2lvbiBiZWZvcmUgdGhlIGZpcnN0IGZsYWdzaGlwIGRldmljZSBzaGlwcyB3aXRoCisgIHRoYXQgc29mdHdhcmUsIGZpbmFsIENERHMgd2lsbCBhbHdheXMgYmUgcmVsZWFzZWQgYWZ0ZXIgdGhlIGZpcnN0IGRldmljZS4KKyAgSG93ZXZlciwgd2hlcmV2ZXIgcHJhY3RpY2FsIHdlIHdpbGwgbWFrZSBkcmFmdCB2ZXJzaW9ucyBvZiBDRERzIGF2YWlsYWJsZS48L3A+CiAKIDxoMz5Ib3cgYXJlIGRldmljZSBtYW51ZmFjdHVyZXJzJyBjb21wYXRpYmlsaXR5IGNsYWltcyB2YWxpZGF0ZWQ/PC9oMz4KIDxwPlRoZXJlIGlzIG5vIHZhbGlkYXRpb24gcHJvY2VzcyBmb3IgQW5kcm9pZCBkZXZpY2UgY29tcGF0aWJpbGl0eS4gSG93ZXZlciwKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2ltYWdlcy9jb2RlLWxpbmVzLnBuZyBiL3Bkay9kb2NzL2ltYWdlcy9jb2RlLWxpbmVzLnBuZwppbmRleCBhY2ZiNzdiLi5mODYyNjBjIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9pbWFnZXMvY29kZS1saW5lcy5wbmcKKysrIGIvcGRrL2RvY3MvaW1hZ2VzL2NvZGUtbGluZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Bkay9kb2NzL2luZGV4LmpkIGIvcGRrL2RvY3MvaW5kZXguamQKaW5kZXggMjE3ODc3ZC4uNDc4NmVkNSAxMDA2NDQKLS0tIGEvcGRrL2RvY3MvaW5kZXguamQKKysrIGIvcGRrL2RvY3MvaW5kZXguamQKQEAgLTEsNyArMSwyMiBAQAogcGFnZS50aXRsZT1XZWxjb21lIHRvIEFuZHJvaWQKIGhvbWU9dHJ1ZQogQGpkOmJvZHkKLTxkaXYgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogNDUlOyBmb250LXNpemU6IDEuM2VtOyI+Cis8ZGl2IHN0eWxlPSJmbG9hdDogcmlnaHQ7IHdpZHRoOiAzNSU7Ij4KKzxoMyBzdHlsZT0icGFkZGluZy10b3A6IDBweDsiPk5ld3M8L2gzPgorPHA+PGI+Q29tcGF0aWJpbGl0eSBUb29scyBmb3IgQW5kcm9pZCAyLjI8L2I+PGJyLz4KK1RoZSBjb21wYXRpYmlsaXR5IHRvb2xzIGZvciBBbmRyb2lkIDIuMiBoYXZlIGJlZW4gcHVibGlzaGVkLiBUaGlzIGluY2x1ZGVzIHRoZQorQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50IGZvciBBbmRyb2lkIDIuMiwgYW5kIHRoZSBDb21wYXRpYmlsaXR5IFRlc3QKK1N1aXRlIHZlcnNpb24gMi4yIHIxLiBXaXRoIHRoZXNlIHRvb2xzLCBkZXZpY2UgbWFudWZhY3R1cmVycyBjYW4gZmluYWxpemUKK2J1aWxkcyBvZiBBbmRyb2lkIDIuMiBmb3IgbmV3IGFuZCBleGlzdGluZyBkZXZpY2VzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKKzxhIGhyZWY9IntAZG9jUm9vdH1jb21wYXRpYmlsaXR5L2luZGV4Lmh0bWwiPnZpc2l0IHRoZSBDb21wYXRpYmlsaXR5IHBhZ2UuPC9hPgorPC9wPgorPHA+PGI+SW50cm9kdWNpbmcgdGhlIENvbXBhdGliaWxpdHkgUHJvZ3JhbTwvYj48YnIvPgorV2UncmUgcGxlYXNlZCB0byBpbnRyb2R1Y2UgdGhlIEFuZHJvaWQgQ29tcGF0aWJpbGl0eSBQcm9ncmFtLiBXZSd2ZSByZWxlYXNlZAordHdvIHRvb2xzIC0tIHRoZSBDb21wYXRpYmlsaXR5IERlZmluaXRpb24gRG9jdW1lbnQgYW5kIHRoZSBDb21wYXRpYmlsaXR5IFRlc3QKK1N1aXRlIC0tIHRvIGhlbHAgZGV2aWNlIG1hbnVmYWN0dXJlcnMgYnVpbGQgY29tcGF0aWJsZSBkZXZpY2VzLjwvcD4KKzwvZGl2PgorPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBwYWRkaW5nLXJpZ2h0OiAxLjVlbTsiIHNyYz0ie0Bkb2NSb290fWltYWdlcy9ob21lLWJ1Z2Ryb2lkLnBuZyIgYWx0PSJBbmRyb2lkIE1hc2NvdCIvPgorPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxLjNlbTsiPgogICA8cD5IZXJlIHlvdSBjYW4gZmluZCB0aGUgaW5mb3JtYXRpb24gYW5kIHNvdXJjZSBjb2RlIHlvdSBuZWVkIHRvIGJ1aWxkIGFuCiAgIEFuZHJvaWQtY29tcGF0aWJsZSBkZXZpY2UuPC9wPgogICA8cD5BbmRyb2lkIGlzIGFuIG9wZW4tc291cmNlIHNvZnR3YXJlIHN0YWNrIGZvciBtb2JpbGUgZGV2aWNlcywgYW5kIGEKQEAgLTEyLDUxICsyNyw0MCBAQAogICBjcmVhdGVkIEFuZHJvaWQsIGFuZCBtYWRlIGl0cyBzb3VyY2UgY29kZSBvcGVuLjwvcD4KICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fWFib3V0L2luZGV4Lmh0bWwiPkxlYXJuIG1vcmUgJnJhcXVvOzwvYT48L3A+CiA8L2Rpdj4KLTxkaXYgc3R5bGU9ImZsb2F0OiByaWdodDsgd2lkdGg6IDM1JTsiPgotPGgzIHN0eWxlPSJwYWRkaW5nLXRvcDogMHB4OyI+TmV3czwvaDM+Ci08cD48Yj5TaXRlIHJlZGVzaWduPC9iPjxici8+Ci1Zb3UncmUgbG9va2luZyBhdCB0aGUgbmV3IGFuZCBpbXByb3ZlZCBzb3VyY2UuYW5kcm9pZC5jb20hIFdlJ3ZlIHVwZGF0ZWQKLXRoZSBsYXlvdXQgYW5kIHNpdGUgZGVzaWduLCBhbmQgYWxzbyBhZGRlZCBuZXcgaW5mb3JtYXRpb24uIFdlIGhvcGUgeW91IGZpbmQKLXRoZXNlIGltcHJvdmVtZW50cyBoZWxwZnVsLjwvcD4KLTxwPjxiPkludHJvZHVjaW5nIHRoZSBDb21wYXRpYmlsaXR5IFByb2dyYW08L2I+PGJyLz4KLVdlJ3JlIHBsZWFzZWQgdG8gaW50cm9kdWNlIHRoZSBBbmRyb2lkIENvbXBhdGliaWxpdHkgUHJvZ3JhbS4gV2UndmUgcmVsZWFzZWQKLXR3byB0b29scyAtLSB0aGUgQ29tcGF0aWJpbGl0eSBEZWZpbml0aW9uIERvY3VtZW50IGFuZCB0aGUgQ29tcGF0aWJpbGl0eSBUZXN0Ci1TdWl0ZSAtLSB0byBoZWxwIGRldmljZSBtYW51ZmFjdHVyZXJzIGJ1aWxkIGNvbXBhdGlibGUgZGV2aWNlcy4gRnVsbCBkZXRhaWxzCi1vZiB0aGUgQ29tcGF0aWJpbGl0eSBQcm9ncmFtIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMTAuPC9wPgotPC9kaXY+Ci08aW1nIHN0eWxlPSJmbG9hdDogcmlnaHQ7IHBhZGRpbmctcmlnaHQ6IDEuNWVtOyIgc3JjPSJ7QGRvY1Jvb3R9aW1hZ2VzL2hvbWUtYnVnZHJvaWQucG5nIiBhbHQ9IkFuZHJvaWQgTWFzY290Ii8+CiAKIDxkaXYgc3R5bGU9ImNsZWFyOiBib3RoOyIvPgogCiA8dGFibGUgYm9yZGVyPSIwIiBzdHlsZT0iYm9yZGVyOiAwcHg7IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHg7Ij48dHI+PHRkIGFsaWduPSJjZW50ZXIiIHN0eWxlPSJib3JkZXI6IDBweDsgbWFyZ2luOiAwcHg7IHBhZGRpbmc6IDBweDsiPgogPGRpdiBjbGFzcz0icmVib3ggbGlsIiBzdHlsZT0iZmxvYXQ6IGxlZnQ7IHdpZHRoOiAzMCU7IG1hcmdpbjogMWVtOyI+IAotICA8aDIgc3R5bGU9ImNvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogIzk1QzBEMDsgYm9yZGVyOiAwcHg7Ij5HZXQgSW52b2x2ZWQ8L2gyPiAKKyAgPGgyIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICM5NUMwRDA7IGJvcmRlcjogMHB4OyI+U291cmNlPC9oMj4gCiAgIDxkaXYgY2xhc3M9InAiPiAKLSAgICA8cD48aW1nIHNyYz0iaW1hZ2VzL2xpbC13cmVuY2gucG5nIiBhbHQ9IiIgc3R5bGU9Im1hcmdpbjogMWVtOyIvPgorICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGlsLXdyZW5jaC5wbmciIGFsdD0iIiBzdHlsZT0ibWFyZ2luOiAxZW07IG1hcmdpbi1ib3R0b206IDVlbTsiLz4KICAgICBJZiB5b3UncmUgaW50ZXJlc3RlZCBpbiBjb250cmlidXRpbmcgdG8gdGhlIEFuZHJvaWQgc291cmNlIGNvZGUgb3IgaGVscGluZwotICAgIG91dCB3aXRoIHRoZSBwcm9qZWN0IGluIHNvbWUgb3RoZXIgd2F5LCBjbGljayBoZXJlLjwvcD4gCi0gICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9pbmRleC5odG1sIj5Nb3JlICZyYXF1bzs8L2E+PC9wPiAKKyAgICBvdXQgd2l0aCB0aGUgb3Blbi1zb3VyY2UgcHJvamVjdCwgb3VyIFNvdXJjZSBwYWdlcyBoYXZlIHRoZSBpbmZvcm1hdGlvbgorICAgIHlvdSBuZWVkLjwvcD4gCisgICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9pbmRleC5odG1sIj5HZXQgSW52b2x2ZWQgJnJhcXVvOzwvYT48L3A+IAogICA8L2Rpdj4gCiA8L2Rpdj4gCiAKIDxkaXYgY2xhc3M9InJlYm94IGxpbCIgc3R5bGU9ImZsb2F0OiBsZWZ0OyB3aWR0aDogMzAlOyBtYXJnaW46IDFlbTsiPiAKLSAgPGgyIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICM5NUMwRDA7IGJvcmRlcjogMHB4OyI+QnVpbGQgYSBEZXZpY2U8L2gyPiAKKyAgPGgyIHN0eWxlPSJjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICM5NUMwRDA7IGJvcmRlcjogMHB4OyI+UG9ydGluZzwvaDI+IAogICA8ZGl2IGNsYXNzPSJwIj4gCi0gICAgPHA+PGltZyBzcmM9ImltYWdlcy9saWwtd3JlbmNoLnBuZyIgYWx0PSIiIHN0eWxlPSJtYXJnaW46IDFlbTsiLz4KLSAgICBJZiB5b3UncmUgYW4gZW5naW5lZXIgYnVpbGRpbmcgYSBkZXZpY2UgaW50ZW5kZWQgdG8gcnVuIHRoZSBBbmRyb2lkCi0gICAgc29mdHdhcmUgc3RhY2ssIGNsaWNrIGhlcmUgdG8gZmluZCBwb3J0aW5nIGluZm9ybWF0aW9uIGFuZCB0aXBzLjwvcD4gCi0gICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fXBvcnRpbmcvaW5kZXguaHRtbCI+TW9yZSAmcmFxdW87PC9hPjwvcD4gCisgICAgPHA+PGltZyBzcmM9ImltYWdlcy9saWwtd3JlbmNoLnBuZyIgYWx0PSIiIHN0eWxlPSJtYXJnaW46IDFlbTsgbWFyZ2luLWJvdHRvbTogNWVtOyIvPgorICAgIElmIHlvdSdyZSBhbiBlbmdpbmVlciBidWlsZGluZyBhIGRldmljZQorICAgIGludGVuZGVkIHRvIHJ1biB0aGUgQW5kcm9pZCBzb2Z0d2FyZSBzdGFjaywgbG9vayBhdCBvdXIgUG9ydGluZyBwYWdlcyBmb3IKKyAgICBpbmZvcm1hdGlvbiBhbmQgdGlwcy48L3A+IAorICAgIDxwPjxhIGhyZWY9IntAZG9jUm9vdH1wb3J0aW5nL2luZGV4Lmh0bWwiPkJ1aWxkIGEgRGV2aWNlICZyYXF1bzs8L2E+PC9wPiAKICAgPC9kaXY+IAogPC9kaXY+IAogCiA8ZGl2IGNsYXNzPSJyZWJveCBsaWwiIHN0eWxlPSJmbG9hdDogbGVmdDsgd2lkdGg6IDMwJTsgbWFyZ2luOiAxZW07Ij4gCiAgIDxoMiBzdHlsZT0iY29sb3I6IHdoaXRlOyBiYWNrZ3JvdW5kLWNvbG9yOiAjOTVDMEQwOyBib3JkZXI6IDBweDsiPkNvbXBhdGliaWxpdHk8L2gyPiAKICAgPGRpdiBjbGFzcz0icCI+IAotICAgIDxwPjxpbWcgc3JjPSJpbWFnZXMvbGlsLXdyZW5jaC5wbmciIGFsdD0iIiBzdHlsZT0ibWFyZ2luOiAxZW07Ii8+Ci0gICAgSWYgeW91J3JlIGFuIE9FTSBvciBvdGhlciBvcmdhbml6YXRpb24gYnVpbGRpbmcgYW4gQW5kcm9pZCBkZXZpY2UsIGNsaWNrCi0gICAgaGVyZSB0byBmaW5kIG91dCBob3cgdG8gZW5zdXJlIHRoYXQgeW91ciBkZXZpY2UgaXMgZnVsbHkgY29tcGF0aWJsZSwgYW5kCi0gICAgaG93IHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBiZW5lZml0cyBvZiBjb21wYXRpYmlsaXR5LjwvcD4gCi0gICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCI+TW9yZSAmcmFxdW87PC9hPjwvcD4gCisgICAgPHA+PGltZyBzcmM9ImltYWdlcy9saWwtd3JlbmNoLnBuZyIgYWx0PSIiIHN0eWxlPSJtYXJnaW46IDFlbTsgbWFyZ2luLWJvdHRvbTogNWVtOyIvPgorICAgIElmIHlvdSdyZSBhbiBvcmdhbml6YXRpb24gYnVpbGRpbmcgYW4gQW5kcm9pZCBkZXZpY2UsIHlvdSdsbCB3YW50IHRvIGNoZWNrIG91dCBvdXIKKyAgICBDb21wYXRpYmlsaXR5IHBhZ2VzIHRvIGZpbmQgb3V0IGhvdyB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUgYmVuZWZpdHMgb2YKKyAgICBjb21wYXRpYmlsaXR5LjwvcD4gCisgICAgPHA+PGEgaHJlZj0ie0Bkb2NSb290fWNvbXBhdGliaWxpdHkvaW5kZXguaHRtbCI+R2V0IENvbXBhdGlibGUgJnJhcXVvOzwvYT48L3A+IAogICA8L2Rpdj4gCiA8L2Rpdj4gCiA8L3RkPjwvdHI+PC90YWJsZT4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3BvcnRpbmcvYmx1ZXRvb3RoLmpkIGIvcGRrL2RvY3MvcG9ydGluZy9ibHVldG9vdGguamQKaW5kZXggY2ViODY4My4uYzc5MmJkMiAxMDA3NTUKLS0tIGEvcGRrL2RvY3MvcG9ydGluZy9ibHVldG9vdGguamQKKysrIGIvcGRrL2RvY3MvcG9ydGluZy9ibHVldG9vdGguamQKQEAgLTE3LDcgKzE3LDggQEAKIDwvZGl2PgogPC9kaXY+CiAKLTxwPkFuZHJvaWQncyBCbHVldG9vdGggc3RhY2sgdXNlcyBCbHVlWiB2ZXJzaW9uIDMuMzYgZm9yIEdBUCwgU0RQLCBhbmQgUkZDT01NIHByb2ZpbGVzLCBhbmQgaXMgYSBTSUctcXVhbGlmaWVkIEJsdWV0b290aCAyLjAgKyBFRFIgaG9zdCBzdGFjay48L3A+Cis8cD5BbmRyb2lkJ3MgQmx1ZXRvb3RoIHN0YWNrIHVzZXMgQmx1ZVogZm9yIEdBUCwgU0RQLCBhbmQgUkZDT01NIHByb2ZpbGVzLCBhbmQKK2lzIGEgU0lHLXF1YWxpZmllZCBCbHVldG9vdGggc3RhY2suIDwvcD4KIAogPHA+Qmx1ZXogaXMgR1BMIGxpY2Vuc2VkLCBzbyB0aGUgQW5kcm9pZCBmcmFtZXdvcmsgaW50ZXJhY3RzIHdpdGggdXNlcnNwYWNlIGJsdWV6IGNvZGUgdGhyb3VnaCBELUJVUyBJUEMgdG8gYXZvaWQgcHJvcHJpZXRhcnkgY29kZS48L3A+CiAKQEAgLTMzLDcgKzM0LDcgQEAKIAogPGEgbmFtZT0iYW5kcm9pZEJsdWV0b290aFBvcnRpbmciPjwvYT48aDM+UG9ydGluZzwvaDM+CiAKLTxwPkJsdWVaIGlzIEJsdWV0b290aCAyLjAgY29tcGF0aWJsZSBhbmQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgMi4wIGNoaXBzZXQuIFRoZXJlIGFyZSB0d28gaW50ZWdyYXRpb24gcG9pbnRzOjwvcD4KKzxwPkJsdWVaIGlzIEJsdWV0b290aCAyLjEgY29tcGF0aWJsZSBhbmQgc2hvdWxkIHdvcmsgd2l0aCBhbnkgMi4xIGNoaXBzZXQgYW5kIGlzIGJhY2t3YXJkIGNvbXBhdGliaWxlIHdpdGggb2xkZXIgQmx1ZXRvb3RoIHZlcnNpb25zLiBUaGVyZSBhcmUgdHdvIGludGVncmF0aW9uIHBvaW50czo8L3A+CiA8cD48dWw+CiA8bGk+VUFSVCBkcml2ZXI8L2xpPgogPGxpPkJsdWV0b290aCBQb3dlciBPbiAvIE9mZjwvbGk+CkBAIC02Nyw3ICs2OCw3IEBACiAKIDxhIG5hbWU9ImFuZHJvaWRCbHVldG9vdGhUcm91Ymxlc2hvb3RpbmciPjwvYT48aDM+VHJvdWJsZXNob290aW5nPC9oMz4KIDxwPjxzdHJvbmc+RGVidWdnaW5nPC9zdHJvbmc+PC9wPgotPHA+VG8gZGVidWcgeW91ciBibHVldG9vdGggaW1wbGVtZW50YXRpb24sIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGxvZ3MgKDxjb2RlPmFkYiBsb2djYXQ8L2NvZGU+KSBhbmQgbG9vayBmb3IgRVJSUk9SIGFuZCBXQVJOSU5HIG1lc3NhZ2VzIHJlZ2FyZGluZyBCbHVldG9vdGguIAorPHA+VG8gZGVidWcgeW91ciBibHVldG9vdGggaW1wbGVtZW50YXRpb24sIHN0YXJ0IGJ5IHJlYWRpbmcgdGhlIGxvZ3MgKDxjb2RlPmFkYiBsb2djYXQ8L2NvZGU+KSBhbmQgbG9vayBmb3IgRVJSUk9SIGFuZCBXQVJOSU5HIG1lc3NhZ2VzIHJlZ2FyZGluZyBCbHVldG9vdGguCiAgIEFuZG9pcmQgdXNlcyBCbHVleiwgd2hpY2ggY29tZXMgd2l0aCBzb21lIHVzZWZ1bCBkZWJ1Z2dpbmcgdG9vbHMuIFRoZSBzbmlwcGV0IGJlbG93IHByb3ZpZGVzIGV4YW1wbGVzIGluIGEgc3VnZ2VzdGVkIG9yZGVyOjwvcD4KIDxwcmU+CiBoY2ljb25maWcgLWEgIAkJCSMgcHJpbnQgQlQgY2hpcHNldCBhZGRyZXNzIGFuZCBmZWF0dXJlcy4gVXNlZnVsIHRvIGNoZWNrIGlmIHlvdSBjYW4gY29tbXVuaWNhdGUgd2l0aCB5b3VyIEJUIGNoaXBzZXQuCkBAIC0xNTgsMTQgKzE1OSw3OSBAQAogICA8bGk+UURJRCBCMDE1MjYxOiBIb3N0IHN0YWNrIChTRFAsIEwyQ0FQLCBHQVAsIFJGQ09NTSwgU1BQLCBBVkNUUCwgQVZSQ1AsIEdBVkRQLCBBVkRUUCwgQTJEUCk8L2xpPgogICA8bGk+UURJRCBCMDE1MjYyOiBFUEwgZm9yIEhUQyBTYXBwaGlyZSAoSFNQLCBIRlApPC9saT4KIDwvdWw+Cis8aDQ+QW5kcm9pZCAyLjAvMi4xIHJlbGVhc2UgKGVjbGFpcik8L2g0PgorPGg0PlBsYXRmb3JtIGZlYXR1cmVzPC9oND4KKzx1bD4KKyAgPGxpPkJhc2VkIG9uIEJsdWV6IDQuNDcgd2l0aCBMaW51eCBLZXJuZWwgMi42LjI5PC9saT4KKyAgPGxpPkJsdWV0b290aCAyLjErRURSIGhvc3Qgc3RhY2s8L2xpPgorICA8dWw+CisgICAgPGxpPlN1cHBvcnQgZm9yIGF1dG8tcGFpcmluZyB3aXRoICcwMDAwJyBkZXZpY2VzPC9saT4KKyAgICA8bGk+U3VwcG9ydCBmb3IgU2ltcGxlIFNlY3VyZSBQYWlyaW5nPC9saT4KKyAgPC91bD4KKyAgPGxpPkhlYWRzZXQgUHJvZmlsZSAxLjEgaW4gQXVkaW8gR2F0ZXdheSByb2xlPC9saT4KKyAgPGxpPkhhbmRzZnJlZSBQcm9maWxlIDEuNSBpbiBBdWRpbyBHYXRld2F5IHJvbGU8L2xpPgorICA8dWw+CisgICAgPGxpPlRocmVlLXdheSBjYWxsaW5nICAgIDwvbGk+CisgICAgPGxpPlBob25lYm9vayBvdmVyIEFUIGNvbW1hbmRzICAgIDwvbGk+CisgICAgPGxpPlZvbHVtZSBzeW5jaHJvbml6YXRpb248L2xpPgorICAgIDxsaT5lU0NPPC9saT4KKyAgICA8bGk+RXh0ZW5zaXZlIGJ1ZyBmaXhlcyBhbmQgY29tcGF0aWJpbGl0eSBpbXByb3ZlbWVudHM8L2xpPgorICA8L3VsPgorICA8bGk+U3RlcmVvIEJsdWV0b290aCAoQTJEUCAxLjIpIGluIFNvdXJjZSByb2xlPC9saT4KKyAgPHVsPgorICAgIDxsaT5BVkRUUCAxLjIgaW4gQWNjZXB0b3IgYW5kIEluaXRpYXRvciByb2xlczwvbGk+CisgICAgPGxpPkdBVkRUUCAxLjAgaW4gQWNjZXB0b3IgYW5kIEluaXRpYXRvciByb2xlczwvbGk+CisgICAgPGxpPjQ0LjEga2h6LCBzdGVyZW8sIHNvZnR3YXJlIFNCQyBjb2RlYzwvbGk+CisgIDwvdWw+CisgIDxsaT5SZW1vdGUgQ29udHJvbCAoQVZSQ1AgMS4wKSBpbiBUYXJnZXQgcm9sZTwvbGk+CisgIDx1bD4KKyAgICA8bGk+QVZDVFAgMS4zIGluIFRhcmdldCByb2xlPC9saT4KKyAgICA8bGk+cGxheS9wYXVzZS9zdG9wL3ByZXYvbmV4dDwvbGk+CisgIDwvdWw+CisgIDxsaT4gT2JqZWN0IFB1c2ggUHJvZmlsZSB2ZXJzaW9uIDEuMSA8L2xpPgorICA8dWw+CisgICAgIDxsaT5BZGRzIGFiaWxpdHkgdG8gdHJhbnNmZXIgcGljdHVyZXMsIHZpZGVvczwvbGk+CisgICAgIDxsaT5UcmFuc2ZlciBvZiBjb250YWN0cyB1c2luZyB2Q2FyZCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgcmVsZWFzZS48L2xpPgorICA8L3VsPgorICA8bGk+UGhvbmUgQm9vayBBZGRyZXNzIFByb2ZpbGUgdmVyc2lvbiAxLjA8L2xpPgorICA8dWw+CisgICAgPGxpPlBob25lIEJvb2sgU2VydmVyIEVxdWlwbWVudCAoUFNFKSByb2xlIHN1cHBvcnRlZDwvbGk+CisgIDwvdWw+CisgIDxsaT5Vc2luZyBKYXZhIEJsdWV0b290aCBBUElzLCBhbiBBbmRyb2lkIGFwcGxpY2F0aW9uIGNhbiBwZWZvcm0gdGhlCisgIGZvbGxvd2luZzo8L2xpPgorICA8dWw+CisgICA8bGk+U2NhbiBmb3Igb3RoZXIgQmx1ZXRvb3RoIGRldmljZXMgPC9saT4KKyAgIDxsaT5RdWVyeSB0aGUgbG9jYWwgQmx1ZXRvb3RoIGFkYXB0ZXIgZm9yIHBhaXJlZCBCbHVldG9vdGggZGV2aWNlcyA8L2xpPgorICAgPGxpPkVzdGFibGlzaCBSRkNPTU0gY2hhbm5lbHMgPC9saT4KKyAgIDxsaT5Db25uZWN0IHRvIG90aGVyIGRldmljZXMgdGhyb3VnaCBzZXJ2aWNlIGRpc2NvdmVyeSA8L2xpPgorICAgPGxpPlRyYW5zZmVyIGRhdGEgdG8gYW5kIGZyb20gb3RoZXIgZGV2aWNlcyA8L2xpPgorICAgPGxpPk1hbmFnZSBtdWx0aXBsZSBjb25uZWN0aW9ucyA8L2xpPgorICA8L3VsPgorICA8bGk+U3VwcG9ydCBmb3IgQmx1ZXRvb3RoIGVuYWJsZWQgY2FyIGFuZCBkZXNrIGRvY2tzPC9saT4KKyAgPHVsPgorICAgPGxpPkZyYW1ld29yayBzdXBwb3J0IGZvciByb3V0aW5nIFBob25lIENhbGwgQXVkaW8gYW5kIEEyRFAgc3RyZWFtaW5nIHVzaW5nCisgICBjYXIgYW5kIGRlc2sgZG9ja3MuIDwvbGk+CisgIDwvdWw+Cis8L3VsPgorCis8aDQ+QW5kcm9pZCAyLjIgIHJlbGVhc2UgKEZyb3lvKTwvaDQ+Cis8aDQ+UGxhdGZvcm0gZmVhdHVyZXM8L2g0PgorPHVsPgorICA8bGk+QmFzZWQgb24gQmx1ZXogNC40NyB3aXRoIExpbnV4IEtlcm5lbCAyLjYuMzI8L2xpPgorICA8bGk+Tm8gbmV3IHByb2ZpbGVzIGFkZGVkLjwvbGk+CisgIDxsaT5BZGRlZCBhYmlsaXR5IHRvIHNoYXJlIGNvbnRhY3RzIHVzaW5nIHZDYXJkPC9saT4KKyAgPGxpPkFkZGVkIGFiaWxpdHkgdG8gZXhwb3J0IGFsbCBjb250YWN0cyAtIHVzZWZ1bCB0byB0cmFuc2ZlciBjb250YWN0cyB0byBjYXIga2l0cyA8L2xpPgorICA8bGk+SW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIGhlYWRzZXRzIGFuZCBjYXIga2l0cy4gPC9saT4KKzwvdWw+CisKIDxoNT4mbmJzcDs8L2g1PgogPGg0PkZ1dHVyZSByZWxlYXNlczwvaDQ+CiA8cD5UaGlzIHNlY3Rpb24gb2ZmZXJzIGEgcm91Z2ggZ3VpZGUgb2Ygd2hpY2ggZmVhdHVyZXMgdGhlIHRlYW0gaXMgZGV2ZWxvcGluZyBmb3IgdGhlIG5leHQgcmVsZWFzZS4gVGhpcyBmZWF0dXJlIGxpc3QgbWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS4gSXQgaXNuJ3QgcG9zc2libGUgdG8gcG9zdCBzY2hlZHVsaW5nIGFkdmljZSB0byB0aGUgbWFpbGluZyBsaXN0cy48L3A+CiA8dWw+Ci0gIDxsaT5KYXZhIEJsdWV0b290aCBBUEk8L2xpPgotICA8bGk+Qmx1ZXogNC54IHdpdGggTGludXggS2VybmVsIDIuNi4yOTwvbGk+CiAgIDxsaT5Nb3JlIHByb2ZpbGVzLi4uPC9saT4KLSAgPGxpPkJsdWV0b290aCAyLjErRURSPC9saT4KKyAgPGxpPkltcHJvdmVkIGNvbXBhdGliaWxpdHkgd2l0aCBoZWFkc2V0cyBhbmQgY2FyIGtpdHM8L2xpPgorICA8bGk+Qmx1ZXRvb3RoIGVtdWxhdG9yIHN1cHBvcnQ8L2xpPgorICA8bGk+Qmx1ZXRvb3RoIExvdyBFbmVyZ3kgPC9saT4KIDwvdWw+CiAKIDxwPjxzdHJvbmc+RGV2ZWxvcG1lbnQgTm90ZXM8L3N0cm9uZz48L3A+CkBAIC0xODQsMTAgKzI1MCw0IEBACiBXaGlsZSBub3Qgb2ZmaWNpYWxseSBzdXBwb3J0ZWQsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4gPGNvZGU+ZHVuZDwvY29kZT4gb3IgPGNvZGU+cGFuZDwvY29kZT4gZGFlbW9ucyBhbmQsIHVzaW5nIDxjb2RlPnBwcGQ8L2NvZGU+IG9yIDxjb2RlPmlwdGFibGVzPC9jb2RlPiwgdGVzdCB0ZXRoZXJpbmcgc3VwcG9ydC4gTmV4dCBzdGVwcyBpbmNsdWRlIHBsdWJtaW5nIHRoZSBEQlVTIEFQSXMgdG8gdGhlc2UgZGFlbW9ucyB1cCBpbnRvIHRoZSBBbmRyb2lkIEphdmEgZnJhbWV3b3JrIGFuZCBhZGRpbmcgY29kZSB0byBzZXR1cCB0aGUgbmV0d29yayBwYXRocyB2aWEgPGNvZGU+cHBwZDwvY29kZT4gYW5kIC8gb3IgPGNvZGU+aXB0YWJsZXM8L2NvZGU+LjxiciAvPgogICA8YnIgLz4KICAgPC9saT4KLSAgPGxpPjxzdHJvbmc+RW11bGF0b3IgU3VwcG9ydDwvc3Ryb25nPjxiciAvPgotICBUaGUgQW5kcm9pZCBlbXVsYXRvciBkb2VzIG5vdCBzdXBwb3J0IEJsdWV0b290aCBhdCB0aGlzIHRpbWUgYW5kIHRoZXJlIGN1cnJlbnRseSBhcmVuJ3QgYW55IHBsYW5zIGZvciBpdHMgc3VwcG9ydC48YnIgLz4KLSAgICA8YnIgLz4KLSAgPC9saT4KLSAgPGxpPjxzdHJvbmc+Qmx1ZXRvb3RoIDIuMSBhbmQgU2ltcGxlIFBhaXJpbmcgU3VwcG9ydDwvc3Ryb25nPjxiciAvPgotICBJbiBvcmRlciB0byBzdXBwb3J0IHRoZXNlIGZlYXR1cmVzLCBBbmRyb2lkIG5lZWRzIHRvIG1vdmUgdG8gYSBCbHVleiA0LnggdmVyc2lvbi4gVGhpcyBjaGFuZ2UgaXMgbm90IHNjaGVkdWxlZCBhdCB0aGlzIHRpbWUuPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9wb3J0aW5nL2luc3RydW1lbnRhdGlvbl90ZXN0aW5nLmpkIGIvcGRrL2RvY3MvcG9ydGluZy9pbnN0cnVtZW50YXRpb25fdGVzdGluZy5qZAppbmRleCBjMzc2NWY0Li4wNDUyOTFmIDEwMDc1NQotLS0gYS9wZGsvZG9jcy9wb3J0aW5nL2luc3RydW1lbnRhdGlvbl90ZXN0aW5nLmpkCisrKyBiL3Bkay9kb2NzL3BvcnRpbmcvaW5zdHJ1bWVudGF0aW9uX3Rlc3RpbmcuamQKQEAgLTMzNSw3ICszMzUsNyBAQAogPHByZSBjbGFzcz0icHJldHRpZnkiPgogcHVibGljIGNsYXNzIEZyYW1ld29ya0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIgZXh0ZW5kcyBJbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIHsKIAotICAgIEBPdmVycmlkZQorICAgICYjNjQ7T3ZlcnJpZGUKICAgICBwdWJsaWMgVGVzdFN1aXRlIGdldEFsbFRlc3RzKCkgewogICAgICAgICBJbnN0cnVtZW50YXRpb25UZXN0U3VpdGUgc3VpdGUgPSBuZXcgSW5zdHJ1bWVudGF0aW9uVGVzdFN1aXRlKHRoaXMpOwogCkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICAgICAgcmV0dXJuIHN1aXRlOwogICAgIH0KIAotICAgIEBPdmVycmlkZQorICAgICYjNjQ7T3ZlcnJpZGUKICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0TG9hZGVyKCkgewogICAgICAgICByZXR1cm4gRnJhbWV3b3JrSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOwogICAgIH0KQEAgLTM3Myw3ICszNzMsNyBAQAogICAgICAgICBzdXBlcigiY29tLmV4YW1wbGUiLCBNeUFjdGl2aXR5LmNsYXNzKTsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKKyAgICAmIzY0O092ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgIHN1cGVyLnNldFVwKCk7CiAgICAgICBtTGVmdEJ1dHRvbiA9IChCdXR0b24pIGdldEFjdGl2aXR5KCkuZmluZFZpZXdCeUlkKFIuaWQubGVmdEJ1dHRvbik7CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvYnVpbGRpbmctZHJlYW0uamQgYi9wZGsvZG9jcy9zb3VyY2UvYnVpbGRpbmctZHJlYW0uamQKaW5kZXggODkzOTJmZC4uZDEzMDUyNCAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL2J1aWxkaW5nLWRyZWFtLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9idWlsZGluZy1kcmVhbS5qZApAQCAtMywxMCArMywxMCBAQAogQGpkOmJvZHkKIDxwPjxpPlRoZSBpbmZvcm1hdGlvbiBvbiB0aGlzIHBhZ2UgaXMgYSBiaXQgb3V0IG9mIGRhdGUuIFdlJ2xsIHVwZGF0ZSB0aGlzCiBwYWdlIGFzIHNvb24gYXMgd2UgY2FuLjwvaT48L3A+Ci08ZGl2PlRoZSBiYXNpYyBtYW5pZmVzdCBmb3IgY3VwY2FrZSAoYW5kIGFib3ZlKSBkZWZpbmVzIHdoaWNoIHByb2plY3RzIGFyZQorPGRpdj5UaGUgYmFzaWMgbWFuaWZlc3QgZm9yIDEuNiBkZWZpbmVzIHdoaWNoIHByb2plY3RzIGFyZQogbmVlZGVkIHRvIGRvIGEgZ2VuZXJpYyBidWlsZCBmb3IgdGhlIGVtdWxhdG9yIG9yIGZvciB1bmxvY2tlZCBEcmVhbSBkZXZpY2VzCiAoZS5nLiB0aGUgQW5kcm9pZCBEZXYgUGhvbmUgMSkuIFlvdSBuZWVkIHRvIGhhdmUgYW4gYXBwcm9wcmlhdGUgZGV2aWNlIHJ1bm5pbmcKLWEgbWF0Y2hpbmcgb2ZmaWNpYWwgaW1hZ2UuPGJyPjxicj5UbyBidWlsZCBkb251dCBvciBtYXN0ZXIgZm9yIGRyZWFtICh5b3VyCithIG1hdGNoaW5nIG9mZmljaWFsIGltYWdlLjxicj48YnI+VG8gYnVpbGQgZG9udXQgZm9yIGRyZWFtICh5b3VyCiBkZXZpY2UgbmVlZHMgdG8gYmUgYW4gQURQMSBydW5uaW5nIGFuIG9mZmljaWFsIDEuNiBzeXN0ZW0pOjxicj48b2w+PGxpPkZvbGxvdwogdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvZG93bmxvYWQuaHRtbCI+bm9ybWFsIHN0ZXBzPC9hPgogdG8gc2V0dXAgcmVwbyBhbmQgY2hlY2sgb3V0IHRoZSBzb3VyY2VzLgpAQCAtMjIsMTcgKzIyLDYgQEAKIDwvbGk+CiA8bGk+ZnJvbSB0aGlzIHBvaW50LCB0aGUgZmFzdGJvb3QgdG9vbCAod2hpY2ggaXMgcHV0IGF1dG9tYXRpY2FsbHkgaW4geW91ciBwYXRoKSBjYW4gYmUgdXNlZCB0byBmbGFzaCBhIGRldmljZTogYm9vdCB0aGUgZGV2aWNlIGludG8gdGhlIGJvb3Rsb2FkZXIgYnkgaG9sZGluZyB0aGUgYmFjayBrZXkgd2hpbGUgcHJlc3NpbmcgdGhlIHBvd2VyIGtleSwgYW5kIHJ1biAiZmFzdGJvb3QgLXcgZmxhc2hhbGwiLjxicj48L2xpPgogPC9vbD4KLVRvIGJ1aWxkIGN1cGNha2UgZm9yIGRyZWFtICh5b3VyIGRldmljZSBuZWVkcyB0byBiZSBhbiBBRFAxIHJ1bm5pbmcgYW4gb2ZmaWNpYWwgMS41IHN5c3RlbSk6PGJyPjxvbD48bGk+Rm9sbG93IHRoZSA8YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPm5vcm1hbCBzdGVwczwvYT4KLXRvIHNldHVwIHJlcG8gYW5kIGNoZWNrIG91dCB0aGUgc291cmNlcy4KLTwvbGk+Ci08bGk+QXQgdGhlIHJvb3Qgb2YgeW91ciBzb3VyY2UgdHJlZSwgcnVuICIuIGJ1aWxkL2VudnNldHVwLnNoIiBsaWtlIHlvdSBub3JtYWxseSB3b3VsZCBmb3IgYW4gZW11bGF0b3IgYnVpbGQuCi08L2xpPgotPGxpPlJ1biAibWFrZSBhZGIiIGlmIHlvdSBkb24ndCBhbHJlYWR5IGhhdmUgYWRiIGluIHlvdXIgcGF0aC48YnI+PC9saT4KLTxsaT5pbiB2ZW5kb3IvaHRjL2RyZWFtLW9wZW4vIHRoZXJlIGlzIGEgc2NyaXB0IGNhbGxlZCAiZXh0cmFjdC1maWxlcy5zaCIgdGhhdCBtdXN0IGJlIHJ1biAoZnJvbSB0aGF0IGRpcmVjdG9yeSkgdG8gZXh0cmFjdCBzb21lIHByb3ByaWV0YXJ5IGJpbmFyaWVzIGZyb20geW91ciBkZXZpY2UgKCopLiBZb3Ugb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZS48YnI+PC9saT4KLTxsaT5ydW4gImx1bmNoIGh0Y19kcmVhbS1lbmciIHRvIHNwZWNpZmljYWxseSBjb25maWd1cmUgdGhlIGJ1aWxkIHN5c3RlbSBmb3IgZHJlYW0gKHRoZSBkZWZhdWx0IGlzIHRoZSBlcXVpdmFsZW50IG9mICJsdW5jaCBnZW5lcmljLWVuZyIsIHdoaWNoIGRvZXNuJ3QgY29udGFpbiBkcmVhbS1zcGVjaWZpYyBmaWxlcykuPGJyPjwvbGk+Ci08bGk+cnVuIG1ha2UgZnJvbSB0aGUgdG9wIG9mIHRoZSBzb3VyY2UgdHJlZS4KLTwvbGk+Ci08bGk+ZnJvbSB0aGlzIHBvaW50LCB0aGUgZmFzdGJvb3QgdG9vbCAod2hpY2ggaXMgcHV0IGF1dG9tYXRpY2FsbHkgaW4geW91ciBwYXRoKSBjYW4gYmUgdXNlZCB0byBmbGFzaCBhIGRldmljZTogYm9vdCB0aGUgZGV2aWNlIGludG8gdGhlIGJvb3Rsb2FkZXIgYnkgaG9sZGluZyB0aGUgYmFjayBrZXkgd2hpbGUgcHJlc3NpbmcgdGhlIHBvd2VyIGtleSwgYW5kIHJ1biAiZmFzdGJvb3QgLXcgZmxhc2hhbGwiLjxicj48L2xpPgotPC9vbD4KLSogVGhlIERyZWFtIGRldmljZSBzb2Z0d2FyZSBjb250YWlucyBzb21lIHByb3ByaWV0YXJ5IGJpbmFyaWVzLkZvciBjb250cmFjdHVhbCByZWFzb25zLCB0aGVzZSBjYW5ub3QgYmUgcmVkaXN0cmlidXRlZCB0byBiZSB1c2VkIGRpcmVjdGx5IHdpdGggdGhlIEFuZHJvaWQgT3Blbi1Tb3VyY2UgUHJvamVjdCwgYnV0IHRoZSBwcm92aWRlZCBzY3JpcHQgbWF5IGJlIHVzZWQgdG8gZXh0cmFjdCB0aGVzZSBiaW5hcmllcyBmcm9tIHlvdXIgZGV2ZWxvcG1lbnQgZGV2aWNlIHNvIHRoYXQgdGhleSBjYW4gYmUgY29ycmVjdGx5IGluY2x1ZGVkIGluIHlvdXIgYnVpbGQuVGhlc2UgbGlicmFyaWVzIGluY2x1ZGUgdGhlIG9wZW5HTHxFUyBsaWJyYXJ5LCB0aGUgUXVhbGNvbW0gY2FtZXJhIGxpYnJhcnksIHRoZSBIVEMgUmFkaW8gSW50ZXJmYWNlIExpYnJhcnksIGV0Yy4KKzxwPk5vdGU6IHRoZXNlIGluc3RydWN0aW9ucyB3b3JrIGZvciB0aGUgc2FwcGhpcmUgKEFEUDIpIGJ1aWxkIHRhcmdldCwgYXMKK3dlbGwuIFNpbXBseSByZXBsYWNlICJkcmVhbSIgd2l0aCAic2FwcGhpcmUiIGFib3ZlLjwvcD4KIDwvZGl2PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL2NvZGUtbGluZXMuamQgYi9wZGsvZG9jcy9zb3VyY2UvY29kZS1saW5lcy5qZAppbmRleCA2MWI0MDBkLi41ZTNjOTFmIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvY29kZS1saW5lcy5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvY29kZS1saW5lcy5qZApAQCAtMTUsNyArMTUsNyBAQAogPGgzPk5vdGVzIGFuZCBFeHBsYW5hdGlvbnM8L2gzPgogPHVsPgogPGxpPkEgPGk+cmVsZWFzZTwvaT4gY29ycmVzcG9uZHMgdG8gYSBmb3JtYWwgdmVyc2lvbiBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSwgc3VjaAotYXMgMS41LCAyLjAsIGFuZCBzbyBvbi4gR2VuZXJhbGx5IHNwZWFraW5nLCBhIHJlbGVhc2Ugb2YgdGhlIHBsYXRmb3JtCithcyAxLjUsIDIuMSwgYW5kIHNvIG9uLiBHZW5lcmFsbHkgc3BlYWtpbmcsIGEgcmVsZWFzZSBvZiB0aGUgcGxhdGZvcm0KIGNvcnJlc3BvbmRzIHRvIGEgdmVyc2lvbiBvZiB0aGUgPGNvZGU+U2RrVmVyc2lvbjwvY29kZT4gZmllbGQgdXNlZCBpbgogQW5kcm9pZE1hbmlmZXN0LnhtbCBmaWxlcywgYW5kIGRlZmluZWQgaW4gPGNvZGU+ZnJhbWV3b3Jrcy9iYXNlL2FwaTwvY29kZT4gaW4KIHRoZSBzb3VyY2UgdHJlZS48L2xpPgpAQCAtMjUsMzIgKzI1LDMyIEBACiBBbmRyb2lkIHByb2plY3RzIChzdWNoIGFzIERhbHZpaywgdGhlIEFuZHJvaWQgU0RLIHRvb2xzLCBCaW9uaWMsIGFuZCBzbyBvbikgdG8KIHdvcmsgYXMgInVwc3RyZWFtIiBwcm9qZWN0cy4gVGhlc2Ugd2lsbCBiZSBkZXZlbG9wZWQgZW50aXJlbHkgaW4gdGhlIHB1YmxpYwogdHJlZSwgYW5kIHNuYXBzaG90cyB3aWxsIGJlIHBlcmlvZGljYWxseSBwdWxsZWQgaW50byByZWxlYXNlcy48L2xpPgotPGxpPlRoZSBkaWFncmFtIHJlZmVycyB0byAiRWNsYWlyIiBhbmQgIkZsYW4iOyBob3dldmVyLCB0aGV5IGFyZSBzaW1wbHkKKzxsaT5UaGUgZGlhZ3JhbSByZWZlcnMgdG8gIkVjbGFpciIgYW5kICJGcm9ZbyI7IGhvd2V2ZXIsIHRoZXkgYXJlIHNpbXBseQogcGxhY2Vob2xkZXJzLCBhbmQgdGhlIGRpYWdyYW0gYWN0dWFsbHkgcmVmbGVjdHMgdGhlIG92ZXJhbGwgcmVsZWFzZSBhbmQKIGJyYW5jaGluZyBzdHJhdGVneS48L2xpPgotPGxpPkF0IGFsbCB0aW1lcywgdGhlIFJlbGVhc2UgY29kZS1saW5lICh3aGljaCBtYXkgYWN0dWFsbHkgY29uc2lzdCBvZgorPGxpPkF0IGFsbCB0aW1lcywgYSByZWxlYXNlIGNvZGUtbGluZSAod2hpY2ggbWF5IGFjdHVhbGx5IGNvbnNpc3Qgb2YKIG1vcmUgdGhhbiBvbmUgYWN0dWFsIGJyYW5jaCBpbiBnaXQpIGlzIGNvbnNpZGVyZWQgdGhlIHNvbGUgY2Fub25pY2FsIHNvdXJjZQotY29kZSBmb3IgYSBnaXZlbiBBbmRyb2lkIHBsYXRmb3JtLiBPRU1zIGFuZCBvdGhlciBncm91cHMgYnVpbGRpbmcgZGV2aWNlcwotc2hvdWxkIHB1bGwgb25seSBmcm9tIGEgUmVsZWFzZSBicmFuY2guPC9saT4KLTxsaT5XZSB3aWxsIGJlIHNldHRpbmcgdXAgYW4gIkV4cGVyaW1lbnRhbCIgY29kZS1saW5lIHRvIGNhcHR1cmUgY2hhbmdlcyBmcm9tCitjb2RlIGZvciBhIGdpdmVuIEFuZHJvaWQgcGxhdGZvcm0gdmVyc2lvbi4gT0VNcyBhbmQgb3RoZXIgZ3JvdXBzIGJ1aWxkaW5nIGRldmljZXMKK3Nob3VsZCBwdWxsIG9ubHkgZnJvbSBhIHJlbGVhc2UgYnJhbmNoLjwvbGk+Cis8bGk+V2Ugd2lsbCBzZXQgdXAgImV4cGVyaW1lbnRhbCIgY29kZS1saW5lcyB0byBjYXB0dXJlIGNoYW5nZXMgZnJvbQogdGhlIGNvbW11bml0eSwgc28gdGhhdCB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvbiwgd2l0aCBhbiBleWUgdG93YXJkIHN0YWJpbGl0eS48L2xpPgotPGxpPkNoYW5nZXMgdGhhdCBwcm92ZSBzdGFibGUgd2lsbCBldmVudHVhbGx5IGJlIHB1bGxlZCBpbnRvIGEgUmVsZWFzZQorPGxpPkNoYW5nZXMgdGhhdCBwcm92ZSBzdGFibGUgd2lsbCBldmVudHVhbGx5IGJlIHB1bGxlZCBpbnRvIGEgcmVsZWFzZQogYnJhbmNoLiBOb3RlIHRoYXQgdGhpcyB3aWxsIG9ubHkgYXBwbHkgdG8gYnVnIGZpeGVzLCBhcHAgaW1wcm92ZW1lbnRzLCBhbmQKIG90aGVyIHRoaW5ncyB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIEFQSXMgb2YgdGhlIHBsYXRmb3JtLjwvbGk+Ci08bGk+Q2hhbmdlcyB3aWxsIGJlIHB1bGxlZCBpbnRvIFJlbGVhc2UgYnJhbmNoZXMgZnJvbSB1cHN0cmVhbSBwcm9qZWN0cwotKGluY2x1ZGUgdGhlIEFuZHJvaWQgInVwc3RyZWFtIiBwcm9qZWN0cykgYXMgbmVjZXNzYXJ5LjwvbGk+Cis8bGk+Q2hhbmdlcyB3aWxsIGJlIHB1bGxlZCBpbnRvIHJlbGVhc2UgYnJhbmNoZXMgZnJvbSB1cHN0cmVhbSBwcm9qZWN0cworKGluY2x1ZGluZyB0aGUgQW5kcm9pZCAidXBzdHJlYW0iIHByb2plY3RzKSBhcyBuZWNlc3NhcnkuPC9saT4KIDxsaT5UaGUgIm4rMSJ0aCB2ZXJzaW9uICh0aGF0IGlzLCBuZXh0IG1ham9yIHZlcnNpb24gb2YgdGhlIGZyYW1ld29yayBhbmQKLXBsYXRmb3JtIEFQSXMpIHdpbGwgYmUgZGV2ZWxvcGVkIGJ5IEdvb2dsZSBpbnRlcm5hbGx5LiAoU2VlIGJlbG93IGZvcgotZGV0YWlscy4pPC9saT4KLTxsaT5DaGFuZ2VzIHdpbGwgYmUgcHVsbGVkIGZyb20gdXBzdHJlYW0sIFJlbGVhc2UsIGFuZCBFeHBlcmltZW50YWwgYnJhbmNoZXMKK3BsYXRmb3JtIEFQSXMpIHdpbGwgYmUgZGV2ZWxvcGVkIGJ5IEdvb2dsZSBpbnRlcm5hbGx5LiBTZWUgYmVsb3cgZm9yCitkZXRhaWxzLjwvbGk+Cis8bGk+Q2hhbmdlcyB3aWxsIGJlIHB1bGxlZCBmcm9tIHVwc3RyZWFtLCByZWxlYXNlLCBhbmQgZXhwZXJpbWVudGFsIGJyYW5jaGVzCiBpbnRvIEdvb2dsZSdzIHByaXZhdGUgYnJhbmNoIGFzIG5lY2Vzc2FyeS48L2xpPgogPGxpPldoZW4gdGhlIHBsYXRmb3JtIEFQSXMgZm9yIHRoZSBuZXh0IHZlcnNpb24gaGF2ZSBzdGFiaWxpemVkIGFuZCBiZWVuIGZ1bGx5CiB0ZXN0ZWQsIEdvb2dsZSB3aWxsIGN1dCBhIHJlbGVhc2Ugb2YgdGhlIG5leHQgcGxhdGZvcm0gdmVyc2lvbi4gKFRoaXMKIHNwZWNpZmljYWxseSByZWZlcnMgdG8gYSBuZXcgPGNvZGU+U2RrVmVyc2lvbjwvY29kZT4uKSBUaGlzIHdpbGwgYWxzbwotY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgY29kZS1saW5lIGJlaW5nIG1hZGUgYSBwdWJsaWMgUmVsZWFzZSBicmFuY2gsIGFuZCB0aGUKK2NvcnJlc3BvbmQgdG8gdGhlIGludGVybmFsIGNvZGUtbGluZSBiZWluZyBtYWRlIGEgcHVibGljIHJlbGVhc2UgYnJhbmNoLCBhbmQgdGhlCiBuZXcgY3VycmVudCBwbGF0Zm9ybSBjb2RlLWxpbmUuPC9saT4KLTxsaT5XaGVuIGEgbmV3IHBsYXRmb3JtIHZlcnNpb24gaXMgY3V0LCBhIGNvcnJlc3BvbmRpbmcgRXhwZXJpbWVudGFsCi1jb2RlLWxpbmUuPC9saT4KKzxsaT5XaGVuIGEgbmV3IHBsYXRmb3JtIHZlcnNpb24gaXMgY3V0LCBhIGNvcnJlc3BvbmRpbmcgZXhwZXJpbWVudGFsCitjb2RlLWxpbmUgd2lsbCBiZSBjcmVhdGVkIGF0IHRoZSBzYW1lIHRpbWUuPC9saT4KIDwvdWw+CiA8aDM+QWJvdXQgUHJpdmF0ZSBDb2RlLUxpbmVzPC9oMz4KIDxwPlRoZSBzb3VyY2UgbWFuYWdlbWVudCBzdHJhdGVneSBhYm92ZSBpbmNsdWRlcyBhIGNvZGUtbGluZSB0aGF0IEdvb2dsZSB3aWxsCkBAIC02Miw5ICs2Miw5IEBACiBHb29nbGUgcmV0YWlucyByZXNwb25zaWJpbGl0eSBmb3IgdGhlIHN0cmF0ZWdpYyBkaXJlY3Rpb24gb2YgQW5kcm9pZCBhcyBhCiBwbGF0Zm9ybSBhbmQgYSBwcm9kdWN0LiBPdXIgYXBwcm9hY2ggaXMgYmFzZWQgb24gZm9jdXNpbmcgb24gYSBzbWFsbCBudW1iZXIgb2YKIGZsYWdzaGlwIGRldmljZXMgdG8gZHJpdmUgZmVhdHVyZXMsIGFuZCBzZWN1cmUgcHJvdGVjdGlvbnMgb2YgQW5kcm9pZC1yZWxhdGVkCi1pbnRlbGxlY3R1YWwgcHJvcGVydHkgdGhyb3VnaCBwYXRlbnRzIGFuZCB0aGUgbGlrZS48L3A+CitpbnRlbGxlY3R1YWwgcHJvcGVydHkuPC9wPgogPHA+QXMgYSByZXN1bHQsIEdvb2dsZSBmcmVxdWVudGx5IGhhcyBwb3NzZXNzaW9uIG9mIGNvbmZpZGVudGlhbAotaW5mb3JtYXRpb24gb2YgdGhpcmQgcGFydGllcywgYW5kIHdlIG11c3QgcmVmcmFpbiBmcm9tIHJldmVhbGluZyBwYXRlbnRhYmxlCitpbmZvcm1hdGlvbiBvZiB0aGlyZCBwYXJ0aWVzLCBhbmQgd2UgbXVzdCByZWZyYWluIGZyb20gcmV2ZWFsaW5nIHNlbnNpdGl2ZQogZmVhdHVyZXMgdW50aWwgd2UndmUgc2VjdXJlZCB0aGUgYXBwcm9wcmlhdGUgcHJvdGVjdGlvbnMuIE1lYW53aGlsZSwgdGhlcmUgYXJlCiByZWFsIHJpc2tzIHRvIHRoZSBwbGF0Zm9ybSBhcmlzaW5nIGZyb20gaGF2aW5nIHRvbyBtYW55IHBsYXRmb3JtIHZlcnNpb25zCiBleHRhbnQgYXQgb25jZS4gRm9yIHRoZXNlIHJlYXNvbnMsIHdlIGhhdmUgc3RydWN0dXJlZCB0aGUgb3Blbi1zb3VyY2UgcHJvamVjdApkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL2NvZGUtc3R5bGUuamQgYi9wZGsvZG9jcy9zb3VyY2UvY29kZS1zdHlsZS5qZAppbmRleCA4YjU5NDZlLi45NTdhYjAyIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvY29kZS1zdHlsZS5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvY29kZS1zdHlsZS5qZApAQCAtMSw3ICsxLDYgQEAKIHBhZ2UudGl0bGU9Q29kZSBTdHlsZSBHdWlkZWxpbmVzIGZvciBDb250cmlidXRvcnMKIGRvYy50eXBlPXNvdXJjZQogQGpkOmJvZHkKLTxkaXY+CiA8cD5UaGUgcnVsZXMgYmVsb3cgYXJlIG5vdCBndWlkZWxpbmVzIG9yIHJlY29tbWVuZGF0aW9ucywgYnV0IHN0cmljdCBydWxlcy4KIENvbnRyaWJ1dGlvbnMgdG8gQW5kcm9pZCBnZW5lcmFsbHkgPGI+d2lsbCBub3QgYmUgYWNjZXB0ZWQgaWYgdGhleSBkbyBub3QKIGFkaGVyZSB0byB0aGVzZSBydWxlcy48L2I+CkBAIC0xMSw0MjUgKzEwLDYxNSBAQAogPC9oMT4KIDxwPldlIGZvbGxvdyBzdGFuZGFyZCBKYXZhIGNvZGluZyBjb252ZW50aW9ucy4gV2UgYWRkIGEgZmV3IHJ1bGVzOgogPC9wPgotPG9sPjxsaT48YSBocmVmPSIjZXhjZXB0aW9uc0lnbm9yZSI+RXhjZXB0aW9uczwvYT4KLTogTmV2ZXIgY2F0Y2ggYW5kIGlnbm9yZSB0aGVtIHdpdGhvdXQgZXhwbGFuYXRpb24uCi08L2xpPgotPGxpPjxhIGhyZWY9IiNleGNlcHRpb25zQWxsIj5FeGNlcHRpb25zPC9hPgotOiBkbyBub3QgY2F0Y2ggZ2VuZXJpYyBFeGNlcHRpb24sIGV4Y2VwdCBpbiBsaWJyYXJ5IGNvZGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHN0YWNrLgotPC9saT4KLTxsaT48YSBocmVmPSIjZmluYWxpemVycyI+RmluYWxpemVyczwvYT4KLTogZ2VuZXJhbGx5IGRvbid0IHVzZSB0aGVtLgotPC9saT4KLTxsaT48YSBocmVmPSIjaW1wb3J0cyI+SW1wb3J0czwvYT4KLTogRnVsbHkgcXVhbGlmeSBpbXBvcnRzCi08L2xpPgorPG9sPjxsaT48YSBocmVmPSIjZXhjZXB0aW9uc0lnbm9yZSI+RXhjZXB0aW9uczwvYT46IE5ldmVyIGNhdGNoIGFuZCBpZ25vcmUgdGhlbSB3aXRob3V0IGV4cGxhbmF0aW9uLjwvbGk+Cis8bGk+PGEgaHJlZj0iI2V4Y2VwdGlvbnNBbGwiPkV4Y2VwdGlvbnM8L2E+OiBkbyBub3QgY2F0Y2ggZ2VuZXJpYyBFeGNlcHRpb24sIGV4Y2VwdCBpbiBsaWJyYXJ5IGNvZGUgYXQgdGhlIHJvb3Qgb2YgdGhlIHN0YWNrLjwvbGk+Cis8bGk+PGEgaHJlZj0iI2ZpbmFsaXplcnMiPkZpbmFsaXplcnM8L2E+OiBnZW5lcmFsbHkgZG9uJ3QgdXNlIHRoZW0uPC9saT4KKzxsaT48YSBocmVmPSIjaW1wb3J0cyI+SW1wb3J0czwvYT46IEZ1bGx5IHF1YWxpZnkgaW1wb3J0czwvbGk+CiA8L29sPgotPGgxPjxhPkphdmEgTGlicmFyeSBSdWxlczwvYT4KLTwvaDE+Ci08cD5UaGVyZSBhcmUgY29udmVudGlvbnMgZm9yIHVzaW5nIEFuZHJvaWQncyBKYXZhIGxpYnJhcmllcyBhbmQgdG9vbHMuIEluIHNvbWUgY2FzZXMsIHRoZSBjb252ZW50aW9uIGhhcyBjaGFuZ2VkIGluIGltcG9ydGFudCB3YXlzIGFuZCBvbGRlciBjb2RlIG1pZ2h0IHVzZSBhIGRlcHJlY2F0ZWQgcGF0dGVybiBvciBsaWJyYXJ5LiBXaGVuIHdvcmtpbmcgd2l0aCBzdWNoIGNvZGUsIGl0J3Mgb2theSB0byBjb250aW51ZSB0aGUgZXhpc3Rpbmcgc3R5bGUgKHNlZSA8YSBocmVmPSIjY29uc2lzdGVuY3kiPkNvbnNpc3RlbmN5PC9hPgotKS4gV2hlbiBjcmVhdGluZyBuZXcgY29tcG9uZW50cyBuZXZlciB1c2UgZGVwcmVjYXRlZCBsaWJyYXJpZXMuCi08L3A+Ci08aDE+PGE+SmF2YSBTdHlsZSBSdWxlczwvYT4KLTwvaDE+Ci08cD5Qcm9ncmFtcyBhcmUgbXVjaCBlYXNpZXIgdG8gbWFpbnRhaW4gd2hlbiBhbGwgZmlsZXMgaGF2ZSBhIGNvbnNpc3RlbnQgc3R5bGUuIFdlIGZvbGxvdyB0aGUgc3RhbmRhcmQgSmF2YSBjb2Rpbmcgc3R5bGUsIGFzIGRlZmluZWQgYnkgU3VuIGluIHRoZWlyIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sIj5Db2RlIENvbnZlbnRpb25zIGZvciB0aGUgSmF2YSBQcm9ncmFtbWluZyBMYW5ndWFnZTwvYT4KLSwgd2l0aCBhIGZldyBleGNlcHRpb25zIGFuZCBhZGRpdGlvbnMuIFRoaXMgc3R5bGUgZ3VpZGUgaXMgY29tcHJlaGVuc2l2ZSBhbmQgZGV0YWlsZWQgYW5kIGlzIGluIGNvbW1vbiB1c2FnZSBpbiB0aGUgSmF2YSBjb21tdW5pdHkuCi08L3A+Ci08cD5JbiBhZGRpdGlvbiwgd2UgZW5mb3JjZSB0aGUgZm9sbG93aW5nIHN0eWxlIHJ1bGVzOgotPC9wPgotPG9sPjxsaT48YSBocmVmPSIjamF2YWRvYyI+Q29tbWVudHMvSmF2YWRvYzwvYT4KLTogd3JpdGUgaXQ7IHVzZSBzdGFuZGFyZCBzdHlsZQotPC9saT4KLTxsaT48YSBocmVmPSIjc2hvcnRtZXRob2RzIj5TaG9ydCBtZXRob2RzPC9hPgotOiBkb24ndCB3cml0ZSBnaWFudCBtZXRob2RzCi08L2xpPgotPGxpPkZpZWxkczogc2hvdWxkIGVpdGhlciBiZSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLCBvciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIG1ldGhvZHMgdGhhdCB1c2UgdGhlbQotPC9saT4KLTxsaT48YSBocmVmPSIjbG9jYWx2YXJpYWJsZXMiPkxvY2FsIHZhcmlhYmxlczwvYT4KLTogbGltaXQgdGhlIHNjb3BlCi08L2xpPgotPGxpPjxhIGhyZWY9IiNpbXBvcnRfc3R5bGUiPkltcG9ydHM8L2E+Ci06IGFuZHJvaWQ7IHRoaXJkIHBhcnR5IGFscGhhYmV0aWNhbDsgamF2YSh4KQotPC9saT4KLTxsaT48YSBocmVmPSIjaW5kZW50YXRpb24iPkluZGVudGF0aW9uPC9hPgotOiA0IHNwYWNlcywgbm8gdGFicy4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2xpbmVsZW4iPkxpbmUgbGVuZ3RoPC9hPgotOiAxMDAgY29sdW1ucwotPC9saT4KLTxsaT48YSBocmVmPSIjZmllbGRfbmFtZXMiPkZpZWxkIG5hbWVzPC9hPgotOiBOb24tcHVibGljLCBub24tc3RhdGljIGZpZWxkcyBzdGFydCB3aXRoIG0uIFN0YXRpYyBmaWVsZHMgc3RhcnQgcy4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2JyYWNlcyI+QnJhY2VzPC9hPgotOiBPcGVuaW5nIGJyYWNlcyBkb24ndCBnbyBvbiB0aGVpciBvd24gbGluZS4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2Fubm90YXRpb25zIj5Bbm5vdGF0aW9uczwvYT4KLTogVXNlIHRoZSBzdGFuZGFyZCBhbm5vdGF0aW9ucy4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI2Fjcm9ueW1zIj5BY3JvbnltcyBhcmUgd29yZHM8L2E+Ci06IFRyZWF0IGFjcm9ueW1zIGFzIHdvcmRzIGluIG5hbWVzLCB5aWVsZGluZyBYbWxIdHRwUmVxdWVzdCwgZ2V0VXJsKCksIGV0Yy4KLTwvbGk+Ci08bGk+PGEgaHJlZj0iI3RvZG8iPlRPRE8gc3R5bGU8L2E+Ci06ICJUT0RPOiB3cml0ZSB0aGlzIGRlc2NyaXB0aW9uIgotPC9saT4KLTxsaT48YSBocmVmPSIjY29uc2lzdGVuY3kiPkNvbnNpc3RlbmN5PC9hPgotOiBMb29rIGF0IHdoYXQncyBhcm91bmQgeW91IQotPC9saT4KLTxsaT48YSBocmVmPSIjbG9nZ2luZyI+TG9nZ2luZzwvYT4KLTogQmUgY2FyZWZ1bCB3aXRoIGxvZ2dpbmcuIEl0J3MgZXhwZW5zaXZlLgotPC9saT4KKzxoMT5KYXZhIExpYnJhcnkgUnVsZXM8L2gxPgorPHA+VGhlcmUgYXJlIGNvbnZlbnRpb25zIGZvciB1c2luZyBBbmRyb2lkJ3MgSmF2YSBsaWJyYXJpZXMgYW5kIHRvb2xzLiBJbiBzb21lCitjYXNlcywgdGhlIGNvbnZlbnRpb24gaGFzIGNoYW5nZWQgaW4gaW1wb3J0YW50IHdheXMgYW5kIG9sZGVyIGNvZGUgbWlnaHQgdXNlIGEKK2RlcHJlY2F0ZWQgcGF0dGVybiBvciBsaWJyYXJ5LiBXaGVuIHdvcmtpbmcgd2l0aCBzdWNoIGNvZGUsIGl0J3Mgb2theSB0bworY29udGludWUgdGhlIGV4aXN0aW5nIHN0eWxlIChzZWUgPGEgaHJlZj0iI2NvbnNpc3RlbmN5Ij5Db25zaXN0ZW5jeTwvYT4pLiBXaGVuCitjcmVhdGluZyBuZXcgY29tcG9uZW50cyBuZXZlciB1c2UgZGVwcmVjYXRlZCBsaWJyYXJpZXMuPC9wPgorPGgxPkphdmEgU3R5bGUgUnVsZXM8L2gxPgorPHA+UHJvZ3JhbXMgYXJlIG11Y2ggZWFzaWVyIHRvIG1haW50YWluIHdoZW4gYWxsIGZpbGVzIGhhdmUgYSBjb25zaXN0ZW50CitzdHlsZS4gV2UgZm9sbG93IHRoZSBzdGFuZGFyZCBKYXZhIGNvZGluZyBzdHlsZSwgYXMgZGVmaW5lZCBieSBTdW4gaW4gdGhlaXIgPGEKK2hyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vZG9jcy9jb2RlY29udi9odG1sL0NvZGVDb252VE9DLmRvYy5odG1sIj5Db2RlCitDb252ZW50aW9ucyBmb3IgdGhlIEphdmEgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2U8L2E+LCB3aXRoIGEgZmV3IGV4Y2VwdGlvbnMgYW5kCithZGRpdGlvbnMuIFRoaXMgc3R5bGUgZ3VpZGUgaXMgY29tcHJlaGVuc2l2ZSBhbmQgZGV0YWlsZWQgYW5kIGlzIGluIGNvbW1vbgordXNhZ2UgaW4gdGhlIEphdmEgY29tbXVuaXR5LjwvcD4KKzxwPkluIGFkZGl0aW9uLCB3ZSBlbmZvcmNlIHRoZSBmb2xsb3dpbmcgc3R5bGUgcnVsZXM6PC9wPgorPG9sPjxsaT48YSBocmVmPSIjamF2YWRvYyI+Q29tbWVudHMvSmF2YWRvYzwvYT46IHdyaXRlIGl0OyB1c2Ugc3RhbmRhcmQgc3R5bGU8L2xpPgorPGxpPjxhIGhyZWY9IiNzaG9ydG1ldGhvZHMiPlNob3J0IG1ldGhvZHM8L2E+OiBkb24ndCB3cml0ZSBnaWFudCBtZXRob2RzPC9saT4KKzxsaT5GaWVsZHM6IHNob3VsZCBlaXRoZXIgYmUgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgb3IgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBtZXRob2RzIHRoYXQgdXNlIHRoZW08L2xpPgorPGxpPjxhIGhyZWY9IiNsb2NhbHZhcmlhYmxlcyI+TG9jYWwgdmFyaWFibGVzPC9hPjogbGltaXQgdGhlIHNjb3BlPC9saT4KKzxsaT48YSBocmVmPSIjaW1wb3J0X3N0eWxlIj5JbXBvcnRzPC9hPjogYW5kcm9pZDsgdGhpcmQgcGFydHkgYWxwaGFiZXRpY2FsOyBqYXZhKHgpPC9saT4KKzxsaT48YSBocmVmPSIjaW5kZW50YXRpb24iPkluZGVudGF0aW9uPC9hPjogNCBzcGFjZXMsIG5vIHRhYnMuPC9saT4KKzxsaT48YSBocmVmPSIjbGluZWxlbiI+TGluZSBsZW5ndGg8L2E+OiAxMDAgY29sdW1uczwvbGk+Cis8bGk+PGEgaHJlZj0iI2ZpZWxkX25hbWVzIj5GaWVsZCBuYW1lczwvYT46IE5vbi1wdWJsaWMsIG5vbi1zdGF0aWMgZmllbGRzIHN0YXJ0IHdpdGggbS48L2xpPgorPGxpPjxhIGhyZWY9IiNicmFjZXMiPkJyYWNlczwvYT46IE9wZW5pbmcgYnJhY2VzIGRvbid0IGdvIG9uIHRoZWlyIG93biBsaW5lLjwvbGk+Cis8bGk+PGEgaHJlZj0iI2Fubm90YXRpb25zIj5Bbm5vdGF0aW9uczwvYT46IFVzZSB0aGUgc3RhbmRhcmQgYW5ub3RhdGlvbnMuPC9saT4KKzxsaT48YSBocmVmPSIjYWNyb255bXMiPkFjcm9ueW1zIGFyZSB3b3JkczwvYT46IFRyZWF0IGFjcm9ueW1zIGFzIHdvcmRzIGluIG5hbWVzLCB5aWVsZGluZyBYbWxIdHRwUmVxdWVzdCwgZ2V0VXJsKCksIGV0Yy48L2xpPgorPGxpPjxhIGhyZWY9IiN0b2RvIj5UT0RPIHN0eWxlPC9hPjogIlRPRE86IHdyaXRlIHRoaXMgZGVzY3JpcHRpb24iPC9saT4KKzxsaT48YSBocmVmPSIjY29uc2lzdGVuY3kiPkNvbnNpc3RlbmN5PC9hPjogTG9vayBhdCB3aGF0J3MgYXJvdW5kIHlvdSE8L2xpPgorPGxpPjxhIGhyZWY9IiNsb2dnaW5nIj5Mb2dnaW5nPC9hPjogQmUgY2FyZWZ1bCB3aXRoIGxvZ2dpbmcuIEl0J3MgZXhwZW5zaXZlLjwvbGk+CiA8L29sPgotPGgxPjxhPkphdmF0ZXN0cyBTdHlsZSBSdWxlczwvYT4KLTwvaDE+Ci08b2w+PGxpPjxhIGhyZWY9IiN0ZXN0bWV0aG9kbmFtZXMiPk5hbWluZyB0ZXN0IG1ldGhvZHM8L2E+Ci06IHRlc3RNZXRob2Rfc3BlY2lmaWNDYXNlIGlzIG9rCi08L2xpPgorPGgxPkphdmF0ZXN0cyBTdHlsZSBSdWxlczwvaDE+Cis8b2w+Cis8bGk+PGEgaHJlZj0iI3Rlc3RtZXRob2RuYW1lcyI+TmFtaW5nIHRlc3QgbWV0aG9kczwvYT46IHRlc3RNZXRob2Rfc3BlY2lmaWNDYXNlIGlzIG9rPC9saT4KIDwvb2w+Ci08aHI+PGgyPgotSmF2YSBMYW5ndWFnZSBSdWxlcwotPC9oMj4KLTxoMj48YT5FeGNlcHRpb25zOiBkbyBub3QgaWdub3JlPC9hPgotPC9oMj4KLVNvbWV0aW1lcyBpdCBpcyB0ZW1wdGluZyB0byB3cml0ZSBjb2RlIHRoYXQgY29tcGxldGVseSBpZ25vcmVzIGFuIGV4Y2VwdGlvbiBsaWtlIHRoaXM6Ci08cHJlPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHs8YnI+dHJ5IHs8YnI+c2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOzxicj59IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgezxicj59PGJyPn08YnI+PGJyPjwvcHJlPgotPHA+WW91IG11c3QgbmV2ZXIgZG8gdGhpcy4gV2hpbGUgeW91IG1heSB0aGluayB0aGF0IHlvdXIgY29kZSB3aWxsIG5ldmVyIGVuY291bnRlciB0aGlzIGVycm9yIGNvbmRpdGlvbiBvciB0aGF0IGl0IGlzIG5vdCBpbXBvcnRhbnQgdG8gaGFuZGxlIGl0LCBpZ25vcmluZyBleGNlcHRpb25zIGxpa2UgYWJvdmUgY3JlYXRlcyBtaW5lcyBpbiB5b3VyIGNvZGUgZm9yIHNvbWVvbmUgZWxzZSB0byB0cmlwIG92ZXIgc29tZSBkYXkuIFlvdSBtdXN0IGhhbmRsZSBldmVyeSBFeGNlcHRpb24gaW4geW91ciBjb2RlIGluIHNvbWUgcHJpbmNpcGxlZCB3YXkuIFRoZSBzcGVjaWZpYyBoYW5kbGluZyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBjYXNlLgotPC9wPgotPGJsb2NrcXVvdGU+QW55dGltZSBzb21lYm9keSBoYXMgYW4gZW1wdHkgY2F0Y2ggY2xhdXNlIHRoZXkgc2hvdWxkIGhhdmUgYSBjcmVlcHkgZmVlbGluZy4gVGhlcmUgYXJlIGRlZmluaXRlbHkgdGltZXMgd2hlbiBpdCBpcyBhY3R1YWxseSB0aGUgY29ycmVjdCB0aGluZyB0byBkbywgYnV0IGF0IGxlYXN0IHlvdSBoYXZlIHRvIHRoaW5rIGFib3V0IGl0LiBJbiBKYXZhIHlvdSBjYW4ndCBlc2NhcGUgdGhlIGNyZWVweSBmZWVsaW5nLjxicj48ZGl2Pi08YSBocmVmPSJodHRwOi8vd3d3LmFydGltYS5jb20vaW50di9zb2xpZDQuaHRtbCI+SmFtZXMgR29zbGluZzwvYT4KLTwvZGl2PgotPC9ibG9ja3F1b3RlPgotPHA+QWNjZXB0YWJsZSBhbHRlcm5hdGl2ZXMgKGluIG9yZGVyIG9mIHByZWZlcmVuY2UpIGFyZToKLTwvcD4KLTx1bD48bGk+VGhyb3cgdGhlIGV4Y2VwdGlvbiB1cCB0byB0aGUgY2FsbGVyIG9mIHlvdXIgbWV0aG9kLgotPHByZT52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHs8YnI+c2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOzxicj59PGJyPjxicj48L3ByZT4KLTwvbGk+Cis8aDI+SmF2YSBMYW5ndWFnZSBSdWxlczwvaDI+Cis8aDI+PGEgbmFtZT0iZXhjZXB0aW9uc0lnbm9yZSI+PC9hPkV4Y2VwdGlvbnM6IGRvIG5vdCBpZ25vcmU8L2gyPgorPHA+U29tZXRpbWVzIGl0IGlzIHRlbXB0aW5nIHRvIHdyaXRlIGNvZGUgdGhhdCBjb21wbGV0ZWx5IGlnbm9yZXMgYW4gZXhjZXB0aW9uCitsaWtlIHRoaXM6PC9wPgorPHByZT52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7IH0KK308L3ByZT4KKzxwPllvdSBtdXN0IG5ldmVyIGRvIHRoaXMuIFdoaWxlIHlvdSBtYXkgdGhpbmsgdGhhdCB5b3VyIGNvZGUgd2lsbCBuZXZlcgorZW5jb3VudGVyIHRoaXMgZXJyb3IgY29uZGl0aW9uIG9yIHRoYXQgaXQgaXMgbm90IGltcG9ydGFudCB0byBoYW5kbGUgaXQsCitpZ25vcmluZyBleGNlcHRpb25zIGxpa2UgYWJvdmUgY3JlYXRlcyBtaW5lcyBpbiB5b3VyIGNvZGUgZm9yIHNvbWVvbmUgZWxzZSB0bwordHJpcCBvdmVyIHNvbWUgZGF5LiBZb3UgbXVzdCBoYW5kbGUgZXZlcnkgRXhjZXB0aW9uIGluIHlvdXIgY29kZSBpbiBzb21lCitwcmluY2lwbGVkIHdheS4gVGhlIHNwZWNpZmljIGhhbmRsaW5nIHZhcmllcyBkZXBlbmRpbmcgb24gdGhlIGNhc2UuPC9wPgorPGJsb2NrcXVvdGU+QW55dGltZSBzb21lYm9keSBoYXMgYW4gZW1wdHkgY2F0Y2ggY2xhdXNlIHRoZXkgc2hvdWxkIGhhdmUgYQorY3JlZXB5IGZlZWxpbmcuIFRoZXJlIGFyZSBkZWZpbml0ZWx5IHRpbWVzIHdoZW4gaXQgaXMgYWN0dWFsbHkgdGhlIGNvcnJlY3QKK3RoaW5nIHRvIGRvLCBidXQgYXQgbGVhc3QgeW91IGhhdmUgdG8gdGhpbmsgYWJvdXQgaXQuIEluIEphdmEgeW91IGNhbid0IGVzY2FwZQordGhlIGNyZWVweSBmZWVsaW5nLgorLTxhIGhyZWY9Imh0dHA6Ly93d3cuYXJ0aW1hLmNvbS9pbnR2L3NvbGlkNC5odG1sIj5KYW1lcworR29zbGluZzwvYT48L2Jsb2NrcXVvdGU+Cis8cD5BY2NlcHRhYmxlIGFsdGVybmF0aXZlcyAoaW4gb3JkZXIgb2YgcHJlZmVyZW5jZSkgYXJlOjwvcD4KKzx1bD4KKzxsaT5UaHJvdyB0aGUgZXhjZXB0aW9uIHVwIHRvIHRoZSBjYWxsZXIgb2YgeW91ciBtZXRob2QuCis8cHJlPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgIHNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKK308L3ByZT48L2xpPgogPGxpPlRocm93IGEgbmV3IGV4Y2VwdGlvbiB0aGF0J3MgYXBwcm9wcmlhdGUgdG8geW91ciBsZXZlbCBvZiBhYnN0cmFjdGlvbi4KLTxwcmU+dm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24gezxicj50cnkgezxicj5zZXJ2ZXJQb3J0ID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7PGJyPn0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7PGJyPnRocm93IG5ldyBDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJQb3J0ICIgKyB2YWx1ZSArICIgaXMgbm90IHZhbGlkLiIpOzxicj59PGJyPjxicj48L3ByZT4KLTwvbGk+Ci08bGk+SGFuZGxlIHRoZSBlcnJvciBncmFjZWZ1bGx5IGFuZCBzdWJzdGl0dXRlIGFuIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSBjYXRjaCB7fSBibG9jay4KLTxwcmU+LyoqIFNldCBwb3J0LiBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIsIDgwIGlzIHN1YnN0aXR1dGVkLiAqLzxicj52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7PGJyPnRyeSB7PGJyPnNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTs8YnI+fSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHs8YnI+c2VydmVyUG9ydCA9IDgwOyAgLy8gZGVmYXVsdCBwb3J0IGZvciBzZXJ2ZXIgPGJyPn08YnI+PC9wcmU+Ci08L2xpPgotPGxpPkNhdGNoIHRoZSBFeGNlcHRpb24gYW5kIHRocm93IGEgbmV3IFJ1bnRpbWVFeGNlcHRpb24uIFRoaXMgaXMgZGFuZ2Vyb3VzOiBvbmx5IGRvIGl0IGlmIHlvdSBhcmUgcG9zaXRpdmUgdGhhdCBpZiB0aGlzIGVycm9yIG9jY3VycywgdGhlIGFwcHJvcHJpYXRlIHRoaW5nIHRvIGRvIGlzIGNyYXNoLgotPHByZT4vKiogU2V0IHBvcnQuIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgZGllLiAqLzxicj52b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7PGJyPnRyeSB7PGJyPnNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTs8YnI+fSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHs8YnI+dGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInBvcnQgIiArIHZhbHVlICIgaXMgaW52YWxpZCwgIiwgZSk7PGJyPn08YnI+PC9wcmU+Ci1Ob3RlIHRoYXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciBSdW50aW1lRXhjZXB0aW9uLiBUaGlzIHdyYXBwZWQgZXhjZXB0aW9uIHBhcmFkaWdtIGlzIHZlcnkgdXNlZnVsIGJ1dCBvbmx5IHdvcmtzIGluIEphdmEgMS40LiBJZiB5b3VyIGNvZGUgbXVzdCBjb21waWxlIHVuZGVyIEphdmEgMS4zLCB5b3Ugd2lsbCBuZWVkIHRvIG9taXQgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRoZSBjYXVzZS48YnI+PGJyPjwvbGk+Ci08bGk+TGFzdCByZXNvcnQ6IGlmIHlvdSBhcmUgY29uZmlkZW50IHRoYXQgYWN0dWFsbHkgaWdub3JpbmcgdGhlIGV4Y2VwdGlvbiBpcyBhcHByb3ByaWF0ZSB0aGVuIHlvdSBtYXkgaWdub3JlIGl0LCBidXQgeW91IG11c3QgYWxzbyBjb21tZW50IHdoeSB3aXRoIGEgZ29vZCByZWFzb246Ci08cHJlPi8qKiBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIsIG9yaWdpbmFsIHBvcnQgbnVtYmVyIGlzIHVzZWQuICovPGJyPnZvaWQgc2V0U2VydmVyUG9ydChTdHJpbmcgdmFsdWUpIHs8YnI+dHJ5IHs8YnI+c2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOzxicj59IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgezxicj4vLyBNZXRob2QgaXMgZG9jdW1lbnRlZCB0byBqdXN0IGlnbm9yZSBpbnZhbGlkIHVzZXIgaW5wdXQuPGJyPi8vIHNlcnZlclBvcnQgd2lsbCBqdXN0IGJlIHVuY2hhbmdlZC48YnI+fTxicj59PGJyPjwvcHJlPgotPC9saT4KKzxwcmU+dm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAgIHNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigiUG9ydCAiICsgdmFsdWUgKyAiIGlzIG5vdCB2YWxpZC4iKTsKKyAgICB9Cit9PC9wcmU+PC9saT4KKzxsaT5IYW5kbGUgdGhlIGVycm9yIGdyYWNlZnVsbHkgYW5kIHN1YnN0aXR1dGUgYW4gYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlCitjYXRjaCB7fSBibG9jay4KKzxwcmU+LyoqIFNldCBwb3J0LiBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIsIDgwIGlzIHN1YnN0aXR1dGVkLiAqLwordm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgeworICAgIHRyeSB7CisgICAgICAgIHNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICBzZXJ2ZXJQb3J0ID0gODA7ICAvLyBkZWZhdWx0IHBvcnQgZm9yIHNlcnZlciAKKyAgICB9Cit9PC9wcmU+PC9saT4KKzxsaT5DYXRjaCB0aGUgRXhjZXB0aW9uIGFuZCB0aHJvdyBhIG5ldyBSdW50aW1lRXhjZXB0aW9uLiBUaGlzIGlzIGRhbmdlcm91czoKK29ubHkgZG8gaXQgaWYgeW91IGFyZSBwb3NpdGl2ZSB0aGF0IGlmIHRoaXMgZXJyb3Igb2NjdXJzLCB0aGUgYXBwcm9wcmlhdGUKK3RoaW5nIHRvIGRvIGlzIGNyYXNoLgorPHByZT4vKiogU2V0IHBvcnQuIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlciwgZGllLiAqLwordm9pZCBzZXRTZXJ2ZXJQb3J0KFN0cmluZyB2YWx1ZSkgeworICAgIHRyeSB7CisgICAgICAgIHNlcnZlclBvcnQgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicG9ydCAiICsgdmFsdWUgIiBpcyBpbnZhbGlkLCAiLCBlKTsKKyAgICB9Cit9PC9wcmU+CitOb3RlIHRoYXQgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZvcgorUnVudGltZUV4Y2VwdGlvbi4gIElmIHlvdXIgY29kZSBtdXN0IGNvbXBpbGUgdW5kZXIgSmF2YSAxLjMsIHlvdSB3aWxsIG5lZWQgdG8KK29taXQgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzIHRoZSBjYXVzZS48L2xpPgorPGxpPkxhc3QgcmVzb3J0OiBpZiB5b3UgYXJlIGNvbmZpZGVudCB0aGF0IGFjdHVhbGx5IGlnbm9yaW5nIHRoZSBleGNlcHRpb24gaXMKK2FwcHJvcHJpYXRlIHRoZW4geW91IG1heSBpZ25vcmUgaXQsIGJ1dCB5b3UgbXVzdCBhbHNvIGNvbW1lbnQgd2h5IHdpdGggYSBnb29kCityZWFzb246Cis8cHJlPi8qKiBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIsIG9yaWdpbmFsIHBvcnQgbnVtYmVyIGlzIHVzZWQuICovCit2b2lkIHNldFNlcnZlclBvcnQoU3RyaW5nIHZhbHVlKSB7CisgICAgdHJ5IHsKKyAgICAgICAgc2VydmVyUG9ydCA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIC8vIE1ldGhvZCBpcyBkb2N1bWVudGVkIHRvIGp1c3QgaWdub3JlIGludmFsaWQgdXNlciBpbnB1dC4KKyAgICAgICAgLy8gc2VydmVyUG9ydCB3aWxsIGp1c3QgYmUgdW5jaGFuZ2VkLgorICAgIH0KK308L3ByZT48L2xpPgogPC91bD4KLTxoMj48YT5FeGNlcHRpb25zOiBkbyBub3QgY2F0Y2ggZ2VuZXJpYyBFeGNlcHRpb248L2E+Ci08L2gyPgotU29tZXRpbWVzIGl0IGlzIHRlbXB0aW5nIHRvIGJlIGxhenkgd2hlbiBjYXRjaGluZyBleGNlcHRpb25zIGFuZCBkbyBzb21ldGhpbmcgbGlrZSB0aGlzOgotPHByZT50cnkgezxicj5zb21lQ29tcGxpY2F0ZWRJT0Z1bmN0aW9uKCk7ICAgICAgICAvLyBtYXkgdGhyb3cgSU9FeGNlcHRpb24gPGJyPnNvbWVDb21wbGljYXRlZFBhcnNpbmdGdW5jdGlvbigpOyAgIC8vIG1heSB0aHJvdyBQYXJzaW5nRXhjZXB0aW9uIDxicj5zb21lQ29tcGxpY2F0ZWRTZWN1cml0eUZ1bmN0aW9uKCk7ICAvLyBtYXkgdGhyb3cgU2VjdXJpdHlFeGNlcHRpb24gPGJyPi8vIHBoZXcsIG1hZGUgaXQgYWxsIHRoZSB3YXkgPGJyPn0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7ICAgICAgICAgICAgICAgLy8gSSdsbCBqdXN0IGNhdGNoIGFsbCBleGNlcHRpb25zIDxicj5oYW5kbGVFcnJvcigpOyAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG9uZSBnZW5lcmljIGhhbmRsZXIhPGJyPn08YnI+PGJyPjwvcHJlPgotWW91IHNob3VsZCBub3QgZG8gdGhpcy4gSW4gYWxtb3N0IGFsbCBjYXNlcyBpdCBpcyBpbmFwcHJvcHJpYXRlIHRvIGNhdGNoIGdlbmVyaWMgRXhjZXB0aW9uIG9yIFRocm93YWJsZSwgcHJlZmVyYWJseSBub3QgVGhyb3dhYmxlLCBiZWNhdXNlIGl0IGluY2x1ZGVzIEVycm9yIGV4Y2VwdGlvbnMgYXMgd2VsbC4gSXQgaXMgdmVyeSBkYW5nZXJvdXMuIEl0IG1lYW5zIHRoYXQgRXhjZXB0aW9ucyB5b3UgbmV2ZXIgZXhwZWN0ZWQgKGluY2x1ZGluZyBSdW50aW1lRXhjZXB0aW9ucyBsaWtlIENsYXNzQ2FzdEV4Y2VwdGlvbikgZW5kIHVwIGdldHRpbmcgY2F1Z2h0IGluIGFwcGxpY2F0aW9uLWxldmVsIGVycm9yIGhhbmRsaW5nLiBJdCBvYnNjdXJlcyB0aGUgZmFpbHVyZSBoYW5kbGluZyBwcm9wZXJ0aWVzIG9mIHlvdXIgY29kZS4gSXQgbWVhbnMgaWYgc29tZW9uZSBhZGRzIGEgbmV3IHR5cGUgb2YgRXhjZXB0aW9uIGluIHRoZSBjb2RlIHlvdSdyZSBjYWxsaW5nLCB0aGUgY29tcGlsZXIgd29uJ3QgaGVscCB5b3UgcmVhbGl6ZSB5b3UgbmVlZCB0byBoYW5kbGUgdGhhdCBlcnJvciBkaWZmZXJlbnRseS4gQW5kIGluIG1vc3QgY2FzZXMgeW91IHNob3VsZG4ndCBiZSBoYW5kbGluZyBkaWZmZXJlbnQgdHlwZXMgb2YgZXhjZXB0aW9uIHRoZSBzYW1lIHdheSwgYW55d2F5LgotPHA+VGhlcmUgYXJlIHJhcmUgZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGU6IGNlcnRhaW4gdGVzdCBjb2RlIGFuZCB0b3AtbGV2ZWwgY29kZSB3aGVyZSB5b3Ugd2FudCB0byBjYXRjaCBhbGwga2luZHMgb2YgZXJyb3JzICh0byBwcmV2ZW50IHRoZW0gZnJvbSBzaG93aW5nIHVwIGluIGEgVUksIG9yIHRvIGtlZXAgYSBiYXRjaCBqb2IgcnVubmluZykuIEluIHRoYXQgY2FzZSB5b3UgbWF5IGNhdGNoIGdlbmVyaWMgRXhjZXB0aW9uIChvciBUaHJvd2FibGUpIGFuZCBoYW5kbGUgdGhlIGVycm9yIGFwcHJvcHJpYXRlbHkuIFlvdSBzaG91bGQgdGhpbmsgdmVyeSBjYXJlZnVsbHkgYmVmb3JlIGRvaW5nIHRoaXMsIHRob3VnaCwgYW5kIHB1dCBpbiBjb21tZW50cyBleHBsYWluaW5nIHdoeSBpdCBpcyBzYWZlIGluIHRoaXMgcGxhY2UuCi08L3A+Ci08cD5BbHRlcm5hdGl2ZXMgdG8gY2F0Y2hpbmcgZ2VuZXJpYyBFeGNlcHRpb246Ci08L3A+Ci08dWw+PGxpPkNhdGNoIGVhY2ggZXhjZXB0aW9uIHNlcGFyYXRlbHkgYXMgc2VwYXJhdGUgY2F0Y2ggYmxvY2tzIGFmdGVyIGEgc2luZ2xlIHRyeS4gVGhpcyBjYW4gYmUgYXdrd2FyZCBidXQgaXMgc3RpbGwgcHJlZmVyYWJsZSB0byBjYXRjaGluZyBhbGwgRXhjZXB0aW9ucy4gQmV3YXJlIHJlcGVhdGluZyB0b28gbXVjaCBjb2RlIGluIHRoZSBjYXRjaCBibG9ja3MuCi08L2xpPgotPGxpPlJlZmFjdG9yIHlvdXIgY29kZSB0byBoYXZlIG1vcmUgZmluZS1ncmFpbmVkIGVycm9yIGhhbmRsaW5nLCB3aXRoIG11bHRpcGxlIHRyeSBibG9ja3MuIFNwbGl0IHVwIHRoZSBJTyBmcm9tIHRoZSBwYXJzaW5nLCBoYW5kbGUgZXJyb3JzIHNlcGFyYXRlbHkgaW4gZWFjaCBjYXNlLgotPC9saT4KLTxsaT5SZXRocm93IHRoZSBleGNlcHRpb24uIE1hbnkgdGltZXMgeW91IGRvbid0IG5lZWQgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhdCB0aGlzIGxldmVsIGFueXdheSwganVzdCBsZXQgdGhlIG1ldGhvZCB0aHJvdyBpdC4KLTwvbGk+Cis8aDI+PGEgbmFtZT0iZXhjZXB0aW9uc0FsbCI+PC9hPkV4Y2VwdGlvbnM6IGRvIG5vdCBjYXRjaCBnZW5lcmljIEV4Y2VwdGlvbjwvaDI+Cis8cD5Tb21ldGltZXMgaXQgaXMgdGVtcHRpbmcgdG8gYmUgbGF6eSB3aGVuIGNhdGNoaW5nIGV4Y2VwdGlvbnMgYW5kIGRvCitzb21ldGhpbmcgbGlrZSB0aGlzOjwvcD4KKzxwcmU+dHJ5IHsKKyAgICBzb21lQ29tcGxpY2F0ZWRJT0Z1bmN0aW9uKCk7ICAgICAgICAvLyBtYXkgdGhyb3cgSU9FeGNlcHRpb24gCisgICAgc29tZUNvbXBsaWNhdGVkUGFyc2luZ0Z1bmN0aW9uKCk7ICAgLy8gbWF5IHRocm93IFBhcnNpbmdFeGNlcHRpb24gCisgICAgc29tZUNvbXBsaWNhdGVkU2VjdXJpdHlGdW5jdGlvbigpOyAgLy8gbWF5IHRocm93IFNlY3VyaXR5RXhjZXB0aW9uIAorICAgIC8vIHBoZXcsIG1hZGUgaXQgYWxsIHRoZSB3YXkgCit9IGNhdGNoIChFeGNlcHRpb24gZSkgeyAgICAgICAgICAgICAgIC8vIEknbGwganVzdCBjYXRjaCBhbGwgZXhjZXB0aW9ucyAKKyAgICBoYW5kbGVFcnJvcigpOyAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIG9uZSBnZW5lcmljIGhhbmRsZXIhCit9PC9wcmU+Cis8cD5Zb3Ugc2hvdWxkIG5vdCBkbyB0aGlzLiBJbiBhbG1vc3QgYWxsIGNhc2VzIGl0IGlzIGluYXBwcm9wcmlhdGUgdG8gY2F0Y2gKK2dlbmVyaWMgRXhjZXB0aW9uIG9yIFRocm93YWJsZSwgcHJlZmVyYWJseSBub3QgVGhyb3dhYmxlLCBiZWNhdXNlIGl0IGluY2x1ZGVzCitFcnJvciBleGNlcHRpb25zIGFzIHdlbGwuIEl0IGlzIHZlcnkgZGFuZ2Vyb3VzLiBJdCBtZWFucyB0aGF0IEV4Y2VwdGlvbnMgeW91CituZXZlciBleHBlY3RlZCAoaW5jbHVkaW5nIFJ1bnRpbWVFeGNlcHRpb25zIGxpa2UgQ2xhc3NDYXN0RXhjZXB0aW9uKSBlbmQgdXAKK2dldHRpbmcgY2F1Z2h0IGluIGFwcGxpY2F0aW9uLWxldmVsIGVycm9yIGhhbmRsaW5nLiBJdCBvYnNjdXJlcyB0aGUgZmFpbHVyZQoraGFuZGxpbmcgcHJvcGVydGllcyBvZiB5b3VyIGNvZGUuIEl0IG1lYW5zIGlmIHNvbWVvbmUgYWRkcyBhIG5ldyB0eXBlIG9mCitFeGNlcHRpb24gaW4gdGhlIGNvZGUgeW91J3JlIGNhbGxpbmcsIHRoZSBjb21waWxlciB3b24ndCBoZWxwIHlvdSByZWFsaXplIHlvdQorbmVlZCB0byBoYW5kbGUgdGhhdCBlcnJvciBkaWZmZXJlbnRseS4gQW5kIGluIG1vc3QgY2FzZXMgeW91IHNob3VsZG4ndCBiZQoraGFuZGxpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGV4Y2VwdGlvbiB0aGUgc2FtZSB3YXksIGFueXdheS48L3A+Cis8cD5UaGVyZSBhcmUgcmFyZSBleGNlcHRpb25zIHRvIHRoaXMgcnVsZTogY2VydGFpbiB0ZXN0IGNvZGUgYW5kIHRvcC1sZXZlbAorY29kZSB3aGVyZSB5b3Ugd2FudCB0byBjYXRjaCBhbGwga2luZHMgb2YgZXJyb3JzICh0byBwcmV2ZW50IHRoZW0gZnJvbSBzaG93aW5nCit1cCBpbiBhIFVJLCBvciB0byBrZWVwIGEgYmF0Y2ggam9iIHJ1bm5pbmcpLiBJbiB0aGF0IGNhc2UgeW91IG1heSBjYXRjaAorZ2VuZXJpYyBFeGNlcHRpb24gKG9yIFRocm93YWJsZSkgYW5kIGhhbmRsZSB0aGUgZXJyb3IgYXBwcm9wcmlhdGVseS4gWW91CitzaG91bGQgdGhpbmsgdmVyeSBjYXJlZnVsbHkgYmVmb3JlIGRvaW5nIHRoaXMsIHRob3VnaCwgYW5kIHB1dCBpbiBjb21tZW50cworZXhwbGFpbmluZyB3aHkgaXQgaXMgc2FmZSBpbiB0aGlzIHBsYWNlLjwvcD4KKzxwPkFsdGVybmF0aXZlcyB0byBjYXRjaGluZyBnZW5lcmljIEV4Y2VwdGlvbjo8L3A+Cis8dWw+Cis8bGk+Q2F0Y2ggZWFjaCBleGNlcHRpb24gc2VwYXJhdGVseSBhcyBzZXBhcmF0ZSBjYXRjaCBibG9ja3MgYWZ0ZXIgYSBzaW5nbGUKK3RyeS4gVGhpcyBjYW4gYmUgYXdrd2FyZCBidXQgaXMgc3RpbGwgcHJlZmVyYWJsZSB0byBjYXRjaGluZyBhbGwgRXhjZXB0aW9ucy4KK0Jld2FyZSByZXBlYXRpbmcgdG9vIG11Y2ggY29kZSBpbiB0aGUgY2F0Y2ggYmxvY2tzLjwvbGk+Cis8bGk+UmVmYWN0b3IgeW91ciBjb2RlIHRvIGhhdmUgbW9yZSBmaW5lLWdyYWluZWQgZXJyb3IgaGFuZGxpbmcsIHdpdGggbXVsdGlwbGUKK3RyeSBibG9ja3MuIFNwbGl0IHVwIHRoZSBJTyBmcm9tIHRoZSBwYXJzaW5nLCBoYW5kbGUgZXJyb3JzIHNlcGFyYXRlbHkgaW4gZWFjaAorY2FzZS48L2xpPgorPGxpPlJldGhyb3cgdGhlIGV4Y2VwdGlvbi4gTWFueSB0aW1lcyB5b3UgZG9uJ3QgbmVlZCB0byBjYXRjaCB0aGUgZXhjZXB0aW9uIGF0Cit0aGlzIGxldmVsIGFueXdheSwganVzdCBsZXQgdGhlIG1ldGhvZCB0aHJvdyBpdC48L2xpPgogPC91bD4KLVJlbWVtYmVyOiBleGNlcHRpb25zIGFyZSB5b3VyIGZyaWVuZCEgV2hlbiB0aGUgY29tcGlsZXIgY29tcGxhaW5zIHlvdSdyZSBub3QgY2F0Y2hpbmcgYW4gZXhjZXB0aW9uLCBkb24ndCBzY293bC4gU21pbGU6IHRoZSBjb21waWxlciBqdXN0IG1hZGUgaXQgZWFzaWVyIGZvciB5b3UgdG8gY2F0Y2ggcnVudGltZSBwcm9ibGVtcyBpbiB5b3VyIGNvZGUuCi08aDI+PGE+RmluYWxpemVyczwvYT4KLTwvaDI+Ci08cD48Yj5XaGF0IGl0IGlzPC9iPgotOiBGaW5hbGl6ZXJzIGFyZSBhIHdheSB0byBoYXZlIGEgY2h1bmsgb2YgY29kZSBleGVjdXRlZCB3aGVuIGFuIG9iamVjdCBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLTwvcD4KLTxwPjxiPlByb3M8L2I+Ci06IGNhbiBiZSBoYW5keSBmb3IgZG9pbmcgY2xlYW51cCwgcGFydGljdWxhcmx5IG9mIGV4dGVybmFsIHJlc291cmNlcy4KLTwvcD4KLTxwPjxiPkNvbnM8L2I+Ci06IHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFzIHRvIHdoZW4gYSBmaW5hbGl6ZXIgd2lsbCBiZSBjYWxsZWQsIG9yIGV2ZW4gdGhhdCBpdCB3aWxsIGJlIGNhbGxlZCBhdCBhbGwuCi08L3A+Ci08cD48Yj5EZWNpc2lvbjwvYj4KLTogd2UgZG9uJ3QgdXNlIGZpbmFsaXplcnMuIEluIG1vc3QgY2FzZXMsIHlvdSBjYW4gZG8gd2hhdCB5b3UgbmVlZCBmcm9tIGEgZmluYWxpemVyIHdpdGggZ29vZCBleGNlcHRpb24gaGFuZGxpbmcuIElmIHlvdSBhYnNvbHV0ZWx5IG5lZWQgaXQsIGRlZmluZSBhIGNsb3NlKCkgbWV0aG9kIChvciB0aGUgbGlrZSkgYW5kIGRvY3VtZW50IGV4YWN0bHkgd2hlbiB0aGF0IG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQuIFNlZSBJbnB1dFN0cmVhbSBmb3IgYW4gZXhhbXBsZS4gSW4gdGhpcyBjYXNlIGl0IGlzIGFwcHJvcHJpYXRlIGJ1dCBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYSBzaG9ydCBsb2cgbWVzc2FnZSBmcm9tIHRoZSBmaW5hbGl6ZXIsIGFzIGxvbmcgYXMgaXQgaXMgbm90IGV4cGVjdGVkIHRvIGZsb29kIHRoZSBsb2dzLgotPC9wPgotPHA+VGhlIG9uZSBleGNlcHRpb24gaXMgaXQgaXMgT0sgdG8gd3JpdGUgYSBmaW5hbGl6ZXIgaWYgYWxsIGl0IGRvZXMgaXMgbWFrZSBjYWxscyB0byBYLmFzc2VydFRydWUoKS4KLTwvcD4KLTxoMj48YT5JbXBvcnRzPC9hPgotPC9oMj4KLTxoMz4KLVdpbGRjYXJkcyBpbiBpbXBvcnRzCi08L2gzPgotPHA+PGI+V2hhdCBpdCBpczwvYj4KLTogV2hlbiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgQmFyIGZyb20gcGFja2FnZSBmb28sdGhlcmUgYXJlIHR3byBwb3NzaWJsZSB3YXlzIHRvIGltcG9ydCBpdDoKLTwvcD4KLTxvbD48bGk+aW1wb3J0IGZvby4qOwotPC9saT4KLTxsaT5pbXBvcnQgZm9vLkJhcjsKLTwvbGk+Cis8cD5SZW1lbWJlcjogZXhjZXB0aW9ucyBhcmUgeW91ciBmcmllbmQhIFdoZW4gdGhlIGNvbXBpbGVyIGNvbXBsYWlucyB5b3UncmUKK25vdCBjYXRjaGluZyBhbiBleGNlcHRpb24sIGRvbid0IHNjb3dsLiBTbWlsZTogdGhlIGNvbXBpbGVyIGp1c3QgbWFkZSBpdAorZWFzaWVyIGZvciB5b3UgdG8gY2F0Y2ggcnVudGltZSBwcm9ibGVtcyBpbiB5b3VyIGNvZGUuPC9wPgorPGgyPjxhIG5hbWU9ImZpbmFsaXplcnMiPjwvYT5GaW5hbGl6ZXJzPC9oMj4KKzxwPjxiPldoYXQgaXQgaXM8L2I+OiBGaW5hbGl6ZXJzIGFyZSBhIHdheSB0byBoYXZlIGEgY2h1bmsgb2YgY29kZSBleGVjdXRlZAord2hlbiBhbiBvYmplY3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuPC9wPgorPHA+PGI+UHJvczwvYj46IGNhbiBiZSBoYW5keSBmb3IgZG9pbmcgY2xlYW51cCwgcGFydGljdWxhcmx5IG9mIGV4dGVybmFsCityZXNvdXJjZXMuPC9wPgorPHA+PGI+Q29uczwvYj46IHRoZXJlIGFyZSBubyBndWFyYW50ZWVzIGFzIHRvIHdoZW4gYSBmaW5hbGl6ZXIgd2lsbCBiZSBjYWxsZWQsCitvciBldmVuIHRoYXQgaXQgd2lsbCBiZSBjYWxsZWQgYXQgYWxsLjwvcD4KKzxwPjxiPkRlY2lzaW9uPC9iPjogd2UgZG9uJ3QgdXNlIGZpbmFsaXplcnMuIEluIG1vc3QgY2FzZXMsIHlvdSBjYW4gZG8gd2hhdAoreW91IG5lZWQgZnJvbSBhIGZpbmFsaXplciB3aXRoIGdvb2QgZXhjZXB0aW9uIGhhbmRsaW5nLiBJZiB5b3UgYWJzb2x1dGVseSBuZWVkCitpdCwgZGVmaW5lIGEgY2xvc2UoKSBtZXRob2QgKG9yIHRoZSBsaWtlKSBhbmQgZG9jdW1lbnQgZXhhY3RseSB3aGVuIHRoYXQKK21ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQuIFNlZSBJbnB1dFN0cmVhbSBmb3IgYW4gZXhhbXBsZS4gSW4gdGhpcyBjYXNlIGl0IGlzCithcHByb3ByaWF0ZSBidXQgbm90IHJlcXVpcmVkIHRvIHByaW50IGEgc2hvcnQgbG9nIG1lc3NhZ2UgZnJvbSB0aGUgZmluYWxpemVyLAorYXMgbG9uZyBhcyBpdCBpcyBub3QgZXhwZWN0ZWQgdG8gZmxvb2QgdGhlIGxvZ3MuPC9wPgorPGgyPjxhIG5hbWU9ImltcG9ydHMiPjwvYT5JbXBvcnRzPC9oMj4KKzxoMz5XaWxkY2FyZHMgaW4gaW1wb3J0czwvaDM+Cis8cD48Yj5XaGF0IGl0IGlzPC9iPjogV2hlbiB5b3Ugd2FudCB0byB1c2UgY2xhc3MgQmFyIGZyb20gcGFja2FnZSBmb28sdGhlcmUKK2FyZSB0d28gcG9zc2libGUgd2F5cyB0byBpbXBvcnQgaXQ6PC9wPgorPG9sPgorPGxpPjxjb2RlPmltcG9ydCBmb28uKjs8L2NvZGU+PC9saT4KKzxsaT48Y29kZT5pbXBvcnQgZm9vLkJhcjs8L2NvZGU+PC9saT4KIDwvb2w+Ci08cD48Yj5Qcm9zIG9mICMxPC9iPgotOiBQb3RlbnRpYWxseSByZWR1Y2VzIHRoZSBudW1iZXIgb2YgaW1wb3J0IHN0YXRlbWVudHMuCis8cD48Yj5Qcm9zIG9mICMxPC9iPjogUG90ZW50aWFsbHkgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGltcG9ydCBzdGF0ZW1lbnRzLgogPC9wPgotPHA+PGI+UHJvcyBvZiAjMjwvYj4KLTogTWFrZXMgaXQgb2J2aW91cyB3aGF0IGNsYXNzZXMgYXJlIGFjdHVhbGx5IHVzZWQuIE1ha2VzIGNvZGUgbW9yZSByZWFkYWJsZSBmb3IgbWFpbnRhaW5lcnMuCi08L3A+Ci08cD48Yj5EZWNpc2lvbjwvYj4KLTpVc2Ugc3R5bGUgIzIgZm9yIGltcG9ydGluZyBhbGwgQW5kcm9pZCBjb2RlLiBBbiBleHBsaWNpdCBleGNlcHRpb24gaXMgbWFkZSBmb3IgamF2YSBzdGFuZGFyZCBsaWJyYXJpZXMgKGphdmEudXRpbC4qLCBqYXZhLmlvLiosIGV0Yy4pIGFuZCB1bml0IHRlc3QgY29kZSAoanVuaXQuZnJhbWV3b3JrLiopLgotPC9wPgotPGgyPjxhPkNvbW1lbnRzL0phdmFkb2M8L2E+Ci08L2gyPgotPHA+RXZlcnkgZmlsZSBzaG91bGQgaGF2ZSBhIGNvcHlyaWdodCBzdGF0ZW1lbnQgYXQgdGhlIHRvcC4gVGhlbiBhIHBhY2thZ2Ugc3RhdGVtZW50IGFuZCBpbXBvcnQgc3RhdGVtZW50cyBzaG91bGQgZm9sbG93LCBlYWNoIGJsb2NrIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuIEFuZCB0aGVuIHRoZXJlIGlzIHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIEluIHRoZSBKYXZhZG9jIGNvbW1lbnRzLCBkZXNjcmliZSB3aGF0IHRoZSBjbGFzcyBvciBpbnRlcmZhY2UgZG9lcy4KLTwvcD4KLTxwcmU+Lyo8YnI+KiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8YnI+Kjxicj4qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOzxicj4qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS48YnI+KiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQgPGJyPio8YnI+KiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDxicj4qPGJyPiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSA8YnI+KiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLDxicj4qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLjxicj4qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgPGJyPiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuPGJyPiovPGJyPjxicj5wYWNrYWdlIGNvbS5hbmRyb2lkLmludGVybmFsLmZvbzs8YnI+PGJyPmltcG9ydCBhbmRyb2lkLm9zLkJsYWg7PGJyPmltcG9ydCBhbmRyb2lkLnZpZXcuWWFkYTs8YnI+PGJyPmltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7PGJyPmltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247PGJyPjxicj4vKio8YnI+KiBEb2VzIFggYW5kIFkgYW5kIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBaLjxicj4qLzxicj5wdWJsaWMgY2xhc3MgRm9vIHs8YnI+Li4uPGJyPn08YnI+PC9wcmU+Ci08cD5FdmVyeSBjbGFzcyBhbmQgbm9udHJpdmlhbCBwdWJsaWMgbWV0aG9kIHlvdSB3cml0ZSA8Yj5tdXN0PC9iPgotY29udGFpbiBhIEphdmFkb2MgY29tbWVudCB3aXRoIGF0IGxlYXN0IG9uZSBzZW50ZW5jZSBkZXNjcmliaW5nIHdoYXQgdGhlIGNsYXNzIG9yIG1ldGhvZCBkb2VzLiBUaGlzIHNlbnRlbmNlIHNob3VsZCBzdGFydCB3aXRoIGEgM3JkIHBlcnNvbiBkZXNjcmlwdGl2ZSB2ZXJiLiBFeGFtcGxlczoKLTwvcD4KLTxwcmU+LyoqIFJldHVybnMgdGhlIGNvcnJlY3RseSByb3VuZGVkIHBvc2l0aXZlIHNxdWFyZSByb290IG9mIGEgZG91YmxlIHZhbHVlLiAqLzxicj5zdGF0aWMgZG91YmxlIHNxcnQoZG91YmxlIGEpIHs8YnI+fTxicj48YnI+LyoqPGJyPiogQ29uc3RydWN0cyBhIG5ldyBTdHJpbmcgYnkgY29udmVydGluZyB0aGUgc3BlY2lmaWVkIGFycmF5IG9mIDxicj4qIGJ5dGVzIHVzaW5nIHRoZSBwbGF0Zm9ybSdzIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nLjxicj4qLzxicj5wdWJsaWMgU3RyaW5nKGJ5dGVbXSBieXRlcykgezxicj59PGJyPjwvcHJlPgotPHA+WW91IGRvIG5vdCBuZWVkIHRvIHdyaXRlIEphdmFkb2MgZm9yIHRyaXZpYWwgZ2V0IGFuZCBzZXQgbWV0aG9kcyBzdWNoIGFzIHNldEZvbygpIGlmIGFsbCB5b3VyIEphdmFkb2Mgd291bGQgc2F5IGlzICJzZXRzIEZvbyIuIElmIHRoZSBtZXRob2QgZG9lcyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IChzdWNoIGFzIGVuZm9yY2luZyBhIGNvbnN0cmFpbnQgb3IgaGF2aW5nIGFuIGltcG9ydGFudCBzaWRlIGVmZmVjdCksIHRoZW4geW91IG11c3QgZG9jdW1lbnQgaXQuIEFuZCBpZiBpdCdzIG5vdCBvYnZpb3VzIHdoYXQgdGhlIHByb3BlcnR5ICJGb28iIG1lYW5zLCB5b3Ugc2hvdWxkIGRvY3VtZW50IGl0LgotPC9wPgotPHA+RXZlcnkgbWV0aG9kIHlvdSB3cml0ZSwgd2hldGhlciBwdWJsaWMgb3Igb3RoZXJ3aXNlLCB3b3VsZCBiZW5lZml0IGZyb20gSmF2YWRvYy4gUHVibGljIG1ldGhvZHMgYXJlIHBhcnQgb2YgYW4gQVBJIGFuZCB0aGVyZWZvcmUgcmVxdWlyZSBKYXZhZG9jLgotPC9wPgotQW5kcm9pZCBkb2VzIG5vdCBjdXJyZW50bHkgZW5mb3JjZSBhIHNwZWNpZmljIHN0eWxlIGZvciB3cml0aW5nIEphdmFkb2MgY29tbWVudHMsIGJ1dCB5b3UgPGI+c2hvdWxkPC9iPgotZm9sbG93IHRoZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvIj5TdW4gSmF2YWRvYyBjb252ZW50aW9uczwvYT4KLS4KLTxoMj48YT5TaG9ydCBtZXRob2RzPC9hPgotPC9oMj4KLVRvIHRoZSBleHRlbnQgdGhhdCBpdCBpcyBmZWFzaWJsZSwgbWV0aG9kcyBzaG91bGQgYmUga2VwdCBzbWFsbCBhbmQgZm9jdXNlZC4gSXQgaXMsIGhvd2V2ZXIsIHJlY29nbml6ZWQgdGhhdCBsb25nIG1ldGhvZHMgYXJlIHNvbWV0aW1lcyBhcHByb3ByaWF0ZSwgc28gbm8gaGFyZCBsaW1pdCBpcyBwbGFjZWQgb24gbWV0aG9kIGxlbmd0aC4gSWYgYSBtZXRob2QgZXhjZWVkcyA0MCBsaW5lcyBvciBzbywgdGhpbmsgYWJvdXQgd2hldGhlciBpdCBjYW4gYmUgYnJva2VuIHVwIHdpdGhvdXQgaGFybWluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBwcm9ncmFtLgotPGgyPjxhPkxvY2FsIHZhcmlhYmxlczwvYT4KLTwvaDI+Ci1UaGUgc2NvcGUgb2YgbG9jYWwgdmFyaWFibGVzIHNob3VsZCBiZSBrZXB0IHRvIGEgbWluaW11bSAoPGk+RWZmZWN0aXZlIEphdmE8L2k+Ci1JdGVtIDI5KS4gQnkgZG9pbmcgc28sIHlvdSBpbmNyZWFzZSB0aGUgcmVhZGFiaWxpdHkgYW5kIG1haW50YWluYWJpbGl0eSBvZiB5b3VyIGNvZGUgYW5kIHJlZHVjZSB0aGUgbGlrZWxpaG9vZCBvZiBlcnJvci4gRWFjaCB2YXJpYWJsZSBzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhlIGlubmVybW9zdCBibG9jayB0aGF0IGVuY2xvc2VzIGFsbCB1c2VzIG9mIHRoZSB2YXJpYWJsZS4KLTxwPkxvY2FsIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgYXQgdGhlIHBvaW50IHRoZXkgYXJlIGZpcnN0IHVzZWQuIE5lYXJseSBldmVyeSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzaG91bGQgY29udGFpbiBhbiBpbml0aWFsaXplci4gSWYgeW91IGRvbid0IHlldCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIGEgdmFyaWFibGUgc2Vuc2libHksIHlvdSBzaG91bGQgcG9zdHBvbmUgdGhlIGRlY2xhcmF0aW9uIHVudGlsIHlvdSBkby4KLTwvcD4KLTxwPk9uZSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGNvbmNlcm5zIHRyeS1jYXRjaCBzdGF0ZW1lbnRzLiBJZiBhIHZhcmlhYmxlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiBhIG1ldGhvZCB0aGF0IHRocm93cyBhIGNoZWNrZWQgZXhjZXB0aW9uLCBpdCBtdXN0IGJlIGluaXRpYWxpemVkIGluc2lkZSBhIHRyeSBibG9jay4gSWYgdGhlIHZhbHVlIG11c3QgYmUgdXNlZCBvdXRzaWRlIG9mIHRoZSB0cnkgYmxvY2ssIHRoZW4gaXQgbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhlIHRyeSBibG9jaywgd2hlcmUgaXQgY2Fubm90IHlldCBiZSBzZW5zaWJseSBpbml0aWFsaXplZDoKLTwvcD4KLTxwcmU+Ly8gSW5zdGFudGlhdGUgY2xhc3MgY2wsIHdoaWNoIHJlcHJlc2VudHMgc29tZSBzb3J0IG9mIFNldCA8YnI+U2V0IHMgPSBudWxsOzxicj50cnkgezxicj5zID0gKFNldCkgY2wubmV3SW5zdGFuY2UoKTs8YnI+fSBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHs8YnI+dGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbCArICIgbm90IGFjY2Vzc2libGUiKTs8YnI+fSBjYXRjaChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHs8YnI+dGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbCArICIgbm90IGluc3RhbnRpYWJsZSIpOzxicj59PGJyPjxicj4vLyBFeGVyY2lzZSB0aGUgc2V0IDxicj5zLmFkZEFsbChBcnJheXMuYXNMaXN0KGFyZ3MpKTs8YnI+PC9wcmU+Ci08cD5CdXQgZXZlbiB0aGlzIGNhc2UgY2FuIGJlIGF2b2lkZWQgYnkgZW5jYXBzdWxhdGluZyB0aGUgdHJ5LWNhdGNoIGJsb2NrIGluIGEgbWV0aG9kOgotPC9wPgotPHByZT5TZXQgY3JlYXRlU2V0KENsYXNzIGNsKSB7PGJyPi8vIEluc3RhbnRpYXRlIGNsYXNzIGNsLCB3aGljaCByZXByZXNlbnRzIHNvbWUgc29ydCBvZiBTZXQgPGJyPnRyeSB7PGJyPnJldHVybiAoU2V0KSBjbC5uZXdJbnN0YW5jZSgpOzxicj59IGNhdGNoKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgezxicj50aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgYWNjZXNzaWJsZSIpOzxicj59IGNhdGNoKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgezxicj50aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgaW5zdGFudGlhYmxlIik7PGJyPn08YnI+fTxicj4uLi48YnI+Ly8gRXhlcmNpc2UgdGhlIHNldCA8YnI+U2V0IHMgPSBjcmVhdGVTZXQoY2wpOzxicj5zLmFkZEFsbChBcnJheXMuYXNMaXN0KGFyZ3MpKTs8YnI+PC9wcmU+Ci1Mb29wIHZhcmlhYmxlcyBzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhlIGZvciBzdGF0ZW1lbnQgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIGNvbXBlbGxpbmcgcmVhc29uIHRvIGRvIG90aGVyd2lzZToKLTxwcmU+Zm9yIChpbnQgaSA9IDA7IGkgbjsgaSsrKSB7PGJyPmRvU29tZXRoaW5nKGkpOzxicj59PGJyPjxicj5mb3IgKEl0ZXJhdG9yIGkgPSBjLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHs8YnI+ZG9Tb21ldGhpbmdFbHNlKGkubmV4dCgpKTs8YnI+fTxicj48YnI+PGJyPjwvcHJlPgotPGgyPjxhPkltcG9ydHM8L2E+Ci08L2gyPgotVGhlIG9yZGVyaW5nIG9mIGltcG9ydCBzdGF0ZW1lbnRzIGlzOkFuZHJvaWQgaW1wb3J0c0ltcG9ydHMgZnJvbSB0aGlyZCBwYXJ0aWVzIChjb20sIGp1bml0LCBuZXQsIG9yZyk8YnI+amF2YSBhbmQgamF2YXgKLTxwPlRvIGV4YWN0bHkgbWF0Y2ggdGhlIElERSBzZXR0aW5ncywgdGhlIGltcG9ydHMgc2hvdWxkIGJlOgotPC9wPgotQWxwaGFiZXRpY2FsIHdpdGhpbiBlYWNoIGdyb3VwaW5nLjxicj5DYXBpdGFsIGxldHRlcnMgYXJlIGNvbnNpZGVyZWQgdG8gY29tZSBiZWZvcmUgbG93ZXIgY2FzZSBsZXR0ZXIgKGUuZy4gWiBiZWZvcmUgYSkuVGhlcmUgc2hvdWxkIGJlIGEgYmxhbmsgbGluZSBiZXR3ZWVuIGVhY2ggbWFqb3IgZ3JvdXBpbmcgKGFuZHJvaWQsIGNvbSwganVuaXQsIG5ldCwgb3JnLCBqYXZhLCBqYXZheCkuCi08aDQ+Ci1XaHk/Ci08L2g0PgotPHA+T3JpZ2luYWxseSB0aGVyZSB3YXMgbm8gc3R5bGUgcmVxdWlyZW1lbnQgb24gdGhlIG9yZGVyaW5nLiBUaGlzIG1lYW50IHRoYXQgdGhlIElERSdzIHdlcmUgZWl0aGVyIGFsd2F5cyBjaGFuZ2luZyB0aGUgb3JkZXJpbmcsIG9yIElERSBkZXZlbG9wZXJzIGhhZCB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgaW1wb3J0IG1hbmFnZW1lbnQgZmVhdHVyZXMgYW5kIG1haW50YWluIHRoZSBpbXBvcnRzIGJ5IGhhbmQuIFRoaXMgd2FzIGRlZW1lZCBiYWQuIFdoZW4gamF2YS1zdHlsZSB3YXMgYXNrZWQsIHRoZSBwcmVmZXJyZWQgc3R5bGVzIHdlcmUgYWxsIG92ZXIgdGhlIG1hcC4gSXQgcHJldHR5IG11Y2ggY2FtZSBkb3duIHRvIG91ciBuZWVkaW5nIHRvICJwaWNrIGFuIG9yZGVyaW5nIGFuZCBiZSBjb25zaXN0ZW50LiIgU28gd2UgY2hvc2UgYSBzdHlsZSwgdXBkYXRlZCB0aGUgamF2YWd1aWRlIGFuZCBtYWRlIHRoZSBJREUncyBvYmV5IGl0LiBXZSBleHBlY3QgdGhhdCBhcyBJREUgdXNlcnMgd29yayBvbiB0aGUgY29kZSwgdGhlIGltcG9ydHMgaW4gYWxsIG9mIHRoZSBwYWNrYWdlcyB3aWxsIGVuZCB1cCBtYXRjaGluZyB0aGlzIHBhdHRlcm4gd2l0aG91dCBhbnkgZXh0cmEgZW5naW5lZXJpbmcgZWZmb3J0LgotPC9wPgotPHA+VGhlIHN0eWxlIGNob3NlbiBzdWNoIHRoYXQ6Ci08L3A+Ci1UaGUgaW1wb3J0cyBwZW9wbGUgd2FudCB0byBsb29rIGF0IGZpcnN0IHRlbmQgdG8gYmUgYXQgdGhlIHRvcCAoYW5kcm9pZClUaGUgaW1wb3J0cyBwZW9wbGUgd2FudCB0byBsb29rIGF0IGxlYXN0IHRlbmQgdG8gYmUgYXQgdGhlIGJvdHRvbSAoamF2YSlIdW1hbnMgY2FuIGVhc2lseSBmb2xsb3cgdGhlIHN0eWxlVGhlIElERSdzIGNhbiBmb2xsb3cgdGhlIHN0eWxlCi08aDM+Ci1XaGF0IGFib3V0IHN0YXRpYyBpbXBvcnRzPwotPC9oMz4KLVRoZSB1c2UgYW5kIGxvY2F0aW9uIG9mIHN0YXRpYyBpbXBvcnRzIGhhdmUgYmVlbiBtaWxkbHkgY29udHJvdmVyc2lhbCBpc3N1ZXMuIFNvbWUgcGVvcGxlIHdvdWxkIHByZWZlciBzdGF0aWMgaW1wb3J0cyB0byBiZSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUgcmVtYWluaW5nIGltcG9ydHMsIHNvbWUgd291bGQgcHJlZmVyIHRoZW0gcmVzaWRlIGFib3ZlIG9yIGJlbG93IGFsbCBvdGhlciBpbXBvcnRzLiBBZGRpdGluYWxseSwgd2UgaGF2ZSBub3QgeWV0IGNvbWUgdXAgd2l0aCBhIHdheSB0byBtYWtlIGFsbCBJREVzIHVzZSB0aGUgc2FtZSBvcmRlcmluZy4KLTxwPlNpbmNlIG1vc3QgcGVvcGxlIGNvbnNpZGVyIHRoaXMgYSBsb3cgcHJpb3JpdHkgaXNzdWUsIGp1c3QgdXNlIHlvdXIganVkZ2VtZW50IGFuZCBwbGVhc2UgYmUgY29uc2lzdGVudC4KLTwvcD4KKzxwPjxiPlByb3Mgb2YgIzI8L2I+OiBNYWtlcyBpdCBvYnZpb3VzIHdoYXQgY2xhc3NlcyBhcmUgYWN0dWFsbHkgdXNlZC4gTWFrZXMKK2NvZGUgbW9yZSByZWFkYWJsZSBmb3IgbWFpbnRhaW5lcnMuIDwvcD4KKzxwPjxiPkRlY2lzaW9uPC9iPjogVXNlIHN0eWxlICMyIGZvciBpbXBvcnRpbmcgYWxsIEFuZHJvaWQgY29kZS4gQW4gZXhwbGljaXQKK2V4Y2VwdGlvbiBpcyBtYWRlIGZvciBqYXZhIHN0YW5kYXJkIGxpYnJhcmllcyAoamF2YS51dGlsLiosIGphdmEuaW8uKiwgZXRjLikKK2FuZCB1bml0IHRlc3QgY29kZSAoanVuaXQuZnJhbWV3b3JrLiopLjwvcD4KKzxoMj48YSBuYW1lPSJqYXZhZG9jIj48L2E+Q29tbWVudHMvSmF2YWRvYzwvaDI+Cis8cD5FdmVyeSBmaWxlIHNob3VsZCBoYXZlIGEgY29weXJpZ2h0IHN0YXRlbWVudCBhdCB0aGUgdG9wLiBUaGVuIGEgcGFja2FnZQorc3RhdGVtZW50IGFuZCBpbXBvcnQgc3RhdGVtZW50cyBzaG91bGQgZm9sbG93LCBlYWNoIGJsb2NrIHNlcGFyYXRlZCBieSBhIGJsYW5rCitsaW5lLiBBbmQgdGhlbiB0aGVyZSBpcyB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiBJbiB0aGUgSmF2YWRvYworY29tbWVudHMsIGRlc2NyaWJlIHdoYXQgdGhlIGNsYXNzIG9yIGludGVyZmFjZSBkb2VzLjwvcD4KKzxwcmU+LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogCi08aDI+PGE+SW5kZW50YXRpb248L2E+Ci08L2gyPgotPHA+V2UgdXNlIDQgc3BhY2UgaW5kZW50cyBmb3IgYmxvY2tzLiBXZSBuZXZlciB1c2UgdGFicy4gV2hlbiBpbiBkb3VidCwgYmUgY29uc2lzdGVudCB3aXRoIGNvZGUgYXJvdW5kIHlvdS4KLTwvcD4KLTxwPldlIHVzZSA4IHNwYWNlIGluZGVudHMgZm9yIGxpbmUgd3JhcHMsIGluY2x1ZGluZyBmdW5jdGlvbiBjYWxscyBhbmQgYXNzaWdubWVudHMuIEZvciBleGFtcGxlLCB0aGlzIGlzIGNvcnJlY3Q6Ci08L3A+Ci08cHJlPkluc3RydW1lbnQgaSA8YnI+PSBzb21lTG9uZ0V4cHJlc3Npb24odGhhdCwgd291bGROb3RGaXQsIG9uLCBvbmUsIGxpbmUpOzwvcHJlPgotYW5kIHRoaXMgaXMgbm90IGNvcnJlY3Q6Ci08cHJlPkluc3RydW1lbnQgaSA8YnI+PSBzb21lTG9uZ0V4cHJlc3Npb24odGhhdCwgd291bGROb3RGaXQsIG9uLCBvbmUsIGxpbmUpOzwvcHJlPgotPGgyPjxhPkZpZWxkIE5hbWVzPC9hPgotPC9oMj4KLTx1bD48bGk+Tm9uLXB1YmxpYywgbm9uLXN0YXRpYyBmaWVsZCBuYW1lcyBzdGFydCB3aXRoIG0uCi08L2xpPgotPGxpPlN0YXRpYyBmaWVsZCBuYW1lcyBzdGFydCB3aXRoIHMuCi08L2xpPgotPGxpPk90aGVyIGZpZWxkcyBzdGFydCB3aXRoIGEgbG93ZXIgY2FzZSBsZXR0ZXIuCi08L2xpPgotPGxpPlB1YmxpYyBzdGF0aWMgZmluYWwgZmllbGRzIChjb25zdGFudHMpIGFyZSBBTExfQ0FQU19XSVRIX1VOREVSU0NPUkVTLgotPC9saT4KK3BhY2thZ2UgY29tLmFuZHJvaWQuaW50ZXJuYWwuZm9vOworCitpbXBvcnQgYW5kcm9pZC5vcy5CbGFoOworaW1wb3J0IGFuZHJvaWQudmlldy5ZYWRhOworCitpbXBvcnQgamF2YS5zcWwuUmVzdWx0U2V0OworaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKKworLyoqCisgKiBEb2VzIFggYW5kIFkgYW5kIHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciBaLgorICovCitwdWJsaWMgY2xhc3MgRm9vIHsKKyAgICAuLi4KK308L3ByZT4KKzxwPkV2ZXJ5IGNsYXNzIGFuZCBub250cml2aWFsIHB1YmxpYyBtZXRob2QgeW91IHdyaXRlIDxiPm11c3Q8L2I+IGNvbnRhaW4gYQorSmF2YWRvYyBjb21tZW50IHdpdGggYXQgbGVhc3Qgb25lIHNlbnRlbmNlIGRlc2NyaWJpbmcgd2hhdCB0aGUgY2xhc3Mgb3IgbWV0aG9kCitkb2VzLiBUaGlzIHNlbnRlbmNlIHNob3VsZCBzdGFydCB3aXRoIGEgM3JkIHBlcnNvbiBkZXNjcmlwdGl2ZSB2ZXJiLgorRXhhbXBsZXM6PC9wPgorPHByZT4vKiogUmV0dXJucyB0aGUgY29ycmVjdGx5IHJvdW5kZWQgcG9zaXRpdmUgc3F1YXJlIHJvb3Qgb2YgYSBkb3VibGUgdmFsdWUuICovCitzdGF0aWMgZG91YmxlIHNxcnQoZG91YmxlIGEpIHsKK30KKworLyoqCisgKiBDb25zdHJ1Y3RzIGEgbmV3IFN0cmluZyBieSBjb252ZXJ0aW5nIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgCisgKiBieXRlcyB1c2luZyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZy4KKyAqLworcHVibGljIFN0cmluZyhieXRlW10gYnl0ZXMpIHsKK308L3ByZT4KKzxwPllvdSBkbyBub3QgbmVlZCB0byB3cml0ZSBKYXZhZG9jIGZvciB0cml2aWFsIGdldCBhbmQgc2V0IG1ldGhvZHMgc3VjaCBhcworc2V0Rm9vKCkgaWYgYWxsIHlvdXIgSmF2YWRvYyB3b3VsZCBzYXkgaXMgInNldHMgRm9vIi4gSWYgdGhlIG1ldGhvZCBkb2VzCitzb21ldGhpbmcgbW9yZSBjb21wbGV4IChzdWNoIGFzIGVuZm9yY2luZyBhIGNvbnN0cmFpbnQgb3IgaGF2aW5nIGFuIGltcG9ydGFudAorc2lkZSBlZmZlY3QpLCB0aGVuIHlvdSBtdXN0IGRvY3VtZW50IGl0LiBBbmQgaWYgaXQncyBub3Qgb2J2aW91cyB3aGF0IHRoZQorcHJvcGVydHkgIkZvbyIgbWVhbnMsIHlvdSBzaG91bGQgZG9jdW1lbnQgaXQuPC9wPgorPHA+RXZlcnkgbWV0aG9kIHlvdSB3cml0ZSwgd2hldGhlciBwdWJsaWMgb3Igb3RoZXJ3aXNlLCB3b3VsZCBiZW5lZml0IGZyb20KK0phdmFkb2MuIFB1YmxpYyBtZXRob2RzIGFyZSBwYXJ0IG9mIGFuIEFQSSBhbmQgdGhlcmVmb3JlIHJlcXVpcmUgSmF2YWRvYy48L3A+Cis8cD5BbmRyb2lkIGRvZXMgbm90IGN1cnJlbnRseSBlbmZvcmNlIGEgc3BlY2lmaWMgc3R5bGUgZm9yIHdyaXRpbmcgSmF2YWRvYworY29tbWVudHMsIGJ1dCB5b3UgPGI+c2hvdWxkPC9iPiBmb2xsb3cgdGhlIDxhCitocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvIj5TdW4gSmF2YWRvYworY29udmVudGlvbnM8L2E+LjwvcD4KKzxoMj48YSBuYW1lPSJzaG9ydG1ldGhvZHMiPjwvYT5TaG9ydCBtZXRob2RzPC9oMj4KKzxwPlRvIHRoZSBleHRlbnQgdGhhdCBpdCBpcyBmZWFzaWJsZSwgbWV0aG9kcyBzaG91bGQgYmUga2VwdCBzbWFsbCBhbmQKK2ZvY3VzZWQuIEl0IGlzLCBob3dldmVyLCByZWNvZ25pemVkIHRoYXQgbG9uZyBtZXRob2RzIGFyZSBzb21ldGltZXMKK2FwcHJvcHJpYXRlLCBzbyBubyBoYXJkIGxpbWl0IGlzIHBsYWNlZCBvbiBtZXRob2QgbGVuZ3RoLiBJZiBhIG1ldGhvZCBleGNlZWRzCis0MCBsaW5lcyBvciBzbywgdGhpbmsgYWJvdXQgd2hldGhlciBpdCBjYW4gYmUgYnJva2VuIHVwIHdpdGhvdXQgaGFybWluZyB0aGUKK3N0cnVjdHVyZSBvZiB0aGUgcHJvZ3JhbS48L3A+Cis8aDI+PGEgbmFtZT0ibG9jYWx2YXJpYWJsZXMiPjwvYT5Mb2NhbCB2YXJpYWJsZXM8L2gyPgorPHA+VGhlIHNjb3BlIG9mIGxvY2FsIHZhcmlhYmxlcyBzaG91bGQgYmUga2VwdCB0byBhIG1pbmltdW0gKDxpPkVmZmVjdGl2ZQorSmF2YTwvaT4gSXRlbSAyOSkuIEJ5IGRvaW5nIHNvLCB5b3UgaW5jcmVhc2UgdGhlIHJlYWRhYmlsaXR5IGFuZAorbWFpbnRhaW5hYmlsaXR5IG9mIHlvdXIgY29kZSBhbmQgcmVkdWNlIHRoZSBsaWtlbGlob29kIG9mIGVycm9yLiBFYWNoIHZhcmlhYmxlCitzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhlIGlubmVybW9zdCBibG9jayB0aGF0IGVuY2xvc2VzIGFsbCB1c2VzIG9mIHRoZQordmFyaWFibGUuPC9wPgorPHA+TG9jYWwgdmFyaWFibGVzIHNob3VsZCBiZSBkZWNsYXJlZCBhdCB0aGUgcG9pbnQgdGhleSBhcmUgZmlyc3QgdXNlZC4gTmVhcmx5CitldmVyeSBsb2NhbCB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzaG91bGQgY29udGFpbiBhbiBpbml0aWFsaXplci4gSWYgeW91IGRvbid0Cit5ZXQgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gaW5pdGlhbGl6ZSBhIHZhcmlhYmxlIHNlbnNpYmx5LCB5b3Ugc2hvdWxkCitwb3N0cG9uZSB0aGUgZGVjbGFyYXRpb24gdW50aWwgeW91IGRvLjwvcD4KKzxwPk9uZSBleGNlcHRpb24gdG8gdGhpcyBydWxlIGNvbmNlcm5zIHRyeS1jYXRjaCBzdGF0ZW1lbnRzLiBJZiBhIHZhcmlhYmxlIGlzCitpbml0aWFsaXplZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgYSBtZXRob2QgdGhhdCB0aHJvd3MgYSBjaGVja2VkIGV4Y2VwdGlvbiwKK2l0IG11c3QgYmUgaW5pdGlhbGl6ZWQgaW5zaWRlIGEgdHJ5IGJsb2NrLiBJZiB0aGUgdmFsdWUgbXVzdCBiZSB1c2VkIG91dHNpZGUKK29mIHRoZSB0cnkgYmxvY2ssIHRoZW4gaXQgbXVzdCBiZSBkZWNsYXJlZCBiZWZvcmUgdGhlIHRyeSBibG9jaywgd2hlcmUgaXQKK2Nhbm5vdCB5ZXQgYmUgc2Vuc2libHkgaW5pdGlhbGl6ZWQ6PC9wPgorPHByZT4vLyBJbnN0YW50aWF0ZSBjbGFzcyBjbCwgd2hpY2ggcmVwcmVzZW50cyBzb21lIHNvcnQgb2YgU2V0IAorU2V0IHMgPSBudWxsOwordHJ5IHsKKyAgICBzID0gKFNldCkgY2wubmV3SW5zdGFuY2UoKTsKK30gY2F0Y2goSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbCArICIgbm90IGFjY2Vzc2libGUiKTsKK30gY2F0Y2goSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbCArICIgbm90IGluc3RhbnRpYWJsZSIpOworfQorCisvLyBFeGVyY2lzZSB0aGUgc2V0IAorcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChhcmdzKSk7PC9wcmU+Cis8cD5CdXQgZXZlbiB0aGlzIGNhc2UgY2FuIGJlIGF2b2lkZWQgYnkgZW5jYXBzdWxhdGluZyB0aGUgdHJ5LWNhdGNoIGJsb2NrIGluIGEgbWV0aG9kOjwvcD4KKzxwcmU+U2V0IGNyZWF0ZVNldChDbGFzcyBjbCkgeworICAgIC8vIEluc3RhbnRpYXRlIGNsYXNzIGNsLCB3aGljaCByZXByZXNlbnRzIHNvbWUgc29ydCBvZiBTZXQgCisgICAgdHJ5IHsKKyAgICAgICAgcmV0dXJuIChTZXQpIGNsLm5ld0luc3RhbmNlKCk7CisgICAgfSBjYXRjaChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihjbCArICIgbm90IGFjY2Vzc2libGUiKTsKKyAgICB9IGNhdGNoKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGNsICsgIiBub3QgaW5zdGFudGlhYmxlIik7CisgICAgfQorfQorCisuLi4KKworLy8gRXhlcmNpc2UgdGhlIHNldCAKK1NldCBzID0gY3JlYXRlU2V0KGNsKTsKK3MuYWRkQWxsKEFycmF5cy5hc0xpc3QoYXJncykpOzwvcHJlPgorPHA+TG9vcCB2YXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIHRoZSBmb3Igc3RhdGVtZW50IGl0c2VsZiB1bmxlc3MgdGhlcmUKK2lzIGEgY29tcGVsbGluZyByZWFzb24gdG8gZG8gb3RoZXJ3aXNlOjwvcD4KKzxwcmU+Zm9yIChpbnQgaSA9IDA7IGkgbjsgaSsrKSB7CisgICAgZG9Tb21ldGhpbmcoaSk7Cit9CisKK2ZvciAoSXRlcmF0b3IgaSA9IGMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkgeworICAgIGRvU29tZXRoaW5nRWxzZShpLm5leHQoKSk7Cit9PC9wcmU+Cis8aDI+PGEgbmFtZT0iaW1wb3J0X3N0eWxlIj48L2E+SW1wb3J0czwvaDI+Cis8cD5UaGUgb3JkZXJpbmcgb2YgaW1wb3J0IHN0YXRlbWVudHMgaXM6PC9wPgorPG9sPgorPGxpPkFuZHJvaWQgaW1wb3J0czwvbGk+Cis8bGk+SW1wb3J0cyBmcm9tIHRoaXJkIHBhcnRpZXMgKGNvbSwganVuaXQsIG5ldCwgb3JnKTwvbGk+Cis8bGk+amF2YSBhbmQgamF2YXg8L2xpPgorPC9vbD4KKzxwPlRvIGV4YWN0bHkgbWF0Y2ggdGhlIElERSBzZXR0aW5ncywgdGhlIGltcG9ydHMgc2hvdWxkIGJlOjwvcD4KKzx1bD4KKzxsaT5BbHBoYWJldGljYWwgd2l0aGluIGVhY2ggZ3JvdXBpbmcuPC9saT4KKzxsaT5DYXBpdGFsIGxldHRlcnMgYXJlIGNvbnNpZGVyZWQgdG8gY29tZSBiZWZvcmUgbG93ZXIgY2FzZSBsZXR0ZXIgKGUuZy4gWiBiZWZvcmUgYSkuPC9saT4KKzxsaT5UaGVyZSBzaG91bGQgYmUgYSBibGFuayBsaW5lIGJldHdlZW4gZWFjaCBtYWpvciBncm91cGluZyAoYW5kcm9pZCwgY29tLCBqdW5pdCwgbmV0LCBvcmcsIGphdmEsIGphdmF4KS48L2xpPgogPC91bD4KLTxwPkZvciBleGFtcGxlOgotPC9wPgotPHByZT5wdWJsaWMgY2xhc3MgTXlDbGFzcyB7PGJyPnB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPTUVfQ09OU1RBTlQgPSA0Mjs8YnI+cHVibGljIGludCBwdWJsaWNGaWVsZDs8YnI+cHJpdmF0ZSBzdGF0aWMgTXlDbGFzcyBzU2luZ2xldG9uOzxicj5pbnQgbVBhY2thZ2VQcml2YXRlOzxicj5wcml2YXRlIGludCBtUHJpdmF0ZTs8YnI+cHJvdGVjdGVkIGludCBtUHJvdGVjdGVkOzxicj59PC9wcmU+Ci08aDI+PGE+QnJhY2VzPC9hPgotPC9oMj4KLTxwPkJyYWNlcyBkbyBub3QgZ28gb24gdGhlaXIgb3duIGxpbmU7IHRoZXkgZ28gb24gdGhlIHNhbWUgbGluZSBhcyB0aGUgY29kZSBiZWZvcmUgdGhlbS4gU286Ci08L3A+Ci08cHJlPmNsYXNzIE15Q2xhc3Mgezxicj5pbnQgZnVuYygpIHs8YnI+aWYgKHNvbWV0aGluZykgezxicj4vLyAuLi48YnI+fSBlbHNlIGlmIChzb21ldGhpbmdFbHNlKSB7PGJyPi8vIC4uLjxicj59IGVsc2Ugezxicj4vLyAuLi48YnI+fTxicj59PGJyPn08YnI+PC9wcmU+Ci08cD5XZSByZXF1aXJlIGJyYWNlcyBhcm91bmQgdGhlIHN0YXRlbWVudHMgZm9yIGEgY29uZGl0aW9uYWwuIEV4Y2VwdCwgaWYgdGhlIGVudGlyZSBjb25kaXRpb25hbCAodGhlIGNvbmRpdGlvbiBhbmQgdGhlIGJvZHkpIGZpdCBvbiBvbmUgbGluZSwgeW91IG1heSAoYnV0IGFyZSBub3Qgb2JsaWdhdGVkIHRvKSBwdXQgaXQgYWxsIG9uIG9uZSBsaW5lLiBUaGF0IGlzLCB0aGlzIGlzIGxlZ2FsOgotPC9wPgotPHByZT5pZiAoY29uZGl0aW9uKSB7PGJyPmJvZHk7IC8vIG9rIDxicj59PGJyPmlmIChjb25kaXRpb24pIGJvZHk7IC8vIG9rPC9wcmU+Ci08cD5idXQgdGhpcyBpcyBzdGlsbCBpbGxlZ2FsOgotPC9wPgotPHByZT5pZiAoY29uZGl0aW9uKTxicj5ib2R5OyAvLyBiYWQgPGJyPjwvcHJlPgotPGgyPjxhPkxpbmUgbGVuZ3RoPC9hPgotPC9oMj4KLTxwPkVhY2ggbGluZSBvZiB0ZXh0IGluIHlvdXIgY29kZSBzaG91bGQgYmUgYXQgbW9zdCAxMDAgY2hhcmFjdGVycyBsb25nLgotPC9wPgotPHA+VGhlcmUgaGFzIGJlZW4gbG90cyBvZiBkaXNjdXNzaW9uIGFib3V0IHRoaXMgcnVsZSBhbmQgdGhlIGRlY2lzaW9uIHJlbWFpbnMgdGhhdCAxMDAgY2hhcmFjdGVycyBpcyB0aGUgbWF4aW11bS4KLTwvcD4KLTxwPkV4Y2VwdGlvbjogaWYgYSBjb21tZW50IGxpbmUgY29udGFpbnMgYW4gZXhhbXBsZSBjb21tYW5kIG9yIGEgbGl0ZXJhbCBVUkwgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMsIHRoYXQgbGluZSBtYXkgYmUgbG9uZ2VyIHRoYW4gMTAwIGNoYXJhY3RlcnMgZm9yIGVhc2Ugb2YgY3V0IGFuZCBwYXN0ZS4KLTwvcD4KLTxwPkV4Y2VwdGlvbjogaW1wb3J0IGxpbmVzIGNhbiBnbyBvdmVyIHRoZSBsaW1pdCBiZWNhdXNlIGh1bWFucyByYXJlbHkgc2VlIHRoZW0uIFRoaXMgYWxzbyBzaW1wbGlmaWVzIHRvb2wgd3JpdGluZy4KLTwvcD4KLTxoMj4KLUphdmEgMS41IEFubm90YXRpb25zCi08L2gyPgotPHA+QW5ub3RhdGlvbnMgc2hvdWxkIHByZWNlZGUgb3RoZXIgbW9kaWZpZXJzIGZvciB0aGUgc2FtZSBsYW5ndWFnZSBlbGVtZW50LiBTaW1wbGUgbWFya2VyIGFubm90YXRpb25zIChlLmcuIEBPdmVycmlkZSkgY2FuIGJlIGxpc3RlZCBvbiB0aGUgc2FtZSBsaW5lIHdpdGggdGhlIGxhbmd1YWdlIGVsZW1lbnQuIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBhbm5vdGF0aW9ucywgb3IgcGFyYW1ldGVyaXplZCBhbm5vdGF0aW9ucywgdGhleSBzaG91bGQgZWFjaCBiZSBsaXN0ZWQgb25lLXBlci1saW5lIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLTwvcD4KLTxwPkFuZHJvaWQgLXN0YW5kYXJkIHByYWN0aWNlcyBmb3IgdGhlIHRocmVlIHByZWRlZmluZWQgYW5ub3RhdGlvbnMgaW4gSmF2YSAxLjUncyBhcmU6Ci08L3A+Ci1ARGVwcmVjYXRlZFRoZSBARGVwcmVjYXRlZCBhbm5vdGF0aW9uIG11c3QgYmUgdXNlZCB3aGVuZXZlciB0aGUgdXNlIG9mIHRoZSBhbm5vdGF0ZWQgZWxlbWVudCBpcyBkaXNjb3VyYWdlZC4gSWYgeW91IHVzZSB0aGUgQERlcHJlY2F0ZWQgYW5ub3RhdGlvbiwgeW91IG11c3QgYWxzbyBoYXZlIGEgQGRlcHJlY2F0ZWQgSmF2YWRvYyB0YWcgYW5kIGl0IHNob3VsZCBuYW1lIGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbi4gSW4gYWRkaXRpb24sIHJlbWVtYmVyIHRoYXQgYSBARGVwcmVjYXRlZCBtZXRob2QgaXMgPGI+c3RpbGw8L2I+Ci1zdXBwb3NlZCB0byB3b3JrLgotPHA+SWYgeW91IHNlZSBvbGQgY29kZSB0aGF0IGhhcyBhIEBkZXByZWNhdGVkIEphdmFkb2MgdGFnLCBwbGVhc2UgYWRkIHRoZSBARGVwcmVjYXRlZCBhbm5vdGF0aW9uLgotPC9wPgotQE92ZXJyaWRlVGhlIEBPdmVycmlkZSBhbm5vdGF0aW9uIG11c3QgYmUgdXNlZCB3aGVuZXZlciBhIG1ldGhvZCBvdmVycmlkZXMgdGhlIGRlY2xhcmF0aW9uIG9yIGltcGxlbWVudGF0aW9uIGZyb20gYSBzdXBlci1jbGFzcy4KLTxwPkZvciBleGFtcGxlLCBpZiB5b3UgdXNlIHRoZSB7QGluaGVyaXRkb2NzfSBKYXZhZG9jIHRhZywgYW5kIGRlcml2ZSBmcm9tIGEgY2xhc3MgKG5vdCBhbiBpbnRlcmZhY2UpLCB5b3UgbXVzdCBhbHNvIGFubm90YXRlIHRoYXQgdGhlIG1ldGhvZCBAT3ZlcnJpZGVzIHRoZSBwYXJlbnQgY2xhc3MncyBtZXRob2QuCi08L3A+Ci1AU3VwcHJlc3NXYXJuaW5nc1RoZSBAU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgdW5kZXIgY2lyY3Vtc3RhbmNlcyB3aGVyZSBpdCBpcyBpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBhIHdhcm5pbmcuIElmIGEgd2FybmluZyBwYXNzZXMgdGhpcyAiaW1wb3NzaWJsZSB0byBlbGltaW5hdGUiIHRlc3QsIHRoZUBTdXBwcmVzc1dhcm5pbmdzIGFubm90YXRpb24gPGI+bXVzdDwvYj4KLWJlIHVzZWQsIHNvIGFzIHRvIGVuc3VyZSB0aGF0IGFsbCB3YXJuaW5ncyByZWZsZWN0IGFjdHVhbCBwcm9ibGVtcyBpbiB0aGUgY29kZS4KLTxwPldoZW4gYSBAU3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIGlzIG5lY2Vzc2FyeSwgaXQgbXVzdCBiZSBwcmVmaXhlZCB3aXRoIGEgVE9ETyBjb21tZW50IHRoYXQgZXhwbGFpbnMgdGhlICJpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSIgY29uZGl0aW9uLiBUaGlzIHdpbGwgbm9ybWFsbHkgaWRlbnRpZnkgYW4gb2ZmZW5kaW5nIGNsYXNzIHRoYXQgaGFzIGFuIGF3a3dhcmQgaW50ZXJmYWNlLiBGb3IgZXhhbXBsZToKLTwvcD4KLTxwcmU+Ly8gVE9ETzogVGhlIHRoaXJkLXBhcnR5IGNsYXNzIGNvbS50aGlyZC51c2VmdWwuVXRpbGl0eS5yb3RhdGUoKSBuZWVkcyBnZW5lcmljcyA8YnI+QFN1cHByZXNzV2FybmluZ3MoeyJnZW5lcmljLWNhc3QifSk8YnI+TGlzdFN0cmluZ2JsaXggPSBVdGlsaXR5LnJvdGF0ZShibGF4KTs8YnI+PC9wcmU+Ci1XaGVuIGEgQFN1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGNvZGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gaXNvbGF0ZSB0aGUgc29mdHdhcmUgZWxlbWVudHMgd2hlcmUgdGhlIGFubm90YXRpb24gYXBwbGllcy4KLTxoMj48YT5BY3JvbnltcyBpbiBuYW1lczwvYT4KLTwvaDI+Ci08cD5UcmVhdCBhY3JvbnltcyBhbmQgYWJicmV2aWF0aW9ucyBhcyB3b3Jkcy4gVGhlIG5hbWVzIGFyZSBtdWNoIG1vcmUgcmVhZGFibGU6Ci08L3A+Cis8aDQ+V2h5PzwvaDQ+Cis8cD5PcmlnaW5hbGx5IHRoZXJlIHdhcyBubyBzdHlsZSByZXF1aXJlbWVudCBvbiB0aGUgb3JkZXJpbmcuIFRoaXMgbWVhbnQgdGhhdAordGhlIElERSdzIHdlcmUgZWl0aGVyIGFsd2F5cyBjaGFuZ2luZyB0aGUgb3JkZXJpbmcsIG9yIElERSBkZXZlbG9wZXJzIGhhZCB0bworZGlzYWJsZSB0aGUgYXV0b21hdGljIGltcG9ydCBtYW5hZ2VtZW50IGZlYXR1cmVzIGFuZCBtYWludGFpbiB0aGUgaW1wb3J0cyBieQoraGFuZC4gVGhpcyB3YXMgZGVlbWVkIGJhZC4gV2hlbiBqYXZhLXN0eWxlIHdhcyBhc2tlZCwgdGhlIHByZWZlcnJlZCBzdHlsZXMKK3dlcmUgYWxsIG92ZXIgdGhlIG1hcC4gSXQgcHJldHR5IG11Y2ggY2FtZSBkb3duIHRvIG91ciBuZWVkaW5nIHRvICJwaWNrIGFuCitvcmRlcmluZyBhbmQgYmUgY29uc2lzdGVudC4iIFNvIHdlIGNob3NlIGEgc3R5bGUsIHVwZGF0ZWQgdGhlIHN0eWxlIGd1aWRlLCBhbmQKK21hZGUgdGhlIElERXMgb2JleSBpdC4gV2UgZXhwZWN0IHRoYXQgYXMgSURFIHVzZXJzIHdvcmsgb24gdGhlIGNvZGUsIHRoZQoraW1wb3J0cyBpbiBhbGwgb2YgdGhlIHBhY2thZ2VzIHdpbGwgZW5kIHVwIG1hdGNoaW5nIHRoaXMgcGF0dGVybiB3aXRob3V0IGFueQorZXh0cmEgZW5naW5lZXJpbmcgZWZmb3J0LjwvcD4KKzxwPlRoZSBzdHlsZSBjaG9zZW4gc3VjaCB0aGF0OjwvcD4KKzx1bD4KKzxsaT5UaGUgaW1wb3J0cyBwZW9wbGUgd2FudCB0byBsb29rIGF0IGZpcnN0IHRlbmQgdG8gYmUgYXQgdGhlIHRvcCAoYW5kcm9pZCk8L2xpPgorPGxpPlRoZSBpbXBvcnRzIHBlb3BsZSB3YW50IHRvIGxvb2sgYXQgbGVhc3QgdGVuZCB0byBiZSBhdCB0aGUgYm90dG9tIChqYXZhKTwvbGk+Cis8bGk+SHVtYW5zIGNhbiBlYXNpbHkgZm9sbG93IHRoZSBzdHlsZTwvbGk+Cis8bGk+VGhlIElERSdzIGNhbiBmb2xsb3cgdGhlIHN0eWxlPC9saT4KKzwvdWw+Cis8aDM+V2hhdCBhYm91dCBzdGF0aWMgaW1wb3J0cz88L2gzPgorPHA+VGhlIHVzZSBhbmQgbG9jYXRpb24gb2Ygc3RhdGljIGltcG9ydHMgaGF2ZSBiZWVuIG1pbGRseSBjb250cm92ZXJzaWFsCitpc3N1ZXMuIFNvbWUgcGVvcGxlIHdvdWxkIHByZWZlciBzdGF0aWMgaW1wb3J0cyB0byBiZSBpbnRlcnNwZXJzZWQgd2l0aCB0aGUKK3JlbWFpbmluZyBpbXBvcnRzLCBzb21lIHdvdWxkIHByZWZlciB0aGVtIHJlc2lkZSBhYm92ZSBvciBiZWxvdyBhbGwgb3RoZXIKK2ltcG9ydHMuIEFkZGl0aW5hbGx5LCB3ZSBoYXZlIG5vdCB5ZXQgY29tZSB1cCB3aXRoIGEgd2F5IHRvIG1ha2UgYWxsIElERXMgdXNlCit0aGUgc2FtZSBvcmRlcmluZy48L3A+Cis8cD5TaW5jZSBtb3N0IHBlb3BsZSBjb25zaWRlciB0aGlzIGEgbG93IHByaW9yaXR5IGlzc3VlLCBqdXN0IHVzZSB5b3VyCitqdWRnZW1lbnQgYW5kIHBsZWFzZSBiZSBjb25zaXN0ZW50LjwvcD4KIAotPHRhYmxlPjx0Ym9keT48dHI+PHRkPkdvb2QKLTwvdGQ+Ci08dGQ+QmFkCi08L3RkPgotPC90cj4KLTx0cj48dGQ+WG1sSHR0cFJlcXVlc3Q8L3RkPgotPHRkPlhNTEhUVFBSZXF1ZXN0Ci08L3RkPgotPC90cj4KLTx0cj48dGQ+Z2V0Q3VzdG9tZXJJZDwvdGQ+Ci08dGQ+Z2V0Q3VzdG9tZXJJRAotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLQotPHA+VGhpcyBzdHlsZSBydWxlIGFsc28gYXBwbGllcyB3aGVuIGFuIGFjcm9ueW0gb3IgYWJicmV2aWF0aW9uIGlzIHRoZSBlbnRpcmUgbmFtZToKLTwvcD4KLQotPHRhYmxlPjx0Ym9keT48dHI+PHRkPkdvb2QKLTwvdGQ+Ci08dGQ+QmFkCi08L3RkPgotPC90cj4KLTx0cj48dGQ+Y2xhc3MgSHRtbDwvdGQ+Ci08dGQ+Y2xhc3MgSFRNTAotPC90ZD4KLTwvdHI+Ci08dHI+PHRkPlN0cmluZyB1cmw7PC90ZD4KLTx0ZD5TdHJpbmcgVVJMOwotPC90ZD4KLTwvdHI+Ci08dHI+PHRkPmxvbmcgaWQ7PC90ZD4KLTx0ZD5sb25nIElEOwotPC90ZD4KLTwvdHI+Ci08L3Rib2R5PgotPC90YWJsZT4KLQotPHA+Qm90aCB0aGUgSkRLIGFuZCB0aGUgQW5kcm9pZCBjb2RlIGJhc2VzIGFyZSB2ZXJ5IGluY29uc2lzdGVudCB3aXRoIHJlZ2FyZHMgdG8gYWNyb255bXMsIHRoZXJlZm9yZSwgaXQgaXMgdmlydHVhbGx5IGltcG9zc2libGUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoZSBjb2RlIGFyb3VuZCB5b3UuIEJpdGUgdGhlIGJ1bGxldCwgYW5kIHRyZWF0IGFjcm9ueW1zIGFzIHdvcmRzLgotPC9wPgorPGgyPjxhIG5hbWU9ImluZGVudGF0aW9uIj48L2E+SW5kZW50YXRpb248L2gyPgorPHA+V2UgdXNlIDQgc3BhY2UgaW5kZW50cyBmb3IgYmxvY2tzLiBXZSBuZXZlciB1c2UgdGFicy4gV2hlbiBpbiBkb3VidCwgYmUKK2NvbnNpc3RlbnQgd2l0aCBjb2RlIGFyb3VuZCB5b3UuPC9wPgorPHA+V2UgdXNlIDggc3BhY2UgaW5kZW50cyBmb3IgbGluZSB3cmFwcywgaW5jbHVkaW5nIGZ1bmN0aW9uIGNhbGxzIGFuZAorYXNzaWdubWVudHMuIEZvciBleGFtcGxlLCB0aGlzIGlzIGNvcnJlY3Q6PC9wPgorPHByZT5JbnN0cnVtZW50IGkgPQorICAgICAgICBzb21lTG9uZ0V4cHJlc3Npb24odGhhdCwgd291bGROb3RGaXQsIG9uLCBvbmUsIGxpbmUpOzwvcHJlPgorPHA+YW5kIHRoaXMgaXMgbm90IGNvcnJlY3Q6PC9wPgorPHByZT5JbnN0cnVtZW50IGkgPQorICAgIHNvbWVMb25nRXhwcmVzc2lvbih0aGF0LCB3b3VsZE5vdEZpdCwgb24sIG9uZSwgbGluZSk7PC9wcmU+Cis8aDI+PGEgbmFtZT0iZmllbGRfbmFtZXMiPjwvYT5GaWVsZCBOYW1lczwvaDI+Cis8dWw+Cis8bGk+Tm9uLXB1YmxpYywgbm9uLXN0YXRpYyBmaWVsZCBuYW1lcyBzdGFydCB3aXRoIG0uPC9saT4KKzxsaT5TdGF0aWMgZmllbGQgbmFtZXMgc3RhcnQgd2l0aCBzLjwvbGk+Cis8bGk+T3RoZXIgZmllbGRzIHN0YXJ0IHdpdGggYSBsb3dlciBjYXNlIGxldHRlci48L2xpPgorPGxpPlB1YmxpYyBzdGF0aWMgZmluYWwgZmllbGRzIChjb25zdGFudHMpIGFyZSBBTExfQ0FQU19XSVRIX1VOREVSU0NPUkVTLjwvbGk+Cis8L3VsPgorPHA+Rm9yIGV4YW1wbGU6PC9wPgorPHByZT5wdWJsaWMgY2xhc3MgTXlDbGFzcyB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU09NRV9DT05TVEFOVCA9IDQyOworICAgIHB1YmxpYyBpbnQgcHVibGljRmllbGQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgTXlDbGFzcyBzU2luZ2xldG9uOworICAgIGludCBtUGFja2FnZVByaXZhdGU7CisgICAgcHJpdmF0ZSBpbnQgbVByaXZhdGU7CisgICAgcHJvdGVjdGVkIGludCBtUHJvdGVjdGVkOworfTwvcHJlPgorPGgyPjxhIG5hbWU9ImJyYWNlcyI+PC9hPkJyYWNlczwvaDI+Cis8cD5CcmFjZXMgZG8gbm90IGdvIG9uIHRoZWlyIG93biBsaW5lOyB0aGV5IGdvIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGNvZGUKK2JlZm9yZSB0aGVtLiBTbzo8L3A+Cis8cHJlPmNsYXNzIE15Q2xhc3MgeworICAgIGludCBmdW5jKCkgeworICAgICAgICBpZiAoc29tZXRoaW5nKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgfSBlbHNlIGlmIChzb21ldGhpbmdFbHNlKSB7CisgICAgICAgICAgICAvLyAuLi4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIC4uLgorICAgICAgICB9CisgICAgfQorfTwvcHJlPgorPHA+V2UgcmVxdWlyZSBicmFjZXMgYXJvdW5kIHRoZSBzdGF0ZW1lbnRzIGZvciBhIGNvbmRpdGlvbmFsLiBFeGNlcHQsIGlmIHRoZQorZW50aXJlIGNvbmRpdGlvbmFsICh0aGUgY29uZGl0aW9uIGFuZCB0aGUgYm9keSkgZml0IG9uIG9uZSBsaW5lLCB5b3UgbWF5IChidXQKK2FyZSBub3Qgb2JsaWdhdGVkIHRvKSBwdXQgaXQgYWxsIG9uIG9uZSBsaW5lLiBUaGF0IGlzLCB0aGlzIGlzIGxlZ2FsOjwvcD4KKzxwcmU+aWYgKGNvbmRpdGlvbikgeworICAgIGJvZHkoKTsgLy8gb2sgCit9CitpZiAoY29uZGl0aW9uKSBib2R5KCk7IC8vIG9rPC9wcmU+Cis8cD5idXQgdGhpcyBpcyBzdGlsbCBpbGxlZ2FsOjwvcD4KKzxwcmU+aWYgKGNvbmRpdGlvbikKKyAgICBib2R5KCk7IC8vIGJhZDwvcHJlPgorPGgyPjxhIG5hbWU9ImxpbmVsZW4iPjwvYT5MaW5lIGxlbmd0aDwvaDI+Cis8cD5FYWNoIGxpbmUgb2YgdGV4dCBpbiB5b3VyIGNvZGUgc2hvdWxkIGJlIGF0IG1vc3QgMTAwIGNoYXJhY3RlcnMgbG9uZy48L3A+Cis8cD5UaGVyZSBoYXMgYmVlbiBsb3RzIG9mIGRpc2N1c3Npb24gYWJvdXQgdGhpcyBydWxlIGFuZCB0aGUgZGVjaXNpb24gcmVtYWlucwordGhhdCAxMDAgY2hhcmFjdGVycyBpcyB0aGUgbWF4aW11bS48L3A+Cis8cD5FeGNlcHRpb246IGlmIGEgY29tbWVudCBsaW5lIGNvbnRhaW5zIGFuIGV4YW1wbGUgY29tbWFuZCBvciBhIGxpdGVyYWwgVVJMCitsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycywgdGhhdCBsaW5lIG1heSBiZSBsb25nZXIgdGhhbiAxMDAgY2hhcmFjdGVycyBmb3IKK2Vhc2Ugb2YgY3V0IGFuZCBwYXN0ZS48L3A+Cis8cD5FeGNlcHRpb246IGltcG9ydCBsaW5lcyBjYW4gZ28gb3ZlciB0aGUgbGltaXQgYmVjYXVzZSBodW1hbnMgcmFyZWx5IHNlZQordGhlbS4gVGhpcyBhbHNvIHNpbXBsaWZpZXMgdG9vbCB3cml0aW5nLjwvcD4KKzxoMj48YSBuYW1lPSJhbm5vdGF0aW9ucyI+PC9hPkphdmEgMS41IEFubm90YXRpb25zPC9oMj4KKzxwPkFubm90YXRpb25zIHNob3VsZCBwcmVjZWRlIG90aGVyIG1vZGlmaWVycyBmb3IgdGhlIHNhbWUgbGFuZ3VhZ2UgZWxlbWVudC4KK1NpbXBsZSBtYXJrZXIgYW5ub3RhdGlvbnMgKGUuZy4gJiM2NDtPdmVycmlkZSkgY2FuIGJlIGxpc3RlZCBvbiB0aGUgc2FtZSBsaW5lIHdpdGgKK3RoZSBsYW5ndWFnZSBlbGVtZW50LiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYW5ub3RhdGlvbnMsIG9yIHBhcmFtZXRlcml6ZWQKK2Fubm90YXRpb25zLCB0aGV5IHNob3VsZCBlYWNoIGJlIGxpc3RlZCBvbmUtcGVyLWxpbmUgaW4gYWxwaGFiZXRpY2FsCitvcmRlci48L3A+Cis8cD5BbmRyb2lkIC1zdGFuZGFyZCBwcmFjdGljZXMgZm9yIHRoZSB0aHJlZSBwcmVkZWZpbmVkIGFubm90YXRpb25zIGluIEphdmEKKzEuNSdzIGFyZTo8L3A+Cis8aDM+JiM2NDtEZXByZWNhdGVkPC9oMz4KKzxwPlRoZSAmIzY0O0RlcHJlY2F0ZWQgYW5ub3RhdGlvbiBtdXN0IGJlIHVzZWQgd2hlbmV2ZXIgdGhlIHVzZSBvZiB0aGUgYW5ub3RhdGVkCitlbGVtZW50IGlzIGRpc2NvdXJhZ2VkLiBJZiB5b3UgdXNlIHRoZSAmIzY0O0RlcHJlY2F0ZWQgYW5ub3RhdGlvbiwgeW91IG11c3QgYWxzbworaGF2ZSBhICYjNjQ7ZGVwcmVjYXRlZCBKYXZhZG9jIHRhZyBhbmQgaXQgc2hvdWxkIG5hbWUgYW4gYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9uLgorSW4gYWRkaXRpb24sIHJlbWVtYmVyIHRoYXQgYSAmIzY0O0RlcHJlY2F0ZWQgbWV0aG9kIGlzIDxiPnN0aWxsPC9iPiBzdXBwb3NlZCB0bword29yay48L3A+Cis8cD5JZiB5b3Ugc2VlIG9sZCBjb2RlIHRoYXQgaGFzIGEgJiM2NDtkZXByZWNhdGVkIEphdmFkb2MgdGFnLCBwbGVhc2UgYWRkIHRoZSAmIzY0O0RlcHJlY2F0ZWQgYW5ub3RhdGlvbi48L3A+Cis8aDM+JiM2NDtPdmVycmlkZTwvaDM+Cis8cD5UaGUgJiM2NDtPdmVycmlkZSBhbm5vdGF0aW9uIG11c3QgYmUgdXNlZCB3aGVuZXZlciBhIG1ldGhvZCBvdmVycmlkZXMgdGhlCitkZWNsYXJhdGlvbiBvciBpbXBsZW1lbnRhdGlvbiBmcm9tIGEgc3VwZXItY2xhc3MuPC9wPgorPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgdGhlICYjNjQ7aW5oZXJpdGRvY3MgSmF2YWRvYyB0YWcsIGFuZCBkZXJpdmUgZnJvbSBhCitjbGFzcyAobm90IGFuIGludGVyZmFjZSksIHlvdSBtdXN0IGFsc28gYW5ub3RhdGUgdGhhdCB0aGUgbWV0aG9kICYjNjQ7T3ZlcnJpZGVzCit0aGUgcGFyZW50IGNsYXNzJ3MgbWV0aG9kLjwvcD4KKzxoMz4mIzY0O1N1cHByZXNzV2FybmluZ3M8L2gzPgorPHA+VGhlICYjNjQ7U3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgdW5kZXIgY2lyY3Vtc3RhbmNlcword2hlcmUgaXQgaXMgaW1wb3NzaWJsZSB0byBlbGltaW5hdGUgYSB3YXJuaW5nLiBJZiBhIHdhcm5pbmcgcGFzc2VzIHRoaXMKKyJpbXBvc3NpYmxlIHRvIGVsaW1pbmF0ZSIgdGVzdCwgdGhlICYjNjQ7U3VwcHJlc3NXYXJuaW5ncyBhbm5vdGF0aW9uIDxiPm11c3Q8L2I+IGJlCit1c2VkLCBzbyBhcyB0byBlbnN1cmUgdGhhdCBhbGwgd2FybmluZ3MgcmVmbGVjdCBhY3R1YWwgcHJvYmxlbXMgaW4gdGhlCitjb2RlLjwvcD4KKzxwPldoZW4gYSAmIzY0O1N1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbiBpcyBuZWNlc3NhcnksIGl0IG11c3QgYmUgcHJlZml4ZWQgd2l0aAorYSBUT0RPIGNvbW1lbnQgdGhhdCBleHBsYWlucyB0aGUgImltcG9zc2libGUgdG8gZWxpbWluYXRlIiBjb25kaXRpb24uIFRoaXMKK3dpbGwgbm9ybWFsbHkgaWRlbnRpZnkgYW4gb2ZmZW5kaW5nIGNsYXNzIHRoYXQgaGFzIGFuIGF3a3dhcmQgaW50ZXJmYWNlLiBGb3IKK2V4YW1wbGU6PC9wPgorPHByZT4vLyBUT0RPOiBUaGUgdGhpcmQtcGFydHkgY2xhc3MgY29tLnRoaXJkLnVzZWZ1bC5VdGlsaXR5LnJvdGF0ZSgpIG5lZWRzIGdlbmVyaWNzIAorJiM2NDtTdXBwcmVzc1dhcm5pbmdzKCJnZW5lcmljLWNhc3QiKQorTGlzdCZsdDtTdHJpbmcmZ3Q7IGJsaXggPSBVdGlsaXR5LnJvdGF0ZShibGF4KTs8L3ByZT4KKzxwPldoZW4gYSAmIzY0O1N1cHByZXNzV2FybmluZ3MgYW5ub3RhdGlvbiBpcyByZXF1aXJlZCwgdGhlIGNvZGUgc2hvdWxkIGJlCityZWZhY3RvcmVkIHRvIGlzb2xhdGUgdGhlIHNvZnR3YXJlIGVsZW1lbnRzIHdoZXJlIHRoZSBhbm5vdGF0aW9uIGFwcGxpZXMuPC9wPgorPGgyPjxhIG5hbWU9ImFjcm9ueW1zIj48L2E+QWNyb255bXMgaW4gbmFtZXM8L2gyPgorPHA+VHJlYXQgYWNyb255bXMgYW5kIGFiYnJldmlhdGlvbnMgYXMgd29yZHMuIFRoZSBuYW1lcyBhcmUgbXVjaCBtb3JlIHJlYWRhYmxlOjwvcD4KKzx0YWJsZT48dGJvZHk+Cis8dHI+PHRkPkdvb2Q8L3RkPiA8dGQ+QmFkPC90ZD48L3RyPgorPHRyPjx0ZD5YbWxIdHRwUmVxdWVzdDwvdGQ+IDx0ZD5YTUxIVFRQUmVxdWVzdDwvdGQ+PC90cj4KKzx0cj48dGQ+Z2V0Q3VzdG9tZXJJZDwvdGQ+IDx0ZD5nZXRDdXN0b21lcklEPC90ZD48L3RyPgorPC90Ym9keT48L3RhYmxlPgorPHA+VGhpcyBzdHlsZSBydWxlIGFsc28gYXBwbGllcyB3aGVuIGFuIGFjcm9ueW0gb3IgYWJicmV2aWF0aW9uIGlzIHRoZSBlbnRpcmUKK25hbWU6PC9wPgorPHRhYmxlPjx0Ym9keT4KKzx0cj48dGQ+R29vZDwvdGQ+IDx0ZD5CYWQ8L3RkPjwvdHI+Cis8dHI+PHRkPmNsYXNzIEh0bWw8L3RkPiA8dGQ+Y2xhc3MgSFRNTDwvdGQ+PC90cj4KKzx0cj48dGQ+U3RyaW5nIHVybDs8L3RkPiA8dGQ+U3RyaW5nIFVSTDs8L3RkPjwvdHI+Cis8dHI+PHRkPmxvbmcgaWQ7PC90ZD4gPHRkPmxvbmcgSUQ7PC90ZD48L3RyPgorPC90Ym9keT48L3RhYmxlPgorPHA+Qm90aCB0aGUgSkRLIGFuZCB0aGUgQW5kcm9pZCBjb2RlIGJhc2VzIGFyZSB2ZXJ5IGluY29uc2lzdGVudCB3aXRoIHJlZ2FyZHMKK3RvIGFjcm9ueW1zLCB0aGVyZWZvcmUsIGl0IGlzIHZpcnR1YWxseSBpbXBvc3NpYmxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUKK2NvZGUgYXJvdW5kIHlvdS4gQml0ZSB0aGUgYnVsbGV0LCBhbmQgdHJlYXQgYWNyb255bXMgYXMgd29yZHMuPC9wPgogPHA+Rm9yIGZ1cnRoZXIganVzdGlmaWNhdGlvbnMgb2YgdGhpcyBzdHlsZSBydWxlLCBzZWUgPGk+RWZmZWN0aXZlIEphdmE8L2k+Ci1JdGVtIDM4IGFuZCA8aT5KYXZhIFB1enpsZXJzPC9pPgotTnVtYmVyIDY4LgotPC9wPgotPGgyPjxhPlRPRE8gc3R5bGU8L2E+Ci08L2gyPgotPHA+VXNlIFRPRE8gY29tbWVudHMgZm9yIGNvZGUgdGhhdCBpcyB0ZW1wb3JhcnksIGEgc2hvcnQtdGVybSBzb2x1dGlvbiwgb3IgZ29vZC1lbm91Z2ggYnV0IG5vdCBwZXJmZWN0LgotPC9wPgotPHA+VE9ET3Mgc2hvdWxkIGluY2x1ZGUgdGhlIHN0cmluZyBUT0RPIGluIGFsbCBjYXBzLCBmb2xsb3dlZCBieSBhIGNvbG9uOgotPC9wPgotPHByZT4vLyBUT0RPOiBSZW1vdmUgdGhpcyBjb2RlIGFmdGVyIHRoZSBVcmxUYWJsZTIgaGFzIGJlZW4gY2hlY2tlZCBpbi48YnI+PGJyPi8vIFRPRE86IENoYW5nZSB0aGlzIHRvIHVzZSBhIGZsYWcgaW5zdGVhZCBvZiBhIGNvbnN0YW50LjwvcHJlPgotPHA+SWYgeW91ciBUT0RPIGlzIG9mIHRoZSBmb3JtICJBdCBhIGZ1dHVyZSBkYXRlIGRvIHNvbWV0aGluZyIgbWFrZSBzdXJlIHRoYXQgeW91IGVpdGhlciBpbmNsdWRlIGEgdmVyeSBzcGVjaWZpYyBkYXRlICgiRml4IGJ5IE5vdmVtYmVyIDIwMDUiKSBvciBhIHZlcnkgc3BlY2lmaWMgZXZlbnQgKCJSZW1vdmUgdGhpcyBjb2RlIGFmdGVyIGFsbCBwcm9kdWN0aW9uIG1peGVycyB1bmRlcnN0YW5kIHByb3RvY29sIFY3LiIpLgotPC9wPgotPGgyPgotQ29uc2lzdGVuY3kKLTwvaDI+Ci08cD5PdXIgcGFydGluZyB0aG91Z2h0OiBCRSBDT05TSVNURU5ULiBJZiB5b3UncmUgZWRpdGluZyBjb2RlLCB0YWtlIGEgZmV3IG1pbnV0ZXMgdG8gbG9vayBhdCB0aGUgY29kZSBhcm91bmQgeW91IGFuZCBkZXRlcm1pbmUgaXRzIHN0eWxlLiBJZiB0aGV5IHVzZSBzcGFjZXMgYXJvdW5kIHRoZWlyIGlmIGNsYXVzZXMsIHlvdSBzaG91bGQgdG9vLiBJZiB0aGVpciBjb21tZW50cyBoYXZlIGxpdHRsZSBib3hlcyBvZiBzdGFycyBhcm91bmQgdGhlbSwgbWFrZSB5b3VyIGNvbW1lbnRzIGhhdmUgbGl0dGxlIGJveGVzIG9mIHN0YXJzIGFyb3VuZCB0aGVtIHRvby4KLTwvcD4KLTxwPlRoZSBwb2ludCBvZiBoYXZpbmcgc3R5bGUgZ3VpZGVsaW5lcyBpcyB0byBoYXZlIGEgY29tbW9uIHZvY2FidWxhcnkgb2YgY29kaW5nLCBzbyBwZW9wbGUgY2FuIGNvbmNlbnRyYXRlIG9uIHdoYXQgeW91J3JlIHNheWluZywgcmF0aGVyIHRoYW4gb24gaG93IHlvdSdyZSBzYXlpbmcgaXQuIFdlIHByZXNlbnQgZ2xvYmFsIHN0eWxlIHJ1bGVzIGhlcmUgc28gcGVvcGxlIGtub3cgdGhlIHZvY2FidWxhcnkuIEJ1dCBsb2NhbCBzdHlsZSBpcyBhbHNvIGltcG9ydGFudC4gSWYgY29kZSB5b3UgYWRkIHRvIGEgYSBmaWxlIGxvb2tzIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSBleGlzdGluZyBjb2RlIGFyb3VuZCBpdCwgaXQgdGhyb3dzIHJlYWRlcnMgb3V0IG9mIHRoZWlyIHJoeXRobSB3aGVuIHRoZXkgZ28gdG8gcmVhZCBpdC4gVHJ5IHRvIGF2b2lkIHRoaXMuCi08L3A+Ci08aDI+PGE+TG9nZ2luZzwvYT4KLTwvaDI+Ci08cD5XaGlsZSBsb2dnaW5nIGlzIG5lY2Vzc2FyeSBpdCBoYXMgYSBzaWduaWZpY2FudGx5IG5lZ2F0aXZlIGltcGFjdCBvbiBwZXJmb3JtYW5jZSBhbmQgcXVpY2tseSBsb3NlcyBpdHMgdXNlZnVsbmVzcyBpZiBpdCdzIG5vdCBrZXB0IHJlYXNvbmFibHkgdGVyc2UuIFRoZSBsb2dnaW5nIGZhY2lsaXRpZXMgcHJvdmlkZXMgZml2ZSBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcuIEJlbG93IGFyZSB0aGUgZGlmZmVyZW50IGxldmVscyBhbmQgd2hlbiBhbmQgaG93IHRoZXkgc2hvdWxkIGJlIHVzZWQuCi08L3A+CitJdGVtIDM4IGFuZCA8aT5KYXZhIFB1enpsZXJzPC9pPiBOdW1iZXIgNjguPC9wPgogCi08dWw+PGxpPjxiPkVSUk9SOjwvYj4KLVRoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCB3aGVuIHNvbWV0aGluZyBmYXRhbCBoYXMgaGFwcGVuZWQsIGkuZS4gc29tZXRoaW5nIHRoYXQgd2lsbCBoYXZlIHVzZXItdmlzaWJsZSBjb25zZXF1ZW5jZXMgYW5kIHdvbid0IGJlIHJlY292ZXJhYmxlIHdpdGhvdXQgZXhwbGljaXRseSBkZWxldGluZyBzb21lIGRhdGEsIHVuaW5zdGFsbGluZyBhcHBsaWNhdGlvbnMsIHdpcGluZyB0aGUgZGF0YSBwYXJ0aXRpb25zIG9yIHJlZmxhc2hpbmcgdGhlIGVudGlyZSBwaG9uZSAob3Igd29yc2UpLiBUaGlzIGxldmVsIGlzIGFsd2F5cyBsb2dnZWQuIElzc3VlcyB0aGF0IGp1c3RpZnkgc29tZSBsb2dnaW5nIGF0IHRoZSBFUlJPUiBsZXZlbCBhcmUgdHlwaWNhbGx5IGdvb2QgY2FuZGlkYXRlcyB0byBiZSByZXBvcnRlZCB0byBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHNlcnZlci4KLTwvbGk+Cis8aDI+PGEgbmFtZT0idG9kbyI+PC9hPlRPRE8gc3R5bGU8L2gyPgorPHA+VXNlIFRPRE8gY29tbWVudHMgZm9yIGNvZGUgdGhhdCBpcyB0ZW1wb3JhcnksIGEgc2hvcnQtdGVybSBzb2x1dGlvbiwgb3IKK2dvb2QtZW5vdWdoIGJ1dCBub3QgcGVyZmVjdC48L3A+Cis8cD5UT0RPcyBzaG91bGQgaW5jbHVkZSB0aGUgc3RyaW5nIFRPRE8gaW4gYWxsIGNhcHMsIGZvbGxvd2VkIGJ5IGEgY29sb246PC9wPgorPHByZT4vLyBUT0RPOiBSZW1vdmUgdGhpcyBjb2RlIGFmdGVyIHRoZSBVcmxUYWJsZTIgaGFzIGJlZW4gY2hlY2tlZCBpbi4KKworLy8gVE9ETzogQ2hhbmdlIHRoaXMgdG8gdXNlIGEgZmxhZyBpbnN0ZWFkIG9mIGEgY29uc3RhbnQuPC9wcmU+Cis8cD5JZiB5b3VyIFRPRE8gaXMgb2YgdGhlIGZvcm0gIkF0IGEgZnV0dXJlIGRhdGUgZG8gc29tZXRoaW5nIiBtYWtlIHN1cmUgdGhhdAoreW91IGVpdGhlciBpbmNsdWRlIGEgdmVyeSBzcGVjaWZpYyBkYXRlICgiRml4IGJ5IE5vdmVtYmVyIDIwMDUiKSBvciBhIHZlcnkKK3NwZWNpZmljIGV2ZW50ICgiUmVtb3ZlIHRoaXMgY29kZSBhZnRlciBhbGwgcHJvZHVjdGlvbiBtaXhlcnMgdW5kZXJzdGFuZAorcHJvdG9jb2wgVjcuIikuPC9wPgorCis8aDI+PGEgbmFtZT0iY29uc2lzdGVuY3kiPjwvYT5Db25zaXN0ZW5jeTwvaDI+Cis8cD5PdXIgcGFydGluZyB0aG91Z2h0OiBCRSBDT05TSVNURU5ULiBJZiB5b3UncmUgZWRpdGluZyBjb2RlLCB0YWtlIGEgZmV3CittaW51dGVzIHRvIGxvb2sgYXQgdGhlIGNvZGUgYXJvdW5kIHlvdSBhbmQgZGV0ZXJtaW5lIGl0cyBzdHlsZS4gSWYgdGhleSB1c2UKK3NwYWNlcyBhcm91bmQgdGhlaXIgaWYgY2xhdXNlcywgeW91IHNob3VsZCB0b28uIElmIHRoZWlyIGNvbW1lbnRzIGhhdmUgbGl0dGxlCitib3hlcyBvZiBzdGFycyBhcm91bmQgdGhlbSwgbWFrZSB5b3VyIGNvbW1lbnRzIGhhdmUgbGl0dGxlIGJveGVzIG9mIHN0YXJzCithcm91bmQgdGhlbSB0b28uPC9wPgorPHA+VGhlIHBvaW50IG9mIGhhdmluZyBzdHlsZSBndWlkZWxpbmVzIGlzIHRvIGhhdmUgYSBjb21tb24gdm9jYWJ1bGFyeSBvZgorY29kaW5nLCBzbyBwZW9wbGUgY2FuIGNvbmNlbnRyYXRlIG9uIHdoYXQgeW91J3JlIHNheWluZywgcmF0aGVyIHRoYW4gb24gaG93Cit5b3UncmUgc2F5aW5nIGl0LiBXZSBwcmVzZW50IGdsb2JhbCBzdHlsZSBydWxlcyBoZXJlIHNvIHBlb3BsZSBrbm93IHRoZQordm9jYWJ1bGFyeS4gQnV0IGxvY2FsIHN0eWxlIGlzIGFsc28gaW1wb3J0YW50LiBJZiBjb2RlIHlvdSBhZGQgdG8gYSBhIGZpbGUKK2xvb2tzIGRyYXN0aWNhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSBleGlzdGluZyBjb2RlIGFyb3VuZCBpdCwgaXQgdGhyb3dzCityZWFkZXJzIG91dCBvZiB0aGVpciByaHl0aG0gd2hlbiB0aGV5IGdvIHRvIHJlYWQgaXQuIFRyeSB0byBhdm9pZCB0aGlzLjwvcD4KKworPGgyPjxhIG5hbWU9ImxvZ2dpbmciPjwvYT5Mb2dnaW5nPC9oMj4KKzxwPldoaWxlIGxvZ2dpbmcgaXMgbmVjZXNzYXJ5IGl0IGhhcyBhIHNpZ25pZmljYW50bHkgbmVnYXRpdmUgaW1wYWN0IG9uCitwZXJmb3JtYW5jZSBhbmQgcXVpY2tseSBsb3NlcyBpdHMgdXNlZnVsbmVzcyBpZiBpdCdzIG5vdCBrZXB0IHJlYXNvbmFibHkKK3RlcnNlLiBUaGUgbG9nZ2luZyBmYWNpbGl0aWVzIHByb3ZpZGVzIGZpdmUgZGlmZmVyZW50IGxldmVscyBvZiBsb2dnaW5nLiBCZWxvdworYXJlIHRoZSBkaWZmZXJlbnQgbGV2ZWxzIGFuZCB3aGVuIGFuZCBob3cgdGhleSBzaG91bGQgYmUgdXNlZC48L3A+CisKKzx1bD4KKzxsaT48Yj5FUlJPUjo8L2I+CitUaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgd2hlbiBzb21ldGhpbmcgZmF0YWwgaGFzIGhhcHBlbmVkLAoraS5lLiBzb21ldGhpbmcgdGhhdCB3aWxsIGhhdmUgdXNlci12aXNpYmxlIGNvbnNlcXVlbmNlcyBhbmQgd29uJ3QgYmUKK3JlY292ZXJhYmxlIHdpdGhvdXQgZXhwbGljaXRseSBkZWxldGluZyBzb21lIGRhdGEsIHVuaW5zdGFsbGluZyBhcHBsaWNhdGlvbnMsCit3aXBpbmcgdGhlIGRhdGEgcGFydGl0aW9ucyBvciByZWZsYXNoaW5nIHRoZSBlbnRpcmUgcGhvbmUgKG9yIHdvcnNlKS4gVGhpcworbGV2ZWwgaXMgYWx3YXlzIGxvZ2dlZC4gSXNzdWVzIHRoYXQganVzdGlmeSBzb21lIGxvZ2dpbmcgYXQgdGhlIEVSUk9SIGxldmVsCithcmUgdHlwaWNhbGx5IGdvb2QgY2FuZGlkYXRlcyB0byBiZSByZXBvcnRlZCB0byBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nCitzZXJ2ZXIuPC9saT4KIDxsaT48Yj5XQVJOSU5HOjwvYj4KLVRoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgdXNlZCB3aGVuIHNvbWV0aGluZyBzZXJpb3VzIGFuZCB1bmV4cGVjdGVkIGhhcHBlbmVkLCBpLmUuIHNvbWV0aGluZyB0aGF0IHdpbGwgaGF2ZSB1c2VyLXZpc2libGUgY29uc2VxdWVuY2VzIGJ1dCBpcyBsaWtlbHkgdG8gYmUgcmVjb3ZlcmFibGUgd2l0aG91dCBkYXRhIGxvc3MgYnkgcGVyZm9ybWluZyBzb21lIGV4cGxpY2l0IGFjdGlvbiwgcmFuZ2luZyBmcm9tIHdhaXRpbmcgb3IgcmVzdGFydGluZyBhbiBhcHAgYWxsIHRoZSB3YXkgdG8gcmUtZG93bmxvYWRpbmcgYSBuZXcgdmVyc2lvbiBvZiBhbiBhcHBsaWNhdGlvbiBvciByZWJvb3RpbmcgdGhlIGRldmljZS4gVGhpcyBsZXZlbCBpcyBhbHdheXMgbG9nZ2VkLiBJc3N1ZXMgdGhhdCBqdXN0aWZ5IHNvbWUgbG9nZ2luZyBhdCB0aGUgV0FSTklORyBsZXZlbCBtaWdodCBhbHNvIGJlIGNvbnNpZGVyZWQgZm9yIHJlcG9ydGluZyB0byBhIHN0YXRpc3RpY3MtZ2F0aGVyaW5nIHNlcnZlci4KLTwvbGk+CitUaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIHVzZWQgd2hlbiBzb21ldGhpbmcgc2VyaW91cyBhbmQgdW5leHBlY3RlZAoraGFwcGVuZWQsIGkuZS4gc29tZXRoaW5nIHRoYXQgd2lsbCBoYXZlIHVzZXItdmlzaWJsZSBjb25zZXF1ZW5jZXMgYnV0IGlzCitsaWtlbHkgdG8gYmUgcmVjb3ZlcmFibGUgd2l0aG91dCBkYXRhIGxvc3MgYnkgcGVyZm9ybWluZyBzb21lIGV4cGxpY2l0IGFjdGlvbiwKK3JhbmdpbmcgZnJvbSB3YWl0aW5nIG9yIHJlc3RhcnRpbmcgYW4gYXBwIGFsbCB0aGUgd2F5IHRvIHJlLWRvd25sb2FkaW5nIGEgbmV3Cit2ZXJzaW9uIG9mIGFuIGFwcGxpY2F0aW9uIG9yIHJlYm9vdGluZyB0aGUgZGV2aWNlLiBUaGlzIGxldmVsIGlzIGFsd2F5cworbG9nZ2VkLiBJc3N1ZXMgdGhhdCBqdXN0aWZ5IHNvbWUgbG9nZ2luZyBhdCB0aGUgV0FSTklORyBsZXZlbCBtaWdodCBhbHNvIGJlCitjb25zaWRlcmVkIGZvciByZXBvcnRpbmcgdG8gYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBzZXJ2ZXIuPC9saT4KIDxsaT48Yj5JTkZPUk1BVElWRTo8L2I+Ci1UaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIHVzZWQgYmUgdG8gbm90ZSB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyB0byBtb3N0IHBlb3BsZSBoYXBwZW5lZCwgaS5lLiB3aGVuIGEgc2l0dWF0aW9uIGlzIGRldGVjdGVkIHRoYXQgaXMgbGlrZWx5IHRvIGhhdmUgd2lkZXNwcmVhZCBpbXBhY3QsIHRob3VnaCBpc24ndCBuZWNlc3NhcmlseSBhbiBlcnJvci4gU3VjaCBhIGNvbmRpdGlvbiBzaG91bGQgb25seSBiZSBsb2dnZWQgYnkgYSBtb2R1bGUgdGhhdCByZWFzb25hYmx5IGJlbGlldmVzIHRoYXQgaXQgaXMgdGhlIG1vc3QgYXV0aG9yaXRhdGl2ZSBpbiB0aGF0IGRvbWFpbiAodG8gYXZvaWQgZHVwbGljYXRlIGxvZ2dpbmcgYnkgbm9uLWF1dGhvcml0YXRpdmUgY29tcG9uZW50cykuIFRoaXMgbGV2ZWwgaXMgYWx3YXlzIGxvZ2dlZC4KLTwvbGk+CitUaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIHVzZWQgYmUgdG8gbm90ZSB0aGF0IHNvbWV0aGluZyBpbnRlcmVzdGluZyB0bworbW9zdCBwZW9wbGUgaGFwcGVuZWQsIGkuZS4gd2hlbiBhIHNpdHVhdGlvbiBpcyBkZXRlY3RlZCB0aGF0IGlzIGxpa2VseSB0byBoYXZlCit3aWRlc3ByZWFkIGltcGFjdCwgdGhvdWdoIGlzbid0IG5lY2Vzc2FyaWx5IGFuIGVycm9yLiBTdWNoIGEgY29uZGl0aW9uIHNob3VsZAorb25seSBiZSBsb2dnZWQgYnkgYSBtb2R1bGUgdGhhdCByZWFzb25hYmx5IGJlbGlldmVzIHRoYXQgaXQgaXMgdGhlIG1vc3QKK2F1dGhvcml0YXRpdmUgaW4gdGhhdCBkb21haW4gKHRvIGF2b2lkIGR1cGxpY2F0ZSBsb2dnaW5nIGJ5IG5vbi1hdXRob3JpdGF0aXZlCitjb21wb25lbnRzKS4gVGhpcyBsZXZlbCBpcyBhbHdheXMgbG9nZ2VkLjwvbGk+CiA8bGk+PGI+REVCVUc6PC9iPgotVGhpcyBsZXZlbCBvZiBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIHRvIGZ1cnRoZXIgbm90ZSB3aGF0IGlzIGhhcHBlbmluZyBvbiB0aGUgZGV2aWNlIHRoYXQgY291bGQgYmUgcmVsZXZhbnQgdG8gaW52ZXN0aWdhdGUgYW5kIGRlYnVnIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLiBZb3Ugc2hvdWxkIGxvZyBvbmx5IHdoYXQgaXMgbmVlZGVkIHRvIGdhdGhlciBlbm91Z2ggaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBpcyBnb2luZyBvbiBhYm91dCB5b3VyIGNvbXBvbmVudC4gSWYgeW91ciBkZWJ1ZyBsb2dzIGFyZSBkb21pbmF0aW5nIHRoZSBsb2cgdGhlbiB5b3UgcHJvYmFibHkgc2hvdWxkIGJlIHVzaW5nIHZlcmJvc2UgbG9nZ2luZy4gVGhpcyBsZXZlbCB3aWxsIGJlIGxvZ2dlZCwgZXZlbiBvbiByZWxlYXNlIGJ1aWxkcywgYW5kIGlzIHJlcXVpcmVkIHRvIGJlIHN1cnJvdW5kZWQgYnkgYW4gaWYgKExPQ0FMX0xPRykgb3IgaWYgKExPQ0FMX0xPR0QpIGJsb2NrLCB3aGVyZSBMT0NBTF9MT0dbRF0gaXMgZGVmaW5lZCBpbiB5b3VyIGNsYXNzIG9yIHN1YmNvbXBvbmVudCwgc28gdGhhdCB0aGVyZSBjYW4gZXhpc3QgYSBwb3NzaWJpbGl0eSB0byBkaXNhYmxlIGFsbCBzdWNoIGxvZ2dpbmcuIFRoZXJlIG11c3QgdGhlcmVmb3JlIGJlIG5vIGFjdGl2ZSBsb2dpYyBpbiBhbiBpZiAoTE9DQUxfTE9HKSBibG9jay4gQWxsIHRoZSBzdHJpbmcgYnVpbGRpbmcgZm9yIHRoZSBsb2cgYWxzbyBuZWVkcyB0byBiZSBwbGFjZWQgaW5zaWRlIHRoZSBpZiAoTE9DQUxfTE9HKSBibG9jay4gVGhlIGxvZ2dpbmcgY2FsbCBzaG91bGQgbm90IGJlIHJlLWZhY3RvcmVkIG91dCBpbnRvIGEgbWV0aG9kIGNhbGwgaWYgaXQgaXMgZ29pbmcgdG8gY2F1c2UgdGhlIHN0cmluZyBidWlsZGluZyB0byB0YWtlIHBsYWNlIG91dHNpZGUgb2YgdGhlIGlmIChMT0NBTF9MT0cpIGJsb2NrLiBUaGVyZSBpcyBzb21lIGNvZGUgdGhhdCBzdGlsbCBzYXlzIGlmIChsb2NhbExPR1YpLiBUaGlzIGlzIGNvbnNpZGVyZWQgYWNjZXB0YWJsZSBhcyB3ZWxsLCBhbHRob3VnaCB0aGUgbmFtZSBpcyBub25zdGFuZGFyZC4KLTwvbGk+CitUaGlzIGxldmVsIG9mIGxvZ2dpbmcgc2hvdWxkIGJlIHVzZWQgdG8gZnVydGhlciBub3RlIHdoYXQgaXMgaGFwcGVuaW5nIG9uIHRoZQorZGV2aWNlIHRoYXQgY291bGQgYmUgcmVsZXZhbnQgdG8gaW52ZXN0aWdhdGUgYW5kIGRlYnVnIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLgorWW91IHNob3VsZCBsb2cgb25seSB3aGF0IGlzIG5lZWRlZCB0byBnYXRoZXIgZW5vdWdoIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgaXMKK2dvaW5nIG9uIGFib3V0IHlvdXIgY29tcG9uZW50LiBJZiB5b3VyIGRlYnVnIGxvZ3MgYXJlIGRvbWluYXRpbmcgdGhlIGxvZyB0aGVuCit5b3UgcHJvYmFibHkgc2hvdWxkIGJlIHVzaW5nIHZlcmJvc2UgbG9nZ2luZy4gVGhpcyBsZXZlbCB3aWxsIGJlIGxvZ2dlZCwgZXZlbgorb24gcmVsZWFzZSBidWlsZHMsIGFuZCBpcyByZXF1aXJlZCB0byBiZSBzdXJyb3VuZGVkIGJ5IGFuIGlmIChMT0NBTF9MT0cpIG9yIGlmCisoTE9DQUxfTE9HRCkgYmxvY2ssIHdoZXJlIExPQ0FMX0xPR1tEXSBpcyBkZWZpbmVkIGluIHlvdXIgY2xhc3Mgb3IKK3N1YmNvbXBvbmVudCwgc28gdGhhdCB0aGVyZSBjYW4gZXhpc3QgYSBwb3NzaWJpbGl0eSB0byBkaXNhYmxlIGFsbCBzdWNoCitsb2dnaW5nLiBUaGVyZSBtdXN0IHRoZXJlZm9yZSBiZSBubyBhY3RpdmUgbG9naWMgaW4gYW4gaWYgKExPQ0FMX0xPRykgYmxvY2suCitBbGwgdGhlIHN0cmluZyBidWlsZGluZyBmb3IgdGhlIGxvZyBhbHNvIG5lZWRzIHRvIGJlIHBsYWNlZCBpbnNpZGUgdGhlIGlmCisoTE9DQUxfTE9HKSBibG9jay4gVGhlIGxvZ2dpbmcgY2FsbCBzaG91bGQgbm90IGJlIHJlLWZhY3RvcmVkIG91dCBpbnRvIGEKK21ldGhvZCBjYWxsIGlmIGl0IGlzIGdvaW5nIHRvIGNhdXNlIHRoZSBzdHJpbmcgYnVpbGRpbmcgdG8gdGFrZSBwbGFjZSBvdXRzaWRlCitvZiB0aGUgaWYgKExPQ0FMX0xPRykgYmxvY2suIFRoZXJlIGlzIHNvbWUgY29kZSB0aGF0IHN0aWxsIHNheXMgaWYKKyhsb2NhbExPR1YpLiBUaGlzIGlzIGNvbnNpZGVyZWQgYWNjZXB0YWJsZSBhcyB3ZWxsLCBhbHRob3VnaCB0aGUgbmFtZSBpcworbm9uc3RhbmRhcmQuPC9saT4KIDxsaT48Yj5WRVJCT1NFOjwvYj4KLVRoaXMgbGV2ZWwgb2YgbG9nZ2luZyBzaG91bGQgYmUgdXNlZCBmb3IgZXZlcnl0aGluZyBlbHNlLiBUaGlzIGxldmVsIHdpbGwgb25seSBiZSBsb2dnZWQgb24gZGVidWcgYnVpbGRzIGFuZCBzaG91bGQgYmUgc3Vycm91bmRlZCBieSBpZiAoTE9DQUxfTE9HVikgYmxvY2sgKG9yIGVxdWl2YWxlbnQpIHNvIHRoYXQgaXQgY2FuIGJlIGNvbXBpbGVkIG91dCBieSBkZWZhdWx0LiBBbnkgc3RyaW5nIGJ1aWxkaW5nIHdpbGwgYmUgc3RyaXBwZWQgb3V0IG9mIHJlbGVhc2UgYnVpbGRzIGFuZCBuZWVkcyB0byBhcHBlYXIgaW5zaWRlIHRoZSBpZiAoTE9DQUxfTE9HVikgYmxvY2suCi08L2xpPgorVGhpcyBsZXZlbCBvZiBsb2dnaW5nIHNob3VsZCBiZSB1c2VkIGZvciBldmVyeXRoaW5nIGVsc2UuIFRoaXMgbGV2ZWwgd2lsbCBvbmx5CitiZSBsb2dnZWQgb24gZGVidWcgYnVpbGRzIGFuZCBzaG91bGQgYmUgc3Vycm91bmRlZCBieSBpZiAoTE9DQUxfTE9HVikgYmxvY2sKKyhvciBlcXVpdmFsZW50KSBzbyB0aGF0IGl0IGNhbiBiZSBjb21waWxlZCBvdXQgYnkgZGVmYXVsdC4gQW55IHN0cmluZyBidWlsZGluZword2lsbCBiZSBzdHJpcHBlZCBvdXQgb2YgcmVsZWFzZSBidWlsZHMgYW5kIG5lZWRzIHRvIGFwcGVhciBpbnNpZGUgdGhlIGlmCisoTE9DQUxfTE9HVikgYmxvY2suPC9saT4KIDwvdWw+Ci08cD48aT5Ob3RlOjwvaT4KLVdpdGhpbiBhIGdpdmVuIG1vZHVsZSwgb3RoZXIgdGhhbiBhdCB0aGUgVkVSQk9TRSBsZXZlbCwgYW4gZXJyb3Igc2hvdWxkIG9ubHkgYmUgcmVwb3J0ZWQgb25jZSBpZiBwb3NzaWJsZTogd2l0aGluIGEgc2luZ2xlIGNoYWluIG9mIGZ1bmN0aW9uIGNhbGxzIHdpdGhpbiBhIG1vZHVsZSwgb25seSB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIGVycm9yLCBhbmQgY2FsbGVycyBpbiB0aGUgc2FtZSBtb2R1bGUgc2hvdWxkIG9ubHkgYWRkIHNvbWUgbG9nZ2luZyBpZiB0aGF0IHNpZ25pZmljYW50bHkgaGVscHMgdG8gaXNvbGF0ZSB0aGUgaXNzdWUuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUluIGEgY2hhaW4gb2YgbW9kdWxlcywgb3RoZXIgdGhhbiBhdCB0aGUgVkVSQk9TRSBsZXZlbCwgd2hlbiBhIGxvd2VyLWxldmVsIG1vZHVsZSBkZXRlY3RzIGludmFsaWQgZGF0YSBjb21pbmcgZnJvbSBhIGhpZ2hlci1sZXZlbCBtb2R1bGUsIHRoZSBsb3dlci1sZXZlbCBtb2R1bGUgc2hvdWxkIG9ubHkgbG9nIHRoaXMgc2l0dWF0aW9uIHRvIHRoZSBERUJVRyBsb2csIGFuZCBvbmx5IGlmIGxvZ2dpbmcgcHJvdmlkZXMgaW5mb3JtYXRpb24gdGhhdCBpcyBub3Qgb3RoZXJ3aXNlIGF2YWlsYWJsZSB0byB0aGUgY2FsbGVyLiBTcGVjaWZpY2FsbHksIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9nIHNpdHVhdGlvbnMgd2hlcmUgYW4gZXhjZXB0aW9uIGlzIHRocm93biAodGhlIGV4Y2VwdGlvbiBzaG91bGQgY29udGFpbiBhbGwgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uKSwgb3Igd2hlcmUgdGhlIG9ubHkgaW5mb3JtYXRpb24gYmVpbmcgbG9nZ2VkIGlzIGNvbnRhaW5lZCBpbiBhbiBlcnJvciBjb2RlLiBUaGlzIGlzIGVzcGVjaWFsbHkgaW1wb3J0YW50IGluIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBmcmFtZXdvcmsgYW5kIGFwcGxpY2F0aW9ucywgYW5kIGNvbmRpdGlvbnMgY2F1c2VkIGJ5IHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBwcm9wZXJseSBoYW5kbGVkIGJ5IHRoZSBmcmFtZXdvcmsgc2hvdWxkIG5vdCB0cmlnZ2VyIGxvZ2dpbmcgaGlnaGVyIHRoYW4gdGhlIERFQlVHIGxldmVsLiBUaGUgb25seSBzaXR1YXRpb25zIHRoYXQgc2hvdWxkIHRyaWdnZXIgbG9nZ2luZyBhdCB0aGUgSU5GT1JNQVRJVkUgbGV2ZWwgb3IgaGlnaGVyIGlzIHdoZW4gYSBtb2R1bGUgb3IgYXBwbGljYXRpb24gZGV0ZWN0cyBhbiBlcnJvciBhdCBpdHMgb3duIGxldmVsIG9yIGNvbWluZyBmcm9tIGEgbG93ZXIgbGV2ZWwuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLVdoZW4gYSBjb25kaXRpb24gdGhhdCB3b3VsZCBub3JtYWxseSBqdXN0aWZ5IHNvbWUgbG9nZ2luZyBpcyBsaWtlbHkgdG8gb2NjdXIgbWFueSB0aW1lcywgaXQgY2FuIGJlIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCBzb21lIHJhdGUtbGltaXRpbmcgbWVjaGFuaXNtIHRvIHByZXZlbnQgb3ZlcmZsb3dpbmcgdGhlIGxvZ3Mgd2l0aCBtYW55IGR1cGxpY2F0ZSBjb3BpZXMgb2YgdGhlIHNhbWUgKG9yIHZlcnkgc2ltaWxhcikgaW5mb3JtYXRpb24uCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUxvc3NlcyBvZiBuZXR3b3JrIGNvbm5lY3Rpdml0eSBhcmUgY29uc2lkZXJlZCBjb21tb24gYW5kIGZ1bGx5IGV4cGVjdGVkIGFuZCBzaG91bGQgbm90IGJlIGxvZ2dlZCBncmF0dWl0b3VzbHkuIEEgbG9zcyBvZiBuZXR3b3JrIGNvbm5lY3Rpdml0eSB0aGF0IGhhcyBjb25zZXF1ZW5jZXMgd2l0aGluIGFuIGFwcCBzaG91bGQgYmUgbG9nZ2VkIGF0IHRoZSBERUJVRyBvciBWRVJCT1NFIGxldmVsIChkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgY29uc2VxdWVuY2VzIGFyZSBzZXJpb3VzIGVub3VnaCBhbmQgdW5leHBlY3RlZCBlbm91Z2ggdG8gYmUgbG9nZ2VkIGluIGEgcmVsZWFzZSBidWlsZCkuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUEgZnVsbCBmaWxlc3lzdGVtIG9uIGEgZmlsZXN5c3RlbSB0aGF0IGlzIGFjY2Vlc3NpYmxlIHRvIG9yIG9uIGJlaGFsZiBvZiB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCBiZSBsb2dnZWQgYXQgYSBsZXZlbCBoaWdoZXIgdGhhbiBJTkZPUk1BVElWRS4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotSW52YWxpZCBkYXRhIGNvbWluZyBmcm9tIGFueSB1bnRydXN0ZWQgc291cmNlIChpbmNsdWRpbmcgYW55IGZpbGUgb24gc2hhcmVkIHN0b3JhZ2UsIG9yIGRhdGEgY29taW5nIHRocm91Z2gganVzdCBhYm91dCBhbnkgbmV0d29yayBjb25uZWN0aW9ucykgaXMgY29uc2lkZXJlZCBleHBlY3RlZCBhbmQgc2hvdWxkIG5vdCB0cmlnZ2VyIGFueSBsb2dnaW5nIGF0IGEgbGV2ZWwgaGlnaGVyIHRoZW4gREVCVUcgd2hlbiBpdCdzIGRldGVjdGVkIHRvIGJlIGludmFsaWQgKGFuZCBldmVuIHRoZW4gbG9nZ2luZyBzaG91bGQgYmUgYXMgbGltaXRlZCBhcyBwb3NzaWJsZSkuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUtlZXAgaW4gbWluZCB0aGF0IHRoZSAnKycgb3BlcmF0b3IsIHdoZW4gdXNlZCBvbiBTdHJpbmdzLCBpbXBsaWNpdGx5IGNyZWF0ZXMgYSBTdHJpbmdCdWlsZGVyIHdpdGggdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgKDE2IGNoYXJhY3RlcnMpIGFuZCBwb3RlbnRpYWxseSBxdWl0ZSBhIGZldyBvdGhlciB0ZW1wb3JhcnkgU3RyaW5nIG9iamVjdHMsIGkuZS4gdGhhdCBleHBsaWNpdGx5IGNyZWF0aW5nIFN0cmluZ0J1aWxkZXJzIGlzbid0IG1vcmUgZXhwZW5zaXZlIHRoYW4gcmVseWluZyBvbiB0aGUgZGVmYXVsdCAnKycgb3BlcmF0b3IgKGFuZCBjYW4gYmUgYSBsb3QgbW9yZSBlZmZpY2llbnQgaW4gZmFjdCkuIEFsc28ga2VlcCBpbiBtaW5kIHRoYXQgY29kZSB0aGF0IGNhbGxzIExvZy52KCkgaXMgY29tcGlsZWQgYW5kIGV4ZWN1dGVkIG9uIHJlbGVhc2UgYnVpbGRzLCBpbmNsdWRpbmcgYnVpbGRpbmcgdGhlIHN0cmluZ3MsIGV2ZW4gaWYgdGhlIGxvZ3MgYXJlbid0IGJlaW5nIHJlYWQuCi08L3A+Ci08cD48aT5Ob3RlOjwvaT4KLUFueSBsb2dnaW5nIHRoYXQgaXMgbWVhbnQgdG8gYmUgcmVhZCBieSBvdGhlciBwZW9wbGUgYW5kIHRvIGJlIGF2YWlsYWJsZSBpbiByZWxlYXNlIGJ1aWxkcyBzaG91bGQgYmUgdGVyc2Ugd2l0aG91dCBiZWluZyBjcnlwdGljLCBhbmQgc2hvdWxkIGJlIHJlYXNvbmFibHkgdW5kZXJzdGFuZGFibGUuIFRoaXMgaW5jbHVkZXMgYWxsIGxvZ2dpbmcgdXAgdG8gdGhlIERFQlVHIGxldmVsLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1XaGVuIHBvc3NpYmxlLCBsb2dnaW5nIHNob3VsZCBiZSBrZXB0IG9uIGEgc2luZ2xlIGxpbmUgaWYgaXQgbWFrZXMgc2Vuc2UuIExpbmUgbGVuZ3RocyB1cCB0byA4MCBvciAxMDAgY2hhcmFjdGVycyBhcmUgcGVyZmVjdGx5IGFjY2VwdGFibGUsIHdoaWxlIGxlbmd0aHMgbG9uZ2VyIHRoYW4gYWJvdXQgMTMwIG9yIDE2MCBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgdGFnKSBzaG91bGQgYmUgYXZvaWRlZCBpZiBwb3NzaWJsZS4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotTG9nZ2luZyB0aGF0IHJlcG9ydHMgc3VjY2Vzc2VzIHNob3VsZCBuZXZlciBiZSB1c2VkIGF0IGxldmVscyBoaWdoZXIgdGhhbiBWRVJCT1NFLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1UZW1wb3JhcnkgbG9nZ2luZyB0aGF0IGlzIHVzZWQgdG8gZGlhZ25vc2UgYW4gaXNzdWUgdGhhdCdzIGhhcmQgdG8gcmVwcm9kdWNlIHNob3VsZCBiZSBrZXB0IGF0IHRoZSBERUJVRyBvciBWRVJCT1NFIGxldmVsLCBhbmQgc2hvdWxkIGJlIGVuY2xvc2VkIGJ5IGlmIGJsb2NrcyB0aGF0IGFsbG93IHRvIGRpc2FibGUgaXQgZW50aXJlbHkgYXQgY29tcGlsZS10aW1lLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci1CZSBjYXJlZnVsIGFib3V0IHNlY3VyaXR5IGxlYWtzIHRocm91Z2ggdGhlIGxvZy4gUHJpdmF0ZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgYXZvaWRlZC4gSW5mb3JtYXRpb24gYWJvdXQgcHJvdGVjdGVkIGNvbnRlbnQgbXVzdCBkZWZpbml0ZWx5IGJlIGF2b2lkZWQuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgd2hlbiB3cml0aW5nIGZyYW1ld29yayBjb2RlIGFzIGl0J3Mgbm90IGVhc3kgdG8ga25vdyBpbiBhZHZhbmNlIHdoYXQgd2lsbCBhbmQgd2lsbCBub3QgYmUgcHJpdmF0ZSBpbmZvcm1hdGlvbiBvciBwcm90ZWN0ZWQgY29udGVudC4KLTwvcD4KLTxwPjxpPk5vdGU6PC9pPgotU3lzdGVtLm91dC5wcmludGxuKCkgKG9yIHByaW50ZigpIGZvciBuYXRpdmUgY29kZSkgc2hvdWxkIG5ldmVyIGJlIHVzZWQuIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgZ2V0IHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsLCBzbyB5b3VyIHByaW50IHN0YXRlbWVudHMgd2lsbCBoYXZlIG5vIHZpc2libGUgZWZmZWN0cy4gSG93ZXZlciwgYWxsIHRoZSBzdHJpbmcgYnVpbGRpbmcgdGhhdCBoYXBwZW5zIGZvciB0aGVzZSBjYWxscyBzdGlsbCBnZXRzIGV4ZWN1dGVkLgotPC9wPgotPHA+PGk+Tm90ZTo8L2k+Ci08Yj5UaGUgZ29sZGVuIHJ1bGUgb2YgbG9nZ2luZyBpcyB0aGF0IHlvdXIgbG9ncyBtYXkgbm90IHVubmVjZXNzYXJpbHkgcHVzaCBvdGhlciBsb2dzIG91dCBvZiB0aGUgYnVmZmVyLCBqdXN0IGFzIG90aGVycyBtYXkgbm90IHB1c2ggb3V0IHlvdXJzLjwvYj4KLTwvcD4KLTxoMj4KLUphdmF0ZXN0cyBTdHlsZSBSdWxlcwotPC9oMj4KKzxwPjxpPk5vdGU6PC9pPiBXaXRoaW4gYSBnaXZlbiBtb2R1bGUsIG90aGVyIHRoYW4gYXQgdGhlIFZFUkJPU0UgbGV2ZWwsIGFuCitlcnJvciBzaG91bGQgb25seSBiZSByZXBvcnRlZCBvbmNlIGlmIHBvc3NpYmxlOiB3aXRoaW4gYSBzaW5nbGUgY2hhaW4gb2YKK2Z1bmN0aW9uIGNhbGxzIHdpdGhpbiBhIG1vZHVsZSwgb25seSB0aGUgaW5uZXJtb3N0IGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlCitlcnJvciwgYW5kIGNhbGxlcnMgaW4gdGhlIHNhbWUgbW9kdWxlIHNob3VsZCBvbmx5IGFkZCBzb21lIGxvZ2dpbmcgaWYgdGhhdAorc2lnbmlmaWNhbnRseSBoZWxwcyB0byBpc29sYXRlIHRoZSBpc3N1ZS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gSW4gYSBjaGFpbiBvZiBtb2R1bGVzLCBvdGhlciB0aGFuIGF0IHRoZSBWRVJCT1NFIGxldmVsLCB3aGVuIGEKK2xvd2VyLWxldmVsIG1vZHVsZSBkZXRlY3RzIGludmFsaWQgZGF0YSBjb21pbmcgZnJvbSBhIGhpZ2hlci1sZXZlbCBtb2R1bGUsIHRoZQorbG93ZXItbGV2ZWwgbW9kdWxlIHNob3VsZCBvbmx5IGxvZyB0aGlzIHNpdHVhdGlvbiB0byB0aGUgREVCVUcgbG9nLCBhbmQgb25seQoraWYgbG9nZ2luZyBwcm92aWRlcyBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBvdGhlcndpc2UgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCitTcGVjaWZpY2FsbHksIHRoZXJlIGlzIG5vIG5lZWQgdG8gbG9nIHNpdHVhdGlvbnMgd2hlcmUgYW4gZXhjZXB0aW9uIGlzIHRocm93bgorKHRoZSBleGNlcHRpb24gc2hvdWxkIGNvbnRhaW4gYWxsIHRoZSByZWxldmFudCBpbmZvcm1hdGlvbiksIG9yIHdoZXJlIHRoZSBvbmx5CitpbmZvcm1hdGlvbiBiZWluZyBsb2dnZWQgaXMgY29udGFpbmVkIGluIGFuIGVycm9yIGNvZGUuIFRoaXMgaXMgZXNwZWNpYWxseQoraW1wb3J0YW50IGluIHRoZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZSBmcmFtZXdvcmsgYW5kIGFwcGxpY2F0aW9ucywgYW5kCitjb25kaXRpb25zIGNhdXNlZCBieSB0aGlyZC1wYXJ0eSBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgcHJvcGVybHkgaGFuZGxlZCBieSB0aGUKK2ZyYW1ld29yayBzaG91bGQgbm90IHRyaWdnZXIgbG9nZ2luZyBoaWdoZXIgdGhhbiB0aGUgREVCVUcgbGV2ZWwuIFRoZSBvbmx5CitzaXR1YXRpb25zIHRoYXQgc2hvdWxkIHRyaWdnZXIgbG9nZ2luZyBhdCB0aGUgSU5GT1JNQVRJVkUgbGV2ZWwgb3IgaGlnaGVyIGlzCit3aGVuIGEgbW9kdWxlIG9yIGFwcGxpY2F0aW9uIGRldGVjdHMgYW4gZXJyb3IgYXQgaXRzIG93biBsZXZlbCBvciBjb21pbmcgZnJvbQorYSBsb3dlciBsZXZlbC48L3A+Cis8cD48aT5Ob3RlOjwvaT4gV2hlbiBhIGNvbmRpdGlvbiB0aGF0IHdvdWxkIG5vcm1hbGx5IGp1c3RpZnkgc29tZSBsb2dnaW5nIGlzCitsaWtlbHkgdG8gb2NjdXIgbWFueSB0aW1lcywgaXQgY2FuIGJlIGEgZ29vZCBpZGVhIHRvIGltcGxlbWVudCBzb21lCityYXRlLWxpbWl0aW5nIG1lY2hhbmlzbSB0byBwcmV2ZW50IG92ZXJmbG93aW5nIHRoZSBsb2dzIHdpdGggbWFueSBkdXBsaWNhdGUKK2NvcGllcyBvZiB0aGUgc2FtZSAob3IgdmVyeSBzaW1pbGFyKSBpbmZvcm1hdGlvbi48L3A+Cis8cD48aT5Ob3RlOjwvaT4gTG9zc2VzIG9mIG5ldHdvcmsgY29ubmVjdGl2aXR5IGFyZSBjb25zaWRlcmVkIGNvbW1vbiBhbmQgZnVsbHkKK2V4cGVjdGVkIGFuZCBzaG91bGQgbm90IGJlIGxvZ2dlZCBncmF0dWl0b3VzbHkuIEEgbG9zcyBvZiBuZXR3b3JrIGNvbm5lY3Rpdml0eQordGhhdCBoYXMgY29uc2VxdWVuY2VzIHdpdGhpbiBhbiBhcHAgc2hvdWxkIGJlIGxvZ2dlZCBhdCB0aGUgREVCVUcgb3IgVkVSQk9TRQorbGV2ZWwgKGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb25zZXF1ZW5jZXMgYXJlIHNlcmlvdXMgZW5vdWdoIGFuZCB1bmV4cGVjdGVkCitlbm91Z2ggdG8gYmUgbG9nZ2VkIGluIGEgcmVsZWFzZSBidWlsZCkuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IEEgZnVsbCBmaWxlc3lzdGVtIG9uIGEgZmlsZXN5c3RlbSB0aGF0IGlzIGFjY2Vlc3NpYmxlIHRvIG9yIG9uCitiZWhhbGYgb2YgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIHNob3VsZCBub3QgYmUgbG9nZ2VkIGF0IGEgbGV2ZWwgaGlnaGVyIHRoYW4KK0lORk9STUFUSVZFLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBJbnZhbGlkIGRhdGEgY29taW5nIGZyb20gYW55IHVudHJ1c3RlZCBzb3VyY2UgKGluY2x1ZGluZyBhbnkKK2ZpbGUgb24gc2hhcmVkIHN0b3JhZ2UsIG9yIGRhdGEgY29taW5nIHRocm91Z2gganVzdCBhYm91dCBhbnkgbmV0d29yaworY29ubmVjdGlvbnMpIGlzIGNvbnNpZGVyZWQgZXhwZWN0ZWQgYW5kIHNob3VsZCBub3QgdHJpZ2dlciBhbnkgbG9nZ2luZyBhdCBhCitsZXZlbCBoaWdoZXIgdGhlbiBERUJVRyB3aGVuIGl0J3MgZGV0ZWN0ZWQgdG8gYmUgaW52YWxpZCAoYW5kIGV2ZW4gdGhlbgorbG9nZ2luZyBzaG91bGQgYmUgYXMgbGltaXRlZCBhcyBwb3NzaWJsZSkuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IEtlZXAgaW4gbWluZCB0aGF0IHRoZSAnKycgb3BlcmF0b3IsIHdoZW4gdXNlZCBvbiBTdHJpbmdzLAoraW1wbGljaXRseSBjcmVhdGVzIGEgU3RyaW5nQnVpbGRlciB3aXRoIHRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplICgxNgorY2hhcmFjdGVycykgYW5kIHBvdGVudGlhbGx5IHF1aXRlIGEgZmV3IG90aGVyIHRlbXBvcmFyeSBTdHJpbmcgb2JqZWN0cywgaS5lLgordGhhdCBleHBsaWNpdGx5IGNyZWF0aW5nIFN0cmluZ0J1aWxkZXJzIGlzbid0IG1vcmUgZXhwZW5zaXZlIHRoYW4gcmVseWluZyBvbgordGhlIGRlZmF1bHQgJysnIG9wZXJhdG9yIChhbmQgY2FuIGJlIGEgbG90IG1vcmUgZWZmaWNpZW50IGluIGZhY3QpLiBBbHNvIGtlZXAKK2luIG1pbmQgdGhhdCBjb2RlIHRoYXQgY2FsbHMgTG9nLnYoKSBpcyBjb21waWxlZCBhbmQgZXhlY3V0ZWQgb24gcmVsZWFzZQorYnVpbGRzLCBpbmNsdWRpbmcgYnVpbGRpbmcgdGhlIHN0cmluZ3MsIGV2ZW4gaWYgdGhlIGxvZ3MgYXJlbid0IGJlaW5nCityZWFkLjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBBbnkgbG9nZ2luZyB0aGF0IGlzIG1lYW50IHRvIGJlIHJlYWQgYnkgb3RoZXIgcGVvcGxlIGFuZCB0byBiZQorYXZhaWxhYmxlIGluIHJlbGVhc2UgYnVpbGRzIHNob3VsZCBiZSB0ZXJzZSB3aXRob3V0IGJlaW5nIGNyeXB0aWMsIGFuZCBzaG91bGQKK2JlIHJlYXNvbmFibHkgdW5kZXJzdGFuZGFibGUuIFRoaXMgaW5jbHVkZXMgYWxsIGxvZ2dpbmcgdXAgdG8gdGhlIERFQlVHCitsZXZlbC48L3A+Cis8cD48aT5Ob3RlOjwvaT4gV2hlbiBwb3NzaWJsZSwgbG9nZ2luZyBzaG91bGQgYmUga2VwdCBvbiBhIHNpbmdsZSBsaW5lIGlmIGl0CittYWtlcyBzZW5zZS4gTGluZSBsZW5ndGhzIHVwIHRvIDgwIG9yIDEwMCBjaGFyYWN0ZXJzIGFyZSBwZXJmZWN0bHkgYWNjZXB0YWJsZSwKK3doaWxlIGxlbmd0aHMgbG9uZ2VyIHRoYW4gYWJvdXQgMTMwIG9yIDE2MCBjaGFyYWN0ZXJzIChpbmNsdWRpbmcgdGhlIGxlbmd0aCBvZgordGhlIHRhZykgc2hvdWxkIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IExvZ2dpbmcgdGhhdCByZXBvcnRzIHN1Y2Nlc3NlcyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBhdCBsZXZlbHMKK2hpZ2hlciB0aGFuIFZFUkJPU0UuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IFRlbXBvcmFyeSBsb2dnaW5nIHRoYXQgaXMgdXNlZCB0byBkaWFnbm9zZSBhbiBpc3N1ZSB0aGF0J3MKK2hhcmQgdG8gcmVwcm9kdWNlIHNob3VsZCBiZSBrZXB0IGF0IHRoZSBERUJVRyBvciBWRVJCT1NFIGxldmVsLCBhbmQgc2hvdWxkIGJlCitlbmNsb3NlZCBieSBpZiBibG9ja3MgdGhhdCBhbGxvdyB0byBkaXNhYmxlIGl0IGVudGlyZWx5IGF0IGNvbXBpbGUtdGltZS48L3A+Cis8cD48aT5Ob3RlOjwvaT4gQmUgY2FyZWZ1bCBhYm91dCBzZWN1cml0eSBsZWFrcyB0aHJvdWdoIHRoZSBsb2cuIFByaXZhdGUKK2luZm9ybWF0aW9uIHNob3VsZCBiZSBhdm9pZGVkLiBJbmZvcm1hdGlvbiBhYm91dCBwcm90ZWN0ZWQgY29udGVudCBtdXN0CitkZWZpbml0ZWx5IGJlIGF2b2lkZWQuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgd2hlbiB3cml0aW5nIGZyYW1ld29yaworY29kZSBhcyBpdCdzIG5vdCBlYXN5IHRvIGtub3cgaW4gYWR2YW5jZSB3aGF0IHdpbGwgYW5kIHdpbGwgbm90IGJlIHByaXZhdGUKK2luZm9ybWF0aW9uIG9yIHByb3RlY3RlZCBjb250ZW50LjwvcD4KKzxwPjxpPk5vdGU6PC9pPiBTeXN0ZW0ub3V0LnByaW50bG4oKSAob3IgcHJpbnRmKCkgZm9yIG5hdGl2ZSBjb2RlKSBzaG91bGQKK25ldmVyIGJlIHVzZWQuIFN5c3RlbS5vdXQgYW5kIFN5c3RlbS5lcnIgZ2V0IHJlZGlyZWN0ZWQgdG8gL2Rldi9udWxsLCBzbyB5b3VyCitwcmludCBzdGF0ZW1lbnRzIHdpbGwgaGF2ZSBubyB2aXNpYmxlIGVmZmVjdHMuIEhvd2V2ZXIsIGFsbCB0aGUgc3RyaW5nCitidWlsZGluZyB0aGF0IGhhcHBlbnMgZm9yIHRoZXNlIGNhbGxzIHN0aWxsIGdldHMgZXhlY3V0ZWQuPC9wPgorPHA+PGk+Tm90ZTo8L2k+IDxiPlRoZSBnb2xkZW4gcnVsZSBvZiBsb2dnaW5nIGlzIHRoYXQgeW91ciBsb2dzIG1heSBub3QKK3VubmVjZXNzYXJpbHkgcHVzaCBvdGhlciBsb2dzIG91dCBvZiB0aGUgYnVmZmVyLCBqdXN0IGFzIG90aGVycyBtYXkgbm90IHB1c2gKK291dCB5b3Vycy48L2I+PC9wPgogCi08aDI+PGE+TmFtaW5nIHRlc3QgbWV0aG9kczwvYT4KLTwvaDI+Ci08YT5XaGVuIG5hbWluZyB0ZXN0IG1ldGhvZHMsIHlvdSBjYW4gdXNlIGFuIHVuZGVyc2NvcmUgdG8gc2VwZXJhdGUgd2hhdCBpcyBiZWluZyB0ZXN0ZWQgZnJvbSB0aGUgc3BlY2lmaWMgY2FzZSBiZWluZyB0ZXN0ZWQuIFRoaXMgc3R5bGUgbWFrZXMgaXQgZWFzaWVyIHRvIHNlZSBleGFjdGx5IHdoYXQgY2FzZXMgYXJlIGJlaW5nIHRlc3RlZC48L2E+Ci08cD48YT5FeGFtcGxlOjwvYT4KLTwvcD4KLTxwcmU+PGE+dGVzdE1ldGhvZF9zcGVjaWZpY0Nhc2UxIDxicj50ZXN0TWV0aG9kX3NwZWNpZmljQ2FzZTI8L2E+Ci08L3ByZT4KKzxoMj5KYXZhdGVzdHMgU3R5bGUgUnVsZXM8L2gyPgorPGgyPjxhIG5hbWU9InRlc3RtZXRob2RuYW1lcyI+PC9hPk5hbWluZyB0ZXN0IG1ldGhvZHM8L2gyPgorPHA+V2hlbiBuYW1pbmcgdGVzdCBtZXRob2RzLCB5b3UgY2FuIHVzZSBhbiB1bmRlcnNjb3JlIHRvIHNlcGVyYXRlIHdoYXQgaXMKK2JlaW5nIHRlc3RlZCBmcm9tIHRoZSBzcGVjaWZpYyBjYXNlIGJlaW5nIHRlc3RlZC4gVGhpcyBzdHlsZSBtYWtlcyBpdCBlYXNpZXIKK3RvIHNlZSBleGFjdGx5IHdoYXQgY2FzZXMgYXJlIGJlaW5nIHRlc3RlZC48L3A+Cis8cD48YT5Gb3IgZXhhbXBsZTo8L2E+PC9wPgorPHByZT50ZXN0TWV0aG9kX3NwZWNpZmljQ2FzZTEgdGVzdE1ldGhvZF9zcGVjaWZpY0Nhc2UyPC9wcmU+CiAKLTxwcmU+PGE+dm9pZCB0ZXN0SXNEaXN0aW5ndWlzaGFibGVfcHJvdGFub3BpYSgpIHs8YnI+Q29sb3JNYXRjaGVyIGNvbG9yTWF0Y2hlciA9IG5ldyBDb2xvck1hdGNoZXIoUFJPVEFOT1BJQSk8YnI+YXNzZXJ0RmFsc2UoY29sb3JNYXRjaGVyLmlzRGlzdGluZ3Vpc2hhYmxlKENvbG9yLlJFRCwgQ29sb3IuQkxBQ0spKTxicj5hc3NlcnRUcnVlKGNvbG9yTWF0Y2hlci5pc0Rpc3Rpbmd1aXNoYWJsZShDb2xvci5YLCBDb2xvci5ZKSk8YnI+fTwvYT4KKzxwcmU+dm9pZCB0ZXN0SXNEaXN0aW5ndWlzaGFibGVfcHJvdGFub3BpYSgpIHsKKyAgICBDb2xvck1hdGNoZXIgY29sb3JNYXRjaGVyID0gbmV3IENvbG9yTWF0Y2hlcihQUk9UQU5PUElBKQorICAgIGFzc2VydEZhbHNlKGNvbG9yTWF0Y2hlci5pc0Rpc3Rpbmd1aXNoYWJsZShDb2xvci5SRUQsIENvbG9yLkJMQUNLKSkKKyAgICBhc3NlcnRUcnVlKGNvbG9yTWF0Y2hlci5pc0Rpc3Rpbmd1aXNoYWJsZShDb2xvci5YLCBDb2xvci5ZKSkKK30KIDwvcHJlPgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL2Rvd25sb2FkLmpkIGIvcGRrL2RvY3Mvc291cmNlL2Rvd25sb2FkLmpkCmluZGV4IDMyOWRlZmYuLjk4ZTA0NzggMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9kb3dubG9hZC5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvZG93bmxvYWQuamQKQEAgLTk0LDcgKzk0LDcgQEAKIHN1bi1qYXZhNS1qZGsgPHNwYW4+PHNwYW4+emxpYjFnLWRldjwvc3Bhbj4KIDwvc3Bhbj4KIGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgbGliYzYtZGV2LWkzODYgbGliMzJuY3Vyc2VzNS1kZXYgaWEzMi1saWJzIHgxMXByb3RvLWNvcmUtZGV2IGxpYngxMS1kZXYgbGliMzJyZWFkbGluZTUtZGV2IGxpYjMyei1kZXY8L2Jsb2NrcXVvdGU+Ci08dWw+PGxpPlNldCB0aGUgc3lzdGVtIHRvIHVzZSB0aGUgcmlnaHQgdmVyc2lvbiBvZiBqYXZhIGJ5IGRlZmF1bHQ6PGJyPjxicj4kc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXNqYXZhLTEuNS4wLXN1biA8YnI+PC9saT4KKzx1bD48bGk+U2V0IHRoZSBzeXN0ZW0gdG8gdXNlIHRoZSByaWdodCB2ZXJzaW9uIG9mIGphdmEgYnkgZGVmYXVsdDo8YnI+PGJyPiQgc3VkbyB1cGRhdGUtamF2YS1hbHRlcm5hdGl2ZXMgLXMgamF2YS0xLjUuMC1zdW4gPGJyPjwvbGk+CiA8L3VsPgogPHVsPjxsaT5YMTE6IFVidW50dSBkb2Vzbid0IGhhdmUgcGFja2FnZXMgZm9yIHRoZSBYMTEgbGlicmFyaWVzLCBidXQgdGhhdCBjYW4gYmUgd29ya2VkIGFyb3VuZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDo8YnI+PGJyPiQgc3VkbyBsbiAtcyAvdXNyL2xpYjMyL2xpYlgxMS5zby42IC91c3IvbGliMzIvbGliWDExLnNvIDxicj48YnI+PC9saT4KIDwvdWw+CkBAIC0xMzUsMzggKzEzNSwzMiBAQAogPGxpPnZvbHVtZSBmb3JtYXQ6IGNhc2Ugc2Vuc2l0aXZlLCBqb3VybmFsZWQ8L2xpPgogPC91bD4KIDwvbGk+Ci08bGk+VGhpcyB3aWxsIGNyZWF0ZSBhIC5kbWcgZmlsZSB3aGljaCwgb25jZSBtb3VudGVkLCBhY3RzIGFzIGEgZHJpdmUgd2l0aCB0aGUgcmVxdWlyZWQgZm9ybWF0dGluZyBmb3IgQW5kcm9pZCBkZXZlbG9wbWVudC4gRm9yIGEgZGlzayBpbWFnZSBuYW1lZCAiYW5kcm9pZC5kbWciIHN0b3JlZCBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5LCB5b3UgY2FuIGFkZCB0aGUgZm9sbG93aW5nIHRvIHlvdXIgfi8uYmFzaF9wcm9maWxlIHRvIG1vdW50IHRoZSBpbWFnZSB3aGVuIHlvdSBleGVjdXRlICJtb3VudEFuZHJvaWQiOjxicj48YnI+PGRpdj4jIGNvbW1hbmQgdG8gbW91bnQgdGhlIGFuZHJvaWQgZmlsZSBpbWFnZSA8YnI+ZnVuY3Rpb24gbW91bnRBbmRyb2lkeyBoZGl1dGlsIGF0dGFjaCB+L2FuZHJvaWQuZG1nLW1vdW50cG9pbnQgL1ZvbHVtZXMvYW5kcm9pZDsgfTxicj48L2Rpdj4KKzxsaT5UaGlzIHdpbGwgY3JlYXRlIGEgLmRtZyBmaWxlIHdoaWNoLCBvbmNlIG1vdW50ZWQsIGFjdHMgYXMgYSBkcml2ZSB3aXRoIHRoZSByZXF1aXJlZCBmb3JtYXR0aW5nIGZvciBBbmRyb2lkIGRldmVsb3BtZW50LiBGb3IgYSBkaXNrIGltYWdlIG5hbWVkICJhbmRyb2lkLmRtZyIgc3RvcmVkIGluIHlvdXIgaG9tZSBkaXJlY3RvcnksIHlvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgdG8geW91ciB+Ly5iYXNoX3Byb2ZpbGUgdG8gbW91bnQgdGhlIGltYWdlIHdoZW4geW91IGV4ZWN1dGUgIm1vdW50QW5kcm9pZCI6PGJyPjxicj48ZGl2PiMgY29tbWFuZCB0byBtb3VudCB0aGUgYW5kcm9pZCBmaWxlIGltYWdlIDxicj5mdW5jdGlvbiBtb3VudEFuZHJvaWQgeyBoZGl1dGlsIGF0dGFjaCB+L2FuZHJvaWQuZG1nIC1tb3VudHBvaW50IC9Wb2x1bWVzL2FuZHJvaWQ7IH08YnI+PC9kaXY+CiA8YnI+T25jZSBtb3VudGVkLCB5b3UnbGwgZG8gYWxsIHlvdXIgd29yayBpbiB0aGUgImFuZHJvaWQiIHZvbHVtZS4gWW91IGNhbiBlamVjdCBpdCAodW5tb3VudCBpdCkganVzdCBsaWtlIHlvdSB3b3VsZCB3aXRoIGFuIGV4dGVybmFsIGRyaXZlLjwvbGk+CiA8L3VsPgogPC91bD4KIDwvdWw+CiA8dWw+PC91bD4KLVRvIHNldCB1cCB5b3VyIE1hYyBPUyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjxicj48b2w+PGxpPkluc3RhbGwgdGhlIFhDb2RlIHZlcnNpb24gMi40IG9yIGxhdGVyIGZyb20gPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vIj5odHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbTwvYT4uIFdlIHJlY29tbWVuZCB2ZXJzaW9uIDMuMCBvciBuZXdlci48YnI+PC9saT4KK1RvIHNldCB1cCB5b3VyIE1hYyBPUyBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjxicj4KKzxvbD48bGk+SW5zdGFsbCB0aGUgWENvZGUgdmVyc2lvbiAyLjQgb3IgbGF0ZXIgZnJvbSA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS8iPmh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tPC9hPi4gV2UgcmVjb21tZW5kIHZlcnNpb24gMy4wIG9yIG5ld2VyLjxicj48L2xpPgogPGxpPkluc3RhbGwgTWFjUG9ydHMuIFRvIGRvIHRoaXM6PC9saT4KLTxvbD48bGk+RG93bmxvYWQgdGhlIHRhciBmaWxlIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5tYWNwb3J0cy5vcmcvIj5odHRwOi8vd3d3Lm1hY3BvcnRzLm9yZy88L2E+IGFuZCB1bnRhciB0aGUgZmlsZXMuPC9saT4KLTxsaT5SdW4gdGhlIGZvbGxvd2luZzo8c3Bhbj48YnI+JCAuL2NvbmZpZ3VyZSA8YnI+PC9zcGFuPgotPHNwYW4+JDwvc3Bhbj4KLTxzcGFuPm1ha2UgPGJyPjwvc3Bhbj4KLTxzcGFuPiQ8L3NwYW4+Ci08c3Bhbj5zdWRvIG1ha2UgaW5zdGFsbDwvc3Bhbj4KLTwvbGk+Ci08bGk+TWFrZSBzdXJlIHRoYXQgL29wdC9sb2NhbC9iaW4gaXMgaW4geW91ciBwYXRoIGJlZm9yZSAvdXNyL2Jpbi4gYnkgcnVubmluZyA8YnI+JCBlY2hvICRQQVRIIDxicj5JZiB5b3UgZG9uJ3Qgc2VlIC9vcHQvbG9jYWwvYmluLCBlZGl0ICRIT01FLy5iYXNoX3Byb2ZpbGUgYW5kIGFkZCB0aGUgbGluZSA8YnI+ZXhwb3J0IFBBVEg9L29wdC9sb2NhbC9iaW46JFBBVEggPGJyPihvciB0aGUgZXF1aXZhbGVudCBmb3Igb3RoZXIgc2hlbGxzKSBhZnRlciBhbnkgb3RoZXIgUEFUSC1yZWxhdGVkIGxpbmVzLjxzcGFuPlRvIHZlcmlmeSB0aGF0IHlvdXIgcGF0aCBpcyBub3cgY29ycmVjdCwgbzwvc3Bhbj4KLXBlbiBhIG5ldyB0ZXJtaW5hbCBhbmQgPHNwYW4+cnVuPC9zcGFuPgotZWNobyAkUEFUSCA8c3Bhbj5hZ2Fpbjwvc3Bhbj4KLS48L2xpPgotPGxpPkFzayBNYWNQb3J0cyB0byB1cGRhdGUgaXRzZWxmOjxicj48c3Bhbj48L3NwYW4+Ci08c3Bhbj4kPC9zcGFuPgotPHNwYW4+c3VkbyBwb3J0IHNlbGZ1cGRhdGU8L3NwYW4+Ci08YnI+PC9saT4KKzxvbD4KKyAgICA8bGk+RG93bmxvYWQgYW5kIHJ1biB0aGUgaW5zdGFsbGVyIGZyb20gPGEgaHJlZj0iaHR0cDovL3d3dy5tYWNwb3J0cy5vcmcvaW5zdGFsbC5waHAiPmh0dHA6Ly93d3cubWFjcG9ydHMub3JnL2luc3RhbGwucGhwPC9hPjwvbGk+CisgICAgPGxpPk1ha2Ugc3VyZSB0aGF0IDxjb2RlPi9vcHQvbG9jYWwvYmluPC9jb2RlPiBpcyBpbiB5b3VyIHBhdGggYmVmb3JlIDxjb2RlPi91c3IvYmluPC9jb2RlPiBieSBydW5uaW5nCisgICAgICAgIDxkaXY+PGNvZGU+JCBlY2hvICRQQVRIPC9jb2RlPjwvZGl2PgorICAgICAgICA8ZGl2PiBJZiB5b3UgZG9uJ3Qgc2VlIC9vcHQvbG9jYWwvYmluLCBlZGl0IDxjb2RlPiRIT01FLy5iYXNoX3Byb2ZpbGU8L2NvZGU+IGFuZCBhZGQgdGhlIGxpbmUgPGNvZGU+ZXhwb3J0IFBBVEg9L29wdC9sb2NhbC9iaW46JFBBVEg8L2NvZGU+CisgICAgICAgIGFmdGVyIGFueSBvdGhlciBQQVRILXJlbGF0ZWQgbGluZXMuIFRvIHZlcmlmeSB0aGF0IHlvdXIgcGF0aCBpcyBub3cgY29ycmVjdCwgb3BlbiBhIG5ldyB0ZXJtaW5hbCBhbmQgcnVuIDxjb2RlPmVjaG8gJFBBVEg8L2NvZGU+IGFnYWluLjwvZGl2PgorICAgIDwvbGk+CiA8L29sPgotPGxpPkdldCB0aGUgZm9sbG93aW5nIHBhY2thZ2VzIGZyb20gcG9ydDo8YnI+JDxzcGFuPlBPU0lYTFlfQ09SUkVDVD0xPC9zcGFuPgotc3VkbyBwb3J0IGluc3RhbGwgZ21ha2UgbGlic2RsIGdpdC1jb3JlIGdudXBnIDxicj48c3Bhbj5JZiB1c2luZyBNYWMgT1MgMTAuNCwgYWxzbyBpbnN0YWxsOjxicj4kPHNwYW4+UE9TSVhMWV9DT1JSRUNUPTE8L3NwYW4+Cis8bGk+R2V0IHRoZSBmb2xsb3dpbmcgcGFja2FnZXMgZnJvbSBwb3J0Ojxicj4kIDxzcGFuPlBPU0lYTFlfQ09SUkVDVD0xPC9zcGFuPgorc3VkbyBwb3J0IGluc3RhbGwgZ21ha2UgbGlic2RsIGdpdC1jb3JlIGdudXBnIDxicj48c3Bhbj5JZiB1c2luZyBNYWMgT1MgMTAuNCwgYWxzbyBpbnN0YWxsOjxicj4kIDxzcGFuPlBPU0lYTFlfQ09SUkVDVD0xPC9zcGFuPgogc3VkbyBwb3J0IGluc3RhbGwgYmlzb24gPGJyPjwvc3Bhbj4KIDwvbGk+Ci08bGk+VXBncmFkZSBHTlUgbWFrZSB0byAzLjgxIG9yIGxhdGVyIGJ5IHJ1bm5pbmcuTWFjIE9TIGRvZXNuJ3QgY29tZSB3aXRoIGEgcmVjZW50IGVub3VnaCB2ZXJzaW9uLjxicj4kIHN1ZG8gbG4gLXMgZ21ha2UgL29wdC9sb2NhbC9iaW4vbWFrZSA8YnI+PC9saT4KKzxsaT5VcGdyYWRlIEdOVSBtYWtlIHRvIDMuODEgb3IgbGF0ZXIgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQuIChNYWMgT1MgZG9lc24ndCBjb21lIHdpdGggYSByZWNlbnQgZW5vdWdoIHZlcnNpb24uKTxicj4kIHN1ZG8gbG4gLXMgZ21ha2UgL29wdC9sb2NhbC9iaW4vbWFrZSA8YnI+PC9saT4KIDxsaT5TZXQgYW4gYXBwcm9wcmlhdGUgcGVyLXByb2Nlc3MgZmlsZSBkZXNjcmlwdG9yIGxpbWl0LiBUbyBkbyB0aGlzLCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lcyB0byB5b3VyIDxpPjxzcGFuPi5iYXNoX3Byb2ZpbGU8L3NwYW4+CiA8L2k+Ci1maWxlOjxicj4jIHNldCB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgdG8gYmUgMTAyNDxicj51bGltaXQgLVMgLW4gMTAyNDwvbGk+CitmaWxlOjxicj4jIHNldCB0aGUgbnVtYmVyIG9mIG9wZW4gZmlsZXMgdG8gYmUgMTAyNDxicj4kIDxzcGFuPnVsaW1pdCAtUyAtbiAxMDI0PC9zcGFuPjxicj4KK05vdGUgdGhhdCB0aGlzIG1heSBub3QgYmUgbmVjZXNzYXJ5OyBvbiBzb21lIHN5c3RlbXMsIHRoZSBvdXRwdXQgb2YgInVsaW1pdCAtUyIgd2lsbCBzaG93ICJ1bmxpbWl0ZWQiLiBJbiB0aGlzIGNhc2UsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IHRoZSBsaW1pdCB0byAxMDI0LjwvbGk+CiA8L29sPgogPC9kaXY+CiA8L2Rpdj4KQEAgLTE4MCwxMSArMTc0LDExIEBACiAuPGJyPjwvcD4KIFRvIGluc3RhbGwsIGluaXRpYWxpemUsIGFuZCBjb25maWd1cmUgUmVwbywgZm9sbG93IHRoZXNlIHN0ZXBzOjxicj48YnI+PC9kaXY+CiA8b2w+PGxpPjxzcGFuPk1ha2Ugc3VyZSB5b3UgaGF2ZSBhfi9iaW5kaXJlY3RvcnkgaW4geW91ciBob21lIGRpcmVjdG9yeSwgYW5kIGNoZWNrIHRvIGJlIHN1cmUgdGhhdCB0aGlzIGJpbiBkaXJlY3RvcnkgaXMgaW4geW91ciBwYXRoOjwvc3Bhbj4KLTxicj4kIGNkfjxicj48c3Bhbj48c3Bhbj4kIG1rZGlyIGJpbiA8YnI+JCBlY2hvICRQQVRIIDxicj48L3NwYW4+Cis8YnI+JCBjZCB+PGJyPjxzcGFuPjxzcGFuPiQgbWtkaXIgYmluIDxicj4kIGVjaG8gJFBBVEggPGJyPjwvc3Bhbj4KIDwvc3Bhbj4KIDwvbGk+CiA8bGk+PHNwYW4+RG93bmxvYWQgdGhlcmVwb3NjcmlwdCBhbmQgbWFrZSBzdXJlIGl0IGlzIGV4ZWN1dGFibGU6PC9zcGFuPgotPGJyPiQgY3VybCBodHRwOi8vYW5kcm9pZC5naXQua2VybmVsLm9yZy9yZXBvfi9iaW4vcmVwbyA8ZGl2PiQgY2htb2QgYSt4IH4vYmluL3JlcG88L2Rpdj4KKzxicj4kIGN1cmwgaHR0cDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvcmVwbyAmZ3Q7fi9iaW4vcmVwbyA8ZGl2PiQgY2htb2QgYSt4IH4vYmluL3JlcG88L2Rpdj4KIDwvbGk+CiA8L29sPgogPC9kaXY+CkBAIC0xOTcsNyArMTkxLDcgQEAKIDxzcGFuPiQgbWtkaXIgbXlkcm9pZDwvc3Bhbj4KIDxicj48c3Bhbj4kIGNkIG15ZHJvaWQ8L3NwYW4+CiA8YnI+PC9saT4KLTxsaT48c3Bhbj5SdW5yZXBvIGluaXR0byBicmluZyBkb3duIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBSZXBvIHdpdGggYWxsIGl0cyBtb3N0IHJlY2VudCBidWcgZml4ZXMuIFlvdSBtdXN0IHNwZWNpZnkgYSBVUkwgZm9yIHRoZSBtYW5pZmVzdDo8L3NwYW4+Cis8bGk+PHNwYW4+UnVuICJyZXBvIGluaXQiIHRvIGJyaW5nIGRvd24gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIFJlcG8gd2l0aCBhbGwgaXRzIG1vc3QgcmVjZW50IGJ1ZyBmaXhlcy4gWW91IG11c3Qgc3BlY2lmeSBhIFVSTCBmb3IgdGhlIG1hbmlmZXN0Ojwvc3Bhbj4KIDxicj48c3Bhbj4kIHJlcG8gaW5pdDwvc3Bhbj4KIC11IGdpdDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvcGxhdGZvcm0vbWFuaWZlc3QuZ2l0PC9saT4KIDx1bD48bGk+PHNwYW4+SWYgeW91IHdvdWxkIGxpa2UgdG8gY2hlY2sgb3V0IGEgYnJhbmNoIG90aGVyIHRoYW4gIm1hc3RlciIsIHNwZWNpZnkgaXQgd2l0aCAtYiwgbGlrZTo8L3NwYW4+CkBAIC0yMzgsNyArMjMyLDcgQEAKIEdldHRpbmcgdGhlIGZpbGVzPC9oMj4KIDxkaXY+PHNwYW4+PHNwYW4+VG8gcHVsbCBkb3duIGZpbGVzIHRvIHlvdXIgd29ya2luZyBkaXJlY3RvcnkgZnJvbSB0aGUgcmVwb3NpdG9yaWVzIGFzIHNwZWNpZmllZCBpbiB0aGUgZGVmYXVsdCBtYW5pZmVzdCwgcnVuPC9zcGFuPgogPGJyPjxicj4kIHJlcG8gc3luYyA8aT48YnI+PC9pPgotPGJyPjxzcGFuPkZvciBtb3JlIGFib3V0cmVwbyBzeW5jYW5kIG90aGVyIFJlcG8gY29tbWFuZHMsIHNlZTwvc3Bhbj4KKzxicj48c3Bhbj5Gb3IgbW9yZSBhYm91dCAicmVwbyBzeW5jIiBhbmQgb3RoZXIgUmVwbyBjb21tYW5kcywgc2VlPC9zcGFuPgogPGEgaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9naXQtcmVwby5odG1sIj5Vc2luZyBSZXBvIGFuZCBHaXQ8L2E+CiA8c3Bhbj4uPC9zcGFuPgogPGJyPjxicj48c3Bhbj5UaGUgQW5kcm9pZCBzb3VyY2UgZmlsZXMgd2lsbCBiZSBsb2NhdGVkIGluIHlvdXIgd29ya2luZwpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL2luZGV4LmpkIGIvcGRrL2RvY3Mvc291cmNlL2luZGV4LmpkCmluZGV4IDIzMGEwYjMuLmE5YWNiZjQgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9pbmRleC5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvaW5kZXguamQKQEAgLTMsNyArMyw3IEBACiBAamQ6Ym9keQogPGRpdj4KIDxwPlRoYW5rcyBmb3IgeW91ciBpbnRlcmVzdCBpbiBBbmRyb2lkISBIZXJlIGFyZSBzb21lIHdheXMgeW91IGNhbiBnZXQgaW52b2x2ZWQKLWFuZCBoZWxwIEdvb2dsZSBpbXByb3ZlIEFuZHJvaWQuIEZvciBiYWNrZ3JvdW5kIG9uIHRoZSBBbmRyb2lkIHByb2plY3QgYW5kIG91cgorYW5kIGhlbHAgdXMgaW1wcm92ZSBBbmRyb2lkLiBGb3IgYmFja2dyb3VuZCBvbiB0aGUgQW5kcm9pZCBwcm9qZWN0IGFuZCBvdXIKIGdvYWxzLCBjaGVjayBvdXQgdGhlIDxhIGhyZWY9IntAZG9jUm9vdH1hYm91dC9waGlsb3NvcGh5Lmh0bWwiPlByb2plY3QKIFBoaWxvc29waHkgcGFnZTwvYT4uPC9wPgogCkBAIC0xMSw3ICsxMSw3IEBACiA8cD5PbmUgb2YgdGhlIGVhc2llc3QgYW5kIG1vc3QgZWZmZWN0aXZlIHdheXMgeW91IGNhbiBoZWxwIGltcHJvdmUgQW5kcm9pZCBpcwogdG8gZmlsZSBidWdzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgdmlzaXQgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL3JlcG9ydC1idWdzLmh0bWwiPlJlcG9ydGluZyBCdWdzPC9hPiBwYWdlLjwvcD4KLTxwPlBsZWFzZSBub3RlIHRoYXQgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoYXQgYW55IHBhcnRpY3VsYXIgYnVnIGNhbiBiZSBmaXhlZCBpbgorPHA+UGxlYXNlIG5vdGUgdGhhdCB3ZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBhbnkgcGFydGljdWxhciBidWcgd2lsbCBiZSBmaXhlZCBpbgogYW55IHBhcnRpY3VsYXIgcmVsZWFzZS4gVG8gc2VlIHdoYXQgaGFwcGVucyB0byB5b3VyIGJ1ZyBvbmNlIHlvdSByZXBvcnQgaXQsCiByZWFkIDxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2UvbGlmZS1vZi1hLWJ1Zy5odG1sIj5MaWZlIG9mIGEgQnVnPC9hPi48L3A+CiAKQEAgLTI2LDggKzI2LDEwIEBACiAKIDxoMj5Db250cmlidXRlIHRvIHRoZSBDb2RlPC9oMj4KIDxwPkNvZGUgaXMgS2luZy4gV2UnZCBsb3ZlIHRvIHJldmlldyBhbnkgY2hhbmdlcyB5b3Ugc3VibWl0LCBzbyBwbGVhc2UgY2hlY2sKLW91dCB0aGUgc291cmNlLCBwaWNrIGEgYnVnIG9yIGZlYXR1cmUsIGFuZCBnZXQgY29kaW5nLjwvcD4KLTxwPllvdSBjYW4gZ2V0IHN0YXJ0ZWQgd2l0aCAgYnkgbGVhcm5pbmcgYWJvdXQgdGhlIDxhCitvdXQgdGhlIHNvdXJjZSwgcGljayBhIGJ1ZyBvciBmZWF0dXJlLCBhbmQgZ2V0IGNvZGluZy4gTm90ZSB0aGF0IHRoZSBzbWFsbGVyCithbmQgbW9yZSB0YXJnZXR0ZWQgeW91ciBwYXRjaCBzdWJtaXNzaW9ucywgdGhlIGVhc2llciBpdCB3aWxsIGJlIGZvciB1cyB0bworcmV2aWV3IHRoZW0uPC9wPgorPHA+WW91IGNhbiBnZXQgc3RhcnRlZCB3aXRoIEFuZHJvaWQgYnkgbGVhcm5pbmcgYWJvdXQgdGhlIDxhCiBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2xpZmUtb2YtYS1wYXRjaC5odG1sIj5MaWZlIG9mIGEgUGF0Y2g8L2E+LCBhbmQgYnkKIGxlYXJuaW5nIGFib3V0IDxjb2RlPmdpdDwvY29kZT4sIDxjb2RlPnJlcG88L2NvZGU+LCBhbmQgb3RoZXIgdG9vbHMgdXNpbmcgdGhlCiBsaW5rcyB0byB0aGUgbGVmdC4gSWYgeW91IG5lZWQgaGVscCBhbG9uZyB0aGUgd2F5LCB5b3UgY2FuIGpvaW4gb3VyIDxhCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvbGljZW5zZXMuamQgYi9wZGsvZG9jcy9zb3VyY2UvbGljZW5zZXMuamQKaW5kZXggODQ2YTkyYS4uMTdjZWJlYiAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL2xpY2Vuc2VzLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9saWNlbnNlcy5qZApAQCAtNCwxOCArNCwxNSBAQAogPGRpdj4KIDxwPlRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgdXNlcyBhIGZldyA8YQogaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy8iPm9wZW4gc291cmNlIGluaXRpYXRpdmU8L2E+IGFwcHJvdmVkIG9wZW4KLXNvdXJjZSBsaWNlbnNlcyB0byBlbmFibGUgYXZhaWxhYmlsaXR5IG9mIHNvdXJjZSBjb2RlIGFuZCB0byBhY2NlcHQKLWNvbnRyaWJ1dGlvbnMgZnJvbSBpbmRpdmlkdWFscyBhbmQgY29ycG9yYXRpb25zLjwvcD4KK3NvdXJjZSBsaWNlbnNlcyBmb3Igb3VyIHNvZnR3YXJlLjwvcD4KIDxoMj5BbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgbGljZW5zZTwvaDI+Ci08cD5UaGUgcHJlZmVycmVkIGxpY2Vuc2UgZm9yIHRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QgaXMgPGEKLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIDIuMDwvYT4uIEFwYWNoZSAyLjAKLWlzIGEgY29tbWVyY2lhbCBhbmQgb3BlbiBzb3VyY2UgZnJpZW5kbHkgb3BlbiBzb3VyY2UgbGljZW5zZS4gVGhlIG1ham9yaXR5IG9mCi10aGUgQW5kcm9pZCBwbGF0Zm9ybSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgPGEKLWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8iPkFwYWNoZSAyLjAgbGljZW5zZTwvYT4uIFdoaWxlIHRoZQotcHJvamVjdCB3aWxsIHN0cml2ZSB0byBhZGhlcmUgdG8gdGhlIHByZWZlcnJlZCBsaWNlbnNlLCB0aGVyZSBtYXkgYmUKLWV4Y2VwdGlvbnMgd2hpY2ggd2lsbCBiZSBoYW5kbGVkIG9uIGEgY2FzZS1ieS1jYXNlIGJhc2lzLiBGb3IgZXhhbXBsZSwgdGhlCi1MaW51eCBrZXJuZWwgcGF0Y2hlcyBhcmUgdW5kZXIgdGhlIEdQTHYyIGxpY2Vuc2Ugd2l0aCBzeXN0ZW0gZXhjZXB0aW9ucywgd2hpY2gKLWNhbiBiZSBmb3VuZCBvbiA8YQorPHA+VGhlIHByZWZlcnJlZCBsaWNlbnNlIGZvciB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0IGlzIHRoZSA8YQoraHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSwKKzIuMDwvYT4gKCJBcGFjaGUgMi4wIiksIGFuZCB0aGUgbWFqb3JpdHkgb2YgdGhlIEFuZHJvaWQgc29mdHdhcmUgaXMgbGljZW5zZWQKK3dpdGggQXBhY2hlIDIuMC4gV2hpbGUgdGhlIHByb2plY3Qgd2lsbCBzdHJpdmUgdG8gYWRoZXJlIHRvIHRoZSBwcmVmZXJyZWQKK2xpY2Vuc2UsIHRoZXJlIG1heSBiZSBleGNlcHRpb25zIHdoaWNoIHdpbGwgYmUgaGFuZGxlZCBvbiBhIGNhc2UtYnktY2FzZQorYmFzaXMuIEZvciBleGFtcGxlLCB0aGUgTGludXgga2VybmVsIHBhdGNoZXMgYXJlIHVuZGVyIHRoZSBHUEx2MiBsaWNlbnNlIHdpdGgKK3N5c3RlbSBleGNlcHRpb25zLCB3aGljaCBjYW4gYmUgZm91bmQgb24gPGEKIGhyZWY9Imh0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL0NPUFlJTkciPmtlcm5lbC5vcmc8L2E+LgogPC9wPgogPGgyPkNvbnRyaWJ1dG9yIExpY2Vuc2UgR3JhbnRzPC9oMj4KQEAgLTI1LDE1ICsyMiwxNSBAQAogaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9jbGEtaW5kaXZpZHVhbC5odG1sIj5JbmRpdmlkdWFsCiBDb250cmlidXRvciBMaWNlbnNlIEdyYW50PC9hPi4gVGhlIGdyYW50IGNhbiBiZSBleGVjdXRlZCBvbmxpbmUgdGhyb3VnaCB0aGUgPGEKIGhyZWY9Imh0dHBzOi8vcmV2aWV3LnNvdXJjZS5hbmRyb2lkLmNvbS8jc2V0dGluZ3MsYWdyZWVtZW50cyI+Y29kZSByZXZpZXcKLXRvb2w8L2E+LiBUaGUgYWdyZWVtZW50IGNsZWFybHkgZGVmaW5lcyB0aGUgdGVybXMgdW5kZXIgd2hpY2ggaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSBoYXMgYmVlbiBjb250cmlidXRlZCB0byB0aGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0LlRoaXMgbGljZW5zZQordG9vbDwvYT4uIFRoZSBncmFudCBjbGVhcmx5IGRlZmluZXMgdGhlIHRlcm1zIHVuZGVyIHdoaWNoIGludGVsbGVjdHVhbAorcHJvcGVydHkgaGFzIGJlZW4gY29udHJpYnV0ZWQgdG8gdGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdC4gVGhpcyBsaWNlbnNlCiBpcyBmb3IgeW91ciBwcm90ZWN0aW9uIGFzIGEgY29udHJpYnV0b3IgYXMgd2VsbCBhcyB0aGUgcHJvdGVjdGlvbiBvZiB0aGUKIHByb2plY3Q7IGl0IGRvZXMgbm90IGNoYW5nZSB5b3VyIHJpZ2h0cyB0byB1c2UgeW91ciBvd24gY29udHJpYnV0aW9ucyBmb3IgYW55CiBvdGhlciBwdXJwb3NlLjwvcD4KIDxwPkZvciBhIDxiPmNvcnBvcmF0aW9uPC9iPiAob3Igb3RoZXIgZW50aXR5KSB0aGF0IGhhcyBhc3NpZ25lZCBlbXBsb3llZXMgdG8KIHdvcmsgb24gdGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdCwgYSA8YQogaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9jbGEtY29ycG9yYXRlLmh0bWwiPkNvcnBvcmF0ZQotQ29udHJpYnV0b3IgTGljZW5zZSBHcmFudDwvYT4gaXMgYXZhaWxhYmxlLiBUaGlzIHZlcnNpb24gb2YgdGhlIEdyYW50IGFsbG93cyBhCitDb250cmlidXRvciBMaWNlbnNlIEdyYW50PC9hPiBpcyBhdmFpbGFibGUuIFRoaXMgdmVyc2lvbiBvZiB0aGUgZ3JhbnQgYWxsb3dzIGEKIGNvcnBvcmF0aW9uIHRvIGF1dGhvcml6ZSBjb250cmlidXRpb25zIHN1Ym1pdHRlZCBieSBpdHMgZGVzaWduYXRlZCBlbXBsb3llZXMKIGFuZCB0byBncmFudCBjb3B5cmlnaHQgYW5kIHBhdGVudCBsaWNlbnNlcy4gTm90ZSB0aGF0IGEgQ29ycG9yYXRlIENvbnRyaWJ1dG9yCiBMaWNlbnNlIEdyYW50IGRvZXMgbm90IHJlbW92ZSB0aGUgbmVlZCBmb3IgYW55IGRldmVsb3BlciB0byBzaWduIHRoZWlyIG93bgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL2xpZmUtb2YtYS1idWcuamQgYi9wZGsvZG9jcy9zb3VyY2UvbGlmZS1vZi1hLWJ1Zy5qZAppbmRleCAxZDU4YWUxLi41ZDc3ZjdhIDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvbGlmZS1vZi1hLWJ1Zy5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2UvbGlmZS1vZi1hLWJ1Zy5qZApAQCAtNTcsNyArNTcsNyBAQAogd2hpY2ggaXMgY29uc2lkZXJlZCB0aGUgIm1hc3RlciIgY29weS4gKEZvciBpbnN0YW5jZSwgR29vZ2xlIG1haW50YWlucyBvbmUKIHN1Y2ggcHJpdmF0ZSBpc3N1ZSB0cmFja2VyLCBpbnRlbmRlZCBwcmltYXJpbHkgZm9yIGJ1Z3Mgd2hpY2ggY29udGFpbgogc2Vuc2l0aXZlIGluZm9ybWF0aW9uIHdoaWNoIGNhbid0IGJlIHJldmVhbGVkIHB1YmxpY2x5Lik8L3A+PC9saT4KLTxsaT48Yj5Bc3NpZ25lZDwvYj48bGk+TGlrZSA8Y29kZT5VbmFzc2lnbmVkPC9jb2RlPiwgYnV0IHRoZSBidWcgaGFzIGJlZW4KKzxsaT48Yj5Bc3NpZ25lZDwvYj48cD5MaWtlIDxjb2RlPlVuYXNzaWduZWQ8L2NvZGU+LCBidXQgdGhlIGJ1ZyBoYXMgYmVlbgogYWN0dWFsbHkgYXNzaWduZWQgdG8gYSBzcGVjaWZpYyBjb250cmlidXRvciB0byBmaXguPC9wPjwvbGk+CiA8L3VsPgogPHA+VHlwaWNhbGx5LCBhIGdpdmVuIGJ1ZyB3aWxsIHN0YXJ0IGluIDxjb2RlPlVuYXNzaWduZWQ8L2NvZGU+LCB3aGVyZSBpdApAQCAtNzcsOCArNzcsOCBAQAogPGxpPjxiPlNwYW08L2I+PHA+QSBraW5kIHNvdWwgc2VudCB1cyBzb21lIGRlbGljaW91cyBwb3JrIHByb2R1Y3RzLCB0aGF0IHdlLAogcmVncmV0dGFibHksIGRvIG5vdCB3YW50LjwvcD48L2xpPgogPGxpPjxiPlF1ZXN0aW9uPC9iPjxwPlNvbWVvbmUgbWlzdG9vayB0aGUgaXNzdWUgdHJhY2tlciBmb3IgYSBoZWxwIGZvcnVtLgotKFRoaXMgaXMgbm90IGFzIHVuY29tbW9uIGFzIG9uZSBtaWdodCBhc3N1bWU6IG1hbnkgdXNlcnMgd2hvc2UgbmF0aXZlIGxhbmd1YWdlCi1pc24ndCBFbmdsaXNoIGNhbiBtYWtlIHRoaXMgbWlzdGFrZS4pPC9wPjwvbGk+CisoVGhpcyBpcyBub3QgYXMgdW5jb21tb24gYXMgeW91IG1pZ2h0IHRoaW5rOiBtYW55IHVzZXJzIHdob3NlIG5hdGl2ZSBsYW5ndWFnZQoraXNuJ3QgRW5nbGlzaCBtaXN1bmRlcnN0YW5kIHRoZSBzaXRlIGFuZCBtYWtlIHRoaXMgbWlzdGFrZS4pPC9wPjwvbGk+CiA8bGk+PGI+VW5yZXByb2R1Y2libGU8L2I+PHA+QW4gQU9TUCBjb250cmlidXRvciBhdHRlbXB0ZWQgdG8gcmVwcm9kdWNlIHRoZQogYmVoYXZpb3IgZGVzY3JpYmVkLCBhbmQgd2FzIHVuYWJsZSB0byBkbyBzby4gVGhpcyBzb21ldGltZXMgbWVhbnMgdGhhdCB0aGUgYnVnCiBpcyBsZWdpdGltYXRlIGJ1dCBzaW1wbHkgcmFyZSBvciBkaWZmaWN1bHQgdG8gcmVwcm9kdWNlLCBhbmQgc29tZXRpbWVzIG1lYW5zCmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXctMS4wLmpkIGIvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LTEuMC5qZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFiNWNkNi4uMDAwMDAwMAotLS0gYS9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXctMS4wLmpkCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLXBhZ2UudGl0bGU9QW5kcm9pZCAxLjAgRmVhdHVyZXMKLWRvYy50eXBlPXNvdXJjZQotQGpkOmJvZHkKLTxkaXY+PGRpdj48ZGl2PjxkaXY+VGhpcyBwYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiBBbmRyb2lkIDEuMAotZmVhdHVyZXMuIFRvIHNlZSB0aGUgY29kZSBpdHNlbGYsIHlvdSBjYW4gZWl0aGVyIHVzZSB0aGUgPGEgaHJlZj0iaHR0cDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvIj5HaXRXZWI8L2E+Ci1pbnRlcmZhY2UgdG8gdmlldyBzbmFwc2hvdHMgb2YgdGhlIGZpbGVzLCBvciB5b3UgY2FuIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPmRvd25sb2FkPC9hPgotdGhlIHNvdXJjZSBjb2RlIG9udG8geW91ciBsb2NhbCBtYWNoaW5lLjxicj48YnI+PGI+QXBwbGljYXRpb25zPC9iPgotPGJyPjxicj5UaGUgQW5kcm9pZCBwbGF0Zm9ybSBjb21lcyB3aXRoIGEgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgd3JpdHRlbiB1c2luZyB0aGUgSmF2YSBwcm9ncmFtbWluZyBsYW5ndWFnZTo8YnI+PHVsPjxsaT48aT5Ib21lPC9pPgotZGlzcGxheXMgYXBwbGljYXRpb25zLCB3aWRnZXRzLCBhbmQgc2hvcnRjdXRzLiBJdCBhbHNvIHN1cHBvcnRzIGN1c3RvbWl6YWJsZSB3YWxsIHBhcGVyLgotPC9saT4KLTxsaT48aT5QaG9uZTwvaT4KLXN1cHBvcnRzIHJlZ3VsYXIgdGVsZXBob255IGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIGNhbGwgY29udHJvbHMsIGNvbmZlcmVuY2UgY2FsbHMsIHN1cHBsZW1lbnRhcnkgc2VydmljZXMsIGFuZCBlYXN5IGludGVncmF0aW9uIHdpdGggPGk+Q29udGFjdHM8L2k+Ci0uPGJyPjwvbGk+Ci08bGk+PGk+V2ViIEJyb3dzZXI8L2k+Ci1pcyBhIGZ1bGx5IGZlYXR1cmVkIFdlYktpdC1iYXNlZCBicm93c2VyIHRoYXQgc3VwcG9ydHMgSFRNTCBhbmQgWEhUTUwuCi08L2xpPgotPGxpPjxpPkVtYWlsPC9pPgotcHJvdmlkZXMgYWNjZXNzIHRvIGVtYWlsIHNlcnZlcnMgY29tbW9ubHkgZm91bmQgb24gdGhlIEludGVybmV0IGFuZCBzdXBwb3J0cyBQT1AzLCBJTUFQNCwgYW5kIFNNVFAuCi08L2xpPgotPGxpPjxpPk1lZGlhIFBsYXllcjwvaT4KLWVuYWJsZXMgbWFuYWdpbmcsIGltcG9ydGluZywgYW5kIHBsYXlpbmcgYmFjayBjb250ZW50IHRoYXQgaGFzIGJlZW4gZW5jb2RlZCBpbiB2YXJpb3VzIGZvcm1zLjxicj48L2xpPgotPGxpPjxpPkFsYXJtIENsb2NrLCBDYWxjdWxhdG9yLCBDYWxlbmRhciwgQ2FtZXJhLCBDb250YWN0cywgSU0sIE1NUywgU2V0dGluZ3MsPC9pPgotPGk+Vm9pY2UgRGlhbGVyPC9pPgotLCBhbmQgbWFueSBvdGhlciBhcHBsaWNhdGlvbnMgYXJlIGFsc28gaW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlLjxicj48L2xpPgotPC91bD4KLTxiPkFwcGxpY2F0aW9uIGZyYW1ld29yazwvYj4KLTxicj48YnI+PC9kaXY+Ci08ZGl2PlRoZSBBbmRyb2lkIEFwcGxpY2F0aW9uIEZyYW1ld29yayBoYXMgYmVlbiBkZXNpZ25lZCB0byBwcm92aWRlIGEgcmljaCBzZXQgb2YgQVBJcyBmb3IgdGhpcmQtcGFydHkgYXBwbGljYXRpb24gZGV2ZWxvcGVycy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSA8YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL2d1aWRlL2luZGV4Lmh0bWwiPkFuZHJvaWQgU0RLIGRldmVsb3BlciBndWlkZTwvYT4KLS48Yj48YnI+PC9iPgotPC9kaXY+Ci08ZGl2PjwvZGl2PgotPGRpdj48Yj5BbmRyb2lkIHJ1bnRpbWU8L2I+Ci08Yj48YnI+PGJyPjwvYj4KLUFuZHJvaWQgYXBwbGljYXRpb25zIHJ1biBvbiBEYWx2aWssIGEgY3VzdG9tIHZpcnR1YWwgbWFjaGluZSAoVk0pIGRlc2lnbmVkIGZvciBlbWJlZGRlZCB1c2UuIFRoZSBEYWx2aWsgVk0gcnVucyBkZXggZXhlY3V0YWJsZSBmaWxlcywgd2hpY2ggYXJlIHR5cGljYWxseSBjb21waWxlZCBmcm9tIHNvdXJjZSBjb2RlIHdyaXR0ZW4gaW4gSmF2YS48YnI+PGJyPjwvZGl2PgotPGRpdj5UaGUgZGV4IGV4ZWN1dGFibGUgZm9ybWF0IGlzIGRlc2lnbmVkIHRvIGhhdmUgdGhlc2UgY2hhcmFjdGVyaXN0aWNzOjxicj48dWw+PGxpPkVmZmljaWVudCBvbi1kZXZpY2Ugc3RvcmFnZS4KLTwvbGk+Ci08bGk+RWZmaWNpZW50IHJ1bnRpbWUgbWVtb3J5IHVzYWdlLgotPC9saT4KLTxsaT5FYXNlIG9mIGludGVycHJldGF0aW9uLjxicj48L2xpPgotPC91bD4KLURhbHZpayBoYXMgdGhlIGZvbGxvd2luZyBydW50aW1lIGNoYXJhY3RlcmlzdGljczoKLTx1bD48bGk+RWZmaWNpZW50IHN1cHBvcnQgZm9yIG11bHRpcGxlIGNvbmN1cnJlbnQgVk0gcHJvY2Vzc2VzLCBpbmNsdWRpbmcgYW1vcnRpemVkIGluaXRpYWxpemF0aW9uIGFuZCBoZWF2aWx5IHNoYXJlZCBtZW1vcnkuCi08L2xpPgotPGxpPk9wdGltaXplZCBpbnRlcnByZXRlci4KLTwvbGk+Ci08bGk+RWZmaWNpZW50IGxpbmthZ2UgdG8gbG93LWxldmVsIG5hdGl2ZSBjb2RlLgotPC9saT4KLTxsaT5BIGZhbWlsaWFyIGFuZCByaWNoIHNldCBvZiBjb3JlIGxpYnJhcnkgZnVuY3Rpb25hbGl0eS4gRm9yIGEgY29tcGxldGUgbGlzdCBvZiBzdXBwb3J0ZWQgbGlicmFyaWVzLCBzZWUgPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvcGFja2FnZXMuaHRtbCI+aHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvcGFja2FnZXMuaHRtbDwvYT4KLS4KLTwvbGk+Ci08bGk+RW5oYW5jZWQgSkRXUCBzdXBwb3J0LCBlbmFibGluZyBlYXNpZXIgZGVidWdnaW5nIG9mIG11bHRpcGxlIHByb2Nlc3NlcyBzaW11bHRhbmVvdXNseS4KLTwvbGk+Ci08bGk+Sk5JIHN1cHBvcnQuCi08L2xpPgotPC91bD4KLTxiPk5hdGl2ZSBsaWJyYXJpZXMgPGJyPjwvYj4KLTxicj5UaGUgQW5kcm9pZCBwbGF0Zm9ybSBtYWtlcyB1c2Ugb2YgbWFueSBuYXRpdmUgbGlicmFyaWVzLCBpbmNsdWRpbmc6PGJyPjx1bD48bGk+PGk+QmlvbmljPC9pPgotLCBhIGN1c3RvbSBsaWJjIGltcGxlbWVudGF0aW9uIG9wdGltaXplZCBmb3IgZW1iZWRkZWQgc3lzdGVtcy4KLTwvbGk+Ci08bGk+R3JhcGhpY3MgbGlicmFyaWVzIGZvciAyRCBhbmQgM0QgKE9wZW5HTCBFUyAxLjApIGdyYXBoaWNzIHN1cHBvcnQuPGJyPjwvbGk+Ci08bGk+b3BlbkNvcmUgdG8gcHJvdmlkZSB0aGUgYnVsayBvZiBBbmRyb2lkJ3MgbXVsdGltZWRpYSBjYXBhYmlsaXR5LiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBuZXR3b3JrIHN0cmVhbWluZyAoSFRUUCBhbmQgUlRTUCksIGFzIHdlbGwgYXMgbW9zdCBvZiB0aGUgY29kZWNzIGFuZCBtZWRpYSBmaWxlIHBhcnNlcnMgdXNlZCBieSB0aGUgc3lzdGVtLjxicj48L2xpPgotPGxpPnNxbGl0ZSB0byBzdXBwb3J0IGhhdmluZyBhIGxpZ2h0d2VpZ2h0IHRyYW5zYWN0aW9uYWwgZGF0YSBzdG9yZS4KLTwvbGk+Ci08bGk+V2ViS2l0IGxpYnJhcnkgdG8gcG93ZXIgQW5kcm9pZCdzIFdlYktpdCBiYXNlZCBmdWxsIHdlYiBicm93c2VyLjxicj48L2xpPgotPC91bD4KLTxicj48Yj5TeXN0ZW0gc29mdHdhcmU8L2I+Ci08Yj48YnI+PC9iPgotPGJyPjwvZGl2PgotPGRpdj5BYm91dCBBbmRyb2lkJ3Mgb3BlcmF0aW5nIHN5c3RlbToKLTx1bD48bGk+QmFzZWQgb24gTGludXggMi42LjI1IGZvciBBUk0uPGJyPjwvbGk+Ci08bGk+UGxhdGZvcm0gY3VycmVudGx5IGV4cGVjdHMgQVJNIFY1VCBvciBiZXR0ZXIgYXJjaGl0ZWN0dXJlLiBTdXBwb3J0IGZvciBlYXJsaWVyIGFyY2hpdGVjdHVyZXMgY291bGQgYmUgYWRkZWQsIGJ1dCBDUFVzIHdpdGhvdXQgYW4gTU1VIHdvdWxkIGJlIGRpZmZpY3VsdCB0byBzdXBwb3J0LgotPC9saT4KLTxsaT5BIHNldCBvZiBrZXJuZWwgZW5oYW5jZW1lbnRzIGFyZSBwcm92aWRlZCB0byBzdXBwb3J0IEFuZHJvaWQuIFRoZSBwYXRjaGVzIGluY2x1ZGUgYWxhcm0sIGFzaG1lbSwgYmluZGVyLCBwb3dlciBtYW5hZ2VtZW50LCBsb3cgbWVtb3J5IGtpbGxlciwga2VybmVsIGRlZ3VnZ2VyLCBhbmQgbG9nZ2VyIDxiPi48YnI+PC9iPgotPC9saT4KLTxsaT5XaGlsZSB0aGUgcGxhdGZvcm0gaXMgZGVzaWduZWQgdG8gYmUgY2hpcHNldCBhZ25vc3RpYywgYW5kIHdpbGwgcnVuIG9uIHZpcnR1YWxseSBhbnkgQVJNLWJhc2VkIExpbnV4IGtlcm5lbCBlbnZpcm9ubWVudCwgdmVyc2lvbiAxLjAgb2YgdGhlIHBsYXRmb3JtIGhhcyBiZWVuIHRlc3RlZCBhbmQgdmVyaWZpZWQgb24gdGhlIE1TTSA3SyBjaGlwc2V0cyA8Yj4uPC9iPgotT3ZlciB0aW1lIHdlIGV4cGVjdCB0byBzZWUgc3VwcG9ydCBmb3Igb3RoZXIgbWFqb3IgY2hpcHNldHMuCi1LZXJuZWwgcGF0Y2hlcyBmb3IgTVNNIGJhc2VkIGNoaXBzZXRzIGFyZSBhbHNvIGF2YWlsYWJsZS4KLTwvbGk+Ci08bGk+RkFUMzIgZmlsZSBzeXN0ZW0gaXMgc3VwcG9ydGVkLgotPC9saT4KLTxsaT5TdXBwb3J0IGZvciBUQ1AvSVAgKFRDUCwgVURQLCBldGMpLgotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTxkaXY+QSBtaW5pbWFsIHJlZmVyZW5jZSBib290bG9hZGVyIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQgaXMgcHJvdmlkZWQuIEl0IGlzIGNhcGFibGUgb2YgYm9vdGluZyBMaW51eCBmcm9tIFJBTSwgZGVidWdnZXIsIGFuZCBOQU5EIEZsYXNoLjxicj48L2Rpdj4KLTxkaXY+PGJyPkFib3V0IEFuZHJvaWQncyBzdXBwb3J0IGZvciBkZWJ1Z2dpbmc6PGJyPjx1bD48bGk+RGVidWdnaW5nIG5hdGl2ZSBjb2RlIGlzIHN1cHBvcnRlZCB2aWEgR0RCIChHTlUgUHJvamVjdCBEZWJ1Z2dlcikgb3ZlciBVU0IuCi08L2xpPgotPGxpPkRlYnVnZ2luZyBtYW5hZ2VkIGNvZGUgaXMgc3VwcG9ydGVkIHZpYSBhbnkgSkRXUC1jb21wYXRpYmxlIGRlYnVnZ2VyIG92ZXIgVVNCLgotPC9saT4KLTxsaT5Mb2dnaW5nIGFuZCBjcmFzaCBsb2dzIHN1cHBvcnRlZCBmb3IgZGVidWdnaW5nLgotPC9saT4KLTwvdWw+Ci08Yj5TdXBwb3J0ZWQgaGFyZHdhcmUgPGJyPjwvYj4KLTx1bD48bGk+VGhlIHBsYXRmb3JtIHdpbGwgcnVuIG9uIGFsbW9zdCBvbiBhbnkgQVJNIGJhc2VkIExpbnV4IGtlcm5lbCBlbnZpcm9ubWVudC4KLTwvbGk+Ci08bGk+VGhlIHBsYXRmb3JtIHJlcXVpcmVzIGEgbWluaW11bSBvZiAxMjggTUIgb2YgUkFNIGFuZCAyNTYgTUIgb2ZGbGFzaCBtZW1vcnkuIEFuT0VNIG1heSB3YW50IHRvIHN1cHBvcnQgbW9yZSBGbGFzaCBtZW1vcnkgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBkb3dubG9hZCBtb3JlIHRoaXJkLXBhcnR5IGFwcGxpY2F0aW9ucyB0byB1c2VyIGRldmljZXMuPGJyPjwvbGk+Ci08bGk+VGhlIHBsYXRmb3JtIHdpbGwgaW50ZXJmYWNlIHdpdGggYSBiYXNlYmFuZCByYWRpbyBzdGFjayBwcm92aWRlZCBleHRlcm5hbGx5IHZpYSBhIFJhZGlvIEludGVyZmFjZSBMYXllciAoUklMKS4KLTwvbGk+Ci08bGk+ODAyLjExIGIvZyBXaS1GaQotPC9saT4KLTxsaT5TdGFuZGFyZCBVU0IgaW50ZXJmYWNlLCBpbmNsdWRpbmcgVVNCIDIuMAotPC9saT4KLTxsaT5CbHVldG9vdGggMi4wIEVEUiAoRW5oYW5jZWQgRGF0YSBSYXRlKQotPC9saT4KLTxsaT5DYW1lcmEgZm9yIHN0aWxsIGFuZCB2aWRlbyBjYXB0dXJlCi08L2xpPgotPGxpPlJlbW92YWJsZSBzdG9yYWdlCi08L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCBkaXNwbGF5PC9iPgotPGJyPjx1bD48bGk+SFZHQSByZXNvbHV0aW9uIDxicj48L2xpPgotPGxpPjE2IGJpdCBjb2xvciBkZXB0aCA8YnI+PC9saT4KLTxsaT5MYW5kc2NhcGUgYW5kIHBvcnRyYWl0IG9yaWVudGF0aW9uLCBpbmNsdWRpbmcgZHluYW1pYyBydW50aW1lIHN3aXRjaGluZwotPC9saT4KLTxsaT5GaW5nZXItYmFzZWQgdG91Y2hzY3JlZW4gbmF2aWdhdGlvbgotPC9saT4KLTwvdWw+Ci08Yj5TdXBwb3J0ZWQga2V5cGFkcyBhbmQgYnV0dG9uczwvYj4KLTxicj48dWw+PGxpPlFXRVJUWQotPC9saT4KLTxsaT41LXdheSBuYXZpZ2F0aW9uCi08L2xpPgotPGxpPkhhcmR3YXJlIGJ1dHRvbnM6IFNlbmQsIEVuZCwgSG9tZSwgQmFjaywgTWVudTwvbGk+Ci08bGk+UG93ZXIgYnV0dG9uCi08L2xpPgotPGxpPlZvbHVtZSBrZXlzICh1cCBhbmQgZG93bikKLTwvbGk+Ci08bGk+Q2FtZXJhIHRyaWdnZXIgYnV0dG9uLCBpbmNsdWRpbmcgZGV0ZWN0aW9uIGZvciBib3RoIHBhcnRpYWwgcHJlc3MgKHRvIGZvY3VzKSBhbmQgZnVsbCBwcmVzcyAodG8gYWN0dWFsbHkgdGFrZSBhIHBpY3R1cmUpCi08L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCBhdWRpbyBvdXRwdXRzPC9iPgotPGJyPjx1bD48bGk+QXVkaW8gb3V0cHV0IHZpYSB0aGUgaGVhZHBob25lIGphY2sgKG1vbm8gYW5kIHN0ZXJlbykKLTwvbGk+Ci08bGk+NjQga2JwcyBCbHVldG9vdGggYXVkaW8gc3VwcG9ydGVkPC9saT4KLTwvdWw+Ci08Yj5TdXBwb3J0ZWQgbm90aWZpY2F0aW9uczwvYj4KLTxicj48dWw+PGxpPkxFRHMKLTwvbGk+Ci08bGk+VmlicmF0aW9uCi08L2xpPgotPC91bD4KLTxiPlN1cHBvcnRlZCByYWRpbyBhbmQgdGVsZXBob255IGZlYXR1cmVzIDxicj48L2I+Ci08dWw+PGxpPkdQUlMsIEVER0UsIFVNVFMsIEhTRFBBCi08L2xpPgotPGxpPkludGVybmF0aW9uYWwgcm9hbWluZywgU01TLCBNTVMgPGJyPjwvbGk+Ci08bGk+RW1lcmdlbmN5IGNhbGwgc3VwcG9ydCA8YnI+PC9saT4KLTxsaT5TdXBwbGVtZW50YXJ5IFNlcnZpY2VzIGZvciBUZWxlcGhvbnksIGZvciBleGFtcGxlIGNhbGwgd2FpdGluZyBhbmQgY29uZmVyZW5jZSBjYWxsaW5nIDxicj48L2xpPgotPGxpPlVuc3RydWN0dXJlZCBTdXBwbGVtZW50YXJ5IFNlcnZpY2UgRGF0YSAoVVNTRCkKLTwvbGk+Ci08bGk+UmVmZXJlbmNlIFJhZGlvIEludGVyZmFjZSBMYXllciAoUklMKQotPC9saT4KLTwvdWw+Ci08L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy0xLjUuamQgYi9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXctMS41LmpkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDc0ODc0Li4wMDAwMDAwCi0tLSBhL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy0xLjUuamQKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotcGFnZS50aXRsZT1BbmRyb2lkIDEuNSBGZWF0dXJlcwotZG9jLnR5cGU9c291cmNlCi1AamQ6Ym9keQotPGgzPjxiPlJlbGVhc2UgZmVhdHVyZXMgLSBBbmRyb2lkIDEuNTwvYj4KLTwvaDM+Ci08ZGl2PjxkaXY+PGRpdj48ZGl2PjxiPlByZXZpb3VzIHJlbGVhc2UgaGlnaGxpZ2h0czwvYj4KLTo8YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL292ZXJ2aWV3LTEuMC5odG1sIj5BbmRyb2lkIDEuMDwvYT4KLTxicj48YnI+VGhpcyBwYWdlIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBvdmVydmlldyBvZiB0aGUgbmV3IGZlYXR1cmVzIGFkZGVkIHRvCi1BbmRyb2lkIDEuNS4gVG8gc2VlIHRoZSBjb2RlIGl0c2VsZiwgeW91IGNhbiBlaXRoZXIgdXNlIHRoZTxhIGhyZWY9Imh0dHA6Ly9hbmRyb2lkLmdpdC5rZXJuZWwub3JnLyI+R2l0V2ViPC9hPgotaW50ZXJmYWNlIHRvIHZpZXcgc25hcHNob3RzIG9mIHRoZSBmaWxlcywgb3IgeW91IGNhbjxhCi1ocmVmPSJ7QGRvY1Jvb3R9c291cmNlL2Rvd25sb2FkLmh0bWwiPmRvd25sb2FkPC9hPgotdGhlIHNvdXJjZSBjb2RlIG9udG8geW91ciBsb2NhbCBtYWNoaW5lLiBZb3UgY2FuIHVzZTxpPnJlcG8gaW5pdCAtdTwvaT4KLWdpdDovL2FuZHJvaWQuZ2l0Lmtlcm5lbC5vcmcvcGxhdGZvcm0vbWFuaWZlc3QuZ2l0PGk+LWIgYW5kcm9pZC0xLjU8L2k+Ci10byBkb3dubG9hZCB0aGUgc291cmNlIGNvZGUgZm9yIEFuZHJvaWQgMS41Ljxicj48YnI+PGI+VXNlciBpbnRlcmZhY2UgcmVmaW5lbWVudHM6PC9iPgotPGJyPjx1bD48bGk+U3lzdGVtLXdpZGU6Ci08dWw+PGxpPlJlZmluZW1lbnQgb2YgYWxsIGNvcmUgVUkgZWxlbWVudHMKLTwvbGk+Ci08bGk+QW5pbWF0ZWQgd2luZG93IHRyYW5zaXRpb25zIChvZmYgYnkgZGVmYXVsdCkKLTwvbGk+Ci08bGk+QWNjZWxlcm9tZXRlci1iYXNlZCBhcHBsaWNhdGlvbiByb3RhdGlvbnMKLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5VSSBwb2xpc2ggZm9yOgotPHVsPjxsaT5Jbi1jYWxsIGV4cGVyaWVuY2UKLTwvbGk+Ci08bGk+Q29udGFjdHMsIENhbGwgbG9nLCBhbmQgRmF2b3JpdGVzCi08L2xpPgotPGxpPlNNUyBNTVMKLTwvbGk+Ci08bGk+QnJvd3NlcgotPC9saT4KLTxsaT5DYWxlbmRhcgotPC9saT4KLTxsaT5FbWFpbAotPC9saT4KLTxsaT5DYW1lcmEgR2FsbGVyeQotPC9saT4KLTxsaT5BcHBsaWNhdGlvbiBtYW5hZ2VtZW50Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPGRpdj48Yj48YnI+UGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzOjwvYj4KLTxicj48L2Rpdj4KLTx1bD48bGk+RmFzdGVyIENhbWVyYSBzdGFydC11cCBhbmQgaW1hZ2UgY2FwdHVyZQotPC9saT4KLTxsaT5NdWNoIGZhc3RlciBhY3F1aXNpdGlvbiBvZiBHUFMgbG9jYXRpb24gKHBvd2VyZWQgYnkgU1VQTCBBR1BTKQotPC9saT4KLTxsaT5TbW9vdGhlciBwYWdlIHNjcm9sbGluZyBpbiBCcm93c2VyCi08L2xpPgotPC91bD4KLTxicj48Yj5BcHBsaWNhdGlvbnM8L2I+Ci08YnI+PHVsPjxsaT5DYW1lcmEgR2FsbGVyeQotPC9saT4KLTx1bD48bGk+VmlkZW8gcmVjb3JkaW5nCi08L2xpPgotPGxpPlZpZGVvIHBsYXliYWNrIChNUEVHLTQgM0dQIGZvcm1hdHMpCi08L2xpPgotPC91bD4KLTxsaT5Ccm93c2VyCi08L2xpPgotPHVsPjxsaT5VcGRhdGVkIHdpdGggbGF0ZXN0IFdlYmtpdCBicm93c2VyIFNxdWlycmVsZmlzaCBKYXZhc2NyaXB0IGVuZ2luZXMKLTwvbGk+Ci08bGk+Q29weSAnbiBwYXN0ZSBpbiBicm93c2VyCi08L2xpPgotPGxpPlNlYXJjaCB3aXRoaW4gYSBwYWdlCi08L2xpPgotPGxpPlVzZXItc2VsZWN0YWJsZSB0ZXh0LWVuY29kaW5nCi08L2xpPgotPGxpPlVJIGNoYW5nZXMgaW5jbHVkZToKLTwvbGk+Ci08dWw+PGxpPlVuaWZpZWQgR28gYW5kIFNlYXJjaCBib3gKLTwvbGk+Ci08bGk+VGFiYmVkIGJvb2ttYXJrcy9oaXN0b3J5L21vc3QtdmlzaXRlZCBzY3JlZW4KLTwvbGk+Ci08L3VsPgotPC91bD4KLTxsaT5Db250YWN0cwotPC9saT4KLTx1bD48bGk+U2hvd3MgdXNlciBwaWN0dXJlIGZvciBGYXZvcml0ZXMKLTwvbGk+Ci08bGk+U3BlY2lmaWMgZGF0ZS90aW1lIHN0YW1wIGZvciBldmVudHMgaW4gY2FsbCBsb2cKLTwvbGk+Ci08bGk+T25lLXRvdWNoIGFjY2VzcyB0byBhIGNvbnRhY3QgY2FyZCBmcm9tIGNhbGwgbG9nIGV2ZW50Ci08L2xpPgotPC91bD4KLTwvdWw+Ci08Yj48YnI+QXBwbGljYXRpb24gZnJhbWV3b3JrPC9iPgotPGJyPjxicj48L2Rpdj4KLTxkaXY+PHVsPjxsaT5Pbi1zY3JlZW4gc29mdCBrZXlib2FyZAotPC9saT4KLTx1bD48bGk+V29ya3MgaW4gYm90aCBwb3J0cmFpdCBhbmQgbGFuZHNjYXBlIG9yaWVudGF0aW9uCi08L2xpPgotPGxpPlN1cHBvcnQgZm9yIHVzZXIgaW5zdGFsbGF0aW9uIG9mIDNyZCBwYXJ0eSBrZXlib2FyZHMKLTwvbGk+Ci08bGk+VXNlciBkaWN0aW9uYXJ5IGZvciBjdXN0b20gd29yZHMKLTwvbGk+Ci08L3VsPgotPGxpPkhvbWUgc2NyZWVuCi08L2xpPgotPHVsPjxsaT5XaWRnZXRzCi08L2xpPgotPHVsPjxsaT5CdW5kbGVkIGhvbWUgc2NyZWVuIHdpZGdldHMgaW5jbHVkZTogYW5hbG9nIGNsb2NrLCBjYWxlbmRhciwgbXVzaWMgcGxheWVyLCBwaWN0dXJlIGZyYW1lLCBhbmQgc2VhcmNoCi08L2xpPgotPC91bD4KLTxsaT5MaXZlIGZvbGRlcnMKLTwvbGk+Ci08L3VsPgotPGxpPlVJIGZyYW1ld29yawotPC9saT4KLTx1bD48bGk+RnJhbWV3b3JrIGZvciBlYXNpZXIgYmFja2dyb3VuZC9VSSB0aHJlYWQgaW50ZXJhY3Rpb24KLTwvbGk+Ci08bGk+TmV3IFNsaWRpbmdEcmF3ZXIgd2lkZ2V0Ci08L2xpPgotPGxpPkhvcml6b250YWwgU2Nyb2xsVmlldyB3aWRnZXQKLTwvbGk+Ci08L3VsPgotPGxpPkhvbWUgU2NyZWVuIGZyYW1ld29yawotPC9saT4KLTx1bD48bGk+QVBJcyBmb3IgY3JlYXRpbmcgc2VjdXJlIGhvbWUgc2NyZWVuIHdpZGdldHMKLTwvbGk+Ci08bGk+QVBJcyBmb3IgcG9wdWxhdGluZyBsaXZlIGZvbGRlcnMgd2l0aCBjdXN0b20gY29udGVudAotPC9saT4KLTwvdWw+Ci08bGk+TWVkaWEgZnJhbWV3b3JrCi08L2xpPgotPHVsPjxsaT5SYXcgYXVkaW8gcmVjb3JkaW5nIGFuZCBwbGF5YmFjayBBUElzCi08L2xpPgotPGxpPkludGVyYWN0aXZlIE1JREkgcGxheWJhY2sgZW5naW5lCi08L2xpPgotPGxpPlZpZGVvIHJlY29yZGluZyBBUElzIGZvciBkZXZlbG9wZXJzICgzR1AgZm9ybWF0KQotPC9saT4KLTxsaT5WaWRlbyBhbmQgcGhvdG8gc2hhcmluZyBJbnRlbnRzCi08L2xpPgotPGxpPk1lZGlhIHNlYXJjaCBJbnRlbnQKLTwvbGk+Ci08L3VsPgotPGxpPklucHV0IE1ldGhvZCBmcmFtZXdvcmsKLTwvbGk+Ci08dWw+PGxpPlRleHQgcHJlZGljdGlvbiBlbmdpbmUKLTwvbGk+Ci08bGk+QWJpbGl0eSB0byBwcm92aWRlIGRvd25sb2FkYWJsZSBJTUVzIHRvIHVzZXJzCi08L2xpPgotPC91bD4KLTxsaT5TcGVlY2ggcmVjb2duaXRpb24gZnJhbWV3b3JrCi08L2xpPgotPHVsPjxsaT5TdXBwb3J0IGZvciB1c2luZyBzcGVlY2ggcmVjb2duaXRpb24gbGlicmFyaWVzIHZpYSBJbnRlbnQKLTwvbGk+Ci08L3VsPgotPGxpPk1pc2MgQVBJIGFkZGl0aW9ucwotPC9saT4KLTx1bD48bGk+TG9jYXRpb25NYW5hZ2VyIC0gQXBwbGljYXRpb25zIGNhbiBnZXQgbG9jYXRpb24gY2hhbmdlIHVwZGF0ZXMgdmlhIEludGVudAotPC9saT4KLTxsaT5XZWJWaWV3IC0gVG91Y2ggc3RhcnQvZW5kL21vdmUvY2FuY2VsIERPTSBldmVudCBzdXBwb3J0Ci08L2xpPgotPGxpPlNlbnNvck1hbmFnZXIgLSByZWRlc2lnbmVkIHNlbnNvciBBUElzCi08L2xpPgotPGxpPkdMU3VyZmFjZVZpZXcgLSBjb252ZW5pZW5jZSBmcmFtZXdvcmsgZm9yIGNyZWF0aW5nIE9wZW5HTCBhcHBsaWNhdGlvbnMKLTwvbGk+Ci08bGk+QnJvYWRjYXN0IEludGVudCBmb3IgYXBwIHVwZGF0ZSBpbnN0YWxsIHN1Y2NlZWRlZCAtIGZvciBzbW9vdGhlciBhcHAgdXBncmFkZSBleHBlcmllbmNlCi08L2xpPgotPC91bD4KLTwvdWw+Ci08L2Rpdj4KLTxkaXY+PC9kaXY+Ci08ZGl2Pjxicj48Yj5TeXN0ZW0gc29mdHdhcmU8L2I+Ci08YnI+PGJyPjwvZGl2PgotPHVsPjxsaT5OZXcgTGludXgga2VybmVsICh2ZXJzaW9uIDIuNi4yNykKLTwvbGk+Ci08bGk+U0QgY2FyZCBmaWxlc3lzdGVtIGF1dG8tY2hlY2tpbmcgYW5kIHJlcGFpcgotPC9saT4KLTxsaT5TSU0gQXBwbGljYXRpb24gVG9vbGtpdCAxLjAKLTwvbGk+Ci08L3VsPgotPGRpdj48Yj48YnI+U3VwcG9ydGVkIGhhcmR3YXJlPGJyPjwvYj4KLTx1bD48bGk+Qmx1ZXRvb3RoPC9saT4KLTx1bD48bGk+U3RlcmVvIEJsdWV0b290aCBzdXBwb3J0IChBMkRQIGFuZCBBVkNSUCBwcm9maWxlcykKLTwvbGk+Ci08bGk+QXV0by1wYWlyaW5nCi08L2xpPgotPGxpPkltcHJvdmVkIGhhbmRzZnJlZSBleHBlcmllbmNlCi08L2xpPgotPC91bD4KLTwvdWw+Ci08YnI+PGI+RGV2ZWxvcGVyIHRvb2xzPC9iPgotPGJyPjwvZGl2PgotPGRpdj48dWw+PGxpPlN1cHBvcnQgZm9yIG11bHRpcGxlIHZlcnNpb25zIG9mIEFuZHJvaWQgaW4gYSBzaW5nbGUgU0RLIGluc3RhbGxhdGlvbgotPC9saT4KLTxsaT5JbXByb3ZlZCBKVW5pdCBzdXBwb3J0IGluIEFEVAotPC9saT4KLTxsaT5FYXNpZXIgYXBwbGljYXRpb24gcGVyZm9ybWFuY2UgcHJvZmlsaW5nCi08L2xpPgotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgpkaWZmIC0tZ2l0IGEvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LmpkIGIvcGRrL2RvY3Mvc291cmNlL292ZXJ2aWV3LmpkCmluZGV4IDI3NjNjNTIuLjdjYjU5M2MgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS9vdmVydmlldy5qZAorKysgYi9wZGsvZG9jcy9zb3VyY2Uvb3ZlcnZpZXcuamQKQEAgLTEsOTMgKzEsMzYgQEAKLXBhZ2UudGl0bGU9QW5kcm9pZCAxLjYgUGxhdGZvcm0gT3ZlcnZpZXcKK3BhZ2UudGl0bGU9QW5kcm9pZCAyLjEgUGxhdGZvcm0KIGRvYy50eXBlPXNvdXJjZQogQGpkOmJvZHkKLTxwPlRoaXMgcGFnZSBwcm92aWRlcyBhIGhpZ2gtbGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIG5ldyBmZWF0dXJlcyBhZGRlZCB0bwotQW5kcm9pZCAxLjYuIFRvIHNlZSB0aGUgY29kZSBpdHNlbGYsIHlvdSBjYW4gZWl0aGVyIHVzZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9hbmRyb2lkLmdpdC5rZXJuZWwub3JnLyI+R2l0V2ViPC9hPgotaW50ZXJmYWNlIHRvIHZpZXcgc25hcHNob3RzIG9mIHRoZSBmaWxlcywgb3IgeW91IGNhbiA8YQotaHJlZj0ie0Bkb2NSb290fXNvdXJjZS9kb3dubG9hZC5odG1sIj5kb3dubG9hZDwvYT4KLXRoZSBzb3VyY2UgY29kZSBvbnRvIHlvdXIgbG9jYWwgbWFjaGluZS4gWW91IGNhbiB1c2UgPGNvZGU+cmVwbyBpbml0IC11Ci1naXQ6Ly9hbmRyb2lkLmdpdC5rZXJuZWwub3JnL3BsYXRmb3JtL21hbmlmZXN0LmdpdCAtYiBhbmRyb2lkLTEuNjwvY29kZT4KLXRvIGRvd25sb2FkIHRoZSBzb3VyY2UgY29kZSBmb3IgQW5kcm9pZCAxLjYuPC9wPgotPHA+PGk+Tm90ZTogcGxhdGZvcm0gb3ZlcnZpZXcgaW5mb3JtYXRpb24gZm9yIEFuZHJvaWQgMi54IGhhcyBub3QgeWV0IGJlZW4KLXB1Ymxpc2hlZCwgc2luY2UgdGhlIDxhCi1ocmVmPSJ7QGRvY1Jvb3R9Y29tcGF0aWJpbGl0eS9pbmRleC5odG1sIj5Db21wYXRpYmlsaXR5IFByb2dyYW08L2E+IGZvcgotQW5kcm9pZCAyLnggaGFzIG5vdCB5ZXQgbGF1bmNoZWQuIFdoZW4gdGhlIENvbXBhdGliaWx0eSBEZWZpbml0aW9uIERvY3VtZW50Ci1mb3IgMi54IGlzIHJlbGVhc2VkLCB0aGlzIHBhZ2Ugd2lsbCBiZSB1cGRhdGVkIHRvIG1hdGNoLjwvaT48L3A+Ci08cD5JbmZvcm1hdGlvbiBhYm91dCBvbGRlciBBbmRyb2lkIHJlbGVhc2VzIGlzIGFsc28gYXZhaWxhYmxlOjx1bD4KLTxsaT48YSBocmVmPSJ7QGRvY1Jvb3R9c291cmNlL292ZXJ2aWV3LTEuNS5odG1sIj5BbmRyb2lkIDEuNSBQbGF0Zm9ybSBPdmVydmlldzwvYT48L2xpPgotPGxpPjxhIGhyZWY9IntAZG9jUm9vdH1zb3VyY2Uvb3ZlcnZpZXctMS4wLmh0bWwiPkFuZHJvaWQgMS4wIFBsYXRmb3JtIE92ZXJ2aWV3PC9hPjwvbGk+Ci08L3VsPjwvcD4KLTxoMj5Vc2VyIGludGVyZmFjZSByZWZpbmVtZW50czwvaDI+Ci08aDM+UXVpY2sgU2VhcmNoIEJveCBmb3IgQW5kcm9pZCA8L2gzPgotPHA+QW5kcm9pZCAxLjYgaW5jbHVkZXMgYSByZWRlc2lnbmVkIHNlYXJjaCBmcmFtZXdvcmsgdGhhdCBwcm92aWRlcyBhIHF1aWNrLCBlZmZlY3RpdmUsIGFuZCBjb25zaXN0ZW50IHdheSBmb3IgdXNlcnMgdG8gc2VhcmNoIGFjcm9zcyBtdWx0aXBsZSBzb3VyY2Vz4oCUc3VjaCBhcyBicm93c2VyIGJvb2ttYXJrcyBoaXN0b3J5LCBjb250YWN0cywgYW5kIHRoZSB3ZWLigJRkaXJlY3RseSBmcm9tIHRoZSBob21lIHNjcmVlbi4KLTwvcD4KLTxwPjxicj48L3A+Ci08cD5UaGUgc3lzdGVtIGNvbnN0YW50bHkgbGVhcm5zIHdoaWNoIHNlYXJjaCByZXN1bHRzIGFyZSBtb3JlIHJlbGV2YW50IGJhc2VkIG9uIHdoYXQgaXMgY2xpY2tlZC4gU28gcG9wdWxhciBjb250YWN0cyBvciBhcHBzIHRoYXQgaGF2ZSBwcmV2aW91c2x5IGJlZW4gcGlja2VkIHdpbGwgYnViYmxlIHVwIHRvIHRoZSB0b3Agd2hlbiBhIHVzZXIgdHlwZXMgdGhlIGZpcnN0IGZldyBsZXR0ZXJzIG9mIGEgcmVsZXZhbnQgcXVlcnkuCi08L3A+Ci08cD48YnI+PC9wPgotPHA+VGhlIHNlYXJjaCBmcmFtZXdvcmsgYWxzbyBwcm92aWRlcyBkZXZlbG9wZXJzIGEgd2F5IHRvIGVhc2lseSBleHBvc2UgcmVsZXZhbnQgY29udGVudCBmcm9tIHRoZWlyIGFwcGxpY2F0aW9ucyBpbiBRdWljayBTZWFyY2ggQm94LgotPC9wPgotPGgzPkNhbWVyYSwgQ2FtY29yZGVyLCBhbmQgR2FsbGVyeSA8L2gzPgotPHA+QW4gdXBkYXRlZCB1c2VyIGludGVyZmFjZSBwcm92aWRlcyBhbiBpbnRlZ3JhdGVkIGNhbWVyYSwgY2FtY29yZGVyLCBhbmQgZ2FsbGVyeSBleHBlcmllbmNlLiBVc2VycyBjYW4gcXVpY2tseSB0b2dnbGUgYmV0d2VlbiBzdGlsbCBhbmQgdmlkZW8gY2FwdHVyZSBtb2Rlcy4gQWRkaXRpb25hbGx5LCB0aGUgZ2FsbGVyeSBlbmFibGVzIHVzZXJzIHRvIHNlbGVjdCBtdWx0aXBsZSBwaG90b3MgZm9yIGRlbGV0aW9uLjxicj48L3A+Ci08cD48YnI+PC9wPgotPHA+QW5kcm9pZCAxLjYgYWxzbyBwcm92aWRlcyBhIG11Y2ggZmFzdGVyIGNhbWVyYSBleHBlcmllbmNlLiBDb21wYXJlZCB0byB0aGUgcHJldmlvdXMgcmVsZWFzZSwgbGF1bmNoaW5nIHRoZSBjYW1lcmEgaXMgbm93IDM5JSBmYXN0ZXIsIGFuZCB0aGVyZSBpcyBhIDI4JSBpbXByb3ZlbWVudCBpbiB0aGUgdGltZSBmcm9tIGNvbXBsZXRpbmcgb25lIHNob3QgdG8gdGhlIG5leHQuCi08L3A+Ci08aDM+VlBOLCA4MDIuMXggPC9oMz4KLTxwPkEgbmV3IFZpcnR1YWwgUHJpdmF0ZSBOZXR3b3JrIChWUE4pIGNvbnRyb2wgcGFuZWwgaW4gU2V0dGluZ3MgYWxsb3dzIHVzZXJzIHRvIGNvbmZpZ3VyZSBhbmQgY29ubmVjdCB0byB0aGUgZm9sbG93aW5nIHR5cGVzIG9mIFZQTnM6Ci08L3A+Ci08dWw+PGxpPkwyVFAvSVBTRUMgcHJlLXNoYXJlZCBrZXkgYmFzZWQgVlBOCi0gIDwvbGk+Ci08bGk+TDJUUC9JUHNlYyBjZXJ0aWZpY2F0ZSBiYXNlZCBWUE4KLSAgPC9saT4KLTxsaT5MMlRQIG9ubHkgVlBOCi0gIDwvbGk+Ci08bGk+UFBUUCBvbmx5IFZQTgotICA8L2xpPgotPC91bD4KLTxoMz5CYXR0ZXJ5IHVzYWdlIGluZGljYXRvciA8L2gzPgotPHA+QSBuZXcgYmF0dGVyeSB1c2FnZSBzY3JlZW4gbGV0cyB1c2VycyBzZWUgd2hpY2ggYXBwcyBhbmQgc2VydmljZXMgYXJlIGNvbnN1bWluZyBiYXR0ZXJ5IHBvd2VyLiBJZiB0aGUgdXNlciBkZXRlcm1pbmVzIHRoYXQgYSBwYXJ0aWN1bGFyIHNlcnZpY2Ugb3IgYXBwbGljYXRpb24gaXMgdXNpbmcgdG9vIG11Y2ggcG93ZXIsIHRoZXkgY2FuIHRha2UgYWN0aW9uIHRvIHNhdmUgdGhlIGJhdHRlcnkgYnkgYWRqdXN0aW5nIHNldHRpbmdzLCBzdG9wcGluZyB0aGUgYXBwbGljYXRpb24sIG9yIHVuaW5zdGFsbGluZyB0aGUgYXBwbGljYXRpb24uCi08L3A+Ci08aDM+QWNjZXNzaWJpbGl0eSA8L2gzPgotPHA+VXNlcnMgd2lsbCBiZSBhYmxlIHRvIGRvd25sb2FkIG5ldyBhY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIGJ1aWx0IG9uIHRoZSBuZXcgYWNjZXNzaWJpbGl0eSBmcmFtZXdvcmsgYW5kIGVuYWJsZSB0aGVtIGluIFNldHRpbmdzLgotPC9wPgotPGgyPk5ldyBQbGF0Zm9ybSBUZWNobm9sb2dpZXMgPC9oMj4KLTxoMz5FeHBhbmRlZCBTZWFyY2ggRnJhbWV3b3JrIDwvaDM+Ci08cD5UaGUgQW5kcm9pZCBzZWFyY2ggZnJhbWV3b3JrIGhhcyBiZWVuIHJlZGVzaWduZWQgYW5kIGV4cGFuZGVkIHRvIHByb3ZpZGUgdGhpcmQtcGFydHkgYXBwbGljYXRpb25zIHRoZSBvcHBvcnR1bml0eSB0byBzdXJmYWNlIGNvbnRlbnQgZnJvbSB0aGVpciBhcHBsaWNhdGlvbnMgaW4gUXVpY2sgU2VhcmNoIEJveCwgdGhlIGdsb2JhbCBzZWFyY2ggdG9vbC4gVG8gZG8gdGhpcywgZGV2ZWxvcGVycyB3aWxsIG5lZWQgdG8gbWFrZSB0aGVpciBhcHAgInNlYXJjaGFibGUiIGFuZCBwcm92aWRlIHN1Z2dlc3Rpb25zIGluIHJlc3BvbnNlIHRvIHVzZXIgcXVlcmllcy4gVG8gZW5hYmxlIGFwcGxpY2F0aW9uIHNlYXJjaCBzdWdnZXN0aW9ucywgdXNlcnMgc2ltcGx5IHNlbGVjdCBlYWNoIGFwcGxpY2F0aW9uIGZyb20gd2hpY2ggdGhleSdkIGxpa2UgdG8gcmVjZWl2ZSBzdWdnZXN0aW9ucywgdW5kZXIgU2VhcmNoYWJsZSBpdGVtcyBpbiB0aGUgU2VhcmNoIHNldHRpbmdzLgotPC9wPgotPGgzPlRleHQtdG8tc3BlZWNoIGVuZ2luZTwvaDM+Ci08cD5BbmRyb2lkIDEuNiBmZWF0dXJlcyBhIG11bHRpLWxpbmd1YWwgc3BlZWNoIHN5bnRoZXNpcyBlbmdpbmUgY2FsbGVkIFBpY28uIEl0IGFsbG93cyBhbnkgQW5kcm9pZCBhcHBsaWNhdGlvbiB0byAic3BlYWsiIGEgc3RyaW5nIG9mIHRleHQgd2l0aCBhbiBhY2NlbnQgdGhhdCBtYXRjaGVzIHRoZSBsYW5ndWFnZS4gVGhlIGVuZ2luZSBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGxhbmd1YWdlczogRW5nbGlzaCAoQW1lcmljYW4gYW5kIEJyaXRpc2ggYWNjZW50cyksIEZyZW5jaCwgSXRhbGlhbiwgR2VybWFuIGFuZCBTcGFuaXNoLiBJZiB5b3UncmUgdXNpbmcgYSBULU1vYmlsZSBHMSBvciBEcmVhbSBkZXZpY2UsIHlvdSdsbCBuZWVkIHRvIGRvd25sb2FkIHRoZSBTcGVlY2hTeW50aGVzaXMgRGF0YSBJbnN0YWxsZXIgZnJvbSBBbmRyb2lkIE1hcmtldCwgd2hpY2ggaW5jbHVkZXMgdGhlICJ2b2ljZXMiIG5lZWRlZCBieSB0aGUgdGV4dC10by1zcGVlY2ggZW5naW5lLgotPC9wPgotPGgzPkdlc3R1cmVzIDwvaDM+Ci08cD5BIG5ldyBnZXN0dXJlcyBmcmFtZXdvcmsgcHJvdmlkZXMgYXBwbGljYXRpb24gZGV2ZWxvcGVycyB3aXRoIGEgZnJhbWV3b3JrIGZvciBjcmVhdGluZywgc3RvcmluZywgbG9hZGluZywgYW5kIHJlY29nbml6aW5nIGdlc3R1cmVzIGFuZCBhc3NvY2lhdGluZyB0aGVtIHdpdGggc3BlY2lmaWMgYWN0aW9ucy4KLTwvcD4KLTxwPkRldmVsb3BlcnMgY2FuIHVzZSB0aGUgbmV3IEdlc3R1cmVCdWlsZGVyIHRvb2wgaW5jbHVkZWQgaW4gdGhlIEFuZHJvaWQgMS42IFNESyB0byBnZW5lcmF0ZSBsaWJyYXJpZXMgb2YgZ2VzdHVyZXMgdG8gaW5jbHVkZSB3aXRoIHRoZWlyIGFwcGxpY2F0aW9uLgotPC9wPgotPGgzPkFjY2Vzc2liaWxpdHkgPC9oMz4KLTxwPkFuZHJvaWQgMS42IHByb3ZpZGVzIGEgbmV3IGFjY2Vzc2liaWxpdHkgZnJhbWV3b3JrLiBXaXRoIHRoaXMgZnJhbWV3b3JrLCBkZXZlbG9wZXJzIGNhbiBjcmVhdGUgYWNjZXNzaWJpbGl0eSBwbHVnaW5zIHRoYXQgcmVzcG9uZCB0byB1c2VyIGlucHV0LCBzdWNoIGFzIG1ha2luZyBhIHNvdW5kIHdoZW4gYSBuZXcgd2luZG93IGlzIHNob3duLCB2aWJyYXRpbmcgd2hlbiBuYXZpZ2F0aW5nIHRvIHRoZSB0b3Agb2YgYSBsaXN0LCBhbmQgcHJvdmlkaW5nIHNwb2tlbiBmZWVkYmFjay4KLTwvcD4KLTxoMz5FeHBhbmRlZCBzdXBwb3J0IGZvciBzY3JlZW4gZGVuc2l0aWVzIGFuZCByZXNvbHV0aW9ucyA8L2gzPgotPHA+QW5kcm9pZCAxLjYgYWRkcyBzY3JlZW4gc3VwcG9ydCB0aGF0IGVuYWJsZXMgYXBwbGljYXRpb25zIHRvIGJlIHJlbmRlcmVkIHByb3Blcmx5IG9uIGRpZmZlcmVudCBkaXNwbGF5IHJlc29sdXRpb25zIGFuZCBkZW5zaXRpZXMuIERldmVsb3BlcnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygc2NyZWVucyBzdXBwb3J0ZWQgYnkgdGhlaXIgYXBwbGljYXRpb24uCi08L3A+Ci08aDM+VGVsZXBob255IHN1cHBvcnQgZm9yIENETUEgPC9oMz4KLTxwPkFuZHJvaWQgMS42IGluY2x1ZGVzIHN1cHBvcnQgZm9yIENETUEgaW4gdGhlIHRlbGVwaG9ueSBzdGFjay4KLTwvcD4KLTxoMz5OZXcgdmVyc2lvbiBvZiBPcGVuQ29yZSA8L2gzPgotPHA+QW5kcm9pZCAxLjYgaW5jbHVkZXMgdGhlIHVwZGF0ZWQgT3BlbkNvcmUgMiBtZWRpYSBlbmdpbmUsIHdoaWNoIGhhczoKLTwvcD4KLTx1bD48bGk+U3VwcG9ydCBmb3IgT3Blbk1BWCBlbmNvZGVycwotICA8L2xpPgotPGxpPlN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgYXVkaW8gY29kZWNzIGluIEF1dGhvckVuZ2luZQotICA8L2xpPgotPGxpPkltcHJvdmVkIGJ1ZmZlcmluZyBtb2RlbCBzdXBwb3J0cyBzaGFyZWQgYnVmZmVycyBhbGxvY2F0ZWQgaW4gdGhlIGRlY29kZXIKLSAgPC9saT4KLTwvdWw+Ci08aDM+Mi42LjI5IExpbnV4IGtlcm5lbCA8L2gzPgotPHA+QW5kcm9pZCAxLjYgdXBncmFkZXMgdGhlIExpbnV4IGtlcm5lbCBmcm9tIDIuNi4yNyB0byAyLjYuMjkuCi08L3A+Ci08aDI+TmV3IEZyYW1ld29yayBBUElzPC9oMj4KLTxwPkZvciBhIGRldGFpbGVkIG92ZXJ2aWV3IG9mIG5ldyBBUElzLCBzZWUgdGhlIDxhCi1ocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkLTEuNi5odG1sI2FwaS1jaGFuZ2VzIj5WZXJzaW9uCi1Ob3RlczwvYT4uIEZvciBhIGNvbXBsZXRlIHJlcG9ydCBvZiBhbGwgQVBJIGNoYW5nZXMsIHNlZSB0aGUgPGEKLWhyZWY9Imh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vc2RrL2FwaV9kaWZmLzQvY2hhbmdlcy5odG1sIj5BUEkKLURpZmZlcmVuY2VzIFJlcG9ydDwvYT4uPC9wPgorPHA+T3VyIHNpc3RlciBzaXRlLCA8YQoraHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS8iPmh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vPC9hPiwgCitpbmNsdWRlcyBmZWF0dXJlIG92ZXJ2aWV3cyBvZiB0aGUgdmFyaW91cyBBbmRyb2lkIHBsYXRmb3JtIHZlcnNpb25zLgorVGhlIGxpbmtzIGJlbG93IHdpbGwgdGFrZSB5b3UgdG8gZGV2ZWxvcGVyLmFuZHJvaWQuY29tIHdoZXJlIHlvdSBjYW4gdmlldyB0aGlzCitpbmZvcm1hdGlvbi48L3A+Cis8cD5UaGUgbGlua3MgYmVsb3cgd2lsbCBuYXZpZ2F0ZSB5b3UgYXdheSBmcm9tIHRoaXMgc2l0ZS48L3A+Cis8cD48aT5Ob3RlOiB0aGlzIHBhZ2Ugd2lsbCBiZSB1cGRhdGVkIHRvIGNvdmVyIEFuZHJvaWQgMi4yIHdoZW4gdGhlCitmb3JtYWwgY29tcGF0aWJpbGl0eSBwcm9ncmFtIGZvciBBbmRyb2lkIDIuMiBpcyBsYXVuY2hlZCwgd2hpY2ggd2lsbCBvY2N1ciBpbgordGhlIG5lYXIgZnV0dXJlLjwvaT48L3A+Cis8aDM+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC0yLjAtaGlnaGxpZ2h0cy5odG1sIj5BbmRyb2lkCisyLjE8L2E+PC9oMz4KKzxwPkFuZHJvaWQgMi4xIGNvcnJlc3BvbmRlZCB0byB0aGUgIkVjbGFpciIgbWlsZXN0b25lIGJyYW5jaCwgYW5kIGhhcyBhbiBBUEkgbGV2ZWwgb2YKKzcuPC9wPgorPHA+VGhlIEVjbGFpciBicmFuY2ggd2FzIGFsc28gdXNlZCBmb3IgMi4wIGFuZCAyLjAuMTsgaG93ZXZlciwgYm90aCBvZiB0aG9zZQorcmVsZWFzZXMgd2VyZSBxdWlja2x5IG9ic29sZXRlZCBieSB0aGUgdmVyc2lvbiAyLjEgRWNsYWlyIHJlbGVhc2UuIEFzIEFuZHJvaWQKKzIuMSBpbmNsdWRlcyBrZXkgYnVnIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMgbm90IHByZXNlbnQgaW4gMi4wLzIuMC4xLCBvbmx5CitBbmRyb2lkIDIuMSBzaG91bGQgYmUgdXNlZCBmb3IgbmV3IGRldmljZXMuIEFzIHRoZXJlIGlzIG5vIGNvbXBhdGliaWxpdHkKK3Byb2dyYW0gZm9yIDIuMCBvciAyLjAuMSwgdGhlIG9mZmljaWFsbHkgY29tcGF0aWJsZSBFY2xhaXItYmFzZWQgcmVsZWFzZSBpcyBBbmRyb2lkCisyLjEuIChUaGUgbGlua2VkIGRvY3VtZW50IHJlZmVycyB0byBBbmRyb2lkIDIuMCwgYmVjYXVzZSB0aGVyZSB3ZXJlCitubyBuZXcgcGxhdGZvcm0gZmVhdHVyZXMgYWRkZWQgaW4gMi4xLik8L3A+Cis8aDM+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC0xLjYtaGlnaGxpZ2h0cy5odG1sIj5BbmRyb2lkIDEuNjwvYT48L2gzPgorPHA+QW5kcm9pZCAxLjYgY29ycmVzcG9uZGVkIHRvIHRoZSAiRG9udXQiIG1pbGVzdG9uZSBicmFuY2gsIGFuZCBoYXMgYW4gQVBJIGxldmVsIG9mCis0LjwvcD4KKzxoMz48YSBocmVmPSJodHRwOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3Nkay9hbmRyb2lkLTEuNS1oaWdobGlnaHRzLmh0bWwiPkFuZHJvaWQgMS41PC9hPjwvaDM+Cis8cD5BbmRyb2lkIDEuNSBjb3JyZXNwb25kZWQgdG8gdGhlICJDdXBjYWtlIiBtaWxlc3RvbmUgYnJhbmNoLCBhbmQgaGFzIGFuIEFQSQorbGV2ZWwgb2YgMy48L3A+Cis8aDM+PGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9zZGsvYW5kcm9pZC0xLjEuaHRtbCI+QW5kcm9pZCAxLjE8L2E+PC9oMz4KKzxwPkFuZHJvaWQgMS4xIGhhcyBhbiBBUEkgbGV2ZWwgb2YgMi4gQW5kcm9pZCAxLjEgd2FzIGtub3duIGFzCisiUGV0aXQgRm91ciIgaW50ZXJuYWxseSwgdGhvdWdoIHRoaXMgbmFtZSB3YXMgbm90IHVzZWQgb2ZmaWNpYWxseS48L3A+Cis8aDM+QW5kcm9pZCAxLjA8L2gzPgorPHA+d2FzIHRoZSBmaXJzdCByZWxlYXNlIG9mIEFuZHJvaWQsIGFuZCBoYXMgYW4gQVBJCitsZXZlbCBvZiAxLiBTaW5jZSBpdCB3YXMgdGhlIGZpcnN0IHJlbGVhc2VkIHZlcnNpb24gb2YgQW5kcm9pZCwgbm8gcGxhdGZvcm0KK2hpZ2hsaWdodHMgd2VyZSBwcmVwYXJlZCBmb3IgdGhpcyByZWxlYXNlLjwvcD4KZGlmZiAtLWdpdCBhL3Bkay9kb2NzL3NvdXJjZS9yZXBvcnQtYnVncy5qZCBiL3Bkay9kb2NzL3NvdXJjZS9yZXBvcnQtYnVncy5qZAppbmRleCAxMzgwODBkLi5hNmU1NmM2IDEwMDY0NAotLS0gYS9wZGsvZG9jcy9zb3VyY2UvcmVwb3J0LWJ1Z3MuamQKKysrIGIvcGRrL2RvY3Mvc291cmNlL3JlcG9ydC1idWdzLmpkCkBAIC03Nyw3ICs3Nyw3IEBACiAKIHB1YmxpYyBjbGFzcyBUZXN0T2JqZWN0TnVsbCBleHRlbmRzIEFjdGl2aXR5IHsKICAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCi0gICAgQE92ZXJyaWRlCisgICAgJiM2NDtPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBpY2ljbGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoaWNpY2xlKTsKICAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQubWFpbik7CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2Uvcm9sZXMuamQgYi9wZGsvZG9jcy9zb3VyY2Uvcm9sZXMuamQKaW5kZXggNDUxYzgyMS4uZjRmYjg5MSAxMDA2NDQKLS0tIGEvcGRrL2RvY3Mvc291cmNlL3JvbGVzLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS9yb2xlcy5qZApAQCAtMTUsMjIgKzE1LDIyIEBACiAKIDxoMj5Db250cmlidXRvcjwvaDI+CiA8cD5BICJDb250cmlidXRvciIgaXMgYW55b25lIG1ha2luZyBjb250cmlidXRpb25zIHRvIHRoZSBBT1NQIHNvdXJjZSBjb2RlLAotaW5jbHVkaW5nIGJvdGggZW1wbG95ZWVzIG9mIEdvb2dsZSBvciBvdGhlciBjb21wYW5pZXMsIGFzIHdlbGwgYXMKLWV4dGVybmFsIGRldmVsb3BlcnMgd2hvIGFyZSBjb250cmlidXRpbmcgdG8gQW5kcm9pZCBvbiB0aGVpciBvd24gYmVoYWxmLgotVGhlcmUgaXMgbm8gZGlzdGluY3Rpb24gYmV0d2VlbiBDb250cmlidXRvcnMgd2hvIGFyZSBlbXBsb3llZCBieSAKLUdvb2dsZSwgYW5kIHRob3NlIHdobyBhcmUgbm90OiBhbGwgZW5naW5lZXJzIHVzZSB0aGUgc2FtZSBnaXQvZ2Vycml0IHRvb2xzLCAKLWZvbGxvdyB0aGUgc2FtZSBjb2RlIHJldmlldyBwcm9jZXNzLCBhbmQgYXJlIHN1YmplY3QgdG8gdGhlIHNhbWUgcmVxdWlyZW1lbnRzCi1vbiBjb2RlIHN0eWxlIGFuZCBzbyBvbi48L3A+CitpbmNsdWRpbmcgYm90aCBlbXBsb3llZXMgb2YgR29vZ2xlIG9yIG90aGVyIGNvbXBhbmllcywgYXMgd2VsbCBhcyBleHRlcm5hbAorZGV2ZWxvcGVycyB3aG8gYXJlIGNvbnRyaWJ1dGluZyB0byBBbmRyb2lkIG9uIHRoZWlyIG93biBiZWhhbGYuICBUaGVyZSBpcyBubworZGlzdGluY3Rpb24gYmV0d2VlbiBDb250cmlidXRvcnMgd2hvIGFyZSBlbXBsb3llZCBieSBHb29nbGUsIGFuZCB0aG9zZSB3aG8gYXJlCitub3Q6IGFsbCBlbmdpbmVlcnMgdXNlIHRoZSBzYW1lIHRvb2xzICg8Y29kZT5naXQ8L2NvZGU+LCA8Y29kZT5yZXBvPC9jb2RlPiwKK2FuZCA8Y29kZT5nZXJyaXQ8L2NvZGU+KSwgZm9sbG93IHRoZSBzYW1lIGNvZGUgcmV2aWV3IHByb2Nlc3MsIGFuZCBhcmUgc3ViamVjdAordG8gdGhlIHNhbWUgcmVxdWlyZW1lbnRzIG9uIGNvZGUgc3R5bGUgYW5kIHNvIG9uLjwvcD4KIDxwLz4KIAogPGgyPkRldmVsb3BlcjwvaDI+CiA8cD5BICJEZXZlbG9wZXIiIGlzIGFuIGVuZ2luZWVyIHdyaXRpbmcgYXBwbGljYXRpb25zIHRoYXQgcnVuIG9uIEFuZHJvaWQKIGRldmljZXMuIFRoZXJlIGlzLCBvZiBjb3Vyc2UsIG5vIGRpZmZlcmVuY2UgaW4gc2tpbGxzZXQgYmV0d2VlbiBhICJEZXZlbG9wZXIiCi1hbmQgYSAiQ29udHJpYnV0b3IiOyBBT1NQIHNpbXBseSB1c2VzICJEZXZlbG9wZXIiIHRvIGhlbHAgaWRlbnRpZnkgb3VyIGF1ZGllbmNlLgotU2luY2UgdGhlIGtleSBwdXJwb3NlIG9mIEFuZHJvaWQgaXMgdG8gY3VsdGl2YXRlIGFuIG9wZW4gZGV2ZWxvcG1lbnQgcGxhdGZvcm0sCi0iRGV2ZWxvcGVycyIgYXJlIG9uZSBvZiB0aGUga2V5IGN1c3RvbWVycyBvZiB0aGUgQW5kcm9pZCBwbGF0Zm9ybS4gQXMgc3VjaCwgd2UKLXRhbGsgYWJvdXQgdGhlbSBhIGxvdCwgdGhvdWdoIHRoaXMgaXNuJ3QgdGVjaG5pY2FsbHkgYSBzZXBhcmF0ZSByb2xlIGluIHRoZQotQU9TUCA8aT5wZXIgc2UuPC9pPjwvcD4KK2FuZCBhICJDb250cmlidXRvciIsIGJ1dCBBT1NQIHVzZXMgIkRldmVsb3BlciIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbgorZW5naW5lZXJzIHVzaW5nIHRoZSBwbGF0Zm9ybSBhbmQgdGhvc2UgY29udHJpYnV0aW5nIHRvIGl0LiBEZXZlbG9wZXJzIGFyZQorKGFsb25nIHdpdGggZW5kIHVzZXJzKSB0aGUgImN1c3RvbWVycyIgb2YgdGhlIHBsYXRmb3JtIHRoYXQgdGhlIENvbnRyaWJ1dG9ycworY3JlYXRlLiBBcyBzdWNoLCB3ZSB0YWxrIGFib3V0IERldmVsb3BlcnMgYSBsb3QsIHRob3VnaCB0aGlzIGlzbid0IHRlY2huaWNhbGx5CithIHNlcGFyYXRlIHJvbGUgaW4gdGhlIEFPU1AgPGk+cGVyIHNlLjwvaT48L3A+CiA8cC8+CiAKIDxoMj5WZXJpZmllcjwvaDI+CkBAIC02MiwxMiArNjIsMTIgQEAKICAgcmVsZWFzZXMuPC9saT4KICAgPGxpPkRlc2lnbmF0ZSBWZXJpZmllcnMgYW5kIEFwcHJvdmVycyBmb3Igc3VibWl0dGVkIHBhdGNoZXMuPC9saT4KICAgPGxpPkJlIGZhaXIgYW5kIHVuYmlhc2VkIHdoaWxlIHJldmlld2luZyBjaGFuZ2VzLiBBY2NlcHQgb3IgcmVqZWN0IHBhdGNoZXMKLSAgYmFzZWQgb24gdGVjaG5pY2FsIG1lcml0IGFuZCBhbGlnbm1lbnQgd2l0aCB0aGUgQW5kcm9pZCBwbGF0Zm9ybS48L2xpPgorICBiYXNlZCBvbiB0ZWNobmljYWwgbWVyaXQgYW5kIGFsaWdubWVudCB3aXRoIHRoZSBBbmRyb2lkIHN0cmF0ZWd5LjwvbGk+CiAgIDxsaT5SZXZpZXcgY2hhbmdlcyBpbiBhIHRpbWVseSBtYW5uZXIgYW5kIG1ha2UgYmVzdCBlZmZvcnRzIHRvIGNvbW11bmljYXRlCiAgIHdoZW4gY2hhbmdlcyBhcmUgbm90IGFjY2VwdGVkLjwvbGk+CiAgIDxsaT5PcHRpb25hbGx5IG1haW50YWluIGEgd2ViIHNpdGUgZm9yIHRoZSBwcm9qZWN0IGZvciBpbmZvcm1hdGlvbiBhbmQKICAgZG9jdW1lbnRzIHNwZWNpZmljIHRvIHRoZSBwcm9qZWN0LjwvbGk+CiAgIDxsaT5BY3QgYXMgYSBmYWNpbGl0YXRvciBpbiByZXNvbHZpbmcgdGVjaG5pY2FsIGNvbmZsaWN0cy48L2xpPgotICA8bGk+QmUgdGhlIHB1YmxpYyBmYWNlIGZvciB0aGUgcHJvamVjdCBhbmQgdGhlIGdvLXRvIHBlcnNvbiBmb3IgcXVlc3Rpb25zCisgIDxsaT5CZSBhIHB1YmxpYyBmYWNlIGZvciB0aGUgcHJvamVjdCBhbmQgdGhlIGdvLXRvIHBlcnNvbiBmb3IgcXVlc3Rpb25zCiAgIHJlbGF0ZWQgdG8gdGhlIHByb2plY3QuPC9saT4KIDwvdWw+CmRpZmYgLS1naXQgYS9wZGsvZG9jcy9zb3VyY2UvdXNpbmctZWNsaXBzZS5qZCBiL3Bkay9kb2NzL3NvdXJjZS91c2luZy1lY2xpcHNlLmpkCmluZGV4IDU2ZGY3MTMuLjY2MGRlMTEgMTAwNjQ0Ci0tLSBhL3Bkay9kb2NzL3NvdXJjZS91c2luZy1lY2xpcHNlLmpkCisrKyBiL3Bkay9kb2NzL3NvdXJjZS91c2luZy1lY2xpcHNlLmpkCkBAIC05NSw1OCArOTUsNiBAQAogPHA+V2hlbiB5b3UncmUgZG9uZSwgdGhlICJzb3VyY2UgZm9sZGVyIiBwYXRoIGluIHRoZSBsaXN0IHNob3VsZCBsb29rIGxpa2UgYW5kcm9pZC9wYWNrYWdlcy9hcHBzLzxpPllvdXJBcHBOYW1lPC9pPgogL3NyYy4gRGVwZW5kaW5nIG9uIHdoaWNoIGFwcChzKSB5b3UgaW5jbHVkZSwgeW91IG1heSBhbHNvIG5lZWQgdG8gaW5jbHVkZSBvdGhlcnNyYy9tYWluL2phdmEgZGlyZWN0b3JpZXMgdW5kZXIgYW5kcm9pZC9kYWx2aWsvbGliY29yZS4gRG8gdGhpcyBpZiB5b3UgZmluZCB5b3UgY2Fubm90IGJ1aWxkIHdpdGggdGhlIGRlZmF1bHQgc2V0LgogPC9wPgotPGg0PgotRWNsaXBzZSBzZXR1cCB0byB3b3JrIG9uIGRldmVsb3BlciB0b29scwotPC9oND4KLTxwPlRvIHdvcmsgb24gSmF2YSBkZXZlbG9wZXIgdG9vbHMsIHRoZSBwcmluY2lwbGUgaXMgdGhlIHNhbWUsIGV4Y2VwdCB5b3Ugc3BlY2lmeSAvcGF0aC90by90b29sIHdoZW4gdXNpbmcgdGhlIG9wdGlvbiAiQ3JlYXRlIHByb2plY3QgZnJvbSBleGlzdGluZyBzb3VyY2UuIgotPC9wPgotPHA+T25jZSB0aGUgcHJvamVjdCBpcyBjcmVhdGVkLCB5b3UgbmVlZCB0byBzZXQgdXAgdGhlIEphdmEgQnVpbGQgUGF0aDoKLTwvcD4KLTxvbD48bGk+U2VsZWN0IHRoZSBwcm9qZWN0IHlvdSBqdXN0IGNyZWF0ZWQuCi08L2xpPgotPGxpPlByb2plY3QgUHJvcGVydGllcwotPC9saT4KLTxsaT5TZWxlY3QgIkphdmEgQnVpbGQgUGF0aCIgZnJvbSB0aGUgbGVmdC1oYW5kIG1lbnUuCi08L2xpPgotPGxpPkNob29zZSB0aGUgIlNvdXJjZSIgdGFiLgotPC9saT4KLTxsaT5FeHBhbmQgdGhlIHNpbmdsZSA8aT50b29sbmFtZTwvaT4KLS9zcmMgZW50cnkuCi08L2xpPgotPGxpPkRvdWJsZSBjbGljayB0aGUgIkV4Y2x1ZGVkOiAobm9uZSkiIGl0ZW0uCi08L2xpPgotPGxpPkFkZCB0byB0aGUgZXhjbHVkZWQgKGJvdHRvbSkgbGlzdDogIk1ha2VGaWxlIiBhbmQgInJlc291cmNlcy8iLgotPC9saT4KLTxsaT5DbG9zZSB0aGUgZGlhbG9nLgotPC9saT4KLTxsaT5CYWNrIGluIHRoZSAiU291cmNlIiB0YWIsIGNsaWNrICJBZGQgRm9sZGVyLi4uIiwgYW5kIGFkZCA8aT50b29sbmFtZTwvaT4KLS9zcmMvcmVzb3VyY2VzLgotPC9saT4KLTxsaT5DbGljayBPSy4KLTwvbGk+Ci08L29sPgotPGg0PgotRWNsaXBzZSBzZXR1cCB0byB3b3JrIG9uIERETVMgPGJyPjwvaDQ+Ci08cD5Gb3IgRERNUywgeW91IHdpbGwgbmVlZCB0byBtYWtlIGEgcHJvamVjdCBmb3IKLTwvcD4KLTxvbD48bGk+ZGV2ZWxvcG1lbnQvdG9vbHMvZGRtcy9saWJzL2RkbWxpYgotPC9saT4KLTxsaT5kZXZlbG9wbWVudC90b29scy9kZG1zL2xpYnMvZGRtdWlsaWIKLTwvbGk+Ci08bGk+ZGV2ZWxvcG1lbnQvdG9vbHMvZGRtcy9hcHAKLTwvbGk+Ci08L29sPgotPHA+RWFjaCBwcm9qZWN0IHdpbGwgbmVlZCB0byByZWZlcmVuY2UgdGhlIG9uZXMgYmVmb3JlIGl0ICgiZGRtdWlsaWIiIHJlZmVyZW5jZXMgImRkbWxpYiIsIGFuZCAiYXBwIiByZWZlcmVuY2VzIGJvdGggb2YgdGhvc2UpLiBUbyBkbyB0aGlzOgotPC9wPgotPG9sPjxsaT5NYWtlIHN1cmUgeW91IGhhdmUgYWxsIDMgcHJvamVjdHMgZGVmaW5lZC4KLTwvbGk+Ci08bGk+UmlnaHQgY2xpY2sgb24gYSBwcm9qZWN0LCAiQnVpbGQgUGF0aCIgIkNvbmZpZ3VyZSBCdWlsZCBQYXRoLi4uIgotPC9saT4KLTxsaT5DaG9vc2UgdGhlICJQcm9qZWN0IiB0YWIuCi08L2xpPgotPGxpPkNsaWNrICJBZGQuLi4iIGFuZCBjaGVjayB0aGUgcmVxdWlyZWQgcHJvamVjdHMuCi08L2xpPgotPC9vbD4KIDxoMj48YT5FY2xpcHNlIGZvcm1hdHRpbmc8L2E+CiA8L2gyPgogPHA+WW91IGNhbiBpbXBvcnQgZmlsZXMgaW4gZGV2ZWxvcG1lbnQvaWRlL2VjbGlwc2UgdG8gbWFrZSBFY2xpcHNlCkBAIC0xODksMTUgKzEzNyw2IEBACiAKIDxwcmU+Q3RybC1TaGlmdC1vID0gT3JnYW5pemUgaW1wb3J0cyA8YnI+Q3RybC1TaGlmdC10ID0gbG9hZCBjbGFzcyBieSBuYW1lIDxicj5DdHJsLVNoaWZ0LXIgPSBsb2FkIG5vbi1jbGFzcyByZXNvdXJjZSBieSBuYW1lIDxicj5DdHJsLTEgPSBxdWljayBmaXggPGJyPkN0cmwtZSA9IFJlY2VudGx5IHZpZXdlZCBmaWxlcyA8YnI+Q3RybC1zcGFjZSA9IGF1dG8gY29tcGxldGUgPGJyPlNoaWZ0LUFsdC1yID0gcmVmYWN0b3I6cmVuYW1lIDxicj5TaGlmdC1BbHQtdiA9IHJlZmFjdG9yOm1vdmUgPGJyPjwvcHJlPgogCi08aDI+PGE+VXNlZnVsIFBsdWdpbnM8L2E+Ci08L2gyPgotPHA+RWNsaXBzZSBoYXMgYSBwbHVnaW4gYXJjaGl0ZWN0dXJlIHRoYXQgZW5hYmxlcyB0aGlyZCBwYXJ0aWVzIHRvIGV4dGVuZCB0aGUgSURFLiBIZXJlIGFyZSBzb21lIHBsdWdpbnMgdGhhdCBtYWtlIEVjbGlwc2UgZWFzaWVyIHRvIHVzZSBmb3Igd3JpdGluZyBBbmRyb2lkIHNvZnR3YXJlOgotPC9wPgotCi08dWw+PGxpPjxhIGhyZWY9Imh0dHA6Ly9hbmRyZWkuZ214aG9tZS5kZS9hbnllZGl0LyI+QW55RWRpdDwvYT4KLS0gYXV0b21hdGljYWxseSBmaXggd2hpdGVzcGFjZSBpc3N1ZXMgd2hlbiBzYXZpbmcgZmlsZXMuIENhbiBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzLCBzdHJpcCBibGFua3MgYXQgZW5kLW9mLWxpbmUsIGFuZCBlbnN1cmUgdGhlIGxhc3QgbGluZSBvZiB0aGUgZmlsZSBoYXMgYW4gZW5kLW9mLWxpbmUgY2hhcmFjdGVyLgotPC9saT4KLTwvdWw+CiA8aDI+PGE+IkVjbGlwc2UgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5LCB3aGF0IHNob3VsZCBJIGRvPyI8L2E+CiA8L2gyPgogPHA+TWFrZSBzdXJlOgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BbGFybS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9BbGFybS9BbmRyb2lkTWFuaWZlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2E4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FsYXJtL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorICAgIERlY2xhcmVzIHRoZSBjb250ZW50cyBvZiB0aGlzIEFuZHJvaWQgYXBwbGljYXRpb24uIFRoZSB4bWxuczphbmRyb2lkCisgICAgYXR0cmlidXRlIGJyaW5ncyBpbiB0aGUgQW5kcm9pZCBwbGF0Zm9ybSBuYW1lc3BhY2UsIGFuZCB0aGUKKyAgICAicGFja2FnZSIgYXR0cmlidXRlIHByb3ZpZGVzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAgICBJZiB5b3UgdXNlIHRoaXMgZmlsZSBhcyBhIHRlbXBsYXRlIGluIHlvdXIgb3duIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCBjaGFuZ2UKKyAgICB0aGUgcGFja2FnZSBuYW1lIGZyb20gImNvbS5leGFtcGxlLmFuZHJvaWQiIHRvIG9uZSB0aGF0IHlvdSBvd24gb3IgaGF2ZQorICAgIGNvbnRyb2wgb3Zlci4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybSIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIyIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjIuMCI+CisgICAgPCEtLQorICAgICAgICBEZWNsYXJlcyB0aGUgYXBwbGljYXRpb24sIGl0cyBpY29uLCBhbmQgaXRzIHZpc2libGUgbGFiZWwKKyAgICAgLS0+CisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGRyYXdhYmxlL2ljb24iCisgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8IS0tCisgICAgICAgICAgICBEZWNsYXJlcyB0aGUgYWN0aXZpdHkncyBjbGFzcyBuYW1lIGFuZCB2aXNpYmxlIGxhYmVsLiBUaGUgbGVhZGluZyAiLiIgaW5kaWNhdGVzCisgICAgICAgICAgICB0aGF0IHRoZSBuYW1lIHNob3VsZCBiZSBwcmVjZWRlZCBieSB0aGUgYXBwbGljYXRpb24ncyBBbmRyb2lkIHBhY2thZ2UgbmFtZS4KKyAgICAgICAgIC0tPgorICAgICAgICA8YWN0aXZpdHkKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFsYXJtQWN0aXZpdHkiCisgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FwcF9uYW1lIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKyAgICAgICAgPHNlcnZpY2UKKyAgICAgICAgICAgIGFuZHJvaWQ6bmFtZT0iLkFsYXJtU2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWxhcm1fc2VydmljZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6cHJvY2Vzcz0iY29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybSI+CisgICAgICAgIDwvc2VydmljZT4KKyAgICA8L2FwcGxpY2F0aW9uPgorICAgIDx1c2VzLXNkayBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjQiIGFuZHJvaWQ6bWluU2RrVmVyc2lvbj0iMyIvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQWxhcm0vX2luZGV4Lmh0bWwgYi9zYW1wbGVzL0FsYXJtL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjUxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FsYXJtL19pbmRleC5odG1sCkBAIC0wLDAgKzEsMjkgQEAKKzxwPgorICAgIFRoaXMgc2FtcGxlIGlzIGEgcmV2aXNlZCB2ZXJzaW9uIG9mIHRoZSBBbGFybVNlcnZpY2UgZnVuY3Rpb25hbGl0eSBpbmNsdWRlZCBpbiB0aGUKKyAgICBBcGlEZW1vcyBzYW1wbGUgYXBwbGljYXRpb24uIEl0IGlzIHVzZWQgYXMgdGhlIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QKKyAgICBmb3IgdGhlIDxhIGhyZWY9Ii4uL0FsYXJtU2VydmljZVRlc3QvaW5kZXguaHRtbCI+QWxhcm0gU2VydmljZSBUZXN0PC9hPgorICAgIHNhbXBsZSB0ZXN0IGFwcGxpY2F0aW9uLgorPC9wPgorPHA+CisgICAgVGhpcyBhcHBsaWNhdGlvbiBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgQW5kcm9pZCBzZXJ2aWNlIHRoYXQgaXMgc3RhcnRlZCB3aGVuIG5lZWRlZCBieQorICAgIDxjb2RlPkNvbnRleHQuc3RhcnRTZXJ2aWNlKEludGVudCk8L2NvZGU+IGFuZCBzdG9wcyBpdHNlbGYgd2hlbiBpdHMgd29yayBpcyBkb25lLiBZb3UgY2FuCisgICAgdXNlIHRoaXMgdHlwZSBvZiBzZXJ2aWNlIHRvIG1vdmUgbG9uZy1ydW5uaW5nIG9yIHBlcmlvZGljIHRhc2tzIGludG8gdGhlIGJhY2tncm91bmQuIEZvcgorICAgIGV4YW1wbGUsIHlvdSBjb3VsZCB1c2UgdGhpcyB0eXBlIG9mIHNlcnZpY2UgdG8gcGVyZm9ybSBkYXRhIHN5bmNocm9uaXphdGlvbi4KKzwvcD4KKzxwPgorICAgIEluIHRoZSBzYW1wbGUsIHRoZSBzZXJ2aWNlIHNpbXBseSBydW5zIGZvciAxNSBzZWNvbmRzIGFuZCB0aGVuIHN0b3BzIGl0c2VsZi4gVGhlIHdhaXQgaXMKKyAgICBpbXBsZW1lbnRlZCBpbiBhIHNlcGFyYXRlIHRocmVhZCB0aGF0IHVzZXMgYSB0aHJlYWQtc2FmZSBvYmplY3QuIFRoaXMgaWxsdXN0cmF0ZXMgaG93IHRvCisgICAgc2V0IHVwIGEgc2VydmljZSB0aGF0IHJ1bnMgbXVsdGlwbGUgdGhyZWFkcyB0aGF0IGRlcGVuZCBvbiBvbmUgb3IgbW9yZSBvYmplY3RzIHRoYXQgbXVzdCBiZQorICAgIG1hZGUgdGhyZWFkLXNhZmUuCis8L3A+Cis8cD4KKyAgICBUaGUgYXBwbGljYXRpb24gYWxzbyBjb250YWlucyB0aGUgPGNvZGU+QWxhcm1BY3Rpdml0eTwvY29kZT4gYWN0aXZpdHkgdGhhdCBpcyBhIGNsaWVudCBvZiB0aGUKKyAgICBzZXJ2aWNlLiBZb3UgdXNlIHRoZSBhY3Rpdml0eSB0byBjb250cm9sIHdoZW4gdGhlIHNlcnZpY2Ugc3RhcnRzIGFuZCBzdG9wcy4gQnkgZGVmYXVsdCwgdGhlCisgICAgYWN0aXZpdHkgZmlyZXMgb2ZmIHRoZSBzZXJ2aWNlIGV2ZXJ5IHRoaXJ0eSBzZWNvbmRzLiBJbiBlZmZlY3QsIHRoZSBzZXJ2aWNlIHN0YXJ0cyBhZnRlcgorICAgIHRoaXJ0eSBzZWNvbmRzLCBydW5zIGZvciAxNSBzZWNvbmRzLCBzdG9wcywgYW5kIHRoZW4gcnVucyBhZ2FpbiBhdXRvbWF0aWNhbGx5IGluIGFub3RoZXIKKyAgICAxNSBzZWNvbmRzLiBZb3UgYWxzbyB1c2UgdGhlIGNsaWVudCB0byBzdG9wIHRoaXMgY3ljbGUuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdCBhcHBsaWNhdGlvbiA8YSBocmVmPSJ0ZXN0cy9pbmRleC5odG1sIj5BbGFybVNlcnZpY2VUZXN0PC9hPgorICAgIHNob3dzIHlvdSBob3cgdG8gc2V0IHVwIGEgdGVzdCBvZiB0aGlzIHNlcnZpY2UuCis8L3A+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3Jlcy9kcmF3YWJsZS9pY29uLnBuZyBiL3NhbXBsZXMvQWxhcm0vcmVzL2RyYXdhYmxlL2ljb24ucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZTc3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FsYXJtL3Jlcy9kcmF3YWJsZS9pY29uLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3Jlcy9kcmF3YWJsZS9zdGF0X3NhbXBsZS5wbmcgYi9zYW1wbGVzL0FsYXJtL3Jlcy9kcmF3YWJsZS9zdGF0X3NhbXBsZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmM5YmEwYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQWxhcm0vcmVzL2RyYXdhYmxlL3N0YXRfc2FtcGxlLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3Jlcy9sYXlvdXQvbWFpbi54bWwgYi9zYW1wbGVzL0FsYXJtL3Jlcy9sYXlvdXQvbWFpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3OWUyYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQWxhcm0vcmVzL2xheW91dC9tYWluLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIERlbW9uc3RyYXRlcyBzdGFydGluZyBhbmQgc3RvcHBpbmcgYSBsb2NhbCBzZXJ2aWNlLgorICAgICBTZWUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGUgY29tLmFuZHJvaWQuc2RrLmFwcC5Mb2NhbFNlcmljZS5qYXZhLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2FsYXJtX3NlcnZpY2UiLz4KKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRfYWxhcm0iCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc3RhcnRfYWxhcm1fc2VydmljZSI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zdG9wX2FsYXJtIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3N0b3BfYWxhcm1fc2VydmljZSIgLz4KKzwvTGluZWFyTGF5b3V0PgorCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0FsYXJtL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhMzRjYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQWxhcm0vcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5BbGFybTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWxhcm1fc2VydmljZSI+CisgICAgICAgIFRoaXMgc2hvd3MgaG93IHRvIHNjaGVkdWxlIGEgcmVwZWF0aW5nIGFsYXJtIHRoYXQgc3RhcnRzIGEgc2VydmljZS48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0YXJ0X2FsYXJtX3NlcnZpY2UiPlN0YXJ0IEFsYXJtIFNlcnZpY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InN0b3BfYWxhcm1fc2VydmljZSI+U3RvcCBBbGFybSBTZXJ2aWNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyZXBlYXRpbmdfc3RhcnRlZCI+CisgICAgICAgIFJlcGVhdGluZyB0aW1lciBzdGFydGVkLiBTdGFydHMgQWxhcm1TZXJ2aWNlIGV2ZXJ5IDMwIHNlY29uZHMuPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhbGFybV9zZXJ2aWNlX3N0YXJ0ZWQiPlRoZSBzYW1wbGUgc2VydmljZSBpcyBydW5uaW5nLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWxhcm1fc2VydmljZV9sYWJlbCI+U2FtcGxlIEFsYXJtIFNlcnZpY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFsYXJtX3NlcnZpY2VfZmluaXNoZWQiPlRoZSBzYW1wbGUgc2VydmljZSBpcyBubyBsb25nZXIgcnVubmluZy48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJlcGVhdGluZ19zdG9wcGVkIj4KKyAgICAgICAgUmVwZWF0aW5nIHRpbWVyIHN0b3BwZWQuIEFsYXJtU2VydmljZSB3aWxsIG5vIGxvbmdlciBiZSBzdGFydGVkLjwvc3RyaW5nPgorPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25ld2FsYXJtL0FsYXJtQWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvQWxhcm0vc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbmV3YWxhcm0vQWxhcm1BY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNjUwN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FsYXJtL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25ld2FsYXJtL0FsYXJtQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsYXJtTWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisvKioKKyAqIFRoaXMgaXMgdGhlIGFjdGl2aXR5IHRoYXQgY29udHJvbHMgQWxhcm1TZXJ2aWNlLgorICogPHA+CisgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgIlN0YXJ0IEFsYXJtIFNlcnZpY2UiIGJ1dHRvbiwgaXQgdHJpZ2dlcnMgYSByZXBlYXRpbmcgY291bnRkb3duCisgKiB0aW1lci4gRXZlcnkgdGhpcnR5IHNlY29uZHMsIHRoZSB0aW1lciBzdGFydHMgQWxhcm1TZXJ2aWNlLCB3aGljaCB0aGVuIHJ1bnMgZm9yIDE1IHNlY29uZHMKKyAqIGFuZCBzaHV0cyBpdHNlbGYgZG93bi4KKyAqIDwvcD4KKyAqIDxwPgorICogV2hlbiB0aGUgdXNlciBjbGlja3MgdGhlICJTdG9wIEFsYXJtIFNlcnZpY2UiIGJ1dHRvbiwgaXQgc3RvcHMgdGhlIGNvdW50ZG93biB0aW1lci4KKyAqIDwvcD4KKyAqLworCitwdWJsaWMgY2xhc3MgQWxhcm1BY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvLyAzMCBzZWNvbmRzIGluIG1pbGxpc2Vjb25kcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVEhJUlRZX1NFQ09ORFNfTUlMTElTID0gMzAgKiAxMDAwOworCisgICAgLy8gQW4gaW50ZW50IGZvciBBbGFybVNlcnZpY2UsIHRvIHRyaWdnZXIgaXQgYXMgaWYgdGhlIEFjdGl2aXR5IGNhbGxlZCBzdGFydFNlcnZpY2UoKS4KKyAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbUFsYXJtU2VuZGVyOworCisgICAgLy8gQ29udGFpbnMgYSBoYW5kbGUgdG8gdGhlIHN5c3RlbSBhbGFybSBzZXJ2aWNlCisgICAgcHJpdmF0ZSBBbGFybU1hbmFnZXIgbUFsYXJtTWFuYWdlcjsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIEFuZHJvaWQgc3RhcnRzIHRoZSBhY3Rpdml0eS4gSXQgaW5pdGlhbGl6ZXMgdGhlIFVJLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4gQW5kcm9pZCBzdGFydHMgdGhlIEFjdGl2aXR5CisgICAgICogPC9wPgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBQZW5kaW5nSW50ZW50IHRvIHRyaWdnZXIgYSBzdGFydFNlcnZpY2UoKSBmb3IgQWxhcm1TZXJ2aWNlCisgICAgICAgIG1BbGFybVNlbmRlciA9IFBlbmRpbmdJbnRlbnQuZ2V0U2VydmljZSggIC8vIHNldCB1cCBhbiBpbnRlbnQgZm9yIGEgY2FsbCB0byBhIHNlcnZpY2UKKyAgICAgICAgICAgIEFsYXJtQWN0aXZpdHkudGhpcywgIC8vIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgIDAsICAvLyByZXF1ZXN0IGNvZGUgKG5vdCB1c2VkKQorICAgICAgICAgICAgbmV3IEludGVudChBbGFybUFjdGl2aXR5LnRoaXMsIEFsYXJtU2VydmljZS5jbGFzcyksICAvLyBBIG5ldyBTZXJ2aWNlIGludGVudAorICAgICAgICAgICAgMCAgIC8vIGZsYWdzIChub25lIGFyZSByZXF1aXJlZCBmb3IgYSBzZXJ2aWNlKQorICAgICAgICApOworCisgICAgICAgIC8vIENyZWF0ZXMgdGhlIG1haW4gdmlldworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5tYWluKTsKKworICAgICAgICAvLyBGaW5kcyB0aGUgYnV0dG9uIHRoYXQgc3RhcnRzIHRoZSByZXBlYXRpbmcgY291bnRkb3duIHRpbWVyCisgICAgICAgIEJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0X2FsYXJtKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBsaXN0ZW5lciBmb3IgdGhlIHN0YXJ0IGJ1dHRvbgorICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdGFydEFsYXJtTGlzdGVuZXIpOworCisgICAgICAgIC8vIEZpbmRzIHRoZSBidXR0b24gdGhhdCBzdG9wcyBjb3VudGRvd24gdGltZXIKKyAgICAgICAgYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdG9wX2FsYXJtKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBsaXN0ZW5lciBmb3IgdGhlIHN0b3AgYnV0dG9uCisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVN0b3BBbGFybUxpc3RlbmVyKTsKKworICAgICAgICAvLyBHZXRzIHRoZSBoYW5kbGUgdG8gdGhlIHN5c3RlbSBhbGFybSBzZXJ2aWNlCisgICAgICAgIG1BbGFybU1hbmFnZXIgPSAoQWxhcm1NYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQUxBUk1fU0VSVklDRSk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBhbm9ueW1vdXMgY2xpY2sgbGlzdGVuZXIgZm9yIHRoZSBzdGFydCBidXR0b24uIEl0IHN0YXJ0cyB0aGUgcmVwZWF0aW5nCisgICAgLy8gIGNvdW50ZG93biB0aW1lci4KKyAgICBwcml2YXRlIE9uQ2xpY2tMaXN0ZW5lciBtU3RhcnRBbGFybUxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgLy8gU2V0cyB0aGUgY2FsbGJhY2sgZm9yIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHRpbWUgd2hlbiB0aGUgYWxhcm0gd2lsbCBmaXJzdCBnbyBvZmYKKyAgICAgICAgICAgIC8vIFRoZSBBbmRyb2lkIEFsYXJtTWFuYWdlciB1c2VzIHRoaXMgZm9ybSBvZiB0aGUgY3VycmVudCB0aW1lLgorICAgICAgICAgICAgbG9uZyBmaXJzdEFsYXJtVGltZSA9IFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpOworCisgICAgICAgICAgICAvLyBTZXRzIGEgcmVwZWF0aW5nIGNvdW50ZG93biB0aW1lciB0aGF0IHRyaWdnZXJzIEFsYXJtU2VydmljZQorICAgICAgICAgICAgbUFsYXJtTWFuYWdlci5zZXRSZXBlYXRpbmcoCisgICAgICAgICAgICAgICAgQWxhcm1NYW5hZ2VyLkVMQVBTRURfUkVBTFRJTUVfV0FLRVVQLCAvLyBiYXNlZCBvbiB0aW1lIHNpbmNlIGxhc3Qgd2FrZSB1cAorICAgICAgICAgICAgICAgIGZpcnN0QWxhcm1UaW1lLCAgLy8gc2VuZHMgdGhlIGZpcnN0IGFsYXJtIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAgICAgVEhJUlRZX1NFQ09ORFNfTUlMTElTLCAgLy8gcmVwZWF0cyBldmVyeSB0aGlydHkgc2Vjb25kcworICAgICAgICAgICAgICAgIG1BbGFybVNlbmRlciAgLy8gd2hlbiB0aGUgYWxhcm0gZ29lcyBvZmYsIHNlbmRzIHRoaXMgSW50ZW50CisgICAgICAgICAgICApOworCisgICAgICAgICAgICAvLyBOb3RpZmllcyB0aGUgdXNlciB0aGF0IHRoZSByZXBlYXRpbmcgY291bnRkb3duIHRpbWVyIGhhcyBiZWVuIHN0YXJ0ZWQKKyAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KAorICAgICAgICAgICAgICAgIEFsYXJtQWN0aXZpdHkudGhpcywgIC8vICB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICAgICAgICAgICAgUi5zdHJpbmcucmVwZWF0aW5nX3N0YXJ0ZWQsICAvLyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5CisgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX0xPTkcgIC8vIGhvdyBsb25nIHRvIGRpc3BsYXkgdGhlIG1lc3NhZ2UKKyAgICAgICAgICAgICkuc2hvdygpOyAgLy8gc2hvdyB0aGUgbWVzc2FnZSBvbiB0aGUgc2NyZWVuCisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gQ3JlYXRlcyBhIG5ldyBhbm9ueW1vdXMgY2xpY2sgbGlzdGVuZXIgZm9yIHRoZSBzdG9wIGJ1dHRvbi4gSXQgc2h1dHMgb2ZmIHRoZSByZXBlYXRpbmcKKyAgICAvLyBjb3VudGRvd24gdGltZXIuCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbVN0b3BBbGFybUxpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgLy8gU2V0cyB0aGUgY2FsbGJhY2sgZm9yIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisKKyAgICAgICAgICAgIC8vIENhbmNlbHMgdGhlIHJlcGVhdGluZyBjb3VudGRvd24gdGltZXIKKyAgICAgICAgICAgIG1BbGFybU1hbmFnZXIuY2FuY2VsKG1BbGFybVNlbmRlcik7CisKKyAgICAgICAgICAgIC8vIE5vdGlmaWVzIHRoZSB1c2VyIHRoYXQgdGhlIHJlcGVhdGluZyBjb3VudGRvd24gdGltZXIgaGFzIGJlZW4gc3RvcHBlZAorICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoCisgICAgICAgICAgICAgICAgQWxhcm1BY3Rpdml0eS50aGlzLCAgLy8gIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgICAgICBSLnN0cmluZy5yZXBlYXRpbmdfc3RvcHBlZCwgIC8vIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkKKyAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORyAgLy8gaG93IGxvbmcgdG8gZGlzcGxheSB0aGUgbWVzc2FnZQorICAgICAgICAgICAgKS5zaG93KCk7IC8vIGRpc3BsYXkgdGhlIG1lc3NhZ2UKKyAgICAgICAgfQorICAgIH07Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FsYXJtL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25ld2FsYXJtL0FsYXJtU2VydmljZS5qYXZhIGIvc2FtcGxlcy9BbGFybS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9uZXdhbGFybS9BbGFybVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjg4MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BbGFybS9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9uZXdhbGFybS9BbGFybVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb25NYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOworaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbDsKK2ltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNlcnZpY2UuIFRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQgYnkgQWxhcm1BY3Rpdml0eSwgd2hpY2ggY29udGFpbnMgYQorICogcmVwZWF0aW5nIGNvdW50ZG93biB0aW1lciB0aGF0IHNlbmRzIGEgUGVuZGluZ0ludGVudC4gVGhlIHVzZXIgc3RhcnRzIGFuZCBzdG9wcyB0aGUgdGltZXIgd2l0aAorICogYnV0dG9ucyBpbiB0aGUgVUkuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZW4gdGhpcyBzZXJ2aWNlIGlzIHN0YXJ0ZWQsIGl0IGNyZWF0ZXMgYSBSdW5uYWJsZSBhbmQgc3RhcnRzIGl0IGluIGEgbmV3IFRocmVhZC4gVGhlCisgKiBSdW5uYWJsZSBkb2VzIGEgc3luY2hyb25pemVkIGxvY2sgb24gdGhlIHNlcnZpY2UncyBCaW5kZXIgb2JqZWN0IGZvciAxNSBzZWNvbmRzLCB0aGVuIGlzc3VlcworICogYSBzdG9wU2VsZigpLiBUaGUgbmV0IGVmZmVjdCBpcyBhIG5ldyB3b3JrZXIgdGhyZWFkIHRoYXQgdGFrZXMgMTUgc2Vjb25kcyB0byBydW4gYW5kIHRoZW4KKyAqIHNodXRzIGRvd24gdGhlIGVudGlyZSBzZXJ2aWNlLiBUaGUgYWN0aXZpdHkgcmVzdGFydHMgdGhlIHNlcnZpY2UgYWZ0ZXIgMTUgbW9yZSBzZWNvbmRzLCB3aGVuIHRoZQorICogY291bnRkb3duIHRpbWVyIHRyaWdnZXJzIGFnYWluLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIHNlcnZpY2UgaXMgcHJvdmlkZWQgYXMgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCBmb3IgdGhlIHNhbXBsZSB0ZXN0IGFwcGxpY2F0aW9uCisgKiBBbGFybVNlcnZpY2VUZXN0LgorICogPC9wPgorICogPHA+CisgKiBOb3RlOiBTaW5jZSB0aGlzIHNhbXBsZSBpcyBiYXNlZCBvbiB0aGUgQW5kcm9pZCAxLjUgcGxhdGZvcm0sIGl0IGRvZXMgbm90IGltcGxlbWVudAorICogb25TdGFydENvbW1hbmQuIFNlZSB0aGUgSmF2YWRvYyBmb3IgYW5kcm9pZC5hcHAuU2VydmljZSBmb3IgbW9yZSBkZXRhaWxzLgorICogPC9wPgorICovCitwdWJsaWMgY2xhc3MgQWxhcm1TZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisgICAgLy8gRGVmaW5lcyBhIGxhYmVsIGZvciB0aGUgdGhyZWFkIHRoYXQgdGhpcyBzZXJ2aWNlIHN0YXJ0cworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTEFSTV9TRVJWSUNFX1RIUkVBRCA9ICJBbGFybVNlcnZpY2UiOworCisgICAgLy8gRGVmaW5lcyAxNSBzZWNvbmRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFdBSVRfVElNRV9TRUNPTkRTID0gMTU7CisKKyAgICAvLyBEZWZpbmUgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gb25lIHNlY29uZAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNSUxMSVNFQ1NfUEVSX1NFQyA9IDEwMDA7CisKKyAgICAvKgorICAgICAqIEZvciB0ZXN0aW5nIHB1cnBvc2VzLCB0aGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgZGVmaW5lZCBhcyBmaWVsZHMgYW5kIHNldCB0bworICAgICAqIHBhY2thZ2UgdmlzaWJpbGl0eS4KKyAgICAgKi8KKworICAgIC8vIFRoZSBOb3RpZmljYXRpb25NYW5hZ2VyIHVzZWQgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvIHRoZSBzdGF0dXMgYmFyLgorICAgIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7CisKKyAgICAvLyBBbiBJbnRlbnQgdGhhdCBkaXNwbGF5cyB0aGUgY2xpZW50IGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgbm90aWZpY2F0aW9uLgorICAgIFBlbmRpbmdJbnRlbnQgbUNvbnRlbnRJbnRlbnQ7CisKKyAgICAvLyBBIE5vdGlmaWNhdGlvbiB0byBzZW5kIHRvIHRoZSBOb3RpZmljYXRpb24gTWFuYWdlciB3aGVuIHRoZSBzZXJ2aWNlIGlzIHN0YXJ0ZWQuCisgICAgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247CisKKyAgICAvLyBBIEJpbmRlciwgdXNlZCBhcyB0aGUgbG9jayBvYmplY3QgZm9yIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgIElCaW5kZXIgbUJpbmRlciA9IG5ldyBBbGFybUJpbmRlcigpOworCisgICAgLy8gQSBUaHJlYWQgb2JqZWN0IHRoYXQgd2lsbCBydW4gdGhlIGJhY2tncm91bmQgdGFzaworICAgIFRocmVhZCBtV29ya1RocmVhZDsKKworICAgIC8vIFRoZSBSdW5uYWJsZSB0aGF0IGlzIHRoZSBzZXJ2aWNlJ3MgInRhc2siLiBUaGlzIGlsbHVzdHJhdGVzIGhvdyBhIHNlcnZpY2UgaXMgdXNlZCB0bworICAgIC8vIG9mZmxvYWQgd29yayBmcm9tIGEgY2xpZW50LgorICAgIFJ1bm5hYmxlIG1Xb3JrVGFzayA9IG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgLy8gU2V0cyB0aGUgd2FpdCB0aW1lIHRvIDE1IHNlY29uZHMsIHNpbXVsYXRpbmcgYSAxNS1zZWNvbmQgYmFja2dyb3VuZCB0YXNrLgorICAgICAgICAgICAgbG9uZyB3YWl0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgV0FJVF9USU1FX1NFQ09ORFMgKiBNSUxMSVNFQ1NfUEVSX1NFQzsKKworICAgICAgICAgICAgLy8gUHV0cyB0aGUgd2FpdCBpbiBhIHdoaWxlIGxvb3AgdG8gZW5zdXJlIHRoYXQgaXQgYWN0dWFsbHkgd2FpdGVkIDE1IHNlY29uZHMuCisgICAgICAgICAgICAvLyBUaGlzIGNvdmVycyB0aGUgc2l0dWF0aW9uIHdoZXJlIGFuIGludGVycnVwdCBtaWdodCBoYXZlIG92ZXJyaWRkZW4gdGhlIHdhaXQuCisgICAgICAgICAgICB3aGlsZSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgPCB3YWl0VGltZSkgeworICAgICAgICAgICAgICAgIC8vIFdhaXRzIGZvciAxNSBzZWNvbmRzIG9yIGludGVycnVwdGlvbgorICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUJpbmRlcikgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2FpdHMgZm9yIDE1IHNlY29uZHMgb3IgdW50aWwgYW4gaW50ZXJydXB0IHRyaWdnZXJzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIGludGVycnVwdCBvY2N1cnMsIHRoZSB3YWl0IGlzIHJlY2FsY3VsYXRlZCB0byBlbnN1cmUgYSBuZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgb2YgMTUgc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaW5kZXIud2FpdCh3YWl0VGltZSAtIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU3RvcHMgdGhlIGN1cnJlbnQgc2VydmljZS4gSW4gcmVzcG9uc2UsIEFuZHJvaWQgY2FsbHMgb25EZXN0cm95KCkuCisgICAgICAgICAgICBzdG9wU2VsZigpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqICBNYWtlcyBhIGZ1bGwgY29uY3JldGUgc3ViY2xhc3Mgb2YgQmluZGVyLCByYXRoZXIgdGhhbiBkb2luZyBpdCBpbiBsaW5lLCBmb3IgcmVhZGFiaWxpdHkuCisgICAgICovCisgICAgcHVibGljIGNsYXNzIEFsYXJtQmluZGVyIGV4dGVuZHMgQmluZGVyIHsKKyAgICAgICAgLy8gQ29uc3RydWN0b3IuIENhbGxzIHRoZSBzdXBlciBjb25zdHJ1Y3RvciB0byBzZXQgdXAgdGhlIGluc3RhbmNlLgorICAgICAgICBwdWJsaWMgQWxhcm1CaW5kZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIG9uVHJhbnNhY3QoaW50IGNvZGUsIFBhcmNlbCBkYXRhLCBQYXJjZWwgcmVwbHksIGludCBmbGFncykKKyAgICAgICAgICAgIHRocm93cyBSZW1vdGVFeGNlcHRpb24geworCisgICAgICAgICAgICAvLyBDYWxsIHRoZSBwYXJlbnQgbWV0aG9kIHdpdGggdGhlIGFyZ3VtZW50cyBwYXNzZWQgaW4KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgc2VydmljZSB3aGVuIGl0IGlzIGZpcnN0IHN0YXJ0ZWQgYnkgYSBjYWxsIHRvIHN0YXJ0U2VydmljZSgpIG9yCisgICAgICogYmluZFNlcnZpY2UoKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKKyAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgc3lzdGVtIG1Ob3RpZmljYXRpb24gc2VydmljZS4KKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKE5PVElGSUNBVElPTl9TRVJWSUNFKTsKKworICAgICAgICAvLyBVcGRhdGVzIHRoZSBzdGF0dXMgYmFyIHRvIGluZGljYXRlIHRoYXQgdGhpcyBzZXJ2aWNlIGlzIHJ1bm5pbmcuCisgICAgICAgIHNob3dOb3RpZmljYXRpb24oKTsKKworICAgICAgICAvLyBDcmVhdGVzIGEgbmV3IHRocmVhZC4gQSBuZXcgdGhyZWFkIGlzIHVzZWQgc28gdGhhdCB0aGUgc2VydmljZSdzIHdvcmsgZG9lc24ndCBibG9jaworICAgICAgICAvLyBhbnl0aGluZyBvbiB0aGUgY2FsbGluZyBjbGllbnQncyB0aHJlYWQuIEJ5IGRlZmF1bHQsIGEgc2VydmljZSBydW5zIGluIHRoZSBzYW1lCisgICAgICAgIC8vIHByb2Nlc3MgYW5kIHRocmVhZCBhcyB0aGUgY2xpZW50IHRoYXQgc3RhcnRzIGl0LgorICAgICAgICBtV29ya1RocmVhZCA9IG5ldyBUaHJlYWQoCisgICAgICAgICAgICBudWxsLCAgLy8gdGhyZWFkZ3JvdXAgKGluIHRoaXMgY2FzZSwgbnVsbCkKKyAgICAgICAgICAgIG1Xb3JrVGFzaywgLy8gdGhlIFJ1bm5hYmxlIHRoYXQgd2lsbCBydW4gaW4gdGhpcyB0aHJlYWQKKyAgICAgICAgICAgIEFMQVJNX1NFUlZJQ0VfVEhSRUFECisgICAgICAgICk7CisgICAgICAgIC8vIFN0YXJ0cyB0aGUgdGhyZWFkCisgICAgICAgIG1Xb3JrVGhyZWFkLnN0YXJ0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcHMgdGhlIHNlcnZpY2UgaW4gcmVzcG9uc2UgdG8gdGhlIHN0b3BTZWxmKCkgaXNzdWVkIHdoZW4gdGhlIHdhaXQgaXMgb3Zlci4gT3RoZXIKKyAgICAgKiBjbGllbnRzIHRoYXQgdXNlIHRoaXMgc2VydmljZSBjb3VsZCBzdG9wIGl0IGJ5IGlzc3VpbmcgYSBzdG9wU2VydmljZSgpIG9yIGEgc3RvcFNlbGYoKSBvbgorICAgICAqIHRoZSBzZXJ2aWNlIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgIC8vIENhbmNlbHMgdGhlIHN0YXR1cyBiYXIgbU5vdGlmaWNhdGlvbiBiYXNlZCBvbiBpdHMgSUQsIHdoaWNoIGlzIHNldCBpbiBzaG93Tm90aWZpY2F0aW9uKCkuCisgICAgICAgIG1Ob3RpZmljYXRpb25NYW5hZ2VyLmNhbmNlbChSLnN0cmluZy5hbGFybV9zZXJ2aWNlX3N0YXJ0ZWQpOworCisgICAgICAgIC8vIFNlbmRzIGEgbm90aWZpY2F0aW9uIHRvIHRoZSBzY3JlZW4uCisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KAorICAgICAgICAgICAgdGhpcywgIC8vIHRoZSBjdXJyZW50IGNvbnRleHQKKyAgICAgICAgICAgIFIuc3RyaW5nLmFsYXJtX3NlcnZpY2VfZmluaXNoZWQsICAvLyB0aGUgbWVzc2FnZSB0byBzaG93CisgICAgICAgICAgICBUb2FzdC5MRU5HVEhfTE9ORyAgIC8vIGhvdyBsb25nIHRvIGtlZXAgdGhlIG1lc3NhZ2Ugb24gdGhlIHNjcmVlbgorICAgICAgICApLnNob3coKTsgIC8vIHNob3cgdGhlIHRleHQKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBzZXJ2aWNlJ3MgYmluZGVyIG9iamVjdCB0byBjbGllbnRzIHRoYXQgaXNzdWUgb25CaW5kKCkuCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElCaW5kZXIgb25CaW5kKEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuIG1CaW5kZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGxheXMgYSBub3RpZmljYXRpb24gaW4gdGhlIHN0YXR1cyBiYXIgdGhhdCB0aGlzIHNlcnZpY2UgaXMgcnVubmluZy4gVGhpcyBtZXRob2QKKyAgICAgKiBhbHNvIGNyZWF0ZXMgYW4gSW50ZW50IGZvciB0aGUgQWxhcm1BY3Rpdml0eSBjbGllbnQgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBub3RpZmljYXRpb24KKyAgICAgKiBsaW5lLiBJZiB0aGUgdXNlciBjbGlja3MgdGhlIGxpbmUgaW4gdGhlIGV4cGFuZGVkIHN0YXR1cyB3aW5kb3csIHRoZSBJbnRlbnQgdHJpZ2dlcnMKKyAgICAgKiBBbGFybUFjdGl2aXR5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzaG93Tm90aWZpY2F0aW9uKCkgeworICAgICAgICAvLyBTZXRzIHRoZSB0ZXh0IHRvIHVzZSBmb3IgdGhlIHN0YXR1cyBiYXIgYW5kIHN0YXR1cyBsaXN0IHZpZXdzLgorICAgICAgICBDaGFyU2VxdWVuY2Ugbm90aWZpY2F0aW9uVGV4dCA9IGdldFRleHQoUi5zdHJpbmcuYWxhcm1fc2VydmljZV9zdGFydGVkKTsKKworICAgICAgICAvLyBTZXRzIHRoZSBpY29uLCBzdGF0dXMgYmFyIHRleHQsIGFuZCBkaXNwbGF5IHRpbWUgZm9yIHRoZSBtTm90aWZpY2F0aW9uLgorICAgICAgICBtTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgIFIuZHJhd2FibGUuc3RhdF9zYW1wbGUsICAvLyB0aGUgc3RhdHVzIGljb24KKyAgICAgICAgICAgIG5vdGlmaWNhdGlvblRleHQsIC8vIHRoZSBzdGF0dXMgdGV4dAorICAgICAgICAgICAgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgIC8vIHRoZSB0aW1lIHN0YW1wCisgICAgICAgICk7CisKKyAgICAgICAgLy8gU2V0cyB1cCB0aGUgSW50ZW50IHRoYXQgc3RhcnRzIEFsYXJtQWN0aXZpdHkKKyAgICAgICAgbUNvbnRlbnRJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEFjdGl2aXR5KAorICAgICAgICAgICAgdGhpcywgIC8vIFN0YXJ0IHRoZSBBY3Rpdml0eSBpbiB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICAgICAgICAwLCAgIC8vIG5vdCB1c2VkCisgICAgICAgICAgICBuZXcgSW50ZW50KHRoaXMsIEFsYXJtQWN0aXZpdHkuY2xhc3MpLCAgLy8gQSBuZXcgSW50ZW50IGZvciBBbGFybUFjdGl2aXR5CisgICAgICAgICAgICAwICAvLyBVc2UgYW4gZXhpc3RpbmcgYWN0aXZpdHkgaW5zdGFuY2UgaWYgYXZhaWxhYmxlCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBjb250ZW50IHZpZXcgZm9yIHRoZSBtTm90aWZpY2F0aW9uLiBUaGUgdmlldyBhcHBlYXJzIHdoZW4gdGhlIHVzZXIKKyAgICAgICAgLy8gc2hvd3MgdGhlIGV4cGFuZGVkIHN0YXR1cyB3aW5kb3cuCisgICAgICAgIG1Ob3RpZmljYXRpb24uc2V0TGF0ZXN0RXZlbnRJbmZvKAorICAgICAgICAgICAgdGhpcywgIC8vICBQdXQgdGhlIGNvbnRlbnQgdmlldyBpbiB0aGUgY3VycmVudCBjb250ZXh0CisgICAgICAgICAgICBnZXRUZXh0KFIuc3RyaW5nLmFsYXJtX3NlcnZpY2VfbGFiZWwpLCAgLy8gVGhlIHRleHQgdG8gdXNlIGFzIHRoZSBsYWJlbCBvZiB0aGUgZW50cnkKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvblRleHQsICAvLyBUaGUgdGV4dCB0byB1c2UgYXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbnRyeQorICAgICAgICAgICAgbUNvbnRlbnRJbnRlbnQgIC8vIFRoZSBpbnRlbnQgdG8gc2VuZCB3aGVuIHRoZSBlbnRyeSBpcyBjbGlja2VkCisgICAgICAgICk7CisKKyAgICAgICAgLy8gU2V0cyBhIHVuaXF1ZSBJRCBmb3IgdGhlIG5vdGlmaWNhdGlvbiBhbmQgc2VuZHMgaXQgdG8gTm90aWZpY2F0aW9uTWFuYWdlciB0byBiZQorICAgICAgICAvLyBkaXNwbGF5ZWQuIFRoZSBJRCBpcyB0aGUgaW50ZWdlciBtYXJrZXIgZm9yIHRoZSBub3RpZmljYXRpb24gc3RyaW5nLCB3aGljaCBpcworICAgICAgICAvLyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KAorICAgICAgICAgICAgUi5zdHJpbmcuYWxhcm1fc2VydmljZV9zdGFydGVkLCAgLy8gdW5pcXVlIGlkIGZvciB0aGUgbU5vdGlmaWNhdGlvbgorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbiAgIC8vIHRoZSBtTm90aWZpY2F0aW9uIG9iamVjdAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQWxhcm0vdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvQWxhcm0vdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Njg4OTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BbGFybS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0KKyAgICBEZWNsYXJlIHRoZSBjb250ZW50cyBvZiB0aGlzIEFuZHJvaWQgdGVzdCBwYWNrYWdlLiBUaGUgeG1sbnM6YW5kcm9pZAorICAgIGF0dHJpYnV0ZSBicmluZ3MgaW4gdGhlIEFuZHJvaWQgcGxhdGZvcm0gbmFtZXNwYWNlLCBhbmQgdGhlCisgICAgInBhY2thZ2UiIGF0dHJpYnV0ZSBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgcGFja2FnZS4KKyAgICBJZiB5b3UgdXNlIHRoaXMgZmlsZSBhcyBhIHRlbXBsYXRlIGluIHlvdXIgb3duIHRlc3QgcGFja2FnZSwgeW91IG11c3QgY2hhbmdlCisgICAgdGhlIHBhY2thZ2UgbmFtZSBmcm9tICJjb20uZXhhbXBsZS5hbmRyb2lkIiB0byBvbmUgdGhhdCB5b3Ugb3duIG9yIGhhdmUKKyAgICBjb250cm9sIG92ZXIuCisgLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQubmV3YWxhcm0udGVzdCIKKyAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgorICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCI+CisgICAgPCEtLQorICAgICAgICBNdXN0IHVzZSB0aGUgYXBwbGljYXRpb24gZWxlbWVudCB0byBpbmNsdWRlIHRoZSB1c2VzLWxpYnJhcnkgZWxlbWVudC4KKyAgICAgLS0+CisgICAgPGFwcGxpY2F0aW9uPgorICAgICAgICA8IS0tCisgICAgICAgICAgICBUZWxscyBBbmRyb2lkIHRvIGluY2x1ZGUgdGhpcyBsaWJyYXJ5IGluIHRoZSB0ZXN0IHBhY2thZ2UncyBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICBUaGUgdGVzdCBydW5uZXIgaXMgbm90IGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYSBtYW5pZmVzdCBmaWxlLgorICAgICAgICAtLT4KKyAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+CisgICAgPC9hcHBsaWNhdGlvbj4KKyAgICA8IS0tCisgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSB0ZXN0IHBhY2thZ2UgcmVxdWlyZXMgQVBJIHBsYXRmb3JtIGxldmVsIDMgKEFuZHJvaWQgMS41KSBvciBhYm92ZS4KKyAgICAgICAgVGhlIGluc3RhbGxlciB3aWxsIG5vdCBpbnN0YWxsIHRoaXMgcGFja2FnZSBvbnRvIGEgZGV2aWNlIG9yIGVtdWxhdG9yIHRoYXQgaXMgcnVubmluZyBhbgorICAgICAgICBvbGRlciBwbGF0Zm9ybSB2ZXJzaW9uLgorICAgICAtLT4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDptaW5TZGtWZXJzaW9uPSIzIiAvPgorICAgIDwhLS0KKyAgICAgICAgRGVjbGFyZXMgdGhlIGluc3RydW1lbnRhdGlvbiBmb3IgdGhpcyBhcHBsaWNhdGlvbi4gVGhlIGluc3RydW1lbnRhdGlvbiBjbGFzcyBpcworICAgICAgICBzcGVjaWZpZWQgYnkgdGhlICJuYW1lIiBhdHRyaWJ1dGUsIGFuZCBtdXN0IG5hbWUgYSBzdWJjbGFzcyBvZgorICAgICAgICBhbmRyb2lkLmFwcC5JbnN0cnVtZW50YXRpb24uIFRoZSBhcHBsaWNhdGlvbiB0aGF0IGlzIHJ1biBieSB0aGUgaW5zdHJ1bWVudGF0aW9uIG9iamVjdCBpcworICAgICAgICBzcGVjaWZpZWQgYnkgdGhlICJ0YXJnZXRQYWNrYWdlIiBhdHRyaWJ1dGUuCisgICAgIC0tPgorICAgIDxpbnN0cnVtZW50YXRpb24KKyAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJjb20uZXhhbXBsZS5hbmRyb2lkLm5ld2FsYXJtIgorICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIiAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQWxhcm0vdGVzdHMvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL0FsYXJtL3Rlc3RzL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDEyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FsYXJtL3Rlc3RzL19pbmRleC5odG1sCkBAIC0wLDAgKzEsNTAgQEAKKzxwPgorICAgIFRoaXMgc2FtcGxlIGlzIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIGZvciB0aGUgPGEgaHJlZj0iLi4vQWxhcm0vaW5kZXguaHRtbCI+QWxhcm08L2E+CisgICAgc2FtcGxlIGFwcGxpY2F0aW9uLiBJdCB0ZXN0cyB0aGUgYXBwbGljYXRpb24ncyA8Y29kZT5BbGFybVNlcnZpY2U8L2NvZGU+IHNlcnZpY2UuCis8L3A+Cis8cD4KKyAgICBUaGUgdGVzdCBhcHBsaWNhdGlvbiB1c2VzIHRoZQorICAgIDxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL3Rlc3QvU2VydmljZVRlc3RDYXNlLmh0bWwiPgorICAgIDxjb2RlPlNlcnZpY2VUZXN0Q2FzZTwvY29kZT48L2E+ICB0ZXN0IGNhc2UgY2xhc3MsCisgICAgd2hpY2ggZXh0ZW5kcyB0aGUgSlVuaXQgPGEgaHJlZj0iLi4vLi4vLi4vcmVmZXJlbmNlL2p1bml0L2ZyYW1ld29yay9UZXN0Q2FzZS5odG1sIj4KKyAgICA8Y29kZT5UZXN0Q2FzZTwvY29kZT48L2E+IGNsYXNzLiBUaGUgdGVzdCBydW5uZXIgaXMKKyAgICA8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC90ZXN0L0luc3RydW1lbnRhdGlvblRlc3RSdW5uZXIuaHRtbCI+CisgICAgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT48L2E+LgorPC9wPgorPHA+CisgICAgVGhlIGFwcGxpY2F0aW9uIHNob3dzIGhvdyB0byBzZXQgdXAgYSB0ZXN0IGFwcGxpY2F0aW9uIHByb2plY3QsCisgICAgaG93IHRvIGNyZWF0ZSB0aGUgPGEgaHJlZj0iQW5kcm9pZE1hbmlmZXN0Lmh0bWwiPjxjb2RlPkFuZHJvaWRNYW5pZmVzdC54bWw8L2NvZGU+PC9hPgorICAgIGZpbGUgZm9yIGEgdGVzdCBhcHBsaWNhdGlvbiwgYW5kIGhvdyB0byBzZXQgdXAgYSB0ZXN0IGNhc2UgY2xhc3MgZm9yIGEgc2VydmljZS4gVGhlCisgICAgdGVzdCBjYXNlIGNsYXNzLCA8YSBocmVmPSJzcmMvY29tL2FuZHJvaWQvZXhhbXBsZS9uZXdhbGFybS9TZXJ2aWNlQWxhcm1UZXN0Lmh0bWwiPgorICAgIDxjb2RlPkFsYXJtU2VydmljZVRlc3Q8L2NvZGU+PC9hPiwgY29udGFpbnMgdGVzdHMgdGhhdCBkZW1vbnN0cmF0ZSB0aGUgZm9sbG93aW5nCisgICAgQW5kcm9pZCB0ZXN0IHBhdHRlcm5zOgorPC9wPgorICAgIDx1bD4KKyAgICAgICAgPGxpPgorICAgICAgICAgICAgVGVzdCBzZXR1cDogVGhlIDxjb2RlPnNldFVwKCk8L2NvZGU+IG1ldGhvZCByZS1pbml0aWFsaXplcyB0aGUgc3RhdGUgb2YgdGhlCisgICAgICAgICAgICBzZXJ2aWNlIHVuZGVyIHRlc3QgYmVmb3JlIGVhY2ggdGVzdCBpcyBydW4uCisgICAgICAgIDwvbGk+CisgICAgICAgIDxsaT4KKyAgICAgICAgICAgIFNlcnZpY2Ugc3RhcnQ6IFRoZSA8Y29kZT5TZXJ2aWNlLnRlc3RTZXJ2aWNlQ3JlYXRlKCk8L2NvZGU+IHRlc3QgY29uZmlybXMgdGhhdCB0aGUKKyAgICAgICAgICAgIHNlcnZpY2Ugc3RhcnRzIGNvcnJlY3RseSBhbmQgaW5pdGlhbGl6ZXMgdGhlIHZhcmlhYmxlcyBpdCBuZWVkcyB0byBwcm92aWRlIGl0cworICAgICAgICAgICAgc2VydmljZXMuCisgICAgICAgIDwvbGk+CisgICAgPC91bD4KKzxwPgorICAgIFRoZSA8YSBocmVmPSJBbmRyb2lkTWFuaWZlc3QuaHRtbCI+bWFuaWZlc3Q8L2E+IGRlY2xhcmVzIGFuIDxjb2RlPiZsdDtpbnN0cnVtZW50YXRpb24mZ3Q7PC9jb2RlPgorICAgIGVsZW1lbnQgdGhhdCBsaW5rcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiB1bmRlciB0ZXN0LiBTcGVjaWZpY2FsbHksIHRoZQorICAgIGVsZW1lbnQncyA8Y29kZT5hbmRyb2lkOm5hbWU8L2NvZGU+IGF0dHJpYnV0ZSBzcGVjaWZpZXMgPGNvZGU+SW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lcjwvY29kZT4KKyAgICBhcyB0aGUgaW5zdHJ1bWVudGF0aW9uIHRvIHVzZS4gVGhlIDxjb2RlPmFuZHJvaWQ6dGFyZ2V0UGFja2FnZTwvY29kZT4gYXR0cmlidXRlIHNwZWNpZmllcworICAgIDxjb2RlPmNvbS5hbmRyb2lkLmV4YW1wbGUubmV3YWxhcm08L2NvZGU+IGFzIHRoZSBuYW1lIG9mIHRoZSBBbmRyb2lkIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGUKKyAgICBzZXJ2aWNlIHVuZGVyIHRlc3QuCis8L3A+Cis8cCBjbGFzcz0ibm90ZSI+CisgICAgPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiA8Y29kZT5BbGFybVNlcnZpY2VUZXN0LmphdmE8L2NvZGU+IHVzZXMgdGhlIEphdmEgcGFja2FnZSBuYW1lCisgICAgPGNvZGU+Y29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybTwvY29kZT4sIHdoaWNoIGlzIHRoZSBzYW1lIHBhY2thZ2UgdXNlZCBieSBzZXJ2aWNlIHVuZGVyCisgICAgdGVzdCwgPGNvZGU+QWxhcm1TZXJ2aWNlLmphdmE8L2NvZGU+LiBUaGlzIGFsbG93cyB0aGUgdGVzdCBjbGFzcyB0byBhY2Nlc3MgbWVtYmVycyBpbiB0aGUKKyAgICBzZXJ2aWNlIHVuZGVyIHRlc3QgdGhhdCBhcmUgZGVmaW5lZCB3aXRoIHBhY2thZ2UgdmlzaWJpbGl0eS4gVG8gcHJldmVudCBjb25mbGljdHMsIHRob3VnaCwKKyAgICB0aGUgZ2VuZXJhdGVkIGphdmEgZmlsZSA8Y29kZT5SLmphdmE8L2NvZGU+IGZvciA8Y29kZT5BbGFybVNlcnZpY2VUZXN0PC9jb2RlPiB1c2VzIHRoZQorICAgIEphdmEgcGFja2FnZSBuYW1lIDxjb2RlPmNvbS5leGFtcGxlLmFuZHJvaWQubmV3YWxhcm0udGVzdDwvY29kZT4uIEZvciB0aGUgc2FtZSByZWFzb24sIHRoZQorICAgIEFuZHJvaWQgcGFja2FnZSBuYW1lIGZvciB0aGUgdGVzdCBhcHBsaWNhdGlvbiAoc3BlY2lmaWVkIGluIHRoZSBtYW5pZmVzdCBmaWxlKSwgaXMKKyAgICA8Y29kZT5jb20uZXhhbXBsZS5hbmRyb2lkLm5ld2FsYXJtLnRlc3Q8L2NvZGU+LgorPC9wPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BbGFybS90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9uZXdhbGFybS9BbGFybVNlcnZpY2VUZXN0LmphdmEgYi9zYW1wbGVzL0FsYXJtL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25ld2FsYXJtL0FsYXJtU2VydmljZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDZjN2FkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BbGFybS90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9uZXdhbGFybS9BbGFybVNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5uZXdhbGFybTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LlNlcnZpY2VUZXN0Q2FzZTsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5ld2FsYXJtLkFsYXJtU2VydmljZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB0aGUgQWxhcm0gc2FtcGxlIHRlc3QgcGFja2FnZS4gVGhpcyB0ZXN0IGNsYXNzIHRlc3RzIHRoZSBBbGFybVNlcnZpY2UKKyAqIHNlcnZpY2UgY29tcG9uZW50LgorICovCitwdWJsaWMgY2xhc3MgQWxhcm1TZXJ2aWNlVGVzdCBleHRlbmRzIFNlcnZpY2VUZXN0Q2FzZTxBbGFybVNlcnZpY2U+IHsKKyAgICAvLyBDb250YWlucyBhbiBJbnRlbnQgdXNlZCB0byBzdGFydCB0aGUgc2VydmljZQorICAgIEludGVudCBtU3RhcnRTZXJ2aWNlSW50ZW50OworCisgICAgLy8gQ29udGFpbnMgYSBoYW5kbGUgdG8gdGhlIHN5c3RlbSBhbGFybSBzZXJ2aWNlCisgICAgQWxhcm1TZXJ2aWNlIG1TZXJ2aWNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSB0ZXN0IGNsYXNzLiBUZXN0IGNsYXNzZXMgdGhhdCBhcmUgcnVuIGJ5IEluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIKKyAgICAgKiBtdXN0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cyB0aGF0IGNhbGxzIHRoZSBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yIGFzIGl0cworICAgICAqIGZpcnN0IHN0YXRlbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWxhcm1TZXJ2aWNlVGVzdCgpIHsKKyAgICAgICAgc3VwZXIoQWxhcm1TZXJ2aWNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgdXAgdGhlIHRlc3QgZml4dHVyZS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gU2V0cyB1cCBhbiBpbnRlbnQgdG8gc3RhcnQgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdAorICAgICAgICBtU3RhcnRTZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudCh0aGlzLmdldFN5c3RlbUNvbnRleHQoKSxBbGFybVNlcnZpY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFucyB1cCB0aGUgdGVzdCBmaXh0dXJlCisgICAgICogQ2FsbGVkIGFmdGVyIGVhY2ggdGVzdCBtZXRob2QuIElmIHlvdSBvdmVycmlkZSB0aGUgbWV0aG9kLCBjYWxsIHN1cGVyLnRlYXJEb3duKCkgYXMgdGhlCisgICAgICogbGFzdCBzdGF0ZW1lbnQgaW4geW91ciBvdmVycmlkZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBBbHdheXMgY2FsbCB0aGUgc3VwZXIgY29uc3RydWN0b3Igd2hlbiBvdmVycmlkaW5nIHRlYXJEb3duKCkKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGUgc2VydmljZSdzIG9uQ3JlYXRlKCkgbWV0aG9kLiBTdGFydHMgdGhlIHNlcnZpY2UgdXNpbmcgc3RhcnRTZXJ2aWNlKEludGVudCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUNyZWF0ZSgpIHsKKyAgICAgICAgLy8gU3RhcnRzIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QKKyAgICAgICAgdGhpcy5zdGFydFNlcnZpY2UobVN0YXJ0U2VydmljZUludGVudCk7CisKKyAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgc2VydmljZSB1bmRlciB0ZXN0LgorICAgICAgICBtU2VydmljZSA9IHRoaXMuZ2V0U2VydmljZSgpOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgTm90aWZpY2F0aW9uIE1hbmFnZXIgd2FzIGNyZWF0ZWQgaW4gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtU2VydmljZS5tTm90aWZpY2F0aW9uTWFuYWdlcik7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBQZW5kaW5nSW50ZW50IGZvciB0aGUgZXhwYW5kZWQgc3RhdHVzIHdpbmRvdyB3YXMgY3JlYXRlZAorICAgICAgICBhc3NlcnROb3ROdWxsKG1TZXJ2aWNlLm1Db250ZW50SW50ZW50KTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgY3JlYXRlZAorICAgICAgICBhc3NlcnROb3ROdWxsKG1TZXJ2aWNlLm1Ob3RpZmljYXRpb24pOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IGUzZWNhODEuLjA4Zjg2YTAgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTM0LDEzICszNCwxNSBAQAogCiAgICAgPCEtLSBXZSB3aWxsIHJlcXVlc3QgYWNjZXNzIHRvIHRoZSBjYW1lcmEsIHNheWluZyB3ZSByZXF1aXJlIGEgY2FtZXJhCiAgICAgICAgICBvZiBzb21lIHNvcnQgYnV0IG5vdCBvbmUgd2l0aCBhdXRvZm9jdXMgY2FwYWJpbGl0eS4gLS0+CisgICAgPCEtLQogICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiAvPgogICAgIDx1c2VzLWZlYXR1cmUgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYSIgLz4KICAgICA8dXNlcy1mZWF0dXJlIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuYXV0b2ZvY3VzIiBhbmRyb2lkOnJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAtLT4KIAogICAgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOm5hbWU9IkFwaURlbW9zQXBwbGljYXRpb24iCiAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X3NhbXBsZV9jb2RlIgotICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvYXBwX3NhbXBsZV9jb2RlIiA+CisgICAgICAgICAgICBhbmRyb2lkOmljb249IkBkcmF3YWJsZS9hcHBfc2FtcGxlX2NvZGUiPgogCiAgICAgICAgIDwhLS0gVGhpcyBpcyBob3cgd2UgY2FuIHJlcXVlc3QgYSBsaWJyYXJ5IGJ1dCBzdGlsbCBhbGxvdyB0aGUgYXBwCiAgICAgICAgICAgICAgdG8gYmUgaW5zdGFsbGVkIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIC0tPgpAQCAtMjA3LDYgKzIwOSwxMDggQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8IS0tIEZyYWdtZW50IFNhbXBsZXMgLS0+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudEFsZXJ0RGlhbG9nIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfYWxlcnRfZGlhbG9nIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50QW5pbSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2FuaW0iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRDb250ZXh0TWVudSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2NvbnRleHRfbWVudSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudERpYWxvZyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X2RpYWxvZyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMYXlvdXQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9sYXlvdXQiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMYXlvdXQkRGV0YWlsc0FjdGl2aXR5IiAvPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMaXN0Q3Vyc29yTG9hZGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLldpdGhBY3Rpb25CYXIiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9saXN0X2N1cnNvcl9sb2FkZXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRnJhZ21lbnRMaXN0QXJyYXkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9saXN0X2FycmF5Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50TWVudSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5XaXRoQWN0aW9uQmFyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfbWVudSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5GcmFnbWVudFJldGFpbkluc3RhbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50UmVjZWl2ZVJlc3VsdCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2ZyYWdtZW50X3JlY2VpdmVfcmVzdWx0Ij4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkZyYWdtZW50U3RhY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9zdGFjayI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPCEtLSBJbnRlbnQgU2FtcGxlcyAtLT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkludGVudHMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWN0aXZpdHlfaW50ZW50cyI+CkBAIC01MTUsNTAgKzYxOSw2IEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPCEtLSBQcmVmZXJlbmNlcyBTYW1wbGVzIC0tPgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuUHJlZmVyZW5jZXNGcm9tWG1sIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2VzX2Zyb21feG1sIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlByZWZlcmVuY2VzRnJvbUNvZGUiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZXNfZnJvbV9jb2RlIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFkdmFuY2VkUHJlZmVyZW5jZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWR2YW5jZWRfcHJlZmVyZW5jZXMiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuTGF1bmNoaW5nUHJlZmVyZW5jZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbGF1bmNoaW5nX3ByZWZlcmVuY2VzIj4KLSAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgotICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KLSAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KLSAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KLSAgICAgICAgPC9hY3Rpdml0eT4KLQotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLlByZWZlcmVuY2VEZXBlbmRlbmNpZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMiPgotICAgICAgICAgICAgPGludGVudC1maWx0ZXI+Ci0gICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgotICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgotICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgotICAgICAgICA8L2FjdGl2aXR5PgotCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hcHAuRGVmYXVsdFZhbHVlcyIgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9kZWZhdWx0X3ZhbHVlcyI+Ci0gICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KLSAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+Ci0gICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+Ci0gICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+Ci0gICAgICAgIDwvYWN0aXZpdHk+Ci0KICAgICAgICAgPCEtLSBEZXZpY2UgQWRtaW4gU2FtcGxlcyAtLT4KIAogICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkRldmljZUFkbWluU2FtcGxlJENvbnRyb2xsZXIiCkBAIC02MDAsMTAgKzY2MCwxMDEgQEAKICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAorICAgICAgICA8IS0tIEFjdGlvbiBCYXIgU2FtcGxlcyAtLT4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmFwcC5BY3Rpb25CYXJNZWNoYW5pY3MiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGlvbl9iYXJfbWVjaGFuaWNzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYXBwLkFjdGlvbkJhclVzYWdlIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGlvbl9iYXJfdXNhZ2UiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5XaXRoQWN0aW9uQmFyIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CisgICAgICAgIDwhLS0gICAgICAgUFJFRkVSRU5DRSBQQUNLQUdFIFNBTVBMRVMgICAgICAtLT4KKyAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkZyYWdtZW50UHJlZmVyZW5jZXMiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9mcmFnbWVudF9wcmVmZXJlbmNlcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZV93aXRoX2hlYWRlcnMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLlByZWZlcmVuY2VzRnJvbVhtbCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3ByZWZlcmVuY2VzX2Zyb21feG1sIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIucHJlZmVyZW5jZS5QcmVmZXJlbmNlc0Zyb21Db2RlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZXNfZnJvbV9jb2RlIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIucHJlZmVyZW5jZS5BZHZhbmNlZFByZWZlcmVuY2VzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYWR2YW5jZWRfcHJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkxhdW5jaGluZ1ByZWZlcmVuY2VzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbGF1bmNoaW5nX3ByZWZlcmVuY2VzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGVwZW5kZW5jaWVzIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvcHJlZmVyZW5jZV9kZXBlbmRlbmNpZXMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5wcmVmZXJlbmNlLkRlZmF1bHRWYWx1ZXMiIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvZGVmYXVsdF92YWx1ZXMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KICAgICAgICAgPCEtLSAgICAgICAgQ09OVEVOVCBQQUNLQUdFIFNBTVBMRVMgICAgICAgIC0tPgogICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CiAKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmNvbnRlbnQuQ2xpcGJvYXJkU2FtcGxlIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X2NsaXBib2FyZCI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLmNvbnRlbnQuRXh0ZXJuYWxTdG9yYWdlIiBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2FjdGl2aXR5X2V4dGVybmFsX3N0b3JhZ2UiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgpAQCAtNjcxLDYgKzgyMiw2OSBAQAogICAgICAgICA8L3JlY2VpdmVyPgogCiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKyAgICAgICAgPCEtLSAgICAgQU5EUk9JRC5BTklNQVRJT04gUEFDS0FHRSBTQU1QTEVTICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdGlvbkxvYWRpbmciIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9Mb2FkaW5nIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdGlvblNlZWtpbmciIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9TZWVraW5nIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkFuaW1hdG9yRXZlbnRzIiBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vRXZlbnRzIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLkJvdW5jaW5nQmFsbHMiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vQm91bmNpbmcgQmFsbHMiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uQ3VzdG9tRXZhbHVhdG9yIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQW5pbWF0aW9uL0N1c3RvbSBFdmFsdWF0b3IiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uTGlzdEZsaXBwZXIiIGFuZHJvaWQ6bGFiZWw9IkFuaW1hdGlvbi9WaWV3IEZsaXAiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii5hbmltYXRpb24uUmV2ZXJzaW5nQW5pbWF0aW9uIiBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vUmV2ZXJzaW5nIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIuYW5pbWF0aW9uLk11bHRpUHJvcGVydHlBbmltYXRpb24iCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJBbmltYXRpb24vTXVsdGlwbGUgUHJvcGVydGllcyI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgogICAgICAgICA8IS0tICAgICBBTklNQVRJT04gUEFDS0FHRSBTQU1QTEVTICAgICAgICAgLS0+CiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KIApAQCAtMTAyOCw2MyArMTI0Miw2MyBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8xLiBBcnJheSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wMS4gQXJyYXkiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QyIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8yLiBDdXJzb3IgKFBlb3BsZSkiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0MiIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDIuIEN1cnNvciAoUGVvcGxlKSI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDMiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzMuIEN1cnNvciAoUGhvbmVzKSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QzIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wMy4gQ3Vyc29yIChQaG9uZXMpIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNC4gTGlzdEFkYXB0ZXIiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDQuIExpc3RBZGFwdGVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNS4gU2VwYXJhdG9ycyI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q1IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wNS4gU2VwYXJhdG9ycyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDYiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzYuIExpc3RBZGFwdGVyIENvbGxhcHNlZCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q2IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wNi4gTGlzdEFkYXB0ZXIgQ29sbGFwc2VkIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0NyIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvNy4gQ3Vyc29yIChQaG9uZXMpIj4KKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDciIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzA3LiBDdXJzb3IgKFBob25lcykiPgogICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CiAgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCi0gICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q4IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy84LiBQaG90b3MiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5MaXN0OCIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMDguIFBob3RvcyI+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CiAgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAgICAgICAgIDwvYWN0aXZpdHk+CiAKLSAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuTGlzdDkiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0xpc3RzLzkuIEFycmF5IChPdmVybGF5KSI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3Q5IiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9MaXN0cy8wOS4gQXJyYXkgKE92ZXJsYXkpIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTExMjYsNiArMTM0MCwxNCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3Lkxpc3QxNSIgYW5kcm9pZDpsYWJlbD0iVmlld3MvTGlzdHMvMTUuIFNlbGVjdGlvbiBNb2RlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUuV2l0aEFjdGlvbkJhciI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuU0FNUExFX0NPREUiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKICAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iLnZpZXcuRXhwYW5kYWJsZUxpc3QxIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9FeHBhbmRhYmxlIExpc3RzLzEuIEN1c3RvbSBBZGFwdGVyIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KQEAgLTExOTEsNiArMTQxMywxNSBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkdyaWQzIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvR3JpZC8zLiBTZWxlY3Rpb24gTW9kZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLldpdGhBY3Rpb25CYXIiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkltYWdlVmlldzEiCiAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iVmlld3MvSW1hZ2VWaWV3Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgpAQCAtMTI5NCwxNSArMTUyNSwzNSBAQAogICAgICAgICA8L2FjdGl2aXR5PgogCiAgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkNvbnRyb2xzMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy8xLiBMaWdodCBUaGVtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodCI+CisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy8xLiBMaWdodCBUaGVtZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9IkBhbmRyb2lkOnN0eWxlL1RoZW1lLkxpZ2h0Ij4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KICAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KICAgICAgICAgPC9hY3Rpdml0eT4KIAotICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczIiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzIuIERlZmF1bHQgVGhlbWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczIiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy8yLiBEZWZhdWx0IFRoZW1lIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iQGFuZHJvaWQ6c3R5bGUvVGhlbWUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LkNvbnRyb2xzMyIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL0NvbnRyb2xzLzMuIEhvbG8gTGlnaHQgVGhlbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5MaWdodC5Ib2xvIj4KKyAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgorICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KKyAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSIudmlldy5Db250cm9sczQiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Db250cm9scy80LiBIb2xvIERhcmsgVGhlbWUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSJAYW5kcm9pZDpzdHlsZS9UaGVtZS5Ib2xvIj4KICAgICAgICAgICAgIDxpbnRlbnQtZmlsdGVyPgogICAgICAgICAgICAgICAgIDxhY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5hY3Rpb24uTUFJTiIgLz4KICAgICAgICAgICAgICAgICA8Y2F0ZWdvcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLmludGVudC5jYXRlZ29yeS5TQU1QTEVfQ09ERSIgLz4KQEAgLTE0NDMsNiArMTY5NCwyMCBAQAogICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgogICAgICAgICA8L2FjdGl2aXR5PgogCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlBvcHVwTWVudTEiIGFuZHJvaWQ6bGFiZWw9IlZpZXdzL1BvcHVwIE1lbnUiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9Ii52aWV3LlJvdGF0aW5nQnV0dG9uIiBhbmRyb2lkOmxhYmVsPSJWaWV3cy9Sb3RhdGluZyBCdXR0b24iPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LlNBTVBMRV9DT0RFIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCiAgICAgICAgIDwhLS0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KICAgICAgICAgPCEtLSAgICAgICAgICAgR1JBUEhJQ1MgU0FNUExFUyAgICAgICAgICAgIC0tPgogICAgICAgICA8IS0tICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2FuaW1hdG9yLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vYW5pbWF0b3IueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzJmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL2FuaW1hdG9yLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YW5pbWF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgYW5kcm9pZDp2YWx1ZUZyb209IjEiCisgICAgYW5kcm9pZDp2YWx1ZVRvPSIwIgorICAgIGFuZHJvaWQ6dmFsdWVUeXBlPSJmbG9hdFR5cGUiCisgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iMSIKKyAgICBhbmRyb2lkOnJlcGVhdE1vZGU9InJldmVyc2UiLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vcHJvcGVydHlfYW5pbWF0b3IueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvYW5pbS9wcm9wZXJ0eV9hbmltYXRvci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwZjAwNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vcHJvcGVydHlfYW5pbWF0b3IueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxwcm9wZXJ0eSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIKKyAgICBhbmRyb2lkOnZhbHVlRnJvbT0iMCIKKyAgICBhbmRyb2lkOnZhbHVlVG89IjIwMCIKKyAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgIGFuZHJvaWQ6cHJvcGVydHlOYW1lPSJ5IgorICAgIGFuZHJvaWQ6cmVwZWF0Q291bnQ9IjEiCisgICAgYW5kcm9pZDpyZXBlYXRNb2RlPSJyZXZlcnNlIi8+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL3NlcXVlbmNlci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9hbmltL3NlcXVlbmNlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhNjA2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2FuaW0vc2VxdWVuY2VyLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8c2VxdWVuY2VyPgorICAgIDxwcm9wZXJ0eSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6ZHVyYXRpb249IjEwMDAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iMjAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ieCIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iMSIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRNb2RlPSJyZXZlcnNlIi8+CisgICAgPHByb3BlcnR5IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpkdXJhdGlvbj0iMTAwMCIKKyAgICAgICAgYW5kcm9pZDp2YWx1ZUZyb209IjAiCisgICAgICAgIGFuZHJvaWQ6dmFsdWVUbz0iNDAwIgorICAgICAgICBhbmRyb2lkOnZhbHVlVHlwZT0iZmxvYXRUeXBlIgorICAgICAgICBhbmRyb2lkOnByb3BlcnR5TmFtZT0ieSIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRDb3VudD0iMSIKKyAgICAgICAgYW5kcm9pZDpyZXBlYXRNb2RlPSJyZXZlcnNlIi8+Cis8L3NlcXVlbmNlcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zLnBuZyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NDVmZjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUtbWRwaS9pY19zZXR0aW5nc19hcHBsaWNhdGlvbnMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlLW1kcGkvaWNfc2V0dGluZ3NfZGlzcGxheS5wbmcgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NldHRpbmdzX2Rpc3BsYXkucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YWYzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3NldHRpbmdzX2Rpc3BsYXkucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL21hZ25pZnlpbmdfZ2xhc3MucG5nIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvZHJhd2FibGUvbWFnbmlmeWluZ19nbGFzcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjU5MmFlMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2RyYXdhYmxlL21hZ25pZnlpbmdfZ2xhc3MucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC1sYW5kL2ZyYWdtZW50X2xheW91dC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9sYXlvdXQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGZiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQtbGFuZC9mcmFnbWVudF9sYXlvdXQueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBsYXlvdXQgZnJhZ21lbnQgc2FtcGxlLiAgVGhpcyB2ZXJzaW9uIGlzCisgICAgIGZvciBkaXNwbGF5IHdoZW4gaW4gbGFuZHNjYXBlOiB3ZSBjYW4gZml0IGJvdGggdGl0bGVzIGFuZCBkaWFsb2cuIC0tPgorCis8IS0tIEJFR0lOX0lOQ0xVREUobGF5b3V0KSAtLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50TGF5b3V0JFRpdGxlc0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZXMiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPGZyYWdtZW50IGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50TGF5b3V0JERpYWxvZ0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kaWFsb2ciIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorICAgIAorPC9MaW5lYXJMYXlvdXQ+Cis8IS0tIEVORF9JTkNMVURFKGxheW91dCkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX2N1c3RvbV9ldmFsdWF0b3IueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jdXN0b21fZXZhbHVhdG9yLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDAzM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9jdXN0b21fZXZhbHVhdG9yLnhtbApAQCAtMCwwICsxLDI4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iUGxheSIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9sb2FkaW5nLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fbG9hZGluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5YzViMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fbG9hZGluZy54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX211bHRpX3Byb3BlcnR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDljNWIwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9tdWx0aV9wcm9wZXJ0eS54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHQ9IlJ1biIKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9yZXZlcnNpbmcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdGlvbl9yZXZlcnNpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWU1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3JldmVyc2luZy54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgID4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJQbGF5IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUmV2ZXJzZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmV2ZXJzZUJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRpb25fc2Vla2luZy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3NlZWtpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDdmYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvYW5pbWF0aW9uX3NlZWtpbmcueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmlkPSJAK2lkL2NvbnRhaW5lciIKKyAgICA+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iUnVuIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdGFydEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NlZWtCYXIiCisgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRvcl9ldmVudHMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2FuaW1hdG9yX2V2ZW50cy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4OWI1YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9hbmltYXRvcl9ldmVudHMueG1sCkBAIC0wLDAgKzEsMTIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiCisgICAgYW5kcm9pZDppZD0iQCtpZC9jb250YWluZXIiCisgICAgPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgPgorICAgICAgICA8QnV0dG9uCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlBsYXkiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0QnV0dG9uIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPEJ1dHRvbgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbmNlbEJ1dHRvbiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxCdXR0b24KKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW5kIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbmRCdXR0b24iCisgICAgICAgICAgICAvPgorICAgICAgICA8Q2hlY2tCb3gKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW5kIEltbWVkaWF0ZWx5IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbmRDQiIKKyAgICAgICAgICAgIC8+CisgICAgPC9MaW5lYXJMYXlvdXQ+CisgICAgPExpbmVhckxheW91dAorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICA+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTZXF1ZW5jZXIgRXZlbnRzOiAgICIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJTdGFydCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3RhcnRUZXh0IgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlcGVhdCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVwZWF0VGV4dCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJDYW5jZWwgICAiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NhbmNlbFRleHQiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iRW5kIgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9lbmRUZXh0IgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkFuaW1hdG9yIEV2ZW50czogICAiCisgICAgICAgICAgICAvPgorICAgICAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iU3RhcnQgICAiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXJ0VGV4dEFuaW1hdG9yIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IlJlcGVhdCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcmVwZWF0VGV4dEFuaW1hdG9yIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkNhbmNlbCAgICIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FuY2VsVGV4dEFuaW1hdG9yIgorICAgICAgICAgICAgLz4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkVuZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW5kVGV4dEFuaW1hdG9yIgorICAgICAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2JvdW5jaW5nX2JhbGxzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ib3VuY2luZ19iYWxscy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkZTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9ib3VuY2luZ19iYWxscy54bWwKQEAgLTAsMCArMSwyMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvY2xpcGJvYXJkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjFlMzAyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2NsaXBib2FyZC54bWwKQEAgLTAsMCArMSw5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLQorICAgIERlbW9uc3RyYXRlcyBjbGlwYm9hcmQuCisKKyAgICBTZWUgY29ycmVzcG9uZGluZyBKYXZhIGNvZGU6CisgICAgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmNvbnRlbnQuQ2xpcGJvYXJkU2FtcGxlCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisKKyAgICA8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9jb3B5X3N0eWxlZF90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9InBhc3RlU3R5bGVkVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb3B5X3RleHQiIC8+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0eWxlZF90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJub3JtYWwiIC8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKworICAgIDxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2NvcHlfcGxhaW5fdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJwYXN0ZVBsYWluVGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9jb3B5X3RleHQiIC8+CisKKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3BsYWluX3RleHQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIgLz4KKworICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvY29weV9pbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6b25DbGljaz0icGFzdGVJbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29weV9pbnRlbnQiIC8+CisKKyAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2NvcHlfdXJpIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9InBhc3RlVXJpIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2NvcHlfdXJpIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL2NsaXBfdHlwZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6ZHJhd1NlbGVjdG9yT25Ub3A9InRydWUiCisgICAgICAgIGFuZHJvaWQ6cHJvbXB0PSJAc3RyaW5nL2NsaXBfdHlwZV9wcm9tcHQiCisgICAgLz4KKworICAgIDxFZGl0VGV4dAorICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NsaXBfdGV4dCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9Im5vcm1hbCIKKyAgICAgICAgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKaW5kZXggMjgyN2MwMS4uMDAzNjc0MiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2RldmljZV9hZG1pbl9zYW1wbGUueG1sCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbApAQCAtMTUsMTI2ICsxNSwyMjQgQEAKIC0tPgogCiA8IS0tIERlbW9uc3RyYXRlcyBpbXBsZW1lbnRhdGlvbiBvZiBhIERldmljZUFkbWluLiAtLT4KKzxTY3JvbGxWaWV3IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KIAotICAgIDxUZXh0VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCi0gICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYW1wbGVfZGV2aWNlX2FkbWluX3N1bW1hcnkiLz4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW5hYmxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZW5hYmxlX2FkbWluIj4KLSAgICAgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Rpc2FibGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9kaXNhYmxlX2FkbWluIj4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX3F1YWxpdHkiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpwcm9tcHQ9IkBzdHJpbmcvcGFzc3dvcmRfcXVhbGl0eSI+Ci0gICAgICAgIDwvU3Bpbm5lcj4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9sZW5ndGgiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbGVuZ3RoX2hpbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KLSAgICAgICAgPC9FZGl0VGV4dD4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF9wYXNzd29yZCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWRfbGF5b3V0X2dyYXZpdHk9ImVhc3R8Y2VudGVyX3ZlcnRpY2FsIgotICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3Bhc3N3b3JkIj4KLSAgICA8L0J1dHRvbj4KLQotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9oaW50IgotICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3Jlc2V0X3Bhc3N3b3JkIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVzZXRfcGFzc3dvcmQiPgotICAgICAgICA8L0J1dHRvbj4KKyAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRpcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zYW1wbGVfZGV2aWNlX2FkbWluX3N1bW1hcnkiLz4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZW5hYmxlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9lbmFibGVfYWRtaW4iPgorICAgICAgICAgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZGlzYWJsZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZGlzYWJsZV9hZG1pbiI+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8U3Bpbm5lciBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX3F1YWxpdHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmRyYXdTZWxlY3Rvck9uVG9wPSJ0cnVlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6cHJvbXB0PSJAc3RyaW5nL3Bhc3N3b3JkX3F1YWxpdHkiPgorICAgICAgICAgICAgPC9TcGlubmVyPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wYXNzd29yZF9sZW5ndGgiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbGVuZ3RoX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbGV0dGVycyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX2xldHRlcnNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbnVtZXJpYyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX251bWVyaWNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmhpbnQ9IkBzdHJpbmcvcGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2VfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fc3ltYm9scyIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wYXNzd29yZF9taW5pbXVtX3N5bWJvbHNfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX21pbmltdW1fbm9ubGV0dGVyX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3Bhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppbnB1dFR5cGU9Im51bWJlciI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2V0X3Bhc3N3b3JkIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWRfbGF5b3V0X2dyYXZpdHk9ImVhc3R8Y2VudGVyX3ZlcnRpY2FsIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXRfcGFzc3dvcmQiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Bhc3N3b3JkX2hpbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmVzZXRfcGFzc3dvcmQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9yZXNldF9wYXNzd29yZCI+CisgICAgICAgICAgICA8L0J1dHRvbj4KKworICAgICAgICA8L0xpbmVhckxheW91dD4KKworICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9tYXhfZmFpbGVkX3B3IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL21heF9mYWlsZWRfcHdfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIj4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmNlX2xvY2siCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb3JjZV9sb2NrIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvd2lwZV9kYXRhIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvd2lwZV9kYXRhIj4KKyAgICAgICAgICAgIDwvQnV0dG9uPgorCisgICAgICAgIDwvTGluZWFyTGF5b3V0PgorCisgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgICAgIDxFZGl0VGV4dCBhbmRyb2lkOmlkPSJAK2lkL3RpbWVvdXQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3RpbWVvdXRfaGludCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZnJlZXplc1RleHQ9InRydWUiPgorICAgICAgICAgICAgPC9FZGl0VGV4dD4KKworICAgICAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF90aW1lb3V0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3RpbWVvdXRfbGFiZWwiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CisKKyAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KKworICAgICAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvcHJveHlob3N0IgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy9wcm94eWhvc3RfaGludCI+CisgICAgICAgICAgICA8L0VkaXRUZXh0PgorCisgICAgICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9wcm94eWxpc3QiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL3Byb3h5bGlzdF9oaW50Ij4KKyAgICAgICAgICAgIDwvRWRpdFRleHQ+CisKKyAgICAgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zZXRfcHJveHkiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zZXRfcHJveHlfbGFiZWwiPgorICAgICAgICAgICAgPC9CdXR0b24+CisKKyAgICAgICAgPC9MaW5lYXJMYXlvdXQ+CiAKICAgICA8L0xpbmVhckxheW91dD4KIAotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLQotICAgICAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9tYXhfZmFpbGVkX3B3IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpoaW50PSJAc3RyaW5nL21heF9mYWlsZWRfcHdfaGludCIKLSAgICAgICAgICAgIGFuZHJvaWQ6aW5wdXRUeXBlPSJudW1iZXIiPgotICAgICAgICA8L0VkaXRUZXh0PgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2ZvcmNlX2xvY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mb3JjZV9sb2NrIj4KLSAgICAgICAgPC9CdXR0b24+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3dpcGVfZGF0YSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3dpcGVfZGF0YSI+Ci0gICAgICAgIDwvQnV0dG9uPgotCi0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0KLSAgICAgICAgPEVkaXRUZXh0IGFuZHJvaWQ6aWQ9IkAraWQvdGltZW91dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgIGFuZHJvaWQ6aGludD0iQHN0cmluZy90aW1lb3V0X2hpbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmlucHV0VHlwZT0ibnVtYmVyIgotICAgICAgICAgICAgYW5kcm9pZDpmcmVlemVzVGV4dD0idHJ1ZSI+Ci0gICAgICAgIDwvRWRpdFRleHQ+Ci0KLSAgICAgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3NldF90aW1lb3V0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvc2V0X3RpbWVvdXRfbGFiZWwiPgotICAgICAgICA8L0J1dHRvbj4KLQotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KLQorPC9TY3JvbGxWaWV3PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2FuaW0ueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2FuaW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWM4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfYW5pbS54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIGxheW91dCBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgPGZyYWdtZW50IGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcC5GcmFnbWVudEFuaW0kRmlyc3RGcmFnbWVudCIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ZyYWdtZW50MSIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mcmFnMWhpZGUiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iSGlkZSI+CisgICAgICAgIDwvQnV0dG9uPgorICAgIAorICAgIDwvTGluZWFyTGF5b3V0PgorICAgIAorICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+CisKKyAgICAgICAgPGZyYWdtZW50IGFuZHJvaWQ6bmFtZT0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcC5GcmFnbWVudEFuaW0kU2Vjb25kRnJhZ21lbnQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mcmFnbWVudDIiIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMHB4IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KKworICAgICAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZnJhZzJoaWRlIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkhpZGUiPgorICAgICAgICA8L0J1dHRvbj4KKyAgICAKKyAgICA8L0xpbmVhckxheW91dD4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2NvbnRleHRfbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfY29udGV4dF9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJjMDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2NvbnRleHRfbWVudS54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpwYWRkaW5nPSI4ZHAiPgorCisgICAgPFRleHRWaWV3CisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9mcmFnbWVudF9jb250ZXh0X21lbnVfbXNnIiAvPgorCisgICAgPEJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2xvbmdfcHJlc3MiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9sb25nX3ByZXNzIj4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorICAgIAorPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9kaWFsb2cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwM2Y2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nLnhtbApAQCAtMCwwICsxLDM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRvcC1sZXZlbCBjb250ZW50IHZpZXcgZm9yIHRoZSBzaW1wbGUgZnJhZ21lbnQgc2FtcGxlLiAtLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl9ob3Jpem9udGFsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiIC8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2hvdyIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL3Nob3ciPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9CdXR0b24+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjk1ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBUb3AtbGV2ZWwgY29udGVudCB2aWV3IGZvciB0aGUgc2ltcGxlIGZyYWdtZW50IHNhbXBsZS4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbHxjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0idG9wfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eV9tc2ciIC8+CisKKyAgICA8QnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvc2hvd19kaWFsb2ciCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9zaG93Ij4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCisgICAgPFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIiAvPgorCisgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2lubGluZV90ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsfGNlbnRlcl9ob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eV9pbmxpbmUiIC8+CisKKyAgICA8RnJhbWVMYXlvdXQKKyAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZW1iZWRkZWQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWx8Y2VudGVyX2hvcml6b250YWwiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkcCIKKyAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI2ZmMzAzMDMwIgorICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJ0b3B8Y2VudGVyX2hvcml6b250YWwiIC8+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbGF5b3V0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRmNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X2xheW91dC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIGxheW91dCBmcmFnbWVudCBzYW1wbGUuICBUaGlzIHZlcnNpb24gaXMKKyAgICAgZm9yIGRpc3BsYXkgd2hlbiBub3QgaW4gbGFuZHNjYXBlOiB3ZSBjYW4gb25seSBmaXQgdGhlIGxpc3Qgb2YgdGl0bGVzLiAtLT4KKworPCEtLSBCRUdJTl9JTkNMVURFKGxheW91dCkgLS0+Cis8RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50Ij4KKyAgICA8ZnJhZ21lbnQKKyAgICAgICAgICAgIGNsYXNzPSJjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwLkZyYWdtZW50TGF5b3V0JFRpdGxlc0ZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZXMiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIgLz4KKzwvRnJhbWVMYXlvdXQ+Cis8IS0tIEVORF9JTkNMVURFKGxheW91dCkgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbWVudS54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvZnJhZ21lbnRfbWVudS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJkM2M1MgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9tZW51LnhtbApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOnBhZGRpbmc9IjhkcCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50X21lbnVfbXNnIiAvPgorCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWVudTEiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50MW1lbnUiPgorICAgIDwvQ2hlY2tCb3g+CisgICAgCisgICAgPENoZWNrQm94IGFuZHJvaWQ6aWQ9IkAraWQvbWVudTIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6Y2hlY2tlZD0idHJ1ZSIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL2ZyYWdtZW50Mm1lbnUiPgorICAgIDwvQ2hlY2tCb3g+CisgICAgCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X3JldGFpbl9pbnN0YW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlhOWE0MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6cGFkZGluZz0iOGRwIj4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvZnJhZ21lbnRfcmV0YWluX2luc3RhbmNlX21zZyIgLz4KKworICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2hvcml6b250YWwiCisgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjAwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjZkcCIKKyAgICAgICAgYW5kcm9pZDptYXg9IjUwMCIgLz4KKworICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXN0YXJ0IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvcmVzdGFydCI+CisgICAgICAgIDxyZXF1ZXN0Rm9jdXMgLz4KKyAgICA8L0J1dHRvbj4KKyAgICAKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2ZyYWdtZW50X3N0YWNrLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9zdGFjay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliODdkYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9mcmFnbWVudF9zdGFjay54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVG9wLWxldmVsIGNvbnRlbnQgdmlldyBmb3IgdGhlIHNpbXBsZSBmcmFnbWVudCBzYW1wbGUuIC0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgYW5kcm9pZDpwYWRkaW5nPSI0ZGlwIgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX2hvcml6b250YWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgPEZyYW1lTGF5b3V0CisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NpbXBsZV9mcmFnbWVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBweCIKKyAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIgLz4KKyAgICAgICAgICAgIAorICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXdfZnJhZ21lbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiIAorICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbmV3X2ZyYWdtZW50Ij4KKyAgICAgICAgPHJlcXVlc3RGb2N1cyAvPgorICAgIDwvQnV0dG9uPgorCis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9nYWxsZXJ5XzEueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKaW5kZXggOWI5YzRiYi4uODIzOWVmMCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2dhbGxlcnlfMS54bWwKQEAgLTE0LDggKzE0LDE5IEBACiAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiAKLTxHYWxsZXJ5IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgYW5kcm9pZDppZD0iQCtpZC9nYWxsZXJ5IgotCWFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0JYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCis8TGluZWFyTGF5b3V0CisgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorIGFuZHJvaWQ6aWQ9IkAraWQvbGF5b3V0MiIKKyBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJmaWxsX3BhcmVudCI+Cis8R2FsbGVyeSAgYW5kcm9pZDppZD0iQCtpZC9nYWxsZXJ5IgorYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCiAvPgotICAgICAgIAorPEVkaXRUZXh0CisgYW5kcm9pZDp0ZXh0PSJAK2lkL0VkaXRUZXh0MDEiCisgYW5kcm9pZDppZD0iQCtpZC9FZGl0VGV4dDAxIgorIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPjwvRWRpdFRleHQ+Cis8L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvbGFiZWxlZF90ZXh0X2VkaXQueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xhYmVsZWRfdGV4dF9lZGl0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzU2OGFmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L2xhYmVsZWRfdGV4dF9lZGl0LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBDb250ZW50IGZvciBhIGZyYWdtZW50IHdpdGggYSB0ZXh0IGVkaXRvci4gLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiBhbmRyb2lkOnBhZGRpbmc9IjRkaXAiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXNnIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiIC8+CisKKyAgICA8RWRpdFRleHQgYW5kcm9pZDppZD0iQCtpZC9zYXZlZCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKKyAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAZHJhd2FibGUvZ3JlZW4iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9pbml0aWFsX3RleHQiCisgICAgICAgIGFuZHJvaWQ6ZnJlZXplc1RleHQ9InRydWUiPgorICAgICAgICA8cmVxdWVzdEZvY3VzIC8+CisgICAgPC9FZGl0VGV4dD4KKworPC9MaW5lYXJMYXlvdXQ+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9wb3B1cF9tZW51XzEueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3BvcHVwX21lbnVfMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkYzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL2xheW91dC9wb3B1cF9tZW51XzEueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CisgICAgPEJ1dHRvbiBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCisgICAgICAgICAgICBhbmRyb2lkOm9uQ2xpY2s9Im9uUG9wdXBCdXR0b25DbGljayIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9wb3B1cF9tZW51X2J1dHRvbiIgLz4KKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX2xpc3QueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX2xpc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1N2FmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcm90YXRpbmdfbGlzdC54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgorICAgIDxCdXR0b24KKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b24iCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iRmxpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiIC8+CisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbGlzdF9lbiIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRpcCIvPgorICAgIDxMaXN0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2xpc3RfZnIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkaXAiCisgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgorPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbGF5b3V0L3JvdGF0aW5nX3ZpZXcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMTg4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9sYXlvdXQvcm90YXRpbmdfdmlldy54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50IgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvY29udGFpbmVyIgorICAgID4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iWCIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW9uWCIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iWSIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW9uWSIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8TGluZWFyTGF5b3V0CisgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblRvcD0iMjBkaXAiCisgICAgICAgID4KKyAgICAgICAgPFRleHRWaWV3CisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgorICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iWiIKKyAgICAgICAgICAgIC8+CisgICAgICAgIDxTZWVrQmFyCisgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3JvdGF0aW9uWiIKKyAgICAgICAgLz4KKyAgICA8L0xpbmVhckxheW91dD4KKyAgICA8QnV0dG9uCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyMDBkaXAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMTUwZGlwIgorICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI1MGRpcCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJSb3RhdGluZyBCdXR0b24iCisgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcm90YXRpbmdCdXR0b24iCisgICAgICAgIC8+Cis8L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvYWN0aW9ucy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDhhYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2FjdGlvbnMueG1sCkBAIC0wLDAgKzEsNDQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zZWFyY2giCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iCisgICAgICAgICAgYW5kcm9pZDpvbkNsaWNrPSJvblNlYXJjaCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9hZGQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2FkZCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfYWRkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvYWN0aW9uX2VkaXQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2VkaXQiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfZWRpdCIgLz4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9hY3Rpb25fYmFyX3NoYXJlIgorICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hY3Rpb25fem9vbSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfem9vbSIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfem9vbSIKKyAgICAgICAgICBhbmRyb2lkOnNob3dBc0FjdGlvbj0iaWZSb29tIj4KKyAgICAgICAgPG1lbnU+CisgICAgICAgICAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL2FjdGlvbl9zYXZlIgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X3NhdmUiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2FjdGlvbl9iYXJfc2F2ZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2hvd0FzQWN0aW9uPSJpZlJvb20iIC8+CisgICAgICAgIDwvbWVudT4KKyAgICA8L2l0ZW0+Cis8L21lbnU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy9tZW51L2xpc3Rfc2VsZWN0X21lbnUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9saXN0X3NlbGVjdF9tZW51LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBlM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9saXN0X3NlbGVjdF9tZW51LnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9zaGFyZSIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2hhcmUiCisgICAgICAgICAgYW5kcm9pZDpzaG93QXNBY3Rpb249ImFsd2F5cyIgLz4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvcG9wdXAueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvbWVudS9wb3B1cC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMwZTNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL21lbnUvcG9wdXAueG1sCkBAIC0wLDAgKzEsMzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPG1lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8aXRlbSBhbmRyb2lkOmlkPSJAK2lkL3NlYXJjaCIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfc2VhcmNoIgorICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcG9wdXBfbWVudV9zZWFyY2giIC8+CisgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9hZGQiCisgICAgICAgICAgYW5kcm9pZDppY29uPSJAYW5kcm9pZDpkcmF3YWJsZS9pY19tZW51X2FkZCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfYWRkIiAvPgorICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkAraWQvZWRpdCIKKyAgICAgICAgICBhbmRyb2lkOmljb249IkBhbmRyb2lkOmRyYXdhYmxlL2ljX21lbnVfZWRpdCIKKyAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3BvcHVwX21lbnVfZWRpdCI+CisgICAgICAgIDxtZW51PgorICAgICAgICAgICAgPGl0ZW0gYW5kcm9pZDppZD0iQCtpZC9zaGFyZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWNvbj0iQGFuZHJvaWQ6ZHJhd2FibGUvaWNfbWVudV9zaGFyZSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcG9wdXBfbWVudV9zaGFyZSIgLz4KKyAgICAgICAgPC9tZW51PgorICAgIDwvaXRlbT4KKzwvbWVudT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKaW5kZXggZGY5MThjZC4uZTQ2Mjg2OCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL2FycmF5cy54bWwKQEAgLTM4LDYgKzM4LDE0IEBACiAgICAgICAgIDxpdGVtPlBsdXRvPC9pdGVtPgogICAgIDwvc3RyaW5nLWFycmF5PgogCisgICAgPCEtLSBVc2VkIGluIGNvbnRlbnQvQ2xpcGJvYXJkU2FtcGxlLmphdmEgLS0+CisgICAgPHN0cmluZy1hcnJheSBuYW1lPSJjbGlwX2RhdGFfdHlwZXMiPgorICAgICAgICA8aXRlbT5ObyBkYXRhIGluIGNsaXBib2FyZDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VGV4dCBjbGlwPC9pdGVtPgorICAgICAgICA8aXRlbT5JbnRlbnQgY2xpcDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+VXJpIGNsaXA8L2l0ZW0+CisgICAgPC9zdHJpbmctYXJyYXk+CisKICAgICA8IS0tIFVzZWQgaW4gQXBwL1NlYXJjaEludm9rZS5qYXZhIC0tPgogICAgIDxzdHJpbmctYXJyYXkgbmFtZT0ic2VhcmNoX21lbnVNb2RlcyI+CiAgICAgICAgIDxpdGVtPlNlYXJjaCBLZXk8L2l0ZW0+CkBAIC05Miw2ICsxMDAsNyBAQAogICAgICAgICA8aXRlbT5OdW1lcmljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYWJldGljPC9pdGVtPgogICAgICAgICA8aXRlbT5BbHBoYW51bWVyaWM8L2l0ZW0+CisgICAgICAgIDxpdGVtPkNvbXBsZXg8L2l0ZW0+CiAgICAgPC9zdHJpbmctYXJyYXk+CiAKIDwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmluZGV4IDgwMmZjODAuLjk1NThjZGYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTgzLDYgKzgzLDQ2IEBACiAgICAgPHN0cmluZyBuYW1lPSJyZWRpcmVjdF9nZXR0ZXIiPkVudGVyIHRoZSB0ZXh0IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtYWluIGFjdGl2aXR5LiAgUHJlc3MgYmFjayB0byBjYW5jZWwuPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJhcHBseSI+QXBwbHk8L3N0cmluZz4KIAorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfYWxlcnRfZGlhbG9nIj5BcHAvRnJhZ21lbnQvQWxlcnQgRGlhbG9nPC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2FuaW0iPkFwcC9GcmFnbWVudC9BbmltPC9zdHJpbmc+CisgICAgCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9jb250ZXh0X21lbnUiPkFwcC9GcmFnbWVudC9Db250ZXh0IE1lbnU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2NvbnRleHRfbWVudV9tc2ciPkZyYWdtZW50IHBvcHVsYXRpbmcgYSBjb250ZXh0CisgICAgICAgICAgICBtZW51OyBsb25nIHByZXNzIHRoZSBidXR0b24gdG8gc2VlLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibG9uZ19wcmVzcyI+TG9uZyBwcmVzcyBtZTwvc3RyaW5nPgorICAgIAorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nIj5BcHAvRnJhZ21lbnQvRGlhbG9nPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzaG93Ij5TaG93PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2RpYWxvZ19vcl9hY3Rpdml0eSI+QXBwL0ZyYWdtZW50L0RpYWxvZyBvciBBY3Rpdml0eTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X21zZyI+RGVtb25zdHJhdGVzIHRoZSBzYW1lIGZyYWdtZW50CisgICAgICAgICAgICBiZWluZyBzaG93biBhcyBhIGRpYWxvZyBhbmQgZW1iZWRkZWQgaW5zaWRlIG9mIGFuIGFjdGl2aXR5Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfZGlhbG9nX29yX2FjdGl2aXR5X2lubGluZSI+RnJhZ21lbnQgZW1iZWRkZWQgaW5zaWRlCisgICAgICAgICAgICBvZiB0aGUgYWN0aXZpdHk6PC9zdHJpbmc+CisKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xheW91dCI+QXBwL0ZyYWdtZW50L0xheW91dDwvc3RyaW5nPgorICAgIAorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbGlzdF9hcnJheSI+QXBwL0ZyYWdtZW50L0xpc3QgQXJyYXk8L3N0cmluZz4KKyAgICAKKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X2xpc3RfY3Vyc29yX2xvYWRlciI+QXBwL0ZyYWdtZW50L0xpc3QgQ3Vyc29yIExvYWRlcjwvc3RyaW5nPgorICAgIAorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfbWVudSI+QXBwL0ZyYWdtZW50L01lbnU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X21lbnVfbXNnIj5CdWlsZCBtZW51cyBmcm9tIHR3byBmcmFnbWVudHMsIGFsbG93aW5nCisgICAgICAgIHlvdSB0byBoaWRlIHRoZW0gdG8gcmVtb3ZlIHRoZW0uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnQxbWVudSI+U2hvdyBmcmFnbWVudCAxIG1lbnU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50Mm1lbnUiPlNob3cgZnJhZ21lbnQgMiBtZW51PC9zdHJpbmc+CisgICAgCisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9yZXRhaW5faW5zdGFuY2UiPkFwcC9GcmFnbWVudC9SZXRhaW4gSW5zdGFuY2U8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImZyYWdtZW50X3JldGFpbl9pbnN0YW5jZV9tc2ciPkN1cnJlbnQgcHJvZ3Jlc3Mgb2YgcmV0YWluZWQgZnJhZ21lbnQ7CisgICAgcmVzdGFydHMgaWYgZnJhZ21lbnQgaXMgcmUtY3JlYXRlZC48L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InJlc3RhcnQiPlJlc3RhcnQ8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfcmVjZWl2ZV9yZXN1bHQiPkFwcC9GcmFnbWVudC9SZWNlaXZlIFJlc3VsdDwvc3RyaW5nPgorICAgIAorICAgIDxzdHJpbmcgbmFtZT0iZnJhZ21lbnRfc3RhY2siPkFwcC9GcmFnbWVudC9TdGFjazwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibmV3X2ZyYWdtZW50Ij5OZXcgZnJhZ21lbnQ8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfbWVudSI+QXBwL0FjdGl2aXR5L01lbnU8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9Im9wZW5fbWVudSI+T3BlbiBtZW51PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJjbG9zZV9tZW51Ij5DbG9zZSBtZW51PC9zdHJpbmc+CkBAIC0yMzIsNiArMjcyLDEyIEBACiAgICAgPCEtLSAgYXBwL2NvbnRlbnQgZXhhbXBsZXMgc3RyaW5ncyAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGl2aXR5X2NsaXBib2FyZCI+Q29udGVudC9DbGlwYm9hcmQvRGF0YSBUeXBlczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV90ZXh0Ij5Db3B5IFRleHQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcHlfaW50ZW50Ij5Db3B5IEludGVudDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29weV91cmkiPkNvcHkgVVJJPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjbGlwX3R5cGVfcHJvbXB0Ij5DbGlwIFR5cGU8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0iYWN0aXZpdHlfZXh0ZXJuYWxfc3RvcmFnZSI+Q29udGVudC9TdG9yYWdlL0V4dGVybmFsIFN0b3JhZ2U8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImNyZWF0ZSI+Q3JlYXRlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJkZWxldGUiPkRlbGV0ZTwvc3RyaW5nPgpAQCAtMzQ4LDEyICszOTQsMTQgQEAKICAgICA8IS0tICBhcHAvbWVudSBleGFtcGxlcyBzdHJpbmdzICAgICAtLT4KICAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KIAotICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZXNfZnJvbV94bWwiPkFwcC9QcmVmZXJlbmNlcy8xLiBQcmVmZXJlbmNlcyBmcm9tIFhNTDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibGF1bmNoaW5nX3ByZWZlcmVuY2VzIj5BcHAvUHJlZmVyZW5jZXMvMi4gTGF1bmNoaW5nIHByZWZlcmVuY2VzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlX2RlcGVuZGVuY2llcyI+QXBwL1ByZWZlcmVuY2VzLzMuIFByZWZlcmVuY2UgZGVwZW5kZW5jaWVzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJkZWZhdWx0X3ZhbHVlcyI+QXBwL1ByZWZlcmVuY2VzLzQuIERlZmF1bHQgdmFsdWVzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlc19mcm9tX2NvZGUiPkFwcC9QcmVmZXJlbmNlcy81LiBQcmVmZXJlbmNlcyBmcm9tIGNvZGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9ImFkdmFuY2VkX3ByZWZlcmVuY2VzIj5BcHAvUHJlZmVyZW5jZXMvNi4gQWR2YW5jZWQgcHJlZmVyZW5jZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VzX2Zyb21feG1sIj5QcmVmZXJlbmNlLzEuIFByZWZlcmVuY2VzIGZyb20gWE1MPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hpbmdfcHJlZmVyZW5jZXMiPlByZWZlcmVuY2UvMi4gTGF1bmNoaW5nIHByZWZlcmVuY2VzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwcmVmZXJlbmNlX2RlcGVuZGVuY2llcyI+UHJlZmVyZW5jZS8zLiBQcmVmZXJlbmNlIGRlcGVuZGVuY2llczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iZGVmYXVsdF92YWx1ZXMiPlByZWZlcmVuY2UvNC4gRGVmYXVsdCB2YWx1ZXM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByZWZlcmVuY2VzX2Zyb21fY29kZSI+UHJlZmVyZW5jZS81LiBQcmVmZXJlbmNlcyBmcm9tIGNvZGU8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFkdmFuY2VkX3ByZWZlcmVuY2VzIj5QcmVmZXJlbmNlLzYuIEFkdmFuY2VkIHByZWZlcmVuY2VzPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJmcmFnbWVudF9wcmVmZXJlbmNlcyI+UHJlZmVyZW5jZS83LiBGcmFnbWVudDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icHJlZmVyZW5jZV93aXRoX2hlYWRlcnMiPlByZWZlcmVuY2UvOC4gSGVhZGVyczwvc3RyaW5nPgogCiAgICAgPHN0cmluZyBuYW1lPSJsYXVuY2hfcHJlZmVyZW5jZV9hY3Rpdml0eSI+TGF1bmNoIFByZWZlcmVuY2VBY3Rpdml0eTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0iY291bnRlcl92YWx1ZV9pcyI+VGhlIGNvdW50ZXIgdmFsdWUgaXM8L3N0cmluZz4KQEAgLTM4NCw2ICs0MzIsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfc2NyZWVuX3ByZWZlcmVuY2UiPlNjcmVlbiBwcmVmZXJlbmNlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdW1tYXJ5X3NjcmVlbl9wcmVmZXJlbmNlIj5TaG93cyBhbm90aGVyIHNjcmVlbiBvZiBwcmVmZXJlbmNlczwvc3RyaW5nPgogCisgICAgPHN0cmluZyBuYW1lPSJ0aXRsZV9mcmFnbWVudF9wcmVmZXJlbmNlIj5GcmFnbWVudCBwcmVmZXJlbmNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzdW1tYXJ5X2ZyYWdtZW50X3ByZWZlcmVuY2UiPlNob3dzIGFub3RoZXIgZnJhZ21lbnQgb2YgcHJlZmVyZW5jZXM8L3N0cmluZz4KKwogICAgIDxzdHJpbmcgbmFtZT0idGl0bGVfbmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiPlRvZ2dsZSBwcmVmZXJlbmNlPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzdW1tYXJ5X25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIj5QcmVmZXJlbmNlIHRoYXQgaXMgb24gdGhlIG5leHQgc2NyZWVuIGJ1dCBzYW1lIGhpZXJhcmNoeTwvc3RyaW5nPgogCkBAIC00NTgsNiArNTA5LDEzIEBACiAgICAgPHN0cmluZyBuYW1lPSJkaXNhYmxlX2FkbWluIj5EaXNhYmxlIEFkbWluPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9xdWFsaXR5Ij5QYXNzd29yZCBRdWFsaXR5PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9sZW5ndGhfaGludCI+TWluaW11bSBMZW5ndGg8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX21pbmltdW1fbGV0dGVyc19oaW50Ij5NaW5pbXVtIExldHRlcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX21pbmltdW1fdXBwZXJjYXNlX2hpbnQiPk1pbmltdW0gVXBwZXJjYXNlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9taW5pbXVtX2xvd2VyY2FzZV9oaW50Ij5NaW5pbXVtIExvd2VyY2FzZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV9zeW1ib2xzX2hpbnQiPk1pbmltdW0gU3ltYm9sczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV9udW1lcmljX2hpbnQiPk1pbmltdW0gTnVtZXJpYzwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0icGFzc3dvcmRfbWluaW11bV9ub25sZXR0ZXJfaGludCI+TWluaW11bSBOb24tTGV0dGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwYXNzd29yZF9oaXN0b3J5X2xlbmd0aF9oaW50Ij5QYXNzd29yZCBIaXN0b3J5IExlbmd0aDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ic2V0X3Bhc3N3b3JkIj5TZXQgUGFzc3dvcmQ8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InBhc3N3b3JkX2hpbnQiPlBhc3N3b3JkPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXNldF9wYXNzd29yZCI+UmVzZXQgUGFzc3dvcmQ8L3N0cmluZz4KQEAgLTQ2Niw2ICs1MjQsOSBAQAogICAgIDxzdHJpbmcgbmFtZT0id2lwZV9kYXRhIj5XaXBlIERhdGE8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9InRpbWVvdXRfaGludCI+TWF4IHNjcmVlbiB0aW1lb3V0PC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJzZXRfdGltZW91dF9sYWJlbCI+U2V0IFRpbWVvdXQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3h5aG9zdF9oaW50Ij5HbG9iYWwgcHJveHlob3N0OnBvcnQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InByb3h5bGlzdF9oaW50Ij5ObyBwcm94eSBmb3IgZG9tYWluMSxkb21haW4yPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJzZXRfcHJveHlfbGFiZWwiPlNldCBHbG9iYWwgUHJveHk8L3N0cmluZz4KIAogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gIGFwcC92b2ljZSByZWNvZ25pdGlvbiBleGFtcGxlcyBzdHJpbmdzICAtLT4KQEAgLTQ3NSw2ICs1MzYsMjAgQEAKICAgICA8c3RyaW5nIG5hbWU9InNwZWFrX2J1dHRvbiI+U3BlYWshPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbl9yZXN1bHRzIj5SZXN1bHRzOjwvc3RyaW5nPgogCisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisgICAgPCEtLSAgYXBwL2FjdGlvbiBiYXIgZXhhbXBsZXMgc3RyaW5ncyAgLS0+CisgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfbWVjaGFuaWNzIj5BcHAvQWN0aW9uIEJhci9BY3Rpb24gQmFyIE1lY2hhbmljczwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iYWN0aW9uX2Jhcl91c2FnZSI+QXBwL0FjdGlvbiBCYXIvQWN0aW9uIEJhciBVc2FnZTwvc3RyaW5nPgorCisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3NlYXJjaCI+U2VhcmNoPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX2FkZCI+QWRkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX2VkaXQiPkVkaXQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc2hhcmUiPlNoYXJlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJhY3Rpb25fYmFyX3pvb20iPlpvb208L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImFjdGlvbl9iYXJfc2F2ZSI+U2F2ZTwvc3RyaW5nPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgIDwhLS0gIGdyYXBoaWNzIGV4YW1wbGVzIHN0cmluZ3MgIC0tPgogICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KQEAgLTUyMSw2ICs1OTYsMTIgQEAKIAogICAgIDxzdHJpbmcgbmFtZT0icmF0aW5nYmFyX3JhdGluZyI+UmF0aW5nOjwvc3RyaW5nPgogCisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X3NlYXJjaCI+U2VhcmNoPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X2FkZCI+QWRkPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X2VkaXQiPkVkaXQ8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9InBvcHVwX21lbnVfc2hhcmUiPlNoYXJlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwb3B1cF9tZW51X2J1dHRvbiI+TWFrZSBhIFBvcHVwITwvc3RyaW5nPgorCiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICAgPCEtLSAgR29vZ2xlTG9naW4gZXhhbXBsZXMgc3RyaW5ncyAgLS0+CiAgICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CkBAIC04OTcsNSArOTc4LDcgQEAKICAgICA8c3RyaW5nIG5hbWU9InNtc19zcGVha19zdHJpbmdfZm9ybWF0Ij5NZXNzYWdlIGZyb20gIiUxJHMiOiAlMiRzPC9zdHJpbmc+CiAgICAgPHN0cmluZyBuYW1lPSJyZXBseSI+UmVwbHk8L3N0cmluZz4KICAgICA8c3RyaW5nIG5hbWU9ImRpc21pc3MiPkRpc21pc3M8L3N0cmluZz4KKworICAgIDxzdHJpbmcgbmFtZT0ic2hhcmUiPlNoYXJlPC9zdHJpbmc+CiA8L3Jlc291cmNlcz4KIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9hZHZhbmNlZF9wcmVmZXJlbmNlcy54bWwKaW5kZXggYzM2MjI5Ny4uZGQ2ZGUzMSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2FkdmFuY2VkX3ByZWZlcmVuY2VzLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvYWR2YW5jZWRfcHJlZmVyZW5jZXMueG1sCkBAIC0yMyw3ICsyMyw3IEBACiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSBwcmVmZXJlbmNlLCBpZiB0aGUgd2hvbGUgcHJlZmVyZW5jZSB3YW50ZWQgdG8gYmUKICAgICAgICAgIHJlcGxhY2VkIHdlIHdvdWxkIHVzZSB0aGUgbGF5b3V0IGF0dHJpYnV0ZSBpbnN0ZWFkIG9mIHRoZSB3aWRnZXRMYXlvdXQKICAgICAgICAgIGF0dHJpYnV0ZS4gLS0+Ci0gICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHAuTXlQcmVmZXJlbmNlCisgICAgPGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlLk15UHJlZmVyZW5jZQogICAgICAgICAgICAgYW5kcm9pZDprZXk9Im15X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX215X3ByZWZlcmVuY2UiCiAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9teV9wcmVmZXJlbmNlIgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2RldmljZV9hZG1pbl9zYW1wbGUueG1sCmluZGV4IDcxNTgwMDMuLjdiNzU1MTMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9kZXZpY2VfYWRtaW5fc2FtcGxlLnhtbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZGV2aWNlX2FkbWluX3NhbXBsZS54bWwKQEAgLTIyLDYgKzIyLDcgQEAKICAgICAgICAgPHJlc2V0LXBhc3N3b3JkIC8+CiAgICAgICAgIDxmb3JjZS1sb2NrIC8+CiAgICAgICAgIDx3aXBlLWRhdGEgLz4KKyAgICAgICAgPHNldC1nbG9iYWwtcHJveHkgLz4KICAgICA8L3VzZXMtcG9saWNpZXM+CiA8L2RldmljZS1hZG1pbj4KIDwhLS0gRU5EX0lOQ0xVREUobWV0YV9kYXRhKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMzYWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL2ZyYWdtZW50ZWRfcHJlZmVyZW5jZXMueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KKzxQcmVmZXJlbmNlU2NyZWVuCisgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8UHJlZmVyZW5jZUNhdGVnb3J5CisgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL2lubGluZV9wcmVmZXJlbmNlcyI+CisKKyAgICAgICAgPENoZWNrQm94UHJlZmVyZW5jZQorICAgICAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJjaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfdG9nZ2xlX3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfdG9nZ2xlX3ByZWZlcmVuY2UiIC8+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvZGlhbG9nX2Jhc2VkX3ByZWZlcmVuY2VzIj4KKworICAgICAgICA8RWRpdFRleHRQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9ImVkaXR0ZXh0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2VkaXR0ZXh0X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkaWFsb2dUaXRsZT0iQHN0cmluZy9kaWFsb2dfdGl0bGVfZWRpdHRleHRfcHJlZmVyZW5jZSIgLz4KKworICAgICAgICA8TGlzdFByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmtleT0ibGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2xpc3RfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJpZXM9IkBhcnJheS9lbnRyaWVzX2xpc3RfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmVudHJ5VmFsdWVzPSJAYXJyYXkvZW50cnl2YWx1ZXNfbGlzdF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGlhbG9nVGl0bGU9IkBzdHJpbmcvZGlhbG9nX3RpdGxlX2xpc3RfcHJlZmVyZW5jZSIgLz4KKworICAgIDwvUHJlZmVyZW5jZUNhdGVnb3J5PgorCisgICAgPFByZWZlcmVuY2VDYXRlZ29yeQorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9sYXVuY2hfcHJlZmVyZW5jZXMiPgorCisgICAgICAgIDwhLS0gVGhpcyBQcmVmZXJlbmNlU2NyZWVuIHRhZyBzZW5kcyB0aGUgdXNlciB0byBhIG5ldyBmcmFnbWVudCBvZgorICAgICAgICAgICAgIHByZWZlcmVuY2VzLiAgSWYgcnVubmluZyBpbiBhIGxhcmdlIHNjcmVlbiwgdGhleSBjYW4gYmUgZW1iZWRkZWQKKyAgICAgICAgICAgICBpbnNpZGUgb2YgdGhlIG92ZXJhbGwgcHJlZmVyZW5jZXMgVUkuIC0tPgorICAgICAgICA8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZnJhZ21lbnQ9ImNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlLlByZWZlcmVuY2VXaXRoSGVhZGVycyRQcmVmczFGcmFnbWVudElubmVyIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfZnJhZ21lbnRfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IkBzdHJpbmcvc3VtbWFyeV9mcmFnbWVudF9wcmVmZXJlbmNlIj4KKyAgICAgICAgICAgIDwhLS0gQXJiaXRyYXJ5IGtleS92YWx1ZSBwYWlycyBjYW4gYmUgaW5jbHVkZWQgZm9yIGZyYWdtZW50IGFyZ3VtZW50cyAtLT4KKyAgICAgICAgICAgIDxleHRyYSBhbmRyb2lkOm5hbWU9InNvbWVLZXkiIGFuZHJvaWQ6dmFsdWU9InNvbWVQcmVmVmFsdWUiIC8+CisgICAgICAgIDwvUHJlZmVyZW5jZVNjcmVlbj4KKworICAgICAgICA8IS0tIFRoaXMgUHJlZmVyZW5jZVNjcmVlbiB0YWcgc2VuZHMgdGhlIHVzZXIgdG8gYSBjb21wbGV0ZWx5IGRpZmZlcmVudAorICAgICAgICAgICAgIGFjdGl2aXR5LCBzd2l0Y2hpbmcgb3V0IG9mIHRoZSBjdXJyZW50IHByZWZlcmVuY2VzIFVJLiAtLT4KKyAgICAgICAgPFByZWZlcmVuY2VTY3JlZW4KKyAgICAgICAgICAgICAgICBhbmRyb2lkOnRpdGxlPSJAc3RyaW5nL3RpdGxlX2ludGVudF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2ludGVudF9wcmVmZXJlbmNlIj4KKworICAgICAgICAgICAgPGludGVudCBhbmRyb2lkOmFjdGlvbj0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlZJRVciCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGF0YT0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIgLz4KKworICAgICAgICA8L1ByZWZlcmVuY2VTY3JlZW4+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworICAgIDxQcmVmZXJlbmNlQ2F0ZWdvcnkKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvcHJlZmVyZW5jZV9hdHRyaWJ1dGVzIj4KKworICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9InBhcmVudF9jaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvdGl0bGVfcGFyZW50X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpzdW1tYXJ5PSJAc3RyaW5nL3N1bW1hcnlfcGFyZW50X3ByZWZlcmVuY2UiIC8+CisKKyAgICAgICAgPCEtLSBUaGUgdmlzdWFsIHN0eWxlIG9mIGEgY2hpbGQgaXMgZGVmaW5lZCBieSB0aGlzIHN0eWxlZCB0aGVtZSBhdHRyaWJ1dGUuIC0tPgorICAgICAgICA8Q2hlY2tCb3hQcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgYW5kcm9pZDprZXk9ImNoaWxkX2NoZWNrYm94X3ByZWZlcmVuY2UiCisgICAgICAgICAgICAgICAgYW5kcm9pZDpkZXBlbmRlbmN5PSJwYXJlbnRfY2hlY2tib3hfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dD0iP2FuZHJvaWQ6YXR0ci9wcmVmZXJlbmNlTGF5b3V0Q2hpbGQiCisgICAgICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9jaGlsZF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X2NoaWxkX3ByZWZlcmVuY2UiIC8+CisKKyAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KKworPC9QcmVmZXJlbmNlU2NyZWVuPgorPCEtLSBFTkRfSU5DTFVERShwcmVmZXJlbmNlcykgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlc19pbm5lci54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvZnJhZ21lbnRlZF9wcmVmZXJlbmNlc19pbm5lci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2MmM1NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9mcmFnbWVudGVkX3ByZWZlcmVuY2VzX2lubmVyLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgYSBwcmltaXRpdmUgZXhhbXBsZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlZmVyZW5jZXMgYXZhaWxhYmxlLiAtLT4KKzwhLS0gQkVHSU5fSU5DTFVERShwcmVmZXJlbmNlcykgLS0+Cis8UHJlZmVyZW5jZVNjcmVlbgorICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorICAgIDxDaGVja0JveFByZWZlcmVuY2UKKyAgICAgICAgICAgIGFuZHJvaWQ6a2V5PSJuZXh0X3NjcmVlbl9jaGVja2JveF9wcmVmZXJlbmNlIgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy90aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQHN0cmluZy9zdW1tYXJ5X25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlIiAvPgorPC9QcmVmZXJlbmNlU2NyZWVuPgorPCEtLSBFTkRfSU5DTFVERShwcmVmZXJlbmNlcykgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbCBiL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlX2hlYWRlcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkY2M1MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZV9oZWFkZXJzLnhtbApAQCAtMCwwICsxLDQ0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIFRoaXMgaXMgYSBwcmltaXRpdmUgZXhhbXBsZSBzaG93aW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgcHJlZmVyZW5jZXMgYXZhaWxhYmxlLiAtLT4KKzwhLS0gQkVHSU5fSU5DTFVERShoZWFkZXJzKSAtLT4KKzxwcmVmZXJlbmNlLWhlYWRlcnMKKyAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKworICAgIDxoZWFkZXIgYW5kcm9pZDpmcmFnbWVudD0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzJFByZWZzMUZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfYXBwbGljYXRpb25zIgorICAgICAgICAgICAgYW5kcm9pZDp0aXRsZT0iUHJlZnMgMSIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iQW4gZXhhbXBsZSBvZiBzb21lIHByZWZlcmVuY2VzLiIgLz4KKyAgICAgICAgICAgIAorICAgIDxoZWFkZXIgYW5kcm9pZDpmcmFnbWVudD0iY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2UuUHJlZmVyZW5jZVdpdGhIZWFkZXJzJFByZWZzMkZyYWdtZW50IgorICAgICAgICAgICAgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfZGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IlByZWZzIDIiCisgICAgICAgICAgICBhbmRyb2lkOnN1bW1hcnk9IlNvbWUgb3RoZXIgcHJlZmVyZW5jZXMgeW91IGNhbiBzZWUuIj4KKyAgICAgICAgPCEtLSBBcmJpdHJhcnkga2V5L3ZhbHVlIHBhaXJzIGNhbiBiZSBpbmNsdWRlZCB3aXRoIGEgaGVhZGVyIGFzCisgICAgICAgICAgICAgYXJndW1lbnRzIHRvIGl0cyBmcmFnbWVudC4gLS0+CisgICAgICAgIDxleHRyYSBhbmRyb2lkOm5hbWU9InNvbWVLZXkiIGFuZHJvaWQ6dmFsdWU9InNvbWVIZWFkZXJWYWx1ZSIgLz4KKyAgICA8L2hlYWRlcj4KKworICAgIDxoZWFkZXIgYW5kcm9pZDppY29uPSJAZHJhd2FibGUvaWNfc2V0dGluZ3NfZGlzcGxheSIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkludGVudCIKKyAgICAgICAgICAgIGFuZHJvaWQ6c3VtbWFyeT0iTGF1bmNoZXMgYW4gSW50ZW50LiI+CisgICAgICAgIDxpbnRlbnQgYW5kcm9pZDphY3Rpb249ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5WSUVXIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGF0YT0iaHR0cDovL3d3dy5hbmRyb2lkLmNvbSIgLz4KKyAgICA8L2hlYWRlcj4KKyAgICAKKzwvcHJlZmVyZW5jZS1oZWFkZXJzPgorPCEtLSBFTkRfSU5DTFVERShoZWFkZXJzKSAtLT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwgYi9zYW1wbGVzL0FwaURlbW9zL3Jlcy94bWwvcHJlZmVyZW5jZXMueG1sCmluZGV4IDU5YjIzZjEuLjRkOTgyYWMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3MvcmVzL3htbC9wcmVmZXJlbmNlcy54bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9yZXMveG1sL3ByZWZlcmVuY2VzLnhtbApAQCAtMTUsNiArMTUsNyBAQAogLS0+CiAKIDwhLS0gVGhpcyBpcyBhIHByaW1pdGl2ZSBleGFtcGxlIHNob3dpbmcgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBwcmVmZXJlbmNlcyBhdmFpbGFibGUuIC0tPgorPCEtLSBCRUdJTl9JTkNMVURFKHByZWZlcmVuY2VzKSAtLT4KIDxQcmVmZXJlbmNlU2NyZWVuCiAgICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CiAKQEAgLTk3LDMgKzk4LDQgQEAKICAgICA8L1ByZWZlcmVuY2VDYXRlZ29yeT4KICAgICAKIDwvUHJlZmVyZW5jZVNjcmVlbj4KKzwhLS0gRU5EX0lOQ0xVREUocHJlZmVyZW5jZXMpIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL1NoYWtlc3BlYXJlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvU2hha2VzcGVhcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODFkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL1NoYWtlc3BlYXJlLmphdmEKQEAgLTAsMCArMSwyMjMgQEAKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzOworCitwdWJsaWMgZmluYWwgY2xhc3MgU2hha2VzcGVhcmUgeworICAgIC8qKgorICAgICAqIE91ciBkYXRhLCBwYXJ0IDEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBUSVRMRVMgPSAKKyAgICB7CisgICAgICAgICAgICAiSGVucnkgSVYgKDEpIiwgICAKKyAgICAgICAgICAgICJIZW5yeSBWIiwKKyAgICAgICAgICAgICJIZW5yeSBWSUlJIiwgICAgICAgCisgICAgICAgICAgICAiUmljaGFyZCBJSSIsCisgICAgICAgICAgICAiUmljaGFyZCBJSUkiLAorICAgICAgICAgICAgIk1lcmNoYW50IG9mIFZlbmljZSIsICAKKyAgICAgICAgICAgICJPdGhlbGxvIiwKKyAgICAgICAgICAgICJLaW5nIExlYXIiCisgICAgfTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBPdXIgZGF0YSwgcGFydCAyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gRElBTE9HVUUgPSAKKyAgICB7CisgICAgICAgICAgICAiU28gc2hha2VuIGFzIHdlIGFyZSwgc28gd2FuIHdpdGggY2FyZSwiICsKKyAgICAgICAgICAgICJGaW5kIHdlIGEgdGltZSBmb3IgZnJpZ2h0ZWQgcGVhY2UgdG8gcGFudCwiICsKKyAgICAgICAgICAgICJBbmQgYnJlYXRoZSBzaG9ydC13aW5kZWQgYWNjZW50cyBvZiBuZXcgYnJvaWxzIiArCisgICAgICAgICAgICAiVG8gYmUgY29tbWVuY2VkIGluIHN0cmFuZHMgYWZhciByZW1vdGUuIiArCisgICAgICAgICAgICAiTm8gbW9yZSB0aGUgdGhpcnN0eSBlbnRyYW5jZSBvZiB0aGlzIHNvaWwiICsKKyAgICAgICAgICAgICJTaGFsbCBkYXViIGhlciBsaXBzIHdpdGggaGVyIG93biBjaGlsZHJlbidzIGJsb29kOyIgKworICAgICAgICAgICAgIk5vciBtb3JlIHNoYWxsIHRyZW5jaGluZyB3YXIgY2hhbm5lbCBoZXIgZmllbGRzLCIgKworICAgICAgICAgICAgIk5vciBicnVpc2UgaGVyIGZsb3dlcmV0cyB3aXRoIHRoZSBhcm1lZCBob29mcyIgKworICAgICAgICAgICAgIk9mIGhvc3RpbGUgcGFjZXM6IHRob3NlIG9wcG9zZWQgZXllcywiICsKKyAgICAgICAgICAgICJXaGljaCwgbGlrZSB0aGUgbWV0ZW9ycyBvZiBhIHRyb3VibGVkIGhlYXZlbiwiICsKKyAgICAgICAgICAgICJBbGwgb2Ygb25lIG5hdHVyZSwgb2Ygb25lIHN1YnN0YW5jZSBicmVkLCIgKworICAgICAgICAgICAgIkRpZCBsYXRlbHkgbWVldCBpbiB0aGUgaW50ZXN0aW5lIHNob2NrIiArCisgICAgICAgICAgICAiQW5kIGZ1cmlvdXMgY2xvc2Ugb2YgY2l2aWwgYnV0Y2hlcnkiICsKKyAgICAgICAgICAgICJTaGFsbCBub3csIGluIG11dHVhbCB3ZWxsLWJlc2VlbWluZyByYW5rcywiICsKKyAgICAgICAgICAgICJNYXJjaCBhbGwgb25lIHdheSBhbmQgYmUgbm8gbW9yZSBvcHBvc2VkIiArCisgICAgICAgICAgICAiQWdhaW5zdCBhY3F1YWludGFuY2UsIGtpbmRyZWQgYW5kIGFsbGllczoiICsKKyAgICAgICAgICAgICJUaGUgZWRnZSBvZiB3YXIsIGxpa2UgYW4gaWxsLXNoZWF0aGVkIGtuaWZlLCIgKworICAgICAgICAgICAgIk5vIG1vcmUgc2hhbGwgY3V0IGhpcyBtYXN0ZXIuIFRoZXJlZm9yZSwgZnJpZW5kcywiICsKKyAgICAgICAgICAgICJBcyBmYXIgYXMgdG8gdGhlIHNlcHVsY2hyZSBvZiBDaHJpc3QsIiArCisgICAgICAgICAgICAiV2hvc2Ugc29sZGllciBub3csIHVuZGVyIHdob3NlIGJsZXNzZWQgY3Jvc3MiICsKKyAgICAgICAgICAgICJXZSBhcmUgaW1wcmVzc2VkIGFuZCBlbmdhZ2VkIHRvIGZpZ2h0LCIgKworICAgICAgICAgICAgIkZvcnRod2l0aCBhIHBvd2VyIG9mIEVuZ2xpc2ggc2hhbGwgd2UgbGV2eTsiICsKKyAgICAgICAgICAgICJXaG9zZSBhcm1zIHdlcmUgbW91bGRlZCBpbiB0aGVpciBtb3RoZXJzJyB3b21iIiArCisgICAgICAgICAgICAiVG8gY2hhc2UgdGhlc2UgcGFnYW5zIGluIHRob3NlIGhvbHkgZmllbGRzIiArCisgICAgICAgICAgICAiT3ZlciB3aG9zZSBhY3JlcyB3YWxrJ2QgdGhvc2UgYmxlc3NlZCBmZWV0IiArCisgICAgICAgICAgICAiV2hpY2ggZm91cnRlZW4gaHVuZHJlZCB5ZWFycyBhZ28gd2VyZSBuYWlsJ2QiICsKKyAgICAgICAgICAgICJGb3Igb3VyIGFkdmFudGFnZSBvbiB0aGUgYml0dGVyIGNyb3NzLiIgKworICAgICAgICAgICAgIkJ1dCB0aGlzIG91ciBwdXJwb3NlIG5vdyBpcyB0d2VsdmUgbW9udGggb2xkLCIgKworICAgICAgICAgICAgIkFuZCBib290bGVzcyAndGlzIHRvIHRlbGwgeW91IHdlIHdpbGwgZ286IiArCisgICAgICAgICAgICAiVGhlcmVmb3JlIHdlIG1lZXQgbm90IG5vdy4gVGhlbiBsZXQgbWUgaGVhciIgKworICAgICAgICAgICAgIk9mIHlvdSwgbXkgZ2VudGxlIGNvdXNpbiBXZXN0bW9yZWxhbmQsIiArCisgICAgICAgICAgICAiV2hhdCB5ZXN0ZXJuaWdodCBvdXIgY291bmNpbCBkaWQgZGVjcmVlIiArCisgICAgICAgICAgICAiSW4gZm9yd2FyZGluZyB0aGlzIGRlYXIgZXhwZWRpZW5jZS4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiSGVhciBoaW0gYnV0IHJlYXNvbiBpbiBkaXZpbml0eSwiICsgCisgICAgICAgICAgICAiQW5kIGFsbC1hZG1pcmluZyB3aXRoIGFuIGlud2FyZCB3aXNoIiArIAorICAgICAgICAgICAgIllvdSB3b3VsZCBkZXNpcmUgdGhlIGtpbmcgd2VyZSBtYWRlIGEgcHJlbGF0ZToiICsgCisgICAgICAgICAgICAiSGVhciBoaW0gZGViYXRlIG9mIGNvbW1vbndlYWx0aCBhZmZhaXJzLCIgKyAKKyAgICAgICAgICAgICJZb3Ugd291bGQgc2F5IGl0IGhhdGggYmVlbiBhbGwgaW4gYWxsIGhpcyBzdHVkeToiICsgCisgICAgICAgICAgICAiTGlzdCBoaXMgZGlzY291cnNlIG9mIHdhciwgYW5kIHlvdSBzaGFsbCBoZWFyIiArIAorICAgICAgICAgICAgIkEgZmVhcmZ1bCBiYXR0bGUgcmVuZGVyJ2QgeW91IGluIG11c2ljOiIgKyAKKyAgICAgICAgICAgICJUdXJuIGhpbSB0byBhbnkgY2F1c2Ugb2YgcG9saWN5LCIgKyAKKyAgICAgICAgICAgICJUaGUgR29yZGlhbiBrbm90IG9mIGl0IGhlIHdpbGwgdW5sb29zZSwiICsgCisgICAgICAgICAgICAiRmFtaWxpYXIgYXMgaGlzIGdhcnRlcjogdGhhdCwgd2hlbiBoZSBzcGVha3MsIiArIAorICAgICAgICAgICAgIlRoZSBhaXIsIGEgY2hhcnRlcidkIGxpYmVydGluZSwgaXMgc3RpbGwsIiArIAorICAgICAgICAgICAgIkFuZCB0aGUgbXV0ZSB3b25kZXIgbHVya2V0aCBpbiBtZW4ncyBlYXJzLCIgKyAKKyAgICAgICAgICAgICJUbyBzdGVhbCBoaXMgc3dlZXQgYW5kIGhvbmV5J2Qgc2VudGVuY2VzOyIgKyAKKyAgICAgICAgICAgICJTbyB0aGF0IHRoZSBhcnQgYW5kIHByYWN0aWMgcGFydCBvZiBsaWZlIiArIAorICAgICAgICAgICAgIk11c3QgYmUgdGhlIG1pc3RyZXNzIHRvIHRoaXMgdGhlb3JpYzoiICsgCisgICAgICAgICAgICAiV2hpY2ggaXMgYSB3b25kZXIgaG93IGhpcyBncmFjZSBzaG91bGQgZ2xlYW4gaXQsIiArIAorICAgICAgICAgICAgIlNpbmNlIGhpcyBhZGRpY3Rpb24gd2FzIHRvIGNvdXJzZXMgdmFpbiwiICsgCisgICAgICAgICAgICAiSGlzIGNvbXBhbmllcyB1bmxldHRlcidkLCBydWRlIGFuZCBzaGFsbG93LCIgKyAKKyAgICAgICAgICAgICJIaXMgaG91cnMgZmlsbCdkIHVwIHdpdGggcmlvdHMsIGJhbnF1ZXRzLCBzcG9ydHMsIiArIAorICAgICAgICAgICAgIkFuZCBuZXZlciBub3RlZCBpbiBoaW0gYW55IHN0dWR5LCIgKyAKKyAgICAgICAgICAgICJBbnkgcmV0aXJlbWVudCwgYW55IHNlcXVlc3RyYXRpb24iICsgCisgICAgICAgICAgICAiRnJvbSBvcGVuIGhhdW50cyBhbmQgcG9wdWxhcml0eS4iLAorCisgICAgICAgICAgICAiSSBjb21lIG5vIG1vcmUgdG8gbWFrZSB5b3UgbGF1Z2g6IHRoaW5ncyBub3csIiArCisgICAgICAgICAgICAiVGhhdCBiZWFyIGEgd2VpZ2h0eSBhbmQgYSBzZXJpb3VzIGJyb3csIiArCisgICAgICAgICAgICAiU2FkLCBoaWdoLCBhbmQgd29ya2luZywgZnVsbCBvZiBzdGF0ZSBhbmQgd29lLCIgKworICAgICAgICAgICAgIlN1Y2ggbm9ibGUgc2NlbmVzIGFzIGRyYXcgdGhlIGV5ZSB0byBmbG93LCIgKworICAgICAgICAgICAgIldlIG5vdyBwcmVzZW50LiBUaG9zZSB0aGF0IGNhbiBwaXR5LCBoZXJlIiArCisgICAgICAgICAgICAiTWF5LCBpZiB0aGV5IHRoaW5rIGl0IHdlbGwsIGxldCBmYWxsIGEgdGVhcjsiICsKKyAgICAgICAgICAgICJUaGUgc3ViamVjdCB3aWxsIGRlc2VydmUgaXQuIFN1Y2ggYXMgZ2l2ZSIgKworICAgICAgICAgICAgIlRoZWlyIG1vbmV5IG91dCBvZiBob3BlIHRoZXkgbWF5IGJlbGlldmUsIiArCisgICAgICAgICAgICAiTWF5IGhlcmUgZmluZCB0cnV0aCB0b28uIFRob3NlIHRoYXQgY29tZSB0byBzZWUiICsKKyAgICAgICAgICAgICJPbmx5IGEgc2hvdyBvciB0d28sIGFuZCBzbyBhZ3JlZSIgKworICAgICAgICAgICAgIlRoZSBwbGF5IG1heSBwYXNzLCBpZiB0aGV5IGJlIHN0aWxsIGFuZCB3aWxsaW5nLCIgKworICAgICAgICAgICAgIkknbGwgdW5kZXJ0YWtlIG1heSBzZWUgYXdheSB0aGVpciBzaGlsbGluZyIgKworICAgICAgICAgICAgIlJpY2hseSBpbiB0d28gc2hvcnQgaG91cnMuIE9ubHkgdGhleSIgKworICAgICAgICAgICAgIlRoYXQgY29tZSB0byBoZWFyIGEgbWVycnkgYmF3ZHkgcGxheSwiICsKKyAgICAgICAgICAgICJBIG5vaXNlIG9mIHRhcmdldHMsIG9yIHRvIHNlZSBhIGZlbGxvdyIgKworICAgICAgICAgICAgIkluIGEgbG9uZyBtb3RsZXkgY29hdCBndWFyZGVkIHdpdGggeWVsbG93LCIgKworICAgICAgICAgICAgIldpbGwgYmUgZGVjZWl2ZWQ7IGZvciwgZ2VudGxlIGhlYXJlcnMsIGtub3csIiArCisgICAgICAgICAgICAiVG8gcmFuayBvdXIgY2hvc2VuIHRydXRoIHdpdGggc3VjaCBhIHNob3ciICsKKyAgICAgICAgICAgICJBcyBmb29sIGFuZCBmaWdodCBpcywgYmVzaWRlIGZvcmZlaXRpbmciICsKKyAgICAgICAgICAgICJPdXIgb3duIGJyYWlucywgYW5kIHRoZSBvcGluaW9uIHRoYXQgd2UgYnJpbmcsIiArCisgICAgICAgICAgICAiVG8gbWFrZSB0aGF0IG9ubHkgdHJ1ZSB3ZSBub3cgaW50ZW5kLCIgKworICAgICAgICAgICAgIldpbGwgbGVhdmUgdXMgbmV2ZXIgYW4gdW5kZXJzdGFuZGluZyBmcmllbmQuIiArCisgICAgICAgICAgICAiVGhlcmVmb3JlLCBmb3IgZ29vZG5lc3MnIHNha2UsIGFuZCBhcyB5b3UgYXJlIGtub3duIiArCisgICAgICAgICAgICAiVGhlIGZpcnN0IGFuZCBoYXBwaWVzdCBoZWFyZXJzIG9mIHRoZSB0b3duLCIgKworICAgICAgICAgICAgIkJlIHNhZCwgYXMgd2Ugd291bGQgbWFrZSB5ZTogdGhpbmsgeWUgc2VlIiArCisgICAgICAgICAgICAiVGhlIHZlcnkgcGVyc29ucyBvZiBvdXIgbm9ibGUgc3RvcnkiICsKKyAgICAgICAgICAgICJBcyB0aGV5IHdlcmUgbGl2aW5nOyB0aGluayB5b3Ugc2VlIHRoZW0gZ3JlYXQsIiArCisgICAgICAgICAgICAiQW5kIGZvbGxvdydkIHdpdGggdGhlIGdlbmVyYWwgdGhyb25nIGFuZCBzd2VhdCIgKworICAgICAgICAgICAgIk9mIHRob3VzYW5kIGZyaWVuZHM7IHRoZW4gaW4gYSBtb21lbnQsIHNlZSIgKworICAgICAgICAgICAgIkhvdyBzb29uIHRoaXMgbWlnaHRpbmVzcyBtZWV0cyBtaXNlcnk6IiArCisgICAgICAgICAgICAiQW5kLCBpZiB5b3UgY2FuIGJlIG1lcnJ5IHRoZW4sIEknbGwgc2F5IiArCisgICAgICAgICAgICAiQSBtYW4gbWF5IHdlZXAgdXBvbiBoaXMgd2VkZGluZy1kYXkuIiwKKyAgICAgICAgICAgIAorICAgICAgICAgICAgIkZpcnN0LCBoZWF2ZW4gYmUgdGhlIHJlY29yZCB0byBteSBzcGVlY2ghIiArIAorICAgICAgICAgICAgIkluIHRoZSBkZXZvdGlvbiBvZiBhIHN1YmplY3QncyBsb3ZlLCIgKyAKKyAgICAgICAgICAgICJUZW5kZXJpbmcgdGhlIHByZWNpb3VzIHNhZmV0eSBvZiBteSBwcmluY2UsIiArIAorICAgICAgICAgICAgIkFuZCBmcmVlIGZyb20gb3RoZXIgbWlzYmVnb3R0ZW4gaGF0ZSwiICsgCisgICAgICAgICAgICAiQ29tZSBJIGFwcGVsbGFudCB0byB0aGlzIHByaW5jZWx5IHByZXNlbmNlLiIgKyAKKyAgICAgICAgICAgICJOb3csIFRob21hcyBNb3dicmF5LCBkbyBJIHR1cm4gdG8gdGhlZSwiICsgCisgICAgICAgICAgICAiQW5kIG1hcmsgbXkgZ3JlZXRpbmcgd2VsbDsgZm9yIHdoYXQgSSBzcGVhayIgKyAKKyAgICAgICAgICAgICJNeSBib2R5IHNoYWxsIG1ha2UgZ29vZCB1cG9uIHRoaXMgZWFydGgsIiArIAorICAgICAgICAgICAgIk9yIG15IGRpdmluZSBzb3VsIGFuc3dlciBpdCBpbiBoZWF2ZW4uIiArIAorICAgICAgICAgICAgIlRob3UgYXJ0IGEgdHJhaXRvciBhbmQgYSBtaXNjcmVhbnQsIiArIAorICAgICAgICAgICAgIlRvbyBnb29kIHRvIGJlIHNvIGFuZCB0b28gYmFkIHRvIGxpdmUsIiArIAorICAgICAgICAgICAgIlNpbmNlIHRoZSBtb3JlIGZhaXIgYW5kIGNyeXN0YWwgaXMgdGhlIHNreSwiICsgCisgICAgICAgICAgICAiVGhlIHVnbGllciBzZWVtIHRoZSBjbG91ZHMgdGhhdCBpbiBpdCBmbHkuIiArIAorICAgICAgICAgICAgIk9uY2UgbW9yZSwgdGhlIG1vcmUgdG8gYWdncmF2YXRlIHRoZSBub3RlLCIgKyAKKyAgICAgICAgICAgICJXaXRoIGEgZm91bCB0cmFpdG9yJ3MgbmFtZSBzdHVmZiBJIHRoeSB0aHJvYXQ7IiArIAorICAgICAgICAgICAgIkFuZCB3aXNoLCBzbyBwbGVhc2UgbXkgc292ZXJlaWduLCBlcmUgSSBtb3ZlLCIgKyAKKyAgICAgICAgICAgICJXaGF0IG15IHRvbmd1ZSBzcGVha3MgbXkgcmlnaHQgZHJhd24gc3dvcmQgbWF5IHByb3ZlLiIsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICJOb3cgaXMgdGhlIHdpbnRlciBvZiBvdXIgZGlzY29udGVudCIgKyAKKyAgICAgICAgICAgICJNYWRlIGdsb3Jpb3VzIHN1bW1lciBieSB0aGlzIHN1biBvZiBZb3JrOyIgKyAKKyAgICAgICAgICAgICJBbmQgYWxsIHRoZSBjbG91ZHMgdGhhdCBsb3VyJ2QgdXBvbiBvdXIgaG91c2UiICsgCisgICAgICAgICAgICAiSW4gdGhlIGRlZXAgYm9zb20gb2YgdGhlIG9jZWFuIGJ1cmllZC4iICsgCisgICAgICAgICAgICAiTm93IGFyZSBvdXIgYnJvd3MgYm91bmQgd2l0aCB2aWN0b3Jpb3VzIHdyZWF0aHM7IiArIAorICAgICAgICAgICAgIk91ciBicnVpc2VkIGFybXMgaHVuZyB1cCBmb3IgbW9udW1lbnRzOyIgKyAKKyAgICAgICAgICAgICJPdXIgc3Rlcm4gYWxhcnVtcyBjaGFuZ2VkIHRvIG1lcnJ5IG1lZXRpbmdzLCIgKyAKKyAgICAgICAgICAgICJPdXIgZHJlYWRmdWwgbWFyY2hlcyB0byBkZWxpZ2h0ZnVsIG1lYXN1cmVzLiIgKyAKKyAgICAgICAgICAgICJHcmltLXZpc2FnZWQgd2FyIGhhdGggc21vb3RoJ2QgaGlzIHdyaW5rbGVkIGZyb250OyIgKyAKKyAgICAgICAgICAgICJBbmQgbm93LCBpbnN0ZWFkIG9mIG1vdW50aW5nIGJhcmRlZCBzdGVlZHMiICsgCisgICAgICAgICAgICAiVG8gZnJpZ2h0IHRoZSBzb3VscyBvZiBmZWFyZnVsIGFkdmVyc2FyaWVzLCIgKyAKKyAgICAgICAgICAgICJIZSBjYXBlcnMgbmltYmx5IGluIGEgbGFkeSdzIGNoYW1iZXIiICsgCisgICAgICAgICAgICAiVG8gdGhlIGxhc2NpdmlvdXMgcGxlYXNpbmcgb2YgYSBsdXRlLiIgKyAKKyAgICAgICAgICAgICJCdXQgSSwgdGhhdCBhbSBub3Qgc2hhcGVkIGZvciBzcG9ydGl2ZSB0cmlja3MsIiArIAorICAgICAgICAgICAgIk5vciBtYWRlIHRvIGNvdXJ0IGFuIGFtb3JvdXMgbG9va2luZy1nbGFzczsiICsgCisgICAgICAgICAgICAiSSwgdGhhdCBhbSBydWRlbHkgc3RhbXAnZCwgYW5kIHdhbnQgbG92ZSdzIG1hamVzdHkiICsgCisgICAgICAgICAgICAiVG8gc3RydXQgYmVmb3JlIGEgd2FudG9uIGFtYmxpbmcgbnltcGg7IiArIAorICAgICAgICAgICAgIkksIHRoYXQgYW0gY3VydGFpbCdkIG9mIHRoaXMgZmFpciBwcm9wb3J0aW9uLCIgKyAKKyAgICAgICAgICAgICJDaGVhdGVkIG9mIGZlYXR1cmUgYnkgZGlzc2VtYmxpbmcgbmF0dXJlLCIgKyAKKyAgICAgICAgICAgICJEZWZvcm1lZCwgdW5maW5pc2gnZCwgc2VudCBiZWZvcmUgbXkgdGltZSIgKyAKKyAgICAgICAgICAgICJJbnRvIHRoaXMgYnJlYXRoaW5nIHdvcmxkLCBzY2FyY2UgaGFsZiBtYWRlIHVwLCIgKyAKKyAgICAgICAgICAgICJBbmQgdGhhdCBzbyBsYW1lbHkgYW5kIHVuZmFzaGlvbmFibGUiICsgCisgICAgICAgICAgICAiVGhhdCBkb2dzIGJhcmsgYXQgbWUgYXMgSSBoYWx0IGJ5IHRoZW07IiArIAorICAgICAgICAgICAgIldoeSwgSSwgaW4gdGhpcyB3ZWFrIHBpcGluZyB0aW1lIG9mIHBlYWNlLCIgKyAKKyAgICAgICAgICAgICJIYXZlIG5vIGRlbGlnaHQgdG8gcGFzcyBhd2F5IHRoZSB0aW1lLCIgKyAKKyAgICAgICAgICAgICJVbmxlc3MgdG8gc3B5IG15IHNoYWRvdyBpbiB0aGUgc3VuIiArIAorICAgICAgICAgICAgIkFuZCBkZXNjYW50IG9uIG1pbmUgb3duIGRlZm9ybWl0eToiICsgCisgICAgICAgICAgICAiQW5kIHRoZXJlZm9yZSwgc2luY2UgSSBjYW5ub3QgcHJvdmUgYSBsb3ZlciwiICsgCisgICAgICAgICAgICAiVG8gZW50ZXJ0YWluIHRoZXNlIGZhaXIgd2VsbC1zcG9rZW4gZGF5cywiICsgCisgICAgICAgICAgICAiSSBhbSBkZXRlcm1pbmVkIHRvIHByb3ZlIGEgdmlsbGFpbiIgKyAKKyAgICAgICAgICAgICJBbmQgaGF0ZSB0aGUgaWRsZSBwbGVhc3VyZXMgb2YgdGhlc2UgZGF5cy4iICsgCisgICAgICAgICAgICAiUGxvdHMgaGF2ZSBJIGxhaWQsIGluZHVjdGlvbnMgZGFuZ2Vyb3VzLCIgKyAKKyAgICAgICAgICAgICJCeSBkcnVua2VuIHByb3BoZWNpZXMsIGxpYmVscyBhbmQgZHJlYW1zLCIgKyAKKyAgICAgICAgICAgICJUbyBzZXQgbXkgYnJvdGhlciBDbGFyZW5jZSBhbmQgdGhlIGtpbmciICsgCisgICAgICAgICAgICAiSW4gZGVhZGx5IGhhdGUgdGhlIG9uZSBhZ2FpbnN0IHRoZSBvdGhlcjoiICsgCisgICAgICAgICAgICAiQW5kIGlmIEtpbmcgRWR3YXJkIGJlIGFzIHRydWUgYW5kIGp1c3QiICsgCisgICAgICAgICAgICAiQXMgSSBhbSBzdWJ0bGUsIGZhbHNlIGFuZCB0cmVhY2hlcm91cywiICsgCisgICAgICAgICAgICAiVGhpcyBkYXkgc2hvdWxkIENsYXJlbmNlIGNsb3NlbHkgYmUgbWV3J2QgdXAsIiArIAorICAgICAgICAgICAgIkFib3V0IGEgcHJvcGhlY3ksIHdoaWNoIHNheXMgdGhhdCAnRyciICsgCisgICAgICAgICAgICAiT2YgRWR3YXJkJ3MgaGVpcnMgdGhlIG11cmRlcmVyIHNoYWxsIGJlLiIgKyAKKyAgICAgICAgICAgICJEaXZlLCB0aG91Z2h0cywgZG93biB0byBteSBzb3VsOiBoZXJlIiArIAorICAgICAgICAgICAgIkNsYXJlbmNlIGNvbWVzLiIsCisgICAgICAgICAgICAKKyAgICAgICAgICAgICJUbyBiYWl0IGZpc2ggd2l0aGFsOiBpZiBpdCB3aWxsIGZlZWQgbm90aGluZyBlbHNlLCIgKyAKKyAgICAgICAgICAgICJpdCB3aWxsIGZlZWQgbXkgcmV2ZW5nZS4gSGUgaGF0aCBkaXNncmFjZWQgbWUsIGFuZCIgKyAKKyAgICAgICAgICAgICJoaW5kZXJlZCBtZSBoYWxmIGEgbWlsbGlvbjsgbGF1Z2hlZCBhdCBteSBsb3NzZXMsIiArIAorICAgICAgICAgICAgIm1vY2tlZCBhdCBteSBnYWlucywgc2Nvcm5lZCBteSBuYXRpb24sIHRod2FydGVkIG15IiArIAorICAgICAgICAgICAgImJhcmdhaW5zLCBjb29sZWQgbXkgZnJpZW5kcywgaGVhdGVkIG1pbmUiICsgCisgICAgICAgICAgICAiZW5lbWllczsgYW5kIHdoYXQncyBoaXMgcmVhc29uPyBJIGFtIGEgSmV3LiBIYXRoIiArIAorICAgICAgICAgICAgIm5vdCBhIEpldyBleWVzPyBoYXRoIG5vdCBhIEpldyBoYW5kcywgb3JnYW5zLCIgKyAKKyAgICAgICAgICAgICJkaW1lbnNpb25zLCBzZW5zZXMsIGFmZmVjdGlvbnMsIHBhc3Npb25zPyBmZWQgd2l0aCIgKyAKKyAgICAgICAgICAgICJ0aGUgc2FtZSBmb29kLCBodXJ0IHdpdGggdGhlIHNhbWUgd2VhcG9ucywgc3ViamVjdCIgKyAKKyAgICAgICAgICAgICJ0byB0aGUgc2FtZSBkaXNlYXNlcywgaGVhbGVkIGJ5IHRoZSBzYW1lIG1lYW5zLCIgKyAKKyAgICAgICAgICAgICJ3YXJtZWQgYW5kIGNvb2xlZCBieSB0aGUgc2FtZSB3aW50ZXIgYW5kIHN1bW1lciwgYXMiICsgCisgICAgICAgICAgICAiYSBDaHJpc3RpYW4gaXM/IElmIHlvdSBwcmljayB1cywgZG8gd2Ugbm90IGJsZWVkPyIgKyAKKyAgICAgICAgICAgICJpZiB5b3UgdGlja2xlIHVzLCBkbyB3ZSBub3QgbGF1Z2g/IGlmIHlvdSBwb2lzb24iICsgCisgICAgICAgICAgICAidXMsIGRvIHdlIG5vdCBkaWU/IGFuZCBpZiB5b3Ugd3JvbmcgdXMsIHNoYWxsIHdlIG5vdCIgKyAKKyAgICAgICAgICAgICJyZXZlbmdlPyBJZiB3ZSBhcmUgbGlrZSB5b3UgaW4gdGhlIHJlc3QsIHdlIHdpbGwiICsgCisgICAgICAgICAgICAicmVzZW1ibGUgeW91IGluIHRoYXQuIElmIGEgSmV3IHdyb25nIGEgQ2hyaXN0aWFuLCIgKyAKKyAgICAgICAgICAgICJ3aGF0IGlzIGhpcyBodW1pbGl0eT8gUmV2ZW5nZS4gSWYgYSBDaHJpc3RpYW4iICsgCisgICAgICAgICAgICAid3JvbmcgYSBKZXcsIHdoYXQgc2hvdWxkIGhpcyBzdWZmZXJhbmNlIGJlIGJ5IiArIAorICAgICAgICAgICAgIkNocmlzdGlhbiBleGFtcGxlPyBXaHksIHJldmVuZ2UuIFRoZSB2aWxsYW55IHlvdSIgKyAKKyAgICAgICAgICAgICJ0ZWFjaCBtZSwgSSB3aWxsIGV4ZWN1dGUsIGFuZCBpdCBzaGFsbCBnbyBoYXJkIGJ1dCBJIiArIAorICAgICAgICAgICAgIndpbGwgYmV0dGVyIHRoZSBpbnN0cnVjdGlvbi4iLAorICAgICAgICAgICAgCisgICAgICAgICAgICAiVmlydHVlISBhIGZpZyEgJ3RpcyBpbiBvdXJzZWx2ZXMgdGhhdCB3ZSBhcmUgdGh1cyIgKyAKKyAgICAgICAgICAgICJvciB0aHVzLiBPdXIgYm9kaWVzIGFyZSBvdXIgZ2FyZGVucywgdG8gdGhlIHdoaWNoIiArIAorICAgICAgICAgICAgIm91ciB3aWxscyBhcmUgZ2FyZGVuZXJzOiBzbyB0aGF0IGlmIHdlIHdpbGwgcGxhbnQiICsgCisgICAgICAgICAgICAibmV0dGxlcywgb3Igc293IGxldHR1Y2UsIHNldCBoeXNzb3AgYW5kIHdlZWQgdXAiICsgCisgICAgICAgICAgICAidGh5bWUsIHN1cHBseSBpdCB3aXRoIG9uZSBnZW5kZXIgb2YgaGVyYnMsIG9yIiArIAorICAgICAgICAgICAgImRpc3RyYWN0IGl0IHdpdGggbWFueSwgZWl0aGVyIHRvIGhhdmUgaXQgc3RlcmlsZSIgKyAKKyAgICAgICAgICAgICJ3aXRoIGlkbGVuZXNzLCBvciBtYW51cmVkIHdpdGggaW5kdXN0cnksIHdoeSwgdGhlIiArIAorICAgICAgICAgICAgInBvd2VyIGFuZCBjb3JyaWdpYmxlIGF1dGhvcml0eSBvZiB0aGlzIGxpZXMgaW4gb3VyIiArIAorICAgICAgICAgICAgIndpbGxzLiBJZiB0aGUgYmFsYW5jZSBvZiBvdXIgbGl2ZXMgaGFkIG5vdCBvbmUiICsgCisgICAgICAgICAgICAic2NhbGUgb2YgcmVhc29uIHRvIHBvaXNlIGFub3RoZXIgb2Ygc2Vuc3VhbGl0eSwgdGhlIiArIAorICAgICAgICAgICAgImJsb29kIGFuZCBiYXNlbmVzcyBvZiBvdXIgbmF0dXJlcyB3b3VsZCBjb25kdWN0IHVzIiArIAorICAgICAgICAgICAgInRvIG1vc3QgcHJlcG9zdGVyb3VzIGNvbmNsdXNpb25zOiBidXQgd2UgaGF2ZSIgKyAKKyAgICAgICAgICAgICJyZWFzb24gdG8gY29vbCBvdXIgcmFnaW5nIG1vdGlvbnMsIG91ciBjYXJuYWwiICsgCisgICAgICAgICAgICAic3RpbmdzLCBvdXIgdW5iaXR0ZWQgbHVzdHMsIHdoZXJlb2YgSSB0YWtlIHRoaXMgdGhhdCIgKyAKKyAgICAgICAgICAgICJ5b3UgY2FsbCBsb3ZlIHRvIGJlIGEgc2VjdCBvciBzY2lvbi4iLAorCisgICAgICAgICAgICAiQmxvdywgd2luZHMsIGFuZCBjcmFjayB5b3VyIGNoZWVrcyEgcmFnZSEgYmxvdyEiICsgCisgICAgICAgICAgICAiWW91IGNhdGFyYWN0cyBhbmQgaHVycmljYW5vZXMsIHNwb3V0IiArIAorICAgICAgICAgICAgIlRpbGwgeW91IGhhdmUgZHJlbmNoJ2Qgb3VyIHN0ZWVwbGVzLCBkcm93bidkIHRoZSBjb2NrcyEiICsgCisgICAgICAgICAgICAiWW91IHN1bHBodXJvdXMgYW5kIHRob3VnaHQtZXhlY3V0aW5nIGZpcmVzLCIgKyAKKyAgICAgICAgICAgICJWYXVudC1jb3VyaWVycyB0byBvYWstY2xlYXZpbmcgdGh1bmRlcmJvbHRzLCIgKyAKKyAgICAgICAgICAgICJTaW5nZSBteSB3aGl0ZSBoZWFkISBBbmQgdGhvdSwgYWxsLXNoYWtpbmcgdGh1bmRlciwiICsgCisgICAgICAgICAgICAiU21pdGUgZmxhdCB0aGUgdGhpY2sgcm90dW5kaXR5IG8nIHRoZSB3b3JsZCEiICsgCisgICAgICAgICAgICAiQ3JhY2sgbmF0dXJlJ3MgbW91bGRzLCBhbiBnZXJtZW5zIHNwaWxsIGF0IG9uY2UsIiArIAorICAgICAgICAgICAgIlRoYXQgbWFrZSBpbmdyYXRlZnVsIG1hbiEiCisgICAgfTsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uTG9hZGluZy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25Mb2FkaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiOWZkZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQW5pbWF0aW9uTG9hZGluZy5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZUluZmxhdGVyOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5TZXF1ZW5jZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyBsb2FkaW5nIEFuaW1hdGFibGUgb2JqZWN0cyBmcm9tIFhNTCByZXNvdXJjZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBBbmltYXRpb25Mb2FkaW5nIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERVUkFUSU9OID0gMTUwMDsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9sb2FkaW5nKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEJBTExfU0laRSA9IDEwMGY7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBBbmltYXRhYmxlIGFuaW1hdGlvbiA9IG51bGw7CisKKyAgICAgICAgcHVibGljIE15QW5pbWF0aW9uVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgYWRkQmFsbCgxMDAsIDApOworICAgICAgICAgICAgYWRkQmFsbCgyNTAsIDApOworICAgICAgICAgICAgYWRkQmFsbCg0MDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgYW5pbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoUHJvcGVydHlBbmltYXRvcikgQW5pbWF0YWJsZUluZmxhdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkQW5pbWF0YWJsZShnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwgUi5hbmltLnByb3BlcnR5X2FuaW1hdG9yKTsKKyAgICAgICAgICAgICAgICBhbmltLmFkZFVwZGF0ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgIGFuaW0uc2V0VGFyZ2V0KGJhbGxzLmdldCgwKSk7CisKKyAgICAgICAgICAgICAgICBBbmltYXRvciBmYWRlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQW5pbWF0b3IpIEFuaW1hdGFibGVJbmZsYXRlci5sb2FkQW5pbWF0YWJsZShnZXRBcHBsaWNhdGlvbkNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFIuYW5pbS5hbmltYXRvcik7CisgICAgICAgICAgICAgICAgZmFkZXIuYWRkVXBkYXRlTGlzdGVuZXIobmV3IEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFsbHMuZ2V0KDEpLnNldEFscGhhKChGbG9hdCkgYW5pbWF0aW9uLmdldEFuaW1hdGVkVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIFNlcXVlbmNlciBzZXEgPQorICAgICAgICAgICAgICAgICAgICAgICAgKFNlcXVlbmNlcikgQW5pbWF0YWJsZUluZmxhdGVyLmxvYWRBbmltYXRhYmxlKGdldEFwcGxpY2F0aW9uQ29udGV4dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUi5hbmltLnNlcXVlbmNlcik7CisgICAgICAgICAgICAgICAgc2VxLnNldFRhcmdldChiYWxscy5nZXQoMikpOworCisgICAgICAgICAgICAgICAgYW5pbWF0aW9uID0gbmV3IFNlcXVlbmNlcigpOworICAgICAgICAgICAgICAgICgoU2VxdWVuY2VyKSBhbmltYXRpb24pLnBsYXlUb2dldGhlcihhbmltLCBmYWRlciwgc2VxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBhbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZShCQUxMX1NJWkUsIEJBTExfU0laRSk7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGZvciAoU2hhcGVIb2xkZXIgYmFsbCA6IGJhbGxzKSB7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShiYWxsLmdldFgoKSwgYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZSgtYmFsbC5nZXRYKCksIC1iYWxsLmdldFkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvciBhbmltYXRpb24pIHsKKworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IGJhbGxzLmdldCgwKTsKKyAgICAgICAgICAgIGJhbGwuc2V0WSgoRmxvYXQpYW5pbWF0aW9uLmdldEFuaW1hdGVkVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25TZWVraW5nLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdGlvblNlZWtpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTQyYzA0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRpb25TZWVraW5nLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQm91bmNlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIEFuaW1hdG9yLiBUaGUgU2Vla0JhciBpbiB0aGUKKyAqIFVJIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBQcmVzc2luZyB0aGUgUnVuIGJ1dHRvbiB3aWxsIHBsYXkgZnJvbQorICogdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEFuaW1hdGlvblNlZWtpbmcgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSAxNTAwOworICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9zZWVraW5nKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbVNlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQuc2Vla0Jhcik7CisgICAgICAgIG1TZWVrQmFyLnNldE1heChEVVJBVElPTik7CisgICAgICAgIG1TZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHNlZWtpbmcgb24gYXBwIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKGFuaW1WaWV3LmdldEhlaWdodCgpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYW5pbVZpZXcuc2Vlayhwcm9ncmVzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIsIEFuaW1hdGFibGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFRCA9IDB4ZmZGRjgwODA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCTFVFID0gMHhmZjgwODBGRjsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENZQU4gPSAweGZmODBmZmZmOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR1JFRU4gPSAweGZmODBmZjgwOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBCQUxMX1NJWkUgPSAxMDBmOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgU2VxdWVuY2VyIGFuaW1hdGlvbiA9IG51bGw7CisgICAgICAgIEFuaW1hdG9yIGJvdW5jZUFuaW0gPSBudWxsOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gYWRkQmFsbCgyMDAsIDApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGlmIChib3VuY2VBbmltID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoMTUwMCwgYmFsbCwgInkiLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFsbC5nZXRZKCksIGdldEhlaWdodCgpIC0gQkFMTF9TSVpFKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQm91bmNlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYm91bmNlQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2Vlayhsb25nIHNlZWtUaW1lKSB7CisgICAgICAgICAgICBjcmVhdGVBbmltYXRpb24oKTsKKyAgICAgICAgICAgIGJvdW5jZUFuaW0uc2V0Q3VycmVudFBsYXlUaW1lKHNlZWtUaW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZShCQUxMX1NJWkUsIEJBTExfU0laRSk7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoMTAwICsgTWF0aC5yYW5kb20oKSAqIDE1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgIGJhbGwuZ2V0U2hhcGUoKS5kcmF3KGNhbnZhcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIGxvbmcgcGxheXRpbWUgPSBib3VuY2VBbmltLmdldEN1cnJlbnRQbGF5VGltZSgpOworICAgICAgICAgICAgLy9tU2Vla0Jhci5zZXRQcm9ncmVzcygoaW50KXBsYXl0aW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBiYWxscy5yZW1vdmUoKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW1hdGlvbikuZ2V0VGFyZ2V0KCkpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRvckV2ZW50cy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9BbmltYXRvckV2ZW50cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGRiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0FuaW1hdG9yRXZlbnRzLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdG9yOworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLlByb3BlcnR5QW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uU2VxdWVuY2VyOworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUGFpbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SYWRpYWxHcmFkaWVudDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlNoYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLlNoYXBlRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5zaGFwZXMuT3ZhbFNoYXBlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCisvKioKKyAqIFRoaXMgZGVtbyBzaG93cyBob3cgdGhlIEFuaW1hdGFibGVMaXN0ZW5lciBldmVudHMgd29yay4KKyAqLworcHVibGljIGNsYXNzIEFuaW1hdG9yRXZlbnRzIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgVGV4dFZpZXcgc3RhcnRUZXh0LCByZXBlYXRUZXh0LCBjYW5jZWxUZXh0LCBlbmRUZXh0OworICAgIFRleHRWaWV3IHN0YXJ0VGV4dEFuaW1hdG9yLCByZXBlYXRUZXh0QW5pbWF0b3IsIGNhbmNlbFRleHRBbmltYXRvciwgZW5kVGV4dEFuaW1hdG9yOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5hbmltYXRvcl9ldmVudHMpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgTXlBbmltYXRpb25WaWV3IGFuaW1WaWV3ID0gbmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoYW5pbVZpZXcpOworICAgICAgICBzdGFydFRleHQgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0VGV4dCk7CisgICAgICAgIHN0YXJ0VGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICByZXBlYXRUZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5yZXBlYXRUZXh0KTsKKyAgICAgICAgcmVwZWF0VGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICBjYW5jZWxUZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5jYW5jZWxUZXh0KTsKKyAgICAgICAgY2FuY2VsVGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICBlbmRUZXh0ID0gKFRleHRWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5lbmRUZXh0KTsKKyAgICAgICAgZW5kVGV4dC5zZXRBbHBoYSguNWYpOworICAgICAgICBzdGFydFRleHRBbmltYXRvciA9IChUZXh0VmlldykgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRUZXh0QW5pbWF0b3IpOworICAgICAgICBzdGFydFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICByZXBlYXRUZXh0QW5pbWF0b3IgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLnJlcGVhdFRleHRBbmltYXRvcik7CisgICAgICAgIHJlcGVhdFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICBjYW5jZWxUZXh0QW5pbWF0b3IgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmNhbmNlbFRleHRBbmltYXRvcik7CisgICAgICAgIGNhbmNlbFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICBlbmRUZXh0QW5pbWF0b3IgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLmVuZFRleHRBbmltYXRvcik7CisgICAgICAgIGVuZFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICBmaW5hbCBDaGVja0JveCBlbmRDQiA9IChDaGVja0JveCkgZmluZFZpZXdCeUlkKFIuaWQuZW5kQ0IpOworCisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zdGFydEJ1dHRvbik7CisgICAgICAgIHN0YXJ0ZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnN0YXJ0QW5pbWF0aW9uKGVuZENCLmlzQ2hlY2tlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgQnV0dG9uIGNhbmNlbGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuY2FuY2VsQnV0dG9uKTsKKyAgICAgICAgY2FuY2VsZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LmNhbmNlbEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBCdXR0b24gZW5kZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5lbmRCdXR0b24pOworICAgICAgICBlbmRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuZW5kQW5pbWF0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorCisgICAgcHVibGljIGNsYXNzIE15QW5pbWF0aW9uVmlldyBleHRlbmRzIFZpZXcgaW1wbGVtZW50cyBBbmltYXRhYmxlLkFuaW1hdGFibGVMaXN0ZW5lciwKKyAgICBBbmltYXRvci5BbmltYXRvclVwZGF0ZUxpc3RlbmVyIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPiBiYWxscyA9IG5ldyBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+KCk7CisgICAgICAgIEFuaW1hdGFibGUgYW5pbWF0aW9uOworICAgICAgICBTaGFwZUhvbGRlciBiYWxsID0gbnVsbDsKKyAgICAgICAgYm9vbGVhbiBlbmRJbW1lZGlhdGVseSA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJhbGwgPSBjcmVhdGVCYWxsKDI1LCAyNSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciB5QW5pbSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKDE1MDAsIGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIDUwZik7CisgICAgICAgICAgICAgICAgeUFuaW0uc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICAgICAgeUFuaW0uc2V0UmVwZWF0TW9kZShBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5zZXRJbnRlcnBvbGF0b3IobmV3IEFjY2VsZXJhdGVJbnRlcnBvbGF0b3IoMmYpKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgICAgICB5QW5pbS5hZGRMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgeEFuaW0gPSBuZXcgUHJvcGVydHlBbmltYXRvcigxNTAwLCBiYWxsLCAieCIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFgoKSwgYmFsbC5nZXRYKCkgKyAzMDApOworICAgICAgICAgICAgICAgIHhBbmltLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHhBbmltLnNldFJlcGVhdE1vZGUoQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICAgICAgeEFuaW0uc2V0SW50ZXJwb2xhdG9yKG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKDJmKSk7CisKKyAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpIGFuaW1hdGlvbikucGxheVRvZ2V0aGVyKHlBbmltLCB4QW5pbSk7CisgICAgICAgICAgICAgICAgYW5pbWF0aW9uLmFkZExpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24oYm9vbGVhbiBlbmRJbW1lZGlhdGVseSkgeworICAgICAgICAgICAgdGhpcy5lbmRJbW1lZGlhdGVseSA9IGVuZEltbWVkaWF0ZWx5OworICAgICAgICAgICAgc3RhcnRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgICAgICByZXBlYXRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBjYW5jZWxUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBlbmRUZXh0LnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBzdGFydFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgcmVwZWF0VGV4dEFuaW1hdG9yLnNldEFscGhhKC41Zik7CisgICAgICAgICAgICBjYW5jZWxUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoLjVmKTsKKyAgICAgICAgICAgIGVuZFRleHRBbmltYXRvci5zZXRBbHBoYSguNWYpOworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBhbmltYXRpb24uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbEFuaW1hdGlvbigpIHsKKyAgICAgICAgICAgIGNyZWF0ZUFuaW1hdGlvbigpOworICAgICAgICAgICAgYW5pbWF0aW9uLmNhbmNlbCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgZW5kQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBhbmltYXRpb24uZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGNyZWF0ZUJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoNTBmLCA1MGYpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHggLSAyNWYpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5IC0gMjVmKTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsgLy9uZXcgUGFpbnQoUGFpbnQuQU5USV9BTElBU19GTEFHKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJhbGwuZ2V0WCgpLCBiYWxsLmdldFkoKSk7CisgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25TdGFydChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIFNlcXVlbmNlcikgeworICAgICAgICAgICAgICAgIHN0YXJ0VGV4dC5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXJ0VGV4dEFuaW1hdG9yLnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmRJbW1lZGlhdGVseSkgeworICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5lbmQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpZiAoYW5pbWF0aW9uIGluc3RhbmNlb2YgU2VxdWVuY2VyKSB7CisgICAgICAgICAgICAgICAgZW5kVGV4dC5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuZFRleHRBbmltYXRvci5zZXRBbHBoYSgxZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaWYgKGFuaW1hdGlvbiBpbnN0YW5jZW9mIFNlcXVlbmNlcikgeworICAgICAgICAgICAgICAgIGNhbmNlbFRleHQuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYW5jZWxUZXh0QW5pbWF0b3Iuc2V0QWxwaGEoMWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChhbmltYXRpb24gaW5zdGFuY2VvZiBTZXF1ZW5jZXIpIHsKKyAgICAgICAgICAgICAgICByZXBlYXRUZXh0LnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwZWF0VGV4dEFuaW1hdG9yLnNldEFscGhhKDFmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0JvdW5jaW5nQmFsbHMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQm91bmNpbmdCYWxscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZWJkYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0JvdW5jaW5nQmFsbHMuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uKjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TaGFkZXI7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLk92YWxTaGFwZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5SZWN0U2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworCitwdWJsaWMgY2xhc3MgQm91bmNpbmdCYWxscyBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIGFjdGl2aXR5IGlzIGZpcnN0IGNyZWF0ZWQuICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5ib3VuY2luZ19iYWxscyk7CisgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBmaW5kVmlld0J5SWQoUi5pZC5jb250YWluZXIpOworICAgICAgICBjb250YWluZXIuYWRkVmlldyhuZXcgTXlBbmltYXRpb25WaWV3KHRoaXMpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIsIEFuaW1hdGFibGUuQW5pbWF0YWJsZUxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVEID0gMHhmZkZGODA4MDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJMVUUgPSAweGZmODA4MEZGOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ1lBTiA9IDB4ZmY4MGZmZmY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHUkVFTiA9IDB4ZmY4MGZmODA7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBTZXF1ZW5jZXIgYW5pbWF0aW9uID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbG9yZWQgYmFja2dyb3VuZAorICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBiYWNrZ3JvdW5kID0gbmV3IFNoYXBlRHJhd2FibGUobmV3IFJlY3RTaGFwZSgpKTsKKyAgICAgICAgICAgIHNldEJhY2tncm91bmREcmF3YWJsZShiYWNrZ3JvdW5kKTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gYmFja2dyb3VuZC5nZXRQYWludCgpOworICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3IoUkVEKTsKKworICAgICAgICAgICAgLy8gQW5pbWF0ZSBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICAgICAgICBBbmltYXRvciBjb2xvckFuaW0gPSBuZXcgUHJvcGVydHlBbmltYXRvcigzMDAwLCBwYWludCwgImNvbG9yIiwgQkxVRSk7CisgICAgICAgICAgICBjb2xvckFuaW0uc2V0RXZhbHVhdG9yKG5ldyBSR0JFdmFsdWF0b3IoKSk7CisgICAgICAgICAgICBjb2xvckFuaW0uc2V0UmVwZWF0Q291bnQoQW5pbWF0b3IuSU5GSU5JVEUpOworICAgICAgICAgICAgY29sb3JBbmltLnNldFJlcGVhdE1vZGUoQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBjb2xvckFuaW0uYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7IC8vIGZvcmNlcyBpbnZhbGlkYXRpb24gdG8gZ2V0IHRoZSByZWRyYXcKKyAgICAgICAgICAgIGNvbG9yQW5pbS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudChNb3Rpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9ET1dOICYmCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldEFjdGlvbigpICE9IE1vdGlvbkV2ZW50LkFDVElPTl9NT1ZFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU2hhcGVIb2xkZXIgbmV3QmFsbCA9IGFkZEJhbGwoZXZlbnQuZ2V0WCgpLCBldmVudC5nZXRZKCkpOworCisgICAgICAgICAgICAvLyBCb3VuY2luZyBhbmltYXRpb24gd2l0aCBzcXVhc2ggYW5kIHN0cmV0Y2gKKyAgICAgICAgICAgIGZsb2F0IHN0YXJ0WSA9IG5ld0JhbGwuZ2V0WSgpOworICAgICAgICAgICAgZmxvYXQgZW5kWSA9IGdldEhlaWdodCgpIC0gNTBmOworICAgICAgICAgICAgZmxvYXQgaCA9IChmbG9hdClnZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIGZsb2F0IGV2ZW50WSA9IGV2ZW50LmdldFkoKTsKKyAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IChpbnQpKDUwMCAqICgoaCAtIGV2ZW50WSkvaCkpOworICAgICAgICAgICAgQW5pbWF0b3IgYm91bmNlQW5pbSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLCBuZXdCYWxsLCAieSIsIHN0YXJ0WSwgZW5kWSk7CisgICAgICAgICAgICBib3VuY2VBbmltLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIEFuaW1hdG9yIHNxdWFzaEFuaW0xID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24vNCwgbmV3QmFsbCwgIngiLCBuZXdCYWxsLmdldFgoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3QmFsbC5nZXRYKCkgLSAyNWYpOworICAgICAgICAgICAgc3F1YXNoQW5pbTEuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICBzcXVhc2hBbmltMS5zZXRSZXBlYXRNb2RlKEFuaW1hdG9yLlJFVkVSU0UpOworICAgICAgICAgICAgc3F1YXNoQW5pbTEuc2V0SW50ZXJwb2xhdG9yKG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgQW5pbWF0b3Igc3F1YXNoQW5pbTIgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbi80LCBuZXdCYWxsLCAid2lkdGgiLCBuZXdCYWxsLmdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgIG5ld0JhbGwuZ2V0V2lkdGgoKSArIDUwKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0yLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgc3F1YXNoQW5pbTIuc2V0UmVwZWF0TW9kZShBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIHNxdWFzaEFuaW0yLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIEFuaW1hdG9yIHN0cmV0Y2hBbmltMSA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKGR1cmF0aW9uLzQsIG5ld0JhbGwsICJ5IiwgZW5kWSwKKyAgICAgICAgICAgICAgICAgICAgZW5kWSArIDI1Zik7CisgICAgICAgICAgICBzdHJldGNoQW5pbTEuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTEuc2V0SW50ZXJwb2xhdG9yKG5ldyBEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgc3RyZXRjaEFuaW0xLnNldFJlcGVhdE1vZGUoQW5pbWF0b3IuUkVWRVJTRSk7CisgICAgICAgICAgICBBbmltYXRvciBzdHJldGNoQW5pbTIgPSBuZXcgUHJvcGVydHlBbmltYXRvcihkdXJhdGlvbi80LCBuZXdCYWxsLCAiaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgbmV3QmFsbC5nZXRIZWlnaHQoKSwgbmV3QmFsbC5nZXRIZWlnaHQoKSAtIDI1KTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMi5zZXRSZXBlYXRDb3VudCgxKTsKKyAgICAgICAgICAgIHN0cmV0Y2hBbmltMi5zZXRJbnRlcnBvbGF0b3IobmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBzdHJldGNoQW5pbTIuc2V0UmVwZWF0TW9kZShBbmltYXRvci5SRVZFUlNFKTsKKyAgICAgICAgICAgIEFuaW1hdG9yIGJvdW5jZUJhY2tBbmltID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoZHVyYXRpb24sIG5ld0JhbGwsICJ5IiwgZW5kWSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRZKTsKKyAgICAgICAgICAgIGJvdW5jZUJhY2tBbmltLnNldEludGVycG9sYXRvcihuZXcgRGVjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgIC8vIFNlcXVlbmNlIHRoZSBkb3duL3NxdWFzaCZzdHJldGNoL3VwIGFuaW1hdGlvbnMKKyAgICAgICAgICAgIFNlcXVlbmNlciBib3VuY2VyID0gbmV3IFNlcXVlbmNlcigpOworICAgICAgICAgICAgYm91bmNlci5wbGF5KGJvdW5jZUFuaW0pLmJlZm9yZShzcXVhc2hBbmltMSk7CisgICAgICAgICAgICBib3VuY2VyLnBsYXkoc3F1YXNoQW5pbTEpLndpdGgoc3F1YXNoQW5pbTIpOworICAgICAgICAgICAgYm91bmNlci5wbGF5KHNxdWFzaEFuaW0xKS53aXRoKHN0cmV0Y2hBbmltMSk7CisgICAgICAgICAgICBib3VuY2VyLnBsYXkoc3F1YXNoQW5pbTEpLndpdGgoc3RyZXRjaEFuaW0yKTsKKyAgICAgICAgICAgIGJvdW5jZXIucGxheShib3VuY2VCYWNrQW5pbSkuYWZ0ZXIoc3RyZXRjaEFuaW0yKTsKKworICAgICAgICAgICAgLy8gRmFkaW5nIGFuaW1hdGlvbiAtIHJlbW92ZSB0aGUgYmFsbCB3aGVuIHRoZSBhbmltYXRpb24gaXMgZG9uZQorICAgICAgICAgICAgQW5pbWF0b3IgZmFkZUFuaW0gPSBuZXcgUHJvcGVydHlBbmltYXRvcigyNTAsIG5ld0JhbGwsICJhbHBoYSIsIDFmLCAwZik7CisgICAgICAgICAgICBmYWRlQW5pbS5hZGRMaXN0ZW5lcih0aGlzKTsKKworICAgICAgICAgICAgLy8gU2VxdWVuY2UgdGhlIHR3byBhbmltYXRpb25zIHRvIHBsYXkgb25lIGFmdGVyIHRoZSBvdGhlcgorICAgICAgICAgICAgU2VxdWVuY2VyIHNlcXVlbmNlciA9IG5ldyBTZXF1ZW5jZXIoKTsKKyAgICAgICAgICAgIHNlcXVlbmNlci5wbGF5KGJvdW5jZXIpLmJlZm9yZShmYWRlQW5pbSk7CisKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIHNlcXVlbmNlci5zdGFydCgpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU2hhcGVIb2xkZXIgYWRkQmFsbChmbG9hdCB4LCBmbG9hdCB5KSB7CisgICAgICAgICAgICBPdmFsU2hhcGUgY2lyY2xlID0gbmV3IE92YWxTaGFwZSgpOworICAgICAgICAgICAgY2lyY2xlLnJlc2l6ZSg1MGYsIDUwZik7CisgICAgICAgICAgICBTaGFwZURyYXdhYmxlIGRyYXdhYmxlID0gbmV3IFNoYXBlRHJhd2FibGUoY2lyY2xlKTsKKyAgICAgICAgICAgIFNoYXBlSG9sZGVyIHNoYXBlSG9sZGVyID0gbmV3IFNoYXBlSG9sZGVyKGRyYXdhYmxlKTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFgoeCAtIDI1Zik7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRZKHkgLSAyNWYpOworICAgICAgICAgICAgaW50IHJlZCA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGdyZWVuID0gKGludCkoTWF0aC5yYW5kb20oKSAqIDI1NSk7CisgICAgICAgICAgICBpbnQgYmx1ZSA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGNvbG9yID0gMHhmZjAwMDAwMCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOworICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBkcmF3YWJsZS5nZXRQYWludCgpOyAvL25ldyBQYWludChQYWludC5BTlRJX0FMSUFTX0ZMQUcpOworICAgICAgICAgICAgaW50IGRhcmtDb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQvNCA8PCAxNiB8IGdyZWVuLzQgPDwgOCB8IGJsdWUvNDsKKyAgICAgICAgICAgIFJhZGlhbEdyYWRpZW50IGdyYWRpZW50ID0gbmV3IFJhZGlhbEdyYWRpZW50KDM3LjVmLCAxMi41ZiwKKyAgICAgICAgICAgICAgICAgICAgNTBmLCBjb2xvciwgZGFya0NvbG9yLCBTaGFkZXIuVGlsZU1vZGUuQ0xBTVApOworICAgICAgICAgICAgcGFpbnQuc2V0U2hhZGVyKGdyYWRpZW50KTsKKyAgICAgICAgICAgIHNoYXBlSG9sZGVyLnNldFBhaW50KHBhaW50KTsKKyAgICAgICAgICAgIGJhbGxzLmFkZChzaGFwZUhvbGRlcik7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmFsbHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IGJhbGxzLmdldChpKTsKKyAgICAgICAgICAgICAgICBjYW52YXMuc2F2ZSgpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoc2hhcGVIb2xkZXIuZ2V0WCgpLCBzaGFwZUhvbGRlci5nZXRZKCkpOworICAgICAgICAgICAgICAgIHNoYXBlSG9sZGVyLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblVwZGF0ZShBbmltYXRvciBhbmltYXRpb24pIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkNhbmNlbChBbmltYXRhYmxlIGFuaW1hdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBiYWxscy5yZW1vdmUoKChQcm9wZXJ0eUFuaW1hdG9yKWFuaW1hdGlvbikuZ2V0VGFyZ2V0KCkpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0YWJsZSBhbmltYXRpb24pIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGFibGUgYW5pbWF0aW9uKSB7CisgICAgICAgIH0KKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9DdXN0b21FdmFsdWF0b3IuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQ3VzdG9tRXZhbHVhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzMjZmOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vQ3VzdG9tRXZhbHVhdG9yLmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5UeXBlRXZhbHVhdG9yOworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5TZXF1ZW5jZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBDdXN0b21FdmFsdWF0b3IgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9yZXZlcnNpbmcpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgTXlBbmltYXRpb25WaWV3IGFuaW1WaWV3ID0gbmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoYW5pbVZpZXcpOworCisgICAgICAgIEJ1dHRvbiBzdGFydGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRCdXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBYWUhvbGRlciB7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVg7CisgICAgICAgIHByaXZhdGUgZmxvYXQgbVk7CisKKyAgICAgICAgcHVibGljIFhZSG9sZGVyKGZsb2F0IHgsIGZsb2F0IHkpIHsKKyAgICAgICAgICAgIG1YID0geDsKKyAgICAgICAgICAgIG1ZID0geTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmbG9hdCBnZXRYKCkgeworICAgICAgICAgICAgcmV0dXJuIG1YOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0WChmbG9hdCB4KSB7CisgICAgICAgICAgICBtWCA9IHg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0WSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtWTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFkoZmxvYXQgeSkgeworICAgICAgICAgICAgbVkgPSB5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFhZRXZhbHVhdG9yIGltcGxlbWVudHMgVHlwZUV2YWx1YXRvciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGV2YWx1YXRlKGZsb2F0IGZyYWN0aW9uLCBPYmplY3Qgc3RhcnRWYWx1ZSwgT2JqZWN0IGVuZFZhbHVlKSB7CisgICAgICAgICAgICBYWUhvbGRlciBzdGFydFhZID0gKFhZSG9sZGVyKSBzdGFydFZhbHVlOworICAgICAgICAgICAgWFlIb2xkZXIgZW5kWFkgPSAoWFlIb2xkZXIpIGVuZFZhbHVlOworICAgICAgICAgICAgcmV0dXJuIG5ldyBYWUhvbGRlcihzdGFydFhZLmdldFgoKSArIGZyYWN0aW9uICogKGVuZFhZLmdldFgoKSAtIHN0YXJ0WFkuZ2V0WCgpKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRYWS5nZXRZKCkgKyBmcmFjdGlvbiAqIChlbmRYWS5nZXRZKCkgLSBzdGFydFhZLmdldFkoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEJhbGxYWUhvbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTaGFwZUhvbGRlciBtQmFsbDsKKworICAgICAgICBwdWJsaWMgQmFsbFhZSG9sZGVyKFNoYXBlSG9sZGVyIGJhbGwpIHsKKyAgICAgICAgICAgIG1CYWxsID0gYmFsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFhZKFhZSG9sZGVyIHh5SG9sZGVyKSB7CisgICAgICAgICAgICBtQmFsbC5zZXRYKHh5SG9sZGVyLmdldFgoKSk7CisgICAgICAgICAgICBtQmFsbC5zZXRZKHh5SG9sZGVyLmdldFkoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgWFlIb2xkZXIgZ2V0WFkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhZSG9sZGVyKG1CYWxsLmdldFgoKSwgbUJhbGwuZ2V0WSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNeUFuaW1hdGlvblZpZXcgZXh0ZW5kcyBWaWV3IGltcGxlbWVudHMgQW5pbWF0b3IuQW5pbWF0b3JVcGRhdGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBBbmltYXRvciBib3VuY2VBbmltID0gbnVsbDsKKyAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IG51bGw7CisgICAgICAgIEJhbGxYWUhvbGRlciBiYWxsSG9sZGVyID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXlBbmltYXRpb25WaWV3KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgICAgICBiYWxsID0gY3JlYXRlQmFsbCgyNSwgMjUpOworICAgICAgICAgICAgYmFsbEhvbGRlciA9IG5ldyBCYWxsWFlIb2xkZXIoYmFsbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGJvdW5jZUFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFhZSG9sZGVyIHN0YXJ0WFkgPSBuZXcgWFlIb2xkZXIoMGYsIDBmKTsKKyAgICAgICAgICAgICAgICBYWUhvbGRlciBlbmRYWSA9IG5ldyBYWUhvbGRlcigzMDBmLCA1MDBmKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoMTUwMCwgYmFsbEhvbGRlciwgInhZIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZFhZKTsKKyAgICAgICAgICAgICAgICBib3VuY2VBbmltLnNldEV2YWx1YXRvcihuZXcgWFlFdmFsdWF0b3IoKSk7CisgICAgICAgICAgICAgICAgYm91bmNlQW5pbS5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGNyZWF0ZUJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoNTBmLCA1MGYpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHggLSAyNWYpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5IC0gMjVmKTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsgLy9uZXcgUGFpbnQoUGFpbnQuQU5USV9BTElBU19GTEFHKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJhbGwuZ2V0WCgpLCBiYWxsLmdldFkoKSk7CisgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MaXN0RmxpcHBlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9MaXN0RmxpcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDUwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL0xpc3RGbGlwcGVyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5BbmltYXRhYmxlTGlzdGVuZXJBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWNjZWxlcmF0ZUludGVycG9sYXRvcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkRlY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5TZXF1ZW5jZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5Cb3VuY2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHRoZSBzZWVraW5nIGNhcGFiaWxpdHkgb2YgQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTGlzdEZsaXBwZXIgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFVSQVRJT04gPSAxNTAwOworICAgIHByaXZhdGUgU2Vla0JhciBtU2Vla0JhcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1RfU1RSSU5HU19FTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiT25lIiwKKyAgICAgICAgICAgICJUd28iLAorICAgICAgICAgICAgIlRocmVlIiwKKyAgICAgICAgICAgICJGb3VyIiwKKyAgICAgICAgICAgICJGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUX1NUUklOR1NfRlIgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIlVuIiwKKyAgICAgICAgICAgICJEZXV4IiwKKyAgICAgICAgICAgICJUcm9pcyIsCisgICAgICAgICAgICAiUXVhdHJlIiwKKyAgICAgICAgICAgICJMZSBGaXZlIiwKKyAgICAgICAgICAgICJTaXgiCisgICAgfTsKKworICAgIExpc3RWaWV3IG1FbmdsaXNoTGlzdDsKKyAgICBMaXN0VmlldyBtRnJlbmNoTGlzdDsKKworICAgIC8qKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4gKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LnJvdGF0aW5nX2xpc3QpOworICAgICAgICAvL0ZyYW1lTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIG1FbmdsaXNoTGlzdCA9IChMaXN0VmlldykgZmluZFZpZXdCeUlkKFIuaWQubGlzdF9lbik7CisgICAgICAgIG1GcmVuY2hMaXN0ID0gKExpc3RWaWV3KSBmaW5kVmlld0J5SWQoUi5pZC5saXN0X2ZyKTsKKworICAgICAgICAvLyBQcmVwYXJlIHRoZSBMaXN0VmlldworICAgICAgICBmaW5hbCBBcnJheUFkYXB0ZXI8U3RyaW5nPiBhZGFwdGVyRW4gPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9saXN0X2l0ZW1fMSwgTElTVF9TVFJJTkdTX0VOKTsKKyAgICAgICAgLy8gUHJlcGFyZSB0aGUgTGlzdFZpZXcKKyAgICAgICAgZmluYWwgQXJyYXlBZGFwdGVyPFN0cmluZz4gYWRhcHRlckZyID0gbmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIExJU1RfU1RSSU5HU19GUik7CisKKyAgICAgICAgbUVuZ2xpc2hMaXN0LnNldEFkYXB0ZXIoYWRhcHRlckVuKTsKKyAgICAgICAgbUZyZW5jaExpc3Quc2V0QWRhcHRlcihhZGFwdGVyRnIpOworICAgICAgICBtRnJlbmNoTGlzdC5zZXRSb3RhdGlvblkoLTkwZik7CisKKyAgICAgICAgQnV0dG9uIHN0YXJ0ZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5idXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBmbGlwaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgYWNjZWxlcmF0b3IgPSBuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpOworICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIGRlY2VsZXJhdG9yID0gbmV3IERlY2VsZXJhdGVJbnRlcnBvbGF0b3IoKTsKKyAgICBwcml2YXRlIHZvaWQgZmxpcGl0KCkgeworICAgICAgICBmaW5hbCBMaXN0VmlldyB2aXNpYmxlTGlzdDsKKyAgICAgICAgZmluYWwgTGlzdFZpZXcgaW52aXNpYmxlTGlzdDsKKyAgICAgICAgaWYgKG1FbmdsaXNoTGlzdC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7CisgICAgICAgICAgICB2aXNpYmxlTGlzdCA9IG1GcmVuY2hMaXN0OworICAgICAgICAgICAgaW52aXNpYmxlTGlzdCA9IG1FbmdsaXNoTGlzdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmlzaWJsZUxpc3QgPSBtRnJlbmNoTGlzdDsKKyAgICAgICAgICAgIHZpc2libGVMaXN0ID0gbUVuZ2xpc2hMaXN0OworICAgICAgICB9CisgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgdmlzVG9JbnZpcyA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKDUwMCwgdmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLCAwZiwgOTBmKTsKKyAgICAgICAgdmlzVG9JbnZpcy5zZXRJbnRlcnBvbGF0b3IoYWNjZWxlcmF0b3IpOworICAgICAgICBmaW5hbCBQcm9wZXJ0eUFuaW1hdG9yIGludmlzVG9WaXMgPSBuZXcgUHJvcGVydHlBbmltYXRvcig1MDAsIGludmlzaWJsZUxpc3QsICJyb3RhdGlvblkiLCAtOTBmLCAwZik7CisgICAgICAgIGludmlzVG9WaXMuc2V0SW50ZXJwb2xhdG9yKGRlY2VsZXJhdG9yKTsKKyAgICAgICAgdmlzVG9JbnZpcy5hZGRMaXN0ZW5lcihuZXcgQW5pbWF0YWJsZUxpc3RlbmVyQWRhcHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0YWJsZSBhbmltKSB7CisgICAgICAgICAgICAgICAgdmlzaWJsZUxpc3Quc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOworICAgICAgICAgICAgICAgIGludmlzVG9WaXMuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBpbnZpc2libGVMaXN0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHZpc1RvSW52aXMuc3RhcnQoKTsKKyAgICB9CisKKworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9NdWx0aVByb3BlcnR5QW5pbWF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYxY2IwYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hbmltYXRpb24vTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYW5pbWF0aW9uOworCisvLyBOZWVkIHRoZSBmb2xsb3dpbmcgaW1wb3J0IHRvIGdldCBhY2Nlc3MgdG8gdGhlIGFwcCByZXNvdXJjZXMsIHNpbmNlIHRoaXMKKy8vIGNsYXNzIGlzIGluIGEgc3ViLXBhY2thZ2UuCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uKjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVJbnRlcnBvbGF0b3I7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5Cb3VuY2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOworCisvKioKKyAqIFRoaXMgYXBwbGljYXRpb24gZGVtb25zdHJhdGVzIHRoZSBzZWVraW5nIGNhcGFiaWxpdHkgb2YgQW5pbWF0b3IuIFRoZSBTZWVrQmFyIGluIHRoZQorICogVUkgYWxsb3dzIHlvdSB0byBzZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBhbmltYXRpb24uIFByZXNzaW5nIHRoZSBSdW4gYnV0dG9uIHdpbGwgcGxheSBmcm9tCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgTXVsdGlQcm9wZXJ0eUFuaW1hdGlvbiBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEVVJBVElPTiA9IDE1MDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9zZWVraW5nKTsKKyAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGZpbmRWaWV3QnlJZChSLmlkLmNvbnRhaW5lcik7CisgICAgICAgIGZpbmFsIE15QW5pbWF0aW9uVmlldyBhbmltVmlldyA9IG5ldyBNeUFuaW1hdGlvblZpZXcodGhpcyk7CisgICAgICAgIGNvbnRhaW5lci5hZGRWaWV3KGFuaW1WaWV3KTsKKworICAgICAgICBCdXR0b24gc3RhcnRlciA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnN0YXJ0QnV0dG9uKTsKKyAgICAgICAgc3RhcnRlci5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgYW5pbVZpZXcuc3RhcnRBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEJBTExfU0laRSA9IDEwMGY7CisKKyAgICAgICAgcHVibGljIGZpbmFsIEFycmF5TGlzdDxTaGFwZUhvbGRlcj4gYmFsbHMgPSBuZXcgQXJyYXlMaXN0PFNoYXBlSG9sZGVyPigpOworICAgICAgICBTZXF1ZW5jZXIgYW5pbWF0aW9uID0gbnVsbDsKKyAgICAgICAgQW5pbWF0YWJsZSBib3VuY2VBbmltID0gbnVsbDsKKyAgICAgICAgU2hhcGVIb2xkZXIgYmFsbCA9IG51bGw7CisKKyAgICAgICAgcHVibGljIE15QW5pbWF0aW9uVmlldyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOworICAgICAgICAgICAgYWRkQmFsbCg1MCwgMCk7CisgICAgICAgICAgICBhZGRCYWxsKDE1MCwgMCk7CisgICAgICAgICAgICBhZGRCYWxsKDI1MCwgMCk7CisgICAgICAgICAgICBhZGRCYWxsKDM1MCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGJvdW5jZUFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNoYXBlSG9sZGVyIGJhbGw7CisgICAgICAgICAgICAgICAgYmFsbCA9IGJhbGxzLmdldCgwKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eUFuaW1hdG9yIHlCb3VuY2VyID0gbmV3IFByb3BlcnR5QW5pbWF0b3IoRFVSQVRJT04sIGJhbGwsICJ5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0WSgpLCBnZXRIZWlnaHQoKSAtIEJBTExfU0laRSk7CisgICAgICAgICAgICAgICAgeUJvdW5jZXIuc2V0SW50ZXJwb2xhdG9yKG5ldyBCb3VuY2VJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICAgICAgeUJvdW5jZXIuYWRkVXBkYXRlTGlzdGVuZXIodGhpcyk7CisKKyAgICAgICAgICAgICAgICBiYWxsID0gYmFsbHMuZ2V0KDEpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aFkgPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXIoInkiLCBiYWxsLmdldFkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEhlaWdodCgpIC0gQkFMTF9TSVpFKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhBbHBoYSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigiYWxwaGEiLCAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgMGYpOworICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3IgeUFscGhhQm91bmNlciA9IG5ldyBQcm9wZXJ0eUFuaW1hdG9yKERVUkFUSU9OLzIsIGJhbGwsIHB2aFksIHB2aEFscGhhKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldEludGVycG9sYXRvcihuZXcgQWNjZWxlcmF0ZUludGVycG9sYXRvcigpKTsKKyAgICAgICAgICAgICAgICB5QWxwaGFCb3VuY2VyLnNldFJlcGVhdENvdW50KDEpOworICAgICAgICAgICAgICAgIHlBbHBoYUJvdW5jZXIuc2V0UmVwZWF0TW9kZShBbmltYXRvci5SRVZFUlNFKTsKKworCisgICAgICAgICAgICAgICAgYmFsbCA9IGJhbGxzLmdldCgyKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhXID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyKCJ3aWR0aCIsIGJhbGwuZ2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGwuZ2V0V2lkdGgoKSAqIDIpOworICAgICAgICAgICAgICAgIFByb3BlcnR5VmFsdWVzSG9sZGVyIHB2aEggPSBuZXcgUHJvcGVydHlWYWx1ZXNIb2xkZXIoImhlaWdodCIsIGJhbGwuZ2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldEhlaWdodCgpICogMik7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZUWCA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigieCIsIGJhbGwuZ2V0WCgpLCBiYWxsLmdldFgoKSAtIEJBTExfU0laRS8yZik7CisgICAgICAgICAgICAgICAgUHJvcGVydHlWYWx1ZXNIb2xkZXIgcHZUWSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigieSIsIDBmLCBiYWxsLmdldFkoKSwgYmFsbC5nZXRZKCkgLSBCQUxMX1NJWkUvMmYpOworICAgICAgICAgICAgICAgIFByb3BlcnR5QW5pbWF0b3Igd2h4eUJvdW5jZXIgPSBuZXcgUHJvcGVydHlBbmltYXRvcihEVVJBVElPTi8yLCBiYWxsLCBwdmhXLCBwdmhILAorICAgICAgICAgICAgICAgICAgICAgICAgcHZUWCwgcHZUWSk7CisgICAgICAgICAgICAgICAgd2h4eUJvdW5jZXIuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICAgICAgd2h4eUJvdW5jZXIuc2V0UmVwZWF0TW9kZShBbmltYXRvci5SRVZFUlNFKTsKKworICAgICAgICAgICAgICAgIGJhbGwgPSBiYWxscy5nZXQoMyk7CisgICAgICAgICAgICAgICAgcHZoWSA9IG5ldyBQcm9wZXJ0eVZhbHVlc0hvbGRlcigieSIsIGJhbGwuZ2V0WSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVpZ2h0KCkgLSBCQUxMX1NJWkUpOworICAgICAgICAgICAgICAgIGZsb2F0IGJhbGxYID0gYmFsbC5nZXRYKCk7CisgICAgICAgICAgICAgICAgS2V5ZnJhbWUga2YwID0gbmV3IEtleWZyYW1lKDBmLCBiYWxsWCk7CisgICAgICAgICAgICAgICAgS2V5ZnJhbWUga2YxID0gbmV3IEtleWZyYW1lKC41ZiwgYmFsbFggKyAxMDBmKTsKKyAgICAgICAgICAgICAgICBLZXlmcmFtZSBrZjIgPSBuZXcgS2V5ZnJhbWUoMWYsIGJhbGxYICsgNTBmKTsKKyAgICAgICAgICAgICAgICBQcm9wZXJ0eVZhbHVlc0hvbGRlciBwdmhYID0gbmV3IFByb3BlcnR5VmFsdWVzSG9sZGVyKCJ4Iiwga2YwLCBrZjEsIGtmMik7CisgICAgICAgICAgICAgICAgUHJvcGVydHlBbmltYXRvciB5eEJvdW5jZXIgPSBuZXcgUHJvcGVydHlBbmltYXRvcihEVVJBVElPTi8yLCBiYWxsLCBwdmhZLCBwdmhYKTsKKyAgICAgICAgICAgICAgICB5eEJvdW5jZXIuc2V0UmVwZWF0Q291bnQoMSk7CisgICAgICAgICAgICAgICAgeXhCb3VuY2VyLnNldFJlcGVhdE1vZGUoQW5pbWF0b3IuUkVWRVJTRSk7CisKKworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0gPSBuZXcgU2VxdWVuY2VyKCk7CisgICAgICAgICAgICAgICAgKChTZXF1ZW5jZXIpYm91bmNlQW5pbSkucGxheVRvZ2V0aGVyKHlCb3VuY2VyLCB5QWxwaGFCb3VuY2VyLCB3aHh5Qm91bmNlciwgeXhCb3VuY2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGFkZEJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoQkFMTF9TSVpFLCBCQUxMX1NJWkUpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHgpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5KTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKDEwMCArIE1hdGgucmFuZG9tKCkgKiAxNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KSgxMDAgKyBNYXRoLnJhbmRvbSgpICogMTU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICBiYWxscy5hZGQoc2hhcGVIb2xkZXIpOworICAgICAgICAgICAgcmV0dXJuIHNoYXBlSG9sZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgY2FudmFzKSB7CisgICAgICAgICAgICBmb3IgKFNoYXBlSG9sZGVyIGJhbGwgOiBiYWxscykgeworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoYmFsbC5nZXRYKCksIGJhbGwuZ2V0WSgpKTsKKyAgICAgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoLWJhbGwuZ2V0WCgpLCAtYmFsbC5nZXRZKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25VcGRhdGUoQW5pbWF0b3IgYW5pbWF0aW9uKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1JldmVyc2luZ0FuaW1hdGlvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9SZXZlcnNpbmdBbmltYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZhN2EyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9SZXZlcnNpbmdBbmltYXRpb24uamF2YQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFuaW1hdGlvbjsKKworLy8gTmVlZCB0aGUgZm9sbG93aW5nIGltcG9ydCB0byBnZXQgYWNjZXNzIHRvIHRoZSBhcHAgcmVzb3VyY2VzLCBzaW5jZSB0aGlzCisvLyBjbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGFuZHJvaWQuYW5pbWF0aW9uLkFuaW1hdGFibGU7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0b3I7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uUHJvcGVydHlBbmltYXRvcjsKK2ltcG9ydCBhbmRyb2lkLmFuaW1hdGlvbi5TZXF1ZW5jZXI7CitpbXBvcnQgYW5kcm9pZC5hbmltYXRpb24uQW5pbWF0YWJsZS5BbmltYXRhYmxlTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJhZGlhbEdyYWRpZW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuU2hhZGVyOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuU2hhcGVEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLnNoYXBlcy5PdmFsU2hhcGU7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlSW50ZXJwb2xhdG9yOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CisKK3B1YmxpYyBjbGFzcyBSZXZlcnNpbmdBbmltYXRpb24gZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmFuaW1hdGlvbl9yZXZlcnNpbmcpOworICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgZmluZFZpZXdCeUlkKFIuaWQuY29udGFpbmVyKTsKKyAgICAgICAgZmluYWwgTXlBbmltYXRpb25WaWV3IGFuaW1WaWV3ID0gbmV3IE15QW5pbWF0aW9uVmlldyh0aGlzKTsKKyAgICAgICAgY29udGFpbmVyLmFkZFZpZXcoYW5pbVZpZXcpOworCisgICAgICAgIEJ1dHRvbiBzdGFydGVyID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc3RhcnRCdXR0b24pOworICAgICAgICBzdGFydGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBhbmltVmlldy5zdGFydEFuaW1hdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBCdXR0b24gcmV2ZXJzZXIgPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5yZXZlcnNlQnV0dG9uKTsKKyAgICAgICAgcmV2ZXJzZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFuaW1WaWV3LnJldmVyc2VBbmltYXRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTXlBbmltYXRpb25WaWV3IGV4dGVuZHMgVmlldyBpbXBsZW1lbnRzIEFuaW1hdG9yLkFuaW1hdG9yVXBkYXRlTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBBcnJheUxpc3Q8U2hhcGVIb2xkZXI+IGJhbGxzID0gbmV3IEFycmF5TGlzdDxTaGFwZUhvbGRlcj4oKTsKKyAgICAgICAgQW5pbWF0b3IgYm91bmNlQW5pbSA9IG51bGw7CisgICAgICAgIFNoYXBlSG9sZGVyIGJhbGwgPSBudWxsOworCisgICAgICAgIHB1YmxpYyBNeUFuaW1hdGlvblZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgICAgIGJhbGwgPSBjcmVhdGVCYWxsKDI1LCAyNSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY3JlYXRlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgaWYgKGJvdW5jZUFuaW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0gPSBuZXcgUHJvcGVydHlBbmltYXRvcigxNTAwLCBiYWxsLCAieSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiYWxsLmdldFkoKSwgZ2V0SGVpZ2h0KCkgLSA1MGYpOworICAgICAgICAgICAgICAgIGJvdW5jZUFuaW0uc2V0SW50ZXJwb2xhdG9yKG5ldyBBY2NlbGVyYXRlSW50ZXJwb2xhdG9yKDJmKSk7CisgICAgICAgICAgICAgICAgYm91bmNlQW5pbS5hZGRVcGRhdGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZXZlcnNlQW5pbWF0aW9uKCkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnJldmVyc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNlZWsobG9uZyBzZWVrVGltZSkgeworICAgICAgICAgICAgY3JlYXRlQW5pbWF0aW9uKCk7CisgICAgICAgICAgICBib3VuY2VBbmltLnNldEN1cnJlbnRQbGF5VGltZShzZWVrVGltZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFNoYXBlSG9sZGVyIGNyZWF0ZUJhbGwoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgICAgICAgICAgT3ZhbFNoYXBlIGNpcmNsZSA9IG5ldyBPdmFsU2hhcGUoKTsKKyAgICAgICAgICAgIGNpcmNsZS5yZXNpemUoNTBmLCA1MGYpOworICAgICAgICAgICAgU2hhcGVEcmF3YWJsZSBkcmF3YWJsZSA9IG5ldyBTaGFwZURyYXdhYmxlKGNpcmNsZSk7CisgICAgICAgICAgICBTaGFwZUhvbGRlciBzaGFwZUhvbGRlciA9IG5ldyBTaGFwZUhvbGRlcihkcmF3YWJsZSk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRYKHggLSAyNWYpOworICAgICAgICAgICAgc2hhcGVIb2xkZXIuc2V0WSh5IC0gMjVmKTsKKyAgICAgICAgICAgIGludCByZWQgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBncmVlbiA9IChpbnQpKE1hdGgucmFuZG9tKCkgKiAyNTUpOworICAgICAgICAgICAgaW50IGJsdWUgPSAoaW50KShNYXRoLnJhbmRvbSgpICogMjU1KTsKKyAgICAgICAgICAgIGludCBjb2xvciA9IDB4ZmYwMDAwMDAgfCByZWQgPDwgMTYgfCBncmVlbiA8PCA4IHwgYmx1ZTsKKyAgICAgICAgICAgIFBhaW50IHBhaW50ID0gZHJhd2FibGUuZ2V0UGFpbnQoKTsgLy9uZXcgUGFpbnQoUGFpbnQuQU5USV9BTElBU19GTEFHKTsKKyAgICAgICAgICAgIGludCBkYXJrQ29sb3IgPSAweGZmMDAwMDAwIHwgcmVkLzQgPDwgMTYgfCBncmVlbi80IDw8IDggfCBibHVlLzQ7CisgICAgICAgICAgICBSYWRpYWxHcmFkaWVudCBncmFkaWVudCA9IG5ldyBSYWRpYWxHcmFkaWVudCgzNy41ZiwgMTIuNWYsCisgICAgICAgICAgICAgICAgICAgIDUwZiwgY29sb3IsIGRhcmtDb2xvciwgU2hhZGVyLlRpbGVNb2RlLkNMQU1QKTsKKyAgICAgICAgICAgIHBhaW50LnNldFNoYWRlcihncmFkaWVudCk7CisgICAgICAgICAgICBzaGFwZUhvbGRlci5zZXRQYWludChwYWludCk7CisgICAgICAgICAgICByZXR1cm4gc2hhcGVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKyAgICAgICAgICAgIGNhbnZhcy5zYXZlKCk7CisgICAgICAgICAgICBjYW52YXMudHJhbnNsYXRlKGJhbGwuZ2V0WCgpLCBiYWxsLmdldFkoKSk7CisgICAgICAgICAgICBiYWxsLmdldFNoYXBlKCkuZHJhdyhjYW52YXMpOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uVXBkYXRlKEFuaW1hdG9yIGFuaW1hdGlvbikgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FuaW1hdGlvbi9TaGFwZUhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTU2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYW5pbWF0aW9uL1NoYXBlSG9sZGVyLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hbmltYXRpb247CisKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmFkaWFsR3JhZGllbnQ7CitpbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5TaGFwZURyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuc2hhcGVzLlNoYXBlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworCisvKioKKyAqIEEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhIFNoYXBlIGFuZCB2YXJpb3VzIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBkZWZpbmUKKyAqIGhvdyB0aGUgc2hhcGUgaXMgZHJhd24uCisgKi8KK3B1YmxpYyBjbGFzcyBTaGFwZUhvbGRlciB7CisgICAgcHJpdmF0ZSBmbG9hdCB4ID0gMCwgeSA9IDA7CisgICAgcHJpdmF0ZSBTaGFwZURyYXdhYmxlIHNoYXBlOworICAgIHByaXZhdGUgaW50IGNvbG9yOworICAgIHByaXZhdGUgUmFkaWFsR3JhZGllbnQgZ3JhZGllbnQ7CisgICAgcHJpdmF0ZSBmbG9hdCBhbHBoYSA9IDFmOworICAgIHByaXZhdGUgUGFpbnQgcGFpbnQ7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYWludChQYWludCB2YWx1ZSkgeworICAgICAgICBwYWludCA9IHZhbHVlOworICAgIH0KKyAgICBwdWJsaWMgUGFpbnQgZ2V0UGFpbnQoKSB7CisgICAgICAgIHJldHVybiBwYWludDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRYKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHggPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIGZsb2F0IGdldFgoKSB7CisgICAgICAgIHJldHVybiB4OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRZKGZsb2F0IHZhbHVlKSB7CisgICAgICAgIHkgPSB2YWx1ZTsKKyAgICB9CisgICAgcHVibGljIGZsb2F0IGdldFkoKSB7CisgICAgICAgIHJldHVybiB5OworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRTaGFwZShTaGFwZURyYXdhYmxlIHZhbHVlKSB7CisgICAgICAgIHNoYXBlID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBTaGFwZURyYXdhYmxlIGdldFNoYXBlKCkgeworICAgICAgICByZXR1cm4gc2hhcGU7CisgICAgfQorICAgIHB1YmxpYyBpbnQgZ2V0Q29sb3IoKSB7CisgICAgICAgIHJldHVybiBjb2xvcjsKKyAgICB9CisgICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IHZhbHVlKSB7CisgICAgICAgIGNvbG9yID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldEdyYWRpZW50KFJhZGlhbEdyYWRpZW50IHZhbHVlKSB7CisgICAgICAgIGdyYWRpZW50ID0gdmFsdWU7CisgICAgfQorICAgIHB1YmxpYyBSYWRpYWxHcmFkaWVudCBnZXRHcmFkaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdyYWRpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFscGhhKGZsb2F0IGFscGhhKSB7CisgICAgICAgIHRoaXMuYWxwaGEgPSBhbHBoYTsKKyAgICAgICAgc2hhcGUuc2V0QWxwaGEoKGludCkoKGFscGhhICogMjU1ZikgKyAuNWYpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZmxvYXQgZ2V0V2lkdGgoKSB7CisgICAgICAgIC8vcmV0dXJuIHNoYXBlLmdldEludHJpbnNpY1dpZHRoKCk7CisgICAgICAgIHJldHVybiBzaGFwZS5nZXRTaGFwZSgpLmdldFdpZHRoKCk7CisgICAgfQorICAgIHB1YmxpYyB2b2lkIHNldFdpZHRoKGZsb2F0IHdpZHRoKSB7CisgICAgICAgIC8vc2hhcGUuc2V0SW50cmluc2ljV2lkdGgod2lkdGgpOworICAgICAgICBTaGFwZSBzID0gc2hhcGUuZ2V0U2hhcGUoKTsKKyAgICAgICAgcy5yZXNpemUod2lkdGgsIHMuZ2V0SGVpZ2h0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBmbG9hdCBnZXRIZWlnaHQoKSB7CisgICAgICAgIHJldHVybiBzaGFwZS5nZXRTaGFwZSgpLmdldEhlaWdodCgpOworICAgIH0KKyAgICBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoZmxvYXQgaGVpZ2h0KSB7CisgICAgICAgIFNoYXBlIHMgPSBzaGFwZS5nZXRTaGFwZSgpOworICAgICAgICBzLnJlc2l6ZShzLmdldFdpZHRoKCksIGhlaWdodCk7CisgICAgICAgIC8vc2hhcGUuc2V0SW50cmluc2ljSGVpZ2h0KGhlaWdodCk7CisgICAgfQorCisgICAgcHVibGljIFNoYXBlSG9sZGVyKFNoYXBlRHJhd2FibGUgcykgeworICAgICAgICBzaGFwZSA9IHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJNZWNoYW5pY3MuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyTWVjaGFuaWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3OTc4MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWN0aW9uQmFyTWVjaGFuaWNzLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvdzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgYmFzaWNzIG9mIHRoZSBBY3Rpb24gQmFyIGFuZCBob3cgaXQgaW50ZXJvcGVyYXRlcyB3aXRoIHRoZQorICogc3RhbmRhcmQgb3B0aW9ucyBtZW51LiBUaGlzIGRlbW8gaXMgZm9yIGluZm9ybWF0aXZlIHB1cnBvc2VzIG9ubHk7IHNlZSBBY3Rpb25CYXJVc2FnZSBmb3IKKyAqIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhlIEFjdGlvbiBCYXIgaW4gYSBtb3JlIGlkaW9tYXRpYyBtYW5uZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJNZWNoYW5pY3MgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIFRoZSBBY3Rpb24gQmFyIGlzIGEgd2luZG93IGZlYXR1cmUuIFRoZSBmZWF0dXJlIG11c3QgYmUgcmVxdWVzdGVkCisgICAgICAgIC8vIGJlZm9yZSBzZXR0aW5nIGEgY29udGVudCB2aWV3LiBOb3JtYWxseSB0aGlzIGlzIHNldCBhdXRvbWF0aWNhbGx5CisgICAgICAgIC8vIGJ5IHlvdXIgQWN0aXZpdHkncyB0aGVtZSBpbiB5b3VyIG1hbmlmZXN0LiBUaGUgcHJvdmlkZWQgc3lzdGVtCisgICAgICAgIC8vIHRoZW1lIFRoZW1lLldpdGhBY3Rpb25CYXIgZW5hYmxlcyB0aGlzIGZvciB5b3UuIFVzZSBpdCBhcyB5b3Ugd291bGQKKyAgICAgICAgLy8gdXNlIFRoZW1lLk5vVGl0bGVCYXIuIFlvdSBjYW4gYWRkIGFuIEFjdGlvbiBCYXIgdG8geW91ciBvd24gdGhlbWVzCisgICAgICAgIC8vIGJ5IGFkZGluZyB0aGUgZWxlbWVudCA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd0FjdGlvbkJhciI+dHJ1ZTwvaXRlbT4KKyAgICAgICAgLy8gdG8geW91ciBzdHlsZSBkZWZpbml0aW9uLgorICAgICAgICBnZXRXaW5kb3coKS5yZXF1ZXN0RmVhdHVyZShXaW5kb3cuRkVBVFVSRV9BQ1RJT05fQkFSKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICAvLyBNZW51IGl0ZW1zIGRlZmF1bHQgdG8gbmV2ZXIgc2hvdyBpbiB0aGUgYWN0aW9uIGJhci4gT24gbW9zdCBkZXZpY2VzIHRoaXMgbWVhbnMKKyAgICAgICAgLy8gdGhleSB3aWxsIHNob3cgaW4gdGhlIHN0YW5kYXJkIG9wdGlvbnMgbWVudSBwYW5lbCB3aGVuIHRoZSBtZW51IGJ1dHRvbiBpcyBwcmVzc2VkLgorICAgICAgICAvLyBPbiB4bGFyZ2Utc2NyZWVuIGRldmljZXMgYSAiTW9yZSIgYnV0dG9uIHdpbGwgYXBwZWFyIGluIHRoZSBmYXIgcmlnaHQgb2YgdGhlCisgICAgICAgIC8vIEFjdGlvbiBCYXIgdGhhdCB3aWxsIGRpc3BsYXkgcmVtYWluaW5nIGl0ZW1zIGluIGEgY2FzY2FkaW5nIG1lbnUuCisgICAgICAgIG1lbnUuYWRkKCJOb3JtYWwgaXRlbSIpOworCisgICAgICAgIE1lbnVJdGVtIGFjdGlvbkl0ZW0gPSBtZW51LmFkZCgiQWN0aW9uIEJ1dHRvbiIpOworCisgICAgICAgIC8vIEl0ZW1zIHRoYXQgc2hvdyBhcyBhY3Rpb25zIHNob3VsZCBmYXZvciB0aGUgImlmIHJvb20iIHNldHRpbmcsIHdoaWNoIHdpbGwKKyAgICAgICAgLy8gcHJldmVudCB0b28gbWFueSBidXR0b25zIGZyb20gY3Jvd2RpbmcgdGhlIGJhci4gRXh0cmEgaXRlbXMgd2lsbCBzaG93IGluIHRoZQorICAgICAgICAvLyBvdmVyZmxvdyBhcmVhLgorICAgICAgICBhY3Rpb25JdGVtLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKworICAgICAgICAvLyBJdGVtcyB0aGF0IHNob3cgYXMgYWN0aW9ucyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCB0byB1c2UgYW4gaWNvbi4KKyAgICAgICAgLy8gVGhlc2UgaWNvbnMgYXJlIHNob3duIHdpdGhvdXQgYSB0ZXh0IGRlc2NyaXB0aW9uLCBhbmQgdGhlcmVmb3JlIHNob3VsZAorICAgICAgICAvLyBiZSBzdWZmaWNpZW50bHkgZGVzY3JpcHRpdmUgb24gdGhlaXIgb3duLgorICAgICAgICBhY3Rpb25JdGVtLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfc2hhcmUpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJTZWxlY3RlZCBJdGVtOiAiICsgaXRlbS5nZXRUaXRsZSgpLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJVc2FnZS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9BY3Rpb25CYXJVc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTc1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FjdGlvbkJhclVzYWdlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Ub2FzdDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCisvKioKKyAqIFRoaXMgZGVtb25zdHJhdGVzIGlkaW9tYXRpYyB1c2FnZSBvZiB0aGUgQWN0aW9uIEJhci4gVGhlIHRoZW1lIFRoZW1lLldpdGhBY3Rpb25CYXIKKyAqIGlzIHNwZWNpZmllZCBmb3IgdGhpcyBhY3Rpdml0eSBpbiBBbmRyb2lkTWFuaWZlc3QueG1sIGFuZCBhIG1lbnUgcmVzb3VyY2UgaXMgdXNlZAorICogdG8gcG9wdWxhdGUgdGhlIG1lbnUgZGF0YSBpdHNlbGYuIElmIHlvdSdkIGxpa2UgdG8gc2VlIGhvdyB0aGVzZSB0aGluZ3Mgd29yayB1bmRlcgorICogdGhlIGhvb2QsIHNlZSBBY3Rpb25CYXJNZWNoYW5pY3MuCisgKi8KK3B1YmxpYyBjbGFzcyBBY3Rpb25CYXJVc2FnZSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgaW5mbGF0ZXIuaW5mbGF0ZShSLm1lbnUuYWN0aW9ucywgbWVudSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIG9uT3B0aW9uc0l0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisgICAgICAgIFRvYXN0Lm1ha2VUZXh0KHRoaXMsICJTZWxlY3RlZCBJdGVtOiAiICsgaXRlbS5nZXRUaXRsZSgpLCBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gVGhpcyBtZXRob2QgaXMgc3BlY2lmaWVkIGFzIGFuIG9uQ2xpY2sgaGFuZGxlciBpbiB0aGUgbWVudSB4bWwgYW5kIHdpbGwKKyAgICAvLyB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgQWN0aXZpdHkncyBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQgbWV0aG9kLgorICAgIC8vIFNlZSByZXMvbWVudS9hY3Rpb25zLnhtbCBmb3IgbW9yZSBpbmZvLgorICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgVG9hc3QubWFrZVRleHQodGhpcywgIlNlYXJjaGluZy4uLiIsIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGV2aWNlQWRtaW5TYW1wbGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGV2aWNlQWRtaW5TYW1wbGUuamF2YQppbmRleCBmN2VlMmQ3Li5lNmNiYzliIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0RldmljZUFkbWluU2FtcGxlLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9EZXZpY2VBZG1pblNhbXBsZS5qYXZhCkBAIC00Miw2ICs0MiwxMSBAQAogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXI7CiAKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Qcm94eTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCiAvKioKICAqIEV4YW1wbGUgb2YgYSBkby1ub3RoaW5nIGFkbWluIGNsYXNzLiAgV2hlbiBlbmFibGVkLCBpdCBsZXRzIHlvdSBjb250cm9sCiAgKiBzb21lIG9mIGl0cyBwb2xpY3kgYW5kIHJlcG9ydHMgd2hlbiB0aGVyZSBpcyBpbnRlcmVzdGluZyBhY3Rpdml0eS4KQEAgLTU0LDYgKzU5LDEzIEBACiAKICAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfUVVBTElUWSA9ICJwYXNzd29yZF9xdWFsaXR5IjsKICAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTEVOR1RIID0gInBhc3N3b3JkX2xlbmd0aCI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fTEVUVEVSUyA9ICJwYXNzd29yZF9taW5pbXVtX2xldHRlcnMiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX1VQUEVSQ0FTRSA9ICJwYXNzd29yZF9taW5pbXVtX3VwcGVyY2FzZSI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fTE9XRVJDQVNFID0gInBhc3N3b3JkX21pbmltdW1fbG93ZXJjYXNlIjsKKyAgICBzdGF0aWMgU3RyaW5nIFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OVU1FUklDID0gInBhc3N3b3JkX21pbmltdW1fbnVtZXJpYyI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX01JTklNVU1fU1lNQk9MUyA9ICJwYXNzd29yZF9taW5pbXVtX3N5bWJvbHMiOworICAgIHN0YXRpYyBTdHJpbmcgUFJFRl9QQVNTV09SRF9NSU5JTVVNX05PTkxFVFRFUiA9ICJwYXNzd29yZF9taW5pbXVtX25vbmxldHRlciI7CisgICAgc3RhdGljIFN0cmluZyBQUkVGX1BBU1NXT1JEX0hJU1RPUllfTEVOR1RIID0gInBhc3N3b3JkX2hpc3RvcnlfbGVuZ3RoIjsKICAgICBzdGF0aWMgU3RyaW5nIFBSRUZfTUFYX0ZBSUxFRF9QVyA9ICJtYXhfZmFpbGVkX3B3IjsKIAogICAgIHZvaWQgc2hvd1RvYXN0KENvbnRleHQgY29udGV4dCwgQ2hhclNlcXVlbmNlIG1zZykgewpAQCAtMTE1LDEwICsxMjcsMTggQEAKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9TT01FVEhJTkcsCiAgICAgICAgICAgICBEZXZpY2VQb2xpY3lNYW5hZ2VyLlBBU1NXT1JEX1FVQUxJVFlfTlVNRVJJQywKICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9BTFBIQUJFVElDLAotICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQworICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX0FMUEhBTlVNRVJJQywKKyAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9DT01QTEVYCiAgICAgICAgIH07CiAgICAgICAgIFNwaW5uZXIgbVBhc3N3b3JkUXVhbGl0eTsKICAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTGVuZ3RoOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtTGV0dGVyczsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZTsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZTsKKyAgICAgICAgRWRpdFRleHQgbVBhc3N3b3JkTWluaW11bU51bWVyaWM7CisgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZE1pbmltdW1TeW1ib2xzOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyOworICAgICAgICBFZGl0VGV4dCBtUGFzc3dvcmRIaXN0b3J5TGVuZ3RoOwogICAgICAgICBCdXR0b24gbVNldFBhc3N3b3JkQnV0dG9uOwogCiAgICAgICAgIEVkaXRUZXh0IG1QYXNzd29yZDsKQEAgLTEzMyw2ICsxNTMsMTAgQEAKIAogICAgICAgICBwcml2YXRlIEVkaXRUZXh0IG1UaW1lb3V0OwogCisgICAgICAgIEVkaXRUZXh0IG1Qcm94eUhvc3Q7CisgICAgICAgIEVkaXRUZXh0IG1Qcm94eUxpc3Q7CisgICAgICAgIEJ1dHRvbiBtUHJveHlCdXR0b247CisKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CkBAIC0xNzgsNiArMjAyLDk3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fbGV0dGVycyk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTGV0dGVycy5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bUxldHRlcnMoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZSA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX3VwcGVyY2FzZSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Mb3dlcmNhc2UgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfbWluaW11bV9sb3dlcmNhc2UpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZS5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bUxvd2VyY2FzZShJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTnVtZXJpYyA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX251bWVyaWMpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU51bWVyaWMuYWRkVGV4dENoYW5nZWRMaXN0ZW5lcihuZXcgVGV4dFdhdGNoZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWZ0ZXJUZXh0Q2hhbmdlZChFZGl0YWJsZSBzKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBjb3VudCwgaW50IGFmdGVyKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGJlZm9yZSwgaW50IGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzID0gKEVkaXRUZXh0KWZpbmRWaWV3QnlJZChSLmlkLnBhc3N3b3JkX21pbmltdW1fc3ltYm9scyk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtU3ltYm9scy5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMoSW50ZWdlci5wYXJzZUludChzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlciA9IChFZGl0VGV4dClmaW5kVmlld0J5SWQoUi5pZC5wYXNzd29yZF9taW5pbXVtX25vbmxldHRlcik7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyLmFkZFRleHRDaGFuZ2VkTGlzdGVuZXIobmV3IFRleHRXYXRjaGVyKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFmdGVyVGV4dENoYW5nZWQoRWRpdGFibGUgcykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBiZWZvcmVUZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgY291bnQsIGludCBhZnRlcikgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRleHRDaGFuZ2VkKENoYXJTZXF1ZW5jZSBzLCBpbnQgc3RhcnQsIGludCBiZWZvcmUsIGludCBjb3VudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKEludGVnZXIucGFyc2VJbnQocy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGggPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfaGlzdG9yeV9sZW5ndGgpOworICAgICAgICAgICAgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aC5hZGRUZXh0Q2hhbmdlZExpc3RlbmVyKG5ldyBUZXh0V2F0Y2hlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZnRlclRleHRDaGFuZ2VkKEVkaXRhYmxlIHMpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmVmb3JlVGV4dENoYW5nZWQoQ2hhclNlcXVlbmNlIHMsIGludCBzdGFydCwgaW50IGNvdW50LCBpbnQgYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25UZXh0Q2hhbmdlZChDaGFyU2VxdWVuY2UgcywgaW50IHN0YXJ0LCBpbnQgYmVmb3JlLCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFBhc3N3b3JkSGlzdG9yeUxlbmd0aChJbnRlZ2VyLnBhcnNlSW50KHMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24gPSAoQnV0dG9uKWZpbmRWaWV3QnlJZChSLmlkLnNldF9wYXNzd29yZCk7CiAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXRQYXNzd29yZExpc3RlbmVyKTsKIApAQCAtMjEyLDYgKzMyNywxMSBAQAogICAgICAgICAgICAgbVRpbWVvdXQgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnRpbWVvdXQpOwogICAgICAgICAgICAgbVRpbWVvdXRCdXR0b24gPSAoQnV0dG9uKSBmaW5kVmlld0J5SWQoUi5pZC5zZXRfdGltZW91dCk7CiAgICAgICAgICAgICBtVGltZW91dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVNldFRpbWVvdXRMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIG1Qcm94eUhvc3QgPSAoRWRpdFRleHQpIGZpbmRWaWV3QnlJZChSLmlkLnByb3h5aG9zdCk7CisgICAgICAgICAgICBtUHJveHlMaXN0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5wcm94eWxpc3QpOworICAgICAgICAgICAgbVByb3h5QnV0dG9uID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQuc2V0X3Byb3h5KTsKKyAgICAgICAgICAgIG1Qcm94eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVNldFByb3h5TGlzdGVuZXIpOwogICAgICAgICB9CiAKICAgICAgICAgdm9pZCB1cGRhdGVCdXR0b25TdGF0ZXMoKSB7CkBAIC0yMjEsNiArMzQxLDEzIEBACiAgICAgICAgICAgICAgICAgbURpc2FibGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmRRdWFsaXR5LnNldEVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkTGVuZ3RoLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxldHRlcnMuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxvd2VyY2FzZS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU51bWVyaWMuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyLnNldEVuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1TZXRQYXNzd29yZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1QYXNzd29yZC5zZXRFbmFibGVkKHRydWUpOwogICAgICAgICAgICAgICAgIG1SZXNldFBhc3N3b3JkQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7CkBAIC0yMzEsNiArMzU4LDEzIEBACiAgICAgICAgICAgICAgICAgbURpc2FibGVCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkUXVhbGl0eS5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBtUGFzc3dvcmRMZW5ndGguc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bUxldHRlcnMuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVVwcGVyY2FzZS5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1TeW1ib2xzLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1OdW1lcmljLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1Ob25MZXR0ZXIuc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgbVBhc3N3b3JkSGlzdG9yeUxlbmd0aC5zZXRFbmFibGVkKGZhbHNlKTsKICAgICAgICAgICAgICAgICBtU2V0UGFzc3dvcmRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICAgbVBhc3N3b3JkLnNldEVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgIG1SZXNldFBhc3N3b3JkQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwpAQCAtMjQ0LDYgKzM3OCwxMyBAQAogICAgICAgICAgICAgZmluYWwgaW50IHB3UXVhbGl0eSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX1FVQUxJVFksCiAgICAgICAgICAgICAgICAgICAgIERldmljZVBvbGljeU1hbmFnZXIuUEFTU1dPUkRfUVVBTElUWV9VTlNQRUNJRklFRCk7CiAgICAgICAgICAgICBmaW5hbCBpbnQgcHdMZW5ndGggPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9MRU5HVEgsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTGV0dGVycyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTEVUVEVSUywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5VcHBlcmNhc2UgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX1VQUEVSQ0FTRSwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5Mb3dlcmNhc2UgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xPV0VSQ0FTRSwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5OdW1lcmljID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OVU1FUklDLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pblN5bWJvbHMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX1NZTUJPTFMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluTm9uTGV0dGVyID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OT05MRVRURVIsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3SGlzdG9yeUxlbmd0aCA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX0hJU1RPUllfTEVOR1RILCAwKTsKICAgICAgICAgICAgIGZpbmFsIGludCBtYXhGYWlsZWRQdyA9IHByZWZzLmdldEludChQUkVGX01BWF9GQUlMRURfUFcsIDApOwogCiAgICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bVBhc3N3b3JkUXVhbGl0eVZhbHVlcy5sZW5ndGg7IGkrKykgewpAQCAtMjUyLDYgKzM5MywxMyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QYXNzd29yZExlbmd0aC5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdMZW5ndGgpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1MZXR0ZXJzLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pbkxldHRlcnMpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZE1pbmltdW1VcHBlcmNhc2Uuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluVXBwZXJjYXNlKSk7CisgICAgICAgICAgICBtUGFzc3dvcmRNaW5pbXVtTG93ZXJjYXNlLnNldFRleHQoSW50ZWdlci50b1N0cmluZyhwd01pbkxvd2VyY2FzZSkpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bVN5bWJvbHMuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluU3ltYm9scykpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU51bWVyaWMuc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3TWluTnVtZXJpYykpOworICAgICAgICAgICAgbVBhc3N3b3JkTWluaW11bU5vbkxldHRlci5zZXRUZXh0KEludGVnZXIudG9TdHJpbmcocHdNaW5Ob25MZXR0ZXIpKTsKKyAgICAgICAgICAgIG1QYXNzd29yZEhpc3RvcnlMZW5ndGguc2V0VGV4dChJbnRlZ2VyLnRvU3RyaW5nKHB3SGlzdG9yeUxlbmd0aCkpOwogICAgICAgICAgICAgbU1heEZhaWxlZFB3LnNldFRleHQoSW50ZWdlci50b1N0cmluZyhtYXhGYWlsZWRQdykpOwogICAgICAgICB9CiAKQEAgLTI2MCwxMiArNDA4LDI2IEBACiAgICAgICAgICAgICBmaW5hbCBpbnQgcHdRdWFsaXR5ID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfUVVBTElUWSwKICAgICAgICAgICAgICAgICAgICAgRGV2aWNlUG9saWN5TWFuYWdlci5QQVNTV09SRF9RVUFMSVRZX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgICAgIGZpbmFsIGludCBwd0xlbmd0aCA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX0xFTkdUSCwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5MZXR0ZXJzID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pblVwcGVyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fVVBQRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbkxvd2VyY2FzZSA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fTE9XRVJDQVNFLCAwKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwd01pbk51bWVyaWMgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMsIDApOworICAgICAgICAgICAgZmluYWwgaW50IHB3TWluU3ltYm9scyA9IHByZWZzLmdldEludChQUkVGX1BBU1NXT1JEX01JTklNVU1fU1lNQk9MUywgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdNaW5Ob25MZXR0ZXIgPSBwcmVmcy5nZXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05PTkxFVFRFUiwgMCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcHdIaXN0b3J5TGVuZ3RoID0gcHJlZnMuZ2V0SW50KFBSRUZfUEFTU1dPUkRfSElTVE9SWV9MRU5HVEgsIDApOwogICAgICAgICAgICAgZmluYWwgaW50IG1heEZhaWxlZFB3ID0gcHJlZnMuZ2V0SW50KFBSRUZfTUFYX0ZBSUxFRF9QVywgMCk7CiAKICAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlID0gbURQTS5pc0FkbWluQWN0aXZlKG1EZXZpY2VBZG1pblNhbXBsZSk7CiAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZFF1YWxpdHkobURldmljZUFkbWluU2FtcGxlLCBwd1F1YWxpdHkpOwogICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtTGVuZ3RoKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdMZW5ndGgpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtTGV0dGVycyhtRGV2aWNlQWRtaW5TYW1wbGUsIHB3TWluTGV0dGVycyk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1VcHBlckNhc2UobURldmljZUFkbWluU2FtcGxlLCBwd01pblVwcGVyY2FzZSk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1Mb3dlckNhc2UobURldmljZUFkbWluU2FtcGxlLCBwd01pbkxvd2VyY2FzZSk7CisgICAgICAgICAgICAgICAgbURQTS5zZXRQYXNzd29yZE1pbmltdW1OdW1lcmljKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5OdW1lcmljKTsKKyAgICAgICAgICAgICAgICBtRFBNLnNldFBhc3N3b3JkTWluaW11bVN5bWJvbHMobURldmljZUFkbWluU2FtcGxlLCBwd01pblN5bWJvbHMpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdNaW5Ob25MZXR0ZXIpOworICAgICAgICAgICAgICAgIG1EUE0uc2V0UGFzc3dvcmRIaXN0b3J5TGVuZ3RoKG1EZXZpY2VBZG1pblNhbXBsZSwgcHdIaXN0b3J5TGVuZ3RoKTsKICAgICAgICAgICAgICAgICBtRFBNLnNldE1heGltdW1GYWlsZWRQYXNzd29yZHNGb3JXaXBlKG1EZXZpY2VBZG1pblNhbXBsZSwgbWF4RmFpbGVkUHcpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODIsNiArNDQ0LDQ4IEBACiAgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1MZXR0ZXJzKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9MRVRURVJTLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtVXBwZXJjYXNlKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9VUFBFUkNBU0UsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1Mb3dlcmNhc2UoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX0xPV0VSQ0FTRSwgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFBhc3N3b3JkTWluaW11bU51bWVyaWMoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9NSU5JTVVNX05VTUVSSUMsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZE1pbmltdW1TeW1ib2xzKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9TWU1CT0xTLCBsZW5ndGgpLmNvbW1pdCgpOworICAgICAgICAgICAgdXBkYXRlUG9saWNpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0UGFzc3dvcmRNaW5pbXVtTm9uTGV0dGVyKGludCBsZW5ndGgpIHsKKyAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CisgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfUEFTU1dPUkRfTUlOSU1VTV9OT05MRVRURVIsIGxlbmd0aCkuY29tbWl0KCk7CisgICAgICAgICAgICB1cGRhdGVQb2xpY2llcygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRQYXNzd29yZEhpc3RvcnlMZW5ndGgoaW50IGxlbmd0aCkgeworICAgICAgICAgICAgU2hhcmVkUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRTYW1wbGVQcmVmZXJlbmNlcyh0aGlzKTsKKyAgICAgICAgICAgIHByZWZzLmVkaXQoKS5wdXRJbnQoUFJFRl9QQVNTV09SRF9ISVNUT1JZX0xFTkdUSCwgbGVuZ3RoKS5jb21taXQoKTsKKyAgICAgICAgICAgIHVwZGF0ZVBvbGljaWVzKCk7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIHNldE1heEZhaWxlZFB3KGludCBsZW5ndGgpIHsKICAgICAgICAgICAgIFNoYXJlZFByZWZlcmVuY2VzIHByZWZzID0gZ2V0U2FtcGxlUHJlZmVyZW5jZXModGhpcyk7CiAgICAgICAgICAgICBwcmVmcy5lZGl0KCkucHV0SW50KFBSRUZfTUFYX0ZBSUxFRF9QVywgbGVuZ3RoKS5jb21taXQoKTsKQEAgLTQyNCw1ICs2MjgsNDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbVNldFByb3h5TGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlID0gbURQTS5pc0FkbWluQWN0aXZlKG1EZXZpY2VBZG1pblNhbXBsZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5U3BlYyA9IG1Qcm94eUhvc3QuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3h5TGlzdCA9IG1Qcm94eUxpc3QuZ2V0VGV4dCgpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgUHJveHkgaW5zdFByb3h5OworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBleGNsTGlzdDsKKworICAgICAgICAgICAgICAgIGlmICgocHJveHlTcGVjLmxlbmd0aCgpID09IDApIHx8IChwcm94eVNwZWMgPT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zdFByb3h5ID0gUHJveHkuTk9fUFJPWFk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gcHJveHlDb21wb25lbnRzID0gcHJveHlTcGVjLnNwbGl0KCI6Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcm94eUNvbXBvbmVudHMubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KENvbnRyb2xsZXIudGhpcywgIldyb25nIHByb3h5IHNwZWNpZmljYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5zdFByb3h5ID0gbmV3IFByb3h5KFByb3h5LlR5cGUuSFRUUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5ldFNvY2tldEFkZHJlc3MocHJveHlDb21wb25lbnRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwcm94eUNvbXBvbmVudHNbMV0pKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgocHJveHlMaXN0ID09IG51bGwpIHx8IChwcm94eUxpc3QubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjbExpc3QgPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGxpc3REb21zID0gcHJveHlMaXN0LnNwbGl0KCIsIik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0RG9tcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoQ29udHJvbGxlci50aGlzLCAiV3JvbmcgZXhjbHVzaW9uIGxpc3QgZm9ybWF0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGV4Y2xMaXN0ID0gIEFycmF5cy5hc0xpc3QobGlzdERvbXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG1EUE0uc2V0R2xvYmFsUHJveHkobURldmljZUFkbWluU2FtcGxlLCBpbnN0UHJveHksIGV4Y2xMaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50TmFtZSBwcm94eUFkbWluID0gbURQTS5nZXRHbG9iYWxQcm94eUFkbWluKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgocHJveHlBZG1pbiAhPSBudWxsKSAmJiAocHJveHlBZG1pbi5lcXVhbHMobURldmljZUFkbWluU2FtcGxlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KENvbnRyb2xsZXIudGhpcywgIkdsb2JhbCBQcm94eSBzZXQgYnkgZGV2aWNlIGFkbWluLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QWxlcnREaWFsb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmY5NzMxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFsZXJ0RGlhbG9nLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOworaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuRGlhbG9nSW50ZXJmYWNlOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50QWxlcnREaWFsb2cgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZyk7CisKKyAgICAgICAgVmlldyB0diA9IGZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAoKFRleHRWaWV3KXR2KS5zZXRUZXh0KCJFeGFtcGxlIG9mIGRpc3BsYXlpbmcgYW4gYWxlcnQgZGlhbG9nIHdpdGggYSBEaWFsb2dGcmFnbWVudCIpOworCisgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zaG93KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBzaG93RGlhbG9nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGFjdGl2aXR5KQorICAgIHZvaWQgc2hvd0RpYWxvZygpIHsKKyAgICAgICAgRGlhbG9nRnJhZ21lbnQgbmV3RnJhZ21lbnQgPSBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgUi5zdHJpbmcuYWxlcnRfZGlhbG9nX3R3b19idXR0b25zX3RpdGxlKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhnZXRGcmFnbWVudE1hbmFnZXIoKSwgImRpYWxvZyIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRvUG9zaXRpdmVDbGljaygpIHsKKyAgICAgICAgLy8gRG8gc3R1ZmYgaGVyZS4KKyAgICAgICAgTG9nLmkoIkZyYWdtZW50QWxlcnREaWFsb2ciLCAiUG9zaXRpdmUgY2xpY2shIik7CisgICAgfQorICAgIAorICAgIHB1YmxpYyB2b2lkIGRvTmVnYXRpdmVDbGljaygpIHsKKyAgICAgICAgLy8gRG8gc3R1ZmYgaGVyZS4KKyAgICAgICAgTG9nLmkoIkZyYWdtZW50QWxlcnREaWFsb2ciLCAiTmVnYXRpdmUgY2xpY2shIik7CisgICAgfQorLy9FTkRfSU5DTFVERShhY3Rpdml0eSkKKyAgICAKKy8vQkVHSU5fSU5DTFVERShkaWFsb2cpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IHRpdGxlKSB7CisgICAgICAgICAgICBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQgZnJhZyA9IG5ldyBNeUFsZXJ0RGlhbG9nRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoInRpdGxlIiwgdGl0bGUpOworICAgICAgICAgICAgZnJhZy5zZXRBcmd1bWVudHMoYXJncyk7CisgICAgICAgICAgICByZXR1cm4gZnJhZzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgaW50IHRpdGxlID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJ0aXRsZSIpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gbmV3IEFsZXJ0RGlhbG9nLkJ1aWxkZXIoZ2V0QWN0aXZpdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldEljb24oUi5kcmF3YWJsZS5hbGVydF9kaWFsb2dfaWNvbikKKyAgICAgICAgICAgICAgICAgICAgLnNldFRpdGxlKHRpdGxlKQorICAgICAgICAgICAgICAgICAgICAuc2V0UG9zaXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX29rLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpYWxvZ0ludGVyZmFjZS5PbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhEaWFsb2dJbnRlcmZhY2UgZGlhbG9nLCBpbnQgd2hpY2hCdXR0b24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChGcmFnbWVudEFsZXJ0RGlhbG9nKWdldEFjdGl2aXR5KCkpLmRvUG9zaXRpdmVDbGljaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAuc2V0TmVnYXRpdmVCdXR0b24oUi5zdHJpbmcuYWxlcnRfZGlhbG9nX2NhbmNlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEaWFsb2dJbnRlcmZhY2UuT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soRGlhbG9nSW50ZXJmYWNlIGRpYWxvZywgaW50IHdoaWNoQnV0dG9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRnJhZ21lbnRBbGVydERpYWxvZylnZXRBY3Rpdml0eSgpKS5kb05lZ2F0aXZlQ2xpY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkaWFsb2cpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50QW5pbS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFuaW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM0NWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudEFuaW0uamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBhbmltYXRpb25zIHdoZW4gY2hhbmdpbmcgZnJhZ21lbnQgc3RhdGVzLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRBbmltIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9hbmltKTsKKworICAgICAgICBhZGRTaG93SGlkZUxpc3RlbmVyKFIuaWQuZnJhZzFoaWRlLCBmaW5kRnJhZ21lbnRCeUlkKFIuaWQuZnJhZ21lbnQxKSk7CisgICAgICAgIGFkZFNob3dIaWRlTGlzdGVuZXIoUi5pZC5mcmFnMmhpZGUsIGZpbmRGcmFnbWVudEJ5SWQoUi5pZC5mcmFnbWVudDIpKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZFNob3dIaWRlTGlzdGVuZXIoaW50IGJ1dHRvbklkLCBmaW5hbCBGcmFnbWVudCBmcmFnbWVudCkgeworICAgICAgICBmaW5hbCBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoYnV0dG9uSWQpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBvcGVuRnJhZ21lbnRUcmFuc2FjdGlvbigpOworICAgICAgICAgICAgICAgIGZ0LnNldEN1c3RvbUFuaW1hdGlvbnMoYW5kcm9pZC5SLmFuaW0uYW5pbWF0b3JfZmFkZV9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5hbmltLmFuaW1hdG9yX2ZhZGVfb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuaXNIaWRkZW4oKSkgeworICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0QW5pbWF0aW9uKEFuaW1hdGlvblV0aWxzLmxvYWRBbmltYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnRBbmltLnRoaXMsIGFuZHJvaWQuUi5hbmltLnNsaWRlX2luX2xlZnQpKTsKKyAgICAgICAgICAgICAgICAgICAgZnQuc2hvdyhmcmFnbWVudCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldEFuaW1hdGlvbihBbmltYXRpb25VdGlscy5sb2FkQW5pbWF0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYWdtZW50QW5pbS50aGlzLCBhbmRyb2lkLlIuYW5pbS5zbGlkZV9vdXRfcmlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgZnQuaGlkZShmcmFnbWVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZ0LmNvbW1pdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpcnN0RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIFRleHRWaWV3IG1UZXh0VmlldzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubGFiZWxlZF90ZXh0X2VkaXQsIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXNnKTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIlRoZSBmcmFnbWVudCBzYXZlcyBhbmQgcmVzdG9yZXMgdGhpcyB0ZXh0LiIpOworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgdGV4dCBlZGl0b3IsIGFuZCByZXN0b3JlIHRoZSBsYXN0IHNhdmVkIHN0YXRlIGlmIG5lZWRlZC4KKyAgICAgICAgICAgIG1UZXh0VmlldyA9IChUZXh0Vmlldyl2LmZpbmRWaWV3QnlJZChSLmlkLnNhdmVkKTsKKyAgICAgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1UZXh0Vmlldy5zZXRUZXh0KHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRDaGFyU2VxdWVuY2UoInRleHQiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25TYXZlSW5zdGFuY2VTdGF0ZShvdXRTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBjdXJyZW50IHRleHQsIHRvIHJlc3RvcmUgaWYgd2UgbGF0ZXIgcmVzdGFydC4KKyAgICAgICAgICAgIG91dFN0YXRlLnB1dENoYXJTZXF1ZW5jZSgidGV4dCIsIG1UZXh0Vmlldy5nZXRUZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWNvbmRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgdiA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQubGFiZWxlZF90ZXh0X2VkaXQsIGNvbnRhaW5lciwgZmFsc2UpOworICAgICAgICAgICAgVmlldyB0diA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXNnKTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIlRoZSBUZXh0VmlldyBzYXZlcyBhbmQgcmVzdG9yZXMgdGhpcyB0ZXh0LiIpOworCisgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgdGV4dCBlZGl0b3IgYW5kIHRlbGwgaXQgdG8gc2F2ZSBhbmQgcmVzdG9yZSBpdHMgc3RhdGUuCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgeW91IHdpbGwgb2Z0ZW4gc2V0IHRoaXMgaW4gdGhlIGxheW91dCBYTUwsIGJ1dCBzaW5jZQorICAgICAgICAgICAgLy8gd2UgYXJlIHNoYXJpbmcgb3VyIGxheW91dCB3aXRoIHRoZSBvdGhlciBmcmFnbWVudCB3ZSB3aWxsIGN1c3RvbWl6ZQorICAgICAgICAgICAgLy8gaXQgaGVyZS4KKyAgICAgICAgICAgICgoVGV4dFZpZXcpdi5maW5kVmlld0J5SWQoUi5pZC5zYXZlZCkpLnNldFNhdmVFbmFibGVkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRDb250ZXh0TWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NWY3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50Q29udGV4dE1lbnUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0TWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRNZW51LkNvbnRleHRNZW51SW5mbzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIGRpc3BsYXlpbmcgYSBjb250ZXh0IG1lbnUgZnJvbSBhIGZyYWdtZW50LgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRDb250ZXh0TWVudSBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGxpc3QgZnJhZ21lbnQgYW5kIGFkZCBpdCBhcyBvdXIgc29sZSBjb250ZW50LgorICAgICAgICBDb250ZXh0TWVudUZyYWdtZW50IGNvbnRlbnQgPSBuZXcgQ29udGV4dE1lbnVGcmFnbWVudCgpOworICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsIGNvbnRlbnQpLmNvbW1pdCgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGV4dE1lbnVGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KExheW91dEluZmxhdGVyIGluZmxhdGVyLCBWaWV3R3JvdXAgY29udGFpbmVyLAorICAgICAgICAgICAgICAgIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIFZpZXcgcm9vdCA9IGluZmxhdGVyLmluZmxhdGUoUi5sYXlvdXQuZnJhZ21lbnRfY29udGV4dF9tZW51LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyRm9yQ29udGV4dE1lbnUocm9vdC5maW5kVmlld0J5SWQoUi5pZC5sb25nX3ByZXNzKSk7CisgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZUNvbnRleHRNZW51KENvbnRleHRNZW51IG1lbnUsIFZpZXcgdiwgQ29udGV4dE1lbnVJbmZvIG1lbnVJbmZvKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZUNvbnRleHRNZW51KG1lbnUsIHYsIG1lbnVJbmZvKTsKKyAgICAgICAgICAgIG1lbnUuYWRkKE1lbnUuTk9ORSwgUi5pZC5hX2l0ZW0sIE1lbnUuTk9ORSwgIk1lbnUgQSIpOworICAgICAgICAgICAgbWVudS5hZGQoTWVudS5OT05FLCBSLmlkLmJfaXRlbSwgTWVudS5OT05FLCAiTWVudSBCIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250ZXh0SXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUi5pZC5hX2l0ZW06CisgICAgICAgICAgICAgICAgICAgIExvZy5pKCJDb250ZXh0TWVudSIsICJJdGVtIDFhIHdhcyBjaG9zZW4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgY2FzZSBSLmlkLmJfaXRlbToKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkNvbnRleHRNZW51IiwgIkl0ZW0gMWIgd2FzIGNob3NlbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdXBlci5vbkNvbnRleHRJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyZWY4YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnREaWFsb2cuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5hcHAuRnJhZ21lbnRUcmFuc2FjdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuT25DbGlja0xpc3RlbmVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworCitwdWJsaWMgY2xhc3MgRnJhZ21lbnREaWFsb2cgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgaW50IG1TdGFja0xldmVsID0gMDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuZnJhZ21lbnRfZGlhbG9nKTsKKworICAgICAgICBWaWV3IHR2ID0gZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7CisgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIkV4YW1wbGUgb2YgZGlzcGxheWluZyBkaWFsb2dzIHdpdGggYSBEaWFsb2dGcmFnbWVudC4gICIKKyAgICAgICAgICAgICAgICArICJQcmVzcyB0aGUgc2hvdyBidXR0b24gYmVsb3cgdG8gc2VlIHRoZSBmaXJzdCBkaWFsb2c7IHByZXNzaW5nICIKKyAgICAgICAgICAgICAgICArICJzdWNjZXNzaXZlIHNob3cgYnV0dG9ucyB3aWxsIGRpc3BsYXkgb3RoZXIgZGlhbG9nIHN0eWxlcyBhcyBhICIKKyAgICAgICAgICAgICAgICArICJzdGFjaywgd2l0aCBkaXNtaXNzaW5nIG9yIGJhY2sgZ29pbmcgdG8gdGhlIHByZXZpb3VzIGRpYWxvZy4iKTsKKworICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc2hvdyk7CisgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7CisgICAgICAgICAgICAgICAgc2hvd0RpYWxvZygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1TdGFja0xldmVsID0gc2F2ZWRJbnN0YW5jZVN0YXRlLmdldEludCgibGV2ZWwiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uU2F2ZUluc3RhbmNlU3RhdGUob3V0U3RhdGUpOworICAgICAgICBvdXRTdGF0ZS5wdXRJbnQoImxldmVsIiwgbVN0YWNrTGV2ZWwpOworICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGFkZF9kaWFsb2cpCisgICAgdm9pZCBzaG93RGlhbG9nKCkgeworICAgICAgICBtU3RhY2tMZXZlbCsrOworCisgICAgICAgIC8vIERpYWxvZ0ZyYWdtZW50LnNob3coKSB3aWxsIHRha2UgY2FyZSBvZiBhZGRpbmcgdGhlIGZyYWdtZW50CisgICAgICAgIC8vIGluIGEgdHJhbnNhY3Rpb24uICBXZSBhbHNvIHdhbnQgdG8gcmVtb3ZlIGFueSBjdXJyZW50bHkgc2hvd2luZworICAgICAgICAvLyBkaWFsb2csIHNvIG1ha2Ugb3VyIG93biB0cmFuc2FjdGlvbiBhbmQgdGFrZSBjYXJlIG9mIHRoYXQgaGVyZS4KKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBGcmFnbWVudCBwcmV2ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuZmluZEZyYWdtZW50QnlUYWcoImRpYWxvZyIpOworICAgICAgICBpZiAocHJldiAhPSBudWxsKSB7CisgICAgICAgICAgICBmdC5yZW1vdmUocHJldik7CisgICAgICAgIH0KKyAgICAgICAgZnQuYWRkVG9CYWNrU3RhY2sobnVsbCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuZCBzaG93IHRoZSBkaWFsb2cuCisgICAgICAgIERpYWxvZ0ZyYWdtZW50IG5ld0ZyYWdtZW50ID0gTXlEaWFsb2dGcmFnbWVudC5uZXdJbnN0YW5jZShtU3RhY2tMZXZlbCk7CisgICAgICAgIG5ld0ZyYWdtZW50LnNob3coZnQsICJkaWFsb2ciKTsKKyAgICB9CisvL0VORF9JTkNMVURFKGFkZF9kaWFsb2cpCisKKyAgICBzdGF0aWMgU3RyaW5nIGdldE5hbWVGb3JOdW0oaW50IG51bSkgeworICAgICAgICBzd2l0Y2ggKChudW0tMSklNikgeworICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gIlNUWUxFX05PX1RJVExFIjsKKyAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuICJTVFlMRV9OT19GUkFNRSI7CisgICAgICAgICAgICBjYXNlIDM6IHJldHVybiAiU1RZTEVfTk9fSU5QVVQgKHRoaXMgd2luZG93IGNhbid0IHJlY2VpdmUgaW5wdXQsIHNvICIKKyAgICAgICAgICAgICAgICAgICAgKyAieW91IHdpbGwgbmVlZCB0byBwcmVzcyB0aGUgYm90dG9tIHNob3cgYnV0dG9uKSI7CisgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiAiU1RZTEVfTk9STUFMIHdpdGggbGlnaHQgZnVsbHNjcmVlbiB0aGVtZSI7CisgICAgICAgICAgICBjYXNlIDU6IHJldHVybiAiU1RZTEVfTk9STUFMIHdpdGggZGFyayBmdWxsc2NyZWVuIHRoZW1lIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gIlNUWUxFX05PUk1BTCI7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoZGlhbG9nKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlEaWFsb2dGcmFnbWVudCBleHRlbmRzIERpYWxvZ0ZyYWdtZW50IHsKKyAgICAgICAgaW50IG1OdW07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBNeURpYWxvZ0ZyYWdtZW50LCBwcm92aWRpbmcgIm51bSIKKyAgICAgICAgICogYXMgYW4gYXJndW1lbnQuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgTXlEaWFsb2dGcmFnbWVudCBuZXdJbnN0YW5jZShpbnQgbnVtKSB7CisgICAgICAgICAgICBNeURpYWxvZ0ZyYWdtZW50IGYgPSBuZXcgTXlEaWFsb2dGcmFnbWVudCgpOworCisgICAgICAgICAgICAvLyBTdXBwbHkgbnVtIGlucHV0IGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7CisgICAgICAgICAgICBhcmdzLnB1dEludCgibnVtIiwgbnVtKTsKKyAgICAgICAgICAgIGYuc2V0QXJndW1lbnRzKGFyZ3MpOworCisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBtTnVtID0gZ2V0QXJndW1lbnRzKCkuZ2V0SW50KCJudW0iKTsKKworICAgICAgICAgICAgLy8gUGljayBhIHN0eWxlIGJhc2VkIG9uIHRoZSBudW0uCisgICAgICAgICAgICBpbnQgc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUwsIHRoZW1lID0gMDsKKyAgICAgICAgICAgIHN3aXRjaCAoKG1OdW0tMSklNikgeworICAgICAgICAgICAgICAgIGNhc2UgMTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT19USVRMRTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiBzdHlsZSA9IERpYWxvZ0ZyYWdtZW50LlNUWUxFX05PX0ZSQU1FOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHN0eWxlID0gRGlhbG9nRnJhZ21lbnQuU1RZTEVfTk9fSU5QVVQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTogc3R5bGUgPSBEaWFsb2dGcmFnbWVudC5TVFlMRV9OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoICgobU51bS0xKSU2KSB7CisgICAgICAgICAgICAgICAgY2FzZSA0OiB0aGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZV9MaWdodDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OiB0aGVtZSA9IGFuZHJvaWQuUi5zdHlsZS5UaGVtZTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRTdHlsZShzdHlsZSwgdGhlbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmZyYWdtZW50X2RpYWxvZywgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIkRpYWxvZyAjIiArIG1OdW0gKyAiOiB1c2luZyBzdHlsZSAiCisgICAgICAgICAgICAgICAgICAgICsgZ2V0TmFtZUZvck51bShtTnVtKSk7CisKKyAgICAgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC5zaG93KTsKKyAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJ1dHRvbiBpcyBjbGlja2VkLCBjYWxsIHVwIHRvIG93bmluZyBhY3Rpdml0eS4KKyAgICAgICAgICAgICAgICAgICAgKChGcmFnbWVudERpYWxvZylnZXRBY3Rpdml0eSgpKS5zaG93RGlhbG9nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkaWFsb2cpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50RGlhbG9nT3JBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQyYzAwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudERpYWxvZ09yQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBGcmFnbWVudERpYWxvZ09yQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9kaWFsb2dfb3JfYWN0aXZpdHkpOworCisgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gRmlyc3QtdGltZSBpbml0OyBjcmVhdGUgZnJhZ21lbnQgdG8gZW1iZWQgaW4gYWN0aXZpdHkuCisvL0JFR0lOX0lOQ0xVREUoZW1iZWQpCisgICAgICAgICAgICBGcmFnbWVudFRyYW5zYWN0aW9uIGZ0ID0gZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCk7CisgICAgICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZ0LmFkZChSLmlkLmVtYmVkZGVkLCBuZXdGcmFnbWVudCk7CisgICAgICAgICAgICBmdC5jb21taXQoKTsKKy8vRU5EX0lOQ0xVREUoZW1iZWQpCisgICAgICAgIH0KKworICAgICAgICAvLyBXYXRjaCBmb3IgYnV0dG9uIGNsaWNrcy4KKyAgICAgICAgQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc2hvd19kaWFsb2cpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIHNob3dEaWFsb2coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoc2hvd19kaWFsb2cpCisgICAgdm9pZCBzaG93RGlhbG9nKCkgeworICAgICAgICAvLyBDcmVhdGUgdGhlIGZyYWdtZW50IGFuZCBzaG93IGl0IGFzIGEgZGlhbG9nLgorICAgICAgICBEaWFsb2dGcmFnbWVudCBuZXdGcmFnbWVudCA9IE15RGlhbG9nRnJhZ21lbnQubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3RnJhZ21lbnQuc2hvdyhnZXRGcmFnbWVudE1hbmFnZXIoKSwgImRpYWxvZyIpOworICAgIH0KKy8vRU5EX0lOQ0xVREUoc2hvd19kaWFsb2cpCisKKy8vQkVHSU5fSU5DTFVERShkaWFsb2cpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeURpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgeworICAgICAgICBzdGF0aWMgTXlEaWFsb2dGcmFnbWVudCBuZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXlEaWFsb2dGcmFnbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldyhMYXlvdXRJbmZsYXRlciBpbmZsYXRlciwgVmlld0dyb3VwIGNvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBWaWV3IHYgPSBpbmZsYXRlci5pbmZsYXRlKFIubGF5b3V0LmhlbGxvX3dvcmxkLCBjb250YWluZXIsIGZhbHNlKTsKKyAgICAgICAgICAgIFZpZXcgdHYgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRleHQpOworICAgICAgICAgICAgKChUZXh0Vmlldyl0dikuc2V0VGV4dCgiVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBNeURpYWxvZ0ZyYWdtZW50Iik7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZGlhbG9nKQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExheW91dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzM4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGF5b3V0LmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuU2hha2VzcGVhcmU7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0RnJhZ21lbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Nyb2xsVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHVzaW5nIGZyYWdtZW50cyB0byBpbXBsZW1lbnQgZGlmZmVyZW50IGFjdGl2aXR5IGxheW91dHMuCisgKiBUaGlzIHNhbXBsZSBwcm92aWRlcyBhIGRpZmZlcmVudCBsYXlvdXQgKGFuZCBhY3Rpdml0eSBmbG93KSB3aGVuIHJ1biBpbgorICogbGFuZHNjYXBlLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMYXlvdXQgZXh0ZW5kcyBBY3Rpdml0eSB7CisKKy8vQkVHSU5fSU5DTFVERShtYWluKQorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X2xheW91dCk7CisgICAgfQorLy9FTkRfSU5DTFVERShtYWluKQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBhIHNlY29uZGFyeSBhY3Rpdml0eSwgdG8gc2hvdyB3aGF0IHRoZSB1c2VyIGhhcyBzZWxlY3RlZAorICAgICAqIHdoZW4gdGhlIHNjcmVlbiBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIHNob3cgaXQgYWxsIGluIG9uZSBhY3Rpdml0eS4KKyAgICAgKi8KKy8vQkVHSU5fSU5DTFVERShkZXRhaWxzX2FjdGl2aXR5KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGV0YWlsc0FjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICBpZiAoZ2V0UmVzb3VyY2VzKCkuZ2V0Q29uZmlndXJhdGlvbigpLm9yaWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgID09IENvbmZpZ3VyYXRpb24uT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNjcmVlbiBpcyBub3cgaW4gbGFuZHNjYXBlIG1vZGUsIHdlIGNhbiBzaG93IHRoZQorICAgICAgICAgICAgICAgIC8vIGRpYWxvZyBpbi1saW5lIHdpdGggdGhlIGxpc3Qgc28gd2UgZG9uJ3QgbmVlZCB0aGlzIGFjdGl2aXR5LgorICAgICAgICAgICAgICAgIGZpbmlzaCgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gRHVyaW5nIGluaXRpYWwgc2V0dXAsIHBsdWcgaW4gdGhlIGRldGFpbHMgZnJhZ21lbnQuCisgICAgICAgICAgICAgICAgRGV0YWlsc0ZyYWdtZW50IGRldGFpbHMgPSBuZXcgRGV0YWlsc0ZyYWdtZW50KCk7CisgICAgICAgICAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkub3BlblRyYW5zYWN0aW9uKCkuYWRkKGFuZHJvaWQuUi5pZC5jb250ZW50LCBkZXRhaWxzKS5jb21taXQoKTsKKyAgICAgICAgICAgICAgICBkZXRhaWxzLnNldFRleHQoZ2V0SW50ZW50KCkuZ2V0SW50RXh0cmEoInRleHQiLCAtMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkZXRhaWxzX2FjdGl2aXR5KQorCisvL0JFR0lOX0lOQ0xVREUodGl0bGVzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGl0bGVzRnJhZ21lbnQgZXh0ZW5kcyBMaXN0RnJhZ21lbnQgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BY3Rpdml0eUNyZWF0ZWQoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25BY3Rpdml0eUNyZWF0ZWQoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gUG9wdWxhdGUgbGlzdCB3aXRoIG91ciBzdGF0aWMgYXJyYXkgb2YgdGl0bGVzLgorICAgICAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KGdldEFjdGl2aXR5KCksCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2xpc3RfaXRlbV8xLCBTaGFrZXNwZWFyZS5USVRMRVMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxpc3RJdGVtQ2xpY2soTGlzdFZpZXcgbCwgVmlldyB2LCBpbnQgcG9zaXRpb24sIGxvbmcgaWQpIHsKKyAgICAgICAgICAgIERldGFpbHNGcmFnbWVudCBmcmFnID0gKERldGFpbHNGcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgZ2V0RnJhZ21lbnRNYW5hZ2VyKCkuZmluZEZyYWdtZW50QnlJZChSLmlkLmRpYWxvZyk7CisgICAgICAgICAgICBpZiAoZnJhZyAhPSBudWxsICYmIGZyYWcuaXNWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYWN0aXZpdHkgaGFzIGEgZnJhZ21lbnQgdG8gZGlzcGxheSB0aGUgZGlhbG9nLAorICAgICAgICAgICAgICAgIC8vIHBvaW50IGl0IHRvIHdoYXQgdGhlIHVzZXIgaGFzIHNlbGVjdGVkLgorICAgICAgICAgICAgICAgIGZyYWcuc2V0VGV4dCgoaW50KWlkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIG5lZWQgdG8gbGF1bmNoIGEgbmV3IGFjdGl2aXR5IHRvIGRpc3BsYXkKKyAgICAgICAgICAgICAgICAvLyB0aGUgZGlhbG9nIGZyYWdtZW50IHdpdGggc2VsZWN0ZWQgdGV4dC4KKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudCgpOworICAgICAgICAgICAgICAgIGludGVudC5zZXRDbGFzcyhnZXRBY3Rpdml0eSgpLCBEZXRhaWxzQWN0aXZpdHkuY2xhc3MpOworICAgICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYSgidGV4dCIsIChpbnQpaWQpOworICAgICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUodGl0bGVzKQorCisvL0JFR0lOX0lOQ0xVREUoZGV0YWlscykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERldGFpbHNGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgaW50IG1EaXNwbGF5ZWRUZXh0ID0gLTE7CisgICAgICAgIFRleHRWaWV3IG1UZXh0OworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFRleHQoaW50IGlkKSB7CisgICAgICAgICAgICBtRGlzcGxheWVkVGV4dCA9IGlkOworICAgICAgICAgICAgaWYgKG1UZXh0ICE9IG51bGwgJiYgaWQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1UZXh0LnNldFRleHQoU2hha2VzcGVhcmUuRElBTE9HVUVbaWRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgaWYgKHNhdmVkSW5zdGFuY2VTdGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbURpc3BsYXllZFRleHQgPSBzYXZlZEluc3RhbmNlU3RhdGUuZ2V0SW50KCJ0ZXh0IiwgLTEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgICAgIG91dFN0YXRlLnB1dEludCgidGV4dCIsIG1EaXNwbGF5ZWRUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgU2Nyb2xsVmlldyBzY3JvbGxlciA9IG5ldyBTY3JvbGxWaWV3KGdldEFjdGl2aXR5KCkpOworICAgICAgICAgICAgbVRleHQgPSBuZXcgVGV4dFZpZXcoZ2V0QWN0aXZpdHkoKSk7CisgICAgICAgICAgICBzY3JvbGxlci5hZGRWaWV3KG1UZXh0KTsKKyAgICAgICAgICAgIHNldFRleHQobURpc3BsYXllZFRleHQpOworICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGVyOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShkZXRhaWxzKQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RBcnJheS5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RBcnJheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWFmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGlzdEFycmF5LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5TaGFrZXNwZWFyZTsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RGcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIHVzaW5nIExpc3RGcmFnbWVudCB0byBzaG93IGEgbGlzdCBvZiBpdGVtcworICogZnJvbSBhIGNhbm5lZCBhcnJheS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50TGlzdEFycmF5IGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgbGlzdCBmcmFnbWVudCBhbmQgYWRkIGl0IGFzIG91ciBzb2xlIGNvbnRlbnQuCisgICAgICAgIGlmIChnZXRGcmFnbWVudE1hbmFnZXIoKS5maW5kRnJhZ21lbnRCeUlkKGFuZHJvaWQuUi5pZC5jb250ZW50KSA9PSBudWxsKSB7CisgICAgICAgICAgICBBcnJheUxpc3RGcmFnbWVudCBsaXN0ID0gbmV3IEFycmF5TGlzdEZyYWdtZW50KCk7CisgICAgICAgICAgICBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsIGxpc3QpLmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcnJheUxpc3RGcmFnbWVudCBleHRlbmRzIExpc3RGcmFnbWVudCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4oZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzEsIFNoYWtlc3BlYXJlLlRJVExFUykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uTGlzdEl0ZW1DbGljayhMaXN0VmlldyBsLCBWaWV3IHYsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgeworICAgICAgICAgICAgTG9nLmkoIkZyYWdtZW50TGlzdCIsICJJdGVtIGNsaWNrZWQ6ICIgKyBpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TGlzdEN1cnNvckxvYWRlci5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RDdXJzb3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk1NjkyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudExpc3RDdXJzb3JMb2FkZXIuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkxvYWRlck1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkN1cnNvckxvYWRlcjsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuTG9hZGVyOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db250YWN0czsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5pbnB1dG1ldGhvZC5JbnB1dE1ldGhvZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdEFkYXB0ZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2ltcGxlQ3Vyc29yQWRhcHRlcjsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIG1vcmUgY29tcGxleCB1c2UgaWYgYSBMaXN0RnJhZ21lbnQsIGluY2x1ZGluZyBzaG93aW5nCisgKiBhbiBlbXB0eSB2aWV3IGFuZCBsb2FkaW5nIHByb2dyZXNzLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRMaXN0Q3Vyc29yTG9hZGVyIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBsaXN0IGZyYWdtZW50IGFuZCBhZGQgaXQgYXMgb3VyIHNvbGUgY29udGVudC4KKyAgICAgICAgaWYgKGZpbmRGcmFnbWVudEJ5SWQoYW5kcm9pZC5SLmlkLmNvbnRlbnQpID09IG51bGwpIHsKKyAgICAgICAgICAgIEN1cnNvckxvYWRlckxpc3RGcmFnbWVudCBsaXN0ID0gbmV3IEN1cnNvckxvYWRlckxpc3RGcmFnbWVudCgpOworICAgICAgICAgICAgb3BlbkZyYWdtZW50VHJhbnNhY3Rpb24oKS5hZGQoYW5kcm9pZC5SLmlkLmNvbnRlbnQsIGxpc3QpLmNvbW1pdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXJzb3JMb2FkZXJMaXN0RnJhZ21lbnQgZXh0ZW5kcyBMaXN0RnJhZ21lbnQKKyAgICAgICAgICAgIGltcGxlbWVudHMgTG9hZGVyTWFuYWdlci5Mb2FkZXJDYWxsYmFja3M8Q3Vyc29yPiB7CisgICAgICAgIE1lbnVJdGVtIG1TZWFyY2hNZW51OworICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0ZXh0IHRvIGRpc3BsYXkgaWYgdGhlcmUgaXMgbm8gZGF0YS4gIEluIGEgcmVhbAorICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gdGhpcyB3b3VsZCBjb21lIGZyb20gYSByZXNvdXJjZS4KKyAgICAgICAgICAgIHNldEVtcHR5VGV4dCgiTm8gcGhvbmUgbnVtYmVycyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbWVudSBpdGVtIHRvIHNob3cgaW4gYWN0aW9uIGJhci4KKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBQcmVwYXJlIHRoZSBsb2FkZXIuICBFaXRoZXIgcmUtY29ubmVjdCB3aXRoIGFuIGV4aXN0aW5nIG9uZSwKKyAgICAgICAgICAgIC8vIG9yIHN0YXJ0IGEgbmV3IG9uZS4KKyAgICAgICAgICAgIGdldExvYWRlck1hbmFnZXIoKS5pbml0TG9hZGVyKDAsIG51bGwsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgICAgIG1TZWFyY2hNZW51ID0gbWVudS5hZGQoIlNlYXJjaCIpOworICAgICAgICAgICAgbVNlYXJjaE1lbnUuc2V0SWNvbihSLmRyYXdhYmxlLm1hZ25pZnlpbmdfZ2xhc3MpOworICAgICAgICAgICAgbVNlYXJjaE1lbnUuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0FMV0FZUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIGlmIChpdGVtID09IG1TZWFyY2hNZW51KSB7CisgICAgICAgICAgICAgICAgSW5wdXRNZXRob2RNYW5hZ2VyIGltbSA9IChJbnB1dE1ldGhvZE1hbmFnZXIpZ2V0QWN0aXZpdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgaW1tLnNob3dTb2Z0SW5wdXQoZ2V0QWN0aXZpdHkoKS5nZXRDdXJyZW50Rm9jdXMoKSwgMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5vbk9wdGlvbnNJdGVtU2VsZWN0ZWQoaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICBMb2cuaSgiRnJhZ21lbnRDb21wbGV4TGlzdCIsICJJdGVtIGNsaWNrZWQ6ICIgKyBpZCk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09OVEFDVFNfU1VNTUFSWV9QUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgIENvbnRhY3RzLl9JRCwKKyAgICAgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRSwKKyAgICAgICAgICAgIENvbnRhY3RzLkNPTlRBQ1RfU1RBVFVTLAorICAgICAgICAgICAgQ29udGFjdHMuQ09OVEFDVF9QUkVTRU5DRSwKKyAgICAgICAgICAgIENvbnRhY3RzLlBIT1RPX0lELAorICAgICAgICAgICAgQ29udGFjdHMuTE9PS1VQX0tFWSwKKyAgICAgICAgfTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExvYWRlcjxDdXJzb3I+IG9uQ3JlYXRlTG9hZGVyKGludCBpZCwgQnVuZGxlIGFyZ3MpIHsKKyAgICAgICAgICAgIFN0cmluZyBzZWxlY3QgPSAiKCgiICsgQ29udGFjdHMuRElTUExBWV9OQU1FICsgIiBOT1ROVUxMKSBBTkQgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBDb250YWN0cy5IQVNfUEhPTkVfTlVNQkVSICsgIj0xKSBBTkQgKCIKKyAgICAgICAgICAgICAgICAgICAgKyBDb250YWN0cy5ESVNQTEFZX05BTUUgKyAiICE9ICcnICkpIjsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yTG9hZGVyKGdldEFjdGl2aXR5KCksIENvbnRhY3RzLkNPTlRFTlRfVVJJLAorICAgICAgICAgICAgICAgICAgICBDT05UQUNUU19TVU1NQVJZX1BST0pFQ1RJT04sIHNlbGVjdCwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgQ29udGFjdHMuRElTUExBWV9OQU1FICsgIiBDT0xMQVRFIExPQ0FMSVpFRCBBU0MiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkxvYWRGaW5pc2hlZChMb2FkZXI8Q3Vyc29yPiBsb2FkZXIsIEN1cnNvciBkYXRhKSB7CisgICAgICAgICAgICBMaXN0QWRhcHRlciBhZGFwdGVyID0gbmV3IFNpbXBsZUN1cnNvckFkYXB0ZXIoZ2V0QWN0aXZpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtXzIsIGRhdGEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IENvbnRhY3RzLkRJU1BMQVlfTkFNRSwgQ29udGFjdHMuQ09OVEFDVF9TVEFUVVMgfSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxLCBhbmRyb2lkLlIuaWQudGV4dDIgfSk7CisgICAgICAgICAgICBzZXRMaXN0QWRhcHRlcihhZGFwdGVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRNZW51LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TWVudS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzIyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50TWVudS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51OworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SW5mbGF0ZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJdGVtOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja0JveDsKKworLyoqCisgKiBEZW1vbnN0cmF0ZXMgaG93IGZyYWdtZW50cyBjYW4gcGFydGljaXBhdGUgaW4gdGhlIG9wdGlvbnMgbWVudS4KKyAqLworcHVibGljIGNsYXNzIEZyYWdtZW50TWVudSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBGcmFnbWVudCBtRnJhZ21lbnQxOworICAgIEZyYWdtZW50IG1GcmFnbWVudDI7CisgICAgQ2hlY2tCb3ggbUNoZWNrQm94MTsKKyAgICBDaGVja0JveCBtQ2hlY2tCb3gyOworCisgICAgLy8gVXBkYXRlIGZyYWdtZW50IHZpc2liaWxpdHkgd2hlbiBjaGVjayBib3hlcyBhcmUgY2hhbmdlZC4KKyAgICBmaW5hbCBPbkNsaWNrTGlzdGVuZXIgbUNsaWNrTGlzdGVuZXIgPSBuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9tZW51KTsKKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdHdvIG1lbnUgZnJhZ21lbnRzIGFyZSBjcmVhdGVkLgorICAgICAgICBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRGcmFnbWVudE1hbmFnZXIoKTsKKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGZtLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBtRnJhZ21lbnQxID0gZm0uZmluZEZyYWdtZW50QnlUYWcoImYxIik7CisgICAgICAgIGlmIChtRnJhZ21lbnQxID09IG51bGwpIHsKKyAgICAgICAgICAgIG1GcmFnbWVudDEgPSBuZXcgTWVudUZyYWdtZW50KCk7CisgICAgICAgICAgICBmdC5hZGQobUZyYWdtZW50MSwgImYxIik7CisgICAgICAgIH0KKyAgICAgICAgbUZyYWdtZW50MiA9IGZtLmZpbmRGcmFnbWVudEJ5VGFnKCJmMiIpOworICAgICAgICBpZiAobUZyYWdtZW50MiA9PSBudWxsKSB7CisgICAgICAgICAgICBtRnJhZ21lbnQyID0gbmV3IE1lbnUyRnJhZ21lbnQoKTsKKyAgICAgICAgICAgIGZ0LmFkZChtRnJhZ21lbnQyLCAiZjIiKTsKKyAgICAgICAgfQorICAgICAgICBmdC5jb21taXQoKTsKKyAgICAgICAgCisgICAgICAgIC8vIFdhdGNoIGNoZWNrIGJveCBjbGlja3MuCisgICAgICAgIG1DaGVja0JveDEgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTEpOworICAgICAgICBtQ2hlY2tCb3gxLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIG1DaGVja0JveDIgPSAoQ2hlY2tCb3gpZmluZFZpZXdCeUlkKFIuaWQubWVudTIpOworICAgICAgICBtQ2hlY2tCb3gyLnNldE9uQ2xpY2tMaXN0ZW5lcihtQ2xpY2tMaXN0ZW5lcik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgZnJhZ21lbnRzIHN0YXJ0IG91dCB3aXRoIGNvcnJlY3QgdmlzaWJpbGl0eS4KKyAgICAgICAgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25SZXN0b3JlSW5zdGFuY2VTdGF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIGZyYWdtZW50cyBhcmUgdXBkYXRlZCBhZnRlciBjaGVjayBib3ggdmlldyBzdGF0ZSBpcyByZXN0b3JlZC4KKyAgICAgICAgdXBkYXRlRnJhZ21lbnRWaXNpYmlsaXR5KCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIGZyYWdtZW50IHZpc2liaWxpdHkgYmFzZWQgb24gY3VycmVudCBjaGVjayBib3ggc3RhdGUuCisgICAgdm9pZCB1cGRhdGVGcmFnbWVudFZpc2liaWxpdHkoKSB7CisgICAgICAgIEZyYWdtZW50VHJhbnNhY3Rpb24gZnQgPSBnZXRGcmFnbWVudE1hbmFnZXIoKS5vcGVuVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgaWYgKG1DaGVja0JveDEuaXNDaGVja2VkKCkpIGZ0LnNob3cobUZyYWdtZW50MSk7CisgICAgICAgIGVsc2UgZnQuaGlkZShtRnJhZ21lbnQxKTsKKyAgICAgICAgaWYgKG1DaGVja0JveDIuaXNDaGVja2VkKCkpIGZ0LnNob3cobUZyYWdtZW50Mik7CisgICAgICAgIGVsc2UgZnQuaGlkZShtRnJhZ21lbnQyKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmcmFnbWVudCB0aGF0IGRpc3BsYXlzIGEgbWVudS4gIFRoaXMgZnJhZ21lbnQgaGFwcGVucyB0byBub3QKKyAgICAgKiBoYXZlIGEgVUkgKGl0IGRvZXMgbm90IGltcGxlbWVudCBvbkNyZWF0ZVZpZXcpLCBidXQgaXQgY291bGQgYWxzbworICAgICAqIGhhdmUgb25lIGlmIGl0IHdhbnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lbnVGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIHNldEhhc09wdGlvbnNNZW51KHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51LCBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIpIHsKKyAgICAgICAgICAgIG1lbnUuYWRkKCJNZW51IDFhIikuc2V0U2hvd0FzQWN0aW9uKE1lbnVJdGVtLlNIT1dfQVNfQUNUSU9OX0lGX1JPT00pOworICAgICAgICAgICAgbWVudS5hZGQoIk1lbnUgMWIiKS5zZXRTaG93QXNBY3Rpb24oTWVudUl0ZW0uU0hPV19BU19BQ1RJT05fSUZfUk9PTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWNvbmQgZnJhZ21lbnQgd2l0aCBhIG1lbnUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZW51MkZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgc2V0SGFzT3B0aW9uc01lbnUodHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUsIE1lbnVJbmZsYXRlciBpbmZsYXRlcikgeworICAgICAgICAgICAgbWVudS5hZGQoIk1lbnUgMiIpLnNldFNob3dBc0FjdGlvbihNZW51SXRlbS5TSE9XX0FTX0FDVElPTl9JRl9ST09NKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRSZWNlaXZlUmVzdWx0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmVjZWl2ZVJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZWY2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmVjZWl2ZVJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50VHJhbnNhY3Rpb247CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnRleHQuRWRpdGFibGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5GcmFtZUxheW91dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworcHVibGljIGNsYXNzIEZyYWdtZW50UmVjZWl2ZVJlc3VsdCBleHRlbmRzIEFjdGl2aXR5IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgRnJhbWVMYXlvdXQuTGF5b3V0UGFyYW1zIGxwID0gbmV3IEZyYW1lTGF5b3V0LkxheW91dFBhcmFtcygKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKKyAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7CisgICAgICAgIEZyYW1lTGF5b3V0IGZyYW1lID0gbmV3IEZyYW1lTGF5b3V0KHRoaXMpOworICAgICAgICBmcmFtZS5zZXRJZChSLmlkLnNpbXBsZV9mcmFnbWVudCk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KGZyYW1lLCBscCk7CisgICAgICAgIAorICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIERvIGZpcnN0IHRpbWUgaW5pdGlhbGl6YXRpb24gLS0gYWRkIGZyYWdtZW50LiAKKyAgICAgICAgICAgIEZyYWdtZW50IG5ld0ZyYWdtZW50ID0gbmV3IFJlY2VpdmVSZXN1bHRGcmFnbWVudCgpOworICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZnQuYWRkKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCkuY29tbWl0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlY2VpdmVSZXN1bHRGcmFnbWVudCBleHRlbmRzIEZyYWdtZW50IHsKKyAgICAgICAgLy8gRGVmaW5pdGlvbiBvZiB0aGUgb25lIHJlcXVlc3RDb2RlIHdlIHVzZSBmb3IgcmVjZWl2aW5nIHJlc3Vscy4KKyAgICAgICAgc3RhdGljIGZpbmFsIHByaXZhdGUgaW50IEdFVF9DT0RFID0gMDsKKworICAgICAgICBwcml2YXRlIFRleHRWaWV3IG1SZXN1bHRzOworCisgICAgICAgIHByaXZhdGUgT25DbGlja0xpc3RlbmVyIG1HZXRMaXN0ZW5lciA9IG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhY3Rpdml0eSB3aG9zZSByZXN1bHQgd2Ugd2FudCB0byByZXRyaWV2ZS4gIFRoZQorICAgICAgICAgICAgICAgIC8vIHJlc3VsdCB3aWxsIGNvbWUgYmFjayB3aXRoIHJlcXVlc3QgY29kZSBHRVRfQ09ERS4KKyAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChnZXRBY3Rpdml0eSgpLCBTZW5kUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGludGVudCwgR0VUX0NPREUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5yZWNlaXZlX3Jlc3VsdCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBUZXh0VmlldyB3aWRnZXQgdGhhdCB3aWxsIGRpc3BsYXkgcmVzdWx0cy4KKyAgICAgICAgICAgIG1SZXN1bHRzID0gKFRleHRWaWV3KXYuZmluZFZpZXdCeUlkKFIuaWQucmVzdWx0cyk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHVzIHRvIGxhdGVyIGV4dGVuZCB0aGUgdGV4dCBidWZmZXIuCisgICAgICAgICAgICBtUmVzdWx0cy5zZXRUZXh0KG1SZXN1bHRzLmdldFRleHQoKSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5FRElUQUJMRSk7CisKKyAgICAgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICAgICAgQnV0dG9uIGdldEJ1dHRvbiA9IChCdXR0b24pdi5maW5kVmlld0J5SWQoUi5pZC5nZXQpOworICAgICAgICAgICAgZ2V0QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtR2V0TGlzdGVuZXIpOworICAgICAgICAgICAgCisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgc2VuZGluZyBhY3Rpdml0eSBoYXMgZmluaXNoZWQsIHdpdGggdGhlCisgICAgICAgICAqIHJlc3VsdCBpdCBzdXBwbGllZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CisgICAgICAgICAgICAvLyBZb3UgY2FuIHVzZSB0aGUgcmVxdWVzdENvZGUgdG8gc2VsZWN0IGJldHdlZW4gbXVsdGlwbGUgY2hpbGQKKyAgICAgICAgICAgIC8vIGFjdGl2aXRpZXMgeW91IG1heSBoYXZlIHN0YXJ0ZWQuICBIZXJlIHRoZXJlIGlzIG9ubHkgb25lIHRoaW5nCisgICAgICAgICAgICAvLyB3ZSBsYXVuY2guCisgICAgICAgICAgICBpZiAocmVxdWVzdENvZGUgPT0gR0VUX0NPREUpIHsKKworICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgYmUgYWRkaW5nIHRvIG91ciB0ZXh0LgorICAgICAgICAgICAgICAgIEVkaXRhYmxlIHRleHQgPSAoRWRpdGFibGUpbVJlc3VsdHMuZ2V0VGV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YW5kYXJkIHJlc3VsdENvZGUgdGhhdCBpcyBzZW50IGJhY2sgaWYgdGhlCisgICAgICAgICAgICAgICAgLy8gYWN0aXZpdHkgZG9lc24ndCBzdXBwbHkgYW4gZXhwbGljaXQgcmVzdWx0LiAgSXQgd2lsbCBhbHNvCisgICAgICAgICAgICAgICAgLy8gYmUgcmV0dXJuZWQgaWYgdGhlIGFjdGl2aXR5IGZhaWxlZCB0byBsYXVuY2guCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdENvZGUgPT0gUkVTVUxUX0NBTkNFTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIoY2FuY2VsbGVkKSIpOworCisgICAgICAgICAgICAgICAgLy8gT3VyIHByb3RvY29sIHdpdGggdGhlIHNlbmRpbmcgYWN0aXZpdHkgaXMgdGhhdCBpdCB3aWxsIHNlbmQKKyAgICAgICAgICAgICAgICAvLyB0ZXh0IGluICdkYXRhJyBhcyBpdHMgcmVzdWx0LgorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIob2theSAiKTsKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhyZXN1bHRDb2RlKSk7CisgICAgICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCIpICIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LmFwcGVuZChkYXRhLmdldEFjdGlvbigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRleHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0ZyYWdtZW50UmV0YWluSW5zdGFuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTUyMzcwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFJldGFpbkluc3RhbmNlLmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5PbkNsaWNrTGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgeW91IGNhbiB1c2UgYSBGcmFnbWVudCB0byBlYXNpbHkgcHJvcGFnYXRlIHN0YXRlCisgKiAoc3VjaCBhcyB0aHJlYWRzKSBhY3Jvc3MgYWN0aXZpdHkgaW5zdGFuY2VzIHdoZW4gYW4gYWN0aXZpdHkgbmVlZHMgdG8gYmUKKyAqIHJlc3RhcnRlZCBkdWUgdG8sIGZvciBleGFtcGxlLCBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLiAgVGhpcyBpcyBhIGxvdAorICogZWFzaWVyIHRoYW4gdXNpbmcgdGhlIHJhdyBBY3Rpdml0eS5vblJldGFpbk5vbkNvbmZpZ3VyYXRpbkluc3RhbmNlKCkgQVBJLgorICovCitwdWJsaWMgY2xhc3MgRnJhZ21lbnRSZXRhaW5JbnN0YW5jZSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICBSZXRhaW5lZEZyYWdtZW50IG1SZXRhaW5lZEZyYWdtZW50OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5mcmFnbWVudF9yZXRhaW5faW5zdGFuY2UpOworCisgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5yZXN0YXJ0KTsKKyAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgICAgICBtUmV0YWluZWRGcmFnbWVudC5yZXN0YXJ0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEZyYWdtZW50TWFuYWdlcigpOworICAgICAgICAKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHJldGFpbmVkIHRoZSBmcmFnbWVudC4KKyAgICAgICAgbVJldGFpbmVkRnJhZ21lbnQgPSAoUmV0YWluZWRGcmFnbWVudClmbS5maW5kRnJhZ21lbnRCeVRhZygicmV0YWluZWQiKTsKKworICAgICAgICAvLyBJZiBub3QgcmV0YWluZWQgKG9yIGZpcnN0IHRpbWUgcnVubmluZyksIHdlIG5lZWQgdG8gcmUtY3JlYXRlIGl0LgorICAgICAgICBpZiAobVJldGFpbmVkRnJhZ21lbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgbVJldGFpbmVkRnJhZ21lbnQgPSBuZXcgUmV0YWluZWRGcmFnbWVudCgpOworICAgICAgICAgICAgZm0ub3BlblRyYW5zYWN0aW9uKCkuYWRkKG1SZXRhaW5lZEZyYWdtZW50LCAicmV0YWluZWQiKS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIEZyYWdtZW50IGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBiZSByZXRhaW5lZCBhY3Jvc3MKKyAgICAgKiBhY3Rpdml0eSBpbnN0YW5jZXMuICBJdCByZXByZXNlbnRzIHNvbWUgb25nb2luZyB3b3JrLCBoZXJlIGEgdGhyZWFkCisgICAgICogd2UgaGF2ZSB0aGF0IHNpdHMgYXJvdW5kIGluY3JlbWVudGluZyBhIHByb2dyZXNzIGluZGljYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJldGFpbmVkRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIFByb2dyZXNzQmFyIG1Qcm9ncmVzc0JhcjsKKyAgICAgICAgaW50IG1Qb3NpdGlvbjsKKyAgICAgICAgYm9vbGVhbiBtUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBtUXVpdGluZyA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSB0aHJlYWQgdGhhdCB3aWxsIGRvIG91ciB3b3JrLiAgSXQgc2l0cyBpbiBhIGxvb3AgcnVubmluZworICAgICAgICAgKiB0aGUgcHJvZ3Jlc3MgdXAgdW50aWwgaXQgaGFzIHJlYWNoZWQgdGhlIHRvcCwgdGhlbiBzdG9wcyBhbmQgd2FpdHMuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBUaHJlYWQgbVRocmVhZCA9IG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBmaWd1cmUgdGhlIHJlYWwgdmFsdWUgb3V0IGxhdGVyLgorICAgICAgICAgICAgICAgIGludCBtYXggPSAxMDAwMDsKKworICAgICAgICAgICAgICAgIC8vIFRoaXMgdGhyZWFkIHJ1bnMgYWxtb3N0IGZvcmV2ZXIuCisgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgb3VyIHNoYXJlZCBzdGF0ZSB3aXRoIHRoZSBVSS4KKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBPdXIgdGhyZWFkIGlzIHN0b3BwZWQgaWYgdGhlIFVJIGlzIG5vdCByZWFkeQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgaXQgaGFzIGNvbXBsZXRlZCBpdHMgd29yay4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICghbVJlYWR5IHx8IG1Qb3NpdGlvbiA+PSBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVF1aXRpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm93IHVwZGF0ZSB0aGUgcHJvZ3Jlc3MuICBOb3RlIGl0IGlzIGltcG9ydGFudCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB0b3VjaCB0aGUgcHJvZ3Jlc3MgYmFyIHdpdGggdGhlIGxvY2sgaGVsZCwgc28gaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3QgZGlzYXBwZWFyIG9uIHVzLgorICAgICAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uKys7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBtUHJvZ3Jlc3NCYXIuZ2V0TWF4KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIuc2V0UHJvZ3Jlc3MobVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbGx5IHdlIHdvdWxkIGJlIGRvaW5nIHNvbWUgd29yaywgYnV0IHB1dCBhIGtsdWRnZQorICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIHByZXRlbmQgbGlrZSB3ZSBhcmUuCisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KDUwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRnJhZ21lbnQgaW5pdGlhbGl6YXRpb24uICBXZSB3YXkgd2Ugd2FudCB0byBiZSByZXRhaW5lZCBhbmQKKyAgICAgICAgICogc3RhcnQgb3VyIHRocmVhZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBUZWxsIHRoZSBmcmFtZXdvcmsgdG8gdHJ5IHRvIGtlZXAgdGhpcyBmcmFnbWVudCBhcm91bmQKKyAgICAgICAgICAgIC8vIGR1cmluZyBhIGNvbmZpZ3VyYXRpb24gY2hhbmdlLgorICAgICAgICAgICAgc2V0UmV0YWluSW5zdGFuY2UodHJ1ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFN0YXJ0IHVwIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgICAgICAgICAgbVRocmVhZC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIEZyYWdtZW50J3MgQWN0aXZpdHkgaXMgcmVhZHkgdG8gZ28sIGFmdGVyCisgICAgICAgICAqIGl0cyBjb250ZW50IHZpZXcgaGFzIGJlZW4gaW5zdGFsbGVkOyBpdCBpcyBjYWxsZWQgYm90aCBhZnRlcgorICAgICAgICAgKiB0aGUgaW5pdGlhbCBmcmFnbWVudCBjcmVhdGlvbiBhbmQgYWZ0ZXIgdGhlIGZyYWdtZW50IGlzIHJlLWF0dGFjaGVkCisgICAgICAgICAqIHRvIGEgbmV3IGFjdGl2aXR5LgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZpdHlDcmVhdGVkKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlDcmVhdGVkKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJldHJpZXZlIHRoZSBwcm9ncmVzcyBiYXIgZnJvbSB0aGUgY3VycmVudCBhY3Rpdml0eS4KKyAgICAgICAgICAgIG1Qcm9ncmVzc0JhciA9IChQcm9ncmVzc0JhcilnZXRBY3Rpdml0eSgpLmZpbmRWaWV3QnlJZCgKKyAgICAgICAgICAgICAgICAgICAgUi5pZC5wcm9ncmVzc19ob3Jpem9udGFsKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gV2UgYXJlIHJlYWR5IGZvciBvdXIgdGhyZWFkIHRvIGdvLgorICAgICAgICAgICAgc3luY2hyb25pemVkIChtVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtVGhyZWFkLm5vdGlmeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGZyYWdtZW50IGlzIGdvaW5nIGF3YXkuICBJdCBpcyBOT1QgY2FsbGVkCisgICAgICAgICAqIHdoZW4gdGhlIGZyYWdtZW50IGlzIGJlaW5nIHByb3BhZ2F0ZWQgYmV0d2VlbiBhY3Rpdml0eSBpbnN0YW5jZXMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICAgICAgLy8gTWFrZSB0aGUgdGhyZWFkIGdvIGF3YXkuCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtUXVpdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbVRocmVhZC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBkZXRhY2hlZCBmcm9tIGl0cworICAgICAgICAgKiBjdXJyZW50IGFjdGl2aXR5IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoKCkgeworICAgICAgICAgICAgLy8gVGhpcyBmcmFnbWVudCBpcyBiZWluZyBkZXRhY2hlZCBmcm9tIGl0cyBhY3Rpdml0eS4gIFdlIG5lZWQKKyAgICAgICAgICAgIC8vIHRvIG1ha2Ugc3VyZSBpdHMgdGhyZWFkIGlzIG5vdCBnb2luZyB0byB0b3VjaCBhbnkgYWN0aXZpdHkKKyAgICAgICAgICAgIC8vIHN0YXRlIGFmdGVyIHJldHVybmluZyBmcm9tIHRoaXMgZnVuY3Rpb24uCisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1UaHJlYWQpIHsKKyAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCYXIgPSBudWxsOworICAgICAgICAgICAgICAgIG1SZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1UaHJlYWQubm90aWZ5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHN1cGVyLm9uRGV0YWNoKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQVBJIGZvciBvdXIgVUkgdG8gcmVzdGFydCB0aGUgcHJvZ3Jlc3MgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVzdGFydCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVRocmVhZCkgeworICAgICAgICAgICAgICAgIG1Qb3NpdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgbVRocmVhZC5ub3RpZnkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9GcmFnbWVudFN0YWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFhOWExMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRnJhZ21lbnRTdGFjay5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudDsKK2ltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudFRyYW5zYWN0aW9uOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CisKK3B1YmxpYyBjbGFzcyBGcmFnbWVudFN0YWNrIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIGludCBtU3RhY2tMZXZlbCA9IDE7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmZyYWdtZW50X3N0YWNrKTsKKyAgICAgICAgCisgICAgICAgIC8vIFdhdGNoIGZvciBidXR0b24gY2xpY2tzLgorICAgICAgICBCdXR0b24gYnV0dG9uID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5uZXdfZnJhZ21lbnQpOworICAgICAgICBidXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgeworICAgICAgICAgICAgICAgIGFkZEZyYWdtZW50VG9TdGFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBpZiAoc2F2ZWRJbnN0YW5jZVN0YXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIERvIGZpcnN0IHRpbWUgaW5pdGlhbGl6YXRpb24gLS0gYWRkIGluaXRpYWwgZnJhZ21lbnQuCisgICAgICAgICAgICBGcmFnbWVudCBuZXdGcmFnbWVudCA9IENvdW50aW5nRnJhZ21lbnQubmV3SW5zdGFuY2UobVN0YWNrTGV2ZWwpOworICAgICAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgZnQuYWRkKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCkuY29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU3RhY2tMZXZlbCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRJbnQoImxldmVsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNhdmVJbnN0YW5jZVN0YXRlKEJ1bmRsZSBvdXRTdGF0ZSkgeworICAgICAgICBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKG91dFN0YXRlKTsKKyAgICAgICAgb3V0U3RhdGUucHV0SW50KCJsZXZlbCIsIG1TdGFja0xldmVsKTsKKyAgICB9CisKKy8vQkVHSU5fSU5DTFVERShhZGRfc3RhY2spCisgICAgdm9pZCBhZGRGcmFnbWVudFRvU3RhY2soKSB7CisgICAgICAgIG1TdGFja0xldmVsKys7CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgYSBuZXcgZnJhZ21lbnQuCisgICAgICAgIEZyYWdtZW50IG5ld0ZyYWdtZW50ID0gQ291bnRpbmdGcmFnbWVudC5uZXdJbnN0YW5jZShtU3RhY2tMZXZlbCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBmcmFnbWVudCB0byB0aGUgYWN0aXZpdHksIHB1c2hpbmcgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICAvLyBvbiB0byB0aGUgYmFjayBzdGFjay4KKyAgICAgICAgRnJhZ21lbnRUcmFuc2FjdGlvbiBmdCA9IGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpOworICAgICAgICBmdC5yZXBsYWNlKFIuaWQuc2ltcGxlX2ZyYWdtZW50LCBuZXdGcmFnbWVudCk7CisgICAgICAgIGZ0LnNldFRyYW5zaXRpb24oRnJhZ21lbnRUcmFuc2FjdGlvbi5UUkFOU0lUX0ZSQUdNRU5UX09QRU4pOworICAgICAgICBmdC5hZGRUb0JhY2tTdGFjayhudWxsKTsKKyAgICAgICAgZnQuY29tbWl0KCk7CisgICAgfQorLy9FTkRfSU5DTFVERShhZGRfc3RhY2spCisKKy8vQkVHSU5fSU5DTFVERShmcmFnbWVudCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50aW5nRnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7CisgICAgICAgIGludCBtTnVtOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgQ291bnRpbmdGcmFnbWVudCwgcHJvdmlkaW5nICJudW0iCisgICAgICAgICAqIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIENvdW50aW5nRnJhZ21lbnQgbmV3SW5zdGFuY2UoaW50IG51bSkgeworICAgICAgICAgICAgQ291bnRpbmdGcmFnbWVudCBmID0gbmV3IENvdW50aW5nRnJhZ21lbnQoKTsKKworICAgICAgICAgICAgLy8gU3VwcGx5IG51bSBpbnB1dCBhcyBhbiBhcmd1bWVudC4KKyAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOworICAgICAgICAgICAgYXJncy5wdXRJbnQoIm51bSIsIG51bSk7CisgICAgICAgICAgICBmLnNldEFyZ3VtZW50cyhhcmdzKTsKKworICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2hlbiBjcmVhdGluZywgcmV0cmlldmUgdGhpcyBpbnN0YW5jZSdzIG51bWJlciBmcm9tIGl0cyBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgICAgIG1OdW0gPSBnZXRBcmd1bWVudHMoKS5nZXRJbnQoIm51bSIpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBGcmFnbWVudCdzIFVJIGlzIGp1c3QgYSBzaW1wbGUgdGV4dCB2aWV3IHNob3dpbmcgaXRzCisgICAgICAgICAqIGluc3RhbmNlIG51bWJlci4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoTGF5b3V0SW5mbGF0ZXIgaW5mbGF0ZXIsIFZpZXdHcm91cCBjb250YWluZXIsCisgICAgICAgICAgICAgICAgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgVmlldyB2ID0gaW5mbGF0ZXIuaW5mbGF0ZShSLmxheW91dC5oZWxsb193b3JsZCwgY29udGFpbmVyLCBmYWxzZSk7CisgICAgICAgICAgICBWaWV3IHR2ID0gdi5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpdHYpLnNldFRleHQoIkZyYWdtZW50ICMiICsgbU51bSk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZnJhZ21lbnQpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9DbGlwYm9hcmRTYW1wbGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L0NsaXBib2FyZFNhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYTA2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9DbGlwYm9hcmRTYW1wbGUuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuY29udGVudDsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5TcGlubmVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbVNlbGVjdGVkTGlzdGVuZXI7CisKK3B1YmxpYyBjbGFzcyBDbGlwYm9hcmRTYW1wbGUgZXh0ZW5kcyBBY3Rpdml0eSB7CisgICAgQ2xpcGJvYXJkTWFuYWdlciBtQ2xpcGJvYXJkOworCisgICAgU3Bpbm5lciBtU3Bpbm5lcjsKKyAgICBFZGl0VGV4dCBtRWRpdFRleHQ7CisKKyAgICBDaGFyU2VxdWVuY2UgbVN0eWxlZFRleHQ7CisgICAgU3RyaW5nIG1QbGFpblRleHQ7CisKKyAgICBDbGlwYm9hcmRNYW5hZ2VyLk9uUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIgbVByaW1hcnlDaGFuZ2VMaXN0ZW5lcgorICAgICAgICAgICAgPSBuZXcgQ2xpcGJvYXJkTWFuYWdlci5PblByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25QcmltYXJ5Q2xpcENoYW5nZWQoKSB7CisgICAgICAgICAgICB1cGRhdGVDbGlwRGF0YSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBtQ2xpcGJvYXJkID0gKENsaXBib2FyZE1hbmFnZXIpZ2V0U3lzdGVtU2VydmljZShDTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgLy8gU2VlIHJlcy9hbnkvbGF5b3V0L3Jlc291cmNlcy54bWwgZm9yIHRoaXMgdmlldyBsYXlvdXQgZGVmaW5pdGlvbi4KKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY2xpcGJvYXJkKTsKKworICAgICAgICBUZXh0VmlldyB0djsKKworICAgICAgICBtU3R5bGVkVGV4dCA9IGdldFRleHQoUi5zdHJpbmcuc3R5bGVkX3RleHQpOworICAgICAgICB0diA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdHlsZWRfdGV4dCk7CisgICAgICAgIHR2LnNldFRleHQobVN0eWxlZFRleHQpOworCisgICAgICAgIG1QbGFpblRleHQgPSBtU3R5bGVkVGV4dC50b1N0cmluZygpOworICAgICAgICB0diA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5wbGFpbl90ZXh0KTsKKyAgICAgICAgdHYuc2V0VGV4dChtUGxhaW5UZXh0KTsKKworICAgICAgICBtU3Bpbm5lciA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5jbGlwX3R5cGUpOworICAgICAgICBBcnJheUFkYXB0ZXI8Q2hhclNlcXVlbmNlPiBhZGFwdGVyID0gQXJyYXlBZGFwdGVyLmNyZWF0ZUZyb21SZXNvdXJjZSgKKyAgICAgICAgICAgICAgICB0aGlzLCBSLmFycmF5LmNsaXBfZGF0YV90eXBlcywgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfc3Bpbm5lcl9pdGVtKTsKKyAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOworICAgICAgICBtU3Bpbm5lci5zZXRBZGFwdGVyKGFkYXB0ZXIpOworICAgICAgICBtU3Bpbm5lci5zZXRPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKAorICAgICAgICAgICAgICAgIG5ldyBPbkl0ZW1TZWxlY3RlZExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1TZWxlY3RlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Ob3RoaW5nU2VsZWN0ZWQoQWRhcHRlclZpZXc8Pz4gcGFyZW50KSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtRWRpdFRleHQgPSAoRWRpdFRleHQpZmluZFZpZXdCeUlkKFIuaWQuY2xpcF90ZXh0KTsKKworICAgICAgICBtQ2xpcGJvYXJkLmFkZFByaW1hcnlDbGlwQ2hhbmdlZExpc3RlbmVyKG1QcmltYXJ5Q2hhbmdlTGlzdGVuZXIpOworICAgICAgICB1cGRhdGVDbGlwRGF0YSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uRGVzdHJveSgpIHsKKyAgICAgICAgc3VwZXIub25EZXN0cm95KCk7CisgICAgICAgIG1DbGlwYm9hcmQucmVtb3ZlUHJpbWFyeUNsaXBDaGFuZ2VkTGlzdGVuZXIobVByaW1hcnlDaGFuZ2VMaXN0ZW5lcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFzdGVTdHlsZWRUZXh0KFZpZXcgYnV0dG9uKSB7CisgICAgICAgIG1DbGlwYm9hcmQuc2V0UHJpbWFyeUNsaXAobmV3IENsaXBwZWREYXRhKCJTdHlsZWQgVGV4dCIsIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IENsaXBwZWREYXRhLkl0ZW0obVN0eWxlZFRleHQpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFzdGVQbGFpblRleHQoVmlldyBidXR0b24pIHsKKyAgICAgICAgbUNsaXBib2FyZC5zZXRQcmltYXJ5Q2xpcChuZXcgQ2xpcHBlZERhdGEoIlBsYWluIFRleHQiLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBDbGlwcGVkRGF0YS5JdGVtKG1QbGFpblRleHQpKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcGFzdGVJbnRlbnQoVmlldyBidXR0b24pIHsKKyAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9WSUVXLCBVcmkucGFyc2UoImh0dHA6Ly93d3cuYW5kcm9pZC5jb20vIikpOworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKG5ldyBDbGlwcGVkRGF0YSgiVmlldyBpbnRlbnQiLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBDbGlwcGVkRGF0YS5JdGVtKGludGVudCkpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBwYXN0ZVVyaShWaWV3IGJ1dHRvbikgeworICAgICAgICBtQ2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKG5ldyBDbGlwcGVkRGF0YSgiVmlldyBpbnRlbnQiLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBDbGlwcGVkRGF0YS5JdGVtKFVyaS5wYXJzZSgiaHR0cDovL3d3dy5hbmRyb2lkLmNvbS8iKSkpKTsKKyAgICB9CisKKyAgICB2b2lkIHVwZGF0ZUNsaXBEYXRhKCkgeworICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gbUNsaXBib2FyZC5nZXRQcmltYXJ5Q2xpcCgpOworICAgICAgICBpZiAoY2xpcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtU3Bpbm5lci5zZXRTZWxlY3Rpb24oMCk7CisgICAgICAgICAgICBtRWRpdFRleHQuc2V0VGV4dCgiIik7CisgICAgICAgIH0gZWxzZSBpZiAoY2xpcC5nZXRJdGVtKDApLmdldFRleHQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtU3Bpbm5lci5zZXRTZWxlY3Rpb24oMSk7CisgICAgICAgICAgICBtRWRpdFRleHQuc2V0VGV4dChjbGlwLmdldEl0ZW0oMCkuZ2V0VGV4dCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGlwLmdldEl0ZW0oMCkuZ2V0SW50ZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDIpOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoY2xpcC5nZXRJdGVtKDApLmdldEludGVudCgpLnRvVXJpKDApKTsKKyAgICAgICAgfSBlbHNlIGlmIChjbGlwLmdldEl0ZW0oMCkuZ2V0VXJpKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDMpOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoY2xpcC5nZXRJdGVtKDApLmdldFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNwaW5uZXIuc2V0U2VsZWN0aW9uKDApOworICAgICAgICAgICAgbUVkaXRUZXh0LnNldFRleHQoIkNsaXAgY29udGFpbmluZyBubyBkYXRhIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvY29udGVudC9SZXNvdXJjZXNTYW1wbGUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L1Jlc291cmNlc1NhbXBsZS5qYXZhCmluZGV4IGYzOGJlMGYuLmQ0NmE4NTEgMTAwNzU1Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L1Jlc291cmNlc1NhbXBsZS5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9jb250ZW50L1Jlc291cmNlc1NhbXBsZS5qYXZhCkBAIC0zOCwxMSArMzgsOSBAQAogICogQHNlZSBTdHlsZWRUZXh0IGZvciBtb3JlIGRlcHRoIGFib3V0IHVzaW5nIHN0eWxlZCB0ZXh0LCBib3RoIHdpdGggZ2V0U3RyaW5nKCkKICAqICAgICAgICAgICAgICAgICBhbmQgaW4gdGhlIGxheW91dCB4bWwgZmlsZXMuCiAgKi8KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZXNTYW1wbGUgZXh0ZW5kcyBBY3Rpdml0eQoteworcHVibGljIGNsYXNzIFJlc291cmNlc1NhbXBsZSBleHRlbmRzIEFjdGl2aXR5IHsKICAgICBAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKQotICAgIHsKKwlwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKICAgICAgICAgLy8gU2VlIHJlcy9hbnkvbGF5b3V0L3Jlc291cmNlcy54bWwgZm9yIHRoaXMgdmlldyBsYXlvdXQgZGVmaW5pdGlvbi4KQEAgLTU0LDggKzUyLDggQEAKIAogICAgICAgICAvLyA9PT09PT0gVXNpbmcgdGhlIENvbnRleHQuZ2V0U3RyaW5nKCkgY29udmVuaWVuY2UgbWV0aG9kID09PT09PT09PT09CiAKLSAgICAgICAgLy8gVXNpbmcgdGhlIGdldFN0cmluZygpIGNvbmV2ZW5pZW5jZSBtZXRob2QsIHJldHJpZXZlIGEgc3RyaW5nCi0gICAgICAgIC8vIHJlc291cmNlIHRoYXQgaGFwZXBucyB0byBoYXZlIHN0eWxlIGluZm9ybWF0aW9uLiAgTm90ZSB0aGUgdXNlIG9mCisgICAgICAgIC8vIFVzaW5nIHRoZSBnZXRTdHJpbmcoKSBjb252ZW5pZW5jZSBtZXRob2QsIHJldHJpZXZlIGEgc3RyaW5nCisgICAgICAgIC8vIHJlc291cmNlIHRoYXQgaGFwcGVucyB0byBoYXZlIHN0eWxlIGluZm9ybWF0aW9uLiAgTm90ZSB0aGUgdXNlIG9mCiAgICAgICAgIC8vIENoYXJTZXF1ZW5jZSBpbnN0ZWFkIG9mIFN0cmluZyBzbyB3ZSBkb24ndCBsb3NlIHRoZSBzdHlsZSBpbmZvLgogICAgICAgICBjcyA9IGdldFRleHQoUi5zdHJpbmcuc3R5bGVkX3RleHQpOwogICAgICAgICB0diA9IChUZXh0VmlldylmaW5kVmlld0J5SWQoUi5pZC5zdHlsZWRfdGV4dCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQpyZW5hbWUgdG8gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvQWR2YW5jZWRQcmVmZXJlbmNlcy5qYXZhCmluZGV4IDJkYmJjNDUuLjAzMjhiMDMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvQWR2YW5jZWRQcmVmZXJlbmNlcy5qYXZhCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0FkdmFuY2VkUHJlZmVyZW5jZXMuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKIAogaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwogCkBAIC0zNSw3ICszNSw3IEBACiAKICAgICBwcml2YXRlIENoZWNrQm94UHJlZmVyZW5jZSBtQ2hlY2tCb3hQcmVmZXJlbmNlOwogICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0gICAgCisKICAgICAvKioKICAgICAgKiBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgY29udHJvbGxpbmcgYSBwcmVmZXJlbmNlIGZyb20gY29kZS4KICAgICAgKi8KQEAgLTQ0LDE5ICs0NCwxOSBAQAogICAgICAgICAgICAgaWYgKG1DaGVja0JveFByZWZlcmVuY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIG1DaGVja0JveFByZWZlcmVuY2Uuc2V0Q2hlY2tlZCghbUNoZWNrQm94UHJlZmVyZW5jZS5pc0NoZWNrZWQoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gRm9yY2UgdG9nZ2xlIGFnYWluIGluIGEgc2Vjb25kCiAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCAxMDAwKTsKICAgICAgICAgfQogICAgIH07Ci0gICAgCisKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKICAgICAgICAgLy8gTG9hZCB0aGUgWE1MIHByZWZlcmVuY2VzIGZpbGUKICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwuYWR2YW5jZWRfcHJlZmVyZW5jZXMpOwotICAgICAgICAKKwogICAgICAgICAvLyBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNoZWNrYm94IHByZWZlcmVuY2UKICAgICAgICAgbUNoZWNrQm94UHJlZmVyZW5jZSA9IChDaGVja0JveFByZWZlcmVuY2UpZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmZpbmRQcmVmZXJlbmNlKAogICAgICAgICAgICAgICAgIEtFWV9BRFZBTkNFRF9DSEVDS0JPWF9QUkVGRVJFTkNFKTsKQEAgLTY4LDcgKzY4LDcgQEAKIAogICAgICAgICAvLyBTdGFydCB0aGUgZm9yY2UgdG9nZ2xlCiAgICAgICAgIG1Gb3JjZUNoZWNrQm94UnVubmFibGUucnVuKCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFNldCB1cCBhIGxpc3RlbmVyIHdoZW5ldmVyIGEga2V5IGNoYW5nZXMKICAgICAgICAgZ2V0UHJlZmVyZW5jZVNjcmVlbigpLmdldFNoYXJlZFByZWZlcmVuY2VzKCkucmVnaXN0ZXJPblNoYXJlZFByZWZlcmVuY2VDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKICAgICB9CkBAIC03OSw3ICs3OSw3IEBACiAKICAgICAgICAgLy8gVW5yZWdpc3RlciB0aGUgbGlzdGVuZXIgd2hlbmV2ZXIgYSBrZXkgY2hhbmdlcwogICAgICAgICBnZXRQcmVmZXJlbmNlU2NyZWVuKCkuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoKS51bnJlZ2lzdGVyT25TaGFyZWRQcmVmZXJlbmNlQ2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIAorCiAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtRm9yY2VDaGVja0JveFJ1bm5hYmxlKTsKICAgICB9CiAKQEAgLTkwLDUgKzkwLDUgQEAKICAgICAgICAgICAgICAgICAgICAgKyBzaGFyZWRQcmVmZXJlbmNlcy5nZXRJbnQoa2V5LCAwKSwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGVmYXVsdFZhbHVlcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRGVmYXVsdFZhbHVlcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvRGVmYXVsdFZhbHVlcy5qYXZhCnJlbmFtZSB0byBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9EZWZhdWx0VmFsdWVzLmphdmEKaW5kZXggNDk0YTJlYS4uNjljZjQ5OSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9EZWZhdWx0VmFsdWVzLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvRGVmYXVsdFZhbHVlcy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOwogCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLkFwaURlbW9zQXBwbGljYXRpb247CiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICAKKwogICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5kZWZhdWx0X3ZhbHVlcyk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9GcmFnbWVudFByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9GcmFnbWVudFByZWZlcmVuY2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjYzZhMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL0ZyYWdtZW50UHJlZmVyZW5jZXMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VGcmFnbWVudDsKKworLyoqCisgKiBEZW1vbnN0cmF0aW9uIG9mIFByZWZlcmVuY2VGcmFnbWVudCwgc2hvd2luZyBhIHNpbmdsZSBmcmFnbWVudCBpbiBhbgorICogYWN0aXZpdHkuCisgKi8KK3B1YmxpYyBjbGFzcyBGcmFnbWVudFByZWZlcmVuY2VzIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIC8vIERpc3BsYXkgdGhlIGZyYWdtZW50IGFzIHRoZSBtYWluIGNvbnRlbnQuCisgICAgICAgIGdldEZyYWdtZW50TWFuYWdlcigpLm9wZW5UcmFuc2FjdGlvbigpLnJlcGxhY2UoYW5kcm9pZC5SLmlkLmNvbnRlbnQsCisgICAgICAgICAgICAgICAgbmV3IFByZWZzRnJhZ21lbnQoKSkuY29tbWl0KCk7CisgICAgfQorCisvL0JFR0lOX0lOQ0xVREUoZnJhZ21lbnQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmc0ZyYWdtZW50IGV4dGVuZHMgUHJlZmVyZW5jZUZyYWdtZW50IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKKyAgICAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VzKTsKKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoZnJhZ21lbnQpCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9MYXVuY2hpbmdQcmVmZXJlbmNlcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQpyZW5hbWUgdG8gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQppbmRleCA0YWExNTIyLi4wNjY0NzdiIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL0xhdW5jaGluZ1ByZWZlcmVuY2VzLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTGF1bmNoaW5nUHJlZmVyZW5jZXMuamF2YQpAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuYXBwOworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKIAogaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOwogCkBAIC0zNiw5ICszNiw5IEBACiBwdWJsaWMgY2xhc3MgTGF1bmNoaW5nUHJlZmVyZW5jZXMgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIE9uQ2xpY2tMaXN0ZW5lciB7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVRVUVTVF9DT0RFX1BSRUZFUkVOQ0VTID0gMTsKLSAgICAKKwogICAgIHByaXZhdGUgVGV4dFZpZXcgbUNvdW50ZXJUZXh0OwotICAgIAorCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwpAQCAtNTAsMzMgKzUwLDMzIEBACiAgICAgICAgICAqIHN1YmNsYXNzIG9mIEFwcGxpY2F0aW9uLCBzbyB5b3VyIGRlZmF1bHQgdmFsdWVzIHdvdWxkIGJlIGxvYWRlZAogICAgICAgICAgKiByZWdhcmRsZXNzIG9mIGVudHJ5IGludG8geW91ciBhcHBsaWNhdGlvbiAoZm9yIGV4YW1wbGUsIGEgc2VydmljZSBvcgogICAgICAgICAgKiBhY3Rpdml0eSkuCi0gICAgICAgICAqLyAgCisgICAgICAgICAqLwogICAgICAgICBQcmVmZXJlbmNlTWFuYWdlci5zZXREZWZhdWx0VmFsdWVzKHRoaXMsIFIueG1sLmFkdmFuY2VkX3ByZWZlcmVuY2VzLCBmYWxzZSk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFNpbXBsZSBsYXlvdXQKICAgICAgICAgTGluZWFyTGF5b3V0IGxheW91dCA9IG5ldyBMaW5lYXJMYXlvdXQodGhpcyk7CiAgICAgICAgIGxheW91dC5zZXRPcmllbnRhdGlvbihMaW5lYXJMYXlvdXQuVkVSVElDQUwpOwogICAgICAgICBzZXRDb250ZW50VmlldyhsYXlvdXQpOwotICAgICAgICAKKwogICAgICAgICAvLyBDcmVhdGUgYSBzaW1wbGUgYnV0dG9uIHRoYXQgd2lsbCBsYXVuY2ggdGhlIHByZWZlcmVuY2VzCiAgICAgICAgIEJ1dHRvbiBsYXVuY2hQcmVmZXJlbmNlcyA9IG5ldyBCdXR0b24odGhpcyk7CiAgICAgICAgIGxhdW5jaFByZWZlcmVuY2VzLnNldFRleHQoZ2V0U3RyaW5nKFIuc3RyaW5nLmxhdW5jaF9wcmVmZXJlbmNlX2FjdGl2aXR5KSk7CiAgICAgICAgIGxhdW5jaFByZWZlcmVuY2VzLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgbGF5b3V0LmFkZFZpZXcobGF1bmNoUHJlZmVyZW5jZXMsIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKICAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7Ci0gICAgICAgIAorCiAgICAgICAgIG1Db3VudGVyVGV4dCA9IG5ldyBUZXh0Vmlldyh0aGlzKTsKICAgICAgICAgbGF5b3V0LmFkZFZpZXcobUNvdW50ZXJUZXh0LCBuZXcgTGF5b3V0UGFyYW1zKExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCiAgICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCkpOwotICAgICAgICAKKwogICAgICAgICB1cGRhdGVDb3VudGVyVGV4dCgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkLCBsYXVuY2ggYW4gYWN0aXZpdHkgdGhyb3VnaCB0aGlzIGludGVudAogICAgICAgICBJbnRlbnQgbGF1bmNoUHJlZmVyZW5jZXNJbnRlbnQgPSBuZXcgSW50ZW50KCkuc2V0Q2xhc3ModGhpcywgQWR2YW5jZWRQcmVmZXJlbmNlcy5jbGFzcyk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIE1ha2UgaXQgYSBzdWJhY3Rpdml0eSBzbyB3ZSBrbm93IHdoZW4gaXQgcmV0dXJucwogICAgICAgICBzdGFydEFjdGl2aXR5Rm9yUmVzdWx0KGxhdW5jaFByZWZlcmVuY2VzSW50ZW50LCBSRVFVRVNUX0NPREVfUFJFRkVSRU5DRVMpOwogICAgIH0KQEAgLTg0LDcgKzg0LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkFjdGl2aXR5UmVzdWx0KGludCByZXF1ZXN0Q29kZSwgaW50IHJlc3VsdENvZGUsIEludGVudCBkYXRhKSB7CiAgICAgICAgIHN1cGVyLm9uQWN0aXZpdHlSZXN1bHQocmVxdWVzdENvZGUsIHJlc3VsdENvZGUsIGRhdGEpOwotICAgICAgICAKKwogICAgICAgICAvLyBUaGUgcHJlZmVyZW5jZXMgcmV0dXJuZWQgaWYgdGhlIHJlcXVlc3QgY29kZSBpcyB3aGF0IHdlIGhhZCBnaXZlbgogICAgICAgICAvLyBlYXJsaWVyIGluIHN0YXJ0U3ViQWN0aXZpdHkKICAgICAgICAgaWYgKHJlcXVlc3RDb2RlID09IFJFUVVFU1RfQ09ERV9QUkVGRVJFTkNFUykgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9NeVByZWZlcmVuY2UuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL015UHJlZmVyZW5jZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTXlQcmVmZXJlbmNlLmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL015UHJlZmVyZW5jZS5qYXZhCmluZGV4IDk2N2MxODEuLmFlYjhiZjkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvTXlQcmVmZXJlbmNlLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvTXlQcmVmZXJlbmNlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CiAKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKIApAQCAtMzMsMTggKzMzLDE4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBNeVByZWZlcmVuY2UgZXh0ZW5kcyBQcmVmZXJlbmNlIHsKICAgICBwcml2YXRlIGludCBtQ2xpY2tDb3VudGVyOwotICAgIAorCiAgICAgLy8gVGhpcyBpcyB0aGUgY29uc3RydWN0b3IgY2FsbGVkIGJ5IHRoZSBpbmZsYXRlcgogICAgIHB1YmxpYyBNeVByZWZlcmVuY2UoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAKLSAgICAgICAgc2V0V2lkZ2V0TGF5b3V0UmVzb3VyY2UoUi5sYXlvdXQucHJlZmVyZW5jZV93aWRnZXRfbXlwcmVmZXJlbmNlKTsgICAgICAgIAorCisgICAgICAgIHNldFdpZGdldExheW91dFJlc291cmNlKFIubGF5b3V0LnByZWZlcmVuY2Vfd2lkZ2V0X215cHJlZmVyZW5jZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25CaW5kVmlldyhWaWV3IHZpZXcpIHsKICAgICAgICAgc3VwZXIub25CaW5kVmlldyh2aWV3KTsKLSAgICAgICAgCisKICAgICAgICAgLy8gU2V0IG91ciBjdXN0b20gdmlld3MgaW5zaWRlIHRoZSBsYXlvdXQKICAgICAgICAgZmluYWwgVGV4dFZpZXcgbXlUZXh0VmlldyA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5teXByZWZlcmVuY2Vfd2lkZ2V0KTsKICAgICAgICAgaWYgKG15VGV4dFZpZXcgIT0gbnVsbCkgewpAQCAtNjEsMTQgKzYxLDE0IEBACiAgICAgICAgICAgICAvLyBUaGV5IGRvbid0IHdhbnQgdGhlIHZhbHVlIHRvIGJlIHNldAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIAorCiAgICAgICAgIC8vIEluY3JlbWVudCBjb3VudGVyCiAgICAgICAgIG1DbGlja0NvdW50ZXIgPSBuZXdWYWx1ZTsKLSAgICAgICAgCisKICAgICAgICAgLy8gU2F2ZSB0byBwZXJzaXN0ZW50IHN0b3JhZ2UgKHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRoaXMKICAgICAgICAgLy8gcHJlZmVyZW5jZSBzaG91bGQgYmUgcGVyc2lzdGVudCwgYWxvbmcgd2l0aCBvdGhlciB1c2VmdWwgY2hlY2tzKQogICAgICAgICBwZXJzaXN0SW50KG1DbGlja0NvdW50ZXIpOwotICAgICAgICAKKwogICAgICAgICAvLyBEYXRhIGhhcyBjaGFuZ2VkLCBub3RpZnkgc28gVUkgY2FuIGJlIHJlZnJlc2hlZCEKICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgIH0KQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICAgKiBtdXN0IHNhdmUgdGhlIGluc3RhbmNlIHN0YXRlIHNvIGl0IGlzIGFibGUgdG8sIGZvciBleGFtcGxlLCBzdXJ2aXZlCiAgICAgICAgICAqIG9yaWVudGF0aW9uIGNoYW5nZXMuCiAgICAgICAgICAqLwotICAgICAgICAKKwogICAgICAgICBmaW5hbCBQYXJjZWxhYmxlIHN1cGVyU3RhdGUgPSBzdXBlci5vblNhdmVJbnN0YW5jZVN0YXRlKCk7CiAgICAgICAgIGlmIChpc1BlcnNpc3RlbnQoKSkgewogICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBzYXZlIGluc3RhbmNlIHN0YXRlIHNpbmNlIGl0J3MgcGVyc2lzdGVudApAQCAtMTIwLDE0ICsxMjAsMTQgQEAKICAgICAgICAgICAgIHN1cGVyLm9uUmVzdG9yZUluc3RhbmNlU3RhdGUoc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgIAorCiAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGluc3RhbmNlIHN0YXRlCiAgICAgICAgIFNhdmVkU3RhdGUgbXlTdGF0ZSA9IChTYXZlZFN0YXRlKSBzdGF0ZTsKICAgICAgICAgc3VwZXIub25SZXN0b3JlSW5zdGFuY2VTdGF0ZShteVN0YXRlLmdldFN1cGVyU3RhdGUoKSk7CiAgICAgICAgIG1DbGlja0NvdW50ZXIgPSBteVN0YXRlLmNsaWNrQ291bnRlcjsKICAgICAgICAgbm90aWZ5Q2hhbmdlZCgpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgogICAgICAqIFNhdmVkU3RhdGUsIGEgc3ViY2xhc3Mgb2Yge0BsaW5rIEJhc2VTYXZlZFN0YXRlfSwgd2lsbCBzdG9yZSB0aGUgc3RhdGUKICAgICAgKiBvZiBNeVByZWZlcmVuY2UsIGEgc3ViY2xhc3Mgb2YgUHJlZmVyZW5jZS4KQEAgLTEzNiwxMCArMTM2LDEwIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2F2ZWRTdGF0ZSBleHRlbmRzIEJhc2VTYXZlZFN0YXRlIHsKICAgICAgICAgaW50IGNsaWNrQ291bnRlcjsKLSAgICAgICAgCisKICAgICAgICAgcHVibGljIFNhdmVkU3RhdGUoUGFyY2VsIHNvdXJjZSkgewogICAgICAgICAgICAgc3VwZXIoc291cmNlKTsKLSAgICAgICAgICAgIAorCiAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBjbGljayBjb3VudGVyCiAgICAgICAgICAgICBjbGlja0NvdW50ZXIgPSBzb3VyY2UucmVhZEludCgpOwogICAgICAgICB9CkBAIC0xNDcsNyArMTQ3LDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsIGRlc3QsIGludCBmbGFncykgewogICAgICAgICAgICAgc3VwZXIud3JpdGVUb1BhcmNlbChkZXN0LCBmbGFncyk7Ci0gICAgICAgICAgICAKKwogICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY2xpY2sgY291bnRlcgogICAgICAgICAgICAgZGVzdC53cml0ZUludChjbGlja0NvdW50ZXIpOwogICAgICAgICB9CkBAIC0xNjcsNSArMTY3LDUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfTsKICAgICB9Ci0gICAgCisKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCnJlbmFtZSB0byBzYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlRGVwZW5kZW5jaWVzLmphdmEKaW5kZXggMjdjMjJkZS4uM2FhNGUzOSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlRGVwZW5kZW5jaWVzLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZURlcGVuZGVuY2llcy5qYXZhCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5hcHA7CitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5wcmVmZXJlbmNlOwogCiBpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CiAKQEAgLTI2LDcgKzI2LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIAorCiAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLnByZWZlcmVuY2VfZGVwZW5kZW5jaWVzKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VXaXRoSGVhZGVycy5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZVdpdGhIZWFkZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzN2UxZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VXaXRoSGVhZGVycy5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMucHJlZmVyZW5jZTsKKworaW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5SOworCitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5wcmVmZXJlbmNlLlByZWZlcmVuY2VBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLnByZWZlcmVuY2UuUHJlZmVyZW5jZUZyYWdtZW50OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogRGVtb25zdHJhdGlvbiBvZiBQcmVmZXJlbmNlQWN0aXZpdHkgdG8gbWFrZSBhIHRvcC1sZXZlbCBwcmVmZXJlbmNlCisgKiBwYW5lbCB3aXRoIGhlYWRlcnMuCisgKi8KKy8vQkVHSU5fSU5DTFVERShhY3Rpdml0eSkKK3B1YmxpYyBjbGFzcyBQcmVmZXJlbmNlV2l0aEhlYWRlcnMgZXh0ZW5kcyBQcmVmZXJlbmNlQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgCisgICAgICAgIC8vIEFkZCBhIGJ1dHRvbiB0byB0aGUgaGVhZGVyIGxpc3QuCisgICAgICAgIGlmIChoYXNIZWFkZXJzKCkpIHsKKyAgICAgICAgICAgIEJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHRoaXMpOworICAgICAgICAgICAgYnV0dG9uLnNldFRleHQoIlNvbWUgYWN0aW9uIik7CisgICAgICAgICAgICBzZXRMaXN0Rm9vdGVyKGJ1dHRvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgdGhlIGFjdGl2aXR5IHdpdGggdGhlIHRvcC1sZXZlbCBoZWFkZXJzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQnVpbGRIZWFkZXJzKExpc3Q8SGVhZGVyPiB0YXJnZXQpIHsKKyAgICAgICAgbG9hZEhlYWRlcnNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZV9oZWFkZXJzLCB0YXJnZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgZnJhZ21lbnQgc2hvd3MgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgZmlyc3QgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZnMxRnJhZ21lbnQgZXh0ZW5kcyBQcmVmZXJlbmNlRnJhZ21lbnQgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKKyAgICAgICAgICAgIGFkZFByZWZlcmVuY2VzRnJvbVJlc291cmNlKFIueG1sLmZyYWdtZW50ZWRfcHJlZmVyZW5jZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBmcmFnbWVudCBjb250YWlucyBhIHNlY29uZC1sZXZlbCBzZXQgb2YgcHJlZmVyZW5jZSB0aGF0IHlvdQorICAgICAqIGNhbiBnZXQgdG8gYnkgdGFwcGluZyBhbiBpdGVtIGluIHRoZSBmaXJzdCBwcmVmZXJlbmNlcyBmcmFnbWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZWZzMUZyYWdtZW50SW5uZXIgZXh0ZW5kcyBQcmVmZXJlbmNlRnJhZ21lbnQgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAgICAgLy8gQ2FuIHJldHJpZXZlIGFyZ3VtZW50cyBmcm9tIHByZWZlcmVuY2UgWE1MLgorICAgICAgICAgICAgTG9nLmkoImFyZ3MiLCAiQXJndW1lbnRzOiAiICsgZ2V0QXJndW1lbnRzKCkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBMb2FkIHRoZSBwcmVmZXJlbmNlcyBmcm9tIGFuIFhNTCByZXNvdXJjZQorICAgICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwuZnJhZ21lbnRlZF9wcmVmZXJlbmNlc19pbm5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZyYWdtZW50IHNob3dzIHRoZSBwcmVmZXJlbmNlcyBmb3IgdGhlIHNlY29uZCBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVmczJGcmFnbWVudCBleHRlbmRzIFByZWZlcmVuY2VGcmFnbWVudCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgICAgICAvLyBDYW4gcmV0cmlldmUgYXJndW1lbnRzIGZyb20gaGVhZGVycyBYTUwuCisgICAgICAgICAgICBMb2cuaSgiYXJncyIsICJBcmd1bWVudHM6ICIgKyBnZXRBcmd1bWVudHMoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIExvYWQgdGhlIHByZWZlcmVuY2VzIGZyb20gYW4gWE1MIHJlc291cmNlCisgICAgICAgICAgICBhZGRQcmVmZXJlbmNlc0Zyb21SZXNvdXJjZShSLnhtbC5wcmVmZXJlbmNlX2RlcGVuZGVuY2llcyk7CisgICAgICAgIH0KKyAgICB9Cit9CisvL0VORF9JTkNMVURFKGFjdGl2aXR5KQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VzRnJvbUNvZGUuamF2YQppbmRleCBiZTIyYjQ5Li44Y2U2YjQyIDEwMDY0NAotLS0gYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvYXBwL1ByZWZlcmVuY2VzRnJvbUNvZGUuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvcHJlZmVyZW5jZS9QcmVmZXJlbmNlc0Zyb21Db2RlLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKQEAgLTM0LDI2ICszNCwyNiBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCisKICAgICAgICAgc2V0UHJlZmVyZW5jZVNjcmVlbihjcmVhdGVQcmVmZXJlbmNlSGllcmFyY2h5KCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgUHJlZmVyZW5jZVNjcmVlbiBjcmVhdGVQcmVmZXJlbmNlSGllcmFyY2h5KCkgewogICAgICAgICAvLyBSb290CiAgICAgICAgIFByZWZlcmVuY2VTY3JlZW4gcm9vdCA9IGdldFByZWZlcmVuY2VNYW5hZ2VyKCkuY3JlYXRlUHJlZmVyZW5jZVNjcmVlbih0aGlzKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElubGluZSBwcmVmZXJlbmNlcyAKKworICAgICAgICAvLyBJbmxpbmUgcHJlZmVyZW5jZXMKICAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IGlubGluZVByZWZDYXQgPSBuZXcgUHJlZmVyZW5jZUNhdGVnb3J5KHRoaXMpOwogICAgICAgICBpbmxpbmVQcmVmQ2F0LnNldFRpdGxlKFIuc3RyaW5nLmlubGluZV9wcmVmZXJlbmNlcyk7CiAgICAgICAgIHJvb3QuYWRkUHJlZmVyZW5jZShpbmxpbmVQcmVmQ2F0KTsKLSAgICAgICAgCisKICAgICAgICAgLy8gVG9nZ2xlIHByZWZlcmVuY2UKICAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIHRvZ2dsZVByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOwogICAgICAgICB0b2dnbGVQcmVmLnNldEtleSgidG9nZ2xlX3ByZWZlcmVuY2UiKTsKICAgICAgICAgdG9nZ2xlUHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV90b2dnbGVfcHJlZmVyZW5jZSk7CiAgICAgICAgIHRvZ2dsZVByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X3RvZ2dsZV9wcmVmZXJlbmNlKTsKICAgICAgICAgaW5saW5lUHJlZkNhdC5hZGRQcmVmZXJlbmNlKHRvZ2dsZVByZWYpOwotICAgICAgICAgICAgICAgIAorCiAgICAgICAgIC8vIERpYWxvZyBiYXNlZCBwcmVmZXJlbmNlcwogICAgICAgICBQcmVmZXJlbmNlQ2F0ZWdvcnkgZGlhbG9nQmFzZWRQcmVmQ2F0ID0gbmV3IFByZWZlcmVuY2VDYXRlZ29yeSh0aGlzKTsKICAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LnNldFRpdGxlKFIuc3RyaW5nLmRpYWxvZ19iYXNlZF9wcmVmZXJlbmNlcyk7CkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIGVkaXRUZXh0UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKICAgICAgICAgZWRpdFRleHRQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9lZGl0dGV4dF9wcmVmZXJlbmNlKTsKICAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LmFkZFByZWZlcmVuY2UoZWRpdFRleHRQcmVmKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gTGlzdCBwcmVmZXJlbmNlCiAgICAgICAgIExpc3RQcmVmZXJlbmNlIGxpc3RQcmVmID0gbmV3IExpc3RQcmVmZXJlbmNlKHRoaXMpOwogICAgICAgICBsaXN0UHJlZi5zZXRFbnRyaWVzKFIuYXJyYXkuZW50cmllc19saXN0X3ByZWZlcmVuY2UpOwpAQCAtNzYsNyArNzYsNyBAQAogICAgICAgICBsaXN0UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9saXN0X3ByZWZlcmVuY2UpOwogICAgICAgICBsaXN0UHJlZi5zZXRTdW1tYXJ5KFIuc3RyaW5nLnN1bW1hcnlfbGlzdF9wcmVmZXJlbmNlKTsKICAgICAgICAgZGlhbG9nQmFzZWRQcmVmQ2F0LmFkZFByZWZlcmVuY2UobGlzdFByZWYpOwotICAgICAgICAKKwogICAgICAgICAvLyBMYXVuY2ggcHJlZmVyZW5jZXMKICAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IGxhdW5jaFByZWZDYXQgPSBuZXcgUHJlZmVyZW5jZUNhdGVnb3J5KHRoaXMpOwogICAgICAgICBsYXVuY2hQcmVmQ2F0LnNldFRpdGxlKFIuc3RyaW5nLmxhdW5jaF9wcmVmZXJlbmNlcyk7CkBAIC05MywxOSArOTMsMTkgQEAKICAgICAgICAgc2NyZWVuUHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9zY3JlZW5fcHJlZmVyZW5jZSk7CiAgICAgICAgIHNjcmVlblByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X3NjcmVlbl9wcmVmZXJlbmNlKTsKICAgICAgICAgbGF1bmNoUHJlZkNhdC5hZGRQcmVmZXJlbmNlKHNjcmVlblByZWYpOwotICAgICAgICAKKwogICAgICAgICAvKgogICAgICAgICAgKiBZb3UgY2FuIGFkZCBtb3JlIHByZWZlcmVuY2VzIHRvIHNjcmVlblByZWYgdGhhdCB3aWxsIGJlIHNob3duIG9uIHRoZQogICAgICAgICAgKiBuZXh0IHNjcmVlbi4KICAgICAgICAgICovCi0gICAgICAgIAorCiAgICAgICAgIC8vIEV4YW1wbGUgb2YgbmV4dCBzY3JlZW4gdG9nZ2xlIHByZWZlcmVuY2UKICAgICAgICAgQ2hlY2tCb3hQcmVmZXJlbmNlIG5leHRTY3JlZW5DaGVja0JveFByZWYgPSBuZXcgQ2hlY2tCb3hQcmVmZXJlbmNlKHRoaXMpOwogICAgICAgICBuZXh0U2NyZWVuQ2hlY2tCb3hQcmVmLnNldEtleSgibmV4dF9zY3JlZW5fdG9nZ2xlX3ByZWZlcmVuY2UiKTsKICAgICAgICAgbmV4dFNjcmVlbkNoZWNrQm94UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9uZXh0X3NjcmVlbl90b2dnbGVfcHJlZmVyZW5jZSk7CiAgICAgICAgIG5leHRTY3JlZW5DaGVja0JveFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X25leHRfc2NyZWVuX3RvZ2dsZV9wcmVmZXJlbmNlKTsKICAgICAgICAgc2NyZWVuUHJlZi5hZGRQcmVmZXJlbmNlKG5leHRTY3JlZW5DaGVja0JveFByZWYpOwotICAgICAgICAKKwogICAgICAgICAvLyBJbnRlbnQgcHJlZmVyZW5jZQogICAgICAgICBQcmVmZXJlbmNlU2NyZWVuIGludGVudFByZWYgPSBnZXRQcmVmZXJlbmNlTWFuYWdlcigpLmNyZWF0ZVByZWZlcmVuY2VTY3JlZW4odGhpcyk7CiAgICAgICAgIGludGVudFByZWYuc2V0SW50ZW50KG5ldyBJbnRlbnQoKS5zZXRBY3Rpb24oSW50ZW50LkFDVElPTl9WSUVXKQpAQCAtMTEzLDE4ICsxMTMsMTggQEAKICAgICAgICAgaW50ZW50UHJlZi5zZXRUaXRsZShSLnN0cmluZy50aXRsZV9pbnRlbnRfcHJlZmVyZW5jZSk7CiAgICAgICAgIGludGVudFByZWYuc2V0U3VtbWFyeShSLnN0cmluZy5zdW1tYXJ5X2ludGVudF9wcmVmZXJlbmNlKTsKICAgICAgICAgbGF1bmNoUHJlZkNhdC5hZGRQcmVmZXJlbmNlKGludGVudFByZWYpOwotICAgICAgICAKKwogICAgICAgICAvLyBQcmVmZXJlbmNlIGF0dHJpYnV0ZXMKICAgICAgICAgUHJlZmVyZW5jZUNhdGVnb3J5IHByZWZBdHRyc0NhdCA9IG5ldyBQcmVmZXJlbmNlQ2F0ZWdvcnkodGhpcyk7CiAgICAgICAgIHByZWZBdHRyc0NhdC5zZXRUaXRsZShSLnN0cmluZy5wcmVmZXJlbmNlX2F0dHJpYnV0ZXMpOwogICAgICAgICByb290LmFkZFByZWZlcmVuY2UocHJlZkF0dHJzQ2F0KTsKLSAgICAgICAgCisKICAgICAgICAgLy8gVmlzdWFsIHBhcmVudCB0b2dnbGUgcHJlZmVyZW5jZQogICAgICAgICBDaGVja0JveFByZWZlcmVuY2UgcGFyZW50Q2hlY2tCb3hQcmVmID0gbmV3IENoZWNrQm94UHJlZmVyZW5jZSh0aGlzKTsKICAgICAgICAgcGFyZW50Q2hlY2tCb3hQcmVmLnNldFRpdGxlKFIuc3RyaW5nLnRpdGxlX3BhcmVudF9wcmVmZXJlbmNlKTsKICAgICAgICAgcGFyZW50Q2hlY2tCb3hQcmVmLnNldFN1bW1hcnkoUi5zdHJpbmcuc3VtbWFyeV9wYXJlbnRfcHJlZmVyZW5jZSk7CiAgICAgICAgIHByZWZBdHRyc0NhdC5hZGRQcmVmZXJlbmNlKHBhcmVudENoZWNrQm94UHJlZik7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIFZpc3VhbCBjaGlsZCB0b2dnbGUgcHJlZmVyZW5jZQogICAgICAgICAvLyBTZWUgcmVzL3ZhbHVlcy9hdHRycy54bWwgZm9yIHRoZSA8ZGVjbGFyZS1zdHlsZWFibGU+IHRoYXQgZGVmaW5lcwogICAgICAgICAvLyBUb2dnbGVQcmVmQXR0cnMuCkBAIC0xMzcsNyArMTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIDApKTsKICAgICAgICAgcHJlZkF0dHJzQ2F0LmFkZFByZWZlcmVuY2UoY2hpbGRDaGVja0JveFByZWYpOwogICAgICAgICBhLnJlY3ljbGUoKTsKLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL2FwcC9QcmVmZXJlbmNlc0Zyb21YbWwuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VzRnJvbVhtbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9wcmVmZXJlbmNlL1ByZWZlcmVuY2VzRnJvbVhtbC5qYXZhCmluZGV4IDYzYmJhYzIuLjg2OGUzM2MgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy9hcHAvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ByZWZlcmVuY2UvUHJlZmVyZW5jZXNGcm9tWG1sLmphdmEKQEAgLTE0LDcgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLmFwcDsKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnByZWZlcmVuY2U7CiAKIGltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKIApAQCAtMjYsNyArMjYsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gTG9hZCB0aGUgcHJlZmVyZW5jZXMgZnJvbSBhbiBYTUwgcmVzb3VyY2UKICAgICAgICAgYWRkUHJlZmVyZW5jZXNGcm9tUmVzb3VyY2UoUi54bWwucHJlZmVyZW5jZXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKaW5kZXggNGY0MDI0Yi4uNDJiYzI5NyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHMyLmphdmEKQEAgLTE2LDM1ICsxNiw0IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CiAKLS8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcwotLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNwaW5uZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOwotCi0KLS8qKgotICogQSBnYWxsZXJ5IG9mIGJhc2ljIGNvbnRyb2xzOiBCdXR0b24sIEVkaXRUZXh0LCBSYWRpb0J1dHRvbiwgQ2hlY2tib3gsCi0gKiBTcGlubmVyLiBUaGlzIGV4YW1wbGUgdXNlcyB0aGUgZGVmYXVsdCB0aGVtZS4KLSAqLwotcHVibGljIGNsYXNzIENvbnRyb2xzMiBleHRlbmRzIEFjdGl2aXR5IHsKLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQuY29udHJvbHNfMSk7Ci0KLSAgICAgICAgU3Bpbm5lciBzMSA9IChTcGlubmVyKSBmaW5kVmlld0J5SWQoUi5pZC5zcGlubmVyMSk7Ci0gICAgICAgIEFycmF5QWRhcHRlcjxTdHJpbmc+IGFkYXB0ZXIgPSBuZXcgQXJyYXlBZGFwdGVyPFN0cmluZz4odGhpcywKLSAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2l0ZW0sIG1TdHJpbmdzKTsKLSAgICAgICAgYWRhcHRlci5zZXREcm9wRG93blZpZXdSZXNvdXJjZShhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9zcGlubmVyX2Ryb3Bkb3duX2l0ZW0pOwotICAgICAgICBzMS5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TdHJpbmdzID0gewotCSAgICAiTWVyY3VyeSIsICJWZW51cyIsICJFYXJ0aCIsICJNYXJzIiwgIkp1cGl0ZXIiLCAiU2F0dXJuIiwgIlVyYW51cyIsICJOZXB0dW5lIgotICAgIH07Ci19CitwdWJsaWMgY2xhc3MgQ29udHJvbHMyIGV4dGVuZHMgQ29udHJvbHMxIHt9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0NvbnRyb2xzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzc2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczMuamF2YQpAQCAtMCwwICsxLDE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworcHVibGljIGNsYXNzIENvbnRyb2xzMyBleHRlbmRzIENvbnRyb2xzMSB7fQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Db250cm9sczQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNmMzEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvQ29udHJvbHM0LmphdmEKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKK3B1YmxpYyBjbGFzcyBDb250cm9sczQgZXh0ZW5kcyBDb250cm9sczEge30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0V4cGFuZGFibGVMaXN0Mi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKaW5kZXggNTc4NDEyMi4uOGIyY2I0MyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvRXhwYW5kYWJsZUxpc3QyLmphdmEKQEAgLTE3LDU5ICsxNyw2OCBAQAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkV4cGFuZGFibGVMaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLkN1cnNvcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CiBpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0cy5QZW9wbGU7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRXhwYW5kYWJsZUxpc3RBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdC5Db21tb25EYXRhS2luZHMuUGhvbmU7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Db250YWN0c0NvbnRyYWN0LkNvbnRhY3RzOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkN1cnNvclRyZWVBZGFwdGVyOwogaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNpbXBsZUN1cnNvclRyZWVBZGFwdGVyOwogCi0KIC8qKgogICogRGVtb25zdHJhdGVzIGV4cGFuZGFibGUgbGlzdHMgYmFja2VkIGJ5IEN1cnNvcnMKICAqLwogcHVibGljIGNsYXNzIEV4cGFuZGFibGVMaXN0MiBleHRlbmRzIEV4cGFuZGFibGVMaXN0QWN0aXZpdHkgewotICAgIHByaXZhdGUgaW50IG1Hcm91cElkQ29sdW1uSW5kZXg7IAotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIG1QaG9uZU51bWJlclByb2plY3Rpb25bXSA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBQZW9wbGUuUGhvbmVzLl9JRCwgUGVvcGxlLlBob25lcy5OVU1CRVIKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIENPTlRBQ1RTX1BST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10geworICAgICAgICBDb250YWN0cy5fSUQsCisgICAgICAgIENvbnRhY3RzLkRJU1BMQVlfTkFNRQorICAgIH07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdST1VQX0lEX0NPTFVNTl9JTkRFWCA9IDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSE9ORV9OVU1CRVJfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBQaG9uZS5fSUQsCisgICAgICAgICAgICBQaG9uZS5OVU1CRVIKICAgICB9OwogCi0gICAgCi0gICAgcHJpdmF0ZSBFeHBhbmRhYmxlTGlzdEFkYXB0ZXIgbUFkYXB0ZXI7Ci0gICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRPS0VOX0dST1VQID0gMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU5fQ0hJTEQgPSAxOwogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFF1ZXJ5SGFuZGxlciBleHRlbmRzIEFzeW5jUXVlcnlIYW5kbGVyIHsKKyAgICAgICAgcHJpdmF0ZSBDdXJzb3JUcmVlQWRhcHRlciBtQWRhcHRlcjsKIAotICAgICAgICAvLyBRdWVyeSBmb3IgcGVvcGxlCi0gICAgICAgIEN1cnNvciBncm91cEN1cnNvciA9IG1hbmFnZWRRdWVyeShQZW9wbGUuQ09OVEVOVF9VUkksCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtQZW9wbGUuX0lELCBQZW9wbGUuTkFNRX0sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBwdWJsaWMgUXVlcnlIYW5kbGVyKENvbnRleHQgY29udGV4dCwgQ3Vyc29yVHJlZUFkYXB0ZXIgYWRhcHRlcikgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKSk7CisgICAgICAgICAgICB0aGlzLm1BZGFwdGVyID0gYWRhcHRlcjsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIENhY2hlIHRoZSBJRCBjb2x1bW4gaW5kZXgKLSAgICAgICAgbUdyb3VwSWRDb2x1bW5JbmRleCA9IGdyb3VwQ3Vyc29yLmdldENvbHVtbkluZGV4T3JUaHJvdyhQZW9wbGUuX0lEKTsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUXVlcnlDb21wbGV0ZShpbnQgdG9rZW4sIE9iamVjdCBjb29raWUsIEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKKyAgICAgICAgICAgIGNhc2UgVE9LRU5fR1JPVVA6CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIuc2V0R3JvdXBDdXJzb3IoY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAvLyBTZXQgdXAgb3VyIGFkYXB0ZXIKLSAgICAgICAgbUFkYXB0ZXIgPSBuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoZ3JvdXBDdXJzb3IsCi0gICAgICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9leHBhbmRhYmxlX2xpc3RfaXRlbV8xLAotICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzEsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtQZW9wbGUuTkFNRX0sIC8vIE5hbWUgZm9yIGdyb3VwIGxheW91dHMKLSAgICAgICAgICAgICAgICBuZXcgaW50W10ge2FuZHJvaWQuUi5pZC50ZXh0MX0sCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtQZW9wbGUuTlVNQkVSfSwgLy8gTnVtYmVyIGZvciBjaGlsZCBsYXlvdXRzCi0gICAgICAgICAgICAgICAgbmV3IGludFtdIHthbmRyb2lkLlIuaWQudGV4dDF9KTsKLSAgICAgICAgc2V0TGlzdEFkYXB0ZXIobUFkYXB0ZXIpOworICAgICAgICAgICAgY2FzZSBUT0tFTl9DSElMRDoKKyAgICAgICAgICAgICAgICBpbnQgZ3JvdXBQb3NpdGlvbiA9IChJbnRlZ2VyKSBjb29raWU7CisgICAgICAgICAgICAgICAgbUFkYXB0ZXIuc2V0Q2hpbGRyZW5DdXJzb3IoZ3JvdXBQb3NpdGlvbiwgY3Vyc29yKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBjbGFzcyBNeUV4cGFuZGFibGVMaXN0QWRhcHRlciBleHRlbmRzIFNpbXBsZUN1cnNvclRyZWVBZGFwdGVyIHsKIAotICAgICAgICBwdWJsaWMgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoQ3Vyc29yIGN1cnNvciwgQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXBMYXlvdXQsCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY29uc3RydWN0b3IgZG9lcyBub3QgdGFrZSBhIEN1cnNvci4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIHF1ZXJ5aW5nIHRoZSAKKyAgICAgICAgLy8gZGF0YWJhc2Ugb24gdGhlIG1haW4gdGhyZWFkLgorICAgICAgICBwdWJsaWMgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgZ3JvdXBMYXlvdXQsCiAgICAgICAgICAgICAgICAgaW50IGNoaWxkTGF5b3V0LCBTdHJpbmdbXSBncm91cEZyb20sIGludFtdIGdyb3VwVG8sIFN0cmluZ1tdIGNoaWxkcmVuRnJvbSwKICAgICAgICAgICAgICAgICBpbnRbXSBjaGlsZHJlblRvKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCBjdXJzb3IsIGdyb3VwTGF5b3V0LCBncm91cEZyb20sIGdyb3VwVG8sIGNoaWxkTGF5b3V0LCBjaGlsZHJlbkZyb20sCisKKyAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIG51bGwsIGdyb3VwTGF5b3V0LCBncm91cEZyb20sIGdyb3VwVG8sIGNoaWxkTGF5b3V0LCBjaGlsZHJlbkZyb20sCiAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuVG8pOwogICAgICAgICB9CiAKQEAgLTc4LDE1ICs4Nyw1MiBAQAogICAgICAgICAgICAgLy8gR2l2ZW4gdGhlIGdyb3VwLCB3ZSByZXR1cm4gYSBjdXJzb3IgZm9yIGFsbCB0aGUgY2hpbGRyZW4gd2l0aGluIHRoYXQgZ3JvdXAgCiAKICAgICAgICAgICAgIC8vIFJldHVybiBhIGN1cnNvciB0aGF0IHBvaW50cyB0byB0aGlzIGNvbnRhY3QncyBwaG9uZSBudW1iZXJzCi0gICAgICAgICAgICBVcmkuQnVpbGRlciBidWlsZGVyID0gUGVvcGxlLkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOwotICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZ3JvdXBDdXJzb3IuZ2V0TG9uZyhtR3JvdXBJZENvbHVtbkluZGV4KSk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZEVuY29kZWRQYXRoKFBlb3BsZS5QaG9uZXMuQ09OVEVOVF9ESVJFQ1RPUlkpOworICAgICAgICAgICAgVXJpLkJ1aWxkZXIgYnVpbGRlciA9IENvbnRhY3RzLkNPTlRFTlRfVVJJLmJ1aWxkVXBvbigpOworICAgICAgICAgICAgQ29udGVudFVyaXMuYXBwZW5kSWQoYnVpbGRlciwgZ3JvdXBDdXJzb3IuZ2V0TG9uZyhHUk9VUF9JRF9DT0xVTU5fSU5ERVgpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kRW5jb2RlZFBhdGgoQ29udGFjdHMuRGF0YS5DT05URU5UX0RJUkVDVE9SWSk7CiAgICAgICAgICAgICBVcmkgcGhvbmVOdW1iZXJzVXJpID0gYnVpbGRlci5idWlsZCgpOwogCi0gICAgICAgICAgICAvLyBUaGUgcmV0dXJuZWQgQ3Vyc29yIE1VU1QgYmUgbWFuYWdlZCBieSB1cywgc28gd2UgdXNlIEFjdGl2aXR5J3MgaGVscGVyCi0gICAgICAgICAgICAvLyBmdW5jdGlvbmFsaXR5IHRvIG1hbmFnZSBpdCBmb3IgdXMuCi0gICAgICAgICAgICByZXR1cm4gbWFuYWdlZFF1ZXJ5KHBob25lTnVtYmVyc1VyaSwgbVBob25lTnVtYmVyUHJvamVjdGlvbiwgbnVsbCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIG1RdWVyeUhhbmRsZXIuc3RhcnRRdWVyeShUT0tFTl9DSElMRCwgZ3JvdXBDdXJzb3IuZ2V0UG9zaXRpb24oKSwgcGhvbmVOdW1iZXJzVXJpLCAKKyAgICAgICAgICAgICAgICAgICAgUEhPTkVfTlVNQkVSX1BST0pFQ1RJT04sIFBob25lLk1JTUVUWVBFICsgIj0/IiwgCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7IFBob25lLkNPTlRFTlRfSVRFTV9UWVBFIH0sIG51bGwpOwogCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUXVlcnlIYW5kbGVyIG1RdWVyeUhhbmRsZXI7CisgICAgcHJpdmF0ZSBDdXJzb3JUcmVlQWRhcHRlciBtQWRhcHRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICAvLyBTZXQgdXAgb3VyIGFkYXB0ZXIKKyAgICAgICAgbUFkYXB0ZXIgPSBuZXcgTXlFeHBhbmRhYmxlTGlzdEFkYXB0ZXIoCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBhbmRyb2lkLlIubGF5b3V0LnNpbXBsZV9leHBhbmRhYmxlX2xpc3RfaXRlbV8xLAorICAgICAgICAgICAgICAgIGFuZHJvaWQuUi5sYXlvdXQuc2ltcGxlX2V4cGFuZGFibGVfbGlzdF9pdGVtXzEsCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgQ29udGFjdHMuRElTUExBWV9OQU1FIH0sIC8vIE5hbWUgZm9yIGdyb3VwIGxheW91dHMKKyAgICAgICAgICAgICAgICBuZXcgaW50W10geyBhbmRyb2lkLlIuaWQudGV4dDEgfSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBQaG9uZS5OVU1CRVIgfSwgLy8gTnVtYmVyIGZvciBjaGlsZCBsYXlvdXRzCisgICAgICAgICAgICAgICAgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxIH0pOworCisgICAgICAgIHNldExpc3RBZGFwdGVyKG1BZGFwdGVyKTsKKworICAgICAgICBtUXVlcnlIYW5kbGVyID0gbmV3IFF1ZXJ5SGFuZGxlcih0aGlzLCBtQWRhcHRlcik7CisKKyAgICAgICAgLy8gUXVlcnkgZm9yIHBlb3BsZQorICAgICAgICBtUXVlcnlIYW5kbGVyLnN0YXJ0UXVlcnkoVE9LRU5fR1JPVVAsIG51bGwsIENvbnRhY3RzLkNPTlRFTlRfVVJJLCBDT05UQUNUU19QUk9KRUNUSU9OLCAKKyAgICAgICAgICAgICAgICBDb250YWN0cy5IQVNfUEhPTkVfTlVNQkVSICsgIj0xIiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25EZXN0cm95KCkgeworICAgICAgICBzdXBlci5vbkRlc3Ryb3koKTsKKworICAgICAgICAvLyBOdWxsIG91dCB0aGUgZ3JvdXAgY3Vyc29yLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGdyb3VwIGN1cnNvciBhbmQgYWxsIG9mIHRoZSBjaGlsZCBjdXJzb3JzCisgICAgICAgIC8vIHRvIGJlIGNsb3NlZC4KKyAgICAgICAgbUFkYXB0ZXIuY2hhbmdlQ3Vyc29yKG51bGwpOworICAgICAgICBtQWRhcHRlciA9IG51bGw7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR2FsbGVyeTEuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dhbGxlcnkxLmphdmEKaW5kZXggN2FhYWFlZi4uYjI1MmQ1YSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR2FsbGVyeTEuamF2YQorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HYWxsZXJ5MS5qYXZhCkBAIC03MSw4ICs3MSwyNSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBjbGFzcyBJbWFnZUFkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIGludCBtR2FsbGVyeUl0ZW1CYWNrZ3JvdW5kOwotICAgICAgICAKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElURU1fV0lEVEggPSAxMzY7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJVEVNX0hFSUdIVCA9IDg4OworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1HYWxsZXJ5SXRlbUJhY2tncm91bmQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEludGVnZXJbXSBtSW1hZ2VJZHMgPSB7CisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzEsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzIsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzMsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzQsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzUsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzYsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzcsCisgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzgKKyAgICAgICAgfTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EZW5zaXR5OworCiAgICAgICAgIHB1YmxpYyBJbWFnZUFkYXB0ZXIoQ29udGV4dCBjKSB7CiAgICAgICAgICAgICBtQ29udGV4dCA9IGM7CiAgICAgICAgICAgICAvLyBTZWUgcmVzL3ZhbHVlcy9hdHRycy54bWwgZm9yIHRoZSA8ZGVjbGFyZS1zdHlsZWFibGU+IHRoYXQgZGVmaW5lcwpAQCAtODEsNiArOTgsOCBAQAogICAgICAgICAgICAgbUdhbGxlcnlJdGVtQmFja2dyb3VuZCA9IGEuZ2V0UmVzb3VyY2VJZCgKICAgICAgICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuR2FsbGVyeTFfYW5kcm9pZF9nYWxsZXJ5SXRlbUJhY2tncm91bmQsIDApOwogICAgICAgICAgICAgYS5yZWN5Y2xlKCk7CisKKyAgICAgICAgICAgIG1EZW5zaXR5ID0gYy5nZXRSZXNvdXJjZXMoKS5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHk7CiAgICAgICAgIH0KIAogICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewpAQCAtOTYsMzAgKzExNSwyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKLSAgICAgICAgICAgIEltYWdlVmlldyBpID0gbmV3IEltYWdlVmlldyhtQ29udGV4dCk7CisgICAgICAgICAgICBJbWFnZVZpZXcgaW1hZ2VWaWV3OworICAgICAgICAgICAgaWYgKGNvbnZlcnRWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0VmlldyA9IG5ldyBJbWFnZVZpZXcobUNvbnRleHQpOwogCi0gICAgICAgICAgICBpLnNldEltYWdlUmVzb3VyY2UobUltYWdlSWRzW3Bvc2l0aW9uXSk7Ci0gICAgICAgICAgICBpLnNldFNjYWxlVHlwZShJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9YWSk7Ci0gICAgICAgICAgICBpLnNldExheW91dFBhcmFtcyhuZXcgR2FsbGVyeS5MYXlvdXRQYXJhbXMoMTM2LCA4OCkpOworICAgICAgICAgICAgICAgIGltYWdlVmlldyA9IChJbWFnZVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgICAgIGltYWdlVmlldy5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkpOworICAgICAgICAgICAgICAgIGltYWdlVmlldy5zZXRMYXlvdXRQYXJhbXMobmV3IEdhbGxlcnkuTGF5b3V0UGFyYW1zKAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKElURU1fV0lEVEggKiBtRGVuc2l0eSArIDAuNWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgKElURU1fSEVJR0hUICogbURlbnNpdHkgKyAwLjVmKSkpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgcHJlZmVycmVkIEdhbGxlcnkgaXRlbSBiYWNrZ3JvdW5kCi0gICAgICAgICAgICBpLnNldEJhY2tncm91bmRSZXNvdXJjZShtR2FsbGVyeUl0ZW1CYWNrZ3JvdW5kKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgLy8gVGhlIHByZWZlcnJlZCBHYWxsZXJ5IGl0ZW0gYmFja2dyb3VuZAorICAgICAgICAgICAgICAgIGltYWdlVmlldy5zZXRCYWNrZ3JvdW5kUmVzb3VyY2UobUdhbGxlcnlJdGVtQmFja2dyb3VuZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltYWdlVmlldyA9IChJbWFnZVZpZXcpIGNvbnZlcnRWaWV3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWFnZVZpZXcuc2V0SW1hZ2VSZXNvdXJjZShtSW1hZ2VJZHNbcG9zaXRpb25dKTsKKworICAgICAgICAgICAgcmV0dXJuIGltYWdlVmlldzsKICAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKLQotICAgICAgICBwcml2YXRlIEludGVnZXJbXSBtSW1hZ2VJZHMgPSB7Ci0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzEsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzIsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzMsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzQsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzUsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzYsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzcsCi0gICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5nYWxsZXJ5X3Bob3RvXzgKLSAgICAgICAgfTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0dyaWQzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9HcmlkMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODUzZTEwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvR3JpZDMuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuQWN0aW9uTW9kZTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CYXNlQWRhcHRlcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5DaGVja2FibGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuR3JpZFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogVGhpcyBkZW1vIGlsbHVzdHJhdGVzIHRoZSB1c2Ugb2YgQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwsIGEuay5hLiBzZWxlY3Rpb24gbW9kZSBvbiBHcmlkVmlldy4KKyAqLworcHVibGljIGNsYXNzIEdyaWQzIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgR3JpZFZpZXcgbUdyaWQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgbG9hZEFwcHMoKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5ncmlkXzEpOworICAgICAgICBtR3JpZCA9IChHcmlkVmlldykgZmluZFZpZXdCeUlkKFIuaWQubXlHcmlkKTsKKyAgICAgICAgbUdyaWQuc2V0QWRhcHRlcihuZXcgQXBwc0FkYXB0ZXIoKSk7CisgICAgICAgIG1HcmlkLnNldENob2ljZU1vZGUoR3JpZFZpZXcuQ0hPSUNFX01PREVfTVVMVElQTEVfTU9EQUwpOworICAgICAgICBtR3JpZC5zZXRNdWx0aUNob2ljZU1vZGVMaXN0ZW5lcihuZXcgTXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFJlc29sdmVJbmZvPiBtQXBwczsKKworICAgIHByaXZhdGUgdm9pZCBsb2FkQXBwcygpIHsKKyAgICAgICAgSW50ZW50IG1haW5JbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fTUFJTiwgbnVsbCk7CisgICAgICAgIG1haW5JbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0xBVU5DSEVSKTsKKworICAgICAgICBtQXBwcyA9IGdldFBhY2thZ2VNYW5hZ2VyKCkucXVlcnlJbnRlbnRBY3Rpdml0aWVzKG1haW5JbnRlbnQsIDApOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBBcHBzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKKyAgICAgICAgcHVibGljIEFwcHNBZGFwdGVyKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBwYXJlbnQpIHsKKyAgICAgICAgICAgIENoZWNrYWJsZUxheW91dCBsOworICAgICAgICAgICAgSW1hZ2VWaWV3IGk7CisKKyAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaSA9IG5ldyBJbWFnZVZpZXcoR3JpZDMudGhpcyk7CisgICAgICAgICAgICAgICAgaS5zZXRTY2FsZVR5cGUoSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfQ0VOVEVSKTsKKyAgICAgICAgICAgICAgICBpLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcyg1MCwgNTApKTsKKyAgICAgICAgICAgICAgICBsID0gbmV3IENoZWNrYWJsZUxheW91dChHcmlkMy50aGlzKTsKKyAgICAgICAgICAgICAgICBsLnNldExheW91dFBhcmFtcyhuZXcgR3JpZFZpZXcuTGF5b3V0UGFyYW1zKEdyaWRWaWV3LkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBHcmlkVmlldy5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKSk7CisgICAgICAgICAgICAgICAgbC5hZGRWaWV3KGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsID0gKENoZWNrYWJsZUxheW91dCkgY29udmVydFZpZXc7CisgICAgICAgICAgICAgICAgaSA9IChJbWFnZVZpZXcpIGwuZ2V0Q2hpbGRBdCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVzb2x2ZUluZm8gaW5mbyA9IG1BcHBzLmdldChwb3NpdGlvbik7CisgICAgICAgICAgICBpLnNldEltYWdlRHJhd2FibGUoaW5mby5hY3Rpdml0eUluZm8ubG9hZEljb24oZ2V0UGFja2FnZU1hbmFnZXIoKSkpOworCisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQXBwcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gbUFwcHMuZ2V0KHBvc2l0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDaGVja2FibGVMYXlvdXQgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIENoZWNrYWJsZSB7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2hlY2tlZDsKKworICAgICAgICBwdWJsaWMgQ2hlY2thYmxlTGF5b3V0KENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgeworICAgICAgICAgICAgbUNoZWNrZWQgPSBjaGVja2VkOworICAgICAgICAgICAgc2V0QmFja2dyb3VuZERyYXdhYmxlKGNoZWNrZWQgPworICAgICAgICAgICAgICAgICAgICBnZXRSZXNvdXJjZXMoKS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmJsdWUpCisgICAgICAgICAgICAgICAgICAgIDogbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbUNoZWNrZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB0b2dnbGUoKSB7CisgICAgICAgICAgICBzZXRDaGVja2VkKCFtQ2hlY2tlZCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBNdWx0aUNob2ljZU1vZGVMaXN0ZW5lciBpbXBsZW1lbnRzIEdyaWRWaWV3Lk11bHRpQ2hvaWNlTW9kZUxpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICBtb2RlLnNldFRpdGxlKCJTZWxlY3QgSXRlbXMiKTsKKyAgICAgICAgICAgIG1vZGUuc2V0U3VidGl0bGUoIk9uZSBpdGVtIHNlbGVjdGVkIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLCBpbnQgcG9zaXRpb24sIGxvbmcgaWQsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBpbnQgc2VsZWN0Q291bnQgPSBtR3JpZC5nZXRDaGVja2VkSXRlbUNvdW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKHNlbGVjdENvdW50KSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiT25lIGl0ZW0gc2VsZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZSgiIiArIHNlbGVjdENvdW50ICsgIiBpdGVtcyBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTUuamF2YSBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3QxNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTU3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0MTUuamF2YQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLlI7CisKK2ltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC52aWV3LkFjdGlvbk1vZGU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnU7CitpbXBvcnQgYW5kcm9pZC52aWV3Lk1lbnVJbmZsYXRlcjsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuTWVudUl0ZW07CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQXJyYXlBZGFwdGVyOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRvYXN0OworCisvKioKKyAqIFRoaXMgZGVtbyBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIENIT0lDRV9NT0RFX01VTFRJUExFX01PREFMLCBhLmsuYS4gc2VsZWN0aW9uIG1vZGUgb24gTGlzdFZpZXcuCisgKi8KK3B1YmxpYyBjbGFzcyBMaXN0MTUgZXh0ZW5kcyBMaXN0QWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgTGlzdFZpZXcgbHYgPSBnZXRMaXN0VmlldygpOworICAgICAgICBsdi5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX01VTFRJUExFX01PREFMKTsKKyAgICAgICAgbHYuc2V0TXVsdGlDaG9pY2VNb2RlTGlzdGVuZXIobmV3IE1vZGVDYWxsYmFjaygpKTsKKyAgICAgICAgc2V0TGlzdEFkYXB0ZXIobmV3IEFycmF5QWRhcHRlcjxTdHJpbmc+KHRoaXMsCisgICAgICAgICAgICAgICAgYW5kcm9pZC5SLmxheW91dC5zaW1wbGVfbGlzdF9pdGVtX2NoZWNrZWQsIG1TdHJpbmdzKSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdENyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uUG9zdENyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBnZXRBY3Rpb25CYXIoKS5zZXRTdWJ0aXRsZSgiTG9uZyBwcmVzcyB0byBzdGFydCBzZWxlY3Rpb24iKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBjbGFzcyBNb2RlQ2FsbGJhY2sgaW1wbGVtZW50cyBMaXN0Vmlldy5NdWx0aUNob2ljZU1vZGVMaXN0ZW5lciB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVBY3Rpb25Nb2RlKEFjdGlvbk1vZGUgbW9kZSwgTWVudSBtZW51KSB7CisgICAgICAgICAgICBNZW51SW5mbGF0ZXIgaW5mbGF0ZXIgPSBnZXRNZW51SW5mbGF0ZXIoKTsKKyAgICAgICAgICAgIGluZmxhdGVyLmluZmxhdGUoUi5tZW51Lmxpc3Rfc2VsZWN0X21lbnUsIG1lbnUpOworICAgICAgICAgICAgbW9kZS5zZXRUaXRsZSgiU2VsZWN0IEl0ZW1zIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZUFjdGlvbk1vZGUoQWN0aW9uTW9kZSBtb2RlLCBNZW51IG1lbnUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb25BY3Rpb25JdGVtQ2xpY2tlZChBY3Rpb25Nb2RlIG1vZGUsIE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworICAgICAgICAgICAgY2FzZSBSLmlkLnNoYXJlOgorICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KExpc3QxNS50aGlzLCAiU2hhcmVkICIgKyBnZXRMaXN0VmlldygpLmdldENoZWNrZWRJdGVtQ291bnQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiIGl0ZW1zIiwgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgbW9kZS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoTGlzdDE1LnRoaXMsICJDbGlja2VkICIgKyBpdGVtLmdldFRpdGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgb25EZXN0cm95QWN0aW9uTW9kZShBY3Rpb25Nb2RlIG1vZGUpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbUNoZWNrZWRTdGF0ZUNoYW5nZWQoQWN0aW9uTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwgbG9uZyBpZCwgYm9vbGVhbiBjaGVja2VkKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgY2hlY2tlZENvdW50ID0gZ2V0TGlzdFZpZXcoKS5nZXRDaGVja2VkSXRlbUNvdW50KCk7CisgICAgICAgICAgICBzd2l0Y2ggKGNoZWNrZWRDb3VudCkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgbW9kZS5zZXRTdWJ0aXRsZShudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCJPbmUgaXRlbSBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBtb2RlLnNldFN1YnRpdGxlKCIiICsgY2hlY2tlZENvdW50ICsgIiBpdGVtcyBzZWxlY3RlZCIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIG1TdHJpbmdzID0geworICAgICAgICAgICAgIkFiYmF5ZSBkZSBCZWxsb2MiLCAiQWJiYXllIGR1IE1vbnQgZGVzIENhdHMiLCAiQWJlcnRhbSIsICJBYm9uZGFuY2UiLCAiQWNrYXdpIiwKKyAgICAgICAgICAgICJBY29ybiIsICJBZGVsb3N0IiwgIkFmZmlkZWxpY2UgYXUgQ2hhYmxpcyIsICJBZnVlZ2EnbCBQaXR1IiwgIkFpcmFnIiwgIkFpcmVkYWxlIiwKKyAgICAgICAgICAgICJBaXN5IENlbmRyZSIsICJBbGxnYXVlciBFbW1lbnRhbGVyIiwgIkFsdmVyY2EiLCAiQW1iZXJ0IiwgIkFtZXJpY2FuIENoZWVzZSIsCisgICAgICAgICAgICAiQW1pIGR1IENoYW1iZXJ0aW4iLCAiQW5lam8gRW5jaGlsYWRvIiwgIkFubmVhdSBkdSBWaWMtQmlsaCIsICJBbnRob3Jpcm8iLCAiQXBwZW56ZWxsIiwKKyAgICAgICAgICAgICJBcmFnb24iLCAiQXJkaSBHYXNuYSIsICJBcmRyYWhhbiIsICJBcm1lbmlhbiBTdHJpbmciLCAiQXJvbWVzIGF1IEdlbmUgZGUgTWFyYyIsCisgICAgICAgICAgICAiQXNhZGVybyIsICJBc2lhZ28iLCAiQXViaXNxdWUgUHlyZW5lZXMiLCAiQXV0dW4iLCAiQXZheHRza3lyIiwgIkJhYnkgU3dpc3MiLAorICAgICAgICAgICAgIkJhYnliZWwiLCAiQmFndWV0dGUgTGFvbm5haXNlIiwgIkJha2VycyIsICJCYWxhZGkiLCAiQmFsYXRvbiIsICJCYW5kYWwiLCAiQmFub24iLAorICAgICAgICAgICAgIkJhcnJ5J3MgQmF5IENoZWRkYXIiLCAiQmFzaW5nIiwgIkJhc2tldCBDaGVlc2UiLCAiQmF0aCBDaGVlc2UiLCAiQmF2YXJpYW4gQmVyZ2thc2UiLAorICAgICAgICAgICAgIkJheWxvdWdoIiwgIkJlYXVmb3J0IiwgIkJlYXV2b29yZGUiLCAiQmVlbmxlaWdoIEJsdWUiLCAiQmVlciBDaGVlc2UiLCAiQmVsIFBhZXNlIiwKKyAgICAgICAgICAgICJCZXJnYWRlciIsICJCZXJnZXJlIEJsZXVlIiwgIkJlcmtzd2VsbCIsICJCZXlheiBQZXluaXIiLCAiQmllcmthc2UiLCAiQmlzaG9wIEtlbm5lZHkiLAorICAgICAgICAgICAgIkJsYXJuZXkiLCAiQmxldSBkJ0F1dmVyZ25lIiwgIkJsZXUgZGUgR2V4IiwgIkJsZXUgZGUgTGFxdWV1aWxsZSIsCisgICAgICAgICAgICAiQmxldSBkZSBTZXB0bW9uY2VsIiwgIkJsZXUgRGVzIENhdXNzZXMiLCAiQmx1ZSIsICJCbHVlIENhc3RlbGxvIiwgIkJsdWUgUmF0aGdvcmUiLAorICAgICAgICAgICAgIkJsdWUgVmVpbiAoQXVzdHJhbGlhbikiLCAiQmx1ZSBWZWluIENoZWVzZXMiLCAiQm9jY29uY2luaSIsICJCb2Njb25jaW5pIChBdXN0cmFsaWFuKSIsCisgICAgICAgICAgICAiQm9lcmVuIExlaWRlbmthYXMiLCAiQm9uY2hlc3RlciIsICJCb3N3b3J0aCIsICJCb3Vnb24iLCAiQm91bGUgRHUgUm92ZXMiLAorICAgICAgICAgICAgIkJvdWxldHRlIGQnQXZlc25lcyIsICJCb3Vyc2F1bHQiLCAiQm91cnNpbiIsICJCb3V5c3NvdSIsICJCcmEiLCAiQnJhdWRvc3R1ciIsCisgICAgICAgICAgICAiQnJlYWtmYXN0IENoZWVzZSIsICJCcmViaXMgZHUgTGF2b3J0IiwgIkJyZWJpcyBkdSBMb2Nob2lzIiwgIkJyZWJpcyBkdSBQdXlmYXVjb24iLAorICAgICAgICAgICAgIkJyZXNzZSBCbGV1IiwgIkJyaWNrIiwgIkJyaWUiLCAiQnJpZSBkZSBNZWF1eCIsICJCcmllIGRlIE1lbHVuIiwgIkJyaWxsYXQtU2F2YXJpbiIsCisgICAgICAgICAgICAiQnJpbiIsICJCcmluIGQnIEFtb3VyIiwgIkJyaW4gZCdBbW91ciIsICJCcmluemEgKEJ1cmR1ZiBCcmluemEpIiwKKyAgICAgICAgICAgICJCcmlxdWV0dGUgZGUgQnJlYmlzIiwgIkJyaXF1ZXR0ZSBkdSBGb3JleiIsICJCcm9jY2lvIiwgIkJyb2NjaW8gRGVtaS1BZmZpbmUiLAorICAgICAgICAgICAgIkJyb3Vzc2UgZHUgUm92ZSIsICJCcnVkZXIgQmFzaWwiLCAiQnJ1c3NlbGFlIEthYXMgKEZyb21hZ2UgZGUgQnJ1eGVsbGVzKSIsICJCcnluZHphIiwKKyAgICAgICAgICAgICJCdWNoZXR0ZSBkJ0Fuam91IiwgIkJ1ZmZhbG8iLCAiQnVyZ29zIiwgIkJ1dHRlIiwgIkJ1dHRlcmthc2UiLCAiQnV0dG9uIChJbm5lcykiLAorICAgICAgICAgICAgIkJ1eHRvbiBCbHVlIiwgIkNhYmVjb3UiLCAiQ2Fib2MiLCAiQ2FicmFsZXMiLCAiQ2FjaGFpbGxlIiwgIkNhY2lvY2F2YWxsbyIsICJDYWNpb3R0YSIsCisgICAgICAgICAgICAiQ2FlcnBoaWxseSIsICJDYWlybnNtb3JlIiwgIkNhbGVuemFuYSIsICJDYW1iYXpvbGEiLCAiQ2FtZW1iZXJ0IGRlIE5vcm1hbmRpZSIsCisgICAgICAgICAgICAiQ2FuYWRpYW4gQ2hlZGRhciIsICJDYW5lc3RyYXRvIiwgIkNhbnRhbCIsICJDYXByaWNlIGRlcyBEaWV1eCIsICJDYXByaWNvcm4gR29hdCIsCisgICAgICAgICAgICAiQ2FwcmlvbGUgQmFub24iLCAiQ2FycmUgZGUgbCdFc3QiLCAiQ2FzY2lvdHRhIGRpIFVyYmlubyIsICJDYXNoZWwgQmx1ZSIsICJDYXN0ZWxsYW5vIiwKKyAgICAgICAgICAgICJDYXN0ZWxsZW5vIiwgIkNhc3RlbG1hZ25vIiwgIkNhc3RlbG8gQnJhbmNvIiwgIkNhc3RpZ2xpYW5vIiwgIkNhdGhlbGFpbiIsCisgICAgICAgICAgICAiQ2VsdGljIFByb21pc2UiLCAiQ2VuZHJlIGQnT2xpdmV0IiwgIkNlcm5leSIsICJDaGFiaWNob3UiLCAiQ2hhYmljaG91IGR1IFBvaXRvdSIsCisgICAgICAgICAgICAiQ2hhYmlzIGRlIEdhdGluZSIsICJDaGFvdXJjZSIsICJDaGFyb2xhaXMiLCAiQ2hhdW1lcyIsICJDaGVkZGFyIiwKKyAgICAgICAgICAgICJDaGVkZGFyIENsb3RoYm91bmQiLCAiQ2hlc2hpcmUiLCAiQ2hldnJlcyIsICJDaGV2cm90aW4gZGVzIEFyYXZpcyIsICJDaG9udGFsZW5vIiwKKyAgICAgICAgICAgICJDaXZyYXkiLCAiQ29ldXIgZGUgQ2FtZW1iZXJ0IGF1IENhbHZhZG9zIiwgIkNvZXVyIGRlIENoZXZyZSIsICJDb2xieSIsICJDb2xkIFBhY2siLAorICAgICAgICAgICAgIkNvbXRlIiwgIkNvb2xlYSIsICJDb29sZW5leSIsICJDb3F1ZXRkYWxlIiwgIkNvcmxlZ2d5IiwgIkNvcm5pc2ggUGVwcGVyIiwKKyAgICAgICAgICAgICJDb3RoZXJzdG9uZSIsICJDb3RpamEiLCAiQ290dGFnZSBDaGVlc2UiLCAiQ290dGFnZSBDaGVlc2UgKEF1c3RyYWxpYW4pIiwKKyAgICAgICAgICAgICJDb3VnYXIgR29sZCIsICJDb3Vsb21taWVycyIsICJDb3ZlcmRhbGUiLCAiQ3JheWV1eCBkZSBSb25jcSIsICJDcmVhbSBDaGVlc2UiLAorICAgICAgICAgICAgIkNyZWFtIEhhdmFydGkiLCAiQ3JlbWEgQWdyaWEiLCAiQ3JlbWEgTWV4aWNhbmEiLCAiQ3JlbWUgRnJhaWNoZSIsICJDcmVzY2VuemEiLAorICAgICAgICAgICAgIkNyb2doYW4iLCAiQ3JvdHRpbiBkZSBDaGF2aWdub2wiLCAiQ3JvdHRpbiBkdSBDaGF2aWdub2wiLCAiQ3Jvd2RpZSIsICJDcm93bGV5IiwKKyAgICAgICAgICAgICJDdWFqYWRhIiwgIkN1cmQiLCAiQ3VyZSBOYW50YWlzIiwgIkN1cndvcnRoeSIsICJDd210YXdlIFBlY29yaW5vIiwKKyAgICAgICAgICAgICJDeXByZXNzIEdyb3ZlIENoZXZyZSIsICJEYW5hYmx1IChEYW5pc2ggQmx1ZSkiLCAiRGFuYm8iLCAiRGFuaXNoIEZvbnRpbmEiLAorICAgICAgICAgICAgIkRhcmFsYWdqYXpza3kiLCAiRGF1cGhpbiIsICJEZWxpY2UgZGVzIEZpb3V2ZXMiLCAiRGVuaGFueSBEb3JzZXQgRHJ1bSIsICJEZXJieSIsCisgICAgICAgICAgICAiRGVzc2VydG55aiBCZWx5aiIsICJEZXZvbiBCbHVlIiwgIkRldm9uIEdhcmxhbmQiLCAiRG9sY2VsYXR0ZSIsICJEb29saW4iLAorICAgICAgICAgICAgIkRvcHBlbHJoYW1zdHVmZWwiLCAiRG9yc2V0IEJsdWUgVmlubmV5IiwgIkRvdWJsZSBHbG91Y2VzdGVyIiwgIkRvdWJsZSBXb3JjZXN0ZXIiLAorICAgICAgICAgICAgIkRyZXV4IGEgbGEgRmV1aWxsZSIsICJEcnkgSmFjayIsICJEdWRkbGVzd2VsbCIsICJEdW5iYXJyYSIsICJEdW5sb3AiLCAiRHVuc3lyZSBCbHVlIiwKKyAgICAgICAgICAgICJEdXJvYmxhbmRvIiwgIkR1cnJ1cyIsICJEdXRjaCBNaW1vbGV0dGUgKENvbW1pc3NpZWthYXMpIiwgIkVkYW0iLCAiRWRlbHBpbHoiLAorICAgICAgICAgICAgIkVtZW50YWwgR3JhbmQgQ3J1IiwgIkVtbGV0dCIsICJFbW1lbnRhbCIsICJFcG9pc3NlcyBkZSBCb3VyZ29nbmUiLCAiRXNiYXJlaWNoIiwKKyAgICAgICAgICAgICJFc3JvbSIsICJFdG9ya2kiLCAiRXZhbnNkYWxlIEZhcm1ob3VzZSBCcmllIiwgIkV2b3JhIERlIEwnQWxlbnRlam8iLCAiRXhtb29yIEJsdWUiLAorICAgICAgICAgICAgIkV4cGxvcmF0ZXVyIiwgIkZldGEiLCAiRmV0YSAoQXVzdHJhbGlhbikiLCAiRmlndWUiLCAiRmlsZXR0YSIsICJGaW4tZGUtU2llY2xlIiwKKyAgICAgICAgICAgICJGaW5sYW5kaWEgU3dpc3MiLCAiRmlubiIsICJGaW9yZSBTYXJkbyIsICJGbGV1ciBkdSBNYXF1aXMiLCAiRmxvciBkZSBHdWlhIiwKKyAgICAgICAgICAgICJGbG93ZXIgTWFyaWUiLCAiRm9sZGVkIiwgIkZvbGRlZCBjaGVlc2Ugd2l0aCBtaW50IiwgIkZvbmRhbnQgZGUgQnJlYmlzIiwKKyAgICAgICAgICAgICJGb250YWluZWJsZWF1IiwgIkZvbnRhbCIsICJGb250aW5hIFZhbCBkJ0Fvc3RhIiwgIkZvcm1hZ2dpbyBkaSBjYXByYSIsICJGb3VnZXJ1cyIsCisgICAgICAgICAgICAiRm91ciBIZXJiIEdvdWRhIiwgIkZvdXJtZSBkJyBBbWJlcnQiLCAiRm91cm1lIGRlIEhhdXRlIExvaXJlIiwgIkZvdXJtZSBkZSBNb250YnJpc29uIiwKKyAgICAgICAgICAgICJGcmVzaCBKYWNrIiwgIkZyZXNoIE1venphcmVsbGEiLCAiRnJlc2ggUmljb3R0YSIsICJGcmVzaCBUcnVmZmxlcyIsICJGcmlib3VyZ2VvaXMiLAorICAgICAgICAgICAgIkZyaWVzZWthYXMiLCAiRnJpZXNpYW4iLCAiRnJpZXNsYSIsICJGcmluYXVsdCIsICJGcm9tYWdlIGEgUmFjbGV0dGUiLCAiRnJvbWFnZSBDb3JzZSIsCisgICAgICAgICAgICAiRnJvbWFnZSBkZSBNb250YWduZSBkZSBTYXZvaWUiLCAiRnJvbWFnZSBGcmFpcyIsICJGcnVpdCBDcmVhbSBDaGVlc2UiLAorICAgICAgICAgICAgIkZyeWluZyBDaGVlc2UiLCAiRnluYm8iLCAiR2FicmllbCIsICJHYWxldHRlIGR1IFBhbHVkaWVyIiwgIkdhbGV0dGUgTHlvbm5haXNlIiwKKyAgICAgICAgICAgICJHYWxsb3dheSBHb2F0J3MgTWlsayBHZW1zIiwgIkdhbW1lbG9zdCIsICJHYXBlcm9uIGEgbCdBaWwiLCAiR2Fycm90eGEiLCAiR2FzdGFuYmVycmEiLAorICAgICAgICAgICAgIkdlaXRvc3QiLCAiR2lwcHNsYW5kIEJsdWUiLCAiR2pldG9zdCIsICJHbG91Y2VzdGVyIiwgIkdvbGRlbiBDcm9zcyIsICJHb3Jnb256b2xhIiwKKyAgICAgICAgICAgICJHb3JueWFsdGFqc2tpIiwgIkdvc3BlbCBHcmVlbiIsICJHb3VkYSIsICJHb3V0dSIsICJHb3dyaWUiLCAiR3JhYmV0dG8iLCAiR3JhZGRvc3QiLAorICAgICAgICAgICAgIkdyYWZ0b24gVmlsbGFnZSBDaGVkZGFyIiwgIkdyYW5hIiwgIkdyYW5hIFBhZGFubyIsICJHcmFuZCBWYXRlbCIsCisgICAgICAgICAgICAiR3JhdGFyb24gZCcgQXJlY2hlcyIsICJHcmF0dGUtUGFpbGxlIiwgIkdyYXZpZXJhIiwgIkdyZXVpbGgiLCAiR3JldmUiLAorICAgICAgICAgICAgIkdyaXMgZGUgTGlsbGUiLCAiR3J1eWVyZSIsICJHdWJiZWVuIiwgIkd1ZXJiaWdueSIsICJIYWxsb3VtaSIsCisgICAgICAgICAgICAiSGFsbG91bXkgKEF1c3RyYWxpYW4pIiwgIkhhbG91bWktU3R5bGUgQ2hlZXNlIiwgIkhhcmJvdXJuZSBCbHVlIiwgIkhhdmFydGkiLAorICAgICAgICAgICAgIkhlaWRpIEdydXllcmUiLCAiSGVyZWZvcmQgSG9wIiwgIkhlcnJnYXJkc29zdCIsICJIZXJyaW90IEZhcm1ob3VzZSIsICJIZXJ2ZSIsCisgICAgICAgICAgICAiSGlwaSBJdGkiLCAiSHViYmFyZHN0b24gQmx1ZSBDb3ciLCAiSHVzaGFsbHNvc3QiLCAiSWJlcmljbyIsICJJZGFobyBHb2F0c3RlciIsCisgICAgICAgICAgICAiSWRpYXphYmFsIiwgIklsIEJvc2NoZXR0byBhbCBUYXJ0dWZvIiwgIklsZSBkJ1lldSIsICJJc2xlIG9mIE11bGwiLCAiSmFybHNiZXJnIiwKKyAgICAgICAgICAgICJKZXJtaSBUb3J0ZXMiLCAiSmlibmVoIEFyYWJpZWgiLCAiSmluZGkgQnJpZSIsICJKdWJpbGVlIEJsdWUiLCAiSnV1c3RvbGVpcGEiLAorICAgICAgICAgICAgIkthZGNoZ2FsbCIsICJLYXNlcmkiLCAiS2FzaHRhIiwgIktlZmFsb3R5cmkiLCAiS2VuYWZhIiwgIktlcm5oZW0iLCAiS2VydmVsbGEgQWZmaW5lIiwKKyAgICAgICAgICAgICJLaWtvcmFuZ2kiLCAiS2luZyBJc2xhbmQgQ2FwZSBXaWNraGFtIEJyaWUiLCAiS2luZyBSaXZlciBHb2xkIiwgIktsb3N0ZXJrYWVzZSIsCisgICAgICAgICAgICAiS25vY2thbGFyYSIsICJLdWdlbGthc2UiLCAiTCdBdmV5cm9ubmFpcyIsICJMJ0VjaXIgZGUgbCdBdWJyYWMiLCAiTGEgVGF1cGluaWVyZSIsCisgICAgICAgICAgICAiTGEgVmFjaGUgUXVpIFJpdCIsICJMYWd1aW9sZSIsICJMYWlyb2JlbGwiLCAiTGFqdGEiLCAiTGFuYXJrIEJsdWUiLCAiTGFuY2FzaGlyZSIsCisgICAgICAgICAgICAiTGFuZ3JlcyIsICJMYXBwaSIsICJMYXJ1bnMiLCAiTGF2aXN0b3duIiwgIkxlIEJyaW4iLCAiTGUgRml1bSBPcmJvIiwgIkxlIExhY2FuZG91IiwKKyAgICAgICAgICAgICJMZSBSb3VsZSIsICJMZWFmaWVsZCIsICJMZWJiZW5lIiwgIkxlZXJkYW1tZXIiLCAiTGVpY2VzdGVyIiwgIkxleWRlbiIsICJMaW1idXJnZXIiLAorICAgICAgICAgICAgIkxpbmNvbG5zaGlyZSBQb2FjaGVyIiwgIkxpbmdvdCBTYWludCBCb3VzcXVldCBkJ09yYiIsICJMaXB0YXVlciIsICJMaXR0bGUgUnlkaW5ncyIsCisgICAgICAgICAgICAiTGl2YXJvdCIsICJMbGFuYm9pZHkiLCAiTGxhbmdsb2ZhbiBGYXJtaG91c2UiLCAiTG9jaCBBcnRodXIgRmFybWhvdXNlIiwKKyAgICAgICAgICAgICJMb2RkaXN3ZWxsIEF2b25kYWxlIiwgIkxvbmdob3JuIiwgIkxvdSBQYWxvdSIsICJMb3UgUGV2cmUiLCAiTHlvbm5haXMiLCAiTWFhc2RhbSIsCisgICAgICAgICAgICAiTWFjY29uYWlzIiwgIk1haG9lIEFnZWQgR291ZGEiLCAiTWFob24iLCAiTWFsdmVybiIsICJNYW1pcm9sbGUiLCAiTWFuY2hlZ28iLAorICAgICAgICAgICAgIk1hbm91cmkiLCAiTWFudXIiLCAiTWFyYmxlIENoZWRkYXIiLCAiTWFyYmxlZCBDaGVlc2VzIiwgIk1hcmVkc291cyIsICJNYXJnb3RpbiIsCisgICAgICAgICAgICAiTWFyaWJvIiwgIk1hcm9pbGxlcyIsICJNYXNjYXJlcyIsICJNYXNjYXJwb25lIiwgIk1hc2NhcnBvbmUgKEF1c3RyYWxpYW4pIiwKKyAgICAgICAgICAgICJNYXNjYXJwb25lIFRvcnRhIiwgIk1hdG9jcSIsICJNYXl0YWcgQmx1ZSIsICJNZWlyYSIsICJNZW5hbGxhY2sgRmFybWhvdXNlIiwKKyAgICAgICAgICAgICJNZW5vbml0YSIsICJNZXJlZGl0aCBCbHVlIiwgIk1lc29zdCIsICJNZXR0b24gKENhbmNvaWxsb3R0ZSkiLCAiTWV5ZXIgVmludGFnZSBHb3VkYSIsCisgICAgICAgICAgICAiTWloYWxpYyBQZXluaXIiLCAiTWlsbGVlbnMiLCAiTWltb2xldHRlIiwgIk1pbmUtR2FiaGFyIiwgIk1pbmkgQmFieSBCZWxscyIsICJNaXh0ZSIsCisgICAgICAgICAgICAiTW9sYm8iLCAiTW9uYXN0ZXJ5IENoZWVzZXMiLCAiTW9uZHNlZXIiLCAiTW9udCBEJ29yIEx5b25uYWlzIiwgIk1vbnRhc2lvIiwKKyAgICAgICAgICAgICJNb250ZXJleSBKYWNrIiwgIk1vbnRlcmV5IEphY2sgRHJ5IiwgIk1vcmJpZXIiLCAiTW9yYmllciBDcnUgZGUgTW9udGFnbmUiLAorICAgICAgICAgICAgIk1vdGhhaXMgYSBsYSBGZXVpbGxlIiwgIk1venphcmVsbGEiLCAiTW96emFyZWxsYSAoQXVzdHJhbGlhbikiLAorICAgICAgICAgICAgIk1venphcmVsbGEgZGkgQnVmYWxhIiwgIk1venphcmVsbGEgRnJlc2gsIGluIHdhdGVyIiwgIk1venphcmVsbGEgUm9sbHMiLCAiTXVuc3RlciIsCisgICAgICAgICAgICAiTXVyb2wiLCAiTXljZWxsYSIsICJNeXppdGhyYSIsICJOYWJvdWxzaSIsICJOYW50YWlzIiwgIk5ldWZjaGF0ZWwiLAorICAgICAgICAgICAgIk5ldWZjaGF0ZWwgKEF1c3RyYWxpYW4pIiwgIk5pb2xvIiwgIk5va2tlbG9zdCIsICJOb3J0aHVtYmVybGFuZCIsICJPYXhhY2EiLAorICAgICAgICAgICAgIk9sZGUgWW9yayIsICJPbGl2ZXQgYXUgRm9pbiIsICJPbGl2ZXQgQmxldSIsICJPbGl2ZXQgQ2VuZHJlIiwKKyAgICAgICAgICAgICJPcmtuZXkgRXh0cmEgTWF0dXJlIENoZWRkYXIiLCAiT3JsYSIsICJPc2NodGplcGthIiwgIk9zc2F1IEZlcm1pZXIiLCAiT3NzYXUtSXJhdHkiLAorICAgICAgICAgICAgIk9zemN6eXBlayIsICJPeGZvcmQgQmx1ZSIsICJQJ3RpdCBCZXJyaWNob24iLCAiUGFsZXQgZGUgQmFibGlnbnkiLCAiUGFuZWVyIiwgIlBhbmVsYSIsCisgICAgICAgICAgICAiUGFubmVyb25lIiwgIlBhbnQgeXMgR2F3biIsICJQYXJtZXNhbiAoUGFybWlnaWFubykiLCAiUGFybWlnaWFubyBSZWdnaWFubyIsCisgICAgICAgICAgICAiUGFzIGRlIGwnRXNjYWxldHRlIiwgIlBhc3NlbmRhbGUiLCAiUGFzdGV1cml6ZWQgUHJvY2Vzc2VkIiwgIlBhdGUgZGUgRnJvbWFnZSIsCisgICAgICAgICAgICAiUGF0ZWZpbmUgRm9ydCIsICJQYXZlIGQnQWZmaW5vaXMiLCAiUGF2ZSBkJ0F1Z2UiLCAiUGF2ZSBkZSBDaGlyYWMiLCAiUGF2ZSBkdSBCZXJyeSIsCisgICAgICAgICAgICAiUGVjb3Jpbm8iLCAiUGVjb3Jpbm8gaW4gV2FsbnV0IExlYXZlcyIsICJQZWNvcmlubyBSb21hbm8iLCAiUGVla3NraWxsIFB5cmFtaWQiLAorICAgICAgICAgICAgIlBlbGFyZG9uIGRlcyBDZXZlbm5lcyIsICJQZWxhcmRvbiBkZXMgQ29yYmllcmVzIiwgIlBlbmFtZWxsZXJhIiwgIlBlbmJyeW4iLAorICAgICAgICAgICAgIlBlbmNhcnJlZyIsICJQZXJhaWwgZGUgQnJlYmlzIiwgIlBldGl0IE1vcmluIiwgIlBldGl0IFBhcmRvdSIsICJQZXRpdC1TdWlzc2UiLAorICAgICAgICAgICAgIlBpY29kb24gZGUgQ2hldnJlIiwgIlBpY29zIGRlIEV1cm9wYSIsICJQaW9yYSIsICJQaXRodHZpZXJzIGF1IEZvaW4iLAorICAgICAgICAgICAgIlBsYXRlYXUgZGUgSGVydmUiLCAiUGx5bW91dGggQ2hlZXNlIiwgIlBvZGhhbGFuc2tpIiwgIlBvaXZyZSBkJ0FuZSIsICJQb2xrb2xiaW4iLAorICAgICAgICAgICAgIlBvbnQgbCdFdmVxdWUiLCAiUG9ydCBOaWNob2xzb24iLCAiUG9ydC1TYWx1dCIsICJQb3N0ZWwiLCAiUG91bGlnbnktU2FpbnQtUGllcnJlIiwKKyAgICAgICAgICAgICJQb3VybHkiLCAiUHJhc3Rvc3QiLCAiUHJlc3NhdG8iLCAiUHJpbmNlLUplYW4iLCAiUHJvY2Vzc2VkIENoZWRkYXIiLCAiUHJvdm9sb25lIiwKKyAgICAgICAgICAgICJQcm92b2xvbmUgKEF1c3RyYWxpYW4pIiwgIlB5ZW5nYW5hIENoZWRkYXIiLCAiUHlyYW1pZGUiLCAiUXVhcmsiLAorICAgICAgICAgICAgIlF1YXJrIChBdXN0cmFsaWFuKSIsICJRdWFydGlyb2xvIExvbWJhcmRvIiwgIlF1YXRyZS1WZW50cyIsICJRdWVyY3kgUGV0aXQiLAorICAgICAgICAgICAgIlF1ZXNvIEJsYW5jbyIsICJRdWVzbyBCbGFuY28gY29uIEZydXRhcyAtLVBpbmEgeSBNYW5nbyIsICJRdWVzbyBkZSBNdXJjaWEiLAorICAgICAgICAgICAgIlF1ZXNvIGRlbCBNb250c2VjIiwgIlF1ZXNvIGRlbCBUaWV0YXIiLCAiUXVlc28gRnJlc2NvIiwgIlF1ZXNvIEZyZXNjbyAoQWRvYmVyYSkiLAorICAgICAgICAgICAgIlF1ZXNvIEliZXJpY28iLCAiUXVlc28gSmFsYXBlbm8iLCAiUXVlc28gTWFqb3Jlcm8iLCAiUXVlc28gTWVkaWEgTHVuYSIsCisgICAgICAgICAgICAiUXVlc28gUGFyYSBGcmllciIsICJRdWVzbyBRdWVzYWRpbGxhIiwgIlJhYmFjYWwiLCAiUmFjbGV0dGUiLCAiUmFndXNhbm8iLCAiUmFzY2hlcmEiLAorICAgICAgICAgICAgIlJlYmxvY2hvbiIsICJSZWQgTGVpY2VzdGVyIiwgIlJlZ2FsIGRlIGxhIERvbWJlcyIsICJSZWdnaWFuaXRvIiwgIlJlbWVkb3UiLAorICAgICAgICAgICAgIlJlcXVlc29uIiwgIlJpY2hlbGlldSIsICJSaWNvdHRhIiwgIlJpY290dGEgKEF1c3RyYWxpYW4pIiwgIlJpY290dGEgU2FsYXRhIiwgIlJpZGRlciIsCisgICAgICAgICAgICAiUmlnb3R0ZSIsICJSb2NhbWFkb3VyIiwgIlJvbGxvdCIsICJSb21hbm8iLCAiUm9tYW5zIFBhcnQgRGlldSIsICJSb25jYWwiLCAiUm9xdWVmb3J0IiwKKyAgICAgICAgICAgICJSb3VsZSIsICJSb3VsZWF1IERlIEJlYXVsaWV1IiwgIlJveWFscCBUaWxzaXQiLCAiUnViZW5zIiwgIlJ1c3RpbnUiLCAiU2FhbGFuZCBQZmFyciIsCisgICAgICAgICAgICAiU2FhbmVua2Flc2UiLCAiU2FnYSIsICJTYWdlIERlcmJ5IiwgIlNhaW50ZSBNYXVyZSIsICJTYWludC1NYXJjZWxsaW4iLAorICAgICAgICAgICAgIlNhaW50LU5lY3RhaXJlIiwgIlNhaW50LVBhdWxpbiIsICJTYWxlcnMiLCAiU2Ftc28iLCAiU2FuIFNpbW9uIiwgIlNhbmNlcnJlIiwKKyAgICAgICAgICAgICJTYXAgU2FnbyIsICJTYXJkbyIsICJTYXJkbyBFZ3lwdGlhbiIsICJTYnJpbnoiLCAiU2NhbW9yemEiLCAiU2NoYWJ6aWVnZXIiLCAiU2NobG9zcyIsCisgICAgICAgICAgICAiU2VsbGVzIHN1ciBDaGVyIiwgIlNlbHZhIiwgIlNlcmF0IiwgIlNlcmlvdXNseSBTdHJvbmcgQ2hlZGRhciIsICJTZXJyYSBkYSBFc3RyZWxhIiwKKyAgICAgICAgICAgICJTaGFycGFtIiwgIlNoZWxidXJuZSBDaGVkZGFyIiwgIlNocm9wc2hpcmUgQmx1ZSIsICJTaXJheiIsICJTaXJlbmUiLCAiU21va2VkIEdvdWRhIiwKKyAgICAgICAgICAgICJTb21lcnNldCBCcmllIiwgIlNvbm9tYSBKYWNrIiwgIlNvdHRvY2VuYXJlIGFsIFRhcnR1Zm8iLCAiU291bWFpbnRyYWluIiwKKyAgICAgICAgICAgICJTb3VyaXJlIExvemVyaWVuIiwgIlNwZW53b29kIiwgIlNyYWZmb3Jkc2hpcmUgT3JnYW5pYyIsICJTdC4gQWd1ciBCbHVlIENoZWVzZSIsCisgICAgICAgICAgICAiU3RpbHRvbiIsICJTdGlua2luZyBCaXNob3AiLCAiU3RyaW5nIiwgIlN1c3NleCBTbGlwY290ZSIsICJTdmVjaWFvc3QiLCAiU3dhbGVkYWxlIiwKKyAgICAgICAgICAgICJTd2VldCBTdHlsZSBTd2lzcyIsICJTd2lzcyIsICJTeXJpYW4gKEFybWVuaWFuIFN0cmluZykiLCAiVGFsYSIsICJUYWxlZ2dpbyIsICJUYW1pZSIsCisgICAgICAgICAgICAiVGFzbWFuaWEgSGlnaGxhbmQgQ2hldnJlIExvZyIsICJUYXVwaW5pZXJlIiwgIlRlaWZpIiwgIlRlbGVtZWEiLCAiVGVzdG91cmkiLAorICAgICAgICAgICAgIlRldGUgZGUgTW9pbmUiLCAiVGV0aWxsYSIsICJUZXhhcyBHb2F0IENoZWVzZSIsICJUaWJldCIsICJUaWxsYW1vb2sgQ2hlZGRhciIsCisgICAgICAgICAgICAiVGlsc2l0IiwgIlRpbWJvb24gQnJpZSIsICJUb21hIiwgIlRvbW1lIEJydWxlZSIsICJUb21tZSBkJ0Fib25kYW5jZSIsCisgICAgICAgICAgICAiVG9tbWUgZGUgQ2hldnJlIiwgIlRvbW1lIGRlIFJvbWFucyIsICJUb21tZSBkZSBTYXZvaWUiLCAiVG9tbWUgZGVzIENob3VhbnMiLCAiVG9tbWVzIiwKKyAgICAgICAgICAgICJUb3J0YSBkZWwgQ2FzYXIiLCAiVG9zY2FuZWxsbyIsICJUb3VyZWUgZGUgTCdBdWJpZXIiLCAiVG91cm1hbGV0IiwKKyAgICAgICAgICAgICJUcmFwcGUgKFZlcml0YWJsZSkiLCAiVHJvaXMgQ29ybmVzIERlIFZlbmRlZSIsICJUcm9uY2hvbiIsICJUcm91IGR1IENydSIsICJUcnVmZmUiLAorICAgICAgICAgICAgIlR1cGkiLCAiVHVydW5tYWEiLCAiVHltc2Jvcm8iLCAiVHluIEdydWciLCAiVHluaW5nIiwgIlVicmlhY28iLCAiVWxsb2EiLAorICAgICAgICAgICAgIlZhY2hlcmluLUZyaWJvdXJnZW9pcyIsICJWYWxlbmNheSIsICJWYXN0ZXJib3R0ZW5vc3QiLCAiVmVuYWNvIiwgIlZlbmRvbW9pcyIsCisgICAgICAgICAgICAiVmlldXggQ29yc2UiLCAiVmlnbm90dGUiLCAiVnVsc2NvbWJlIiwgIldhaW1hdGEgRmFybWhvdXNlIEJsdWUiLAorICAgICAgICAgICAgIldhc2hlZCBSaW5kIENoZWVzZSAoQXVzdHJhbGlhbikiLCAiV2F0ZXJsb28iLCAiV2VpY2hrYWVzZSIsICJXZWxsaW5ndG9uIiwKKyAgICAgICAgICAgICJXZW5zbGV5ZGFsZSIsICJXaGl0ZSBTdGlsdG9uIiwgIldoaXRlc3RvbmUgRmFybWhvdXNlIiwgIldpZ21vcmUiLCAiV29vZHNpZGUgQ2FiZWNvdSIsCisgICAgICAgICAgICAiWGFuYWR1IiwgIlh5bm90eXJvIiwgIllhcmcgQ29ybmlzaCIsICJZYXJyYSBWYWxsZXkgUHlyYW1pZCIsICJZb3Jrc2hpcmUgQmx1ZSIsCisgICAgICAgICAgICAiWmFtb3Jhbm8iLCAiWmFuZXR0aSBHcmFuYSBQYWRhbm8iLCAiWmFuZXR0aSBQYXJtaWdpYW5vIFJlZ2dpYW5vIn07CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q0LmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9MaXN0NC5qYXZhCmluZGV4IGExNDBlNjAuLjljMThhNWQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L0xpc3Q0LmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvTGlzdDQuamF2YQpAQCAtMTYsOCArMTYsOCBAQAogCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy52aWV3OwogCi0vL05lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcwotLy9jbGFzcyBpcyBpbiBhIHN1Yi1wYWNrYWdlLgoraW1wb3J0IGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpcy5TaGFrZXNwZWFyZTsKKwogaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICogQHNlZSBhbmRyb2lkLndpZGdldC5MaXN0QWRhcHRlciNnZXRDb3VudCgpCiAgICAgICAgICAqLwogICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1UaXRsZXMubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIFNoYWtlc3BlYXJlLlRJVExFUy5sZW5ndGg7CiAgICAgICAgIH0KIAogICAgICAgICAvKioKQEAgLTkyLDEyICs5MiwxMiBAQAogICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewogICAgICAgICAgICAgU3BlZWNoVmlldyBzdjsKICAgICAgICAgICAgIGlmIChjb252ZXJ0VmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3YgPSBuZXcgU3BlZWNoVmlldyhtQ29udGV4dCwgbVRpdGxlc1twb3NpdGlvbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBtRGlhbG9ndWVbcG9zaXRpb25dKTsKKyAgICAgICAgICAgICAgICBzdiA9IG5ldyBTcGVlY2hWaWV3KG1Db250ZXh0LCBTaGFrZXNwZWFyZS5USVRMRVNbcG9zaXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgU2hha2VzcGVhcmUuRElBTE9HVUVbcG9zaXRpb25dKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc3YgPSAoU3BlZWNoVmlldykgY29udmVydFZpZXc7Ci0gICAgICAgICAgICAgICAgc3Yuc2V0VGl0bGUobVRpdGxlc1twb3NpdGlvbl0pOwotICAgICAgICAgICAgICAgIHN2LnNldERpYWxvZ3VlKG1EaWFsb2d1ZVtwb3NpdGlvbl0pOworICAgICAgICAgICAgICAgIHN2LnNldFRpdGxlKFNoYWtlc3BlYXJlLlRJVExFU1twb3NpdGlvbl0pOworICAgICAgICAgICAgICAgIHN2LnNldERpYWxvZ3VlKFNoYWtlc3BlYXJlLkRJQUxPR1VFW3Bvc2l0aW9uXSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiBzdjsKQEAgLTEwNywyMjYgKzEwNyw2IEBACiAgICAgICAgICAqIFJlbWVtYmVyIG91ciBjb250ZXh0IHNvIHdlIGNhbiB1c2UgaXQgd2hlbiBjb25zdHJ1Y3Rpbmcgdmlld3MuCiAgICAgICAgICAqLwogICAgICAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgICAgIAotICAgICAgICAvKioKLSAgICAgICAgICogT3VyIGRhdGEsIHBhcnQgMS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gbVRpdGxlcyA9IAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIkhlbnJ5IElWICgxKSIsICAgCi0gICAgICAgICAgICAgICAgIkhlbnJ5IFYiLAotICAgICAgICAgICAgICAgICJIZW5yeSBWSUlJIiwgICAgICAgCi0gICAgICAgICAgICAgICAgIlJpY2hhcmQgSUkiLAotICAgICAgICAgICAgICAgICJSaWNoYXJkIElJSSIsCi0gICAgICAgICAgICAgICAgIk1lcmNoYW50IG9mIFZlbmljZSIsICAKLSAgICAgICAgICAgICAgICAiT3RoZWxsbyIsCi0gICAgICAgICAgICAgICAgIktpbmcgTGVhciIKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIC8qKgotICAgICAgICAgKiBPdXIgZGF0YSwgcGFydCAyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBtRGlhbG9ndWUgPSAKLSAgICAgICAgewotICAgICAgICAgICAgICAgICJTbyBzaGFrZW4gYXMgd2UgYXJlLCBzbyB3YW4gd2l0aCBjYXJlLCIgKwotICAgICAgICAgICAgICAgICJGaW5kIHdlIGEgdGltZSBmb3IgZnJpZ2h0ZWQgcGVhY2UgdG8gcGFudCwiICsKLSAgICAgICAgICAgICAgICAiQW5kIGJyZWF0aGUgc2hvcnQtd2luZGVkIGFjY2VudHMgb2YgbmV3IGJyb2lscyIgKwotICAgICAgICAgICAgICAgICJUbyBiZSBjb21tZW5jZWQgaW4gc3RyYW5kcyBhZmFyIHJlbW90ZS4iICsKLSAgICAgICAgICAgICAgICAiTm8gbW9yZSB0aGUgdGhpcnN0eSBlbnRyYW5jZSBvZiB0aGlzIHNvaWwiICsKLSAgICAgICAgICAgICAgICAiU2hhbGwgZGF1YiBoZXIgbGlwcyB3aXRoIGhlciBvd24gY2hpbGRyZW4ncyBibG9vZDsiICsKLSAgICAgICAgICAgICAgICAiTm9yIG1vcmUgc2hhbGwgdHJlbmNoaW5nIHdhciBjaGFubmVsIGhlciBmaWVsZHMsIiArCi0gICAgICAgICAgICAgICAgIk5vciBicnVpc2UgaGVyIGZsb3dlcmV0cyB3aXRoIHRoZSBhcm1lZCBob29mcyIgKwotICAgICAgICAgICAgICAgICJPZiBob3N0aWxlIHBhY2VzOiB0aG9zZSBvcHBvc2VkIGV5ZXMsIiArCi0gICAgICAgICAgICAgICAgIldoaWNoLCBsaWtlIHRoZSBtZXRlb3JzIG9mIGEgdHJvdWJsZWQgaGVhdmVuLCIgKwotICAgICAgICAgICAgICAgICJBbGwgb2Ygb25lIG5hdHVyZSwgb2Ygb25lIHN1YnN0YW5jZSBicmVkLCIgKwotICAgICAgICAgICAgICAgICJEaWQgbGF0ZWx5IG1lZXQgaW4gdGhlIGludGVzdGluZSBzaG9jayIgKwotICAgICAgICAgICAgICAgICJBbmQgZnVyaW91cyBjbG9zZSBvZiBjaXZpbCBidXRjaGVyeSIgKwotICAgICAgICAgICAgICAgICJTaGFsbCBub3csIGluIG11dHVhbCB3ZWxsLWJlc2VlbWluZyByYW5rcywiICsKLSAgICAgICAgICAgICAgICAiTWFyY2ggYWxsIG9uZSB3YXkgYW5kIGJlIG5vIG1vcmUgb3Bwb3NlZCIgKwotICAgICAgICAgICAgICAgICJBZ2FpbnN0IGFjcXVhaW50YW5jZSwga2luZHJlZCBhbmQgYWxsaWVzOiIgKwotICAgICAgICAgICAgICAgICJUaGUgZWRnZSBvZiB3YXIsIGxpa2UgYW4gaWxsLXNoZWF0aGVkIGtuaWZlLCIgKwotICAgICAgICAgICAgICAgICJObyBtb3JlIHNoYWxsIGN1dCBoaXMgbWFzdGVyLiBUaGVyZWZvcmUsIGZyaWVuZHMsIiArCi0gICAgICAgICAgICAgICAgIkFzIGZhciBhcyB0byB0aGUgc2VwdWxjaHJlIG9mIENocmlzdCwiICsKLSAgICAgICAgICAgICAgICAiV2hvc2Ugc29sZGllciBub3csIHVuZGVyIHdob3NlIGJsZXNzZWQgY3Jvc3MiICsKLSAgICAgICAgICAgICAgICAiV2UgYXJlIGltcHJlc3NlZCBhbmQgZW5nYWdlZCB0byBmaWdodCwiICsKLSAgICAgICAgICAgICAgICAiRm9ydGh3aXRoIGEgcG93ZXIgb2YgRW5nbGlzaCBzaGFsbCB3ZSBsZXZ5OyIgKwotICAgICAgICAgICAgICAgICJXaG9zZSBhcm1zIHdlcmUgbW91bGRlZCBpbiB0aGVpciBtb3RoZXJzJyB3b21iIiArCi0gICAgICAgICAgICAgICAgIlRvIGNoYXNlIHRoZXNlIHBhZ2FucyBpbiB0aG9zZSBob2x5IGZpZWxkcyIgKwotICAgICAgICAgICAgICAgICJPdmVyIHdob3NlIGFjcmVzIHdhbGsnZCB0aG9zZSBibGVzc2VkIGZlZXQiICsKLSAgICAgICAgICAgICAgICAiV2hpY2ggZm91cnRlZW4gaHVuZHJlZCB5ZWFycyBhZ28gd2VyZSBuYWlsJ2QiICsKLSAgICAgICAgICAgICAgICAiRm9yIG91ciBhZHZhbnRhZ2Ugb24gdGhlIGJpdHRlciBjcm9zcy4iICsKLSAgICAgICAgICAgICAgICAiQnV0IHRoaXMgb3VyIHB1cnBvc2Ugbm93IGlzIHR3ZWx2ZSBtb250aCBvbGQsIiArCi0gICAgICAgICAgICAgICAgIkFuZCBib290bGVzcyAndGlzIHRvIHRlbGwgeW91IHdlIHdpbGwgZ286IiArCi0gICAgICAgICAgICAgICAgIlRoZXJlZm9yZSB3ZSBtZWV0IG5vdCBub3cuIFRoZW4gbGV0IG1lIGhlYXIiICsKLSAgICAgICAgICAgICAgICAiT2YgeW91LCBteSBnZW50bGUgY291c2luIFdlc3Rtb3JlbGFuZCwiICsKLSAgICAgICAgICAgICAgICAiV2hhdCB5ZXN0ZXJuaWdodCBvdXIgY291bmNpbCBkaWQgZGVjcmVlIiArCi0gICAgICAgICAgICAgICAgIkluIGZvcndhcmRpbmcgdGhpcyBkZWFyIGV4cGVkaWVuY2UuIiwKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiSGVhciBoaW0gYnV0IHJlYXNvbiBpbiBkaXZpbml0eSwiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBhbGwtYWRtaXJpbmcgd2l0aCBhbiBpbndhcmQgd2lzaCIgKyAKLSAgICAgICAgICAgICAgICAiWW91IHdvdWxkIGRlc2lyZSB0aGUga2luZyB3ZXJlIG1hZGUgYSBwcmVsYXRlOiIgKyAKLSAgICAgICAgICAgICAgICAiSGVhciBoaW0gZGViYXRlIG9mIGNvbW1vbndlYWx0aCBhZmZhaXJzLCIgKyAKLSAgICAgICAgICAgICAgICAiWW91IHdvdWxkIHNheSBpdCBoYXRoIGJlZW4gYWxsIGluIGFsbCBoaXMgc3R1ZHk6IiArIAotICAgICAgICAgICAgICAgICJMaXN0IGhpcyBkaXNjb3Vyc2Ugb2Ygd2FyLCBhbmQgeW91IHNoYWxsIGhlYXIiICsgCi0gICAgICAgICAgICAgICAgIkEgZmVhcmZ1bCBiYXR0bGUgcmVuZGVyJ2QgeW91IGluIG11c2ljOiIgKyAKLSAgICAgICAgICAgICAgICAiVHVybiBoaW0gdG8gYW55IGNhdXNlIG9mIHBvbGljeSwiICsgCi0gICAgICAgICAgICAgICAgIlRoZSBHb3JkaWFuIGtub3Qgb2YgaXQgaGUgd2lsbCB1bmxvb3NlLCIgKyAKLSAgICAgICAgICAgICAgICAiRmFtaWxpYXIgYXMgaGlzIGdhcnRlcjogdGhhdCwgd2hlbiBoZSBzcGVha3MsIiArIAotICAgICAgICAgICAgICAgICJUaGUgYWlyLCBhIGNoYXJ0ZXInZCBsaWJlcnRpbmUsIGlzIHN0aWxsLCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIHRoZSBtdXRlIHdvbmRlciBsdXJrZXRoIGluIG1lbidzIGVhcnMsIiArIAotICAgICAgICAgICAgICAgICJUbyBzdGVhbCBoaXMgc3dlZXQgYW5kIGhvbmV5J2Qgc2VudGVuY2VzOyIgKyAKLSAgICAgICAgICAgICAgICAiU28gdGhhdCB0aGUgYXJ0IGFuZCBwcmFjdGljIHBhcnQgb2YgbGlmZSIgKyAKLSAgICAgICAgICAgICAgICAiTXVzdCBiZSB0aGUgbWlzdHJlc3MgdG8gdGhpcyB0aGVvcmljOiIgKyAKLSAgICAgICAgICAgICAgICAiV2hpY2ggaXMgYSB3b25kZXIgaG93IGhpcyBncmFjZSBzaG91bGQgZ2xlYW4gaXQsIiArIAotICAgICAgICAgICAgICAgICJTaW5jZSBoaXMgYWRkaWN0aW9uIHdhcyB0byBjb3Vyc2VzIHZhaW4sIiArIAotICAgICAgICAgICAgICAgICJIaXMgY29tcGFuaWVzIHVubGV0dGVyJ2QsIHJ1ZGUgYW5kIHNoYWxsb3csIiArIAotICAgICAgICAgICAgICAgICJIaXMgaG91cnMgZmlsbCdkIHVwIHdpdGggcmlvdHMsIGJhbnF1ZXRzLCBzcG9ydHMsIiArIAotICAgICAgICAgICAgICAgICJBbmQgbmV2ZXIgbm90ZWQgaW4gaGltIGFueSBzdHVkeSwiICsgCi0gICAgICAgICAgICAgICAgIkFueSByZXRpcmVtZW50LCBhbnkgc2VxdWVzdHJhdGlvbiIgKyAKLSAgICAgICAgICAgICAgICAiRnJvbSBvcGVuIGhhdW50cyBhbmQgcG9wdWxhcml0eS4iLAotCi0gICAgICAgICAgICAgICAgIkkgY29tZSBubyBtb3JlIHRvIG1ha2UgeW91IGxhdWdoOiB0aGluZ3Mgbm93LCIgKwotICAgICAgICAgICAgICAgICJUaGF0IGJlYXIgYSB3ZWlnaHR5IGFuZCBhIHNlcmlvdXMgYnJvdywiICsKLSAgICAgICAgICAgICAgICAiU2FkLCBoaWdoLCBhbmQgd29ya2luZywgZnVsbCBvZiBzdGF0ZSBhbmQgd29lLCIgKwotICAgICAgICAgICAgICAgICJTdWNoIG5vYmxlIHNjZW5lcyBhcyBkcmF3IHRoZSBleWUgdG8gZmxvdywiICsKLSAgICAgICAgICAgICAgICAiV2Ugbm93IHByZXNlbnQuIFRob3NlIHRoYXQgY2FuIHBpdHksIGhlcmUiICsKLSAgICAgICAgICAgICAgICAiTWF5LCBpZiB0aGV5IHRoaW5rIGl0IHdlbGwsIGxldCBmYWxsIGEgdGVhcjsiICsKLSAgICAgICAgICAgICAgICAiVGhlIHN1YmplY3Qgd2lsbCBkZXNlcnZlIGl0LiBTdWNoIGFzIGdpdmUiICsKLSAgICAgICAgICAgICAgICAiVGhlaXIgbW9uZXkgb3V0IG9mIGhvcGUgdGhleSBtYXkgYmVsaWV2ZSwiICsKLSAgICAgICAgICAgICAgICAiTWF5IGhlcmUgZmluZCB0cnV0aCB0b28uIFRob3NlIHRoYXQgY29tZSB0byBzZWUiICsKLSAgICAgICAgICAgICAgICAiT25seSBhIHNob3cgb3IgdHdvLCBhbmQgc28gYWdyZWUiICsKLSAgICAgICAgICAgICAgICAiVGhlIHBsYXkgbWF5IHBhc3MsIGlmIHRoZXkgYmUgc3RpbGwgYW5kIHdpbGxpbmcsIiArCi0gICAgICAgICAgICAgICAgIkknbGwgdW5kZXJ0YWtlIG1heSBzZWUgYXdheSB0aGVpciBzaGlsbGluZyIgKwotICAgICAgICAgICAgICAgICJSaWNobHkgaW4gdHdvIHNob3J0IGhvdXJzLiBPbmx5IHRoZXkiICsKLSAgICAgICAgICAgICAgICAiVGhhdCBjb21lIHRvIGhlYXIgYSBtZXJyeSBiYXdkeSBwbGF5LCIgKwotICAgICAgICAgICAgICAgICJBIG5vaXNlIG9mIHRhcmdldHMsIG9yIHRvIHNlZSBhIGZlbGxvdyIgKwotICAgICAgICAgICAgICAgICJJbiBhIGxvbmcgbW90bGV5IGNvYXQgZ3VhcmRlZCB3aXRoIHllbGxvdywiICsKLSAgICAgICAgICAgICAgICAiV2lsbCBiZSBkZWNlaXZlZDsgZm9yLCBnZW50bGUgaGVhcmVycywga25vdywiICsKLSAgICAgICAgICAgICAgICAiVG8gcmFuayBvdXIgY2hvc2VuIHRydXRoIHdpdGggc3VjaCBhIHNob3ciICsKLSAgICAgICAgICAgICAgICAiQXMgZm9vbCBhbmQgZmlnaHQgaXMsIGJlc2lkZSBmb3JmZWl0aW5nIiArCi0gICAgICAgICAgICAgICAgIk91ciBvd24gYnJhaW5zLCBhbmQgdGhlIG9waW5pb24gdGhhdCB3ZSBicmluZywiICsKLSAgICAgICAgICAgICAgICAiVG8gbWFrZSB0aGF0IG9ubHkgdHJ1ZSB3ZSBub3cgaW50ZW5kLCIgKwotICAgICAgICAgICAgICAgICJXaWxsIGxlYXZlIHVzIG5ldmVyIGFuIHVuZGVyc3RhbmRpbmcgZnJpZW5kLiIgKwotICAgICAgICAgICAgICAgICJUaGVyZWZvcmUsIGZvciBnb29kbmVzcycgc2FrZSwgYW5kIGFzIHlvdSBhcmUga25vd24iICsKLSAgICAgICAgICAgICAgICAiVGhlIGZpcnN0IGFuZCBoYXBwaWVzdCBoZWFyZXJzIG9mIHRoZSB0b3duLCIgKwotICAgICAgICAgICAgICAgICJCZSBzYWQsIGFzIHdlIHdvdWxkIG1ha2UgeWU6IHRoaW5rIHllIHNlZSIgKwotICAgICAgICAgICAgICAgICJUaGUgdmVyeSBwZXJzb25zIG9mIG91ciBub2JsZSBzdG9yeSIgKwotICAgICAgICAgICAgICAgICJBcyB0aGV5IHdlcmUgbGl2aW5nOyB0aGluayB5b3Ugc2VlIHRoZW0gZ3JlYXQsIiArCi0gICAgICAgICAgICAgICAgIkFuZCBmb2xsb3cnZCB3aXRoIHRoZSBnZW5lcmFsIHRocm9uZyBhbmQgc3dlYXQiICsKLSAgICAgICAgICAgICAgICAiT2YgdGhvdXNhbmQgZnJpZW5kczsgdGhlbiBpbiBhIG1vbWVudCwgc2VlIiArCi0gICAgICAgICAgICAgICAgIkhvdyBzb29uIHRoaXMgbWlnaHRpbmVzcyBtZWV0cyBtaXNlcnk6IiArCi0gICAgICAgICAgICAgICAgIkFuZCwgaWYgeW91IGNhbiBiZSBtZXJyeSB0aGVuLCBJJ2xsIHNheSIgKwotICAgICAgICAgICAgICAgICJBIG1hbiBtYXkgd2VlcCB1cG9uIGhpcyB3ZWRkaW5nLWRheS4iLAotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICJGaXJzdCwgaGVhdmVuIGJlIHRoZSByZWNvcmQgdG8gbXkgc3BlZWNoISIgKyAKLSAgICAgICAgICAgICAgICAiSW4gdGhlIGRldm90aW9uIG9mIGEgc3ViamVjdCdzIGxvdmUsIiArIAotICAgICAgICAgICAgICAgICJUZW5kZXJpbmcgdGhlIHByZWNpb3VzIHNhZmV0eSBvZiBteSBwcmluY2UsIiArIAotICAgICAgICAgICAgICAgICJBbmQgZnJlZSBmcm9tIG90aGVyIG1pc2JlZ290dGVuIGhhdGUsIiArIAotICAgICAgICAgICAgICAgICJDb21lIEkgYXBwZWxsYW50IHRvIHRoaXMgcHJpbmNlbHkgcHJlc2VuY2UuIiArIAotICAgICAgICAgICAgICAgICJOb3csIFRob21hcyBNb3dicmF5LCBkbyBJIHR1cm4gdG8gdGhlZSwiICsgCi0gICAgICAgICAgICAgICAgIkFuZCBtYXJrIG15IGdyZWV0aW5nIHdlbGw7IGZvciB3aGF0IEkgc3BlYWsiICsgCi0gICAgICAgICAgICAgICAgIk15IGJvZHkgc2hhbGwgbWFrZSBnb29kIHVwb24gdGhpcyBlYXJ0aCwiICsgCi0gICAgICAgICAgICAgICAgIk9yIG15IGRpdmluZSBzb3VsIGFuc3dlciBpdCBpbiBoZWF2ZW4uIiArIAotICAgICAgICAgICAgICAgICJUaG91IGFydCBhIHRyYWl0b3IgYW5kIGEgbWlzY3JlYW50LCIgKyAKLSAgICAgICAgICAgICAgICAiVG9vIGdvb2QgdG8gYmUgc28gYW5kIHRvbyBiYWQgdG8gbGl2ZSwiICsgCi0gICAgICAgICAgICAgICAgIlNpbmNlIHRoZSBtb3JlIGZhaXIgYW5kIGNyeXN0YWwgaXMgdGhlIHNreSwiICsgCi0gICAgICAgICAgICAgICAgIlRoZSB1Z2xpZXIgc2VlbSB0aGUgY2xvdWRzIHRoYXQgaW4gaXQgZmx5LiIgKyAKLSAgICAgICAgICAgICAgICAiT25jZSBtb3JlLCB0aGUgbW9yZSB0byBhZ2dyYXZhdGUgdGhlIG5vdGUsIiArIAotICAgICAgICAgICAgICAgICJXaXRoIGEgZm91bCB0cmFpdG9yJ3MgbmFtZSBzdHVmZiBJIHRoeSB0aHJvYXQ7IiArIAotICAgICAgICAgICAgICAgICJBbmQgd2lzaCwgc28gcGxlYXNlIG15IHNvdmVyZWlnbiwgZXJlIEkgbW92ZSwiICsgCi0gICAgICAgICAgICAgICAgIldoYXQgbXkgdG9uZ3VlIHNwZWFrcyBteSByaWdodCBkcmF3biBzd29yZCBtYXkgcHJvdmUuIiwKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiTm93IGlzIHRoZSB3aW50ZXIgb2Ygb3VyIGRpc2NvbnRlbnQiICsgCi0gICAgICAgICAgICAgICAgIk1hZGUgZ2xvcmlvdXMgc3VtbWVyIGJ5IHRoaXMgc3VuIG9mIFlvcms7IiArIAotICAgICAgICAgICAgICAgICJBbmQgYWxsIHRoZSBjbG91ZHMgdGhhdCBsb3VyJ2QgdXBvbiBvdXIgaG91c2UiICsgCi0gICAgICAgICAgICAgICAgIkluIHRoZSBkZWVwIGJvc29tIG9mIHRoZSBvY2VhbiBidXJpZWQuIiArIAotICAgICAgICAgICAgICAgICJOb3cgYXJlIG91ciBicm93cyBib3VuZCB3aXRoIHZpY3RvcmlvdXMgd3JlYXRoczsiICsgCi0gICAgICAgICAgICAgICAgIk91ciBicnVpc2VkIGFybXMgaHVuZyB1cCBmb3IgbW9udW1lbnRzOyIgKyAKLSAgICAgICAgICAgICAgICAiT3VyIHN0ZXJuIGFsYXJ1bXMgY2hhbmdlZCB0byBtZXJyeSBtZWV0aW5ncywiICsgCi0gICAgICAgICAgICAgICAgIk91ciBkcmVhZGZ1bCBtYXJjaGVzIHRvIGRlbGlnaHRmdWwgbWVhc3VyZXMuIiArIAotICAgICAgICAgICAgICAgICJHcmltLXZpc2FnZWQgd2FyIGhhdGggc21vb3RoJ2QgaGlzIHdyaW5rbGVkIGZyb250OyIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIG5vdywgaW5zdGVhZCBvZiBtb3VudGluZyBiYXJkZWQgc3RlZWRzIiArIAotICAgICAgICAgICAgICAgICJUbyBmcmlnaHQgdGhlIHNvdWxzIG9mIGZlYXJmdWwgYWR2ZXJzYXJpZXMsIiArIAotICAgICAgICAgICAgICAgICJIZSBjYXBlcnMgbmltYmx5IGluIGEgbGFkeSdzIGNoYW1iZXIiICsgCi0gICAgICAgICAgICAgICAgIlRvIHRoZSBsYXNjaXZpb3VzIHBsZWFzaW5nIG9mIGEgbHV0ZS4iICsgCi0gICAgICAgICAgICAgICAgIkJ1dCBJLCB0aGF0IGFtIG5vdCBzaGFwZWQgZm9yIHNwb3J0aXZlIHRyaWNrcywiICsgCi0gICAgICAgICAgICAgICAgIk5vciBtYWRlIHRvIGNvdXJ0IGFuIGFtb3JvdXMgbG9va2luZy1nbGFzczsiICsgCi0gICAgICAgICAgICAgICAgIkksIHRoYXQgYW0gcnVkZWx5IHN0YW1wJ2QsIGFuZCB3YW50IGxvdmUncyBtYWplc3R5IiArIAotICAgICAgICAgICAgICAgICJUbyBzdHJ1dCBiZWZvcmUgYSB3YW50b24gYW1ibGluZyBueW1waDsiICsgCi0gICAgICAgICAgICAgICAgIkksIHRoYXQgYW0gY3VydGFpbCdkIG9mIHRoaXMgZmFpciBwcm9wb3J0aW9uLCIgKyAKLSAgICAgICAgICAgICAgICAiQ2hlYXRlZCBvZiBmZWF0dXJlIGJ5IGRpc3NlbWJsaW5nIG5hdHVyZSwiICsgCi0gICAgICAgICAgICAgICAgIkRlZm9ybWVkLCB1bmZpbmlzaCdkLCBzZW50IGJlZm9yZSBteSB0aW1lIiArIAotICAgICAgICAgICAgICAgICJJbnRvIHRoaXMgYnJlYXRoaW5nIHdvcmxkLCBzY2FyY2UgaGFsZiBtYWRlIHVwLCIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIHRoYXQgc28gbGFtZWx5IGFuZCB1bmZhc2hpb25hYmxlIiArIAotICAgICAgICAgICAgICAgICJUaGF0IGRvZ3MgYmFyayBhdCBtZSBhcyBJIGhhbHQgYnkgdGhlbTsiICsgCi0gICAgICAgICAgICAgICAgIldoeSwgSSwgaW4gdGhpcyB3ZWFrIHBpcGluZyB0aW1lIG9mIHBlYWNlLCIgKyAKLSAgICAgICAgICAgICAgICAiSGF2ZSBubyBkZWxpZ2h0IHRvIHBhc3MgYXdheSB0aGUgdGltZSwiICsgCi0gICAgICAgICAgICAgICAgIlVubGVzcyB0byBzcHkgbXkgc2hhZG93IGluIHRoZSBzdW4iICsgCi0gICAgICAgICAgICAgICAgIkFuZCBkZXNjYW50IG9uIG1pbmUgb3duIGRlZm9ybWl0eToiICsgCi0gICAgICAgICAgICAgICAgIkFuZCB0aGVyZWZvcmUsIHNpbmNlIEkgY2Fubm90IHByb3ZlIGEgbG92ZXIsIiArIAotICAgICAgICAgICAgICAgICJUbyBlbnRlcnRhaW4gdGhlc2UgZmFpciB3ZWxsLXNwb2tlbiBkYXlzLCIgKyAKLSAgICAgICAgICAgICAgICAiSSBhbSBkZXRlcm1pbmVkIHRvIHByb3ZlIGEgdmlsbGFpbiIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGhhdGUgdGhlIGlkbGUgcGxlYXN1cmVzIG9mIHRoZXNlIGRheXMuIiArIAotICAgICAgICAgICAgICAgICJQbG90cyBoYXZlIEkgbGFpZCwgaW5kdWN0aW9ucyBkYW5nZXJvdXMsIiArIAotICAgICAgICAgICAgICAgICJCeSBkcnVua2VuIHByb3BoZWNpZXMsIGxpYmVscyBhbmQgZHJlYW1zLCIgKyAKLSAgICAgICAgICAgICAgICAiVG8gc2V0IG15IGJyb3RoZXIgQ2xhcmVuY2UgYW5kIHRoZSBraW5nIiArIAotICAgICAgICAgICAgICAgICJJbiBkZWFkbHkgaGF0ZSB0aGUgb25lIGFnYWluc3QgdGhlIG90aGVyOiIgKyAKLSAgICAgICAgICAgICAgICAiQW5kIGlmIEtpbmcgRWR3YXJkIGJlIGFzIHRydWUgYW5kIGp1c3QiICsgCi0gICAgICAgICAgICAgICAgIkFzIEkgYW0gc3VidGxlLCBmYWxzZSBhbmQgdHJlYWNoZXJvdXMsIiArIAotICAgICAgICAgICAgICAgICJUaGlzIGRheSBzaG91bGQgQ2xhcmVuY2UgY2xvc2VseSBiZSBtZXcnZCB1cCwiICsgCi0gICAgICAgICAgICAgICAgIkFib3V0IGEgcHJvcGhlY3ksIHdoaWNoIHNheXMgdGhhdCAnRyciICsgCi0gICAgICAgICAgICAgICAgIk9mIEVkd2FyZCdzIGhlaXJzIHRoZSBtdXJkZXJlciBzaGFsbCBiZS4iICsgCi0gICAgICAgICAgICAgICAgIkRpdmUsIHRob3VnaHRzLCBkb3duIHRvIG15IHNvdWw6IGhlcmUiICsgCi0gICAgICAgICAgICAgICAgIkNsYXJlbmNlIGNvbWVzLiIsCi0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgIlRvIGJhaXQgZmlzaCB3aXRoYWw6IGlmIGl0IHdpbGwgZmVlZCBub3RoaW5nIGVsc2UsIiArIAotICAgICAgICAgICAgICAgICJpdCB3aWxsIGZlZWQgbXkgcmV2ZW5nZS4gSGUgaGF0aCBkaXNncmFjZWQgbWUsIGFuZCIgKyAKLSAgICAgICAgICAgICAgICAiaGluZGVyZWQgbWUgaGFsZiBhIG1pbGxpb247IGxhdWdoZWQgYXQgbXkgbG9zc2VzLCIgKyAKLSAgICAgICAgICAgICAgICAibW9ja2VkIGF0IG15IGdhaW5zLCBzY29ybmVkIG15IG5hdGlvbiwgdGh3YXJ0ZWQgbXkiICsgCi0gICAgICAgICAgICAgICAgImJhcmdhaW5zLCBjb29sZWQgbXkgZnJpZW5kcywgaGVhdGVkIG1pbmUiICsgCi0gICAgICAgICAgICAgICAgImVuZW1pZXM7IGFuZCB3aGF0J3MgaGlzIHJlYXNvbj8gSSBhbSBhIEpldy4gSGF0aCIgKyAKLSAgICAgICAgICAgICAgICAibm90IGEgSmV3IGV5ZXM/IGhhdGggbm90IGEgSmV3IGhhbmRzLCBvcmdhbnMsIiArIAotICAgICAgICAgICAgICAgICJkaW1lbnNpb25zLCBzZW5zZXMsIGFmZmVjdGlvbnMsIHBhc3Npb25zPyBmZWQgd2l0aCIgKyAKLSAgICAgICAgICAgICAgICAidGhlIHNhbWUgZm9vZCwgaHVydCB3aXRoIHRoZSBzYW1lIHdlYXBvbnMsIHN1YmplY3QiICsgCi0gICAgICAgICAgICAgICAgInRvIHRoZSBzYW1lIGRpc2Vhc2VzLCBoZWFsZWQgYnkgdGhlIHNhbWUgbWVhbnMsIiArIAotICAgICAgICAgICAgICAgICJ3YXJtZWQgYW5kIGNvb2xlZCBieSB0aGUgc2FtZSB3aW50ZXIgYW5kIHN1bW1lciwgYXMiICsgCi0gICAgICAgICAgICAgICAgImEgQ2hyaXN0aWFuIGlzPyBJZiB5b3UgcHJpY2sgdXMsIGRvIHdlIG5vdCBibGVlZD8iICsgCi0gICAgICAgICAgICAgICAgImlmIHlvdSB0aWNrbGUgdXMsIGRvIHdlIG5vdCBsYXVnaD8gaWYgeW91IHBvaXNvbiIgKyAKLSAgICAgICAgICAgICAgICAidXMsIGRvIHdlIG5vdCBkaWU/IGFuZCBpZiB5b3Ugd3JvbmcgdXMsIHNoYWxsIHdlIG5vdCIgKyAKLSAgICAgICAgICAgICAgICAicmV2ZW5nZT8gSWYgd2UgYXJlIGxpa2UgeW91IGluIHRoZSByZXN0LCB3ZSB3aWxsIiArIAotICAgICAgICAgICAgICAgICJyZXNlbWJsZSB5b3UgaW4gdGhhdC4gSWYgYSBKZXcgd3JvbmcgYSBDaHJpc3RpYW4sIiArIAotICAgICAgICAgICAgICAgICJ3aGF0IGlzIGhpcyBodW1pbGl0eT8gUmV2ZW5nZS4gSWYgYSBDaHJpc3RpYW4iICsgCi0gICAgICAgICAgICAgICAgIndyb25nIGEgSmV3LCB3aGF0IHNob3VsZCBoaXMgc3VmZmVyYW5jZSBiZSBieSIgKyAKLSAgICAgICAgICAgICAgICAiQ2hyaXN0aWFuIGV4YW1wbGU/IFdoeSwgcmV2ZW5nZS4gVGhlIHZpbGxhbnkgeW91IiArIAotICAgICAgICAgICAgICAgICJ0ZWFjaCBtZSwgSSB3aWxsIGV4ZWN1dGUsIGFuZCBpdCBzaGFsbCBnbyBoYXJkIGJ1dCBJIiArIAotICAgICAgICAgICAgICAgICJ3aWxsIGJldHRlciB0aGUgaW5zdHJ1Y3Rpb24uIiwKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiVmlydHVlISBhIGZpZyEgJ3RpcyBpbiBvdXJzZWx2ZXMgdGhhdCB3ZSBhcmUgdGh1cyIgKyAKLSAgICAgICAgICAgICAgICAib3IgdGh1cy4gT3VyIGJvZGllcyBhcmUgb3VyIGdhcmRlbnMsIHRvIHRoZSB3aGljaCIgKyAKLSAgICAgICAgICAgICAgICAib3VyIHdpbGxzIGFyZSBnYXJkZW5lcnM6IHNvIHRoYXQgaWYgd2Ugd2lsbCBwbGFudCIgKyAKLSAgICAgICAgICAgICAgICAibmV0dGxlcywgb3Igc293IGxldHR1Y2UsIHNldCBoeXNzb3AgYW5kIHdlZWQgdXAiICsgCi0gICAgICAgICAgICAgICAgInRoeW1lLCBzdXBwbHkgaXQgd2l0aCBvbmUgZ2VuZGVyIG9mIGhlcmJzLCBvciIgKyAKLSAgICAgICAgICAgICAgICAiZGlzdHJhY3QgaXQgd2l0aCBtYW55LCBlaXRoZXIgdG8gaGF2ZSBpdCBzdGVyaWxlIiArIAotICAgICAgICAgICAgICAgICJ3aXRoIGlkbGVuZXNzLCBvciBtYW51cmVkIHdpdGggaW5kdXN0cnksIHdoeSwgdGhlIiArIAotICAgICAgICAgICAgICAgICJwb3dlciBhbmQgY29ycmlnaWJsZSBhdXRob3JpdHkgb2YgdGhpcyBsaWVzIGluIG91ciIgKyAKLSAgICAgICAgICAgICAgICAid2lsbHMuIElmIHRoZSBiYWxhbmNlIG9mIG91ciBsaXZlcyBoYWQgbm90IG9uZSIgKyAKLSAgICAgICAgICAgICAgICAic2NhbGUgb2YgcmVhc29uIHRvIHBvaXNlIGFub3RoZXIgb2Ygc2Vuc3VhbGl0eSwgdGhlIiArIAotICAgICAgICAgICAgICAgICJibG9vZCBhbmQgYmFzZW5lc3Mgb2Ygb3VyIG5hdHVyZXMgd291bGQgY29uZHVjdCB1cyIgKyAKLSAgICAgICAgICAgICAgICAidG8gbW9zdCBwcmVwb3N0ZXJvdXMgY29uY2x1c2lvbnM6IGJ1dCB3ZSBoYXZlIiArIAotICAgICAgICAgICAgICAgICJyZWFzb24gdG8gY29vbCBvdXIgcmFnaW5nIG1vdGlvbnMsIG91ciBjYXJuYWwiICsgCi0gICAgICAgICAgICAgICAgInN0aW5ncywgb3VyIHVuYml0dGVkIGx1c3RzLCB3aGVyZW9mIEkgdGFrZSB0aGlzIHRoYXQiICsgCi0gICAgICAgICAgICAgICAgInlvdSBjYWxsIGxvdmUgdG8gYmUgYSBzZWN0IG9yIHNjaW9uLiIsCi0KLSAgICAgICAgICAgICAgICAiQmxvdywgd2luZHMsIGFuZCBjcmFjayB5b3VyIGNoZWVrcyEgcmFnZSEgYmxvdyEiICsgCi0gICAgICAgICAgICAgICAgIllvdSBjYXRhcmFjdHMgYW5kIGh1cnJpY2Fub2VzLCBzcG91dCIgKyAKLSAgICAgICAgICAgICAgICAiVGlsbCB5b3UgaGF2ZSBkcmVuY2gnZCBvdXIgc3RlZXBsZXMsIGRyb3duJ2QgdGhlIGNvY2tzISIgKyAKLSAgICAgICAgICAgICAgICAiWW91IHN1bHBodXJvdXMgYW5kIHRob3VnaHQtZXhlY3V0aW5nIGZpcmVzLCIgKyAKLSAgICAgICAgICAgICAgICAiVmF1bnQtY291cmllcnMgdG8gb2FrLWNsZWF2aW5nIHRodW5kZXJib2x0cywiICsgCi0gICAgICAgICAgICAgICAgIlNpbmdlIG15IHdoaXRlIGhlYWQhIEFuZCB0aG91LCBhbGwtc2hha2luZyB0aHVuZGVyLCIgKyAKLSAgICAgICAgICAgICAgICAiU21pdGUgZmxhdCB0aGUgdGhpY2sgcm90dW5kaXR5IG8nIHRoZSB3b3JsZCEiICsgCi0gICAgICAgICAgICAgICAgIkNyYWNrIG5hdHVyZSdzIG1vdWxkcywgYW4gZ2VybWVucyBzcGlsbCBhdCBvbmNlLCIgKyAKLSAgICAgICAgICAgICAgICAiVGhhdCBtYWtlIGluZ3JhdGVmdWwgbWFuISIKLSAgICAgICAgfTsKICAgICB9CiAgICAgCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Qb3B1cE1lbnUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxZThlNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1BvcHVwTWVudTEuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMudmlldzsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5NZW51SXRlbTsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5Qb3B1cE1lbnU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworLyoqCisgKiBUaGlzIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIHRoZSBQb3B1cE1lbnUgY2xhc3MuIENsaWNraW5nIHRoZSBidXR0b24gd2lsbCBpbmZsYXRlIGFuZAorICogc2hvdyBhIHBvcHVwIG1lbnUgZnJvbSBhbiBYTUwgcmVzb3VyY2UuCisgKi8KK3B1YmxpYyBjbGFzcyBQb3B1cE1lbnUxIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucG9wdXBfbWVudV8xKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvblBvcHVwQnV0dG9uQ2xpY2soVmlldyBidXR0b24pIHsKKyAgICAgICAgUG9wdXBNZW51IHBvcHVwID0gbmV3IFBvcHVwTWVudSh0aGlzLCBidXR0b24pOworICAgICAgICBwb3B1cC5nZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5wb3B1cCwgcG9wdXAuZ2V0TWVudSgpKTsKKworICAgICAgICBwb3B1cC5zZXRPbk1lbnVJdGVtQ2xpY2tMaXN0ZW5lcihuZXcgUG9wdXBNZW51Lk9uTWVudUl0ZW1DbGlja0xpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gb25NZW51SXRlbUNsaWNrKE1lbnVJdGVtIGl0ZW0pIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChQb3B1cE1lbnUxLnRoaXMsICJDbGlja2VkIHBvcHVwIG1lbnUgaXRlbSAiICsgaXRlbS5nZXRUaXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHBvcHVwLnNob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9Sb3RhdGluZ0J1dHRvbi5qYXZhIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzU2ZWNlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvUm90YXRpbmdCdXR0b24uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5hcGlzLnZpZXc7CisKKy8vIE5lZWQgdGhlIGZvbGxvd2luZyBpbXBvcnQgdG8gZ2V0IGFjY2VzcyB0byB0aGUgYXBwIHJlc291cmNlcywgc2luY2UgdGhpcworLy8gY2xhc3MgaXMgaW4gYSBzdWItcGFja2FnZS4KK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLmFwaXMuUjsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKKworLyoqCisgKiBUaGlzIGFwcGxpY2F0aW9uIGRlbW9uc3RyYXRlcyB0aGUgc2Vla2luZyBjYXBhYmlsaXR5IG9mIEFuaW1hdG9yLiBUaGUgU2Vla0JhciBpbiB0aGUKKyAqIFVJIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgYW5pbWF0aW9uLiBQcmVzc2luZyB0aGUgUnVuIGJ1dHRvbiB3aWxsIHBsYXkgZnJvbQorICogdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGFuaW1hdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFJvdGF0aW5nQnV0dG9uIGV4dGVuZHMgQWN0aXZpdHkgeworCisgICAgLyoqIENhbGxlZCB3aGVuIHRoZSBhY3Rpdml0eSBpcyBmaXJzdCBjcmVhdGVkLiAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucm90YXRpbmdfdmlldyk7CisgICAgICAgIGZpbmFsIEJ1dHRvbiByb3RhdGluZ0J1dHRvbiA9IChCdXR0b24pIGZpbmRWaWV3QnlJZChSLmlkLnJvdGF0aW5nQnV0dG9uKTsKKyAgICAgICAgU2Vla0JhciBzZWVrQmFyOworICAgICAgICBzZWVrQmFyID0gKFNlZWtCYXIpIGZpbmRWaWV3QnlJZChSLmlkLnJvdGF0aW9uWCk7CisgICAgICAgIHNlZWtCYXIuc2V0TWF4KDM2MCk7CisgICAgICAgIHNlZWtCYXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobmV3IFNlZWtCYXIuT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBmcm9tVXNlcikgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc2Vla2luZyBvbiBhcHAgY3JlYXRpb24KKyAgICAgICAgICAgICAgICByb3RhdGluZ0J1dHRvbi5zZXRSb3RhdGlvblgoKGZsb2F0KXByb2dyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHNlZWtCYXIgPSAoU2Vla0JhcikgZmluZFZpZXdCeUlkKFIuaWQucm90YXRpb25ZKTsKKyAgICAgICAgc2Vla0Jhci5zZXRNYXgoMzYwKTsKKyAgICAgICAgc2Vla0Jhci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihuZXcgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuIGZyb21Vc2VyKSB7CisgICAgICAgICAgICAgICAgLy8gcHJldmVudCBzZWVraW5nIG9uIGFwcCBjcmVhdGlvbgorICAgICAgICAgICAgICAgIHJvdGF0aW5nQnV0dG9uLnNldFJvdGF0aW9uWSgoZmxvYXQpcHJvZ3Jlc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgc2Vla0JhciA9IChTZWVrQmFyKSBmaW5kVmlld0J5SWQoUi5pZC5yb3RhdGlvblopOworICAgICAgICBzZWVrQmFyLnNldE1heCgzNjApOworICAgICAgICBzZWVrQmFyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG5ldyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBzZWVrQmFyLCBpbnQgcHJvZ3Jlc3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZnJvbVVzZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHNlZWtpbmcgb24gYXBwIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgcm90YXRpbmdCdXR0b24uc2V0Um90YXRpb24oKGZsb2F0KXByb2dyZXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMzLmphdmEgYi9zYW1wbGVzL0FwaURlbW9zL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2FwaXMvdmlldy9UYWJzMy5qYXZhCmluZGV4IGUwOWYwNDEuLjU4N2JmZTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L1RhYnMzLmphdmEKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvVGFiczMuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogICAgICAgICAvLyB0aGUgdGFiIGlzIGNsaWNrZWQuCiAgICAgICAgIHRhYkhvc3QuYWRkVGFiKHRhYkhvc3QubmV3VGFiU3BlYygidGFiMyIpCiAgICAgICAgICAgICAgICAgLnNldEluZGljYXRvcigiZGVzdHJveSIpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnQobmV3IEludGVudCh0aGlzLCBDb250cm9sczIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnNldENvbnRlbnQobmV3IEludGVudCh0aGlzLCBDb250cm9sczEuY2xhc3MpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkRmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfQ0xFQVJfVE9QKSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQXBpRGVtb3Mvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvYXBpcy92aWV3L19pbmRleC5odG1sIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKaW5kZXggYTQ2MmJjMS4uMjFkNzU2ZiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKKysrIGIvc2FtcGxlcy9BcGlEZW1vcy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9hcGlzL3ZpZXcvX2luZGV4Lmh0bWwKQEAgLTIzNSwxMyArMjM1LDIxIEBACiAKIDxoMz5Db250cm9sczwvaDM+CiA8ZGw+Ci0gIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+MS4gVGhlbWUgV2hpdGU8L2E+PC9kdD4KLSAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSB3aGl0ZSB0aGVtZS4gPC9kZD4KKyAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMS5odG1sIj4xLiBUaGVtZSBMaWdodDwvYT48L2R0PgorICA8ZGQ+RGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBjb21tb24gZm9ybSB0eXBlIHdpZGdldHMsIHN1Y2ggYXMgY2hlY2sgYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgdXNpbmcgdGhlIGxpZ2h0IHRoZW1lLiA8L2RkPgogPC9kbD4KIDxkbD4KLSAgPGR0PjxhIGhyZWY9IkNvbnRyb2xzMi5odG1sIj4yLiBUaGVtZSBEYXJrPC9hPjwvZHQ+CisgIDxkdD48YSBocmVmPSJDb250cm9sczEuaHRtbCI+Mi4gVGhlbWUgRGFyazwvYT48L2R0PgogICA8ZGQ+RGVtb25zdHJhdGVzIGEgdmFyaWV0eSBvZiBjb21tb24gZm9ybSB0eXBlIHdpZGdldHMsIHN1Y2ggYXMgY2hlY2sgYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgdXNpbmcgdGhlIGRhcmsgdGhlbWUuIDwvZGQ+CiA8L2RsPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjMuIFRoZW1lIEhvbG9ncmFwaGljIExpZ2h0PC9hPjwvZHQ+CisgIDxkZD5EZW1vbnN0cmF0ZXMgYSB2YXJpZXR5IG9mIGNvbW1vbiBmb3JtIHR5cGUgd2lkZ2V0cywgc3VjaCBhcyBjaGVjayBib3hlcyBhbmQgcmFkaW8gYnV0dG9ucyB1c2luZyB0aGUgbGlnaHQgaG9sb2dyYXBoaWMgdGhlbWUuIDwvZGQ+Cis8L2RsPgorPGRsPgorICA8ZHQ+PGEgaHJlZj0iQ29udHJvbHMxLmh0bWwiPjQuIFRoZW1lIEhvbG9ncmFwaGljIERhcms8L2E+PC9kdD4KKyAgPGRkPkRlbW9uc3RyYXRlcyBhIHZhcmlldHkgb2YgY29tbW9uIGZvcm0gdHlwZSB3aWRnZXRzLCBzdWNoIGFzIGNoZWNrIGJveGVzIGFuZCByYWRpbyBidXR0b25zIHVzaW5nIHRoZSBkYXJrIGhvbG9ncmFwaGljIHRoZW1lLiA8L2RkPgorPC9kbD4KIAogPGgzPkF1dG8gQ29tcGxldGU8L2gzPgogPGRsPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvUGx1Z2luT2JqZWN0LmgKaW5kZXggMGViZWQyOC4uMjk2NzQ5YSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9QbHVnaW5PYmplY3QuaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL1BsdWdpbk9iamVjdC5oCkBAIC00OCw3ICs0OCw3IEBACiBwdWJsaWM6CiAgICAgU3ViUGx1Z2luKE5QUCBpbnN0KSA6IG1faW5zdChpbnN0KSB7fQogICAgIHZpcnR1YWwgflN1YlBsdWdpbigpIHt9Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSA9IDA7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKSA9IDA7CiAKICAgICBpbnQgZ2V0UGx1Z2luV2lkdGgoKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2FuaW1hdGlvbi9BbmltYXRpb25QbHVnaW4uY3BwCmluZGV4IDcyYTExYzkuLjZlOTNmYjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmNwcApAQCAtMzUsMTIgKzM1LDEyIEBACiBleHRlcm4gQU5QUGF0aEludGVyZmFjZVYwICAgICAgZ1BhdGhJOwogZXh0ZXJuIEFOUFdpbmRvd0ludGVyZmFjZVYwICAgIGdXaW5kb3dJOwogCi1zdGF0aWMgdWludDE2IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgeworc3RhdGljIHVpbnQxNl90IHJuZDE2KGZsb2F0IHgsIGludCBpbnNldCkgewogICAgIGludCBpeCA9IChpbnQpcm91bmRmKHgpICsgaW5zZXQ7CiAgICAgaWYgKGl4IDwgMCkgewogICAgICAgICBpeCA9IDA7CiAgICAgfQotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KGl4KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGl4KTsKIH0KIAogc3RhdGljIHZvaWQgaW52YWwoTlBQIGluc3RhbmNlLCBjb25zdCBBTlBSZWN0RiYgciwgYm9vbCBkb0FBKSB7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICBnV2luZG93SS5jbGVhclZpc2libGVSZWN0cyhpbnN0YW5jZSk7CiB9CiAKLWludDE2IEJhbGxBbmltYXRpb246OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgQmFsbEFuaW1hdGlvbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgewogICAgIE5QUCBpbnN0YW5jZSA9IHRoaXMtPmluc3QoKTsKIAogICAgIHN3aXRjaCAoZXZ0LT5ldmVudFR5cGUpIHsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYW5pbWF0aW9uL0FuaW1hdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKaW5kZXggZWYyYTNmNS4uNGE1YjRlOCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hbmltYXRpb24vQW5pbWF0aW9uUGx1Z2luLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBCYWxsQW5pbWF0aW9uKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5CYWxsQW5pbWF0aW9uKCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiBwcml2YXRlOgogICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOwogICAgIHZvaWQgc2hvd0VudGlyZVBsdWdpbk9uU2NyZWVuKCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCmluZGV4IDk3MzFmMTkuLjhkZWZlZjQgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uY3BwCkBAIC00NCwxMiArNDQsMTIgQEAKICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB1aW50MTYgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CiAgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKICAgICBpZiAoaXggPCAwKSB7CiAgICAgICAgIGl4ID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNj4oaXgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXgpOwogfQogCiBzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKQEAgLTI3Miw3ICsyNzIsNyBAQAogICAgIHJldHVybiAoaW5wdXQgPT0gbV9hY3RpdmVSZWN0KSA/IG1fcGFpbnRBY3RpdmVSZWN0IDogbV9wYWludFJlY3Q7CiB9CiAKLWludDE2IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEF1ZGlvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwogCiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9hdWRpby9BdWRpb1BsdWdpbi5oCmluZGV4IDEyOWQzM2EuLjBmODhhOTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYXVkaW8vQXVkaW9QbHVnaW4uaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2F1ZGlvL0F1ZGlvUGx1Z2luLmgKQEAgLTQyLDcgKzQyLDcgQEAKICAgICBBdWRpb1BsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+QXVkaW9QbHVnaW4oKTsKICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydHNEcmF3aW5nTW9kZWwoQU5QRHJhd2luZ01vZGVsKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKIHByaXZhdGU6CiAgICAgdm9pZCBkcmF3KEFOUENhbnZhcyopOwogICAgIHZvaWQgZHJhd1BsdWdpbihjb25zdCBBTlBCaXRtYXAmIGJpdG1hcCwgY29uc3QgQU5QUmVjdEkmIGNsaXApOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uY3BwCmluZGV4IGY3NDk2MzkuLjUxNWFjYmUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmNwcAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5jcHAKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgIGdTdXJmYWNlSS51bmxvY2soZW52LCBtX3N1cmZhY2UpOwogfQogCi1pbnQxNiBCYWNrZ3JvdW5kUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IEJhY2tncm91bmRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAgICAgICAgIGNhc2Uga0RyYXdfQU5QRXZlbnRUeXBlOgogICAgICAgICAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiIC0tLS0tLSAlcCB0aGUgcGx1Z2luIGRpZCBub3QgcmVxdWVzdCBkcmF3IGV2ZW50cyIsIGluc3QoKSk7CkBAIC0yMzMsMTAgKzIzMywxMCBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiAjZGVmaW5lIFRJTUVSX0lOVEVSVkFMICAgICA1MAotc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKLXN0YXRpYyB2b2lkIHRpbWVyX3JlcGVhdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKTsKLXN0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCk7Ci1zdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpOworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CitzdGF0aWMgdm9pZCB0aW1lcl9uZXZlcmZpcmVzKE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CitzdGF0aWMgdm9pZCB0aW1lcl9sYXRlbmN5KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCk7CiAKIHZvaWQgQmFja2dyb3VuZFBsdWdpbjo6dGVzdF90aW1lcnMoKSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwpAQCAtMjU1LDE4ICsyNTUsMTggQEAKICAgICBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBUSU1FUl9JTlRFUlZBTCwgdHJ1ZSwgdGltZXJfbGF0ZW5jeSk7CiAgICAgbVN0YXJ0VGltZSA9IG1QcmV2VGltZSA9IGdldE1TZWNzKCk7CiAgICAgLy8gdGVzdCB1bnNjaGVkdWxlIGltbWVkaWF0ZWx5Ci0gICAgdWludDMyIGlkID0gYnJvd3Nlci0+c2NoZWR1bGV0aW1lcihpbnN0YW5jZSwgMTAwLCBmYWxzZSwgdGltZXJfbmV2ZXJmaXJlcyk7CisgICAgdWludDMyX3QgaWQgPSBicm93c2VyLT5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCAxMDAsIGZhbHNlLCB0aW1lcl9uZXZlcmZpcmVzKTsKICAgICBicm93c2VyLT51bnNjaGVkdWxldGltZXIoaW5zdGFuY2UsIGlkKTsKICAgICAvLyB0ZXN0IGRvdWJsZSB1bnNjaGVkdWxlIChzaG91bGQgYmUgbm8tb3ApCiAgICAgYnJvd3Nlci0+dW5zY2hlZHVsZXRpbWVyKGluc3RhbmNlLCBpZCk7CiAKIH0KIAotc3RhdGljIHZvaWQgdGltZXJfb25lc2hvdChOUFAgaW5zdGFuY2UsIHVpbnQzMiB0aW1lcklEKSB7CitzdGF0aWMgdm9pZCB0aW1lcl9vbmVzaG90KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCkgewogICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIG9uZXNob3QgdGltZXJcbiIpOwogfQogCi1zdGF0aWMgdm9pZCB0aW1lcl9yZXBlYXQoTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworc3RhdGljIHZvaWQgdGltZXJfcmVwZWF0KE5QUCBpbnN0YW5jZSwgdWludDMyX3QgdGltZXJJRCkgewogICAgIEJhY2tncm91bmRQbHVnaW4gKm9iaiA9ICgoQmFja2dyb3VuZFBsdWdpbiopICgoUGx1Z2luT2JqZWN0KikgaW5zdGFuY2UtPnBkYXRhKS0+YWN0aXZlUGx1Z2luKTsKIAogICAgIGdMb2dJLmxvZyhrRGVidWdfQU5QTG9nVHlwZSwgIi0tLS0tLS0tIHJlcGVhdCB0aW1lciAlZFxuIiwKQEAgLTI3NiwxMSArMjc2LDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB0aW1lcl9uZXZlcmZpcmVzKE5QUCBpbnN0YW5jZSwgdWludDMyIHRpbWVySUQpIHsKK3N0YXRpYyB2b2lkIHRpbWVyX25ldmVyZmlyZXMoTlBQIGluc3RhbmNlLCB1aW50MzJfdCB0aW1lcklEKSB7CiAgICAgZ0xvZ0kubG9nKGtFcnJvcl9BTlBMb2dUeXBlLCAiLS0tLS0tLS0gdGltZXJfbmV2ZXJmaXJlcyEhIVxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHRpbWVyX2xhdGVuY3koTlBQIGluc3RhbmNlLCB1aW50MzIgdGltZXJJRCkgeworc3RhdGljIHZvaWQgdGltZXJfbGF0ZW5jeShOUFAgaW5zdGFuY2UsIHVpbnQzMl90IHRpbWVySUQpIHsKICAgICBCYWNrZ3JvdW5kUGx1Z2luICpvYmogPSAoKEJhY2tncm91bmRQbHVnaW4qKSAoKFBsdWdpbk9iamVjdCopIGluc3RhbmNlLT5wZGF0YSktPmFjdGl2ZVBsdWdpbik7CiAKICAgICBvYmotPm1UaW1lckxhdGVuY3lDdXJyZW50Q291bnQgKz0gMTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2JhY2tncm91bmQvQmFja2dyb3VuZFBsdWdpbi5oCmluZGV4IGViZDc3ZDEuLmUwYjA1OTcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvYmFja2dyb3VuZC9CYWNrZ3JvdW5kUGx1Z2luLmgKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9iYWNrZ3JvdW5kL0JhY2tncm91bmRQbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogcHVibGljOgogICAgIEJhY2tncm91bmRQbHVnaW4oTlBQIGluc3QpOwogICAgIHZpcnR1YWwgfkJhY2tncm91bmRQbHVnaW4oKTsKLSAgICB2aXJ0dWFsIGludDE2IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOworICAgIHZpcnR1YWwgaW50MTZfdCBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKICAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0U3VyZmFjZSgpOwogCiAgICAgLy8gVGltZXIgVGVzdGluZyBWYXJpYWJsZXMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmNwcAppbmRleCA1YTUzNmQ5Li4xMTBhZmFhIDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uY3BwCkBAIC00MywxMiArNDMsMTIgQEAKICAgICBicm93c2VyLT5pbnZhbGlkYXRlcmVjdChpbnN0YW5jZSwgTlVMTCk7CiB9CiAKLXN0YXRpYyB1aW50MTYgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CitzdGF0aWMgdWludDE2X3Qgcm5kMTYoZmxvYXQgeCwgaW50IGluc2V0KSB7CiAgICAgaW50IGl4ID0gKGludClyb3VuZGYoeCkgKyBpbnNldDsKICAgICBpZiAoaXggPCAwKSB7CiAgICAgICAgIGl4ID0gMDsKICAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNj4oaXgpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXgpOwogfQogCiBzdGF0aWMgdm9pZCBpbnZhbChOUFAgaW5zdGFuY2UsIGNvbnN0IEFOUFJlY3RGJiByLCBib29sIGRvQUEpIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgIH0KIH0KIAotaW50MTYgRm9ybVBsdWdpbjo6aGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCkgeworaW50MTZfdCBGb3JtUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgTlBQIGluc3RhbmNlID0gdGhpcy0+aW5zdCgpOwogCiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvZm9ybS9Gb3JtUGx1Z2luLmgKaW5kZXggMDQxZmZiOC4uOWY5ODVhMyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9mb3JtL0Zvcm1QbHVnaW4uaAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL2Zvcm0vRm9ybVBsdWdpbi5oCkBAIC0zOSw3ICszOSw3IEBACiAgICAgRm9ybVBsdWdpbihOUFAgaW5zdCk7CiAgICAgdmlydHVhbCB+Rm9ybVBsdWdpbigpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0RyYXdpbmdNb2RlbChBTlBEcmF3aW5nTW9kZWwpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogcHJpdmF0ZToKICAgICB2b2lkIGRyYXcoQU5QQ2FudmFzKik7CiAgICAgdm9pZCBkcmF3UGx1Z2luKGNvbnN0IEFOUEJpdG1hcCYgYml0bWFwLCBjb25zdCBBTlBSZWN0SSYgY2xpcCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9tYWluLmNwcAppbmRleCAzZThmZWU3Li4wN2JhZTY2IDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL21haW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbWFpbi5jcHAKQEAgLTQxLDE5ICs0MSwxOSBAQAogCiAjZGVmaW5lIEVYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQogCi1OUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNiBtb2RlLCBpbnQxNiBhcmdjLAorTlBFcnJvciBOUFBfTmV3KE5QTUlNRVR5cGUgcGx1Z2luVHlwZSwgTlBQIGluc3RhbmNlLCB1aW50MTZfdCBtb2RlLCBpbnQxNl90IGFyZ2MsCiAgICAgICAgIGNoYXIqIGFyZ25bXSwgY2hhciogYXJndltdLCBOUFNhdmVkRGF0YSogc2F2ZWQpOwogTlBFcnJvciBOUFBfRGVzdHJveShOUFAgaW5zdGFuY2UsIE5QU2F2ZWREYXRhKiogc2F2ZSk7CiBOUEVycm9yIE5QUF9TZXRXaW5kb3coTlBQIGluc3RhbmNlLCBOUFdpbmRvdyogd2luZG93KTsKIE5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKTsKKyAgICAgICAgTlBCb29sIHNlZWthYmxlLCB1aW50MTZfdCogc3R5cGUpOwogTlBFcnJvciBOUFBfRGVzdHJveVN0cmVhbShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIE5QUmVhc29uIHJlYXNvbik7Ci1pbnQzMiAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7Ci1pbnQzMiAgIE5QUF9Xcml0ZShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0sIGludDMyIG9mZnNldCwgaW50MzIgbGVuLAoraW50MzJfdCAgIE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSk7CitpbnQzMl90ICAgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLAogICAgICAgICB2b2lkKiBidWZmZXIpOwogdm9pZCAgICBOUFBfU3RyZWFtQXNGaWxlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgY29uc3QgY2hhciogZm5hbWUpOwogdm9pZCAgICBOUFBfUHJpbnQoTlBQIGluc3RhbmNlLCBOUFByaW50KiBwbGF0Zm9ybVByaW50KTsKLWludDE2ICAgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpOworaW50MTZfdCAgIE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KTsKIHZvaWQgICAgTlBQX1VSTE5vdGlmeShOUFAgaW5zdGFuY2UsIGNvbnN0IGNoYXIqIFVSTCwgTlBSZWFzb24gcmVhc29uLAogICAgICAgICB2b2lkKiBub3RpZnlEYXRhKTsKIE5QRXJyb3IgTlBQX0dldFZhbHVlKE5QUCBpbnN0YW5jZSwgTlBQVmFyaWFibGUgdmFyaWFibGUsIHZvaWQgKnZhbHVlKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgIHJldHVybiAiYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbjp0c3Q6VGVzdCBwbHVnaW4gbWltZXR5cGUgaXMgYXBwbGljYXRpb24veC10ZXN0YnJvd3NlcnBsdWdpbiI7CiB9CiAKLU5QRXJyb3IgTlBQX05ldyhOUE1JTUVUeXBlIHBsdWdpblR5cGUsIE5QUCBpbnN0YW5jZSwgdWludDE2IG1vZGUsIGludDE2IGFyZ2MsCitOUEVycm9yIE5QUF9OZXcoTlBNSU1FVHlwZSBwbHVnaW5UeXBlLCBOUFAgaW5zdGFuY2UsIHVpbnQxNl90IG1vZGUsIGludDE2X3QgYXJnYywKICAgICAgICAgICAgICAgICBjaGFyKiBhcmduW10sIGNoYXIqIGFyZ3ZbXSwgTlBTYXZlZERhdGEqIHNhdmVkKQogewogCkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICByZXR1cm4gTlBFUlJfTk9fRVJST1I7CiB9CiAKLU5QRXJyb3IgTlBQX05ld1N0cmVhbShOUFAgaW5zdGFuY2UsIE5QTUlNRVR5cGUgdHlwZSwgTlBTdHJlYW0qIHN0cmVhbSwgTlBCb29sIHNlZWthYmxlLCB1aW50MTYqIHN0eXBlKQorTlBFcnJvciBOUFBfTmV3U3RyZWFtKE5QUCBpbnN0YW5jZSwgTlBNSU1FVHlwZSB0eXBlLCBOUFN0cmVhbSogc3RyZWFtLCBOUEJvb2wgc2Vla2FibGUsIHVpbnQxNl90KiBzdHlwZSkKIHsKICAgICAqc3R5cGUgPSBOUF9BU0ZJTEVPTkxZOwogICAgIHJldHVybiBOUEVSUl9OT19FUlJPUjsKQEAgLTMwMSwxMiArMzAxLDEyIEBACiAgICAgcmV0dXJuIE5QRVJSX05PX0VSUk9SOwogfQogCi1pbnQzMiBOUFBfV3JpdGVSZWFkeShOUFAgaW5zdGFuY2UsIE5QU3RyZWFtKiBzdHJlYW0pCitpbnQzMl90IE5QUF9Xcml0ZVJlYWR5KE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSkKIHsKICAgICByZXR1cm4gMDsKIH0KIAotaW50MzIgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzIgb2Zmc2V0LCBpbnQzMiBsZW4sIHZvaWQqIGJ1ZmZlcikKK2ludDMyX3QgTlBQX1dyaXRlKE5QUCBpbnN0YW5jZSwgTlBTdHJlYW0qIHN0cmVhbSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgbGVuLCB2b2lkKiBidWZmZXIpCiB7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zMTksNyArMzE5LDcgQEAKIHsKIH0KIAotaW50MTYgTlBQX0hhbmRsZUV2ZW50KE5QUCBpbnN0YW5jZSwgdm9pZCogZXZlbnQpCitpbnQxNl90IE5QUF9IYW5kbGVFdmVudChOUFAgaW5zdGFuY2UsIHZvaWQqIGV2ZW50KQogewogICAgIFBsdWdpbk9iamVjdCAqb2JqID0gcmVpbnRlcnByZXRfY2FzdDxQbHVnaW5PYmplY3QqPihpbnN0YW5jZS0+cGRhdGEpOwogICAgIGNvbnN0IEFOUEV2ZW50KiBldnQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEFOUEV2ZW50Kj4oZXZlbnQpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uY3BwCmluZGV4IDk5NjY3YTQuLjAxZDlhNzkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmNwcAorKysgYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5jcHAKQEAgLTQzLDEyICs0MywxMiBAQAogICAgIGJyb3dzZXItPmludmFsaWRhdGVyZWN0KGluc3RhbmNlLCBOVUxMKTsKIH0KIAotc3RhdGljIHVpbnQxNiBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKK3N0YXRpYyB1aW50MTZfdCBybmQxNihmbG9hdCB4LCBpbnQgaW5zZXQpIHsKICAgICBpbnQgaXggPSAoaW50KXJvdW5kZih4KSArIGluc2V0OwogICAgIGlmIChpeCA8IDApIHsKICAgICAgICAgaXggPSAwOwogICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2PihpeCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpeCk7CiB9CiAKIHN0YXRpYyB2b2lkIGludmFsKE5QUCBpbnN0YW5jZSwgY29uc3QgQU5QUmVjdEYmIHIsIGJvb2wgZG9BQSkgewpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgcmV0dXJuIChpbnB1dCA9PSBtX2FjdGl2ZU5hdikgPyBtX3BhaW50QWN0aXZlIDogbV9wYWludERpc2FibGVkOwogfQogCi1pbnQxNiBOYXZpZ2F0aW9uUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IE5hdmlnYXRpb25QbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBOUFAgaW5zdGFuY2UgPSB0aGlzLT5pbnN0KCk7CiAKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5oIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9uYXZpZ2F0aW9uL05hdmlnYXRpb25QbHVnaW4uaAppbmRleCBjYTEyYWU3Li5jMjA0NGJiIDEwMDY0NAotLS0gYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL25hdmlnYXRpb24vTmF2aWdhdGlvblBsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvbmF2aWdhdGlvbi9OYXZpZ2F0aW9uUGx1Z2luLmgKQEAgLTMzLDcgKzMzLDcgQEAKIAlOYXZpZ2F0aW9uUGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5OYXZpZ2F0aW9uUGx1Z2luKCk7CiAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRHJhd2luZ01vZGVsKEFOUERyYXdpbmdNb2RlbCk7Ci0gICAgdmlydHVhbCBpbnQxNiBoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KTsKKyAgICB2aXJ0dWFsIGludDE2X3QgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CiBwcml2YXRlOgogICAgIHZvaWQgZHJhdyhBTlBDYW52YXMqKTsKICAgICB2b2lkIGRyYXdQbHVnaW4oY29uc3QgQU5QQml0bWFwJiBiaXRtYXAsIGNvbnN0IEFOUFJlY3RJJiBjbGlwKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uY3BwIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKaW5kZXggNzFiOWYyNC4uYWJlNjgwNSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKKysrIGIvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5jcHAKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgIH0KIH0KIAotaW50MTYgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKK2ludDE2X3QgUGFpbnRQbHVnaW46OmhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpIHsKICAgICBzd2l0Y2ggKGV2dC0+ZXZlbnRUeXBlKSB7CiAgICAgICAgIGNhc2Uga1RvdWNoX0FOUEV2ZW50VHlwZTogewogICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCkgZXZ0LT5kYXRhLnRvdWNoLng7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3BhaW50L1BhaW50UGx1Z2luLmgKaW5kZXggMDM1ZTUxYi4uZmZkZjYyNCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS9wYWludC9QYWludFBsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvcGFpbnQvUGFpbnRQbHVnaW4uaApAQCAtMzMsNyArMzMsNyBAQAogcHVibGljOgogICAgIFBhaW50UGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5QYWludFBsdWdpbigpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmNwcCBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCmluZGV4IGYyNDI5NWIuLmJmM2FiNzYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uY3BwCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICB9CiB9CiAKLWludDE2IFZpZGVvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CitpbnQxNl90IFZpZGVvUGx1Z2luOjpoYW5kbGVFdmVudChjb25zdCBBTlBFdmVudCogZXZ0KSB7CiAgICAgc3dpdGNoIChldnQtPmV2ZW50VHlwZSkgewogICAgICAgICBjYXNlIGtMaWZlY3ljbGVfQU5QRXZlbnRUeXBlOiB7CiAgICAgICAgICAgICBzd2l0Y2ggKGV2dC0+ZGF0YS5saWZlY3ljbGUuYWN0aW9uKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmggYi9zYW1wbGVzL0Jyb3dzZXJQbHVnaW4vam5pL3ZpZGVvL1ZpZGVvUGx1Z2luLmgKaW5kZXggNzAxZTJkMC4uZmIxNTM4NiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ccm93c2VyUGx1Z2luL2puaS92aWRlby9WaWRlb1BsdWdpbi5oCisrKyBiL3NhbXBsZXMvQnJvd3NlclBsdWdpbi9qbmkvdmlkZW8vVmlkZW9QbHVnaW4uaApAQCAtMzIsNyArMzIsNyBAQAogcHVibGljOgogICAgIFZpZGVvUGx1Z2luKE5QUCBpbnN0KTsKICAgICB2aXJ0dWFsIH5WaWRlb1BsdWdpbigpOwotICAgIHZpcnR1YWwgaW50MTYgaGFuZGxlRXZlbnQoY29uc3QgQU5QRXZlbnQqIGV2dCk7CisgICAgdmlydHVhbCBpbnQxNl90IGhhbmRsZUV2ZW50KGNvbnN0IEFOUEV2ZW50KiBldnQpOwogICAgIHZpcnR1YWwgam9iamVjdCBnZXRTdXJmYWNlKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvQW5kcm9pZC5tayBiL3NhbXBsZXMvQ29ycEFwcC9BbmRyb2lkLm1rCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIHNhbXBsZXMvTm90ZVBhZC9BbmRyb2lkLm1rCnJlbmFtZSB0byBzYW1wbGVzL0NvcnBBcHAvQW5kcm9pZC5tawppbmRleCA3OTM5MjEyLi4zN2I5OGIwIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvQW5kcm9pZC5taworKysgYi9zYW1wbGVzL0NvcnBBcHAvQW5kcm9pZC5tawpAQCAtNiw3ICs2LDcgQEAKICMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gTm90ZVBhZAorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IENvcnBBcHAKIAogTE9DQUxfU0RLX1ZFUlNJT04gOj0gY3VycmVudAogCkBAIC0xNCwzICsxNCw0IEBACiAKICMgVXNlIHRoZSBmb2xsb3dpbmcgaW5jbHVkZSB0byBtYWtlIG91ciB0ZXN0IGFway4KIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Db3JwQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9zYW1wbGVzL0NvcnBBcHAvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmEzMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Db3JwQXBwL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzwhLS0gRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhpcyBBbmRyb2lkIGFwcGxpY2F0aW9uLiAgVGhlIG5hbWVzcGFjZQorICAgICBhdHRyaWJ1dGUgYnJpbmdzIGluIHRoZSBBbmRyb2lkIHBsYXRmb3JtIG5hbWVzcGFjZSwgYW5kIHRoZSBwYWNrYWdlCisgICAgIHN1cHBsaWVzIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBhcHBsaWNhdGlvbi4gIFdoZW4gd3JpdGluZyB5b3VyCisgICAgIG93biBhcHBsaWNhdGlvbiwgdGhlIHBhY2thZ2UgbmFtZSBtdXN0IGJlIGNoYW5nZWQgZnJvbSAiY29tLmV4YW1wbGUuKiIKKyAgICAgdG8gY29tZSBmcm9tIGEgZG9tYWluIHRoYXQgeW91IG93biBvciBoYXZlIGNvbnRyb2wgb3Zlci4gLS0+Cis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQuY29ycGFwcCI+CisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkNvcnBvcmF0ZURldmljZUFkbWluRGVtb0FwcCI+CisgICAgICAgIDxhY3Rpdml0eSBhbmRyb2lkOm5hbWU9IkNvcnBBcHBBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY29ycF9hcHBfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIi8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9hY3Rpdml0eT4KKworICAgICAgICA8cmVjZWl2ZXIgYW5kcm9pZDpuYW1lPSIuYXBwLkNvcnBEZXZpY2VBZG1pbiIKKyAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL2NvcnBfYXBwX2FkbWluIgorICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZGVzY3JpcHRpb249IkBzdHJpbmcvY29ycF9kZXZpY2VfYWRtaW5fZGVzY3JpcHRpb24iCisgICAgICAgICAgICAgICAgYW5kcm9pZDpwZXJtaXNzaW9uPSJhbmRyb2lkLnBlcm1pc3Npb24uQklORF9ERVZJQ0VfQURNSU4iPgorICAgICAgICAgICAgPG1ldGEtZGF0YSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmNvcnBfZGV2aWNlX2FkbWluIgorICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnJlc291cmNlPSJAeG1sL2NvcnBfZGV2aWNlX2FkbWluIiAvPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuYXBwLmFjdGlvbi5ERVZJQ0VfQURNSU5fRU5BQkxFRCIgLz4KKyAgICAgICAgICAgIDwvaW50ZW50LWZpbHRlcj4KKyAgICAgICAgPC9yZWNlaXZlcj4KKyAgICA8L2FwcGxpY2F0aW9uPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9yZXMvbGF5b3V0L2NvcnBfYXBwX2FjdGl2aXR5LnhtbCBiL3NhbXBsZXMvQ29ycEFwcC9yZXMvbGF5b3V0L2NvcnBfYXBwX2FjdGl2aXR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjFlNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Db3JwQXBwL3Jlcy9sYXlvdXQvY29ycF9hcHBfYWN0aXZpdHkueG1sCkBAIC0wLDAgKzEsMzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPFNjcm9sbFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorICAgIDxMaW5lYXJMYXlvdXQKKyAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiIGFuZHJvaWQ6cGFkZGluZz0iNGRpcCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfaG9yaXpvbnRhbCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiPgorCisgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL3N0YXR1c190ZXh0IgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAiCisgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29ycF9hcHBfc3RhdHVzX3dhaXRpbmdfdGV4dCIvPgorCisgICAgICAgIDxCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9zZXRfYnV0dG9uIgorICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvY29ycF9hcHBfc2V0X2J1dHRvbl90ZXh0Ii8+CisKKyAgICA8L0xpbmVhckxheW91dD4KKzwvU2Nyb2xsVmlldz4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Db3JwQXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9zYW1wbGVzL0NvcnBBcHAvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGVmNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Db3JwQXBwL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxyZXNvdXJjZXM+CisKKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX3RpdGxlX3RleHQiPkNvcnBvcmF0ZSBEZW1vIEFwcDwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9hcHBfc2V0X2J1dHRvbl90ZXh0Ij5TZXQgQ29ycCBHbG9iYWwgUHJveHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX3N0YXR1c19zdWNjZXNzX3RleHQiPkdsb2JhbCBQcm94eSBzdWNjZXNzZnVsbHkgc2V0PC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9zdGF0dXNfZmFpbGVkX3RleHQiPkdsb2JhbCBQcm94eSBjb3VsZCBub3QgYmUgc2V0Ljwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0iY29ycF9hcHBfc3RhdHVzX3dhaXRpbmdfdGV4dCI+V2FpdGluZyB0byBzZXQgR2xvYmFsIFByb3h5Li4uPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9wcm94eV9uYW1lIj5wcm94eS5jb3JwYXBwLmNvbTo4MDgwPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2FwcF9wcm94eV9leGNsX2xpc3QiPmdvb2dsZS5jb20seW91dHViZS5jb208L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX2FjdGl2aXR5Ij5TYW1wbGUgQ29ycCBBcHAgQWN0aXZpdHk8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvcnBfYXBwX2FkbWluIj5TYW1wbGUgQ29ycCBBcHAgRGV2aWNlIEFkbWluPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJjb3JwX2RldmljZV9hZG1pbl9kZXNjcmlwdGlvbiI+Q29ycG9yYXRlIGRldmljZSBhZG1pbiBzYW1wbGUgZGVtbzwvc3RyaW5nPgorCis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9yZXMveG1sL2NvcnBfZGV2aWNlX2FkbWluLnhtbCBiL3NhbXBsZXMvQ29ycEFwcC9yZXMveG1sL2NvcnBfZGV2aWNlX2FkbWluLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDY0YjYwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Db3JwQXBwL3Jlcy94bWwvY29ycF9kZXZpY2VfYWRtaW4ueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8IS0tIEJFR0lOX0lOQ0xVREUobWV0YV9kYXRhKSAtLT4KKzxkZXZpY2UtYWRtaW4geG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KKyAgICA8dXNlcy1wb2xpY2llcz4KKyAgICAgICAgPHNldC1nbG9iYWwtcHJveHkgLz4KKyAgICA8L3VzZXMtcG9saWNpZXM+Cis8L2RldmljZS1hZG1pbj4KKzwhLS0gRU5EX0lOQ0xVREUobWV0YV9kYXRhKSAtLT4KKwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Db3JwQXBwL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2NvcnBhcHAvQ29ycEFwcEFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL0NvcnBBcHAvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvY29ycGFwcC9Db3JwQXBwQWN0aXZpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Db3JwQXBwL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2NvcnBhcHAvQ29ycEFwcEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuY29ycGFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLmFwcC5hZG1pbi5EZXZpY2VQb2xpY3lNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3Lk9uQ2xpY2tMaXN0ZW5lcjsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Qcm94eTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgbWluaW1hbCBHbG9ibCBQcm94eS1zZXR0aW5nIGNvcnAgYXBwICBhcHBsaWNhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIENvcnBBcHBBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2l0aCB0aGUgYWN0aXZpdHkgaXMgZmlyc3QgY3JlYXRlZC4KKyAgICAgKi8KKworICAgIEJ1dHRvbiBtU2V0QnV0dG9uOworICAgIFRleHRWaWV3IG1TdGF0dXNUZXh0OworICAgIFN0cmluZyBtUHJveHlOYW1lOworICAgIFN0cmluZyBtUHJveHlFeGNsTGlzdDsKKyAgICBTdHJpbmcgbVN1Y2Nlc3M7CisgICAgU3RyaW5nIG1GYWlsdXJlOworCisgICAgRGV2aWNlUG9saWN5TWFuYWdlciBtRFBNOworICAgIEFjdGl2aXR5TWFuYWdlciBtQU07CisgICAgQ29tcG9uZW50TmFtZSBtQ29ycERldmljZUFkbWluOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworCisgICAgICAgIG1EUE0gPSAoRGV2aWNlUG9saWN5TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuREVWSUNFX1BPTElDWV9TRVJWSUNFKTsKKyAgICAgICAgbUFNID0gKEFjdGl2aXR5TWFuYWdlcilnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSk7CisgICAgICAgIG1Db3JwRGV2aWNlQWRtaW4gPSBuZXcgQ29tcG9uZW50TmFtZShDb3JwQXBwQWN0aXZpdHkudGhpcywgQ29ycERldmljZUFkbWluLmNsYXNzKTsKKworICAgICAgICAvLyBTZXQgdGhlIGxheW91dCBmb3IgdGhpcyBhY3Rpdml0eS4gIFlvdSBjYW4gZmluZCBpdAorICAgICAgICAvLyBpbiByZXMvbGF5b3V0L2NvcnBfYXBwX2FjdGl2aXR5LnhtbAorICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jb3JwX2FwcF9hY3Rpdml0eSk7CisKKyAgICAgICAgbVNldEJ1dHRvbiA9IChCdXR0b24pZmluZFZpZXdCeUlkKFIuaWQuc2V0X2J1dHRvbik7CisgICAgICAgIG1TZXRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXRMaXN0ZW5lcik7CisgICAgICAgIG1TdGF0dXNUZXh0ID0gKEJ1dHRvbilmaW5kVmlld0J5SWQoUi5pZC5zdGF0dXNfdGV4dCk7CisKKyAgICAgICAgYm9vbGVhbiBhY3RpdmUgPSBtRFBNLmlzQWRtaW5BY3RpdmUobUNvcnBEZXZpY2VBZG1pbik7CisgICAgICAgIG1TZXRCdXR0b24uc2V0RW5hYmxlZChhY3RpdmUpOworICAgICAgICBtUHJveHlOYW1lID0gZ2V0UmVzb3VyY2VzKCkuZ2V0U3RyaW5nKFIuc3RyaW5nLmNvcnBfYXBwX3Byb3h5X25hbWUpOworICAgICAgICBtUHJveHlFeGNsTGlzdCA9IGdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb3JwX2FwcF9wcm94eV9leGNsX2xpc3QpOworICAgICAgICBtU3VjY2VzcyA9IGdldFJlc291cmNlcygpLmdldFN0cmluZyhSLnN0cmluZy5jb3JwX2FwcF9zdGF0dXNfc3VjY2Vzc190ZXh0KTsKKyAgICAgICAgbUZhaWx1cmUgPSBnZXRSZXNvdXJjZXMoKS5nZXRTdHJpbmcoUi5zdHJpbmcuY29ycF9hcHBfc3RhdHVzX2ZhaWxlZF90ZXh0KTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBPbkNsaWNrTGlzdGVuZXIgbVNldExpc3RlbmVyID0gbmV3IE9uQ2xpY2tMaXN0ZW5lcigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKKyAgICAgICAgICAgIFN0cmluZ1tdIHByb3h5Q29tcG9uZW50cyA9IG1Qcm94eU5hbWUuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGlmIChwcm94eUNvbXBvbmVudHMubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChDb3JwQXBwQWN0aXZpdHkudGhpcywgIldyb25nIHByb3h5IHNwZWNpZmljYXRpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFByb3h5IGluc3RQcm94eSA9IG5ldyBQcm94eShQcm94eS5UeXBlLkhUVFAsCisgICAgICAgICAgICAgICAgICAgIG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwcm94eUNvbXBvbmVudHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwcm94eUNvbXBvbmVudHNbMV0pKSk7CisgICAgICAgICAgICBTdHJpbmdbXSBsaXN0RG9tcyA9IG1Qcm94eUV4Y2xMaXN0LnNwbGl0KCIsIik7CisgICAgICAgICAgICBpZiAobGlzdERvbXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBUb2FzdC5tYWtlVGV4dChDb3JwQXBwQWN0aXZpdHkudGhpcywgIldyb25nIGV4Y2x1c2lvbiBsaXN0IGZvcm1hdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgVG9hc3QuTEVOR1RIX1NIT1JUKS5zaG93KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gZXhjbExpc3QgPSAgQXJyYXlzLmFzTGlzdChsaXN0RG9tcyk7CisgICAgICAgICAgICBib29sZWFuIGFjdGl2ZSA9IG1EUE0uaXNBZG1pbkFjdGl2ZShtQ29ycERldmljZUFkbWluKTsKKyAgICAgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgICAgICBtRFBNLnNldEdsb2JhbFByb3h5KG1Db3JwRGV2aWNlQWRtaW4sIGluc3RQcm94eSwgZXhjbExpc3QpOworICAgICAgICAgICAgICAgIENvbXBvbmVudE5hbWUgcHJveHlBZG1pbiA9IG1EUE0uZ2V0R2xvYmFsUHJveHlBZG1pbigpOworICAgICAgICAgICAgICAgIGlmICgocHJveHlBZG1pbiAhPSBudWxsKSAmJiAocHJveHlBZG1pbi5lcXVhbHMobUNvcnBEZXZpY2VBZG1pbikpKSB7CisgICAgICAgICAgICAgICAgICAgIFRvYXN0Lm1ha2VUZXh0KENvcnBBcHBBY3Rpdml0eS50aGlzLCAiR2xvYmFsIFByb3h5IHNldCBieSBkZXZpY2UgYWRtaW4uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb2FzdC5MRU5HVEhfU0hPUlQpLnNob3coKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXR1c1RleHQuc2V0VGV4dChtU3VjY2Vzcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVG9hc3QubWFrZVRleHQoQ29ycEFwcEFjdGl2aXR5LnRoaXMsICJGYWlsZWQgdG8gc2V0IEdsb2JhbCBQcm94eS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgICAgICAgICAgICAgICAgICBtU3RhdHVzVGV4dC5zZXRUZXh0KG1GYWlsdXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCit9CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQ29ycEFwcC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9jb3JwYXBwL0NvcnBEZXZpY2VBZG1pbi5qYXZhIGIvc2FtcGxlcy9Db3JwQXBwL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL2NvcnBhcHAvQ29ycERldmljZUFkbWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhODNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvQ29ycEFwcC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9jb3JwYXBwL0NvcnBEZXZpY2VBZG1pbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuY29ycGFwcDsKKworaW1wb3J0IGFuZHJvaWQuYXBwLmFkbWluLkRldmljZUFkbWluUmVjZWl2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2hhcmVkUHJlZmVyZW5jZXM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuVG9hc3Q7CisKK3B1YmxpYyBjbGFzcyBDb3JwRGV2aWNlQWRtaW4gZXh0ZW5kcyBEZXZpY2VBZG1pblJlY2VpdmVyIHsKKworICAgIHN0YXRpYyBTaGFyZWRQcmVmZXJlbmNlcyBnZXRTYW1wbGVQcmVmZXJlbmNlcyhDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U2hhcmVkUHJlZmVyZW5jZXMoRGV2aWNlQWRtaW5SZWNlaXZlci5jbGFzcy5nZXROYW1lKCksIDApOworICAgIH0KKworICAgIHZvaWQgc2hvd1RvYXN0KENvbnRleHQgY29udGV4dCwgQ2hhclNlcXVlbmNlIG1zZykgeworICAgICAgICBUb2FzdC5tYWtlVGV4dChjb250ZXh0LCBtc2csIFRvYXN0LkxFTkdUSF9TSE9SVCkuc2hvdygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRW5hYmxlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IGVuYWJsZWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIG9uRGlzYWJsZVJlcXVlc3RlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgcmV0dXJuICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IGRpc2FibGUgcmVxdWVzdGVkIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkRpc2FibGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgIlNhbXBsZSBDb3JwIERldmljZSBBZG1pbjogZGlzYWJsZWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhc3N3b3JkQ2hhbmdlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IHB3IGNoYW5nZWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblBhc3N3b3JkRmFpbGVkKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgeworICAgICAgICBzaG93VG9hc3QoY29udGV4dCwgIlNhbXBsZSBDb3JwIERldmljZSBBZG1pbjogcHcgZmFpbGVkIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25QYXNzd29yZFN1Y2NlZWRlZChDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKKyAgICAgICAgc2hvd1RvYXN0KGNvbnRleHQsICJTYW1wbGUgQ29ycCBEZXZpY2UgQWRtaW46IHB3IHN1Y2NlZWRlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkTWFuaWZlc3QueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKaW5kZXggMDRmNGRiZS4uN2QzY2U0MyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWRNYW5pZmVzdC54bWwKQEAgLTY1LDkgKzY1LDEyIEBACiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CiAKICAgICAgICAgICAgIDwhLS0gVGhpcyBmaWx0ZXIgc2F5cyB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuZXcgbm90ZSBpbnNpZGUKLSAgICAgICAgICAgICAgICAgb2YgYSBkaXJlY3Rvcnkgb2Ygbm90ZXMuIC0tPgorICAgICAgICAgICAgICAgICBvZiBhIGRpcmVjdG9yeSBvZiBub3Rlcy4gIFRoZSBJTlNFUlQgYWN0aW9uIGNyZWF0ZXMgYW4KKyAgICAgICAgICAgICAgICAgZW1wdHkgbm90ZTsgdGhlIFBBU1RFIGFjdGlvbiBpbml0aWFsaXplcyBhIG5ldyBub3RlIGZyb20KKyAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGNsaXBib2FyZC4gLS0+CiAgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KICAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLklOU0VSVCIgLz4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLlBBU1RFIiAvPgogICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkRFRkFVTFQiIC8+CiAgICAgICAgICAgICAgICAgPGRhdGEgYW5kcm9pZDptaW1lVHlwZT0idm5kLmFuZHJvaWQuY3Vyc29yLmRpci92bmQuZ29vZ2xlLm5vdGUiIC8+CiAgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CkBAIC0xMTAsNiArMTEzLDYgQEAKIAogICAgIDwvYXBwbGljYXRpb24+CiAKLSAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI0IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjMiLz4KKyAgICA8dXNlcy1zZGsgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSI4IiBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiLz4KIDwvbWFuaWZlc3Q+CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKaW5kZXggMTY4ZGI5Mi4uNDNiZTRkZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTE1LDggKzE1LDEwIEBACiAtLT4KIAogPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9Im1lbnVfY29weSI+Q29weTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9kZWxldGUiPkRlbGV0ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9pbnNlcnQiPkFkZCBub3RlPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJtZW51X3Bhc3RlIj5QYXN0ZTwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9yZXZlcnQiPlJldmVydDwvc3RyaW5nPgogICAgIDxzdHJpbmcgbmFtZT0ibWVudV9kaXNjYXJkIj5EaXNjYXJkPC9zdHJpbmc+CiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVFZGl0b3IuamF2YQppbmRleCBlNDVlZmQ4Li43OGE5NzIxIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlRWRpdG9yLmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZUVkaXRvci5qYXZhCkBAIC0xNiwxMCArMTYsMTMgQEAKIAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQ7CiAKLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZC5Ob3RlczsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZDsKIAogaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwYm9hcmRNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5DbGlwcGVkRGF0YTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CkBAIC0zNiwzNSArMzksNTAgQEAKIGltcG9ydCBhbmRyb2lkLndpZGdldC5FZGl0VGV4dDsKIAogLyoqCi0gKiBBIGdlbmVyaWMgYWN0aXZpdHkgZm9yIGVkaXRpbmcgYSBub3RlIGluIGEgZGF0YWJhc2UuICBUaGlzIGNhbiBiZSB1c2VkCi0gKiBlaXRoZXIgdG8gc2ltcGx5IHZpZXcgYSBub3RlIHtAbGluayBJbnRlbnQjQUNUSU9OX1ZJRVd9LCB2aWV3IGFuZCBlZGl0IGEgbm90ZQotICoge0BsaW5rIEludGVudCNBQ1RJT05fRURJVH0sIG9yIGNyZWF0ZSBhIG5ldyBub3RlIHtAbGluayBJbnRlbnQjQUNUSU9OX0lOU0VSVH0uICAKKyAqIFRoaXMgQWN0aXZpdHkgaGFuZGxlcyAiZWRpdGluZyIgYSBub3RlLCB3aGVyZSBlZGl0aW5nIGlzIHJlc3BvbmRpbmcgdG8KKyAqIHtAbGluayBJbnRlbnQjQUNUSU9OX1ZJRVd9IChyZXF1ZXN0IHRvIHZpZXcgZGF0YSksIGVkaXQgYSBub3RlCisgKiB7QGxpbmsgSW50ZW50I0FDVElPTl9FRElUfSwgY3JlYXRlIGEgbm90ZSB7QGxpbmsgSW50ZW50I0FDVElPTl9JTlNFUlR9LCBvcgorICogY3JlYXRlIGEgbmV3IG5vdGUgZnJvbSB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHtAbGluayBJbnRlbnQjQUNUSU9OX1BBU1RFfS4KKyAqCisgKiBOT1RFOiBOb3RpY2UgdGhhdCB0aGUgcHJvdmlkZXIgb3BlcmF0aW9ucyBpbiB0aGlzIEFjdGl2aXR5IGFyZSB0YWtpbmcgcGxhY2Ugb24gdGhlIFVJIHRocmVhZC4KKyAqIFRoaXMgaXMgbm90IGEgZ29vZCBwcmFjdGljZS4gSXQgaXMgb25seSBkb25lIGhlcmUgdG8gbWFrZSB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLiBBIHJlYWwKKyAqIGFwcGxpY2F0aW9uIHNob3VsZCB1c2UgdGhlIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXJ9CisgKiBvciB7QGxpbmsgYW5kcm9pZC5vcy5Bc3luY1Rhc2t9IG9iamVjdCB0byBwZXJmb3JtIG9wZXJhdGlvbnMgYXN5bmNocm9ub3VzbHkgb24gYSBzZXBhcmF0ZSB0aHJlYWQuCiAgKi8KIHB1YmxpYyBjbGFzcyBOb3RlRWRpdG9yIGV4dGVuZHMgQWN0aXZpdHkgeworICAgIC8vIEZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGVzIjsKIAotICAgIC8qKgotICAgICAqIFN0YW5kYXJkIHByb2plY3Rpb24gZm9yIHRoZSBpbnRlcmVzdGluZyBjb2x1bW5zIG9mIGEgbm9ybWFsIG5vdGUuCisgICAgLyoKKyAgICAgKiBDcmVhdGVzIGEgcHJvamVjdGlvbiB0aGF0IHJldHVybnMgdGhlIG5vdGUgSUQgYW5kIHRoZSBub3RlIGNvbnRlbnRzLgogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10gewotICAgICAgICAgICAgTm90ZXMuX0lELCAvLyAwCi0gICAgICAgICAgICBOb3Rlcy5OT1RFLCAvLyAxCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9CisgICAgICAgIG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUKICAgICB9OwotICAgIC8qKiBUaGUgaW5kZXggb2YgdGhlIG5vdGUgY29sdW1uICovCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBub3RlIGNvbHVtbgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSU5ERVhfTk9URSA9IDE7Ci0gICAgCi0gICAgLy8gVGhpcyBpcyBvdXIgc3RhdGUgZGF0YSB0aGF0IGlzIHN0b3JlZCB3aGVuIGZyZWV6aW5nLgorCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSB0aXRsZSBjb2x1bW4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lOREVYX1RJVExFID0gMjsKKworICAgIC8vIEEgbGFiZWwgZm9yIHRoZSBzYXZlZCBzdGF0ZSBvZiB0aGUgYWN0aXZpdHkKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUxfQ09OVEVOVCA9ICJvcmlnQ29udGVudCI7CiAKLSAgICAvLyBJZGVudGlmaWVycyBmb3Igb3VyIG1lbnUgaXRlbXMuCisgICAgLy8gTWVudSBpdGVtIGlkZW50aWZpZXJzCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVkVSVF9JRCA9IE1lbnUuRklSU1Q7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERJU0NBUkRfSUQgPSBNZW51LkZJUlNUICsgMTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMRVRFX0lEID0gTWVudS5GSVJTVCArIDI7CiAKLSAgICAvLyBUaGUgZGlmZmVyZW50IGRpc3RpbmN0IHN0YXRlcyB0aGUgYWN0aXZpdHkgY2FuIGJlIHJ1biBpbi4KKyAgICAvLyBUaGlzIEFjdGl2aXR5IGNhbiBiZSBzdGFydGVkIGJ5IG1vcmUgdGhhbiBvbmUgYWN0aW9uLiBFYWNoIGFjdGlvbiBpcyByZXByZXNlbnRlZAorICAgIC8vIGFzIGEgInN0YXRlIiBjb25zdGFudAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FRElUID0gMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSU5TRVJUID0gMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFTVEUgPSAyOwogCisgICAgLy8gR2xvYmFsIG11dGFibGUgdmFyaWFibGVzCiAgICAgcHJpdmF0ZSBpbnQgbVN0YXRlOwogICAgIHByaXZhdGUgYm9vbGVhbiBtTm90ZU9ubHkgPSBmYWxzZTsKICAgICBwcml2YXRlIFVyaSBtVXJpOwpAQCAtNzMsMTI5ICs5MSwyMzUgQEAKICAgICBwcml2YXRlIFN0cmluZyBtT3JpZ2luYWxDb250ZW50OwogCiAgICAgLyoqCi0gICAgICogQSBjdXN0b20gRWRpdFRleHQgdGhhdCBkcmF3cyBsaW5lcyBiZXR3ZWVuIGVhY2ggbGluZSBvZiB0ZXh0IHRoYXQgaXMgZGlzcGxheWVkLgorICAgICAqIERlZmluZXMgYSBjdXN0b20gRWRpdFRleHQgVmlldyB0aGF0IGRyYXdzIGxpbmVzIGJldHdlZW4gZWFjaCBsaW5lIG9mIHRleHQgdGhhdCBpcyBkaXNwbGF5ZWQuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5lZEVkaXRUZXh0IGV4dGVuZHMgRWRpdFRleHQgewogICAgICAgICBwcml2YXRlIFJlY3QgbVJlY3Q7CiAgICAgICAgIHByaXZhdGUgUGFpbnQgbVBhaW50OwogCi0gICAgICAgIC8vIHdlIG5lZWQgdGhpcyBjb25zdHJ1Y3RvciBmb3IgTGF5b3V0SW5mbGF0ZXIKKyAgICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IExheW91dEluZmxhdGVyCiAgICAgICAgIHB1YmxpYyBMaW5lZEVkaXRUZXh0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7CiAgICAgICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAKKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIFJlY3QgYW5kIGEgUGFpbnQgb2JqZWN0LCBhbmQgc2V0cyB0aGUgc3R5bGUgYW5kIGNvbG9yIG9mIHRoZSBQYWludCBvYmplY3QuCiAgICAgICAgICAgICBtUmVjdCA9IG5ldyBSZWN0KCk7CiAgICAgICAgICAgICBtUGFpbnQgPSBuZXcgUGFpbnQoKTsKICAgICAgICAgICAgIG1QYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5TVFJPS0UpOwogICAgICAgICAgICAgbVBhaW50LnNldENvbG9yKDB4ODAwMDAwRkYpOwogICAgICAgICB9Ci0gICAgICAgIAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCB0byBkcmF3IHRoZSBMaW5lZEVkaXRUZXh0IG9iamVjdAorICAgICAgICAgKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgb24gd2hpY2ggdGhlIGJhY2tncm91bmQgaXMgZHJhd24uCisgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKKworICAgICAgICAgICAgLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGxpbmVzIG9mIHRleHQgaW4gdGhlIFZpZXcuCiAgICAgICAgICAgICBpbnQgY291bnQgPSBnZXRMaW5lQ291bnQoKTsKKworICAgICAgICAgICAgLy8gR2V0cyB0aGUgZ2xvYmFsIFJlY3QgYW5kIFBhaW50IG9iamVjdHMKICAgICAgICAgICAgIFJlY3QgciA9IG1SZWN0OwogICAgICAgICAgICAgUGFpbnQgcGFpbnQgPSBtUGFpbnQ7CiAKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEcmF3cyBvbmUgbGluZSBpbiB0aGUgcmVjdGFuZ2xlIGZvciBldmVyeSBsaW5lIG9mIHRleHQgaW4gdGhlIEVkaXRUZXh0CisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCisgICAgICAgICAgICAgICAgLy8gR2V0cyB0aGUgYmFzZWxpbmUgY29vcmRpbmF0ZXMgZm9yIHRoZSBjdXJyZW50IGxpbmUgb2YgdGV4dAogICAgICAgICAgICAgICAgIGludCBiYXNlbGluZSA9IGdldExpbmVCb3VuZHMoaSwgcik7CiAKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIERyYXdzIGEgbGluZSBpbiB0aGUgYmFja2dyb3VuZCBmcm9tIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGUgdG8gdGhlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAqIGF0IGEgdmVydGljYWwgcG9zaXRpb24gb25lIGRpcCBiZWxvdyB0aGUgYmFzZWxpbmUsIHVzaW5nIHRoZSAicGFpbnQiIG9iamVjdAorICAgICAgICAgICAgICAgICAqIGZvciBkZXRhaWxzLgorICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGNhbnZhcy5kcmF3TGluZShyLmxlZnQsIGJhc2VsaW5lICsgMSwgci5yaWdodCwgYmFzZWxpbmUgKyAxLCBwYWludCk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIEZpbmlzaGVzIHVwIGJ5IGNhbGxpbmcgdGhlIHBhcmVudCBtZXRob2QKICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjYW52YXMpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IEFuZHJvaWQgd2hlbiB0aGUgQWN0aXZpdHkgaXMgZmlyc3Qgc3RhcnRlZC4gRnJvbSB0aGUgaW5jb21pbmcKKyAgICAgKiBJbnRlbnQsIGl0IGRldGVybWluZXMgd2hhdCBraW5kIG9mIGVkaXRpbmcgaXMgZGVzaXJlZCwgYW5kIHRoZW4gZG9lcyBpdC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhbiBJbnRlbnQgdG8gdXNlIHdoZW4gdGhlIEFjdGl2aXR5IG9iamVjdCdzIHJlc3VsdCBpcyBzZW50IGJhY2sgdG8gdGhlCisgICAgICAgICAqIGNhbGxlci4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKIAotICAgICAgICAvLyBEbyBzb21lIHNldHVwIGJhc2VkIG9uIHRoZSBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkLgorICAgICAgICAvKgorICAgICAgICAgKiAgU2V0cyB1cCBmb3IgdGhlIGVkaXQsIGJhc2VkIG9uIHRoZSBhY3Rpb24gc3BlY2lmaWVkIGZvciB0aGUgaW5jb21pbmcgSW50ZW50LgorICAgICAgICAgKi8KIAorICAgICAgICAvLyBHZXRzIHRoZSBhY3Rpb24gdGhhdCB0cmlnZ2VyZWQgdGhlIGludGVudCBmaWx0ZXIgZm9yIHRoaXMgQWN0aXZpdHkKICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKKworICAgICAgICAvLyBGb3IgYW4gZWRpdCBhY3Rpb246CiAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX0VESVQuZXF1YWxzKGFjdGlvbikpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3RlZCB0byBlZGl0OiBzZXQgdGhhdCBzdGF0ZSwgYW5kIHRoZSBkYXRhIGJlaW5nIGVkaXRlZC4KKworICAgICAgICAgICAgLy8gU2V0cyB0aGUgQWN0aXZpdHkgc3RhdGUgdG8gRURJVCwgYW5kIGdldHMgdGhlIFVSSSBmb3IgdGhlIGRhdGEgdG8gYmUgZWRpdGVkLgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfRURJVDsKICAgICAgICAgICAgIG1VcmkgPSBpbnRlbnQuZ2V0RGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKEludGVudC5BQ1RJT05fSU5TRVJULmVxdWFscyhhY3Rpb24pKSB7Ci0gICAgICAgICAgICAvLyBSZXF1ZXN0ZWQgdG8gaW5zZXJ0OiBzZXQgdGhhdCBzdGF0ZSwgYW5kIGNyZWF0ZSBhIG5ldyBlbnRyeQotICAgICAgICAgICAgLy8gaW4gdGhlIGNvbnRhaW5lci4KKworICAgICAgICAgICAgLy8gRm9yIGFuIGluc2VydCBvciBwYXN0ZSBhY3Rpb246CisgICAgICAgIH0gZWxzZSBpZiAoSW50ZW50LkFDVElPTl9JTlNFUlQuZXF1YWxzKGFjdGlvbikKKyAgICAgICAgICAgICAgICB8fCBJbnRlbnQuQUNUSU9OX1BBU1RFLmVxdWFscyhhY3Rpb24pKSB7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIEFjdGl2aXR5IHN0YXRlIHRvIElOU0VSVCwgZ2V0cyB0aGUgZ2VuZXJhbCBub3RlIFVSSSwgYW5kIGluc2VydHMgYW4KKyAgICAgICAgICAgIC8vIGVtcHR5IHJlY29yZCBpbiB0aGUgcHJvdmlkZXIKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOU0VSVDsKICAgICAgICAgICAgIG1VcmkgPSBnZXRDb250ZW50UmVzb2x2ZXIoKS5pbnNlcnQoaW50ZW50LmdldERhdGEoKSwgbnVsbCk7CiAKLSAgICAgICAgICAgIC8vIElmIHdlIHdlcmUgdW5hYmxlIHRvIGNyZWF0ZSBhIG5ldyBub3RlLCB0aGVuIGp1c3QgZmluaXNoCi0gICAgICAgICAgICAvLyB0aGlzIGFjdGl2aXR5LiAgQSBSRVNVTFRfQ0FOQ0VMRUQgd2lsbCBiZSBzZW50IGJhY2sgdG8gdGhlCi0gICAgICAgICAgICAvLyBvcmlnaW5hbCBhY3Rpdml0eSBpZiB0aGV5IHJlcXVlc3RlZCBhIHJlc3VsdC4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJZiB0aGUgYXR0ZW1wdCB0byBpbnNlcnQgdGhlIG5ldyBub3RlIGZhaWxzLCBzaHV0cyBkb3duIHRoaXMgQWN0aXZpdHkuIFRoZQorICAgICAgICAgICAgICogb3JpZ2luYXRpbmcgQWN0aXZpdHkgcmVjZWl2ZXMgYmFjayBSRVNVTFRfQ0FOQ0VMRUQgaWYgaXQgcmVxdWVzdGVkIGEgcmVzdWx0LgorICAgICAgICAgICAgICogTG9ncyB0aGF0IHRoZSBpbnNlcnQgZmFpbGVkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAobVVyaSA9PSBudWxsKSB7CisKKyAgICAgICAgICAgICAgICAvLyBXcml0ZXMgdGhlIGxvZyBpZGVudGlmaWVyLCBhIG1lc3NhZ2UsIGFuZCB0aGUgVVJJIHRoYXQgZmFpbGVkLgogICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBpbnNlcnQgbmV3IG5vdGUgaW50byAiICsgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKTsKKworICAgICAgICAgICAgICAgIC8vIENsb3NlcyB0aGUgYWN0aXZpdHkuCiAgICAgICAgICAgICAgICAgZmluaXNoKCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBUaGUgbmV3IGVudHJ5IHdhcyBjcmVhdGVkLCBzbyBhc3N1bWUgYWxsIHdpbGwgZW5kIHdlbGwgYW5kCisgICAgICAgICAgICAvLyBTaW5jZSB0aGUgbmV3IGVudHJ5IHdhcyBjcmVhdGVkLCB0aGlzIHNldHMgdGhlIHJlc3VsdCB0byBiZSByZXR1cm5lZAogICAgICAgICAgICAgLy8gc2V0IHRoZSByZXN1bHQgdG8gYmUgcmV0dXJuZWQuCiAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LLCAobmV3IEludGVudCgpKS5zZXRBY3Rpb24obVVyaS50b1N0cmluZygpKSk7CiAKKyAgICAgICAgICAgIC8vIEZvciBhIHBhc3RlLCBpbml0aWFsaXplcyB0aGUgZGF0YSBmcm9tIGNsaXBib2FyZC4KKyAgICAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BBU1RFLmVxdWFscyhhY3Rpb24pKSB7CisKKyAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSBwYXN0ZQorICAgICAgICAgICAgICAgIHBlcmZvcm1QYXN0ZSgpOworICAgICAgICAgICAgICAgIC8vIFN3aXRjaGVzIHRoZSBzdGF0ZSB0byBQQVNURS4gVGhlIHRpdGxlIGNhbiBub3QgYmUgbW9kaWZpZWQuCisgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFTVEU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIGFjdGlvbiB3YXMgb3RoZXIgdGhhbiBFRElUIG9yIElOU0VSVDoKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdob29wcywgdW5rbm93biBhY3Rpb24hICBCYWlsLgorCisgICAgICAgICAgICAvLyBMb2dzIGFuIGVycm9yIHRoYXQgdGhlIGFjdGlvbiB3YXMgbm90IHVuZGVyc3Rvb2QsIGZpbmlzaGVzIHRoZSBBY3Rpdml0eSwgYW5kCisgICAgICAgICAgICAvLyByZXR1cm5zIFJFU1VMVF9DQU5DRUxFRCB0byBhbiBvcmlnaW5hdGluZyBBY3Rpdml0eS4KICAgICAgICAgICAgIExvZy5lKFRBRywgIlVua25vd24gYWN0aW9uLCBleGl0aW5nIik7CiAgICAgICAgICAgICBmaW5pc2goKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFNldCB0aGUgbGF5b3V0IGZvciB0aGlzIGFjdGl2aXR5LiAgWW91IGNhbiBmaW5kIGl0IGluIHJlcy9sYXlvdXQvbm90ZV9lZGl0b3IueG1sCisgICAgICAgIC8vIFNldHMgdGhlIGxheW91dCBmb3IgdGhpcyBBY3Rpdml0eS4gU2VlIHJlcy9sYXlvdXQvbm90ZV9lZGl0b3IueG1sCiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0Lm5vdGVfZWRpdG9yKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZSB0ZXh0IHZpZXcgZm9yIG91ciBub3RlLCBpZGVudGlmaWVkIGJ5IGl0cyBJRCBpbiB0aGUgWE1MIGZpbGUuCisKKyAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgRWRpdFRleHQgaW4gdGhlIHRoZSBsYXlvdXQuCiAgICAgICAgIG1UZXh0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC5ub3RlKTsKIAotICAgICAgICAvLyBHZXQgdGhlIG5vdGUhCi0gICAgICAgIG1DdXJzb3IgPSBtYW5hZ2VkUXVlcnkobVVyaSwgUFJPSkVDVElPTiwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIC8qCisgICAgICAgICAqIFVzaW5nIHRoZSBVUkkgcGFzc2VkIGluIHdpdGggdGhlIHRyaWdnZXJpbmcgSW50ZW50LCBnZXRzIHRoZSBub3RlIG9yIG5vdGVzIGluCisgICAgICAgICAqIHRoZSBwcm92aWRlci4KKyAgICAgICAgICogTm90ZTogVGhpcyBpcyBiZWluZyBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIEl0IHdpbGwgYmxvY2sgdGhlIHRocmVhZCB1bnRpbCB0aGUgcXVlcnkKKyAgICAgICAgICogY29tcGxldGVzLiBJbiBhIHNhbXBsZSBhcHAsIGdvaW5nIGFnYWluc3QgYSBzaW1wbGUgcHJvdmlkZXIgYmFzZWQgb24gYSBsb2NhbCBkYXRhYmFzZSwKKyAgICAgICAgICogdGhlIGJsb2NrIHdpbGwgYmUgbW9tZW50YXJ5LCBidXQgaW4gYSByZWFsIGFwcCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgb3IgYW5kcm9pZC5vcy5Bc3luY1Rhc2suCisgICAgICAgICAqLworICAgICAgICBtQ3Vyc29yID0gbWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgbVVyaSwgICAgICAgICAvLyBUaGUgVVJJIHRoYXQgZ2V0cyBtdWx0aXBsZSBub3RlcyBmcm9tIHRoZSBwcm92aWRlci4KKyAgICAgICAgICAgIFBST0pFQ1RJT04sICAgLy8gQSBwcm9qZWN0aW9uIHRoYXQgcmV0dXJucyB0aGUgbm90ZSBJRCBhbmQgbm90ZSBjb250ZW50IGZvciBlYWNoIG5vdGUuCisgICAgICAgICAgICBudWxsLCAgICAgICAgIC8vIE5vICJ3aGVyZSIgY2xhdXNlIHNlbGVjdGlvbiBjcml0ZXJpYS4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgLy8gTm8gIndoZXJlIiBjbGF1c2Ugc2VsZWN0aW9uIHZhbHVlcy4KKyAgICAgICAgICAgIG51bGwgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIgKG1vZGlmaWNhdGlvbiBkYXRlLCBkZXNjZW5kaW5nKQorICAgICAgICApOwogCi0gICAgICAgIC8vIElmIGFuIGluc3RhbmNlIG9mIHRoaXMgYWN0aXZpdHkgaGFkIHByZXZpb3VzbHkgc3RvcHBlZCwgd2UgY2FuCi0gICAgICAgIC8vIGdldCB0aGUgb3JpZ2luYWwgdGV4dCBpdCBzdGFydGVkIHdpdGguCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoaXMgQWN0aXZpdHkgaGFkIHN0b3BwZWQgcHJldmlvdXNseSwgaXRzIHN0YXRlIHdhcyB3cml0dGVuIHRoZSBPUklHSU5BTF9DT05URU5UCisgICAgICAgICAqIGxvY2F0aW9uIGluIHRoZSBzYXZlZCBJbnN0YW5jZSBzdGF0ZS4gVGhpcyBnZXRzIHRoZSBzdGF0ZS4KKyAgICAgICAgICovCiAgICAgICAgIGlmIChzYXZlZEluc3RhbmNlU3RhdGUgIT0gbnVsbCkgewogICAgICAgICAgICAgbU9yaWdpbmFsQ29udGVudCA9IHNhdmVkSW5zdGFuY2VTdGF0ZS5nZXRTdHJpbmcoT1JJR0lOQUxfQ09OVEVOVCk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgQWN0aXZpdHkgaXMgYWJvdXQgdG8gY29tZSB0byB0aGUgZm9yZWdyb3VuZC4gVGhpcyBoYXBwZW5zCisgICAgICogd2hlbiB0aGUgQWN0aXZpdHkgY29tZXMgdG8gdGhlIHRvcCBvZiB0aGUgdGFzayBzdGFjaywgT1Igd2hlbiBpdCBpcyBmaXJzdCBzdGFydGluZy4KKyAgICAgKgorICAgICAqIE1vdmVzIHRvIHRoZSBmaXJzdCBub3RlIGluIHRoZSBsaXN0LCBzZXRzIGFuIGFwcHJvcHJpYXRlIHRpdGxlIGZvciB0aGUgYWN0aW9uIGNob3NlbiBieQorICAgICAqIHRoZSB1c2VyLCBwdXRzIHRoZSBub3RlIGNvbnRlbnRzIGludG8gdGhlIFRleHRWaWV3LCBhbmQgc2F2ZXMgdGhlIG9yaWdpbmFsIHRleHQgYXMgYQorICAgICAqIGJhY2t1cC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKIAotICAgICAgICAvLyBJZiB3ZSBkaWRuJ3QgaGF2ZSBhbnkgdHJvdWJsZSByZXRyaWV2aW5nIHRoZSBkYXRhLCBpdCBpcyBub3cKLSAgICAgICAgLy8gdGltZSB0byBnZXQgYXQgdGhlIHN0dWZmLgorICAgICAgICAvKgorICAgICAgICAgKiBtQ3Vyc29yIGlzIGluaXRpYWxpemVkLCBzaW5jZSBvbkNyZWF0ZSgpIGFsd2F5cyBwcmVjZWRlcyBvblJlc3VtZSBmb3IgYW55IHJ1bm5pbmcKKyAgICAgICAgICogcHJvY2Vzcy4gVGhpcyB0ZXN0cyB0aGF0IGl0J3Mgbm90IG51bGwsIHNpbmNlIGl0IHNob3VsZCBhbHdheXMgY29udGFpbiBkYXRhLgorICAgICAgICAgKi8KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBhdCB0aGUgb25lIGFuZCBvbmx5IHJvdyBpbiB0aGUgY3Vyc29yLgorCisgICAgICAgICAgICAvKiBNb3ZlcyB0byB0aGUgZmlyc3QgcmVjb3JkLiBBbHdheXMgY2FsbCBtb3ZlVG9GaXJzdCgpIGJlZm9yZSBhY2Nlc3NpbmcgZGF0YSBpbgorICAgICAgICAgICAgICogYSBDdXJzb3IgZm9yIHRoZSBmaXJzdCB0aW1lLiBUaGUgc2VtYW50aWNzIG9mIHVzaW5nIGEgQ3Vyc29yIGFyZSB0aGF0IHdoZW4gaXQgaXMKKyAgICAgICAgICAgICAqIGNyZWF0ZWQsIGl0cyBpbnRlcm5hbCBpbmRleCBpcyBwb2ludGluZyB0byBhICJwbGFjZSIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBmaXJzdAorICAgICAgICAgICAgICogcmVjb3JkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CiAKLSAgICAgICAgICAgIC8vIE1vZGlmeSBvdXIgb3ZlcmFsbCB0aXRsZSBkZXBlbmRpbmcgb24gdGhlIG1vZGUgd2UgYXJlIHJ1bm5pbmcgaW4uCisgICAgICAgICAgICAvLyBNb2RpZmllcyB0aGUgd2luZG93IHRpdGxlIGZvciB0aGUgQWN0aXZpdHkgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IEFjdGl2aXR5IHN0YXRlLgogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9FRElUKSB7CisKKyAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSB0aXRsZSB0byBFZGl0IGZvciBlZGl0cwogICAgICAgICAgICAgICAgIHNldFRpdGxlKGdldFRleHQoUi5zdHJpbmcudGl0bGVfZWRpdCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5TRVJUKSB7CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIHRpdGxlIHRvICJjcmVhdGUiIGZvciBpbnNlcnRzIGFuZCBwYXN0ZXMKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCB8fCBtU3RhdGUgPT0gU1RBVEVfUEFTVEUpIHsKICAgICAgICAgICAgICAgICBzZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLnRpdGxlX2NyZWF0ZSkpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreTogd2UgbWF5IGJlIHJlc3VtZWQgYWZ0ZXIgcHJldmlvdXNseSBiZWluZwotICAgICAgICAgICAgLy8gcGF1c2VkL3N0b3BwZWQuICBXZSB3YW50IHRvIHB1dCB0aGUgbmV3IHRleHQgaW4gdGhlIHRleHQgdmlldywKLSAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSB0aGUgdXNlciB3aGVyZSB0aGV5IHdlcmUgKHJldGFpbiB0aGUgY3Vyc29yIHBvc2l0aW9uCi0gICAgICAgICAgICAvLyBldGMpLiAgVGhpcyB2ZXJzaW9uIG9mIHNldFRleHQgZG9lcyB0aGF0IGZvciB1cy4KKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBvblJlc3VtZSgpIG1heSBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHRoZSBBY3Rpdml0eSBsb3N0IGZvY3VzICh3YXMgcGF1c2VkKS4KKyAgICAgICAgICAgICAqIFRoZSB1c2VyIHdhcyBlaXRoZXIgZWRpdGluZyBvciBjcmVhdGluZyBhIG5vdGUgd2hlbiB0aGUgQWN0aXZpdHkgcGF1c2VkLgorICAgICAgICAgICAgICogVGhlIEFjdGl2aXR5IHNob3VsZCByZS1kaXNwbGF5IHRoZSB0ZXh0IHRoYXQgaGFkIGJlZW4gcmV0cmlldmVkIHByZXZpb3VzbHksIGJ1dAorICAgICAgICAgICAgICogaXQgc2hvdWxkIG5vdCBtb3ZlIHRoZSBjdXJzb3IuIFRoaXMgaGVscHMgdGhlIHVzZXIgdG8gY29udGludWUgZWRpdGluZyBvciBlbnRlcmluZy4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBHZXRzIHRoZSBub3RlIHRleHQgZnJvbSB0aGUgQ3Vyc29yIGFuZCBwdXRzIGl0IGluIHRoZSBUZXh0VmlldywgYnV0IGRvZXNuJ3QgY2hhbmdlCisgICAgICAgICAgICAvLyB0aGUgdGV4dCBjdXJzb3IncyBwb3NpdGlvbi4KICAgICAgICAgICAgIFN0cmluZyBub3RlID0gbUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX05PVEUpOwogICAgICAgICAgICAgbVRleHQuc2V0VGV4dEtlZXBTdGF0ZShub3RlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gSWYgd2UgaGFkbid0IHByZXZpb3VzbHkgcmV0cmlldmVkIHRoZSBvcmlnaW5hbCB0ZXh0LCBkbyBzbwotICAgICAgICAgICAgLy8gbm93LiAgVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmV2ZXJ0IHRoZWlyIGNoYW5nZXMuCisKKyAgICAgICAgICAgIC8vIFN0b3JlcyB0aGUgb3JpZ2luYWwgbm90ZSB0ZXh0LCB0byBhbGxvdyB0aGUgdXNlciB0byByZXZlcnQgY2hhbmdlcy4KICAgICAgICAgICAgIGlmIChtT3JpZ2luYWxDb250ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICBtT3JpZ2luYWxDb250ZW50ID0gbm90ZTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAvKgorICAgICAgICAgKiBTb21ldGhpbmcgaXMgd3JvbmcuIFRoZSBDdXJzb3Igc2hvdWxkIGFsd2F5cyBjb250YWluIGRhdGEuIFJlcG9ydCBhbiBlcnJvciBpbiB0aGUKKyAgICAgICAgICogbm90ZS4KKyAgICAgICAgICovCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzZXRUaXRsZShnZXRUZXh0KFIuc3RyaW5nLmVycm9yX3RpdGxlKSk7CiAgICAgICAgICAgICBtVGV4dC5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcuZXJyb3JfbWVzc2FnZSkpOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gQWN0aXZpdHkgbG9zZXMgZm9jdXMgZHVyaW5nIGl0cyBub3JtYWwgb3BlcmF0aW9uLCBhbmQgaXMgdGhlbgorICAgICAqIGxhdGVyIG9uIGtpbGxlZC4gVGhlIEFjdGl2aXR5IGhhcyBhIGNoYW5jZSB0byBzYXZlIGl0cyBzdGF0ZSBzbyB0aGF0IHRoZSBzeXN0ZW0gY2FuIHJlc3RvcmUKKyAgICAgKiBpdC4KKyAgICAgKgorICAgICAqIE5vdGljZSB0aGF0IHRoaXMgbWV0aG9kIGlzbid0IGEgbm9ybWFsIHBhcnQgb2YgdGhlIEFjdGl2aXR5IGxpZmVjeWNsZS4gSXQgd29uJ3QgYmUgY2FsbGVkCisgICAgICogaWYgdGhlIHVzZXIgc2ltcGx5IG5hdmlnYXRlcyBhd2F5IGZyb20gdGhlIEFjdGl2aXR5LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uU2F2ZUluc3RhbmNlU3RhdGUoQnVuZGxlIG91dFN0YXRlKSB7CiAgICAgICAgIC8vIFNhdmUgYXdheSB0aGUgb3JpZ2luYWwgdGV4dCwgc28gd2Ugc3RpbGwgaGF2ZSBpdCBpZiB0aGUgYWN0aXZpdHkKQEAgLTIwMywxMjYgKzMyNywzMjIgQEAKICAgICAgICAgb3V0U3RhdGUucHV0U3RyaW5nKE9SSUdJTkFMX0NPTlRFTlQsIG1PcmlnaW5hbENvbnRlbnQpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBBY3Rpdml0eSBsb3NlcyBmb2N1cy4KKyAgICAgKgorICAgICAqIEZvciBBY3Rpdml0eSBvYmplY3RzIHRoYXQgZWRpdCBpbmZvcm1hdGlvbiwgb25QYXVzZSgpIG1heSBiZSB0aGUgb25lIHBsYWNlIHdoZXJlIGNoYW5nZXMgYXJlCisgICAgICogc2F2ZWQuIFRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIG1vZGVsIGlzIHByZWRpY2F0ZWQgb24gdGhlIGlkZWEgdGhhdCAic2F2ZSIgYW5kICJleGl0IiBhcmVuJ3QKKyAgICAgKiByZXF1aXJlZCBhY3Rpb25zLiBXaGVuIHVzZXJzIG5hdmlnYXRlIGF3YXkgZnJvbSBhbiBBY3Rpdml0eSwgdGhleSBzaG91bGRuJ3QgaGF2ZSB0byBnbyBiYWNrCisgICAgICogdG8gaXQgdG8gY29tcGxldGUgdGhlaXIgd29yay4gVGhlIGFjdCBvZiBnb2luZyBhd2F5IHNob3VsZCBzYXZlIGV2ZXJ5dGhpbmcgYW5kIGxlYXZlIHRoZQorICAgICAqIEFjdGl2aXR5IGluIGEgc3RhdGUgd2hlcmUgQW5kcm9pZCBjYW4gZGVzdHJveSBpdCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgdXNlciBoYXNuJ3QgZG9uZSBhbnl0aGluZywgdGhlbiB0aGlzIGRlbGV0ZXMgb3IgY2xlYXJzIG91dCB0aGUgbm90ZSwgb3RoZXJ3aXNlIGl0CisgICAgICogd3JpdGVzIHRoZSB1c2VyJ3Mgd29yayB0byB0aGUgcHJvdmlkZXIuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgc3VwZXIub25QYXVzZSgpOwogCi0gICAgICAgIC8vIFRoZSB1c2VyIGlzIGdvaW5nIHNvbWV3aGVyZSBlbHNlLCBzbyBtYWtlIHN1cmUgdGhlaXIgY3VycmVudAotICAgICAgICAvLyBjaGFuZ2VzIGFyZSBzYWZlbHkgc2F2ZWQgYXdheSBpbiB0aGUgcHJvdmlkZXIuICBXZSBkb24ndCBuZWVkCi0gICAgICAgIC8vIHRvIGRvIHRoaXMgaWYgb25seSBlZGl0aW5nLgorICAgICAgICAvKgorICAgICAgICAgKiBUZXN0cyB0byBzZWUgdGhhdCB0aGUgcXVlcnkgb3BlcmF0aW9uIGRpZG4ndCBmYWlsIChzZWUgb25DcmVhdGUoKSkuIFRoZSBDdXJzb3Igb2JqZWN0CisgICAgICAgICAqIHdpbGwgZXhpc3QsIGV2ZW4gaWYgbm8gcmVjb3JkcyB3ZXJlIHJldHVybmVkLCB1bmxlc3MgdGhlIHF1ZXJ5IGZhaWxlZCBiZWNhdXNlIG9mIHNvbWUKKyAgICAgICAgICogZXhjZXB0aW9uIG9yIGVycm9yLgorICAgICAgICAgKgorICAgICAgICAgKi8KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgeworCisgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbm90ZSB0ZXh0LgogICAgICAgICAgICAgU3RyaW5nIHRleHQgPSBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgIGludCBsZW5ndGggPSB0ZXh0Lmxlbmd0aCgpOwogCi0gICAgICAgICAgICAvLyBJZiB0aGlzIGFjdGl2aXR5IGlzIGZpbmlzaGVkLCBhbmQgdGhlcmUgaXMgbm8gdGV4dCwgdGhlbiB3ZQotICAgICAgICAgICAgLy8gZG8gc29tZXRoaW5nIGEgbGl0dGxlIHNwZWNpYWw6IHNpbXBseSBkZWxldGUgdGhlIG5vdGUgZW50cnkuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBib3RoIGZvciBlZGl0aW5nIGFuZCBpbnNlcnRpbmcuLi4gIGl0Ci0gICAgICAgICAgICAvLyB3b3VsZCBiZSByZWFzb25hYmxlIHRvIG9ubHkgZG8gaXQgd2hlbiBpbnNlcnRpbmcuCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogSWYgdGhlIEFjdGl2aXR5IGlzIGluIHRoZSBtaWRzdCBvZiBmaW5pc2hpbmcgYW5kIHRoZXJlIGlzIG5vIHRleHQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgICAgICAqIG5vdGUsIHJldHVybnMgYSByZXN1bHQgb2YgQ0FOQ0VMRUQgdG8gdGhlIGNhbGxlciwgYW5kIGRlbGV0ZXMgdGhlIG5vdGUuIFRoaXMgaXMgZG9uZQorICAgICAgICAgICAgICogZXZlbiBpZiB0aGUgbm90ZSB3YXMgYmVpbmcgZWRpdGVkLCB0aGUgYXNzdW1wdGlvbiBiZWluZyB0aGF0IHRoZSB1c2VyIHdhbnRlZCB0bworICAgICAgICAgICAgICogImNsZWFyIG91dCIgKGRlbGV0ZSkgdGhlIG5vdGUuCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChpc0ZpbmlzaGluZygpICYmIChsZW5ndGggPT0gMCkgJiYgIW1Ob3RlT25seSkgewogICAgICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfQ0FOQ0VMRUQpOwogICAgICAgICAgICAgICAgIGRlbGV0ZU5vdGUoKTsKIAotICAgICAgICAgICAgLy8gR2V0IG91dCB1cGRhdGVzIGludG8gdGhlIHByb3ZpZGVyLgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogV3JpdGVzIHRoZSBlZGl0cyB0byB0aGUgcHJvdmlkZXIuIFRoZSBub3RlIGhhcyBiZWVuIGVkaXRlZCBpZiBhbiBleGlzdGluZyBub3RlIHdhcworICAgICAgICAgICAgICAgICAqIHJldHJpZXZlZCBpbnRvIHRoZSBlZGl0b3IgKm9yKiBpZiBhIG5ldyBub3RlIHdhcyBpbnNlcnRlZC4gSW4gdGhlIGxhdHRlciBjYXNlLAorICAgICAgICAgICAgICAgICAqIG9uQ3JlYXRlKCkgaW5zZXJ0ZWQgYSBuZXcgZW1wdHkgbm90ZSBpbnRvIHRoZSBwcm92aWRlciwgYW5kIGl0IGlzIHRoaXMgbmV3IG5vdGUKKyAgICAgICAgICAgICAgICAgKiB0aGF0IGlzIGJlaW5nIGVkaXRlZC4KKyAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOwogCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBzdHVmZiBpcyBvbmx5IGRvbmUgd2hlbiB3b3JraW5nIHdpdGggYSBmdWxsLWZsZWRnZWQgbm90ZS4KLSAgICAgICAgICAgICAgICBpZiAoIW1Ob3RlT25seSkgewotICAgICAgICAgICAgICAgICAgICAvLyBCdW1wIHRoZSBtb2RpZmljYXRpb24gdGltZSB0byBub3cuCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuTU9ESUZJRURfREFURSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBjcmVhdGluZyBhIG5ldyBub3RlLCB0aGVuIHdlIHdhbnQgdG8gYWxzbyBjcmVhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gaW5pdGlhbCB0aXRsZSBmb3IgaXQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSU5TRVJUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGl0bGUgPSB0ZXh0LnN1YnN0cmluZygwLCBNYXRoLm1pbigzMCwgbGVuZ3RoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMzApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdFNwYWNlID0gdGl0bGUubGFzdEluZGV4T2YoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFzdFNwYWNlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZXMuVElUTEUsIHRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFdyaXRlIG91ciB0ZXh0IGJhY2sgaW50byB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChOb3Rlcy5OT1RFLCB0ZXh0KTsKLQotICAgICAgICAgICAgICAgIC8vIENvbW1pdCBhbGwgb2Ygb3VyIGNoYW5nZXMgdG8gcGVyc2lzdGVudCBzdG9yYWdlLiBXaGVuIHRoZSB1cGRhdGUgY29tcGxldGVzCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQgcHJvdmlkZXIgd2lsbCBub3RpZnkgdGhlIGN1cnNvciBvZiB0aGUgY2hhbmdlLCB3aGljaCB3aWxsCi0gICAgICAgICAgICAgICAgLy8gY2F1c2UgdGhlIFVJIHRvIGJlIHVwZGF0ZWQuCi0gICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkudXBkYXRlKG1VcmksIHZhbHVlcywgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG1hcCB0byBjb250YWluIHRoZSBuZXcgdmFsdWVzIGZvciB0aGUgY29sdW1ucworICAgICAgICAgICAgICAgIHVwZGF0ZU5vdGUodGV4dCwgbnVsbCwgIW1Ob3RlT25seSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGRldmljZSdzIE1lbnUgYnV0dG9uIHRoZSBmaXJzdCB0aW1lIGZvcgorICAgICAqIHRoaXMgQWN0aXZpdHkuIEFuZHJvaWQgcGFzc2VzIGluIGEgTWVudSBvYmplY3QgdGhhdCBpcyBwb3B1bGF0ZWQgd2l0aCBpdGVtcy4KKyAgICAgKgorICAgICAqIEJ1aWxkcyB0aGUgbWVudXMgZm9yIGVkaXRpbmcgYW5kIGluc2VydGluZywgYW5kIGFkZHMgaW4gYWx0ZXJuYXRpdmUgYWN0aW9ucyB0aGF0CisgICAgICogcmVnaXN0ZXJlZCB0aGVtc2VsdmVzIHRvIGhhbmRsZSB0aGUgTUlNRSB0eXBlcyBmb3IgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW51IEEgTWVudSBvYmplY3QgdG8gd2hpY2ggaXRlbXMgc2hvdWxkIGJlIGFkZGVkLgorICAgICAqIEByZXR1cm4gVHJ1ZSB0byBkaXNwbGF5IHRoZSBtZW51LgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7CiAKLSAgICAgICAgLy8gQnVpbGQgdGhlIG1lbnVzIHRoYXQgYXJlIHNob3duIHdoZW4gZWRpdGluZy4KKyAgICAgICAgLy8gQnVpbGRzIHRoZSBtZW51cyB0aGF0IGFyZSBzaG93biB3aGVuIGVkaXRpbmcuIFRoZXNlIGFyZSAncmV2ZXJ0JyB0byB1bmRvIGNoYW5nZXMsIGFuZAorICAgICAgICAvLyAnZGVsZXRlJyB0byBkZWxldGUgdGhlIG5vdGUuCiAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfRURJVCkgeworCisgICAgICAgICAgICAvLyBBZGRzIHRoZSAncmV2ZXJ0JyBtZW51IGl0ZW0sIGFuZCBzZXRzIGl0cyBzaG9ydGN1dCB0byBudW1lcmljIDAsIGxldHRlciAncicgYW5kIGl0cworICAgICAgICAgICAgLy8gaWNvbiB0byB0aGUgQW5kcm9pZCBzdGFuZGFyZCByZXZlcnQgaWNvbi4KICAgICAgICAgICAgIG1lbnUuYWRkKDAsIFJFVkVSVF9JRCwgMCwgUi5zdHJpbmcubWVudV9yZXZlcnQpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydGN1dCgnMCcsICdyJykKICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfcmV2ZXJ0KTsKICAgICAgICAgICAgIGlmICghbU5vdGVPbmx5KSB7CisKKyAgICAgICAgICAgICAgICAvLyBBZGRzIHRoZSAnZGVsZXRlJyBtZW51IGl0ZW0sIGFuZCBzZXRzIGl0cyBzaG9ydGN1dCB0byBudW1lcmljIDEsIGxldHRlciAnZCcKKyAgICAgICAgICAgICAgICAvLyBhbmQgaXRzIGljb24gdG8gdGhlIEFuZHJvaWQgc3RhbmRhcmQgZGVsZXRlIGljb24KICAgICAgICAgICAgICAgICBtZW51LmFkZCgwLCBERUxFVEVfSUQsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldFNob3J0Y3V0KCcxJywgJ2QnKQogICAgICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfZGVsZXRlKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAvLyBCdWlsZCB0aGUgbWVudXMgdGhhdCBhcmUgc2hvd24gd2hlbiBpbnNlcnRpbmcuCisgICAgICAgIC8vIEJ1aWxkcyB0aGUgbWVudXMgdGhhdCBhcmUgc2hvd24gd2hlbiBpbnNlcnRpbmcuIFRoZSBvbmx5IG9wdGlvbiBpcyAnRGlzY2FyZCcgdG8gdGhyb3cKKyAgICAgICAgLy8gYXdheSB0aGUgbmV3IG5vdGUuCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW51LmFkZCgwLCBESVNDQVJEX0lELCAwLCBSLnN0cmluZy5tZW51X2Rpc2NhcmQpCiAgICAgICAgICAgICAgICAgICAgIC5zZXRTaG9ydGN1dCgnMCcsICdkJykKICAgICAgICAgICAgICAgICAgICAgLnNldEljb24oYW5kcm9pZC5SLmRyYXdhYmxlLmljX21lbnVfZGVsZXRlKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIElmIHdlIGFyZSB3b3JraW5nIG9uIGEgZnVsbCBub3RlLCB0aGVuIGFwcGVuZCB0byB0aGUKLSAgICAgICAgLy8gbWVudSBpdGVtcyBmb3IgYW55IG90aGVyIGFjdGl2aXRpZXMgdGhhdCBjYW4gZG8gc3R1ZmYgd2l0aCBpdAotICAgICAgICAvLyBhcyB3ZWxsLiAgVGhpcyBkb2VzIGEgcXVlcnkgb24gdGhlIHN5c3RlbSBmb3IgYW55IGFjdGl2aXRpZXMgdGhhdAotICAgICAgICAvLyBpbXBsZW1lbnQgdGhlIEFMVEVSTkFUSVZFX0FDVElPTiBmb3Igb3VyIGRhdGEsIGFkZGluZyBhIG1lbnUgaXRlbQotICAgICAgICAvLyBmb3IgZWFjaCBvbmUgdGhhdCBpcyBmb3VuZC4KKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwZW5kcyBtZW51IGl0ZW1zIGZvciBhbnkgQWN0aXZpdHkgZGVjbGFyYXRpb25zIHRoYXQgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGFjdGlvbgorICAgICAgICAgKiBmb3IgdGhpcyBBY3Rpdml0eSdzIE1JTUUgdHlwZSwgb25lIG1lbnUgaXRlbSBmb3IgZWFjaCBBY3Rpdml0eS4KKyAgICAgICAgICovCiAgICAgICAgIGlmICghbU5vdGVPbmx5KSB7CisKKyAgICAgICAgICAgIC8vIE1ha2VzIGEgbmV3IEludGVudCB3aXRoIHRoZSBVUkkgZGF0YSBwYXNzZWQgdG8gdGhpcyBBY3Rpdml0eQogICAgICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobnVsbCwgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKTsKKworICAgICAgICAgICAgLy8gQWRkcyB0aGUgQUxURVJOQVRJVkUgY2F0ZWdvcnkgdG8gdGhlIEludGVudC4KICAgICAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShJbnRlbnQuQ0FURUdPUllfQUxURVJOQVRJVkUpOwotICAgICAgICAgICAgbWVudS5hZGRJbnRlbnRPcHRpb25zKE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE5vdGVFZGl0b3IuY2xhc3MpLCBudWxsLCBpbnRlbnQsIDAsIG51bGwpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBDb21wb25lbnROYW1lIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgQWN0aXZpdHkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUoCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICBOb3RlRWRpdG9yLmNsYXNzKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluIHRoZSBBTFRFUk5BVElWRSBtZW51IGdyb3VwLCBhZGRzIGFuIG9wdGlvbiBmb3IgZWFjaCBBY3Rpdml0eSB0aGF0IGlzIHJlZ2lzdGVyZWQgdG8KKyAgICAgICAgICAgICAqIGhhbmRsZSB0aGlzIEFjdGl2aXR5J3MgTUlNRSB0eXBlLiBUaGUgSW50ZW50IGRlc2NyaWJlcyB3aGF0IHR5cGUgb2YgaXRlbXMgc2hvdWxkIGJlCisgICAgICAgICAgICAgKiBhZGRlZCB0byB0aGUgbWVudTsgaW4gdGhpcyBjYXNlLCBBY3Rpdml0eSBkZWNsYXJhdGlvbnMgd2l0aCBjYXRlZ29yeSBBTFRFUk5BVElWRS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgbWVudS5hZGRJbnRlbnRPcHRpb25zKAorICAgICAgICAgICAgICAgIE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsICAvLyBUaGUgbWVudSBncm91cCB0byBhZGQgdGhlIGl0ZW1zIHRvLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBObyB1bmlxdWUgSUQgaXMgbmVlZGVkLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBObyBvcmRlcmluZyBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgY29tcG9uZW50LCAgICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IEFjdGl2aXR5IG9iamVjdCdzIGNvbXBvbmVudCBuYW1lCisgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNwZWNpZmljIGl0ZW1zIG5lZWQgdG8gYmUgcGxhY2VkIGZpcnN0LgorICAgICAgICAgICAgICAgIGludGVudCwgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW50ZW50IGNvbnRhaW5pbmcgdGhlIHR5cGUgb2YgaXRlbXMgdG8gYWRkLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBObyBmbGFncyBhcmUgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGdlbmVyYXRlIGFuIGFycmF5IG9mIG1lbnUgaXRlbXMuCisgICAgICAgICAgICApOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gVGhlIG1ldGhvZCByZXR1cm5zIFRSVUUsIHNvIHRoYXQgZnVydGhlciBtZW51IHByb2Nlc3NpbmcgaXMgbm90IGRvbmUuCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgbWVudSBpdGVtIGlzIHNlbGVjdGVkLiBBbmRyb2lkIHBhc3NlcyBpbiB0aGUgc2VsZWN0ZWQgaXRlbS4KKyAgICAgKiBUaGUgc3dpdGNoIHN0YXRlbWVudCBpbiB0aGlzIG1ldGhvZCBjYWxscyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIHRvIHBlcmZvcm0gdGhlIGFjdGlvbiB0aGUKKyAgICAgKiB1c2VyIGNob3NlLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIHNlbGVjdGVkIE1lbnVJdGVtCisgICAgICogQHJldHVybiBUcnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGl0ZW0gd2FzIHByb2Nlc3NlZCwgYW5kIG5vIGZ1cnRoZXIgd29yayBpcyBuZWNlc3NhcnkuIEZhbHNlCisgICAgICogdG8gcHJvY2VlZCB0byBmdXJ0aGVyIHByb2Nlc3NpbmcgYXMgaW5kaWNhdGVkIGluIHRoZSBNZW51SXRlbSBvYmplY3QuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gb25PcHRpb25zSXRlbVNlbGVjdGVkKE1lbnVJdGVtIGl0ZW0pIHsKLSAgICAgICAgLy8gSGFuZGxlIGFsbCBvZiB0aGUgcG9zc2libGUgbWVudSBhY3Rpb25zLgorCisgICAgICAgIC8vIENob29zZXMgdGhlIGFjdGlvbiB0byBwZXJmb3JtCiAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworCisgICAgICAgIC8vIERlbGV0ZXMgdGhlIG5vdGUgYW5kIGNsb3NlIHRoZSBBY3Rpdml0eS4KICAgICAgICAgY2FzZSBERUxFVEVfSUQ6Ci0gICAgICAgICAgICBkZWxldGVOb3RlKCk7Ci0gICAgICAgICAgICBmaW5pc2goKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWxldGVOb3RlKCk7CisgICAgICAgIGZpbmlzaCgpOworICAgICAgICBicmVhazsKKworICAgICAgICAvLyBEaXNjYXJkcyB0aGUgbmV3IG5vdGUuCiAgICAgICAgIGNhc2UgRElTQ0FSRF9JRDoKLSAgICAgICAgICAgIGNhbmNlbE5vdGUoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYW5jZWxOb3RlKCk7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIERpc2NhcmRzIGFueSBjaGFuZ2VzIHRvIGFuIGVkaXRlZCBub3RlLgogICAgICAgICBjYXNlIFJFVkVSVF9JRDoKLSAgICAgICAgICAgIGNhbmNlbE5vdGUoKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYW5jZWxOb3RlKCk7CisgICAgICAgIGJyZWFrOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udGludWVzIHdpdGggcHJvY2Vzc2luZyB0aGUgbWVudSBpdGVtLiBJbiBlZmZlY3QsIGlmIHRoZSBpdGVtIHdhcyBhbiBhbHRlcm5hdGl2ZQorICAgICAgICAvLyBhY3Rpb24sIHRoaXMgaW52b2tlcyB0aGUgQWN0aXZpdHkgZm9yIHRoYXQgYWN0aW9uLgogICAgICAgICByZXR1cm4gc3VwZXIub25PcHRpb25zSXRlbVNlbGVjdGVkKGl0ZW0pOwogICAgIH0KIAorLy9CRUdJTl9JTkNMVURFKHBhc3RlKQogICAgIC8qKgotICAgICAqIFRha2UgY2FyZSBvZiBjYW5jZWxpbmcgd29yayBvbiBhIG5vdGUuICBEZWxldGVzIHRoZSBub3RlIGlmIHdlCi0gICAgICogaGFkIGNyZWF0ZWQgaXQsIG90aGVyd2lzZSByZXZlcnRzIHRvIHRoZSBvcmlnaW5hbCB0ZXh0LgorICAgICAqIEEgaGVscGVyIG1ldGhvZCB0aGF0IHJlcGxhY2VzIHRoZSBub3RlJ3MgZGF0YSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBwZXJmb3JtUGFzdGUoKSB7CisKKyAgICAgICAgLy8gR2V0cyBhIGhhbmRsZSB0byB0aGUgQ2xpcGJvYXJkIE1hbmFnZXIKKyAgICAgICAgQ2xpcGJvYXJkTWFuYWdlciBjbGlwYm9hcmQgPSAoQ2xpcGJvYXJkTWFuYWdlcikKKyAgICAgICAgICAgICAgICBnZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0xJUEJPQVJEX1NFUlZJQ0UpOworCisgICAgICAgIC8vIEdldHMgYSBjb250ZW50IHJlc29sdmVyIGluc3RhbmNlCisgICAgICAgIENvbnRlbnRSZXNvbHZlciBjciA9IGdldENvbnRlbnRSZXNvbHZlcigpOworCisgICAgICAgIC8vIEdldHMgdGhlIGNsaXBib2FyZCBkYXRhIGZyb20gdGhlIGNsaXBib2FyZAorICAgICAgICBDbGlwcGVkRGF0YSBjbGlwID0gY2xpcGJvYXJkLmdldFByaW1hcnlDbGlwKCk7CisgICAgICAgIGlmIChjbGlwICE9IG51bGwpIHsKKworICAgICAgICAgICAgU3RyaW5nIHRleHQ9bnVsbDsKKyAgICAgICAgICAgIFN0cmluZyB0aXRsZT1udWxsOworCisgICAgICAgICAgICAvLyBHZXRzIHRoZSBmaXJzdCBpdGVtIGZyb20gdGhlIGNsaXBib2FyZCBkYXRhCisgICAgICAgICAgICBDbGlwcGVkRGF0YS5JdGVtIGl0ZW0gPSBjbGlwLmdldEl0ZW0oMCk7CisKKyAgICAgICAgICAgIC8vIFRyaWVzIHRvIGdldCB0aGUgaXRlbSdzIGNvbnRlbnRzIGFzIGEgVVJJIHBvaW50aW5nIHRvIGEgbm90ZQorICAgICAgICAgICAgVXJpIHVyaSA9IGl0ZW0uZ2V0VXJpKCk7CisKKyAgICAgICAgICAgIC8vIFRlc3RzIHRvIHNlZSB0aGF0IHRoZSBpdGVtIGFjdHVhbGx5IGlzIGFuIFVSSSwgYW5kIHRoYXQgdGhlIFVSSQorICAgICAgICAgICAgLy8gaXMgYSBjb250ZW50IFVSSSBwb2ludGluZyB0byBhIHByb3ZpZGVyIHdob3NlIE1JTUUgdHlwZSBpcyB0aGUgc2FtZQorICAgICAgICAgICAgLy8gYXMgdGhlIE1JTUUgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIE5vdGUgcGFkIHByb3ZpZGVyLgorICAgICAgICAgICAgaWYgKHVyaSAhPSBudWxsICYmIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JVEVNX1RZUEUuZXF1YWxzKGNyLmdldFR5cGUodXJpKSkpIHsKKworICAgICAgICAgICAgICAgIC8vIFRoZSBjbGlwYm9hcmQgaG9sZHMgYSByZWZlcmVuY2UgdG8gZGF0YSB3aXRoIGEgbm90ZSBNSU1FIHR5cGUuIFRoaXMgY29waWVzIGl0LgorICAgICAgICAgICAgICAgIEN1cnNvciBvcmlnID0gY3IucXVlcnkoCisgICAgICAgICAgICAgICAgICAgICAgICB1cmksICAgICAgICAgICAgLy8gVVJJIGZvciB0aGUgY29udGVudCBwcm92aWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgUFJPSkVDVElPTiwgICAgIC8vIEdldCB0aGUgY29sdW1ucyByZWZlcnJlZCB0byBpbiB0aGUgcHJvamVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgICAgICAgIC8vIE5vIHNlbGVjdGlvbiB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAvLyBObyBzZWxlY3Rpb24gdmFyaWFibGVzLCBzbyBubyBjcml0ZXJpYSBhcmUgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgLy8gVXNlIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIKKyAgICAgICAgICAgICAgICApOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIEN1cnNvciBpcyBub3QgbnVsbCwgYW5kIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSByZWNvcmQKKyAgICAgICAgICAgICAgICAvLyAobW92ZVRvRmlyc3QoKSByZXR1cm5zIHRydWUpLCB0aGVuIHRoaXMgZ2V0cyB0aGUgbm90ZSBkYXRhIGZyb20gaXQuCisgICAgICAgICAgICAgICAgaWYgKG9yaWcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob3JpZy5tb3ZlVG9GaXJzdCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gb3JpZy5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX05PVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBvcmlnLmdldFN0cmluZyhDT0xVTU5fSU5ERVhfVElUTEUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2VzIHRoZSBjdXJzb3IuCisgICAgICAgICAgICAgICAgICAgIG9yaWcuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBjb250ZW50cyBvZiB0aGUgY2xpcGJvYXJkIHdhc24ndCBhIHJlZmVyZW5jZSB0byBhIG5vdGUsIHRoZW4KKyAgICAgICAgICAgIC8vIHRoaXMgY29udmVydHMgd2hhdGV2ZXIgaXQgaXMgdG8gdGV4dC4KKyAgICAgICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gaXRlbS5jb2VyY2VUb1RleHQodGhpcykudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlcyB0aGUgY3VycmVudCBub3RlIHdpdGggdGhlIHJldHJpZXZlZCB0aXRsZSBhbmQgdGV4dC4KKyAgICAgICAgICAgIHVwZGF0ZU5vdGUodGV4dCwgdGl0bGUsIHRydWUpOworICAgICAgICB9CisgICAgfQorLy9FTkRfSU5DTFVERShwYXN0ZSkKKworICAgIC8qKgorICAgICAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IG5vdGUgY29udGVudHMgd2l0aCB0aGUgdGV4dCBhbmQgdGl0bGUgcHJvdmlkZWQgYXMgYXJndW1lbnRzLgorICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBuZXcgbm90ZSBjb250ZW50cyB0byB1c2UuCisgICAgICogQHBhcmFtIHRpdGxlIFRoZSBuZXcgbm90ZSB0aXRsZSB0byB1c2UKKyAgICAgKiBAcGFyYW0gdXBkYXRlVGl0bGUgPGVtPnRydWU8L2VtPiBpZiB0aGUgdGl0bGUgc2hvdWxkIGJlIHVwZGF0ZWQuIFRoaXMgYWxzbyB1cGRhdGVzIHRoZQorICAgICAqIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgdXBkYXRlTm90ZShTdHJpbmcgdGV4dCwgU3RyaW5nIHRpdGxlLCBib29sZWFuIHVwZGF0ZVRpdGxlKSB7CisKKyAgICAgICAgLy8gU2V0cyB1cCBhIG1hcCB0byBjb250YWluIHZhbHVlcyB0byBiZSB1cGRhdGVkIGluIHRoZSBwcm92aWRlci4KKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworCisgICAgICAgIC8vIElmIHVwZGF0ZVRpdGxlIGlzIHRydWUsIHNldHMgdGhlIG1vZGlmaWNhdGlvbiBkYXRlL3RpbWUgc3RhbXAgdG8gbm93LgorICAgICAgICBpZiAodXBkYXRlVGl0bGUpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworCisgICAgICAgICAgICAvLyBJZiB0aGUgYWN0aW9uIGlzIHRvIGluc2VydCBhIG5ldyBub3RlLCB0aGlzIGNyZWF0ZXMgYW4gaW5pdGlhbCB0aXRsZSBmb3IgaXQuCisgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgbm8gdGl0bGUgd2FzIHByb3ZpZGVkIGFzIGFuIGFyZ3VtZW50LCBjcmVhdGUgb25lIGZyb20gdGhlIG5vdGUgdGV4dC4KKyAgICAgICAgICAgICAgICBpZiAodGl0bGUgPT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm90ZSdzIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdGV4dC5sZW5ndGgoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSB0aXRsZSBieSBnZXR0aW5nIGEgc3Vic3RyaW5nIG9mIHRoZSB0ZXh0IHRoYXQgaXMgMzEgY2hhcmFjdGVycyBsb25nCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgbm90ZSBwbHVzIG9uZSwgd2hpY2hldmVyIGlzIHNtYWxsZXIuCisgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGV4dC5zdWJzdHJpbmcoMCwgTWF0aC5taW4oMzAsIGxlbmd0aCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXN1bHRpbmcgbGVuZ3RoIGlzIG1vcmUgdGhhbiAzMCBjaGFyYWN0ZXJzLCBjaG9wcyBvZmYgYW55CisgICAgICAgICAgICAgICAgICAgIC8vIHRyYWlsaW5nIHNwYWNlcworICAgICAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID4gMzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0U3BhY2UgPSB0aXRsZS5sYXN0SW5kZXhPZignICcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RTcGFjZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnN1YnN0cmluZygwLCBsYXN0U3BhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlcyBtYXAsIHNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aXRsZQorICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgdGl0bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBwdXRzIHRoZSBkZXNpcmVkIG5vdGVzIHRleHQgaW50byB0aGUgbWFwLgorICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgdGV4dCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlcyB0aGUgcHJvdmlkZXIgd2l0aCB0aGUgbmV3IHZhbHVlcyBpbiB0aGUgbWFwLiBUaGUgTGlzdFZpZXcgaXMgdXBkYXRlZAorICAgICAgICAgKiBhdXRvbWF0aWNhbGx5LiBUaGUgcHJvdmlkZXIgc2V0cyB0aGlzIHVwIGJ5IHNldHRpbmcgdGhlIG5vdGlmaWNhdGlvbiBVUkkgZm9yCisgICAgICAgICAqIHF1ZXJ5IEN1cnNvciBvYmplY3RzIHRvIHRoZSBpbmNvbWluZyBVUkkuIFRoZSBjb250ZW50IHJlc29sdmVyIGlzIHRodXMKKyAgICAgICAgICogYXV0b21hdGljYWxseSBub3RpZmllZCB3aGVuIHRoZSBDdXJzb3IgZm9yIHRoZSBVUkkgY2hhbmdlcywgYW5kIHRoZSBVSSBpcworICAgICAgICAgKiB1cGRhdGVkLgorICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGJlaW5nIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gSXQgd2lsbCBibG9jayB0aGUgdGhyZWFkIHVudGlsIHRoZQorICAgICAgICAgKiB1cGRhdGUgY29tcGxldGVzLiBJbiBhIHNhbXBsZSBhcHAsIGdvaW5nIGFnYWluc3QgYSBzaW1wbGUgcHJvdmlkZXIgYmFzZWQgb24gYQorICAgICAgICAgKiBsb2NhbCBkYXRhYmFzZSwgdGhlIGJsb2NrIHdpbGwgYmUgbW9tZW50YXJ5LCBidXQgaW4gYSByZWFsIGFwcCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgb3IgYW5kcm9pZC5vcy5Bc3luY1Rhc2suCisgICAgICAgICAqLworICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUoCisgICAgICAgICAgICAgICAgbVVyaSwgICAgLy8gVGhlIFVSSSBmb3IgdGhlIHJlY29yZCB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgdmFsdWVzLCAgLy8gVGhlIG1hcCBvZiBjb2x1bW4gbmFtZXMgYW5kIG5ldyB2YWx1ZXMgdG8gYXBwbHkgdG8gdGhlbS4KKyAgICAgICAgICAgICAgICBudWxsLCAgICAvLyBObyBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlIHVzZWQsIHNvIG5vIHdoZXJlIGNvbHVtbnMgYXJlIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBudWxsICAgICAvLyBObyB3aGVyZSBjb2x1bW5zIGFyZSB1c2VkLCBzbyBubyB3aGVyZSBhcmd1bWVudHMgYXJlIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICk7CisKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaGVscGVyIG1ldGhvZCBjYW5jZWxzIHRoZSB3b3JrIGRvbmUgb24gYSBub3RlLiAgSXQgZGVsZXRlcyB0aGUgbm90ZSBpZiBpdCB3YXMKKyAgICAgKiBuZXdseSBjcmVhdGVkLCBvciByZXZlcnRzIHRvIHRoZSBvcmlnaW5hbCB0ZXh0IG9mIHRoZSBub3RlIGkKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIHZvaWQgY2FuY2VsTm90ZSgpIHsKKworICAgICAgICAvLyBJZgogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CiAgICAgICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0VESVQpIHsKICAgICAgICAgICAgICAgICAvLyBQdXQgdGhlIG9yaWdpbmFsIG5vdGUgdGV4dCBiYWNrIGludG8gdGhlIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgbUN1cnNvci5jbG9zZSgpOwogICAgICAgICAgICAgICAgIG1DdXJzb3IgPSBudWxsOwogICAgICAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKLSAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVzLk5PVEUsIG1PcmlnaW5hbENvbnRlbnQpOworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCBtT3JpZ2luYWxDb250ZW50KTsKICAgICAgICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUobVVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX0lOU0VSVCkgewogICAgICAgICAgICAgICAgIC8vIFdlIGluc2VydGVkIGFuIGVtcHR5IG5vdGUsIG1ha2Ugc3VyZSB0byBkZWxldGUgaXQKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWQuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWQuamF2YQppbmRleCAyNWJlMjNlLi42MjRiZTkwIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkLmphdmEKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZC5qYXZhCkBAIC0yMCwyNSArMjAsOTIgQEAKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zOwogCiAvKioKLSAqIENvbnZlbmllbmNlIGRlZmluaXRpb25zIGZvciBOb3RlUGFkUHJvdmlkZXIKKyAqIERlZmluZXMgYSBjb250cmFjdCBiZXR3ZWVuIHRoZSBOb3RlIFBhZCBjb250ZW50IHByb3ZpZGVyIGFuZCBpdHMgY2xpZW50cy4gQSBjb250cmFjdCBkZWZpbmVzIHRoZQorICogaW5mb3JtYXRpb24gdGhhdCBhIGNsaWVudCBuZWVkcyB0byBhY2Nlc3MgdGhlIHByb3ZpZGVyIGFzIG9uZSBvciBtb3JlIGRhdGEgdGFibGVzLiBBIGNvbnRyYWN0CisgKiBpcyBhIHB1YmxpYywgbm9uLWV4dGVuZGFibGUgKGZpbmFsKSBjbGFzcyB0aGF0IGNvbnRhaW5zIGNvbnN0YW50cyBkZWZpbmluZyBjb2x1bW4gbmFtZXMgYW5kCisgKiBVUklzLiBBIHdlbGwtd3JpdHRlbiBjbGllbnQgZGVwZW5kcyBvbmx5IG9uIHRoZSBjb25zdGFudHMgaW4gdGhlIGNvbnRyYWN0LgogICovCiBwdWJsaWMgZmluYWwgY2xhc3MgTm90ZVBhZCB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSE9SSVRZID0gImNvbS5nb29nbGUucHJvdmlkZXIuTm90ZVBhZCI7CiAKICAgICAvLyBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKLSAgICBwcml2YXRlIE5vdGVQYWQoKSB7fQotICAgIAorICAgIHByaXZhdGUgTm90ZVBhZCgpIHsKKyAgICB9CisKICAgICAvKioKLSAgICAgKiBOb3RlcyB0YWJsZQorICAgICAqIE5vdGVzIHRhYmxlIGNvbnRyYWN0CiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3RlcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKKwogICAgICAgICAvLyBUaGlzIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQKICAgICAgICAgcHJpdmF0ZSBOb3RlcygpIHt9CiAKICAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0YWJsZSBuYW1lIG9mZmVyZWQgYnkgdGhpcyBwcm92aWRlcgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEVfTkFNRSA9ICJub3RlcyI7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVVJJIGRlZmluaXRpb25zCisgICAgICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgc2NoZW1lIHBhcnQgZm9yIHRoaXMgcHJvdmlkZXIncyBVUkkKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUUgPSAiY29udGVudDovLyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdGggcGFydHMgZm9yIHRoZSBVUklzCisgICAgICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQYXRoIHBhcnQgZm9yIHRoZSBOb3RlcyBVUkkKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIX05PVEVTID0gIi9ub3RlcyI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdGggcGFydCBmb3IgdGhlIE5vdGUgSUQgVVJJCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9OT1RFX0lEID0gIi9ub3Rlcy8iOworCisgICAgICAgIC8qKgorICAgICAgICAgKiAwLXJlbGF0aXZlIHBvc2l0aW9uIG9mIGEgbm90ZSBJRCBzZWdtZW50IGluIHRoZSBwYXRoIHBhcnQgb2YgYSBub3RlIElEIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9URV9JRF9QQVRIX1BPU0lUSU9OID0gMTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGF0aCBwYXJ0IGZvciB0aGUgTGl2ZSBGb2xkZXIgVVJJCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSF9MSVZFX0ZPTERFUiA9ICIvbGl2ZV9mb2xkZXJzL25vdGVzIjsKKworICAgICAgICAvKioKICAgICAgICAgICogVGhlIGNvbnRlbnQ6Ly8gc3R5bGUgVVJMIGZvciB0aGlzIHRhYmxlCiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX1VSSSA9IFVyaS5wYXJzZSgiY29udGVudDovLyIgKyBBVVRIT1JJVFkgKyAiL25vdGVzIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIENPTlRFTlRfVVJJID0gIFVyaS5wYXJzZShTQ0hFTUUgKyBBVVRIT1JJVFkgKyBQQVRIX05PVEVTKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGNvbnRlbnQgVVJJIGJhc2UgZm9yIGEgc2luZ2xlIG5vdGUuIENhbGxlcnMgbXVzdAorICAgICAgICAgKiBhcHBlbmQgYSBudW1lcmljIG5vdGUgaWQgdG8gdGhpcyBVcmkgdG8gcmV0cmlldmUgYSBub3RlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVyaSBDT05URU5UX0lEX1VSSV9CQVNFCisgICAgICAgICAgICA9IFVyaS5wYXJzZShTQ0hFTUUgKyBBVVRIT1JJVFkgKyBQQVRIX05PVEVfSUQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgY29udGVudCBVUkkgbWF0Y2ggcGF0dGVybiBmb3IgYSBzaW5nbGUgbm90ZSwgc3BlY2lmaWVkIGJ5IGl0cyBJRC4gVXNlIHRoaXMgdG8gbWF0Y2gKKyAgICAgICAgICogaW5jb21pbmcgVVJJcyBvciB0byBjb25zdHJ1Y3QgYW4gSW50ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9JRF9VUklfUEFUVEVSTgorICAgICAgICAgICAgPSBVcmkucGFyc2UoU0NIRU1FICsgQVVUSE9SSVRZICsgUEFUSF9OT1RFX0lEICsgIi8jIik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb250ZW50IFVyaSBwYXR0ZXJuIGZvciBhIG5vdGVzIGxpc3RpbmcgZm9yIGxpdmUgZm9sZGVycworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgTElWRV9GT0xERVJfVVJJCisgICAgICAgICAgICA9IFVyaS5wYXJzZShTQ0hFTUUgKyBBVVRIT1JJVFkgKyBQQVRIX0xJVkVfRk9MREVSKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNSU1FIHR5cGUgZGVmaW5pdGlvbnMKKyAgICAgICAgICovCiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBNSU1FIHR5cGUgb2Yge0BsaW5rICNDT05URU5UX1VSSX0gcHJvdmlkaW5nIGEgZGlyZWN0b3J5IG9mIG5vdGVzLgpAQCAtNDYsNyArMTEzLDggQEAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5kaXIvdm5kLmdvb2dsZS5ub3RlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUgbm90ZS4KKyAgICAgICAgICogVGhlIE1JTUUgdHlwZSBvZiBhIHtAbGluayAjQ09OVEVOVF9VUkl9IHN1Yi1kaXJlY3Rvcnkgb2YgYSBzaW5nbGUKKyAgICAgICAgICogbm90ZS4KICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfSVRFTV9UWVBFID0gInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5nb29nbGUubm90ZSI7CiAKQEAgLTU1LDI4ICsxMjMsMzIgQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU09SVF9PUkRFUiA9ICJtb2RpZmllZCBERVNDIjsKIAorICAgICAgICAvKgorICAgICAgICAgKiBDb2x1bW4gZGVmaW5pdGlvbnMKKyAgICAgICAgICovCisKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgbm90ZQorICAgICAgICAgKiBDb2x1bW4gbmFtZSBmb3IgdGhlIHRpdGxlIG9mIHRoZSBub3RlCiAgICAgICAgICAqIDxQPlR5cGU6IFRFWFQ8L1A+CiAgICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSVRMRSA9ICJ0aXRsZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FX1RJVExFID0gInRpdGxlIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIG5vdGUgaXRzZWxmCisgICAgICAgICAqIENvbHVtbiBuYW1lIG9mIHRoZSBub3RlIGNvbnRlbnQKICAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KICAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEUgPSAibm90ZSI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FX05PVEUgPSAibm90ZSI7CiAKICAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lc3RhbXAgZm9yIHdoZW4gdGhlIG5vdGUgd2FzIGNyZWF0ZWQKKyAgICAgICAgICogQ29sdW1uIG5hbWUgZm9yIHRoZSBjcmVhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyBmcm9tIFN5c3RlbS5jdXJlbnRUaW1lTWlsbGlzKCkpPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JFQVRFRF9EQVRFID0gImNyZWF0ZWQiOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xVTU5fTkFNRV9DUkVBVEVfREFURSA9ICJjcmVhdGVkIjsKIAogICAgICAgICAvKioKLSAgICAgICAgICogVGhlIHRpbWVzdGFtcCBmb3Igd2hlbiB0aGUgbm90ZSB3YXMgbGFzdCBtb2RpZmllZAorICAgICAgICAgKiBDb2x1bW4gbmFtZSBmb3IgdGhlIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyBmcm9tIFN5c3RlbS5jdXJlbnRUaW1lTWlsbGlzKCkpPC9QPgogICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ESUZJRURfREFURSA9ICJtb2RpZmllZCI7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTFVNTl9OQU1FX01PRElGSUNBVElPTl9EQVRFID0gIm1vZGlmaWVkIjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkUHJvdmlkZXIuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlci5qYXZhCmluZGV4IDU4Y2RjOGYuLmYxMjE1NTMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlci5qYXZhCisrKyBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlci5qYXZhCkBAIC0xNiwxMyArMTYsMTUgQEAKIAogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQ7CiAKLWltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZC5Ob3RlczsKK2ltcG9ydCBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQuTm90ZVBhZDsKIAogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXI7CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VmFsdWVzOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5VcmlNYXRjaGVyOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UHJvdmlkZXIuUGlwZURhdGFXcml0ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Bc3NldEZpbGVEZXNjcmlwdG9yOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuU1FMRXhjZXB0aW9uOwpAQCAtMzAsMjM2ICszMiw3MjggQEAKIGltcG9ydCBhbmRyb2lkLmRhdGFiYXNlLnNxbGl0ZS5TUUxpdGVPcGVuSGVscGVyOwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2Uuc3FsaXRlLlNRTGl0ZVF1ZXJ5QnVpbGRlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC5vcy5QYXJjZWxGaWxlRGVzY3JpcHRvcjsKIGltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkxpdmVGb2xkZXJzOwogaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7CiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKIAoraW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogCiAvKioKICAqIFByb3ZpZGVzIGFjY2VzcyB0byBhIGRhdGFiYXNlIG9mIG5vdGVzLiBFYWNoIG5vdGUgaGFzIGEgdGl0bGUsIHRoZSBub3RlCiAgKiBpdHNlbGYsIGEgY3JlYXRpb24gZGF0ZSBhbmQgYSBtb2RpZmllZCBkYXRhLgogICovCi1wdWJsaWMgY2xhc3MgTm90ZVBhZFByb3ZpZGVyIGV4dGVuZHMgQ29udGVudFByb3ZpZGVyIHsKLQorcHVibGljIGNsYXNzIE5vdGVQYWRQcm92aWRlciBleHRlbmRzIENvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIFBpcGVEYXRhV3JpdGVyPEN1cnNvcj4geworICAgIC8vIFVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgbG9nZ2luZwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTm90ZVBhZFByb3ZpZGVyIjsKIAorICAgIC8qKgorICAgICAqIFRoZSBkYXRhYmFzZSB0aGF0IHRoZSBwcm92aWRlciB1c2VzIGFzIGl0cyB1bmRlcmx5aW5nIGRhdGEgc3RvcmUKKyAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFUQUJBU0VfTkFNRSA9ICJub3RlX3BhZC5kYiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERBVEFCQVNFX1ZFUlNJT04gPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RFU19UQUJMRV9OQU1FID0gIm5vdGVzIjsKLQotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHNOb3Rlc1Byb2plY3Rpb25NYXA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEVTID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9URV9JRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExJVkVfRk9MREVSX05PVEVTID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaU1hdGNoZXIgc1VyaU1hdGNoZXI7CiAKICAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIGhlbHBzIG9wZW4sIGNyZWF0ZSwgYW5kIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGZpbGUuCisgICAgICogVGhlIGRhdGFiYXNlIHZlcnNpb24KICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEYXRhYmFzZUhlbHBlciBleHRlbmRzIFNRTGl0ZU9wZW5IZWxwZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEQVRBQkFTRV9WRVJTSU9OID0gMjsKIAotICAgICAgICBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIERBVEFCQVNFX05BTUUsIG51bGwsIERBVEFCQVNFX1ZFUlNJT04pOwotICAgICAgICB9CisgICAgLyoqCisgICAgICogQSBwcm9qZWN0aW9uIG1hcCB1c2VkIHRvIHNlbGVjdCBjb2x1bW5zIGZyb20gdGhlIGRhdGFiYXNlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gc05vdGVzUHJvamVjdGlvbk1hcDsKIAotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoU1FMaXRlRGF0YWJhc2UgZGIpIHsKLSAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSAiICsgTk9URVNfVEFCTEVfTkFNRSArICIgKCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3Rlcy5fSUQgKyAiIElOVEVHRVIgUFJJTUFSWSBLRVksIgotICAgICAgICAgICAgICAgICAgICArIE5vdGVzLlRJVExFICsgIiBURVhULCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3Rlcy5OT1RFICsgIiBURVhULCIKLSAgICAgICAgICAgICAgICAgICAgKyBOb3Rlcy5DUkVBVEVEX0RBVEUgKyAiIElOVEVHRVIsIgotICAgICAgICAgICAgICAgICAgICArIE5vdGVzLk1PRElGSUVEX0RBVEUgKyAiIElOVEVHRVIiCi0gICAgICAgICAgICAgICAgICAgICsgIik7Iik7Ci0gICAgICAgIH0KKyAgICAvKioKKyAgICAgKiBBIHByb2plY3Rpb24gbWFwIHVzZWQgdG8gc2VsZWN0IGNvbHVtbnMgZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXA7CiAKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBncmFkZShTUUxpdGVEYXRhYmFzZSBkYiwgaW50IG9sZFZlcnNpb24sIGludCBuZXdWZXJzaW9uKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVcGdyYWRpbmcgZGF0YWJhc2UgZnJvbSB2ZXJzaW9uICIgKyBvbGRWZXJzaW9uICsgIiB0byAiCi0gICAgICAgICAgICAgICAgICAgICsgbmV3VmVyc2lvbiArICIsIHdoaWNoIHdpbGwgZGVzdHJveSBhbGwgb2xkIGRhdGEiKTsKLSAgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTIG5vdGVzIik7Ci0gICAgICAgICAgICBvbkNyZWF0ZShkYik7Ci0gICAgICAgIH0KLSAgICB9CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgcHJvamVjdGlvbiBmb3IgdGhlIGludGVyZXN0aW5nIGNvbHVtbnMgb2YgYSBub3JtYWwgbm90ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBSRUFEX05PVEVfUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgICAgICAgICAgICAgICAvLyBQcm9qZWN0aW9uIHBvc2l0aW9uIDAsIHRoZSBub3RlJ3MgaWQKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIC8vIFByb2plY3Rpb24gcG9zaXRpb24gMSwgdGhlIG5vdGUncyBjb250ZW50CisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCAvLyBQcm9qZWN0aW9uIHBvc2l0aW9uIDIsIHRoZSBub3RlJ3MgdGl0bGUKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX05PVEVfTk9URV9JTkRFWCA9IDE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfTk9URV9USVRMRV9JTkRFWCA9IDI7CiAKKyAgICAvKgorICAgICAqIENvbnN0YW50cyB1c2VkIGJ5IHRoZSBVcmkgbWF0Y2hlciB0byBjaG9vc2UgYW4gYWN0aW9uIGJhc2VkIG9uIHRoZSBwYXR0ZXJuCisgICAgICogb2YgdGhlIGluY29taW5nIFVSSQorICAgICAqLworICAgIC8vIFRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgTm90ZXMgVVJJIHBhdHRlcm4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9URVMgPSAxOworCisgICAgLy8gVGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZSBOb3RlIElEIFVSSSBwYXR0ZXJuCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEVfSUQgPSAyOworCisgICAgLy8gVGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZSBMaXZlIEZvbGRlciBVUkkgcGF0dGVybgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMSVZFX0ZPTERFUl9OT1RFUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBBIFVyaU1hdGNoZXIgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVcmlNYXRjaGVyIHNVcmlNYXRjaGVyOworCisgICAgLy8gSGFuZGxlIHRvIGEgbmV3IERhdGFiYXNlSGVscGVyLgogICAgIHByaXZhdGUgRGF0YWJhc2VIZWxwZXIgbU9wZW5IZWxwZXI7CiAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZSgpIHsKLSAgICAgICAgbU9wZW5IZWxwZXIgPSBuZXcgRGF0YWJhc2VIZWxwZXIoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvKioKKyAgICAgKiBBIGJsb2NrIHRoYXQgaW5zdGFudGlhdGVzIGFuZCBzZXRzIHN0YXRpYyBvYmplY3RzCisgICAgICovCisgICAgc3RhdGljIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyB0aGUgVVJJIG1hdGNoZXIKKyAgICAgICAgICovCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQorICAgICAgICBzVXJpTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOworCisgICAgICAgIC8vIEFkZCBhIHBhdHRlcm4gdGhhdCByb3V0ZXMgVVJJcyB0ZXJtaW5hdGVkIHdpdGggIm5vdGVzIiB0byBhIE5PVEVTIG9wZXJhdGlvbgorICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJub3RlcyIsIE5PVEVTKTsKKworICAgICAgICAvLyBBZGQgYSBwYXR0ZXJuIHRoYXQgcm91dGVzIFVSSXMgdGVybWluYXRlZCB3aXRoICJub3RlcyIgcGx1cyBhbiBpbnRlZ2VyCisgICAgICAgIC8vIHRvIGEgbm90ZSBJRCBvcGVyYXRpb24KKyAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMvIyIsIE5PVEVfSUQpOworCisgICAgICAgIC8vIEFkZCBhIHBhdHRlcm4gdGhhdCByb3V0ZXMgVVJJcyB0ZXJtaW5hdGVkIHdpdGggbGl2ZV9mb2xkZXJzL25vdGVzIHRvIGEKKyAgICAgICAgLy8gbGl2ZSBmb2xkZXIgb3BlcmF0aW9uCisgICAgICAgIHNVcmlNYXRjaGVyLmFkZFVSSShOb3RlUGFkLkFVVEhPUklUWSwgImxpdmVfZm9sZGVycy9ub3RlcyIsIExJVkVfRk9MREVSX05PVEVTKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIHByb2plY3Rpb24gbWFwIHRoYXQgcmV0dXJucyBhbGwgY29sdW1ucworICAgICAgICAgKi8KKworICAgICAgICAvLyBDcmVhdGVzIGEgbmV3IHByb2plY3Rpb24gbWFwIGluc3RhbmNlLiBUaGUgbWFwIHJldHVybnMgYSBjb2x1bW4gbmFtZQorICAgICAgICAvLyBnaXZlbiBhIHN0cmluZy4gVGhlIHR3byBhcmUgdXN1YWxseSBlcXVhbC4KKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgICAgIC8vIE1hcHMgdGhlIHN0cmluZyAiX0lEIiB0byB0aGUgY29sdW1uIG5hbWUgIl9JRCIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5fSUQsIE5vdGVQYWQuTm90ZXMuX0lEKTsKKworICAgICAgICAvLyBNYXBzICJ0aXRsZSIgdG8gInRpdGxlIgorICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFKTsKKworICAgICAgICAvLyBNYXBzICJub3RlIiB0byAibm90ZSIKKyAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcC5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpOworCisgICAgICAgIC8vIE1hcHMgImNyZWF0ZWQiIHRvICJjcmVhdGVkIgorICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUpOworCisgICAgICAgIC8vIE1hcHMgIm1vZGlmaWVkIiB0byAibW9kaWZpZWQiCisgICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsCisgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ3JlYXRlcyBhbiBpbml0aWFsaXplcyBhIHByb2plY3Rpb24gbWFwIGZvciBoYW5kbGluZyBMaXZlIEZvbGRlcnMKKyAgICAgICAgICovCisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBwcm9qZWN0aW9uIG1hcCBpbnN0YW5jZQorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICAvLyBNYXBzICJfSUQiIHRvICJfSUQgQVMgX0lEIiBmb3IgYSBsaXZlIGZvbGRlcgorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLl9JRCwgTm90ZVBhZC5Ob3Rlcy5fSUQgKyAiIEFTICIgKyBMaXZlRm9sZGVycy5fSUQpOworCisgICAgICAgIC8vIE1hcHMgIk5BTUUiIHRvICJ0aXRsZSBBUyBOQU1FIgorICAgICAgICBzTGl2ZUZvbGRlclByb2plY3Rpb25NYXAucHV0KExpdmVGb2xkZXJzLk5BTUUsIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiIEFTICIgKworICAgICAgICAgICAgTGl2ZUZvbGRlcnMuTkFNRSk7CiAgICAgfQogCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEN1cnNvciBxdWVyeShVcmkgdXJpLCBTdHJpbmdbXSBwcm9qZWN0aW9uLCBTdHJpbmcgc2VsZWN0aW9uLCBTdHJpbmdbXSBzZWxlY3Rpb25BcmdzLAotICAgICAgICAgICAgU3RyaW5nIHNvcnRPcmRlcikgewotICAgICAgICBTUUxpdGVRdWVyeUJ1aWxkZXIgcWIgPSBuZXcgU1FMaXRlUXVlcnlCdWlsZGVyKCk7Ci0gICAgICAgIHFiLnNldFRhYmxlcyhOT1RFU19UQUJMRV9OQU1FKTsKKyAgICAvKioKKyAgICAqCisgICAgKiBUaGlzIGNsYXNzIGhlbHBzIG9wZW4sIGNyZWF0ZSwgYW5kIHVwZ3JhZGUgdGhlIGRhdGFiYXNlIGZpbGUuIFNldCB0byBwYWNrYWdlIHZpc2liaWxpdHkKKyAgICAqIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICovCisgICBzdGF0aWMgY2xhc3MgRGF0YWJhc2VIZWxwZXIgZXh0ZW5kcyBTUUxpdGVPcGVuSGVscGVyIHsKIAorICAgICAgIERhdGFiYXNlSGVscGVyKENvbnRleHQgY29udGV4dCkgeworCisgICAgICAgICAgIC8vIGNhbGxzIHRoZSBzdXBlciBjb25zdHJ1Y3RvciwgcmVxdWVzdGluZyB0aGUgZGVmYXVsdCBjdXJzb3IgZmFjdG9yeS4KKyAgICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CisgICAgICAgfQorCisgICAgICAgLyoqCisgICAgICAgICoKKyAgICAgICAgKiBDcmVhdGVzIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlIHdpdGggdGFibGUgbmFtZSBhbmQgY29sdW1uIG5hbWVzIHRha2VuIGZyb20gdGhlCisgICAgICAgICogTm90ZVBhZCBjbGFzcy4KKyAgICAgICAgKi8KKyAgICAgICBAT3ZlcnJpZGUKKyAgICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShTUUxpdGVEYXRhYmFzZSBkYikgeworICAgICAgICAgICBkYi5leGVjU1FMKCJDUkVBVEUgVEFCTEUgIiArIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSArICIgKCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuX0lEICsgIiBJTlRFR0VSIFBSSU1BUlkgS0VZLCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgKyAiIFRFWFQsIgorICAgICAgICAgICAgICAgICAgICsgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFICsgIiBURVhULCIKKyAgICAgICAgICAgICAgICAgICArIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUgKyAiIElOVEVHRVIsIgorICAgICAgICAgICAgICAgICAgICsgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSArICIgSU5URUdFUiIKKyAgICAgICAgICAgICAgICAgICArICIpOyIpOworICAgICAgIH0KKworICAgICAgIC8qKgorICAgICAgICAqCisgICAgICAgICogRGVtb25zdHJhdGVzIHRoYXQgdGhlIHByb3ZpZGVyIG11c3QgY29uc2lkZXIgd2hhdCBoYXBwZW5zIHdoZW4gdGhlCisgICAgICAgICogdW5kZXJseWluZyBkYXRhc3RvcmUgaXMgY2hhbmdlZC4gSW4gdGhpcyBzYW1wbGUsIHRoZSBkYXRhYmFzZSBpcyB1cGdyYWRlZCB0aGUgZGF0YWJhc2UKKyAgICAgICAgKiBieSBkZXN0cm95aW5nIHRoZSBleGlzdGluZyBkYXRhLgorICAgICAgICAqIEEgcmVhbCBhcHBsaWNhdGlvbiBzaG91bGQgdXBncmFkZSB0aGUgZGF0YWJhc2UgaW4gcGxhY2UuCisgICAgICAgICovCisgICAgICAgQE92ZXJyaWRlCisgICAgICAgcHVibGljIHZvaWQgb25VcGdyYWRlKFNRTGl0ZURhdGFiYXNlIGRiLCBpbnQgb2xkVmVyc2lvbiwgaW50IG5ld1ZlcnNpb24pIHsKKworICAgICAgICAgICAvLyBMb2dzIHRoYXQgdGhlIGRhdGFiYXNlIGlzIGJlaW5nIHVwZ3JhZGVkCisgICAgICAgICAgIExvZy53KFRBRywgIlVwZ3JhZGluZyBkYXRhYmFzZSBmcm9tIHZlcnNpb24gIiArIG9sZFZlcnNpb24gKyAiIHRvICIKKyAgICAgICAgICAgICAgICAgICArIG5ld1ZlcnNpb24gKyAiLCB3aGljaCB3aWxsIGRlc3Ryb3kgYWxsIG9sZCBkYXRhIik7CisKKyAgICAgICAgICAgLy8gS2lsbHMgdGhlIHRhYmxlIGFuZCBleGlzdGluZyBkYXRhCisgICAgICAgICAgIGRiLmV4ZWNTUUwoIkRST1AgVEFCTEUgSUYgRVhJU1RTIG5vdGVzIik7CisKKyAgICAgICAgICAgLy8gUmVjcmVhdGVzIHRoZSBkYXRhYmFzZSB3aXRoIGEgbmV3IHZlcnNpb24KKyAgICAgICAgICAgb25DcmVhdGUoZGIpOworICAgICAgIH0KKyAgIH0KKworICAgLyoqCisgICAgKgorICAgICogSW5pdGlhbGl6ZXMgdGhlIHByb3ZpZGVyIGJ5IGNyZWF0aW5nIGEgbmV3IERhdGFiYXNlSGVscGVyLiBvbkNyZWF0ZSgpIGlzIGNhbGxlZAorICAgICogYXV0b21hdGljYWxseSB3aGVuIEFuZHJvaWQgY3JlYXRlcyB0aGUgcHJvdmlkZXIgaW4gcmVzcG9uc2UgdG8gYSByZXNvbHZlciByZXF1ZXN0IGZyb20gYQorICAgICogY2xpZW50LgorICAgICovCisgICBAT3ZlcnJpZGUKKyAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlKCkgeworCisgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBoZWxwZXIgb2JqZWN0LiBOb3RlIHRoYXQgdGhlIGRhdGFiYXNlIGl0c2VsZiBpc24ndCBvcGVuZWQgdW50aWwKKyAgICAgICAvLyBzb21ldGhpbmcgdHJpZXMgdG8gYWNjZXNzIGl0LCBhbmQgaXQncyBvbmx5IGNyZWF0ZWQgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LgorICAgICAgIG1PcGVuSGVscGVyID0gbmV3IERhdGFiYXNlSGVscGVyKGdldENvbnRleHQoKSk7CisKKyAgICAgICAvLyBBc3N1bWVzIHRoYXQgYW55IGZhaWx1cmVzIHdpbGwgYmUgcmVwb3J0ZWQgYnkgYSB0aHJvd24gZXhjZXB0aW9uLgorICAgICAgIHJldHVybiB0cnVlOworICAgfQorCisgICAvKioKKyAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgY2xpZW50IGNhbGxzCisgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNxdWVyeShVcmksIFN0cmluZ1tdLCBTdHJpbmcsIFN0cmluZ1tdLCBTdHJpbmcpfS4KKyAgICAqIFF1ZXJpZXMgdGhlIGRhdGFiYXNlIGFuZCByZXR1cm5zIGEgY3Vyc29yIGNvbnRhaW5pbmcgdGhlIHJlc3VsdHMuCisgICAgKgorICAgICogQHJldHVybiBBIGN1cnNvciBjb250YWluaW5nIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeS4gVGhlIGN1cnNvciBleGlzdHMgYnV0IGlzIGVtcHR5IGlmCisgICAgKiB0aGUgcXVlcnkgcmV0dXJucyBubyByZXN1bHRzIG9yIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCisgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgQ3Vyc29yIHF1ZXJ5KFVyaSB1cmksIFN0cmluZ1tdIHByb2plY3Rpb24sIFN0cmluZyBzZWxlY3Rpb24sIFN0cmluZ1tdIHNlbGVjdGlvbkFyZ3MsCisgICAgICAgICAgIFN0cmluZyBzb3J0T3JkZXIpIHsKKworICAgICAgIC8vIENvbnN0cnVjdHMgYSBuZXcgcXVlcnkgYnVpbGRlciBhbmQgc2V0cyBpdHMgdGFibGUgbmFtZQorICAgICAgIFNRTGl0ZVF1ZXJ5QnVpbGRlciBxYiA9IG5ldyBTUUxpdGVRdWVyeUJ1aWxkZXIoKTsKKyAgICAgICBxYi5zZXRUYWJsZXMoTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FKTsKKworICAgICAgIC8qKgorICAgICAgICAqIENob29zZSB0aGUgcHJvamVjdGlvbiBhbmQgYWRqdXN0IHRoZSAid2hlcmUiIGNsYXVzZSBiYXNlZCBvbiBVUkkgcGF0dGVybi1tYXRjaGluZy4KKyAgICAgICAgKi8KKyAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKKyAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBpcyBmb3Igbm90ZXMsIGNob29zZXMgdGhlIE5vdGVzIHByb2plY3Rpb24KKyAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAvKiBJZiB0aGUgaW5jb21pbmcgVVJJIGlzIGZvciBhIHNpbmdsZSBub3RlIGlkZW50aWZpZWQgYnkgaXRzIElELCBjaG9vc2VzIHRoZQorICAgICAgICAgICAgKiBub3RlIElEIHByb2plY3Rpb24sIGFuZCBhcHBlbmRzICJfSUQgPSA8bm90ZUlEPiIgdG8gdGhlIHdoZXJlIGNsYXVzZSwgc28gdGhhdAorICAgICAgICAgICAgKiBpdCBzZWxlY3RzIHRoYXQgc2luZ2xlIG5vdGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7CisgICAgICAgICAgICAgICBxYi5hcHBlbmRXaGVyZSgKKyAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCArICAgIC8vIHRoZSBuYW1lIG9mIHRoZSBJRCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAiPSIgKworICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm90ZSBJRCBpdHNlbGYgaW4gdGhlIGluY29taW5nIFVSSQorICAgICAgICAgICAgICAgICAgIHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoTm90ZVBhZC5Ob3Rlcy5OT1RFX0lEX1BBVEhfUE9TSVRJT04pKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6CisgICAgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIGlzIGZyb20gYSBsaXZlIGZvbGRlciwgY2hvb3NlcyB0aGUgbGl2ZSBmb2xkZXIgcHJvamVjdGlvbi4KKyAgICAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwKTsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAvLyBJZiB0aGUgVVJJIGRvZXNuJ3QgbWF0Y2ggYW55IG9mIHRoZSBrbm93biBwYXR0ZXJucywgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgfQorCisKKyAgICAgICBTdHJpbmcgb3JkZXJCeTsKKyAgICAgICAvLyBJZiBubyBzb3J0IG9yZGVyIGlzIHNwZWNpZmllZCwgdXNlcyB0aGUgZGVmYXVsdAorICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzb3J0T3JkZXIpKSB7CisgICAgICAgICAgIG9yZGVyQnkgPSBOb3RlUGFkLk5vdGVzLkRFRkFVTFRfU09SVF9PUkRFUjsKKyAgICAgICB9IGVsc2UgeworICAgICAgICAgICAvLyBvdGhlcndpc2UsIHVzZXMgdGhlIGluY29taW5nIHNvcnQgb3JkZXIKKyAgICAgICAgICAgb3JkZXJCeSA9IHNvcnRPcmRlcjsKKyAgICAgICB9CisKKyAgICAgICAvLyBPcGVucyB0aGUgZGF0YWJhc2Ugb2JqZWN0IGluICJyZWFkIiBtb2RlLCBzaW5jZSBubyB3cml0ZXMgbmVlZCB0byBiZSBkb25lLgorICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0UmVhZGFibGVEYXRhYmFzZSgpOworCisgICAgICAgLyoKKyAgICAgICAgKiBQZXJmb3JtcyB0aGUgcXVlcnkuIElmIG5vIHByb2JsZW1zIG9jY3VyIHRyeWluZyB0byByZWFkIHRoZSBkYXRhYmFzZSwgdGhlbiBhIEN1cnNvcgorICAgICAgICAqIG9iamVjdCBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCB0aGUgY3Vyc29yIHZhcmlhYmxlIGNvbnRhaW5zIG51bGwuIElmIG5vIHJlY29yZHMgd2VyZQorICAgICAgICAqIHNlbGVjdGVkLCB0aGVuIHRoZSBDdXJzb3Igb2JqZWN0IGlzIGVtcHR5LCBhbmQgQ3Vyc29yLmdldENvdW50KCkgcmV0dXJucyAwLgorICAgICAgICAqLworICAgICAgIEN1cnNvciBjID0gcWIucXVlcnkoCisgICAgICAgICAgIGRiLCAgICAgICAgICAgIC8vIFRoZSBkYXRhYmFzZSB0byBxdWVyeQorICAgICAgICAgICBwcm9qZWN0aW9uLCAgICAvLyBUaGUgY29sdW1ucyB0byByZXR1cm4gZnJvbSB0aGUgcXVlcnkKKyAgICAgICAgICAgc2VsZWN0aW9uLCAgICAgLy8gVGhlIGNvbHVtbnMgZm9yIHRoZSB3aGVyZSBjbGF1c2UKKyAgICAgICAgICAgc2VsZWN0aW9uQXJncywgLy8gVGhlIHZhbHVlcyBmb3IgdGhlIHdoZXJlIGNsYXVzZQorICAgICAgICAgICBudWxsLCAgICAgICAgICAvLyBkb24ndCBncm91cCB0aGUgcm93cworICAgICAgICAgICBudWxsLCAgICAgICAgICAvLyBkb24ndCBmaWx0ZXIgYnkgcm93IGdyb3VwcworICAgICAgICAgICBvcmRlckJ5ICAgICAgICAvLyBUaGUgc29ydCBvcmRlcgorICAgICAgICk7CisKKyAgICAgICAvLyBUZWxscyB0aGUgQ3Vyc29yIHdoYXQgVVJJIHRvIHdhdGNoLCBzbyBpdCBrbm93cyB3aGVuIGl0cyBzb3VyY2UgZGF0YSBjaGFuZ2VzCisgICAgICAgYy5zZXROb3RpZmljYXRpb25VcmkoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLCB1cmkpOworICAgICAgIHJldHVybiBjOworICAgfQorCisgICAvKioKKyAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjZ2V0VHlwZShVcmkpfS4KKyAgICAqIFJldHVybnMgdGhlIE1JTUUgZGF0YSB0eXBlIG9mIHRoZSBVUkkgZ2l2ZW4gYXMgYSBwYXJhbWV0ZXIuCisgICAgKgorICAgICogQHBhcmFtIHVyaSBUaGUgVVJJIHdob3NlIE1JTUUgdHlwZSBpcyBkZXNpcmVkLgorICAgICogQHJldHVybiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBVUkkuCisgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAqLworICAgQE92ZXJyaWRlCisgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgeworCisgICAgICAgLyoqCisgICAgICAgICogQ2hvb3NlcyB0aGUgTUlNRSB0eXBlIGJhc2VkIG9uIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybgorICAgICAgICAqLworICAgICAgIHN3aXRjaCAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSkgeworCisgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlcyBvciBsaXZlIGZvbGRlcnMsIHJldHVybnMgdGhlIGdlbmVyYWwgY29udGVudCB0eXBlLgorICAgICAgICAgICBjYXNlIE5PVEVTOgorICAgICAgICAgICBjYXNlIExJVkVfRk9MREVSX05PVEVTOgorICAgICAgICAgICAgICAgcmV0dXJuIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFOworCisgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlIElEcywgcmV0dXJucyB0aGUgbm90ZSBJRCBjb250ZW50IHR5cGUuCisgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgIHJldHVybiBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSVRFTV9UWVBFOworCisgICAgICAgICAgIC8vIElmIHRoZSBVUkkgcGF0dGVybiBkb2Vzbid0IG1hdGNoIGFueSBwZXJtaXR0ZWQgcGF0dGVybnMsIHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICB9CisgICB9CisKKy8vQkVHSU5fSU5DTFVERShzdHJlYW0pCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdHlwZXMgb2YgYXZhaWxhYmxlIGRhdGEgc3RyZWFtcy4gIFVSSXMgdG8gc3BlY2lmaWMgbm90ZXMgYXJlIHN1cHBvcnRlZC4KKyAgICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbnZlcnQgc3VjaCBhIG5vdGUgdG8gYSBwbGFpbiB0ZXh0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIFVSSSB0byBhbmFseXplCisgICAgICogQHBhcmFtIG1pbWVUeXBlRmlsdGVyIFRoZSBNSU1FIHR5cGUgdG8gY2hlY2sgZm9yLiBUaGlzIG1ldGhvZCBvbmx5IHJldHVybnMgYSBkYXRhIHN0cmVhbQorICAgICAqIHR5cGUgZm9yIE1JTUUgdHlwZXMgdGhhdCBtYXRjaCB0aGUgZmlsdGVyLiBDdXJyZW50bHksIG9ubHkgdGV4dC9wbGFpbiBNSU1FIHR5cGVzIG1hdGNoLgorICAgICAqIEByZXR1cm4gYSBkYXRhIHN0cmVhbSBNSU1FIHR5cGUuIEN1cnJlbnRseSwgb25seSB0ZXh0L3BsYW4gaXMgcmV0dXJuZWQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIFVSSSBwYXR0ZXJuIGRvZXNuJ3QgbWF0Y2ggYW55IHN1cHBvcnRlZCBwYXR0ZXJucy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3RyZWFtVHlwZXMoVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlRmlsdGVyKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiAgQ2hvb3NlcyB0aGUgZGF0YSBzdHJlYW0gdHlwZSBiYXNlZCBvbiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4uCisgICAgICAgICAqLwogICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc05vdGVzUHJvamVjdGlvbk1hcCk7Ci0gICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICBxYi5zZXRQcm9qZWN0aW9uTWFwKHNOb3Rlc1Byb2plY3Rpb25NYXApOwotICAgICAgICAgICAgcWIuYXBwZW5kV2hlcmUoTm90ZXMuX0lEICsgIj0iICsgdXJpLmdldFBhdGhTZWdtZW50cygpLmdldCgxKSk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBwYXR0ZXJuIGlzIGZvciBub3RlcyBvciBsaXZlIGZvbGRlcnMsIHJldHVybiBudWxsLiBEYXRhIHN0cmVhbXMgYXJlIG5vdAorICAgICAgICAgICAgLy8gc3VwcG9ydGVkIGZvciB0aGlzIHR5cGUgb2YgVVJJLgorICAgICAgICAgICAgY2FzZSBOT1RFUzoKKyAgICAgICAgICAgIGNhc2UgTElWRV9GT0xERVJfTk9URVM6CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAKLSAgICAgICAgY2FzZSBMSVZFX0ZPTERFUl9OT1RFUzoKLSAgICAgICAgICAgIHFiLnNldFByb2plY3Rpb25NYXAoc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwKTsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIHBhdHRlcm4gaXMgZm9yIG5vdGUgSURzIGFuZCB0aGUgTUlNRSBmaWx0ZXIgaXMgdGV4dC9wbGFpbiwgdGhlbiByZXR1cm4KKyAgICAgICAgICAgIC8vIHRleHQvcGxhaW4KKyAgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZU1pbWVUeXBlcygidGV4dC9wbGFpbiIsIG1pbWVUeXBlRmlsdGVyKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1tdIHsgInRleHQvcGxhaW4iIH07CisgICAgICAgICAgICAgICAgfQogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIElmIHRoZSBVUkkgaXMgZm9yIGEgbm90ZSBpZCwgYnV0IHRoZSBNSU1FIGZpbHRlciBpc24ndCB0ZXh0L3BsYWluLCByZXR1cm4gbnVsbC4KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKIAotICAgICAgICAvLyBJZiBubyBzb3J0IG9yZGVyIGlzIHNwZWNpZmllZCB1c2UgdGhlIGRlZmF1bHQKLSAgICAgICAgU3RyaW5nIG9yZGVyQnk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzb3J0T3JkZXIpKSB7Ci0gICAgICAgICAgICBvcmRlckJ5ID0gTm90ZVBhZC5Ob3Rlcy5ERUZBVUxUX1NPUlRfT1JERVI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvcmRlckJ5ID0gc29ydE9yZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gR2V0IHRoZSBkYXRhYmFzZSBhbmQgcnVuIHRoZSBxdWVyeQotICAgICAgICBTUUxpdGVEYXRhYmFzZSBkYiA9IG1PcGVuSGVscGVyLmdldFJlYWRhYmxlRGF0YWJhc2UoKTsKLSAgICAgICAgQ3Vyc29yIGMgPSBxYi5xdWVyeShkYiwgcHJvamVjdGlvbiwgc2VsZWN0aW9uLCBzZWxlY3Rpb25BcmdzLCBudWxsLCBudWxsLCBvcmRlckJ5KTsKLQotICAgICAgICAvLyBUZWxsIHRoZSBjdXJzb3Igd2hhdCB1cmkgdG8gd2F0Y2gsIHNvIGl0IGtub3dzIHdoZW4gaXRzIHNvdXJjZSBkYXRhIGNoYW5nZXMKLSAgICAgICAgYy5zZXROb3RpZmljYXRpb25VcmkoZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLCB1cmkpOwotICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgVVJJIHBhdHRlcm4gZG9lc24ndCBtYXRjaCBhbnkgcGVybWl0dGVkIHBhdHRlcm5zLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KICAgICB9CiAKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJlYW0gb2YgZGF0YSBmb3IgZWFjaCBzdXBwb3J0ZWQgc3RyZWFtIHR5cGUuIFRoaXMgbWV0aG9kIGRvZXMgYSBxdWVyeSBvbiB0aGUKKyAgICAgKiBpbmNvbWRpbmcgVVJJLCB0aGVuIHVzZXMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlciNvcGVuUGlwZUhlbHBlcihVcmksIFN0cmluZywgQnVuZGxlLCBPYmplY3QsCisgICAgICogUGlwZURhdGFXcml0ZXIpfSB0byBzdGFydCBhbm90aGVyIHRocmVhZCBpbiB3aGljaCB0byBjb252ZXJ0IHRoZSBkYXRhIGludG8gYSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgcGF0dGVybiB0aGF0IHBvaW50cyB0byB0aGUgZGF0YSBzdHJlYW0KKyAgICAgKiBAcGFyYW0gbWltZVR5cGVGaWx0ZXIgQSBTdHJpbmcgY29udGFpbmluZyBhIE1JTUUgdHlwZS4gVGhpcyBtZXRob2QgdHJpZXMgdG8gZ2V0IGEgc3RyZWFtIG9mCisgICAgICogZGF0YSB3aXRoIHRoaXMgTUlNRSB0eXBlLgorICAgICAqIEBwYXJhbSBvcHRzIFRoZSBhY2Nlc3MgbW9kZSBmb3IgdGhlIGRhdGEgc3RyZWFtLiBUaGlzIG1heSBiZSAiciIgZm9yIHJlYWQtb25seSwgInciIGZvciB3cml0ZQorICAgICAqIHdpdGggb3ZlcndyaXRlLCAid2EiIGZvciB3cml0ZSB3aXRoIGFwcGVuZCwgInJ3IiBmb3IgcmVhZCBhbmQgd3JpdGUgYWNjZXNzIGZvciBleGlzdGluZyBkYXRhLAorICAgICAqIGFuZCAicnd0IiB0aGF0IHRydW5jYXRlcyB0aGUgZXhpc3RpbmcgZmlsZSBpZiB0aGUgbmV3IGRhdGEgaXMgc21hbGxlci4KKyAgICAgKiBAcmV0dXJuIEFzc2V0RmlsZURlc2NyaXB0b3IgQSBoYW5kbGUgdG8gdGhlIGZpbGUuCisgICAgICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIGluY29taW5nIFVSSS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoVXJpIHVyaSkgewotICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgY2FzZSBMSVZFX0ZPTERFUl9OT1RFUzoKLSAgICAgICAgICAgIHJldHVybiBOb3Rlcy5DT05URU5UX1RZUEU7CisgICAgcHVibGljIEFzc2V0RmlsZURlc2NyaXB0b3Igb3BlblR5cGVkQXNzZXRGaWxlKFVyaSB1cmksIFN0cmluZyBtaW1lVHlwZUZpbHRlciwgQnVuZGxlIG9wdHMpCisgICAgICAgICAgICB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAotICAgICAgICBjYXNlIE5PVEVfSUQ6Ci0gICAgICAgICAgICByZXR1cm4gTm90ZXMuQ09OVEVOVF9JVEVNX1RZUEU7CisgICAgICAgIC8vIENoZWNrcyB0byBzZWUgaWYgdGhlIE1JTUUgdHlwZSBmaWx0ZXIgbWF0Y2hlcyBhIHN1cHBvcnRlZCBNSU1FIHR5cGUuCisgICAgICAgIFN0cmluZ1tdIG1pbWVUeXBlcyA9IGdldFN0cmVhbVR5cGVzKHVyaSwgbWltZVR5cGVGaWx0ZXIpOwogCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKKyAgICAgICAgLy8gSWYgdGhlIE1JTUUgdHlwZSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgaWYgKG1pbWVUeXBlcyAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFJldHJpZXZlcyB0aGUgbm90ZSBmb3IgdGhpcyBVUkkuIFVzZXMgdGhlIHF1ZXJ5IG1ldGhvZCBkZWZpbmVkIGZvciB0aGlzIHByb3ZpZGVyLAorICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGRhdGFiYXNlIHF1ZXJ5IG1ldGhvZC4KKyAgICAgICAgICAgIEN1cnNvciBjID0gcXVlcnkoCisgICAgICAgICAgICAgICAgICAgIHVyaSwgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBVUkkgb2YgYSBub3RlCisgICAgICAgICAgICAgICAgICAgIFJFQURfTk9URV9QUk9KRUNUSU9OLCAgIC8vIEdldHMgYSBwcm9qZWN0aW9uIGNvbnRhaW5pbmcgdGhlIG5vdGUncyBJRCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBjb250ZW50cworICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAvLyBObyBXSEVSRSBjbGF1c2UsIGdldCBhbGwgbWF0Y2hpbmcgcmVjb3JkcworICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGVyZSBpcyBubyBXSEVSRSBjbGF1c2UsIG5vIHNlbGVjdGlvbiBjcml0ZXJpYQorICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGRlZmF1bHQgc29ydCBvcmRlciAobW9kaWZpY2F0aW9uIGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NlbmRpbmcKKyAgICAgICAgICAgICk7CisKKworICAgICAgICAgICAgLy8gSWYgdGhlIHF1ZXJ5IGZhaWxzIG9yIHRoZSBjdXJzb3IgaXMgZW1wdHksIHN0b3AKKyAgICAgICAgICAgIGlmIChjID09IG51bGwgfHwgIWMubW92ZVRvRmlyc3QoKSkgeworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBlbXB0eSwgc2ltcGx5IGNsb3NlIHRoZSBjdXJzb3IgYW5kIHJldHVybgorICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgbnVsbCwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiVW5hYmxlIHRvIHF1ZXJ5ICIgKyB1cmkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGFydCBhIG5ldyB0aHJlYWQgdGhhdCBwaXBlcyB0aGUgc3RyZWFtIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLgorICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NldEZpbGVEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBvcGVuUGlwZUhlbHBlcih1cmksIG1pbWVUeXBlc1swXSwgb3B0cywgYywgdGhpcyksIDAsCisgICAgICAgICAgICAgICAgICAgIEFzc2V0RmlsZURlc2NyaXB0b3IuVU5LTk9XTl9MRU5HVEgpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhlIE1JTUUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm4gYSByZWFkLW9ubHkgaGFuZGxlIHRvIHRoZSBmaWxlLgorICAgICAgICByZXR1cm4gc3VwZXIub3BlblR5cGVkQXNzZXRGaWxlKHVyaSwgbWltZVR5cGVGaWx0ZXIsIG9wdHMpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFByb3ZpZGVyLlBpcGVEYXRhV3JpdGVyfQorICAgICAqIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCB3b3JrIG9mIGNvbnZlcnRpbmcgdGhlIGRhdGEgaW4gb25lIG9mIGN1cnNvcnMgdG8gYQorICAgICAqIHN0cmVhbSBvZiBkYXRhIGZvciB0aGUgY2xpZW50IHRvIHJlYWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVEYXRhVG9QaXBlKFBhcmNlbEZpbGVEZXNjcmlwdG9yIG91dHB1dCwgVXJpIHVyaSwgU3RyaW5nIG1pbWVUeXBlLAorICAgICAgICAgICAgQnVuZGxlIG9wdHMsIEN1cnNvciBjKSB7CisgICAgICAgIC8vIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgY29udmVyc2lvbi10by10ZXh0IGZyb20gYSBzaW5nbGUgbm90ZSBlbnRyeSwKKyAgICAgICAgLy8gc28gbm8gbmVlZCBmb3IgY3Vyc29yIGRhdGEgdHlwZSBjaGVja2luZyBoZXJlLgorICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXQuZ2V0RmlsZURlc2NyaXB0b3IoKSk7CisgICAgICAgIFByaW50V3JpdGVyIHB3ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZm91dCwgIlVURi04IikpOworICAgICAgICAgICAgcHcucHJpbnRsbihjLmdldFN0cmluZyhSRUFEX05PVEVfVElUTEVfSU5ERVgpKTsKKyAgICAgICAgICAgIHB3LnByaW50bG4oIiIpOworICAgICAgICAgICAgcHcucHJpbnRsbihjLmdldFN0cmluZyhSRUFEX05PVEVfTk9URV9JTkRFWCkpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExvZy53KFRBRywgIk9vb3BzIiwgZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjLmNsb3NlKCk7CisgICAgICAgICAgICBpZiAocHcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8vRU5EX0lOQ0xVREUoc3RyZWFtKQorCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI2luc2VydChVcmksIENvbnRlbnRWYWx1ZXMpfS4KKyAgICAgKiBJbnNlcnRzIGEgbmV3IHJvdyBpbnRvIHRoZSBkYXRhYmFzZS4gVGhpcyBtZXRob2Qgc2V0cyB1cCBkZWZhdWx0IHZhbHVlcyBmb3IgYW55CisgICAgICogY29sdW1ucyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIGluY29taW5nIG1hcC4KKyAgICAgKiBJZiByb3dzIHdlcmUgaW5zZXJ0ZWQsIHRoZW4gbGlzdGVuZXJzIGFyZSBub3RpZmllZCBvZiB0aGUgY2hhbmdlLgorICAgICAqIEByZXR1cm4gVGhlIHJvdyBJRCBvZiB0aGUgaW5zZXJ0ZWQgcm93LgorICAgICAqIEB0aHJvd3MgU1FMRXhjZXB0aW9uIGlmIHRoZSBpbnNlcnRpb24gZmFpbHMuCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFVyaSBpbnNlcnQoVXJpIHVyaSwgQ29udGVudFZhbHVlcyBpbml0aWFsVmFsdWVzKSB7Ci0gICAgICAgIC8vIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgdXJpCisKKyAgICAgICAgLy8gVmFsaWRhdGVzIHRoZSBpbmNvbWluZyBVUkkuIE9ubHkgdGhlIGZ1bGwgcHJvdmlkZXIgVVJJIGlzIGFsbG93ZWQgZm9yIGluc2VydHMuCiAgICAgICAgIGlmIChzVXJpTWF0Y2hlci5tYXRjaCh1cmkpICE9IE5PVEVTKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEEgbWFwIHRvIGhvbGQgdGhlIG5ldyByZWNvcmQncyB2YWx1ZXMuCiAgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzOworCisgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyB2YWx1ZXMgbWFwIGlzIG5vdCBudWxsLCB1c2VzIGl0IGZvciB0aGUgbmV3IHZhbHVlcy4KICAgICAgICAgaWYgKGluaXRpYWxWYWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoaW5pdGlhbFZhbHVlcyk7CisKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IHZhbHVlIG1hcAogICAgICAgICAgICAgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgIExvbmcgbm93ID0gTG9uZy52YWx1ZU9mKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKIAotICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmllbGRzIGFyZSBhbGwgc2V0Ci0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5DUkVBVEVEX0RBVEUpID09IGZhbHNlKSB7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ1JFQVRFRF9EQVRFLCBub3cpOworICAgICAgICAvLyBJZiB0aGUgdmFsdWVzIG1hcCBkb2Vzbid0IGNvbnRhaW4gdGhlIGNyZWF0aW9uIGRhdGUsIHNldHMgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50IHRpbWUuCisgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9DUkVBVEVfREFURSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9DUkVBVEVfREFURSwgbm93KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5NT0RJRklFRF9EQVRFKSA9PSBmYWxzZSkgewotICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLk1PRElGSUVEX0RBVEUsIG5vdyk7CisgICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgbWFwIGRvZXNuJ3QgY29udGFpbiB0aGUgbW9kaWZpY2F0aW9uIGRhdGUsIHNldHMgdGhlIHZhbHVlIHRvIHRoZSBjdXJyZW50CisgICAgICAgIC8vIHRpbWUuCisgICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9NT0RJRklDQVRJT05fREFURSwgbm93KTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh2YWx1ZXMuY29udGFpbnNLZXkoTm90ZVBhZC5Ob3Rlcy5USVRMRSkgPT0gZmFsc2UpIHsKKyAgICAgICAgLy8gSWYgdGhlIHZhbHVlcyBtYXAgZG9lc24ndCBjb250YWluIGEgdGl0bGUsIHNldHMgdGhlIHZhbHVlIHRvIHRoZSBkZWZhdWx0IHRpdGxlLgorICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUpID09IGZhbHNlKSB7CiAgICAgICAgICAgICBSZXNvdXJjZXMgciA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKTsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5USVRMRSwgci5nZXRTdHJpbmcoYW5kcm9pZC5SLnN0cmluZy51bnRpdGxlZCkpOworICAgICAgICAgICAgdmFsdWVzLnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCByLmdldFN0cmluZyhhbmRyb2lkLlIuc3RyaW5nLnVudGl0bGVkKSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodmFsdWVzLmNvbnRhaW5zS2V5KE5vdGVQYWQuTm90ZXMuTk9URSkgPT0gZmFsc2UpIHsKLSAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5OT1RFLCAiIik7CisgICAgICAgIC8vIElmIHRoZSB2YWx1ZXMgbWFwIGRvZXNuJ3QgY29udGFpbiBub3RlIHRleHQsIHNldHMgdGhlIHZhbHVlIHRvIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgaWYgKHZhbHVlcy5jb250YWluc0tleShOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX05PVEUpID09IGZhbHNlKSB7CisgICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgIiIpOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gT3BlbnMgdGhlIGRhdGFiYXNlIG9iamVjdCBpbiAid3JpdGUiIG1vZGUuCiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOwotICAgICAgICBsb25nIHJvd0lkID0gZGIuaW5zZXJ0KE5PVEVTX1RBQkxFX05BTUUsIE5vdGVzLk5PVEUsIHZhbHVlcyk7CisKKyAgICAgICAgLy8gUGVyZm9ybXMgdGhlIGluc2VydCBhbmQgcmV0dXJucyB0aGUgSUQgb2YgdGhlIG5ldyBub3RlLgorICAgICAgICBsb25nIHJvd0lkID0gZGIuaW5zZXJ0KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgICAgICAgLy8gVGhlIHRhYmxlIHRvIGluc2VydCBpbnRvLgorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCAgLy8gQSBoYWNrLCBTUUxpdGUgc2V0cyB0aGlzIGNvbHVtbiB2YWx1ZSB0byBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZXMgaXMgZW1wdHkuCisgICAgICAgICAgICB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIG1hcCBvZiBjb2x1bW4gbmFtZXMsIGFuZCB0aGUgdmFsdWVzIHRvIGluc2VydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byB0aGUgY29sdW1ucy4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBJZiB0aGUgaW5zZXJ0IHN1Y2NlZWRlZCwgdGhlIHJvdyBJRCBleGlzdHMuCiAgICAgICAgIGlmIChyb3dJZCA+IDApIHsKLSAgICAgICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgcm93SWQpOworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIFVSSSB3aXRoIHRoZSBub3RlIElEIHBhdHRlcm4gYW5kIHRoZSBuZXcgcm93IElEIGFwcGVuZGVkIHRvIGl0LgorICAgICAgICAgICAgVXJpIG5vdGVVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX0JBU0UsIHJvd0lkKTsKKworICAgICAgICAgICAgLy8gTm90aWZpZXMgb2JzZXJ2ZXJzIHJlZ2lzdGVyZWQgYWdhaW5zdCB0aGlzIHByb3ZpZGVyIHRoYXQgdGhlIGRhdGEgY2hhbmdlZC4KICAgICAgICAgICAgIGdldENvbnRleHQoKS5nZXRDb250ZW50UmVzb2x2ZXIoKS5ub3RpZnlDaGFuZ2Uobm90ZVVyaSwgbnVsbCk7CiAgICAgICAgICAgICByZXR1cm4gbm90ZVVyaTsKICAgICAgICAgfQogCisgICAgICAgIC8vIElmIHRoZSBpbnNlcnQgZGlkbid0IHN1Y2NlZWQsIHRoZW4gdGhlIHJvd0lEIGlzIDw9IDAuIFRocm93cyBhbiBleGNlcHRpb24uCiAgICAgICAgIHRocm93IG5ldyBTUUxFeGNlcHRpb24oIkZhaWxlZCB0byBpbnNlcnQgcm93IGludG8gIiArIHVyaSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjYWxscworICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI2RlbGV0ZShVcmksIFN0cmluZywgU3RyaW5nW10pfS4KKyAgICAgKiBEZWxldGVzIHJlY29yZHMgZnJvbSB0aGUgZGF0YWJhc2UuIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgbm90ZSBJRCBVUkkgcGF0dGVybiwKKyAgICAgKiB0aGlzIG1ldGhvZCBkZWxldGVzIHRoZSBvbmUgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgSUQgaW4gdGhlIFVSSS4gT3RoZXJ3aXNlLCBpdCBkZWxldGVzIGEKKyAgICAgKiBhIHNldCBvZiByZWNvcmRzLiBUaGUgcmVjb3JkIG9yIHJlY29yZHMgbXVzdCBhbHNvIG1hdGNoIHRoZSBpbnB1dCBzZWxlY3Rpb24gY3JpdGVyaWEKKyAgICAgKiBzcGVjaWZpZWQgYnkgd2hlcmUgYW5kIHdoZXJlQXJncy4KKyAgICAgKgorICAgICAqIElmIHJvd3Mgd2VyZSBkZWxldGVkLCB0aGVuIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS4KKyAgICAgKiBAcmV0dXJuIElmIGEgIndoZXJlIiBjbGF1c2UgaXMgdXNlZCwgdGhlIG51bWJlciBvZiByb3dzIGFmZmVjdGVkIGlzIHJldHVybmVkLCBvdGhlcndpc2UKKyAgICAgKiAwIGlzIHJldHVybmVkLiBUbyBkZWxldGUgYWxsIHJvd3MgYW5kIGdldCBhIHJvdyBjb3VudCwgdXNlICIxIiBhcyB0aGUgd2hlcmUgY2xhdXNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbmNvbWluZyBVUkkgcGF0dGVybiBpcyBpbnZhbGlkLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgZGVsZXRlKFVyaSB1cmksIFN0cmluZyB3aGVyZSwgU3RyaW5nW10gd2hlcmVBcmdzKSB7CisKKyAgICAgICAgLy8gT3BlbnMgdGhlIGRhdGFiYXNlIG9iamVjdCBpbiAid3JpdGUiIG1vZGUuCiAgICAgICAgIFNRTGl0ZURhdGFiYXNlIGRiID0gbU9wZW5IZWxwZXIuZ2V0V3JpdGFibGVEYXRhYmFzZSgpOworCiAgICAgICAgIGludCBjb3VudDsKKworICAgICAgICAvLyBEb2VzIHRoZSBkZWxldGUgYmFzZWQgb24gdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuLgogICAgICAgICBzd2l0Y2ggKHNVcmlNYXRjaGVyLm1hdGNoKHVyaSkpIHsKLSAgICAgICAgY2FzZSBOT1RFUzoKLSAgICAgICAgICAgIGNvdW50ID0gZGIuZGVsZXRlKE5PVEVTX1RBQkxFX05BTUUsIHdoZXJlLCB3aGVyZUFyZ3MpOwotICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBOT1RFX0lEOgotICAgICAgICAgICAgU3RyaW5nIG5vdGVJZCA9IHVyaS5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMSk7Ci0gICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZShOT1RFU19UQUJMRV9OQU1FLCBOb3Rlcy5fSUQgKyAiPSIgKyBub3RlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSA/ICIgQU5EICgiICsgd2hlcmUgKyAnKScgOiAiIiksIHdoZXJlQXJncyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBwYXR0ZXJuIG1hdGNoZXMgdGhlIGdlbmVyYWwgcGF0dGVybiBmb3Igbm90ZXMsIGRvZXMgYSBkZWxldGUKKyAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRoZSBpbmNvbWluZyAid2hlcmUiIGNvbHVtbnMgYW5kIGFyZ3VtZW50cy4KKyAgICAgICAgICAgIGNhc2UgTk9URVM6CisgICAgICAgICAgICAgICAgY291bnQgPSBkYi5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSwgIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lCisgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyB3aGVyZSBjbGF1c2UgY29sdW1uIG5hbWVzCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyB3aGVyZSBjbGF1c2UgdmFsdWVzCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIFVSSSBtYXRjaGVzIGEgc2luZ2xlIG5vdGUgSUQsIGRvZXMgdGhlIGRlbGV0ZSBiYXNlZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBpbmNvbWluZyBkYXRhLCBidXQgbW9kaWZpZXMgdGhlIHdoZXJlIGNsYXVzZSB0byByZXN0cmljdCBpdCB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBwYXJ0aWN1bGFyIG5vdGUgSUQuCisgICAgICAgICAgICBjYXNlIE5PVEVfSUQ6CisgICAgICAgICAgICAgICAgLy8gRnJvbSB0aGUgaW5jb21pbmcgVVJJLCBnZXQgdGhlIG5vdGUgSUQKKyAgICAgICAgICAgICAgICBTdHJpbmcgbm90ZUlkID0gdXJpLmdldFBhdGhTZWdtZW50cygpLmdldChOb3RlUGFkLk5vdGVzLk5PVEVfSURfUEFUSF9QT1NJVElPTik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBubyB3aGVyZSBjbGF1c2Ugd2FzIHBhc3NlZCBpbiwgdXNlcyB0aGUgbm90ZSBJRCBjb2x1bW4gbmFtZQorICAgICAgICAgICAgICAgIC8vIGZvciBhIGNvbHVtbiBhbmQgdGhlIG5vdGUgSUQgZm9yIGEgdmFsdWUuCisgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSkgeworICAgICAgICAgICAgICAgICAgICB3aGVyZSA9IE5vdGVQYWQuTm90ZXMuX0lEICsgIiA9ID8iOworICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3NbMF0gPSBub3RlSWQ7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIElmIHdoZXJlIGNsYXVzZSBjb2x1bW5zIHdlcmUgcGFzc2VkIGluLCBhcHBlbmRzIHRoZSBub3RlIElEIGNvbHVtbiBuYW1lIHRvCisgICAgICAgICAgICAgICAgICAgICAqIHRoZSBsaXN0IG9mIGNvbHVtbnMgdXNpbmcgYSByZXBsYWNlYWJsZSBwYXJhbWV0ZXIuIFRoaXMgd29ya3MgZXZlbiBpZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICogb3RoZXIgY29sdW1ucyBoYXZlIGFjdHVhbCB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRzIHRoZSBub3RlIElEIGNvbHVtbiBuYW1lIGFzIGFuIEFORCBjb25kaXRpb24gdXNpbmcgYSByZXBsYWNlYWJsZQorICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlID0gd2hlcmUgKyAiIEFORCAiICsgTm90ZVBhZC5Ob3Rlcy5fSUQgKyAiID0gPyI7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQXBwZW5kcyB0aGUgbm90ZSBJRCB2YWx1ZSB0byB0aGUgZW5kIG9mIHRoZSB3aGVyZSBjbGF1c2UgdmFsdWVzLgorICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3Nbd2hlcmVBcmdzLmxlbmd0aF0gPSBub3RlSWQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gUGVyZm9ybXMgdGhlIGRlbGV0ZS4KKyAgICAgICAgICAgICAgICBjb3VudCA9IGRiLmRlbGV0ZSgKKyAgICAgICAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5UQUJMRV9OQU1FLCAgLy8gVGhlIGRhdGFiYXNlIHRhYmxlIG5hbWUuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyB3aGVyZSBjbGF1c2UgY29sdW1uIG5hbWVzLgorICAgICAgICAgICAgICAgICAgICB3aGVyZUFyZ3MgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgd2hlcmUgY2xhdXNlIHZhbHVlcy4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgcGF0dGVybiBpcyBpbnZhbGlkLCB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIFVSSSAiICsgdXJpKTsKICAgICAgICAgfQogCisgICAgICAgIC8qR2V0cyBhIGhhbmRsZSB0byB0aGUgY29udGVudCByZXNvbHZlciBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQsIGFuZCBub3RpZmllcyBpdAorICAgICAgICAgKiB0aGF0IHRoZSBpbmNvbWluZyBVUkkgY2hhbmdlZC4gVGhlIG9iamVjdCBwYXNzZXMgdGhpcyBhbG9uZyB0byB0aGUgcmVzb2x2ZXIgZnJhbWV3b3JrLAorICAgICAgICAgKiBhbmQgb2JzZXJ2ZXJzIHRoYXQgaGF2ZSByZWdpc3RlcmVkIHRoZW1zZWx2ZXMgZm9yIHRoZSBwcm92aWRlciBhcmUgbm90aWZpZWQuCisgICAgICAgICAqLwogICAgICAgICBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkubm90aWZ5Q2hhbmdlKHVyaSwgbnVsbCk7CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgZGVsZXRlZC4KICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgY2FsbHMKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciN1cGRhdGUoVXJpLENvbnRlbnRWYWx1ZXMsU3RyaW5nLFN0cmluZ1tdKX0KKyAgICAgKiBVcGRhdGVzIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlLiBUaGUgY29sdW1uIG5hbWVzIHNwZWNpZmllZCBieSB0aGUga2V5cyBpbiB0aGUgdmFsdWVzIG1hcAorICAgICAqIGFyZSB1cGRhdGVkIHdpdGggbmV3IGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSB2YWx1ZXMgaW4gdGhlIG1hcC4gSWYgdGhlIGluY29taW5nIFVSSSBtYXRjaGVzIHRoZQorICAgICAqIG5vdGUgSUQgVVJJIHBhdHRlcm4sIHRoZW4gdGhlIG1ldGhvZCB1cGRhdGVzIHRoZSBvbmUgcmVjb3JkIHNwZWNpZmllZCBieSB0aGUgSUQgaW4gdGhlIFVSSTsKKyAgICAgKiBvdGhlcndpc2UsIGl0IHVwZGF0ZXMgYSBzZXQgb2YgcmVjb3Jkcy4gVGhlIHJlY29yZCBvciByZWNvcmRzIG11c3QgbWF0Y2ggdGhlIGlucHV0CisgICAgICogc2VsZWN0aW9uIGNyaXRlcmlhIHNwZWNpZmllZCBieSB3aGVyZSBhbmQgd2hlcmVBcmdzLgorICAgICAqIElmIHJvd3Mgd2VyZSB1cGRhdGVkLCB0aGVuIGxpc3RlbmVycyBhcmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBwYXR0ZXJuIHRvIG1hdGNoIGFuZCB1cGRhdGUuCisgICAgICogQHBhcmFtIHZhbHVlcyBBIG1hcCBvZiBjb2x1bW4gbmFtZXMgKGtleXMpIGFuZCBuZXcgdmFsdWVzICh2YWx1ZXMpLgorICAgICAqIEBwYXJhbSB3aGVyZSBBbiBTUUwgIldIRVJFIiBjbGF1c2UgdGhhdCBzZWxlY3RzIHJlY29yZHMgYmFzZWQgb24gdGhlaXIgY29sdW1uIHZhbHVlcy4gSWYgdGhpcworICAgICAqIGlzIG51bGwsIHRoZW4gYWxsIHJlY29yZHMgdGhhdCBtYXRjaCB0aGUgVVJJIHBhdHRlcm4gYXJlIHNlbGVjdGVkLgorICAgICAqIEBwYXJhbSB3aGVyZUFyZ3MgQW4gYXJyYXkgb2Ygc2VsZWN0aW9uIGNyaXRlcmlhLiBJZiB0aGUgIndoZXJlIiBwYXJhbSBjb250YWlucyB2YWx1ZQorICAgICAqIHBsYWNlaG9sZGVycyAoIj8iKSwgdGhlbiBlYWNoIHBsYWNlaG9sZGVyIGlzIHJlcGxhY2VkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgaW4gdGhlCisgICAgICogYXJyYXkuCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvd3MgdXBkYXRlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5jb21pbmcgVVJJIHBhdHRlcm4gaXMgaW52YWxpZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IHVwZGF0ZShVcmkgdXJpLCBDb250ZW50VmFsdWVzIHZhbHVlcywgU3RyaW5nIHdoZXJlLCBTdHJpbmdbXSB3aGVyZUFyZ3MpIHsKKworICAgICAgICAvLyBPcGVucyB0aGUgZGF0YWJhc2Ugb2JqZWN0IGluICJ3cml0ZSIgbW9kZS4KICAgICAgICAgU1FMaXRlRGF0YWJhc2UgZGIgPSBtT3BlbkhlbHBlci5nZXRXcml0YWJsZURhdGFiYXNlKCk7CiAgICAgICAgIGludCBjb3VudDsKKworICAgICAgICAvLyBEb2VzIHRoZSB1cGRhdGUgYmFzZWQgb24gdGhlIGluY29taW5nIFVSSSBwYXR0ZXJuCiAgICAgICAgIHN3aXRjaCAoc1VyaU1hdGNoZXIubWF0Y2godXJpKSkgewotICAgICAgICBjYXNlIE5PVEVTOgotICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoTk9URVNfVEFCTEVfTkFNRSwgdmFsdWVzLCB3aGVyZSwgd2hlcmVBcmdzKTsKLSAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGNhc2UgTk9URV9JRDoKLSAgICAgICAgICAgIFN0cmluZyBub3RlSWQgPSB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDEpOwotICAgICAgICAgICAgY291bnQgPSBkYi51cGRhdGUoTk9URVNfVEFCTEVfTkFNRSwgdmFsdWVzLCBOb3Rlcy5fSUQgKyAiPSIgKyBub3RlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAoIVRleHRVdGlscy5pc0VtcHR5KHdoZXJlKSA/ICIgQU5EICgiICsgd2hlcmUgKyAnKScgOiAiIiksIHdoZXJlQXJncyk7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbmNvbWluZyBVUkkgbWF0Y2hlcyB0aGUgZ2VuZXJhbCBub3RlcyBwYXR0ZXJuLCBkb2VzIHRoZSB1cGRhdGUgYmFzZWQgb24KKyAgICAgICAgICAgIC8vIHRoZSBpbmNvbWluZyBkYXRhLgorICAgICAgICAgICAgY2FzZSBOT1RFUzoKIAotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CisgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgdXBkYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsICAgICAgICAgICAgICAgICAgIC8vIEEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgbmV3IHZhbHVlcyB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gdmFsdWVzIHRvIHNlbGVjdCBvbi4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBJZiB0aGUgaW5jb21pbmcgVVJJIG1hdGNoZXMgYSBzaW5nbGUgbm90ZSBJRCwgZG9lcyB0aGUgdXBkYXRlIGJhc2VkIG9uIHRoZSBpbmNvbWluZworICAgICAgICAgICAgLy8gZGF0YSwgYnV0IG1vZGlmaWVzIHRoZSB3aGVyZSBjbGF1c2UgdG8gcmVzdHJpY3QgaXQgdG8gdGhlIHBhcnRpY3VsYXIgbm90ZSBJRC4KKyAgICAgICAgICAgIGNhc2UgTk9URV9JRDoKKyAgICAgICAgICAgICAgICAvLyBGcm9tIHRoZSBpbmNvbWluZyBVUkksIGdldCB0aGUgbm90ZSBJRAorICAgICAgICAgICAgICAgIFN0cmluZyBub3RlSWQgPSB1cmkuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KE5vdGVQYWQuTm90ZXMuTk9URV9JRF9QQVRIX1BPU0lUSU9OKTsKKworICAgICAgICAgICAgICAgIC8vIElmIG5vIHdoZXJlIGNsYXVzZSB3YXMgcGFzc2VkIGluLCB1c2VzIHRoZSBub3RlIElEIGNvbHVtbiBuYW1lCisgICAgICAgICAgICAgICAgLy8gZm9yIGEgY29sdW1uIGFuZCB0aGUgbm90ZSBJRCBmb3IgYSB2YWx1ZS4KKyAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkod2hlcmUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdoZXJlID0gTm90ZVBhZC5Ob3Rlcy5fSUQgKyAiID0gPyI7CisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJnc1swXSA9IG5vdGVJZDsKKworICAgICAgICAgICAgICAgICAgICAvLyBJZiB3aGVyZSBjbGF1c2UgY29sdW1ucyB3ZXJlIHBhc3NlZCBpbiwgYXBwZW5kcyB0aGUgbm90ZSBJRCB0byB0aGUgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhdXNlCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiBBcHBlbmRzIHRoZSBub3RlIElEIGNvbHVtbiBuYW1lIHRvIHRoZSBsaXN0IG9mIGNvbHVtbnMsIHdpdGggYSByZXBsYWNlYWJsZQorICAgICAgICAgICAgICAgICAgICAgKiBwYXJhbWV0ZXIuIFRoaXMgd2lsbCB3b3JrIGV2ZW4gaWYgdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMgaGF2ZSBiZWVuIHNldCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAqIGFjdHVhbCB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRzIHRoZSBub3RlIElEIGNvbHVtbiBuYW1lIGFzIGFuIEFORCBjb25kaXRpb24gd2l0aCBhIHJlcGxhY2VhYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlci4KKyAgICAgICAgICAgICAgICAgICAgd2hlcmUgPSB3aGVyZSArICIgQU5EICIgKyBOb3RlUGFkLk5vdGVzLl9JRCArICIgPSA/IjsKKworICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmRzIHRoZSBub3RlIElEIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIHdoZXJlIGNsYXVzZSB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJnc1t3aGVyZUFyZ3MubGVuZ3RoXSA9IG5vdGVJZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEb2VzIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgLy8gRG9lcyB0aGUgdXBkYXRlIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93cyB1cGRhdGVkLgorICAgICAgICAgICAgICAgIGNvdW50ID0gZGIudXBkYXRlKAorICAgICAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRBQkxFX05BTUUsIC8vIFRoZSBkYXRhYmFzZSB0YWJsZSBuYW1lLgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMsICAgICAgICAgICAgICAgICAgIC8vIEEgbWFwIG9mIGNvbHVtbiBuYW1lcyBhbmQgbmV3IHZhbHVlcyB0byB1c2UuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlLCAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIHdoZXJlQXJncyAgICAgICAgICAgICAgICAgLy8gVGhlIHdoZXJlIGNsYXVzZSBjb2x1bW4gdmFsdWVzIHRvIHNlbGVjdCBvbi4KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgLy8gSWYgdGhlIGluY29taW5nIHBhdHRlcm4gaXMgaW52YWxpZCwgdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBVUkkgIiArIHVyaSk7CiAgICAgICAgIH0KIAorICAgICAgICAvKkdldHMgYSBoYW5kbGUgdG8gdGhlIGNvbnRlbnQgcmVzb2x2ZXIgb2JqZWN0IGZvciB0aGUgY3VycmVudCBjb250ZXh0LCBhbmQgbm90aWZpZXMgaXQKKyAgICAgICAgICogdGhhdCB0aGUgaW5jb21pbmcgVVJJIGNoYW5nZWQuIFRoZSBvYmplY3QgcGFzc2VzIHRoaXMgYWxvbmcgdG8gdGhlIHJlc29sdmVyIGZyYW1ld29yaywKKyAgICAgICAgICogYW5kIG9ic2VydmVycyB0aGF0IGhhdmUgcmVnaXN0ZXJlZCB0aGVtc2VsdmVzIGZvciB0aGUgcHJvdmlkZXIgYXJlIG5vdGlmaWVkLgorICAgICAgICAgKi8KICAgICAgICAgZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm5vdGlmeUNoYW5nZSh1cmksIG51bGwpOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIHVwZGF0ZWQuCiAgICAgICAgIHJldHVybiBjb3VudDsKICAgICB9CiAKLSAgICBzdGF0aWMgewotICAgICAgICBzVXJpTWF0Y2hlciA9IG5ldyBVcmlNYXRjaGVyKFVyaU1hdGNoZXIuTk9fTUFUQ0gpOwotICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJub3RlcyIsIE5PVEVTKTsKLSAgICAgICAgc1VyaU1hdGNoZXIuYWRkVVJJKE5vdGVQYWQuQVVUSE9SSVRZLCAibm90ZXMvIyIsIE5PVEVfSUQpOwotICAgICAgICBzVXJpTWF0Y2hlci5hZGRVUkkoTm90ZVBhZC5BVVRIT1JJVFksICJsaXZlX2ZvbGRlcnMvbm90ZXMiLCBMSVZFX0ZPTERFUl9OT1RFUyk7Ci0KLSAgICAgICAgc05vdGVzUHJvamVjdGlvbk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3Rlcy5fSUQsIE5vdGVzLl9JRCk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVzLlRJVExFLCBOb3Rlcy5USVRMRSk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVzLk5PVEUsIE5vdGVzLk5PVEUpOwotICAgICAgICBzTm90ZXNQcm9qZWN0aW9uTWFwLnB1dChOb3Rlcy5DUkVBVEVEX0RBVEUsIE5vdGVzLkNSRUFURURfREFURSk7Ci0gICAgICAgIHNOb3Rlc1Byb2plY3Rpb25NYXAucHV0KE5vdGVzLk1PRElGSUVEX0RBVEUsIE5vdGVzLk1PRElGSUVEX0RBVEUpOwotCi0gICAgICAgIC8vIFN1cHBvcnQgZm9yIExpdmUgRm9sZGVycy4KLSAgICAgICAgc0xpdmVGb2xkZXJQcm9qZWN0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7Ci0gICAgICAgIHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcC5wdXQoTGl2ZUZvbGRlcnMuX0lELCBOb3Rlcy5fSUQgKyAiIEFTICIgKwotICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLl9JRCk7Ci0gICAgICAgIHNMaXZlRm9sZGVyUHJvamVjdGlvbk1hcC5wdXQoTGl2ZUZvbGRlcnMuTkFNRSwgTm90ZXMuVElUTEUgKyAiIEFTICIgKwotICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLk5BTUUpOwotICAgICAgICAvLyBBZGQgbW9yZSBjb2x1bW5zIGhlcmUgZm9yIG1vcmUgcm9idXN0IExpdmUgRm9sZGVycy4KKyAgICAvKioKKyAgICAgKiBBIHRlc3QgcGFja2FnZSBjYW4gY2FsbCB0aGlzIHRvIGdldCBhIGhhbmRsZSB0byB0aGUgZGF0YWJhc2UgdW5kZXJseWluZyBOb3RlUGFkUHJvdmlkZXIsCisgICAgICogc28gaXQgY2FuIGluc2VydCB0ZXN0IGRhdGEgaW50byB0aGUgZGF0YWJhc2UuIFRoZSB0ZXN0IGNhc2UgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaW5zdGFudGlhdGluZyB0aGUgcHJvdmlkZXIgaW4gYSB0ZXN0IGNvbnRleHQ7IHtAbGluayBhbmRyb2lkLnRlc3QuUHJvdmlkZXJUZXN0Q2FzZTJ9IGRvZXMKKyAgICAgKiB0aGlzIGR1cmluZyB0aGUgY2FsbCB0byBzZXRVcCgpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBkYXRhYmFzZSBoZWxwZXIgb2JqZWN0IGZvciB0aGUgcHJvdmlkZXIncyBkYXRhLgorICAgICAqLworICAgIERhdGFiYXNlSGVscGVyIGdldE9wZW5IZWxwZXJGb3JUZXN0KCkgeworICAgICAgICByZXR1cm4gbU9wZW5IZWxwZXI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXN0LmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQppbmRleCBjZWFhYTNjLi4zOWJlODFjIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpc3QuamF2YQpAQCAtMTYsMTEgKzE2LDE0IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQuTm90ZXM7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5MaXN0QWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBib2FyZE1hbmFnZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNsaXBwZWREYXRhOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50VXJpczsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwogaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOwogaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKQEAgLTM3LDc5ICs0MCwyMDkgQEAKIAogLyoqCiAgKiBEaXNwbGF5cyBhIGxpc3Qgb2Ygbm90ZXMuIFdpbGwgZGlzcGxheSBub3RlcyBmcm9tIHRoZSB7QGxpbmsgVXJpfQotICogcHJvdmlkZWQgaW4gdGhlIGludGVudCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSBkZWZhdWx0cyB0byBkaXNwbGF5aW5nIHRoZQotICogY29udGVudHMgb2YgdGhlIHtAbGluayBOb3RlUGFkUHJvdmlkZXJ9CisgKiBwcm92aWRlZCBpbiB0aGUgaW5jb21pbmcgSW50ZW50IGlmIHRoZXJlIGlzIG9uZSwgb3RoZXJ3aXNlIGl0IGRlZmF1bHRzIHRvIGRpc3BsYXlpbmcgdGhlCisgKiBjb250ZW50cyBvZiB0aGUge0BsaW5rIE5vdGVQYWRQcm92aWRlcn0uCisgKgorICogTk9URTogTm90aWNlIHRoYXQgdGhlIHByb3ZpZGVyIG9wZXJhdGlvbnMgaW4gdGhpcyBBY3Rpdml0eSBhcmUgdGFraW5nIHBsYWNlIG9uIHRoZSBVSSB0aHJlYWQuCisgKiBUaGlzIGlzIG5vdCBhIGdvb2QgcHJhY3RpY2UuIEl0IGlzIG9ubHkgZG9uZSBoZXJlIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4gQSByZWFsCisgKiBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyfSBvcgorICoge0BsaW5rIGFuZHJvaWQub3MuQXN5bmNUYXNrfSBvYmplY3QgdG8gcGVyZm9ybSBvcGVyYXRpb25zIGFzeW5jaHJvbm91c2x5IG9uIGEgc2VwYXJhdGUgdGhyZWFkLgogICovCiBwdWJsaWMgY2xhc3MgTm90ZXNMaXN0IGV4dGVuZHMgTGlzdEFjdGl2aXR5IHsKKworICAgIC8vIEZvciBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk5vdGVzTGlzdCI7CiAKICAgICAvLyBNZW51IGl0ZW0gaWRzCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX0RFTEVURSA9IE1lbnUuRklSU1Q7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX0lOU0VSVCA9IE1lbnUuRklSU1QgKyAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTlVfSVRFTV9DT1BZID0gTWVudS5GSVJTVCArIDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVOVV9JVEVNX0lOU0VSVCA9IE1lbnUuRklSU1QgKyAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FTlVfSVRFTV9QQVNURSA9IE1lbnUuRklSU1QgKyAzOwogCiAgICAgLyoqCi0gICAgICogVGhlIGNvbHVtbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4gZnJvbSB0aGUgZGF0YWJhc2UKKyAgICAgKiBUaGUgY29sdW1ucyBuZWVkZWQgYnkgdGhlIGN1cnNvciBhZGFwdGVyCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7Ci0gICAgICAgICAgICBOb3Rlcy5fSUQsIC8vIDAKLSAgICAgICAgICAgIE5vdGVzLlRJVExFLCAvLyAxCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgLy8gMAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgLy8gMQogICAgIH07CiAKICAgICAvKiogVGhlIGluZGV4IG9mIHRoZSB0aXRsZSBjb2x1bW4gKi8KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lOREVYX1RJVExFID0gMTsKLSAgICAKKworICAgIHByaXZhdGUgTWVudUl0ZW0gbVBhc3RlSXRlbTsKKworICAgIC8qKgorICAgICAqIG9uQ3JlYXRlIGlzIGNhbGxlZCB3aGVuIEFuZHJvaWQgc3RhcnRzIHRoaXMgQWN0aXZpdHkgZnJvbSBzY3JhdGNoLgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKIAorICAgICAgICAvLyBUaGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIGhvbGQgZG93biB0aGUga2V5IHRvIHVzZSBtZW51IHNob3J0Y3V0cy4KICAgICAgICAgc2V0RGVmYXVsdEtleU1vZGUoREVGQVVMVF9LRVlTX1NIT1JUQ1VUKTsKIAotICAgICAgICAvLyBJZiBubyBkYXRhIHdhcyBnaXZlbiBpbiB0aGUgaW50ZW50IChiZWNhdXNlIHdlIHdlcmUgc3RhcnRlZAotICAgICAgICAvLyBhcyBhIE1BSU4gYWN0aXZpdHkpLCB0aGVuIHVzZSBvdXIgZGVmYXVsdCBjb250ZW50IHByb3ZpZGVyLgorICAgICAgICAvKiBJZiBubyBkYXRhIGlzIGdpdmVuIGluIHRoZSBJbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgQWN0aXZpdHksIHRoZW4gdGhpcyBBY3Rpdml0eQorICAgICAgICAgKiB3YXMgc3RhcnRlZCB3aGVuIHRoZSBpbnRlbnQgZmlsdGVyIG1hdGNoZWQgYSBNQUlOIGFjdGlvbi4gV2Ugc2hvdWxkIHVzZSB0aGUgZGVmYXVsdAorICAgICAgICAgKiBwcm92aWRlciBVUkkuCisgICAgICAgICAqLworICAgICAgICAvLyBHZXRzIHRoZSBpbnRlbnQgdGhhdCBzdGFydGVkIHRoaXMgQWN0aXZpdHkuCiAgICAgICAgIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKKworICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgSW50ZW50LCBzZXRzIHRoZSBkYXRhIHRvIHRoZSBkZWZhdWx0IFVSSSwgd2hpY2gKKyAgICAgICAgLy8gYWNjZXNzZXMgYSBsaXN0IG9mIG5vdGVzLgogICAgICAgICBpZiAoaW50ZW50LmdldERhdGEoKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShOb3Rlcy5DT05URU5UX1VSSSk7CisgICAgICAgICAgICBpbnRlbnQuc2V0RGF0YShOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJKTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIEluZm9ybSB0aGUgbGlzdCB3ZSBwcm92aWRlIGNvbnRleHQgbWVudXMgZm9yIGl0ZW1zCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHMgdGhlIGNhbGxiYWNrIGZvciBjb250ZXh0IG1lbnUgYWN0aXZhdGlvbiBmb3IgdGhlIExpc3RWaWV3LiBUaGUgbGlzdGVuZXIgaXMgc2V0CisgICAgICAgICAqIHRvIGJlIHRoaXMgQWN0aXZpdHkuIFRoZSBlZmZlY3QgaXMgdGhhdCBjb250ZXh0IG1lbnVzIGFyZSBlbmFibGVkIGZvciBpdGVtcyBpbiB0aGUKKyAgICAgICAgICogTGlzdFZpZXcsIGFuZCB0aGUgY29udGV4dCBtZW51IGlzIGhhbmRsZWQgYnkgYSBtZXRob2QgaW4gTm90ZXNMaXN0LgorICAgICAgICAgKi8KICAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRPbkNyZWF0ZUNvbnRleHRNZW51TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIAotICAgICAgICAvLyBQZXJmb3JtIGEgbWFuYWdlZCBxdWVyeS4gVGhlIEFjdGl2aXR5IHdpbGwgaGFuZGxlIGNsb3NpbmcgYW5kIHJlcXVlcnlpbmcgdGhlIGN1cnNvcgotICAgICAgICAvLyB3aGVuIG5lZWRlZC4KLSAgICAgICAgQ3Vyc29yIGN1cnNvciA9IG1hbmFnZWRRdWVyeShnZXRJbnRlbnQoKS5nZXREYXRhKCksIFBST0pFQ1RJT04sIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgTm90ZXMuREVGQVVMVF9TT1JUX09SREVSKTsKIAotICAgICAgICAvLyBVc2VkIHRvIG1hcCBub3RlcyBlbnRyaWVzIGZyb20gdGhlIGRhdGFiYXNlIHRvIHZpZXdzCi0gICAgICAgIFNpbXBsZUN1cnNvckFkYXB0ZXIgYWRhcHRlciA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKHRoaXMsIFIubGF5b3V0Lm5vdGVzbGlzdF9pdGVtLCBjdXJzb3IsCi0gICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgTm90ZXMuVElUTEUgfSwgbmV3IGludFtdIHsgYW5kcm9pZC5SLmlkLnRleHQxIH0pOworICAgICAgICAvKiBQZXJmb3JtcyBhIG1hbmFnZWQgcXVlcnkuIFRoZSBBY3Rpdml0eSBoYW5kbGVzIGNsb3NpbmcgYW5kIHJlcXVlcnlpbmcgdGhlIGN1cnNvcgorICAgICAgICAgKiB3aGVuIG5lZWRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogUGxlYXNlIHNlZSB0aGUgaW50cm9kdWN0b3J5IG5vdGUgYWJvdXQgcGVyZm9ybWluZyBwcm92aWRlciBvcGVyYXRpb25zIG9uIHRoZSBVSSB0aHJlYWQuCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgY3Vyc29yID0gbWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCAgICAgICAgICAgIC8vIFVzZSB0aGUgZGVmYXVsdCBjb250ZW50IFVSSSBmb3IgdGhlIHByb3ZpZGVyLgorICAgICAgICAgICAgUFJPSkVDVElPTiwgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgbm90ZSBJRCBhbmQgdGl0bGUgZm9yIGVhY2ggbm90ZS4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB3aGVyZSBjbGF1c2UsIHJldHVybiBhbGwgcmVjb3Jkcy4KKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyB3aGVyZSBjbGF1c2UsIHRoZXJlZm9yZSBubyB3aGVyZSBjb2x1bW4gdmFsdWVzLgorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5ERUZBVUxUX1NPUlRfT1JERVIgIC8vIFVzZSB0aGUgZGVmYXVsdCBzb3J0IG9yZGVyLgorICAgICAgICApOworCisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGFycmF5cyBjcmVhdGUgYSAibWFwIiBiZXR3ZWVuIGNvbHVtbnMgaW4gdGhlIGN1cnNvciBhbmQgdmlldyBJRHMKKyAgICAgICAgICogZm9yIGl0ZW1zIGluIHRoZSBMaXN0Vmlldy4gRWFjaCBlbGVtZW50IGluIHRoZSBkYXRhQ29sdW1ucyBhcnJheSByZXByZXNlbnRzCisgICAgICAgICAqIGEgY29sdW1uIG5hbWU7IGVhY2ggZWxlbWVudCBpbiB0aGUgdmlld0lEIGFycmF5IHJlcHJlc2VudHMgdGhlIElEIG9mIGEgVmlldy4KKyAgICAgICAgICogVGhlIFNpbXBsZUN1cnNvckFkYXB0ZXIgbWFwcyB0aGVtIGluIGFzY2VuZGluZyBvcmRlciB0byBkZXRlcm1pbmUgd2hlcmUgZWFjaCBjb2x1bW4KKyAgICAgICAgICogdmFsdWUgd2lsbCBhcHBlYXIgaW4gdGhlIExpc3RWaWV3LgorICAgICAgICAgKi8KKworICAgICAgICAvLyBUaGUgbmFtZXMgb2YgdGhlIGN1cnNvciBjb2x1bW5zIHRvIGRpc3BsYXkgaW4gdGhlIHZpZXcsIGluaXRpYWxpemVkIHRvIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgU3RyaW5nW10gZGF0YUNvbHVtbnMgPSB7IE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUgfSA7CisKKyAgICAgICAgLy8gVGhlIHZpZXcgSURzIHRoYXQgd2lsbCBkaXNwbGF5IHRoZSBjdXJzb3IgY29sdW1ucywgaW5pdGlhbGl6ZWQgdG8gdGhlIFRleHRWaWV3IGluCisgICAgICAgIC8vIG5vdGVzbGlzdF9pdGVtLnhtbAorICAgICAgICBpbnRbXSB2aWV3SURzID0geyBhbmRyb2lkLlIuaWQudGV4dDEgfTsKKworICAgICAgICAvLyBDcmVhdGVzIHRoZSBiYWNraW5nIGFkYXB0ZXIgZm9yIHRoZSBMaXN0Vmlldy4KKyAgICAgICAgU2ltcGxlQ3Vyc29yQWRhcHRlciBhZGFwdGVyCisgICAgICAgICAgICA9IG5ldyBTaW1wbGVDdXJzb3JBZGFwdGVyKAorICAgICAgICAgICAgICAgICAgICAgIHRoaXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgQ29udGV4dCBmb3IgdGhlIExpc3RWaWV3CisgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubm90ZXNsaXN0X2l0ZW0sICAgICAgICAgIC8vIFBvaW50cyB0byB0aGUgWE1MIGZvciBhIGxpc3QgaXRlbQorICAgICAgICAgICAgICAgICAgICAgIGN1cnNvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY3Vyc29yIHRvIGdldCBpdGVtcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUNvbHVtbnMsCisgICAgICAgICAgICAgICAgICAgICAgdmlld0lEcworICAgICAgICAgICAgICApOworCisgICAgICAgIC8vIFNldHMgdGhlIExpc3RWaWV3J3MgYWRhcHRlciB0byBiZSB0aGUgY3Vyc29yIGFkYXB0ZXIgdGhhdCB3YXMganVzdCBjcmVhdGVkLgogICAgICAgICBzZXRMaXN0QWRhcHRlcihhZGFwdGVyKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIGRldmljZSdzIE1lbnUgYnV0dG9uIHRoZSBmaXJzdCB0aW1lIGZvcgorICAgICAqIHRoaXMgQWN0aXZpdHkuIEFuZHJvaWQgcGFzc2VzIGluIGEgTWVudSBvYmplY3QgdGhhdCBpcyBwb3B1bGF0ZWQgd2l0aCBpdGVtcy4KKyAgICAgKgorICAgICAqIFNldHMgdXAgYSBtZW51IHRoYXQgcHJvdmlkZXMgdGhlIEluc2VydCBvcHRpb24gcGx1cyBhIGxpc3Qgb2YgYWx0ZXJuYXRpdmUgYWN0aW9ucyBmb3IKKyAgICAgKiB0aGlzIEFjdGl2aXR5LiBPdGhlciBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIGhhbmRsZSBub3RlcyBjYW4gInJlZ2lzdGVyIiB0aGVtc2VsdmVzIGluCisgICAgICogQW5kcm9pZCBieSBwcm92aWRpbmcgYW4gaW50ZW50IGZpbHRlciB0aGF0IGluY2x1ZGVzIHRoZSBjYXRlZ29yeSBBTFRFUk5BVElWRSBhbmQgdGhlCisgICAgICogbWltZVRZcGUgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1RZUEUuIElmIHRoZXkgZG8gdGhpcywgdGhlIGNvZGUgaW4gb25DcmVhdGVPcHRpb25zTWVudSgpCisgICAgICogd2lsbCBhZGQgdGhlIEFjdGl2aXR5IHRoYXQgY29udGFpbnMgdGhlIGludGVudCBmaWx0ZXIgdG8gaXRzIGxpc3Qgb2Ygb3B0aW9ucy4gSW4gZWZmZWN0LAorICAgICAqIHRoZSBtZW51IHdpbGwgb2ZmZXIgdGhlIHVzZXIgb3RoZXIgYXBwbGljYXRpb25zIHRoYXQgY2FuIGhhbmRsZSBub3Rlcy4KKyAgICAgKiBAcGFyYW0gbWVudSBBIE1lbnUgb2JqZWN0LCB0byB3aGljaCBtZW51IGl0ZW1zIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKiBAcmV0dXJuIFRydWUsIGFsd2F5cy4gVGhlIG1lbnUgc2hvdWxkIGJlIGRpc3BsYXllZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbkNyZWF0ZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgeworCisgICAgICAgIC8vIFRoZSBwYXJlbnQgbWV0aG9kIGNyZWF0ZXMgdGhlIGRlZmF1bHQgbWV0aG9kIHdpdGggdGhlIHN0YW5kYXJkIHN5c3RlbSBpdGVtcy4KICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKIAotICAgICAgICAvLyBUaGlzIGlzIG91ciBvbmUgc3RhbmRhcmQgYXBwbGljYXRpb24gYWN0aW9uIC0tIGluc2VydGluZyBhCi0gICAgICAgIC8vIG5ldyBub3RlIGludG8gdGhlIGxpc3QuCi0gICAgICAgIG1lbnUuYWRkKDAsIE1FTlVfSVRFTV9JTlNFUlQsIDAsIFIuc3RyaW5nLm1lbnVfaW5zZXJ0KQotICAgICAgICAgICAgICAgIC5zZXRTaG9ydGN1dCgnMycsICdhJykKLSAgICAgICAgICAgICAgICAuc2V0SWNvbihhbmRyb2lkLlIuZHJhd2FibGUuaWNfbWVudV9hZGQpOworICAgICAgICAvLyBBZGRzIGFuIEluc2VydCBtZW51IGl0ZW0KKyAgICAgICAgTWVudUl0ZW0gbWVudUl0ZW0gPSBtZW51LmFkZCgKKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1lbnUgZ3JvdXAuCisgICAgICAgICAgICBNRU5VX0lURU1fSU5TRVJULCAgICAgICAgICAgICAvLyBVbmlxdWUgSUQgZm9yIHRoaXMgaXRlbS4KKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgIC8vIE5vIG9yZGVyIHdpdGhpbiB0aGUgZ3JvdXAuCisgICAgICAgICAgICBSLnN0cmluZy5tZW51X2luc2VydCAgICAgICAgICAvLyBEaXNwbGF5ZWQgdGV4dCBmb3IgdGhlIG1lbnUgaXRlbS4KKyAgICAgICAgKTsKIAotICAgICAgICAvLyBHZW5lcmF0ZSBhbnkgYWRkaXRpb25hbCBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiB0aGUKKyAgICAgICAgLy8gU2V0cyBrZXlib2FyZCBzaG9ydGN1dHMgZm9yIHRoZSBtZW51IGl0ZW0sIGVpdGhlciAiMyIgb3IgImEiOworICAgICAgICBtZW51SXRlbS5zZXRTaG9ydGN1dCgnMycsICdhJyk7CisKKyAgICAgICAgLy8gU2V0cyB0aGUgaWNvbiBmb3IgdGhlIG1lbnUgaXRlbQorICAgICAgICBtZW51SXRlbS5zZXRJY29uKGFuZHJvaWQuUi5kcmF3YWJsZS5pY19tZW51X2FkZCk7CisKKyAgICAgICAgLy8gSWYgdGhlcmUgaXMgY3VycmVudGx5IGRhdGEgaW4gdGhlIGNsaXBib2FyZCwgdGhpcyBhZGRzIGEgUEFTVEUgbWVudSBpdGVtIHRvIHRoZSBtZW51CisgICAgICAgIC8vIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHBhc3RlIGluIHRoZSBkYXRhLgorICAgICAgICBtUGFzdGVJdGVtID0gbWVudS5hZGQoCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAvLyBObyBtZW51IGdyb3VwLgorICAgICAgICAgICAgICAgIE1FTlVfSVRFTV9QQVNURSwgICAgICAgICAgLy8gQSB1bmlxdWUgSUQgZm9yIHRoaXMgaXRlbQorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgLy8gTm8gbWVudSBvcmRlcgorICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1lbnVfcGFzdGUgICAgICAgLy8gVGhlIGRpc3BsYXllZCB0ZXh0CisgICAgICAgICkuc2V0U2hvcnRjdXQoJzQnLCAncCcpOyAgICAgICAgICAvLyBTZXQgdGhlIGtleWJvYXJkIHNob3J0Y3V0cyBmb3IgdGhpcyBuZXcgaXRlbS4KKworICAgICAgICAvLyBHZW5lcmF0ZXMgYW55IGFkZGl0aW9uYWwgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlCiAgICAgICAgIC8vIG92ZXJhbGwgbGlzdC4gIEluIGEgbm9ybWFsIGluc3RhbGwsIHRoZXJlIGFyZSBubyBhZGRpdGlvbmFsCiAgICAgICAgIC8vIGFjdGlvbnMgZm91bmQgaGVyZSwgYnV0IHRoaXMgYWxsb3dzIG90aGVyIGFwcGxpY2F0aW9ucyB0byBleHRlbmQKICAgICAgICAgLy8gb3VyIG1lbnUgd2l0aCB0aGVpciBvd24gYWN0aW9ucy4KKworICAgICAgICAvKiBDcmVhdGVzIGEgbmV3IEludGVudCB3aXRoIHRoZSBzYW1lIGluY29taW5nIGRhdGEgYW5kIG5vIGRlZmluZWQgYWN0aW9uLgorICAgICAgICAgKiBJdCBhbHNvIHNldHMgaXRzIGNhdGVnb3J5IHRvIEFMVEVSTkFUSVZFLiBUaGlzIHByZXBhcmVzIHRoZSBJbnRlbnQgYXMgYSBwbGFjZQorICAgICAgICAgKiB0byBncm91cCBhbHRlcm5hdGl2ZSBvcHRpb25zIGluIHRoZSBtZW51LgorICAgICAgICAgKi8KICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobnVsbCwgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKTsKICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KEludGVudC5DQVRFR09SWV9BTFRFUk5BVElWRSk7Ci0gICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucyhNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAwLCAwLAotICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnROYW1lKHRoaXMsIE5vdGVzTGlzdC5jbGFzcyksIG51bGwsIGludGVudCwgMCwgbnVsbCk7CiAKKyAgICAgICAgLyogQ3JlYXRlcyBhIENvbXBvbmVudE5hbWUgZnJvbSB0aGUgY3VycmVudCBDb250ZXh0IGFuZCB0aGlzIEFjdGl2aXR5IG9iamVjdCdzCisgICAgICAgICAqIGNsYXNzIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE5hbWUgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudE5hbWUodGhpcywgTm90ZXNMaXN0LmNsYXNzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGRzIGFueSBvdGhlciBhY3Rpdml0aWVzIHRoYXQgd2FudCB0byBiZSBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgdmlldy4gSW4gZWZmZWN0LAorICAgICAgICAgKiBhbnkgYXBwbGljYXRpb24gY2FuIGFkZCBpdHNlbGYgYXMgYW4gYWx0ZXJuYXRpdmUgb24gdGhlIG9wdGlvbnMgbWVudS4KKyAgICAgICAgICovCisgICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucygKKyAgICAgICAgICAgIE1lbnUuQ0FURUdPUllfQUxURVJOQVRJVkUsICAgLy8gQWRkIHRoZSBvcHRpb25zIHRvIHRoZSBBbHRlcm5hdGl2ZXMgZ3JvdXAKKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBhIHVuaXF1ZSBJRAorICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIG9yZGVyIHRoZSBvcHRpb25zCisgICAgICAgICAgICBjb21wb25lbnQsICAgICAgICAgICAgICAgICAgIC8vIFRoZSBDb21wb25lbnROYW1lIG9mIHRoZSBBY3Rpdml0eSBtYWtpbmcgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgQWN0aXZpdHkgaXMgZXhjbHVkZWQgZnJvbSB0aGUgbGlzdCBvZiBhbHRlcm5hdGl2ZXMuCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHNwZWNpZmljIGl0ZW1zIGFyZSBsaXN0ZWQgZmlyc3QuCisgICAgICAgICAgICBpbnRlbnQsICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBJbnRlbnQgdG8gcmVzb2x2ZSB0bywgaW4gZWZmZWN0LCBhbiBJbnRlbnQgbGlzdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgICAgIC8vIG5vIGZsYWdzIGFyZSBuZWVkZWQKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugbm8gc3BlY2lmaWNzIHdlcmUgdXNlZCwgc28gYSBtZW51IGl0ZW0gYXJyYXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IG5lZWRlZC4KKyAgICAgICAgKTsKKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgc28gdGhhdCB0aGUgbWVudSBpcyBkaXNwbGF5ZWQuCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uUHJlcGFyZU9wdGlvbnNNZW51KE1lbnUgbWVudSkgewogICAgICAgICBzdXBlci5vblByZXBhcmVPcHRpb25zTWVudShtZW51KTsKKworICAgICAgICAvLyBUaGUgcGFzdGUgbWVudSBpdGVtIGlzIGVuYWJsZWQgaWYgdGhlcmUgaXMgZGF0YSBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKQorICAgICAgICAgICAgICAgIGdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DTElQQk9BUkRfU0VSVklDRSk7CisKKyAgICAgICAgLy8gSWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhbiBpdGVtLCBlbmFibGVzIHRoZSBQYXN0ZSBvcHRpb24gb24gdGhlIG1lbnUuCisgICAgICAgIGlmIChjbGlwYm9hcmQuaGFzUHJpbWFyeUNsaXAoKSkgeworICAgICAgICAgICAgbVBhc3RlSXRlbS5zZXRFbmFibGVkKHRydWUpOworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgY2xpcGJvYXJkIGlzIGVtcHR5LCBkaXNhYmxlcyB0aGUgbWVudSdzIFBhc3RlIG9wdGlvbi4KKyAgICAgICAgICAgIG1QYXN0ZUl0ZW0uc2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2Ygbm90ZXMgY3VycmVudGx5IGJlaW5nIGRpc3BsYXllZC4KICAgICAgICAgZmluYWwgYm9vbGVhbiBoYXZlSXRlbXMgPSBnZXRMaXN0QWRhcHRlcigpLmdldENvdW50KCkgPiAwOwogCiAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgbm90ZXMgaW4gdGhlIGxpc3QgKHdoaWNoIGltcGxpZXMgdGhhdCBvbmUgb2YKQEAgLTExOCw5NyArMjUxLDI5OCBAQAogICAgICAgICAvLyBvZiBvdXIgb3duIHNwZWNpZmljIGFjdGlvbnMgYWxvbmcgd2l0aCBhbnkgZXh0ZW5zaW9ucyB0aGF0IGNhbiBiZQogICAgICAgICAvLyBmb3VuZC4KICAgICAgICAgaWYgKGhhdmVJdGVtcykgeworCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBzZWxlY3RlZCBpdGVtLgogICAgICAgICAgICAgVXJpIHVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgZ2V0U2VsZWN0ZWRJdGVtSWQoKSk7CiAKLSAgICAgICAgICAgIC8vIEJ1aWxkIG1lbnUuLi4gIGFsd2F5cyBzdGFydHMgd2l0aCB0aGUgRURJVCBhY3Rpb24uLi4KKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYW4gYXJyYXkgb2YgSW50ZW50cyB3aXRoIG9uZSBlbGVtZW50LiBUaGlzIHdpbGwgYmUgdXNlZCB0byBzZW5kIGFuIEludGVudAorICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIHNlbGVjdGVkIG1lbnUgaXRlbS4KICAgICAgICAgICAgIEludGVudFtdIHNwZWNpZmljcyA9IG5ldyBJbnRlbnRbMV07CisKKyAgICAgICAgICAgIC8vIFNldHMgdGhlIEludGVudCBpbiB0aGUgYXJyYXkgdG8gYmUgYW4gRURJVCBhY3Rpb24gb24gdGhlIFVSSSBvZiB0aGUgc2VsZWN0ZWQgbm90ZS4KICAgICAgICAgICAgIHNwZWNpZmljc1swXSA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCB1cmkpOworCisgICAgICAgICAgICAvLyBDcmVhdGVzIGFuIGFycmF5IG9mIG1lbnUgaXRlbXMgd2l0aCBvbmUgZWxlbWVudC4gVGhpcyB3aWxsIGNvbnRhaW4gdGhlIEVESVQgb3B0aW9uLgogICAgICAgICAgICAgTWVudUl0ZW1bXSBpdGVtcyA9IG5ldyBNZW51SXRlbVsxXTsKIAotICAgICAgICAgICAgLy8gLi4uIGlzIGZvbGxvd2VkIGJ5IHdoYXRldmVyIG90aGVyIGFjdGlvbnMgYXJlIGF2YWlsYWJsZS4uLgorICAgICAgICAgICAgLy8gQ3JlYXRlcyBhbiBJbnRlbnQgd2l0aCBubyBzcGVjaWZpYyBhY3Rpb24sIHVzaW5nIHRoZSBVUkkgb2YgdGhlIHNlbGVjdGVkIG5vdGUuCiAgICAgICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChudWxsLCB1cmkpOworCisgICAgICAgICAgICAvKiBBZGRzIHRoZSBjYXRlZ29yeSBBTFRFUk5BVElWRSB0byB0aGUgSW50ZW50LCB3aXRoIHRoZSBub3RlIElEIFVSSSBhcyBpdHMKKyAgICAgICAgICAgICAqIGRhdGEuIFRoaXMgcHJlcGFyZXMgdGhlIEludGVudCBhcyBhIHBsYWNlIHRvIGdyb3VwIGFsdGVybmF0aXZlIG9wdGlvbnMgaW4gdGhlCisgICAgICAgICAgICAgKiBtZW51LgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoSW50ZW50LkNBVEVHT1JZX0FMVEVSTkFUSVZFKTsKLSAgICAgICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucyhNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAwLCAwLCBudWxsLCBzcGVjaWZpY3MsIGludGVudCwgMCwKLSAgICAgICAgICAgICAgICAgICAgaXRlbXMpOwogCi0gICAgICAgICAgICAvLyBHaXZlIGEgc2hvcnRjdXQgdG8gdGhlIGVkaXQgYWN0aW9uLgotICAgICAgICAgICAgaWYgKGl0ZW1zWzBdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpdGVtc1swXS5zZXRTaG9ydGN1dCgnMScsICdlJyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBZGQgYWx0ZXJuYXRpdmVzIHRvIHRoZSBtZW51CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1lbnUuYWRkSW50ZW50T3B0aW9ucygKKyAgICAgICAgICAgICAgICBNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFLCAgLy8gQWRkIHRoZSBJbnRlbnRzIGFzIG9wdGlvbnMgaW4gdGhlIGFsdGVybmF0aXZlcyBncm91cC4KKyAgICAgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgICAgICAgLy8gQSB1bmlxdWUgaXRlbSBJRCBpcyBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgTWVudS5OT05FLCAgICAgICAgICAgICAgICAgIC8vIFRoZSBhbHRlcm5hdGl2ZXMgZG9uJ3QgbmVlZCB0byBiZSBpbiBvcmRlci4KKyAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhbGxlcidzIG5hbWUgaXMgbm90IGV4Y2x1ZGVkIGZyb20gdGhlIGdyb3VwLgorICAgICAgICAgICAgICAgIHNwZWNpZmljcywgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBzcGVjaWZpYyBvcHRpb25zIG11c3QgYXBwZWFyIGZpcnN0LgorICAgICAgICAgICAgICAgIGludGVudCwgICAgICAgICAgICAgICAgICAgICAvLyBUaGVzZSBJbnRlbnQgb2JqZWN0cyBtYXAgdG8gdGhlIG9wdGlvbnMgaW4gc3BlY2lmaWNzLgorICAgICAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgICAgICAgICAvLyBObyBmbGFncyBhcmUgcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgaXRlbXMgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBtZW51IGl0ZW1zIGdlbmVyYXRlZCBmcm9tIHRoZSBzcGVjaWZpY3MtdG8tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEludGVudHMgbWFwcGluZworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgRWRpdCBtZW51IGl0ZW0gZXhpc3RzLCBhZGRzIHNob3J0Y3V0cyBmb3IgaXQuCisgICAgICAgICAgICAgICAgaWYgKGl0ZW1zWzBdICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBFZGl0IG1lbnUgaXRlbSBzaG9ydGN1dCB0byBudW1lcmljICIxIiwgbGV0dGVyICJlIgorICAgICAgICAgICAgICAgICAgICBpdGVtc1swXS5zZXRTaG9ydGN1dCgnMScsICdlJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbGlzdCBpcyBlbXB0eSwgcmVtb3ZlcyBhbnkgZXhpc3RpbmcgYWx0ZXJuYXRpdmUgYWN0aW9ucyBmcm9tIHRoZSBtZW51CisgICAgICAgICAgICAgICAgbWVudS5yZW1vdmVHcm91cChNZW51LkNBVEVHT1JZX0FMVEVSTkFUSVZFKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbnUucmVtb3ZlR3JvdXAoTWVudS5DQVRFR09SWV9BTFRFUk5BVElWRSk7Ci0gICAgICAgIH0KIAorICAgICAgICAvLyBEaXNwbGF5cyB0aGUgbWVudQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIG9wdGlvbiBmcm9tIHRoZSBtZW51LCBidXQgbm8gaXRlbQorICAgICAqIGluIHRoZSBsaXN0IGlzIHNlbGVjdGVkLiBJZiB0aGUgb3B0aW9uIHdhcyBJTlNFUlQsIHRoZW4gYSBuZXcgSW50ZW50IGlzIHNlbnQgb3V0IHdpdGggYWN0aW9uCisgICAgICogQUNUSU9OX0lOU0VSVC4gVGhlIGRhdGEgZnJvbSB0aGUgaW5jb21pbmcgSW50ZW50IGlzIHB1dCBpbnRvIHRoZSBuZXcgSW50ZW50LiBJbiBlZmZlY3QsCisgICAgICogdGhpcyB0cmlnZ2VycyB0aGUgTm90ZUVkaXRvciBhY3Rpdml0eSBpbiB0aGUgTm90ZVBhZCBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIElmIHRoZSBpdGVtIHdhcyBub3QgSU5TRVJULCB0aGVuIG1vc3QgbGlrZWx5IGl0IHdhcyBhbiBhbHRlcm5hdGl2ZSBvcHRpb24gZnJvbSBhbm90aGVyCisgICAgICogYXBwbGljYXRpb24uIFRoZSBwYXJlbnQgbWV0aG9kIGlzIGNhbGxlZCB0byBwcm9jZXNzIHRoZSBpdGVtLgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBtZW51IGl0ZW0gdGhhdCB3YXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIKKyAgICAgKiBAcmV0dXJuIFRydWUsIGlmIHRoZSBJTlNFUlQgbWVudSBpdGVtIHdhcyBzZWxlY3RlZDsgb3RoZXJ3aXNlLCB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKKyAgICAgKiB0aGUgcGFyZW50IG1ldGhvZC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBvbk9wdGlvbnNJdGVtU2VsZWN0ZWQoTWVudUl0ZW0gaXRlbSkgeworCisgICAgICAgIC8vIEdldHMgdGhlIElEIG9mIHRoZSBzZWxlY3RlZCBpdGVtCiAgICAgICAgIHN3aXRjaCAoaXRlbS5nZXRJdGVtSWQoKSkgeworCisgICAgICAgIC8vIElmIHRoZSBtZW51IGl0ZW0gaXMgSW5zZXJ0CiAgICAgICAgIGNhc2UgTUVOVV9JVEVNX0lOU0VSVDoKLSAgICAgICAgICAgIC8vIExhdW5jaCBhY3Rpdml0eSB0byBpbnNlcnQgYSBuZXcgaXRlbQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTGF1bmNoZXMgYSBuZXcgQWN0aXZpdHkgdXNpbmcgYW4gSW50ZW50LiBUaGUgaW50ZW50IGZpbHRlciBmb3IgdGhlIEFjdGl2aXR5CisgICAgICAgICAgICAgKiBoYXMgdG8gaGF2ZSBhY3Rpb24gQUNUSU9OX0lOU0VSVC4gTm8gY2F0ZWdvcnkgaXMgc2V0LCBzbyBERUZBVUxUIGlzIGFzc3VtZWQuCisgICAgICAgICAgICAgKiBJbiBlZmZlY3QsIHRoaXMgc3RhcnRzIHRoZSBOb3RlRWRpdG9yIEFjdGl2aXR5IGluIE5vdGVQYWQuCisgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobmV3IEludGVudChJbnRlbnQuQUNUSU9OX0lOU0VSVCwgZ2V0SW50ZW50KCkuZ2V0RGF0YSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICAvLyBJZiB0aGUgbWVudSBpdGVtIGlzIFBhc3RlCisgICAgICAgIGNhc2UgTUVOVV9JVEVNX1BBU1RFOgorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogTGF1bmNoZXMgYSBuZXcgQWN0aXZpdHkgdXNpbmcgYW4gSW50ZW50LiBUaGUgaW50ZW50IGZpbHRlciBmb3IgdGhlIEFjdGl2aXR5CisgICAgICAgICAgICAgKiBoYXMgdG8gaGF2ZSBhY3Rpb24gQUNUSU9OX1BBU1RFLiBObyBjYXRlZ29yeSBpcyBzZXQsIHNvIERFRkFVTFQgaXMgYXNzdW1lZC4KKyAgICAgICAgICAgICAqIEluIGVmZmVjdCwgdGhpcyBzdGFydHMgdGhlIE5vdGVFZGl0b3IgQWN0aXZpdHkgaW4gTm90ZVBhZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhcnRBY3Rpdml0eShuZXcgSW50ZW50KEludGVudC5BQ1RJT05fUEFTVEUsIGdldEludGVudCgpLmdldERhdGEoKSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGUgbWVudSBpdGVtIHNlbGVjdGVkIGlzIG5vdCBJbnNlcnQgb3IgUGFzdGUsIHRoZW4gdGhpcyBjYWxscyB0aGUgcmVndWxhcgorICAgICAgICAvLyBwcm9jZXNzaW5nIHRvIGhhbmRsZSB0aGUgaXRlbS4KICAgICAgICAgcmV0dXJuIHN1cGVyLm9uT3B0aW9uc0l0ZW1TZWxlY3RlZChpdGVtKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjb250ZXh0LWNsaWNrcyBhIG5vdGUgaW4gdGhlIGxpc3QuIE5vdGVzTGlzdCByZWdpc3RlcnMKKyAgICAgKiBpdHNlbGYgYXMgdGhlIGhhbmRsZXIgZm9yIGNvbnRleHQgbWVudXMgaW4gaXRzIExpc3RWaWV3ICh0aGlzIGlzIGRvbmUgaW4gb25DcmVhdGUoKSkuCisgICAgICoKKyAgICAgKiBUaGUgb25seSBhdmFpbGFibGUgb3B0aW9ucyBhcmUgQ09QWSBhbmQgREVMRVRFLgorICAgICAqCisgICAgICogQ29udGV4dC1jbGljayBpcyBlcXVpdmFsZW50IHRvIGxvbmctcHJlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVudSBBIENvbnRleE1lbnUgb2JqZWN0IHRvIHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gdmlldyBUaGUgVmlldyBmb3Igd2hpY2ggdGhlIGNvbnRleHQgbWVudSBpcyBiZWluZyBjb25zdHJ1Y3RlZC4KKyAgICAgKiBAcGFyYW0gbWVudUluZm8gRGF0YSBhc3NvY2lhdGVkIHdpdGggdmlldy4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlQ29udGV4dE1lbnUoQ29udGV4dE1lbnUgbWVudSwgVmlldyB2aWV3LCBDb250ZXh0TWVudUluZm8gbWVudUluZm8pIHsKKworICAgICAgICAvLyBUaGUgZGF0YSBmcm9tIHRoZSBtZW51IGl0ZW0uCiAgICAgICAgIEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8gaW5mbzsKKworICAgICAgICAvLyBUcmllcyB0byBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBpdGVtIGluIHRoZSBMaXN0VmlldyB0aGF0IHdhcyBsb25nLXByZXNzZWQuCiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgaW5mbyA9IChBZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvKSBtZW51SW5mbzsKKworICAgICAgICAgICAgLy8gQ2FzdHMgdGhlIGluY29taW5nIGRhdGEgb2JqZWN0IGludG8gdGhlIHR5cGUgZm9yIEFkYXB0ZXJWaWV3IG9iamVjdHMuCisgICAgICAgICAgICBpbmZvID0gKEFkYXB0ZXJWaWV3LkFkYXB0ZXJDb250ZXh0TWVudUluZm8pIG1lbnVJbmZvOwogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgbWVudSBvYmplY3QgY2FuJ3QgYmUgY2FzdCwgbG9ncyBhbiBlcnJvci4KICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBtZW51SW5mbyIsIGUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW0gYXQgdGhlIHNlbGVjdGVkIHBvc2l0aW9uLiBnZXRJdGVtKCkgcmV0dXJucworICAgICAgICAgKiB3aGF0ZXZlciB0aGUgYmFja2luZyBhZGFwdGVyIG9mIHRoZSBMaXN0VmlldyBoYXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpdGVtLiBJbiBOb3Rlc0xpc3QsCisgICAgICAgICAqIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgYWxsIG9mIHRoZSBkYXRhIGZvciBhIG5vdGUgd2l0aCBpdHMgbGlzdCBpdGVtLiBBcyBhIHJlc3VsdCwKKyAgICAgICAgICogZ2V0SXRlbSgpIHJldHVybnMgdGhhdCBkYXRhIGFzIGEgQ3Vyc29yLgorICAgICAgICAgKi8KICAgICAgICAgQ3Vyc29yIGN1cnNvciA9IChDdXJzb3IpIGdldExpc3RBZGFwdGVyKCkuZ2V0SXRlbShpbmZvLnBvc2l0aW9uKTsKKworICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGVtcHR5LCB0aGVuIGZvciBzb21lIHJlYXNvbiB0aGUgYWRhcHRlciBjYW4ndCBnZXQgdGhlIGRhdGEgZnJvbSB0aGUKKyAgICAgICAgLy8gcHJvdmlkZXIsIHNvIHJldHVybnMgbnVsbCB0byB0aGUgY2FsbGVyLgogICAgICAgICBpZiAoY3Vyc29yID09IG51bGwpIHsKKwogICAgICAgICAgICAgLy8gRm9yIHNvbWUgcmVhc29uIHRoZSByZXF1ZXN0ZWQgaXRlbSBpc24ndCBhdmFpbGFibGUsIGRvIG5vdGhpbmcKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIC8vIFNldHVwIHRoZSBtZW51IGhlYWRlcgorICAgICAgICAvLyBTZXRzIHRoZSBtZW51IGhlYWRlciB0byBiZSB0aGUgdGl0bGUgb2YgdGhlIHNlbGVjdGVkIG5vdGUuCiAgICAgICAgIG1lbnUuc2V0SGVhZGVyVGl0bGUoY3Vyc29yLmdldFN0cmluZyhDT0xVTU5fSU5ERVhfVElUTEUpKTsKIAotICAgICAgICAvLyBBZGQgYSBtZW51IGl0ZW0gdG8gZGVsZXRlIHRoZSBub3RlCi0gICAgICAgIG1lbnUuYWRkKDAsIE1FTlVfSVRFTV9ERUxFVEUsIDAsIFIuc3RyaW5nLm1lbnVfZGVsZXRlKTsKKyAgICAgICAgLy8gQWRkcyBhIG1lbnUgaXRlbSB0byBjb3B5IHRoZSBub3RlIHRvIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgICAgbWVudS5hZGQoCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgIC8vIE5vIGdyb3VwaW5nIGlzIG5lZWRlZCBmb3IgdGhpcyBtZW51CisgICAgICAgICAgICBNRU5VX0lURU1fQ09QWSwgICAgIC8vIEEgdW5pcXVlIElEIGZvciB0aGlzIG1lbnUgaXRlbS4KKyAgICAgICAgICAgIE1lbnUuTk9ORSwgICAgICAgICAgLy8gTm8gb3JkZXJpbmcgaXMgbmVjZXNzYXJ5IGluIHRoaXMgbWVudQorICAgICAgICAgICAgUi5zdHJpbmcubWVudV9jb3B5ICAvLyBUaGUgcmVzb3VyY2UgSUQgZm9yIHRoZSBzdHJpbmcgdG8gZGlzcGxheSBmb3IgdGhpcyBpdGVtLgorICAgICAgICApOworCisgICAgICAgIC8vIEFkZHMgYSBtZW51IGl0ZW0gdG8gZGVsZXRlIHRoZSBub3RlIHRvIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgICAgbWVudS5hZGQoCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgLy8gTm8gZ3JvdXBpbmcgaXMgbmVlZGVkIGZvciB0aGlzIG1lbnUKKyAgICAgICAgICAgIE1FTlVfSVRFTV9ERUxFVEUsICAgICAvLyBBIHVuaXF1ZSBJRCBmb3IgdGhpcyBtZW51IGl0ZW0uCisgICAgICAgICAgICBNZW51Lk5PTkUsICAgICAgICAgICAgLy8gTm8gb3JkZXJpbmcgaXMgbmVjZXNzYXJ5IGluIHRoaXMgbWVudQorICAgICAgICAgICAgUi5zdHJpbmcubWVudV9kZWxldGUgIC8vIFRoZSByZXNvdXJjZSBJRCBmb3IgdGhlIHN0cmluZyB0byBkaXNwbGF5IGZvciB0aGlzIGl0ZW0uCisgICAgICAgICk7CiAgICAgfQotICAgICAgICAKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgYW4gaXRlbSBmcm9tIHRoZSBjb250ZXh0IG1lbnUKKyAgICAgKiAoc2VlIG9uQ3JlYXRlQ29udGV4dE1lbnUoKSkuIFRoZSBvbmx5IG1lbnUgaXRlbXMgdGhhdCBhcmUgYWN0dWFsbHkgaGFuZGxlZCBhcmUgREVMRVRFIGFuZAorICAgICAqIENPUFkuIEFueXRoaW5nIGVsc2UgaXMgYW4gYWx0ZXJuYXRpdmUgb3B0aW9uLCBmb3Igd2hpY2ggZGVmYXVsdCBoYW5kbGluZyBzaG91bGQgYmUgZG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtIFRoZSBzZWxlY3RlZCBtZW51IGl0ZW0KKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIG1lbnUgaXRlbSB3YXMgREVMRVRFLCBhbmQgbm8gZGVmYXVsdCBwcm9jZXNzaW5nIGlzIG5lZWQsIG90aGVyd2lzZSBmYWxzZSwKKyAgICAgKiB3aGljaCB0cmlnZ2VycyB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgaXRlbS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbgorICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIG9uQ29udGV4dEl0ZW1TZWxlY3RlZChNZW51SXRlbSBpdGVtKSB7CisKKyAgICAgICAgLy8gVGhlIGRhdGEgZnJvbSB0aGUgbWVudSBpdGVtLgogICAgICAgICBBZGFwdGVyVmlldy5BZGFwdGVyQ29udGV4dE1lbnVJbmZvIGluZm87CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0cyB0aGUgZXh0cmEgaW5mbyBmcm9tIHRoZSBtZW51IGl0ZW0uIFdoZW4gYW4gbm90ZSBpbiB0aGUgTm90ZXMgbGlzdCBpcyBsb25nLXByZXNzZWQsIGEKKyAgICAgICAgICogY29udGV4dCBtZW51IGFwcGVhcnMuIFRoZSBtZW51IGl0ZW1zIGZvciB0aGUgbWVudSBhdXRvbWF0aWNhbGx5IGdldCB0aGUgZGF0YQorICAgICAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIG5vdGUgdGhhdCB3YXMgbG9uZy1wcmVzc2VkLiBUaGUgZGF0YSBjb21lcyBmcm9tIHRoZSBwcm92aWRlciB0aGF0CisgICAgICAgICAqIGJhY2tzIHRoZSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgbm90ZSdzIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSBjb250ZXh0IG1lbnUgY3JlYXRpb24gcm91dGluZSBpbiBhIENvbnRleHRNZW51SW5mbworICAgICAgICAgKiBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIFdoZW4gb25lIG9mIHRoZSBjb250ZXh0IG1lbnUgaXRlbXMgaXMgY2xpY2tlZCwgdGhlIHNhbWUgZGF0YSBpcyBwYXNzZWQsIGFsb25nIHdpdGggdGhlCisgICAgICAgICAqIG5vdGUgSUQsIHRvIG9uQ29udGV4dEl0ZW1TZWxlY3RlZCgpIHZpYSB0aGUgaXRlbSBwYXJhbWV0ZXIuCisgICAgICAgICAqLwogICAgICAgICB0cnkgewotICAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgaXRlbS5nZXRNZW51SW5mbygpOworCisgICAgICAgICAgICAvLyBDYXN0cyB0aGUgZGF0YSBvYmplY3QgaW4gdGhlIGl0ZW0gaW50byB0aGUgdHlwZSBmb3IgQWRhcHRlclZpZXcgb2JqZWN0cy4KKyAgICAgICAgICAgIGluZm8gPSAoQWRhcHRlclZpZXcuQWRhcHRlckNvbnRleHRNZW51SW5mbykgaXRlbS5nZXRNZW51SW5mbygpOwogICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgb2JqZWN0IGNhbid0IGJlIGNhc3QsIGxvZ3MgYW4gZXJyb3IKICAgICAgICAgICAgIExvZy5lKFRBRywgImJhZCBtZW51SW5mbyIsIGUpOworCisgICAgICAgICAgICAvLyBUcmlnZ2VycyBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIG1lbnUgaXRlbS4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIG1lbnUgaXRlbSdzIElEIGFuZCBjb21wYXJlcyBpdCB0byBrbm93biBhY3Rpb25zLiBUaGUgb25seSBhY3Rpb25zIHRoYXQgYXJlCisgICAgICAgICAqIGltcGxlbWVudGVkIGFyZSBDT1BZIGFuZCBERUxFVEUgKHNldCBpbiBvbkNyZWF0ZUNvbnRleHRNZW51KCkpLgorICAgICAgICAgKi8KICAgICAgICAgc3dpdGNoIChpdGVtLmdldEl0ZW1JZCgpKSB7CisKKyAgICAgICAgICAgIC8vIERlbGV0ZXMgdGhlIHNlbGVjdGVkIG5vdGUKICAgICAgICAgICAgIGNhc2UgTUVOVV9JVEVNX0RFTEVURTogewotICAgICAgICAgICAgICAgIC8vIERlbGV0ZSB0aGUgbm90ZSB0aGF0IHRoZSBjb250ZXh0IG1lbnUgaXMgZm9yCisKKyAgICAgICAgICAgICAgICAvLyBBcHBlbmRzIHRoZSBzZWxlY3RlZCBub3RlJ3MgSUQgdG8gdGhlIFVSSSBzZW50IHdpdGggdGhlIGluY29taW5nIEludGVudC4KICAgICAgICAgICAgICAgICBVcmkgbm90ZVVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKGdldEludGVudCgpLmdldERhdGEoKSwgaW5mby5pZCk7Ci0gICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKG5vdGVVcmksIG51bGwsIG51bGwpOworCisgICAgICAgICAgICAgICAgLy8gRGVsZXRlcyB0aGUgbm90ZSBmcm9tIHRoZSBwcm92aWRlciBieSBwYXNzaW5nIGluIGEgVVJJIGluIG5vdGUgSUQgZm9ybWF0LgorICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBzZWUgdGhlIGludHJvZHVjdG9yeSBub3RlIGFib3V0IHBlcmZvcm1pbmcgcHJvdmlkZXIgb3BlcmF0aW9ucyBvbiB0aGUKKyAgICAgICAgICAgICAgICAvLyBVSSB0aHJlYWQuCisgICAgICAgICAgICAgICAgZ2V0Q29udGVudFJlc29sdmVyKCkuZGVsZXRlKAorICAgICAgICAgICAgICAgICAgICBub3RlVXJpLCAgLy8gVGhlIFVSSSBvZiB0aGUgcHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgICAgIC8vIE5vIHdoZXJlIGNsYXVzZSBpcyBuZWVkZWQsIHNpbmNlIG9ubHkgYSBzaW5nbGUgbm90ZSBJRCBpcyBiZWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkIGluLgorICAgICAgICAgICAgICAgICAgICBudWxsICAgICAgLy8gTm8gd2hlcmUgY2xhdXNlIGlzIHVzZWQsIHNvIG5vIHdoZXJlIGFyZ3VtZW50cyBhcmUgbmVlZGVkLgorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIHRvIHRoZSBjYWxsZXIgYW5kIHNraXBzIGZ1cnRoZXIgcHJvY2Vzc2luZy4KICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KKworLy9CRUdJTl9JTkNMVURFKGNvcHkpCisKKyAgICAgICAgICAgIC8vIENvcGllcyB0aGUgc2VsZWN0ZWQgbm90ZSB0byB0aGUgY2xpcGJvYXJkCisgICAgICAgICAgICBjYXNlIE1FTlVfSVRFTV9DT1BZOiB7CisKKyAgICAgICAgICAgICAgICAvLyBHZXRzIGEgaGFuZGxlIHRvIHRoZSBjbGlwYm9hcmQgc2VydmljZS4KKyAgICAgICAgICAgICAgICBDbGlwYm9hcmRNYW5hZ2VyIGNsaXBib2FyZCA9IChDbGlwYm9hcmRNYW5hZ2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNMSVBCT0FSRF9TRVJWSUNFKTsKKworICAgICAgICAgICAgICAgIC8vIEFwcGVuZHMgdGhlIHNlbGVjdGVkIG5vdGUncyBJRCB0byB0aGUgVVJJIHNlbnQgd2l0aCB0aGUgaW5jb21pbmcgSW50ZW50LgorICAgICAgICAgICAgICAgIFVyaSBub3RlVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoZ2V0SW50ZW50KCkuZ2V0RGF0YSgpLCBpbmZvLmlkKTsKKworICAgICAgICAgICAgICAgIC8vIENvcGllcyB0aGUgbm90ZXMgVVJJIHRvIHRoZSBjbGlwYm9hcmQuIEluIGVmZmVjdCwgdGhpcyBjb3BpZXMgdGhlIG5vdGUgaXRzZWxmCisgICAgICAgICAgICAgICAgY2xpcGJvYXJkLnNldFByaW1hcnlDbGlwKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENsaXBwZWREYXRhKCAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlcyBhIG5ldyBjbGlwYm9hcmQgaXRlbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gdmlzaWJsZSBsYWJlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gdmlzaWJsZSBpY29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDbGlwcGVkRGF0YS5JdGVtKG5vdGVVcmkpICAvLyBBIGNsaXBib2FyZCBJdGVtIHRoYXQgaXMgYSBVUkkuCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIC8vIFJldHVybnMgdG8gdGhlIGNhbGxlciBhbmQgc2tpcHMgZnVydGhlciBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorLy9FTkRfSU5DTFVERShjb3B5KQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgYSBub3RlIGluIHRoZSBkaXNwbGF5ZWQgbGlzdC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhbmRsZXMgaW5jb21pbmcgYWN0aW9ucyBvZiBlaXRoZXIgUElDSyAoZ2V0IGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIpIG9yCisgICAgICogR0VUX0NPTlRFTlQgKGdldCBvciBjcmVhdGUgZGF0YSkuIElmIHRoZSBpbmNvbWluZyBhY3Rpb24gaXMgRURJVCwgdGhpcyBtZXRob2Qgc2VuZHMgYQorICAgICAqIG5ldyBJbnRlbnQgdG8gc3RhcnQgTm90ZUVkaXRvci4KKyAgICAgKiBAcGFyYW0gbCBUaGUgTGlzdFZpZXcgdGhhdCBjb250YWlucyB0aGUgY2xpY2tlZCBpdGVtCisgICAgICogQHBhcmFtIHYgVGhlIFZpZXcgb2YgdGhlIGluZGl2aWR1YWwgaXRlbQorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gb2YgdiBpbiB0aGUgZGlzcGxheWVkIGxpc3QKKyAgICAgKiBAcGFyYW0gaWQgVGhlIHJvdyBJRCBvZiB0aGUgY2xpY2tlZCBpdGVtCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25MaXN0SXRlbUNsaWNrKExpc3RWaWV3IGwsIFZpZXcgdiwgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisKKyAgICAgICAgLy8gQ29uc3RydWN0cyBhIG5ldyBVUkkgZnJvbSB0aGUgaW5jb21pbmcgVVJJIGFuZCB0aGUgcm93IElECiAgICAgICAgIFVyaSB1cmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChnZXRJbnRlbnQoKS5nZXREYXRhKCksIGlkKTsKLSAgICAgICAgCisKKyAgICAgICAgLy8gR2V0cyB0aGUgYWN0aW9uIGZyb20gdGhlIGluY29taW5nIEludGVudAogICAgICAgICBTdHJpbmcgYWN0aW9uID0gZ2V0SW50ZW50KCkuZ2V0QWN0aW9uKCk7CisKKyAgICAgICAgLy8gSGFuZGxlcyByZXF1ZXN0cyBmb3Igbm90ZSBkYXRhCiAgICAgICAgIGlmIChJbnRlbnQuQUNUSU9OX1BJQ0suZXF1YWxzKGFjdGlvbikgfHwgSW50ZW50LkFDVElPTl9HRVRfQ09OVEVOVC5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gVGhlIGNhbGxlciBpcyB3YWl0aW5nIGZvciB1cyB0byByZXR1cm4gYSBub3RlIHNlbGVjdGVkIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgdXNlci4gIFRoZSBoYXZlIGNsaWNrZWQgb24gb25lLCBzbyByZXR1cm4gaXQgbm93LgorCisgICAgICAgICAgICAvLyBTZXRzIHRoZSByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBjb21wb25lbnQgdGhhdCBjYWxsZWQgdGhpcyBBY3Rpdml0eS4gVGhlCisgICAgICAgICAgICAvLyByZXN1bHQgY29udGFpbnMgdGhlIG5ldyBVUkkKICAgICAgICAgICAgIHNldFJlc3VsdChSRVNVTFRfT0ssIG5ldyBJbnRlbnQoKS5zZXREYXRhKHVyaSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gTGF1bmNoIGFjdGl2aXR5IHRvIHZpZXcvZWRpdCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0KKworICAgICAgICAgICAgLy8gU2VuZHMgb3V0IGFuIEludGVudCB0byBzdGFydCBhbiBBY3Rpdml0eSB0aGF0IGNhbiBoYW5kbGUgQUNUSU9OX0VESVQuIFRoZQorICAgICAgICAgICAgLy8gSW50ZW50J3MgZGF0YSBpcyB0aGUgbm90ZSBJRCBVUkkuIFRoZSBlZmZlY3QgaXMgdG8gY2FsbCBOb3RlRWRpdC4KICAgICAgICAgICAgIHN0YXJ0QWN0aXZpdHkobmV3IEludGVudChJbnRlbnQuQUNUSU9OX0VESVQsIHVyaSkpOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZXNMaXZlRm9sZGVyLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQppbmRleCAwMGViMzE0Li4yNGFmYWEwIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3Rlc0xpdmVGb2xkZXIuamF2YQpAQCAtMTYsNTAgKzE2LDk4IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CisKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlOwogaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwogaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuTGl2ZUZvbGRlcnM7CiAKKy8qKgorICogVGhpcyBBY3Rpdml0eSBjcmVhdGVzIGEgbGl2ZSBmb2xkZXIgSW50ZW50IGFuZAorICogc2VuZHMgaXQgYmFjayB0byBIT01FLiBGcm9tIHRoZSBkYXRhIGluIHRoZSBJbnRlbnQsIEhPTUUgY3JlYXRlcyBhIGxpdmUgZm9sZGVyIGFuZCBkaXNwbGF5cworICogaXRzIGljb24gaW4gdGhlIEhvbWUgdmlldy4KKyAqIFdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBpY29uLCBIb21lIHVzZXMgdGhlIGRhdGEgaXQgZ290IGZyb20gdGhlIEludGVudCB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbgorICogZnJvbSBhIGNvbnRlbnQgcHJvdmlkZXIgYW5kIGRpc3BsYXkgaXQgaW4gYSBWaWV3LgorICoKKyAqIFRoZSBpbnRlbnQgZmlsdGVyIGZvciB0aGlzIEFjdGl2aXR5IGlzIHNldCB0byBBQ1RJT05fQ1JFQVRFX0xJVkVfRk9MREVSLCB3aGljaAorICogSE9NRSBzZW5kcyBpbiByZXNwb25zZSB0byBhIGxvbmcgcHJlc3MgYW5kIHNlbGVjdGlvbiBvZiBMaXZlIEZvbGRlci4KKyAqLwogcHVibGljIGNsYXNzIE5vdGVzTGl2ZUZvbGRlciBleHRlbmRzIEFjdGl2aXR5IHsKKwogICAgIC8qKgotICAgICAqIFRoZSBVUkkgZm9yIHRoZSBOb3RlcyBMaXZlIEZvbGRlciBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEFsbCBvZiB0aGUgd29yayBpcyBkb25lIGluIG9uQ3JlYXRlKCkuIFRoZSBBY3Rpdml0eSBkb2Vzbid0IGFjdHVhbGx5IGRpc3BsYXkgYSBVSS4KKyAgICAgKiBJbnN0ZWFkLCBpdCBzZXRzIHVwIGFuIEludGVudCBhbmQgcmV0dXJucyBpdCB0byBpdHMgY2FsbGVyICh0aGUgSE9NRSBhY3Rpdml0eSkuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkgPSBVcmkucGFyc2UoImNvbnRlbnQ6Ly8iCi0gICAgICAgICAgICArIE5vdGVQYWQuQVVUSE9SSVRZICsgIi9saXZlX2ZvbGRlcnMvbm90ZXMiKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpIE5PVEVfVVJJID0gVXJpLnBhcnNlKCJjb250ZW50Oi8vIgotICAgICAgICAgICAgKyBOb3RlUGFkLkFVVEhPUklUWSArICIvbm90ZXMvIyIpOwotCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwogCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIGluY29taW5nIEludGVudCBhbmQgaXRzIGFjdGlvbi4gSWYgdGhlIGluY29taW5nIEludGVudCB3YXMKKyAgICAgICAgICogQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUiwgdGhlbiBjcmVhdGUgYW4gb3V0Z29pbmcgSW50ZW50IHdpdGggdGhlCisgICAgICAgICAqIG5lY2Vzc2FyeSBkYXRhIGFuZCBzZW5kIGJhY2sgT0suIE90aGVyd2lzZSwgc2VuZCBiYWNrIENBTkNFTC4KKyAgICAgICAgICovCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBnZXRJbnRlbnQoKTsKICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKIAogICAgICAgICBpZiAoTGl2ZUZvbGRlcnMuQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUi5lcXVhbHMoYWN0aW9uKSkgewotICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGxpdmUgZm9sZGVyIGludGVudC4KKworICAgICAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBJbnRlbnQuCiAgICAgICAgICAgICBmaW5hbCBJbnRlbnQgbGl2ZUZvbGRlckludGVudCA9IG5ldyBJbnRlbnQoKTsKIAotICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5zZXREYXRhKENPTlRFTlRfVVJJKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U3RyaW5nKFIuc3RyaW5nLmxpdmVfZm9sZGVyX25hbWUpKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfSUNPTiwKLSAgICAgICAgICAgICAgICAgICAgSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlLmZyb21Db250ZXh0KHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5kcmF3YWJsZS5saXZlX2ZvbGRlcl9ub3RlcykpOwotICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9ESVNQTEFZX01PREUsCi0gICAgICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLkRJU1BMQVlfTU9ERV9MSVNUKTsKLSAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoTGl2ZUZvbGRlcnMuRVhUUkFfTElWRV9GT0xERVJfQkFTRV9JTlRFTlQsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBOT1RFX1VSSSkpOworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cyBwdXQgZGF0YSBpbnRvIHRoZSBvdXRnb2luZyBJbnRlbnQuIFBsZWFzZSBzZWUKKyAgICAgICAgICAgICAqIHtAbGluayBhbmRyb2lkLnByb3ZpZGVyLkxpdmVGb2xkZXJzIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZXNlCisgICAgICAgICAgICAgKiBkYXRhIHZhbHVlcy4gRnJvbSB0aGlzIGRhdGEsIEhPTUUgc2V0cyB1cCBhIGxpdmUgZm9sZGVyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICAvLyBTZXRzIHRoZSBVUkkgcGF0dGVybiBmb3IgdGhlIGNvbnRlbnQgcHJvdmlkZXIgYmFja2luZyB0aGUgZm9sZGVyLgorICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5zZXREYXRhKE5vdGVQYWQuTm90ZXMuTElWRV9GT0xERVJfVVJJKTsKIAotICAgICAgICAgICAgLy8gVGhlIHJlc3VsdCBvZiB0aGlzIGFjdGl2aXR5IHNob3VsZCBiZSBhIGxpdmUgZm9sZGVyIGludGVudC4KKyAgICAgICAgICAgIC8vIEFkZHMgdGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgbGl2ZSBmb2xkZXIgYXMgYW4gRXh0cmEgc3RyaW5nLgorICAgICAgICAgICAgU3RyaW5nIGZvbGRlcm5hbWUgPSBnZXRTdHJpbmcoUi5zdHJpbmcubGl2ZV9mb2xkZXJfbmFtZSk7CisgICAgICAgICAgICBsaXZlRm9sZGVySW50ZW50LnB1dEV4dHJhKExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX05BTUUsIGZvbGRlcm5hbWUpOworCisgICAgICAgICAgICAvLyBBZGRzIHRoZSBkaXNwbGF5IGljb24gb2YgdGhlIGxpdmUgZm9sZGVyIGFzIGFuIEV4dHJhIHJlc291cmNlLgorICAgICAgICAgICAgU2hvcnRjdXRJY29uUmVzb3VyY2UgZm9sZGVyaWNvbiA9CisgICAgICAgICAgICAgICAgSW50ZW50LlNob3J0Y3V0SWNvblJlc291cmNlLmZyb21Db250ZXh0KHRoaXMsIFIuZHJhd2FibGUubGl2ZV9mb2xkZXJfbm90ZXMpOworICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9JQ09OLCBmb2xkZXJpY29uKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoZSBkaXNwbGF5IG1vZGUgb2YgdGhlIGxpdmUgZm9sZGVyIGFzIGFuIGludGVnZXIuIFRoZSBzcGVjaWZpZWQKKyAgICAgICAgICAgIC8vIG1vZGUgY2F1c2VzIHRoZSBsaXZlIGZvbGRlciB0byBkaXNwbGF5IGFzIGEgbGlzdC4KKyAgICAgICAgICAgIGxpdmVGb2xkZXJJbnRlbnQucHV0RXh0cmEoCisgICAgICAgICAgICAgICAgICAgIExpdmVGb2xkZXJzLkVYVFJBX0xJVkVfRk9MREVSX0RJU1BMQVlfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgTGl2ZUZvbGRlcnMuRElTUExBWV9NT0RFX0xJU1QpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQWRkcyBhIGJhc2UgYWN0aW9uIGZvciBpdGVtcyBpbiB0aGUgbGl2ZSBmb2xkZXIgbGlzdCwgYXMgYW4gSW50ZW50LiBXaGVuIHRoZQorICAgICAgICAgICAgICogdXNlciBjbGlja3MgYW4gaW5kaXZpZHVhbCBub3RlIGluIHRoZSBsaXN0LCB0aGUgbGl2ZSBmb2xkZXIgZmlyZXMgdGhpcyBJbnRlbnQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogSXRzIGFjdGlvbiBpcyBBQ1RJT05fRURJVCwgc28gaXQgdHJpZ2dlcnMgdGhlIE5vdGUgRWRpdG9yIGFjdGl2aXR5LiBJdHMKKyAgICAgICAgICAgICAqIGRhdGEgaXMgdGhlIFVSSSBwYXR0ZXJuIGZvciBhIHNpbmdsZSBub3RlIGlkZW50aWZpZWQgYnkgaXRzIElELiBUaGUgbGl2ZSBmb2xkZXIKKyAgICAgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgSUQgdmFsdWUgb2YgdGhlIHNlbGVjdGVkIGl0ZW0gdG8gdGhlIFVSSSBwYXR0ZXJuLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEFzIGEgcmVzdWx0LCBOb3RlIEVkaXRvciBpcyB0cmlnZ2VyZWQgYW5kIGdldHMgYSBzaW5nbGUgbm90ZSB0byByZXRyaWV2ZSBieSBJRC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSW50ZW50IHJldHVybkludGVudAorICAgICAgICAgICAgICAgICAgICA9IG5ldyBJbnRlbnQoSW50ZW50LkFDVElPTl9FRElULCBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX1BBVFRFUk4pOworICAgICAgICAgICAgbGl2ZUZvbGRlckludGVudC5wdXRFeHRyYShMaXZlRm9sZGVycy5FWFRSQV9MSVZFX0ZPTERFUl9CQVNFX0lOVEVOVCwgcmV0dXJuSW50ZW50KTsKKworICAgICAgICAgICAgLyogQ3JlYXRlcyBhbiBBY3Rpdml0eVJlc3VsdCBvYmplY3QgdG8gcHJvcGFnYXRlIGJhY2sgdG8gSE9NRS4gU2V0IGl0cyByZXN1bHQgaW5kaWNhdG9yCisgICAgICAgICAgICAgKiB0byBPSywgYW5kIHNldHMgdGhlIHJldHVybmVkIEludGVudCB0byB0aGUgbGl2ZSBmb2xkZXIgSW50ZW50IHRoYXQgd2FzIGp1c3QKKyAgICAgICAgICAgICAqIGNvbnN0cnVjdGVkLgorICAgICAgICAgICAgICovCiAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX09LLCBsaXZlRm9sZGVySW50ZW50KTsKKwogICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvLyBJZiB0aGUgb3JpZ2luYWwgYWN0aW9uIHdhcyBub3QgQUNUSU9OX0NSRUFURV9MSVZFX0ZPTERFUiwgY3JlYXRlcyBhbgorICAgICAgICAgICAgLy8gQWN0aXZpdHlSZXN1bHQgd2l0aCB0aGUgaW5kaWNhdG9yIHNldCB0byBDQU5DRUxFRCwgYnV0IGRvIG5vdCByZXR1cm4gYW4gSW50ZW50CiAgICAgICAgICAgICBzZXRSZXN1bHQoUkVTVUxUX0NBTkNFTEVEKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIENsb3NlcyB0aGUgQWN0aXZpdHkuIFRoZSBBY3Rpdml0eU9iamVjdCBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIGNhbGxlci4KICAgICAgICAgZmluaXNoKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvVGl0bGVFZGl0b3IuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL1RpdGxlRWRpdG9yLmphdmEKaW5kZXggNTBkMzhlNS4uNzQzNzU5MSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9Ob3RlUGFkL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvVGl0bGVFZGl0b3IuamF2YQorKysgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9UaXRsZUVkaXRvci5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAKIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkOwogCi1pbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQuTm90ZXM7CitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5ub3RlcGFkLk5vdGVQYWQ7CiAKIGltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFZhbHVlczsKQEAgLTI4LDggKzI4LDEzIEBACiBpbXBvcnQgYW5kcm9pZC53aWRnZXQuRWRpdFRleHQ7CiAKIC8qKgotICogQW4gYWN0aXZpdHkgdGhhdCB3aWxsIGVkaXQgdGhlIHRpdGxlIG9mIGEgbm90ZS4gRGlzcGxheXMgYSBmbG9hdGluZwotICogd2luZG93IHdpdGggYSB0ZXh0IGZpZWxkLgorICogVGhpcyBBY3Rpdml0eSBhbGxvd3MgdGhlIHVzZXIgdG8gZWRpdCBhIG5vdGUncyB0aXRsZS4gSXQgZGlzcGxheXMgYSBmbG9hdGluZyB3aW5kb3cKKyAqIGNvbnRhaW5pbmcgYW4gRWRpdFRleHQuCisgKgorICogTk9URTogTm90aWNlIHRoYXQgdGhlIHByb3ZpZGVyIG9wZXJhdGlvbnMgaW4gdGhpcyBBY3Rpdml0eSBhcmUgdGFraW5nIHBsYWNlIG9uIHRoZSBVSSB0aHJlYWQuCisgKiBUaGlzIGlzIG5vdCBhIGdvb2QgcHJhY3RpY2UuIEl0IGlzIG9ubHkgZG9uZSBoZXJlIHRvIG1ha2UgdGhlIGNvZGUgbW9yZSByZWFkYWJsZS4gQSByZWFsCisgKiBhcHBsaWNhdGlvbiBzaG91bGQgdXNlIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkFzeW5jUXVlcnlIYW5kbGVyfQorICogb3Ige0BsaW5rIGFuZHJvaWQub3MuQXN5bmNUYXNrfSBvYmplY3QgdG8gcGVyZm9ybSBvcGVyYXRpb25zIGFzeW5jaHJvbm91c2x5IG9uIGEgc2VwYXJhdGUgdGhyZWFkLgogICovCiBwdWJsaWMgY2xhc3MgVGl0bGVFZGl0b3IgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKIApAQCAtMzgsNzggKzQzLDE0MSBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRfVElUTEVfQUNUSU9OID0gImNvbS5hbmRyb2lkLm5vdGVwYWQuYWN0aW9uLkVESVRfVElUTEUiOwogCi0gICAgLyoqCi0gICAgICogQW4gYXJyYXkgb2YgdGhlIGNvbHVtbnMgd2UgYXJlIGludGVyZXN0ZWQgaW4uCi0gICAgICovCisgICAgLy8gQ3JlYXRlcyBhIHByb2plY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBub3RlIElEIGFuZCB0aGUgbm90ZSBjb250ZW50cy4KICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQUk9KRUNUSU9OID0gbmV3IFN0cmluZ1tdIHsKICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuX0lELCAvLyAwCi0gICAgICAgICAgICBOb3RlUGFkLk5vdGVzLlRJVExFLCAvLyAxCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCAvLyAxCiAgICAgfTsKLSAgICAvKiogSW5kZXggb2YgdGhlIHRpdGxlIGNvbHVtbiAqLworCisgICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSB0aXRsZSBjb2x1bW4gaW4gYSBDdXJzb3IgcmV0dXJuZWQgYnkgdGhlIHByb3ZpZGVyLgogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fSU5ERVhfVElUTEUgPSAxOwogCi0gICAgLyoqCi0gICAgICogQ3Vyc29yIHdoaWNoIHdpbGwgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIG5vdGUgd2hvc2UgdGl0bGUgd2UgYXJlIGVkaXRpbmcuCi0gICAgICovCisgICAgLy8gQSBDdXJzb3Igb2JqZWN0IHRoYXQgd2lsbCBjb250YWluIHRoZSByZXN1bHRzIG9mIHF1ZXJ5aW5nIHRoZSBwcm92aWRlciBmb3IgYSBub3RlLgogICAgIHByaXZhdGUgQ3Vyc29yIG1DdXJzb3I7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgRWRpdFRleHQgZmllbGQgZnJvbSBvdXIgVUkuIEtlZXAgdHJhY2sgb2YgdGhpcyBzbyB3ZSBjYW4gZXh0cmFjdCB0aGUKLSAgICAgKiB0ZXh0IHdoZW4gd2UgYXJlIGZpbmlzaGVkLgotICAgICAqLworICAgIC8vIEFuIEVkaXRUZXh0IG9iamVjdCBmb3IgcHJlc2VydmluZyB0aGUgZWRpdGVkIHRpdGxlLgogICAgIHByaXZhdGUgRWRpdFRleHQgbVRleHQ7CiAKLSAgICAvKioKLSAgICAgKiBUaGUgY29udGVudCBVUkkgdG8gdGhlIG5vdGUgdGhhdCdzIGJlaW5nIGVkaXRlZC4KLSAgICAgKi8KKyAgICAvLyBBIFVSSSBvYmplY3QgZm9yIHRoZSBub3RlIHdob3NlIHRpdGxlIGlzIGJlaW5nIGVkaXRlZC4KICAgICBwcml2YXRlIFVyaSBtVXJpOwogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IEFuZHJvaWQgd2hlbiB0aGUgQWN0aXZpdHkgaXMgZmlyc3Qgc3RhcnRlZC4gRnJvbSB0aGUgaW5jb21pbmcKKyAgICAgKiBJbnRlbnQsIGl0IGRldGVybWluZXMgd2hhdCBraW5kIG9mIGVkaXRpbmcgaXMgZGVzaXJlZCwgYW5kIHRoZW4gZG9lcyBpdC4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CiAKKyAgICAgICAgLy8gU2V0IHRoZSBWaWV3IGZvciB0aGlzIEFjdGl2aXR5IG9iamVjdCdzIFVJLgogICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC50aXRsZV9lZGl0b3IpOwogCi0gICAgICAgIC8vIEdldCB0aGUgdXJpIG9mIHRoZSBub3RlIHdob3NlIHRpdGxlIHdlIHdhbnQgdG8gZWRpdAorICAgICAgICAvLyBHZXQgdGhlIEludGVudCB0aGF0IGFjdGl2YXRlZCB0aGlzIEFjdGl2aXR5LCBhbmQgZnJvbSBpdCBnZXQgdGhlIFVSSSBvZiB0aGUgbm90ZSB3aG9zZQorICAgICAgICAvLyB0aXRsZSB3ZSBuZWVkIHRvIGVkaXQuCiAgICAgICAgIG1VcmkgPSBnZXRJbnRlbnQoKS5nZXREYXRhKCk7CiAKLSAgICAgICAgLy8gR2V0IGEgY3Vyc29yIHRvIGFjY2VzcyB0aGUgbm90ZQotICAgICAgICBtQ3Vyc29yID0gbWFuYWdlZFF1ZXJ5KG1VcmksIFBST0pFQ1RJT04sIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAvKgorICAgICAgICAgKiBVc2luZyB0aGUgVVJJIHBhc3NlZCBpbiB3aXRoIHRoZSB0cmlnZ2VyaW5nIEludGVudCwgZ2V0cyB0aGUgbm90ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTm90ZTogVGhpcyBpcyBiZWluZyBkb25lIG9uIHRoZSBVSSB0aHJlYWQuIEl0IHdpbGwgYmxvY2sgdGhlIHRocmVhZCB1bnRpbCB0aGUgcXVlcnkKKyAgICAgICAgICogY29tcGxldGVzLiBJbiBhIHNhbXBsZSBhcHAsIGdvaW5nIGFnYWluc3QgYSBzaW1wbGUgcHJvdmlkZXIgYmFzZWQgb24gYSBsb2NhbCBkYXRhYmFzZSwKKyAgICAgICAgICogdGhlIGJsb2NrIHdpbGwgYmUgbW9tZW50YXJ5LCBidXQgaW4gYSByZWFsIGFwcCB5b3Ugc2hvdWxkIHVzZQorICAgICAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgb3IgYW5kcm9pZC5vcy5Bc3luY1Rhc2suCisgICAgICAgICAqLworICAgICAgICBtQ3Vyc29yID0gbWFuYWdlZFF1ZXJ5KAorICAgICAgICAgICAgbVVyaSwgICAgICAgIC8vIFRoZSBVUkkgZm9yIHRoZSBub3RlIHRoYXQgaXMgdG8gYmUgcmV0cmlldmVkLgorICAgICAgICAgICAgUFJPSkVDVElPTiwgIC8vIFRoZSBjb2x1bW5zIHRvIHJldHJpZXZlCisgICAgICAgICAgICBudWxsLCAgICAgICAgLy8gTm8gc2VsZWN0aW9uIGNyaXRlcmlhIGFyZSB1c2VkLCBzbyBubyB3aGVyZSBjb2x1bW5zIGFyZSBuZWVkZWQuCisgICAgICAgICAgICBudWxsLCAgICAgICAgLy8gTm8gd2hlcmUgY29sdW1ucyBhcmUgdXNlZCwgc28gbm8gd2hlcmUgdmFsdWVzIGFyZSBuZWVkZWQuCisgICAgICAgICAgICBudWxsICAgICAgICAgLy8gTm8gc29ydCBvcmRlciBpcyBuZWVkZWQuCisgICAgICAgICk7CiAKLSAgICAgICAgLy8gU2V0IHVwIGNsaWNrIGhhbmRsZXJzIGZvciB0aGUgdGV4dCBmaWVsZCBhbmQgYnV0dG9uCisgICAgICAgIC8vIFNldHMgdXAgYSBsaXN0ZW5lciBmb3IgdGhlIEVkaXRUZXh0LiBHZXRzIHRoZSBFZGl0VGV4dCBieSBpdHMgSUQsIHRoZW4gc2V0cyBpdHMKKyAgICAgICAgLy8gb25DbGlja0xpc3RlbmVyIHRvIHRoaXMgQWN0aXZpdHkuCiAgICAgICAgIG1UZXh0ID0gKEVkaXRUZXh0KSB0aGlzLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlKTsKICAgICAgICAgbVRleHQuc2V0T25DbGlja0xpc3RlbmVyKHRoaXMpOwotICAgICAgICAKKworICAgICAgICAvLyBTZXRzIHVwIGEgbGlzdGVuZXIgZm9yIHRoZSBPSyBidXR0b24uIEdldHMgdGhlIEJ1dHRvbiBieSBpdHMgSUQsIHRoZW4gc2V0cyBpdHMKKyAgICAgICAgLy8gb25DbGlja0xpc3RlbmVyIHRvIHRoaXMgQWN0aXZpdHkuCiAgICAgICAgIEJ1dHRvbiBiID0gKEJ1dHRvbikgZmluZFZpZXdCeUlkKFIuaWQub2spOwogICAgICAgICBiLnNldE9uQ2xpY2tMaXN0ZW5lcih0aGlzKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgQWN0aXZpdHkgaXMgYWJvdXQgdG8gY29tZSB0byB0aGUgZm9yZWdyb3VuZC4gVGhpcyBoYXBwZW5zCisgICAgICogd2hlbiB0aGUgQWN0aXZpdHkgY29tZXMgdG8gdGhlIHRvcCBvZiB0aGUgdGFzayBzdGFjaywgT1Igd2hlbiBpdCBpcyBmaXJzdCBzdGFydGluZy4KKyAgICAgKgorICAgICAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpdGxlIGZvciB0aGUgc2VsZWN0ZWQgbm90ZS4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblJlc3VtZSgpIHsKICAgICAgICAgc3VwZXIub25SZXN1bWUoKTsKIAotICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0ZXh0IHdpdGggdGhlIHRpdGxlIGNvbHVtbiBmcm9tIHRoZSBjdXJzb3IKKyAgICAgICAgLy8gVmVyaWZpZXMgdGhhdCB0aGUgcXVlcnkgbWFkZSBpbiBvbkNyZWF0ZSgpIGFjdHVhbGx5IHdvcmtlZC4gSWYgaXQgd29ya2VkLCB0aGVuIHRoZQorICAgICAgICAvLyBDdXJzb3Igb2JqZWN0IGlzIG5vdCBudWxsLiBJZiBpdCBpcyAqZW1wdHkqLCB0aGVuIG1DdXJzb3IuZ2V0Q291bnQoKSA9PSAwLgogICAgICAgICBpZiAobUN1cnNvciAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIC8vIFRoZSBDdXJzb3Igd2FzIGp1c3QgcmV0cmlldmVkLCBzbyBpdHMgaW5kZXggaXMgc2V0IHRvIG9uZSByZWNvcmQgKmJlZm9yZSogdGhlIGZpcnN0CisgICAgICAgICAgICAvLyByZWNvcmQgcmV0cmlldmVkLiBUaGlzIG1vdmVzIGl0IHRvIHRoZSBmaXJzdCByZWNvcmQuCiAgICAgICAgICAgICBtQ3Vyc29yLm1vdmVUb0ZpcnN0KCk7CisKKyAgICAgICAgICAgIC8vIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpdGxlIHRleHQgaW4gdGhlIEVkaXRUZXh0IG9iamVjdC4KICAgICAgICAgICAgIG1UZXh0LnNldFRleHQobUN1cnNvci5nZXRTdHJpbmcoQ09MVU1OX0lOREVYX1RJVExFKSk7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgQWN0aXZpdHkgbG9zZXMgZm9jdXMuCisgICAgICoKKyAgICAgKiBGb3IgQWN0aXZpdHkgb2JqZWN0cyB0aGF0IGVkaXQgaW5mb3JtYXRpb24sIG9uUGF1c2UoKSBtYXkgYmUgdGhlIG9uZSBwbGFjZSB3aGVyZSBjaGFuZ2VzIGFyZQorICAgICAqIHNhdmVkLiBUaGUgQW5kcm9pZCBhcHBsaWNhdGlvbiBtb2RlbCBpcyBwcmVkaWNhdGVkIG9uIHRoZSBpZGVhIHRoYXQgInNhdmUiIGFuZCAiZXhpdCIgYXJlbid0CisgICAgICogcmVxdWlyZWQgYWN0aW9ucy4gV2hlbiB1c2VycyBuYXZpZ2F0ZSBhd2F5IGZyb20gYW4gQWN0aXZpdHksIHRoZXkgc2hvdWxkbid0IGhhdmUgdG8gZ28gYmFjaworICAgICAqIHRvIGl0IHRvIGNvbXBsZXRlIHRoZWlyIHdvcmsuIFRoZSBhY3Qgb2YgZ29pbmcgYXdheSBzaG91bGQgc2F2ZSBldmVyeXRoaW5nIGFuZCBsZWF2ZSB0aGUKKyAgICAgKiBBY3Rpdml0eSBpbiBhIHN0YXRlIHdoZXJlIEFuZHJvaWQgY2FuIGRlc3Ryb3kgaXQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogVXBkYXRlcyB0aGUgbm90ZSB3aXRoIHRoZSB0ZXh0IGN1cnJlbnRseSBpbiB0aGUgdGV4dCBib3guCisgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHJvdGVjdGVkIHZvaWQgb25QYXVzZSgpIHsKICAgICAgICAgc3VwZXIub25QYXVzZSgpOwogCisgICAgICAgIC8vIFZlcmlmaWVzIHRoYXQgdGhlIHF1ZXJ5IG1hZGUgaW4gb25DcmVhdGUoKSBhY3R1YWxseSB3b3JrZWQuIElmIGl0IHdvcmtlZCwgdGhlbiB0aGUKKyAgICAgICAgLy8gQ3Vyc29yIG9iamVjdCBpcyBub3QgbnVsbC4gSWYgaXQgaXMgKmVtcHR5KiwgdGhlbiBtQ3Vyc29yLmdldENvdW50KCkgPT0gMC4KICAgICAgICAgaWYgKG1DdXJzb3IgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gV3JpdGUgdGhlIHRpdGxlIGJhY2sgdG8gdGhlIG5vdGUgCisKKyAgICAgICAgICAgIC8vIENyZWF0ZXMgYSB2YWx1ZXMgbWFwIGZvciB1cGRhdGluZyB0aGUgcHJvdmlkZXIuCiAgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7Ci0gICAgICAgICAgICB2YWx1ZXMucHV0KE5vdGVzLlRJVExFLCBtVGV4dC5nZXRUZXh0KCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBnZXRDb250ZW50UmVzb2x2ZXIoKS51cGRhdGUobVVyaSwgdmFsdWVzLCBudWxsLCBudWxsKTsKKworICAgICAgICAgICAgLy8gSW4gdGhlIHZhbHVlcyBtYXAsIHNldHMgdGhlIHRpdGxlIHRvIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBlZGl0IGJveC4KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwgbVRleHQuZ2V0VGV4dCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlcyB0aGUgcHJvdmlkZXIgd2l0aCB0aGUgbm90ZSdzIG5ldyB0aXRsZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGJlaW5nIGRvbmUgb24gdGhlIFVJIHRocmVhZC4gSXQgd2lsbCBibG9jayB0aGUgdGhyZWFkIHVudGlsIHRoZQorICAgICAgICAgICAgICogdXBkYXRlIGNvbXBsZXRlcy4gSW4gYSBzYW1wbGUgYXBwLCBnb2luZyBhZ2FpbnN0IGEgc2ltcGxlIHByb3ZpZGVyIGJhc2VkIG9uIGEKKyAgICAgICAgICAgICAqIGxvY2FsIGRhdGFiYXNlLCB0aGUgYmxvY2sgd2lsbCBiZSBtb21lbnRhcnksIGJ1dCBpbiBhIHJlYWwgYXBwIHlvdSBzaG91bGQgdXNlCisgICAgICAgICAgICAgKiBhbmRyb2lkLmNvbnRlbnQuQXN5bmNRdWVyeUhhbmRsZXIgb3IgYW5kcm9pZC5vcy5Bc3luY1Rhc2suCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGdldENvbnRlbnRSZXNvbHZlcigpLnVwZGF0ZSgKKyAgICAgICAgICAgICAgICBtVXJpLCAgICAvLyBUaGUgVVJJIGZvciB0aGUgbm90ZSB0byB1cGRhdGUuCisgICAgICAgICAgICAgICAgdmFsdWVzLCAgLy8gVGhlIHZhbHVlcyBtYXAgY29udGFpbmluZyB0aGUgY29sdW1ucyB0byB1cGRhdGUgYW5kIHRoZSB2YWx1ZXMgdG8gdXNlLgorICAgICAgICAgICAgICAgIG51bGwsICAgIC8vIE5vIHNlbGVjdGlvbiBjcml0ZXJpYSBpcyB1c2VkLCBzbyBubyAid2hlcmUiIGNvbHVtbnMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgICAgICBudWxsICAgICAvLyBObyAid2hlcmUiIGNvbHVtbnMgYXJlIHVzZWQsIHNvIG5vICJ3aGVyZSIgdmFsdWVzIGFyZSBuZWVkZWQuCisgICAgICAgICAgICApOwogICAgICAgICB9CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGFueXdoZXJlIGluIHRoZSB0aXRsZSB0ZXh0IGJveC4KKyAgICAgKgorICAgICAqIEl0IGNhbGxzIGZpbmlzaCgpLCB3aGljaCBpbW1lZGlhdGVseSB0cmlnZ2VycyB0aGUgb25QYXVzZSgpIG1ldGhvZCBpbiB0aGlzIEFjdGl2aXR5LiBJbgorICAgICAqIHR1cm4sIG9uUGF1c2UoKSBzYXZlcyB0aGUgdGV4dCBjdXJyZW50bHkgaW4gdGhlIHRpdGxlIHRleHQgYm94IHRvIHRoZSBub3RlLgorICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgIC8vIFdoZW4gdGhlIHVzZXIgY2xpY2tzLCBqdXN0IGZpbmlzaCB0aGlzIGFjdGl2aXR5LgotICAgICAgICAvLyBvblBhdXNlIHdpbGwgYmUgY2FsbGVkLCBhbmQgd2Ugc2F2ZSBvdXIgZGF0YSB0aGVyZS4KKworICAgICAgICAvLyBDYWxscyBmaW5pc2ggdG8gZm9yY2UgdGhlIEFjdGl2aXR5IHRvIHNodXQgZG93bi4gSW4gdGhlIGxpZmVjeWNsZSwgdGhpcyBmb3JjZXMgYSBjYWxsIHRvCisgICAgICAgIC8vIG9uUGF1c2UoKSwgd2hpY2ggc2F2ZXMgdGhlIHdvcmsgdGhlIHVzZXIgaGFzIGRvbmUuCiAgICAgICAgIGZpbmlzaCgpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2dvb2dsZS9wcm92aWRlci9Ob3RlUGFkLmphdmEgYi9zYW1wbGVzL05vdGVQYWQvc3JjL2NvbS9nb29nbGUvcHJvdmlkZXIvTm90ZVBhZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGRlNjliLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC9zcmMvY29tL2dvb2dsZS9wcm92aWRlci9Ob3RlUGFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm92aWRlcjsKLQotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLnByb3ZpZGVyLkJhc2VDb2x1bW5zOwotCi0vKioKLSAqIENvbnZlbmllbmNlIGRlZmluaXRpb25zIGZvciBOb3RlUGFkUHJvdmlkZXIKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5vdGVQYWQgewotICAgIC8qKgotICAgICAqIE5vdGVzIHRhYmxlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3RlcyBpbXBsZW1lbnRzIEJhc2VDb2x1bW5zIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBjb250ZW50Oi8vIHN0eWxlIFVSTCBmb3IgdGhpcyB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBVcmkgQ09OVEVOVF9VUkkKLSAgICAgICAgICAgICAgICA9IFVyaS5wYXJzZSgiY29udGVudDovL2NvbS5nb29nbGUucHJvdmlkZXIuTm90ZVBhZC9ub3RlcyIpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBzb3J0IG9yZGVyIGZvciB0aGlzIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NPUlRfT1JERVIgPSAibW9kaWZpZWQgREVTQyI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aXRsZSBvZiB0aGUgbm90ZQotICAgICAgICAgKiA8UD5UeXBlOiBURVhUPC9QPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElUTEUgPSAidGl0bGUiOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgbm90ZSBpdHNlbGYKLSAgICAgICAgICogPFA+VHlwZTogVEVYVDwvUD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEUgPSAibm90ZSI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lc3RhbXAgZm9yIHdoZW4gdGhlIG5vdGUgd2FzIGNyZWF0ZWQKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVBVEVEX0RBVEUgPSAiY3JlYXRlZCI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSB0aW1lc3RhbXAgZm9yIHdoZW4gdGhlIG5vdGUgd2FzIGxhc3QgbW9kaWZpZWQKLSAgICAgICAgICogPFA+VHlwZTogSU5URUdFUiAobG9uZyk8L1A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RJRklFRF9EQVRFID0gIm1vZGlmaWVkIjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvQW5kcm9pZC5tayBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VmYWZjLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtc3ViZGlyLWphdmEtZmlsZXMpCi0KLUxPQ0FMX0pBVkFfTElCUkFSSUVTIDo9IGFuZHJvaWQudGVzdC5ydW5uZXIKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE5vdGVQYWRUZXN0cwotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9JTlNUUlVNRU5UQVRJT05fRk9SIDo9IE5vdGVQYWQKLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGMzOWRlLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdGVkLnByb2plY3QuZGlyPS4uCmRpZmYgLS1naXQgYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkVGVzdC5qYXZhIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZEFjdGl2aXR5VGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHNhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRUZXN0LmphdmEKcmVuYW1lIHRvIHNhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRBY3Rpdml0eVRlc3QuamF2YQppbmRleCA4MGY3MWQyLi5jOGFjZGYwIDEwMDY0NAotLS0gYS9zYW1wbGVzL05vdGVQYWQvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvbm90ZXBhZC9Ob3RlUGFkVGVzdC5qYXZhCisrKyBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRBY3Rpdml0eVRlc3QuamF2YQpAQCAtMjQsMTMgKzI0LDEzIEBACiAgKiBNYWtlIHN1cmUgdGhhdCB0aGUgbWFpbiBsYXVuY2hlciBhY3Rpdml0eSBvcGVucyB1cCBwcm9wZXJseSwgd2hpY2ggd2lsbCBiZQogICogdmVyaWZpZWQgYnkge0BsaW5rICN0ZXN0QWN0aXZpdHlUZXN0Q2FzZVNldFVwUHJvcGVybHl9LgogICovCi1wdWJsaWMgY2xhc3MgTm90ZVBhZFRlc3QgZXh0ZW5kcyBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMjxOb3Rlc0xpc3Q+IHsKK3B1YmxpYyBjbGFzcyBOb3RlUGFkQWN0aXZpdHlUZXN0IGV4dGVuZHMgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8Tm90ZXNMaXN0PiB7CiAKICAgICAvKioKICAgICAgKiBDcmVhdGVzIGFuIHtAbGluayBBY3Rpdml0eUluc3RydW1lbnRhdGlvblRlc3RDYXNlMn0gZm9yIHRoZSB7QGxpbmsgTm90ZXNMaXN0fSBhY3Rpdml0eS4KICAgICAgKi8KLSAgICBwdWJsaWMgTm90ZVBhZFRlc3QoKSB7Ci0gICAgICAgIHN1cGVyKE5vdGVzTGlzdC5jbGFzcyk7CisgICAgcHVibGljIE5vdGVQYWRBY3Rpdml0eVRlc3QoKSB7CisgICAgICAgIHN1cGVyKCJjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQudGVzdCIsTm90ZXNMaXN0LmNsYXNzKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlclRlc3QuamF2YSBiL3NhbXBsZXMvTm90ZVBhZC90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9ub3RlcGFkL05vdGVQYWRQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzkwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9Ob3RlUGFkL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL25vdGVwYWQvTm90ZVBhZFByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLm5vdGVwYWQ7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFVyaXM7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5zcWxpdGUuU1FMaXRlRGF0YWJhc2U7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudGVzdC5Qcm92aWRlclRlc3RDYXNlMjsKK2ltcG9ydCBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyOworCitpbXBvcnQgamF2YS51dGlsLkNhbGVuZGFyOworaW1wb3J0IGphdmEudXRpbC5HcmVnb3JpYW5DYWxlbmRhcjsKKworLyoKKyAqLworLyoqCisgKiBUaGlzIGNsYXNzIHRlc3RzIHRoZSBjb250ZW50IHByb3ZpZGVyIGZvciB0aGUgTm90ZSBQYWQgc2FtcGxlIGFwcGxpY2F0aW9uLgorICoKKyAqIFRvIGxlYXJuIGhvdyB0byBydW4gYW4gZW50aXJlIHRlc3QgcGFja2FnZSBvciBvbmUgb2YgaXRzIGNsYXNzZXMsIHBsZWFzZSBzZWUKKyAqICJUZXN0aW5nIGluIEVjbGlwc2UsIHdpdGggQURUIiBvciAiVGVzdGluZyBpbiBPdGhlciBJREVzIiBpbiB0aGUgRGV2ZWxvcGVyIEd1aWRlLgorICovCitwdWJsaWMgY2xhc3MgTm90ZVBhZFByb3ZpZGVyVGVzdCBleHRlbmRzIFByb3ZpZGVyVGVzdENhc2UyPE5vdGVQYWRQcm92aWRlcj4geworCisgICAgLy8gQSBVUkkgdGhhdCB0aGUgcHJvdmlkZXIgZG9lcyBub3Qgb2ZmZXIsIGZvciB0ZXN0aW5nIGVycm9yIGhhbmRsaW5nLgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVyaSBJTlZBTElEX1VSSSA9CisgICAgICAgIFVyaS53aXRoQXBwZW5kZWRQYXRoKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICJpbnZhbGlkIik7CisKKyAgICAvLyBDb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgbW9ja2VkIGNvbnRlbnQgcmVzb2x2ZXIgZm9yIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgorICAgIHByaXZhdGUgTW9ja0NvbnRlbnRSZXNvbHZlciBtTW9ja1Jlc29sdmVyOworCisgICAgLy8gQ29udGFpbnMgYW4gU1FMaXRlIGRhdGFiYXNlLCB1c2VkIGFzIHRlc3QgZGF0YQorICAgIHByaXZhdGUgU1FMaXRlRGF0YWJhc2UgbURiOworCisgICAgLy8gQ29udGFpbnMgdGhlIHRlc3QgZGF0YSwgYXMgYW4gYXJyYXkgb2YgTm90ZUluZm8gaW5zdGFuY2VzLgorICAgIHByaXZhdGUgZmluYWwgTm90ZUluZm9bXSBURVNUX05PVEVTID0geworICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGUwIiwgIlRoaXMgaXMgbm90ZSAwIiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTEiLCAiVGhpcyBpcyBub3RlIDEiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlMiIsICJUaGlzIGlzIG5vdGUgMiIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGUzIiwgIlRoaXMgaXMgbm90ZSAzIiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTQiLCAiVGhpcyBpcyBub3RlIDQiKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlNSIsICJUaGlzIGlzIG5vdGUgNSIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU2IiwgIlRoaXMgaXMgbm90ZSA2IiksCisgICAgICAgIG5ldyBOb3RlSW5mbygiTm90ZTciLCAiVGhpcyBpcyBub3RlIDciKSwKKyAgICAgICAgbmV3IE5vdGVJbmZvKCJOb3RlOCIsICJUaGlzIGlzIG5vdGUgOCIpLAorICAgICAgICBuZXcgTm90ZUluZm8oIk5vdGU5IiwgIlRoaXMgaXMgbm90ZSA5IikgfTsKKworICAgIC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gb25lIGRheSAobWlsbGlzZWNvbmRzICogc2Vjb25kcyAqIG1pbnV0ZXMgKiBob3VycykKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9EQVlfTUlMTElTID0gMTAwMCAqIDYwICogNjAgKiAyNDsKKworICAgIC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gb25lIHdlZWsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9XRUVLX01JTExJUyA9IE9ORV9EQVlfTUlMTElTICogNzsKKworICAgIC8vIENyZWF0ZXMgYSBjYWxlbmRhciBvYmplY3QgZXF1YWwgdG8gSmFudWFyeSAxLCAyMDEwIGF0IDEyIG1pZG5pZ2h0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgR3JlZ29yaWFuQ2FsZW5kYXIgVEVTVF9DQUxFTkRBUiA9CisgICAgICAgIG5ldyBHcmVnb3JpYW5DYWxlbmRhcigyMDEwLCBDYWxlbmRhci5KQU5VQVJZLCAxLCAwLCAwLCAwKTsKKworICAgIC8vIFN0b3JlcyBhIHRpbWVzdGFtcCB2YWx1ZSwgc2V0IHRvIGFuIGFyYml0cmFyeSBzdGFydGluZyBwb2ludAorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGxvbmcgU1RBUlRfREFURSA9IFRFU1RfQ0FMRU5EQVIuZ2V0VGltZUluTWlsbGlzKCk7CisKKyAgICAvKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB0aGUgdGVzdCBjYXNlIGNsYXNzLgorICAgICAqIENhbGxzIHRoZSBzdXBlciBjb25zdHJ1Y3RvciB3aXRoIHRoZSBjbGFzcyBuYW1lIG9mIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0IGFuZCB0aGUKKyAgICAgKiBhdXRob3JpdHkgbmFtZSBvZiB0aGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIE5vdGVQYWRQcm92aWRlclRlc3QoKSB7CisgICAgICAgIHN1cGVyKE5vdGVQYWRQcm92aWRlci5jbGFzcywgTm90ZVBhZC5BVVRIT1JJVFkpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBTZXRzIHVwIHRoZSB0ZXN0IGVudmlyb25tZW50IGJlZm9yZSBlYWNoIHRlc3QgbWV0aG9kLiBDcmVhdGVzIGEgbW9jayBjb250ZW50IHJlc29sdmVyLAorICAgICAqIGdldHMgdGhlIHByb3ZpZGVyIHVuZGVyIHRlc3QsIGFuZCBjcmVhdGVzIGEgbmV3IGRhdGFiYXNlIGZvciB0aGUgcHJvdmlkZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQ2FsbHMgdGhlIGJhc2UgY2xhc3MgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gR2V0cyB0aGUgcmVzb2x2ZXIgZm9yIHRoaXMgdGVzdC4KKyAgICAgICAgbU1vY2tSZXNvbHZlciA9IGdldE1vY2tDb250ZW50UmVzb2x2ZXIoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXRzIGEgaGFuZGxlIHRvIHRoZSBkYXRhYmFzZSB1bmRlcmx5aW5nIHRoZSBwcm92aWRlci4gR2V0cyB0aGUgcHJvdmlkZXIgaW5zdGFuY2UKKyAgICAgICAgICogY3JlYXRlZCBpbiBzdXBlci5zZXRVcCgpLCBnZXRzIHRoZSBEYXRhYmFzZU9wZW5IZWxwZXIgZm9yIHRoZSBwcm92aWRlciwgYW5kIGdldHMKKyAgICAgICAgICogYSBkYXRhYmFzZSBvYmplY3QgZnJvbSB0aGUgaGVscGVyLgorICAgICAgICAgKi8KKyAgICAgICAgbURiID0gZ2V0UHJvdmlkZXIoKS5nZXRPcGVuSGVscGVyRm9yVGVzdCgpLmdldFdyaXRhYmxlRGF0YWJhc2UoKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgZWFjaCB0ZXN0IG1ldGhvZCwgdG8gY2xlYW4gdXAgdGhlIGN1cnJlbnQgZml4dHVyZS4gU2luY2UKKyAgICAgKiAgdGhpcyBzYW1wbGUgdGVzdCBjYXNlIHJ1bnMgaW4gYW4gaXNvbGF0ZWQgY29udGV4dCwgbm8gY2xlYW51cCBpcyBuZWNlc3NhcnkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgdXAgdGVzdCBkYXRhLgorICAgICAqIFRoZSB0ZXN0IGRhdGEgaXMgaW4gYW4gU1FMIGRhdGFiYXNlLiBJdCBpcyBjcmVhdGVkIGluIHNldFVwKCkgd2l0aG91dCBhbnkgZGF0YSwKKyAgICAgKiBhbmQgcG9wdWxhdGVkIGluIGluc2VydERhdGEgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnNlcnREYXRhKCkgeworICAgICAgICAvLyBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBDb250ZW50VmFsdWVzIG1hcCB0eXBlIGV4cGVjdGVkIGJ5IGRhdGFiYXNlIGluc2VydGlvbnMKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworCisgICAgICAgIC8vIFNldHMgdXAgdGVzdCBkYXRhCisgICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBURVNUX05PVEVTLmxlbmd0aDsgaW5kZXgrKykgeworCisgICAgICAgICAgICAvLyBTZXQgdGhlIGNyZWF0aW9uIGFuZCBtb2RpZmljYXRpb24gZGF0ZSBmb3IgdGhlIG5vdGUKKyAgICAgICAgICAgIFRFU1RfTk9URVNbaW5kZXhdLnNldENyZWF0aW9uRGF0ZShTVEFSVF9EQVRFICsgKGluZGV4ICogT05FX0RBWV9NSUxMSVMpKTsKKyAgICAgICAgICAgIFRFU1RfTk9URVNbaW5kZXhdLnNldE1vZGlmaWNhdGlvbkRhdGUoU1RBUlRfREFURSArIChpbmRleCAqIE9ORV9XRUVLX01JTExJUykpOworCisgICAgICAgICAgICAvLyBBZGRzIGEgcmVjb3JkIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgICAgIG1EYi5pbnNlcnRPclRocm93KAorICAgICAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuVEFCTEVfTkFNRSwgICAgICAgICAgICAgLy8gdGhlIHRhYmxlIG5hbWUgZm9yIHRoZSBpbnNlcnQKKyAgICAgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFLCAgICAgIC8vIGNvbHVtbiBzZXQgdG8gbnVsbCBpZiBlbXB0eSB2YWx1ZXMgbWFwCisgICAgICAgICAgICAgICAgVEVTVF9OT1RFU1tpbmRleF0uZ2V0Q29udGVudFZhbHVlcygpICAvLyB0aGUgdmFsdWVzIG1hcCB0byBpbnNlcnQKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHRoZSBwcm92aWRlcidzIHB1YmxpY2x5IGF2YWlsYWJsZSBVUklzLiBJZiB0aGUgVVJJIGlzIG5vdCBvbmUgdGhhdCB0aGUgcHJvdmlkZXIKKyAgICAgKiB1bmRlcnN0YW5kcywgdGhlIHByb3ZpZGVyIHNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24uIEl0IGFsc28gdGVzdHMgdGhlIHByb3ZpZGVyJ3MgZ2V0VHlwZSgpCisgICAgICogbWV0aG9kIGZvciBlYWNoIFVSSSwgd2hpY2ggc2hvdWxkIHJldHVybiB0aGUgTUlNRSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlBbmRHZXRUeXBlKCkgeworICAgICAgICAvLyBUZXN0cyB0aGUgTUlNRSB0eXBlIGZvciB0aGUgbm90ZXMgdGFibGUgVVJJLgorICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFR5cGUoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSk7CisgICAgICAgIGFzc2VydEVxdWFscyhOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVFlQRSwgbWltZVR5cGUpOworCisgICAgICAgIC8vIFRlc3RzIHRoZSBNSU1FIHR5cGUgZm9yIHRoZSBsaXZlIGZvbGRlciBVUkkuCisgICAgICAgIG1pbWVUeXBlID0gbU1vY2tSZXNvbHZlci5nZXRUeXBlKE5vdGVQYWQuTm90ZXMuTElWRV9GT0xERVJfVVJJKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9UWVBFLCBtaW1lVHlwZSk7CisKKyAgICAgICAgLy8gQ3JlYXRlcyBhIFVSSSB3aXRoIGEgcGF0dGVybiBmb3Igbm90ZSBpZHMuIFRoZSBpZCBkb2Vzbid0IGhhdmUgdG8gZXhpc3QuCisgICAgICAgIFVyaSBub3RlSWRVcmkgPSBDb250ZW50VXJpcy53aXRoQXBwZW5kZWRJZChOb3RlUGFkLk5vdGVzLkNPTlRFTlRfSURfVVJJX0JBU0UsIDEpOworCisgICAgICAgIC8vIEdldHMgdGhlIG5vdGUgSUQgVVJJIE1JTUUgdHlwZS4KKyAgICAgICAgbWltZVR5cGUgPSBtTW9ja1Jlc29sdmVyLmdldFR5cGUobm90ZUlkVXJpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JVEVNX1RZUEUsIG1pbWVUeXBlKTsKKworICAgICAgICAvLyBUZXN0cyBhbiBpbnZhbGlkIFVSSS4gVGhpcyBzaG91bGQgdGhyb3cgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgorICAgICAgICBtaW1lVHlwZSA9IG1Nb2NrUmVzb2x2ZXIuZ2V0VHlwZShJTlZBTElEX1VSSSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0cyB0aGUgcHJvdmlkZXIncyBwdWJsaWMgQVBJIGZvciBxdWVyeWluZyBkYXRhIGluIHRoZSB0YWJsZSwgdXNpbmcgdGhlIFVSSSBmb3IKKyAgICAgKiBhIGRhdGFzZXQgb2YgcmVjb3Jkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcmllc09uTm90ZXNVcmkoKSB7CisgICAgICAgIC8vIERlZmluZXMgYSBwcm9qZWN0aW9uIG9mIGNvbHVtbiBuYW1lcyB0byByZXR1cm4gZm9yIGEgcXVlcnkKKyAgICAgICAgZmluYWwgU3RyaW5nW10gVEVTVF9QUk9KRUNUSU9OID0geworICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSwKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUKKyAgICAgICAgfTsKKworICAgICAgICAvLyBEZWZpbmVzIGEgc2VsZWN0aW9uIGNvbHVtbiBmb3IgdGhlIHF1ZXJ5LiBXaGVuIHRoZSBzZWxlY3Rpb24gY29sdW1ucyBhcmUgcGFzc2VkCisgICAgICAgIC8vIHRvIHRoZSBxdWVyeSwgdGhlIHNlbGVjdGlvbiBhcmd1bWVudHMgcmVwbGFjZSB0aGUgcGxhY2Vob2xkZXJzLgorICAgICAgICBmaW5hbCBTdHJpbmcgVElUTEVfU0VMRUNUSU9OID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAgIC8vIERlZmluZXMgdGhlIHNlbGVjdGlvbiBjb2x1bW5zIGZvciBhIHF1ZXJ5LgorICAgICAgICBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX0NPTFVNTlMgPQorICAgICAgICAgICAgVElUTEVfU0VMRUNUSU9OICsgIiBPUiAiICsgVElUTEVfU0VMRUNUSU9OICsgIiBPUiAiICsgVElUTEVfU0VMRUNUSU9OOworCisgICAgICAgICAvLyBEZWZpbmVzIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBzZWxlY3Rpb24gY29sdW1ucy4KKyAgICAgICAgZmluYWwgU3RyaW5nW10gU0VMRUNUSU9OX0FSR1MgPSB7ICJOb3RlMCIsICJOb3RlMSIsICJOb3RlNSIgfTsKKworICAgICAgICAgLy8gRGVmaW5lcyBhIHF1ZXJ5IHNvcnQgb3JkZXIKKyAgICAgICAgZmluYWwgU3RyaW5nIFNPUlRfT1JERVIgPSBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiBBU0MiOworCisgICAgICAgIC8vIFF1ZXJ5IHN1YnRlc3QgMS4KKyAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHJlY29yZHMgaW4gdGhlIHRhYmxlLCB0aGUgcmV0dXJuZWQgY3Vyc29yIGZyb20gYSBxdWVyeSBzaG91bGQgYmUgZW1wdHkuCisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBVUkkgZm9yIHRoZSBtYWluIGRhdGEgdGFibGUKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBwcm9qZWN0aW9uLCBnZXQgYWxsIGNvbHVtbnMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZWxlY3Rpb24gY3JpdGVyaWEsIGdldCBhbGwgcmVjb3JkcworICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHNlbGVjdGlvbiBhcmd1bWVudHMKKyAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgcmV0dXJuZWQgY3Vyc29yIGNvbnRhaW5zIG5vIHJlY29yZHMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgICAgLy8gUXVlcnkgc3VidGVzdCAyLgorICAgICAgICAgLy8gSWYgdGhlIHRhYmxlIGNvbnRhaW5zIHJlY29yZHMsIHRoZSByZXR1cm5lZCBjdXJzb3IgZnJvbSBhIHF1ZXJ5IHNob3VsZCBjb250YWluIHJlY29yZHMuCisKKyAgICAgICAgLy8gSW5zZXJ0cyB0aGUgdGVzdCBkYXRhIGludG8gdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyBkYXRhIHNvdXJjZQorICAgICAgICBpbnNlcnREYXRhKCk7CisKKyAgICAgICAgLy8gR2V0cyBhbGwgdGhlIGNvbHVtbnMgZm9yIGFsbCB0aGUgcm93cyBpbiB0aGUgdGFibGUKKyAgICAgICAgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksICAvLyB0aGUgVVJJIGZvciB0aGUgbWFpbiBkYXRhIHRhYmxlCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgZ2V0IGFsbCBjb2x1bW5zCisgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhLCBnZXQgYWxsIHJlY29yZHMKKyAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZWxlY3Rpb24gYXJndW1lbnRzCisgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgcmV0dXJuZWQgY3Vyc29yIGNvbnRhaW5zIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIHRoZSBzaXplIG9mIHRoZQorICAgICAgICAvLyB0ZXN0IGRhdGEgYXJyYXkuCisgICAgICAgIGFzc2VydEVxdWFscyhURVNUX05PVEVTLmxlbmd0aCwgY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAgIC8vIFF1ZXJ5IHN1YnRlc3QgMy4KKyAgICAgICAgLy8gQSBxdWVyeSB0aGF0IHVzZXMgYSBwcm9qZWN0aW9uIHNob3VsZCByZXR1cm4gYSBjdXJzb3Igd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgY29sdW1ucworICAgICAgICAvLyBhcyB0aGUgcHJvamVjdGlvbiwgd2l0aCB0aGUgc2FtZSBuYW1lcywgaW4gdGhlIHNhbWUgb3JkZXIuCisgICAgICAgIEN1cnNvciBwcm9qZWN0aW9uQ3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgIC8vIHRoZSBVUkkgZm9yIHRoZSBtYWluIGRhdGEgdGFibGUKKyAgICAgICAgICAgICAgVEVTVF9QUk9KRUNUSU9OLCAgICAgICAgICAgIC8vIGdldCB0aGUgdGl0bGUsIG5vdGUsIGFuZCBtb2QgZGF0ZSBjb2x1bW5zCisgICAgICAgICAgICAgIG51bGwsICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBzZWxlY3Rpb24gY29sdW1ucywgZ2V0IGFsbCB0aGUgcmVjb3JkcworICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhCisgICAgICAgICAgICAgIG51bGwgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGVmYXVsdCB0aGUgc29ydCBvcmRlcgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIGN1cnNvciBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgcHJvamVjdGlvbgorICAgICAgICBhc3NlcnRFcXVhbHMoVEVTVF9QUk9KRUNUSU9OLmxlbmd0aCwgcHJvamVjdGlvbkN1cnNvci5nZXRDb2x1bW5Db3VudCgpKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBjb2x1bW5zIGluIHRoZSBjdXJzb3IgYW5kIGluIHRoZSBwcm9qZWN0aW9uIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgLy8gVGhpcyBhbHNvIHZlcmlmaWVzIHRoYXQgdGhlIG5hbWVzIGFyZSBpbiB0aGUgc2FtZSBvcmRlci4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPSkVDVElPTlswXSwgcHJvamVjdGlvbkN1cnNvci5nZXRDb2x1bW5OYW1lKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPSkVDVElPTlsxXSwgcHJvamVjdGlvbkN1cnNvci5nZXRDb2x1bW5OYW1lKDEpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFU1RfUFJPSkVDVElPTlsyXSwgcHJvamVjdGlvbkN1cnNvci5nZXRDb2x1bW5OYW1lKDIpKTsKKworICAgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDQKKyAgICAgICAgLy8gQSBxdWVyeSB0aGF0IHVzZXMgc2VsZWN0aW9uIGNyaXRlcmlhIHNob3VsZCByZXR1cm4gb25seSB0aG9zZSByb3dzIHRoYXQgbWF0Y2ggdGhlCisgICAgICAgIC8vIGNyaXRlcmlhLiBVc2UgYSBwcm9qZWN0aW9uIHNvIHRoYXQgaXQncyBlYXN5IHRvIGdldCB0aGUgZGF0YSBpbiBhIHBhcnRpY3VsYXIgY29sdW1uLgorICAgICAgICBwcm9qZWN0aW9uQ3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBVUkkgZm9yIHRoZSBtYWluIGRhdGEgdGFibGUKKyAgICAgICAgICAgIFRFU1RfUFJPSkVDVElPTiwgICAgICAgICAgIC8vIGdldCB0aGUgdGl0bGUsIG5vdGUsIGFuZCBtb2QgZGF0ZSBjb2x1bW5zCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAvLyBzZWxlY3Qgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgU0VMRUNUSU9OX0FSR1MsICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlcyAiTm90ZTAiLCAiTm90ZTEiLCBvciAiTm90ZTUiCisgICAgICAgICAgICBTT1JUX09SREVSICAgICAgICAgICAgICAgICAvLyBzb3J0IGFzY2VuZGluZyBvbiB0aGUgdGl0bGUgY29sdW1uCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBjdXJzb3IgaGFzIHRoZSBzYW1lIG51bWJlciBvZiByb3dzIGFzIHRoZSBudW1iZXIgb2Ygc2VsZWN0aW9uIGFyZ3VtZW50cworICAgICAgICBhc3NlcnRFcXVhbHMoU0VMRUNUSU9OX0FSR1MubGVuZ3RoLCBwcm9qZWN0aW9uQ3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHByb2plY3Rpb25DdXJzb3IubW92ZVRvTmV4dCgpKSB7CisKKyAgICAgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgc2VsZWN0aW9uIGFyZ3VtZW50IGF0IHRoZSBjdXJyZW50IGluZGV4IG1hdGNoZXMgdGhlIHZhbHVlIG9mCisgICAgICAgICAgICAvLyB0aGUgdGl0bGUgY29sdW1uIChjb2x1bW4gMCkgaW4gdGhlIGN1cnJlbnQgcmVjb3JkIG9mIHRoZSBjdXJzb3IKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTRUxFQ1RJT05fQVJHU1tpbmRleF0sIHByb2plY3Rpb25DdXJzb3IuZ2V0U3RyaW5nKDApKTsKKworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgaW5kZXggcG9pbnRlciBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBzZWxlY3Rpb24gYXJndW1lbnRzLCBzbworICAgICAgICAvLyB0aGF0IHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHRlc3RlZCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNFTEVDVElPTl9BUkdTLmxlbmd0aCwgaW5kZXgpOworCisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0cyBxdWVyaWVzIGFnYWluc3QgdGhlIHByb3ZpZGVyLCB1c2luZyB0aGUgbm90ZSBpZCBVUkkuIFRoaXMgVVJJIGVuY29kZXMgYSBzaW5nbGUKKyAgICAgKiByZWNvcmQgSUQuIFRoZSBwcm92aWRlciBzaG91bGQgb25seSByZXR1cm4gMCBvciAxIHJlY29yZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcmllc09uTm90ZUlkVXJpKCkgeworICAgICAgLy8gRGVmaW5lcyB0aGUgc2VsZWN0aW9uIGNvbHVtbiBmb3IgYSBxdWVyeS4gVGhlICI/IiBpcyByZXBsYWNlZCBieSBlbnRyaWVzIGluIHRoZQorICAgICAgLy8gc2VsZWN0aW9uIGFyZ3VtZW50IGFycmF5CisgICAgICBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX0NPTFVNTlMgPSBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiA9ICIgKyAiPyI7CisKKyAgICAgIC8vIERlZmluZXMgdGhlIGFyZ3VtZW50IGZvciB0aGUgc2VsZWN0aW9uIGNvbHVtbi4KKyAgICAgIGZpbmFsIFN0cmluZ1tdIFNFTEVDVElPTl9BUkdTID0geyAiTm90ZTEiIH07CisKKyAgICAgIC8vIEEgc29ydCBvcmRlciBmb3IgdGhlIHF1ZXJ5LgorICAgICAgZmluYWwgU3RyaW5nIFNPUlRfT1JERVIgPSBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiBBU0MiOworCisgICAgICAvLyBDcmVhdGVzIGEgcHJvamVjdGlvbiBpbmNsdWRlcyB0aGUgbm90ZSBpZCBjb2x1bW4sIHNvIHRoYXQgbm90ZSBpZCBjYW4gYmUgcmV0cmlldmVkLgorICAgICAgZmluYWwgU3RyaW5nW10gTk9URV9JRF9QUk9KRUNUSU9OID0geworICAgICAgICAgICBOb3RlUGFkLk5vdGVzLl9JRCwgICAgICAgICAgICAgICAgIC8vIFRoZSBOb3RlcyBjbGFzcyBleHRlbmRzIEJhc2VDb2x1bW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGluY2x1ZGVzIF9JRCBhcyB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCdzIGlkIGluIHRoZSBkYXRhIG1vZGVsCisgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEV9OyAgLy8gVGhlIG5vdGUncyB0aXRsZQorCisgICAgICAvLyBRdWVyeSBzdWJ0ZXN0IDEuCisgICAgICAvLyBUZXN0cyB0aGF0IGEgcXVlcnkgYWdhaW5zdCBhbiBlbXB0eSB0YWJsZSByZXR1cm5zIG51bGwuCisKKyAgICAgIC8vIENvbnN0cnVjdHMgYSBVUkkgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlcidzIG5vdGVzIGlkIFVSSSBwYXR0ZXJuLCB1c2luZyBhbiBhcmJpdHJhcnkKKyAgICAgIC8vIHZhbHVlIG9mIDEgYXMgdGhlIG5vdGUgSUQuCisgICAgICBVcmkgbm90ZUlkVXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX0lEX1VSSV9CQVNFLCAxKTsKKworICAgICAgLy8gUXVlcmllcyB0aGUgdGFibGUgd2l0aCB0aGUgbm90ZXMgSUQgVVJJLiBUaGlzIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgY3Vyc29yLgorICAgICAgQ3Vyc29yIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgbm90ZUlkVXJpLCAvLyBVUkkgcG9pbnRpbmcgdG8gYSBzaW5nbGUgcmVjb3JkCisgICAgICAgICAgbnVsbCwgICAgICAvLyBubyBwcm9qZWN0aW9uLCBnZXQgYWxsIHRoZSBjb2x1bW5zIGZvciBlYWNoIHJlY29yZAorICAgICAgICAgIG51bGwsICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhLCBnZXQgYWxsIHRoZSByZWNvcmRzIGluIHRoZSB0YWJsZQorICAgICAgICAgIG51bGwsICAgICAgLy8gbm8gbmVlZCBmb3Igc2VsZWN0aW9uIGFyZ3VtZW50cworICAgICAgICAgIG51bGwgICAgICAgLy8gZGVmYXVsdCBzb3J0LCBieSBhc2NlbmRpbmcgdGl0bGUKKyAgICAgICk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGlzIG51bGwuCisgICAgICBhc3NlcnRFcXVhbHMoMCxjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgIC8vIFF1ZXJ5IHN1YnRlc3QgMi4KKyAgICAgIC8vIFRlc3RzIHRoYXQgYSBxdWVyeSBhZ2FpbnN0IGEgdGFibGUgY29udGFpbmluZyByZWNvcmRzIHJldHVybnMgYSBzaW5nbGUgcmVjb3JkIHdob3NlIElECisgICAgICAvLyBpcyB0aGUgb25lIHJlcXVlc3RlZCBpbiB0aGUgVVJJIHByb3ZpZGVkLgorCisgICAgICAvLyBJbnNlcnRzIHRoZSB0ZXN0IGRhdGEgaW50byB0aGUgcHJvdmlkZXIncyB1bmRlcmx5aW5nIGRhdGEgc291cmNlLgorICAgICAgaW5zZXJ0RGF0YSgpOworCisgICAgICAvLyBRdWVyaWVzIHRoZSB0YWJsZSB1c2luZyB0aGUgVVJJIGZvciB0aGUgZnVsbCB0YWJsZS4KKyAgICAgIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkoCisgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgLy8gdGhlIGJhc2UgVVJJIGZvciB0aGUgdGFibGUKKyAgICAgICAgICBOT1RFX0lEX1BST0pFQ1RJT04sICAgICAgICAvLyByZXR1cm5zIHRoZSBJRCBhbmQgdGl0bGUgY29sdW1ucyBvZiByb3dzCisgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgLy8gc2VsZWN0IGJhc2VkIG9uIHRoZSB0aXRsZSBjb2x1bW4KKyAgICAgICAgICBTRUxFQ1RJT05fQVJHUywgICAgICAgICAgICAvLyBzZWxlY3QgdGl0bGUgb2YgIk5vdGUxIgorICAgICAgICAgIFNPUlRfT1JERVIgICAgICAgICAgICAgICAgIC8vIHNvcnQgb3JkZXIgcmV0dXJuZWQgaXMgYnkgdGl0bGUsIGFzY2VuZGluZworICAgICAgKTsKKworICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBjdXJzb3IgY29udGFpbnMgb25seSBvbmUgcm93LgorICAgICAgYXNzZXJ0RXF1YWxzKDEsIGN1cnNvci5nZXRDb3VudCgpKTsKKworICAgICAgLy8gTW92ZXMgdG8gdGhlIGN1cnNvcidzIGZpcnN0IHJvdywgYW5kIGFzc2VydHMgdGhhdCB0aGlzIGRpZCBub3QgZmFpbC4KKyAgICAgIGFzc2VydFRydWUoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpOworCisgICAgICAvLyBTYXZlcyB0aGUgcmVjb3JkJ3Mgbm90ZSBJRC4KKyAgICAgIGludCBpbnB1dE5vdGVJZCA9IGN1cnNvci5nZXRJbnQoMCk7CisKKyAgICAgIC8vIEJ1aWxkcyBhIFVSSSBiYXNlZCBvbiB0aGUgcHJvdmlkZXIncyBjb250ZW50IElEIFVSSSBiYXNlIGFuZCB0aGUgc2F2ZWQgbm90ZSBJRC4KKyAgICAgIG5vdGVJZFVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9JRF9VUklfQkFTRSwgaW5wdXROb3RlSWQpOworCisgICAgICAvLyBRdWVyaWVzIHRoZSB0YWJsZSB1c2luZyB0aGUgY29udGVudCBJRCBVUkksIHdoaWNoIHJldHVybnMgYSBzaW5nbGUgcmVjb3JkIHdpdGggdGhlCisgICAgICAvLyBzcGVjaWZpZWQgbm90ZSBJRCwgbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBwcm92aWRlZC4KKyAgICAgIGN1cnNvciA9IG1Nb2NrUmVzb2x2ZXIucXVlcnkobm90ZUlkVXJpLCAvLyB0aGUgVVJJIGZvciBhIHNpbmdsZSBub3RlCisgICAgICAgICAgTk9URV9JRF9QUk9KRUNUSU9OLCAgICAgICAgICAgICAgICAgLy8gc2FtZSBwcm9qZWN0aW9uLCBnZXQgSUQgYW5kIHRpdGxlIGNvbHVtbnMKKyAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiwgYmFzZWQgb24gdGl0bGUgY29sdW1uCisgICAgICAgICAgU0VMRUNUSU9OX0FSR1MsICAgICAgICAgICAgICAgICAgICAgLy8gc2FtZSBzZWxlY3Rpb24gYXJndW1lbnRzLCB0aXRsZSA9ICJOb3RlMSIKKyAgICAgICAgICBTT1JUX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYW1lIHNvcnQgb3JkZXIgcmV0dXJuZWQsIGJ5IHRpdGxlLCBhc2NlbmRpbmcKKyAgICAgICk7CisKKyAgICAgIC8vIEFzc2VydHMgdGhhdCB0aGUgY3Vyc29yIGNvbnRhaW5zIG9ubHkgb25lIHJvdy4KKyAgICAgIGFzc2VydEVxdWFscygxLCBjdXJzb3IuZ2V0Q291bnQoKSk7CisKKyAgICAgIC8vIE1vdmVzIHRvIHRoZSBjdXJzb3IncyBmaXJzdCByb3csIGFuZCBhc3NlcnRzIHRoYXQgdGhpcyBkaWQgbm90IGZhaWwuCisgICAgICBhc3NlcnRUcnVlKGN1cnNvci5tb3ZlVG9GaXJzdCgpKTsKKworICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZSBub3RlIElEIHBhc3NlZCB0byB0aGUgcHJvdmlkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG5vdGUgSUQgcmV0dXJuZWQuCisgICAgICBhc3NlcnRFcXVhbHMoaW5wdXROb3RlSWQsIGN1cnNvci5nZXRJbnQoMCkpOworICAgIH0KKworICAgIC8qCisgICAgICogIFRlc3RzIGluc2VydHMgaW50byB0aGUgZGF0YSBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXJ0cygpIHsKKyAgICAgICAgLy8gQ3JlYXRlcyBhIG5ldyBub3RlIGluc3RhbmNlIHdpdGggSUQgb2YgMzAuCisgICAgICAgIE5vdGVJbmZvIG5vdGUgPSBuZXcgTm90ZUluZm8oCisgICAgICAgICAgICAiTm90ZTMwIiwgLy8gdGhlIG5vdGUncyB0aXRsZQorICAgICAgICAgICAgIlRlc3QgaW5zZXJ0aW5nIGEgbm90ZSIgLy8gdGhlIG5vdGUncyBjb250ZW50CisgICAgICAgICk7CisKKyAgICAgICAgLy8gU2V0cyB0aGUgbm90ZSdzIGNyZWF0aW9uIGFuZCBtb2RpZmljYXRpb24gdGltZXMKKyAgICAgICAgbm90ZS5zZXRDcmVhdGlvbkRhdGUoU1RBUlRfREFURSArICgxMCAqIE9ORV9EQVlfTUlMTElTKSk7CisgICAgICAgIG5vdGUuc2V0TW9kaWZpY2F0aW9uRGF0ZShTVEFSVF9EQVRFICsgKDIgKiBPTkVfV0VFS19NSUxMSVMpKTsKKworICAgICAgICAvLyBJbnNlcnQgc3VidGVzdCAxLgorICAgICAgICAvLyBJbnNlcnRzIGEgcm93IHVzaW5nIHRoZSBuZXcgbm90ZSBpbnN0YW5jZS4KKyAgICAgICAgLy8gTm8gYXNzZXJ0aW9uIHdpbGwgYmUgZG9uZS4gVGhlIGluc2VydCgpIG1ldGhvZCBlaXRoZXIgd29ya3Mgb3IgdGhyb3dzIGFuIEV4Y2VwdGlvbgorICAgICAgICBVcmkgcm93VXJpID0gbU1vY2tSZXNvbHZlci5pbnNlcnQoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAgLy8gdGhlIG1haW4gdGFibGUgVVJJCisgICAgICAgICAgICBub3RlLmdldENvbnRlbnRWYWx1ZXMoKSAgICAgLy8gdGhlIG1hcCBvZiB2YWx1ZXMgdG8gaW5zZXJ0IGFzIGEgbmV3IHJlY29yZAorICAgICAgICApOworCisgICAgICAgIC8vIFBhcnNlcyB0aGUgcmV0dXJuZWQgVVJJIHRvIGdldCB0aGUgbm90ZSBJRCBvZiB0aGUgbmV3IG5vdGUuIFRoZSBJRCBpcyB1c2VkIGluIHN1YnRlc3QgMi4KKyAgICAgICAgbG9uZyBub3RlSWQgPSBDb250ZW50VXJpcy5wYXJzZUlkKHJvd1VyaSk7CisKKyAgICAgICAgLy8gRG9lcyBhIGZ1bGwgcXVlcnkgb24gdGhlIHRhYmxlLiBTaW5jZSBpbnNlcnREYXRhKCkgaGFzbid0IHlldCBiZWVuIGNhbGxlZCwgdGhlCisgICAgICAgIC8vIHRhYmxlIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhlIHJlY29yZCBqdXN0IGluc2VydGVkLgorICAgICAgICBDdXJzb3IgY3Vyc29yID0gbU1vY2tSZXNvbHZlci5xdWVyeSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBtYWluIHRhYmxlIFVSSQorICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgcmV0dXJuIGFsbCB0aGUgY29sdW1ucworICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGNyaXRlcmlhLCByZXR1cm4gYWxsIHRoZSByb3dzIGluIHRoZSBtb2RlbAorICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gc2VsZWN0aW9uIGFyZ3VtZW50cworICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBzb3J0IG9yZGVyCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0cyB0aGF0IHRoZXJlIHNob3VsZCBiZSBvbmx5IDEgcmVjb3JkLgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY3Vyc29yLmdldENvdW50KCkpOworCisgICAgICAgIC8vIE1vdmVzIHRvIHRoZSBmaXJzdCAoYW5kIG9ubHkpIHJlY29yZCBpbiB0aGUgY3Vyc29yIGFuZCBhc3NlcnRzIHRoYXQgdGhpcyB3b3JrZWQuCisgICAgICAgIGFzc2VydFRydWUoY3Vyc29yLm1vdmVUb0ZpcnN0KCkpOworCisgICAgICAgIC8vIFNpbmNlIG5vIHByb2plY3Rpb24gd2FzIHVzZWQsIGdldCB0aGUgY29sdW1uIGluZGV4ZXMgb2YgdGhlIHJldHVybmVkIGNvbHVtbnMKKyAgICAgICAgaW50IHRpdGxlSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSk7CisgICAgICAgIGludCBub3RlSW5kZXggPSBjdXJzb3IuZ2V0Q29sdW1uSW5kZXgoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFKTsKKyAgICAgICAgaW50IGNyZGF0ZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfQ1JFQVRFX0RBVEUpOworICAgICAgICBpbnQgbW9kZGF0ZUluZGV4ID0gY3Vyc29yLmdldENvbHVtbkluZGV4KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUpOworCisgICAgICAgIC8vIFRlc3RzIGVhY2ggY29sdW1uIGluIHRoZSByZXR1cm5lZCBjdXJzb3IgYWdhaW5zdCB0aGUgZGF0YSB0aGF0IHdhcyBpbnNlcnRlZCwgY29tcGFyaW5nCisgICAgICAgIC8vIHRoZSBmaWVsZCBpbiB0aGUgTm90ZUluZm8gb2JqZWN0IHRvIHRoZSBkYXRhIGF0IHRoZSBjb2x1bW4gaW5kZXggaW4gdGhlIGN1cnNvci4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5vdGUudGl0bGUsIGN1cnNvci5nZXRTdHJpbmcodGl0bGVJbmRleCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobm90ZS5ub3RlLCBjdXJzb3IuZ2V0U3RyaW5nKG5vdGVJbmRleCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobm90ZS5jcmVhdGVEYXRlLCBjdXJzb3IuZ2V0TG9uZyhjcmRhdGVJbmRleCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobm90ZS5tb2REYXRlLCBjdXJzb3IuZ2V0TG9uZyhtb2RkYXRlSW5kZXgpKTsKKworICAgICAgICAvLyBJbnNlcnQgc3VidGVzdCAyLgorICAgICAgICAvLyBUZXN0cyB0aGF0IHdlIGNhbid0IGluc2VydCBhIHJlY29yZCB3aG9zZSBpZCB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4KKworICAgICAgICAvLyBEZWZpbmVzIGEgQ29udGVudFZhbHVlcyBvYmplY3Qgc28gdGhhdCB0aGUgdGVzdCBjYW4gYWRkIGEgbm90ZSBJRCB0byBpdC4KKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBub3RlLmdldENvbnRlbnRWYWx1ZXMoKTsKKworICAgICAgICAvLyBBZGRzIHRoZSBub3RlIElEIHJldHJpZXZlZCBpbiBzdWJ0ZXN0IDEgdG8gdGhlIENvbnRlbnRWYWx1ZXMgb2JqZWN0LgorICAgICAgICB2YWx1ZXMucHV0KE5vdGVQYWQuTm90ZXMuX0lELCAoaW50KSBub3RlSWQpOworCisgICAgICAgIC8vIFRyaWVzIHRvIGluc2VydCB0aGlzIHJlY29yZCBpbnRvIHRoZSB0YWJsZS4gVGhpcyBzaG91bGQgZmFpbCBhbmQgZHJvcCBpbnRvIHRoZQorICAgICAgICAvLyBjYXRjaCBibG9jay4gSWYgaXQgc3VjY2VlZHMsIGlzc3VlIGEgZmFpbHVyZSBtZXNzYWdlLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgcm93VXJpID0gbU1vY2tSZXNvbHZlci5pbnNlcnQoTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgdmFsdWVzKTsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIGluc2VydCBmYWlsdXJlIGZvciBleGlzdGluZyByZWNvcmQgYnV0IGluc2VydCBzdWNjZWVkZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgLy8gc3VjY2VlZGVkLCBzbyBkbyBub3RoaW5nLgorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUZXN0cyBkZWxldGlvbnMgZnJvbSB0aGUgZGF0YSBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlcygpIHsKKyAgICAgICAgLy8gU3VidGVzdCAxLgorICAgICAgICAvLyBUcmllcyB0byBkZWxldGUgYSByZWNvcmQgZnJvbSBhIGRhdGEgbW9kZWwgdGhhdCBpcyBlbXB0eS4KKworICAgICAgICAvLyBTZXRzIHRoZSBzZWxlY3Rpb24gY29sdW1uIHRvICJ0aXRsZSIKKyAgICAgICAgZmluYWwgU3RyaW5nIFNFTEVDVElPTl9DT0xVTU5TID0gTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9USVRMRSArICIgPSAiICsgIj8iOworCisgICAgICAgIC8vIFNldHMgdGhlIHNlbGVjdGlvbiBhcmd1bWVudCAiTm90ZTAiCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIFNFTEVDVElPTl9BUkdTID0geyAiTm90ZTAiIH07CisKKyAgICAgICAgLy8gVHJpZXMgdG8gZGVsZXRlIHJvd3MgbWF0Y2hpbmcgdGhlIHNlbGVjdGlvbiBjcml0ZXJpYSBmcm9tIHRoZSBkYXRhIG1vZGVsLgorICAgICAgICBpbnQgcm93c0RlbGV0ZWQgPSBtTW9ja1Jlc29sdmVyLmRlbGV0ZSgKKyAgICAgICAgICAgIE5vdGVQYWQuTm90ZXMuQ09OVEVOVF9VUkksIC8vIHRoZSBiYXNlIFVSSSBvZiB0aGUgdGFibGUKKyAgICAgICAgICAgIFNFTEVDVElPTl9DT0xVTU5TLCAgICAgICAgIC8vIHNlbGVjdCBiYXNlZCBvbiB0aGUgdGl0bGUgY29sdW1uCisgICAgICAgICAgICBTRUxFQ1RJT05fQVJHUyAgICAgICAgICAgICAvLyBzZWxlY3QgdGl0bGUgPSAiTm90ZTAiCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIGRlbGV0aW9uIGRpZCBub3Qgd29yay4gVGhlIG51bWJlciBvZiBkZWxldGVkIHJvd3Mgc2hvdWxkIGJlIHplcm8uCisgICAgICAgIGFzc2VydEVxdWFscygwLCByb3dzRGVsZXRlZCk7CisKKyAgICAgICAgLy8gU3VidGVzdCAyLgorICAgICAgICAvLyBUcmllcyB0byBkZWxldGUgYW4gZXhpc3RpbmcgcmVjb3JkLiBSZXBlYXRzIHRoZSBwcmV2aW91cyBzdWJ0ZXN0LCBidXQgaW5zZXJ0cyBkYXRhIGZpcnN0LgorCisgICAgICAgIC8vIEluc2VydHMgZGF0YSBpbnRvIHRoZSBtb2RlbC4KKyAgICAgICAgaW5zZXJ0RGF0YSgpOworCisgICAgICAgIC8vIFVzZXMgdGhlIHNhbWUgcGFyYW1ldGVycyB0byB0cnkgdG8gZGVsZXRlIHRoZSByb3cgd2l0aCB0aXRsZSAiTm90ZTAiCisgICAgICAgIHJvd3NEZWxldGVkID0gbU1vY2tSZXNvbHZlci5kZWxldGUoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAvLyB0aGUgYmFzZSBVUkkgb2YgdGhlIHRhYmxlCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiBjb2x1bW4sICJ0aXRsZSIKKyAgICAgICAgICAgIFNFTEVDVElPTl9BUkdTICAgICAgICAgICAgIC8vIHNhbWUgc2VsZWN0aW9uIGFyZ3VtZW50cywgdGl0bGUgPSAiTm90ZTAiCisgICAgICAgICk7CisKKyAgICAgICAgLy8gVGhlIG51bWJlciBvZiBkZWxldGVkIHJvd3Mgc2hvdWxkIGJlIDEuCisgICAgICAgIGFzc2VydEVxdWFscygxLCByb3dzRGVsZXRlZCk7CisKKyAgICAgICAgLy8gVGVzdHMgdGhhdCB0aGUgcmVjb3JkIG5vIGxvbmdlciBleGlzdHMuIFRyaWVzIHRvIGdldCBpdCBmcm9tIHRoZSB0YWJsZSwgYW5kCisgICAgICAgIC8vIGFzc2VydHMgdGhhdCBub3RoaW5nIHdhcyByZXR1cm5lZC4KKworICAgICAgICAvLyBRdWVyaWVzIHRoZSB0YWJsZSB3aXRoIHRoZSBzYW1lIHNlbGVjdGlvbiBjb2x1bW4gYW5kIGFyZ3VtZW50IHVzZWQgdG8gZGVsZXRlIHRoZSByb3cuCisgICAgICAgIEN1cnNvciBjdXJzb3IgPSBtTW9ja1Jlc29sdmVyLnF1ZXJ5KAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgLy8gdGhlIGJhc2UgVVJJIG9mIHRoZSB0YWJsZQorICAgICAgICAgICAgbnVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gcHJvamVjdGlvbiwgcmV0dXJuIGFsbCBjb2x1bW5zCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAvLyBzZWxlY3QgYmFzZWQgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgU0VMRUNUSU9OX0FSR1MsICAgICAgICAgICAgLy8gc2VsZWN0IHRpdGxlID0gIk5vdGUwIgorICAgICAgICAgICAgbnVsbCAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBkZWZhdWx0IHNvcnQgb3JkZXIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgdGhlIGN1cnNvciBpcyBlbXB0eSBzaW5jZSB0aGUgcmVjb3JkIGhhZCBhbHJlYWR5IGJlZW4gZGVsZXRlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGN1cnNvci5nZXRDb3VudCgpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRlc3RzIHVwZGF0ZXMgdG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZXMoKSB7CisgICAgICAgIC8vIFNlbGVjdGlvbiBjb2x1bW4gZm9yIGlkZW50aWZ5aW5nIGEgcmVjb3JkIGluIHRoZSBkYXRhIG1vZGVsLgorICAgICAgICBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OX0NPTFVNTlMgPSBOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX1RJVExFICsgIiA9ICIgKyAiPyI7CisKKyAgICAgICAgLy8gU2VsZWN0aW9uIGFyZ3VtZW50IGZvciB0aGUgc2VsZWN0aW9uIGNvbHVtbi4KKyAgICAgICAgZmluYWwgU3RyaW5nW10gc2VsZWN0aW9uQXJncyA9IHsgIk5vdGUxIiB9OworCisgICAgICAgIC8vIERlZmluZXMgYSBtYXAgb2YgY29sdW1uIG5hbWVzIGFuZCB2YWx1ZXMKKyAgICAgICAgQ29udGVudFZhbHVlcyB2YWx1ZXMgPSBuZXcgQ29udGVudFZhbHVlcygpOworCisgICAgICAgIC8vIFN1YnRlc3QgMS4KKyAgICAgICAgLy8gVHJpZXMgdG8gdXBkYXRlIGEgcmVjb3JkIGluIGFuIGVtcHR5IHRhYmxlLgorCisgICAgICAgIC8vIFNldHMgdXAgdGhlIHVwZGF0ZSBieSBwdXR0aW5nIHRoZSAibm90ZSIgY29sdW1uIGFuZCBhIHZhbHVlIGludG8gdGhlIHZhbHVlcyBtYXAuCisgICAgICAgIHZhbHVlcy5wdXQoTm90ZVBhZC5Ob3Rlcy5DT0xVTU5fTkFNRV9OT1RFLCAiVGVzdGluZyBhbiB1cGRhdGUgd2l0aCB0aGlzIHN0cmluZyIpOworCisgICAgICAgIC8vIFRyaWVzIHRvIHVwZGF0ZSB0aGUgdGFibGUKKyAgICAgICAgaW50IHJvd3NVcGRhdGVkID0gbU1vY2tSZXNvbHZlci51cGRhdGUoCisgICAgICAgICAgICBOb3RlUGFkLk5vdGVzLkNPTlRFTlRfVVJJLCAgLy8gdGhlIFVSSSBvZiB0aGUgZGF0YSB0YWJsZQorICAgICAgICAgICAgdmFsdWVzLCAgICAgICAgICAgICAgICAgICAgIC8vIGEgbWFwIG9mIHRoZSB1cGRhdGVzIHRvIGRvIChjb2x1bW4gdGl0bGUgYW5kIHZhbHVlKQorICAgICAgICAgICAgU0VMRUNUSU9OX0NPTFVNTlMsICAgICAgICAgICAvLyBzZWxlY3QgYmFzZWQgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgc2VsZWN0aW9uQXJncyAgICAgICAgICAgICAgIC8vIHNlbGVjdCAidGl0bGUgPSBOb3RlMSIKKyAgICAgICAgKTsKKworICAgICAgICAvLyBBc3NlcnRzIHRoYXQgbm8gcm93cyB3ZXJlIHVwZGF0ZWQuCisgICAgICAgIGFzc2VydEVxdWFscygwLCByb3dzVXBkYXRlZCk7CisKKyAgICAgICAgLy8gU3VidGVzdCAyLgorICAgICAgICAvLyBCdWlsZHMgdGhlIHRhYmxlLCBhbmQgdGhlbiB0cmllcyB0aGUgdXBkYXRlIGFnYWluIHVzaW5nIHRoZSBzYW1lIGFyZ3VtZW50cy4KKworICAgICAgICAvLyBJbnNlcnRzIGRhdGEgaW50byB0aGUgbW9kZWwuCisgICAgICAgIGluc2VydERhdGEoKTsKKworICAgICAgICAvLyAgRG9lcyB0aGUgdXBkYXRlIGFnYWluLCB1c2luZyB0aGUgc2FtZSBhcmd1bWVudHMgYXMgaW4gc3VidGVzdCAxLgorICAgICAgICByb3dzVXBkYXRlZCA9IG1Nb2NrUmVzb2x2ZXIudXBkYXRlKAorICAgICAgICAgICAgTm90ZVBhZC5Ob3Rlcy5DT05URU5UX1VSSSwgICAvLyBUaGUgVVJJIG9mIHRoZSBkYXRhIHRhYmxlCisgICAgICAgICAgICB2YWx1ZXMsICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzYW1lIG1hcCBvZiB1cGRhdGVzCisgICAgICAgICAgICBTRUxFQ1RJT05fQ09MVU1OUywgICAgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiwgYmFzZWQgb24gdGhlIHRpdGxlIGNvbHVtbgorICAgICAgICAgICAgc2VsZWN0aW9uQXJncyAgICAgICAgICAgICAgICAvLyBzYW1lIHNlbGVjdGlvbiBhcmd1bWVudCwgdG8gc2VsZWN0ICJ0aXRsZSA9IE5vdGUxIgorICAgICAgICApOworCisgICAgICAgIC8vIEFzc2VydHMgdGhhdCBvbmx5IG9uZSByb3cgd2FzIHVwZGF0ZWQuIFRoZSBzZWxlY3Rpb24gY3JpdGVyaWEgZXZhbHVhdGVkIHRvCisgICAgICAgIC8vICJ0aXRsZSA9IE5vdGUxIiwgYW5kIHRoZSB0ZXN0IGRhdGEgc2hvdWxkIG9ubHkgY29udGFpbiBvbmUgcm93IHRoYXQgbWF0Y2hlcyB0aGF0LgorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcm93c1VwZGF0ZWQpOworICAgIH0KKworICAgIC8vIEEgdXRpbGl0eSBmb3IgY29udmVydGluZyBub3RlIGRhdGEgdG8gYSBDb250ZW50VmFsdWVzIG1hcC4KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RlSW5mbyB7CisgICAgICAgIFN0cmluZyB0aXRsZTsKKyAgICAgICAgU3RyaW5nIG5vdGU7CisgICAgICAgIGxvbmcgY3JlYXRlRGF0ZTsKKyAgICAgICAgbG9uZyBtb2REYXRlOworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnN0cnVjdG9yIGZvciBhIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGNsYXNzIGhlbHBzIGNyZWF0ZSBhIG5vdGUgYW5kCisgICAgICAgICAqIHJldHVybiBpdHMgdmFsdWVzIGluIGEgQ29udGVudFZhbHVlcyBtYXAgZXhwZWN0ZWQgYnkgZGF0YSBtb2RlbCBtZXRob2RzLgorICAgICAgICAgKiBUaGUgbm90ZSdzIGlkIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIGluc2VydGVkIGludG8gdGhlIGRhdGEgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTm90ZUluZm8oU3RyaW5nIHQsIFN0cmluZyBuKSB7CisgICAgICAgICAgICB0aXRsZSA9IHQ7CisgICAgICAgICAgICBub3RlID0gbjsKKyAgICAgICAgICAgIGNyZWF0ZURhdGUgPSAwOworICAgICAgICAgICAgbW9kRGF0ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXRzIHRoZSBjcmVhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDcmVhdGlvbkRhdGUobG9uZyBjKSB7CisgICAgICAgICAgICBjcmVhdGVEYXRlID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHMgdGhlIG1vZGlmaWNhdGlvbiBkYXRlIGZvciBhIHRlc3Qgbm90ZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRNb2RpZmljYXRpb25EYXRlKGxvbmcgbSkgeworICAgICAgICAgICAgbW9kRGF0ZSA9IG07CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBSZXR1cm5zIGEgQ29udGVudFZhbHVlcyBpbnN0YW5jZSAoYSBtYXApIGZvciB0aGlzIE5vdGVJbmZvIGluc3RhbmNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKyAgICAgICAgICogaW5zZXJ0aW5nIGEgTm90ZUluZm8gaW50byBhIGRhdGFiYXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbnRlbnRWYWx1ZXMgZ2V0Q29udGVudFZhbHVlcygpIHsKKyAgICAgICAgICAgIC8vIEdldHMgYSBuZXcgQ29udGVudFZhbHVlcyBvYmplY3QKKyAgICAgICAgICAgIENvbnRlbnRWYWx1ZXMgdiA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisKKyAgICAgICAgICAgIC8vIEFkZHMgbWFwIGVudHJpZXMgZm9yIHRoZSB1c2VyLWNvbnRyb2xsZWQgZmllbGRzIGluIHRoZSBtYXAKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfVElUTEUsIHRpdGxlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTk9URSwgbm90ZSk7CisgICAgICAgICAgICB2LnB1dChOb3RlUGFkLk5vdGVzLkNPTFVNTl9OQU1FX0NSRUFURV9EQVRFLCBjcmVhdGVEYXRlKTsKKyAgICAgICAgICAgIHYucHV0KE5vdGVQYWQuTm90ZXMuQ09MVU1OX05BTUVfTU9ESUZJQ0FUSU9OX0RBVEUsIG1vZERhdGUpOworICAgICAgICAgICAgcmV0dXJuIHY7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9Db25zdGFudHMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9Db25zdGFudHMuamF2YQppbmRleCBmMjMzYTVkLi40OWY5MmJmIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQ29uc3RhbnRzLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL0NvbnN0YW50cy5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmM7CiAKIHB1YmxpYyBjbGFzcyBDb25zdGFudHMgewpAQCAtMjYsNyArMjUsNSBAQAogICAgIC8qKgogICAgICAqIEF1dGh0b2tlbiB0eXBlIHN0cmluZy4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIVE9LRU5fVFlQRSA9Ci0gICAgICAgICJjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMiOwotCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSFRPS0VOX1RZUEUgPSAiY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jIjsKIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0aW9uU2VydmljZS5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKaW5kZXggYjhhOTAzZC4uMmMxNjNiZSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRpb25TZXJ2aWNlLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKQEAgLTI2LDcgKzI1LDkgQEAKICAqIGFuZCByZXR1cm5zIGl0cyBJQmluZGVyLgogICovCiBwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25TZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkF1dGhlbnRpY2F0aW9uU2VydmljZSI7CisKICAgICBwcml2YXRlIEF1dGhlbnRpY2F0b3IgbUF1dGhlbnRpY2F0b3I7CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ3LDkgKzQ4LDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewogICAgICAgICBpZiAoTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuVkVSQk9TRSkpIHsKLSAgICAgICAgICAgIExvZy52KFRBRywKLSAgICAgICAgICAgICAgICAiZ2V0QmluZGVyKCkuLi4gIHJldHVybmluZyB0aGUgQWNjb3VudEF1dGhlbnRpY2F0b3IgYmluZGVyIGZvciBpbnRlbnQgIgotICAgICAgICAgICAgICAgICAgICArIGludGVudCk7CisgICAgICAgICAgICBMb2cudihUQUcsICJnZXRCaW5kZXIoKS4uLiAgcmV0dXJuaW5nIHRoZSBBY2NvdW50QXV0aGVudGljYXRvciBiaW5kZXIgZm9yIGludGVudCAiCisgICAgICAgICAgICAgICAgKyBpbnRlbnQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtQXV0aGVudGljYXRvci5nZXRJQmluZGVyKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvci5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDI5NjEzYTkuLjBjNzljNWUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3IuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yOwpAQCAtMzMsNiArMzIsNyBAQAogICogYXV0aGVudGljYXRpbmcgYWNjb3VudHMgaW4gdGhlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYyBkb21haW4uCiAgKi8KIGNsYXNzIEF1dGhlbnRpY2F0b3IgZXh0ZW5kcyBBYnN0cmFjdEFjY291bnRBdXRoZW50aWNhdG9yIHsKKwogICAgIC8vIEF1dGhlbnRpY2F0aW9uIFNlcnZpY2UgY29udGV4dAogICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKIApAQCAtNDEsMzQgKzQxLDI1IEBACiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBhZGRBY2NvdW50KEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSwgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIHJlcXVpcmVkRmVhdHVyZXMsCi0gICAgICAgIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBhZGRBY2NvdW50KEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhY2NvdW50VHlwZSwKKyAgICAgICAgU3RyaW5nIGF1dGhUb2tlblR5cGUsIFN0cmluZ1tdIHJlcXVpcmVkRmVhdHVyZXMsIEJ1bmRsZSBvcHRpb25zKSB7CisKICAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQobUNvbnRleHQsIEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5jbGFzcyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsCi0gICAgICAgICAgICBhdXRoVG9rZW5UeXBlKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEFjY291bnRNYW5hZ2VyLktFWV9BQ0NPVU5UX0FVVEhFTlRJQ0FUT1JfUkVTUE9OU0UsCi0gICAgICAgICAgICByZXNwb25zZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsIGF1dGhUb2tlblR5cGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwgcmVzcG9uc2UpOwogICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5ULCBpbnRlbnQpOwogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGNvbmZpcm1DcmVkZW50aWFscyhBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIEJ1bmRsZSBvcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBjb25maXJtQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBCdW5kbGUgb3B0aW9ucykgeworCiAgICAgICAgIGlmIChvcHRpb25zICE9IG51bGwgJiYgb3B0aW9ucy5jb250YWluc0tleShBY2NvdW50TWFuYWdlci5LRVlfUEFTU1dPUkQpKSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPQotICAgICAgICAgICAgICAgIG9wdGlvbnMuZ2V0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9QQVNTV09SRCk7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmaWVkID0KLSAgICAgICAgICAgICAgICBvbmxpbmVDb25maXJtUGFzc3dvcmQoYWNjb3VudC5uYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBvcHRpb25zLmdldFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfUEFTU1dPUkQpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9IG9ubGluZUNvbmZpcm1QYXNzd29yZChhY2NvdW50Lm5hbWUsIHBhc3N3b3JkKTsKICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICByZXN1bHQucHV0Qm9vbGVhbihBY2NvdW50TWFuYWdlci5LRVlfQk9PTEVBTl9SRVNVTFQsIHZlcmlmaWVkKTsKICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC03Niw0NSArNjcsMzUgQEAKICAgICAgICAgLy8gTGF1bmNoIEF1dGhlbnRpY2F0b3JBY3Rpdml0eSB0byBjb25maXJtIGNyZWRlbnRpYWxzCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1DUkVERU5USUFMUywgdHJ1ZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLAotICAgICAgICAgICAgcmVzcG9uc2UpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1fQ1JFREVOVElBTFMsIHRydWUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwgcmVzcG9uc2UpOwogICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwogICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShBY2NvdW50TWFuYWdlci5LRVlfSU5URU5ULCBpbnRlbnQpOwogICAgICAgICByZXR1cm4gYnVuZGxlOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGVkaXRQcm9wZXJ0aWVzKEFjY291bnRBdXRoZW50aWNhdG9yUmVzcG9uc2UgcmVzcG9uc2UsCi0gICAgICAgIFN0cmluZyBhY2NvdW50VHlwZSkgeworICAgIHB1YmxpYyBCdW5kbGUgZWRpdFByb3BlcnRpZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGFjY291bnRUeXBlKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEF1dGhUb2tlbihBY2NvdW50QXV0aGVudGljYXRvclJlc3BvbnNlIHJlc3BvbnNlLAotICAgICAgICBBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRoVG9rZW5UeXBlLCBCdW5kbGUgbG9naW5PcHRpb25zKSB7CisgICAgcHVibGljIEJ1bmRsZSBnZXRBdXRoVG9rZW4oQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworCiAgICAgICAgIGlmICghYXV0aFRva2VuVHlwZS5lcXVhbHMoQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFKSkgewogICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJlc3VsdCA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0VSUk9SX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgImludmFsaWQgYXV0aFRva2VuVHlwZSIpOworICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfRVJST1JfTUVTU0FHRSwgImludmFsaWQgYXV0aFRva2VuVHlwZSIpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgICAgICBmaW5hbCBBY2NvdW50TWFuYWdlciBhbSA9IEFjY291bnRNYW5hZ2VyLmdldChtQ29udGV4dCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9IGFtLmdldFBhc3N3b3JkKGFjY291bnQpOwogICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9Ci0gICAgICAgICAgICAgICAgb25saW5lQ29uZmlybVBhc3N3b3JkKGFjY291bnQubmFtZSwgcGFzc3dvcmQpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZmllZCA9IG9ubGluZUNvbmZpcm1QYXNzd29yZChhY2NvdW50Lm5hbWUsIHBhc3N3b3JkKTsKICAgICAgICAgICAgIGlmICh2ZXJpZmllZCkgewogICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5wdXRTdHJpbmcoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfVFlQRSwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFDQ09VTlRfVFlQRSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dFN0cmluZyhBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKICAgICAgICAgICAgICAgICByZXN1bHQucHV0U3RyaW5nKEFjY291bnRNYW5hZ2VyLktFWV9BVVRIVE9LRU4sIHBhc3N3b3JkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgfQpAQCAtMTIzLDMzICsxMDQsMjUgQEAKICAgICAgICAgLy8gQWN0aXZpdHkgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciBmb3IgdGhlIHBhc3N3b3JkLgogICAgICAgICBmaW5hbCBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChtQ29udGV4dCwgQXV0aGVudGljYXRvckFjdGl2aXR5LmNsYXNzKTsKICAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9VU0VSTkFNRSwgYWNjb3VudC5uYW1lKTsKLSAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwKLSAgICAgICAgICAgIGF1dGhUb2tlblR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQWNjb3VudE1hbmFnZXIuS0VZX0FDQ09VTlRfQVVUSEVOVElDQVRPUl9SRVNQT05TRSwKLSAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICAgICAgaW50ZW50LnB1dEV4dHJhKEF1dGhlbnRpY2F0b3JBY3Rpdml0eS5QQVJBTV9BVVRIVE9LRU5fVFlQRSwgYXV0aFRva2VuVHlwZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9BVVRIRU5USUNBVE9SX1JFU1BPTlNFLCByZXNwb25zZSk7CiAgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEFjY291bnRNYW5hZ2VyLktFWV9JTlRFTlQsIGludGVudCk7CiAgICAgICAgIHJldHVybiBidW5kbGU7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFRva2VuTGFiZWwoU3RyaW5nIGF1dGhUb2tlblR5cGUpIHsKLSAgICAgICAgaWYgKGF1dGhUb2tlblR5cGUuZXF1YWxzKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRSkpIHsKKyAgICAgICAgaWYgKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRS5lcXVhbHMoYXV0aFRva2VuVHlwZSkpIHsKICAgICAgICAgICAgIHJldHVybiBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcubGFiZWwpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwotCiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmdbXSBmZWF0dXJlcykgeworICAgIHB1YmxpYyBCdW5kbGUgaGFzRmVhdHVyZXMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmdbXSBmZWF0dXJlcykgeworCiAgICAgICAgIGZpbmFsIEJ1bmRsZSByZXN1bHQgPSBuZXcgQnVuZGxlKCk7CiAgICAgICAgIHJlc3VsdC5wdXRCb29sZWFuKEFjY291bnRNYW5hZ2VyLktFWV9CT09MRUFOX1JFU1VMVCwgZmFsc2UpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTU5LDI0ICsxMzIsMjAgQEAKICAgICAgKiBWYWxpZGF0ZXMgdXNlcidzIHBhc3N3b3JkIG9uIHRoZSBzZXJ2ZXIKICAgICAgKi8KICAgICBwcml2YXRlIGJvb2xlYW4gb25saW5lQ29uZmlybVBhc3N3b3JkKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7Ci0gICAgICAgIHJldHVybiBOZXR3b3JrVXRpbGl0aWVzLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQsCi0gICAgICAgICAgICBudWxsLyogSGFuZGxlciAqLywgbnVsbC8qIENvbnRleHQgKi8pOworICAgICAgICByZXR1cm4gTmV0d29ya1V0aWxpdGllcworICAgICAgICAgICAgLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgcGFzc3dvcmQsIG51bGwvKiBIYW5kbGVyICovLCBudWxsLyogQ29udGV4dCAqLyk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdXBkYXRlQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwKLSAgICAgICAgQWNjb3VudCBhY2NvdW50LCBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworICAgIHB1YmxpYyBCdW5kbGUgdXBkYXRlQ3JlZGVudGlhbHMoQWNjb3VudEF1dGhlbnRpY2F0b3JSZXNwb25zZSByZXNwb25zZSwgQWNjb3VudCBhY2NvdW50LAorICAgICAgICBTdHJpbmcgYXV0aFRva2VuVHlwZSwgQnVuZGxlIGxvZ2luT3B0aW9ucykgeworCiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOwogICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0FVVEhUT0tFTl9UWVBFLAotICAgICAgICAgICAgYXV0aFRva2VuVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQ09ORklSTUNSRURFTlRJQUxTLCBmYWxzZSk7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBdXRoZW50aWNhdG9yQWN0aXZpdHkuUEFSQU1fQVVUSFRPS0VOX1RZUEUsIGF1dGhUb2tlblR5cGUpOworICAgICAgICBpbnRlbnQucHV0RXh0cmEoQXV0aGVudGljYXRvckFjdGl2aXR5LlBBUkFNX0NPTkZJUk1fQ1JFREVOVElBTFMsIGZhbHNlKTsKICAgICAgICAgZmluYWwgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGUoQWNjb3VudE1hbmFnZXIuS0VZX0lOVEVOVCwgaW50ZW50KTsKICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKaW5kZXggNzc5ZTg5NC4uNGUxZWUyYSAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2F1dGhlbnRpY2F0b3IvQXV0aGVudGljYXRvckFjdGl2aXR5LmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOwogCiBpbXBvcnQgYW5kcm9pZC5hY2NvdW50cy5BY2NvdW50OwpAQCAtNDIsMTYgKzQxLDI4IEBACiAgKiBBY3Rpdml0eSB3aGljaCBkaXNwbGF5cyBsb2dpbiBzY3JlZW4gdG8gdGhlIHVzZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yQWN0aXZpdHkgZXh0ZW5kcyBBY2NvdW50QXV0aGVudGljYXRvckFjdGl2aXR5IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9DT05GSVJNQ1JFREVOVElBTFMgPSAiY29uZmlybUNyZWRlbnRpYWxzIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGZsYWcgdG8gY29uZmlybSBjcmVkZW50aWFscy4gKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQ09ORklSTV9DUkVERU5USUFMUyA9ICJjb25maXJtQ3JlZGVudGlhbHMiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgcGFzc3dvcmQuICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGV4dHJhIHRvIHN0b3JlIHVzZXJuYW1lLiAqKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisKKyAgICAvKiogVGhlIEludGVudCBleHRyYSB0byBzdG9yZSBhdXRodG9rZW4gdHlwZS4gKiovCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fQVVUSFRPS0VOX1RZUEUgPSAiYXV0aHRva2VuVHlwZSI7CiAKKyAgICAvKiogVGhlIHRhZyB1c2VkIHRvIGxvZyB0byBhZGIgY29uc29sZS4gKiovCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJBdXRoZW50aWNhdG9yQWN0aXZpdHkiOwogCiAgICAgcHJpdmF0ZSBBY2NvdW50TWFuYWdlciBtQWNjb3VudE1hbmFnZXI7CisKICAgICBwcml2YXRlIFRocmVhZCBtQXV0aFRocmVhZDsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1BdXRodG9rZW47CisKICAgICBwcml2YXRlIFN0cmluZyBtQXV0aHRva2VuVHlwZTsKIAogICAgIC8qKgpAQCAtNjIsMTQgKzczLDE4IEBACiAKICAgICAvKiogZm9yIHBvc3RpbmcgYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgYmFjayB0byBVSSB0aHJlYWQgKi8KICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOworCiAgICAgcHJpdmF0ZSBUZXh0VmlldyBtTWVzc2FnZTsKKwogICAgIHByaXZhdGUgU3RyaW5nIG1QYXNzd29yZDsKKwogICAgIHByaXZhdGUgRWRpdFRleHQgbVBhc3N3b3JkRWRpdDsKIAogICAgIC8qKiBXYXMgdGhlIG9yaWdpbmFsIGNhbGxlciBhc2tpbmcgZm9yIGFuIGVudGlyZWx5IG5ldyBhY2NvdW50PyAqLwogICAgIHByb3RlY3RlZCBib29sZWFuIG1SZXF1ZXN0TmV3QWNjb3VudCA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgbVVzZXJuYW1lOworCiAgICAgcHJpdmF0ZSBFZGl0VGV4dCBtVXNlcm5hbWVFZGl0OwogCiAgICAgLyoqCkBAIC03Nyw2ICs5Miw3IEBACiAgICAgICovCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgb25DcmVhdGUoQnVuZGxlIGljaWNsZSkgeworCiAgICAgICAgIExvZy5pKFRBRywgIm9uQ3JlYXRlKCIgKyBpY2ljbGUgKyAiKSIpOwogICAgICAgICBzdXBlci5vbkNyZWF0ZShpY2ljbGUpOwogICAgICAgICBtQWNjb3VudE1hbmFnZXIgPSBBY2NvdW50TWFuYWdlci5nZXQodGhpcyk7CkBAIC04NSwxOSArMTAxLDE1IEBACiAgICAgICAgIG1Vc2VybmFtZSA9IGludGVudC5nZXRTdHJpbmdFeHRyYShQQVJBTV9VU0VSTkFNRSk7CiAgICAgICAgIG1BdXRodG9rZW5UeXBlID0gaW50ZW50LmdldFN0cmluZ0V4dHJhKFBBUkFNX0FVVEhUT0tFTl9UWVBFKTsKICAgICAgICAgbVJlcXVlc3ROZXdBY2NvdW50ID0gbVVzZXJuYW1lID09IG51bGw7Ci0gICAgICAgIG1Db25maXJtQ3JlZGVudGlhbHMgPQotICAgICAgICAgICAgaW50ZW50LmdldEJvb2xlYW5FeHRyYShQQVJBTV9DT05GSVJNQ1JFREVOVElBTFMsIGZhbHNlKTsKLQorICAgICAgICBtQ29uZmlybUNyZWRlbnRpYWxzID0gaW50ZW50LmdldEJvb2xlYW5FeHRyYShQQVJBTV9DT05GSVJNX0NSRURFTlRJQUxTLCBmYWxzZSk7CiAgICAgICAgIExvZy5pKFRBRywgIiAgICByZXF1ZXN0IG5ldzogIiArIG1SZXF1ZXN0TmV3QWNjb3VudCk7CiAgICAgICAgIHJlcXVlc3RXaW5kb3dGZWF0dXJlKFdpbmRvdy5GRUFUVVJFX0xFRlRfSUNPTik7CiAgICAgICAgIHNldENvbnRlbnRWaWV3KFIubGF5b3V0LmxvZ2luX2FjdGl2aXR5KTsKICAgICAgICAgZ2V0V2luZG93KCkuc2V0RmVhdHVyZURyYXdhYmxlUmVzb3VyY2UoV2luZG93LkZFQVRVUkVfTEVGVF9JQ09OLAogICAgICAgICAgICAgYW5kcm9pZC5SLmRyYXdhYmxlLmljX2RpYWxvZ19hbGVydCk7Ci0KICAgICAgICAgbU1lc3NhZ2UgPSAoVGV4dFZpZXcpIGZpbmRWaWV3QnlJZChSLmlkLm1lc3NhZ2UpOwogICAgICAgICBtVXNlcm5hbWVFZGl0ID0gKEVkaXRUZXh0KSBmaW5kVmlld0J5SWQoUi5pZC51c2VybmFtZV9lZGl0KTsKICAgICAgICAgbVBhc3N3b3JkRWRpdCA9IChFZGl0VGV4dCkgZmluZFZpZXdCeUlkKFIuaWQucGFzc3dvcmRfZWRpdCk7Ci0KICAgICAgICAgbVVzZXJuYW1lRWRpdC5zZXRUZXh0KG1Vc2VybmFtZSk7CiAgICAgICAgIG1NZXNzYWdlLnNldFRleHQoZ2V0TWVzc2FnZSgpKTsKICAgICB9CkBAIC0xNTIsNyArMTY0LDcgQEAKICAgICAgKiAKICAgICAgKiBAcGFyYW0gdGhlIGNvbmZpcm1DcmVkZW50aWFscyByZXN1bHQuCiAgICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluaXNoQ29uZmlybUNyZWRlbnRpYWxzKGJvb2xlYW4gcmVzdWx0KSB7CisgICAgcHJpdmF0ZSB2b2lkIGZpbmlzaENvbmZpcm1DcmVkZW50aWFscyhib29sZWFuIHJlc3VsdCkgewogICAgICAgICBMb2cuaShUQUcsICJmaW5pc2hDb25maXJtQ3JlZGVudGlhbHMoKSIpOwogICAgICAgICBmaW5hbCBBY2NvdW50IGFjY291bnQgPSBuZXcgQWNjb3VudChtVXNlcm5hbWUsIENvbnN0YW50cy5BQ0NPVU5UX1RZUEUpOwogICAgICAgICBtQWNjb3VudE1hbmFnZXIuc2V0UGFzc3dvcmQoYWNjb3VudCwgbVBhc3N3b3JkKTsKQEAgLTE2NCw3ICsxNzYsNiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIAogICAgICAqIENhbGxlZCB3aGVuIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlciBmb3IgYXV0aGVudGljYXRpb24KICAgICAgKiByZXF1ZXN0LiBTZWUgb25BdXRoZW50aWNhdGlvblJlc3VsdCgpLiBTZXRzIHRoZQogICAgICAqIEFjY291bnRBdXRoZW50aWNhdG9yUmVzdWx0IHdoaWNoIGlzIHNlbnQgYmFjayB0byB0aGUgY2FsbGVyLiBBbHNvIHNldHMKQEAgLTE3MiwyNiArMTgzLDIyIEBACiAgICAgICogCiAgICAgICogQHBhcmFtIHRoZSBjb25maXJtQ3JlZGVudGlhbHMgcmVzdWx0LgogICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaW5pc2hMb2dpbigpIHsKIAotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaExvZ2luKCkgewogICAgICAgICBMb2cuaShUQUcsICJmaW5pc2hMb2dpbigpIik7CiAgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IG5ldyBBY2NvdW50KG1Vc2VybmFtZSwgQ29uc3RhbnRzLkFDQ09VTlRfVFlQRSk7Ci0KICAgICAgICAgaWYgKG1SZXF1ZXN0TmV3QWNjb3VudCkgewogICAgICAgICAgICAgbUFjY291bnRNYW5hZ2VyLmFkZEFjY291bnRFeHBsaWNpdGx5KGFjY291bnQsIG1QYXNzd29yZCwgbnVsbCk7CiAgICAgICAgICAgICAvLyBTZXQgY29udGFjdHMgc3luYyBmb3IgdGhpcyBhY2NvdW50LgotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnNldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQsCi0gICAgICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5BVVRIT1JJVFksIHRydWUpOworICAgICAgICAgICAgQ29udGVudFJlc29sdmVyLnNldFN5bmNBdXRvbWF0aWNhbGx5KGFjY291bnQsIENvbnRhY3RzQ29udHJhY3QuQVVUSE9SSVRZLCB0cnVlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlci5zZXRQYXNzd29yZChhY2NvdW50LCBtUGFzc3dvcmQpOwogICAgICAgICB9CiAgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KCk7CiAgICAgICAgIG1BdXRodG9rZW4gPSBtUGFzc3dvcmQ7CiAgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9OQU1FLCBtVXNlcm5hbWUpOwotICAgICAgICBpbnRlbnQKLSAgICAgICAgICAgIC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKLSAgICAgICAgaWYgKG1BdXRodG9rZW5UeXBlICE9IG51bGwKLSAgICAgICAgICAgICYmIG1BdXRodG9rZW5UeXBlLmVxdWFscyhDb25zdGFudHMuQVVUSFRPS0VOX1RZUEUpKSB7CisgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKKyAgICAgICAgaWYgKG1BdXRodG9rZW5UeXBlICE9IG51bGwgJiYgbUF1dGh0b2tlblR5cGUuZXF1YWxzKENvbnN0YW50cy5BVVRIVE9LRU5fVFlQRSkpIHsKICAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShBY2NvdW50TWFuYWdlci5LRVlfQVVUSFRPS0VOLCBtQXV0aHRva2VuKTsKICAgICAgICAgfQogICAgICAgICBzZXRBY2NvdW50QXV0aGVudGljYXRvclJlc3VsdChpbnRlbnQuZ2V0RXh0cmFzKCkpOwpAQCAtMjAyLDcgKzIwOSw3IEBACiAgICAgLyoqCiAgICAgICogSGlkZXMgdGhlIHByb2dyZXNzIFVJIGZvciBhIGxlbmd0aHkgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGhpZGVQcm9ncmVzcygpIHsKKyAgICBwcml2YXRlIHZvaWQgaGlkZVByb2dyZXNzKCkgewogICAgICAgICBkaXNtaXNzRGlhbG9nKDApOwogICAgIH0KIApAQCAtMjEwLDYgKzIxNyw3IEBACiAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MgY29tcGxldGVzIChzZWUgYXR0ZW1wdExvZ2luKCkpLgogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIG9uQXV0aGVudGljYXRpb25SZXN1bHQoYm9vbGVhbiByZXN1bHQpIHsKKwogICAgICAgICBMb2cuaShUQUcsICJvbkF1dGhlbnRpY2F0aW9uUmVzdWx0KCIgKyByZXN1bHQgKyAiKSIpOwogICAgICAgICAvLyBIaWRlIHRoZSBwcm9ncmVzcyBkaWFsb2cKICAgICAgICAgaGlkZVByb2dyZXNzKCk7CkBAIC0yMjMsMTQgKzIzMSwxMiBAQAogICAgICAgICAgICAgTG9nLmUoVEFHLCAib25BdXRoZW50aWNhdGlvblJlc3VsdDogZmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSIpOwogICAgICAgICAgICAgaWYgKG1SZXF1ZXN0TmV3QWNjb3VudCkgewogICAgICAgICAgICAgICAgIC8vICJQbGVhc2UgZW50ZXIgYSB2YWxpZCB1c2VybmFtZS9wYXNzd29yZC4KLSAgICAgICAgICAgICAgICBtTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAuc2V0VGV4dChnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X2xvZ2luZmFpbF90ZXh0X2JvdGgpKTsKKyAgICAgICAgICAgICAgICBtTWVzc2FnZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbG9naW5mYWlsX3RleHRfYm90aCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyAiUGxlYXNlIGVudGVyIGEgdmFsaWQgcGFzc3dvcmQuIiAoVXNlZCB3aGVuIHRoZQogICAgICAgICAgICAgICAgIC8vIGFjY291bnQgaXMgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UgYnV0IHRoZSBwYXNzd29yZAogICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3Qgd29yay4pCi0gICAgICAgICAgICAgICAgbU1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgLnNldFRleHQoZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9sb2dpbmZhaWxfdGV4dF9wd29ubHkpKTsKKyAgICAgICAgICAgICAgICBtTWVzc2FnZS5zZXRUZXh0KGdldFRleHQoUi5zdHJpbmcubG9naW5fYWN0aXZpdHlfbG9naW5mYWlsX3RleHRfcHdvbmx5KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDMsOCArMjQ5LDcgQEAKICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KG1Vc2VybmFtZSkpIHsKICAgICAgICAgICAgIC8vIElmIG5vIHVzZXJuYW1lLCB0aGVuIHdlIGFzayB0aGUgdXNlciB0byBsb2cgaW4gdXNpbmcgYW4KICAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlIHNlcnZpY2UuCi0gICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbXNnID0KLSAgICAgICAgICAgICAgICBnZXRUZXh0KFIuc3RyaW5nLmxvZ2luX2FjdGl2aXR5X25ld2FjY291bnRfdGV4dCk7CisgICAgICAgICAgICBmaW5hbCBDaGFyU2VxdWVuY2UgbXNnID0gZ2V0VGV4dChSLnN0cmluZy5sb2dpbl9hY3Rpdml0eV9uZXdhY2NvdW50X3RleHQpOwogICAgICAgICAgICAgcmV0dXJuIG1zZzsKICAgICAgICAgfQogICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkobVBhc3N3b3JkKSkgewpAQCAtMjU3LDcgKzI2Miw3IEBACiAgICAgLyoqCiAgICAgICogU2hvd3MgdGhlIHByb2dyZXNzIFVJIGZvciBhIGxlbmd0aHkgb3BlcmF0aW9uLgogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIHNob3dQcm9ncmVzcygpIHsKKyAgICBwcml2YXRlIHZvaWQgc2hvd1Byb2dyZXNzKCkgewogICAgICAgICBzaG93RGlhbG9nKDApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvTmV0d29ya1V0aWxpdGllcy5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKaW5kZXggOWQyYjY2Ni4uNzgyNGE0ZCAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKKysrIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9OZXR3b3JrVXRpbGl0aWVzLmphdmEKQEAgLTEzLDcgKzEzLDYgQEAKICAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCiAgKiB0aGUgTGljZW5zZS4KICAqLwotCiBwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5jbGllbnQ7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CkBAIC01MiwyMSArNTEsMzYgQEAKIC8qKgogICogUHJvdmlkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci4KICAqLwotcHVibGljIGNsYXNzIE5ldHdvcmtVdGlsaXRpZXMgeworZmluYWwgcHVibGljIGNsYXNzIE5ldHdvcmtVdGlsaXRpZXMgeworCisgICAgLyoqIFRoZSB0YWcgdXNlZCB0byBsb2cgdG8gYWRiIGNvbnNvbGUuICoqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTmV0d29ya1V0aWxpdGllcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1fVVNFUk5BTUUgPSAidXNlcm5hbWUiOworCisgICAgLyoqIFRoZSBJbnRlbnQgZXh0cmEgdG8gc3RvcmUgcGFzc3dvcmQuICoqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1BBU1NXT1JEID0gInBhc3N3b3JkIjsKKworICAgIC8qKiBUaGUgSW50ZW50IGV4dHJhIHRvIHN0b3JlIHVzZXJuYW1lLiAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VU0VSTkFNRSA9ICJ1c2VybmFtZSI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTV9VUERBVEVEID0gInRpbWVzdGFtcCI7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0FHRU5UID0gIkF1dGhlbnRpY2F0aW9uU2VydmljZS8xLjAiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFR0lTVFJBVElPTl9USU1FT1VUID0gMzAgKiAxMDAwOyAvLyBtcwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfVVJMID0KLSAgICAgICAgImh0dHBzOi8vc2FtcGxlc3luY2FkYXB0ZXIuYXBwc3BvdC5jb20iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHSVNUUkFUSU9OX1RJTUVPVVRfTVMgPSAzMCAqIDEwMDA7IC8vIG1zCisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFX1VSTCA9ICJodHRwczovL3NhbXBsZXN5bmNhZGFwdGVyLmFwcHNwb3QuY29tIjsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfVVJJID0gQkFTRV9VUkwgKyAiL2F1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZFVENIX0ZSSUVORF9VUERBVEVTX1VSSSA9Ci0gICAgICAgIEJBU0VfVVJMICsgIi9mZXRjaF9mcmllbmRfdXBkYXRlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRVRDSF9GUklFTkRfVVBEQVRFU19VUkkgPSBCQVNFX1VSTCArICIvZmV0Y2hfZnJpZW5kX3VwZGF0ZXMiOworCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVUQ0hfU1RBVFVTX1VSSSA9IEJBU0VfVVJMICsgIi9mZXRjaF9zdGF0dXMiOworCiAgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cENsaWVudCBtSHR0cENsaWVudDsKIAorICAgIHByaXZhdGUgTmV0d29ya1V0aWxpdGllcygpIHsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBDb25maWd1cmVzIHRoZSBodHRwQ2xpZW50IHRvIGNvbm5lY3QgdG8gdGhlIFVSTCBwcm92aWRlZC4KICAgICAgKi8KQEAgLTc0LDEwICs4OCw5IEBACiAgICAgICAgIGlmIChtSHR0cENsaWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICBtSHR0cENsaWVudCA9IG5ldyBEZWZhdWx0SHR0cENsaWVudCgpOwogICAgICAgICAgICAgZmluYWwgSHR0cFBhcmFtcyBwYXJhbXMgPSBtSHR0cENsaWVudC5nZXRQYXJhbXMoKTsKLSAgICAgICAgICAgIEh0dHBDb25uZWN0aW9uUGFyYW1zLnNldENvbm5lY3Rpb25UaW1lb3V0KHBhcmFtcywKLSAgICAgICAgICAgICAgICBSRUdJU1RSQVRJT05fVElNRU9VVCk7Ci0gICAgICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVCk7Ci0gICAgICAgICAgICBDb25uTWFuYWdlclBhcmFtcy5zZXRUaW1lb3V0KHBhcmFtcywgUkVHSVNUUkFUSU9OX1RJTUVPVVQpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb25QYXJhbXMuc2V0Q29ubmVjdGlvblRpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyk7CisgICAgICAgICAgICBIdHRwQ29ubmVjdGlvblBhcmFtcy5zZXRTb1RpbWVvdXQocGFyYW1zLCBSRUdJU1RSQVRJT05fVElNRU9VVF9NUyk7CisgICAgICAgICAgICBDb25uTWFuYWdlclBhcmFtcy5zZXRUaW1lb3V0KHBhcmFtcywgUkVHSVNUUkFUSU9OX1RJTUVPVVRfTVMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC05NCw3ICsxMDcsNiBAQAogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bigpOwogICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH07CkBAIC0xMTMsMTAgKzEyNSwxMCBAQAogICAgICAqIEByZXR1cm4gYm9vbGVhbiBUaGUgYm9vbGVhbiByZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1c2VyIHdhcwogICAgICAqICAgICAgICAgc3VjY2Vzc2Z1bGx5IGF1dGhlbnRpY2F0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwKLSAgICAgICAgSGFuZGxlciBoYW5kbGVyLCBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgZmluYWwgSHR0cFJlc3BvbnNlIHJlc3A7CisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGF1dGhlbnRpY2F0ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCwgSGFuZGxlciBoYW5kbGVyLAorICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQpIHsKIAorICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcDsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4oKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VTRVJOQU1FLCB1c2VybmFtZSkpOwogICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fUEFTU1dPUkQsIHBhc3N3b3JkKSk7CkBAIC0xMzEsNyArMTQzLDYgQEAKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICB0cnkgewogICAgICAgICAgICAgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgICAgICBpZiAocmVzcC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfT0spIHsKQEAgLTE4OSw4ICsyMDAsOSBAQAogICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjYWxsZXIgQWN0aXZpdHkncyBjb250ZXh0CiAgICAgICogQHJldHVybiBUaHJlYWQgVGhlIHRocmVhZCBvbiB3aGljaCB0aGUgbmV0d29yayBtT3BlcmF0aW9ucyBhcmUgZXhlY3V0ZWQuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUaHJlYWQgYXR0ZW1wdEF1dGgoZmluYWwgU3RyaW5nIHVzZXJuYW1lLAotICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQsIGZpbmFsIEhhbmRsZXIgaGFuZGxlciwgZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgcHVibGljIHN0YXRpYyBUaHJlYWQgYXR0ZW1wdEF1dGgoZmluYWwgU3RyaW5nIHVzZXJuYW1lLCBmaW5hbCBTdHJpbmcgcGFzc3dvcmQsCisgICAgICAgIGZpbmFsIEhhbmRsZXIgaGFuZGxlciwgZmluYWwgQ29udGV4dCBjb250ZXh0KSB7CisKICAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CiAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlKHVzZXJuYW1lLCBwYXNzd29yZCwgaGFuZGxlciwgY29udGV4dCk7CkBAIC0yMDgsMzIgKzIyMCwyNyBAQAogICAgICAqIEBwYXJhbSBsYXN0VXBkYXRlZCBUaGUgbGFzdCB0aW1lIHRoYXQgc3luYyB3YXMgcGVyZm9ybWVkCiAgICAgICogQHJldHVybiBsaXN0IFRoZSBsaXN0IG9mIHVwZGF0ZXMgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyLgogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxVc2VyPiBmZXRjaEZyaWVuZFVwZGF0ZXMoQWNjb3VudCBhY2NvdW50LAotICAgICAgICBTdHJpbmcgYXV0aHRva2VuLCBEYXRlIGxhc3RVcGRhdGVkKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiwKLSAgICAgICAgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXI+IGZldGNoRnJpZW5kVXBkYXRlcyhBY2NvdW50IGFjY291bnQsIFN0cmluZyBhdXRodG9rZW4sIERhdGUgbGFzdFVwZGF0ZWQpCisgICAgICAgIHRocm93cyBKU09ORXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKwogICAgICAgICBmaW5hbCBBcnJheUxpc3Q8VXNlcj4gZnJpZW5kTGlzdCA9IG5ldyBBcnJheUxpc3Q8VXNlcj4oKTsKICAgICAgICAgZmluYWwgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+IHBhcmFtcyA9IG5ldyBBcnJheUxpc3Q8TmFtZVZhbHVlUGFpcj4oKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1VTRVJOQU1FLCBhY2NvdW50Lm5hbWUpKTsKICAgICAgICAgcGFyYW1zLmFkZChuZXcgQmFzaWNOYW1lVmFsdWVQYWlyKFBBUkFNX1BBU1NXT1JELCBhdXRodG9rZW4pKTsKICAgICAgICAgaWYgKGxhc3RVcGRhdGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXQgZm9ybWF0dGVyID0KLSAgICAgICAgICAgICAgICBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbSIpOworICAgICAgICAgICAgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBmb3JtYXR0ZXIgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgieXl5eS9NTS9kZCBISDptbSIpOwogICAgICAgICAgICAgZm9ybWF0dGVyLnNldFRpbWVab25lKFRpbWVab25lLmdldFRpbWVab25lKCJVVEMiKSk7Ci0gICAgICAgICAgICBwYXJhbXMuYWRkKG5ldyBCYXNpY05hbWVWYWx1ZVBhaXIoUEFSQU1fVVBEQVRFRCwgZm9ybWF0dGVyCi0gICAgICAgICAgICAgICAgLmZvcm1hdChsYXN0VXBkYXRlZCkpKTsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9VUERBVEVELCBmb3JtYXR0ZXIuZm9ybWF0KGxhc3RVcGRhdGVkKSkpOwogICAgICAgICB9CiAgICAgICAgIExvZy5pKFRBRywgcGFyYW1zLnRvU3RyaW5nKCkpOwotCiAgICAgICAgIEh0dHBFbnRpdHkgZW50aXR5ID0gbnVsbDsKICAgICAgICAgZW50aXR5ID0gbmV3IFVybEVuY29kZWRGb3JtRW50aXR5KHBhcmFtcyk7CiAgICAgICAgIGZpbmFsIEh0dHBQb3N0IHBvc3QgPSBuZXcgSHR0cFBvc3QoRkVUQ0hfRlJJRU5EX1VQREFURVNfVVJJKTsKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3AuZ2V0RW50aXR5KCkpOwotCiAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgewogICAgICAgICAgICAgLy8gU3VjY2VzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBzYW1wbGVzeW5jYWRhcHRlciBzZXJ2ZXIgYW5kCiAgICAgICAgICAgICAvLyBhdXRoZW50aWNhdGVkLgpAQCAtMjQ1LDEyICsyNTIsMTAgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19VTkFVVEhPUklaRUQpIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsCi0gICAgICAgICAgICAgICAgICAgICJBdXRoZW50aWNhdGlvbiBleGNlcHRpb24gaW4gZmV0Y2hpbmcgcmVtb3RlIGNvbnRhY3RzIik7CisgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXV0aGVudGljYXRpb24gZXhjZXB0aW9uIGluIGZldGNoaW5nIHJlbW90ZSBjb250YWN0cyIpOwogICAgICAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJTZXJ2ZXIgZXJyb3IgaW4gZmV0Y2hpbmcgcmVtb3RlIGNvbnRhY3RzOiAiCi0gICAgICAgICAgICAgICAgICAgICsgcmVzcC5nZXRTdGF0dXNMaW5lKCkpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlNlcnZlciBlcnJvciBpbiBmZXRjaGluZyByZW1vdGUgY29udGFjdHM6ICIgKyByZXNwLmdldFN0YXR1c0xpbmUoKSk7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTI2NSwyNCArMjcwLDIxIEBACiAgICAgICogICAgICAgIGFjY291bnQKICAgICAgKiBAcmV0dXJuIGxpc3QgVGhlIGxpc3Qgb2Ygc3RhdHVzIG1lc3NhZ2VzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4KICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8VXNlci5TdGF0dXM+IGZldGNoRnJpZW5kU3RhdHVzZXMoQWNjb3VudCBhY2NvdW50LAotICAgICAgICBTdHJpbmcgYXV0aHRva2VuKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXIuU3RhdHVzPiBmZXRjaEZyaWVuZFN0YXR1c2VzKEFjY291bnQgYWNjb3VudCwgU3RyaW5nIGF1dGh0b2tlbikKKyAgICAgICAgdGhyb3dzIEpTT05FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQXV0aGVudGljYXRpb25FeGNlcHRpb24geworCiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxVc2VyLlN0YXR1cz4gc3RhdHVzTGlzdCA9IG5ldyBBcnJheUxpc3Q8VXNlci5TdGF0dXM+KCk7CiAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxOYW1lVmFsdWVQYWlyPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PE5hbWVWYWx1ZVBhaXI+KCk7CiAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9VU0VSTkFNRSwgYWNjb3VudC5uYW1lKSk7CiAgICAgICAgIHBhcmFtcy5hZGQobmV3IEJhc2ljTmFtZVZhbHVlUGFpcihQQVJBTV9QQVNTV09SRCwgYXV0aHRva2VuKSk7Ci0KICAgICAgICAgSHR0cEVudGl0eSBlbnRpdHkgPSBudWxsOwogICAgICAgICBlbnRpdHkgPSBuZXcgVXJsRW5jb2RlZEZvcm1FbnRpdHkocGFyYW1zKTsKICAgICAgICAgZmluYWwgSHR0cFBvc3QgcG9zdCA9IG5ldyBIdHRwUG9zdChGRVRDSF9TVEFUVVNfVVJJKTsKICAgICAgICAgcG9zdC5hZGRIZWFkZXIoZW50aXR5LmdldENvbnRlbnRUeXBlKCkpOwogICAgICAgICBwb3N0LnNldEVudGl0eShlbnRpdHkpOwogICAgICAgICBtYXliZUNyZWF0ZUh0dHBDbGllbnQoKTsKLQogICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcCA9IG1IdHRwQ2xpZW50LmV4ZWN1dGUocG9zdCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IEVudGl0eVV0aWxzLnRvU3RyaW5nKHJlc3AuZ2V0RW50aXR5KCkpOwotCiAgICAgICAgIGlmIChyZXNwLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkgPT0gSHR0cFN0YXR1cy5TQ19PSykgewogICAgICAgICAgICAgLy8gU3VjY2VzZnVsbHkgY29ubmVjdGVkIHRvIHRoZSBzYW1wbGVzeW5jYWRhcHRlciBzZXJ2ZXIgYW5kCiAgICAgICAgICAgICAvLyBhdXRoZW50aWNhdGVkLgpAQCAtMjkzLDggKzI5NSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAocmVzcC5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpID09IEh0dHBTdGF0dXMuU0NfVU5BVVRIT1JJWkVEKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLAotICAgICAgICAgICAgICAgICAgICAiQXV0aGVudGljYXRpb24gZXhjZXB0aW9uIGluIGZldGNoaW5nIGZyaWVuZCBzdGF0dXMgbGlzdCIpOworICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkF1dGhlbnRpY2F0aW9uIGV4Y2VwdGlvbiBpbiBmZXRjaGluZyBmcmllbmQgc3RhdHVzIGxpc3QiKTsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FeGNlcHRpb24oKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiU2VydmVyIGVycm9yIGluIGZldGNoaW5nIGZyaWVuZCBzdGF0dXMgbGlzdCIpOwpAQCAtMzAzLDUgKzMwNCw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1c0xpc3Q7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCmluZGV4IDZjZTliM2YuLjIxN2EzODMgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9jbGllbnQvVXNlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuY2xpZW50OwogCiBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKQEAgLTIzLDE2ICsyMiwyNCBAQAogLyoqCiAgKiBSZXByZXNlbnRzIGEgc2FtcGxlIFN5bmNBZGFwdGVyIHVzZXIKICAqLwotcHVibGljIGNsYXNzIFVzZXIgeworZmluYWwgcHVibGljIGNsYXNzIFVzZXIgewogCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVzZXJOYW1lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUZpcnN0TmFtZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1MYXN0TmFtZTsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DZWxsUGhvbmU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtT2ZmaWNlUGhvbmU7CisKICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSG9tZVBob25lOworCiAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUVtYWlsOworCiAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1EZWxldGVkOworCiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVVzZXJJZDsKIAogICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgewpAQCAtNzEsOSArNzgsOSBAQAogICAgICAgICByZXR1cm4gbURlbGV0ZWQ7CiAgICAgfQogCi0gICAgcHVibGljIFVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwKLSAgICAgICAgU3RyaW5nIGNlbGxQaG9uZSwgU3RyaW5nIG9mZmljZVBob25lLCBTdHJpbmcgaG9tZVBob25lLCBTdHJpbmcgZW1haWwsCi0gICAgICAgIEJvb2xlYW4gZGVsZXRlZCwgSW50ZWdlciB1c2VySWQpIHsKKyAgICBwcml2YXRlIFVzZXIoU3RyaW5nIG5hbWUsIFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSwgU3RyaW5nIGNlbGxQaG9uZSwKKyAgICAgICAgU3RyaW5nIG9mZmljZVBob25lLCBTdHJpbmcgaG9tZVBob25lLCBTdHJpbmcgZW1haWwsIEJvb2xlYW4gZGVsZXRlZCwgSW50ZWdlciB1c2VySWQpIHsKKwogICAgICAgICBtVXNlck5hbWUgPSBuYW1lOwogICAgICAgICBtRmlyc3ROYW1lID0gZmlyc3ROYW1lOwogICAgICAgICBtTGFzdE5hbWUgPSBsYXN0TmFtZTsKQEAgLTkyLDM0ICs5OSwzMyBAQAogICAgICAqIEByZXR1cm4gdXNlciBUaGUgbmV3IGluc3RhbmNlIG9mIFZvaXBlciB1c2VyIGNyZWF0ZWQgZnJvbSB0aGUgSlNPTiBkYXRhLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgVXNlciB2YWx1ZU9mKEpTT05PYmplY3QgdXNlcikgeworCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlck5hbWUgPSB1c2VyLmdldFN0cmluZygidSIpOwogICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0TmFtZSA9IHVzZXIuaGFzKCJmIikgPyB1c2VyLmdldFN0cmluZygiZiIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9IHVzZXIuaGFzKCJsIikgPyB1c2VyLmdldFN0cmluZygibCIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjZWxsUGhvbmUgPSB1c2VyLmhhcygibSIpID8gdXNlci5nZXRTdHJpbmcoIm0iKSA6IG51bGw7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgb2ZmaWNlUGhvbmUgPQotICAgICAgICAgICAgICAgIHVzZXIuaGFzKCJvIikgPyB1c2VyLmdldFN0cmluZygibyIpIDogbnVsbDsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvZmZpY2VQaG9uZSA9IHVzZXIuaGFzKCJvIikgPyB1c2VyLmdldFN0cmluZygibyIpIDogbnVsbDsKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBob21lUGhvbmUgPSB1c2VyLmhhcygiaCIpID8gdXNlci5nZXRTdHJpbmcoImgiKSA6IG51bGw7CiAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW1haWwgPSB1c2VyLmhhcygiZSIpID8gdXNlci5nZXRTdHJpbmcoImUiKSA6IG51bGw7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlbGV0ZWQgPQotICAgICAgICAgICAgICAgIHVzZXIuaGFzKCJkIikgPyB1c2VyLmdldEJvb2xlYW4oImQiKSA6IGZhbHNlOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZWxldGVkID0gdXNlci5oYXMoImQiKSA/IHVzZXIuZ2V0Qm9vbGVhbigiZCIpIDogZmFsc2U7CiAgICAgICAgICAgICBmaW5hbCBpbnQgdXNlcklkID0gdXNlci5nZXRJbnQoImkiKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVXNlcih1c2VyTmFtZSwgZmlyc3ROYW1lLCBsYXN0TmFtZSwgY2VsbFBob25lLAotICAgICAgICAgICAgICAgIG9mZmljZVBob25lLCBob21lUGhvbmUsIGVtYWlsLCBkZWxldGVkLCB1c2VySWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBVc2VyKHVzZXJOYW1lLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCBjZWxsUGhvbmUsIG9mZmljZVBob25lLCBob21lUGhvbmUsCisgICAgICAgICAgICAgICAgZW1haWwsIGRlbGV0ZWQsIHVzZXJJZCk7CiAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgewogICAgICAgICAgICAgTG9nLmkoIlVzZXIiLCAiRXJyb3IgcGFyc2luZyBKU09OIHVzZXIgb2JqZWN0IiArIGV4LnRvU3RyaW5nKCkpOwotCiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7Ci0KICAgICB9CiAKICAgICAvKioKICAgICAgKiBSZXByZXNlbnRzIHRoZSBVc2VyJ3Mgc3RhdHVzIG1lc3NhZ2VzCiAgICAgICogCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0dXMgeworICAgIGZpbmFsIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdHVzIHsKKwogICAgICAgICBwcml2YXRlIGZpbmFsIEludGVnZXIgbVVzZXJJZDsKKwogICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtU3RhdHVzOwogCiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0VXNlcklkKCkgewpAQCAtMTQ2LDUgKzE1Miw0IEBACiAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgfQogICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0JhdGNoT3BlcmF0aW9uLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQppbmRleCA1MDlkMTUxLi4wYmUzZGFhIDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQmF0Y2hPcGVyYXRpb24uamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnBsYXRmb3JtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKQEAgLTI5LDEyICsyOCwxNCBAQAogLyoqCiAgKiBUaGlzIGNsYXNzIGhhbmRsZXMgZXhlY3V0aW9uIG9mIGJhdGNoIG1PcGVyYXRpb25zIG9uIENvbnRhY3RzIHByb3ZpZGVyLgogICovCi1wdWJsaWMgY2xhc3MgQmF0Y2hPcGVyYXRpb24geworZmluYWwgcHVibGljIGNsYXNzIEJhdGNoT3BlcmF0aW9uIHsKKwogICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFRBRyA9ICJCYXRjaE9wZXJhdGlvbiI7CiAKICAgICBwcml2YXRlIGZpbmFsIENvbnRlbnRSZXNvbHZlciBtUmVzb2x2ZXI7CisKICAgICAvLyBMaXN0IGZvciBzdG9yaW5nIHRoZSBiYXRjaCBtT3BlcmF0aW9ucwotICAgIEFycmF5TGlzdDxDb250ZW50UHJvdmlkZXJPcGVyYXRpb24+IG1PcGVyYXRpb25zOworICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENvbnRlbnRQcm92aWRlck9wZXJhdGlvbj4gbU9wZXJhdGlvbnM7CiAKICAgICBwdWJsaWMgQmF0Y2hPcGVyYXRpb24oQ29udGV4dCBjb250ZXh0LCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIpIHsKICAgICAgICAgbVJlc29sdmVyID0gcmVzb2x2ZXI7CkBAIC01MCw2ICs1MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKKwogICAgICAgICBpZiAobU9wZXJhdGlvbnMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNjMsNSArNjUsNCBAQAogICAgICAgICB9CiAgICAgICAgIG1PcGVyYXRpb25zLmNsZWFyKCk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE1hbmFnZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCmluZGV4IDRmNzFiZTAuLjIxOGIxNjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9Db250YWN0TWFuYWdlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMucGxhdGZvcm07CiAKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwpAQCAtNDEsMTAgKzQwLDEyIEBACiAgKiBDbGFzcyBmb3IgbWFuYWdpbmcgY29udGFjdHMgc3luYyByZWxhdGVkIG1PcGVyYXRpb25zCiAgKi8KIHB1YmxpYyBjbGFzcyBDb250YWN0TWFuYWdlciB7CisKICAgICAvKioKICAgICAgKiBDdXN0b20gSU0gcHJvdG9jb2wgdXNlZCB3aGVuIHN0b3Jpbmcgc3RhdHVzIG1lc3NhZ2VzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENVU1RPTV9JTV9QUk9UT0NPTCA9ICJTYW1wbGVTeW5jQWRhcHRlciI7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkNvbnRhY3RNYW5hZ2VyIjsKIAogICAgIC8qKgpAQCAtNTQsMTMgKzU1LDEyIEBACiAgICAgICogQHBhcmFtIGFjY291bnQgVGhlIHVzZXJuYW1lIGZvciB0aGUgYWNjb3VudAogICAgICAqIEBwYXJhbSB1c2VycyBUaGUgbGlzdCBvZiB1c2VycwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3luY0NvbnRhY3RzKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgU3RyaW5nIGFjY291bnQsIExpc3Q8VXNlcj4gdXNlcnMpIHsKKyAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN5bmNDb250YWN0cyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyBhY2NvdW50LCBMaXN0PFVzZXI+IHVzZXJzKSB7CisKICAgICAgICAgbG9uZyB1c2VySWQ7CiAgICAgICAgIGxvbmcgcmF3Q29udGFjdElkID0gMDsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPQotICAgICAgICAgICAgbmV3IEJhdGNoT3BlcmF0aW9uKGNvbnRleHQsIHJlc29sdmVyKTsKKyAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPSBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOwogICAgICAgICBMb2cuZChUQUcsICJJbiBTeW5jQ29udGFjdHMiKTsKICAgICAgICAgZm9yIChmaW5hbCBVc2VyIHVzZXIgOiB1c2VycykgewogICAgICAgICAgICAgdXNlcklkID0gdXNlci5nZXRVc2VySWQoKTsKQEAgLTY5LDggKzY5LDcgQEAKICAgICAgICAgICAgIGlmIChyYXdDb250YWN0SWQgIT0gMCkgewogICAgICAgICAgICAgICAgIGlmICghdXNlci5pc0RlbGV0ZWQoKSkgewogICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY29udGFjdAotICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb250YWN0KGNvbnRleHQsIHJlc29sdmVyLCBhY2NvdW50LCB1c2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhY3QoY29udGV4dCwgcmVzb2x2ZXIsIGFjY291bnQsIHVzZXIsIHJhd0NvbnRhY3RJZCwgYmF0Y2hPcGVyYXRpb24pOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSBjb250YWN0CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUNvbnRhY3QoY29udGV4dCwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CkBAIC05OCwxNyArOTcsMTUgQEAKICAgICAgKiBAcGFyYW0gYWNjb3VudE5hbWUgdGhlIHVzZXJuYW1lIG9mIHRoZSBsb2dnZWQgaW4gdXNlcgogICAgICAqIEBwYXJhbSBzdGF0dXNlcyB0aGUgbGlzdCBvZiBzdGF0dXNlcyB0byBzdG9yZQogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdGF0dXNlcyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB1c2VybmFtZSwKLSAgICAgICAgTGlzdDxVc2VyLlN0YXR1cz4gbGlzdCkgeworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnNlcnRTdGF0dXNlcyhDb250ZXh0IGNvbnRleHQsIFN0cmluZyB1c2VybmFtZSwgTGlzdDxVc2VyLlN0YXR1cz4gbGlzdCkgeworCiAgICAgICAgIGZpbmFsIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gbmV3IENvbnRlbnRWYWx1ZXMoKTsKICAgICAgICAgZmluYWwgQ29udGVudFJlc29sdmVyIHJlc29sdmVyID0gY29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPQotICAgICAgICAgICAgbmV3IEJhdGNoT3BlcmF0aW9uKGNvbnRleHQsIHJlc29sdmVyKTsKKyAgICAgICAgZmluYWwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24gPSBuZXcgQmF0Y2hPcGVyYXRpb24oY29udGV4dCwgcmVzb2x2ZXIpOwogICAgICAgICBmb3IgKGZpbmFsIFVzZXIuU3RhdHVzIHN0YXR1cyA6IGxpc3QpIHsKICAgICAgICAgICAgIC8vIExvb2sgdXAgdGhlIHVzZXIncyBzYW1wbGUgU3luY0FkYXB0ZXIgZGF0YSByb3cKICAgICAgICAgICAgIGZpbmFsIGxvbmcgdXNlcklkID0gc3RhdHVzLmdldFVzZXJJZCgpOwogICAgICAgICAgICAgZmluYWwgbG9uZyBwcm9maWxlSWQgPSBsb29rdXBQcm9maWxlKHJlc29sdmVyLCB1c2VySWQpOwotCiAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIGFjdGl2aXR5IGludG8gdGhlIHN0cmVhbQogICAgICAgICAgICAgaWYgKHByb2ZpbGVJZCA+IDApIHsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuREFUQV9JRCwgcHJvZmlsZUlkKTsKQEAgLTExNywxNSArMTE0LDExIEBACiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLkNVU1RPTV9QUk9UT0NPTCwgQ1VTVE9NX0lNX1BST1RPQ09MKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuSU1fQUNDT1VOVCwgdXNlcm5hbWUpOwogICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoU3RhdHVzVXBkYXRlcy5JTV9IQU5ETEUsIHN0YXR1cy5nZXRVc2VySWQoKSk7Ci0gICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19SRVNfUEFDS0FHRSwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19SRVNfUEFDS0FHRSwgY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKICAgICAgICAgICAgICAgICB2YWx1ZXMucHV0KFN0YXR1c1VwZGF0ZXMuU1RBVFVTX0lDT04sIFIuZHJhd2FibGUuaWNvbik7CiAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChTdGF0dXNVcGRhdGVzLlNUQVRVU19MQUJFTCwgUi5zdHJpbmcubGFiZWwpOwotCi0gICAgICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgLmFkZChDb250YWN0T3BlcmF0aW9ucy5uZXdJbnNlcnRDcG8oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXNVcGRhdGVzLkNPTlRFTlRfVVJJLCB0cnVlKS53aXRoVmFsdWVzKHZhbHVlcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBiYXRjaE9wZXJhdGlvbi5hZGQoQ29udGFjdE9wZXJhdGlvbnMubmV3SW5zZXJ0Q3BvKFN0YXR1c1VwZGF0ZXMuQ09OVEVOVF9VUkksIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC53aXRoVmFsdWVzKHZhbHVlcykuYnVpbGQoKSk7CiAgICAgICAgICAgICAgICAgLy8gQSBzeW5jIGFkYXB0ZXIgc2hvdWxkIGJhdGNoIG9wZXJhdGlvbnMgb24gbXVsdGlwbGUgY29udGFjdHMsCiAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCB3aWxsIG1ha2UgYSBkcmFtYXRpYyBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAgICAgIGlmIChiYXRjaE9wZXJhdGlvbi5zaXplKCkgPj0gNTApIHsKQEAgLTE0MywxNiArMTM2LDE2IEBACiAgICAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSBhY2NvdW50IHRoZSBjb250YWN0IGJlbG9uZ3MgdG8KICAgICAgKiBAcGFyYW0gdXNlciB0aGUgc2FtcGxlIFN5bmNBZGFwdGVyIFVzZXIgb2JqZWN0CiAgICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb250YWN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjY291bnROYW1lLAotICAgICAgICBVc2VyIHVzZXIsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRDb250YWN0KENvbnRleHQgY29udGV4dCwgU3RyaW5nIGFjY291bnROYW1lLCBVc2VyIHVzZXIsCisgICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKICAgICAgICAgLy8gUHV0IHRoZSBkYXRhIGluIHRoZSBjb250YWN0cyBwcm92aWRlcgogICAgICAgICBmaW5hbCBDb250YWN0T3BlcmF0aW9ucyBjb250YWN0T3AgPQotICAgICAgICAgICAgQ29udGFjdE9wZXJhdGlvbnMuY3JlYXRlTmV3Q29udGFjdChjb250ZXh0LCB1c2VyLmdldFVzZXJJZCgpLAotICAgICAgICAgICAgICAgIGFjY291bnROYW1lLCBiYXRjaE9wZXJhdGlvbik7Ci0gICAgICAgIGNvbnRhY3RPcC5hZGROYW1lKHVzZXIuZ2V0Rmlyc3ROYW1lKCksIHVzZXIuZ2V0TGFzdE5hbWUoKSkuYWRkRW1haWwoCi0gICAgICAgICAgICB1c2VyLmdldEVtYWlsKCkpLmFkZFBob25lKHVzZXIuZ2V0Q2VsbFBob25lKCksIFBob25lLlRZUEVfTU9CSUxFKQotICAgICAgICAgICAgLmFkZFBob25lKHVzZXIuZ2V0SG9tZVBob25lKCksIFBob25lLlRZUEVfT1RIRVIpLmFkZFByb2ZpbGVBY3Rpb24oCi0gICAgICAgICAgICAgICAgdXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgICAgICBDb250YWN0T3BlcmF0aW9ucy5jcmVhdGVOZXdDb250YWN0KGNvbnRleHQsIHVzZXIuZ2V0VXNlcklkKCksIGFjY291bnROYW1lLAorICAgICAgICAgICAgICAgIGJhdGNoT3BlcmF0aW9uKTsKKyAgICAgICAgY29udGFjdE9wLmFkZE5hbWUodXNlci5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpKS5hZGRFbWFpbCh1c2VyLmdldEVtYWlsKCkpCisgICAgICAgICAgICAuYWRkUGhvbmUodXNlci5nZXRDZWxsUGhvbmUoKSwgUGhvbmUuVFlQRV9NT0JJTEUpLmFkZFBob25lKHVzZXIuZ2V0SG9tZVBob25lKCksCisgICAgICAgICAgICAgICAgUGhvbmUuVFlQRV9PVEhFUikuYWRkUHJvZmlsZUFjdGlvbih1c2VyLmdldFVzZXJJZCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE2NSw3NiArMTU4LDU3IEBACiAgICAgICogQHBhcmFtIHJhd0NvbnRhY3RJZCB0aGUgdW5pcXVlIElkIGZvciB0aGlzIHJhd0NvbnRhY3QgaW4gY29udGFjdHMKICAgICAgKiAgICAgICAgcHJvdmlkZXIKICAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBhY2NvdW50TmFtZSwgVXNlciB1c2VyLAotICAgICAgICBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBDb250ZW50UmVzb2x2ZXIgcmVzb2x2ZXIsCisgICAgICAgIFN0cmluZyBhY2NvdW50TmFtZSwgVXNlciB1c2VyLCBsb25nIHJhd0NvbnRhY3RJZCwgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICBVcmkgdXJpOwogICAgICAgICBTdHJpbmcgY2VsbFBob25lID0gbnVsbDsKICAgICAgICAgU3RyaW5nIG90aGVyUGhvbmUgPSBudWxsOwogICAgICAgICBTdHJpbmcgZW1haWwgPSBudWxsOwotCiAgICAgICAgIGZpbmFsIEN1cnNvciBjID0KLSAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIERhdGFRdWVyeS5QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIERhdGFRdWVyeS5TRUxFQ1RJT04sCisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShEYXRhLkNPTlRFTlRfVVJJLCBEYXRhUXVlcnkuUFJPSkVDVElPTiwgRGF0YVF1ZXJ5LlNFTEVDVElPTiwKICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKHJhd0NvbnRhY3RJZCl9LCBudWxsKTsKICAgICAgICAgZmluYWwgQ29udGFjdE9wZXJhdGlvbnMgY29udGFjdE9wID0KLSAgICAgICAgICAgIENvbnRhY3RPcGVyYXRpb25zLnVwZGF0ZUV4aXN0aW5nQ29udGFjdChjb250ZXh0LCByYXdDb250YWN0SWQsCi0gICAgICAgICAgICAgICAgYmF0Y2hPcGVyYXRpb24pOwotCisgICAgICAgICAgICBDb250YWN0T3BlcmF0aW9ucy51cGRhdGVFeGlzdGluZ0NvbnRhY3QoY29udGV4dCwgcmF3Q29udGFjdElkLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICB3aGlsZSAoYy5tb3ZlVG9OZXh0KCkpIHsKICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkID0gYy5nZXRMb25nKERhdGFRdWVyeS5DT0xVTU5fSUQpOwogICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtaW1lVHlwZSA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fTUlNRVRZUEUpOwogICAgICAgICAgICAgICAgIHVyaSA9IENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKERhdGEuQ09OVEVOVF9VUkksIGlkKTsKLQogICAgICAgICAgICAgICAgIGlmIChtaW1lVHlwZS5lcXVhbHMoU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX0ZBTUlMWV9OQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0TmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX0dJVkVOX05BTUUpOwotICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlTmFtZSh1cmksIGZpcnN0TmFtZSwgbGFzdE5hbWUsIHVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdE5hbWUoKSwgdXNlci5nZXRMYXN0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsYXN0TmFtZSA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fRkFNSUxZX05BTUUpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3ROYW1lID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9HSVZFTl9OQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZU5hbWUodXJpLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCB1c2VyLmdldEZpcnN0TmFtZSgpLCB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TGFzdE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lVHlwZS5lcXVhbHMoUGhvbmUuQ09OVEVOVF9JVEVNX1RZUEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0eXBlID0gYy5nZXRJbnQoRGF0YVF1ZXJ5LkNPTFVNTl9QSE9ORV9UWVBFKTsKLQogICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBQaG9uZS5UWVBFX01PQklMRSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY2VsbFBob25lID0gYy5nZXRTdHJpbmcoRGF0YVF1ZXJ5LkNPTFVNTl9QSE9ORV9OVU1CRVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKGNlbGxQaG9uZSwgdXNlci5nZXRDZWxsUGhvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKGNlbGxQaG9uZSwgdXNlci5nZXRDZWxsUGhvbmUoKSwgdXJpKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFBob25lLlRZUEVfT1RIRVIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyUGhvbmUgPSBjLmdldFN0cmluZyhEYXRhUXVlcnkuQ09MVU1OX1BIT05FX05VTUJFUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250YWN0T3AudXBkYXRlUGhvbmUob3RoZXJQaG9uZSwgdXNlci5nZXRIb21lUGhvbmUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wLnVwZGF0ZVBob25lKG90aGVyUGhvbmUsIHVzZXIuZ2V0SG9tZVBob25lKCksIHVyaSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChEYXRhLk1JTUVUWVBFLmVxdWFscyhFbWFpbC5DT05URU5UX0lURU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERhdGEuTUlNRVRZUEUuZXF1YWxzKEVtYWlsLkNPTlRFTlRfSVRFTV9UWVBFKSkgewogICAgICAgICAgICAgICAgICAgICBlbWFpbCA9IGMuZ2V0U3RyaW5nKERhdGFRdWVyeS5DT0xVTU5fRU1BSUxfQUREUkVTUyk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcC51cGRhdGVFbWFpbCh1c2VyLmdldEVtYWlsKCksIGVtYWlsLCB1cmkpOwotCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSAvLyB3aGlsZQogICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgYy5jbG9zZSgpOwogICAgICAgICB9Ci0KICAgICAgICAgLy8gQWRkIHRoZSBjZWxsIHBob25lLCBpZiBwcmVzZW50IGFuZCBub3QgdXBkYXRlZCBhYm92ZQogICAgICAgICBpZiAoY2VsbFBob25lID09IG51bGwpIHsKICAgICAgICAgICAgIGNvbnRhY3RPcC5hZGRQaG9uZSh1c2VyLmdldENlbGxQaG9uZSgpLCBQaG9uZS5UWVBFX01PQklMRSk7CiAgICAgICAgIH0KLQogICAgICAgICAvLyBBZGQgdGhlIG90aGVyIHBob25lLCBpZiBwcmVzZW50IGFuZCBub3QgdXBkYXRlZCBhYm92ZQogICAgICAgICBpZiAob3RoZXJQaG9uZSA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb250YWN0T3AuYWRkUGhvbmUodXNlci5nZXRIb21lUGhvbmUoKSwgUGhvbmUuVFlQRV9PVEhFUik7CiAgICAgICAgIH0KLQogICAgICAgICAvLyBBZGQgdGhlIGVtYWlsIGFkZHJlc3MsIGlmIHByZXNlbnQgYW5kIG5vdCB1cGRhdGVkIGFib3ZlCiAgICAgICAgIGlmIChlbWFpbCA9PSBudWxsKSB7CiAgICAgICAgICAgICBjb250YWN0T3AuYWRkRW1haWwodXNlci5nZXRFbWFpbCgpKTsKICAgICAgICAgfQotCiAgICAgfQogCiAgICAgLyoqCkBAIC0yNDYsOSArMjIwLDkgQEAKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZUNvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwKICAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICBiYXRjaE9wZXJhdGlvbi5hZGQoQ29udGFjdE9wZXJhdGlvbnMubmV3RGVsZXRlQ3BvKAotICAgICAgICAgICAgQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIHJhd0NvbnRhY3RJZCksCi0gICAgICAgICAgICB0cnVlKS5idWlsZCgpKTsKKyAgICAgICAgICAgIENvbnRlbnRVcmlzLndpdGhBcHBlbmRlZElkKFJhd0NvbnRhY3RzLkNPTlRFTlRfVVJJLCByYXdDb250YWN0SWQpLCB0cnVlKS5idWlsZCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTI2MCwxMSArMjM0LDExIEBACiAgICAgICogQHJldHVybiB0aGUgUmF3Q29udGFjdCBpZCwgb3IgMCBpZiBub3QgZm91bmQKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGxvb2t1cFJhd0NvbnRhY3QoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBsb25nIHVzZXJJZCkgeworCiAgICAgICAgIGxvbmcgYXV0aG9ySWQgPSAwOwogICAgICAgICBmaW5hbCBDdXJzb3IgYyA9Ci0gICAgICAgICAgICByZXNvbHZlci5xdWVyeShSYXdDb250YWN0cy5DT05URU5UX1VSSSwgVXNlcklkUXVlcnkuUFJPSkVDVElPTiwKLSAgICAgICAgICAgICAgICBVc2VySWRRdWVyeS5TRUxFQ1RJT04sIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sCi0gICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShSYXdDb250YWN0cy5DT05URU5UX1VSSSwgVXNlcklkUXVlcnkuUFJPSkVDVElPTiwgVXNlcklkUXVlcnkuU0VMRUNUSU9OLAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sIG51bGwpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgaWYgKGMubW92ZVRvRmlyc3QoKSkgewogICAgICAgICAgICAgICAgIGF1dGhvcklkID0gYy5nZXRMb25nKFVzZXJJZFF1ZXJ5LkNPTFVNTl9JRCk7CkBAIC0yODYsMTEgKzI2MCwxMSBAQAogICAgICAqIEByZXR1cm4gdGhlIHByb2ZpbGUgRGF0YSByb3cgaWQsIG9yIDAgaWYgbm90IGZvdW5kCiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBsb29rdXBQcm9maWxlKENvbnRlbnRSZXNvbHZlciByZXNvbHZlciwgbG9uZyB1c2VySWQpIHsKKwogICAgICAgICBsb25nIHByb2ZpbGVJZCA9IDA7CiAgICAgICAgIGZpbmFsIEN1cnNvciBjID0KLSAgICAgICAgICAgIHJlc29sdmVyLnF1ZXJ5KERhdGEuQ09OVEVOVF9VUkksIFByb2ZpbGVRdWVyeS5QUk9KRUNUSU9OLAotICAgICAgICAgICAgICAgIFByb2ZpbGVRdWVyeS5TRUxFQ1RJT04sIG5ldyBTdHJpbmdbXSB7U3RyaW5nLnZhbHVlT2YodXNlcklkKX0sCi0gICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXNvbHZlci5xdWVyeShEYXRhLkNPTlRFTlRfVVJJLCBQcm9maWxlUXVlcnkuUFJPSkVDVElPTiwgUHJvZmlsZVF1ZXJ5LlNFTEVDVElPTiwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10ge1N0cmluZy52YWx1ZU9mKHVzZXJJZCl9LCBudWxsKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChjICE9IG51bGwgJiYgYy5tb3ZlVG9GaXJzdCgpKSB7CiAgICAgICAgICAgICAgICAgcHJvZmlsZUlkID0gYy5nZXRMb25nKFByb2ZpbGVRdWVyeS5DT0xVTU5fSUQpOwpAQCAtMzA3LDIyICsyODEsMzAgQEAKICAgICAgKiBDb25zdGFudHMgZm9yIGEgcXVlcnkgdG8gZmluZCBhIGNvbnRhY3QgZ2l2ZW4gYSBzYW1wbGUgU3luY0FkYXB0ZXIgdXNlcgogICAgICAqIElELgogICAgICAqLwotICAgIHByaXZhdGUgaW50ZXJmYWNlIFByb2ZpbGVRdWVyeSB7CisgICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvZmlsZVF1ZXJ5IHsKKworICAgICAgICBwcml2YXRlIFByb2ZpbGVRdWVyeSgpIHsKKyAgICAgICAgfQorCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJPSkVDVElPTiA9IG5ldyBTdHJpbmdbXSB7RGF0YS5fSUR9OwogCiAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTFVNTl9JRCA9IDA7CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUSU9OID0KLSAgICAgICAgICAgIERhdGEuTUlNRVRZUEUgKyAiPSciICsgU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLk1JTUVfUFJPRklMRQotICAgICAgICAgICAgICAgICsgIicgQU5EICIgKyBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuREFUQV9QSUQgKyAiPT8iOworICAgICAgICAgICAgRGF0YS5NSU1FVFlQRSArICI9JyIgKyBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuTUlNRV9QUk9GSUxFICsgIicgQU5EICIKKyAgICAgICAgICAgICAgICArIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5EQVRBX1BJRCArICI9PyI7CiAgICAgfQorCiAgICAgLyoqCiAgICAgICogQ29uc3RhbnRzIGZvciBhIHF1ZXJ5IHRvIGZpbmQgYSBjb250YWN0IGdpdmVuIGEgc2FtcGxlIFN5bmNBZGFwdGVyIHVzZXIKICAgICAgKiBJRC4KICAgICAgKi8KLSAgICBwcml2YXRlIGludGVyZmFjZSBVc2VySWRRdWVyeSB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nW10gUFJPSkVDVElPTiA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nW10ge1Jhd0NvbnRhY3RzLl9JRH07CisgICAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVXNlcklkUXVlcnkgeworCisgICAgICAgIHByaXZhdGUgVXNlcklkUXVlcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIFBST0pFQ1RJT04gPSBuZXcgU3RyaW5nW10ge1Jhd0NvbnRhY3RzLl9JRH07CiAKICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQ09MVU1OX0lEID0gMDsKIApAQCAtMzM0LDIxICszMTYsMzQgQEAKICAgICAvKioKICAgICAgKiBDb25zdGFudHMgZm9yIGEgcXVlcnkgdG8gZ2V0IGNvbnRhY3QgZGF0YSBmb3IgYSBnaXZlbiByYXdDb250YWN0SWQKICAgICAgKi8KLSAgICBwcml2YXRlIGludGVyZmFjZSBEYXRhUXVlcnkgeworICAgIGZpbmFsIHByaXZhdGUgc3RhdGljIGNsYXNzIERhdGFRdWVyeSB7CisKKyAgICAgICAgcHJpdmF0ZSBEYXRhUXVlcnkoKSB7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBST0pFQ1RJT04gPQotICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHtEYXRhLl9JRCwgRGF0YS5NSU1FVFlQRSwgRGF0YS5EQVRBMSwgRGF0YS5EQVRBMiwKLSAgICAgICAgICAgICAgICBEYXRhLkRBVEEzLH07CisgICAgICAgICAgICBuZXcgU3RyaW5nW10ge0RhdGEuX0lELCBEYXRhLk1JTUVUWVBFLCBEYXRhLkRBVEExLCBEYXRhLkRBVEEyLCBEYXRhLkRBVEEzLH07CiAKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lEID0gMDsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTUlNRVRZUEUgPSAxOworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9EQVRBMSA9IDI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0RBVEEyID0gMzsKKwogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREFUQTMgPSA0OworCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9QSE9ORV9OVU1CRVIgPSBDT0xVTU5fREFUQTE7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1BIT05FX1RZUEUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0VNQUlMX0FERFJFU1MgPSBDT0xVTU5fREFUQTE7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0VNQUlMX1RZUEUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0dJVkVOX05BTUUgPSBDT0xVTU5fREFUQTI7CisKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0ZBTUlMWV9OQU1FID0gQ09MVU1OX0RBVEEzOwogCiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVElPTiA9IERhdGEuUkFXX0NPTlRBQ1RfSUQgKyAiPT8iOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL0NvbnRhY3RPcGVyYXRpb25zLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQppbmRleCA5ZTQ3ZjcwLi5kYjAxZjQ4IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vQ29udGFjdE9wZXJhdGlvbnMuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnBsYXRmb3JtOwogCiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlck9wZXJhdGlvbjsKQEAgLTM4LDEyICszNywxOSBAQAogcHVibGljIGNsYXNzIENvbnRhY3RPcGVyYXRpb25zIHsKIAogICAgIHByaXZhdGUgZmluYWwgQ29udGVudFZhbHVlcyBtVmFsdWVzOworCiAgICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBtQnVpbGRlcjsKKwogICAgIHByaXZhdGUgZmluYWwgQmF0Y2hPcGVyYXRpb24gbUJhdGNoT3BlcmF0aW9uOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1ZaWVsZDsKKwogICAgIHByaXZhdGUgbG9uZyBtUmF3Q29udGFjdElkOworCiAgICAgcHJpdmF0ZSBpbnQgbUJhY2tSZWZlcmVuY2U7CisKICAgICBwcml2YXRlIGJvb2xlYW4gbUlzTmV3Q29udGFjdDsKIAogICAgIC8qKgpAQCAtNTUsMTAgKzYxLDEwIEBACiAgICAgICogQHBhcmFtIGFjY291bnROYW1lIHRoZSB1c2VybmFtZSBvZiB0aGUgY3VycmVudCBsb2dpbgogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIENvbnRhY3RPcGVyYXRpb25zIGNyZWF0ZU5ld0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LAotICAgICAgICBpbnQgdXNlcklkLCBTdHJpbmcgYWNjb3VudE5hbWUsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ29udGFjdE9wZXJhdGlvbnMoY29udGV4dCwgdXNlcklkLCBhY2NvdW50TmFtZSwKLSAgICAgICAgICAgIGJhdGNoT3BlcmF0aW9uKTsKKyAgICBwdWJsaWMgc3RhdGljIENvbnRhY3RPcGVyYXRpb25zIGNyZWF0ZU5ld0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkLAorICAgICAgICBTdHJpbmcgYWNjb3VudE5hbWUsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWN0T3BlcmF0aW9ucyhjb250ZXh0LCB1c2VySWQsIGFjY291bnROYW1lLCBiYXRjaE9wZXJhdGlvbik7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OSw4ICs3NSw5IEBACiAgICAgICogQHBhcmFtIHJhd0NvbnRhY3RJZCB0aGUgdW5pcXVlIElkIG9mIHRoZSBleGlzdGluZyByYXdDb250YWN0CiAgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBDb250YWN0T3BlcmF0aW9ucwogICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlRXhpc3RpbmdDb250YWN0KENvbnRleHQgY29udGV4dCwKLSAgICAgICAgbG9uZyByYXdDb250YWN0SWQsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHVibGljIHN0YXRpYyBDb250YWN0T3BlcmF0aW9ucyB1cGRhdGVFeGlzdGluZ0NvbnRhY3QoQ29udGV4dCBjb250ZXh0LCBsb25nIHJhd0NvbnRhY3RJZCwKKyAgICAgICAgQmF0Y2hPcGVyYXRpb24gYmF0Y2hPcGVyYXRpb24pIHsKKwogICAgICAgICByZXR1cm4gbmV3IENvbnRhY3RPcGVyYXRpb25zKGNvbnRleHQsIHJhd0NvbnRhY3RJZCwgYmF0Y2hPcGVyYXRpb24pOwogICAgIH0KIApAQCAtODMsMTkgKzkwLDE4IEBACiAKICAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMoQ29udGV4dCBjb250ZXh0LCBpbnQgdXNlcklkLCBTdHJpbmcgYWNjb3VudE5hbWUsCiAgICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisKICAgICAgICAgdGhpcyhjb250ZXh0LCBiYXRjaE9wZXJhdGlvbik7CiAgICAgICAgIG1CYWNrUmVmZXJlbmNlID0gbUJhdGNoT3BlcmF0aW9uLnNpemUoKTsKICAgICAgICAgbUlzTmV3Q29udGFjdCA9IHRydWU7CiAgICAgICAgIG1WYWx1ZXMucHV0KFJhd0NvbnRhY3RzLlNPVVJDRV9JRCwgdXNlcklkKTsKICAgICAgICAgbVZhbHVlcy5wdXQoUmF3Q29udGFjdHMuQUNDT1VOVF9UWVBFLCBDb25zdGFudHMuQUNDT1VOVF9UWVBFKTsKICAgICAgICAgbVZhbHVlcy5wdXQoUmF3Q29udGFjdHMuQUNDT1VOVF9OQU1FLCBhY2NvdW50TmFtZSk7Ci0gICAgICAgIG1CdWlsZGVyID0KLSAgICAgICAgICAgIG5ld0luc2VydENwbyhSYXdDb250YWN0cy5DT05URU5UX1VSSSwgdHJ1ZSkud2l0aFZhbHVlcyhtVmFsdWVzKTsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXdJbnNlcnRDcG8oUmF3Q29udGFjdHMuQ09OVEVOVF9VUkksIHRydWUpLndpdGhWYWx1ZXMobVZhbHVlcyk7CiAgICAgICAgIG1CYXRjaE9wZXJhdGlvbi5hZGQobUJ1aWxkZXIuYnVpbGQoKSk7CiAgICAgfQogCi0gICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zKENvbnRleHQgY29udGV4dCwgbG9uZyByYXdDb250YWN0SWQsCi0gICAgICAgIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CisgICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zKENvbnRleHQgY29udGV4dCwgbG9uZyByYXdDb250YWN0SWQsIEJhdGNoT3BlcmF0aW9uIGJhdGNoT3BlcmF0aW9uKSB7CiAgICAgICAgIHRoaXMoY29udGV4dCwgYmF0Y2hPcGVyYXRpb24pOwogICAgICAgICBtSXNOZXdDb250YWN0ID0gZmFsc2U7CiAgICAgICAgIG1SYXdDb250YWN0SWQgPSByYXdDb250YWN0SWQ7CkBAIC0xMDksMTYgKzExNSwxNSBAQAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KICAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgYWRkTmFtZShTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKwogICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmlzRW1wdHkoZmlyc3ROYW1lKSkgewogICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgZmlyc3ROYW1lKTsKLSAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLAotICAgICAgICAgICAgICAgIFN0cnVjdHVyZWROYW1lLkNPTlRFTlRfSVRFTV9UWVBFKTsKKyAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLk1JTUVUWVBFLCBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFUZXh0VXRpbHMuaXNFbXB0eShsYXN0TmFtZSkpIHsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KFN0cnVjdHVyZWROYW1lLkZBTUlMWV9OQU1FLCBsYXN0TmFtZSk7Ci0gICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSU1FVFlQRSwKLSAgICAgICAgICAgICAgICBTdHJ1Y3R1cmVkTmFtZS5DT05URU5UX0lURU1fVFlQRSk7CisgICAgICAgICAgICBtVmFsdWVzLnB1dChTdHJ1Y3R1cmVkTmFtZS5NSU1FVFlQRSwgU3RydWN0dXJlZE5hbWUuQ09OVEVOVF9JVEVNX1RZUEUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVmFsdWVzLnNpemUoKSA+IDApIHsKICAgICAgICAgICAgIGFkZEluc2VydE9wKCk7CkBAIC0xODgsOCArMTkzLDcgQEAKICAgICAgKiBAcGFyYW0gdXJpIFVyaSBmb3IgdGhlIGV4aXN0aW5nIHJhdyBjb250YWN0IHRvIGJlIHVwZGF0ZWQKICAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIENvbnRhY3RPcGVyYXRpb25zCiAgICAgICovCi0gICAgcHVibGljIENvbnRhY3RPcGVyYXRpb25zIHVwZGF0ZUVtYWlsKFN0cmluZyBlbWFpbCwgU3RyaW5nIGV4aXN0aW5nRW1haWwsCi0gICAgICAgIFVyaSB1cmkpIHsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlRW1haWwoU3RyaW5nIGVtYWlsLCBTdHJpbmcgZXhpc3RpbmdFbWFpbCwgVXJpIHVyaSkgewogICAgICAgICBpZiAoIVRleHRVdGlscy5lcXVhbHMoZXhpc3RpbmdFbWFpbCwgZW1haWwpKSB7CiAgICAgICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChFbWFpbC5EQVRBLCBlbWFpbCk7CkBAIC0yMDcsMTAgKzIxMSwxMSBAQAogICAgICAqIEBwYXJhbSB1cmkgVXJpIGZvciB0aGUgZXhpc3RpbmcgcmF3IGNvbnRhY3QgdG8gYmUgdXBkYXRlZAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlTmFtZShVcmkgdXJpLCBTdHJpbmcgZXhpc3RpbmdGaXJzdE5hbWUsCi0gICAgICAgIFN0cmluZyBleGlzdGluZ0xhc3ROYW1lLCBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKLSAgICAgICAgTG9nLmkoIkNvbnRhY3RPcGVyYXRpb25zIiwgImVmPSIgKyBleGlzdGluZ0ZpcnN0TmFtZSArICJlbD0iCi0gICAgICAgICAgICArIGV4aXN0aW5nTGFzdE5hbWUgKyAiZj0iICsgZmlyc3ROYW1lICsgImw9IiArIGxhc3ROYW1lKTsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlTmFtZShVcmkgdXJpLCBTdHJpbmcgZXhpc3RpbmdGaXJzdE5hbWUsIFN0cmluZyBleGlzdGluZ0xhc3ROYW1lLAorICAgICAgICBTdHJpbmcgZmlyc3ROYW1lLCBTdHJpbmcgbGFzdE5hbWUpIHsKKworICAgICAgICBMb2cuaSgiQ29udGFjdE9wZXJhdGlvbnMiLCAiZWY9IiArIGV4aXN0aW5nRmlyc3ROYW1lICsgImVsPSIgKyBleGlzdGluZ0xhc3ROYW1lICsgImY9IgorICAgICAgICAgICAgKyBmaXJzdE5hbWUgKyAibD0iICsgbGFzdE5hbWUpOwogICAgICAgICBtVmFsdWVzLmNsZWFyKCk7CiAgICAgICAgIGlmICghVGV4dFV0aWxzLmVxdWFscyhleGlzdGluZ0ZpcnN0TmFtZSwgZmlyc3ROYW1lKSkgewogICAgICAgICAgICAgbVZhbHVlcy5wdXQoU3RydWN0dXJlZE5hbWUuR0lWRU5fTkFNRSwgZmlyc3ROYW1lKTsKQEAgLTIzMiw4ICsyMzcsNyBAQAogICAgICAqIEBwYXJhbSB1cmkgVXJpIGZvciB0aGUgZXhpc3RpbmcgcmF3IGNvbnRhY3QgdG8gYmUgdXBkYXRlZAogICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2YgQ29udGFjdE9wZXJhdGlvbnMKICAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlUGhvbmUoU3RyaW5nIGV4aXN0aW5nTnVtYmVyLCBTdHJpbmcgcGhvbmUsCi0gICAgICAgIFVyaSB1cmkpIHsKKyAgICBwdWJsaWMgQ29udGFjdE9wZXJhdGlvbnMgdXBkYXRlUGhvbmUoU3RyaW5nIGV4aXN0aW5nTnVtYmVyLCBTdHJpbmcgcGhvbmUsIFVyaSB1cmkpIHsKICAgICAgICAgaWYgKCFUZXh0VXRpbHMuZXF1YWxzKHBob25lLCBleGlzdGluZ051bWJlcikpIHsKICAgICAgICAgICAgIG1WYWx1ZXMuY2xlYXIoKTsKICAgICAgICAgICAgIG1WYWx1ZXMucHV0KFBob25lLk5VTUJFUiwgcGhvbmUpOwpAQCAtMjYwLDE2ICsyNjQsMTQgQEAKICAgICAgKiBBZGRzIGFuIGluc2VydCBvcGVyYXRpb24gaW50byB0aGUgYmF0Y2gKICAgICAgKi8KICAgICBwcml2YXRlIHZvaWQgYWRkSW5zZXJ0T3AoKSB7CisKICAgICAgICAgaWYgKCFtSXNOZXdDb250YWN0KSB7CiAgICAgICAgICAgICBtVmFsdWVzLnB1dChQaG9uZS5SQVdfQ09OVEFDVF9JRCwgbVJhd0NvbnRhY3RJZCk7CiAgICAgICAgIH0KLSAgICAgICAgbUJ1aWxkZXIgPQotICAgICAgICAgICAgbmV3SW5zZXJ0Q3BvKGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIoRGF0YS5DT05URU5UX1VSSSksCi0gICAgICAgICAgICAgICAgbVlpZWxkKTsKKyAgICAgICAgbUJ1aWxkZXIgPSBuZXdJbnNlcnRDcG8oYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcihEYXRhLkNPTlRFTlRfVVJJKSwgbVlpZWxkKTsKICAgICAgICAgbUJ1aWxkZXIud2l0aFZhbHVlcyhtVmFsdWVzKTsKICAgICAgICAgaWYgKG1Jc05ld0NvbnRhY3QpIHsKLSAgICAgICAgICAgIG1CdWlsZGVyCi0gICAgICAgICAgICAgICAgLndpdGhWYWx1ZUJhY2tSZWZlcmVuY2UoRGF0YS5SQVdfQ09OVEFDVF9JRCwgbUJhY2tSZWZlcmVuY2UpOworICAgICAgICAgICAgbUJ1aWxkZXIud2l0aFZhbHVlQmFja1JlZmVyZW5jZShEYXRhLlJBV19DT05UQUNUX0lELCBtQmFja1JlZmVyZW5jZSk7CiAgICAgICAgIH0KICAgICAgICAgbVlpZWxkID0gZmFsc2U7CiAgICAgICAgIG1CYXRjaE9wZXJhdGlvbi5hZGQobUJ1aWxkZXIuYnVpbGQoKSk7CkBAIC0yODQsMjggKzI4NiwyMyBAQAogICAgICAgICBtQmF0Y2hPcGVyYXRpb24uYWRkKG1CdWlsZGVyLmJ1aWxkKCkpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3SW5zZXJ0Q3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3SW5zZXJ0Q3BvKFVyaSB1cmksIGJvb2xlYW4geWllbGQpIHsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdJbnNlcnQoYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcih1cmkpKQorICAgICAgICAgICAgLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3VXBkYXRlQ3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdVcGRhdGUoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3VXBkYXRlQ3BvKFVyaSB1cmksIGJvb2xlYW4geWllbGQpIHsKKyAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdVcGRhdGUoYWRkQ2FsbGVySXNTeW5jQWRhcHRlclBhcmFtZXRlcih1cmkpKQorICAgICAgICAgICAgLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLkJ1aWxkZXIgbmV3RGVsZXRlQ3BvKFVyaSB1cmksCi0gICAgICAgIGJvb2xlYW4geWllbGQpIHsKLSAgICAgICAgcmV0dXJuIENvbnRlbnRQcm92aWRlck9wZXJhdGlvbi5uZXdEZWxldGUoCi0gICAgICAgICAgICBhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpLndpdGhZaWVsZEFsbG93ZWQoeWllbGQpOwotCisgICAgcHVibGljIHN0YXRpYyBDb250ZW50UHJvdmlkZXJPcGVyYXRpb24uQnVpbGRlciBuZXdEZWxldGVDcG8oVXJpIHVyaSwgYm9vbGVhbiB5aWVsZCkgeworICAgICAgICByZXR1cm4gQ29udGVudFByb3ZpZGVyT3BlcmF0aW9uLm5ld0RlbGV0ZShhZGRDYWxsZXJJc1N5bmNBZGFwdGVyUGFyYW1ldGVyKHVyaSkpCisgICAgICAgICAgICAud2l0aFlpZWxkQWxsb3dlZCh5aWVsZCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgVXJpIGFkZENhbGxlcklzU3luY0FkYXB0ZXJQYXJhbWV0ZXIoVXJpIHVyaSkgewotICAgICAgICByZXR1cm4gdXJpLmJ1aWxkVXBvbigpLmFwcGVuZFF1ZXJ5UGFyYW1ldGVyKAotICAgICAgICAgICAgQ29udGFjdHNDb250cmFjdC5DQUxMRVJfSVNfU1lOQ0FEQVBURVIsICJ0cnVlIikuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIHVyaS5idWlsZFVwb24oKS5hcHBlbmRRdWVyeVBhcmFtZXRlcihDb250YWN0c0NvbnRyYWN0LkNBTExFUl9JU19TWU5DQURBUFRFUiwgInRydWUiKQorICAgICAgICAgICAgLmJ1aWxkKCk7CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvcGxhdGZvcm0vU2FtcGxlU3luY0FkYXB0ZXJDb2x1bW5zLmphdmEKaW5kZXggYmMwMjMyNS4uN2I2MGQ1YiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3BsYXRmb3JtL1NhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucy5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9wbGF0Zm9ybS9TYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMuamF2YQpAQCAtMjAsNyArMjAsMTEgQEAKIC8qCiAgKiBUaGUgc3RhbmRhcmQgY29sdW1ucyByZXByZXNlbnRpbmcgY29udGFjdCdzIGluZm8gZnJvbSBzb2NpYWwgYXBwcy4KICAqLwotcHVibGljIGludGVyZmFjZSBTYW1wbGVTeW5jQWRhcHRlckNvbHVtbnMgeworcHVibGljIGZpbmFsIGNsYXNzIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucyB7CisKKyAgICBwcml2YXRlIFNhbXBsZVN5bmNBZGFwdGVyQ29sdW1ucygpIHsKKyAgICB9CisKICAgICAvKioKICAgICAgKiBNSU1FLXR5cGUgdXNlZCB3aGVuIHN0b3JpbmcgYSBwcm9maWxlIHtAbGluayBEYXRhfSBlbnRyeS4KICAgICAgKi8KQEAgLTI4LDcgKzMyLDggQEAKICAgICAgICAgInZuZC5hbmRyb2lkLmN1cnNvci5pdGVtL3ZuZC5zYW1wbGVzeW5jYWRhcHRlci5wcm9maWxlIjsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfUElEID0gRGF0YS5EQVRBMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX1NVTU1BUlkgPSBEYXRhLkRBVEEyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfREVUQUlMID0gRGF0YS5EQVRBMzsKIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEFfU1VNTUFSWSA9IERhdGEuREFUQTI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVRBX0RFVEFJTCA9IERhdGEuREFUQTM7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY0FkYXB0ZXIuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCmluZGV4IDA3NTI1YWEuLjIwNjE4OWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9zeW5jYWRhcHRlci9TeW5jQWRhcHRlci5qYXZhCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgogICogdGhlIExpY2Vuc2UuCiAgKi8KLQogcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuc3luY2FkYXB0ZXI7CiAKIGltcG9ydCBhbmRyb2lkLmFjY291bnRzLkFjY291bnQ7CkBAIC00Niw5ICs0NSwxMSBAQAogICogcGxhdGZvcm0gQ29udGFjdE9wZXJhdGlvbnMgcHJvdmlkZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBTeW5jQWRhcHRlciBleHRlbmRzIEFic3RyYWN0VGhyZWFkZWRTeW5jQWRhcHRlciB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN5bmNBZGFwdGVyIjsKIAogICAgIHByaXZhdGUgZmluYWwgQWNjb3VudE1hbmFnZXIgbUFjY291bnRNYW5hZ2VyOworCiAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwogCiAgICAgcHJpdmF0ZSBEYXRlIG1MYXN0VXBkYXRlZDsKQEAgLTYyLDE4ICs2MywxNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIG9uUGVyZm9ybVN5bmMoQWNjb3VudCBhY2NvdW50LCBCdW5kbGUgZXh0cmFzLCBTdHJpbmcgYXV0aG9yaXR5LAogICAgICAgICBDb250ZW50UHJvdmlkZXJDbGllbnQgcHJvdmlkZXIsIFN5bmNSZXN1bHQgc3luY1Jlc3VsdCkgeworCiAgICAgICAgIExpc3Q8VXNlcj4gdXNlcnM7CiAgICAgICAgIExpc3Q8U3RhdHVzPiBzdGF0dXNlczsKICAgICAgICAgU3RyaW5nIGF1dGh0b2tlbiA9IG51bGw7Ci0gICAgICAgICB0cnkgewotICAgICAgICAgICAgIC8vIHVzZSB0aGUgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhlIGNyZWRlbnRpYWxzCi0gICAgICAgICAgICAgYXV0aHRva2VuID0KLSAgICAgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuYmxvY2tpbmdHZXRBdXRoVG9rZW4oYWNjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFLCB0cnVlIC8qIG5vdGlmeUF1dGhGYWlsdXJlICovKTsKLSAgICAgICAgICAgICAvLyBmZXRjaCB1cGRhdGVzIGZyb20gdGhlIHNhbXBsZSBzZXJ2aWNlIG92ZXIgdGhlIGNsb3VkCi0gICAgICAgICAgICAgdXNlcnMgPQotICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsaXRpZXMuZmV0Y2hGcmllbmRVcGRhdGVzKGFjY291bnQsIGF1dGh0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVkKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgYWNjb3VudCBtYW5hZ2VyIHRvIHJlcXVlc3QgdGhlIGNyZWRlbnRpYWxzCisgICAgICAgICAgICBhdXRodG9rZW4gPQorICAgICAgICAgICAgICAgIG1BY2NvdW50TWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAuYmxvY2tpbmdHZXRBdXRoVG9rZW4oYWNjb3VudCwgQ29uc3RhbnRzLkFVVEhUT0tFTl9UWVBFLCB0cnVlIC8qIG5vdGlmeUF1dGhGYWlsdXJlICovKTsKKyAgICAgICAgICAgIC8vIGZldGNoIHVwZGF0ZXMgZnJvbSB0aGUgc2FtcGxlIHNlcnZpY2Ugb3ZlciB0aGUgY2xvdWQKKyAgICAgICAgICAgIHVzZXJzID0gTmV0d29ya1V0aWxpdGllcy5mZXRjaEZyaWVuZFVwZGF0ZXMoYWNjb3VudCwgYXV0aHRva2VuLCBtTGFzdFVwZGF0ZWQpOwogICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBsYXN0IHN5bmNlZCBkYXRlLgogICAgICAgICAgICAgbUxhc3RVcGRhdGVkID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgIC8vIHVwZGF0ZSBwbGF0Zm9ybSBjb250YWN0cy4KQEAgLTkxLDggKzkxLDcgQEAKICAgICAgICAgICAgIExvZy5lKFRBRywgIklPRXhjZXB0aW9uIiwgZSk7CiAgICAgICAgICAgICBzeW5jUmVzdWx0LnN0YXRzLm51bUlvRXhjZXB0aW9ucysrOwogICAgICAgICB9IGNhdGNoIChmaW5hbCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihDb25zdGFudHMuQUNDT1VOVF9UWVBFLAotICAgICAgICAgICAgICAgIGF1dGh0b2tlbik7CisgICAgICAgICAgICBtQWNjb3VudE1hbmFnZXIuaW52YWxpZGF0ZUF1dGhUb2tlbihDb25zdGFudHMuQUNDT1VOVF9UWVBFLCBhdXRodG9rZW4pOwogICAgICAgICAgICAgc3luY1Jlc3VsdC5zdGF0cy5udW1BdXRoRXhjZXB0aW9ucysrOwogICAgICAgICAgICAgTG9nLmUoVEFHLCAiQXV0aGVudGljYXRpb25FeGNlcHRpb24iLCBlKTsKICAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL3N5bmNhZGFwdGVyL1N5bmNTZXJ2aWNlLmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQppbmRleCAyNTZmOTFkLi41N2I3NzQ3IDEwMDY0NAotLS0gYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvc3luY2FkYXB0ZXIvU3luY1NlcnZpY2UuamF2YQpAQCAtMTMsNyArMTMsNiBAQAogICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKICAqIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLnN5bmNhZGFwdGVyOwogCiBpbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKQEAgLTI2LDEyICsyNSwxMSBAQAogICogSUJpbmRlci4KICAqLwogcHVibGljIGNsYXNzIFN5bmNTZXJ2aWNlIGV4dGVuZHMgU2VydmljZSB7CisKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3Qgc1N5bmNBZGFwdGVyTG9jayA9IG5ldyBPYmplY3QoKTsKKwogICAgIHByaXZhdGUgc3RhdGljIFN5bmNBZGFwdGVyIHNTeW5jQWRhcHRlciA9IG51bGw7CiAKLSAgICAvKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZSgpIHsKICAgICAgICAgc3luY2hyb25pemVkIChzU3luY0FkYXB0ZXJMb2NrKSB7CkBAIC00MSw5ICszOSw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewogICAgICAgICByZXR1cm4gc1N5bmNBZGFwdGVyLmdldFN5bmNBZGFwdGVyQmluZGVyKCk7CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQWxsVGVzdHMuamF2YSBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9BbGxUZXN0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNGYwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvQWxsVGVzdHMuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuYXBpczsKKworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7CisKK2ltcG9ydCBhbmRyb2lkLnRlc3Quc3VpdGVidWlsZGVyLlRlc3RTdWl0ZUJ1aWxkZXI7CisKKy8qKgorICogQSB0ZXN0IHN1aXRlIGNvbnRhaW5pbmcgYWxsIHRlc3RzIGZvciBTYW1wbGVTeW5jQWRhcHRlci4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RTdWl0ZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlQnVpbGRlcihBbGxUZXN0cy5jbGFzcykuaW5jbHVkZUFsbFBhY2thZ2VzVW5kZXJIZXJlKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0LmphdmEgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvYXV0aGVudGljYXRvci9BdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkNmZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvU2FtcGxlU3luY0FkYXB0ZXIvdGVzdHMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQvc2FtcGxlc3luYy9hdXRoZW50aWNhdG9yL0F1dGhlbnRpY2F0b3JBY3Rpdml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QKKyAqIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisgKiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyAqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZQorICogTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIKKyAqIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5leGFtcGxlLmFuZHJvaWQuc2FtcGxlc3luYy5hdXRoZW50aWNhdG9yOworCitpbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHk7CitpbXBvcnQgYW5kcm9pZC5hcHAuSW5zdHJ1bWVudGF0aW9uOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC50ZXN0LkFjdGl2aXR5SW5zdHJ1bWVudGF0aW9uVGVzdENhc2UyOworaW1wb3J0IGFuZHJvaWQudGVzdC5zdWl0ZWJ1aWxkZXIuYW5ub3RhdGlvbi5TbWFsbFRlc3Q7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CisKKy8qKgorICogVGhpcyBpcyBhIHNlcmllcyBvZiB1bml0IHRlc3RzIGZvciB0aGUge0BsaW5rIEF1dGhlbnRpY2F0b3JBY3Rpdml0eX0gY2xhc3MuCisgKi8KK0BTbWFsbFRlc3QKK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0cyBleHRlbmRzCisgICAgQWN0aXZpdHlJbnN0cnVtZW50YXRpb25UZXN0Q2FzZTI8QXV0aGVudGljYXRvckFjdGl2aXR5PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZJVFlfV0FJVCA9IDEwMDAwOworCisgICAgcHJpdmF0ZSBJbnN0cnVtZW50YXRpb24gbUluc3RydW1lbnRhdGlvbjsKKworICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKKworICAgIHB1YmxpYyBBdXRoZW50aWNhdG9yQWN0aXZpdHlUZXN0cygpIHsKKworICAgICAgICBzdXBlcihBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbW1vbiBzZXR1cCBjb2RlIGZvciBhbGwgdGVzdHMuIFNldHMgdXAgYSBkZWZhdWx0IGxhdW5jaCBpbnRlbnQsIHdoaWNoCisgICAgICogc29tZSB0ZXN0cyB3aWxsIHVzZSAob3RoZXJzIHdpbGwgb3ZlcnJpZGUpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgbUluc3RydW1lbnRhdGlvbiA9IHRoaXMuZ2V0SW5zdHJ1bWVudGF0aW9uKCk7CisgICAgICAgIG1Db250ZXh0ID0gbUluc3RydW1lbnRhdGlvbi5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpcm0gdGhhdCBMb2dpbiBpcyBwcmVzZW50ZWQuCisgICAgICovCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dpbk9mZmVyZWQoKSB7CisKKyAgICAgICAgSW5zdHJ1bWVudGF0aW9uLkFjdGl2aXR5TW9uaXRvciBtb25pdG9yID0KKyAgICAgICAgICAgIG1JbnN0cnVtZW50YXRpb24uYWRkTW9uaXRvcihBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsLCBmYWxzZSk7CisgICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KG1Db250ZXh0LCBBdXRoZW50aWNhdG9yQWN0aXZpdHkuY2xhc3MpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBtSW5zdHJ1bWVudGF0aW9uLnN0YXJ0QWN0aXZpdHlTeW5jKGludGVudCk7CisgICAgICAgIEFjdGl2aXR5IGFjdGl2aXR5ID0gbUluc3RydW1lbnRhdGlvbi53YWl0Rm9yTW9uaXRvcldpdGhUaW1lb3V0KG1vbml0b3IsIEFDVElWSVRZX1dBSVQpOworICAgICAgICBWaWV3IGxvZ2luYnV0dG9uID0gYWN0aXZpdHkuZmluZFZpZXdCeUlkKFIuaWQub2tfYnV0dG9uKTsKKyAgICAgICAgaW50IGV4cGVjdGVkID0gVmlldy5WSVNJQkxFOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGxvZ2luYnV0dG9uLmdldFZpc2liaWxpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyVGVzdC5qYXZhIGIvc2FtcGxlcy9TYW1wbGVTeW5jQWRhcHRlci90ZXN0cy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC9zYW1wbGVzeW5jL2NsaWVudC9Vc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjIzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1NhbXBsZVN5bmNBZGFwdGVyL3Rlc3RzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3NhbXBsZXN5bmMvY2xpZW50L1VzZXJUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisgKiB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZgorICogdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUCisgKiBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUKKyAqIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnNhbXBsZXN5bmMuY2xpZW50OworCitpbXBvcnQgY29tLmV4YW1wbGUuYW5kcm9pZC5zYW1wbGVzeW5jLmNsaWVudC5Vc2VyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmpzb24uSlNPTk9iamVjdDsKKworcHVibGljIGNsYXNzIFVzZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgQFNtYWxsVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVc2VyIHVzZXIgPQorICAgICAgICAgICAgbmV3IFVzZXIoIm1qb3NoaSIsICJNZWdoYSIsICJKb3NoaSIsICIxLTY1MC0zMzUtNTY4MSIsICIxLTY1MC0xMTEtNTY4MSIsCisgICAgICAgICAgICAgICAgIjEtNjUwLTIyMi01NjgxIiwgInRlc3RAZ29vZ2xlLmNvbSIsIGZhbHNlLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZWdoYSIsIHVzZXIuZ2V0Rmlyc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvc2hpIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtam9zaGkiLCB1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlci5nZXRVc2VySWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMS02NTAtMzM1LTU2ODEiLCB1c2VyLmdldENlbGxQaG9uZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB1c2VyLmlzRGVsZXRlZCgpKTsKKyAgICB9CisKKyAgICBAU21hbGxUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbHVlT2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSlNPTk9iamVjdCBqc29uT2JqID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAganNvbk9iai5wdXQoInUiLCAibWpvc2hpIik7CisgICAgICAgIGpzb25PYmoucHV0KCJmIiwgIk1lZ2hhIik7CisgICAgICAgIGpzb25PYmoucHV0KCJsIiwgIkpvc2hpIik7CisgICAgICAgIGpzb25PYmoucHV0KCJpIiwgMSk7CisgICAgICAgIFVzZXIgdXNlciA9IFVzZXIudmFsdWVPZihqc29uT2JqKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNZWdoYSIsIHVzZXIuZ2V0Rmlyc3ROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvc2hpIiwgdXNlci5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtam9zaGkiLCB1c2VyLmdldFVzZXJOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdXNlci5nZXRVc2VySWQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9Ob3RlUGFkL0FuZHJvaWQubWsgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL0FuZHJvaWQubWsKc2ltaWxhcml0eSBpbmRleCA4MCUKY29weSBmcm9tIHNhbXBsZXMvTm90ZVBhZC9BbmRyb2lkLm1rCmNvcHkgdG8gc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkLm1rCmluZGV4IDc5MzkyMTIuLjI0YTMzMjcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvTm90ZVBhZC9BbmRyb2lkLm1rCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZC5tawpAQCAtNiw5ICs2LDkgQEAKICMgT25seSBjb21waWxlIHNvdXJjZSBqYXZhIGZpbGVzIGluIHRoaXMgYXBrLgogTE9DQUxfU1JDX0ZJTEVTIDo9ICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKQogCi1MT0NBTF9QQUNLQUdFX05BTUUgOj0gTm90ZVBhZAorTE9DQUxfUEFDS0FHRV9OQU1FIDo9IFhtbEFkYXB0ZXJzU2FtcGxlCiAKLUxPQ0FMX1NES19WRVJTSU9OIDo9IGN1cnJlbnQKK0xPQ0FMX1BST0dVQVJEX0VOQUJMRUQgOj0gZGlzYWJsZWQKIAogaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCiAKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvQW5kcm9pZE1hbmlmZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFjNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIHBhY2thZ2U9ImNvbS5leGFtcGxlLmFuZHJvaWQueG1sYWRhcHRlcnMiPgorICAgIAorICAgIDx1c2VzLXNkayBhbmRyb2lkOm1pblNka1ZlcnNpb249IjgiIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iOCIgLz4KKworICAgIDx1c2VzLXBlcm1pc3Npb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnBlcm1pc3Npb24uSU5URVJORVQiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0NPTlRBQ1RTIiAvPgorCisgICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvYXBwX25hbWUiPgorICAgICAgICA8YWN0aXZpdHkgYW5kcm9pZDpuYW1lPSJDb250YWN0c0xpc3RBY3Rpdml0eSIKKyAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvY29udGFjdHNfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUGhvdG9zTGlzdEFjdGl2aXR5IgorICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9waG90b3NfbGlzdF9hY3Rpdml0eSI+CisgICAgICAgICAgICA8aW50ZW50LWZpbHRlcj4KKyAgICAgICAgICAgICAgICA8YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4iIC8+CisgICAgICAgICAgICAgICAgPGNhdGVnb3J5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVIiIC8+CisgICAgICAgICAgICA8L2ludGVudC1maWx0ZXI+CisgICAgICAgIDwvYWN0aXZpdHk+CisKKyAgICAgICAgPGFjdGl2aXR5IGFuZHJvaWQ6bmFtZT0iUnNzUmVhZGVyQWN0aXZpdHkiCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxhYmVsPSJAc3RyaW5nL3Jzc19yZWFkZXJfYWN0aXZpdHkiPgorICAgICAgICAgICAgPGludGVudC1maWx0ZXI+CisgICAgICAgICAgICAgICAgPGFjdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmFjdGlvbi5NQUlOIiAvPgorICAgICAgICAgICAgICAgIDxjYXRlZ29yeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuaW50ZW50LmNhdGVnb3J5LkxBVU5DSEVSIiAvPgorICAgICAgICAgICAgPC9pbnRlbnQtZmlsdGVyPgorICAgICAgICA8L2FjdGl2aXR5PgorCisgICAgICAgIDxwcm92aWRlciBhbmRyb2lkOm5hbWU9ImFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICBhbmRyb2lkOmF1dGhvcml0aWVzPSJ4bWxkb2N1bWVudCIgLz4KKworICAgIDwvYXBwbGljYXRpb24+CisKKzwvbWFuaWZlc3Q+CisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvX2luZGV4Lmh0bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYTM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL19pbmRleC5odG1sCkBAIC0wLDAgKzEsMzEgQEAKKzxwPlRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNlIG9mIFhNTCBhZGFwdGVycy48L3A+CisKKzxwPkFuIFhNTCBBZGFwdGVyIGlzIGFuIFhNTCBmaWxlIHdoaWNoIGRlZmluZXMgdGhlIGJpbmRpbmdzIGJldHdlZW4gdGhlIGRhdGEKK3JldHJpZXZlZCBmcm9tIGEKKzxhIGhyZWY9Ii4uLy4uLy4uL3JlZmVyZW5jZS9hbmRyb2lkL2NvbnRlbnQvQ29udGVudFByb3ZpZGVyLmh0bWwiPjxjb2RlPkNvbnRlbnRQcm92aWRlcjwvY29kZT48L2E+CithbmQgdGhlIGRpZmZlcmVudCB2aWV3cyBvZiBhIGxheW91dC4gVGhleSBhcmUgcHJvdmlkZWQgYnkgdGhlCis8YSBocmVmPSIuLi8uLi8uLi9yZWZlcmVuY2UvYW5kcm9pZC93aWRnZXQvQWRhcHRlcnMuaHRtbCI+PGNvZGU+QWRhcHRlcnM8L2NvZGU+PC9hPgorY2xhc3MuPC9wPgorCitUaHJlZSBsaXN0IGFjdGl2aXRpZXMgYXJlIHByb3ZpZGVkIHdoaWNoIGlsbHVzdHJhdGUgdGhpczoKKzx1bD4KKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RzTGlzdEFjdGl2aXR5Lmh0bWwiPjxzdHJvbmc+CisgIENvbnRhY3RzTGlzdEFjdGl2aXR5PC9zdHJvbmc+PC9hPiB1c2VzIHRoZSBkZXZpY2UncyBDb250YWN0cyBwcm92aWRlciBhcyBpdHMgaW5wdXQgc291cmNlLgorICBDb250YWN0cyB3aXRoIGEgcGhvbmUgbnVtYmVyIGFyZSBkaXNwbGF5ZWQsIHRoZWlyIHBob3RvIGJlaW5nIHJldHJpZXZlZCBieSBhIGRlZGljYXRlZAorICA8YSBocmVmPSJzcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuaHRtbCI+PGNvZGU+Q29udGFjdFBob3RvQmluZGVyCisgIDwvY29kZT48L2E+LjwvbGk+CisKKyAgPGxpPjxhIGhyZWY9InNyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Bob3Rvc0xpc3RBY3Rpdml0eS5odG1sIj48c3Ryb25nPgorICBQaG90b3NMaXN0QWN0aXZpdHk8L3N0cm9uZz48L2E+IHJldHJpZXZlcyBhbiBSU1MgcGhvdG8gZmVlZCBhbmQgZGlzcGxheXMgdGhlIGltYWdlcyBhbmQgdGhlaXIKKyAgdGl0bGVzLiBUaGUgaW1hZ2VzIGFyZSBkb3dubG9hZGVkIGZyb20gdGhlIFVSTCBmb3VuZCBpbiB0aGUgZmVlZCB1c2luZyB0aGUKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvSW1hZ2VEb3dubG9hZGVyLmh0bWwiPjxjb2RlPkltYWdlRG93bmxvYWRlcjwvY29kZT4KKyAgPC9hPiBoZWxwZXIgY2xhc3MuPC9saT4KKworICA8bGk+PGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuaHRtbCI+PHN0cm9uZz4KKyAgUnNzUmVhZGVyQWN0aXZpdHk8L3N0cm9uZz48L2E+IGFsc28gZGlzcGxheXMgaXRlbXMgZXh0cmFjdGVkIGZyb20gYW4gUlNTIGZlZWQuIEFuIGFkZGl0aW9uYWwKKyAgPGEgaHJlZj0ic3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW50ZW50TGlzdGVuZXIuaHRtbCI+PGNvZGU+VXJsSW50ZW50TGlzdGVuZXIKKyAgPC9jb2RlPjwvYT4gaXMgdXNlZCB0byBvcGVuIGEgYnJvd3NlciB3aGVuIG9uZSBvZiB0aGUgbmV3cyBpdGVtIGlzIHRhcHBlZC48L2xpPgorPC91bD4KKworPGltZyBhbHQ9IlhtbFBob3Rvc0FkYXB0ZXIiIHNyYz0iLi4vaW1hZ2VzL1htbFBob3Rvc0FkYXB0ZXIucG5nIiAvPgorPGltZyBhbHQ9IlhtbFJzc1JlYWRlciIgc3JjPSIuLi9pbWFnZXMvWG1sUnNzUmVhZGVyLnBuZyIgLz4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfY29udGFjdF9waWN0dXJlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjA1NjVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvZHJhd2FibGUtaGRwaS9pY19jb250YWN0X3BpY3R1cmUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L2NvbnRhY3RfaXRlbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYjEwOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0X2l0ZW0ueG1sCkBAIC0wLDAgKzEsMzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI/YW5kcm9pZDphdHRyL2xpc3RQcmVmZXJyZWRJdGVtSGVpZ2h0Ij4KKworICAgIDxUZXh0VmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL25hbWUiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwcHgiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZUxhcmdlIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgYW5kcm9pZDpkcmF3YWJsZVBhZGRpbmc9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N0YXIiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPiAgICAKKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvY29udGFjdHNfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZmU0YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9jb250YWN0c19saXN0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworIAorPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDphZGFwdGVyPSJAeG1sL2NvbnRhY3RzIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IiAKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvZW1wdHkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25vX2NvbnRhY3RzIgorICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+CisKKzwvbWVyZ2U+ICAgIApkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3RvX2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3RvX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGIxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcGhvdG9faXRlbS54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCisgICAgYW5kcm9pZDptaW5IZWlnaHQ9Ij9hbmRyb2lkOmF0dHIvbGlzdFByZWZlcnJlZEl0ZW1IZWlnaHQiPgorCisgICAgPEltYWdlVmlldworICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Bob3RvIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjRkaXAiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBweCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxLjAiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSI/YW5kcm9pZDphdHRyL3RleHRBcHBlYXJhbmNlU21hbGwiCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI2ZGlwIgorICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNmRpcCIgLz4KKworPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcGhvdG9zX2xpc3QueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3Rvc19saXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzU2ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Bob3Rvc19saXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1lcmdlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+CisKKyAgICA8TGlzdFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvbGlzdCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiIC8+CisKKyAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvZW1wdHkiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKKyAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL25vX3Bob3RvcyIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkX2l0ZW0ueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkX2l0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzVhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy9sYXlvdXQvcnNzX2ZlZWRfaXRlbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6aWQ9IkAraWQvaXRlbV9sYXlvdXQiCisgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKKyAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKKyAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCI+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEuMCIKKyAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCisgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9Ij9hbmRyb2lkOmF0dHIvdGV4dEFwcGVhcmFuY2VNZWRpdW0iCisgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0ibGVmdCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIKKyAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjZkaXAiIC8+CisKKyAgICA8VGV4dFZpZXcKKyAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9kYXRlIgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgorICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgorICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iP2FuZHJvaWQ6YXR0ci9saXN0UHJlZmVycmVkSXRlbUhlaWdodCI+CisKKyAgICAgICA8SW1hZ2VWaWV3CisgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvaW1hZ2UiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgorICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKKyAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNmRpcCIgLz4KKworICAgICAgIDxUZXh0VmlldworICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Rlc2NyaXB0aW9uIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCisgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMS4wIgorICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKKyAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iP2FuZHJvaWQ6YXR0ci90ZXh0QXBwZWFyYW5jZVNtYWxsIgorICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImxlZnQiCisgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjZkaXAiCisgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2ZGlwIiAvPgorCisgICAgPC9MaW5lYXJMYXlvdXQ+CisKKzwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvbGF5b3V0L3Jzc19mZWVkc19saXN0LnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZHNfbGlzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc2MWRjZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL2xheW91dC9yc3NfZmVlZHNfbGlzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxtZXJnZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgorCisgICAgPExpc3RWaWV3CisgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2xpc3QiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCisgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IiAvPgorCisgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgorICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgorICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKKyAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCisgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9ub19yc3NfZmVlZCIKKyAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgorCis8L21lcmdlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTE1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgIAorICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSQorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8cmVzb3VyY2VzIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KKyAgICA8c3RyaW5nIG5hbWU9ImFwcF9uYW1lIj5YbWwgQWRhcHRlcnM8L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9ImNvbnRhY3RzX2xpc3RfYWN0aXZpdHkiPlhtbCBDb250YWN0cyBBZGFwdGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJwaG90b3NfbGlzdF9hY3Rpdml0eSI+WG1sIFBob3RvcyBBZGFwdGVyPC9zdHJpbmc+CisgICAgPHN0cmluZyBuYW1lPSJyc3NfcmVhZGVyX2FjdGl2aXR5Ij5YbWwgUlNTIFJlYWRlcjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fY29udGFjdHMiPk5vIGNvbnRhY3RzIGF2YWlsYWJsZTwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fcGhvdG9zIj5Mb2FkaW5nIHBob3Rvcy4uLjwvc3RyaW5nPgorICAgIDxzdHJpbmcgbmFtZT0ibm9fcnNzX2ZlZWQiPkxvYWRpbmcgUlNTIGZlZWQuLi48L3N0cmluZz4KKworPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvY29udGFjdHMueG1sIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL2NvbnRhY3RzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmNmYmNhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9yZXMveG1sL2NvbnRhY3RzLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgYW5kcm9pZDp1cmk9ImNvbnRlbnQ6Ly9jb20uYW5kcm9pZC5jb250YWN0cy9jb250YWN0cyIKKyAgYW5kcm9pZDpzZWxlY3Rpb249Imhhc19waG9uZV9udW1iZXI9MSIKKyAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvY29udGFjdF9pdGVtIj4KKworICA8YmluZCBhbmRyb2lkOmZyb209ImRpc3BsYXlfbmFtZSIgYW5kcm9pZDp0bz0iQGlkL25hbWUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209InN0YXJyZWQiIGFuZHJvaWQ6dG89IkBpZC9zdGFyIiBhbmRyb2lkOmFzPSJkcmF3YWJsZSI+CisgICAgICAgIDxtYXAgYW5kcm9pZDpmcm9tVmFsdWU9IjAiIGFuZHJvaWQ6dG9WYWx1ZT0iQGFuZHJvaWQ6ZHJhd2FibGUvc3Rhcl9iaWdfb2ZmIiAvPgorICAgICAgICA8bWFwIGFuZHJvaWQ6ZnJvbVZhbHVlPSIxIiBhbmRyb2lkOnRvVmFsdWU9IkBhbmRyb2lkOmRyYXdhYmxlL3N0YXJfYmlnX29uIiAvPgorICAgIDwvYmluZD4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Il9pZCIgYW5kcm9pZDp0bz0iQGlkL25hbWUiCisgICAgICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5Db250YWN0UGhvdG9CaW5kZXIiIC8+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbCBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9waG90b3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmU2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcGhvdG9zLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICAKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAgCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGN1cnNvci1hZGFwdGVyIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBhbmRyb2lkOnNlbGVjdGlvbj0iL2ZlZWQvZW50cnkiCisgICAgYW5kcm9pZDpsYXlvdXQ9IkBsYXlvdXQvcGhvdG9faXRlbSI+CisKKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9zdW1tYXJ5IiBhbmRyb2lkOnRvPSJAaWQvdGl0bGUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9tZWRpYTpncm91cC9tZWRpYTp0aHVtYm5haWxcQHVybCIgYW5kcm9pZDp0bz0iQGlkL3Bob3RvIgorICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5VcmxJbWFnZUJpbmRlciIgLz4KKworPC9jdXJzb3ItYWRhcHRlcj4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvWG1sQWRhcHRlcnMvcmVzL3htbC9yc3NfZmVlZC54bWwgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcnNzX2ZlZWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjA5ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3Jlcy94bWwvcnNzX2ZlZWQueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIAorICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8Y3Vyc29yLWFkYXB0ZXIgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgorICAgIGFuZHJvaWQ6c2VsZWN0aW9uPSIvcnNzL2NoYW5uZWwvaXRlbSIKKyAgICBhbmRyb2lkOmxheW91dD0iQGxheW91dC9yc3NfZmVlZF9pdGVtIj4KKworICAgIDxiaW5kIGFuZHJvaWQ6ZnJvbT0iL3RpdGxlIiBhbmRyb2lkOnRvPSJAaWQvdGl0bGUiIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9tZWRpYTpjb250ZW50QHVybCIgYW5kcm9pZDp0bz0iQGlkL2ltYWdlIgorICAgICAgYW5kcm9pZDphcz0iY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVycy5VcmxJbWFnZUJpbmRlciIvPgorICAgIDxiaW5kIGFuZHJvaWQ6ZnJvbT0iL21lZGlhOmRlc2NyaXB0aW9uIiBhbmRyb2lkOnRvPSJAaWQvZGVzY3JpcHRpb24iIGFuZHJvaWQ6YXM9InN0cmluZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9ndWlkIiBhbmRyb2lkOnRvPSJAaWQvaXRlbV9sYXlvdXQiIGFuZHJvaWQ6YXM9InRhZyIgLz4KKyAgICA8YmluZCBhbmRyb2lkOmZyb209Ii9wdWJEYXRlIiBhbmRyb2lkOnRvPSJAaWQvZGF0ZSIgYW5kcm9pZDphcz0ic3RyaW5nIj4KKyAgICAgICA8dHJhbnNmb3JtIGFuZHJvaWQ6d2l0aEV4cHJlc3Npb249IlB1Ymxpc2hlZCBvbiB7L3B1YkRhdGV9LiIgLz4KKyAgICA8L2JpbmQ+CisKKzwvY3Vyc29yLWFkYXB0ZXI+CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RQaG90b0JpbmRlci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQ1NTZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0UGhvdG9CaW5kZXIuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRVcmlzOworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOworaW1wb3J0IGFuZHJvaWQuZGF0YWJhc2UuQ3Vyc29yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuQ29udGFjdHNDb250cmFjdDsKK2ltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogVGhpcyBjdXN0b20gY3Vyc29yIGJpbmRlciBpcyB1c2VkIGJ5IHRoZSBhZGFwdGVyIGRlZmluZWQgaW4gcmVzL3htbCB0bworICogYmluZCBjb250YWN0cyBwaG90b3MgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaXN0IGl0ZW0uIFRoaXMgYmluZGVyIHNpbXBseQorICogcXVlcmllcyBhIGNvbnRhY3QncyBwaG90byBiYXNlZCBvbiB0aGUgY29udGFjdCdzIGlkIGFuZCBzZXRzIHRoZQorICogcGhvdG8gYXMgYSBjb21wb3VuZCBkcmF3YWJsZSBvbiB0aGUgVGV4dFZpZXcgdXNlZCB0byBkaXNwbGF5IHRoZSBjb250YWN0J3MKKyAqIG5hbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWN0UGhvdG9CaW5kZXIgZXh0ZW5kcyBBZGFwdGVycy5DdXJzb3JCaW5kZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQSE9UT19TSVpFX0RJUCA9IDU0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPExvbmcsIERyYXdhYmxlPiBtQ2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZXMgbVJlc291cmNlczsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGhvdG9TaXplOworCisgICAgcHVibGljIENvbnRhY3RQaG90b0JpbmRlcihDb250ZXh0IGNvbnRleHQsIEFkYXB0ZXJzLkN1cnNvclRyYW5zZm9ybWF0aW9uIHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIHN1cGVyKGNvbnRleHQsIHRyYW5zZm9ybWF0aW9uKTsKKworICAgICAgICBtUmVzb3VyY2VzID0gbUNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7CisgICAgICAgIC8vIERlZmF1bHQgcGljdHVyZSB1c2VkIHdoZW4gYSBjb250YWN0IGRvZXMgbm90IHByb3ZpZGUgb25lCisgICAgICAgIG1EZWZhdWx0ID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2NvbnRhY3RfcGljdHVyZSk7CisgICAgICAgIC8vIENhY2hlIHVzZWQgdG8gYXZvaWQgcmUtcXVlcnlpbmcgY29udGFjdHMgcGhvdG9zIGV2ZXJ5IHRpbWUKKyAgICAgICAgbUNhY2hlID0gbmV3IEhhc2hNYXA8TG9uZywgRHJhd2FibGU+KCk7CisgICAgICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHBob3RvIGJhc2VkIG9uIHRoZSBkaXNwbGF5J3MgZGVuc2l0eQorICAgICAgICBtUGhvdG9TaXplID0gKGludCkgKFBIT1RPX1NJWkVfRElQICogbVJlc291cmNlcy5nZXREaXNwbGF5TWV0cmljcygpLmRlbnNpdHkgKyAwLjVmKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBjdXJzb3IuZ2V0TG9uZyhjb2x1bW5JbmRleCk7CisgICAgICAgIAorICAgICAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBjYWNoZWQgdGhlIGNvbnRhY3QncyBwaG90bworICAgICAgICBEcmF3YWJsZSBkID0gbUNhY2hlLmdldChpZCk7CisgICAgICAgIAorICAgICAgICBpZiAoZCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgcGhvdG8gd2Fzbid0IGluIHRoZSBjYWNoZSwgYXNrIHRoZSBjb250YWN0cyBwcm92aWRlciBmb3IKKyAgICAgICAgICAgIC8vIGFuIGlucHV0IHN0cmVhbSB3ZSBjYW4gdXNlIHRvIGxvYWQgdGhlIHBob3RvCisgICAgICAgICAgICBVcmkgdXJpID0gQ29udGVudFVyaXMud2l0aEFwcGVuZGVkSWQoQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5DT05URU5UX1VSSSwgaWQpOworICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gQ29udGFjdHNDb250cmFjdC5Db250YWN0cy5vcGVuQ29udGFjdFBob3RvSW5wdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLCB1cmkpOworICAgIAorICAgICAgICAgICAgLy8gQ3JlYXRlcyB0aGUgZHJhd2FibGUgZm9yIHRoZSBjb250YWN0J3MgcGhvdG8gb3IgdXNlIG91ciBmYWxsYmFjayBkcmF3YWJsZQorICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gZGVjb2RpbmcgdGhlIGJpdG1hcCBjb3VsZCBiZSBkb25lIGluIGEgd29ya2VyIHRocmVhZCB0b28uCisgICAgICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgZCA9IG5ldyBCaXRtYXBEcmF3YWJsZShtUmVzb3VyY2VzLCBiaXRtYXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkID0gbURlZmF1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGQuc2V0Qm91bmRzKDAsIDAsIG1QaG90b1NpemUsIG1QaG90b1NpemUpOworICAgICAgICAgICAgKChUZXh0Vmlldykgdmlldykuc2V0Q29tcG91bmREcmF3YWJsZXMoZCwgbnVsbCwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBwaG90byBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250YWN0CisgICAgICAgICAgICBtQ2FjaGUucHV0KGlkLCBkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgoVGV4dFZpZXcpIHZpZXcpLnNldENvbXBvdW5kRHJhd2FibGVzKGQsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0c0xpc3RBY3Rpdml0eS5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9Db250YWN0c0xpc3RBY3Rpdml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWFiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0NvbnRhY3RzTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKKworLyoqCisgKiBUaGlzIGFjdGl2aXR5IGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgY29tcGxleCBVSSB1c2luZyBhIExpc3RWaWV3CisgKiBhbmQgYW4gYWRhcHRlciBkZWZpbmVkIGluIFhNTC4KKyAqIAorICogVGhlIGZvbGxvd2luZyBhY3Rpdml0eSBzaG93cyBhIGxpc3Qgb2YgY29udGFjdHMsIHRoZWlyIHN0YXJyZWQgc3RhdHVzCisgKiBhbmQgdGhlaXIgcGhvdG9zLCB1c2luZyB0aGUgYWRhcHRlciBkZWZpbmVkIGluIHJlcy94bWwuCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWN0c0xpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgeworICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5jb250YWN0c19saXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL0ltYWdlRG93bmxvYWRlci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRmOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9JbWFnZURvd25sb2FkZXIuamF2YQpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFbnRpdHk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lm1ldGhvZHMuSHR0cEdldDsKKworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOworaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQ29sb3JEcmF3YWJsZTsKK2ltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOworaW1wb3J0IGFuZHJvaWQubmV0Lmh0dHAuQW5kcm9pZEh0dHBDbGllbnQ7CitpbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7CitpbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGhlbHBlciBjbGFzcyBkb3dubG9hZCBpbWFnZXMgZnJvbSB0aGUgSW50ZXJuZXQgYW5kIGJpbmRzIHRob3NlIHdpdGggdGhlIHByb3ZpZGVkIEltYWdlVmlldy4KKyAqCisgKiA8cD5JdCByZXF1aXJlcyB0aGUgSU5URVJORVQgcGVybWlzc2lvbiwgd2hpY2ggc2hvdWxkIGJlIGFkZGVkIHRvIHlvdXIgYXBwbGljYXRpb24ncyBtYW5pZmVzdAorICogZmlsZS48L3A+CisgKgorICogQSBsb2NhbCBjYWNoZSBvZiBkb3dubG9hZGVkIGltYWdlcyBpcyBtYWludGFpbmVkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KKyAqLworcHVibGljIGNsYXNzIEltYWdlRG93bmxvYWRlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR19UQUcgPSAiSW1hZ2VEb3dubG9hZGVyIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBIQVJEX0NBQ0hFX0NBUEFDSVRZID0gNDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFTEFZX0JFRk9SRV9QVVJHRSA9IDMwICogMTAwMDsgLy8gaW4gbWlsbGlzZWNvbmRzCisKKyAgICAvLyBIYXJkIGNhY2hlLCB3aXRoIGEgZml4ZWQgbWF4aW11bSBjYXBhY2l0eSBhbmQgYSBsaWZlIGR1cmF0aW9uCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgQml0bWFwPiBzSGFyZEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBCaXRtYXA+KEhBUkRfQ0FDSEVfQ0FQQUNJVFkgLyAyLCAwLjc1ZiwgdHJ1ZSkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTGlua2VkSGFzaE1hcC5FbnRyeTxTdHJpbmcsIEJpdG1hcD4gZWxkZXN0KSB7CisgICAgICAgICAgICBpZiAoc2l6ZSgpID4gSEFSRF9DQUNIRV9DQVBBQ0lUWSkgeworICAgICAgICAgICAgICAgIC8vIEVudHJpZXMgcHVzaC1vdXQgb2YgaGFyZCByZWZlcmVuY2UgY2FjaGUgYXJlIHRyYW5zZmVycmVkIHRvIHNvZnQgcmVmZXJlbmNlIGNhY2hlCisgICAgICAgICAgICAgICAgc1NvZnRCaXRtYXBDYWNoZS5wdXQoZWxkZXN0LmdldEtleSgpLCBuZXcgU29mdFJlZmVyZW5jZTxCaXRtYXA+KGVsZGVzdC5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gU29mdCBjYWNoZSBmb3IgYml0bWFwIGtpY2tlZCBvdXQgb2YgaGFyZCBjYWNoZQorICAgIHByaXZhdGUgZmluYWwgc3RhdGljIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PiBzU29mdEJpdG1hcENhY2hlID0KKyAgICAgICAgbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU29mdFJlZmVyZW5jZTxCaXRtYXA+PihIQVJEX0NBQ0hFX0NBUEFDSVRZIC8gMik7CisKKyAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgcHVyZ2VIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKKworICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgcHVyZ2VyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjbGVhckNhY2hlKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogRG93bmxvYWQgdGhlIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSBJbnRlcm5ldCBhbmQgYmluZHMgaXQgdG8gdGhlIHByb3ZpZGVkIEltYWdlVmlldy4gVGhlCisgICAgICogYmluZGluZyBpcyBpbW1lZGlhdGUgaWYgdGhlIGltYWdlIGlzIGZvdW5kIGluIHRoZSBjYWNoZSBhbmQgd2lsbCBiZSBkb25lIGFzeW5jaHJvbm91c2x5CisgICAgICogb3RoZXJ3aXNlLiBBIG51bGwgYml0bWFwIHdpbGwgYmUgYXNzb2NpYXRlZCB0byB0aGUgSW1hZ2VWaWV3IGlmIGFuIGVycm9yIG9jY3Vycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBkb3dubG9hZCh1cmwsIGltYWdlVmlldywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FtZSBhcyB7QGxpbmsgI2Rvd25sb2FkKFN0cmluZywgSW1hZ2VWaWV3KX0sIHdpdGggdGhlIHBvc3NpYmlsaXR5IHRvIHByb3ZpZGUgYW4gYWRkaXRpb25hbAorICAgICAqIGNvb2tpZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZSBpbWFnZSB3aWxsIGJlIHJldHJpZXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmwgVGhlIFVSTCBvZiB0aGUgaW1hZ2UgdG8gZG93bmxvYWQuCisgICAgICogQHBhcmFtIGltYWdlVmlldyBUaGUgSW1hZ2VWaWV3IHRvIGJpbmQgdGhlIGRvd25sb2FkZWQgaW1hZ2UgdG8uCisgICAgICogQHBhcmFtIGNvb2tpZSBBIGNvb2tpZSBTdHJpbmcgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhlIGh0dHAgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIHJlc2V0UHVyZ2VUaW1lcigpOworICAgICAgICBCaXRtYXAgYml0bWFwID0gZ2V0Qml0bWFwRnJvbUNhY2hlKHVybCk7CisKKyAgICAgICAgaWYgKGJpdG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgaW1hZ2VWaWV3LCBjb29raWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpOworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhbWUgYXMgZG93bmxvYWQgYnV0IHRoZSBpbWFnZSBpcyBhbHdheXMgZG93bmxvYWRlZCBhbmQgdGhlIGNhY2hlIGlzIG5vdCB1c2VkLgorICAgICAqIEtlcHQgcHJpdmF0ZSBhdCB0aGUgbW9tZW50IGFzIGl0cyBpbnRlcmVzdCBpcyBub3QgY2xlYXIuCisgICAgICAgcHJpdmF0ZSB2b2lkIGZvcmNlRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IHZpZXcpIHsKKyAgICAgICAgICBmb3JjZURvd25sb2FkKHVybCwgdmlldywgbnVsbCk7CisgICAgICAgfQorICAgICAqLworCisgICAgLyoqCisgICAgICogU2FtZSBhcyBkb3dubG9hZCBidXQgdGhlIGltYWdlIGlzIGFsd2F5cyBkb3dubG9hZGVkIGFuZCB0aGUgY2FjaGUgaXMgbm90IHVzZWQuCisgICAgICogS2VwdCBwcml2YXRlIGF0IHRoZSBtb21lbnQgYXMgaXRzIGludGVyZXN0IGlzIG5vdCBjbGVhci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZm9yY2VEb3dubG9hZChTdHJpbmcgdXJsLCBJbWFnZVZpZXcgaW1hZ2VWaWV3LCBTdHJpbmcgY29va2llKSB7CisgICAgICAgIC8vIFN0YXRlIHNhbml0eTogdXJsIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbCBpbiBEb3dubG9hZGVkRHJhd2FibGUgYW5kIGNhY2hlIGtleXMuCisgICAgICAgIGlmICh1cmwgPT0gbnVsbCkgeworICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlRHJhd2FibGUobnVsbCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FuY2VsUG90ZW50aWFsRG93bmxvYWQodXJsLCBpbWFnZVZpZXcpKSB7CisgICAgICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayB0YXNrID0gbmV3IEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gbmV3IERvd25sb2FkZWREcmF3YWJsZSh0YXNrKTsKKyAgICAgICAgICAgIGltYWdlVmlldy5zZXRJbWFnZURyYXdhYmxlKGRvd25sb2FkZWREcmF3YWJsZSk7CisgICAgICAgICAgICB0YXNrLmV4ZWN1dGUodXJsLCBjb29raWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoZSBpbWFnZSBjYWNoZSB1c2VkIGludGVybmFsbHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4gTm90ZSB0aGF0IGZvciBtZW1vcnkKKyAgICAgKiBlZmZpY2llbmN5IHJlYXNvbnMsIHRoZSBjYWNoZSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgY2xlYXJlZCBhZnRlciBhIGNlcnRhaW4gaW5hY3Rpdml0eSBkZWxheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhckNhY2hlKCkgeworICAgICAgICBzSGFyZEJpdG1hcENhY2hlLmNsZWFyKCk7CisgICAgICAgIHNTb2Z0Qml0bWFwQ2FjaGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVzZXRQdXJnZVRpbWVyKCkgeworICAgICAgICBwdXJnZUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHB1cmdlcik7CisgICAgICAgIHB1cmdlSGFuZGxlci5wb3N0RGVsYXllZChwdXJnZXIsIERFTEFZX0JFRk9SRV9QVVJHRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGRvd25sb2FkIGhhcyBiZWVuIGNhbmNlbGVkIG9yIGlmIHRoZXJlIHdhcyBubyBkb3dubG9hZCBpbgorICAgICAqIHByb2dyZXNzIG9uIHRoaXMgaW1hZ2Ugdmlldy4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBkb3dubG9hZCBpbiBwcm9ncmVzcyBkZWFscyB3aXRoIHRoZSBzYW1lIHVybC4gVGhlIGRvd25sb2FkIGlzIG5vdAorICAgICAqIHN0b3BwZWQgaW4gdGhhdCBjYXNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuY2VsUG90ZW50aWFsRG93bmxvYWQoU3RyaW5nIHVybCwgSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBCaXRtYXBEb3dubG9hZGVyVGFzayBiaXRtYXBEb3dubG9hZGVyVGFzayA9IGdldEJpdG1hcERvd25sb2FkZXJUYXNrKGltYWdlVmlldyk7CisKKyAgICAgICAgaWYgKGJpdG1hcERvd25sb2FkZXJUYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBiaXRtYXBVcmwgPSBiaXRtYXBEb3dubG9hZGVyVGFzay51cmw7CisgICAgICAgICAgICBpZiAoKGJpdG1hcFVybCA9PSBudWxsKSB8fCAoIWJpdG1hcFVybC5lcXVhbHModXJsKSkpIHsKKyAgICAgICAgICAgICAgICBiaXRtYXBEb3dubG9hZGVyVGFzay5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZSBzYW1lIFVSTCBpcyBhbHJlYWR5IGJlaW5nIGRvd25sb2FkZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBpbWFnZVZpZXcgQW55IGltYWdlVmlldworICAgICAqIEByZXR1cm4gUmV0cmlldmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgZG93bmxvYWQgdGFzayAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbWFnZVZpZXcuCisgICAgICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHRhc2suCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRG93bmxvYWRlclRhc2sgZ2V0Qml0bWFwRG93bmxvYWRlclRhc2soSW1hZ2VWaWV3IGltYWdlVmlldykgeworICAgICAgICBpZiAoaW1hZ2VWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIERyYXdhYmxlIGRyYXdhYmxlID0gaW1hZ2VWaWV3LmdldERyYXdhYmxlKCk7CisgICAgICAgICAgICBpZiAoZHJhd2FibGUgaW5zdGFuY2VvZiBEb3dubG9hZGVkRHJhd2FibGUpIHsKKyAgICAgICAgICAgICAgICBEb3dubG9hZGVkRHJhd2FibGUgZG93bmxvYWRlZERyYXdhYmxlID0gKERvd25sb2FkZWREcmF3YWJsZSlkcmF3YWJsZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG93bmxvYWRlZERyYXdhYmxlLmdldEJpdG1hcERvd25sb2FkZXJUYXNrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHVybCBUaGUgVVJMIG9mIHRoZSBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0cmlldmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAqIEByZXR1cm4gVGhlIGNhY2hlZCBiaXRtYXAgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgQml0bWFwIGdldEJpdG1hcEZyb21DYWNoZShTdHJpbmcgdXJsKSB7CisgICAgICAgIC8vIEZpcnN0IHRyeSB0aGUgaGFyZCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICBmaW5hbCBCaXRtYXAgYml0bWFwID0gc0hhcmRCaXRtYXBDYWNoZS5nZXQodXJsKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBoYXJkIGNhY2hlCisgICAgICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50IHRvIGZpcnN0IHBvc2l0aW9uLCBzbyB0aGF0IGl0IGlzIHJlbW92ZWQgbGFzdAorICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucmVtb3ZlKHVybCk7CisgICAgICAgICAgICAgICAgc0hhcmRCaXRtYXBDYWNoZS5wdXQodXJsLCBiaXRtYXApOworICAgICAgICAgICAgICAgIHJldHVybiBiaXRtYXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVuIHRyeSB0aGUgc29mdCByZWZlcmVuY2UgY2FjaGUKKyAgICAgICAgU29mdFJlZmVyZW5jZTxCaXRtYXA+IGJpdG1hcFJlZmVyZW5jZSA9IHNTb2Z0Qml0bWFwQ2FjaGUuZ2V0KHVybCk7CisgICAgICAgIGlmIChiaXRtYXBSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgQml0bWFwIGJpdG1hcCA9IGJpdG1hcFJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIEJpdG1hcCBmb3VuZCBpbiBzb2Z0IGNhY2hlCisgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU29mdCByZWZlcmVuY2UgaGFzIGJlZW4gR2FyYmFnZSBDb2xsZWN0ZWQKKyAgICAgICAgICAgICAgICBzU29mdEJpdG1hcENhY2hlLnJlbW92ZSh1cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIGFjdHVhbCBBc3luY1Rhc2sgdGhhdCB3aWxsIGFzeW5jaHJvbm91c2x5IGRvd25sb2FkIHRoZSBpbWFnZS4KKyAgICAgKi8KKyAgICBjbGFzcyBCaXRtYXBEb3dubG9hZGVyVGFzayBleHRlbmRzIEFzeW5jVGFzazxTdHJpbmcsIFZvaWQsIEJpdG1hcD4geworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU9fQlVGRkVSX1NJWkUgPSA0ICogMTAyNDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdXJsOworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SW1hZ2VWaWV3PiBpbWFnZVZpZXdSZWZlcmVuY2U7CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrKEltYWdlVmlldyBpbWFnZVZpZXcpIHsKKyAgICAgICAgICAgIGltYWdlVmlld1JlZmVyZW5jZSA9IG5ldyBXZWFrUmVmZXJlbmNlPEltYWdlVmlldz4oaW1hZ2VWaWV3KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY3R1YWwgZG93bmxvYWQgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoU3RyaW5nLi4uIHBhcmFtcykgeworICAgICAgICAgICAgZmluYWwgQW5kcm9pZEh0dHBDbGllbnQgY2xpZW50ID0gQW5kcm9pZEh0dHBDbGllbnQubmV3SW5zdGFuY2UoIkFuZHJvaWQiKTsKKyAgICAgICAgICAgIHVybCA9IHBhcmFtc1swXTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBHZXQgZ2V0UmVxdWVzdCA9IG5ldyBIdHRwR2V0KHVybCk7CisgICAgICAgICAgICBTdHJpbmcgY29va2llID0gcGFyYW1zWzFdOworICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdC5zZXRIZWFkZXIoImNvb2tpZSIsIGNvb2tpZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSHR0cFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LmV4ZWN1dGUoZ2V0UmVxdWVzdCk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0U3RhdHVzQ29kZSgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlICE9IEh0dHBTdGF0dXMuU0NfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLncoIkltYWdlRG93bmxvYWRlciIsICJFcnJvciAiICsgc3RhdHVzQ29kZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBIdHRwRW50aXR5IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBlbnRpdHkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRhdGFTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGF0YVN0cmVhbSwgSU9fQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29weShpbnB1dFN0cmVhbSwgb3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IGRhdGFTdHJlYW0udG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXBGYWN0b3J5LmRlY29kZUJ5dGVBcnJheShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIDogU2hvdWxkIHVzZSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShpbnB1dFN0cmVhbSkgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vZmluYWwgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKGlucHV0U3RyZWFtKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpdG1hcDsKKworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHkuY29uc3VtZUNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkkvTyBlcnJvciB3aGlsZSByZXRyaWV2aW5nIGJpdG1hcCBmcm9tICIgKyB1cmwsIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkluY29ycmVjdCBVUkw6ICIgKyB1cmwpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0LmFib3J0KCk7CisgICAgICAgICAgICAgICAgTG9nLncoTE9HX1RBRywgIkVycm9yIHdoaWxlIHJldHJpZXZpbmcgYml0bWFwIGZyb20gIiArIHVybCwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPbmNlIHRoZSBpbWFnZSBpcyBkb3dubG9hZGVkLCBhc3NvY2lhdGVzIGl0IHRvIHRoZSBpbWFnZVZpZXcKKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBiaXRtYXApIHsKKyAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWRkIGJpdG1hcCB0byBjYWNoZQorICAgICAgICAgICAgaWYgKGJpdG1hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzSGFyZEJpdG1hcENhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIHNIYXJkQml0bWFwQ2FjaGUucHV0KHVybCwgYml0bWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbWFnZVZpZXdSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEltYWdlVmlldyBpbWFnZVZpZXcgPSBpbWFnZVZpZXdSZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICAgICAgQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2sgPSBnZXRCaXRtYXBEb3dubG9hZGVyVGFzayhpbWFnZVZpZXcpOworICAgICAgICAgICAgICAgIC8vIENoYW5nZSBiaXRtYXAgb25seSBpZiB0aGlzIHByb2Nlc3MgaXMgc3RpbGwgYXNzb2NpYXRlZCB3aXRoIGl0CisgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT0gYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VWaWV3LnNldEltYWdlQml0bWFwKGJpdG1hcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29weShJbnB1dFN0cmVhbSBpbiwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbSU9fQlVGRkVSX1NJWkVdOworICAgICAgICAgICAgaW50IHJlYWQ7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbi5yZWFkKGIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZmFrZSBEcmF3YWJsZSB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGltYWdlVmlldyB3aGlsZSB0aGUgZG93bmxvYWQgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICoKKyAgICAgKiA8cD5Db250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWN0dWFsIGRvd25sb2FkIHRhc2ssIHNvIHRoYXQgYSBkb3dubG9hZCB0YXNrIGNhbiBiZSBzdG9wcGVkCisgICAgICogaWYgYSBuZXcgYmluZGluZyBpcyByZXF1aXJlZCwgYW5kIG1ha2VzIHN1cmUgdGhhdCBvbmx5IHRoZSBsYXN0IHN0YXJ0ZWQgZG93bmxvYWQgcHJvY2VzcyBjYW4KKyAgICAgKiBiaW5kIGl0cyByZXN1bHQsIGluZGVwZW5kZW50bHkgb2YgdGhlIGRvd25sb2FkIGZpbmlzaCBvcmRlci48L3A+CisgICAgICovCisgICAgc3RhdGljIGNsYXNzIERvd25sb2FkZWREcmF3YWJsZSBleHRlbmRzIENvbG9yRHJhd2FibGUgeworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Qml0bWFwRG93bmxvYWRlclRhc2s+IGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlOworCisgICAgICAgIHB1YmxpYyBEb3dubG9hZGVkRHJhd2FibGUoQml0bWFwRG93bmxvYWRlclRhc2sgYml0bWFwRG93bmxvYWRlclRhc2spIHsKKyAgICAgICAgICAgIHN1cGVyKENvbG9yLkJMQUNLKTsKKyAgICAgICAgICAgIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlID0KKyAgICAgICAgICAgICAgICBuZXcgV2Vha1JlZmVyZW5jZTxCaXRtYXBEb3dubG9hZGVyVGFzaz4oYml0bWFwRG93bmxvYWRlclRhc2spOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpdG1hcERvd25sb2FkZXJUYXNrIGdldEJpdG1hcERvd25sb2FkZXJUYXNrKCkgeworICAgICAgICAgICAgcmV0dXJuIGJpdG1hcERvd25sb2FkZXJUYXNrUmVmZXJlbmNlLmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9QaG90b3NMaXN0QWN0aXZpdHkuamF2YSBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRhMTUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUGhvdG9zTGlzdEFjdGl2aXR5LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuYXBwLkxpc3RBY3Rpdml0eTsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7CitpbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnM7CisKKy8qKgorICogVGhpcyBhY3Rpdml0eSB1c2VzIGEgY3VzdG9tIGN1cnNvciBhZGFwdGVyIHdoaWNoIGZldGNoZXMgYSBYTUwgcGhvdG8gZmVlZCBhbmQgcGFyc2VzIHRoZSBYTUwgdG8KKyAqIGV4dHJhY3QgdGhlIGltYWdlcycgVVJMIGFuZCB0aGVpciB0aXRsZS4KKyAqLworcHVibGljIGNsYXNzIFBob3Rvc0xpc3RBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJQ0FTQV9GRUVEX1VSTCA9CisgICAgICAgICJodHRwOi8vcGljYXNhd2ViLmdvb2dsZS5jb20vZGF0YS9mZWVkL2FwaS9mZWF0dXJlZD9tYXgtcmVzdWx0cz01MCZ0aHVtYnNpemU9MTQ0YyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7CisgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7CisKKyAgICAgICAgc2V0Q29udGVudFZpZXcoUi5sYXlvdXQucGhvdG9zX2xpc3QpOworICAgICAgICBzZXRMaXN0QWRhcHRlcihBZGFwdGVycy5sb2FkQ3Vyc29yQWRhcHRlcih0aGlzLCBSLnhtbC5waG90b3MsCisgICAgICAgICAgICAgICAgImNvbnRlbnQ6Ly94bWxkb2N1bWVudC8/dXJsPSIgKyBVcmkuZW5jb2RlKFBJQ0FTQV9GRUVEX1VSTCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1Jzc1JlYWRlckFjdGl2aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZTRjMQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvUnNzUmVhZGVyQWN0aXZpdHkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5hcHAuTGlzdEFjdGl2aXR5OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5YbWxEb2N1bWVudFByb3ZpZGVyOworaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyczsKK2ltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyOworCisvKioKKyAqIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZSB0aGUgY3JlYXRpb24gb2YgYSBzaW1wbGUgUlNTIGZlZWQgcmVhZGVyIHVzaW5nIHRoZSBYTUwgYWRhcHRlciBzeW50YXguCisgKiBUaGUgZGlmZmVyZW50IGVsZW1lbnRzIG9mIHRoZSBmZWVkIGFyZSBleHRyYWN0ZWQgdXNpbmcgYW4ge0BsaW5rIFhtbERvY3VtZW50UHJvdmlkZXJ9IGFuZCBhcmUKKyAqIGJpbmRlZCB0byB0aGUgZGlmZmVyZW50IHZpZXdzLiBBbiB7QGxpbmsgT25JdGVtQ2xpY2tMaXN0ZW5lcn0gaXMgYWxzbyBhZGRlZCwgd2hpY2ggd2lsbCBvcGVuIGEKKyAqIGJyb3dzZXIgb24gdGhlIGFzc29jaWF0ZWQgbmV3cyBpdGVtIHBhZ2UuCisgKi8KK3B1YmxpYyBjbGFzcyBSc3NSZWFkZXJBY3Rpdml0eSBleHRlbmRzIExpc3RBY3Rpdml0eSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFRURfVVJJID0gImh0dHA6Ly9mZWVkcy5ueXRpbWVzLmNvbS9ueXQvcnNzL0hvbWVQYWdlIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKKyAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKKworICAgICAgICBzZXRDb250ZW50VmlldyhSLmxheW91dC5yc3NfZmVlZHNfbGlzdCk7CisgICAgICAgIHNldExpc3RBZGFwdGVyKEFkYXB0ZXJzLmxvYWRDdXJzb3JBZGFwdGVyKHRoaXMsIFIueG1sLnJzc19mZWVkLAorICAgICAgICAgICAgICAgICJjb250ZW50Oi8veG1sZG9jdW1lbnQvP3VybD0iICsgVXJpLmVuY29kZShGRUVEX1VSSSkpKTsKKyAgICAgICAgZ2V0TGlzdFZpZXcoKS5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG5ldyBVcmxJbnRlbnRMaXN0ZW5lcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEltYWdlQmluZGVyLmphdmEgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEltYWdlQmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNiMWU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvWG1sQWRhcHRlcnMvc3JjL2NvbS9leGFtcGxlL2FuZHJvaWQveG1sYWRhcHRlcnMvVXJsSW1hZ2VCaW5kZXIuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uZXhhbXBsZS5hbmRyb2lkLnhtbGFkYXB0ZXJzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlcnM7CitpbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OworCisvKioKKyAqIFRoaXMgQ3Vyc29yQmluZGVyIGJpbmRzIHRoZSBwcm92aWRlZCBpbWFnZSBVUkwgdG8gYW4gSW1hZ2VWaWV3IGJ5IGRvd25sb2FkaW5nIHRoZSBpbWFnZSBmcm9tIHRoZQorICogSW50ZXJuZXQuCisgKi8KK3B1YmxpYyBjbGFzcyBVcmxJbWFnZUJpbmRlciBleHRlbmRzIEFkYXB0ZXJzLkN1cnNvckJpbmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEltYWdlRG93bmxvYWRlciBpbWFnZURvd25sb2FkZXI7CisKKyAgICBwdWJsaWMgVXJsSW1hZ2VCaW5kZXIoQ29udGV4dCBjb250ZXh0LCBBZGFwdGVycy5DdXJzb3JUcmFuc2Zvcm1hdGlvbiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICBzdXBlcihjb250ZXh0LCB0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIGltYWdlRG93bmxvYWRlciA9IG5ldyBJbWFnZURvd25sb2FkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKFZpZXcgdmlldywgQ3Vyc29yIGN1cnNvciwgaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgIGlmICh2aWV3IGluc3RhbmNlb2YgSW1hZ2VWaWV3KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJsID0gbVRyYW5zZm9ybWF0aW9uLnRyYW5zZm9ybShjdXJzb3IsIGNvbHVtbkluZGV4KTsKKyAgICAgICAgICAgIGltYWdlRG93bmxvYWRlci5kb3dubG9hZCh1cmwsIChJbWFnZVZpZXcpIHZpZXcpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9VcmxJbnRlbnRMaXN0ZW5lci5qYXZhIGIvc2FtcGxlcy9YbWxBZGFwdGVycy9zcmMvY29tL2V4YW1wbGUvYW5kcm9pZC94bWxhZGFwdGVycy9VcmxJbnRlbnRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODE0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL1htbEFkYXB0ZXJzL3NyYy9jb20vZXhhbXBsZS9hbmRyb2lkL3htbGFkYXB0ZXJzL1VybEludGVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmV4YW1wbGUuYW5kcm9pZC54bWxhZGFwdGVyczsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7CitpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OworaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXI7CisKKy8qKgorICogQSBsaXN0ZW5lciB3aGljaCBleHBlY3RzIGEgVVJMIGFzIGEgdGFnIG9mIHRoZSB2aWV3IGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSXQgdGhlbiBvcGVucyB0aGUgVVJMCisgKiBpbiB0aGUgYnJvd3NlciBhcHBsaWNhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIFVybEludGVudExpc3RlbmVyIGltcGxlbWVudHMgT25JdGVtQ2xpY2tMaXN0ZW5lciB7CisKKyAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB2aWV3LmdldFRhZygpLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KEludGVudC5BQ1RJT05fVklFVywgVXJpLnBhcnNlKHVybCkpOworICAgICAgICBpbnRlbnQuc2V0RmxhZ3MoSW50ZW50LkZMQUdfQUNUSVZJVFlfTkVXX1RBU0spOworICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBwYXJlbnQuZ2V0Q29udGV4dCgpOworICAgICAgICBjb250ZXh0LnN0YXJ0QWN0aXZpdHkoaW50ZW50KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NpbXVsYXRvci9hcHAvUHJvcGVydHlTZXJ2ZXIuY3BwIGIvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKaW5kZXggNGEwYTJhYy4uNzczNWIxNyAxMDA2NDQKLS0tIGEvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKKysrIGIvc2ltdWxhdG9yL2FwcC9Qcm9wZXJ0eVNlcnZlci5jcHAKQEAgLTkwLDYgKzkwLDkgQEAKICAgICAgICAgeyAicm8uYnVpbGQuZGF0ZSIsICJXZWQgTm92IDI4IDA3OjQ0OjE0IFBTVCAyMDA3IiB9LAogICAgICAgICB7ICJyby5idWlsZC5kYXRlLnV0YyIsICIxMTk2MjY0NjU0IiB9LAogICAgICAgICB7ICJyby5idWlsZC50eXBlIiwgImVuZyIgfSwKKyAgICAgICAgeyAicm8uYnVpbGQudmVyc2lvbi5zZGsiLCAiOCIgfSwKKyAgICAgICAgeyAicm8uYnVpbGQudmVyc2lvbi5jb2RlbmFtZSIsICJIb25leWNvbWIiIH0sCisgICAgICAgIHsgInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSIsICJIb25leWNvbWIiIH0sCiAgICAgICAgIHsgInJvLnByb2R1Y3QuZGV2aWNlIiwgInNpbXVsYXRvciIgLyoic29vbmVyIiovIH0sCiAgICAgICAgIHsgInJvLnByb2R1Y3QuYnJhbmQiLCAiZ2VuZXJpYyIgfSwKICAgICAgICAgeyAicm8uYnVpbGQudXNlciIsICJmYWRkZW4iIH0sCkBAIC05OSwxMiArMTAyLDE2IEBACiAgICAgICAgIHsgInJvLnJhZGlvLnVzZS1wcHAiLCAibm8iIH0sCiAgICAgICAgIHsgInJvLkZPUkVHUk9VTkRfQVBQX0FESiIsICIwIiB9LAogICAgICAgICB7ICJyby5WSVNJQkxFX0FQUF9BREoiLCAiMSIgfSwKKyAgICAgICAgeyAicm8uUEVSQ0VQVElCTEVfQVBQX0FESiIsICIyIiB9LAorICAgICAgICB7ICJyby5IRUFWWV9XRUlHSFRfQVBQX0FESiIsICIzIiB9LAogICAgICAgICB7ICJyby5TRUNPTkRBUllfU0VSVkVSX0FESiIsICIyIiB9LAogICAgICAgICB7ICJyby5ISURERU5fQVBQX01JTl9BREoiLCAiNyIgfSwKICAgICAgICAgeyAicm8uQ09OVEVOVF9QUk9WSURFUl9BREoiLCAiMTQiIH0sCiAgICAgICAgIHsgInJvLkVNUFRZX0FQUF9BREoiLCAiMTUiIH0sCiAgICAgICAgIHsgInJvLkZPUkVHUk9VTkRfQVBQX01FTSIsICIxNTM2IiB9LAogICAgICAgICB7ICJyby5WSVNJQkxFX0FQUF9NRU0iLCAiMjA0OCIgfSwKKyAgICAgICAgeyAicm8uUEVSQ0VQVElCTEVfQVBQX01FTSIsICI0MDk2IiB9LAorICAgICAgICB7ICJyby5IRUFWWV9XRUlHSFRfQVBQX01FTSIsICI0MDk2IiB9LAogICAgICAgICB7ICJyby5TRUNPTkRBUllfU0VSVkVSX01FTSIsICI0MDk2IiB9LAogICAgICAgICB7ICJyby5ISURERU5fQVBQX01FTSIsICI4MTkyIiB9LAogICAgICAgICB7ICJyby5FTVBUWV9BUFBfTUVNIiwgIjE2Mzg0IiB9LApAQCAtMTQ1LDYgKzE1Miw3IEBACiAgICAgICAgIHsgImxvZy5yZWRpcmVjdC1zdGRpbyIsICJmYWxzZSIgfSwgICAgICAgICAgLy8gLVhsb2ctc3RkaW8KIAogICAgICAgICAvKiBTdXJmYWNlRmxpbmdlciBvcHRpb25zICovCisgICAgICAgIHsgInJvLnNmLmxjZF9kZW5zaXR5IiwgIjE2MCIgfSwKICAgICAgICAgeyAiZGVidWcuc2Yubm9ib290YW5pbWF0aW9uIiwgIjEiIH0sCiAgICAgICAgIHsgImRlYnVnLnNmLnNob3d1cGRhdGVzIiwgIjAiIH0sCiAgICAgICAgIHsgImRlYnVnLnNmLnNob3djcHUiLCAiMCIgfSwKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvY3JlYXRlX3Rlc3QucHkgYi90ZXN0cnVubmVyL2NyZWF0ZV90ZXN0LnB5CmluZGV4IDJmYzNhM2MuLmZhZWEwMTMgMTAwNzU1Ci0tLSBhL3Rlc3RydW5uZXIvY3JlYXRlX3Rlc3QucHkKKysrIGIvdGVzdHJ1bm5lci9jcmVhdGVfdGVzdC5weQpAQCAtOTgsNyArOTgsNyBAQAogICAgIElPRXJyb3I6IHRlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgY2Fubm90IGJlIG9wZW5lZCBmb3Igd3JpdGluZwogICAiIiIKICAgIyBza2lwIGlmIGZpbGUgYWxyZWFkeSBleGlzdHMKLSAgdGVzdHNfcGF0aCA9ICIlcy8lcyIgJSAobWFuaWZlc3QuYXBwX3BhdGgsIFRlc3RzQ29uc3RzLlRFU1RTX0ZPTERFUikKKyAgdGVzdHNfcGF0aCA9ICIlcy8lcyIgJSAobWFuaWZlc3QuR2V0QXBwUGF0aCgpLCBUZXN0c0NvbnN0cy5URVNUU19GT0xERVIpCiAgIHRlc3RzX21hbmlmZXN0X3BhdGggPSAiJXMvJXMiICUgKHRlc3RzX3BhdGgsIG1hbmlmZXN0LkZJTEVOQU1FKQogICBpZiBvcy5wYXRoLmV4aXN0cyh0ZXN0c19tYW5pZmVzdF9wYXRoKToKICAgICBfUHJpbnRNZXNzYWdlKCIlcyBhbHJlYWR5IGV4aXN0cywgbm90IG92ZXJ3cml0dGVuIiAlIHRlc3RzX21hbmlmZXN0X3BhdGgpCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3J1bnRlc3QucHkgYi90ZXN0cnVubmVyL3J1bnRlc3QucHkKaW5kZXggNGE4NmE2My4uMTkxMDJjNiAxMDA3NTUKLS0tIGEvdGVzdHJ1bm5lci9ydW50ZXN0LnB5CisrKyBiL3Rlc3RydW5uZXIvcnVudGVzdC5weQpAQCAtMjIzLDkgKzIyMywxNCBAQAogCiAgIGRlZiBfRG9CdWlsZChzZWxmKToKICAgICBsb2dnZXIuU2lsZW50TG9nKCJCdWlsZGluZyB0ZXN0cy4uLiIpCisKKyAgICB0ZXN0cyA9IHNlbGYuX0dldFRlc3RzVG9SdW4oKQorICAgICMgdHVybiBvZmYgZGFsdmlrIHZlcmlmaWVyIGlmIG5lY2Vzc2FyeQorICAgIHNlbGYuX1R1cm5PZmZWZXJpZmllcih0ZXN0cykKKyAgICBzZWxmLl9Eb0Z1bGxCdWlsZCh0ZXN0cykKKwogICAgIHRhcmdldF9zZXQgPSBTZXQoKQogICAgIGV4dHJhX2FyZ3Nfc2V0ID0gU2V0KCkKLSAgICB0ZXN0cyA9IHNlbGYuX0dldFRlc3RzVG9SdW4oKQogICAgIGZvciB0ZXN0X3N1aXRlIGluIHRlc3RzOgogICAgICAgc2VsZi5fQWRkQnVpbGRUYXJnZXQodGVzdF9zdWl0ZSwgdGFyZ2V0X3NldCwgZXh0cmFfYXJnc19zZXQpCiAKQEAgLTI1MSwyMyArMjU2LDkgQEAKICAgICAgICAgICBsb2dnZXIuTG9nKGNtZCkKICAgICAgICAgICBydW5fY29tbWFuZC5SdW5Db21tYW5kKGNtZCwgcmV0dXJuX291dHB1dD1GYWxzZSkKIAotICAgICAgIyBoYWNrIHRvIGJ1aWxkIGN0cyBkZXBlbmRlbmNpZXMKLSAgICAgICMgVE9ETzogcmVtb3ZlIHRoaXMgd2hlbiBidWlsZCBkZXBlbmRlbmN5IHN1cHBvcnQgYWRkZWQgdG8gcnVudGVzdCBvcgotICAgICAgIyBjdHMgZGVwZW5kZW5jaWVzIGFyZSByZW1vdmVkCi0gICAgICBpZiBzZWxmLl9Jc0N0c1Rlc3RzKHRlc3RzKToKLSAgICAgICAgIyBuZWVkIHRvIHVzZSBtYWtlIHNpbmNlIHRoZXNlIGZhaWwgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRQotICAgICAgICBjbWQgPSAoJ21ha2UgLWolcyBDdHNUZXN0U3R1YnMgYW5kcm9pZC5jb3JlLnRlc3RzLnJ1bm5lcicgJQotICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucy5tYWtlX2pvYnMpCi0gICAgICAgIGxvZ2dlci5Mb2coY21kKQotICAgICAgICBpZiBub3Qgc2VsZi5fb3B0aW9ucy5wcmV2aWV3OgotICAgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICAgIG9zLmNoZGlyKHNlbGYuX3Jvb3RfcGF0aCkKLSAgICAgICAgICBydW5fY29tbWFuZC5SdW5Db21tYW5kKGNtZCwgcmV0dXJuX291dHB1dD1GYWxzZSkKLSAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQotICAgICAgIyB0dXJuIG9mZiBkYWx2aWsgdmVyaWZpZXIgaWYgbmVjZXNzYXJ5Ci0gICAgICBzZWxmLl9UdXJuT2ZmVmVyaWZpZXIodGVzdHMpCiAgICAgICB0YXJnZXRfYnVpbGRfc3RyaW5nID0gIiAiLmpvaW4obGlzdCh0YXJnZXRfc2V0KSkKICAgICAgIGV4dHJhX2FyZ3Nfc3RyaW5nID0gIiAiLmpvaW4obGlzdChleHRyYV9hcmdzX3NldCkpCisKICAgICAgICMgbW1tIGNhbm5vdCBiZSB1c2VkIGZyb20gcHl0aG9uLCBzbyBwZXJmb3JtIGEgc2ltaWxhciBvcGVyYXRpb24gdXNpbmcKICAgICAgICMgT05FX1NIT1RfTUFLRUZJTEUKICAgICAgIGNtZCA9ICdPTkVfU0hPVF9NQUtFRklMRT0iJXMiIG1ha2UgLWolcyAtQyAiJXMiIGZpbGVzICVzJyAlICgKQEAgLTI4NiwxMiArMjc3LDQzIEBACiAgICAgICAgIGxvZ2dlci5Mb2coIlN5bmNpbmcgdG8gZGV2aWNlLi4uIikKICAgICAgICAgc2VsZi5fYWRiLlN5bmMocnVudGltZV9yZXN0YXJ0PXJlYnVpbGRfbGliY29yZSkKIAorICBkZWYgX0RvRnVsbEJ1aWxkKHNlbGYsIHRlc3RzKToKKyAgICAiIiJJZiBuZWNlc3NhcnksIHJ1biBhIGZ1bGwgJ21ha2UnIGNvbW1hbmQgZm9yIHRoZSB0ZXN0cyB0aGF0IG5lZWQgaXQuIiIiCisgICAgZXh0cmFfYXJnc19zZXQgPSBTZXQoKQorCisgICAgIyBoYWNrIHRvIGJ1aWxkIGN0cyBkZXBlbmRlbmNpZXMKKyAgICAjIFRPRE86IHJlbW92ZSB0aGlzIHdoZW4gY3RzIGRlcGVuZGVuY2llcyBhcmUgcmVtb3ZlZAorICAgIGlmIHNlbGYuX0lzQ3RzVGVzdHModGVzdHMpOgorICAgICAgIyBuZWVkIHRvIHVzZSBtYWtlIHNpbmNlIHRoZXNlIGZhaWwgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRQorICAgICAgZXh0cmFfYXJnc19zZXQuYWRkKCdDdHNUZXN0U3R1YnMnKQorICAgICAgZXh0cmFfYXJnc19zZXQuYWRkKCdhbmRyb2lkLmNvcmUudGVzdHMucnVubmVyJykKKyAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgIGlmIHRlc3QuSXNGdWxsTWFrZSgpOgorICAgICAgICBpZiB0ZXN0LkdldEV4dHJhQnVpbGRBcmdzKCk6CisgICAgICAgICAgIyBleHRyYSBhcmdzIGNvbnRhaW5zIHRoZSBhcmdzIHRvIHBhc3MgdG8gJ21ha2UnCisgICAgICAgICAgZXh0cmFfYXJnc19zZXQuYWRkKHRlc3QuR2V0RXh0cmFCdWlsZEFyZ3MoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBsb2dnZXIuTG9nKCJXYXJuaW5nOiB0ZXN0ICVzIG5lZWRzIGEgZnVsbCBidWlsZCBidXQgZG9lcyBub3Qgc3BlY2lmeSIKKyAgICAgICAgICAgICAgICAgICAgICIgZXh0cmFfYnVpbGRfYXJncyIgJSB0ZXN0LkdldE5hbWUoKSkKKworICAgICMgY2hlY2sgaWYgdGhlcmUgaXMgYWN0dWFsbHkgYW55IHRlc3RzIHRoYXQgcmVxdWlyZWQgYSBmdWxsIGJ1aWxkCisgICAgaWYgZXh0cmFfYXJnc19zZXQ6CisgICAgICBjbWQgPSAoJ21ha2UgLWolcyAlcycgJSAoc2VsZi5fb3B0aW9ucy5tYWtlX2pvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLmpvaW4obGlzdChleHRyYV9hcmdzX3NldCkpKSkKKyAgICAgIGxvZ2dlci5Mb2coY21kKQorICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMucHJldmlldzoKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHNlbGYuX3Jvb3RfcGF0aCkKKyAgICAgICAgcnVuX2NvbW1hbmQuUnVuQ29tbWFuZChjbWQsIHJldHVybl9vdXRwdXQ9RmFsc2UpCisgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisKICAgZGVmIF9BZGRCdWlsZFRhcmdldChzZWxmLCB0ZXN0X3N1aXRlLCB0YXJnZXRfc2V0LCBleHRyYV9hcmdzX3NldCk6Ci0gICAgYnVpbGRfZGlyID0gdGVzdF9zdWl0ZS5HZXRCdWlsZFBhdGgoKQotICAgIGlmIHNlbGYuX0FkZEJ1aWxkVGFyZ2V0UGF0aChidWlsZF9kaXIsIHRhcmdldF9zZXQpOgotICAgICAgZXh0cmFfYXJnc19zZXQuYWRkKHRlc3Rfc3VpdGUuR2V0RXh0cmFCdWlsZEFyZ3MoKSkKLSAgICBmb3IgcGF0aCBpbiB0ZXN0X3N1aXRlLkdldEJ1aWxkRGVwZW5kZW5jaWVzKHNlbGYuX29wdGlvbnMpOgotICAgICAgc2VsZi5fQWRkQnVpbGRUYXJnZXRQYXRoKHBhdGgsIHRhcmdldF9zZXQpCisgICAgaWYgbm90IHRlc3Rfc3VpdGUuSXNGdWxsTWFrZSgpOgorICAgICAgYnVpbGRfZGlyID0gdGVzdF9zdWl0ZS5HZXRCdWlsZFBhdGgoKQorICAgICAgaWYgc2VsZi5fQWRkQnVpbGRUYXJnZXRQYXRoKGJ1aWxkX2RpciwgdGFyZ2V0X3NldCk6CisgICAgICAgIGV4dHJhX2FyZ3Nfc2V0LmFkZCh0ZXN0X3N1aXRlLkdldEV4dHJhQnVpbGRBcmdzKCkpCisgICAgICBmb3IgcGF0aCBpbiB0ZXN0X3N1aXRlLkdldEJ1aWxkRGVwZW5kZW5jaWVzKHNlbGYuX29wdGlvbnMpOgorICAgICAgICBzZWxmLl9BZGRCdWlsZFRhcmdldFBhdGgocGF0aCwgdGFyZ2V0X3NldCkKIAogICBkZWYgX0FkZEJ1aWxkVGFyZ2V0UGF0aChzZWxmLCBidWlsZF9kaXIsIHRhcmdldF9zZXQpOgogICAgIGlmIGJ1aWxkX2RpciBpcyBub3QgTm9uZToKQEAgLTM2NSw2ICszODcsNyBAQAogICAgICAgICAgIHNlbGYuX2FkYi5TZW5kQ29tbWFuZCgicmVib290IikKICAgICAgICAgICBzZWxmLl9hZGIuU2VuZENvbW1hbmQoIndhaXQtZm9yLWRldmljZSIsIHRpbWVvdXRfdGltZT02MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlfY291bnQ9MykKKyAgICAgICAgICBzZWxmLl9hZGIuRW5hYmxlQWRiUm9vdCgpCiAKICAgZGVmIFJ1blRlc3RzKHNlbGYpOgogICAgICIiIk1haW4gZW50cnkgbWV0aG9kIC0gZXhlY3V0ZXMgdGhlIHRlc3RzIGFjY29yZGluZyB0byBjb21tYW5kIGxpbmUgYXJncy4iIiIKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbCBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhtbAppbmRleCBmODNkMzJkLi4zMjA5NTc0IDEwMDY0NAotLS0gYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy54bWwKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueG1sCkBAIC0zOTUsNyArMzk1LDggQEAKIDx0ZXN0IG5hbWU9ImJyb3dzZXIiCiAgICAgYnVpbGRfcGF0aD0icGFja2FnZXMvYXBwcy9Ccm93c2VyIgogICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLmJyb3dzZXIudGVzdHMiCi0gICAgY292ZXJhZ2VfdGFyZ2V0PSJCcm93c2VyIiAvPgorICAgIGNvdmVyYWdlX3RhcmdldD0iQnJvd3NlciIKKyAgICBjb250aW51b3VzPSJ0cnVlIiAvPgogCiA8dGVzdCBuYW1lPSJjYWxjdWxhdG9yIgogICAgIGJ1aWxkX3BhdGg9InBhY2thZ2VzL2FwcHMvQ2FsY3VsYXRvciIKQEAgLTQ5OSw2ICs1MDAsMTIgQEAKICAgICBkZXNjcmlwdGlvbj0iR29vZ2xlIHRlc3QuIgogICAgIGV4dHJhX2J1aWxkX2FyZ3M9IkdURVNUX1RFU1RTPTEiIC8+CiAKKzwhLS0gTGliamluZ2xlIC0tPgorPHRlc3QtbmF0aXZlIG5hbWU9ImxpYmppbmdsZSIKKyAgICBidWlsZF9wYXRoPSJ2ZW5kb3IvZ29vZ2xlL2xpYnJhcmllcy9saWJqaW5nbGUiCisgICAgZGVzY3JpcHRpb249IkxpYmppbmdsZS4iCisgICAgZnVsbF9tYWtlPSJ0cnVlIgorICAgIGV4dHJhX2J1aWxkX2FyZ3M9IkxJQkpJTkdMRV9URVNUUz0xIiAvPgogCiA8IS0tIGhvc3QgamF2YSB0ZXN0cyAtLT4KIDx0ZXN0LWhvc3QgbmFtZT0iY3RzLWFwcHNlY3VyaXR5IgpkaWZmIC0tZ2l0IGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMueHNkIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMueHNkCmluZGV4IDcxMzQ0NTkuLjY3ODE5NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzLnhzZAorKysgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy54c2QKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0icmVxdWlyZWQiIC8+CiAKICAgICAgICAgPCEtLSBGaWxlIHN5c3RlbSBwYXRoLCByZWxhdGl2ZSB0byBBbmRyb2lkIGJ1aWxkIHJvb3QsIHRvIHRoaXMKLSAgICAgICAgcGFja2FnZSdzIEFuZHJvaWQubWsgZmlsZS4gLS0+CisgICAgICAgIHBhY2thZ2UncyBBbmRyb2lkLm1rIGZpbGUuLS0+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYnVpbGRfcGF0aCIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIiAvPgogCiAgICAgICAgIDwhLS0gSW5jbHVkZSB0ZXN0IGluIGNvbnRpbnVvdXMgdGVzdCBzeXN0ZW0uIC0tPgpAQCAtNTUsMTAgKzU1LDE3IEBACiAgICAgICAgIHRlc3QuIC0tPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRlc2NyaXB0aW9uIiB0eXBlPSJ4czpzdHJpbmciIHVzZT0ib3B0aW9uYWwiIC8+CiAKKyAgICAgICAgPCEtLSBTcGVjaWZpZXMgdGhhdCBhIGZ1bGwgJ21ha2UnLCBhcyBvcHBvc2VkIHRvICdtbW0nIGNvbW1hbmQsIGlzCisgICAgICAgIG5lZWRlZCB0byBidWlsZCB0aGlzIHRlc3QuIFRoZSBidWlsZCBjb21tYW5kIHVzZWQgd2lsbCBiZQorICAgICAgICAnbWFrZSBleHRyYV9idWlsZF9hcmdzJyAtLT4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJmdWxsX21ha2UiIHR5cGU9InhzOmJvb2xlYW4iCisgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiIC8+CisKICAgICAgICAgPCEtLSAgRXh0cmEgYXJndW1lbnRzIHRvIGFwcGVuZCB0byBidWlsZCBjb21tYW5kIHdoZW4gYnVpbGRpbmcgdGhpcwogICAgICAgICB0ZXN0LiAtLT4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJleHRyYV9idWlsZF9hcmdzIiB0eXBlPSJ4czpzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgIHVzZT0ib3B0aW9uYWwiIC8+CisKICAgICA8L3hzOmNvbXBsZXhUeXBlPgogCiAgICAgPCEtLSBKYXZhIG9uIGRldmljZSBpbnN0cnVtZW50YXRpb24gdGVzdC4KZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL2luc3RydW1lbnRhdGlvbl90ZXN0LnB5IGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvaW5zdHJ1bWVudGF0aW9uX3Rlc3QucHkKaW5kZXggODc4MjYxNS4uNDBkNmJlZCAxMDA2NDQKLS0tIGEvdGVzdHJ1bm5lci90ZXN0X2RlZnMvaW5zdHJ1bWVudGF0aW9uX3Rlc3QucHkKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvaW5zdHJ1bWVudGF0aW9uX3Rlc3QucHkKQEAgLTE3LDkgKzE3LDYgQEAKIAogIiIiVGVzdFN1aXRlIGRlZmluaXRpb24gZm9yIEFuZHJvaWQgaW5zdHJ1bWVudGF0aW9uIHRlc3RzLiIiIgogCi0jIHB5dGhvbiBpbXBvcnRzCi1pbXBvcnQgb3MKLQogIyBsb2NhbCBpbXBvcnRzCiBpbXBvcnQgY292ZXJhZ2UKIGltcG9ydCBlcnJvcnMKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfc3VpdGUucHkgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3N1aXRlLnB5CmluZGV4IDkwZDU3OTIuLjEwMmE3MzggMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfc3VpdGUucHkKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMvdGVzdF9zdWl0ZS5weQpAQCAtMzIsNiArMzIsNyBAQAogICAgIHNlbGYuX3N1aXRlID0gTm9uZQogICAgIHNlbGYuX2Rlc2NyaXB0aW9uID0gJycKICAgICBzZWxmLl9leHRyYV9idWlsZF9hcmdzID0gJycKKyAgICBzZWxmLl9pc19mdWxsX21ha2UgPSBGYWxzZQogCiAgIGRlZiBHZXROYW1lKHNlbGYpOgogICAgIHJldHVybiBzZWxmLl9uYW1lCkBAIC04OCw2ICs4OSwxMyBAQAogICAgIHNlbGYuX2V4dHJhX2J1aWxkX2FyZ3MgPSBidWlsZF9hcmdzCiAgICAgcmV0dXJuIHNlbGYKIAorICBkZWYgSXNGdWxsTWFrZShzZWxmKToKKyAgICByZXR1cm4gc2VsZi5faXNfZnVsbF9tYWtlCisKKyAgZGVmIFNldElzRnVsbE1ha2Uoc2VsZiwgZnVsbF9tYWtlKToKKyAgICBzZWxmLl9pc19mdWxsX21ha2UgPSBmdWxsX21ha2UKKyAgICByZXR1cm4gc2VsZgorCiAgIGRlZiBSdW4oc2VsZiwgb3B0aW9ucywgYWRiKToKICAgICAiIiJSdW5zIHRoZSB0ZXN0LgogCmRpZmYgLS1naXQgYS90ZXN0cnVubmVyL3Rlc3RfZGVmcy90ZXN0X3dhbGtlci5weSBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfd2Fsa2VyLnB5CmluZGV4IDA2YzRlNmQuLjk0OGQ1M2UgMTAwNzU1Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfd2Fsa2VyLnB5CisrKyBiL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3Rlc3Rfd2Fsa2VyLnB5CkBAIC02NSwyMCArNjUsMjAgQEAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CiAgICAgICBsb2dnZXIuTG9nKCclcyBkb2VzIG5vdCBleGlzdCcgJSBwYXRoKQogICAgICAgcmV0dXJuIFtdCi0gICAgYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgIHJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQogICAgICMgZW5zdXJlIHBhdGggaXMgaW4gQU5EUk9JRF9CVUlMRF9ST09UCi0gICAgc2VsZi5fYnVpbGRfdG9wID0gYW5kcm9pZF9idWlsZC5HZXRUb3AoKQotICAgIGlmIG5vdCBzZWxmLl9Jc1BhdGhJbkJ1aWxkVHJlZShhYnNwYXRoKToKKyAgICBzZWxmLl9idWlsZF90b3AgPSBvcy5wYXRoLnJlYWxwYXRoKGFuZHJvaWRfYnVpbGQuR2V0VG9wKCkpCisgICAgaWYgbm90IHNlbGYuX0lzUGF0aEluQnVpbGRUcmVlKHJlYWxwYXRoKToKICAgICAgIGxvZ2dlci5Mb2coJyVzIGlzIG5vdCBhIHN1Yi1kaXJlY3Rvcnkgb2YgYnVpbGQgcm9vdCAlcycgJQogICAgICAgICAgICAgICAgICAocGF0aCwgc2VsZi5fYnVpbGRfdG9wKSkKICAgICAgIHJldHVybiBbXQogCiAgICAgIyBmaXJzdCwgYXNzdW1lIHBhdGggaXMgYSBwYXJlbnQgZGlyZWN0b3J5LCB3aGljaCBzcGVjaWZpZXMgdG8gcnVuIGFsbAogICAgICMgdGVzdHMgd2l0aGluIHRoaXMgZGlyZWN0b3J5Ci0gICAgdGVzdHMgPSBzZWxmLl9GaW5kU3ViVGVzdHMoYWJzcGF0aCwgW10pCisgICAgdGVzdHMgPSBzZWxmLl9GaW5kU3ViVGVzdHMocmVhbHBhdGgsIFtdKQogICAgIGlmIG5vdCB0ZXN0czoKICAgICAgIGxvZ2dlci5TaWxlbnRMb2coJ05vIHRlc3RzIGZvdW5kIHdpdGhpbiAlcywgc2VhcmNoaW5nIHVwd2FyZHMnICUgcGF0aCkKLSAgICAgIHRlc3RzID0gc2VsZi5fRmluZFVwc3RyZWFtVGVzdHMoYWJzcGF0aCkKKyAgICAgIHRlc3RzID0gc2VsZi5fRmluZFVwc3RyZWFtVGVzdHMocmVhbHBhdGgpCiAgICAgcmV0dXJuIHRlc3RzCiAKICAgZGVmIF9Jc1BhdGhJbkJ1aWxkVHJlZShzZWxmLCBwYXRoKToKZGlmZiAtLWdpdCBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3htbF9zdWl0ZV9oZWxwZXIucHkgYi90ZXN0cnVubmVyL3Rlc3RfZGVmcy94bWxfc3VpdGVfaGVscGVyLnB5CmluZGV4IGI3ZWQ4M2IuLjZjZjJlNmMgMTAwNjQ0Ci0tLSBhL3Rlc3RydW5uZXIvdGVzdF9kZWZzL3htbF9zdWl0ZV9oZWxwZXIucHkKKysrIGIvdGVzdHJ1bm5lci90ZXN0X2RlZnMveG1sX3N1aXRlX2hlbHBlci5weQpAQCAtMzksNiArMzksNyBAQAogICBfU1VJVEVfQVRUUiA9ICdzdWl0ZScKICAgX0RFU0NSSVBUSU9OX0FUVFIgPSAnZGVzY3JpcHRpb24nCiAgIF9FWFRSQV9CVUlMRF9BUkdTX0FUVFIgPSAnZXh0cmFfYnVpbGRfYXJncycKKyAgX0ZVTExfTUFLRV9BVFRSID0gJ2Z1bGxfbWFrZScKIAogICBkZWYgUGFyc2Uoc2VsZiwgZWxlbWVudCk6CiAgICAgIiIiUG9wdWxhdGVzIGNvbW1vbiBzdWl0ZSBhdHRyaWJ1dGVzIGZyb20gZ2l2ZW4gc3VpdGUgeG1sIGVsZW1lbnQuCkBAIC03OSw2ICs4MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlPScnKSkKICAgICB0ZXN0X3N1aXRlLlNldEV4dHJhQnVpbGRBcmdzKHNlbGYuX1BhcnNlQXR0cmlidXRlKAogICAgICAgICBzdWl0ZV9lbGVtZW50LCBzZWxmLl9FWFRSQV9CVUlMRF9BUkdTX0FUVFIsIEZhbHNlLCBkZWZhdWx0X3ZhbHVlPScnKSkKKyAgICB0ZXN0X3N1aXRlLlNldElzRnVsbE1ha2Uoc2VsZi5fUGFyc2VBdHRyaWJ1dGUoCisgICAgICAgIHN1aXRlX2VsZW1lbnQsIHNlbGYuX0ZVTExfTUFLRV9BVFRSLCBGYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSkpCisKIAogICBkZWYgX1BhcnNlQXR0cmlidXRlKHNlbGYsIHN1aXRlX2VsZW1lbnQsIGF0dHJpYnV0ZV9uYW1lLCBtYW5kYXRvcnksCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZT1Ob25lKToKZGlmZiAtLWdpdCBhL3Rvb2xzL2VsZnRyZWUvQW5kcm9pZC5tayBiL3Rvb2xzL2VsZnRyZWUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJhMGYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWxmdHJlZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzkgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworCisjIFRhcmdldCBleGVjdXRhYmxlCisjIFRPRE86IFJlcXVpcmVzIGxpYmVsZiBmb3IgdGFyZ2V0CisKKyNpbmNsdWRlICQoQ0xFQVJfVkFSUykKKyNMT0NBTF9NT0RVTEUgOj0gJChtb2R1bGUpCisjTE9DQUxfU1JDX0ZJTEVTIDo9ICQoc3JjX2ZpbGVzKQorI0xPQ0FMX0NfSU5DTFVERVMgOj0gJChjX2luY2x1ZGVzKQorI0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gJChzaGFyZWRfbGlicmFyaWVzKQorI0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gJChzdGF0aWNfbGlicmFyaWVzKQorI0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PUFRJT05BTF9FWEVDVVRBQkxFUykKKyNMT0NBTF9NT0RVTEVfVEFHUyA6PSBkZWJ1ZworI0xPQ0FMX0xETElCUyArPQorI2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQorCisjIEhvc3QgZXhlY3V0YWJsZQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBlbGZ0cmVlCitMT0NBTF9TUkNfRklMRVMgOj0gZWxmdHJlZS5jCitMT0NBTF9DX0lOQ0xVREVTIDo9IGV4dGVybmFsL2VsZnV0aWxzL2xpYmVsZgorTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJlbGYKK2luY2x1ZGUgJChCVUlMRF9IT1NUX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS90b29scy9lbGZ0cmVlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi90b29scy9lbGZ0cmVlL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VsZnRyZWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMgYi90b29scy9lbGZ0cmVlL2VsZnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2RlZDEzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWxmdHJlZS9lbGZ0cmVlLmMKQEAgLTAsMCArMSwzMjggQEAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8Z2VsZi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgUEFUSF9NQVggMjU2CisKK3N0YXRpYyBlbnVtIHsgSElERV9EVVBTLCBQUlVORV9EVVBTLCBTSE9XX0RVUFMgfSBkdXBfbW9kZTsKK3N0YXRpYyBjaGFyICpyb290X25hbWU7CisKK3N0YXRpYyB2b2lkIGFwcF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdW5peF9lcnIoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgZXJyc3Y7CisKKwllcnJzdiA9IGVycm5vOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCisJZnByaW50ZihzdGRlcnIsICI6ICVzXG4iLCBzdHJlcnJvcihlcnJzdikpOworfQorCitzdGF0aWMgdm9pZCBlbGZfZXJyKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwl2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIjogJXNcbiIsIGVsZl9lcnJtc2coLTEpKTsKK30KKworc3RydWN0IHNlZW4geworCWNoYXIgKm5hbWU7CisJc3RydWN0IHNlZW4gKm5leHQ7Cit9OworCitzdHJ1Y3QgdHJlZV9zdGF0ZSB7CisJaW50IGxldmVsOworCXN0cnVjdCBzZWVuICpzZWVuOworfTsKKworc3RhdGljIGludCBzZWVuKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzOworCisJZm9yIChzID0gdC0+c2VlbjsgczsgcyA9IHMtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAocy0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2VlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzZWVuICpzID0gbWFsbG9jKHNpemVvZigqcykpOworCXMtPm5hbWUgPSBtYWxsb2Moc3RybGVuKG5hbWUpICsgMSk7CisJc3RyY3B5KHMtPm5hbWUsIG5hbWUpOworCXMtPm5leHQgPSB0LT5zZWVuOworCXQtPnNlZW4gPSBzOworfQorCitjaGFyICppbmRlbnRfc3RyID0gIiAgIjsKKworc3RhdGljIHZvaWQgaW5kZW50KHN0cnVjdCB0cmVlX3N0YXRlICp0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHQtPmxldmVsOyBpKyspCisJCXByaW50ZigiJXMiLCBpbmRlbnRfc3RyKTsKK30KKworc3RydWN0IHNlYXJjaF9kaXIgeworCWNoYXIgKnBhdGg7CisJc3RydWN0IHNlYXJjaF9kaXIgKm5leHQ7Cit9ICpkaXJzID0gTlVMTDsKKworc3RhdGljIHZvaWQgYWRkX3NlYXJjaF9kaXIoY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyID0gbWFsbG9jKHNpemVvZigqZGlyKSk7CisJZGlyLT5wYXRoID0gbWFsbG9jKHN0cmxlbihwYXRoKSArIDEpOworCXN0cmNweShkaXItPnBhdGgsIHBhdGgpOworCWRpci0+bmV4dCA9IGRpcnM7CisJZGlycyA9IGRpcjsKK30KKworc3RydWN0IGZpbGVfc3RhdGUgeworCXN0cnVjdCB0cmVlX3N0YXRlICp0OworCUVsZiAqZTsKKwlFbGZfRGF0YSAqc3RydGFiX2RhdGE7Cit9OworCitzdGF0aWMgRWxmX1NjbiAqZmluZF9zY24oc3RydWN0IGZpbGVfc3RhdGUgKmYsIEdFbGZfV29yZCBzaHQsIEVsZl9TY24gKnNjbiwgR0VsZl9TaGRyICpzaGRyX291dCkKK3sKKwl3aGlsZSAoKHNjbiA9IGVsZl9uZXh0c2NuKGYtPmUsIHNjbikpKSB7CisJCWlmICghZ2VsZl9nZXRzaGRyKHNjbiwgc2hkcl9vdXQpKQorCQkJY29udGludWU7CisKKwkJaWYgKHNoZHJfb3V0LT5zaF90eXBlID09IHNodCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBzY247Cit9CisKK3N0cnVjdCBkeW5fc3RhdGUgeworCXN0cnVjdCBmaWxlX3N0YXRlICpmOworCUVsZl9EYXRhICpkeW5fZGF0YTsKKwlpbnQgY291bnQ7Cit9OworCitzdGF0aWMgaW50IGZpbmRfZHluKHN0cnVjdCBkeW5fc3RhdGUgKmQsIEdFbGZfU3h3b3JkIHRhZywgR0VsZl9EeW4gKmR5bl9vdXQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC0+Y291bnQ7IGkrKykgeworCQlpZiAoIWdlbGZfZ2V0ZHluKGQtPmR5bl9kYXRhLCBpLCBkeW5fb3V0KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkeW5fb3V0LT5kX3RhZyA9PSB0YWcpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9maWxlKHN0cnVjdCB0cmVlX3N0YXRlICp0LCBjaGFyICpuYW1lLCBjaGFyICpwYXRoKTsKKworc3RhdGljIGludCBkdW1wX25lZWRlZChzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc2VhcmNoX2RpciAqZGlyOworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJaW50IGZkOworCisJdC0+bGV2ZWwrKzsKKworCWZvciAoZGlyID0gZGlyczsgZGlyOyBkaXIgPSBkaXItPm5leHQpIHsKKwkJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIGRpci0+cGF0aCwgbmFtZSk7CisJCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQljbG9zZShmZCk7CisJCQlkdW1wX2ZpbGUodCwgbmFtZSwgcGF0aCk7CisJCQl0LT5sZXZlbC0tOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlhcHBfZXJyKCJDb3VsZG4ndCByZXNvbHZlIGRlcGVuZGVuY3kgXCIlc1wiLiIsIG5hbWUpOworCXQtPmxldmVsLS07CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGR1bXBfZHluYW1pYyhzdHJ1Y3QgZmlsZV9zdGF0ZSAqZiwgRWxmX1NjbiAqc2NuLCBHRWxmX1NoZHIgKnNoZHIpCit7CisJc3RydWN0IGR5bl9zdGF0ZSBkOworCUdFbGZfRHluIG5lZWRlZF9keW47CisJY2hhciAqbmVlZGVkX25hbWU7CisJaW50IGk7CisKKwlkLmYgPSBmOworCWQuZHluX2RhdGEgPSBlbGZfZ2V0ZGF0YShzY24sIE5VTEwpOworCWlmICghZC5keW5fZGF0YSkgeworCQllbGZfZXJyKCJlbGZfZ2V0ZGF0YSBmYWlsZWQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkLmNvdW50ID0gc2hkci0+c2hfc2l6ZSAvIHNoZHItPnNoX2VudHNpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgZC5jb3VudDsgaSsrKSB7CisJCWlmICghZ2VsZl9nZXRkeW4oZC5keW5fZGF0YSwgaSwgJm5lZWRlZF9keW4pKQorCQkJY29udGludWU7CisKKwkJaWYgKG5lZWRlZF9keW4uZF90YWcgIT0gRFRfTkVFREVEKQorCQkJY29udGludWU7CisKKwkJbmVlZGVkX25hbWUgPSAoY2hhciAqKWYtPnN0cnRhYl9kYXRhLT5kX2J1ZgorCQkJICAgICAgKyBuZWVkZWRfZHluLmRfdW4uZF92YWw7CisKKwkJZHVtcF9uZWVkZWQoZi0+dCwgbmVlZGVkX25hbWUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfZmlsZShzdHJ1Y3QgdHJlZV9zdGF0ZSAqdCwgY2hhciAqbmFtZSwgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgZmlsZV9zdGF0ZSBmOworCWludCBmZDsKKwlFbGZfU2NuICpzY247CisJR0VsZl9TaGRyIHNoZHI7CisKKwlpZiAoKGR1cF9tb2RlID09IEhJREVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkKKwkJcmV0dXJuIDA7CisKKwlpbmRlbnQodCk7IHByaW50ZigiJXMiLCBuYW1lKTsKKworCWlmICgoZHVwX21vZGUgPT0gUFJVTkVfRFVQUykgJiYgc2Vlbih0LCBuYW1lKSkgeworCQlwcmludGYoIi4uLlxuIik7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ZigiOlxuIik7CisJfQorCisJc2VlKHQsIG5hbWUpOworCisJZi50ID0gdDsKKworCWZkID0gb3BlbihmaWxlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkgeworCQl1bml4X2Vycigib3BlbiglcykgZmFpbGVkIiwgZmlsZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlmLmUgPSBlbGZfYmVnaW4oZmQsIEVMRl9DX1JFQUQsIE5VTEwpOworCWlmICghZi5lKSB7CisJCWVsZl9lcnIoImVsZl9iZWdpbiBmYWlsZWQgb24gJXMiLCBmaWxlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfU1RSVEFCLCBOVUxMLCAmc2hkcik7CisJZi5zdHJ0YWJfZGF0YSA9IGVsZl9nZXRkYXRhKHNjbiwgTlVMTCk7CisJaWYgKCFmLnN0cnRhYl9kYXRhKSB7CisJCWFwcF9lcnIoIiVzIGhhcyBubyBzdHJ0YWIgc2VjdGlvbiIsIGZpbGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJc2NuID0gTlVMTDsKKwl3aGlsZSAoKHNjbiA9IGZpbmRfc2NuKCZmLCBTSFRfRFlOQU1JQywgc2NuLCAmc2hkcikpKSB7CisJCWR1bXBfZHluYW1pYygmZiwgc2NuLCAmc2hkcik7CisJfQorCisJZWxmX2VuZChmLmUpOworCWNsb3NlKGZkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGVsZnRyZWUgWyAtcyB8IC1oIF0gZWxmLWZpbGVcbiIKKwkgICAgICAgICAgICAgICAgIiAgLVMgIER1cGxpY2F0ZSBlbnRpcmUgc3VidHJlZSB3aGVuIGEgZHVwbGljYXRlIGlzIGZvdW5kXG4iCisJCQkiICAtUCAgU2hvdyBkdXBsaWNhdGVzLCBidXQgb25seSBpbmNsdWRlIHN1YnRyZWUgb25jZVxuIgorCQkJIiAgLUggIFNob3cgZWFjaCBsaWJyYXJ5IGF0IG1vc3Qgb25jZSwgZXZlbiBpZiBkdXBsaWNhdGVkXG4iCisJCQkiICAtaCAgU2hvdyB0aGlzIGhlbHAgc2NyZWVuXG4iKTsKK30KKworc3RhdGljIGludCBwYXJzZV9hcmdzKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYyAtIDE7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVMiKSkgeworCQkJZHVwX21vZGUgPSBTSE9XX0RVUFM7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLVAiKSkgeworCQkJZHVwX21vZGUgPSBQUlVORV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1IIikpIHsKKwkJCWR1cF9tb2RlID0gSElERV9EVVBTOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1oIikpIHsKKwkJCXVzYWdlKCk7CisJCQlleGl0KDApOworCQl9IGVsc2UgeworCQkJYXBwX2VycigiVW5leHBlY3RlZCBhcmd1bWVudCBcIiVzXCIhXG4iLCBhcmd2W2ldKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJvb3RfbmFtZSA9IGFyZ3ZbYXJnYyAtIDFdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9zZWFyY2hfZGlycyh2b2lkKQoreworCWNoYXIgKnJlbHBhdGg7CisJY2hhciBwYXRoW1BBVEhfTUFYXTsKKworCXJlbHBhdGggPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKKwlpZiAoIXJlbHBhdGgpIHsKKwkJYXBwX2VycigiV2FybmluZzogQU5EUk9JRF9QUk9EVUNUX09VVCBub3Qgc2V0OyAiCisJCSAgICAgICAgInVzaW5nIGN1cnJlbnQgZGlyZWN0b3J5LlxuIik7CisJCXJlbHBhdGggPSAiLiI7CisJfQorCisJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIHJlbHBhdGgsICJzeXN0ZW0vbGliIik7CisJYWRkX3NlYXJjaF9kaXIocGF0aCk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJc3RydWN0IHRyZWVfc3RhdGUgdDsKKworCWlmIChhcmdjIDwgMiB8fCBwYXJzZV9hcmdzKGFyZ2MsIGFyZ3YpKSB7CisJCXVzYWdlKCk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwlpZiAoZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCkgPT0gRVZfTk9ORSkgeworCQllbGZfZXJyKCJ2ZXJzaW9uIG1pc21hdGNoIik7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwl0LmxldmVsID0gMDsKKwl0LnNlZW4gID0gTlVMTDsKKworCWFkZF9zZWFyY2hfZGlycygpOworCisJZHVtcF9maWxlKCZ0LCByb290X25hbWUsIHJvb3RfbmFtZSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3QvUkVBRE1FIGIvdG9vbHMvbGFicHJldGVzdC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4OTAzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xhYnByZXRlc3QvUkVBRE1FCkBAIC0wLDAgKzEsNTMgQEAKK092ZXJ2aWV3OgorCitUaGUgbGFicHJldGVzdC5zaCBzY3JpcHQgaXMgZGVzaWduZWQgdG8gZW11bGF0ZSBhIHR5cGljYWwgYXV0b21hdGVkIHRlc3QgbGFiCitzZXNzaW9uLiAgSXQgcHV0cyBhIGRldmljZSBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwgcmVib290cyBpbnRvIGJvb3Rsb2FkZXIgbW9kZSwKK2RldGVybWluZXMgZGV2aWNlIHR5cGUsIGVyYXNlcyB1c2VyIGNhY2hlLCBmbGFzaGVzIGEgZ2VuZXJpYyB1c2VyZGF0YSBpbWFnZSwKK3VwZGF0ZXMgdGhlIGJvb3Rsb2FkZXIgaW1hZ2UsIHVwZGF0ZXMgdGhlIHJhZGlvIGltYWdlLCB1cGRhdGVzIHRoZSBzeXN0ZW0gaW1hZ2UKK2FuZCByZWJvb3RzLCBzZXRzIHVwIGZvciBhIG1vbmtleSBydW4gYW5kIGZpbmFsbHkgcnVucyBhIHJhbmRvbSBtb25rZXkgdGVzdC4KK0l0IHdpbGwgcmVwZWF0IHRoaXMgYmFzZWQgb24gYW4gb3B0aW9uYWwgcGFyYW1ldGVyKC1pKSBvciBkZWZhdWx0IHRvIDEwMCB0aW1lcy4KK0l0IHdpbGwgZGV0ZWN0IGlmIGl0IGlzIGluIGEgbG93IGJhdHRlcnkgc2l0dWF0aW9uIGFuZCB3YWl0IGZvciBpdCB0byBjaGFyZ2UKK2FnYWluLgorCitUaGUgZ29hbCBpcyB0byBzZWUgaWYgYSBkZXZpY2UgaXMgcmVhZHkgZm9yIGRlcGxveW1lbnQgdG8gYXV0b21hdGVkIGxhYiB0ZXN0aW5nCithbmQgY2FuIGFsc28gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBsYWIgaW5mcmFzdHJ1Y3R1cmUgaXMgcmVhZHkgZm9yIGRldmljZXMuCitUaGUgaWRlYSBpcyB0byBydW4gdGhpcyBzY3JpcHQgYXQgdGhlIHNhbWUgdGltZSBmb3IgbXVsdGlwbGUgZGV2aWNlcywgdHlwaWNhbGx5CitJIHdvdWxkIGNvbm5lY3QgOCBkZXZpY2VzIHRvIGEgaG9zdCBhbmQgcnVuIHRoaXMgc2NyaXB0IGluIDggc2VwYXJhdGUgc2hlbGwKK3Nlc3Npb25zIGFuZCB3YXRjaCBmb3IgZmFpbHVyZXMuCisKK1J1bm5pbmcgdGhlIHNjcmlwdDoKKworSWYgdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBob3N0IHlvdSBjYW4gc2ltcGx5IGp1c3QgcnVuIHRoZQorc2NyaXB0LCBpdCB3aWxsIGRldGVjdCB0aGUgZGV2aWNlIGFuZCBnbyB0aHJvdWdoIDEwMCBjeWNsZXMsIHJ1bm5pbmcgdGhlIG1vbmtleQorZm9yIDIwMCBldmVudHMgZWFjaCBjeWNsZS4gIFRoZSBzY3JpcHQgaWdub3JlcyBub3JtYWwgbW9ua2V5IGZhaWx1cmVzLiBJZiB5b3UKK2hhdmUgbXVsdGlwbGUgZGV2aWNlcyBhdHRhY2hlZCB1c2UgdGhlIC1kIDxkZXZpY2VfaWQ+IHBhcmFtZXRlciB0byB0YXJnZXQgYQorc3BlY2lmaWMgZGV2aWNlcy4gIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgLWkgZm9yIGhvdyBtYW55IGN5Y2xlcyBhbmQgLW0gZm9yCitob3cgbWFueSBtb25rZXkgZXZlbnRzIGFuZCBmaW5hbGx5IC14IHRvIG1ha2UgaXQgc2tpcCB0aGUgbW9ua2V5IHJ1biBwb3J0aW9uCithbHRvZ2V0aGVyLgorCitBZGRpbmcgc3VwcG9ydCBmb3IgbmV3IGRldmljZXMgb3IgZnJvbSBzY3JhdGNoOgorCitUaGUgc2NyaXB0IHVzZXMgaW5jbHVkZWQgY29waWVzIG9mIGFkYiBhbmQgZmFzdGJvb3Qgd2hpY2ggYXJlIGluIGluIHRoZSB0b29scy8KK3N1YiBkaXJlY3RvcnkuIElmIHlvdSBhcmUgc2V0dGluZyB0aGlzIHVwIHdpdGggb25seSB0aGUgc2NyaXB0LCBjcmVhdGUgYSB0b29scworc3ViIGRpcmVjdG9yeSBhbmQgcHV0IGFkYiBhbmQgZmFzdGJvb3QgaW4gaXQgYW5kIG1ha2Ugc3VyZSB0aGV5IGFyZSBleGVjdXRhYmxlLgorQ3VycmVudGx5IHdlIHVzZSB1c2VyZGVidWcgYnVpbGRzLgorCitIZXJlIGFyZSB0aGUgc3RlcHMgdG8gYWRkIGEgbmV3IGRldmljZToKKworICAxKSBDcmVhdGUgYSBuZXcgc3ViIGRpcmVjdG9yeSB1c2luZyB0aGUgcmVzdWx0IG9mICJmYXN0Ym9vdCBnZXR2YXIgcHJvZHVjdCIuCisgIDIpIENvcHkgYSBidWlsZCBpbWFnZSB0byB0aGUgbmV3IHN1YiBkaXJlY3RvcnkgaW4gb3VyIGZvcm1hdC4KKyAgICAgKGkuZS4gcGFzc2lvbi1pbWctMjQ4MjcuemlwKQorICAzKSBDb3B5IGEgYm9vdCBpbWFnZSB0byB0aGUgbmV3IHN1YiBkaXJlY3RvcnkgaW4gb3VyIGZvcm1hdC4KKyAgICAgKGkuZS4gaGJvb3QuMC4zMy4yMDEyLmltZykKKyAgNCkgQ29weSBhIHJhZGlvIGltYWdlIHRvIHRoZSBuZXcgc3ViIGRpcmVjdG9yeSBpbiBvdXIgZm9ybWF0LgorICAgICAoaS5lLiByYWRpby40LjA0LjAwLjAzXzIuaW1nKQorICA1KSBDb3B5IGEgdXNlcmRhdGEuaW1nIGZpbGUsIHBvc3NpYmx5IGZyb20gb25lIG9mIHRoZSBvdGhlciBkaXJlY3Rvcmllcy4KKworQ3VzdG9taXphdGlvbnMgdG8gdGhlIGZsYXNoaW5nIHByb2Nlc3MgYXJlIGhhbmRsZWQgYnkgYWRkaW5nIGEgY3VzdG9tX2ZsYXNoLnNoCitmaWxlIHRoYXQgaXMgcmVhZCBpbiBiZWZvcmUgdGhlIG1haW4gbG9vcCBzdGFydHMuIEl0IGFsbG93cyB5b3UgdG8gYWRkIGFueSBub24KK2dlbmVyaWMgZnVuY3Rpb25zIG9yIGRldGFpbHMgdG8gdGhlIGZsYXNoaW5nIHByb2Nlc3MuIFlvdSBtdXN0IHVzZSBpdCB0byBkZWZpbmUKK3RoZSB2YXJpYWJsZSAiYm9vdHBhcnQiIHdoaWNoIGlzIG5vdCBkZWZpbmVkIGJ5IGRlZmF1bHQuIEFsc28sIHVzZSB0aGlzIGZpbGUgdG8KK3Jld3JpdGUgdGhlIGZsYXNoX2RldmljZSBmdW5jdGlvbiBhbmQgYW55IG90aGVycywgZXRjLi4uCisKK1RoZSBzY3JpcHQgc2hvdWxkIGhhbmRsZSB0aGUgcmVzdCwgdW5sZXNzIHRoZXJlIGFyZSByYWRpY2FsIGNoYW5nZXMgdG8gZmlsZQorbmFtZXMgb3IgdGhlIHByb2Nlc3MuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGFicHJldGVzdC9sYWJwcmV0ZXN0LnNoIGIvdG9vbHMvbGFicHJldGVzdC9sYWJwcmV0ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYyMjM4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9sYWJwcmV0ZXN0L2xhYnByZXRlc3Quc2gKQEAgLTAsMCArMSw1ODIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIEF1dGhvcjogYmdheUBnb29nbGUuY29tIChCcnVjZSBHYXkpCisjCisjIFRoZSBsYWJwcmV0ZXN0LnNoIHNjcmlwdCBpcyBkZXNpZ25lZCB0byBlbXVsYXRlIGEgdHlwaWNhbCBhdXRvbWF0ZWQgdGVzdCBsYWIKKyMgc2Vzc2lvbi4gIEl0IHB1dHMgYSBkZXZpY2UgaW50byBib290bG9hZGVyIG1vZGUsIHJlYm9vdHMgaW50byBib290bG9hZGVyIG1vZGUsCisjIGRldGVybWluZXMgZGV2aWNlIHR5cGUsIGVyYXNlcyB1c2VyIGNhY2hlLCBmbGFzaGVzIGEgZ2VuZXJpYyB1c2VyZGF0YSBpbWFnZSwKKyMgdXBkYXRlcyB0aGUgYm9vdGxvYWRlciBpbWFnZSwgdXBkYXRlcyB0aGUgcmFkaW8gaW1hZ2UsIHVwZGF0ZXMgdGhlIHN5c3RlbQorIyBpbWFnZSBhbmQgcmVib290cywgc2V0cyB1cCBmb3IgYSBtb25rZXkgcnVuIGFuZCBmaW5hbGx5IHJ1bnMgYSByYW5kb20gbW9ua2V5CisjIHRlc3QuIEl0IHdpbGwgcmVwZWF0IHRoaXMgYmFzZWQgb24gYW4gb3B0aW9uYWwgcGFyYW1ldGVyKC1pKSBvciBkZWZhdWx0IHRvIDEwMAorIyB0aW1lcy4gSXQgd2lsbCBkZXRlY3QgaWYgaXQgaXMgaW4gYSBsb3cgYmF0dGVyeSBzaXR1YXRpb24gYW5kIHdhaXQgZm9yIGl0IHRvCisjIGNoYXJnZSBhZ2Fpbi4KKworCitDT1VOVD0xMDAKK1JPT1Q9JChjZCBgZGlybmFtZSAkMGAgJiYgcHdkKQorQURCPSIkUk9PVC90b29scy9hZGIiCitGQVNUQk9PVD0iJFJPT1QvdG9vbHMvZmFzdGJvb3QiCitNRVZFTlRTPTIwMAorTk9NT05LRVk9MAorCitidWlsZGZpbGU9JycKK2RldmljZT0nJworcHJvZHVjdD0nJworYm9vdHBhcnQ9JycKK2Jvb3RmaWxlPScnCisKK3doaWxlIGdldG9wdHMgImQ6aTo6bTp4aCIgb3B0aW9uTmFtZTsgZG8KKyAgY2FzZSAiJG9wdGlvbk5hbWUiIGluCisgICAgZCkgZGV2aWNlPSIkT1BUQVJHIjs7CisgICAgaSkgQ09VTlQ9JE9QVEFSRzs7CisgICAgbSkgTUVWRU5UUz0kT1BUQVJHOzsKKyAgICB4KSBOT01PTktFWT0xOzsKKyAgICBoKSBlY2hvICJvcHRpb25zOiBbLWQgPGRldmljZSBJRD4sIC1pIDxsb29wIGNvdW50PiwgLW0gPG1vbmtleSBldmVudHM+IC14IChza2lwcyBtb25rZXkpXSI7IGV4aXQ7OworICAgICopIGVjaG8gImludmFsaWQgcGFyYW1ldGVyIC0kb3B0aW9uTmFtZSI7IGV4aXQgLTE7OworICBlc2FjCitkb25lCisKK2RlY2xhcmUgLXIgQ09VTlQKK2RlY2xhcmUgLXIgTUVWRU5UUworZGVjbGFyZSAtciBOT01PTktFWQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQcmludHMgb3V0cHV0IHRvIGNvbnNvbGUgd2l0aCB0aW1lIHN0YW1wCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitsb2dfcHJpbnQoKQoreworICBpZiBbIC16ICIkMSIgXTsgdGhlbgorICAgIGVjaG8gIiMgJChkYXRlICsnJUQgJVQnKSIKKyAgZWxzZQorICAgIGVjaG8gIiMgJChkYXRlICsnJUQgJVQnKTogJDEiCisgIGZpCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBCbG9ja3MgdW50aWwgYmF0dGVyeSBsZXZlbCBpcyBhdCBsZWFzdAorIyBhYm92ZSBUQVJHRVQgaWYgYmVsb3cgTElNSVQKKyMgR2xvYmFsczoKKyMgICBBREIKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3dhaXRfZm9yX2JhdHRlcnkoKQoreworICBUQVJHRVQ9ODAKKyAgTElNSVQ9MjAKKyAgbG9jYWwgYmF0dGVyeQorICBsb2NhbCB0aWNrCisgIGxvZ19wcmludCAiY2hlY2tpbmcgYmF0dGVyeSBsZXZlbCIKKyAgd2hpbGUgWyAiJGJhdHRlcnkiID0gIiIgXTsgZG8KKyAgICBiYXR0ZXJ5PWAkQURCIC1zICRkZXZpY2Ugc2hlbGwgZHVtcHN5cyBiYXR0ZXJ5IHwgdHIgLWQgJ1xyJyB8IGF3ayAnL2xldmVsOi8ge3ByaW50ICQyfSdgCisgICAgc2xlZXAgMgorICBkb25lCisgIGlmIFsgJGJhdHRlcnkgLWx0ICRMSU1JVCBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJCYXR0ZXJ5IGlzIGxvdywgd2FpdGluZyBmb3IgY2hhcmdlIgorICAgIHdoaWxlIHRydWU7IGRvCisgICAgICBiYXR0ZXJ5PWAkQURCIC1zICRkZXZpY2Ugc2hlbGwgZHVtcHN5cyBiYXR0ZXJ5IHwgdHIgLWQgJ1xyJyB8IGF3ayAnL2xldmVsOi8ge3ByaW50ICQyfSdgCisgICAgICBpZiAoKCAkYmF0dGVyeSA+PSAkVEFSR0VUICkpOyB0aGVuIGJyZWFrOyBmaQorICAgICAgdGljaz0kWyRUQVJHRVQgLSAkYmF0dGVyeV0KKyAgICAgIGVjaG8gImJhdHRlcnkgY2hhcmdlIGxldmVsIGlzICRiYXR0ZXJ5LCBzbGVlcGluZyBmb3IgJHRpY2sgc2Vjb25kcyIKKyAgICAgIHNsZWVwICRbJFRBUkdFVCAtICRiYXR0ZXJ5ICogMTBdCisgICAgZG9uZQorICAgIGxvZ19wcmludCAicmVzdW1pbmcgdGVzdCBydW4gd2l0aCBiYXR0ZXJ5IGxldmVsIGF0ICRiYXR0ZXJ5JSIKKyAgZWxzZQorICAgIGxvZ19wcmludCAicmVzdW1pbmcgdGVzdCBydW4gd2l0aCBiYXR0ZXJ5IGxldmVsIGF0ICRiYXR0ZXJ5JSIKKyAgZmkKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJsb2NrcyB1bnRpbCBkZXZpY2UgaXMgaW4gZmFzdGJvb3QgbW9kZSBvcgorIyB0aW1lIG91dCBpcyByZWFjaGVkCisjIEdsb2JhbHM6CisjICAgbG9vcAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmFzdGJvb3Rfd2FpdF9mb3JfZGV2aWNlKCkKK3sKKyAgbG9jYWwgZmRldmljZT0iIgorICBsb2NhbCBuPTAKKyAgd2hpbGUgWyAiJGRldmljZSIgIT0gIiRmZGV2aWNlIiAtYSAkbiAtbGUgMzAgXTsgZG8KKyAgICBzbGVlcCA2CisgICAgZmRldmljZT1gJEZBU1RCT09UIGRldmljZXMgfCBzZWQgLW4gInMvXCgkZGV2aWNlXCkuKi9cMS8gcCJgCisgICAgbGV0IG4rPTEKKyAgZG9uZQorICBpZiBbICRuIC1ndCAzMCBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJkZXZpY2UgdGltZSBvdXQgYWZ0ZXIgJGxvb3AgaXRlcmF0aW9ucyIKKyAgICBleGl0CisgIGVsc2UKKyAgICBsb2dfcHJpbnQgImRldmljZSByZXR1cm5lZCBhbmQgYXZhaWxhYmxlIgorICBmaQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcmVib290cyBkZXZpY2UgaW50byBmYXN0Ym9vdCBtb2RlIG9yCisjIHRpbWUgb3V0IGlzIHJlYWNoZWQKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBBREIKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3JlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fYWRiKCkKK3sKKyAgbG9nX3ByaW50ICJyZWJvb3RpbmcgaW50byBib290bG9hZGVyIGFuZCB3YWl0aW5nIGZvciBhdmFpbGFiaWxpdHkgdmlhIGZhc3Rib290IgorICAkQURCIC1zICRkZXZpY2UgcmVib290IGJvb3Rsb2FkZXIKKyAgZmFzdGJvb3Rfd2FpdF9mb3JfZGV2aWNlCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyByZWJvb3RzIGRldmljZSBpbnRvIGZhc3Rib290IG1vZGUgb3IKKyMgdGltZXMgb3V0CisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgRkFTVEJPT1QKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3JlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QoKQoreworICBsb2dfcHJpbnQgInJlYm9vdGluZyBpbnRvIGJvb3Rsb2FkZXIgYW5kIHdhaXRpbmcgZm9yIGF2YWlsYWJpbGl0eSB2aWEgZmFzdGJvb3QiCisgICRGQVNUQk9PVCAtcyAkZGV2aWNlIHJlYm9vdC1ib290bG9hZGVyCisgIGZhc3Rib290X3dhaXRfZm9yX2RldmljZQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcmVib290cyBkZXZpY2UgZnJvbSBmYXN0Ym9vdCB0byBhZGIgb3IKKyMgdGltZXMgb3V0CisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgRkFTVEJPT1QKKyMgICBBREIKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3JlYm9vdF9pbnRvX2FkYl9mcm9tX2Zhc3Rib290KCkKK3sKKyAgbG9nX3ByaW50ICJyZWJvb3RpbmcgYW5kIHdhaXRpbmcgZm9yIGF2YWlsYWJpbGl0eSB2aWEgYWRiIgorICAkRkFTVEJPT1QgLXMgJGRldmljZSByZWJvb3QKKyAgJEFEQiAtcyAkZGV2aWNlIHdhaXQtZm9yLWRldmljZQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcmVib290cyBkZXZpY2UgZnJvbSBmYXN0Ym9vdCB0byBhZGIgb3IKKyMgdGltZXMgb3V0CisjIEdsb2JhbHM6CisjICAgZGV2aWNlCisjICAgQURCCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCit3YWl0X2Zvcl9ib290X2NvbXBsZXRlKCkKK3sKKyAgbG9nX3ByaW50ICJ3YWl0aW5nIGZvciBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmciCisgIGxvY2FsIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBnZXRwcm9wIGRldi5ib290Y29tcGxldGUpCisgIGxvY2FsIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjE6MX0KKyAgZWNobyAtbiAiLiIKKyAgd2hpbGUgWyAteiAkcmVzdWx0X3Rlc3QgXTsgZG8KKyAgICBzbGVlcCAxCisgICAgZWNobyAtbiAiLiIKKyAgICByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgZ2V0cHJvcCBkZXYuYm9vdGNvbXBsZXRlKQorICAgIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjA6MX0KKyAgZG9uZQorICBsb2dfcHJpbnQgImZpbmlzaGVkIGJvb3RpbmciCit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmYXN0Ym9vdCBmbGFzaGVzIHBhcnRpdGlvbgorIworIyBHbG9iYWxzOgorIyAgIGRldmljZQorIyAgIEZBU1RCT09UCisjIEFyZ3VtZW50czoKKyMgICBjb21tYW5kX25hbWUKKyMgICBjb21tYW5kX3BhcmFtZXRlcnMKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2Zhc3Rib290X2NvbW1hbmQoKQoreworICAkRkFTVEJPT1QgLXMgJGRldmljZSAkMSAkMiAkMworICBzbGVlcCA1Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmYXN0Ym9vdCBjb21tYW5kIHdyYXBwZXIKKyMKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBGQVNUQk9PVAorIyBBcmd1bWVudHM6CisjICAgcGFydGl0aW9uX25hbWUKKyMgICBmaWxlX25hbWUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX3BhcnRpdGlvbigpCit7CisgICRGQVNUQk9PVCAtcyAkZGV2aWNlIGZsYXNoICQxICQyCisgIHNsZWVwIDUKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGFkYiBjb21tYW5kIHdyYXBwZXIKKyMKKyMgR2xvYmFsczoKKyMgICBkZXZpY2UKKyMgICBBREIKKyMgQXJndW1lbnRzOgorIyAgIGNvbW1hbmRfbmFtZQorIyAgIGNvbW1hbmRfcGFyYW1ldGVycworIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworYWRiX2NvbW1hbmQoKQoreworICAkQURCIC1zICRkZXZpY2UgJDEgJDIgJDMgJDQgJDUKKyAgc2xlZXAgNQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc2V0cyB0aGUgbmFtZSBvZiB0aGUgYm9vdCBwYXJ0aXRpb24gYW5kCisjIGJvb3RmaWxlLCB0aGVuIGZsYXNoZXMgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBib290bG9hZGVyZmlsZQorIyAgIGJvb3RwYXJ0CisjICAgZGV2aWNlCisjIEFyZ3VtZW50czoKKyMgICBOb25lCisjIFJldHVybnM6CisjICAgTm9uZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmbGFzaF9ib290bG9hZGVyX2ltYWdlKCkKK3sKKyAgaWYgWyAiJGJvb3RwYXJ0IiA9PSAnJyBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJib290cGFydCBub3QgZGVmaW5lZCIKKyAgICBleGl0CisgIGZpCisgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBib290bG9hZGVyIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIGJvb3Rsb2FkZXJmaWxlPWBscyAtMSAkUk9PVC8kcHJvZHVjdCB8IHNlZCAtbiAncy9cKC4qYm9vdFswLTkuX11cK2ltZ1wpL1wxLyBwJ2AKKyAgICBpZiBbICIkYm9vdGxvYWRlcmZpbGUiID09ICcnIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAiYm9vdGxvYWRlciBmaWxlIGVtcHR5OiAkYm9vdGxvYWRlcmZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIGFzIHRoZSBib290bG9hZGVyIGltYWdlIGZpbGUiCisgIGZpCisgIGxvZ19wcmludCAiZG93bmxvYWRpbmcgYm9vdGxvYWRlciBpbWFnZSB0byAkZGV2aWNlIgorICBmbGFzaF9wYXJ0aXRpb24gJGJvb3RwYXJ0ICRST09ULyRwcm9kdWN0LyRib290bG9hZGVyZmlsZQorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSByYWRpbyBwYXJ0aXRpb24gYW5kCisjIHJhZGlvZmlsZSBhbmQgZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIHJhZGlvZmlsZQorIyAgIHJhZGlvcGFydAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfcmFkaW9faW1hZ2UoKQoreworICBpZiBbICIkcmFkaW9wYXJ0IiA9PSAnJyBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJzZXR0aW5nIHJhZGlvIHBhcnRpb24gdG8gJ3JhZGlvJyIKKyAgICByYWRpb3BhcnQ9J3JhZGlvJworICBmaQorICBpZiBbICIkcmFkaW9maWxlIiA9PSAiIiBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIHJhZGlvIGZpbGUgZm9yICRwcm9kdWN0IgorICAgIHJhZGlvZmlsZT1gbHMgLTEgJFJPT1QvJHByb2R1Y3QgfCBzZWQgLW4gJ3MvXChyYWRpb1swLTkuX0EtWmEtel1cK2ltZ1wpL1wxLyBwJ2AKKyAgICBpZiBbICIkcmFkaW9maWxlIiA9PSAiIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgInJhZGlvIGZpbGUgZW1wdHk6ICRyYWRpb2ZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0LyRyYWRpb2ZpbGUiIF07IHRoZW4KKyAgICAgIGxvZ19wcmludCAicmFkaW8gZmlsZSBub3QgZm91bmQ6IC4vJHByb2R1Y3QvJHJhZGlvZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGxvZ19wcmludCAidXNpbmcgJFJPT1QvJHByb2R1Y3QvJHJhZGlvZmlsZSBhcyB0aGUgcmFkaW8gaW1hZ2UgZmlsZSIKKyAgZmkKKyAgbG9nX3ByaW50ICJkb3dubG9hZGluZyByYWRpbyBpbWFnZSB0byAkZGV2aWNlIgorICBmbGFzaF9wYXJ0aXRpb24gJHJhZGlvcGFydCAgJFJPT1QvJHByb2R1Y3QvJHJhZGlvZmlsZQorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSBib290IHBhcnRpdGlvbiBhbmQKKyMgYm9vdGZpbGUKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIGJ1aWxkZmlsZQorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfc3lzdGVtX2ltYWdlKCkKK3sKKyAgaWYgWyAiJGJ1aWxkZmlsZSIgPT0gIiIgXTsgdGhlbgorICAgIGxvZ19wcmludCAiZ2V0dGluZyBidWlsZCBmaWxlIGZvciAkcHJvZHVjdCIKKyAgICBidWlsZGZpbGU9YFxscyAtMSAkUk9PVC8kcHJvZHVjdCAyPiYxIHwgc2VkIC1uICdzL1woW2Etel1cKy1pbWctWzAtOV1cKy56aXBcKS9cMS8gcCdgCisgICAgaWYgWyAiJGJ1aWxkZmlsZSIgPT0gIiIgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJidWlsZCBmaWxlIGVtcHR5OiAkYnVpbGRmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgaWYgWyAhIC1lICIkUk9PVC8kcHJvZHVjdC8kYnVpbGRmaWxlIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJ1aWxkIGZpbGUgbm90IGZvdW5kOiAuLyRwcm9kdWN0LyRidWlsZGZpbGUiCisgICAgICBleGl0CisgICAgZmkKKyAgICBsb2dfcHJpbnQgInVzaW5nICRST09ULyRwcm9kdWN0LyRidWlsZGZpbGUgYXMgdGhlIHN5c3RlbSBpbWFnZSBmaWxlIgorICBmaQorICBsb2dfcHJpbnQgImRvd25sb2FkaW5nIHN5c3RlbSBpbWFnZSB0byAkZGV2aWNlIgorICBmYXN0Ym9vdF9jb21tYW5kIHVwZGF0ZSAkUk9PVC8kcHJvZHVjdC8kYnVpbGRmaWxlCisKK30KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBmbGFzaGVzIHRoZSB1c2VyZGF0YSBwYXJ0aXRpb24KKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmxhc2hfdXNlcmRhdGFfaW1hZ2UoKQoreworICBsb2dfcHJpbnQgImZsYXNoaW5nIHVzZXJkYXRhLi4uIgorICBpZiBbIC1lICRST09ULyRwcm9kdWN0L3VzZXJkYXRhLmltZyBdO3RoZW4KKyAgICBmbGFzaF9wYXJ0aXRpb24gdXNlcmRhdGEgJFJPT1QvJHByb2R1Y3QvdXNlcmRhdGEuaW1nCisgIGVsc2UKKyAgICBsb2dfcHJpbnQgInVzZXJkYXRhLmltZyBmaWxlIG5vdCBmb3VuZDogJFJPT1QvJHByb2R1Y3QvdXNlcmRhdGEuaW1nIgorICAgIGV4aXQKKyAgZmkKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmxhc2hlcyB0aGUgZGV2aWNlCisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBGQVNUQk9PVAorIyAgIGJvb3RmaWxlCisjICAgYm9vdHBhcnQKKyMgICByYWRpb2ZpbGUKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX2RldmljZSgpCit7CisgIGxvZ19wcmludCAiZXJhc2luZyBjYWNoZS4uLiIKKyAgZmFzdGJvb3RfY29tbWFuZCBlcmFzZSBjYWNoZQorICBmbGFzaF91c2VyZGF0YV9pbWFnZQorICBmbGFzaF9ib290bG9hZGVyX2ltYWdlCisgIGZsYXNoX3JhZGlvX2ltYWdlCisgIGZsYXNoX3N5c3RlbV9pbWFnZQorICAjZGV2aWNlIGhhcyBiZWVuIHJlYm9vdGVkCisgIGFkYl9jb21tYW5kIHdhaXQtZm9yLWRldmljZQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZ2V0cyB0aGUgZGV2aWNlIHByb2R1Y3QgdHlwZSBhbmQgc2V0cyBwcm9kdWN0CisjCisjIEdsb2JhbHM6CisjICAgcHJvZHVjdAorIyAgIFJPT1QKKyMgICBGQVNUQk9PVAorIyAgIGRldmljZQorIyBBcmd1bWVudHM6CisjICAgTm9uZQorIyBSZXR1cm5zOgorIyAgIE5vbmUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc2V0X3Byb2R1Y3RfdHlwZSgpCit7CisgIGlmIFsgIiRwcm9kdWN0IiA9PSAiIiBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIGRldmljZSBwcm9kdWN0IHR5cGUiCisgICAgcHJvZHVjdD1gJEZBU1RCT09UIC1zICRkZXZpY2UgZ2V0dmFyIHByb2R1Y3QgMj4mMSB8IHNlZCAtbiAncy9wcm9kdWN0OiBcKFthLXpdKlwpXG4qL1wxLyBwJ2AKKyAgICBpZiBbICEgLWUgIiRST09ULyRwcm9kdWN0IiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImRldmljZSBwcm9kdWN0IGlkIG5vdCBzdXBwb3J0ZWQ6ICRwcm9kdWN0IgorICAgICAgZXhpdAorICAgIGZpCisgIGZpCisgIGxvZ19wcmludCAidXNpbmcgJHByb2R1Y3QgYXMgZGV2aWNlIHByb2R1Y3QgaWQiCit9CisKKworCisjc3RhcnQgb2Ygc2NyaXB0CisjdGVzdCBmb3IgZGVwZW5kZW5jaWVzCitpZiBbICEgLWUgJEFEQiBdOyB0aGVuCisgIGVjaG8gIkVycm9yOiBhZGIgbm90IGluIHBhdGghIFBsZWFzZSBjb3JyZWN0IHRoaXMuIgorICBleGl0CitmaQoraWYgWyAhIC1lICRGQVNUQk9PVCBdOyB0aGVuCisgIGVjaG8gIkVycm9yOiBmYXN0Ym9vdCBub3QgaW4gcGF0aCEgUGxlYXNlIGNvcnJlY3QgdGhpcy4iCisgIGV4aXQKK2ZpCisjY2hlY2tzIHRvIHNlZSBpZiB0aGUgY2FsbGVkIGRldmljZSBpcyBhdmFpbGFibGUKK2lmIFsgIiRkZXZpY2UiICE9ICIiIF07IHRoZW4KKyAgdG1wZGV2aWNlPWAkQURCIGRldmljZXMgfCBzZWQgLW4gInMvXCgkZGV2aWNlXCkuKi9cMS8gcCJgCisgIGlmIFsgIiRkZXZpY2UiICE9ICIkdG1wZGV2aWNlIiBdOyB0aGVuCisgICAgICB0bXBkZXZpY2U9YCRGQVNUQk9PVCBkZXZpY2VzIHwgc2VkIC1uICJzL1woJGRldmljZVwpLiovXDEvIHAiYAorICAgIGlmIFsgIiRkZXZpY2UiICE9ICIkdG1wZGV2aWNlIiBdOyB0aGVuCisgICAgICBlY2hvICJXYXJuaW5nOiBkZXZpY2Ugbm90IGZvdW5kLi4uICRkZXZpY2UiCisgICAgICBleGl0CisgICAgZWxzZQorICAgICAgZWNobyAiJ0RldmljZSAnJGRldmljZScgZm91bmQhJyIKKyAgICAgIHJlYm9vdF9pbnRvX2FkYl9mcm9tX2Zhc3Rib290CisgICAgICB3YWl0X2Zvcl9ib290X2NvbXBsZXRlCisgICAgZmkKKyAgZmkKK2Vsc2UKKyAgZGV2aWNlPWAkQURCIGRldmljZXMgfCBzZWQgLW4gJ3MvLipcKF5bMC05QS1aXVx7Mlx9WzAtOUEtWl0qXCkuKi9cMS8gcCdgCisgIGlmIFsgYGVjaG8gJGRldmljZSB8IHdjIC13YCAtbmUgMSBdOyB0aGVuCisgICAgZWNobyAnVGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBkZXZpY2UgZm91bmQsJworICAgIGVjaG8gJ3BsZWFzZSBwYXNzIHRoZSBjb3JyZWN0IGRldmljZSBJRCBpbiBhcyBhIHBhcmFtZXRlci4nCisgICAgZXhpdAorICBmaQorZmkKK2lmIFsgIiRkZXZpY2UiID09ICIiIF07IHRoZW4KKyAgZWNobyAnRGV2aWNlIG5vdCBmb3VuZCB2aWEgYWRiJworICBkZXZpY2U9YCRGQVNUQk9PVCBkZXZpY2VzIHwgc2VkIC1uICdzLy4qXCheWzAtOUEtWl1cezJcfVswLTlBLVpdKlwpLiovXDEvIHAnYAorICBpZiBbIGBlY2hvICRkZXZpY2UgfCB3YyAtd2AgLW5lIDEgXTsgdGhlbgorICAgIGVjaG8gIlRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgZGV2aWNlIGF2YWlsYWJsZSwiCisgICAgZWNobyAicGxlYXNlIHBhc3MgdGhlIGNvcnJlY3QgZGV2aWNlIElEIGluIGFzIGEgcGFyYW1ldGVyLiIKKyAgICBleGl0CisgIGZpCisgIGlmIFsgIiRkZXZpY2UiID09ICIiIF07IHRoZW4KKyAgICBlY2hvICdEZXZpY2Ugbm90IGZvdW5kIHZpYSBmYXN0Ym9vdCwgcGxlYXNlIGludmVzdGlnYXRlJworICAgIGV4aXQKKyAgZWxzZQorICAgIGVjaG8gJ0RldmljZSAnJGRldmljZScgZm91bmQhJworICAgIHJlYm9vdF9pbnRvX2FkYl9mcm9tX2Zhc3Rib290CisgICAgd2FpdF9mb3JfYm9vdF9jb21wbGV0ZQorICAgIGVjaG8gJ0hhbW1lcmluZyBvbiAnJGRldmljZQorICBmaQorZWxzZQorICBlY2hvICdIYW1tZXJpbmcgb24gJyRkZXZpY2UKK2ZpCityZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2FkYgorc2V0X3Byb2R1Y3RfdHlwZQorcmVib290X2ludG9fYWRiX2Zyb21fZmFzdGJvb3QKK3dhaXRfZm9yX2Jvb3RfY29tcGxldGUKKworI2NoZWNrIGZvciBhdmFpbGFiaWxpdHkgb2YgYSBjdXN0b20gZmxhc2ggaW5mbyBmaWxlIGFuZCByZXRyZWl2ZSBpdAoraWYgWyAtZSAiJFJPT1QvJHByb2R1Y3QvY3VzdG9tX2ZsYXNoLnNoIiBdOyB0aGVuCisgIC4gJFJPT1QvJHByb2R1Y3QvY3VzdG9tX2ZsYXNoLnNoCitmaQorZWNobyAkJ1xuXG4nCisKKyNzdGFydCBvZiBsb29waW5nCitmb3IgKChsb29wPTEgOyBsb29wIDw9ICRDT1VOVCA7IGxvb3ArKyApKSA7IGRvCisgIGVjaG8gIiIKKyAgZWNobyAiIgorICBlY2hvIF9fX19fX19fX19fX19fX18gJChkYXRlICsnJUQgJVQnKSAtICRsb29wIC0gJGRldmljZSBfX19fX19fX19fX19fX19fX19fX19fCisKKyAgbG9nX3ByaW50ICJzZXR0aW5nIGFkYiByb290IGFuZCBzbGVlcGluZyBmb3IgNyBzZWNvbmRzIgorICBhZGJfY29tbWFuZCByb290CisgIHdhaXRfZm9yX2JhdHRlcnkKKyAgbG9nX3ByaW50ICJyZWJvb3RpbmcgaW50byBib290bG9hZGVyIGFuZCB3YWl0aW5nIGZvciBhdmFpbGFiaWxpdHkgdmlhIGZhc3Rib290IgorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2FkYgorICAjIG5vdCBuZWNlc3NhcnksIGJ1dCB1c2VmdWwgaW4gdGVzdGluZworICBsb2dfcHJpbnQgInVzaW5nIGZhc3Rib290IHRvIHJlYm9vdCB0byBib290bG9hZGVyIGZvciB0ZXN0IHB1cnBvc2VzIgorICByZWJvb3RfaW50b19mYXN0Ym9vdF9mcm9tX2Zhc3Rib290CisKKyAgI2ZsYXNoaW5nIHRoZSBkZXZpY2UKKyAgZmxhc2hfZGV2aWNlCisKKyAgI3ByZXBpbmcgZGV2aWNlIGZvciBtb25rZXkgcnVuCisgIGxvZ19wcmludCAic2V0dGluZyBhZGIgcm9vdCIKKyAgYWRiX2NvbW1hbmQgcm9vdAorICBsb2dfcHJpbnQgInNldHRpbmcgcm8ubW9ua2V5IHByb3BlcnR5IgorICBhZGJfY29tbWFuZCBzaGVsbCBzZXRwcm9wIHJvLm1vbmtleSAxCisKKyAgbG9nX3ByaW50ICJ3YWl0aW5nIGZvciBkZXZpY2UgdG8gZmluaXNoIGJvb3RpbmciCisgIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBnZXRwcm9wIGRldi5ib290Y29tcGxldGUpCisgIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjE6MX0KKyAgZWNobyAtbiAiLiIKKyAgd2hpbGUgWyAteiAkcmVzdWx0X3Rlc3QgXTsgZG8KKyAgICBzbGVlcCAxCisgICAgZWNobyAtbiAiLiIKKyAgICByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgZ2V0cHJvcCBkZXYuYm9vdGNvbXBsZXRlKQorICAgIHJlc3VsdF90ZXN0PSR7cmVzdWx0OjA6MX0KKyAgZG9uZQorCisgIGxvZ19wcmludCAiZmluaXNoZWQgYm9vdGluZyIKKyAgbG9nX3ByaW50ICJ3YWl0aW5nIGZvciB0aGUgUGFja2FnZSBNYW5hZ2VyIgorICByZXN1bHQ9JCgkQURCIC1zICRkZXZpY2Ugc2hlbGwgcG0gcGF0aCBhbmRyb2lkKQorICByZXN1bHRfdGVzdD0ke3Jlc3VsdDowOjd9CisgIGVjaG8gLW4gIi4iCisgIHdoaWxlIFsgJHJlc3VsdF90ZXN0ICE9ICJwYWNrYWdlIiBdOyBkbworICAgIHNsZWVwIDEKKyAgICBlY2hvIC1uICIuIgorICAgIHJlc3VsdD0kKCRBREIgLXMgJGRldmljZSBzaGVsbCBwbSBwYXRoIGFuZHJvaWQpCisgICAgcmVzdWx0X3Rlc3Q9JHtyZXN1bHQ6MDo3fQorICBkb25lCisgIGVjaG8gIlBhY2thZ2UgTWFuYWdlciBhdmFpbGFibGUiCisKKyAgI2xldHMgeW91IHNlZSB3aGF0J3MgZ29pbmcgb24KKyAgbG9nX3ByaW50ICJzZXR0aW5nIHNoZWxsIHN2YyBwb3dlciBzdGF5b24gdHJ1ZSIKKyAgYWRiX2NvbW1hbmQgc2hlbGwgc3ZjIHBvd2VyIHN0YXlvbiB0cnVlCisKKyAgI2NhbGxzIHRoZSBtb25rZXkgcnVuIGlmIG5vdCBza2lwcGVkCisgIGlmIFsgJE5PTU9OS0VZID09IDAgXTsgdGhlbgorICAgIHNlZWQ9JCgoJChkYXRlICslcykgJSA5OSkpCisgICAgbG9nX3ByaW50ICJydW5uaW5nIHNob3J0IG1vbmtleSBydW4uLi4iCisgICAgJEFEQiAtcyAkZGV2aWNlIHNoZWxsIG1vbmtleSAtcCBjb20uYW5kcm9pZC5hbGFybWNsb2NrIC1wIGNvbS5hbmRyb2lkLmJyb3dzZXIgLXAgY29tLmFuZHJvaWQuY2FsY3VsYXRvcjIgLXAgY29tLmFuZHJvaWQuY2FsZW5kYXIgLXAgY29tLmFuZHJvaWQuY2FtZXJhIC1wIGNvbS5hbmRyb2lkLmNvbnRhY3RzIC1wIGNvbS5nb29nbGUuYW5kcm9pZC5nbSAtcCBjb20uYW5kcm9pZC5pbSAtcCBjb20uYW5kcm9pZC5sYXVuY2hlciAtcCBjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5tYXBzIC1wIGNvbS5hbmRyb2lkLm1tcyAtcCBjb20uYW5kcm9pZC5tdXNpYyAtcCBjb20uYW5kcm9pZC5waG9uZSAtcCBjb20uYW5kcm9pZC5zZXR0aW5ncyAtcCBjb20uZ29vZ2xlLmFuZHJvaWQuc3RyZWV0IC1wIGNvbS5hbmRyb2lkLnZlbmRpbmcgLXAgY29tLmdvb2dsZS5hbmRyb2lkLnlvdXR1YmUgLXAgY29tLmFuZHJvaWQuZW1haWwgLXAgY29tLmdvb2dsZS5hbmRyb2lkLnZvaWNlc2VhcmNoICAtYyBhbmRyb2lkLmludGVudC5jYXRlZ29yeS5MQVVOQ0hFUiAgLS1pZ25vcmUtc2VjdXJpdHktZXhjZXB0aW9ucyAgLXMgJHNlZWQgJE1FVkVOVFMKKyAgICBsb2dfcHJpbnQgImZpbmlzaGVkIHJ1bm5pbmcgbW9ua2V5LCByaW5zZSwgcmVwZWF0Li4uIgorICBlbHNlCisgICAgbG9nX3ByaW50ICIteCBwYXJhbWV0ZXIgdXNlZCwgc2tpcHBpbmcgdGhlIG1vbmtleSBydW4iCisgIGZpCisKKyAgaWYgWyAkbG9vcCAtZXEgJENPVU5UIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgImRldmljZSAkZGV2aWNlIGhhcyByZXR1cm5lZCwgdGVzdGluZyBjb21wbGV0ZWQsIGNvdW50ID0gJGxvb3AiCisgICAgZWNobyBgZWNobyAiRGV2aWNlICRkZXZpY2UgaGFzIHJldHVybmVkLCB0ZXN0aW5nIGNvbXBsZXRlZCwgY291bnQgPSAkbG9vcC4iID4gJFJPT1QvJGRldmljZS5sb2dgCisgIGVsc2UKKyAgICBsb2dfcHJpbnQgImRldmljZSAkZGV2aWNlIGhhcyByZXR1cm5lZCwgcmluc2UgYW5kIHJlcGVhdCBjb3VudCA9ICRsb29wIgorICAgIGVjaG8gYGVjaG8gIkRldmljZSAkZGV2aWNlIGhhcyByZXR1cm5lZCwgcmluc2UgYW5kIHJlcGVhdCBjb3VudCA9ICRsb29wLiIgPiAkUk9PVC8kZGV2aWNlLmxvZ2AKKyAgZmkKK2RvbmUKZGlmZiAtLWdpdCBhL3Rvb2xzL2xhYnByZXRlc3QvbmV4dXNvbmUvY3VzdG9tX2ZsYXNoLnNoIGIvdG9vbHMvbGFicHJldGVzdC9uZXh1c29uZS9jdXN0b21fZmxhc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ZDZmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xhYnByZXRlc3QvbmV4dXNvbmUvY3VzdG9tX2ZsYXNoLnNoCkBAIC0wLDAgKzEsOCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQXV0aG9yOiBiZ2F5QGdvb2dsZS5jb20gKEJydWNlIEdheSkKKyMKKyMgdXNlZCBmb3IgZmxhc2hpbmcgYm9vdCBpbWFnZSBvbiBuZXh1c29uZQorCitib290cGFydD0naGJvb3QnCmRpZmYgLS1naXQgYS90b29scy9sYWJwcmV0ZXN0L3Nob2xlcy9jdXN0b21fZmxhc2guc2ggYi90b29scy9sYWJwcmV0ZXN0L3Nob2xlcy9jdXN0b21fZmxhc2guc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwODIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xhYnByZXRlc3Qvc2hvbGVzL2N1c3RvbV9mbGFzaC5zaApAQCAtMCwwICsxLDUyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBBdXRob3I6IGJnYXlAZ29vZ2xlLmNvbSAoQnJ1Y2UgR2F5KQorIworIyB1c2VkIGZvciBmbGFzaGluZyBib290bG9hZGVyIGltYWdlIG9uIHNob2xlcworCitCT09UUEFSVD0nbW90b2Jvb3QnCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzZXRzIHRoZSBuYW1lIG9mIHRoZSBib290IHBhcnRpdGlvbiBhbmQKKyMgYm9vdGZpbGUsIHRoZW4gZmxhc2hlcyBkZXZpY2UKKyMKKyMgR2xvYmFsczoKKyMgICBwcm9kdWN0CisjICAgUk9PVAorIyAgIEJPT1RQQVJUCisjICAgYm9vdGxvYWRlcmZpbGUKKyMgICBkZXZpY2UKKyMgQXJndW1lbnRzOgorIyAgIE5vbmUKKyMgUmV0dXJuczoKKyMgICBOb25lCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZsYXNoX2Jvb3Rsb2FkZXJfaW1hZ2UoKQoreworICBpZiBbICRwcm9kdWN0ICE9ICJzaG9sZXMiIF07IHRoZW4KKyAgICBsb2dfcHJpbnQgIldyb25nIGRldmljZSB0eXBlLCBleHBlY3RlZCBzaG9sZXMhIgorICAgIGV4aXQKKyAgZmkKKyAgaWYgWyAiJGJvb3Rsb2FkZXJmaWxlIiA9PSAnJyBdOyB0aGVuCisgICAgbG9nX3ByaW50ICJnZXR0aW5nIGJvb3Rsb2FkZXIgZmlsZSBmb3IgJHByb2R1Y3QiCisgICAgc2VjdXJlPWAkZmFzdGJvb3QgLXMgJGRldmljZSBnZXR2YXIgc2VjdXJlIDI+JjEgfCBzZWQgLW4gJ3Mvc2VjdXJlOiBcKFthLXpdKlwpXG4qL1wxLyBwJ2AKKyAgICBpZiBbICIkc2VjdXJlIiA9ICJubyIgXTsgdGhlbgorICAgICAgYm9vdGxvYWRlcmZpbGU9YGxzIC0xIHNob2xlcy8gfCBzZWQgLW4gJ3MvXlwobW90b2Jvb3RfdW5zZWN1cmUuWzAtOUEtWl0qLmltZ1wpXG4qL1wxLyBwJ2AKKyAgICBlbHNlCisgICAgICBib290bG9hZGVyZmlsZT1gbHMgLTEgc2hvbGVzLyB8IHNlZCAtbiAncy9eXChtb3RvYm9vdF9zZWN1cmUuWzAtOUEtWl0qLmltZ1wpXG4qL1wxLyBwJ2AKKyAgICBmaQorICAgIGlmIFsgIiRib290bG9hZGVyZmlsZSIgPT0gJycgXTsgdGhlbgorICAgICAgbG9nX3ByaW50ICJib290bG9hZGVyIGZpbGUgZW1wdHk6ICRib290bG9hZGVyZmlsZSIKKyAgICAgIGV4aXQKKyAgICBmaQorICAgIGlmIFsgISAtZSAiJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIiBdOyB0aGVuCisgICAgICBsb2dfcHJpbnQgImJvb3Rsb2FkZXIgZmlsZSBub3QgZm91bmQ6IC4vJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlIgorICAgICAgZXhpdAorICAgIGZpCisgICAgbG9nX3ByaW50ICJ1c2luZyAkUk9PVC8kcHJvZHVjdC8kYm9vdGxvYWRlcmZpbGUgYXMgdGhlIGJvb3Rsb2FkZXIgaW1hZ2UgZmlsZSIKKyAgZmkKKyAgbG9nX3ByaW50ICJkb3dubG9hZGluZyBib290bG9hZGVyIGltYWdlIHRvICRkZXZpY2UiCisgIGZsYXNoX3BhcnRpdGlvbiAkQk9PVFBBUlQgJFJPT1QvJHByb2R1Y3QvJGJvb3Rsb2FkZXJmaWxlCisgIHJlYm9vdF9pbnRvX2Zhc3Rib290X2Zyb21fZmFzdGJvb3QKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L0JpZ3JhbURpY3Rpb25hcnkuamF2YSBiL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L0JpZ3JhbURpY3Rpb25hcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTExNWJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvQmlncmFtRGljdGlvbmFyeS5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC50b29scy5kaWN0OworCitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKKy8qKgorICogSGVscGVyIGZvciBNYWtlQmluYXJ5RGljdGlvbmFyeQorICogRGVhbHMgd2l0aCBhbGwgdGhlIGJpZ3JhbSBkYXRhCisgKi8KK3B1YmxpYyBjbGFzcyBCaWdyYW1EaWN0aW9uYXJ5IHsKKworICAgIC8qCisgICAgICogTXVzdCBtYXRjaCB0aGUgdmFsdWVzIGluIHRoZSBjbGllbnQgc2lkZSB3aGljaCBpcyBsb2NhdGVkIGluIGRpY3Rpb25hcnkuY3BwICYgZGljdGlvbmFyeS5oCisgICAgICogQ2hhbmdpbmcgdGhlc2UgdmFsdWVzIHdpbGwgZ2VuZXJhdGUgdG90YWxseSBkaWZmZXJlbnQgc3RydWN0dXJlIHdoaWNoIG11c3QgYmUgYWxzbyByZWZsZWN0ZWQKKyAgICAgKiBvbiB0aGUgY2xpZW50IHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CSUdSQU1fUkVBRCA9IDB4ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CSUdSQU1fQ0hJTERFWElTVCA9IDB4NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19CSUdSQU1fQ09OVElOVUVEID0gMHg4MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTEFHX0JJR1JBTV9GUkVRID0gMHg3RjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUl9SRVZFUlNFX0xPT0tVUEFMTCA9IC05OTsKKworICAgIHB1YmxpYyBBcnJheUxpc3Q8U3RyaW5nPiBtQmlncmFtVG9GaWxsID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHVibGljIEFycmF5TGlzdDxJbnRlZ2VyPiBtQmlncmFtVG9GaWxsQWRkcmVzcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKworICAgIHB1YmxpYyBIYXNoTWFwPFN0cmluZywgQmlncmFtPiBtQmk7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBtSGFzQmlncmFtOworCisgICAgcHVibGljIEJpZ3JhbURpY3Rpb25hcnkoU3RyaW5nIGJpZ3JhbVNyY0ZpbGVuYW1lLCBib29sZWFuIGhhc0JpZ3JhbSkgeworICAgICAgICBtSGFzQmlncmFtID0gaGFzQmlncmFtOworICAgICAgICBsb2FkQmlncmFtKGJpZ3JhbVNyY0ZpbGVuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbG9hZEJpZ3JhbShTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgbUJpID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCaWdyYW0+KCk7CisgICAgICAgIGlmICghbUhhc0JpZ3JhbSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOdW1iZXIgb2YgYmlncmFtcyA9ICIgKyBCaWdyYW0uc0JpZ3JhbU51bSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgICAgICBwYXJzZXIucGFyc2UobmV3IEZpbGUoZmlsZW5hbWUpLCBuZXcgRGVmYXVsdEhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHcxID0gbnVsbDsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluV29yZDEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluV29yZDIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbnQgZnJlcSA9IDAsIGNvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgIEJpZ3JhbSB0ZW1wQmlncmFtID0gbnVsbDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHFOYW1lLmVxdWFscygiYmkiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5Xb3JkMSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB3MSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBJbnRlZ2VyLnBhcnNlSW50KGF0dHJpYnV0ZXMuZ2V0VmFsdWUoMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcEJpZ3JhbSA9IG5ldyBCaWdyYW0oY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocU5hbWUuZXF1YWxzKCJ3IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluV29yZDIgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHdvcmQyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmVxID0gSW50ZWdlci5wYXJzZUludChhdHRyaWJ1dGVzLmdldFZhbHVlKDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBCaWdyYW0uc2V0V29yZDIoY291bnRlciwgd29yZDIsIGZyZXEpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgQmlncmFtLnNCaWdyYW1OdW0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBxTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5Xb3JkMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5Xb3JkMiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluV29yZDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluV29yZDEgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CaS5wdXQodzEsIHRlbXBCaWdyYW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXhjZXB0aW9uIGluIHBhcnNpbmcgYmlncmFtXG4iICsgaW9lKTsKKyAgICAgICAgICAgIGlvZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk51bWJlciBvZiBiaWdyYW1zID0gIiArIEJpZ3JhbS5zQmlncmFtTnVtKTsKKyAgICB9CisKKyAgICBieXRlW10gd3JpdGVCaWdyYW1zKGJ5dGVbXSBkaWN0LCBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBtRGljdGlvbmFyeSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1CaWdyYW1Ub0ZpbGwuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyB3MSA9IG1CaWdyYW1Ub0ZpbGwuZ2V0KGkpOworICAgICAgICAgICAgaW50IGFkZHJlc3MgPSBtQmlncmFtVG9GaWxsQWRkcmVzcy5nZXQoaSk7CisKKyAgICAgICAgICAgIEJpZ3JhbSB0ZW1wID0gbUJpLmdldCh3MSk7CisgICAgICAgICAgICBpbnQgd29yZDJDb3VudCA9IHRlbXAuY291bnQ7CisgICAgICAgICAgICBpbnQgajQ7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHdvcmQyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgIGlmICghbURpY3Rpb25hcnkuY29udGFpbnNLZXkodGVtcC53b3JkMltqXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOb3QgaW4gZGljdGlvbmFyeTogIiArIHRlbXAud29yZDJbal0pOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBqNCA9IChqICogNCk7CisgICAgICAgICAgICAgICAgICAgIGludCBhZGRyZXNzT2ZXb3JkMiA9IG1EaWN0aW9uYXJ5LmdldCh0ZW1wLndvcmQyW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgZGljdFthZGRyZXNzICsgajQgKyAwXSA9IChieXRlKSAoKChhZGRyZXNzT2ZXb3JkMiAmIDB4M0YwMDAwKSA+PiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEZMQUdfQklHUkFNX1JFQUQpOworICAgICAgICAgICAgICAgICAgICBkaWN0W2FkZHJlc3MgKyBqNCArIDFdID0gKGJ5dGUpICgoYWRkcmVzc09mV29yZDIgJiAweDAwRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgICAgIGRpY3RbYWRkcmVzcyArIGo0ICsgMl0gPSAoYnl0ZSkgKChhZGRyZXNzT2ZXb3JkMiAmIDB4MDAwMEZGKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gKHdvcmQyQ291bnQgLSAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGljdFthZGRyZXNzICsgajQgKyAzXSA9IChieXRlKSAodGVtcC5mcmVxW2pdICYgRkxBR19CSUdSQU1fRlJFUSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWN0W2FkZHJlc3MgKyBqNCArIDNdID0gKGJ5dGUpICgodGVtcC5mcmVxW2pdICYgRkxBR19CSUdSQU1fRlJFUSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0JJR1JBTV9DT05USU5VRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRpY3Q7CisgICAgfQorCisgICAgdm9pZCByZXZlcnNlTG9va3VwQWxsKE1hcDxTdHJpbmcsIEludGVnZXI+IG1EaWN0aW9uYXJ5LCBieXRlW10gZGljdCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBzdCA9IG1EaWN0aW9uYXJ5LmtleVNldCgpOworICAgICAgICBmb3IgKFN0cmluZyBzIDogc3QpIHsKKyAgICAgICAgICAgIHNlYXJjaEZvclRlcm1pbmFsTm9kZShtRGljdGlvbmFyeS5nZXQocyksIEZPUl9SRVZFUlNFX0xPT0tVUEFMTCwgZGljdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNlYXJjaEZvclRlcm1pbmFsTm9kZShpbnQgYmlncmFtQWRkcmVzcywgaW50IGZyZXF1ZW5jeSwgYnl0ZVtdIGRpY3QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDQ4KTsKKyAgICAgICAgaW50IHBvczsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBpbnQgZm9sbG93RG93bkJyYW5jaEFkZHJlc3MgPSAyOworICAgICAgICBjaGFyIGZvbGxvd2luZ0NoYXIgPSAnICc7CisgICAgICAgIGludCBkZXB0aCA9IDA7CisgICAgICAgIGludCB0b3RhbExvb3BDb3VudCA9IDA7CisKKyAgICAgICAgd2hpbGUgKCFmb3VuZCkgeworICAgICAgICAgICAgYm9vbGVhbiBmb2xsb3dEb3duQWRkcmVzc1NlYXJjaFN0b3AgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RBZGRyZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaGF2ZVRvU2VhcmNoQWxsID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKGRlcHRoID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChmb2xsb3dpbmdDaGFyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBvcyA9IGZvbGxvd0Rvd25CcmFuY2hBZGRyZXNzOyAvLyBwb3Mgc3RhcnQgYXQgY291bnQKKyAgICAgICAgICAgIGludCBjb3VudCA9IGRpY3RbcG9zXSAmIDB4RkY7CisgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHRvdGFsTG9vcENvdW50Kys7CisgICAgICAgICAgICAgICAgLy8gcG9zIGF0IGRhdGEKKyAgICAgICAgICAgICAgICBwb3MrKzsKKyAgICAgICAgICAgICAgICAvLyBwb3Mgbm93IGF0IGZsYWcKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VCaW5hcnlEaWN0aW9uYXJ5LmdldEZpcnN0Qml0T2ZCeXRlKHBvcywgZGljdCkpIHsgLy8gbm9uLXRlcm1pbmFsCisgICAgICAgICAgICAgICAgICAgIGlmICghZm9sbG93RG93bkFkZHJlc3NTZWFyY2hTdG9wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkciA9IE1ha2VCaW5hcnlEaWN0aW9uYXJ5LmdldDIyQml0QWRkcmVzcyhwb3MsIGRpY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIgPiBiaWdyYW1BZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93RG93bkFkZHJlc3NTZWFyY2hTdG9wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QWRkcmVzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlVG9TZWFyY2hBbGwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhdmVUb1NlYXJjaEFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd0Rvd25CcmFuY2hBZGRyZXNzID0gYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmdDaGFyID0gKGNoYXIpICgweEZGICYgZGljdFtwb3MtMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpcnN0QWRkcmVzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFkZHJlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVRvU2VhcmNoQWxsID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWFrZUJpbmFyeURpY3Rpb25hcnkuZ2V0Rmlyc3RCaXRPZkJ5dGUocG9zLCBkaWN0KSkgeyAvLyB0ZXJtaW5hbAorICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCAhIQorICAgICAgICAgICAgICAgICAgICBpZiAoYmlncmFtQWRkcmVzcyA9PSAocG9zLTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpICgweEZGICYgZGljdFtwb3MtMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkcmVzcyArIGZyZXEgKDQgYnl0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKE1ha2VCaW5hcnlEaWN0aW9uYXJ5LmdldFNlY29uZEJpdE9mQnl0ZShwb3MsIGRpY3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvbGxvd0Rvd25BZGRyZXNzU2VhcmNoU3RvcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyID0gTWFrZUJpbmFyeURpY3Rpb25hcnkuZ2V0MjJCaXRBZGRyZXNzKHBvcywgZGljdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZHIgPiBiaWdyYW1BZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd0Rvd25BZGRyZXNzU2VhcmNoU3RvcCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdEFkZHJlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0QWRkcmVzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZVRvU2VhcmNoQWxsID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaGF2ZVRvU2VhcmNoQWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd0Rvd25CcmFuY2hBZGRyZXNzID0gYWRkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nQ2hhciA9IChjaGFyKSAoMHhGRiAmIGRpY3RbcG9zLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlyc3RBZGRyZXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEFkZHJlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVUb1NlYXJjaEFsbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZnJlcSBvbmx5ICgyIGJ5dGUpCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBza2lwcGluZyBiaWdyYW0KKyAgICAgICAgICAgICAgICAgICAgaW50IGJpZ3JhbUV4aXN0ID0gKGRpY3RbcG9zXSAmIEZMQUdfQklHUkFNX1JFQUQpOworICAgICAgICAgICAgICAgICAgICBpZiAoYmlncmFtRXhpc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dEJpZ3JhbUV4aXN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0QmlncmFtRXhpc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJpZ3JhbUV4aXN0ID0gKGRpY3RbcG9zKytdICYgRkxBR19CSUdSQU1fQ09OVElOVUVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgICAgIGlmIChmb2xsb3dEb3duQnJhbmNoQWRkcmVzcyA9PSAyKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFUlJPUiEhISBDYW5ub3QgZmluZCBiaWdyYW0hISIpOworICAgICAgICAgICAgICAgIFN5c3RlbS5leGl0KDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyZXF1ZW5jeSA9PSBGT1JfUkVWRVJTRV9MT09LVVBBTEwpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmV2ZXJzZTogIiArIHNiLnRvU3RyaW5nKCkgKyAiICgiICsgYmlncmFtQWRkcmVzcyArICIpIgorICAgICAgICAgICAgICAgICAgICArICIgICBMb29wOiAiICsgdG90YWxMb29wQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIgICBiaWdyYW06ICIgKyBzYi50b1N0cmluZygpICsgIiAoIiArIGJpZ3JhbUFkZHJlc3MgKyAiKSBmcmVxOiAiCisgICAgICAgICAgICAgICAgICAgICsgZnJlcXVlbmN5ICsgIiAgIExvb3A6ICIgKyB0b3RhbExvb3BDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgQmlncmFtIHsKKyAgICAgICAgU3RyaW5nW10gd29yZDI7CisgICAgICAgIGludFtdIGZyZXE7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgc3RhdGljIGludCBzQmlncmFtTnVtID0gMDsKKworICAgICAgICBTdHJpbmcgZ2V0U2Vjb25kV29yZChpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIHdvcmQyW2ldOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldEZyZXF1ZW5jeShpbnQgaSkgeworICAgICAgICAgICAgcmV0dXJuIChmcmVxW2ldID09IDApID8gMSA6IGZyZXFbaV07CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldFdvcmQyKGludCBpbmRleCwgU3RyaW5nIHdvcmQyLCBpbnQgZnJlcSkgeworICAgICAgICAgICAgdGhpcy53b3JkMltpbmRleF0gPSB3b3JkMjsKKyAgICAgICAgICAgIHRoaXMuZnJlcVtpbmRleF0gPSBmcmVxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJpZ3JhbShpbnQgd29yZDJDb3VudCkgeworICAgICAgICAgICAgY291bnQgPSB3b3JkMkNvdW50OworICAgICAgICAgICAgd29yZDIgPSBuZXcgU3RyaW5nW3dvcmQyQ291bnRdOworICAgICAgICAgICAgZnJlcSA9IG5ldyBpbnRbd29yZDJDb3VudF07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9tYWtlZGljdC9zcmMvY29tL2FuZHJvaWQvdG9vbHMvZGljdC9NYWtlQmluYXJ5RGljdGlvbmFyeS5qYXZhIGIvdG9vbHMvbWFrZWRpY3Qvc3JjL2NvbS9hbmRyb2lkL3Rvb2xzL2RpY3QvTWFrZUJpbmFyeURpY3Rpb25hcnkuamF2YQppbmRleCA3N2E2NDAxLi5jYTZkZTU2IDEwMDc1NQotLS0gYS90b29scy9tYWtlZGljdC9zcmMvY29tL2FuZHJvaWQvdG9vbHMvZGljdC9NYWtlQmluYXJ5RGljdGlvbmFyeS5qYXZhCisrKyBiL3Rvb2xzL21ha2VkaWN0L3NyYy9jb20vYW5kcm9pZC90b29scy9kaWN0L01ha2VCaW5hcnlEaWN0aW9uYXJ5LmphdmEKQEAgLTE5LDE1ICsxOSwxMSBAQAogaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7CiBpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0zNiwxMCArMzIsMTggQEAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwogCiAvKioKLSAqIENvbXByZXNzZXMgYSBsaXN0IG9mIHdvcmRzIGFuZCBmcmVxdWVuY2llcyBpbnRvIGEgdHJlZSBzdHJ1Y3R1cmVkIGJpbmFyeSBkaWN0aW9uYXJ5LgorICogQ29tcHJlc3NlcyBhIGxpc3Qgb2Ygd29yZHMsIGZyZXF1ZW5jaWVzLCBhbmQgYmlncmFtIGRhdGEKKyAqIGludG8gYSB0cmVlIHN0cnVjdHVyZWQgYmluYXJ5IGRpY3Rpb25hcnkuCisgKiBEaWN0aW9uYXJ5IFZlcnNpb246IDIwMCAobWF5IGNvbnRhaW4gYmlncmFtcykKKyAqICBWZXJzaW9uIG51bWJlciBzdGFydGVkIGZyb20gMjAwIHJhdGhlciB0aGFuIDEgYmVjYXVzZSB3ZSB3YW50ZWQgdG8gcHJldmVudCBudW1iZXIgb2Ygcm9vdHMgaW4KKyAqICBhbnkgb2xkIGRpY3Rpb25hcmllcyBiZWluZyBtaXN0YWtlbiBhcyB0aGUgdmVyc2lvbiBudW1iZXIuIFRoZXJlIGlzIG5vdCBhIGNoYW5jZSB0aGF0IHRoZXJlCisgKiAgd2lsbCBiZSBtb3JlIHRoYW4gMjAwIHJvb3RzLiBWZXJzaW9uIG51bWJlciBzaG91bGQgYmUgaW5jcmVhc2VkIHdoZW4gdGhlcmUgaXMgc3RydWN0dXJhbCBjaGFuZ2UKKyAqICBpbiB0aGUgZGF0YS4gVGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZSB0aGUgdmVyc2lvbiB3aGVuIG9ubHkgdGhlIHdvcmRzIGluIHRoZSBkYXRhIGNoYW5nZXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBNYWtlQmluYXJ5RGljdGlvbmFyeSB7CiAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSU0lPTl9OVU0gPSAyMDA7CisKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTFBIQV9TSVpFID0gMjU2OwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1dPUkQgPSAidyI7CkBAIC00OCwxMyArNTIsMjMgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxBR19BRERSRVNTX01BU0sgID0gMHg0MDAwMDA7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMQUdfVEVSTUlOQUxfTUFTSyA9IDB4ODAwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRERSRVNTX01BU0sgPSAweDNGRkZGRjsKLSAgICAKKworICAgIC8qKgorICAgICAqIFVuaXQgZm9yIHRoaXMgdmFyaWFibGUgaXMgaW4gYnl0ZXMKKyAgICAgKiBJZiBkZXN0aW5hdGlvbiBmaWxlIG5hbWUgaXMgbWFpbi5kaWN0IGFuZCBmaWxlIGxpbWl0IGNhdXNlcyBkaWN0aW9uYXJ5IHRvIGJlIHNlcGFyYXRlZCBpbnRvCisgICAgICogbXVsdGlwbGUgZmlsZSwgaXQgd2lsbCBnZW5lcmF0ZSBtYWluMC5kaWN0LCBtYWluMS5kaWN0LCBhbmQgc28gZm9ydGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHNPdXRwdXRGaWxlU2l6ZTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNTcGxpdE91dHB1dDsKKwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhck5vZGUgRU1QVFlfTk9ERSA9IG5ldyBDaGFyTm9kZSgpOwogCiAgICAgTGlzdDxDaGFyTm9kZT4gcm9vdHM7CiAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gbURpY3Rpb25hcnk7CiAgICAgaW50IG1Xb3JkQ291bnQ7Ci0gICAgCisKKyAgICBCaWdyYW1EaWN0aW9uYXJ5IGJpZ3JhbURpY3Q7CisKICAgICBzdGF0aWMgY2xhc3MgQ2hhck5vZGUgewogICAgICAgICBjaGFyIGRhdGE7CiAgICAgICAgIGludCBmcmVxOwpAQCAtNjgsMjkgKzgyLDU5IEBACiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHVzYWdlKCkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlVzYWdlOiBtYWtlZGljdCA8c3JjLnhtbD4gPGRlc3QuZGljdD4iKTsKKyAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJVc2FnZTogbWFrZWRpY3QgLXMgPHNyY19kaWN0LnhtbD4gWy1iIDxzcmNfYmlncmFtLnhtbD5dICIKKyAgICAgICAgICAgICAgICArICItZCA8ZGVzdC5kaWN0PiBbLS1zaXplIGZpbGVzaXplXSIpOwogICAgICAgICBTeXN0ZW0uZXhpdCgtMSk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMikgewotICAgICAgICAgICAgdXNhZ2UoKTsKKyAgICAgICAgaW50IGNoZWNrU291cmNlID0gLTE7CisgICAgICAgIGludCBjaGVja0JpZ3JhbSA9IC0xOworICAgICAgICBpbnQgY2hlY2tEZXN0ID0gLTE7CisgICAgICAgIGludCBjaGVja0ZpbGVTaXplID0gLTE7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrPTIpIHsKKyAgICAgICAgICAgIGlmIChhcmdzW2ldLmVxdWFscygiLXMiKSkgY2hlY2tTb3VyY2UgPSAoaSArIDEpOworICAgICAgICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKCItYiIpKSBjaGVja0JpZ3JhbSA9IChpICsgMSk7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi1kIikpIGNoZWNrRGVzdCA9IChpICsgMSk7CisgICAgICAgICAgICBpZiAoYXJnc1tpXS5lcXVhbHMoIi0tc2l6ZSIpKSBjaGVja0ZpbGVTaXplID0gKGkgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2tGaWxlU2l6ZSA+PSAwKSB7CisgICAgICAgICAgICBzU3BsaXRPdXRwdXQgPSB0cnVlOworICAgICAgICAgICAgc091dHB1dEZpbGVTaXplID0gSW50ZWdlci5wYXJzZUludChhcmdzW2NoZWNrRmlsZVNpemVdKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldyBNYWtlQmluYXJ5RGljdGlvbmFyeShhcmdzWzBdLCBhcmdzWzFdKTsKKyAgICAgICAgICAgIHNTcGxpdE91dHB1dCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChjaGVja0Rlc3QgPj0gMCAmJiAhYXJnc1tjaGVja0Rlc3RdLmVuZHNXaXRoKCIuZGljdCIpKSB7CisgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiBEaWN0aW9uYXJ5IG91dHB1dCBmaWxlIGV4dGVuc2lvbiBzaG91bGQgYmUgXCIuZGljdFwiIik7CisgICAgICAgICAgICB1c2FnZSgpOworICAgICAgICB9IGVsc2UgaWYgKGNoZWNrU291cmNlID49IDAgJiYgY2hlY2tCaWdyYW0gPj0gMCAmJiBjaGVja0Rlc3QgPj0gMCAmJgorICAgICAgICAgICAgICAgICgoIXNTcGxpdE91dHB1dCAmJiBhcmdzLmxlbmd0aCA9PSA2KSB8fCAoc1NwbGl0T3V0cHV0ICYmIGFyZ3MubGVuZ3RoID09IDgpKSkgeworICAgICAgICAgICAgbmV3IE1ha2VCaW5hcnlEaWN0aW9uYXJ5KGFyZ3NbY2hlY2tTb3VyY2VdLCBhcmdzW2NoZWNrQmlncmFtXSwgYXJnc1tjaGVja0Rlc3RdKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaGVja1NvdXJjZSA+PSAwICYmIGNoZWNrRGVzdCA+PSAwICYmCisgICAgICAgICAgICAgICAgKCghc1NwbGl0T3V0cHV0ICYmIGFyZ3MubGVuZ3RoID09IDQpIHx8IChzU3BsaXRPdXRwdXQgJiYgYXJncy5sZW5ndGggPT0gNikpKSB7CisgICAgICAgICAgICBuZXcgTWFrZUJpbmFyeURpY3Rpb25hcnkoYXJnc1tjaGVja1NvdXJjZV0sIG51bGwsIGFyZ3NbY2hlY2tEZXN0XSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2FnZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcHVibGljIE1ha2VCaW5hcnlEaWN0aW9uYXJ5KFN0cmluZyBzcmNGaWxlbmFtZSwgU3RyaW5nIGRlc3RGaWxlbmFtZSkgeworICAgIHB1YmxpYyBNYWtlQmluYXJ5RGljdGlvbmFyeShTdHJpbmcgc3JjRmlsZW5hbWUsIFN0cmluZyBiaWdyYW1TcmNGaWxlbmFtZSwgU3RyaW5nIGRlc3RGaWxlbmFtZSl7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGluZyBkaWN0aW9uYXJ5IHZlcnNpb24gIiArIFZFUlNJT05fTlVNKTsKKyAgICAgICAgYmlncmFtRGljdCA9IG5ldyBCaWdyYW1EaWN0aW9uYXJ5KGJpZ3JhbVNyY0ZpbGVuYW1lLCAoYmlncmFtU3JjRmlsZW5hbWUgIT0gbnVsbCkpOwogICAgICAgICBwb3B1bGF0ZURpY3Rpb25hcnkoc3JjRmlsZW5hbWUpOwogICAgICAgICB3cml0ZVRvRGljdChkZXN0RmlsZW5hbWUpOwotICAgICAgICAvLyBFbmFibGUgdGhlIGNvZGUgYmVsb3cgdG8gdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCB0cmVlIGlzIHRyYXZlcnNhYmxlLgorCisgICAgICAgIC8vIEVuYWJsZSB0aGUgY29kZSBiZWxvdyB0byB2ZXJpZnkgdGhhdCB0aGUgZ2VuZXJhdGVkIHRyZWUgaXMgdHJhdmVyc2FibGUKKyAgICAgICAgLy8gYW5kIGJpZ3JhbSBkYXRhIGlzIHN0b3JlZCBjb3JyZWN0bHkuCiAgICAgICAgIGlmIChmYWxzZSkgewotICAgICAgICAgICAgdHJhdmVyc2VEaWN0KDAsIG5ldyBjaGFyWzMyXSwgMCk7CisgICAgICAgICAgICBiaWdyYW1EaWN0LnJldmVyc2VMb29rdXBBbGwobURpY3Rpb25hcnksIGRpY3QpOworICAgICAgICAgICAgdHJhdmVyc2VEaWN0KDIsIG5ldyBjaGFyWzMyXSwgMCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICBwcml2YXRlIHZvaWQgcG9wdWxhdGVEaWN0aW9uYXJ5KFN0cmluZyBmaWxlbmFtZSkgewogICAgICAgICByb290cyA9IG5ldyBBcnJheUxpc3Q8Q2hhck5vZGU+KCk7CisgICAgICAgIG1EaWN0aW9uYXJ5ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKICAgICAgICAgICAgIHBhcnNlci5wYXJzZShuZXcgRmlsZShmaWxlbmFtZSksIG5ldyBEZWZhdWx0SGFuZGxlcigpIHsKQEAgLTIwNSw4ICsyNDksMTEgQEAKICAgICBwcml2YXRlIHZvaWQgYWRkQ291bnQoaW50IGNvdW50KSB7CiAgICAgICAgIGRpY3RbZGljdFNpemUrK10gPSAoYnl0ZSkgKDB4RkYgJiBjb3VudCk7CiAgICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBhZGROb2RlKENoYXJOb2RlIG5vZGUpIHsKKworICAgIHByaXZhdGUgdm9pZCBhZGROb2RlKENoYXJOb2RlIG5vZGUsIFN0cmluZyB3b3JkMSkgeworICAgICAgICBpZiAobm9kZS50ZXJtaW5hbCkgeyAvLyBzdG9yZSBhZGRyZXNzIG9mIGVhY2ggd29yZDEKKyAgICAgICAgICAgIG1EaWN0aW9uYXJ5LnB1dCh3b3JkMSwgZGljdFNpemUpOworICAgICAgICB9CiAgICAgICAgIGludCBjaGFyRGF0YSA9IDB4RkZGRiAmIG5vZGUuZGF0YTsKICAgICAgICAgaWYgKGNoYXJEYXRhID4gMjU0KSB7CiAgICAgICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gKGJ5dGUpIDI1NTsKQEAgLTIyNiw2ICsyNzMsMTUgQEAKICAgICAgICAgaWYgKG5vZGUudGVybWluYWwpIHsKICAgICAgICAgICAgIGJ5dGUgZnJlcSA9IChieXRlKSAoMHhGRiAmIG5vZGUuZnJlcSk7CiAgICAgICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gZnJlcTsKKyAgICAgICAgICAgIC8vIGJpZ3JhbQorICAgICAgICAgICAgaWYgKGJpZ3JhbURpY3QubUJpLmNvbnRhaW5zS2V5KHdvcmQxKSkgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGJpZ3JhbURpY3QubUJpLmdldCh3b3JkMSkuY291bnQ7CisgICAgICAgICAgICAgICAgYmlncmFtRGljdC5tQmlncmFtVG9GaWxsLmFkZCh3b3JkMSk7CisgICAgICAgICAgICAgICAgYmlncmFtRGljdC5tQmlncmFtVG9GaWxsQWRkcmVzcy5hZGQoZGljdFNpemUpOworICAgICAgICAgICAgICAgIGRpY3RTaXplICs9ICg0ICogY291bnQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gKGJ5dGUpICgweDAwKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMjU1LDI0ICszMTEsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZvaWQgd3JpdGVXb3Jkc1JlYyhMaXN0PENoYXJOb2RlPiBjaGlsZHJlbikgeworICAgIHZvaWQgd3JpdGVXb3Jkc1JlYyhMaXN0PENoYXJOb2RlPiBjaGlsZHJlbiwgU3RyaW5nQnVpbGRlciB3b3JkKSB7CiAgICAgICAgIGlmIChjaGlsZHJlbiA9PSBudWxsIHx8IGNoaWxkcmVuLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgaW50IGNoaWxkQ291bnQgPSBjaGlsZHJlbi5zaXplKCk7CiAgICAgICAgIGFkZENvdW50KGNoaWxkQ291bnQpOwotICAgICAgICAvL2ludCBjaGlsZHJlblN0YXJ0ID0gZGljdFNpemU7CiAgICAgICAgIGludFtdIGNoaWxkcmVuQWRkcmVzc2VzID0gbmV3IGludFtjaGlsZENvdW50XTsKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZENvdW50OyBqKyspIHsKICAgICAgICAgICAgIENoYXJOb2RlIG5vZGUgPSBjaGlsZHJlbi5nZXQoaik7CiAgICAgICAgICAgICBjaGlsZHJlbkFkZHJlc3Nlc1tqXSA9IGRpY3RTaXplOwotICAgICAgICAgICAgYWRkTm9kZShub2RlKTsKKyAgICAgICAgICAgIHdvcmQuYXBwZW5kKGNoaWxkcmVuLmdldChqKS5kYXRhKTsKKyAgICAgICAgICAgIGFkZE5vZGUobm9kZSwgd29yZC50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHdvcmQuZGVsZXRlQ2hhckF0KHdvcmQubGVuZ3RoKCktMSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjaGlsZENvdW50OyBqKyspIHsKICAgICAgICAgICAgIENoYXJOb2RlIG5vZGUgPSBjaGlsZHJlbi5nZXQoaik7CiAgICAgICAgICAgICBpbnQgbm9kZUFkZHJlc3MgPSBjaGlsZHJlbkFkZHJlc3Nlc1tqXTsKICAgICAgICAgICAgIGludCBjYWNoZURpY3RTaXplID0gZGljdFNpemU7Ci0gICAgICAgICAgICB3cml0ZVdvcmRzUmVjKG5vZGUuY2hpbGRyZW4pOworICAgICAgICAgICAgd29yZC5hcHBlbmQoY2hpbGRyZW4uZ2V0KGopLmRhdGEpOworICAgICAgICAgICAgd3JpdGVXb3Jkc1JlYyhub2RlLmNoaWxkcmVuLCB3b3JkKTsKKyAgICAgICAgICAgIHdvcmQuZGVsZXRlQ2hhckF0KHdvcmQubGVuZ3RoKCktMSk7CiAgICAgICAgICAgICB1cGRhdGVOb2RlQWRkcmVzcyhub2RlQWRkcmVzcywgbm9kZSwgbm9kZS5jaGlsZHJlbiAhPSBudWxsCiAgICAgICAgICAgICAgICAgICAgID8gY2FjaGVEaWN0U2l6ZSA6IDApOwogICAgICAgICB9CkBAIC0yODQsMTIgKzM0Myw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCAxTUIgaW4gbW9zdCBjYXNlcywgYXMgdGhlcmUgaXMgYSBsaW1pdCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIHNpemUgaW4gYXBrcy4KICAgICAgICAgZGljdFNpemUgPSAwOwotICAgICAgICB3cml0ZVdvcmRzUmVjKHJvb3RzKTsKKworICAgICAgICBkaWN0W2RpY3RTaXplKytdID0gKGJ5dGUpICgweEZGICYgVkVSU0lPTl9OVU0pOyAvLyB2ZXJzaW9uIGluZm8KKyAgICAgICAgZGljdFtkaWN0U2l6ZSsrXSA9IChieXRlKSAoMHhGRiAmIChiaWdyYW1EaWN0Lm1IYXNCaWdyYW0gPyAxIDogMCkpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgd29yZCA9IG5ldyBTdHJpbmdCdWlsZGVyKDQ4KTsKKyAgICAgICAgd3JpdGVXb3Jkc1JlYyhyb290cywgd29yZCk7CisgICAgICAgIGRpY3QgPSBiaWdyYW1EaWN0LndyaXRlQmlncmFtcyhkaWN0LCBtRGljdGlvbmFyeSk7CiAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGljdCBTaXplID0gIiArIGRpY3RTaXplKTsKKyAgICAgICAgaWYgKCFzU3BsaXRPdXRwdXQpIHsKKyAgICAgICAgICAgIHNPdXRwdXRGaWxlU2l6ZSA9IGRpY3RTaXplOworICAgICAgICB9CiAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRpY3RGaWxlbmFtZSk7Ci0gICAgICAgICAgICBmb3Mud3JpdGUoZGljdCwgMCwgZGljdFNpemUpOwotICAgICAgICAgICAgZm9zLmNsb3NlKCk7CisgICAgICAgICAgICBpbnQgY3VycmVudExvYyA9IDA7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpbnQgZXh0ZW5zaW9uID0gZGljdEZpbGVuYW1lLmluZGV4T2YoIi5kaWN0Iik7CisgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBkaWN0RmlsZW5hbWUuc3Vic3RyaW5nKDAsIGV4dGVuc2lvbik7CisgICAgICAgICAgICB3aGlsZSAoZGljdFNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3M7CisgICAgICAgICAgICAgICAgaWYgKHNTcGxpdE91dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSArIGkgKyAiLmRpY3QiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSArICIuZGljdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGljdFNpemUgPiBzT3V0cHV0RmlsZVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGRpY3QsIGN1cnJlbnRMb2MsIHNPdXRwdXRGaWxlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGRpY3RTaXplIC09IHNPdXRwdXRGaWxlU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudExvYyArPSBzT3V0cHV0RmlsZVNpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9zLndyaXRlKGRpY3QsIGN1cnJlbnRMb2MsIGRpY3RTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZGljdFNpemUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewogICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvciB3cml0aW5nIGRpY3QgZmlsZToiICsgaW9lKTsKICAgICAgICAgfQpAQCAtMjk5LDI0ICszODYsMzYgQEAKICAgICAgICAgaW50IGNvdW50ID0gZGljdFtwb3MrK10gJiAweEZGOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgIGNoYXIgYyA9IChjaGFyKSAoZGljdFtwb3MrK10gJiAweEZGKTsKLSAgICAgICAgICAgIGlmIChjID09IDB4RkYpIHsKKyAgICAgICAgICAgIGlmIChjID09IDB4RkYpIHsgLy8gdHdvIGJ5dGUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICAgYyA9IChjaGFyKSAoKChkaWN0W3Bvc10gJiAweEZGKSA8PCA4KSB8IChkaWN0W3BvcysxXSAmIDB4RkYpKTsKICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHdvcmRbZGVwdGhdID0gYzsKLSAgICAgICAgICAgIGJvb2xlYW4gdGVybWluYWwgPSAoZGljdFtwb3NdICYgMHg4MCkgPiAwOworICAgICAgICAgICAgYm9vbGVhbiB0ZXJtaW5hbCA9IGdldEZpcnN0Qml0T2ZCeXRlKHBvcywgZGljdCk7CiAgICAgICAgICAgICBpbnQgYWRkcmVzcyA9IDA7Ci0gICAgICAgICAgICBpZiAoKGRpY3RbcG9zXSAmIChGTEFHX0FERFJFU1NfTUFTSyA+PiAxNikpID4gMCkgewotICAgICAgICAgICAgICAgIGFkZHJlc3MgPSAKLSAgICAgICAgICAgICAgICAgICAgKChkaWN0W3BvcyArIDBdICYgKEZMQUdfQUREUkVTU19NQVNLID4+IDE2KSkgPDwgMTYpCi0gICAgICAgICAgICAgICAgICAgIHwgKChkaWN0W3BvcyArIDFdICYgMHhGRikgPDwgOCkKLSAgICAgICAgICAgICAgICAgICAgfCAoKGRpY3RbcG9zICsgMl0gJiAweEZGKSk7Ci0gICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICBpZiAoKGRpY3RbcG9zXSAmIChGTEFHX0FERFJFU1NfTUFTSyA+PiAxNikpID4gMCkgeyAvLyBhZGRyZXNzIGNoZWNrCisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGdldDIyQml0QWRkcmVzcyhwb3MsIGRpY3QpOworICAgICAgICAgICAgICAgIHBvcyArPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwb3MgKz0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgaWYgKHRlcm1pbmFsKSB7CiAgICAgICAgICAgICAgICAgc2hvd1dvcmQod29yZCwgZGVwdGggKyAxLCBkaWN0W3Bvc10gJiAweEZGKTsKICAgICAgICAgICAgICAgICBwb3MrKzsKKworICAgICAgICAgICAgICAgIGludCBiaWdyYW1FeGlzdCA9IChkaWN0W3Bvc10gJiBiaWdyYW1EaWN0LkZMQUdfQklHUkFNX1JFQUQpOworICAgICAgICAgICAgICAgIGlmIChiaWdyYW1FeGlzdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5leHRCaWdyYW1FeGlzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0QmlncmFtRXhpc3QgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlncmFtQWRkcmVzcyA9IGdldDIyQml0QWRkcmVzcyhwb3MsIGRpY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJlcXVlbmN5ID0gKGJpZ3JhbURpY3QuRkxBR19CSUdSQU1fRlJFUSAmIGRpY3RbcG9zXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaWdyYW1EaWN0LnNlYXJjaEZvclRlcm1pbmFsTm9kZShiaWdyYW1BZGRyZXNzLCBmcmVxdWVuY3ksIGRpY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dEJpZ3JhbUV4aXN0ID0gKGRpY3RbcG9zKytdICYgYmlncmFtRGljdC5GTEFHX0JJR1JBTV9DT05USU5VRUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcG9zKys7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gMCkgewogICAgICAgICAgICAgICAgIHRyYXZlcnNlRGljdChhZGRyZXNzLCB3b3JkLCBkZXB0aCArIDEpOwpAQCAtMzI3LDQgKzQyNiwxOCBAQAogICAgIHZvaWQgc2hvd1dvcmQoY2hhcltdIHdvcmQsIGludCBzaXplLCBpbnQgZnJlcSkgewogICAgICAgICBTeXN0ZW0ub3V0LnByaW50KG5ldyBTdHJpbmcod29yZCwgMCwgc2l6ZSkgKyAiICIgKyBmcmVxICsgIlxuIik7CiAgICAgfQorCisgICAgc3RhdGljIGludCBnZXQyMkJpdEFkZHJlc3MoaW50IHBvcywgYnl0ZVtdIGRpY3QpIHsKKyAgICAgICAgcmV0dXJuICgoZGljdFtwb3MgKyAwXSAmIDB4M0YpIDw8IDE2KQorICAgICAgICAgICAgICAgIHwgKChkaWN0W3BvcyArIDFdICYgMHhGRikgPDwgOCkKKyAgICAgICAgICAgICAgICB8ICgoZGljdFtwb3MgKyAyXSAmIDB4RkYpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBnZXRGaXJzdEJpdE9mQnl0ZShpbnQgcG9zLCBieXRlW10gZGljdCkgeworICAgICAgICByZXR1cm4gKGRpY3RbcG9zXSAmIDB4ODApID4gMDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBnZXRTZWNvbmRCaXRPZkJ5dGUoaW50IHBvcywgYnl0ZVtdIGRpY3QpIHsKKyAgICAgICAgcmV0dXJuIChkaWN0W3Bvc10gJiAweDQwKSA+IDA7CisgICAgfQogfQo=