Ly8gQ29weXJpZ2h0IChjKSAyMDA5IFRoZSBDaHJvbWl1bSBPUyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi8vIFNvbWUgcG9ydGlvbnMgQ29weXJpZ2h0IChjKSAyMDA5IFRoZSBDaHJvbWl1bSBBdXRob3JzLgovLwovLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBFbnYgaW50ZXJmYWNlLgoKI2luY2x1ZGUgIm1pbmlqYWlsL2Vudi5oIgoKI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8Z3JwLmg+CiNpbmNsdWRlIDxwd2QuaD4KI2luY2x1ZGUgPHNjaGVkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzeXMvY2FwYWJpbGl0eS5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+CiNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlIDxiYXNlL2xvZ2dpbmcuaD4KCi8vIHByY3RsIGNvbnN0YW50cyB0aGF0IGFyZSBzdGlsbCBtaXNzaW5nIGluIHRoZSBoZWFkZXJzLgojZGVmaW5lIFBSX0dFVF9LRUVQQ0FQUyAgICA3CiNkZWZpbmUgUFJfU0VUX0tFRVBDQVBTICAgIDgKI2RlZmluZSBQUl9DQVBCU0VUX1JFQUQgICAyMwojZGVmaW5lIFBSX0NBUEJTRVRfRFJPUCAgIDI0CiNkZWZpbmUgUFJfR0VUX1NFQ1VSRUJJVFMgMjcKI2RlZmluZSBQUl9TRVRfU0VDVVJFQklUUyAyOAoKbmFtZXNwYWNlIGNocm9tZW9zIHsKCm5hbWVzcGFjZSBtaW5pamFpbCB7Cgpib29sIEVudjo6RGlzYWJsZVRyYWNpbmcoKSBjb25zdCB7CiAgRExPRyhJTkZPKSA8PCAiRGlzYWJsaW5nIERVTVBBQkxFLi4uIjsKICBpZiAocHJjdGwoUFJfU0VUX0RVTVBBQkxFLCAwLCAwLCAwLCAwKSkgewogICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBzZXQgUFJfU0VUX0tFRVBDQVBTIjsKICB9CiAgaWYgKHByY3RsKFBSX0dFVF9EVU1QQUJMRSwgMCwgMCwgMCwgMCkpIHsKICAgIExPRyhGQVRBTCkgPDwgIlBSX1NFVF9EVU1QQUJMRSBjb3VsZCBub3QgYmUgc2V0IjsKICB9CiAgRExPRyhJTkZPKSA8PCAiU3VjY2VzcyI7CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgRW52OjpLZWVwUm9vdENhcGFiaWxpdGllcygpIGNvbnN0IHsKICBETE9HKElORk8pIDw8ICJFbmFibGluZyBLRUVQQ0FQUy4uLiI7CiAgaWYgKHByY3RsKFBSX1NFVF9LRUVQQ0FQUywgMSkgPCAwKSB7CiAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIHNldCBQUl9TRVRfS0VFUENBUFMiOwogICB9CiAgaWYgKHByY3RsKFBSX0dFVF9LRUVQQ0FQUywgMCkgIT0gMSkgewogICAgTE9HKEZBVEFMKSA8PCAiUFJfR0VUX0tFRVBDQVBTIGNvdWxkIG5vdCBiZSBzZXQiOwogIH0KCiAgRExPRyhJTkZPKSA8PCAiU3VjY2Vzcy4iOwogIHJldHVybiB0cnVlOwp9Cgpib29sIEVudjo6RGlzYWJsZURlZmF1bHRSb290UHJpdmlsZWdlcygpIGNvbnN0IHsKICBETE9HKElORk8pIDw8ICJFbmFibGluZyBTRUNVUkVfQUxMLi4uIjsKICAvLyBGcm9tOiBrZXJuZWwvaW5jbHVkZS9saW51eC9zZWN1cmViaXRzLmg6CiAgLy8gaHR0cDovL2dpdC5jaHJvbWl1bS5vcmcvY2dpLWJpbi9naXR3ZWIuY2dpP3A9a2VybmVsLmdpdDthPWJsb2I7Zj1pbmNsdWRlL2xpbnV4L3NlY3VyZWJpdHMuaAogIGNvbnN0IGludCBrU2VjdXJlQml0c0FsbExvY2tlZCA9IDB4M2Y7CiAgaWYgKHByY3RsKFBSX1NFVF9TRUNVUkVCSVRTLCBrU2VjdXJlQml0c0FsbExvY2tlZCkpIHsKICAgIFBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gc2V0IFBSX1NFVF9TRUNVUkVCSVRTIjsKICB9CiAgRExPRyhJTkZPKSA8PCAiU3VjY2Vzcy4iOwogIHJldHVybiB0cnVlOwp9Cgpib29sIEVudjo6Q2hhbmdlVXNlcih1aWRfdCB1aWQsIGdpZF90IGdpZCkgY29uc3QgewogIC8vIFRPRE8od2FkKSBzdXBwb3J0IHN1cHBsZW1lbnRhbCBncm91cHMKICBETE9HKElORk8pIDw8ICJEcm9wcGluZyByb290Li4uIjsKICBzdHJ1Y3QgcGFzc3dkKiBlbnRyeSA9IGdldHB3dWlkKHVpZCk7CiAgZW5kcHdlbnQoKTsKICBpZiAoIWVudHJ5KSB7CiAgICBMT0coSU5GTykgPDwgIlVJRCBpcyB1bmtub3duLiBDbGVhcmluZyBhbGwgc3VwcGxlbWVudGFsIGdyb3VwcyI7CiAgICBQTE9HX0lGKEZBVEFMLCBzZXRncm91cHMoMCwgTlVMTCkpCiAgICAgICAgPDwgIkZhaWxlZCB0byBjbGVhciBzdXBwbGVtZW50YXJ5IGdyb3VwcyI7CiAgfSBlbHNlIHsKICAgIFBMT0dfSUYoRkFUQUwsIGluaXRncm91cHMoZW50cnktPnB3X25hbWUsIGVudHJ5LT5wd19naWQpKQogICAgICA8PCAiRmFpbGVkIHRvIHNldCBzdXBwbGVtZW50YXJ5IGdyb3VwcyI7CiAgfQogIGlmIChzZXRyZXNnaWQoZ2lkLCBnaWQsIGdpZCkpIHsKICAgIFBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gY2hhbmdlIHRvIGdpZCAiIDw8IGdpZDsKICB9CiAgaWYgKHNldHJlc3VpZCh1aWQsIHVpZCwgdWlkKSkgewogICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBjaGFuZ2UgdG8gdWlkICIgPDwgdWlkOwogIH0KICBETE9HKElORk8pIDw8ICJTdWNjZXNzLiI7CiAgcmV0dXJuIHRydWU7Cn0KCi8vIEF0IHByZXNlbnQsIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FwYWJpbGl0aWVzIGlzIGxlc3MgdGhhbiAzMi4gV2UKLy8gd2lsbCBqdXN0IHBhY2sgdGhlbSBpbnRvIGEgYml0bWFzayB0byBzYXZlIG9uIGVmZm9ydC4KYm9vbCBFbnY6OlNhbml0aXplQm91bmRpbmdTZXQodWludDY0IGNhcF9tYXNrKSBjb25zdCB7CiAgdW5zaWduZWQgaW50IGNhcDsKICBETE9HKElORk8pIDw8ICJDbGVhbmluZyB0aGUgYm91bmRpbmcgc2V0Li4uIjsKICAvLyBYWFg6IHdlIHJlYWQgdW50aWwgcHJjdGwgY29tcGxhaW5zIGJ1dCB0aGF0IG1heSBub3QKICAvLyBtYXRjaCBDQVBfTEFTVF9DQVAuICBXZSdsbCBqdXN0IGRyb3AgdGhlIGV4Y2VzcyBpZiBpdCB0dXJucyB1cC4KICAvLyBXZSBtdXN0brR0IGRyb3AgQ0FQX1NFVFBDQVAgb24gdGhlIHdheSB0aG91Z2guCiAgc3RhdGljIGNvbnN0IHVpbnQzMiBrQml0c0luQUJ5dGUgPSA4OwogIHN0YXRpYyBjb25zdCB1aW50MzIga01heENhcHMgPSBzaXplb2YoY2FwX21hc2spICoga0JpdHNJbkFCeXRlOwogIGZvciAoY2FwID0gMDsgY2FwIDwga01heENhcHMgJiYgcHJjdGwoUFJfQ0FQQlNFVF9SRUFELCBjYXApID49IDA7ICsrY2FwKSB7CiAgICBpZiAoY2FwID09IENBUF9TRVRQQ0FQKSB7CiAgICAgIGNvbnRpbnVlOwogICAgfQogICAgaWYgKGNhcF9tYXNrICYgKDFVTEwgPDwgKGNhcCkpKSB7CiAgICAgIERMT0coSU5GTykgPDwgIkxlYXZpbmcgY2FwICIgPDwgY2FwIDw8ICIgaW4gYm91bmRpbmcgc2V0IjsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAocHJjdGwoUFJfQ0FQQlNFVF9EUk9QLCBjYXApKSB7CiAgICAgIFBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gY2xlYW4gdGhlIGJvdW5kaW5nIHNldCBvZiBjYXAgIiA8PCBjYXA7CiAgICB9CiAgfQogIERMT0coSU5GTykgPDwgIlN1Y2Nlc3MuIjsKICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBFbnY6OlNhbml0aXplQ2FwYWJpbGl0aWVzKHVpbnQ2NCBlZmZlY3RpdmVfY2FwbWFzaykgY29uc3QgewogIERMT0coSU5GTykgPDwgIkRyb3BwaW5nIGNhcGFiaWxpdGllcy4uLiI7CiAgdW5zaWduZWQgaW50IGNhcDsKICBjYXBfdCBjYXBzID0gY2FwX2dldF9wcm9jKCk7CiAgY2FwX3ZhbHVlX3QgcmFpc2VfZmxhZ1sxXTsKICBpZiAoIWNhcHMpIHsKICAgIFBMT0coRkFUQUwpIDw8ICJjYXBfZ2V0X3Byb2MgZmFpbGVkIjsKICB9CiAgaWYgKGNhcF9jbGVhcl9mbGFnKGNhcHMsIENBUF9JTkhFUklUQUJMRSkpIHsKICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNsZWFyIGFsbCBpbmhlcml0YWJsZSBjYXBzIjsKICB9CiAgaWYgKGNhcF9jbGVhcl9mbGFnKGNhcHMsIENBUF9FRkZFQ1RJVkUpKSB7CiAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBjbGVhciBhbGwgZWZmZWN0aXZlIGNhcHMiOwogIH0KICBpZiAoY2FwX2NsZWFyX2ZsYWcoY2FwcywgQ0FQX1BFUk1JVFRFRCkpIHsKICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGNsZWFyIGFsbCBwZXJtaXR0ZWQgY2FwcyI7CiAgfQogIGZvciAoY2FwID0gMDsgY2FwIDwgc2l6ZW9mKGVmZmVjdGl2ZV9jYXBtYXNrKSo4OyArK2NhcCkgewogICAgLy8gSW4gYSBzZWN1cmVfbm9yb290IGphaWwsIGNhcF9zZXRwY2FwIGlzIHNhZmUuCiAgICBpZiAoY2FwID09IENBUF9TRVRQQ0FQIHx8CiAgICAgICAgZWZmZWN0aXZlX2NhcG1hc2sgJiAoMSA8PCBjYXApKSB7CiAgICAgIHJhaXNlX2ZsYWdbMF0gPSBjYXA7CiAgICAgIERMT0coSU5GTykgPDwgIkFkZGluZyBjYXAgIiA8PCBjYXAgPDwgIj1laXAiOwogICAgICBpZiAoY2FwX3NldF9mbGFnKGNhcHMsIENBUF9FRkZFQ1RJVkUsIDEsIHJhaXNlX2ZsYWcsIENBUF9TRVQpKSB7CiAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBhZGQgY2FwICIgPDwgY2FwIDw8ICIgdG8gdGhlIGVmZmVjdGl2ZSBzZXQiOwogICAgICB9CiAgICAgIGlmIChjYXBfc2V0X2ZsYWcoY2FwcywgQ0FQX1BFUk1JVFRFRCwgMSwgcmFpc2VfZmxhZywgQ0FQX1NFVCkpIHsKICAgICAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGFkZCBjYXAgIiA8PCBjYXAgPDwgIiB0byB0aGUgcGVybWl0dGVkIHNldCI7CiAgICAgIH0KICAgICAgaWYgKGNhcF9zZXRfZmxhZyhjYXBzLCBDQVBfSU5IRVJJVEFCTEUsIDEsIHJhaXNlX2ZsYWcsIENBUF9TRVQpKSB7CiAgICAgICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBhZGQgY2FwICIgPDwgY2FwIDw8ICIgdG8gdGhlIGluaGVyaXRlIHNldCI7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKGNhcF9zZXRfcHJvYyhjYXBzKSkgewogICAgIFBMT0coRkFUQUwpIDw8ICJGYWlsZWQgdG8gYXBwbHkgY2xlYW5lZCBjYXBzZXQiOwogIH0KICBjYXBfZnJlZShjYXBzKTsKICBETE9HKElORk8pIDw8ICJTdWNjZXNzLiI7CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgRW52OjpGaWx0ZXJTeXNjYWxsc0J5U291cmNlKCkgY29uc3QgewogIERMT0coSU5GTykgPDwgIkNhbGxpbmcgc2VjY29tcCgyKSI7CiAgaWYgKHByY3RsKFBSX1NFVF9TRUNDT01QLCAyKSkgewogICAgUExPRyhGQVRBTCkgPDwgIkZhaWxlZCB0byBlbmFibGVkIHNlY2NvbXAoMikiOwogIH0KICBETE9HKElORk8pIDw8ICJTeXN0ZW0gY2FsbHMgbm93IGZpbHRlcmVkIGJ5IHNvdXJjZSI7CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgRW52OjpGaWx0ZXJTeXNjYWxsc0JlbmNobWFya09ubHkoKSBjb25zdCB7CiAgRExPRyhJTkZPKSA8PCAiQ2FsbGluZyBzZWNjb21wKDMpIjsKICBpZiAocHJjdGwoUFJfU0VUX1NFQ0NPTVAsIDMpKSB7CiAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIGVuYWJsZWQgc2VjY29tcCgzKSI7CiAgfQogIERMT0coSU5GTykgPDwgIlN5c3RlbSBjYWxscyBub3cgbm9wIGZpbHRlcmVkIjsKICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBFbnY6OkVudGVyTmFtZXNwYWNlKGludCBuYW1lc3BhY2VzKSBjb25zdCB7CiAgaWYgKG5hbWVzcGFjZXMgPT0gMCkgewogICAgRExPRyhJTkZPKSA8PCAiTm8gbmFtZXNwYWNpbmcgdG8gYmUgZG9uZS4iOwogICAgcmV0dXJuIHRydWU7CiAgfQogIERMT0coSU5GTykgPDwgIkVudGVyaW5nIG5hbWVzcGFjZXMgIiA8PCBuYW1lc3BhY2VzOwogIC8vIFRPRE8od2FkKSBzdXBwb3J0IG5hbWVzcGFjZSBhcmdzCiAgY29uc3QgcGlkX3QgcGlkID0gc3lzY2FsbCgKICAgICAgX19OUl9jbG9uZSwgbmFtZXNwYWNlcyB8IENMT05FX1ZGT1JLIHwgU0lHQ0hMRCwgMCwgMCwgMCk7CiAgaWYgKHBpZCA9PSAtMSkgewogICAgUExPRyhGQVRBTCkgPDwgIkNvdWxkIG5vdCB1c2UgUElEIG5hbWVzcGFjaW5nIjsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYgKHBpZCkgewogICAgLy8gV2Ugd2FudCB0byB3YWl0IG9uIHRoZSBjaGlsZCBwaWQgdG8gZW5zdXJlIHRoYXQgcGlkLXRyYWNraW5nIGNvZGUKICAgIC8vIGlzbid0IGNvbXBsZXRlbHkgYnJva2VuLgogICAgaW50IHN0YXR1cyA9IDA7CiAgICB3YWl0cGlkKHBpZCwgJnN0YXR1cywgMCk7CiAgICAvLyBLaWxsIHRoZSBvcmlnaW5hbCBwcm9jZXNzIHdpdGhvdXQgYXRleGl0IGhhbmRsZXJzLgogICAgRExPRyhJTkZPKSA8PCAiamFpbGVkIHByb2Nlc3MgZGVhdGg6IiA8PCBwaWQ7CiAgICBpZiAoV0lGRVhJVEVEKHN0YXR1cykpIHsKICAgICAgX2V4aXQoV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiAgICB9CiAgICBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgewogICAgICBfZXhpdChXVEVSTVNJRyhzdGF0dXMpKTsKICAgIH0KICAgIERMT0coSU5GTykgPDwgInVua25vd24gdGVybWluYWwgY29uZGl0aW9uIGZvciBjaGlsZCI7CiAgICBfZXhpdCgxKTsKICB9CiAgRExPRyhJTkZPKSA8PCAiU3VjY2VzczogIiA8PCBnZXRwaWQoKTsKICByZXR1cm4gdHJ1ZTsKfQoKYm9vbCBFbnY6Ok1vdW50KCkgY29uc3QgewogIERMT0coSU5GTykgPDwgIlVubW91bnRpbmcgZXhpc3RpbmcgL3Byb2MiOwogIHVtb3VudCgiL3Byb2MiKTsKICBETE9HKElORk8pIDw8ICJBdHRlbXB0aW5nIHRvIG1vdW50IC9wcm9jIFJPLiI7CiAgaWYgKG1vdW50KCJwcm9jIiwKICAgICAgICAgICAgIi9wcm9jIiwKICAgICAgICAgICAgInByb2MiLAogICAgICAgICAgICBNU19OT0RFVnxNU19OT0VYRUN8TVNfTk9TVUlEfE1TX1JET05MWSwKICAgICAgICAgICAgIiIpKSB7CiAgICBQTE9HKEZBVEFMKSA8PCAiRmFpbGVkIHRvIG1vdW50IGEgbG9jYWwgL3Byb2MiOwogIH0KICBETE9HKElORk8pIDw8ICJTdWNjZXNzLiI7CiAgcmV0dXJuIHRydWU7Cn0KCmJvb2wgRW52OjpSdW4oY29uc3QgY2hhciAqcGF0aCwgY2hhciAqIGNvbnN0ICphcmd2LCBjaGFyICogY29uc3QgKmVudnApIGNvbnN0IHsKICAvLyBUT0RPKHdhZCkgbG9nLXBpZCBvcHRpb24KICBETE9HKElORk8pIDw8ICJFeGVjdXRpbmc6ICIgPDwgcGF0aCA8PCAiIHdpdGggYXJnczogIjsKICBmb3IgKGNoYXIgKiBjb25zdCogYXJnID0gYXJndjsgKmFyZzsgKythcmcpIHsKICAgIERMT0coSU5GTykgPDwgIi0+ICIgPDwgKmFyZzsKICB9CiAgZXhlY3ZlKHBhdGgsIGFyZ3YsIGVudnApOwogIFBMT0coRkFUQUwpIDw8ICJmYWlsZWQgdG8gZXhlY3V0ZSAiIDw8IHBhdGg7CiAgcmV0dXJuIGZhbHNlOwp9Cgp9ICAvLyBuYW1lc3BhY2UgbWluaWphaWwKfSAgLy8gbmFtZXNwYWNlIGNocm9tZW9zCg==