ZGlmZiAtLWdpdCBhL2FwaS9jdXJyZW50LnhtbCBiL2FwaS9jdXJyZW50LnhtbAppbmRleCBlNjZiMmU3Li5mNDQ4Yjg1IDEwMDY0NAotLS0gYS9hcGkvY3VycmVudC54bWwKKysrIGIvYXBpL2N1cnJlbnQueG1sCkBAIC0yNjM1Myw3ICsyNjM1Myw5IEBACiA+CiA8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuSW5wdXRRdWV1ZS5DYWxsYmFjayI+CiA8L2ltcGxlbWVudHM+Ci08aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjayI+Cis8aW1wbGVtZW50cyBuYW1lPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjazIiPgorPC9pbXBsZW1lbnRzPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LlZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lciI+CiA8L2ltcGxlbWVudHM+CiA8Y29uc3RydWN0b3IgbmFtZT0iTmF0aXZlQWN0aXZpdHkiCiAgdHlwZT0iYW5kcm9pZC5hcHAuTmF0aXZlQWN0aXZpdHkiCkBAIC0yNjM2Myw2ICsyNjM2NSwxNyBAQAogIHZpc2liaWxpdHk9InB1YmxpYyIKID4KIDwvY29uc3RydWN0b3I+Cis8bWV0aG9kIG5hbWU9Im9uR2xvYmFsTGF5b3V0IgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0iZmFsc2UiCisgbmF0aXZlPSJmYWxzZSIKKyBzeW5jaHJvbml6ZWQ9ImZhbHNlIgorIHN0YXRpYz0iZmFsc2UiCisgZmluYWw9ImZhbHNlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvbWV0aG9kPgogPG1ldGhvZCBuYW1lPSJvbklucHV0UXVldWVDcmVhdGVkIgogIHJldHVybj0idm9pZCIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0yNjQzNCw2ICsyNjQ0NywxOSBAQAogPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KIDwvcGFyYW1ldGVyPgogPC9tZXRob2Q+Cis8bWV0aG9kIG5hbWU9InN1cmZhY2VSZWRyYXdOZWVkZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8ZmllbGQgbmFtZT0iTUVUQV9EQVRBX0xJQl9OQU1FIgogIHR5cGU9ImphdmEubGFuZy5TdHJpbmciCiAgdHJhbnNpZW50PSJmYWxzZSIKQEAgLTY0ODE3LDYgKzY0ODQzLDE3IEBACiAgdmlzaWJpbGl0eT0icHVibGljIgogPgogPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJZVjEyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iODQyMDk0MTY5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgogPC9jbGFzcz4KIDxjbGFzcyBuYW1lPSJJbnRlcnBvbGF0b3IiCiAgZXh0ZW5kcz0iamF2YS5sYW5nLk9iamVjdCIKQEAgLTE0MjkzOCw2ICsxNDI5NzUsMTkgQEAKIDxwYXJhbWV0ZXIgbmFtZT0iaG9sZGVyIiB0eXBlPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlciI+CiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgorPG1ldGhvZCBuYW1lPSJvblN1cmZhY2VSZWRyYXdOZWVkZWQiCisgcmV0dXJuPSJ2b2lkIgorIGFic3RyYWN0PSJmYWxzZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+CiA8bWV0aG9kIG5hbWU9Im9uVG91Y2hFdmVudCIKICByZXR1cm49InZvaWQiCiAgYWJzdHJhY3Q9ImZhbHNlIgpAQCAtMTc0Mjk2LDYgKzE3NDM0NiwxNzEgQEAKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+CiA8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX0EiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSI5NiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9CIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iOTciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fQyIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ijk4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX0wxIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTAyIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX0wyIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA0IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX01PREUiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMTAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fUjEiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDMiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fUjIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDUiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fU0VMRUNUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1NUQVJUIgorIHR5cGU9ImludCIKKyB0cmFuc2llbnQ9ImZhbHNlIgorIHZvbGF0aWxlPSJmYWxzZSIKKyB2YWx1ZT0iMTA4IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1RIVU1CTCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwNiIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KKzxmaWVsZCBuYW1lPSJLRVlDT0RFX0JVVFRPTl9USFVNQlIiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDciCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fWCIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9Ijk5IgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0idHJ1ZSIKKyBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKKyB2aXNpYmlsaXR5PSJwdWJsaWMiCis+Cis8L2ZpZWxkPgorPGZpZWxkIG5hbWU9IktFWUNPREVfQlVUVE9OX1kiCisgdHlwZT0iaW50IgorIHRyYW5zaWVudD0iZmFsc2UiCisgdm9sYXRpbGU9ImZhbHNlIgorIHZhbHVlPSIxMDAiCisgc3RhdGljPSJ0cnVlIgorIGZpbmFsPSJ0cnVlIgorIGRlcHJlY2F0ZWQ9Im5vdCBkZXByZWNhdGVkIgorIHZpc2liaWxpdHk9InB1YmxpYyIKKz4KKzwvZmllbGQ+Cis8ZmllbGQgbmFtZT0iS0VZQ09ERV9CVVRUT05fWiIKKyB0eXBlPSJpbnQiCisgdHJhbnNpZW50PSJmYWxzZSIKKyB2b2xhdGlsZT0iZmFsc2UiCisgdmFsdWU9IjEwMSIKKyBzdGF0aWM9InRydWUiCisgZmluYWw9InRydWUiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPC9maWVsZD4KIDxmaWVsZCBuYW1lPSJLRVlDT0RFX0MiCiAgdHlwZT0iaW50IgogIHRyYW5zaWVudD0iZmFsc2UiCkBAIC0xNzg5MDMsNiArMTc5MTE4LDI5IEBACiA8L3BhcmFtZXRlcj4KIDwvbWV0aG9kPgogPC9pbnRlcmZhY2U+Cis8aW50ZXJmYWNlIG5hbWU9IlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIgorIGFic3RyYWN0PSJ0cnVlIgorIHN0YXRpYz0idHJ1ZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPGltcGxlbWVudHMgbmFtZT0iYW5kcm9pZC52aWV3LlN1cmZhY2VIb2xkZXIuQ2FsbGJhY2siPgorPC9pbXBsZW1lbnRzPgorPG1ldGhvZCBuYW1lPSJzdXJmYWNlUmVkcmF3TmVlZGVkIgorIHJldHVybj0idm9pZCIKKyBhYnN0cmFjdD0idHJ1ZSIKKyBuYXRpdmU9ImZhbHNlIgorIHN5bmNocm9uaXplZD0iZmFsc2UiCisgc3RhdGljPSJmYWxzZSIKKyBmaW5hbD0iZmFsc2UiCisgZGVwcmVjYXRlZD0ibm90IGRlcHJlY2F0ZWQiCisgdmlzaWJpbGl0eT0icHVibGljIgorPgorPHBhcmFtZXRlciBuYW1lPSJob2xkZXIiIHR5cGU9ImFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyIj4KKzwvcGFyYW1ldGVyPgorPC9tZXRob2Q+Cis8L2ludGVyZmFjZT4KIDxjbGFzcyBuYW1lPSJTdXJmYWNlVmlldyIKICBleHRlbmRzPSJhbmRyb2lkLnZpZXcuVmlldyIKICBhYnN0cmFjdD0iZmFsc2UiCkBAIC0xODc0OTIsNyArMTg3NzMwLDcgQEAKICBkZXByZWNhdGVkPSJub3QgZGVwcmVjYXRlZCIKICB2aXNpYmlsaXR5PSJwdWJsaWMiCiA+Ci08cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjayI+Cis8cGFyYW1ldGVyIG5hbWU9ImNhbGxiYWNrIiB0eXBlPSJhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjazIiPgogPC9wYXJhbWV0ZXI+CiA8L21ldGhvZD4KIDxtZXRob2QgbmFtZT0idG9nZ2xlUGFuZWwiCmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvQ29udGV4dEltcGwuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCmluZGV4IDYzYmJmOWMuLjE2N2JkM2MgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9Db250ZXh0SW1wbC5qYXZhCkBAIC02Nyw2ICs2Nyw3IEBACiBpbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuQ29ubmVjdGl2aXR5TWFuYWdlcjsKIGltcG9ydCBhbmRyb2lkLm5ldC5JQ29ubmVjdGl2aXR5TWFuYWdlcjsKK2ltcG9ydCBhbmRyb2lkLm5ldC5Eb3dubG9hZE1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVGhyb3R0bGVNYW5hZ2VyOwogaW1wb3J0IGFuZHJvaWQubmV0LklUaHJvdHRsZU1hbmFnZXI7CiBpbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwpAQCAtMTk5LDYgKzIwMCw3IEBACiAgICAgcHJpdmF0ZSBEcm9wQm94TWFuYWdlciBtRHJvcEJveE1hbmFnZXIgPSBudWxsOwogICAgIHByaXZhdGUgRGV2aWNlUG9saWN5TWFuYWdlciBtRGV2aWNlUG9saWN5TWFuYWdlciA9IG51bGw7CiAgICAgcHJpdmF0ZSBVaU1vZGVNYW5hZ2VyIG1VaU1vZGVNYW5hZ2VyID0gbnVsbDsKKyAgICBwcml2YXRlIERvd25sb2FkTWFuYWdlciBtRG93bmxvYWRNYW5hZ2VyID0gbnVsbDsKIAogICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1TeW5jID0gbmV3IE9iamVjdCgpOwogCkBAIC05NzMsNiArOTc1LDggQEAKICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VQb2xpY3lNYW5hZ2VyKCk7CiAgICAgICAgIH0gZWxzZSBpZiAoVUlfTU9ERV9TRVJWSUNFLmVxdWFscyhuYW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFVpTW9kZU1hbmFnZXIoKTsKKyAgICAgICAgfSBlbHNlIGlmIChET1dOTE9BRF9TRVJWSUNFLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldERvd25sb2FkTWFuYWdlcigpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG51bGw7CkBAIC0xMTkxLDYgKzExOTUsMTUgQEAKICAgICAgICAgcmV0dXJuIG1VaU1vZGVNYW5hZ2VyOwogICAgIH0KIAorICAgIHByaXZhdGUgRG93bmxvYWRNYW5hZ2VyIGdldERvd25sb2FkTWFuYWdlcigpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChtU3luYykgeworICAgICAgICAgICAgaWYgKG1Eb3dubG9hZE1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1Eb3dubG9hZE1hbmFnZXIgPSBuZXcgRG93bmxvYWRNYW5hZ2VyKGdldENvbnRlbnRSZXNvbHZlcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURvd25sb2FkTWFuYWdlcjsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGNoZWNrUGVybWlzc2lvbihTdHJpbmcgcGVybWlzc2lvbiwgaW50IHBpZCwgaW50IHVpZCkgewogICAgICAgICBpZiAocGVybWlzc2lvbiA9PSBudWxsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9OYXRpdmVBY3Rpdml0eS5qYXZhCmluZGV4IGQ3MmRkYTcuLmNjYzlhZTMgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9OYXRpdmVBY3Rpdml0eS5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL2FwcC9OYXRpdmVBY3Rpdml0eS5qYXZhCkBAIC0yLDYgKzIsNyBAQAogCiBpbXBvcnQgZGFsdmlrLnN5c3RlbS5QYXRoQ2xhc3NMb2FkZXI7CiAKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKIGltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwogaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87CiBpbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwpAQCAtMTEsMTIgKzEyLDE2IEBACiBpbXBvcnQgYW5kcm9pZC5vcy5FbnZpcm9ubWVudDsKIGltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKIGltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2VRdWV1ZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwogaW1wb3J0IGFuZHJvaWQudmlldy5JbnB1dENoYW5uZWw7CiBpbXBvcnQgYW5kcm9pZC52aWV3LklucHV0UXVldWU7CiBpbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwogaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OworaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOworaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXI7CitpbXBvcnQgYW5kcm9pZC52aWV3LmlucHV0bWV0aG9kLklucHV0TWV0aG9kTWFuYWdlcjsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIApAQCAtMjQsMTUgKzI5LDI2IEBACiAgKiBDb252ZW5pZW5jZSBmb3IgaW1wbGVtZW50aW5nIGFuIGFjdGl2aXR5IHRoYXQgd2lsbCBiZSBpbXBsZW1lbnRlZAogICogcHVyZWx5IGluIG5hdGl2ZSBjb2RlLiAgVGhhdCBpcywgYSBnYW1lIChvciBnYW1lLWxpa2UgdGhpbmcpLgogICovCi1wdWJsaWMgY2xhc3MgTmF0aXZlQWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSBpbXBsZW1lbnRzIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2ssCi0gICAgICAgIElucHV0UXVldWUuQ2FsbGJhY2sgeworcHVibGljIGNsYXNzIE5hdGl2ZUFjdGl2aXR5IGV4dGVuZHMgQWN0aXZpdHkgaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiwKKyAgICAgICAgSW5wdXRRdWV1ZS5DYWxsYmFjaywgT25HbG9iYWxMYXlvdXRMaXN0ZW5lciB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQV9EQVRBX0xJQl9OQU1FID0gImFuZHJvaWQuYXBwLmxpYl9uYW1lIjsKICAgICAKKyAgICBwcml2YXRlIE5hdGl2ZUNvbnRlbnRWaWV3IG1OYXRpdmVDb250ZW50VmlldzsKKyAgICBwcml2YXRlIElucHV0TWV0aG9kTWFuYWdlciBtSU1NOworCiAgICAgcHJpdmF0ZSBpbnQgbU5hdGl2ZUhhbmRsZTsKICAgICAKICAgICBwcml2YXRlIElucHV0UXVldWUgbUN1cklucHV0UXVldWU7CiAgICAgcHJpdmF0ZSBTdXJmYWNlSG9sZGVyIG1DdXJTdXJmYWNlSG9sZGVyOwogICAgIAorICAgIGZpbmFsIGludFtdIG1Mb2NhdGlvbiA9IG5ldyBpbnRbMl07CisgICAgaW50IG1MYXN0Q29udGVudFg7CisgICAgaW50IG1MYXN0Q29udGVudFk7CisgICAgaW50IG1MYXN0Q29udGVudFdpZHRoOworICAgIGludCBtTGFzdENvbnRlbnRIZWlnaHQ7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbURpc3BhdGNoaW5nVW5oYW5kbGVkS2V5OworCiAgICAgcHJpdmF0ZSBib29sZWFuIG1EZXN0cm95ZWQ7CiAgICAgCiAgICAgcHJpdmF0ZSBuYXRpdmUgaW50IGxvYWROYXRpdmVDb2RlKFN0cmluZyBwYXRoLCBNZXNzYWdlUXVldWUgcXVldWUsCkBAIC00OSwxOCArNjUsNDQgQEAKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uU3VyZmFjZUNyZWF0ZWROYXRpdmUoaW50IGhhbmRsZSwgU3VyZmFjZSBzdXJmYWNlKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uU3VyZmFjZUNoYW5nZWROYXRpdmUoaW50IGhhbmRsZSwgU3VyZmFjZSBzdXJmYWNlLAogICAgICAgICAgICAgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uU3VyZmFjZVJlZHJhd05lZWRlZE5hdGl2ZShpbnQgaGFuZGxlLCBTdXJmYWNlIHN1cmZhY2UpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkTmF0aXZlKGludCBoYW5kbGUpOwogICAgIHByaXZhdGUgbmF0aXZlIHZvaWQgb25JbnB1dENoYW5uZWxDcmVhdGVkTmF0aXZlKGludCBoYW5kbGUsIElucHV0Q2hhbm5lbCBjaGFubmVsKTsKICAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uSW5wdXRDaGFubmVsRGVzdHJveWVkTmF0aXZlKGludCBoYW5kbGUsIElucHV0Q2hhbm5lbCBjaGFubmVsKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIG9uQ29udGVudFJlY3RDaGFuZ2VkTmF0aXZlKGludCBoYW5kbGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKTsKKyAgICBwcml2YXRlIG5hdGl2ZSB2b2lkIGRpc3BhdGNoS2V5RXZlbnROYXRpdmUoaW50IGhhbmRsZSwgS2V5RXZlbnQgZXZlbnQpOworCisgICAgc3RhdGljIGNsYXNzIE5hdGl2ZUNvbnRlbnRWaWV3IGV4dGVuZHMgVmlldyB7CisgICAgICAgIE5hdGl2ZUFjdGl2aXR5IG1BY3Rpdml0eTsKKworICAgICAgICBwdWJsaWMgTmF0aXZlQ29udGVudFZpZXcoQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOYXRpdmVDb250ZW50VmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgeworICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOworICAgICAgICB9CisgICAgfQogICAgIAogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKICAgICAgICAgU3RyaW5nIGxpYm5hbWUgPSAibWFpbiI7CiAgICAgICAgIEFjdGl2aXR5SW5mbyBhaTsKICAgICAgICAgCisgICAgICAgIG1JTU0gPSAoSW5wdXRNZXRob2RNYW5hZ2VyKWdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5JTlBVVF9NRVRIT0RfU0VSVklDRSk7CisKICAgICAgICAgZ2V0V2luZG93KCkudGFrZVN1cmZhY2UodGhpcyk7CiAgICAgICAgIGdldFdpbmRvdygpLnRha2VJbnB1dFF1ZXVlKHRoaXMpOwogICAgICAgICBnZXRXaW5kb3coKS5zZXRGb3JtYXQoUGl4ZWxGb3JtYXQuUkdCXzU2NSk7CisgICAgICAgIGdldFdpbmRvdygpLnNldFNvZnRJbnB1dE1vZGUoCisgICAgICAgICAgICAgICAgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9TVEFURV9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgIHwgV2luZG93TWFuYWdlci5MYXlvdXRQYXJhbXMuU09GVF9JTlBVVF9BREpVU1RfUkVTSVpFKTsKKworICAgICAgICBtTmF0aXZlQ29udGVudFZpZXcgPSBuZXcgTmF0aXZlQ29udGVudFZpZXcodGhpcyk7CisgICAgICAgIG1OYXRpdmVDb250ZW50Vmlldy5tQWN0aXZpdHkgPSB0aGlzOworICAgICAgICBzZXRDb250ZW50VmlldyhtTmF0aXZlQ29udGVudFZpZXcpOworICAgICAgICBtTmF0aXZlQ29udGVudFZpZXcucmVxdWVzdEZvY3VzKCk7CisgICAgICAgIG1OYXRpdmVDb250ZW50Vmlldy5nZXRWaWV3VHJlZU9ic2VydmVyKCkuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcih0aGlzKTsKICAgICAgICAgCiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBhaSA9IGdldFBhY2thZ2VNYW5hZ2VyKCkuZ2V0QWN0aXZpdHlJbmZvKApAQCAtMTY1LDYgKzIwNywxOCBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoS2V5RXZlbnQoS2V5RXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKG1EaXNwYXRjaGluZ1VuaGFuZGxlZEtleSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gS2V5IGV2ZW50cyBmcm9tIHRoZSBJTUUgZG8gbm90IGdvIHRocm91Z2ggdGhlIGlucHV0IGNoYW5uZWw7CisgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGludGVyY2VwdCB0aGVtIGhlcmUgdG8gaGFuZCB0byB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICBkaXNwYXRjaEtleUV2ZW50TmF0aXZlKG1OYXRpdmVIYW5kbGUsIGV2ZW50KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CiAgICAgICAgICAgICBtQ3VyU3VyZmFjZUhvbGRlciA9IGhvbGRlcjsKQEAgLTE3OSw2ICsyMzMsMTMgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKKyAgICBwdWJsaWMgdm9pZCBzdXJmYWNlUmVkcmF3TmVlZGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIGlmICghbURlc3Ryb3llZCkgeworICAgICAgICAgICAgbUN1clN1cmZhY2VIb2xkZXIgPSBob2xkZXI7CisgICAgICAgICAgICBvblN1cmZhY2VSZWRyYXdOZWVkZWROYXRpdmUobU5hdGl2ZUhhbmRsZSwgaG9sZGVyLmdldFN1cmZhY2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CiAgICAgICAgIG1DdXJTdXJmYWNlSG9sZGVyID0gbnVsbDsKICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CkBAIC0yMDAsMTAgKzI2MSwzMiBAQAogICAgICAgICB9CiAgICAgfQogICAgIAorICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgeworICAgICAgICBtTmF0aXZlQ29udGVudFZpZXcuZ2V0TG9jYXRpb25JbldpbmRvdyhtTG9jYXRpb24pOworICAgICAgICBpbnQgdyA9IG1OYXRpdmVDb250ZW50Vmlldy5nZXRXaWR0aCgpOworICAgICAgICBpbnQgaCA9IG1OYXRpdmVDb250ZW50Vmlldy5nZXRIZWlnaHQoKTsKKyAgICAgICAgaWYgKG1Mb2NhdGlvblswXSAhPSBtTGFzdENvbnRlbnRYIHx8IG1Mb2NhdGlvblsxXSAhPSBtTGFzdENvbnRlbnRZCisgICAgICAgICAgICAgICAgfHwgdyAhPSBtTGFzdENvbnRlbnRXaWR0aCB8fCBoICE9IG1MYXN0Q29udGVudEhlaWdodCkgeworICAgICAgICAgICAgbUxhc3RDb250ZW50WCA9IG1Mb2NhdGlvblswXTsKKyAgICAgICAgICAgIG1MYXN0Q29udGVudFkgPSBtTG9jYXRpb25bMV07CisgICAgICAgICAgICBtTGFzdENvbnRlbnRXaWR0aCA9IHc7CisgICAgICAgICAgICBtTGFzdENvbnRlbnRIZWlnaHQgPSBoOworICAgICAgICAgICAgaWYgKCFtRGVzdHJveWVkKSB7CisgICAgICAgICAgICAgICAgb25Db250ZW50UmVjdENoYW5nZWROYXRpdmUobU5hdGl2ZUhhbmRsZSwgbUxhc3RDb250ZW50WCwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29udGVudFksIG1MYXN0Q29udGVudFdpZHRoLCBtTGFzdENvbnRlbnRIZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgdm9pZCBkaXNwYXRjaFVuaGFuZGxlZEtleUV2ZW50KEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIFZpZXcgZGVjb3IgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgaWYgKGRlY29yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGRlY29yLmRpc3BhdGNoS2V5RXZlbnQoZXZlbnQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbURpc3BhdGNoaW5nVW5oYW5kbGVkS2V5ID0gdHJ1ZTsKKyAgICAgICAgICAgIFZpZXcgZGVjb3IgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKKyAgICAgICAgICAgIGlmIChkZWNvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVjb3IuZGlzcGF0Y2hLZXlFdmVudChldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBtRGlzcGF0Y2hpbmdVbmhhbmRsZWRLZXkgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTIxNCw0ICsyOTcsMTIgQEAKICAgICB2b2lkIHNldFdpbmRvd0Zvcm1hdChpbnQgZm9ybWF0KSB7CiAgICAgICAgIGdldFdpbmRvdygpLnNldEZvcm1hdChmb3JtYXQpOwogICAgIH0KKworICAgIHZvaWQgc2hvd0ltZShpbnQgbW9kZSkgeworICAgICAgICBtSU1NLnNob3dTb2Z0SW5wdXQobU5hdGl2ZUNvbnRlbnRWaWV3LCBtb2RlKTsKKyAgICB9CisKKyAgICB2b2lkIGhpZGVJbWUoaW50IG1vZGUpIHsKKyAgICAgICAgbUlNTS5oaWRlU29mdElucHV0RnJvbVdpbmRvdyhtTmF0aXZlQ29udGVudFZpZXcuZ2V0V2luZG93VG9rZW4oKSwgbW9kZSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvY29udGVudC9Db250ZXh0LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQppbmRleCAzMDgyMmQ0Li5hMTRiZDhmIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9jb250ZW50L0NvbnRleHQuamF2YQpAQCAtMTUzNSw2ICsxNTM1LDE1IEBACiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfTU9ERV9TRVJWSUNFID0gInVpbW9kZSI7CiAKICAgICAvKioKKyAgICAgKiBVc2Ugd2l0aCB7QGxpbmsgI2dldFN5c3RlbVNlcnZpY2V9IHRvIHJldHJpZXZlIGEKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5uZXQuRG93bmxvYWRNYW5hZ2VyfSBmb3IgcmVxdWVzdGluZyBIVFRQIGRvd25sb2Fkcy4KKyAgICAgKgorICAgICAqIEBzZWUgI2dldFN5c3RlbVNlcnZpY2UKKyAgICAgKiBAaGlkZSAoVE9ETykgZm9yIG5vdworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1NFUlZJQ0UgPSAiZG93bmxvYWQiOworCisgICAgLyoqCiAgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHBlcm1pc3Npb24gaXMgYWxsb3dlZCBmb3IgYSBwYXJ0aWN1bGFyCiAgICAgICogcHJvY2VzcyBhbmQgdXNlciBJRCBydW5uaW5nIGluIHRoZSBzeXN0ZW0uCiAgICAgICoKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXIuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL25ldC9Eb3dubG9hZE1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI2MjEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvbmV0L0Rvd25sb2FkTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsNzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm5ldDsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7CitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRWYWx1ZXM7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3I7CitpbXBvcnQgYW5kcm9pZC5kYXRhYmFzZS5DdXJzb3JXcmFwcGVyOworaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5Eb3dubG9hZHM7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoZSBkb3dubG9hZCBtYW5hZ2VyIGlzIGEgc3lzdGVtIHNlcnZpY2UgdGhhdCBoYW5kbGVzIGxvbmctcnVubmluZyBIVFRQIGRvd25sb2Fkcy4gQ2xpZW50cyBtYXkKKyAqIHJlcXVlc3QgdGhhdCBhIFVSSSBiZSBkb3dubG9hZGVkIHRvIGEgcGFydGljdWxhciBkZXN0aW5hdGlvbiBmaWxlLiBUaGUgZG93bmxvYWQgbWFuYWdlciB3aWxsCisgKiBjb25kdWN0IHRoZSBkb3dubG9hZCBpbiB0aGUgYmFja2dyb3VuZCwgdGFraW5nIGNhcmUgb2YgSFRUUCBpbnRlcmFjdGlvbnMgYW5kIHJldHJ5aW5nIGRvd25sb2FkcworICogYWZ0ZXIgZmFpbHVyZXMgb3IgYWNyb3NzIGNvbm5lY3Rpdml0eSBjaGFuZ2VzIGFuZCBzeXN0ZW0gcmVib290cy4KKyAqCisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgb2J0YWluZWQgdGhyb3VnaAorICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2dldFN5c3RlbVNlcnZpY2UoU3RyaW5nKX0gYnkgcGFzc2luZworICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I0RPV05MT0FEX1NFUlZJQ0V9LgorICoKKyAqIEBoaWRlCisgKi8KK3B1YmxpYyBjbGFzcyBEb3dubG9hZE1hbmFnZXIgeworICAgIC8qKgorICAgICAqIEFuIGlkZW50aWZpZXIgZm9yIGEgcGFydGljdWxhciBkb3dubG9hZCwgdW5pcXVlIGFjcm9zcyB0aGUgc3lzdGVtLiAgQ2xpZW50cyB1c2UgdGhpcyBJRCB0bworICAgICAqIG1ha2Ugc3Vic2VxdWVudCBjYWxscyByZWxhdGVkIHRvIHRoZSBkb3dubG9hZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fSUQgPSAiaWQiOworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudC1zdXBwbGllZCB0aXRsZSBmb3IgdGhpcyBkb3dubG9hZC4gIFRoaXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gc3lzdGVtIG5vdGlmaWNhdGlvbnMsCisgICAgICogaWYgZW5hYmxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVElUTEUgPSAidGl0bGUiOworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudC1zdXBwbGllZCBkZXNjcmlwdGlvbiBvZiB0aGlzIGRvd25sb2FkLiAgVGhpcyB3aWxsIGJlIGRpc3BsYXllZCBpbiBzeXN0ZW0KKyAgICAgKiBub3RpZmljYXRpb25zLCBpZiBlbmFibGVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBVUkkgdG8gYmUgZG93bmxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVVJJID0gInVyaSI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5ldCBNZWRpYSBUeXBlIG9mIHRoZSBkb3dubG9hZGVkIGZpbGUuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIGJhc2VkIG9uIHRoZSBzZXJ2ZXIncworICAgICAqIHJlc3BvbnNlIG9uY2UgdGhlIGRvd25sb2FkIGhhcyBzdGFydGVkLgorICAgICAqCisgICAgICogQHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxNTkwLnR4dCI+UkZDIDE1OTAsIGRlZmluaW5nIE1lZGlhIFR5cGVzPC9hPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9NRURJQV9UWVBFID0gIm1lZGlhX3R5cGUiOworCisgICAgLyoqCisgICAgICogVG90YWwgc2l6ZSBvZiB0aGUgZG93bmxvYWQgaW4gYnl0ZXMuICBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIG9uY2UgdGhlIGRvd25sb2FkIHN0YXJ0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fVE9UQUxfU0laRV9CWVRFUyA9ICJ0b3RhbF9zaXplIjsKKworICAgIC8qKgorICAgICAqIFVyaSB3aGVyZSBkb3dubG9hZGVkIGZpbGUgd2lsbCBiZSBzdG9yZWQuICBJZiBhIGRlc3RpbmF0aW9uIGlzIHN1cHBsaWVkIGJ5IGNsaWVudCwgdGhhdCBVUkkKKyAgICAgKiB3aWxsIGJlIHVzZWQgaGVyZS4gIE90aGVyd2lzZSwgdGhlIHZhbHVlIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggYSBnZW5lcmF0ZWQgVVJJIG9uY2UgdGhlCisgICAgICogZG93bmxvYWQgaGFzIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0xPQ0FMX1VSSSA9ICJsb2NhbF91cmkiOworCisgICAgLyoqCisgICAgICogQ3VycmVudCBzdGF0dXMgb2YgdGhlIGRvd25sb2FkLCBhcyBvbmUgb2YgdGhlIFNUQVRVU18qIGNvbnN0YW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fU1RBVFVTID0gInN0YXR1cyI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCBvY2N1cnJlZCwgd2hlbiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IGlzCisgICAgICoge0BsaW5rICNTVEFUVVNfRkFJTEVEfS4gIElmIGFuIEhUVFAgZXJyb3Igb2NjdXJyZWQsIHRoaXMgd2lsbCBob2xkIHRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzCisgICAgICogZGVmaW5lZCBpbiBSRkMgMjYxNi4gIE90aGVyd2lzZSwgaXQgd2lsbCBob2xkIG9uZSBvZiB0aGUgRVJST1JfKiBjb25zdGFudHMuCisgICAgICoKKyAgICAgKiBJZiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IGlzIG5vdCB7QGxpbmsgI1NUQVRVU19GQUlMRUR9LCB0aGlzIGNvbHVtbidzIHZhbHVlIGlzIHVuZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEBzZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWM2Lmh0bWwjc2VjNi4xLjEiPlJGQyAyNjE2CisgICAgICogc3RhdHVzIGNvZGVzPC9hPgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTFVNTl9FUlJPUl9DT0RFID0gImVycm9yX2NvZGUiOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGJ5dGVzIGRvd25sb2FkIHNvIGZhci4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT0xVTU5fQllURVNfRE9XTkxPQURFRF9TT19GQVIgPSAiYnl0ZXNfc29fZmFyIjsKKworICAgIC8qKgorICAgICAqIFRpbWVzdGFtcCB3aGVuIHRoZSBkb3dubG9hZCB3YXMgbGFzdCBtb2RpZmllZCwgaW4ge0BsaW5rIFN5c3RlbSNjdXJyZW50VGltZU1pbGxpcworICAgICAqIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpfSAod2FsbCBjbG9jayB0aW1lIGluIFVUQykuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ09MVU1OX0xBU1RfTU9ESUZJRURfVElNRVNUQU1QID0gImxhc3RfbW9kaWZpZWRfdGltZXN0YW1wIjsKKworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fU1RBVFVTfSB3aGVuIHRoZSBkb3dubG9hZCBpcyB3YWl0aW5nIHRvIHN0YXJ0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNUQVRVU19QRU5ESU5HID0gMSA8PCAwOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fU1RBVFVTfSB3aGVuIHRoZSBkb3dubG9hZCBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFUVVNfUlVOTklORyA9IDEgPDwgMTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX1NUQVRVU30gd2hlbiB0aGUgZG93bmxvYWQgaXMgd2FpdGluZyB0byByZXRyeSBvciByZXN1bWUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVFVTX1BBVVNFRCA9IDEgPDwgMjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX1NUQVRVU30gd2hlbiB0aGUgZG93bmxvYWQgaGFzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgU1RBVFVTX1NVQ0NFU1NGVUwgPSAxIDw8IDM7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9TVEFUVVN9IHdoZW4gdGhlIGRvd25sb2FkIGhhcyBmYWlsZWQgKGFuZCB3aWxsIG5vdCBiZSByZXRyaWVkKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBTVEFUVVNfRkFJTEVEID0gMSA8PCA0OworCisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiBDT0xVTU5fRVJST1JfQ09ERSB3aGVuIHRoZSBkb3dubG9hZCBoYXMgY29tcGxldGVkIHdpdGggYW4gZXJyb3IgdGhhdCBkb2Vzbid0IGZpdAorICAgICAqIHVuZGVyIGFueSBvdGhlciBlcnJvciBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX1VOS05PV04gPSAxMDAwOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fRVJST1JfQ09ERX0gd2hlbiBhIHN0b3JhZ2UgaXNzdWUgYXJpc2VzIHdoaWNoIGRvZXNuJ3QgZml0IHVuZGVyIGFueQorICAgICAqIG90aGVyIGVycm9yIGNvZGUuIFVzZSB0aGUgbW9yZSBzcGVjaWZpYyB7QGxpbmsgI0VSUk9SX0lOU1VGRklDSUVOVF9TUEFDRX0gYW5kCisgICAgICoge0BsaW5rICNFUlJPUl9ERVZJQ0VfTk9UX0ZPVU5EfSB3aGVuIGFwcHJvcHJpYXRlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0ZJTEVfRVJST1IgPSAxMDAxOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2Yge0BsaW5rICNDT0xVTU5fRVJST1JfQ09ERX0gd2hlbiBhbiBIVFRQIGNvZGUgd2FzIHJlY2VpdmVkIHRoYXQgZG93bmxvYWQgbWFuYWdlcgorICAgICAqIGNhbid0IGhhbmRsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUl9VTkhBTkRMRURfSFRUUF9DT0RFID0gMTAwMjsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHtAbGluayAjQ09MVU1OX0VSUk9SX0NPREV9IHdoZW4gYW4gZXJyb3IgcmVjZWl2aW5nIG9yIHByb2Nlc3NpbmcgZGF0YSBvY2N1cnJlZCBhdAorICAgICAqIHRoZSBIVFRQIGxldmVsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0hUVFBfREFUQV9FUlJPUiA9IDEwMDQ7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIHRoZXJlIHdlcmUgdG9vIG1hbnkgcmVkaXJlY3RzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX1RPT19NQU5ZX1JFRElSRUNUUyA9IDEwMDU7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBzcGFjZS4gVHlwaWNhbGx5LAorICAgICAqIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBmdWxsLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVSUk9SX0lOU1VGRklDSUVOVF9TUEFDRSA9IDEwMDY7CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSBvZiB7QGxpbmsgI0NPTFVNTl9FUlJPUl9DT0RFfSB3aGVuIG5vIGV4dGVybmFsIHN0b3JhZ2UgZGV2aWNlIHdhcyBmb3VuZC4gVHlwaWNhbGx5LAorICAgICAqIHRoaXMgaXMgYmVjYXVzZSB0aGUgU0QgY2FyZCBpcyBub3QgbW91bnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFUlJPUl9ERVZJQ0VfTk9UX0ZPVU5EID0gMTAwNzsKKworCisgICAgLy8gdGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gYWxsIHB1YmxpYyBjb2x1bW5zCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ09MVU1OUyA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgIENPTFVNTl9JRCwKKyAgICAgICAgQ09MVU1OX1RJVExFLAorICAgICAgICBDT0xVTU5fREVTQ1JJUFRJT04sCisgICAgICAgIENPTFVNTl9VUkksCisgICAgICAgIENPTFVNTl9NRURJQV9UWVBFLAorICAgICAgICBDT0xVTU5fVE9UQUxfU0laRV9CWVRFUywKKyAgICAgICAgQ09MVU1OX0xPQ0FMX1VSSSwKKyAgICAgICAgQ09MVU1OX1NUQVRVUywKKyAgICAgICAgQ09MVU1OX0VSUk9SX0NPREUsCisgICAgICAgIENPTFVNTl9CWVRFU19ET1dOTE9BREVEX1NPX0ZBUiwKKyAgICAgICAgQ09MVU1OX0xBU1RfTU9ESUZJRURfVElNRVNUQU1QCisgICAgfTsKKworICAgIC8vIGNvbHVtbnMgdG8gcmVxdWVzdCBmcm9tIERvd25sb2FkUHJvdmlkZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBVTkRFUkxZSU5HX0NPTFVNTlMgPSBuZXcgU3RyaW5nW10geworICAgICAgICBEb3dubG9hZHMuSW1wbC5fSUQsCisgICAgICAgIERvd25sb2Fkcy5DT0xVTU5fVElUTEUsCisgICAgICAgIERvd25sb2Fkcy5DT0xVTU5fREVTQ1JJUFRJT04sCisgICAgICAgIERvd25sb2Fkcy5DT0xVTU5fVVJJLAorICAgICAgICBEb3dubG9hZHMuQ09MVU1OX01JTUVfVFlQRSwKKyAgICAgICAgRG93bmxvYWRzLkNPTFVNTl9UT1RBTF9CWVRFUywKKyAgICAgICAgRG93bmxvYWRzLl9EQVRBLAorICAgICAgICBEb3dubG9hZHMuQ09MVU1OX1NUQVRVUywKKyAgICAgICAgRG93bmxvYWRzLkNPTFVNTl9DVVJSRU5UX0JZVEVTLAorICAgICAgICBEb3dubG9hZHMuQ09MVU1OX0xBU1RfTU9ESUZJQ0FUSU9OLAorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBMT05HX0NPTFVNTlMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KAorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChDT0xVTU5fSUQsIENPTFVNTl9UT1RBTF9TSVpFX0JZVEVTLCBDT0xVTU5fU1RBVFVTLCBDT0xVTU5fRVJST1JfQ09ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MVU1OX0JZVEVTX0RPV05MT0FERURfU09fRkFSLCBDT0xVTU5fTEFTVF9NT0RJRklFRF9USU1FU1RBTVApKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gcmVxdWVzdCBhIG5ldyBkb3dubG9hZC4gIFRoZSBVUkkgaXMgdGhlCisgICAgICogb25seSByZXF1aXJlZCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJpdCBmbGFnIGZvciBzZXRTaG93Tm90aWZpY2F0aW9uIGluZGljYXRlZCBhIG5vdGlmaWNhdGlvbiBzaG91bGQgYmUgY3JlYXRlZCB3aGlsZSB0aGUKKyAgICAgICAgICogZG93bmxvYWQgaXMgcnVubmluZy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBOT1RJRklDQVRJT05fV0hFTl9SVU5OSU5HID0gMTsKKworICAgICAgICBVcmkgbVVyaTsKKyAgICAgICAgVXJpIG1EZXN0aW5hdGlvblVyaTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtUmVxdWVzdEhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgU3RyaW5nIG1UaXRsZTsKKyAgICAgICAgU3RyaW5nIG1EZXNjcmlwdGlvbjsKKyAgICAgICAgaW50IG1Ob3RpZmljYXRpb25GbGFnczsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtTWVkaWFUeXBlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gdXJpIHRoZSBIVFRQIFVSSSB0byBkb3dubG9hZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0KFVyaSB1cmkpIHsKKyAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKKyAgICAgICAgICAgIGlmIChzY2hlbWUgPT0gbnVsbCB8fCAhc2NoZW1lLmVxdWFscygiaHR0cCIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgZG93bmxvYWQgSFRUUCBVUklzOiAiICsgdXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1VcmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBsb2NhbCBkZXN0aW5hdGlvbiBmb3IgdGhlIGRvd25sb2FkZWQgZGF0YS4gTXVzdCBiZSBhIGZpbGUgVVJJIHRvIGEgcGF0aCBvbgorICAgICAgICAgKiBleHRlcm5hbCBzdG9yYWdlLCBhbmQgdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gbXVzdCBoYXZlIHRoZSBXUklURV9FWFRFUk5BTF9TVE9SQUdFCisgICAgICAgICAqIHBlcm1pc3Npb24uCisgICAgICAgICAqCisgICAgICAgICAqICBCeSBkZWZhdWx0LCBkb3dubG9hZHMgYXJlIHNhdmVkIHRvIGEgZ2VuZXJhdGVkIGZpbGUgaW4gdGhlIGRvd25sb2FkIGNhY2hlIGFuZCBtYXkgYmUKKyAgICAgICAgICogZGVsZXRlZCBieSB0aGUgZG93bmxvYWQgbWFuYWdlciBhdCBhbnkgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0RGVzdGluYXRpb25VcmkoVXJpIHVyaSkgeworICAgICAgICAgICAgbURlc3RpbmF0aW9uVXJpID0gdXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGFuIEhUVFAgaGVhZGVyIHRvIGJlIGluY2x1ZGVkIHdpdGggdGhlIGRvd25sb2FkIHJlcXVlc3QuCisgICAgICAgICAqIEBwYXJhbSBoZWFkZXIgSFRUUCBoZWFkZXIgbmFtZQorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgaGVhZGVyIHZhbHVlCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IHNldFJlcXVlc3RIZWFkZXIoU3RyaW5nIGhlYWRlciwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBtUmVxdWVzdEhlYWRlcnMucHV0KGhlYWRlciwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGlzIGRvd25sb2FkLCB0byBiZSBkaXNwbGF5ZWQgaW4gbm90aWZpY2F0aW9ucyAoaWYgZW5hYmxlZCkKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgICAgICBtVGl0bGUgPSB0aXRsZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBhIGRlc2NyaXB0aW9uIG9mIHRoaXMgZG93bmxvYWQsIHRvIGJlIGRpc3BsYXllZCBpbiBub3RpZmljYXRpb25zIChpZiBlbmFibGVkKQorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVxdWVzdCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBJbnRlcm5ldCBNZWRpYSBUeXBlIG9mIHRoaXMgZG93bmxvYWQuICBUaGlzIHdpbGwgb3ZlcnJpZGUgdGhlIG1lZGlhIHR5cGUgZGVjbGFyZWQKKyAgICAgICAgICogaW4gdGhlIHNlcnZlcidzIHJlc3BvbnNlLgorICAgICAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE1OTAudHh0Ij5SRkMgMTU5MCwgZGVmaW5pbmcgTWVkaWEgVHlwZXM8L2E+CisgICAgICAgICAqIEByZXR1cm4gdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IHNldE1lZGlhVHlwZShTdHJpbmcgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBtTWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udHJvbCBzeXN0ZW0gbm90aWZpY2F0aW9ucyBwb3N0ZWQgYnkgdGhlIGRvd25sb2FkIG1hbmFnZXIgZm9yIHRoaXMgZG93bmxvYWQuICBJZgorICAgICAgICAgKiBlbmFibGVkLCB0aGUgZG93bmxvYWQgbWFuYWdlciBwb3N0cyBub3RpZmljYXRpb25zIGFib3V0IGRvd25sb2FkcyB0aHJvdWdoIHRoZSBzeXN0ZW0KKyAgICAgICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXJ9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBOT1RJRklDQVRJT05fKiBiaXQgZmxhZ3MKKyAgICAgICAgICogQHJldHVybiB0aGlzIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0U2hvd05vdGlmaWNhdGlvbihpbnQgZmxhZ3MpIHsKKyAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GbGFncyA9IGZsYWdzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVxdWVzdCBzZXRBbGxvd2VkTmV0d29ya1R5cGVzKGludCBmbGFncykgeworICAgICAgICAgICAgLy8gVE9ETyBhbGxvd2VkIG5ldHdvcmtzIHN1cHBvcnQKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlcXVlc3Qgc2V0QWxsb3dlZE92ZXJSb2FtaW5nKGJvb2xlYW4gYWxsb3dlZCkgeworICAgICAgICAgICAgLy8gVE9ETyByb2FtaW5nIHN1cHBvcnQKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gQ29udGVudFZhbHVlcyB0byBiZSBwYXNzZWQgdG8gRG93bmxvYWRQcm92aWRlci5pbnNlcnQoKQorICAgICAgICAgKi8KKyAgICAgICAgQ29udGVudFZhbHVlcyB0b0NvbnRlbnRWYWx1ZXMoKSB7CisgICAgICAgICAgICBDb250ZW50VmFsdWVzIHZhbHVlcyA9IG5ldyBDb250ZW50VmFsdWVzKCk7CisgICAgICAgICAgICBhc3NlcnQgbVVyaSAhPSBudWxsOworICAgICAgICAgICAgdmFsdWVzLnB1dChEb3dubG9hZHMuQ09MVU1OX1VSSSwgbVVyaS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgaWYgKG1EZXN0aW5hdGlvblVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChEb3dubG9hZHMuQ09MVU1OX0RFU1RJTkFUSU9OLCBEb3dubG9hZHMuSW1wbC5ERVNUSU5BVElPTl9GSUxFX1VSSSk7CisgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChEb3dubG9hZHMuQ09MVU1OX0ZJTEVfTkFNRV9ISU5ULCBtRGVzdGluYXRpb25VcmkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlcy5wdXQoRG93bmxvYWRzLkNPTFVNTl9ERVNUSU5BVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2Fkcy5ERVNUSU5BVElPTl9DQUNIRV9QQVJUSVRJT05fUFVSR0VBQkxFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtUmVxdWVzdEhlYWRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyByZXF1ZXN0IGhlYWRlcnMgc3VwcG9ydAorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdXRJZk5vbk51bGwodmFsdWVzLCBEb3dubG9hZHMuQ09MVU1OX1RJVExFLCBtVGl0bGUpOworICAgICAgICAgICAgcHV0SWZOb25OdWxsKHZhbHVlcywgRG93bmxvYWRzLkNPTFVNTl9ERVNDUklQVElPTiwgbURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHB1dElmTm9uTnVsbCh2YWx1ZXMsIERvd25sb2Fkcy5DT0xVTU5fTUlNRV9UWVBFLCBtTWVkaWFUeXBlKTsKKworICAgICAgICAgICAgaW50IHZpc2liaWxpdHkgPSBEb3dubG9hZHMuVklTSUJJTElUWV9ISURERU47CisgICAgICAgICAgICBpZiAoKG1Ob3RpZmljYXRpb25GbGFncyAmIE5PVElGSUNBVElPTl9XSEVOX1JVTk5JTkcpICE9IDApIHsKKyAgICAgICAgICAgICAgICB2aXNpYmlsaXR5ID0gRG93bmxvYWRzLlZJU0lCSUxJVFlfVklTSUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlcy5wdXQoRG93bmxvYWRzLkNPTFVNTl9WSVNJQklMSVRZLCB2aXNpYmlsaXR5KTsKKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwdXRJZk5vbk51bGwoQ29udGVudFZhbHVlcyBjb250ZW50VmFsdWVzLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGVudFZhbHVlcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIG1heSBiZSB1c2VkIHRvIGZpbHRlciBkb3dubG9hZCBtYW5hZ2VyIHF1ZXJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeSB7CisgICAgICAgIHByaXZhdGUgTG9uZyBtSWQ7CisgICAgICAgIHByaXZhdGUgSW50ZWdlciBtU3RhdHVzRmxhZ3MgPSBudWxsOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmNsdWRlIG9ubHkgdGhlIGRvd25sb2FkIHdpdGggdGhlIGdpdmVuIElELgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUXVlcnkgc2V0RmlsdGVyQnlJZChsb25nIGlkKSB7CisgICAgICAgICAgICBtSWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluY2x1ZGUgb25seSBkb3dubG9hZHMgd2l0aCBzdGF0dXMgbWF0Y2hpbmcgYW55IHRoZSBnaXZlbiBzdGF0dXMgZmxhZ3MuCisgICAgICAgICAqIEBwYXJhbSBmbGFncyBhbnkgY29tYmluYXRpb24gb2YgdGhlIFNUQVRVU18qIGJpdCBmbGFncworICAgICAgICAgKiBAcmV0dXJuIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUXVlcnkgc2V0RmlsdGVyQnlTdGF0dXMoaW50IGZsYWdzKSB7CisgICAgICAgICAgICBtU3RhdHVzRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJ1biB0aGlzIHF1ZXJ5IHVzaW5nIHRoZSBnaXZlbiBDb250ZW50UmVzb2x2ZXIuCisgICAgICAgICAqIEBwYXJhbSBwcm9qZWN0aW9uIHRoZSBwcm9qZWN0aW9uIHRvIHBhc3MgdG8gQ29udGVudFJlc29sdmVyLnF1ZXJ5KCkKKyAgICAgICAgICogQHJldHVybiB0aGUgQ3Vyc29yIHJldHVybmVkIGJ5IENvbnRlbnRSZXNvbHZlci5xdWVyeSgpCisgICAgICAgICAqLworICAgICAgICBDdXJzb3IgcnVuUXVlcnkoQ29udGVudFJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmdbXSBwcm9qZWN0aW9uKSB7CisgICAgICAgICAgICBVcmkgdXJpID0gRG93bmxvYWRzLkNPTlRFTlRfVVJJOworICAgICAgICAgICAgU3RyaW5nIHNlbGVjdGlvbiA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChtSWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKHVyaSwgbUlkLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobVN0YXR1c0ZsYWdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gcGFydHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBpZiAoKG1TdGF0dXNGbGFncyAmIFNUQVRVU19QRU5ESU5HKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzdGF0dXNDbGF1c2UoIj0iLCBEb3dubG9hZHMuU1RBVFVTX1BFTkRJTkcpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChtU3RhdHVzRmxhZ3MgJiBTVEFUVVNfUlVOTklORykgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobVN0YXR1c0ZsYWdzICYgU1RBVFVTX1BBVVNFRCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19QRU5ESU5HX1BBVVNFRCkpOworICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hZGQoc3RhdHVzQ2xhdXNlKCI9IiwgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HX1BBVVNFRCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKG1TdGF0dXNGbGFncyAmIFNUQVRVU19TVUNDRVNTRlVMKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZChzdGF0dXNDbGF1c2UoIj0iLCBEb3dubG9hZHMuU1RBVFVTX1NVQ0NFU1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChtU3RhdHVzRmxhZ3MgJiBTVEFUVVNfRkFJTEVEKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFkZCgiKCIgKyBzdGF0dXNDbGF1c2UoIj49IiwgNDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIEFORCAiICsgc3RhdHVzQ2xhdXNlKCI8IiwgNjAwKSArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlbGVjdGlvbiA9IGpvaW5TdHJpbmdzKCIgT1IgIiwgcGFydHMpOworICAgICAgICAgICAgICAgIExvZy53KCJEb3dubG9hZE1hbmFnZXJQdWJsaWMiLCBzZWxlY3Rpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIG9yZGVyQnkgPSBEb3dubG9hZHMuQ09MVU1OX0xBU1RfTU9ESUZJQ0FUSU9OICsgIiBERVNDIjsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlci5xdWVyeSh1cmksIHByb2plY3Rpb24sIHNlbGVjdGlvbiwgbnVsbCwgb3JkZXJCeSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBqb2luU3RyaW5ncyhTdHJpbmcgam9pbmVyLCBJdGVyYWJsZTxTdHJpbmc+IHBhcnRzKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBwYXJ0IDogcGFydHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGpvaW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHBhcnQpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RhdHVzQ2xhdXNlKFN0cmluZyBvcGVyYXRvciwgaW50IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gRG93bmxvYWRzLkNPTFVNTl9TVEFUVVMgKyBvcGVyYXRvciArICInIiArIHZhbHVlICsgIiciOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZW50UmVzb2x2ZXIgbVJlc29sdmVyOworCisgICAgLyoqCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG93bmxvYWRNYW5hZ2VyKENvbnRlbnRSZXNvbHZlciByZXNvbHZlcikgeworICAgICAgICBtUmVzb2x2ZXIgPSByZXNvbHZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnF1ZXVlIGEgbmV3IGRvd25sb2FkLiAgVGhlIGRvd25sb2FkIHdpbGwgc3RhcnQgYXV0b21hdGljYWxseSBvbmNlIHRoZSBkb3dubG9hZCBtYW5hZ2VyIGlzCisgICAgICogcmVhZHkgdG8gZXhlY3V0ZSBpdCBhbmQgY29ubmVjdGl2aXR5IGlzIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHRoZSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhpcyBkb3dubG9hZAorICAgICAqIEByZXR1cm4gYW4gSUQgZm9yIHRoZSBkb3dubG9hZCwgdW5pcXVlIGFjcm9zcyB0aGUgc3lzdGVtLiAgVGhpcyBJRCBpcyB1c2VkIHRvIG1ha2UgZnV0dXJlCisgICAgICogY2FsbHMgcmVsYXRlZCB0byB0aGlzIGRvd25sb2FkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGVucXVldWUoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIENvbnRlbnRWYWx1ZXMgdmFsdWVzID0gcmVxdWVzdC50b0NvbnRlbnRWYWx1ZXMoKTsKKyAgICAgICAgVXJpIGRvd25sb2FkVXJpID0gbVJlc29sdmVyLmluc2VydChEb3dubG9hZHMuQ09OVEVOVF9VUkksIHZhbHVlcyk7CisgICAgICAgIGxvbmcgaWQgPSBMb25nLnBhcnNlTG9uZyhkb3dubG9hZFVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKSk7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSBkb3dubG9hZCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGRvd25sb2FkIG1hbmFnZXIuICBUaGUgZG93bmxvYWQgd2lsbCBiZSBzdG9wcGVkIGlmCisgICAgICogaXQgd2FzIHJ1bm5pbmcsIGFuZCBpdCB3aWxsIG5vIGxvbmdlciBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGRvd25sb2FkIG1hbmFnZXIuICBJZiBhIGZpbGUKKyAgICAgKiB3YXMgYWxyZWFkeSBkb3dubG9hZGVkLCBpdCB3aWxsIG5vdCBiZSBkZWxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZG93bmxvYWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmUobG9uZyBpZCkgeworICAgICAgICBpbnQgbnVtRGVsZXRlZCA9IG1SZXNvbHZlci5kZWxldGUoZ2V0RG93bmxvYWRVcmkoaWQpLCBudWxsLCBudWxsKTsKKyAgICAgICAgaWYgKG51bURlbGV0ZWQgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRG93bmxvYWQgIiArIGlkICsgIiBkb2VzIG5vdCBleGlzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIGRvd25sb2FkIG1hbmFnZXIgYWJvdXQgZG93bmxvYWRzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZC4KKyAgICAgKiBAcGFyYW0gcXVlcnkgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIGZpbHRlcnMgZm9yIHRoaXMgcXVlcnkKKyAgICAgKiBAcmV0dXJuIGEgQ3Vyc29yIG92ZXIgdGhlIHJlc3VsdCBzZXQgb2YgZG93bmxvYWRzLCB3aXRoIGNvbHVtbnMgY29uc2lzdGluZyBvZiBhbGwgdGhlCisgICAgICogQ09MVU1OXyogY29uc3RhbnRzLgorICAgICAqLworICAgIHB1YmxpYyBDdXJzb3IgcXVlcnkoUXVlcnkgcXVlcnkpIHsKKyAgICAgICAgQ3Vyc29yIHVuZGVybHlpbmdDdXJzb3IgPSBxdWVyeS5ydW5RdWVyeShtUmVzb2x2ZXIsIFVOREVSTFlJTkdfQ09MVU1OUyk7CisgICAgICAgIHJldHVybiBuZXcgQ3Vyc29yVHJhbnNsYXRvcih1bmRlcmx5aW5nQ3Vyc29yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGEgZG93bmxvYWRlZCBmaWxlIGZvciByZWFkaW5nLiAgVGhlIGRvd25sb2FkIG11c3QgaGF2ZSBjb21wbGV0ZWQuCisgICAgICogQHBhcmFtIGlkIHRoZSBJRCBvZiB0aGUgZG93bmxvYWQKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IHtAbGluayBQYXJjZWxGaWxlRGVzY3JpcHRvcn0KKyAgICAgKiBAdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0CisgICAgICovCisgICAgcHVibGljIFBhcmNlbEZpbGVEZXNjcmlwdG9yIG9wZW5Eb3dubG9hZGVkRmlsZShsb25nIGlkKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG1SZXNvbHZlci5vcGVuRmlsZURlc2NyaXB0b3IoZ2V0RG93bmxvYWRVcmkoaWQpLCAiciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgRG93bmxvYWRQcm92aWRlciBVUkkgZm9yIHRoZSBkb3dubG9hZCB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVyaSBnZXREb3dubG9hZFVyaShsb25nIGlkKSB7CisgICAgICAgIFVyaSBkb3dubG9hZFVyaSA9IFVyaS53aXRoQXBwZW5kZWRQYXRoKERvd25sb2Fkcy5DT05URU5UX1VSSSwgTG9uZy50b1N0cmluZyhpZCkpOworICAgICAgICByZXR1cm4gZG93bmxvYWRVcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBjbGFzcyB3cmFwcyBhIGN1cnNvciByZXR1cm5lZCBieSBEb3dubG9hZFByb3ZpZGVyIC0tIHRoZSAidW5kZXJseWluZyBjdXJzb3IiIC0tIGFuZAorICAgICAqIHByZXNlbnRzIGEgZGlmZmVyZW50IHNldCBvZiBjb2x1bW5zLCB0aG9zZSBkZWZpbmVkIGluIHRoZSBEb3dubG9hZE1hbmFnZXIuQ09MVU1OXyogY29uc3RhbnRzLgorICAgICAqIFNvbWUgY29sdW1ucyBjb3JyZXNwb25kIGRpcmVjdGx5IHRvIHVuZGVybHlpbmcgdmFsdWVzIHdoaWxlIG90aGVycyBhcmUgY29tcHV0ZWQgZnJvbQorICAgICAqIHVuZGVybHlpbmcgZGF0YS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXJzb3JUcmFuc2xhdG9yIGV4dGVuZHMgQ3Vyc29yV3JhcHBlciB7CisgICAgICAgIHB1YmxpYyBDdXJzb3JUcmFuc2xhdG9yKEN1cnNvciBjdXJzb3IpIHsKKyAgICAgICAgICAgIHN1cGVyKGN1cnNvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb2x1bW5JbmRleChTdHJpbmcgY29sdW1uTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoQ09MVU1OUykuaW5kZXhPZihjb2x1bW5OYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkluZGV4T3JUaHJvdyhTdHJpbmcgY29sdW1uTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRDb2x1bW5JbmRleChjb2x1bW5OYW1lKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbHVtbk5hbWUoaW50IGNvbHVtbkluZGV4KSB7CisgICAgICAgICAgICBpbnQgbnVtQ29sdW1ucyA9IENPTFVNTlMubGVuZ3RoOworICAgICAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSBudW1Db2x1bW5zKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCBjb2x1bW4gaW5kZXggIiArIGNvbHVtbkluZGV4ICsgIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBudW1Db2x1bW5zICsgIiBjb2x1bW5zIGV4aXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ09MVU1OU1tjb2x1bW5JbmRleF07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldENvbHVtbk5hbWVzKCkgeworICAgICAgICAgICAgU3RyaW5nW10gcmV0dXJuQ29sdW1ucyA9IG5ldyBTdHJpbmdbQ09MVU1OUy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShDT0xVTU5TLCAwLCByZXR1cm5Db2x1bW5zLCAwLCBDT0xVTU5TLmxlbmd0aCk7CisgICAgICAgICAgICByZXR1cm4gcmV0dXJuQ29sdW1uczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldENvbHVtbkNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIENPTFVNTlMubGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0QmxvYihpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGdldExvbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzTG9uZ0NvbHVtbihTdHJpbmcgY29sdW1uKSB7CisgICAgICAgICAgICByZXR1cm4gTE9OR19DT0xVTU5TLmNvbnRhaW5zKGNvbHVtbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgZ2V0RG91YmxlKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEludChpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KSBnZXRMb25nKGNvbHVtbkluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUxvbmcoZ2V0Q29sdW1uTmFtZShjb2x1bW5JbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzaG9ydCBnZXRTaG9ydChpbnQgY29sdW1uSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiAoc2hvcnQpIGdldExvbmcoY29sdW1uSW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBjb2x1bW5JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZVN0cmluZyhnZXRDb2x1bW5OYW1lKGNvbHVtbkluZGV4KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB0cmFuc2xhdGVTdHJpbmcoU3RyaW5nIGNvbHVtbikgeworICAgICAgICAgICAgaWYgKGlzTG9uZ0NvbHVtbihjb2x1bW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodHJhbnNsYXRlTG9uZyhjb2x1bW4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9USVRMRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ1N0cmluZyhEb3dubG9hZHMuQ09MVU1OX1RJVExFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9ERVNDUklQVElPTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ1N0cmluZyhEb3dubG9hZHMuQ09MVU1OX0RFU0NSSVBUSU9OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9VUkkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLkNPTFVNTl9VUkkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbHVtbi5lcXVhbHMoQ09MVU1OX01FRElBX1RZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLkNPTFVNTl9NSU1FX1RZUEUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0IGNvbHVtbi5lcXVhbHMoQ09MVU1OX0xPQ0FMX1VSSSk7CisgICAgICAgICAgICByZXR1cm4gVXJpLmZyb21GaWxlKG5ldyBGaWxlKGdldFVuZGVybHlpbmdTdHJpbmcoRG93bmxvYWRzLl9EQVRBKSkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgdHJhbnNsYXRlTG9uZyhTdHJpbmcgY29sdW1uKSB7CisgICAgICAgICAgICBpZiAoIWlzTG9uZ0NvbHVtbihjb2x1bW4pKSB7CisgICAgICAgICAgICAgICAgLy8gbWltaWMgYmVoYXZpb3Igb2YgdW5kZXJseWluZyBjdXJzb3IgLS0gbW9zdCBsaWtlbHksIHRocm93IE51bWJlckZvcm1hdEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YodHJhbnNsYXRlU3RyaW5nKGNvbHVtbikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29sdW1uLmVxdWFscyhDT0xVTU5fSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVybHlpbmdMb25nKERvd25sb2Fkcy5JbXBsLl9JRCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sdW1uLmVxdWFscyhDT0xVTU5fVE9UQUxfU0laRV9CWVRFUykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkNPTFVNTl9UT1RBTF9CWVRFUyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29sdW1uLmVxdWFscyhDT0xVTU5fU1RBVFVTKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVTdGF0dXMoKGludCkgZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkNPTFVNTl9TVEFUVVMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9FUlJPUl9DT0RFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoKGludCkgZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkNPTFVNTl9TVEFUVVMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb2x1bW4uZXF1YWxzKENPTFVNTl9CWVRFU19ET1dOTE9BREVEX1NPX0ZBUikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkNPTFVNTl9DVVJSRU5UX0JZVEVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBjb2x1bW4uZXF1YWxzKENPTFVNTl9MQVNUX01PRElGSUVEX1RJTUVTVEFNUCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0VW5kZXJseWluZ0xvbmcoRG93bmxvYWRzLkNPTFVNTl9MQVNUX01PRElGSUNBVElPTik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgdHJhbnNsYXRlRXJyb3JDb2RlKGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2xhdGVTdGF0dXMoc3RhdHVzKSAhPSBTVEFUVVNfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7IC8vIGFyYml0cmFyeSB2YWx1ZSB3aGVuIHN0YXR1cyBpcyBub3QgYW4gZXJyb3IKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoNDAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPCA0OTApIHx8ICg1MDAgPD0gc3RhdHVzICYmIHN0YXR1cyA8IDYwMCkpIHsKKyAgICAgICAgICAgICAgICAvLyBIVFRQIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfRklMRV9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0ZJTEVfRVJST1I7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfVU5IQU5ETEVEX0hUVFBfQ09ERToKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfVU5IQU5ETEVEX1JFRElSRUNUOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5IQU5ETEVEX0hUVFBfQ09ERTsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19IVFRQX0RBVEFfRVJST1I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9IVFRQX0RBVEFfRVJST1I7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfVE9PX01BTllfUkVESVJFQ1RTOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfVE9PX01BTllfUkVESVJFQ1RTOworCisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX0lOU1VGRklDSUVOVF9TUEFDRV9FUlJPUjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lOU1VGRklDSUVOVF9TUEFDRTsKKworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19ERVZJQ0VfTk9UX0ZPVU5EX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfREVWSUNFX05PVF9GT1VORDsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIGdldFVuZGVybHlpbmdMb25nKFN0cmluZyBjb2x1bW4pIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRMb25nKHN1cGVyLmdldENvbHVtbkluZGV4KGNvbHVtbikpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5kZXJseWluZ1N0cmluZyhTdHJpbmcgY29sdW1uKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U3RyaW5nKHN1cGVyLmdldENvbHVtbkluZGV4KGNvbHVtbikpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBsb25nIHRyYW5zbGF0ZVN0YXR1cyhpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19QRU5ESU5HOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX1BFTkRJTkc7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfUlVOTklORzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19SVU5OSU5HOworCisgICAgICAgICAgICAgICAgY2FzZSBEb3dubG9hZHMuU1RBVFVTX1BFTkRJTkdfUEFVU0VEOgorICAgICAgICAgICAgICAgIGNhc2UgRG93bmxvYWRzLlNUQVRVU19SVU5OSU5HX1BBVVNFRDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19QQVVTRUQ7CisKKyAgICAgICAgICAgICAgICBjYXNlIERvd25sb2Fkcy5TVEFUVVNfU1VDQ0VTUzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19TVUNDRVNTRlVMOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IERvd25sb2Fkcy5pc1N0YXR1c0Vycm9yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRkFJTEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvRG93bmxvYWRzLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQppbmRleCAzNDhlOWU4Li4xYTRmOGMwIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9Eb3dubG9hZHMuamF2YQpAQCAtODk5LDYgKzg5OSwxMiBAQAogICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVNUSU5BVElPTl9DQUNIRV9QQVJUSVRJT05fTk9ST0FNSU5HID0gMzsKIAogICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBkb3dubG9hZCB3aWxsIGJlIHNhdmVkIHRvIHRoZSBsb2NhdGlvbiBnaXZlbiBieSB0aGUgZmlsZSBVUkkgaW4KKyAgICAgICAgICoge0BsaW5rICNDT0xVTU5fRklMRV9OQU1FX0hJTlR9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVTVElOQVRJT05fRklMRV9VUkkgPSA0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGRvd25sb2FkIGlzIGFsbG93ZWQgdG8gcnVuLgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVFJPTF9SVU4gPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhIGIvY29yZS9qYXZhL2FuZHJvaWQvc2VydmljZS93YWxscGFwZXIvV2FsbHBhcGVyU2VydmljZS5qYXZhCmluZGV4IDZmMTJmMTkuLmUyNmEwOTAgMTAwNjQ0Ci0tLSBhL2NvcmUvamF2YS9hbmRyb2lkL3NlcnZpY2Uvd2FsbHBhcGVyL1dhbGxwYXBlclNlcnZpY2UuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC9zZXJ2aWNlL3dhbGxwYXBlci9XYWxscGFwZXJTZXJ2aWNlLmphdmEKQEAgLTMzNiw3ICszMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICA/IChtV2luZG93RmxhZ3MmfldpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSkKICAgICAgICAgICAgICAgICAgICAgOiAobVdpbmRvd0ZsYWdzfFdpbmRvd01hbmFnZXIuTGF5b3V0UGFyYW1zLkZMQUdfTk9UX1RPVUNIQUJMRSk7CiAgICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAKQEAgLTQyMSw2ICs0MjEsMTMgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZW5pZW5jZSBmb3Ige0BsaW5rIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syI3N1cmZhY2VSZWRyYXdOZWVkZWQKKyAgICAgICAgICogU3VyZmFjZUhvbGRlci5DYWxsYmFjay5zdXJmYWNlUmVkcmF3TmVlZGVkKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdXJmYWNlUmVkcmF3TmVlZGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKICAgICAgICAgICogQ29udmVuaWVuY2UgZm9yIHtAbGluayBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrI3N1cmZhY2VDcmVhdGVkCiAgICAgICAgICAqIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2suc3VyZmFjZUNyZWF0ZWQoKX0uCiAgICAgICAgICAqLwpAQCAtNDUwLDcgKzQ1Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIHVwZGF0ZVN1cmZhY2UoYm9vbGVhbiBmb3JjZVJlbGF5b3V0LCBib29sZWFuIGZvcmNlUmVwb3J0KSB7CisgICAgICAgIHZvaWQgdXBkYXRlU3VyZmFjZShib29sZWFuIGZvcmNlUmVsYXlvdXQsIGJvb2xlYW4gZm9yY2VSZXBvcnQsIGJvb2xlYW4gcmVkcmF3TmVlZGVkKSB7CiAgICAgICAgICAgICBpZiAobURlc3Ryb3llZCkgewogICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIHVwZGF0ZVN1cmZhY2U6IGRlc3Ryb3llZCIpOwogICAgICAgICAgICAgfQpAQCAtNDY3LDcgKzQ3NCw3IEBACiAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHR5cGVDaGFuZ2VkID0gbVR5cGUgIT0gbVN1cmZhY2VIb2xkZXIuZ2V0UmVxdWVzdGVkVHlwZSgpOwogICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmbGFnc0NoYW5nZWQgPSBtQ3VyV2luZG93RmxhZ3MgIT0gbVdpbmRvd0ZsYWdzOwogICAgICAgICAgICAgaWYgKGZvcmNlUmVsYXlvdXQgfHwgY3JlYXRpbmcgfHwgc3VyZmFjZUNyZWF0aW5nIHx8IGZvcm1hdENoYW5nZWQgfHwgc2l6ZUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgfHwgdHlwZUNoYW5nZWQgfHwgZmxhZ3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGVDaGFuZ2VkIHx8IGZsYWdzQ2hhbmdlZCB8fCByZWRyYXdOZWVkZWQpIHsKIAogICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiQ2hhbmdlczogY3JlYXRpbmc9IiArIGNyZWF0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9ybWF0PSIgKyBmb3JtYXRDaGFuZ2VkICsgIiBzaXplPSIgKyBzaXplQ2hhbmdlZCk7CkBAIC01NTUsNiArNTYyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZHJhd05lZWRlZCB8PSBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocmVsYXlvdXRSZXN1bHQmV2luZG93TWFuYWdlckltcGwuUkVMQVlPVVRfRklSU1RfVElNRSkgIT0gMDsKKwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlUmVwb3J0IHx8IGNyZWF0aW5nIHx8IHN1cmZhY2VDcmVhdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBmb3JtYXRDaGFuZ2VkIHx8IHNpemVDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CkBAIC01NzgsMTAgKzU4OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVkcmF3TmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TdXJmYWNlUmVkcmF3TmVlZGVkKG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIGNhbGxiYWNrc1tdID0gbVN1cmZhY2VIb2xkZXIuZ2V0Q2FsbGJhY2tzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYyBpbnN0YW5jZW9mIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiljKS5zdXJmYWNlUmVkcmF3TmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNDcmVhdGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VDcmVhdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGluZyB8fCAocmVsYXlvdXRSZXN1bHQmV2luZG93TWFuYWdlckltcGwuUkVMQVlPVVRfRklSU1RfVElNRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZHJhd05lZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uLmZpbmlzaERyYXdpbmcobVdpbmRvdyk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYxOCw3ICs2NDMsNyBAQAogICAgICAgICAgICAgb25DcmVhdGUobVN1cmZhY2VIb2xkZXIpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBtSW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICB1cGRhdGVTdXJmYWNlKGZhbHNlLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIAogICAgICAgICB2b2lkIGRvRGVzaXJlZFNpemVDaGFuZ2VkKGludCBkZXNpcmVkV2lkdGgsIGludCBkZXNpcmVkSGVpZ2h0KSB7CkBAIC02NDcsNyArNjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGJlY29taW5nIHZpc2libGUsIGluIHByZXZpZXcgbW9kZSB0aGUgc3VyZmFjZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgc28gbm93IHdlIG5lZWQgdG8gbWFrZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VyZSBpdCBpcyByZS1jcmVhdGVkLgotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3VyZmFjZShmYWxzZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBvblZpc2liaWxpdHlDaGFuZ2VkKHZpc2libGUpOwogICAgICAgICAgICAgICAgIH0KQEAgLTg1Miw3ICs4NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9TVVJGQUNFOgotICAgICAgICAgICAgICAgICAgICBtRW5naW5lLnVwZGF0ZVN1cmZhY2UodHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBtRW5naW5lLnVwZGF0ZVN1cmZhY2UodHJ1ZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVklTSUJJTElUWV9DSEFOR0VEOgogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlZpc2liaWxpdHkgY2hhbmdlIGluICIgKyBtRW5naW5lCkBAIC04NjgsMTQgKzg5Myw4IEBACiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIE1TR19XSU5ET1dfUkVTSVpFRDogewogICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlcG9ydERyYXcgPSBtZXNzYWdlLmFyZzEgIT0gMDsKLSAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS51cGRhdGVTdXJmYWNlKHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS51cGRhdGVTdXJmYWNlKHRydWUsIGZhbHNlLCByZXBvcnREcmF3KTsKICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS5kb09mZnNldHNDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXBvcnREcmF3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUubVNlc3Npb24uZmluaXNoRHJhd2luZyhtRW5naW5lLm1XaW5kb3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVE9VQ0hfRVZFTlQ6IHsKICAgICAgICAgICAgICAgICAgICAgTW90aW9uRXZlbnQgZXYgPSAoTW90aW9uRXZlbnQpbWVzc2FnZS5vYmo7CmRpZmYgLS1naXQgYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKaW5kZXggMGJmYjZkNi4uOWMwNTAwOCAxMDA3NTUKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuamF2YQpAQCAtMTI0LDExICsxMjQsMjcgQEAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1BBR0VfRE9XTiAgICAgICA9IDkzOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfUElDVFNZTUJPTFMgICAgID0gOTQ7ICAgLy8gc3dpdGNoIHN5bWJvbC1zZXRzIChFbW9qaSxLYW8tbW9qaSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX1NXSVRDSF9DSEFSU0VUICA9IDk1OyAgIC8vIHN3aXRjaCBjaGFyLXNldHMgKEthbmppLEthdGFrYW5hKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX0EgICAgICAgID0gOTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fQiAgICAgICAgPSA5NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBLRVlDT0RFX0JVVFRPTl9DICAgICAgICA9IDk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEtFWUNPREVfQlVUVE9OX1ggICAgICAgID0gOTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fWSAgICAgICAgPSAxMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fWiAgICAgICAgPSAxMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fTDEgICAgICAgPSAxMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fUjEgICAgICAgPSAxMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fTDIgICAgICAgPSAxMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fUjIgICAgICAgPSAxMDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fVEhVTUJMICAgPSAxMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fVEhVTUJSICAgPSAxMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fU1RBUlQgICAgPSAxMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fU0VMRUNUICAgPSAxMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgS0VZQ09ERV9CVVRUT05fTU9ERSAgICAgPSAxMTA7CiAKICAgICAvLyBOT1RFOiBJZiB5b3UgYWRkIGEgbmV3IGtleWNvZGUgaGVyZSB5b3UgbXVzdCBhbHNvIGFkZCBpdCB0bzoKICAgICAvLyAgaXNTeXN0ZW0oKQogICAgIC8vICBuYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2tleWNvZGVzLmgKICAgICAvLyAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvdWkvS2V5Y29kZUxhYmVscy5oCisgICAgLy8gIGV4dGVybmFsL3dlYmtpdC9XZWJLaXQvYW5kcm9pZC9wbHVnaW5zL0FOUEtleUNvZGVzLmgKICAgICAvLyAgdG9vbHMvcHVwcGV0X21hc3Rlci9QdXBwZXRNYXN0ZXIvbmF2X2tleXMucHkKICAgICAvLyAgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCiAgICAgLy8gIGNvbW1hbmRzL21vbmtleS9Nb25rZXkuamF2YQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TdXJmYWNlSG9sZGVyLmphdmEgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXIuamF2YQppbmRleCAzNGU0NjM4Li4wZDM4ZjdiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXIuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VIb2xkZXIuamF2YQpAQCAtMTE5LDYgKzExOSwyMyBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIEFkZGl0aW9uYWwgY2FsbGJhY2tzIHRoYXQgY2FuIGJlIHJlY2VpdmVkIGZvciB7QGxpbmsgQ2FsbGJhY2t9LgorICAgICAqLworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2FsbGJhY2syIGV4dGVuZHMgQ2FsbGJhY2sgeworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHJlZHJhdyB0aGUgY29udGVudCBvZiBpdHMKKyAgICAgICAgICogc3VyZmFjZSwgYWZ0ZXIgaXQgaXMgcmVzaXplZCBvciBmb3Igc29tZSBvdGhlciByZWFzb24uICBCeSBub3QKKyAgICAgICAgICogcmV0dXJuaW5nIGhlcmUgdW50aWwgdGhlIHJlZHJhdyBpcyBjb21wbGV0ZSwgeW91IGNhbiBlbnN1cmUgdGhhdAorICAgICAgICAgKiB0aGUgdXNlciB3aWxsIG5vdCBzZWUgeW91ciBzdXJmYWNlIGluIGEgYmFkIHN0YXRlIChhdCBpdHMgbmV3CisgICAgICAgICAqIHNpemUgYmVmb3JlIGl0IGhhcyBiZWVuIGNvcnJlY3RseSBkcmF3biB0aGF0IHdheSkuICBUaGlzIHdpbGwKKyAgICAgICAgICogdHlwaWNhbGx5IGJlIHByZWNlZWRlZCBieSBhIGNhbGwgdG8ge0BsaW5rICNzdXJmYWNlQ2hhbmdlZH0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBob2xkZXIgVGhlIFN1cmZhY2VIb2xkZXIgd2hvc2Ugc3VyZmFjZSBoYXMgY2hhbmdlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VSZWRyYXdOZWVkZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpOworICAgIH0KKworICAgIC8qKgogICAgICAqIEFkZCBhIENhbGxiYWNrIGludGVyZmFjZSBmb3IgdGhpcyBob2xkZXIuICBUaGVyZSBjYW4gc2V2ZXJhbCBDYWxsYmFjawogICAgICAqIGludGVyZmFjZXMgYXNzb2NpYXRlZCB0byBhIGhvbGRlci4KICAgICAgKiAKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZVZpZXcuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvU3VyZmFjZVZpZXcuamF2YQppbmRleCBlNGQxYWUxLi5jNDY5YmNjIDEwMDY0NAotLS0gYS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1N1cmZhY2VWaWV3LmphdmEKKysrIGIvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9TdXJmYWNlVmlldy5qYXZhCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGFuZGxlR2V0TmV3U3VyZmFjZSgpOwogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfV0lORE9XX01TRzogewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICBmaW5hbCBWaWV3VHJlZU9ic2VydmVyLk9uU2Nyb2xsQ2hhbmdlZExpc3RlbmVyIG1TY3JvbGxDaGFuZ2VkTGlzdGVuZXIKICAgICAgICAgICAgID0gbmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2Nyb2xsQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfTsKICAgICAgICAgICAgIApAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICAgIHN1cGVyLm9uV2luZG93VmlzaWJpbGl0eUNoYW5nZWQodmlzaWJpbGl0eSk7CiAgICAgICAgIG1XaW5kb3dWaXNpYmlsaXR5ID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwogICAgICAgICBtUmVxdWVzdGVkVmlzaWJsZSA9IG1XaW5kb3dWaXNpYmlsaXR5ICYmIG1WaWV3VmlzaWJpbGl0eTsKLSAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0yMTgsNyArMjE4LDcgQEAKICAgICAgICAgc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKICAgICAgICAgbVZpZXdWaXNpYmlsaXR5ID0gdmlzaWJpbGl0eSA9PSBWSVNJQkxFOwogICAgICAgICBtUmVxdWVzdGVkVmlzaWJsZSA9IG1XaW5kb3dWaXNpYmlsaXR5ICYmIG1WaWV3VmlzaWJpbGl0eTsKLSAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzaG93U3VyZmFjZSgpIHsKICAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyh0cnVlKTsKKyAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyh0cnVlLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI2NSw3ICsyNjUsNyBAQAogICAgIHByb3RlY3RlZCB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewogICAgICAgICBnZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlT25TY3JvbGxDaGFuZ2VkTGlzdGVuZXIobVNjcm9sbENoYW5nZWRMaXN0ZW5lcik7CiAgICAgICAgIG1SZXF1ZXN0ZWRWaXNpYmxlID0gZmFsc2U7Ci0gICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICBtSGF2ZUZyYW1lID0gZmFsc2U7CiAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKICAgICAgICAgICAgIHRyeSB7CkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBvblNpemVDaGFuZ2VkKGludCB3LCBpbnQgaCwgaW50IG9sZHcsIGludCBvbGRoKSB7CiAgICAgICAgIHN1cGVyLm9uU2l6ZUNoYW5nZWQodywgaCwgb2xkdywgb2xkaCk7Ci0gICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMzQzLDcgKzM0Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gcmVwb3NpdGlvbiBvdXJzZWx2ZXMgd2hlcmUgdGhlIHN1cmZhY2UgaXMgCiAgICAgICAgIG1IYXZlRnJhbWUgPSB0cnVlOwotICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UsIGZhbHNlKTsKICAgICAgICAgc3VwZXIuZGlzcGF0Y2hEcmF3KGNhbnZhcyk7CiAgICAgfQogCkBAIC0zOTcsNyArMzk3LDcgQEAKICAgICAgICAgbVdpbmRvd1R5cGUgPSB0eXBlOwogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaW5kb3coYm9vbGVhbiBmb3JjZSkgeworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVXaW5kb3coYm9vbGVhbiBmb3JjZSwgYm9vbGVhbiByZWRyYXdOZWVkZWQpIHsKICAgICAgICAgaWYgKCFtSGF2ZUZyYW1lKSB7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTQyNSw3ICs0MjUsNyBAQAogICAgICAgICBmaW5hbCBib29sZWFuIHR5cGVDaGFuZ2VkID0gbVR5cGUgIT0gbVJlcXVlc3RlZFR5cGU7CiAgICAgICAgIGlmIChmb3JjZSB8fCBjcmVhdGluZyB8fCBmb3JtYXRDaGFuZ2VkIHx8IHNpemVDaGFuZ2VkIHx8IHZpc2libGVDaGFuZ2VkCiAgICAgICAgICAgICB8fCB0eXBlQ2hhbmdlZCB8fCBtTGVmdCAhPSBtTG9jYXRpb25bMF0gfHwgbVRvcCAhPSBtTG9jYXRpb25bMV0KLSAgICAgICAgICAgIHx8IG1VcGRhdGVXaW5kb3dOZWVkZWQgfHwgbVJlcG9ydERyYXdOZWVkZWQpIHsKKyAgICAgICAgICAgIHx8IG1VcGRhdGVXaW5kb3dOZWVkZWQgfHwgbVJlcG9ydERyYXdOZWVkZWQgfHwgcmVkcmF3TmVlZGVkKSB7CiAKICAgICAgICAgICAgIGlmIChsb2NhbExPR1YpIExvZy5pKFRBRywgIkNoYW5nZXM6IGNyZWF0aW5nPSIgKyBjcmVhdGluZwogICAgICAgICAgICAgICAgICAgICArICIgZm9ybWF0PSIgKyBmb3JtYXRDaGFuZ2VkICsgIiBzaXplPSIgKyBzaXplQ2hhbmdlZApAQCAtNTI0LDYgKzUyNCw4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVkcmF3TmVlZGVkIHw9IGNyZWF0aW5nIHwgcmVwb3J0RHJhd05lZWRlZDsKKwogICAgICAgICAgICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbURlc3Ryb3lSZXBvcnROZWVkZWQgPSB0cnVlOwogCkBAIC01NDEsOCArNTQzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRpbmcgfHwgZm9ybWF0Q2hhbmdlZCB8fCBzaXplQ2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB2aXNpYmxlQ2hhbmdlZCB8fCByZWFsU2l6ZUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWRyYXdOZWVkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgYyA6IGNhbGxiYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnN1cmZhY2VDaGFuZ2VkKG1TdXJmYWNlSG9sZGVyLCBtRm9ybWF0LCBteVdpZHRoLCBteUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU3VyZmFjZUhvbGRlci5DYWxsYmFjazIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoU3VyZmFjZUhvbGRlci5DYWxsYmFjazIpYykuc3VyZmFjZVJlZHJhd05lZWRlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2VIb2xkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTUwLDcgKzU1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICBtSXNDcmVhdGluZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3JlYXRpbmcgfHwgcmVwb3J0RHJhd05lZWRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVkcmF3TmVlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbi5maW5pc2hEcmF3aW5nKG1XaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTgwLDcgKzU4Nyw3IEBACiAKICAgICB2b2lkIGhhbmRsZUdldE5ld1N1cmZhY2UoKSB7CiAgICAgICAgIG1OZXdTdXJmYWNlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlKTsKKyAgICAgICAgdXBkYXRlV2luZG93KGZhbHNlLCBmYWxzZSk7CiAgICAgfQogCiAgICAgLyoqCkBAIC02OTYsNyArNzAzLDcgQEAKIAogICAgICAgICAgICAgbVJlcXVlc3RlZEZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgIGlmIChtV2luZG93ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVXaW5kb3coZmFsc2UpOworICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTcxMyw3ICs3MjAsNyBAQAogICAgICAgICAgICAgY2FzZSBTVVJGQUNFX1RZUEVfUFVTSF9CVUZGRVJTOgogICAgICAgICAgICAgICAgIG1SZXF1ZXN0ZWRUeXBlID0gdHlwZTsKICAgICAgICAgICAgICAgICBpZiAobVdpbmRvdyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVdpbmRvdyhmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQppbmRleCBmYjQ1OTcxLi4yNjBiZjdiYyAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9WaWV3Um9vdC5qYXZhCisrKyBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvVmlld1Jvb3QuamF2YQpAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgaW50IG1WaWV3VmlzaWJpbGl0eTsKICAgICBib29sZWFuIG1BcHBWaXNpYmxlID0gdHJ1ZTsKIAotICAgIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgbVN1cmZhY2VIb2xkZXJDYWxsYmFjazsKKyAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiBtU3VyZmFjZUhvbGRlckNhbGxiYWNrOwogICAgIEJhc2VTdXJmYWNlSG9sZGVyIG1TdXJmYWNlSG9sZGVyOwogICAgIGJvb2xlYW4gbUlzQ3JlYXRpbmc7CiAgICAgYm9vbGVhbiBtRHJhd2luZ0FsbG93ZWQ7CkBAIC0xMjYzLDYgKzEyNjMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgTG9nLnYoIlZpZXdSb290IiwgIkZJTklTSEVEIERSQVdJTkc6ICIgKyBtV2luZG93QXR0cmlidXRlcy5nZXRUaXRsZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVJlcG9ydE5leHREcmF3ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlSG9sZGVyICE9IG51bGwgJiYgbVN1cmZhY2UuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyQ2FsbGJhY2suc3VyZmFjZVJlZHJhd05lZWRlZChtU3VyZmFjZUhvbGRlcik7CisgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgY2FsbGJhY2tzW10gPSBtU3VyZmFjZUhvbGRlci5nZXRDYWxsYmFja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2sgYyA6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjIGluc3RhbmNlb2YgU3VyZmFjZUhvbGRlci5DYWxsYmFjazIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiljKS5zdXJmYWNlUmVkcmF3TmVlZGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJmYWNlSG9sZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgc1dpbmRvd1Nlc3Npb24uZmluaXNoRHJhd2luZyhtV2luZG93KTsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YSBiL2NvcmUvamF2YS9hbmRyb2lkL3ZpZXcvV2luZG93LmphdmEKaW5kZXggZjQwNzM0Yi4uMTFjMDljMSAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9XaW5kb3cuamF2YQorKysgYi9jb3JlL2phdmEvYW5kcm9pZC92aWV3L1dpbmRvdy5qYXZhCkBAIC00NzgsNyArNDc4LDcgQEAKICAgICAgKiB0byBvcGVyYXRlIChzdWNoIGFzIGZvciByZWNlaXZpbmcgaW5wdXQgZXZlbnRzKS4gIFRoZSBnaXZlbiBTdXJmYWNlSG9sZGVyCiAgICAgICogY2FsbGJhY2sgd2lsbCBiZSB1c2VkIHRvIHRlbGwgeW91IGFib3V0IHN0YXRlIGNoYW5nZXMgdG8gdGhlIHN1cmZhY2UuCiAgICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGFrZVN1cmZhY2UoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjYWxsYmFjayk7CisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdGFrZVN1cmZhY2UoU3VyZmFjZUhvbGRlci5DYWxsYmFjazIgY2FsbGJhY2spOwogICAgIAogICAgIC8qKgogICAgICAqIFRha2Ugb3duZXJzaGlwIG9mIHRoaXMgd2luZG93J3MgSW5wdXRRdWV1ZS4gIFRoZSB3aW5kb3cgd2lsbCBubwpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvUm9vdFZpZXdTdXJmYWNlVGFrZXIuamF2YSBiL2NvcmUvamF2YS9jb20vYW5kcm9pZC9pbnRlcm5hbC92aWV3L1Jvb3RWaWV3U3VyZmFjZVRha2VyLmphdmEKaW5kZXggN2ZmOGQ0Yy4uOWMxYjU1OCAxMDA2NDQKLS0tIGEvY29yZS9qYXZhL2NvbS9hbmRyb2lkL2ludGVybmFsL3ZpZXcvUm9vdFZpZXdTdXJmYWNlVGFrZXIuamF2YQorKysgYi9jb3JlL2phdmEvY29tL2FuZHJvaWQvaW50ZXJuYWwvdmlldy9Sb290Vmlld1N1cmZhY2VUYWtlci5qYXZhCkBAIC01LDcgKzUsNyBAQAogCiAvKiogaGFoYWhhaCAqLwogcHVibGljIGludGVyZmFjZSBSb290Vmlld1N1cmZhY2VUYWtlciB7Ci0gICAgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB3aWxsWW91VGFrZVRoZVN1cmZhY2UoKTsKKyAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiB3aWxsWW91VGFrZVRoZVN1cmZhY2UoKTsKICAgICB2b2lkIHNldFN1cmZhY2VUeXBlKGludCB0eXBlKTsKICAgICB2b2lkIHNldFN1cmZhY2VGb3JtYXQoaW50IGZvcm1hdCk7CiAgICAgdm9pZCBzZXRTdXJmYWNlS2VlcFNjcmVlbk9uKGJvb2xlYW4ga2VlcE9uKTsKZGlmZiAtLWdpdCBhL2NvcmUvam5pL0FjdGl2aXR5TWFuYWdlci5jcHAgYi9jb3JlL2puaS9BY3Rpdml0eU1hbmFnZXIuY3BwCmluZGV4IDg5NTBkZmIuLjBiZDE0ZmEgMTAwNjQ0Ci0tLSBhL2NvcmUvam5pL0FjdGl2aXR5TWFuYWdlci5jcHAKKysrIGIvY29yZS9qbmkvQWN0aXZpdHlNYW5hZ2VyLmNwcApAQCAtMzksNyArMzksNyBAQAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYodXJpKTsKICAgICAgICAgc3RhdHVzX3QgcmV0ID0gYW0tPnRyYW5zYWN0KE9QRU5fQ09OVEVOVF9VUklfVFJBTlNBQ1RJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGludDMyX3QgZXhjZXB0aW9uQ29kZSA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50MzJfdCBleGNlcHRpb25Db2RlID0gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKTsKICAgICAgICAgICAgIGlmICghZXhjZXB0aW9uQ29kZSkgewogICAgICAgICAgICAgICAgIC8vIFN1Y2Nlc3MgaXMgaW5kaWNhdGVkIGhlcmUgYnkgYSBub256ZXJvIGludCBmb2xsb3dlZCBieSB0aGUgZmQ7CiAgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBieSBhIHplcm8gaW50IHdpdGggbm8gZGF0YSBmb2xsb3dpbmcuCmRpZmYgLS1naXQgYS9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAgYi9jb3JlL2puaS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5jcHAKaW5kZXggNTRhOWMyYS4uYWNiZjg1NCAxMDA2NDQKLS0tIGEvY29yZS9qbmkvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuY3BwCisrKyBiL2NvcmUvam5pL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8cG9sbC5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX3ZpZXdfU3VyZmFjZS5oPgpAQCAtMzMsNiArMzQsOSBAQAogI2luY2x1ZGUgImFuZHJvaWRfdmlld19JbnB1dENoYW5uZWwuaCIKICNpbmNsdWRlICJhbmRyb2lkX3ZpZXdfS2V5RXZlbnQuaCIKIAorLy8jZGVmaW5lIExPR19UUkFDRSguLi4pCisjZGVmaW5lIExPR19UUkFDRSguLi4pIExPRyhMT0dfREVCVUcsIExPR19UQUcsIF9fVkFfQVJHU19fKQorCiBuYW1lc3BhY2UgYW5kcm9pZAogewogCkBAIC00Miw2ICs0Niw4IEBACiAgICAgam1ldGhvZElEIGRpc3BhdGNoVW5oYW5kbGVkS2V5RXZlbnQ7CiAgICAgam1ldGhvZElEIHNldFdpbmRvd0ZsYWdzOwogICAgIGptZXRob2RJRCBzZXRXaW5kb3dGb3JtYXQ7CisgICAgam1ldGhvZElEIHNob3dJbWU7CisgICAgam1ldGhvZElEIGhpZGVJbWU7CiB9IGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mbzsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01Niw2ICs2Miw4IEBACiAgICAgQ01EX0RFRl9LRVkgPSAxLAogICAgIENNRF9TRVRfV0lORE9XX0ZPUk1BVCwKICAgICBDTURfU0VUX1dJTkRPV19GTEFHUywKKyAgICBDTURfU0hPV19TT0ZUX0lOUFVULAorICAgIENNRF9ISURFX1NPRlRfSU5QVVQsCiB9OwogCiBzdGF0aWMgdm9pZCB3cml0ZV93b3JrKGludCBmZCwgaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMT0wLCBpbnQzMl90IGFyZzI9MCkgewpAQCAtNjQsNiArNzIsOCBAQAogICAgIHdvcmsuYXJnMSA9IGFyZzE7CiAgICAgd29yay5hcmcyID0gYXJnMjsKICAgICAKKyAgICBMT0dfVFJBQ0UoIndyaXRlX3dvcms6IGNtZD0lZCIsIGNtZCk7CisKIHJlc3RhcnQ6CiAgICAgaW50IHJlcyA9IHdyaXRlKGZkLCAmd29yaywgc2l6ZW9mKHdvcmspKTsKICAgICBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgewpAQCAtODgsNDMgKzk4LDE3NyBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLyoKLSAqIFNwZWNpYWxpemVkIGlucHV0IHF1ZXVlIHRoYXQgYWxsb3dzIHVuaGFuZGxlZCBrZXkgZXZlbnRzIHRvIGJlIGRpc3BhdGNoZWQKLSAqIGJhY2sgdG8gdGhlIG5hdGl2ZSBhY3Rpdml0eSdzIEphdmEgZnJhbWV3b3JrIGNvZGUuCi0gKi8KLXN0cnVjdCBNeUlucHV0UXVldWUgOiBBSW5wdXRRdWV1ZSB7Ci0gICAgZXhwbGljaXQgTXlJbnB1dFF1ZXVlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklucHV0Q2hhbm5lbD4mIGNoYW5uZWwsIGludCB3b3JrV3JpdGUpCi0gICAgICAgIDogQUlucHV0UXVldWUoY2hhbm5lbCksIG1Xb3JrV3JpdGUod29ya1dyaXRlKSB7Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitBSW5wdXRRdWV1ZTo6QUlucHV0UXVldWUoY29uc3Qgc3A8SW5wdXRDaGFubmVsPiYgY2hhbm5lbCwgaW50IHdvcmtXcml0ZSkgOgorICAgICAgICBtV29ya1dyaXRlKHdvcmtXcml0ZSksIG1Db25zdW1lcihjaGFubmVsKSB7CisgICAgaW50IG1zZ3BpcGVbMl07CisgICAgaWYgKHBpcGUobXNncGlwZSkpIHsKKyAgICAgICAgTE9HVygiY291bGQgbm90IGNyZWF0ZSBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIG1EaXNwYXRjaEtleVJlYWQgPSBtRGlzcGF0Y2hLZXlXcml0ZSA9IC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIG1EaXNwYXRjaEtleVJlYWQgPSBtc2dwaXBlWzBdOworICAgICAgICBtRGlzcGF0Y2hLZXlXcml0ZSA9IG1zZ3BpcGVbMV07CisgICAgICAgIGludCByZXN1bHQgPSBmY250bChtRGlzcGF0Y2hLZXlSZWFkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICAgICAgU0xPR1dfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgbWFrZSBBSW5wdXRRdWV1ZSByZWFkIHBpcGUgIgorICAgICAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmVzdWx0ID0gZmNudGwobURpc3BhdGNoS2V5V3JpdGUsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgICAgICBTTE9HV19JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBtYWtlIEFJbnB1dFF1ZXVlIHdyaXRlIHBpcGUgIgorICAgICAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICB9Cit9CisKK0FJbnB1dFF1ZXVlOjp+QUlucHV0UXVldWUoKSB7CisgICAgY2xvc2UobURpc3BhdGNoS2V5UmVhZCk7CisgICAgY2xvc2UobURpc3BhdGNoS2V5V3JpdGUpOworfQorCit2b2lkIEFJbnB1dFF1ZXVlOjphdHRhY2hMb29wZXIoQUxvb3BlciogbG9vcGVyLCBBTG9vcGVyX2NhbGxiYWNrRnVuYyogY2FsbGJhY2ssIHZvaWQqIGRhdGEpIHsKKyAgICBtUG9sbExvb3AgPSBzdGF0aWNfY2FzdDxhbmRyb2lkOjpQb2xsTG9vcCo+KGxvb3Blcik7CisgICAgbVBvbGxMb29wLT5zZXRMb29wZXJDYWxsYmFjayhtQ29uc3VtZXIuZ2V0Q2hhbm5lbCgpLT5nZXRSZWNlaXZlUGlwZUZkKCksCisgICAgICAgICAgICBQT0xMSU4sIGNhbGxiYWNrLCBkYXRhKTsKKyAgICBtUG9sbExvb3AtPnNldExvb3BlckNhbGxiYWNrKG1EaXNwYXRjaEtleVJlYWQsCisgICAgICAgICAgICBQT0xMSU4sIGNhbGxiYWNrLCBkYXRhKTsKK30KKwordm9pZCBBSW5wdXRRdWV1ZTo6ZGV0YWNoTG9vcGVyKCkgeworICAgIG1Qb2xsTG9vcC0+cmVtb3ZlQ2FsbGJhY2sobUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0UmVjZWl2ZVBpcGVGZCgpKTsKKyAgICBtUG9sbExvb3AtPnJlbW92ZUNhbGxiYWNrKG1EaXNwYXRjaEtleVJlYWQpOworfQorCitpbnQzMl90IEFJbnB1dFF1ZXVlOjpoYXNFdmVudHMoKSB7CisgICAgc3RydWN0IHBvbGxmZCBwZmRbMl07CisKKyAgICBwZmRbMF0uZmQgPSBtQ29uc3VtZXIuZ2V0Q2hhbm5lbCgpLT5nZXRSZWNlaXZlUGlwZUZkKCk7CisgICAgcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKyAgICBwZmRbMF0ucmV2ZW50cyA9IDA7CisgICAgcGZkWzFdLmZkID0gbURpc3BhdGNoS2V5UmVhZDsKKyAgICBwZmRbMF0uZXZlbnRzID0gUE9MTElOOworICAgIHBmZFswXS5yZXZlbnRzID0gMDsKICAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZG9EZWZhdWx0S2V5KGFuZHJvaWQ6OktleUV2ZW50KiBrZXlFdmVudCkgeworICAgIGludCBuZmQgPSBwb2xsKHBmZCwgMiwgMCk7CisgICAgaWYgKG5mZCA8PSAwKSByZXR1cm4gMDsKKyAgICByZXR1cm4gKHBmZFswXS5yZXZlbnRzID09IFBPTExJTiB8fCBwZmRbMV0ucmV2ZW50cyA9PSBQT0xMSU4pID8gMSA6IC0xOworfQorCitpbnQzMl90IEFJbnB1dFF1ZXVlOjpnZXRFdmVudChBSW5wdXRFdmVudCoqIG91dEV2ZW50KSB7CisgICAgKm91dEV2ZW50ID0gTlVMTDsKKworICAgIGNoYXIgYnl0ZXJlYWQ7CisgICAgc3NpemVfdCBuUmVhZCA9IHJlYWQobURpc3BhdGNoS2V5UmVhZCwgJmJ5dGVyZWFkLCAxKTsKKyAgICBpZiAoblJlYWQgPT0gMSkgewogICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIExPR0koIkRlZmF1bHQga2V5OiBwZW5kaW5nPSVkIHdyaXRlPSVkXG4iLCBtUGVuZGluZ0tleXMuc2l6ZSgpLCBtV29ya1dyaXRlKTsKLSAgICAgICAgaWYgKG1QZW5kaW5nS2V5cy5zaXplKCkgPD0gMCAmJiBtV29ya1dyaXRlID49IDApIHsKLSAgICAgICAgICAgIHdyaXRlX3dvcmsobVdvcmtXcml0ZSwgQ01EX0RFRl9LRVkpOwotICAgICAgICB9Ci0gICAgICAgIG1QZW5kaW5nS2V5cy5hZGQoa2V5RXZlbnQpOwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICB9Ci0gICAgCi0gICAgS2V5RXZlbnQqIGdldE5leHRFdmVudCgpIHsKLSAgICAgICAgS2V5RXZlbnQqIGV2ZW50ID0gTlVMTDsKLSAgICAgICAgCi0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgaWYgKG1QZW5kaW5nS2V5cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBldmVudCA9IG1QZW5kaW5nS2V5c1swXTsKLSAgICAgICAgICAgIG1QZW5kaW5nS2V5cy5yZW1vdmVBdCgwKTsKKyAgICAgICAgaWYgKG1EaXNwYXRjaGluZ0tleXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgS2V5RXZlbnQqIGtldmVudCA9IG1EaXNwYXRjaGluZ0tleXNbMF07CisgICAgICAgICAgICAqb3V0RXZlbnQgPSBrZXZlbnQ7CisgICAgICAgICAgICBtRGlzcGF0Y2hpbmdLZXlzLnJlbW92ZUF0KDApOworICAgICAgICAgICAgbURlbGl2ZXJpbmdLZXlzLmFkZChrZXZlbnQpOwogICAgICAgICB9CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAKLSAgICAgICAgcmV0dXJuIGV2ZW50OworICAgICAgICBpZiAoKm91dEV2ZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAgICAgfQogICAgIAotICAgIGludCBtV29ya1dyaXRlOworICAgIGludDMyX3QgcmVzID0gbUNvbnN1bWVyLnJlY2VpdmVEaXNwYXRjaFNpZ25hbCgpOworICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgTE9HRSgiY2hhbm5lbCAnJXMnIH4gRmFpbGVkIHRvIHJlY2VpdmUgZGlzcGF0Y2ggc2lnbmFsLiAgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICBtQ29uc3VtZXIuZ2V0Q2hhbm5lbCgpLT5nZXROYW1lKCkuc3RyaW5nKCksIHJlcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBJbnB1dEV2ZW50KiBteUV2ZW50ID0gTlVMTDsKKyAgICByZXMgPSBtQ29uc3VtZXIuY29uc3VtZSgmbUlucHV0RXZlbnRGYWN0b3J5LCAmbXlFdmVudCk7CisgICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICBMT0dXKCJjaGFubmVsICclcycgfiBGYWlsZWQgdG8gY29uc3VtZSBpbnB1dCBldmVudC4gIHN0YXR1cz0lZCIsCisgICAgICAgICAgICAgICAgbUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOworICAgICAgICBtQ29uc3VtZXIuc2VuZEZpbmlzaGVkU2lnbmFsKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAqb3V0RXZlbnQgPSBteUV2ZW50OworICAgIHJldHVybiAwOworfQorCit2b2lkIEFJbnB1dFF1ZXVlOjpmaW5pc2hFdmVudChBSW5wdXRFdmVudCogZXZlbnQsIGJvb2wgaGFuZGxlZCkgeworICAgIGJvb2wgbmVlZEZpbmlzaGVkID0gdHJ1ZTsKKworICAgIGlmICghaGFuZGxlZCAmJiAoKElucHV0RXZlbnQqKWV2ZW50KS0+Z2V0VHlwZSgpID09IElOUFVUX0VWRU5UX1RZUEVfS0VZCisgICAgICAgICAgICAmJiAoKEtleUV2ZW50KilldmVudCktPmhhc0RlZmF1bHRBY3Rpb24oKSkgeworICAgICAgICAvLyBUaGUgYXBwIGRpZG4ndCBoYW5kbGUgdGhpcywgYnV0IGl0IG1heSBoYXZlIGEgZGVmYXVsdCBhY3Rpb24KKyAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LiAgV2UgbmVlZCB0byBoYW5kIHRoaXMgYmFjayB0byBKYXZhIHRvIGJlCisgICAgICAgIC8vIGV4ZWN1dGVkLgorICAgICAgICBkb0RlZmF1bHRLZXkoKEtleUV2ZW50KilldmVudCk7CisgICAgICAgIG5lZWRGaW5pc2hlZCA9IGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHNpemVfdCBOID0gbURlbGl2ZXJpbmdLZXlzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpPTA7IGk8TjsgaSsrKSB7CisgICAgICAgIGlmIChtRGVsaXZlcmluZ0tleXNbaV0gPT0gZXZlbnQpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBldmVudDsKKyAgICAgICAgICAgIG1EZWxpdmVyaW5nS2V5cy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIG5lZWRGaW5pc2hlZCA9IGZhbHNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgVmVjdG9yPEtleUV2ZW50Kj4gbVBlbmRpbmdLZXlzOwotfTsKKyAgICBpZiAobmVlZEZpbmlzaGVkKSB7CisgICAgICAgIGludDMyX3QgcmVzID0gbUNvbnN1bWVyLnNlbmRGaW5pc2hlZFNpZ25hbCgpOworICAgICAgICBpZiAocmVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBMT0dXKCJGYWlsZWQgdG8gc2VuZCBmaW5pc2hlZCBzaWduYWwgb24gY2hhbm5lbCAnJXMnLiAgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbnN1bWVyLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFJbnB1dFF1ZXVlOjpkaXNwYXRjaEV2ZW50KGFuZHJvaWQ6OktleUV2ZW50KiBldmVudCkgeworICAgIG1Mb2NrLmxvY2soKTsKKyAgICBMT0dfVFJBQ0UoImRpc3BhdGNoRXZlbnQ6IGRpc3BhdGNoaW5nPSVkIHdyaXRlPSVkXG4iLCBtRGlzcGF0Y2hpbmdLZXlzLnNpemUoKSwKKyAgICAgICAgICAgIG1EaXNwYXRjaEtleVdyaXRlKTsKKyAgICBtRGlzcGF0Y2hpbmdLZXlzLmFkZChldmVudCk7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgCityZXN0YXJ0OgorICAgIGNoYXIgZHVtbXkgPSAwOworICAgIGludCByZXMgPSB3cml0ZShtRGlzcGF0Y2hLZXlXcml0ZSwgJmR1bW15LCBzaXplb2YoZHVtbXkpKTsKKyAgICBpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSU5UUikgeworICAgICAgICBnb3RvIHJlc3RhcnQ7CisgICAgfQorCisgICAgaWYgKHJlcyA9PSBzaXplb2YoZHVtbXkpKSByZXR1cm47CisKKyAgICBpZiAocmVzIDwgMCkgTE9HVygiRmFpbGVkIHdyaXRpbmcgdG8gZGlzcGF0Y2ggZmQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICBlbHNlIExPR1coIlRydW5jYXRlZCB3cml0aW5nIHRvIGRpc3BhdGNoIGZkOiAlZCIsIHJlcyk7Cit9CisKK0tleUV2ZW50KiBBSW5wdXRRdWV1ZTo6Y29uc3VtZVVuaGFuZGxlZEV2ZW50KCkgeworICAgIEtleUV2ZW50KiBldmVudCA9IE5VTEw7CisKKyAgICBtTG9jay5sb2NrKCk7CisgICAgaWYgKG1QZW5kaW5nS2V5cy5zaXplKCkgPiAwKSB7CisgICAgICAgIGV2ZW50ID0gbVBlbmRpbmdLZXlzWzBdOworICAgICAgICBtUGVuZGluZ0tleXMucmVtb3ZlQXQoMCk7CisgICAgfQorICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgTE9HX1RSQUNFKCJjb25zdW1lVW5oYW5kbGVkRXZlbnQ6IEtleUV2ZW50PSVwIiwgZXZlbnQpOworCisgICAgcmV0dXJuIGV2ZW50OworfQorCit2b2lkIEFJbnB1dFF1ZXVlOjpkb0RlZmF1bHRLZXkoS2V5RXZlbnQqIGtleUV2ZW50KSB7CisgICAgbUxvY2subG9jaygpOworICAgIExPR19UUkFDRSgiRGVmYXVsdCBrZXk6IHBlbmRpbmc9JWQgd3JpdGU9JWRcbiIsIG1QZW5kaW5nS2V5cy5zaXplKCksIG1Xb3JrV3JpdGUpOworICAgIGlmIChtUGVuZGluZ0tleXMuc2l6ZSgpIDw9IDAgJiYgbVdvcmtXcml0ZSA+PSAwKSB7CisgICAgICAgIHdyaXRlX3dvcmsobVdvcmtXcml0ZSwgQ01EX0RFRl9LRVkpOworICAgIH0KKyAgICBtUGVuZGluZ0tleXMuYWRkKGtleUV2ZW50KTsKKyAgICBtTG9jay51bmxvY2soKTsKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTMzLDggKzI3Nyw4IEBACiAgKi8KIHN0cnVjdCBOYXRpdmVDb2RlIDogcHVibGljIEFOYXRpdmVBY3Rpdml0eSB7CiAgICAgTmF0aXZlQ29kZSh2b2lkKiBfZGxoYW5kbGUsIEFOYXRpdmVBY3Rpdml0eV9jcmVhdGVGdW5jKiBfY3JlYXRlRnVuYykgewotICAgICAgICBtZW1zZXQoKEFOYXRpdmVBY3Rpdml0eSopdGhpcywgc2l6ZW9mKEFOYXRpdmVBY3Rpdml0eSksIDApOwotICAgICAgICBtZW1zZXQoJmNhbGxiYWNrcywgc2l6ZW9mKGNhbGxiYWNrcyksIDApOworICAgICAgICBtZW1zZXQoKEFOYXRpdmVBY3Rpdml0eSopdGhpcywgMCwgc2l6ZW9mKEFOYXRpdmVBY3Rpdml0eSkpOworICAgICAgICBtZW1zZXQoJmNhbGxiYWNrcywgMCwgc2l6ZW9mKGNhbGxiYWNrcykpOwogICAgICAgICBkbGhhbmRsZSA9IF9kbGhhbmRsZTsKICAgICAgICAgY3JlYXRlQWN0aXZpdHlGdW5jID0gX2NyZWF0ZUZ1bmM7CiAgICAgICAgIG5hdGl2ZVdpbmRvdyA9IE5VTEw7CkBAIC0xODgsNyArMzMyLDcgQEAKICAgICAgICAgICAgIHNwPElucHV0Q2hhbm5lbD4gaWMgPQogICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3ZpZXdfSW5wdXRDaGFubmVsX2dldElucHV0Q2hhbm5lbChlbnYsIF9jaGFubmVsKTsKICAgICAgICAgICAgIGlmIChpYyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlSW5wdXRRdWV1ZSA9IG5ldyBNeUlucHV0UXVldWUoaWMsIG1haW5Xb3JrV3JpdGUpOworICAgICAgICAgICAgICAgIG5hdGl2ZUlucHV0UXVldWUgPSBuZXcgQUlucHV0UXVldWUoaWMsIG1haW5Xb3JrV3JpdGUpOwogICAgICAgICAgICAgICAgIGlmIChuYXRpdmVJbnB1dFF1ZXVlLT5nZXRDb25zdW1lcigpLmluaXRpYWxpemUoKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgbmF0aXZlSW5wdXRRdWV1ZTsKICAgICAgICAgICAgICAgICAgICAgbmF0aXZlSW5wdXRRdWV1ZSA9IE5VTEw7CkBAIC0yMTAsOCArMzU0LDExIEBACiAgICAgU3RyaW5nOCBleHRlcm5hbERhdGFQYXRoOwogICAgIAogICAgIHNwPEFOYXRpdmVXaW5kb3c+IG5hdGl2ZVdpbmRvdzsKKyAgICBpbnQzMl90IGxhc3RXaW5kb3dXaWR0aDsKKyAgICBpbnQzMl90IGxhc3RXaW5kb3dIZWlnaHQ7CisKICAgICBqb2JqZWN0IGlucHV0Q2hhbm5lbDsKLSAgICBzdHJ1Y3QgTXlJbnB1dFF1ZXVlKiBuYXRpdmVJbnB1dFF1ZXVlOworICAgIHN0cnVjdCBBSW5wdXRRdWV1ZSogbmF0aXZlSW5wdXRRdWV1ZTsKICAgICAKICAgICAvLyBUaGVzZSBhcmUgdXNlZCB0byB3YWtlIHVwIHRoZSBtYWluIHRocmVhZCB0byBwcm9jZXNzIHdvcmsuCiAgICAgaW50IG1haW5Xb3JrUmVhZDsKQEAgLTIzMSw2ICszNzgsMTggQEAKICAgICB3cml0ZV93b3JrKGNvZGUtPm1haW5Xb3JrV3JpdGUsIENNRF9TRVRfV0lORE9XX0ZMQUdTLCB2YWx1ZXMsIG1hc2spOwogfQogCit2b2lkIGFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dCgKKyAgICAgICAgQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgaW50MzJfdCBmbGFncykgeworICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSBzdGF0aWNfY2FzdDxOYXRpdmVDb2RlKj4oYWN0aXZpdHkpOworICAgIHdyaXRlX3dvcmsoY29kZS0+bWFpbldvcmtXcml0ZSwgQ01EX1NIT1dfU09GVF9JTlBVVCwgZmxhZ3MpOworfQorCit2b2lkIGFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfaGlkZVNvZnRJbnB1dCgKKyAgICAgICAgQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgaW50MzJfdCBmbGFncykgeworICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSBzdGF0aWNfY2FzdDxOYXRpdmVDb2RlKj4oYWN0aXZpdHkpOworICAgIHdyaXRlX3dvcmsoY29kZS0+bWFpbldvcmtXcml0ZSwgQ01EX0hJREVfU09GVF9JTlBVVCwgZmxhZ3MpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLyoKQEAgLTI0NiwxMCArNDA1LDEzIEBACiAgICAgaWYgKCFyZWFkX3dvcmsoY29kZS0+bWFpbldvcmtSZWFkLCAmd29yaykpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQorCisgICAgTE9HX1RSQUNFKCJtYWluV29ya0NhbGxiYWNrOiBjbWQ9JWQiLCB3b3JrLmNtZCk7CisKICAgICBzd2l0Y2ggKHdvcmsuY21kKSB7CiAgICAgICAgIGNhc2UgQ01EX0RFRl9LRVk6IHsKICAgICAgICAgICAgIEtleUV2ZW50KiBrZXlFdmVudDsKLSAgICAgICAgICAgIHdoaWxlICgoa2V5RXZlbnQ9Y29kZS0+bmF0aXZlSW5wdXRRdWV1ZS0+Z2V0TmV4dEV2ZW50KCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHdoaWxlICgoa2V5RXZlbnQ9Y29kZS0+bmF0aXZlSW5wdXRRdWV1ZS0+Y29uc3VtZVVuaGFuZGxlZEV2ZW50KCkpICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBqb2JqZWN0IGlucHV0RXZlbnRPYmogPSBhbmRyb2lkX3ZpZXdfS2V5RXZlbnRfZnJvbU5hdGl2ZSgKICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUtPmVudiwga2V5RXZlbnQpOwogICAgICAgICAgICAgICAgIGNvZGUtPmVudi0+Q2FsbFZvaWRNZXRob2QoY29kZS0+Y2xhenosCkBAIC0yNjksNiArNDMxLDE0IEBACiAgICAgICAgICAgICBjb2RlLT5lbnYtPkNhbGxWb2lkTWV0aG9kKGNvZGUtPmNsYXp6LAogICAgICAgICAgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uc2V0V2luZG93RmxhZ3MsIHdvcmsuYXJnMSwgd29yay5hcmcyKTsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDTURfU0hPV19TT0ZUX0lOUFVUOiB7CisgICAgICAgICAgICBjb2RlLT5lbnYtPkNhbGxWb2lkTWV0aG9kKGNvZGUtPmNsYXp6LAorICAgICAgICAgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uc2hvd0ltZSwgd29yay5hcmcxKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBDTURfSElERV9TT0ZUX0lOUFVUOiB7CisgICAgICAgICAgICBjb2RlLT5lbnYtPkNhbGxWb2lkTWV0aG9kKGNvZGUtPmNsYXp6LAorICAgICAgICAgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uaGlkZUltZSwgd29yay5hcmcxKTsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIExPR1coIlVua25vd24gd29yayBjb21tYW5kOiAlZCIsIHdvcmsuY21kKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjgzLDYgKzQ1Myw4IEBACiBsb2FkTmF0aXZlQ29kZV9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGpzdHJpbmcgcGF0aCwgam9iamVjdCBtZXNzYWdlUXVldWUsCiAgICAgICAgIGpzdHJpbmcgaW50ZXJuYWxEYXRhRGlyLCBqc3RyaW5nIGV4dGVybmFsRGF0YURpciwgaW50IHNka1ZlcnNpb24pCiB7CisgICAgTE9HX1RSQUNFKCJsb2FkTmF0aXZlQ29kZV9uYXRpdmUiKTsKKwogICAgIGNvbnN0IGNoYXIqIHBhdGhTdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKHBhdGgsIE5VTEwpOwogICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSBOVUxMOwogICAgIApAQCAtMzE0LDYgKzQ4NiwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGNvZGUtPm1haW5Xb3JrUmVhZCA9IG1zZ3BpcGVbMF07CiAgICAgICAgIGNvZGUtPm1haW5Xb3JrV3JpdGUgPSBtc2dwaXBlWzFdOworICAgICAgICBpbnQgcmVzdWx0ID0gZmNudGwoY29kZS0+bWFpbldvcmtSZWFkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICAgICAgU0xPR1dfSUYocmVzdWx0ICE9IDAsICJDb3VsZCBub3QgbWFrZSBtYWluIHdvcmsgcmVhZCBwaXBlICIKKyAgICAgICAgICAgICAgICAibm9uLWJsb2NraW5nOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJlc3VsdCA9IGZjbnRsKGNvZGUtPm1haW5Xb3JrV3JpdGUsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgICAgICBTTE9HV19JRihyZXN1bHQgIT0gMCwgIkNvdWxkIG5vdCBtYWtlIG1haW4gd29yayB3cml0ZSBwaXBlICIKKyAgICAgICAgICAgICAgICAibm9uLWJsb2NraW5nOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIGNvZGUtPnBvbGxMb29wLT5zZXRDYWxsYmFjayhjb2RlLT5tYWluV29ya1JlYWQsIFBPTExJTiwgbWFpbldvcmtDYWxsYmFjaywgY29kZSk7CiAgICAgICAgIAogICAgICAgICBjb2RlLT5BTmF0aXZlQWN0aXZpdHk6OmNhbGxiYWNrcyA9ICZjb2RlLT5jYWxsYmFja3M7CkBAIC0zNDYsNiArNTI0LDcgQEAKIHN0YXRpYyB2b2lkCiB1bmxvYWROYXRpdmVDb2RlX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJ1bmxvYWROYXRpdmVDb2RlX25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgZGVsZXRlIGNvZGU7CkBAIC0zNTUsNiArNTM0LDcgQEAKIHN0YXRpYyB2b2lkCiBvblN0YXJ0X25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJvblN0YXJ0X25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vblN0YXJ0ICE9IE5VTEwpIHsKQEAgLTM2Niw2ICs1NDYsNyBAQAogc3RhdGljIHZvaWQKIG9uUmVzdW1lX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJvblJlc3VtZV9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25SZXN1bWUgIT0gTlVMTCkgewpAQCAtMzc3LDYgKzU1OCw3IEBACiBzdGF0aWMgdm9pZAogb25TYXZlSW5zdGFuY2VTdGF0ZV9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlKQogeworICAgIExPR19UUkFDRSgib25TYXZlSW5zdGFuY2VTdGF0ZV9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25TYXZlSW5zdGFuY2VTdGF0ZSAhPSBOVUxMKSB7CkBAIC0zODksNiArNTcxLDcgQEAKIHN0YXRpYyB2b2lkCiBvblBhdXNlX25hdGl2ZShKTklFbnYqIGVudiwgam9iamVjdCBjbGF6eiwgamludCBoYW5kbGUpCiB7CisgICAgTE9HX1RSQUNFKCJvblBhdXNlX25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vblBhdXNlICE9IE5VTEwpIHsKQEAgLTQwMCw2ICs1ODMsNyBAQAogc3RhdGljIHZvaWQKIG9uU3RvcF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlKQogeworICAgIExPR19UUkFDRSgib25TdG9wX25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vblN0b3AgIT0gTlVMTCkgewpAQCAtNDExLDYgKzU5NSw3IEBACiBzdGF0aWMgdm9pZAogb25Mb3dNZW1vcnlfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uTG93TWVtb3J5X25hdGl2ZSIpOwogICAgIGlmIChoYW5kbGUgIT0gMCkgewogICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vbkxvd01lbW9yeSAhPSBOVUxMKSB7CkBAIC00MjIsNiArNjA3LDcgQEAKIHN0YXRpYyB2b2lkCiBvbldpbmRvd0ZvY3VzQ2hhbmdlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqYm9vbGVhbiBmb2N1c2VkKQogeworICAgIExPR19UUkFDRSgib25XaW5kb3dGb2N1c0NoYW5nZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uV2luZG93Rm9jdXNDaGFuZ2VkICE9IE5VTEwpIHsKQEAgLTQzMyw2ICs2MTksNyBAQAogc3RhdGljIHZvaWQKIG9uU3VyZmFjZUNyZWF0ZWRfbmF0aXZlKEpOSUVudiogZW52LCBqb2JqZWN0IGNsYXp6LCBqaW50IGhhbmRsZSwgam9iamVjdCBzdXJmYWNlKQogeworICAgIExPR19UUkFDRSgib25TdXJmYWNlQ3JlYXRlZF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGNvZGUtPnNldFN1cmZhY2Uoc3VyZmFjZSk7CkBAIC00NDMsMTAgKzYzMCwxNyBAQAogICAgIH0KIH0KIAorc3RhdGljIGludDMyX3QgZ2V0V2luZG93UHJvcChBTmF0aXZlV2luZG93KiB3aW5kb3csIGludCB3aGF0KSB7CisgICAgaW50IHZhbHVlOworICAgIGludCByZXMgPSB3aW5kb3ctPnF1ZXJ5KHdpbmRvdywgd2hhdCwgJnZhbHVlKTsKKyAgICByZXR1cm4gcmVzIDwgMCA/IHJlcyA6IHZhbHVlOworfQorCiBzdGF0aWMgdm9pZAogb25TdXJmYWNlQ2hhbmdlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IHN1cmZhY2UsCiAgICAgICAgIGppbnQgZm9ybWF0LCBqaW50IHdpZHRoLCBqaW50IGhlaWdodCkKIHsKKyAgICBMT0dfVFJBQ0UoIm9uU3VyZmFjZUNoYW5nZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBvbGROYXRpdmVXaW5kb3cgPSBjb2RlLT5uYXRpdmVXaW5kb3c7CkBAIC00NTYsMTAgKzY1MCw0MSBAQAogICAgICAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZChjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgb2xkTmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjb2RlLT5uYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dDcmVhdGVkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dDcmVhdGVkKGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd0NyZWF0ZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dDcmVhdGVkKGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS0+bmF0aXZlV2luZG93LmdldCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZS0+bGFzdFdpbmRvd1dpZHRoID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1dJRFRIKTsKKyAgICAgICAgICAgICAgICBjb2RlLT5sYXN0V2luZG93SGVpZ2h0ID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0hFSUdIVCk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYXliZSBpdCByZXNpemVkPworICAgICAgICAgICAgaW50MzJfdCBuZXdXaWR0aCA9IGdldFdpbmRvd1Byb3AoY29kZS0+bmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1dJRFRIKTsKKyAgICAgICAgICAgIGludDMyX3QgbmV3SGVpZ2h0ID0gZ2V0V2luZG93UHJvcChjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfSEVJR0hUKTsKKyAgICAgICAgICAgIGlmIChuZXdXaWR0aCAhPSBjb2RlLT5sYXN0V2luZG93V2lkdGgKKyAgICAgICAgICAgICAgICAgICAgfHwgbmV3SGVpZ2h0ICE9IGNvZGUtPmxhc3RXaW5kb3dIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29kZS0+Y2FsbGJhY2tzLm9uTmF0aXZlV2luZG93UmVzaXplZCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQoY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLT5uYXRpdmVXaW5kb3cuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK29uU3VyZmFjZVJlZHJhd05lZWRlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlKQoreworICAgIExPR19UUkFDRSgib25TdXJmYWNlUmVkcmF3TmVlZGVkX25hdGl2ZSIpOworICAgIGlmIChoYW5kbGUgIT0gMCkgeworICAgICAgICBOYXRpdmVDb2RlKiBjb2RlID0gKE5hdGl2ZUNvZGUqKWhhbmRsZTsKKyAgICAgICAgaWYgKGNvZGUtPm5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIGNvZGUtPmNhbGxiYWNrcy5vbk5hdGl2ZVdpbmRvd1JlZHJhd05lZWRlZCAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQoY29kZSwgY29kZS0+bmF0aXZlV2luZG93LmdldCgpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTQ2Nyw2ICs2OTIsNyBAQAogc3RhdGljIHZvaWQKIG9uU3VyZmFjZURlc3Ryb3llZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IHN1cmZhY2UpCiB7CisgICAgTE9HX1RSQUNFKCJvblN1cmZhY2VEZXN0cm95ZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBpZiAoY29kZS0+bmF0aXZlV2luZG93ICE9IE5VTEwgJiYgY29kZS0+Y2FsbGJhY2tzLm9uTmF0aXZlV2luZG93RGVzdHJveWVkICE9IE5VTEwpIHsKQEAgLTQ4MCw2ICs3MDYsNyBAQAogc3RhdGljIHZvaWQKIG9uSW5wdXRDaGFubmVsQ3JlYXRlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IGNoYW5uZWwpCiB7CisgICAgTE9HX1RSQUNFKCJvbklucHV0Q2hhbm5lbENyZWF0ZWRfbmF0aXZlIik7CiAgICAgaWYgKGhhbmRsZSAhPSAwKSB7CiAgICAgICAgIE5hdGl2ZUNvZGUqIGNvZGUgPSAoTmF0aXZlQ29kZSopaGFuZGxlOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlLT5zZXRJbnB1dENoYW5uZWwoY2hhbm5lbCk7CkBAIC00OTgsNiArNzI1LDcgQEAKIHN0YXRpYyB2b2lkCiBvbklucHV0Q2hhbm5lbERlc3Ryb3llZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IGNoYW5uZWwpCiB7CisgICAgTE9HX1RSQUNFKCJvbklucHV0Q2hhbm5lbERlc3Ryb3llZF9uYXRpdmUiKTsKICAgICBpZiAoaGFuZGxlICE9IDApIHsKICAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CiAgICAgICAgIGlmIChjb2RlLT5uYXRpdmVJbnB1dFF1ZXVlICE9IE5VTEwKQEAgLTUwOSw2ICs3MzcsMzggQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkCitvbkNvbnRlbnRSZWN0Q2hhbmdlZF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLAorICAgICAgICBqaW50IHgsIGppbnQgeSwgamludCB3LCBqaW50IGgpCit7CisgICAgTE9HX1RSQUNFKCJvbkNvbnRlbnRSZWN0Q2hhbmdlZF9uYXRpdmUiKTsKKyAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CisgICAgICAgIGlmIChjb2RlLT5jYWxsYmFja3Mub25Db250ZW50UmVjdENoYW5nZWQgIT0gTlVMTCkgeworICAgICAgICAgICAgQVJlY3QgcmVjdDsKKyAgICAgICAgICAgIHJlY3QubGVmdCA9IHg7CisgICAgICAgICAgICByZWN0LnRvcCA9IHk7CisgICAgICAgICAgICByZWN0LnJpZ2h0ID0geCt3OworICAgICAgICAgICAgcmVjdC5ib3R0b20gPSB5K2g7CisgICAgICAgICAgICBjb2RlLT5jYWxsYmFja3Mub25Db250ZW50UmVjdENoYW5nZWQoY29kZSwgJnJlY3QpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorZGlzcGF0Y2hLZXlFdmVudF9uYXRpdmUoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhenosIGppbnQgaGFuZGxlLCBqb2JqZWN0IGV2ZW50T2JqKQoreworICAgIExPR19UUkFDRSgiZGlzcGF0Y2hLZXlFdmVudF9uYXRpdmUiKTsKKyAgICBpZiAoaGFuZGxlICE9IDApIHsKKyAgICAgICAgTmF0aXZlQ29kZSogY29kZSA9IChOYXRpdmVDb2RlKiloYW5kbGU7CisgICAgICAgIGlmIChjb2RlLT5uYXRpdmVJbnB1dFF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEtleUV2ZW50KiBldmVudCA9IG5ldyBLZXlFdmVudCgpOworICAgICAgICAgICAgYW5kcm9pZF92aWV3X0tleUV2ZW50X3RvTmF0aXZlKGVudiwgZXZlbnRPYmosIElOUFVUX0VWRU5UX05BVFVSRV9LRVksIGV2ZW50KTsKKyAgICAgICAgICAgIGNvZGUtPm5hdGl2ZUlucHV0UXVldWUtPmRpc3BhdGNoRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0aWMgY29uc3QgSk5JTmF0aXZlTWV0aG9kIGdfbWV0aG9kc1tdID0gewogICAgIHsgImxvYWROYXRpdmVDb2RlIiwgIihMamF2YS9sYW5nL1N0cmluZztMYW5kcm9pZC9vcy9NZXNzYWdlUXVldWU7TGphdmEvbGFuZy9TdHJpbmc7TGphdmEvbGFuZy9TdHJpbmc7SSlJIiwKICAgICAgICAgICAgICh2b2lkKilsb2FkTmF0aXZlQ29kZV9uYXRpdmUgfSwKQEAgLTUyMiw5ICs3ODIsMTIgQEAKICAgICB7ICJvbldpbmRvd0ZvY3VzQ2hhbmdlZE5hdGl2ZSIsICIoSVopViIsICh2b2lkKilvbldpbmRvd0ZvY3VzQ2hhbmdlZF9uYXRpdmUgfSwKICAgICB7ICJvblN1cmZhY2VDcmVhdGVkTmF0aXZlIiwgIihJTGFuZHJvaWQvdmlldy9TdXJmYWNlOylWIiwgKHZvaWQqKW9uU3VyZmFjZUNyZWF0ZWRfbmF0aXZlIH0sCiAgICAgeyAib25TdXJmYWNlQ2hhbmdlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTtJSUkpViIsICh2b2lkKilvblN1cmZhY2VDaGFuZ2VkX25hdGl2ZSB9LAorICAgIHsgIm9uU3VyZmFjZVJlZHJhd05lZWRlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvU3VyZmFjZTspViIsICh2b2lkKilvblN1cmZhY2VSZWRyYXdOZWVkZWRfbmF0aXZlIH0sCiAgICAgeyAib25TdXJmYWNlRGVzdHJveWVkTmF0aXZlIiwgIihJKVYiLCAodm9pZCopb25TdXJmYWNlRGVzdHJveWVkX25hdGl2ZSB9LAogICAgIHsgIm9uSW5wdXRDaGFubmVsQ3JlYXRlZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvSW5wdXRDaGFubmVsOylWIiwgKHZvaWQqKW9uSW5wdXRDaGFubmVsQ3JlYXRlZF9uYXRpdmUgfSwKICAgICB7ICJvbklucHV0Q2hhbm5lbERlc3Ryb3llZE5hdGl2ZSIsICIoSUxhbmRyb2lkL3ZpZXcvSW5wdXRDaGFubmVsOylWIiwgKHZvaWQqKW9uSW5wdXRDaGFubmVsRGVzdHJveWVkX25hdGl2ZSB9LAorICAgIHsgIm9uQ29udGVudFJlY3RDaGFuZ2VkTmF0aXZlIiwgIihJSUlJSSlWIiwgKHZvaWQqKW9uQ29udGVudFJlY3RDaGFuZ2VkX25hdGl2ZSB9LAorICAgIHsgImRpc3BhdGNoS2V5RXZlbnROYXRpdmUiLCAiKElMYW5kcm9pZC92aWV3L0tleUV2ZW50OylWIiwgKHZvaWQqKWRpc3BhdGNoS2V5RXZlbnRfbmF0aXZlIH0sCiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga05hdGl2ZUFjdGl2aXR5UGF0aE5hbWUgPSAiYW5kcm9pZC9hcHAvTmF0aXZlQWN0aXZpdHkiOwpAQCAtNTU0LDYgKzgxNywxMiBAQAogICAgIEdFVF9NRVRIT0RfSUQoZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLnNldFdpbmRvd0Zvcm1hdCwKICAgICAgICAgICAgIGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5jbGF6eiwKICAgICAgICAgICAgICJzZXRXaW5kb3dGb3JtYXQiLCAiKEkpViIpOworICAgIEdFVF9NRVRIT0RfSUQoZ05hdGl2ZUFjdGl2aXR5Q2xhc3NJbmZvLnNob3dJbWUsCisgICAgICAgICAgICBnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uY2xhenosCisgICAgICAgICAgICAic2hvd0ltZSIsICIoSSlWIik7CisgICAgR0VUX01FVEhPRF9JRChnTmF0aXZlQWN0aXZpdHlDbGFzc0luZm8uaGlkZUltZSwKKyAgICAgICAgICAgIGdOYXRpdmVBY3Rpdml0eUNsYXNzSW5mby5jbGF6eiwKKyAgICAgICAgICAgICJoaWRlSW1lIiwgIihJKVYiKTsKIAogICAgIHJldHVybiBBbmRyb2lkUnVudGltZTo6cmVnaXN0ZXJOYXRpdmVNZXRob2RzKAogICAgICAgICBlbnYsIGtOYXRpdmVBY3Rpdml0eVBhdGhOYW1lLApkaWZmIC0tZ2l0IGEvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAppbmRleCA4ZDRmYTRlLi5kMTZiOTFjIDEwMDc1NQotLS0gYS9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgYi9jb3JlL3Jlcy9yZXMvdmFsdWVzL2F0dHJzLnhtbApAQCAtOTIwLDYgKzkyMCwyMSBAQAogICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX1BBR0VfRE9XTiIgdmFsdWU9IjkzIiAvPgogICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX1BJQ1RTWU1CT0xTIiB2YWx1ZT0iOTQiIC8+CiAgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfU1dJVENIX0NIQVJTRVQiIHZhbHVlPSI5NSIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fQSIgdmFsdWU9Ijk2IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9CIiB2YWx1ZT0iOTciIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX0MiIHZhbHVlPSI5OCIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fWCIgdmFsdWU9Ijk5IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9ZIiB2YWx1ZT0iMTAwIiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9aIiB2YWx1ZT0iMTAxIiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9MMSIgdmFsdWU9IjEwMiIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fUjEiIHZhbHVlPSIxMDMiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX0wyIiB2YWx1ZT0iMTA0IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9SMiIgdmFsdWU9IjEwNSIgLz4KKyAgICAgICAgPGVudW0gbmFtZT0iS0VZQ09ERV9CVVRUT05fVEhVTUJMIiB2YWx1ZT0iMTA2IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9USFVNQlIiIHZhbHVlPSIxMDciIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX1NUQVJUIiB2YWx1ZT0iMTA4IiAvPgorICAgICAgICA8ZW51bSBuYW1lPSJLRVlDT0RFX0JVVFRPTl9TRUxFQ1QiIHZhbHVlPSIxMDkiIC8+CisgICAgICAgIDxlbnVtIG5hbWU9IktFWUNPREVfQlVUVE9OX01PREUiIHZhbHVlPSIxMTAiIC8+CiAgICAgPC9hdHRyPgogCiAgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjUuamQgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS41LmpkCmluZGV4IDFkNmUwYWQuLjBjMTZiNjAgMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjUuamQKKysrIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNS5qZApAQCAtMTM5LDcgKzEzOSw3IEBACiAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgY2xvc2VkIj4KICAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+Ci0gICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CisgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1jbG9zZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CiAgICAgICAgIEFuZHJvaWQgMS41LCBSZXZpc2lvbiAzPC9hPiA8ZW0+KEp1bHkgMjAwOSk8L2VtPjwvYT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogPGRsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0xLjYuamQKaW5kZXggYzI2NTFiNi4uYzRlMDhmZiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTEuNi5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMS42LmpkCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KLSAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCAxLjYsIFJldmlzaW9uIDI8L2E+IDxlbT4oRGVjZW1iZXIgMjAwOSk8L2VtPjwvYT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogPGRsPgpkaWZmIC0tZ2l0IGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZCBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjEuamQKaW5kZXggNzQ5MGJhZS4uY2Q0OGE3MiAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMS5qZAorKysgYi9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4xLmpkCkBAIC0xMzksNyArMTM5LDcgQEAKIAogPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KLSAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCAyLjEsIFJldmlzaW9uIDE8L2E+IDxlbT4oSmFudWFyeSAyMDEwKTwvZW0+PC9hPgogICA8ZGl2IGNsYXNzPSJ0b2dnbGVtZSI+CiA8ZGw+CmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLmpkIGIvZG9jcy9odG1sL3Nkay9hbmRyb2lkLTIuMi5qZAppbmRleCBmODJlZGY5Li40OTVmZDgwIDEwMDY0NAotLS0gYS9kb2NzL2h0bWwvc2RrL2FuZHJvaWQtMi4yLmpkCisrKyBiL2RvY3MvaHRtbC9zZGsvYW5kcm9pZC0yLjIuamQKQEAgLTIsNyArMiw2IEBACiBzZGsucGxhdGZvcm0udmVyc2lvbj0yLjIKIHNkay5wbGF0Zm9ybS5hcGlMZXZlbD04CiBzZGsucGxhdGZvcm0ubWFqb3JNaW5vcj1taW5vcgotc2RrLnBsYXRmb3JtLmRlcGxveWFibGVEYXRlPU1heSAyMDEwCiAKIEBqZDpib2R5CiAKQEAgLTExOCw2ICsxMTcsMzAgQEAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgb3BlbmVkIj4KICAgPGEgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIHRvZ2dsZURpdih0aGlzKSI+CiAgICAgICAgIDxpbWcgc3JjPSJ7QGRvY1Jvb3R9YXNzZXRzL2ltYWdlcy90cmlhbmdsZS1vcGVuZWQucG5nIiBjbGFzcz0idG9nZ2xlLWltZyIgaGVpZ2h0PSI5cHgiIHdpZHRoPSI5cHgiIC8+CisgICAgICAgIEFuZHJvaWQge0BzZGtQbGF0Zm9ybVZlcnNpb259LCBSZXZpc2lvbiAyPC9hPiA8ZW0+KEp1bHkgMjAxMCk8L2VtPjwvYT4KKyAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgorPGRsPgorPGR0PkRlcGVuZGVuY2llczo8L2R0PgorPGRkPgorPHA+UmVxdWlyZXMgU0RLIFRvb2xzIHI2IG9yIGhpZ2hlci48L3A+Cis8L2RkPgorCis8ZHQ+U3lzdGVtIEltYWdlOjwvZHQ+Cis8ZGQ+Cis8dWw+Cis8bGk+QWRkcyBkZWZhdWx0IFNlYXJjaCBXaWRnZXQuPC9saT4KKzxsaT5JbmNsdWRlcyBwcm9wZXIgcHJvdmlzaW9uaW5nIGZvciB0aGUgcGxhdGZvcm0ncyBCYWNrdXAgTWFuYWdlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIHVzZSB0aGUgQmFja3VwIE1hbmFnZXIsIHNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvdG9waWNzL2RhdGEvYmFja3VwLmh0bWwiPkRhdGEgQmFja3VwPC9hPi48L2xpPgorPGxpPlVwZGF0ZXMgdGhlIEFuZHJvaWQgMi4yIHN5c3RlbSBpbWFnZSB0byBGUkY5MS48L2xpPgorPC91bD4KKzwvZGQ+CisKKzwvZGw+CisgPC9kaXY+Cis8L2Rpdj4KKworPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgorICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KICAgICAgICAgQW5kcm9pZCB7QHNka1BsYXRmb3JtVmVyc2lvbn0sIFJldmlzaW9uIDE8L2E+IDxlbT4oTWF5IDIwMTApPC9lbT48L2E+CiAgIDxkaXYgY2xhc3M9InRvZ2dsZW1lIj4KIDxkbD4KQEAgLTEzNSw3ICsxNTgsNiBAQAogIDwvZGl2PgogPC9kaXY+CiAKLQogPGgyIGlkPSJhcGktbGV2ZWwiPkFQSSBMZXZlbDwvaDI+CiAKIDxwPlRoZSBBbmRyb2lkIHtAc2RrUGxhdGZvcm1WZXJzaW9ufSBwbGF0Zm9ybSBkZWxpdmVycyBhbiB1cGRhdGVkIHZlcnNpb24gb2YKQEAgLTQ0NCw0ICs0NjYsNCBAQAogPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRldmVsb3AgYW4gYXBwbGljYXRpb24gdGhhdCBkaXNwbGF5cwogYW5kIGZ1bmN0aW9ucyBwcm9wZXJseSBvbiBhbGwgQW5kcm9pZC1wb3dlcmVkIGRldmljZXMsIHNlZSA8YQogaHJlZj0ie0Bkb2NSb290fWd1aWRlL3ByYWN0aWNlcy9zY3JlZW5zX3N1cHBvcnQuaHRtbCI+U3VwcG9ydGluZyBNdWx0aXBsZQotU2NyZWVuczwvYT4uPC9wPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK1NjcmVlbnM8L2E+LjwvcD4KZGlmZiAtLWdpdCBhL2RvY3MvaHRtbC9zZGsvbmRrL2luZGV4LmpkIGIvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKaW5kZXggNjljYzczZC4uOWU4OGQ5NCAxMDA2NDQKLS0tIGEvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKKysrIGIvZG9jcy9odG1sL3Nkay9uZGsvaW5kZXguamQKQEAgLTEsMTYgKzEsMTYgQEAKIG5kaz10cnVlCiAKLW5kay53aW5fZG93bmxvYWQ9YW5kcm9pZC1uZGstcjQtd2luZG93cy56aXAKLW5kay53aW5fYnl0ZXM9NDU3Nzg5NjUKLW5kay53aW5fY2hlY2tzdW09MWVkZWQ5OGE3ZjVjZDVlNzFmOGFjNzQ1NjVmNzNmMTEKK25kay53aW5fZG93bmxvYWQ9YW5kcm9pZC1uZGstcjRiLXdpbmRvd3MuemlwCituZGsud2luX2J5dGVzPTQ1NzkyODM1CituZGsud2luX2NoZWNrc3VtPWUzOTcxNDVlMTU1YTYzOWJlNTNlZTRiNmRiOGFkNTExCiAKLW5kay5tYWNfZG93bmxvYWQ9YW5kcm9pZC1uZGstcjQtZGFyd2luLXg4Ni56aXAKLW5kay5tYWNfYnl0ZXM9NTA1NzIxNjMKLW5kay5tYWNfY2hlY2tzdW09YjdkNWYxNDlmZWNmOTUxYzA1YTc5YjA0NWYwMDQxOWYKK25kay5tYWNfZG93bmxvYWQ9YW5kcm9pZC1uZGstcjRiLWRhcndpbi14ODYuemlwCituZGsubWFjX2J5dGVzPTUwNTg2MDQxCituZGsubWFjX2NoZWNrc3VtPTQxZGJkNTQzMzVmYjgyOGVlNDA4ZWFiMTcxMDNhMWIwCiAKLW5kay5saW51eF9kb3dubG9hZD1hbmRyb2lkLW5kay1yNC1saW51eC14ODYuemlwCi1uZGsubGludXhfYnl0ZXM9NDk0NTA2ODIKLW5kay5saW51eF9jaGVja3N1bT0wODkyYjA2MzdkNDVkMTQ1ZTA0NWNjNjhlMTYzZGVlMworbmRrLmxpbnV4X2Rvd25sb2FkPWFuZHJvaWQtbmRrLXI0Yi1saW51eC14ODYuemlwCituZGsubGludXhfYnl0ZXM9NDk0NjQ3NzYKK25kay5saW51eF9jaGVja3N1bT0yZGVhYmNiMTI1YzIxOWIzNDE0MDk3NWI3MTBmMDBlYwogCiBwYWdlLnRpdGxlPUFuZHJvaWQgTkRLCiBAamQ6Ym9keQpAQCAtNjIsOCArNjIsMTUgQEAKIDxkaXYgY2xhc3M9InRvZ2dsZWFibGUgb3BlbiI+CiAgIDxhIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiB0b2dnbGVEaXYodGhpcykiPgogICAgICAgICA8aW1nIHNyYz0ie0Bkb2NSb290fWFzc2V0cy9pbWFnZXMvdHJpYW5nbGUtb3BlbmVkLnBuZyIgY2xhc3M9InRvZ2dsZS1pbWciIGhlaWdodD0iOXB4IiB3aWR0aD0iOXB4IiAvPgotQW5kcm9pZCBOREssIFJldmlzaW9uIDQ8L2E+IDxlbT4oTWF5IDIwMTApPC9lbT4KK0FuZHJvaWQgTkRLLCBSZXZpc2lvbiA0YjwvYT4gPGVtPihKdW5lIDIwMTApPC9lbT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgorPGRsPgorPGR0Pk5ESyByNGIgbm90ZXM6PC9kdD4KKzxkZD48cD5JbmNsdWRlcyBmaXhlcyBmb3Igc2V2ZXJhbCBpc3N1ZXMgaW4gdGhlIE5ESyBidWlsZCBhbmQgZGVidWdnaW5nIHNjcmlwdHMKKyZtZGFzaDsgaWYgeW91IGFyZSB1c2luZyBOREsgcjQsIHdlIHJlY29tbWVuZCBkb3dubG9hZGluZyB0aGUgTkRLIHI0YiBidWlsZC4gRm9yCitkZXRhaWxlZCBpbmZvcm1hdGlvbiB0aGUgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UsIHJlYWQgdGhlIENIQU5HRVMuVFhUIGRvY3VtZW50CitpbmNsdWRlZCBpbiB0aGUgZG93bmxvYWRlZCBOREsgcGFja2FnZS48L3A+PC9kZD4KKzwvZGw+CiAKIDxkbD4KIDxkdD5HZW5lcmFsIG5vdGVzOjwvZHQ+CkBAIC0xMTQsNyArMTIxLDcgQEAKIAogPGRpdiBjbGFzcz0idG9nZ2xlYWJsZSBjbG9zZWQiPgogICA8YSBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gdG9nZ2xlRGl2KHRoaXMpIj4KLSAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLW9wZW5lZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KKyAgICAgICAgPGltZyBzcmM9IntAZG9jUm9vdH1hc3NldHMvaW1hZ2VzL3RyaWFuZ2xlLWNsb3NlZC5wbmciIGNsYXNzPSJ0b2dnbGUtaW1nIiBoZWlnaHQ9IjlweCIgd2lkdGg9IjlweCIgLz4KIEFuZHJvaWQgTkRLLCBSZXZpc2lvbiAzPC9hPiA8ZW0+KE1hcmNoIDIwMTApPC9lbT4KICAgPGRpdiBjbGFzcz0idG9nZ2xlbWUiPgogCmRpZmYgLS1naXQgYS9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKaW5kZXggYTgwOTgxY2UuLjQwNGU5MzggMTAwNjQ0Ci0tLSBhL2RvY3MvaHRtbC9zZGsvc2RrX3RvYy5jcworKysgYi9kb2NzL2h0bWwvc2RrL3Nka190b2MuY3MKQEAgLTc1LDcgKzc1LDggQEAKICAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3Rvb2xzLW5vdGVzLmh0bWwiPlNESyBUb29scywgcjY8L2E+IDxzcGFuIGNsYXNzPSJuZXciPm5ldyE8L3NwYW4+PC9saT4KKyAgICAgIDxsaT48YSBocmVmPSI8P2NzIHZhcjp0b3Jvb3QgPz5zZGsvdG9vbHMtbm90ZXMuaHRtbCI+U0RLIFRvb2xzLCByNjwvYT4KKyAgICAgIDwvbGk+CiAgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL3dpbi11c2IuaHRtbCI+VVNCIERyaXZlciBmb3IKICAgICAgIFdpbmRvd3MsIHIzPC9hPgogICAgICAgPC9saT4KQEAgLTEwMSw3ICsxMDIsNiBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9ImphIj48L3NwYW4+CiAgICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTpub25lIiBjbGFzcz0iemgtQ04iPjwvc3Bhbj4KICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5Om5vbmUiIGNsYXNzPSJ6aC1UVyI+PC9zcGFuPjwvYT4KLSAgICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj4KICAgICAgIDwvbGk+CiAgICAgPC91bD4KICAgPC9saT4KQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgPHNwYW4gc3R5bGU9ImRpc3BsYXk6bm9uZSIgY2xhc3M9InpoLVRXIj48L3NwYW4+CiAgICAgPC9oMj4KICAgICA8dWw+Ci0gICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL25kay9pbmRleC5odG1sIj5BbmRyb2lkIE5ESywgcjQ8L2E+CisgICAgICA8bGk+PGEgaHJlZj0iPD9jcyB2YXI6dG9yb290ID8+c2RrL25kay9pbmRleC5odG1sIj5BbmRyb2lkIE5ESywgcjRiPC9hPgogICAgICAgPHNwYW4gY2xhc3M9Im5ldyI+bmV3ITwvc3Bhbj48L2xpPgogICAgIDwvdWw+CiAgIDwvbGk+CmRpZmYgLS1naXQgYS9ncmFwaGljcy9qYXZhL2FuZHJvaWQvZ3JhcGhpY3MvSW1hZ2VGb3JtYXQuamF2YSBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5qYXZhCmluZGV4IGYxMjYzNzQuLjNmOWY5NjEgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5qYXZhCisrKyBiL2dyYXBoaWNzL2phdmEvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5qYXZhCkBAIC0xNiw2MSArMTYsODQgQEAKIAogcGFja2FnZSBhbmRyb2lkLmdyYXBoaWNzOwogCi1wdWJsaWMgY2xhc3MgSW1hZ2VGb3JtYXQKLXsKLSAgICAvKiB0aGVzZSBjb25zdGFudHMgYXJlIGNob3NlbiB0byBiZSBiaW5hcnkgY29tcGF0aWJsZSB3aXRoCi0gICAgICogdGhlaXIgcHJldmlvdXMgbG9jYXRpb24gaW4gUGl4ZWxGb3JtYXQuamF2YSAqLwotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAwOworcHVibGljIGNsYXNzIEltYWdlRm9ybWF0IHsKKwkvKgorCSAqIHRoZXNlIGNvbnN0YW50cyBhcmUgY2hvc2VuIHRvIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggdGhlaXIgcHJldmlvdXMKKwkgKiBsb2NhdGlvbiBpbiBQaXhlbEZvcm1hdC5qYXZhCisJICovCiAKLSAgICAvKiogUkdCIGZvcm1hdCB1c2VkIGZvciBwaWN0dXJlcyBlbmNvZGVkIGFzIFJHQl81NjUgICAKLSAgICAgKiAgc2VlIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI3NldFBpY3R1cmVGb3JtYXQoaW50KX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkdCXzU2NSA9IDQ7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTiA9IDA7CiAKLSAgICAvKioKLSAgICAgKiBZQ2JDciBmb3JtYXRzLCB1c2VkIGZvciB2aWRlby4gVGhlc2UgYXJlIG5vdCBuZWNlc3NhcmlseSBzdXBwb3J0ZWQKLSAgICAgKiBieSB0aGUgaGFyZHdhcmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlYxNiA9IDB4MTA7CisJLyoqCisJICogUkdCIGZvcm1hdCB1c2VkIGZvciBwaWN0dXJlcyBlbmNvZGVkIGFzIFJHQl81NjUgc2VlCisJICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjc2V0UGljdHVyZUZvcm1hdChpbnQpfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSR0JfNTY1ID0gNDsKIAotICAgIAotICAgIC8qKiBZQ3JDYiBmb3JtYXQgdXNlZCBmb3IgaW1hZ2VzLCB3aGljaCB1c2VzIHRoZSBOVjIxIGVuY29kaW5nIGZvcm1hdC4gICAKLSAgICAgKiAgVGhpcyBpcyB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIGNhbWVyYSBwcmV2aWV3IGltYWdlcywgd2hlbiBub3QKLSAgICAgKiAgb3RoZXJ3aXNlIHNldCB3aXRoIAotICAgICAqICB7QGxpbmsgYW5kcm9pZC5oYXJkd2FyZS5DYW1lcmEuUGFyYW1ldGVycyNzZXRQcmV2aWV3Rm9ybWF0KGludCl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5WMjEgPSAweDExOworCS8qKgorCSAqIFBsYW5hciA0OjI6MCBZQ3JDYiBmb3JtYXQuIFRoaXMgZm9ybWF0IGFzc3VtZXMgYW4gaG9yaXpvbnRhbCBzdHJpZGUgb2YgMTYKKwkgKiBwaXhlbHMgZm9yIGFsbCBwbGFuZXMgYW5kIGFuIGltcGxpY2l0IHZlcnRpY2FsIHN0cmlkZSBvZiB0aGUgaW1hZ2UKKwkgKiBoZWlnaHQncyBuZXh0IG11bHRpcGxlIG9mIHR3by4KKwkgKiAgIHlfc2l6ZSA9IHN0cmlkZSAqIEFMSUdOKGhlaWdodCwgMikKKwkgKiAgIGNfc2l6ZSA9IEFMSUdOKHN0cmlkZS8yLCAxNikgKiBoZWlnaHQKKwkgKiAgIHNpemUgPSB5X3NpemUgKyBjX3NpemUgKiAyCisJICogICBjcl9vZmZzZXQgPSB5X3NpemUKKwkgKiAgIGNiX29mZnNldCA9IHlfc2l6ZSArIGNfc2l6ZQorCSAqIAorCSAqIFdoZXRoZXIgdGhpcyBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgaGFyZHdhcmUgY2FuIGJlIGRldGVybWluZWQKKwkgKiBieQorCSAqIHtAbGluayBhbmRyb2lkLmhhcmR3YXJlLkNhbWVyYS5QYXJhbWV0ZXJzI2dldFN1cHBvcnRlZFByZXZpZXdGb3JtYXRzKCl9LgorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlWMTIgPSAweDMyMzE1NjU5OwogCisJLyoqCisJICogWUNiQ3IgZm9ybWF0LCB1c2VkIGZvciB2aWRlby4gV2hldGhlciB0aGlzIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhlCisJICogY2FtZXJhIGhhcmR3YXJlIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisJICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoKX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlYxNiA9IDB4MTA7CiAKLSAgICAvKiogWUNiQ3IgZm9ybWF0IHVzZWQgZm9yIGltYWdlcywgd2hpY2ggdXNlcyBZVVlWIChZVVkyKSBlbmNvZGluZyBmb3JtYXQuCi0gICAgICogIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9ybWF0IGZvciBjYW1lcmEgcHJldmlldyBpbWFnZXMuIFdoZXRoZXIgdGhpcwotICAgICAqICBmb3JtYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgaGFyZHdhcmUgY2FuIGJlIGRldGVybWluZWQgYnkKLSAgICAgKiAge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoKX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVVZMiA9IDB4MTQ7CisJLyoqCisJICogWUNyQ2IgZm9ybWF0IHVzZWQgZm9yIGltYWdlcywgd2hpY2ggdXNlcyB0aGUgTlYyMSBlbmNvZGluZyBmb3JtYXQuIFRoaXMKKwkgKiBpcyB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIGNhbWVyYSBwcmV2aWV3IGltYWdlcywgd2hlbiBub3Qgb3RoZXJ3aXNlIHNldAorCSAqIHdpdGgge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjc2V0UHJldmlld0Zvcm1hdChpbnQpfS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVjIxID0gMHgxMTsKIAotICAgIAotICAgIC8qKgotICAgICAqIEVuY29kZWQgZm9ybWF0cy4gIFRoZXNlIGFyZSBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKUEVHID0gMHgxMDA7CisJLyoqCisJICogWUNiQ3IgZm9ybWF0IHVzZWQgZm9yIGltYWdlcywgd2hpY2ggdXNlcyBZVVlWIChZVVkyKSBlbmNvZGluZyBmb3JtYXQuCisJICogVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3JtYXQgZm9yIGNhbWVyYSBwcmV2aWV3IGltYWdlcy4gV2hldGhlciB0aGlzCisJICogZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGhhcmR3YXJlIGNhbiBiZSBkZXRlcm1pbmVkIGJ5CisJICoge0BsaW5rIGFuZHJvaWQuaGFyZHdhcmUuQ2FtZXJhLlBhcmFtZXRlcnMjZ2V0U3VwcG9ydGVkUHJldmlld0Zvcm1hdHMoKX0uCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVVZMiA9IDB4MTQ7CiAKKwkvKioKKwkgKiBFbmNvZGVkIGZvcm1hdHMuIFRoZXNlIGFyZSBub3QgbmVjZXNzYXJpbHkgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZS4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBKUEVHID0gMHgxMDA7CiAKLSAgICAvKioKLSAgICAgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIG9mCi0gICAgICogYW4gSW1hZ2VGb3JtYXQuCi0gICAgICogQHBhcmFtIGZvcm1hdAotICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCBvZiB0aGUgZ2l2ZW4gZm9ybWF0IG9yIC0xIGlmIHRoZQotICAgICAqIGZvcm1hdCBkb2Vzbid0IGV4aXN0IG9yIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Qml0c1BlclBpeGVsKGludCBmb3JtYXQpIHsKLSAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgICAgIGNhc2UgUkdCXzU2NTogICByZXR1cm4gMTY7Ci0gICAgICAgICAgICBjYXNlIE5WMTY6ICAgICAgcmV0dXJuIDE2OwotICAgICAgICAgICAgY2FzZSBOVjIxOiAgICAgIHJldHVybiAxMjsKLSAgICAgICAgICAgIGNhc2UgWVVZMjogICAgICByZXR1cm4gMTY7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KKwkvKioKKwkgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJpdHMgcGVyIHBpeGVsIG9mIGFuCisJICogSW1hZ2VGb3JtYXQuCisJICogCisJICogQHBhcmFtIGZvcm1hdAorCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbCBvZiB0aGUgZ2l2ZW4gZm9ybWF0IG9yIC0xIGlmIHRoZQorCSAqICAgICAgICAgZm9ybWF0IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlwdWJsaWMgc3RhdGljIGludCBnZXRCaXRzUGVyUGl4ZWwoaW50IGZvcm1hdCkgeworCQlzd2l0Y2ggKGZvcm1hdCkgeworCQljYXNlIFJHQl81NjU6CisJCQlyZXR1cm4gMTY7CisJCWNhc2UgTlYxNjoKKwkJCXJldHVybiAxNjsKKwkJY2FzZSBZVVkyOgorCQkJcmV0dXJuIDE2OworCQljYXNlIFlWMTI6CisJCQlyZXR1cm4gMTI7CisJCWNhc2UgTlYyMToKKwkJCXJldHVybiAxMjsKKwkJfQorCQlyZXR1cm4gLTE7CisJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaCBiL2luY2x1ZGUvYW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfYXBwX05hdGl2ZUFjdGl2aXR5LmgKaW5kZXggZjgwODMyOC4uZDdhOWEyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9hcHBfTmF0aXZlQWN0aXZpdHkuaAorKysgYi9pbmNsdWRlL2FuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oCkBAIC0xNyw2ICsxNyw4IEBACiAjaWZuZGVmIF9BTkRST0lEX0FQUF9OQVRJVkVBQ1RJVklUWV9ICiAjZGVmaW5lIF9BTkRST0lEX0FQUF9OQVRJVkVBQ1RJVklUWV9ICiAKKyNpbmNsdWRlIDx1aS9JbnB1dFRyYW5zcG9ydC5oPgorCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaD4KIAogI2luY2x1ZGUgImpuaS5oIgpAQCAtMjksNyArMzEsNjUgQEAKIGV4dGVybiB2b2lkIGFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93RmxhZ3MoCiAgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgdmFsdWVzLCBpbnQzMl90IG1hc2spOwogCitleHRlcm4gdm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3Nob3dTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpOworCitleHRlcm4gdm9pZCBhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X2hpZGVTb2Z0SW5wdXQoCisgICAgICAgIEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIGludDMyX3QgZmxhZ3MpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKKworLyoKKyAqIE5ESyBpbnB1dCBxdWV1ZSBBUEkuCisgKi8KK3N0cnVjdCBBSW5wdXRRdWV1ZSB7CitwdWJsaWM6CisgICAgLyogQ3JlYXRlcyBhIGNvbnN1bWVyIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnB1dCBjaGFubmVsLiAqLworICAgIGV4cGxpY2l0IEFJbnB1dFF1ZXVlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklucHV0Q2hhbm5lbD4mIGNoYW5uZWwsIGludCB3b3JrV3JpdGUpOworCisgICAgLyogRGVzdHJveXMgdGhlIGNvbnN1bWVyIGFuZCByZWxlYXNlcyBpdHMgaW5wdXQgY2hhbm5lbC4gKi8KKyAgICB+QUlucHV0UXVldWUoKTsKKworICAgIHZvaWQgYXR0YWNoTG9vcGVyKEFMb29wZXIqIGxvb3BlciwgQUxvb3Blcl9jYWxsYmFja0Z1bmMqIGNhbGxiYWNrLCB2b2lkKiBkYXRhKTsKKworICAgIHZvaWQgZGV0YWNoTG9vcGVyKCk7CisKKyAgICBpbnQzMl90IGhhc0V2ZW50cygpOworCisgICAgaW50MzJfdCBnZXRFdmVudChBSW5wdXRFdmVudCoqIG91dEV2ZW50KTsKKworICAgIHZvaWQgZmluaXNoRXZlbnQoQUlucHV0RXZlbnQqIGV2ZW50LCBib29sIGhhbmRsZWQpOworCisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBpbmxpbmUgYW5kcm9pZDo6SW5wdXRDb25zdW1lciYgZ2V0Q29uc3VtZXIoKSB7IHJldHVybiBtQ29uc3VtZXI7IH0KKworICAgIHZvaWQgZGlzcGF0Y2hFdmVudChhbmRyb2lkOjpLZXlFdmVudCogZXZlbnQpOworCisgICAgYW5kcm9pZDo6S2V5RXZlbnQqIGNvbnN1bWVVbmhhbmRsZWRFdmVudCgpOworCisgICAgaW50IG1Xb3JrV3JpdGU7CisKK3ByaXZhdGU6CisgICAgdm9pZCBkb0RlZmF1bHRLZXkoYW5kcm9pZDo6S2V5RXZlbnQqIGtleUV2ZW50KTsKKworICAgIGFuZHJvaWQ6OklucHV0Q29uc3VtZXIgbUNvbnN1bWVyOworICAgIGFuZHJvaWQ6OlByZWFsbG9jYXRlZElucHV0RXZlbnRGYWN0b3J5IG1JbnB1dEV2ZW50RmFjdG9yeTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpQb2xsTG9vcD4gbVBvbGxMb29wOworCisgICAgaW50IG1EaXNwYXRjaEtleVJlYWQ7CisgICAgaW50IG1EaXNwYXRjaEtleVdyaXRlOworCisgICAgLy8gVGhpcyBpcyBvbmx5IHRvdWNoZWQgYnkgdGhlIGV2ZW50IHJlYWRlciB0aHJlYWQuICBJdCBpcyB0aGUgY3VycmVudAorICAgIC8vIGtleSBldmVudHMgdGhhdCBjYW1lIG91dCBvZiB0aGUgbURpc3BhdGNoaW5nS2V5cyBsaXN0IGFuZCBhcmUgbm93CisgICAgLy/KZGVsaXZlcmVkIHRvIHRoZSBhcHAuCisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OktleUV2ZW50Kj4gbURlbGl2ZXJpbmdLZXlzOworCisgICAgYW5kcm9pZDo6TXV0ZXggbUxvY2s7CisgICAgYW5kcm9pZDo6VmVjdG9yPGFuZHJvaWQ6OktleUV2ZW50Kj4gbVBlbmRpbmdLZXlzOworICAgIGFuZHJvaWQ6OlZlY3RvcjxhbmRyb2lkOjpLZXlFdmVudCo+IG1EaXNwYXRjaGluZ0tleXM7Cit9OworCiAjZW5kaWYgLy8gX0FORFJPSURfQVBQX05BVElWRUFDVElWSVRZX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYmluZGVyL1BhcmNlbC5oIGIvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKaW5kZXggMmNjNGRiOS4uM2FiYTVmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKKysrIGIvaW5jbHVkZS9iaW5kZXIvUGFyY2VsLmgKQEAgLTEwMyw2ICsxMDMsMTEgQEAKICAgICAKICAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlT2JqZWN0KGNvbnN0IGZsYXRfYmluZGVyX29iamVjdCYgdmFsLCBib29sIG51bGxNZXRhRGF0YSk7CiAKKyAgICAvLyBMaWtlIFBhcmNlbC5qYXZhJ3Mgd3JpdGVOb0V4Y2VwdGlvbigpLiAgSnVzdCB3cml0ZXMgYSB6ZXJvIGludDMyLgorICAgIC8vIEN1cnJlbnRseSB0aGUgbmF0aXZlIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgZG8gYW55IG9mIHRoZSBTdHJpY3RNb2RlCisgICAgLy8gc3RhY2sgZ2F0aGVyaW5nIGFuZCBzZXJpYWxpemF0aW9uIHRoYXQgdGhlIEphdmEgaW1wbGVtZW50YXRpb24gZG9lcy4KKyAgICBzdGF0dXNfdCAgICAgICAgICAgIHdyaXRlTm9FeGNlcHRpb24oKTsKKwogICAgIHZvaWQgICAgICAgICAgICAgICAgcmVtb3ZlKHNpemVfdCBzdGFydCwgc2l6ZV90IGFtdCk7CiAgICAgCiAgICAgc3RhdHVzX3QgICAgICAgICAgICByZWFkKHZvaWQqIG91dERhdGEsIHNpemVfdCBsZW4pIGNvbnN0OwpAQCAtMTI1LDcgKzEzMCwxNCBAQAogICAgIHNwPElCaW5kZXI+ICAgICAgICAgcmVhZFN0cm9uZ0JpbmRlcigpIGNvbnN0OwogICAgIHdwPElCaW5kZXI+ICAgICAgICAgcmVhZFdlYWtCaW5kZXIoKSBjb25zdDsKICAgICBzdGF0dXNfdCAgICAgICAgICAgIHJlYWQoRmxhdHRlbmFibGUmIHZhbCkgY29uc3Q7Ci0gICAgCisKKyAgICAvLyBMaWtlIFBhcmNlbC5qYXZhJ3MgcmVhZEV4Y2VwdGlvbkNvZGUoKS4gIFJlYWRzIHRoZSBmaXJzdCBpbnQzMgorICAgIC8vIG9mZiBvZiBhIFBhcmNlbCdzIGhlYWRlciwgcmV0dXJuaW5nIDAgb3IgdGhlIG5lZ2F0aXZlIGVycm9yCisgICAgLy8gY29kZSBvbiBleGNlcHRpb25zLCBidXQgYWxzbyBkZWFscyB3aXRoIHNraXBwaW5nIG92ZXIgcmljaAorICAgIC8vIHJlc3BvbnNlIGhlYWRlcnMuICBDYWxsZXJzIHNob3VsZCB1c2UgdGhpcyB0byByZWFkICYgcGFyc2UgdGhlCisgICAgLy8gcmVzcG9uc2UgaGVhZGVycyByYXRoZXIgdGhhbiBkb2luZyBpdCBieSBoYW5kLgorICAgIGludDMyX3QgICAgICAgICAgICAgcmVhZEV4Y2VwdGlvbkNvZGUoKSBjb25zdDsKKwogICAgIC8vIFJldHJpZXZlIG5hdGl2ZV9oYW5kbGUgZnJvbSB0aGUgcGFyY2VsLiBUaGlzIHJldHVybnMgYSBjb3B5IG9mIHRoZQogICAgIC8vIHBhcmNlbCdzIG5hdGl2ZV9oYW5kbGUgKHRoZSBjYWxsZXIgdGFrZXMgb3duZXJzaGlwKS4gVGhlIGNhbGxlcgogICAgIC8vIG11c3QgZnJlZSB0aGUgbmF0aXZlX2hhbmRsZSB3aXRoIG5hdGl2ZV9oYW5kbGVfY2xvc2UoKSBhbmQgCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oIGIvaW5jbHVkZS9tZWRpYS9FZmZlY3RBcGkuaAppbmRleCBiNGQ3MzhjLi45ZjNkMGI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL0VmZmVjdEFwaS5oCisrKyBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0QXBpLmgKQEAgLTIyMyw2ICsyMjMsMTEgQEAKIC8vICAgICAgICAgIHNhbXBsZXMgYXMgc3BlY2lmaWVkIGluIG91dHB1dCBidWZmZXIgZGVzY3JpcHRvci4gSWYgdGhlIGJ1ZmZlciBkZXNjcmlwdG9yCiAvLyAgICAgICAgICBpcyBub3Qgc3BlY2lmaWVkIHRoZSBmdW5jdGlvbiBtdXN0IHVzZSBlaXRoZXIgdGhlIGJ1ZmZlciBvciB0aGUKIC8vICAgICAgICAgIGJ1ZmZlciBwcm92aWRlciBmdW5jdGlvbiBpbnN0YWxsZWQgYnkgdGhlIEVGRkVDVF9DTURfQ09ORklHVVJFIGNvbW1hbmQuCisvLyAgICAgICAgICBUaGUgZWZmZWN0IGZyYW1ld29yayB3aWxsIGNhbGwgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBhZnRlciB0aGUgRUZGRUNUX0NNRF9FTkFCTEUKKy8vICAgICAgICAgIGNvbW1hbmQgaXMgcmVjZWl2ZWQgYW5kIHVudGlsIHRoZSBFRkZFQ1RfQ01EX0RJU0FCTEUgaXMgcmVjZWl2ZWQuIFdoZW4gdGhlIGVuZ2luZQorLy8gICAgICAgICAgcmVjZWl2ZXMgdGhlIEVGRkVDVF9DTURfRElTQUJMRSBjb21tYW5kIGl0IHNob3VsZCB0dXJuIG9mZiB0aGUgZWZmZWN0IGdyYWNlZnVsbHkKKy8vICAgICAgICAgIGFuZCB3aGVuIGRvbmUgaW5kaWNhdGUgdGhhdCBpdCBpcyBPSyB0byBzdG9wIGNhbGxpbmcgdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBieQorLy8gICAgICAgICAgcmV0dXJuaW5nIHRoZSAtRU5PREFUQSBzdGF0dXMuCiAvLwogLy8gICAgTk9URTogdGhlIHByb2Nlc3MoKSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgInJlYWwtdGltZSBzYWZlIiB0aGF0IGlzCiAvLyAgICAgIGl0IHNob3VsZCBub3QgcGVyZm9ybSBibG9ja2luZyBjYWxsczogbWFsbG9jL2ZyZWUsIHNsZWVwLCByZWFkL3dyaXRlL29wZW4vY2xvc2UsCkBAIC0yMzksNiArMjQ0LDggQEAKIC8vCiAvLyAgICBPdXRwdXQ6CiAvLyAgICAgICAgcmV0dXJuZWQgdmFsdWU6ICAgIDAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PREFUQSB0aGUgZW5naW5lIGhhcyBmaW5pc2hlZCB0aGUgZGlzYWJsZSBwaGFzZSBhbmQgdGhlIGZyYW1ld29yaworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIHN0b3AgY2FsbGluZyBwcm9jZXNzKCkKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMIGludmFsaWQgaW50ZXJmYWNlIGhhbmRsZSBvcgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZCBpbnB1dC9vdXRwdXQgYnVmZmVyIGRlc2NyaXB0aW9uCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaCBiL2luY2x1ZGUvbWVkaWEvRWZmZWN0RXF1YWxpemVyQXBpLmgKaW5kZXggZTMwNjlkNS4uY2IwNWIzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9FZmZlY3RFcXVhbGl6ZXJBcGkuaAorKysgYi9pbmNsdWRlL21lZGlhL0VmZmVjdEVxdWFsaXplckFwaS5oCkBAIC0xOSwxNCArMTksMTMgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0VmZmVjdEFwaS5oPgogCisvLyBmb3IgdGhlIGRlZmluaXRpb24gb2YgU0xfSUlEX0VRVUFMSVpFUgorI2luY2x1ZGUgIk9wZW5TTEVTLmgiCisKICNpZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAotLy9UT0RPIHJlcGxhY2UgYnkgb3BlblNMIEVTIGluY2x1ZGUgd2hlbiBhdmFpbGFibGUKLXN0YXRpYyBjb25zdCBlZmZlY3RfdXVpZF90IFNMX0lJRF9FUVVBTElaRVJfID0geyAweDBiZWQ0MzAwLCAweGRkZDYsIDB4MTFkYiwgMHg4ZjM0LCB7IDB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWIgfSB9OwotY29uc3QgZWZmZWN0X3V1aWRfdCAqIGNvbnN0IFNMX0lJRF9FUVVBTElaRVIgPSAmU0xfSUlEX0VRVUFMSVpFUl87Ci0KIC8qIGVudW1lcmF0ZWQgcGFyYW1ldGVycyBmb3IgRXF1YWxpemVyIGVmZmVjdCAqLwogdHlwZWRlZiBlbnVtCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VpL0lucHV0LmggYi9pbmNsdWRlL3VpL0lucHV0LmgKaW5kZXggYTJlMGJhMDYuLmE3ZDIzZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWkvSW5wdXQuaAorKysgYi9pbmNsdWRlL3VpL0lucHV0LmgKQEAgLTQzLDcgKzQzLDkgQEAKIC8qCiAgKiBEZWNsYXJlIGEgY29uY3JldGUgdHlwZSBmb3IgdGhlIE5ESydzIGlucHV0IGV2ZW50IGZvcndhcmQgZGVjbGFyYXRpb24uCiAgKi8KLXN0cnVjdCBBSW5wdXRFdmVudCB7IH07CitzdHJ1Y3QgQUlucHV0RXZlbnQgeworICAgIHZpcnR1YWwgfkFJbnB1dEV2ZW50KCkgeyB9Cit9OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSW5wdXREZXZpY2UuaCBiL2luY2x1ZGUvdWkvSW5wdXREZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDIwNjAwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91aS9JbnB1dERldmljZS5oCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfVUlfSU5QVVRfREVWSUNFX0gKKyNkZWZpbmUgX1VJX0lOUFVUX0RFVklDRV9ICisKKyNpbmNsdWRlIDx1aS9FdmVudEh1Yi5oPgorI2luY2x1ZGUgPHVpL0lucHV0Lmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9CaXRTZXQuaD4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisvKiBNYXhpbXVtIHBvaW50ZXIgaWQgdmFsdWUgc3VwcG9ydGVkLgorICogKFRoaXMgaXMgbGltaXRlZCBieSBvdXIgdXNlIG9mIEJpdFNldDMyIHRvIHRyYWNrIHBvaW50ZXIgYXNzaWdubWVudHMuKSAqLworI2RlZmluZSBNQVhfUE9JTlRFUl9JRCAzMQorCisvKiBNYXhpbXVtIG51bWJlciBvZiBoaXN0b3JpY2FsIHNhbXBsZXMgdG8gYXZlcmFnZS4gKi8KKyNkZWZpbmUgQVZFUkFHSU5HX0hJU1RPUllfU0laRSA1CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gaW50MzJfdCB1cGRhdGVNZXRhU3RhdGUoaW50MzJfdCBrZXlDb2RlLCBib29sIGRvd24sIGludDMyX3Qgb2xkTWV0YVN0YXRlKTsKK2V4dGVybiBpbnQzMl90IHJvdGF0ZUtleUNvZGUoaW50MzJfdCBrZXlDb2RlLCBpbnQzMl90IG9yaWVudGF0aW9uKTsKKworLyoKKyAqIEFuIGlucHV0IGRldmljZSBzdHJ1Y3R1cmUgdHJhY2tzIHRoZSBzdGF0ZSBvZiBhIHNpbmdsZSBpbnB1dCBkZXZpY2UuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGJ5IFJlYWRlclRocmVhZCBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHNoYXJlZCB3aXRoCisgKiBEaXNwYXRjaGVyVGhyZWFkIChiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBsb2NraW5nKS4gIFRoaXMgd29ya3Mgb3V0IGZpbmUgYmVjYXVzZQorICogRGlzcGF0Y2hlclRocmVhZCBpcyBvbmx5IGludGVyZXN0ZWQgaW4gY29va2VkIGV2ZW50IGRhdGEgYW55d2F5cyBhbmQgZG9lcyBub3QgbmVlZAorICogYW55IG9mIHRoZSBsb3ctbGV2ZWwgZGF0YSBmcm9tIElucHV0RGV2aWNlLgorICovCitzdHJ1Y3QgSW5wdXREZXZpY2UgeworICAgIHN0cnVjdCBBYnNvbHV0ZUF4aXNJbmZvIHsKKyAgICAgICAgYm9vbCB2YWxpZDsgICAgICAgIC8vIHNldCB0byB0cnVlIGlmIGF4aXMgcGFyYW1ldGVycyBhcmUga25vd24sIGZhbHNlIG90aGVyd2lzZQorCisgICAgICAgIGludDMyX3QgbWluVmFsdWU7ICAvLyBtaW5pbXVtIHZhbHVlCisgICAgICAgIGludDMyX3QgbWF4VmFsdWU7ICAvLyBtYXhpbXVtIHZhbHVlCisgICAgICAgIGludDMyX3QgcmFuZ2U7ICAgICAvLyByYW5nZSBvZiB2YWx1ZXMsIGVxdWFsIHRvIG1heFZhbHVlIC0gbWluVmFsdWUKKyAgICAgICAgaW50MzJfdCBmbGF0OyAgICAgIC8vIGNlbnRlciBmbGF0IHBvc2l0aW9uLCBlZy4gZmxhdCA9PSA4IG1lYW5zIGNlbnRlciBpcyBiZXR3ZWVuIC04IGFuZCA4CisgICAgICAgIGludDMyX3QgZnV6ejsgICAgICAvLyBlcnJvciB0b2xlcmFuY2UsIGVnLiBmdXp6ID09IDQgbWVhbnMgdmFsdWUgaXMgKy8tIDQgZHVlIHRvIG5vaXNlCisgICAgfTsKKworICAgIHN0cnVjdCBWaXJ0dWFsS2V5IHsKKyAgICAgICAgaW50MzJfdCBrZXlDb2RlOworICAgICAgICBpbnQzMl90IHNjYW5Db2RlOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKworICAgICAgICAvLyBjb21wdXRlZCBoaXQgYm94LCBzcGVjaWZpZWQgaW4gdG91Y2ggc2NyZWVuIGNvb3JkcyBiYXNlZCBvbiBrbm93biBkaXNwbGF5IHNpemUKKyAgICAgICAgaW50MzJfdCBoaXRMZWZ0OworICAgICAgICBpbnQzMl90IGhpdFRvcDsKKyAgICAgICAgaW50MzJfdCBoaXRSaWdodDsKKyAgICAgICAgaW50MzJfdCBoaXRCb3R0b207CisKKyAgICAgICAgaW5saW5lIGJvb2wgaXNIaXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB4ID49IGhpdExlZnQgJiYgeCA8PSBoaXRSaWdodCAmJiB5ID49IGhpdFRvcCAmJiB5IDw9IGhpdEJvdHRvbTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgS2V5Ym9hcmRTdGF0ZSB7CisgICAgICAgIHN0cnVjdCBDdXJyZW50IHsKKyAgICAgICAgICAgIGludDMyX3QgbWV0YVN0YXRlOworICAgICAgICAgICAgbnNlY3NfdCBkb3duVGltZTsgLy8gdGltZSBvZiBtb3N0IHJlY2VudCBrZXkgZG93bgorICAgICAgICB9IGN1cnJlbnQ7CisKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgVHJhY2tiYWxsU3RhdGUgeworICAgICAgICBzdHJ1Y3QgQWNjdW11bGF0b3IgeworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgICAgRklFTERfQlROX01PVVNFID0gMSwKKyAgICAgICAgICAgICAgICBGSUVMRF9SRUxfWCA9IDIsCisgICAgICAgICAgICAgICAgRklFTERfUkVMX1kgPSA0CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB1aW50MzJfdCBmaWVsZHM7CisKKyAgICAgICAgICAgIGJvb2wgYnRuTW91c2U7CisgICAgICAgICAgICBpbnQzMl90IHJlbFg7CisgICAgICAgICAgICBpbnQzMl90IHJlbFk7CisKKyAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgICAgIGZpZWxkcyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlubGluZSBib29sIGlzRGlydHkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcyAhPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGFjY3VtdWxhdG9yOworCisgICAgICAgIHN0cnVjdCBDdXJyZW50IHsKKyAgICAgICAgICAgIGJvb2wgZG93bjsKKyAgICAgICAgICAgIG5zZWNzX3QgZG93blRpbWU7CisgICAgICAgIH0gY3VycmVudDsKKworICAgICAgICBzdHJ1Y3QgUHJlY2FsY3VsYXRlZCB7CisgICAgICAgICAgICBmbG9hdCB4U2NhbGU7CisgICAgICAgICAgICBmbG9hdCB5U2NhbGU7CisgICAgICAgICAgICBmbG9hdCB4UHJlY2lzaW9uOworICAgICAgICAgICAgZmxvYXQgeVByZWNpc2lvbjsKKyAgICAgICAgfSBwcmVjYWxjdWxhdGVkOworCisgICAgICAgIHZvaWQgcmVzZXQoKTsKKyAgICB9OworCisgICAgc3RydWN0IFNpbmdsZVRvdWNoU2NyZWVuU3RhdGUgeworICAgICAgICBzdHJ1Y3QgQWNjdW11bGF0b3IgeworICAgICAgICAgICAgZW51bSB7CisgICAgICAgICAgICAgICAgRklFTERfQlROX1RPVUNIID0gMSwKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfWCA9IDIsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX1kgPSA0LAorICAgICAgICAgICAgICAgIEZJRUxEX0FCU19QUkVTU1VSRSA9IDgsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX1RPT0xfV0lEVEggPSAxNgorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOworCisgICAgICAgICAgICBib29sIGJ0blRvdWNoOworICAgICAgICAgICAgaW50MzJfdCBhYnNYOworICAgICAgICAgICAgaW50MzJfdCBhYnNZOworICAgICAgICAgICAgaW50MzJfdCBhYnNQcmVzc3VyZTsKKyAgICAgICAgICAgIGludDMyX3QgYWJzVG9vbFdpZHRoOworCisgICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbmxpbmUgYm9vbCBpc0RpcnR5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMgIT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBhY2N1bXVsYXRvcjsKKworICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7CisgICAgICAgICAgICBib29sIGRvd247CisgICAgICAgICAgICBpbnQzMl90IHg7CisgICAgICAgICAgICBpbnQzMl90IHk7CisgICAgICAgICAgICBpbnQzMl90IHByZXNzdXJlOworICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICB9IGN1cnJlbnQ7CisKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgTXVsdGlUb3VjaFNjcmVlblN0YXRlIHsKKyAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKKyAgICAgICAgICAgIGVudW0geworICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9QT1NJVElPTl9YID0gMSwKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfUE9TSVRJT05fWSA9IDIsCisgICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1RPVUNIX01BSk9SID0gNCwKKyAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfV0lEVEhfTUFKT1IgPSA4LAorICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9UUkFDS0lOR19JRCA9IDE2CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB1aW50MzJfdCBwb2ludGVyQ291bnQ7CisgICAgICAgICAgICBzdHJ1Y3QgUG9pbnRlciB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBhYnNNVFBvc2l0aW9uWDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UUG9zaXRpb25ZOworICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRUb3VjaE1ham9yOworICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRXaWR0aE1ham9yOworICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRUcmFja2luZ0lkOworCisgICAgICAgICAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBwb2ludGVyc1tNQVhfUE9JTlRFUlMgKyAxXTsgLy8gKyAxIHRvIHJlbW92ZSB0aGUgbmVlZCBmb3IgZXh0cmEgcmFuZ2UgY2hlY2tzCisKKyAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcG9pbnRlcnNbMF0uY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5saW5lIGJvb2wgaXNEaXJ0eSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRlckNvdW50ICE9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gYWNjdW11bGF0b3I7CisKKyAgICAgICAgdm9pZCByZXNldCgpOworICAgIH07CisKKyAgICBzdHJ1Y3QgUG9pbnRlckRhdGEgeworICAgICAgICB1aW50MzJfdCBpZDsKKyAgICAgICAgaW50MzJfdCB4OworICAgICAgICBpbnQzMl90IHk7CisgICAgICAgIGludDMyX3QgcHJlc3N1cmU7CisgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICB9OworCisgICAgc3RydWN0IFRvdWNoRGF0YSB7CisgICAgICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudDsKKyAgICAgICAgUG9pbnRlckRhdGEgcG9pbnRlcnNbTUFYX1BPSU5URVJTXTsKKyAgICAgICAgQml0U2V0MzIgaWRCaXRzOworICAgICAgICB1aW50MzJfdCBpZFRvSW5kZXhbTUFYX1BPSU5URVJfSUQgKyAxXTsKKworICAgICAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IFRvdWNoRGF0YSYgb3RoZXIpOworCisgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgcG9pbnRlckNvdW50ID0gMDsKKyAgICAgICAgICAgIGlkQml0cy5jbGVhcigpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIGNvbW1vbiBzdGF0ZSB1c2VkIGZvciBib3RoIHNpbmdsZS10b3VjaCBhbmQgbXVsdGktdG91Y2ggc2NyZWVucyBhZnRlciB0aGUgaW5pdGlhbAorICAgIC8vIHRvdWNoIGRlY29kaW5nIGhhcyBiZWVuIHBlcmZvcm1lZAorICAgIHN0cnVjdCBUb3VjaFNjcmVlblN0YXRlIHsKKyAgICAgICAgVmVjdG9yPFZpcnR1YWxLZXk+IHZpcnR1YWxLZXlzOworCisgICAgICAgIHN0cnVjdCBQYXJhbWV0ZXJzIHsKKyAgICAgICAgICAgIGJvb2wgdXNlQmFkVG91Y2hGaWx0ZXI7CisgICAgICAgICAgICBib29sIHVzZUp1bXB5VG91Y2hGaWx0ZXI7CisgICAgICAgICAgICBib29sIHVzZUF2ZXJhZ2luZ1RvdWNoRmlsdGVyOworCisgICAgICAgICAgICBBYnNvbHV0ZUF4aXNJbmZvIHhBeGlzOworICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyB5QXhpczsKKyAgICAgICAgICAgIEFic29sdXRlQXhpc0luZm8gcHJlc3N1cmVBeGlzOworICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyBzaXplQXhpczsKKyAgICAgICAgfSBwYXJhbWV0ZXJzOworCisgICAgICAgIC8vIFRoZSB0b3VjaCBkYXRhIG9mIHRoZSBjdXJyZW50IHNhbXBsZSBiZWluZyBwcm9jZXNzZWQuCisgICAgICAgIFRvdWNoRGF0YSBjdXJyZW50VG91Y2g7CisKKyAgICAgICAgLy8gVGhlIHRvdWNoIGRhdGEgb2YgdGhlIHByZXZpb3VzIHNhbXBsZSB0aGF0IHdhcyBwcm9jZXNzZWQuICBUaGlzIGlzIHVwZGF0ZWQKKyAgICAgICAgLy8gaW5jcmVtZW50YWxseSB3aGlsZSB0aGUgY3VycmVudCBzYW1wbGUgaXMgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAgICBUb3VjaERhdGEgbGFzdFRvdWNoOworCisgICAgICAgIC8vIFRoZSB0aW1lIHRoZSBwcmltYXJ5IHBvaW50ZXIgbGFzdCB3ZW50IGRvd24uCisgICAgICAgIG5zZWNzX3QgZG93blRpbWU7CisKKyAgICAgICAgc3RydWN0IEN1cnJlbnRWaXJ0dWFsS2V5U3RhdGUgeworICAgICAgICAgICAgZW51bSBTdGF0dXMgeworICAgICAgICAgICAgICAgIFNUQVRVU19VUCwKKyAgICAgICAgICAgICAgICBTVEFUVVNfRE9XTiwKKyAgICAgICAgICAgICAgICBTVEFUVVNfQ0FOQ0VMRUQKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIFN0YXR1cyBzdGF0dXM7CisgICAgICAgICAgICBuc2Vjc190IGRvd25UaW1lOworICAgICAgICAgICAgaW50MzJfdCBrZXlDb2RlOworICAgICAgICAgICAgaW50MzJfdCBzY2FuQ29kZTsKKyAgICAgICAgfSBjdXJyZW50VmlydHVhbEtleTsKKworICAgICAgICBzdHJ1Y3QgQXZlcmFnaW5nVG91Y2hGaWx0ZXJTdGF0ZSB7CisgICAgICAgICAgICAvLyBJbmRpdmlkdWFsIGhpc3RvcnkgdHJhY2tzIGFyZSBzdG9yZWQgYnkgcG9pbnRlciBpZAorICAgICAgICAgICAgdWludDMyX3QgaGlzdG9yeVN0YXJ0W01BWF9QT0lOVEVSU107CisgICAgICAgICAgICB1aW50MzJfdCBoaXN0b3J5RW5kW01BWF9QT0lOVEVSU107CisgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5OworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByZXNzdXJlOworICAgICAgICAgICAgICAgIH0gcG9pbnRlcnNbTUFYX1BPSU5URVJTXTsKKyAgICAgICAgICAgIH0gaGlzdG9yeURhdGFbQVZFUkFHSU5HX0hJU1RPUllfU0laRV07CisgICAgICAgIH0gYXZlcmFnaW5nVG91Y2hGaWx0ZXI7CisKKyAgICAgICAgc3RydWN0IEp1bXBUb3VjaEZpbHRlclN0YXRlIHsKKyAgICAgICAgICAgIGludDMyX3QganVtcHlQb2ludHNEcm9wcGVkOworICAgICAgICB9IGp1bXB5VG91Y2hGaWx0ZXI7CisKKyAgICAgICAgc3RydWN0IFByZWNhbGN1bGF0ZWQgeworICAgICAgICAgICAgaW50MzJfdCB4T3JpZ2luOworICAgICAgICAgICAgZmxvYXQgeFNjYWxlOworCisgICAgICAgICAgICBpbnQzMl90IHlPcmlnaW47CisgICAgICAgICAgICBmbG9hdCB5U2NhbGU7CisKKyAgICAgICAgICAgIGludDMyX3QgcHJlc3N1cmVPcmlnaW47CisgICAgICAgICAgICBmbG9hdCBwcmVzc3VyZVNjYWxlOworCisgICAgICAgICAgICBpbnQzMl90IHNpemVPcmlnaW47CisgICAgICAgICAgICBmbG9hdCBzaXplU2NhbGU7CisgICAgICAgIH0gcHJlY2FsY3VsYXRlZDsKKworICAgICAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgYm9vbCBhcHBseUJhZFRvdWNoRmlsdGVyKCk7CisgICAgICAgIGJvb2wgYXBwbHlKdW1weVRvdWNoRmlsdGVyKCk7CisgICAgICAgIHZvaWQgYXBwbHlBdmVyYWdpbmdUb3VjaEZpbHRlcigpOworICAgICAgICB2b2lkIGNhbGN1bGF0ZVBvaW50ZXJJZHMoKTsKKworICAgICAgICBib29sIGlzUG9pbnRJbnNpZGVEaXNwbGF5KGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdDsKKyAgICAgICAgY29uc3QgSW5wdXREZXZpY2U6OlZpcnR1YWxLZXkqIGZpbmRWaXJ0dWFsS2V5SGl0KCkgY29uc3Q7CisgICAgfTsKKworICAgIElucHV0RGV2aWNlKGludDMyX3QgaWQsIHVpbnQzMl90IGNsYXNzZXMsIFN0cmluZzggbmFtZSk7CisKKyAgICBpbnQzMl90IGlkOworICAgIHVpbnQzMl90IGNsYXNzZXM7CisgICAgU3RyaW5nOCBuYW1lOworICAgIGJvb2wgaWdub3JlZDsKKworICAgIEtleWJvYXJkU3RhdGUga2V5Ym9hcmQ7CisgICAgVHJhY2tiYWxsU3RhdGUgdHJhY2tiYWxsOworICAgIFRvdWNoU2NyZWVuU3RhdGUgdG91Y2hTY3JlZW47CisgICAgdW5pb24geworICAgICAgICBTaW5nbGVUb3VjaFNjcmVlblN0YXRlIHNpbmdsZVRvdWNoU2NyZWVuOworICAgICAgICBNdWx0aVRvdWNoU2NyZWVuU3RhdGUgbXVsdGlUb3VjaFNjcmVlbjsKKyAgICB9OworCisgICAgdm9pZCByZXNldCgpOworCisgICAgaW5saW5lIGJvb2wgaXNLZXlib2FyZCgpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0FscGhhS2V5KCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19BTFBIQUtFWTsgfQorICAgIGlubGluZSBib29sIGlzVHJhY2tiYWxsKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19UUkFDS0JBTEw7IH0KKyAgICBpbmxpbmUgYm9vbCBpc0RQYWQoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX0RQQUQ7IH0KKyAgICBpbmxpbmUgYm9vbCBpc1NpbmdsZVRvdWNoU2NyZWVuKCkgY29uc3QgeyByZXR1cm4gKGNsYXNzZXMKKyAgICAgICAgICAgICYgKElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTiB8IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVCkpCisgICAgICAgICAgICA9PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU47IH0KKyAgICBpbmxpbmUgYm9vbCBpc011bHRpVG91Y2hTY3JlZW4oKSBjb25zdCB7IHJldHVybiBjbGFzc2VzCisgICAgICAgICAgICAmIElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVDsgfQorICAgIGlubGluZSBib29sIGlzVG91Y2hTY3JlZW4oKSBjb25zdCB7IHJldHVybiBjbGFzc2VzCisgICAgICAgICAgICAmIChJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU4gfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfVUlfSU5QVVRfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSW5wdXRSZWFkZXIuaCBiL2luY2x1ZGUvdWkvSW5wdXRSZWFkZXIuaAppbmRleCAwM2M4MTEyLi44NWEwMDg0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lucHV0UmVhZGVyLmgKKysrIGIvaW5jbHVkZS91aS9JbnB1dFJlYWRlci5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDx1aS9FdmVudEh1Yi5oPgogI2luY2x1ZGUgPHVpL0lucHV0Lmg+CisjaW5jbHVkZSA8dWkvSW5wdXREZXZpY2UuaD4KICNpbmNsdWRlIDx1aS9JbnB1dERpc3BhdGNoZXIuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KQEAgLTMwLDMxMSArMzEsOCBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0vKiBNYXhpbXVtIHBvaW50ZXIgaWQgdmFsdWUgc3VwcG9ydGVkLgotICogKFRoaXMgaXMgbGltaXRlZCBieSBvdXIgdXNlIG9mIEJpdFNldDMyIHRvIHRyYWNrIHBvaW50ZXIgYXNzaWdubWVudHMuKSAqLwotI2RlZmluZSBNQVhfUE9JTlRFUl9JRCAzMgotCi0vKiBNYXhpbXVtIG51bWJlciBvZiBoaXN0b3JpY2FsIHNhbXBsZXMgdG8gYXZlcmFnZS4gKi8KLSNkZWZpbmUgQVZFUkFHSU5HX0hJU1RPUllfU0laRSA1Ci0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1leHRlcm4gaW50MzJfdCB1cGRhdGVNZXRhU3RhdGUoaW50MzJfdCBrZXlDb2RlLCBib29sIGRvd24sIGludDMyX3Qgb2xkTWV0YVN0YXRlKTsKLWV4dGVybiBpbnQzMl90IHJvdGF0ZUtleUNvZGUoaW50MzJfdCBrZXlDb2RlLCBpbnQzMl90IG9yaWVudGF0aW9uKTsKLQotLyoKLSAqIEFuIGlucHV0IGRldmljZSBzdHJ1Y3R1cmUgdHJhY2tzIHRoZSBzdGF0ZSBvZiBhIHNpbmdsZSBpbnB1dCBkZXZpY2UuCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgaXMgb25seSB1c2VkIGJ5IFJlYWRlclRocmVhZCBhbmQgaXMgbm90IGludGVuZGVkIHRvIGJlIHNoYXJlZCB3aXRoCi0gKiBEaXNwYXRjaGVyVGhyZWFkIChiZWNhdXNlIHRoYXQgd291bGQgcmVxdWlyZSBsb2NraW5nKS4gIFRoaXMgd29ya3Mgb3V0IGZpbmUgYmVjYXVzZQotICogRGlzcGF0Y2hlclRocmVhZCBpcyBvbmx5IGludGVyZXN0ZWQgaW4gY29va2VkIGV2ZW50IGRhdGEgYW55d2F5cyBhbmQgZG9lcyBub3QgbmVlZAotICogYW55IG9mIHRoZSBsb3ctbGV2ZWwgZGF0YSBmcm9tIElucHV0RGV2aWNlLgotICovCi1zdHJ1Y3QgSW5wdXREZXZpY2UgewotICAgIHN0cnVjdCBBYnNvbHV0ZUF4aXNJbmZvIHsKLSAgICAgICAgYm9vbCB2YWxpZDsgICAgICAgIC8vIHNldCB0byB0cnVlIGlmIGF4aXMgcGFyYW1ldGVycyBhcmUga25vd24sIGZhbHNlIG90aGVyd2lzZQotCi0gICAgICAgIGludDMyX3QgbWluVmFsdWU7ICAvLyBtaW5pbXVtIHZhbHVlCi0gICAgICAgIGludDMyX3QgbWF4VmFsdWU7ICAvLyBtYXhpbXVtIHZhbHVlCi0gICAgICAgIGludDMyX3QgcmFuZ2U7ICAgICAvLyByYW5nZSBvZiB2YWx1ZXMsIGVxdWFsIHRvIG1heFZhbHVlIC0gbWluVmFsdWUKLSAgICAgICAgaW50MzJfdCBmbGF0OyAgICAgIC8vIGNlbnRlciBmbGF0IHBvc2l0aW9uLCBlZy4gZmxhdCA9PSA4IG1lYW5zIGNlbnRlciBpcyBiZXR3ZWVuIC04IGFuZCA4Ci0gICAgICAgIGludDMyX3QgZnV6ejsgICAgICAvLyBlcnJvciB0b2xlcmFuY2UsIGVnLiBmdXp6ID09IDQgbWVhbnMgdmFsdWUgaXMgKy8tIDQgZHVlIHRvIG5vaXNlCi0gICAgfTsKLQotICAgIHN0cnVjdCBWaXJ0dWFsS2V5IHsKLSAgICAgICAgaW50MzJfdCBrZXlDb2RlOwotICAgICAgICBpbnQzMl90IHNjYW5Db2RlOwotICAgICAgICB1aW50MzJfdCBmbGFnczsKLQotICAgICAgICAvLyBjb21wdXRlZCBoaXQgYm94LCBzcGVjaWZpZWQgaW4gdG91Y2ggc2NyZWVuIGNvb3JkcyBiYXNlZCBvbiBrbm93biBkaXNwbGF5IHNpemUKLSAgICAgICAgaW50MzJfdCBoaXRMZWZ0OwotICAgICAgICBpbnQzMl90IGhpdFRvcDsKLSAgICAgICAgaW50MzJfdCBoaXRSaWdodDsKLSAgICAgICAgaW50MzJfdCBoaXRCb3R0b207Ci0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNIaXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiB4ID49IGhpdExlZnQgJiYgeCA8PSBoaXRSaWdodCAmJiB5ID49IGhpdFRvcCAmJiB5IDw9IGhpdEJvdHRvbTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBzdHJ1Y3QgS2V5Ym9hcmRTdGF0ZSB7Ci0gICAgICAgIHN0cnVjdCBDdXJyZW50IHsKLSAgICAgICAgICAgIGludDMyX3QgbWV0YVN0YXRlOwotICAgICAgICAgICAgbnNlY3NfdCBkb3duVGltZTsgLy8gdGltZSBvZiBtb3N0IHJlY2VudCBrZXkgZG93bgotICAgICAgICB9IGN1cnJlbnQ7Ci0KLSAgICAgICAgdm9pZCByZXNldCgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tiYWxsU3RhdGUgewotICAgICAgICBzdHJ1Y3QgQWNjdW11bGF0b3IgewotICAgICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAgICAgRklFTERfQlROX01PVVNFID0gMSwKLSAgICAgICAgICAgICAgICBGSUVMRF9SRUxfWCA9IDIsCi0gICAgICAgICAgICAgICAgRklFTERfUkVMX1kgPSA0Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB1aW50MzJfdCBmaWVsZHM7Ci0KLSAgICAgICAgICAgIGJvb2wgYnRuTW91c2U7Ci0gICAgICAgICAgICBpbnQzMl90IHJlbFg7Ci0gICAgICAgICAgICBpbnQzMl90IHJlbFk7Ci0KLSAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgIGZpZWxkcyA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlubGluZSBib29sIGlzRGlydHkoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcyAhPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGFjY3VtdWxhdG9yOwotCi0gICAgICAgIHN0cnVjdCBDdXJyZW50IHsKLSAgICAgICAgICAgIGJvb2wgZG93bjsKLSAgICAgICAgICAgIG5zZWNzX3QgZG93blRpbWU7Ci0gICAgICAgIH0gY3VycmVudDsKLQotICAgICAgICBzdHJ1Y3QgUHJlY2FsY3VsYXRlZCB7Ci0gICAgICAgICAgICBmbG9hdCB4U2NhbGU7Ci0gICAgICAgICAgICBmbG9hdCB5U2NhbGU7Ci0gICAgICAgICAgICBmbG9hdCB4UHJlY2lzaW9uOwotICAgICAgICAgICAgZmxvYXQgeVByZWNpc2lvbjsKLSAgICAgICAgfSBwcmVjYWxjdWxhdGVkOwotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLSAgICB9OwotCi0gICAgc3RydWN0IFNpbmdsZVRvdWNoU2NyZWVuU3RhdGUgewotICAgICAgICBzdHJ1Y3QgQWNjdW11bGF0b3IgewotICAgICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAgICAgRklFTERfQlROX1RPVUNIID0gMSwKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfWCA9IDIsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX1kgPSA0LAotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19QUkVTU1VSRSA9IDgsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX1RPT0xfV0lEVEggPSAxNgotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOwotCi0gICAgICAgICAgICBib29sIGJ0blRvdWNoOwotICAgICAgICAgICAgaW50MzJfdCBhYnNYOwotICAgICAgICAgICAgaW50MzJfdCBhYnNZOwotICAgICAgICAgICAgaW50MzJfdCBhYnNQcmVzc3VyZTsKLSAgICAgICAgICAgIGludDMyX3QgYWJzVG9vbFdpZHRoOwotCi0gICAgICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgICAgICBmaWVsZHMgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbmxpbmUgYm9vbCBpc0RpcnR5KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMgIT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBhY2N1bXVsYXRvcjsKLQotICAgICAgICBzdHJ1Y3QgQ3VycmVudCB7Ci0gICAgICAgICAgICBib29sIGRvd247Ci0gICAgICAgICAgICBpbnQzMl90IHg7Ci0gICAgICAgICAgICBpbnQzMl90IHk7Ci0gICAgICAgICAgICBpbnQzMl90IHByZXNzdXJlOwotICAgICAgICAgICAgaW50MzJfdCBzaXplOwotICAgICAgICB9IGN1cnJlbnQ7Ci0KLSAgICAgICAgdm9pZCByZXNldCgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgTXVsdGlUb3VjaFNjcmVlblN0YXRlIHsKLSAgICAgICAgc3RydWN0IEFjY3VtdWxhdG9yIHsKLSAgICAgICAgICAgIGVudW0gewotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9QT1NJVElPTl9YID0gMSwKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfUE9TSVRJT05fWSA9IDIsCi0gICAgICAgICAgICAgICAgRklFTERfQUJTX01UX1RPVUNIX01BSk9SID0gNCwKLSAgICAgICAgICAgICAgICBGSUVMRF9BQlNfTVRfV0lEVEhfTUFKT1IgPSA4LAotICAgICAgICAgICAgICAgIEZJRUxEX0FCU19NVF9UUkFDS0lOR19JRCA9IDE2Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB1aW50MzJfdCBwb2ludGVyQ291bnQ7Ci0gICAgICAgICAgICBzdHJ1Y3QgUG9pbnRlciB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGRzOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCBhYnNNVFBvc2l0aW9uWDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGFic01UUG9zaXRpb25ZOwotICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRUb3VjaE1ham9yOwotICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRXaWR0aE1ham9yOwotICAgICAgICAgICAgICAgIGludDMyX3QgYWJzTVRUcmFja2luZ0lkOwotCi0gICAgICAgICAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBwb2ludGVyc1tNQVhfUE9JTlRFUlMgKyAxXTsgLy8gKyAxIHRvIHJlbW92ZSB0aGUgbmVlZCBmb3IgZXh0cmEgcmFuZ2UgY2hlY2tzCi0KLSAgICAgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgICAgIHBvaW50ZXJDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgcG9pbnRlcnNbMF0uY2xlYXIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW5saW5lIGJvb2wgaXNEaXJ0eSgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRlckNvdW50ICE9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gYWNjdW11bGF0b3I7Ci0KLSAgICAgICAgdm9pZCByZXNldCgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgUG9pbnRlckRhdGEgewotICAgICAgICB1aW50MzJfdCBpZDsKLSAgICAgICAgaW50MzJfdCB4OwotICAgICAgICBpbnQzMl90IHk7Ci0gICAgICAgIGludDMyX3QgcHJlc3N1cmU7Ci0gICAgICAgIGludDMyX3Qgc2l6ZTsKLSAgICB9OwotCi0gICAgc3RydWN0IFRvdWNoRGF0YSB7Ci0gICAgICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudDsKLSAgICAgICAgUG9pbnRlckRhdGEgcG9pbnRlcnNbTUFYX1BPSU5URVJTXTsKLSAgICAgICAgQml0U2V0MzIgaWRCaXRzOwotICAgICAgICB1aW50MzJfdCBpZFRvSW5kZXhbTUFYX1BPSU5URVJfSURdOwotCi0gICAgICAgIHZvaWQgY29weUZyb20oY29uc3QgVG91Y2hEYXRhJiBvdGhlcik7Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBwb2ludGVyQ291bnQgPSAwOwotICAgICAgICAgICAgaWRCaXRzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gY29tbW9uIHN0YXRlIHVzZWQgZm9yIGJvdGggc2luZ2xlLXRvdWNoIGFuZCBtdWx0aS10b3VjaCBzY3JlZW5zIGFmdGVyIHRoZSBpbml0aWFsCi0gICAgLy8gdG91Y2ggZGVjb2RpbmcgaGFzIGJlZW4gcGVyZm9ybWVkCi0gICAgc3RydWN0IFRvdWNoU2NyZWVuU3RhdGUgewotICAgICAgICBWZWN0b3I8VmlydHVhbEtleT4gdmlydHVhbEtleXM7Ci0KLSAgICAgICAgc3RydWN0IFBhcmFtZXRlcnMgewotICAgICAgICAgICAgYm9vbCB1c2VCYWRUb3VjaEZpbHRlcjsKLSAgICAgICAgICAgIGJvb2wgdXNlSnVtcHlUb3VjaEZpbHRlcjsKLSAgICAgICAgICAgIGJvb2wgdXNlQXZlcmFnaW5nVG91Y2hGaWx0ZXI7Ci0KLSAgICAgICAgICAgIEFic29sdXRlQXhpc0luZm8geEF4aXM7Ci0gICAgICAgICAgICBBYnNvbHV0ZUF4aXNJbmZvIHlBeGlzOwotICAgICAgICAgICAgQWJzb2x1dGVBeGlzSW5mbyBwcmVzc3VyZUF4aXM7Ci0gICAgICAgICAgICBBYnNvbHV0ZUF4aXNJbmZvIHNpemVBeGlzOwotICAgICAgICB9IHBhcmFtZXRlcnM7Ci0KLSAgICAgICAgLy8gVGhlIHRvdWNoIGRhdGEgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGJlaW5nIHByb2Nlc3NlZC4KLSAgICAgICAgVG91Y2hEYXRhIGN1cnJlbnRUb3VjaDsKLQotICAgICAgICAvLyBUaGUgdG91Y2ggZGF0YSBvZiB0aGUgcHJldmlvdXMgc2FtcGxlIHRoYXQgd2FzIHByb2Nlc3NlZC4gIFRoaXMgaXMgdXBkYXRlZAotICAgICAgICAvLyBpbmNyZW1lbnRhbGx5IHdoaWxlIHRoZSBjdXJyZW50IHNhbXBsZSBpcyBiZWluZyBwcm9jZXNzZWQuCi0gICAgICAgIFRvdWNoRGF0YSBsYXN0VG91Y2g7Ci0KLSAgICAgICAgLy8gVGhlIHRpbWUgdGhlIHByaW1hcnkgcG9pbnRlciBsYXN0IHdlbnQgZG93bi4KLSAgICAgICAgbnNlY3NfdCBkb3duVGltZTsKLQotICAgICAgICBzdHJ1Y3QgQ3VycmVudFZpcnR1YWxLZXlTdGF0ZSB7Ci0gICAgICAgICAgICBlbnVtIFN0YXR1cyB7Ci0gICAgICAgICAgICAgICAgU1RBVFVTX1VQLAotICAgICAgICAgICAgICAgIFNUQVRVU19ET1dOLAotICAgICAgICAgICAgICAgIFNUQVRVU19DQU5DRUxFRAotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgU3RhdHVzIHN0YXR1czsKLSAgICAgICAgICAgIG5zZWNzX3QgZG93blRpbWU7Ci0gICAgICAgICAgICBpbnQzMl90IGtleUNvZGU7Ci0gICAgICAgICAgICBpbnQzMl90IHNjYW5Db2RlOwotICAgICAgICB9IGN1cnJlbnRWaXJ0dWFsS2V5OwotCi0gICAgICAgIHN0cnVjdCBBdmVyYWdpbmdUb3VjaEZpbHRlclN0YXRlIHsKLSAgICAgICAgICAgIC8vIEluZGl2aWR1YWwgaGlzdG9yeSB0cmFja3MgYXJlIHN0b3JlZCBieSBwb2ludGVyIGlkCi0gICAgICAgICAgICB1aW50MzJfdCBoaXN0b3J5U3RhcnRbTUFYX1BPSU5URVJTXTsKLSAgICAgICAgICAgIHVpbnQzMl90IGhpc3RvcnlFbmRbTUFYX1BPSU5URVJTXTsKLSAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4OwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHk7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlc3N1cmU7Ci0gICAgICAgICAgICAgICAgfSBwb2ludGVyc1tNQVhfUE9JTlRFUlNdOwotICAgICAgICAgICAgfSBoaXN0b3J5RGF0YVtBVkVSQUdJTkdfSElTVE9SWV9TSVpFXTsKLSAgICAgICAgfSBhdmVyYWdpbmdUb3VjaEZpbHRlcjsKLQotICAgICAgICBzdHJ1Y3QgSnVtcFRvdWNoRmlsdGVyU3RhdGUgewotICAgICAgICAgICAgaW50MzJfdCBqdW1weVBvaW50c0Ryb3BwZWQ7Ci0gICAgICAgIH0ganVtcHlUb3VjaEZpbHRlcjsKLQotICAgICAgICBzdHJ1Y3QgUHJlY2FsY3VsYXRlZCB7Ci0gICAgICAgICAgICBpbnQzMl90IHhPcmlnaW47Ci0gICAgICAgICAgICBmbG9hdCB4U2NhbGU7Ci0KLSAgICAgICAgICAgIGludDMyX3QgeU9yaWdpbjsKLSAgICAgICAgICAgIGZsb2F0IHlTY2FsZTsKLQotICAgICAgICAgICAgaW50MzJfdCBwcmVzc3VyZU9yaWdpbjsKLSAgICAgICAgICAgIGZsb2F0IHByZXNzdXJlU2NhbGU7Ci0KLSAgICAgICAgICAgIGludDMyX3Qgc2l6ZU9yaWdpbjsKLSAgICAgICAgICAgIGZsb2F0IHNpemVTY2FsZTsKLSAgICAgICAgfSBwcmVjYWxjdWxhdGVkOwotCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICBib29sIGFwcGx5QmFkVG91Y2hGaWx0ZXIoKTsKLSAgICAgICAgYm9vbCBhcHBseUp1bXB5VG91Y2hGaWx0ZXIoKTsKLSAgICAgICAgdm9pZCBhcHBseUF2ZXJhZ2luZ1RvdWNoRmlsdGVyKCk7Ci0gICAgICAgIHZvaWQgY2FsY3VsYXRlUG9pbnRlcklkcygpOwotCi0gICAgICAgIGJvb2wgaXNQb2ludEluc2lkZURpc3BsYXkoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OwotICAgICAgICBjb25zdCBJbnB1dERldmljZTo6VmlydHVhbEtleSogZmluZFZpcnR1YWxLZXlIaXQoKSBjb25zdDsKLSAgICB9OwotCi0gICAgSW5wdXREZXZpY2UoaW50MzJfdCBpZCwgdWludDMyX3QgY2xhc3NlcywgU3RyaW5nOCBuYW1lKTsKLQotICAgIGludDMyX3QgaWQ7Ci0gICAgdWludDMyX3QgY2xhc3NlczsKLSAgICBTdHJpbmc4IG5hbWU7Ci0gICAgYm9vbCBpZ25vcmVkOwotCi0gICAgS2V5Ym9hcmRTdGF0ZSBrZXlib2FyZDsKLSAgICBUcmFja2JhbGxTdGF0ZSB0cmFja2JhbGw7Ci0gICAgVG91Y2hTY3JlZW5TdGF0ZSB0b3VjaFNjcmVlbjsKLSAgICB1bmlvbiB7Ci0gICAgICAgIFNpbmdsZVRvdWNoU2NyZWVuU3RhdGUgc2luZ2xlVG91Y2hTY3JlZW47Ci0gICAgICAgIE11bHRpVG91Y2hTY3JlZW5TdGF0ZSBtdWx0aVRvdWNoU2NyZWVuOwotICAgIH07Ci0KLSAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICBpbmxpbmUgYm9vbCBpc0tleWJvYXJkKCkgY29uc3QgeyByZXR1cm4gY2xhc3NlcyAmIElOUFVUX0RFVklDRV9DTEFTU19LRVlCT0FSRDsgfQotICAgIGlubGluZSBib29sIGlzQWxwaGFLZXkoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX0FMUEhBS0VZOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNUcmFja2JhbGwoKSBjb25zdCB7IHJldHVybiBjbGFzc2VzICYgSU5QVVRfREVWSUNFX0NMQVNTX1RSQUNLQkFMTDsgfQotICAgIGlubGluZSBib29sIGlzRFBhZCgpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfRFBBRDsgfQotICAgIGlubGluZSBib29sIGlzU2luZ2xlVG91Y2hTY3JlZW4oKSBjb25zdCB7IHJldHVybiAoY2xhc3NlcwotICAgICAgICAgICAgJiAoSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOIHwgSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOX01UKSkKLSAgICAgICAgICAgID09IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTjsgfQotICAgIGlubGluZSBib29sIGlzTXVsdGlUb3VjaFNjcmVlbigpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMKLSAgICAgICAgICAgICYgSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOX01UOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNUb3VjaFNjcmVlbigpIGNvbnN0IHsgcmV0dXJuIGNsYXNzZXMKLSAgICAgICAgICAgICYgKElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTiB8IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVCk7IH0KLX07Ci0KLQogLyoKICAqIElucHV0IHJlYWRlciBwb2xpY3kgaW50ZXJmYWNlLgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWkvSW5wdXRUcmFuc3BvcnQuaCBiL2luY2x1ZGUvdWkvSW5wdXRUcmFuc3BvcnQuaAppbmRleCAxMTcxNGQ1Li4yMjZkMWQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VpL0lucHV0VHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS91aS9JbnB1dFRyYW5zcG9ydC5oCkBAIC0zMzEsMzAgKzMzMSw0IEBACiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAotLyoKLSAqIE5ESyBpbnB1dCBxdWV1ZSBBUEkuCi0gKi8KLXN0cnVjdCBBSW5wdXRRdWV1ZSB7Ci1wdWJsaWM6Ci0gICAgLyogQ3JlYXRlcyBhIGNvbnN1bWVyIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnB1dCBjaGFubmVsLiAqLwotICAgIGV4cGxpY2l0IEFJbnB1dFF1ZXVlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklucHV0Q2hhbm5lbD4mIGNoYW5uZWwpOwotCi0gICAgLyogRGVzdHJveXMgdGhlIGNvbnN1bWVyIGFuZCByZWxlYXNlcyBpdHMgaW5wdXQgY2hhbm5lbC4gKi8KLSAgICB2aXJ0dWFsIH5BSW5wdXRRdWV1ZSgpOwotCi0gICAgaW5saW5lIGFuZHJvaWQ6OklucHV0Q29uc3VtZXImIGdldENvbnN1bWVyKCkgeyByZXR1cm4gbUNvbnN1bWVyOyB9Ci0gICAgCi0gICAgYW5kcm9pZDo6c3RhdHVzX3QgY29uc3VtZShhbmRyb2lkOjpJbnB1dEV2ZW50KiogZXZlbnQpOwotICAgIAotICAgIHZvaWQgc2V0UG9sbExvb3AoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6UG9sbExvb3A+JiBwb2xsTG9vcCkgeyBtUG9sbExvb3AgPSBwb2xsTG9vcDsgfQotICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OlBvbGxMb29wPiBnZXRQb2xsTG9vcCgpIGNvbnN0IHsgcmV0dXJuIG1Qb2xsTG9vcDsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBkb0RlZmF1bHRLZXkoYW5kcm9pZDo6S2V5RXZlbnQqIGtleUV2ZW50KSA9IDA7Ci0gICAgCi1wcml2YXRlOgotICAgIGFuZHJvaWQ6OklucHV0Q29uc3VtZXIgbUNvbnN1bWVyOwotICAgIGFuZHJvaWQ6OlByZWFsbG9jYXRlZElucHV0RXZlbnRGYWN0b3J5IG1JbnB1dEV2ZW50RmFjdG9yeTsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpQb2xsTG9vcD4gbVBvbGxMb29wOwotfTsKLQogI2VuZGlmIC8vIF9VSV9JTlBVVF9UUkFOU1BPUlRfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91aS9LZXljb2RlTGFiZWxzLmggYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAppbmRleCBlODFkMGY5Li5jOGQ2ZmZjIDEwMDc1NQotLS0gYS9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaAorKysgYi9pbmNsdWRlL3VpL0tleWNvZGVMYWJlbHMuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBfVUlfS0VZQ09ERV9MQUJFTFNfSAogI2RlZmluZSBfVUlfS0VZQ09ERV9MQUJFTFNfSAogCisjaW5jbHVkZSA8YW5kcm9pZC9rZXljb2Rlcy5oPgorCiBzdHJ1Y3QgS2V5Y29kZUxhYmVsIHsKICAgICBjb25zdCBjaGFyICpsaXRlcmFsOwogICAgIGludCB2YWx1ZTsKQEAgLTExOCwxMTcgKzEyMCwyOCBAQAogICAgIHsgIlBBR0VfRE9XTiIsIDkzIH0sCiAgICAgeyAiUElDVFNZTUJPTFMiLCA5NCB9LAogICAgIHsgIlNXSVRDSF9DSEFSU0VUIiwgOTUgfSwKKyAgICB7ICJCVVRUT05fQSIsIDk2IH0sCisgICAgeyAiQlVUVE9OX0IiLCA5NyB9LAorICAgIHsgIkJVVFRPTl9DIiwgOTggfSwKKyAgICB7ICJCVVRUT05fWCIsIDk5IH0sCisgICAgeyAiQlVUVE9OX1kiLCAxMDAgfSwKKyAgICB7ICJCVVRUT05fWiIsIDEwMSB9LAorICAgIHsgIkJVVFRPTl9MMSIsIDEwMiB9LAorICAgIHsgIkJVVFRPTl9SMSIsIDEwMyB9LAorICAgIHsgIkJVVFRPTl9MMiIsIDEwNCB9LAorICAgIHsgIkJVVFRPTl9SMiIsIDEwNSB9LAorICAgIHsgIkJVVFRPTl9USFVNQkwiLCAxMDYgfSwKKyAgICB7ICJCVVRUT05fVEhVTUJSIiwgMTA3IH0sCisgICAgeyAiQlVUVE9OX1NUQVJUIiwgMTA4IH0sCisgICAgeyAiQlVUVE9OX1NFTEVDVCIsIDEwOSB9LAorICAgIHsgIkJVVFRPTl9NT0RFIiwgMTEwIH0sCiAKLSAgICAvLyBOT1RFOiBJZiB5b3UgYWRkIGEgbmV3IGtleWNvZGUgaGVyZSB5b3UgbXVzdCBhbHNvIGFkZCBpdCB0bzoKLSAgICAvLyAgIChlbnVtIEtleUNvZGUsIGluIHRoaXMgZmlsZSkKLSAgICAvLyAgIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEKLSAgICAvLyAgIHRvb2xzL3B1cHBldF9tYXN0ZXIvUHVwcGV0TWFzdGVyLm5hdl9rZXlzLnB5Ci0gICAgLy8gICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9yZXMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKyAgICAvLyBOT1RFOiBJZiB5b3UgYWRkIGEgbmV3IGtleWNvZGUgaGVyZSB5b3UgbXVzdCBhbHNvIGFkZCBpdCB0byBzZXZlcmFsIG90aGVyIGZpbGVzLgorICAgIC8vICAgICAgIFJlZmVyIHRvIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEvYW5kcm9pZC92aWV3L0tleUV2ZW50LmphdmEgZm9yIHRoZSBmdWxsIGxpc3QuCiAKICAgICB7IE5VTEwsIDAgfQogfTsKIAotLy8gVGhlc2UgY29uc3RhbnRzIG5lZWQgdG8gbWF0Y2ggdGhlIGFib3ZlIG1hcHBpbmdzLgotdHlwZWRlZiBlbnVtIEtleUNvZGUgewotICAgIGtLZXlDb2RlVW5rbm93biA9IDAsCi0KLSAgICBrS2V5Q29kZVNvZnRMZWZ0ID0gMSwKLSAgICBrS2V5Q29kZVNvZnRSaWdodCA9IDIsCi0gICAga0tleUNvZGVIb21lID0gMywKLSAgICBrS2V5Q29kZUJhY2sgPSA0LAotICAgIGtLZXlDb2RlQ2FsbCA9IDUsCi0gICAga0tleUNvZGVFbmRDYWxsID0gNiwKLSAgICBrS2V5Q29kZTAgPSA3LAotICAgIGtLZXlDb2RlMSA9IDgsCi0gICAga0tleUNvZGUyID0gOSwKLSAgICBrS2V5Q29kZTMgPSAxMCwKLSAgICBrS2V5Q29kZTQgPSAxMSwKLSAgICBrS2V5Q29kZTUgPSAxMiwKLSAgICBrS2V5Q29kZTYgPSAxMywKLSAgICBrS2V5Q29kZTcgPSAxNCwKLSAgICBrS2V5Q29kZTggPSAxNSwKLSAgICBrS2V5Q29kZTkgPSAxNiwKLSAgICBrS2V5Q29kZVN0YXIgPSAxNywKLSAgICBrS2V5Q29kZVBvdW5kID0gMTgsCi0gICAga0tleUNvZGVEcGFkVXAgPSAxOSwKLSAgICBrS2V5Q29kZURwYWREb3duID0gMjAsCi0gICAga0tleUNvZGVEcGFkTGVmdCA9IDIxLAotICAgIGtLZXlDb2RlRHBhZFJpZ2h0ID0gMjIsCi0gICAga0tleUNvZGVEcGFkQ2VudGVyID0gMjMsCi0gICAga0tleUNvZGVWb2x1bWVVcCA9IDI0LAotICAgIGtLZXlDb2RlVm9sdW1lRG93biA9IDI1LAotICAgIGtLZXlDb2RlUG93ZXIgPSAyNiwKLSAgICBrS2V5Q29kZUNhbWVyYSA9IDI3LAotICAgIGtLZXlDb2RlQ2xlYXIgPSAyOCwKLSAgICBrS2V5Q29kZUEgPSAyOSwKLSAgICBrS2V5Q29kZUIgPSAzMCwKLSAgICBrS2V5Q29kZUMgPSAzMSwKLSAgICBrS2V5Q29kZUQgPSAzMiwKLSAgICBrS2V5Q29kZUUgPSAzMywKLSAgICBrS2V5Q29kZUYgPSAzNCwKLSAgICBrS2V5Q29kZUcgPSAzNSwKLSAgICBrS2V5Q29kZUggPSAzNiwKLSAgICBrS2V5Q29kZUkgPSAzNywKLSAgICBrS2V5Q29kZUogPSAzOCwKLSAgICBrS2V5Q29kZUsgPSAzOSwKLSAgICBrS2V5Q29kZUwgPSA0MCwKLSAgICBrS2V5Q29kZU0gPSA0MSwKLSAgICBrS2V5Q29kZU4gPSA0MiwKLSAgICBrS2V5Q29kZU8gPSA0MywKLSAgICBrS2V5Q29kZVAgPSA0NCwKLSAgICBrS2V5Q29kZVEgPSA0NSwKLSAgICBrS2V5Q29kZVIgPSA0NiwKLSAgICBrS2V5Q29kZVMgPSA0NywKLSAgICBrS2V5Q29kZVQgPSA0OCwKLSAgICBrS2V5Q29kZVUgPSA0OSwKLSAgICBrS2V5Q29kZVYgPSA1MCwKLSAgICBrS2V5Q29kZVcgPSA1MSwKLSAgICBrS2V5Q29kZVggPSA1MiwKLSAgICBrS2V5Q29kZVkgPSA1MywKLSAgICBrS2V5Q29kZVogPSA1NCwKLSAgICBrS2V5Q29kZUNvbW1hID0gNTUsCi0gICAga0tleUNvZGVQZXJpb2QgPSA1NiwKLSAgICBrS2V5Q29kZUFsdExlZnQgPSA1NywKLSAgICBrS2V5Q29kZUFsdFJpZ2h0ID0gNTgsCi0gICAga0tleUNvZGVTaGlmdExlZnQgPSA1OSwKLSAgICBrS2V5Q29kZVNoaWZ0UmlnaHQgPSA2MCwKLSAgICBrS2V5Q29kZVRhYiA9IDYxLAotICAgIGtLZXlDb2RlU3BhY2UgPSA2MiwKLSAgICBrS2V5Q29kZVN5bSA9IDYzLAotICAgIGtLZXlDb2RlRXhwbG9yZXIgPSA2NCwKLSAgICBrS2V5Q29kZUVudmVsb3BlID0gNjUsCi0gICAga0tleUNvZGVOZXdsaW5lID0gNjYsCi0gICAga0tleUNvZGVEZWwgPSA2NywKLSAgICBrS2V5Q29kZUdyYXZlID0gNjgsCi0gICAga0tleUNvZGVNaW51cyA9IDY5LAotICAgIGtLZXlDb2RlRXF1YWxzID0gNzAsCi0gICAga0tleUNvZGVMZWZ0QnJhY2tldCA9IDcxLAotICAgIGtLZXlDb2RlUmlnaHRCcmFja2V0ID0gNzIsCi0gICAga0tleUNvZGVCYWNrc2xhc2ggPSA3MywKLSAgICBrS2V5Q29kZVNlbWljb2xvbiA9IDc0LAotICAgIGtLZXlDb2RlQXBvc3Ryb3BoZSA9IDc1LAotICAgIGtLZXlDb2RlU2xhc2ggPSA3NiwKLSAgICBrS2V5Q29kZUF0ID0gNzcsCi0gICAga0tleUNvZGVOdW0gPSA3OCwKLSAgICBrS2V5Q29kZUhlYWRTZXRIb29rID0gNzksCi0gICAga0tleUNvZGVGb2N1cyA9IDgwLAotICAgIGtLZXlDb2RlUGx1cyA9IDgxLAotICAgIGtLZXlDb2RlTWVudSA9IDgyLAotICAgIGtLZXlDb2RlTm90aWZpY2F0aW9uID0gODMsCi0gICAga0tleUNvZGVTZWFyY2ggPSA4NCwKLSAgICBrS2V5Q29kZVBsYXlQYXVzZSA9IDg1LAotICAgIGtLZXlDb2RlU3RvcCA9IDg2LAotICAgIGtLZXlDb2RlTmV4dFNvbmcgPSA4NywKLSAgICBrS2V5Q29kZVByZXZpb3VzU29uZyA9IDg4LAotICAgIGtLZXlDb2RlUmV3aW5kID0gODksCi0gICAga0tleUNvZGVGb3J3YXJkID0gOTAsCi0gICAga0tleUNvZGVNdXRlID0gOTEsCi0gICAga0tleUNvZGVQYWdlVXAgPSA5MiwKLSAgICBrS2V5Q29kZVBhZ2VEb3duID0gOTMsCi0gICAga0tleUNvZGVQaWN0U3ltYm9scyA9IDk0LAotICAgIGtLZXlDb2RlU3dpdGNoQ2hhcnNldCA9IDk1Ci19IEtleUNvZGU7Ci0KIHN0YXRpYyBjb25zdCBLZXljb2RlTGFiZWwgRkxBR1NbXSA9IHsKICAgICB7ICJXQUtFIiwgMHgwMDAwMDAwMSB9LAogICAgIHsgIldBS0VfRFJPUFBFRCIsIDB4MDAwMDAwMDIgfSwKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9saWJzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGU2ZjQ2Y2UuLjk3ZWI2YzAgMTAwNjQ0Ci0tLSBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMTcsOCArMTcsNyBAQAogCiAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgotLy8KLSNkZWZpbmUgTE9HX05ERUJVRyAwCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c2lnbmFsLmg+CkBAIC01MDg1LDE1ICs1MDg0LDUzIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjp1cGRhdGVTdGF0ZSgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3dpdGNoIChtU3RhdGUpIHsKKyAgICBjYXNlIFJFU1RBUlQ6CisgICAgICAgIHJlc2V0X2woKTsKKyAgICAgICAgLy8gRkFMTCBUSFJPVUdICisKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgICAgICAvLyBjbGVhciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlciBmb3IgbmV4dCBhY2N1bXVsYXRpb24KKyAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKKyAgICAgICAgICAgIG1lbXNldChtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsCisgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KnNpemVvZihpbnQzMl90KSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnRfbCgpOworICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBJTkc6CisgICAgICAgIHN0b3BfbCgpOworICAgICAgICBtRGlzYWJsZVdhaXRDbnQgPSBtTWF4RGlzYWJsZVdhaXRDbnQ7CisgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RPUFBFRDoKKyAgICAgICAgLy8gbURpc2FibGVXYWl0Q250IGlzIGZvcmNlZCB0byAxIGJ5IHByb2Nlc3MoKSB3aGVuIHRoZSBlbmdpbmUgaW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlCisgICAgICAgIC8vIHR1cm4gb2ZmIHNlcXVlbmNlLgorICAgICAgICBpZiAoLS1tRGlzYWJsZVdhaXRDbnQgPT0gMCkgeworICAgICAgICAgICAgcmVzZXRfbCgpOworICAgICAgICAgICAgbVN0YXRlID0gSURMRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAvL0lETEUgLCBBQ1RJVkUKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpwcm9jZXNzKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCi0gICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgPT0gTlVMTCB8fCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fCBtQ29uZmlnLm91dHB1dENmZy5idWZmZXIucmF3ID09IE5VTEwpIHsKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSA9PSBOVUxMIHx8CisgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgPT0gTlVMTCB8fAorICAgICAgICAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpZiAobVN0YXRlICE9IElETEUpIHsKKyAgICBpZiAobVN0YXRlID09IEFDVElWRSB8fCBtU3RhdGUgPT0gU1RPUFBJTkcgfHwgbVN0YXRlID09IFNUT1BQRUQpIHsKICAgICAgICAgLy8gZG8gMzIgYml0IHRvIDE2IGJpdCBjb252ZXJzaW9uIGZvciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlcgogICAgICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewogICAgICAgICAgICAgQXVkaW9NaXhlcjo6ZGl0aGVyQW5kQ2xhbXAobUNvbmZpZy5pbnB1dENmZy5idWZmZXIuczMyLApAQCAtNTEwMSwzMyArNTEzOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gVE9ETzogaGFuZGxlIGVmZmVjdHMgd2l0aCBidWZmZXIgcHJvdmlkZXIKLSAgICAgICAgaWYgKG1TdGF0ZSAhPSBBQ1RJVkUpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgICAgIHJlc2V0X2woKTsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVElORzsKLSAgICAgICAgICAgICAgICAvLyBjbGVhciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlciBmb3IgbmV4dCBhY2N1bXVsYXRpb24KLSAgICAgICAgICAgICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy5pbnB1dENmZy5idWZmZXIucmF3LCAwLCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KnNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGNhc2UgU1RBUlRJTkc6Ci0gICAgICAgICAgICAgICAgc3RhcnRfbCgpOwotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RPUFBJTkc6Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RPUFBFRDoKLSAgICAgICAgICAgICAgICBzdG9wX2woKTsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBJRExFOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIC8vIGRvIHRoZSBhY3R1YWwgcHJvY2Vzc2luZyBpbiB0aGUgZWZmZWN0IGVuZ2luZQotICAgICAgICAoKm1FZmZlY3RJbnRlcmZhY2UpLT5wcm9jZXNzKG1FZmZlY3RJbnRlcmZhY2UsICZtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwgJm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisgICAgICAgIGludCByZXQgPSAoKm1FZmZlY3RJbnRlcmZhY2UpLT5wcm9jZXNzKG1FZmZlY3RJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlcik7CisKKyAgICAgICAgLy8gZm9yY2UgdHJhbnNpdGlvbiB0byBJRExFIHN0YXRlIHdoZW4gZW5naW5lIGlzIHJlYWR5CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBFRCAmJiByZXQgPT0gLUVOT0RBVEEpIHsKKyAgICAgICAgICAgIG1EaXNhYmxlV2FpdENudCA9IDE7CisgICAgICAgIH0KIAogICAgICAgICAvLyBjbGVhciBhdXhpbGlhcnkgZWZmZWN0IGlucHV0IGJ1ZmZlciBmb3IgbmV4dCBhY2N1bXVsYXRpb24KICAgICAgICAgaWYgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKQEAgLTUyMTYsNiArNTIzNSwxMCBAQAogICAgIGlmIChzdGF0dXMgPT0gMCkgewogICAgICAgICBzdGF0dXMgPSBjbWRTdGF0dXM7CiAgICAgfQorCisgICAgbU1heERpc2FibGVXYWl0Q250ID0gKE1BWF9ESVNBQkxFX1RJTUVfTVMgKiBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUpIC8KKyAgICAgICAgICAgICgxMDAwICogbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNTI5MiwyMSArNTMxNSwxOSBAQAogICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAvLyBnb2luZyBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQKICAgICAgICAgY2FzZSBJRExFOgotICAgICAgICAgICAgbVN0YXRlID0gUkVTRVQ7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFSVElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1BQRUQ6CisgICAgICAgICAgICBtU3RhdGUgPSBSRVNUQVJUOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU1RPUFBJTkc6CiAgICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9QUEVEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7Ci0gICAgICAgICAgICBicmVhazsKIAogICAgICAgICAvLyBnb2luZyBmcm9tIGVuYWJsZWQgdG8gZGlzYWJsZWQKLSAgICAgICAgY2FzZSBSRVNFVDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRVNUQVJUOgogICAgICAgICBjYXNlIFNUQVJUSU5HOgotICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKKyAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBQ1RJVkU6CiAgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElORzsKQEAgLTUzMjUsNyArNTM0Niw3IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc0VuYWJsZWQoKQogewogICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgY2FzZSBSRVNFVDoKKyAgICBjYXNlIFJFU1RBUlQ6CiAgICAgY2FzZSBTVEFSVElORzoKICAgICBjYXNlIEFDVElWRToKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC01NzcyLDYgKzU3OTMsOSBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgIG1FZmZlY3RzW2ldLT5wcm9jZXNzKCk7CiAgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RzW2ldLT51cGRhdGVTdGF0ZSgpOworICAgIH0KICAgICAvLyBpZiBubyB0cmFjayBpcyBhY3RpdmUsIGlucHV0IGJ1ZmZlciBtdXN0IGJlIGNsZWFyZWQgaGVyZSBhcyB0aGUgbWl4ZXIgcHJvY2VzcwogICAgIC8vIHdpbGwgbm90IGRvIGl0CiAgICAgaWYgKG1TZXNzaW9uSWQgPiAwICYmIGFjdGl2ZVRyYWNrcygpID09IDApIHsKZGlmZiAtLWdpdCBhL2xpYnMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKaW5kZXggZWMzZDdmMS4uNTA3YzlhYyAxMDA2NDQKLS0tIGEvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvbGlicy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTkwNSw3ICs5MDUsNyBAQAogCiAgICAgICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKICAgICAgICAgICAgIElETEUsCi0gICAgICAgICAgICBSRVNFVCwKKyAgICAgICAgICAgIFJFU1RBUlQsCiAgICAgICAgICAgICBTVEFSVElORywKICAgICAgICAgICAgIEFDVElWRSwKICAgICAgICAgICAgIFNUT1BQSU5HLApAQCAtOTE0LDYgKzkxNCw3IEBACiAKICAgICAgICAgaW50ICAgICAgICAgaWQoKSB7IHJldHVybiBtSWQ7IH0KICAgICAgICAgdm9pZCBwcm9jZXNzKCk7CisgICAgICAgIHZvaWQgdXBkYXRlU3RhdGUoKTsKICAgICAgICAgc3RhdHVzX3QgY29tbWFuZChpbnQgY21kQ29kZSwgaW50IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLCBpbnQgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CiAKICAgICAgICAgdm9pZCByZXNldF9sKCk7CkBAIC05NDgsNiArOTQ5LDkgQEAKIAogICAgIHByb3RlY3RlZDoKIAorICAgICAgICAvLyBNYXhpbXVtIHRpbWUgYWxsb2NhdGVkIHRvIGVmZmVjdCBlbmdpbmVzIHRvIGNvbXBsZXRlIHRoZSB0dXJuIG9mZiBzZXF1ZW5jZQorICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX0RJU0FCTEVfVElNRV9NUyA9IDEwMDAwOworCiAgICAgICAgIEVmZmVjdE1vZHVsZShjb25zdCBFZmZlY3RNb2R1bGUmKTsKICAgICAgICAgRWZmZWN0TW9kdWxlJiBvcGVyYXRvciA9IChjb25zdCBFZmZlY3RNb2R1bGUmKTsKIApAQCAtOTczLDYgKzk3Nyw5IEBACiAgICAgICAgIHN0YXR1c190IG1TdGF0dXM7ICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gc3RhdHVzCiAgICAgICAgIHVpbnQzMl90IG1TdGF0ZTsgICAgICAgICAgICAgICAgLy8gY3VycmVudCBhY3RpdmF0aW9uIHN0YXRlIChlZmZlY3Rfc3RhdGUpCiAgICAgICAgIFZlY3Rvcjwgd3A8RWZmZWN0SGFuZGxlPiA+IG1IYW5kbGVzOyAgICAvLyBsaXN0IG9mIGNsaWVudCBoYW5kbGVzCisgICAgICAgIHVpbnQzMl90IG1NYXhEaXNhYmxlV2FpdENudDsgICAgLy8gbWF4aW11bSBncmFjZSBwZXJpb2QgYmVmb3JlIGZvcmNpbmcgYW4gZWZmZWN0IG9mZiBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbmRpbmcgZGlzYWJsZSBjb21tYW5kLgorICAgICAgICB1aW50MzJfdCBtRGlzYWJsZVdhaXRDbnQ7ICAgICAgIC8vIGN1cnJlbnQgcHJvY2VzcygpIGNhbGxzIGNvdW50IGR1cmluZyBkaXNhYmxlIHBlcmlvZC4KICAgICB9OwogCiAgICAgLy8gVGhlIEVmZmVjdEhhbmRsZSBjbGFzcyBpbXBsZW1lbnRzIHRoZSBJRWZmZWN0IGludGVyZmFjZS4gSXQgcHJvdmlkZXMgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuY3BwIGIvbGlicy9iaW5kZXIvSVBlcm1pc3Npb25Db250cm9sbGVyLmNwcAppbmRleCBiZmY0YzliLi5lMTMwMzZmIDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9JUGVybWlzc2lvbkNvbnRyb2xsZXIuY3BwCisrKyBiL2xpYnMvYmluZGVyL0lQZXJtaXNzaW9uQ29udHJvbGxlci5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKICAgICAgICAgOiBCcEludGVyZmFjZTxJUGVybWlzc2lvbkNvbnRyb2xsZXI+KGltcGwpCiAgICAgewogICAgIH0KLSAgICAgICAgCisKICAgICB2aXJ0dWFsIGJvb2wgY2hlY2tQZXJtaXNzaW9uKGNvbnN0IFN0cmluZzE2JiBwZXJtaXNzaW9uLCBpbnQzMl90IHBpZCwgaW50MzJfdCB1aWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoQ0hFQ0tfUEVSTUlTU0lPTl9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgLy8gZmFpbCBvbiBleGNlcHRpb24KLSAgICAgICAgaWYgKHJlcGx5LnJlYWRJbnQzMigpICE9IDApIHJldHVybiAwOworICAgICAgICBpZiAocmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSAhPSAwKSByZXR1cm4gMDsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpICE9IDA7CiAgICAgfQogfTsKQEAgLTY2LDggKzY2LDcgQEAKICAgICAgICAgICAgIGludDMyX3QgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludDMyX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGJvb2wgcmVzID0gY2hlY2tQZXJtaXNzaW9uKHBlcm1pc3Npb24sIHBpZCwgdWlkKTsKLSAgICAgICAgICAgIC8vIHdyaXRlIGV4Y2VwdGlvbgotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVOb0V4Y2VwdGlvbigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzID8gMSA6IDApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtNzcsNCArNzYsMyBAQAogfQogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwIGIvbGlicy9iaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmNwcAppbmRleCBhM2EzZjBlLi4xZmE0YzM1IDEwMDY0NAotLS0gYS9saWJzL2JpbmRlci9JU2VydmljZU1hbmFnZXIuY3BwCisrKyBiL2xpYnMvYmluZGVyL0lTZXJ2aWNlTWFuYWdlci5jcHAKQEAgLTE1OCw3ICsxNTgsNyBAQAogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYobmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoc2VydmljZSk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU0VSVklDRV9UUkFOU0FDVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIGVyciA9PSBOT19FUlJPUiA/IHJlcGx5LnJlYWRJbnQzMigpIDogZXJyOworICAgICAgICByZXR1cm4gZXJyID09IE5PX0VSUk9SID8gcmVwbHkucmVhZEV4Y2VwdGlvbkNvZGUoKSA6IGVycjsKICAgICB9CiAKICAgICB2aXJ0dWFsIFZlY3RvcjxTdHJpbmcxNj4gbGlzdFNlcnZpY2VzKCkKZGlmZiAtLWdpdCBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAgYi9saWJzL2JpbmRlci9QYXJjZWwuY3BwCmluZGV4IGMyNTc0YmQuLjQ3YmUxYmYgMTAwNjQ0Ci0tLSBhL2xpYnMvYmluZGVyL1BhcmNlbC5jcHAKKysrIGIvbGlicy9iaW5kZXIvUGFyY2VsLmNwcApAQCAtNzU0LDYgKzc1NCwxMSBAQAogICAgIGdvdG8gcmVzdGFydF93cml0ZTsKIH0KIAorc3RhdHVzX3QgUGFyY2VsOjp3cml0ZU5vRXhjZXB0aW9uKCkKK3sKKyAgICByZXR1cm4gd3JpdGVJbnQzMigwKTsKK30KKwogdm9pZCBQYXJjZWw6OnJlbW92ZShzaXplX3Qgc3RhcnQsIHNpemVfdCBhbXQpCiB7CiAgICAgTE9HX0FMV0FZU19GQVRBTCgiUGFyY2VsOjpyZW1vdmUoKSBub3QgeWV0IGltcGxlbWVudGVkISIpOwpAQCAtOTQyLDYgKzk0NywxMiBAQAogICAgIHJldHVybiB2YWw7CiB9CiAKK2ludDMyX3QgUGFyY2VsOjpyZWFkRXhjZXB0aW9uQ29kZSgpIGNvbnN0Cit7CisgIGludDMyX3QgZXhjZXB0aW9uX2NvZGUgPSByZWFkQWxpZ25lZDxpbnQzMl90PigpOworICAvLyBUT0RPOiBza2lwIG92ZXIgdGhlIHJlc3BvbnNlIGhlYWRlciBoZXJlLCBvbmNlIHRoYXQncyBpbi4KKyAgcmV0dXJuIGV4Y2VwdGlvbl9jb2RlOworfQogCiBuYXRpdmVfaGFuZGxlKiBQYXJjZWw6OnJlYWROYXRpdmVIYW5kbGUoKSBjb25zdAogewpkaWZmIC0tZ2l0IGEvbGlicy9zdXJmYWNlZmxpbmdlci9UZXh0dXJlTWFuYWdlci5jcHAgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcAppbmRleCA2NTI2MDMyLi4zYjMyNmRmIDEwMDY0NAotLS0gYS9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcAorKysgYi9saWJzL3N1cmZhY2VmbGluZ2VyL1RleHR1cmVNYW5hZ2VyLmNwcApAQCAtMTA3LDcgKzEwNyw2IEBACiB7CiAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxNjoKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTExOCw3ICsxMTcsNiBAQAogICAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgLy8gc3VwcG9ydGVkIFlVViBmb3JtYXRzCiAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6Ci0gICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTY6CiAgICAgLy8gTGVnYWN5L2RlcHJlY2F0ZWQgWVVWIGZvcm1hdHMKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgogICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjBfU1A6CmRpZmYgLS1naXQgYS9saWJzL3VpL0FuZHJvaWQubWsgYi9saWJzL3VpL0FuZHJvaWQubWsKaW5kZXggMjRjZGM3OC4uNDI0M2JiZiAxMDA2NDQKLS0tIGEvbGlicy91aS9BbmRyb2lkLm1rCisrKyBiL2xpYnMvdWkvQW5kcm9pZC5tawpAQCAtMTIsNiArMTIsNyBAQAogCUtleUxheW91dE1hcC5jcHAgXAogCUtleUNoYXJhY3Rlck1hcC5jcHAgXAogCUlucHV0LmNwcCBcCisJSW5wdXREZXZpY2UuY3BwIFwKIAlJbnB1dERpc3BhdGNoZXIuY3BwIFwKIAlJbnB1dE1hbmFnZXIuY3BwIFwKIAlJbnB1dFJlYWRlci5jcHAgXApAQCAtMzgsMyArMzksMTMgQEAKIGVuZGlmCiAKIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworCisjIEluY2x1ZGUgc3ViZGlyZWN0b3J5IG1ha2VmaWxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBJZiB3ZSdyZSBidWlsZGluZyB3aXRoIE9ORV9TSE9UX01BS0VGSUxFIChtbSwgbW1tKSwgdGhlbiB3aGF0IHRoZSBmcmFtZXdvcmsKKyMgdGVhbSByZWFsbHkgd2FudHMgaXMgdG8gYnVpbGQgdGhlIHN0dWZmIGRlZmluZWQgYnkgdGhpcyBtYWtlZmlsZS4KK2lmZXEgKCwkKE9ORV9TSE9UX01BS0VGSUxFKSkKK2luY2x1ZGUgJChjYWxsIGZpcnN0LW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnMvdWkvRXZlbnRIdWIuY3BwIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKaW5kZXggMjc4OTVmMi4uNzY4YjA0ZSAxMDA2NDQKLS0tIGEvbGlicy91aS9FdmVudEh1Yi5jcHAKKysrIGIvbGlicy91aS9FdmVudEh1Yi5jcHAKQEAgLTU0LDYgKzU0LDkgQEAKICAqLwogI2RlZmluZSB0ZXN0X2JpdChiaXQsIGFycmF5KSAgICAoYXJyYXlbYml0LzhdICYgKDE8PChiaXQlOCkpKQogCisvKiB0aGlzIG1hY3JvIGNvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIHJlcHJlc2VudCBhIGJpdCBhcnJheSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgKi8KKyNkZWZpbmUgc2l6ZW9mX2JpdF9hcnJheShiaXRzKSAgKChiaXRzICsgNykgLyA4KQorCiAjZGVmaW5lIElEX01BU0sgIDB4MDAwMGZmZmYKICNkZWZpbmUgU0VRX01BU0sgMHg3ZmZmMDAwMAogI2RlZmluZSBTRVFfU0hJRlQgMTYKQEAgLTE4Miw3ICsxODUsNyBAQAogfQogCiBpbnQzMl90IEV2ZW50SHViOjpnZXRTY2FuQ29kZVN0YXRlTG9ja2VkKGRldmljZV90KiBkZXZpY2UsIGludDMyX3Qgc2NhbkNvZGUpIGNvbnN0IHsKLSAgICB1aW50OF90IGtleV9iaXRtYXNrWyhLRVlfTUFYICsgNykgLyA4XTsKKyAgICB1aW50OF90IGtleV9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpXTsKICAgICBtZW1zZXQoa2V5X2JpdG1hc2ssIDAsIHNpemVvZihrZXlfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChtRkRzW2lkX3RvX2luZGV4KGRldmljZS0+aWQpXS5mZCwKICAgICAgICAgICAgICAgIEVWSU9DR0tFWShzaXplb2Yoa2V5X2JpdG1hc2spKSwga2V5X2JpdG1hc2spID49IDApIHsKQEAgLTIxOCw3ICsyMjEsNyBAQAogICAgIFZlY3RvcjxpbnQzMl90PiBzY2FuQ29kZXM7CiAgICAgZGV2aWNlLT5sYXlvdXRNYXAtPmZpbmRTY2FuY29kZXMoa2V5Q29kZSwgJnNjYW5Db2Rlcyk7CiAKLSAgICB1aW50OF90IGtleV9iaXRtYXNrWyhLRVlfTUFYICsgNykgLyA4XTsKKyAgICB1aW50OF90IGtleV9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoS0VZX01BWCArIDEpXTsKICAgICBtZW1zZXQoa2V5X2JpdG1hc2ssIDAsIHNpemVvZihrZXlfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChtRkRzW2lkX3RvX2luZGV4KGRldmljZS0+aWQpXS5mZCwKICAgICAgICAgICAgICAgIEVWSU9DR0tFWShzaXplb2Yoa2V5X2JpdG1hc2spKSwga2V5X2JpdG1hc2spID49IDApIHsKQEAgLTI2NCw3ICsyNjcsNyBAQAogfQogCiBpbnQzMl90IEV2ZW50SHViOjpnZXRTd2l0Y2hTdGF0ZUxvY2tlZChkZXZpY2VfdCogZGV2aWNlLCBpbnQzMl90IHN3KSBjb25zdCB7Ci0gICAgdWludDhfdCBzd19iaXRtYXNrWyhTV19NQVggKyA3KSAvIDhdOworICAgIHVpbnQ4X3Qgc3dfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KFNXX01BWCArIDEpXTsKICAgICBtZW1zZXQoc3dfYml0bWFzaywgMCwgc2l6ZW9mKHN3X2JpdG1hc2spKTsKICAgICBpZiAoaW9jdGwobUZEc1tpZF90b19pbmRleChkZXZpY2UtPmlkKV0uZmQsCiAgICAgICAgICAgICAgICBFVklPQ0dTVyhzaXplb2Yoc3dfYml0bWFzaykpLCBzd19iaXRtYXNrKSA+PSAwKSB7CkBAIC00MDksNyArNDEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dWKCJpZXYuY29kZT0lZCBvdXRLZXljb2RlPSVkIG91dEZsYWdzPTB4JTA4eCBlcnI9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlldi5jb2RlLCAqb3V0S2V5Y29kZSwgKm91dEZsYWdzLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0S2V5Y29kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXRLZXljb2RlID0gQUtFWUNPREVfVU5LTk9XTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dEZsYWdzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTA5LDYgKzUxMiwyNiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3N0YXRpYyBib29sIGNvbnRhaW5zTm9uWmVyb0J5dGUoY29uc3QgdWludDhfdCogYXJyYXksIHVpbnQzMl90IHN0YXJ0SW5kZXgsIHVpbnQzMl90IGVuZEluZGV4KSB7CisgICAgY29uc3QgdWludDhfdCogZW5kID0gYXJyYXkgKyBlbmRJbmRleDsKKyAgICBhcnJheSArPSBzdGFydEluZGV4OworICAgIHdoaWxlIChhcnJheSAhPSBlbmQpIHsKKyAgICAgICAgaWYgKCooYXJyYXkrKykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3QgaW50MzJfdCBHQU1FUEFEX0tFWUNPREVTW10gPSB7CisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9BLCBBS0VZQ09ERV9CVVRUT05fQiwgQUtFWUNPREVfQlVUVE9OX0MsCisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9YLCBBS0VZQ09ERV9CVVRUT05fWSwgQUtFWUNPREVfQlVUVE9OX1osCisgICAgICAgIEFLRVlDT0RFX0JVVFRPTl9MMSwgQUtFWUNPREVfQlVUVE9OX1IxLAorICAgICAgICBBS0VZQ09ERV9CVVRUT05fTDIsIEFLRVlDT0RFX0JVVFRPTl9SMiwKKyAgICAgICAgQUtFWUNPREVfQlVUVE9OX1RIVU1CTCwgQUtFWUNPREVfQlVUVE9OX1RIVU1CUiwKKyAgICAgICAgQUtFWUNPREVfQlVUVE9OX1NUQVJULCBBS0VZQ09ERV9CVVRUT05fU0VMRUNULCBBS0VZQ09ERV9CVVRUT05fTU9ERQorfTsKKwogaW50IEV2ZW50SHViOjpvcGVuX2RldmljZShjb25zdCBjaGFyICpkZXZpY2VOYW1lKQogewogICAgIGludCB2ZXJzaW9uOwpAQCAtNjI2LDI3ICs2NDksMjcgQEAKICAgICBtRkRzW21GRENvdW50XS5mZCA9IGZkOwogICAgIG1GRHNbbUZEQ291bnRdLmV2ZW50cyA9IFBPTExJTjsKIAotICAgIC8vIGZpZ3VyZSBvdXQgdGhlIGtpbmRzIG9mIGV2ZW50cyB0aGUgZGV2aWNlIHJlcG9ydHMKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSBraW5kcyBvZiBldmVudHMgdGhlIGRldmljZSByZXBvcnRzLgogICAgIAotICAgIC8vIFNlZSBpZiB0aGlzIGlzIGEga2V5Ym9hcmQsIGFuZCBjbGFzc2lmeSBpdC4gIE5vdGUgdGhhdCB3ZSBvbmx5Ci0gICAgLy8gY29uc2lkZXIgdXAgdGhyb3VnaCB0aGUgZnVuY3Rpb24ga2V5czsgd2UgZG9uJ3Qgd2FudCB0byBpbmNsdWRlCi0gICAgLy8gb25lcyBhZnRlciB0aGF0IChwbGF5IGNkIGV0Yykgc28gd2UgZG9uJ3QgbWlzdGFrZW5seSBjb25zaWRlciBhCi0gICAgLy8gY29udHJvbGxlciB0byBiZSBhIGtleWJvYXJkLgotICAgIHVpbnQ4X3Qga2V5X2JpdG1hc2tbKEtFWV9NQVgrNykvOF07CisgICAgdWludDhfdCBrZXlfYml0bWFza1tzaXplb2ZfYml0X2FycmF5KEtFWV9NQVggKyAxKV07CiAgICAgbWVtc2V0KGtleV9iaXRtYXNrLCAwLCBzaXplb2Yoa2V5X2JpdG1hc2spKTsKKwogICAgIExPR1YoIkdldHRpbmcga2V5cy4uLiIpOwogICAgIGlmIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX0tFWSwgc2l6ZW9mKGtleV9iaXRtYXNrKSksIGtleV9iaXRtYXNrKSA+PSAwKSB7CiAgICAgICAgIC8vTE9HSSgiTUFQXG4iKTsKLSAgICAgICAgLy9mb3IgKGludCBpPTA7IGk8KChLRVlfTUFYKzcpLzgpOyBpKyspIHsKKyAgICAgICAgLy9mb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihrZXlfYml0bWFzayk7IGkrKykgewogICAgICAgICAvLyAgICBMT0dJKCIlZDogMHglMDJ4XG4iLCBpLCBrZXlfYml0bWFza1tpXSk7CiAgICAgICAgIC8vfQotICAgICAgICBmb3IgKGludCBpPTA7IGk8KChCVE5fTUlTQys3KS84KTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoa2V5X2JpdG1hc2tbaV0gIT0gMCkgewotICAgICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UtPmNsYXNzZXMgJiBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQpICE9IDApIHsKKworICAgICAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIGtleWJvYXJkLiAgSWdub3JlIGV2ZXJ5dGhpbmcgaW4gdGhlIGJ1dHRvbiByYW5nZSBleGNlcHQgZm9yCisgICAgICAgIC8vIGdhbWVwYWRzIHdoaWNoIGFyZSBhbHNvIGNvbnNpZGVyZWQga2V5Ym9hcmRzLgorICAgICAgICBpZiAoY29udGFpbnNOb25aZXJvQnl0ZShrZXlfYml0bWFzaywgMCwgc2l6ZW9mX2JpdF9hcnJheShCVE5fTUlTQykpCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnNOb25aZXJvQnl0ZShrZXlfYml0bWFzaywgc2l6ZW9mX2JpdF9hcnJheShCVE5fR0FNRVBBRCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEJUTl9ESUdJKSkKKyAgICAgICAgICAgICAgICB8fCBjb250YWluc05vblplcm9CeXRlKGtleV9iaXRtYXNrLCBzaXplb2ZfYml0X2FycmF5KEtFWV9PSyksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfYml0X2FycmF5KEtFWV9NQVggKyAxKSkpIHsKKyAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfS0VZQk9BUkQ7CisKICAgICAgICAgICAgIGRldmljZS0+a2V5Qml0bWFzayA9IG5ldyB1aW50OF90W3NpemVvZihrZXlfYml0bWFzayldOwogICAgICAgICAgICAgaWYgKGRldmljZS0+a2V5Qml0bWFzayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KGRldmljZS0+a2V5Qml0bWFzaywga2V5X2JpdG1hc2ssIHNpemVvZihrZXlfYml0bWFzaykpOwpAQCAtNjU4LDM5ICs2ODEsMzkgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRyYWNrYmFsbC4KKyAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRyYWNrYmFsbCAob3IgbW91c2UpLgogICAgIGlmICh0ZXN0X2JpdChCVE5fTU9VU0UsIGtleV9iaXRtYXNrKSkgewotICAgICAgICB1aW50OF90IHJlbF9iaXRtYXNrWyhSRUxfTUFYKzcpLzhdOworICAgICAgICB1aW50OF90IHJlbF9iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoUkVMX01BWCArIDEpXTsKICAgICAgICAgbWVtc2V0KHJlbF9iaXRtYXNrLCAwLCBzaXplb2YocmVsX2JpdG1hc2spKTsKICAgICAgICAgTE9HVigiR2V0dGluZyByZWxhdGl2ZSBjb250cm9sbGVycy4uLiIpOwotICAgICAgICBpZiAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9SRUwsIHNpemVvZihyZWxfYml0bWFzaykpLCByZWxfYml0bWFzaykgPj0gMCkKLSAgICAgICAgeworICAgICAgICBpZiAoaW9jdGwoZmQsIEVWSU9DR0JJVChFVl9SRUwsIHNpemVvZihyZWxfYml0bWFzaykpLCByZWxfYml0bWFzaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHRlc3RfYml0KFJFTF9YLCByZWxfYml0bWFzaykgJiYgdGVzdF9iaXQoUkVMX1ksIHJlbF9iaXRtYXNrKSkgewogICAgICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVFJBQ0tCQUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIAotICAgIHVpbnQ4X3QgYWJzX2JpdG1hc2tbKEFCU19NQVgrNykvOF07CisKKyAgICAvLyBTZWUgaWYgdGhpcyBpcyBhIHRvdWNoIHBhZC4KKyAgICB1aW50OF90IGFic19iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoQUJTX01BWCArIDEpXTsKICAgICBtZW1zZXQoYWJzX2JpdG1hc2ssIDAsIHNpemVvZihhYnNfYml0bWFzaykpOwogICAgIExPR1YoIkdldHRpbmcgYWJzb2x1dGUgY29udHJvbGxlcnMuLi4iKTsKLSAgICBpb2N0bChmZCwgRVZJT0NHQklUKEVWX0FCUywgc2l6ZW9mKGFic19iaXRtYXNrKSksIGFic19iaXRtYXNrKTsKLSAgICAKLSAgICAvLyBJcyB0aGlzIGEgbmV3IG1vZGVybiBtdWx0aS10b3VjaCBkcml2ZXI/Ci0gICAgaWYgKHRlc3RfYml0KEFCU19NVF9UT1VDSF9NQUpPUiwgYWJzX2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWCwgYWJzX2JpdG1hc2spCi0gICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWSwgYWJzX2JpdG1hc2spKSB7Ci0gICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU4gfCBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU5fTVQ7Ci0gICAgICAgIAotICAgIC8vIElzIHRoaXMgYW4gb2xkIHN0eWxlIHNpbmdsZS10b3VjaCBkcml2ZXI/Ci0gICAgfSBlbHNlIGlmICh0ZXN0X2JpdChCVE5fVE9VQ0gsIGtleV9iaXRtYXNrKQotICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX1gsIGFic19iaXRtYXNrKSAmJiB0ZXN0X2JpdChBQlNfWSwgYWJzX2JpdG1hc2spKSB7Ci0gICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfVE9VQ0hTQ1JFRU47CisgICAgaWYgKGlvY3RsKGZkLCBFVklPQ0dCSVQoRVZfQUJTLCBzaXplb2YoYWJzX2JpdG1hc2spKSwgYWJzX2JpdG1hc2spID49IDApIHsKKyAgICAgICAgLy8gSXMgdGhpcyBhIG5ldyBtb2Rlcm4gbXVsdGktdG91Y2ggZHJpdmVyPworICAgICAgICBpZiAodGVzdF9iaXQoQUJTX01UX1RPVUNIX01BSk9SLCBhYnNfYml0bWFzaykKKyAgICAgICAgICAgICAgICAmJiB0ZXN0X2JpdChBQlNfTVRfUE9TSVRJT05fWCwgYWJzX2JpdG1hc2spCisgICAgICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX01UX1BPU0lUSU9OX1ksIGFic19iaXRtYXNrKSkgeworICAgICAgICAgICAgZGV2aWNlLT5jbGFzc2VzIHw9IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTiB8IElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVDsKKworICAgICAgICAvLyBJcyB0aGlzIGFuIG9sZCBzdHlsZSBzaW5nbGUtdG91Y2ggZHJpdmVyPworICAgICAgICB9IGVsc2UgaWYgKHRlc3RfYml0KEJUTl9UT1VDSCwga2V5X2JpdG1hc2spCisgICAgICAgICAgICAgICAgJiYgdGVzdF9iaXQoQUJTX1gsIGFic19iaXRtYXNrKSAmJiB0ZXN0X2JpdChBQlNfWSwgYWJzX2JpdG1hc2spKSB7CisgICAgICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX1RPVUNIU0NSRUVOOworICAgICAgICB9CiAgICAgfQogCiAjaWZkZWYgRVZfU1cKICAgICAvLyBmaWd1cmUgb3V0IHRoZSBzd2l0Y2hlcyB0aGlzIGRldmljZSByZXBvcnRzCi0gICAgdWludDhfdCBzd19iaXRtYXNrWyhTV19NQVgrNykvOF07CisgICAgdWludDhfdCBzd19iaXRtYXNrW3NpemVvZl9iaXRfYXJyYXkoU1dfTUFYICsgMSldOwogICAgIG1lbXNldChzd19iaXRtYXNrLCAwLCBzaXplb2Yoc3dfYml0bWFzaykpOwogICAgIGlmIChpb2N0bChmZCwgRVZJT0NHQklUKEVWX1NXLCBzaXplb2Yoc3dfYml0bWFzaykpLCBzd19iaXRtYXNrKSA+PSAwKSB7CiAgICAgICAgIGZvciAoaW50IGk9MDsgaTxFVl9TVzsgaSsrKSB7CkBAIC03MjYsNyArNzQ5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAiJXMvdXNyL2tleWxheW91dC8lcyIsIHJvb3QsICJxd2VydHkua2wiKTsKICAgICAgICAgICAgIGRlZmF1bHRLZXltYXAgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIGRldmljZS0+bGF5b3V0TWFwLT5sb2FkKGtleWxheW91dEZpbGVuYW1lKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLT5sYXlvdXRNYXAtPmxvYWQoa2V5bGF5b3V0RmlsZW5hbWUpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBMT0dFKCJFcnJvciAlZCBsb2FkaW5nIGtleSBsYXlvdXQuIiwgc3RhdHVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHRlbGwgdGhlIHdvcmxkIGFib3V0IHRoZSBkZXZuYW1lICh0aGUgZGVzY3JpcHRpdmUgbmFtZSkKICAgICAgICAgaWYgKCFtSGF2ZUZpcnN0S2V5Ym9hcmQgJiYgIWRlZmF1bHRLZXltYXAgJiYgc3Ryc3RyKG5hbWUsICIta2V5cGFkIikpIHsKQEAgLTc0NiwxOSArNzcyLDI3IEBACiAgICAgICAgIHByb3BlcnR5X3NldChwcm9wTmFtZSwgbmFtZSk7CiAKICAgICAgICAgLy8gJ1EnIGtleSBzdXBwb3J0ID0gY2hlYXAgdGVzdCBvZiB3aGV0aGVyIHRoaXMgaXMgYW4gYWxwaGEtY2FwYWJsZSBrYmQKLSAgICAgICAgaWYgKGhhc0tleWNvZGUoZGV2aWNlLCBrS2V5Q29kZVEpKSB7CisgICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwgQUtFWUNPREVfUSkpIHsKICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfQUxQSEFLRVk7CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIC8vIFNlZSBpZiB0aGlzIGhhcyBhIERQQUQuCi0gICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwga0tleUNvZGVEcGFkVXApICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZERvd24pICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZExlZnQpICYmCi0gICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIGtLZXlDb2RlRHBhZFJpZ2h0KSAmJgotICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBrS2V5Q29kZURwYWRDZW50ZXIpKSB7CisgICAgICAgIC8vIFNlZSBpZiB0aGlzIGRldmljZSBoYXMgYSBEUEFELgorICAgICAgICBpZiAoaGFzS2V5Y29kZShkZXZpY2UsIEFLRVlDT0RFX0RQQURfVVApICYmCisgICAgICAgICAgICAgICAgaGFzS2V5Y29kZShkZXZpY2UsIEFLRVlDT0RFX0RQQURfRE9XTikgJiYKKyAgICAgICAgICAgICAgICBoYXNLZXljb2RlKGRldmljZSwgQUtFWUNPREVfRFBBRF9MRUZUKSAmJgorICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBBS0VZQ09ERV9EUEFEX1JJR0hUKSAmJgorICAgICAgICAgICAgICAgIGhhc0tleWNvZGUoZGV2aWNlLCBBS0VZQ09ERV9EUEFEX0NFTlRFUikpIHsKICAgICAgICAgICAgIGRldmljZS0+Y2xhc3NlcyB8PSBJTlBVVF9ERVZJQ0VfQ0xBU1NfRFBBRDsKICAgICAgICAgfQogICAgICAgICAKKyAgICAgICAgLy8gU2VlIGlmIHRoaXMgZGV2aWNlIGhhcyBhIGdhbWVwYWQuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKEdBTUVQQURfS0VZQ09ERVMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChoYXNLZXljb2RlKGRldmljZSwgR0FNRVBBRF9LRVlDT0RFU1tpXSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UtPmNsYXNzZXMgfD0gSU5QVVRfREVWSUNFX0NMQVNTX0dBTUVQQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBMT0dJKCJOZXcga2V5Ym9hcmQ6IGRldmljZS0+aWQ9MHgleCBkZXZuYW1lPSclcycgcHJvcE5hbWU9JyVzJyBrZXlsYXlvdXQ9JyVzJ1xuIiwKICAgICAgICAgICAgICAgICBkZXZpY2UtPmlkLCBuYW1lLCBwcm9wTmFtZSwga2V5bGF5b3V0RmlsZW5hbWUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXQuY3BwIGIvbGlicy91aS9JbnB1dC5jcHAKaW5kZXggYTY0MjUxZi4uMWYxOWMyYyAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dC5jcHAKKysrIGIvbGlicy91aS9JbnB1dC5jcHAKQEAgLTIyLDI2ICsyMiwyNiBAQAogCiBib29sIEtleUV2ZW50OjpoYXNEZWZhdWx0QWN0aW9uKGludDMyX3Qga2V5Q29kZSkgewogICAgIHN3aXRjaCAoa2V5Q29kZSkgewotICAgICAgICBjYXNlIEtFWUNPREVfSE9NRToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0JBQ0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQUxMOgotICAgICAgICBjYXNlIEtFWUNPREVfRU5EQ0FMTDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9VUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9ET1dOOgotICAgICAgICBjYXNlIEtFWUNPREVfUE9XRVI6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQU1FUkE6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9IRUFEU0VUSE9PSzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FTlU6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9OT1RJRklDQVRJT046Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9GT0NVUzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1NFQVJDSDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9TVE9QOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfTkVYVDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1BSRVZJT1VTOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfUkVXSU5EOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgotICAgICAgICBjYXNlIEtFWUNPREVfTVVURToKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9IT01FOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0JBQ0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9FTkRDQUxMOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9WT0xVTUVfRE9XTjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9QT1dFUjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9DQU1FUkE6CisgICAgICAgIGNhc2UgQUtFWUNPREVfSEVBRFNFVEhPT0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVOVToKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9OT1RJRklDQVRJT046CisgICAgICAgIGNhc2UgQUtFWUNPREVfRk9DVVM6CisgICAgICAgIGNhc2UgQUtFWUNPREVfU0VBUkNIOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9ORVhUOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1JFV0lORDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTVVURToKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAKQEAgLTU0LDI2ICs1NCwyNiBAQAogCiBib29sIEtleUV2ZW50Ojppc1N5c3RlbUtleShpbnQzMl90IGtleUNvZGUpIHsKICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FTlU6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9TT0ZUX1JJR0hUOgotICAgICAgICBjYXNlIEtFWUNPREVfSE9NRToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0JBQ0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9DQUxMOgotICAgICAgICBjYXNlIEtFWUNPREVfRU5EQ0FMTDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9VUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX1ZPTFVNRV9ET1dOOgotICAgICAgICBjYXNlIEtFWUNPREVfTVVURToKLSAgICAgICAgY2FzZSBLRVlDT0RFX1BPV0VSOgotICAgICAgICBjYXNlIEtFWUNPREVfSEVBRFNFVEhPT0s6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFOgotICAgICAgICBjYXNlIEtFWUNPREVfTUVESUFfU1RPUDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX05FWFQ6Ci0gICAgICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QUkVWSU9VUzoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX1JFV0lORDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX01FRElBX0ZBU1RfRk9SV0FSRDoKLSAgICAgICAgY2FzZSBLRVlDT0RFX0NBTUVSQToKLSAgICAgICAgY2FzZSBLRVlDT0RFX0ZPQ1VTOgotICAgICAgICBjYXNlIEtFWUNPREVfU0VBUkNIOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FTlU6CisgICAgICAgIGNhc2UgQUtFWUNPREVfU09GVF9SSUdIVDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9IT01FOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0JBQ0s6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9FTkRDQUxMOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9WT0xVTUVfRE9XTjoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NVVRFOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1BPV0VSOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0hFQURTRVRIT09LOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgICAgIGNhc2UgQUtFWUNPREVfTUVESUFfU1RPUDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9ORVhUOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX01FRElBX1JFV0lORDoKKyAgICAgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgICAgIGNhc2UgQUtFWUNPREVfQ0FNRVJBOgorICAgICAgICBjYXNlIEFLRVlDT0RFX0ZPQ1VTOgorICAgICAgICBjYXNlIEFLRVlDT0RFX1NFQVJDSDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXREZXZpY2UuY3BwIGIvbGlicy91aS9JbnB1dERldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxNDAxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnMvdWkvSW5wdXREZXZpY2UuY3BwCkBAIC0wLDAgKzEsNzI5IEBACisvLworLy8gQ29weXJpZ2h0IDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIFRoZSBpbnB1dCByZWFkZXIuCisvLworI2RlZmluZSBMT0dfVEFHICJJbnB1dERldmljZSIKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgZm9yIGVhY2ggcmF3IGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIEV2ZW50SHViLgorI2RlZmluZSBERUJVR19SQVdfRVZFTlRTIDAKKworLy8gTG9nIGRlYnVnIG1lc3NhZ2VzIGFib3V0IHRvdWNoIHNjcmVlbiBmaWx0ZXJpbmcgaGFja3MuCisjZGVmaW5lIERFQlVHX0hBQ0tTIDAKKworLy8gTG9nIGRlYnVnIG1lc3NhZ2VzIGFib3V0IHZpcnR1YWwga2V5IHByb2Nlc3NpbmcuCisjZGVmaW5lIERFQlVHX1ZJUlRVQUxfS0VZUyAwCisKKy8vIExvZyBkZWJ1ZyBtZXNzYWdlcyBhYm91dCBwb2ludGVycy4KKyNkZWZpbmUgREVCVUdfUE9JTlRFUlMgMAorCisvLyBMb2cgZGVidWcgbWVzc2FnZXMgYWJvdXQgcG9pbnRlciBhc3NpZ25tZW50IGNhbGN1bGF0aW9ucy4KKyNkZWZpbmUgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UIDAKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDx1aS9JbnB1dERldmljZS5oPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworLyogU2xvcCBkaXN0YW5jZSBmb3IganVtcHkgcG9pbnRlciBkZXRlY3Rpb24uCisgKiBUaGUgdmVydGljYWwgcmFuZ2Ugb2YgdGhlIHNjcmVlbiBkaXZpZGVkIGJ5IHRoaXMgaXMgb3VyIGVwc2lsb24gdmFsdWUuICovCisjZGVmaW5lIEpVTVBZX0VQU0lMT05fRElWSVNPUiAyMTIKKworLyogTnVtYmVyIG9mIGp1bXB5IHBvaW50cyB0byBkcm9wIGZvciB0b3VjaHNjcmVlbnMgdGhhdCBuZWVkIGl0LiAqLworI2RlZmluZSBKVU1QWV9UUkFOU0lUSU9OX0RST1BTIDMKKyNkZWZpbmUgSlVNUFlfRFJPUF9MSU1JVCAzCisKKy8qIE1heGltdW0gc3F1YXJlZCBkaXN0YW5jZSBmb3IgYXZlcmFnaW5nLgorICogSWYgbW92aW5nIGZhcnRoZXIgdGhhbiB0aGlzLCB0dXJuIG9mIGF2ZXJhZ2luZyB0byBhdm9pZCBsYWcgaW4gcmVzcG9uc2UuICovCisjZGVmaW5lIEFWRVJBR0lOR19ESVNUQU5DRV9MSU1JVCAoNzUgKiA3NSkKKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLSBTdGF0aWMgRnVuY3Rpb25zIC0tLQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIHN0YXRpYyBUIGFicyhjb25zdCBUJiB2YWx1ZSkgeworICAgIHJldHVybiB2YWx1ZSA8IDAgPyAtIHZhbHVlIDogdmFsdWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgc3RhdGljIFQgbWluKGNvbnN0IFQmIGEsIGNvbnN0IFQmIGIpIHsKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBzdGF0aWMgdm9pZCBzd2FwKFQmIGEsIFQmIGIpIHsKKyAgICBUIHRlbXAgPSBhOworICAgIGEgPSBiOworICAgIGIgPSB0ZW1wOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZSAtLS0KKworSW5wdXREZXZpY2U6OklucHV0RGV2aWNlKGludDMyX3QgaWQsIHVpbnQzMl90IGNsYXNzZXMsIFN0cmluZzggbmFtZSkgOgorICAgIGlkKGlkKSwgY2xhc3NlcyhjbGFzc2VzKSwgbmFtZShuYW1lKSwgaWdub3JlZChmYWxzZSkgeworfQorCit2b2lkIElucHV0RGV2aWNlOjpyZXNldCgpIHsKKyAgICBpZiAoaXNLZXlib2FyZCgpKSB7CisgICAgICAgIGtleWJvYXJkLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGlzVHJhY2tiYWxsKCkpIHsKKyAgICAgICAgdHJhY2tiYWxsLnJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKGlzTXVsdGlUb3VjaFNjcmVlbigpKSB7CisgICAgICAgIG11bHRpVG91Y2hTY3JlZW4ucmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKGlzU2luZ2xlVG91Y2hTY3JlZW4oKSkgeworICAgICAgICBzaW5nbGVUb3VjaFNjcmVlbi5yZXNldCgpOworICAgIH0KKworICAgIGlmIChpc1RvdWNoU2NyZWVuKCkpIHsKKyAgICAgICAgdG91Y2hTY3JlZW4ucmVzZXQoKTsKKyAgICB9Cit9CisKKworLy8gLS0tIElucHV0RGV2aWNlOjpUb3VjaERhdGEgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OlRvdWNoRGF0YTo6Y29weUZyb20oY29uc3QgVG91Y2hEYXRhJiBvdGhlcikgeworICAgIHBvaW50ZXJDb3VudCA9IG90aGVyLnBvaW50ZXJDb3VudDsKKyAgICBpZEJpdHMgPSBvdGhlci5pZEJpdHM7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcG9pbnRlckNvdW50OyBpKyspIHsKKyAgICAgICAgcG9pbnRlcnNbaV0gPSBvdGhlci5wb2ludGVyc1tpXTsKKyAgICAgICAgaWRUb0luZGV4W2ldID0gb3RoZXIuaWRUb0luZGV4W2ldOworICAgIH0KK30KKworCisvLyAtLS0gSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGUgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGU6OnJlc2V0KCkgeworICAgIGN1cnJlbnQubWV0YVN0YXRlID0gTUVUQV9OT05FOworICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6VHJhY2tiYWxsU3RhdGUgLS0tCisKK3ZvaWQgSW5wdXREZXZpY2U6OlRyYWNrYmFsbFN0YXRlOjpyZXNldCgpIHsKKyAgICBhY2N1bXVsYXRvci5jbGVhcigpOworICAgIGN1cnJlbnQuZG93biA9IGZhbHNlOworICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7CisgICAgbGFzdFRvdWNoLmNsZWFyKCk7CisgICAgZG93blRpbWUgPSAwOworICAgIGN1cnJlbnRWaXJ0dWFsS2V5LnN0YXR1cyA9IEN1cnJlbnRWaXJ0dWFsS2V5U3RhdGU6OlNUQVRVU19VUDsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfUE9JTlRFUlM7IGkrKykgeworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5U3RhcnRbaV0gPSAwOworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2ldID0gMDsKKyAgICB9CisKKyAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7Cit9CisKK3N0cnVjdCBQb2ludGVyRGlzdGFuY2VIZWFwRWxlbWVudCB7CisgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA6IDg7CisgICAgdWludDMyX3QgbGFzdFBvaW50ZXJJbmRleCA6IDg7CisgICAgdWludDY0X3QgZGlzdGFuY2UgOiA0ODsgLy8gc3F1YXJlZCBkaXN0YW5jZQorfTsKKwordm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6Y2FsY3VsYXRlUG9pbnRlcklkcygpIHsKKyAgICB1aW50MzJfdCBjdXJyZW50UG9pbnRlckNvdW50ID0gY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsKKyAgICB1aW50MzJfdCBsYXN0UG9pbnRlckNvdW50ID0gbGFzdFRvdWNoLnBvaW50ZXJDb3VudDsKKworICAgIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgLy8gTm8gcG9pbnRlcnMgdG8gYXNzaWduLgorICAgICAgICBjdXJyZW50VG91Y2guaWRCaXRzLmNsZWFyKCk7CisgICAgfSBlbHNlIGlmIChsYXN0UG9pbnRlckNvdW50ID09IDApIHsKKyAgICAgICAgLy8gQWxsIHBvaW50ZXJzIGFyZSBuZXcuCisgICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMuY2xlYXIoKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGN1cnJlbnRQb2ludGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkID0gaTsKKyAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaV0gPSBpOworICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy5tYXJrQml0KGkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDEgJiYgbGFzdFBvaW50ZXJDb3VudCA9PSAxKSB7CisgICAgICAgIC8vIE9ubHkgb25lIHBvaW50ZXIgYW5kIG5vIGNoYW5nZSBpbiBjb3VudCBzbyBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgaWQgYXMgYmVmb3JlLgorICAgICAgICB1aW50MzJfdCBpZCA9IGxhc3RUb3VjaC5wb2ludGVyc1swXS5pZDsKKyAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzBdLmlkID0gaWQ7CisgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gMDsKKyAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy52YWx1ZSA9IEJpdFNldDMyOjp2YWx1ZUZvckJpdChpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gR2VuZXJhbCBjYXNlLgorICAgICAgICAvLyBXZSBidWlsZCBhIGhlYXAgb2Ygc3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2VzIGJldHdlZW4gY3VycmVudCBhbmQgbGFzdCBwb2ludGVycworICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYW5kIGxhc3QgcG9pbnRlciBpbmRpY2VzLiAgVGhlbiwgd2UgZmluZCB0aGUgYmVzdAorICAgICAgICAvLyBtYXRjaCAoYnkgZGlzdGFuY2UpIGZvciBlYWNoIGN1cnJlbnQgcG9pbnRlci4KKyAgICAgICAgUG9pbnRlckRpc3RhbmNlSGVhcEVsZW1lbnQgaGVhcFtNQVhfUE9JTlRFUlMgKiBNQVhfUE9JTlRFUlNdOworCisgICAgICAgIHVpbnQzMl90IGhlYXBTaXplID0gMDsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjdXJyZW50UG9pbnRlckluZGV4ID0gMDsgY3VycmVudFBvaW50ZXJJbmRleCA8IGN1cnJlbnRQb2ludGVyQ291bnQ7CisgICAgICAgICAgICAgICAgY3VycmVudFBvaW50ZXJJbmRleCsrKSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSAwOyBsYXN0UG9pbnRlckluZGV4IDwgbGFzdFBvaW50ZXJDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbGFzdFBvaW50ZXJJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkZWx0YVggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudFBvaW50ZXJJbmRleF0ueAorICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0ueDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS55CisgICAgICAgICAgICAgICAgICAgICAgICAtIGxhc3RUb3VjaC5wb2ludGVyc1tsYXN0UG9pbnRlckluZGV4XS55OworCisgICAgICAgICAgICAgICAgdWludDY0X3QgZGlzdGFuY2UgPSB1aW50NjRfdChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpOworCisgICAgICAgICAgICAgICAgLy8gSW5zZXJ0IG5ldyBlbGVtZW50IGludG8gdGhlIGhlYXAgKHNpZnQgdXApLgorICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmN1cnJlbnRQb2ludGVySW5kZXggPSBjdXJyZW50UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmxhc3RQb2ludGVySW5kZXggPSBsYXN0UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmRpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgaGVhcFNpemUgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhlYXBpZnkKKyAgICAgICAgZm9yICh1aW50MzJfdCBzdGFydEluZGV4ID0gaGVhcFNpemUgLyAyOyBzdGFydEluZGV4ICE9IDA7ICkgeworICAgICAgICAgICAgc3RhcnRJbmRleCAtPSAxOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwYXJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7IDspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+PSBoZWFwU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBoZWFwU2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGVhcFtjaGlsZEluZGV4ICsgMV0uZGlzdGFuY2UgPCBoZWFwW2NoaWxkSW5kZXhdLmRpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaGVhcFtwYXJlbnRJbmRleF0uZGlzdGFuY2UgPD0gaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2FwKGhlYXBbcGFyZW50SW5kZXhdLCBoZWFwW2NoaWxkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAorICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gaW5pdGlhbCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIFB1bGwgbWF0Y2hlcyBvdXQgYnkgaW5jcmVhc2luZyBvcmRlciBvZiBkaXN0YW5jZS4KKyAgICAgICAgLy8gVG8gYXZvaWQgcmVhc3NpZ25pbmcgcG9pbnRlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBtYXRjaGVkLCB0aGUgbG9vcCBrZWVwcyB0cmFjaworICAgICAgICAvLyBvZiB3aGljaCBsYXN0IGFuZCBjdXJyZW50IHBvaW50ZXJzIGhhdmUgYmVlbiBtYXRjaGVkIHVzaW5nIHRoZSBtYXRjaGVkWFhYQml0cyB2YXJpYWJsZXMuCisgICAgICAgIC8vIEl0IGFsc28gdHJhY2tzIHRoZSB1c2VkIHBvaW50ZXIgaWQgYml0cy4KKyAgICAgICAgQml0U2V0MzIgbWF0Y2hlZExhc3RCaXRzKDApOworICAgICAgICBCaXRTZXQzMiBtYXRjaGVkQ3VycmVudEJpdHMoMCk7CisgICAgICAgIEJpdFNldDMyIHVzZWRJZEJpdHMoMCk7CisgICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBtaW4oY3VycmVudFBvaW50ZXJDb3VudCwgbGFzdFBvaW50ZXJDb3VudCk7IGkgPiAwOyBpLS0pIHsKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgd2UganVzdCBjb25zdW1lIHRoZSByb290IGVsZW1lbnQgb2YKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhlYXAgKHRoZSBvbmUgd2l0aCBzbWFsbGVzdCBkaXN0YW5jZSkuCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgaXRlcmF0aW9ucyBjb25zdW1lZCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBoZWFwLgorICAgICAgICAgICAgICAgICAgICAvLyBQb3Agcm9vdCBlbGVtZW50IG9mZiBvZiB0aGUgaGVhcCAoc2lmdCBkb3duKS4KKyAgICAgICAgICAgICAgICAgICAgaGVhcFNpemUgLT0gMTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGhlYXBTaXplID4gMCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2lmdCBkb3duLgorICAgICAgICAgICAgICAgICAgICBoZWFwWzBdID0gaGVhcFtoZWFwU2l6ZV07CisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgcGFyZW50SW5kZXggPSAwOyA7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXBTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXBTaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhlYXBbY2hpbGRJbmRleCArIDFdLmRpc3RhbmNlIDwgaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYXBbcGFyZW50SW5kZXhdLmRpc3RhbmNlIDw9IGhlYXBbY2hpbGRJbmRleF0uZGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgc3dhcChoZWFwW3BhcmVudEluZGV4XSwgaGVhcFtjaGlsZEluZGV4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7CisgICAgICAgICAgICAgICAgICAgIH0KKworI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAorICAgICAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gcmVkdWNlZCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRQb2ludGVySW5kZXggPSBoZWFwWzBdLmN1cnJlbnRQb2ludGVySW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRDdXJyZW50Qml0cy5oYXNCaXQoY3VycmVudFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSBoZWFwWzBdLmxhc3RQb2ludGVySW5kZXg7CisgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRMYXN0Qml0cy5oYXNCaXQobGFzdFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKKworICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOworICAgICAgICAgICAgICAgIG1hdGNoZWRMYXN0Qml0cy5tYXJrQml0KGxhc3RQb2ludGVySW5kZXgpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0uaWQ7CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRQb2ludGVySW5kZXhdLmlkID0gaWQ7CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpZF0gPSBjdXJyZW50UG9pbnRlckluZGV4OworICAgICAgICAgICAgICAgIHVzZWRJZEJpdHMubWFya0JpdChpZCk7CisKKyNpZiBERUJVR19QT0lOVEVSX0FTU0lHTk1FTlQKKyAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gbWF0Y2hlZDogY3VyPSVkLCBsYXN0PSVkLCBpZD0lZCwgZGlzdGFuY2U9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnRlckluZGV4LCBjdXJyZW50UG9pbnRlckluZGV4LCBpZCwgaGVhcFswXS5kaXN0YW5jZSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEFzc2lnbiBmcmVzaCBpZHMgdG8gbmV3IHBvaW50ZXJzLgorICAgICAgICBpZiAoY3VycmVudFBvaW50ZXJDb3VudCA+IGxhc3RQb2ludGVyQ291bnQpIHsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IGN1cnJlbnRQb2ludGVyQ291bnQgLSBsYXN0UG9pbnRlckNvdW50OyA7KSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA9IG1hdGNoZWRDdXJyZW50Qml0cy5maXJzdFVubWFya2VkQml0KCk7CisgICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSB1c2VkSWRCaXRzLmZpcnN0VW5tYXJrZWRCaXQoKTsKKworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS5pZCA9IGlkOworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gY3VycmVudFBvaW50ZXJJbmRleDsKKyAgICAgICAgICAgICAgICB1c2VkSWRCaXRzLm1hcmtCaXQoaWQpOworCisjaWYgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UCisgICAgICAgICAgICAgICAgTE9HRCgiY2FsY3VsYXRlUG9pbnRlcklkcyAtIGFzc2lnbmVkOiBjdXI9JWQsIGlkPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb2ludGVySW5kZXgsIGlkKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKC0taSA9PSAwKSBicmVhazsgLy8gZG9uZQorICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRml4IGlkIGJpdHMuCisgICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMgPSB1c2VkSWRCaXRzOworICAgIH0KK30KKworLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGlmIG9uZSBvZiB0aGUKKyAqIHBvaW50cyBoYXMgbW92ZWQgbW9yZSB0aGFuIGEgc2NyZWVuIGhlaWdodCBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLAorICogdGhlbiBkcm9wIGl0LiAqLworYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6YXBwbHlCYWRUb3VjaEZpbHRlcigpIHsKKyAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgorICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7CisKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGFyZSBubyBwb2ludHMuCisgICAgaWYgKHBvaW50ZXJDb3VudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhIGZpbmdlciBpcyBnb2luZyBkb3duIG9yIHVwLiAgV2UgcnVuCisgICAgLy8gaGVyZSBiZWZvcmUgYXNzaWduaW5nIHBvaW50ZXIgSURzLCBzbyB0aGVyZSBpc24ndCBhIGdvb2QKKyAgICAvLyB3YXkgdG8gZG8gcGVyLWZpbmdlciBtYXRjaGluZy4KKyAgICBpZiAocG9pbnRlckNvdW50ICE9IGxhc3RUb3VjaC5wb2ludGVyQ291bnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFdlIGNvbnNpZGVyIGEgc2luZ2xlIG1vdmVtZW50IGFjcm9zcyBtb3JlIHRoYW4gYSA3LzE2IG9mCisgICAgLy8gdGhlIGxvbmcgc2l6ZSBvZiB0aGUgc2NyZWVuIHRvIGJlIGJhZC4gIFRoaXMgd2FzIGEgbWFnaWMgdmFsdWUKKyAgICAvLyBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgYXQgdGhlIG1heGltdW0gZGlzdGFuY2UgaXQgaXMgZmVhc2libGUKKyAgICAvLyB0byBhY3R1YWxseSBtb3ZlIGluIG9uZSBzYW1wbGUuCisgICAgaW50MzJfdCBtYXhEZWx0YVkgPSBwYXJhbWV0ZXJzLnlBeGlzLnJhbmdlICogNyAvIDE2OworCisgICAgLy8gWFhYIFRoZSBvcmlnaW5hbCBjb2RlIGluIElucHV0RGV2aWNlLmphdmEgaW5jbHVkZWQgY29tbWVudGVkIG91dAorICAgIC8vICAgICBjb2RlIGZvciB0ZXN0aW5nIHRoZSBYIGF4aXMuICBOb3RlIHRoYXQgd2hlbiB3ZSBkcm9wIGEgcG9pbnQKKyAgICAvLyAgICAgd2UgZG9uJ3QgYWN0dWFsbHkgcmVzdG9yZSB0aGUgb2xkIFggZWl0aGVyLiAgU3RyYW5nZS4KKyAgICAvLyAgICAgVGhlIG9sZCBjb2RlIGFsc28gdHJpZXMgdG8gdHJhY2sgd2hlbiBiYWQgcG9pbnRzIHdlcmUgcHJldmlvdXNseQorICAgIC8vICAgICBkZXRlY3RlZCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZHVlIHRvIHRoZSBwbGFjZW1lbnQgb2YgYSAiYnJlYWsiCisgICAgLy8gICAgIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIHdlIG5ldmVyIHNldCBtRHJvcHBlZEJhZFBvaW50IHRvIHRydWUKKyAgICAvLyAgICAgc28gaXQgaXMgZWZmZWN0aXZlbHkgZGVhZCBjb2RlLgorICAgIC8vIE5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2xkIGNvZGUgaXMgYnVzdGVkIG9yIGp1c3Qgb3ZlcmNvbXBsaWNhdGVkCisgICAgLy8gYnV0IHdvcmtpbmcgYXMgaW50ZW5kZWQuCisKKyAgICAvLyBMb29rIHRocm91Z2ggYWxsIG5ldyBwb2ludHMgYW5kIHNlZSBpZiBhbnkgYXJlIGZhcnRoZXIgdGhhbgorICAgIC8vIGFjY2VwdGFibGUgZnJvbSBhbGwgcHJldmlvdXMgcG9pbnRzLgorICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7CisgICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OworICAgICAgICBpbnQzMl90IGNsb3Nlc3RZID0gSU5UX01BWDsKKyAgICAgICAgaW50MzJfdCBjbG9zZXN0RGVsdGFZID0gMDsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgIExPR0QoIkJhZFRvdWNoRmlsdGVyOiBMb29raW5nIGF0IG5leHQgcG9pbnQgIyVkOiB5PSVkIiwgaSwgeSk7CisjZW5kaWYKKworICAgICAgICBmb3IgKHVpbnQzMl90IGogPSBwb2ludGVyQ291bnQ7IGotLSA+IDA7ICkgeworICAgICAgICAgICAgaW50MzJfdCBsYXN0WSA9IGxhc3RUb3VjaC5wb2ludGVyc1tqXS55OworICAgICAgICAgICAgaW50MzJfdCBkZWx0YVkgPSBhYnMoeSAtIGxhc3RZKTsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJCYWRUb3VjaEZpbHRlcjogQ29tcGFyaW5nIHdpdGggbGFzdCBwb2ludCAjJWQ6IHk9JWQgZGVsdGFZPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgaiwgbGFzdFksIGRlbHRhWSk7CisjZW5kaWYKKworICAgICAgICAgICAgaWYgKGRlbHRhWSA8IG1heERlbHRhWSkgeworICAgICAgICAgICAgICAgIGdvdG8gU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVsdGFZIDwgY2xvc2VzdERlbHRhWSkgeworICAgICAgICAgICAgICAgIGNsb3Nlc3REZWx0YVkgPSBkZWx0YVk7CisgICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBsYXN0WTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE11c3Qgbm90IGhhdmUgZm91bmQgYSBjbG9zZSBlbm91Z2ggbWF0Y2guCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgTE9HRCgiQmFkVG91Y2hGaWx0ZXI6IERyb3BwaW5nIGJhZCBwb2ludCAjJWQ6IG5ld1k9JWQgb2xkWT0lZCBkZWx0YVk9JWQgbWF4RGVsdGFZPSVkIiwKKyAgICAgICAgICAgICAgICBpLCB5LCBjbG9zZXN0WSwgY2xvc2VzdERlbHRhWSwgbWF4RGVsdGFZKTsKKyNlbmRpZgorCisgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55ID0gY2xvc2VzdFk7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBYWFggb3JpZ2luYWwgY29kZSBvbmx5IGNvcnJlY3RzIG9uZSBwb2ludAorCisgICAgU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ6IDsKKyAgICB9CisKKyAgICAvLyBObyBjaGFuZ2UuCisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBTcGVjaWFsIGhhY2sgZm9yIGRldmljZXMgdGhhdCBoYXZlIGJhZCBzY3JlZW4gZGF0YTogZHJvcCBwb2ludHMgd2hlcmUKKyAqIHRoZSBjb29yZGluYXRlIHZhbHVlIGZvciBvbmUgYXhpcyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uCisgKi8KK2Jvb2wgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5SnVtcHlUb3VjaEZpbHRlcigpIHsKKyAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgorICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7CisgICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgIT0gcG9pbnRlckNvdW50KSB7CisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgTE9HRCgiSnVtcHlUb3VjaEZpbHRlcjogRGlmZmVyZW50IHBvaW50ZXIgY291bnQgJWQgLT4gJWQiLAorICAgICAgICAgICAgICAgIGxhc3RUb3VjaC5wb2ludGVyQ291bnQsIHBvaW50ZXJDb3VudCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwb2ludGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgTE9HRCgiICBQb2ludGVyICVkICglZCwgJWQpIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLngsIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfVFJBTlNJVElPTl9EUk9QUykgeworICAgICAgICAgICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMSAmJiBwb2ludGVyQ291bnQgPT0gMikgeworICAgICAgICAgICAgICAgIC8vIEp1c3QgZHJvcCB0aGUgZmlyc3QgZmV3IGV2ZW50cyBnb2luZyBmcm9tIDEgdG8gMiBwb2ludGVycy4KKyAgICAgICAgICAgICAgICAvLyBUaGV5J3JlIGJhZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGV5J3JlIG5vdCB3b3J0aCBjb25zaWRlcmluZy4KKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCArPSAxOworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyIDIgZHJvcHBlZCIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMiAmJiBwb2ludGVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCB3aGVuIHdlIGdvIGZyb20gMiAtPiAxIHRlbmRzIHRvIGJlIG1lc3NlZCB1cCB0b28KKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbMF0gPSBsYXN0VG91Y2gucG9pbnRlcnNbMF07CisgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzFdID0gbGFzdFRvdWNoLnBvaW50ZXJzWzFdOworICAgICAgICAgICAgICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkICs9IDE7CisKKyNpZiBERUJVR19IQUNLUworICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyICVkIHJlcGxhY2VkICglZCwgJWQpIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueCwgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkpOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFJlc2V0IGp1bXB5IHBvaW50cyBkcm9wcGVkIG9uIG90aGVyIHRyYW5zaXRpb25zIG9yIGlmIGxpbWl0IGV4Y2VlZGVkLgorICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7CisKKyNpZiBERUJVR19IQUNLUworICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBUcmFuc2l0aW9uIC0gZHJvcCBsaW1pdCByZXNldCIpOworI2VuZGlmCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBXZSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludGVycyBhcyBsYXN0IHRpbWUuCisgICAgLy8gQSAnanVtcHknIHBvaW50IGlzIG9uZSB3aGVyZSB0aGUgY29vcmRpbmF0ZSB2YWx1ZSBmb3Igb25lIGF4aXMKKyAgICAvLyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcKKyAgICAvLyBlbHNlIGlmIHdlIG9ubHkgaGF2ZSBvbmUgcG9pbnRlci4KKyAgICBpZiAocG9pbnRlckNvdW50IDwgMikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfRFJPUF9MSU1JVCkgeworICAgICAgICBpbnQganVtcHlFcHNpbG9uID0gcGFyYW1ldGVycy55QXhpcy5yYW5nZSAvIEpVTVBZX0VQU0lMT05fRElWSVNPUjsKKworICAgICAgICAvLyBXZSBvbmx5IHJlcGxhY2UgdGhlIHNpbmdsZSB3b3JzdCBqdW1weSBwb2ludCBhcyBjaGFyYWN0ZXJpemVkIGJ5IHBvaW50ZXIgZGlzdGFuY2UKKyAgICAgICAgLy8gaW4gYSBzaW5nbGUgYXhpcy4KKyAgICAgICAgaW50MzJfdCBiYWRQb2ludGVySW5kZXggPSAtMTsKKyAgICAgICAgaW50MzJfdCBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IC0xOworICAgICAgICBpbnQzMl90IGJhZFBvaW50ZXJEaXN0YW5jZSA9IElOVF9NSU47IC8vIGRpc3RhbmNlIHRvIGJlIGNvcnJlY3RlZAorCisgICAgICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7CisgICAgICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueDsKKyAgICAgICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFBvaW50ICVkICglZCwgJWQpIiwgaSwgeCwgeSk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSB0b3VjaCBwb2ludCBpcyB0b28gY2xvc2UgdG8gYW5vdGhlcidzIGNvb3JkaW5hdGVzCisgICAgICAgICAgICBib29sIGRyb3BYID0gZmFsc2UsIGRyb3BZID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcG9pbnRlckNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChhYnMoeCAtIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tqXS54KSA8PSBqdW1weUVwc2lsb24pIHsKKyAgICAgICAgICAgICAgICAgICAgZHJvcFggPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYWJzKHkgLSBjdXJyZW50VG91Y2gucG9pbnRlcnNbal0ueSkgPD0ganVtcHlFcHNpbG9uKSB7CisgICAgICAgICAgICAgICAgICAgIGRyb3BZID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEgZHJvcFggJiYgISBkcm9wWSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QganVtcHkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmluZCBhIHJlcGxhY2VtZW50IGNhbmRpZGF0ZSBieSBjb21wYXJpbmcgd2l0aCBvbGRlciBwb2ludHMgb24gdGhlCisgICAgICAgICAgICAvLyBjb21wbGVtZW50YXJ5IChub24tanVtcHkpIGF4aXMuCisgICAgICAgICAgICBpbnQzMl90IGRpc3RhbmNlID0gSU5UX01JTjsgLy8gZGlzdGFuY2UgdG8gYmUgY29ycmVjdGVkCisgICAgICAgICAgICBpbnQzMl90IHJlcGxhY2VtZW50SW5kZXggPSAtMTsKKworICAgICAgICAgICAgaWYgKGRyb3BYKSB7CisgICAgICAgICAgICAgICAgLy8gWCBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBZLgorICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVkgPSBJTlRfTUFYOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWSA9IGFicyh5IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLnkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZIDwgc21hbGxlc3REZWx0YVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFZID0gZGVsdGFZOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeCAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS54KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gWSBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBYLgorICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVggPSBJTlRfTUFYOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWCA9IGFicyh4IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLngpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYIDwgc21hbGxlc3REZWx0YVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFYID0gZGVsdGFYOworICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeSAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS55KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgcmVwbGFjaW5nIHRoaXMgcG9pbnRlciB3b3VsZCBjb3JyZWN0IGEgd29yc2UgZXJyb3IgdGhhbiB0aGUgcHJldmlvdXMgb25lcworICAgICAgICAgICAgLy8gY29uc2lkZXJlZCwgdGhlbiB1c2UgdGhpcyByZXBsYWNlbWVudCBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gYmFkUG9pbnRlckRpc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgYmFkUG9pbnRlckluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IHJlcGxhY2VtZW50SW5kZXg7CisgICAgICAgICAgICAgICAgYmFkUG9pbnRlckRpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDb3JyZWN0IHRoZSBqdW1weSBwb2ludGVyIGlmIG9uZSB3YXMgZm91bmQuCisgICAgICAgIGlmIChiYWRQb2ludGVySW5kZXggPj0gMCkgeworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBSZXBsYWNpbmcgYmFkIHBvaW50ZXIgJWQgd2l0aCAoJWQsICVkKSIsCisgICAgICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS54LAorICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLnkpOworI2VuZGlmCisKKyAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVySW5kZXhdLnggPQorICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLng7CisgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlckluZGV4XS55ID0KKyAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS55OworICAgICAgICAgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgKz0gMTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgPSAwOworICAgIHJldHVybiBmYWxzZTsKK30KKworLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGFnZ3JlZ2F0ZSBhbmQKKyAqIGNvbXB1dGUgYXZlcmFnZXMgb2YgdGhlIGNvb3JkaW5hdGUgZGF0YSwgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YKKyAqIGppdHRlciBzZWVuIGJ5IGFwcGxpY2F0aW9ucy4gKi8KK3ZvaWQgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5QXZlcmFnaW5nVG91Y2hGaWx0ZXIoKSB7CisgICAgZm9yICh1aW50MzJfdCBjdXJyZW50SW5kZXggPSAwOyBjdXJyZW50SW5kZXggPCBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBjdXJyZW50SW5kZXgrKykgeworICAgICAgICB1aW50MzJfdCBpZCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLmlkOworICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54OworICAgICAgICBpbnQzMl90IHkgPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS55OworICAgICAgICBpbnQzMl90IHByZXNzdXJlID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRJbmRleF0ucHJlc3N1cmU7CisKKyAgICAgICAgaWYgKGxhc3RUb3VjaC5pZEJpdHMuaGFzQml0KGlkKSkgeworICAgICAgICAgICAgLy8gUG9pbnRlciB3YXMgZG93biBiZWZvcmUgYW5kIGlzIHN0aWxsIGRvd24gbm93LgorICAgICAgICAgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIG92ZXIgaGlzdG9yeSB0cmFjZS4KKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdOworCisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWCA9IHggLSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54OworICAgICAgICAgICAgaW50NjRfdCBkZWx0YVkgPSB5IC0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbZW5kXS5wb2ludGVyc1tpZF0ueTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGRpc3RhbmNlID0gdWludDY0X3QoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTsKKworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtIERpc3RhbmNlIGZyb20gbGFzdCBzYW1wbGU6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgICBpZCwgZGlzdGFuY2UpOworI2VuZGlmCisKKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IEFWRVJBR0lOR19ESVNUQU5DRV9MSU1JVCkgeworICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBlbmQgaW5kZXggaW4gcHJlcGFyYXRpb24gZm9yIHJlY29yZGluZyBuZXcgaGlzdG9yaWNhbCBkYXRhLgorICAgICAgICAgICAgICAgIGVuZCArPSAxOworICAgICAgICAgICAgICAgIGlmIChlbmQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIGVuZCA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVuZCBpbmRleCBoYXMgbG9vcGVkIGJhY2sgdG8gdGhlIHN0YXJ0IGluZGV4IHRoZW4gd2UgaGF2ZSBmaWxsZWQKKyAgICAgICAgICAgICAgICAvLyB0aGUgaGlzdG9yaWNhbCB0cmFjZSB1cCB0byB0aGUgZGVzaXJlZCBzaXplIHNvIHdlIGRyb3AgdGhlIGhpc3RvcmljYWwKKyAgICAgICAgICAgICAgICAvLyBkYXRhIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhY2UuCisgICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICBzdGFydCArPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJhdyBkYXRhIHRvIHRoZSBoaXN0b3JpY2FsIHRyYWNlLgorICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlTdGFydFtpZF0gPSBzdGFydDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2lkXSA9IGVuZDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54ID0geDsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS55ID0geTsKKyAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOworCisgICAgICAgICAgICAgICAgLy8gQXZlcmFnZSBvdmVyIGFsbCBoaXN0b3JpY2FsIHBvc2l0aW9ucyBpbiB0aGUgdHJhY2UgYnkgdG90YWwgcHJlc3N1cmUuCisgICAgICAgICAgICAgICAgaW50MzJfdCBhdmVyYWdlZFggPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgYXZlcmFnZWRZID0gMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRvdGFsUHJlc3N1cmUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueDsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWSA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsUHJlc3N1cmUgPSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtzdGFydF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9pbnRlcnNbaWRdLnByZXNzdXJlOworCisgICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCArPSBoaXN0b3JpY2FsWCAqIGhpc3RvcmljYWxQcmVzc3VyZTsKKyAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRZICs9IGhpc3RvcmljYWxZICogaGlzdG9yaWNhbFByZXNzdXJlOworICAgICAgICAgICAgICAgICAgICB0b3RhbFByZXNzdXJlICs9IGhpc3RvcmljYWxQcmVzc3VyZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IEFWRVJBR0lOR19ISVNUT1JZX1NJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCAvPSB0b3RhbFByZXNzdXJlOworICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWSAvPSB0b3RhbFByZXNzdXJlOworCisjaWYgREVCVUdfSEFDS1MKKyAgICAgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbFByZXNzdXJlPSVkLCBhdmVyYWdlZFg9JWQsIGF2ZXJhZ2VkWT0lZCIsIGlkLCB0b3RhbFByZXNzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRYLCBhdmVyYWdlZFkpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54ID0gYXZlcmFnZWRYOworICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLnkgPSBhdmVyYWdlZFk7CisgICAgICAgICAgICB9IGVsc2UgeworI2lmIERFQlVHX0hBQ0tTCisgICAgICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBFeGNlZWRlZCBtYXggZGlzdGFuY2UiLCBpZCk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNpZiBERUJVR19IQUNLUworICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBQb2ludGVyIHdlbnQgdXAiLCBpZCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlc2V0IHBvaW50ZXIgaGlzdG9yeS4KKyAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXSA9IDA7CisgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdID0gMDsKKyAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbMF0ucG9pbnRlcnNbaWRdLnggPSB4OworICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVswXS5wb2ludGVyc1tpZF0ueSA9IHk7CisgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhWzBdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOworICAgIH0KK30KKworYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6aXNQb2ludEluc2lkZURpc3BsYXkoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKKyAgICBpZiAoISBwYXJhbWV0ZXJzLnhBeGlzLnZhbGlkIHx8ICEgcGFyYW1ldGVycy55QXhpcy52YWxpZCkgeworICAgICAgICAvLyBBc3N1bWUgYWxsIHBvaW50cyBvbiBhIHRvdWNoIHNjcmVlbiB3aXRob3V0IHZhbGlkIGF4aXMgcGFyYW1ldGVycyBhcmUKKyAgICAgICAgLy8gaW5zaWRlIHRoZSBkaXNwbGF5LgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4geCA+PSBwYXJhbWV0ZXJzLnhBeGlzLm1pblZhbHVlCisgICAgICAgICYmIHggPD0gcGFyYW1ldGVycy54QXhpcy5tYXhWYWx1ZQorICAgICAgICAmJiB5ID49IHBhcmFtZXRlcnMueUF4aXMubWluVmFsdWUKKyAgICAgICAgJiYgeSA8PSBwYXJhbWV0ZXJzLnlBeGlzLm1heFZhbHVlOworfQorCitjb25zdCBJbnB1dERldmljZTo6VmlydHVhbEtleSogSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmZpbmRWaXJ0dWFsS2V5SGl0KCkgY29uc3QgeworICAgIGludDMyX3QgeCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS54OworICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS55OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmlydHVhbEtleXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgSW5wdXREZXZpY2U6OlZpcnR1YWxLZXkmIHZpcnR1YWxLZXkgPSB2aXJ0dWFsS2V5c1tpXTsKKworI2lmIERFQlVHX1ZJUlRVQUxfS0VZUworICAgICAgICBMT0dEKCJWaXJ0dWFsS2V5czogSGl0IHRlc3QgKCVkLCAlZCk6IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkLCAiCisgICAgICAgICAgICAgICAgImxlZnQ9JWQsIHRvcD0lZCwgcmlnaHQ9JWQsIGJvdHRvbT0lZCIsCisgICAgICAgICAgICAgICAgeCwgeSwKKyAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmtleUNvZGUsIHZpcnR1YWxLZXkuc2NhbkNvZGUsCisgICAgICAgICAgICAgICAgdmlydHVhbEtleS5oaXRMZWZ0LCB2aXJ0dWFsS2V5LmhpdFRvcCwKKyAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmhpdFJpZ2h0LCB2aXJ0dWFsS2V5LmhpdEJvdHRvbSk7CisjZW5kaWYKKworICAgICAgICBpZiAodmlydHVhbEtleS5pc0hpdCh4LCB5KSkgeworICAgICAgICAgICAgcmV0dXJuICYgdmlydHVhbEtleTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCisKKy8vIC0tLSBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7CisgICAgYWNjdW11bGF0b3IuY2xlYXIoKTsKKyAgICBjdXJyZW50LmRvd24gPSBmYWxzZTsKKyAgICBjdXJyZW50LnggPSAwOworICAgIGN1cnJlbnQueSA9IDA7CisgICAgY3VycmVudC5wcmVzc3VyZSA9IDA7CisgICAgY3VycmVudC5zaXplID0gMDsKK30KKworCisvLyAtLS0gSW5wdXREZXZpY2U6Ok11bHRpVG91Y2hTY3JlZW5TdGF0ZSAtLS0KKwordm9pZCBJbnB1dERldmljZTo6TXVsdGlUb3VjaFNjcmVlblN0YXRlOjpyZXNldCgpIHsKKyAgICBhY2N1bXVsYXRvci5jbGVhcigpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAgYi9saWJzL3VpL0lucHV0RGlzcGF0Y2hlci5jcHAKaW5kZXggZjgwOWNiYS4uYzRmZmNlMSAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dERpc3BhdGNoZXIuY3BwCisrKyBiL2xpYnMvdWkvSW5wdXREaXNwYXRjaGVyLmNwcApAQCAtNDAsMTAgKzQwLDEwIEBACiAKIC8vIFRPRE8sIHRoaXMgbmVlZHMgdG8gYmUgc29tZXdoZXJlIGVsc2UsIHBlcmhhcHMgaW4gdGhlIHBvbGljeQogc3RhdGljIGlubGluZSBib29sIGlzTW92ZW1lbnRLZXkoaW50MzJfdCBrZXlDb2RlKSB7Ci0gICAgcmV0dXJuIGtleUNvZGUgPT0gS0VZQ09ERV9EUEFEX1VQCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9ET1dOCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9MRUZUCi0gICAgICAgICAgICB8fCBrZXlDb2RlID09IEtFWUNPREVfRFBBRF9SSUdIVDsKKyAgICByZXR1cm4ga2V5Q29kZSA9PSBBS0VZQ09ERV9EUEFEX1VQCisgICAgICAgICAgICB8fCBrZXlDb2RlID09IEFLRVlDT0RFX0RQQURfRE9XTgorICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBBS0VZQ09ERV9EUEFEX0xFRlQKKyAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gQUtFWUNPREVfRFBBRF9SSUdIVDsKIH0KIAogc3RhdGljIGlubGluZSBuc2Vjc190IG5vdygpIHsKZGlmZiAtLWdpdCBhL2xpYnMvdWkvSW5wdXRSZWFkZXIuY3BwIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKaW5kZXggZmNlZDE1Yy4uMGEyMWRiNyAxMDA2NDQKLS0tIGEvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKKysrIGIvbGlicy91aS9JbnB1dFJlYWRlci5jcHAKQEAgLTMzLDE4ICszMyw2IEBACiAvKiogQW1vdW50IHRoYXQgdHJhY2tiYWxsIG5lZWRzIHRvIG1vdmUgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgYSBrZXkgZXZlbnQuICovCiAjZGVmaW5lIFRSQUNLQkFMTF9NT1ZFTUVOVF9USFJFU0hPTEQgNgogCi0vKiBTbG9wIGRpc3RhbmNlIGZvciBqdW1weSBwb2ludGVyIGRldGVjdGlvbi4KLSAqIFRoZSB2ZXJ0aWNhbCByYW5nZSBvZiB0aGUgc2NyZWVuIGRpdmlkZWQgYnkgdGhpcyBpcyBvdXIgZXBzaWxvbiB2YWx1ZS4gKi8KLSNkZWZpbmUgSlVNUFlfRVBTSUxPTl9ESVZJU09SIDIxMgotCi0vKiBOdW1iZXIgb2YganVtcHkgcG9pbnRzIHRvIGRyb3AgZm9yIHRvdWNoc2NyZWVucyB0aGF0IG5lZWQgaXQuICovCi0jZGVmaW5lIEpVTVBZX1RSQU5TSVRJT05fRFJPUFMgMwotI2RlZmluZSBKVU1QWV9EUk9QX0xJTUlUIDMKLQotLyogTWF4aW11bSBzcXVhcmVkIGRpc3RhbmNlIGZvciBhdmVyYWdpbmcuCi0gKiBJZiBtb3ZpbmcgZmFydGhlciB0aGFuIHRoaXMsIHR1cm4gb2YgYXZlcmFnaW5nIHRvIGF2b2lkIGxhZyBpbiByZXNwb25zZS4gKi8KLSNkZWZpbmUgQVZFUkFHSU5HX0RJU1RBTkNFX0xJTUlUICg3NSAqIDc1KQotCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzEsMTkgKzU5LDE5IEBACiBpbnQzMl90IHVwZGF0ZU1ldGFTdGF0ZShpbnQzMl90IGtleUNvZGUsIGJvb2wgZG93biwgaW50MzJfdCBvbGRNZXRhU3RhdGUpIHsKICAgICBpbnQzMl90IG1hc2s7CiAgICAgc3dpdGNoIChrZXlDb2RlKSB7Ci0gICAgY2FzZSBLRVlDT0RFX0FMVF9MRUZUOgorICAgIGNhc2UgQUtFWUNPREVfQUxUX0xFRlQ6CiAgICAgICAgIG1hc2sgPSBNRVRBX0FMVF9MRUZUX09OOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIEtFWUNPREVfQUxUX1JJR0hUOgorICAgIGNhc2UgQUtFWUNPREVfQUxUX1JJR0hUOgogICAgICAgICBtYXNrID0gTUVUQV9BTFRfUklHSFRfT047CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgS0VZQ09ERV9TSElGVF9MRUZUOgorICAgIGNhc2UgQUtFWUNPREVfU0hJRlRfTEVGVDoKICAgICAgICAgbWFzayA9IE1FVEFfU0hJRlRfTEVGVF9PTjsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBLRVlDT0RFX1NISUZUX1JJR0hUOgorICAgIGNhc2UgQUtFWUNPREVfU0hJRlRfUklHSFQ6CiAgICAgICAgIG1hc2sgPSBNRVRBX1NISUZUX1JJR0hUX09OOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIEtFWUNPREVfU1lNOgorICAgIGNhc2UgQUtFWUNPREVfU1lNOgogICAgICAgICBtYXNrID0gTUVUQV9TWU1fT047CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0xMDcsMTAgKzk1LDEwIEBACiBzdGF0aWMgY29uc3QgaW50MzJfdCBrZXlDb2RlUm90YXRpb25NYXBbXVs0XSA9IHsKICAgICAgICAgLy8ga2V5IGNvZGVzIGVudW1lcmF0ZWQgY291bnRlci1jbG9ja3dpc2Ugd2l0aCB0aGUgb3JpZ2luYWwgKHVucm90YXRlZCkga2V5IGZpcnN0CiAgICAgICAgIC8vIG5vIHJvdGF0aW9uLCAgICAgICAgOTAgZGVncmVlIHJvdGF0aW9uLCAgMTgwIGRlZ3JlZSByb3RhdGlvbiwgMjcwIGRlZ3JlZSByb3RhdGlvbgotICAgICAgICB7IEtFWUNPREVfRFBBRF9ET1dOLCAgIEtFWUNPREVfRFBBRF9SSUdIVCwgIEtFWUNPREVfRFBBRF9VUCwgICAgIEtFWUNPREVfRFBBRF9MRUZUIH0sCi0gICAgICAgIHsgS0VZQ09ERV9EUEFEX1JJR0hULCAgS0VZQ09ERV9EUEFEX1VQLCAgICAgS0VZQ09ERV9EUEFEX0xFRlQsICAgS0VZQ09ERV9EUEFEX0RPV04gfSwKLSAgICAgICAgeyBLRVlDT0RFX0RQQURfVVAsICAgICBLRVlDT0RFX0RQQURfTEVGVCwgICBLRVlDT0RFX0RQQURfRE9XTiwgICBLRVlDT0RFX0RQQURfUklHSFQgfSwKLSAgICAgICAgeyBLRVlDT0RFX0RQQURfTEVGVCwgICBLRVlDT0RFX0RQQURfRE9XTiwgICBLRVlDT0RFX0RQQURfUklHSFQsICBLRVlDT0RFX0RQQURfVVAgfSwKKyAgICAgICAgeyBBS0VZQ09ERV9EUEFEX0RPV04sICAgQUtFWUNPREVfRFBBRF9SSUdIVCwgIEFLRVlDT0RFX0RQQURfVVAsICAgICBBS0VZQ09ERV9EUEFEX0xFRlQgfSwKKyAgICAgICAgeyBBS0VZQ09ERV9EUEFEX1JJR0hULCAgQUtFWUNPREVfRFBBRF9VUCwgICAgIEFLRVlDT0RFX0RQQURfTEVGVCwgICBBS0VZQ09ERV9EUEFEX0RPV04gfSwKKyAgICAgICAgeyBBS0VZQ09ERV9EUEFEX1VQLCAgICAgQUtFWUNPREVfRFBBRF9MRUZULCAgIEFLRVlDT0RFX0RQQURfRE9XTiwgICBBS0VZQ09ERV9EUEFEX1JJR0hUIH0sCisgICAgICAgIHsgQUtFWUNPREVfRFBBRF9MRUZULCAgIEFLRVlDT0RFX0RQQURfRE9XTiwgICBBS0VZQ09ERV9EUEFEX1JJR0hULCAgQUtFWUNPREVfRFBBRF9VUCB9LAogfTsKIHN0YXRpYyBjb25zdCBpbnQga2V5Q29kZVJvdGF0aW9uTWFwU2l6ZSA9CiAgICAgICAgIHNpemVvZihrZXlDb2RlUm90YXRpb25NYXApIC8gc2l6ZW9mKGtleUNvZGVSb3RhdGlvbk1hcFswXSk7CkBAIC0xMjcsNjY4ICsxMTUsNiBAQAogfQogCiAKLS8vIC0tLSBJbnB1dERldmljZSAtLS0KLQotSW5wdXREZXZpY2U6OklucHV0RGV2aWNlKGludDMyX3QgaWQsIHVpbnQzMl90IGNsYXNzZXMsIFN0cmluZzggbmFtZSkgOgotICAgIGlkKGlkKSwgY2xhc3NlcyhjbGFzc2VzKSwgbmFtZShuYW1lKSwgaWdub3JlZChmYWxzZSkgewotfQotCi12b2lkIElucHV0RGV2aWNlOjpyZXNldCgpIHsKLSAgICBpZiAoaXNLZXlib2FyZCgpKSB7Ci0gICAgICAgIGtleWJvYXJkLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzVHJhY2tiYWxsKCkpIHsKLSAgICAgICAgdHJhY2tiYWxsLnJlc2V0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzTXVsdGlUb3VjaFNjcmVlbigpKSB7Ci0gICAgICAgIG11bHRpVG91Y2hTY3JlZW4ucmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKGlzU2luZ2xlVG91Y2hTY3JlZW4oKSkgewotICAgICAgICBzaW5nbGVUb3VjaFNjcmVlbi5yZXNldCgpOwotICAgIH0KLQotICAgIGlmIChpc1RvdWNoU2NyZWVuKCkpIHsKLSAgICAgICAgdG91Y2hTY3JlZW4ucmVzZXQoKTsKLSAgICB9Ci19Ci0KLQotLy8gLS0tIElucHV0RGV2aWNlOjpUb3VjaERhdGEgLS0tCi0KLXZvaWQgSW5wdXREZXZpY2U6OlRvdWNoRGF0YTo6Y29weUZyb20oY29uc3QgVG91Y2hEYXRhJiBvdGhlcikgewotICAgIHBvaW50ZXJDb3VudCA9IG90aGVyLnBvaW50ZXJDb3VudDsKLSAgICBpZEJpdHMgPSBvdGhlci5pZEJpdHM7Ci0KLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcG9pbnRlckNvdW50OyBpKyspIHsKLSAgICAgICAgcG9pbnRlcnNbaV0gPSBvdGhlci5wb2ludGVyc1tpXTsKLSAgICAgICAgaWRUb0luZGV4W2ldID0gb3RoZXIuaWRUb0luZGV4W2ldOwotICAgIH0KLX0KLQotCi0vLyAtLS0gSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGUgLS0tCi0KLXZvaWQgSW5wdXREZXZpY2U6OktleWJvYXJkU3RhdGU6OnJlc2V0KCkgewotICAgIGN1cnJlbnQubWV0YVN0YXRlID0gTUVUQV9OT05FOwotICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOwotfQotCi0KLS8vIC0tLSBJbnB1dERldmljZTo6VHJhY2tiYWxsU3RhdGUgLS0tCi0KLXZvaWQgSW5wdXREZXZpY2U6OlRyYWNrYmFsbFN0YXRlOjpyZXNldCgpIHsKLSAgICBhY2N1bXVsYXRvci5jbGVhcigpOwotICAgIGN1cnJlbnQuZG93biA9IGZhbHNlOwotICAgIGN1cnJlbnQuZG93blRpbWUgPSAwOwotfQotCi0KLS8vIC0tLSBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7Ci0gICAgbGFzdFRvdWNoLmNsZWFyKCk7Ci0gICAgZG93blRpbWUgPSAwOwotICAgIGN1cnJlbnRWaXJ0dWFsS2V5LnN0YXR1cyA9IEN1cnJlbnRWaXJ0dWFsS2V5U3RhdGU6OlNUQVRVU19VUDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfUE9JTlRFUlM7IGkrKykgewotICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5U3RhcnRbaV0gPSAwOwotICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2ldID0gMDsKLSAgICB9Ci0KLSAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7Ci19Ci0KLXN0cnVjdCBQb2ludGVyRGlzdGFuY2VIZWFwRWxlbWVudCB7Ci0gICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA6IDg7Ci0gICAgdWludDMyX3QgbGFzdFBvaW50ZXJJbmRleCA6IDg7Ci0gICAgdWludDY0X3QgZGlzdGFuY2UgOiA0ODsgLy8gc3F1YXJlZCBkaXN0YW5jZQotfTsKLQotdm9pZCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6Y2FsY3VsYXRlUG9pbnRlcklkcygpIHsKLSAgICB1aW50MzJfdCBjdXJyZW50UG9pbnRlckNvdW50ID0gY3VycmVudFRvdWNoLnBvaW50ZXJDb3VudDsKLSAgICB1aW50MzJfdCBsYXN0UG9pbnRlckNvdW50ID0gbGFzdFRvdWNoLnBvaW50ZXJDb3VudDsKLQotICAgIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDApIHsKLSAgICAgICAgLy8gTm8gcG9pbnRlcnMgdG8gYXNzaWduLgotICAgICAgICBjdXJyZW50VG91Y2guaWRCaXRzLmNsZWFyKCk7Ci0gICAgfSBlbHNlIGlmIChsYXN0UG9pbnRlckNvdW50ID09IDApIHsKLSAgICAgICAgLy8gQWxsIHBvaW50ZXJzIGFyZSBuZXcuCi0gICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGN1cnJlbnRQb2ludGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLmlkID0gaTsKLSAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaV0gPSBpOwotICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy5tYXJrQml0KGkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChjdXJyZW50UG9pbnRlckNvdW50ID09IDEgJiYgbGFzdFBvaW50ZXJDb3VudCA9PSAxKSB7Ci0gICAgICAgIC8vIE9ubHkgb25lIHBvaW50ZXIgYW5kIG5vIGNoYW5nZSBpbiBjb3VudCBzbyBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgaWQgYXMgYmVmb3JlLgotICAgICAgICB1aW50MzJfdCBpZCA9IGxhc3RUb3VjaC5wb2ludGVyc1swXS5pZDsKLSAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzBdLmlkID0gaWQ7Ci0gICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gMDsKLSAgICAgICAgY3VycmVudFRvdWNoLmlkQml0cy52YWx1ZSA9IEJpdFNldDMyOjp2YWx1ZUZvckJpdChpZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gR2VuZXJhbCBjYXNlLgotICAgICAgICAvLyBXZSBidWlsZCBhIGhlYXAgb2Ygc3F1YXJlZCBldWNsaWRlYW4gZGlzdGFuY2VzIGJldHdlZW4gY3VycmVudCBhbmQgbGFzdCBwb2ludGVycwotICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYW5kIGxhc3QgcG9pbnRlciBpbmRpY2VzLiAgVGhlbiwgd2UgZmluZCB0aGUgYmVzdAotICAgICAgICAvLyBtYXRjaCAoYnkgZGlzdGFuY2UpIGZvciBlYWNoIGN1cnJlbnQgcG9pbnRlci4KLSAgICAgICAgUG9pbnRlckRpc3RhbmNlSGVhcEVsZW1lbnQgaGVhcFtNQVhfUE9JTlRFUlMgKiBNQVhfUE9JTlRFUlNdOwotCi0gICAgICAgIHVpbnQzMl90IGhlYXBTaXplID0gMDsKLSAgICAgICAgZm9yICh1aW50MzJfdCBjdXJyZW50UG9pbnRlckluZGV4ID0gMDsgY3VycmVudFBvaW50ZXJJbmRleCA8IGN1cnJlbnRQb2ludGVyQ291bnQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudFBvaW50ZXJJbmRleCsrKSB7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSAwOyBsYXN0UG9pbnRlckluZGV4IDwgbGFzdFBvaW50ZXJDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFBvaW50ZXJJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBkZWx0YVggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudFBvaW50ZXJJbmRleF0ueAotICAgICAgICAgICAgICAgICAgICAgICAgLSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0ueDsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbHRhWSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS55Ci0gICAgICAgICAgICAgICAgICAgICAgICAtIGxhc3RUb3VjaC5wb2ludGVyc1tsYXN0UG9pbnRlckluZGV4XS55OwotCi0gICAgICAgICAgICAgICAgdWludDY0X3QgZGlzdGFuY2UgPSB1aW50NjRfdChkZWx0YVggKiBkZWx0YVggKyBkZWx0YVkgKiBkZWx0YVkpOwotCi0gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IG5ldyBlbGVtZW50IGludG8gdGhlIGhlYXAgKHNpZnQgdXApLgotICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmN1cnJlbnRQb2ludGVySW5kZXggPSBjdXJyZW50UG9pbnRlckluZGV4OwotICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmxhc3RQb2ludGVySW5kZXggPSBsYXN0UG9pbnRlckluZGV4OwotICAgICAgICAgICAgICAgIGhlYXBbaGVhcFNpemVdLmRpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICAgICAgaGVhcFNpemUgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhlYXBpZnkKLSAgICAgICAgZm9yICh1aW50MzJfdCBzdGFydEluZGV4ID0gaGVhcFNpemUgLyAyOyBzdGFydEluZGV4ICE9IDA7ICkgewotICAgICAgICAgICAgc3RhcnRJbmRleCAtPSAxOwotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBwYXJlbnRJbmRleCA9IHN0YXJ0SW5kZXg7IDspIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCA+PSBoZWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoY2hpbGRJbmRleCArIDEgPCBoZWFwU2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGVhcFtjaGlsZEluZGV4ICsgMV0uZGlzdGFuY2UgPCBoZWFwW2NoaWxkSW5kZXhdLmRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaGVhcFtwYXJlbnRJbmRleF0uZGlzdGFuY2UgPD0gaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2FwKGhlYXBbcGFyZW50SW5kZXhdLCBoZWFwW2NoaWxkSW5kZXhdKTsKLSAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAotICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gaW5pdGlhbCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAotICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIC8vIFB1bGwgbWF0Y2hlcyBvdXQgYnkgaW5jcmVhc2luZyBvcmRlciBvZiBkaXN0YW5jZS4KLSAgICAgICAgLy8gVG8gYXZvaWQgcmVhc3NpZ25pbmcgcG9pbnRlcnMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBtYXRjaGVkLCB0aGUgbG9vcCBrZWVwcyB0cmFjawotICAgICAgICAvLyBvZiB3aGljaCBsYXN0IGFuZCBjdXJyZW50IHBvaW50ZXJzIGhhdmUgYmVlbiBtYXRjaGVkIHVzaW5nIHRoZSBtYXRjaGVkWFhYQml0cyB2YXJpYWJsZXMuCi0gICAgICAgIC8vIEl0IGFsc28gdHJhY2tzIHRoZSB1c2VkIHBvaW50ZXIgaWQgYml0cy4KLSAgICAgICAgQml0U2V0MzIgbWF0Y2hlZExhc3RCaXRzKDApOwotICAgICAgICBCaXRTZXQzMiBtYXRjaGVkQ3VycmVudEJpdHMoMCk7Ci0gICAgICAgIEJpdFNldDMyIHVzZWRJZEJpdHMoMCk7Ci0gICAgICAgIGJvb2wgZmlyc3QgPSB0cnVlOwotICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSBtaW4oY3VycmVudFBvaW50ZXJDb3VudCwgbGFzdFBvaW50ZXJDb3VudCk7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcCwgd2UganVzdCBjb25zdW1lIHRoZSByb290IGVsZW1lbnQgb2YKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGhlYXAgKHRoZSBvbmUgd2l0aCBzbWFsbGVzdCBkaXN0YW5jZSkuCi0gICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgaXRlcmF0aW9ucyBjb25zdW1lZCB0aGUgcm9vdCBlbGVtZW50IG9mIHRoZSBoZWFwLgotICAgICAgICAgICAgICAgICAgICAvLyBQb3Agcm9vdCBlbGVtZW50IG9mZiBvZiB0aGUgaGVhcCAoc2lmdCBkb3duKS4KLSAgICAgICAgICAgICAgICAgICAgaGVhcFNpemUgLT0gMTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KGhlYXBTaXplID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2lmdCBkb3duLgotICAgICAgICAgICAgICAgICAgICBoZWFwWzBdID0gaGVhcFtoZWFwU2l6ZV07Ci0gICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgcGFyZW50SW5kZXggPSAwOyA7KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGlsZEluZGV4ID0gcGFyZW50SW5kZXggKiAyICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ID49IGhlYXBTaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluZGV4ICsgMSA8IGhlYXBTaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhlYXBbY2hpbGRJbmRleCArIDFdLmRpc3RhbmNlIDwgaGVhcFtjaGlsZEluZGV4XS5kaXN0YW5jZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkSW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYXBbcGFyZW50SW5kZXhdLmRpc3RhbmNlIDw9IGhlYXBbY2hpbGRJbmRleF0uZGlzdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgc3dhcChoZWFwW3BhcmVudEluZGV4XSwgaGVhcFtjaGlsZEluZGV4XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IGNoaWxkSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotI2lmIERFQlVHX1BPSU5URVJfQVNTSUdOTUVOVAotICAgICAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gcmVkdWNlZCBkaXN0YW5jZSBtaW4taGVhcDogc2l6ZT0lZCIsIGhlYXBTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWFwU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMT0dEKCIgIGhlYXBbJWRdOiBjdXI9JWQsIGxhc3Q9JWQsIGRpc3RhbmNlPSVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBoZWFwW2ldLmN1cnJlbnRQb2ludGVySW5kZXgsIGhlYXBbaV0ubGFzdFBvaW50ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFtpXS5kaXN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cnJlbnRQb2ludGVySW5kZXggPSBoZWFwWzBdLmN1cnJlbnRQb2ludGVySW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRDdXJyZW50Qml0cy5oYXNCaXQoY3VycmVudFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3RQb2ludGVySW5kZXggPSBoZWFwWzBdLmxhc3RQb2ludGVySW5kZXg7Ci0gICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRMYXN0Qml0cy5oYXNCaXQobGFzdFBvaW50ZXJJbmRleCkpIGNvbnRpbnVlOyAvLyBhbHJlYWR5IG1hdGNoZWQKLQotICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOwotICAgICAgICAgICAgICAgIG1hdGNoZWRMYXN0Qml0cy5tYXJrQml0KGxhc3RQb2ludGVySW5kZXgpOwotCi0gICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSBsYXN0VG91Y2gucG9pbnRlcnNbbGFzdFBvaW50ZXJJbmRleF0uaWQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRQb2ludGVySW5kZXhdLmlkID0gaWQ7Ci0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLmlkVG9JbmRleFtpZF0gPSBjdXJyZW50UG9pbnRlckluZGV4OwotICAgICAgICAgICAgICAgIHVzZWRJZEJpdHMubWFya0JpdChpZCk7Ci0KLSNpZiBERUJVR19QT0lOVEVSX0FTU0lHTk1FTlQKLSAgICAgICAgICAgICAgICBMT0dEKCJjYWxjdWxhdGVQb2ludGVySWRzIC0gbWF0Y2hlZDogY3VyPSVkLCBsYXN0PSVkLCBpZD0lZCwgZGlzdGFuY2U9JWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0UG9pbnRlckluZGV4LCBjdXJyZW50UG9pbnRlckluZGV4LCBpZCwgaGVhcFswXS5kaXN0YW5jZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc2lnbiBmcmVzaCBpZHMgdG8gbmV3IHBvaW50ZXJzLgotICAgICAgICBpZiAoY3VycmVudFBvaW50ZXJDb3VudCA+IGxhc3RQb2ludGVyQ291bnQpIHsKLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IGN1cnJlbnRQb2ludGVyQ291bnQgLSBsYXN0UG9pbnRlckNvdW50OyA7KSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgY3VycmVudFBvaW50ZXJJbmRleCA9IG1hdGNoZWRDdXJyZW50Qml0cy5maXJzdFVubWFya2VkQml0KCk7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaWQgPSB1c2VkSWRCaXRzLmZpcnN0VW5tYXJrZWRCaXQoKTsKLQotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50UG9pbnRlckluZGV4XS5pZCA9IGlkOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5pZFRvSW5kZXhbaWRdID0gY3VycmVudFBvaW50ZXJJbmRleDsKLSAgICAgICAgICAgICAgICB1c2VkSWRCaXRzLm1hcmtCaXQoaWQpOwotCi0jaWYgREVCVUdfUE9JTlRFUl9BU1NJR05NRU5UCi0gICAgICAgICAgICAgICAgTE9HRCgiY2FsY3VsYXRlUG9pbnRlcklkcyAtIGFzc2lnbmVkOiBjdXI9JWQsIGlkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb2ludGVySW5kZXgsIGlkKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKC0taSA9PSAwKSBicmVhazsgLy8gZG9uZQotICAgICAgICAgICAgICAgIG1hdGNoZWRDdXJyZW50Qml0cy5tYXJrQml0KGN1cnJlbnRQb2ludGVySW5kZXgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRml4IGlkIGJpdHMuCi0gICAgICAgIGN1cnJlbnRUb3VjaC5pZEJpdHMgPSB1c2VkSWRCaXRzOwotICAgIH0KLX0KLQotLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGlmIG9uZSBvZiB0aGUKLSAqIHBvaW50cyBoYXMgbW92ZWQgbW9yZSB0aGFuIGEgc2NyZWVuIGhlaWdodCBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLAotICogdGhlbiBkcm9wIGl0LiAqLwotYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6YXBwbHlCYWRUb3VjaEZpbHRlcigpIHsKLSAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgotICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7Ci0KLSAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHRoZXJlIGFyZSBubyBwb2ludHMuCi0gICAgaWYgKHBvaW50ZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhIGZpbmdlciBpcyBnb2luZyBkb3duIG9yIHVwLiAgV2UgcnVuCi0gICAgLy8gaGVyZSBiZWZvcmUgYXNzaWduaW5nIHBvaW50ZXIgSURzLCBzbyB0aGVyZSBpc24ndCBhIGdvb2QKLSAgICAvLyB3YXkgdG8gZG8gcGVyLWZpbmdlciBtYXRjaGluZy4KLSAgICBpZiAocG9pbnRlckNvdW50ICE9IGxhc3RUb3VjaC5wb2ludGVyQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFdlIGNvbnNpZGVyIGEgc2luZ2xlIG1vdmVtZW50IGFjcm9zcyBtb3JlIHRoYW4gYSA3LzE2IG9mCi0gICAgLy8gdGhlIGxvbmcgc2l6ZSBvZiB0aGUgc2NyZWVuIHRvIGJlIGJhZC4gIFRoaXMgd2FzIGEgbWFnaWMgdmFsdWUKLSAgICAvLyBkZXRlcm1pbmVkIGJ5IGxvb2tpbmcgYXQgdGhlIG1heGltdW0gZGlzdGFuY2UgaXQgaXMgZmVhc2libGUKLSAgICAvLyB0byBhY3R1YWxseSBtb3ZlIGluIG9uZSBzYW1wbGUuCi0gICAgaW50MzJfdCBtYXhEZWx0YVkgPSBwYXJhbWV0ZXJzLnlBeGlzLnJhbmdlICogNyAvIDE2OwotCi0gICAgLy8gWFhYIFRoZSBvcmlnaW5hbCBjb2RlIGluIElucHV0RGV2aWNlLmphdmEgaW5jbHVkZWQgY29tbWVudGVkIG91dAotICAgIC8vICAgICBjb2RlIGZvciB0ZXN0aW5nIHRoZSBYIGF4aXMuICBOb3RlIHRoYXQgd2hlbiB3ZSBkcm9wIGEgcG9pbnQKLSAgICAvLyAgICAgd2UgZG9uJ3QgYWN0dWFsbHkgcmVzdG9yZSB0aGUgb2xkIFggZWl0aGVyLiAgU3RyYW5nZS4KLSAgICAvLyAgICAgVGhlIG9sZCBjb2RlIGFsc28gdHJpZXMgdG8gdHJhY2sgd2hlbiBiYWQgcG9pbnRzIHdlcmUgcHJldmlvdXNseQotICAgIC8vICAgICBkZXRlY3RlZCBidXQgaXQgdHVybnMgb3V0IHRoYXQgZHVlIHRvIHRoZSBwbGFjZW1lbnQgb2YgYSAiYnJlYWsiCi0gICAgLy8gICAgIGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIHdlIG5ldmVyIHNldCBtRHJvcHBlZEJhZFBvaW50IHRvIHRydWUKLSAgICAvLyAgICAgc28gaXQgaXMgZWZmZWN0aXZlbHkgZGVhZCBjb2RlLgotICAgIC8vIE5lZWQgdG8gZmlndXJlIG91dCBpZiB0aGUgb2xkIGNvZGUgaXMgYnVzdGVkIG9yIGp1c3Qgb3ZlcmNvbXBsaWNhdGVkCi0gICAgLy8gYnV0IHdvcmtpbmcgYXMgaW50ZW5kZWQuCi0KLSAgICAvLyBMb29rIHRocm91Z2ggYWxsIG5ldyBwb2ludHMgYW5kIHNlZSBpZiBhbnkgYXJlIGZhcnRoZXIgdGhhbgotICAgIC8vIGFjY2VwdGFibGUgZnJvbSBhbGwgcHJldmlvdXMgcG9pbnRzLgotICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7Ci0gICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OwotICAgICAgICBpbnQzMl90IGNsb3Nlc3RZID0gSU5UX01BWDsKLSAgICAgICAgaW50MzJfdCBjbG9zZXN0RGVsdGFZID0gMDsKLQotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgIExPR0QoIkJhZFRvdWNoRmlsdGVyOiBMb29raW5nIGF0IG5leHQgcG9pbnQgIyVkOiB5PSVkIiwgaSwgeSk7Ci0jZW5kaWYKLQotICAgICAgICBmb3IgKHVpbnQzMl90IGogPSBwb2ludGVyQ291bnQ7IGotLSA+IDA7ICkgewotICAgICAgICAgICAgaW50MzJfdCBsYXN0WSA9IGxhc3RUb3VjaC5wb2ludGVyc1tqXS55OwotICAgICAgICAgICAgaW50MzJfdCBkZWx0YVkgPSBhYnMoeSAtIGxhc3RZKTsKLQotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICBMT0dEKCJCYWRUb3VjaEZpbHRlcjogQ29tcGFyaW5nIHdpdGggbGFzdCBwb2ludCAjJWQ6IHk9JWQgZGVsdGFZPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgaiwgbGFzdFksIGRlbHRhWSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgaWYgKGRlbHRhWSA8IG1heERlbHRhWSkgewotICAgICAgICAgICAgICAgIGdvdG8gU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVsdGFZIDwgY2xvc2VzdERlbHRhWSkgewotICAgICAgICAgICAgICAgIGNsb3Nlc3REZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICAgICAgY2xvc2VzdFkgPSBsYXN0WTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIE11c3Qgbm90IGhhdmUgZm91bmQgYSBjbG9zZSBlbm91Z2ggbWF0Y2guCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgTE9HRCgiQmFkVG91Y2hGaWx0ZXI6IERyb3BwaW5nIGJhZCBwb2ludCAjJWQ6IG5ld1k9JWQgb2xkWT0lZCBkZWx0YVk9JWQgbWF4RGVsdGFZPSVkIiwKLSAgICAgICAgICAgICAgICBpLCB5LCBjbG9zZXN0WSwgY2xvc2VzdERlbHRhWSwgbWF4RGVsdGFZKTsKLSNlbmRpZgotCi0gICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55ID0gY2xvc2VzdFk7Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBYWFggb3JpZ2luYWwgY29kZSBvbmx5IGNvcnJlY3RzIG9uZSBwb2ludAotCi0gICAgU2tpcFN1ZmZpY2llbnRseUNsb3NlUG9pbnQ6IDsKLSAgICB9Ci0KLSAgICAvLyBObyBjaGFuZ2UuCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBTcGVjaWFsIGhhY2sgZm9yIGRldmljZXMgdGhhdCBoYXZlIGJhZCBzY3JlZW4gZGF0YTogZHJvcCBwb2ludHMgd2hlcmUKLSAqIHRoZSBjb29yZGluYXRlIHZhbHVlIGZvciBvbmUgYXhpcyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uCi0gKi8KLWJvb2wgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5SnVtcHlUb3VjaEZpbHRlcigpIHsKLSAgICAvLyBUaGlzIGhhY2sgcmVxdWlyZXMgdmFsaWQgYXhpcyBwYXJhbWV0ZXJzLgotICAgIGlmICghIHBhcmFtZXRlcnMueUF4aXMudmFsaWQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVpbnQzMl90IHBvaW50ZXJDb3VudCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyQ291bnQ7Ci0gICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgIT0gcG9pbnRlckNvdW50KSB7Ci0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgTE9HRCgiSnVtcHlUb3VjaEZpbHRlcjogRGlmZmVyZW50IHBvaW50ZXIgY291bnQgJWQgLT4gJWQiLAotICAgICAgICAgICAgICAgIGxhc3RUb3VjaC5wb2ludGVyQ291bnQsIHBvaW50ZXJDb3VudCk7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwb2ludGVyQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTE9HRCgiICBQb2ludGVyICVkICglZCwgJWQpIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLngsIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55KTsKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfVFJBTlNJVElPTl9EUk9QUykgewotICAgICAgICAgICAgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMSAmJiBwb2ludGVyQ291bnQgPT0gMikgewotICAgICAgICAgICAgICAgIC8vIEp1c3QgZHJvcCB0aGUgZmlyc3QgZmV3IGV2ZW50cyBnb2luZyBmcm9tIDEgdG8gMiBwb2ludGVycy4KLSAgICAgICAgICAgICAgICAvLyBUaGV5J3JlIGJhZCBvZnRlbiBlbm91Z2ggdGhhdCB0aGV5J3JlIG5vdCB3b3J0aCBjb25zaWRlcmluZy4KLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMTsKLSAgICAgICAgICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCArPSAxOwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyIDIgZHJvcHBlZCIpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RUb3VjaC5wb2ludGVyQ291bnQgPT0gMiAmJiBwb2ludGVyQ291bnQgPT0gMSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBldmVudCB3aGVuIHdlIGdvIGZyb20gMiAtPiAxIHRlbmRzIHRvIGJlIG1lc3NlZCB1cCB0b28KLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50ID0gMjsKLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbMF0gPSBsYXN0VG91Y2gucG9pbnRlcnNbMF07Ci0gICAgICAgICAgICAgICAgY3VycmVudFRvdWNoLnBvaW50ZXJzWzFdID0gbGFzdFRvdWNoLnBvaW50ZXJzWzFdOwotICAgICAgICAgICAgICAgIGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkICs9IDE7Ci0KLSNpZiBERUJVR19IQUNLUwotICAgICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBQb2ludGVyICVkIHJlcGxhY2VkICglZCwgJWQpIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueCwgY3VycmVudFRvdWNoLnBvaW50ZXJzW2ldLnkpOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc2V0IGp1bXB5IHBvaW50cyBkcm9wcGVkIG9uIG90aGVyIHRyYW5zaXRpb25zIG9yIGlmIGxpbWl0IGV4Y2VlZGVkLgotICAgICAgICBqdW1weVRvdWNoRmlsdGVyLmp1bXB5UG9pbnRzRHJvcHBlZCA9IDA7Ci0KLSNpZiBERUJVR19IQUNLUwotICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBUcmFuc2l0aW9uIC0gZHJvcCBsaW1pdCByZXNldCIpOwotI2VuZGlmCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBXZSBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludGVycyBhcyBsYXN0IHRpbWUuCi0gICAgLy8gQSAnanVtcHknIHBvaW50IGlzIG9uZSB3aGVyZSB0aGUgY29vcmRpbmF0ZSB2YWx1ZSBmb3Igb25lIGF4aXMKLSAgICAvLyBoYXMganVtcGVkIHRvIHRoZSBvdGhlciBwb2ludGVyJ3MgbG9jYXRpb24uIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAvLyBlbHNlIGlmIHdlIG9ubHkgaGF2ZSBvbmUgcG9pbnRlci4KLSAgICBpZiAocG9pbnRlckNvdW50IDwgMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGp1bXB5VG91Y2hGaWx0ZXIuanVtcHlQb2ludHNEcm9wcGVkIDwgSlVNUFlfRFJPUF9MSU1JVCkgewotICAgICAgICBpbnQganVtcHlFcHNpbG9uID0gcGFyYW1ldGVycy55QXhpcy5yYW5nZSAvIEpVTVBZX0VQU0lMT05fRElWSVNPUjsKLQotICAgICAgICAvLyBXZSBvbmx5IHJlcGxhY2UgdGhlIHNpbmdsZSB3b3JzdCBqdW1weSBwb2ludCBhcyBjaGFyYWN0ZXJpemVkIGJ5IHBvaW50ZXIgZGlzdGFuY2UKLSAgICAgICAgLy8gaW4gYSBzaW5nbGUgYXhpcy4KLSAgICAgICAgaW50MzJfdCBiYWRQb2ludGVySW5kZXggPSAtMTsKLSAgICAgICAgaW50MzJfdCBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IC0xOwotICAgICAgICBpbnQzMl90IGJhZFBvaW50ZXJEaXN0YW5jZSA9IElOVF9NSU47IC8vIGRpc3RhbmNlIHRvIGJlIGNvcnJlY3RlZAotCi0gICAgICAgIGZvciAodWludDMyX3QgaSA9IHBvaW50ZXJDb3VudDsgaS0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbaV0ueDsKLSAgICAgICAgICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tpXS55OwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgIExPR0QoIkp1bXB5VG91Y2hGaWx0ZXI6IFBvaW50ICVkICglZCwgJWQpIiwgaSwgeCwgeSk7Ci0jZW5kaWYKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYSB0b3VjaCBwb2ludCBpcyB0b28gY2xvc2UgdG8gYW5vdGhlcidzIGNvb3JkaW5hdGVzCi0gICAgICAgICAgICBib29sIGRyb3BYID0gZmFsc2UsIGRyb3BZID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgcG9pbnRlckNvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA9PSBqKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChhYnMoeCAtIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tqXS54KSA8PSBqdW1weUVwc2lsb24pIHsKLSAgICAgICAgICAgICAgICAgICAgZHJvcFggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoYWJzKHkgLSBjdXJyZW50VG91Y2gucG9pbnRlcnNbal0ueSkgPD0ganVtcHlFcHNpbG9uKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyb3BZID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEgZHJvcFggJiYgISBkcm9wWSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QganVtcHkKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRmluZCBhIHJlcGxhY2VtZW50IGNhbmRpZGF0ZSBieSBjb21wYXJpbmcgd2l0aCBvbGRlciBwb2ludHMgb24gdGhlCi0gICAgICAgICAgICAvLyBjb21wbGVtZW50YXJ5IChub24tanVtcHkpIGF4aXMuCi0gICAgICAgICAgICBpbnQzMl90IGRpc3RhbmNlID0gSU5UX01JTjsgLy8gZGlzdGFuY2UgdG8gYmUgY29ycmVjdGVkCi0gICAgICAgICAgICBpbnQzMl90IHJlcGxhY2VtZW50SW5kZXggPSAtMTsKLQotICAgICAgICAgICAgaWYgKGRyb3BYKSB7Ci0gICAgICAgICAgICAgICAgLy8gWCBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBZLgotICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVkgPSBJTlRfTUFYOwotICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWSA9IGFicyh5IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLnkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFZIDwgc21hbGxlc3REZWx0YVkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFZID0gZGVsdGFZOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeCAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS54KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gWSBsb29rcyB0b28gY2xvc2UuICBGaW5kIGFuIG9sZGVyIHJlcGxhY2VtZW50IHBvaW50IHdpdGggYSBjbG9zZSBYLgotICAgICAgICAgICAgICAgIGludDMyX3Qgc21hbGxlc3REZWx0YVggPSBJTlRfTUFYOwotICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBwb2ludGVyQ291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbHRhWCA9IGFicyh4IC0gbGFzdFRvdWNoLnBvaW50ZXJzW2pdLngpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFYIDwgc21hbGxlc3REZWx0YVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0RGVsdGFYID0gZGVsdGFYOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnRJbmRleCA9IGo7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBhYnMoeSAtIGxhc3RUb3VjaC5wb2ludGVyc1tyZXBsYWNlbWVudEluZGV4XS55KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSWYgcmVwbGFjaW5nIHRoaXMgcG9pbnRlciB3b3VsZCBjb3JyZWN0IGEgd29yc2UgZXJyb3IgdGhhbiB0aGUgcHJldmlvdXMgb25lcwotICAgICAgICAgICAgLy8gY29uc2lkZXJlZCwgdGhlbiB1c2UgdGhpcyByZXBsYWNlbWVudCBpbnN0ZWFkLgotICAgICAgICAgICAgaWYgKGRpc3RhbmNlID4gYmFkUG9pbnRlckRpc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgYmFkUG9pbnRlckluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBiYWRQb2ludGVyUmVwbGFjZW1lbnRJbmRleCA9IHJlcGxhY2VtZW50SW5kZXg7Ci0gICAgICAgICAgICAgICAgYmFkUG9pbnRlckRpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBDb3JyZWN0IHRoZSBqdW1weSBwb2ludGVyIGlmIG9uZSB3YXMgZm91bmQuCi0gICAgICAgIGlmIChiYWRQb2ludGVySW5kZXggPj0gMCkgewotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICBMT0dEKCJKdW1weVRvdWNoRmlsdGVyOiBSZXBsYWNpbmcgYmFkIHBvaW50ZXIgJWQgd2l0aCAoJWQsICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGJhZFBvaW50ZXJJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS54LAotICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLnkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tiYWRQb2ludGVySW5kZXhdLnggPQotICAgICAgICAgICAgICAgICAgICBsYXN0VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlclJlcGxhY2VtZW50SW5kZXhdLng7Ci0gICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbYmFkUG9pbnRlckluZGV4XS55ID0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFRvdWNoLnBvaW50ZXJzW2JhZFBvaW50ZXJSZXBsYWNlbWVudEluZGV4XS55OwotICAgICAgICAgICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgKz0gMTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAganVtcHlUb3VjaEZpbHRlci5qdW1weVBvaW50c0Ryb3BwZWQgPSAwOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotLyogU3BlY2lhbCBoYWNrIGZvciBkZXZpY2VzIHRoYXQgaGF2ZSBiYWQgc2NyZWVuIGRhdGE6IGFnZ3JlZ2F0ZSBhbmQKLSAqIGNvbXB1dGUgYXZlcmFnZXMgb2YgdGhlIGNvb3JkaW5hdGUgZGF0YSwgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YKLSAqIGppdHRlciBzZWVuIGJ5IGFwcGxpY2F0aW9ucy4gKi8KLXZvaWQgSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmFwcGx5QXZlcmFnaW5nVG91Y2hGaWx0ZXIoKSB7Ci0gICAgZm9yICh1aW50MzJfdCBjdXJyZW50SW5kZXggPSAwOyBjdXJyZW50SW5kZXggPCBjdXJyZW50VG91Y2gucG9pbnRlckNvdW50OyBjdXJyZW50SW5kZXgrKykgewotICAgICAgICB1aW50MzJfdCBpZCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLmlkOwotICAgICAgICBpbnQzMl90IHggPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54OwotICAgICAgICBpbnQzMl90IHkgPSBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS55OwotICAgICAgICBpbnQzMl90IHByZXNzdXJlID0gY3VycmVudFRvdWNoLnBvaW50ZXJzW2N1cnJlbnRJbmRleF0ucHJlc3N1cmU7Ci0KLSAgICAgICAgaWYgKGxhc3RUb3VjaC5pZEJpdHMuaGFzQml0KGlkKSkgewotICAgICAgICAgICAgLy8gUG9pbnRlciB3YXMgZG93biBiZWZvcmUgYW5kIGlzIHN0aWxsIGRvd24gbm93LgotICAgICAgICAgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIG92ZXIgaGlzdG9yeSB0cmFjZS4KLSAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0ID0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXTsKLSAgICAgICAgICAgIHVpbnQzMl90IGVuZCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdOwotCi0gICAgICAgICAgICBpbnQ2NF90IGRlbHRhWCA9IHggLSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54OwotICAgICAgICAgICAgaW50NjRfdCBkZWx0YVkgPSB5IC0gYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbZW5kXS5wb2ludGVyc1tpZF0ueTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGRpc3RhbmNlID0gdWludDY0X3QoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTsKLQotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtIERpc3RhbmNlIGZyb20gbGFzdCBzYW1wbGU6ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICBpZCwgZGlzdGFuY2UpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IEFWRVJBR0lOR19ESVNUQU5DRV9MSU1JVCkgewotICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBlbmQgaW5kZXggaW4gcHJlcGFyYXRpb24gZm9yIHJlY29yZGluZyBuZXcgaGlzdG9yaWNhbCBkYXRhLgotICAgICAgICAgICAgICAgIGVuZCArPSAxOwotICAgICAgICAgICAgICAgIGlmIChlbmQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGVuZCBpbmRleCBoYXMgbG9vcGVkIGJhY2sgdG8gdGhlIHN0YXJ0IGluZGV4IHRoZW4gd2UgaGF2ZSBmaWxsZWQKLSAgICAgICAgICAgICAgICAvLyB0aGUgaGlzdG9yaWNhbCB0cmFjZSB1cCB0byB0aGUgZGVzaXJlZCBzaXplIHNvIHdlIGRyb3AgdGhlIGhpc3RvcmljYWwKLSAgICAgICAgICAgICAgICAvLyBkYXRhIGF0IHRoZSBzdGFydCBvZiB0aGUgdHJhY2UuCi0gICAgICAgICAgICAgICAgaWYgKGVuZCA9PSBzdGFydCkgewotICAgICAgICAgICAgICAgICAgICBzdGFydCArPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPiBBVkVSQUdJTkdfSElTVE9SWV9TSVpFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIHJhdyBkYXRhIHRvIHRoZSBoaXN0b3JpY2FsIHRyYWNlLgotICAgICAgICAgICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlTdGFydFtpZF0gPSBzdGFydDsKLSAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RW5kW2lkXSA9IGVuZDsKLSAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS54ID0geDsKLSAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS55ID0geTsKLSAgICAgICAgICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtlbmRdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOwotCi0gICAgICAgICAgICAgICAgLy8gQXZlcmFnZSBvdmVyIGFsbCBoaXN0b3JpY2FsIHBvc2l0aW9ucyBpbiB0aGUgdHJhY2UgYnkgdG90YWwgcHJlc3N1cmUuCi0gICAgICAgICAgICAgICAgaW50MzJfdCBhdmVyYWdlZFggPSAwOwotICAgICAgICAgICAgICAgIGludDMyX3QgYXZlcmFnZWRZID0gMDsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHRvdGFsUHJlc3N1cmUgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWCA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueDsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsWSA9IGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhW3N0YXJ0XS5wb2ludGVyc1tpZF0ueTsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaXN0b3JpY2FsUHJlc3N1cmUgPSBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVtzdGFydF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9pbnRlcnNbaWRdLnByZXNzdXJlOwotCi0gICAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCArPSBoaXN0b3JpY2FsWCAqIGhpc3RvcmljYWxQcmVzc3VyZTsKLSAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRZICs9IGhpc3RvcmljYWxZICogaGlzdG9yaWNhbFByZXNzdXJlOwotICAgICAgICAgICAgICAgICAgICB0b3RhbFByZXNzdXJlICs9IGhpc3RvcmljYWxQcmVzc3VyZTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+IEFWRVJBR0lOR19ISVNUT1JZX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWCAvPSB0b3RhbFByZXNzdXJlOwotICAgICAgICAgICAgICAgIGF2ZXJhZ2VkWSAvPSB0b3RhbFByZXNzdXJlOwotCi0jaWYgREVCVUdfSEFDS1MKLSAgICAgICAgICAgICAgICBMT0dEKCJBdmVyYWdpbmdUb3VjaEZpbHRlcjogUG9pbnRlciBpZCAlZCAtICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJ0b3RhbFByZXNzdXJlPSVkLCBhdmVyYWdlZFg9JWQsIGF2ZXJhZ2VkWT0lZCIsIGlkLCB0b3RhbFByZXNzdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXZlcmFnZWRYLCBhdmVyYWdlZFkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgICAgICBjdXJyZW50VG91Y2gucG9pbnRlcnNbY3VycmVudEluZGV4XS54ID0gYXZlcmFnZWRYOwotICAgICAgICAgICAgICAgIGN1cnJlbnRUb3VjaC5wb2ludGVyc1tjdXJyZW50SW5kZXhdLnkgPSBhdmVyYWdlZFk7Ci0gICAgICAgICAgICB9IGVsc2UgewotI2lmIERFQlVHX0hBQ0tTCi0gICAgICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBFeGNlZWRlZCBtYXggZGlzdGFuY2UiLCBpZCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSNpZiBERUJVR19IQUNLUwotICAgICAgICAgICAgTE9HRCgiQXZlcmFnaW5nVG91Y2hGaWx0ZXI6IFBvaW50ZXIgaWQgJWQgLSBQb2ludGVyIHdlbnQgdXAiLCBpZCk7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlc2V0IHBvaW50ZXIgaGlzdG9yeS4KLSAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeVN0YXJ0W2lkXSA9IDA7Ci0gICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlFbmRbaWRdID0gMDsKLSAgICAgICAgYXZlcmFnaW5nVG91Y2hGaWx0ZXIuaGlzdG9yeURhdGFbMF0ucG9pbnRlcnNbaWRdLnggPSB4OwotICAgICAgICBhdmVyYWdpbmdUb3VjaEZpbHRlci5oaXN0b3J5RGF0YVswXS5wb2ludGVyc1tpZF0ueSA9IHk7Ci0gICAgICAgIGF2ZXJhZ2luZ1RvdWNoRmlsdGVyLmhpc3RvcnlEYXRhWzBdLnBvaW50ZXJzW2lkXS5wcmVzc3VyZSA9IHByZXNzdXJlOwotICAgIH0KLX0KLQotYm9vbCBJbnB1dERldmljZTo6VG91Y2hTY3JlZW5TdGF0ZTo6aXNQb2ludEluc2lkZURpc3BsYXkoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKLSAgICBpZiAoISBwYXJhbWV0ZXJzLnhBeGlzLnZhbGlkIHx8ICEgcGFyYW1ldGVycy55QXhpcy52YWxpZCkgewotICAgICAgICAvLyBBc3N1bWUgYWxsIHBvaW50cyBvbiBhIHRvdWNoIHNjcmVlbiB3aXRob3V0IHZhbGlkIGF4aXMgcGFyYW1ldGVycyBhcmUKLSAgICAgICAgLy8gaW5zaWRlIHRoZSBkaXNwbGF5LgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4geCA+PSBwYXJhbWV0ZXJzLnhBeGlzLm1pblZhbHVlCi0gICAgICAgICYmIHggPD0gcGFyYW1ldGVycy54QXhpcy5tYXhWYWx1ZQotICAgICAgICAmJiB5ID49IHBhcmFtZXRlcnMueUF4aXMubWluVmFsdWUKLSAgICAgICAgJiYgeSA8PSBwYXJhbWV0ZXJzLnlBeGlzLm1heFZhbHVlOwotfQotCi1jb25zdCBJbnB1dERldmljZTo6VmlydHVhbEtleSogSW5wdXREZXZpY2U6OlRvdWNoU2NyZWVuU3RhdGU6OmZpbmRWaXJ0dWFsS2V5SGl0KCkgY29uc3QgewotICAgIGludDMyX3QgeCA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS54OwotICAgIGludDMyX3QgeSA9IGN1cnJlbnRUb3VjaC5wb2ludGVyc1swXS55OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmlydHVhbEtleXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgSW5wdXREZXZpY2U6OlZpcnR1YWxLZXkmIHZpcnR1YWxLZXkgPSB2aXJ0dWFsS2V5c1tpXTsKLQotI2lmIERFQlVHX1ZJUlRVQUxfS0VZUwotICAgICAgICBMT0dEKCJWaXJ0dWFsS2V5czogSGl0IHRlc3QgKCVkLCAlZCk6IGtleUNvZGU9JWQsIHNjYW5Db2RlPSVkLCAiCi0gICAgICAgICAgICAgICAgImxlZnQ9JWQsIHRvcD0lZCwgcmlnaHQ9JWQsIGJvdHRvbT0lZCIsCi0gICAgICAgICAgICAgICAgeCwgeSwKLSAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmtleUNvZGUsIHZpcnR1YWxLZXkuc2NhbkNvZGUsCi0gICAgICAgICAgICAgICAgdmlydHVhbEtleS5oaXRMZWZ0LCB2aXJ0dWFsS2V5LmhpdFRvcCwKLSAgICAgICAgICAgICAgICB2aXJ0dWFsS2V5LmhpdFJpZ2h0LCB2aXJ0dWFsS2V5LmhpdEJvdHRvbSk7Ci0jZW5kaWYKLQotICAgICAgICBpZiAodmlydHVhbEtleS5pc0hpdCh4LCB5KSkgewotICAgICAgICAgICAgcmV0dXJuICYgdmlydHVhbEtleTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8vIC0tLSBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6U2luZ2xlVG91Y2hTY3JlZW5TdGF0ZTo6cmVzZXQoKSB7Ci0gICAgYWNjdW11bGF0b3IuY2xlYXIoKTsKLSAgICBjdXJyZW50LmRvd24gPSBmYWxzZTsKLSAgICBjdXJyZW50LnggPSAwOwotICAgIGN1cnJlbnQueSA9IDA7Ci0gICAgY3VycmVudC5wcmVzc3VyZSA9IDA7Ci0gICAgY3VycmVudC5zaXplID0gMDsKLX0KLQotCi0vLyAtLS0gSW5wdXREZXZpY2U6Ok11bHRpVG91Y2hTY3JlZW5TdGF0ZSAtLS0KLQotdm9pZCBJbnB1dERldmljZTo6TXVsdGlUb3VjaFNjcmVlblN0YXRlOjpyZXNldCgpIHsKLSAgICBhY2N1bXVsYXRvci5jbGVhcigpOwotfQotCi0KIC8vIC0tLSBJbnB1dFJlYWRlciAtLS0KIAogSW5wdXRSZWFkZXI6OklucHV0UmVhZGVyKGNvbnN0IHNwPEV2ZW50SHViSW50ZXJmYWNlPiYgZXZlbnRIdWIsCkBAIC05MjcsMzIgKzI1MywzMCBAQAogICAgIGJvb2wgZG93biA9IHJhd0V2ZW50LT52YWx1ZSAhPSAwOwogICAgIGludDMyX3Qgc2NhbkNvZGUgPSByYXdFdmVudC0+c2NhbkNvZGU7CiAKLSAgICBpZiAoZGV2aWNlLT5pc0tleWJvYXJkKCkgJiYgKHNjYW5Db2RlIDwgQlROX0ZJUlNUIHx8IHNjYW5Db2RlID4gQlROX0xBU1QpKSB7Ci0gICAgICAgIGludDMyX3Qga2V5Q29kZSA9IHJhd0V2ZW50LT5rZXlDb2RlOwotICAgICAgICBvbktleShyYXdFdmVudC0+d2hlbiwgZGV2aWNlLCBkb3duLCBrZXlDb2RlLCBzY2FuQ29kZSwgcmF3RXZlbnQtPmZsYWdzKTsKLSAgICB9IGVsc2UgaWYgKGRldmljZS0+aXNTaW5nbGVUb3VjaFNjcmVlbigpKSB7CisgICAgaWYgKGRldmljZS0+aXNTaW5nbGVUb3VjaFNjcmVlbigpKSB7CiAgICAgICAgIHN3aXRjaCAocmF3RXZlbnQtPnNjYW5Db2RlKSB7CiAgICAgICAgIGNhc2UgQlROX1RPVUNIOgogICAgICAgICAgICAgZGV2aWNlLT5zaW5nbGVUb3VjaFNjcmVlbi5hY2N1bXVsYXRvci5maWVsZHMgfD0KICAgICAgICAgICAgICAgICAgICAgSW5wdXREZXZpY2U6OlNpbmdsZVRvdWNoU2NyZWVuU3RhdGU6OkFjY3VtdWxhdG9yOjpGSUVMRF9CVE5fVE9VQ0g7CiAgICAgICAgICAgICBkZXZpY2UtPnNpbmdsZVRvdWNoU2NyZWVuLmFjY3VtdWxhdG9yLmJ0blRvdWNoID0gZG93bjsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChkZXZpY2UtPmlzVHJhY2tiYWxsKCkpIHsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlLT5pc1RyYWNrYmFsbCgpKSB7CiAgICAgICAgIHN3aXRjaCAocmF3RXZlbnQtPnNjYW5Db2RlKSB7CiAgICAgICAgIGNhc2UgQlROX01PVVNFOgogICAgICAgICAgICAgZGV2aWNlLT50cmFja2JhbGwuYWNjdW11bGF0b3IuZmllbGRzIHw9CiAgICAgICAgICAgICAgICAgICAgIElucHV0RGV2aWNlOjpUcmFja2JhbGxTdGF0ZTo6QWNjdW11bGF0b3I6OkZJRUxEX0JUTl9NT1VTRTsKICAgICAgICAgICAgIGRldmljZS0+dHJhY2tiYWxsLmFjY3VtdWxhdG9yLmJ0bk1vdXNlID0gZG93bjsKLQotICAgICAgICAgICAgLy8gc2VuZCB0aGUgZG93biBpbW1lZGlhdGVseQotICAgICAgICAgICAgLy8gWFhYIHRoaXMgZW11bGF0ZXMgdGhlIG9sZCBiZWhhdmlvciBvZiBLZXlJbnB1dFF1ZXVlLCB1bmNsZWFyIHdoZXRoZXIgaXQgaXMKLSAgICAgICAgICAgIC8vICAgICBuZWNlc3Nhcnkgb3IgaWYgd2UgY2FuIHdhaXQgdW50aWwgdGhlIG5leHQgc3luYwotICAgICAgICAgICAgb25UcmFja2JhbGxTdGF0ZUNoYW5nZWQocmF3RXZlbnQtPndoZW4sIGRldmljZSk7Ci0gICAgICAgICAgICBkZXZpY2UtPnRyYWNrYmFsbC5hY2N1bXVsYXRvci5jbGVhcigpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAoZGV2aWNlLT5pc0tleWJvYXJkKCkpIHsKKyAgICAgICAgaW50MzJfdCBrZXlDb2RlID0gcmF3RXZlbnQtPmtleUNvZGU7CisgICAgICAgIG9uS2V5KHJhd0V2ZW50LT53aGVuLCBkZXZpY2UsIGRvd24sIGtleUNvZGUsIHNjYW5Db2RlLCByYXdFdmVudC0+ZmxhZ3MpOworICAgIH0KIH0KIAogdm9pZCBJbnB1dFJlYWRlcjo6aGFuZGxlUmVsYXRpdmVNb3Rpb24oY29uc3QgUmF3RXZlbnQqIHJhd0V2ZW50KSB7CmRpZmYgLS1naXQgYS9saWJzL3VpL0lucHV0VHJhbnNwb3J0LmNwcCBiL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCmluZGV4IDI1ZGVmM2MuLmZjODNlMzEgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCisrKyBiL2xpYnMvdWkvSW5wdXRUcmFuc3BvcnQuY3BwCkBAIC02OTAsMjIgKzY5MCwzIEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotLy8gLS0tIEFJbnB1dFF1ZXVlIC0tLQotCi11c2luZyBhbmRyb2lkOjpJbnB1dEV2ZW50OwotdXNpbmcgYW5kcm9pZDo6SW5wdXRDaGFubmVsOwotdXNpbmcgYW5kcm9pZDo6SW5wdXRDb25zdW1lcjsKLXVzaW5nIGFuZHJvaWQ6OnNwOwotdXNpbmcgYW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLUFJbnB1dFF1ZXVlOjpBSW5wdXRRdWV1ZShjb25zdCBzcDxJbnB1dENoYW5uZWw+JiBjaGFubmVsKSA6Ci0gICAgICAgIG1Db25zdW1lcihjaGFubmVsKSB7Ci19Ci0KLUFJbnB1dFF1ZXVlOjp+QUlucHV0UXVldWUoKSB7Ci19Ci0KLXN0YXR1c190IEFJbnB1dFF1ZXVlOjpjb25zdW1lKElucHV0RXZlbnQqKiBldmVudCkgewotICAgIHJldHVybiBtQ29uc3VtZXIuY29uc3VtZSgmbUlucHV0RXZlbnRGYWN0b3J5LCBldmVudCk7Ci19CmRpZmYgLS1naXQgYS9saWJzL3VpL1BpeGVsRm9ybWF0LmNwcCBiL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCmluZGV4IGIyMDU0MTguLmVkZjFhZWQgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCisrKyBiL2xpYnMvdWkvUGl4ZWxGb3JtYXQuY3BwCkBAIC02MCw3ICs2MCw2IEBACiAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgogICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKLSAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxNjoKICAgICAgICAgaW5mby0+Yml0c1BlclBpeGVsID0gMTY7CiAgICAgICAgIGdvdG8gZG9uZTsKICAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgpkaWZmIC0tZ2l0IGEvbGlicy91aS90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwIGIvbGlicy91aS90ZXN0cy9JbnB1dFB1Ymxpc2hlckFuZENvbnN1bWVyX3Rlc3QuY3BwCmluZGV4IDJkNmI1MzEuLjU1NTA0ZjIgMTAwNjQ0Ci0tLSBhL2xpYnMvdWkvdGVzdHMvSW5wdXRQdWJsaXNoZXJBbmRDb25zdW1lcl90ZXN0LmNwcAorKysgYi9saWJzL3VpL3Rlc3RzL0lucHV0UHVibGlzaGVyQW5kQ29uc3VtZXJfdGVzdC5jcHAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICBjb25zdCBpbnQzMl90IG5hdHVyZSA9IElOUFVUX0VWRU5UX05BVFVSRV9LRVk7CiAgICAgY29uc3QgaW50MzJfdCBhY3Rpb24gPSBLRVlfRVZFTlRfQUNUSU9OX0RPV047CiAgICAgY29uc3QgaW50MzJfdCBmbGFncyA9IEtFWV9FVkVOVF9GTEFHX0ZST01fU1lTVEVNOwotICAgIGNvbnN0IGludDMyX3Qga2V5Q29kZSA9IEtFWUNPREVfRU5URVI7CisgICAgY29uc3QgaW50MzJfdCBrZXlDb2RlID0gQUtFWUNPREVfRU5URVI7CiAgICAgY29uc3QgaW50MzJfdCBzY2FuQ29kZSA9IDEzOwogICAgIGNvbnN0IGludDMyX3QgbWV0YVN0YXRlID0gTUVUQV9BTFRfTEVGVF9PTiB8IE1FVEFfQUxUX09OOwogICAgIGNvbnN0IGludDMyX3QgcmVwZWF0Q291bnQgPSAxOwpkaWZmIC0tZ2l0IGEvbGlicy91dGlscy9BbmRyb2lkLm1rIGIvbGlicy91dGlscy9BbmRyb2lkLm1rCmluZGV4IDJiYjQyYWIuLjhiZDU4MjMgMTAwNjQ0Ci0tLSBhL2xpYnMvdXRpbHMvQW5kcm9pZC5taworKysgYi9saWJzL3V0aWxzL0FuZHJvaWQubWsKQEAgLTEyMiwzICsxMjIsMTMgQEAKIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKIGVuZGlmCiBlbmRpZgorCisKKyMgSW5jbHVkZSBzdWJkaXJlY3RvcnkgbWFrZWZpbGVzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIElmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggT05FX1NIT1RfTUFLRUZJTEUgKG1tLCBtbW0pLCB0aGVuIHdoYXQgdGhlIGZyYW1ld29yaworIyB0ZWFtIHJlYWxseSB3YW50cyBpcyB0byBidWlsZCB0aGUgc3R1ZmYgZGVmaW5lZCBieSB0aGlzIG1ha2VmaWxlLgoraWZlcSAoLCQoT05FX1NIT1RfTUFLRUZJTEUpKQoraW5jbHVkZSAkKGNhbGwgZmlyc3QtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCitlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5tawppbmRleCA1NGU4N2YzLi5mYzRjZWI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL0FuZHJvaWQubWsKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLm1rCkBAIC04Nyw3ICs4Nyw4IEBACiBlbmRpZgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgZ3JhcGhpY3MgY29yZWNnKQorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBncmFwaGljcyBjb3JlY2cpIFwKKwlzeXN0ZW0vbWVkaWEvb3BlbnNsZXMvaW5jbHVkZQogCiBMT0NBTF9QUkVMSU5LX01PRFVMRSA6PSBmYWxzZQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdEVxdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdEVxdWFsaXplci5jcHAKaW5kZXggZDE5YzZiOS4uYWYwYzQxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RFcXVhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0RXF1YWxpemVyLmNwcApAQCAtMzAsNiArMzAsMTIgQEAKIC8vIGVmZmVjdF9pbnRlcmZhY2VfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIGVxdWFsaXplciBlZmZlY3QKIGV4dGVybiAiQyIgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyBnRXF1YWxpemVySW50ZXJmYWNlOwogCitlbnVtIGVxdWFsaXplcl9zdGF0ZV9lIHsKKyAgICBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRCwKKyAgICBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQsCisgICAgRVFVQUxJWkVSX1NUQVRFX0FDVElWRSwKK307CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB7CiAKQEAgLTEwMCw2ICsxMDYsNyBAQAogICAgIGVmZmVjdF9jb25maWdfdCBjb25maWc7CiAgICAgRm9ybWF0QWRhcHRlciBhZGFwdGVyOwogICAgIEF1ZGlvRXF1YWxpemVyICogcEVxdWFsaXplcjsKKyAgICB1aW50MzJfdCBzdGF0ZTsKIH07CiAKIC8vLS0tIGxvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKQEAgLTE1MSw2ICsxNTgsNyBAQAogCiAgICAgcENvbnRleHQtPml0ZmUgPSAmZ0VxdWFsaXplckludGVyZmFjZTsKICAgICBwQ29udGV4dC0+cEVxdWFsaXplciA9IE5VTEw7CisgICAgcENvbnRleHQtPnN0YXRlID0gRVFVQUxJWkVSX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAKICAgICByZXQgPSBFcXVhbGl6ZXJfaW5pdChwQ29udGV4dCk7CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTE2MCw2ICsxNjgsNyBAQAogICAgIH0KIAogICAgICpwSW50ZXJmYWNlID0gKGVmZmVjdF9pbnRlcmZhY2VfdClwQ29udGV4dDsKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CiAKICAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAsIHNpemUgJWQiLCBwQ29udGV4dCwgQXVkaW9FcXVhbGl6ZXI6OkdldEluc3RhbmNlU2l6ZShrTnVtQmFuZHMpK3NpemVvZihFcXVhbGl6ZXJDb250ZXh0KSk7CiAKQEAgLTE3NSw2ICsxODQsNyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBwQ29udGV4dC0+cEVxdWFsaXplci0+ZnJlZSgpOwogICAgIGRlbGV0ZSBwQ29udGV4dDsKIApAQCAtNTI4LDYgKzUzOCwxMyBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICBpZiAocENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9JTklUSUFMSVpFRCkgeworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CisgICAgfQorCiAgICAgcENvbnRleHQtPmFkYXB0ZXIucHJvY2VzcyhpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPnJhdywgb3V0QnVmZmVyLT5mcmFtZUNvdW50KTsKIAogICAgIHJldHVybiAwOwpAQCAtNTM5LDcgKzU1Niw3IEBACiAgICAgYW5kcm9pZDo6RXF1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKGFuZHJvaWQ6OkVxdWFsaXplckNvbnRleHQgKikgc2VsZjsKICAgICBpbnQgcmV0c2l6ZTsKIAotICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKSB7CisgICAgaWYgKHBDb250ZXh0ID09IE5VTEwgfHwgcENvbnRleHQtPnN0YXRlID09IEVRVUFMSVpFUl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtNTk0LDEwICs2MTEsMjUgQEAKICAgICAgICAgICAgICAgICBwLT5kYXRhICsgcC0+cHNpemUpOwogICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9FTkFCTEU6CisgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5zdGF0ZSA9IEVRVUFMSVpFUl9TVEFURV9BQ1RJVkU7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRU5BQkxFKCkgT0siKTsKKyAgICAgICAgKihpbnQgKilwUmVwbHlEYXRhID0gMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0RJU0FCTEU6CiAgICAgICAgIGlmIChwUmVwbHlEYXRhID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5zdGF0ZSAhPSBFUVVBTElaRVJfU1RBVEVfQUNUSVZFKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwQ29udGV4dC0+c3RhdGUgPSBFUVVBTElaRVJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIExPR1YoIkVGRkVDVF9DTURfRElTQUJMRSgpIE9LIik7CiAgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9TRVRfREVWSUNFOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuYyBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0UmV2ZXJiLmMKaW5kZXggNWM4N2YyMy4uMmNlNzU1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFJldmVyYi5jCkBAIC0xNSw4ICsxNSw3IEBACiAgKi8KIAogI2RlZmluZSBMT0dfVEFHICJFZmZlY3RSZXZlcmIiCi0vLwotI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNpbmNsdWRlIDxjdXRpbHMvbG9nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CkBAIC0xNDMsNiArMTQyLDggQEAKIAogICAgIG1vZHVsZS0+aXRmZSA9ICZnUmV2ZXJiSW50ZXJmYWNlOwogCisgICAgbW9kdWxlLT5jb250ZXh0Lm1TdGF0ZSA9IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEOworCiAgICAgaWYgKG1lbWNtcCgmZGVzYy0+dHlwZSwgU0xfSUlEX1BSRVNFVFJFVkVSQiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB7CiAgICAgICAgIHByZXNldCA9IDE7CiAgICAgfQpAQCAtMTU4LDYgKzE1OSw4IEBACiAKICAgICAqcEludGVyZmFjZSA9IChlZmZlY3RfaW50ZXJmYWNlX3QpIG1vZHVsZTsKIAorICAgIG1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CisKICAgICBMT0dWKCJFZmZlY3RMaWJDcmVhdGVFZmZlY3QgJXAgLHNpemUgJWQiLCBtb2R1bGUsIHNpemVvZihyZXZlcmJfbW9kdWxlX3QpKTsKIAogICAgIHJldHVybiAwOwpAQCAtMTcxLDYgKzE3NCw4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQ7CisKICAgICBmcmVlKHBSdmJNb2R1bGUpOwogICAgIHJldHVybiAwOwogfQpAQCAtMTk1LDYgKzIwMCwxMyBAQAogCiAgICAgcFJldmVyYiA9IChyZXZlcmJfb2JqZWN0X3QqKSAmcFJ2Yk1vZHVsZS0+Y29udGV4dDsKIAorICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX1VOSU5JVElBTElaRUQpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgPT0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgIHJldHVybiAtRU5PREFUQTsKKyAgICB9CisKICAgICAvL2lmIGJ5cGFzc2VkIG9yIHRoZSBwcmVzZXQgZm9yY2VzIHRoZSBzaWduYWwgdG8gYmUgY29tcGxldGVseSBkcnkKICAgICBpZiAocFJldmVyYi0+bV9iQnlwYXNzICE9IDApIHsKICAgICAgICAgaWYgKGluQnVmZmVyLT5yYXcgIT0gb3V0QnVmZmVyLT5yYXcpIHsKQEAgLTI1NywxMyArMjY5LDE1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKwogc3RhdGljIGludCBSZXZlcmJfQ29tbWFuZChlZmZlY3RfaW50ZXJmYWNlX3Qgc2VsZiwgaW50IGNtZENvZGUsIGludCBjbWRTaXplLAogICAgICAgICB2b2lkICpwQ21kRGF0YSwgaW50ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKICAgICByZXZlcmJfbW9kdWxlX3QgKnBSdmJNb2R1bGUgPSAocmV2ZXJiX21vZHVsZV90ICopIHNlbGY7CiAgICAgcmV2ZXJiX29iamVjdF90ICpwUmV2ZXJiOwogICAgIGludCByZXRzaXplOwogCi0gICAgaWYgKHBSdmJNb2R1bGUgPT0gTlVMTCkgeworICAgIGlmIChwUnZiTW9kdWxlID09IE5VTEwgfHwKKyAgICAgICAgICAgIHBSdmJNb2R1bGUtPmNvbnRleHQubVN0YXRlID09IFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVEKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIApAQCAtMjc3LDYgKzI5MSw5IEBACiAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgfQogICAgICAgICAqKGludCAqKSBwUmVwbHlEYXRhID0gUmV2ZXJiX0luaXQocFJ2Yk1vZHVsZSwgcFJldmVyYi0+bV9BdXgsIHBSZXZlcmItPm1fUHJlc2V0KTsKKyAgICAgICAgaWYgKCooaW50ICopIHBSZXBseURhdGEgPT0gMCkgeworICAgICAgICAgICAgcFJ2Yk1vZHVsZS0+Y29udGV4dC5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfSU5JVElBTElaRUQ7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfQ01EX0NPTkZJR1VSRToKICAgICAgICAgaWYgKHBDbWREYXRhID09IE5VTEwgfHwgY21kU2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KQpAQCAtMzE1LDEwICszMzIsMjUgQEAKICAgICAgICAgICAgICAgICBjbWQtPnZzaXplLCBjbWQtPmRhdGEgKyBzaXplb2YoaW50MzJfdCkpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEVGRkVDVF9DTURfRU5BQkxFOgorICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgIT0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICAgICAgfQorICAgICAgICBwUmV2ZXJiLT5tU3RhdGUgPSBSRVZFUkJfU1RBVEVfQUNUSVZFOworICAgICAgICBMT0dWKCJFRkZFQ1RfQ01EX0VOQUJMRSgpIE9LIik7CisgICAgICAgICooaW50ICopcFJlcGx5RGF0YSA9IDA7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRUZGRUNUX0NNRF9ESVNBQkxFOgogICAgICAgICBpZiAocFJlcGx5RGF0YSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CisgICAgICAgIGlmIChwUmV2ZXJiLT5tU3RhdGUgIT0gUkVWRVJCX1NUQVRFX0FDVElWRSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgICAgIH0KKyAgICAgICAgcFJldmVyYi0+bVN0YXRlID0gUkVWRVJCX1NUQVRFX0lOSVRJQUxJWkVEOworICAgICAgICBMT0dWKCJFRkZFQ1RfQ01EX0RJU0FCTEUoKSBPSyIpOwogICAgICAgICAqKGludCAqKXBSZXBseURhdGEgPSAwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEVGRkVDVF9DTURfU0VUX0RFVklDRToKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFJldmVyYi5oCmluZGV4IDVhZjMxNmQuLmVlOGUzOTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0UmV2ZXJiLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RSZXZlcmIuaApAQCAtMTE0LDYgKzExNCwxMiBAQAogI2RlZmluZSBBUDFfR0FJTl9SQU5HRSAoaW50KSgyMjkzNi02NTUzKQogCiAKK2VudW0gcmV2ZXJiX3N0YXRlX2UgeworICAgIFJFVkVSQl9TVEFURV9VTklOSVRJQUxJWkVELAorICAgIFJFVkVSQl9TVEFURV9JTklUSUFMSVpFRCwKKyAgICBSRVZFUkJfU1RBVEVfQUNUSVZFLAorfTsKKwogLyogcGFyYW1ldGVycyBmb3IgZWFjaCBhbGxwYXNzICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjc5LDYgKzI4NSw3IEBACiAgICAgdWludDE2X3QgICAgICAgICAgICBtX0F1eDsgICAgICAgICAgICAgICAgLy8gaWYgVFJVRSwgaXMgY29ubmVjdGVkIGFzIGF1eGlsaWFyeSBlZmZlY3QKICAgICB1aW50MTZfdCAgICAgICAgICAgIG1fUHJlc2V0OyAgICAgICAgICAgICAvLyBpZiBUUlVFLCBleHBvc2UgcHJlc2V0IHJldmVydCBpbnRlcmZhY2UKIAorICAgIHVpbnQzMl90ICAgICAgICAgICAgbVN0YXRlOwogfSByZXZlcmJfb2JqZWN0X3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggZjI3ZTI5Ni4uYmNkYTA2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9FZmZlY3RWaXN1YWxpemVyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IFZJU1VBTElaRVJfU1RBVEVfQUNUSVZFKSB7Ci0gICAgICAgIHJldHVybiAtRU5PU1lTOworICAgICAgICByZXR1cm4gLUVOT0RBVEE7CiAgICAgfQogCiAgICAgaWYgKGluQnVmZmVyID09IE5VTEwgfHwgaW5CdWZmZXItPnJhdyA9PSBOVUxMIHx8CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKaW5kZXggNzIwNjFhZC4uY2JhNTA4NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcApAQCAtODY4LDE3ICs4NjgsMTkgQEAKIAogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY2FtZXJhU291cmNlLT5nZXRGb3JtYXQoKTsKIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzbGljZUhlaWdodDsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgc2xpY2VIZWlnaHQsIGNvbG9yRm9ybWF0OwogICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCkpOwogICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTdHJpZGUsICZzdHJpZGUpKTsKICAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleVNsaWNlSGVpZ2h0LCAmc2xpY2VIZWlnaHQpKTsKKyAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yRm9ybWF0LCAmY29sb3JGb3JtYXQpKTsKIAogICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICBlbmNfbWV0YS0+c2V0SW50MzIoa0tleUlGcmFtZXNJbnRlcnZhbCwgbUlGcmFtZXNJbnRlcnZhbCk7CiAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTdHJpZGUsIHN0cmlkZSk7CiAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlTbGljZUhlaWdodCwgc2xpY2VIZWlnaHQpOworICAgIGVuY19tZXRhLT5zZXRJbnQzMihrS2V5Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0KTsKICAgICBpZiAobVZpZGVvRW5jb2RlclByb2ZpbGUgIT0gLTEpIHsKICAgICAgICAgZW5jX21ldGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIG1WaWRlb0VuY29kZXJQcm9maWxlKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCA2MGQwMjMzLi40OWNmNjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQubWsKQEAgLTY2LDYgKzY2LDcgQEAKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y2RlYyBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2F2Y2VuYyBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9tcDNkZWMgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF92b3JiaXNkZWMgXApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT01YQ29kZWMuY3BwCmluZGV4IGVmYWFiNWIuLjA3N2UxMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09NWENvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PTVhDb2RlYy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJpbmNsdWRlL0FNUldCRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvQU1SV0JFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9BVkNEZWNvZGVyLmgiCisjaW5jbHVkZSAiaW5jbHVkZS9BVkNFbmNvZGVyLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9NNHZIMjYzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvTVAzRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvVm9yYmlzRGVjb2Rlci5oIgpAQCAtODEsNiArODIsNyBAQAogRkFDVE9SWV9DUkVBVEVfRU5DT0RFUihBTVJOQkVuY29kZXIpCiBGQUNUT1JZX0NSRUFURV9FTkNPREVSKEFNUldCRW5jb2RlcikKIEZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQUFDRW5jb2RlcikKK0ZBQ1RPUllfQ1JFQVRFX0VOQ09ERVIoQVZDRW5jb2RlcikKIAogc3RhdGljIHNwPE1lZGlhU291cmNlPiBJbnN0YW50aWF0ZVNvZnR3YXJlRW5jb2RlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UsCkBAIC05NCw2ICs5Niw3IEBACiAgICAgICAgIEZBQ1RPUllfUkVGKEFNUk5CRW5jb2RlcikKICAgICAgICAgRkFDVE9SWV9SRUYoQU1SV0JFbmNvZGVyKQogICAgICAgICBGQUNUT1JZX1JFRihBQUNFbmNvZGVyKQorICAgICAgICBGQUNUT1JZX1JFRihBVkNFbmNvZGVyKQogICAgIH07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7CiAgICAgICAgICBpIDwgc2l6ZW9mKGtGYWN0b3J5SW5mbykgLyBzaXplb2Yoa0ZhY3RvcnlJbmZvWzBdKTsgKytpKSB7CkBAIC0xODYsNiArMTg5LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5xY29tLjd4MzAudmlkZW8uZW5jb2Rlci5hdmMiIH0sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMsICJPTVgucWNvbS52aWRlby5lbmNvZGVyLmF2YyIgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgIk9NWC5USS5WaWRlby5lbmNvZGVyIiB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiQVZDRW5jb2RlciIgfSwKIC8vICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiT01YLlBWLmF2Y2VuYyIgfSwKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FWQ0VuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvQVZDRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVlYjE1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FWQ0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsNDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBVkNFbmNvZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQVZDRW5jb2Rlci5oIgorCisjaW5jbHVkZSAiYXZjZW5jX2FwaS5oIgorI2luY2x1ZGUgImF2Y2VuY19pbnQuaCIKKyNpbmNsdWRlICJPTVhfVmlkZW8uaCIKKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW5saW5lIHN0YXRpYyB2b2lkIENvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmlueXV2LCB1aW50OF90KiBvdXR5dXYsCisgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisKKyAgICBpbnQzMl90IG91dFlzaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgdWludDMyX3QgKm91dHkgPSAgKHVpbnQzMl90ICopIG91dHl1djsKKyAgICB1aW50MTZfdCAqb3V0Y2IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplKTsKKyAgICB1aW50MTZfdCAqb3V0Y3IgPSAodWludDE2X3QgKikgKG91dHl1diArIG91dFlzaXplICsgKG91dFlzaXplID4+IDIpKTsKKworICAgIC8qIFkgY29weWluZyAqLworICAgIG1lbWNweShvdXR5LCBpbnl1diwgb3V0WXNpemUpOworCisgICAgLyogVSAmIFYgY29weWluZyAqLworICAgIHVpbnQzMl90ICppbnl1dl80ID0gKHVpbnQzMl90ICopIChpbnl1diArIG91dFlzaXplKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IGhlaWdodCA+PiAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gd2lkdGggPj4gMjsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9ICppbnl1dl80Kys7CisgICAgICAgICAgICB1aW50MzJfdCB0ZW1wVSA9IHRlbXAgJiAweEZGOworICAgICAgICAgICAgdGVtcFUgPSB0ZW1wVSB8ICgodGVtcCA+PiA4KSAmIDB4RkYwMCk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IHRlbXBWID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdGVtcFYgPSB0ZW1wViB8ICgodGVtcCA+PiAxNikgJiAweEZGMDApOworCisgICAgICAgICAgICAvLyBGbGlwIFUgYW5kIFYKKyAgICAgICAgICAgICpvdXRjYisrID0gdGVtcFY7CisgICAgICAgICAgICAqb3V0Y3IrKyA9IHRlbXBVOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50MzJfdCBNYWxsb2NXcmFwcGVyKAorICAgICAgICB2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBzaXplLCBpbnQzMl90IGF0dHJzKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdD4obWFsbG9jKHNpemUpKTsKK30KKworc3RhdGljIHZvaWQgRnJlZVdyYXBwZXIodm9pZCAqdXNlckRhdGEsIGludDMyX3QgcHRyKSB7CisgICAgZnJlZShyZWludGVycHJldF9jYXN0PHZvaWQgKj4ocHRyKSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IERwYkFsbG9jV3JhcHBlcih2b2lkICp1c2VyRGF0YSwKKyAgICAgICAgdW5zaWduZWQgaW50IHNpemVJbk1icywgdW5zaWduZWQgaW50IG51bUJ1ZmZlcnMpIHsKKyAgICBBVkNFbmNvZGVyICplbmNvZGVyID0gc3RhdGljX2Nhc3Q8QVZDRW5jb2RlciAqPih1c2VyRGF0YSk7CisgICAgQ0hFQ0soZW5jb2RlciAhPSBOVUxMKTsKKyAgICByZXR1cm4gZW5jb2Rlci0+YWxsb2NPdXRwdXRCdWZmZXJzKHNpemVJbk1icywgbnVtQnVmZmVycyk7Cit9CisKK3N0YXRpYyBpbnQzMl90IEJpbmRGcmFtZVdyYXBwZXIoCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLCBpbnQzMl90IGluZGV4LCB1aW50OF90ICoqeXV2KSB7CisgICAgQVZDRW5jb2RlciAqZW5jb2RlciA9IHN0YXRpY19jYXN0PEFWQ0VuY29kZXIgKj4odXNlckRhdGEpOworICAgIENIRUNLKGVuY29kZXIgIT0gTlVMTCk7CisgICAgcmV0dXJuIGVuY29kZXItPmJpbmRPdXRwdXRCdWZmZXIoaW5kZXgsIHl1dik7Cit9CisKK3N0YXRpYyB2b2lkIFVuYmluZEZyYW1lV3JhcHBlcih2b2lkICp1c2VyRGF0YSwgaW50MzJfdCBpbmRleCkgeworICAgIEFWQ0VuY29kZXIgKmVuY29kZXIgPSBzdGF0aWNfY2FzdDxBVkNFbmNvZGVyICo+KHVzZXJEYXRhKTsKKyAgICBDSEVDSyhlbmNvZGVyICE9IE5VTEwpOworICAgIHJldHVybiBlbmNvZGVyLT51bmJpbmRPdXRwdXRCdWZmZXIoaW5kZXgpOworfQorCitBVkNFbmNvZGVyOjpBVkNFbmNvZGVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKQorICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEobWV0YSksCisgICAgICBtTnVtSW5wdXRGcmFtZXMoLTEpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlucHV0QnVmZmVyKE5VTEwpLAorICAgICAgbUlucHV0RnJhbWVEYXRhKE5VTEwpLAorICAgICAgbUdyb3VwKE5VTEwpIHsKKworICAgIExPR1YoIkNvbnN0cnVjdCBzb2Z0d2FyZSBBVkNFbmNvZGVyIik7CisKKyAgICBtSGFuZGxlID0gbmV3IHRhZ0FWQ0hhbmRsZTsKKyAgICBtZW1zZXQobUhhbmRsZSwgMCwgc2l6ZW9mKHRhZ0FWQ0hhbmRsZSkpOworICAgIG1IYW5kbGUtPkFWQ09iamVjdCA9IE5VTEw7CisgICAgbUhhbmRsZS0+dXNlckRhdGEgPSB0aGlzOworICAgIG1IYW5kbGUtPkNCQVZDX0RQQkFsbG9jID0gRHBiQWxsb2NXcmFwcGVyOworICAgIG1IYW5kbGUtPkNCQVZDX0ZyYW1lQmluZCA9IEJpbmRGcmFtZVdyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfRnJhbWVVbmJpbmQgPSBVbmJpbmRGcmFtZVdyYXBwZXI7CisgICAgbUhhbmRsZS0+Q0JBVkNfTWFsbG9jID0gTWFsbG9jV3JhcHBlcjsKKyAgICBtSGFuZGxlLT5DQkFWQ19GcmVlID0gRnJlZVdyYXBwZXI7CisKKyAgICBtSW5pdENoZWNrID0gaW5pdENoZWNrKG1ldGEpOworfQorCitBVkNFbmNvZGVyOjp+QVZDRW5jb2RlcigpIHsKKyAgICBMT0dWKCJEZXN0cnVjdCBzb2Z0d2FyZSBBVkNFbmNvZGVyIik7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHN0b3AoKTsKKyAgICB9CisKKyAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICBkZWxldGUgbUhhbmRsZTsKK30KKworc3RhdHVzX3QgQVZDRW5jb2Rlcjo6aW5pdENoZWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSkgeworICAgIExPR1YoImluaXRDaGVjayIpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZtVmlkZW9XaWR0aCkpOworICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmbVZpZGVvSGVpZ2h0KSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVZpZGVvRnJhbWVSYXRlKSk7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmbVZpZGVvQml0UmF0ZSkpOworCisgICAgLy8gWFhYOiBBZGQgbW9yZSBjb2xvciBmb3JtYXQgc3VwcG9ydAorICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMihrS2V5Q29sb3JGb3JtYXQsICZtVmlkZW9Db2xvckZvcm1hdCkpOworICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7CisgICAgICAgIGlmIChtVmlkZW9Db2xvckZvcm1hdCAhPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgeworICAgICAgICAgICAgTE9HRSgiQ29sb3IgZm9ybWF0ICVkIGlzIG5vdCBzdXBwb3J0ZWQiLCBtVmlkZW9Db2xvckZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIC8vIEFsbG9jYXRlIHNwYXJlIGJ1ZmZlciBvbmx5IHdoZW4gY29sb3IgY29udmVyc2lvbiBpcyBuZWVkZWQuCisgICAgICAgIC8vIEFzc3VtZSB0aGUgY29sb3IgZm9ybWF0IGlzIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLgorICAgICAgICBtSW5wdXRGcmFtZURhdGEgPQorICAgICAgICAgICAgKHVpbnQ4X3QgKikgbWFsbG9jKChtVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCAqIDMgKSA+PiAxKTsKKyAgICAgICAgQ0hFQ0sobUlucHV0RnJhbWVEYXRhKTsKKyAgICB9CisKKyAgICAvLyBYWFg6IFJlbW92ZSB0aGlzIHJlc3RyaWN0aW9uCisgICAgaWYgKG1WaWRlb1dpZHRoICUgMTYgIT0gMCB8fCBtVmlkZW9IZWlnaHQgJSAxNiAhPSAwKSB7CisgICAgICAgIExPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1FbmNQYXJhbXMgPSBuZXcgdGFnQVZDRW5jUGFyYW07CisgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZihtRW5jUGFyYW1zKSk7CisgICAgbUVuY1BhcmFtcy0+d2lkdGggPSBtVmlkZW9XaWR0aDsKKyAgICBtRW5jUGFyYW1zLT5oZWlnaHQgPSBtVmlkZW9IZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZnJhbWVfcmF0ZSA9IDEwMDAgKiBtVmlkZW9GcmFtZVJhdGU7ICAvLyBJbiBmcmFtZXMvbXMhCisgICAgbUVuY1BhcmFtcy0+cmF0ZV9jb250cm9sID0gQVZDX09OOworICAgIG1FbmNQYXJhbXMtPmJpdHJhdGUgPSBtVmlkZW9CaXRSYXRlOworICAgIG1FbmNQYXJhbXMtPmluaXRRUCA9IDA7CisgICAgbUVuY1BhcmFtcy0+aW5pdF9DQlBfcmVtb3ZhbF9kZWxheSA9IDE2MDA7CisgICAgbUVuY1BhcmFtcy0+Q1BCX3NpemUgPSAodWludDMyX3QpIChtVmlkZW9CaXRSYXRlID4+IDEpOworCisgICAgbUVuY1BhcmFtcy0+aW50cmFtYl9yZWZyZXNoID0gMDsKKyAgICBtRW5jUGFyYW1zLT5hdXRvX3NjZCA9IEFWQ19PTjsKKyAgICBtRW5jUGFyYW1zLT5vdXRfb2ZfYmFuZF9wYXJhbV9zZXQgPSBBVkNfT047CisgICAgbUVuY1BhcmFtcy0+cG9jX3R5cGUgPSAyOworICAgIG1FbmNQYXJhbXMtPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNCA9IDEyOworICAgIG1FbmNQYXJhbXMtPmRlbHRhX3BvY196ZXJvX2ZsYWcgPSAwOworICAgIG1FbmNQYXJhbXMtPm9mZnNldF9wb2Nfbm9uX3JlZiA9IDA7CisgICAgbUVuY1BhcmFtcy0+b2Zmc2V0X3RvcF9ib3R0b20gPSAwOworICAgIG1FbmNQYXJhbXMtPm51bV9yZWZfaW5fY3ljbGUgPSAwOworICAgIG1FbmNQYXJhbXMtPm9mZnNldF9wb2NfcmVmID0gTlVMTDsKKworICAgIG1FbmNQYXJhbXMtPm51bV9yZWZfZnJhbWUgPSAxOworICAgIG1FbmNQYXJhbXMtPm51bV9zbGljZV9ncm91cCA9IDE7CisgICAgbUVuY1BhcmFtcy0+Zm1vX3R5cGUgPSAwOworCisgICAgbUVuY1BhcmFtcy0+ZGJfZmlsdGVyID0gQVZDX09OOworICAgIG1FbmNQYXJhbXMtPmRpc2FibGVfZGJfaWRjID0gMDsKKworICAgIG1FbmNQYXJhbXMtPmFscGhhX29mZnNldCA9IDA7CisgICAgbUVuY1BhcmFtcy0+YmV0YV9vZmZzZXQgPSAwOworICAgIG1FbmNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgPSBBVkNfT0ZGOworCisgICAgbUVuY1BhcmFtcy0+ZGF0YV9wYXIgPSBBVkNfT0ZGOworICAgIG1FbmNQYXJhbXMtPmZ1bGxzZWFyY2ggPSBBVkNfT0ZGOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaF9yYW5nZSA9IDE2OworICAgIG1FbmNQYXJhbXMtPnN1Yl9wZWwgPSBBVkNfT0ZGOworICAgIG1FbmNQYXJhbXMtPnN1Ym1iX3ByZWQgPSBBVkNfT0ZGOworICAgIG1FbmNQYXJhbXMtPnJkb3B0X21vZGUgPSBBVkNfT0ZGOworICAgIG1FbmNQYXJhbXMtPmJpZGlyX3ByZWQgPSBBVkNfT0ZGOworICAgIGludDMyX3Qgbk1hY3JvQmxvY2tzID0gKCgoKG1WaWRlb1dpZHRoICsgMTUpID4+IDQpIDw8IDQpICoKKyAgICAgICAgICAgICgoKG1WaWRlb0hlaWdodCArIDE1KSA+PiA0KSA8PCA0KSkgPj4gODsKKyAgICB1aW50MzJfdCAqc2xpY2VHcm91cCA9ICh1aW50MzJfdCAqKSBtYWxsb2Moc2l6ZW9mKHVpbnQzMl90KSAqIG5NYWNyb0Jsb2Nrcyk7CisgICAgZm9yIChpbnQgaWkgPSAwLCBpZHggPSAwOyBpaSA8IG5NYWNyb0Jsb2NrczsgKytpaSkgeworICAgICAgICBzbGljZUdyb3VwW2lpXSA9IGlkeCsrOworICAgICAgICBpZiAoaWR4ID49IG1FbmNQYXJhbXMtPm51bV9zbGljZV9ncm91cCkgeworICAgICAgICAgICAgaWR4ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRW5jUGFyYW1zLT5zbGljZV9ncm91cCA9IHNsaWNlR3JvdXA7CisKKyAgICBtRW5jUGFyYW1zLT51c2Vfb3ZlcnJ1bl9idWZmZXIgPSBBVkNfT0ZGOworCisgICAgLy8gU2V0IElEUiBmcmFtZSByZWZyZXNoIGludGVydmFsCisgICAgaW50MzJfdCBpRnJhbWVzSW50ZXJ2YWxTZWM7CisgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlJRnJhbWVzSW50ZXJ2YWwsICZpRnJhbWVzSW50ZXJ2YWxTZWMpKTsKKyAgICBpZiAoaUZyYW1lc0ludGVydmFsU2VjIDwgMCkgeworICAgICAgICBtRW5jUGFyYW1zLT5pZHJfcGVyaW9kID0gLTE7CisgICAgfSBlbHNlIGlmIChpRnJhbWVzSW50ZXJ2YWxTZWMgPT0gMCkgeworICAgICAgICBtRW5jUGFyYW1zLT5pZHJfcGVyaW9kID0gMTsgIC8vIEFsbCBJIGZyYW1lcworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmNQYXJhbXMtPmlkcl9wZXJpb2QgPQorICAgICAgICAgICAgKGlGcmFtZXNJbnRlcnZhbFNlYyAqIG1WaWRlb0ZyYW1lUmF0ZSk7CisgICAgfQorICAgIExPR1YoImlkcl9wZXJpb2Q6ICVkLCBJLWZyYW1lcyBpbnRlcnZhbDogJWQgc2Vjb25kcywgYW5kIGZyYW1lIHJhdGU6ICVkIiwKKyAgICAgICAgbUVuY1BhcmFtcy0+aWRyX3BlcmlvZCwgaUZyYW1lc0ludGVydmFsU2VjLCBtVmlkZW9GcmFtZVJhdGUpOworCisgICAgLy8gU2V0IHByb2ZpbGUgYW5kIGxldmVsCisgICAgLy8gSWYgcHJvZmlsZSBhbmQgbGV2ZWwgc2V0dGluZyBpcyBub3QgY29ycmVjdCwgZmFpbHVyZQorICAgIC8vIGlzIHJlcG9ydGVkIHdoZW4gdGhlIGVuY29kZXIgaXMgaW5pdGlhbGl6ZWQuCisgICAgbUVuY1BhcmFtcy0+cHJvZmlsZSA9IEFWQ19CQVNFTElORTsKKyAgICBtRW5jUGFyYW1zLT5sZXZlbCA9IEFWQ19MRVZFTDNfMjsKKyAgICBpbnQzMl90IHByb2ZpbGUsIGxldmVsOworICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleVZpZGVvUHJvZmlsZSwgJnByb2ZpbGUpKSB7CisgICAgICAgIG1FbmNQYXJhbXMtPnByb2ZpbGUgPSAoQVZDUHJvZmlsZSkgcHJvZmlsZTsKKyAgICB9CisgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VmlkZW9MZXZlbCwgJmxldmVsKSkgeworICAgICAgICBtRW5jUGFyYW1zLT5sZXZlbCA9IChBVkNMZXZlbCkgbGV2ZWw7CisgICAgfQorCisKKyAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgbVZpZGVvV2lkdGgpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIG1WaWRlb0hlaWdodCk7CisgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUJpdFJhdGUsIG1WaWRlb0JpdFJhdGUpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtVmlkZW9GcmFtZVJhdGUpOworICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDb2xvckZvcm1hdCwgbVZpZGVvQ29sb3JGb3JtYXQpOworICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleURlY29kZXJDb21wb25lbnQsICJBVkNFbmNvZGVyIik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBVkNFbmNvZGVyOjpzdGFydChNZXRhRGF0YSAqcGFyYW1zKSB7CisgICAgTE9HVigic3RhcnQiKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdGFydCgpIHdoZW4gZW5jb2RlciBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFWQ0VuY19TdGF0dXMgZXJyOworICAgIGVyciA9IFBWQVZDRW5jSW5pdGlhbGl6ZShtSGFuZGxlLCBtRW5jUGFyYW1zLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyICE9IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgIExPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyOiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgaW50MzJfdCBtYXhTaXplOworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPQorICAgICAgICBQVkFWQ0VuY0dldE1heE91dHB1dEJ1ZmZlclNpemUobUhhbmRsZSwgJm1heFNpemUpKSB7CisgICAgICAgIG1heFNpemUgPSAzMTU4NDsgIC8vIE1hZ2ljICMKKyAgICB9CisgICAgbUdyb3VwLT5hZGRfYnVmZmVyKG5ldyBNZWRpYUJ1ZmZlcihtYXhTaXplKSk7CisKKyAgICBtU291cmNlLT5zdGFydChwYXJhbXMpOworICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0yOyAgLy8gMXN0IHR3byBidWZmZXJzIGNvbnRhaW4gU1BTIGFuZCBQUFMKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gdHJ1ZTsKKyAgICBtSXNJRFJGcmFtZSA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEFWQ0VuY29kZXI6OnN0b3AoKSB7CisgICAgTE9HVigic3RvcCIpOworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgTE9HVygiQ2FsbCBzdG9wKCkgd2hlbiBlbmNvZGVyIGhhcyBub3Qgc3RhcnRlZCIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobUdyb3VwKSB7CisgICAgICAgIGRlbGV0ZSBtR3JvdXA7CisgICAgICAgIG1Hcm91cCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEZyYW1lRGF0YSkgeworICAgICAgICBkZWxldGUgbUlucHV0RnJhbWVEYXRhOworICAgICAgICBtSW5wdXRGcmFtZURhdGEgPSBOVUxMOworICAgIH0KKworICAgIFBWQVZDQ2xlYW5VcEVuY29kZXIobUhhbmRsZSk7CisgICAgbVNvdXJjZS0+c3RvcCgpOworICAgIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBBVkNFbmNvZGVyOjpyZWxlYXNlT3V0cHV0QnVmZmVycygpIHsKKyAgICBMT0dWKCJyZWxlYXNlT3V0cHV0QnVmZmVycyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG1PdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIoTlVMTCk7CisgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgIH0KKyAgICBtT3V0cHV0QnVmZmVycy5jbGVhcigpOworfQorCitzcDxNZXRhRGF0YT4gQVZDRW5jb2Rlcjo6Z2V0Rm9ybWF0KCkgeworICAgIExPR1YoImdldEZvcm1hdCIpOworICAgIHJldHVybiBtRm9ybWF0OworfQorCitzdGF0dXNfdCBBVkNFbmNvZGVyOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgIENIRUNLKCFvcHRpb25zKTsKKyAgICAqb3V0ID0gTlVMTDsKKworICAgIE1lZGlhQnVmZmVyICpvdXRwdXRCdWZmZXI7CisgICAgQ0hFQ0tfRVEoT0ssIG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm91dHB1dEJ1ZmZlcikpOworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopIG91dHB1dEJ1ZmZlci0+ZGF0YSgpOworICAgIHVpbnQzMl90IGRhdGFMZW5ndGggPSBvdXRwdXRCdWZmZXItPnNpemUoKTsKKworICAgIGludDMyX3QgdHlwZTsKKyAgICBBVkNFbmNfU3RhdHVzIGVuY29kZXJTdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIC8vIFJldHVybiBTUFMgYW5kIFBQUyBmb3IgdGhlIGZpcnN0IHR3byBidWZmZXJzCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgZW5jb2RlclN0YXR1cyA9IFBWQVZDRW5jb2RlTkFMKG1IYW5kbGUsIG91dFB0ciwgJmRhdGFMZW5ndGgsICZ0eXBlKTsKKyAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1dST05HX1NUQVRFKSB7CisgICAgICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICAgICAgQ0hFQ0tfRVEoMCwgbU51bUlucHV0RnJhbWVzKTsgIC8vIDFzdCB2aWRlbyBmcmFtZSBpcyAwCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1NQUzoKKyAgICAgICAgICAgICAgICBjYXNlIEFWQ19OQUxUWVBFX1BQUzoKKyAgICAgICAgICAgICAgICAgICAgTE9HVigiJXMgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09IEFWQ19OQUxUWVBFX1NQUyk/ICJTUFMiOiAiUFBTIik7CisgICAgICAgICAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCBkYXRhTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgKm91dCA9IG91dHB1dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR0UoIk5hbCB0eXBlICglZCkgb3RoZXIgdGhhbiBTUFMvUFBTIGlzIHVuZXhwZWN0ZWQiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBHZXQgbmV4dCBpbnB1dCB2aWRlbyBmcmFtZQorICAgIGlmIChtUmVhZHlGb3JOZXh0RnJhbWUpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnJlYWQoJm1JbnB1dEJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPR0UoIkZhaWxlZCB0byByZWFkIGlucHV0IHZpZGVvIGZyYW1lOiAlZCIsIGVycik7CisgICAgICAgICAgICBvdXRwdXRCdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCktPmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOworICAgICAgICBvdXRwdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICAgICBBVkNGcmFtZUlPIHZpZGVvSW5wdXQ7CisgICAgICAgIG1lbXNldCgmdmlkZW9JbnB1dCwgMCwgc2l6ZW9mKHZpZGVvSW5wdXQpKTsKKyAgICAgICAgdmlkZW9JbnB1dC5oZWlnaHQgPSAoKG1WaWRlb0hlaWdodCAgKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgdmlkZW9JbnB1dC5waXRjaCA9ICgobVZpZGVvV2lkdGggKyAxNSkgPj4gNCkgPDwgNDsKKyAgICAgICAgdmlkZW9JbnB1dC5jb2RpbmdfdGltZXN0YW1wID0gKHRpbWVVcyArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKKyAgICAgICAgdWludDhfdCAqaW5wdXREYXRhID0gKHVpbnQ4X3QgKikgbUlucHV0QnVmZmVyLT5kYXRhKCk7CisKKyAgICAgICAgaWYgKG1WaWRlb0NvbG9yRm9ybWF0ICE9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpIHsKKyAgICAgICAgICAgIENIRUNLKG1JbnB1dEZyYW1lRGF0YSk7CisgICAgICAgICAgICBDSEVDSyhtVmlkZW9Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgICAgICBDb252ZXJ0WVVWNDIwU2VtaVBsYW5hclRvWVVWNDIwUGxhbmFyKAorICAgICAgICAgICAgICAgIGlucHV0RGF0YSwgbUlucHV0RnJhbWVEYXRhLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKKyAgICAgICAgICAgIGlucHV0RGF0YSA9IG1JbnB1dEZyYW1lRGF0YTsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhpbnB1dERhdGEgIT0gTlVMTCk7CisgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMF0gPSBpbnB1dERhdGE7CisgICAgICAgIHZpZGVvSW5wdXQuWUNiQ3JbMV0gPSB2aWRlb0lucHV0LllDYkNyWzBdICsgdmlkZW9JbnB1dC5oZWlnaHQgKiB2aWRlb0lucHV0LnBpdGNoOworICAgICAgICB2aWRlb0lucHV0LllDYkNyWzJdID0gdmlkZW9JbnB1dC5ZQ2JDclsxXSArCisgICAgICAgICAgICAoKHZpZGVvSW5wdXQuaGVpZ2h0ICogdmlkZW9JbnB1dC5waXRjaCkgPj4gMik7CisgICAgICAgIHZpZGVvSW5wdXQuZGlzcF9vcmRlciA9IG1OdW1JbnB1dEZyYW1lczsKKworICAgICAgICBlbmNvZGVyU3RhdHVzID0gUFZBVkNFbmNTZXRJbnB1dChtSGFuZGxlLCAmdmlkZW9JbnB1dCk7CisgICAgICAgIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTIHx8CisgICAgICAgICAgICBlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19ORVdfSURSKSB7CisgICAgICAgICAgICBtUmVhZHlGb3JOZXh0RnJhbWUgPSBmYWxzZTsKKyAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICAgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX05FV19JRFIpIHsKKyAgICAgICAgICAgICAgICBtSXNJRFJGcmFtZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlci0+c2V0X3JhbmdlKDAsIDApOworICAgICAgICAgICAgICAgICpvdXQgPSBvdXRwdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW5jb2RlIGFuIGlucHV0IHZpZGVvIGZyYW1lCisgICAgQ0hFQ0soZW5jb2RlclN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUyB8fAorICAgICAgICAgIGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX05FV19JRFIpOworICAgIGRhdGFMZW5ndGggPSBvdXRwdXRCdWZmZXItPnNpemUoKTsgIC8vIFJlc2V0IHRoZSBvdXRwdXQgYnVmZmVyIGxlbmd0aAorICAgIGVuY29kZXJTdGF0dXMgPSBQVkFWQ0VuY29kZU5BTChtSGFuZGxlLCBvdXRQdHIsICZkYXRhTGVuZ3RoLCAmdHlwZSk7CisgICAgaWYgKGVuY29kZXJTdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBtSXNJRFJGcmFtZSk7CisgICAgICAgIENIRUNLX0VRKE5VTEwsIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihtSGFuZGxlKSk7CisgICAgfSBlbHNlIGlmIChlbmNvZGVyU3RhdHVzID09IEFWQ0VOQ19QSUNUVVJFX1JFQURZKSB7CisgICAgICAgIENIRUNLX0VRKE5VTEwsIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihtSGFuZGxlKSk7CisgICAgICAgIGlmIChtSXNJRFJGcmFtZSkgeworICAgICAgICAgICAgb3V0cHV0QnVmZmVyLT5tZXRhX2RhdGEoKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCBtSXNJRFJGcmFtZSk7CisgICAgICAgICAgICBtSXNJRFJGcmFtZSA9IDA7CisgICAgICAgICAgICBMT0dWKCJPdXRwdXQgYW4gSURSIGZyYW1lIik7CisgICAgICAgIH0KKyAgICAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lID0gdHJ1ZTsKKyAgICAgICAgQVZDRnJhbWVJTyByZWNvbjsKKyAgICAgICAgaWYgKFBWQVZDRW5jR2V0UmVjb24obUhhbmRsZSwgJnJlY29uKSA9PSBBVkNFTkNfU1VDQ0VTUykgeworICAgICAgICAgICAgUFZBVkNFbmNSZWxlYXNlUmVjb24obUhhbmRsZSwgJnJlY29uKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRhdGFMZW5ndGggPSAwOworICAgICAgICBtUmVhZHlGb3JOZXh0RnJhbWUgPSB0cnVlOworICAgIH0KKyAgICBpZiAoZW5jb2RlclN0YXR1cyA8IEFWQ0VOQ19TVUNDRVNTKSB7CisgICAgICAgIG91dHB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvdXRwdXRCdWZmZXItPnNldF9yYW5nZSgwLCBkYXRhTGVuZ3RoKTsKKyAgICAqb3V0ID0gb3V0cHV0QnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworaW50MzJfdCBBVkNFbmNvZGVyOjphbGxvY091dHB1dEJ1ZmZlcnMoCisgICAgICAgIHVuc2lnbmVkIGludCBzaXplSW5NYnMsIHVuc2lnbmVkIGludCBudW1CdWZmZXJzKSB7CisgICAgQ0hFQ0sobU91dHB1dEJ1ZmZlcnMuaXNFbXB0eSgpKTsKKyAgICBzaXplX3QgZnJhbWVTaXplID0gKHNpemVJbk1icyA8PCA3KSAqIDM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAgbnVtQnVmZmVyczsgKytpKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoZnJhbWVTaXplKTsKKyAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKKyAgICAgICAgbU91dHB1dEJ1ZmZlcnMucHVzaChidWZmZXIpOworICAgIH0KKworICAgIHJldHVybiAxOworfQorCit2b2lkIEFWQ0VuY29kZXI6OnVuYmluZE91dHB1dEJ1ZmZlcihpbnQzMl90IGluZGV4KSB7CisgICAgQ0hFQ0soaW5kZXggPj0gMCk7Cit9CisKK2ludDMyX3QgQVZDRW5jb2Rlcjo6YmluZE91dHB1dEJ1ZmZlcihpbnQzMl90IGluZGV4LCB1aW50OF90ICoqeXV2KSB7CisgICAgQ0hFQ0soaW5kZXggPj0gMCk7CisgICAgQ0hFQ0soaW5kZXggPCAoaW50MzJfdCkgbU91dHB1dEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLT5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICBtT3V0cHV0QnVmZmVyc1tpbmRleF0tPm1ldGFfZGF0YSgpLT5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKworICAgICp5dXYgPSAodWludDhfdCAqKSBtT3V0cHV0QnVmZmVyc1tpbmRleF0tPmRhdGEoKTsKKworICAgIHJldHVybiAxOworfQorCit2b2lkIEFWQ0VuY29kZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyICpidWZmZXIpIHsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIEFWQ0VuY29kZXIuY3BwIFwKKyAgICBzcmMvYXZjZW5jX2FwaS5jcHAgXAorICAgIHNyYy9iaXRzdHJlYW1faW8uY3BwIFwKKyAgICBzcmMvYmxvY2suY3BwIFwKKyAgICBzcmMvZmluZGhhbGZwZWwuY3BwIFwKKyAgICBzcmMvaGVhZGVyLmNwcCBcCisgICAgc3JjL2luaXQuY3BwIFwKKyAgICBzcmMvaW50cmFfZXN0LmNwcCBcCisgICAgc3JjL21vdGlvbl9jb21wLmNwcCBcCisgICAgc3JjL21vdGlvbl9lc3QuY3BwIFwKKyAgICBzcmMvcmF0ZV9jb250cm9sLmNwcCBcCisgICAgc3JjL3Jlc2lkdWFsLmNwcCBcCisgICAgc3JjL3NhZC5jcHAgXAorICAgIHNyYy9zYWRfaGFsZnBlbC5jcHAgXAorICAgIHNyYy9zbGljZS5jcHAgXAorICAgIHNyYy92bGNfZW5jb2RlLmNwcAorCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodF9hdmNlbmMKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgJChMT0NBTF9QQVRIKS9zcmMgXAorICAgICQoTE9DQUxfUEFUSCkvLi4vY29tbW9uL2luY2x1ZGUgXAorICAgICQoVE9QKS9leHRlcm5hbC9vcGVuY29yZS9leHRlcm5fbGlic192Mi9raHJvbm9zL29wZW5tYXgvaW5jbHVkZSBcCisgICAgJChUT1ApL2ZyYW1ld29ya3MvYmFzZS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlCisKK0xPQ0FMX0NGTEFHUyA6PSBcCisgICAgLURfX2FybV9fIFwKKyAgICAtRE9TQ0xfSU1QT1JUX1JFRj0gLURPU0NMX1VOVVNFRF9BUkc9IC1ET1NDTF9FWFBPUlRfUkVGPQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2FwaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5ODg1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmNwcApAQCAtMCwwICsxLDc0NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfYXBpLmgiCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDR2V0TkFMVHlwZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBTbmlmZiBOQUwgdHlwZSBmcm9tIHRoZSBiaXRzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VlZCwgQVZDRU5DX0ZBSUwgaWYgZmFpbC4gICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXROQUxUeXBlKHVuc2lnbmVkIGNoYXIgKmJpdHN0cmVhbSwgaW50IHNpemUsCisgICAgICAgIGludCAqbmFsX3R5cGUsIGludCAqbmFsX3JlZl9pZGMpCit7CisgICAgaW50IGZvcmJpZGRlbl96ZXJvX2JpdDsKKyAgICBpZiAoc2l6ZSA+IDApCisgICAgeworICAgICAgICBmb3JiaWRkZW5femVyb19iaXQgPSBiaXRzdHJlYW1bMF0gPj4gNzsKKyAgICAgICAgaWYgKGZvcmJpZGRlbl96ZXJvX2JpdCAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICAqbmFsX3JlZl9pZGMgPSAoYml0c3RyZWFtWzBdICYgMHg2MCkgPj4gNTsKKyAgICAgICAgKm5hbF90eXBlID0gYml0c3RyZWFtWzBdICYgMHgxRjsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfRkFJTDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jSW5pdGlhbGl6ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMy8xOC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBJbml0aWFsaXplIHRoZSBlbmNvZGVyIGxpYnJhcnksIGFsbG9jYXRlIG1lbW9yeSBhbmQgdmVyaWZ5ICAgKi8KKy8qICAgICAgICAgICAgICB0aGUgcHJvZmlsZS9sZXZlbCBzdXBwb3J0L3NldHRpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogRW5jb2RpbmcgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0luaXRpYWxpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyAqZW5jUGFyYW0sCisgICAgICAgIHZvaWQqIGV4dFNQUywgdm9pZCogZXh0UFBTKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW87CisgICAgdWludDMyICp1c2VyRGF0YSA9ICh1aW50MzIqKSBhdmNIYW5kbGUtPnVzZXJEYXRhOworICAgIGludCBmcmFtZXNpemU7CisKKyAgICBpZiAoYXZjSGFuZGxlLT5BVkNPYmplY3QgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfQUxSRUFEWV9JTklUSUFMSVpFRDsgLyogSXQncyBhbHJlYWR5IGluaXRpYWxpemVkLCBuZWVkIHRvIGNsZWFudXAgZmlyc3QgKi8KKyAgICB9CisKKyAgICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KKworICAgIC8qIGFsbG9jYXRlIHZpZGVvT2JqZWN0ICovCisgICAgYXZjSGFuZGxlLT5BVkNPYmplY3QgPSAodm9pZCopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNFbmNPYmplY3QpLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChhdmNIYW5kbGUtPkFWQ09iamVjdCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBlbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgbWVtc2V0KGVuY3ZpZCwgMCwgc2l6ZW9mKEFWQ0VuY09iamVjdCkpOyAvKiByZXNldCBldmVyeXRoaW5nICovCisKKyAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19Jbml0aWFsaXppbmc7CisKKyAgICBlbmN2aWQtPmF2Y0hhbmRsZSA9IGF2Y0hhbmRsZTsKKworICAgIGVuY3ZpZC0+Y29tbW9uID0gKEFWQ0NvbW1vbk9iaiopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDQ29tbW9uT2JqKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5jb21tb24gPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBtZW1zZXQodmlkZW8sIDAsIHNpemVvZihBVkNDb21tb25PYmopKTsKKworICAgIC8qIGFsbG9jYXRlIGJpdHN0cmVhbSBzdHJ1Y3R1cmUgKi8KKyAgICBlbmN2aWQtPmJpdHN0cmVhbSA9IChBVkNFbmNCaXRzdHJlYW0qKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0VuY0JpdHN0cmVhbSksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+Yml0c3RyZWFtID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBlbmN2aWQtPmJpdHN0cmVhbS0+ZW5jdmlkID0gZW5jdmlkOyAvKiB0byBwb2ludCBiYWNrIGZvciByZWFsbG9jYXRpb24gKi8KKworICAgIC8qIGFsbG9jYXRlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlICovCisgICAgdmlkZW8tPmN1cnJTZXFQYXJhbXMgPSAoQVZDU2VxUGFyYW1TZXQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1NlcVBhcmFtU2V0KSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPmN1cnJTZXFQYXJhbXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+Y3VyclNlcVBhcmFtcywgMCwgc2l6ZW9mKEFWQ1NlcVBhcmFtU2V0KSk7CisKKyAgICAvKiBhbGxvY2F0ZSBwaWN0dXJlIHBhcmFtZXRlciBzZXQgc3RydWN0dXJlICovCisgICAgdmlkZW8tPmN1cnJQaWNQYXJhbXMgPSAoQVZDUGljUGFyYW1TZXQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ1BpY1BhcmFtU2V0KSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+Y3VyclBpY1BhcmFtcywgMCwgc2l6ZW9mKEFWQ1BpY1BhcmFtU2V0KSk7CisKKyAgICAvKiBhbGxvY2F0ZSBzbGljZSBoZWFkZXIgc3RydWN0dXJlICovCisgICAgdmlkZW8tPnNsaWNlSGRyID0gKEFWQ1NsaWNlSGVhZGVyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNTbGljZUhlYWRlciksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5zbGljZUhkciA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisgICAgbWVtc2V0KHZpZGVvLT5zbGljZUhkciwgMCwgc2l6ZW9mKEFWQ1NsaWNlSGVhZGVyKSk7CisKKyAgICAvKiBhbGxvY2F0ZSBlbmNvZGVkIHBpY3R1cmUgYnVmZmVyIHN0cnVjdHVyZSovCisgICAgdmlkZW8tPmRlY1BpY0J1ZiA9IChBVkNEZWNQaWNCdWZmZXIqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKEFWQ0RlY1BpY0J1ZmZlciksIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldCh2aWRlby0+ZGVjUGljQnVmLCAwLCBzaXplb2YoQVZDRGVjUGljQnVmZmVyKSk7CisKKyAgICAvKiBhbGxvY2F0ZSByYXRlIGNvbnRyb2wgc3RydWN0dXJlICovCisgICAgZW5jdmlkLT5yYXRlQ3RybCA9IChBVkNSYXRlQ29udHJvbCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKHVzZXJEYXRhLCBzaXplb2YoQVZDUmF0ZUNvbnRyb2wpLCBERUZBVUxUX0FUVFIpOworICAgIGlmIChlbmN2aWQtPnJhdGVDdHJsID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX01FTU9SWV9GQUlMOworICAgIH0KKyAgICBtZW1zZXQoZW5jdmlkLT5yYXRlQ3RybCwgMCwgc2l6ZW9mKEFWQ1JhdGVDb250cm9sKSk7CisKKyAgICAvKiByZXNldCBmcmFtZSBsaXN0LCBub3QgcmVhbGx5IG5lZWRlZCAqLworICAgIHZpZGVvLT5jdXJyUGljID0gTlVMTDsKKyAgICB2aWRlby0+Y3VyckZTID0gTlVMTDsKKyAgICBlbmN2aWQtPmN1cnJJbnB1dCA9IE5VTEw7CisgICAgdmlkZW8tPnByZXZSZWZQaWMgPSBOVUxMOworCisgICAgLyogbm93IHJlYWQgZW5jUGFyYW1zLCBhbmQgYWxsb2NhdGUgZGltZW5zaW9uLWRlcGVuZGVudCB2YXJpYWJsZXMgKi8KKyAgICAvKiBzdWNoIGFzIG1ibG9jayAqLworICAgIHN0YXR1cyA9IFNldEVuY29kZVBhcmFtKGF2Y0hhbmRsZSwgZW5jUGFyYW0sIGV4dFNQUywgZXh0UFBTKTsgLyogaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHRvIGJlIHVzZWQgaW4gU1BTKi8KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoZW5jUGFyYW0tPnVzZV9vdmVycnVuX2J1ZmZlciA9PSBBVkNfT04pCisgICAgeworICAgICAgICAvKiBhbGxvY2F0ZSBvdmVycnVuIGJ1ZmZlciAqLworICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IGVuY3ZpZC0+cmF0ZUN0cmwtPmNwYlNpemU7CisgICAgICAgIGlmIChlbmN2aWQtPm9CU2l6ZSA+IERFRkFVTFRfT1ZFUlJVTl9CVUZGRVJfU0laRSkKKyAgICAgICAgeworICAgICAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBERUZBVUxUX09WRVJSVU5fQlVGRkVSX1NJWkU7CisgICAgICAgIH0KKyAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gKHVpbnQ4KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIGVuY3ZpZC0+b0JTaXplLCBERUZBVUxUX0FUVFIpOworICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5vQlNpemUgPSAwOworICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGZyYW1lIHNpemUgZGVwZW5kZW50IHN0cnVjdHVyZXMgKi8KKyAgICBmcmFtZXNpemUgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1icyAqIHZpZGVvLT5QaWNXaWR0aEluTWJzOworCisgICAgdmlkZW8tPm1ibG9jayA9IChBVkNNYWNyb2Jsb2NrKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNNYWNyb2Jsb2NrKSAqIGZyYW1lc2l6ZSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAodmlkZW8tPm1ibG9jayA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXAgPSAoaW50KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50KSAqIHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAqIDIsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBlbmN2aWQtPm1vdDE2eDE2ID0gKEFWQ01WKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNNVikgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+bW90MTZ4MTYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIG1lbXNldChlbmN2aWQtPm1vdDE2eDE2LCAwLCBzaXplb2YoQVZDTVYpKmZyYW1lc2l6ZSk7CisKKyAgICBlbmN2aWQtPmludHJhU2VhcmNoID0gKHVpbnQ4KikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZih1aW50OCkgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+aW50cmFTZWFyY2ggPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgZW5jdmlkLT5taW5fY29zdCA9IChpbnQqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKGludCkgKiBmcmFtZXNpemUsIERFRkFVTFRfQVRUUik7CisgICAgaWYgKGVuY3ZpZC0+bWluX2Nvc3QgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBtb3Rpb24gc2VhcmNoIHJlbGF0ZWQgbWVtb3J5ICovCisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IEluaXRNb3Rpb25TZWFyY2hNb2R1bGUoYXZjSGFuZGxlKSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorCisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IEluaXRSYXRlQ29udHJvbE1vZHVsZShhdmNIYW5kbGUpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICAvKiBpbnRpYWxpemUgZnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlciA9IChBVkNFbmNGdW5jUHRyKikgYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2ModXNlckRhdGEsIHNpemVvZihBVkNFbmNGdW5jUHRyKSwgREVGQVVMVF9BVFRSKTsKKyAgICBpZiAoZW5jdmlkLT5mdW5jdGlvblBvaW50ZXIgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgfQorICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTWFjcm9ibG9jayA9ICZBVkNTQURfTWFjcm9ibG9ja19DOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzFdID0gJkFWQ1NBRF9NQl9IYWxmUGVsX0N4aDsKKyAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMl0gPSAmQVZDU0FEX01CX0hhbGZQZWxfQ3loOworICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZBVkNTQURfTUJfSGFsZlBlbF9DeGh5aDsKKworICAgIC8qIGluaXRpYWxpemUgdGltaW5nIGNvbnRyb2wgKi8KKyAgICBlbmN2aWQtPm1vZFRpbWVSZWYgPSAwOyAgICAgLyogQUxXQVlTIEFTU1VNRSBUSEFUIFRJTUVTVEFNUCBTVEFSVCBGUk9NIDAgISEhKi8KKyAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gMDsKKyAgICBlbmN2aWQtPnByZXZDb2RlZEZyYW1lTnVtID0gMDsKKyAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSAwOworCisgICAgaWYgKGVuY3ZpZC0+b3V0T2ZCYW5kUGFyYW1TZXQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX1NQUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0dldE1heE91dHB1dFNpemUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDExLzI5LzIwMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogUmV0dXJuIG1heCBvdXRwdXQgYnVmZmVyIHNpemUgdGhhdCBhcHBzIHNob3VsZCBhbGxvY2F0ZSBmb3IgICovCisvKiAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgIHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldE1heE91dHB1dEJ1ZmZlclNpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCogc2l6ZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgICpzaXplID0gZW5jdmlkLT5yYXRlQ3RybC0+Y3BiU2l6ZTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY1NldElucHV0KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMTgvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gZmVlZCBhbiB1bmVuY29kZWQgb3JpZ2luYWwgZnJhbWUgdG8gdGhlIGVuY29kZXIgbGlicmFyeS4gICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1vZGlmaWVkIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jU2V0SW5wdXQoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKmlucHV0KQoreworICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkID0gKEFWQ0VuY09iamVjdCopYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGZyYW1lTnVtOworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgIGlmIChlbmN2aWQtPmVuY19zdGF0ZSA9PSBBVkNFbmNfV2FpdGluZ0ZvckJ1ZmZlcikKKyAgICB7CisgICAgICAgIGdvdG8gUkVDQUxMX0lOSVRGUkFNRTsKKyAgICB9CisgICAgZWxzZSBpZiAoZW5jdmlkLT5lbmNfc3RhdGUgIT0gQVZDRW5jX0FuYWx5emluZ19GcmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPnBpdGNoID4gMHhGRkZGKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOyAvLyB3ZSB1c2UgMi1ieXRlcyBmb3IgcGl0Y2gKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAvKiBMZXQncyByYXRlIGNvbnRyb2wgZGVjaWRlIHdoZXRoZXIgdG8gZW5jb2RlIHRoaXMgZnJhbWUgb3Igbm90ICovCisgICAgLyogQWxzbyBzZXQgdmlkZW8tPm5hbF91bml0X3R5cGUsIHNsaWNlSGRyLT5zbGljZV90eXBlLCB2aWRlby0+c2xpY2VfdHlwZSAqLworICAgIGlmIChBVkNFTkNfU1VDQ0VTUyAhPSBSQ0RldGVybWluZUZyYW1lTnVtKGVuY3ZpZCwgcmF0ZUN0cmwsIGlucHV0LT5jb2RpbmdfdGltZXN0YW1wLCAmZnJhbWVOdW0pKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkU7IC8qIG5vdCB0aW1lIHRvIGVuY29kZSwgdGh1cyBza2lwcGluZyAqLworICAgIH0KKworICAgIC8qIHdlIG1heSBub3QgbmVlZCB0aGlzIGxpbmUgKi8KKyAgICAvL25leHRGcm1Nb2RUaW1lID0gKHVpbnQzMikoKCgoZnJhbWVOdW0rMSkqMTAwMCkvcmF0ZUN0cmwtPmZyYW1lX3JhdGUpICsgbW9kVGltZVJlZik7IC8qIHJlYy4gdGltZSAqLworICAgIC8vZW5jdmlkLT5uZXh0TW9kVGltZSA9IG5leHRGcm1Nb2RUaW1lIC0gKGVuY3ZpZC0+ZnJhbWVJbnRlcnZhbD4+MSkgLSAxOyAvKiBiZXR3ZWVuIGN1cnJlbnQgYW5kIG5leHQgZnJhbWUgKi8KKworICAgIGVuY3ZpZC0+Y3VycklucHV0ID0gaW5wdXQ7CisgICAgZW5jdmlkLT5jdXJySW5wdXQtPmNvZGluZ19vcmRlciA9IGZyYW1lTnVtOworCitSRUNBTExfSU5JVEZSQU1FOgorICAgIC8qIGluaXRpYWxpemUgYW5kIGFuYWx5emUgdGhlIGZyYW1lICovCisgICAgc3RhdHVzID0gSW5pdEZyYW1lKGVuY3ZpZCk7CisKKyAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU7CisgICAgfQorICAgIGVsc2UgaWYgKHN0YXR1cyA9PSBBVkNFTkNfTkVXX0lEUikKKyAgICB7CisgICAgICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0VuY29kaW5nX0ZyYW1lOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gYXNzdW1pbmcgdGhhdCBpbi1iYW5kIHBhcmFtc2V0IGtlZXBzIHNlbmRpbmcgbmV3IFNQUyBhbmQgUFBTLgorICAgICAgICB7CisgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19FbmNvZGluZ19TUFM7CisgICAgICAgICAgICAvL3ZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCsrOworICAgICAgICAgICAgLy9pZih2aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPiAzMSkgLy8gcmFuZ2UgY2hlY2sKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclNlcVBhcmFtcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAwOyAgLy8gcmVzZXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvLT5zbGljZUhkci0+aWRyX3BpY19pZCsrOworICAgICAgICBpZiAodmlkZW8tPnNsaWNlSGRyLT5pZHJfcGljX2lkID4gNjU1MzUpIC8vIHJhbmdlIGNoZWNrCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5zbGljZUhkci0+aWRyX3BpY19pZCA9IDA7ICAvLyByZXNldAorICAgICAgICB9CisgICAgfQorICAgIC8qIHRoZSBmb2xsb3dpbmcgbG9naWNzIG5lZWQgdG8gYmUgcmV2aXNpdGVkICovCisgICAgZWxzZSBpZiAoc3RhdHVzID09IEFWQ0VOQ19QSUNUVVJFX1JFQURZKSAvLyBubyBidWZmZXJzIHJldHVybmVkIGJhY2sgdG8gdGhlIGVuY29kZXIKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX1dhaXRpbmdGb3JCdWZmZXI7IC8vIElucHV0IGFjY2VwdGVkIGJ1dCBjYW4ndCBjb250aW51ZQorICAgICAgICAvLyBuZWVkIHRvIGZyZWUgdXAgc29tZSBtZW1vcnkgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBFbmNvZGUKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOyAvLyByZXR1cm4gc3RhdHVzLCBpbmNsdWRpbmcgdGhlIEFWQ0VOQ19GQUlMIGNhc2UgYW5kIGFsbCAzIGFib3ZlLgorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDRW5jb2RlTkFMKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8yOS8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBlbmNvZGUgb25lIE5BTC9zbGljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNvZGVOQUwoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50ICpidWZfbmFsX3NpemUsIGludCAqbmFsX3R5cGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KilhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmIChlbmN2aWQgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfVU5JTklUSUFMSVpFRDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuY3ZpZC0+ZW5jX3N0YXRlKQorICAgIHsKKyAgICAgICAgY2FzZSBBVkNFbmNfSW5pdGlhbGl6aW5nOgorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgICAgICBjYXNlIEFWQ0VuY19FbmNvZGluZ19TUFM6CisgICAgICAgICAgICAvKiBpbml0aWFsaXplZCB0aGUgc3RydWN0dXJlICovCisgICAgICAgICAgICBCaXRzdHJlYW1FbmNJbml0KGJpdHN0cmVhbSwgYnVmZmVyLCAqYnVmX25hbF9zaXplLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIDgsICgxIDw8IDUpIHwgQVZDX05BTFRZUEVfU1BTKTsKKworICAgICAgICAgICAgLyogZW5jb2RlIFNQUyAqLworICAgICAgICAgICAgc3RhdHVzID0gRW5jb2RlU1BTKGVuY3ZpZCwgYml0c3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2xvc2luZyB0aGUgTkFMIHdpdGggdHJhaWxpbmcgYml0cyAqLworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtVHJhaWxpbmdCaXRzKGJpdHN0cmVhbSwgYnVmX25hbF9zaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfUFBTOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zLT5zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICAgICAgICAgICAgICB2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQrKzsKKyAgICAgICAgICAgICAgICAqbmFsX3R5cGUgPSBBVkNfTkFMVFlQRV9TUFM7CisgICAgICAgICAgICAgICAgKmJ1Zl9uYWxfc2l6ZSA9IGJpdHN0cmVhbS0+d3JpdGVfcG9zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDRW5jX0VuY29kaW5nX1BQUzoKKyAgICAgICAgICAgIC8qIGluaXRpYWxpemVkIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbUVuY0luaXQoYml0c3RyZWFtLCBidWZmZXIsICpidWZfbmFsX3NpemUsIE5VTEwsIDApOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgOCwgKDEgPDwgNSkgfCBBVkNfTkFMVFlQRV9QUFMpOworCisgICAgICAgICAgICAvKiBlbmNvZGUgUFBTICovCisgICAgICAgICAgICBzdGF0dXMgPSBFbmNvZGVQUFMoZW5jdmlkLCBiaXRzdHJlYW0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjbG9zaW5nIHRoZSBOQUwgd2l0aCB0cmFpbGluZyBiaXRzICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoYml0c3RyZWFtLCBidWZfbmFsX3NpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBUUlVFKSAvLyBhbHJlYWR5IGV4dHJhY3QgUFBTLCBTUFMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZW5jX3N0YXRlID0gQVZDRW5jX0FuYWx5emluZ19GcmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAgICAvLyBTZXRJbnB1dCBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlIFNQUyBhbmQgUFBTLgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfRW5jb2RpbmdfRnJhbWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKm5hbF90eXBlID0gQVZDX05BTFRZUEVfUFBTOworICAgICAgICAgICAgICAgICpidWZfbmFsX3NpemUgPSBiaXRzdHJlYW0tPndyaXRlX3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDRW5jX0VuY29kaW5nX0ZyYW1lOgorICAgICAgICAgICAgLyogaW5pdGlhbGl6ZWQgdGhlIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgQml0c3RyZWFtRW5jSW5pdChiaXRzdHJlYW0sIGJ1ZmZlciwgKmJ1Zl9uYWxfc2l6ZSwgZW5jdmlkLT5vdmVycnVuQnVmZmVyLCBlbmN2aWQtPm9CU2l6ZSk7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCA4LCAodmlkZW8tPm5hbF9yZWZfaWRjIDw8IDUpIHwgKHZpZGVvLT5uYWxfdW5pdF90eXBlKSk7CisKKyAgICAgICAgICAgIC8qIFJlLW9yZGVyIHRoZSByZWZlcmVuY2UgbGlzdCBhY2NvcmRpbmcgdG8gdGhlIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKCkgKi8KKyAgICAgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgdG8gcmVvcmRlciB0aGUgbGlzdCBmb3IgdGhlIGVuY29kZXIgaGVyZS4gVGhpcyBjYW4gb25seSBiZSBkb25lCisgICAgICAgICAgICBhZnRlciB3ZSBlbmNvZGUgdGhpcyBzbGljZS4gV2UgY2FuIHJ1biB0aHJ1IGEgc2Vjb25kLXBhc3MgdG8gc2VlIGlmIG5ldyBvcmRlcmluZworICAgICAgICAgICAgd291bGQgc2F2ZSBtb3JlIGJpdHMuIFRvbyBtdWNoIGRlbGF5ICEhICovCisgICAgICAgICAgICAvKiBzdGF0dXMgPSBSZU9yZGVyTGlzdCh2aWRlbyk7Ki8KKyAgICAgICAgICAgIHN0YXR1cyA9IEluaXRTbGljZShlbmN2aWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiB3aGVuIHdlIGhhdmUgZXZlcnl0aGluZywgd2UgZW5jb2RlIHRoZSBzbGljZSBoZWFkZXIgKi8KKyAgICAgICAgICAgIHN0YXR1cyA9IEVuY29kZVNsaWNlSGVhZGVyKGVuY3ZpZCwgYml0c3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gQVZDRW5jb2RlU2xpY2UoZW5jdmlkKTsKKworICAgICAgICAgICAgdmlkZW8tPnNsaWNlX2lkKys7CisKKyAgICAgICAgICAgIC8qIGNsb3NpbmcgdGhlIE5BTCB3aXRoIHRyYWlsaW5nIGJpdHMgKi8KKyAgICAgICAgICAgIEJpdHN0cmVhbVRyYWlsaW5nQml0cyhiaXRzdHJlYW0sIGJ1Zl9uYWxfc2l6ZSk7CisKKyAgICAgICAgICAgICpidWZfbmFsX3NpemUgPSBiaXRzdHJlYW0tPndyaXRlX3BvczsKKworICAgICAgICAgICAgZW5jdmlkLT5yYXRlQ3RybC0+bnVtRnJhbWVCaXRzICs9ICgoKmJ1Zl9uYWxfc2l6ZSkgPDwgMyk7CisKKyAgICAgICAgICAgICpuYWxfdHlwZSA9IHZpZGVvLT5uYWxfdW5pdF90eXBlOworCisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19QSUNUVVJFX1JFQURZKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IFJDVXBkYXRlRnJhbWUoZW5jdmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkUpIC8qIHNraXAgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRFBCUmVsZWFzZUN1cnJlbnRGcmFtZShhdmNIYW5kbGUsIHZpZGVvKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5lbmNfc3RhdGUgPSBBVkNFbmNfQW5hbHl6aW5nX0ZyYW1lOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogcGVyZm9ybSBsb29wLWZpbHRlcmluZyBvbiB0aGUgZW50aXJlIGZyYW1lICovCisgICAgICAgICAgICAgICAgRGVibG9ja1BpY3R1cmUodmlkZW8pOworCisgICAgICAgICAgICAgICAgLyogdXBkYXRlIHRoZSBvcmlnaW5hbCBmcmFtZSBhcnJheSAqLworICAgICAgICAgICAgICAgIGVuY3ZpZC0+cHJldkNvZGVkRnJhbWVOdW0gPSBlbmN2aWQtPmN1cnJJbnB1dC0+Y29kaW5nX29yZGVyOworCisgICAgICAgICAgICAgICAgLyogc3RvcmUgdGhlIGVuY29kZWQgcGljdHVyZSBpbiB0aGUgRFBCIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIFN0b3JlUGljdHVyZUluRFBCKGF2Y0hhbmRsZSwgdmlkZW8pOworCisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyUGljLT5pc1JlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgUE9DIHJlbGF0ZWQgdmFyaWFibGVzICovCisgICAgICAgICAgICAgICAgUG9zdFBPQyh2aWRlbyk7CisKKyAgICAgICAgICAgICAgICBlbmN2aWQtPmVuY19zdGF0ZSA9IEFWQ0VuY19BbmFseXppbmdfRnJhbWU7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1BJQ1RVUkVfUkVBRFk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1dST05HX1NUQVRFOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogIEZ1bmN0aW9uIDogUFZBVkNFbmNHZXRPdmVycnVuQnVmZmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyByZXRyaWV2ZSB0aGUgb3ZlcnJ1biBidWZmZXIuIENoZWNrIHdoZXRoZXIgb3ZlcnJ1biBidWZmZXIgKi8KKy8qICAgICAgICAgICAgICBpcyB1c2VkIG9yIG5vdCBiZWZvcmUgcmV0dXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBQb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBvdmVycnVuIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgdWludDgqIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihBVkNIYW5kbGUqIGF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisKKyAgICBpZiAoYml0c3RyZWFtLT5vdmVycnVuQnVmZmVyID09IGJpdHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyKSAvKiBPQiBpcyB1c2VkICovCisgICAgeworICAgICAgICByZXR1cm4gZW5jdmlkLT5vdmVycnVuQnVmZmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBQVkFWQ0VuY0dldFJlY29uKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDQvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogVG8gcmV0cmlldmUgdGhlIG1vc3QgcmVjZW50bHkgZW5jb2RlZCBmcmFtZS4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgYXNzdW1lIHRoYXQgdXNlciB3aWxsIG1ha2UgYSBjb3B5IGlmIHRoZXkgd2FudCB0byBob2xkIG9uICAgKi8KKy8qICAgICAgICAgICAgICB0byBpdC4gT3RoZXJ3aXNlLCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSByZXNlcnZlZC4gICAgICAqLworLyogICAgICAgICAgICAgIE1vc3QgYXBwbGljYXRpb25zIHByZWZlciB0byBzZWUgb3JpZ2luYWwgZnJhbWUgcmF0aGVyIHRoYW4gICovCisvKiAgICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcmFtZS4gU28sIHdlIGFyZSBzdGF5aW5nIGF3YXJlIGZyb20gY29tcGxleCAgKi8KKy8qICAgICAgICAgICAgICBidWZmZXJpbmcgbWVjaGFuaXNtLiBJZiBuZWVkZWQsIGNhbiBiZSBhZGRlZCBsYXRlci4gICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0dldFJlY29uKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNGcmFtZUlPICpyZWNvbikKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKWF2Y0hhbmRsZS0+QVZDT2JqZWN0OworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZVN0b3JlICpjdXJyRlMgPSB2aWRlby0+Y3VyckZTOworCisgICAgaWYgKGVuY3ZpZCA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19VTklOSVRJQUxJWkVEOworICAgIH0KKworICAgIHJlY29uLT5ZQ2JDclswXSA9IGN1cnJGUy0+ZnJhbWUuU2w7CisgICAgcmVjb24tPllDYkNyWzFdID0gY3VyckZTLT5mcmFtZS5TY2I7CisgICAgcmVjb24tPllDYkNyWzJdID0gY3VyckZTLT5mcmFtZS5TY3I7CisgICAgcmVjb24tPmhlaWdodCA9IGN1cnJGUy0+ZnJhbWUuaGVpZ2h0OworICAgIHJlY29uLT5waXRjaCA9IGN1cnJGUy0+ZnJhbWUucGl0Y2g7CisgICAgcmVjb24tPmRpc3Bfb3JkZXIgPSBjdXJyRlMtPlBpY09yZGVyQ250OworICAgIHJlY29uLT5jb2Rpbmdfb3JkZXIgPSBjdXJyRlMtPkZyYW1lTnVtOworICAgIHJlY29uLT5pZCA9ICh1aW50MzIpIGN1cnJGUy0+YmFzZV9kcGI7IC8qIHVzZSB0aGUgcG9pbnRlciBhcyB0aGUgaWQgKi8KKworICAgIGN1cnJGUy0+SXNPdXRwdXR0ZWQgfD0gMTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworT1NDTF9FWFBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNSZWxlYXNlUmVjb24oQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0ZyYW1lSU8gKnJlY29uKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhyZWNvbik7CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7IC8vZm9yIG5vdworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IFBWQVZDQ2xlYW5VcEVuY29kZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogNC8xOC8yMDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBUbyBjbGVhbiB1cCBtZW1vcmllcyBhbGxvY2F0ZWQgYnkgUFZBVkNFbmNJbml0aWFsaXplKCkgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworT1NDTF9FWFBPUlRfUkVGIHZvaWQgICAgUFZBVkNDbGVhblVwRW5jb2RlcihBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvOworICAgIHVpbnQzMiAqdXNlckRhdGEgPSAodWludDMyKikgYXZjSGFuZGxlLT51c2VyRGF0YTsKKworICAgIGlmIChlbmN2aWQgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIENsZWFuTW90aW9uU2VhcmNoTW9kdWxlKGF2Y0hhbmRsZSk7CisKKyAgICAgICAgQ2xlYW51cFJhdGVDb250cm9sTW9kdWxlKGF2Y0hhbmRsZSk7CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyICE9IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmZ1bmN0aW9uUG9pbnRlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5taW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+bWluX2Nvc3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+aW50cmFTZWFyY2gpCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmludHJhU2VhcmNoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmN2aWQtPm1vdDE2eDE2KQorICAgICAgICB7CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpZW5jdmlkLT5tb3QxNngxNik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jdmlkLT5yYXRlQ3RybCkKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+cmF0ZUN0cmwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcikKKyAgICAgICAgeworICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICB2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgICAgICBpZiAodmlkZW8gIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5tYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5kZWNQaWNCdWYgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDbGVhblVwRFBCKGF2Y0hhbmRsZSwgdmlkZW8pOworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCl2aWRlby0+ZGVjUGljQnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+c2xpY2VIZHIgIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPnNsaWNlSGRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcyAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfaWQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmN1cnJQaWNQYXJhbXMtPnNsaWNlX2dyb3VwX2lkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8tPmN1cnJQaWNQYXJhbXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5jdXJyU2VxUGFyYW1zICE9IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KXZpZGVvLT5jdXJyU2VxUGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlbmN2aWQtPmJpdHN0cmVhbSAhPSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2Y0hhbmRsZS0+Q0JBVkNfRnJlZSh1c2VyRGF0YSwgKGludCllbmN2aWQtPmJpdHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmlkZW8gIT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUodXNlckRhdGEsIChpbnQpdmlkZW8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKHVzZXJEYXRhLCAoaW50KWVuY3ZpZCk7CisKKyAgICAgICAgYXZjSGFuZGxlLT5BVkNPYmplY3QgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlQml0UmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIGJpdHJhdGUpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisgICAgT1NDTF9VTlVTRURfQVJHKGJpdHJhdGUpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1VwZGF0ZUZyYW1lUmF0ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDMyIG51bSwgdWludDMyIGRlbm9tKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhudW0pOworICAgIE9TQ0xfVU5VU0VEX0FSRyhkZW5vbSk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSURSSW50ZXJ2YWwoQVZDSGFuZGxlICphdmNIYW5kbGUsIGludCBJRFJJbnRlcnZhbCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoYXZjSGFuZGxlKTsKKyAgICBPU0NMX1VOVVNFRF9BUkcoSURSSW50ZXJ2YWwpOworCisgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworfQorCitPU0NMX0VYUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0lEUlJlcXVlc3QoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgT1NDTF9VTlVTRURfQVJHKGF2Y0hhbmRsZSk7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSU1CUmVmcmVzaChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IG51bU1CKQoreworICAgIE9TQ0xfVU5VU0VEX0FSRyhhdmNIYW5kbGUpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhudW1NQik7CisKKyAgICByZXR1cm4gQVZDRU5DX0ZBSUw7Cit9CisKK3ZvaWQgUFZBVkNFbmNHZXRGcmFtZVN0YXRzKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCBBVkNFbmNGcmFtZVN0YXRzICphdmNTdGF0cykKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworCisgICAgYXZjU3RhdHMtPmF2Z0ZyYW1lUVAgPSBHZXRBdmdGcmFtZVFQKHJhdGVDdHJsKTsKKyAgICBhdmNTdGF0cy0+bnVtSW50cmFNQnMgPSBlbmN2aWQtPm51bUludHJhTUI7CisKKyAgICByZXR1cm4gOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19hcGkuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0MWVjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfYXBpLmgKQEAgLTAsMCArMSwzMjMgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKK1RoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBmdW5jdGlvbiBpbnRlcmZhY2VzIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5CithbmQgbmVjZXNzYXJ5IHR5cGUgZGVmaXRpb25pdGlvbnMgYW5kIGVudW1lcmF0aW9ucy4KK0BwdWJsaXNoZWRBbGwKKyovCisKKyNpZm5kZWYgQVZDRU5DX0FQSV9IX0lOQ0xVREVECisjZGVmaW5lIEFWQ0VOQ19BUElfSF9JTkNMVURFRAorCisjaWZuZGVmIEFWQ0FQSV9DT01NT05fSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2FwaV9jb21tb24uaCIKKyNlbmRpZgorCisvLyBGb3IgbWVtc2V0LCBldGMKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLyoqCisgVGhpcyBlbnVtZXJhdGlvbiBpcyB1c2VkIGZvciB0aGUgc3RhdHVzIHJldHVybmVkIGZyb20gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLgorKi8KK3R5cGVkZWYgZW51bQoreworICAgIC8qKgorICAgIEZhaWwgaW5mb3JtYXRpb24sIG5lZWQgdG8gYWRkIG1vcmUgZXJyb3IgY29kZSBmb3IgbW9yZSBzcGVjaWZpYyBpbmZvCisgICAgKi8KKyAgICBBVkNFTkNfVFJBSUxJTkdPTkVTX0ZBSUwgPSAtMzUsCisgICAgQVZDRU5DX1NMSUNFX0VNUFRZID0gLTM0LAorICAgIEFWQ0VOQ19QT0NfRkFJTCA9IC0zMywKKyAgICBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGID0gLTMyLAorICAgIEFWQ0VOQ19DQUJBQ19GQUlMID0gLTMxLAorICAgIEFWQ0VOQ19QUkVEX1dFSUdIVF9UQUJfRkFJTCA9IC0zMCwKKyAgICBBVkNFTkNfREVDX1JFRl9QSUNfTUFSS19GQUlMID0gLTI5LAorICAgIEFWQ0VOQ19TUFNfRkFJTCA9IC0yOCwKKyAgICBBVkNFTkNfQklUU1RSRUFNX0JVRkZFUl9GVUxMICAgID0gLTI3LAorICAgIEFWQ0VOQ19CSVRTVFJFQU1fSU5JVF9GQUlMID0gLTI2LAorICAgIEFWQ0VOQ19DSFJPTUFfUVBfRkFJTCA9IC0yNSwKKyAgICBBVkNFTkNfSU5JVF9RU19GQUlMID0gLTI0LAorICAgIEFWQ0VOQ19JTklUX1FQX0ZBSUwgPSAtMjMsCisgICAgQVZDRU5DX1dFSUdIVEVEX0JJUFJFRF9GQUlMID0gLTIyLAorICAgIEFWQ0VOQ19JTlZBTElEX0lOVFJBX1BFUklPRCA9IC0yMSwKKyAgICBBVkNFTkNfSU5WQUxJRF9DSEFOR0VfUkFURSA9IC0yMCwKKyAgICBBVkNFTkNfSU5WQUxJRF9CRVRBX09GRlNFVCA9IC0xOSwKKyAgICBBVkNFTkNfSU5WQUxJRF9BTFBIQV9PRkZTRVQgPSAtMTgsCisgICAgQVZDRU5DX0lOVkFMSURfREVCTE9DS19JREMgPSAtMTcsCisgICAgQVZDRU5DX0lOVkFMSURfUkVEVU5EQU5UX1BJQyA9IC0xNiwKKyAgICBBVkNFTkNfSU5WQUxJRF9GUkFNRVJBVEUgPSAtMTUsCisgICAgQVZDRU5DX0lOVkFMSURfTlVNX1NMSUNFR1JPVVAgPSAtMTQsCisgICAgQVZDRU5DX0lOVkFMSURfUE9DX0xTQiA9IC0xMywKKyAgICBBVkNFTkNfSU5WQUxJRF9OVU1fUkVGID0gLTEyLAorICAgIEFWQ0VOQ19JTlZBTElEX0ZNT19UWVBFID0gLTExLAorICAgIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTCA9IC0xMCwKKyAgICBBVkNFTkNfTEVWRUxfTk9UX1NVUFBPUlRFRCA9IC05LAorICAgIEFWQ0VOQ19MRVZFTF9GQUlMID0gLTgsCisgICAgQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCA9IC03LAorICAgIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEID0gLTYsCisgICAgQVZDRU5DX1dST05HX1NUQVRFID0gLTUsCisgICAgQVZDRU5DX1VOSU5JVElBTElaRUQgPSAtNCwKKyAgICBBVkNFTkNfQUxSRUFEWV9JTklUSUFMSVpFRCA9IC0zLAorICAgIEFWQ0VOQ19OT1RfU1VQUE9SVEVEID0gLTIsCisgICAgQVZDRU5DX01FTU9SWV9GQUlMID0gQVZDX01FTU9SWV9GQUlMLAorICAgIEFWQ0VOQ19GQUlMID0gQVZDX0ZBSUwsCisgICAgLyoqCisgICAgR2VuZXJpYyBzdWNjZXNzIHZhbHVlCisgICAgKi8KKyAgICBBVkNFTkNfU1VDQ0VTUyA9IEFWQ19TVUNDRVNTLAorICAgIEFWQ0VOQ19QSUNUVVJFX1JFQURZID0gMiwKKyAgICBBVkNFTkNfTkVXX0lEUiA9IDMsIC8qIHVwb24gZ2V0dGluZyB0aGlzLCB1c2VycyBoYXZlIHRvIGNhbGwgUFZBVkNFbmNvZGVTUFMgYW5kIFBWQVZDRW5jb2RlUFBTIHRvIGdldCBhIG5ldyBTUFMgYW5kIFBQUyovCisgICAgQVZDRU5DX1NLSVBQRURfUElDVFVSRSA9IDQgLyogY29udGludWFibGUgZXJyb3IgbWVzc2FnZSAqLworCit9IEFWQ0VuY19TdGF0dXM7CisKKyNkZWZpbmUgTUFYX05VTV9TTElDRV9HUk9VUCAgOCAgICAgIC8qIG1heGltdW0gZm9yIGFsbCB0aGUgcHJvZmlsZXMgKi8KKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycy4KKyovCit0eXBlZGVmIHN0cnVjdCB0YWdBVkNFbmNQYXJhbQoreworICAgIC8qIGlmIHByb2ZpbGUvbGV2ZWwgaXMgc2V0IHRvIHplcm8sIGVuY29kZXIgd2lsbCBjaG9vc2UgdGhlIGNsb3Nlc3Qgb25lIGZvciB5b3UgKi8KKyAgICBBVkNQcm9maWxlIHByb2ZpbGU7IC8qIHByb2ZpbGUgb2YgdGhlIGJpdHN0cmVhbSB0byBiZSBjb21wbGlhbnQgd2l0aCovCisgICAgQVZDTGV2ZWwgICBsZXZlbDsgICAvKiBsZXZlbCBvZiB0aGUgYml0c3RyZWFtIHRvIGJlIGNvbXBsaWFudCB3aXRoKi8KKworICAgIGludCB3aWR0aDsgICAgICAvKiB3aWR0aCBvZiBhbiBpbnB1dCBmcmFtZSBpbiBwaXhlbCAqLworICAgIGludCBoZWlnaHQ7ICAgICAvKiBoZWlnaHQgb2YgYW4gaW5wdXQgZnJhbWUgaW4gcGl4ZWwgKi8KKworICAgIGludCBwb2NfdHlwZTsgLyogcGljdHVyZSBvcmRlciBjb3VudCBtb2RlLCAwLDEgb3IgMiAqLworICAgIC8qIGZvciBwb2NfdHlwZSA9PSAwICovCisgICAgdWludCBsb2cyX21heF9wb2NfbHNiX21pbnVzXzQ7IC8qIHNwZWNpZnkgbWF4aW11bSB2YWx1ZSBvZiBQT0MgTHNiLCByYW5nZSAwLi4xMiovCisgICAgLyogZm9yIHBvY190eXBlID09IDEgKi8KKyAgICB1aW50IGRlbHRhX3BvY196ZXJvX2ZsYWc7IC8qIGRlbHRhIFBPQyBhbHdheXMgemVybyAqLworICAgIGludCBvZmZzZXRfcG9jX25vbl9yZWY7IC8qIG9mZnNldCBmb3Igbm9uLXJlZmVyZW5jZSBwaWMgKi8KKyAgICBpbnQgb2Zmc2V0X3RvcF9ib3R0b207IC8qIG9mZnNldCBiZXR3ZWVuIHRvcCBhbmQgYm90dG9tIGZpZWxkICovCisgICAgdWludCBudW1fcmVmX2luX2N5Y2xlOyAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lIGluIG9uZSBjeWNsZSAqLworICAgIGludCAqb2Zmc2V0X3BvY19yZWY7IC8qIGFycmF5IG9mIG9mZnNldCBmb3IgcmVmIHBpYywgZGltZW5zaW9uIFtudW1fcmVmX2luX2N5Y2xlXSAqLworCisgICAgaW50IG51bV9yZWZfZnJhbWU7ICAvKiBudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lIHVzZWQgKi8KKyAgICBpbnQgbnVtX3NsaWNlX2dyb3VwOyAgLyogbnVtYmVyIG9mIHNsaWNlIGdyb3VwICovCisgICAgaW50IGZtb190eXBlOyAgIC8qIDA6IGludGVybGVhdmUsIDE6IGRpc3BlcnNlZCwgMjogZm9yZWdyb3VuZCB3aXRoIGxlZnQtb3ZlcgorICAgICAgICAgICAgICAgICAgICAzOiBib3gtb3V0LCA0OnJhc3RlciBzY2FuLCA1OndpcGUsIDY6ZXhwbGljaXQgKi8KKyAgICAvKiBmb3IgZm1vX3R5cGUgPT0gMCAqLworICAgIHVpbnQgcnVuX2xlbmd0aF9taW51czFbTUFYX05VTV9TTElDRV9HUk9VUF07ICAgLyogYXJyYXkgb2Ygc2l6ZSBudW1fc2xpY2VfZ3JvdXAsIGluIHJvdW5kIHJvYmluIGZhc2lvbiAqLworICAgIC8qIGZtb190eXBlID09IDIqLworICAgIHVpbnQgdG9wX2xlZnRbTUFYX05VTV9TTElDRV9HUk9VUC0xXTsgICAgICAgICAgIC8qIGFycmF5IG9mIGNvLW9yZGluYXRlcyBvZiBlYWNoIHNsaWNlX2dyb3VwICovCisgICAgdWludCBib3R0b21fcmlnaHRbTUFYX05VTV9TTElDRV9HUk9VUC0xXTsgICAgICAgLyogZXhjZXB0IHRoZSBsYXN0IG9uZSB3aGljaCBpcyB0aGUgYmFja2dyb3VuZC4gKi8KKyAgICAvKiBmbW9fdHlwZSA9PSAzLDQsNSAqLworICAgIEFWQ0ZsYWcgY2hhbmdlX2Rpcl9mbGFnOyAgLyogc2xpY2UgZ3JvdXAgY2hhbmdlIGRpcmVjdGlvbiBmbGFnICovCisgICAgdWludCBjaGFuZ2VfcmF0ZV9taW51czE7CisgICAgLyogZm1vX3R5cGUgPT0gNiAqLworICAgIHVpbnQgKnNsaWNlX2dyb3VwOyAvKiBhcnJheSBvZiBzaXplIE1CV2lkdGgqTUJIZWlnaHQgKi8KKworICAgIEFWQ0ZsYWcgZGJfZmlsdGVyOyAgLyogZW5hYmxlIGRlYmxvY2tpbmcgbG9vcCBmaWx0ZXIgKi8KKyAgICBpbnQgZGlzYWJsZV9kYl9pZGM7ICAvKiAwOiBmaWx0ZXIgZXZlcnl3aGVyZSwgMTogbm8gZmlsdGVyLCAyOiBubyBmaWx0ZXIgYWNyb3NzIHNsaWNlIGJvdW5kYXJ5ICovCisgICAgaW50IGFscGhhX29mZnNldDsgICAvKiBhbHBoYSBvZmZzZXQgcmFuZ2UgLTYsLi4uLDYgKi8KKyAgICBpbnQgYmV0YV9vZmZzZXQ7ICAgIC8qIGJldGEgb2Zmc2V0IHJhbmdlIC02LC4uLiw2ICovCisKKyAgICBBVkNGbGFnIGNvbnN0cmFpbmVkX2ludHJhX3ByZWQ7IC8qIGNvbnN0cmFpbmVkIGludHJhIHByZWRpY3Rpb24gZmxhZyAqLworCisgICAgQVZDRmxhZyBhdXRvX3NjZDsgICAvKiBzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIG9uIG9yIG9mZiAqLworICAgIGludCBpZHJfcGVyaW9kOyAvKiBpZHIgZnJhbWUgcmVmcmVzaCByYXRlIGluIG51bWJlciBvZiB0YXJnZXQgZW5jb2RlZCBmcmFtZSAobm8gY29uY2VwdCBvZiBhY3R1YWwgdGltZSkuKi8KKyAgICBpbnQgaW50cmFtYl9yZWZyZXNoOyAgICAvKiBtaW5pbXVtIG51bWJlciBvZiBpbnRyYSBNQiBwZXIgZnJhbWUgKi8KKyAgICBBVkNGbGFnIGRhdGFfcGFyOyAgIC8qIGVuYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAqLworCisgICAgQVZDRmxhZyBmdWxsc2VhcmNoOyAvKiBlbmFibGUgZnVsbC1wZWwgZnVsbC1zZWFyY2ggbW9kZSAqLworICAgIGludCBzZWFyY2hfcmFuZ2U7ICAgLyogc2VhcmNoIHJhbmdlIGZvciBtb3Rpb24gdmVjdG9yIGluICgtc2VhcmNoX3JhbmdlLCtzZWFyY2hfcmFuZ2UpIHBpeGVscyAqLworICAgIEFWQ0ZsYWcgc3ViX3BlbDsgICAgLyogZW5hYmxlIHN1YiBwZWwgcHJlZGljdGlvbiAqLworICAgIEFWQ0ZsYWcgc3VibWJfcHJlZDsgLyogZW5hYmxlIHN1YiBNQiBwYXJ0aXRpb24gbW9kZSAqLworICAgIEFWQ0ZsYWcgcmRvcHRfbW9kZTsgLyogUkQgb3B0aW1hbCBtb2RlIHNlbGVjdGlvbiAqLworICAgIEFWQ0ZsYWcgYmlkaXJfcHJlZDsgLyogZW5hYmxlIGJpLWRpcmVjdGlvbmFsIGZvciBCLXNsaWNlLCB0aGlzIGZsYWcgZm9yY2VzIHRoZSBlbmNvZGVyIHRvIGVuY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgYW55IGZyYW1lIHdpdGggUE9DIGxlc3MgdGhhbiB0aGUgcHJldmlvdXNseSBlbmNvZGVkIGZyYW1lIGFzIGEgQi1mcmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIGl0J3Mgb2ZmLCB0aGVuIHN1Y2ggZnJhbWVzIHdpbGwgcmVtYWluIFAtZnJhbWUuICovCisKKyAgICBBVkNGbGFnIHJhdGVfY29udHJvbDsgLyogcmF0ZSBjb250cm9sIGVuYWJsZSwgb246IFJDIG9uLCBvZmY6IGNvbnN0YW50IFFQICovCisgICAgaW50IGluaXRRUDsgICAgIC8qIGluaXRpYWwgUVAgKi8KKyAgICB1aW50MzIgYml0cmF0ZTsgICAgLyogdGFyZ2V0IGVuY29kaW5nIGJpdCByYXRlIGluIGJpdHMvc2Vjb25kICovCisgICAgdWludDMyIENQQl9zaXplOyAgLyogY29kZWQgcGljdHVyZSBidWZmZXIgaW4gbnVtYmVyIG9mIGJpdHMgKi8KKyAgICB1aW50MzIgaW5pdF9DQlBfcmVtb3ZhbF9kZWxheTsgLyogaW5pdGlhbCBDQlAgcmVtb3ZhbCBkZWxheSBpbiBtc2VjICovCisKKyAgICB1aW50MzIgZnJhbWVfcmF0ZTsgIC8qIGZyYW1lIHJhdGUgaW4gdGhlIHVuaXQgb2YgZnJhbWVzIHBlciAxMDAwIHNlY29uZCAqLworICAgIC8qIG5vdGUsIGZyYW1lIHJhdGUgaXMgb25seSBuZWVkZWQgYnkgdGhlIHJhdGUgY29udHJvbCwgQVZDIGlzIHRpbWVzdGFtcCBhZ25vc3RpYy4gKi8KKworICAgIEFWQ0ZsYWcgb3V0X29mX2JhbmRfcGFyYW1fc2V0OyAvKiBmbGFnIHRvIHNldCB3aGV0aGVyIHBhcmFtIHNldHMgYXJlIHRvIGJlIHJldHJpZXZlZCB1cCBmcm9udCBvciBub3QgKi8KKworICAgIEFWQ0ZsYWcgdXNlX292ZXJydW5fYnVmZmVyOyAgLyogZG8gbm90IHRocm93IGF3YXkgdGhlIGZyYW1lIGlmIG91dHB1dCBidWZmZXIgaXMgbm90IGJpZyBlbm91Z2guCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5IGV4Y2VzcyBiaXRzIHRvIHRoZSBvdmVycnVuIGJ1ZmZlciAqLworfSBBVkNFbmNQYXJhbXM7CisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyBjdXJyZW50IGZyYW1lIGVuY29kaW5nIHN0YXRpc3RpY3MgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0FWQ0VuY0ZyYW1lU3RhdHMKK3sKKyAgICBpbnQgYXZnRnJhbWVRUDsgICAvKiBhdmVyYWdlIGZyYW1lIFFQICovCisgICAgaW50IG51bUludHJhTUJzOyAgLyogbnVtYmVyIG9mIGludHJhIE1CcyAqLworICAgIGludCBudW1GYWxzZUFsYXJtOworICAgIGludCBudW1NaXNEZXRlY3RlZDsKKyAgICBpbnQgbnVtRGV0ZWN0ZWQ7CisKK30gQVZDRW5jRnJhbWVTdGF0czsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiCit7CisjZW5kaWYKKyAgICAvKiogVEhFIEZPTExPV0lOR1MgQVJFIEFQSVMgKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBlbmNvZGVyIGxpYnJhcnkuIEl0IHZlcmlmaWVzIHRoZSB2YWxpZGl0eSBvZiB0aGUKKyAgICBlbmNvZGluZyBwYXJhbWV0ZXJzIGFnYWluc3QgdGhlIHNwZWNpZmllZCBwcm9maWxlL2xldmVsIGFuZCB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQKKyAgICB0b29scyBieSB0aGlzIGxpYnJhcnkuIEl0IGFsbG9jYXRlcyBuZWNlc3NhcnkgbWVtb3JpZXMgcmVxdWlyZWQgdG8gcGVyZm9ybSBlbmNvZGluZy4KKyAgICBGb3IgcmUtZW5jb2RpbmcgYXBwbGljYXRpb24sIGlmIHVzZXJzIHdhbnQgdG8gc2V0dXAgZW5jb2RlciBpbiBhIG1vcmUgcHJlY2lzZSB3YXksCisgICAgdXNlcnMgY2FuIGdpdmUgdGhlIGV4dGVybmFsIFNQUyBhbmQgUFBTIHRvIHRoZSBlbmNvZGVyIHRvIGZvbGxvdy4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgICJIYW5kbGUgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkgb2JqZWN0LiIKKyAgICBccGFyYW0gImVuY1BhcmFtIiAgICJQb2ludGVyIHRvIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXIgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImV4dFNQUyIgICAgICJFeHRlcm5hbCBTUFMgdXNlZCBmb3IgcmUtZW5jb2RpbmcgcHVycG9zZS4gTlVMTCBpZiBub3QgcHJlc2VudCIKKyAgICBccGFyYW0gImV4dFBQUyIgICAgICJFeHRlcm5hbCBQUFMgdXNlZCBmb3IgcmUtZW5jb2RpbmcgcHVycG9zZS4gTlVMTCBpZiBub3QgcHJlc2VudCIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywKKyAgICAgICAgICAgICBBVkNFTkNfTk9UX1NVUFBPUlRFRCBmb3IgdGhlIHVzZSBvZiB1bnN1cHBvcnRlZCB0b29scywKKyAgICAgICAgICAgICBBVkNFTkNfTUVNT1JZX0ZBSUwgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsCisgICAgICAgICAgICAgQVZDRU5DX0ZBSUwgZm9yIGdlbmVyaWMgZmFpbHVyZS4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0luaXRpYWxpemUoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY1BhcmFtcyAqZW5jUGFyYW0sIHZvaWQqIGV4dFNQUywgdm9pZCogZXh0UFBTKTsKKworCisgICAgLyoqCisgICAgU2luY2UgdGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyBub3Qga25vd24gcHJpb3IgdG8gZW5jb2RpbmcgYSBmcmFtZSwgdXNlcnMgbmVlZCB0bworICAgIGFsbG9jYXRlIGJpZyBlbm91Z2ggYnVmZmVyIG90aGVyd2lzZSwgdGhhdCBmcmFtZSB3aWxsIGJlIGRyb3BwZWQuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAgIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBieSB0aGUgdXNlcnMgdGhhdCBndWFyYW50ZWVzIHRvIGhvbGQgb25lIGZyYW1lLgorICAgIEl0IGZvbGxvd3MgdGhlIENQQiBzcGVjIGZvciBhIHBhcnRpY3VsYXIgbGV2ZWwuICBIb3dldmVyLCB3aGVuIHRoZSB1c2VycyBzZXQgdXNlX292ZXJydW5fYnVmZmVyCisgICAgZmxhZywgdGhpcyBBUEkgaXMgdXNlbGVzcyBhcyBleGNlc3Mgb3V0cHV0IGJpdHMgYXJlIHNhdmVkIGluIHRoZSBvdmVycnVuIGJ1ZmZlciB3YWl0aW5nIHRvIGJlCisgICAgY29waWVkIG91dCBpbiBzbWFsbCBjaHVua3MsIGkuZS4gdXNlcnMgY2FuIGFsbG9jYXRlIGFueSBzaXplIG9mIG91dHB1dCBidWZmZXIuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJzaXplIiAgICJQb2ludGVyIHRvIHRoZSBzaXplIHRvIGJlIG1vZGlmaWVkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX1VOSU5JVElBTElaRUQgd2hlbiBsZXZlbCBpcyBub3Qga25vd24uCisgICAgKi8KKworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TWF4T3V0cHV0QnVmZmVyU2l6ZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50KiBzaXplKTsKKworICAgIC8qKgorICAgIFVzZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBwcm92aWRlIGFuIGlucHV0IHN0cnVjdHVyZSB0byB0aGUgZW5jb2RlciBsaWJyYXJ5IHdoaWNoIHdpbGwga2VlcAorICAgIGEgbGlzdCBvZiBpbnB1dCBzdHJ1Y3R1cmVzIGl0IHJlY2VpdmVzIGluIGNhc2UgdGhlIHVzZXJzIGNhbGwgdGhpcyBmdW5jdGlvbiBtYW55IHRpbWUgYmVmb3JlCisgICAgY2FsbGluZyBQVkFWQ0VuY29kZVNsaWNlLiBUaGUgZW5jb2RlciBsaWJyYXJ5IHdpbGwgZW5jb2RlIHRoZW0gYWNjb3JkaW5nIHRvIHRoZSBmcmFtZV9udW0gb3JkZXIuCisgICAgVXNlcnMgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGNvbnRlbnQgb2YgYSBwYXJ0aWN1bGFyIGZyYW1lIHVudGlsIHRoaXMgZnJhbWUgaXMgZW5jb2RlZCBhbmQKKyAgICByZXR1cm5lZCB0aHJ1IENCQVZDRW5jX1JldHVybklucHV0KCkgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJpbnB1dCIgICAgICAiUG9pbnRlciB0byB0aGUgaW5wdXQgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywKKyAgICAgICAgICAgIEFWQ0VOQ19GQUlMIGlmIHRoZSBlbmNvZGVyIGlzIG5vdCBpbiB0aGUgcmlnaHQgc3RhdGUgdG8gdGFrZSBhIG5ldyBpbnB1dCBmcmFtZS4KKyAgICAgICAgICAgIEFWQ0VOQ19ORVdfSURSIGZvciB0aGUgZGV0ZWN0aW9uIG9yIGRldGVybWluYXRpb24gb2YgYSBuZXcgSURSLCB3aXRoIHRoaXMgc3RhdHVzLAorICAgICAgICAgICAgdGhlIHJldHVybmVkIE5BTCBpcyBhbiBTUFMgTkFMLAorICAgICAgICAgICAgQVZDRU5DX05PX1BJQ1RVUkUgaWYgdGhlIGlucHV0IGZyYW1lIGNvZGluZyB0aW1lc3RhbXAgaXMgdG9vIGVhcmx5LCB1c2VycyBtdXN0CisgICAgICAgICAgICBnZXQgbmV4dCBmcmFtZSBvciBhZGp1c3QgdGhlIGNvZGluZyB0aW1lc3RhbXAuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNTZXRJbnB1dChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqaW5wdXQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdG8gZW5jb2RlIGEgTkFMIHVuaXQgd2hpY2ggY2FuIGJlIGFuIFNQUyBOQUwsIGEgUFBTIE5BTCBvcgorICAgIGEgVkNMICh2aWRlbyBjb2RpbmcgbGF5ZXIpIE5BTCB3aGljaCBjb250YWlucyBvbmUgc2xpY2Ugb2YgZGF0YS4gSXQgY291bGQgYmUgYQorICAgIGZpeGVkIG51bWJlciBvZiBtYWNyb2Jsb2NrcywgYXMgc3BlY2lmaWVkIGluIHRoZSBlbmNvZGVyIHBhcmFtZXRlcnMgc2V0LCBvciB0aGUKKyAgICBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBmaXR0ZWQgaW50byB0aGUgZ2l2ZW4gaW5wdXQgYXJndW1lbnQgImJ1ZmZlciIuIFRoZQorICAgIGlucHV0IGZyYW1lIGlzIHRha2VuIGZyb20gdGhlIG9sZGVzdCB1bmVuY29kZWQgaW5wdXQgZnJhbWUgcmV0cmlldmVkIGJ5IHVzZXJzIGJ5CisgICAgUFZBVkNFbmNHZXRJbnB1dCBBUEkuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJidWZmZXIiICAgICAiUG9pbnRlciB0byB0aGUgb3V0cHV0IEFWQyBiaXRzdHJlYW0gYnVmZmVyLCB0aGUgZm9ybWF0IHdpbGwgYmUgRUJTUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3QgUkJTUC4iCisgICAgXHBhcmFtICJidWZfbmFsX3NpemUiICAgIkFzIGlucHV0LCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgcGh5c2ljYWwgbGltaXRhdGlvbiBvZiB0aGUgYnVmZmVyLiBBcyBvdXRwdXQsIHRoZSBzaXplIG9mIHRoZSBFQlNQLiIKKyAgICBccGFyYW0gIm5hbF90eXBlIiAgICJQb2ludGVyIHRvIHRoZSBOQUwgdHlwZSBvZiB0aGUgcmV0dXJuZWQgYnVmZmVyLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvZiBlbmNvZGluZyBvbmUgc2xpY2UsCisgICAgICAgICAgICAgQVZDRU5DX1BJQ1RVUkVfUkVBRFkgZm9yIHRoZSBjb21wbGV0aW9uIG9mIGEgZnJhbWUgZW5jb2RpbmcsCisgICAgICAgICAgICAgQVZDRU5DX0ZBSUwgZm9yIGZhaWx1cmUgKHRoaXMgc2hvdWxkIG5vdCBvY2N1ciwgdGhvdWdoKS4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY29kZU5BTChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgdWludDggKmJ1ZmZlciwgdWludCAqYnVmX25hbF9zaXplLCBpbnQgKm5hbF90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gc25pZmZzIHRoZSBuYWxfdW5pdF90eXBlIHN1Y2ggdGhhdCB1c2VycyBjYW4gY2FsbCBjb3JyZXNwb25kaW5nIEFQSXMuCisgICAgVGhpcyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gUFZBVkNEZWNHZXROQUxUeXBlKCkgaW4gdGhlIGRlY29kZXIuCisgICAgXHBhcmFtICJiaXRzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGEgTkFMIHVuaXQgKHN0YXJ0IHdpdGggZm9yYmlkZGVuX3plcm9fYml0LCBldGMuKS4iCisgICAgXHBhcmFtICJzaXplIiAgICAgICAic2l6ZSBvZiB0aGUgYml0c3RyZWFtIChOdW1CeXRlc0luTkFMdW5pdCArIDEpLiIKKyAgICBccGFyYW0gIm5hbF91bml0X3R5cGUiICJQb2ludGVyIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgbmFsIHVuaXQgdHlwZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2VzcywgQVZDRU5DX0ZBSUwgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jR2V0TkFMVHlwZSh1aW50OCAqYml0c3RyZWFtLCBpbnQgc2l6ZSwgaW50ICpuYWxfdHlwZSwgaW50ICpuYWxfcmVmX2lkYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gaW50ZXJuYWwgb3ZlcnJ1biBidWZmZXIuIFVzZXJzIGNhbiBjYWxsIHRoaXMgdG8gcXVlcnkKKyAgICB3aGV0aGVyIHRoZSBvdmVycnVuIGJ1ZmZlciBoYXMgYmVlbiB1c2VkIHRvIGVuY29kZSB0aGUgY3VycmVudCBOQUwuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiUG9pbnRlciB0byB0aGUgaGFuZGxlLiIKKyAgICBccmV0dXJuICJQb2ludGVyIHRvIG92ZXJydW4gYnVmZmVyIGlmIGl0IGlzIHVzZWQsIG90aGVyd2lzZSwgTlVMTC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgdWludDgqIFBWQVZDRW5jR2V0T3ZlcnJ1bkJ1ZmZlcihBVkNIYW5kbGUqIGF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlY29uc3RydWN0ZWQgZnJhbWUgb2YgdGhlIG1vc3QgcmVjZW50bHkgZW5jb2RlZCBmcmFtZS4KKyAgICBOb3RlIHRoYXQgdGhpcyBmcmFtZSBpcyBub3QgcmV0dXJuZWQgdG8gdGhlIHVzZXJzIHlldC4gVXNlcnMgc2hvdWxkIG9ubHkgcmVhZCB0aGUKKyAgICBjb250ZW50IG9mIHRoaXMgZnJhbWUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJvdXRwdXQiICAgICAiUG9pbnRlciB0byB0aGUgaW5wdXQgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX05PX1BJQ1RVUkUgaWYgbm8gcGljdHVyZSB0byBiZSBvdXRwdXR0ZWQuIgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNHZXRSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgcmVjb250cnVjdGVkIGZyYW1lIGJhY2sgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkKKyAgICBpbiBvcmRlciB0byBiZSByZS11c2VkIGZvciBlbmNvZGluZyBvcGVyYXRpb24uIElmIHVzZXJzIHdhbnQgdGhlIGNvbnRlbnQgb2YgaXQgdG8gcmVtYWluCisgICAgdW5jaGFuZ2VkIGZvciBhIGxvbmcgdGltZSwgdGhleSBzaG91bGQgbWFrZSBhIGNvcHkgb2YgaXQgYW5kIHJlbGVhc2UgdGhlIG1lbW9yeSBiYWNrIHRvCisgICAgdGhlIGVuY29kZXIuIFRoZSBlbmNvZGVyIHJlbGllcyBvbiB0aGUgaWQgZWxlbWVudCBpbiB0aGUgQVZDRnJhbWVJTyBzdHJ1Y3R1cmUsCisgICAgdGh1cyB1c2VycyBzaG91bGQgbm90IGNoYW5nZSB0aGUgaWQgdmFsdWUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZGVjb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgXHBhcmFtICJvdXRwdXQiICAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0ZyYW1lSU8gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcywgQVZDRU5DX0ZBSUwgZm9yIGZhaWwgZm9yIGlkIG5vdCBmb3VuZC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY1JlbGVhc2VSZWNvbihBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRnJhbWVJTyAqcmVjb24pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjbGVhbiB1cCBvcGVyYXRpb24gaW5jbHVkaW5nIG1lbW9yeSBkZWFsbG9jYXRpb24uCisgICAgVGhlIGVuY29kZXIgd2lsbCBhbHNvIGNsZWFyIHRoZSBsaXN0IG9mIGlucHV0IHN0cnVjdHVyZXMgaXQgaGFzIG5vdCByZWxlYXNlZC4KKyAgICBUaGlzIGltcGxpZXMgdGhhdCB1c2VycyBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbnB1dCBzdHJ1Y3R1cmUgdGhleSBoYXZlIGFsbG9jYXRlZAorICAgIGFuZCBmcmVlIHRoZW0gYWNjb3JkaW5nbHkuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICAiSGFuZGxlIHRvIHRoZSBBVkMgZW5jb2RlciBsaWJyYXJ5IG9iamVjdC4iCisgICAgKi8KKyAgICBPU0NMX0lNUE9SVF9SRUYgdm9pZCAgICBQVkFWQ0NsZWFuVXBFbmNvZGVyKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZXh0cmFjdHMgc3RhdGlzdGljcyBvZiB0aGUgY3VycmVudCBmcmFtZS4gSWYgdGhlIGVuY29kZXIgaGFzIG5vdCBmaW5pc2hlZAorICAgIHdpdGggdGhlIGN1cnJlbnQgZnJhbWUsIHRoZSByZXN1bHQgaXMgbm90IGFjY3VyYXRlLgorICAgIFxwYXJhbSAiYXZjSGFuZGxlIiAgIkhhbmRsZSB0byB0aGUgQVZDIGVuY29kZXIgbGlicmFyeSBvYmplY3QuIgorICAgIFxwYXJhbSAiYXZjU3RhdHMiICAgIlBvaW50ZXIgdG8gQVZDRW5jRnJhbWVTdGF0cyBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBQVkFWQ0VuY0dldEZyYW1lU3RhdHMoQVZDSGFuZGxlICphdmNIYW5kbGUsIEFWQ0VuY0ZyYW1lU3RhdHMgKmF2Y1N0YXRzKTsKKworICAgIC8qKgorICAgIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgdGhlIG1vZGlmaWNhdGlvbiBvZiBlbmNvZGluZyBwYXJhbWV0ZXJzLgorICAgIFRvIGJlIHBvbGlzaGVkLgorICAgICovCisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVCaXRSYXRlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlLCB1aW50MzIgYml0cmF0ZSk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVGcmFtZVJhdGUoQVZDSGFuZGxlICphdmNIYW5kbGUsIHVpbnQzMiBudW0sIHVpbnQzMiBkZW5vbSk7CisgICAgT1NDTF9JTVBPUlRfUkVGIEFWQ0VuY19TdGF0dXMgUFZBVkNFbmNVcGRhdGVJRFJJbnRlcnZhbChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IElEUkludGVydmFsKTsKKyAgICBPU0NMX0lNUE9SVF9SRUYgQVZDRW5jX1N0YXR1cyBQVkFWQ0VuY0lEUlJlcXVlc3QoQVZDSGFuZGxlICphdmNIYW5kbGUpOworICAgIE9TQ0xfSU1QT1JUX1JFRiBBVkNFbmNfU3RhdHVzIFBWQVZDRW5jVXBkYXRlSU1CUmVmcmVzaChBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgaW50IG51bU1CKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmICAvKiBfQVZDRU5DX0FQSV9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYXZjZW5jX2ludC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmUwOGExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19pbnQuaApAQCAtMCwwICsxLDQ3MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGZ1bmN0aW9uIGludGVyZmFjZXMgdG8gdGhlIEFWQyBlbmNvZGVyIGxpYnJhcnkKK2FuZCBuZWNlc3NhcnkgdHlwZSBkZWZpdGlvbml0aW9ucyBhbmQgZW51bWVyYXRpb25zLgorQHB1Ymxpc2hlZEFsbAorKi8KKworI2lmbmRlZiBBVkNFTkNfSU5UX0hfSU5DTFVERUQKKyNkZWZpbmUgQVZDRU5DX0lOVF9IX0lOQ0xVREVECisKKyNpZm5kZWYgQVZDSU5UX0NPTU1PTl9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjaW50X2NvbW1vbi5oIgorI2VuZGlmCisjaWZuZGVmIEFWQ0VOQ19BUElfSF9JTkNMVURFRAorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKyNlbmRpZgorCit0eXBlZGVmIGZsb2F0IE9zY2xGbG9hdDsKKworLyogRGVmaW5pdGlvbiBmb3IgdGhlIHN0cnVjdHVyZXMgYmVsb3cgKi8KKyNkZWZpbmUgREVGQVVMVF9BVFRSICAgIDAgLyogZGVmYXVsdCBtZW1vcnkgYXR0cmlidXRlICovCisjZGVmaW5lIE1BWF9JTlBVVF9GUkFNRSAzMCAvKiBzb21lIGFyYml0cmFyeSBudW1iZXIsIGl0IGNhbiBiZSBtdWNoIGhpZ2hlciB0aGFuIHRoaXMuICovCisjZGVmaW5lIE1BWF9SRUZfRlJBTUUgIDE2IC8qIG1heCBzaXplIG9mIHRoZSBSZWZQaWNMaXN0MCBhbmQgUmVmUGljTGlzdDEgKi8KKyNkZWZpbmUgTUFYX1JFRl9QSUNfTElTVCAzMworCisjZGVmaW5lIE1JTl9RUCAgICAgICAgICAwCisjZGVmaW5lIE1BWF9RUCAgICAgICAgICA1MQorI2RlZmluZSBTSElGVF9RUCAgICAgICAgMTIKKyNkZWZpbmUgIExBTUJEQV9BQ0NVUkFDWV9CSVRTICAgICAgICAgMTYKKyNkZWZpbmUgIExBTUJEQV9GQUNUT1IobGFtYmRhKSAgICAgICAgKChpbnQpKChkb3VibGUpKDE8PExBTUJEQV9BQ0NVUkFDWV9CSVRTKSpsYW1iZGErMC41KSkKKworCisjZGVmaW5lIERJU0FCTEVfVEhSRVNIT0xESU5HICAwCisvLyBmb3IgYmV0dGVyIFItRCBwZXJmb3JtYW5jZQorI2RlZmluZSBfTFVNQV9DT0VGRl9DT1NUXyAgICAgICA0IC8vITwgdGhyZXNob2xkIGZvciBsdW1hIGNvZWZmcworI2RlZmluZSBfQ0hST01BX0NPRUZGX0NPU1RfICAgICA0IC8vITwgdGhyZXNob2xkIGZvciBjaHJvbWEgY29lZmZzLCB1c2VkIHRvIGJlIDcKKyNkZWZpbmUgX0xVTUFfTUJfQ09FRkZfQ09TVF8gICAgNSAvLyE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMgb2YgaW50ZXIgTWFjcm9ibG9ja3MKKyNkZWZpbmUgX0xVTUFfOHg4X0NPRUZGX0NPU1RfICAgNSAvLyE8IHRocmVzaG9sZCBmb3IgbHVtYSBjb2VmZnMgb2YgOHg4IEludGVyIFBhcnRpdGlvbgorI2RlZmluZSBNQVhfVkFMVUUgICAgICAgOTk5OTk5ICAgLy8hPCB1c2VkIGZvciBzdGFydCB2YWx1ZSBmb3Igc29tZSB2YXJpYWJsZXMKKworI2RlZmluZSAgV0VJR0hURURfQ09TVChmYWN0b3IsYml0cykgICAoKChmYWN0b3IpKihiaXRzKSk+PkxBTUJEQV9BQ0NVUkFDWV9CSVRTKQorI2RlZmluZSAgTVZfQ09TVChmLHMsY3gsY3kscHgscHkpICAgICAoV0VJR0hURURfQ09TVChmLG12Yml0c1soKGN4KTw8KHMpKS1weF0rbXZiaXRzWygoY3kpPDwocykpLXB5XSkpCisjZGVmaW5lICBNVl9DT1NUX1MoZixjeCxjeSxweCxweSkgICAgIChXRUlHSFRFRF9DT1NUKGYsbXZiaXRzW2N4LXB4XSttdmJpdHNbY3ktcHldKSkKKworLyogZm9yIHN1Yi1wZWwgc2VhcmNoIGFuZCBpbnRlcnBvbGF0aW9uICovCisjZGVmaW5lIFNVQlBFTF9QUkVEX0JMS19TSVpFIDU3NiAvLyAyNHgyNAorI2RlZmluZSBSRUZfQ0VOVEVSIDc1CisjZGVmaW5lIFYyUV9IMFEgMQorI2RlZmluZSBWMFFfSDJRIDIKKyNkZWZpbmUgVjJRX0gyUSAzCisKKy8qCisjZGVmaW5lIFYzUV9IMFEgMQorI2RlZmluZSBWM1FfSDFRIDIKKyNkZWZpbmUgVjBRX0gxUSAzCisjZGVmaW5lIFYxUV9IMVEgNAorI2RlZmluZSBWMVFfSDBRIDUKKyNkZWZpbmUgVjFRX0gzUSA2CisjZGVmaW5lIFYwUV9IM1EgNworI2RlZmluZSBWM1FfSDNRIDgKKyNkZWZpbmUgVjJRX0gzUSA5CisjZGVmaW5lIFYyUV9IMFEgMTAKKyNkZWZpbmUgVjJRX0gxUSAxMQorI2RlZmluZSBWMlFfSDJRIDEyCisjZGVmaW5lIFYzUV9IMlEgMTMKKyNkZWZpbmUgVjBRX0gyUSAxNAorI2RlZmluZSBWMVFfSDJRIDE1CisqLworCisKKyNkZWZpbmUgREVGQVVMVF9PVkVSUlVOX0JVRkZFUl9TSVpFIDEwMDAKKworLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBhYm92ZSBjb3N0IG1vZGVsCitjb25zdCB1aW50OCBDT0VGRl9DT1NUWzJdWzE2XSA9Cit7CisgICAgezMsIDIsIDIsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorICAgIHs5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5LCA5fQorfTsKKworCisKKy8vISBjb252ZXJ0IGZyb20gSC4yNjMgUVAgdG8gSC4yNjQgcXVhbnQgZ2l2ZW4gYnk6IHF1YW50PXBvdygyLFFQLzYpCitjb25zdCBpbnQgUVAyUVVBTlRbNDBdID0KK3sKKyAgICAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAorICAgIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDYsCisgICAgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTQsCisgICAgMTYsIDE4LCAyMCwgMjMsIDI1LCAyOSwgMzIsIDM2LAorICAgIDQwLCA0NSwgNTEsIDU3LCA2NCwgNzIsIDgxLCA5MQorfTsKKworCisvKioKK1RoaXMgZW51bWVyYXRpb24ga2VlcHMgdHJhY2sgb2YgdGhlIGludGVybmFsIHN0YXR1cyBvZiB0aGUgZW5jb2RlciB3aGV0aGVyIGl0IGlzIGRvaW5nCitzb21ldGhpbmcuIFRoZSBlbmNvZGluZyBmbG93IGZvbGxvd3MgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXNlIHN0YXRlcyBhcmUuCitAcHVibGlzaGVkQWxsCisqLwordHlwZWRlZiBlbnVtCit7CisgICAgQVZDRW5jX0luaXRpYWxpemluZyA9IDAsCisgICAgQVZDRW5jX0VuY29kaW5nX1NQUywKKyAgICBBVkNFbmNfRW5jb2RpbmdfUFBTLAorICAgIEFWQ0VuY19BbmFseXppbmdfRnJhbWUsCisgICAgQVZDRW5jX1dhaXRpbmdGb3JCdWZmZXIsICAvLyBwZW5kaW5nIHN0YXRlCisgICAgQVZDRW5jX0VuY29kaW5nX0ZyYW1lLAorfSBBVkNFbmNfU3RhdGUgOworCisvKioKK0JpdHN0cmVhbSBzdHJ1Y3R1cmUgY29udGFpbnMgYml0c3RyZWFtIHJlbGF0ZWQgcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBwb2ludGVyCit0byB0aGUgYnVmZmVyLCB0aGUgY3VycmVudCBieXRlIHBvc2l0aW9uIGFuZCBiaXQgcG9zaXRpb24uIFRoZSBjb250ZW50IG9mIHRoZQorYml0c3RyZWFtQnVmZmVyIHdpbGwgYmUgaW4gRUJTUCBmb3JtYXQgYXMgdGhlIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGNvZGVzIGFyZQorYXV0b21hdGljYWxseSBpbnNlcnRlZCBhcyB0aGUgUkJTUCBpcyByZWNvcmRlZC4KK0BwdWJsaXNoZWRBbGwKKyovCit0eXBlZGVmIHN0cnVjdCB0YWdFbmNCaXRzdHJlYW0KK3sKKyAgICB1aW50OCAqYml0c3RyZWFtQnVmZmVyOyAvKiBwb2ludGVyIHRvIGJ1ZmZlciBtZW1vcnkgICAqLworICAgIGludCBidWZfc2l6ZTsgICAgICAgLyogc2l6ZSBvZiB0aGUgYnVmZmVyIG1lbW9yeSAqLworICAgIGludCB3cml0ZV9wb3M7ICAgICAgLyogbmV4dCBwb3NpdGlvbiB0byB3cml0ZSB0byBiaXRzdHJlYW1CdWZmZXIgICovCisgICAgaW50IGNvdW50X3plcm9zOyAgIC8qIGNvdW50IG51bWJlciBvZiBjb25zZWN1dGl2ZSB6ZXJvICovCisgICAgdWludCBjdXJyZW50X3dvcmQ7ICAvKiBieXRlLXN3YXBwZWQgKE1TQiBsZWZ0KSBjdXJyZW50IHdvcmQgdG8gd3JpdGUgdG8gYnVmZmVyICovCisgICAgaW50IGJpdF9sZWZ0OyAgICAgIC8qIG51bWJlciBvZiBiaXQgbGVmdCBpbiBjdXJyZW50X3dvcmQgKi8KKyAgICB1aW50OCAgICpvdmVycnVuQnVmZmVyOyAgLyogZXh0cmEgb3V0cHV0IGJ1ZmZlciB0byBwcmV2ZW50IGN1cnJlbnQgc2tpcCBkdWUgdG8gb3V0cHV0IGJ1ZmZlciBvdmVycnVuKi8KKyAgICBpbnQgICAgIG9CU2l6ZTsgICAgIC8qIHNpemUgb2YgYWxsb2NhdGVkIG92ZXJydW4gYnVmZmVyICovCisgICAgdm9pZCAgICplbmN2aWQ7IC8qIHBvaW50ZXIgdG8gdGhlIG1haW4gb2JqZWN0ICovCisKK30gQVZDRW5jQml0c3RyZWFtOworCisvKioKK1RoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHJhdGUgY29udHJvbCBwdXJwb3NlIGFuZCBvdGhlciBwZXJmb3JtYW5jZSByZWxhdGVkIGNvbnRyb2wKK3ZhcmlhYmxlcyBzdWNoIGFzLCBSRCBjb3N0LCBzdGF0aXN0aWNzLCBtb3Rpb24gc2VhcmNoIHN0dWZmcywgZXRjLgorc2hvdWxkIGJlIGluIHRoaXMgc3RydWN0dXJlLgorQHB1Ymxpc2hlZEFsbAorKi8KKworCit0eXBlZGVmIHN0cnVjdCB0YWdSREluZm8KK3sKKyAgICBpbnQgUVA7CisgICAgaW50IGFjdHVhbF9iaXRzOworICAgIE9zY2xGbG9hdCBtYWQ7CisgICAgT3NjbEZsb2F0IFJfRDsKK30gUkRJbmZvOworCit0eXBlZGVmIHN0cnVjdCB0YWdNdWx0aVBhc3MKK3sKKyAgICAvKiBtdWx0aXBhc3MgcmF0ZSBjb250cm9sIGRhdGEgKi8KKyAgICBpbnQgdGFyZ2V0X2JpdHM7ICAgIC8qIHRhcmdldCBiaXRzIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5UICovCisgICAgaW50IGFjdHVhbF9iaXRzOyAgICAvKiBhY3R1YWwgYml0cyBmb3IgY3VycmVudCBmcmFtZSBvYnRhaW5lZCBhZnRlciBlbmNvZGluZywgPSByYy0+UmMqLworICAgIGludCBRUDsgICAgICAgICAgICAgLyogcXVhbnRpemF0aW9uIGxldmVsIGZvciBjdXJyZW50IGZyYW1lLCA9IHJjLT5RYyovCisgICAgaW50IHByZXZfUVA7ICAgICAgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgaW50IHByZXZfcHJldl9RUDsgICAvKiBxdWFudGl6YXRpb24gbGV2ZWwgZm9yIHByZXZpb3VzIGZyYW1lIGJlZm9yZSBsYXN0Ki8KKyAgICBPc2NsRmxvYXQgbWFkOyAgICAgICAgICAvKiBtYWQgZm9yIGN1cnJlbnQgZnJhbWUsID0gdmlkZW8tPmF2Z01BRCovCisgICAgaW50IGJpdHJhdGU7ICAgICAgICAvKiBiaXRyYXRlIGZvciBjdXJyZW50IGZyYW1lICovCisgICAgT3NjbEZsb2F0IGZyYW1lcmF0ZTsgICAgLyogZnJhbWVyYXRlIGZvciBjdXJyZW50IGZyYW1lKi8KKworICAgIGludCBuUmVfUXVhbnRpemVkOyAgLyogY29udHJvbCB2YXJpYWJsZSBmb3IgbXVsdGlwYXNzIGVuY29kaW5nLCAqLworICAgIC8qIDAgOiBmaXJzdCBwYXNzICovCisgICAgLyogMSA6IGludGVybWVkaWF0ZSBwYXNzKHF1YW50aXphdGlvbiBhbmQgVkxDIGxvb3Agb25seSkgKi8KKyAgICAvKiAyIDogZmluYWwgcGFzcyhkZS1xdWFudGl6YXRpb24sIGlkY3QsIGV0YykgKi8KKyAgICAvKiAzIDogbWFjcm9ibG9jayBsZXZlbCByYXRlIGNvbnRyb2wgKi8KKworICAgIGludCBlbmNvZGVkX2ZyYW1lczsgICAgIC8qIGNvdW50ZXIgZm9yIGFsbCBlbmNvZGVkIGZyYW1lcyAqLworICAgIGludCByZV9lbmNvZGVkX2ZyYW1lczsgIC8qIGNvdW50ZXIgZm9yIGFsbCBtdWx0aXBhc3MgZW5jb2RlZCBmcmFtZXMqLworICAgIGludCByZV9lbmNvZGVkX3RpbWVzOyAgIC8qIGNvdW50ZXIgZm9yIGFsbCB0aW1lcyBvZiBtdWx0aXBhc3MgZnJhbWUgZW5jb2RpbmcgKi8KKworICAgIC8qIE11bHRpcGxlIGZyYW1lIHByZWRpY3Rpb24qLworICAgIFJESW5mbyAqKnBSRFNhbXBsZXM7ICAgICAgICAvKiBwUkRTYW1wbGVzWzMwXVszMl0sIDMwLT4zMGZwcywgMzIgLT4gNSBiaXQgcXVhbnRpemVyLCAzMiBjYW5kaWRhdGVzKi8KKyAgICBpbnQgZnJhbWVQb3M7ICAgICAgICAgICAgICAgLyogc3BlY2lmaWMgcG9zaXRpb24gaW4gcHJldmlvdXMgbXVsdGlwbGUgZnJhbWVzKi8KKyAgICBpbnQgZnJhbWVSYW5nZTsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG92ZXJhbGwgcHJldmlvdXMgbXVsdGlwbGUgZnJhbWVzICovCisgICAgaW50IHNhbXBsZXNQZXJGcmFtZVszMF07ICAgIC8qIG51bWJlciBvZiBzYW1wbGVzIHBlciBmcmFtZSwgMzAtPjMwZnBzICovCisKKyAgICAvKiBCaXQgYWxsb2NhdGlvbiBmb3Igc2NlbmUgY2hhbmdlIGZyYW1lcyBhbmQgaGlnaCBtb3Rpb24gZnJhbWVzICovCisgICAgT3NjbEZsb2F0IHN1bV9tYWQ7CisgICAgaW50IGNvdW50ZXJfQlRzcmM7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIGZyb20gbG93IG1vdGlvbiBmcmFtZXMgb3IgbGVzcyBjb21wbGljYXRlZGx5IGNvbXByZXNzZWQgZnJhbWVzICovCisgICAgaW50IGNvdW50ZXJfQlRkc3Q7ICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgYml0IHRyYW5zZmVyIHRvIHNjZW5lIGNoYW5nZSBmcmFtZXMgb3IgaGlnaCBtb3Rpb24gZnJhbWVzIG9yIG1vcmUgY29tcGxpY2F0ZWRseSBjb21wcmVzc2VkIGZyYW1lcyAqLworICAgIE9zY2xGbG9hdCBzdW1fUVA7CisgICAgaW50IGRpZmZfY291bnRlcjsgICAvKiBkaWZmX2NvdW50ZXIgPSAtZGlmZl9jb3VudGVyX0JUZHN0LCBvciBkaWZmX2NvdW50ZXJfQlRzcmMgKi8KKworICAgIC8qIEZvciB0YXJnZXQgYml0cmF0ZSBvciBmcmFtZXJhdGUgdXBkYXRlICovCisgICAgT3NjbEZsb2F0IHRhcmdldF9iaXRzX3Blcl9mcmFtZTsgICAgICAgIC8qID0gQyA9IGJpdHJhdGUvZnJhbWVyYXRlICovCisgICAgT3NjbEZsb2F0IHRhcmdldF9iaXRzX3Blcl9mcmFtZV9wcmV2OyAgIC8qIHByZXZpb3VzIEMgKi8KKyAgICBPc2NsRmxvYXQgYXZlcl9tYWQ7ICAgICAgICAgICAgICAgICAgICAgLyogc28tZmFyIGF2ZXJhZ2UgbWFkIGNvdWxkIHJlcGxhY2Ugc3VtX21hZCAqLworICAgIE9zY2xGbG9hdCBhdmVyX21hZF9wcmV2OyAgICAgICAgICAgICAgICAvKiBwcmV2aW91cyBhdmVyYWdlIG1hZCAqLworICAgIGludCAgIG92ZXJsYXBwZWRfd2luX3NpemU7ICAgICAgICAgIC8qIHRyYW5zaXRpb24gcGVyaW9kIG9mIHRpbWUgKi8KKyAgICBpbnQgICBlbmNvZGVkX2ZyYW1lc19wcmV2OyAgICAgICAgICAvKiBwcmV2aW91cyBlbmNvZGVkX2ZyYW1lcyAqLworfSBNdWx0aVBhc3M7CisKKwordHlwZWRlZiBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkKK3sKKyAgICBpbnQgUXA7CisgICAgaW50IFJwOworICAgIE9zY2xGbG9hdCBNcDsgICAvKiBmb3IgTUItYmFzZWQgUkMgKi8KKyAgICBzdHJ1Y3QgdGFnZGF0YVBvaW50QXJyYXkgKm5leHQ7CisgICAgc3RydWN0IHRhZ2RhdGFQb2ludEFycmF5ICpwcmV2OworfSBkYXRhUG9pbnRBcnJheTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDUmF0ZUNvbnRyb2wKK3sKKworICAgIC8qIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGluaXRpYWxpemVkIGJ5IHRoZSB1c2VycyBBVkNFbmNQYXJhbXMgKi8KKyAgICAvKiBiaXRyYXRlLXJvYnVzdG5lc3MgdHJhZGVvZmYgKi8KKyAgICB1aW50IHNjZEVuYWJsZTsgLyogZW5hYmxlIHNjZW5lIGNoYW5nZSBkZXRlY3Rpb24gKi8KKyAgICBpbnQgaWRyUGVyaW9kOyAgLyogSURSIHBlcmlvZCBpbiBudW1iZXIgb2YgZnJhbWVzICovCisgICAgaW50IGludHJhTUJSYXRlOyAgIC8qIGludHJhIE1CIHJlZnJlc2ggcmF0ZSBwZXIgZnJhbWUgKi8KKyAgICB1aW50IGRwRW5hYmxlOyAgLyogZW5hYmxlIGRhdGEgcGFydGl0aW9uaW5nICovCisKKyAgICAvKiBxdWFsaXR5LWNvbXBsZXhpdHkgdHJhZGVvZmYgKi8KKyAgICB1aW50IHN1YlBlbEVuYWJsZTsgIC8qIGVuYWJsZSBxdWFydGVyIHBlbCBzZWFyY2ggKi8KKyAgICBpbnQgbXZSYW5nZTsgICAgLyogbW90aW9uIHZlY3RvciBzZWFyY2ggcmFuZ2UgaW4gKy8tIHBpeGVsICovCisgICAgdWludCBzdWJNQkVuYWJsZTsgIC8qIGVuYWJsZSBzdWIgTUIgcHJlZGljdGlvbiBtb2RlICg0eDQsIDR4OCwgOHg0KSAqLworICAgIHVpbnQgcmRPcHRFbmFibGU7ICAvKiBlbmFibGUgUkQtb3B0IG1vZGUgc2VsZWN0aW9uICovCisgICAgdWludCB0d29QYXNzOyAvKiBmbGFnIGZvciAyIHBhc3MgZW5jb2RpbmcgKCBmb3IgZnV0dXJlICkqLworICAgIHVpbnQgYmlkaXJQcmVkOyAvKiBiaS1kaXJlY3Rpb25hbCBwcmVkaWN0aW9uIGZvciBCLWZyYW1lLiAqLworCisgICAgdWludCByY0VuYWJsZTsgIC8qIGVuYWJsZSByYXRlIGNvbnRyb2wsICcxJyBvbiwgJzAnIGNvbnN0IFFQICovCisgICAgaW50IGluaXRRUDsgLyogaW5pdGlhbCBRUCAqLworCisgICAgLyogbm90ZSB0aGUgZm9sbG93aW5nIDMgcGFyYW1zIGFyZSBmb3IgSFJELCB0aGVzZSB0cmlwbGV0cyBjYW4gYmUgYSBzZXJpZXMKKyAgICBvZiB0cmlwbGV0cyBhcyB0aGUgZ2VuZXJhbGl6ZWQgSFJEIGFsbG93cy4gU0VJIG1lc3NhZ2UgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhpcyBjYXNlLiAqLworICAgIC8qIFdlIG5vIGxvbmdlciBoYXZlIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBDQlIgYW5kIFZCUi4gVGhlIHVzZXJzIHRvIHRoZQorICAgIEFWQyBlbmNvZGVyIGxpYiB3aWxsIGRvIHRoZSBtYXBwaW5nIGZyb20gQ0JSL1ZCUiB0byB0aGVzZSBwYXJhbWV0ZXJzLiAqLworICAgIGludDMyIGJpdFJhdGU7ICAvKiB0YXJnZXQgYml0IHJhdGUgZm9yIHRoZSBvdmVyYWxsIGNsaXAgaW4gYml0cy9zZWNvbmQqLworICAgIGludDMyIGNwYlNpemU7ICAvKiBjb2RlZCBwaWN0dXJlIGJ1ZmZlciBzaXplIGluIGJ5dGVzICovCisgICAgaW50MzIgaW5pdERlbGF5T2Zmc2V0OyAvKiBpbml0aWFsIENCUCByZW1vdmFsIGRlbGF5IGluIGJpdHMgKi8KKworICAgIE9zY2xGbG9hdCBmcmFtZV9yYXRlOyAvKiBmcmFtZSByYXRlICovCisgICAgaW50IHNyY0ludGVydmFsOyAvKiBzb3VyY2UgZnJhbWUgcmF0ZSBpbiBtc2VjICovCisgICAgaW50IGJhc2ljVW5pdDsgIC8qIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBwZXIgQlUgKi8KKworICAgIC8qIFRoZW4gaW50ZXJuYWwgcGFyYW1ldGVycyBmb3IgdGhlIG9wZXJhdGlvbiAqLworICAgIHVpbnQgZmlyc3RfZnJhbWU7IC8qIGEgZmxhZyBmb3IgdGhlIGZpcnN0IGZyYW1lICovCisgICAgaW50IGxhbWJkYV9tZjsgLyogZm9yIGV4YW1wbGUgKi8KKyAgICBpbnQgdG90YWxTQUQ7ICAgIC8qIFNBRCBvZiBjdXJyZW50IGZyYW1lICovCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiB0aGlzIHBhcnQgY29tZXMgZnJvbSBNUEVHNCByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgYWxwaGE7ICAvKiB3ZWlnaHQgZm9yIEkgZnJhbWUgKi8KKyAgICBpbnQgUnM7ICAgICAvKmJpdCByYXRlIGZvciB0aGUgc2VxdWVuY2UgKG9yIHNlZ21lbnQpIGUuZy4sIDI0MDAwIGJpdHMvc2VjICovCisgICAgaW50IFJjOyAgICAgLypiaXRzIHVzZWQgZm9yIHRoZSBjdXJyZW50IGZyYW1lLiBJdCBpcyB0aGUgYml0IGNvdW50IG9idGFpbmVkIGFmdGVyIGVuY29kaW5nLiAqLworICAgIGludCBScDsgICAgIC8qYml0cyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGJ1ZmZlciBwZXIgcGljdHVyZS4gKi8KKyAgICAvKj8gaXMgdGhpcyB0aGUgYXZlcmFnZSBvbmUsIG9yIGp1c3QgdGhlIGJpdHMgY29kZWQgZm9yIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBScHM7ICAgIC8qYml0IHRvIGJlIHJlbW92ZWQgZnJvbSBidWZmZXIgcGVyIHNyYyBmcmFtZSAqLworICAgIE9zY2xGbG9hdCBUczsgICAvKm51bWJlciBvZiBzZWNvbmRzIGZvciB0aGUgc2VxdWVuY2UgIChvciBzZWdtZW50KS4gZS5nLiwgMTAgc2VjICovCisgICAgT3NjbEZsb2F0IEVwOworICAgIE9zY2xGbG9hdCBFYzsgICAvKm1lYW4gYWJzb2x1dGUgZGlmZmVyZW5jZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUgYWZ0ZXIgbW90aW9uIGNvbXBlbnNhdGlvbi4qLworICAgIC8qSWYgdGhlIG1hY3JvYmxvY2sgaXMgaW50cmEgY29kZWQsIHRoZSBvcmlnaW5hbCBzcGF0aWFsIHBpeGVsIHZhbHVlcyBhcmUgc3VtbWVkLiovCisgICAgaW50IFFjOyAgICAgLypxdWFudGl6YXRpb24gbGV2ZWwgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuICovCisgICAgaW50IE5yOyAgICAgLypudW1iZXIgb2YgUCBmcmFtZXMgcmVtYWluaW5nIGZvciBlbmNvZGluZy4qLworICAgIGludCBScjsgLypudW1iZXIgb2YgYml0cyByZW1haW5pbmcgZm9yIGVuY29kaW5nIHRoaXMgc2VxdWVuY2UgKG9yIHNlZ21lbnQpLiovCisgICAgaW50IFJyX09sZDsKKyAgICBpbnQgVDsgICAgICAvKnRhcmdldCBiaXQgdG8gYmUgdXNlZCBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuKi8KKyAgICBpbnQgUzsgICAgICAvKm51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGVuY29kaW5nIHRoZSBwcmV2aW91cyBmcmFtZS4qLworICAgIGludCBIYzsgLypoZWFkZXIgYW5kIG1vdGlvbiB2ZWN0b3IgYml0cyB1c2VkIGluIHRoZSBjdXJyZW50IGZyYW1lLiBJdCBpbmNsdWRlcyBhbGwgdGhlICBpbmZvcm1hdGlvbiBleGNlcHQgdG8gdGhlIHJlc2lkdWFsIGluZm9ybWF0aW9uLiovCisgICAgaW50IEhwOyAvKmhlYWRlciBhbmQgbW90aW9uIHZlY3RvciBiaXRzIHVzZWQgaW4gdGhlIHByZXZpb3VzIGZyYW1lLiBJdCBpbmNsdWRlcyBhbGwgdGhlICAgICBpbmZvcm1hdGlvbiBleGNlcHQgdG8gdGhlIHJlc2lkdWFsIGluZm9ybWF0aW9uLiovCisgICAgaW50IFFsOyAvKnF1YW50aXphdGlvbiBsZXZlbCB1c2VkIGluIHRoZSBwcmV2aW91cyBmcmFtZSAqLworICAgIGludCBCczsgLypidWZmZXIgc2l6ZSBlLmcuLCBSLzIgKi8KKyAgICBpbnQgQjsgICAgICAvKmN1cnJlbnQgYnVmZmVyIGxldmVsIGUuZy4sIFIvNCAtIHN0YXJ0IGZyb20gdGhlIG1pZGRsZSBvZiB0aGUgYnVmZmVyICovCisgICAgT3NjbEZsb2F0IFgxOworICAgIE9zY2xGbG9hdCBYMjsKKyAgICBPc2NsRmxvYXQgWDExOworICAgIE9zY2xGbG9hdCBNOyAgICAgICAgICAgIC8qc2FmZSBtYXJnaW4gZm9yIHRoZSBidWZmZXIgKi8KKyAgICBPc2NsRmxvYXQgc21UaWNrOyAgICAvKnJhdGlvIG9mIHNyYyB2ZXJzdXMgZW5jIGZyYW1lIHJhdGUgKi8KKyAgICBkb3VibGUgcmVtbmFudDsgIC8qcmVtYWluZGVyIGZyYW1lIG9mIHNyYy9lbmMgZnJhbWUgZm9yIGZpbmUgZnJhbWUgc2tpcHBpbmcgKi8KKyAgICBpbnQgdGltZUluY1JlczsgLyogdm9sLT50aW1lSW5jcmVtZW50UmVzb2x1dGlvbiAqLworCisgICAgZGF0YVBvaW50QXJyYXkgICAqZW5kOyAvKnF1YW50aXphdGlvbiBsZXZlbHMgZm9yIHRoZSBwYXN0ICgyMCkgZnJhbWVzICovCisKKyAgICBpbnQgICAgIGZyYW1lTnVtYmVyOyAvKiByYW5naW5nIGZyb20gMCB0byAyMCBub2RlcyovCisgICAgaW50ICAgICB3OworICAgIGludCAgICAgTnJfT3JpZ2luYWw7CisgICAgaW50ICAgICBOcl9PbGQsIE5yX09sZDI7CisgICAgaW50ICAgICBza2lwX25leHRfZnJhbWU7CisgICAgaW50ICAgICBRZGVwOyAgICAgICAvKiBzbW9vdGggUSBhZGp1c3RtZW50ICovCisgICAgaW50ICAgICBWQlJfRW5hYmxlZDsKKworICAgIGludCB0b3RhbEZyYW1lTnVtYmVyOyAvKiB0b3RhbCBjb2RlZCBmcmFtZXMsIGZvciBkZWJ1Z2dpbmchISovCisKKyAgICBjaGFyICAgIG9GaXJzdFRpbWU7CisKKyAgICBpbnQgbnVtRnJhbWVCaXRzOyAvKiBrZWVwIHRyYWNrIG9mIG51bWJlciBvZiBiaXRzIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCisgICAgaW50IE51bWJlcm9mSGVhZGVyQml0czsKKyAgICBpbnQgTnVtYmVyb2ZUZXh0dXJlQml0czsKKyAgICBpbnQgbnVtTUJIZWFkZXJCaXRzOworICAgIGludCBudW1NQlRleHR1cmVCaXRzOworICAgIGRvdWJsZSAqTUFEb2ZNQjsKKyAgICBpbnQzMiBiaXRzUGVyRnJhbWU7CisKKyAgICAvKiBCWCByYXRlIGNvbnRyb2wsIHNvbWV0aGluZyBsaWtlIFRNTjggcmF0ZSBjb250cm9sKi8KKworICAgIE11bHRpUGFzcyAqcE1QOworCisgICAgaW50ICAgICBUTU5fVzsKKyAgICBpbnQgICAgIFRNTl9USDsKKyAgICBpbnQgICAgIFZCVl9mdWxsbmVzczsKKyAgICBpbnQgICAgIG1heF9CaXRWYXJpYW5jZV9udW07IC8qIHRoZSBudW1iZXIgb2YgdGhlIG1heGltdW0gYml0IHZhcmlhbmNlIHdpdGhpbiB0aGUgZ2l2ZW4gYnVmZmVyIHdpdGggdGhlIHVuaXQgb2YgMTAlIG9mIGJpdHJhdGUvZnJhbWVyYXRlKi8KKyAgICBpbnQgICAgIGVuY29kZWRfZnJhbWVzOyAvKiBjb3VudGVyIGZvciBhbGwgZW5jb2RlZCBmcmFtZXMgKi8KKyAgICBpbnQgICAgIGxvd19ib3VuZDsgICAgICAgICAgICAgIC8qIGJvdW5kIGZvciB1bmRlcmZsb3cgZGV0ZWN0aW9uLCB1c3VhbGx5IGxvd19ib3VuZD0tQnMvMiwgYnV0IGNvdWxkIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSAqLworICAgIGludCAgICAgVkJWX2Z1bGxuZXNzX29mZnNldDsgICAgLyogb2Zmc2V0IG9mIFZCVl9mdWxsbmVzcywgdXN1YWxseSBpcyB6ZXJvLCBidXQgY2FuIGJlIGNoYW5nZWQgaW4gSC4yNjMgbW9kZSovCisgICAgLyogRW5kIEJYICovCisKK30gQVZDUmF0ZUNvbnRyb2w7CisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBpcyBmb3IgdGhlIG1vdGlvbiB2ZWN0b3IgaW5mb3JtYXRpb24uICovCit0eXBlZGVmIHN0cnVjdCB0YWdNVgoreworICAgIGludCB4OworICAgIGludCB5OworICAgIHVpbnQgc2FkOworfSBBVkNNVjsKKworLyoqCitUaGlzIHN0cnVjdHVyZSBjb250YWlucyBmdW5jdGlvbiBwb2ludGVycyBmb3IgZGlmZmVyZW50IHBsYXRmb3JtIGRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBvZgorZnVuY3Rpb25zLiAqLwordHlwZWRlZiBzdHJ1Y3QgdGFnQVZDRW5jRnVuY1B0cgoreworCisgICAgaW50ICgqU0FEX01CX0hhbGZQZWxbNF0pKHVpbnQ4KiwgdWludDgqLCBpbnQsIHZvaWQgKik7CisgICAgaW50ICgqU0FEX01hY3JvYmxvY2spKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKworfSBBVkNFbmNGdW5jUHRyOworCisvKioKK1RoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgY29ycmVjdCBwYWRkaW5nLgorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1BhZEluZm8KK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGo7CisgICAgaW50IGhlaWdodDsKK30gQVZDUGFkSW5mbzsKKworCisjaWZkZWYgSFRGTQordHlwZWRlZiBzdHJ1Y3QgdGFnSFRGTV9TdGF0Cit7CisgICAgaW50IGFic19kaWZfbWFkX2F2ZzsKKyAgICB1aW50IGNvdW50YnJlYWs7CisgICAgaW50IG9mZnNldEFycmF5WzE2XTsKKyAgICBpbnQgb2Zmc2V0UmVmWzE2XTsKK30gSFRGTV9TdGF0OworI2VuZGlmCisKKworLyoqCitUaGlzIHN0cnVjdHVyZSBpcyB0aGUgbWFpbiBvYmplY3QgZm9yIEFWQyBlbmNvZGVyIGxpYnJhcnkgcHJvdmlkaW5nIGFjY2VzcyB0byBhbGwKK2dsb2JhbCB2YXJpYWJsZXMuIEl0IGlzIGFsbG9jYXRlZCBhdCBQVkFWQ0luaXRFbmNvZGVyIGFuZCBmcmVlZCBhdCBQVkFWQ0NsZWFuVXBFbmNvZGVyLgorQHB1Ymxpc2hlZEFsbAorKi8KK3R5cGVkZWYgc3RydWN0IHRhZ0VuY09iamVjdAoreworCisgICAgQVZDQ29tbW9uT2JqICpjb21tb247CisKKyAgICBBVkNFbmNCaXRzdHJlYW0gICAgICpiaXRzdHJlYW07IC8qIGZvciBjdXJyZW50IE5BTCAqLworICAgIHVpbnQ4ICAgKm92ZXJydW5CdWZmZXI7ICAvKiBleHRyYSBvdXRwdXQgYnVmZmVyIHRvIHByZXZlbnQgY3VycmVudCBza2lwIGR1ZSB0byBvdXRwdXQgYnVmZmVyIG92ZXJydW4qLworICAgIGludCAgICAgb0JTaXplOyAgICAgLyogc2l6ZSBvZiBhbGxvY2F0ZWQgb3ZlcnJ1biBidWZmZXIgKi8KKworICAgIC8qIHJhdGUgY29udHJvbCAqLworICAgIEFWQ1JhdGVDb250cm9sICAgICAgKnJhdGVDdHJsOyAvKiBwb2ludGVyIHRvIHRoZSByYXRlIGNvbnRyb2wgc3RydWN0dXJlICovCisKKyAgICAvKiBlbmNvZGluZyBvcGVyYXRpb24gKi8KKyAgICBBVkNFbmNfU3RhdGUgICAgICAgIGVuY19zdGF0ZTsgLyogZW5jb2Rpbmcgc3RhdGUgKi8KKworICAgIEFWQ0ZyYW1lSU8gICAgICAgICAgKmN1cnJJbnB1dDsgLyogcG9pbnRlciB0byB0aGUgY3VycmVudCBpbnB1dCBmcmFtZSAqLworCisgICAgaW50ICAgICAgICAgICAgICAgICBjdXJyU2xpY2VHcm91cDsgLyogY3VycmVudGx5IGVuY29kZWQgc2xpY2UgZ3JvdXAgaWQgKi8KKworICAgIGludCAgICAgbGV2ZWxbMjRdWzE2XSwgcnVuWzI0XVsxNl07IC8qIHNjcmF0Y2ggbWVtb3J5ICovCisgICAgaW50ICAgICBsZXZlbGRjWzE2XSwgcnVuZGNbMTZdOyAvKiBmb3IgREMgY29tcG9uZW50ICovCisgICAgaW50ICAgICBsZXZlbGNkY1sxNl0sIHJ1bmNkY1sxNl07IC8qIGZvciBjaHJvbWEgREMgY29tcG9uZW50ICovCisgICAgaW50ICAgICBudW1jb2VmY2RjWzJdOyAvKiBudW1iZXIgb2YgY29lZmZpY2llbnQgZm9yIGNocm9tYSBEQyAqLworICAgIGludCAgICAgbnVtY29lZmRjOyAgICAgIC8qIG51bWJlciBvZiBjb2VmZmljaWVudHMgZm9yIERDIGNvbXBvbmVudCAqLworCisgICAgaW50ICAgICBxcF9jb25zdDsKKyAgICBpbnQgICAgIHFwX2NvbnN0X2M7CisgICAgLyoqKioqKioqKiBpbnRyYSBwcmVkaWN0aW9uIHNjcmF0Y2ggbWVtb3J5ICoqKioqKioqKioqKioqKioqKioqKiovCisgICAgdWludDggICBwcmVkX2kxNltBVkNOdW1JMTZQcmVkTW9kZV1bMjU2XTsgLyogc2F2ZSBwcmVkaWN0aW9uIGZvciBNQiAqLworICAgIHVpbnQ4ICAgcHJlZF9pNFtBVkNOdW1JNFByZWRNb2RlXVsxNl07ICAvKiBzYXZlIHByZWRpY3Rpb24gZm9yIGJsayAqLworICAgIHVpbnQ4ICAgcHJlZF9pY1tBVkNOdW1JQ2hyb21hTW9kZV1bMTI4XTsgIC8qIGZvciAyIGNocm9tYSAqLworCisgICAgaW50ICAgICBtb3N0UHJvYmFibGVJNE1vZGVbMTZdOyAvKiBpbiByYXN0ZXIgc2NhbiBvcmRlciAqLworICAgIC8qKioqKioqKiogbW90aW9uIGNvbXBlbnNhdGlvbiByZWxhdGVkIHZhcmlhYmxlcyAqKioqKioqKioqKioqKioqLworICAgIEFWQ01WICAgKm1vdDE2eDE2OyAgICAgICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgMTZ4MTYgYmxvY2sqLworICAgIEFWQ01WKCptb3QxNng4KVsyXTsgICAgIC8qIFNhdmVkIG1vdGlvbiB2ZWN0b3JzIGZvciAxNng4IGJsb2NrKi8KKyAgICBBVkNNVigqbW90OHgxNilbMl07ICAgICAvKiBTYXZlZCBtb3Rpb24gdmVjdG9ycyBmb3IgOHgxNiBibG9jayovCisgICAgQVZDTVYoKm1vdDh4OClbNF07ICAgICAgLyogU2F2ZWQgbW90aW9uIHZlY3RvcnMgZm9yIDh4OCBibG9jayovCisKKyAgICAvKioqKioqKioqIHN1YnBlbCBwb3NpdGlvbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzIgIHN1YnBlbF9wcmVkW1NVQlBFTF9QUkVEX0JMS19TSVpFLyo8PDIqL107IC8qIGFsbCAxNiBzdWItcGVsIHBvc2l0aW9ucyAgKi8KKyAgICB1aW50OCAgICpocGVsX2NhbmRbOV07ICAgICAgLyogcG9pbnRlciB0byBoYWxmLXBlbCBwb3NpdGlvbiAqLworICAgIGludCAgICAgYmVzdF9ocGVsX3BvczsgICAgICAgICAgLyogYmVzdCBwb3NpdGlvbiAqLworICAgIHVpbnQ4ICAgcXBlbF9jYW5kWzhdWzI0KjE2XTsgICAgICAgIC8qIHBvaW50ZXIgdG8gcXVhcnRlci1wZWwgcG9zaXRpb24gKi8KKyAgICBpbnQgICAgIGJlc3RfcXBlbF9wb3M7CisgICAgdWludDggICAqYmlsaW5fYmFzZVs5XVs0XTsgICAgLyogcG9pbnRlciB0byA0IHBvc2l0aW9uIGF0IHRvcCBsZWZ0IG9mIGJpbGluZWFyIHF1YXJ0ZXItcGVsICovCisKKyAgICAvKiBuZWVkIGZvciBpbnRyYSByZWZyZXNoIHJhdGUgKi8KKyAgICB1aW50OCAgICppbnRyYVNlYXJjaDsgICAgICAgLyogSW50cmEgQXJyYXkgZm9yIE1CcyB0byBiZSBpbnRyYSBzZWFyY2hlZCAqLworICAgIHVpbnQgICAgZmlyc3RJbnRyYVJlZnJlc2hNQkluZHg7IC8qIGtlZXAgdHJhY2sgZm9yIGludHJhIHJlZnJlc2ggKi8KKworICAgIGludCAgICAgaTRfc2FkOyAgICAgICAgICAgICAvKiB0ZW1wb3JhcnkgZm9yIGk0IG1vZGUgU0FEICovCisgICAgaW50ICAgICAqbWluX2Nvc3Q7ICAgICAgICAgIC8qIE1pbmltdW0gY29zdCBmb3IgdGhlIGFsbCBNQnMgKi8KKyAgICBpbnQgICAgIGxhbWJkYV9tb2RlOyAgICAgICAgLyogTGFncmFuZ2UgcGFyYW1ldGVyIGZvciBtb2RlIHNlbGVjdGlvbiAqLworICAgIGludCAgICAgbGFtYmRhX21vdGlvbjsgICAgICAvKiBMYWdyYW5nZSBwYXJhbWV0ZXIgZm9yIE1WIHNlbGVjdGlvbiAqLworCisgICAgdWludDggICAqbXZiaXRzX2FycmF5OyAgICAgIC8qIFRhYmxlIGZvciBiaXRzIHNwZW50IGluIHRoZSBjb3N0IGZ1bmNpdG9uICovCisgICAgdWludDggICAqbXZiaXRzOyAgICAgICAgICAgIC8qIEFuIG9mZnNldCB0byB0aGUgYWJvdmUgYXJyYXkuICovCisKKyAgICAvKiB0byBzcGVlZHVwIHRoZSBTQUQgY2FsY3VsYXRpb24gKi8KKyAgICB2b2lkICpzYWRfZXh0cmFfaW5mbzsKKyAgICB1aW50OCBjdXJyWU1CWzI1Nl07ICAgICAvKiBpbnRlcmxlYXZlZCBjdXJyZW50IG1hY3JvYmxvY2sgaW4gSFRGTSBvcmRlciAqLworCisjaWZkZWYgSFRGTQorICAgIGludCBucm1sel90aFs0OF07ICAgICAgIC8qIFRocmVzaG9sZCBmb3IgZmFzdCBTQUQgY2FsY3VsYXRpb24gdXNpbmcgSFRGTSAqLworICAgIEhURk1fU3RhdCBodGZtX3N0YXQ7ICAgIC8qIEZvciBzdGF0aXN0aWNzIGNvbGxlY3Rpb24gKi8KKyNlbmRpZgorCisgICAgLyogc3RhdGlzdGljcyAqLworICAgIGludCBudW1JbnRyYU1COyAgICAgICAgIC8qIGtlZXAgdHJhY2sgb2YgbnVtYmVyIG9mIGludHJhIE1CICovCisKKyAgICAvKiBlbmNvZGluZyBjb21wbGV4aXR5IGNvbnRyb2wgKi8KKyAgICB1aW50IGZ1bGxzZWFyY2hfZW5hYmxlOyAvKiBmbGFnIHRvIGVuYWJsZSBmdWxsLXBlbCBmdWxsLXNlYXJjaCAqLworCisgICAgLyogbWlzYy4qLworICAgIGJvb2wgb3V0T2ZCYW5kUGFyYW1TZXQ7IC8qIGZsYWcgdG8gZW5hYmxlIG91dC1vZi1iYW5kIHBhcmFtIHNldCAqLworCisgICAgQVZDU2VxUGFyYW1TZXQgZXh0U1BTOyAvKiBmb3IgZXh0ZXJuYWwgU1BTICovCisgICAgQVZDUGljUGFyYW1TZXQgZXh0UFBTOyAvKiBmb3IgZXh0ZXJuYWwgUFBTICovCisKKyAgICAvKiB0aW1lIGNvbnRyb2wgKi8KKyAgICB1aW50MzIgIHByZXZGcmFtZU51bTsgICAvKiBwcmV2aW91cyBmcmFtZSBudW1iZXIgc3RhcnRpbmcgZnJvbSBtb2RUaW1lUmVmICovCisgICAgdWludDMyICBtb2RUaW1lUmVmOyAgICAgLyogUmVmZXJlbmNlIG1vZFRpbWUgdXBkYXRlIGV2ZXJ5IEktVm9wKi8KKyAgICB1aW50MzIgIHdyYXBNb2RUaW1lOyAgICAvKiBPZmZzZXQgdG8gbW9kVGltZSBSZWYsIHJhcmVseSB1c2VkICovCisKKyAgICB1aW50ICAgIHByZXZQcm9jRnJhbWVOdW07ICAvKiBwcmV2aW91c2x5IHByb2Nlc3NlZCBmcmFtZSBudW1iZXIsIGNvdWxkIGJlIHNraXBwZWQgKi8KKyAgICB1aW50ICAgIHByZXZDb2RlZEZyYW1lTnVtOyAgLyogcHJldmlvdXNseSBlbmNvZGVkIGZyYW1lIG51bWJlciAqLworICAgIC8qIFBPQyByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgIHVpbnQzMiAgZGlzcE9yZFBPQ1JlZjsgICAgICAvKiByZWZlcmVuY2UgUE9DIGlzIGRpc3BsYXllciBvcmRlciB1bml0LiAqLworCisgICAgLyogRnVuY3Rpb24gcG9pbnRlcnMgKi8KKyAgICBBVkNFbmNGdW5jUHRyICpmdW5jdGlvblBvaW50ZXI7IC8qIHN0b3JlIHBvaW50ZXJzIHRvIHBsYXRmb3JtIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworCisgICAgLyogQXBwbGljYXRpb24gY29udHJvbCBkYXRhICovCisgICAgQVZDSGFuZGxlICphdmNIYW5kbGU7CisKKworfSBBVkNFbmNPYmplY3Q7CisKKworI2VuZGlmIC8qQVZDRU5DX0lOVF9IX0lOQ0xVREVEKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2F2Y2VuY19saWIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfbGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlMjhlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9hdmNlbmNfbGliLmgKQEAgLTAsMCArMSwxMDIwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCitUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIG9mIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgQVZDIGRlY29kZXIgbGlicmFyeS4KK0BwdWJsaXNoZWRBbGwKKyovCisjaWZuZGVmIEFWQ0VOQ19MSUJfSF9JTkNMVURFRAorI2RlZmluZSBBVkNFTkNfTElCX0hfSU5DTFVERUQKKworI2lmbmRlZiBBVkNMSUJfQ09NTU9OX0hfSU5DTFVERUQKKyNpbmNsdWRlICJhdmNsaWJfY29tbW9uLmgiCisjZW5kaWYKKyNpZm5kZWYgQVZDRU5DX0lOVF9IX0lOQ0xVREVECisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisgICAgLyotLS0tLS0tLS0tLS0tIGJsb2NrLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm0gcmVzaWR1ZSBjYWxjdWxhdGlvbiwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgaW52ZXJzZSBxdWFudGl6ZSwKKyAgICBpbnZlcnNlIHRyYW5zZm9ybSBhbmQgcmVzaWR1ZSBjb21wZW5zYXRpb24gb24gYSA0eDQgYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJibGtpZHgiICAicmFzdGVyIHNjYW4gYmxvY2sgaW5kZXggb2YgdGhlIGN1cnJlbnQgNHg0IGJsb2NrLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgYmxvY2suIgorICAgIFxwYXJhbSAib3JnIiAgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgYmxvY2suIgorICAgIFxwYXJhbSAiY29lZl9jb3N0IiAgIlBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IGNvc3QgdG8gYmUgZmlsbGVkIGluIGFuZCByZXR1cm5lZC4iCisgICAgXHJldHVybiAiTnVtYmVyIG9mIG5vbi16ZXJvIGNvZWZmaWNpZW50cy4iCisgICAgKi8KKyAgICBpbnQgZGN0X2x1bWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcsIGludCAqY29lZl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgSURDVCBvbiBhbiBJTlRFUiBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIHRoZSBtYWNyb2Jsb2NrIG9uIHRoZSBjdXJyZW50IGZyYW1lLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInBpY1BpdGNoIiAiUGl0Y2ggb2YgdGhlIGN1cnJlbnQgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiLgorICAgICovCisgICAgdm9pZCBNQkludGVySWRjdChBVkNDb21tb25PYmogKnZpZGVvLCB1aW50OCAqY3VyTCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgcGljUGl0Y2gpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtIHJlc2lkdWUgY2FsY3VsYXRpb24sIHRyYW5zZm9ybSwgcXVhbnRpemUsIGludmVyc2UgcXVhbnRpemUsCisgICAgaW52ZXJzZSB0cmFuc2Zvcm0gYW5kIHJlc2lkdWUgY29tcGVuc2F0aW9uIG9uIGEgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIHJlY29uc3RydWN0ZWQgTUIuIgorICAgIFxwYXJhbSAib3JnTCIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIE1CLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBkY3RfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ckwsIHVpbnQ4ICpvcmdMKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybSByZXNpZHVlIGNhbGN1bGF0aW9uLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBpbnZlcnNlIHF1YW50aXplLAorICAgIGludmVyc2UgdHJhbnNmb3JtIGFuZCByZXNpZHVlIGNvbXBlbnNhdGlvbiBmb3IgY2hyb21hIGNvbXBvbmVudHMgb2YgYW4gTUIuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJjdXJDIiAgICJQb2ludGVyIHRvIHRoZSByZWNvbnN0cnVjdGVkIE1CLiIKKyAgICBccGFyYW0gIm9yZ0MiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBNQi4iCisgICAgXHBhcmFtICJjciIgICAgICJGbGFnIHdoZXRoZXIgaXQgaXMgQ3Igb3Igbm90LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBkY3RfY2hyb21hKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyQywgdWludDggKm9yZ0MsIGludCBjcik7CisKKyAgICAvKi0tLS0tLS0tLS0tIGluaXQuYyAtLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaW50ZXJwcmV0cyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBwcm92aWRlZCBieSB1c2VycyBpbiBlbmNQYXJhbS4KKyAgICBUaGUgcmVzdWx0cyBhcmUga2VwdCBpbiBBVkNFbmNPYmplY3QsIEFWQ1NlcVBhcmFtU2V0LCBBVkNQaWNQYXJhbVNldCBhbmQgQVZDU2xpY2VIZWFkZXIuCisgICAgXHBhcmFtICJlbmN2aWQiICAgICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAiZW5jUGFyYW0iICAgIlBvaW50ZXIgdG8gQVZDRW5jUGFyYW0uIgorICAgIFxwYXJhbSAiZXh0U1BTIiAgICAgIkV4dGVybmFsIFNQUyB0ZW1wbGF0ZSB0byBiZSBmb2xsb3dlZC4gTlVMTCBpZiBub3QgcHJlc2VudC4iCisgICAgXHBhcmFtICJleHRQUFMiICAgICAiRXh0ZXJuYWwgUFBTIHRlbXBsYXRlIHRvIGJlIGZvbGxvd2VkLiBOVUxMIGlmIG5vdCBwcmVzZW50LiIKKyAgICBccmV0dXJuICJzZWUgQVZDRW5jX1N0YXR1cy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzICBTZXRFbmNvZGVQYXJhbShBVkNIYW5kbGUgKmF2Y0hhbmRsZSwgQVZDRW5jUGFyYW1zICplbmNQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpleHRTUFMsIHZvaWQgKmV4dFBQUyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHdoZXRoZXIgdGhleSBtZWV0IHRoZSBzZXQgb2Ygc3VwcG9ydGVkCisgICAgdG9vbCBieSBhIHNwZWNpZmljIHByb2ZpbGUuIElmIHRoZSBwcm9maWxlIGlzIG5vdCBzZXQsIGl0IHdpbGwganVzdCBmaW5kIHRoZSBjbG9zZXN0CisgICAgcHJvZmlsZSBpbnN0ZWFkIG9mIHZlcmlmeWluZyBpdC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInNlcVBhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1NlcVBhcmFtU2V0LiIKKyAgICBccGFyYW0gInBpY1BhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1BpY1BhcmFtU2V0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRCBpZiB0aGUgc3BlY2lmaWVkIHByb2ZpbGUKKyAgICAgICAgICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwKKyAgICAgICAgICAgIEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEIGlmIGFueSBvZiB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIHRvb2xzIGFyZQorICAgICAgICAgICAgbm90IHN1cHBvcnRlZCBieSB0aGUgdXNlci1zZWxlY3RlZCBwcm9maWxlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgVmVyaWZ5UHJvZmlsZShBVkNFbmNPYmplY3QgKnZpZGVvLCBBVkNTZXFQYXJhbVNldCAqc2VxUGFyYW0sIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHZlcmlmaWVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHdoZXRoZXIgdGhleSBtZWV0IHRoZSByZXF1aXJlbWVudAorICAgIGZvciBhIHNwZWNpZmljIGxldmVsLiBJZiB0aGUgbGV2ZWwgaXMgbm90IHNldCwgaXQgd2lsbCBqdXN0IGZpbmQgdGhlIGNsb3Nlc3QKKyAgICBsZXZlbCBpbnN0ZWFkIG9mIHZlcmlmeWluZyBpdC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInNlcVBhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1NlcVBhcmFtU2V0LiIKKyAgICBccGFyYW0gInBpY1BhcmFtIiAgICJQb2ludGVyIHRvIEFWQ1BpY1BhcmFtU2V0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLAorICAgICAgICAgICAgQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQgaWYgdGhlIHNwZWNpZmllZCBsZXZlbAorICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LAorICAgICAgICAgICAgQVZDRU5DX0xFVkVMX0ZBSUwgaWYgYW55IG9mIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIGV4Y2VlZAorICAgICAgICAgICAgdGhlIHJhbmdlIG9mIHRoZSB1c2VyLXNlbGVjdGVkIGxldmVsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgVmVyaWZ5TGV2ZWwoQVZDRW5jT2JqZWN0ICp2aWRlbywgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jaXRvbiBpbml0aWFsaXplcyB0aGUgZnJhbWUgZW5jb2RpbmcgYnkgc2V0dGluZyBwb2MvZnJhbWVfbnVtIHJlbGF0ZWQgcGFyYW1ldGVycy4gaXQKKyAgICBhbHNvIHBlcmZvcm1zIG1vdGlvbiBlc3RpbWF0aW9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNFTkNfTk9fUElDVFVSRSBpZiB0aGVyZSBpcyBubyBpbnB1dCBwaWN0dXJlCisgICAgICAgICAgICBpbiB0aGUgcXVldWUgdG8gZW5jb2RlLCBBVkNFTkNfUE9DX0ZBSUwgb3IgQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRiBmb3IgUE9DCisgICAgICAgICAgICByZWxhdGVkIGVycm9ycywgQVZDRU5DX05FV19JRFIgaWYgbmV3IElEUiBpcyBkZXRlY3RlZC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHNsaWNlIGhlYWRlciByZWxhdGVkIHZhcmlhYmxlcyBhbmQgb3RoZXIgdmFyaWFibGVzIG5lY2Vzc2FyeQorICAgIGZvciBkZWNvZGluZyBvbmUgc2xpY2UuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0U2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyotLS0tLS0tLS0tLSBoZWFkZXIuYyAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGJpdHN0cmVhbSBlbmNvZGluZyBvZiB0aGUgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBOQUwuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX1NQU19GQUlMIG9yIG90aGVycyBmb3IgdW5leHBlY3RlZCBmYWlsdXJlIHdoaWNoCisgICAgc2hvdWxkIG5vdCBvY2N1ci4gVGhlIFNQUyBwYXJhbWV0ZXJzIHNob3VsZCBhbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlU1BTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdGhlIFZVSSBwYXJhbWV0ZXJzIGludG8gdGhlIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYml0c3RyZWFtLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAidnVpIiAgICAiUG9pbnRlciB0byBBVkNWVUlQYXJhbXMuIgorICAgIFxyZXR1cm4gIm5vdGhpbmcuIgorICAgICovCisgICAgdm9pZCBFbmNvZGVWVUkoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ1ZVSVBhcmFtcyogdnVpKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBIUkQgcGFyYW1ldGVycyBpbnRvIHRoZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0IGJpdHN0cmVhbQorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiaHJkIiAgICAiUG9pbnRlciB0byBBVkNIUkRQYXJhbXMuIgorICAgIFxyZXR1cm4gIm5vdGhpbmcuIgorICAgICovCisgICAgdm9pZCBFbmNvZGVIUkQoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ0hSRFBhcmFtcyogaHJkKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBiaXRzdHJlYW0gZW5jb2Rpbmcgb2YgdGhlIHBpY3R1cmUgcGFyYW1ldGVyIHNldCBOQUwuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX1BQU19GQUlMIG9yIG90aGVycyBmb3IgdW5leHBlY3RlZCBmYWlsdXJlIHdoaWNoCisgICAgc2hvdWxkIG5vdCBvY2N1ci4gVGhlIFNQUyBwYXJhbWV0ZXJzIHNob3VsZCBhbGwgYmUgdmVyaWZpZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlUFBTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgc2xpY2UgaGVhZGVyIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBiZWVuIGluaXRpYWxpemVkIG9yIGZhYnJpY2F0ZWQKKyAgICBwcmlvciB0byBlbnRlcmluZyB0aGlzIGZ1bmNpdG9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIGJpdHN0cmVhbSBmYWlsIHN0YXR1c2VzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlU2xpY2VIZWFkZXIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyByZWZlcmVuY2UgcGljdHVyZSBsaXN0IHJlb3JkZXJpbmcgcmVsdGVkIHN5bnRheC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAic2xpY2VIZHIiICJQb2ludGVyIHRvIEFWQ1NsaWNlSGRyLiIKKyAgICBccGFyYW0gInNsaWNlX3R5cGUiICJWYWx1ZSBvZiBzbGljZV90eXBlIC0gNSBpZiBncmVhdGVyIHRoYW4gNS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MgYW5kIEFWQ0VOQ19GQUlMIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIsIGludCBzbGljZV90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBkZWNfcmVmX3BpY19tYXJraW5nIHJlbGF0ZWQgc3ludGF4LgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJzbGljZUhkciIgIlBvaW50ZXIgdG8gQVZDU2xpY2VIZHIuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIGFuZCBBVkNFTkNfRkFJTCBvdGhlcndpc2UuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBkZWNfcmVmX3BpY19tYXJraW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgUE9DIHJlbGF0ZWQgdmFyaWFibGVzIGFuZCB0aGUgUE9DIHN5bnRheCB0byBiZSBlbmNvZGVkCisgICAgdG8gdGhlIHNsaWNlIGhlYWRlciBkZXJpdmVkIGZyb20gdGhlIGRpc3Bfb3JkZXIgYW5kIGlzX3JlZmVyZW5jZSBmbGFnIG9mIHRoZSBvcmlnaW5hbAorICAgIGlucHV0IGZyYW1lIHRvIGJlIGVuY29kZWQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3MsCisgICAgICAgICAgICBBVkNFTkNfUE9DX0ZBSUwgaWYgdGhlIHBvYyB0eXBlIGlzIHVuZGVmaW5lZCBvcgorICAgICAgICAgICAgQVZDRU5DX0NPTlNFQ1VUSVZFX05PTlJFRiBpZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgbm9uLXJlZmVyZW5jZSBmcmFtZSBmb3IgUE9DIHR5cGUgMi4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRQT0MoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIFBPQyByZWxhdGVkIG9wZXJhdGlvbiBhZnRlciBhIHBpY3R1cmUgaXMgZGVjb2RlZC4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBQb3N0UE9DKEFWQ0NvbW1vbk9iaiAqdmlkZW8pOworCisgICAgLyotLS0tLS0tLS0tLSBiaXRzdHJlYW1faW8uYyAtLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBiaXRzdHJlYW0gc3RydWN0dXJlIHdpdGggdGhlIGluZm9ybWF0aW9uIGdpdmVuIGJ5CisgICAgdGhlIHVzZXJzLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiYnVmZmVyIiAgICAgIlBvaW50ZXIgdG8gdGhlIHVuc2lnbmVkIGNoYXIgYnVmZmVyIGZvciBvdXRwdXQuIgorICAgIFxwYXJhbSAiYnVmX3NpemUiICAgIlRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuIgorICAgIFxwYXJhbSAib3ZlcnJ1bkJ1ZmZlciIgICJQb2ludGVyIHRvIGV4dHJhIG92ZXJydW4gYnVmZmVyLiIKKyAgICBccGFyYW0gIm9CU2l6ZSIgICAgICJTaXplIG9mIG92ZXJydW4gYnVmZmVyIGluIGJ5dGVzLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzLCBBVkNFTkNfQklUU1RSRUFNX0lOSVRfRkFJTCBpZiBmYWlsIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1FbmNJbml0KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50OCAqYnVmZmVyLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdmVycnVuQnVmZmVyLCBpbnQgb0JTaXplKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBkYXRhIGZyb20gdGhlIGNhY2hlIGludG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuIEl0IGFsc28gYWRkcyB0aGUKKyAgICBlbXVsYXRpb24gcHJldmVudGlvbiBjb2RlIGlmIG5lY2Vzc2FyeS4KKyAgICBccGFyYW0gInN0cmVhbSIgICAgICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVNhdmVXb3JkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRoZSBjb2Rld29yZCBpbnRvIHRoZSBjYWNoZSB3aGljaCB3aWxsIGV2ZW50dWFsbHkgYmUgd3JpdHRlbiB0bworICAgIHRoZSBiaXRzdHJlYW0gYnVmZmVyLgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibkJpdHMiICAgICAgIk51bWJlciBvZiBiaXRzIGluIHRoZSBjb2Rld29yZC4iCisgICAgXHBhcmFtICJjb2RlIiAgICAgICAiVGhlIGNvZGV3b3JkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlQml0cyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IG5CaXRzLCB1aW50IGNvZGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgb25lIGJpdCBvZiBkYXRhIGludG8gdGhlIGNhY2hlIHdoaWNoIHdpbGwgZXZlbnR1YWxseSBiZSB3cml0dGVuCisgICAgdG8gdGhlIGJpdHN0cmVhbSBidWZmZXIuCisgICAgXHBhcmFtICJzdHJlYW0iICAgICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjb2RlIiAgICAgICAiVGhlIGNvZGV3b3JkLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzIG9yIEFWQ0VOQ19CSVRTVFJFQU1fQlVGRkVSX0ZVTEwgaWYgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEJpdHN0cmVhbVdyaXRlMUJpdChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgdWludCBjb2RlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gYWRkcyB0cmFpbGluZyBiaXRzIHRvIHRoZSBiaXRzdHJlYW0gYW5kIHJlcG9ydHMgYmFjayB0aGUgZmluYWwgRUJTUCBzaXplLgorICAgIFxwYXJhbSAic3RyZWFtIiAgICAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbSBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAibmFsX3NpemUiICAgIk91dHB1dCB0aGUgZmluYWwgTkFMIHNpemUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3Mgb3IgQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTCBpZiBmYWlsLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQml0c3RyZWFtVHJhaWxpbmdCaXRzKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50ICpuYWxfc2l6ZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGJpdCBwb3NpdGlvbiBpcyBieXRlLWFsaWduZWQgb3Igbm90LgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgYml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAidHJ1ZSBpZiBieXRlLWFsaWduZWQsIGZhbHNlIG90aGVyd2lzZS4iCisgICAgKi8KKyAgICBib29sIGJ5dGVfYWxpZ25lZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBhdmFpbGFiaWxpdHkgb2Ygb3ZlcnJ1biBidWZmZXIgYW5kIHN3aXRjaGVzIHRvIHVzZSBpdCB3aGVuCisgICAgbm9ybWFsIGJ1ZmZmZXIgaXMgbm90IGJpZyBlbm91Z2guCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBiaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccGFyYW0gIm51bUV4dHJhQnl0ZXMiICJOdW1iZXIgb2YgZXh0cmEgYnl0ZSBuZWVkZWQuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19GQUlMLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQVZDQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihBVkNFbmNCaXRzdHJlYW0qIHN0cmVhbSwgaW50IG51bUV4dHJhQnl0ZXMpOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tIGludHJhX2VzdC5jIC0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKiogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRyYS9pbnRlciBkZWNpc2lvbiBiYXNlZCBvbiBBQkUuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgICAiQmVzdCBpbnRlciBjb3N0LiIKKyAgICBccGFyYW0gImN1ckwiICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgTUIgb3JpZ2luIGluIHJlY29uc3RydWN0ZWQgZnJhbWUuIgorICAgIFxwYXJhbSAicGljUGl0Y2giICJQaXRjaCBvZiB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHJldHVybiAiQm9vbGVhbiBmb3IgaW50cmEgbW9kZS4iCisgICAgKi8KKworLy9ib29sIEludHJhRGVjaXNpb25BQkUoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBtaW5fY29zdCwgdWludDggKmN1ckwsIGludCBwaWNQaXRjaCk7CisgICAgYm9vbCBJbnRyYURlY2lzaW9uKGludCAqbWluX2Nvc3QsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCwgYm9vbCBhdmUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgc2VhcmNoLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAibWJudW0iICAiQ3VycmVudCBNQiBudW1iZXIuIgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBNQiBvcmlnaW4gaW4gcmVjb25zdHJ1Y3RlZCBmcmFtZS4iCisgICAgXHBhcmFtICJwaWNQaXRjaCIgIlBpdGNoIG9mIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1ibnVtLCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGFsbCB0aGUgSTE2IHByZWRpY3Rpb24gbW9kZXMgZm9yIGFuIE1CIGFuZCBrZWVwIGl0IGluCisgICAgZW5jdmlkLT5wcmVkX2kxNi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBpbnRyYXByZWRfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZSB0aGUgY29zdCBvZiBhbGwgSTE2IG1vZGVzIGFuZCBjb21wYXJlIHRoZW0gdG8gZ2V0IHRoZSBtaW5pbXVtLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxwYXJhbSAib3JnWSIgICAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgbHVtYSBNQi4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgIlBvaW50ZXIgdG8gdGhlIG1pbmltYWwgY29zdCBzby1mYXIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGZpbmRfY29zdF8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKm9yZ1ksIGludCAqbWluX2Nvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb3N0IG9mIGVhY2ggSTE2IG1vZGUuCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBsdW1hIE1CLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgIlN0cmlkZSBzaXplIG9mIHRoZSBvcmlnaW5hbCBmcmFtZS4iCisgICAgXHBhcmFtICJwcmVkIiAgICJQb2ludGVyIHRvIHRoZSBwcmVkaWN0aW9uIHZhbHVlcy4iCisgICAgXHBhcmFtICJtaW5fY29zdCIgIk1pbmltYWwgY29zdCBzby1mYXIuIgorICAgIFxyZXR1cm4gIkNvc3QiCisgICAgKi8KKworICAgIGludCBjb3N0X2kxNih1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGFsbCB0aGUgSTQgcHJlZGljdGlvbiBtb2RlcyBhbmQgc2VsZWN0IHRoZSBiZXN0IG9uZQorICAgIGZvciBhbGwgdGhlIGJsb2NrcyBpbnNpZGUgYSBtYWNyb2Jsb2NrLkl0IGFsc28gY2FsbHMgZGN0X2x1bWEgdG8gZ2VuZXJhdGUgdGhlIHJlY29uc3RydWN0ZWQKKyAgICBNQiwgYW5kIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgdG8gYmUgZW5jb2RlZC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gIm1pbl9jb3N0IiAiUG9pbnRlciB0byB0aGUgbWluaW1hbCBjb3N0IHNvLWZhci4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgbWJfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgKm1pbl9jb3N0KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgbW9zdCBwcm9iYWJsZSBJNCBtb2RlIG9mIGEgZ2l2ZW4gNHg0IGJsb2NrCisgICAgZnJvbSBuZWlnaGJvcmluZyBpbmZvcm1hdGlvbmFjY29yZGluZyB0byBBVkMvSC4yNjQgc3RhbmRhcmQuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHBhcmFtICJibGtpZHgiICJUaGUgY3VycmVudCBibG9jayBpbmRleC4iCisgICAgXHJldHVybiAiTW9zdCBwcm9iYWJsZSBtb2RlLiIKKyAgICAqLworICAgIGludCBGaW5kTW9zdFByb2JhYmxlSTRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibGtpZHgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpcyB3aGVyZSBhIGxvdCBvZiBhY3Rpb25zIHRha2UgcGxhY2UgaW4gdGhlIDR4NCBibG9jayBsZXZlbCBpbnNpZGUKKyAgICBtYl9pbnRyYTR4NF9zZWFyY2guCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJibGtpZHgiICJUaGUgY3VycmVudCA0eDQgYmxvY2sgaW5kZXguIgorICAgIFxwYXJhbSAiY3VyIiAgICAiUG9pbnRlciB0byB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jay4iCisgICAgXHBhcmFtICJvcmciICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBibG9jay4iCisgICAgXHJldHVybiAiTWluaW1hbCBjb3N0LCBhbHNvIHNldCBjdXJyTUItPmk0TW9kZSIKKyAgICAqLworICAgIGludCBibGtfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29zdCBvZiBhIGdpdmVuIEk0IHByZWRpY3Rpb24gbW9kZS4KKyAgICBccGFyYW0gIm9yZyIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgICJTdHJpZGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZnJhbWUuIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBibG9jay4gKGVuY3ZpZC0+cHJlZF9pNCkiCisgICAgXHBhcmFtICJjb3N0IiAgICJQb2ludGVyIHRvIHRoZSBtaW5pbWFsIGNvc3QgKHRvIGJlIHVwZGF0ZWQpLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBjb3N0X2k0KHVpbnQ4ICpvcmcsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCB1aW50MTYgKmNvc3QpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBjaHJvbWEgaW50cmEgc2VhcmNoLiBFYWNoIG1vZGUgaXMgc2F2ZWQgaW4gZW5jdmlkLT5wcmVkX2ljLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIGNocm9tYV9pbnRyYV9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb3N0IG9mIGEgY2hyb21hIHByZWRpY3Rpb24gbW9kZS4KKyAgICBccGFyYW0gIm9yZ0NiIiAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIENiIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ0NyIiAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIENyIGJsb2NrLiIKKyAgICBccGFyYW0gIm9yZ19waXRjaCIgICJTdHJpZGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgZnJhbWUuIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBibG9jayAoZW5jdmlkLT5wcmVkX2ljKSIKKyAgICBccGFyYW0gIm1pbmNvc3QiICAgICJNaW5pbWFsIGNvc3Qgc28gZmFyLiIKKyAgICBccmV0dXJuICJDb3N0LiIKKyAgICAqLworCisgICAgaW50IFNBVERDaHJvbWEodWludDggKm9yZ0NiLCB1aW50OCAqb3JnQ3IsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluY29zdCk7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tIG1vdGlvbl9jb21wLmMgLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qKgorICAgIFRoaXMgaXMgYSBtYWluIGZ1bmN0aW9uIHRvIHBlZm9ybSBpbnRlciBwcmVkaWN0aW9uLgorICAgIFxwYXJhbSAiZW5jdmlkIiAgICAgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gInZpZGVvIiAgICAgICJQb2ludGVyIHRvIEFWQ0NvbW1vbk9iai4iCisgICAgXHJldHVybiAidm9pZCIuCisgICAgKi8KKyAgICB2b2lkIEFWQ01CTW90aW9uQ29tcChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbyk7CisKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBsdW1hIG1vdGlvbiBjb21wZW5zYXRpb24uCisgICAgXHBhcmFtICJyZWYiICAgICJQb2ludGVyIHRvIHRoZSBvcmlnaW4gb2YgYSByZWZlcmVuY2UgbHVtYS4iCisgICAgXHBhcmFtICJwaWN3aWR0aCIgICAiV2lkdGggb2YgdGhlIHBpY3R1cmUuIgorICAgIFxwYXJhbSAicGljaGVpZ2h0IiAgIkhlaWdodCBvZiB0aGUgcGljdHVyZS4iCisgICAgXHBhcmFtICJ4X3BvcyIgICJYLWNvb3JkaW5hdGUgb2YgdGhlIHByZWRpY3RlZCBibG9jayBpbiBxdWFydGVyIHBlbCByZXNvbHV0aW9uLiIKKyAgICBccGFyYW0gInlfcG9zIiAgIlktY29vcmRpbmF0ZSBvZiB0aGUgcHJlZGljdGVkIGJsb2NrIGluIHF1YXJ0ZXIgcGVsIHJlc29sdXRpb24uIgorICAgIFxwYXJhbSAicHJlZCIgICAiUG9pbnRlciB0byB0aGUgb3V0cHV0IHByZWRpY3RlZCBibG9jay4iCisgICAgXHBhcmFtICJwcmVkX3BpdGNoIiAiV2lkdGggb2YgcHJlZC4iCisgICAgXHBhcmFtICJibGt3aWR0aCIgICAiV2lkdGggb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKKyAgICBccGFyYW0gImJsa2hlaWdodCIgICJIZWlnaHQgb2YgdGhlIGN1cnJlbnQgcGFydGl0aW9uLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBlTHVtYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcmVkLCBpbnQgcHJlZF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlRnVsbFBlbE1DKHVpbnQ4ICppbiwgaW50IGlud2lkdGgsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUhvcnpJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpOworCisgICAgdm9pZCBlSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpOworCisgICAgdm9pZCBlSG9yekludGVycDNNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZVZlcnRJbnRlcnAxTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHkpOworCisgICAgdm9pZCBlVmVydEludGVycDJNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCBpbnQgKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZVZlcnRJbnRlcnAzTUMoaW50ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KTsKKworICAgIHZvaWQgZURpYWdvbmFsSW50ZXJwTUModWludDggKmluMSwgdWludDggKmluMiwgaW50IGlucGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpOworCisgICAgdm9pZCBlQ2hyb21hTW90aW9uQ29tcCh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYURpYWdvbmFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYVZlcnRpY2FsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFGdWxsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYVZlcnRpY2FsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KTsKKworICAgIHZvaWQgZUNocm9tYUhvcml6b250YWxNQzJfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKyAgICB2b2lkIGVDaHJvbWFEaWFnb25hbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCk7CisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0gbW90aW9uX2VzdC5jIC0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhcnJheXMgbmVjZXNzYXJ5IGZvciBtb3Rpb24gc2VhcmNoIGFsZ29yaXRobS4KKyAgICBccGFyYW0gImVudmlkIiAiUG9pbnRlciB0byBBVkNFbmNPYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ19TVUNDRVNTIG9yIEFWQ19NRU1PUllfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEluaXRNb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgQ2xlYW4gdXAgbWVtb3J5IGFsbG9jYXRlZCBpbiBJbml0TW90aW9uU2VhcmNoTW9kdWxlLgorICAgIFxwYXJhbSAiZW52aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIENsZWFuTW90aW9uU2VhcmNoTW9kdWxlKEFWQ0hhbmRsZSAqYXZjSGFuZGxlKTsKKworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBtb3Rpb24gZXN0aW1hdGlvbiBvZiBhbGwgbWFjcm9ibG9ja3MgaW4gYSBmcmFtZSBkdXJpbmcgdGhlIEluaXRGcmFtZS4KKyAgICBUaGUgZ29hbCBpcyB0byBmaW5kIHRoZSBiZXN0IE1CIHBhcnRpdGlvbiBmb3IgaW50ZXIgYW5kIGZpbmQgb3V0IGlmIGludHJhIHNlYXJjaCBpcyBuZWVkZWQgZm9yCisgICAgYW55IE1Ccy4gVGhpcyBpbnRyYSBNQiB0ZW5kZW5jeSBjYW4gYmUgdXNlZCBmb3Igc2NlbmUgY2hhbmdlIGRldGVjdGlvbi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBBVkNNb3Rpb25Fc3RpbWF0aW9uKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcmVwZXRpdGl2ZSBlZGdlIHBhZGRpbmcgdG8gdGhlIHJlZmVyZW5jZSBwaWN0dXJlIGJ5IGFkZGluZyAxNiBwaXhlbHMKKyAgICBhcm91bmQgdGhlIGx1bWEgYW5kIDggcGl4ZWxzIGFyb3VuZCB0aGUgY2hyb21hcy4KKyAgICBccGFyYW0gInJlZlBpYyIgIlBvaW50ZXIgdG8gdGhlIHJlZmVyZW5jZSBwaWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCAgQVZDUGFkZGluZ0VkZ2UoQVZDUGljdHVyZURhdGEgKnJlZlBpYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGtlZXBzIHRyYWNrIG9mIGludHJhIHJlZnJlc2ggbWFjcm9ibG9jayBsb2NhdGlvbnMuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgYXJyYXkgc3RydWN0dXJlIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJtYmxvY2siICJQb2ludGVyIHRvIHRoZSBhcnJheSBvZiBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZXMuIgorICAgIFxwYXJhbSAidG90YWxNQiIgIlRvdGFsIG51bWJlciBvZiBNQnMgaW4gYSBmcmFtZS4iCisgICAgXHBhcmFtICJudW1SZWZyZXNoIiAiTnVtYmVyIG9mIE1CIHRvIGJlIGludHJhIHJlZnJlc2ggaW4gYSBzaW5nbGUgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEFWQ1Jhc3RlckludHJhVXBkYXRlKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICptYmxvY2ssIGludCB0b3RhbE1CLCBpbnQgbnVtUmVmcmVzaCk7CisKKyNpZmRlZiBIVEZNCisgICAgdm9pZCBJbml0SFRGTShWaWRlb0VuY0RhdGEgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIGRvdWJsZSAqbmV3dmFyLCBpbnQgKmNvbGxlY3QpOworICAgIHZvaWQgVXBkYXRlSFRGTShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgZG91YmxlICpuZXd2YXIsIGRvdWJsZSAqZXhwX2xhbWRhLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCk7CisgICAgdm9pZCBDYWxjVGhyZXNob2xkKGRvdWJsZSBwZiwgZG91YmxlIGV4cF9sYW1kYVtdLCBpbnQgbnJtbHpfdGhbXSk7CisgICAgdm9pZCAgICBIVEZNUHJlcGFyZUN1ck1CX0FWQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCk7CisjZW5kaWYKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIGlucHV0IE1CIGludG8gYSBzbWFsbGVyIGZhc3RlciBtZW1vcnkgc3BhY2UgdG8gbWluaW1pemUgdGhlIGNhY2hlIG1pc3MuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIGlucHV0IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAicGl0Y2giICAiU3RyaWRlIHNpemUgb2YgdGhlIGlucHV0IGZyYW1lIChsdW1hKS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgICAgQVZDUHJlcGFyZUN1ck1CKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCBpbnQgcGl0Y2gpOworCisgICAgLyoqCisgICAgUGVyZm9ybXMgbW90aW9uIHZlY3RvciBzZWFyY2ggZm9yIGEgbWFjcm9ibG9jay4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJjdXIiICAgICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgaW4gdGhlIGlucHV0IGZyYW1lLiIKKyAgICBccGFyYW0gImJlc3RfY2FuZCIgIkFycmF5IG9mIGJlc3QgY2FuZGlkYXRlcyAodG8gYmUgZmlsbGVkIGluIGFuZCByZXR1cm5lZCkuIgorICAgIFxwYXJhbSAiaTAiICAgICAiWC1jb29yZGluYXRlIG9mIHRoZSBtYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gImowIiAgICAgIlktY29vcmRpbmF0ZSBvZiB0aGUgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJ0eXBlX3ByZWQiICJJbmRpY2F0ZXMgdGhlIHR5cGUgb2Ygb3BlcmF0aW9ucy4iCisgICAgXHBhcmFtICJGU19lbiIgICAgICAiRmxhZyBmb3IgZnVsbHNlYXJjaCBlbmFibGUuIgorICAgIFxwYXJhbSAiaHBfZ3Vlc3MiICAgIkd1ZXNzIGZvciBoYWxmLXBlbCBzZWFyY2guIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyLCB1aW50OCAqYmVzdF9jYW5kW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTAsIGludCBqMCwgaW50IHR5cGVfcHJlZCwgaW50IEZTX2VuLCBpbnQgKmhwX2d1ZXNzKTsKKworLy9BVkNFbmNfU3RhdHVzIEFWQ01CTW90aW9uU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9wYXNzKTsKKworICAgIC8qKgorICAgIFBlcmZvcm0gZnVsbC1wZWwgZXhoYXVzdGl2ZSBzZWFyY2ggYXJvdW5kIHRoZSBwcmVkaWN0ZWQgTVYuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicHJldiIgICAiUG9pbnRlciB0byB0aGUgcmVmZXJlbmNlIGZyYW1lLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGlucHV0IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAiaW1pbiIgICAiUG9pbnRlciB0byBtaW5pbWFsIG12ICh4KS4iCisgICAgXHBhcmFtICJqbWluIiAgICJQb2ludGVyIHRvIG1pbmltYWwgbXYgKHkpLiIKKyAgICBccGFyYW0gImlsb3csIGloaWdoLCBqbG93LCBqaGlnaCIgICAiTG93ZXIgYm91bmQgb24gc2VhcmNoIHJhbmdlLiIKKyAgICBccGFyYW0gImNtdngsIGNtdnkiICJQcmVkaWN0ZWQgTVYgdmFsdWUuIgorCisgICAgXHJldHVybiAiVGhlIGNvc3QgZnVuY3Rpb24gb2YgdGhlIGJlc3QgY2FuZGlkYXRlLiIKKyAgICAqLworICAgIGludCBBVkNGdWxsU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqcHJldiwgdWludDggKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKmltaW4sIGludCAqam1pbiwgaW50IGlsb3csIGludCBpaGlnaCwgaW50IGpsb3csIGludCBqaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY212eCwgaW50IGNtdnkpOworCisgICAgLyoqCisgICAgU2VsZWN0IGNhbmRpZGF0ZXMgZnJvbSBuZWlnaGJvcmluZyBibG9ja3MgYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mIHRoZQorICAgIHByZWRpY3Rpb24gc2VsZWN0aW9uLgorICAgIFxwYXJhbSAibXZ4IiAgICAiUG9pbnRlciB0byB0aGUgY2FuZGlkYXRlLCB4LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAibXZ5IiAgICAiUG9pbnRlciB0byB0aGUgY2FuZGlkYXRlLCB5LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAibnVtX2NhbiIgICAgIlBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBjYW5kaWRhdGVzIHJldHVybmVkLiIKKyAgICBccGFyYW0gImltYiIgICAgIlRoZSBNQiBpbmRleCB4LWNvb3JkaW5hdGUuIgorICAgIFxwYXJhbSAiam1iIiAgICAiVGhlIE1CIGluZGV4IHktY29vcmRpbmF0ZS4iCisgICAgXHBhcmFtICJ0eXBlX3ByZWQiICAiVHlwZSBvZiB0aGUgcHJlZGljdGlvbi4iCisgICAgXHBhcmFtICJjbXZ4LCBjbXZ5IiAiUG9pbnRlciB0byBwcmVkaWN0ZWQgTVYgKG1vZGlmaWVkIHZlcnNpb24pLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgQVZDQ2FuZGlkYXRlU2VsZWN0aW9uKGludCAqbXZ4LCBpbnQgKm12eSwgaW50ICpudW1fY2FuLCBpbnQgaW1iLCBpbnQgam1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgdHlwZV9wcmVkLCBpbnQgKmNtdngsIGludCAqY212eSk7CisKKyAgICAvKioKKyAgICBVdGlsaXR5IGZ1bmN0aW9uIHRvIG1vdmUgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgZG4gYWNjb3JkaW5nIHRvIHRoZSBuZXcKKyAgICBsb2NhdGlvbiB0byBhdm9pZCByZWR1bmRhbnQgY2FsY3VsYXRpb24uCisgICAgXHBhcmFtICJkbiIgIkFycmF5IG9mIGludGVnZXIgb2Ygc2l6ZSA5LiIKKyAgICBccGFyYW0gIm5ld19sb2MiICAgICJOZXcgbG9jYXRpb24gaW5kZXguIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBBVkNNb3ZlTmVpZ2hib3JTQUQoaW50IGRuW10sIGludCBuZXdfbG9jKTsKKworICAgIC8qKgorICAgIEZpbmQgbWluaW11bSBpbmRleCBvZiBkbi4KKyAgICBccGFyYW0gImRuIiAiQXJyYXkgb2YgaW50ZWdlciBvZiBzaXplIDkuIgorICAgIFxyZXR1cm4gIlRoZSBpbmRleCBvZiBkbiB3aXRoIHRoZSBzbWFsbGVzdCBkbltdIHZhbHVlLiIKKyAgICAqLworICAgIGludCBBVkNGaW5kTWluKGludCBkbltdKTsKKworCisgICAgLyotLS0tLS0tLS0tLS0tIGZpbmRoYWxmcGVsLmMgLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBTZWFyY2ggZm9yIHRoZSBiZXN0IGhhbGYtcGVsIHJlc29sdXRpb24gTVYgYXJvdW5kIHRoZSBmdWxsLXBlbCBNVi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGdsb2JhbCBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jay4iCisgICAgXHBhcmFtICJtb3QiICAgICJQb2ludGVyIHRvIHRoZSBBVkNNViBhcnJheSBvZiB0aGUgZnJhbWUuIgorICAgIFxwYXJhbSAibmNhbmQiICAiUG9pbnRlciB0byB0aGUgb3JpZ2luIG9mIHRoZSBmdWxsc2VhcmNoIHJlc3VsdC4iCisgICAgXHBhcmFtICJ4cG9zIiAgICJUaGUgY3VycmVudCBNQiBwb3NpdGlvbiBpbiB4LiIKKyAgICBccGFyYW0gInlwb3MiICAgIlRoZSBjdXJyZW50IE1CIHBvc2l0aW9uIGluIHkuIgorICAgIFxwYXJhbSAiaHBfZ3Vlc3MiICAgIklucHV0IHRvIGhlbHAgc3BlZWR1cCB0aGUgc2VhcmNoLiIKKyAgICBccGFyYW0gImNtdngsIGNtdnkiICJQcmVkaWN0ZWQgbW90aW9uIHZlY3RvciB1c2UgZm9yIG12Y29zdC4iCisgICAgXHJldHVybiAiTWluaW1hbCBjb3N0IChTQVREKSB3aXRob3V0IE1WIGNvc3QuIChmb3IgcmF0ZSBjb250cm9sIHB1cnBvc2UpIgorICAgICovCisgICAgaW50IEFWQ0ZpbmRIYWxmUGVsTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIEFWQ01WICptb3QsIHVpbnQ4ICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHBvcywgaW50IHlwb3MsIGludCBocF9ndWVzcywgaW50IGNtdngsIGludCBjbXZ5KTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHN1Yi1wZWwgcGl4ZWxzIHJlcXVpcmVkIHRvIGRvIHN1YnBlbCBNViBzZWFyY2guCisgICAgXHBhcmFtICJzdWJwZWxfcHJlZCIgIlBvaW50ZXIgdG8gMi1EIGFycmF5LCBlYWNoIGFycmF5IGZvciBlYWNoIHBvc2l0aW9uLiIKKyAgICBccGFyYW0gIm5jYW5kIiAiUG9pbnRlciB0byB0aGUgZnVsbC1wZWwgY2VudGVyIHBvc2l0aW9uIGluIHJlZiBmcmFtZS4iCisgICAgXHBhcmFtICJseCIgIlBpdGNoIG9mIHRoZSByZWYgZnJhbWUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgICovCisgICAgdm9pZCBHZW5lcmF0ZUhhbGZQZWxQcmVkKHVpbnQ4ICpzdWJwZWxfcHJlZCwgdWludDggKm5jYW5kLCBpbnQgbHgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGUgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBhdCBoYWxmLXBvaW50IG9mIHNpemUgNHgxNy4KKyAgICBccGFyYW0gImRzdCIgIlBvaW50ZXIgdG8gZGVzdGluYXRpb24uIgorICAgIFxwYXJhbSAicmVmIiAiUG9pbnRlciB0byB0aGUgc3RhcnRpbmcgcmVmZXJlbmNlIHBpeGVsLiIKKyAgICBccmV0dXJuICJ2b2lkLiIKKyAgICAqLworICAgIHZvaWQgVmVydEludGVycFdDbGlwKHVpbnQ4ICpkc3QsIHVpbnQ4ICpyZWYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgcXVhcnRlci1wZWwgcGl4ZWxzIGFyb3VuZCB0aGUgYmVzdCBoYWxmLXBlbCByZXN1bHQKKyAgICBkdXJpbmcgdGhlIHN1Yi1wZWwgTVYgc2VhcmNoLgorICAgIFxwYXJhbSAiYmlsaW5fYmFzZSIgICJBcnJheSBvZiBwb2ludGVycyB0byBiZSB1c2VkIGFzIGJhc2lzIGZvciBxLXBlbCBpbnRlcnAuIgorICAgIFxwYXJhbSAicXBlbF9wcmVkIiAgIkFycmF5IG9mIHBvaW50ZXJzIHBvaW50aW5nIHRvIHF1YXJ0ZXItcGVsIGNhbmRpZGF0ZXMuIgorICAgIFxwYXJhbSAiaHBlbF9wb3MiICJCZXN0IGhhbGYtcGVsIHBvc2l0aW9uIGF0IHRoZSBjZW50ZXIuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlUXVhcnRQZWxQcmVkKHVpbnQ4ICoqYmlsaW5fYmFzZSwgdWludDggKnFwZWxfcHJlZCwgaW50IGhwZWxfcG9zKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgU0FURCBvZiBhIHN1YnBlbCBjYW5kaWRhdGUuCisgICAgXHBhcmFtICJjYW5kIiAgICJQb2ludGVyIHRvIGEgY2FuZGlkYXRlLiIKKyAgICBccGFyYW0gImN1ciIgICAgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgYmxvY2suIgorICAgIFxwYXJhbSAiZG1pbiIgICAiTWluLXNvLWZhciBTQVRELiIKKyAgICBccmV0dXJuICJTdW0gb2YgQWJzb2x1dGUgVHJhbnNmb3JtZWQgRGlmZmVyZW5jZS4iCisgICAgKi8KKyAgICBpbnQgU0FURF9NQih1aW50OCAqY2FuZCwgdWludDggKmN1ciwgaW50IGRtaW4pOworCisgICAgLyotLS0tLS0tLS0tLS0tIHJhdGVfY29udHJvbC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgYSB1dGlsaXR5IGZ1bmN0aW9uLiBJdCByZXR1cm5zIGF2ZXJhZ2UgUVAgb2YgdGhlIHByZXZpb3VzbHkgZW5jb2RlZCBmcmFtZS4KKyAgICBccGFyYW0gInJhdGVDdHJsIiAiUG9pbnRlciB0byBBVkNSYXRlQ29udHJvbCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gIkF2ZXJhZ2UgUVAuIgorICAgICovCisgICAgaW50IEdldEF2Z0ZyYW1lUVAoQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgaW5wdXQgYW5kIGRldGVybWluZSB3aGV0aGVyIGl0IHNob3VsZCBiZSBlbmNvZGVkCisgICAgb3Igc2tpcHBlZC4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICAgIlBvaW50ZXIgdG8gdGhlIEFWQ1JhdGVDb250cm9sIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJtb2RUaW1lIiAgICAiVGhlIDMyIGJpdCB0aW1lc3RhbXAgb2YgdGhlIGlucHV0IGZyYW1lLiIKKyAgICBccGFyYW0gImZyYW1lTnVtIiAgICJQb2ludGVyIHRvIHRoZSBmcmFtZSBudW1iZXIgaWYgdG8gYmUgZW5jb2RlZC4iCisgICAgXHJldHVybiAiQVZDX1NVQ0NFU1Mgb3IgZWxzZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFJDRGV0ZXJtaW5lRnJhbWVOdW0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgdWludDMyIG1vZFRpbWUsIHVpbnQgKmZyYW1lTnVtKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyB0aGUgYnVmZmVyIGZ1bGxuZXNzIHdoZW4gZnJhbWVzIGFyZSBkcm9wcGVkIGVpdGhlciBieSB0aGUKKyAgICByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIG9yIGJ5IHRoZSB1c2VycyB0byBtYWtlIHN1cmUgdGhhdCB0YXJnZXQgYml0IHJhdGUgaXMgc3RpbGwgbWV0LgorICAgIFxwYXJhbSAidmlkZW8iICJQb2ludGVyIHRvIHRoZSBjb21tb24gb2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJyYXRlQ3RybCIgIlBvaW50ZXIgdG8gcmF0ZSBjb250cm9sIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJmcmFtZUluYyIgIkRpZmZlcmVuY2Ugb2YgdGhlIGN1cnJlbnQgZnJhbWUgbnVtYmVyIGFuZCBwcmV2aW91cyBmcmFtZSBudW1iZXIuIgorICAgIFxyZXR1cm4gInZvaWQuIgorICAgICovCisgICAgdm9pZCBSQ1VwZGF0ZUJ1ZmZlcihBVkNDb21tb25PYmogKnZpZGVvLCBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBmcmFtZUluYyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHJhdGUgY29udHJvbCBtb2R1bGUgYW5kIGFsbG9jYXRlcyBuZWNlc3NhcnkgYnVmZmVyZXMgdG8gZG8gdGhlIGpvYi4KKyAgICBccGFyYW0gImF2Y0hhbmRsZSIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgaGFuZGxlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfTUVNT1JZX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBJbml0UmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBmcmVlcyBidWZmZXJzIGFsbG9jYXRlZCBpbiBJbml0UmF0ZUNvbnRyb2xNb2R1bGUuCisgICAgXHBhcmFtICJhdmNIYW5kbGUiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIGhhbmRsZS4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggR09QIG9yIHRoZSBmaXJzdCBJRFIgZnJhbWUuIEl0IGNhbGN1bGF0ZXMKKyAgICB0YXJnZXQgYml0cyBmb3IgYSBHT1AuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdEdPUChBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGFyZ2V0IGJpdHMgZm9yIGEgcGFydGljdWxhciBmcmFtZS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdEZyYW1lUVAoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgUVAgZm9yIHRoZSB1cGNvbWluZyBmcmFtZSBvciBiYXNpYyB1bml0LgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIHRoZSByYXRlIGNvbnRyb2wgb2JqZWN0LiIKKyAgICBccmV0dXJuICJRUCB2YWx1ZSByYW5naW5nIGZyb20gMC01MS4iCisgICAgKi8KKyAgICBpbnQgIFJDQ2FsY3VsYXRlUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGx1bWEgUVAgdG8gY2hyb21hIFFQIGFuZCBjYWxjdWxhdGVzIGxhbWJkYSBiYXNlZCBvbiBRUC4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUuIgorICAgIFxyZXR1cm4gInZvaWQiCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdENocm9tYVFQKEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJlZm9yZSBlbmNvZGluZyBlYWNoIG1hY3JvYmxvY2suCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBlbmNvZGVyIG9iamVjdC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDSW5pdE1CUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIGJpdHMgdXNhZ2Ugc3RhdHMgYWZ0ZXIgZW5jb2RpbmcgYW4gbWFjcm9ibG9jay4KKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byBBVkNDb21tb25PYmouIgorICAgIFxwYXJhbSAicmF0ZUN0cmwiICJQb2ludGVyIHRvIEFWQ1JhdGVDb250cm9sLiIKKyAgICBccGFyYW0gIm51bV9oZWFkZXJfYml0cyIgIk51bWJlciBvZiBiaXRzIHVzZWQgZm9yIE1CIGhlYWRlci4iCisgICAgXHBhcmFtICJudW1fdGV4dHVyZV9iaXRzIiAiTnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgTUIgdGV4dHVyZS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgUkNQb3N0TUIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgbnVtX2hlYWRlcl9iaXRzLCBpbnQgbnVtX3RleHR1cmVfYml0cyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBwcmVkaWN0aW9uIGFuZCBvcmlnaW5hbCBNQi4KKyAgICBccGFyYW0gImVuY3ZpZCIgIlBvaW50ZXIgdG8gdGhlIGVuY29kZXIgb2JqZWN0LiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAib3JnTCIgIlBvaW50ZXIgdG8gdGhlIG9yaWdpbmFsIE1CLiIKKyAgICBccGFyYW0gIm9yZ1BpdGNoIiAiUG9pbnRlciB0byB0aGUgb3JpZ2luYWwgcGljdHVyZSBwaXRjaC4iCisgICAgXHJldHVybiAidm9pZC4iCisgICAgKi8KKyAgICB2b2lkIFJDQ2FsY3VsYXRlTUFEKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIHVpbnQ4ICpvcmdMLCBpbnQgb3JnUGl0Y2gpOworCisgICAgLyoqCisgICAgUmVzdG9yZSBRUCByZWxhdGVkIHBhcmFtZXRlcnMgb2YgcHJldmlvdXMgTUIgd2hlbiBjdXJyZW50IE1CIGlzIHNraXBwZWQuCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2suIgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byB0aGUgY29tbW9uIHZpZGVvIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIHRoZSBnbG9iYWwgZW5jb2Rpbmcgc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBSQ1Jlc3RvcmVRUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY09iamVjdCAqZW5jdmlkKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGFmdGVyIGRvbmUgd2l0aCBhIGZyYW1lLgorICAgIFxwYXJhbSAiZW5jdmlkIiAiUG9pbnRlciB0byB0aGUgZW5jb2RlciBvYmplY3QuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19TS0lQUEVEX1BJQ1RVUkUgd2hlbiBidWZlciBvdmVyZmxvdyAobmVlZCB0byBkaXNjYXJkIGN1cnJlbnQgZnJhbWUpLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgUkNVcGRhdGVGcmFtZShBVkNFbmNPYmplY3QgKmVuY3ZpZCk7CisKKyAgICAvKi0tLS0tLS0tLSByZXNpZHVhbC5jIC0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBpbnRyYSBwY20gZGF0YSBhbmQgZmlsbCBpdCBpbiB0aGUgY29ycmVzcG9uZGluZyBsb2NhdGlvbgorICAgIG9uIHRoZSBjdXJyZW50IHBpY3R1cmUuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzcywgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGVycm9ycy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhUENNKEFWQ0VuY09iamVjdCAqdmlkZW8pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBDQVZMQyBzeW50YXggZW5jb2Rpbmcgb24gdGhlIHJ1biBhbmQgbGV2ZWwgaW5mb3JtYXRpb24gb2YgdGhlIGNvZWZmaWNpZW50cy4KKyAgICBUaGUgbGV2ZWwgYW5kIHJ1biBhcnJheXMgYXJlIGVsZW1lbnRzIGluIEFWQ0VuY09iamVjdCBzdHJ1Y3R1cmUsIHBvcHVsYXRlZCBieSBUcmFuc1F1YW50WlosCisgICAgVHJhbnNRdWFudEludHJhREMgYW5kIFRyYW5zUXVhbnRDaHJvbWFEQyBmdW5jdGlvbnMuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHBhcmFtICJ0eXBlIiAgICJPbmUgb2YgQVZDUmVzaWR1YWxUeXBlIGZvciBhIHBhcnRpY3VsYXIgNHg0IGJsb2NrLiIKKyAgICBccGFyYW0gImJpbmR4IiAgIkJsb2NrIGluZGV4IG9yIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50cyBmb3IgQVZDX0ludHJhMTZEQyBhbmQgQVZDX0Nocm9tYURDIG1vZGUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MuIgorICAgIFxOb3RlICAgIlRoaXMgZnVuY3Rpb24gaGFzIDMyLWJpdCBtYWNoaW5lIHNwZWNpZmljIGluc3RydWN0aW9uISEhISIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgZW5jX3Jlc2lkdWFsX2Jsb2NrKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNSZXNpZHVhbFR5cGUgdHlwZSwgaW50IGJpbmR4LCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIpOworCisKKyAgICAvKi0tLS0tLS0tLS0tLS0gc2FkLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisgICAgaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3loKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01hY3JvYmxvY2tfQyh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisKKyNpZmRlZiBIVEZNIC8qICAzLzIvMSwgSHlwb3RoZXNpcyBUZXN0aW5nIEZhc3QgTWF0Y2hpbmcgKi8KKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5feCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IUF9IVEZNX0NvbGxlY3R5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl94LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3gsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTXhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFBfSFRGTXloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKTsKKyAgICBpbnQgQVZDU0FEX01CX0hQX0hURk14aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisgICAgaW50IEFWQ1NBRF9NQl9IVEZNX0NvbGxlY3QodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pOworICAgIGludCBBVkNTQURfTUJfSFRGTSh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbyk7CisjZW5kaWYKKworCisgICAgLyotLS0tLS0tLS0tLS0tIHNsaWNlLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoZSBtYWluIGVuY29kaW5nIGxvb3AgZm9yIGEgc2xpY2UuCisgICAgXHBhcmFtICJlbmN2aWQiICJQb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIEFWQ0VOQ19QSUNUVVJFX1JFQURZIGZvciBlbmQtb2YtcGljdHVyZSBhbmQKKyAgICAgICAgICAgICBBVkNFTkNfRkFJTCBvciBBVkNFTkNfU0xJQ0VfRU1QVFkgb3RoZXJ3aXNlLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgQVZDRW5jb2RlU2xpY2UoQVZDRW5jT2JqZWN0ICplbmN2aWQpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyB0aGUgbWFpbiBlbmNvZGluZyBvcGVyYXRpb24gZm9yIG9uZSBtYWNyb2Jsb2NrLgorICAgIFxwYXJhbSAidmlkZW8iICJwb2ludGVyIHRvIEFWQ0VuY09iamVjdC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3MsIG9yIG90aGVyIGJpdHN0cmVhbSByZWxhdGVkIGZhaWx1cmUgc3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgRW5jb2RlTUIoQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNhbGxzIHByZWRpY3Rpb24gSU5UUkEvSU5URVIgZnVuY3Rpb25zLCB0cmFuc2Zvcm0sCisgICAgcXVhbnRpemF0aW9uIGFuZCB6aWd6YWcgc2Nhbm5pbmcgdG8gZ2V0IHRoZSBydW4tbGV2ZWwgc3ltYm9scy4KKyAgICBccGFyYW0gImVuY3ZpZCIgInBvaW50ZXIgdG8gQVZDRW5jT2JqZWN0LiIKKyAgICBccGFyYW0gImN1ckwiICAgInBvaW50ZXIgdG8gTHVtYSBjb21wb25lbnQgb2YgdGhlIGN1cnJlbnQgZnJhbWUuCisgICAgXHBhcmFtICJjdXJDYiIgICJwb2ludGVyIHRvIENiIGNvbXBvbmVudCBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICBccGFyYW0gImN1ckNyIiAgInBvaW50ZXIgdG8gQ3IgY29tcG9uZW50IG9mIHRoZSBjdXJyZW50IGZyYW1lLgorICAgIFxyZXR1cm4gInZvaWQgZm9yIG5vdy4iCisgICAgICovCisgICAgdm9pZCBNQlByZWRUcmFuc1F1YW50WlooQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJMLCB1aW50OCAqY3VyQ2IsIHVpbnQ4ICpjdXJDcik7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGNvcGllcyB0aGUgY29udGVudCBvZiB0aGUgcHJlZGljdGlvbiBNQiBpbnRvIHRoZSByZWNvbnN0cnVjdGVkIFlVVgorICAgIGZyYW1lIGRpcmVjdGx5LgorICAgIFxwYXJhbSAiY3VyTCIgICAiUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gWSBjb21wb25lbnQuIgorICAgIFxwYXJhbSAiY3VyQ2IiICAiUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gQ2IgY29tcG9uZW50LiIKKyAgICBccGFyYW0gImN1ckNyIiAgIlBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIENyIGNvbXBvbmVudC4iCisgICAgXHBhcmFtICJwcmVkQmxvY2siICAiUG9pbnRlciB0byB0aGUgcHJlZGljdGlvbiBNQi4iCisgICAgXHBhcmFtICJwaWNXaWR0aCIgICAiVGhlIHdpZHRoIG9mIHRoZSBmcmFtZS4iCisgICAgXHJldHVybiAiTm9uZS4iCisgICAgKi8KKyAgICB2b2lkIENvcHlfTUIodWludDggKmN1ckwsIHVpbnQ4ICpjdXJDYiwgdWludDggKmN1ckNyLCB1aW50OCAqcHJlZEJsb2NrLCBpbnQgcGljV2lkdGgpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBtYl90eXBlLCBDQlAsIHByZWRpY3Rpb24gbW9kZSwgcmVmIGlkeCBhbmQgTVYuCisgICAgXHBhcmFtICJjdXJyTUIiICJQb2ludGVyIHRvIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInZpZGVvIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jT2JqZWN0IHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZU1CSGVhZGVyKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jT2JqZWN0ICp2aWRlbyk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGZpbmRzIHRoZSByaWdodCBtYl90eXBlIGZvciBhIG1hY3JvYmxvY2sgZ2l2ZW4gdGhlIG1iTW9kZSwgQ0JQLAorICAgIE51bVBhcnQsIFByZWRQYXJ0TW9kZS4KKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic2xpY2VfdHlwZSIgIlZhbHVlIG9mIHRoZSBzbGljZV90eXBlLiIKKyAgICBccmV0dXJuICJtYl90eXBlLiIKKyAgICAqLworICAgIHVpbnQgSW50ZXJwcmV0TUJUeXBlKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHNsaWNlX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBtYl9wcmVkIHBhcnQgb2YgdGhlIG1hY3JvYmxvY2sgZGF0YS4KKyAgICBccGFyYW0gInZpZGVvIiAgIlBvaW50ZXIgdG8gdGhlIEFWQ0NvbW1vbk9iaiBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAiY3Vyck1CIiAiUG9pbnRlciB0byB0aGUgY3VycmVudCBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0gc3RydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZmFpbCBzdGF0dXMuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBtYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBzdWJfbWJfcHJlZCBwYXJ0IG9mIHRoZSBtYWNyb2Jsb2NrIGRhdGEuCisgICAgXHBhcmFtICJ2aWRlbyIgICJQb2ludGVyIHRvIHRoZSBBVkNDb21tb25PYmogc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgbWFjcm9ibG9jayBzdHJ1Y3R1cmUuIgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtIHN0cnVjdHVyZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgYml0c3RyZWFtIGZhaWwgc3RhdHVzLiIKKyAgICAqLworICAgIEFWQ0VuY19TdGF0dXMgc3ViX21iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGludGVycHJldHMgdGhlIHN1Yl9tYl90eXBlIGFuZCBzZXRzIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgIHdoZW4gdGhlIHNsaWNlIHR5cGUgaXMgQVZDX1BfU0xJQ0UuCisgICAgaW4gdGhlIG1hY3JvYmxvY2sgc3RydWN0dXJlLgorICAgIFxwYXJhbSAibWJsb2NrIiAiUG9pbnRlciB0byBjdXJyZW50IEFWQ01hY3JvYmxvY2suIgorICAgIFxwYXJhbSAic3ViX21iX3R5cGUiICJGcm9tIHRoZSBzeW50YXggYml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgdm9pZCBJbnRlcnByZXRTdWJNQlR5cGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBpbnRlcnByZXRzIHRoZSBzdWJfbWJfdHlwZSBhbmQgc2V0cyBuZWNlc3NhcnkgaW5mb3JtYXRpb24KKyAgICB3aGVuIHRoZSBzbGljZSB0eXBlIGlzIEFWQ19CX1NMSUNFLgorICAgIGluIHRoZSBtYWNyb2Jsb2NrIHN0cnVjdHVyZS4KKyAgICBccGFyYW0gIm1ibG9jayIgIlBvaW50ZXIgdG8gY3VycmVudCBBVkNNYWNyb2Jsb2NrLiIKKyAgICBccGFyYW0gInN1Yl9tYl90eXBlIiAiRnJvbSB0aGUgc3ludGF4IGJpdHN0cmVhbS4iCisgICAgXHJldHVybiAidm9pZCIKKyAgICAqLworICAgIHZvaWQgSW50ZXJwcmV0U3ViTUJUeXBlQihBVkNNYWNyb2Jsb2NrICptYmxvY2ssIHVpbnQgKnN1Yl9tYl90eXBlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBpbnRyYSA0eDQgbW9kZS4gSXQgY2FsY3VsYXRlcyB0aGUgcHJlZGljdGVkIEk0eDQgbW9kZSBhbmQgdGhlCisgICAgcmVtbmFudCB0byBiZSBlbmNvZGVkLgorICAgIFxwYXJhbSAidmlkZW8iICAiUG9pbnRlciB0byBBVkNFbmNPYmplY3Qgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gImN1cnJNQiIgIlBvaW50ZXIgdG8gdGhlIEFWQ01hY3JvYmxvY2sgc3RydWN0dXJlLiIKKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtIHNydWN0dXJlLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2Vzcy4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhNHg0TW9kZShBVkNDb21tb25PYmogKnZpZGVvLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLSB2bGNfZW5jb2RlLmMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyBhbmQgd3JpdGVzIGEgdmFsdWUgaW50byBhbiBFeHAtR29sb21iIGNvZGV3b3JkLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiY29kZU51bSIgIlBvaW50ZXIgdG8gdGhlIHZhbHVlIG9mIHRoZSBjb2RlTnVtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBiaXRzdHJlYW0gZXJyb3IgbWVzc2FnZXMgZm9yIGZhaWwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyB1ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBtYXBzIGFuZCBlbmNvZGVzIHNpZ25lZCBFeHAtR29sb21iIGNvZGVzLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAidmFsdWUiICAiUG9pbnRlciB0byBzeW50YXggZWxlbWVudCB2YWx1ZS4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1Mgb3IgQVZDRU5DX0ZBSUwuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyAgc2VfdihBVkNFbmNCaXRzdHJlYW0gKmJpdHN0cmVhbSwgaW50IHZhbHVlKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gbWFwcyBhbmQgZW5jb2RlcyB0cnVuY2F0ZWQgRXhwLUdvbG9tYiBjb2Rlcy4KKyAgICBccGFyYW0gImJpdHN0cmVhbSIgIlBvaW50ZXIgdG8gQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInZhbHVlIiAgIlBvaW50ZXIgdG8gc3ludGF4IGVsZW1lbnQgdmFsdWUuIgorICAgIFxwYXJhbSAicmFuZ2UiICAiUmFuZ2Ugb2YgdGhlIHZhbHVlIGFzIGlucHV0IHRvIGRldGVybWluZSB0aGUgYWxnb3JpdGhtLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBvciBBVkNFTkNfRkFJTC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIHRlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgdmFsdWUsIHVpbnQgcmFuZ2UpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIEV4cC1Hb2xvbWIgY29kZXdvcmQgZnJvbSBjb2RlTnVtLgorICAgIFxwYXJhbSAiYml0c3RyZWFtIiAiUG9pbnRlciB0byBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiY29kZU51bSIgIlBvaW50ZXIgdG8gdGhlIGNvZGVOdW0gdmFsdWUuIgorICAgIFxyZXR1cm4gIkFWQ0VOQ19TVUNDRVNTIGZvciBzdWNjZXNzIG9yIGJpdHN0cmVhbSBlcnJvciBtZXNzYWdlcyBmb3IgZmFpbC4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIFNldEVHQml0c3RyaW5nKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBDQVZMQyBlbmNvZGluZyBvZiB0aGUgQ0JQIChjb2RlZCBibG9jayBwYXR0ZXJuKSBvZiBhIG1hY3JvYmxvY2sKKyAgICBieSBjYWxsaW5nIHVlX3YoKSBhbmQgdGhlbiBtYXBwaW5nIHRoZSBDQlAgdG8gdGhlIGNvcnJlc3BvbmRpbmcgVkxDIGNvZGVOdW0uCisgICAgXHBhcmFtICJjdXJyTUIiICAiUG9pbnRlciB0byB0aGUgY3VycmVudCBBVkNNYWNyb2Jsb2NrIHN0cnVjdHVyZS4iCisgICAgXHBhcmFtICJzdHJlYW0iICAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccmV0dXJuICJ2b2lkIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBFbmNvZGVDQlAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSk7CisKKyAgICAvKioKKyAgICBUaGlzIGZ1bmN0aW9uIGVuY29kZXMgdHJhaWxpbmcgb25lcyBhbmQgdG90YWwgY29lZmZpY2llbnQuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVHJhaWxpbmdPbmVzIiAgICJUaGUgdHJhaWxpbmcgb25lIHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJuQyIgIkNvbnRleHQgZm9yIG51bWJlciBvZiBub256ZXJvIGNvZWZmaWNpZW50IChwcmVkaWN0aW9uIGNvbnRleHQpLiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmLCBpbnQgbkMpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRyYWlsaW5nIG9uZXMgYW5kIHRvdGFsIGNvZWZmaWNpZW50IGZvciBjaHJvbWEgREMgYmxvY2suCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVHJhaWxpbmdPbmVzIiAgICJUaGUgdHJhaWxpbmcgb25lIHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbENvZWZmVHJhaWxpbmdPbmVzQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmKTsKKworICAgIC8qKgorICAgIFRoaXMgZnVuY3Rpb24gZW5jb2RlcyB0b3RhbF96ZXJvcyB2YWx1ZSBhcyBpbiBUYWJsZSA5LTcgYW5kIDktOC4KKyAgICBccGFyYW0gInN0cmVhbSIgIlBvaW50ZXIgdG8gdGhlIEFWQ0VuY0JpdHN0cmVhbS4iCisgICAgXHBhcmFtICJUb3RhbFplcm9zIiAiVGhlIHRvdGFsX3plcm9zIHZhbHVlLiIKKyAgICBccGFyYW0gIlRvdGFsQ29lZmYiICJUaGUgdG90YWwgY29lZmZpY2llbnQgdmFyaWFibGUgb3V0cHV0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3MoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRvdGFsX3plcm9zIFZMQyBzeW50YXggZm9yIGNocm9tYSBEQyBhcyBpbiBUYWJsZSA5LTkuCisgICAgXHBhcmFtICJzdHJlYW0iICJQb2ludGVyIHRvIHRoZSBBVkNFbmNCaXRzdHJlYW0uIgorICAgIFxwYXJhbSAiVG90YWxaZXJvcyIgIlRoZSB0b3RhbF96ZXJvcyB2YWx1ZS4iCisgICAgXHBhcmFtICJUb3RhbENvZWZmIiAiVGhlIHRvdGFsIGNvZWZmaWNpZW50IHZhcmlhYmxlIG91dHB1dC4iCisgICAgXHJldHVybiAiQVZDRU5DX1NVQ0NFU1MgZm9yIHN1Y2Nlc3Mgb3IgZWxzZSBmb3IgYml0c3RyZWFtIGZhaWx1cmUuIgorICAgICovCisgICAgQVZDRW5jX1N0YXR1cyBjZV9Ub3RhbFplcm9zQ2hyb21hREMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCB0b3RhbF96ZXJvcywgaW50IFRvdGFsQ29lZmYpOworCisgICAgLyoqCisgICAgVGhpcyBmdW5jdGlvbiBlbmNvZGVzIHJ1bl9iZWZvcmUgVkxDIHN5bnRheCBhcyBpbiBUYWJsZSA5LTEwLgorICAgIFxwYXJhbSAic3RyZWFtIiAiUG9pbnRlciB0byB0aGUgQVZDRW5jQml0c3RyZWFtLiIKKyAgICBccGFyYW0gInJ1bl9iZWZvcmUiICJUaGUgcnVuX2JlZm9yZSB2YWx1ZS4iCisgICAgXHBhcmFtICJ6ZXJvc0xlZnQiICAiVGhlIGNvbnRleHQgZm9yIG51bWJlciBvZiB6ZXJvcyBsZWZ0LiIKKyAgICBccmV0dXJuICJBVkNFTkNfU1VDQ0VTUyBmb3Igc3VjY2VzcyBvciBlbHNlIGZvciBiaXRzdHJlYW0gZmFpbHVyZS4iCisgICAgKi8KKyAgICBBVkNFbmNfU3RhdHVzIGNlX1J1bkJlZm9yZShBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHJ1bl9iZWZvcmUsIGludCB6ZXJvc0xlZnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKyNlbmRpZiAvKiBfQVZDRU5DX0xJQl9IXyAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9iaXRzdHJlYW1faW8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YWI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvYml0c3RyZWFtX2lvLmNwcApAQCAtMCwwICsxLDMzNiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKyNkZWZpbmUgV09SRF9TSVpFIDMyCisKKy8qIGFycmF5IGZvciB0cmFpbGluZyBiaXQgcGF0dGVybiBhcyBmdW5jdGlvbiBvZiBudW1iZXIgb2YgYml0cyAqLworLyogdGhlIGZpcnN0IG9uZSBpcyB1bnVzZWQuICovCitjb25zdCBzdGF0aWMgdWludDggdHJhaWxpbmdfYml0c1s5XSA9IHswLCAweDEsIDB4MiwgMHg0LCAweDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODB9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEJpdHN0cmVhbUluaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGUgICAgIDogMTEvNC8yMDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHVycG9zZSAgOiBQb3B1bGF0ZSBiaXRzdHJlYW0gc3RydWN0dXJlIHdpdGggYml0c3RyZWFtIGJ1ZmZlciBhbmQgc2l6ZSAgKi8KKy8qICAgICAgICAgICAgIGl0IGFsc28gaW5pdGlhbGl6ZXMgaW50ZXJuYWwgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluL291dCAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV0dXJuICAgOiBBVkNFTkNfU1VDQ0VTUyBpZiBzdWNjZXNzZWQsIEFWQ0VOQ19GQUlMIGlmIGZhaWxlZC4gICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogfC0tLS0tLS0tfC0tLS0tLS0tfC0tLS1+fn5+fi0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfAorICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF53cml0ZV9wb3MgICAgICAgICAgXmJ1Zl9zaXplCisgICBiaXRzdHJlYW1CdWZmZXIgICAgICAgICAgICAgICAgICA8LS0tLS0tLS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF93b3JkCisKKyAgIHwtLS0tLXh4eHh4eHh4eHh4eHh8ICA9IGN1cnJlbnRfd29yZCAzMiBvciAxNiBiaXRzCisgICAgPC0tLS0+CisgICAgIGJpdF9sZWZ0CisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK0FWQ0VuY19TdGF0dXMgQml0c3RyZWFtRW5jSW5pdChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgdWludDggKmJ1ZmZlciwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpvdmVycnVuQnVmZmVyLCBpbnQgb0JTaXplKQoreworICAgIGlmIChzdHJlYW0gPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCB8fCBidWZfc2l6ZSA8PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19CSVRTVFJFQU1fSU5JVF9GQUlMOworICAgIH0KKworICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gYnVmZmVyOworCisgICAgc3RyZWFtLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCisgICAgc3RyZWFtLT53cml0ZV9wb3MgPSAwOworCisgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisKKyAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IDA7CisKKyAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gV09SRF9TSVpFOworCisgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gb3ZlcnJ1bkJ1ZmZlcjsKKworICAgIHN0cmVhbS0+b0JTaXplID0gb0JTaXplOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICBGdW5jdGlvbiA6IEFWQ0JpdHN0cmVhbVNhdmVXb3JkKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogU2F2ZSB0aGUgY3VycmVudF93b3JkIGludG8gdGhlIGJ1ZmZlciwgYnl0ZS1zd2FwLCBhbmQgICAgICAgICovCisvKiAgICAgICAgICAgICAgYWRkIGVtdWxhdGlvbiBwcmV2ZW50aW9uIGluc2VydGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbi9vdXQgICA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJldHVybiAgIDogQVZDRU5DX1NVQ0NFU1MgaWYgc3VjY2Vzc2VkLCBBVkNFTkNfV1JJVEVfRkFJTCBpZiBidWZmZXIgaXMgICovCisvKiAgICAgICAgICAgICAgZnVsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitBVkNFbmNfU3RhdHVzIEFWQ0JpdHN0cmVhbVNhdmVXb3JkKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtKQoreworICAgIGludCBudW1fYml0czsKKyAgICB1aW50OCAqd3JpdGVfcG50LCBieXRlOworICAgIHVpbnQgY3VycmVudF93b3JkOworCisgICAgLyogY2hlY2sgbnVtYmVyIG9mIGJ5dGVzIGluIGN1cnJlbnRfd29yZCwgbXVzdCBhbHdheXMgYmUgYnl0ZS1hbGlnbmVkISEhISAqLworICAgIG51bV9iaXRzID0gV09SRF9TSVpFIC0gc3RyZWFtLT5iaXRfbGVmdDsgLyogbXVzdCBiZSBtdWx0aXBsZSBvZiA4ICEhKi8KKworICAgIGlmIChzdHJlYW0tPmJ1Zl9zaXplIC0gc3RyZWFtLT53cml0ZV9wb3MgPD0gKG51bV9iaXRzID4+IDMpICsgMikgLyogMiBtb3JlIGJ5dGVzIGZvciBwb3NzaWJsZSBFUEJTICovCisgICAgeworICAgICAgICBpZiAoQVZDRU5DX1NVQ0NFU1MgIT0gQVZDQml0c3RyZWFtVXNlT3ZlcnJ1bkJ1ZmZlcihzdHJlYW0sIChudW1fYml0cyA+PiAzKSArIDIpKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0JJVFNUUkVBTV9CVUZGRVJfRlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHdyaXRlIHdvcmQsIGJ5dGUtYnktYnl0ZSAqLworICAgIHdyaXRlX3BudCA9IHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICsgc3RyZWFtLT53cml0ZV9wb3M7CisgICAgY3VycmVudF93b3JkID0gc3RyZWFtLT5jdXJyZW50X3dvcmQ7CisgICAgd2hpbGUgKG51bV9iaXRzKSAvKiBubyBuZWVkIHRvIGNoZWNrIHN0cmVhbS0+YnVmX3NpemUgYW5kIHN0cmVhbS0+d3JpdGVfcG9zLCB0YWtlbiBjYXJlIGFscmVhZHkgKi8KKyAgICB7CisgICAgICAgIG51bV9iaXRzIC09IDg7CisgICAgICAgIGJ5dGUgPSAoY3VycmVudF93b3JkID4+IG51bV9iaXRzKSAmIDB4RkY7CisgICAgICAgIGlmIChieXRlICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgICp3cml0ZV9wbnQrKyA9IGJ5dGU7CisgICAgICAgICAgICBzdHJlYW0tPndyaXRlX3BvcysrOworICAgICAgICAgICAgc3RyZWFtLT5jb3VudF96ZXJvcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zKys7CisgICAgICAgICAgICAqd3JpdGVfcG50KysgPSBieXRlOworICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgIGlmIChzdHJlYW0tPmNvdW50X3plcm9zID09IDIpCisgICAgICAgICAgICB7ICAgLyogZm9yIG51bV9iaXRzID0gMzIsIHRoaXMgY2FuIGFkZCAyIG1vcmUgYnl0ZXMgZXh0cmEgZm9yIEVQQlMgKi8KKyAgICAgICAgICAgICAgICAqd3JpdGVfcG50KysgPSAweDM7CisgICAgICAgICAgICAgICAgc3RyZWFtLT53cml0ZV9wb3MrKzsKKyAgICAgICAgICAgICAgICBzdHJlYW0tPmNvdW50X3plcm9zID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHJlc2V0IGN1cnJlbnRfd29yZCBhbmQgYml0X2xlZnQgKi8KKyAgICBzdHJlYW0tPmN1cnJlbnRfd29yZCA9IDA7CisgICAgc3RyZWFtLT5iaXRfbGVmdCA9IFdPUkRfU0laRTsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1Xcml0ZUJpdHMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMjkvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogV3JpdGUgdXAgdG8gbWFjaGluZSB3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBVbnVzZWQgYml0cyBpbiAnY29kZScgbXVzdCBiZSBhbGwgemVyb3MuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZUJpdHMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBuQml0cywgdWludCBjb2RlKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgaW50IGJpdF9sZWZ0ID0gc3RyZWFtLT5iaXRfbGVmdDsKKyAgICB1aW50IGN1cnJlbnRfd29yZCA9IHN0cmVhbS0+Y3VycmVudF93b3JkOworCisgICAgLy9ERUJVR19MT0codXNlckRhdGEsQVZDX0xPR1RZUEVfSU5GTywiQml0c3RyZWFtV3JpdGVCaXRzIixuQml0cywtMSk7CisKKyAgICBpZiAobkJpdHMgPiBXT1JEX1NJWkUpIC8qIGhhcyB0byBiZSB0YWtlbiBjYXJlIG9mIHNwZWNpYWxseSAqLworICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOyAvKiBmb3Igbm93ICovCisgICAgICAgIC8qIG90aGVyd2lzZSwgYnJlYWsgaXQgZG93biB0byAyIHdyaXRlIG9mIGxlc3MgdGhhbiAxNiBiaXRzIGF0IGEgdGltZS4gKi8KKyAgICB9CisKKyAgICBpZiAobkJpdHMgPD0gYml0X2xlZnQpIC8qIG1vcmUgYml0cyBsZWZ0IGluIGN1cnJlbnRfd29yZCAqLworICAgIHsKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IG5CaXRzKSB8IGNvZGU7CisgICAgICAgIHN0cmVhbS0+Yml0X2xlZnQgLT0gbkJpdHM7CisgICAgICAgIGlmIChzdHJlYW0tPmJpdF9sZWZ0ID09IDApIC8qIHByZXBhcmUgZm9yIHRoZSBuZXh0IHdvcmQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IGJpdF9sZWZ0KSB8IChjb2RlID4+IChuQml0cyAtIGJpdF9sZWZ0KSk7CisKKyAgICAgICAgbkJpdHMgLT0gYml0X2xlZnQ7CisKKyAgICAgICAgc3RyZWFtLT5iaXRfbGVmdCA9IDA7CisKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsgLyogc2F2ZSBjdXJyZW50IHdvcmQgKi8KKworICAgICAgICBzdHJlYW0tPmJpdF9sZWZ0ID0gV09SRF9TSVpFIC0gbkJpdHM7CisKKyAgICAgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSBjb2RlOyAvKiBubyBleHRyYSBtYXNraW5nIGZvciBjb2RlLCBtdXN0IGJlIGhhbmRsZWQgYmVmb3JlIHNhdmluZyAqLworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1Xcml0ZTFCaXQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMzAvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogV3JpdGUgMSBiaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiBVbnVzZWQgYml0cyBpbiAnY29kZScgbXVzdCBiZSBhbGwgemVyb3MuICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1Xcml0ZTFCaXQoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIHVpbnQgY29kZSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGN1cnJlbnRfd29yZCA9IHN0cmVhbS0+Y3VycmVudF93b3JkOworCisgICAgLy9ERUJVR19MT0codXNlckRhdGEsQVZDX0xPR1RZUEVfSU5GTywiQml0c3RyZWFtV3JpdGUxQml0Iixjb2RlLC0xKTsKKworICAgIC8vaWYoMSA8PSBiaXRfbGVmdCkgLyogbW9yZSBiaXRzIGxlZnQgaW4gY3VycmVudF93b3JkICovCisgICAgLyogd2UgY2FuIGFzc3VtZSB0aGF0IHRoZXJlIGFsd2F5cyBiZSBwb3NpdGl2ZSBiaXRfbGVmdCBpbiB0aGUgY3VycmVudCB3b3JkICovCisgICAgc3RyZWFtLT5jdXJyZW50X3dvcmQgPSAoY3VycmVudF93b3JkIDw8IDEpIHwgY29kZTsKKyAgICBzdHJlYW0tPmJpdF9sZWZ0LS07CisgICAgaWYgKHN0cmVhbS0+Yml0X2xlZnQgPT0gMCkgLyogcHJlcGFyZSBmb3IgdGhlIG5leHQgd29yZCAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgRnVuY3Rpb24gOiBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRlICAgICA6IDMvMzEvMjAwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFB1cnBvc2UgIDogQWRkIHRyYWlsaW5nIGJpdHMgYW5kIHJlcG9ydCB0aGUgZmluYWwgRUJTUCBzaXplLiAgICAgICAgICAgICovCisvKiAgSW4vb3V0ICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXR1cm4gICA6IEFWQ0VOQ19TVUNDRVNTIGlmIHN1Y2Nlc3NlZCwgQVZDRU5DX1dSSVRFX0ZBSUwgaWYgYnVmZmVyIGlzICAqLworLyogICAgICAgICAgICAgIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQVZDRW5jX1N0YXR1cyBCaXRzdHJlYW1UcmFpbGluZ0JpdHMoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgKm5hbF9zaXplKQoreworICAgICh2b2lkKShuYWxfc2l6ZSk7CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgYml0X2xlZnQgPSBiaXRzdHJlYW0tPmJpdF9sZWZ0OworCisgICAgYml0X2xlZnQgJj0gMHg3OyAvKiBtb2R1bG8gYnkgOCAqLworICAgIGlmIChiaXRfbGVmdCA9PSAwKSBiaXRfbGVmdCA9IDg7CisgICAgLyogYml0c3RyZWFtLT5iaXRfbGVmdCA9PSAwIGNhbm5vdCBoYXBwZW4gaGVyZSBzaW5jZSBpdCB3b3VsZCBoYXZlIGJlZW4gU2F2ZWQgYWxyZWFkeSAqLworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKGJpdHN0cmVhbSwgYml0X2xlZnQsIHRyYWlsaW5nX2JpdHNbYml0X2xlZnRdKTsKKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIGlmIGl0J3Mgbm90IHNhdmVkLCBzYXZlIGl0LiAqLworICAgIC8vaWYoYml0c3RyZWFtLT5iaXRfbGVmdDwoV09SRF9TSVpFPDwzKSkgLyogaW4gZmFjdCwgbm8gbmVlZCB0byBjaGVjayAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gQVZDQml0c3RyZWFtU2F2ZVdvcmQoYml0c3RyZWFtKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBjaGVjayB3aGV0aGVyIGl0J3MgYnl0ZS1hbGlnbmVkICovCitib29sIGJ5dGVfYWxpZ25lZChBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBpZiAoc3RyZWFtLT5iaXRfbGVmdCAlIDgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiB0cnVlOworfQorCisKKy8qIGRldGVybWluZSB3aGV0aGVyIG92ZXJydW4gYnVmZmVyIGNhbiBiZSB1c2VkIG9yIG5vdCAqLworQVZDRW5jX1N0YXR1cyBBVkNCaXRzdHJlYW1Vc2VPdmVycnVuQnVmZmVyKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBpbnQgbnVtRXh0cmFCeXRlcykKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKXN0cmVhbS0+ZW5jdmlkOworCisgICAgaWYgKHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciAhPSBOVUxMKSAvLyBvdmVycnVuQnVmZmVyIGlzIHNldAorICAgIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyICE9IHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlcikgLy8gbm90IGFscmVhZHkgdXNlZAorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzID49IHN0cmVhbS0+b0JTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplID0gc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzICsgMTAwOworICAgICAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplICY9ICh+MHgzKTsgLy8gbWFrZSBpdCBtdWx0aXBsZSBvZiA0CisKKyAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBuZXcgb3ZlcnJ1biBCdWZmZXIKKyAgICAgICAgICAgICAgICBpZiAoZW5jdmlkLT5vdmVycnVuQnVmZmVyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX0ZyZWUoKHVpbnQzMiopZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KWVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZW5jdmlkLT5vQlNpemUgPSBzdHJlYW0tPm9CU2l6ZTsKKyAgICAgICAgICAgICAgICBlbmN2aWQtPm92ZXJydW5CdWZmZXIgPSAodWludDgqKSBlbmN2aWQtPmF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSwgREVGQVVMVF9BVFRSKTsKKworICAgICAgICAgICAgICAgIHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciA9IGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLT5vdmVycnVuQnVmZmVyID09IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGV2ZXJ5dGhpbmcgdG8gb3ZlcnJ1biBidWZmZXIgYW5kIHN0YXJ0IHVzaW5nIGl0LgorICAgICAgICAgICAgbWVtY3B5KHN0cmVhbS0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIsIHN0cmVhbS0+d3JpdGVfcG9zKTsKKyAgICAgICAgICAgIHN0cmVhbS0+Yml0c3RyZWFtQnVmZmVyID0gc3RyZWFtLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5idWZfc2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gb3ZlcnJ1biBidWZmZXIgaXMgYWxyZWFkeSB1c2VkCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b0JTaXplID0gc3RyZWFtLT53cml0ZV9wb3MgKyBudW1FeHRyYUJ5dGVzICsgMTAwOworICAgICAgICAgICAgc3RyZWFtLT5vQlNpemUgJj0gKH4weDMpOyAvLyBtYWtlIGl0IG11bHRpcGxlIG9mIDQKKworICAgICAgICAgICAgLy8gYWxsb2NhdGUgbmV3IG92ZXJydW4gYnVmZmVyCisgICAgICAgICAgICBlbmN2aWQtPm9CU2l6ZSA9IHN0cmVhbS0+b0JTaXplOworICAgICAgICAgICAgZW5jdmlkLT5vdmVycnVuQnVmZmVyID0gKHVpbnQ4KikgZW5jdmlkLT5hdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm9CU2l6ZSwgREVGQVVMVF9BVFRSKTsKKworICAgICAgICAgICAgaWYgKGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvLyBjb3B5IGZyb20gdGhlIG9sZCBidWZmZXIgdG8gbmV3IGJ1ZmZlcgorICAgICAgICAgICAgbWVtY3B5KGVuY3ZpZC0+b3ZlcnJ1bkJ1ZmZlciwgc3RyZWFtLT5vdmVycnVuQnVmZmVyLCBzdHJlYW0tPndyaXRlX3Bvcyk7CisgICAgICAgICAgICAvLyBmcmVlIG9sZCBidWZmZXIKKyAgICAgICAgICAgIGVuY3ZpZC0+YXZjSGFuZGxlLT5DQkFWQ19GcmVlKCh1aW50MzIqKWVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpc3RyZWFtLT5vdmVycnVuQnVmZmVyKTsKKworICAgICAgICAgICAgLy8gYXNzaWduIHBvaW50ZXIgdG8gbmV3IGJ1ZmZlcgorICAgICAgICAgICAgc3RyZWFtLT5vdmVycnVuQnVmZmVyID0gZW5jdmlkLT5vdmVycnVuQnVmZmVyOworICAgICAgICAgICAgc3RyZWFtLT5iaXRzdHJlYW1CdWZmZXIgPSBzdHJlYW0tPm92ZXJydW5CdWZmZXI7CisgICAgICAgICAgICBzdHJlYW0tPmJ1Zl9zaXplID0gc3RyZWFtLT5vQlNpemU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7CisgICAgfQorICAgIGVsc2UgLy8gb3ZlcnJ1bkJ1ZmZlciBpcyBub3QgZW5hYmxlLgorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgIH0KKworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2Jsb2NrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9ibG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFlMjZhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9ibG9jay5jcHAKQEAgLTAsMCArMSwxMjgzIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworLyogc3VidHJhY3Qgd2l0aCB0aGUgcHJlZGljdGlvbiBhbmQgZG8gdHJhbnNmb3JtYXRpb24gKi8KK3ZvaWQgdHJhbnModWludDggKmN1ciwgaW50IHBpdGNoLCB1aW50OCAqcHJlZEJsb2NrLCBpbnQxNiAqZGF0YUJsb2NrKQoreworICAgIGludDE2ICpwdHIgPSBkYXRhQmxvY2s7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqOworICAgIGludCBjdXJwaXRjaCA9ICh1aW50KXBpdGNoID4+IDE2OworICAgIGludCBwcmVkcGl0Y2ggPSAocGl0Y2ggJiAweEZGRkYpOworCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcmVzaWR1ZSBmaXJzdCAqLworICAgICAgICByMCA9IGN1clswXSAtIHByZWRCbG9ja1swXTsKKyAgICAgICAgcjEgPSBjdXJbMV0gLSBwcmVkQmxvY2tbMV07CisgICAgICAgIHIyID0gY3VyWzJdIC0gcHJlZEJsb2NrWzJdOworICAgICAgICByMyA9IGN1clszXSAtIHByZWRCbG9ja1szXTsKKworICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICByMyA9IHIwIC0gKHIzIDw8IDEpOyAgICAvL3B0clswXSAtIHB0clszXTsKKyAgICAgICAgcjEgKz0gcjI7ICAgICAgICAgICAvL3B0clsxXSArIHB0clsyXTsKKyAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgcHRyWzBdID0gcjAgKyByMTsKKyAgICAgICAgcHRyWzJdID0gcjAgLSByMTsKKyAgICAgICAgcHRyWzFdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIHB0clszXSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIHB0ciArPSAxNjsKKyAgICAgICAgcHJlZEJsb2NrICs9IHByZWRwaXRjaDsKKyAgICAgICAgY3VyICs9IGN1cnBpdGNoOworICAgICAgICBqLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsICovCisgICAgcHRyID0gZGF0YUJsb2NrOworICAgIGogPSA0OworICAgIHdoaWxlIChqID4gMCkKKyAgICB7CisgICAgICAgIHIwID0gcHRyWzBdICsgcHRyWzQ4XTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbNDhdOworICAgICAgICByMSA9IHB0clsxNl0gKyBwdHJbMzJdOworICAgICAgICByMiA9IHB0clsxNl0gLSBwdHJbMzJdOworCisgICAgICAgIHB0clswXSA9IHIwICsgcjE7CisgICAgICAgIHB0clszMl0gPSByMCAtIHIxOworICAgICAgICBwdHJbMTZdID0gKHIzIDw8IDEpICsgcjI7CisgICAgICAgIHB0cls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBwdHIrKzsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogZG8gcmVzaWR1ZSB0cmFuc2Zvcm0gcXVhbnQgaW52cXVhbnQsIGludnRyYW5zIGFuZCB3cml0ZSBvdXRwdXQgb3V0ICovCitpbnQgZGN0X2x1bWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludCBibGtpZHgsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpvcmcsIGludCAqY29lZl9jb3N0KQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQxNiAqY29lZiA9IHZpZGVvLT5ibG9jazsKKyAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOyAvLyBzaXplIDE2IGZvciBhIDR4NCBibG9jaworICAgIGludCBwcmVkX3BpdGNoID0gdmlkZW8tPnByZWRfcGl0Y2g7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqLCBrLCBpZHg7CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgUXEsIFJxLCBxX2JpdHMsIHFwX2NvbnN0LCBxdWFudDsKKyAgICBpbnQgZGF0YSwgbGV2LCB6ZXJvX3J1bjsKKyAgICBpbnQgbnVtY29lZmY7CisKKyAgICBjb2VmICs9ICgoYmxraWR4ICYgMHgzKSA8PCAyKSArICgoYmxraWR4ID4+IDIpIDw8IDYpOyAvKiBwb2ludCB0byB0aGUgNHg0IGJsb2NrICovCisKKyAgICAvKiBmaXJzdCB0YWtlIGEgNHg0IHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworICAgICAgICAvKiBjYWxjdWxhdGUgdGhlIHJlc2lkdWUgZmlyc3QgKi8KKyAgICAgICAgcjAgPSBvcmdbMF0gLSBwcmVkWzBdOyAgIC8qIE9QVElNSVpFQUJMRSAqLworICAgICAgICByMSA9IG9yZ1sxXSAtIHByZWRbMV07CisgICAgICAgIHIyID0gb3JnWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgcjMgPSBvcmdbM10gLSBwcmVkWzNdOworCisgICAgICAgIHIwICs9IHIzOyAgICAgICAgICAgLy9wdHJbMF0gKyBwdHJbM107CisgICAgICAgIHIzID0gcjAgLSAocjMgPDwgMSk7ICAgIC8vcHRyWzBdIC0gcHRyWzNdOworICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICByMiA9IHIxIC0gKHIyIDw8IDEpOyAgICAvL3B0clsxXSAtIHB0clsyXTsKKworICAgICAgICBjb2VmWzBdID0gcjAgKyByMTsKKyAgICAgICAgY29lZlsyXSA9IHIwIC0gcjE7CisgICAgICAgIGNvZWZbMV0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgY29lZlszXSA9IHIzIC0gKHIyIDw8IDEpOworCisgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgICAgIHByZWQgKz0gcHJlZF9waXRjaDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIGNvZWYgLT0gNjQ7CisgICAgcHJlZCAtPSAocHJlZF9waXRjaCA8PCAyKTsKKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaiA+IDApICAgLyogT1BUSU1JWkFCTEUgKi8KKyAgICB7CisgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNDhdOworICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzQ4XTsKKyAgICAgICAgcjEgPSBjb2VmWzE2XSArIGNvZWZbMzJdOworICAgICAgICByMiA9IGNvZWZbMTZdIC0gY29lZlszMl07CisKKyAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgIGNvZWZbMzJdID0gcjAgLSByMTsKKyAgICAgICAgY29lZlsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgY29lZls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICBjb2VmKys7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICBjb2VmIC09IDQ7CisKKyAgICAvKiBxdWFudCAqLworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtyYXMyZGVjW2Jsa2lkeF1dOworICAgIHJ1biA9IGVuY3ZpZC0+cnVuW3JhczJkZWNbYmxraWR4XV07CisKKyAgICBScSA9IHZpZGVvLT5RUHlfbW9kXzY7CisgICAgUXEgPSB2aWRlby0+UVB5X2Rpdl82OworICAgIHFwX2NvbnN0ID0gZW5jdmlkLT5xcF9jb25zdDsKKyAgICBxX2JpdHMgPSAxNSArIFFxOworCisgICAgemVyb19ydW4gPSAwOworICAgIG51bWNvZWZmID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKKyAgICB7CisgICAgICAgIGlkeCA9IFpaX1NDQU5fQkxPQ0tba107IC8qIG1hcCBiYWNrIHRvIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1ba107CisgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbGV2ID0gZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSBxX2JpdHM7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpjb2VmX2Nvc3QgKz0gKChsZXYgPiAxKSA/IE1BWF9WQUxVRSA6IENPRUZGX0NPU1RbRElTQUJMRV9USFJFU0hPTERJTkddW3plcm9fcnVuXSk7CisKKyAgICAgICAgICAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVtrXTsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtudW1jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgY29lZltpZHhdID0gKGxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtudW1jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9ICgtbGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW251bWNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+Y3Vyck1CLT5tYl9pbnRyYSkgLy8gb25seSBkbyBpbnZlcnNlIHRyYW5zZm9ybSB3aXRoIGludHJhIGJsb2NrCisgICAgeworICAgICAgICBpZiAobnVtY29lZmYpIC8qIHRoZW4gZG8gaW52ZXJzZSB0cmFuc2Zvcm0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkgLyogaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pIC8qIHZlcnRpY2FsLCBoYXMgdG8gYmUgZG9uZSBhZnRlciBob3Jpem9udGFsICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlszMl07CisgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisKKyAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMiA9ICoocHJlZCArPSBwcmVkX3BpdGNoKSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgcjMgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKHIzID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKworICAgICAgICAgICAgICAgICpjdXIgPSByMDsKKyAgICAgICAgICAgICAgICAqKGN1ciArPSBwaXRjaCkgPSByMTsKKyAgICAgICAgICAgICAgICAqKGN1ciArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICBjdXJbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgY3VyIC09IChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICBjdXIrKzsKKyAgICAgICAgICAgICAgICBwcmVkIC09IChwcmVkX3BpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgIHByZWQrKzsKKyAgICAgICAgICAgICAgICBjb2VmKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgLy8gY29weSBmcm9tIHByZWQgdG8gY3VyCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopY3VyKSA9ICooKHVpbnQzMiopcHJlZCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXIgKz0gcGl0Y2gpKSA9ICooKHVpbnQzMiopKHByZWQgKz0gcHJlZF9waXRjaCkpOworICAgICAgICAgICAgKigodWludDMyKikoY3VyICs9IHBpdGNoKSkgPSAqKCh1aW50MzIqKShwcmVkICs9IHByZWRfcGl0Y2gpKTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ciArPSBwaXRjaCkpID0gKigodWludDMyKikocHJlZCArPSBwcmVkX3BpdGNoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbnVtY29lZmY7Cit9CisKKwordm9pZCBNQkludGVySWRjdChBVkNDb21tb25PYmogKnZpZGVvLCB1aW50OCAqY3VyTCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgcGljUGl0Y2gpCit7CisgICAgaW50MTYgKmNvZWYsICpjb2VmOCA9IHZpZGVvLT5ibG9jazsKKyAgICB1aW50OCAqY3VyOyAgLy8gdGhlIHNhbWUgYXMgY3VyTAorICAgIGludCBiOCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBqLCBibGtpZHg7CisKKyAgICBmb3IgKGI4ID0gMDsgYjggPCA0OyBiOCsrKQorICAgIHsKKyAgICAgICAgY3VyID0gY3VyTDsKKyAgICAgICAgY29lZiA9IGNvZWY4OworCisgICAgICAgIGlmIChjdXJyTUItPkNCUCYoMSA8PCBiOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVtiNF07CisgICAgICAgICAgICAgICAgLyogZG8gSURDVCAqLworICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiBob3Jpem9udGFsICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMl07CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMV0gKyAoY29lZlszXSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbMl0gPSByMSAtIHIyOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjb2VmIC09IDY0OworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKSAvKiB2ZXJ0aWNhbCwgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaG9yaXpvbnRhbCAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxNl0gKyAoY29lZls0OF0gPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHIwIC0gKHIzIDw8IDEpKTsgLyogcjAtcjMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgKz0gMzI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gY3VyWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKmN1ciA9IHIwOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKGN1ciArPSBwaWNQaXRjaCkgKyAocjEgPj4gNik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICAqY3VyID0gcjE7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICooY3VyICs9IHBpY1BpdGNoKSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICpjdXIgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gY3VyW3BpY1BpdGNoXSArIChyMyA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cltwaWNQaXRjaF0gPSByMzsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3VyIC09IChwaWNQaXRjaCA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cisrOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1ciAtPSA0OworICAgICAgICAgICAgICAgICAgICBjb2VmIC09IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChiNCYxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9ICgocGljUGl0Y2ggPDwgMikgLSA0KTsKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSA2MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYjgmMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSAoKHBpY1BpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgICAgICBjb2VmOCArPSAxMjA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9IDg7CisgICAgICAgICAgICBjb2VmOCArPSA4OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogcGVyZm9ybWEgZGN0LCBxdWFudCwgaXF1YW50LCBpZGN0IGZvciB0aGUgZW50aXJlIE1CICovCit2b2lkIGRjdF9sdW1hXzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqY3VyTCwgdWludDggKm9yZ0wpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50MTYgKmNvZWYgPSB2aWRlby0+YmxvY2s7CisgICAgdWludDggKnByZWQgPSBlbmN2aWQtPnByZWRfaTE2W2N1cnJNQi0+aTE2TW9kZV07CisgICAgaW50IGJsa194LCBibGtfeSwgaiwgaywgaWR4LCBiOCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBtMCwgbTEsIG0yICwgbTM7CisgICAgaW50IGRhdGEsIGxldjsKKyAgICBpbnQgKmxldmVsLCAqcnVuLCB6ZXJvX3J1biwgbmNvZWZmOworICAgIGludCBScSwgUXEsIHF1YW50LCBxX2JpdHMsIHFwX2NvbnN0OworICAgIGludCBvZmZzZXRfY3VyWzRdLCBvZmZzZXRfcHJlZFs0XSwgb2Zmc2V0OworCisgICAgLyogaG9yaXpvbnRhbCAqLworICAgIGZvciAoaiA9IDE2OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChibGtfeCA9IDQ7IGJsa194ID4gMDsgYmxrX3gtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgICAgICByMCA9ICpvcmdMKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjEgPSAqb3JnTCsrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIyID0gKm9yZ0wrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMyA9ICpvcmdMKysgLSAqcHJlZCsrOworCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgICAgICpjb2VmKysgPSByMCArIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgKmNvZWYrKyA9IHIwIC0gcjE7CisgICAgICAgICAgICAqY29lZisrID0gcjMgLSAocjIgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgb3JnTCArPSAob3JnX3BpdGNoIC0gMTYpOworICAgIH0KKyAgICBwcmVkIC09IDI1NjsKKyAgICBjb2VmIC09IDI1NjsKKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIGZvciAoYmxrX3kgPSA0OyBibGtfeSA+IDA7IGJsa195LS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZls0OF07CisgICAgICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgIHIxID0gY29lZlsxNl0gKyBjb2VmWzMyXTsKKyAgICAgICAgICAgIHIyID0gY29lZlsxNl0gLSBjb2VmWzMyXTsKKworICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgICAgICBjb2VmWzMyXSA9IHIwIC0gcjE7CisgICAgICAgICAgICBjb2VmWzE2XSA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgY29lZls0OF0gPSByMyAtIChyMiA8PCAxKTsKKworICAgICAgICAgICAgY29lZisrOworICAgICAgICB9CisgICAgICAgIGNvZWYgKz0gNDg7CisgICAgfQorCisgICAgLyogdGhlbiBwZXJmb3JtIERDIHRyYW5zZm9ybSAqLworICAgIGNvZWYgLT0gMjU2OworICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzEyXTsKKyAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZlsxMl07CisgICAgICAgIHIxID0gY29lZls0XSArIGNvZWZbOF07CisgICAgICAgIHIyID0gY29lZls0XSAtIGNvZWZbOF07CisKKyAgICAgICAgY29lZlswXSA9IHIwICsgcjE7CisgICAgICAgIGNvZWZbOF0gPSByMCAtIHIxOworICAgICAgICBjb2VmWzRdID0gcjMgKyByMjsKKyAgICAgICAgY29lZlsxMl0gPSByMyAtIHIyOworICAgICAgICBjb2VmICs9IDY0OworICAgIH0KKyAgICBjb2VmIC09IDI1NjsKKyAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsxOTJdOworICAgICAgICByMyA9IGNvZWZbMF0gLSBjb2VmWzE5Ml07CisgICAgICAgIHIxID0gY29lZls2NF0gKyBjb2VmWzEyOF07CisgICAgICAgIHIyID0gY29lZls2NF0gLSBjb2VmWzEyOF07CisKKyAgICAgICAgY29lZlswXSA9IChyMCArIHIxKSA+PiAxOworICAgICAgICBjb2VmWzEyOF0gPSAocjAgLSByMSkgPj4gMTsKKyAgICAgICAgY29lZls2NF0gPSAocjMgKyByMikgPj4gMTsKKyAgICAgICAgY29lZlsxOTJdID0gKHIzIC0gcjIpID4+IDE7CisgICAgICAgIGNvZWYgKz0gNDsKKyAgICB9CisKKyAgICBjb2VmIC09IDE2OworICAgIC8vIHRoZW4gcXVhbnRpemUgREMKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxkYzsKKyAgICBydW4gPSBlbmN2aWQtPnJ1bmRjOworCisgICAgUnEgPSB2aWRlby0+UVB5X21vZF82OworICAgIFFxID0gdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdWzBdOworICAgIHFfYml0cyA9IDE1ICsgUXE7CisgICAgcXBfY29uc3QgPSBlbmN2aWQtPnFwX2NvbnN0OworCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgeworICAgICAgICBpZHggPSBaSUdaQUcyUkFTVEVSRENba107CisgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgIGlmIChkYXRhID4gMCkgICAvLyBxdWFudAorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KSAvLyBkZXF1YW50CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpbnZlcnNlIHRyYW5zZm9ybSBEQyAqLworICAgIGVuY3ZpZC0+bnVtY29lZmRjID0gbmNvZWZmOworICAgIGlmIChuY29lZmYpCisgICAgeworICAgICAgICBxdWFudCA9IGRlcXVhbnRfY29lZnJlc1tScV1bMF07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls0XTsKKyAgICAgICAgICAgIG0xID0gY29lZlswXSAtIGNvZWZbNF07CisgICAgICAgICAgICBtMiA9IGNvZWZbOF0gKyBjb2VmWzEyXTsKKyAgICAgICAgICAgIG0zID0gY29lZls4XSAtIGNvZWZbMTJdOworCisKKyAgICAgICAgICAgIGNvZWZbMF0gPSBtMCArIG0yOworICAgICAgICAgICAgY29lZls0XSA9IG0wIC0gbTI7CisgICAgICAgICAgICBjb2VmWzhdID0gbTEgLSBtMzsKKyAgICAgICAgICAgIGNvZWZbMTJdID0gbTEgKyBtMzsKKyAgICAgICAgICAgIGNvZWYgKz0gNjQ7CisgICAgICAgIH0KKworICAgICAgICBjb2VmIC09IDI1NjsKKworICAgICAgICBpZiAoUXEgPj0gMikgIC8qIHRoaXMgd2F5IHNob3VsZCBiZSBmYXN0ZXIgdGhhbiBKTSAqLworICAgICAgICB7ICAgICAgICAgICAvKiB0aGV5IHVzZSAoKChtNCpzY2FsZSk8PChRUHkvNikpKzIpPj4yIGZvciBib3RoIGNhc2VzLiAqLworICAgICAgICAgICAgUXEgLT0gMjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls2NF07CisgICAgICAgICAgICAgICAgbTEgPSBjb2VmWzBdIC0gY29lZls2NF07CisgICAgICAgICAgICAgICAgbTIgPSBjb2VmWzEyOF0gKyBjb2VmWzE5Ml07CisgICAgICAgICAgICAgICAgbTMgPSBjb2VmWzEyOF0gLSBjb2VmWzE5Ml07CisKKyAgICAgICAgICAgICAgICBjb2VmWzBdID0gKChtMCArIG0yKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmWzY0XSA9ICgobTAgLSBtMikgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgY29lZlsxMjhdID0gKChtMSAtIG0zKSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICBjb2VmWzE5Ml0gPSAoKG0xICsgbTMpICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFFxICs9IDI7IC8qIHJlc3RvcmUgdGhlIHZhbHVlICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBRcSA9IDIgLSBRcTsKKyAgICAgICAgICAgIG9mZnNldCA9IDEgPDwgKFFxIC0gMSk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbTAgPSBjb2VmWzBdICsgY29lZls2NF07CisgICAgICAgICAgICAgICAgbTEgPSBjb2VmWzBdIC0gY29lZls2NF07CisgICAgICAgICAgICAgICAgbTIgPSBjb2VmWzEyOF0gKyBjb2VmWzE5Ml07CisgICAgICAgICAgICAgICAgbTMgPSBjb2VmWzEyOF0gLSBjb2VmWzE5Ml07CisKKyAgICAgICAgICAgICAgICBjb2VmWzBdID0gKCgobTAgKyBtMikgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWZbNjRdID0gKCgobTAgLSBtMikgKiBxdWFudCArIG9mZnNldCkgPj4gUXEpOworICAgICAgICAgICAgICAgIGNvZWZbMTI4XSA9ICgoKG0xIC0gbTMpICogcXVhbnQgKyBvZmZzZXQpID4+IFFxKTsKKyAgICAgICAgICAgICAgICBjb2VmWzE5Ml0gPSAoKChtMSArIG0zKSAqIHF1YW50ICsgb2Zmc2V0KSA+PiBRcSk7CisgICAgICAgICAgICAgICAgY29lZiArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgUXEgPSAyIC0gUXE7IC8qIHJlc3RvcmUgdGhlIHZhbHVlICovCisgICAgICAgIH0KKyAgICAgICAgY29lZiAtPSAxNjsgLyogYmFjayB0byB0aGUgb3JpZ2luICovCisgICAgfQorCisgICAgLyogbm93IHppZ3phZyBzY2FuIGFjIGNvZWZzLCBxdWFudCwgaXF1YW50IGFuZCBpdHJhbnMgKi8KKyAgICBydW4gPSBlbmN2aWQtPnJ1blswXTsKKyAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbMF07CisKKyAgICAvKiBvZmZzZXQgYnR3IDR4NCBibG9jayAqLworICAgIG9mZnNldF9jdXJbMF0gPSAwOworICAgIG9mZnNldF9jdXJbMV0gPSAocGl0Y2ggPDwgMikgLSA4OworCisgICAgLyogb2Zmc2V0IGJ0dyA4eDggYmxvY2sgKi8KKyAgICBvZmZzZXRfY3VyWzJdID0gOCAtIChwaXRjaCA8PCAzKTsKKyAgICBvZmZzZXRfY3VyWzNdID0gLTg7CisKKyAgICAvKiBzaW1pbGFybHkgZm9yIHByZWQgKi8KKyAgICBvZmZzZXRfcHJlZFswXSA9IDA7CisgICAgb2Zmc2V0X3ByZWRbMV0gPSA1NjsKKyAgICBvZmZzZXRfcHJlZFsyXSA9IC0xMjA7CisgICAgb2Zmc2V0X3ByZWRbM10gPSAtODsKKworICAgIGN1cnJNQi0+Q0JQID0gMDsKKworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgIG5jb2VmZiA9IDA7CisKKyAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCAxNjsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlkeCA9IFpaX1NDQU5fQkxPQ0tba107IC8qIG1hcCBiYWNrIHRvIHJhc3RlciBzY2FuIG9yZGVyICovCisgICAgICAgICAgICAgICAgZGF0YSA9IGNvZWZbaWR4XTsKKyAgICAgICAgICAgICAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdW2tdOworICAgICAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgcXBfY29uc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxldiA+Pj0gcV9iaXRzOworICAgICAgICAgICAgICAgIGlmIChsZXYpCisgICAgICAgICAgICAgICAgeyAgIC8qIGRlcXVhbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAobGV2ICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAoLWxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgICAgICAgICAgY29lZltpZHhdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxrSWR4MmJsa1hZW2I4XVtiNF1dID0gbmNvZWZmOyAvKiBpbiByYXN0ZXIgc2NhbiAhISEgKi8KKyAgICAgICAgICAgIGlmIChuY29lZmYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5DQlAgfD0gKDEgPDwgYjgpOworCisgICAgICAgICAgICAgICAgLy8gZG8gaW52ZXJzZSB0cmFuc2Zvcm0gaGVyZQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzFdID4+IDEpIC0gY29lZlszXTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzFdICsgKGNvZWZbM10gPj4gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZlswXSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbMV0gPSByMSArIHIyOworICAgICAgICAgICAgICAgICAgICBjb2VmWzJdID0gcjEgLSByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlszXSA9IHIwIC0gcjM7CisKKyAgICAgICAgICAgICAgICAgICAgY29lZiArPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29lZiAtPSA2NDsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlszMl07CisgICAgICAgICAgICAgICAgICAgIHIxID0gY29lZlswXSAtIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMiA9IChjb2VmWzE2XSA+PiAxKSAtIGNvZWZbNDhdOworICAgICAgICAgICAgICAgICAgICByMyA9IGNvZWZbMTZdICsgKGNvZWZbNDhdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIHIwICs9IHIzOworICAgICAgICAgICAgICAgICAgICByMyA9IChyMCAtIChyMyA8PCAxKSk7IC8qIHIwLXIzICovCisgICAgICAgICAgICAgICAgICAgIHIxICs9IHIyOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMSAtIChyMiA8PCAxKSk7IC8qIHIxLXIyICovCisgICAgICAgICAgICAgICAgICAgIHIwICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMSArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIzICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAocjAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSBwcmVkWzE2XSArIChyMSA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIxID4gMHhGRikgICByMSA9IDB4RkYgJiAofihyMSA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMiA9IHByZWRbMzJdICsgKHIyID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFs0OF0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckwgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJMICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckxbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckwgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJMKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQrKzsKKyAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgIC8vIGRvIERDLW9ubHkgaW52ZXJzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG0wID0gY29lZlswXSArIDMyOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gcHJlZFswXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMSA9IHByZWRbMTZdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFszMl0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMiA+IDB4RkYpICAgcjIgPSAweEZGICYgKH4ocjIgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjMgPSBwcmVkWzQ4XSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyTCA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckwgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyTCArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyTFtwaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyTCAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckwrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJ1biArPSAxNjsgIC8vIGZvbGxvdyBjb2Rpbmcgb3JkZXIKKyAgICAgICAgICAgIGxldmVsICs9IDE2OworICAgICAgICAgICAgY3VyTCArPSBvZmZzZXRfY3VyW2I0JjFdOworICAgICAgICAgICAgcHJlZCArPSBvZmZzZXRfcHJlZFtiNCYxXTsKKyAgICAgICAgICAgIGNvZWYgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgIH0KKworICAgICAgICBjdXJMICs9IG9mZnNldF9jdXJbMiArIChiOCYxKV07CisgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbMiArIChiOCYxKV07CisgICAgICAgIGNvZWYgKz0gb2Zmc2V0X3ByZWRbMiArIChiOCYxKV07CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIGRjdF9jaHJvbWEoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXJDLCB1aW50OCAqb3JnQywgaW50IGNyKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBvcmdfcGl0Y2ggPSAoZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoKSA+PiAxOworICAgIGludCBwaXRjaCA9ICh2aWRlby0+Y3VyclBpYy0+cGl0Y2gpID4+IDE7CisgICAgaW50IHByZWRfcGl0Y2ggPSAxNjsKKyAgICBpbnQxNiAqY29lZiA9IHZpZGVvLT5ibG9jayArIDI1NjsKKyAgICB1aW50OCAqcHJlZCA9IHZpZGVvLT5wcmVkX2Jsb2NrOworICAgIGludCBqLCBibGtfeCwgYmxrX3ksIGssIGlkeCwgYjQ7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCBtMDsKKyAgICBpbnQgUXEsIFJxLCBxcF9jb25zdCwgcV9iaXRzLCBxdWFudDsKKyAgICBpbnQgKmxldmVsLCAqcnVuLCB6ZXJvX3J1biwgbmNvZWZmOworICAgIGludCBkYXRhLCBsZXY7CisgICAgaW50IG9mZnNldF9jdXJbMl0sIG9mZnNldF9wcmVkWzJdLCBvZmZzZXRfY29lZlsyXTsKKyAgICB1aW50OCBuel90ZW1wWzRdOworICAgIGludCAgY29lZmZfY29zdDsKKworICAgIGlmIChjcikKKyAgICB7CisgICAgICAgIGNvZWYgKz0gODsKKyAgICAgICAgcHJlZCArPSA4OworICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhID09IDApIC8vIGludGVyIG1vZGUKKyAgICB7CisgICAgICAgIHByZWQgPSBjdXJDOworICAgICAgICBwcmVkX3BpdGNoID0gcGl0Y2g7CisgICAgfQorCisgICAgLyogZG8gNHg0IHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBmb3IgKGogPSA4OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChibGtfeCA9IDI7IGJsa194ID4gMDsgYmxrX3gtLSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsY3VsYXRlIHRoZSByZXNpZHVlIGZpcnN0ICovCisgICAgICAgICAgICByMCA9ICpvcmdDKysgLSAqcHJlZCsrOworICAgICAgICAgICAgcjEgPSAqb3JnQysrIC0gKnByZWQrKzsKKyAgICAgICAgICAgIHIyID0gKm9yZ0MrKyAtICpwcmVkKys7CisgICAgICAgICAgICByMyA9ICpvcmdDKysgLSAqcHJlZCsrOworCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgICAgIC8vcHRyWzBdICsgcHRyWzNdOworICAgICAgICAgICAgcjMgPSByMCAtIChyMyA8PCAxKTsgICAgLy9wdHJbMF0gLSBwdHJbM107CisgICAgICAgICAgICByMSArPSByMjsgICAgICAgICAgIC8vcHRyWzFdICsgcHRyWzJdOworICAgICAgICAgICAgcjIgPSByMSAtIChyMiA8PCAxKTsgICAgLy9wdHJbMV0gLSBwdHJbMl07CisKKyAgICAgICAgICAgICpjb2VmKysgPSByMCArIHIxOworICAgICAgICAgICAgKmNvZWYrKyA9IChyMyA8PCAxKSArIHIyOworICAgICAgICAgICAgKmNvZWYrKyA9IHIwIC0gcjE7CisgICAgICAgICAgICAqY29lZisrID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgfQorICAgICAgICBjb2VmICs9IDg7IC8vIGNvZWYgcGl0Y2ggaXMgMTYKKyAgICAgICAgcHJlZCArPSAocHJlZF9waXRjaCAtIDgpOyAvLyBwcmVkX3BpdGNoIGlzIDE2CisgICAgICAgIG9yZ0MgKz0gKG9yZ19waXRjaCAtIDgpOworICAgIH0KKyAgICBwcmVkIC09IChwcmVkX3BpdGNoIDw8IDMpOworICAgIGNvZWYgLT0gMTI4OworICAgIC8qIHZlcnRpY2FsICovCisgICAgZm9yIChibGtfeSA9IDI7IGJsa195ID4gMDsgYmxrX3ktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDg7IGogPiAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbNDhdOworICAgICAgICAgICAgcjMgPSBjb2VmWzBdIC0gY29lZls0OF07CisgICAgICAgICAgICByMSA9IGNvZWZbMTZdICsgY29lZlszMl07CisgICAgICAgICAgICByMiA9IGNvZWZbMTZdIC0gY29lZlszMl07CisKKyAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIxOworICAgICAgICAgICAgY29lZlszMl0gPSByMCAtIHIxOworICAgICAgICAgICAgY29lZlsxNl0gPSAocjMgPDwgMSkgKyByMjsKKyAgICAgICAgICAgIGNvZWZbNDhdID0gcjMgLSAocjIgPDwgMSk7CisKKyAgICAgICAgICAgIGNvZWYrKzsKKyAgICAgICAgfQorICAgICAgICBjb2VmICs9IDU2OworICAgIH0KKyAgICAvKiB0aGVuIHBlcmZvcm0gREMgdHJhbnNmb3JtICovCisgICAgY29lZiAtPSAxMjg7CisKKyAgICAvKiAyeDIgdHJhbnNmb3JtIG9mIERDIGNvbXBvbmVudHMqLworICAgIHIwID0gY29lZlswXTsKKyAgICByMSA9IGNvZWZbNF07CisgICAgcjIgPSBjb2VmWzY0XTsKKyAgICByMyA9IGNvZWZbNjhdOworCisgICAgY29lZlswXSA9IHIwICsgcjEgKyByMiArIHIzOworICAgIGNvZWZbNF0gPSByMCAtIHIxICsgcjIgLSByMzsKKyAgICBjb2VmWzY0XSA9IHIwICsgcjEgLSByMiAtIHIzOworICAgIGNvZWZbNjhdID0gcjAgLSByMSAtIHIyICsgcjM7CisKKyAgICBRcSAgICA9IHZpZGVvLT5RUGNfZGl2XzY7CisgICAgUnEgICAgPSB2aWRlby0+UVBjX21vZF82OworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzICAgID0gMTUgKyBRcTsKKyAgICBxcF9jb25zdCA9IGVuY3ZpZC0+cXBfY29uc3RfYzsKKworICAgIHplcm9fcnVuID0gMDsKKyAgICBuY29lZmYgPSAwOworICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjICsgKGNyIDw8IDIpOworICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYyArIChjciA8PCAyKTsKKworICAgIC8qIGluIHppZ3phZyBzY2FuIG9yZGVyICovCisgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykKKyAgICB7CisgICAgICAgIGlkeCA9ICgoayA+PiAxKSA8PCA2KSArICgoayAmIDEpIDw8IDIpOworICAgICAgICBkYXRhID0gY29lZltpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IGxldjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gLWxldjsKKyAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPm51bWNvZWZjZGNbY3JdID0gbmNvZWZmOworCisgICAgaWYgKG5jb2VmZikKKyAgICB7CisgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IDQpOyAvLyBEQyBwcmVzZW50CisgICAgICAgIC8vIGRvIGludmVyc2UgdHJhbnNmb3JtCisgICAgICAgIHF1YW50ID0gZGVxdWFudF9jb2VmcmVzW1JxXVswXTsKKworICAgICAgICByMCA9IGNvZWZbMF0gKyBjb2VmWzRdOworICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzRdOworICAgICAgICByMiA9IGNvZWZbNjRdICsgY29lZls2OF07CisgICAgICAgIHIzID0gY29lZls2NF0gLSBjb2VmWzY4XTsKKworICAgICAgICByMCArPSByMjsKKyAgICAgICAgcjIgPSByMCAtIChyMiA8PCAxKTsKKyAgICAgICAgcjEgKz0gcjM7CisgICAgICAgIHIzID0gcjEgLSAocjMgPDwgMSk7CisKKyAgICAgICAgaWYgKFFxID49IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIFFxIC09IDE7CisgICAgICAgICAgICBjb2VmWzBdID0gKHIwICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgY29lZls0XSA9IChyMSAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgIGNvZWZbNjRdID0gKHIyICogcXVhbnQpIDw8IFFxOworICAgICAgICAgICAgY29lZls2OF0gPSAocjMgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICBRcSsrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29lZlswXSA9IChyMCAqIHF1YW50KSA+PiAxOworICAgICAgICAgICAgY29lZls0XSA9IChyMSAqIHF1YW50KSA+PiAxOworICAgICAgICAgICAgY29lZls2NF0gPSAocjIgKiBxdWFudCkgPj4gMTsKKyAgICAgICAgICAgIGNvZWZbNjhdID0gKHIzICogcXVhbnQpID4+IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgZG8gQUMgemlnemFnIHNjYW4sIHF1YW50LCBpcXVhbnQgYW5kIGl0cmFucyAqLworICAgIGlmIChjcikKKyAgICB7CisgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuWzIwXTsKKyAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsWzIwXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5bMTZdOworICAgICAgICBsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxbMTZdOworICAgIH0KKworICAgIC8qIG9mZnNldCBidHcgNHg0IGJsb2NrICovCisgICAgb2Zmc2V0X2N1clswXSA9IDA7CisgICAgb2Zmc2V0X2N1clsxXSA9IChwaXRjaCA8PCAyKSAtIDg7CisgICAgb2Zmc2V0X3ByZWRbMF0gPSAwOworICAgIG9mZnNldF9wcmVkWzFdID0gKHByZWRfcGl0Y2ggPDwgMikgLSA4OworICAgIG9mZnNldF9jb2VmWzBdID0gMDsKKyAgICBvZmZzZXRfY29lZlsxXSA9IDU2OworCisgICAgY29lZmZfY29zdCA9IDA7CisKKyAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgIHsKKyAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICBuY29lZmYgPSAwOworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgMTY7IGsrKykgLyogaW4gemlnemFnIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWR4ID0gWlpfU0NBTl9CTE9DS1trXTsgLyogbWFwIGJhY2sgdG8gcmFzdGVyIHNjYW4gb3JkZXIgKi8KKyAgICAgICAgICAgIGRhdGEgPSBjb2VmW2lkeF07CisgICAgICAgICAgICBxdWFudCA9IHF1YW50X2NvZWZbUnFdW2tdOworICAgICAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIHFwX2NvbnN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyBxcF9jb25zdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldiA+Pj0gcV9iaXRzOworICAgICAgICAgICAgaWYgKGxldikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmb3IgUkQgcGVyZm9ybWFuY2UqLworICAgICAgICAgICAgICAgIGlmIChsZXYgPiAxKQorICAgICAgICAgICAgICAgICAgICBjb2VmZl9jb3N0ICs9IE1BWF9WQUxVRTsgICAgICAgICAgICAgICAgLy8gc2V0IGhpZ2ggY29zdCwgc2hhbGwgbm90IGJlIGRpc2NhcmRlZAorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY29lZmZfY29zdCArPSBDT0VGRl9DT1NUW0RJU0FCTEVfVEhSRVNIT0xESU5HXVt6ZXJvX3J1bl07CisKKyAgICAgICAgICAgICAgICAvKiBkZXF1YW50ICovCisgICAgICAgICAgICAgICAgcXVhbnQgPSBkZXF1YW50X2NvZWZyZXNbUnFdW2tdOworICAgICAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSBsZXY7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IChsZXYgKiBxdWFudCkgPDwgUXE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgICAgICBjb2VmW2lkeF0gPSAoLWxldiAqIHF1YW50KSA8PCBRcTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgICAgIHplcm9fcnVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgICAgIGNvZWZbaWR4XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBuel90ZW1wW2I0XSA9IG5jb2VmZjsgLy8gcmFzdGVyIHNjYW4KKworICAgICAgICAvLyBqdXN0IGFkdmFuY2UgdGhlIHBvaW50ZXJzIGZvciBub3csIGRvIElEQ1QgbGF0ZXIKKyAgICAgICAgY29lZiArPSA0OworICAgICAgICBydW4gKz0gMTY7CisgICAgICAgIGxldmVsICs9IDE2OworICAgICAgICBjb2VmICs9IG9mZnNldF9jb2VmW2I0JjFdOworICAgIH0KKworICAgIC8qIHJld2luZCB0aGUgcG9pbnRlcnMgKi8KKyAgICBjb2VmIC09IDEyODsKKworICAgIGlmIChjb2VmZl9jb3N0IDwgX0NIUk9NQV9DT0VGRl9DT1NUXykKKyAgICB7CisgICAgICAgIC8qIGlmIGl0J3Mgbm90IGVmZmljaWVudCB0byBlbmNvZGUgYW55IGJsb2Nrcy4KKyAgICAgICAgSnVzdCBkbyBEQyBvbmx5ICovCisgICAgICAgIC8qIFdlIGNhbiByZXNldCBsZXZlbCBhbmQgcnVuIGFsc28sIGJ1dCBzZXR0aW5nIG56IHRvIHplcm8gc2hvdWxkIGJlIGVub3VnaC4gKi8KKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsxNisoY3I8PDEpXSA9IDA7CisgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbMTcrKGNyPDwxKV0gPSAwOworICAgICAgICBjdXJyTUItPm56X2NvZWZmWzIwKyhjcjw8MSldID0gMDsKKyAgICAgICAgY3Vyck1CLT5uel9jb2VmZlsyMSsoY3I8PDEpXSA9IDA7CisKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gREMtb25seSBpbnZlcnNlCisgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyAzMjsKKworICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIwID4gMHhGRikgICByMCA9IDB4RkYgJiAofihyMCA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMiA9IHByZWRbcHJlZF9waXRjaF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoPDwxXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjMgPiAweEZGKSAgIHIzID0gMHhGRiAmICh+KHIzID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgKmN1ckMgPSByMDsKKyAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIyOworICAgICAgICAgICAgICAgIGN1ckNbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgY3VyQyAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgY3VyQysrOworICAgICAgICAgICAgICAgIHByZWQgKz0gKDEgLSBwcmVkX3BpdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZWYgKz0gNDsKKyAgICAgICAgICAgIGN1ckMgKz0gb2Zmc2V0X2N1cltiNCYxXTsKKyAgICAgICAgICAgIHByZWQgKz0gb2Zmc2V0X3ByZWRbYjQmMV07CisgICAgICAgICAgICBjb2VmICs9IG9mZnNldF9jb2VmW2I0JjFdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gbm90IGRyb3BwaW5nIGFueXRoaW5nLCBjb250aW51ZSB3aXRoIHRoZSBJRENUCisgICAgeworICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICB7CisgICAgICAgICAgICBuY29lZmYgPSBuel90ZW1wW2I0XSA7IC8vIGluIHJhc3RlciBzY2FuCisgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmWzE2KyhiNCYxKSsoY3I8PDEpKygoYjQ+PjEpPDwyKV0gPSBuY29lZmY7IC8vIGluIHJhc3RlciBzY2FuCisKKyAgICAgICAgICAgIGlmIChuY29lZmYpIC8vIGRvIGEgY2hlY2sgb24gdGhlIG5vbnplcm8tY29lZmYKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCB8PSAoMiA8PCA0KTsKKworICAgICAgICAgICAgICAgIC8vIGRvIGludmVyc2UgdHJhbnNmb3JtIGhlcmUKKyAgICAgICAgICAgICAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBjb2VmWzBdICsgY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBjb2VmWzBdIC0gY29lZlsyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxXSA+PiAxKSAtIGNvZWZbM107CisgICAgICAgICAgICAgICAgICAgIHIzID0gY29lZlsxXSArIChjb2VmWzNdID4+IDEpOworCisgICAgICAgICAgICAgICAgICAgIGNvZWZbMF0gPSByMCArIHIzOworICAgICAgICAgICAgICAgICAgICBjb2VmWzFdID0gcjEgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgY29lZlsyXSA9IHIxIC0gcjI7CisgICAgICAgICAgICAgICAgICAgIGNvZWZbM10gPSByMCAtIHIzOworCisgICAgICAgICAgICAgICAgICAgIGNvZWYgKz0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZWYgLT0gNjQ7CisgICAgICAgICAgICAgICAgZm9yIChqID0gNDsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIwID0gY29lZlswXSArIGNvZWZbMzJdOworICAgICAgICAgICAgICAgICAgICByMSA9IGNvZWZbMF0gLSBjb2VmWzMyXTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAoY29lZlsxNl0gPj4gMSkgLSBjb2VmWzQ4XTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSBjb2VmWzE2XSArIChjb2VmWzQ4XSA+PiAxKTsKKworICAgICAgICAgICAgICAgICAgICByMCArPSByMzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjAgLSAocjMgPDwgMSkpOyAvKiByMC1yMyAqLworICAgICAgICAgICAgICAgICAgICByMSArPSByMjsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjEgLSAocjIgPDwgMSkpOyAvKiByMS1yMiAqLworICAgICAgICAgICAgICAgICAgICByMCArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjEgKz0gMzI7CisgICAgICAgICAgICAgICAgICAgIHIyICs9IDMyOworICAgICAgICAgICAgICAgICAgICByMyArPSAzMjsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSBwcmVkWzBdICsgKHIwID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjAgPiAweEZGKSAgIHIwID0gMHhGRiAmICh+KHIwID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwcmVkICs9IHByZWRfcGl0Y2gpICsgKHIxID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjEgPiAweEZGKSAgIHIxID0gMHhGRiAmICh+KHIxID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIyID0gcHJlZFtwcmVkX3BpdGNoXSArIChyMiA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIyID4gMHhGRikgICByMiA9IDB4RkYgJiAofihyMiA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByMyA9IHByZWRbcHJlZF9waXRjaDw8MV0gKyAocjMgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMyA+IDB4RkYpICAgcjMgPSAweEZGICYgKH4ocjMgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgKmN1ckMgPSByMDsKKyAgICAgICAgICAgICAgICAgICAgKihjdXJDICs9IHBpdGNoKSA9IHIxOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjI7CisgICAgICAgICAgICAgICAgICAgIGN1ckNbcGl0Y2hdID0gcjM7CisgICAgICAgICAgICAgICAgICAgIGN1ckMgLT0gKHBpdGNoIDw8IDEpOworICAgICAgICAgICAgICAgICAgICBjdXJDKys7CisgICAgICAgICAgICAgICAgICAgIHByZWQgKz0gKDEgLSBwcmVkX3BpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgY29lZisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBkbyBEQy1vbmx5IGludmVyc2UKKyAgICAgICAgICAgICAgICBtMCA9IGNvZWZbMF0gKyAzMjsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDQ7IGogPiAwOyBqLS0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9IHByZWRbMF0gKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMCA+IDB4RkYpICAgcjAgPSAweEZGICYgKH4ocjAgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHByZWQgKz0gcHJlZF9waXRjaCkgKyAobTAgPj4gNik7CisgICAgICAgICAgICAgICAgICAgIGlmICgodWludClyMSA+IDB4RkYpICAgcjEgPSAweEZGICYgKH4ocjEgPj4gMzEpKTsgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSBwcmVkW3ByZWRfcGl0Y2hdICsgKG0wID4+IDYpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHVpbnQpcjIgPiAweEZGKSAgIHIyID0gMHhGRiAmICh+KHIyID4+IDMxKSk7ICAvKiBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHIzID0gcHJlZFtwcmVkX3BpdGNoPDwxXSArIChtMCA+PiA2KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1aW50KXIzID4gMHhGRikgICByMyA9IDB4RkYgJiAofihyMyA+PiAzMSkpOyAgLyogY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAqY3VyQyA9IHIwOworICAgICAgICAgICAgICAgICAgICAqKGN1ckMgKz0gcGl0Y2gpID0gcjE7CisgICAgICAgICAgICAgICAgICAgICooY3VyQyArPSBwaXRjaCkgPSByMjsKKyAgICAgICAgICAgICAgICAgICAgY3VyQ1twaXRjaF0gPSByMzsKKyAgICAgICAgICAgICAgICAgICAgY3VyQyAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgICAgICAgICAgICAgIGN1ckMrKzsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCArPSAoMSAtIHByZWRfcGl0Y2gpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2VmICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJDICs9IG9mZnNldF9jdXJbYjQmMV07CisgICAgICAgICAgICBwcmVkICs9IG9mZnNldF9wcmVkW2I0JjFdOworICAgICAgICAgICAgY29lZiArPSBvZmZzZXRfY29lZltiNCYxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworLyogb25seSBEQyB0cmFuc2Zvcm0gKi8KK2ludCBUcmFuc1F1YW50SW50cmExNkRDKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQxNiAqYmxvY2sgPSB2aWRlby0+YmxvY2s7CisgICAgaW50ICpsZXZlbCA9IGVuY3ZpZC0+bGV2ZWxkYzsKKyAgICBpbnQgKnJ1biA9IGVuY3ZpZC0+cnVuZGM7CisgICAgaW50MTYgKnB0ciA9IGJsb2NrOworICAgIGludCByMCwgcjEsIHIyLCByMywgajsKKyAgICBpbnQgUXEgPSB2aWRlby0+UVB5X2Rpdl82OworICAgIGludCBScSA9IHZpZGVvLT5RUHlfbW9kXzY7CisgICAgaW50IHFfYml0cywgcXBfY29uc3QsIHF1YW50OworICAgIGludCBkYXRhLCBsZXYsIHplcm9fcnVuOworICAgIGludCBrLCBuY29lZmYsIGlkeDsKKworICAgIC8qIERDIHRyYW5zZm9ybSAqLworICAgIC8qIGhvcml6b250YWwgKi8KKyAgICBqID0gNDsKKyAgICB3aGlsZSAoaikKKyAgICB7CisgICAgICAgIHIwID0gcHRyWzBdICsgcHRyWzEyXTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbMTJdOworICAgICAgICByMSA9IHB0cls0XSArIHB0cls4XTsKKyAgICAgICAgcjIgPSBwdHJbNF0gLSBwdHJbOF07CisKKyAgICAgICAgcHRyWzBdID0gcjAgKyByMTsKKyAgICAgICAgcHRyWzhdID0gcjAgLSByMTsKKyAgICAgICAgcHRyWzRdID0gcjMgKyByMjsKKyAgICAgICAgcHRyWzEyXSA9IHIzIC0gcjI7CisgICAgICAgIHB0ciArPSA2NDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIHB0ciA9IGJsb2NrOworICAgIGogPSA0OworICAgIHdoaWxlIChqKQorICAgIHsKKyAgICAgICAgcjAgPSBwdHJbMF0gKyBwdHJbMTkyXTsKKyAgICAgICAgcjMgPSBwdHJbMF0gLSBwdHJbMTkyXTsKKyAgICAgICAgcjEgPSBwdHJbNjRdICsgcHRyWzEyOF07CisgICAgICAgIHIyID0gcHRyWzY0XSAtIHB0clsxMjhdOworCisgICAgICAgIHB0clswXSA9IChyMCArIHIxKSA+PiAxOworICAgICAgICBwdHJbMTI4XSA9IChyMCAtIHIxKSA+PiAxOworICAgICAgICBwdHJbNjRdID0gKHIzICsgcjIpID4+IDE7CisgICAgICAgIHB0clsxOTJdID0gKHIzIC0gcjIpID4+IDE7CisgICAgICAgIHB0ciArPSA0OworICAgICAgICBqLS07CisgICAgfQorCisgICAgcXVhbnQgPSBxdWFudF9jb2VmW1JxXVswXTsKKyAgICBxX2JpdHMgICAgPSAxNSArIFFxOworICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDM7ICAgIC8vIGludHJhCisKKyAgICB6ZXJvX3J1biA9IDA7CisgICAgbmNvZWZmID0gMDsKKworICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIHsKKyAgICAgICAgaWR4ID0gWklHWkFHMlJBU1RFUkRDW2tdOworICAgICAgICBkYXRhID0gYmxvY2tbaWR4XTsKKyAgICAgICAgaWYgKGRhdGEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSBkYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZXYgPSAtZGF0YSAqIHF1YW50ICsgKHFwX2NvbnN0IDw8IDEpOworICAgICAgICB9CisgICAgICAgIGxldiA+Pj0gKHFfYml0cyArIDEpOworICAgICAgICBpZiAobGV2KQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IGxldjsKKyAgICAgICAgICAgICAgICBibG9ja1tpZHhdID0gbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsW25jb2VmZl0gPSAtbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAtbGV2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcnVuW25jb2VmZisrXSA9IHplcm9fcnVuOworICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgemVyb19ydW4rKzsKKyAgICAgICAgICAgIGJsb2NrW2lkeF0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBuY29lZmY7Cit9CisKK2ludCBUcmFuc1F1YW50Q2hyb21hREMoQVZDRW5jT2JqZWN0ICplbmN2aWQsIGludDE2ICpibG9jaywgaW50IHNsaWNlX3R5cGUsIGludCBjcikKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgcjAsIHIxLCByMiwgcjM7CisgICAgaW50IFFxLCBScSwgcV9iaXRzLCBxcF9jb25zdCwgcXVhbnQ7CisgICAgaW50IGRhdGEsIGxldiwgemVyb19ydW47CisgICAgaW50IGssIG5jb2VmZiwgaWR4OworCisgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjICsgKGNyIDw8IDIpOyAvKiBjYiBvciBjciAqLworICAgIHJ1biA9IGVuY3ZpZC0+cnVuY2RjICsgKGNyIDw8IDIpOworCisgICAgLyogMngyIHRyYW5zZm9ybSBvZiBEQyBjb21wb25lbnRzKi8KKyAgICByMCA9IGJsb2NrWzBdOworICAgIHIxID0gYmxvY2tbNF07CisgICAgcjIgPSBibG9ja1s2NF07CisgICAgcjMgPSBibG9ja1s2OF07CisKKyAgICBibG9ja1swXSA9IHIwICsgcjEgKyByMiArIHIzOworICAgIGJsb2NrWzRdID0gcjAgLSByMSArIHIyIC0gcjM7CisgICAgYmxvY2tbNjRdID0gcjAgKyByMSAtIHIyIC0gcjM7CisgICAgYmxvY2tbNjhdID0gcjAgLSByMSAtIHIyICsgcjM7CisKKyAgICBRcSAgICA9IHZpZGVvLT5RUGNfZGl2XzY7CisgICAgUnEgICAgPSB2aWRlby0+UVBjX21vZF82OworICAgIHF1YW50ID0gcXVhbnRfY29lZltScV1bMF07CisgICAgcV9iaXRzICAgID0gMTUgKyBRcTsKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfSV9TTElDRSkKKyAgICB7CisgICAgICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHFwX2NvbnN0ID0gKDEgPDwgcV9iaXRzKSAvIDY7CisgICAgfQorCisgICAgemVyb19ydW4gPSAwOworICAgIG5jb2VmZiA9IDA7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKSAvKiBpbiB6aWd6YWcgc2NhbiBvcmRlciAqLworICAgIHsKKyAgICAgICAgaWR4ID0gKChrID4+IDEpIDw8IDYpICsgKChrICYgMSkgPDwgMik7CisgICAgICAgIGRhdGEgPSBibG9ja1tpZHhdOworICAgICAgICBpZiAoZGF0YSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IGRhdGEgKiBxdWFudCArIChxcF9jb25zdCA8PCAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldiA9IC1kYXRhICogcXVhbnQgKyAocXBfY29uc3QgPDwgMSk7CisgICAgICAgIH0KKyAgICAgICAgbGV2ID4+PSAocV9iaXRzICsgMSk7CisgICAgICAgIGlmIChsZXYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXZlbFtuY29lZmZdID0gbGV2OworICAgICAgICAgICAgICAgIGJsb2NrW2lkeF0gPSBsZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxbbmNvZWZmXSA9IC1sZXY7CisgICAgICAgICAgICAgICAgYmxvY2tbaWR4XSA9IC1sZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBydW5bbmNvZWZmKytdID0gemVyb19ydW47CisgICAgICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvX3J1bisrOworICAgICAgICAgICAgYmxvY2tbaWR4XSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5jb2VmZjsKK30KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvZmluZGhhbGZwZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGEyYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ZpbmRoYWxmcGVsLmNwcApAQCAtMCwwICsxLDYyMiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisvKiAzLzI5LzAxIGZhc3QgaGFsZi1wZWwgc2VhcmNoIGJhc2VkIG9uIG5laWdoYm9yaW5nIGd1ZXNzICovCisvKiB2YWx1ZSByYW5naW5nIGZyb20gMCB0byA0LCBoaWdoIGNvbXBsZXhpdHkgKG1vcmUgYWNjdXJhdGUpIHRvCisgICBsb3cgY29tcGxleGl0eSAobGVzcyBhY2N1cmF0ZSkgKi8KKyNkZWZpbmUgSFBfRElTVEFOQ0VfVEggICAgICA1IC8vIDIgIC8qIGhhbGYtcGVsIGRpc3RhbmNlIHRocmVzaG9sZCAqLworCisjZGVmaW5lIFBSRUZfMTZfVkVDIDEyOSAgICAgLyogMU1WIGJpYXMgdmVyc3VzIDRNVnMqLworCitjb25zdCBzdGF0aWMgaW50IGRpc3RhbmNlX3RhYls5XVs5XSA9ICAgLyogW2hwX2d1ZXNzXVtrXSAqLworeworICAgIHswLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB7MSwgMCwgMSwgMiwgMywgNCwgMywgMiwgMX0sCisgICAgezEsIDAsIDAsIDAsIDEsIDIsIDMsIDIsIDF9LAorICAgIHsxLCAyLCAxLCAwLCAxLCAyLCAzLCA0LCAzfSwKKyAgICB7MSwgMiwgMSwgMCwgMCwgMCwgMSwgMiwgM30sCisgICAgezEsIDQsIDMsIDIsIDEsIDAsIDEsIDIsIDN9LAorICAgIHsxLCAyLCAzLCAyLCAxLCAwLCAwLCAwLCAxfSwKKyAgICB7MSwgMiwgMywgNCwgMywgMiwgMSwgMCwgMX0sCisgICAgezEsIDAsIDEsIDIsIDMsIDIsIDEsIDAsIDB9Cit9OworCisjZGVmaW5lIENMSVBfUkVTVUxUKHgpICAgICAgaWYoKHVpbnQpeCA+IDB4RkYpeyBcCisgICAgICAgICAgICAgICAgIHggPSAweEZGICYgKH4oeD4+MzEpKTt9CisKKyNkZWZpbmUgQ0xJUF9VUFBFUjE2KHgpICAgICBpZigodWludCl4ID49IDB4MjAwMDAwMDApeyBcCisgICAgICAgIHggPSAweEZGMDAwMCAmICh+KHg+PjMxKSk7fSBcCisgICAgICAgIGVsc2UgeyBcCisgICAgICAgIHggPSAoeD4+NSkmMHhGRjAwMDA7IFwKKyAgICAgICAgfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0ZpbmRIYWxmUGVsTUIKKyAgICBEYXRlOiAgICAgICAxMC8zMS8yMDA3CisgICAgUHVycG9zZTogICAgRmluZCBoYWxmIHBlbCByZXNvbHV0aW9uIE1WIHN1cnJvdW5kaW5nIHRoZSBmdWxsLXBlbCBNVgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50IEFWQ0ZpbmRIYWxmUGVsTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIEFWQ01WICptb3QsIHVpbnQ4ICpuY2FuZCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4cG9zLCBpbnQgeXBvcywgaW50IGhwX2d1ZXNzLCBpbnQgY212eCwgaW50IGNtdnkpCit7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSBlbmN2aWQtPmNvbW1vbi0+Y3VyclBpYzsKKyAgICBpbnQgbHggPSBjdXJyUGljLT5waXRjaDsKKyAgICBpbnQgZCwgZG1pbiwgc2F0ZF9taW47CisgICAgdWludDgqIGNhbmQ7CisgICAgaW50IGxhbWJkYV9tb3Rpb24gPSBlbmN2aWQtPmxhbWJkYV9tb3Rpb247CisgICAgdWludDggKm12Yml0cyA9IGVuY3ZpZC0+bXZiaXRzOworICAgIGludCBtdmNvc3Q7CisgICAgLyogbGlzdCBvZiBjYW5kaWRhdGUgdG8gZ28gdGhyb3VnaCBmb3IgaGFsZi1wZWwgc2VhcmNoKi8KKyAgICB1aW50OCAqc3VicGVsX3ByZWQgPSAodWludDgqKSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvLyBhbGwgMTYgc3ViLXBlbCBwb3NpdGlvbnMKKyAgICB1aW50OCAqKmhwZWxfY2FuZCA9ICh1aW50OCoqKSBlbmN2aWQtPmhwZWxfY2FuZDsgLyogaGFsZi1wZWwgcG9zaXRpb24gKi8KKworICAgIGludCB4aFs5XSA9IHswLCAwLCAyLCAyLCAyLCAwLCAtMiwgLTIsIC0yfTsKKyAgICBpbnQgeWhbOV0gPSB7MCwgLTIsIC0yLCAwLCAyLCAyLCAyLCAwLCAtMn07CisgICAgaW50IHhxWzhdID0gezAsIDEsIDEsIDEsIDAsIC0xLCAtMSwgLTF9OworICAgIGludCB5cVs4XSA9IHsgLTEsIC0xLCAwLCAxLCAxLCAxLCAwLCAtMX07CisgICAgaW50IGgsIGhtaW4sIHEsIHFtaW47CisKKyAgICBPU0NMX1VOVVNFRF9BUkcoeHBvcyk7CisgICAgT1NDTF9VTlVTRURfQVJHKHlwb3MpOworICAgIE9TQ0xfVU5VU0VEX0FSRyhocF9ndWVzcyk7CisKKyAgICBHZW5lcmF0ZUhhbGZQZWxQcmVkKHN1YnBlbF9wcmVkLCBuY2FuZCwgbHgpOworCisgICAgY3VyID0gZW5jdmlkLT5jdXJyWU1COyAvLyBwcmUtbG9hZCBjdXJyZW50IG9yaWdpbmFsIE1CCisKKyAgICBjYW5kID0gaHBlbF9jYW5kWzBdOworCisgICAgLy8gZmluZCBjb3N0IGZvciB0aGUgY3VycmVudCBmdWxsLXBlbCBwb3NpdGlvbgorICAgIGRtaW4gPSBTQVREX01CKGNhbmQsIGN1ciwgNjU1MzUpOyAvLyBnZXQgSGFkYW1hYXJkIHRyYW5zZm9ybSBTQUQKKyAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54LCBtb3QtPnksIGNtdngsIGNtdnkpOworICAgIHNhdGRfbWluID0gZG1pbjsKKyAgICBkbWluICs9IG12Y29zdDsKKyAgICBobWluID0gMDsKKworICAgIC8qIGZpbmQgaGFsZi1wZWwgKi8KKyAgICBmb3IgKGggPSAxOyBoIDwgOTsgaCsrKQorICAgIHsKKyAgICAgICAgZCA9IFNBVERfTUIoaHBlbF9jYW5kW2hdLCBjdXIsIGRtaW4pOworICAgICAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54ICsgeGhbaF0sIG1vdC0+eSArIHloW2hdLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgZCArPSBtdmNvc3Q7CisKKyAgICAgICAgaWYgKGQgPCBkbWluKQorICAgICAgICB7CisgICAgICAgICAgICBkbWluID0gZDsKKyAgICAgICAgICAgIGhtaW4gPSBoOworICAgICAgICAgICAgc2F0ZF9taW4gPSBkIC0gbXZjb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgbW90LT5zYWQgPSBkbWluOworICAgIG1vdC0+eCArPSB4aFtobWluXTsKKyAgICBtb3QtPnkgKz0geWhbaG1pbl07CisgICAgZW5jdmlkLT5iZXN0X2hwZWxfcG9zID0gaG1pbjsKKworICAgIC8qKiogc2VhcmNoIGZvciBxdWFydGVyLXBlbCAqKioqLworICAgIEdlbmVyYXRlUXVhcnRQZWxQcmVkKGVuY3ZpZC0+YmlsaW5fYmFzZVtobWluXSwgJihlbmN2aWQtPnFwZWxfY2FuZFswXVswXSksIGhtaW4pOworCisgICAgZW5jdmlkLT5iZXN0X3FwZWxfcG9zID0gcW1pbiA9IC0xOworCisgICAgZm9yIChxID0gMDsgcSA8IDg7IHErKykKKyAgICB7CisgICAgICAgIGQgPSBTQVREX01CKGVuY3ZpZC0+cXBlbF9jYW5kW3FdLCBjdXIsIGRtaW4pOworICAgICAgICBtdmNvc3QgPSBNVl9DT1NUX1MobGFtYmRhX21vdGlvbiwgbW90LT54ICsgeHFbcV0sIG1vdC0+eSArIHlxW3FdLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgZCArPSBtdmNvc3Q7CisgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICBxbWluID0gcTsKKyAgICAgICAgICAgIHNhdGRfbWluID0gZCAtIG12Y29zdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChxbWluICE9IC0xKQorICAgIHsKKyAgICAgICAgbW90LT5zYWQgPSBkbWluOworICAgICAgICBtb3QtPnggKz0geHFbcW1pbl07CisgICAgICAgIG1vdC0+eSArPSB5cVtxbWluXTsKKyAgICAgICAgZW5jdmlkLT5iZXN0X3FwZWxfcG9zID0gcW1pbjsKKyAgICB9CisKKyAgICByZXR1cm4gc2F0ZF9taW47Cit9CisKKworCisvKiogVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgc3ViLXBlbCBwcmVkaWN0aW9uIGFyb3VuZCB0aGUgZnVsbC1wZWwgY2FuZGlkYXRlLgorRWFjaCBzdWItcGVsIHBvc2l0aW9uIGFycmF5IGlzIDIwIHBpeGVsIHdpZGUgKGZvciB3b3JkLWFsaWdubWVudCkgYW5kIDE3IHBpeGVsIHRhbGwuICovCisvKiogVGhlIHN1Yi1wZWwgcG9zaXRpb24gaXMgbGFiZWxlZCBpbiBzcGlyYWwgbWFubmVyIGZyb20gdGhlIGNlbnRlci4gKi8KKwordm9pZCBHZW5lcmF0ZUhhbGZQZWxQcmVkKHVpbnQ4KiBzdWJwZWxfcHJlZCwgdWludDggKm5jYW5kLCBpbnQgbHgpCit7CisgICAgLyogbGV0J3MgZG8gc3RyYWlnaHRmb3J3YXJkIHdheSBmaXJzdCAqLworICAgIHVpbnQ4ICpyZWY7CisgICAgdWludDggKmRzdDsKKyAgICB1aW50OCB0bXA4OworICAgIGludDMyIHRtcDMyOworICAgIGludDE2IHRtcF9ob3J6WzE4KjIyXSwgKmRzdF8xNiwgKnNyY18xNjsKKyAgICByZWdpc3RlciBpbnQgYSA9IDAsIGIgPSAwLCBjID0gMCwgZCA9IDAsIGUgPSAwLCBmID0gMDsgLy8gdGVtcCByZWdpc3RlcgorICAgIGludCBtc2s7CisgICAgaW50IGksIGo7CisKKyAgICAvKiBmaXJzdCBjb3B5IGZ1bGwtcGVsIHRvIHRoZSBmaXJzdCBhcnJheSAqLworICAgIC8qIHRvIGJlIG9wdGltaXplZCBsYXRlciBiYXNlZCBvbiBieXRlLW9mZnNldCBsb2FkICovCisgICAgcmVmID0gbmNhbmQgLSAzIC0gbHggLSAobHggPDwgMSk7IC8qIG1vdmUgYmFjayAoLTMsLTMpICovCisgICAgZHN0ID0gc3VicGVsX3ByZWQ7CisKKyAgICBkc3QgLT0gNDsgLyogb2Zmc2V0ICovCisgICAgZm9yIChqID0gMDsgaiA8IDIyOyBqKyspIC8qIDI0eDIyICovCisgICAgeworICAgICAgICBpID0gNjsKKyAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAzMiA9ICpyZWYrKzsKKyAgICAgICAgICAgIHRtcDggPSAqcmVmKys7CisgICAgICAgICAgICB0bXAzMiB8PSAodG1wOCA8PCA4KTsKKyAgICAgICAgICAgIHRtcDggPSAqcmVmKys7CisgICAgICAgICAgICB0bXAzMiB8PSAodG1wOCA8PCAxNik7CisgICAgICAgICAgICB0bXA4ID0gKnJlZisrOworICAgICAgICAgICAgdG1wMzIgfD0gKHRtcDggPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikoZHN0ICs9IDQpKSA9IHRtcDMyOworICAgICAgICAgICAgaS0tOworICAgICAgICB9CisgICAgICAgIHJlZiArPSAobHggLSAyNCk7CisgICAgfQorCisgICAgLyogZnJvbSB0aGUgZmlyc3QgYXJyYXksIHdlIGRvIGhvcml6b250YWwgaW50ZXJwICovCisgICAgcmVmID0gc3VicGVsX3ByZWQgKyAyOworICAgIGRzdF8xNiA9IHRtcF9ob3J6OyAvKiAxNyB4IDIyICovCisKKyAgICBmb3IgKGogPSA0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSByZWZbLTJdOworICAgICAgICAgICAgYiA9IHJlZlstMV07CisgICAgICAgICAgICBjID0gcmVmWzBdOworICAgICAgICAgICAgZCA9IHJlZlsxXTsKKyAgICAgICAgICAgIGUgPSByZWZbMl07CisgICAgICAgICAgICBmID0gcmVmWzNdOworICAgICAgICAgICAgKmRzdF8xNisrID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIGEgPSByZWZbNF07CisgICAgICAgICAgICAqZHN0XzE2KysgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgYiA9IHJlZls1XTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IGMgKyBiIC0gNSAqIChkICsgYSkgKyAyMCAqIChlICsgZik7CisgICAgICAgICAgICBjID0gcmVmWzZdOworICAgICAgICAgICAgKmRzdF8xNisrID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKworICAgICAgICAgICAgcmVmICs9IDQ7CisgICAgICAgIH0KKyAgICAgICAgLyogZG8gdGhlIDE3dGggY29sdW1uIGhlcmUgKi8KKyAgICAgICAgZCA9IHJlZlszXTsKKyAgICAgICAgKmRzdF8xNiA9ICBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICBkc3RfMTYgKz0gMjsgLyogc3RyaWRlIGZvciB0bXBfaG9yeiBpcyAxOCAqLworICAgICAgICByZWYgKz0gODsgIC8qIHN0cmlkZSBmb3IgcmVmIGlzIDI0ICovCisgICAgICAgIGlmIChqID09IDMpICAvLyBtb3ZlIDE4IGxpbmVzIGRvd24KKyAgICAgICAgeworICAgICAgICAgICAgZHN0XzE2ICs9IDMyNDsvLzE4KjE4OworICAgICAgICAgICAgcmVmICs9IDQzMjsvLzE4KjI0OworICAgICAgICB9CisgICAgfQorCisgICAgcmVmIC09IDQ4MDsvLzIwKjI0OworICAgIGRzdF8xNiAtPSAzNjA7Ly8yMCoxODsKKyAgICBkc3QgPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsgLyogZ28gdG8gdGhlIDE0dGggYXJyYXkgMTd4MTgqLworCisgICAgZm9yIChqID0gMTg7IGogPiAwOyBqLS0pCisgICAgeworICAgICAgICBmb3IgKGkgPSAxNjsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IHJlZlstMl07CisgICAgICAgICAgICBiID0gcmVmWy0xXTsKKyAgICAgICAgICAgIGMgPSByZWZbMF07CisgICAgICAgICAgICBkID0gcmVmWzFdOworICAgICAgICAgICAgZSA9IHJlZlsyXTsKKyAgICAgICAgICAgIGYgPSByZWZbM107CisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICBhID0gcmVmWzRdOworICAgICAgICAgICAgdG1wMzIgPSBiICsgYSAtIDUgKiAoYyArIGYpICsgMjAgKiAoZCArIGUpOworICAgICAgICAgICAgKmRzdF8xNisrID0gdG1wMzI7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqZHN0KysgPSB0bXAzMjsKKworICAgICAgICAgICAgYiA9IHJlZls1XTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgICpkc3RfMTYrKyA9IHRtcDMyOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKmRzdCsrID0gdG1wMzI7CisKKyAgICAgICAgICAgIGMgPSByZWZbNl07CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICAqZHN0XzE2KysgPSB0bXAzMjsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICpkc3QrKyA9IHRtcDMyOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgfQorICAgICAgICAvKiBkbyB0aGUgMTd0aCBjb2x1bW4gaGVyZSAqLworICAgICAgICBkID0gcmVmWzNdOworICAgICAgICB0bXAzMiA9ICBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICAqZHN0XzE2ID0gdG1wMzI7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAqZHN0ID0gdG1wMzI7CisKKyAgICAgICAgZHN0ICs9IDg7ICAvKiBzdHJpZGUgZm9yIGRzdCBpcyAyNCAqLworICAgICAgICBkc3RfMTYgKz0gMjsgLyogc3RyaWRlIGZvciB0bXBfaG9yeiBpcyAxOCAqLworICAgICAgICByZWYgKz0gODsgIC8qIHN0cmlkZSBmb3IgcmVmIGlzIDI0ICovCisgICAgfQorCisKKyAgICAvKiBEbyBtaWRkbGUgcG9pbnQgZmlsdGVyaW5nKi8KKyAgICBzcmNfMTYgPSB0bXBfaG9yejsgLyogMTcgeCAyMiAqLworICAgIGRzdCA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOyAvKiAxMnRoIGFycmF5IDE3eDE3Ki8KKyAgICBkc3QgLT0gMjQ7IC8vIG9mZnNldAorICAgIGZvciAoaSA9IDA7IGkgPCAxNzsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMTY7IGogPiAwOyBqIC09IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSAqc3JjXzE2OworICAgICAgICAgICAgYiA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGMgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICBkID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgZSA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIGYgPSAqKHNyY18xNiArPSAxOCk7CisKKyAgICAgICAgICAgIHRtcDMyID0gYSArIGYgLSA1ICogKGIgKyBlKSArIDIwICogKGMgKyBkKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIGEgPSAqKHNyY18xNiArPSAxOCk7CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDUxMikgPj4gMTA7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOworCisgICAgICAgICAgICBiID0gKihzcmNfMTYgKz0gMTgpOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsKKworICAgICAgICAgICAgYyA9ICooc3JjXzE2ICs9IDE4KTsKKyAgICAgICAgICAgIHRtcDMyID0gZCArIGMgLSA1ICogKGUgKyBiKSArIDIwICogKGYgKyBhKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7CisKKyAgICAgICAgICAgIHNyY18xNiAtPSAoMTggPDwgMik7CisgICAgICAgIH0KKworICAgICAgICBkID0gc3JjXzE2WzkwXTsgLy8gMTgqNQorICAgICAgICB0bXAzMiA9IGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgNTEyKSA+PiAxMDsKKyAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgIGRzdFsyNF0gPSB0bXAzMjsKKworICAgICAgICBzcmNfMTYgLT0gKCgxOCA8PCA0KSAtIDEpOworICAgICAgICBkc3QgLT0gKCgyNCA8PCA0KSAtIDEpOworICAgIH0KKworICAgIC8qIGRvIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICByZWYgPSBzdWJwZWxfcHJlZCArIDI7CisgICAgZHN0ID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkU7IC8qIDEwdGggYXJyYXkgMTh4MTcgKi8KKyAgICBkc3QgLT0gMjQ7IC8vIG9mZnNldAorCisgICAgZm9yIChpID0gMjsgaSA+IDA7IGktLSkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDE2OyBqID4gMDsgaiAtPSA0KQorICAgICAgICB7CisgICAgICAgICAgICBhID0gKnJlZjsKKyAgICAgICAgICAgIGIgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZCA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGUgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBmID0gKihyZWYgKz0gMjQpOworCisgICAgICAgICAgICB0bXAzMiA9IGEgKyBmIC0gNSAqIChiICsgZSkgKyAyMCAqIChjICsgZCk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYSA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYiArIGEgLSA1ICogKGMgKyBmKSArIDIwICogKGQgKyBlKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBjICsgYiAtIDUgKiAoZCArIGEpICsgMjAgKiAoZSArIGYpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGMgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGQgKyBjIC0gNSAqIChlICsgYikgKyAyMCAqIChmICsgYSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgcmVmIC09ICgyNCA8PCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGQgPSByZWZbMTIwXTsgLy8gMjQqNQorICAgICAgICB0bXAzMiA9IGUgKyBkIC0gNSAqIChmICsgYykgKyAyMCAqIChhICsgYik7CisgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICBkc3RbMjRdID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgZHN0IC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICAgICAgcmVmIC09ICgoMjQgPDwgNCkgLSAxKTsKKyAgICB9CisKKyAgICAvLyBub3RlIHRoYXQgdXNpbmcgU0lNRCBoZXJlIGRvZXNuJ3QgaGVscCBtdWNoLCB0aGUgY3ljbGUgYWxtb3N0IHN0YXlzIHRoZSBzYW1lCisgICAgLy8gb25lIGNhbiBqdXN0IHVzZSB0aGUgYWJvdmUgY29kZSBhbmQgY2hhbmdlIHRoZSBmb3IoaT0yIHRvIGZvcihpPTE4CisgICAgZm9yIChpID0gMTY7IGkgPiAwOyBpIC09IDQpCisgICAgeworICAgICAgICBtc2sgPSAwOworICAgICAgICBmb3IgKGogPSAxNzsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICooKHVpbnQzMiopcmVmKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICBiID0gKGEgPj4gOCkgJiAweEZGMDBGRjsgLyogc2Vjb25kIGFuZCBmb3VydGggYnl0ZSAqLworICAgICAgICAgICAgYSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyA9ICooKHVpbnQzMiopKHJlZiArIDEyMCkpOworICAgICAgICAgICAgZCA9IChjID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICBjICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICBhICs9IGM7CisgICAgICAgICAgICBiICs9IGQ7CisKKyAgICAgICAgICAgIGUgPSAqKCh1aW50MzIqKShyZWYgKyA3MikpOyAvKiBlLCBmICovCisgICAgICAgICAgICBmID0gKGUgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGUgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgPSAqKCh1aW50MzIqKShyZWYgKyA0OCkpOyAvKiBjLCBkICovCisgICAgICAgICAgICBkID0gKGMgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIGMgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIGMgKz0gZTsKKyAgICAgICAgICAgIGQgKz0gZjsKKworICAgICAgICAgICAgYSArPSAyMCAqIGM7CisgICAgICAgICAgICBiICs9IDIwICogZDsKKyAgICAgICAgICAgIGEgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICBiICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICBlID0gKigodWludDMyKikocmVmICs9IDI0KSk7IC8qIGUsIGYgKi8KKyAgICAgICAgICAgIGYgPSAoZSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgZSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyA9ICooKHVpbnQzMiopKHJlZiArIDcyKSk7IC8qIGMsIGQgKi8KKyAgICAgICAgICAgIGQgPSAoYyA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgYyAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgYyArPSBlOworICAgICAgICAgICAgZCArPSBmOworCisgICAgICAgICAgICBhIC09IDUgKiBjOworICAgICAgICAgICAgYiAtPSA1ICogZDsKKworICAgICAgICAgICAgYyA9IGEgPDwgMTY7CisgICAgICAgICAgICBkID0gYiA8PCAxNjsKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihhKQorICAgICAgICAgICAgQ0xJUF9VUFBFUjE2KGMpCisgICAgICAgICAgICBDTElQX1VQUEVSMTYoYikKKyAgICAgICAgICAgIENMSVBfVVBQRVIxNihkKQorCisgICAgICAgICAgICBhIHw9IChjID4+IDE2KTsKKyAgICAgICAgICAgIGIgfD0gKGQgPj4gMTYpOworICAgICAgICAgICAgLy8gIGE+Pj01OworICAgICAgICAgICAgLy8gIGI+Pj01OworICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgLy8gIG1zayB8PSBiOyAgbXNrfD1hOworICAgICAgICAgICAgLy8gIGEgJj0gMHhGRjAwRkY7CisgICAgICAgICAgICAvLyAgYiAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIGEgfD0gKGIgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKworICAgICAgICAgICAgKigodWludDE2KikoZHN0ICs9IDI0KSkgPSBhICYgMHhGRkZGOyAvL2RzdCBpcyBub3Qgd29yZC1hbGlnbmVkLgorICAgICAgICAgICAgKigodWludDE2KikoZHN0ICsgMikpID0gYSA+PiAxNjsKKworICAgICAgICB9CisgICAgICAgIGRzdCAtPSA0MDQ7IC8vIDI0KjE3LTQKKyAgICAgICAgcmVmIC09IDQwNDsKKyAgICAgICAgLyogICAgICBpZihtc2sgJiAweEZGMDBGRjAwKSAvLyBuZWVkIGNsaXBwaW5nCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZXJ0SW50ZXJwV0NsaXAoZHN0LHJlZik7IC8vIHJlLWRvIDQgY29sdW1uIHdpdGggY2xpcAorICAgICAgICAgICAgICAgIH0qLworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgVmVydEludGVycFdDbGlwKHVpbnQ4ICpkc3QsIHVpbnQ4ICpyZWYpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGEsIGIsIGMsIGQsIGUsIGY7CisgICAgaW50MzIgdG1wMzI7CisKKyAgICBkc3QgLT0gNDsKKyAgICByZWYgLT0gNDsKKworICAgIGZvciAoaSA9IDQ7IGkgPiAwOyBpLS0pCisgICAgeworICAgICAgICBmb3IgKGogPSAxNjsgaiA+IDA7IGogLT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9ICpyZWY7CisgICAgICAgICAgICBiID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgYyA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIGQgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICBlID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgZiA9ICoocmVmICs9IDI0KTsKKworICAgICAgICAgICAgdG1wMzIgPSBhICsgZiAtIDUgKiAoYiArIGUpICsgMjAgKiAoYyArIGQpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIGEgPSAqKHJlZiArPSAyNCk7CisgICAgICAgICAgICB0bXAzMiA9IGIgKyBhIC0gNSAqIChjICsgZikgKyAyMCAqIChkICsgZSk7CisgICAgICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodG1wMzIpCisgICAgICAgICAgICAqKGRzdCArPSAyNCkgPSB0bXAzMjsgIC8vIDEwdGgKKworICAgICAgICAgICAgYiA9ICoocmVmICs9IDI0KTsKKyAgICAgICAgICAgIHRtcDMyID0gYyArIGIgLSA1ICogKGQgKyBhKSArIDIwICogKGUgKyBmKTsKKyAgICAgICAgICAgIHRtcDMyID0gKHRtcDMyICsgMTYpID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgICAgICooZHN0ICs9IDI0KSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgICAgICBjID0gKihyZWYgKz0gMjQpOworICAgICAgICAgICAgdG1wMzIgPSBkICsgYyAtIDUgKiAoZSArIGIpICsgMjAgKiAoZiArIGEpOworICAgICAgICAgICAgdG1wMzIgPSAodG1wMzIgKyAxNikgPj4gNTsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHRtcDMyKQorICAgICAgICAgICAgKihkc3QgKz0gMjQpID0gdG1wMzI7ICAvLyAxMHRoCisKKyAgICAgICAgICAgIHJlZiAtPSAoMjQgPDwgMik7CisgICAgICAgIH0KKworICAgICAgICBkID0gcmVmWzEyMF07IC8vIDI0KjUKKyAgICAgICAgdG1wMzIgPSBlICsgZCAtIDUgKiAoZiArIGMpICsgMjAgKiAoYSArIGIpOworICAgICAgICB0bXAzMiA9ICh0bXAzMiArIDE2KSA+PiA1OworICAgICAgICBDTElQX1JFU1VMVCh0bXAzMikKKyAgICAgICAgZHN0WzI0XSA9IHRtcDMyOyAgLy8gMTB0aAorCisgICAgICAgIGRzdCAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgICAgIHJlZiAtPSAoKDI0IDw8IDQpIC0gMSk7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIEdlbmVyYXRlUXVhcnRQZWxQcmVkKHVpbnQ4ICoqYmlsaW5fYmFzZSwgdWludDggKnFwZWxfY2FuZCwgaW50IGhwZWxfcG9zKQoreworICAgIC8vIGZvciBldmVuIHZhbHVlIG9mIGhwZWxfcG9zLCBzdGFydCB3aXRoIHBhdHRlcm4gMSwgb3RoZXJ3aXNlLCBzdGFydCB3aXRoIHBhdHRlcm4gMgorICAgIGludCBpLCBqOworCisgICAgdWludDggKmMxID0gcXBlbF9jYW5kOworICAgIHVpbnQ4ICp0bCA9IGJpbGluX2Jhc2VbMF07CisgICAgdWludDggKnRyID0gYmlsaW5fYmFzZVsxXTsKKyAgICB1aW50OCAqYmwgPSBiaWxpbl9iYXNlWzJdOworICAgIHVpbnQ4ICpiciA9IGJpbGluX2Jhc2VbM107CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IG9mZnNldCA9IDEgLSAoMzg0ICogNyk7CisKKyAgICBpZiAoIShocGVsX3BvcyYxKSkgLy8gZGlhbW9uZCBwYXR0ZXJuCisgICAgeworICAgICAgICBqID0gMTY7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9IHRyWzI0XTsKKyAgICAgICAgICAgICAgICBhID0gKnRyKys7CisgICAgICAgICAgICAgICAgYiA9IGJsWzFdOworICAgICAgICAgICAgICAgIGMgPSAqYnIrKzsKKworICAgICAgICAgICAgICAgICpjMSA9IChjICsgYSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGIgKyBhICsgMSkgPj4gMTsgLyogYzIgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGMgKyAxKSA+PiAxOyAvKiBjMyAqLworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChiICsgZCArIDEpID4+IDE7IC8qIGM0ICovCisKKyAgICAgICAgICAgICAgICBiID0gKmJsKys7CisKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYyArIGQgKyAxKSA+PiAxOyAgLyogYzUgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGQgKyAxKSA+PiAxOyAgLyogYzYgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGMgKyAxKSA+PiAxOyAgLyogYzcgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYiArIGEgKyAxKSA+PiAxOyAgLyogYzggKi8KKworICAgICAgICAgICAgICAgIGMxICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgbGluZSwgcGl0Y2ggaXMgMjQKKyAgICAgICAgICAgIHRsICs9IDg7CisgICAgICAgICAgICB0ciArPSA4OworICAgICAgICAgICAgYmwgKz0gODsKKyAgICAgICAgICAgIGJyICs9IDg7CisgICAgICAgICAgICBjMSArPSA4OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gc3RhciBwYXR0ZXJuCisgICAgeworICAgICAgICBqID0gMTY7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChpLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYSA9ICpicisrOworICAgICAgICAgICAgICAgIGIgPSAqdHIrKzsKKyAgICAgICAgICAgICAgICBjID0gdGxbMV07CisgICAgICAgICAgICAgICAgKmMxID0gKGEgKyBiICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBiID0gYmxbMV07CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzIgKi8KKyAgICAgICAgICAgICAgICBjID0gdGxbMjVdOworICAgICAgICAgICAgICAgICooYzEgKz0gMzg0KSA9IChhICsgYiArIDEpID4+IDE7IC8qIGMzICovCisgICAgICAgICAgICAgICAgYiA9IHRyWzIzXTsKKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjNCAqLworICAgICAgICAgICAgICAgIGMgPSB0bFsyNF07CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBiICsgMSkgPj4gMTsgLyogYzUgKi8KKyAgICAgICAgICAgICAgICBiID0gKmJsKys7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBjICsgMSkgPj4gMTsgLyogYzYgKi8KKyAgICAgICAgICAgICAgICBjID0gKnRsKys7CisgICAgICAgICAgICAgICAgKihjMSArPSAzODQpID0gKGEgKyBiICsgMSkgPj4gMTsgLyogYzcgKi8KKyAgICAgICAgICAgICAgICAqKGMxICs9IDM4NCkgPSAoYSArIGMgKyAxKSA+PiAxOyAvKiBjOCAqLworCisgICAgICAgICAgICAgICAgYzEgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYWR2YW5jZSB0byB0aGUgbmV4dCBsaW5lLCBwaXRjaCBpcyAyNAorICAgICAgICAgICAgdGwgKz0gODsKKyAgICAgICAgICAgIHRyICs9IDg7CisgICAgICAgICAgICBibCArPSA4OworICAgICAgICAgICAgYnIgKz0gODsKKyAgICAgICAgICAgIGMxICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIGFzc3VtaW5nIGNhbmQgYWx3YXlzIGhhcyBhIHBpdGNoIG9mIDI0ICovCitpbnQgU0FURF9NQih1aW50OCAqY2FuZCwgdWludDggKmN1ciwgaW50IGRtaW4pCit7CisgICAgaW50IGNvc3Q7CisKKworICAgIGRtaW4gPSAoZG1pbiA8PCAxNikgfCAyNDsKKyAgICBjb3N0ID0gQVZDU0FEX01hY3JvYmxvY2tfQyhjYW5kLCBjdXIsIGRtaW4sIE5VTEwpOworCisgICAgcmV0dXJuIGNvc3Q7Cit9CisKKworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2hlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaGVhZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWNmZjllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2hlYWRlci5jcHAKQEAgLTAsMCArMSw5MTcgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjIuMSAqLworLyogbm8gbmVlZCBmb3IgY2hlY2tpbmcgdGhlIHZhbGlkIHJhbmdlICwgYWxyZWFkeSBkb25lIGluIFNldEVuY29kZVBhcmFtKCksCitpZiB3ZSBoYXZlIHRvIHNlbmQgYW5vdGhlciBTUFMsIHRoZSByYW5nZXMgc2hvdWxkIGJlIHZlcmlmaWVkIGZpcnN0IGJlZm9yZQordXNlcnMgY2FsbCBQVkFWQ0VuY29kZVNQUygpICovCitBVkNFbmNfU3RhdHVzIEVuY29kZVNQUyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1ZVSVBhcmFtcyAqdnVpID0gJihzZXFQYXJhbS0+dnVpX3BhcmFtZXRlcnMpOworICAgIGludCBpOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisKKyAgICAvL0RFQlVHX0xPRyh1c2VyRGF0YSxBVkNfTE9HVFlQRV9JTkZPLCJFbmNvZGVTUFMiLC0xLC0xKTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHNlcVBhcmFtLT5wcm9maWxlX2lkYyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDBfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDFfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgNCwgMCk7ICAvKiBmb3JiaWRkZW4gemVybyBiaXRzICovCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIHdlIGNhbiBjaGVjayBhZnRlciBlYWNoIHdyaXRlIGFsc28gKi8KKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgc2VxUGFyYW0tPmxldmVsX2lkYyk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0KTsKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0KTsKKyAgICB9CisgICAgZWxzZSBpZiAoc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKTsKKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNlcVBhcmFtLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldKTsgLyogdXB0byAzMiBiaXRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmdhcHNfaW5fZnJhbWVfbnVtX3ZhbHVlX2FsbG93ZWRfZmxhZyk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNlcVBhcmFtLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgLyogaWYgZnJhbWVfbWJzX29ubHlfZmxhZyBpcyAwLCB0aGVuIHdyaXRlLCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mcmFtZSBoZXJlICovCisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzZXFQYXJhbS0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyk7CisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpOworICAgIGlmIChzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZykKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9sZWZ0X29mZnNldCk7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQpOworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCk7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzZXFQYXJhbS0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0KTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2VxUGFyYW0tPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICAvKiBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIC8vcmV0dXJuIEFWQ0VOQ19TUFNfRkFJTDsKKyAgICAgICAgRW5jb2RlVlVJKHN0cmVhbSwgdnVpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK3ZvaWQgRW5jb2RlVlVJKEFWQ0VuY0JpdHN0cmVhbSogc3RyZWFtLCBBVkNWVUlQYXJhbXMqIHZ1aSkKK3sKKyAgICBpbnQgdGVtcDsKKworICAgIHRlbXAgPSB2dWktPmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDgsIHZ1aS0+YXNwZWN0X3JhdGlvX2lkYyk7CisgICAgICAgIGlmICh2dWktPmFzcGVjdF9yYXRpb19pZGMgPT0gMjU1KQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgdnVpLT5zYXJfd2lkdGgpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMTYsIHZ1aS0+c2FyX2hlaWdodCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+b3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPm92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcpOworICAgIH0KKyAgICB0ZW1wID0gdnVpLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzLCB2dWktPnZpZGVvX2Zvcm1hdCk7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnKTsKKyAgICAgICAgdGVtcCA9IHZ1aS0+Y29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgICAgIGlmICh0ZW1wKQorICAgICAgICB7CisgICAgICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA4LCB2dWktPmNvbG91cl9wcmltYXJpZXMpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgOCwgdnVpLT5tYXRyaXhfY29lZmZpY2llbnRzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZW1wID0gdnVpLT5jaHJvbWFfbG9jYXRpb25faW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5jaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkKTsKKyAgICB9CisKKyAgICB0ZW1wID0gdnVpLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdGVtcCk7CisgICAgaWYgKHRlbXApCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgdnVpLT5udW1fdW5pdHNfaW5fdGljayk7CisgICAgICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDMyLCB2dWktPnRpbWVfc2NhbGUpOworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyk7CisgICAgfQorCisgICAgdGVtcCA9IHZ1aS0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEVuY29kZUhSRChzdHJlYW0sICYodnVpLT5uYWxfaHJkX3BhcmFtZXRlcnMpKTsKKyAgICB9CisgICAgdGVtcCA9IHZ1aS0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB0ZW1wKTsKKyAgICBpZiAodGVtcCkKKyAgICB7CisgICAgICAgIEVuY29kZUhSRChzdHJlYW0sICYodnVpLT52Y2xfaHJkX3BhcmFtZXRlcnMpKTsKKyAgICB9CisgICAgaWYgKHZ1aS0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyB8fCB2dWktPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCB2dWktPmxvd19kZWxheV9ocmRfZmxhZyk7CisgICAgfQorICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHZ1aS0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpOworICAgIHRlbXAgPSB2dWktPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHRlbXApOworICAgIGlmICh0ZW1wKQorICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgdnVpLT5tb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcpOworICAgICAgICB1ZV92KHN0cmVhbSwgdnVpLT5tYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPm1heF9iaXRzX3Blcl9tYl9kZW5vbSk7CisgICAgICAgIHVlX3Yoc3RyZWFtLCB2dWktPmxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2RlY19mcmFtZV9yZW9yZGVyaW5nKTsKKyAgICAgICAgdWVfdihzdHJlYW0sIHZ1aS0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmcpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBFbmNvZGVIUkQoQVZDRW5jQml0c3RyZWFtKiBzdHJlYW0sIEFWQ0hSRFBhcmFtcyogaHJkKQoreworICAgIGludCBpOworCisgICAgdWVfdihzdHJlYW0sIGhyZC0+Y3BiX2NudF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDQsIGhyZC0+Yml0X3JhdGVfc2NhbGUpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDQsIGhyZC0+Y3BiX3NpemVfc2NhbGUpOworICAgIGZvciAoaSA9IDA7IGkgPD0gKGludClocmQtPmNwYl9jbnRfbWludXMxOyBpKyspCisgICAgeworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5iaXRfcmF0ZV92YWx1ZV9taW51czFbaV0pOworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5jcGJfc2l6ZV92YWx1ZV9taW51czFbaV0pOworICAgICAgICB1ZV92KHN0cmVhbSwgaHJkLT5jYnJfZmxhZ1tpXSk7CisgICAgfQorICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+aW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEpOworICAgIEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDUsIGhyZC0+ZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxKTsKKyAgICBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCA1LCBocmQtPnRpbWVfb2Zmc2V0X2xlbmd0aCk7CisKKyAgICByZXR1cm4gOworfQorCisKKworLyoqIHNlZSBzdWJjbGF1c2UgNy40LjIuMiAqLworLyogbm8gbmVlZCBmb3IgY2hlY2tpbmcgdGhlIHZhbGlkIHJhbmdlICwgYWxyZWFkeSBkb25lIGluIFNldEVuY29kZVBhcmFtKCkuCitJZiB3ZSBoYXZlIHRvIHNlbmQgYW5vdGhlciBTUFMsIHRoZSByYW5nZXMgc2hvdWxkIGJlIHZlcmlmaWVkIGZpcnN0IGJlZm9yZQordXNlcnMgY2FsbCBQVkFWQ0VuY29kZVNQUygpKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlUFBTKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0gPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBpbnQgaSwgaUdyb3VwLCBudW1CaXRzOworICAgIHVpbnQgdGVtcDsKKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcpOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHBpY1BhcmFtLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxKTsKKyAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUpOworICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDw9IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lHcm91cF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGlHcm91cCA9IDA7IGlHcm91cCA8IChpbnQpcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgcGljUGFyYW0tPnRvcF9sZWZ0W2lHcm91cF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lHcm91cF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAzIHx8CisgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA0IHx8CisgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA1KQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qaWYocGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDYpKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxKTsKKworICAgICAgICAgICAgbnVtQml0cyA9IDA7LyogY2VpbChsb2cyKG51bV9zbGljZV9ncm91cHNfbWludXMxKzEpKSBiaXRzICovCisgICAgICAgICAgICBpID0gcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxOworICAgICAgICAgICAgd2hpbGUgKGkgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bUJpdHMrKzsKKyAgICAgICAgICAgICAgICBpID4+PSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IChpbnQpcGljUGFyYW0tPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBudW1CaXRzLCBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfaWRbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSk7CisgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBwaWNQYXJhbS0+d2VpZ2h0ZWRfcHJlZF9mbGFnKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAyLCBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2KTsKKyAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgcGljUGFyYW0tPnBpY19pbml0X3FzX21pbnVzMjYpOworICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCk7CisKKyAgICB0ZW1wID0gcGljUGFyYW0tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnIDw8IDI7CisgICAgdGVtcCB8PSAocGljUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyA8PCAxKTsKKyAgICB0ZW1wIHw9IHBpY1BhcmFtLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc7CisKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzLCB0ZW1wKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qKiBzZWUgc3ViY2xhdXNlIDcuNC4zICovCitBVkNFbmNfU3RhdHVzIEVuY29kZVNsaWNlSGVhZGVyKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1BpY1BhcmFtU2V0ICpjdXJyUFBTID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBzbGljZV90eXBlLCB0ZW1wLCBpOworICAgIGludCBudW1fYml0czsKKworICAgIG51bV9iaXRzID0gKHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gc3RyZWFtLT5iaXRfbGVmdDsKKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+Zmlyc3RfbWJfaW5fc2xpY2UpOworCisgICAgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgaWYgKHZpZGVvLT5tYk51bSA9PSAwKSAvKiBmaXJzdCBtYiBpbiBmcmFtZSAqLworICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV90eXBlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlX3R5cGUpOworICAgIH0KKworICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgY3VyclNQUy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQsIHNsaWNlSGRyLT5mcmFtZV9udW0pOworCisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIC8qIGlmIGZyYW1lX21ic19vbmx5X2ZsYWcgaXMgMCwgZW5jb2RlIGZpZWxkX3BpY19mbGFnLCBib3R0b21fZmllbGRfZmxhZyBoZXJlICovCisKKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5pZHJfcGljX2lkKTsKKyAgICB9CisKKyAgICBpZiAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlID09IDApCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBjdXJyU1BTLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiKTsKKworICAgICAgICBpZiAoY3VyclBQUy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tKTsgLyogMzIgYml0cyAqLworICAgICAgICB9CisgICAgfQorICAgIGlmIChjdXJyU1BTLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMSAmJiAhY3VyclNQUy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcpCisgICAgeworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF0pOyAgICAvKiAzMiBiaXRzICovCisgICAgICAgIGlmIChjdXJyUFBTLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICYmICFzbGljZUhkci0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFsxXSk7IC8qIDMyIGJpdHMgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyUFBTLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcpCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnJlZHVuZGFudF9waWNfY250KTsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGlmIChzbGljZV90eXBlID09IEFWQ19QX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpOworICAgICAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICAvKiB3ZSBzaG91bGRuJ3QgZW50ZXIgdGhpcyBwYXJ0IGF0IGFsbCAqLworICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgIGlmIChzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyogcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoKSAqLworICAgIHN0YXR1cyA9IHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKHZpZGVvLCBzdHJlYW0sIHNsaWNlSGRyLCBzbGljZV90eXBlKTsKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoKGN1cnJQUFMtPndlaWdodGVkX3ByZWRfZmxhZyAmJiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSB8fCBzbGljZV90eXBlID09IEFWQ19TUF9TTElDRSkpIHx8CisgICAgICAgICAgICAoY3VyclBQUy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAxICYmIHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpKQorICAgIHsKKyAgICAgICAgLy8gICAgICBwcmVkX3dlaWdodF90YWJsZSgpOyAvLyBub3Qgc3VwcG9ydGVkICEhCisgICAgICAgIHJldHVybiBBVkNFTkNfUFJFRF9XRUlHSFRfVEFCX0ZBSUw7CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyAhPSAwKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gZGVjX3JlZl9waWNfbWFya2luZyh2aWRlbywgc3RyZWFtLCBzbGljZUhkcik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICYmIHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UpCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0NBQkFDX0ZBSUw7CisgICAgICAgIC8qICAgICAgdWVfdihzdHJlYW0sJihzbGljZUhkci0+Y2FiYWNfaW5pdF9pZGMpKTsKKyAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+Y2FiYWNfaW5pdF9pZGMgPiAyKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1cHBvcnRlZCAhISEhCisgICAgICAgICAgICAgICAgfSovCisgICAgfQorCisgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9xcF9kZWx0YSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFIHx8IHNsaWNlX3R5cGUgPT0gQVZDX1NJX1NMSUNFKQorICAgIHsKKyAgICAgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1NQX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoc3RyZWFtLCBzbGljZUhkci0+c3BfZm9yX3N3aXRjaF9mbGFnKTsKKyAgICAgICAgICAgIC8qIGlmIHNwX2Zvcl9zd2l0Y2hfZmxhZyBpcyAwLCBQIG1hY3JvYmxvY2tzIGluIFNQIHNsaWNlIGlzIGRlY29kZWQgdXNpbmcKKyAgICAgICAgICAgIFNQIGRlY29kaW5nIHByb2Nlc3MgZm9yIG5vbi1zd2l0Y2hpbmcgcGljdHVyZXMgaW4gOC42LjEgKi8KKyAgICAgICAgICAgIC8qIGVsc2UsIFAgbWFjcm9ibG9ja3MgaW4gU1Agc2xpY2UgaXMgZGVjb2RlZCB1c2luZyBTUCBhbmQgU0kgZGVjb2RpbmcKKyAgICAgICAgICAgIHByb2Nlc3MgZm9yIHN3aXRjaGluZyBwaWN0dXJlIGluIDguNi4yICovCisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9xc19kZWx0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpCisgICAgeworCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMpOworCisgICAgICAgIGlmIChzbGljZUhkci0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgIT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHNsaWNlSGRyLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2Mik7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3VyclBQUy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlID49IDMKKyAgICAgICAgICAgICYmIGN1cnJQUFMtPnNsaWNlX2dyb3VwX21hcF90eXBlIDw9IDUpCisgICAgeworICAgICAgICAvKiBDZWlsKExvZzIoUGljU2l6ZUluTWFwVW5pdHMvKGZsb2F0KVNsaWNlR3JvdXBDaGFuZ2VSYXRlICsgMSkpICovCisgICAgICAgIHRlbXAgPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLyB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGU7CisgICAgICAgIGlmICh2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgJSB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXArKzsKKyAgICAgICAgfQorICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKHRlbXAgPiAxKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID4+PSAxOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgaSwgc2xpY2VIZHItPnNsaWNlX2dyb3VwX2NoYW5nZV9jeWNsZSk7CisgICAgfQorCisKKyAgICBlbmN2aWQtPnJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHMgKz0gKHN0cmVhbS0+d3JpdGVfcG9zIDw8IDMpIC0gc3RyZWFtLT5iaXRfbGVmdCAtIG51bV9iaXRzOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMy4xICovCitBVkNFbmNfU3RhdHVzIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIsIGludCBzbGljZV90eXBlKQoreworICAgICh2b2lkKSh2aWRlbyk7CisgICAgaW50IGk7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKworICAgIGlmIChzbGljZV90eXBlICE9IEFWQ19JX1NMSUNFICYmIHNsaWNlX3R5cGUgIT0gQVZDX1NJX1NMSUNFKQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDApOworICAgICAgICBpZiAoc2xpY2VIZHItPnJlZl9waWNfbGlzdF9yZW9yZGVyaW5nX2ZsYWdfbDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5hYnNfZGlmZl9waWNfbnVtX21pbnVzMV9sMFtpXSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgY2hlY2sgc2hvdWxkIGJlIGluIEluaXRTbGljZSgpLCBpZiB3ZSBldmVyIHVzZSBpdCAqLworICAgICAgICAgICAgICAgICAgICAvKmlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSA9PSAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDBbaV0gPiB2aWRlby0+TWF4UGljTnVtLzIgLTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUkVGX1BJQ19SRU9SREVSX0ZBSUw7IC8vIG91dCBvZiByYW5nZQorICAgICAgICAgICAgICAgICAgICB9Ki8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPnJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjX2wwW2ldID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9waWNfbnVtX2wwW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMFtpXSAhPSAzCisgICAgICAgICAgICAgICAgICAgICYmIGkgPD0gKGludClzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDEpIDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxKTsKKyAgICAgICAgaWYgKHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wxKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+YWJzX2RpZmZfcGljX251bV9taW51czFfbDFbaV0pOworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGNoZWNrIHNob3VsZCBiZSBpbiBJbml0U2xpY2UoKSBpZiB3ZSBldmVyIHVzZSBpdAorICAgICAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wxW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0xKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmFic19kaWZmX3BpY19udW1fbWludXMxX2wxW2ldID4gdmlkZW8tPk1heFBpY051bS8yIC0yKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1JFRl9QSUNfUkVPUkRFUl9GQUlMOyAvLyBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfSovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5yZW9yZGVyaW5nX29mX3BpY19udW1zX2lkY19sMVtpXSA9PSAyKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5sb25nX3Rlcm1fcGljX251bV9sMVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+cmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGNfbDFbaV0gIT0gMworICAgICAgICAgICAgICAgICAgICAmJiBpIDw9IChpbnQpc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKyAxKSA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA3LjQuMy4zICovCitBVkNFbmNfU3RhdHVzIGRlY19yZWZfcGljX21hcmtpbmcoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkcikKK3sKKyAgICBpbnQgaTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIHNsaWNlSGRyLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnKTsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9yZWZlcmVuY2VfZmxhZyk7CisgICAgICAgIGlmIChzbGljZUhkci0+bG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnID09IDApIC8qIHVzZWQgZm9yIHNob3J0LXRlcm0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPk1heExvbmdUZXJtRnJhbWVJZHggPSAtMTsgLyogbm8gbG9uZy10ZXJtIGZyYW1lIGluZHggKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8qIHVzZWQgZm9yIGxvbmctdGVybSAqLworICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+TWF4TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgICAgICB2aWRlby0+TG9uZ1Rlcm1GcmFtZUlkeCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGUxQml0KHN0cmVhbSwgc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcpOyAvKiBkZWZhdWx0IHRvIHplcm8gKi8KKyAgICAgICAgaWYgKHNsaWNlSGRyLT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gMDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdWVfdihzdHJlYW0sIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSk7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gMykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+ZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldID09IDIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc2xpY2VIZHItPmxvbmdfdGVybV9waWNfbnVtW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSA9PSAzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gNikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bG9uZ190ZXJtX2ZyYW1lX2lkeFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzbGljZUhkci0+bWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb25baV0gPT0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBzbGljZUhkci0+bWF4X2xvbmdfdGVybV9mcmFtZV9pZHhfcGx1czFbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc2xpY2VIZHItPm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uW2ldICE9IDAgJiYgaSA8IE1BWF9ERUNfUkVGX1BJQ19NQVJLSU5HKTsKKyAgICAgICAgICAgIGlmIChpID49IE1BWF9ERUNfUkVGX1BJQ19NQVJLSU5HICYmIHNsaWNlSGRyLT5tZW1vcnlfbWFuYWdlbWVudF9jb250cm9sX29wZXJhdGlvbltpXSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfREVDX1JFRl9QSUNfTUFSS19GQUlMOyAvKiB3ZSdyZSBzY3Jld2VkISEsIG5vdCBlbm91Z2ggbWVtb3J5ICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgc3ViY2xhdXNlIDguMi4xIERlY29kaW5nIHByb2Nlc3MgZm9yIHBpY3R1cmUgb3JkZXIgY291bnQuCitTZWUgYWxzbyBQb3N0UE9DKCkgZm9yIGluaXRpYWxpemF0aW9uIG9mIHNvbWUgdmFyaWFibGVzLiAqLworQVZDRW5jX1N0YXR1cyBJbml0UE9DKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNGcmFtZUlPICAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKGN1cnJTUFMtPnBpY19vcmRlcl9jbnRfdHlwZSkKKyAgICB7CisgICAgICAgIGNhc2UgMDogLyogUE9DIE1PREUgMCAsIHN1YmNsYXVzZSA4LjIuMS4xICovCisgICAgICAgICAgICAvKiBlbmNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChjdXJySW5wdXQtPmRpc3Bfb3JkZXIgPCBlbmN2aWQtPmRpc3BPcmRQT0NSZWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmIC09IHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiA9IGN1cnJJbnB1dC0+ZGlzcF9vcmRlciAtIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZjsKKyAgICAgICAgICAgIHdoaWxlIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgPj0gdmlkZW8tPk1heFBpY09yZGVyQ250THNiKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAtPSB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZWNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIE1TQnMgb2YgY3VycmVudCBwaWN0dXJlICovCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRNc2IgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAgPCAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiAgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZpZGVvLT5wcmV2UGljT3JkZXJDbnRMc2IgLSBzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IpICA+PSAodmlkZW8tPk1heFBpY09yZGVyQ250THNiIC8gMikpCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiArIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiAgPiAgdmlkZW8tPnByZXZQaWNPcmRlckNudExzYiAgJiYKKyAgICAgICAgICAgICAgICAgICAgIChzbGljZUhkci0+cGljX29yZGVyX2NudF9sc2IgLSB2aWRlby0+cHJldlBpY09yZGVyQ250THNiKSAgPiAodmlkZW8tPk1heFBpY09yZGVyQ250THNiIC8gMikpCisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250TXNiID0gdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiAtIHZpZGVvLT5NYXhQaWNPcmRlckNudExzYjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnRNc2IgPSB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiOworCisgICAgICAgICAgICAvKiBKVlQtSTAxMCBwYWdlIDgxIGlzIGRpZmZlcmVudCBmcm9tIEpNNy4zICovCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyB8fCAhc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250TXNiICsgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250ID0gdmlkZW8tPlBpY09yZGVyQ250TXNiICsgc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSBBVkNfTUlOKHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250LCB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAmJiAhc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250X2JvdHRvbSA9IDA7IC8qIGRlZmF1bHRlZCB0byB6ZXJvICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8qIFBPQyBNT0RFIDEsIHN1YmNsYXVzZSA4LjIuMS4yICovCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgRnJhbWVOdW1PZmZzZXQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5kaXNwT3JkUE9DUmVmID0gY3VycklucHV0LT5kaXNwX29yZGVyOyAgLyogcmVzZXQgdGhlIHJlZmVyZW5jZSBwb2ludCAqLworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICh2aWRlby0+cHJldkZyYW1lTnVtID4gc2xpY2VIZHItPmZyYW1lX251bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0ICsgdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5GcmFtZU51bU9mZnNldCA9IHZpZGVvLT5wcmV2RnJhbWVOdW1PZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYWJzRnJhbWVOdW0gKi8KKyAgICAgICAgICAgIGlmIChjdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5hYnNGcmFtZU51bSA9IHZpZGVvLT5GcmFtZU51bU9mZnNldCArIHNsaWNlSGRyLT5mcmFtZV9udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSA+IDAgJiYgdmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmFic0ZyYW1lTnVtLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGRlcml2ZSBwaWNPcmRlckNudEN5Y2xlQ250IGFuZCBmcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnBpY09yZGVyQ250Q3ljbGVDbnQgPSAodmlkZW8tPmFic0ZyYW1lTnVtIC0gMSkgLyBjdXJyU1BTLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOworICAgICAgICAgICAgICAgIHZpZGVvLT5mcmFtZU51bUluUGljT3JkZXJDbnRDeWNsZSA9ICh2aWRlby0+YWJzRnJhbWVOdW0gLSAxKSAlIGN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUsIHRoaXMgdmFsdWUgY2FuIGJlIGNvbXB1dGVkIHVwIGZyb250LiAqLworICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KWN1cnJTUFMtPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWREZWx0YVBlclBpY09yZGVyQ250Q3ljbGUgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgZXhwZWN0ZWRQaWNPcmRlckNudCAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5hYnNGcmFtZU51bSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCA9IHZpZGVvLT5waWNPcmRlckNudEN5Y2xlQ250ICogdmlkZW8tPmV4cGVjdGVkRGVsdGFQZXJQaWNPcmRlckNudEN5Y2xlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gdmlkZW8tPmZyYW1lTnVtSW5QaWNPcmRlckNudEN5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArPSBjdXJyU1BTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmlkZW8tPm5hbF9yZWZfaWRjID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKz0gY3VyclNQUy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGRlcml2ZSBUb3BGaWVsZE9yZGVyQ250IGFuZCBCb3R0b21GaWVsZE9yZGVyQ250ICovCisgICAgICAgICAgICAvKiBlbmNvZGluZyBwYXJ0ICovCisgICAgICAgICAgICBpZiAoIWN1cnJTUFMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdID0gY3VycklucHV0LT5kaXNwX29yZGVyIC0gZW5jdmlkLT5kaXNwT3JkUE9DUmVmIC0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAodmlkZW8tPmN1cnJQaWNQYXJhbXMtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07IC8qIHNob3VsZCBiZSBjYWxjdWxhdGVkIGZyb20gY3VycklucHV0LT5ib3R0b21fZmllbGQtPmRpc3Bfb3JkZXIgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSA9IHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzFdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPmV4cGVjdGVkUGljT3JkZXJDbnQgKyBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXTsKKyAgICAgICAgICAgICAgICB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCA9IHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ICsgY3VyclNQUy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV07CisKKyAgICAgICAgICAgICAgICB2aWRlby0+UGljT3JkZXJDbnQgPSBBVkNfTUlOKHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250LCB2aWRlby0+Qm90dG9tRmllbGRPcmRlckNudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcgPT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+VG9wRmllbGRPcmRlckNudCA9IHZpZGVvLT5leHBlY3RlZFBpY09yZGVyQ250ICsgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMF07CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+ZXhwZWN0ZWRQaWNPcmRlckNudCArIGN1cnJTUFMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCArIHNsaWNlSGRyLT5kZWx0YV9waWNfb3JkZXJfY250WzBdOworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IHZpZGVvLT5Cb3R0b21GaWVsZE9yZGVyQ250OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBjYXNlIDI6IC8qIFBPQyBNT0RFIDIsIHN1YmNsYXVzZSA4LjIuMS4zICovCisgICAgICAgICAgICAvKiBkZWNvZGluZyBvcmRlciBtdXN0IGJlIHRoZSBzYW1lIGFzIGRpc3BsYXkgb3JkZXIgKi8KKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGNoZWNrIGZvciB0aGF0LiBUaGUgZGVjb2RlciB3aWxsIGp1c3Qgb3V0cHV0IGluIGRlY29kaW5nIG9yZGVyLiAqLworICAgICAgICAgICAgLyogQ2hlY2sgZm9yIDIgY29uc2VjdXRpdmUgbm9uLXJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfQ09OU0VDVVRJVkVfTk9OUkVGOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmN2aWQtPmRpc3BPcmRQT0NSZWYgPSAxOyAgLyogYWN0IGFzIGEgZmxhZyBmb3Igbm9uIHJlZiAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+ZGlzcE9yZFBPQ1JlZiA9IDA7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPnByZXZGcmFtZU51bSA+IHNsaWNlSGRyLT5mcmFtZV9udW0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkZyYW1lTnVtT2Zmc2V0ID0gdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCArIHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+RnJhbWVOdW1PZmZzZXQgPSB2aWRlby0+cHJldkZyYW1lTnVtT2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogZGVyaXZlIHRlbXBQaWNPcmRlckNudCwgd2UganVzdCB1c2UgUGljT3JkZXJDbnQgKi8KKyAgICAgICAgICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlBpY09yZGVyQ250ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5uYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNPcmRlckNudCA9IDIgKiAodmlkZW8tPkZyYW1lTnVtT2Zmc2V0ICsgc2xpY2VIZHItPmZyYW1lX251bSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBkZXJpdmUgVG9wRmllbGRPcmRlckNudCBhbmQgQm90dG9tRmllbGRPcmRlckNudCAqLworICAgICAgICAgICAgaWYgKHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5Ub3BGaWVsZE9yZGVyQ250ID0gdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzbGljZUhkci0+Ym90dG9tX2ZpZWxkX2ZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPkJvdHRvbUZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfUE9DX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiogc2VlIHN1YmNsYXVzZSA4LjIuMSAqLworQVZDRW5jX1N0YXR1cyBQb3N0UE9DKEFWQ0NvbW1vbk9iaiAqdmlkZW8pCit7CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1NlcVBhcmFtU2V0ICpjdXJyU1BTID0gdmlkZW8tPmN1cnJTZXFQYXJhbXM7CisKKyAgICB2aWRlby0+cHJldkZyYW1lTnVtID0gc2xpY2VIZHItPmZyYW1lX251bTsKKworICAgIHN3aXRjaCAoY3VyclNQUy0+cGljX29yZGVyX2NudF90eXBlKQorICAgIHsKKyAgICAgICAgY2FzZSAwOiAvKiBzdWJjbGF1c2UgOC4yLjEuMSAqLworICAgICAgICAgICAgaWYgKHZpZGVvLT5tZW1fbWdyX2N0cmxfZXFfNSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250TXNiID0gMDsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiID0gdmlkZW8tPlRvcEZpZWxkT3JkZXJDbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZQaWNPcmRlckNudE1zYiA9IHZpZGVvLT5QaWNPcmRlckNudE1zYjsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldlBpY09yZGVyQ250THNiID0gc2xpY2VIZHItPnBpY19vcmRlcl9jbnRfbHNiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTogIC8qIHN1YmNsYXVzZSA4LjIuMS4yIGFuZCA4LjIuMS4zICovCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWVtX21ncl9jdHJsX2VxXzUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bU9mZnNldCA9IHZpZGVvLT5GcmFtZU51bU9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNThiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW5pdC5jcHAKQEAgLTAsMCArMSw4OTkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorI2luY2x1ZGUgImF2Y2VuY19hcGkuaCIKKworI2RlZmluZSBMT0cyX01BWF9GUkFNRV9OVU1fTUlOVVM0ICAgMTIgICAvKiAxMiBkZWZhdWx0ICovCisjZGVmaW5lIFNMSUNFX0dST1VQX0NIQU5HRV9DWUNMRSAgICAxICAgIC8qIGRlZmF1bHQgKi8KKworLyogaW5pdGlhbGl6ZWQgdmFyaWFibGVzIHRvIGJlIHVzZWQgaW4gU1BTKi8KK0FWQ0VuY19TdGF0dXMgIFNldEVuY29kZVBhcmFtKEFWQ0hhbmRsZSogYXZjSGFuZGxlLCBBVkNFbmNQYXJhbXMqIGVuY1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZXh0U1BTLCB2b2lkKiBleHRQUFMpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1NlcVBhcmFtU2V0ICpzZXFQYXJhbSA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwaWNQYXJhbSA9IHZpZGVvLT5jdXJyUGljUGFyYW1zOworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworICAgIHZvaWQgKnVzZXJEYXRhID0gYXZjSGFuZGxlLT51c2VyRGF0YTsKKyAgICBpbnQgaWksIG1heEZyYW1lTnVtOworCisgICAgQVZDU2VxUGFyYW1TZXQqIGV4dFMgPSBOVUxMOworICAgIEFWQ1BpY1BhcmFtU2V0KiBleHRQID0gTlVMTDsKKworICAgIGlmIChleHRTUFMpIGV4dFMgPSAoQVZDU2VxUGFyYW1TZXQqKSBleHRTUFM7CisgICAgaWYgKGV4dFBQUykgZXh0UCA9IChBVkNQaWNQYXJhbVNldCopIGV4dFBQUzsKKworICAgIC8qIFRoaXMgcGFydCBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgZW5jb2Rpbmcgb3B0aW9ucyB0aGlzCisgICAgbGlicmFyeSBzdXBwb3J0cyBpbiBzZXFQYXJhbSwgcGljUGFyYW0gYW5kIHNsaWNlSGRyIHN0cnVjdHVyZXMgYW5kCisgICAgYWxzbyBjb3B5IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZW5jUGFyYW0gaW50byB0aGUgYWJvdmUgMyBzdHJ1Y3R1cmVzLgorCisgICAgU29tZSBwYXJhbWV0ZXJzIHdpbGwgYmUgYXNzaWduZWQgbGF0ZXIgd2hlbiB3ZSBlbmNvZGUgU1BTIG9yIFBQUyBzdWNoIGFzCisgICAgdGhlIHNlcV9wYXJhbWV0ZXJfaWQgb3IgcGljX3BhcmFtZXRlcl9pZC4gQWxzbyBzb21lIG9mIHRoZSBzbGljZSBwYXJhbWV0ZXJzCisgICAgaGF2ZSB0byBiZSByZS1hc3NpZ25lZCBwZXIgc2xpY2UgYmFzaXMgc3VjaCBhcyBmcmFtZV9udW0sIHNsaWNlX3R5cGUsCisgICAgZmlyc3RfbWJfaW5fc2xpY2UsIHBpY19vcmRlcl9jbnRfbHNiLCBzbGljZV9xcF9kZWx0YSwgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlICovCisKKyAgICAvKiBwcm9maWxlX2lkYywgY29uc3RyYWluZWRfc2V0eF9mbGFnIGFuZCBsZXZlbF9pZGMgaXMgc2V0IGJ5IFZlcmlmeVByb2ZpbGUoKSwKKyAgICBhbmQgVmVyaWZ5TGV2ZWwoKSBmdW5jdGlvbnMgbGF0ZXIuICovCisKKyAgICBlbmN2aWQtPmZ1bGxzZWFyY2hfZW5hYmxlID0gZW5jUGFyYW0tPmZ1bGxzZWFyY2g7CisKKyAgICBlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID0gKChlbmNQYXJhbS0+b3V0X29mX2JhbmRfcGFyYW1fc2V0ID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0UpOworCisgICAgLyogcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gdGhlIHRoZSBlbmNQYXJhbSB0aGF0IGFyZSB1c2VkIGluIFNQUyAqLworICAgIGlmIChleHRTKQorICAgIHsKKyAgICAgICAgdmlkZW8tPk1heFBpY09yZGVyQ250THNiID0gIDEgPDwgKGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQpOworICAgICAgICB2aWRlby0+UGljV2lkdGhJbk1icyA9IGV4dFMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMTsKKyAgICAgICAgdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgPSBleHRTLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxIDsKKyAgICAgICAgdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnMgPSAoMiAtIGV4dFMtPmZyYW1lX21ic19vbmx5X2ZsYWcpICogdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+TWF4UGljT3JkZXJDbnRMc2IgPSAgMSA8PCAoZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNCArIDQpOworICAgICAgICB2aWRlby0+UGljV2lkdGhJbk1icyA9IChlbmNQYXJhbS0+d2lkdGggKyAxNSkgPj4gNDsgLyogcm91bmQgaXQgdG8gbXVsdGlwbGUgb2YgMTYgKi8KKyAgICAgICAgdmlkZW8tPkZyYW1lSGVpZ2h0SW5NYnMgPSAoZW5jUGFyYW0tPmhlaWdodCArIDE1KSA+PiA0OyAvKiByb3VuZCBpdCB0byBtdWx0aXBsZSBvZiAxNiAqLworICAgICAgICB2aWRlby0+UGljSGVpZ2h0SW5NYXBVbml0cyA9IHZpZGVvLT5GcmFtZUhlaWdodEluTWJzOworICAgIH0KKworICAgIHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIDE2IDsKKyAgICBpZiAodmlkZW8tPlBpY1dpZHRoSW5TYW1wbGVzTCArIDMyID4gMHhGRkZGKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOyAvLyB3ZSB1c2UgMi1ieXRlcyBmb3IgcGl0Y2gKKyAgICB9CisKKyAgICB2aWRlby0+UGljV2lkdGhJblNhbXBsZXNDID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiA4IDsKKyAgICB2aWRlby0+UGljSGVpZ2h0SW5NYnMgPSB2aWRlby0+RnJhbWVIZWlnaHRJbk1iczsKKyAgICB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgPSB2aWRlby0+UGljV2lkdGhJbk1icyAqIHZpZGVvLT5QaWNIZWlnaHRJbk1hcFVuaXRzIDsKKyAgICB2aWRlby0+UGljSGVpZ2h0SW5TYW1wbGVzTCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1icyAqIDE2OworICAgIHZpZGVvLT5QaWNIZWlnaHRJblNhbXBsZXNDID0gdmlkZW8tPlBpY0hlaWdodEluTWJzICogODsKKyAgICB2aWRlby0+UGljU2l6ZUluTWJzID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgKiB2aWRlby0+UGljSGVpZ2h0SW5NYnM7CisKKyAgICBpZiAoIWV4dFMgJiYgIWV4dFApCisgICAgeworICAgICAgICBtYXhGcmFtZU51bSA9IChlbmNQYXJhbS0+aWRyX3BlcmlvZCA9PSAtMSkgPyAoMSA8PCAxNikgOiBlbmNQYXJhbS0+aWRyX3BlcmlvZDsKKyAgICAgICAgaWkgPSAwOworICAgICAgICB3aGlsZSAobWF4RnJhbWVOdW0gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpaSsrOworICAgICAgICAgICAgbWF4RnJhbWVOdW0gPj49IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlpIDwgNCkgaWkgPSA0OworICAgICAgICBlbHNlIGlmIChpaSA+IDE2KSBpaSA9IDE2OworCisgICAgICAgIHNlcVBhcmFtLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gaWkgLSA0Oy8vTE9HMl9NQVhfRlJBTUVfTlVNX01JTlVTNDsgLyogZGVmYXVsdCAqLworCisgICAgICAgIHZpZGVvLT5NYXhGcmFtZU51bSA9IDEgPDwgaWk7IC8vKExPRzJfTUFYX0ZSQU1FX05VTV9NSU5VUzQgKyA0KTsgLyogZGVmYXVsdCAqLworICAgICAgICB2aWRlby0+TWF4UGljTnVtID0gdmlkZW8tPk1heEZyYW1lTnVtOworCisgICAgICAgIC8qKioqKioqKioqKioqIHNldCB0aGUgU1BTICoqKioqKioqKioqKioqKioqKiovCisgICAgICAgIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IDA7IC8qIHN0YXJ0IHdpdGggemVybyAqLworICAgICAgICAvKiBQT0MgKi8KKyAgICAgICAgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9IGVuY1BhcmFtLT5wb2NfdHlwZTsgLyogUE9DIHR5cGUgKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5wb2NfdHlwZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoLyplbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180PDAgfHwgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpKi8KKyAgICAgICAgICAgICAgICBlbmNQYXJhbS0+bG9nMl9tYXhfcG9jX2xzYl9taW51c180ID4gMTIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX1BPQ19MU0I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gZW5jUGFyYW0tPmxvZzJfbWF4X3BvY19sc2JfbWludXNfNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChlbmNQYXJhbS0+cG9jX3R5cGUgPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnID0gZW5jUGFyYW0tPmRlbHRhX3BvY196ZXJvX2ZsYWc7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYyA9IGVuY1BhcmFtLT5vZmZzZXRfcG9jX25vbl9yZWY7CisgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkID0gZW5jUGFyYW0tPm9mZnNldF90b3BfYm90dG9tOworICAgICAgICAgICAgc2VxUGFyYW0tPm51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSBlbmNQYXJhbS0+bnVtX3JlZl9pbl9jeWNsZTsKKyAgICAgICAgICAgIGlmIChlbmNQYXJhbS0+b2Zmc2V0X3BvY19yZWYgPT0gTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0VOQ1BBUkFNX01FTV9GQUlMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgZW5jUGFyYW0tPm51bV9yZWZfZnJhbWU7IGlpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2lpXSA9IGVuY1BhcmFtLT5vZmZzZXRfcG9jX3JlZltpaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZSAqLworICAgICAgICBpZiAoZW5jUGFyYW0tPm51bV9yZWZfZnJhbWUgPiAxNiB8fCBlbmNQYXJhbS0+bnVtX3JlZl9mcmFtZSA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fUkVGOworICAgICAgICB9CisgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lcyA9IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lOyAvKiBudW0gcmVmZXJlbmNlIGZyYW1lIHJhbmdlIDAuLi4xNiovCisgICAgICAgIHNlcVBhcmFtLT5nYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPnBpY193aWR0aF9pbl9tYnNfbWludXMxID0gdmlkZW8tPlBpY1dpZHRoSW5NYnMgLSAxOworICAgICAgICBzZXFQYXJhbS0+cGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gdmlkZW8tPlBpY0hlaWdodEluTWFwVW5pdHMgLSAxOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IFRSVUU7CisgICAgICAgIHNlcVBhcmFtLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIH0KKyAgICBlbHNlIGlmIChleHRTKSAvLyB1c2UgZXh0ZXJuYWwgU1BTIGFuZCBQUFMKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IGV4dFMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkOworICAgICAgICBzZXFQYXJhbS0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IGV4dFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQ7CisgICAgICAgIHZpZGVvLT5NYXhGcmFtZU51bSA9IDEgPDwgKGV4dFMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0KTsKKyAgICAgICAgdmlkZW8tPk1heFBpY051bSA9IHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgaWYgKGVuY1BhcmFtLT5pZHJfcGVyaW9kID4gKGludCkodmlkZW8tPk1heEZyYW1lTnVtKSB8fCAoZW5jUGFyYW0tPmlkcl9wZXJpb2QgPT0gLTEpKQorICAgICAgICB7CisgICAgICAgICAgICBlbmNQYXJhbS0+aWRyX3BlcmlvZCA9IChpbnQpdmlkZW8tPk1heEZyYW1lTnVtOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPnBpY19vcmRlcl9jbnRfdHlwZSA9IGV4dFMtPnBpY19vcmRlcl9jbnRfdHlwZTsKKyAgICAgICAgaWYgKHNlcVBhcmFtLT5waWNfb3JkZXJfY250X3R5cGUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC8qZXh0Uy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0PDAgfHwgKG5vIG5lZWQgaXQncyB1bnNpZ25lZCkqLworICAgICAgICAgICAgICAgIGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA+IDEyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9QT0NfTFNCOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VxUGFyYW0tPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9IGV4dFMtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzZXFQYXJhbS0+cGljX29yZGVyX2NudF90eXBlID09IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IGV4dFMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgPSBleHRTLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljOworICAgICAgICAgICAgc2VxUGFyYW0tPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCA9IGV4dFMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlID0gZXh0Uy0+bnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZTsKKyAgICAgICAgICAgIGlmIChleHRTLT5vZmZzZXRfZm9yX3JlZl9mcmFtZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KSBleHRTLT5udW1fcmVmX2ZyYW1lczsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaWldID0gZXh0Uy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaWldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWUgKi8KKyAgICAgICAgaWYgKGV4dFMtPm51bV9yZWZfZnJhbWVzID4gMTYgLyp8fCBleHRTLT5udW1fcmVmX2ZyYW1lczwwIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSovKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfTlVNX1JFRjsKKyAgICAgICAgfQorICAgICAgICBzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgPSBleHRTLT5udW1fcmVmX2ZyYW1lczsgLyogbnVtIHJlZmVyZW5jZSBmcmFtZSByYW5nZSAwLi4uMTYqLworICAgICAgICBzZXFQYXJhbS0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0gZXh0Uy0+Z2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnOworICAgICAgICBzZXFQYXJhbS0+cGljX3dpZHRoX2luX21ic19taW51czEgPSBleHRTLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMTsKKyAgICAgICAgc2VxUGFyYW0tPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSA9IGV4dFMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMTsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX21ic19vbmx5X2ZsYWcgPSBleHRTLT5mcmFtZV9tYnNfb25seV9mbGFnOworICAgICAgICBpZiAoZXh0Uy0+ZnJhbWVfbWJzX29ubHlfZmxhZyAhPSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICAgICAgc2VxUGFyYW0tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgPSBleHRTLT5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnOworICAgICAgICBpZiAoZXh0Uy0+bWJfYWRhcHRpdmVfZnJhbWVfZmllbGRfZmxhZyAhPSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSBleHRTLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOworICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IGV4dFMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgOworICAgICAgICBpZiAoZXh0Uy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyAhPSBGQUxTRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ID0gMDsKKyAgICAgICAgc2VxUGFyYW0tPmZyYW1lX2Nyb3BfdG9wX29mZnNldCA9IDA7CisgICAgICAgIHNlcVBhcmFtLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBleHRTLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgICAgIGlmIChleHRTLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbWNweSgmKHNlcVBhcmFtLT52dWlfcGFyYW1ldGVycyksICYoZXh0Uy0+dnVpX3BhcmFtZXRlcnMpLCBzaXplb2YoQVZDVlVJUGFyYW1zKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKiBub3cgUFBTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoIWV4dFAgJiYgIWV4dFMpCisgICAgeworICAgICAgICBwaWNQYXJhbS0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAodWludCkoLTEpOyAvKiBzdGFydCB3aXRoIHplcm8gKi8KKyAgICAgICAgcGljUGFyYW0tPnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gKHVpbnQpKC0xKTsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgICAgIHBpY1BhcmFtLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPSAwOyAvKiBkZWZhdWx0IHRvIENBVkxDICovCisgICAgICAgIHBpY1BhcmFtLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnID0gMDsgLyogZGVmYXVsdCBmb3Igbm93LCB3aWxsIG5lZWQgaXQgZm9yIEItc2xpY2UgKi8KKyAgICAgICAgLyogRk1PICovCisgICAgICAgIGlmIChlbmNQYXJhbS0+bnVtX3NsaWNlX2dyb3VwIDwgMSB8fCBlbmNQYXJhbS0+bnVtX3NsaWNlX2dyb3VwID4gTUFYX05VTV9TTElDRV9HUk9VUCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX05VTV9TTElDRUdST1VQOworICAgICAgICB9CisgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA9IGVuY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXAgLSAxOworCisgICAgICAgIGlmIChwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSBlbmNQYXJhbS0+Zm1vX3R5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGVuY1BhcmFtLT5mbW9fdHlwZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8PSAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnJ1bl9sZW5ndGhfbWludXMxW2lpXSA9IGVuY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnRvcF9sZWZ0W2lpXSA9IGVuY1BhcmFtLT50b3BfbGVmdFtpaV07CisgICAgICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+Ym90dG9tX3JpZ2h0W2lpXSA9IGVuY1BhcmFtLT5ib3R0b21fcmlnaHRbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW0tPmNoYW5nZV9kaXJfZmxhZyA9PSBBVkNfT04pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfZGlyZWN0aW9uX2ZsYWcgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9IEZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgvKmVuY1BhcmFtLT5jaGFuZ2VfcmF0ZV9taW51czEgPCAwIHx8IChubyBuZWVkIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbS0+Y2hhbmdlX3JhdGVfbWludXMxID4gdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0NIQU5HRV9SQVRFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgPSBlbmNQYXJhbS0+Y2hhbmdlX3JhdGVfbWludXMxOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUgPSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkICovCisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9ICh1aW50KilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQpICogdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzLCBERUZBVUxUX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZW5jUGFyYW0tPnNsaWNlX2dyb3VwID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRU5DUEFSQU1fTUVNX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgKGludCl2aWRlby0+UGljU2l6ZUluTWFwVW5pdHM7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZFtpaV0gPSBlbmNQYXJhbS0+c2xpY2VfZ3JvdXBbaWldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9GTU9fVFlQRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IGVuY1BhcmFtLT5udW1fcmVmX2ZyYW1lIC0gMTsgLyogYXNzdW1lIGZyYW1lIG9ubHkgKi8KKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPSAwOyAvKiBkZWZhdWx0IHZhbHVlICovCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAwOyAvKiBubyB3ZWlnaHRlZCBwcmVkaWN0aW9uIHN1cHBvcnRlZCAqLworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IDA7IC8qIHJhbmdlIDAsMSwyICovCisgICAgICAgIGlmICgvKnBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19XRUlHSFRFRF9CSVBSRURfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA9IDA7IC8qIGRlZmF1bHQsIHdpbGwgYmUgY2hhbmdlZCBhdCBzbGljZSBsZXZlbCBhbnl3YXkgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA9IDA7CisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKworICAgICAgICBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA9IDA7IC8qIGRlZmF1bHQgdG8gemVybyBmb3Igbm93ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA8IC0xMiB8fCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA+IDEyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0NIUk9NQV9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBkZWJsb2NraW5nICovCisgICAgICAgIHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IChlbmNQYXJhbS0+ZGJfZmlsdGVyID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0UgOworICAgICAgICAvKiBjb25zdHJhaW5lZCBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgICAgIHBpY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSAoZW5jUGFyYW0tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICAgICAgcGljUGFyYW0tPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyA9IDA7IC8qIGRlZmF1bHQgKi8KKyAgICB9CisgICAgZWxzZSBpZiAoZXh0UCkvLyBleHRlcm5hbCBQUFMKKyAgICB7CisgICAgICAgIHBpY1BhcmFtLT5waWNfcGFyYW1ldGVyX3NldF9pZCA9IGV4dFAtPnBpY19wYXJhbWV0ZXJfc2V0X2lkIC0gMTsgLyogdG8gYmUgaW5jcmVhc2VkIGJ5IG9uZSAqLworICAgICAgICBwaWNQYXJhbS0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBleHRQLT5zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9IGV4dFAtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZzsKKyAgICAgICAgaWYgKGV4dFAtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAhPSAwKSAvKiBkZWZhdWx0IHRvIENBVkxDICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyA9IGV4dFAtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWc7IC8qIGRlZmF1bHQgZm9yIG5vdywgd2lsbCBuZWVkIGl0IGZvciBCLXNsaWNlICovCisgICAgICAgIGlmIChleHRQLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICAvKiBGTU8gKi8KKyAgICAgICAgaWYgKC8qKGV4dFAtPm51bV9zbGljZV9ncm91cHNfbWludXMxPDApIHx8IChubyBuZWVkIGl0J3MgdW5zaWduZWQpICovCisgICAgICAgICAgICAoZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiBNQVhfTlVNX1NMSUNFX0dST1VQIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9OVU1fU0xJQ0VHUk9VUDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPSBleHRQLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsKKworICAgICAgICBpZiAocGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlID0gZXh0UC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGU7CisgICAgICAgICAgICBzd2l0Y2ggKGV4dFAtPnNsaWNlX2dyb3VwX21hcF90eXBlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpaSA9IDA7IGlpIDw9IChpbnQpZXh0UC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGlpKyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV0gPSBleHRQLT5ydW5fbGVuZ3RoX21pbnVzMVtpaV07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnRvcF9sZWZ0W2lpXSA9IGV4dFAtPnRvcF9sZWZ0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5ib3R0b21fcmlnaHRbaWldID0gZXh0UC0+Ym90dG9tX3JpZ2h0W2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyA9IGV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKC8qZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dFAtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSA+IHZpZGVvLT5QaWNTaXplSW5NYXBVbml0cyAtIDEpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9DSEFOR0VfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxID0gZXh0UC0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxOworICAgICAgICAgICAgICAgICAgICB2aWRlby0+U2xpY2VHcm91cENoYW5nZVJhdGUgPSBwaWNQYXJhbS0+c2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgICAgICBpZiAoZXh0UC0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSAhPSB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMgLSAxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX05PVF9TVVBQT1JURUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSA9IGV4dFAtPnBpY19zaXplX2luX21hcF91bml0c19taW51czE7CisKKyAgICAgICAgICAgICAgICAgICAgLyogYWxsb2NhdGUgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkICovCisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5zbGljZV9ncm91cF9pZCA9ICh1aW50KilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyh1c2VyRGF0YSwgc2l6ZW9mKHVpbnQpICogdmlkZW8tPlBpY1NpemVJbk1hcFVuaXRzLCBERUZBVUxUX0FUVFIpOworICAgICAgICAgICAgICAgICAgICBpZiAocGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoZXh0UC0+c2xpY2VfZ3JvdXBfaWQgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19FTkNQQVJBTV9NRU1fRkFJTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGlpID0gMDsgaWkgPCAoaW50KXZpZGVvLT5QaWNTaXplSW5NYXBVbml0czsgaWkrKykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPnNsaWNlX2dyb3VwX2lkW2lpXSA9IGV4dFAtPnNsaWNlX2dyb3VwX2lkW2lpXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOVkFMSURfRk1PX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGljUGFyYW0tPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSBleHRQLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgICAgICBwaWNQYXJhbS0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IGV4dFAtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7IC8qIGRlZmF1bHQgdmFsdWUgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleHRQLT53ZWlnaHRlZF9wcmVkX2ZsYWcpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorCisgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9wcmVkX2ZsYWcgPSAwOyAvKiBubyB3ZWlnaHRlZCBwcmVkaWN0aW9uIHN1cHBvcnRlZCAqLworICAgICAgICBwaWNQYXJhbS0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9IGV4dFAtPndlaWdodGVkX2JpcHJlZF9pZGM7IC8qIHJhbmdlIDAsMSwyICovCisgICAgICAgIGlmICgvKnBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjIDwgMCB8fCAobm8gbmVlZCwgaXQncyB1bnNpZ25lZCkgKi8KKyAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID4gMikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19XRUlHSFRFRF9CSVBSRURfRkFJTDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXBfbWludXMyNiA9IGV4dFAtPnBpY19pbml0X3FwX21pbnVzMjY7IC8qIGRlZmF1bHQsIHdpbGwgYmUgY2hhbmdlZCBhdCBzbGljZSBsZXZlbCBhbnl3YXkgKi8KKyAgICAgICAgaWYgKHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2IDwgLTI2IHx8IHBpY1BhcmFtLT5waWNfaW5pdF9xcF9taW51czI2ID4gMjUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5JVF9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA9IGV4dFAtPnBpY19pbml0X3FzX21pbnVzMjY7CisgICAgICAgIGlmIChwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA8IC0yNiB8fCBwaWNQYXJhbS0+cGljX2luaXRfcXNfbWludXMyNiA+IDI1KQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0lOSVRfUVNfRkFJTDsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKworICAgICAgICBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA9IGV4dFAtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQ7IC8qIGRlZmF1bHQgdG8gemVybyBmb3Igbm93ICovCisgICAgICAgIGlmIChwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA8IC0xMiB8fCBwaWNQYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCA+IDEyKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0NIUk9NQV9RUF9GQUlMOyAvKiBvdXQgb2YgcmFuZ2UgKi8KKyAgICAgICAgfQorICAgICAgICAvKiBkZWJsb2NraW5nICovCisgICAgICAgIHBpY1BhcmFtLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGV4dFAtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOworICAgICAgICAvKiBjb25zdHJhaW5lZCBpbnRyYSBwcmVkaWN0aW9uICovCisgICAgICAgIHBpY1BhcmFtLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSBleHRQLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWc7CisgICAgICAgIGlmIChleHRQLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgICE9IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgICAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID0gZXh0UC0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOyAvKiBkZWZhdWx0ICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqIG5vdyBzZXQgdXAgc29tZSBTbGljZUhlYWRlciBwYXJhbWV0ZXJzICoqKioqKioqKioqLworICAgIGlmIChwaWNQYXJhbS0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIC8qIHRoZXNlIHZhbHVlcyBvbmx5IHByZXNlbnQgd2hlbiBkYl9maWx0ZXIgaXMgT04gKi8KKyAgICAgICAgaWYgKGVuY1BhcmFtLT5kaXNhYmxlX2RiX2lkYyA+IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9ERUJMT0NLX0lEQzsgLyogb3V0IG9mIHJhbmdlICovCisgICAgICAgIH0KKyAgICAgICAgc2xpY2VIZHItPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjID0gZW5jUGFyYW0tPmRpc2FibGVfZGJfaWRjOworCisgICAgICAgIGlmIChlbmNQYXJhbS0+YWxwaGFfb2Zmc2V0IDwgLTYgfHwgZW5jUGFyYW0tPmFscGhhX29mZnNldCA+IDYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfSU5WQUxJRF9BTFBIQV9PRkZTRVQ7CisgICAgICAgIH0KKyAgICAgICAgc2xpY2VIZHItPnNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyID0gZW5jUGFyYW0tPmFscGhhX29mZnNldDsKKworICAgICAgICBpZiAoZW5jUGFyYW0tPmJldGFfb2Zmc2V0IDwgLTYgfHwgZW5jUGFyYW0tPmJldGFfb2Zmc2V0ID4gNikKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0JFVEFfT0ZGU0VUOworICAgICAgICB9CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV9iZXRhX29mZnNldF9kaXZfMiA9ICBlbmNQYXJhbS0+YmV0YV9vZmZzZXQ7CisgICAgfQorICAgIGlmIChlbmN2aWQtPm91dE9mQmFuZFBhcmFtU2V0ID09IFRSVUUpCisgICAgeworICAgICAgICBzbGljZUhkci0+aWRyX3BpY19pZCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5pZHJfcGljX2lkID0gKHVpbnQpKC0xKTsgLyogc3RhcnQgd2l0aCB6ZXJvICovCisgICAgfQorICAgIHNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyA9IEZBTFNFOworICAgIHNsaWNlSGRyLT5ib3R0b21fZmllbGRfZmxhZyA9IEZBTFNFOyAgLyogd29uJ3QgYmUgdXNlZCBhbnl3YXkgKi8KKyAgICB2aWRlby0+TWJhZmZGcmFtZUZsYWcgPSAoc2VxUGFyYW0tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgJiYgIXNsaWNlSGRyLT5maWVsZF9waWNfZmxhZyk7CisKKyAgICAvKiB0aGUgcmVzdCB3aWxsIGJlIHNldCBpbiBJbml0U2xpY2UoKSAqLworCisgICAgLyogbm93IHRoZSByYXRlIGNvbnRyb2wgYW5kIHBlcmZvcm1hbmNlIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgIHJhdGVDdHJsLT5zY2RFbmFibGUgPSAoZW5jUGFyYW0tPmF1dG9fc2NkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisgICAgcmF0ZUN0cmwtPmlkclBlcmlvZCA9IGVuY1BhcmFtLT5pZHJfcGVyaW9kICsgMTsKKyAgICByYXRlQ3RybC0+aW50cmFNQlJhdGUgPSBlbmNQYXJhbS0+aW50cmFtYl9yZWZyZXNoOworICAgIHJhdGVDdHJsLT5kcEVuYWJsZSA9IChlbmNQYXJhbS0+ZGF0YV9wYXIgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKworICAgIHJhdGVDdHJsLT5zdWJQZWxFbmFibGUgPSAoZW5jUGFyYW0tPnN1Yl9wZWwgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+bXZSYW5nZSA9IGVuY1BhcmFtLT5zZWFyY2hfcmFuZ2U7CisKKyAgICByYXRlQ3RybC0+c3ViTUJFbmFibGUgPSAoZW5jUGFyYW0tPnN1Ym1iX3ByZWQgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+cmRPcHRFbmFibGUgPSAoZW5jUGFyYW0tPnJkb3B0X21vZGUgPT0gQVZDX09OKSA/IFRSVUUgOiBGQUxTRTsKKyAgICByYXRlQ3RybC0+YmlkaXJQcmVkID0gKGVuY1BhcmFtLT5iaWRpcl9wcmVkID09IEFWQ19PTikgPyBUUlVFIDogRkFMU0U7CisKKyAgICByYXRlQ3RybC0+cmNFbmFibGUgPSAoZW5jUGFyYW0tPnJhdGVfY29udHJvbCA9PSBBVkNfT04pID8gVFJVRSA6IEZBTFNFOworICAgIHJhdGVDdHJsLT5pbml0UVAgPSBlbmNQYXJhbS0+aW5pdFFQOworICAgIHJhdGVDdHJsLT5pbml0UVAgPSBBVkNfQ0xJUDMoMCwgNTEsIHJhdGVDdHJsLT5pbml0UVApOworCisgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPSBlbmNQYXJhbS0+Yml0cmF0ZTsKKyAgICByYXRlQ3RybC0+Y3BiU2l6ZSA9IGVuY1BhcmFtLT5DUEJfc2l6ZTsKKyAgICByYXRlQ3RybC0+aW5pdERlbGF5T2Zmc2V0ID0gKHJhdGVDdHJsLT5iaXRSYXRlICogZW5jUGFyYW0tPmluaXRfQ0JQX3JlbW92YWxfZGVsYXkgLyAxMDAwKTsKKworICAgIGlmIChlbmNQYXJhbS0+ZnJhbWVfcmF0ZSA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19JTlZBTElEX0ZSQU1FUkFURTsKKyAgICB9CisKKyAgICByYXRlQ3RybC0+ZnJhbWVfcmF0ZSA9IChPc2NsRmxvYXQpKGVuY1BhcmFtLT5mcmFtZV9yYXRlICogMS4wIC8gMTAwMCk7CisvLyAgcmF0ZUN0cmwtPnNyY0ludGVydmFsID0gZW5jUGFyYW0tPnNyY19pbnRlcnZhbDsKKyAgICByYXRlQ3RybC0+Zmlyc3RfZnJhbWUgPSAxOyAvKiBzZXQgdGhpcyBmbGFnIGZvciB0aGUgZmlyc3QgdGltZSAqLworCisgICAgLyogY29udHJhaW5lZF9zZXR4X2ZsYWcgd2lsbCBiZSBzZXQgaW5zaWRlIHRoZSBWZXJpZnlQcm9maWxlIGNhbGxlZCBiZWxvdy4qLworICAgIGlmICghZXh0UyAmJiAhZXh0UCkKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IGVuY1BhcmFtLT5wcm9maWxlOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcgPSBGQUxTRTsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyA9IEZBTFNFOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnID0gRkFMU0U7CisgICAgICAgIHNlcVBhcmFtLT5sZXZlbF9pZGMgPSBlbmNQYXJhbS0+bGV2ZWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9IGV4dFMtPnByb2ZpbGVfaWRjOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0MF9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MV9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0MV9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0Ml9mbGFnOworICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0M19mbGFnID0gZXh0Uy0+Y29uc3RyYWluZWRfc2V0M19mbGFnOworICAgICAgICBzZXFQYXJhbS0+bGV2ZWxfaWRjID0gZXh0Uy0+bGV2ZWxfaWRjOworICAgIH0KKworCisgICAgc3RhdHVzID0gVmVyaWZ5UHJvZmlsZShlbmN2aWQsIHNlcVBhcmFtLCBwaWNQYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gVmVyaWZ5TGV2ZWwoZW5jdmlkLCBzZXFQYXJhbSwgcGljUGFyYW0pOworICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyogdmVyaWZ5IHRoZSBwcm9maWxlIHNldHRpbmcgKi8KK0FWQ0VuY19TdGF0dXMgVmVyaWZ5UHJvZmlsZShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pCit7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworCisgICAgaWYgKHNlcVBhcmFtLT5wcm9maWxlX2lkYyA9PSAwKSAvKiBmaW5kIHByb2ZpbGUgZm9yIHRoaXMgc2V0dGluZyAqLworICAgIHsKKyAgICAgICAgLyogZmluZCB0aGUgcmlnaHQgcHJvZmlsZSBmb3IgaXQgKi8KKyAgICAgICAgaWYgKHNlcVBhcmFtLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnID09IFRSVUUgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxIDw9IDcgLyomJgorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPj0wIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSAqLykKKyAgICAgICAgeworICAgICAgICAgICAgc2VxUGFyYW0tPnByb2ZpbGVfaWRjID0gQVZDX0VYVEVOREVEOworICAgICAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDJfZmxhZyA9IFRSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmF0ZUN0cmwtPmRwRW5hYmxlID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxID09IDAgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBBVkNfTUFJTjsKKyAgICAgICAgICAgIHNlcVBhcmFtLT5jb25zdHJhaW5lZF9zZXQxX2ZsYWcgPSBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJhdGVDdHJsLT5iaWRpclByZWQgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+ZHBFbmFibGUgPT0gRkFMU0UgJiYKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9PSBUUlVFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9PSBGQUxTRSAmJgorICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDAgJiYKKyAgICAgICAgICAgICAgICBwaWNQYXJhbS0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnID09IEZBTFNFICYmCisgICAgICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxIDw9IDcgLyomJgorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPj0wIChubyBuZWVkLCBpdCdzIHVuc2lnbmVkKSovKQorICAgICAgICB7CisgICAgICAgICAgICBzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPSBBVkNfQkFTRUxJTkU7CisgICAgICAgICAgICBzZXFQYXJhbS0+Y29uc3RyYWluZWRfc2V0MF9mbGFnID0gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZXFQYXJhbS0+cHJvZmlsZV9pZGMgPT0gMCkgLyogc3RpbGwgemVybyAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX1BST0ZJTEVfTk9UX1NVUFBPUlRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9maWxlIGJ5IHRoaXMgbGlicmFyeSAqLworICAgIHN3aXRjaCAoc2VxUGFyYW0tPnByb2ZpbGVfaWRjKQorICAgIHsKKyAgICAgICAgY2FzZSBBVkNfQkFTRUxJTkU6CisgICAgICAgICAgICBpZiAocmF0ZUN0cmwtPmJpZGlyUHJlZCA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5kcEVuYWJsZSA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHNlcVBhcmFtLT5mcmFtZV9tYnNfb25seV9mbGFnICE9IFRSVUUgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPndlaWdodGVkX3ByZWRfZmxhZyA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT53ZWlnaHRlZF9iaXByZWRfaWRjICE9IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgcGljUGFyYW0tPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyA9PSBUUlVFIHx8CisgICAgICAgICAgICAgICAgICAgIHBpY1BhcmFtLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDcgLyp8fAorICAgICAgICAgICAgcGljUGFyYW0tPm51bV9zbGljZV9ncm91cHNfbWludXMxPDAgKG5vIG5lZWQsIGl0J3MgdW5zaWduZWQpICovKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19UT09MU19OT1RfU1VQUE9SVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVkNfTUFJTjoKKyAgICAgICAgY2FzZSBBVkNfRVhURU5ERUQ6CisgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfUFJPRklMRV9OT1RfU1VQUE9SVEVEOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHZlcmlmeSB0aGUgbGV2ZWwgc2V0dGluZyAqLworQVZDRW5jX1N0YXR1cyBWZXJpZnlMZXZlbChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDU2VxUGFyYW1TZXQgKnNlcVBhcmFtLCBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0pCit7CisgICAgKHZvaWQpKHBpY1BhcmFtKTsKKworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBtYl9wZXJfc2VjLCBpaTsKKyAgICBpbnQgbGV2X2lkeDsKKyAgICBpbnQgZHBiX3NpemU7CisKKyAgICBtYl9wZXJfc2VjID0gKGludCkodmlkZW8tPlBpY1NpemVJbk1icyAqIHJhdGVDdHJsLT5mcmFtZV9yYXRlICsgMC41KTsKKyAgICBkcGJfc2l6ZSA9IChzZXFQYXJhbS0+bnVtX3JlZl9mcmFtZXMgKiB2aWRlby0+UGljU2l6ZUluTWJzICogMykgPj4gNjsKKworICAgIGlmIChzZXFQYXJhbS0+bGV2ZWxfaWRjID09IDApIC8qIGZpbmQgbGV2ZWwgZm9yIHRoaXMgc2V0dGluZyAqLworICAgIHsKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgTUFYX0xFVkVMX0lEWDsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1iX3Blcl9zZWMgPD0gTWF4TUJQU1tpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgdmlkZW8tPlBpY1NpemVJbk1icyA8PSAodWludClNYXhGU1tpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPD0gKGludDMyKU1heEJSW2lpXSoxMDAwICYmCisgICAgICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5jcGJTaXplIDw9IChpbnQzMilNYXhDUEJbaWldKjEwMDAgJiYKKyAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPm12UmFuZ2UgPD0gTWF4Vm12UltpaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgZHBiX3NpemUgPD0gTWF4RFBCWDJbaWldKjUxMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZXFQYXJhbS0+bGV2ZWxfaWRjID0gbWFwSWR4MkxldltpaV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlcVBhcmFtLT5sZXZlbF9pZGMgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19MRVZFTF9OT1RfU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhpcyBsZXZlbCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBsaWJyYXJ5ICovCisgICAgbGV2X2lkeCA9IG1hcExldjJJZHhbc2VxUGFyYW0tPmxldmVsX2lkY107CisgICAgaWYgKHNlcVBhcmFtLT5sZXZlbF9pZGMgPT0gQVZDX0xFVkVMMV9CKQorICAgIHsKKyAgICAgICAgc2VxUGFyYW0tPmNvbnN0cmFpbmVkX3NldDNfZmxhZyA9IDE7CisgICAgfQorCisKKyAgICBpZiAobGV2X2lkeCA9PSAyNTUpIC8qIG5vdCBkZWZpbmVkICovCisgICAgeworICAgICAgICByZXR1cm4gQVZDRU5DX0xFVkVMX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdGhlIGVuY29kaW5nIHNldHRpbmcgY29tcGxpZXMgd2l0aCB0aGUgbGV2ZWwgKi8KKyAgICBpZiAobWJfcGVyX3NlYyA+IE1heE1CUFNbbGV2X2lkeF0gfHwKKyAgICAgICAgICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgPiAodWludClNYXhGU1tsZXZfaWR4XSB8fAorICAgICAgICAgICAgcmF0ZUN0cmwtPmJpdFJhdGUgPiAoaW50MzIpTWF4QlJbbGV2X2lkeF0qMTAwMCB8fAorICAgICAgICAgICAgcmF0ZUN0cmwtPmNwYlNpemUgPiAoaW50MzIpTWF4Q1BCW2xldl9pZHhdKjEwMDAgfHwKKyAgICAgICAgICAgIHJhdGVDdHJsLT5tdlJhbmdlID4gTWF4Vm12UltsZXZfaWR4XSkKKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfTEVWRUxfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIGluaXRpYWxpemUgdmFyaWFibGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBmcmFtZSAqLworLyogZGV0ZXJtaW5lIHRoZSBwaWN0dXJlIHR5cGUgKi8KKy8qIGVuY29kZSBQT0MgKi8KKy8qIG1heWJlIHdlIHNob3VsZCBkbyBtb3JlIHN0dWZmIGhlcmUuIE1vdGlvbkVzdGltYXRpb24rU0NEIGFuZCBnZW5lcmF0ZSBhIG5ldyBTUFMgYW5kIFBQUyAqLworQVZDRW5jX1N0YXR1cyBJbml0RnJhbWUoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDU3RhdHVzIHJldDsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworCisgICAgLyogbG9vayBmb3IgdGhlIG5leHQgZnJhbWUgaW4gY29kaW5nX29yZGVyIGFuZCBsb29rIGZvciBhdmFpbGFibGUgcGljdHVyZQorICAgICAgIGluIHRoZSBEUEIuIE5vdGUsIHZpZGVvLT5jdXJyRlMtPlBpY09yZGVyQ250LCBjdXJyRlMtPkZyYW1lTnVtIGFuZCBjdXJyUGljLT5QaWNOdW0KKyAgICAgICBhcmUgc2V0IHRvIHdyb25nIG51bWJlciBpbiB0aGlzIGZ1bmN0aW9uIChyaWdodCBmb3IgZGVjb2RlcikuICovCisgICAgaWYgKHZpZGVvLT5uYWxfdW5pdF90eXBlID09IEFWQ19OQUxUWVBFX0lEUikKKyAgICB7CisgICAgICAgIC8vIGNhbGwgaW5pdCBEUEIgaW4gaGVyZS4KKyAgICAgICAgcmV0ID0gQVZDQ29uZmlndXJlU2VxdWVuY2UoZW5jdmlkLT5hdmNIYW5kbGUsIHZpZGVvLCBUUlVFKTsKKyAgICAgICAgaWYgKHJldCAhPSBBVkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZyAoZXZlcnkgZnJhbWUpKi8KKyAgICAvKiBwb3B1bGF0ZSB2aWRlby0+bWFwVW5pdFRvU2xpY2VHcm91cE1hcCBhbmQgdmlkZW8tPk1iVG9TbGljZUdyb3VwTWFwICovCisgICAgLyogSXQgY2hhbmdlcyBvbmNlIHBlciBlYWNoIFBQUy4gKi8KKyAgICBGTU9Jbml0KHZpZGVvKTsKKworICAgIHJldCA9IERQQkluaXRCdWZmZXIoZW5jdmlkLT5hdmNIYW5kbGUsIHZpZGVvKTsgLy8gZ2V0IG5ldyBidWZmZXIKKworICAgIGlmIChyZXQgIT0gQVZDX1NVQ0NFU1MpCisgICAgeworICAgICAgICByZXR1cm4gKEFWQ0VuY19TdGF0dXMpcmV0OyAvLyBBVkNFTkNfUElDVFVSRV9SRUFEWSwgRkFJTAorICAgIH0KKworICAgIERQQkluaXRQaWModmlkZW8sIDApOyAvKiAwIGlzIGR1bW15ICovCisKKyAgICAvKioqKioqKioqKioqKiBkZXRlcm1pbmUgcGljdHVyZSB0eXBlIElEUiBvciBub24tSURSICoqKioqKioqKioqLworICAgIHZpZGVvLT5jdXJyUGljVHlwZSA9IEFWQ19GUkFNRTsKKyAgICB2aWRlby0+c2xpY2VfZGF0YV9wYXJ0aXRpb25pbmcgPSBGQUxTRTsKKyAgICBlbmN2aWQtPmN1cnJJbnB1dC0+aXNfcmVmZXJlbmNlID0gMTsgLyogZGVmYXVsdCB0byBhbGwgZnJhbWVzICovCisgICAgdmlkZW8tPm5hbF9yZWZfaWRjID0gMTsgIC8qIG5lZWQgdG8gc2V0IHRoaXMgZm9yIEluaXRQT0MgKi8KKyAgICB2aWRlby0+Y3VyclBpYy0+aXNSZWZlcmVuY2UgPSBUUlVFOworCisgICAgLyoqKioqKioqKioqKiogc2V0IGZyYW1lX251bSAqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAodmlkZW8tPm5hbF91bml0X3R5cGUgPT0gQVZDX05BTFRZUEVfSURSKQorICAgIHsKKyAgICAgICAgdmlkZW8tPnByZXZGcmFtZU51bSA9IHZpZGVvLT5NYXhGcmFtZU51bTsKKyAgICAgICAgdmlkZW8tPlByZXZSZWZGcmFtZU51bSA9IDA7CisgICAgICAgIHNsaWNlSGRyLT5mcmFtZV9udW0gPSAwOworICAgIH0KKyAgICAvKiBvdGhlcndpc2UsIGl0J3Mgc2V0IHRvIHByZXZpb3VzIHJlZmVyZW5jZSBmcmFtZSBhY2Nlc3MgdW5pdCdzIGZyYW1lX251bSBpbiBkZWNvZGluZyBvcmRlciwKKyAgICAgICBzZWUgdGhlIGVuZCBvZiBQVkFWQ0RlY29kZVNsaWNlKCkqLworICAgIC8qIFRoZXJlJ3MgYWxzbyByZXN0cmljdGlvbiBvbiB0aGUgZnJhbWVfbnVtLCBzZWUgcGFnZSA1OSBvZiBKVlQtSTEwMTAuZG9jLiAqLworICAgIC8qIEJhc2ljYWxseSwgZnJhbWVfbnVtIGNhbid0IGJlIHJlcGVhdGVkIHVubGVzcyBpdCdzIG9wcG9zaXRlIGZpZWxkcyBvciBub24gcmVmZXJlbmNlIGZpZWxkcyAqLworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5mcmFtZV9udW0gPSAodmlkZW8tPlByZXZSZWZGcmFtZU51bSArIDEpICUgdmlkZW8tPk1heEZyYW1lTnVtOworICAgIH0KKyAgICB2aWRlby0+Q3VyclBpY051bSA9IHNsaWNlSGRyLT5mcmFtZV9udW07ICAvKiBmb3IgZmllbGRfcGljX2ZsYWcgPSAwICovCisgICAgLy92aWRlby0+Q3VyclBpY051bSA9IDIqc2xpY2VIZHItPmZyYW1lX251bSArIDE7IC8qIGZvciBmaWVsZF9waWNfZmxhZyA9IDEgKi8KKworICAgIC8qIGFzc2lnbiBwaWNfb3JkZXJfY250LCB2aWRlby0+UGljT3JkZXJDbnQgKi8KKyAgICBzdGF0dXMgPSBJbml0UE9DKGVuY3ZpZCk7CisgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykgIC8qIGluY29ycmlnYWJsZSBmYWlsICovCisgICAgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qIEluaXRpYWxpemUgcmVmTGlzdElkeCBmb3IgdGhpcyBwaWN0dXJlICovCisgICAgUmVmTGlzdEluaXQodmlkZW8pOworCisgICAgLyoqKioqKioqKioqKiogbW90aW9uIGVzdGltYXRpb24gYW5kIHNjZW5lIGFuYWx5c2lzICoqKioqKioqKioqKi8KKyAgICAvLyAsIHRvIG1vdmUgdGhpcyB0byBNQi1iYXNlZCBNViBzZWFyY2ggZm9yIGNvbXBhcmlzb24KKyAgICAvLyB1c2Ugc3ViLW9wdGltYWwgUVAgZm9yIG12IHNlYXJjaAorICAgIEFWQ01vdGlvbkVzdGltYXRpb24oZW5jdmlkKTsgIC8qIEFWQ0VOQ19TVUNDRVNTIG9yIEFWQ0VOQ19ORVdfSURSICovCisKKyAgICAvKiBhZnRlciB0aGlzIHBvaW50LCB0aGUgcGljdHVyZSB0eXBlIHdpbGwgYmUgZml4ZWQgdG8gZWl0aGVyIElEUiBvciBub24tSURSICovCisgICAgdmlkZW8tPmN1cnJGUy0+UGljT3JkZXJDbnQgPSB2aWRlby0+UGljT3JkZXJDbnQ7CisgICAgdmlkZW8tPmN1cnJGUy0+RnJhbWVOdW0gPSB2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bTsKKyAgICB2aWRlby0+Y3VyclBpYy0+UGljTnVtID0gdmlkZW8tPkN1cnJQaWNOdW07CisgICAgdmlkZW8tPm1iTnVtID0gMDsgLyogc3RhcnQgZnJvbSB6ZXJvIE1CICovCisgICAgZW5jdmlkLT5jdXJyU2xpY2VHcm91cCA9IDA7IC8qIHN0YXJ0IGZyb20gc2xpY2UgZ3JvdXAgIzAgKi8KKyAgICBlbmN2aWQtPm51bUludHJhTUIgPSAwOyAvKiByZXNldCB0aGlzIGNvdW50ZXIgKi8KKworICAgIGlmICh2aWRlby0+bmFsX3VuaXRfdHlwZSA9PSBBVkNfTkFMVFlQRV9JRFIpCisgICAgeworICAgICAgICBSQ0luaXRHT1AoZW5jdmlkKTsKKworICAgICAgICAvKiBjYWxjdWxhdGUgcGljdHVyZSBRUCAqLworICAgICAgICBSQ0luaXRGcmFtZVFQKGVuY3ZpZCk7CisKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19ORVdfSURSOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBwaWN0dXJlIFFQICovCisgICAgUkNJbml0RnJhbWVRUChlbmN2aWQpOyAvKiBnZXQgUVAgYWZ0ZXIgTVYgc2VhcmNoICovCisKKyAgICByZXR1cm4gQVZDRU5DX1NVQ0NFU1M7Cit9CisKKy8qIGluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGlzIHNsaWNlICovCitBVkNFbmNfU3RhdHVzIEluaXRTbGljZShBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDU2xpY2VIZWFkZXIgKnNsaWNlSGRyID0gdmlkZW8tPnNsaWNlSGRyOworICAgIEFWQ1BpY1BhcmFtU2V0ICpjdXJyUFBTID0gdmlkZW8tPmN1cnJQaWNQYXJhbXM7CisgICAgQVZDU2VxUGFyYW1TZXQgKmN1cnJTUFMgPSB2aWRlby0+Y3VyclNlcVBhcmFtczsKKyAgICBpbnQgc2xpY2VfdHlwZSA9IHZpZGVvLT5zbGljZV90eXBlOworCisgICAgc2xpY2VIZHItPmZpcnN0X21iX2luX3NsaWNlID0gdmlkZW8tPm1iTnVtOworICAgIGlmICh2aWRlby0+bWJOdW0pIC8vIG5vdCBmaXJzdCBzbGljZSBvZiBhIGZyYW1lCisgICAgeworICAgICAgICB2aWRlby0+c2xpY2VIZHItPnNsaWNlX3R5cGUgPSAoQVZDU2xpY2VUeXBlKXNsaWNlX3R5cGU7CisgICAgfQorCisgICAgLyogc2xpY2VIZHItPnNsaWNlX3R5cGUgYWxyZWFkeSBzZXQgaW4gSW5pdEZyYW1lICovCisKKyAgICBzbGljZUhkci0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSB2aWRlby0+Y3VyclBpY1BhcmFtcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICAvKiBzbGljZUhkci0+ZnJhbWVfbnVtIGFscmVhZHkgc2V0IGluIEluaXRGcmFtZSAqLworCisgICAgaWYgKCFjdXJyU1BTLT5mcmFtZV9tYnNfb25seV9mbGFnKSAgLyogd2Ugc2hvdWxkbid0IG5lZWQgdGhpcyBjaGVjayAqLworICAgIHsKKyAgICAgICAgc2xpY2VIZHItPmZpZWxkX3BpY19mbGFnID0gc2xpY2VIZHItPmJvdHRvbV9maWVsZF9mbGFnID0gRkFMU0U7CisgICAgICAgIHJldHVybiBBVkNFTkNfVE9PTFNfTk9UX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICAvKiBzbGljZUhkci0+aWRyX3BpY19pZCBhbHJlYWR5IHNldCBpbiBQVkFWQ0VuY29kZU5BTAorCisgICAgIHNsaWNlSGRyLT5waWNfb3JkZXJfY250X2xzYiBhbHJlYWR5IHNldCBpbiBJbml0RnJhbWUuLkluaXRQT0MKKyAgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRfYm90dG9tICBhbHJlYWR5IHNldCBpbiBJbml0UE9DCisKKyAgICBzbGljZUhkci0+ZGVsdGFfcGljX29yZGVyX2NudFswXSBhbHJlYWR5IHNldCBpbiBJbml0UE9DCisgICAgc2xpY2VIZHItPmRlbHRhX3BpY19vcmRlcl9jbnRbMV0gYWxyZWFkeSBzZXQgaW4gSW5pdFBPQworICAgICovCisKKyAgICBzbGljZUhkci0+cmVkdW5kYW50X3BpY19jbnQgPSAwOyAvKiBkZWZhdWx0IGlmKGN1cnJQUFMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyksIHJhbmdlIDAuLjEyNyAqLworICAgIHNsaWNlSGRyLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgPSAwOyAvLyBkZWZhdWx0IGlmKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisKKyAgICBzbGljZUhkci0+bnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCwgaWYoc2xpY2VfdHlwZT09IFAsU1Agb3IgQikqLworICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gMDsgLyogZGVmYXVsdCwgaWYgKG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKSAqLworICAgIHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gMDsgLyogZGVmYXVsdCwgaWYgYWJvdmUgYW5kIEJfc2xpY2UgKi8KKyAgICAvKiB0aGUgYWJvdmUgMiB2YWx1ZXMgcmFuZ2UgZnJvbSAwLi4xNSBmb3IgZnJhbWUgcGljdHVyZSBhbmQgMC4uMzEgZm9yIGZpZWxkIHBpY3R1cmUgKi8KKworICAgIC8qIHJlZl9waWNfbGlzdF9yZW9yZGVyaW5nKCksIGN1cnJlbnRseSB3ZSBkb24ndCBkbyBhbnl0aGluZyAqLworICAgIHNsaWNlSGRyLT5yZWZfcGljX2xpc3RfcmVvcmRlcmluZ19mbGFnX2wwID0gRkFMU0U7IC8qIGRlZmF1bHQgKi8KKyAgICBzbGljZUhkci0+cmVmX3BpY19saXN0X3Jlb3JkZXJpbmdfZmxhZ19sMSA9IEZBTFNFOyAvKiBkZWZhdWx0ICovCisgICAgLyogaWYgdGhlIGFib3ZlIGFyZSBUUlVFLCBzb21lIG90aGVyIHBhcmFtcyBtdXN0IGJlIHNldCAqLworCisgICAgaWYgKChjdXJyUFBTLT53ZWlnaHRlZF9wcmVkX2ZsYWcgJiYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UgfHwgc2xpY2VfdHlwZSA9PSBBVkNfU1BfU0xJQ0UpKSB8fAorICAgICAgICAgICAgKGN1cnJQUFMtPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJiBzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKSkKKyAgICB7CisgICAgICAgIC8vICAgICAgcHJlZF93ZWlnaHRfdGFibGUoKTsgLy8gbm90IHN1cHBvcnRlZCAhIQorICAgICAgICByZXR1cm4gQVZDRU5DX1RPT0xTX05PVF9TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogZGVjX3JlZl9waWNfbWFya2luZygpLCB0aGlzIHdpbGwgYmUgZG9uZSBsYXRlciovCisgICAgc2xpY2VIZHItPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIHNsaWNlSGRyLT5sb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcgPSBGQUxTRTsgLyogZm9yIElEUiBmcmFtZSwgZG8gbm90IG1ha2UgaXQgbG9uZyB0ZXJtICovCisgICAgc2xpY2VIZHItPmFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCAqLworICAgIC8qIG90aGVyIHBhcmFtcyBhcmUgbm90IHNldCBoZXJlIGJlY2F1c2UgdGhleSBhcmUgbm90IHVzZWQgKi8KKworICAgIHNsaWNlSGRyLT5jYWJhY19pbml0X2lkYyA9IDA7IC8qIGRlZmF1bHQsIGlmIGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAmJiBzbGljZV90eXBlPT1JIG9yIFNJLCByYW5nZSAwLi4yICAqLworICAgIHNsaWNlSGRyLT5zbGljZV9xcF9kZWx0YSA9IDA7IC8qIGRlZmF1bHQgZm9yIG5vdyAqLworICAgIHNsaWNlSGRyLT5zcF9mb3Jfc3dpdGNoX2ZsYWcgPSBGQUxTRTsgLyogZGVmYXVsdCwgaWYgc2xpY2VfdHlwZSA9PSBTUCAqLworICAgIHNsaWNlSGRyLT5zbGljZV9xc19kZWx0YSA9IDA7IC8qIGRlZmF1bHQsIGlmIHNsaWNlX3R5cGUgPT0gU1Agb3IgU0kgKi8KKworICAgIC8qIGRlcml2ZWQgdmFyaWFibGVzIGZyb20gZW5jUGFyYW0gKi8KKyAgICAvKiBkZWJsb2NraW5nIGZpbHRlciAqLworICAgIHZpZGVvLT5GaWx0ZXJPZmZzZXRBID0gdmlkZW8tPkZpbHRlck9mZnNldEIgPSAwOworICAgIGlmIChjdXJyUFBTLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgdmlkZW8tPkZpbHRlck9mZnNldEEgPSBzbGljZUhkci0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIgPDwgMTsKKyAgICAgICAgdmlkZW8tPkZpbHRlck9mZnNldEIgPSBzbGljZUhkci0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2XzIgPDwgMTsKKyAgICB9CisKKyAgICAvKiBmbGV4aWJsZSBtYWNyb2Jsb2NrIG9yZGVyaW5nICovCisgICAgLyogcG9wdWxhdGUgdmlkZW8tPm1hcFVuaXRUb1NsaWNlR3JvdXBNYXAgYW5kIHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcCAqLworICAgIC8qIFdlIGFscmVhZHkgY2FsbCBpdCBhdCB0aGUgZW5kIG9mIFBWQVZDRW5jSW5pdGlhbGl6ZSgpLiBJdCBjaGFuZ2VzIG9uY2UgcGVyIGVhY2ggUFBTLiAqLworICAgIGlmICh2aWRlby0+Y3VyclBpY1BhcmFtcy0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgPiAwICYmIHZpZGVvLT5jdXJyUGljUGFyYW1zLT5zbGljZV9ncm91cF9tYXBfdHlwZSA+PSAzCisgICAgICAgICAgICAmJiB2aWRlby0+Y3VyclBpY1BhcmFtcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPD0gNSkKKyAgICB7CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV9ncm91cF9jaGFuZ2VfY3ljbGUgPSBTTElDRV9HUk9VUF9DSEFOR0VfQ1lDTEU7ICAvKiBkZWZhdWx0LCBkb24ndCB1bmRlcnN0YW5kIGhvdyB0byBzZXQgaXQhISEqLworCisgICAgICAgIHZpZGVvLT5NYXBVbml0c0luU2xpY2VHcm91cDAgPQorICAgICAgICAgICAgQVZDX01JTihzbGljZUhkci0+c2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlICogdmlkZW8tPlNsaWNlR3JvdXBDaGFuZ2VSYXRlLCB2aWRlby0+UGljU2l6ZUluTWFwVW5pdHMpOworCisgICAgICAgIEZNT0luaXQodmlkZW8pOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSBTbGljZVFQeSBmaXJzdCAgKi8KKyAgICAvKiBjYWxjdWxhdGUgUVN5IGZpcnN0ICovCisKKyAgICBzbGljZUhkci0+c2xpY2VfcXBfZGVsdGEgPSB2aWRlby0+UVB5IC0gMjYgLSBjdXJyUFBTLT5waWNfaW5pdF9xcF9taW51czI2OworICAgIC8vc2xpY2VIZHItPnNsaWNlX3FzX2RlbHRhID0gdmlkZW8tPlFTeSAtIDI2IC0gY3VyclBQUy0+cGljX2luaXRfcXNfbWludXMyNjsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ludHJhX2VzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvaW50cmFfZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U1OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL2ludHJhX2VzdC5jcHAKQEAgLTAsMCArMSwyMTk5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworI2RlZmluZSBUSF9JNCAgMCAgLyogdGhyZXNob2xkIGJpYXNpbmcgdG93YXJkIEkxNiBtb2RlIGluc3RlYWQgb2YgSTQgbW9kZSAqLworI2RlZmluZSBUSF9JbnRyYSAgMCAvKiB0aHJlc2hvbGQgYmlhc2luZyB0b3dhcmQgSU5URVIgbW9kZSBpbnN0ZWFkIG9mIGludHJhIG1vZGUgKi8KKworI2RlZmluZSBGSVhFRF9JTlRSQVBSRURfTU9ERSAgQVZDX0kxNgorI2RlZmluZSBGSVhFRF9JMTZfTU9ERSAgQVZDX0kxNl9EQworI2RlZmluZSBGSVhFRF9JNF9NT0RFICAgQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdAorI2RlZmluZSBGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSBBVkNfSUNfREMKKworI2RlZmluZSBDTElQX1JFU1VMVCh4KSAgICAgIGlmKCh1aW50KXggPiAweEZGKXsgXAorICAgICAgICAgICAgICAgICB4ID0gMHhGRiAmICh+KHg+PjMxKSk7fQorCisKK2Jvb2wgSW50cmFEZWNpc2lvbkFCRShBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1pbl9jb3N0LCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBpbnQgb3JnUGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCB4X3BvcyA9ICh2aWRlby0+bWJfeCkgPDwgNDsKKyAgICBpbnQgeV9wb3MgPSAodmlkZW8tPm1iX3kpIDw8IDQ7CisgICAgdWludDggKm9yZ1kgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgeV9wb3MgKiBvcmdQaXRjaCArIHhfcG9zOworICAgIGludCBqOworICAgIHVpbnQ4ICp0b3BMLCAqbGVmdEwsICpvcmdZXzIsICpvcmdZXzM7CisgICAgaW50IHRlbXAsIFNCRSwgb2Zmc2V0OworICAgIE9zY2xGbG9hdCBBQkU7CisgICAgYm9vbCBpbnRyYSA9IHRydWU7CisKKyAgICBpZiAoKCh4X3BvcyA+PiA0KSAhPSAoaW50KXZpZGVvLT5QaWNXaWR0aEluTWJzIC0gMSkgJiYKKyAgICAgICAgICAgICgoeV9wb3MgPj4gNCkgIT0gKGludCl2aWRlby0+UGljSGVpZ2h0SW5NYnMgLSAxKSAmJgorICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBICYmCisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBTQkUgPSAwOworICAgICAgICAvKiB0b3AgbmVpZ2hib3IgKi8KKyAgICAgICAgdG9wTCA9IGN1ckwgLSBwaWNQaXRjaDsKKyAgICAgICAgLyogbGVmdCBuZWlnaGJvciAqLworICAgICAgICBsZWZ0TCA9IGN1ckwgLSAxOworICAgICAgICBvcmdZXzIgPSBvcmdZIC0gb3JnUGl0Y2g7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAqdG9wTCsrIC0gb3JnWVtqXTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICAgICAgdGVtcCA9ICoobGVmdEwgKz0gcGljUGl0Y2gpIC0gKihvcmdZXzIgKz0gb3JnUGl0Y2gpOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjYWxjdWxhdGUgY2hyb21hICovCisgICAgICAgIG9mZnNldCA9ICh5X3BvcyA+PiAyKSAqIHBpY1BpdGNoICsgKHhfcG9zID4+IDEpOworICAgICAgICB0b3BMID0gdmlkZW8tPmN1cnJQaWMtPlNjYiArIG9mZnNldDsKKyAgICAgICAgb3JnWV8yID0gY3VycklucHV0LT5ZQ2JDclsxXSArIG9mZnNldCArICh5X3BvcyA+PiAyKSAqIChvcmdQaXRjaCAtIHBpY1BpdGNoKTsKKworICAgICAgICBsZWZ0TCA9IHRvcEwgLSAxOworICAgICAgICB0b3BMIC09IChwaWNQaXRjaCA+PiAxKTsKKyAgICAgICAgb3JnWV8zID0gb3JnWV8yIC0gKG9yZ1BpdGNoID4+IDEpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gKnRvcEwrKyAtIG9yZ1lfMltqXTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICAgICAgdGVtcCA9ICoobGVmdEwgKz0gKHBpY1BpdGNoID4+IDEpKSAtICoob3JnWV8zICs9IChvcmdQaXRjaCA+PiAxKSk7CisgICAgICAgICAgICBTQkUgKz0gKCh0ZW1wID49IDApID8gdGVtcCA6IC10ZW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIHRvcEwgPSB2aWRlby0+Y3VyclBpYy0+U2NyICsgb2Zmc2V0OworICAgICAgICBvcmdZXzIgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgb2Zmc2V0ICsgKHlfcG9zID4+IDIpICogKG9yZ1BpdGNoIC0gcGljUGl0Y2gpOworCisgICAgICAgIGxlZnRMID0gdG9wTCAtIDE7CisgICAgICAgIHRvcEwgLT0gKHBpY1BpdGNoID4+IDEpOworICAgICAgICBvcmdZXzMgPSBvcmdZXzIgLSAob3JnUGl0Y2ggPj4gMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAqdG9wTCsrIC0gb3JnWV8yW2pdOworICAgICAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gKihsZWZ0TCArPSAocGljUGl0Y2ggPj4gMSkpIC0gKihvcmdZXzMgKz0gKG9yZ1BpdGNoID4+IDEpKTsKKyAgICAgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgICAgICB9CisKKyAgICAgICAgLyogY29tcGFyZSBtaW5jb3N0LzM4NCBhbmQgU0JFLzY0ICovCisgICAgICAgIEFCRSA9IFNCRSAvIDY0LjA7CisgICAgICAgIGlmIChBQkUqMC44ID49IG1pbl9jb3N0IC8gMzg0LjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludHJhID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW50cmE7Cit9CisKKy8qIHBlcmZvcm0gc2VhcmNoaW5nIGZvciBNQiBtb2RlICovCisvKiBhc3N1bWluZyB0aGF0IHRoaXMgaXMgZG9uZSBpbnNpZGUgdGhlIGVuY29kaW5nIGxvb3AsCitubyBuZWVkIHRvIGNhbGwgSW5pdE5laWdoYm9yQXZhaWxhYmlsaXR5ICovCisKK3ZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IG1ibnVtLCB1aW50OCAqY3VyTCwgaW50IHBpY1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNGcmFtZUlPICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIgPSB2aWRlby0+Y3Vyck1COworICAgIGludCBtaW5fY29zdDsKKyAgICB1aW50OCAqb3JnWTsKKyAgICBpbnQgeF9wb3MgPSAodmlkZW8tPm1iX3gpIDw8IDQ7CisgICAgaW50IHlfcG9zID0gKHZpZGVvLT5tYl95KSA8PCA0OworICAgIHVpbnQzMiAqc2F2ZWRfaW50ZXI7CisgICAgaW50IGo7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBib29sIGludHJhID0gdHJ1ZTsKKworICAgIGN1cnJNQi0+Q0JQID0gMDsKKworICAgIC8qIGZpcnN0IGRvIG1vdGlvbiB2ZWN0b3IgYW5kIHZhcmlhYmxlIGJsb2NrIHNpemUgc2VhcmNoICovCisgICAgbWluX2Nvc3QgPSBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXTsKKworICAgIC8qIG5vdyBwZXJmb3JtIGludHJhIHByZWRpY3Rpb24gc2VhcmNoICovCisgICAgLyogbmVlZCB0byBhZGQgdGhlIGNoZWNrIGZvciBlbmN2aWQtPmludHJhU2VhcmNoW3ZpZGVvLT5tYk51bV0gdG8gc2tpcCBpbnRyYQorICAgICAgIGlmIGl0J3Mgbm90IHdvcnRoIGNoZWNraW5nLiAqLworICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICB7CisgICAgICAgIC8qIERlY2lkZSB3aGV0aGVyIGludHJhIHNlYXJjaCBpcyBuZWNlc3Nhcnkgb3Igbm90ICovCisgICAgICAgIC8qIFRoaXMgb25lLCB3ZSBkbyBpdCBpbiB0aGUgZW5jb2RpbmcgbG9vcCBzbyB0aGUgbmVpZ2hib3JpbmcgcGl4ZWwgYXJlIHRoZQorICAgICAgICBhY3R1YWwgcmVjb25zdHJ1Y3RlZCBwaXhlbHMuICovCisgICAgICAgIGludHJhID0gSW50cmFEZWNpc2lvbkFCRShlbmN2aWQsIG1pbl9jb3N0LCBjdXJMLCBwaWNQaXRjaCk7CisgICAgfQorCisgICAgaWYgKGludHJhID09IHRydWUgfHwgdmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBvcmdZID0gY3VycklucHV0LT5ZQ2JDclswXSArIHlfcG9zICogb3JnUGl0Y2ggKyB4X3BvczsKKworICAgICAgICAvKiBpMTYgbW9kZSBzZWFyY2ggKi8KKyAgICAgICAgLyogZ2VuZXJhdGUgYWxsIHRoZSBwcmVkaWN0aW9ucyAqLworICAgICAgICBpbnRyYXByZWRfbHVtYV8xNngxNihlbmN2aWQpOworCisgICAgICAgIC8qIGV2YWx1YXRlIHRoZW0gb25lIGJ5IG9uZSAqLworICAgICAgICBmaW5kX2Nvc3RfMTZ4MTYoZW5jdmlkLCBvcmdZLCAmbWluX2Nvc3QpOworCisgICAgICAgIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogc2F2ZSBjdXJyZW50IGludGVyIHByZWRpY3Rpb24gKi8KKyAgICAgICAgICAgIHNhdmVkX2ludGVyID0gZW5jdmlkLT5zdWJwZWxfcHJlZDsgLyogcmV1c2UgZXhpc3RpbmcgYnVmZmVyICovCisgICAgICAgICAgICBqID0gMTY7CisgICAgICAgICAgICBjdXJMIC09IDQ7CisgICAgICAgICAgICBwaWNQaXRjaCAtPSAxNjsKKyAgICAgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICAqc2F2ZWRfaW50ZXIrKyA9ICooKHVpbnQzMiopKGN1ckwgKz0gNCkpOworICAgICAgICAgICAgICAgICpzYXZlZF9pbnRlcisrID0gKigodWludDMyKikoY3VyTCArPSA0KSk7CisgICAgICAgICAgICAgICAgKnNhdmVkX2ludGVyKysgPSAqKCh1aW50MzIqKShjdXJMICs9IDQpKTsKKyAgICAgICAgICAgICAgICBjdXJMICs9IHBpY1BpdGNoOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICAvKiBpNCBtb2RlIHNlYXJjaCAqLworICAgICAgICBtYl9pbnRyYTR4NF9zZWFyY2goZW5jdmlkLCAmbWluX2Nvc3QpOworCisgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbbWJudW1dID0gbWluX2Nvc3Q7IC8qIHVwZGF0ZSBtaW5fY29zdCAqLworICAgIH0KKworCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgeworICAgICAgICBjaHJvbWFfaW50cmFfc2VhcmNoKGVuY3ZpZCk7CisKKyAgICAgICAgLyogbmVlZCB0byBzZXQgdGhpcyBpbiBvcmRlciBmb3IgdGhlIE1CSW50ZXJQcmVkaWN0aW9uIHRvIHdvcmshISAqLworICAgICAgICBtZW1zZXQoY3Vyck1CLT5tdkwwLCAwLCBzaXplb2YoaW50MzIpKjE2KTsKKyAgICAgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID0gY3Vyck1CLT5yZWZfaWR4X0wwWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsyXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFszXSA9IC0xOworICAgIH0KKyAgICBlbHNlIGlmICh2aWRlby0+c2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSAmJiBpbnRyYSA9PSB0cnVlKQorICAgIHsKKyAgICAgICAgLyogcmVzdG9yZSBjdXJyZW50IGludGVyIHByZWRpY3Rpb24gKi8KKyAgICAgICAgc2F2ZWRfaW50ZXIgPSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvKiByZXVzZSBleGlzdGluZyBidWZmZXIgKi8KKyAgICAgICAgaiA9IDE2OworICAgICAgICBjdXJMIC09ICgocGljUGl0Y2ggKyAxNikgPDwgNCk7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICAqKCh1aW50MzIqKShjdXJMICs9IDQpKSA9ICpzYXZlZF9pbnRlcisrOworICAgICAgICAgICAgKigodWludDMyKikoY3VyTCArPSA0KSkgPSAqc2F2ZWRfaW50ZXIrKzsKKyAgICAgICAgICAgICooKHVpbnQzMiopKGN1ckwgKz0gNCkpID0gKnNhdmVkX2ludGVyKys7CisgICAgICAgICAgICBjdXJMICs9IHBpY1BpdGNoOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworLyogZ2VuZXJhdGUgYWxsIHRoZSBwcmVkaWN0aW9uIHZhbHVlcyAqLwordm9pZCBpbnRyYXByZWRfbHVtYV8xNngxNihBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKworICAgIGludCB4X3BvcyA9ICh2aWRlby0+bWJfeCkgPDwgNDsKKyAgICBpbnQgeV9wb3MgPSAodmlkZW8tPm1iX3kpIDw8IDQ7CisgICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisKKyAgICBpbnQgb2Zmc2V0ID0geV9wb3MgKiBwaXRjaCArIHhfcG9zOworCisgICAgdWludDggKnByZWQsICp0b3AsICpsZWZ0OworICAgIHVpbnQ4ICpjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7IC8qIHBvaW50IHRvIHJlY29uc3RydWN0ZWQgZnJhbWUgKi8KKyAgICB1aW50MzIgd29yZDEsIHdvcmQyLCB3b3JkMywgd29yZDQ7CisgICAgdWludDMyIHN1bSA9IDA7CisKKyAgICBpbnQgYV8xNiwgYiwgYywgZmFjdG9yX2M7CisgICAgdWludDggKmNvbXBfcmVmX3gwLCAqY29tcF9yZWZfeDEsICpjb21wX3JlZl95MCwgKmNvbXBfcmVmX3kxOworICAgIGludCBIID0gMCwgViA9IDAsIHRtcCwgdmFsdWU7CisgICAgaW50IGk7CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgLy9nZXQgdmVydGljYWwgcHJlZGljdGlvbiBtb2RlCisgICAgICAgIHRvcCA9IGN1ckwgLSBwaXRjaDsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1ZlcnRpY2FsXSAtIDE2OworCisgICAgICAgIHdvcmQxID0gKigodWludDMyKikodG9wKSk7ICAvKiByZWFkIDQgYnl0ZXMgZnJvbSB0b3AgKi8KKyAgICAgICAgd29yZDIgPSAqKCh1aW50MzIqKSh0b3AgKyA0KSk7IC8qIHJlYWQgNCBieXRlcyBmcm9tIHRvcCAqLworICAgICAgICB3b3JkMyA9ICooKHVpbnQzMiopKHRvcCArIDgpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisgICAgICAgIHdvcmQ0ID0gKigodWludDMyKikodG9wICsgMTIpKTsgLyogcmVhZCA0IGJ5dGVzIGZyb20gdG9wICovCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gMTYpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHdvcmQyOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHdvcmQzOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSB3b3JkNDsKKworICAgICAgICB9CisKKyAgICAgICAgc3VtID0gd29yZDEgJiAweEZGMDBGRjsKKyAgICAgICAgd29yZDEgPSAod29yZDEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkMSA9ICh3b3JkMiAmIDB4RkYwMEZGKTsKKyAgICAgICAgc3VtICs9IHdvcmQxOworICAgICAgICB3b3JkMiA9ICh3b3JkMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICBzdW0gKz0gd29yZDI7CisgICAgICAgIHdvcmQxID0gKHdvcmQzICYgMHhGRjAwRkYpOworICAgICAgICBzdW0gKz0gd29yZDE7CisgICAgICAgIHdvcmQzID0gKHdvcmQzID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgIHN1bSArPSB3b3JkMzsKKyAgICAgICAgd29yZDEgPSAod29yZDQgJiAweEZGMDBGRik7CisgICAgICAgIHN1bSArPSB3b3JkMTsKKyAgICAgICAgd29yZDQgPSAod29yZDQgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgc3VtICs9IHdvcmQ0OworCisgICAgICAgIHN1bSArPSAoc3VtID4+IDE2KTsKKyAgICAgICAgc3VtICY9IDB4RkZGRjsKKworICAgICAgICBpZiAoIXZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtID0gKHN1bSArIDgpID4+IDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgLy8gZ2V0IGhvcml6b250YWwgbW9kZQorICAgICAgICBsZWZ0ID0gY3VyTCAtIDEgLSBwaXRjaDsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X0hvcml6b250YWxdIC0gMTY7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKihsZWZ0ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bSArPSB3b3JkMTsKKworICAgICAgICAgICAgd29yZDEgPSAod29yZDEgPDwgOCkgfCB3b3JkMTsKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxIDw8IDE2KSB8IHdvcmQxOyAvKiBtYWtlIGl0IDQgKi8KKworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICs9IDE2KSA9IHdvcmQxOworICAgICAgICAgICAgKih1aW50MzIqKShwcmVkICsgNCkgPSB3b3JkMTsKKyAgICAgICAgICAgICoodWludDMyKikocHJlZCArIDgpID0gd29yZDE7CisgICAgICAgICAgICAqKHVpbnQzMiopKHByZWQgKyAxMikgPSB3b3JkMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gPSAoc3VtICsgOCkgPj4gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bSA9IChzdW0gKyAxNikgPj4gNTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGdldCBEQyBtb2RlCisgICAgaWYgKCF2aWRlby0+aW50cmFBdmFpbEEgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIHN1bSA9IDB4ODA4MDgwODA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN1bSA9IChzdW0gPDwgOCkgfCBzdW07CisgICAgICAgIHN1bSA9IChzdW0gPDwgMTYpIHwgc3VtOworICAgIH0KKworICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfRENdIC0gMTY7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDE2KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA4KSkgPSBzdW07CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKyAxMikpID0gc3VtOworICAgIH0KKworICAgIC8vIGdldCBwbGFuZSBtb2RlCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9QbGFuZV0gLSAxNjsKKworICAgICAgICBjb21wX3JlZl94MCA9IGN1ckwgLSBwaXRjaCArIDg7CisgICAgICAgIGNvbXBfcmVmX3gxID0gY3VyTCAtIHBpdGNoICsgNjsKKyAgICAgICAgY29tcF9yZWZfeTAgPSBjdXJMIC0gMSArIChwaXRjaCA8PCAzKTsKKyAgICAgICAgY29tcF9yZWZfeTEgPSBjdXJMIC0gMSArIDYgKiBwaXRjaDsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgODsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSAqY29tcF9yZWZfeDEtLSk7CisgICAgICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kwICs9IHBpdGNoOworICAgICAgICAgICAgY29tcF9yZWZfeTEgLT0gcGl0Y2g7CisgICAgICAgIH0KKworICAgICAgICBIICs9IGkgKiAoKmNvbXBfcmVmX3gwKysgLSBjdXJMWy1waXRjaC0xXSk7CisgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworCisKKyAgICAgICAgYV8xNiA9ICgoKihjdXJMIC0gcGl0Y2ggKyAxNSkgKyAqKGN1ckwgLSAxICsgMTUgKiBwaXRjaCkpIDw8IDQpICsgMTY7OworICAgICAgICBiID0gKDUgKiBIICsgMzIpID4+IDY7CisgICAgICAgIGMgPSAoNSAqIFYgKyAzMikgPj4gNjsKKworICAgICAgICB0bXAgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZmFjdG9yX2MgPSBhXzE2ICsgYyAqICh0bXArKyAtIDcpOworICAgICAgICAgICAgZmFjdG9yX2MgLT0gNyAqIGI7CisKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gdmFsdWU7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSAod29yZDEpIHwgKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gMTYpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICB3b3JkMSA9ICh3b3JkMSkgfCAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHdvcmQxOworICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgd29yZDEgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgIHdvcmQxID0gKHdvcmQxKSB8ICh2YWx1ZSA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHdvcmQxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBldmFsdWF0ZSBlYWNoIHByZWRpY3Rpb24gbW9kZSBvZiBJMTYgKi8KK3ZvaWQgZmluZF9jb3N0XzE2eDE2KEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqb3JnWSwgaW50ICptaW5fY29zdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgY29zdDsKKyAgICBpbnQgb3JnX3BpdGNoID0gZW5jdmlkLT5jdXJySW5wdXQtPnBpdGNoOworCisgICAgLyogZXZhbHVhdGUgdmVydGljYWwgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgeworICAgICAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfVmVydGljYWxdLCAqbWluX2Nvc3QpOworICAgICAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0kxNjsKKyAgICAgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSAxOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9WZXJ0aWNhbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogZXZhbHVhdGUgaG9yaXpvbnRhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvc3QgPSBjb3N0X2kxNihvcmdZLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pMTZbQVZDX0kxNl9Ib3Jpem9udGFsXSwgKm1pbl9jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfSG9yaXpvbnRhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGV2YWx1YXRlIERDIG1vZGUgKi8KKyAgICBjb3N0ID0gY29zdF9pMTYob3JnWSwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaTE2W0FWQ19JMTZfRENdLCAqbWluX2Nvc3QpOworICAgIGlmIChjb3N0IDwgKm1pbl9jb3N0KQorICAgIHsKKyAgICAgICAgKm1pbl9jb3N0ID0gY29zdDsKKyAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfSTE2OworICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICB9CisKKyAgICAvKiBldmFsdWF0ZSBwbGFuZSBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgY29zdCA9IGNvc3RfaTE2KG9yZ1ksIG9yZ19waXRjaCwgZW5jdmlkLT5wcmVkX2kxNltBVkNfSTE2X1BsYW5lXSwgKm1pbl9jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCAqbWluX2Nvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK2ludCBjb3N0X2kxNih1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgaW50IG1pbl9jb3N0KQoreworCisgICAgaW50IGNvc3Q7CisgICAgaW50IGosIGs7CisgICAgaW50MTYgcmVzWzI1Nl0sICpwcmVzOyAvLyByZXNpZHVlCisgICAgaW50IG0wLCBtMSwgbTIsIG0zOworCisgICAgLy8gY2FsY3VsYXRlIFNBVEQKKyAgICBvcmdfcGl0Y2ggLT0gMTY7CisgICAgcHJlcyA9IHJlczsKKyAgICAvLyBob3Jpem9udGFsIHRyYW5zZm9ybQorICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgayA9IDQ7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBvcmdbMF0gLSBwcmVkWzBdOworICAgICAgICAgICAgbTMgPSBvcmdbM10gLSBwcmVkWzNdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBvcmdbMV0gLSBwcmVkWzFdOworICAgICAgICAgICAgbTIgPSBvcmdbMl0gLSBwcmVkWzJdOworICAgICAgICAgICAgbTEgKz0gbTI7CisgICAgICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICAgICAgcHJlc1swXSA9IG0wICsgbTE7CisgICAgICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgICAgIHByZXNbMV0gPSBtMiArIG0zOworICAgICAgICAgICAgcHJlc1szXSA9IG0zIC0gbTI7CisKKyAgICAgICAgICAgIG9yZyArPSA0OworICAgICAgICAgICAgcHJlcyArPSA0OworICAgICAgICAgICAgcHJlZCArPSA0OworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgfQorICAgIC8qIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgIGNvc3QgPSAwOworICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgeworICAgICAgICBwcmVzID0gcmVzICsgKGogPDwgNik7CisgICAgICAgIGsgPSAxNjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IHByZXNbMF07CisgICAgICAgICAgICBtMyA9IHByZXNbMzw8NF07CisgICAgICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgICAgIG0zID0gbTAgLSAobTMgPDwgMSk7CisgICAgICAgICAgICBtMSA9IHByZXNbMTw8NF07CisgICAgICAgICAgICBtMiA9IHByZXNbMjw8NF07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgPSBtMCArIG0xOworCisgICAgICAgICAgICBpZiAoayYweDMpICAvLyBvbmx5IHN1bSB1cCBub24gREMgdmFsdWVzLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvc3QgKz0gKChtMCA+IDApID8gbTAgOiAtbTApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtMSA9IG0wIC0gKG0xIDw8IDEpOworICAgICAgICAgICAgY29zdCArPSAoKG0xID4gMCkgPyBtMSA6IC1tMSk7CisgICAgICAgICAgICBtMyA9IG0yICsgbTM7CisgICAgICAgICAgICBjb3N0ICs9ICgobTMgPiAwKSA/IG0zIDogLW0zKTsKKyAgICAgICAgICAgIG0yID0gbTMgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBjb3N0ICs9ICgobTIgPiAwKSA/IG0yIDogLW0yKTsKKworICAgICAgICAgICAgcHJlcysrOworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIGlmICgoY29zdCA+PiAxKSA+IG1pbl9jb3N0KSAvKiBlYXJseSBkcm9wIG91dCAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGNvc3QgPj4gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBIYWRhbWFyZCBvZiB0aGUgREMgY29lZmZpY2llbnQgKi8KKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgbTMgPSBwcmVzWzM8PDJdOworICAgICAgICBtMCA+Pj0gMjsKKyAgICAgICAgbTAgKz0gKG0zID4+IDIpOworICAgICAgICBtMyA9IG0wIC0gKG0zID4+IDEpOworICAgICAgICBtMSA9IHByZXNbMTw8Ml07CisgICAgICAgIG0yID0gcHJlc1syPDwyXTsKKyAgICAgICAgbTEgPj49IDI7CisgICAgICAgIG0xICs9IChtMiA+PiAyKTsKKyAgICAgICAgbTIgPSBtMSAtIChtMiA+PiAxKTsKKyAgICAgICAgcHJlc1swXSA9IChtMCArIG0xKTsKKyAgICAgICAgcHJlc1syPDwyXSA9IChtMCAtIG0xKTsKKyAgICAgICAgcHJlc1sxPDwyXSA9IChtMiArIG0zKTsKKyAgICAgICAgcHJlc1szPDwyXSA9IChtMyAtIG0yKTsKKyAgICAgICAgcHJlcyArPSAoNCA8PCA0KTsKKyAgICAgICAgay0tOworICAgIH0KKworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICBtMyA9IHByZXNbMzw8Nl07CisgICAgICAgIG0wICs9IG0zOworICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICBtMSA9IHByZXNbMTw8Nl07CisgICAgICAgIG0yID0gcHJlc1syPDw2XTsKKyAgICAgICAgbTEgKz0gbTI7CisgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgIG0wID0gbTAgKyBtMTsKKyAgICAgICAgY29zdCArPSAoKG0wID49IDApID8gbTAgOiAtbTApOworICAgICAgICBtMSA9IG0wIC0gKG0xIDw8IDEpOworICAgICAgICBjb3N0ICs9ICgobTEgPj0gMCkgPyBtMSA6IC1tMSk7CisgICAgICAgIG0zID0gbTIgKyBtMzsKKyAgICAgICAgY29zdCArPSAoKG0zID49IDApID8gbTMgOiAtbTMpOworICAgICAgICBtMiA9IG0zIC0gKG0yIDw8IDEpOworICAgICAgICBjb3N0ICs9ICgobTIgPj0gMCkgPyBtMiA6IC1tMik7CisgICAgICAgIHByZXMgKz0gNDsKKworICAgICAgICBpZiAoKGNvc3QgPj4gMSkgPiBtaW5fY29zdCkgLyogZWFybHkgZHJvcCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChjb3N0ID4+IDEpOworICAgICAgICB9CisKKyAgICAgICAgay0tOworICAgIH0KKworICAgIHJldHVybiAoY29zdCA+PiAxKTsKK30KKworCit2b2lkIG1iX2ludHJhNHg0X3NlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50ICptaW5fY29zdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBBVkNQaWN0dXJlRGF0YSAqY3VyclBpYyA9IHZpZGVvLT5jdXJyUGljOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIGludCBwaXRjaCA9IGN1cnJQaWMtPnBpdGNoOworICAgIGludCBvcmdfcGl0Y2ggPSBjdXJySW5wdXQtPnBpdGNoOworICAgIGludCBvZmZzZXQ7CisgICAgdWludDggKmN1ckwsICpjb21wLCAqb3JnNCwgKm9yZzg7CisgICAgaW50IHkgPSB2aWRlby0+bWJfeSA8PCA0OworICAgIGludCB4ID0gdmlkZW8tPm1iX3ggPDwgNDsKKworICAgIGludCBiOCwgYjQsIGNvc3Q0eDQsIGJsa2lkeDsKKyAgICBpbnQgY29zdCA9IDA7CisgICAgaW50IG51bWNvZWY7CisgICAgaW50IGR1bW15ID0gMDsKKyAgICBpbnQgbWJfaW50cmEgPSBjdXJyTUItPm1iX2ludHJhOyAvLyBzYXZlIHRoZSBvcmlnaW5hbCB2YWx1ZQorCisgICAgb2Zmc2V0ID0geSAqIHBpdGNoICsgeDsKKworICAgIGN1ckwgPSBjdXJyUGljLT5TbCArIG9mZnNldDsKKyAgICBvcmc4ID0gY3VycklucHV0LT5ZQ2JDclswXSArIHkgKiBvcmdfcGl0Y2ggKyB4OworICAgIHZpZGVvLT5wcmVkX3BpdGNoID0gNDsKKworICAgIGNvc3QgPSAoaW50KSg2LjAgKiBlbmN2aWQtPmxhbWJkYV9tb2RlICsgMC40OTk5KTsKKyAgICBjb3N0IDw8PSAyOworCisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IDE7ICAvLyB0ZW1wb3Jhcnkgc2V0IHRoaXMgdG8gb25lIHRvIGVuYWJsZSB0aGUgSURDVAorICAgIC8vIG9wZXJhdGlvbiBpbnNpZGUgZGN0X2x1bWEKKworICAgIGZvciAoYjggPSAwOyBiOCA8IDQ7IGI4KyspCisgICAgeworICAgICAgICBjb21wID0gY3VyTDsKKyAgICAgICAgb3JnNCA9IG9yZzg7CisKKyAgICAgICAgZm9yIChiNCA9IDA7IGI0IDwgNDsgYjQrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVtiNF07CisgICAgICAgICAgICBjb3N0NHg0ID0gYmxrX2ludHJhNHg0X3NlYXJjaChlbmN2aWQsIGJsa2lkeCwgY29tcCwgb3JnNCk7CisgICAgICAgICAgICBjb3N0ICs9IGNvc3Q0eDQ7CisgICAgICAgICAgICBpZiAoY29zdCA+ICptaW5fY29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gbWJfaW50cmE7IC8vIHJlc3RvcmUgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgcmV0dXJuIDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZG8gcmVzaWR1ZSwgWGZybSwgUSwgaW52USwgaW52WGZybSwgcmVjb24gYW5kIHNhdmUgdGhlIERDVCBjb2Vmcy4qLworICAgICAgICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSBlbmN2aWQtPnByZWRfaTRbY3Vyck1CLT5pNE1vZGVbYmxraWR4XV07CisgICAgICAgICAgICBudW1jb2VmID0gZGN0X2x1bWEoZW5jdmlkLCBibGtpZHgsIGNvbXAsIG9yZzQsICZkdW1teSk7CisgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0gPSBudW1jb2VmOworICAgICAgICAgICAgaWYgKG51bWNvZWYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmNicDR4NCB8PSAoMSA8PCBibGtpZHgpOworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IGI4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGI0JjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29tcCArPSAoKHBpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgb3JnNCArPSAoKG9yZ19waXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbXAgKz0gNDsKKyAgICAgICAgICAgICAgICBvcmc0ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYjgmMSkKKyAgICAgICAgeworICAgICAgICAgICAgY3VyTCArPSAoKHBpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgICAgICBvcmc4ICs9ICgob3JnX3BpdGNoIDw8IDMpIC0gOCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdXJMICs9IDg7CisgICAgICAgICAgICBvcmc4ICs9IDg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyTUItPm1iX2ludHJhID0gbWJfaW50cmE7IC8vIHJlc3RvcmUgdGhlIHZhbHVlCisKKyAgICBpZiAoY29zdCA8ICptaW5fY29zdCkKKyAgICB7CisgICAgICAgICptaW5fY29zdCA9IGNvc3Q7CisgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX0k0OworICAgICAgICBjdXJyTUItPm1iX2ludHJhID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qIHNlYXJjaCBmb3IgaTQgbW9kZSBmb3IgYSA0eDQgYmxvY2sgKi8KK2ludCBibGtfaW50cmE0eDRfc2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBpbnQgYmxraWR4LCB1aW50OCAqY3VyLCB1aW50OCAqb3JnKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNOZWlnaGJvckF2YWlsYWJpbGl0eSBhdmFpbGFiaWxpdHk7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBib29sIHRvcF9sZWZ0ID0gRkFMU0U7CisgICAgaW50IHBpdGNoID0gdmlkZW8tPmN1cnJQaWMtPnBpdGNoOworICAgIHVpbnQ4IG1vZGVfYXZhaWxbQVZDTnVtSTRQcmVkTW9kZV07CisgICAgdWludDMyIHRlbXAsIERDOworICAgIHVpbnQ4ICpwcmVkOworICAgIGludCBvcmdfcGl0Y2ggPSBlbmN2aWQtPmN1cnJJbnB1dC0+cGl0Y2g7CisgICAgdWludDE2IG1pbl9jb3N0LCBjb3N0OworCisgICAgaW50IFBfeCwgUV94LCBSX3gsIFBfeSwgUV95LCBSX3ksIEQsIEQwLCBEMTsKKyAgICBpbnQgUDAsIFEwLCBSMCwgUzAsIFAxLCBRMSwgUjEsIFAyLCBRMjsKKyAgICB1aW50OCBQX0EsIFBfQiwgUF9DLCBQX0QsIFBfRSwgUF9GLCBQX0csIFBfSCwgUF9JLCBQX0osIFBfSywgUF9MLCBQX1g7CisgICAgaW50IHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNzsKKyAgICBpbnQgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NTsKKyAgICB1aW50MzIgdGVtcDEsIHRlbXAyOworCisgICAgaW50IGlwbW9kZSwgbW9zdFByb2JhYmxlTW9kZTsKKyAgICBpbnQgZml4ZWRjb3N0ID0gNCAqIGVuY3ZpZC0+bGFtYmRhX21vZGU7CisgICAgaW50IG1pbl9zYWQgPSAweDdGRkY7CisKKyAgICBhdmFpbGFiaWxpdHkubGVmdCA9IFRSVUU7CisgICAgYXZhaWxhYmlsaXR5LnRvcCA9IFRSVUU7CisgICAgaWYgKGJsa2lkeCA8PSAzKSAvKiB0b3Agcm93IGJsb2NrICAoIWJsb2NrX3kpICovCisgICAgeyAvKiBjaGVjayBhdmFpbGFiaWxpdHkgdXAgKi8KKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcCA9IHZpZGVvLT5pbnRyYUF2YWlsQiA7CisgICAgfQorICAgIGlmICghKGJsa2lkeCYweDMpKSAvKiBsZWZ0IGNvbHVtbiBibG9jayAoIWJsb2NrX3gpKi8KKyAgICB7IC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBsZWZ0ICovCisgICAgICAgIGF2YWlsYWJpbGl0eS5sZWZ0ID0gdmlkZW8tPmludHJhQXZhaWxBIDsKKyAgICB9CisgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IEJsa1RvcFJpZ2h0W2Jsa2lkeF07CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAyKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQjsKKyAgICB9CisgICAgZWxzZSBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9PSAzKQorICAgIHsKKyAgICAgICAgYXZhaWxhYmlsaXR5LnRvcF9yaWdodCA9IHZpZGVvLT5pbnRyYUF2YWlsQzsKKyAgICB9CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcCA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgdGVtcCA9ICoodWludDMyKikoY3VyIC0gcGl0Y2gpOworICAgICAgICBQX0EgPSB0ZW1wICYgMHhGRjsKKyAgICAgICAgUF9CID0gKHRlbXAgPj4gOCkgJiAweEZGOworICAgICAgICBQX0MgPSAodGVtcCA+PiAxNikgJiAweEZGOworICAgICAgICBQX0QgPSAodGVtcCA+PiAyNCkgJiAweEZGOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX0EgPSBQX0IgPSBQX0MgPSBQX0QgPSAxMjg7CisgICAgfQorCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3BfcmlnaHQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKHVpbnQzMiopKGN1ciAtIHBpdGNoICsgNCk7CisgICAgICAgIFBfRSA9IHRlbXAgJiAweEZGOworICAgICAgICBQX0YgPSAodGVtcCA+PiA4KSAmIDB4RkY7CisgICAgICAgIFBfRyA9ICh0ZW1wID4+IDE2KSAmIDB4RkY7CisgICAgICAgIFBfSCA9ICh0ZW1wID4+IDI0KSAmIDB4RkY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBfRSA9IFBfRiA9IFBfRyA9IFBfSCA9IDEyODsKKyAgICB9CisKKyAgICBpZiAoYXZhaWxhYmlsaXR5LmxlZnQgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGN1ci0tOworICAgICAgICBQX0kgPSAqY3VyOworICAgICAgICBQX0ogPSAqKGN1ciArPSBwaXRjaCk7CisgICAgICAgIFBfSyA9ICooY3VyICs9IHBpdGNoKTsKKyAgICAgICAgUF9MID0gKihjdXIgKyBwaXRjaCk7CisgICAgICAgIGN1ciAtPSAocGl0Y2ggPDwgMSk7CisgICAgICAgIGN1cisrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX0kgPSBQX0ogPSBQX0sgPSBQX0wgPSAxMjg7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgdG9wLWxlZnQgcGl4ZWwgaXMgYXZhaWxhYmxlICovCisgICAgaWYgKCgoYmxraWR4ID4gMykgJiYgKGJsa2lkeCYweDMpKSB8fCAoKGJsa2lkeCA+IDMpICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgIHx8ICgoYmxraWR4JjB4MykgJiYgdmlkZW8tPmludHJhQXZhaWxCKQorICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkKKyAgICB7CisgICAgICAgIHRvcF9sZWZ0ID0gVFJVRTsKKyAgICAgICAgUF9YID0gKihjdXIgLSBwaXRjaCAtIDEpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQX1ggPSAxMjg7CisgICAgfQorCisgICAgLy89PT09PSBJTlRSQSBQUkVESUNUSU9OIEZPUiA0eDQgQkxPQ0sgPT09PT0KKyAgICAvKiB2ZXJ0aWNhbCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsXSA9IDA7CisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9WZXJ0aWNhbF07CisKKyAgICAgICAgdGVtcCA9IChQX0QgPDwgMjQpIHwgKFBfQyA8PCAxNikgfCAoUF9CIDw8IDgpIHwgUF9BIDsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOyAvKiB3cml0ZSA0IGF0IGEgdGltZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9ICB0ZW1wOworICAgIH0KKyAgICAvKiBob3Jpem9udGFsICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF0gPSAwOworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfVXBdID0gMDsKKyAgICBpZiAoYXZhaWxhYmlsaXR5LmxlZnQpCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9Ib3Jpem9udGFsXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0hvcml6b250YWxdOworCisgICAgICAgIHRlbXAgPSBQX0kgfCAoUF9JIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisgICAgICAgIHRlbXAgPSBQX0ogfCAoUF9KIDw8IDgpOworICAgICAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICAgICB0ZW1wID0gUF9LIHwgKFBfSyA8PCA4KTsKKyAgICAgICAgdGVtcCA9IHRlbXAgfCAodGVtcCA8PCAxNik7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAgICAgdGVtcCA9IFBfTCB8IChQX0wgPDwgOCk7CisgICAgICAgIHRlbXAgPSB0ZW1wIHwgKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9VcF0gPSAxOworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9Ib3Jpem9udGFsX1VwXTsKKworICAgICAgICBRMCA9IChQX0ogKyBQX0sgKyAxKSA+PiAxOworICAgICAgICBRMSA9IChQX0ogKyAoUF9LIDw8IDEpICsgUF9MICsgMikgPj4gMjsKKyAgICAgICAgUDAgPSAoKFBfSSArIFBfSiArIDEpID4+IDEpOworICAgICAgICBQMSA9ICgoUF9JICsgKFBfSiA8PCAxKSArIFBfSyArIDIpID4+IDIpOworCisgICAgICAgIHRlbXAgPSBQMCB8IChQMSA8PCA4KTsgICAgICAvLyBbUDAgUDEgUTAgUTFdCisgICAgICAgIHRlbXAgfD0gKFEwIDw8IDE2KTsgICAgIC8vIFtRMCBRMSBSMCBET10KKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMjQpOyAgICAgLy8gW1IwIEQwIEQxIEQxXQorICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsgICAgICAvLyBbRDEgRDEgRDEgRDFdCisKKyAgICAgICAgRDAgPSAoUF9LICsgMyAqIFBfTCArIDIpID4+IDI7CisgICAgICAgIFIwID0gKFBfSyArIFBfTCArIDEpID4+IDE7CisKKyAgICAgICAgdGVtcCA9IFEwIHwgKFExIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChSMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQwIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIEQxID0gUF9MOworCisgICAgICAgIHRlbXAgPSBSMCB8IChEMCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoRDEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChEMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gRDEgfCAoRDEgPDwgOCk7CisgICAgICAgIHRlbXAgfD0gKHRlbXAgPDwgMTYpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgfQorICAgIC8qIERDICovCisgICAgbW9kZV9hdmFpbFtBVkNfSTRfRENdID0gMTsKKyAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9EQ107CisgICAgaWYgKGF2YWlsYWJpbGl0eS5sZWZ0KQorICAgIHsKKyAgICAgICAgREMgPSBQX0kgKyBQX0ogKyBQX0sgKyBQX0w7CisKKyAgICAgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gKFBfQSArIFBfQiArIFBfQyArIFBfRCArIERDICsgNCkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIERDID0gKERDICsgMikgPj4gMjsKKworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBEQyA9IChQX0EgKyBQX0IgKyBQX0MgKyBQX0QgKyAyKSA+PiAyOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERDID0gMTI4OworICAgIH0KKworICAgIHRlbXAgPSBEQyB8IChEQyA8PCA4KTsKKyAgICB0ZW1wID0gdGVtcCB8ICh0ZW1wIDw8IDE2KTsKKyAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKyAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgIC8qIERvd24tbGVmdCAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fTGVmdF0gPSAwOworCisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnRdID0gMTsKKworICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W0FWQ19JNF9EaWFnb25hbF9Eb3duX0xlZnRdOworCisgICAgICAgIHIwID0gUF9BOworICAgICAgICByMSA9IFBfQjsKKyAgICAgICAgcjIgPSBQX0M7CisgICAgICAgIHIzID0gUF9EOworCisgICAgICAgIHIwICs9IChyMSA8PCAxKTsKKyAgICAgICAgcjAgKz0gcjI7CisgICAgICAgIHIwICs9IDI7CisgICAgICAgIHIwID4+PSAyOworICAgICAgICByMSArPSAocjIgPDwgMSk7CisgICAgICAgIHIxICs9IHIzOworICAgICAgICByMSArPSAyOworICAgICAgICByMSA+Pj0gMjsKKworICAgICAgICBpZiAoYXZhaWxhYmlsaXR5LnRvcF9yaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgcjQgPSBQX0U7CisgICAgICAgICAgICByNSA9IFBfRjsKKyAgICAgICAgICAgIHI2ID0gUF9HOworICAgICAgICAgICAgcjcgPSBQX0g7CisKKyAgICAgICAgICAgIHIyICs9IChyMyA8PCAxKTsKKyAgICAgICAgICAgIHIyICs9IHI0OworICAgICAgICAgICAgcjIgKz0gMjsKKyAgICAgICAgICAgIHIyID4+PSAyOworICAgICAgICAgICAgcjMgKz0gKHI0IDw8IDEpOworICAgICAgICAgICAgcjMgKz0gcjU7CisgICAgICAgICAgICByMyArPSAyOworICAgICAgICAgICAgcjMgPj49IDI7CisgICAgICAgICAgICByNCArPSAocjUgPDwgMSk7CisgICAgICAgICAgICByNCArPSByNjsKKyAgICAgICAgICAgIHI0ICs9IDI7CisgICAgICAgICAgICByNCA+Pj0gMjsKKyAgICAgICAgICAgIHI1ICs9IChyNiA8PCAxKTsKKyAgICAgICAgICAgIHI1ICs9IHI3OworICAgICAgICAgICAgcjUgKz0gMjsKKyAgICAgICAgICAgIHI1ID4+PSAyOworICAgICAgICAgICAgcjYgKz0gKDMgKiByNyk7CisgICAgICAgICAgICByNiArPSAyOworICAgICAgICAgICAgcjYgPj49IDI7CisgICAgICAgICAgICB0ZW1wID0gcjAgfCAocjEgPDwgOCk7CisgICAgICAgICAgICB0ZW1wIHw9IChyMiA8PCAxNik7CisgICAgICAgICAgICB0ZW1wIHw9IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI0IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI1IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICAgICAgdGVtcCA9ICh0ZW1wID4+IDgpIHwgKHI2IDw8IDI0KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHIyICs9IChyMyAqIDMpOworICAgICAgICAgICAgcjIgKz0gMjsKKyAgICAgICAgICAgIHIyID4+PSAyOworICAgICAgICAgICAgcjMgPSAoKHIzIDw8IDIpICsgMik7CisgICAgICAgICAgICByMyA+Pj0gMjsKKworICAgICAgICAgICAgdGVtcCA9IHIwIHwgKHIxIDw8IDgpOworICAgICAgICAgICAgdGVtcCB8PSAocjIgPDwgMTYpOworICAgICAgICAgICAgdGVtcCB8PSAocjMgPDwgMjQpOworICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+PiA4KSB8IChyMyA8PCAyNCk7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIERvd24gUmlnaHQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9EaWFnb25hbF9Eb3duX1JpZ2h0XSA9IDA7CisgICAgLyogRGlhZ29uYWwgVmVydGljYWwgUmlnaHQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9SaWdodF0gPSAwOworICAgIC8qIEhvcml6b250YWwgRG93biAqLworICAgIG1vZGVfYXZhaWxbQVZDX0k0X0hvcml6b250YWxfRG93bl0gPSAwOworCisgICAgaWYgKHRvcF9sZWZ0ID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBEb3duIFJpZ2h0ICovCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X0RpYWdvbmFsX0Rvd25fUmlnaHRdID0gMTsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pNFtBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodF07CisKKyAgICAgICAgUV94ID0gKFBfQSArIDIgKiBQX0IgKyBQX0MgKyAyKSA+PiAyOworICAgICAgICBSX3ggPSAoUF9CICsgMiAqIFBfQyArIFBfRCArIDIpID4+IDI7CisgICAgICAgIFBfeCA9IChQX1ggKyAyICogUF9BICsgUF9CICsgMikgPj4gMjsKKyAgICAgICAgRCAgID0gKFBfQSArIDIgKiBQX1ggKyBQX0kgKyAyKSA+PiAyOworICAgICAgICBQX3kgPSAoUF9YICsgMiAqIFBfSSArIFBfSiArIDIpID4+IDI7CisgICAgICAgIFFfeSA9IChQX0kgKyAyICogUF9KICsgUF9LICsgMikgPj4gMjsKKyAgICAgICAgUl95ID0gKFBfSiArIDIgKiBQX0sgKyBQX0wgKyAyKSA+PiAyOworCisgICAgICAgIC8qIHdlIGNhbiBwYWNrIHRoZXNlICovCisgICAgICAgIHRlbXAgPSAgRCB8IChQX3ggPDwgOCk7ICAgLy9bRCAgIFBfeCBRX3ggUl94XQorICAgICAgICAvL1tQX3kgRCAgIFBfeCBRX3hdCisgICAgICAgIHRlbXAgfD0gKFFfeCA8PCAxNik7IC8vW1FfeSBQX3kgRCAgIFBfeF0KKyAgICAgICAgdGVtcCB8PSAoUl94IDw8IDI0KTsgIC8vW1JfeSBRX3kgUF95IEQgIF0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9ICBQX3kgfCAoRCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUF94IDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoUV94IDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSAgUV95IHwgKFBfeSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoRCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFBfeCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgICAgICB0ZW1wID0gUl95IHwgKFFfeSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUF95IDw8IDE2KTsKKyAgICAgICAgdGVtcCB8PSAoRCA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworCisgICAgICAgIC8qIERpYWdvbmFsIFZlcnRpY2FsIFJpZ2h0ICovCisgICAgICAgIG1vZGVfYXZhaWxbQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0XSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X1ZlcnRpY2FsX1JpZ2h0XTsKKworICAgICAgICBRMCA9IFBfQSArIFBfQiArIDE7CisgICAgICAgIFIwID0gUF9CICsgUF9DICsgMTsKKyAgICAgICAgUzAgPSBQX0MgKyBQX0QgKyAxOworICAgICAgICBQMCA9IFBfWCArIFBfQSArIDE7CisgICAgICAgIEQgPSAoUF9JICsgMiAqIFBfWCArIFBfQSArIDIpID4+IDI7CisKKyAgICAgICAgUDEgPSAoUDAgKyBRMCkgPj4gMjsKKyAgICAgICAgUTEgPSAoUTAgKyBSMCkgPj4gMjsKKyAgICAgICAgUjEgPSAoUjAgKyBTMCkgPj4gMjsKKworICAgICAgICBQMCA+Pj0gMTsKKyAgICAgICAgUTAgPj49IDE7CisgICAgICAgIFIwID4+PSAxOworICAgICAgICBTMCA+Pj0gMTsKKworICAgICAgICBQMiA9IChQX1ggKyAyICogUF9JICsgUF9KICsgMikgPj4gMjsKKyAgICAgICAgUTIgPSAoUF9JICsgMiAqIFBfSiArIFBfSyArIDIpID4+IDI7CisKKyAgICAgICAgdGVtcCA9ICBQMCB8IChRMCA8PCA4KTsgIC8vW1AwIFEwIFIwIFMwXQorICAgICAgICAvL1tEICBQMSBRMSBSMV0KKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMTYpOyAvL1tQMiBQMCBRMCBSMF0KKyAgICAgICAgdGVtcCB8PSAoUzAgPDwgMjQpOyAvL1tRMiBEICBQMSBRMV0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9ICB0ZW1wOworCisgICAgICAgIHRlbXAgPSAgRCB8IChQMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUTEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChSMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFAyIHwgKFAwIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChRMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFIwIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSAgdGVtcDsKKworICAgICAgICB0ZW1wID0gUTIgfCAoRCA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUDEgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChRMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gIHRlbXA7CisKKworICAgICAgICAvKiBIb3Jpem9udGFsIERvd24gKi8KKyAgICAgICAgbW9kZV9hdmFpbFtBVkNfSTRfSG9yaXpvbnRhbF9Eb3duXSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X0hvcml6b250YWxfRG93bl07CisKKworICAgICAgICBRMiA9IChQX0EgKyAyICogUF9CICsgUF9DICsgMikgPj4gMjsKKyAgICAgICAgUDIgPSAoUF9YICsgMiAqIFBfQSArIFBfQiArIDIpID4+IDI7CisgICAgICAgIEQgPSAoUF9JICsgMiAqIFBfWCArIFBfQSArIDIpID4+IDI7CisgICAgICAgIFAwID0gUF9YICsgUF9JICsgMTsKKyAgICAgICAgUTAgPSBQX0kgKyBQX0ogKyAxOworICAgICAgICBSMCA9IFBfSiArIFBfSyArIDE7CisgICAgICAgIFMwID0gUF9LICsgUF9MICsgMTsKKworICAgICAgICBQMSA9IChQMCArIFEwKSA+PiAyOworICAgICAgICBRMSA9IChRMCArIFIwKSA+PiAyOworICAgICAgICBSMSA9IChSMCArIFMwKSA+PiAyOworCisgICAgICAgIFAwID4+PSAxOworICAgICAgICBRMCA+Pj0gMTsKKyAgICAgICAgUjAgPj49IDE7CisgICAgICAgIFMwID4+PSAxOworCisKKyAgICAgICAgLyogd2UgY2FuIHBhY2sgdGhlc2UgKi8KKyAgICAgICAgdGVtcCA9IFAwIHwgKEQgPDwgOCk7ICAgLy9bUDAgRCAgUDIgUTJdCisgICAgICAgIC8vW1EwIFAxIFAwIEQgXQorICAgICAgICB0ZW1wIHw9IChQMiA8PCAxNik7ICAvL1tSMCBRMSBRMCBQMV0KKyAgICAgICAgdGVtcCB8PSAoUTIgPDwgMjQpOyAvL1tTMCBSMSBSMCBRMV0KKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFEwIHwgKFAxIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChQMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKEQgPDwgMjQpOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXA7CisKKyAgICAgICAgdGVtcCA9IFIwIHwgKFExIDw8IDgpOworICAgICAgICB0ZW1wIHw9IChRMCA8PCAxNik7CisgICAgICAgIHRlbXAgfD0gKFAxIDw8IDI0KTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArPSA0KSkgPSB0ZW1wOworCisgICAgICAgIHRlbXAgPSBTMCB8IChSMSA8PCA4KTsKKyAgICAgICAgdGVtcCB8PSAoUjAgPDwgMTYpOworICAgICAgICB0ZW1wIHw9IChRMSA8PCAyNCk7CisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDsKKworICAgIH0KKworICAgIC8qIHZlcnRpY2FsIGxlZnQgKi8KKyAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9MZWZ0XSA9IDA7CisgICAgaWYgKGF2YWlsYWJpbGl0eS50b3ApCisgICAgeworICAgICAgICBtb2RlX2F2YWlsW0FWQ19JNF9WZXJ0aWNhbF9MZWZ0XSA9IDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaTRbQVZDX0k0X1ZlcnRpY2FsX0xlZnRdOworCisgICAgICAgIHgwID0gUF9BICsgUF9CICsgMTsKKyAgICAgICAgeDEgPSBQX0IgKyBQX0MgKyAxOworICAgICAgICB4MiA9IFBfQyArIFBfRCArIDE7CisgICAgICAgIGlmIChhdmFpbGFiaWxpdHkudG9wX3JpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICB4MyA9IFBfRCArIFBfRSArIDE7CisgICAgICAgICAgICB4NCA9IFBfRSArIFBfRiArIDE7CisgICAgICAgICAgICB4NSA9IFBfRiArIFBfRyArIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB4MyA9IHg0ID0geDUgPSAoUF9EIDw8IDEpICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAxID0gKHgwID4+IDEpOworICAgICAgICB0ZW1wMSB8PSAoKHgxID4+IDEpIDw8IDgpOworICAgICAgICB0ZW1wMSB8PSAoKHgyID4+IDEpIDw8IDE2KTsKKyAgICAgICAgdGVtcDEgfD0gKCh4MyA+PiAxKSA8PCAyNCk7CisKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHRlbXAxOworCisgICAgICAgIHRlbXAyID0gKCh4MCArIHgxKSA+PiAyKTsKKyAgICAgICAgdGVtcDIgfD0gKCgoeDEgKyB4MikgPj4gMikgPDwgOCk7CisgICAgICAgIHRlbXAyIHw9ICgoKHgyICsgeDMpID4+IDIpIDw8IDE2KTsKKyAgICAgICAgdGVtcDIgfD0gKCgoeDMgKyB4NCkgPj4gMikgPDwgMjQpOworCisgICAgICAgICooKHVpbnQzMiopKHByZWQgKz0gNCkpID0gdGVtcDI7CisKKyAgICAgICAgdGVtcDEgPSAodGVtcDEgPj4gOCkgfCAoKHg0ID4+IDEpIDw8IDI0KTsgICAvKiByb3RhdGUgb3V0IG9sZCB2YWx1ZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXAxOworCisgICAgICAgIHRlbXAyID0gKHRlbXAyID4+IDgpIHwgKCgoeDQgKyB4NSkgPj4gMikgPDwgMjQpOyAvKiByb3RhdGUgb3V0IG9sZCB2YWx1ZSAqLworICAgICAgICAqKCh1aW50MzIqKShwcmVkICs9IDQpKSA9IHRlbXAyOworICAgIH0KKworICAgIC8vPT09PT0gTE9PUCBPVkVSIEFMTCA0eDQgSU5UUkEgUFJFRElDVElPTiBNT0RFUyA9PT09PQorICAgIC8vIGNhbiByZS1vcmRlciB0aGUgc2VhcmNoIGhlcmUgaW5zdGVhZCBvZiBnb2luZyBpbiBvcmRlcgorCisgICAgLy8gZmluZCBtb3N0IHByb2JhYmxlIG1vZGUKKyAgICBlbmN2aWQtPm1vc3RQcm9iYWJsZUk0TW9kZVtibGtpZHhdID0gbW9zdFByb2JhYmxlTW9kZSA9IEZpbmRNb3N0UHJvYmFibGVJNE1vZGUodmlkZW8sIGJsa2lkeCk7CisKKyAgICBtaW5fY29zdCA9IDB4RkZGRjsKKworICAgIGZvciAoaXBtb2RlID0gMDsgaXBtb2RlIDwgQVZDTnVtSTRQcmVkTW9kZTsgaXBtb2RlKyspCisgICAgeworICAgICAgICBpZiAobW9kZV9hdmFpbFtpcG1vZGVdID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvc3QgID0gKGlwbW9kZSA9PSBtb3N0UHJvYmFibGVNb2RlKSA/IDAgOiBmaXhlZGNvc3Q7CisgICAgICAgICAgICBwcmVkID0gZW5jdmlkLT5wcmVkX2k0W2lwbW9kZV07CisKKyAgICAgICAgICAgIGNvc3RfaTQob3JnLCBvcmdfcGl0Y2gsIHByZWQsICZjb3N0KTsKKworICAgICAgICAgICAgaWYgKGNvc3QgPCBtaW5fY29zdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVtibGtpZHhdID0gKEFWQ0ludHJhNHg0UHJlZE1vZGUpaXBtb2RlOworICAgICAgICAgICAgICAgIG1pbl9jb3N0ICAgPSBjb3N0OworICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBjb3N0IC0gKChpcG1vZGUgPT0gbW9zdFByb2JhYmxlTW9kZSkgPyAwIDogZml4ZWRjb3N0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChibGtpZHggPT0gMCkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+aTRfc2FkID0gbWluX3NhZDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5pNF9zYWQgKz0gbWluX3NhZDsKKyAgICB9CisKKyAgICByZXR1cm4gbWluX2Nvc3Q7Cit9CisKK2ludCBGaW5kTW9zdFByb2JhYmxlSTRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIGludCBibGtpZHgpCit7CisgICAgaW50IGRjT25seVByZWRpY3Rpb25GbGFnOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQiwgcHJlZEludHJhNHg0UHJlZE1vZGU7CisKKworICAgIGRjT25seVByZWRpY3Rpb25GbGFnID0gMDsKKyAgICBpZiAoYmxraWR4JjB4MykKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gY3Vyck1CLT5pNE1vZGVbYmxraWR4LTFdOyAvLyBibG9jayB0byB0aGUgbGVmdAorICAgIH0KKyAgICBlbHNlIC8qIGZvciBibGsgMCwgNCwgOCwgMTIgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0uaTRNb2RlW2Jsa2lkeCArIDNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgZ290byBQUkVEX1JFU1VMVF9SRUFEWTsgIC8vIHNraXAgYmVsb3cKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChibGtpZHggPj4gMikKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gY3Vyck1CLT5pNE1vZGVbYmxraWR4LTRdOyAvLyBibG9jayBhYm92ZQorICAgIH0KKyAgICBlbHNlIC8qIGJsb2NrIDAsIDEsIDIsIDMgKi8KKyAgICB7CisgICAgICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0uaTRNb2RlW2Jsa2lkeCsxMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKK1BSRURfUkVTVUxUX1JFQURZOgorICAgIGlmIChkY09ubHlQcmVkaWN0aW9uRmxhZykKKyAgICB7CisgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgfQorCisgICAgcHJlZEludHJhNHg0UHJlZE1vZGUgPSBBVkNfTUlOKGludHJhNHg0UHJlZE1vZGVBLCBpbnRyYTR4NFByZWRNb2RlQik7CisKKyAgICByZXR1cm4gcHJlZEludHJhNHg0UHJlZE1vZGU7Cit9CisKK3ZvaWQgY29zdF9pNCh1aW50OCAqb3JnLCBpbnQgb3JnX3BpdGNoLCB1aW50OCAqcHJlZCwgdWludDE2ICpjb3N0KQoreworICAgIGludCBrOworICAgIGludDE2IHJlc1sxNl0sICpwcmVzOworICAgIGludCBtMCwgbTEsIG0yLCBtMywgdG1wMTsKKyAgICBpbnQgc2F0ZCA9IDA7CisKKyAgICBwcmVzID0gcmVzOworICAgIC8vIGhvcml6b250YWwgdHJhbnNmb3JtCisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBvcmdbMF0gLSBwcmVkWzBdOworICAgICAgICBtMyA9IG9yZ1szXSAtIHByZWRbM107CisgICAgICAgIG0wICs9IG0zOworICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICBtMSA9IG9yZ1sxXSAtIHByZWRbMV07CisgICAgICAgIG0yID0gb3JnWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgbTEgKz0gbTI7CisgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICBwcmVzWzJdID0gbTAgLSBtMTsKKyAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgIG9yZyArPSBvcmdfcGl0Y2g7CisgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgcHJlZCArPSA0OworICAgICAgICBrLS07CisgICAgfQorICAgIC8qIHZlcnRpY2FsIHRyYW5zZm9ybSAqLworICAgIHByZXMgPSByZXM7CisgICAgayA9IDQ7CisgICAgd2hpbGUgKGsgPiAwKQorICAgIHsKKyAgICAgICAgbTAgPSBwcmVzWzBdOworICAgICAgICBtMyA9IHByZXNbMTJdOworICAgICAgICBtMCArPSBtMzsKKyAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgbTEgPSBwcmVzWzRdOworICAgICAgICBtMiA9IHByZXNbOF07CisgICAgICAgIG0xICs9IG0yOworICAgICAgICBtMiA9IG0xIC0gKG0yIDw8IDEpOworICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgcHJlc1s4XSA9IG0wIC0gbTE7CisgICAgICAgIHByZXNbNF0gPSBtMiArIG0zOworICAgICAgICBwcmVzWzEyXSA9IG0zIC0gbTI7CisKKyAgICAgICAgcHJlcysrOworICAgICAgICBrLS07CisKKyAgICB9CisKKyAgICBwcmVzID0gcmVzOworICAgIGsgPSA0OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBzYXRkICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIGstLTsKKyAgICB9CisKKyAgICBzYXRkID0gKHNhdGQgKyAxKSA+PiAxOworICAgICpjb3N0ICs9IHNhdGQ7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGNocm9tYV9pbnRyYV9zZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY3R1cmVEYXRhICpjdXJyUGljID0gdmlkZW8tPmN1cnJQaWM7CisKKyAgICBpbnQgeF9wb3MgPSB2aWRlby0+bWJfeCA8PCAzOworICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYl95IDw8IDM7CisgICAgaW50IHBpdGNoID0gY3VyclBpYy0+cGl0Y2ggPj4gMTsKKyAgICBpbnQgb2Zmc2V0ID0geV9wb3MgKiBwaXRjaCArIHhfcG9zOworCisgICAgdWludDggKmNvbXBfcmVmX3gsICpjb21wX3JlZl95LCAqcHJlZDsKKyAgICBpbnQgIHN1bV94MCwgc3VtX3gxLCBzdW1feTAsIHN1bV95MTsKKyAgICBpbnQgcHJlZF8wWzJdLCBwcmVkXzFbMl0sIHByZWRfMlsyXSwgcHJlZF8zWzJdOworICAgIHVpbnQzMiBwcmVkX2EsIHByZWRfYiwgcHJlZF9jLCBwcmVkX2Q7CisgICAgaW50IGksIGosIGNvbXBvbmVudDsKKyAgICBpbnQgYV8xNiwgYiwgYywgZmFjdG9yX2MsIHRvcGxlZnQ7CisgICAgaW50IEgsIFYsIHZhbHVlOworICAgIHVpbnQ4ICpjb21wX3JlZl94MCwgKmNvbXBfcmVmX3gxLCAgKmNvbXBfcmVmX3kwLCAqY29tcF9yZWZfeTE7CisKKyAgICB1aW50OCAqY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgdWludDggKmN1ckNyID0gY3VyclBpYy0+U2NyICsgb2Zmc2V0OworCisgICAgdWludDggKm9yZ0NiLCAqb3JnQ3I7CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBpbnQgb3JnX3BpdGNoOworICAgIGludCBjb3N0LCBtaW5jb3N0OworCisgICAgLyogZXZhbHVhdGUgREMgbW9kZSAqLworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEIgJiB2aWRlby0+aW50cmFBdmFpbEEpCisgICAgeworICAgICAgICBjb21wX3JlZl94ID0gY3VyQ2IgLSBwaXRjaDsKKyAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNiIC0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgY29tcF9yZWZfeCArPSA0OworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MCA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDEgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfMVtpXSA9IChzdW1feDEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBzdW1feTAgPSAqY29tcF9yZWZfeTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgc3VtX3kxID0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKworICAgICAgICAgICAgcHJlZF8yW2ldID0gKHN1bV95MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIHByZWRfMFtpXSA9IChzdW1feTAgKyBzdW1feDAgKyA0KSA+PiAzOworICAgICAgICAgICAgcHJlZF8zW2ldID0gKHN1bV95MSArIHN1bV94MSArIDQpID4+IDM7CisKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIHBpdGNoOworICAgICAgICAgICAgY29tcF9yZWZfeSA9IGN1ckNyIC0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1bV95MCA9ICpjb21wX3JlZl95OworICAgICAgICAgICAgc3VtX3kwICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTAgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MCArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBzdW1feTEgPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworICAgICAgICAgICAgc3VtX3kxICs9ICooY29tcF9yZWZfeSArPSBwaXRjaCk7CisgICAgICAgICAgICBzdW1feTEgKz0gKihjb21wX3JlZl95ICs9IHBpdGNoKTsKKyAgICAgICAgICAgIHN1bV95MSArPSAqKGNvbXBfcmVmX3kgKz0gcGl0Y2gpOworCisgICAgICAgICAgICBwcmVkXzBbaV0gPSBwcmVkXzFbaV0gPSAoc3VtX3kwICsgMikgPj4gMjsKKyAgICAgICAgICAgIHByZWRfMltpXSA9IHByZWRfM1tpXSA9IChzdW1feTEgKyAyKSA+PiAyOworCisgICAgICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwcmVkX2EgPSAqKCh1aW50MzIqKWNvbXBfcmVmX3gpOworICAgICAgICAgICAgY29tcF9yZWZfeCArPSA0OworICAgICAgICAgICAgcHJlZF9iID0gKHByZWRfYSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICY9IDB4RkYwMEZGOworICAgICAgICAgICAgcHJlZF9hICs9IHByZWRfYjsKKyAgICAgICAgICAgIHByZWRfYSArPSAocHJlZF9hID4+IDE2KTsKKyAgICAgICAgICAgIHN1bV94MCA9IHByZWRfYSAmIDB4RkZGRjsKKworICAgICAgICAgICAgcHJlZF9hID0gKigodWludDMyKiljb21wX3JlZl94KTsKKyAgICAgICAgICAgIHByZWRfYiA9IChwcmVkX2EgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHByZWRfYSArPSBwcmVkX2I7CisgICAgICAgICAgICBwcmVkX2EgKz0gKHByZWRfYSA+PiAxNik7CisgICAgICAgICAgICBzdW1feDEgPSBwcmVkX2EgJiAweEZGRkY7CisKKyAgICAgICAgICAgIHByZWRfMFtpXSA9IHByZWRfMltpXSA9IChzdW1feDAgKyAyKSA+PiAyOworICAgICAgICAgICAgcHJlZF8xW2ldID0gcHJlZF8zW2ldID0gKHN1bV94MSArIDIpID4+IDI7CisKKyAgICAgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIHBpdGNoOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHByZWRfMFswXSA9IHByZWRfMFsxXSA9IHByZWRfMVswXSA9IHByZWRfMVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkXzJbMF0gPSBwcmVkXzJbMV0gPSBwcmVkXzNbMF0gPSBwcmVkXzNbMV0gPSAxMjg7CisgICAgfQorCisgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfRENdOworCisgICAgcHJlZF9hID0gcHJlZF8wWzBdOworICAgIHByZWRfYiA9IHByZWRfMVswXTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgOCk7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgMTYpOworCisgICAgcHJlZF9jID0gcHJlZF8wWzFdOworICAgIHByZWRfZCA9IHByZWRfMVsxXTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCA4KTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCAxNik7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgOCk7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgMTYpOworCisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSAvKiA0IGxpbmVzICovCisgICAgeworICAgICAgICAqKCh1aW50MzIqKXByZWQpID0gcHJlZF9hOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9jOworICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfZDsKKyAgICAgICAgcHJlZCArPSAxNjsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgfQorCisgICAgcHJlZF9hID0gcHJlZF8yWzBdOworICAgIHByZWRfYiA9IHByZWRfM1swXTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgOCk7CisgICAgcHJlZF9iIHw9IChwcmVkX2IgPDwgMTYpOworCisgICAgcHJlZF9jID0gcHJlZF8yWzFdOworICAgIHByZWRfZCA9IHByZWRfM1sxXTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCA4KTsKKyAgICBwcmVkX2MgfD0gKHByZWRfYyA8PCAxNik7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgOCk7CisgICAgcHJlZF9kIHw9IChwcmVkX2QgPDwgMTYpOworCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgLyogNCBsaW5lcyAqLworICAgIHsKKyAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDQpKSA9IHByZWRfYjsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYzsKKyAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2Q7CisgICAgICAgIHByZWQgKz0gMTY7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgIH0KKworICAgIC8qIHByZWRpY3QgaG9yaXpvbnRhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDciAtIDE7CisgICAgICAgIHByZWQgPSBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0hvcml6b250YWxdOworCisgICAgICAgIGZvciAoaSA9IDQ7IGkgPCA2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJlZF9hID0gKmNvbXBfcmVmX3k7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeSArPSBwaXRjaDsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9hOworCisgICAgICAgICAgICAgICAgcHJlZF9hID0gKmNvbXBfcmVmX3g7CisgICAgICAgICAgICAgICAgY29tcF9yZWZfeCArPSBwaXRjaDsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCA4KTsKKyAgICAgICAgICAgICAgICBwcmVkX2EgfD0gKHByZWRfYSA8PCAxNik7CisgICAgICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDgpKSA9IHByZWRfYTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgMTIpKSA9IHByZWRfYTsKKworICAgICAgICAgICAgICAgIHByZWQgKz0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB2ZXJ0aWNhbCBtb2RlICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICB7CisgICAgICAgIGNvbXBfcmVmX3ggPSBjdXJDYiAtIHBpdGNoOworICAgICAgICBjb21wX3JlZl95ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfVmVydGljYWxdOworCisgICAgICAgIHByZWRfYSA9ICooKHVpbnQzMiopY29tcF9yZWZfeCk7CisgICAgICAgIHByZWRfYiA9ICooKHVpbnQzMiopKGNvbXBfcmVmX3ggKyA0KSk7CisgICAgICAgIHByZWRfYyA9ICooKHVpbnQzMiopY29tcF9yZWZfeSk7CisgICAgICAgIHByZWRfZCA9ICooKHVpbnQzMiopKGNvbXBfcmVmX3kgKyA0KSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHByZWQgKyA0KSkgPSBwcmVkX2I7CisgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgOCkpID0gcHJlZF9jOworICAgICAgICAgICAgKigodWludDMyKikocHJlZCArIDEyKSkgPSBwcmVkX2Q7CisgICAgICAgICAgICBwcmVkICs9IDE2OworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW50cmFfQ2hyb21hX1BsYW5lICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEIgJiYgdmlkZW8tPmludHJhQXZhaWxEKQorICAgIHsKKyAgICAgICAgY29tcF9yZWZfeCA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDYiAtIDE7CisgICAgICAgIHRvcGxlZnQgPSBjdXJDYlstcGl0Y2gtMV07CisKKyAgICAgICAgcHJlZCA9IGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfUGxhbmVdOworICAgICAgICBmb3IgKGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDI7IGNvbXBvbmVudCsrKQorICAgICAgICB7CisgICAgICAgICAgICBIID0gViA9IDA7CisgICAgICAgICAgICBjb21wX3JlZl94MCA9IGNvbXBfcmVmX3ggKyA0OworICAgICAgICAgICAgY29tcF9yZWZfeDEgPSBjb21wX3JlZl94ICsgMjsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kwID0gY29tcF9yZWZfeSArIChwaXRjaCA8PCAyKTsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kxID0gY29tcF9yZWZfeSArIChwaXRjaCA8PCAxKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gKmNvbXBfcmVmX3gxLS0pOworICAgICAgICAgICAgICAgIFYgKz0gaSAqICgqY29tcF9yZWZfeTAgLSAqY29tcF9yZWZfeTEpOworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kwICs9IHBpdGNoOworICAgICAgICAgICAgICAgIGNvbXBfcmVmX3kxIC09IHBpdGNoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSCArPSBpICogKCpjb21wX3JlZl94MCsrIC0gdG9wbGVmdCk7CisgICAgICAgICAgICBWICs9IGkgKiAoKmNvbXBfcmVmX3kwIC0gKmNvbXBfcmVmX3kxKTsKKworICAgICAgICAgICAgYV8xNiA9ICgoKihjb21wX3JlZl94ICsgNykgKyAqKGNvbXBfcmVmX3kgKyA3ICogcGl0Y2gpKSA8PCA0KSArIDE2OworICAgICAgICAgICAgYiA9ICgxNyAqIEggKyAxNikgPj4gNTsKKyAgICAgICAgICAgIGMgPSAoMTcgKiBWICsgMTYpID4+IDU7CisKKyAgICAgICAgICAgIHByZWRfYSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSA0OyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyA9IGFfMTYgKyBjICogKHByZWRfYSsrIC0gMyk7CisKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgLT0gMyAqIGI7CisKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgOCk7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgfD0gKHZhbHVlIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKigodWludDMyKilwcmVkKSA9IHByZWRfYjsKKworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGZhY3Rvcl9jID4+IDU7CisgICAgICAgICAgICAgICAgICAgIGZhY3Rvcl9jICs9IGI7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICBwcmVkX2IgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmYWN0b3JfYyA+PiA1OworICAgICAgICAgICAgICAgICAgICBmYWN0b3JfYyArPSBiOworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9iIHw9ICh2YWx1ZSA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZmFjdG9yX2MgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yX2MgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgIHByZWRfYiB8PSAodmFsdWUgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKShwcmVkICsgNCkpID0gcHJlZF9iOworICAgICAgICAgICAgICAgICAgICBwcmVkICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJlZCAtPSAxMjA7IC8qIHBvaW50IHRvIGNyICovCisgICAgICAgICAgICBjb21wX3JlZl94ID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgICAgIGNvbXBfcmVmX3kgPSBjdXJDciAtIDE7CisgICAgICAgICAgICB0b3BsZWZ0ID0gY3VyQ3JbLXBpdGNoLTFdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogbm93IGV2YWx1YXRlIGl0ICovCisKKyAgICBvcmdfcGl0Y2ggPSAoY3VycklucHV0LT5waXRjaCkgPj4gMTsKKyAgICBvZmZzZXQgPSB4X3BvcyArIHlfcG9zICogb3JnX3BpdGNoOworCisgICAgb3JnQ2IgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0OworICAgIG9yZ0NyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgIG1pbmNvc3QgPSAweDdmZmZmZmZmOworICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX0RDXSwgbWluY29zdCk7CisgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgIHsKKyAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19EQzsKKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBKQorICAgIHsKKyAgICAgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfSG9yaXpvbnRhbF0sIG1pbmNvc3QpOworICAgICAgICBpZiAoY29zdCA8IG1pbmNvc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbmNvc3QgPSBjb3N0OworICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0hvcml6b250YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgY29zdCA9IFNBVERDaHJvbWEob3JnQ2IsIG9yZ0NyLCBvcmdfcGl0Y2gsIGVuY3ZpZC0+cHJlZF9pY1tBVkNfSUNfVmVydGljYWxdLCBtaW5jb3N0KTsKKyAgICAgICAgaWYgKGNvc3QgPCBtaW5jb3N0KQorICAgICAgICB7CisgICAgICAgICAgICBtaW5jb3N0ID0gY29zdDsKKyAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19WZXJ0aWNhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkKKyAgICB7CisgICAgICAgIGNvc3QgPSBTQVREQ2hyb21hKG9yZ0NiLCBvcmdDciwgb3JnX3BpdGNoLCBlbmN2aWQtPnByZWRfaWNbQVZDX0lDX1BsYW5lXSwgbWluY29zdCk7CisgICAgICAgIGlmIChjb3N0IDwgbWluY29zdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluY29zdCA9IGNvc3Q7CisgICAgICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybiA7Cit9CisKKworaW50IFNBVERDaHJvbWEodWludDggKm9yZ0NiLCB1aW50OCAqb3JnQ3IsIGludCBvcmdfcGl0Y2gsIHVpbnQ4ICpwcmVkLCBpbnQgbWluX2Nvc3QpCit7CisgICAgaW50IGNvc3Q7CisgICAgLyogZmlyc3QgdGFrZSBkaWZmZXJlbmNlIGJldHdlZW4gb3JnQ2IsIG9yZ0NyIGFuZCBwcmVkICovCisgICAgaW50MTYgcmVzWzEyOF0sICpwcmVzOyAvLyByZXNpZHVlCisgICAgaW50IG0wLCBtMSwgbTIsIG0zLCB0bXAxOworICAgIGludCBqLCBrOworCisgICAgcHJlcyA9IHJlczsKKyAgICBvcmdfcGl0Y2ggLT0gODsKKyAgICAvLyBob3Jpem9udGFsIHRyYW5zZm9ybQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgeworICAgICAgICBrID0gMjsKKyAgICAgICAgd2hpbGUgKGsgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBtMCA9IG9yZ0NiWzBdIC0gcHJlZFswXTsKKyAgICAgICAgICAgIG0zID0gb3JnQ2JbM10gLSBwcmVkWzNdOworICAgICAgICAgICAgbTAgKz0gbTM7CisgICAgICAgICAgICBtMyA9IG0wIC0gKG0zIDw8IDEpOworICAgICAgICAgICAgbTEgPSBvcmdDYlsxXSAtIHByZWRbMV07CisgICAgICAgICAgICBtMiA9IG9yZ0NiWzJdIC0gcHJlZFsyXTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syXSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzFdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbM10gPSBtMyAtIG0yOworCisgICAgICAgICAgICBvcmdDYiArPSA0OworICAgICAgICAgICAgcHJlcyArPSA0OworICAgICAgICAgICAgcHJlZCArPSA0OworICAgICAgICAgICAgay0tOworICAgICAgICB9CisgICAgICAgIG9yZ0NiICs9IG9yZ19waXRjaDsKKyAgICAgICAgayA9IDI7CisgICAgICAgIHdoaWxlIChrID4gMCkKKyAgICAgICAgeworICAgICAgICAgICAgbTAgPSBvcmdDclswXSAtIHByZWRbMF07CisgICAgICAgICAgICBtMyA9IG9yZ0NyWzNdIC0gcHJlZFszXTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gb3JnQ3JbMV0gLSBwcmVkWzFdOworICAgICAgICAgICAgbTIgPSBvcmdDclsyXSAtIHByZWRbMl07CisgICAgICAgICAgICBtMSArPSBtMjsKKyAgICAgICAgICAgIG0yID0gbTEgLSAobTIgPDwgMSk7CisgICAgICAgICAgICBwcmVzWzBdID0gbTAgKyBtMTsKKyAgICAgICAgICAgIHByZXNbMl0gPSBtMCAtIG0xOworICAgICAgICAgICAgcHJlc1sxXSA9IG0yICsgbTM7CisgICAgICAgICAgICBwcmVzWzNdID0gbTMgLSBtMjsKKworICAgICAgICAgICAgb3JnQ3IgKz0gNDsKKyAgICAgICAgICAgIHByZXMgKz0gNDsKKyAgICAgICAgICAgIHByZWQgKz0gNDsKKyAgICAgICAgICAgIGstLTsKKyAgICAgICAgfQorICAgICAgICBvcmdDciArPSBvcmdfcGl0Y2g7CisgICAgfQorCisgICAgLyogdmVydGljYWwgdHJhbnNmb3JtICovCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICB7CisgICAgICAgIHByZXMgPSByZXMgKyAoaiA8PCA2KTsKKyAgICAgICAgayA9IDE2OworICAgICAgICB3aGlsZSAoayA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIG0wID0gcHJlc1swXTsKKyAgICAgICAgICAgIG0zID0gcHJlc1szPDw0XTsKKyAgICAgICAgICAgIG0wICs9IG0zOworICAgICAgICAgICAgbTMgPSBtMCAtIChtMyA8PCAxKTsKKyAgICAgICAgICAgIG0xID0gcHJlc1sxPDw0XTsKKyAgICAgICAgICAgIG0yID0gcHJlc1syPDw0XTsKKyAgICAgICAgICAgIG0xICs9IG0yOworICAgICAgICAgICAgbTIgPSBtMSAtIChtMiA8PCAxKTsKKyAgICAgICAgICAgIHByZXNbMF0gPSBtMCArIG0xOworICAgICAgICAgICAgcHJlc1syPDw0XSA9IG0wIC0gbTE7CisgICAgICAgICAgICBwcmVzWzE8PDRdID0gbTIgKyBtMzsKKyAgICAgICAgICAgIHByZXNbMzw8NF0gPSBtMyAtIG0yOworCisgICAgICAgICAgICBwcmVzKys7CisgICAgICAgICAgICBrLS07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgc3VtIG9mIGFic29sdXRlIHZhbHVlICovCisgICAgcHJlcyA9IHJlczsKKyAgICBjb3N0ID0gMDsKKyAgICBrID0gMTI4OworICAgIHdoaWxlIChrID4gMCkKKyAgICB7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIHRtcDEgPSAqcHJlcysrOworICAgICAgICBjb3N0ICs9ICgodG1wMSA+PSAwKSA/IHRtcDEgOiAtdG1wMSk7CisgICAgICAgIGsgLT0gODsKKyAgICAgICAgaWYgKGNvc3QgPiBtaW5fY29zdCkgLyogZWFybHkgZHJvcCBvdXQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIGNvc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY29zdDsKK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBvbGQgY29kZSwgdW51c2VkCisvKiBmaW5kIHRoZSBiZXN0IGludHJhIG1vZGUgYmFzZWQgb24gb3JpZ2luYWwgKHVuZW5jb2RlZCkgZnJhbWUgKi8KKy8qIG91dHB1dCBpcworICAgIGN1cnJNQi0+bWJfaW50cmEsIGN1cnJNQi0+bWJNb2RlLAorICAgIGN1cnJNQi0+aTE2TW9kZSAgKGlmIGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgY3Vyck1CLT5pNE1vZGVbLi5dIChpZiBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpICovCisKKyNpZmRlZiBGSVhFRF9JTlRSQVBSRURfTU9ERQordm9pZCBNQkludHJhU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIGludCBtYk51bSkKK3sKKyAgICAodm9pZCkobWJOdW0pOworCisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBpbmR4LCBibG9ja194LCBibG9ja195OworCisgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKKworICAgIGlmICghdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKKyAgICB7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQSA9IHZpZGVvLT5tYkF2YWlsQTsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1iQXZhaWxCOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJBdmFpbEM7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYkF2YWlsRDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJfaW50cmEgOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEMpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckNdLm1iX2ludHJhOworICAgICAgICB9CisgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsRCA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckRdLm1iX2ludHJhOworICAgICAgICB9CisgICAgfQorCisgICAgY3Vyck1CLT5tYl9pbnRyYSA9IFRSVUU7CisgICAgY3Vyck1CLT5tYk1vZGUgPSBGSVhFRF9JTlRSQVBSRURfTU9ERTsKKworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gRklYRURfSTE2X01PREU7CisKKyAgICAgICAgaWYgKEZJWEVEX0kxNl9NT0RFID09IEFWQ19JMTZfVmVydGljYWwgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGSVhFRF9JMTZfTU9ERSA9PSBBVkNfSTE2X0hvcml6b250YWwgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9EQzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChGSVhFRF9JMTZfTU9ERSA9PSBBVkNfSTE2X1BsYW5lICYmICEodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPmkxNk1vZGUgPSBBVkNfSTE2X0RDOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy9pZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTQpCisgICAgeworICAgICAgICBmb3IgKGluZHggPSAwOyBpbmR4IDwgMTY7IGluZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tfeCA9IGJsa0lkeDJibGtYW2luZHhdOworICAgICAgICAgICAgYmxvY2tfeSA9IGJsa0lkeDJibGtZW2luZHhdOworCisgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBGSVhFRF9JNF9NT0RFOworCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfVmVydGljYWwgJiYgIShibG9ja195ID4gMCB8fCB2aWRlby0+aW50cmFBdmFpbEIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0hvcml6b250YWwgJiYgIShibG9ja194IHx8IHZpZGVvLT5pbnRyYUF2YWlsQSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfRGlhZ29uYWxfRG93bl9MZWZ0ICYmCisgICAgICAgICAgICAgICAgICAgIChibG9ja195ID09IDAgJiYgIXZpZGVvLT5pbnRyYUF2YWlsQikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfRGlhZ29uYWxfRG93bl9SaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAhKChibG9ja195ICYmIGJsb2NrX3gpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9WZXJ0aWNhbF9SaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAhKChibG9ja195ICYmIGJsb2NrX3gpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKGJsb2NrX3kgJiYgdmlkZW8tPmludHJhQXZhaWxBKQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja194ICYmIHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICAgICAgICB8fCAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsRCAmJiB2aWRlby0+aW50cmFBdmFpbEIpKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF0gPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChGSVhFRF9JNF9NT0RFID09IEFWQ19JNF9Ib3Jpem9udGFsX0Rvd24gJiYKKyAgICAgICAgICAgICAgICAgICAgISgoYmxvY2tfeSAmJiBibG9ja194KQorICAgICAgICAgICAgICAgICAgICAgIHx8IChibG9ja195ICYmIHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICAgICAgICB8fCAoYmxvY2tfeCAmJiB2aWRlby0+aW50cmFBdmFpbEIpCisgICAgICAgICAgICAgICAgICAgICAgfHwgKHZpZGVvLT5pbnRyYUF2YWlsQSAmJiB2aWRlby0+aW50cmFBdmFpbEQgJiYgdmlkZW8tPmludHJhQXZhaWxCKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRklYRURfSTRfTU9ERSA9PSBBVkNfSTRfVmVydGljYWxfTGVmdCAmJgorICAgICAgICAgICAgICAgICAgICAoYmxvY2tfeSA9PSAwICYmICF2aWRlby0+aW50cmFBdmFpbEIpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+aTRNb2RlWyhibG9ja195PDwyKStibG9ja194XSA9IEFWQ19JNF9EQzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEZJWEVEX0k0X01PREUgPT0gQVZDX0k0X0hvcml6b250YWxfVXAgJiYgIShibG9ja194IHx8IHZpZGVvLT5pbnRyYUF2YWlsQSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pNE1vZGVbKGJsb2NrX3k8PDIpK2Jsb2NrX3hdID0gQVZDX0k0X0RDOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gRklYRURfSU5UUkFfQ0hST01BX01PREU7CisKKyAgICBpZiAoRklYRURfSU5UUkFfQ0hST01BX01PREUgPT0gQVZDX0lDX0hvcml6b250YWwgJiYgISh2aWRlby0+aW50cmFBdmFpbEEpKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIGlmIChGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSA9PSBBVkNfSUNfVmVydGljYWwgJiYgISh2aWRlby0+aW50cmFBdmFpbEIpKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0RDOworICAgIH0KKworICAgIGlmIChGSVhFRF9JTlRSQV9DSFJPTUFfTU9ERSA9PSBBVkNfSUNfUGxhbmUgJiYgISh2aWRlby0+aW50cmFBdmFpbEEgJiYgdmlkZW8tPmludHJhQXZhaWxCICYmIHZpZGVvLT5pbnRyYUF2YWlsRCkpCisgICAgeworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisgICAgfQorCisgICAgLyogYWxzbyByZXNldCB0aGUgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAvKiBzZXQgTVYgYW5kIFJlZl9JZHggY29kZXMgb2YgSW50cmEgYmxvY2tzIGluIFAtc2xpY2VzICovCisgICAgbWVtc2V0KGN1cnJNQi0+bXZMMCwgMCwgc2l6ZW9mKGludDMyKSoxNik7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzBdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzFdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzJdID0gLTE7CisgICAgY3Vyck1CLT5yZWZfaWR4X0wwWzNdID0gLTE7CisKKyAgICAvLyBvdXRwdXQgZnJvbSB0aGlzIGZ1bmN0aW9uLCBjdXJyTUItPm1iTW9kZSBzaG91bGQgYmUgc2V0IHRvIGVpdGhlcgorICAgIC8vIEFWQ19JNCwgQVZDX0kxNiwgb3IgZWxzZSBpbiBBVkNNQk1vZGUgZW51bSwgbWJUeXBlLCBtYl9pbnRyYSwgaW50cmFfY2hyb21hX3ByZWRfbW9kZSAqLworICAgIHJldHVybiA7Cit9CisjZWxzZSAvLyBmYXN0ZXIgY29tYmluZWQgcHJlZGljdGlvbitTQUQgY2FsY3VsYXRpb24KK3ZvaWQgTUJJbnRyYVNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0pCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gKmN1cnJJbnB1dCA9IGVuY3ZpZC0+Y3VycklucHV0OworICAgIHVpbnQ4ICpjdXJMLCAqY3VyQ2IsICpjdXJDcjsKKyAgICB1aW50OCAqY29tcCwgKnByZWRfYmxvY2s7CisgICAgaW50IGJsb2NrX3gsIGJsb2NrX3ksIG9mZnNldDsKKyAgICB1aW50IHNhZCwgc2FkNCwgc2FkSTQsIHNhZEkxNjsKKyAgICBpbnQgY29tcG9uZW50LCBTdWJCbG9ja19pbmR4LCB0ZW1wOworICAgIGludCBwaXRjaCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgY29zdCBvZiBlYWNoIGludHJhIHByZWRpY3Rpb24gbW9kZSAgYW5kIGNvbXBhcmUgdG8gdGhlCisgICAgaW50ZXIgbW9kZSAqLworICAgIC8qIGZ1bGwgc2VhcmNoIGZvciBhbGwgaW50cmEgcHJlZGljdGlvbiAqLworICAgIG9mZnNldCA9ICh2aWRlby0+bWJfeSA8PCA0KSAqIHBpdGNoICsgKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGN1ckwgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworICAgIHByZWRfYmxvY2sgPSB2aWRlby0+cHJlZF9ibG9jayArIDg0OworCisgICAgLyogQXNzdW1pbmcgdGhhdCBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkgaGFzIGJlZW4gY2FsbGVkIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+aW50cmFBdmFpbEQgPSAwOworCisgICAgaWYgKCF2aWRlby0+Y3VyclBpY1BhcmFtcy0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnKQorICAgIHsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1iQXZhaWxBOworICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJBdmFpbEI7CisgICAgICAgIHZpZGVvLT5pbnRyYUF2YWlsQyA9IHZpZGVvLT5tYkF2YWlsQzsKKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1iQXZhaWxEOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxBKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYl9pbnRyYTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW8tPm1iQXZhaWxCKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEIgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYl9pbnRyYSA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQ10ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsRCkKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyRF0ubWJfaW50cmE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjdXJyZW50bHkgd2UncmUgZG9pbmcgZXhoYXVzdGl2ZSBzZWFyY2guIFNtYXJ0IHNlYXJjaCB3aWxsIGJlIHVzZWQgbGF0ZXIgKi8KKworICAgIC8qIEkxNiBtb2RlcyAqLworICAgIGN1ckwgPSBjdXJySW5wdXQtPllDYkNyWzBdICsgb2Zmc2V0OworICAgIHZpZGVvLT5waW50cmFfcHJlZF90b3AgPSBjdXJMIC0gcGl0Y2g7CisgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnQgPSBjdXJMIC0gMTsKKyAgICBpZiAodmlkZW8tPm1iX3kpCisgICAgeworICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0ID0gKihjdXJMIC0gcGl0Y2ggLSAxKTsKKyAgICB9CisKKyAgICAvKiBJbnRyYV8xNngxNl9WZXJ0aWNhbCAqLworICAgIHNhZEkxNiA9IDY1NTM2OworICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxCKQorICAgIHsKKyAgICAgICAgc2FkID0gU0FEX0kxNl9WZXJ0KHZpZGVvLCBjdXJMLCBzYWRJMTYpOworCisgICAgICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfVmVydGljYWw7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogSW50cmFfMTZ4MTZfSG9yaXpvbnRhbCAqLworICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBsZWZ0ICovCisgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICB7CisgICAgICAgIHNhZCA9IFNBRF9JMTZfSG9yekRDKHZpZGVvLCBjdXJMLCBBVkNfSTE2X0hvcml6b250YWwsIHNhZEkxNik7CisKKyAgICAgICAgaWYgKHNhZCA8IHNhZEkxNikKKyAgICAgICAgeworICAgICAgICAgICAgc2FkSTE2ID0gc2FkOworICAgICAgICAgICAgY3Vyck1CLT5pMTZNb2RlID0gQVZDX0kxNl9Ib3Jpem9udGFsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW50cmFfMTZ4MTZfREMsIGRlZmF1bHQgbW9kZSAqLworICAgIHNhZCA9IFNBRF9JMTZfSG9yekRDKHZpZGVvLCBjdXJMLCBBVkNfSTE2X0RDLCBzYWRJMTYpOworICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgeworICAgICAgICBzYWRJMTYgPSBzYWQ7CisgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfREM7CisgICAgfQorCisgICAgLyogSW50cmFfMTZ4MTZfUGxhbmUgKi8KKyAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgeworICAgICAgICBzYWQgPSBTQURfSTE2X1BsYW5lKHZpZGVvLCBjdXJMLCBzYWRJMTYpOworCisgICAgICAgIGlmIChzYWQgPCBzYWRJMTYpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNhZEkxNiA9IHNhZDsKKyAgICAgICAgICAgIGN1cnJNQi0+aTE2TW9kZSA9IEFWQ19JMTZfUGxhbmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzYWRJMTYgPj49IDE7ICAvKiBiZWZvcmUgY29tcGFyaXNvbiAqLworCisgICAgLyogc2VsZWN0aW9uIGJldHdlZW4gaW50cmE0LCBpbnRyYTE2IG9yIGludGVyIG1vZGUgKi8KKyAgICBpZiAoc2FkSTE2IDwgZW5jdmlkLT5taW5fY29zdCkKKyAgICB7CisgICAgICAgIGN1cnJNQi0+bWJfaW50cmEgPSBUUlVFOworICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19JMTY7CisgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3QgPSBzYWRJMTY7CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpIC8qIG9ubHkgZG8gdGhlIGNocm9taW5hbmNlIHNlYXJjaCB3aGVuIGludHJhIGlzIGRlY2lkZWQgKi8KKyAgICB7CisgICAgICAgIC8qIE5vdGUgdGhhdCB3ZSBtaWdodCBiZSBhYmxlIHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHByZWRpY3Rpb24gZnJvbQorICAgICAgICB0aGUgbHVtYSBwcmVkaWN0aW9uIHR5cGUgKi8KKworICAgICAgICAvKiBub3cgc2VhcmNoIGZvciB0aGUgYmVzdCBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiAqLworICAgICAgICBvZmZzZXQgPSAob2Zmc2V0ID4+IDIpICsgKHZpZGVvLT5tYl94IDw8IDIpOworICAgICAgICBjdXJDYiA9IGN1cnJJbnB1dC0+WUNiQ3JbMV0gKyBvZmZzZXQ7CisgICAgICAgIGN1ckNyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgICAgICBwaXRjaCA+Pj0gMTsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX3RvcF9jYiA9IGN1ckNiIC0gcGl0Y2g7CisgICAgICAgIHZpZGVvLT5waW50cmFfcHJlZF9sZWZ0X2NiID0gY3VyQ2IgLSAxOworICAgICAgICB2aWRlby0+cGludHJhX3ByZWRfdG9wX2NyID0gY3VyQ3IgLSBwaXRjaDsKKyAgICAgICAgdmlkZW8tPnBpbnRyYV9wcmVkX2xlZnRfY3IgPSBjdXJDciAtIDE7CisKKyAgICAgICAgaWYgKHZpZGVvLT5tYl95KQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NiID0gKihjdXJDYiAtIHBpdGNoIC0gMSk7CisgICAgICAgICAgICB2aWRlby0+aW50cmFfcHJlZF90b3BsZWZ0X2NyID0gKihjdXJDciAtIHBpdGNoIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfREMgKi8KKyAgICAgICAgc2FkNCA9IFNBRF9DaHJvbWFfREModmlkZW8sIGN1ckNiLCBjdXJDciwgNjU1MzYpOworICAgICAgICBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUgPSBBVkNfSUNfREM7CisKKyAgICAgICAgLyogSW50cmFfQ2hyb21hX0hvcml6b250YWwgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIGxlZnQgKi8KKyAgICAgICAgICAgIHNhZCA9IFNBRF9DaHJvbWFfSG9yeih2aWRlbywgY3VyQ2IsIGN1ckNyLCBzYWQ0KTsKKyAgICAgICAgICAgIGlmIChzYWQgPCBzYWQ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhZDQgPSBzYWQ7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX0hvcml6b250YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBJbnRyYV9DaHJvbWFfVmVydGljYWwgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRvcCAqLworICAgICAgICAgICAgc2FkID0gU0FEX0Nocm9tYV9WZXJ0KHZpZGVvLCBjdXJDYiwgY3VyQ3IsIHNhZDQpOworCisgICAgICAgICAgICBpZiAoc2FkIDwgc2FkNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYWQ0ID0gc2FkOworICAgICAgICAgICAgICAgIGN1cnJNQi0+aW50cmFfY2hyb21hX3ByZWRfbW9kZSA9IEFWQ19JQ19WZXJ0aWNhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIEludHJhX0Nocm9tYV9QbGFuZSAqLworICAgICAgICBpZiAodmlkZW8tPmludHJhQXZhaWxBICYmIHZpZGVvLT5pbnRyYUF2YWlsQiAmJiB2aWRlby0+aW50cmFBdmFpbEQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiB0b3AgYW5kIGxlZnQgKi8KKyAgICAgICAgICAgIEludHJhX0Nocm9tYV9QbGFuZSh2aWRlbywgcGl0Y2gpOworCisgICAgICAgICAgICBzYWQgPSBTQURDaHJvbWEocHJlZF9ibG9jayArIDQ1MiwgY3VyQ2IsIGN1ckNyLCBwaXRjaCk7CisKKyAgICAgICAgICAgIGlmIChzYWQgPCBzYWQ0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNhZDQgPSBzYWQ7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5pbnRyYV9jaHJvbWFfcHJlZF9tb2RlID0gQVZDX0lDX1BsYW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYWxzbyByZXNldCB0aGUgbW90aW9uIHZlY3RvcnMgKi8KKyAgICAgICAgLyogc2V0IE1WIGFuZCBSZWZfSWR4IGNvZGVzIG9mIEludHJhIGJsb2NrcyBpbiBQLXNsaWNlcyAqLworICAgICAgICBtZW1zZXQoY3Vyck1CLT5tdkwwLCAwLCBzaXplb2YoaW50MzIpKjE2KTsKKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+cmVmX2lkeF9MMCwgLTEsIHNpemVvZihpbnQxNikqNCk7CisKKyAgICB9CisKKyAgICAvLyBvdXRwdXQgZnJvbSB0aGlzIGZ1bmN0aW9uLCBjdXJyTUItPm1iTW9kZSBzaG91bGQgYmUgc2V0IHRvIGVpdGhlcgorICAgIC8vIEFWQ19JNCwgQVZDX0kxNiwgb3IgZWxzZSBpbiBBVkNNQk1vZGUgZW51bSwgbWJUeXBlLCBtYl9pbnRyYSwgaW50cmFfY2hyb21hX3ByZWRfbW9kZSAqLworCisgICAgcmV0dXJuIDsKK30KKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fY29tcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNjJkNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvbW90aW9uX2NvbXAuY3BwCkBAIC0wLDAgKzEsMjE1NiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAiYXZjZW5jX2ludC5oIgorCisKKyNkZWZpbmUgQ0xJUF9SRVNVTFQoeCkgICAgICBpZigodWludCl4ID4gMHhGRil7IFwKKyAgICAgICAgICAgICAgICAgeCA9IDB4RkYgJiAofih4Pj4zMSkpO30KKworLyogKGJsa3dpZHRoIDw8IDIpICsgKGR5IDw8IDEpICsgZHggKi8KK3N0YXRpYyB2b2lkICgqY29uc3QgZUNocm9tYU1DX1NJTURbOF0pKHVpbnQ4ICosIGludCAsIGludCAsIGludCAsIHVpbnQ4ICosIGludCwgaW50ICwgaW50KSA9Cit7CisgICAgJmVDaHJvbWFGdWxsTUNfU0lNRCwKKyAgICAmZUNocm9tYUhvcml6b250YWxNQ19TSU1ELAorICAgICZlQ2hyb21hVmVydGljYWxNQ19TSU1ELAorICAgICZlQ2hyb21hRGlhZ29uYWxNQ19TSU1ELAorICAgICZlQ2hyb21hRnVsbE1DX1NJTUQsCisgICAgJmVDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQsCisgICAgJmVDaHJvbWFWZXJ0aWNhbE1DMl9TSU1ELAorICAgICZlQ2hyb21hRGlhZ29uYWxNQzJfU0lNRAorfTsKKy8qIFBlcmZvcm0gbW90aW9uIHByZWRpY3Rpb24gYW5kIGNvbXBlbnNhdGlvbiB3aXRoIHJlc2lkdWUgaWYgZXhpc3QuICovCit2b2lkIEFWQ01CTW90aW9uQ29tcChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbykKK3sKKyAgICAodm9pZCkoZW5jdmlkKTsKKworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBpbnQgbWJQYXJ0SWR4LCBzdWJNYlBhcnRJZHg7CisgICAgaW50IHJlZl9pZHg7CisgICAgaW50IG9mZnNldF9NYlBhcnRfaW5keCA9IDA7CisgICAgaW50MTYgKm12OworICAgIHVpbnQzMiB4X3BvcywgeV9wb3M7CisgICAgdWludDggKmN1ckwsICpjdXJDYiwgKmN1ckNyOworICAgIHVpbnQ4ICpyZWZfbCwgKnJlZl9DYiwgKnJlZl9DcjsKKyAgICB1aW50OCAqcHJlZEJsb2NrLCAqcHJlZENiLCAqcHJlZENyOworICAgIGludCBibG9ja194LCBibG9ja195LCBvZmZzZXRfeCwgb2Zmc2V0X3ksIG9mZnNldFAsIG9mZnNldDsKKyAgICBpbnQgeF9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBpbnQgeV9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeSA8PCA0KTsKKyAgICBpbnQgTWJIZWlnaHQsIE1iV2lkdGgsIG1iUGFydElkeF9YLCBtYlBhcnRJZHhfWSwgb2Zmc2V0X2luZHg7CisgICAgaW50IHBpY1dpZHRoID0gY3VyclBpYy0+d2lkdGg7CisgICAgaW50IHBpY1BpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IHBpY0hlaWdodCA9IGN1cnJQaWMtPmhlaWdodDsKKyAgICB1aW50MzIgdG1wX3dvcmQ7CisKKyAgICB0bXBfd29yZCA9IHlfcG9zaXRpb24gKiBwaWNQaXRjaDsKKyAgICBjdXJMID0gY3VyclBpYy0+U2wgKyB0bXBfd29yZCArIHhfcG9zaXRpb247CisgICAgb2Zmc2V0ID0gKHRtcF93b3JkID4+IDIpICsgKHhfcG9zaXRpb24gPj4gMSk7CisgICAgY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgY3VyQ3IgPSBjdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisKKyAgICBwcmVkQmxvY2sgPSBjdXJMOworICAgIHByZWRDYiA9IGN1ckNiOworICAgIHByZWRDciA9IGN1ckNyOworCisgICAgR2V0TW90aW9uVmVjdG9yUHJlZGljdG9yKHZpZGVvLCAxKTsKKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgTWJIZWlnaHQgPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFttYlBhcnRJZHhdOworICAgICAgICBNYldpZHRoID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFttYlBhcnRJZHhdOworICAgICAgICBtYlBhcnRJZHhfWCA9ICgobWJQYXJ0SWR4ICsgb2Zmc2V0X01iUGFydF9pbmR4KSAmIDEpOworICAgICAgICBtYlBhcnRJZHhfWSA9IChtYlBhcnRJZHggKyBvZmZzZXRfTWJQYXJ0X2luZHgpID4+IDE7CisgICAgICAgIHJlZl9pZHggPSBjdXJyTUItPnJlZl9pZHhfTDBbKG1iUGFydElkeF9ZIDw8IDEpICsgbWJQYXJ0SWR4X1hdOworICAgICAgICBvZmZzZXRfaW5keCA9IDA7CisKKyAgICAgICAgcmVmX2wgPSB2aWRlby0+UmVmUGljTGlzdDBbcmVmX2lkeF0tPlNsOworICAgICAgICByZWZfQ2IgPSB2aWRlby0+UmVmUGljTGlzdDBbcmVmX2lkeF0tPlNjYjsKKyAgICAgICAgcmVmX0NyID0gdmlkZW8tPlJlZlBpY0xpc3QwW3JlZl9pZHhdLT5TY3I7CisKKyAgICAgICAgZm9yIChzdWJNYlBhcnRJZHggPSAwOyBzdWJNYlBhcnRJZHggPCBjdXJyTUItPk51bVN1Yk1iUGFydFttYlBhcnRJZHhdOyBzdWJNYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tfeCA9IChtYlBhcnRJZHhfWCA8PCAxKSArICgoc3ViTWJQYXJ0SWR4ICsgb2Zmc2V0X2luZHgpICYgMSk7CisgICAgICAgICAgICBibG9ja195ID0gKG1iUGFydElkeF9ZIDw8IDEpICsgKCgoc3ViTWJQYXJ0SWR4ICsgb2Zmc2V0X2luZHgpID4+IDEpICYgMSk7CisgICAgICAgICAgICBtdiA9IChpbnQxNiopKGN1cnJNQi0+bXZMMCArIGJsb2NrX3ggKyAoYmxvY2tfeSA8PCAyKSk7CisgICAgICAgICAgICBvZmZzZXRfeCA9IHhfcG9zaXRpb24gKyAoYmxvY2tfeCA8PCAyKTsKKyAgICAgICAgICAgIG9mZnNldF95ID0geV9wb3NpdGlvbiArIChibG9ja195IDw8IDIpOworICAgICAgICAgICAgeF9wb3MgPSAob2Zmc2V0X3ggPDwgMikgKyAqbXYrKzsgICAvKnF1YXJ0ZXIgcGVsICovCisgICAgICAgICAgICB5X3BvcyA9IChvZmZzZXRfeSA8PCAyKSArICptdjsgICAvKnF1YXJ0ZXIgcGVsICovCisKKyAgICAgICAgICAgIC8vb2Zmc2V0ID0gb2Zmc2V0X3kgKiBjdXJyUGljLT53aWR0aDsKKyAgICAgICAgICAgIC8vb2Zmc2V0QyA9IChvZmZzZXQgPj4gMikgKyAob2Zmc2V0X3ggPj4gMSk7CisgICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgPDwgMikgKiBwaWNQaXRjaCArIChibG9ja194IDw8IDIpOworICAgICAgICAgICAgZUx1bWFNb3Rpb25Db21wKHJlZl9sLCBwaWNQaXRjaCwgcGljSGVpZ2h0LCB4X3BvcywgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb21wX1NsICsgb2Zmc2V0ICsgb2Zmc2V0X3gsKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkQmxvY2sgKyBvZmZzZXRQLCBwaWNQaXRjaCwgTWJXaWR0aCwgTWJIZWlnaHQpOworCisgICAgICAgICAgICBvZmZzZXRQID0gKGJsb2NrX3kgKiBwaWNXaWR0aCkgKyAoYmxvY2tfeCA8PCAxKTsKKyAgICAgICAgICAgIGVDaHJvbWFNb3Rpb25Db21wKHJlZl9DYiwgcGljV2lkdGggPj4gMSwgcGljSGVpZ2h0ID4+IDEsIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TY2IgKyAgb2Zmc2V0QywqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENiICsgb2Zmc2V0UCwgcGljUGl0Y2ggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKKyAgICAgICAgICAgIGVDaHJvbWFNb3Rpb25Db21wKHJlZl9DciwgcGljV2lkdGggPj4gMSwgcGljSGVpZ2h0ID4+IDEsIHhfcG9zLCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qY29tcF9TY3IgKyAgb2Zmc2V0QywqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZENyICsgb2Zmc2V0UCwgcGljUGl0Y2ggPj4gMSwgTWJXaWR0aCA+PiAxLCBNYkhlaWdodCA+PiAxKTsKKworICAgICAgICAgICAgb2Zmc2V0X2luZHggPSBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW21iUGFydElkeF0gPj4gMzsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXRfTWJQYXJ0X2luZHggPSBjdXJyTUItPk1iUGFydFdpZHRoID4+IDQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisvKiBwcmVmb3JtIHRoZSBhY3R1YWwgIG1vdGlvbiBjb21wIGhlcmUgKi8KK3ZvaWQgZUx1bWFNb3Rpb25Db21wKHVpbnQ4ICpyZWYsIGludCBwaWNwaXRjaCwgaW50IHBpY2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB4X3BvcywgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwcmVkX3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShwaWNoZWlnaHQpOworCisgICAgaW50IGR4LCBkeTsKKyAgICBpbnQgdGVtcDJbMjFdWzIxXTsgLyogZm9yIGludGVybWVkaWF0ZSByZXN1bHRzICovCisgICAgdWludDggKnJlZjI7CisKKyAgICBkeCA9IHhfcG9zICYgMzsKKyAgICBkeSA9IHlfcG9zICYgMzsKKyAgICB4X3BvcyA9IHhfcG9zID4+IDI7ICAvKiByb3VuZCBpdCB0byBmdWxsLXBlbCByZXNvbHV0aW9uICovCisgICAgeV9wb3MgPSB5X3BvcyA+PiAyOworCisgICAgLyogcGVyZm9ybSBhY3R1YWwgbW90aW9uIGNvbXBlbnNhdGlvbiAqLworICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApCisgICAgeyAgLyogZnVsbHBlbCBwb3NpdGlvbiAqLy8qIEcgKi8KKworICAgICAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIGVGdWxsUGVsTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCk7CisKKyAgICB9ICAgLyogb3RoZXIgcG9zaXRpb25zICovCisgICAgZWxzZSAgaWYgKGR5ID09IDApCisgICAgeyAvKiBubyB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uICovLyogYSxiLGMqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgZUhvcnpJbnRlcnAxTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHgpOworICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAwKQorICAgIHsgLypubyBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8vKiBkLGgsbiAqLworCisgICAgICAgIHJlZiArPSB5X3BvcyAqIHBpY3BpdGNoICsgeF9wb3M7CisKKyAgICAgICAgZVZlcnRJbnRlcnAxTUMocmVmLCBwaWNwaXRjaCwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHkpOworICAgIH0KKyAgICBlbHNlIGlmIChkeSA9PSAyKQorICAgIHsgIC8qIGhvcml6b250YWwgY3Jvc3MgKi8vKiBpLCBqLCBrICovCisKKyAgICAgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvcyAtIDI7IC8qIG1vdmUgdG8gdGhlIGxlZnQgMiBwaXhlbHMgKi8KKworICAgICAgICBlVmVydEludGVycDJNQyhyZWYsIHBpY3BpdGNoLCAmdGVtcDJbMF1bMF0sIDIxLCBibGt3aWR0aCArIDUsIGJsa2hlaWdodCk7CisKKyAgICAgICAgZUhvcnpJbnRlcnAyTUMoJnRlbXAyWzBdWzJdLCAyMSwgcHJlZCwgcHJlZF9waXRjaCwgYmxrd2lkdGgsIGJsa2hlaWdodCwgZHgpOworICAgIH0KKyAgICBlbHNlIGlmIChkeCA9PSAyKQorICAgIHsgLyogdmVydGljYWwgY3Jvc3MgKi8gLyogZixxICovCisKKyAgICAgICAgcmVmICs9ICh5X3BvcyAtIDIpICogcGljcGl0Y2ggKyB4X3BvczsgLyogbW92ZSB0byB1cCAyIGxpbmVzICovCisKKyAgICAgICAgZUhvcnpJbnRlcnAzTUMocmVmLCBwaWNwaXRjaCwgJnRlbXAyWzBdWzBdLCAyMSwgYmxrd2lkdGgsIGJsa2hlaWdodCArIDUpOworICAgICAgICBlVmVydEludGVycDNNQygmdGVtcDJbMl1bMF0sIDIxLCBwcmVkLCBwcmVkX3BpdGNoLCBibGt3aWR0aCwgYmxraGVpZ2h0LCBkeSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7IC8qIGRpYWdvbmFsICovLyogZSxnLHAsciAqLworCisgICAgICAgIHJlZjIgPSByZWYgKyAoeV9wb3MgKyAoZHkgLyAyKSkgKiBwaWNwaXRjaCArIHhfcG9zOworCisgICAgICAgIHJlZiArPSAoeV9wb3MgKiBwaWNwaXRjaCkgKyB4X3BvcyArIChkeCAvIDIpOworCisgICAgICAgIGVEaWFnb25hbEludGVycE1DKHJlZjIsIHJlZiwgcGljcGl0Y2gsIHByZWQsIHByZWRfcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZUNyZWF0ZUFsaWduKHVpbnQ4ICpyZWYsIGludCBwaWNwaXRjaCwgaW50IHlfcG9zLAorICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXQsIG91dF9vZmZzZXQ7CisgICAgdWludDMyIHByZXZfcGl4LCByZXN1bHQsIHBpeDEsIHBpeDIsIHBpeDQ7CisKKyAgICByZWYgKz0geV9wb3MgKiBwaWNwaXRjaDsvLyArIHhfcG9zOworICAgIG91dF9vZmZzZXQgPSAyNCAtIGJsa3dpZHRoOworCisgICAgLy9zd2l0Y2goeF9wb3MmMHgzKXsKKyAgICBzd2l0Y2ggKCgodWludDMyKXJlZikmMHgzKQorICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgb2Zmc2V0ID0gIHBpY3BpdGNoIC0gYmxrd2lkdGggLSAzOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBpeDEgPSAqcmVmKys7CisgICAgICAgICAgICAgICAgcGl4MiA9ICooKHVpbnQxNiopcmVmKTsKKyAgICAgICAgICAgICAgICByZWYgKz0gMjsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocGl4MiA8PCA4KSB8IHBpeDE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAzOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpeDQgPSAqKCh1aW50MzIqKXJlZik7CisgICAgICAgICAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCA9IChwaXg0IDw8IDI0KSAmIDB4RkYwMDAwMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDg7IC8qIGZvciB0aGUgbmV4dCBsb29wICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlZiArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgb3V0ICs9IG91dF9vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgb2Zmc2V0ID0gIHBpY3BpdGNoIC0gYmxrd2lkdGggLSAyOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9ICooKHVpbnQxNiopcmVmKTsKKyAgICAgICAgICAgICAgICByZWYgKz0gMjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAyOyBpIDwgYmxrd2lkdGg7IGkgKz0gNCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBpeDQgPSAqKCh1aW50MzIqKXJlZik7CisgICAgICAgICAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgICAgICAgICBwcmV2X3BpeCA9IChwaXg0IDw8IDE2KSAmIDB4RkZGRjAwMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDE2OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIG9mZnNldCA9ICBwaWNwaXRjaCAtIGJsa3dpZHRoIC0gMTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGtoZWlnaHQ7IGorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAqcmVmKys7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwaXg0ID0gKigodWludDMyKilyZWYpOworICAgICAgICAgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9waXggPSAocGl4NCA8PCA4KSAmIDB4RkZGRkZGMDA7IC8qIG1hc2sgb3V0IGJ5dGUgYmVsb25nIHRvIHByZXZpb3VzIHdvcmQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IHByZXZfcGl4OworICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzIqKW91dCkgPSByZXN1bHQ7ICAvKiB3cml0ZSA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBwaXg0ID4+IDI0OyAvKiBmb3IgdGhlIG5leHQgbG9vcCAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIG91dCArPSBvdXRfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGVIb3J6SW50ZXJwMU1DKHVpbnQ4ICppbiwgaW50IGlucGl0Y2gsIHVpbnQ4ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0LCBpbnQgZHgpCit7CisgICAgdWludDggKnBfcmVmOworICAgIHVpbnQzMiAqcF9jdXI7CisgICAgdWludDMyIHRtcCwgcGtyZXM7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGo7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKyAgICBpbnQzMiByMTMsIHI2OworCisgICAgcF9jdXIgPSAodWludDMyKilvdXQ7IC8qIGFzc3VtZSBpdCdzIHdvcmQgYWxpZ25lZCAqLworICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpID4+IDI7CisgICAgcF9yZWYgPSBpbjsKKyAgICByZWZfb2Zmc2V0ID0gaW5waXRjaCAtIGJsa3dpZHRoOworCisgICAgaWYgKGR4JjEpCisgICAgeworICAgICAgICBkeCA9ICgoZHggPj4gMSkgPyAtMyA6IC00KTsgLyogdXNlIGluIDMvNCBwZWwgKi8KKyAgICAgICAgcF9yZWYgLT0gMjsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIHIwID0gcF9yZWZbMF07CisgICAgICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgICAgIHIxID0gcF9yZWZbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSA0KTsgLyogbW92ZSBwb2ludGVyIHRvIGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgICAgIHIyIHw9IChyMyA8PCAxNik7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgICAgIHIzIHw9IChyNCA8PCAxNik7ICAgICAgICAgICAvKiAwLGgsMCxmICovCisKKyAgICAgICAgICAgICAgICByNCA9IHIwICsgcjM7ICAgICAgIC8qIGMraCwgYStmICovCisgICAgICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICAgICAgcjYgPSByMiArIHIzOyAgIC8qIGcraCwgZStmICovCisgICAgICAgICAgICAgICAgcjUgPj49IDE2OworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgICAgICByNCArPSByNSAqIDIwOyAgICAgIC8qIGMrMjAqZSsyMCpmK2gsIGErMjAqYysyMCpkK2YgKi8KKyAgICAgICAgICAgICAgICByNCArPSAweDEwMDAxMDsgLyogKzE2LCArMTYgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICAgICAgcjQgLT0gcjUgKiA1OyAgICAgICAvKiBjLTUqZCsyMCplKzIwKmYtNSpnK2gsIGEtNSpiKzIwKmMrMjAqZC01KmUrZiAqLworICAgICAgICAgICAgICAgIHI0ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworCisgICAgICAgICAgICAgICAgcjUgPSBwX3JlZltkeCsyXTsKKyAgICAgICAgICAgICAgICByNiA9IHBfcmVmW2R4KzRdOworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7CisgICAgICAgICAgICAgICAgcjQgKz0gcjU7CisgICAgICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTsKKyAgICAgICAgICAgICAgICByNCA9IChyNCA+PiAxKSAmIDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KKyAgICAgICAgICAgICAgICByNiA9IChyNSA8PCAxNik7CisgICAgICAgICAgICAgICAgcjUgPSByNiB8IChyMiA+PiAxNik7LyogMCxpLDAsZyAqLworICAgICAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLworICAgICAgICAgICAgICAgIHIxID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMSB8PSAocjMgPDwgMTYpOyAvKiAwLGYsMCxkICovIC8qIHIxIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCisgICAgICAgICAgICAgICAgcjUgKz0gMjAgKiByMTsgIC8qIGQrMjBmKzIwZytpLCBiKzIwZCsyMGUrZyAqLworICAgICAgICAgICAgICAgIHIwID4+PSAxNjsKKyAgICAgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICAgICAgcjAgKz0gcjM7ICAgICAgIC8qIGUraCwgYytmICovCisgICAgICAgICAgICAgICAgcjUgKz0gMHgxMDAwMTA7IC8qIDE2LDE2ICovCisgICAgICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KKyAgICAgICAgICAgICAgICByNSA+Pj0gNTsKKyAgICAgICAgICAgICAgICByMTMgfD0gcjU7ICAgICAgLyogY2hlY2sgY2xpcHBpbmcgKi8KKworICAgICAgICAgICAgICAgIHIwID0gcF9yZWZbZHgrM107CisgICAgICAgICAgICAgICAgcjEgPSBwX3JlZltkeCs1XTsKKyAgICAgICAgICAgICAgICByMCB8PSAocjEgPDwgMTYpOworICAgICAgICAgICAgICAgIHI1ICs9IHIwOworICAgICAgICAgICAgICAgIHI1ICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjUgPSAocjUgPj4gMSkgJiAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHI0IHw9IChyNSA8PCA4KTsgICAgLyogcGFjayB0aGVtIHRvZ2V0aGVyICovCisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSByNDsKKyAgICAgICAgICAgICAgICByMSA9IHIzOworICAgICAgICAgICAgICAgIHIwID0gcjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisKKyAgICAgICAgICAgIGlmIChyMTMmMHhGRjAwMDcwMCkgLyogbmVlZCBjbGlwcGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gKHJlZl9vZmZzZXQgKyBibGt3aWR0aCk7ICAgLyogaW5wdXQgKi8KKyAgICAgICAgICAgICAgICBwX2N1ciAtPSAob3V0cGl0Y2ggPj4gMik7CisKKyAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHIwID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R4XSArIDEpOworICAgICAgICAgICAgICAgICAgICBwa3JlcyA9IChyZXN1bHQgPj4gMSkgOworICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDgpOworICAgICAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeF0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHhdICsgMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgLT0gNTsgIC8qIG9mZnNldCBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgZmlsdGVyICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgICAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcF9yZWYgLT0gMjsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgICAgIHIwID0gcF9yZWZbMF07CisgICAgICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjAgfD0gKHIxIDw8IDE2KTsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgICAgIHIxID0gcF9yZWZbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjEgfD0gKHIyIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSA0KTsgLyogbW92ZSBwb2ludGVyIHRvIGUgKi8KKyAgICAgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgICAgIHIyIHw9IChyMyA8PCAxNik7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAgICAgcjMgPSBwX3JlZlsxXTsKKyAgICAgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgICAgIHIzIHw9IChyNCA8PCAxNik7ICAgICAgICAgICAvKiAwLGgsMCxmICovCisKKyAgICAgICAgICAgICAgICByNCA9IHIwICsgcjM7ICAgICAgIC8qIGMraCwgYStmICovCisgICAgICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICAgICAgcjYgPSByMiArIHIzOyAgIC8qIGcraCwgZStmICovCisgICAgICAgICAgICAgICAgcjUgPj49IDE2OworICAgICAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgICAgICByNCArPSByNSAqIDIwOyAgICAgIC8qIGMrMjAqZSsyMCpmK2gsIGErMjAqYysyMCpkK2YgKi8KKyAgICAgICAgICAgICAgICByNCArPSAweDEwMDAxMDsgLyogKzE2LCArMTYgKi8KKyAgICAgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICAgICAgcjQgLT0gcjUgKiA1OyAgICAgICAvKiBjLTUqZCsyMCplKzIwKmYtNSpnK2gsIGEtNSpiKzIwKmMrMjAqZC01KmUrZiAqLworICAgICAgICAgICAgICAgIHI0ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgICAgIHI0ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgICAgICByNSA9IHBfcmVmWzRdOyAgLyogaSAqLworICAgICAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKKyAgICAgICAgICAgICAgICByNSA9IHI2IHwgKHIyID4+IDE2KTsvKiAwLGksMCxnICovCisgICAgICAgICAgICAgICAgcjUgKz0gcjE7ICAgICAgIC8qIGQraSwgYitnICovIC8qIHI1IG5vdCBmcmVlICovCisgICAgICAgICAgICAgICAgcjEgPj49IDE2OworICAgICAgICAgICAgICAgIHIxIHw9IChyMyA8PCAxNik7IC8qIDAsZiwwLGQgKi8gLyogcjEgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMSArPSByMjsgICAgICAgLyogZitnLCBkK2UgKi8KKyAgICAgICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCisgICAgICAgICAgICAgICAgcjAgPj49IDE2OworICAgICAgICAgICAgICAgIHIwIHw9IChyMiA8PCAxNik7IC8qIDAsZSwwLGMgKi8gLyogcjAgaGFzIGNoYW5nZWQgKi8KKyAgICAgICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KKyAgICAgICAgICAgICAgICByNSArPSAweDEwMDAxMDsgLyogMTYsMTYgKi8KKyAgICAgICAgICAgICAgICByNSAtPSByMCAqIDU7ICAgICAgIC8qIGQtNWUrMjBmKzIwZy01aCtpLCBiLTVjKzIwZCsyMGUtNWYrZyAqLworICAgICAgICAgICAgICAgIHI1ID4+PSA1OworICAgICAgICAgICAgICAgIHIxMyB8PSByNTsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgICAgIHI1ICY9IDB4RkYwMEZGOyAvKiBtYXNrICovCisKKyAgICAgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcjQ7CisgICAgICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICAgICByMCA9IHIyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgIC8qICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoLWJsa3dpZHRoOyAqLworCisgICAgICAgICAgICBpZiAocjEzJjB4RkYwMDA3MDApIC8qIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBtb3ZlIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IChyZWZfb2Zmc2V0ICsgYmxrd2lkdGgpOyAgIC8qIGlucHV0ICovCisgICAgICAgICAgICAgICAgcF9jdXIgLT0gKG91dHBpdGNoID4+IDIpOworCisgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByNCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjEgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICAqcF9jdXIrKyA9IHBrcmVzOyAgIC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlSG9yekludGVycDJNQyhpbnQgKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQsIGludCBkeCkKK3sKKyAgICBpbnQgKnBfcmVmOworICAgIHVpbnQzMiAqcF9jdXI7CisgICAgdWludDMyIHRtcCwgcGtyZXM7CisgICAgaW50IHJlc3VsdCwgcmVzdWx0MiwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9ICh1aW50MzIqKW91dDsgLyogYXNzdW1lIGl0J3Mgd29yZCBhbGlnbmVkICovCisgICAgY3Vycl9vZmZzZXQgPSAob3V0cGl0Y2ggLSBibGt3aWR0aCkgPj4gMjsKKyAgICBwX3JlZiA9IGluOworICAgIHJlZl9vZmZzZXQgPSBpbnBpdGNoIC0gYmxrd2lkdGg7CisKKyAgICBpZiAoZHgmMSkKKyAgICB7CisgICAgICAgIGR4ID0gKChkeCA+PiAxKSA/IC0zIDogLTQpOyAvKiB1c2UgaW4gMy80IHBlbCAqLworCisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgYmxrd2lkdGgpOworICAgICAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgcjAgPSBwX3JlZlstMl07CisgICAgICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeF0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHhdICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMTYpOworICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R4XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcGtyZXMgIHw9IChyZXN1bHQgPDwgMjQpOworICAgICAgICAgICAgICAgICpwX2N1cisrID0gcGtyZXM7IC8qIHdyaXRlIDQgcGl4ZWxzICovCisgICAgICAgICAgICAgICAgcF9yZWYgLT0gMzsgIC8qIG9mZnNldCBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgZmlsdGVyICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgIC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsgICAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMCA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICBmb3IgKDsgKHVpbnQzMilwX3JlZiA8IHRtcDspCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICByMCA9IHBfcmVmWy0yXTsKKyAgICAgICAgICAgICAgICByMSA9IHBfcmVmWy0xXTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIzID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjQgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCA4KTsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzICB8PSAocmVzdWx0IDw8IDE2KTsKKyAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICBwa3JlcyAgfD0gKHJlc3VsdCA8PCAyNCk7CisgICAgICAgICAgICAgICAgKnBfY3VyKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbHMgKi8KKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAzOyAgLyogb2Zmc2V0IGJhY2sgdG8gdGhlIG1pZGRsZSBvZiBmaWx0ZXIgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAgLyogbW92ZSB0byB0aGUgbmV4dCBsaW5lICovCisgICAgICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgICAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZUhvcnpJbnRlcnAzTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIHVpbnQ4ICpwX3JlZjsKKyAgICBpbnQgICAqcF9jdXI7CisgICAgdWludDMyIHRtcDsKKyAgICBpbnQgcmVzdWx0LCBjdXJyX29mZnNldCwgcmVmX29mZnNldDsKKyAgICBpbnQgaiwgcjAsIHIxLCByMiwgcjMsIHI0LCByNTsKKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gKG91dHBpdGNoIC0gYmxrd2lkdGgpOworICAgIHBfcmVmID0gaW47CisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKworICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDAgOyBqLS0pCisgICAgeworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIGJsa3dpZHRoKTsKKyAgICAgICAgZm9yICg7ICh1aW50MzIpcF9yZWYgPCB0bXA7KQorICAgICAgICB7CisKKyAgICAgICAgICAgIHIwID0gcF9yZWZbLTJdOworICAgICAgICAgICAgcjEgPSBwX3JlZlstMV07CisgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgcjMgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgcjUgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgIHIwID0gKHIxICsgcjQpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjAgKiAyMCk7Ly9yZXN1bHQgKz0gKHIwPDw0KTsgICAgcmVzdWx0ICs9IChyMDw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHNlY29uZCBwaXhlbCAqLworICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAqcF9jdXIrKyA9IHJlc3VsdDsKKyAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICByMiA9ICpwX3JlZisrOworICAgICAgICAgICAgcmVzdWx0ID0gKHIzICsgcjIpOworICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgIHIzID0gKHI1ICsgcjApOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICpwX2N1cisrID0gcmVzdWx0OworICAgICAgICAgICAgcF9yZWYgLT0gMzsgLyogbW92ZSBiYWNrIHRvIHRoZSBtaWRkbGUgb2YgdGhlIGZpbHRlciAqLworICAgICAgICB9CisgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgcF9yZWYgKz0gcmVmX29mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQordm9pZCBlVmVydEludGVycDFNQyh1aW50OCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KQoreworICAgIHVpbnQ4ICpwX2N1ciwgKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIGk7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjEzOworICAgIHVpbnQ4ICB0bXBfaW5bMjRdWzI0XTsKKworICAgIC8qIG5vdCB3b3JkLWFsaWduZWQgKi8KKyAgICBpZiAoKCh1aW50MzIpaW4pJjB4MykKKyAgICB7CisgICAgICAgIGVDcmVhdGVBbGlnbihpbiwgaW5waXRjaCwgLTIsICZ0bXBfaW5bMF1bMF0sIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKKyAgICAgICAgaW4gPSAmdG1wX2luWzJdWzBdOworICAgICAgICBpbnBpdGNoID0gMjQ7CisgICAgfQorICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSBiYWNrIHVwIGFuZCBvbmUgcGl4ZWwgdG8gcmlnaHQgKi8KKyAgICByZWZfb2Zmc2V0ID0gYmxraGVpZ2h0ICogaW5waXRjaDsgLyogZm9yIGxpbWl0ICovCisKKyAgICBjdXJyX29mZnNldCArPSAzOworCisgICAgaWYgKGR5JjEpCisgICAgeworICAgICAgICBkeSA9IChkeSA+PiAxKSA/IDAgOiAtaW5waXRjaDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjEzID0gMDsKKyAgICAgICAgICAgIHBfcmVmID0gaW47CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKKyAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgICAgIHI2ICs9IHI3OworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOworICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKKworICAgICAgICAgICAgICAgIHIwID4+PSA1OworICAgICAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMTMgfD0gcjY7CisgICAgICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQorCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGR5KSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMCArPSByMTsKKyAgICAgICAgICAgICAgICByNiArPSByMjsKKyAgICAgICAgICAgICAgICByMCArPSAweDEwMDAxOworICAgICAgICAgICAgICAgIHI2ICs9IDB4MTAwMDE7CisgICAgICAgICAgICAgICAgcjAgPSAocjAgPj4gMSkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByNiA9IChyNiA+PiAxKSAmIDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjAgfD0gKHI2IDw8IDgpOyAgLyogcGFjayBpdCBiYWNrICovCisgICAgICAgICAgICAgICAgKigodWludDMyKikocF9jdXIgKz0gb3V0cGl0Y2gpKSA9IHIwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7IC8qIG9mZnNldCB0byB0aGUgbmV4dCBwaXhlbCAqLworICAgICAgICAgICAgaWYgKHIxMyAmIDB4RkYwMDA3MDApIC8qIHRoaXMgY29sdW1uIG5lZWQgY2xpcHBpbmcgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2N1ciAtPSA0OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX3JlZiA9IGluICsgaTsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyBwX3JlZltkeS0oaW5waXRjaDw8MSldICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcF9yZWZbZHktKGlucGl0Y2g8PDEpXSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHBfcmVmW2R5LShpbnBpdGNoPDwxKV0gKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4gKz0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgcjEzID0gMDsKKyAgICAgICAgICAgIHBfcmVmID0gaW47CisgICAgICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgIC8qIGNvbXBlbnNhdGUgZm9yIHRoZSBmaXJzdCBvZmZzZXQgKi8KKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkgIC8qIHRoZSBsb29wIHVuLXJvbGxlZCAgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogbG9hZCA0IGJ5dGVzICovCisgICAgICAgICAgICAgICAgcF9yZWYgKz0gaW5waXRjaDsKKyAgICAgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICAgICAgcjAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgICAgIHI2ICs9IHI3OworCisgICAgICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKXBfcmVmKTsgLyogcjIsIHI4LCByZWZbMV0gKi8KKyAgICAgICAgICAgICAgICByOCA9IChyMiA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICAgICAgcjcgKz0gcjg7CisKKyAgICAgICAgICAgICAgICByMCArPSAyMCAqIHIxOworICAgICAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICAgICAgcjAgKz0gMHgxMDAwMTA7CisgICAgICAgICAgICAgICAgcjYgKz0gMHgxMDAwMTA7CisKKyAgICAgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpKTsgLyogcjIsIHI4LCByZWZbLTFdICovCisgICAgICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMiAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgICAgIHIxID0gKigodWludDMyKikocF9yZWYgKyBpbnBpdGNoKSk7IC8qIHIxLCByNywgcmVmWzJdICovCisgICAgICAgICAgICAgICAgcjcgPSAocjEgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgICAgICByMSArPSByMjsKKworICAgICAgICAgICAgICAgIHI3ICs9IHI4OworCisgICAgICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgICAgIHI2IC09IDUgKiByNzsKKworICAgICAgICAgICAgICAgIHIwID4+PSA1OworICAgICAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgICAgIC8qIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByMTMgfD0gcjY7CisgICAgICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgICAgIC8vQ0xJUFBBQ0socjYscmVzdWx0KQorICAgICAgICAgICAgICAgIHIwICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHI2ICY9IDB4RkYwMEZGOworICAgICAgICAgICAgICAgIHIwIHw9IChyNiA8PCA4KTsgIC8qIHBhY2sgaXQgYmFjayAqLworICAgICAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OyAvKiBvZmZzZXQgdG8gdGhlIG5leHQgcGl4ZWwgKi8KKyAgICAgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgLT0gNDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9yZWYgPSBpbiArIGk7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICAgICAgICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHJlZl9vZmZzZXQpOyAvKiBsaW1pdCAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvb3AgdW4tcm9sbGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKnBfcmVmOworICAgICAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3VydGggcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHIyID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIzID0gKHI0ICsgcjEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjMgKiAyMCk7Ly9yZXN1bHQgKz0gKHIzPDw0KTsgICAgcmVzdWx0ICs9IChyMzw8Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHBfY3VyICs9IChjdXJyX29mZnNldCAtIDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZVZlcnRJbnRlcnAyTUModWludDggKmluLCBpbnQgaW5waXRjaCwgaW50ICpvdXQsIGludCBvdXRwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCAqcF9jdXI7CisgICAgdWludDggKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgYmFjayB1cCBhbmQgb25lIHBpeGVsIHRvIHJpZ2h0ICovCisgICAgcmVmX29mZnNldCA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIGZvciBsaW1pdCAqLworCisgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgeworICAgICAgICBwX2N1ciAtPSBvdXRwaXRjaDsgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyByZWZfb2Zmc2V0KTsgLyogbGltaXQgKi8KKyAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgcjAgPSAqKHBfcmVmIC0gKGlucGl0Y2ggPDwgMSkpOworICAgICAgICAgICAgcjEgPSAqKHBfcmVmIC0gaW5waXRjaCk7CisgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgIHIzID0gKihwX3JlZiArPSBpbnBpdGNoKTsgIC8qIG1vZGlmeSBwb2ludGVyIGJlZm9yZSBsb2FkaW5nICovCisgICAgICAgICAgICByNCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgcjUgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIwICsgcjUpOworICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgIHIwID0gKHIyICsgcjMpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgcjEgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgfQorICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIGVWZXJ0SW50ZXJwM01DKGludCAqaW4sIGludCBpbnBpdGNoLCB1aW50OCAqb3V0LCBpbnQgb3V0cGl0Y2gsCisgICAgICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCwgaW50IGR5KQoreworICAgIHVpbnQ4ICpwX2N1cjsKKyAgICBpbnQgKnBfcmVmOworICAgIHVpbnQzMiB0bXA7CisgICAgaW50IHJlc3VsdCwgcmVzdWx0MiwgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgaW50IGosIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisKKyAgICBwX2N1ciA9IG91dDsKKyAgICBjdXJyX29mZnNldCA9IDEgLSBvdXRwaXRjaCAqIChibGtoZWlnaHQgLSAxKTsgLyogb2Zmc2V0IHZlcnRpY2FsbHkgYmFjayB1cCBhbmQgb25lIHBpeGVsIHRvIHJpZ2h0ICovCisgICAgcmVmX29mZnNldCA9IGJsa2hlaWdodCAqIGlucGl0Y2g7IC8qIGZvciBsaW1pdCAqLworCisgICAgaWYgKGR5JjEpCisgICAgeworICAgICAgICBkeSA9IChkeSA+PiAxKSA/IC0oaW5waXRjaCA8PCAxKSA6IC0oaW5waXRjaCA8PCAxKSAtIGlucGl0Y2g7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcmVzdWx0MiA9ICgocF9yZWZbZHldICsgMTYpID4+IDUpOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdDIpCisgICAgICAgICAgICAgICAgLyogMy80IHBlbCwgIG5vIG5lZWQgdG8gY2xpcCAqLworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyByZXN1bHQyICsgMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgIHIxID0gKHIyICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjEgKiA1KTsvL3Jlc3VsdCAtPSByMTsgIHJlc3VsdCAtPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjEgKiAyMCk7Ly9yZXN1bHQgKz0gKHIxPDw0KTsgICAgcmVzdWx0ICs9IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgIHIyID0gKHIzICsgcjApOworICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjIgKiA1KTsvL3Jlc3VsdCAtPSByMjsgIHJlc3VsdCAtPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgIHJlc3VsdCArPSAocjIgKiAyMCk7Ly9yZXN1bHQgKz0gKHIyPDw0KTsgICAgcmVzdWx0ICs9IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDUxMikgPj4gMTA7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdDIgPSAoKHBfcmVmW2R5XSArIDE2KSA+PiA1KTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQyKQorICAgICAgICAgICAgICAgIC8qIDMvNCBwZWwsICBubyBuZWVkIHRvIGNsaXAgKi8KKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgcmVzdWx0MiArIDEpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICByZXN1bHQyID0gKChwX3JlZltkeV0gKyAxNikgPj4gNSk7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0MikKKyAgICAgICAgICAgICAgICAvKiAzLzQgcGVsLCAgbm8gbmVlZCB0byBjbGlwICovCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHJlc3VsdDIgKyAxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgIHBfcmVmIC09IChpbnBpdGNoIDw8IDEpOyAgLyogbW92ZSBiYWNrIHRvIGNlbnRlciBvZiB0aGUgZmlsdGVyIG9mIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF9jdXIgKz0gY3Vycl9vZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICBwX3JlZiA9IGluKys7CisKKyAgICAgICAgICAgIHRtcCA9ICh1aW50MzIpKHBfcmVmICsgcmVmX29mZnNldCk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb29wIHVuLXJvbGxlZCAqLworICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiAtIChpbnBpdGNoIDw8IDEpKTsKKyAgICAgICAgICAgICAgICByMSA9ICoocF9yZWYgLSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICByMyA9ICoocF9yZWYgKz0gaW5waXRjaCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgIHI0ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHI1ID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjAgKyByNSk7CisgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMCAqIDUpOy8vcmVzdWx0IC09IHIwOyAgcmVzdWx0IC09IChyMDw8Mik7CisgICAgICAgICAgICAgICAgcjAgPSAocjIgKyByMyk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMSArIHIwKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIxICogNSk7Ly9yZXN1bHQgLT0gcjE7ICByZXN1bHQgLT0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByMSA9IChyMyArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAvKiB0aGlyZCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjIgKyByMSk7CisgICAgICAgICAgICAgICAgcjIgPSAocjMgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgcjIgPSAocjQgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMiAqIDIwKTsvL3Jlc3VsdCArPSAocjI8PDQpOyAgICByZXN1bHQgKz0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgNTEyKSA+PiAxMDsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNCArIHIxKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIzICogNSk7Ly9yZXN1bHQgLT0gcjM7ICByZXN1bHQgLT0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIzICogMjApOy8vcmVzdWx0ICs9IChyMzw8NCk7ICAgIHJlc3VsdCArPSAocjM8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3VyICs9IGN1cnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKwordm9pZCBlRGlhZ29uYWxJbnRlcnBNQyh1aW50OCAqaW4xLCB1aW50OCAqaW4yLCBpbnQgaW5waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50IGosIGk7CisgICAgaW50IHJlc3VsdDsKKyAgICB1aW50OCAqcF9jdXIsICpwX3JlZiwgKnBfdG1wODsKKyAgICBpbnQgY3Vycl9vZmZzZXQsIHJlZl9vZmZzZXQ7CisgICAgdWludDggdG1wX3Jlc1syNF1bMjRdLCB0bXBfaW5bMjRdWzI0XTsKKyAgICB1aW50MzIgKnBfdG1wOworICAgIHVpbnQzMiB0bXAsIHBrcmVzLCB0bXBfcmVzdWx0OworICAgIGludDMyIHIwLCByMSwgcjIsIHIzLCByNCwgcjU7CisgICAgaW50MzIgcjYsIHI3LCByOCwgcjksIHIxMCwgcjEzOworCisgICAgcmVmX29mZnNldCA9IGlucGl0Y2ggLSBibGt3aWR0aDsKKyAgICBwX3JlZiA9IGluMSAtIDI7CisgICAgLyogcGVyZm9ybSBob3Jpem9udGFsIGludGVycG9sYXRpb24gKi8KKyAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCisgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IHRpbWUgdG8gYXZvaWQgY2FsbGluZyBDcmVhdGVBbGlnbiAqLworICAgIC8qICBpZigoKHVpbnQzMilwX3JlZikmMHgzKQorICAgICAgICB7CisgICAgICAgICAgICBDcmVhdGVBbGlnbihwX3JlZixpbnBpdGNoLDAsJnRtcF9pblswXVswXSxibGt3aWR0aCs4LGJsa2hlaWdodCk7CisgICAgICAgICAgICBwX3JlZiA9ICZ0bXBfaW5bMF1bMF07CisgICAgICAgICAgICByZWZfb2Zmc2V0ID0gMjQtYmxrd2lkdGg7CisgICAgICAgIH0qLworCisgICAgcF90bXAgPSAodWludDMyKikgJiAodG1wX3Jlc1swXVswXSk7CisgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgIHsKKyAgICAgICAgcjEzID0gMDsKKyAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisKKyAgICAgICAgLy9yMCA9ICooKHVpbnQzMiopcF9yZWYpOyAgIC8qIGQsYyxiLGEgKi8KKyAgICAgICAgLy9yMSA9IChyMD4+OCkmMHhGRjAwRkY7ICAgIC8qIDAsZCwwLGIgKi8KKyAgICAgICAgLy9yMCAmPSAweEZGMDBGRjsgICAgICAgICAgIC8qIDAsYywwLGEgKi8KKyAgICAgICAgLyogSXQgaXMgZmFzdGVyIHRvIHJlYWQgMSBieXRlIGF0IGEgdGltZSAqLworICAgICAgICByMCA9IHBfcmVmWzBdOworICAgICAgICByMSA9IHBfcmVmWzJdOworICAgICAgICByMCB8PSAocjEgPDwgMTYpOyAgICAgICAgICAgLyogMCxjLDAsYSAqLworICAgICAgICByMSA9IHBfcmVmWzFdOworICAgICAgICByMiA9IHBfcmVmWzNdOworICAgICAgICByMSB8PSAocjIgPDwgMTYpOyAgICAgICAgICAgLyogMCxkLDAsYiAqLworCisgICAgICAgIHdoaWxlICgodWludDMyKXBfcmVmIDwgdG1wKQorICAgICAgICB7CisgICAgICAgICAgICAvL3IyID0gKigodWludDMyKikocF9yZWYrPTQpKTsvKiBoLGcsZixlICovCisgICAgICAgICAgICAvL3IzID0gKHIyPj44KSYweEZGMDBGRjsgIC8qIDAsaCwwLGYgKi8KKyAgICAgICAgICAgIC8vcjIgJj0gMHhGRjAwRkY7ICAgICAgICAgICAvKiAwLGcsMCxlICovCisgICAgICAgICAgICAvKiBJdCBpcyBmYXN0ZXIgdG8gcmVhZCAxIGJ5dGUgYXQgYSB0aW1lICovCisgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gNCk7CisgICAgICAgICAgICByMyA9IHBfcmVmWzJdOworICAgICAgICAgICAgcjIgfD0gKHIzIDw8IDE2KTsgICAgICAgICAgIC8qIDAsZywwLGUgKi8KKyAgICAgICAgICAgIHIzID0gcF9yZWZbMV07CisgICAgICAgICAgICByNCA9IHBfcmVmWzNdOworICAgICAgICAgICAgcjMgfD0gKHI0IDw8IDE2KTsgICAgICAgICAgIC8qIDAsaCwwLGYgKi8KKworICAgICAgICAgICAgcjQgPSByMCArIHIzOyAgICAgICAvKiBjK2gsIGErZiAqLworICAgICAgICAgICAgcjUgPSByMCArIHIxOyAgIC8qIGMrZCwgYStiICovCisgICAgICAgICAgICByNiA9IHIyICsgcjM7ICAgLyogZytoLCBlK2YgKi8KKyAgICAgICAgICAgIHI1ID4+PSAxNjsKKyAgICAgICAgICAgIHI1IHw9IChyNiA8PCAxNik7ICAgLyogZStmLCBjK2QgKi8KKyAgICAgICAgICAgIHI0ICs9IHI1ICogMjA7ICAgICAgLyogYysyMCplKzIwKmYraCwgYSsyMCpjKzIwKmQrZiAqLworICAgICAgICAgICAgcjQgKz0gMHgxMDAwMTA7IC8qICsxNiwgKzE2ICovCisgICAgICAgICAgICByNSA9IHIxICsgcjI7ICAgICAgIC8qIGQrZywgYitlICovCisgICAgICAgICAgICByNCAtPSByNSAqIDU7ICAgICAgIC8qIGMtNSpkKzIwKmUrMjAqZi01KmcraCwgYS01KmIrMjAqYysyMCpkLTUqZStmICovCisgICAgICAgICAgICByNCA+Pj0gNTsKKyAgICAgICAgICAgIHIxMyB8PSByNDsgICAgICAvKiBjaGVjayBjbGlwcGluZyAqLworICAgICAgICAgICAgcjQgJj0gMHhGRjAwRkY7IC8qIG1hc2sgKi8KKworICAgICAgICAgICAgcjUgPSBwX3JlZls0XTsgIC8qIGkgKi8KKyAgICAgICAgICAgIHI2ID0gKHI1IDw8IDE2KTsKKyAgICAgICAgICAgIHI1ID0gcjYgfCAocjIgPj4gMTYpOy8qIDAsaSwwLGcgKi8KKyAgICAgICAgICAgIHI1ICs9IHIxOyAgICAgICAvKiBkK2ksIGIrZyAqLyAvKiByNSBub3QgZnJlZSAqLworICAgICAgICAgICAgcjEgPj49IDE2OworICAgICAgICAgICAgcjEgfD0gKHIzIDw8IDE2KTsgLyogMCxmLDAsZCAqLyAvKiByMSBoYXMgY2hhbmdlZCAqLworICAgICAgICAgICAgcjEgKz0gcjI7ICAgICAgIC8qIGYrZywgZCtlICovCisgICAgICAgICAgICByNSArPSAyMCAqIHIxOyAgLyogZCsyMGYrMjBnK2ksIGIrMjBkKzIwZStnICovCisgICAgICAgICAgICByMCA+Pj0gMTY7CisgICAgICAgICAgICByMCB8PSAocjIgPDwgMTYpOyAvKiAwLGUsMCxjICovIC8qIHIwIGhhcyBjaGFuZ2VkICovCisgICAgICAgICAgICByMCArPSByMzsgICAgICAgLyogZStoLCBjK2YgKi8KKyAgICAgICAgICAgIHI1ICs9IDB4MTAwMDEwOyAvKiAxNiwxNiAqLworICAgICAgICAgICAgcjUgLT0gcjAgKiA1OyAgICAgICAvKiBkLTVlKzIwZisyMGctNWgraSwgYi01YysyMGQrMjBlLTVmK2cgKi8KKyAgICAgICAgICAgIHI1ID4+PSA1OworICAgICAgICAgICAgcjEzIHw9IHI1OyAgICAgIC8qIGNoZWNrIGNsaXBwaW5nICovCisgICAgICAgICAgICByNSAmPSAweEZGMDBGRjsgLyogbWFzayAqLworCisgICAgICAgICAgICByNCB8PSAocjUgPDwgOCk7ICAgIC8qIHBhY2sgdGhlbSB0b2dldGhlciAqLworICAgICAgICAgICAgKnBfdG1wKysgPSByNDsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICByMCA9IHIyOworICAgICAgICB9CisgICAgICAgIHBfdG1wICs9ICgoMjQgLSBibGt3aWR0aCkgPj4gMik7IC8qIG1vdmUgdG8gdGhlIG5leHQgbGluZSAqLworICAgICAgICBwX3JlZiArPSByZWZfb2Zmc2V0OyAgLyogICAgcmVmX29mZnNldCA9IGlucGl0Y2gtYmxrd2lkdGg7ICovCisKKyAgICAgICAgaWYgKHIxMyYweEZGMDAwNzAwKSAvKiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIG1vdmUgYmFjayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBwX3JlZiAtPSAocmVmX29mZnNldCArIGJsa3dpZHRoKTsgICAvKiBpbnB1dCAqLworICAgICAgICAgICAgcF90bXAgLT0gNjsgLyogaW50ZXJtZWRpYXRlIG91dHB1dCAqLworICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBibGt3aWR0aCk7CisgICAgICAgICAgICB3aGlsZSAoKHVpbnQzMilwX3JlZiA8IHRtcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMCA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHIxID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByMyA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHI0ID0gKnBfcmVmKys7CisgICAgICAgICAgICAgICAgLyogZmlyc3QgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByNSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICByMCA9IChyMSArIHI0KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIwICogNSk7Ly9yZXN1bHQgLT0gcjA7ICByZXN1bHQgLT0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIwICogMjApOy8vcmVzdWx0ICs9IChyMDw8NCk7ICAgIHJlc3VsdCArPSAocjA8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjAgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjEgKyByMCk7CisgICAgICAgICAgICAgICAgcjEgPSAocjIgKyByNSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgcjEgPSAocjMgKyByNCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMSAqIDIwKTsvL3Jlc3VsdCArPSAocjE8PDQpOyAgICByZXN1bHQgKz0gKHIxPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgOCk7CisgICAgICAgICAgICAgICAgLyogdGhpcmQgcGl4ZWwgKi8KKyAgICAgICAgICAgICAgICByMSA9ICpwX3JlZisrOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMiArIHIxKTsKKyAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgLT0gKHIyICogNSk7Ly9yZXN1bHQgLT0gcjI7ICByZXN1bHQgLT0gKHIyPDwyKTsKKyAgICAgICAgICAgICAgICByMiA9IChyNCArIHI1KTsKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyAxNikgPj4gNTsKKyAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgcGtyZXMgfD0gKHJlc3VsdCA8PCAxNik7CisgICAgICAgICAgICAgICAgLyogZm91cnRoIHBpeGVsICovCisgICAgICAgICAgICAgICAgcjIgPSAqcF9yZWYrKzsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocjMgKyByMik7CisgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMyAqIDUpOy8vcmVzdWx0IC09IHIzOyAgcmVzdWx0IC09IChyMzw8Mik7CisgICAgICAgICAgICAgICAgcjMgPSAocjUgKyByMCk7CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgQ0xJUF9SRVNVTFQocmVzdWx0KQorICAgICAgICAgICAgICAgIHBrcmVzIHw9IChyZXN1bHQgPDwgMjQpOworCisgICAgICAgICAgICAgICAgKnBfdG1wKysgPSBwa3JlczsgLyogd3JpdGUgNCBwaXhlbCAqLworICAgICAgICAgICAgICAgIHBfcmVmIC09IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX3RtcCArPSAoKDI0IC0gYmxrd2lkdGgpID4+IDIpOyAvKiBtb3ZlIHRvIHRoZSBuZXh0IGxpbmUgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IHJlZl9vZmZzZXQ7ICAvKiAgICByZWZfb2Zmc2V0ID0gaW5waXRjaC1ibGt3aWR0aDsgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICBwZXJmb3JtIHZlcnRpY2FsIGludGVycG9sYXRpb24gKi8KKyAgICAvKiBub3Qgd29yZC1hbGlnbmVkICovCisgICAgaWYgKCgodWludDMyKWluMikmMHgzKQorICAgIHsKKyAgICAgICAgZUNyZWF0ZUFsaWduKGluMiwgaW5waXRjaCwgLTIsICZ0bXBfaW5bMF1bMF0sIGJsa3dpZHRoLCBibGtoZWlnaHQgKyA1KTsKKyAgICAgICAgaW4yID0gJnRtcF9pblsyXVswXTsKKyAgICAgICAgaW5waXRjaCA9IDI0OworICAgIH0KKworICAgIHBfY3VyID0gb3V0OworICAgIGN1cnJfb2Zmc2V0ID0gMSAtIG91dHBpdGNoICogKGJsa2hlaWdodCAtIDEpOyAvKiBvZmZzZXQgdmVydGljYWxseSB1cCBhbmQgb25lIHBpeGVsIHJpZ2h0ICovCisgICAgcGtyZXMgPSBibGtoZWlnaHQgKiBpbnBpdGNoOyAvKiByZXVzZSBpdCBmb3IgbGltaXQgKi8KKworICAgIGN1cnJfb2Zmc2V0ICs9IDM7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCwgaW4yICs9IDQpCisgICAgeworICAgICAgICByMTMgPSAwOworICAgICAgICBwX3JlZiA9IGluMjsKKyAgICAgICAgcF90bXA4ID0gJih0bXBfcmVzWzBdW2pdKTsgLyogaW50ZXJtZWRpYXRlIHJlc3VsdCAqLworICAgICAgICBwX3RtcDggLT0gMjQ7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgIHBfY3VyIC09IG91dHBpdGNoOyAgLyogY29tcGVuc2F0ZSBmb3IgdGhlIGZpcnN0IG9mZnNldCAqLworICAgICAgICB0bXAgPSAodWludDMyKShwX3JlZiArIHBrcmVzKTsgLyogbGltaXQgKi8KKyAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFJlYWQgMSBieXRlIGF0IGEgdGltZSBpcyB0b28gc2xvdywgdG9vIG1hbnkgcmVhZCBhbmQgcGFjayBvcHMsIG5lZWQgdG8gY2FsbCBDcmVhdGVBbGlnbiAqLworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZi0oaW5waXRjaDw8MSk7ICAgICAgICAgIHIwID0gcF9yZWY4WzBdOyAgICAgICAgIHIxID0gcF9yZWY4WzJdOworICAgICAgICAgICAgcjAgfD0gKHIxPDwxNik7ICAgICAgICAgcjYgPSBwX3JlZjhbMV07ICAgICAgICAgcjEgPSBwX3JlZjhbM107CisgICAgICAgICAgICByNiB8PSAocjE8PDE2KTsgICAgICAgICBwX3JlZis9aW5waXRjaDsgKi8KKyAgICAgICAgICAgIHIwID0gKigodWludDMyKikocF9yZWYgLSAoaW5waXRjaCA8PCAxKSkpOyAvKiBsb2FkIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgIHBfcmVmICs9IGlucGl0Y2g7CisgICAgICAgICAgICByNiA9IChyMCA+PiA4KSAmIDB4RkYwMEZGOyAvKiBzZWNvbmQgYW5kIGZvdXJ0aCBieXRlICovCisgICAgICAgICAgICByMCAmPSAweEZGMDBGRjsKKworICAgICAgICAgICAgLypwX3JlZjggPSBwX3JlZisoaW5waXRjaDw8MSk7CisgICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsgICAgICAgICByMSB8PSAocjc8PDE2KTsKKyAgICAgICAgICAgIHI3ID0gcF9yZWY4WzFdOyAgICAgICAgIHIyID0gcF9yZWY4WzNdOyAgICAgICAgIHI3IHw9IChyMjw8MTYpOyovCisgICAgICAgICAgICByMSA9ICooKHVpbnQzMiopKHBfcmVmICsgKGlucGl0Y2ggPDwgMSkpKTsgIC8qIHIxLCByNywgcmVmWzNdICovCisgICAgICAgICAgICByNyA9IChyMSA+PiA4KSAmIDB4RkYwMEZGOworICAgICAgICAgICAgcjEgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIHIwICs9IHIxOworICAgICAgICAgICAgcjYgKz0gcjc7CisKKyAgICAgICAgICAgIC8qcjIgPSBwX3JlZlswXTsgICAgICAgICAgICByOCA9IHBfcmVmWzJdOyAgICAgICAgICByMiB8PSAocjg8PDE2KTsKKyAgICAgICAgICAgIHI4ID0gcF9yZWZbMV07ICAgICAgICAgIHIxID0gcF9yZWZbM107ICAgICAgICAgIHI4IHw9IChyMTw8MTYpOyovCisgICAgICAgICAgICByMiA9ICooKHVpbnQzMiopcF9yZWYpOyAvKiByMiwgcjgsIHJlZlsxXSAqLworICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmLWlucGl0Y2g7ICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIxIHw9IChyNzw8MTYpOyAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgcjcgPSBwX3JlZjhbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLworICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiAtIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMF0gKi8KKyAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgcjAgKz0gMjAgKiByMTsKKyAgICAgICAgICAgIHI2ICs9IDIwICogcjc7CisgICAgICAgICAgICByMCArPSAweDEwMDAxMDsKKyAgICAgICAgICAgIHI2ICs9IDB4MTAwMDEwOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmLShpbnBpdGNoPDwxKTsgICAgICAgICAgcjIgPSBwX3JlZjhbMF07ICAgICAgICAgcjggPSBwX3JlZjhbMl07CisgICAgICAgICAgICByMiB8PSAocjg8PDE2KTsgICAgICAgICByOCA9IHBfcmVmOFsxXTsgICAgICAgICByMSA9IHBfcmVmOFszXTsgICAgICAgICByOCB8PSAocjE8PDE2KTsqLworICAgICAgICAgICAgcjIgPSAqKCh1aW50MzIqKShwX3JlZiAtIChpbnBpdGNoIDw8IDEpKSk7IC8qIHIyLCByOCwgcmVmWy0xXSAqLworICAgICAgICAgICAgcjggPSAocjIgPj4gOCkgJiAweEZGMDBGRjsKKyAgICAgICAgICAgIHIyICY9IDB4RkYwMEZGOworCisgICAgICAgICAgICAvKnBfcmVmOCA9IHBfcmVmK2lucGl0Y2g7ICAgICAgICAgICByMSA9IHBfcmVmOFswXTsgICAgICAgICByNyA9IHBfcmVmOFsyXTsKKyAgICAgICAgICAgIHIxIHw9IChyNzw8MTYpOyAgICAgICAgIHIxICs9IHIyOyAgICAgICAgICAgcjcgPSBwX3JlZjhbMV07CisgICAgICAgICAgICByMiA9IHBfcmVmOFszXTsgICAgICAgICByNyB8PSAocjI8PDE2KTsqLworICAgICAgICAgICAgcjEgPSAqKCh1aW50MzIqKShwX3JlZiArIGlucGl0Y2gpKTsgLyogcjEsIHI3LCByZWZbMl0gKi8KKyAgICAgICAgICAgIHI3ID0gKHIxID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMSAmPSAweEZGMDBGRjsKKyAgICAgICAgICAgIHIxICs9IHIyOworCisgICAgICAgICAgICByNyArPSByODsKKworICAgICAgICAgICAgcjAgLT0gNSAqIHIxOworICAgICAgICAgICAgcjYgLT0gNSAqIHI3OworCisgICAgICAgICAgICByMCA+Pj0gNTsKKyAgICAgICAgICAgIHI2ID4+PSA1OworICAgICAgICAgICAgLyogY2xpcCAqLworICAgICAgICAgICAgcjEzIHw9IHI2OworICAgICAgICAgICAgcjEzIHw9IHIwOworICAgICAgICAgICAgLy9DTElQUEFDSyhyNixyZXN1bHQpCisgICAgICAgICAgICAvKiBhZGQgd2l0aCBob3Jpem9udGFsIHJlc3VsdHMgKi8KKyAgICAgICAgICAgIHIxMCA9ICooKHVpbnQzMiopKHBfdG1wOCArPSAyNCkpOworICAgICAgICAgICAgcjkgPSAocjEwID4+IDgpICYgMHhGRjAwRkY7CisgICAgICAgICAgICByMTAgJj0gMHhGRjAwRkY7CisKKyAgICAgICAgICAgIHIwICs9IHIxMDsKKyAgICAgICAgICAgIHIwICs9IDB4MTAwMDE7CisgICAgICAgICAgICByMCA9IChyMCA+PiAxKSAmIDB4RkYwMEZGOyAgIC8qIG1hc2sgdG8gOCBieXRlcyAqLworCisgICAgICAgICAgICByNiArPSByOTsKKyAgICAgICAgICAgIHI2ICs9IDB4MTAwMDE7CisgICAgICAgICAgICByNiA9IChyNiA+PiAxKSAmIDB4RkYwMEZGOyAgIC8qIG1hc2sgdG8gOCBieXRlcyAqLworCisgICAgICAgICAgICByMCB8PSAocjYgPDwgOCk7ICAvKiBwYWNrIGl0IGJhY2sgKi8KKyAgICAgICAgICAgICooKHVpbnQzMiopKHBfY3VyICs9IG91dHBpdGNoKSkgPSByMDsKKyAgICAgICAgfQorICAgICAgICBwX2N1ciArPSBjdXJyX29mZnNldDsgLyogb2Zmc2V0IHRvIHRoZSBuZXh0IHBpeGVsICovCisgICAgICAgIGlmIChyMTMgJiAweEZGMDAwNzAwKSAvKiB0aGlzIGNvbHVtbiBuZWVkIGNsaXBwaW5nICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyIC09IDQ7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfcmVmID0gaW4yICsgaTsKKyAgICAgICAgICAgICAgICBwX3RtcDggPSAmKHRtcF9yZXNbMF1baitpXSk7IC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICBwX3RtcDggLT0gMjQ7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgcF9jdXIgLT0gb3V0cGl0Y2g7ICAvKiBjb21wZW5zYXRlIGZvciB0aGUgZmlyc3Qgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgdG1wID0gKHVpbnQzMikocF9yZWYgKyBwa3Jlcyk7IC8qIGxpbWl0ICovCisgICAgICAgICAgICAgICAgd2hpbGUgKCh1aW50MzIpcF9yZWYgPCB0bXApICAvKiB0aGUgbG9vcCB1bi1yb2xsZWQgICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByMCA9ICoocF9yZWYgLSAoaW5waXRjaCA8PCAxKSk7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiAtIGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICByMiA9ICpwX3JlZjsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAqKHBfcmVmICs9IGlucGl0Y2gpOyAgLyogbW9kaWZ5IHBvaW50ZXIgYmVmb3JlIGxvYWRpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgcjQgPSAqKHBfcmVmICs9IGlucGl0Y2gpOworICAgICAgICAgICAgICAgICAgICAvKiBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByNSA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMCArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSAocjEgKyByNCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjAgKiA1KTsvL3Jlc3VsdCAtPSByMDsgIHJlc3VsdCAtPSAocjA8PDIpOworICAgICAgICAgICAgICAgICAgICByMCA9IChyMiArIHIzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMCAqIDIwKTsvL3Jlc3VsdCArPSAocjA8PDQpOyAgICByZXN1bHQgKz0gKHIwPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBtb2RpZnkgcG9pbnRlciBiZWZvcmUgbG9hZGluZyAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgdG1wX3Jlc3VsdCArIDEpOyAgLyogbm8gY2xpcCAqLworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAqKHBfY3VyICs9IG91dHBpdGNoKSA9IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIwID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIxICsgcjApOworICAgICAgICAgICAgICAgICAgICByMSA9IChyMiArIHI1KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMSAqIDUpOy8vcmVzdWx0IC09IHIxOyAgcmVzdWx0IC09IChyMTw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIxID0gKHIzICsgcjQpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIxICogMjApOy8vcmVzdWx0ICs9IChyMTw8NCk7ICAgIHJlc3VsdCArPSAocjE8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIHRoaXJkIHBpeGVsICovCisgICAgICAgICAgICAgICAgICAgIHIxID0gKihwX3JlZiArPSBpbnBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHIyICsgcjEpOworICAgICAgICAgICAgICAgICAgICByMiA9IChyMyArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0IC09IChyMiAqIDUpOy8vcmVzdWx0IC09IHIyOyAgcmVzdWx0IC09IChyMjw8Mik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gKHI0ICsgcjUpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gKHIyICogMjApOy8vcmVzdWx0ICs9IChyMjw8NCk7ICAgIHJlc3VsdCArPSAocjI8PDIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICsgMTYpID4+IDU7CisgICAgICAgICAgICAgICAgICAgIENMSVBfUkVTVUxUKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgdG1wX3Jlc3VsdCA9ICoocF90bXA4ICs9IDI0KTsgIC8qIGludGVybWVkaWF0ZSByZXN1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIHRtcF9yZXN1bHQgKyAxKTsgIC8qIG5vIGNsaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKihwX2N1ciArPSBvdXRwaXRjaCkgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIC8qIGZvdXJ0aCBwaXhlbCAqLworICAgICAgICAgICAgICAgICAgICByMiA9ICoocF9yZWYgKz0gaW5waXRjaCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyMyArIHIyKTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSAocjQgKyByMSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCAtPSAocjMgKiA1KTsvL3Jlc3VsdCAtPSByMzsgIHJlc3VsdCAtPSAocjM8PDIpOworICAgICAgICAgICAgICAgICAgICByMyA9IChyNSArIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IChyMyAqIDIwKTsvL3Jlc3VsdCArPSAocjM8PDQpOyAgICByZXN1bHQgKz0gKHIzPDwyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCArIDE2KSA+PiA1OworICAgICAgICAgICAgICAgICAgICBDTElQX1JFU1VMVChyZXN1bHQpCisgICAgICAgICAgICAgICAgICAgIHRtcF9yZXN1bHQgPSAqKHBfdG1wOCArPSAyNCk7ICAvKiBpbnRlcm1lZGlhdGUgcmVzdWx0ICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgKyB0bXBfcmVzdWx0ICsgMSk7ICAvKiBubyBjbGlwICovCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICoocF9jdXIgKz0gb3V0cGl0Y2gpID0gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICBwX3JlZiAtPSAoaW5waXRjaCA8PCAxKTsgIC8qIG1vdmUgYmFjayB0byBjZW50ZXIgb2YgdGhlIGZpbHRlciBvZiB0aGUgbmV4dCBvbmUgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcF9jdXIgKz0gKGN1cnJfb2Zmc2V0IC0gMyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisvKiBwb3NpdGlvbiBHICovCit2b2lkIGVGdWxsUGVsTUModWludDggKmluLCBpbnQgaW5waXRjaCwgdWludDggKm91dCwgaW50IG91dHBpdGNoLAorICAgICAgICAgICAgICAgIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgb2Zmc2V0X2luID0gaW5waXRjaCAtIGJsa3dpZHRoOworICAgIGludCBvZmZzZXRfb3V0ID0gb3V0cGl0Y2ggLSBibGt3aWR0aDsKKyAgICB1aW50MzIgdGVtcDsKKyAgICB1aW50OCBieXRlOworCisgICAgaWYgKCgodWludDMyKWluKSYzKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKmluKys7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgICAgICAgICAgYnl0ZSA9ICppbisrOworICAgICAgICAgICAgICAgIHRlbXAgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICAgICAgICAgIGJ5dGUgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDI0KTsKKworICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHRlbXA7IC8qIHdyaXRlIDQgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgaW4gKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciAoaiA9IGJsa2hlaWdodDsgaiA+IDA7IGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gYmxrd2lkdGg7IGkgPiAwOyBpIC09IDQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcCA9ICooKHVpbnQzMiopaW4pOworICAgICAgICAgICAgICAgICooKHVpbnQzMiopb3V0KSA9IHRlbXA7CisgICAgICAgICAgICAgICAgaW4gKz0gNDsKKyAgICAgICAgICAgICAgICBvdXQgKz0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgaW4gKz0gb2Zmc2V0X2luOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiA7Cit9CisKK3ZvaWQgZVBhZENocm9tYSh1aW50OCAqcmVmLCBpbnQgcGljd2lkdGgsIGludCBwaWNoZWlnaHQsIGludCBwaWNwaXRjaCwgaW50IHhfcG9zLCBpbnQgeV9wb3MpCit7CisgICAgaW50IHBhZF9oZWlnaHQ7CisgICAgaW50IHBhZF93aWR0aDsKKyAgICB1aW50OCAqc3RhcnQ7CisgICAgdWludDMyIHdvcmQxLCB3b3JkMiwgd29yZDM7CisgICAgaW50IG9mZnNldCwgajsKKworCisgICAgcGFkX2hlaWdodCA9IDggKyAoKHlfcG9zICYgNykgPyAxIDogMCk7CisgICAgcGFkX3dpZHRoID0gOCArICgoeF9wb3MgJiA3KSA/IDEgOiAwKTsKKworICAgIHlfcG9zID4+PSAzOworICAgIHhfcG9zID4+PSAzOworICAgIC8vIHBhZCB2ZXJ0aWNhbCBmaXJzdAorICAgIGlmICh5X3BvcyA8IDApIC8vIG5lZWQgdG8gcGFkIHVwCisgICAgeworICAgICAgICBpZiAoeF9wb3MgPCAtOCkgc3RhcnQgPSByZWYgLSA4OworICAgICAgICBlbHNlIGlmICh4X3BvcyArIHBhZF93aWR0aCA+IHBpY3dpZHRoICsgNykgc3RhcnQgPSByZWYgKyBwaWN3aWR0aCArIDcgLSBwYWRfd2lkdGg7CisgICAgICAgIGVsc2Ugc3RhcnQgPSByZWYgKyB4X3BvczsKKworICAgICAgICAvKiB3b3JkLWFsaWduIHN0YXJ0ICovCisgICAgICAgIG9mZnNldCA9ICh1aW50MzIpc3RhcnQgJiAweDM7CisgICAgICAgIGlmIChvZmZzZXQpIHN0YXJ0IC09IG9mZnNldDsKKworICAgICAgICB3b3JkMSA9ICooKHVpbnQzMiopc3RhcnQpOworICAgICAgICB3b3JkMiA9ICooKHVpbnQzMiopKHN0YXJ0ICsgNCkpOworICAgICAgICB3b3JkMyA9ICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpOworCisgICAgICAgIC8qIHBhZCB1cCBOIHJvd3MgKi8KKyAgICAgICAgaiA9IC15X3BvczsKKyAgICAgICAgaWYgKGogPiA4KSBqID0gODsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgLT0gcGljcGl0Y2gpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA0KSkgPSB3b3JkMjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpID0gd29yZDM7CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIGlmICh5X3BvcyArIHBhZF9oZWlnaHQgPj0gcGljaGVpZ2h0KSAvKiBwYWQgZG93biAqLworICAgIHsKKyAgICAgICAgaWYgKHhfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmICsgcGljcGl0Y2ggKiAocGljaGVpZ2h0IC0gMSkgLSA4OworICAgICAgICBlbHNlIGlmICh4X3BvcyArIHBhZF93aWR0aCA+IHBpY3dpZHRoICsgNykgc3RhcnQgPSByZWYgKyBwaWNwaXRjaCAqIChwaWNoZWlnaHQgLSAxKSArCisgICAgICAgICAgICAgICAgICAgIHBpY3dpZHRoICsgNyAtIHBhZF93aWR0aDsKKyAgICAgICAgZWxzZSAgICBzdGFydCA9IHJlZiArIHBpY3BpdGNoICogKHBpY2hlaWdodCAtIDEpICsgeF9wb3M7CisKKyAgICAgICAgLyogd29yZC1hbGlnbiBzdGFydCAqLworICAgICAgICBvZmZzZXQgPSAodWludDMyKXN0YXJ0ICYgMHgzOworICAgICAgICBpZiAob2Zmc2V0KSBzdGFydCAtPSBvZmZzZXQ7CisKKyAgICAgICAgd29yZDEgPSAqKCh1aW50MzIqKXN0YXJ0KTsKKyAgICAgICAgd29yZDIgPSAqKCh1aW50MzIqKShzdGFydCArIDQpKTsKKyAgICAgICAgd29yZDMgPSAqKCh1aW50MzIqKShzdGFydCArIDgpKTsKKworICAgICAgICAvKiBwYWQgZG93biBOIHJvd3MgKi8KKyAgICAgICAgaiA9IHlfcG9zICsgcGFkX2hlaWdodCAtIHBpY2hlaWdodDsKKyAgICAgICAgaWYgKGogPiA4KSBqID0gODsKKyAgICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgeworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKz0gcGljcGl0Y2gpKSA9IHdvcmQxOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyA0KSkgPSB3b3JkMjsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgOCkpID0gd29yZDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBub3cgcGFkIGhvcml6b250YWwgKi8KKyAgICBpZiAoeF9wb3MgPCAwKSAvLyBwYWQgbGVmdAorICAgIHsKKyAgICAgICAgaWYgKHlfcG9zIDwgLTgpIHN0YXJ0ID0gcmVmIC0gKHBpY3BpdGNoIDw8IDMpOworICAgICAgICBlbHNlIGlmICh5X3BvcyArIHBhZF9oZWlnaHQgPiBwaWNoZWlnaHQgKyA3KSBzdGFydCA9IHJlZiArIChwaWNoZWlnaHQgKyA3IC0gcGFkX2hlaWdodCkgKiBwaWNwaXRjaDsKKyAgICAgICAgZWxzZSBzdGFydCA9IHJlZiArIHlfcG9zICogcGljcGl0Y2g7CisKKyAgICAgICAgLy8gbm93IHBhZCBsZWZ0IDggcGl4ZWxzIGZvciBwYWRfaGVpZ2h0IHJvd3MgKi8KKyAgICAgICAgaiA9IHBhZF9oZWlnaHQ7CisgICAgICAgIHN0YXJ0IC09IHBpY3BpdGNoOworICAgICAgICB3aGlsZSAoai0tKQorICAgICAgICB7CisgICAgICAgICAgICB3b3JkMSA9ICooc3RhcnQgKz0gcGljcGl0Y2gpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDgpOworICAgICAgICAgICAgd29yZDEgfD0gKHdvcmQxIDw8IDE2KTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0IC0gOCkpID0gd29yZDE7CisgICAgICAgICAgICAqKCh1aW50MzIqKShzdGFydCAtIDQpKSA9IHdvcmQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHhfcG9zICsgcGFkX3dpZHRoID49IHBpY3dpZHRoKSAvKiBwYWQgcmlnaHQgKi8KKyAgICB7CisgICAgICAgIGlmICh5X3BvcyA8IC04KSBzdGFydCA9IHJlZiAtIChwaWNwaXRjaCA8PCAzKSArIHBpY3dpZHRoIC0gMTsKKyAgICAgICAgZWxzZSBpZiAoeV9wb3MgKyBwYWRfaGVpZ2h0ID4gcGljaGVpZ2h0ICsgNykgc3RhcnQgPSByZWYgKyAocGljaGVpZ2h0ICsgNyAtIHBhZF9oZWlnaHQpICogcGljcGl0Y2ggKyBwaWN3aWR0aCAtIDE7CisgICAgICAgIGVsc2Ugc3RhcnQgPSByZWYgKyB5X3BvcyAqIHBpY3BpdGNoICsgcGljd2lkdGggLSAxOworCisgICAgICAgIC8vIG5vdyBwYWQgcmlnaHQgOCBwaXhlbHMgZm9yIHBhZF9oZWlnaHQgcm93cyAqLworICAgICAgICBqID0gcGFkX2hlaWdodDsKKyAgICAgICAgc3RhcnQgLT0gcGljcGl0Y2g7CisgICAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHdvcmQxID0gKihzdGFydCArPSBwaWNwaXRjaCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgOCk7CisgICAgICAgICAgICB3b3JkMSB8PSAod29yZDEgPDwgMTYpOworICAgICAgICAgICAgKigodWludDMyKikoc3RhcnQgKyAxKSkgPSB3b3JkMTsKKyAgICAgICAgICAgICooKHVpbnQzMiopKHN0YXJ0ICsgNSkpID0gd29yZDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgZUNocm9tYU1vdGlvbkNvbXAodWludDggKnJlZiwgaW50IHBpY3dpZHRoLCBpbnQgcGljaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9wb3MsIGludCB5X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnByZWQsIGludCBwaWNwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgIGludCBkeCwgZHk7CisgICAgaW50IG9mZnNldF9keCwgb2Zmc2V0X2R5OworICAgIGludCBpbmRleDsKKworICAgIGVQYWRDaHJvbWEocmVmLCBwaWN3aWR0aCwgcGljaGVpZ2h0LCBwaWNwaXRjaCwgeF9wb3MsIHlfcG9zKTsKKworICAgIGR4ID0geF9wb3MgJiA3OworICAgIGR5ID0geV9wb3MgJiA3OworICAgIG9mZnNldF9keCA9IChkeCArIDcpID4+IDM7CisgICAgb2Zmc2V0X2R5ID0gKGR5ICsgNykgPj4gMzsKKyAgICB4X3BvcyA9IHhfcG9zID4+IDM7ICAvKiByb3VuZCBpdCB0byBmdWxsLXBlbCByZXNvbHV0aW9uICovCisgICAgeV9wb3MgPSB5X3BvcyA+PiAzOworCisgICAgcmVmICs9IHlfcG9zICogcGljcGl0Y2ggKyB4X3BvczsKKworICAgIGluZGV4ID0gb2Zmc2V0X2R4ICsgKG9mZnNldF9keSA8PCAxKSArICgoYmxrd2lkdGggPDwgMSkgJiAweDcpOworCisgICAgKCooZUNocm9tYU1DX1NJTURbaW5kZXhdKSkocmVmLCBwaWNwaXRjaCAsIGR4LCBkeSwgcHJlZCwgcGljcGl0Y2gsIGJsa3dpZHRoLCBibGtoZWlnaHQpOworICAgIHJldHVybiA7Cit9CisKKworLyogU0lNRCByb3V0aW5lcywgdW5yb2xsIHRoZSBsb29wcyBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24sIGRlY3JlYXNpbmcgbG9vcHMgKHRoaW5ncyB0byBiZSBkb25lKSAqLwordm9pZCBlQ2hyb21hRGlhZ29uYWxNQ19TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwT3V0LCBpbnQgcHJlZFBpdGNoLCBpbnQgYmxrd2lkdGgsIGludCBibGtoZWlnaHQpCit7CisgICAgaW50MzIgcjAsIHIxLCByMiwgcjMsIHJlc3VsdDAsIHJlc3VsdDE7CisgICAgdWludDggdGVtcFsyODhdOworICAgIHVpbnQ4ICpyZWYsICpvdXQ7CisgICAgaW50IGksIGo7CisgICAgaW50IGR4XzggPSA4IC0gZHg7CisgICAgaW50IGR5XzggPSA4IC0gZHk7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgb3V0ID0gdGVtcDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmxraGVpZ2h0ICsgMTsgaSsrKQorICAgIHsKKyAgICAgICAgcmVmID0gcFJlZjsKKyAgICAgICAgcjAgPSByZWZbMF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBibGt3aWR0aDsgaiArPSA0KQorICAgICAgICB7CisgICAgICAgICAgICByMCB8PSAocmVmWzJdIDw8IDE2KTsKKyAgICAgICAgICAgIHJlc3VsdDAgPSBkeF84ICogcjA7CisKKyAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MDsKKworICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMTsKKworICAgICAgICAgICAgcjIgPSByZWZbNF07CisgICAgICAgICAgICByMCA9IHIwID4+IDE2OworICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICAqKGludDMyICopKG91dCArIDE2KSA9IHJlc3VsdDA7CisKKyAgICAgICAgICAgIHJlZiArPSA0OworICAgICAgICAgICAgb3V0ICs9IDQ7CisgICAgICAgICAgICByMCA9IHIyOworICAgICAgICB9CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIG91dCArPSAoMzIgLSBibGt3aWR0aCk7CisgICAgfQorCisvLyAgcFJlZiAtPSBzcmNQaXRjaCooYmxraGVpZ2h0KzEpOworICAgIHJlZiA9IHRlbXA7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYmxrd2lkdGg7IGogKz0gNCkKKyAgICB7CisgICAgICAgIHIwID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgcjEgPSAqKGludDMyICopKHJlZiArIDE2KTsKKyAgICAgICAgcmVmICs9IDMyOworICAgICAgICBvdXQgPSBwT3V0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGJsa2hlaWdodCA+PiAxKTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMCA9IHIyOworCisgICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7CisgICAgICAgICAgICByZXN1bHQxID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisgICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOworICAgICAgICAgICAgcmVmICs9IDMyOworCisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIyID0gKihpbnQzMiAqKXJlZjsKKyAgICAgICAgICAgIHJlc3VsdDAgKz0gZHkgKiByMjsKKyAgICAgICAgICAgIHJlc3VsdDAgPj49IDY7CisgICAgICAgICAgICByZXN1bHQwICY9IDB4MDBGRjAwRkY7CisgICAgICAgICAgICByMCA9IHIyOworCisgICAgICAgICAgICByZXN1bHQxID0gZHlfOCAqIHIxICsgMHgwMDIwMDAyMDsKKyAgICAgICAgICAgIHIzID0gKihpbnQzMiAqKShyZWYgKyAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR5ICogcjM7CisgICAgICAgICAgICByZXN1bHQxID4+PSA2OworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjEgPSByMzsKKyAgICAgICAgICAgICooaW50MzIgKilvdXQgPSByZXN1bHQwIHwgKHJlc3VsdDEgPDwgOCk7CisgICAgICAgICAgICBvdXQgKz0gcHJlZFBpdGNoOworICAgICAgICAgICAgcmVmICs9IDMyOworICAgICAgICB9CisgICAgICAgIHBPdXQgKz0gNDsKKyAgICAgICAgcmVmID0gdGVtcCArIDQ7IC8qIHNpbmNlIGl0IGNhbiBvbmx5IGl0ZXJhdGUgdHdpY2UgbWF4ICovCisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hSG9yaXpvbnRhbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeSk7CisKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByZXN1bHQwLCByZXN1bHQxOworICAgIHVpbnQ4ICpyZWYsICpvdXQ7CisgICAgaW50IGksIGo7CisgICAgaW50IGR4XzggPSA4IC0gZHg7CisKKyAgICAvKiBob3Jpem9udGFsIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJsa2hlaWdodDsgaSsrKQorICAgIHsKKyAgICAgICAgcmVmID0gcFJlZjsKKyAgICAgICAgb3V0ID0gcE91dDsKKworICAgICAgICByMCA9IHJlZlswXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa3dpZHRoOyBqICs9IDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIwIHw9IChyZWZbMl0gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MCA9IGR4XzggKiByMCArIDB4MDAwNDAwMDQ7CisKKyAgICAgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR4ICogcjE7CisgICAgICAgICAgICByZXN1bHQwID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworCisgICAgICAgICAgICByZXN1bHQxID0gZHhfOCAqIHIxICsgMHgwMDA0MDAwNDsKKworICAgICAgICAgICAgcjIgPSByZWZbNF07CisgICAgICAgICAgICByMCA9IHIwID4+IDE2OworICAgICAgICAgICAgcjEgPSByMCB8IChyMiA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQxICs9IGR4ICogcjE7CisgICAgICAgICAgICByZXN1bHQxID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MSAmPSAweDAwRkYwMEZGOworCisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworCisgICAgICAgICAgICByZWYgKz0gNDsKKyAgICAgICAgICAgIG91dCArPSA0OworICAgICAgICAgICAgcjAgPSByMjsKKyAgICAgICAgfQorCisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgICAgIHBPdXQgKz0gcHJlZFBpdGNoOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgZUNocm9tYVZlcnRpY2FsTUNfU0lNRCh1aW50OCAqcFJlZiwgaW50IHNyY1BpdGNoLCBpbnQgZHgsIGludCBkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisKKyAgICBpbnQzMiByMCwgcjEsIHIyLCByMywgcmVzdWx0MCwgcmVzdWx0MTsKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OCAqcmVmLCAqb3V0OworICAgIGludCBkeV84ID0gOCAtIGR5OworICAgIC8qIHZlcnRpY2FsIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGJsa3dpZHRoOyBpICs9IDQpCisgICAgeworICAgICAgICByZWYgPSBwUmVmOworICAgICAgICBvdXQgPSBwT3V0OworCisgICAgICAgIHIwID0gcmVmWzBdIHwgKHJlZlsyXSA8PCAxNik7CisgICAgICAgIHIxID0gcmVmWzFdIHwgKHJlZlszXSA8PCAxNik7CisgICAgICAgIHJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJsa2hlaWdodDsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQwID0gZHlfOCAqIHIwICsgMHgwMDA0MDAwNDsKKyAgICAgICAgICAgIHIyID0gcmVmWzBdIHwgKHJlZlsyXSA8PCAxNik7CisgICAgICAgICAgICByZXN1bHQwICs9IGR5ICogcjI7CisgICAgICAgICAgICByZXN1bHQwID4+PSAzOworICAgICAgICAgICAgcmVzdWx0MCAmPSAweDAwRkYwMEZGOworICAgICAgICAgICAgcjAgPSByMjsKKworICAgICAgICAgICAgcmVzdWx0MSA9IGR5XzggKiByMSArIDB4MDAwNDAwMDQ7CisgICAgICAgICAgICByMyA9IHJlZlsxXSB8IChyZWZbM10gPDwgMTYpOworICAgICAgICAgICAgcmVzdWx0MSArPSBkeSAqIHIzOworICAgICAgICAgICAgcmVzdWx0MSA+Pj0gMzsKKyAgICAgICAgICAgIHJlc3VsdDEgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgICAgIHIxID0gcjM7CisgICAgICAgICAgICAqKGludDMyICopb3V0ID0gcmVzdWx0MCB8IChyZXN1bHQxIDw8IDgpOworICAgICAgICAgICAgcmVmICs9IHNyY1BpdGNoOworICAgICAgICAgICAgb3V0ICs9IHByZWRQaXRjaDsKKyAgICAgICAgfQorICAgICAgICBwT3V0ICs9IDQ7CisgICAgICAgIHBSZWYgKz0gNDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFEaWFnb25hbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoYmxrd2lkdGgpOworCisgICAgaW50MzIgcjAsIHIxLCB0ZW1wMCwgdGVtcDEsIHJlc3VsdDsKKyAgICBpbnQzMiB0ZW1wWzldOworICAgIGludDMyICpvdXQ7CisgICAgaW50IGksIHJfdGVtcDsKKyAgICBpbnQgZHlfOCA9IDggLSBkeTsKKworICAgIC8qIGhvcml6b250YWwgZmlyc3QgKi8KKyAgICBvdXQgPSB0ZW1wOworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQgKyAxOyBpKyspCisgICAgeworICAgICAgICByX3RlbXAgPSBwUmVmWzFdOworICAgICAgICB0ZW1wMCA9IChwUmVmWzBdIDw8IDMpICsgZHggKiAocl90ZW1wIC0gcFJlZlswXSk7CisgICAgICAgIHRlbXAxID0gKHJfdGVtcCA8PCAzKSArIGR4ICogKHBSZWZbMl0gLSByX3RlbXApOworICAgICAgICByMCA9IHRlbXAwIHwgKHRlbXAxIDw8IDE2KTsKKyAgICAgICAgKm91dCsrID0gcjA7CisgICAgICAgIHBSZWYgKz0gc3JjUGl0Y2g7CisgICAgfQorCisgICAgcFJlZiAtPSBzcmNQaXRjaCAqIChibGtoZWlnaHQgKyAxKTsKKworICAgIG91dCA9IHRlbXA7CisKKyAgICByMCA9ICpvdXQrKzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGR5XzggKiByMCArIDB4MDAyMDAwMjA7CisgICAgICAgIHIxID0gKm91dCsrOworICAgICAgICByZXN1bHQgKz0gZHkgKiByMTsKKyAgICAgICAgcmVzdWx0ID4+PSA2OworICAgICAgICByZXN1bHQgJj0gMHgwMEZGMDBGRjsKKyAgICAgICAgKihpbnQxNiAqKXBPdXQgPSAocmVzdWx0ID4+IDgpIHwgKHJlc3VsdCAmIDB4RkYpOworICAgICAgICByMCA9IHIxOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGVDaHJvbWFIb3Jpem9udGFsTUMyX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDggKnBPdXQsIGludCBwcmVkUGl0Y2gsIGludCBibGt3aWR0aCwgaW50IGJsa2hlaWdodCkKK3sKKyAgICAodm9pZCkoZHkpOworICAgICh2b2lkKShibGt3aWR0aCk7CisKKyAgICBpbnQgaSwgdGVtcCwgdGVtcDAsIHRlbXAxOworCisgICAgLyogaG9yaXpvbnRhbCBmaXJzdCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAgPSBwUmVmWzFdOworICAgICAgICB0ZW1wMCA9ICgocFJlZlswXSA8PCAzKSArIGR4ICogKHRlbXAgLSBwUmVmWzBdKSArIDQpID4+IDM7CisgICAgICAgIHRlbXAxID0gKCh0ZW1wIDw8IDMpICsgZHggKiAocFJlZlsyXSAtIHRlbXApICsgNCkgPj4gMzsKKworICAgICAgICAqKGludDE2ICopcE91dCA9IHRlbXAwIHwgKHRlbXAxIDw8IDgpOworICAgICAgICBwUmVmICs9IHNyY1BpdGNoOworICAgICAgICBwT3V0ICs9IHByZWRQaXRjaDsKKworICAgIH0KKyAgICByZXR1cm47Cit9Cit2b2lkIGVDaHJvbWFWZXJ0aWNhbE1DMl9TSU1EKHVpbnQ4ICpwUmVmLCBpbnQgc3JjUGl0Y2gsIGludCBkeCwgaW50IGR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisgICAgKHZvaWQpKGJsa3dpZHRoKTsKKworICAgIGludDMyIHIwLCByMSwgcmVzdWx0OworICAgIGludCBpOworICAgIGludCBkeV84ID0gOCAtIGR5OworICAgIHIwID0gcFJlZlswXSB8IChwUmVmWzFdIDw8IDE2KTsKKyAgICBwUmVmICs9IHNyY1BpdGNoOworICAgIGZvciAoaSA9IDA7IGkgPCBibGtoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IGR5XzggKiByMCArIDB4MDAwNDAwMDQ7CisgICAgICAgIHIxID0gcFJlZlswXSB8IChwUmVmWzFdIDw8IDE2KTsKKyAgICAgICAgcmVzdWx0ICs9IGR5ICogcjE7CisgICAgICAgIHJlc3VsdCA+Pj0gMzsKKyAgICAgICAgcmVzdWx0ICY9IDB4MDBGRjAwRkY7CisgICAgICAgICooaW50MTYgKilwT3V0ID0gKHJlc3VsdCA+PiA4KSB8IChyZXN1bHQgJiAweEZGKTsKKyAgICAgICAgcjAgPSByMTsKKyAgICAgICAgcFJlZiArPSBzcmNQaXRjaDsKKyAgICAgICAgcE91dCArPSBwcmVkUGl0Y2g7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBlQ2hyb21hRnVsbE1DX1NJTUQodWludDggKnBSZWYsIGludCBzcmNQaXRjaCwgaW50IGR4LCBpbnQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCAqcE91dCwgaW50IHByZWRQaXRjaCwgaW50IGJsa3dpZHRoLCBpbnQgYmxraGVpZ2h0KQoreworICAgICh2b2lkKShkeCk7CisgICAgKHZvaWQpKGR5KTsKKworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXRfaW4gPSBzcmNQaXRjaCAtIGJsa3dpZHRoOworICAgIGludCBvZmZzZXRfb3V0ID0gcHJlZFBpdGNoIC0gYmxrd2lkdGg7CisgICAgdWludDE2IHRlbXA7CisgICAgdWludDggYnl0ZTsKKworICAgIGlmICgoKHVpbnQzMilwUmVmKSYxKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKnBSZWYrKzsKKyAgICAgICAgICAgICAgICBieXRlID0gKnBSZWYrKzsKKyAgICAgICAgICAgICAgICB0ZW1wIHw9IChieXRlIDw8IDgpOworICAgICAgICAgICAgICAgICooKHVpbnQxNiopcE91dCkgPSB0ZW1wOyAvKiB3cml0ZSAyIGJ5dGVzICovCisgICAgICAgICAgICAgICAgcE91dCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgcFJlZiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChqID0gYmxraGVpZ2h0OyBqID4gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGkgPSBibGt3aWR0aDsgaSA+IDA7IGkgLT0gMikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wID0gKigodWludDE2KilwUmVmKTsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTYqKXBPdXQpID0gdGVtcDsKKyAgICAgICAgICAgICAgICBwUmVmICs9IDI7CisgICAgICAgICAgICAgICAgcE91dCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dCArPSBvZmZzZXRfb3V0OworICAgICAgICAgICAgcFJlZiArPSBvZmZzZXRfaW47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9tb3Rpb25fZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjUwZWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL21vdGlvbl9lc3QuY3BwCkBAIC0wLDAgKzEsMTc3NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisKKyNkZWZpbmUgTUlOX0dPUCAgICAgMSAgIC8qIG1pbmltdW0gc2l6ZSBvZiBHT1AsIDEvMjMvMDEsIG5lZWQgdG8gYmUgdGVzdGVkICovCisKKyNkZWZpbmUgREVGQVVMVF9SRUZfSURYICAgICAwICAvKiBhbHdheXMgZnJvbSB0aGUgZmlyc3QgZnJhbWUgaW4gdGhlIHJlZmxpc3QgKi8KKworI2RlZmluZSBBTExfQ0FORF9FUVVBTCAgMTAgIC8qICBhbnkgbnVtYmVyIGdyZWF0ZXIgdGhhbiA1IHdpbGwgd29yayAqLworCisKKy8qIGZyb20gVE1OIDMuMiAqLworI2RlZmluZSBQUkVGX05VTExfVkVDIDEyOSAgIC8qIHplcm8gdmVjdG9yIGJpYXMgKi8KKyNkZWZpbmUgUFJFRl8xNl9WRUMgMTI5ICAgICAvKiAxTVYgYmlhcyB2ZXJzdXMgNE1WcyovCisjZGVmaW5lIFBSRUZfSU5UUkEgIDMwMjQvLzUxMiAgICAgICAvKiBiaWFzIGZvciBJTlRSQSBjb2RpbmcgKi8KKworY29uc3Qgc3RhdGljIGludCB0YWJfZXhjbHVkZVs5XVs5XSA9ICAvLyBbbGFzdF9sb2NdW2N1cnJfbG9jXQoreworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKyAgICB7MCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMH0sCisgICAgezAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDF9LAorICAgIHswLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxfSwKKyAgICB7MCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMX0sCisgICAgezAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDF9LAorICAgIHswLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxfSwKKyAgICB7MCwgMCwgMSwgMSwgMSwgMCwgMCwgMCwgMH0sCisgICAgezAsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDB9Cit9OyAvL3RvIGRlY2lkZSB3aGV0aGVyIHRvIGNvbnRpbnVlIG9yIGNvbXB1dGUKKworY29uc3Qgc3RhdGljIGludCByZWZpbmVfbmV4dFs4XVsyXSA9ICAgIC8qIFtjdXJyX2tdW2luY3JlbWVudF0gKi8KK3sKKyAgICB7MCwgMH0sIHsyLCAwfSwgezEsIDF9LCB7MCwgMn0sIHsgLTEsIDF9LCB7IC0yLCAwfSwgeyAtMSwgLTF9LCB7MCwgLTJ9Cit9OworCisjaWZkZWYgX1NBRF9TVEFUCit1aW50MzIgbnVtX01CID0gMDsKK3VpbnQzMiBudW1fY2FuZCA9IDA7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgVEhfSU5URVJfMiAgMTAwICAvKiB0ZW1wb3JhcnkgZm9yIG5vdyAqLworCisvLyNkZWZpbmUgRklYRURfSU5URVJQUkVEX01PREUgIEFWQ19QMTYKKyNkZWZpbmUgRklYRURfUkVGX0lEWCAgIDAKKyNkZWZpbmUgRklYRURfTVZYIDAKKyNkZWZpbmUgRklYRURfTVZZIDAKKworLy8gb25seSB1c2Ugd2hlbiBBVkNfUDggb3IgQVZDX1A4cmVmMAorI2RlZmluZSBGSVhFRF9TVUJNQl9NT0RFICAgIEFWQ180eDQKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBJbml0aWFsaXplIGFycmF5cyBuZWNlc3NhcnkgZm9yIG1vdGlvbiBzZWFyY2ggKi8KK0FWQ0VuY19TdGF0dXMgSW5pdE1vdGlvblNlYXJjaE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIGludCBzZWFyY2hfcmFuZ2UgPSByYXRlQ3RybC0+bXZSYW5nZTsKKyAgICBpbnQgbnVtYmVyX29mX3N1YnBlbF9wb3NpdGlvbnMgPSA0ICogKDIgKiBzZWFyY2hfcmFuZ2UgKyAzKTsKKyAgICBpbnQgbWF4X212X2JpdHMsIG1heF9tdmQ7CisgICAgaW50IHRlbXBfYml0cyA9IDA7CisgICAgdWludDggKm12Yml0czsKKyAgICBpbnQgYml0cywgaW1heCwgaW1pbiwgaTsKKyAgICB1aW50OCogc3VicGVsX3ByZWQgPSAodWludDgqKSBlbmN2aWQtPnN1YnBlbF9wcmVkOyAvLyBhbGwgMTYgc3ViLXBlbCBwb3NpdGlvbnMKKworCisgICAgd2hpbGUgKG51bWJlcl9vZl9zdWJwZWxfcG9zaXRpb25zID4gMCkKKyAgICB7CisgICAgICAgIHRlbXBfYml0cysrOworICAgICAgICBudW1iZXJfb2Zfc3VicGVsX3Bvc2l0aW9ucyA+Pj0gMTsKKyAgICB9CisKKyAgICBtYXhfbXZfYml0cyA9IDMgKyAyICogdGVtcF9iaXRzOworICAgIG1heF9tdmQgID0gKDEgPDwgKG1heF9tdl9iaXRzID4+IDEpKSAtIDE7CisKKyAgICBlbmN2aWQtPm12Yml0c19hcnJheSA9ICh1aW50OCopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OCkgKiAoMiAqIG1heF9tdmQgKyAxKSwgREVGQVVMVF9BVFRSKTsKKworICAgIGlmIChlbmN2aWQtPm12Yml0c19hcnJheSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19NRU1PUllfRkFJTDsKKyAgICB9CisKKyAgICBtdmJpdHMgPSBlbmN2aWQtPm12Yml0cyAgPSBlbmN2aWQtPm12Yml0c19hcnJheSArIG1heF9tdmQ7CisKKyAgICBtdmJpdHNbMF0gPSAxOworICAgIGZvciAoYml0cyA9IDM7IGJpdHMgPD0gbWF4X212X2JpdHM7IGJpdHMgKz0gMikKKyAgICB7CisgICAgICAgIGltYXggPSAxICAgIDw8IChiaXRzID4+IDEpOworICAgICAgICBpbWluID0gaW1heCA+PiAxOworCisgICAgICAgIGZvciAoaSA9IGltaW47IGkgPCBpbWF4OyBpKyspICAgbXZiaXRzWy1pXSA9IG12Yml0c1tpXSA9IGJpdHM7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBoYWxmLXBlbCBzZWFyY2ggKi8KKyAgICBlbmN2aWQtPmhwZWxfY2FuZFswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMSA7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbM10gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzRdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs1XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5ocGVsX2NhbmRbNl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+aHBlbF9jYW5kWzddID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmhwZWxfY2FuZFs4XSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworCisgICAgLyogRm9yIHF1YXJ0ZXItcGVsIGludGVycG9sYXRpb24gYXJvdW5kIGJlc3QgaGFsZi1wZWwgcmVzdWx0ICovCisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bMF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzBdWzJdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMF1bM10gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVswXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVsxXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsxXVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVsyXVsxXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbMl1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzJdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworCisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzBdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVszXVsxXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbM11bMl0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVI7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzNdWzNdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUjsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNF1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI1OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs0XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gwUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjU7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzRdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVswXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzFdID0gc3VicGVsX3ByZWQgKyBSRUZfQ0VOVEVSOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs1XVsyXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzVdWzNdID0gc3VicGVsX3ByZWQgKyBWMlFfSDBRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNTsKKworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVswXSA9IHN1YnBlbF9wcmVkICsgUkVGX0NFTlRFUiAtIDE7CisgICAgZW5jdmlkLT5iaWxpbl9iYXNlWzZdWzFdID0gc3VicGVsX3ByZWQgKyBWMFFfSDJRICogU1VCUEVMX1BSRURfQkxLX1NJWkUgKyAyNDsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbNl1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRSArIDI0OworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs2XVszXSA9IHN1YnBlbF9wcmVkICsgVjJRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMF0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMV0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbN11bMl0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAxOworICAgIGVuY3ZpZC0+YmlsaW5fYmFzZVs3XVszXSA9IHN1YnBlbF9wcmVkICsgVjBRX0gyUSAqIFNVQlBFTF9QUkVEX0JMS19TSVpFICsgMjQ7CisKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMF0gPSBzdWJwZWxfcHJlZCArIFJFRl9DRU5URVIgLSAyNTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMV0gPSBzdWJwZWxfcHJlZCArIFYwUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bMl0gPSBzdWJwZWxfcHJlZCArIFYyUV9IMFEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKyAgICBlbmN2aWQtPmJpbGluX2Jhc2VbOF1bM10gPSBzdWJwZWxfcHJlZCArIFYyUV9IMlEgKiBTVUJQRUxfUFJFRF9CTEtfU0laRTsKKworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisvKiBDbGVhbi11cCBtZW1vcnkgKi8KK3ZvaWQgQ2xlYW5Nb3Rpb25TZWFyY2hNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisKKyAgICBpZiAoZW5jdmlkLT5tdmJpdHNfYXJyYXkpCisgICAgeworICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludCkoZW5jdmlkLT5tdmJpdHNfYXJyYXkpKTsKKyAgICAgICAgZW5jdmlkLT5tdmJpdHMgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKworYm9vbCBJbnRyYURlY2lzaW9uQUJFKGludCAqbWluX2Nvc3QsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCwgYm9vbCBhdmUpCit7CisgICAgaW50IGo7CisgICAgdWludDggKm91dDsKKyAgICBpbnQgdGVtcCwgU0JFOworICAgIE9zY2xGbG9hdCBBQkU7CisgICAgYm9vbCBpbnRyYSA9IHRydWU7CisKKyAgICBTQkUgPSAwOworICAgIC8qIHRvcCBuZWlnaGJvciAqLworICAgIG91dCA9IGN1ciAtIHBpdGNoOworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgdGVtcCA9IG91dFtqXSAtIGN1cltqXTsKKyAgICAgICAgU0JFICs9ICgodGVtcCA+PSAwKSA/IHRlbXAgOiAtdGVtcCk7CisgICAgfQorCisgICAgLyogbGVmdCBuZWlnaGJvciAqLworICAgIG91dCA9IGN1ciAtIDE7CisgICAgb3V0IC09IHBpdGNoOworICAgIGN1ciAtPSBwaXRjaDsKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgIHRlbXAgPSAqKG91dCArPSBwaXRjaCkgLSAqKGN1ciArPSBwaXRjaCk7CisgICAgICAgIFNCRSArPSAoKHRlbXAgPj0gMCkgPyB0ZW1wIDogLXRlbXApOworICAgIH0KKworICAgIC8qIGNvbXBhcmUgbWluY29zdC8zODQgYW5kIFNCRS82NCAqLworICAgIEFCRSA9IFNCRSAvIDMyLjA7IC8vQUJFID0gU0JFLzY0LjA7IC8vCisgICAgaWYgKEFCRSA+PSAqbWluX2Nvc3QgLyAyNTYuMCkgLy9pZiggQUJFKjAuOCA+PSBtaW5fY29zdC8zODQuMCkgLy8KKyAgICB7CisgICAgICAgIGludHJhID0gZmFsc2U7IC8vIG5vIHBvc3NpYmlsaXR5IG9mIGludHJhLCBqdXN0IHVzZSBpbnRlcgorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoYXZlID09IHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICAgICptaW5fY29zdCA9ICgqbWluX2Nvc3QgKyAoaW50KShTQkUgKiA4KSkgPj4gMTsgLy8gcG9zc2liaWxpdHkgb2YgaW50cmEsIGF2ZXJhZ2luZyB0aGUgY29zdAorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKm1pbl9jb3N0ID0gKGludCkoU0JFICogOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW50cmE7Cit9CisKKy8qKioqKioqIG1haW4gZnVuY3Rpb24gZm9yIG1hY3JvYmxvY2sgcHJlZGljdGlvbiBmb3IgdGhlIGVudGlyZSBmcmFtZSAqKiovCisvKiBpZiB0dXJucyBvdXQgdG8gYmUgSURSIGZyYW1lLCBzZXQgdmlkZW8tPm5hbF91bml0X3R5cGUgdG8gQVZDX05BTFRZUEVfSURSICovCit2b2lkIEFWQ01vdGlvbkVzdGltYXRpb24oQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIGludCBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisgICAgQVZDRnJhbWVJTyAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDUGljdHVyZURhdGEgKnJlZlBpYyA9IHZpZGVvLT5SZWZQaWNMaXN0MFswXTsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgbWJ3aWR0aCA9IHZpZGVvLT5QaWNXaWR0aEluTWJzOworICAgIGludCBtYmhlaWdodCA9IHZpZGVvLT5QaWNIZWlnaHRJbk1iczsKKyAgICBpbnQgdG90YWxNQiA9IHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgaW50IHBpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBBVkNNYWNyb2Jsb2NrICpjdXJyTUIsICptYmxvY2sgPSB2aWRlby0+bWJsb2NrOworICAgIEFWQ01WICptb3RfbWJfMTZ4MTYsICptb3QxNngxNiA9IGVuY3ZpZC0+bW90MTZ4MTY7CisgICAgLy8gQVZDTVYgKm1vdF9tYl8xNng4LCAqbW90X21iXzh4MTYsICptb3RfbWJfOHg4LCBldGM7CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICB1aW50OCAqaW50cmFTZWFyY2ggPSBlbmN2aWQtPmludHJhU2VhcmNoOworICAgIHVpbnQgRlNfZW4gPSBlbmN2aWQtPmZ1bGxzZWFyY2hfZW5hYmxlOworCisgICAgaW50IE51bUludHJhU2VhcmNoLCBzdGFydF9pLCBudW1Mb29wLCBpbmNyX2k7CisgICAgaW50IG1ibnVtLCBvZmZzZXQ7CisgICAgdWludDggKmN1ciwgKmJlc3RfY2FuZFs1XTsKKyAgICBpbnQgdG90YWxTQUQgPSAwOyAgIC8qIGF2ZXJhZ2UgU0FEIGZvciByYXRlIGNvbnRyb2wgKi8KKyAgICBpbnQgdHlwZV9wcmVkOworICAgIGludCBhYmVfY29zdDsKKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLyAgLyogMi8yOC8wMSAqLworICAgIGludCBjb2xsZWN0ID0gMDsKKyAgICBIVEZNX1N0YXQgaHRmbV9zdGF0OworICAgIGRvdWJsZSBuZXd2YXJbMTZdOworICAgIGRvdWJsZSBleHBfbGFtZGFbMTVdOworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKyAgICBpbnQgaHBfZ3Vlc3MgPSAwOworICAgIHVpbnQzMiBtdl91aW50MzI7CisKKyAgICBvZmZzZXQgPSAwOworCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICAvKiBjYW5ub3QgZG8gSTE2IHByZWRpY3Rpb24gaGVyZSBiZWNhdXNlIGl0IG5lZWRzIGZ1bGwgZGVjb2RpbmcuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbE1COyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbaV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChpbnRyYVNlYXJjaCwgMSwgc2l6ZW9mKHVpbnQ4KSp0b3RhbE1CKTsKKworICAgICAgICBlbmN2aWQtPmZpcnN0SW50cmFSZWZyZXNoTUJJbmR4ID0gMDsgLyogcmVzZXQgdGhpcyAqLworCisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIGVsc2UgICAvLyBQX1NMSUNFCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxNQjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBtYmxvY2tbaV0ubWJfaW50cmEgPSAwOworICAgICAgICB9CisgICAgICAgIG1lbXNldChpbnRyYVNlYXJjaCwgMSwgc2l6ZW9mKHVpbnQ4KSp0b3RhbE1CKTsKKyAgICB9CisKKyAgICBpZiAocmVmUGljLT5wYWRkZWQgPT0gMCkKKyAgICB7CisgICAgICAgIEFWQ1BhZGRpbmdFZGdlKHJlZlBpYyk7CisgICAgICAgIHJlZlBpYy0+cGFkZGVkID0gMTsKKyAgICB9CisgICAgLyogUmFuZG9tIElOVFJBIHVwZGF0ZSAqLworICAgIGlmIChyYXRlQ3RybC0+aW50cmFNQlJhdGUpCisgICAgeworICAgICAgICBBVkNSYXN0ZXJJbnRyYVVwZGF0ZShlbmN2aWQsIG1ibG9jaywgdG90YWxNQiwgcmF0ZUN0cmwtPmludHJhTUJSYXRlKTsKKyAgICB9CisKKyAgICBlbmN2aWQtPnNhZF9leHRyYV9pbmZvID0gTlVMTDsKKyNpZmRlZiBIVEZNCisgICAgLyoqKioqIEhZUE9USEVTSVMgVEVTVElORyAqKioqKioqKi8KKyAgICBJbml0SFRGTSh2aWRlbywgJmh0Zm1fc3RhdCwgbmV3dmFyLCAmY29sbGVjdCk7CisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbmRpZgorCisgICAgaWYgKChyYXRlQ3RybC0+c2NkRW5hYmxlID09IDEpCisgICAgICAgICAgICAmJiAoKHJhdGVDdHJsLT5mcmFtZV9yYXRlIDwgNS4wKSB8fCAodmlkZW8tPnNsaWNlSGRyLT5mcmFtZV9udW0gPiBNSU5fR09QKSkpCisgICAgICAgIC8qIGRvIG5vdCB0cnkgdG8gZGV0ZWN0IGEgbmV3IHNjZW5lIGlmIGxvdyBmcmFtZSByYXRlIGFuZCB0b28gY2xvc2UgdG8gcHJldmlvdXMgSS1mcmFtZSAqLworICAgIHsKKyAgICAgICAgaW5jcl9pID0gMjsKKyAgICAgICAgbnVtTG9vcCA9IDI7CisgICAgICAgIHN0YXJ0X2kgPSAxOworICAgICAgICB0eXBlX3ByZWQgPSAwOyAvKiBmb3IgaW5pdGlhbCBjYW5kaWRhdGUgc2VsZWN0aW9uICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGluY3JfaSA9IDE7CisgICAgICAgIG51bUxvb3AgPSAxOworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgdHlwZV9wcmVkID0gMjsKKyAgICB9CisKKyAgICAvKiBGaXJzdCBwYXNzLCBsb29wIHRocnUgaGFsZiB0aGUgbWFjcm9ibG9jayAqLworICAgIC8qIGRldGVybWluZSBzY2VuZSBjaGFuZ2UgKi8KKyAgICAvKiBTZWNvbmQgcGFzcywgZm9yIHRoZSByZXN0IG9mIG1hY3JvYmxvY2tzICovCisgICAgTnVtSW50cmFTZWFyY2ggPSAwOyAvLyB0byBiZSBpbnRyYSBzZWFyY2hlZCBpbiB0aGUgZW5jb2RpbmcgbG9vcC4KKyAgICB3aGlsZSAobnVtTG9vcC0tKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1iaGVpZ2h0OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbmNyX2kgPiAxKQorICAgICAgICAgICAgICAgIHN0YXJ0X2kgPSAoc3RhcnRfaSA9PSAwID8gMSA6IDApIDsgLyogdG9nZ2xlIDAgYW5kIDEgKi8KKworICAgICAgICAgICAgb2Zmc2V0ID0gcGl0Y2ggKiAoaiA8PCA0KSArIChzdGFydF9pIDw8IDQpOworCisgICAgICAgICAgICBtYm51bSA9IGogKiBtYndpZHRoICsgc3RhcnRfaTsKKworICAgICAgICAgICAgZm9yIChpID0gc3RhcnRfaTsgaSA8IG1id2lkdGg7IGkgKz0gaW5jcl9pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYk51bSA9IG1ibnVtOworICAgICAgICAgICAgICAgIHZpZGVvLT5jdXJyTUIgPSBjdXJyTUIgPSBtYmxvY2sgKyBtYm51bTsKKyAgICAgICAgICAgICAgICBtb3RfbWJfMTZ4MTYgPSBtb3QxNngxNiArIG1ibnVtOworCisgICAgICAgICAgICAgICAgY3VyID0gY3VycklucHV0LT5ZQ2JDclswXSArIG9mZnNldDsKKworICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm1iX2ludHJhID09IDApIC8qIGZvciBJTlRFUiBtb2RlICovCisgICAgICAgICAgICAgICAgeworI2lmIGRlZmluZWQoSFRGTSkKKyAgICAgICAgICAgICAgICAgICAgSFRGTVByZXBhcmVDdXJNQl9BVkMoZW5jdmlkLCAmaHRmbV9zdGF0LCBjdXIsIHBpdGNoKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEFWQ1ByZXBhcmVDdXJNQihlbmN2aWQsIGN1ciwgcGl0Y2gpOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgIC8qKioqKioqKiBmdWxsLXBlbCAxTVYgc2VhcmNoICoqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICAgICAgICAgICAgICAgICAgQVZDTUJNb3Rpb25TZWFyY2goZW5jdmlkLCBjdXIsIGJlc3RfY2FuZCwgaSA8PCA0LCBqIDw8IDQsIHR5cGVfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfZW4sICZocF9ndWVzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgYWJlX2Nvc3QgPSBlbmN2aWQtPm1pbl9jb3N0W21ibnVtXSA9IG1vdF9tYl8xNngxNi0+c2FkOworCisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBtYk1vZGUgYW5kIE1WcyAqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19QMTY7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbMF1bMF0gPSBBVkNfUHJlZF9MMDsKKyAgICAgICAgICAgICAgICAgICAgbXZfdWludDMyID0gKChtb3RfbWJfMTZ4MTYtPnkpIDw8IDE2KSB8ICgobW90X21iXzE2eDE2LT54KSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzMjsgayArPSAyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm12TDBbaz4+MV0gPSBtdl91aW50MzI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBtYWtlIGEgZGVjaXNpb24gd2hldGhlciBpdCBzaG91bGQgYmUgdGVzdGVkIGZvciBpbnRyYSBvciBub3QgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gbWJ3aWR0aCAtIDEgJiYgaiAhPSBtYmhlaWdodCAtIDEgJiYgaSAhPSAwICYmIGogIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhbHNlID09IEludHJhRGVjaXNpb25BQkUoJmFiZV9jb3N0LCBjdXIsIHBpdGNoLCB0cnVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYVNlYXJjaFttYm51bV0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUludHJhU2VhcmNoKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gYWJlX2Nvc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvLyBib3VuZGFyeSBNQnMsIGFsd2F5cyBkbyBpbnRyYSBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50cmFTZWFyY2grKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IChpbnQpIHJhdGVDdHJsLT5NQURvZk1CW21ibnVtXTsvL21vdF9tYl8xNngxNi0+c2FkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlICAgIC8qIElOVFJBIHVwZGF0ZSwgdXNlIGZvciBwcmVkaWN0aW9uICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtb3RfbWJfMTZ4MTZbMF0ueCA9IG1vdF9tYl8xNngxNlswXS55ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvKiByZXNldCBhbGwgb3RoZXIgTVZzIHRvIHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogbW90X21iXzE2eDgsIG1vdF9tYl84eDE2LCBtb3RfbWJfOHg4LCBldGMuICovCisgICAgICAgICAgICAgICAgICAgIGFiZV9jb3N0ID0gZW5jdmlkLT5taW5fY29zdFttYm51bV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBtYndpZHRoIC0gMSAmJiBqICE9IG1iaGVpZ2h0IC0gMSAmJiBpICE9IDAgJiYgaiAhPSAwKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnRyYURlY2lzaW9uQUJFKCZhYmVfY29zdCwgY3VyLCBwaXRjaCwgZmFsc2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICByYXRlQ3RybC0+TUFEb2ZNQlttYm51bV0gPSBhYmVfY29zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU0FEICs9IGFiZV9jb3N0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTnVtSW50cmFTZWFyY2grKyA7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbm5vdCBkbyBJMTYgcHJlZGljdGlvbiBoZXJlIGJlY2F1c2UgaXQgbmVlZHMgZnVsbCBkZWNvZGluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgLy8gaW50cmFTZWFyY2hbbWJudW1dID0gMTsKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1ibnVtICs9IGluY3JfaTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gKGluY3JfaSA8PCA0KTsKKworICAgICAgICAgICAgfSAvKiBmb3IgaSAqLworICAgICAgICB9IC8qIGZvciBqICovCisKKyAgICAgICAgLyogc2luY2Ugd2UgY2Fubm90IGRvIGludHJhL2ludGVyIGRlY2lzaW9uIGhlcmUsIHRoZSBTQ0QgaGFzIHRvIGJlCisgICAgICAgIGJhc2VkIG9uIG90aGVyIGNyaXRlcmlhIHN1Y2ggYXMgbW90aW9uIHZlY3RvcnMgY29oZXJlbmN5IG9yIHRoZSBTQUQgKi8KKyAgICAgICAgaWYgKGluY3JfaSA+IDEgJiYgbnVtTG9vcCkgLyogc2NlbmUgY2hhbmdlIG9uIGFuZCBmaXJzdCBsb29wICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vaWYoTnVtSW50cmFTZWFyY2ggPiAoKHRvdGFsTUI+PjMpPDwxKSArICh0b3RhbE1CPj4zKSkgLyogNzUlIG9mIDUwJU1CcyAqLworICAgICAgICAgICAgaWYgKE51bUludHJhU2VhcmNoKjk5ID4gKDQ4KnRvdGFsTUIpKSAvKiAyMCUgb2YgNTAlTUJzICovCisgICAgICAgICAgICAgICAgLyogbmVlZCB0byBkbyBtb3JlIGludmVzdGlnYXRpb24gYWJvdXQgdGhpcyB0aHJlc2hvbGQgc2luY2UgdGhlIE51bUludHJhU2VhcmNoCisgICAgICAgICAgICAgICAgb25seSBzaG93IHBvdGVudGlhbCBpbnRyYSBNQnMsIG5vdCB0aGUgYWN0dWFsIG9uZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHdlIGNhbiBjaG9vc2UgdG8ganVzdCBlbmNvZGUgSV9TTElDRSB3aXRob3V0IElEUiAqLworICAgICAgICAgICAgICAgIC8vdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9JRFI7CisgICAgICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9TTElDRTsKKyAgICAgICAgICAgICAgICB2aWRlby0+c2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfSV9BTExfU0xJQ0U7CisgICAgICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfSV9TTElDRTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoaW50cmFTZWFyY2gsIDEsIHNpemVvZih1aW50OCkqdG90YWxNQik7CisgICAgICAgICAgICAgICAgaSA9IHRvdGFsTUI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGktLSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1ibG9ja1tpXS5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+bWluX2Nvc3RbaV0gPSAweDdGRkZGRkZGOyAgLyogbWF4IHZhbHVlIGZvciBpbnQgKi8KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+dG90YWxTQUQgPSB0b3RhbFNBRCAqIDI7ICAvKiBTQUQgKi8KKworICAgICAgICAgICAgICAgIHJldHVybiA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyoqKioqKioqIG5vIHNjZW5lIGNoYW5nZSwgY29udGludWUgbW90aW9uIHNlYXJjaCAqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBzdGFydF9pID0gMDsKKyAgICAgICAgdHlwZV9wcmVkKys7IC8qIHNlY29uZCBwYXNzICovCisgICAgfQorCisgICAgcmF0ZUN0cmwtPnRvdGFsU0FEID0gdG90YWxTQUQ7ICAvKiBTQUQgKi8KKworI2lmZGVmIEhURk0KKyAgICAvKioqKiogSFlQT1RIRVNJUyBURVNUSU5HICoqKioqKioqLworICAgIGlmIChjb2xsZWN0KQorICAgIHsKKyAgICAgICAgY29sbGVjdCA9IDA7CisgICAgICAgIFVwZGF0ZUhURk0oZW5jdmlkLCBuZXd2YXIsIGV4cF9sYW1kYSwgJmh0Zm1fc3RhdCk7CisgICAgfQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZW5kaWYKKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgUGFkZGluZ0VkZ2UKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGFkIGVkZ2Ugb2YgYSBWb3AKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgIEFWQ1BhZGRpbmdFZGdlKEFWQ1BpY3R1cmVEYXRhICpyZWZQaWMpCit7CisgICAgdWludDggKnNyYywgKmRzdDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcGl0Y2gsIHdpZHRoLCBoZWlnaHQ7CisgICAgdWludDMyIHRlbXAxLCB0ZW1wMjsKKworICAgIHdpZHRoID0gcmVmUGljLT53aWR0aDsKKyAgICBoZWlnaHQgPSByZWZQaWMtPmhlaWdodDsKKyAgICBwaXRjaCA9IHJlZlBpYy0+cGl0Y2g7CisKKyAgICAvKiBwYWQgdG9wICovCisgICAgc3JjID0gcmVmUGljLT5TbDsKKworICAgIHRlbXAxID0gKnNyYzsgLyogdG9wLWxlZnQgY29ybmVyICovCisgICAgdGVtcDIgPSBzcmNbd2lkdGgtMV07IC8qIHRvcC1yaWdodCBjb3JuZXIgKi8KKyAgICB0ZW1wMSB8PSAodGVtcDEgPDwgOCk7CisgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDE2KTsKKyAgICB0ZW1wMiB8PSAodGVtcDIgPDwgOCk7CisgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDE2KTsKKworICAgIGRzdCA9IHNyYyAtIChwaXRjaCA8PCA0KTsKKworICAgICooKHVpbnQzMiopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAqKCh1aW50MzIqKShkc3QgLSAxMikpID0gdGVtcDE7CisgICAgKigodWludDMyKikoZHN0IC0gOCkpID0gdGVtcDE7CisgICAgKigodWludDMyKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKworICAgICooKHVpbnQzMiopKGRzdCArPSB3aWR0aCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgNCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgOCkpID0gdGVtcDI7CisgICAgKigodWludDMyKikoZHN0ICsgMTIpKSA9IHRlbXAyOworCisgICAgZHN0ID0gZHN0IC0gd2lkdGggLSAxNjsKKworICAgIGkgPSAxNTsKKyAgICB3aGlsZSAoaS0tKQorICAgIHsKKyAgICAgICAgbWVtY3B5KGRzdCArIHBpdGNoLCBkc3QsIHBpdGNoKTsKKyAgICAgICAgZHN0ICs9IHBpdGNoOworICAgIH0KKworICAgIC8qIHBhZCBzaWRlcyAqLworICAgIGRzdCArPSAocGl0Y2ggKyAxNik7CisgICAgc3JjID0gZHN0OworICAgIGkgPSBoZWlnaHQ7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIHRlbXAxID0gKnNyYzsKKyAgICAgICAgdGVtcDIgPSBzcmNbd2lkdGgtMV07CisgICAgICAgIHRlbXAxIHw9ICh0ZW1wMSA8PCA4KTsKKyAgICAgICAgdGVtcDEgfD0gKHRlbXAxIDw8IDE2KTsKKyAgICAgICAgdGVtcDIgfD0gKHRlbXAyIDw8IDgpOworICAgICAgICB0ZW1wMiB8PSAodGVtcDIgPDwgMTYpOworCisgICAgICAgICooKHVpbnQzMiopKGRzdCAtIDE2KSkgPSB0ZW1wMTsKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gMTIpKSA9IHRlbXAxOworICAgICAgICAqKCh1aW50MzIqKShkc3QgLSA4KSkgPSB0ZW1wMTsKKyAgICAgICAgKigodWludDMyKikoZHN0IC0gNCkpID0gdGVtcDE7CisKKyAgICAgICAgKigodWludDMyKikoZHN0ICs9IHdpZHRoKSkgPSB0ZW1wMjsKKyAgICAgICAgKigodWludDMyKikoZHN0ICsgNCkpID0gdGVtcDI7CisgICAgICAgICooKHVpbnQzMiopKGRzdCArIDgpKSA9IHRlbXAyOworICAgICAgICAqKCh1aW50MzIqKShkc3QgKyAxMikpID0gdGVtcDI7CisKKyAgICAgICAgc3JjICs9IHBpdGNoOworICAgICAgICBkc3QgPSBzcmM7CisgICAgfQorCisgICAgLyogcGFkIGJvdHRvbSAqLworICAgIGRzdCAtPSAxNjsKKyAgICBpID0gMTY7CisgICAgd2hpbGUgKGktLSkKKyAgICB7CisgICAgICAgIG1lbWNweShkc3QsIGRzdCAtIHBpdGNoLCBwaXRjaCk7CisgICAgICAgIGRzdCArPSBwaXRjaDsKKyAgICB9CisKKworICAgIHJldHVybiA7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgRnVuY3Rpb246ICAgQVZDUmFzdGVySW50cmFVcGRhdGUKKyAgICBEYXRlOiAgICAgICAyLzI2LzAxCisgICAgUHVycG9zZTogICAgVG8gcmFzdGVyLXNjYW4gYXNzaWduIElOVFJBLXVwZGF0ZSAuCisgICAgICAgICAgICAgICAgTiBtYWNyb2Jsb2NrcyBhcmUgdXBkYXRlZCAoYWxzbyB3YXMgcHJvZ3JhbW1hYmxlKS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIEFWQ1Jhc3RlckludHJhVXBkYXRlKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNNYWNyb2Jsb2NrICptYmxvY2ssIGludCB0b3RhbE1CLCBpbnQgbnVtUmVmcmVzaCkKK3sKKyAgICBpbnQgaW5keCwgaTsKKworICAgIGluZHggPSBlbmN2aWQtPmZpcnN0SW50cmFSZWZyZXNoTUJJbmR4OworICAgIGZvciAoaSA9IDA7IGkgPCBudW1SZWZyZXNoICYmIGluZHggPCB0b3RhbE1COyBpKyspCisgICAgeworICAgICAgICAobWJsb2NrICsgaW5keCktPm1iX2ludHJhID0gMTsKKyAgICAgICAgZW5jdmlkLT5pbnRyYVNlYXJjaFtpbmR4KytdID0gMTsKKyAgICB9CisKKyAgICAvKiBpZiByZWFkIHRoZSBlbmQgb2YgZnJhbWUsIHJlc2V0IGFuZCBsb29wIGFyb3VuZCAqLworICAgIGlmIChpbmR4ID49IHRvdGFsTUIgLSAxKQorICAgIHsKKyAgICAgICAgaW5keCA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbnVtUmVmcmVzaCAmJiBpbmR4IDwgdG90YWxNQikKKyAgICAgICAgeworICAgICAgICAgICAgKG1ibG9jayArIGluZHgpLT5tYl9pbnRyYSA9IDE7CisgICAgICAgICAgICBlbmN2aWQtPmludHJhU2VhcmNoW2luZHgrK10gPSAxOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jdmlkLT5maXJzdEludHJhUmVmcmVzaE1CSW5keCA9IGluZHg7IC8qIHVwZGF0ZSB3aXRoIGEgbmV3IHZhbHVlICovCisKKyAgICByZXR1cm4gOworfQorCisKKyNpZmRlZiBIVEZNCit2b2lkIEluaXRIVEZNKFZpZGVvRW5jRGF0YSAqZW5jdmlkLCBIVEZNX1N0YXQgKmh0Zm1fc3RhdCwgZG91YmxlICpuZXd2YXIsIGludCAqY29sbGVjdCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IGk7CisgICAgaW50IGx4ID0gdmlkZW8tPmN1cnJQaWMtPndpZHRoOyAvLyBwYWRkaW5nCisgICAgaW50IGx4MiA9IGx4IDw8IDE7CisgICAgaW50IGx4MyA9IGx4MiArIGx4OworICAgIGludCByeCA9IHZpZGVvLT5jdXJyUGljLT5waXRjaDsKKyAgICBpbnQgcngyID0gcnggPDwgMTsKKyAgICBpbnQgcngzID0gcngyICsgcng7CisKKyAgICBpbnQgKm9mZnNldCwgKm9mZnNldDI7CisKKyAgICAvKiA0LzExLzAxLCBjb2xsZWN0IGRhdGEgZXZlcnkgMzAgZnJhbWVzLCBkb2Vzbid0IGhhdmUgdG8gYmUgYmFzZSBsYXllciAqLworICAgIGlmICgoKGludCl2aWRlby0+c2xpY2VIZHItPmZyYW1lX251bSkgJSAzMCA9PSAxKQorICAgIHsKKworICAgICAgICAqY29sbGVjdCA9IDE7CisKKyAgICAgICAgaHRmbV9zdGF0LT5jb3VudGJyZWFrID0gMDsKKyAgICAgICAgaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcgPSAwOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuZXd2YXJbaV0gPSAwLjA7CisgICAgICAgIH0KKy8vICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9QQURESU5HID0gJlNBRF9NQl9QQURESU5HX0hURk1fQ29sbGVjdDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNX0NvbGxlY3Q7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFswXSA9IE5VTEw7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsxXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFsyXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eWg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSFBfSFRGTV9Db2xsZWN0eGh5aDsKKyAgICAgICAgZW5jdmlkLT5zYWRfZXh0cmFfaW5mbyA9ICh2b2lkKikoaHRmbV9zdGF0KTsKKyAgICAgICAgb2Zmc2V0ID0gaHRmbV9zdGF0LT5vZmZzZXRBcnJheTsKKyAgICAgICAgb2Zmc2V0MiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIH0KKyAgICBlbHNlCisgICAgeworLy8gICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX1BBRERJTkcgPSAmU0FEX01CX1BBRERJTkdfSFRGTTsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrID0gJlNBRF9NQl9IVEZNOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMF0gPSBOVUxMOworICAgICAgICBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01CX0hhbGZQZWxbMV0gPSAmU0FEX01CX0hQX0hURk14aDsKKyAgICAgICAgZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NQl9IYWxmUGVsWzJdID0gJlNBRF9NQl9IUF9IVEZNeWg7CisgICAgICAgIGVuY3ZpZC0+ZnVuY3Rpb25Qb2ludGVyLT5TQURfTUJfSGFsZlBlbFszXSA9ICZTQURfTUJfSFBfSFRGTXhoeWg7CisgICAgICAgIGVuY3ZpZC0+c2FkX2V4dHJhX2luZm8gPSAodm9pZCopKGVuY3ZpZC0+bnJtbHpfdGgpOworICAgICAgICBvZmZzZXQgPSBlbmN2aWQtPm5ybWx6X3RoICsgMTY7CisgICAgICAgIG9mZnNldDIgPSBlbmN2aWQtPm5ybWx6X3RoICsgMzI7CisgICAgfQorCisgICAgb2Zmc2V0WzBdID0gMDsKKyAgICBvZmZzZXRbMV0gPSBseDIgKyAyOworICAgIG9mZnNldFsyXSA9IDI7CisgICAgb2Zmc2V0WzNdID0gbHgyOworICAgIG9mZnNldFs0XSA9IGx4ICsgMTsKKyAgICBvZmZzZXRbNV0gPSBseDMgKyAzOworICAgIG9mZnNldFs2XSA9IGx4ICsgMzsKKyAgICBvZmZzZXRbN10gPSBseDMgKyAxOworICAgIG9mZnNldFs4XSA9IGx4OworICAgIG9mZnNldFs5XSA9IGx4MyArIDI7CisgICAgb2Zmc2V0WzEwXSA9IGx4MyA7CisgICAgb2Zmc2V0WzExXSA9IGx4ICsgMiA7CisgICAgb2Zmc2V0WzEyXSA9IDE7CisgICAgb2Zmc2V0WzEzXSA9IGx4MiArIDM7CisgICAgb2Zmc2V0WzE0XSA9IGx4MiArIDE7CisgICAgb2Zmc2V0WzE1XSA9IDM7CisKKyAgICBvZmZzZXQyWzBdID0gMDsKKyAgICBvZmZzZXQyWzFdID0gcngyICsgMjsKKyAgICBvZmZzZXQyWzJdID0gMjsKKyAgICBvZmZzZXQyWzNdID0gcngyOworICAgIG9mZnNldDJbNF0gPSByeCArIDE7CisgICAgb2Zmc2V0Mls1XSA9IHJ4MyArIDM7CisgICAgb2Zmc2V0Mls2XSA9IHJ4ICsgMzsKKyAgICBvZmZzZXQyWzddID0gcngzICsgMTsKKyAgICBvZmZzZXQyWzhdID0gcng7CisgICAgb2Zmc2V0Mls5XSA9IHJ4MyArIDI7CisgICAgb2Zmc2V0MlsxMF0gPSByeDMgOworICAgIG9mZnNldDJbMTFdID0gcnggKyAyIDsKKyAgICBvZmZzZXQyWzEyXSA9IDE7CisgICAgb2Zmc2V0MlsxM10gPSByeDIgKyAzOworICAgIG9mZnNldDJbMTRdID0gcngyICsgMTsKKyAgICBvZmZzZXQyWzE1XSA9IDM7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIFVwZGF0ZUhURk0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIGRvdWJsZSAqbmV3dmFyLCBkb3VibGUgKmV4cF9sYW1kYSwgSFRGTV9TdGF0ICpodGZtX3N0YXQpCit7CisgICAgaWYgKGh0Zm1fc3RhdC0+Y291bnRicmVhayA9PSAwKQorICAgICAgICBodGZtX3N0YXQtPmNvdW50YnJlYWsgPSAxOworCisgICAgbmV3dmFyWzBdID0gKGRvdWJsZSkoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpIC8gKGh0Zm1fc3RhdC0+Y291bnRicmVhayAqIDE2Lik7CisKKyAgICBpZiAobmV3dmFyWzBdIDwgMC4wMDEpCisgICAgeworICAgICAgICBuZXd2YXJbMF0gPSAwLjAwMTsgLyogdG8gcHJldmVudCBmbG9hdGluZyBvdmVyZmxvdyAqLworICAgIH0KKyAgICBleHBfbGFtZGFbMF0gPSAgMSAvIChuZXd2YXJbMF0gKiAxLjQxNDIxMzYpOworICAgIGV4cF9sYW1kYVsxXSA9IGV4cF9sYW1kYVswXSAqIDEuNTgyNTsKKyAgICBleHBfbGFtZGFbMl0gPSBleHBfbGFtZGFbMF0gKiAyLjE3NTA7CisgICAgZXhwX2xhbWRhWzNdID0gZXhwX2xhbWRhWzBdICogMy41MDY1OworICAgIGV4cF9sYW1kYVs0XSA9IGV4cF9sYW1kYVswXSAqIDMuMTQzNjsKKyAgICBleHBfbGFtZGFbNV0gPSBleHBfbGFtZGFbMF0gKiAzLjUzMTU7CisgICAgZXhwX2xhbWRhWzZdID0gZXhwX2xhbWRhWzBdICogMy43NDQ5OworICAgIGV4cF9sYW1kYVs3XSA9IGV4cF9sYW1kYVswXSAqIDQuNTg1NDsKKyAgICBleHBfbGFtZGFbOF0gPSBleHBfbGFtZGFbMF0gKiA0LjYxOTE7CisgICAgZXhwX2xhbWRhWzldID0gZXhwX2xhbWRhWzBdICogNS40MDQxOworICAgIGV4cF9sYW1kYVsxMF0gPSBleHBfbGFtZGFbMF0gKiA2LjU5NzQ7CisgICAgZXhwX2xhbWRhWzExXSA9IGV4cF9sYW1kYVswXSAqIDEwLjUzNDE7CisgICAgZXhwX2xhbWRhWzEyXSA9IGV4cF9sYW1kYVswXSAqIDEwLjA3MTk7CisgICAgZXhwX2xhbWRhWzEzXSA9IGV4cF9sYW1kYVswXSAqIDEyLjA1MTY7CisgICAgZXhwX2xhbWRhWzE0XSA9IGV4cF9sYW1kYVswXSAqIDE1LjQ1NTI7CisKKyAgICBDYWxjVGhyZXNob2xkKEhURk1fUGYsIGV4cF9sYW1kYSwgZW5jdmlkLT5ucm1sel90aCk7CisgICAgcmV0dXJuIDsKK30KKworCit2b2lkIENhbGNUaHJlc2hvbGQoZG91YmxlIHBmLCBkb3VibGUgZXhwX2xhbWRhW10sIGludCBucm1sel90aFtdKQoreworICAgIGludCBpOworICAgIGRvdWJsZSB0ZW1wWzE1XTsKKyAgICAvLyAgcHJpbnRmKCJcbkxhbWRhOiAiKTsKKworICAgIC8qIHBhcmFtZXRyaWMgUFJFTU9ERUxsaW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKyspCisgICAgeworICAgICAgICAvLyAgICBwcmludGYoIiVnICIsZXhwX2xhbWRhW2ldKTsKKyAgICAgICAgaWYgKHBmIDwgMC41KQorICAgICAgICAgICAgdGVtcFtpXSA9IDEgLyBleHBfbGFtZGFbaV0gKiBNNFZFTkNfTE9HKDIgKiBwZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlbXBbaV0gPSAtMSAvIGV4cF9sYW1kYVtpXSAqIE00VkVOQ19MT0coMiAqICgxIC0gcGYpKTsKKyAgICB9CisKKyAgICBucm1sel90aFsxNV0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKSAgICAgICAgLyogc2NhbGUgdXB0byBuby5waXhlbHMgKi8KKyAgICAgICAgbnJtbHpfdGhbaV0gPSAoaW50KSh0ZW1wW2ldICogKChpICsgMSkgPDwgNCkgKyAwLjUpOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCAgICBIVEZNUHJlcGFyZUN1ck1CX0FWQyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgSFRGTV9TdGF0ICpodGZtX3N0YXQsIHVpbnQ4ICpjdXIsIGludCBwaXRjaCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgdWludDMyICpodGZtTUIgPSAodWludDMyKikoZW5jdmlkLT5jdXJyWU1CKTsKKyAgICB1aW50OCAqcHRyLCBieXRlOworICAgIGludCAqb2Zmc2V0OworICAgIGludCBpOworICAgIHVpbnQzMiB3b3JkOworCisgICAgaWYgKCgoaW50KXZpZGVvLT5zbGljZUhkci0+ZnJhbWVfbnVtKSAlIDMwID09IDEpCisgICAgeworICAgICAgICBvZmZzZXQgPSBodGZtX3N0YXQtPm9mZnNldEFycmF5OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBvZmZzZXQgPSBlbmN2aWQtPm5ybWx6X3RoICsgMTY7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBwdHIgPSBjdXIgKyBvZmZzZXRbaV07CisgICAgICAgIHdvcmQgPSBwdHJbMF07CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisKKyAgICAgICAgd29yZCA9ICoocHRyICs9IChwaXRjaCA8PCAyKSk7CisgICAgICAgIGJ5dGUgPSBwdHJbNF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgOCk7CisgICAgICAgIGJ5dGUgPSBwdHJbOF07CisgICAgICAgIHdvcmQgfD0gKGJ5dGUgPDwgMTYpOworICAgICAgICBieXRlID0gcHRyWzEyXTsKKyAgICAgICAgd29yZCB8PSAoYnl0ZSA8PCAyNCk7CisgICAgICAgICpodGZtTUIrKyA9IHdvcmQ7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworCisjZW5kaWYgLy8gSFRGTQorCit2b2lkICAgIEFWQ1ByZXBhcmVDdXJNQihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgdWludDggKmN1ciwgaW50IHBpdGNoKQoreworICAgIHZvaWQqIHRtcCA9ICh2b2lkKikoZW5jdmlkLT5jdXJyWU1CKTsKKyAgICB1aW50MzIgKmN1cnJZTUIgPSAodWludDMyKikgdG1wOworICAgIGludCBpOworCisgICAgY3VyIC09IHBpdGNoOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICAqY3VycllNQisrID0gKigodWludDMyKikoY3VyICs9IHBpdGNoKSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyA0KSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyA4KSk7CisgICAgICAgICpjdXJyWU1CKysgPSAqKCh1aW50MzIqKShjdXIgKyAxMikpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKyNpZmRlZiBGSVhFRF9JTlRFUlBSRURfTU9ERQorCisvKiBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yLCB3ZSBtYXkgbm90IGRlY2lkZSB0byBza2lwCithIG1hY3JvYmxvY2sgaGVyZSBqdXN0IHlldC4gKi8KKy8qIFdlIHdpbGwgZmluZCB0aGUgYmVzdCBtb3Rpb24gdmVjdG9yIGFuZCB0aGUgYmVzdCBpbnRyYSBwcmVkaWN0aW9uIG1vZGUgZm9yIGVhY2ggYmxvY2suICovCisvKiBvdXRwdXQgYXJlCisgICAgY3Vyck1CLT5OdW1NYlBhcnQsICBjdXJyTUItPk1iUGFydFdpZHRoLCBjdXJyTUItPk1iUGFydEhlaWdodCwKKyAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtdLCBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW10sIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0LAorICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbXVtdIChMMCBvciBMMSBvciBCaVByZWQpCisgICAgY3Vyck1CLT5SZWZJZHhbXSwgY3Vyck1CLT5yZWZfaWR4X0wwW10sCisgICAgY3Vyck1CLT5tdkwwW10sIGN1cnJNQi0+bXZMMVtdCisgICAgKi8KKworQVZDRW5jX1N0YXR1cyBBVkNNQk1vdGlvblNlYXJjaChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBpbnQgbWJOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFzcykKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgaW50IG1iUGFydElkeCwgc3ViTWJQYXJ0SWR4OworICAgIGludDE2ICptdjsKKyAgICBpbnQgaTsKKyAgICBpbnQgU3ViTWJQYXJ0SGVpZ2h0LCBTdWJNYlBhcnRXaWR0aCwgTnVtU3ViTWJQYXJ0OworCisgICAgLyogYXNzaWduIHZhbHVlIHRvIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbXVt4XSxzdWJNYk1vZGVbXSxOdW1TdWJNYlBhcnRbXSxTdWJNYlBhcnRXaWR0aFtdLFN1Yk1iUGFydEhlaWdodFtdICovCisKKyAgICBjdXJyTUItPm1iTW9kZSA9IEZJWEVEX0lOVEVSUFJFRF9NT0RFOworICAgIGN1cnJNQi0+bWJfaW50cmEgPSAwOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QMTYpCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDE7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSAxNjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKKyAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMF0gPSAxNjsKKyAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFswXSA9IDE2OworICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFswXSA9ICAxOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDE2eDgpCisgICAgeworICAgICAgICBjdXJyTUItPk51bU1iUGFydCA9IDI7CisgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSAxNjsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoW2ldID0gMTY7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFtpXSA9IDg7CisgICAgICAgICAgICBjdXJyTUItPk51bVN1Yk1iUGFydFtpXSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4eDE2KQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAyOworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSAxNjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtpXSA9IDg7CisgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFtpXSA9IDE2OworICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbaV0gPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSA0OworICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gODsKKyAgICAgICAgY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfOHg4KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA4OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA4OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChGSVhFRF9TVUJNQl9NT0RFID09IEFWQ184eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFN1Yk1iUGFydEhlaWdodCA9IDQ7CisgICAgICAgICAgICBTdWJNYlBhcnRXaWR0aCA9IDg7CisgICAgICAgICAgICBOdW1TdWJNYlBhcnQgPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKEZJWEVEX1NVQk1CX01PREUgPT0gQVZDXzR4OCkKKyAgICAgICAgeworICAgICAgICAgICAgU3ViTWJQYXJ0SGVpZ2h0ID0gODsKKyAgICAgICAgICAgIFN1Yk1iUGFydFdpZHRoID0gNDsKKyAgICAgICAgICAgIE51bVN1Yk1iUGFydCA9IDI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoRklYRURfU1VCTUJfTU9ERSA9PSBBVkNfNHg0KQorICAgICAgICB7CisgICAgICAgICAgICBTdWJNYlBhcnRIZWlnaHQgPSA0OworICAgICAgICAgICAgU3ViTWJQYXJ0V2lkdGggPSA0OworICAgICAgICAgICAgTnVtU3ViTWJQYXJ0ID0gNDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJNQi0+c3ViTWJNb2RlW2ldID0gRklYRURfU1VCTUJfTU9ERTsKKyAgICAgICAgICAgIGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0W2ldID0gU3ViTWJQYXJ0SGVpZ2h0OworICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFtpXSA9IFN1Yk1iUGFydFdpZHRoOworICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbaV0gPSBOdW1TdWJNYlBhcnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSAvKiBpdCdzIHByb2JhYmx5IGludHJhIG1vZGUgKi8KKyAgICB7CisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisKKyAgICBmb3IgKG1iUGFydElkeCA9IDA7IG1iUGFydElkeCA8IDQ7IG1iUGFydElkeCsrKQorICAgIHsKKyAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICA9IEFWQ19QcmVkX0wwOworICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XSA9IEZJWEVEX1JFRl9JRFg7CisgICAgICAgIGN1cnJNQi0+UmVmSWR4W21iUGFydElkeF0gPSB2aWRlby0+UmVmUGljTGlzdDBbRklYRURfUkVGX0lEWF0tPlJlZklkeDsKKworICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IDQ7IHN1Yk1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBtdiA9IChpbnQxNiopKGN1cnJNQi0+bXZMMCArIChtYlBhcnRJZHggPDwgMikgKyBzdWJNYlBhcnRJZHgpOworCisgICAgICAgICAgICAqbXYrKyA9IEZJWEVEX01WWDsKKyAgICAgICAgICAgICptdiA9IEZJWEVEX01WWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuY3ZpZC0+bWluX2Nvc3QgPSAwOworCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCisjZWxzZSAvKiBwZXJmb3JtIHRoZSBzZWFyY2ggKi8KKworLyogVGhpcyBvcHRpb24gIzEgc2VhcmNoIGlzIHZlcnkgc2ltaWxhciB0byBQVidzIE1QRUc0IG1vdGlvbiBzZWFyY2ggYWxnb3JpdGhtLgorICBUaGUgc2VhcmNoIGlzIGRvbmUgaW4gaGllcmFyY2hpY2FsIG1hbm5lciBmcm9tIDE2eDE2IE1CIGRvd24gdG8gc21hbGxlciBhbmQgc21hbGxlcgorICBwYXJ0aXRpb24uIEF0IGVhY2ggbGV2ZWwsIGEgZGVjaXNpb24gY2FuIGJlIG1hZGUgdG8gc3RvcCB0aGUgc2VhcmNoIGlmIHRoZSBleHBlY3RlZAorICBwcmVkaWN0aW9uIGdhaW4gaXMgbm90IHdvcnRoIHRoZSBjb21wdXRhdGlvbi4gVGhlIGRlY2lzaW9uIGNhbiBhbHNvIGJlIG1hZGUgYXQgdGhlIGZpbmVzdAorICBsZXZlbCBmb3IgbW9yZSBmdWxsc2VhcmNoLWxpa2UgYmVoYXZpb3Igd2l0aCB0aGUgcHJpY2Ugb2YgaGVhdmllciBjb21wdXRhdGlvbi4gKi8KK3ZvaWQgQVZDTUJNb3Rpb25TZWFyY2goQVZDRW5jT2JqZWN0ICplbmN2aWQsIHVpbnQ4ICpjdXIsIHVpbnQ4ICpiZXN0X2NhbmRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGkwLCBpbnQgajAsIGludCB0eXBlX3ByZWQsIGludCBGU19lbiwgaW50ICpocF9ndWVzcykKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBBVkNTZXFQYXJhbVNldCAqY3VyclNQUyA9IHZpZGVvLT5jdXJyU2VxUGFyYW1zOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICB1aW50OCAqcmVmLCAqY2FuZCwgKm5jYW5kOworICAgIHZvaWQgKmV4dHJhX2luZm8gPSBlbmN2aWQtPnNhZF9leHRyYV9pbmZvOworICAgIGludCBtYm51bSA9IHZpZGVvLT5tYk51bTsKKyAgICBpbnQgd2lkdGggPSBjdXJyUGljLT53aWR0aDsgLyogNi8xMi8wMSwgbXVzdCBiZSBtdWx0aXBsZSBvZiAxNiAqLworICAgIGludCBoZWlnaHQgPSBjdXJyUGljLT5oZWlnaHQ7CisgICAgQVZDTVYgKm1vdDE2eDE2ID0gZW5jdmlkLT5tb3QxNngxNjsKKyAgICBpbnQgKCpTQURfTWFjcm9ibG9jaykodWludDgqLCB1aW50OCosIGludCwgdm9pZCopID0gZW5jdmlkLT5mdW5jdGlvblBvaW50ZXItPlNBRF9NYWNyb2Jsb2NrOworCisgICAgaW50IHJhbmdlID0gcmF0ZUN0cmwtPm12UmFuZ2U7CisKKyAgICBpbnQgbHggPSBjdXJyUGljLT5waXRjaDsgLyogIHBhZGRpbmcgKi8KKyAgICBpbnQgaSwgaiwgaW1pbiwgam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoOworICAgIGludCBkLCBkbWluLCBkbls5XTsKKyAgICBpbnQgazsKKyAgICBpbnQgbXZ4WzVdLCBtdnlbNV07CisgICAgaW50IG51bV9jYW4sIGNlbnRlcl9hZ2FpbjsKKyAgICBpbnQgbGFzdF9sb2MsIG5ld19sb2MgPSAwOworICAgIGludCBzdGVwLCBtYXhfc3RlcCA9IHJhbmdlID4+IDE7CisgICAgaW50IG5leHQ7CisKKyAgICBpbnQgY212eCwgY212eTsgLyogZXN0aW1hdGVkIHByZWRpY3RlZCBNViAqLworICAgIGludCBsZXZfaWR4OworICAgIGludCBsYW1iZGFfbW90aW9uID0gZW5jdmlkLT5sYW1iZGFfbW90aW9uOworICAgIHVpbnQ4ICptdmJpdHMgPSBlbmN2aWQtPm12Yml0czsKKyAgICBpbnQgbXZzaGlmdCA9IDI7CisgICAgaW50IG12Y29zdDsKKworICAgIGludCBtaW5fc2FkID0gNjU1MzU7CisKKyAgICByZWYgPSB2aWRlby0+UmVmUGljTGlzdDBbREVGQVVMVF9SRUZfSURYXS0+U2w7IC8qIG9yaWdpbiBvZiBhY3R1YWwgZnJhbWUgKi8KKworICAgIC8qIGhhdmUgdG8gaW5pdGlhbGl6ZSB0aGVzZSBwYXJhbXMsIG5lY2Vzc2FyeSBmb3IgaW50ZXJwcmVkaWN0aW9uIHBhcnQgKi8KKyAgICBjdXJyTUItPk51bU1iUGFydCA9IDE7CisgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMF0gPSAxNjsKKyAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gMTY7CisgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSAxOworICAgIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+cmVmX2lkeF9MMFsyXSA9IGN1cnJNQi0+cmVmX2lkeF9MMFszXSA9IERFRkFVTFRfUkVGX0lEWDsKKyAgICBjdXJyTUItPnJlZl9pZHhfTDFbMF0gPSBjdXJyTUItPnJlZl9pZHhfTDFbMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPnJlZl9pZHhfTDFbMl0gPSBjdXJyTUItPnJlZl9pZHhfTDFbM10gPSBERUZBVUxUX1JFRl9JRFg7CisgICAgY3Vyck1CLT5SZWZJZHhbMF0gPSBjdXJyTUItPlJlZklkeFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5SZWZJZHhbMl0gPSBjdXJyTUItPlJlZklkeFszXSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtERUZBVUxUX1JFRl9JRFhdLT5SZWZJZHg7CisKKyAgICBjdXIgPSBlbmN2aWQtPmN1cnJZTUI7IC8qIHVzZSBzbWFsbGVyIG1lbW9yeSBzcGFjZSBmb3IgY3VycmVudCBNQiAqLworCisgICAgLyogIGZpbmQgbGltaXQgb2YgdGhlIHNlYXJjaCAoYWRqdXN0aW5nIHNlYXJjaCByYW5nZSkqLworICAgIGxldl9pZHggPSBtYXBMZXYySWR4W2N1cnJTUFMtPmxldmVsX2lkY107CisKKyAgICAvKiB3ZSBjYW4gbWFrZSB0aGlzIHBhcnQgZHluYW1pYyBiYXNlZCBvbiBwcmV2aW91cyBzdGF0aXN0aWNzICovCisgICAgaWxvdyA9IGkwIC0gcmFuZ2U7CisgICAgaWYgKGkwIC0gaWxvdyA+IDIwNDcpIC8qIGNsaXAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZCAqLworICAgIHsKKyAgICAgICAgaWxvdyA9IGkwIC0gMjA0NzsKKyAgICB9CisgICAgaWYgKGlsb3cgPCAtMTMpICAvLyBjaGFuZ2UgaXQgZnJvbSAtMTUgdG8gLTEzIGJlY2F1c2Ugb2YgNi10YXAgZmlsdGVyIG5lZWRzIGV4dHJhIDIgbGluZXMuCisgICAgeworICAgICAgICBpbG93ID0gLTEzOworICAgIH0KKworICAgIGloaWdoID0gaTAgKyByYW5nZSAtIDE7CisgICAgaWYgKGloaWdoIC0gaTAgPiAyMDQ3KSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGloaWdoID0gaTAgKyAyMDQ3OworICAgIH0KKyAgICBpZiAoaWhpZ2ggPiB3aWR0aCAtIDMpCisgICAgeworICAgICAgICBpaGlnaCA9IHdpZHRoIC0gMzsgIC8vIGNoYW5nZSBmcm9tIHdpZHRoLTEgdG8gd2lkdGgtMyBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgfQorCisgICAgamxvdyA9IGowIC0gcmFuZ2U7CisgICAgaWYgKGowIC0gamxvdyA+IE1heFZtdlJbbGV2X2lkeF0gLSAxKSAvKiBjbGlwIHRvIGNvbmZvcm0gd2l0aCB0aGUgc3RhbmRhcmQgKi8KKyAgICB7CisgICAgICAgIGpsb3cgPSBqMCAtIE1heFZtdlJbbGV2X2lkeF0gKyAxOworICAgIH0KKyAgICBpZiAoamxvdyA8IC0xMykgICAgIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgeworICAgICAgICBqbG93ID0gLTEzOworICAgIH0KKworICAgIGpoaWdoID0gajAgKyByYW5nZSAtIDE7CisgICAgaWYgKGpoaWdoIC0gajAgPiBNYXhWbXZSW2xldl9pZHhdIC0gMSkgLyogY2xpcCB0byBjb25mb3JtIHdpdGggdGhlIHN0YW5kYXJkICovCisgICAgeworICAgICAgICBqaGlnaCA9IGowICsgTWF4Vm12UltsZXZfaWR4XSAtIDE7CisgICAgfQorICAgIGlmIChqaGlnaCA+IGhlaWdodCAtIDMpIC8vIHNhbWUgcmVhc29uIGFzIGFib3ZlCisgICAgeworICAgICAgICBqaGlnaCA9IGhlaWdodCAtIDM7CisgICAgfQorCisgICAgLyogZmluZCBpbml0aWFsIG1vdGlvbiB2ZWN0b3IgJiBwcmVkaWN0ZWQgTVYqLworICAgIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbihtdngsIG12eSwgJm51bV9jYW4sIGkwID4+IDQsIGowID4+IDQsIGVuY3ZpZCwgdHlwZV9wcmVkLCAmY212eCwgJmNtdnkpOworCisgICAgaW1pbiA9IGkwOworICAgIGptaW4gPSBqMDsgLyogbmVlZGVkIGZvciBmdWxsc2VhcmNoICovCisgICAgbmNhbmQgPSByZWYgKyBpMCArIGowICogbHg7CisKKyAgICAvKiBmb3IgZmlyc3Qgcm93IG9mIE1CLCBmdWxsc2VhcmNoIGNhbiBiZSB1c2VkICovCisgICAgaWYgKEZTX2VuKQorICAgIHsKKyAgICAgICAgKmhwX2d1ZXNzID0gMDsgLyogbm8gZ3Vlc3MgZm9yIGZhc3QgaGFsZi1wZWwgKi8KKworICAgICAgICBkbWluID0gIEFWQ0Z1bGxTZWFyY2goZW5jdmlkLCByZWYsIGN1ciwgJmltaW4sICZqbWluLCBpbG93LCBpaGlnaCwgamxvdywgamhpZ2gsIGNtdngsIGNtdnkpOworCisgICAgICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAvKiAgICAgICBmdWxsc2VhcmNoIHRoZSB0b3Agcm93IHRvIG9ubHkgdXB0byAoMCwzKSBNQiAqLworICAgICAgICAvKiAgICAgICB1cHRvIDMwJSBjb21wbGV4aXR5IHNhdmluZyB3aXRoIHRoZSBzYW1lIGNvbXBsZXhpdHkgKi8KKyAgICAgICAgaWYgKHZpZGVvLT5QcmV2UmVmRnJhbWVOdW0gPT0gMCAmJiBqMCA9PSAwICYmIGkwIDw9IDY0ICYmIHR5cGVfcHJlZCAhPSAxKQorICAgICAgICB7CisgICAgICAgICAgICAqaHBfZ3Vlc3MgPSAwOyAvKiBubyBndWVzcyBmb3IgZmFzdCBoYWxmLXBlbCAqLworICAgICAgICAgICAgZG1pbiA9ICBBVkNGdWxsU2VhcmNoKGVuY3ZpZCwgcmVmLCBjdXIsICZpbWluLCAmam1pbiwgaWxvdywgaWhpZ2gsIGpsb3csIGpoaWdoLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgIG5jYW5kID0gcmVmICsgaW1pbiArIGptaW4gKiBseDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKiBpbml0aWFsaXplIGNhbmRpZGF0ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgZG1pbiA9IDY1NTM1OworCisgICAgICAgICAgICAvKiBjaGVjayBpZiBhbGwgYXJlIGVxdWFsICovCisgICAgICAgICAgICBpZiAobnVtX2NhbiA9PSBBTExfQ0FORF9FUVVBTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpID0gaTAgKyBtdnhbMF07CisgICAgICAgICAgICAgICAgaiA9IGowICsgbXZ5WzBdOworCisgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICBtdmNvc3QgPSBNVl9DT1NUKGxhbWJkYV9tb3Rpb24sIG12c2hpZnQsIGkgLSBpMCwgaiAtIGowLCBjbXZ4LCBjbXZ5KTsKKyAgICAgICAgICAgICAgICAgICAgZCArPSAgbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7IC8vIGZvciByYXRlIGNvbnRyb2wKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKiogZXZhbHVhdGUgdW5pcXVlIGNhbmRpZGF0ZXMgKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2NhbjsgaysrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkwICsgbXZ4W2tdOworICAgICAgICAgICAgICAgICAgICBqID0gajAgKyBtdnlba107CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gaWxvdyAmJiBpIDw9IGloaWdoICYmIGogPj0gamxvdyAmJiBqIDw9IGpoaWdoKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYW5kID0gcmVmICsgaSArIGogKiBseDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsIChkbWluIDw8IDE2KSB8IGx4LCBleHRyYV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgICAgICAgICAgZCArPSAgbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZCA8IGRtaW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbmQgPSBjYW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OyAvLyBmb3IgcmF0ZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqIGxvY2FsIHJlZmluZW1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgIGxhc3RfbG9jID0gbmV3X2xvYyA9IDA7CisgICAgICAgICAgICAvLyAgICAgICAgICBuY2FuZCA9IHJlZiArIGptaW4qbHggKyBpbWluOyAgLyogY2VudGVyIG9mIHRoZSBzZWFyY2ggKi8KKyAgICAgICAgICAgIHN0ZXAgPSAwOworICAgICAgICAgICAgZG5bMF0gPSBkbWluOworICAgICAgICAgICAgd2hpbGUgKCFjZW50ZXJfYWdhaW4gJiYgc3RlcCA8PSBtYXhfc3RlcCkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIEFWQ01vdmVOZWlnaGJvclNBRChkbiwgbGFzdF9sb2MpOworCisgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMTsKKyAgICAgICAgICAgICAgICBpID0gaW1pbjsKKyAgICAgICAgICAgICAgICBqID0gam1pbiAtIDE7CisgICAgICAgICAgICAgICAgY2FuZCA9IHJlZiArIGkgKyBqICogbHg7CisKKyAgICAgICAgICAgICAgICAvKiAgc3RhcnRpbmcgZnJvbSBbMCwtMV0gKi8KKyAgICAgICAgICAgICAgICAvKiBzcGlyYWwgY2hlY2sgb25lIHN0ZXAgYXQgYSB0aW1lKi8KKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAyOyBrIDw9IDg7IGsgKz0gMikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFiX2V4Y2x1ZGVbbGFzdF9sb2NdW2tdKSAvKiBleGNsdWRlIGxhc3Qgc3RlcCBjb21wdXRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICB7ICAgICAgIC8qIG5vdCBhbHJlYWR5IGNvbXB1dGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBpbG93ICYmIGkgPD0gaWhpZ2ggJiYgaiA+PSBqbG93ICYmIGogPD0gamhpZ2gpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9ICgqU0FEX01hY3JvYmxvY2spKGNhbmQsIGN1ciwgKGRtaW4gPDwgMTYpIHwgbHgsIGV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gbXZjb3N0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5ba10gPSBkOyAvKiBrZWVwIGl0IGZvciBoYWxmIHBlbCB1c2UgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5jYW5kID0gY2FuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1pbiA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltaW4gPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyX2FnYWluID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2xvYyA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zYWQgPSBkIC0gbXZjb3N0OyAvLyBmb3IgcmF0ZSBjb250cm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChrID09IDgpICAvKiBlbmQgc2lkZSBzZWFyY2gqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gLTE7IC8qIHN0YXJ0IGRpYWdvbmFsIHNlYXJjaCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IHJlZmluZV9uZXh0W2tdWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZCArPSBseCAqIG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGFzdF9sb2MgPSBuZXdfbG9jOworICAgICAgICAgICAgICAgIHN0ZXAgKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWNlbnRlcl9hZ2FpbikKKyAgICAgICAgICAgICAgICBBVkNNb3ZlTmVpZ2hib3JTQUQoZG4sIGxhc3RfbG9jKTsKKworICAgICAgICAgICAgKmhwX2d1ZXNzID0gQVZDRmluZE1pbihkbik7CisKKyAgICAgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworICAgICAgICB9CisgICAgfQorCisgICAgbW90MTZ4MTZbbWJudW1dLnNhZCA9IGRtaW47CisgICAgbW90MTZ4MTZbbWJudW1dLnggPSAoaW1pbiAtIGkwKSA8PCAyOworICAgIG1vdDE2eDE2W21ibnVtXS55ID0gKGptaW4gLSBqMCkgPDwgMjsKKyAgICBiZXN0X2NhbmRbMF0gPSBuY2FuZDsKKworICAgIGlmIChyYXRlQ3RybC0+c3ViUGVsRW5hYmxlKSAvLyBhbHdheXMgZW5hYmxlIGhhbGYtcGVsIHNlYXJjaAorICAgIHsKKyAgICAgICAgLyogZmluZCBoYWxmLXBlbCByZXNvbHV0aW9uIG1vdGlvbiB2ZWN0b3IgKi8KKyAgICAgICAgbWluX3NhZCA9IEFWQ0ZpbmRIYWxmUGVsTUIoZW5jdmlkLCBjdXIsIG1vdDE2eDE2ICsgbWJudW0sIGJlc3RfY2FuZFswXSwgaTAsIGowLCAqaHBfZ3Vlc3MsIGNtdngsIGNtdnkpOworCisgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworCisKKyAgICAgICAgaWYgKGVuY3ZpZC0+YmVzdF9xcGVsX3BvcyA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgbmNhbmQgPSBlbmN2aWQtPmhwZWxfY2FuZFtlbmN2aWQtPmJlc3RfaHBlbF9wb3NdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmNhbmQgPSBlbmN2aWQtPnFwZWxfY2FuZFtlbmN2aWQtPmJlc3RfcXBlbF9wb3NdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+cmF0ZUN0cmwtPk1BRG9mTUJbbWJudW1dID0gbWluX3NhZCAvIDI1Ni4wOworICAgIH0KKworICAgIC8qKiBkbyBtb3Rpb24gY29tcCBoZXJlIGZvciBub3cgKi8KKyAgICByZWYgPSBjdXJyUGljLT5TbCArIGkwICsgajAgKiBseDsKKyAgICAvKiBjb3B5IGZyb20gdGhlIGJlc3QgcmVzdWx0IHRvIGN1cnJlbnQgUGljdHVyZSAqLworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZWYrKyA9ICpuY2FuZCsrOworICAgICAgICB9CisgICAgICAgIHJlZiArPSAobHggLSAxNik7CisgICAgICAgIG5jYW5kICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIDsKK30KKworI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0Z1bGxTZWFyY2gKKyAgICBEYXRlOiAgICAgICAwOS8xNi8yMDAwCisgICAgUHVycG9zZTogICAgUGVyZm9ybSBmdWxsLXNlYXJjaCBtb3Rpb24gZXN0aW1hdGlvbiBvdmVyIHRoZSByYW5nZSBvZiBzZWFyY2gKKyAgICAgICAgICAgICAgICByZWdpb24gaW4gYSBzcGlyYWwtb3V0d2FyZCBtYW5uZXIuCisgICAgSW5wdXQvT3V0cHV0OiAgIFZpZGVvRW5jRGF0YSwgY3VycmVudCBWb2wsIHByZXZpb3UgVm9wLCBwb2ludGVyIHRvIHRoZSBsZWZ0IGNvcm5lciBvZgorICAgICAgICAgICAgICAgIGN1cnJlbnQgVk9QLCBjdXJyZW50IGNvb3JkIChhbHNvIG91dHB1dCksIGJvdW5kYXJpZXMuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBBVkNGdWxsU2VhcmNoKEFWQ0VuY09iamVjdCAqZW5jdmlkLCB1aW50OCAqcHJldiwgdWludDggKmN1ciwKKyAgICAgICAgICAgICAgICAgIGludCAqaW1pbiwgaW50ICpqbWluLCBpbnQgaWxvdywgaW50IGloaWdoLCBpbnQgamxvdywgaW50IGpoaWdoLAorICAgICAgICAgICAgICAgICAgaW50IGNtdngsIGludCBjbXZ5KQoreworICAgIGludCByYW5nZSA9IGVuY3ZpZC0+cmF0ZUN0cmwtPm12UmFuZ2U7CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSBlbmN2aWQtPmNvbW1vbi0+Y3VyclBpYzsKKyAgICB1aW50OCAqY2FuZDsKKyAgICBpbnQgaSwgaiwgaywgbDsKKyAgICBpbnQgZCwgZG1pbjsKKyAgICBpbnQgaTAgPSAqaW1pbjsgLyogY3VycmVudCBwb3NpdGlvbiAqLworICAgIGludCBqMCA9ICpqbWluOworICAgIGludCAoKlNBRF9NYWNyb2Jsb2NrKSh1aW50OCosIHVpbnQ4KiwgaW50LCB2b2lkKikgPSBlbmN2aWQtPmZ1bmN0aW9uUG9pbnRlci0+U0FEX01hY3JvYmxvY2s7CisgICAgdm9pZCAqZXh0cmFfaW5mbyA9IGVuY3ZpZC0+c2FkX2V4dHJhX2luZm87CisgICAgaW50IGx4ID0gY3VyclBpYy0+cGl0Y2g7IC8qIHdpdGggcGFkZGluZyAqLworCisgICAgaW50IG9mZnNldCA9IGkwICsgajAgKiBseDsKKworICAgIGludCBsYW1iZGFfbW90aW9uID0gZW5jdmlkLT5sYW1iZGFfbW90aW9uOworICAgIHVpbnQ4ICptdmJpdHMgPSBlbmN2aWQtPm12Yml0czsKKyAgICBpbnQgbXZzaGlmdCA9IDI7CisgICAgaW50IG12Y29zdDsKKyAgICBpbnQgbWluX3NhZDsKKworICAgIGNhbmQgPSBwcmV2ICsgb2Zmc2V0OworCisgICAgZG1pbiAgPSAoKlNBRF9NYWNyb2Jsb2NrKShjYW5kLCBjdXIsICg2NTUzNSA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgMCwgMCwgY212eCwgY212eSk7CisgICAgbWluX3NhZCA9IGRtaW47CisgICAgZG1pbiArPSBtdmNvc3Q7CisKKyAgICAvKiBwZXJmb3JtIHNwaXJhbCBzZWFyY2ggKi8KKyAgICBmb3IgKGsgPSAxOyBrIDw9IHJhbmdlOyBrKyspCisgICAgeworCisgICAgICAgIGkgPSBpMCAtIGs7CisgICAgICAgIGogPSBqMCAtIGs7CisKKyAgICAgICAgY2FuZCA9IHByZXYgKyBpICsgaiAqIGx4OworCisgICAgICAgIGZvciAobCA9IDA7IGwgPCA4Kms7IGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogbm8gbmVlZCBmb3IgYm91bmRhcnkgY2hlY2tpbmcgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmIChpID49IGlsb3cgJiYgaSA8PSBpaGlnaCAmJiBqID49IGpsb3cgJiYgaiA8PSBqaGlnaCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gKCpTQURfTWFjcm9ibG9jaykoY2FuZCwgY3VyLCAoZG1pbiA8PCAxNikgfCBseCwgKHZvaWQqKWV4dHJhX2luZm8pOworICAgICAgICAgICAgICAgIG12Y29zdCA9IE1WX0NPU1QobGFtYmRhX21vdGlvbiwgbXZzaGlmdCwgaSAtIGkwLCBqIC0gajAsIGNtdngsIGNtdnkpOworICAgICAgICAgICAgICAgIGQgKz0gIG12Y29zdDsKKworICAgICAgICAgICAgICAgIGlmIChkIDwgZG1pbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRtaW4gPSBkOworICAgICAgICAgICAgICAgICAgICAqaW1pbiA9IGk7CisgICAgICAgICAgICAgICAgICAgICpqbWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgbWluX3NhZCA9IGQgLSBtdmNvc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobCA8IChrIDw8IDEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICBjYW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKGsgPDwgMikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGNhbmQgKz0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsIDwgKChrIDw8IDIpICsgKGsgPDwgMSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgICAgICBjYW5kLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgIGNhbmQgLT0gbHg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbmN2aWQtPnJhdGVDdHJsLT5NQURvZk1CW2VuY3ZpZC0+Y29tbW9uLT5tYk51bV0gPSAobWluX3NhZCAvIDI1Ni4wKTsgLy8gZm9yIHJhdGUgY29udHJvbAorCisgICAgcmV0dXJuIGRtaW47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0NhbmRpZGF0ZVNlbGVjdGlvbgorICAgIERhdGU6ICAgICAgIDA5LzE2LzIwMDAKKyAgICBQdXJwb3NlOiAgICBGaWxsIHVwIHRoZSBsaXN0IG9mIGNhbmRpZGF0ZSB1c2luZyBzcGF0aW8tdGVtcG9yYWwgY29ycmVsYXRpb24KKyAgICAgICAgICAgICAgICBhbW9uZyBuZWlnaGJvcmluZyBibG9ja3MuCisgICAgSW5wdXQvT3V0cHV0OiAgIHR5cGVfcHJlZCA9IDA6IGZpcnN0IHBhc3MsIDE6IHNlY29uZCBwYXNzLCBvciBubyBTQ0QKKyAgICBNb2RpZmllZDogICAsIDA5LzIzLzAxLCBnZXQgcmlkIG9mIHJlZHVuZGFudCBjYW5kaWRhdGVzIGJlZm9yZSBwYXNzaW5nIGJhY2suCisgICAgICAgICAgICAgICAgLCAwOS8xMS8wNywgYWRkZWQgcmV0dXJuIGZvciBtb2RpZmllZCBwcmVkaWN0ZWQgTVYsIHRoaXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICBuZWVkZWQgZm9yIGJvdGggZmFzdCBzZWFyY2ggYW5kIGZ1bGxzZWFyY2guCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBBVkNDYW5kaWRhdGVTZWxlY3Rpb24oaW50ICptdngsIGludCAqbXZ5LCBpbnQgKm51bV9jYW4sIGludCBpbWIsIGludCBqbWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCwgaW50IHR5cGVfcHJlZCwgaW50ICpjbXZ4LCBpbnQgKmNtdnkpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01WICptb3QxNngxNiA9IGVuY3ZpZC0+bW90MTZ4MTY7CisgICAgQVZDTVYgKnBtb3Q7CisgICAgaW50IG1ibnVtID0gdmlkZW8tPm1iTnVtOworICAgIGludCBtYndpZHRoID0gdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisgICAgaW50IG1iaGVpZ2h0ID0gdmlkZW8tPlBpY0hlaWdodEluTWJzOworICAgIGludCBpLCBqLCBzYW1lLCBudW0xOworCisgICAgLyogdGhpcyBwYXJ0IGlzIGZvciBwcmVkaWN0ZWQgTVYgKi8KKyAgICBpbnQgcG12QV94ID0gMCwgcG12QV95ID0gMCwgcG12Ql94ID0gMCwgcG12Ql95ID0gMCwgcG12Q194ID0gMCwgcG12Q195ID0gMDsKKyAgICBpbnQgYXZhaWxBID0gMCwgYXZhaWxCID0gMCwgYXZhaWxDID0gMDsKKworICAgICpudW1fY2FuID0gMDsKKworICAgIGlmICh2aWRlby0+UHJldlJlZkZyYW1lTnVtICE9IDApIC8vIHByZXZpb3VzIGZyYW1lIGlzIGFuIElEUiBmcmFtZQorICAgIHsKKyAgICAgICAgLyogU3BhdGlvLVRlbXBvcmFsIENhbmRpZGF0ZSAoZml2ZSBjYW5kaWRhdGVzKSAqLworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qIGZpcnN0IHBhc3MgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bV07IC8qIHNhbWUgY29vcmRpbmF0ZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgaWYgKGltYiA+PSAobWJ3aWR0aCA+PiAxKSAmJiBpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoaW1iICsgMSA8IG1id2lkdGgpICAgLypyaWdodCBuZWlnaGJvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSttYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoam1iID4gMCkgICAvKnVwcGVyIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW1iID4gMCAmJiBqbWIgPiAwKSAgLyogdXBwZXItbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgICAgLyogc2Vjb25kIHBhc3MgKi8KKyAgICAgICAgICAgIC8qIG9yaWdpbmFsIFNUMSBhbGdvcml0aG0gKi8KKyAgICAgICAgeworICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bV07IC8qIHNhbWUgY29vcmRpbmF0ZSBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICBpZiAoaW1iID4gMCkgIC8qbGVmdCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW1iIDwgbWJ3aWR0aCAtIDEpICAvKnJpZ2h0IG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSsxXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bSttYndpZHRoXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IHByZWRpY3RlZCBNViAqLworICAgICAgICBpZiAoaW1iID4gMCkgICAgLyogZ2V0IE1WIGZyb20gbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgYXZhaWxBID0gMTsKKyAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICBwbXZBX3ggPSBwbW90LT54OworICAgICAgICAgICAgcG12QV95ID0gcG1vdC0+eTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChqbWIgPiAwKSAvKiBnZXQgTVYgZnJvbSB0b3AgKEIpIG5laWdoYm9yIGVpdGhlciBvbiBjdXJyZW50IG9yIHByZXZpb3VzIGZyYW1lICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgcG12Ql94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgIHBtdkJfeSA9IHBtb3QtPnk7CisKKyAgICAgICAgICAgIGF2YWlsQyA9IDE7CisKKyAgICAgICAgICAgIGlmIChpbWIgPCBtYndpZHRoIC0gMSkgLyogZ2V0IE1WIGZyb20gdG9wLXJpZ2h0IChDKSBuZWlnaGJvciBvZiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoRCkgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aC0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBtdkNfeCA9IHBtb3QtPng7CisgICAgICAgICAgICBwbXZDX3kgPSBwbW90LT55OworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSAgLyogb25seSBTcGF0aWFsIENhbmRpZGF0ZSAoZm91ciBjYW5kaWRhdGVzKSovCisgICAgeworICAgICAgICBpZiAodHlwZV9wcmVkID09IDApIC8qZmlyc3QgcGFzcyovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpbWIgPiAxKSAgLyogbmVpZ2hib3IgdHdvIGJsb2NrcyBhd2F5IHRvIHRoZSBsZWZ0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0yXTsKKyAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGltYiA+IDAgJiYgam1iID4gMCkgIC8qIHVwcGVyLWxlZnQgbmVpZ2hib3IgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgtMV07CisgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqbWIgPiAwICYmIGltYiA8IG1iaGVpZ2h0IC0gMSkgIC8qIHVwcGVyIHJpZ2h0IG5laWdoYm9yICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGdldCBwcmVkaWN0ZWQgTVYgKi8KKyAgICAgICAgICAgIGlmIChpbWIgPiAxKSAgICAvKiBnZXQgTVYgZnJvbSAybmQgbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEEgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMl07CisgICAgICAgICAgICAgICAgcG12QV94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZBX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iID4gMCAmJiBpbWIgPiAwKSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoQikgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIHBtdkJfeCA9IHBtb3QtPng7CisgICAgICAgICAgICAgICAgcG12Ql95ID0gcG1vdC0+eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGptYiA+IDAgJiYgaW1iIDwgbWJ3aWR0aCAtIDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZhaWxDID0gMTsKKyAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGgrMV07CisgICAgICAgICAgICAgICAgcG12Q194ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZDX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorICAgICAgICB9CisvLyNpZmRlZiBTQ0VORV9DSEFOR0VfREVURUNUSU9OCisgICAgICAgIC8qIHNlY29uZCBwYXNzIChTVDIgYWxnb3JpdGhtKSovCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHR5cGVfcHJlZCA9PSAxKSAvKiAgNC83LzAxICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGltYiA+IDApICAvKmxlZnQgbmVpZ2hib3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS0xXTsKKyAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIG12eVsoKm51bV9jYW4pKytdID0gKHBtb3QtPnkpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlciBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtLW1id2lkdGhdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAgLypyaWdodCBuZWlnaGJvciBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbW90ID0gJm1vdDE2eDE2W21ibnVtKzFdOworICAgICAgICAgICAgICAgICAgICBtdnhbKCpudW1fY2FuKV0gPSAocG1vdC0+eCkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgbXZ5WygqbnVtX2NhbikrK10gPSAocG1vdC0+eSkgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGptYiA8IG1iaGVpZ2h0IC0gMSkgIC8qYm90dG9tIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0rbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vI2Vsc2UKKyAgICAgICAgICAgIGVsc2UgLyogb3JpZ2luYWwgU1QxIGFsZ29yaXRobSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpbWIgPiAwKSAgLypsZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChqbWIgPiAwKSAgLyp1cHBlci1sZWZ0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGptYiA+IDApICAvKnVwcGVyIG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIG12eFsoKm51bV9jYW4pXSA9IChwbW90LT54KSA+PiAyOworICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChpbWIgPCBtYmhlaWdodCAtIDEpICAvKnVwcGVyLXJpZ2h0IG5laWdoYm9yIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgbXZ4WygqbnVtX2NhbildID0gKHBtb3QtPngpID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtdnlbKCpudW1fY2FuKSsrXSA9IChwbW90LT55KSA+PiAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBnZXQgcHJlZGljdGVkIE1WICovCisgICAgICAgICAgICBpZiAoaW1iID4gMCkgICAgLyogZ2V0IE1WIGZyb20gbGVmdCAoQSkgbmVpZ2hib3IgZWl0aGVyIG9uIGN1cnJlbnQgb3IgcHJldmlvdXMgZnJhbWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdmFpbEEgPSAxOworICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tMV07CisgICAgICAgICAgICAgICAgcG12QV94ID0gcG1vdC0+eDsKKyAgICAgICAgICAgICAgICBwbXZBX3kgPSBwbW90LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoam1iID4gMCkgLyogZ2V0IE1WIGZyb20gdG9wIChCKSBuZWlnaGJvciBlaXRoZXIgb24gY3VycmVudCBvciBwcmV2aW91cyBmcmFtZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGF2YWlsQiA9IDE7CisgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoXTsKKyAgICAgICAgICAgICAgICBwbXZCX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkJfeSA9IHBtb3QtPnk7CisKKyAgICAgICAgICAgICAgICBhdmFpbEMgPSAxOworCisgICAgICAgICAgICAgICAgaWYgKGltYiA8IG1id2lkdGggLSAxKSAvKiBnZXQgTVYgZnJvbSB0b3AtcmlnaHQgKEMpIG5laWdoYm9yIG9mIGN1cnJlbnQgZnJhbWUgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBtb3QgPSAmbW90MTZ4MTZbbWJudW0tbWJ3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAvKiBnZXQgTVYgZnJvbSB0b3AtbGVmdCAoRCkgbmVpZ2hib3Igb2YgY3VycmVudCBmcmFtZSAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG1vdCA9ICZtb3QxNngxNlttYm51bS1tYndpZHRoLTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbXZDX3ggPSBwbW90LT54OworICAgICAgICAgICAgICAgIHBtdkNfeSA9IHBtb3QtPnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKy8vI2VuZGlmCisgICAgfQorCisgICAgLyogIDMvMjMvMDEsIHJlbW92ZSByZWR1bmRhbnQgY2FuZGlkYXRlIChwb3NzaWJsZSBrLW1lYW4pICovCisgICAgbnVtMSA9ICpudW1fY2FuOworICAgICpudW1fY2FuID0gMTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtMTsgaSsrKQorICAgIHsKKyAgICAgICAgc2FtZSA9IDA7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSAoIXNhbWUgJiYgaiA8ICpudW1fY2FuKQorICAgICAgICB7CisjaWYgKENBTkRJREFURV9ESVNUQU5DRT09MCkKKyAgICAgICAgICAgIGlmIChtdnhbaV0gPT0gbXZ4W2pdICYmIG12eVtpXSA9PSBtdnlbal0pCisjZWxzZQorICAgICAgICAgICAgLy8gbW9kaWZpZWQgay1tZWFuLCAgMy8yNC8wMSwgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiAzCisgICAgICAgICAgICBpZiAoQVZDX0FCUyhtdnhbaV0gLSBtdnhbal0pICsgQVZDX0FCUyhtdnlbaV0gLSBtdnlbal0pIDwgQ0FORElEQVRFX0RJU1RBTkNFKQorI2VuZGlmCisgICAgICAgICAgICAgICAgc2FtZSA9IDE7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzYW1lKQorICAgICAgICB7CisgICAgICAgICAgICBtdnhbKm51bV9jYW5dID0gbXZ4W2ldOworICAgICAgICAgICAgbXZ5WypudW1fY2FuXSA9IG12eVtpXTsKKyAgICAgICAgICAgICgqbnVtX2NhbikrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW0xID09IDUgJiYgKm51bV9jYW4gPT0gMSkKKyAgICAgICAgKm51bV9jYW4gPSBBTExfQ0FORF9FUVVBTDsgLyogYWxsIGFyZSBlcXVhbCAqLworCisgICAgLyogY2FsY3VsYXRlIHByZWRpY3RlZCBNViAqLworCisgICAgaWYgKGF2YWlsQSAmJiAhKGF2YWlsQiB8fCBhdmFpbEMpKQorICAgIHsKKyAgICAgICAgKmNtdnggPSBwbXZBX3g7CisgICAgICAgICpjbXZ5ID0gcG12QV95OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqY212eCA9IEFWQ19NRURJQU4ocG12QV94LCBwbXZCX3gsIHBtdkNfeCk7CisgICAgICAgICpjbXZ5ID0gQVZDX01FRElBTihwbXZBX3ksIHBtdkJfeSwgcG12Q195KTsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRnVuY3Rpb246ICAgQVZDTW92ZU5laWdoYm9yU0FECisgICAgRGF0ZTogICAgICAgMy8yNy8wMQorICAgIFB1cnBvc2U6ICAgIE1vdmUgbmVpZ2hib3JpbmcgU0FEIGFyb3VuZCB3aGVuIGNlbnRlciBoYXMgc2hpZnRlZAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBBVkNNb3ZlTmVpZ2hib3JTQUQoaW50IGRuW10sIGludCBuZXdfbG9jKQoreworICAgIGludCB0bXBbOV07CisgICAgdG1wWzBdID0gZG5bMF07CisgICAgdG1wWzFdID0gZG5bMV07CisgICAgdG1wWzJdID0gZG5bMl07CisgICAgdG1wWzNdID0gZG5bM107CisgICAgdG1wWzRdID0gZG5bNF07CisgICAgdG1wWzVdID0gZG5bNV07CisgICAgdG1wWzZdID0gZG5bNl07CisgICAgdG1wWzddID0gZG5bN107CisgICAgdG1wWzhdID0gZG5bOF07CisgICAgZG5bMF0gPSBkblsxXSA9IGRuWzJdID0gZG5bM10gPSBkbls0XSA9IGRuWzVdID0gZG5bNl0gPSBkbls3XSA9IGRuWzhdID0gNjU1MzY7CisKKyAgICBzd2l0Y2ggKG5ld19sb2MpCisgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZG5bNF0gPSB0bXBbMl07CisgICAgICAgICAgICBkbls1XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzZdID0gdG1wWzhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzNdOworICAgICAgICAgICAgZG5bNV0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls2XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzhdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZG5bNl0gPSB0bXBbNF07CisgICAgICAgICAgICBkbls3XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzJdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbM107CisgICAgICAgICAgICBkbls2XSA9IHRtcFs1XTsKKyAgICAgICAgICAgIGRuWzddID0gdG1wWzZdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbMF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgZG5bMV0gPSB0bXBbMF07CisgICAgICAgICAgICBkblsyXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzhdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGRuWzFdID0gdG1wWzhdOworICAgICAgICAgICAgZG5bMl0gPSB0bXBbMF07CisgICAgICAgICAgICBkblszXSA9IHRtcFs0XTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzVdOworICAgICAgICAgICAgZG5bOF0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgZG5bMl0gPSB0bXBbOF07CisgICAgICAgICAgICBkblszXSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzRdID0gdG1wWzZdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGRuWzJdID0gdG1wWzFdOworICAgICAgICAgICAgZG5bM10gPSB0bXBbMl07CisgICAgICAgICAgICBkbls0XSA9IHRtcFswXTsKKyAgICAgICAgICAgIGRuWzVdID0gdG1wWzZdOworICAgICAgICAgICAgZG5bNl0gPSB0bXBbN107CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgZG5bMF0gPSB0bXBbbmV3X2xvY107CisKKyAgICByZXR1cm4gOworfQorCisvKiAgMy8yOC8wMSwgZmluZCBtaW5pbWFsIG9mIGRuWzldICovCisKK2ludCBBVkNGaW5kTWluKGludCBkbltdKQoreworICAgIGludCBtaW4sIGk7CisgICAgaW50IGRtaW47CisKKyAgICBkbWluID0gZG5bMV07CisgICAgbWluID0gMTsKKyAgICBmb3IgKGkgPSAyOyBpIDwgOTsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKGRuW2ldIDwgZG1pbikKKyAgICAgICAgeworICAgICAgICAgICAgZG1pbiA9IGRuW2ldOworICAgICAgICAgICAgbWluID0gaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtaW47Cit9CisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YjU1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcApAQCAtMCwwICsxLDk4MSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiByYXRlIGNvbnRyb2wgdmFyaWFibGVzICovCisjZGVmaW5lIFJDX01BWF9RVUFOVCA1MQorI2RlZmluZSBSQ19NSU5fUVVBTlQgMCAgIC8vY2FwIHRvIDEwIHRvIHByZXZlbnQgcmF0ZSBmbHVjdHVhdGlvbiAgICAKKworI2RlZmluZSBNQURfTUlOIDEgLyogaGFuZGxlIHRoZSBjYXNlIG9mIGRldmlzaW9uIGJ5IHplcm8gaW4gUkMgKi8KKworCisvKiBsb2NhbCBmdW5jdGlvbnMgKi8KK2RvdWJsZSBRUDJRc3RlcChpbnQgUVApOworaW50IFFzdGVwMlFQKGRvdWJsZSBRc3RlcCk7CisKK2RvdWJsZSBDb21wdXRlRnJhbWVNQUQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsKTsKKwordm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCk7CisKK3ZvaWQgY2FsY3VsYXRlUXVhbnRpemVyX011bHRpcGFzcyhBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKTsKKwordm9pZCB1cGRhdGVSQ19Qb3N0UHJvYyhBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIE11bHRpUGFzcyAqcE1QKTsKKwordm9pZCBBVkNTYXZlUkRTYW1wbGVzKE11bHRpUGFzcyAqcE1QLCBpbnQgY291bnRlcl9zYW1wbGVzKTsKKwordm9pZCB1cGRhdGVSYXRlQ29udHJvbChBVkNSYXRlQ29udHJvbCAqcmF0ZUNvbnRyb2wsIGludCBuYWxfdHlwZSk7CisKK2ludCBHZXRBdmdGcmFtZVFQKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCkKK3sKKyAgICByZXR1cm4gcmF0ZUN0cmwtPlFjOworfQorCitBVkNFbmNfU3RhdHVzIFJDRGV0ZXJtaW5lRnJhbWVOdW0oQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgdWludDMyIG1vZFRpbWUsIHVpbnQgKmZyYW1lTnVtKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgdWludDMyIG1vZFRpbWVSZWYgPSBlbmN2aWQtPm1vZFRpbWVSZWY7CisgICAgaW50MzIgIGN1cnJGcmFtZU51bSA7CisgICAgaW50ICBmcmFtZUluYzsKKworCisgICAgLyogY2hlY2sgd2l0aCB0aGUgYnVmZmVyIGZ1bGxuZXNzIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGhhdmUgZW5vdWdoIGJpdHMgdG8gZW5jb2RlIHRoaXMgZnJhbWUgKi8KKyAgICAvKiB3ZSBjYW4gdXNlIGEgdGhyZXNob2xkIHRvIGd1YXJhbnRlZSBtaW5pbXVtIHBpY3R1cmUgcXVhbGl0eSAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgLyogZm9yIG5vdywgdGhlIGRlZmF1bHQgaXMgdG8gZW5jb2RlIGV2ZXJ5IGZyYW1lLCBUbyBCZSBDaGFuZ2VkICovCisgICAgaWYgKHJhdGVDdHJsLT5maXJzdF9mcmFtZSkKKyAgICB7CisgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiA9IG1vZFRpbWU7CisgICAgICAgIGVuY3ZpZC0+d3JhcE1vZFRpbWUgPSAwOworICAgICAgICBlbmN2aWQtPnByZXZGcmFtZU51bSA9IDA7CisgICAgICAgIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSA9IDA7CisKKyAgICAgICAgKmZyYW1lTnVtID0gMDsKKworICAgICAgICAvKiBzZXQgZnJhbWUgdHlwZSB0byBJRFItZnJhbWUgKi8KKyAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9JRFI7CisgICAgICAgIHNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX0lfQUxMX1NMSUNFOworICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19JX1NMSUNFOworCisgICAgICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKG1vZFRpbWUgPCBtb2RUaW1lUmVmKSAvKiBtb2RUaW1lIHdyYXBwZWQgYXJvdW5kICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGVuY3ZpZC0+d3JhcE1vZFRpbWUgKz0gKCh1aW50MzIpMHhGRkZGRkZGRiAtIG1vZFRpbWVSZWYpICsgMTsKKyAgICAgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiA9IG1vZFRpbWVSZWYgPSAwOworICAgICAgICB9CisgICAgICAgIG1vZFRpbWUgKz0gZW5jdmlkLT53cmFwTW9kVGltZTsgLyogd3JhcE1vZFRpbWUgaXMgbm9uIHplcm8gYWZ0ZXIgd3JhcC1hcm91bmQgKi8KKworICAgICAgICBjdXJyRnJhbWVOdW0gPSAoaW50MzIpKCgobW9kVGltZSAtIG1vZFRpbWVSZWYpICogcmF0ZUN0cmwtPmZyYW1lX3JhdGUgKyAyMDApIC8gMTAwMCk7IC8qIGFkZCBzbWFsbCByb3VuZGluZ3MgKi8KKworICAgICAgICBpZiAoY3VyckZyYW1lTnVtIDw9IChpbnQzMillbmN2aWQtPnByZXZQcm9jRnJhbWVOdW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsgIC8qIHRoaXMgaXMgYSBsYXRlIGZyYW1lIGRvIG5vdCBlbmNvZGUgaXQgKi8KKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lSW5jID0gY3VyckZyYW1lTnVtIC0gZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtOworCisgICAgICAgIGlmIChmcmFtZUluYyA8IHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgKyAxKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gQVZDRU5DX0ZBSUw7ICAvKiBmcmFtZSBza2lwIHJlcXVpcmVkIHRvIG1haW50YWluIHRoZSB0YXJnZXQgYml0IHJhdGUuICovCisgICAgICAgIH0KKworICAgICAgICBSQ1VwZGF0ZUJ1ZmZlcih2aWRlbywgcmF0ZUN0cmwsIGZyYW1lSW5jIC0gcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSk7ICAvKiBpbiBjYXNlIG1vcmUgZnJhbWVzIGRyb3BwZWQgKi8KKworICAgICAgICAqZnJhbWVOdW0gPSBjdXJyRnJhbWVOdW07CisKKyAgICAgICAgLyogVGhpcyBwYXJ0IHdvdWxkIGJlIHNpbWlsYXIgdG8gRGV0ZXJtaW5lVm9wVHlwZSBvZiBtNHZlbmMgKi8KKyAgICAgICAgaWYgKCgqZnJhbWVOdW0gPj0gKHVpbnQpcmF0ZUN0cmwtPmlkclBlcmlvZCAmJiByYXRlQ3RybC0+aWRyUGVyaW9kID4gMCkgfHwgKCpmcmFtZU51bSA+IHZpZGVvLT5NYXhGcmFtZU51bSkpIC8qIGZpcnN0IGZyYW1lIG9yIElEUiovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHNldCBmcmFtZSB0eXBlIHRvIElEUi1mcmFtZSAqLworICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5pZHJQZXJpb2QpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZW5jdmlkLT5tb2RUaW1lUmVmICs9ICh1aW50MzIpKHJhdGVDdHJsLT5pZHJQZXJpb2QgKiAxMDAwIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgICpmcmFtZU51bSAtPSByYXRlQ3RybC0+aWRyUGVyaW9kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVuY3ZpZC0+bW9kVGltZVJlZiArPSAodWludDMyKSh2aWRlby0+TWF4RnJhbWVOdW0gKiAxMDAwIC8gcmF0ZUN0cmwtPmZyYW1lX3JhdGUpOworICAgICAgICAgICAgICAgICpmcmFtZU51bSAtPSB2aWRlby0+TWF4RnJhbWVOdW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpZGVvLT5uYWxfdW5pdF90eXBlID0gQVZDX05BTFRZUEVfSURSOworICAgICAgICAgICAgc2xpY2VIZHItPnNsaWNlX3R5cGUgPSBBVkNfSV9BTExfU0xJQ0U7CisgICAgICAgICAgICB2aWRlby0+c2xpY2VfdHlwZSA9IEFWQ19JX1NMSUNFOworICAgICAgICAgICAgZW5jdmlkLT5wcmV2UHJvY0ZyYW1lTnVtID0gKmZyYW1lTnVtOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPm5hbF91bml0X3R5cGUgPSBBVkNfTkFMVFlQRV9TTElDRTsKKyAgICAgICAgICAgIHNsaWNlSGRyLT5zbGljZV90eXBlID0gQVZDX1BfQUxMX1NMSUNFOworICAgICAgICAgICAgdmlkZW8tPnNsaWNlX3R5cGUgPSBBVkNfUF9TTElDRTsKKyAgICAgICAgICAgIGVuY3ZpZC0+cHJldlByb2NGcmFtZU51bSA9IGN1cnJGcmFtZU51bTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIEFWQ0VOQ19TVUNDRVNTOworfQorCit2b2lkIFJDVXBkYXRlQnVmZmVyKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgaW50IGZyYW1lSW5jKQoreworICAgIGludCB0bXA7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworCisgICAgT1NDTF9VTlVTRURfQVJHKHZpZGVvKTsKKworICAgIGlmIChyYXRlQ3RybC0+cmNFbmFibGUgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGlmIChmcmFtZUluYyA+IDEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcCA9IHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgKiAoZnJhbWVJbmMgLSAxKTsKKyAgICAgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLT0gdG1wOworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjICs9IDEwICogKGZyYW1lSW5jIC0gMSk7CisKKyAgICAgICAgICAgIC8qIENoZWNrIGJ1ZmZlciB1bmRlcmZsb3cgKi8KKyAgICAgICAgICAgIGlmIChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgcmF0ZUN0cmwtPmxvd19ib3VuZCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID0gcmF0ZUN0cmwtPmxvd19ib3VuZDsgLy8gLXJhdGVDdHJsLT5Ccy8yOworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+bG93X2JvdW5kOworICAgICAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA9IHBNUC0+Y291bnRlcl9CVGRzdCArIChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworQVZDRW5jX1N0YXR1cyBJbml0UmF0ZUNvbnRyb2xNb2R1bGUoQVZDSGFuZGxlICphdmNIYW5kbGUpCit7CisgICAgQVZDRW5jT2JqZWN0ICplbmN2aWQgPSAoQVZDRW5jT2JqZWN0KikgYXZjSGFuZGxlLT5BVkNPYmplY3Q7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgZG91YmxlIEwxLCBMMiwgTDMsIGJwcDsKKyAgICBpbnQgcXA7CisgICAgaW50IGksIGo7CisKKyAgICByYXRlQ3RybC0+YmFzaWNVbml0ID0gdmlkZW8tPlBpY1NpemVJbk1iczsKKworICAgIHJhdGVDdHJsLT5NQURvZk1CID0gKGRvdWJsZSopIGF2Y0hhbmRsZS0+Q0JBVkNfTWFsbG9jKGVuY3ZpZC0+YXZjSGFuZGxlLT51c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5QaWNTaXplSW5NYnMgKiBzaXplb2YoZG91YmxlKSwgREVGQVVMVF9BVFRSKTsKKworICAgIGlmICghcmF0ZUN0cmwtPk1BRG9mTUIpCisgICAgeworICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgfQorCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUCA9IChNdWx0aVBhc3MqKSBhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsIHNpemVvZihNdWx0aVBhc3MpLCBERUZBVUxUX0FUVFIpOworICAgICAgICBpZiAoIXJhdGVDdHJsLT5wTVApCisgICAgICAgIHsKKyAgICAgICAgICAgIGdvdG8gQ0xFQU5VUF9SQzsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQocmF0ZUN0cmwtPnBNUCwgMCwgc2l6ZW9mKE11bHRpUGFzcykpOworICAgICAgICByYXRlQ3RybC0+cE1QLT5lbmNvZGVkX2ZyYW1lcyA9IC0xOyAvKiBmb3JnZXQgYWJvdXQgdGhlIHZlcnkgZmlyc3QgSSBmcmFtZSAqLworCisgICAgICAgIC8qIFJESW5mbyAqKnBSRFNhbXBsZXMgKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcyA9IChSREluZm8gKiopYXZjSGFuZGxlLT5DQkFWQ19NYWxsb2MoZW5jdmlkLT5hdmNIYW5kbGUtPnVzZXJEYXRhLCAoMzAgKiBzaXplb2YoUkRJbmZvICopKSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgaWYgKCFyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSA9IChSREluZm8gKilhdmNIYW5kbGUtPkNCQVZDX01hbGxvYyhlbmN2aWQtPmF2Y0hhbmRsZS0+dXNlckRhdGEsICgzMiAqIHNpemVvZihSREluZm8pKSwgREVGQVVMVF9BVFRSKTsKKyAgICAgICAgICAgIGlmICghcmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnb3RvIENMRUFOVVBfUkM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzI7IGorKykgICAgbWVtc2V0KCYocmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlc1tpXVtqXSksIDAsIHNpemVvZihSREluZm8pKTsKKyAgICAgICAgfQorICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlID0gKGludCkocmF0ZUN0cmwtPmZyYW1lX3JhdGUgKiAxLjApOyAvKiAxLjBzIHRpbWUgZnJhbWUqLworICAgICAgICByYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlID0gQVZDX01BWChyYXRlQ3RybC0+cE1QLT5mcmFtZVJhbmdlLCA1KTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSA9IEFWQ19NSU4ocmF0ZUN0cmwtPnBNUC0+ZnJhbWVSYW5nZSwgMzApOworCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmZyYW1lUG9zID0gLTE7CisKKworICAgICAgICByYXRlQ3RybC0+Yml0c1BlckZyYW1lID0gKGludDMyKShyYXRlQ3RybC0+Yml0UmF0ZSAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKworICAgICAgICAvKiBCWCByYXRlIGNvbnRyb2wgKi8KKyAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IDA7IC8qIG11c3QgYmUgaW5pdGlhbGl6ZWQgKi8KKworICAgICAgICByYXRlQ3RybC0+QnMgPSByYXRlQ3RybC0+Y3BiU2l6ZTsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gMDsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IChpbnQpKHJhdGVDdHJsLT5CcyAqIDAuNSk7IC8qIHJhdGVDdHJsLT5CcyAqLworICAgICAgICByYXRlQ3RybC0+ZW5jb2RlZF9mcmFtZXMgPSAwOworCisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggPSByYXRlQ3RybC0+Yml0c1BlckZyYW1lOworCisgICAgICAgIHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtID0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPkJzIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcykgLyAocmF0ZUN0cmwtPmJpdHNQZXJGcmFtZSAvIDEwLjApKSAtIDU7CisgICAgICAgIGlmIChyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSA8IDApIHJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtICs9IDU7CisKKyAgICAgICAgLy8gU2V0IHRoZSBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcworICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZSBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcyBuZWVkcyB0byBiZSBzZXQgdG8gMS8zICovCisgICAgICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPSAoaW50KShyYXRlQ3RybC0+QnMgLyAzLjAgLSByYXRlQ3RybC0+QnMgLyAyLjApOyAvKiB0aGUgYnVmZmVyIHJhbmdlIGlzIFstQnMvMiwgQnMvMl0gKi8KKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+Y291bnRlcl9CVHNyYyA9IChpbnQpKChyYXRlQ3RybC0+QnMgLyAyLjAgLSByYXRlQ3RybC0+QnMgLyAzLjApIC8gKHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgLyAxMC4wKSk7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVyA9IChpbnQpKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgKyByYXRlQ3RybC0+cE1QLT5jb3VudGVyX0JUc3JjICogKHJhdGVDdHJsLT5iaXRzUGVyRnJhbWUgLyAxMC4wKSk7CisKKyAgICAgICAgcmF0ZUN0cmwtPmxvd19ib3VuZCA9IC1yYXRlQ3RybC0+QnMgLyAyOworICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCA9IDA7CisKKyAgICAgICAgLyogU2V0dGluZyB0aGUgYml0cmF0ZSBhbmQgZnJhbWVyYXRlICovCisgICAgICAgIHJhdGVDdHJsLT5wTVAtPmJpdHJhdGUgPSByYXRlQ3RybC0+Yml0UmF0ZTsKKyAgICAgICAgcmF0ZUN0cmwtPnBNUC0+ZnJhbWVyYXRlID0gcmF0ZUN0cmwtPmZyYW1lX3JhdGU7CisgICAgICAgIHJhdGVDdHJsLT5wTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSA9IHJhdGVDdHJsLT5wTVAtPmJpdHJhdGUgLyByYXRlQ3RybC0+cE1QLT5mcmFtZXJhdGU7CisKKyAgICAgICAgLypjb21wdXRlIHRoZSBpbml0aWFsIFFQKi8KKyAgICAgICAgYnBwID0gMS4wICogcmF0ZUN0cmwtPmJpdFJhdGUgLyAocmF0ZUN0cmwtPmZyYW1lX3JhdGUgKiAodmlkZW8tPlBpY1NpemVJbk1icyA8PCA4KSk7CisgICAgICAgIGlmICh2aWRlby0+UGljV2lkdGhJblNhbXBsZXNMID09IDE3NikKKyAgICAgICAgeworICAgICAgICAgICAgTDEgPSAwLjE7CisgICAgICAgICAgICBMMiA9IDAuMzsKKyAgICAgICAgICAgIEwzID0gMC42OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgPT0gMzUyKQorICAgICAgICB7CisgICAgICAgICAgICBMMSA9IDAuMjsKKyAgICAgICAgICAgIEwyID0gMC42OworICAgICAgICAgICAgTDMgPSAxLjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBMMSA9IDAuNjsKKyAgICAgICAgICAgIEwyID0gMS40OworICAgICAgICAgICAgTDMgPSAyLjQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmF0ZUN0cmwtPmluaXRRUCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoYnBwIDw9IEwxKQorICAgICAgICAgICAgICAgIHFwID0gMzU7CisgICAgICAgICAgICBlbHNlIGlmIChicHAgPD0gTDIpCisgICAgICAgICAgICAgICAgcXAgPSAyNTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJwcCA8PSBMMykKKyAgICAgICAgICAgICAgICBxcCA9IDIwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHFwID0gMTU7CisgICAgICAgICAgICByYXRlQ3RybC0+aW5pdFFQID0gcXA7CisgICAgICAgIH0KKworICAgICAgICByYXRlQ3RybC0+UWMgPSByYXRlQ3RybC0+aW5pdFFQOworICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKKworQ0xFQU5VUF9SQzoKKworICAgIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShhdmNIYW5kbGUpOworICAgIHJldHVybiBBVkNFTkNfTUVNT1JZX0ZBSUw7CisKK30KKworCit2b2lkIENsZWFudXBSYXRlQ29udHJvbE1vZHVsZShBVkNIYW5kbGUgKmF2Y0hhbmRsZSkKK3sKKyAgICBBVkNFbmNPYmplY3QgKmVuY3ZpZCA9IChBVkNFbmNPYmplY3QqKSBhdmNIYW5kbGUtPkFWQ09iamVjdDsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIGludCBpOworCisgICAgaWYgKHJhdGVDdHJsLT5NQURvZk1CKQorICAgIHsKKyAgICAgICAgYXZjSGFuZGxlLT5DQkFWQ19GcmVlKGF2Y0hhbmRsZS0+dXNlckRhdGEsIChpbnQpKHJhdGVDdHJsLT5NQURvZk1CKSk7CisgICAgfQorCisgICAgaWYgKHJhdGVDdHJsLT5wTVApCisgICAgeworICAgICAgICBpZiAocmF0ZUN0cmwtPnBNUC0+cFJEU2FtcGxlcykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGVDdHJsLT5wTVAtPnBSRFNhbXBsZXNbaV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludClyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludClyYXRlQ3RybC0+cE1QLT5wUkRTYW1wbGVzKTsKKyAgICAgICAgfQorICAgICAgICBhdmNIYW5kbGUtPkNCQVZDX0ZyZWUoYXZjSGFuZGxlLT51c2VyRGF0YSwgKGludCkocmF0ZUN0cmwtPnBNUCkpOworICAgIH0KKworICAgIHJldHVybiA7Cit9CisKK3ZvaWQgUkNJbml0R09QKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIC8qIGluIEJYIFJDLCB0aGVyZSdzIG5vIEdPUC1sZXZlbCBSQyAqLworCisgICAgT1NDTF9VTlVTRURfQVJHKGVuY3ZpZCk7CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgUkNJbml0RnJhbWVRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsID0gZW5jdmlkLT5yYXRlQ3RybDsKKyAgICBBVkNQaWNQYXJhbVNldCAqcGljUGFyYW0gPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBNdWx0aVBhc3MgKnBNUCA9IHJhdGVDdHJsLT5wTVA7CisKKyAgICBpZiAocmF0ZUN0cmwtPnJjRW5hYmxlID09IFRSVUUpCisgICAgeworICAgICAgICAvKiBmcmFtZSBsYXllciByYXRlIGNvbnRyb2wgKi8KKyAgICAgICAgaWYgKHJhdGVDdHJsLT5lbmNvZGVkX2ZyYW1lcyA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPlFjID0gcmF0ZUN0cmwtPmluaXRRUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhbGN1bGF0ZVF1YW50aXplcl9NdWx0aXBhc3MoZW5jdmlkLCB2aWRlbywgcmF0ZUN0cmwsIHBNUCk7CisgICAgICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPlFjOworICAgICAgICB9CisKKyAgICAgICAgcmF0ZUN0cmwtPk51bWJlcm9mSGVhZGVyQml0cyA9IDA7CisgICAgICAgIHJhdGVDdHJsLT5OdW1iZXJvZlRleHR1cmVCaXRzID0gMDsKKyAgICAgICAgcmF0ZUN0cmwtPm51bUZyYW1lQml0cyA9IDA7IC8vIHJlc2V0CisKKyAgICAgICAgLyogdXBkYXRlIHBNUC0+ZnJhbWVQb3MgKi8KKyAgICAgICAgaWYgKCsrcE1QLT5mcmFtZVBvcyA9PSBwTVAtPmZyYW1lUmFuZ2UpIHBNUC0+ZnJhbWVQb3MgPSAwOworCisgICAgICAgIGlmIChyYXRlQ3RybC0+VCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSAoaW50KShyYXRlQ3RybC0+ZnJhbWVfcmF0ZSAqIDcuNSArIDAuNSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgKi8KKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCA9IEFWQ19NSU4ocE1QLT5jb3VudGVyX0JUZHN0LCAoaW50KShyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAvIDIgKiAwLjQwKSk7IC8qIDAuNzVzIHRpbWUgZnJhbWUgbWF5IGdvIGJleW9uZCBWQlYgYnVmZmVyIGlmIHdlIHNldCB0aGUgYnVmZmVyIHNpemUgc21hbGxlciB0aGFuIDAuNzVzICovCisgICAgICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgPSBBVkNfTUFYKHBNUC0+Y291bnRlcl9CVGRzdCwgKGludCkoKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzKSAqIDAuMzAgLyAocmF0ZUN0cmwtPlRNTl9USCAvIDEwLjApICsgMC41KSk7IC8qIEF0IGxlYXN0IDMwJSBvZiBWQlYgYnVmZmVyIHNpemUvMiAqLworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0ID0gQVZDX01JTihwTVAtPmNvdW50ZXJfQlRkc3QsIDIwKTsgLyogTGltaXQgdGhlIHRhcmdldCB0byBiZSBzbWFsbGVyIHRoYW4gM0MgKi8KKworICAgICAgICAgICAgcE1QLT50YXJnZXRfYml0cyA9IHJhdGVDdHJsLT5UID0gcmF0ZUN0cmwtPlRNTl9USCA9IChpbnQpKHJhdGVDdHJsLT5UTU5fVEggKiAoMS4wICsgcE1QLT5jb3VudGVyX0JUZHN0ICogMC4xKSk7CisgICAgICAgICAgICBwTVAtPmRpZmZfY291bnRlciA9IHBNUC0+Y291bnRlcl9CVGRzdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvbGxlY3QgdGhlIG5lY2Vzc2FyeSBkYXRhOiB0YXJnZXQgYml0cywgYWN0dWFsIGJpdHMsIG1hZCBhbmQgUVAgKi8KKyAgICAgICAgcE1QLT50YXJnZXRfYml0cyA9IHJhdGVDdHJsLT5UOworICAgICAgICBwTVAtPlFQICA9IHZpZGVvLT5RUHk7CisKKyAgICAgICAgcE1QLT5tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7IC8vQ29tcHV0ZUZyYW1lTUFEKHZpZGVvLCByYXRlQ3RybCk7CisgICAgICAgIGlmIChwTVAtPm1hZCA8IE1BRF9NSU4pIHBNUC0+bWFkID0gTUFEX01JTjsgLyogTUFEX01JTiBpcyBkZWZpbmVkIGFzIDEgaW4gbXA0ZGVmLmggKi8KKworICAgICAgICBwTVAtPmJpdHJhdGUgPSByYXRlQ3RybC0+Yml0UmF0ZTsgLyogY2FsY3VsYXRlZCBpbiBSQ1ZvcFFQU2V0dGluZyAqLworICAgICAgICBwTVAtPmZyYW1lcmF0ZSA9IHJhdGVDdHJsLT5mcmFtZV9yYXRlOworCisgICAgICAgIC8qIGZpcnN0IHBhc3MgZW5jb2RpbmcgKi8KKyAgICAgICAgcE1QLT5uUmVfUXVhbnRpemVkID0gMDsKKworICAgIH0gLy8gcmNFbmFibGUKKyAgICBlbHNlCisgICAgeworICAgICAgICB2aWRlby0+UVB5ID0gcmF0ZUN0cmwtPmluaXRRUDsKKyAgICB9CisKKy8vICBwcmludGYoIiAlZCAiLHZpZGVvLT5RUHkpOworCisgICAgaWYgKHZpZGVvLT5DdXJyUGljTnVtID09IDAgJiYgZW5jdmlkLT5vdXRPZkJhbmRQYXJhbVNldCA9PSBGQUxTRSkKKyAgICB7CisgICAgICAgIHBpY1BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ID0gMDsKKyAgICAgICAgcGljUGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgPSB2aWRlby0+UVB5IC0gMjY7CisgICAgfQorCisgICAgLy8gbmVlZCB0aGlzIGZvciBtb3Rpb24gZXN0aW1hdGlvbgorICAgIGVuY3ZpZC0+bGFtYmRhX21vZGUgPSBRUDJRVUFOVFtBVkNfTUFYKDAsIHZpZGVvLT5RUHktU0hJRlRfUVApXTsKKyAgICBlbmN2aWQtPmxhbWJkYV9tb3Rpb24gPSBMQU1CREFfRkFDVE9SKGVuY3ZpZC0+bGFtYmRhX21vZGUpOworICAgIHJldHVybiA7Cit9CisKKy8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwordm9pZCBjYWxjdWxhdGVRdWFudGl6ZXJfTXVsdGlwYXNzKEFWQ0VuY09iamVjdCAqZW5jdmlkLCBBVkNDb21tb25PYmogKnZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApCit7CisgICAgaW50IHByZXZfYWN0dWFsX2JpdHMgPSAwLCBjdXJyX3RhcmdldCwgLypwb3M9MCwqL2ksIGo7CisgICAgT3NjbEZsb2F0IFFzdGVwLCBwcmV2X1FQID0gMC42MjU7CisKKyAgICBPc2NsRmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKKworICAgIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiAqLworICAgIHRhcmdldEJpdENhbGN1bGF0aW9uKGVuY3ZpZCwgdmlkZW8sIHJhdGVDdHJsLCBwTVApOworCisgICAgaWYgKHJhdGVDdHJsLT5UIDw9IDAgfHwgcmF0ZUN0cmwtPnRvdGFsU0FEID09IDApCisgICAgeworICAgICAgICBpZiAocmF0ZUN0cmwtPlQgPCAwKSAgICByYXRlQ3RybC0+UWMgPSBSQ19NQVhfUVVBTlQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIGN1cnJlbnQgZnJhbWUgUVAgZXN0aW1hdGlvbiAqLworICAgIGN1cnJfdGFyZ2V0ID0gcmF0ZUN0cmwtPlQ7CisgICAgY3Vycl9tYWQgPSAoT3NjbEZsb2F0KXJhdGVDdHJsLT50b3RhbFNBRCAvIHZpZGVvLT5QaWNTaXplSW5NYnM7CisgICAgaWYgKGN1cnJfbWFkIDwgTUFEX01JTikgY3Vycl9tYWQgPSBNQURfTUlOOyAvKiBNQURfTUlOIGlzIGRlZmluZWQgYXMgMSBpbiBtcDRkZWYuaCAqLworICAgIGN1cnJfUkQgID0gKE9zY2xGbG9hdCljdXJyX3RhcmdldCAvIGN1cnJfbWFkOworCisgICAgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPT0gLTEpIC8vIHByZXZpb3VzIHdhcyBza2lwcGVkCisgICAgeworICAgICAgICBpID0gcE1QLT5mcmFtZVBvczsKKyAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICBwcmV2X1FQID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLlFQOworICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLmFjdHVhbF9iaXRzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBBbm90aGVyIHZlcnNpb24gb2Ygc2VhcmNoIHRoZSBvcHRpbWFsIHBvaW50ICovCisgICAgICAgIHByZXZfbWFkID0gMC4wOworICAgICAgICBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBwTVAtPmZyYW1lUmFuZ2UgJiYgcHJldl9tYWQgPCAwLjAwMSkgLyogZmluZCBmaXJzdCBvbmUgd2l0aCBub256ZXJvIHByZXZfbWFkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZfbWFkID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZDsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgcE1QLT5mcmFtZVJhbmdlKQorICAgICAgICB7CisgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ktMV1bMF0uYWN0dWFsX2JpdHM7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGkgPCBwTVAtPmZyYW1lUmFuZ2U7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocE1QLT5wUkRTYW1wbGVzW2ldWzBdLm1hZCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBBVkNfQUJTKHByZXZfbWFkIC0gY3Vycl9tYWQpID4gQVZDX0FCUyhwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkIC0gY3Vycl9tYWQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9tYWQgPSBwTVAtPnBSRFNhbXBsZXNbaV1bMF0ubWFkOworICAgICAgICAgICAgICAgICAgICBwcmV2X2FjdHVhbF9iaXRzID0gcE1QLT5wUkRTYW1wbGVzW2ldWzBdLmFjdHVhbF9iaXRzOworICAgICAgICAgICAgICAgICAgICBqID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X1FQID0gUVAyUXN0ZXAocE1QLT5wUkRTYW1wbGVzW2pdWzBdLlFQKTsKKworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHBNUC0+c2FtcGxlc1BlckZyYW1lW2pdOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKEFWQ19BQlMocHJldl9hY3R1YWxfYml0cyAtIGN1cnJfdGFyZ2V0KSA+IEFWQ19BQlMocE1QLT5wUkRTYW1wbGVzW2pdW2ldLmFjdHVhbF9iaXRzIC0gY3Vycl90YXJnZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9hY3R1YWxfYml0cyA9IHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5hY3R1YWxfYml0czsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9RUCA9IFFQMlFzdGVwKHBNUC0+cFJEU2FtcGxlc1tqXVtpXS5RUCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gcXVhZHJhdGljIGFwcHJveGltYXRpb24KKyAgICBpZiAocHJldl9tYWQgPiAwLjAwMSkgLy8gb25seSB3aGVuIHByZXZfbWFkIGlzIGdyZWF0ZXIgdGhhbiAwLCBvdGhlcndpc2Uga2VlcCB1c2luZyB0aGUgc2FtZSBRUAorICAgIHsKKyAgICAgICAgcHJldl9SRCA9IChPc2NsRmxvYXQpcHJldl9hY3R1YWxfYml0cyAvIHByZXZfbWFkOworICAgICAgICAvL3JhdGVDdHJsLT5RYyA9IChJbnQpKHByZXZfUVAgKiBzcXJ0KHByZXZfYWN0dWFsX2JpdHMvY3Vycl90YXJnZXQpICsgMC40KTsKKyAgICAgICAgaWYgKHByZXZfUVAgPT0gMC42MjUpIC8vIGFkZGVkIHRoaXMgdG8gYWxsb3cgZ2V0dGluZyBvdXQgb2YgUVAgPSAwIGVhc2lseQorICAgICAgICB7CisgICAgICAgICAgICBRc3RlcCA9IChpbnQpKHByZXZfUkQgLyBjdXJyX1JEICsgMC41KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICAgICAgcmF0ZUN0cmwtPlFjID0oSW50KShwcmV2X1FQICogTTRWRU5DX1NRUlQocHJldl9SRC9jdXJyX1JEKSArIDAuOSk7CisKKyAgICAgICAgICAgIGlmIChwcmV2X1JEIC8gY3Vycl9SRCA+IDAuNSAmJiBwcmV2X1JEIC8gY3Vycl9SRCA8IDIuMCkKKyAgICAgICAgICAgICAgICBRc3RlcCA9IChpbnQpKHByZXZfUVAgKiAoc3FydChwcmV2X1JEIC8gY3Vycl9SRCkgKyBwcmV2X1JEIC8gY3Vycl9SRCkgLyAyLjAgKyAwLjkpOyAvKiBRdWFkcmF0aWMgYW5kIGxpbmVhciBhcHByb3hpbWF0aW9uICovCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUXN0ZXAgPSAoaW50KShwcmV2X1FQICogKHNxcnQocHJldl9SRCAvIGN1cnJfUkQpICsgcG93KHByZXZfUkQgLyBjdXJyX1JELCAxLjAgLyAzLjApKSAvIDIuMCArIDAuOSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbG93ZXIgYm91bmQgb24gUWMgc2hvdWxkIGJlIGEgZnVuY3Rpb24gb2YgY3Vycl9tYWQKKyAgICAgICAgLy8gV2hlbiBtYWQgaXMgYWxyZWFkeSBsb3csIGxvd2VyIGJvdW5kIG9uIFFjIGRvZXNuJ3QgaGF2ZSB0byBiZSBzbWFsbC4KKyAgICAgICAgLy8gTm90ZSwgdGhpcyBkb2Vzbid0IHdvcmsgd2VsbCBmb3IgbG93IGNvbXBsZXhpdHkgY2xpcCBlbmNvZGVkIGF0IGhpZ2ggYml0IHJhdGUKKyAgICAgICAgLy8gaXQgZG9lc24ndCBoaXQgdGhlIHRhcmdldCBiaXQgcmF0ZSBkdWUgdG8gdGhpcyBRUCBsb3dlciBib3VuZC4KKyAgICAgICAgLy8vIGlmKChjdXJyX21hZCA8IDgpICYmIChyYXRlQ3RybC0+UWMgPCAxMikpICAgcmF0ZUN0cmwtPlFjID0gMTI7CisgICAgICAgIC8vICBlbHNlICAgIGlmKChjdXJyX21hZCA8IDEyOCkgJiYgKHJhdGVDdHJsLT5RYyA8IDMpKSByYXRlQ3RybC0+UWMgPSAzOworCisgICAgICAgIHJhdGVDdHJsLT5RYyA9IFFzdGVwMlFQKFFzdGVwKTsKKworICAgICAgICBpZiAocmF0ZUN0cmwtPlFjIDwgUkNfTUlOX1FVQU5UKSByYXRlQ3RybC0+UWMgPSBSQ19NSU5fUVVBTlQ7CisgICAgICAgIGlmIChyYXRlQ3RybC0+UWMgPiBSQ19NQVhfUVVBTlQpICAgIHJhdGVDdHJsLT5RYyA9IFJDX01BWF9RVUFOVDsKKyAgICB9CisKKyAgICAvKiBhY3RpdmUgYml0IHJlc291cmNlIHByb3RlY3Rpb24gKi8KKyAgICBhdmVyX1FQID0gKHBNUC0+ZW5jb2RlZF9mcmFtZXMgPT0gMCA/IDAgOiBwTVAtPnN1bV9RUCAvIChPc2NsRmxvYXQpcE1QLT5lbmNvZGVkX2ZyYW1lcyk7CisgICAgYXZlcmFnZV9tYWQgPSAocE1QLT5lbmNvZGVkX2ZyYW1lcyA9PSAwID8gMCA6IHBNUC0+c3VtX21hZCAvIChPc2NsRmxvYXQpcE1QLT5lbmNvZGVkX2ZyYW1lcyk7IC8qIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHNjb25kIGVuY29kZWQgZnJhbWUqLworICAgIGlmIChwTVAtPmRpZmZfY291bnRlciA9PSAwICYmCisgICAgICAgICAgICAoKE9zY2xGbG9hdClyYXRlQ3RybC0+UWMgPD0gYXZlcl9RUCoxLjEgfHwgY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xKSAmJgorICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIDw9IChwTVAtPmNvdW50ZXJfQlRkc3QgKyAoaW50KShwTVAtPmZyYW1lcmF0ZSoxLjAgKyAwLjUpKSkKKyAgICB7CisgICAgICAgIHJhdGVDdHJsLT5UTU5fVEggLT0gKGludCkocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMC4wKTsKKyAgICAgICAgcmF0ZUN0cmwtPlQgPSByYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XOworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMrKzsKKyAgICAgICAgcE1QLT5kaWZmX2NvdW50ZXItLTsKKyAgICB9CisKK30KKwordm9pZCB0YXJnZXRCaXRDYWxjdWxhdGlvbihBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBNdWx0aVBhc3MgKnBNUCkKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcoZW5jdmlkKTsKKyAgICBPc2NsRmxvYXQgY3Vycl9tYWQ7Ly8sIGF2ZXJhZ2VfbWFkOworICAgIGludCBkaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCwgcHJldl9jb3VudGVyX2RpZmYsIGN1cnJfY291bnRlcl9kaWZmLCBib3VuZDsKKyAgICAvKiBCVCA9IEJpdCBUcmFuc2ZlciwgZm9yIHBNUC0+Y291bnRlcl9CVHNyYywgcE1QLT5jb3VudGVyX0JUZHN0ICovCisKKyAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KKyAgICB1cGRhdGVSQ19Qb3N0UHJvYyhyYXRlQ3RybCwgcE1QKTsKKworICAgIC8qIHVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMgYW5kIHBNUC0+Y291bnRlcl9CVGRzdCB0byBhdm9pZCBpbnRlcmdlciBvdmVyZmxvdyAqLworICAgIGlmIChwTVAtPmNvdW50ZXJfQlRzcmMgPiAxMDAwICYmIHBNUC0+Y291bnRlcl9CVGRzdCA+IDEwMDApCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRzcmMgLT0gMTAwMDsKKyAgICAgICAgcE1QLT5jb3VudGVyX0JUZHN0IC09IDEwMDA7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAvKiB0YXJnZXQgY2FsY3VsYXRpb24gKi8KKyAgICBjdXJyX21hZCA9IChPc2NsRmxvYXQpcmF0ZUN0cmwtPnRvdGFsU0FEIC8gdmlkZW8tPlBpY1NpemVJbk1iczsKKyAgICBpZiAoY3Vycl9tYWQgPCBNQURfTUlOKSBjdXJyX21hZCA9IE1BRF9NSU47IC8qIE1BRF9NSU4gaXMgZGVmaW5lZCBhcyAxIGluIG1wNGRlZi5oICovCisgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKyAgICBwTVAtPmRpZmZfY291bnRlciA9IDA7CisKKworICAgIC8qMS5jYWxjdWxhdGUgYXZlcmFnZSBtYWQgKi8KKyAgICBwTVAtPnN1bV9tYWQgKz0gY3Vycl9tYWQ7CisgICAgLy9hdmVyYWdlX21hZCA9IChwTVAtPmVuY29kZWRfZnJhbWVzIDwgMSA/IGN1cnJfbWFkIDogcE1QLT5zdW1fbWFkLyhPc2NsRmxvYXQpKHBNUC0+ZW5jb2RlZF9mcmFtZXMrMSkpOyAvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIHRoZSBzY29uZCBlbmNvZGVkIGZyYW1lKi8KKyAgICAvL3BNUC0+YXZlcl9tYWQgPSBhdmVyYWdlX21hZDsKKyAgICBpZiAocE1QLT5lbmNvZGVkX2ZyYW1lcyA+PSAwKSAvKiBwTVAtPmVuY29kZWRfZnJhbWVzIGlzIHNldCB0byAtMSBpbml0aWFsbHksIHNvIGZvcmdldCBhYm91dCB0aGUgdmVyeSBmaXJzdCBJIGZyYW1lICovCisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lcyArIDEpOworCisgICAgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA+IDAgJiYgcE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ID49IDApCisgICAgICAgIHBNUC0+YXZlcl9tYWRfcHJldiA9IChwTVAtPmF2ZXJfbWFkX3ByZXYgKiBwTVAtPmVuY29kZWRfZnJhbWVzX3ByZXYgKyBjdXJyX21hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lc19wcmV2ICsgMSk7CisKKyAgICAvKjIuYXZlcmFnZV9tYWQsIG1hZCA9PT4gZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QgKi8KKyAgICBpZiAocE1QLT5vdmVybGFwcGVkX3dpbl9zaXplID09IDApCisgICAgeworICAgICAgICAvKiBvcmlnaW5hbCB2ZXJpc29uICovCisgICAgICAgIGlmIChjdXJyX21hZCA+IHBNUC0+YXZlcl9tYWQqMS4xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkgPiAyKQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkpICogMTAgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKChzcXJ0KGN1cnJfbWFkL3BNUC0+YXZlcl9tYWQpKjIrY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkvKDMqMC4xKSArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAoaW50KShjdXJyX21hZCAvIChwTVAtPmF2ZXJfbWFkICsgMC4wMDAxKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xICovCisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKGludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZCkgKyBwb3coY3Vycl9tYWQvcE1QLT5hdmVyX21hZCwgMS4wLzMuMCkpLygyLjAqMC4xKSArIDAuNCk7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxMCAtIChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZCArIDAuMDAwMSkpICogMTAgKyAwLjUpOworCisgICAgICAgIC8qIGFjdGl2ZWx5IGZpbGwgaW4gdGhlIHBvc3NpYmxlIGdhcCAqLworICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjID09IDAgJiYgZGlmZl9jb3VudGVyX0JUZHN0ID09IDAgJiYKKyAgICAgICAgICAgICAgICBjdXJyX21hZCA8PSBwTVAtPmF2ZXJfbWFkKjEuMSAmJiBwTVAtPmNvdW50ZXJfQlRzcmMgPCBwTVAtPmNvdW50ZXJfQlRkc3QpCisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAxOworCisgICAgfQorICAgIGVsc2UgaWYgKHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA+IDApCisgICAgeworICAgICAgICAvKiB0cmFuc2l0aW9uIHRpbWU6IHVzZSBwcmV2aW91cyBhdmVyYWdlIG1hZCAicE1QLT5hdmVyX21hZF9wcmV2IiBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IGF2ZXJhZ2UgbWFkICJwTVAtPmF2ZXJfbWFkIiAqLworICAgICAgICBpZiAoY3Vycl9tYWQgPiBwTVAtPmF2ZXJfbWFkX3ByZXYqMS4xKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vycl9tYWQgLyBwTVAtPmF2ZXJfbWFkX3ByZXYgPiAyKQorICAgICAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChpbnQpKHNxcnQoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSkgKiAxMCArIDAuNCkgLSAxMDsKKyAgICAgICAgICAgIC8vZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoKE00VkVOQ19TUVJUKGN1cnJfbWFkL3BNUC0+YXZlcl9tYWRfcHJldikqMitjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYpLygzKjAuMSkgKyAwLjQpIC0gMTA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUZHN0ID0gKGludCkoY3Vycl9tYWQgLyAocE1QLT5hdmVyX21hZF9wcmV2ICsgMC4wMDAxKSAqIDEwICsgMC40KSAtIDEwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY3Vycl9tYWQgPD0gYXZlcmFnZV9tYWQqMS4xICovCisgICAgICAgICAgICAvL2RpZmZfY291bnRlcl9CVHNyYyA9IDEwIC0gKEludCkoKHNxcnQoY3Vycl9tYWQvcE1QLT5hdmVyX21hZF9wcmV2KSArIHBvdyhjdXJyX21hZC9wTVAtPmF2ZXJfbWFkX3ByZXYsIDEuMC8zLjApKS8oMi4wKjAuMSkgKyAwLjQpOworICAgICAgICAgICAgZGlmZl9jb3VudGVyX0JUc3JjID0gMTAgLSAoaW50KShzcXJ0KGN1cnJfbWFkIC8gKHBNUC0+YXZlcl9tYWRfcHJldiArIDAuMDAwMSkpICogMTAgKyAwLjUpOworCisgICAgICAgIC8qIGFjdGl2ZWx5IGZpbGwgaW4gdGhlIHBvc3NpYmxlIGdhcCAqLworICAgICAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjID09IDAgJiYgZGlmZl9jb3VudGVyX0JUZHN0ID09IDAgJiYKKyAgICAgICAgICAgICAgICBjdXJyX21hZCA8PSBwTVAtPmF2ZXJfbWFkX3ByZXYqMS4xICYmIHBNUC0+Y291bnRlcl9CVHNyYyA8IHBNUC0+Y291bnRlcl9CVGRzdCkKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVHNyYyA9IDE7CisKKyAgICAgICAgaWYgKC0tcE1QLT5vdmVybGFwcGVkX3dpbl9zaXplIDw9IDApICAgIHBNUC0+b3ZlcmxhcHBlZF93aW5fc2l6ZSA9IDA7CisgICAgfQorCisKKyAgICAvKiBpZiBkaWZmZXJlbmNlIGlzIHRvbyBtdWNoLCBkbyBjbGlwcGluZyAqLworICAgIC8qIEZpcnN0LCBzZXQgdGhlIHVwcGVyIGJvdW5kIGZvciBjdXJyZW50IGJpdCBhbGxvY2F0aW9uIHZhcmlhbmNlOiA4MCUgb2YgYXZhaWxhYmxlIGJ1ZmZlciAqLworICAgIGJvdW5kID0gKGludCkoKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzKSAqIDAuNiAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7IC8qIHJhdGVDdHJsLT5CcyAqLworICAgIGRpZmZfY291bnRlcl9CVHNyYyA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVHNyYywgYm91bmQpOworICAgIGRpZmZfY291bnRlcl9CVGRzdCA9ICBBVkNfTUlOKGRpZmZfY291bnRlcl9CVGRzdCwgYm91bmQpOworCisgICAgLyogU2Vjb25kLCBzZXQgYW5vdGhlciB1cHBlciBib3VuZCBmb3IgY3VycmVudCBiaXQgYWxsb2NhdGlvbjogNC01KmJpdHJhdGUvZnJhbWVyYXRlICovCisgICAgYm91bmQgPSA1MDsKKy8vICBpZih2aWRlby0+ZW5jUGFyYW1zLT5SQ19UeXBlID09IENCUl9MT1dERUxBWSkKKy8vICBub3QgbmVjZXNzYXJ5ICAgICAgIGJvdW5kID0gMTA7ICAtLSBGb3IgTG93IGRlbGF5ICovCisKKyAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRzcmMsIGJvdW5kKTsKKyAgICBkaWZmX2NvdW50ZXJfQlRkc3QgPSAgQVZDX01JTihkaWZmX2NvdW50ZXJfQlRkc3QsIGJvdW5kKTsKKworCisgICAgLyogVGhpcmQsIGNoZWNrIHRoZSBidWZmZXIgKi8KKyAgICBwcmV2X2NvdW50ZXJfZGlmZiA9IHBNUC0+Y291bnRlcl9CVGRzdCAtIHBNUC0+Y291bnRlcl9CVHNyYzsKKyAgICBjdXJyX2NvdW50ZXJfZGlmZiA9IHByZXZfY291bnRlcl9kaWZmICsgKGRpZmZfY291bnRlcl9CVGRzdCAtIGRpZmZfY291bnRlcl9CVHNyYyk7CisKKyAgICBpZiAoQVZDX0FCUyhwcmV2X2NvdW50ZXJfZGlmZikgPj0gcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gfHwgQVZDX0FCUyhjdXJyX2NvdW50ZXJfZGlmZikgPj0gcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0pCisgICAgeyAgIC8vZGlmZl9jb3VudGVyX0JUc3JjID0gZGlmZl9jb3VudGVyX0JUZHN0ID0gMDsKKworICAgICAgICBpZiAoY3Vycl9jb3VudGVyX2RpZmYgPiByYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAmJiBkaWZmX2NvdW50ZXJfQlRkc3QpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpZmZfY291bnRlcl9CVGRzdCA9IChyYXRlQ3RybC0+bWF4X0JpdFZhcmlhbmNlX251bSAtIHByZXZfY291bnRlcl9kaWZmKSArIGRpZmZfY291bnRlcl9CVHNyYzsKKyAgICAgICAgICAgIGlmIChkaWZmX2NvdW50ZXJfQlRkc3QgPCAwKSBkaWZmX2NvdW50ZXJfQlRkc3QgPSAwOworICAgICAgICB9CisKKyAgICAgICAgZWxzZSBpZiAoY3Vycl9jb3VudGVyX2RpZmYgPCAtcmF0ZUN0cmwtPm1heF9CaXRWYXJpYW5jZV9udW0gJiYgZGlmZl9jb3VudGVyX0JUc3JjKQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmX2NvdW50ZXJfQlRzcmMgPSBkaWZmX2NvdW50ZXJfQlRkc3QgLSAoLXJhdGVDdHJsLT5tYXhfQml0VmFyaWFuY2VfbnVtIC0gcHJldl9jb3VudGVyX2RpZmYpOworICAgICAgICAgICAgaWYgKGRpZmZfY291bnRlcl9CVHNyYyA8IDApIGRpZmZfY291bnRlcl9CVHNyYyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qMy5kaWZmX2NvdW50ZXJfQlRzcmMsIGRpZmZfY291bnRlcl9CVGRzdCA9PT4gVE1OX1RIICovCisgICAgcmF0ZUN0cmwtPlRNTl9USCA9IChpbnQpKHBNUC0+dGFyZ2V0X2JpdHNfcGVyX2ZyYW1lKTsKKyAgICBwTVAtPmRpZmZfY291bnRlciA9IDA7CisKKyAgICBpZiAoZGlmZl9jb3VudGVyX0JUc3JjKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCAtPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAqIGRpZmZfY291bnRlcl9CVHNyYyAqIDAuMSk7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gLWRpZmZfY291bnRlcl9CVHNyYzsKKyAgICB9CisgICAgZWxzZSBpZiAoZGlmZl9jb3VudGVyX0JUZHN0KQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9USCArPSAoaW50KShwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAqIGRpZmZfY291bnRlcl9CVGRzdCAqIDAuMSk7CisgICAgICAgIHBNUC0+ZGlmZl9jb3VudGVyID0gZGlmZl9jb3VudGVyX0JUZHN0OworICAgIH0KKworCisgICAgLyo0LnVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLworICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSBkaWZmX2NvdW50ZXJfQlRzcmM7CisgICAgcE1QLT5jb3VudGVyX0JUZHN0ICs9IGRpZmZfY291bnRlcl9CVGRzdDsKKworCisgICAgLyo1LnRhcmdldCBiaXQgY2FsY3VsYXRpb24gKi8KKyAgICByYXRlQ3RybC0+VCA9IHJhdGVDdHJsLT5UTU5fVEggLSByYXRlQ3RybC0+VE1OX1c7CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIHVwZGF0ZVJDX1Bvc3RQcm9jKEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCwgTXVsdGlQYXNzICpwTVApCit7CisgICAgaWYgKHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPiAwKSAvKiBza2lwIG5leHQgZnJhbWUgKi8KKyAgICB7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMCAqIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWU7CisKKyAgICB9CisgICAgZWxzZSBpZiAocmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9PSAtMSkgLyogc2tpcCBjdXJyZW50IGZyYW1lICovCisgICAgeworICAgICAgICBwTVAtPmNvdW50ZXJfQlRkc3QgLT0gcE1QLT5kaWZmX2NvdW50ZXI7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSAxMDsKKworICAgICAgICBwTVAtPnN1bV9tYWQgLT0gcE1QLT5tYWQ7CisgICAgICAgIHBNUC0+YXZlcl9tYWQgPSAocE1QLT5hdmVyX21hZCAqIHBNUC0+ZW5jb2RlZF9mcmFtZXMgLSBwTVAtPm1hZCkgLyAocE1QLT5lbmNvZGVkX2ZyYW1lcyAtIDEgKyAwLjAwMDEpOworICAgICAgICBwTVAtPnN1bV9RUCAgLT0gcE1QLT5RUDsKKyAgICAgICAgcE1QLT5lbmNvZGVkX2ZyYW1lcyAtLTsKKyAgICB9CisgICAgLyogc29tZSBzdHVmZiBpbiB1cGRhdGUgVkJWX2Z1bGxuZXNzIHJlbWFpbnMgaGVyZSAqLworICAgIC8vaWYocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA8IC1yYXRlQ3RybC0+QnMvMikgLyogcmF0ZUN0cmwtPkJzICovCisgICAgaWYgKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgPCByYXRlQ3RybC0+bG93X2JvdW5kKQorICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IHJhdGVDdHJsLT5sb3dfYm91bmQ7IC8vIC1yYXRlQ3RybC0+QnMvMjsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XID0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5sb3dfYm91bmQ7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyA9IHBNUC0+Y291bnRlcl9CVGRzdCArIChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgfQorfQorCisKK3ZvaWQgUkNJbml0Q2hyb21hUVAoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisgICAgaW50IHFfYml0czsKKworICAgIC8qIHdlIGhhdmUgdG8gZG8gdGhlIHNhbWUgdGhpbmcgZm9yIEFWQ19DTElQMygwLDUxLHZpZGVvLT5RU3kpICovCisKKyAgICB2aWRlby0+UVB5X2Rpdl82ID0gKGN1cnJNQi0+UVB5ICogNDMpID4+IDg7CisgICAgdmlkZW8tPlFQeV9tb2RfNiA9IGN1cnJNQi0+UVB5IC0gNiAqIHZpZGVvLT5RUHlfZGl2XzY7CisgICAgY3Vyck1CLT5RUGMgPSB2aWRlby0+UVBjID0gbWFwUVBpMlFQY1tBVkNfQ0xJUDMoMCwgNTEsIGN1cnJNQi0+UVB5ICsgdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXQpXTsKKyAgICB2aWRlby0+UVBjX2Rpdl82ID0gKHZpZGVvLT5RUGMgKiA0MykgPj4gODsKKyAgICB2aWRlby0+UVBjX21vZF82ID0gdmlkZW8tPlFQYyAtIDYgKiB2aWRlby0+UVBjX2Rpdl82OworCisgICAgLyogcHJlLWNhbGN1bGF0ZSB0aGlzIHRvIHNhdmUgY29tcHV0YXRpb24gKi8KKyAgICBxX2JpdHMgPSA0ICsgdmlkZW8tPlFQeV9kaXZfNjsKKyAgICBpZiAodmlkZW8tPnNsaWNlX3R5cGUgPT0gQVZDX0lfU0xJQ0UpCisgICAgeworICAgICAgICBlbmN2aWQtPnFwX2NvbnN0ID0gNjgyIDw8IHFfYml0czsgICAgICAgLy8gaW50cmEKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdCA9IDM0MiA8PCBxX2JpdHM7ICAgICAgIC8vIGludGVyCisgICAgfQorCisgICAgcV9iaXRzID0gNCArIHZpZGVvLT5RUGNfZGl2XzY7CisgICAgaWYgKHZpZGVvLT5zbGljZV90eXBlID09IEFWQ19JX1NMSUNFKQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdF9jID0gNjgyIDw8IHFfYml0czsgICAgLy8gaW50cmEKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZW5jdmlkLT5xcF9jb25zdF9jID0gMzQyIDw8IHFfYml0czsgICAgLy8gaW50ZXIKKyAgICB9CisKKyAgICBlbmN2aWQtPmxhbWJkYV9tb2RlID0gUVAyUVVBTlRbQVZDX01BWCgwLCBjdXJyTUItPlFQeS1TSElGVF9RUCldOworICAgIGVuY3ZpZC0+bGFtYmRhX21vdGlvbiA9IExBTUJEQV9GQUNUT1IoZW5jdmlkLT5sYW1iZGFfbW9kZSk7CisKKyAgICByZXR1cm4gOworfQorCisKK3ZvaWQgUkNJbml0TUJRUChBVkNFbmNPYmplY3QgKmVuY3ZpZCkKK3sKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gIGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiA9IHZpZGVvLT5jdXJyTUI7CisKKyAgICBjdXJyTUItPlFQeSA9IHZpZGVvLT5RUHk7IC8qIHNldCB0byBwcmV2aW91cyB2YWx1ZSBvciBwaWN0dXJlIGxldmVsICovCisKKyAgICBSQ0luaXRDaHJvbWFRUChlbmN2aWQpOworCit9CisKK3ZvaWQgUkNQb3N0TUIoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDUmF0ZUNvbnRyb2wgKnJhdGVDdHJsLCBpbnQgbnVtX2hlYWRlcl9iaXRzLCBpbnQgbnVtX3RleHR1cmVfYml0cykKK3sKKyAgICBPU0NMX1VOVVNFRF9BUkcodmlkZW8pOworICAgIHJhdGVDdHJsLT5udW1NQkhlYWRlckJpdHMgPSBudW1faGVhZGVyX2JpdHM7CisgICAgcmF0ZUN0cmwtPm51bU1CVGV4dHVyZUJpdHMgPSBudW1fdGV4dHVyZV9iaXRzOworICAgIHJhdGVDdHJsLT5OdW1iZXJvZkhlYWRlckJpdHMgKz0gcmF0ZUN0cmwtPm51bU1CSGVhZGVyQml0czsKKyAgICByYXRlQ3RybC0+TnVtYmVyb2ZUZXh0dXJlQml0cyArPSByYXRlQ3RybC0+bnVtTUJUZXh0dXJlQml0czsKK30KKwordm9pZCBSQ1Jlc3RvcmVRUChBVkNNYWNyb2Jsb2NrICpjdXJyTUIsIEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIGN1cnJNQi0+UVB5ID0gdmlkZW8tPlFQeTsgLyogdXNlIHByZXZpb3VzIFFQICovCisgICAgUkNJbml0Q2hyb21hUVAoZW5jdmlkKTsKKworICAgIHJldHVybiA7Cit9CisKKwordm9pZCBSQ0NhbGN1bGF0ZU1BRChBVkNFbmNPYmplY3QgKmVuY3ZpZCwgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCB1aW50OCAqb3JnTCwgaW50IG9yZ1BpdGNoKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIHVpbnQzMiBkbWluX2x4OworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJfaW50cmEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRtaW5fbHggPSAoMHhGRkZGIDw8IDE2KSB8IG9yZ1BpdGNoOworICAgICAgICAgICAgICAgIHJhdGVDdHJsLT5NQURvZk1CW3ZpZGVvLT5tYk51bV0gPSBBVkNTQURfTWFjcm9ibG9ja19DKG9yZ0wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3ZpZC0+cHJlZF9pMTZbY3Vyck1CLT5pMTZNb2RlXSwgZG1pbl9seCwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8qIGk0ICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmF0ZUN0cmwtPk1BRG9mTUJbdmlkZW8tPm1iTnVtXSA9IGVuY3ZpZC0+aTRfc2FkIC8gMjU2LjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBmb3IgSU5URVIsIHdlIGhhdmUgYWxyZWFkeSBzYXZlZCBpdCB3aXRoIHRoZSBNViBzZWFyY2ggKi8KKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCisKKworQVZDRW5jX1N0YXR1cyBSQ1VwZGF0ZUZyYW1lKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwgPSBlbmN2aWQtPnJhdGVDdHJsOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworICAgIGludCBkaWZmX0JUQ291bnRlcjsKKyAgICBpbnQgbmFsX3R5cGUgPSB2aWRlby0+bmFsX3VuaXRfdHlwZTsKKworICAgIC8qIHVwZGF0ZSB0aGUgY29tcGxleGl0eSB3ZWlnaHQgb2YgSSwgUCwgQiBmcmFtZSAqLworCisgICAgaWYgKHJhdGVDdHJsLT5yY0VuYWJsZSA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgcE1QLT5hY3R1YWxfYml0cyA9IHJhdGVDdHJsLT5udW1GcmFtZUJpdHM7CisgICAgICAgIHBNUC0+bWFkID0gKE9zY2xGbG9hdClyYXRlQ3RybC0+dG90YWxTQUQgLyB2aWRlby0+UGljU2l6ZUluTWJzOyAvL0NvbXB1dGVGcmFtZU1BRCh2aWRlbywgcmF0ZUN0cmwpOworCisgICAgICAgIEFWQ1NhdmVSRFNhbXBsZXMocE1QLCAwKTsKKworICAgICAgICBwTVAtPmVuY29kZWRfZnJhbWVzKys7CisKKyAgICAgICAgLyogZm9yIHBNUC0+c2FtcGxlc1BlckZyYW1lICovCisgICAgICAgIHBNUC0+c2FtcGxlc1BlckZyYW1lW3BNUC0+ZnJhbWVQb3NdID0gMDsKKworICAgICAgICBwTVAtPnN1bV9RUCArPSBwTVAtPlFQOworCisgICAgICAgIC8qIHVwZGF0ZSBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLworICAgICAgICAvKiByZS1hbGxvY2F0ZSB0aGUgdGFyZ2V0IGJpdCBhZ2FpbiBhbmQgdGhlbiBzdG9wIGVuY29kaW5nICovCisgICAgICAgIGRpZmZfQlRDb3VudGVyID0gKGludCkoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPlRNTl9USCAtIHJhdGVDdHJsLT5UTU5fVyAtIHBNUC0+YWN0dWFsX2JpdHMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocE1QLT5iaXRyYXRlIC8gKHBNUC0+ZnJhbWVyYXRlICsgMC4wMDAxKSArIDAuMDAwMSkgLyAwLjEpOworICAgICAgICBpZiAoZGlmZl9CVENvdW50ZXIgPj0gMCkKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyArPSBkaWZmX0JUQ291bnRlcjsgLyogcE1QLT5hY3R1YWxfYml0cyBpcyBzbWFsbGVyICovCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBNUC0+Y291bnRlcl9CVGRzdCAtPSBkaWZmX0JUQ291bnRlcjsgLyogcE1QLT5hY3R1YWxfYml0cyBpcyBiaWdnZXIgKi8KKworICAgICAgICByYXRlQ3RybC0+VE1OX1RIIC09IChpbnQpKChPc2NsRmxvYXQpcE1QLT5iaXRyYXRlIC8gKHBNUC0+ZnJhbWVyYXRlICsgMC4wMDAxKSAqIChkaWZmX0JUQ291bnRlciAqIDAuMSkpOworICAgICAgICByYXRlQ3RybC0+VCA9IHBNUC0+dGFyZ2V0X2JpdHMgPSByYXRlQ3RybC0+VE1OX1RIIC0gcmF0ZUN0cmwtPlRNTl9XOworICAgICAgICBwTVAtPmRpZmZfY291bnRlciAtPSBkaWZmX0JUQ291bnRlcjsKKworICAgICAgICByYXRlQ3RybC0+UmMgPSByYXRlQ3RybC0+bnVtRnJhbWVCaXRzOyAgLyogVG90YWwgQml0cyBmb3IgY3VycmVudCBmcmFtZSAqLworICAgICAgICByYXRlQ3RybC0+SGMgPSByYXRlQ3RybC0+TnVtYmVyb2ZIZWFkZXJCaXRzOyAgICAvKiBUb3RhbCBCaXRzIGluIEhlYWRlciBhbmQgTW90aW9uIFZlY3RvciAqLworCisgICAgICAgIC8qIEJYX1JDICovCisgICAgICAgIHVwZGF0ZVJhdGVDb250cm9sKHJhdGVDdHJsLCBuYWxfdHlwZSk7CisgICAgICAgIGlmIChyYXRlQ3RybC0+c2tpcF9uZXh0X2ZyYW1lID09IC0xKSAvLyBza2lwIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1NLSVBQRURfUElDVFVSRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJhdGVDdHJsLT5maXJzdF9mcmFtZSA9IDA7ICAvLyByZXNldCBoZXJlIGFmdGVyIHdlIGVuY29kZSB0aGUgZmlyc3QgZnJhbWUuCisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEFWQ1NhdmVSRFNhbXBsZXMoTXVsdGlQYXNzICpwTVAsIGludCBjb3VudGVyX3NhbXBsZXMpCit7CisgICAgLyogZm9yIHBNUC0+cFJEU2FtcGxlcyAqLworICAgIHBNUC0+cFJEU2FtcGxlc1twTVAtPmZyYW1lUG9zXVtjb3VudGVyX3NhbXBsZXNdLlFQICAgID0gcE1QLT5RUDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5hY3R1YWxfYml0cyA9IHBNUC0+YWN0dWFsX2JpdHM7CisgICAgcE1QLT5wUkRTYW1wbGVzW3BNUC0+ZnJhbWVQb3NdW2NvdW50ZXJfc2FtcGxlc10ubWFkICAgPSBwTVAtPm1hZDsKKyAgICBwTVAtPnBSRFNhbXBsZXNbcE1QLT5mcmFtZVBvc11bY291bnRlcl9zYW1wbGVzXS5SX0QgPSAoT3NjbEZsb2F0KXBNUC0+YWN0dWFsX2JpdHMgLyAocE1QLT5tYWQgKyAwLjAwMDEpOworCisgICAgcmV0dXJuIDsKK30KKwordm9pZCB1cGRhdGVSYXRlQ29udHJvbChBVkNSYXRlQ29udHJvbCAqcmF0ZUN0cmwsIGludCBuYWxfdHlwZSkKK3sKKyAgICBpbnQgIGZyYW1lX2JpdHM7CisgICAgTXVsdGlQYXNzICpwTVAgPSByYXRlQ3RybC0+cE1QOworCisgICAgLyogQlggcmF0ZSBjb250cm9cbCAqLworICAgIGZyYW1lX2JpdHMgPSAoaW50KShyYXRlQ3RybC0+Yml0UmF0ZSAvIHJhdGVDdHJsLT5mcmFtZV9yYXRlKTsKKyAgICByYXRlQ3RybC0+VE1OX1cgKz0gKHJhdGVDdHJsLT5SYyAtIHJhdGVDdHJsLT5UTU5fVEgpOworICAgIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgKz0gKHJhdGVDdHJsLT5SYyAtIGZyYW1lX2JpdHMpOyAvL3JhdGVDdHJsLT5ScCk7CisgICAgLy9pZihyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIDwgMCkgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyA9IC0xOworCisgICAgcmF0ZUN0cmwtPmVuY29kZWRfZnJhbWVzKys7CisKKyAgICAvKiBmcmFtZSBkcm9wcGluZyAqLworICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAwOworCisgICAgaWYgKChyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID4gcmF0ZUN0cmwtPkJzIC8gMikgJiYgbmFsX3R5cGUgIT0gQVZDX05BTFRZUEVfSURSKSAvKiBza2lwIHRoZSBjdXJyZW50IGZyYW1lICovIC8qIHJhdGVDdHJsLT5CcyAqLworICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlRNTl9XIC09IChyYXRlQ3RybC0+UmMgLSByYXRlQ3RybC0+VE1OX1RIKTsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSByYXRlQ3RybC0+UmM7CisgICAgICAgIHJhdGVDdHJsLT5za2lwX25leHRfZnJhbWUgPSAtMTsKKyAgICB9CisgICAgZWxzZSBpZiAoKE9zY2xGbG9hdCkocmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSA+IChyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPlZCVl9mdWxsbmVzc19vZmZzZXQpKjAuOTUpIC8qIHNraXAgbmV4dCBmcmFtZSAqLworICAgIHsKKyAgICAgICAgcmF0ZUN0cmwtPlZCVl9mdWxsbmVzcyAtPSBmcmFtZV9iaXRzOyAvL3JhdGVDdHJsLT5ScDsKKyAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSA9IDE7CisgICAgICAgIHBNUC0+Y291bnRlcl9CVHNyYyAtPSAoaW50KSgoT3NjbEZsb2F0KShyYXRlQ3RybC0+QnMgLyAyIC0gcmF0ZUN0cmwtPmxvd19ib3VuZCkgLyAyLjAgLyAocE1QLT50YXJnZXRfYml0c19wZXJfZnJhbWUgLyAxMCkpOworICAgICAgICAvKiBCWF8xLCBza2lwIG1vcmUgdGhhbiAxIGZyYW1lcyAgKi8KKyAgICAgICAgLy93aGlsZShyYXRlQ3RybC0+VkJWX2Z1bGxuZXNzID4gcmF0ZUN0cmwtPkJzKjAuNDc1KQorICAgICAgICB3aGlsZSAoKHJhdGVDdHJsLT5WQlZfZnVsbG5lc3MgLSByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzX29mZnNldCkgPiAocmF0ZUN0cmwtPkJzIC8gMiAtIHJhdGVDdHJsLT5WQlZfZnVsbG5lc3Nfb2Zmc2V0KSowLjk1KQorICAgICAgICB7CisgICAgICAgICAgICByYXRlQ3RybC0+VkJWX2Z1bGxuZXNzIC09IGZyYW1lX2JpdHM7IC8vcmF0ZUN0cmwtPlJwOworICAgICAgICAgICAgcmF0ZUN0cmwtPnNraXBfbmV4dF9mcmFtZSsrOworICAgICAgICAgICAgcE1QLT5jb3VudGVyX0JUc3JjIC09IChpbnQpKChPc2NsRmxvYXQpKHJhdGVDdHJsLT5CcyAvIDIgLSByYXRlQ3RybC0+bG93X2JvdW5kKSAvIDIuMCAvIChwTVAtPnRhcmdldF9iaXRzX3Blcl9mcmFtZSAvIDEwKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBFTkQgQlhfMSAqLworICAgIH0KK30KKworCitkb3VibGUgQ29tcHV0ZUZyYW1lTUFEKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCkKK3sKKyAgICBkb3VibGUgVG90YWxNQUQ7CisgICAgaW50IGk7CisgICAgVG90YWxNQUQgPSAwLjA7CisgICAgZm9yIChpID0gMDsgaSA8IChpbnQpdmlkZW8tPlBpY1NpemVJbk1iczsgaSsrKQorICAgICAgICBUb3RhbE1BRCArPSByYXRlQ3RybC0+TUFEb2ZNQltpXTsKKyAgICBUb3RhbE1BRCAvPSB2aWRlby0+UGljU2l6ZUluTWJzOworICAgIHJldHVybiBUb3RhbE1BRDsKK30KKworCisKKworCisvKiBjb252ZXJ0IGZyb20gUVAgdG8gUXN0ZXAgKi8KK2RvdWJsZSBRUDJRc3RlcChpbnQgUVApCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIFFzdGVwOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgUVAyUVNURVBbNl0gPSB7IDAuNjI1LCAwLjY4NzUsIDAuODEyNSwgMC44NzUsIDEuMCwgMS4xMjUgfTsKKworICAgIFFzdGVwID0gUVAyUVNURVBbUVAgJSA2XTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKFFQIC8gNik7IGkrKykKKyAgICAgICAgUXN0ZXAgKj0gMjsKKworICAgIHJldHVybiBRc3RlcDsKK30KKworLyogY29udmVydCBmcm9tIHN0ZXAgc2l6ZSB0byBRUCAqLworaW50IFFzdGVwMlFQKGRvdWJsZSBRc3RlcCkKK3sKKyAgICBpbnQgcV9wZXIgPSAwLCBxX3JlbSA9IDA7CisKKyAgICAvLyAgYXNzZXJ0KCBRc3RlcCA+PSBRUDJRc3RlcCgwKSAmJiBRc3RlcCA8PSBRUDJRc3RlcCg1MSkgKTsKKyAgICBpZiAoUXN0ZXAgPCBRUDJRc3RlcCgwKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZSBpZiAoUXN0ZXAgPiBRUDJRc3RlcCg1MSkpCisgICAgICAgIHJldHVybiA1MTsKKworICAgIHdoaWxlIChRc3RlcCA+IFFQMlFzdGVwKDUpKQorICAgIHsKKyAgICAgICAgUXN0ZXAgLz0gMjsKKyAgICAgICAgcV9wZXIgKz0gMTsKKyAgICB9CisKKyAgICBpZiAoUXN0ZXAgPD0gKDAuNjI1ICsgMC42ODc1KSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuNjI1OworICAgICAgICBxX3JlbSA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgwLjY4NzUgKyAwLjgxMjUpIC8gMikKKyAgICB7CisgICAgICAgIFFzdGVwID0gMC42ODc1OworICAgICAgICBxX3JlbSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgwLjgxMjUgKyAwLjg3NSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAwLjgxMjU7CisgICAgICAgIHFfcmVtID0gMjsKKyAgICB9CisgICAgZWxzZSBpZiAoUXN0ZXAgPD0gKDAuODc1ICsgMS4wKSAvIDIpCisgICAgeworICAgICAgICBRc3RlcCA9IDAuODc1OworICAgICAgICBxX3JlbSA9IDM7CisgICAgfQorICAgIGVsc2UgaWYgKFFzdGVwIDw9ICgxLjAgKyAxLjEyNSkgLyAyKQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAxLjA7CisgICAgICAgIHFfcmVtID0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUXN0ZXAgPSAxLjEyNTsKKyAgICAgICAgcV9yZW0gPSA1OworICAgIH0KKworICAgIHJldHVybiAocV9wZXIgKiA2ICsgcV9yZW0pOworfQorCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3Jlc2lkdWFsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yZXNpZHVhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlYjkxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9yZXNpZHVhbC5jcHAKQEAgLTAsMCArMSwzODkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaW5jbHVkZSAiYXZjZW5jX2xpYi5oIgorCitBVkNFbmNfU3RhdHVzIEVuY29kZUludHJhUENNKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0ZyYW1lSU8gICpjdXJySW5wdXQgPSBlbmN2aWQtPmN1cnJJbnB1dDsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIGludCB4X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl94IDw8IDQpOworICAgIGludCB5X3Bvc2l0aW9uID0gKHZpZGVvLT5tYl95IDw8IDQpOworICAgIGludCBvcmdQaXRjaCA9IGN1cnJJbnB1dC0+cGl0Y2g7CisgICAgaW50IG9mZnNldDEgPSB5X3Bvc2l0aW9uICogb3JnUGl0Y2ggKyB4X3Bvc2l0aW9uOworICAgIGludCBpLCBqOworICAgIGludCBvZmZzZXQ7CisgICAgdWludDggKnBEc3QsICpwU3JjOworICAgIHVpbnQgY29kZTsKKworICAgIHVlX3Yoc3RyZWFtLCAyNSk7CisKKyAgICBpID0gc3RyZWFtLT5iaXRfbGVmdCAmIDB4NzsKKyAgICBpZiAoaSkgLyogbm90IGJ5dGUtYWxpZ25lZCAqLworICAgIHsKKyAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMCwgaSk7CisgICAgfQorCisgICAgcFNyYyA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQxOworICAgIHBEc3QgPSB2aWRlby0+Y3VyclBpYy0+U2wgKyBvZmZzZXQxOworICAgIG9mZnNldCA9IHZpZGVvLT5QaWNXaWR0aEluU2FtcGxlc0wgLSAxNjsKKworICAgIC8qIGF0IHRoaXMgcG9pbnQgYml0c3RyZWFtIGlzIGJ5dGUtYWxpZ25lZCAqLworICAgIGogPSAxNjsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworI2lmIChXT1JEX1NJWkU9PTMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgY29kZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCBjb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBEc3QgKz0gb2Zmc2V0OworICAgICAgICBwU3JjICs9IG9mZnNldDsKKyAgICAgICAgai0tOworICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICBwRHN0ID0gdmlkZW8tPmN1cnJQaWMtPlNjYiArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworICAgIHBTcmMgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisgICAgb2Zmc2V0ID4+PSAxOworCisgICAgaiA9IDg7CisgICAgd2hpbGUgKGogPiAwKQorICAgIHsKKyNpZiAoV09SRF9TSVpFPT0zMikKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29kZSA9ICooKHVpbnQqKXBTcmMpOworICAgICAgICAgICAgcFNyYyArPSA0OworICAgICAgICAgICAgKigodWludCopcERzdCkgPSBjb2RlOworICAgICAgICAgICAgcERzdCArPSA0OworICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMzIsIGNvZGUpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDI7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDI7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNiwgY29kZSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBwRHN0ICs9IG9mZnNldDsKKyAgICAgICAgcFNyYyArPSBvZmZzZXQ7CisgICAgICAgIGotLTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKSAgLyogY2hlY2sgb25seSBvbmNlIHBlciBsaW5lICovCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICBwRHN0ID0gdmlkZW8tPmN1cnJQaWMtPlNjciArICgob2Zmc2V0MSArIHhfcG9zaXRpb24pID4+IDIpOworICAgIHBTcmMgPSBjdXJySW5wdXQtPllDYkNyWzJdICsgKChvZmZzZXQxICsgeF9wb3NpdGlvbikgPj4gMik7CisKKyAgICBqID0gODsKKyAgICB3aGlsZSAoaiA+IDApCisgICAgeworI2lmIChXT1JEX1NJWkU9PTMyKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKigodWludCopcFNyYyk7CisgICAgICAgICAgICBwU3JjICs9IDQ7CisgICAgICAgICAgICAqKCh1aW50KilwRHN0KSA9IGNvZGU7CisgICAgICAgICAgICBwRHN0ICs9IDQ7CisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAzMiwgY29kZSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAqKCh1aW50KilwU3JjKTsKKyAgICAgICAgICAgIHBTcmMgKz0gMjsKKyAgICAgICAgICAgICooKHVpbnQqKXBEc3QpID0gY29kZTsKKyAgICAgICAgICAgIHBEc3QgKz0gMjsKKyAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDE2LCBjb2RlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHBEc3QgKz0gb2Zmc2V0OworICAgICAgICBwU3JjICs9IG9mZnNldDsKKyAgICAgICAgai0tOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworQVZDRW5jX1N0YXR1cyBlbmNfcmVzaWR1YWxfYmxvY2soQVZDRW5jT2JqZWN0ICplbmN2aWQsIEFWQ1Jlc2lkdWFsVHlwZSB0eXBlLCBpbnQgY2luZHgsIEFWQ01hY3JvYmxvY2sgKmN1cnJNQikKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIEFWQ0NvbW1vbk9iaiAqdmlkZW8gPSBlbmN2aWQtPmNvbW1vbjsKKyAgICBpbnQgaSwgbWF4TnVtQ29lZmYsIG5DOworICAgIGludCBjZGMgPSAwLCBjYWMgPSAwOworICAgIGludCBUcmFpbGluZ09uZXM7CisgICAgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0gPSBlbmN2aWQtPmJpdHN0cmVhbTsKKyAgICB1aW50IHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnOworICAgIGludCB6ZXJvc0xlZnQ7CisgICAgaW50ICpsZXZlbCwgKnJ1bjsKKyAgICBpbnQgVG90YWxDb2VmZjsKKyAgICBjb25zdCBzdGF0aWMgaW50IGluY1ZsY1tdID0gezAsIDMsIDYsIDEyLCAyNCwgNDgsIDMyNzY4fTsgIC8vIG1heGltdW0gdmxjID0gNgorICAgIGludCBlc2NhcGUsIG51bVByZWZpeCwgc3VmbWFzaywgc3VmZml4LCBzaGlmdCwgc2lnbiwgdmFsdWUsIGFic3ZhbHVlLCB2bGNudW0sIGxldmVsX3R3b19vcl9oaWdoZXI7CisgICAgaW50IGJpbmR4ID0gYmxrSWR4MmJsa1hZW2NpbmR4Pj4yXVtjaW5keCYzXSA7IC8vIHJhc3RlciBzY2FuIGluZGV4CisKKyAgICBzd2l0Y2ggKHR5cGUpCisgICAgeworICAgICAgICBjYXNlIEFWQ19MdW1hOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNjsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtjaW5keF07CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bltjaW5keF07CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY3Vyck1CLT5uel9jb2VmZltiaW5keF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfSW50cmExNkRDOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNjsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGRjOworICAgICAgICAgICAgcnVuID0gZW5jdmlkLT5ydW5kYzsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjaW5keDsgLyogc3BlY2lhbCBjYXNlICovCisgICAgICAgICAgICBiaW5keCA9IDA7CisgICAgICAgICAgICBjaW5keCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfSW50cmExNkFDOgorICAgICAgICAgICAgbWF4TnVtQ29lZmYgPSAxNTsKKyAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbFtjaW5keF07CisgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bltjaW5keF07CisgICAgICAgICAgICBUb3RhbENvZWZmID0gY3Vyck1CLT5uel9jb2VmZltiaW5keF07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNfQ2hyb21hREM6ICAvKiBob3cgdG8gZGlmZmVyZW50aWF0ZSBDYiBmcm9tIENyICovCisgICAgICAgICAgICBtYXhOdW1Db2VmZiA9IDQ7CisgICAgICAgICAgICBjZGMgPSAxOworICAgICAgICAgICAgaWYgKGNpbmR4ID49IDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsY2RjICsgNDsKKyAgICAgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYyArIDQ7CisgICAgICAgICAgICAgICAgVG90YWxDb2VmZiA9IGNpbmR4IC0gODsgIC8qIHNwZWNpYWwgY2FzZSAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxldmVsID0gZW5jdmlkLT5sZXZlbGNkYzsKKyAgICAgICAgICAgICAgICBydW4gPSBlbmN2aWQtPnJ1bmNkYzsKKyAgICAgICAgICAgICAgICBUb3RhbENvZWZmID0gY2luZHg7ICAvKiBzcGVjaWFsIGNhc2UgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ19DaHJvbWFBQzoKKyAgICAgICAgICAgIG1heE51bUNvZWZmID0gMTU7CisgICAgICAgICAgICBjYWMgPSAxOworICAgICAgICAgICAgbGV2ZWwgPSBlbmN2aWQtPmxldmVsW2NpbmR4XTsKKyAgICAgICAgICAgIHJ1biA9IGVuY3ZpZC0+cnVuW2NpbmR4XTsKKyAgICAgICAgICAgIGNpbmR4IC09IDE2OworICAgICAgICAgICAgYmluZHggPSAxNiArIGJsa0lkeDJibGtYWVtjaW5keD4+Ml1bY2luZHgmM107CisgICAgICAgICAgICBjaW5keCArPSAxNjsKKyAgICAgICAgICAgIFRvdGFsQ29lZmYgPSBjdXJyTUItPm56X2NvZWZmW2JpbmR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWQ0VOQ19GQUlMOworICAgIH0KKworCisgICAgLyogZmluZCBUcmFpbGluZ09uZXMgKi8KKyAgICBUcmFpbGluZ09uZXMgPSAwOworICAgIHplcm9zTGVmdCA9IDA7CisgICAgaSA9IFRvdGFsQ29lZmYgLSAxOworICAgIG5DID0gMTsKKyAgICB3aGlsZSAoaSA+PSAwKQorICAgIHsKKyAgICAgICAgemVyb3NMZWZ0ICs9IHJ1bltpXTsKKyAgICAgICAgaWYgKG5DICYmIChsZXZlbFtpXSA9PSAxIHx8IGxldmVsW2ldID09IC0xKSkKKyAgICAgICAgeworICAgICAgICAgICAgVHJhaWxpbmdPbmVzKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBuQyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaS0tOworICAgIH0KKyAgICBpZiAoVHJhaWxpbmdPbmVzID4gMykKKyAgICB7CisgICAgICAgIFRyYWlsaW5nT25lcyA9IDM7IC8qIGNsaXAgaXQgKi8KKyAgICB9CisKKyAgICBpZiAoIWNkYykKKyAgICB7CisgICAgICAgIGlmICghY2FjKSAgLyogbm90IGNocm9tYSAqLworICAgICAgICB7CisgICAgICAgICAgICBuQyA9IHByZWRpY3Rfbm56KHZpZGVvLCBiaW5keCAmIDMsIGJpbmR4ID4+IDIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogY2hyb21hIGFjIGJ1dCBub3QgY2hyb21hIGRjICovCisgICAgICAgIHsKKyAgICAgICAgICAgIG5DID0gcHJlZGljdF9ubnpfY2hyb21hKHZpZGVvLCBiaW5keCAmIDMsIGJpbmR4ID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lcyhzdHJlYW0sIFRyYWlsaW5nT25lcywgVG90YWxDb2VmZiwgbkMpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuQyA9IC0xOyAvKiBDaHJvbWEgREMgbGV2ZWwgKi8KKyAgICAgICAgc3RhdHVzID0gY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKHN0cmVhbSwgVHJhaWxpbmdPbmVzLCBUb3RhbENvZWZmKTsKKyAgICB9CisKKyAgICAvKiBUaGlzIHBhcnQgaXMgZG9uZSBxdWl0ZSBkaWZmZXJlbnRseSBpbiBSZWFkQ29lZjR4NF9DQVZMQygpICovCisgICAgaWYgKFRvdGFsQ29lZmYgPiAwKQorICAgIHsKKworICAgICAgICBpID0gVG90YWxDb2VmZiAtIDE7CisKKyAgICAgICAgaWYgKFRyYWlsaW5nT25lcykgLyoga2VlcCByZWFkaW5nIHRoZSBzaWduIG9mIHRob3NlIHRyYWlsaW5nIG9uZXMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgbkMgPSBUcmFpbGluZ09uZXM7CisgICAgICAgICAgICB0cmFpbGluZ19vbmVzX3NpZ25fZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSAobkMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcgPDw9IDE7CisgICAgICAgICAgICAgICAgdHJhaWxpbmdfb25lc19zaWduX2ZsYWcgfD0gKCh1aW50MzIpbGV2ZWxbaS0tXSA+PiAzMSk7IC8qIDAgb3IgcG9zaXRpdmUsIDEgZm9yIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgbkMtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaW5zdGVhZCBvZiB3cml0aW5nIG9uZSBiaXQgYXQgYSB0aW1lLCByZWFkIHRoZSB3aG9sZSB0aGluZyBhdCBvbmNlICovCisgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBUcmFpbGluZ09uZXMsIHRyYWlsaW5nX29uZXNfc2lnbl9mbGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAxOworICAgICAgICBpZiAoVG90YWxDb2VmZiA+IDMgJiYgVHJhaWxpbmdPbmVzID09IDMpCisgICAgICAgIHsKKyAgICAgICAgICAgIGxldmVsX3R3b19vcl9oaWdoZXIgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFRvdGFsQ29lZmYgPiAxMCAmJiBUcmFpbGluZ09uZXMgPCAzKQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHRoZW4gZG8gdGhpcyBUb3RhbENvZWZmLVRyYWlsaW5nT25lcyB0aW1lcyAqLworICAgICAgICBmb3IgKGkgPSBUb3RhbENvZWZmIC0gVHJhaWxpbmdPbmVzIC0gMTsgaSA+PSAwOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVlID0gbGV2ZWxbaV07CisgICAgICAgICAgICBhYnN2YWx1ZSA9ICh2YWx1ZSA+PSAwKSA/IHZhbHVlIDogLXZhbHVlOworCisgICAgICAgICAgICBpZiAobGV2ZWxfdHdvX29yX2hpZ2hlcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPiAwKSB2YWx1ZS0tOworICAgICAgICAgICAgICAgIGVsc2UgICAgdmFsdWUrKzsKKyAgICAgICAgICAgICAgICBsZXZlbF90d29fb3JfaGlnaGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHZhbHVlID49IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2lnbiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAtdmFsdWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh2bGNudW0gPT0gMCkgLy8gVkxDMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCB2YWx1ZSAqIDIgKyBzaWduIC0gMSwgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIDwgOCArIDgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNCArIDEgKyA0LCAoMSA8PCA0KSB8ICgodmFsdWUgLSA4KSA8PCAxKSB8IHNpZ24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCAxNCArIDIgKyAxMiwgKDEgPDwgMTIpIHwgKCh2YWx1ZSAtIDE2KSA8PCAxKSB8IHNpZ24pIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlICAvLyBWTENOCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2hpZnQgPSB2bGNudW0gLSAxOworICAgICAgICAgICAgICAgIGVzY2FwZSA9ICgxNSA8PCBzaGlmdCkgKyAxOworICAgICAgICAgICAgICAgIG51bVByZWZpeCA9ICh2YWx1ZSAtIDEpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIHN1Zm1hc2sgPSB+KCgweGZmZmZmZmZmKSA8PCBzaGlmdCk7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gKHZhbHVlIC0gMSkgJiBzdWZtYXNrOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IGVzY2FwZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIG51bVByZWZpeCArIHZsY251bSArIDEsICgxIDw8IChzaGlmdCArIDEpKSB8IChzdWZmaXggPDwgMSkgfCBzaWduKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMjgsICgxIDw8IDEyKSB8ICgodmFsdWUgLSBlc2NhcGUpIDw8IDEpIHwgc2lnbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhYnN2YWx1ZSA+IGluY1ZsY1t2bGNudW1dKQorICAgICAgICAgICAgICAgIHZsY251bSsrOworCisgICAgICAgICAgICBpZiAoaSA9PSBUb3RhbENvZWZmIC0gVHJhaWxpbmdPbmVzIC0gMSAmJiBhYnN2YWx1ZSA+IDMpCisgICAgICAgICAgICAgICAgdmxjbnVtID0gMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpICAvKiBvY2Nhc2lvbmFsbHkgY2hlY2sgdGhlIGJpdHN0cmVhbSAqLworICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIGlmIChUb3RhbENvZWZmIDwgbWF4TnVtQ29lZmYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghY2RjKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlX1RvdGFsWmVyb3Moc3RyZWFtLCB6ZXJvc0xlZnQsIFRvdGFsQ29lZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNlX1RvdGFsWmVyb3NDaHJvbWFEQyhzdHJlYW0sIHplcm9zTGVmdCwgVG90YWxDb2VmZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB6ZXJvc0xlZnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaSA9IFRvdGFsQ29lZmYgLSAxOworICAgICAgICB3aGlsZSAoaSA+IDApIC8qIGRvbid0IGRvIHRoZSBsYXN0IG9uZSAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiAoemVyb3NMZWZ0ID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjZV9SdW5CZWZvcmUoc3RyZWFtLCBydW5baV0sIHplcm9zTGVmdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHplcm9zTGVmdCA9IHplcm9zTGVmdCAtIHJ1bltpXTsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlN2FjZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkLmNwcApAQCAtMCwwICsxLDI5MCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FkX2lubGluZS5oIgorCisjZGVmaW5lIENhY2hlZF9seCAxNzYKKworI2lmZGVmIF9TQURfU1RBVAordWludDMyIG51bV9zYWRfTUIgPSAwOwordWludDMyIG51bV9zYWRfQmxrID0gMDsKK3VpbnQzMiBudW1fc2FkX01CX2NhbGwgPSAwOwordWludDMyIG51bV9zYWRfQmxrX2NhbGwgPSAwOworCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpICAgICAgIG51bV9zYWRfTUJfY2FsbCsrCisjZGVmaW5lIE5VTV9TQURfTUIoKSAgICAgICAgICAgIG51bV9zYWRfTUIrKworI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkgICAgICBudW1fc2FkX0Jsa19jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKSAgICAgICAgICAgbnVtX3NhZF9CbGsrKworCisjZWxzZQorCisjZGVmaW5lIE5VTV9TQURfTUJfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfTUIoKQorI2RlZmluZSBOVU1fU0FEX0JMS19DQUxMKCkKKyNkZWZpbmUgTlVNX1NBRF9CTEsoKQorCisjZW5kaWYKKworCisvKiBjb25zaXN0IG9mCitpbnQgQVZDU0FEX01hY3JvYmxvY2tfQyh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IGx4LHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hURk0odWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCBseCx2b2lkICpleHRyYV9pbmZvKQorKi8KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIFNBRF9NYWNyb2Jsb2NrCisgICAgRGF0ZTogICAgICAgMDkvMDcvMjAwMAorICAgIFB1cnBvc2U6ICAgIENvbXB1dGUgU0FEIDE2eDE2IGJldHdlZW4gYmxrIGFuZCByZWYuCisgICAgVG8gZG86ICAgICAgVW5pZm9ybSBzdWJzYW1wbGluZyB3aWxsIGJlIGluc2VydGVkIGxhdGVyIQorICAgICAgICAgICAgICAgIEh5cG90aGVzaXMgVGVzdGluZyBGYXN0IE1hdGNoaW5nIHRvIGJlIHVzZWQgbGF0ZXIhCisgICAgQ2hhbmdlczoKKyAgICAxMS83LzAwOiAgICBpbXBsZW1lbnRlZCBNTVgKKyAgICAxLzI0LzAxOiAgICBpbXBsZW1lbnRlZCBTU0UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioqKioqKioqKiBDICoqKioqKioqKioqKi8KK2ludCBBVkNTQURfTWFjcm9ibG9ja19DKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX2x4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludDMyIHgxMDsKKyAgICBpbnQgZG1pbiA9ICh1aW50MzIpZG1pbl9seCA+PiAxNjsKKyAgICBpbnQgbHggPSBkbWluX2x4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICB4MTAgPSBzaW1kX3NhZF9tYihyZWYsIGJsaywgZG1pbiwgbHgpOworCisgICAgcmV0dXJuIHgxMDsKK30KKworI2lmZGVmIEhURk0gICAvKiBIVEZNIHdpdGggdW5pZm9ybSBzdWJzYW1wbGluZyBpbXBsZW1lbnRhdGlvbiAyLzI4LzAxICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ0FWQ1NBRF9NQl9IVEZNX0NvbGxlY3QgYW5kIEFWQ1NBRF9NQl9IVEZNCisgICAgRGF0ZTogICAgICAgMy8yLzEKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gYSAxNngxNiBibG9jayB1c2luZworICAgICAgICAgICAgICAgIHVuaWZvcm0gc3Vic2FtcGxpbmcgYW5kIGh5cG90aGVzaXMgdGVzdGluZyBmYXN0IG1hdGNoaW5nCisgICAgICAgICAgICAgICAgZm9yIGVhcmx5IGRyb3BvdXQuIFNBRF9NQl9IUF9IVEZNX0NvbGxlY3QgaXMgdG8gY29sbGVjdAorICAgICAgICAgICAgICAgIHRoZSBzdGF0aXN0aWNzIHRvIGNvbXB1dGUgdGhlIHRocmVzaG9sZHMgdG8gYmUgdXNlZCBpbgorICAgICAgICAgICAgICAgIFNBRF9NQl9IUF9IVEZNLgorICAgIElucHV0L091dHB1dDoKKyAgICBDaGFuZ2VzOgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQgQVZDQVZDU0FEX01CX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9seCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqcDE7CisgICAgaW50IGx4NCA9IChkbWluX2x4IDw8IDIpICYgMHgzRkZGQzsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisgICAgaW50IHNhZGRhdGFbMTZdLCB0bXAsIHRtcDI7ICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICB1aW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX2x4ID4+IDIwOworCisgICAgTlVNX1NBRF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgTlVNX1NBRF9NQigpOworCisgICAgICAgIHNhZGRhdGFbaV0gPSBzYWQ7CisKKyAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKHVpbnQzMilzYWQgPiAoKHVpbnQzMilkbWluX2x4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRpZm1hZCA9IHNhZGRhdGFbMF0gLSAoKHNhZGRhdGFbMV0gKyAxKSA+PiAxKTsKKyAgICAoKmFic19kaWZfbWFkX2F2ZykgKz0gKChkaWZtYWQgPiAwKSA/IGRpZm1hZCA6IC1kaWZtYWQpOworICAgICgqY291bnRicmVhaykrKzsKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hURk0odWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fbHgsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxOworCisgICAgaW50IGk7CisgICAgaW50IHRtcCwgdG1wMjsKKyAgICBpbnQgbHg0ID0gKGRtaW5fbHggPDwgMikgJiAweDNGRkZDOworICAgIGludCBzYWRzdGFyID0gMCwgbWFkc3RhcjsKKyAgICBpbnQgKm5ybWx6X3RoID0gKGludCopIGV4dHJhX2luZm87CisgICAgaW50ICpvZmZzZXRSZWYgPSAoaW50KikgZXh0cmFfaW5mbyArIDMyOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fbHggPj4gMjA7CisKKyAgICBOVU1fU0FEX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgIHRtcCA9IHAxWzEyXTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICBwMSArPSBseDQ7CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgJiAweEZGKTsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisKKyAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgc2FkID0gU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7CisgICAgICAgIHRtcCA9IHAxWzhdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs0XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVswXTsKKyAgICAgICAgcDEgKz0gbHg0OworICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworCisgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICB0bXAyID0gKGN1cl93b3JkID4+IDI0KSAmIDB4RkY7CisgICAgICAgIHNhZCA9IFNVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOworICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKyAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgIHAxICs9IGx4NDsKKyAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICBzYWQgPSBTVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTsKKworICAgICAgICBOVU1fU0FEX01CKCk7CisKKyAgICAgICAgc2Fkc3RhciArPSBtYWRzdGFyOworICAgICAgICBpZiAoKCh1aW50MzIpc2FkIDw9ICgodWludDMyKWRtaW5fbHggPj4gMTYpKSAmJiAoc2FkIDw9IChzYWRzdGFyIC0gKm5ybWx6X3RoKyspKSkKKyAgICAgICAgICAgIDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisjZW5kaWYgLyogSFRGTSAqLworCisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9oYWxmcGVsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmMjE5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbC5jcHAKQEAgLTAsMCArMSw2MjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKiBjb250YWlucworaW50IEFWQ0hhbGZQZWwxX1NBRF9NQih1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCBpaCxpbnQgamgpCitpbnQgQVZDSGFsZlBlbDJfU0FEX01CKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgpCitpbnQgQVZDSGFsZlBlbDFfU0FEX0Jsayh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCBpaCxpbnQgamgpCitpbnQgQVZDSGFsZlBlbDJfU0FEX0Jsayh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoKQorCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQyh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdCh1aW50OCAqcmVmLHVpbnQ4ICpibGssaW50IGRtaW4saW50IHdpZHRoLGludCByeCxpbnQgeGgsaW50IHloLHZvaWQgKmV4dHJhX2luZm8pCitpbnQgQVZDU0FEX01CX0hQX0hURk0odWludDggKnJlZix1aW50OCAqYmxrLGludCBkbWluLGludCB3aWR0aCxpbnQgcngsaW50IHhoLGludCB5aCx2b2lkICpleHRyYV9pbmZvKQoraW50IEFWQ1NBRF9CbGtfSGFsZlBlbF9DKHVpbnQ4ICpyZWYsdWludDggKmJsayxpbnQgZG1pbixpbnQgd2lkdGgsaW50IHJ4LGludCB4aCxpbnQgeWgsdm9pZCAqZXh0cmFfaW5mbykKKyovCisKKyNpbmNsdWRlICJhdmNlbmNfbGliLmgiCisjaW5jbHVkZSAic2FkX2hhbGZwZWxfaW5saW5lLmgiCisKKyNpZmRlZiBfU0FEX1NUQVQKK3VpbnQzMiBudW1fc2FkX0hQX01CID0gMDsKK3VpbnQzMiBudW1fc2FkX0hQX0JsayA9IDA7Cit1aW50MzIgbnVtX3NhZF9IUF9NQl9jYWxsID0gMDsKK3VpbnQzMiBudW1fc2FkX0hQX0Jsa19jYWxsID0gMDsKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQl9DQUxMKCkgICAgbnVtX3NhZF9IUF9NQl9jYWxsKysKKyNkZWZpbmUgTlVNX1NBRF9IUF9NQigpICAgICAgICAgbnVtX3NhZF9IUF9NQisrCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLX0NBTEwoKSAgIG51bV9zYWRfSFBfQmxrX2NhbGwrKworI2RlZmluZSBOVU1fU0FEX0hQX0JMSygpICAgICAgICBudW1fc2FkX0hQX0JsaysrCisjZWxzZQorI2RlZmluZSBOVU1fU0FEX0hQX01CX0NBTEwoKQorI2RlZmluZSBOVU1fU0FEX0hQX01CKCkKKyNkZWZpbmUgTlVNX1NBRF9IUF9CTEtfQ0FMTCgpCisjZGVmaW5lIE5VTV9TQURfSFBfQkxLKCkKKyNlbmRpZgorCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBGdW5jdGlvbjogICBTQURfTUJfSGFsZlBlbAorICAgIERhdGU6ICAgICAgIDA5LzE3LzIwMDAKKyAgICBQdXJwb3NlOiAgICBDb21wdXRlIHRoZSBTQUQgb24gdGhlIGhhbGYtcGVsIHJlc29sdXRpb24KKyAgICBJbnB1dC9PdXRwdXQ6ICAgaG1lbSBpcyBhc3N1bWVkIHRvIGJlIGEgcG9pbnRlciB0byB0aGUgc3RhcnRpbmcKKyAgICAgICAgICAgICAgICBwb2ludCBvZiB0aGUgc2VhcmNoIGluIHRoZSAzM3gzMyBtYXRyaXggc2VhcmNoIHJlZ2lvbgorICAgIENoYW5nZXM6CisgICAgMTEvNy8wMDogICAgaW1wbGVtZW50ZWQgTU1YCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIEZ1bmN0aW9uOiAgIEFWQ1NBRF9NQl9IYWxmUGVsX0MKKyAgICBEYXRlOiAgICAgICAwNC8zMC8yMDAxCisgICAgUHVycG9zZTogICAgQ29tcHV0ZSBTQUQgMTZ4MTYgYmV0d2VlbiBibGsgYW5kIHJlZiBpbiBoYWxmcGVsCisgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiwKKyAgICBDaGFuZ2VzOgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogT25lIGNvbXBvbmVudCBpcyBoYWxmLXBlbCAqLworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N4aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpraywgKnAxLCAqcDIsICpwMywgKnA0OworLy8gIGludCBzdW1yZWY9MDsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBwMSA9IHJlZjsKKyAgICBwMiA9IHJlZiArIDE7CisgICAgcDMgPSByZWYgKyByeDsKKyAgICBwNCA9IHJlZiArIHJ4ICsgMTsKKyAgICBrayAgPSBibGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHRlbXAgPSAoKHAxW2pdICsgcDJbal0gKyBwM1tqXSArIHA0W2pdICsgMikgPj4gMikgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKworICAgICAgICBwMSArPSByeDsKKyAgICAgICAgcDMgKz0gcng7CisgICAgICAgIHAyICs9IHJ4OworICAgICAgICBwNCArPSByeDsKKyAgICB9CisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IYWxmUGVsX0N5aCh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbl9yeCwgdm9pZCAqZXh0cmFfaW5mbykKK3sKKyAgICAodm9pZCkoZXh0cmFfaW5mbyk7CisKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgc2FkID0gMDsKKyAgICB1aW50OCAqa2ssICpwMSwgKnAyOworLy8gIGludCBzdW1yZWY9MDsKKyAgICBpbnQgdGVtcDsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBwMSA9IHJlZjsKKyAgICBwMiA9IHJlZiArIHJ4OyAvKiBlaXRoZXIgbGVmdC9yaWdodCBvciB0b3AvYm90dG9tIHBpeGVsICovCisgICAga2sgID0gYmxrOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgeworCisgICAgICAgICAgICB0ZW1wID0gKChwMVtqXSArIHAyW2pdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgcDEgKz0gcng7CisgICAgICAgIHAyICs9IHJ4OworICAgIH0KKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hhbGZQZWxfQ3hoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgICh2b2lkKShleHRyYV9pbmZvKTsKKworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpraywgKnAxOworICAgIGludCB0ZW1wOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIHAxID0gcmVmOworICAgIGtrICA9IGJsazsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgdGVtcCA9ICgocDFbal0gKyBwMVtqKzFdICsgMSkgPj4gMSkgLSAqa2srKzsKKyAgICAgICAgICAgIHNhZCArPSBBVkNfQUJTKHRlbXApOworICAgICAgICB9CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIGlmIChzYWQgPiAoaW50KSgodWludDMyKWRtaW5fcnggPj4gMTYpKQorICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgcDEgKz0gcng7CisgICAgfQorICAgIHJldHVybiBzYWQ7Cit9CisKKyNpZmRlZiBIVEZNICAvKiBIVEZNIHdpdGggdW5pZm9ybSBzdWJzYW1wbGluZyBpbXBsZW1lbnRhdGlvbiwgIDIvMjgvMDEgKi8KKworLy9DaGVjaGVjayBoZXJlCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoeWgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDA7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2FkZGF0YVsxNl07ICAgICAgLyogdXNlZCB3aGVuIGNvbGxlY3RpbmcgZmxhZyAoZ2xvYmFsKSBpcyBvbiAqLworICAgIGludCBkaWZtYWQsIHRtcCwgdG1wMjsKKyAgICBpbnQgbWFkc3RhcjsKKyAgICBIVEZNX1N0YXQgKmh0Zm1fc3RhdCA9IChIVEZNX1N0YXQqKSBleHRyYV9pbmZvOworICAgIGludCAqYWJzX2RpZl9tYWRfYXZnID0gJihodGZtX3N0YXQtPmFic19kaWZfbWFkX2F2Zyk7CisgICAgVUludCAqY291bnRicmVhayA9ICYoaHRmbV9zdGF0LT5jb3VudGJyZWFrKTsKKyAgICBpbnQgKm9mZnNldFJlZiA9IGh0Zm1fc3RhdC0+b2Zmc2V0UmVmOworICAgIHVpbnQzMiBjdXJfd29yZDsKKworICAgIG1hZHN0YXIgPSAodWludDMyKWRtaW5fcnggPj4gMjA7CisKKyAgICBOVU1fU0FEX0hQX01CX0NBTEwoKTsKKworICAgIGJsayAtPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIC8qIDE2IHN0YWdlcyAqLworICAgIHsKKyAgICAgICAgcDEgPSByZWYgKyBvZmZzZXRSZWZbaV07CisgICAgICAgIHAyID0gcDEgKyByeDsKKworICAgICAgICBqID0gNDsvKiA0IGxpbmVzICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cl93b3JkID0gKigodWludDMyKikoYmxrICs9IDQpKTsKKyAgICAgICAgICAgIHRtcCA9IHAxWzEyXSArIHAyWzEyXTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxM10gKyBwMlsxM107CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XSArIHAyWzhdOworICAgICAgICAgICAgdG1wMiA9IHAxWzldICsgcDJbOV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHRtcCArPSAyOworICAgICAgICAgICAgc2FkID0gSU5URVJQMl9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs0XSArIHAyWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdICsgcDJbNV07CisgICAgICAgICAgICB0bXAgKz0gdG1wMjsKKyAgICAgICAgICAgIHRtcDIgPSAoY3VyX3dvcmQgPj4gOCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcDIgPSBwMVsxXSArIHAyWzFdOworICAgICAgICAgICAgdG1wID0gcDFbMF0gKyBwMlswXTsKKyAgICAgICAgICAgIHAxICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHAyICs9IHJlZnd4NDsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMSwgKnAyOworICAgIGludCByeCA9IGRtaW5fcnggJiAweEZGRkY7CisgICAgaW50IHJlZnd4NCA9IHJ4IDw8IDI7CisgICAgaW50IHNhZGRhdGFbMTZdOyAgICAgIC8qIHVzZWQgd2hlbiBjb2xsZWN0aW5nIGZsYWcgKGdsb2JhbCkgaXMgb24gKi8KKyAgICBpbnQgZGlmbWFkLCB0bXAsIHRtcDI7CisgICAgaW50IG1hZHN0YXI7CisgICAgSFRGTV9TdGF0ICpodGZtX3N0YXQgPSAoSFRGTV9TdGF0KikgZXh0cmFfaW5mbzsKKyAgICBpbnQgKmFic19kaWZfbWFkX2F2ZyA9ICYoaHRmbV9zdGF0LT5hYnNfZGlmX21hZF9hdmcpOworICAgIFVJbnQgKmNvdW50YnJlYWsgPSAmKGh0Zm1fc3RhdC0+Y291bnRicmVhayk7CisgICAgaW50ICpvZmZzZXRSZWYgPSBodGZtX3N0YXQtPm9mZnNldFJlZjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgIGogPSA0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDJbMTJdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls4XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDJbNF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDQVZDU0FEX01CX0hQX0hURk1fQ29sbGVjdHhoKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwOworICAgIHVpbnQ4ICpwMTsKKyAgICBpbnQgcnggPSBkbWluX3J4ICYgMHhGRkZGOworICAgIGludCByZWZ3eDQgPSByeCA8PCAyOworICAgIGludCBzYWRkYXRhWzE2XTsgICAgICAvKiB1c2VkIHdoZW4gY29sbGVjdGluZyBmbGFnIChnbG9iYWwpIGlzIG9uICovCisgICAgaW50IGRpZm1hZCwgdG1wLCB0bXAyOworICAgIGludCBtYWRzdGFyOworICAgIEhURk1fU3RhdCAqaHRmbV9zdGF0ID0gKEhURk1fU3RhdCopIGV4dHJhX2luZm87CisgICAgaW50ICphYnNfZGlmX21hZF9hdmcgPSAmKGh0Zm1fc3RhdC0+YWJzX2RpZl9tYWRfYXZnKTsKKyAgICBVSW50ICpjb3VudGJyZWFrID0gJihodGZtX3N0YXQtPmNvdW50YnJlYWspOworICAgIGludCAqb2Zmc2V0UmVmID0gaHRmbV9zdGF0LT5vZmZzZXRSZWY7CisgICAgdWludDMyIGN1cl93b3JkOworCisgICAgbWFkc3RhciA9ICh1aW50MzIpZG1pbl9yeCA+PiAyMDsKKworICAgIE5VTV9TQURfSFBfTUJfQ0FMTCgpOworCisgICAgYmxrIC09IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgLyogMTYgc3RhZ2VzICovCisgICAgeworICAgICAgICBwMSA9IHJlZiArIG9mZnNldFJlZltpXTsKKworICAgICAgICBqID0gNDsgLyogNCBsaW5lcyAqLworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDFbMTNdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMVs5XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICB0bXAyID0gcDFbMV07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisKKyAgICAgICAgc2FkZGF0YVtpXSA9IHNhZDsKKworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgICAgICAgICAgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAgICAgICAgICAgICAoKmNvdW50YnJlYWspKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkaWZtYWQgPSBzYWRkYXRhWzBdIC0gKChzYWRkYXRhWzFdICsgMSkgPj4gMSk7CisgICAgKCphYnNfZGlmX21hZF9hdmcpICs9ICgoZGlmbWFkID4gMCkgPyBkaWZtYWQgOiAtZGlmbWFkKTsKKyAgICAoKmNvdW50YnJlYWspKys7CisKKyAgICByZXR1cm4gc2FkOworfQorCitpbnQgQVZDU0FEX01CX0hQX0hURk14aHloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisKKyAgICAgICAgaiA9IDQ7IC8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdICsgcDJbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXSArIHAyWzEzXTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzhdICsgcDJbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV0gKyBwMls5XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiAxNikgJiAweEZGOworICAgICAgICAgICAgdG1wICs9IDI7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAyX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdICsgcDJbNF07CisgICAgICAgICAgICB0bXAyID0gcDFbNV0gKyBwMls1XTsKKyAgICAgICAgICAgIHRtcCArPSB0bXAyOworICAgICAgICAgICAgdG1wMiA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wMiA9IHAxWzFdICsgcDJbMV07CisgICAgICAgICAgICB0bXAgPSBwMVswXSArIHAyWzBdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgcDIgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wICs9IHRtcDI7CisgICAgICAgICAgICB0bXAyID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICB0bXAgKz0gMjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDJfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICB9CisgICAgICAgIHdoaWxlICgtLWopOworCisgICAgICAgIE5VTV9TQURfSFBfTUIoKTsKKworICAgICAgICBzYWRzdGFyICs9IG1hZHN0YXI7CisgICAgICAgIGlmIChzYWQgPiBzYWRzdGFyIC0gbnJtbHpfdGhbaV0gfHwgc2FkID4gKCh1aW50MzIpZG1pbl9yeCA+PiAxNikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiA2NTUzNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzYWQ7Cit9CisKK2ludCBBVkNTQURfTUJfSFBfSFRGTXloKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluX3J4LCB2b2lkICpleHRyYV9pbmZvKQoreworICAgIGludCBpLCBqOworICAgIGludCBzYWQgPSAwLCB0bXAsIHRtcDI7CisgICAgdWludDggKnAxLCAqcDI7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworICAgICAgICBwMiA9IHAxICsgcng7CisgICAgICAgIGogPSA0OworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjdXJfd29yZCA9ICooKHVpbnQzMiopKGJsayArPSA0KSk7CisgICAgICAgICAgICB0bXAgPSBwMVsxMl07CisgICAgICAgICAgICB0bXAyID0gcDJbMTJdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiAyNCkgJiAweEZGOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgICAgICB0bXAgPSBwMVs4XTsKKyAgICAgICAgICAgIHRtcDIgPSBwMls4XTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbNF07CisgICAgICAgICAgICB0bXAyID0gcDJbNF07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDgpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbMF07CisgICAgICAgICAgICBwMSArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXAyID0gcDJbMF07CisgICAgICAgICAgICBwMiArPSByZWZ3eDQ7CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkICYgMHhGRik7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoLS1qKTsKKworICAgICAgICBOVU1fU0FEX0hQX01CKCk7CisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKworaW50IEFWQ1NBRF9NQl9IUF9IVEZNeGgodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGRtaW5fcngsIHZvaWQgKmV4dHJhX2luZm8pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNhZCA9IDAsIHRtcCwgdG1wMjsKKyAgICB1aW50OCAqcDE7CisgICAgaW50IHJ4ID0gZG1pbl9yeCAmIDB4RkZGRjsKKyAgICBpbnQgcmVmd3g0ID0gcnggPDwgMjsKKyAgICBpbnQgc2Fkc3RhciA9IDAsIG1hZHN0YXI7CisgICAgaW50ICpucm1sel90aCA9IChpbnQqKSBleHRyYV9pbmZvOworICAgIGludCAqb2Zmc2V0UmVmID0gbnJtbHpfdGggKyAzMjsKKyAgICB1aW50MzIgY3VyX3dvcmQ7CisKKyAgICBtYWRzdGFyID0gKHVpbnQzMilkbWluX3J4ID4+IDIwOworCisgICAgTlVNX1NBRF9IUF9NQl9DQUxMKCk7CisKKyAgICBibGsgLT0gNDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSAvKiAxNiBzdGFnZXMgKi8KKyAgICB7CisgICAgICAgIHAxID0gcmVmICsgb2Zmc2V0UmVmW2ldOworCisgICAgICAgIGogPSA0Oy8qIDQgbGluZXMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgY3VyX3dvcmQgPSAqKCh1aW50MzIqKShibGsgKz0gNCkpOworICAgICAgICAgICAgdG1wID0gcDFbMTJdOworICAgICAgICAgICAgdG1wMiA9IHAxWzEzXTsKKyAgICAgICAgICAgIHRtcCsrOworICAgICAgICAgICAgdG1wMiArPSB0bXA7CisgICAgICAgICAgICB0bXAgPSAoY3VyX3dvcmQgPj4gMjQpICYgMHhGRjsKKyAgICAgICAgICAgIHNhZCA9IElOVEVSUDFfU1VCX1NBRChzYWQsIHRtcCwgdG1wMik7OworICAgICAgICAgICAgdG1wID0gcDFbOF07CisgICAgICAgICAgICB0bXAyID0gcDFbOV07CisgICAgICAgICAgICB0bXArKzsKKyAgICAgICAgICAgIHRtcDIgKz0gdG1wOworICAgICAgICAgICAgdG1wID0gKGN1cl93b3JkID4+IDE2KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzRdOworICAgICAgICAgICAgdG1wMiA9IHAxWzVdOworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCA+PiA4KSAmIDB4RkY7CisgICAgICAgICAgICBzYWQgPSBJTlRFUlAxX1NVQl9TQUQoc2FkLCB0bXAsIHRtcDIpOzsKKyAgICAgICAgICAgIHRtcCA9IHAxWzBdOworICAgICAgICAgICAgdG1wMiA9IHAxWzFdOworICAgICAgICAgICAgcDEgKz0gcmVmd3g0OworICAgICAgICAgICAgdG1wKys7CisgICAgICAgICAgICB0bXAyICs9IHRtcDsKKyAgICAgICAgICAgIHRtcCA9IChjdXJfd29yZCAmIDB4RkYpOworICAgICAgICAgICAgc2FkID0gSU5URVJQMV9TVUJfU0FEKHNhZCwgdG1wLCB0bXAyKTs7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKC0taik7CisKKyAgICAgICAgTlVNX1NBRF9IUF9NQigpOworCisgICAgICAgIHNhZHN0YXIgKz0gbWFkc3RhcjsKKyAgICAgICAgaWYgKHNhZCA+IHNhZHN0YXIgLSBucm1sel90aFtpXSB8fCBzYWQgPiAoKHVpbnQzMilkbWluX3J4ID4+IDE2KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIDY1NTM2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNhZDsKK30KKworI2VuZGlmIC8qIEhURk0gKi8KKworCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX2hhbGZwZWxfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMTY0NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaGFsZnBlbF9pbmxpbmUuaApAQCAtMCwwICsxLDk2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCisjaWZuZGVmIF9TQURfSEFMRlBFTF9JTkxJTkVfSF8KKyNkZWZpbmUgX1NBRF9IQUxGUEVMX0lOTElORV9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKK3sKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX2FybV9fKSAvKiBBUk0gR05VIENPTVBJTEVSICAqLworCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMV9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gKHRtcDIgPj4gMSkgLSB0bXA7CisgICAgICAgIGlmICh0bXAgPiAwKSBzYWQgKz0gdG1wOworICAgICAgICBlbHNlIHNhZCAtPSB0bXA7CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBJTlRFUlAyX1NVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworICAgICAgICB0bXAgPSAodG1wID4+IDIpIC0gdG1wMjsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VsaWYgZGVmaW5lZChfX0NDX0FSTSkgIC8qIG9ubHkgd29yayB3aXRoIGFybSB2NSAqLworCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMV9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcCwgdG1wMiwgYXNyICMxIDsKKyAgICAgICAgICAgIHJzYm1pICAgdG1wLCB0bXAsICMwIDsKKyAgICAgICAgICAgIGFkZCAgICAgc2FkLCBzYWQsIHRtcCA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDJfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIHJzYnMgICAgdG1wLCB0bXAyLCB0bXAsIGFzciAjMiA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIElOVEVSUDFfU1VCX1NBRChpbnQzMiBzYWQsIGludDMyIHRtcCwgaW50MzIgdG1wMikKKyAgICB7CitfX2FzbV9fIHZvbGF0aWxlKCJyc2JzCSUxLCAlMSwgJTIsIGFzciAjMVxuXHRyc2JtaSAlMSwgJTEsICMwXG5cdGFkZCAgJTAsICUwLCAlMSI6ICI9ciIoc2FkKSwgIj1yIih0bXApOiAiciIodG1wMikpOworCisgICAgICAgIHJldHVybiBzYWQ7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgSU5URVJQMl9TVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKK19fYXNtX18gdm9sYXRpbGUoInJzYnMJJTEsICUyLCAlMSwgYXNyICMyXG5cdHJzYm1pICUxLCAlMSwgIzBcblx0YWRkCSUwLCAlMCwgJTEiOiAiPXIiKHNhZCksICI9ciIodG1wKTogInIiKHRtcDIpKTsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvL19TQURfSEFMRlBFTF9JTkxJTkVfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9pbmxpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5Nzk0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zYWRfaW5saW5lLmgKQEAgLTAsMCArMSw0ODggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisjaWZuZGVmIF9TQURfSU5MSU5FX0hfCisjZGVmaW5lIF9TQURfSU5MSU5FX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgoreworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fYXJtX18pIC8qIEFSTSBHTlUgQ09NUElMRVIgICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgdG1wID0gdG1wIC0gdG1wMjsKKyAgICAgICAgaWYgKHRtcCA+IDApIHNhZCArPSB0bXA7CisgICAgICAgIGVsc2Ugc2FkIC09IHRtcDsKKworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIHg3ID0gc3JjMiBeIHNyYzE7ICAgICAgIC8qIGNoZWNrIG9kZC9ldmVuIGNvbWJpbmF0aW9uICovCisgICAgICAgIGlmICgodWludDMyKXNyYzIgPj0gKHVpbnQzMilzcmMxKQorICAgICAgICB7CisgICAgICAgICAgICBzcmMxID0gc3JjMiAtIHNyYzE7ICAgICAvKiBzdWJzICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzcmMxID0gc3JjMSAtIHNyYzI7CisgICAgICAgIH0KKyAgICAgICAgeDcgPSB4NyBeIHNyYzE7ICAgICAvKiBvbmx5IG9kZCBieXRlcyBuZWVkIHRvIGFkZCBjYXJyeSAqLworICAgICAgICB4NyA9IG1hc2sgJiAoKHVpbnQzMil4NyA+PiAxKTsKKyAgICAgICAgeDcgPSAoeDcgPDwgOCkgLSB4NzsKKyAgICAgICAgc3JjMSA9IHNyYzEgKyAoeDcgPj4gNyk7IC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICBzcmMxID0gc3JjMSBeKHg3ID4+IDcpOyAgIC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbiwgaW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKworICAgICAgICB4OCA9ICh1aW50MzIpcmVmICYgMHgzOworICAgICAgICBpZiAoeDggPT0gMykKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQzOworICAgICAgICBpZiAoeDggPT0gMikKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQyOworICAgICAgICBpZiAoeDggPT0gMSkKKyAgICAgICAgICAgIGdvdG8gU2FkTUJPZmZzZXQxOworCisvLyAgeDUgPSAoeDQ8PDgpLXg0OyAvKiB4NSA9IHg0KjI1NTsgKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgeDYgPSAweEZGRkYwMEZGOworCisgICAgICAgIHJlZiAtPSBseDsKKyAgICAgICAgYmxrIC09IDE2OworCisgICAgICAgIHg4ID0gMTY7CisKK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDEwID0gKigodWludDMyKikocmVmICs9IGx4KSk7CisgICAgICAgIHgxMSA9ICooKHVpbnQzMiopKHJlZiArIDQpKTsKKyAgICAgICAgeDEyID0gKigodWludDMyKikoYmxrICs9IDE2KSk7CisgICAgICAgIHgxNCA9ICooKHVpbnQzMiopKGJsayArIDQpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDExID0gKigodWludDMyKikocmVmICsgMTIpKTsKKyAgICAgICAgeDEyID0gKigodWludDMyKikoYmxrICsgOCkpOworICAgICAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyAxMikpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIGlmICgoaW50KSgodWludDMyKXgxMCA+PiAxNikgPD0gZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC0teDgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ290byBMT09QX1NBRDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworCitTYWRNQk9mZnNldDM6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQzKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluKTsKKworU2FkTUJPZmZzZXQxOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MShyZWYsIGJsaywgbHgsIGRtaW4pOworCisgICAgfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyAgICBfX2lubGluZSBpbnQzMiBTVUJfU0FEKGludDMyIHNhZCwgaW50MzIgdG1wLCBpbnQzMiB0bXAyKQorICAgIHsKKyAgICAgICAgX19hc20KKyAgICAgICAgeworICAgICAgICAgICAgcnNicyAgICB0bXAsIHRtcCwgdG1wMiA7CisgICAgICAgICAgICByc2JtaSAgIHRtcCwgdG1wLCAjMCA7CisgICAgICAgICAgICBhZGQgICAgIHNhZCwgc2FkLCB0bXAgOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNhZDsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsKGludDMyIHNyYzEsIGludDMyIHNyYzIsIGludDMyIG1hc2spCisgICAgeworICAgICAgICBpbnQzMiB4NzsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBFT1IgICAgIHg3LCBzcmMyLCBzcmMxOyAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgICAgIFNVQlMgICAgc3JjMSwgc3JjMiwgc3JjMTsKKyAgICAgICAgICAgIEVPUiAgICAgeDcsIHg3LCBzcmMxOworICAgICAgICAgICAgQU5EICAgICB4NywgbWFzaywgeDcsIGxzciAjMTsKKyAgICAgICAgICAgIE9SUkNDICAgeDcsIHg3LCAjMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIFJTQiAgICAgeDcsIHg3LCB4NywgbHNsICM4OworICAgICAgICAgICAgQUREICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgIC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICAgICAgRU9SICAgICBzcmMxLCBzcmMxLCB4NywgYXNyICM3OyAgIC8qIHRha2UgYWJzb2x1dGUgdmFsdWUgb2YgbmVnYXRpdmUgYnl0ZSAqLworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNyYzE7CisgICAgfQorCisgICAgX19pbmxpbmUgaW50MzIgc2FkXzRwaXhlbE4oaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIEVPUiAgICAgIHg3LCBzcmMyLCBzcmMxOyAgICAgICAgLyogY2hlY2sgb2RkL2V2ZW4gY29tYmluYXRpb24gKi8KKyAgICAgICAgICAgIEFERFMgICAgIHNyYzEsIHNyYzIsIHNyYzE7CisgICAgICAgICAgICBFT1IgICAgICB4NywgeDcsIHNyYzE7ICAgICAgLyogb25seSBvZGQgYnl0ZXMgbmVlZCB0byBhZGQgY2FycnkgKi8KKyAgICAgICAgICAgIEFORFMgICAgIHg3LCBtYXNrLCB4NywgcnJ4OworICAgICAgICAgICAgUlNCICAgICAgeDcsIHg3LCB4NywgbHNsICM4OworICAgICAgICAgICAgU1VCICAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgIC8qIGFkZCAweEZGIHRvIHRoZSBuZWdhdGl2ZSBieXRlLCBhZGQgYmFjayBjYXJyeSAqLworICAgICAgICAgICAgRU9SICAgICAgc3JjMSwgc3JjMSwgeDcsIGFzciAjNzsgLyogdGFrZSBhYnNvbHV0ZSB2YWx1ZSBvZiBuZWdhdGl2ZSBieXRlICovCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyNkZWZpbmUgc3VtX2FjY3VtdWxhdGUgIF9fYXNteyAgICAgIFNCQyAgICAgIHg1LCB4NSwgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8gXAorICAgICAgICBCSUMgICAgICB4MTAsIHg2LCB4MTA7ICAgLyogeDEwICYgMHhGRjAwRkYwMCAqLyBcCisgICAgICAgIEFERCAgICAgIHg0LCB4NCwgeDEwLGxzciAjODsgICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8gXAorICAgICAgICBTQkMgICAgICB4NSwgeDUsIHgxMTsgICAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8gXAorICAgICAgICBCSUMgICAgICB4MTEsIHg2LCB4MTE7ICAgLyogeDExICYgMHhGRjAwRkYwMCAqLyBcCisgICAgICAgIEFERCAgICAgIHg0LCB4NCwgeDExLGxzciAjODsgfSAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworCisjZGVmaW5lIE5VTUJFUiAzCisjZGVmaW5lIFNISUZUIDI0CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDIKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCAxNgorI3VuZGVmIElOQ19YOAorI2RlZmluZSBJTkNfWDggMHgxMDAwMDAwMQorI2luY2x1ZGUgInNhZF9tYl9vZmZzZXQuaCIKKworI3VuZGVmIE5VTUJFUgorI2RlZmluZSBOVU1CRVIgMQorI3VuZGVmIFNISUZUCisjZGVmaW5lIFNISUZUIDgKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MDgwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKworICAgIF9faW5saW5lIGludDMyIHNpbWRfc2FkX21iKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBkbWluLCBpbnQgbHgpCisgICAgeworICAgICAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OCwgeDksIHgxMCwgeDExLCB4MTIsIHgxNDsKKworICAgICAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgICAgICB4NCA9IHg1ID0gMDsKKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICBNT1ZTICAgIHg4LCByZWYsIGxzbCAjMzEgOworICAgICAgICAgICAgQkhJICAgICBTYWRNQk9mZnNldDM7CisgICAgICAgICAgICBCQ1MgICAgIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgICAgIEJNSSAgICAgU2FkTUJPZmZzZXQxOworCisgICAgICAgICAgICBNVk4gICAgIHg2LCAjMHhGRjAwOworICAgICAgICB9CitMT09QX1NBRDA6CisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMSA9ICooKGludDMyKikocmVmICsgMTIpKTsKKyAgICAgICAgeDEwID0gKigoaW50MzIqKShyZWYgKyA4KSk7CisgICAgICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgMTIpKTsKKyAgICAgICAgeDEyID0gKigoaW50MzIqKShibGsgKyA4KSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICAgICAgeDExID0gc2FkXzRwaXhlbCh4MTEsIHgxNCwgeDkpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgICAgICB4NSA9IHg1ICsgeDEwOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTAgPj4gOCk7IC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgICAgICB4NSA9IHg1ICsgeDExOyAgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICAgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICAgICAgTERSICAgICB4MTEsIFtyZWYsICM0XTsKKyAgICAgICAgICAgIExEUiAgICAgeDEwLCBbcmVmXSwgbHggOworICAgICAgICAgICAgTERSICAgICB4MTQsIFtibGssICM0XTsKKyAgICAgICAgICAgIExEUiAgICAgeDEyLCBbYmxrXSwgIzE2IDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIF9fYXNtCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqLworICAgICAgICAgICAgUlNCUyAgICB4MTEsIGRtaW4sIHgxMCwgbHNyICMxNjsKKyAgICAgICAgICAgIEFERExTUyAgeDgsIHg4LCAjMHgxMDAwMDAwMTsKKyAgICAgICAgICAgIEJMUyAgICAgTE9PUF9TQUQwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7CisKK1NhZE1CT2Zmc2V0MzoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDMocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisKK1NhZE1CT2Zmc2V0MjoKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDIocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluLCB4OCk7CisgICAgfQorCisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworICAgIF9faW5saW5lIGludDMyIFNVQl9TQUQoaW50MzIgc2FkLCBpbnQzMiB0bXAsIGludDMyIHRtcDIpCisgICAgeworX19hc21fXyB2b2xhdGlsZSgicnNicwklMSwgJTEsICUyXG5cdHJzYm1pICUxLCAlMSwgIzBcblx0YWRkCSUwLCAlMCwgJTEiOiAiPXIiKHNhZCk6ICJyIih0bXApLCAiciIodG1wMikpOworICAgICAgICByZXR1cm4gc2FkOworICAgIH0KKworICAgIF9faW5saW5lIGludDMyIHNhZF80cGl4ZWwoaW50MzIgc3JjMSwgaW50MzIgc3JjMiwgaW50MzIgbWFzaykKKyAgICB7CisgICAgICAgIGludDMyIHg3OworCitfX2FzbV9fIHZvbGF0aWxlKCJFT1IJJTEsICUyLCAlMFxuXHRTVUJTICAlMCwgJTIsICUwXG5cdEVPUgklMSwgJTEsICUwXG5cdEFORCAgJTEsICUzLCAlMSwgbHNyICMxXG5cdE9SUkNDCSUxLCAlMSwgIzB4ODAwMDAwMDBcblx0UlNCICAlMSwgJTEsICUxLCBsc2wgIzhcblx0QUREICAlMCwgJTAsICUxLCBhc3IgIzdcblx0RU9SICAlMCwgJTAsICUxLCBhc3IgIzciOiAiPXIiKHNyYzEpLCAiPSZyIih4Nyk6ICJyIihzcmMyKSwgInIiKG1hc2spKTsKKworICAgICAgICByZXR1cm4gc3JjMTsKKyAgICB9CisKKyAgICBfX2lubGluZSBpbnQzMiBzYWRfNHBpeGVsTihpbnQzMiBzcmMxLCBpbnQzMiBzcmMyLCBpbnQzMiBtYXNrKQorICAgIHsKKyAgICAgICAgaW50MzIgeDc7CisKK19fYXNtX18gdm9sYXRpbGUoIkVPUgklMSwgJTIsICUwXG5cdEFERFMgICUwLCAlMiwgJTBcblx0RU9SICAlMSwgJTEsICUwXG5cdEFORFMgICUxLCAlMywgJTEsIHJyeFxuXHRSU0IgICUxLCAlMSwgJTEsIGxzbCAjOFxuXHRTVUIJJTAsICUwLCAlMSwgYXNyICM3XG5cdEVPUiAgICUwLCAlMCwgJTEsIGFzciAjNyI6ICI9ciIoc3JjMSksICI9JnIiKHg3KTogInIiKHNyYzIpLCAiciIobWFzaykpOworCisgICAgICAgIHJldHVybiBzcmMxOworICAgIH0KKworI2RlZmluZSBzdW1fYWNjdW11bGF0ZSAgX19hc21fXyB2b2xhdGlsZSgiU0JDICAlMCwgJTAsICUxXG5cdEJJQyAgICUxLCAlNCwgJTFcblx0QUREICAgJTIsICUyLCAlMSwgbHNyICM4XG5cdFNCQyAgICUwLCAlMCwgJTNcblx0QklDICAgJTMsICU0LCAlM1xuXHRBREQgICAlMiwgJTIsICUzLCBsc3IgIzgiOiAiPSZyIiAoeDUpLCAiPSZyIiAoeDEwKSwgIj0mciIgKHg0KSwgIj0mciIgKHgxMSk6ICJyIiAoeDYpKTsKKworI2RlZmluZSBOVU1CRVIgMworI2RlZmluZSBTSElGVCAyNAorI2RlZmluZSBJTkNfWDggMHgwODAwMDAwMQorCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisjdW5kZWYgTlVNQkVSCisjZGVmaW5lIE5VTUJFUiAyCisjdW5kZWYgU0hJRlQKKyNkZWZpbmUgU0hJRlQgMTYKKyN1bmRlZiBJTkNfWDgKKyNkZWZpbmUgSU5DX1g4IDB4MTAwMDAwMDEKKyNpbmNsdWRlICJzYWRfbWJfb2Zmc2V0LmgiCisKKyN1bmRlZiBOVU1CRVIKKyNkZWZpbmUgTlVNQkVSIDEKKyN1bmRlZiBTSElGVAorI2RlZmluZSBTSElGVCA4CisjdW5kZWYgSU5DX1g4CisjZGVmaW5lIElOQ19YOCAweDA4MDAwMDAxCisjaW5jbHVkZSAic2FkX21iX29mZnNldC5oIgorCisKKyAgICBfX2lubGluZSBpbnQzMiBzaW1kX3NhZF9tYih1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgZG1pbiwgaW50IGx4KQorICAgIHsKKyAgICAgICAgaW50MzIgeDQsIHg1LCB4NiwgeDgsIHg5LCB4MTAsIHgxMSwgeDEyLCB4MTQ7CisKKyAgICAgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICAgICAgeDQgPSB4NSA9IDA7CisKKyAgICAgICAgeDggPSAodWludDMyKXJlZiAmIDB4MzsKKyAgICAgICAgaWYgKHg4ID09IDMpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MzsKKyAgICAgICAgaWYgKHg4ID09IDIpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MjsKKyAgICAgICAgaWYgKHg4ID09IDEpCisgICAgICAgICAgICBnb3RvIFNhZE1CT2Zmc2V0MTsKKworICAgICAgICB4OCA9IDE2OworLy8vCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4JJTAsICMweEZGMDAiOiAiPXIiKHg2KSk7CisKK0xPT1BfU0FEMDoKKyAgICAgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICAgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgICAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICAgICAgeDE0ID0gKigoaW50MzIqKShibGsgKyAxMikpOworICAgICAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgICAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAgICAgLyogcHJvY2VzcyB4MTIgJiB4MTAgKi8KKyAgICAgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgICAgIHg1ID0geDUgKyB4MTA7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgICAgICB4MTEgPSB4MTEgJiAoeDYgPDwgOCk7IC8qIHgxMSAmIDB4RkYwMEZGMDAgKi8KKyAgICAgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgICAgIHgxMSA9ICooKGludDMyKikocmVmICsgNCkpOworX19hc21fXyB2b2xhdGlsZSgiTERSCSUwLCBbJTFdLCAlMiI6ICI9JnIiKHgxMCksICI9ciIocmVmKTogInIiKGx4KSk7CisgICAgICAgIC8veDEwID0gKigoaW50MzIqKXJlZik7IHJlZis9bHg7CisgICAgICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgNCkpOworX19hc21fXyB2b2xhdGlsZSgiTERSCSUwLCBbJTFdLCAjMTYiOiAiPSZyIih4MTIpLCAiPXIiKGJsaykpOworCisgICAgICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgICAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgICAgICB4MTAgPSBzYWRfNHBpeGVsKHgxMCwgeDEyLCB4OSk7CisKKyAgICAgICAgeDUgPSB4NSArIHgxMDsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMCA9IHgxMCAmICh4NiA8PCA4KTsgLyogeDEwICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgICAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDExID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKiovCisgICAgICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgICAgICB4MTAgPSB4MTAgKyB4NDsgICAgIC8qIGFkZCB3aXRoIGhpZ2ggYnl0ZXMgKi8KKyAgICAgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgICAgIC8qKioqKioqKioqKioqKioqLworCisgICAgICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9IGRtaW4pIC8qIGNvbXBhcmUgd2l0aCBkbWluICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICgtLXg4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGdvdG8gTE9PUF9TQUQwOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKCh1aW50MzIpeDEwID4+IDE2KTsKKworU2FkTUJPZmZzZXQzOgorCisgICAgICAgIHJldHVybiBzYWRfbWJfb2Zmc2V0MyhyZWYsIGJsaywgbHgsIGRtaW4pOworCitTYWRNQk9mZnNldDI6CisKKyAgICAgICAgcmV0dXJuIHNhZF9tYl9vZmZzZXQyKHJlZiwgYmxrLCBseCwgZG1pbik7CisKK1NhZE1CT2Zmc2V0MToKKworICAgICAgICByZXR1cm4gc2FkX21iX29mZnNldDEocmVmLCBibGssIGx4LCBkbWluKTsKKyAgICB9CisKKworI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBfU0FEX0lOTElORV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjL2VuYy9zcmMvc2FkX21iX29mZnNldC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ0YTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NhZF9tYl9vZmZzZXQuaApAQCAtMCwwICsxLDMxMSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Myh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgLy8gIHg1ID0gKHg0PDw4KSAtIHg0OworICAgIHg0ID0geDUgPSAwOworICAgIHg2ID0gMHhGRkZGMDBGRjsKKyAgICB4OSA9IDB4ODA4MDgwODA7IC8qIGNvbnN0LiAqLworICAgIHJlZiAtPSBOVU1CRVI7IC8qIGJpYyByZWYsIHJlZiwgIzMgKi8KKyAgICByZWYgLT0gbHg7CisgICAgYmxrIC09IDE2OworICAgIHg4ID0gMTY7CisKKyNpZiAoTlVNQkVSPT0zKQorTE9PUF9TQUQzOgorI2VsaWYgKE5VTUJFUj09MikKK0xPT1BfU0FEMjoKKyNlbGlmIChOVU1CRVI9PTEpCitMT09QX1NBRDE6CisjZW5kaWYKKyAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgIHgxMCA9ICooKHVpbnQzMiopKHJlZiArPSBseCkpOyAvKiBEIEMgQiBBICovCisgICAgeDExID0gKigodWludDMyKikocmVmICsgNCkpOyAgICAvKiBIIEcgRiBFICovCisgICAgeDEyID0gKigodWludDMyKikocmVmICsgOCkpOyAgICAvKiBMIEsgSiBJICovCisKKyAgICB4MTAgPSAoKHVpbnQzMil4MTAgPj4gU0hJRlQpOyAvKiAwIDAgMCBEICovCisgICAgeDEwID0geDEwIHwgKHgxMSA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogRyBGIEUgRCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDAgMCAwIEggKi8KKyAgICB4MTEgPSB4MTEgfCAoeDEyIDw8ICgzMiAtIFNISUZUKSk7ICAgICAgICAvKiBLIEogSSBIICovCisKKyAgICB4MTIgPSAqKCh1aW50MzIqKShibGsgKz0gMTYpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyA0KSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWwoeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbCh4MTAsIHgxMiwgeDkpOworCisgICAgeDUgPSB4NSArIHgxMDsgLyogYWNjdW11bGF0ZSBsb3cgYnl0ZXMgKi8KKyAgICB4MTAgPSB4MTAgJiAoeDYgPDwgOCk7IC8qIHgxMCAmIDB4RkYwMEZGMDAgKi8KKyAgICB4NCA9IHg0ICsgKCh1aW50MzIpeDEwID4+IDgpOyAgLyogYWNjdW11bGF0ZSBoaWdoIGJ5dGVzICovCisgICAgeDUgPSB4NSArIHgxMTsgIC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDExID0geDExICYgKHg2IDw8IDgpOyAvKiB4MTEgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMSA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTAgPSAqKCh1aW50MzIqKShyZWYgKyA4KSk7IC8qIEQgQyBCIEEgKi8KKyAgICB4MTEgPSAqKCh1aW50MzIqKShyZWYgKyAxMikpOyAgIC8qIEggRyBGIEUgKi8KKyAgICB4MTIgPSAqKCh1aW50MzIqKShyZWYgKyAxNikpOyAgIC8qIEwgSyBKIEkgKi8KKworICAgIHgxMCA9ICgodWludDMyKXgxMCA+PiBTSElGVCk7IC8qIG12biB4MTAsIHgxMCwgbHNyICMyNCAgPSAweEZGIDB4RkYgMHhGRiB+RCAqLworICAgIHgxMCA9IHgxMCB8ICh4MTEgPDwgKDMyIC0gU0hJRlQpKTsgICAgICAgIC8qIGJpYyB4MTAsIHgxMCwgeDExLCBsc2wgIzggPSB+RyB+RiB+RSB+RCAqLworICAgIHgxMSA9ICgodWludDMyKXgxMSA+PiBTSElGVCk7IC8qIDB4RkYgMHhGRiAweEZGIH5IICovCisgICAgeDExID0geDExIHwgKHgxMiA8PCAoMzIgLSBTSElGVCkpOyAgICAgICAgLyogfksgfkogfkkgfkggKi8KKworICAgIHgxMiA9ICooKHVpbnQzMiopKGJsayArIDgpKTsKKyAgICB4MTQgPSAqKCh1aW50MzIqKShibGsgKyAxMikpOworCisgICAgLyogcHJvY2VzcyB4MTEgJiB4MTQgKi8KKyAgICB4MTEgPSBzYWRfNHBpeGVsKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWwoeDEwLCB4MTIsIHg5KTsKKworICAgIHg1ID0geDUgKyB4MTA7IC8qIGFjY3VtdWxhdGUgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICYgKHg2IDw8IDgpOyAvKiB4MTAgJiAweEZGMDBGRjAwICovCisgICAgeDQgPSB4NCArICgodWludDMyKXgxMCA+PiA4KTsgIC8qIGFjY3VtdWxhdGUgaGlnaCBieXRlcyAqLworICAgIHg1ID0geDUgKyB4MTE7ICAvKiBhY2N1bXVsYXRlIGxvdyBieXRlcyAqLworICAgIHgxMSA9IHgxMSAmICh4NiA8PCA4KTsgLyogeDExICYgMHhGRjAwRkYwMCAqLworICAgIHg0ID0geDQgKyAoKHVpbnQzMil4MTEgPj4gOCk7ICAvKiBhY2N1bXVsYXRlIGhpZ2ggYnl0ZXMgKi8KKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoaW50KSgodWludDMyKXgxMCA+PiAxNikgPD0gZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorICAgICAgICAgICAgZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCisgICAgICAgICAgICBnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZWxpZiBkZWZpbmVkKF9fQ0NfQVJNKSAgLyogb25seSB3b3JrIHdpdGggYXJtIHY1ICovCisKKyNpZiAoTlVNQkVSPT0zKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDModWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0yKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDIodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbiwgaW50MzIgeDgpCisjZW5kaWYKK3sKKyAgICBpbnQzMiB4NCwgeDUsIHg2LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICB4NCA9IHg1ID0gMDsKKworICAgIF9fYXNteworICAgICAgICBNVk4gICAgICB4NiwgIzB4ZmYwMDAwOworI2lmIChOVU1CRVI9PTMpCitMT09QX1NBRDM6CisjZWxpZiAoTlVNQkVSPT0yKQorTE9PUF9TQUQyOgorI2VsaWYgKE5VTUJFUj09MSkKK0xPT1BfU0FEMToKKyNlbmRpZgorICAgICAgICBCSUMgICAgICByZWYsIHJlZiwgIzM7CisgICAgfQorICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgMTYpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisKKyAgICBfX2FzbXsKKyAgICAgICAgTVZOICAgICAgeDEwLCB4MTAsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMCwgeDEwLCB4MTEsIGxzbCAjKDMyLVNISUZUKTsKKyAgICAgICAgTVZOICAgICAgeDExLCB4MTEsIGxzciAjU0hJRlQ7CisgICAgICAgIEJJQyAgICAgIHgxMSwgeDExLCB4MTIsIGxzbCAjKDMyLVNISUZUKTsKKworICAgICAgICBMRFIgICAgICB4MTIsIFtibGssICM4XTsKKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIF9fYXNteworICAgICAgICAvKioqKioqIHByb2Nlc3MgOCBwaXhlbHMgKioqKioqLworICAgICAgICBMRFIgICAgICB4MTEsIFtyZWYsICM0XTsKKyAgICAgICAgTERSICAgICAgeDEyLCBbcmVmLCAjOF07CisgICAgICAgIExEUiAgeDEwLCBbcmVmXSwgbHggOworICAgICAgICBMRFIgIHgxNCwgW2JsaywgIzRdOworCisgICAgICAgIE1WTiAgICAgIHgxMCwgeDEwLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTAsIHgxMCwgeDExLCBsc2wgIygzMi1TSElGVCk7CisgICAgICAgIE1WTiAgICAgIHgxMSwgeDExLCBsc3IgI1NISUZUOworICAgICAgICBCSUMgICAgICB4MTEsIHgxMSwgeDEyLCBsc2wgIygzMi1TSElGVCk7CisKKyAgICAgICAgTERSICAgICAgeDEyLCBbYmxrXSwgIzE2OworICAgIH0KKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKioqKioqKioqKiovCisgICAgeDEwID0geDUgLSAoeDQgPDwgOCk7IC8qIGV4dHJhY3QgbG93IGJ5dGVzICovCisgICAgeDEwID0geDEwICsgeDQ7ICAgICAvKiBhZGQgd2l0aCBoaWdoIGJ5dGVzICovCisgICAgeDEwID0geDEwICsgKHgxMCA8PCAxNik7IC8qIGFkZCB3aXRoIGxvd2VyIGhhbGYgd29yZCAqLworCisgICAgX19hc217CisgICAgICAgIFJTQlMgICAgIHgxMSwgZG1pbiwgeDEwLCBsc3IgIzE2CisgICAgICAgIEFERExTUyAgIHg4LCB4OCwgI0lOQ19YOAorI2lmIChOVU1CRVI9PTMpCisgICAgICAgIEJMUyAgICAgIExPT1BfU0FEMzsKKyNlbGlmIChOVU1CRVI9PTIpCitCTFMgICAgICBMT09QX1NBRDI7CisjZWxpZiAoTlVNQkVSPT0xKQorQkxTICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgfQorCisgICAgcmV0dXJuICgodWludDMyKXgxMCA+PiAxNik7Cit9CisKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19hcm1fXykgLyogQVJNIEdOVSBDT01QSUxFUiAgKi8KKworI2lmIChOVU1CRVI9PTMpCitfX2lubGluZSBpbnQzMiBzYWRfbWJfb2Zmc2V0Myh1aW50OCAqcmVmLCB1aW50OCAqYmxrLCBpbnQgbHgsIGludCBkbWluKQorI2VsaWYgKE5VTUJFUj09MikKK19faW5saW5lIGludDMyIHNhZF9tYl9vZmZzZXQyKHVpbnQ4ICpyZWYsIHVpbnQ4ICpibGssIGludCBseCwgaW50IGRtaW4pCisjZWxpZiAoTlVNQkVSPT0xKQorX19pbmxpbmUgaW50MzIgc2FkX21iX29mZnNldDEodWludDggKnJlZiwgdWludDggKmJsaywgaW50IGx4LCBpbnQgZG1pbikKKyNlbmRpZgoreworICAgIGludDMyIHg0LCB4NSwgeDYsIHg4LCB4OSwgeDEwLCB4MTEsIHgxMiwgeDE0OworCisgICAgeDkgPSAweDgwODA4MDgwOyAvKiBjb25zdC4gKi8KKyAgICB4NCA9IHg1ID0gMDsKKyAgICB4OCA9IDE2OyAvLzw8PT09PT09PT09PT0qKioqKioqCisKK19fYXNtX18gdm9sYXRpbGUoIk1WTgklMCwgIzB4RkYwMDAwIjogIj1yIih4NikpOworCisjaWYgKE5VTUJFUj09MykKK0xPT1BfU0FEMzoKKyNlbGlmIChOVU1CRVI9PTIpCitMT09QX1NBRDI6CisjZWxpZiAoTlVNQkVSPT0xKQorTE9PUF9TQUQxOgorI2VuZGlmCitfX2FzbV9fIHZvbGF0aWxlKCJCSUMgICUwLCAlMCwgIzMiOiAiPXIiKHJlZikpOworICAgIC8qKioqKiogcHJvY2VzcyA4IHBpeGVscyAqKioqKiovCisgICAgeDExID0gKigoaW50MzIqKShyZWYgKyAxMikpOworICAgIHgxMiA9ICooKGludDMyKikocmVmICsgMTYpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTQgPSAqKChpbnQzMiopKGJsayArIDEyKSk7CisKKyNpZiAoU0hJRlQ9PTgpCitfX2FzbV9fIHZvbGF0aWxlKCJNVk4gICAlMCwgJTAsIGxzciAjOFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMjRcblx0TVZOICAgJTEsICUxLGxzciAjOFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMjQiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTE2KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzE2XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICMxNlxuXHRNVk4gICAlMSwgJTEsbHNyICMxNlxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjMTYiOiAiPSZyIih4MTApLCAiPSZyIih4MTEpOiAiciIoeDEyKSk7CisjZWxpZiAoU0hJRlQ9PTI0KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzI0XG5cdEJJQyAgICUwLCAlMCwgJTEsbHNsICM4XG5cdE1WTiAgICUxLCAlMSxsc3IgIzI0XG5cdEJJQyAgICUxLCAlMSwgJTIsbHNsICM4IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VuZGlmCisKKyAgICB4MTIgPSAqKChpbnQzMiopKGJsayArIDgpKTsKKworICAgIC8qIHByb2Nlc3MgeDExICYgeDE0ICovCisgICAgeDExID0gc2FkXzRwaXhlbE4oeDExLCB4MTQsIHg5KTsKKworICAgIC8qIHByb2Nlc3MgeDEyICYgeDEwICovCisgICAgeDEwID0gc2FkXzRwaXhlbE4oeDEwLCB4MTIsIHg5KTsKKworICAgIHN1bV9hY2N1bXVsYXRlOworCisgICAgLyoqKioqKiBwcm9jZXNzIDggcGl4ZWxzICoqKioqKi8KKyAgICB4MTEgPSAqKChpbnQzMiopKHJlZiArIDQpKTsKKyAgICB4MTIgPSAqKChpbnQzMiopKHJlZiArIDgpKTsKKyAgICB4MTAgPSAqKChpbnQzMiopcmVmKTsgcmVmICs9IGx4OworICAgIHgxNCA9ICooKGludDMyKikoYmxrICsgNCkpOworCisjaWYgKFNISUZUPT04KQorX19hc21fXyB2b2xhdGlsZSgiTVZOICAgJTAsICUwLCBsc3IgIzhcblx0QklDICAgJTAsICUwLCAlMSxsc2wgIzI0XG5cdE1WTiAgICUxLCAlMSxsc3IgIzhcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzI0IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0xNikKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMxNlxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjMTZcblx0TVZOICAgJTEsICUxLGxzciAjMTZcblx0QklDICAgJTEsICUxLCAlMixsc2wgIzE2IjogIj0mciIoeDEwKSwgIj0mciIoeDExKTogInIiKHgxMikpOworI2VsaWYgKFNISUZUPT0yNCkKK19fYXNtX18gdm9sYXRpbGUoIk1WTiAgICUwLCAlMCwgbHNyICMyNFxuXHRCSUMgICAlMCwgJTAsICUxLGxzbCAjOFxuXHRNVk4gICAlMSwgJTEsbHNyICMyNFxuXHRCSUMgICAlMSwgJTEsICUyLGxzbCAjOCI6ICI9JnIiKHgxMCksICI9JnIiKHgxMSk6ICJyIih4MTIpKTsKKyNlbmRpZgorX19hc21fXyB2b2xhdGlsZSgiTERSICAgJTAsIFslMV0sICMxNiI6ICI9JnIiKHgxMiksICI9ciIoYmxrKSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMSAmIHgxNCAqLworICAgIHgxMSA9IHNhZF80cGl4ZWxOKHgxMSwgeDE0LCB4OSk7CisKKyAgICAvKiBwcm9jZXNzIHgxMiAmIHgxMCAqLworICAgIHgxMCA9IHNhZF80cGl4ZWxOKHgxMCwgeDEyLCB4OSk7CisKKyAgICBzdW1fYWNjdW11bGF0ZTsKKworICAgIC8qKioqKioqKioqKioqKioqLworICAgIHgxMCA9IHg1IC0gKHg0IDw8IDgpOyAvKiBleHRyYWN0IGxvdyBieXRlcyAqLworICAgIHgxMCA9IHgxMCArIHg0OyAgICAgLyogYWRkIHdpdGggaGlnaCBieXRlcyAqLworICAgIHgxMCA9IHgxMCArICh4MTAgPDwgMTYpOyAvKiBhZGQgd2l0aCBsb3dlciBoYWxmIHdvcmQgKi8KKworICAgIGlmICgoKHVpbnQzMil4MTAgPj4gMTYpIDw9ICh1aW50MzIpZG1pbikgLyogY29tcGFyZSB3aXRoIGRtaW4gKi8KKyAgICB7CisgICAgICAgIGlmICgtLXg4KQorICAgICAgICB7CisjaWYgKE5VTUJFUj09MykKKyAgICAgICAgICAgIGdvdG8gICAgICAgICBMT09QX1NBRDM7CisjZWxpZiAoTlVNQkVSPT0yKQorZ290byAgICAgICAgIExPT1BfU0FEMjsKKyNlbGlmIChOVU1CRVI9PTEpCitnb3RvICAgICAgICAgTE9PUF9TQUQxOworI2VuZGlmCisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiAoKHVpbnQzMil4MTAgPj4gMTYpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3NsaWNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zbGljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMDY2ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy9zbGljZS5jcHAKQEAgLTAsMCArMSwxMDI1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworCitBVkNFbmNfU3RhdHVzIEFWQ0VuY29kZVNsaWNlKEFWQ0VuY09iamVjdCAqZW5jdmlkKQoreworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ1BpY1BhcmFtU2V0ICpwcHMgPSB2aWRlby0+Y3VyclBpY1BhcmFtczsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CIDsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIHVpbnQgc2xpY2VfZ3JvdXBfaWQ7CisgICAgaW50IEN1cnJNYkFkZHIsIHNsaWNlX3R5cGU7CisKKyAgICBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICAvKiBzZXQgdGhlIGZpcnN0IG1iIGluIHNsaWNlICovCisgICAgdmlkZW8tPm1iTnVtID0gQ3Vyck1iQWRkciA9IHNsaWNlSGRyLT5maXJzdF9tYl9pbl9zbGljZTsvLyAqICgxK3ZpZGVvLT5NYmFmZkZyYW1lRmxhZyk7CisgICAgc2xpY2VfZ3JvdXBfaWQgPSB2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXBbQ3Vyck1iQWRkcl07CisKKyAgICB2aWRlby0+bWJfc2tpcF9ydW4gPSAwOworCisgICAgLyogd2hpbGUgbG9vcCAsIHNlZSBzdWJjbGF1c2UgNy4zLjQgKi8KKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIHZpZGVvLT5tYk51bSA9IEN1cnJNYkFkZHI7CisgICAgICAgIGN1cnJNQiA9IHZpZGVvLT5jdXJyTUIgPSAmKHZpZGVvLT5tYmxvY2tbQ3Vyck1iQWRkcl0pOworICAgICAgICBjdXJyTUItPnNsaWNlX2lkID0gdmlkZW8tPnNsaWNlX2lkOyAgLy8gZm9yIGRlYmxvY2tpbmcKKworICAgICAgICB2aWRlby0+bWJfeCA9IEN1cnJNYkFkZHIgJSB2aWRlby0+UGljV2lkdGhJbk1iczsKKyAgICAgICAgdmlkZW8tPm1iX3kgPSBDdXJyTWJBZGRyIC8gdmlkZW8tPlBpY1dpZHRoSW5NYnM7CisKKyAgICAgICAgLyogaW5pdGlhbGl6ZSBRUCBmb3IgdGhpcyBNQiBoZXJlKi8KKyAgICAgICAgLyogY2FsY3VsYXRlIGN1cnJNQi0+UVB5ICovCisgICAgICAgIFJDSW5pdE1CUVAoZW5jdmlkKTsKKworICAgICAgICAvKiBjaGVjayB0aGUgYXZhaWxhYmlsaXR5IG9mIG5laWdoYm9yaW5nIG1hY3JvYmxvY2tzICovCisgICAgICAgIEluaXROZWlnaGJvckF2YWlsYWJpbGl0eSh2aWRlbywgQ3Vyck1iQWRkcik7CisKKyAgICAgICAgLyogQXNzdW1pbmcgdGhhdCBJbml0TmVpZ2hib3JBdmFpbGFiaWxpdHkgaGFzIGJlZW4gY2FsbGVkIHByaW9yIHRvIHRoaXMgZnVuY3Rpb24gKi8KKyAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPmludHJhQXZhaWxEID0gMDsKKyAgICAgICAgLyogdGhpcyBpcyBuZWNlc3NhcnkgZm9yIGFsbCBzdWJzZXF1ZW50IGludHJhIHNlYXJjaCAqLworCisgICAgICAgIGlmICghdmlkZW8tPmN1cnJQaWNQYXJhbXMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZykKKyAgICAgICAgeworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxBID0gdmlkZW8tPm1iQXZhaWxBOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1iQXZhaWxCOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxDID0gdmlkZW8tPm1iQXZhaWxDOworICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1iQXZhaWxEOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEEgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYl9pbnRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxCID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQl0ubWJfaW50cmEgOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZpZGVvLT5tYkF2YWlsQykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+aW50cmFBdmFpbEMgPSB2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJDXS5tYl9pbnRyYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh2aWRlby0+bWJBdmFpbEQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmlkZW8tPmludHJhQXZhaWxEID0gdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyRF0ubWJfaW50cmE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBlbmNvZGVfb25lX21hY3JvYmxvY2soKSAqLworICAgICAgICBzdGF0dXMgPSBFbmNvZGVNQihlbmN2aWQpOworICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGdvIHRvIG5leHQgTUIgKi8KKyAgICAgICAgQ3Vyck1iQWRkcisrOworCisgICAgICAgIHdoaWxlICgodWludCl2aWRlby0+TWJUb1NsaWNlR3JvdXBNYXBbQ3Vyck1iQWRkcl0gIT0gc2xpY2VfZ3JvdXBfaWQgJiYKKyAgICAgICAgICAgICAgICAodWludClDdXJyTWJBZGRyIDwgdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgQ3Vyck1iQWRkcisrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh1aW50KUN1cnJNYkFkZHIgPj0gdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgeworICAgICAgICAgICAgLyogZW5kIG9mIHNsaWNlLCByZXR1cm4sIGJ1dCBiZWZvcmUgdGhhdCBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIG90aGVyIHNsaWNlcworICAgICAgICAgICAgdG8gYmUgZW5jb2RlZC4gKi8KKyAgICAgICAgICAgIGVuY3ZpZC0+Y3VyclNsaWNlR3JvdXArKzsKKyAgICAgICAgICAgIGlmIChlbmN2aWQtPmN1cnJTbGljZUdyb3VwID4gKGludClwcHMtPm51bV9zbGljZV9ncm91cHNfbWludXMxKSAvKiBubyBtb3JlIHNsaWNlIGdyb3VwICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX1BJQ1RVUkVfUkVBRFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZmluZCBmaXJzdF9tYl9udW0gZm9yIHRoZSBuZXh0IHNsaWNlICovCisgICAgICAgICAgICAgICAgQ3Vyck1iQWRkciA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHZpZGVvLT5NYlRvU2xpY2VHcm91cE1hcFtDdXJyTWJBZGRyXSAhPSBlbmN2aWQtPmN1cnJTbGljZUdyb3VwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAodWludClDdXJyTWJBZGRyIDwgdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN1cnJNYkFkZHIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh1aW50KUN1cnJNYkFkZHIgPj0gdmlkZW8tPlBpY1NpemVJbk1icykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEFWQ0VOQ19TTElDRV9FTVBUWTsgLyogZXJyb3IsIG9uZSBzbGljZSBncm91cCBoYXMgbm8gTUJzIGluIGl0ICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdmlkZW8tPm1iTnVtID0gQ3Vyck1iQWRkcjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2aWRlby0+bWJfc2tpcF9ydW4gPiAwKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgc2tpcF9ydW4gKi8KKyAgICAgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCB2aWRlby0+bWJfc2tpcF9ydW4pOworICAgICAgICAgICAgdmlkZW8tPm1iX3NraXBfcnVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzID0gQVZDRU5DX0ZBSUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKK0FWQ0VuY19TdGF0dXMgRW5jb2RlTUIoQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBBVkNDb21tb25PYmogKnZpZGVvID0gZW5jdmlkLT5jb21tb247CisgICAgQVZDUGljdHVyZURhdGEgKmN1cnJQaWMgPSB2aWRlby0+Y3VyclBpYzsKKyAgICBBVkNGcmFtZUlPICAqY3VycklucHV0ID0gZW5jdmlkLT5jdXJySW5wdXQ7CisgICAgQVZDTWFjcm9ibG9jayAqY3Vyck1CID0gdmlkZW8tPmN1cnJNQjsKKyAgICBBVkNNYWNyb2Jsb2NrICpNQl9BLCAqTUJfQjsKKyAgICBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSA9IGVuY3ZpZC0+Yml0c3RyZWFtOworICAgIEFWQ1JhdGVDb250cm9sICpyYXRlQ3RybCA9IGVuY3ZpZC0+cmF0ZUN0cmw7CisgICAgdWludDggKmN1ciwgKmN1ckwsICpjdXJDYiwgKmN1ckNyOworICAgIHVpbnQ4ICpvcmdMLCAqb3JnQ2IsICpvcmdDciwgKm9yZzQ7CisgICAgaW50IEN1cnJNYkFkZHIgPSB2aWRlby0+bWJOdW07CisgICAgaW50IHBpY1BpdGNoID0gY3VyclBpYy0+cGl0Y2g7CisgICAgaW50IG9yZ1BpdGNoID0gY3VycklucHV0LT5waXRjaDsKKyAgICBpbnQgeF9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeCA8PCA0KTsKKyAgICBpbnQgeV9wb3NpdGlvbiA9ICh2aWRlby0+bWJfeSA8PCA0KTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBiOCwgYjQsIGJsa2lkeDsKKyAgICBBVkNSZXNpZHVhbFR5cGUgIHJlc1R5cGU7CisgICAgaW50IHNsaWNlX3R5cGU7CisgICAgaW50IG51bWNvZWZmOyAvKiBvdXRwdXQgZnJvbSByZXNpZHVhbF9ibG9ja19jYXZsYyAqLworICAgIGludCBjb3N0MTYsIGNvc3Q4OworCisgICAgaW50IG51bV9iaXRzLCBzdGFydF9tYl9iaXRzLCBzdGFydF90ZXh0X2JpdHM7CisKKyAgICBzbGljZV90eXBlID0gdmlkZW8tPnNsaWNlX3R5cGU7CisKKyAgICAvKiBub3csIHBvaW50IHRvIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lICovCisgICAgb2Zmc2V0ID0geV9wb3NpdGlvbiAqIHBpY1BpdGNoICsgeF9wb3NpdGlvbjsKKyAgICBjdXJMID0gY3VyclBpYy0+U2wgKyBvZmZzZXQ7CisgICAgb3JnTCA9IGN1cnJJbnB1dC0+WUNiQ3JbMF0gKyBvZmZzZXQ7CisgICAgb2Zmc2V0ID0gKG9mZnNldCArIHhfcG9zaXRpb24pID4+IDI7CisgICAgY3VyQ2IgPSBjdXJyUGljLT5TY2IgKyBvZmZzZXQ7CisgICAgY3VyQ3IgPSBjdXJyUGljLT5TY3IgKyBvZmZzZXQ7CisgICAgb3JnQ2IgPSBjdXJySW5wdXQtPllDYkNyWzFdICsgb2Zmc2V0OworICAgIG9yZ0NyID0gY3VycklucHV0LT5ZQ2JDclsyXSArIG9mZnNldDsKKworICAgIGlmIChvcmdQaXRjaCAhPSBwaWNQaXRjaCkKKyAgICB7CisgICAgICAgIG9mZnNldCA9IHlfcG9zaXRpb24gKiAob3JnUGl0Y2ggLSBwaWNQaXRjaCk7CisgICAgICAgIG9yZ0wgKz0gb2Zmc2V0OworICAgICAgICBvZmZzZXQgPj49IDI7CisgICAgICAgIG9yZ0NiICs9IG9mZnNldDsKKyAgICAgICAgb3JnQ3IgKz0gb2Zmc2V0OworICAgIH0KKworICAgIC8qKioqKioqIGRldGVybWluZSBNQiBwcmVkaWN0aW9uIG1vZGUgKioqKioqKi8KKyAgICBpZiAoZW5jdmlkLT5pbnRyYVNlYXJjaFtDdXJyTWJBZGRyXSkKKyAgICB7CisgICAgICAgIE1CSW50cmFTZWFyY2goZW5jdmlkLCBDdXJyTWJBZGRyLCBjdXJMLCBwaWNQaXRjaCk7CisgICAgfQorICAgIC8qKioqKioqIFRoaXMgcGFydCBzaG91bGQgYmUgZGV0ZXJtaW5lZCBzb21laG93ICoqKioqKioqKioqKioqKi8KKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0lfUENNKQorICAgIHsKKyAgICAgICAgLyogd3JpdGUgZG93biBtYl90eXBlIGFuZCBQQ00gZGF0YSAqLworICAgICAgICAvKiBhbmQgY29weSBmcm9tIGN1cnJJbnB1dCB0byBjdXJyUGljICovCisgICAgICAgIHN0YXR1cyA9IEVuY29kZUludHJhUENNKGVuY3ZpZCk7CisKKworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8qKioqKiogZm9yIGludHJhIHByZWRpY3Rpb24sIHByZWQgaXMgYWxyZWFkeSBkb25lICoqKioqKiovCisgICAgLyoqKioqKiBmb3IgSTQsIHRoZSByZWNvbiBpcyByZWFkeSBhbmQgWGZybSBjb2VmcyBhcmUgcmVhZHkgdG8gYmUgZW5jb2RlZCAqKioqKi8KKworICAgIC8vUkNDYWxjdWxhdGVNQUQoZW5jdmlkLGN1cnJNQixvcmdMLG9yZ1BpdGNoKTsgLy8gbm8gbmVlZCB0byByZS1jYWxjdWxhdGUgTUFEIGZvciBJbnRyYQorICAgIC8vIG5vdCB1c2VkIHNpbmNlIHRvdGFsU0FEIGlzIHVzZWQgaW5zdGVhZAorCisgICAgLyogY29tcHV0ZSB0aGUgcHJlZGljdGlvbiAqLworICAgIC8qIG91dHB1dCBpcyB2aWRlby0+cHJlZF9ibG9jayAqLworICAgIGlmICghY3Vyck1CLT5tYl9pbnRyYSkKKyAgICB7CisgICAgICAgIEFWQ01CTW90aW9uQ29tcChlbmN2aWQsIHZpZGVvKTsgLyogcGVyZm9ybSBwcmVkaWN0aW9uIGFuZCByZXNpZHVlIGNhbGN1bGF0aW9uICovCisgICAgICAgIC8qIHdlIGNhbiBkbyB0aGUgbG9vcCBoZXJlIGFuZCBjYWxsIGRjdF9sdW1hICovCisgICAgICAgIHZpZGVvLT5wcmVkX3BpdGNoID0gcGljUGl0Y2g7CisgICAgICAgIGN1cnJNQi0+Q0JQID0gMDsKKyAgICAgICAgY29zdDE2ID0gMDsKKyAgICAgICAgY3VyID0gY3VyTDsKKyAgICAgICAgb3JnNCA9IG9yZ0w7CisKKyAgICAgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29zdDggPSAwOworCisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJsa2lkeCA9IGJsa0lkeDJibGtYWVtiOF1bYjRdOworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmVkX2Jsb2NrID0gY3VyOworICAgICAgICAgICAgICAgIG51bWNvZWZmID0gZGN0X2x1bWEoZW5jdmlkLCBibGtpZHgsIGN1ciwgb3JnNCwgJmNvc3Q4KTsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeF0gPSBudW1jb2VmZjsKKyAgICAgICAgICAgICAgICBpZiAobnVtY29lZmYpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2aWRlby0+Y2JwNHg0IHw9ICgxIDw8IGJsa2lkeCk7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9ICgxIDw8IGI4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYjQmMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1ciArPSAoKHBpY1BpdGNoIDw8IDIpIC0gNCk7CisgICAgICAgICAgICAgICAgICAgIG9yZzQgKz0gKChvcmdQaXRjaCA8PCAyKSAtIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXIgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgb3JnNCArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbW92ZSB0aGUgSURDVCBwYXJ0IG91dCBvZiBkY3RfbHVtYSB0byBhY2NvbW1vZGF0ZSB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgIGZvciBjb2VmZl9jb3N0LiAqLworCisgICAgICAgICAgICBpZiAoKGN1cnJNQi0+Q0JQJigxIDw8IGI4KSkgJiYgKGNvc3Q4IDw9IF9MVU1BX0NPRUZGX0NPU1RfKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3N0OCA9IDA7IC8vIHJlc2V0IGl0CisKKyAgICAgICAgICAgICAgICBjdXJyTUItPkNCUCBePSAoMSA8PCBiOCk7CisgICAgICAgICAgICAgICAgYmxraWR4ID0gYmxrSWR4MmJsa1hZW2I4XVswXTsKKworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4XSA9IDA7CisgICAgICAgICAgICAgICAgY3Vyck1CLT5uel9jb2VmZltibGtpZHgrMV0gPSAwOworICAgICAgICAgICAgICAgIGN1cnJNQi0+bnpfY29lZmZbYmxraWR4KzRdID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyTUItPm56X2NvZWZmW2Jsa2lkeCs1XSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvc3QxNiArPSBjb3N0ODsKKworICAgICAgICAgICAgaWYgKGI4JjEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VyIC09IDg7CisgICAgICAgICAgICAgICAgb3JnNCAtPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1ciArPSAoOCAtIChwaWNQaXRjaCA8PCAzKSk7CisgICAgICAgICAgICAgICAgb3JnNCArPSAoOCAtIChvcmdQaXRjaCA8PCAzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBhZnRlciB0aGUgd2hvbGUgTUIsIHdlIGRvIGFub3RoZXIgY2hlY2sgZm9yIGNvZWZmX2Nvc3QgKi8KKyAgICAgICAgaWYgKChjdXJyTUItPkNCUCYweEYpICYmIChjb3N0MTYgPD0gX0xVTUFfTUJfQ09FRkZfQ09TVF8pKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyTUItPkNCUCA9IDA7ICAvLyByZXNldCBpdCB0byB6ZXJvCisgICAgICAgICAgICBtZW1zZXQoY3Vyck1CLT5uel9jb2VmZiwgMCwgc2l6ZW9mKHVpbnQ4KSoxNik7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3cgd2UgZG8gSURDVAorICAgICAgICBNQkludGVySWRjdCh2aWRlbywgY3VyTCwgY3Vyck1CLCBwaWNQaXRjaCk7CisKKy8vICAgICAgdmlkZW8tPnByZWRfYmxvY2sgPSB2aWRlby0+cHJlZCArIDI1NjsKKyAgICB9CisgICAgZWxzZSAgICAvKiBJbnRyYSBwcmVkaWN0aW9uICovCisgICAgeworICAgICAgICBlbmN2aWQtPm51bUludHJhTUIrKzsKKworICAgICAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikgLyogZG8gcHJlZGljdGlvbiBmb3IgdGhlIHdob2xlIG1hY3JvYmxvY2sgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY3Vyck1CLT5DQlAgPSAwOworICAgICAgICAgICAgLyogZ2V0IHRoZSBwcmVkaWN0aW9uIGZyb20gZW5jdmlkLT5wcmVkX2kxNiAqLworICAgICAgICAgICAgZGN0X2x1bWFfMTZ4MTYoZW5jdmlkLCBjdXJMLCBvcmdMKTsKKyAgICAgICAgfQorICAgICAgICB2aWRlby0+cHJlZF9ibG9jayA9IGVuY3ZpZC0+cHJlZF9pY1tjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGVdOworICAgIH0KKworICAgIC8qIGNocm9taW5hbmNlICovCisgICAgLyogbm90IG5lZWQgdG8gZG8gYW55dGhpbmcsIHRoZSByZXN1bHQgaXMgaW4gZW5jdmlkLT5wcmVkX2ljCisgICAgY2hyb21hIGRjdCBtdXN0IGJlIGF3YXJlIHRoYXQgcHJlZGljdGlvbiBibG9jayBjYW4gY29tZSBmcm9tIGVpdGhlciBpbnRyYSBvciBpbnRlci4gKi8KKworICAgIGRjdF9jaHJvbWEoZW5jdmlkLCBjdXJDYiwgb3JnQ2IsIDApOworCisgICAgZGN0X2Nocm9tYShlbmN2aWQsIGN1ckNyLCBvcmdDciwgMSk7CisKKworICAgIC8qIDQuMSBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gdGhlcmUsIHZpZGVvLT5tYl9za2lwX3J1bisrICovCisgICAgLyogNC4yIGlmIGNvZGVkLCBjaGVjayBpZiB0aGVyZSBpcyBhIHJ1biBvZiBza2lwcGVkIE1CLCBlbmNvZGVzIGl0LAorICAgICAgICAgICAgc2V0IHZpZGVvLT5RUHlwcmV2ID0gY3Vyck1CLT5RUHk7ICovCisKKyAgICAvKiA1LiB2bGMgZW5jb2RlICovCisKKyAgICAvKiBjaGVjayBmb3Igc2tpcHBlZCBtYWNyb2Jsb2NrLCBJTlRFUiBvbmx5ICovCisgICAgaWYgKCFjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgLyogZGVjaWRlIHdoZXRoZXIgdGhpcyBNQiAoZm9yIGludGVyIE1CKSBzaG91bGQgYmUgc2tpcHBlZCBpZiB0aGVyZSdzIG5vdGhpbmcgbGVmdC4gKi8KKyAgICAgICAgaWYgKCFjdXJyTUItPkNCUCAmJiBjdXJyTUItPk51bU1iUGFydCA9PSAxICYmIGN1cnJNQi0+UVB5ID09IHZpZGVvLT5RUHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID09IEFWQ19QcmVkX0wwICYmIGN1cnJNQi0+cmVmX2lkeF9MMFswXSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE1CX0EgPSAmdmlkZW8tPm1ibG9ja1t2aWRlby0+bWJBZGRyQV07CisgICAgICAgICAgICAgICAgTUJfQiA9ICZ2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXTsKKworICAgICAgICAgICAgICAgIGlmICghdmlkZW8tPm1iQXZhaWxBIHx8ICF2aWRlby0+bWJBdmFpbEIpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyck1CLT5tdkwwWzBdID09IDApIC8qIGJvdGggbXYgY29tcG9uZW50cyBhcmUgemVyb3MuKi8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLT5tdmRfbDBbMF1bMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChNQl9BLT5yZWZfaWR4X0wwWzFdID09IDAgJiYgTUJfQS0+bXZMMFszXSA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNQl9CLT5yZWZfaWR4X0wwWzJdID09IDAgJiYgTUJfQi0+bXZMMFsxMl0gPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyTUItPm12TDBbMF0gPT0gMCkgLyogYm90aCBtdiBjb21wb25lbnRzIGFyZSB6ZXJvcy4qLworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPm12ZF9sMFswXVswXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodmlkZW8tPm12ZF9sMFswXVswXVswXSA9PSAwICYmIHZpZGVvLT5tdmRfbDBbMF1bMF1bMV0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgPSBBVkNfU0tJUDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19TS0lQKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZpZGVvLT5tYl9za2lwX3J1bisrOworCisgICAgICAgICAgICAgICAgLyogc2V0IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgICAgICAgICAvKiBub3Qgc3VyZSB3aGV0aGVyIHdlIG5lZWQgdGhlIGZvbGxvd2luZ3MgKi8KKyAgICAgICAgICAgICAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+bWJNb2RlID0gQVZDX1NLSVA7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TWJQYXJ0V2lkdGggPSBjdXJyTUItPk1iUGFydEhlaWdodCA9IDE2OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID0gQVZDX1ByZWRfTDA7CisgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtTWJQYXJ0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1TdWJNYlBhcnRbMF0gPSBjdXJyTUItPk51bVN1Yk1iUGFydFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJNQi0+TnVtU3ViTWJQYXJ0WzJdID0gY3Vyck1CLT5OdW1TdWJNYlBhcnRbM10gPSAxOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydFdpZHRoWzBdID0gY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRXaWR0aFsyXSA9IGN1cnJNQi0+U3ViTWJQYXJ0V2lkdGhbM10gPSBjdXJyTUItPk1iUGFydFdpZHRoOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFswXSA9IGN1cnJNQi0+U3ViTWJQYXJ0SGVpZ2h0WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5TdWJNYlBhcnRIZWlnaHRbMl0gPSBjdXJyTUItPlN1Yk1iUGFydEhlaWdodFszXSA9IGN1cnJNQi0+TWJQYXJ0SGVpZ2h0OworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX0JfU0xJQ0UpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPm1iTW9kZSA9IEFWQ19TS0lQOworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1iUGFydFdpZHRoID0gY3Vyck1CLT5NYlBhcnRIZWlnaHQgPSA4OworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdID0gQVZDX0RpcmVjdDsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck1CLT5OdW1NYlBhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBmb3Igc2tpcHBlZCBNQiwgYWx3YXlzIGxvb2sgYXQgdGhlIGZpcnN0IGVudHJ5IGluIFJlZlBpY0xpc3QgKi8KKyAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFswXSA9IGN1cnJNQi0+UmVmSWR4WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyTUItPlJlZklkeFsyXSA9IGN1cnJNQi0+UmVmSWR4WzNdID0gdmlkZW8tPlJlZlBpY0xpc3QwWzBdLT5SZWZJZHg7CisKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmV0dXJuIHlldCwgbmVlZCB0byBkbyBzb21lIGNvcGllcyAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIG5vbi1za2lwcGVkIE1CICovCisKKworICAgIC8qKioqKioqKioqKioqIFNUQVJUIEVOVFJPUFkgQ09ESU5HICoqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBzdGFydF9tYl9iaXRzID0gMzIgKyAoZW5jdmlkLT5iaXRzdHJlYW0tPndyaXRlX3BvcyA8PCAzKSAtIGVuY3ZpZC0+Yml0c3RyZWFtLT5iaXRfbGVmdDsKKworICAgIC8qIGVuY29kZSBtYl90eXBlLCBtYl9wcmVkLCBzdWJfbWJfcHJlZCwgQ0JQICovCisgICAgaWYgKHNsaWNlX3R5cGUgIT0gQVZDX0lfU0xJQ0UgJiYgc2xpY2VfdHlwZSAhPSBBVkNfU0lfU0xJQ0UgJiYgY3Vyck1CLT5tYk1vZGUgIT0gQVZDX1NLSVApCisgICAgeworICAgICAgICAvL2lmKCFwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZykgIEFMV0FZUyB0cnVlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVlX3Yoc3RyZWFtLCB2aWRlby0+bWJfc2tpcF9ydW4pOworICAgICAgICAgICAgdmlkZW8tPm1iX3NraXBfcnVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iTW9kZSAhPSBBVkNfU0tJUCkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEVuY29kZU1CSGVhZGVyKGN1cnJNQiwgZW5jdmlkKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXJ0X3RleHRfYml0cyA9IDMyICsgKGVuY3ZpZC0+Yml0c3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBlbmN2aWQtPmJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICAvKioqKiBub3cgZGVjb2RpbmcgcGFydCAqKioqKioqLworICAgIHJlc1R5cGUgPSBBVkNfTHVtYTsKKworICAgIC8qIERDIHRyYW5zZm9ybSBmb3IgbHVtYSBJMTYgbW9kZSAqLworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgQVZDX0ludHJhMTZEQywgZW5jdmlkLT5udW1jb2VmZGMsIGN1cnJNQik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQVZDRU5DX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmVzVHlwZSA9IEFWQ19JbnRyYTE2QUM7CisgICAgfQorCisgICAgLyogVkxDIGVuY29kaW5nIGZvciBsdW1hICovCisgICAgZm9yIChiOCA9IDA7IGI4IDwgNDsgYjgrKykKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPkNCUCYoMSA8PCBiOCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoYjQgPSAwOyBiNCA8IDQ7IGI0KyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCByZXNUeXBlLCAoYjggPDwgMikgKyBiNCwgY3Vyck1CKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEFWQ0VOQ19TVUNDRVNTKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaHJvbWEgKi8KKyAgICBpZiAoY3Vyck1CLT5DQlAgJiAoMyA8PCA0KSkgLyogY2hyb21hIERDIHJlc2lkdWFsIHByZXNlbnQgKi8KKyAgICB7CisgICAgICAgIGZvciAoYjggPSAwOyBiOCA8IDI7IGI4KyspIC8qIGZvciBpQ2JDciAqLworICAgICAgICB7CisgICAgICAgICAgICAvKiB2bGMgZW5jb2RlIGxldmVsL3J1biAqLworICAgICAgICAgICAgc3RhdHVzID0gZW5jX3Jlc2lkdWFsX2Jsb2NrKGVuY3ZpZCwgQVZDX0Nocm9tYURDLCBlbmN2aWQtPm51bWNvZWZjZGNbYjhdICsgKGI4IDw8IDMpLCBjdXJyTUIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJNQi0+Q0JQICYgKDIgPDwgNCkpCisgICAgeworICAgICAgICAvKiBBQyBwYXJ0ICovCisgICAgICAgIGZvciAoYjggPSAwOyBiOCA8IDI7IGI4KyspIC8qIGZvciBpQ2JDciAqLworICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGI0ID0gMDsgYjQgPCA0OyBiNCsrKSAgLyogZm9yIGVhY2ggYmxvY2sgaW5zaWRlIENiIG9yIENyICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogdmxjIGVuY29kZSBsZXZlbC9ydW4gKi8KKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNfcmVzaWR1YWxfYmxvY2soZW5jdmlkLCBBVkNfQ2hyb21hQUMsIDE2ICsgKGI4IDw8IDIpICsgYjQsIGN1cnJNQik7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBVkNFTkNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBudW1fYml0cyA9IDMyICsgKGVuY3ZpZC0+Yml0c3RyZWFtLT53cml0ZV9wb3MgPDwgMykgLSBlbmN2aWQtPmJpdHN0cmVhbS0+Yml0X2xlZnQ7CisKKyAgICBSQ1Bvc3RNQih2aWRlbywgcmF0ZUN0cmwsIHN0YXJ0X3RleHRfYml0cyAtIHN0YXJ0X21iX2JpdHMsCisgICAgICAgICAgICAgbnVtX2JpdHMgLSBzdGFydF90ZXh0X2JpdHMpOworCisvLyAgbnVtX2JpdHMgLT0gc3RhcnRfbWJfYml0czsKKy8vICBmcHJpbnRmKGZkZWJ1ZywiTUIgIyVkOiAlZCBiaXRzXG4iLEN1cnJNYkFkZHIsbnVtX2JpdHMpOworLy8gIGZjbG9zZShmZGVidWcpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIGNvcHkgdGhlIGNvbnRlbnQgZnJvbSBwcmVkQmxvY2sgYmFjayB0byB0aGUgcmVjb25zdHJ1Y3RlZCBZVVYgZnJhbWUgKi8KK3ZvaWQgQ29weV9NQih1aW50OCAqY3VyTCwgdWludDggKmN1ckNiLCB1aW50OCAqY3VyQ3IsIHVpbnQ4ICpwcmVkQmxvY2ssIGludCBwaWNQaXRjaCkKK3sKKyAgICBpbnQgaiwgb2Zmc2V0OworICAgIHVpbnQzMiAqZHN0LCAqZHN0MiwgKnNyYzsKKworICAgIGRzdCA9ICh1aW50MzIqKWN1ckw7CisgICAgc3JjID0gKHVpbnQzMiopcHJlZEJsb2NrOworCisgICAgb2Zmc2V0ID0gKHBpY1BpdGNoIC0gMTYpID4+IDI7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICB7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QrKyA9ICpzcmMrKzsKKworICAgICAgICBkc3QgKz0gb2Zmc2V0OworICAgIH0KKworICAgIGRzdCA9ICh1aW50MzIqKWN1ckNiOworICAgIGRzdDIgPSAodWludDMyKiljdXJDcjsKKyAgICBvZmZzZXQgPj49IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgIHsKKyAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICAqZHN0KysgPSAqc3JjKys7CisgICAgICAgICpkc3QyKysgPSAqc3JjKys7CisgICAgICAgICpkc3QyKysgPSAqc3JjKys7CisKKyAgICAgICAgZHN0ICs9IG9mZnNldDsKKyAgICAgICAgZHN0MiArPSBvZmZzZXQ7CisgICAgfQorICAgIHJldHVybiA7Cit9CisKKy8qIGVuY29kZSBtYl90eXBlLCBtYl9wcmVkLCBzdWJfbWJfcHJlZCwgQ0JQICovCisvKiBkZWNpZGUgd2hldGhlciB0aGlzIE1CIChmb3IgaW50ZXIgTUIpIHNob3VsZCBiZSBza2lwcGVkICovCitBVkNFbmNfU3RhdHVzIEVuY29kZU1CSGVhZGVyKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jT2JqZWN0ICplbmN2aWQpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICB1aW50IG1iX3R5cGU7CisgICAgQVZDQ29tbW9uT2JqICp2aWRlbyA9IGVuY3ZpZC0+Y29tbW9uOworICAgIEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtID0gZW5jdmlkLT5iaXRzdHJlYW07CisKKyAgICBpZiAoY3Vyck1CLT5DQlAgPiA0NykgICAvKiBjaHJvbWEgQ0JQIGlzIDExICovCisgICAgeworICAgICAgICBjdXJyTUItPkNCUCAtPSAxNjsgIC8qIHJlbW92ZSB0aGUgNXRoIGJpdCBmcm9tIHRoZSByaWdodCAqLworICAgIH0KKworICAgIG1iX3R5cGUgPSBJbnRlcnByZXRNQlR5cGUoY3Vyck1CLCB2aWRlby0+c2xpY2VfdHlwZSk7CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgbWJfdHlwZSk7CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX1A4IHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgeworICAgICAgICBzdGF0dXMgPSBzdWJfbWJfcHJlZCh2aWRlbywgY3Vyck1CLCBzdHJlYW0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzdGF0dXMgPSBtYl9wcmVkKHZpZGVvLCBjdXJyTUIsIHN0cmVhbSkgOworICAgIH0KKworICAgIGlmIChjdXJyTUItPm1iTW9kZSAhPSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgLyogZGVjb2RlIGNvZGVkX2Jsb2NrX3BhdHRlcm4gKi8KKyAgICAgICAgc3RhdHVzID0gRW5jb2RlQ0JQKGN1cnJNQiwgc3RyZWFtKTsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgY3Vyck1CLT5tYl9xcF9kZWx0YSA9IGN1cnJNQi0+UVB5IC0gdmlkZW8tPlFQeXByZXYgKi8KKyAgICBpZiAoY3Vyck1CLT5DQlAgPiAwIHx8IGN1cnJNQi0+bWJNb2RlID09IEFWQ19JMTYpCisgICAgeworICAgICAgICBzdGF0dXMgPSBzZV92KHN0cmVhbSwgY3Vyck1CLT5RUHkgLSB2aWRlby0+UVB5KTsKKyAgICAgICAgdmlkZW8tPlFQeSA9IGN1cnJNQi0+UVB5OyAvKiA9ICh2aWRlby0+UVB5cHJldiArIGN1cnJNQi0+bWJfcXBfZGVsdGEgKyA1MiklNTI7ICovCisgICAgICAgIC8vIG5vIG5lZWQgdmlkZW8tPlFQYyA9IGN1cnJNQi0+UVBjOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoY3Vyck1CLT5RUHkgIT0gdmlkZW8tPlFQeSkgLy8gY3VycmVudCBRUCBpcyBub3QgdGhlIHNhbWUgYXMgcHJldmlvdXMgUVAKKyAgICAgICAgeworICAgICAgICAgICAgLyogcmVzdG9yZSB0aGVzZSB2YWx1ZXMgKi8KKyAgICAgICAgICAgIFJDUmVzdG9yZVFQKGN1cnJNQiwgdmlkZW8sIGVuY3ZpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKy8qIGlucHV0cyBhcmUgbWJNb2RlLCBtYl9pbnRyYSwgaTE2TW9kZSwgQ0JQLCBOdW1NYlBhcnQsIE1iUGFydFdpZHRoLCBNYlBhcnRIZWlnaHQgKi8KK3VpbnQgSW50ZXJwcmV0TUJUeXBlKEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgaW50IHNsaWNlX3R5cGUpCit7CisgICAgaW50IENCUF9jaHJvbTsKKyAgICBpbnQgbWJfdHlwZTsvLyBwYXJ0MSwgcGFydDIsIHBhcnQzOworLy8gIGNvbnN0IHN0YXRpYyBpbnQgTWFwUGFydHMyVHlwZVsyXVszXVszXT17e3s0LDgsMTJ9LHsxMCw2LDE0fSx7MTYsMTgsMjB9fSwKKy8vICB7ezUsOSwxM30sezExLDcsMTV9LHsxNywxOSwyMX19fTsKKworICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgeworICAgICAgICAgICAgbWJfdHlwZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0kxNikKKyAgICAgICAgeworICAgICAgICAgICAgQ0JQX2Nocm9tID0gKGN1cnJNQi0+Q0JQICYgMHgzMCk7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5DQlAmMHhGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJNQi0+Q0JQIHw9IDB4RjsgIC8qIGVpdGhlciAweDAgb3IgMHhGICovCisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDEzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWJfdHlwZSArPSAoQ0JQX2Nocm9tID4+IDIpICsgY3Vyck1CLT5pMTZNb2RlOworICAgICAgICB9CisgICAgICAgIGVsc2UgLyogaWYoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0lfUENNKSAqLworICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlID0gMjU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsgIC8qIFAtTUIgKi8vKiBub3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBlbnVtIEFWQ01CTW9kZSBjYW5ub3QgYmUgY2hhbmdlZAorICAgICAgICBzaW5jZSB3ZSB1c2UgaXQgaGVyZS4gKi8KKyAgICAgICAgbWJfdHlwZSA9IGN1cnJNQi0+bWJNb2RlIC0gQVZDX1AxNjsKKyAgICB9CisKKyAgICBpZiAoc2xpY2VfdHlwZSA9PSBBVkNfUF9TTElDRSkKKyAgICB7CisgICAgICAgIGlmIChjdXJyTUItPm1iX2ludHJhKQorICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlICs9IDU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gZm9sbG93aW5nIGNvZGVzIGhhdmUgbm90IGJlZW4gdGVzdGVkIHlldCwgbm90IG5lZWRlZC4KKyAgICAvKiAgZWxzZSBpZihzbGljZV90eXBlID09IEFWQ19CX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfQkRpcmVjdDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDE2KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdICsgMTsgLy8gMSBvciAyCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gMjY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKGN1cnJNQi0+bWJNb2RlID09IEFWQ19QOHJlZjApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWJfdHlwZSA9IDI3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhcnQxID0gY3Vyck1CLT5tYk1vZGUgLSBBVkNfUDE2eDg7CisgICAgICAgICAgICAgICAgcGFydDIgPSBjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdOworICAgICAgICAgICAgICAgIHBhcnQzID0gY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVsxXVswXTsKKyAgICAgICAgICAgICAgICBtYl90eXBlID0gTWFwUGFydHMyVHlwZVtwYXJ0MV1bcGFydDJdW3BhcnQzXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHNsaWNlX3R5cGUgPT0gQVZDX1NJX1NMSUNFKQorICAgICAgICB7CisgICAgICAgICAgICBtYl90eXBlKys7CisgICAgICAgIH0KKyAgICAqLworICAgIHJldHVybiAodWludCltYl90eXBlOworfQorCisvL2NvbnN0IHN0YXRpYyBpbnQgbWJQYXJ0MnJhc3RlclszXVs0XSA9IHt7MCwwLDAsMH0sezEsMSwwLDB9LHsxLDAsMSwwfX07CisKKy8qIHNlZSBzdWJjbGF1c2UgNy4zLjUuMSAqLworQVZDRW5jX1N0YXR1cyBtYl9wcmVkKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXMgPSBBVkNFTkNfU1VDQ0VTUzsKKyAgICBpbnQgbWJQYXJ0SWR4OworICAgIEFWQ1NsaWNlSGVhZGVyICpzbGljZUhkciA9IHZpZGVvLT5zbGljZUhkcjsKKyAgICBpbnQgbWF4X3JlZl9pZHg7CisgICAgdWludCBjb2RlOworCisgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCB8fCBjdXJyTUItPm1iTW9kZSA9PSBBVkNfSTE2KQorICAgIHsKKyAgICAgICAgaWYgKGN1cnJNQi0+bWJNb2RlID09IEFWQ19JNCkKKyAgICAgICAgeworICAgICAgICAgICAgLyogcGVyZm9ybSBwcmVkaWN0aW9uIHRvIGdldCB0aGUgYWN0dWFsIGludHJhIDR4NCBwcmVkIG1vZGUgKi8KKyAgICAgICAgICAgIEVuY29kZUludHJhNHg0TW9kZSh2aWRlbywgY3Vyck1CLCBzdHJlYW0pOworICAgICAgICAgICAgLyogb3V0cHV0IHdpbGwgYmUgaW4gY3Vyck1CLT5pNE1vZGVbNF1bNF0gKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qIGFzc3VtZSBhbHJlYWR5IHNldCBmcm9tIE1CUHJlZGljdGlvbigpICovCisgICAgICAgIHN0YXR1cyA9IHVlX3Yoc3RyZWFtLCBjdXJyTUItPmludHJhX2Nocm9tYV9wcmVkX21vZGUpOworICAgIH0KKyAgICBlbHNlIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlWzBdWzBdICE9IEFWQ19EaXJlY3QpCisgICAgeworCisgICAgICAgIG1lbXNldChjdXJyTUItPnJlZl9pZHhfTDAsIDAsIHNpemVvZihpbnQxNikqNCk7CisKKyAgICAgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgICAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgICAgICAvKiAgICAgIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSArIDE7CisgICAgICAgICovCisgICAgICAgIC8qIGRlY29kZSByZWYgaW5kZXggZm9yIEwwICovCisgICAgICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgvKihzbGljZUhkci0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMT4wIHx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykgJiYqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF07CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRlX3Yoc3RyZWFtLCBjb2RlLCBtYXhfcmVmX2lkeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgICAgICBtYXhfcmVmX2lkeCA9IHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOworICAgICAgICAvKiAgICAgIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIG1heF9yZWZfaWR4ID0gMipzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSArIDE7CisgICAgICAgICovCisgICAgICAgIC8qIGRlY29kZSByZWYgaW5kZXggZm9yIEwxICovCisgICAgICAgIGlmIChzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICgvKihzbGljZUhkci0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMT4wIHx8IGN1cnJNQi0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZykgJiYqLworICAgICAgICAgICAgICAgICAgICBjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wxW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBlbmNvZGUgbXZkX2wwICovCisgICAgICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgY3Vyck1CLT5OdW1NYlBhcnQ7IG1iUGFydElkeCsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bMF1bMF0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bMF1bMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIGVuY29kZSBtdmRfbDEgKi8KKyAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCBjdXJyTUItPk51bU1iUGFydDsgbWJQYXJ0SWR4KyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjdXJyTUItPk1CUGFydFByZWRNb2RlW21iUGFydElkeF1bMF0gIT0gQVZDX1ByZWRfTDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVswXVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVswXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgc3ViY2xhdXNlIDcuMy41LjIgKi8KK0FWQ0VuY19TdGF0dXMgc3ViX21iX3ByZWQoQVZDQ29tbW9uT2JqICp2aWRlbywgQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIGludCBtYlBhcnRJZHgsIHN1Yk1iUGFydElkeDsKKyAgICBBVkNTbGljZUhlYWRlciAqc2xpY2VIZHIgPSB2aWRlby0+c2xpY2VIZHI7CisgICAgdWludCBtYXhfcmVmX2lkeDsKKyAgICB1aW50IHNsaWNlX3R5cGUgPSB2aWRlby0+c2xpY2VfdHlwZTsKKyAgICB1aW50IHN1Yl9tYl90eXBlWzRdOworCisgICAgLyogdGhpcyBzaG91bGQgbW92ZSBzb21ld2hlcmUgZWxzZSB3aGVyZSB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgdGhpcyBjaGVjayAqLworICAgIGlmIChjdXJyTUItPm1iTW9kZSA9PSBBVkNfUDhyZWYwKQorICAgIHsKKyAgICAgICAgbWVtc2V0KGN1cnJNQi0+cmVmX2lkeF9MMCwgMCwgc2l6ZW9mKGludDE2KSo0KTsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSB2YWx1ZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIHZhbGlkICAqLworICAgIC8qIGFzc2lnbiB2YWx1ZXMgdG8gY3Vyck1CLT5zdWJfbWJfdHlwZVtdICovCisgICAgaWYgKHNsaWNlX3R5cGUgPT0gQVZDX1BfU0xJQ0UpCisgICAgeworICAgICAgICBJbnRlcnByZXRTdWJNQlR5cGVQKGN1cnJNQiwgc3ViX21iX3R5cGUpOworICAgIH0KKyAgICAvKiBubyBuZWVkIHRvIGNoZWNrIGZvciBCLXNsaWNlCisgICAgICAgIGVsc2UgaWYoc2xpY2VfdHlwZSA9PSBBVkNfQl9TTElDRSkKKyAgICAgICAgeworICAgICAgICAgICAgSW50ZXJwcmV0U3ViTUJUeXBlQihjdXJyTUIsc3ViX21iX3R5cGUpOworICAgICAgICB9Ki8KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgc3ViX21iX3R5cGVbbWJQYXJ0SWR4XSk7CisgICAgfQorCisgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czE7CisgICAgLyogIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgKyAxOyAqLworCisgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICB7CisgICAgICAgIGlmICgoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPiAwIC8qfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKi8pICYmCisgICAgICAgICAgICAgICAgY3Vyck1CLT5tYk1vZGUgIT0gQVZDX1A4cmVmMCAmJiAvKmN1cnJNQi0+c3ViTWJNb2RlW21iUGFydElkeF0hPUFWQ19CRGlyZWN0OCAmJiovCisgICAgICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wwW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgfQorICAgICAgICAvKiB1c2VkIGluIGRlYmxvY2tpbmcgKi8KKyAgICAgICAgY3Vyck1CLT5SZWZJZHhbbWJQYXJ0SWR4XSA9IHZpZGVvLT5SZWZQaWNMaXN0MFtjdXJyTUItPnJlZl9pZHhfTDBbbWJQYXJ0SWR4XV0tPlJlZklkeDsKKyAgICB9CisgICAgLyogc2VlIHN1YmNsYXVzZSA3LjQuNS4xIGZvciB0aGUgcmFuZ2Ugb2YgcmVmX2lkeF9sWCAqLworICAgIG1heF9yZWZfaWR4ID0gc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7CisgICAgLyogIGlmKHZpZGVvLT5NYmFmZkZyYW1lRmxhZyAmJiBjdXJyTUItPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcpCisgICAgICAgICAgICBtYXhfcmVmX2lkeCA9IDIqc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgKyAxOyovCisKKyAgICBpZiAoc2xpY2VIZHItPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChtYlBhcnRJZHggPSAwOyBtYlBhcnRJZHggPCA0OyBtYlBhcnRJZHgrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKC8qKHNsaWNlSGRyLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxPjAgfHwgY3Vyck1CLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnKSAmJiovCisgICAgICAgICAgICAgICAgLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgICAgIGN1cnJNQi0+TUJQYXJ0UHJlZE1vZGVbbWJQYXJ0SWR4XVswXSAhPSBBVkNfUHJlZF9MMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0ZV92KHN0cmVhbSwgY3Vyck1CLT5yZWZfaWR4X0wxW21iUGFydElkeF0sIG1heF9yZWZfaWR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBpZiAoLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wxKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wwW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDBbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAobWJQYXJ0SWR4ID0gMDsgbWJQYXJ0SWR4IDwgNDsgbWJQYXJ0SWR4KyspCisgICAgeworICAgICAgICBpZiAoLypjdXJyTUItPnN1Yk1iTW9kZVttYlBhcnRJZHhdIT1BVkNfQkRpcmVjdDggJiYqLworICAgICAgICAgICAgY3Vyck1CLT5NQlBhcnRQcmVkTW9kZVttYlBhcnRJZHhdWzBdICE9IEFWQ19QcmVkX0wwKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKHN1Yk1iUGFydElkeCA9IDA7IHN1Yk1iUGFydElkeCA8IGN1cnJNQi0+TnVtU3ViTWJQYXJ0W21iUGFydElkeF07IHN1Yk1iUGFydElkeCsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlX3Yoc3RyZWFtLCB2aWRlby0+bXZkX2wxW21iUGFydElkeF1bc3ViTWJQYXJ0SWR4XVswXSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc2VfdihzdHJlYW0sIHZpZGVvLT5tdmRfbDFbbWJQYXJ0SWR4XVtzdWJNYlBhcnRJZHhdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIGlucHV0IGlzIG1ibG9jay0+c3ViX21iX3R5cGVbXSAqLwordm9pZCBJbnRlcnByZXRTdWJNQlR5cGVQKEFWQ01hY3JvYmxvY2sgKm1ibG9jaywgdWludCAqc3ViX21iX3R5cGUpCit7CisgICAgaW50IGk7CisgICAgLyogc2VlIGVudW0gQVZDTUJUeXBlIGRlY2xhcmF0aW9uICovCisgICAgLypjb25zdCBzdGF0aWMgQVZDU3ViTUJNb2RlIG1hcDJzdWJNYk1vZGVbNF0gPSB7QVZDXzh4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzR4NH07CisgICAgY29uc3Qgc3RhdGljIGludCBtYXAyc3ViUGFydFdpZHRoWzRdID0gezgsOCw0LDR9OworICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbNF0gPSB7OCw0LDgsNH07CisgICAgY29uc3Qgc3RhdGljIGludCBtYXAybnVtU3ViUGFydFs0XSA9IHsxLDIsMiw0fTsqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQgOyBpKyspCisgICAgeworICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IG1ibG9jay0+c3ViTWJNb2RlW2ldIC0gQVZDXzh4ODsKKyAgICB9CisKKyAgICByZXR1cm4gOworfQorCit2b2lkIEludGVycHJldFN1Yk1CVHlwZUIoQVZDTWFjcm9ibG9jayAqbWJsb2NrLCB1aW50ICpzdWJfbWJfdHlwZSkKK3sKKyAgICBpbnQgaTsKKyAgICAvKiBzZWUgZW51bSBBVkNNQlR5cGUgZGVjbGFyYXRpb24gKi8KKyAgICAvKiAgY29uc3Qgc3RhdGljIEFWQ1N1Yk1CTW9kZSBtYXAyc3ViTWJNb2RlWzEzXSA9IHtBVkNfQkRpcmVjdDgsQVZDXzh4OCxBVkNfOHg4LAorICAgICAgICAgICAgQVZDXzh4OCxBVkNfOHg0LEFWQ180eDgsQVZDXzh4NCxBVkNfNHg4LEFWQ184eDQsQVZDXzR4OCxBVkNfNHg0LEFWQ180eDQsQVZDXzR4NH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRXaWR0aFsxM10gPSB7NCw4LDgsOCw4LDQsOCw0LDgsNCw0LDQsNH07CisgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgbWFwMnN1YlBhcnRIZWlnaHRbMTNdID0gezQsOCw4LDgsNCw4LDQsOCw0LDgsNCw0LDR9OworICAgICAgICBjb25zdCBzdGF0aWMgaW50IG1hcDJudW1TdWJQYXJ0WzEzXSA9IHs0LDEsMSwxLDIsMiwyLDIsMiwyLDQsNCw0fTsKKyAgICAgICAgY29uc3Qgc3RhdGljIGludCBtYXAycHJlZE1vZGVbMTNdID0gezMsMCwxLDIsMCwwLDEsMSwyLDIsMCwxLDJ9OyovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNCA7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChtYmxvY2stPnN1Yk1iTW9kZVtpXSA9PSBBVkNfQkRpcmVjdDgpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtYmxvY2stPnN1Yk1iTW9kZVtpXSA9PSBBVkNfOHg4KQorICAgICAgICB7CisgICAgICAgICAgICBzdWJfbWJfdHlwZVtpXSA9IDEgKyBtYmxvY2stPk1CUGFydFByZWRNb2RlW2ldWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG1ibG9jay0+c3ViTWJNb2RlW2ldID09IEFWQ180eDQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHN1Yl9tYl90eXBlW2ldID0gMTAgKyBtYmxvY2stPk1CUGFydFByZWRNb2RlW2ldWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3ViX21iX3R5cGVbaV0gPSA0ICsgKG1ibG9jay0+TUJQYXJ0UHJlZE1vZGVbaV1bMF0gPDwgMSkgKyAobWJsb2NrLT5zdWJNYk1vZGVbaV0gLSBBVkNfOHg0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiA7Cit9CisKKy8qIHNlZSBzdWJjbGF1c2UgOC4zLjEgKi8KK0FWQ0VuY19TdGF0dXMgRW5jb2RlSW50cmE0eDRNb2RlKEFWQ0NvbW1vbk9iaiAqdmlkZW8sIEFWQ01hY3JvYmxvY2sgKmN1cnJNQiwgQVZDRW5jQml0c3RyZWFtICpzdHJlYW0pCit7CisgICAgaW50IGludHJhNHg0UHJlZE1vZGVBID0gMDsKKyAgICBpbnQgaW50cmE0eDRQcmVkTW9kZUIsIHByZWRJbnRyYTR4NFByZWRNb2RlOworICAgIGludCBjb21wb25lbnQsIFN1YkJsb2NrX2luZHgsIGJsb2NrX3gsIGJsb2NrX3k7CisgICAgaW50IGRjT25seVByZWRpY3Rpb25GbGFnOworICAgIHVpbnQgICAgZmxhZzsKKyAgICBpbnQgICAgIHJlbSA9IDA7CisgICAgaW50ICAgICBtb2RlOworICAgIGludCBiaW5keCA9IDA7CisKKyAgICBmb3IgKGNvbXBvbmVudCA9IDA7IGNvbXBvbmVudCA8IDQ7IGNvbXBvbmVudCsrKSAvKiBwYXJ0aXRpb24gaW5kZXggKi8KKyAgICB7CisgICAgICAgIGJsb2NrX3ggPSAoKGNvbXBvbmVudCAmIDEpIDw8IDEpOworICAgICAgICBibG9ja195ID0gKChjb21wb25lbnQgPj4gMSkgPDwgMSk7CisKKyAgICAgICAgZm9yIChTdWJCbG9ja19pbmR4ID0gMDsgU3ViQmxvY2tfaW5keCA8IDQ7IFN1YkJsb2NrX2luZHgrKykgLyogc3ViLXBhcnRpdGlvbiBpbmRleCAqLworICAgICAgICB7CisgICAgICAgICAgICBkY09ubHlQcmVkaWN0aW9uRmxhZyA9IDA7CisgICAgICAgICAgICBpZiAoYmxvY2tfeCA+IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeSA8PCAyKSArIGJsb2NrX3ggLSAxIF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJBXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQSA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckFdLmk0TW9kZVsoYmxvY2tfeSA8PCAyKSArIDNdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUEgPSBBVkNfSTRfREM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGJsb2NrX3kgPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVCID0gY3Vyck1CLT5pNE1vZGVbKChibG9ja195LTEpIDw8IDIpICsgYmxvY2tfeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT5pbnRyYUF2YWlsQikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlby0+bWJsb2NrW3ZpZGVvLT5tYkFkZHJCXS5tYk1vZGUgPT0gQVZDX0k0KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRyYTR4NFByZWRNb2RlQiA9IHZpZGVvLT5tYmxvY2tbdmlkZW8tPm1iQWRkckJdLmk0TW9kZVsoMyA8PCAyKSArIGJsb2NrX3hdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGNPbmx5UHJlZGljdGlvbkZsYWcgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRjT25seVByZWRpY3Rpb25GbGFnKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludHJhNHg0UHJlZE1vZGVBID0gaW50cmE0eDRQcmVkTW9kZUIgPSBBVkNfSTRfREM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZWRJbnRyYTR4NFByZWRNb2RlID0gQVZDX01JTihpbnRyYTR4NFByZWRNb2RlQSwgaW50cmE0eDRQcmVkTW9kZUIpOworCisgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgIG1vZGUgPSBjdXJyTUItPmk0TW9kZVsoYmxvY2tfeTw8MikrYmxvY2tfeF07CisKKyAgICAgICAgICAgIGlmIChtb2RlID09IChBVkNJbnRyYTR4NFByZWRNb2RlKXByZWRJbnRyYTR4NFByZWRNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA8IHByZWRJbnRyYTR4NFByZWRNb2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlbSA9IG1vZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVtID0gbW9kZSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEJpdHN0cmVhbVdyaXRlMUJpdChzdHJlYW0sIGZsYWcpOworCisgICAgICAgICAgICBpZiAoIWZsYWcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgMywgcmVtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmluZHgrKzsKKyAgICAgICAgICAgIGJsb2NrX3kgKz0gKFN1YkJsb2NrX2luZHggJiAxKSA7CisgICAgICAgICAgICBibG9ja194ICs9ICgxIC0gMiAqIChTdWJCbG9ja19pbmR4ICYgMSkpIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmMvZW5jL3NyYy92bGNfZW5jb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJlNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Yy9lbmMvc3JjL3ZsY19lbmNvZGUuY3BwCkBAIC0wLDAgKzEsMzM2IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgImF2Y2VuY19saWIuaCIKKworLyoqCitTZWUgYWxnb3JpdGhtIGluIHN1YmNsYXVzZSA5LjEsIFRhYmxlIDktMSwgVGFibGUgOS0yLiAqLworQVZDRW5jX1N0YXR1cyB1ZV92KEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pCit7CisgICAgaWYgKEFWQ0VOQ19TVUNDRVNTICE9IFNldEVHQml0c3RyaW5nKGJpdHN0cmVhbSwgY29kZU51bSkpCisgICAgICAgIHJldHVybiBBVkNFTkNfRkFJTDsKKworICAgIHJldHVybiBBVkNFTkNfU1VDQ0VTUzsKK30KKworLyoqCitTZWUgc3ViY2xhdXNlIDkuMS4xLCBUYWJsZSA5LTMgKi8KK0FWQ0VuY19TdGF0dXMgIHNlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIGludCB2YWx1ZSkKK3sKKyAgICB1aW50IGNvZGVOdW07CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAodmFsdWUgPD0gMCkKKyAgICB7CisgICAgICAgIGNvZGVOdW0gPSAtdmFsdWUgKiAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjb2RlTnVtID0gdmFsdWUgKiAyIC0gMTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KGJpdHN0cmVhbSwgY29kZU51bSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBVkNFbmNfU3RhdHVzIHRlX3YoQVZDRW5jQml0c3RyZWFtICpiaXRzdHJlYW0sIHVpbnQgdmFsdWUsIHVpbnQgcmFuZ2UpCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisKKyAgICBpZiAocmFuZ2UgPiAxKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHVlX3YoYml0c3RyZWFtLCB2YWx1ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlMUJpdChiaXRzdHJlYW0sIDEgLSB2YWx1ZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorfQorCisvKioKK1NlZSBzdWJjbGF1c2UgOS4xLCBUYWJsZSA5LTEsIDktMi4gKi8KKy8vIGNvbXB1dGUgbGVhZGluZ1plcm9zIGFuZCBpbmZvcmJpdHMKKy8vY29kZU51bSA9ICgxPDxsZWFkaW5nWmVyb3MpLTEraW5mb2JpdHM7CitBVkNFbmNfU3RhdHVzIFNldEVHQml0c3RyaW5nKEFWQ0VuY0JpdHN0cmVhbSAqYml0c3RyZWFtLCB1aW50IGNvZGVOdW0pCit7CisgICAgQVZDRW5jX1N0YXR1cyBzdGF0dXM7CisgICAgaW50IGxlYWRpbmdaZXJvczsKKyAgICBpbnQgaW5mb2JpdHM7CisKKyAgICBpZiAoIWNvZGVOdW0pCisgICAgeworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZTFCaXQoYml0c3RyZWFtLCAxKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKiBjYWxjdWxhdGUgbGVhZGluZ1plcm9zIGFuZCBpbmZvYml0cyAqLworICAgIGxlYWRpbmdaZXJvcyA9IDE7CisgICAgd2hpbGUgKCh1aW50KSgxIDw8IGxlYWRpbmdaZXJvcykgPCBjb2RlTnVtICsgMikKKyAgICB7CisgICAgICAgIGxlYWRpbmdaZXJvcysrOworICAgIH0KKyAgICBsZWFkaW5nWmVyb3MtLTsKKyAgICBpbmZvYml0cyA9IGNvZGVOdW0gLSAoMSA8PCBsZWFkaW5nWmVyb3MpICsgMTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhiaXRzdHJlYW0sIGxlYWRpbmdaZXJvcywgMCk7CisgICAgaW5mb2JpdHMgfD0gKDEgPDwgbGVhZGluZ1plcm9zKTsKKyAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoYml0c3RyZWFtLCBsZWFkaW5nWmVyb3MgKyAxLCBpbmZvYml0cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyogc2VlIFRhYmxlIDktNCBhc3NpZ25tZW50IG9mIGNvZGVOdW0gdG8gdmFsdWVzIG9mIGNvZGVkX2Jsb2NrX3BhdHRlcm4uICovCitjb25zdCBzdGF0aWMgdWludDggTWFwQ0JQMmNvZGVbNDhdWzJdID0KK3sKKyAgICB7MywgMH0sIHsyOSwgMn0sIHszMCwgM30sIHsxNywgN30sIHszMSwgNH0sIHsxOCwgOH0sIHszNywgMTd9LCB7OCwgMTN9LCB7MzIsIDV9LCB7MzgsIDE4fSwgezE5LCA5fSwgezksIDE0fSwKKyAgICB7MjAsIDEwfSwgezEwLCAxNX0sIHsxMSwgMTZ9LCB7MiwgMTF9LCB7MTYsIDF9LCB7MzMsIDMyfSwgezM0LCAzM30sIHsyMSwgMzZ9LCB7MzUsIDM0fSwgezIyLCAzN30sIHszOSwgNDR9LCB7NCwgNDB9LAorICAgIHszNiwgMzV9LCB7NDAsIDQ1fSwgezIzLCAzOH0sIHs1LCA0MX0sIHsyNCwgMzl9LCB7NiwgNDJ9LCB7NywgNDN9LCB7MSwgMTl9LCB7NDEsIDZ9LCB7NDIsIDI0fSwgezQzLCAyNX0sIHsyNSwgMjB9LAorICAgIHs0NCwgMjZ9LCB7MjYsIDIxfSwgezQ2LCA0Nn0sIHsxMiwgMjh9LCB7NDUsIDI3fSwgezQ3LCA0N30sIHsyNywgMjJ9LCB7MTMsIDI5fSwgezI4LCAyM30sIHsxNCwgMzB9LCB7MTUsIDMxfSwgezAsIDEyfQorfTsKKworQVZDRW5jX1N0YXR1cyBFbmNvZGVDQlAoQVZDTWFjcm9ibG9jayAqY3Vyck1CLCBBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSkKK3sKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKyAgICB1aW50IGNvZGVOdW07CisKKyAgICBpZiAoY3Vyck1CLT5tYk1vZGUgPT0gQVZDX0k0KQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IE1hcENCUDJjb2RlW2N1cnJNQi0+Q0JQXVswXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29kZU51bSA9IE1hcENCUDJjb2RlW2N1cnJNQi0+Q0JQXVsxXTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB1ZV92KHN0cmVhbSwgY29kZU51bSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsQ29lZmZUcmFpbGluZ09uZXMoQVZDRW5jQml0c3RyZWFtICpzdHJlYW0sIGludCBUcmFpbGluZ09uZXMsIGludCBUb3RhbENvZWZmLCBpbnQgbkMpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IHRvdENvZWZmVHJhaWxPbmVbM11bNF1bMTddWzJdID0KKyAgICB7CisgICAgICAgIHsgICAvLyAwNzAyCisgICAgICAgICAgICB7ezEsIDF9LCB7NiwgNX0sIHs4LCA3fSwgezksIDd9LCB7MTAsIDd9LCB7MTEsIDd9LCB7MTMsIDE1fSwgezEzLCAxMX0sIHsxMywgOH0sIHsxNCwgMTV9LCB7MTQsIDExfSwgezE1LCAxNX0sIHsxNSwgMTF9LCB7MTYsIDE1fSwgezE2LCAxMX0sIHsxNiwgN30sIHsxNiwgNH19LAorICAgICAgICAgICAge3swLCAwfSwgezIsIDF9LCB7NiwgNH0sIHs4LCA2fSwgezksIDZ9LCB7MTAsIDZ9LCB7MTEsIDZ9LCB7MTMsIDE0fSwgezEzLCAxMH0sIHsxNCwgMTR9LCB7MTQsIDEwfSwgezE1LCAxNH0sIHsxNSwgMTB9LCB7MTUsIDF9LCB7MTYsIDE0fSwgezE2LCAxMH0sIHsxNiwgNn19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7MywgMX0sIHs3LCA1fSwgezgsIDV9LCB7OSwgNX0sIHsxMCwgNX0sIHsxMSwgNX0sIHsxMywgMTN9LCB7MTMsIDl9LCB7MTQsIDEzfSwgezE0LCA5fSwgezE1LCAxM30sIHsxNSwgOX0sIHsxNiwgMTN9LCB7MTYsIDl9LCB7MTYsIDV9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NSwgM30sIHs2LCAzfSwgezcsIDR9LCB7OCwgNH0sIHs5LCA0fSwgezEwLCA0fSwgezExLCA0fSwgezEzLCAxMn0sIHsxNCwgMTJ9LCB7MTQsIDh9LCB7MTUsIDEyfSwgezE1LCA4fSwgezE2LCAxMn0sIHsxNiwgOH19LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ezIsIDN9LCB7NiwgMTF9LCB7NiwgN30sIHs3LCA3fSwgezgsIDd9LCB7OCwgNH0sIHs5LCA3fSwgezExLCAxNX0sIHsxMSwgMTF9LCB7MTIsIDE1fSwgezEyLCAxMX0sIHsxMiwgOH0sIHsxMywgMTV9LCB7MTMsIDExfSwgezEzLCA3fSwgezE0LCA5fSwgezE0LCA3fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MiwgMn0sIHs1LCA3fSwgezYsIDEwfSwgezYsIDZ9LCB7NywgNn0sIHs4LCA2fSwgezksIDZ9LCB7MTEsIDE0fSwgezExLCAxMH0sIHsxMiwgMTR9LCB7MTIsIDEwfSwgezEzLCAxNH0sIHsxMywgMTB9LCB7MTQsIDExfSwgezE0LCA4fSwgezE0LCA2fX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7MCwgMH0sIHszLCAzfSwgezYsIDl9LCB7NiwgNX0sIHs3LCA1fSwgezgsIDV9LCB7OSwgNX0sIHsxMSwgMTN9LCB7MTEsIDl9LCB7MTIsIDEzfSwgezEyLCA5fSwgezEzLCAxM30sIHsxMywgOX0sIHsxMywgNn0sIHsxNCwgMTB9LCB7MTQsIDV9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NCwgNX0sIHs0LCA0fSwgezUsIDZ9LCB7NiwgOH0sIHs2LCA0fSwgezcsIDR9LCB7OSwgNH0sIHsxMSwgMTJ9LCB7MTEsIDh9LCB7MTIsIDEyfSwgezEzLCAxMn0sIHsxMywgOH0sIHsxMywgMX0sIHsxNCwgNH19LAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICB7ezQsIDE1fSwgezYsIDE1fSwgezYsIDExfSwgezYsIDh9LCB7NywgMTV9LCB7NywgMTF9LCB7NywgOX0sIHs3LCA4fSwgezgsIDE1fSwgezgsIDExfSwgezksIDE1fSwgezksIDExfSwgezksIDh9LCB7MTAsIDEzfSwgezEwLCA5fSwgezEwLCA1fSwgezEwLCAxfX0sCisgICAgICAgICAgICB7ezAsIDB9LCB7NCwgMTR9LCB7NSwgMTV9LCB7NSwgMTJ9LCB7NSwgMTB9LCB7NSwgOH0sIHs2LCAxNH0sIHs2LCAxMH0sIHs3LCAxNH0sIHs4LCAxNH0sIHs4LCAxMH0sIHs5LCAxNH0sIHs5LCAxMH0sIHs5LCA3fSwgezEwLCAxMn0sIHsxMCwgOH0sIHsxMCwgNH19LAorICAgICAgICAgICAge3swLCAwfSwgezAsIDB9LCB7NCwgMTN9LCB7NSwgMTR9LCB7NSwgMTF9LCB7NSwgOX0sIHs2LCAxM30sIHs2LCA5fSwgezcsIDEzfSwgezcsIDEwfSwgezgsIDEzfSwgezgsIDl9LCB7OSwgMTN9LCB7OSwgOX0sIHsxMCwgMTF9LCB7MTAsIDd9LCB7MTAsIDN9fSwKKyAgICAgICAgICAgIHt7MCwgMH0sIHswLCAwfSwgezAsIDB9LCB7NCwgMTJ9LCB7NCwgMTF9LCB7NCwgMTB9LCB7NCwgOX0sIHs0LCA4fSwgezUsIDEzfSwgezYsIDEyfSwgezcsIDEyfSwgezgsIDEyfSwgezgsIDh9LCB7OSwgMTJ9LCB7MTAsIDEwfSwgezEwLCA2fSwgezEwLCAyfX0KKyAgICAgICAgfQorICAgIH07CisKKworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzID0gQVZDRU5DX1NVQ0NFU1M7CisgICAgdWludCBjb2RlLCBsZW47CisgICAgaW50IHZsY251bTsKKworICAgIGlmIChUcmFpbGluZ09uZXMgPiAzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEFWQ0VOQ19UUkFJTElOR09ORVNfRkFJTDsKKyAgICB9CisKKyAgICBpZiAobkMgPj0gOCkKKyAgICB7CisgICAgICAgIGlmIChUb3RhbENvZWZmKQorICAgICAgICB7CisgICAgICAgICAgICBjb2RlID0gKChUb3RhbENvZWZmIC0gMSkgPDwgMikgfCAoVHJhaWxpbmdPbmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvZGUgPSAzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIDYsIGNvZGUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAobkMgPCAyKQorICAgICAgICB7CisgICAgICAgICAgICB2bGNudW0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKG5DIDwgNCkKKyAgICAgICAgeworICAgICAgICAgICAgdmxjbnVtID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHZsY251bSA9IDI7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSB0b3RDb2VmZlRyYWlsT25lW3ZsY251bV1bVHJhaWxpbmdPbmVzXVtUb3RhbENvZWZmXVswXTsKKyAgICAgICAgY29kZSA9IHRvdENvZWZmVHJhaWxPbmVbdmxjbnVtXVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzFdOworICAgICAgICBzdGF0dXMgPSBCaXRzdHJlYW1Xcml0ZUJpdHMoc3RyZWFtLCBsZW4sIGNvZGUpOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxDb2VmZlRyYWlsaW5nT25lc0Nocm9tYURDKEFWQ0VuY0JpdHN0cmVhbSAqc3RyZWFtLCBpbnQgVHJhaWxpbmdPbmVzLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggdG90Q29lZmZUcmFpbE9uZUNocm9tWzRdWzVdWzJdID0KKyAgICB7CisgICAgICAgIHsgezIsIDF9LCB7NiwgN30sIHs2LCA0fSwgezYsIDN9LCB7NiwgMn19LAorICAgICAgICB7IHswLCAwfSwgezEsIDF9LCB7NiwgNn0sIHs3LCAzfSwgezgsIDN9fSwKKyAgICAgICAgeyB7MCwgMH0sIHswLCAwfSwgezMsIDF9LCB7NywgMn0sIHs4LCAyfX0sCisgICAgICAgIHsgezAsIDB9LCB7MCwgMH0sIHswLCAwfSwgezYsIDV9LCB7NywgMH19LAorICAgIH07CisKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1cyA9IEFWQ0VOQ19TVUNDRVNTOworICAgIHVpbnQgY29kZSwgbGVuOworCisgICAgbGVuID0gdG90Q29lZmZUcmFpbE9uZUNocm9tW1RyYWlsaW5nT25lc11bVG90YWxDb2VmZl1bMF07CisgICAgY29kZSA9IHRvdENvZWZmVHJhaWxPbmVDaHJvbVtUcmFpbGluZ09uZXNdW1RvdGFsQ29lZmZdWzFdOworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS03IGFuZCA5LTggKi8KK0FWQ0VuY19TdGF0dXMgY2VfVG90YWxaZXJvcyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggbGVuVG90YWxaZXJvc1sxNV1bMTZdID0KKyAgICB7CisgICAgICAgIHsgMSwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgOX0sCisgICAgICAgIHsgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNSwgNSwgNiwgNiwgNiwgNn0sCisgICAgICAgIHsgNCwgMywgMywgMywgNCwgNCwgMywgMywgNCwgNSwgNSwgNiwgNSwgNn0sCisgICAgICAgIHsgNSwgMywgNCwgNCwgMywgMywgMywgNCwgMywgNCwgNSwgNSwgNX0sCisgICAgICAgIHsgNCwgNCwgNCwgMywgMywgMywgMywgMywgNCwgNSwgNCwgNX0sCisgICAgICAgIHsgNiwgNSwgMywgMywgMywgMywgMywgMywgNCwgMywgNn0sCisgICAgICAgIHsgNiwgNSwgMywgMywgMywgMiwgMywgNCwgMywgNn0sCisgICAgICAgIHsgNiwgNCwgNSwgMywgMiwgMiwgMywgMywgNn0sCisgICAgICAgIHsgNiwgNiwgNCwgMiwgMiwgMywgMiwgNX0sCisgICAgICAgIHsgNSwgNSwgMywgMiwgMiwgMiwgNH0sCisgICAgICAgIHsgNCwgNCwgMywgMywgMSwgM30sCisgICAgICAgIHsgNCwgNCwgMiwgMSwgM30sCisgICAgICAgIHsgMywgMywgMSwgMn0sCisgICAgICAgIHsgMiwgMiwgMX0sCisgICAgICAgIHsgMSwgMX0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RUb3RhbFplcm9zWzE1XVsxNl0gPQorICAgIHsKKyAgICAgICAgezEsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDMsIDIsIDF9LAorICAgICAgICB7NywgNiwgNSwgNCwgMywgNSwgNCwgMywgMiwgMywgMiwgMywgMiwgMSwgMH0sCisgICAgICAgIHs1LCA3LCA2LCA1LCA0LCAzLCA0LCAzLCAyLCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezMsIDcsIDUsIDQsIDYsIDUsIDQsIDMsIDMsIDIsIDIsIDEsIDB9LAorICAgICAgICB7NSwgNCwgMywgNywgNiwgNSwgNCwgMywgMiwgMSwgMSwgMH0sCisgICAgICAgIHsxLCAxLCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezEsIDEsIDUsIDQsIDMsIDMsIDIsIDEsIDEsIDB9LAorICAgICAgICB7MSwgMSwgMSwgMywgMywgMiwgMiwgMSwgMH0sCisgICAgICAgIHsxLCAwLCAxLCAzLCAyLCAxLCAxLCAxLCB9LAorICAgICAgICB7MSwgMCwgMSwgMywgMiwgMSwgMSwgfSwKKyAgICAgICAgezAsIDEsIDEsIDIsIDEsIDN9LAorICAgICAgICB7MCwgMSwgMSwgMSwgMX0sCisgICAgICAgIHswLCAxLCAxLCAxfSwKKyAgICAgICAgezAsIDEsIDF9LAorICAgICAgICB7MCwgMX0sCisgICAgfTsKKyAgICBpbnQgbGVuLCBjb2RlOworICAgIEFWQ0VuY19TdGF0dXMgc3RhdHVzOworCisgICAgbGVuID0gbGVuVG90YWxaZXJvc1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKyAgICBjb2RlID0gY29kVG90YWxaZXJvc1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKworICAgIHN0YXR1cyA9IEJpdHN0cmVhbVdyaXRlQml0cyhzdHJlYW0sIGxlbiwgY29kZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiBzZWUgVGFibGUgOS05ICovCitBVkNFbmNfU3RhdHVzIGNlX1RvdGFsWmVyb3NDaHJvbWFEQyhBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHRvdGFsX3plcm9zLCBpbnQgVG90YWxDb2VmZikKK3sKKyAgICBjb25zdCBzdGF0aWMgdWludDggbGVuVG90YWxaZXJvc0Nocm9tYURDWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMSwgMiwgMywgMywgfSwKKyAgICAgICAgeyAxLCAyLCAyLCAwLCB9LAorICAgICAgICB7IDEsIDEsIDAsIDAsIH0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RUb3RhbFplcm9zQ2hyb21hRENbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyAxLCAxLCAxLCAwLCB9LAorICAgICAgICB7IDEsIDEsIDAsIDAsIH0sCisgICAgICAgIHsgMSwgMCwgMCwgMCwgfSwKKyAgICB9OworCisgICAgaW50IGxlbiwgY29kZTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGxlbiA9IGxlblRvdGFsWmVyb3NDaHJvbWFEQ1tUb3RhbENvZWZmLTFdW3RvdGFsX3plcm9zXTsKKyAgICBjb2RlID0gY29kVG90YWxaZXJvc0Nocm9tYURDW1RvdGFsQ29lZmYtMV1bdG90YWxfemVyb3NdOworCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8qIHNlZSBUYWJsZSA5LTEwICovCitBVkNFbmNfU3RhdHVzIGNlX1J1bkJlZm9yZShBVkNFbmNCaXRzdHJlYW0gKnN0cmVhbSwgaW50IHJ1bl9iZWZvcmUsIGludCB6ZXJvc0xlZnQpCit7CisgICAgY29uc3Qgc3RhdGljIHVpbnQ4IGxlblJ1bkJlZm9yZVs3XVsxNl0gPQorICAgIHsKKyAgICAgICAgezEsIDF9LAorICAgICAgICB7MSwgMiwgMn0sCisgICAgICAgIHsyLCAyLCAyLCAyfSwKKyAgICAgICAgezIsIDIsIDIsIDMsIDN9LAorICAgICAgICB7MiwgMiwgMywgMywgMywgM30sCisgICAgICAgIHsyLCAzLCAzLCAzLCAzLCAzLCAzfSwKKyAgICAgICAgezMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMX0sCisgICAgfTsKKworICAgIGNvbnN0IHN0YXRpYyB1aW50OCBjb2RSdW5CZWZvcmVbN11bMTZdID0KKyAgICB7CisgICAgICAgIHsxLCAwfSwKKyAgICAgICAgezEsIDEsIDB9LAorICAgICAgICB7MywgMiwgMSwgMH0sCisgICAgICAgIHszLCAyLCAxLCAxLCAwfSwKKyAgICAgICAgezMsIDIsIDMsIDIsIDEsIDB9LAorICAgICAgICB7MywgMCwgMSwgMywgMiwgNSwgNH0sCisgICAgICAgIHs3LCA2LCA1LCA0LCAzLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxfSwKKyAgICB9OworCisgICAgaW50IGxlbiwgY29kZTsKKyAgICBBVkNFbmNfU3RhdHVzIHN0YXR1czsKKworICAgIGlmICh6ZXJvc0xlZnQgPD0gNikKKyAgICB7CisgICAgICAgIGxlbiA9IGxlblJ1bkJlZm9yZVt6ZXJvc0xlZnQtMV1bcnVuX2JlZm9yZV07CisgICAgICAgIGNvZGUgPSBjb2RSdW5CZWZvcmVbemVyb3NMZWZ0LTFdW3J1bl9iZWZvcmVdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZW4gPSBsZW5SdW5CZWZvcmVbNl1bcnVuX2JlZm9yZV07CisgICAgICAgIGNvZGUgPSBjb2RSdW5CZWZvcmVbNl1bcnVuX2JlZm9yZV07CisgICAgfQorCisgICAgc3RhdHVzID0gQml0c3RyZWFtV3JpdGVCaXRzKHN0cmVhbSwgbGVuLCBjb2RlKTsKKworCisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BVkNFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlMmUzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQVZDRW5jb2Rlci5oCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFWQ19FTkNPREVSX0hfCisKKyNkZWZpbmUgQVZDX0VOQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworc3RydWN0IHRhZ0FWQ0hhbmRsZTsKK3N0cnVjdCB0YWdBVkNFbmNQYXJhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFCdWZmZXI7CitzdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDsKKworc3RydWN0IEFWQ0VuY29kZXIgOiBwdWJsaWMgTWVkaWFTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKKyAgICBBVkNFbmNvZGVyKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXQoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CisKKyAgICAvLyBDYWxsYmFja3MgcmVxdWlyZWQgYnkgdGhlIGVuY29kZXIKKyAgICBpbnQzMl90IGFsbG9jT3V0cHV0QnVmZmVycyh1bnNpZ25lZCBpbnQgc2l6ZUluTWJzLCB1bnNpZ25lZCBpbnQgbnVtQnVmZmVycyk7CisgICAgdm9pZCAgICB1bmJpbmRPdXRwdXRCdWZmZXIoaW50MzJfdCBpbmRleCk7CisgICAgaW50MzJfdCBiaW5kT3V0cHV0QnVmZmVyKGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgKip5dXYpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QVZDRW5jb2RlcigpOworCitwcml2YXRlOgorICAgIHNwPE1lZGlhU291cmNlPiBtU291cmNlOworICAgIHNwPE1ldGFEYXRhPiAgICBtRm9ybWF0OworICAgIHNwPE1ldGFEYXRhPiAgICBtTWV0YTsKKworICAgIGludDMyX3QgIG1WaWRlb1dpZHRoOworICAgIGludDMyX3QgIG1WaWRlb0hlaWdodDsKKyAgICBpbnQzMl90ICBtVmlkZW9GcmFtZVJhdGU7CisgICAgaW50MzJfdCAgbVZpZGVvQml0UmF0ZTsKKyAgICBpbnQzMl90ICBtVmlkZW9Db2xvckZvcm1hdDsKKyAgICBpbnQ2NF90ICBtTnVtSW5wdXRGcmFtZXM7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBib29sICAgICBtU3RhcnRlZDsKKyAgICBib29sICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQ7CisgICAgYm9vbCAgICAgbVJlYWR5Rm9yTmV4dEZyYW1lOworICAgIGludDMyX3QgIG1Jc0lEUkZyYW1lOyAgLy8gZm9yIHNldCBrS2V5SXNTeW5jRnJhbWUKKworICAgIHRhZ0FWQ0hhbmRsZSAgICAgICAgICAqbUhhbmRsZTsKKyAgICB0YWdBVkNFbmNQYXJhbSAgICAgICAgKm1FbmNQYXJhbXM7CisgICAgTWVkaWFCdWZmZXIgICAgICAgICAgICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICptSW5wdXRGcmFtZURhdGE7CisgICAgTWVkaWFCdWZmZXJHcm91cCAgICAgICptR3JvdXA7CisgICAgVmVjdG9yPE1lZGlhQnVmZmVyICo+IG1PdXRwdXRCdWZmZXJzOworCisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICB2b2lkIHJlbGVhc2VPdXRwdXRCdWZmZXJzKCk7CisKKyAgICBBVkNFbmNvZGVyKGNvbnN0IEFWQ0VuY29kZXIgJik7CisgICAgQVZDRW5jb2RlciAmb3BlcmF0b3I9KGNvbnN0IEFWQ0VuY29kZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFWQ19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS9uYXRpdmUvYW5kcm9pZC9pbnB1dC5jcHAgYi9uYXRpdmUvYW5kcm9pZC9pbnB1dC5jcHAKaW5kZXggODlkNTNlMi4uYTRkZGU1MSAxMDA2NDQKLS0tIGEvbmF0aXZlL2FuZHJvaWQvaW5wdXQuY3BwCisrKyBiL25hdGl2ZS9hbmRyb2lkL2lucHV0LmNwcApAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPHVpL0lucHV0VHJhbnNwb3J0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUG9sbExvb3AuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9hbmRyb2lkX2FwcF9OYXRpdmVBY3Rpdml0eS5oPgorCiAjaW5jbHVkZSA8cG9sbC5oPgogCiB1c2luZyBhbmRyb2lkOjpJbnB1dEV2ZW50OwpAQCAtMTg3LDY1ICsxODksMjEgQEAKIAogdm9pZCBBSW5wdXRRdWV1ZV9hdHRhY2hMb29wZXIoQUlucHV0UXVldWUqIHF1ZXVlLCBBTG9vcGVyKiBsb29wZXIsCiAgICAgICAgIEFMb29wZXJfY2FsbGJhY2tGdW5jKiBjYWxsYmFjaywgdm9pZCogZGF0YSkgewotICAgIHF1ZXVlLT5zZXRQb2xsTG9vcChzdGF0aWNfY2FzdDxhbmRyb2lkOjpQb2xsTG9vcCo+KGxvb3BlcikpOwotICAgIEFMb29wZXJfYWRkRmQobG9vcGVyLCBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5nZXRDaGFubmVsKCktPmdldFJlY2VpdmVQaXBlRmQoKSwKLSAgICAgICAgICAgIFBPTExJTiwgY2FsbGJhY2ssIGRhdGEpOworICAgIHF1ZXVlLT5hdHRhY2hMb29wZXIobG9vcGVyLCBjYWxsYmFjaywgZGF0YSk7CiB9CiAKIHZvaWQgQUlucHV0UXVldWVfZGV0YWNoTG9vcGVyKEFJbnB1dFF1ZXVlKiBxdWV1ZSkgewotICAgIHF1ZXVlLT5nZXRQb2xsTG9vcCgpLT5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgIHF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0UmVjZWl2ZVBpcGVGZCgpKTsKKyAgICBxdWV1ZS0+ZGV0YWNoTG9vcGVyKCk7CiB9CiAKIGludCBBSW5wdXRRdWV1ZV9oYXNFdmVudHMoQUlucHV0UXVldWUqIHF1ZXVlKSB7Ci0gICAgc3RydWN0IHBvbGxmZCBwZmQ7Ci0gICAgCi0gICAgcGZkLmZkID0gcXVldWUtPmdldENvbnN1bWVyKCkuZ2V0Q2hhbm5lbCgpLT5nZXRSZWNlaXZlUGlwZUZkKCk7Ci0gICAgcGZkLmV2ZW50cyA9IFBPTExJTjsKLSAgICBwZmQucmV2ZW50cyA9IDA7Ci0gICAgCi0gICAgaW50IG5mZCA9IHBvbGwoJnBmZCwgMSwgMCk7Ci0gICAgaWYgKG5mZCA8PSAwKSByZXR1cm4gbmZkOwotICAgIHJldHVybiBwZmQucmV2ZW50cyA9PSBQT0xMSU4gPyAxIDogLTE7CisgICAgcmV0dXJuIHF1ZXVlLT5oYXNFdmVudHMoKTsKIH0KIAogaW50MzJfdCBBSW5wdXRRdWV1ZV9nZXRFdmVudChBSW5wdXRRdWV1ZSogcXVldWUsIEFJbnB1dEV2ZW50Kiogb3V0RXZlbnQpIHsKLSAgICAqb3V0RXZlbnQgPSBOVUxMOwotICAgIAotICAgIGludDMyX3QgcmVzID0gcXVldWUtPmdldENvbnN1bWVyKCkucmVjZWl2ZURpc3BhdGNoU2lnbmFsKCk7Ci0gICAgaWYgKHJlcyAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBMT0dFKCJjaGFubmVsICclcycgfiBGYWlsZWQgdG8gcmVjZWl2ZSBkaXNwYXRjaCBzaWduYWwuICBzdGF0dXM9JWQiLAotICAgICAgICAgICAgICAgIHF1ZXVlLT5nZXRDb25zdW1lcigpLmdldENoYW5uZWwoKS0+Z2V0TmFtZSgpLnN0cmluZygpLCByZXMpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIAotICAgIElucHV0RXZlbnQqIG15RXZlbnQgPSBOVUxMOwotICAgIHJlcyA9IHF1ZXVlLT5jb25zdW1lKCZteUV2ZW50KTsKLSAgICBpZiAocmVzICE9IGFuZHJvaWQ6Ok9LKSB7Ci0gICAgICAgIExPR1coImNoYW5uZWwgJyVzJyB+IEZhaWxlZCB0byBjb25zdW1lIGlucHV0IGV2ZW50LiAgc3RhdHVzPSVkIiwKLSAgICAgICAgICAgICAgICBxdWV1ZS0+Z2V0Q29uc3VtZXIoKS5nZXRDaGFubmVsKCktPmdldE5hbWUoKS5zdHJpbmcoKSwgcmVzKTsKLSAgICAgICAgcXVldWUtPmdldENvbnN1bWVyKCkuc2VuZEZpbmlzaGVkU2lnbmFsKCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgCi0gICAgKm91dEV2ZW50ID0gbXlFdmVudDsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcXVldWUtPmdldEV2ZW50KG91dEV2ZW50KTsKIH0KIAotdm9pZCBBSW5wdXRRdWV1ZV9maW5pc2hFdmVudChBSW5wdXRRdWV1ZSogcXVldWUsIEFJbnB1dEV2ZW50KiBldmVudCwKLSAgICAgICAgaW50IGhhbmRsZWQpIHsKLSAgICBpZiAoIWhhbmRsZWQgJiYgKChJbnB1dEV2ZW50KilldmVudCktPmdldFR5cGUoKSA9PSBJTlBVVF9FVkVOVF9UWVBFX0tFWQotICAgICAgICAgICAgJiYgKChLZXlFdmVudCopZXZlbnQpLT5oYXNEZWZhdWx0QWN0aW9uKCkpIHsKLSAgICAgICAgLy8gVGhlIGFwcCBkaWRuJ3QgaGFuZGxlIHRoaXMsIGJ1dCBpdCBtYXkgaGF2ZSBhIGRlZmF1bHQgYWN0aW9uCi0gICAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBpdC4gIFdlIG5lZWQgdG8gaGFuZCB0aGlzIGJhY2sgdG8gSmF2YSB0byBiZQotICAgICAgICAvLyBleGVjdXRlZC4KLSAgICAgICAgcXVldWUtPmRvRGVmYXVsdEtleSgoS2V5RXZlbnQqKWV2ZW50KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICBpbnQzMl90IHJlcyA9IHF1ZXVlLT5nZXRDb25zdW1lcigpLnNlbmRGaW5pc2hlZFNpZ25hbCgpOwotICAgIGlmIChyZXMgIT0gYW5kcm9pZDo6T0spIHsKLSAgICAgICAgTE9HVygiRmFpbGVkIHRvIHNlbmQgZmluaXNoZWQgc2lnbmFsIG9uIGNoYW5uZWwgJyVzJy4gIHN0YXR1cz0lZCIsCi0gICAgICAgICAgICAgICAgcXVldWUtPmdldENvbnN1bWVyKCkuZ2V0Q2hhbm5lbCgpLT5nZXROYW1lKCkuc3RyaW5nKCksIHJlcyk7Ci0gICAgfQordm9pZCBBSW5wdXRRdWV1ZV9maW5pc2hFdmVudChBSW5wdXRRdWV1ZSogcXVldWUsIEFJbnB1dEV2ZW50KiBldmVudCwgaW50IGhhbmRsZWQpIHsKKyAgICBxdWV1ZS0+ZmluaXNoRXZlbnQoZXZlbnQsIGhhbmRsZWQgIT0gMCk7CiB9CmRpZmYgLS1naXQgYS9uYXRpdmUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuY3BwIGIvbmF0aXZlL2FuZHJvaWQvbmF0aXZlX2FjdGl2aXR5LmNwcAppbmRleCA1MDljYzMzLi4wYzY4MjNhIDEwMDY0NAotLS0gYS9uYXRpdmUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuY3BwCisrKyBiL25hdGl2ZS9hbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5jcHAKQEAgLTI5LDMgKzI5LDExIEBACiAJCXVpbnQzMl90IGFkZEZsYWdzLCB1aW50MzJfdCByZW1vdmVGbGFncykgewogCWFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfc2V0V2luZG93RmxhZ3MoYWN0aXZpdHksIGFkZEZsYWdzLCBhZGRGbGFnc3xyZW1vdmVGbGFncyk7CiB9CisKK3ZvaWQgQU5hdGl2ZUFjdGl2aXR5X3Nob3dTb2Z0SW5wdXQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgdWludDMyX3QgZmxhZ3MpIHsKKwlhbmRyb2lkX05hdGl2ZUFjdGl2aXR5X3Nob3dTb2Z0SW5wdXQoYWN0aXZpdHksIGZsYWdzKTsKK30KKwordm9pZCBBTmF0aXZlQWN0aXZpdHlfaGlkZVNvZnRJbnB1dChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCB1aW50MzJfdCBmbGFncykgeworCWFuZHJvaWRfTmF0aXZlQWN0aXZpdHlfaGlkZVNvZnRJbnB1dChhY3Rpdml0eSwgZmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvbmF0aXZlL2dsdWUvdGhyZWFkZWRfYXBwL3RocmVhZGVkX2FwcC5jIGIvbmF0aXZlL2dsdWUvdGhyZWFkZWRfYXBwL3RocmVhZGVkX2FwcC5jCmluZGV4IDI0MTFlOTMuLjQ1MmM3MzUgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9nbHVlL3RocmVhZGVkX2FwcC90aHJlYWRlZF9hcHAuYworKysgYi9uYXRpdmUvZ2x1ZS90aHJlYWRlZF9hcHAvdGhyZWFkZWRfYXBwLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxqbmkuaD4KIAogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KQEAgLTc1LDYgKzc2LDE5IEBACiAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZhbmRyb2lkX2FwcC0+Y29uZCk7CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVBQX0NNRF9XSU5ET1dfUkVEUkFXX05FRURFRDoKKyAgICAgICAgICAgIExPR0koIkFQUF9DTURfV0lORE9XX1JFRFJBV19ORUVERURcbiIpOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgICAgICAgICAgYW5kcm9pZF9hcHAtPnJlZHJhd05lZWRlZCA9IDA7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZhbmRyb2lkX2FwcC0+Y29uZCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVBQX0NNRF9DT05URU5UX1JFQ1RfQ0hBTkdFRDoKKyAgICAgICAgICAgIExPR0koIkFQUF9DTURfQ09OVEVOVF9SRUNUX0NIQU5HRURcbiIpOworICAgICAgICAgICAgYW5kcm9pZF9hcHAtPmNvbnRlbnRSZWN0ID0gYW5kcm9pZF9hcHAtPnBlbmRpbmdDb250ZW50UmVjdDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgCiAgICAgICAgIGNhc2UgQVBQX0NNRF9ERVNUUk9ZOgogICAgICAgICAgICAgTE9HSSgiQVBQX0NNRF9ERVNUUk9ZXG4iKTsKQEAgLTEzMyw2ICsxNDcsMTIgQEAKICAgICB9CiAgICAgYW5kcm9pZF9hcHAtPm1zZ3JlYWQgPSBtc2dwaXBlWzBdOwogICAgIGFuZHJvaWRfYXBwLT5tc2d3cml0ZSA9IG1zZ3BpcGVbMV07CisgICAgaW50IHJlc3VsdCA9IGZjbnRsKGFuZHJvaWRfYXBwLT5tc2dyZWFkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKyAgICBpZiAocmVzdWx0ICE9IDApIExPR1coIkNvdWxkIG5vdCBtYWtlIG1lc3NhZ2UgcmVhZCBwaXBlICIKKyAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICByZXN1bHQgPSBmY250bChhbmRyb2lkX2FwcC0+bXNnd3JpdGUsIEZfU0VURkwsIE9fTk9OQkxPQ0spOworICAgIGlmIChyZXN1bHQgIT0gMCkgTE9HVygiQ291bGQgbm90IG1ha2UgbWVzc2FnZSB3cml0ZSBwaXBlICIKKyAgICAgICAgICAgICJub24tYmxvY2tpbmc6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKICAgICAKICAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOyAKICAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CkBAIC0xODQsNiArMjA0LDIzIEBACiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFuZHJvaWRfYXBwX3dhaXRfcmVkcmF3KHN0cnVjdCBhbmRyb2lkX2FwcCogYW5kcm9pZF9hcHApIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmFuZHJvaWRfYXBwLT5tdXRleCk7CisgICAgYW5kcm9pZF9hcHAtPnJlZHJhd05lZWRlZCA9IDE7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBBUFBfQ01EX1dJTkRPV19SRURSQVdfTkVFREVEKTsKKyAgICB3aGlsZSAoYW5kcm9pZF9hcHAtPnJlZHJhd05lZWRlZCkgeworICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYW5kcm9pZF9hcHAtPmNvbmQsICZhbmRyb2lkX2FwcC0+bXV0ZXgpOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfc2V0X2NvbnRlbnRfcmVjdChzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwLCBjb25zdCBBUmVjdCogcmVjdCkgeworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKKyAgICBhbmRyb2lkX2FwcC0+cGVuZGluZ0NvbnRlbnRSZWN0ID0gKnJlY3Q7CisgICAgYW5kcm9pZF9hcHBfd3JpdGVfY21kKGFuZHJvaWRfYXBwLCBBUFBfQ01EX0NPTlRFTlRfUkVDVF9DSEFOR0VEKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYW5kcm9pZF9hcHAtPm11dGV4KTsKK30KKwogc3RhdGljIHZvaWQgYW5kcm9pZF9hcHBfZnJlZShzdHJ1Y3QgYW5kcm9pZF9hcHAqIGFuZHJvaWRfYXBwKSB7CiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZhbmRyb2lkX2FwcC0+bXV0ZXgpOwogICAgIGFuZHJvaWRfYXBwX3dyaXRlX2NtZChhbmRyb2lkX2FwcCwgQVBQX0NNRF9ERVNUUk9ZKTsKQEAgLTIzMSw2ICsyNjgsOCBAQAogCiBzdGF0aWMgdm9pZCBvbkxvd01lbW9yeShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5KSB7CiAgICAgTE9HSSgiTG93TWVtb3J5OiAlcFxuIiwgYWN0aXZpdHkpOworICAgIGFuZHJvaWRfYXBwX3dyaXRlX2NtZCgoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsCisgICAgICAgICAgICBBUFBfQ01EX0xPV19NRU1PUlkpOwogfQogCiBzdGF0aWMgdm9pZCBvbldpbmRvd0ZvY3VzQ2hhbmdlZChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBpbnQgZm9jdXNlZCkgewpAQCAtMjQ0LDYgKzI4MywyMyBAQAogICAgIGFuZHJvaWRfYXBwX3NldF93aW5kb3coKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLCB3aW5kb3cpOwogfQogCitzdGF0aWMgdm9pZCBvbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgTE9HSSgiTmF0aXZlV2luZG93UmVzaXplZDogJXAgLS0gJXBcbiIsIGFjdGl2aXR5LCB3aW5kb3cpOworICAgIGFuZHJvaWRfYXBwX3dyaXRlX2NtZCgoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsCisgICAgICAgICAgICBBUFBfQ01EX1dJTkRPV19SRVNJWkVEKTsKK30KKworc3RhdGljIHZvaWQgb25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgTE9HSSgiTmF0aXZlV2luZG93UmVkcmF3TmVlZGVkOiAlcCAtLSAlcFxuIiwgYWN0aXZpdHksIHdpbmRvdyk7CisgICAgYW5kcm9pZF9hcHBfd2FpdF9yZWRyYXcoKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlKTsKK30KKworc3RhdGljIHZvaWQgb25Db250ZW50UmVjdENoYW5nZWQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgY29uc3QgQVJlY3QqIHJlY3QpIHsKKyAgICBMT0dJKCJDb250ZW50UmVjdENoYW5nZWQ6ICVwIC0tICglZCwlZCktKCVkLCVkKVxuIiwgYWN0aXZpdHksIHJlY3QtPmxlZnQsCisgICAgICAgICAgICByZWN0LT50b3AsIHJlY3QtPnJpZ2h0LCByZWN0LT5ib3R0b20pOworICAgIGFuZHJvaWRfYXBwX3NldF9jb250ZW50X3JlY3QoKHN0cnVjdCBhbmRyb2lkX2FwcCopYWN0aXZpdHktPmluc3RhbmNlLCByZWN0KTsKK30KKwogc3RhdGljIHZvaWQgb25OYXRpdmVXaW5kb3dEZXN0cm95ZWQoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CiAgICAgTE9HSSgiTmF0aXZlV2luZG93RGVzdHJveWVkOiAlcCAtLSAlcFxuIiwgYWN0aXZpdHksIHdpbmRvdyk7CiAgICAgYW5kcm9pZF9hcHBfc2V0X3dpbmRvdygoc3RydWN0IGFuZHJvaWRfYXBwKilhY3Rpdml0eS0+aW5zdGFuY2UsIE5VTEwpOwpAQCAtMjY4LDEyICszMjQsMTUgQEAKICAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vblNhdmVJbnN0YW5jZVN0YXRlID0gb25TYXZlSW5zdGFuY2VTdGF0ZTsKICAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vblBhdXNlID0gb25QYXVzZTsKICAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vblN0b3AgPSBvblN0b3A7Ci0gICAgYWN0aXZpdHktPmNhbGxiYWNrcy0+b25Mb3dNZW1vcnkgPSBvbkxvd01lbW9yeTsKICAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbldpbmRvd0ZvY3VzQ2hhbmdlZCA9IG9uV2luZG93Rm9jdXNDaGFuZ2VkOwogICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uTmF0aXZlV2luZG93Q3JlYXRlZCA9IG9uTmF0aXZlV2luZG93Q3JlYXRlZDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQgPSBvbk5hdGl2ZVdpbmRvd1Jlc2l6ZWQ7CisgICAgYWN0aXZpdHktPmNhbGxiYWNrcy0+b25OYXRpdmVXaW5kb3dSZWRyYXdOZWVkZWQgPSBvbk5hdGl2ZVdpbmRvd1JlZHJhd05lZWRlZDsKICAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbk5hdGl2ZVdpbmRvd0Rlc3Ryb3llZCA9IG9uTmF0aXZlV2luZG93RGVzdHJveWVkOwogICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uSW5wdXRRdWV1ZUNyZWF0ZWQgPSBvbklucHV0UXVldWVDcmVhdGVkOwogICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uSW5wdXRRdWV1ZURlc3Ryb3llZCA9IG9uSW5wdXRRdWV1ZURlc3Ryb3llZDsKKyAgICBhY3Rpdml0eS0+Y2FsbGJhY2tzLT5vbkNvbnRlbnRSZWN0Q2hhbmdlZCA9IG9uQ29udGVudFJlY3RDaGFuZ2VkOworICAgIGFjdGl2aXR5LT5jYWxsYmFja3MtPm9uTG93TWVtb3J5ID0gb25Mb3dNZW1vcnk7CiAgICAgCiAgICAgYWN0aXZpdHktPmluc3RhbmNlID0gYW5kcm9pZF9hcHBfY3JlYXRlKGFjdGl2aXR5KTsKIH0KZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvaW5wdXQuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvaW5wdXQuaAppbmRleCAwMTRiNmEzLi4yNWRkNjhlIDEwMDY0NAotLS0gYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2lucHV0LmgKKysrIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9pbnB1dC5oCkBAIC02OCw3ICs2OCwxMCBAQAogICAgIElOUFVUX0RFVklDRV9DTEFTU19UT1VDSFNDUkVFTl9NVD0gMHgwMDAwMDAxMCwKIAogICAgIC8qIFRoZSBpbnB1dCBkZXZpY2UgaXMgYSBkaXJlY3Rpb25hbCBwYWQuICovCi0gICAgSU5QVVRfREVWSUNFX0NMQVNTX0RQQUQgICAgICAgICAgPSAweDAwMDAwMDIwCisgICAgSU5QVVRfREVWSUNFX0NMQVNTX0RQQUQgICAgICAgICAgPSAweDAwMDAwMDIwLAorCisgICAgLyogVGhlIGlucHV0IGRldmljZSBpcyBhIGdhbWVwYWQgKGltcGxpZXMga2V5Ym9hcmQpLiAqLworICAgIElOUFVUX0RFVklDRV9DTEFTU19HQU1FUEFEICAgICAgID0gMHgwMDAwMDA0MAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaCBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaAppbmRleCAzNjg1NWM1Li40OTZlY2NjMCAxMDA2NDQKLS0tIGEvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9rZXljb2Rlcy5oCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQva2V5Y29kZXMuaApAQCAtNDEsMTE0ICs0MSwxMjIgQEAKIAogLyoKICAqIEtleSBjb2Rlcy4KLSAqCi0gKiBYWFg6IFRoZSBkZWNsYXJhdGlvbnMgaW4gPHVpL0tleWNvZGVMYWJlbC5oPiBzaG91bGQgYmUgdXBkYXRlZCB0byB1c2UgdGhlc2UgaW5zdGVhZC4KLSAqICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IG1vdmUgdGhpcyBpbnRvIGFuZHJvaWQva2V5Y29kZXMuaCBhbmQgYWRkIHNvbWUgbmV3IEFQSSBmb3IKLSAqICAgICAgZ2V0dGluZyBsYWJlbHMgc28gdGhhdCB3ZSBjYW4gcmVtb3ZlIHRoZSBvdGhlciB0YWJsZXMgYWxzbyBpbiBLZXljb2RlTGFiZWwuaC4KICAqLwogZW51bSB7Ci0gICAgS0VZQ09ERV9VTktOT1dOICAgICAgICAgPSAwLAotICAgIEtFWUNPREVfU09GVF9MRUZUICAgICAgID0gMSwKLSAgICBLRVlDT0RFX1NPRlRfUklHSFQgICAgICA9IDIsCi0gICAgS0VZQ09ERV9IT01FICAgICAgICAgICAgPSAzLAotICAgIEtFWUNPREVfQkFDSyAgICAgICAgICAgID0gNCwKLSAgICBLRVlDT0RFX0NBTEwgICAgICAgICAgICA9IDUsCi0gICAgS0VZQ09ERV9FTkRDQUxMICAgICAgICAgPSA2LAotICAgIEtFWUNPREVfMCAgICAgICAgICAgICAgID0gNywKLSAgICBLRVlDT0RFXzEgICAgICAgICAgICAgICA9IDgsCi0gICAgS0VZQ09ERV8yICAgICAgICAgICAgICAgPSA5LAotICAgIEtFWUNPREVfMyAgICAgICAgICAgICAgID0gMTAsCi0gICAgS0VZQ09ERV80ICAgICAgICAgICAgICAgPSAxMSwKLSAgICBLRVlDT0RFXzUgICAgICAgICAgICAgICA9IDEyLAotICAgIEtFWUNPREVfNiAgICAgICAgICAgICAgID0gMTMsCi0gICAgS0VZQ09ERV83ICAgICAgICAgICAgICAgPSAxNCwKLSAgICBLRVlDT0RFXzggICAgICAgICAgICAgICA9IDE1LAotICAgIEtFWUNPREVfOSAgICAgICAgICAgICAgID0gMTYsCi0gICAgS0VZQ09ERV9TVEFSICAgICAgICAgICAgPSAxNywKLSAgICBLRVlDT0RFX1BPVU5EICAgICAgICAgICA9IDE4LAotICAgIEtFWUNPREVfRFBBRF9VUCAgICAgICAgID0gMTksCi0gICAgS0VZQ09ERV9EUEFEX0RPV04gICAgICAgPSAyMCwKLSAgICBLRVlDT0RFX0RQQURfTEVGVCAgICAgICA9IDIxLAotICAgIEtFWUNPREVfRFBBRF9SSUdIVCAgICAgID0gMjIsCi0gICAgS0VZQ09ERV9EUEFEX0NFTlRFUiAgICAgPSAyMywKLSAgICBLRVlDT0RFX1ZPTFVNRV9VUCAgICAgICA9IDI0LAotICAgIEtFWUNPREVfVk9MVU1FX0RPV04gICAgID0gMjUsCi0gICAgS0VZQ09ERV9QT1dFUiAgICAgICAgICAgPSAyNiwKLSAgICBLRVlDT0RFX0NBTUVSQSAgICAgICAgICA9IDI3LAotICAgIEtFWUNPREVfQ0xFQVIgICAgICAgICAgID0gMjgsCi0gICAgS0VZQ09ERV9BICAgICAgICAgICAgICAgPSAyOSwKLSAgICBLRVlDT0RFX0IgICAgICAgICAgICAgICA9IDMwLAotICAgIEtFWUNPREVfQyAgICAgICAgICAgICAgID0gMzEsCi0gICAgS0VZQ09ERV9EICAgICAgICAgICAgICAgPSAzMiwKLSAgICBLRVlDT0RFX0UgICAgICAgICAgICAgICA9IDMzLAotICAgIEtFWUNPREVfRiAgICAgICAgICAgICAgID0gMzQsCi0gICAgS0VZQ09ERV9HICAgICAgICAgICAgICAgPSAzNSwKLSAgICBLRVlDT0RFX0ggICAgICAgICAgICAgICA9IDM2LAotICAgIEtFWUNPREVfSSAgICAgICAgICAgICAgID0gMzcsCi0gICAgS0VZQ09ERV9KICAgICAgICAgICAgICAgPSAzOCwKLSAgICBLRVlDT0RFX0sgICAgICAgICAgICAgICA9IDM5LAotICAgIEtFWUNPREVfTCAgICAgICAgICAgICAgID0gNDAsCi0gICAgS0VZQ09ERV9NICAgICAgICAgICAgICAgPSA0MSwKLSAgICBLRVlDT0RFX04gICAgICAgICAgICAgICA9IDQyLAotICAgIEtFWUNPREVfTyAgICAgICAgICAgICAgID0gNDMsCi0gICAgS0VZQ09ERV9QICAgICAgICAgICAgICAgPSA0NCwKLSAgICBLRVlDT0RFX1EgICAgICAgICAgICAgICA9IDQ1LAotICAgIEtFWUNPREVfUiAgICAgICAgICAgICAgID0gNDYsCi0gICAgS0VZQ09ERV9TICAgICAgICAgICAgICAgPSA0NywKLSAgICBLRVlDT0RFX1QgICAgICAgICAgICAgICA9IDQ4LAotICAgIEtFWUNPREVfVSAgICAgICAgICAgICAgID0gNDksCi0gICAgS0VZQ09ERV9WICAgICAgICAgICAgICAgPSA1MCwKLSAgICBLRVlDT0RFX1cgICAgICAgICAgICAgICA9IDUxLAotICAgIEtFWUNPREVfWCAgICAgICAgICAgICAgID0gNTIsCi0gICAgS0VZQ09ERV9ZICAgICAgICAgICAgICAgPSA1MywKLSAgICBLRVlDT0RFX1ogICAgICAgICAgICAgICA9IDU0LAotICAgIEtFWUNPREVfQ09NTUEgICAgICAgICAgID0gNTUsCi0gICAgS0VZQ09ERV9QRVJJT0QgICAgICAgICAgPSA1NiwKLSAgICBLRVlDT0RFX0FMVF9MRUZUICAgICAgICA9IDU3LAotICAgIEtFWUNPREVfQUxUX1JJR0hUICAgICAgID0gNTgsCi0gICAgS0VZQ09ERV9TSElGVF9MRUZUICAgICAgPSA1OSwKLSAgICBLRVlDT0RFX1NISUZUX1JJR0hUICAgICA9IDYwLAotICAgIEtFWUNPREVfVEFCICAgICAgICAgICAgID0gNjEsCi0gICAgS0VZQ09ERV9TUEFDRSAgICAgICAgICAgPSA2MiwKLSAgICBLRVlDT0RFX1NZTSAgICAgICAgICAgICA9IDYzLAotICAgIEtFWUNPREVfRVhQTE9SRVIgICAgICAgID0gNjQsCi0gICAgS0VZQ09ERV9FTlZFTE9QRSAgICAgICAgPSA2NSwKLSAgICBLRVlDT0RFX0VOVEVSICAgICAgICAgICA9IDY2LAotICAgIEtFWUNPREVfREVMICAgICAgICAgICAgID0gNjcsCi0gICAgS0VZQ09ERV9HUkFWRSAgICAgICAgICAgPSA2OCwKLSAgICBLRVlDT0RFX01JTlVTICAgICAgICAgICA9IDY5LAotICAgIEtFWUNPREVfRVFVQUxTICAgICAgICAgID0gNzAsCi0gICAgS0VZQ09ERV9MRUZUX0JSQUNLRVQgICAgPSA3MSwKLSAgICBLRVlDT0RFX1JJR0hUX0JSQUNLRVQgICA9IDcyLAotICAgIEtFWUNPREVfQkFDS1NMQVNIICAgICAgID0gNzMsCi0gICAgS0VZQ09ERV9TRU1JQ09MT04gICAgICAgPSA3NCwKLSAgICBLRVlDT0RFX0FQT1NUUk9QSEUgICAgICA9IDc1LAotICAgIEtFWUNPREVfU0xBU0ggICAgICAgICAgID0gNzYsCi0gICAgS0VZQ09ERV9BVCAgICAgICAgICAgICAgPSA3NywKLSAgICBLRVlDT0RFX05VTSAgICAgICAgICAgICA9IDc4LAotICAgIEtFWUNPREVfSEVBRFNFVEhPT0sgICAgID0gNzksCi0gICAgS0VZQ09ERV9GT0NVUyAgICAgICAgICAgPSA4MCwgICAvLyAqQ2FtZXJhKiBmb2N1cwotICAgIEtFWUNPREVfUExVUyAgICAgICAgICAgID0gODEsCi0gICAgS0VZQ09ERV9NRU5VICAgICAgICAgICAgPSA4MiwKLSAgICBLRVlDT0RFX05PVElGSUNBVElPTiAgICA9IDgzLAotICAgIEtFWUNPREVfU0VBUkNIICAgICAgICAgID0gODQsCi0gICAgS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFPSA4NSwKLSAgICBLRVlDT0RFX01FRElBX1NUT1AgICAgICA9IDg2LAotICAgIEtFWUNPREVfTUVESUFfTkVYVCAgICAgID0gODcsCi0gICAgS0VZQ09ERV9NRURJQV9QUkVWSU9VUyAgPSA4OCwKLSAgICBLRVlDT0RFX01FRElBX1JFV0lORCAgICA9IDg5LAotICAgIEtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEID0gOTAsCi0gICAgS0VZQ09ERV9NVVRFICAgICAgICAgICAgPSA5MSwKLSAgICBLRVlDT0RFX1BBR0VfVVAgICAgICAgICA9IDkyLAotICAgIEtFWUNPREVfUEFHRV9ET1dOICAgICAgID0gOTMKKyAgICBBS0VZQ09ERV9VTktOT1dOICAgICAgICAgPSAwLAorICAgIEFLRVlDT0RFX1NPRlRfTEVGVCAgICAgICA9IDEsCisgICAgQUtFWUNPREVfU09GVF9SSUdIVCAgICAgID0gMiwKKyAgICBBS0VZQ09ERV9IT01FICAgICAgICAgICAgPSAzLAorICAgIEFLRVlDT0RFX0JBQ0sgICAgICAgICAgICA9IDQsCisgICAgQUtFWUNPREVfQ0FMTCAgICAgICAgICAgID0gNSwKKyAgICBBS0VZQ09ERV9FTkRDQUxMICAgICAgICAgPSA2LAorICAgIEFLRVlDT0RFXzAgICAgICAgICAgICAgICA9IDcsCisgICAgQUtFWUNPREVfMSAgICAgICAgICAgICAgID0gOCwKKyAgICBBS0VZQ09ERV8yICAgICAgICAgICAgICAgPSA5LAorICAgIEFLRVlDT0RFXzMgICAgICAgICAgICAgICA9IDEwLAorICAgIEFLRVlDT0RFXzQgICAgICAgICAgICAgICA9IDExLAorICAgIEFLRVlDT0RFXzUgICAgICAgICAgICAgICA9IDEyLAorICAgIEFLRVlDT0RFXzYgICAgICAgICAgICAgICA9IDEzLAorICAgIEFLRVlDT0RFXzcgICAgICAgICAgICAgICA9IDE0LAorICAgIEFLRVlDT0RFXzggICAgICAgICAgICAgICA9IDE1LAorICAgIEFLRVlDT0RFXzkgICAgICAgICAgICAgICA9IDE2LAorICAgIEFLRVlDT0RFX1NUQVIgICAgICAgICAgICA9IDE3LAorICAgIEFLRVlDT0RFX1BPVU5EICAgICAgICAgICA9IDE4LAorICAgIEFLRVlDT0RFX0RQQURfVVAgICAgICAgICA9IDE5LAorICAgIEFLRVlDT0RFX0RQQURfRE9XTiAgICAgICA9IDIwLAorICAgIEFLRVlDT0RFX0RQQURfTEVGVCAgICAgICA9IDIxLAorICAgIEFLRVlDT0RFX0RQQURfUklHSFQgICAgICA9IDIyLAorICAgIEFLRVlDT0RFX0RQQURfQ0VOVEVSICAgICA9IDIzLAorICAgIEFLRVlDT0RFX1ZPTFVNRV9VUCAgICAgICA9IDI0LAorICAgIEFLRVlDT0RFX1ZPTFVNRV9ET1dOICAgICA9IDI1LAorICAgIEFLRVlDT0RFX1BPV0VSICAgICAgICAgICA9IDI2LAorICAgIEFLRVlDT0RFX0NBTUVSQSAgICAgICAgICA9IDI3LAorICAgIEFLRVlDT0RFX0NMRUFSICAgICAgICAgICA9IDI4LAorICAgIEFLRVlDT0RFX0EgICAgICAgICAgICAgICA9IDI5LAorICAgIEFLRVlDT0RFX0IgICAgICAgICAgICAgICA9IDMwLAorICAgIEFLRVlDT0RFX0MgICAgICAgICAgICAgICA9IDMxLAorICAgIEFLRVlDT0RFX0QgICAgICAgICAgICAgICA9IDMyLAorICAgIEFLRVlDT0RFX0UgICAgICAgICAgICAgICA9IDMzLAorICAgIEFLRVlDT0RFX0YgICAgICAgICAgICAgICA9IDM0LAorICAgIEFLRVlDT0RFX0cgICAgICAgICAgICAgICA9IDM1LAorICAgIEFLRVlDT0RFX0ggICAgICAgICAgICAgICA9IDM2LAorICAgIEFLRVlDT0RFX0kgICAgICAgICAgICAgICA9IDM3LAorICAgIEFLRVlDT0RFX0ogICAgICAgICAgICAgICA9IDM4LAorICAgIEFLRVlDT0RFX0sgICAgICAgICAgICAgICA9IDM5LAorICAgIEFLRVlDT0RFX0wgICAgICAgICAgICAgICA9IDQwLAorICAgIEFLRVlDT0RFX00gICAgICAgICAgICAgICA9IDQxLAorICAgIEFLRVlDT0RFX04gICAgICAgICAgICAgICA9IDQyLAorICAgIEFLRVlDT0RFX08gICAgICAgICAgICAgICA9IDQzLAorICAgIEFLRVlDT0RFX1AgICAgICAgICAgICAgICA9IDQ0LAorICAgIEFLRVlDT0RFX1EgICAgICAgICAgICAgICA9IDQ1LAorICAgIEFLRVlDT0RFX1IgICAgICAgICAgICAgICA9IDQ2LAorICAgIEFLRVlDT0RFX1MgICAgICAgICAgICAgICA9IDQ3LAorICAgIEFLRVlDT0RFX1QgICAgICAgICAgICAgICA9IDQ4LAorICAgIEFLRVlDT0RFX1UgICAgICAgICAgICAgICA9IDQ5LAorICAgIEFLRVlDT0RFX1YgICAgICAgICAgICAgICA9IDUwLAorICAgIEFLRVlDT0RFX1cgICAgICAgICAgICAgICA9IDUxLAorICAgIEFLRVlDT0RFX1ggICAgICAgICAgICAgICA9IDUyLAorICAgIEFLRVlDT0RFX1kgICAgICAgICAgICAgICA9IDUzLAorICAgIEFLRVlDT0RFX1ogICAgICAgICAgICAgICA9IDU0LAorICAgIEFLRVlDT0RFX0NPTU1BICAgICAgICAgICA9IDU1LAorICAgIEFLRVlDT0RFX1BFUklPRCAgICAgICAgICA9IDU2LAorICAgIEFLRVlDT0RFX0FMVF9MRUZUICAgICAgICA9IDU3LAorICAgIEFLRVlDT0RFX0FMVF9SSUdIVCAgICAgICA9IDU4LAorICAgIEFLRVlDT0RFX1NISUZUX0xFRlQgICAgICA9IDU5LAorICAgIEFLRVlDT0RFX1NISUZUX1JJR0hUICAgICA9IDYwLAorICAgIEFLRVlDT0RFX1RBQiAgICAgICAgICAgICA9IDYxLAorICAgIEFLRVlDT0RFX1NQQUNFICAgICAgICAgICA9IDYyLAorICAgIEFLRVlDT0RFX1NZTSAgICAgICAgICAgICA9IDYzLAorICAgIEFLRVlDT0RFX0VYUExPUkVSICAgICAgICA9IDY0LAorICAgIEFLRVlDT0RFX0VOVkVMT1BFICAgICAgICA9IDY1LAorICAgIEFLRVlDT0RFX0VOVEVSICAgICAgICAgICA9IDY2LAorICAgIEFLRVlDT0RFX0RFTCAgICAgICAgICAgICA9IDY3LAorICAgIEFLRVlDT0RFX0dSQVZFICAgICAgICAgICA9IDY4LAorICAgIEFLRVlDT0RFX01JTlVTICAgICAgICAgICA9IDY5LAorICAgIEFLRVlDT0RFX0VRVUFMUyAgICAgICAgICA9IDcwLAorICAgIEFLRVlDT0RFX0xFRlRfQlJBQ0tFVCAgICA9IDcxLAorICAgIEFLRVlDT0RFX1JJR0hUX0JSQUNLRVQgICA9IDcyLAorICAgIEFLRVlDT0RFX0JBQ0tTTEFTSCAgICAgICA9IDczLAorICAgIEFLRVlDT0RFX1NFTUlDT0xPTiAgICAgICA9IDc0LAorICAgIEFLRVlDT0RFX0FQT1NUUk9QSEUgICAgICA9IDc1LAorICAgIEFLRVlDT0RFX1NMQVNIICAgICAgICAgICA9IDc2LAorICAgIEFLRVlDT0RFX0FUICAgICAgICAgICAgICA9IDc3LAorICAgIEFLRVlDT0RFX05VTSAgICAgICAgICAgICA9IDc4LAorICAgIEFLRVlDT0RFX0hFQURTRVRIT09LICAgICA9IDc5LAorICAgIEFLRVlDT0RFX0ZPQ1VTICAgICAgICAgICA9IDgwLCAgIC8vICpDYW1lcmEqIGZvY3VzCisgICAgQUtFWUNPREVfUExVUyAgICAgICAgICAgID0gODEsCisgICAgQUtFWUNPREVfTUVOVSAgICAgICAgICAgID0gODIsCisgICAgQUtFWUNPREVfTk9USUZJQ0FUSU9OICAgID0gODMsCisgICAgQUtFWUNPREVfU0VBUkNIICAgICAgICAgID0gODQsCisgICAgQUtFWUNPREVfTUVESUFfUExBWV9QQVVTRT0gODUsCisgICAgQUtFWUNPREVfTUVESUFfU1RPUCAgICAgID0gODYsCisgICAgQUtFWUNPREVfTUVESUFfTkVYVCAgICAgID0gODcsCisgICAgQUtFWUNPREVfTUVESUFfUFJFVklPVVMgID0gODgsCisgICAgQUtFWUNPREVfTUVESUFfUkVXSU5EICAgID0gODksCisgICAgQUtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEID0gOTAsCisgICAgQUtFWUNPREVfTVVURSAgICAgICAgICAgID0gOTEsCisgICAgQUtFWUNPREVfUEFHRV9VUCAgICAgICAgID0gOTIsCisgICAgQUtFWUNPREVfUEFHRV9ET1dOICAgICAgID0gOTMsCisgICAgQUtFWUNPREVfUElDVFNZTUJPTFMgICAgID0gOTQsCisgICAgQUtFWUNPREVfU1dJVENIX0NIQVJTRVQgID0gOTUsCisgICAgQUtFWUNPREVfQlVUVE9OX0EgICAgICAgID0gOTYsCisgICAgQUtFWUNPREVfQlVUVE9OX0IgICAgICAgID0gOTcsCisgICAgQUtFWUNPREVfQlVUVE9OX0MgICAgICAgID0gOTgsCisgICAgQUtFWUNPREVfQlVUVE9OX1ggICAgICAgID0gOTksCisgICAgQUtFWUNPREVfQlVUVE9OX1kgICAgICAgID0gMTAwLAorICAgIEFLRVlDT0RFX0JVVFRPTl9aICAgICAgICA9IDEwMSwKKyAgICBBS0VZQ09ERV9CVVRUT05fTDEgICAgICAgPSAxMDIsCisgICAgQUtFWUNPREVfQlVUVE9OX1IxICAgICAgID0gMTAzLAorICAgIEFLRVlDT0RFX0JVVFRPTl9MMiAgICAgICA9IDEwNCwKKyAgICBBS0VZQ09ERV9CVVRUT05fUjIgICAgICAgPSAxMDUsCisgICAgQUtFWUNPREVfQlVUVE9OX1RIVU1CTCAgID0gMTA2LAorICAgIEFLRVlDT0RFX0JVVFRPTl9USFVNQlIgICA9IDEwNywKKyAgICBBS0VZQ09ERV9CVVRUT05fU1RBUlQgICAgPSAxMDgsCisgICAgQUtFWUNPREVfQlVUVE9OX1NFTEVDVCAgID0gMTA5LAorICAgIEFLRVlDT0RFX0JVVFRPTl9NT0RFICAgICA9IDExMCwKIAotICAgIC8qIE5PVEU6IElmIHlvdSBhZGQgYSBuZXcga2V5Y29kZSBoZXJlIHlvdSBtdXN0IGFsc28gYWRkIGl0IHRvOgotICAgICAqICBuYXRpdmUvaW5jbHVkZS9hbmRyb2lkL2tleWNvZGVzLmgKLSAgICAgKiAgZnJhbWV3b3Jrcy9iYXNlL2luY2x1ZGUvdWkvS2V5Y29kZUxhYmVscy5oCi0gICAgICogICBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhCi0gICAgICogICB0b29scy9wdXBwZXRfbWFzdGVyL1B1cHBldE1hc3Rlci5uYXZfa2V5cy5weQotICAgICAqICAgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcmVzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCi0gICAgICovCisgICAgLy8gTk9URTogSWYgeW91IGFkZCBhIG5ldyBrZXljb2RlIGhlcmUgeW91IG11c3QgYWxzbyBhZGQgaXQgdG8gc2V2ZXJhbCBvdGhlciBmaWxlcy4KKyAgICAvLyAgICAgICBSZWZlciB0byBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhL2FuZHJvaWQvdmlldy9LZXlFdmVudC5qYXZhIGZvciB0aGUgZnVsbCBsaXN0LgogfTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5oIGIvbmF0aXZlL2luY2x1ZGUvYW5kcm9pZC9uYXRpdmVfYWN0aXZpdHkuaAppbmRleCBkMGZmMDUyLi5lYTZmMDVmIDEwMDY0NAotLS0gYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkL25hdGl2ZV9hY3Rpdml0eS5oCisrKyBiL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWQvbmF0aXZlX2FjdGl2aXR5LmgKQEAgLTE0Nyw2ICsxNDcsMjEgQEAKICAgICB2b2lkICgqb25OYXRpdmVXaW5kb3dDcmVhdGVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOwogCiAgICAgLyoqCisgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBoYXMgYmVlbiByZXNpemVkLiAgWW91IHNob3VsZAorICAgICAqIHJldHJpZXZlIHRoZSBuZXcgc2l6ZSBmcm9tIHRoZSB3aW5kb3cgYW5kIGVuc3VyZSB0aGF0IHlvdXIgcmVuZGVyaW5nIGluCisgICAgICogaXQgbm93IG1hdGNoZXMuCisgICAgICovCisgICAgdm9pZCAoKm9uTmF0aXZlV2luZG93UmVzaXplZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgQU5hdGl2ZVdpbmRvdyogd2luZG93KTsKKworICAgIC8qKgorICAgICAqIFRoZSBkcmF3aW5nIHdpbmRvdyBmb3IgdGhpcyBuYXRpdmUgYWN0aXZpdHkgbmVlZHMgdG8gYmUgcmVkcmF3bi4gIFRvIGF2b2lkCisgICAgICogdHJhbnNpZW50IGFydGlmYWN0cyBkdXJpbmcgc2NyZWVuIGNoYW5nZXMgKHN1Y2ggcmVzaXppbmcgYWZ0ZXIgcm90YXRpb24pLAorICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgbm90IHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdW50aWwgdGhleSBoYXZlIGZpbmlzaGVkCisgICAgICogZHJhd2luZyB0aGVpciB3aW5kb3cgaW4gaXRzIGN1cnJlbnQgc3RhdGUuCisgICAgICovCisgICAgdm9pZCAoKm9uTmF0aXZlV2luZG93UmVkcmF3TmVlZGVkKShBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCBBTmF0aXZlV2luZG93KiB3aW5kb3cpOworCisgICAgLyoqCiAgICAgICogVGhlIGRyYXdpbmcgd2luZG93IGZvciB0aGlzIG5hdGl2ZSBhY3Rpdml0eSBpcyBnb2luZyB0byBiZSBkZXN0cm95ZWQuCiAgICAgICogWW91IE1VU1QgZW5zdXJlIHRoYXQgeW91IGRvIG5vdCB0b3VjaCB0aGUgd2luZG93IG9iamVjdCBhZnRlciByZXR1cm5pbmcKICAgICAgKiBmcm9tIHRoaXMgZnVuY3Rpb246IGluIHRoZSBjb21tb24gY2FzZSBvZiBkcmF3aW5nIHRvIHRoZSB3aW5kb3cgZnJvbQpAQCAtMTcwLDYgKzE4NSwxMSBAQAogICAgIHZvaWQgKCpvbklucHV0UXVldWVEZXN0cm95ZWQpKEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIEFJbnB1dFF1ZXVlKiBxdWV1ZSk7CiAKICAgICAvKioKKyAgICAgKiBUaGUgcmVjdGFuZ2xlIGluIHRoZSB3aW5kb3cgaW4gd2hpY2ggY29udGVudCBzaG91bGQgYmUgcGxhY2VkIGhhcyBjaGFuZ2VkLgorICAgICAqLworICAgIHZvaWQgKCpvbkNvbnRlbnRSZWN0Q2hhbmdlZCkoQU5hdGl2ZUFjdGl2aXR5KiBhY3Rpdml0eSwgY29uc3QgQVJlY3QqIHJlY3QpOworCisgICAgLyoqCiAgICAgICogVGhlIHN5c3RlbSBpcyBydW5uaW5nIGxvdyBvbiBtZW1vcnkuICBVc2UgdGhpcyBjYWxsYmFjayB0byByZWxlYXNlCiAgICAgICogcmVzb3VyY2VzIHlvdSBkbyBub3QgbmVlZCwgdG8gaGVscCB0aGUgc3lzdGVtIGF2b2lkIGtpbGxpbmcgbW9yZQogICAgICAqIGltcG9ydGFudCBwcm9jZXNzZXMuCkBAIC0xOTcsNiArMjE3LDI4IEBACiB2b2lkIEFOYXRpdmVBY3Rpdml0eV9zZXRXaW5kb3dGbGFncyhBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LAogICAgICAgICB1aW50MzJfdCBhZGRGbGFncywgdWludDMyX3QgcmVtb3ZlRmxhZ3MpOwogCisvKioKKyAqIEZsYWdzIGZvciBBTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dDsgc2VlIHRoZSBKYXZhIElucHV0TWV0aG9kTWFuYWdlcgorICogQVBJIGZvciBkb2N1bWVudGF0aW9uLgorICovCitlbnVtIHsKKyAgICBBTkFUSVZFQUNUSVZJVFlfU0hPV19TT0ZUX0lOUFVUX0lNUExJQ0lUID0gMHgwMDAxLAorICAgIEFOQVRJVkVBQ1RJVklUWV9TSE9XX1NPRlRfSU5QVVRfRk9SQ0VEID0gMHgwMDAyLAorfTsKKwordm9pZCBBTmF0aXZlQWN0aXZpdHlfc2hvd1NvZnRJbnB1dChBTmF0aXZlQWN0aXZpdHkqIGFjdGl2aXR5LCB1aW50MzJfdCBmbGFncyk7CisKKy8qKgorICogRmxhZ3MgZm9yIEFOYXRpdmVBY3Rpdml0eV9oaWRlU29mdElucHV0OyBzZWUgdGhlIEphdmEgSW5wdXRNZXRob2RNYW5hZ2VyCisgKiBBUEkgZm9yIGRvY3VtZW50YXRpb24uCisgKi8KK2VudW0geworICAgIEFOQVRJVkVBQ1RJVklUWV9ISURFX1NPRlRfSU5QVVRfSU1QTElDSVRfT05MWSA9IDB4MDAwMSwKKyAgICBBTkFUSVZFQUNUSVZJVFlfSElERV9TT0ZUX0lOUFVUX05PVF9BTFdBWVMgPSAweDAwMDIsCit9OworCit2b2lkIEFOYXRpdmVBY3Rpdml0eV9oaWRlU29mdElucHV0KEFOYXRpdmVBY3Rpdml0eSogYWN0aXZpdHksIHVpbnQzMl90IGZsYWdzKTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkX2dsdWUvdGhyZWFkZWRfYXBwLmggYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkX2dsdWUvdGhyZWFkZWRfYXBwLmgKaW5kZXggYWRmZGJlYS4uMmI1OGU5YzIgMTAwNjQ0Ci0tLSBhL25hdGl2ZS9pbmNsdWRlL2FuZHJvaWRfZ2x1ZS90aHJlYWRlZF9hcHAuaAorKysgYi9uYXRpdmUvaW5jbHVkZS9hbmRyb2lkX2dsdWUvdGhyZWFkZWRfYXBwLmgKQEAgLTQ4LDYgKzQ4LDEwIEBACiAgICAgLy8gV2hlbiBub24tTlVMTCwgdGhpcyBpcyB0aGUgd2luZG93IHN1cmZhY2UgdGhhdCB0aGUgYXBwIGNhbiBkcmF3IGluLgogICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdzsKIAorICAgIC8vIEN1cnJlbnQgY29udGVudCByZWN0YW5nbGUgb2YgdGhlIHdpbmRvdzsgdGhpcyBpcyB0aGUgYXJlYSB3aGVyZSB0aGUKKyAgICAvLyB3aW5kb3cncyBjb250ZW50IHNob3VsZCBiZSBwbGFjZWQgdG8gYmUgc2VlbiBieSB0aGUgdXNlci4KKyAgICBBUmVjdCBjb250ZW50UmVjdDsKKwogICAgIC8vIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGFwcCdzIGFjdGl2aXR5LiAgTWF5IGJlIGVpdGhlciBBUFBfQ01EX1NUQVJULAogICAgIC8vIEFQUF9DTURfUkVTVU1FLCBBUFBfQ01EX1BBVVNFLCBvciBBUFBfQ01EX1NUT1A7IHNlZSBiZWxvdy4KICAgICBpbnQgYWN0aXZpdHlTdGF0ZTsKQEAgLTY5LDggKzczLDEwIEBACiAKICAgICBpbnQgcnVubmluZzsKICAgICBpbnQgZGVzdHJveWVkOworICAgIGludCByZWRyYXdOZWVkZWQ7CiAgICAgQUlucHV0UXVldWUqIHBlbmRpbmdJbnB1dFF1ZXVlOwogICAgIEFOYXRpdmVXaW5kb3cqIHBlbmRpbmdXaW5kb3c7CisgICAgQVJlY3QgcGVuZGluZ0NvbnRlbnRSZWN0OwogfTsKIAogZW51bSB7CkBAIC0xMDUsNiArMTExLDI2IEBACiAgICAgQVBQX0NNRF9XSU5ET1dfQ0hBTkdFRCwKIAogICAgIC8qKgorICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIGN1cnJlbnQgQU5hdGl2ZVdpbmRvdyBoYXMgYmVlbiByZXNpemVkLgorICAgICAqIFBsZWFzZSByZWRyYXcgd2l0aCBpdHMgbmV3IHNpemUuCisgICAgICovCisgICAgQVBQX0NNRF9XSU5ET1dfUkVTSVpFRCwKKworICAgIC8qKgorICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIHN5c3RlbSBuZWVkcyB0aGF0IHRoZSBjdXJyZW50IEFOYXRpdmVXaW5kb3cKKyAgICAgKiBiZSByZWRyYXduLiAgWW91IHNob3VsZCByZWRyYXcgdGhlIHdpbmRvdyBiZWZvcmUgaGFuZGluZyB0aGlzIHRvCisgICAgICogYW5kcm9pZF9hcHBfZXhlY19jbWQoKSBpbiBvcmRlciB0byBhdm9pZCB0cmFuc2llbnQgZHJhd2luZyBnbGl0Y2hlcy4KKyAgICAgKi8KKyAgICBBUFBfQ01EX1dJTkRPV19SRURSQVdfTkVFREVELAorCisgICAgLyoqCisgICAgICogQ29tbWFuZCBmcm9tIG1haW4gdGhyZWFkOiB0aGUgY29udGVudCBhcmVhIG9mIHRoZSB3aW5kb3cgaGFzIGNoYW5nZWQsCisgICAgICogc3VjaCBhcyBmcm9tIHRoZSBzb2Z0IGlucHV0IHdpbmRvdyBiZWluZyBzaG93biBvciBoaWRkZW4uICBZb3UgY2FuCisgICAgICogZmluZCB0aGUgbmV3IGNvbnRlbnQgcmVjdCBpbiBhbmRyb2lkX2FwcDo6Y29udGVudFJlY3QuCisgICAgICovCisgICAgQVBQX0NNRF9DT05URU5UX1JFQ1RfQ0hBTkdFRCwKKworICAgIC8qKgogICAgICAqIENvbW1hbmQgZnJvbSBtYWluIHRocmVhZDogdGhlIGFwcCdzIGFjdGl2aXR5IHdpbmRvdyBoYXMgZ2FpbmVkCiAgICAgICogaW5wdXQgZm9jdXMuCiAgICAgICovCkBAIC0xMTcsNiArMTQzLDEyIEBACiAgICAgQVBQX0NNRF9MT1NUX0ZPQ1VTLAogCiAgICAgLyoqCisgICAgICogQ29tbWFuZCBmcm9tIG1haW4gdGhyZWFkOiB0aGUgc3lzdGVtIGlzIHJ1bm5pbmcgbG93IG9uIG1lbW9yeS4KKyAgICAgKiBUcnkgdG8gcmVkdWNlIHlvdXIgbWVtb3J5IHVzZS4KKyAgICAgKi8KKyAgICBBUFBfQ01EX0xPV19NRU1PUlksCisKKyAgICAvKioKICAgICAgKiBDb21tYW5kIGZyb20gbWFpbiB0aHJlYWQ6IHRoZSBhcHAncyBhY3Rpdml0eSBoYXMgYmVlbiBzdGFydGVkLgogICAgICAqLwogICAgIEFQUF9DTURfU1RBUlQsCmRpZmYgLS1naXQgYS9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFN1cmZhY2VWaWV3LmphdmEgYi9vcGVuZ2wvamF2YS9hbmRyb2lkL29wZW5nbC9HTFN1cmZhY2VWaWV3LmphdmEKaW5kZXggMmZmMjMxZC4uNDEyMDdmNyAxMDA2NDQKLS0tIGEvb3BlbmdsL2phdmEvYW5kcm9pZC9vcGVuZ2wvR0xTdXJmYWNlVmlldy5qYXZhCisrKyBiL29wZW5nbC9qYXZhL2FuZHJvaWQvb3BlbmdsL0dMU3VyZmFjZVZpZXcuamF2YQpAQCAtMjIyLDYgKzIyMiwxMCBAQAogICAgICAgICAvLyB1bmRlcmx5aW5nIHN1cmZhY2UgaXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkCiAgICAgICAgIFN1cmZhY2VIb2xkZXIgaG9sZGVyID0gZ2V0SG9sZGVyKCk7CiAgICAgICAgIGhvbGRlci5hZGRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgLy8gc2V0Rm9ybWF0IGlzIGRvbmUgYnkgU3VyZmFjZVZpZXcgaW4gU0RLIDIuMyBhbmQgbmV3ZXIuIFVuY29tbWVudAorICAgICAgICAvLyB0aGlzIHN0YXRlbWVudCBpZiBiYWNrLXBvcnRpbmcgdG8gMi4yIG9yIG9sZGVyOgorICAgICAgICAvLyBob2xkZXIuc2V0Rm9ybWF0KFBpeGVsRm9ybWF0LlJHQl81NjUpOworICAgICAgICAvLwogICAgICAgICAvLyBzZXRUeXBlIGlzIG5vdCBuZWVkZWQgZm9yIFNESyAyLjAgb3IgbmV3ZXIuIFVuY29tbWVudCB0aGlzCiAgICAgICAgIC8vIHN0YXRlbWVudCBpZiBiYWNrLXBvcnRpbmcgdGhpcyBjb2RlIHRvIG9sZGVyIFNES3MuCiAgICAgICAgIC8vIGhvbGRlci5zZXRUeXBlKFN1cmZhY2VIb2xkZXIuU1VSRkFDRV9UWVBFX0dQVSk7CkBAIC0xMTAzLDcgKzExMDcsNiBAQAogICAgICAgICAgICAgbVJlbmRlcmVyID0gcmVuZGVyZXI7CiAgICAgICAgIH0KIAotCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgICAgICBzZXROYW1lKCJHTFRocmVhZCAiICsgZ2V0SWQoKSk7CkBAIC0xMTU0LDYgKzExNTcsNyBAQAogICAgICAgICAgICAgICAgIGJvb2xlYW4gc2l6ZUNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBib29sZWFuIHdhbnRSZW5kZXJOb3RpZmljYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICBib29sZWFuIGRvUmVuZGVyTm90aWZpY2F0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBhc2tlZFRvUmVsZWFzZUVnbENvbnRleHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICBpbnQgdyA9IDA7CiAgICAgICAgICAgICAgICAgaW50IGggPSAwOwogICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGV2ZW50ID0gbnVsbDsKQEAgLTExNzksNiArMTE4MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gd2UgbmVlZCB0byBnaXZlIHVwIHRoZSBFR0wgY29udGV4dD8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNob3VsZFJlbGVhc2VFZ2xDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dfU1VSRkFDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkdMVGhyZWFkIiwgInJlbGVhc2luZyBFR0wgY29udGV4dCBiZWNhdXNlIGFza2VkIHRvIHRpZD0iICsgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEVnbFN1cmZhY2VMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEVnbENvbnRleHRMb2NrZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNob3VsZFJlbGVhc2VFZ2xDb250ZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFza2VkVG9SZWxlYXNlRWdsQ29udGV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGF2ZSB3ZSBsb3N0IHRoZSBFR0wgY29udGV4dD8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9zdEVnbENvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcEVnbFN1cmZhY2VMb2NrZWQoKTsKQEAgLTEyMjgsNiArMTI0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRvUmVuZGVyTm90aWZpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dfU1VSRkFDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoIkdMVGhyZWFkIiwgInNlbmRpbmcgcmVuZGVyIG5vdGlmaWNhdGlvbiB0aWQ9IiArIGdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRSZW5kZXJOb3RpZmljYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9SZW5kZXJOb3RpZmljYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlckNvbXBsZXRlID0gdHJ1ZTsKQEAgLTEyMzUsMjIgKzEyNTMsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkeSB0byBkcmF3PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIW1QYXVzZWQpICYmIG1IYXNTdXJmYWNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtV2lkdGggPiAwKSAmJiAobUhlaWdodCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtUmVxdWVzdFJlbmRlciB8fCAobVJlbmRlck1vZGUgPT0gUkVOREVSTU9ERV9DT05USU5VT1VTTFkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWFkeVRvRHJhdygpKSB7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBhbiBFR0wgY29udGV4dCwgdHJ5IHRvIGFjcXVpcmUgb25lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEgbUhhdmVFZ2xDb250ZXh0KSAmJiBzR0xUaHJlYWRNYW5hZ2VyLnRyeUFjcXVpcmVFZ2xDb250ZXh0TG9ja2VkKHRoaXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FZ2xIZWxwZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIucmVsZWFzZUVnbENvbnRleHRMb2NrZWQodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlRWdsQ29udGV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVFZ2xDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbUhhdmVFZ2xDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXNrZWRUb1JlbGVhc2VFZ2xDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNrZWRUb1JlbGVhc2VFZ2xDb250ZXh0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNHTFRocmVhZE1hbmFnZXIudHJ5QWNxdWlyZUVnbENvbnRleHRMb2NrZWQodGhpcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWdsSGVscGVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIucmVsZWFzZUVnbENvbnRleHRMb2NrZWQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IYXZlRWdsQ29udGV4dCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRWdsQ29udGV4dCA9IHRydWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci5ub3RpZnlBbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtSGF2ZUVnbENvbnRleHQgJiYgIW1IYXZlRWdsU3VyZmFjZSkgewpAQCAtMTI2NSw2ICsxMjg1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gbVdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggPSBtSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRSZW5kZXJOb3RpZmljYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dfU1VSRkFDRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiR0xUaHJlYWQiLCAibm90aWNpbmcgdGhhdCB3ZSB3YW50IHJlbmRlciBub3RpZmljYXRpb24gdGlkPSIgKyBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRFJBV19UV0lDRV9BRlRFUl9TSVpFX0NIQU5HRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2Uga2VlcCBtUmVxdWVzdFJlbmRlciB0cnVlIHNvIHRoYXQgd2UgZHJhdyB0d2ljZSBhZnRlciB0aGUgc2l6ZSBjaGFuZ2VzLgpAQCAtMTI4NCw3ICsxMzA3LDE2IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCeSBkZXNpZ24sIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gYSBHTFRocmVhZCB0aHJlYWQgd2hlcmUgd2Ugd2FpdCgpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dfVEhSRUFEUykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiR0xUaHJlYWQiLCAid2FpdGluZyB0aWQ9IiArIGdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiR0xUaHJlYWQiLCAid2FpdGluZyB0aWQ9IiArIGdldElkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtSGF2ZUVnbENvbnRleHQ6ICIgKyBtSGF2ZUVnbENvbnRleHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtSGF2ZUVnbFN1cmZhY2U6ICIgKyBtSGF2ZUVnbFN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtUGF1c2VkOiAiICsgbVBhdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1IYXNTdXJmYWNlOiAiICsgbUhhc1N1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtV2FpdGluZ0ZvclN1cmZhY2U6ICIgKyBtV2FpdGluZ0ZvclN1cmZhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtV2lkdGg6ICIgKyBtV2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtSGVpZ2h0OiAiICsgbUhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1SZXF1ZXN0UmVuZGVyOiAiICsgbVJlcXVlc3RSZW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBtUmVuZGVyTW9kZTogIiArIG1SZW5kZXJNb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0dMVGhyZWFkTWFuYWdlci53YWl0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMzI2LDcgKzEzNTgsNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19SRU5ERVJFUl9EUkFXX0ZSQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudygiR0xUaHJlYWQiLCAib25EcmF3RnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KCJHTFRocmVhZCIsICJvbkRyYXdGcmFtZSB0aWQ9IiArIGdldElkKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci5vbkRyYXdGcmFtZShnbCk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbUVnbEhlbHBlci5zd2FwKCkpIHsKQEAgLTEzNTIsNiArMTM4NCwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWJsZVRvRHJhdygpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGF2ZUVnbENvbnRleHQgJiYgbUhhdmVFZ2xTdXJmYWNlICYmIHJlYWR5VG9EcmF3KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVhZHlUb0RyYXcoKSB7CisgICAgICAgICAgICByZXR1cm4gKCFtUGF1c2VkKSAmJiBtSGFzU3VyZmFjZQorICAgICAgICAgICAgICAgICYmIChtV2lkdGggPiAwKSAmJiAobUhlaWdodCA+IDApCisgICAgICAgICAgICAgICAgJiYgKG1SZXF1ZXN0UmVuZGVyIHx8IChtUmVuZGVyTW9kZSA9PSBSRU5ERVJNT0RFX0NPTlRJTlVPVVNMWSkpOworICAgICAgICB9CisKICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVuZGVyTW9kZShpbnQgcmVuZGVyTW9kZSkgewogICAgICAgICAgICAgaWYgKCAhKChSRU5ERVJNT0RFX1dIRU5fRElSVFkgPD0gcmVuZGVyTW9kZSkgJiYgKHJlbmRlck1vZGUgPD0gUkVOREVSTU9ERV9DT05USU5VT1VTTFkpKSApIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW5kZXJNb2RlIik7CkBAIC0xNDYxLDkgKzE1MDMsMTAgQEAKICAgICAgICAgICAgICAgICBzR0xUaHJlYWRNYW5hZ2VyLm5vdGlmeUFsbCgpOwogCiAgICAgICAgICAgICAgICAgLy8gV2FpdCBmb3IgdGhyZWFkIHRvIHJlYWN0IHRvIHJlc2l6ZSBhbmQgcmVuZGVyIGEgZnJhbWUKLSAgICAgICAgICAgICAgICB3aGlsZSAoISBtRXhpdGVkICYmICFtUGF1c2VkICYmICFtUmVuZGVyQ29tcGxldGUgKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCEgbUV4aXRlZCAmJiAhbVBhdXNlZCAmJiAhbVJlbmRlckNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUdMVGhyZWFkICE9IG51bGwgJiYgbUdMVGhyZWFkLmFibGVUb0RyYXcoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKExPR19TVVJGQUNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaSgiTWFpbiB0aHJlYWQiLCAib25XaW5kb3dSZXNpemUgd2FpdGluZyBmb3IgcmVuZGVyIGNvbXBsZXRlLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoIk1haW4gdGhyZWFkIiwgIm9uV2luZG93UmVzaXplIHdhaXRpbmcgZm9yIHJlbmRlciBjb21wbGV0ZSBmcm9tIHRpZD0iICsgbUdMVGhyZWFkLmdldElkKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzR0xUaHJlYWRNYW5hZ2VyLndhaXQoKTsKQEAgLTE0OTAsNiArMTUzMywxMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFJlbGVhc2VFZ2xDb250ZXh0TG9ja2VkKCkgeworICAgICAgICAgICAgbVNob3VsZFJlbGVhc2VFZ2xDb250ZXh0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHNHTFRocmVhZE1hbmFnZXIubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKwogICAgICAgICAvKioKICAgICAgICAgICogUXVldWUgYW4gImV2ZW50IiB0byBiZSBydW4gb24gdGhlIEdMIHJlbmRlcmluZyB0aHJlYWQuCiAgICAgICAgICAqIEBwYXJhbSByIHRoZSBydW5uYWJsZSB0byBiZSBydW4gb24gdGhlIEdMIHJlbmRlcmluZyB0aHJlYWQuCkBAIC0xNTE0LDYgKzE1NjIsNyBAQAogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVdhaXRpbmdGb3JTdXJmYWNlOwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVFZ2xDb250ZXh0OwogICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUhhdmVFZ2xTdXJmYWNlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVNob3VsZFJlbGVhc2VFZ2xDb250ZXh0OwogICAgICAgICBwcml2YXRlIGludCBtV2lkdGg7CiAgICAgICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CiAgICAgICAgIHByaXZhdGUgaW50IG1SZW5kZXJNb2RlOwpAQCAtMTU5OCw2ICsxNjQ3LDEzIEBACiAgICAgICAgICAgICBpZiAobU11bHRpcGxlR0xFU0NvbnRleHRzQWxsb3dlZCkgewogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBvd25pbmcgdGhyZWFkIHRoYXQgaXQgc2hvdWxkIHJlbGVhc2UgdGhlIGNvbnRleHQuCisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYSBmYWlybmVzcyBwb2xpY3kuIEN1cnJlbnRseQorICAgICAgICAgICAgLy8gaWYgdGhlIG93bmluZyB0aHJlYWQgaXMgZHJhd2luZyBjb250aW51b3VzbHkgaXQgd2lsbCBqdXN0CisgICAgICAgICAgICAvLyByZWFjcXVpcmUgdGhlIEVHTCBjb250ZXh0LgorICAgICAgICAgICAgaWYgKG1FZ2xPd25lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbUVnbE93bmVyLnJlcXVlc3RSZWxlYXNlRWdsQ29udGV4dExvY2tlZCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9EYXRhYmFzZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKaW5kZXggY2Q0Zjk2ZC4uNzM5NTIzMyAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKKysrIGIvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL0RhdGFiYXNlSGVscGVyLmphdmEKQEAgLTQ5LDYgKzQ5LDcgQEAKIGltcG9ydCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCkBAIC02NywxMSArNjgsMjkgQEAKIAogICAgIHByaXZhdGUgQ29udGV4dCBtQ29udGV4dDsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhhc2hTZXQ8U3RyaW5nPiBtVmFsaWRUYWJsZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBtVmFsaWRUYWJsZXMuYWRkKCJzeXN0ZW0iKTsKKyAgICAgICAgbVZhbGlkVGFibGVzLmFkZCgic2VjdXJlIik7CisgICAgICAgIG1WYWxpZFRhYmxlcy5hZGQoImJsdWV0b290aF9kZXZpY2VzIik7CisgICAgICAgIG1WYWxpZFRhYmxlcy5hZGQoImJvb2ttYXJrcyIpOworCisgICAgICAgIC8vIFRoZXNlIGFyZSBvbGQuCisgICAgICAgIG1WYWxpZFRhYmxlcy5hZGQoImZhdm9yaXRlcyIpOworICAgICAgICBtVmFsaWRUYWJsZXMuYWRkKCJnc2VydmljZXMiKTsKKyAgICAgICAgbVZhbGlkVGFibGVzLmFkZCgib2xkX2Zhdm9yaXRlcyIpOworICAgIH0KKwogICAgIHB1YmxpYyBEYXRhYmFzZUhlbHBlcihDb250ZXh0IGNvbnRleHQpIHsKICAgICAgICAgc3VwZXIoY29udGV4dCwgREFUQUJBU0VfTkFNRSwgbnVsbCwgREFUQUJBU0VfVkVSU0lPTik7CiAgICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFRhYmxlKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBtVmFsaWRUYWJsZXMuY29udGFpbnMobmFtZSk7CisgICAgfQorCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlY3VyZVRhYmxlKFNRTGl0ZURhdGFiYXNlIGRiKSB7CiAgICAgICAgIGRiLmV4ZWNTUUwoIkNSRUFURSBUQUJMRSBzZWN1cmUgKCIgKwogICAgICAgICAgICAgICAgICJfaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCIgKwpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL1NldHRpbmdzUHJvdmlkZXIvc3JjL2NvbS9hbmRyb2lkL3Byb3ZpZGVycy9zZXR0aW5ncy9TZXR0aW5nc1Byb3ZpZGVyLmphdmEKaW5kZXggMTAxOWZhOC4uNmE1MjkwZSAxMDA2NDQKLS0tIGEvcGFja2FnZXMvU2V0dGluZ3NQcm92aWRlci9zcmMvY29tL2FuZHJvaWQvcHJvdmlkZXJzL3NldHRpbmdzL1NldHRpbmdzUHJvdmlkZXIuamF2YQorKysgYi9wYWNrYWdlcy9TZXR0aW5nc1Byb3ZpZGVyL3NyYy9jb20vYW5kcm9pZC9wcm92aWRlcnMvc2V0dGluZ3MvU2V0dGluZ3NQcm92aWRlci5qYXZhCkBAIC04Myw2ICs4Myw5IEBACiAgICAgICAgIFNxbEFyZ3VtZW50cyhVcmkgdXJsLCBTdHJpbmcgd2hlcmUsIFN0cmluZ1tdIGFyZ3MpIHsKICAgICAgICAgICAgIGlmICh1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuc2l6ZSgpID09IDEpIHsKICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlID0gdXJsLmdldFBhdGhTZWdtZW50cygpLmdldCgwKTsKKyAgICAgICAgICAgICAgICBpZiAoIURhdGFiYXNlSGVscGVyLmlzVmFsaWRUYWJsZSh0aGlzLnRhYmxlKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCYWQgcm9vdCBwYXRoOiAiICsgdGhpcy50YWJsZSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRoaXMud2hlcmUgPSB3aGVyZTsKICAgICAgICAgICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgICAgICAgICAgfSBlbHNlIGlmICh1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuc2l6ZSgpICE9IDIpIHsKQEAgLTkxLDYgKzk0LDkgQEAKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIldIRVJFIGNsYXVzZSBub3Qgc3VwcG9ydGVkOiAiICsgdXJsKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdGhpcy50YWJsZSA9IHVybC5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKCFEYXRhYmFzZUhlbHBlci5pc1ZhbGlkVGFibGUodGhpcy50YWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHJvb3QgcGF0aDogIiArIHRoaXMudGFibGUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoInN5c3RlbSIuZXF1YWxzKHRoaXMudGFibGUpIHx8ICJzZWN1cmUiLmVxdWFscyh0aGlzLnRhYmxlKSkgewogICAgICAgICAgICAgICAgICAgICB0aGlzLndoZXJlID0gU2V0dGluZ3MuTmFtZVZhbHVlVGFibGUuTkFNRSArICI9PyI7CiAgICAgICAgICAgICAgICAgICAgIHRoaXMuYXJncyA9IG5ldyBTdHJpbmdbXSB7IHVybC5nZXRQYXRoU2VnbWVudHMoKS5nZXQoMSkgfTsKQEAgLTEwNSw2ICsxMTEsOSBAQAogICAgICAgICBTcWxBcmd1bWVudHMoVXJpIHVybCkgewogICAgICAgICAgICAgaWYgKHVybC5nZXRQYXRoU2VnbWVudHMoKS5zaXplKCkgPT0gMSkgewogICAgICAgICAgICAgICAgIHRoaXMudGFibGUgPSB1cmwuZ2V0UGF0aFNlZ21lbnRzKCkuZ2V0KDApOworICAgICAgICAgICAgICAgIGlmICghRGF0YWJhc2VIZWxwZXIuaXNWYWxpZFRhYmxlKHRoaXMudGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJhZCByb290IHBhdGg6ICIgKyB0aGlzLnRhYmxlKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdGhpcy53aGVyZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgdGhpcy5hcmdzID0gbnVsbDsKICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEgYi9wb2xpY3kvc3JjL2NvbS9hbmRyb2lkL2ludGVybmFsL3BvbGljeS9pbXBsL1Bob25lV2luZG93LmphdmEKaW5kZXggNTY0MjU4OC4uYjkyMzJjOCAxMDA2NDQKLS0tIGEvcG9saWN5L3NyYy9jb20vYW5kcm9pZC9pbnRlcm5hbC9wb2xpY3kvaW1wbC9QaG9uZVdpbmRvdy5qYXZhCisrKyBiL3BvbGljeS9zcmMvY29tL2FuZHJvaWQvaW50ZXJuYWwvcG9saWN5L2ltcGwvUGhvbmVXaW5kb3cuamF2YQpAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgLy8gbURlY29yIGl0c2VsZiwgb3IgYSBjaGlsZCBvZiBtRGVjb3Igd2hlcmUgdGhlIGNvbnRlbnRzIGdvLgogICAgIHByaXZhdGUgVmlld0dyb3VwIG1Db250ZW50UGFyZW50OwogCi0gICAgU3VyZmFjZUhvbGRlci5DYWxsYmFjayBtVGFrZVN1cmZhY2VDYWxsYmFjazsKKyAgICBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrMiBtVGFrZVN1cmZhY2VDYWxsYmFjazsKICAgICBCYXNlU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlcjsKICAgICAKICAgICBJbnB1dFF1ZXVlLkNhbGxiYWNrIG1UYWtlSW5wdXRRdWV1ZUNhbGxiYWNrOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZVN1cmZhY2UoU3VyZmFjZUhvbGRlci5DYWxsYmFjayBjYWxsYmFjaykgeworICAgIHB1YmxpYyB2b2lkIHRha2VTdXJmYWNlKFN1cmZhY2VIb2xkZXIuQ2FsbGJhY2syIGNhbGxiYWNrKSB7CiAgICAgICAgIG1UYWtlU3VyZmFjZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgfQogICAgIApAQCAtMjAzOCw3ICsyMDM4LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHB1YmxpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjayB3aWxsWW91VGFrZVRoZVN1cmZhY2UoKSB7CisgICAgICAgIHB1YmxpYyBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlci5DYWxsYmFjazIgd2lsbFlvdVRha2VUaGVTdXJmYWNlKCkgewogICAgICAgICAgICAgcmV0dXJuIG1GZWF0dXJlSWQgPCAwID8gbVRha2VTdXJmYWNlQ2FsbGJhY2sgOiBudWxsOwogICAgICAgICB9CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlld1NlcnZlci5qYXZhIGIvc2VydmljZXMvamF2YS9jb20vYW5kcm9pZC9zZXJ2ZXIvVmlld1NlcnZlci5qYXZhCmluZGV4IGFlMDA0MzguLmIzNjlmNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1ZpZXdTZXJ2ZXIuamF2YQorKysgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9WaWV3U2VydmVyLmphdmEKQEAgLTIxLDYgKzIxLDggQEAKIGltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OwogaW1wb3J0IGphdmEubmV0LkluZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CkBAIC00MSwxMSArNDMsMTMgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWSUVXX1NFUlZFUl9ERUZBVUxUX1BPUlQgPSA0OTM5OwogCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZJRVdfU0VSVkVSX01BWF9DT05ORUNUSU9OUyA9IDEwOworCiAgICAgLy8gRGVidWcgZmFjaWxpdHkKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RBRyA9ICJWaWV3U2VydmVyIjsKIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9QUk9UT0NPTF9WRVJTSU9OID0gIjIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9TRVJWRVJfVkVSU0lPTiA9ICIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfUFJPVE9DT0xfVkVSU0lPTiA9ICIzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU0VSVkVSX1ZFUlNJT04gPSAiNCI7CiAKICAgICAvLyBQcm90b2NvbCBjb21tYW5kcwogICAgIC8vIFJldHVybnMgdGhlIHByb3RvY29sIHZlcnNpb24KQEAgLTU0LDYgKzU4LDggQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVJWRVJfVkVSU0lPTiA9ICJTRVJWRVIiOwogICAgIC8vIExpc3RzIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHdpbmRvd3MgaW4gdGhlIHN5c3RlbQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1dJTkRPV19NQU5BR0VSX0xJU1QgPSAiTElTVCI7CisgICAgLy8gS2VlcHMgYSBjb25uZWN0aW9uIG9wZW4gYW5kIG5vdGlmaWVzIHdoZW4gdGhlIGxpc3Qgb2Ygd2luZG93cyBjaGFuZ2VzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfV0lORE9XX01BTkFHRVJfQVVUT0xJU1QgPSAiQVVUT0xJU1QiOwogCiAgICAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXQgbVNlcnZlcjsKICAgICBwcml2YXRlIFRocmVhZCBtVGhyZWFkOwpAQCAtNjEsNiArNjcsOCBAQAogICAgIHByaXZhdGUgZmluYWwgV2luZG93TWFuYWdlclNlcnZpY2UgbVdpbmRvd01hbmFnZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVBvcnQ7CiAKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBtVGhyZWFkUG9vbDsKKwogICAgIC8qKgogICAgICAqIENyZWF0ZXMgYSBuZXcgVmlld1NlcnZlciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCB3aW5kb3cgbWFuYWdlci4KICAgICAgKiBUaGUgc2VydmVyIHVzZXMgdGhlIGRlZmF1bHQgcG9ydCB7QGxpbmsgI1ZJRVdfU0VSVkVSX0RFRkFVTFRfUE9SVH0uIFRoZSBzZXJ2ZXIKQEAgLTEwMyw4ICsxMTEsOSBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgbVNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQsIDEsIEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpKTsKKyAgICAgICAgbVNlcnZlciA9IG5ldyBTZXJ2ZXJTb2NrZXQobVBvcnQsIFZJRVdfU0VSVkVSX01BWF9DT05ORUNUSU9OUywgSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkpOwogICAgICAgICBtVGhyZWFkID0gbmV3IFRocmVhZCh0aGlzLCAiUmVtb3RlIFZpZXcgU2VydmVyIFtwb3J0PSIgKyBtUG9ydCArICJdIik7CisgICAgICAgIG1UaHJlYWRQb29sID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbChWSUVXX1NFUlZFUl9NQVhfQ09OTkVDVElPTlMpOwogICAgICAgICBtVGhyZWFkLnN0YXJ0KCk7CiAKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC0xMjIsNyArMTMxLDE2IEBACiAgICAgICovCiAgICAgYm9vbGVhbiBzdG9wKCkgewogICAgICAgICBpZiAobVRocmVhZCAhPSBudWxsKSB7CisKICAgICAgICAgICAgIG1UaHJlYWQuaW50ZXJydXB0KCk7CisgICAgICAgICAgICBpZiAobVRocmVhZFBvb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRQb29sLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkNvdWxkIG5vdCBzdG9wIGFsbCB2aWV3IHNlcnZlciB0aHJlYWRzIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRocmVhZFBvb2wgPSBudWxsOwogICAgICAgICAgICAgbVRocmVhZCA9IG51bGw7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIG1TZXJ2ZXIuY2xvc2UoKTsKQEAgLTE1Miw2MiArMTcwLDIxIEBACiAgICAgICogTWFpbiBzZXJ2ZXIgbG9vcC4KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgIGZpbmFsIFNlcnZlclNvY2tldCBzZXJ2ZXIgPSBtU2VydmVyOwotCiAgICAgICAgIHdoaWxlIChUaHJlYWQuY3VycmVudFRocmVhZCgpID09IG1UaHJlYWQpIHsKLSAgICAgICAgICAgIFNvY2tldCBjbGllbnQgPSBudWxsOwogICAgICAgICAgICAgLy8gQW55IHVuY2F1Z2h0IGV4Y2VwdGlvbiB3aWxsIGNyYXNoIHRoZSBzeXN0ZW0gcHJvY2VzcwogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBjbGllbnQgPSBzZXJ2ZXIuYWNjZXB0KCk7Ci0KLSAgICAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciBpbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNsaWVudC5nZXRJbnB1dFN0cmVhbSgpKSwgMTAyNCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3QgPSBpbi5yZWFkTGluZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21tYW5kOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyYW1ldGVyczsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXF1ZXN0LmluZGV4T2YoJyAnKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAiIjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgPSByZXF1ZXN0LnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gcmVxdWVzdC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICBpZiAoQ09NTUFORF9QUk9UT0NPTF9WRVJTSU9OLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVmFsdWUoY2xpZW50LCBWQUxVRV9QUk9UT0NPTF9WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDT01NQU5EX1NFUlZFUl9WRVJTSU9OLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdyaXRlVmFsdWUoY2xpZW50LCBWQUxVRV9TRVJWRVJfVkVSU0lPTik7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09NTUFORF9XSU5ET1dfTUFOQUdFUl9MSVNULmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaW5kb3dNYW5hZ2VyLnZpZXdTZXJ2ZXJMaXN0V2luZG93cyhjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbVdpbmRvd01hbmFnZXIudmlld1NlcnZlcldpbmRvd0NvbW1hbmQoY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLCBwYXJhbWV0ZXJzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkFuIGVycm9yIG9jY3VyZWQgd2l0aCB0aGUgY29tbWFuZDogIiArIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiQ29ubmVjdGlvbiBlcnJvcjogIiwgZSk7Ci0gICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFNvY2tldCBjbGllbnQgPSBtU2VydmVyLmFjY2VwdCgpOworICAgICAgICAgICAgICAgIGlmKG1UaHJlYWRQb29sICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbVRocmVhZFBvb2wuc3VibWl0KG5ldyBWaWV3U2VydmVyV29ya2VyKGNsaWVudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJDb25uZWN0aW9uIGVycm9yOiAiLCBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTIzNSw0ICsyMTIsMTMxIEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisKKyAgICBjbGFzcyBWaWV3U2VydmVyV29ya2VyIGltcGxlbWVudHMgUnVubmFibGUsIFdpbmRvd01hbmFnZXJTZXJ2aWNlLldpbmRvd0NoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBTb2NrZXQgbUNsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkV2luZG93TGlzdFVwZGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkRm9jdXNlZFdpbmRvd1VwZGF0ZTsKKyAgICAgICAgcHVibGljIFZpZXdTZXJ2ZXJXb3JrZXIoU29ja2V0IGNsaWVudCkgeworICAgICAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIG1OZWVkV2luZG93TGlzdFVwZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgbU5lZWRGb2N1c2VkV2luZG93VXBkYXRlID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKG1DbGllbnQuZ2V0SW5wdXRTdHJlYW0oKSksIDEwMjQpOworCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3QgPSBpbi5yZWFkTGluZSgpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIGNvbW1hbmQ7CisgICAgICAgICAgICAgICAgU3RyaW5nIHBhcmFtZXRlcnM7CisKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSByZXF1ZXN0LmluZGV4T2YoJyAnKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZCA9IHJlcXVlc3Q7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAiIjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb21tYW5kID0gcmVxdWVzdC5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzID0gcmVxdWVzdC5zdWJzdHJpbmcoaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoQ09NTUFORF9QUk9UT0NPTF9WRVJTSU9OLmVxdWFsc0lnbm9yZUNhc2UoY29tbWFuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gd3JpdGVWYWx1ZShtQ2xpZW50LCBWQUxVRV9QUk9UT0NPTF9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTU1BTkRfU0VSVkVSX1ZFUlNJT04uZXF1YWxzSWdub3JlQ2FzZShjb21tYW5kKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB3cml0ZVZhbHVlKG1DbGllbnQsIFZBTFVFX1NFUlZFUl9WRVJTSU9OKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENPTU1BTkRfV0lORE9XX01BTkFHRVJfTElTVC5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1XaW5kb3dNYW5hZ2VyLnZpZXdTZXJ2ZXJMaXN0V2luZG93cyhtQ2xpZW50KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoQ09NTUFORF9XSU5ET1dfTUFOQUdFUl9BVVRPTElTVC5lcXVhbHNJZ25vcmVDYXNlKGNvbW1hbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdpbmRvd01hbmFnZXJBdXRvbGlzdExvb3AoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtV2luZG93TWFuYWdlci52aWV3U2VydmVyV2luZG93Q29tbWFuZChtQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsIHBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIFNsb2cudyhMT0dfVEFHLCAiQW4gZXJyb3Igb2NjdXJlZCB3aXRoIHRoZSBjb21tYW5kOiAiICsgY29tbWFuZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU2xvZy53KExPR19UQUcsICJDb25uZWN0aW9uIGVycm9yOiAiLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3aW5kb3dzQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgbU5lZWRXaW5kb3dMaXN0VXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGZvY3VzQ2hhbmdlZCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCh0aGlzKSB7CisgICAgICAgICAgICAgICAgbU5lZWRGb2N1c2VkV2luZG93VXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBub3RpZnlBbGwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB3aW5kb3dNYW5hZ2VyQXV0b2xpc3RMb29wKCkgeworICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIuYWRkV2luZG93Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihtQ2xpZW50LmdldE91dHB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5lZWRXaW5kb3dMaXN0VXBkYXRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbmVlZEZvY3VzZWRXaW5kb3dVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIW1OZWVkV2luZG93TGlzdFVwZGF0ZSAmJiAhbU5lZWRGb2N1c2VkV2luZG93VXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1OZWVkV2luZG93TGlzdFVwZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZWVkV2luZG93TGlzdFVwZGF0ZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRXaW5kb3dMaXN0VXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTmVlZEZvY3VzZWRXaW5kb3dVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmVlZEZvY3VzZWRXaW5kb3dVcGRhdGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkRm9jdXNlZFdpbmRvd1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYobmVlZFdpbmRvd0xpc3RVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiTElTVCBVUERBVEVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYobmVlZEZvY3VzZWRXaW5kb3dVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSgiRk9DVVMgVVBEQVRFXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTbG9nLncoTE9HX1RBRywgIkNvbm5lY3Rpb24gZXJyb3I6ICIsIGUpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAob3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbVdpbmRvd01hbmFnZXIucmVtb3ZlV2luZG93Q2hhbmdlTGlzdGVuZXIodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEgYi9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCmluZGV4IDM4ZjFlMWYuLmM2ZTVjZDI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9qYXZhL2NvbS9hbmRyb2lkL3NlcnZlci9XaW5kb3dNYW5hZ2VyU2VydmljZS5qYXZhCisrKyBiL3NlcnZpY2VzL2phdmEvY29tL2FuZHJvaWQvc2VydmVyL1dpbmRvd01hbmFnZXJTZXJ2aWNlLmphdmEKQEAgLTQ4OSw2ICs0ODksMTQgQEAKICAgICBib29sZWFuIG1JblRvdWNoTW9kZSA9IGZhbHNlOwogCiAgICAgcHJpdmF0ZSBWaWV3U2VydmVyIG1WaWV3U2VydmVyOworICAgIHByaXZhdGUgQXJyYXlMaXN0PFdpbmRvd0NoYW5nZUxpc3RlbmVyPiBtV2luZG93Q2hhbmdlTGlzdGVuZXJzID0KKyAgICAgICAgbmV3IEFycmF5TGlzdDxXaW5kb3dDaGFuZ2VMaXN0ZW5lcj4oKTsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVdpbmRvd3NDaGFuZ2VkID0gZmFsc2U7CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFdpbmRvd0NoYW5nZUxpc3RlbmVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgd2luZG93c0NoYW5nZWQoKTsKKyAgICAgICAgcHVibGljIHZvaWQgZm9jdXNDaGFuZ2VkKCk7CisgICAgfQogCiAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBtVGVtcENvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOwogICAgIGludCBtU2NyZWVuTGF5b3V0ID0gQ29uZmlndXJhdGlvbi5TQ1JFRU5MQVlPVVRfU0laRV9VTkRFRklORUQ7CkBAIC02NjIsNiArNjcwLDcgQEAKICAgICAgICAgICAgIFRBRywgIkFkZGluZyB3aW5kb3cgIiArIHdpbmRvdyArICIgYXQgIgogICAgICAgICAgICAgKyAoaSsxKSArICIgb2YgIiArIG1XaW5kb3dzLnNpemUoKSArICIgKGFmdGVyICIgKyBwb3MgKyAiKSIpOwogICAgICAgICBtV2luZG93cy5hZGQoaSsxLCB3aW5kb3cpOworICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBwbGFjZVdpbmRvd0JlZm9yZShPYmplY3QgcG9zLCBXaW5kb3dTdGF0ZSB3aW5kb3cpIHsKQEAgLTY3MCw2ICs2NzksNyBAQAogICAgICAgICAgICAgVEFHLCAiQWRkaW5nIHdpbmRvdyAiICsgd2luZG93ICsgIiBhdCAiCiAgICAgICAgICAgICArIGkgKyAiIG9mICIgKyBtV2luZG93cy5zaXplKCkgKyAiIChiZWZvcmUgIiArIHBvcyArICIpIik7CiAgICAgICAgIG1XaW5kb3dzLmFkZChpLCB3aW5kb3cpOworICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgIH0KIAogICAgIC8vVGhpcyBtZXRob2QgZmluZHMgb3V0IHRoZSBpbmRleCBvZiBhIHdpbmRvdyB0aGF0IGhhcyB0aGUgc2FtZSBhcHAgdG9rZW4gYXMKQEAgLTcyNyw2ICs3MzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIkFkZGluZyB3aW5kb3cgIiArIHdpbiArICIgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKG5ld0lkeCsxKSArICIgb2YgIiArIE4pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbG1XaW5kb3dzLmFkZChuZXdJZHgrMSwgd2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgwOSw2ICs4MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFHLCAiQWRkaW5nIHdpbmRvdyAiICsgd2luICsgIiBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGkgKyAiIG9mICIgKyBOKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbG1XaW5kb3dzLmFkZChpLCB3aW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC04MjYsNiArODM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFRBRywgIkFkZGluZyB3aW5kb3cgIiArIHdpbiArICIgYXQgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyBpICsgIiBvZiAiICsgTik7CiAgICAgICAgICAgICAgICAgbG9jYWxtV2luZG93cy5hZGQoaSwgd2luKTsKKyAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGFkZFRvVG9rZW4pIHsKICAgICAgICAgICAgICAgICB0b2tlbi53aW5kb3dzLmFkZCh0b2tlbldpbmRvd3NQb3MsIHdpbik7CkBAIC0xMDM0LDYgKzEwNDcsNyBAQAogICAgICAgICAgICAgaWYgKERFQlVHX1dJTkRPV19NT1ZFTUVOVCkgU2xvZy52KAogICAgICAgICAgICAgICAgICAgICBUQUcsICJBZGRpbmcgaW5wdXQgbWV0aG9kIHdpbmRvdyAiICsgd2luICsgIiBhdCAiICsgcG9zKTsKICAgICAgICAgICAgIG1XaW5kb3dzLmFkZChwb3MsIHdpbik7CisgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgbW92ZUlucHV0TWV0aG9kRGlhbG9nc0xvY2tlZChwb3MrMSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTEwNzUsNiArMTA4OSw3IEBACiAgICAgICAgICAgICBpZiAod3BvcyA8IGludGVyZXN0aW5nUG9zKSBpbnRlcmVzdGluZ1Bvcy0tOwogICAgICAgICAgICAgaWYgKERFQlVHX1dJTkRPV19NT1ZFTUVOVCkgU2xvZy52KFRBRywgIlRlbXAgcmVtb3ZpbmcgYXQgIiArIHdwb3MgKyAiOiAiICsgd2luKTsKICAgICAgICAgICAgIG1XaW5kb3dzLnJlbW92ZSh3cG9zKTsKKyAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICBpbnQgTkMgPSB3aW4ubUNoaWxkV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICB3aGlsZSAoTkMgPiAwKSB7CiAgICAgICAgICAgICAgICAgTkMtLTsKQEAgLTExMDEsNiArMTExNiw3IEBACiAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLCAiUmVBZGQgcmVtb3ZpbmcgZnJvbSAiICsgd3BvcwogICAgICAgICAgICAgICAgICAgICArICI6ICIgKyB3aW4pOwogICAgICAgICAgICAgbVdpbmRvd3MucmVtb3ZlKHdwb3MpOworICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgIHJlQWRkV2luZG93TG9ja2VkKHdwb3MsIHdpbik7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTYxLDYgKzE1NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLCAiV2FsbHBhcGVyIHJlbW92aW5nIGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG9sZEluZGV4ICsgIjogIiArIHdhbGxwYXBlcik7CiAgICAgICAgICAgICAgICAgICAgIGxvY2FsbVdpbmRvd3MucmVtb3ZlKG9sZEluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEluZGV4IDwgZm91bmRJKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEktLTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTU3Miw2ICsxNTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmcm9tICIgKyBvbGRJbmRleCArICIgdG8gIiArIGZvdW5kSSk7CiAKICAgICAgICAgICAgICAgICBsb2NhbG1XaW5kb3dzLmFkZChmb3VuZEksIHdhbGxwYXBlcik7CisgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IEFESlVTVF9XQUxMUEFQRVJfTEFZRVJTX0NIQU5HRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIwNzgsNiArMjA5Niw3IEBACiAKICAgICAgICAgbVdpbmRvd01hcC5yZW1vdmUod2luLm1DbGllbnQuYXNCaW5kZXIoKSk7CiAgICAgICAgIG1XaW5kb3dzLnJlbW92ZSh3aW4pOworICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLCAiRmluYWwgcmVtb3ZlIG9mIHdpbmRvdzogIiArIHdpbik7CiAKICAgICAgICAgaWYgKG1JbnB1dE1ldGhvZFdpbmRvdyA9PSB3aW4pIHsKQEAgLTMzNjAsNiArMzM3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVtb3Zpbmcgc3RhcnRpbmcgd2luZG93OiAiICsgc3RhcnRpbmdXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgbVdpbmRvd3MucmVtb3ZlKHN0YXJ0aW5nV2luZG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1XaW5kb3dzQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICB0dG9rZW4ud2luZG93cy5yZW1vdmUoc3RhcnRpbmdXaW5kb3cpOwogICAgICAgICAgICAgICAgICAgICAgICAgdHRva2VuLmFsbEFwcFdpbmRvd3MucmVtb3ZlKHN0YXJ0aW5nV2luZG93KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFdpbmRvd1RvTGlzdEluT3JkZXJMb2NrZWQoc3RhcnRpbmdXaW5kb3csIHRydWUpOwpAQCAtMzg0MSw2ICszODYxLDcgQEAKICAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdpbiA9IHRva2VuLndpbmRvd3MuZ2V0KGkpOwogICAgICAgICAgICAgaWYgKERFQlVHX1dJTkRPV19NT1ZFTUVOVCkgU2xvZy52KFRBRywgIlRtcCByZW1vdmluZyBhcHAgd2luZG93ICIgKyB3aW4pOwogICAgICAgICAgICAgbVdpbmRvd3MucmVtb3ZlKHdpbik7CisgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgaW50IGogPSB3aW4ubUNoaWxkV2luZG93cy5zaXplKCk7CiAgICAgICAgICAgICB3aGlsZSAoaiA+IDApIHsKICAgICAgICAgICAgICAgICBqLS07CkBAIC0zOTQ1LDYgKzM5NjYsNyBAQAogICAgICAgICAgICAgbVdpbmRvd3MuYWRkKGluZGV4LCB3aW4pOwogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQorICAgICAgICBtV2luZG93c0NoYW5nZWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgfQogCkBAIC00NzgzLDYgKzQ4MDUsNDggQEAKICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgYWRkV2luZG93Q2hhbmdlTGlzdGVuZXIoV2luZG93Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgc3luY2hyb25pemVkKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgIG1XaW5kb3dDaGFuZ2VMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVdpbmRvd0NoYW5nZUxpc3RlbmVyKFdpbmRvd0NoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZChtV2luZG93TWFwKSB7CisgICAgICAgICAgICBtV2luZG93Q2hhbmdlTGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5V2luZG93c0NoYW5nZWQoKSB7CisgICAgICAgIFdpbmRvd0NoYW5nZUxpc3RlbmVyW10gd2luZG93Q2hhbmdlTGlzdGVuZXJzOworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYobVdpbmRvd0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgV2luZG93Q2hhbmdlTGlzdGVuZXJbbVdpbmRvd0NoYW5nZUxpc3RlbmVycy5zaXplKCldOworICAgICAgICAgICAgd2luZG93Q2hhbmdlTGlzdGVuZXJzID0gbVdpbmRvd0NoYW5nZUxpc3RlbmVycy50b0FycmF5KHdpbmRvd0NoYW5nZUxpc3RlbmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IE4gPSB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnNbaV0ud2luZG93c0NoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlGb2N1c0NoYW5nZWQoKSB7CisgICAgICAgIFdpbmRvd0NoYW5nZUxpc3RlbmVyW10gd2luZG93Q2hhbmdlTGlzdGVuZXJzOworICAgICAgICBzeW5jaHJvbml6ZWQobVdpbmRvd01hcCkgeworICAgICAgICAgICAgaWYobVdpbmRvd0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMgPSBuZXcgV2luZG93Q2hhbmdlTGlzdGVuZXJbbVdpbmRvd0NoYW5nZUxpc3RlbmVycy5zaXplKCldOworICAgICAgICAgICAgd2luZG93Q2hhbmdlTGlzdGVuZXJzID0gbVdpbmRvd0NoYW5nZUxpc3RlbmVycy50b0FycmF5KHdpbmRvd0NoYW5nZUxpc3RlbmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaW50IE4gPSB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOworICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICB3aW5kb3dDaGFuZ2VMaXN0ZW5lcnNbaV0uZm9jdXNDaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBwcml2YXRlIFdpbmRvd1N0YXRlIGZpbmRXaW5kb3coaW50IGhhc2hDb2RlKSB7CiAgICAgICAgIGlmIChoYXNoQ29kZSA9PSAtMSkgewogICAgICAgICAgICAgcmV0dXJuIGdldEZvY3VzZWRXaW5kb3coKTsKQEAgLTc2NzIsNiArNzczNiw3IEBACiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRV9TQ1JFRU4gPSAxNjsKICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVBQX0ZSRUVaRV9USU1FT1VUID0gMTc7CiAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFTkRfTkVXX0NPTkZJR1VSQVRJT04gPSAxODsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1JUX1dJTkRPV1NfQ0hBTkdFID0gMTk7CiAKICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uIG1MYXN0UmVwb3J0ZWRIb2xkOwogCkBAIC03NzIzLDYgKzc3ODgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgcHJvY2VzcyBoYXMgZGllZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlGb2N1c0NoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTgwMDMsNiArODA2OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIFJFUE9SVF9XSU5ET1dTX0NIQU5HRTogeworICAgICAgICAgICAgICAgICAgICBpZiAobVdpbmRvd3NDaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XaW5kb3dNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2luZG93c0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeVdpbmRvd3NDaGFuZ2VkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC04MDg3LDYgKzgxNjMsNyBAQAogICAgICAgICAgICAgV2luZG93U3RhdGUgdyA9IChXaW5kb3dTdGF0ZSltV2luZG93cy5nZXQoaSk7CiAgICAgICAgICAgICBpZiAody5tQXBwVG9rZW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFdpbmRvd1N0YXRlIHdpbiA9IChXaW5kb3dTdGF0ZSltV2luZG93cy5yZW1vdmUoaSk7CisgICAgICAgICAgICAgICAgbVdpbmRvd3NDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBpZiAoREVCVUdfV0lORE9XX01PVkVNRU5UKSBTbG9nLnYoVEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgIlJlYnVpbGQgcmVtb3Zpbmcgd2luZG93OiAiICsgd2luKTsKICAgICAgICAgICAgICAgICBOVy0tOwpAQCAtODIyMiw2ICs4Mjk5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25Mb2NrZWQoMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1XaW5kb3dzQ2hhbmdlZCAmJiAhbVdpbmRvd0NoYW5nZUxpc3RlbmVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtSC5yZW1vdmVNZXNzYWdlcyhILlJFUE9SVF9XSU5ET1dTX0NIQU5HRSk7CisgICAgICAgICAgICAgICAgbUguc2VuZE1lc3NhZ2UobUgub2J0YWluTWVzc2FnZShILlJFUE9SVF9XSU5ET1dTX0NIQU5HRSkpOworICAgICAgICAgICAgfQogICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIG1JbkxheW91dCA9IGZhbHNlOwogICAgICAgICAgICAgU2xvZy5lKFRBRywgIlVuaGFuZGxlZCBleGNlcHRpb24gd2hpbGUgbGF5b3V0IG91dCB3aW5kb3dzIiwgZSk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9qbmkvY29tX2FuZHJvaWRfc2VydmVyX0lucHV0TWFuYWdlci5jcHAKaW5kZXggZmM5MDFmNC4uMjZlMTA1YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvam5pL2NvbV9hbmRyb2lkX3NlcnZlcl9JbnB1dE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2puaS9jb21fYW5kcm9pZF9zZXJ2ZXJfSW5wdXRNYW5hZ2VyLmNwcApAQCAtNDA1LDI4ICs0MDUsMjggQEAKIH0KIAogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzQXBwU3dpdGNoS2V5KGludDMyX3Qga2V5Q29kZSkgewotICAgIHJldHVybiBrZXlDb2RlID09IEtFWUNPREVfSE9NRSB8fCBrZXlDb2RlID09IEtFWUNPREVfRU5EQ0FMTDsKKyAgICByZXR1cm4ga2V5Q29kZSA9PSBBS0VZQ09ERV9IT01FIHx8IGtleUNvZGUgPT0gQUtFWUNPREVfRU5EQ0FMTDsKIH0KIAogYm9vbCBOYXRpdmVJbnB1dE1hbmFnZXI6OmlzUG9saWN5S2V5KGludDMyX3Qga2V5Q29kZSwgYm9vbCBpc1NjcmVlbk9uKSB7CiAgICAgLy8gU3BlY2lhbCBrZXlzIHRoYXQgdGhlIFdpbmRvd01hbmFnZXJQb2xpY3kgbWlnaHQgY2FyZSBhYm91dC4KICAgICBzd2l0Y2ggKGtleUNvZGUpIHsKLSAgICBjYXNlIEtFWUNPREVfVk9MVU1FX1VQOgotICAgIGNhc2UgS0VZQ09ERV9WT0xVTUVfRE9XTjoKLSAgICBjYXNlIEtFWUNPREVfRU5EQ0FMTDoKLSAgICBjYXNlIEtFWUNPREVfUE9XRVI6Ci0gICAgY2FzZSBLRVlDT0RFX0NBTEw6Ci0gICAgY2FzZSBLRVlDT0RFX0hPTUU6Ci0gICAgY2FzZSBLRVlDT0RFX01FTlU6Ci0gICAgY2FzZSBLRVlDT0RFX1NFQVJDSDoKKyAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9VUDoKKyAgICBjYXNlIEFLRVlDT0RFX1ZPTFVNRV9ET1dOOgorICAgIGNhc2UgQUtFWUNPREVfRU5EQ0FMTDoKKyAgICBjYXNlIEFLRVlDT0RFX1BPV0VSOgorICAgIGNhc2UgQUtFWUNPREVfQ0FMTDoKKyAgICBjYXNlIEFLRVlDT0RFX0hPTUU6CisgICAgY2FzZSBBS0VZQ09ERV9NRU5VOgorICAgIGNhc2UgQUtFWUNPREVfU0VBUkNIOgogICAgICAgICAvLyBtZWRpYSBrZXlzCi0gICAgY2FzZSBLRVlDT0RFX0hFQURTRVRIT09LOgotICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QTEFZX1BBVVNFOgotICAgIGNhc2UgS0VZQ09ERV9NRURJQV9TVE9QOgotICAgIGNhc2UgS0VZQ09ERV9NRURJQV9ORVhUOgotICAgIGNhc2UgS0VZQ09ERV9NRURJQV9QUkVWSU9VUzoKLSAgICBjYXNlIEtFWUNPREVfTUVESUFfUkVXSU5EOgotICAgIGNhc2UgS0VZQ09ERV9NRURJQV9GQVNUX0ZPUldBUkQ6CisgICAgY2FzZSBBS0VZQ09ERV9IRUFEU0VUSE9PSzoKKyAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BMQVlfUEFVU0U6CisgICAgY2FzZSBBS0VZQ09ERV9NRURJQV9TVE9QOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfTkVYVDoKKyAgICBjYXNlIEFLRVlDT0RFX01FRElBX1BSRVZJT1VTOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfUkVXSU5EOgorICAgIGNhc2UgQUtFWUNPREVfTUVESUFfRkFTVF9GT1JXQVJEOgogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgogICAgICAgICAvLyBXZSBuZWVkIHRvIHBhc3MgYWxsIGtleXMgdG8gdGhlIHBvbGljeSBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhIGIvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9Qcm92aWRlclRlc3RDYXNlMi5qYXZhCmluZGV4IDI4ZWNlZTUuLjFmYjU1MzggMTAwNjQ0Ci0tLSBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvUHJvdmlkZXJUZXN0Q2FzZTIuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1Byb3ZpZGVyVGVzdENhc2UyLmphdmEKQEAgLTI3LDE1ICsyNyw0NCBAQAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIAogLyoqCi0gKiBUaGlzIFRlc3RDYXNlIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBpc29sYXRlZCB0ZXN0aW5nIG9mIGEgc2luZ2xlCi0gKiBDb250ZW50UHJvdmlkZXIuICBJdCB1c2VzIGEge0BsaW5rIGFuZHJvaWQudGVzdC5tb2NrLk1vY2tDb250ZW50UmVzb2x2ZXJ9IHRvCi0gKiBhY2Nlc3MgdGhlIHByb3ZpZGVyLCByZXN0cmljdHMgdGhlIHByb3ZpZGVyIHRvIGFuIGlzb2xhdGVkIGFyZWEgb2YgdGhlCi0gKiBmaWxlc3lzdGVtIChmb3Igc2FmZWx5IGNyZWF0aW5nICYgbW9kaWZ5aW5nIGRhdGFiYXNlcyAmIGZpbGVzKSwgYW5kIGluamVjdHMKLSAqIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSB0byBpc29sYXRlIHRoZSBDb250ZW50UHJvdmlkZXIgZnJvbSB0aGUKLSAqIHJlc3Qgb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLgotICoKLSAqIDxwPlRoaXMgZW52aXJvbm1lbnQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHtAbGluayAjc2V0VXB9IGFuZCB7QGxpbmsKLSAqICN0ZWFyRG93bn0uCisgKiBUaGlzIHRlc3QgY2FzZSBjbGFzcyBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgdGVzdGluZyBhIHNpbmdsZQorICoge0BsaW5rIENvbnRlbnRQcm92aWRlcn0gYW5kIGZvciB0ZXN0aW5nIHlvdXIgYXBwIGNvZGUgd2l0aCBhbgorICogaXNvbGF0ZWQgY29udGVudCBwcm92aWRlci4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3lzdGVtIG1hcCBvZgorICogcHJvdmlkZXJzIHRoYXQgaXMgYmFzZWQgb24gdGhlIG1hbmlmZXN0cyBvZiBvdGhlciBhcHBsaWNhdGlvbnMsIHRoZSB0ZXN0CisgKiBjYXNlIGNyZWF0ZXMgaXRzIG93biBpbnRlcm5hbCBtYXAuIEl0IHRoZW4gdXNlcyB0aGlzIG1hcCB0byByZXNvbHZlIHByb3ZpZGVycworICogZ2l2ZW4gYW4gYXV0aG9yaXR5LiBUaGlzIGFsbG93cyB5b3UgdG8gaW5qZWN0IHRlc3QgcHJvdmlkZXJzIGFuZCB0byBudWxsIG91dAorICogcHJvdmlkZXJzIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHVzZS4KKyAqIDxwPgorICogICAgICBUaGlzIHRlc3QgY2FzZSBhbHNvIHNldHMgdXAgdGhlIGZvbGxvd2luZyBtb2NrIG9iamVjdHM6CisgKiA8L3A+CisgKiA8dWw+CisgKiAgICAgIDxsaT4KKyAqICAgICAgICAgIEFuIHtAbGluayBhbmRyb2lkLnRlc3QuSXNvbGF0ZWRDb250ZXh0fSB0aGF0IHN0dWJzIG91dCBDb250ZXh0IG1ldGhvZHMgdGhhdCBtaWdodAorICogICAgICAgICAgYWZmZWN0IHRoZSByZXN0IG9mIHRoZSBydW5uaW5nIHN5c3RlbSwgd2hpbGUgYWxsb3dpbmcgdGVzdHMgdG8gZG8gcmVhbCBmaWxlIGFuZAorICogICAgICAgICAgZGF0YWJhc2Ugd29yay4KKyAqICAgICAgPC9saT4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgQSB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRlbnRSZXNvbHZlcn0gdGhhdCBwcm92aWRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhCisgKiAgICAgICAgICByZWd1bGFyIGNvbnRlbnQgcmVzb2x2ZXIsIGJ1dCB1c2VzIHtAbGluayBJc29sYXRlZENvbnRleHR9LiBJdCBzdHVicyBvdXQKKyAqICAgICAgICAgIHtAbGluayBDb250ZW50UmVzb2x2ZXIjbm90aWZ5Q2hhbmdlKFVyaSwgQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0gdG8KKyAqICAgICAgICAgIHByZXZlbnQgdGhlIHRlc3QgZnJvbSBhZmZlY3RpbmcgdGhlIHJ1bm5pbmcgc3lzdGVtLgorICogICAgICA8L2xpPgorICogICAgICA8bGk+CisgKiAgICAgICAgICBBbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZXIgdW5kZXIgdGVzdCwgcnVubmluZyBpbiBhbiB7QGxpbmsgSXNvbGF0ZWRDb250ZXh0fS4KKyAqICAgICAgPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqICAgICAgVGhpcyBmcmFtZXdvcmsgaXMgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGJhc2UgY2xhc3MnIHtAbGluayAjc2V0VXAoKX0gbWV0aG9kLiBJZiB5b3UKKyAqICAgICAgb3ZlcnJpZGUgdGhpcyBtZXRob2QsIHlvdSBtdXN0IGNhbGwgdGhlIHN1cGVyIG1ldGhvZCBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluCisgKiAgICAgIHlvdXIgb3ZlcnJpZGUuCisgKiA8L3A+CisgKiA8cD4KKyAqICAgICBJbiBvcmRlciBmb3IgdGhlaXIgdGVzdHMgdG8gYmUgcnVuLCBjb25jcmV0ZSBzdWJjbGFzc2VzIG11c3QgcHJvdmlkZSB0aGVpciBvd24KKyAqICAgICBjb25zdHJ1Y3RvciB3aXRoIG5vIGFyZ3VtZW50cy4gVGhpcyBjb25zdHJ1Y3RvciBtdXN0IGNhbGwKKyAqICAgICB7QGxpbmsgI1Byb3ZpZGVyVGVzdENhc2UyKENsYXNzLCBTdHJpbmcpfSBhcyAgaXRzIGZpcnN0IG9wZXJhdGlvbi4KKyAqIDwvcD4KKyAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGNvbnRlbnQgcHJvdmlkZXIgdGVzdGluZywgcGxlYXNlIHNlZQorICogPGEgaHJlZj0ie0Bkb2NSb290fWd1aWRlL3RvcGljcy90ZXN0aW5nL3Byb3ZpZGVyX3Rlc3RpbmcuaHRtbCI+Q29udGVudCBQcm92aWRlciBUZXN0aW5nPC9hPi4KICAqLwogcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3ZpZGVyVGVzdENhc2UyPFQgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXI+IGV4dGVuZHMgQW5kcm9pZFRlc3RDYXNlIHsKIApAQCAtNTQsMzQgKzgzLDUzIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyBGaWxlIGdldERpcihTdHJpbmcgbmFtZSwgaW50IG1vZGUpIHsKLSAgICAgICAgICAgIC8vIG5hbWUgdGhlIGRpcmVjdG9yeSBzbyB0aGUgZGlyZWN0b3J5IHdpbGwgYmUgc2VwZXJhdGVkIGZyb20KKyAgICAgICAgICAgIC8vIG5hbWUgdGhlIGRpcmVjdG9yeSBzbyB0aGUgZGlyZWN0b3J5IHdpbGwgYmUgc2VwYXJhdGVkIGZyb20KICAgICAgICAgICAgIC8vIG9uZSBjcmVhdGVkIHRocm91Z2ggdGhlIHJlZ3VsYXIgQ29udGV4dAogICAgICAgICAgICAgcmV0dXJuIGdldENvbnRleHQoKS5nZXREaXIoIm1vY2tjb250ZXh0Ml8iICsgbmFtZSwgbW9kZSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0CisgICAgICogQHBhcmFtIHByb3ZpZGVyQXV0aG9yaXR5IFRoZSBwcm92aWRlcidzIGF1dGhvcml0eSBzdHJpbmcKKyAgICAgKi8KICAgICBwdWJsaWMgUHJvdmlkZXJUZXN0Q2FzZTIoQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcywgU3RyaW5nIHByb3ZpZGVyQXV0aG9yaXR5KSB7CiAgICAgICAgIG1Qcm92aWRlckNsYXNzID0gcHJvdmlkZXJDbGFzczsKICAgICAgICAgbVByb3ZpZGVyQXV0aG9yaXR5ID0gcHJvdmlkZXJBdXRob3JpdHk7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogVGhlIGNvbnRlbnQgcHJvdmlkZXIgdGhhdCB3aWxsIGJlIHNldCB1cCBmb3IgdXNlIGluIGVhY2ggdGVzdCBtZXRob2QuCi0gICAgICovCiAgICAgcHJpdmF0ZSBUIG1Qcm92aWRlcjsKIAorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgY3JlYXRlZCBieSB0aGlzIGNsYXNzIGluIHRoZSB7QGxpbmsgI3NldFVwKCl9IG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIFQgQW4gaW5zdGFuY2Ugb2YgdGhlIHByb3ZpZGVyIGNsYXNzIGdpdmVuIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSB0ZXN0IGNhc2UgY2xhc3MuCisgICAgICovCiAgICAgcHVibGljIFQgZ2V0UHJvdmlkZXIoKSB7CiAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7CiAgICAgfQogCisgICAgLyoqCisgICAgICogU2V0cyB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0IGZpeHR1cmUuCisgICAgICogPHA+CisgICAgICogQ3JlYXRlcyBhIG5ldworICAgICAqIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGVudFJlc29sdmVyfSwgYSBuZXcgSXNvbGF0ZWRDb250ZXh0CisgICAgICogdGhhdCBpc29sYXRlcyB0aGUgcHJvdmlkZXIncyBmaWxlIG9wZXJhdGlvbnMsIGFuZCBhIG5ldyBpbnN0YW5jZSBvZgorICAgICAqIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0IHdpdGhpbiB0aGUgaXNvbGF0ZWQgZW52aXJvbm1lbnQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBzdXBlci5zZXRVcCgpOwogCiAgICAgICAgIG1SZXNvbHZlciA9IG5ldyBNb2NrQ29udGVudFJlc29sdmVyKCk7CiAgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlbmFtZVByZWZpeCA9ICJ0ZXN0LiI7Ci0gICAgICAgIFJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQgdGFyZ2V0Q29udGV4dFdyYXBwZXIgPSBuZXcgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dCgKLSAgICAgICAgICAgICAgICBuZXcgTW9ja0NvbnRleHQyKCksIC8vIFRoZSBjb250ZXh0IHRoYXQgbW9zdCBtZXRob2RzIGFyZSBkZWxlZ2F0ZWQgdG8KKyAgICAgICAgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dCB0YXJnZXRDb250ZXh0V3JhcHBlciA9IG5ldworICAgICAgICAgICAgICAgIFJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQoCisgICAgICAgICAgICAgICAgbmV3IE1vY2tDb250ZXh0MigpLCAvLyBUaGUgY29udGV4dCB0aGF0IG1vc3QgbWV0aG9kcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZGVsZWdhdGVkIHRvCiAgICAgICAgICAgICAgICAgZ2V0Q29udGV4dCgpLCAvLyBUaGUgY29udGV4dCB0aGF0IGZpbGUgbWV0aG9kcyBhcmUgZGVsZWdhdGVkIHRvCiAgICAgICAgICAgICAgICAgZmlsZW5hbWVQcmVmaXgpOwogICAgICAgICBtUHJvdmlkZXJDb250ZXh0ID0gbmV3IElzb2xhdGVkQ29udGV4dChtUmVzb2x2ZXIsIHRhcmdldENvbnRleHRXcmFwcGVyKTsKQEAgLTkyLDE0ICsxNDAsNTUgQEAKICAgICAgICAgbVJlc29sdmVyLmFkZFByb3ZpZGVyKG1Qcm92aWRlckF1dGhvcml0eSwgZ2V0UHJvdmlkZXIoKSk7CiAgICAgfQogCisgICAgLyoqCisgICAgICogR2V0cyB0aGUge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uIFlvdQorICAgICAqIG11c3QgdXNlIHRoZSBtZXRob2RzIG9mIHRoaXMgcmVzb2x2ZXIgdG8gYWNjZXNzIHRoZSBwcm92aWRlciB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBBIHtAbGluayBNb2NrQ29udGVudFJlc29sdmVyfSBpbnN0YW5jZS4KKyAgICAgKi8KICAgICBwdWJsaWMgTW9ja0NvbnRlbnRSZXNvbHZlciBnZXRNb2NrQ29udGVudFJlc29sdmVyKCkgewogICAgICAgICByZXR1cm4gbVJlc29sdmVyOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEdldHMgdGhlIHtAbGluayBJc29sYXRlZENvbnRleHR9IGNyZWF0ZWQgYnkgdGhpcyBjbGFzcyBkdXJpbmcgaW5pdGlhbGl6YXRpb24uCisgICAgICogQHJldHVybiBUaGUge0BsaW5rIElzb2xhdGVkQ29udGV4dH0gaW5zdGFuY2UKKyAgICAgKi8KICAgICBwdWJsaWMgSXNvbGF0ZWRDb250ZXh0IGdldE1vY2tDb250ZXh0KCkgewogICAgICAgICByZXR1cm4gbVByb3ZpZGVyQ29udGV4dDsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIENyZWF0ZXMgYSBuZXcgY29udGVudCBwcm92aWRlciBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoYXQgcGFzc2VkIHRvIHRoZSB0ZXN0IGNhc2UgY2xhc3MsCisgICAgICogICAgICB3aXRoIGFuIGF1dGhvcml0eSBuYW1lIHNldCB0byB0aGUgYXV0aG9yaXR5IHBhcmFtZXRlciwgYW5kIHVzaW5nIGFuIFNRTGl0ZSBkYXRhYmFzZSBhcworICAgICAqICAgICAgdGhlIHVuZGVybHlpbmcgZGF0YSBzb3VyY2UuIFRoZSBTUUwgc3RhdGVtZW50IHBhcmFtZXRlciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgZGF0YWJhc2UuCisgICAgICogICAgICBUaGlzIG1ldGhvZCBhbHNvIGNyZWF0ZXMgYSBuZXcge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGFuZCBhZGRzIHRoZSBwcm92aWRlciB0byBpdC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogICAgICBCb3RoIHRoZSBuZXcgcHJvdmlkZXIgYW5kIHRoZSBuZXcgcmVzb2x2ZXIgYXJlIHB1dCBpbnRvIGFuIHtAbGluayBJc29sYXRlZENvbnRleHR9CisgICAgICogICAgICB0aGF0IHVzZXMgdGhlIHRhcmdldENvbnRleHQgcGFyYW1ldGVyIGZvciBmaWxlIG9wZXJhdGlvbnMgYW5kIGEge0BsaW5rIE1vY2tDb250ZXh0fQorICAgICAqICAgICAgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gVGhlIElzb2xhdGVkQ29udGV4dCBwcmVwZW5kcyB0aGUgZmlsZW5hbWVQcmVmaXggcGFyYW1ldGVyIHRvCisgICAgICogICAgICBmaWxlLCBkYXRhYmFzZSwgYW5kIGRpcmVjdG9yeSBuYW1lcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhICJtb2NrIiBwcm92aWRlciB0aGF0IGNhbiBjb250YWluIHRlc3QgZGF0YS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0Q29udGV4dCBUaGUgY29udGV4dCB0byB1c2UgYXMgdGhlIGJhc2lzIG9mIHRoZSBJc29sYXRlZENvbnRleHQKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWVQcmVmaXggQSBzdHJpbmcgdGhhdCBpcyBwcmVwZW5kZWQgdG8gZmlsZSwgZGF0YWJhc2UsIGFuZCBkaXJlY3RvcnkgbmFtZXMKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJDbGFzcyBUaGUgdHlwZSBvZiB0aGUgcHJvdmlkZXIgYmVpbmcgdGVzdGVkCisgICAgICogQHBhcmFtIGF1dGhvcml0eSBUaGUgYXV0aG9yaXR5IHN0cmluZyB0byBhc3NvY2lhdGVkIHdpdGggdGhlIHRlc3QgcHJvdmlkZXIKKyAgICAgKiBAcGFyYW0gZGF0YWJhc2VOYW1lIFRoZSBuYW1lIGFzc2lnbmVkIHRvIHRoZSBkYXRhYmFzZQorICAgICAqIEBwYXJhbSBkYXRhYmFzZVZlcnNpb24gVGhlIHZlcnNpb24gYXNzaWduZWQgdG8gdGhlIGRhdGFiYXNlCisgICAgICogQHBhcmFtIHNxbCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBTUUwgc3RhdGVtZW50cyB0aGF0IGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBkZXNpcmVkCisgICAgICogZGF0YWJhc2UgYW5kIGl0cyB0YWJsZXMuIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhhdCBnZW5lcmF0ZWQgYnkgdGhlCisgICAgICogPGEgaHJlZj0iaHR0cDovL3d3dy5zcWxpdGUub3JnL3NxbGl0ZS5odG1sIj5zcWxpdGUzPC9hPiB0b29sJ3MgPGNvZGU+LmR1bXA8L2NvZGU+IGNvbW1hbmQuCisgICAgICogQHJldHVybiBDb250ZW50UmVzb2x2ZXIgQSBuZXcge0BsaW5rIE1vY2tDb250ZW50UmVzb2x2ZXJ9IGxpbmtlZCB0byB0aGUgcHJvdmlkZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbgorICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBDb250ZW50UHJvdmlkZXI+IENvbnRlbnRSZXNvbHZlciBuZXdSZXNvbHZlcldpdGhDb250ZW50UHJvdmlkZXJGcm9tU3FsKAogICAgICAgICAgICAgQ29udGV4dCB0YXJnZXRDb250ZXh0LCBTdHJpbmcgZmlsZW5hbWVQcmVmaXgsIENsYXNzPFQ+IHByb3ZpZGVyQ2xhc3MsIFN0cmluZyBhdXRob3JpdHksCiAgICAgICAgICAgICBTdHJpbmcgZGF0YWJhc2VOYW1lLCBpbnQgZGF0YWJhc2VWZXJzaW9uLCBTdHJpbmcgc3FsKQpkaWZmIC0tZ2l0IGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TZXJ2aWNlVGVzdENhc2UuamF2YSBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvU2VydmljZVRlc3RDYXNlLmphdmEKaW5kZXggZDkyNjJmNi4uZjllOGFkYiAxMDA2NDQKLS0tIGEvdGVzdC1ydW5uZXIvc3JjL2FuZHJvaWQvdGVzdC9TZXJ2aWNlVGVzdENhc2UuamF2YQorKysgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L1NlcnZpY2VUZXN0Q2FzZS5qYXZhCkBAIC0zMSw0MiArMzEsNjQgQEAKIC8qKgogICogVGhpcyB0ZXN0IGNhc2UgcHJvdmlkZXMgYSBmcmFtZXdvcmsgaW4gd2hpY2ggeW91IGNhbiB0ZXN0IFNlcnZpY2UgY2xhc3NlcyBpbgogICogYSBjb250cm9sbGVkIGVudmlyb25tZW50LiAgSXQgcHJvdmlkZXMgYmFzaWMgc3VwcG9ydCBmb3IgdGhlIGxpZmVjeWNsZSBvZiBhCi0gKiBTZXJ2aWNlLCBhbmQgaG9va3MgYnkgd2hpY2ggeW91IGNhbiBpbmplY3QgdmFyaW91cyBkZXBlbmRlbmNpZXMgYW5kIGNvbnRyb2wKKyAqIFNlcnZpY2UsIGFuZCBob29rcyB3aXRoIHdoaWNoIHlvdSBjYW4gaW5qZWN0IHZhcmlvdXMgZGVwZW5kZW5jaWVzIGFuZCBjb250cm9sCiAgKiB0aGUgZW52aXJvbm1lbnQgaW4gd2hpY2ggeW91ciBTZXJ2aWNlIGlzIHRlc3RlZC4KICAqCiAgKiA8cD48Yj5MaWZlY3ljbGUgU3VwcG9ydC48L2I+Ci0gKiBFdmVyeSBTZXJ2aWNlIGlzIGRlc2lnbmVkIHRvIGJlIGFjY2Vzc2VkIHdpdGhpbiBhIHNwZWNpZmljIHNlcXVlbmNlIG9mCi0gKiBjYWxscy4gIDxpbnNlcnQgbGluayB0byBTZXJ2aWNlIGxpZmVjeWNsZSBkb2MgaGVyZT4uIAotICogSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG9mIGEgU2VydmljZSwgdGhpcyB0ZXN0IGNhc2Ugd2lsbCBtYWtlIHRoZQotICogZm9sbG93aW5nIGNhbGxzIGF0IHRoZSBmb2xsb3dpbmcgdGltZXMuCisgKiBBIFNlcnZpY2UgaXMgYWNjZXNzZWQgd2l0aCBhIHNwZWNpZmljIHNlcXVlbmNlIG9mCisgKiBjYWxscywgYXMgZG9jdW1lbnRlZCBpbiB0aGUgc2VjdGlvbgorICogPGEgaHJlZj0iaHR0cDovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9ndWlkZS90b3BpY3MvZnVuZGFtZW50YWxzLmh0bWwjc2VydmxpZmUiPgorICogU2VydmljZSBsaWZlY3ljbGU8L2E+IGluIHRoZSBEZXZlbG9wZXIgR3VpZGUuIEluIG9yZGVyIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBvZiBhIFNlcnZpY2UsCisgKiA8Y29kZT5TZXJ2aWNlVGVzdENhc2U8L2NvZGU+IGVuZm9yY2VzIHRoaXMgcHJvdG9jb2w6CiAgKgotICogPHVsPjxsaT5UaGUgdGVzdCBjYXNlIHdpbGwgbm90IGNhbGwgb25DcmVhdGUoKSB1bnRpbCB5b3VyIHRlc3QgY2FsbHMgCi0gKiB7QGxpbmsgI3N0YXJ0U2VydmljZX0gb3Ige0BsaW5rICNiaW5kU2VydmljZX0uICBUaGlzIGdpdmVzIHlvdSBhIGNoYW5jZQotICogdG8gc2V0IHVwIG9yIGFkanVzdCBhbnkgYWRkaXRpb25hbCBmcmFtZXdvcmsgb3IgdGVzdCBsb2dpYyBiZWZvcmUKLSAqIG9uQ3JlYXRlKCkuPC9saT4KLSAqIDxsaT5XaGVuIHlvdXIgdGVzdCBjYWxscyB7QGxpbmsgI3N0YXJ0U2VydmljZX0gb3Ige0BsaW5rICNiaW5kU2VydmljZX0KLSAqIHRoZSB0ZXN0IGNhc2Ugd2lsbCBjYWxsIG9uQ3JlYXRlKCksIGFuZCB0aGVuIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgcG9pbnQgaW4geW91ciBzZXJ2aWNlLgotICogSXQgd2lsbCByZWNvcmQgYW55IHBhcmFtZXRlcnMgb3Igb3RoZXIgc3VwcG9ydCB2YWx1ZXMgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZS48L2xpPgotICogPGxpPkFmdGVyIHlvdXIgdGVzdCBjb21wbGV0ZXMsIHRoZSB0ZXN0IGNhc2Uge0BsaW5rICN0ZWFyRG93bn0gZnVuY3Rpb24gaXMKLSAqIGF1dG9tYXRpY2FsbHkgY2FsbGVkLCBhbmQgaXQgd2lsbCBzdG9wIGFuZCBkZXN0cm95IHlvdXIgc2VydmljZSB3aXRoIHRoZSBhcHByb3ByaWF0ZQotICogY2FsbHMgKGRlcGVuZGluZyBvbiBob3cgeW91ciB0ZXN0IGludm9rZWQgdGhlIHNlcnZpY2UuKTwvbGk+CisgKiA8dWw+CisgKiAgICAgIDxsaT4KKyAqICAgICAgICAgIFRoZSB7QGxpbmsgI3NldFVwKCl9IG1ldGhvZCBpcyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBtZXRob2QuIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uCisgKiAgICAgICAgICBnZXRzIHRoZSBzeXN0ZW0gY29udGV4dC4gSWYgeW91IG92ZXJyaWRlIDxjb2RlPnNldFVwKCk8L2NvZGU+LCB5b3UgbXVzdCBjYWxsCisgKiAgICAgICAgICA8Y29kZT5zdXBlci5zZXRVcCgpPC9jb2RlPiBhcyB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHlvdXIgb3ZlcnJpZGUuCisgKiAgICAgIDwvbGk+CisgKiAgICAgIDxsaT4KKyAqICAgICAgICAgIFRoZSB0ZXN0IGNhc2Ugd2FpdHMgdG8gY2FsbCB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpfSB1bnRpbCBvbmUgb2YgeW91cgorICogICAgICAgICAgdGVzdCBtZXRob2RzIGNhbGxzIHtAbGluayAjc3RhcnRTZXJ2aWNlfSBvciB7QGxpbmsgI2JpbmRTZXJ2aWNlfS4gIFRoaXMgZ2l2ZXMgeW91IGFuCisgKiAgICAgICAgICBvcHBvcnR1bml0eSB0byBzZXQgdXAgb3IgYWRqdXN0IGFueSBhZGRpdGlvbmFsIGZyYW1ld29yayBvciB0ZXN0IGxvZ2ljIGJlZm9yZSB5b3UgdGVzdAorICogICAgICAgICAgdGhlIHJ1bm5pbmcgc2VydmljZS4KKyAqICAgICAgPC9saT4KKyAqICAgICAgPGxpPgorICogICAgICAgICAgV2hlbiBvbmUgb2YgeW91ciB0ZXN0IG1ldGhvZHMgY2FsbHMge0BsaW5rICNzdGFydFNlcnZpY2UgU2VydmljZVRlc3RDYXNlLnN0YXJ0U2VydmljZSgpfQorICogICAgICAgICAgb3Ige0BsaW5rICNiaW5kU2VydmljZSAgU2VydmljZVRlc3RDYXNlLmJpbmRTZXJ2aWNlKCl9LCB0aGUgdGVzdCBjYXNlIGNhbGxzCisgKiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNvbkNyZWF0ZSgpIFNlcnZpY2Uub25DcmVhdGUoKX0gYW5kIHRoZW4gY2FsbHMgZWl0aGVyCisgKiAgICAgICAgICB7QGxpbmsgYW5kcm9pZC5hcHAuU2VydmljZSNzdGFydFNlcnZpY2UoSW50ZW50KSBTZXJ2aWNlLnN0YXJ0U2VydmljZShJbnRlbnQpfSBvcgorICogICAgICAgICAge0BsaW5rIGFuZHJvaWQuYXBwLlNlcnZpY2UjYmluZFNlcnZpY2UoSW50ZW50LCBTZXJ2aWNlQ29ubmVjdGlvbiwgaW50KQorICogICAgICAgICAgU2VydmljZS5iaW5kU2VydmljZShJbnRlbnQsIFNlcnZpY2VDb25uZWN0aW9uLCBpbnQpfSwgYXMgYXBwcm9wcmlhdGUuIEl0IGFsc28gc3RvcmVzCisgKiAgICAgICAgICB2YWx1ZXMgbmVlZGVkIHRvIHRyYWNrIGFuZCBzdXBwb3J0IHRoZSBsaWZlY3ljbGUuCisgKiAgICAgIDwvbGk+CisgKiAgICAgIDxsaT4KKyAqICAgICAgICAgIEFmdGVyIGVhY2ggdGVzdCBtZXRob2QgZmluaXNoZXMsIHRoZSB0ZXN0IGNhc2UgY2FsbHMgdGhlIHtAbGluayAjdGVhckRvd259IG1ldGhvZC4gVGhpcworICogICAgICAgICAgbWV0aG9kIHN0b3BzIGFuZCBkZXN0cm95cyB0aGUgc2VydmljZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBjYWxscywgZGVwZW5kaW5nIG9uIGhvdyB0aGUKKyAqICAgICAgICAgIHNlcnZpY2Ugd2FzIHN0YXJ0ZWQuIElmIHlvdSBvdmVycmlkZSA8Y29kZT50ZWFyRG93bigpPC9jb2RlPiwgeW91ciBtdXN0IGNhbGwgdGhlCisgKiAgICAgICAgICA8Y29kZT5zdXBlci50ZWFyRG93bigpPC9jb2RlPiBhcyB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4geW91ciBvdmVycmlkZS4KKyAqICAgICAgPC9saT4KICAqIDwvdWw+Ci0gKiAKLSAqIDxwPjxiPkRlcGVuZGVuY3kgSW5qZWN0aW9uLjwvYj4KLSAqIEV2ZXJ5IHNlcnZpY2UgaGFzIHR3byBpbmhlcmVudCBkZXBlbmRlbmNpZXMsIHRoZSB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQgQ29udGV4dH0gaW4KLSAqIHdoaWNoIGl0IHJ1bnMsIGFuZCB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFwcGxpY2F0aW9uIEFwcGxpY2F0aW9ufSB3aXRoIHdoaWNoIGl0IGlzIGFzc29jaWF0ZWQuCi0gKiBUaGlzIGZyYW1ld29yayBhbGxvd3MgeW91IHRvIGluamVjdCBtb2RpZmllZCwgbW9jaywgb3IgaXNvbGF0ZWQgcmVwbGFjZW1lbnRzIGZvciB0aGVzZSAKLSAqIGRlcGVuZGVuY2llcywgYW5kIHRodXMgcGVyZm9ybSBhIHRydWUgdW5pdCB0ZXN0LgotICogCi0gKiA8cD5JZiBzaW1wbHkgcnVuIHlvdXIgdGVzdHMgYXMtaXMsIHlvdXIgU2VydmljZSB3aWxsIGJlIGluamVjdGVkIHdpdGggYSBmdWxseS1mdW5jdGlvbmFsCi0gKiBDb250ZXh0LCBhbmQgYSBnZW5lcmljIHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb24gTW9ja0FwcGxpY2F0aW9ufSBvYmplY3QuCi0gKiBZb3UgY2FuIGNyZWF0ZSBhbmQgaW5qZWN0IGFsdGVybmF0aXZlcyB0byBlaXRoZXIgb2YgdGhlc2UgYnkgY2FsbGluZyAKLSAqIHtAbGluayBBbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG9yIAotICoge0BsaW5rICNzZXRBcHBsaWNhdGlvbiBzZXRBcHBsaWNhdGlvbigpfS4gIFlvdSBtdXN0IGRvIHRoaXMgPGk+YmVmb3JlPC9pPiBjYWxsaW5nCi0gKiBzdGFydFNlcnZpY2UoKSBvciBiaW5kU2VydmljZSgpLiAgVGhlIHRlc3QgZnJhbWV3b3JrIHByb3ZpZGVzIGEKLSAqIG51bWJlciBvZiBhbHRlcm5hdGl2ZXMgZm9yIENvbnRleHQsIGluY2x1ZGluZyB7bGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQ29udGV4dCBNb2NrQ29udGV4dH0sIAotICoge0BsaW5rIGFuZHJvaWQudGVzdC5SZW5hbWluZ0RlbGVnYXRpbmdDb250ZXh0IFJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHR9LCBhbmQgCi0gKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyIENvbnRleHRXcmFwcGVyfS4KKyAqCisgKiA8cD4KKyAqICAgICAgPHN0cm9uZz5EZXBlbmRlbmN5IEluamVjdGlvbi48L3N0cm9uZz4KKyAqICAgICAgQSBzZXJ2aWNlIGhhcyB0d28gaW5oZXJlbnQgZGVwZW5kZW5jaWVzLCBpdHMge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0IENvbnRleHR9IGFuZCBpdHMKKyAqICAgICAgYXNzb2NpYXRlZCB7QGxpbmsgYW5kcm9pZC5hcHAuQXBwbGljYXRpb24gQXBwbGljYXRpb259LiBUaGUgU2VydmljZVRlc3RDYXNlIGZyYW1ld29yaworICogICAgICBhbGxvd3MgeW91IHRvIGluamVjdCBtb2RpZmllZCwgbW9jaywgb3IgaXNvbGF0ZWQgcmVwbGFjZW1lbnRzIGZvciB0aGVzZSBkZXBlbmRlbmNpZXMsIGFuZAorICogICAgICB0aHVzIHBlcmZvcm0gdW5pdCB0ZXN0cyB3aXRoIGNvbnRyb2xsZWQgZGVwZW5kZW5jaWVzIGluIGFuIGlzb2xhdGVkIGVudmlyb25tZW50LgorICogPC9wPgorICogPHA+CisgKiAgICAgIEJ5IGRlZmF1bHQsIHRoZSB0ZXN0IGNhc2UgaXMgaW5qZWN0ZWQgd2l0aCBhIGZ1bGwgc3lzdGVtIGNvbnRleHQgYW5kIGEgZ2VuZXJpYworICogICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0FwcGxpY2F0aW9uIE1vY2tBcHBsaWNhdGlvbn0gb2JqZWN0LiBZb3UgY2FuIGluamVjdAorICogICAgICBhbHRlcm5hdGl2ZXMgdG8gZWl0aGVyIG9mIHRoZXNlIGJ5IGludm9raW5nCisgKiAgICAgIHtAbGluayBBbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG9yCisgKiAgICAgIHtAbGluayAjc2V0QXBwbGljYXRpb24gc2V0QXBwbGljYXRpb24oKX0uICBZb3UgbXVzdCBkbyB0aGlzIDxlbT5iZWZvcmU8L2VtPiBjYWxsaW5nCisgKiAgICAgIHN0YXJ0U2VydmljZSgpIG9yIGJpbmRTZXJ2aWNlKCkuICBUaGUgdGVzdCBmcmFtZXdvcmsgcHJvdmlkZXMgYQorICogICAgICBudW1iZXIgb2YgYWx0ZXJuYXRpdmVzIGZvciBDb250ZXh0LCBpbmNsdWRpbmcKKyAqICAgICAge2xpbmsgYW5kcm9pZC50ZXN0Lm1vY2suTW9ja0NvbnRleHQgTW9ja0NvbnRleHR9LAorICogICAgICB7QGxpbmsgYW5kcm9pZC50ZXN0LlJlbmFtaW5nRGVsZWdhdGluZ0NvbnRleHQgUmVuYW1pbmdEZWxlZ2F0aW5nQ29udGV4dH0sCisgKiAgICAgIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXIgQ29udGV4dFdyYXBwZXJ9LCBhbmQKKyAqICAgICAge0BsaW5rIGFuZHJvaWQudGVzdC5Jc29sYXRlZENvbnRleHR9LgogICovCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2VydmljZVRlc3RDYXNlPFQgZXh0ZW5kcyBTZXJ2aWNlPiBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7CiAKQEAgLTc1LDYgKzk3LDEwIEBACiAgICAgcHJpdmF0ZSBDb250ZXh0IG1TeXN0ZW1Db250ZXh0OwogICAgIHByaXZhdGUgQXBwbGljYXRpb24gbUFwcGxpY2F0aW9uOwogCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IKKyAgICAgKiBAcGFyYW0gc2VydmljZUNsYXNzIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCisgICAgICovCiAgICAgcHVibGljIFNlcnZpY2VUZXN0Q2FzZShDbGFzczxUPiBzZXJ2aWNlQ2xhc3MpIHsKICAgICAgICAgbVNlcnZpY2VDbGFzcyA9IHNlcnZpY2VDbGFzczsKICAgICB9CkBAIC04OCwzMCArMTE0LDM1IEBACiAgICAgcHJpdmF0ZSBpbnQgbVNlcnZpY2VJZDsKIAogICAgIC8qKgotICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgYWN0dWFsIHNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuIFRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdoZW4KKyAgICAgKiBhIHRlc3QgY2FsbHMge0BsaW5rICNzdGFydFNlcnZpY2V9IG9yIHtAbGluayAjYmluZFNlcnZpY2V9LgogICAgICAqLwogICAgIHB1YmxpYyBUIGdldFNlcnZpY2UoKSB7CiAgICAgICAgIHJldHVybiBtU2VydmljZTsKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgZG8gdGhlIHdvcmsgdG8gaW5zdGFudGlhdGUgdGhlIFNlcnZpY2UgdW5kZXIgdGVzdC4gIEFmdGVyIHRoaXMsIHlvdXIgdGVzdCAKLSAgICAgKiBjb2RlIG11c3QgYWxzbyBzdGFydCBhbmQgc3RvcCB0aGUgc2VydmljZS4KKyAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHN5c3RlbSBjb250ZXh0IGFuZCBzdG9yZXMgaXQuCisgICAgICoKKyAgICAgKiBFeHRlbmQgdGhpcyBtZXRob2QgdG8gZG8geW91ciBvd24gdGVzdCBpbml0aWFsaXphdGlvbi4gSWYgeW91IGRvIHNvLCB5b3UKKyAgICAgKiBtdXN0IGNhbGwgPGNvZGU+c3VwZXIuc2V0VXAoKTwvY29kZT4gYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB5b3VyIG92ZXJyaWRlLiBUaGUgbWV0aG9kIGlzCisgICAgICogY2FsbGVkIGJlZm9yZSBlYWNoIHRlc3QgbWV0aG9kIGlzIGV4ZWN1dGVkLgogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIGdldCB0aGUgcmVhbCBjb250ZXh0LCBiZWZvcmUgdGhlIGluZGl2aWR1YWwgdGVzdHMgaGF2ZSBhIGNoYW5jZSB0byBtdWNrIHdpdGggaXQKICAgICAgICAgbVN5c3RlbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7CiAKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCBhbmQgYXR0YWNoIGFsbCBpbmplY3RlZCBkZXBlbmRlbmNpZXMgKENvbnRleHQsIEFwcGxpY2F0aW9uKSB0bwotICAgICAqIGl0LiAgVGhpcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHtAbGluayAjc3RhcnRTZXJ2aWNlfSBvciBieSB7QGxpbmsgI2JpbmRTZXJ2aWNlfS4KLSAgICAgKiBJZiB5b3Ugd2lzaCB0byBjYWxsIHtAbGluayBBbmRyb2lkVGVzdENhc2Ujc2V0Q29udGV4dChDb250ZXh0KSBzZXRDb250ZXh0KCl9IG9yIAotICAgICAqIHtAbGluayAjc2V0QXBwbGljYXRpb24gc2V0QXBwbGljYXRpb24oKX0sIHlvdSBtdXN0IGRvIHNvICBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgICAqIENyZWF0ZXMgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCBhbmQgYXR0YWNoZXMgYWxsIGluamVjdGVkIGRlcGVuZGVuY2llcworICAgICAqIChDb250ZXh0LCBBcHBsaWNhdGlvbikgdG8gaXQuICBUaGlzIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHtAbGluayAjc3RhcnRTZXJ2aWNlfSBvcgorICAgICAqIGJ5IHtAbGluayAjYmluZFNlcnZpY2V9LgorICAgICAqIElmIHlvdSBuZWVkIHRvIGNhbGwge0BsaW5rIEFuZHJvaWRUZXN0Q2FzZSNzZXRDb250ZXh0KENvbnRleHQpIHNldENvbnRleHQoKX0gb3IKKyAgICAgKiB7QGxpbmsgI3NldEFwcGxpY2F0aW9uIHNldEFwcGxpY2F0aW9uKCl9LCBkbyBzbyBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KICAgICAgKi8KICAgICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFNlcnZpY2UoKSB7CiAgICAgICAgIG1TZXJ2aWNlID0gbnVsbDsKQEAgLTEzMSw2MCArMTYyLDc0IEBACiAgICAgICAgICAgICAgICAgZ2V0QXBwbGljYXRpb24oKSwKICAgICAgICAgICAgICAgICBudWxsICAgICAgICAgICAgICAgIC8vIG1vY2tlZCBzZXJ2aWNlcyBkb24ndCB0YWxrIHdpdGggdGhlIGFjdGl2aXR5IG1hbmFnZXIKICAgICAgICAgICAgICAgICApOwotICAgICAgICAKKwogICAgICAgICBhc3NlcnROb3ROdWxsKG1TZXJ2aWNlKTsKLSAgICAgICAgCisKICAgICAgICAgbVNlcnZpY2VJZCA9IG5ldyBSYW5kb20oKS5uZXh0SW50KCk7CiAgICAgICAgIG1TZXJ2aWNlQXR0YWNoZWQgPSB0cnVlOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QsIGluIHRoZSBzYW1lIHdheSBhcyBpZiBpdCB3YXMgc3RhcnRlZCBieQotICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2UgQ29udGV4dC5zdGFydFNlcnZpY2UoKX0sIHByb3ZpZGluZyB0aGUgCi0gICAgICogYXJndW1lbnRzIGl0IHN1cHBsaWVkLiAgSWYgeW91IHVzZSB0aGlzIG1ldGhvZCB0byBzdGFydCB0aGUgc2VydmljZSwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICogYmUgc3RvcHBlZCBieSB7QGxpbmsgI3RlYXJEb3dufS4KLSAgICAgKiAgCi0gICAgICogQHBhcmFtIGludGVudCBUaGUgSW50ZW50IGFzIGlmIHN1cHBsaWVkIHRvIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNzdGFydFNlcnZpY2V9LgorICAgICAqIFN0YXJ0cyB0aGUgc2VydmljZSB1bmRlciB0ZXN0LCBpbiB0aGUgc2FtZSB3YXkgYXMgaWYgaXQgd2VyZSBzdGFydGVkIGJ5CisgICAgICoge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I3N0YXJ0U2VydmljZShJbnRlbnQpIENvbnRleHQuc3RhcnRTZXJ2aWNlKEludGVudCl9IHdpdGgKKyAgICAgKiBhbiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gdGhhdCBpZGVudGlmaWVzIGEgc2VydmljZS4KKyAgICAgKiBJZiB5b3UgdXNlIHRoaXMgbWV0aG9kIHRvIHN0YXJ0IHRoZSBzZXJ2aWNlLCBpdCBpcyBhdXRvbWF0aWNhbGx5IHN0b3BwZWQgYnkKKyAgICAgKiB7QGxpbmsgI3RlYXJEb3dufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlbnQgQW4gSW50ZW50IHRoYXQgaWRlbnRpZmllcyBhIHNlcnZpY2UsIG9mIHRoZSBzYW1lIGZvcm0gYXMgdGhlIEludGVudCBwYXNzZWQgdG8KKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjc3RhcnRTZXJ2aWNlKEludGVudCkgQ29udGV4dC5zdGFydFNlcnZpY2UoSW50ZW50KX0uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgc3RhcnRTZXJ2aWNlKEludGVudCBpbnRlbnQpIHsKICAgICAgICAgaWYgKCFtU2VydmljZUF0dGFjaGVkKSB7CiAgICAgICAgICAgICBzZXR1cFNlcnZpY2UoKTsKICAgICAgICAgfQogICAgICAgICBhc3NlcnROb3ROdWxsKG1TZXJ2aWNlKTsKLSAgICAgICAgCisKICAgICAgICAgaWYgKCFtU2VydmljZUNyZWF0ZWQpIHsKICAgICAgICAgICAgIG1TZXJ2aWNlLm9uQ3JlYXRlKCk7CiAgICAgICAgICAgICBtU2VydmljZUNyZWF0ZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgICAgIG1TZXJ2aWNlLm9uU3RhcnRDb21tYW5kKGludGVudCwgMCwgbVNlcnZpY2VJZCk7Ci0gICAgICAgIAorCiAgICAgICAgIG1TZXJ2aWNlU3RhcnRlZCA9IHRydWU7CiAgICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFN0YXJ0IHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QsIGluIHRoZSBzYW1lIHdheSBhcyBpZiBpdCB3YXMgc3RhcnRlZCBieQotICAgICAqIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dCNiaW5kU2VydmljZSBDb250ZXh0LmJpbmRTZXJ2aWNlKCl9LCBwcm92aWRpbmcgdGhlIAotICAgICAqIGFyZ3VtZW50cyBpdCBzdXBwbGllZC4KLSAgICAgKiAgCi0gICAgICogUmV0dXJuIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgdG8gdGhlIHNlcnZpY2UuICBNYXkgcmV0dXJuIG51bGwgaWYgCi0gICAgICogY2xpZW50cyBjYW4gbm90IGJpbmQgdG8gdGhlIHNlcnZpY2UuICBUaGUgcmV0dXJuZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5vcy5JQmluZGVyfSBpcyB1c3VhbGx5IGZvciBhIGNvbXBsZXggaW50ZXJmYWNlCi0gICAgICogdGhhdCBoYXMgYmVlbiA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9haWRsLmh0bWwiPmRlc2NyaWJlZCB1c2luZwotICAgICAqIGFpZGw8L2E+LiAKLSAgICAgKiAKLSAgICAgKiBOb3RlOiAgSW4gb3JkZXIgdG8gdGVzdCB3aXRoIHRoaXMgaW50ZXJmYWNlLCB5b3VyIHNlcnZpY2UgbXVzdCBpbXBsZW1lbnQgYSBnZXRTZXJ2aWNlKCkKLSAgICAgKiBtZXRob2QsIGFzIHNob3duIGluIHNhbXBsZXMuQXBpRGVtb3MuYXBwLkxvY2FsU2VydmljZS4KIAotICAgICAqIEBwYXJhbSBpbnRlbnQgVGhlIEludGVudCBhcyBpZiBzdXBwbGllZCB0byB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2V9LgotICAgICAqIAotICAgICAqIEByZXR1cm4gUmV0dXJuIGFuIElCaW5kZXIgZm9yIG1ha2luZyBmdXJ0aGVyIGNhbGxzIGludG8gdGhlIFNlcnZpY2UuCisgICAgLyoqCisgICAgICogPHA+CisgICAgICogICAgICBTdGFydHMgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdCwgaW4gdGhlIHNhbWUgd2F5IGFzIGlmIGl0IHdlcmUgc3RhcnRlZCBieQorICAgICAqICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I2JpbmRTZXJ2aWNlKEludGVudCwgU2VydmljZUNvbm5lY3Rpb24sIGludCkKKyAgICAgKiAgICAgIENvbnRleHQuYmluZFNlcnZpY2UoSW50ZW50LCBTZXJ2aWNlQ29ubmVjdGlvbiwgZmxhZ3MpfSB3aXRoIGFuCisgICAgICogICAgICB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkludGVudH0gdGhhdCBpZGVudGlmaWVzIGEgc2VydmljZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogICAgICBOb3RpY2UgdGhhdCB0aGUgcGFyYW1ldGVycyBhcmUgZGlmZmVyZW50LiBZb3UgZG8gbm90IHByb3ZpZGUgYQorICAgICAqICAgICAge0BsaW5rIGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbn0gb2JqZWN0IG9yIHRoZSBmbGFncyBwYXJhbWV0ZXIuIEluc3RlYWQsCisgICAgICogICAgICB5b3Ugb25seSBwcm92aWRlIHRoZSBJbnRlbnQuIFRoZSBtZXRob2QgcmV0dXJucyBhbiBvYmplY3Qgd2hvc2UgdHlwZSBpcyBhCisgICAgICogICAgICBzdWJjbGFzcyBvZiB7QGxpbmsgYW5kcm9pZC5vcy5JQmluZGVyfSwgb3IgbnVsbCBpZiB0aGUgbWV0aG9kIGZhaWxzLiBBbiBJQmluZGVyCisgICAgICogICAgICBvYmplY3QgcmVmZXJzIHRvIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZAorICAgICAqICAgICAgdGhlIHNlcnZpY2UuIFRoZSBmbGFnIGlzIGFzc3VtZWQgdG8gYmUge0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZXh0I0JJTkRfQVVUT19DUkVBVEV9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIFNlZSA8YSBocmVmPSJ7QGRvY1Jvb3R9Z3VpZGUvZGV2ZWxvcGluZy90b29scy9haWRsLmh0bWwiPkRlc2lnbmluZyBhIFJlbW90ZSBJbnRlcmZhY2UKKyAgICAgKiAgICAgIFVzaW5nIEFJREw8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgb2JqZWN0IHJldHVybmVkCisgICAgICogICAgICBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogTm90ZTogIFRvIGJlIGFibGUgdG8gdXNlIGJpbmRTZXJ2aWNlIGluIGEgdGVzdCwgdGhlIHNlcnZpY2UgbXVzdCBpbXBsZW1lbnQgZ2V0U2VydmljZSgpCisgICAgICogbWV0aG9kLiBBbiBleGFtcGxlIG9mIHRoaXMgaXMgaW4gdGhlIEFwaURlbW9zIHNhbXBsZSBhcHBsaWNhdGlvbiwgaW4gdGhlCisgICAgICogTG9jYWxTZXJ2aWNlIGRlbW8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZW50IEFuIEludGVudCBvYmplY3Qgb2YgdGhlIGZvcm0gZXhwZWN0ZWQgYnkKKyAgICAgKiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRleHQjYmluZFNlcnZpY2V9LgorICAgICAqCisgICAgICogQHJldHVybiBBbiBvYmplY3Qgd2hvc2UgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIElCaW5kZXIsIGZvciBtYWtpbmcgZnVydGhlciBjYWxscyBpbnRvCisgICAgICogdGhlIHNlcnZpY2UuCiAgICAgICovCiAgICAgcHJvdGVjdGVkIElCaW5kZXIgYmluZFNlcnZpY2UoSW50ZW50IGludGVudCkgewogICAgICAgICBpZiAoIW1TZXJ2aWNlQXR0YWNoZWQpIHsKICAgICAgICAgICAgIHNldHVwU2VydmljZSgpOwogICAgICAgICB9CiAgICAgICAgIGFzc2VydE5vdE51bGwobVNlcnZpY2UpOwotICAgICAgICAKKwogICAgICAgICBpZiAoIW1TZXJ2aWNlQ3JlYXRlZCkgewogICAgICAgICAgICAgbVNlcnZpY2Uub25DcmVhdGUoKTsKICAgICAgICAgICAgIG1TZXJ2aWNlQ3JlYXRlZCA9IHRydWU7CkBAIC0xOTIsMTUgKzIzNywxNSBAQAogICAgICAgICAvLyBubyBleHRyYXMgYXJlIGV4cGVjdGVkIGJ5IHVuYmluZAogICAgICAgICBtU2VydmljZUludGVudCA9IGludGVudC5jbG9uZUZpbHRlcigpOwogICAgICAgICBJQmluZGVyIHJlc3VsdCA9IG1TZXJ2aWNlLm9uQmluZChpbnRlbnQpOwotICAgICAgICAKKwogICAgICAgICBtU2VydmljZUJvdW5kID0gdHJ1ZTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgbmVjZXNzYXJ5IGNhbGxzIHRvIHN0b3AgKG9yIHVuYmluZCkgdGhlIFNlcnZpY2UgdW5kZXIgdGVzdCwgYW5kCi0gICAgICogY2FsbCBvbkRlc3Ryb3koKS4gIE9yZGluYXJpbHkgdGhpcyB3aWxsIGJlIGNhbGxlZCBhdXRvbWF0aWNhbGx5IChieSB7QGxpbmsgI3RlYXJEb3dufSwgYnV0Ci0gICAgICogeW91IGNhbiBjYWxsIGl0IGRpcmVjdGx5IGZyb20geW91ciB0ZXN0IGluIG9yZGVyIHRvIGNoZWNrIGZvciBwcm9wZXIgc2h1dGRvd24gYmVoYXZpb3JzLgorICAgICAqIE1ha2VzIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gc3RvcCAob3IgdW5iaW5kKSB0aGUgc2VydmljZSB1bmRlciB0ZXN0LCBhbmQKKyAgICAgKiBjYWxscyBvbkRlc3Ryb3koKS4gIE9yZGluYXJpbHkgdGhpcyBpcyBjYWxsZWQgYXV0b21hdGljYWxseSAoYnkge0BsaW5rICN0ZWFyRG93bn0sIGJ1dAorICAgICAqIHlvdSBjYW4gY2FsbCBpdCBkaXJlY3RseSBmcm9tIHlvdXIgdGVzdCBpbiBvcmRlciB0byBjaGVjayBmb3IgcHJvcGVyIHNodXRkb3duIGJlaGF2aW9yLgogICAgICAqLwogICAgIHByb3RlY3RlZCB2b2lkIHNodXRkb3duU2VydmljZSgpIHsKICAgICAgICAgaWYgKG1TZXJ2aWNlU3RhcnRlZCkgewpAQCAtMjE0LDEzICsyNTksMTggQEAKICAgICAgICAgICAgIG1TZXJ2aWNlLm9uRGVzdHJveSgpOwogICAgICAgICB9CiAgICAgfQotICAgIAorCiAgICAgLyoqCi0gICAgICogU2h1dHMgZG93biB0aGUgU2VydmljZSB1bmRlciB0ZXN0LiAgQWxzbyBtYWtlcyBzdXJlIGFsbCByZXNvdXJjZXMgYXJlIGNsZWFuZWQgdXAgYW5kIAotICAgICAqIGdhcmJhZ2UgY29sbGVjdGVkIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQKLSAgICAgKiB0ZXN0LiAgU3ViY2xhc3NlcyB0aGF0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHNob3VsZCBtYWtlIHN1cmUgdGhleSBjYWxsIHN1cGVyLnRlYXJEb3duKCkKLSAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBvdmVycmlkaW5nIG1ldGhvZC4KLSAgICAgKiAKKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIFNodXRzIGRvd24gdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4gIEVuc3VyZXMgYWxsIHJlc291cmNlcyBhcmUgY2xlYW5lZCB1cCBhbmQKKyAgICAgKiAgICAgIGdhcmJhZ2UgY29sbGVjdGVkIGJlZm9yZSBtb3Zpbmcgb24gdG8gdGhlIG5leHQgdGVzdC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGVhY2gKKyAgICAgKiAgICAgIHRlc3QgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiAgICAgIFN1YmNsYXNzZXMgdGhhdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBtdXN0IGNhbGwgPGNvZGU+c3VwZXIudGVhckRvd24oKTwvY29kZT4gYXMgdGhlaXIKKyAgICAgKiAgICAgIGxhc3Qgc3RhdGVtZW50LgorICAgICAqIDwvcD4KKyAgICAgKgogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCiAgICAgQE92ZXJyaWRlCkBAIC0yMjgsNDUgKzI3OCw1NCBAQAogICAgICAgICBzaHV0ZG93blNlcnZpY2UoKTsKICAgICAgICAgbVNlcnZpY2UgPSBudWxsOwogCi0gICAgICAgIC8vIFNjcnViIG91dCBtZW1iZXJzIC0gcHJvdGVjdHMgYWdhaW5zdCBtZW1vcnkgbGVha3MgaW4gdGhlIGNhc2Ugd2hlcmUgc29tZW9uZSAKKyAgICAgICAgLy8gU2NydWIgb3V0IG1lbWJlcnMgLSBwcm90ZWN0cyBhZ2FpbnN0IG1lbW9yeSBsZWFrcyBpbiB0aGUgY2FzZSB3aGVyZSBzb21lb25lCiAgICAgICAgIC8vIGNyZWF0ZXMgYSBub24tc3RhdGljIGlubmVyIGNsYXNzICh0aHVzIHJlZmVyZW5jaW5nIHRoZSB0ZXN0IGNhc2UpIGFuZCBnaXZlcyBpdCB0bwogICAgICAgICAvLyBzb21lb25lIGVsc2UgdG8gaG9sZCBvbnRvCiAgICAgICAgIHNjcnViQ2xhc3MoU2VydmljZVRlc3RDYXNlLmNsYXNzKTsKIAogICAgICAgICBzdXBlci50ZWFyRG93bigpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIFNldCB0aGUgYXBwbGljYXRpb24gZm9yIHVzZSBkdXJpbmcgdGhlIHRlc3QuICBJZiB5b3VyIHRlc3QgZG9lcyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLAotICAgICAqIGEgbmV3IHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb24gTW9ja0FwcGxpY2F0aW9ufSBvYmplY3Qgd2lsbCBiZSBnZW5lcmF0ZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIFRoZSBBcHBsaWNhdGlvbiBvYmplY3QgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIFNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKiBTZXRzIHRoZSBhcHBsaWNhdGlvbiB0aGF0IGlzIHVzZWQgZHVyaW5nIHRoZSB0ZXN0LiAgSWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgbWV0aG9kLAorICAgICAqIGEgbmV3IHtAbGluayBhbmRyb2lkLnRlc3QubW9jay5Nb2NrQXBwbGljYXRpb24gTW9ja0FwcGxpY2F0aW9ufSBvYmplY3QgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBUaGUgQXBwbGljYXRpb24gb2JqZWN0IHRoYXQgaXMgdXNlZCBieSB0aGUgc2VydmljZSB1bmRlciB0ZXN0LgorICAgICAqCisgICAgICogQHNlZSAjZ2V0QXBwbGljYXRpb24oKQogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CiAgICAgICAgIG1BcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgQXBwbGljYXRpb24gb2JqZWN0IGJlaW5nIHVzZWQgYnkgdGhlIFNlcnZpY2UgdW5kZXIgdGVzdC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFJldHVybnMgdGhlIGFwcGxpY2F0aW9uIG9iamVjdC4KLSAgICAgKiAKKyAgICAgKiBSZXR1cm5zIHRoZSBBcHBsaWNhdGlvbiBvYmplY3QgaW4gdXNlIGJ5IHRoZSBzZXJ2aWNlIHVuZGVyIHRlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBhcHBsaWNhdGlvbiBvYmplY3QuCisgICAgICoKICAgICAgKiBAc2VlICNzZXRBcHBsaWNhdGlvbgogICAgICAqLwogICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbigpIHsKICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbjsKICAgICB9Ci0gICAgCisKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSByZWFsIChub3QgbW9ja2VkIG9yIGluc3RydW1lbnRlZCkgc3lzdGVtIENvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcKLSAgICAgKiBNb2NrIG9yIG90aGVyIENvbnRleHQgb2JqZWN0cyBmb3IgeW91ciBTZXJ2aWNlIHVuZGVyIHRlc3QuCi0gICAgICogCi0gICAgICogQHJldHVybiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgbm9ybWFsIENvbnRleHQuCisgICAgICogUmV0dXJucyB0aGUgcmVhbCBzeXN0ZW0gY29udGV4dCB0aGF0IGlzIHNhdmVkIGJ5IHtAbGluayAjc2V0VXAoKX0uIFVzZSBpdCB0byBjcmVhdGUKKyAgICAgKiBtb2NrIG9yIG90aGVyIHR5cGVzIG9mIGNvbnRleHQgb2JqZWN0cyBmb3IgdGhlIHNlcnZpY2UgdW5kZXIgdGVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQSBub3JtYWwgc3lzdGVtIGNvbnRleHQuCiAgICAgICovCiAgICAgcHVibGljIENvbnRleHQgZ2V0U3lzdGVtQ29udGV4dCgpIHsKICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Db250ZXh0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQge0BsaW5rICNzZXR1cFNlcnZpY2UoKX0gcnVucyBjb3JyZWN0bHkgYW5kIGlzc3VlcyBhbgorICAgICAqIHtAbGluayBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0I2Fzc2VydE5vdE51bGwoU3RyaW5nLCBPYmplY3QpfSBpZiBpdCBkb2VzLgorICAgICAqIFlvdSBjYW4gb3ZlcnJpZGUgdGhpcyB0ZXN0IG1ldGhvZCBpZiB5b3Ugd2lzaC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCiAgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VUZXN0Q2FzZVNldFVwUHJvcGVybHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgc2V0dXBTZXJ2aWNlKCk7CiAgICAgICAgIGFzc2VydE5vdE51bGwoInNlcnZpY2Ugc2hvdWxkIGJlIGxhdW5jaGVkIHN1Y2Nlc3NmdWxseSIsIG1TZXJ2aWNlKTsKZGlmZiAtLWdpdCBhL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFJlc29sdmVyLmphdmEgYi90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRSZXNvbHZlci5qYXZhCmluZGV4IDNhMWRjMzZjLi5hYjUxMWY4IDEwMDY0NAotLS0gYS90ZXN0LXJ1bm5lci9zcmMvYW5kcm9pZC90ZXN0L21vY2svTW9ja0NvbnRlbnRSZXNvbHZlci5qYXZhCisrKyBiL3Rlc3QtcnVubmVyL3NyYy9hbmRyb2lkL3Rlc3QvbW9jay9Nb2NrQ29udGVudFJlc29sdmVyLmphdmEKQEAgLTI4LDI5ICsyOCw1OSBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgotICogQSBtb2NrIHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyfSBjbGFzcyB0aGF0IGlzb2xhdGVzIHRoZSB0ZXN0IGNvZGUgZnJvbSB0aGUgcmVhbAotICogY29udGVudCBzeXN0ZW0uICBBbGwgbWV0aG9kcyBhcmUgbm9uLWZ1bmN0aW9uYWwgYW5kIHRocm93Ci0gKiB7QGxpbmsgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4gIAotICoKLSAqIDxwPlRoaXMgb25seSBpc29sYXRlcyB0aGUgdGVzdCBjb2RlIGluIHdheXMgdGhhdCBoYXZlIHByb3ZlbiB1c2VmdWwgc28gZmFyLiBNb3JlIHNob3VsZCBiZQotICogYWRkZWQgYXMgdGhleSBiZWNvbWUgYSBwcm9ibGVtLgorICogPHA+CisgKiAgICAgIEFuIGV4dGVuc2lvbiBvZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcn0gdGhhdCBpcyBkZXNpZ25lZCBmb3IKKyAqICAgICAgdGVzdGluZy4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgICBNb2NrQ29udGVudFJlc29sdmVyIG92ZXJyaWRlcyBBbmRyb2lkJ3Mgbm9ybWFsIHdheSBvZiByZXNvbHZpbmcgcHJvdmlkZXJzIGJ5CisgKiAgICAgIGF1dGhvcml0eS4gVG8gaGF2ZSBhY2Nlc3MgdG8gYSBwcm92aWRlciBiYXNlZCBvbiBpdHMgYXV0aG9yaXR5LCB1c2VycyBvZgorICogICAgICBNb2NrQ29udGVudFJlc29sdmVyIGZpcnN0IGluc3RhbnRpYXRlIHRoZSBwcm92aWRlciBhbmQKKyAqICAgICAgdXNlIHtAbGluayBNb2NrQ29udGVudFJlc29sdmVyI2FkZFByb3ZpZGVyKFN0cmluZywgQ29udGVudFByb3ZpZGVyKX0uIFJlc29sdXRpb24gb2YgYW4KKyAqICAgICAgYXV0aG9yaXR5IG9jY3VycyBlbnRpcmVseSB3aXRoaW4gTW9ja0NvbnRlbnRSZXNvbHZlci4KKyAqIDwvcD4KKyAqIDxwPgorICogICAgICBVc2VycyBjYW4gYWxzbyBzZXQgYW4gYXV0aG9yaXR5J3MgZW50cnkgaW4gdGhlIG1hcCB0byBudWxsLCBzbyB0aGF0IGEgcHJvdmlkZXIgaXMgY29tcGxldGVseQorICogICAgICBtb2NrZWQgb3V0LgorICogPC9wPgogICovCisKIHB1YmxpYyBjbGFzcyBNb2NrQ29udGVudFJlc29sdmVyIGV4dGVuZHMgQ29udGVudFJlc29sdmVyIHsKICAgICBNYXA8U3RyaW5nLCBDb250ZW50UHJvdmlkZXI+IG1Qcm92aWRlcnM7CiAKKyAgICAvKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBtYXAgb2YgcHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBtYXAgd2hlbiBhbgorICAgICAqIEFQSSBjYWxsIHRyaWVzIHRvIGFjcXVpcmUgYSBwcm92aWRlci4KKyAgICAgKi8KICAgICBwdWJsaWMgTW9ja0NvbnRlbnRSZXNvbHZlcigpIHsKICAgICAgICAgc3VwZXIobnVsbCk7CiAgICAgICAgIG1Qcm92aWRlcnMgPSBNYXBzLm5ld0hhc2hNYXAoKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBBZGRzIGFjY2VzcyB0byBhIHByb3ZpZGVyIGJhc2VkIG9uIGl0cyBhdXRob3JpdHkKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBhdXRob3JpdHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBwcm92aWRlciBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRQcm92aWRlcn0gb3Igb25lIG9mIGl0cworICAgICAqIHN1YmNsYXNzZXMsIG9yIG51bGwuCisgICAgICovCiAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoU3RyaW5nIG5hbWUsIENvbnRlbnRQcm92aWRlciBwcm92aWRlcikgeworCisgICAgICAgIC8qCisgICAgICAgICAqIE1hcHMgdGhlIGF1dGhvcml0eSB0byB0aGUgcHJvdmlkZXIgbG9jYWxseS4KKyAgICAgICAgICovCiAgICAgICAgIG1Qcm92aWRlcnMucHV0KG5hbWUsIHByb3ZpZGVyKTsKICAgICB9CiAKICAgICAvKiogQGhpZGUgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwcm90ZWN0ZWQgSUNvbnRlbnRQcm92aWRlciBhY3F1aXJlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSkgeworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcHJvdmlkZXIgZnJvbSB0aGUgbG9jYWwgbWFwCisgICAgICAgICAqLwogICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChuYW1lKTsKKwogICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldElDb250ZW50UHJvdmlkZXIoKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTY0LDcgKzk0LDE4IEBACiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNub3RpZnlDaGFuZ2UoVXJpLCBDb250ZW50T2JzZXJ2ZXIsIGJvb2xlYW4pCisgICAgICogQ29udGVudFJlc29sdmVyLm5vdGlmQ2hhbmdlKFVyaSwgQ29udGVudE9ic2VydmVyLCBib29sZWFuKX0uIEFsbCBwYXJhbWV0ZXJzIGFyZSBpZ25vcmVkLgorICAgICAqIFRoZSBtZXRob2QgaGlkZXMgcHJvdmlkZXJzIGxpbmtlZCB0byBNb2NrQ29udGVudFJlc29sdmVyIGZyb20gb3RoZXIgb2JzZXJ2ZXJzIGluIHRoZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIChJZ25vcmVkKSBUaGUgdXJpIG9mIHRoZSBjb250ZW50IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBvYnNlcnZlciAoSWdub3JlZCkgVGhlIG9ic2VydmVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgY2hhbmdlLgorICAgICAqIEBwYXJhbSBzeW5jVG9OZXR3b3JrIChJZ25vcmVkKSBJZiB0cnVlLCBhdHRlbXB0IHRvIHN5bmMgdGhlIGNoYW5nZSB0byB0aGUgbmV0d29yay4KKyAgICAgKi8KICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoVXJpIHVyaSwgQ29udGVudE9ic2VydmVyIG9ic2VydmVyLCBib29sZWFuIHN5bmNUb05ldHdvcmspIHsKKyAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2UoVXJpIHVyaSwKKyAgICAgICAgICAgIENvbnRlbnRPYnNlcnZlciBvYnNlcnZlciwKKyAgICAgICAgICAgIGJvb2xlYW4gc3luY1RvTmV0d29yaykgewogICAgIH0KIH0K