ZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTU0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsLnBtCkBAIC0wLDAgKzEsMzMyMyBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIC0gRXh0cmFjdCBpbmZvcm1hdGlvbiBmcm9tIGFuIEV4Y2VsIGZpbGUuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMDgsIFRha2Fub3JpIEthd2FpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIDUuMDA4OworCit1c2UgT0xFOjpTdG9yYWdlX0xpdGU7Cit1c2UgSU86OkZpbGU7Cit1c2UgQ29uZmlnOworCit1c2UgQ3J5cHQ6OlJDNDsKK3VzZSBEaWdlc3Q6OlBlcmw6Ok1ENTsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rOwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvbnQ7Cit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdDsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbDsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdDsKKworbXkgQGFDb2xvciA9ICgKKyAgICAnMDAwMDAwJywgICAgIyAweDAwCisgICAgJ0ZGRkZGRicsICdGRkZGRkYnLCAnRkZGRkZGJywgJ0ZGRkZGRicsCisgICAgJ0ZGRkZGRicsICdGRkZGRkYnLCAnRkZGRkZGJywgJ0ZGRkZGRicsICAgICMgMHgwOAorICAgICdGRkZGRkYnLCAnRkYwMDAwJywgJzAwRkYwMCcsICcwMDAwRkYnLAorICAgICdGRkZGMDAnLCAnRkYwMEZGJywgJzAwRkZGRicsICc4MDAwMDAnLCAgICAjIDB4MTAKKyAgICAnMDA4MDAwJywgJzAwMDA4MCcsICc4MDgwMDAnLCAnODAwMDgwJywKKyAgICAnMDA4MDgwJywgJ0MwQzBDMCcsICc4MDgwODAnLCAnOTk5OUZGJywgICAgIyAweDE4CisgICAgJzk5MzM2NicsICdGRkZGQ0MnLCAnQ0NGRkZGJywgJzY2MDA2NicsCisgICAgJ0ZGODA4MCcsICcwMDY2Q0MnLCAnQ0NDQ0ZGJywgJzAwMDA4MCcsICAgICMgMHgyMAorICAgICdGRjAwRkYnLCAnRkZGRjAwJywgJzAwRkZGRicsICc4MDAwODAnLAorICAgICc4MDAwMDAnLCAnMDA4MDgwJywgJzAwMDBGRicsICcwMENDRkYnLCAgICAjIDB4MjgKKyAgICAnQ0NGRkZGJywgJ0NDRkZDQycsICdGRkZGOTknLCAnOTlDQ0ZGJywKKyAgICAnRkY5OUNDJywgJ0NDOTlGRicsICdGRkNDOTknLCAnMzM2NkZGJywgICAgIyAweDMwCisgICAgJzMzQ0NDQycsICc5OUNDMDAnLCAnRkZDQzAwJywgJ0ZGOTkwMCcsCisgICAgJ0ZGNjYwMCcsICc2NjY2OTknLCAnOTY5Njk2JywgJzAwMzM2NicsICAgICMgMHgzOAorICAgICczMzk5NjYnLCAnMDAzMzAwJywgJzMzMzMwMCcsICc5OTMzMDAnLAorICAgICc5OTMzNjYnLCAnMzMzMzk5JywgJzMzMzMzMycsICdGRkZGRkYnICAgICAjIDB4NDAKKyk7Cit1c2UgY29uc3RhbnQgdmVyRXhjZWw5NSA9PiAweDUwMDsKK3VzZSBjb25zdGFudCB2ZXJFeGNlbDk3ID0+IDB4NjAwOwordXNlIGNvbnN0YW50IHZlckJJRkYyICAgPT4gMHgwMDsKK3VzZSBjb25zdGFudCB2ZXJCSUZGMyAgID0+IDB4MDI7Cit1c2UgY29uc3RhbnQgdmVyQklGRjQgICA9PiAweDA0OwordXNlIGNvbnN0YW50IHZlckJJRkY1ICAgPT4gMHgwODsKK3VzZSBjb25zdGFudCB2ZXJCSUZGOCAgID0+IDB4MTg7CisKK3VzZSBjb25zdGFudCBNU19CSUZGX0NSWVBUT19OT05FID0+IDA7Cit1c2UgY29uc3RhbnQgTVNfQklGRl9DUllQVE9fWE9SICA9PiAxOwordXNlIGNvbnN0YW50IE1TX0JJRkZfQ1JZUFRPX1JDNCAgPT4gMjsKKwordXNlIGNvbnN0YW50IHNpemVvZl9CSUZGXzhfRklMRVBBU1MgPT4gKCA2ICsgMyAqIDE2ICk7CisKK3VzZSBjb25zdGFudCBSRUtFWV9CTE9DSyA9PiAweDQwMDsKKworIyBFcnJvciBjb2RlIGZvciBzb21lIG9mIHRoZSBjb21tb24gcGFyc2luZyBlcnJvcnMuCit1c2UgY29uc3RhbnQgRXJyb3JOb25lICAgICAgICAgID0+IDA7Cit1c2UgY29uc3RhbnQgRXJyb3JOb0ZpbGUgICAgICAgID0+IDE7Cit1c2UgY29uc3RhbnQgRXJyb3JOb0V4Y2VsRGF0YSAgID0+IDI7Cit1c2UgY29uc3RhbnQgRXJyb3JGaWxlRW5jcnlwdGVkID0+IDM7CisKK291ciAlZXJyb3Jfc3RyaW5ncyA9ICgKKyAgICBFcnJvck5vbmUsICAgICAgICAgICcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAKKyAgICBFcnJvck5vRmlsZSwgICAgICAgICdGaWxlIG5vdCBmb3VuZCcsICAgICAgICAgICAgICAgICAjIDEKKyAgICBFcnJvck5vRXhjZWxEYXRhLCAgICdObyBFeGNlbCBkYXRhIGZvdW5kIGluIGZpbGUnLCAgICAjIDIKKyAgICBFcnJvckZpbGVFbmNyeXB0ZWQsICdGaWxlIGlzIGVuY3J5cHRlZCcsICAgICAgICAgICAgICAjIDMKKworKTsKKworCitvdXIgJVByb2NUYmwgPSAoCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5MQorICAgIDB4MTQgICA9PiBcJl9zdWJIZWFkZXIsICAgICAgICAgICAgIyBIZWFkZXIKKyAgICAweDE1ICAgPT4gXCZfc3ViRm9vdGVyLCAgICAgICAgICAgICMgRm9vdGVyCisgICAgMHgxOCAgID0+IFwmX3N1Yk5hbWUsICAgICAgICAgICAgICAjIE5BTUUoPykKKyAgICAweDFBICAgPT4gXCZfc3ViVlBhZ2VCcmVhaywgICAgICAgICMgVmVydGljYWwgUGFnZSBCcmVhaworICAgIDB4MUIgICA9PiBcJl9zdWJIUGFnZUJyZWFrLCAgICAgICAgIyBIb3Jpem9udGFsIFBhZ2UgQnJlYWsKKyAgICAweDIyICAgPT4gXCZfc3ViRmxnMTkwNCwgICAgICAgICAgICMgMTkwNCBGbGFnCisgICAgMHgyNiAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIExlZnQgTWFyZ2luCisgICAgMHgyNyAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIFJpZ2h0IE1hcmdpbgorICAgIDB4MjggICA9PiBcJl9zdWJNYXJnaW4sICAgICAgICAgICAgIyBUb3AgTWFyZ2luCisgICAgMHgyOSAgID0+IFwmX3N1Yk1hcmdpbiwgICAgICAgICAgICAjIEJvdHRvbSBNYXJnaW4KKyAgICAweDJBICAgPT4gXCZfc3ViUHJpbnRIZWFkZXJzLCAgICAgICMgUHJpbnQgSGVhZGVycworICAgIDB4MkIgICA9PiBcJl9zdWJQcmludEdyaWRsaW5lcywgICAgIyBQcmludCBHcmlkbGluZXMKKyAgICAweDNDICAgPT4gXCZfc3ViQ29udGludWUsICAgICAgICAgICMgQ29udGludWUKKyAgICAweDQzICAgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICMgWEYgZm9yIEV4Y2VsIDwgNC4KKyAgICAweDA0NDMgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICMgWEYgZm9yIEV4Y2VsID0gNC4KKworICAgICNEZXZlbHBlcnMnIEtpdCBQMjkyCisgICAgMHg1NSA9PiBcJl9zdWJEZWZDb2xXaWR0aCwgICAgICAgICAjIENvbnNpZGVyCisgICAgMHg1QyA9PiBcJl9zdWJXcml0ZUFjY2VzcywgICAgICAgICAjIFdSSVRFQUNDRVNTCisgICAgMHg3RCA9PiBcJl9zdWJDb2xJbmZvLCAgICAgICAgICAgICAjIENvbGluZm8KKyAgICAweDdFID0+IFwmX3N1YlJLLCAgICAgICAgICAgICAgICAgICMgUksKKyAgICAweDgxID0+IFwmX3N1YldTQk9PTCwgICAgICAgICAgICAgICMgV1NCT09MCisgICAgMHg4MyA9PiBcJl9zdWJIY2VudGVyLCAgICAgICAgICAgICAjIEhDRU5URVIKKyAgICAweDg0ID0+IFwmX3N1YlZjZW50ZXIsICAgICAgICAgICAgICMgVkNFTlRFUgorICAgIDB4ODUgPT4gXCZfc3ViQm91bmRTaGVldCwgICAgICAgICAgIyBCb3VuZFNoZWV0CisKKyAgICAweDkyID0+IFwmX3N1YlBhbGV0dGUsICAgICAgICAgICAgICMgUGFsZXR0ZSwgZmdwCisKKyAgICAweDk5ID0+IFwmX3N1YlN0YW5kYXJkV2lkdGgsICAgICAgICMgU3RhbmRhcmQgQ29sCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5MworICAgIDB4QTEgPT4gXCZfc3ViU0VUVVAsICAgICAgICAgICAgICAgIyBTRVRVUAorICAgIDB4QkQgPT4gXCZfc3ViTXVsUkssICAgICAgICAgICAgICAgIyBNVUxSSworICAgIDB4QkUgPT4gXCZfc3ViTXVsQmxhbmssICAgICAgICAgICAgIyBNVUxCTEFOSworICAgIDB4RDYgPT4gXCZfc3ViUlN0cmluZywgICAgICAgICAgICAgIyBSU3RyaW5nCisKKyAgICAjRGV2ZWxwZXJzJyBLaXQgUDI5NAorICAgIDB4RTAgPT4gXCZfc3ViWEYsICAgICAgICAgICAgICAgICAgIyBFeFRlbmRlZCBGb3JtYXQKKyAgICAweEU1ID0+IFwmX3N1Yk1lcmdlQXJlYSwgICAgICAgICAgICMgTWVyZ2VBcmVhIChOb3QgRG9jdW1lbnRlZCkKKyAgICAweEZDID0+IFwmX3N1YlNTVCwgICAgICAgICAgICAgICAgICMgU2hhcmVkIFN0cmluZyBUYWJsZQorICAgIDB4RkQgPT4gXCZfc3ViTGFiZWxTU1QsICAgICAgICAgICAgIyBMYWJlbCBTU1QKKworICAgICNEZXZlbHBlcnMnIEtpdCBQMjk1CisgICAgMHgyMDEgPT4gXCZfc3ViQmxhbmssICAgICAgICAgICAgICAjIEJsYW5rCisKKyAgICAweDIwMiA9PiBcJl9zdWJJbnRlZ2VyLCAgICAgICAgICAgICMgSW50ZWdlcihOb3QgRG9jdW1lbnRlZCkKKyAgICAweDIwMyA9PiBcJl9zdWJOdW1iZXIsICAgICAgICAgICAgICMgTnVtYmVyCisgICAgMHgyMDQgPT4gXCZfc3ViTGFiZWwsICAgICAgICAgICAgICAjIExhYmVsCisgICAgMHgyMDUgPT4gXCZfc3ViQm9vbEVyciwgICAgICAgICAgICAjIEJvb2xFcnIKKyAgICAweDIwNyA9PiBcJl9zdWJTdHJpbmcsICAgICAgICAgICAgICMgU1RSSU5HCisgICAgMHgyMDggPT4gXCZfc3ViUm93LCAgICAgICAgICAgICAgICAjIFJvd0RhdGEKKyAgICAweDIyMSA9PiBcJl9zdWJBcnJheSwgICAgICAgICAgICAgICMgQXJyYXkgKENvbnNpZGVyKQorICAgIDB4MjI1ID0+IFwmX3N1YkRlZmF1bHRSb3dIZWlnaHQsICAgIyBDb25zaWRlcgorCisgICAgMHgzMSAgPT4gXCZfc3ViRm9udCwgICAgICAgICAgICAgICAjIEZvbnQKKyAgICAweDIzMSA9PiBcJl9zdWJGb250LCAgICAgICAgICAgICAgICMgRm9udAorCisgICAgMHgyN0UgPT4gXCZfc3ViUkssICAgICAgICAgICAgICAgICAjIFJLCisgICAgMHg0MUUgPT4gXCZfc3ViRm9ybWF0LCAgICAgICAgICAgICAjIEZvcm1hdAorCisgICAgMHgwNiAgPT4gXCZfc3ViRm9ybXVsYSwgICAgICAgICAgICAjIEZvcm11bGEKKyAgICAweDQwNiA9PiBcJl9zdWJGb3JtdWxhLCAgICAgICAgICAgICMgRm9ybXVsYQorCisgICAgMHgwMDkgPT4gXCZfc3ViQk9GLCAgICAgICAgICAgICAgICAjIEJPRihCSUZGMikKKyAgICAweDIwOSA9PiBcJl9zdWJCT0YsICAgICAgICAgICAgICAgICMgQk9GKEJJRkYzKQorICAgIDB4NDA5ID0+IFwmX3N1YkJPRiwgICAgICAgICAgICAgICAgIyBCT0YoQklGRjQpCisgICAgMHg4MDkgPT4gXCZfc3ViQk9GLCAgICAgICAgICAgICAgICAjIEJPRihCSUZGNS04KQorKTsKKworb3VyICRCSUdFTkRJQU47CitvdXIgJFBSRUZVTkM7CitvdXIgJF9DZWxsSGFuZGxlcjsKK291ciAkX05vdFNldENlbGw7CitvdXIgJF9PYmplY3Q7CitvdXIgJF91c2VfcGVybGlvOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJGNsYXNzLCAlaFBhcmFtICkgPSBAXzsKKworICAgIGlmICggbm90IGRlZmluZWQgJF91c2VfcGVybGlvICkgeworICAgICAgICBpZiAoICAgZXhpc3RzICRDb25maWd7dXNlcGVybGlvfQorICAgICAgICAgICAgJiYgZGVmaW5lZCAkQ29uZmlne3VzZXBlcmxpb30KKyAgICAgICAgICAgICYmICRDb25maWd7dXNlcGVybGlvfSBlcSAiZGVmaW5lIiApCisgICAgICAgIHsKKyAgICAgICAgICAgICRfdXNlX3BlcmxpbyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkX3VzZV9wZXJsaW8gPSAwOworICAgICAgICAgICAgcmVxdWlyZSBJTzo6U2NhbGFyOworICAgICAgICAgICAgaW1wb3J0IElPOjpTY2FsYXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENoZWNrIEVORElBTihMaXR0bGU6IEludGVsIGV0Yy4gQklHOiBTcGFyYyBldGMpCisgICAgJEJJR0VORElBTiA9CisgICAgICAgICggZGVmaW5lZCAkaFBhcmFte0VuZGlhbn0gKSA/ICRoUGFyYW17RW5kaWFufQorICAgICAgOiAoIHVucGFjayggIkgwOCIsIHBhY2soICJMIiwgMiApICkgZXEgJzAyMDAwMDAwJyApID8gMAorICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAkc2VsZi0+e0dldENvbnRlbnR9ID0gXCZfc3ViR2V0Q29udGVudDsKKworICAgIGlmICggJGhQYXJhbXtFdmVudEhhbmRsZXJzfSApIHsKKyAgICAgICAgJHNlbGYtPlNldEV2ZW50SGFuZGxlcnMoICRoUGFyYW17RXZlbnRIYW5kbGVyc30gKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5TZXRFdmVudEhhbmRsZXJzKCBcJVByb2NUYmwgKTsKKyAgICB9CisgICAgaWYgKCAkaFBhcmFte0FkZEhhbmRsZXJzfSApIHsKKyAgICAgICAgZm9yZWFjaCBteSAkc0tleSAoIGtleXMoICV7ICRoUGFyYW17QWRkSGFuZGxlcnN9IH0gKSApIHsKKyAgICAgICAgICAgICRzZWxmLT5TZXRFdmVudEhhbmRsZXIoICRzS2V5LCAkaFBhcmFte0FkZEhhbmRsZXJzfS0+eyRzS2V5fSApOworICAgICAgICB9CisgICAgfQorICAgICRfQ2VsbEhhbmRsZXIgPSAkaFBhcmFte0NlbGxIYW5kbGVyfSBpZiAoICRoUGFyYW17Q2VsbEhhbmRsZXJ9ICk7CisgICAgJF9Ob3RTZXRDZWxsICA9ICRoUGFyYW17Tm90U2V0Q2VsbH07CisgICAgJF9PYmplY3QgICAgICA9ICRoUGFyYW17T2JqZWN0fTsKKworCisgICAgaWYgKCBkZWZpbmVkICRoUGFyYW17UGFzc3dvcmR9ICkgeworICAgICAgICAkc2VsZi0+e1Bhc3N3b3JkfSA9ICRoUGFyYW17UGFzc3dvcmR9OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntQYXNzd29yZH0gPSAnVmVsdmV0U3dlYXRzaG9wJzsKKyAgICB9CisKKyAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JOb25lOworICAgIHJldHVybiAkc2VsZjsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+U2V0RXZlbnRIYW5kbGVyCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgU2V0RXZlbnRIYW5kbGVyIHsKKyAgICBteSAoICRzZWxmLCAka2V5LCAkc3ViX3JlZiApID0gQF87CisgICAgJHNlbGYtPntGdW5jVGJsfS0+eyRrZXl9ID0gJHN1Yl9yZWY7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPlNldEV2ZW50SGFuZGxlcnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBTZXRFdmVudEhhbmRsZXJzIHsKKyAgICBteSAoICRzZWxmLCAkcmhUYmwgKSA9IEBfOworICAgICRzZWxmLT57RnVuY1RibH0gPSB1bmRlZjsKKyAgICBmb3JlYWNoIG15ICRzS2V5ICgga2V5cyAlJHJoVGJsICkgeworICAgICAgICAkc2VsZi0+e0Z1bmNUYmx9LT57JHNLZXl9ID0gJHJoVGJsLT57JHNLZXl9OworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWNyeXB0aW9uIHJvdXRpbmVzCisjIGJhc2VkIG9uIHNvdXJjZXMgb2YgZ251bWVyaWMgKG1zLWJpZmYuYyBtcy1leGNlbC1yZWFkLmMpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgbWQ1c3RhdGUgeworICAgIG15ICggJG1kNSApID0gQF87CisgICAgbXkgJHMgPSAnJzsKKyAgICBmb3IgKCBteSAkaSA9IDAgOyAkaSA8IDQgOyAkaSsrICkgeworICAgICAgICBteSAkdiA9ICRtZDUtPntfc3RhdGV9WyRpXTsKKyAgICAgICAgJHMgLj0gY2hyKCAkdiAmIDB4ZmYgKTsKKyAgICAgICAgJHMgLj0gY2hyKCAoICR2ID4+IDggKSAmIDB4ZmYgKTsKKyAgICAgICAgJHMgLj0gY2hyKCAoICR2ID4+IDE2ICkgJiAweGZmICk7CisgICAgICAgICRzIC49IGNociggKCAkdiA+PiAyNCApICYgMHhmZiApOworICAgIH0KKworICAgIHJldHVybiAkczsKK30KKworc3ViIE1ha2VLZXkgeworICAgIG15ICggJGJsb2NrLCAka2V5LCAkdmFsQ29udGV4dCApID0gQF87CisKKyAgICBteSAkcHdhcnJheSA9ICJcMCIgeCA2NDsKKworICAgIHN1YnN0ciggJHB3YXJyYXksIDAsIDUgKSA9IHN1YnN0ciggJHZhbENvbnRleHQsIDAsIDUgKTsKKworICAgIHN1YnN0ciggJHB3YXJyYXksIDUsIDEgKSA9IGNociggJGJsb2NrICYgMHhmZiApOworICAgIHN1YnN0ciggJHB3YXJyYXksIDYsIDEgKSA9IGNociggKCAkYmxvY2sgPj4gOCApICYgMHhmZiApOworICAgIHN1YnN0ciggJHB3YXJyYXksIDcsIDEgKSA9IGNociggKCAkYmxvY2sgPj4gMTYgKSAmIDB4ZmYgKTsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA4LCAxICkgPSBjaHIoICggJGJsb2NrID4+IDI0ICkgJiAweGZmICk7CisKKyAgICBzdWJzdHIoICRwd2FycmF5LCA5LCAgMSApID0gIlx4ODAiOworICAgIHN1YnN0ciggJHB3YXJyYXksIDU2LCAxICkgPSAiXHg0OCI7CisKKyAgICBteSAkbWQ1ID0gRGlnZXN0OjpQZXJsOjpNRDUtPm5ldygpOworICAgICRtZDUtPmFkZCggJHB3YXJyYXkgKTsKKworICAgIG15ICRzID0gbWQ1c3RhdGUoICRtZDUgKTsKKworICAgICR7JGtleX0gPSBDcnlwdDo6UkM0LT5uZXcoICRzICk7Cit9CisKK3N1YiBWZXJpZnlQYXNzd29yZCB7CisgICAgbXkgKCAkcGFzc3dvcmQsICRkb2NpZCwgJHNhbHRfZGF0YSwgJGhhc2hlZHNhbHRfZGF0YSwgJHZhbENvbnRleHQgKSA9IEBfOworCisgICAgbXkgJHB3YXJyYXkgPSAiXDAiIHggNjQ7CisgICAgbXkgJGk7CisgICAgbXkgJG1kNSA9IERpZ2VzdDo6UGVybDo6TUQ1LT5uZXcoKTsKKworICAgIGZvciAoICRpID0gMCA7ICRpIDwgbGVuZ3RoKCAkcGFzc3dvcmQgKSA7ICRpKysgKSB7CisgICAgICAgIG15ICRvID0gb3JkKCBzdWJzdHIoICRwYXNzd29yZCwgJGksIDEgKSApOworICAgICAgICBzdWJzdHIoICRwd2FycmF5LCAyICogJGksIDEgKSA9IGNociggJG8gJiAweGZmICk7CisgICAgICAgIHN1YnN0ciggJHB3YXJyYXksIDIgKiAkaSArIDEsIDEgKSA9IGNociggKCAkbyA+PiA4ICkgJiAweGZmICk7CisgICAgfQorICAgIHN1YnN0ciggJHB3YXJyYXksIDIgKiAkaSwgMSApID0gY2hyKCAweDgwICk7CisgICAgc3Vic3RyKCAkcHdhcnJheSwgNTYsIDEgKSA9IGNociggKCAkaSA8PCA0ICkgJiAweGZmICk7CisKKyAgICAkbWQ1LT5hZGQoICRwd2FycmF5ICk7CisKKyAgICBteSAkbWRDb250ZXh0MSA9IG1kNXN0YXRlKCAkbWQ1ICk7CisKKyAgICBteSAkb2Zmc2V0ICAgID0gMDsKKyAgICBteSAka2V5b2Zmc2V0ID0gMDsKKyAgICBteSAkdG9jb3B5ICAgID0gNTsKKworICAgICRtZDUtPnJlc2V0OworCisgICAgd2hpbGUgKCAkb2Zmc2V0ICE9IDE2ICkgeworICAgICAgICBpZiAoICggNjQgLSAkb2Zmc2V0ICkgPCA1ICkgeworICAgICAgICAgICAgJHRvY29weSA9IDY0IC0gJG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIHN1YnN0ciggJHB3YXJyYXksICRvZmZzZXQsICR0b2NvcHkgKSA9CisgICAgICAgICAgc3Vic3RyKCAkbWRDb250ZXh0MSwgJGtleW9mZnNldCwgJHRvY29weSApOworCisgICAgICAgICRvZmZzZXQgKz0gJHRvY29weTsKKworICAgICAgICBpZiAoICRvZmZzZXQgPT0gNjQgKSB7CisgICAgICAgICAgICAkbWQ1LT5hZGQoICRwd2FycmF5ICk7CisgICAgICAgICAgICAka2V5b2Zmc2V0ID0gJHRvY29weTsKKyAgICAgICAgICAgICR0b2NvcHkgICAgPSA1IC0gJHRvY29weTsKKyAgICAgICAgICAgICRvZmZzZXQgICAgPSAwOworICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgICRrZXlvZmZzZXQgPSAwOworICAgICAgICAkdG9jb3B5ICAgID0gNTsKKyAgICAgICAgc3Vic3RyKCAkcHdhcnJheSwgJG9mZnNldCwgMTYgKSA9ICRkb2NpZDsKKyAgICAgICAgJG9mZnNldCArPSAxNjsKKyAgICB9CisKKyAgICBzdWJzdHIoICRwd2FycmF5LCAxNiwgMSApICA9ICJceDgwIjsKKyAgICBzdWJzdHIoICRwd2FycmF5LCAxNywgNDcgKSA9ICJcMCIgeCA0NzsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA1NiwgMSApICA9ICJceDgwIjsKKyAgICBzdWJzdHIoICRwd2FycmF5LCA1NywgMSApICA9ICJceDBhIjsKKworICAgICRtZDUtPmFkZCggJHB3YXJyYXkgKTsKKyAgICAkeyR2YWxDb250ZXh0fSA9IG1kNXN0YXRlKCAkbWQ1ICk7CisKKyAgICBteSAka2V5OworCisgICAgTWFrZUtleSggMCwgXCRrZXksICR7JHZhbENvbnRleHR9ICk7CisKKyAgICBteSAkc2FsdCAgICAgICA9ICRrZXktPlJDNCggJHNhbHRfZGF0YSApOworICAgIG15ICRoYXNoZWRzYWx0ID0gJGtleS0+UkM0KCAkaGFzaGVkc2FsdF9kYXRhICk7CisKKyAgICAkc2FsdCAuPSAiXHg4MCIgLiAiXDAiIHggNDc7CisKKyAgICBzdWJzdHIoICRzYWx0LCA1NiwgMSApID0gIlx4ODAiOworCisgICAgJG1kNS0+cmVzZXQ7CisgICAgJG1kNS0+YWRkKCAkc2FsdCApOworICAgIG15ICRtZENvbnRleHQyID0gbWQ1c3RhdGUoICRtZDUgKTsKKworICAgIHJldHVybiAoICRtZENvbnRleHQyIGVxICRoYXNoZWRzYWx0ICk7Cit9CisKK3N1YiBTa2lwQnl0ZXMgeworICAgIG15ICggJHEsICRzdGFydCwgJGNvdW50ICkgPSBAXzsKKworICAgIG15ICRzY3JhdGNoID0gIlwwIiB4IFJFS0VZX0JMT0NLOworICAgIG15ICRibG9jazsKKworICAgICRibG9jayA9IGludCggKCAkc3RhcnQgKyAkY291bnQgKSAvIFJFS0VZX0JMT0NLICk7CisKKyAgICBpZiAoICRibG9jayAhPSAkcS0+e2Jsb2NrfSApIHsKKyAgICAgICAgTWFrZUtleSggJHEtPntibG9ja30gPSAkYmxvY2ssIFwkcS0+e3JjNF9rZXl9LCAkcS0+e21kNV9jdHh0fSApOworICAgICAgICAkY291bnQgPSAoICRzdGFydCArICRjb3VudCApICUgUkVLRVlfQkxPQ0s7CisgICAgfQorCisgICAgJHEtPntyYzRfa2V5fS0+UkM0KCBzdWJzdHIoICRzY3JhdGNoLCAwLCAkY291bnQgKSApOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N1YiBTZXREZWNyeXB0IHsKKyAgICBteSAoICRxLCAkdmVyc2lvbiwgJHBhc3N3b3JkICkgPSBAXzsKKworICAgIGlmICggJHEtPntvcGNvZGV9ICE9IDB4MmYgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICggJHBhc3N3b3JkIGVxICcnICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAjIFRPRE8gb2xkIHZlcnNpb25zIGRlY3J5cHRpb24KKyAgICAjaWYgKHZlcnNpb24gPCBNU19CSUZGX1Y4IHx8IHEtPmRhdGFbMF0gPT0gMCkKKyAgICAjICAgIHJldHVybiBtc19iaWZmX3ByZV9iaWZmOF9xdWVyeV9zZXRfZGVjcnlwdCAocSwgcGFzc3dvcmQpOworCisgICAgaWYgKCAkcS0+e2xlbmd0aH0gIT0gc2l6ZW9mX0JJRkZfOF9GSUxFUEFTUyApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5sZXNzICgKKyAgICAgICAgVmVyaWZ5UGFzc3dvcmQoCisgICAgICAgICAgICAkcGFzc3dvcmQsCisgICAgICAgICAgICBzdWJzdHIoICRxLT57ZGF0YX0sIDYsICAxNiApLAorICAgICAgICAgICAgc3Vic3RyKCAkcS0+e2RhdGF9LCAyMiwgMTYgKSwKKyAgICAgICAgICAgIHN1YnN0ciggJHEtPntkYXRhfSwgMzgsIDE2ICksCisgICAgICAgICAgICBcJHEtPnttZDVfY3R4dH0KKyAgICAgICAgKQorICAgICAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgJHEtPntlbmNyeXB0aW9ufSA9IE1TX0JJRkZfQ1JZUFRPX1JDNDsKKyAgICAkcS0+e2Jsb2NrfSAgICAgID0gLTE7CisKKyAgICAjIFRoZSBmaXJzdCByZWNvcmQgYWZ0ZXIgRklMRVBBU1Mgc2VlbXMgdG8gYmUgdW5lbmNyeXB0ZWQKKyAgICAkcS0+e2RvbnRfZGVjcnlwdF9uZXh0X3JlY29yZH0gPSAxOworCisgICAgIyBQcmV0ZW5kIHRvIGRlY3J5cHQgdGhlIGVudGlyZSBzdHJlYW0gdXAgdGlsbCB0aGlzIHBvaW50LCBpdCB3YXMKKyAgICAjIGVuY3J5cHRlZCwgYnV0IGRvIGl0IGFueXdheSB0byBrZWVwIHRoZSByYzQgc3RhdGUgaW4gc3luYworCisgICAgU2tpcEJ5dGVzKCAkcSwgMCwgJHEtPntzdHJlYW1Qb3N9ICk7CisKKyAgICByZXR1cm4gMTsKK30KKworc3ViIEluaXRTdHJlYW0geworICAgIG15ICggJHN0cmVhbV9kYXRhICkgPSBAXzsKKyAgICBteSAlcTsKKworICAgICRxe29wY29kZX0gPSAwOworICAgICRxe2xlbmd0aH0gPSAwOworICAgICRxe2RhdGF9ICAgPSAnJzsKKworICAgICRxe3N0cmVhbX0gICAgPSAkc3RyZWFtX2RhdGE7ICAgICAgICAgICAgICAjIGRhdGEgc3RyZWFtCisgICAgJHF7c3RyZWFtTGVufSA9IGxlbmd0aCggJHN0cmVhbV9kYXRhICk7ICAgICMgc3RyZWFtIGxlbmd0aAorICAgICRxe3N0cmVhbVBvc30gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0cmVhbSBwb3NpdGlvbgorCisgICAgJHF7ZW5jcnlwdGlvbn0gICAgICAgICAgICAgICA9IDA7CisgICAgJHF7eG9yX2tleX0gICAgICAgICAgICAgICAgICA9ICcnOworICAgICRxe3JjNF9rZXl9ICAgICAgICAgICAgICAgICAgPSAnJzsKKyAgICAkcXttZDVfY3R4dH0gICAgICAgICAgICAgICAgID0gJyc7CisgICAgJHF7YmxvY2t9ICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgJHF7ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDA7CisKKyAgICByZXR1cm4gXCVxOworfQorCitzdWIgUXVlcnlOZXh0IHsKKyAgICBteSAoICRxICkgPSBAXzsKKworICAgIGlmICggJHEtPntzdHJlYW1Qb3N9ICsgNCA+PSAkcS0+e3N0cmVhbUxlbn0gKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG15ICRkYXRhID0gc3Vic3RyKCAkcS0+e3N0cmVhbX0sICRxLT57c3RyZWFtUG9zfSwgNCApOworCisgICAgKCAkcS0+e29wY29kZX0sICRxLT57bGVuZ3RofSApID0gdW5wYWNrKCAndjInLCAkZGF0YSApOworCisgICAgIyBObyBiaWZmIHJlY29yZCBzaG91bGQgYmUgbGFyZ2VyIHRoYW4gYXJvdW5kIDIwLDAwMC4KKyAgICBpZiAoICRxLT57bGVuZ3RofSA+PSAyMDAwMCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCAkcS0+e2xlbmd0aH0gPiAwICkgeworICAgICAgICAkcS0+e2RhdGF9ID0gc3Vic3RyKCAkcS0+e3N0cmVhbX0sICRxLT57c3RyZWFtUG9zfSArIDQsICRxLT57bGVuZ3RofSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHEtPntkYXRhfSAgICAgICAgICAgICAgICAgICAgID0gdW5kZWY7CisgICAgICAgICRxLT57ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDE7CisgICAgfQorCisgICAgaWYgKCAkcS0+e2VuY3J5cHRpb259ID09IE1TX0JJRkZfQ1JZUFRPX1JDNCApIHsKKyAgICAgICAgaWYgKCAkcS0+e2RvbnRfZGVjcnlwdF9uZXh0X3JlY29yZH0gKSB7CisgICAgICAgICAgICBTa2lwQnl0ZXMoICRxLCAkcS0+e3N0cmVhbVBvc30sIDQgKyAkcS0+e2xlbmd0aH0gKTsKKyAgICAgICAgICAgICRxLT57ZG9udF9kZWNyeXB0X25leHRfcmVjb3JkfSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkcG9zICA9ICRxLT57c3RyZWFtUG9zfTsKKyAgICAgICAgICAgIG15ICRkYXRhID0gJHEtPntkYXRhfTsKKyAgICAgICAgICAgIG15ICRsZW4gID0gJHEtPntsZW5ndGh9OworICAgICAgICAgICAgbXkgJHJlcyAgPSAnJzsKKworICAgICAgICAgICAgIyBQcmV0ZW5kIHRvIGRlY3J5cHQgaGVhZGVyLgorICAgICAgICAgICAgU2tpcEJ5dGVzKCAkcSwgJHBvcywgNCApOworICAgICAgICAgICAgJHBvcyArPSA0OworCisgICAgICAgICAgICB3aGlsZSAoICRxLT57YmxvY2t9ICE9IGludCggKCAkcG9zICsgJGxlbiApIC8gUkVLRVlfQkxPQ0sgKSApIHsKKyAgICAgICAgICAgICAgICBteSAkc3RlcCA9IFJFS0VZX0JMT0NLIC0gKCAkcG9zICUgUkVLRVlfQkxPQ0sgKTsKKyAgICAgICAgICAgICAgICAkcmVzIC49ICRxLT57cmM0X2tleX0tPlJDNCggc3Vic3RyKCAkZGF0YSwgMCwgJHN0ZXAgKSApOworICAgICAgICAgICAgICAgICRkYXRhID0gc3Vic3RyKCAkZGF0YSwgJHN0ZXAgKTsKKyAgICAgICAgICAgICAgICAkcG9zICs9ICRzdGVwOworICAgICAgICAgICAgICAgICRsZW4gLT0gJHN0ZXA7CisgICAgICAgICAgICAgICAgTWFrZUtleSggKyskcS0+e2Jsb2NrfSwgXCRxLT57cmM0X2tleX0sICRxLT57bWQ1X2N0eHR9ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRyZXMgLj0gJHEtPntyYzRfa2V5fS0+UkM0KCBzdWJzdHIoICRkYXRhLCAwLCAkbGVuICkgKTsKKyAgICAgICAgICAgICRxLT57ZGF0YX0gPSAkcmVzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2lmICggJHEtPntlbmNyeXB0aW9ufSA9PSBNU19CSUZGX0NSWVBUT19YT1IgKSB7CisKKyAgICAgICAgIyBub3QgaW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2lmICggJHEtPntlbmNyeXB0aW9ufSA9PSBNU19CSUZGX0NSWVBUT19OT05FICkgeworCisgICAgfQorCisgICAgJHEtPntzdHJlYW1Qb3N9ICs9IDQgKyAkcS0+e2xlbmd0aH07CisKKyAgICByZXR1cm4gMTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQYXJzZSgpCisjCisjIFBhcnNlIHRoZSBFeGNlbCBmaWxlIGFuZCBjb252ZXJ0IGl0IGludG8gYSB0cmVlIG9mIG9iamVjdHMuLgorIworc3ViIHBhcnNlIHsKKworICAgIG15ICggJHNlbGYsICRzb3VyY2UsICRmb3JtYXR0ZXIgKSA9IEBfOworCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rLT5uZXcoKTsKKyAgICAkd29ya2Jvb2stPntTaGVldENvdW50fSA9IDA7CisKKyAgICBteSAoICRiaWZmX2RhdGEsICRkYXRhX2xlbmd0aCApID0gJHNlbGYtPl9nZXRfY29udGVudCggJHNvdXJjZSwgJHdvcmtib29rICk7CisgICAgcmV0dXJuIHVuZGVmIGlmIG5vdCAkYmlmZl9kYXRhOworCisgICAgaWYgKCAkZm9ybWF0dGVyICkgeworICAgICAgICAkd29ya2Jvb2stPntGbXRDbGFzc30gPSAkZm9ybWF0dGVyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHdvcmtib29rLT57Rm10Q2xhc3N9ID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQtPm5ldygpOworICAgIH0KKworICAgICMgUGFyc2UgdGhlIEJJRkYgZGF0YS4KKyAgICBteSAkc3RyZWFtID0gSW5pdFN0cmVhbSggJGJpZmZfZGF0YSApOworCisgICAgd2hpbGUgKCBRdWVyeU5leHQoICRzdHJlYW0gKSApIHsKKworICAgICAgICBteSAkcmVjb3JkICAgICAgICA9ICRzdHJlYW0tPntvcGNvZGV9OworICAgICAgICBteSAkcmVjb3JkX2xlbmd0aCA9ICRzdHJlYW0tPntsZW5ndGh9OworCisgICAgICAgIG15ICRyZWNvcmRfaGVhZGVyID0gJHN0cmVhbS0+e2RhdGF9OworCisgICAgICAgICMgSWYgdGhlIGZpbGUgY29udGFpbnMgYSBGSUxFUEFTUyByZWNvcmQgd2UgYXNzdW1lIHRoYXQgaXQgaXMgZW5jcnlwdGVkCisgICAgICAgICMgYW5kIGNhbm5vdCBiZSBwYXJzZWQuCisgICAgICAgIGlmICggJHJlY29yZCA9PSAweDAwMkYgKSB7CisgICAgICAgICAgICB1bmxlc3MgKCBTZXREZWNyeXB0KCAkc3RyZWFtLCAnJywgJHNlbGYtPntQYXNzd29yZH0gKSApIHsKKyAgICAgICAgICAgICAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JGaWxlRW5jcnlwdGVkOworICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICMgU3BlY2lhbCBjYXNlIG9mIGEgZm9ybXVsYSBTdHJpbmcgd2l0aCBubyBzdHJpbmcuCisgICAgICAgIGlmICggICAkd29ya2Jvb2stPntfUHJldlBvc30KKyAgICAgICAgICAgICYmICggZGVmaW5lZCAkc2VsZi0+e0Z1bmNUYmx9LT57JHJlY29yZH0gKQorICAgICAgICAgICAgJiYgKCAkcmVjb3JkICE9IDB4MjA3ICkgKQorICAgICAgICB7CisgICAgICAgICAgICBteSAkaVBvcyA9ICR3b3JrYm9vay0+e19QcmV2UG9zfTsKKyAgICAgICAgICAgICR3b3JrYm9vay0+e19QcmV2UG9zfSA9IHVuZGVmOworCisgICAgICAgICAgICBteSAoICRyb3csICRjb2wsICRmb3JtYXRfaW5kZXggKSA9IEAkaVBvczsKKyAgICAgICAgICAgIF9OZXdDZWxsKAorICAgICAgICAgICAgICAgICR3b3JrYm9vaywgJHJvdywgJGNvbCwKKyAgICAgICAgICAgICAgICBLaW5kICAgICA9PiAnRm9ybXVsYSBTdHJpbmcnLAorICAgICAgICAgICAgICAgIFZhbCAgICAgID0+ICcnLAorICAgICAgICAgICAgICAgIEZvcm1hdE5vID0+ICRmb3JtYXRfaW5kZXgsCisgICAgICAgICAgICAgICAgRm9ybWF0ICAgPT4gJHdvcmtib29rLT57Rm9ybWF0fVskZm9ybWF0X2luZGV4XSwKKyAgICAgICAgICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICAgICAgICAgIENvZGUgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgIEJvb2sgICAgID0+ICR3b3JrYm9vaywKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAjIElmIHRoZSBCSUZGIHJlY29yZCBtYXRjaGVzIDB4MCowOSB0aGVuIGl0IGlzIGEgQk9GIHJlY29yZC4KKyAgICAgICAgIyBXZSByZXNldCB0aGUgX3NraXBfY2hhcnQgZmxhZyB0byBlbnN1cmUgd2UgY2hlY2sgdGhlIHNoZWV0IHR5cGUuCisgICAgICAgIGlmICggKCAkcmVjb3JkICYgMHhGMEZGICkgPT0gMHgwOSApIHsKKyAgICAgICAgICAgICR3b3JrYm9vay0+e19za2lwX2NoYXJ0fSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntGdW5jVGJsfS0+eyRyZWNvcmR9ICYmICEkd29ya2Jvb2stPntfc2tpcF9jaGFydH0gKQorICAgICAgICB7CisgICAgICAgICAgICAkc2VsZi0+e0Z1bmNUYmx9LT57JHJlY29yZH0KKyAgICAgICAgICAgICAgLT4oICR3b3JrYm9vaywgJHJlY29yZCwgJHJlY29yZF9sZW5ndGgsICRyZWNvcmRfaGVhZGVyICk7CisgICAgICAgIH0KKworICAgICAgICAkUFJFRlVOQyA9ICRyZWNvcmQgaWYgKCAkcmVjb3JkICE9IDB4M0MgKTsgICAgI05vdCBDb250aW51ZQorCisgICAgICAgIHJldHVybiAkd29ya2Jvb2sgaWYgZGVmaW5lZCAkd29ya2Jvb2stPntfUGFyc2VBYm9ydH07CisgICAgfQorCisgICAgcmV0dXJuICR3b3JrYm9vazsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X2NvbnRlbnQoKQorIworIyBHZXQgdGhlIEV4Y2VsIEJJRkYgY29udGVudCBmcm9tIHRoZSBmaWxlIG9yIGZpbGVoYW5kbGUuCisjCitzdWIgX2dldF9jb250ZW50IHsKKworICAgIG15ICggJHNlbGYsICRzb3VyY2UsICR3b3JrYm9vayApID0gQF87CisgICAgbXkgKCAkYmlmZl9kYXRhLCAkZGF0YV9sZW5ndGggKTsKKworICAgICMgUmVzZXQgdGhlIGVycm9yIHN0YXR1cyBpbiBjYXNlIG1ldGhvZCBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuCisgICAgJHNlbGYtPntfZXJyb3Jfc3RhdHVzfSA9IEVycm9yTm9uZTsKKworICAgIGlmICggcmVmKCAkc291cmNlICkgZXEgIlNDQUxBUiIgKSB7CisKKyAgICAgICAgIyBTcGVjaWZpZWQgYnkgYSBzY2FsYXIgYnVmZmVyLgorICAgICAgICAoICRiaWZmX2RhdGEsICRkYXRhX2xlbmd0aCApID0gJHNlbGYtPntHZXRDb250ZW50fS0+KCAkc291cmNlICk7CisKKyAgICB9CisgICAgZWxzaWYgKCAoIHJlZiggJHNvdXJjZSApID1+IC9HTE9CLyApIHx8ICggcmVmKCAkc291cmNlICkgZXEgJ0ZoJyApICkgeworCisgICAgICAgICMgRm9yIENHSS5wbSAoTGlnaHQgRmlsZUhhbmRsZSkKKyAgICAgICAgYmlubW9kZSggJHNvdXJjZSApOworICAgICAgICBteSAkc1drOworICAgICAgICBteSAkc0J1ZmYgPSAnJzsKKworICAgICAgICB3aGlsZSAoIHJlYWQoICRzb3VyY2UsICRzV2ssIDQwOTYgKSApIHsKKyAgICAgICAgICAgICRzQnVmZiAuPSAkc1drOworICAgICAgICB9CisKKyAgICAgICAgKCAkYmlmZl9kYXRhLCAkZGF0YV9sZW5ndGggKSA9ICRzZWxmLT57R2V0Q29udGVudH0tPiggXCRzQnVmZiApOworCisgICAgfQorICAgIGVsc2lmICggcmVmKCAkc291cmNlICkgZXEgJ0FSUkFZJyApIHsKKworICAgICAgICAjIFNwZWNpZmllZCBieSBmaWxlIGNvbnRlbnQKKyAgICAgICAgJHdvcmtib29rLT57RmlsZX0gPSB1bmRlZjsKKyAgICAgICAgbXkgJHNEYXRhID0gam9pbiggJycsIEAkc291cmNlICk7CisgICAgICAgICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICkgPSAkc2VsZi0+e0dldENvbnRlbnR9LT4oIFwkc0RhdGEgKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBTcGVjaWZpZWQgYnkgZmlsZW5hbWUgLgorICAgICAgICAkd29ya2Jvb2stPntGaWxlfSA9ICRzb3VyY2U7CisKKyAgICAgICAgaWYgKCAhLWUgJHNvdXJjZSApIHsKKyAgICAgICAgICAgICRzZWxmLT57X2Vycm9yX3N0YXR1c30gPSBFcnJvck5vRmlsZTsKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorCisgICAgICAgICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICkgPSAkc2VsZi0+e0dldENvbnRlbnR9LT4oICRzb3VyY2UgKTsKKyAgICB9CisKKyAgICAjIElmIHRoZSByZWFkIHdhcyBzdWNjZXNzZnVsIHJldHVybiB0aGUgZGF0YS4KKyAgICBpZiAoICRkYXRhX2xlbmd0aCApIHsKKyAgICAgICAgcmV0dXJuICggJGJpZmZfZGF0YSwgJGRhdGFfbGVuZ3RoICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19lcnJvcl9zdGF0dXN9ID0gRXJyb3JOb0V4Y2VsRGF0YTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJHZXRDb250ZW50IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkdldENvbnRlbnQgeworICAgIG15ICggJHNGaWxlICkgPSBAXzsKKworICAgIG15ICRvT2wgPSBPTEU6OlN0b3JhZ2VfTGl0ZS0+bmV3KCAkc0ZpbGUgKTsKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSB1bmxlc3MgKCAkb09sICk7CisgICAgbXkgQGFSZXMgPSAkb09sLT5nZXRQcHNTZWFyY2goCisgICAgICAgIFsKKyAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpBc2MyVWNzKCAnQm9vaycgKSwKKyAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlOjpBc2MyVWNzKCAnV29ya2Jvb2snICkKKyAgICAgICAgXSwKKyAgICAgICAgMSwgMQorICAgICk7CisgICAgcmV0dXJuICggdW5kZWYsIHVuZGVmICkgaWYgKCAkI2FSZXMgPCAwICk7CisKKyAgICAjSGFjayBmcm9tIEhlcmJlcnQKKyAgICBpZiAoICRhUmVzWzBdLT57RGF0YX0gKSB7CisgICAgICAgIHJldHVybiAoICRhUmVzWzBdLT57RGF0YX0sIGxlbmd0aCggJGFSZXNbMF0tPntEYXRhfSApICk7CisgICAgfQorCisgICAgI1NhbWUgYXMgT0xFOjpTdG9yYWdlX0xpdGUKKyAgICBteSAkb0lvOworCisgICAgIzEuICRzRmlsZSBpcyBSZWYgb2Ygc2NhbGFyCisgICAgaWYgKCByZWYoICRzRmlsZSApIGVxICdTQ0FMQVInICkgeworICAgICAgICBpZiAoICRfdXNlX3BlcmxpbyApIHsKKyAgICAgICAgICAgIG9wZW4gJG9JbywgIjwiLCBcJHNGaWxlOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJG9JbyA9IElPOjpTY2FsYXItPm5ldzsKKyAgICAgICAgICAgICRvSW8tPm9wZW4oICRzRmlsZSApOworICAgICAgICB9CisgICAgfQorCisgICAgIzIuICRzRmlsZSBpcyBhIElPOjpIYW5kbGUgb2JqZWN0CisgICAgZWxzaWYgKCBVTklWRVJTQUw6OmlzYSggJHNGaWxlLCAnSU86OkhhbmRsZScgKSApIHsKKyAgICAgICAgJG9JbyA9ICRzRmlsZTsKKyAgICAgICAgYmlubW9kZSggJG9JbyApOworICAgIH0KKworICAgICMzLiAkc0ZpbGUgaXMgYSBzaW1wbGUgZmlsZW5hbWUgc3RyaW5nCisgICAgZWxzaWYgKCAhcmVmKCAkc0ZpbGUgKSApIHsKKyAgICAgICAgJG9JbyA9IElPOjpGaWxlLT5uZXc7CisgICAgICAgICRvSW8tPm9wZW4oICI8JHNGaWxlIiApIHx8IHJldHVybiB1bmRlZjsKKyAgICAgICAgYmlubW9kZSggJG9JbyApOworICAgIH0KKyAgICBteSAkc1drOworICAgIG15ICRzQnVmZiA9ICcnOworCisgICAgd2hpbGUgKCAkb0lvLT5yZWFkKCAkc1drLCA0MDk2ICkgKSB7ICAgICM0XzA5NiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5ncworICAgICAgICAkc0J1ZmYgLj0gJHNXazsKKyAgICB9CisgICAgJG9Jby0+Y2xvc2UoKTsKKworICAgICNOb3QgRXhjZWwgZmlsZSAoc2ltcGxlIG1ldGhvZCkKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSBpZiAoIHN1YnN0ciggJHNCdWZmLCAwLCAxICkgbmUgIlx4MDkiICk7CisgICAgcmV0dXJuICggJHNCdWZmLCBsZW5ndGgoICRzQnVmZiApICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkJPRiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBEZXZlbG9wZXJzJyBLaXQgOiBQMzAzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJPRiB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoICRpVmVyLCAkaUR0ICkgPSB1bnBhY2soICJ2MiIsICRzV2sgKTsKKworICAgICNXb3JrYm9vayBHbG9iYWwKKyAgICBpZiAoICRpRHQgPT0gMHgwMDA1ICkgeworICAgICAgICAkb0Jvb2stPntWZXJzaW9ufSA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgICAgICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9CisgICAgICAgICAgKCAkb0Jvb2stPntWZXJzaW9ufSA9PSB2ZXJFeGNlbDk1ICkgPyB2ZXJCSUZGNSA6IHZlckJJRkY4OworICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXR9ICA9IHVuZGVmOworICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXRffSA9IC0xOworICAgIH0KKworICAgICNXb3Jrc2hlZXQgb3IgRGlhbG9nc2hlZXQKKyAgICBlbHNpZiAoICRpRHQgIT0gMHgwMDIwICkgeyAgICAjaWYoJGlEdCA9PSAweDAwMTApCisgICAgICAgIGlmICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXRffSApIHsKKyAgICAgICAgICAgICRvQm9vay0+e19DdXJTaGVldH0gPSAkb0Jvb2stPntfQ3VyU2hlZXRffSArIDE7CisgICAgICAgICAgICAkb0Jvb2stPntfQ3VyU2hlZXRffSsrOworCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57U2hlZXRWZXJzaW9ufSwKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntTaGVldFR5cGV9LAorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgID0gdW5wYWNrKCAidjIiLCAkc1drICkKKyAgICAgICAgICAgICAgaWYgKCBsZW5ndGgoICRzV2sgKSA+IDQgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9IGludCggJGJPcCAvIDB4MTAwICk7CisgICAgICAgICAgICBpZiAoICAgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjIgKQorICAgICAgICAgICAgICAgIHx8ICggJG9Cb29rLT57QklGRlZlcnNpb259ID09IHZlckJJRkYzICkKKyAgICAgICAgICAgICAgICB8fCAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGNCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntWZXJzaW9ufSAgID0gJG9Cb29rLT57QklGRlZlcnNpb259OworICAgICAgICAgICAgICAgICRvQm9vay0+e19DdXJTaGVldH0gPSAwOworICAgICAgICAgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e1NoZWV0Q291bnR9IF0gPQorICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC0+bmV3KAorICAgICAgICAgICAgICAgICAgICBfTmFtZSAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJycsCisgICAgICAgICAgICAgICAgICAgIF9Cb29rICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgICAgICAgICAgX1NoZWV0Tm8gPT4gJG9Cb29rLT57U2hlZXRDb3VudH0sCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBTZXQgZmxhZyB0byBpZ25vcmUgYWxsIGNoYXJ0IHJlY29yZHMgdW50aWwgd2UgcmVhY2ggYW5vdGhlciBCT0YuCisgICAgICAgICRvQm9vay0+e19za2lwX2NoYXJ0fSA9IDE7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCbGFuayAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQMzAzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJsYW5rIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiApID0gdW5wYWNrKCAidjMiLCAkc1drICk7CisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdCTEFOSycsCisgICAgICAgIFZhbCAgICAgID0+ICcnLAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICApOworCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkludGVnZXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgTm90IGluIERLCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkludGVnZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGLCAkc1R4dCwgJHNEdW0gKTsKKworICAgICggJGlSLCAkaUMsICRpRiwgJHNEdW0sICRzVHh0ICkgPSB1bnBhY2soICJ2M2N2IiwgJHNXayApOworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnSU5URUdFUicsCisgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICApOworCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk51bWJlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgOiBESzogUDM1NAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJOdW1iZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICBteSAoICRpUiwgJGlDLCAkaUYgKSA9IHVucGFjayggInYzIiwgJHNXayApOworICAgIG15ICRkVmFsID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDYsIDggKSApOworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnTnVtYmVyJywKKyAgICAgICAgVmFsICAgICAgPT4gJGRWYWwsCisgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgRm9ybWF0ICAgPT4gJG9Cb29rLT57Rm9ybWF0fVskaUZdLAorICAgICAgICBOdW1lcmljICA9PiAxLAorICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfY29udkR2YWwgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfY29udkR2YWwgeworICAgIG15ICggJHNXayApID0gQF87CisgICAgcmV0dXJuCisgICAgICB1bnBhY2soICJkIiwKKyAgICAgICAgKCAkQklHRU5ESUFOICkgPyBwYWNrKCAiYzgiLCByZXZlcnNlKCB1bnBhY2soICJjOCIsICRzV2sgKSApICkgOiAkc1drICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlJTdHJpbmcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDQwNQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJSU3RyaW5nIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiwgJGlMLCAkc1R4dCApOworICAgICggJGlSLCAkaUMsICRpRiwgJGlMICkgPSB1bnBhY2soICJ2NCIsICRzV2sgKTsKKyAgICAkc1R4dCA9IHN1YnN0ciggJHNXaywgOCwgJGlMICk7CisKKyAgICAjSGFzIFNUUlVOCisgICAgaWYgKCBsZW5ndGgoICRzV2sgKSA+ICggOCArICRpTCApICkgeworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnUlN0cmluZycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkc1R4dCwKKyAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDAsCisgICAgICAgICAgICBDb2RlICAgICA9PiAnX25hdGl2ZV8nLCAgICAgICAgICAgICAgICAgICAgICAgICN1bmRlZiwKKyAgICAgICAgICAgIEJvb2sgICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgIFJpY2ggICAgID0+IHN1YnN0ciggJHNXaywgKCA4ICsgJGlMICkgKyAxICksCisgICAgICAgICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnUlN0cmluZycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkc1R4dCwKKyAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDAsCisgICAgICAgICAgICBDb2RlICAgICA9PiAnX25hdGl2ZV8nLAorICAgICAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICAgICApOworICAgIH0KKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCb29sRXJyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOlAzMDYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViQm9vbEVyciB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoICRpUiwgJGlDLCAkaUYgKSA9IHVucGFjayggInYzIiwgJHNXayApOworICAgIG15ICggJGlWYWwsICRpRmxnICkgPSB1bnBhY2soICJjYyIsIHN1YnN0ciggJHNXaywgNiwgMiApICk7CisgICAgbXkgJHNUeHQgPSBEZWNvZGVCb29sRXJyKCAkaVZhbCwgJGlGbGcgKTsKKworICAgIF9OZXdDZWxsKAorICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICBLaW5kICAgICA9PiAnQm9vbEVycm9yJywKKyAgICAgICAgVmFsICAgICAgPT4gJHNUeHQsCisgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgRm9ybWF0ICAgPT4gJG9Cb29rLT57Rm9ybWF0fVskaUZdLAorICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3ViUksoKQorIworIyBEZWNvZGUgdGhlIFJLIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdWJSSyB7CisKKyAgICBteSAoICR3b3JrYm9vaywgJGJpZmZfbnVtYmVyLCAkbGVuZ3RoLCAkZGF0YSApID0gQF87CisKKyAgICBteSAoICRyb3csICRjb2wsICRmb3JtYXRfaW5kZXgsICRya19udW1iZXIgKSA9IHVucGFjayggJ3Z2dlYnLCAkZGF0YSApOworCisgICAgbXkgJG51bWJlciA9IF9kZWNvZGVfcmtfbnVtYmVyKCAkcmtfbnVtYmVyICk7CisKKyAgICBfTmV3Q2VsbCgKKyAgICAgICAgJHdvcmtib29rLCAkcm93LCAkY29sLAorICAgICAgICBLaW5kICAgICA9PiAnUksnLAorICAgICAgICBWYWwgICAgICA9PiAkbnVtYmVyLAorICAgICAgICBGb3JtYXRObyA9PiAkZm9ybWF0X2luZGV4LAorICAgICAgICBGb3JtYXQgICA9PiAkd29ya2Jvb2stPntGb3JtYXR9LT5bJGZvcm1hdF9pbmRleF0sCisgICAgICAgIE51bWVyaWMgID0+IDEsCisgICAgICAgIENvZGUgICAgID0+IHVuZGVmLAorICAgICAgICBCb29rICAgICA9PiAkd29ya2Jvb2ssCisgICAgKTsKKworICAgICMgU3RvcmUgdGhlIG1heCBhbmQgbWluIHJvdy9jb2wgdmFsdWVzLgorICAgIF9TZXREaW1lbnNpb24oICR3b3JrYm9vaywgJHJvdywgJGNvbCwgJGNvbCApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJBcnJheSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgIERLOlAyOTcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViQXJyYXkgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaUJSLCAkaUVSLCAkaUJDLCAkaUVDICkgPSB1bnBhY2soICJ2MmMyIiwgJHNXayApOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvcm11bGEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMzNgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJGb3JtdWxhIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlSLCAkaUMsICRpRiApID0gdW5wYWNrKCAidjMiLCAkc1drICk7CisKKyAgICBteSAoICRpRmxnICkgPSB1bnBhY2soICJ2Iiwgc3Vic3RyKCAkc1drLCAxMiwgMiApICk7CisgICAgaWYgKCAkaUZsZyA9PSAweEZGRkYgKSB7CisgICAgICAgIG15ICggJGlLaW5kICkgPSB1bnBhY2soICJjIiwgc3Vic3RyKCAkc1drLCA2LCAxICkgKTsKKyAgICAgICAgbXkgKCAkaVZhbCApICA9IHVucGFjayggImMiLCBzdWJzdHIoICRzV2ssIDgsIDEgKSApOworCisgICAgICAgIGlmICggKCAkaUtpbmQgPT0gMSApIG9yICggJGlLaW5kID09IDIgKSApIHsKKyAgICAgICAgICAgIG15ICRzVHh0ID0KKyAgICAgICAgICAgICAgKCAkaUtpbmQgPT0gMSApCisgICAgICAgICAgICAgID8gRGVjb2RlQm9vbEVyciggJGlWYWwsIDAgKQorICAgICAgICAgICAgICA6IERlY29kZUJvb2xFcnIoICRpVmFsLCAxICk7CisgICAgICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICAgICAkb0Jvb2ssICRpUiwgJGlDLAorICAgICAgICAgICAgICAgIEtpbmQgICAgID0+ICdGb3JtdWxhIEJvb2wnLAorICAgICAgICAgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICAgICAgICAgIEZvcm1hdE5vID0+ICRpRiwKKyAgICAgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAgICAjIFJlc3VsdCAoUmVzZXJ2ZSBPbmx5KQorICAgICAgICAgICAgJG9Cb29rLT57X1ByZXZQb3N9ID0gWyAkaVIsICRpQywgJGlGIF07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG15ICRkVmFsID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDYsIDggKSApOworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnRm9ybXVsYSBOdW1iZXInLAorICAgICAgICAgICAgVmFsICAgICAgPT4gJGRWYWwsCisgICAgICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICBOdW1lcmljICA9PiAxLAorICAgICAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICk7CisgICAgfQorCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpQywgJGlDICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlN0cmluZyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgREs6UDQxNAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJTdHJpbmcgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICAjUG9zaXRpb24gKG5vdCBlbm91Z2ggZm9yIEFSUkFZKQorCisgICAgbXkgJGlQb3MgPSAkb0Jvb2stPntfUHJldlBvc307CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoICRpUG9zICk7CisgICAgJG9Cb29rLT57X1ByZXZQb3N9ID0gdW5kZWY7CisgICAgbXkgKCAkaVIsICRpQywgJGlGICkgPSBAJGlQb3M7CisKKyAgICBteSAoICRpTGVuLCAkc1R4dCwgJHNDb2RlICk7CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjggKSB7CisgICAgICAgIG15ICggJHJhQnVmZiwgJGlMZW4gKSA9IF9jb252QklGRjhTdHJpbmcoICRvQm9vaywgJHNXaywgMSApOworICAgICAgICAkc1R4dCA9ICRyYUJ1ZmYtPlswXTsKKyAgICAgICAgJHNDb2RlID0gKCAkcmFCdWZmLT5bMV0gKSA/ICd1Y3MyJyA6IHVuZGVmOworICAgIH0KKyAgICBlbHNpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGNSApIHsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICAgICAgJGlMZW4gID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAgICAgJHNUeHQgID0gc3Vic3RyKCAkc1drLCAyLCAkaUxlbiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICAgICAgJGlMZW4gID0gdW5wYWNrKCAiYyIsICRzV2sgKTsKKyAgICAgICAgJHNUeHQgID0gc3Vic3RyKCAkc1drLCAxLCAkaUxlbiApOworICAgIH0KKyAgICBfTmV3Q2VsbCgKKyAgICAgICAgJG9Cb29rLCAkaVIsICRpQywKKyAgICAgICAgS2luZCAgICAgPT4gJ1N0cmluZycsCisgICAgICAgIFZhbCAgICAgID0+ICRzVHh0LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gJHNDb2RlLAorICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJMYWJlbCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgIERLOlAzNDQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTGFiZWwgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGICkgPSB1bnBhY2soICJ2MyIsICRzV2sgKTsKKyAgICBteSAoICRzTGJsLCAkc0NvZGUgKTsKKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICBteSAoICRyYUJ1ZmYsICRpTGVuLCAkaVN0UG9zLCAkaUxlblMgKSA9CisgICAgICAgICAgX2NvbnZCSUZGOFN0cmluZyggJG9Cb29rLCBzdWJzdHIoICRzV2ssIDYgKSwgMSApOworICAgICAgICAkc0xibCA9ICRyYUJ1ZmYtPlswXTsKKyAgICAgICAgJHNDb2RlID0gKCAkcmFCdWZmLT5bMV0gKSA/ICd1Y3MyJyA6IHVuZGVmOworICAgIH0KKworICAgICNCZWZvcmUgQklGRjgKKyAgICBlbHNlIHsKKyAgICAgICAgJHNMYmwgPSBzdWJzdHIoICRzV2ssIDggKTsKKyAgICAgICAgJHNDb2RlID0gJ19uYXRpdmVfJzsKKyAgICB9CisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdMYWJlbCcsCisgICAgICAgIFZhbCAgICAgID0+ICRzTGJsLAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gJHNDb2RlLAorICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJNdWxSSygpCisjCisjIERlY29kZSB0aGUgTXVsdGlwbGUgUksgQklGRiByZWNvcmQuCisjCitzdWIgX3N1Yk11bFJLIHsKKworICAgIG15ICggJHdvcmtib29rLCAkYmlmZl9udW1iZXIsICRsZW5ndGgsICRkYXRhICkgPSBAXzsKKworICAgICMgSk1OOiBJIGRvbid0IGtub3cgd2h5IHRoaXMgaXMgaGVyZS4KKyAgICByZXR1cm4gaWYgJHdvcmtib29rLT57U2hlZXRDb3VudH0gPD0gMDsKKworICAgIG15ICggJHJvdywgJGZpcnN0X2NvbCApID0gdW5wYWNrKCAidjIiLCAkZGF0YSApOworICAgIG15ICRsYXN0X2NvbCA9IHVucGFjayggInYiLCBzdWJzdHIoICRkYXRhLCBsZW5ndGgoICRkYXRhICkgLSAyLCAyICkgKTsKKworICAgICMgSXRlcmF0ZSBvdmVyIHRoZSBSSyBhcnJheSBhbmQgZGVjb2RlIHRoZSBkYXRhLgorICAgIG15ICRwb3MgPSA0OworICAgIGZvciBteSAkY29sICggJGZpcnN0X2NvbCAuLiAkbGFzdF9jb2wgKSB7CisKKyAgICAgICAgbXkgJGRhdGEgPSBzdWJzdHIoICRkYXRhLCAkcG9zLCA2ICk7CisgICAgICAgIG15ICggJGZvcm1hdF9pbmRleCwgJHJrX251bWJlciApID0gdW5wYWNrICd2VicsICRkYXRhOworICAgICAgICBteSAkbnVtYmVyID0gX2RlY29kZV9ya19udW1iZXIoICRya19udW1iZXIgKTsKKworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICR3b3JrYm9vaywgJHJvdywgJGNvbCwKKyAgICAgICAgICAgIEtpbmQgICAgID0+ICdNdWxSSycsCisgICAgICAgICAgICBWYWwgICAgICA9PiAkbnVtYmVyLAorICAgICAgICAgICAgRm9ybWF0Tm8gPT4gJGZvcm1hdF9pbmRleCwKKyAgICAgICAgICAgIEZvcm1hdCAgID0+ICR3b3JrYm9vay0+e0Zvcm1hdH0tPlskZm9ybWF0X2luZGV4XSwKKyAgICAgICAgICAgIE51bWVyaWMgID0+IDEsCisgICAgICAgICAgICBDb2RlICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgIEJvb2sgICAgID0+ICR3b3JrYm9vaywKKyAgICAgICAgKTsKKyAgICAgICAgJHBvcyArPSA2OworICAgIH0KKworICAgICMgU3RvcmUgdGhlIG1heCBhbmQgbWluIHJvdy9jb2wgdmFsdWVzLgorICAgIF9TZXREaW1lbnNpb24oICR3b3JrYm9vaywgJHJvdywgJGZpcnN0X2NvbCwgJGxhc3RfY29sICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk11bEJsYW5rIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOlAzNDkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTXVsQmxhbmsgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpU2MgKSA9IHVucGFjayggInYyIiwgJHNXayApOworICAgIG15ICRpRWMgPSB1bnBhY2soICJ2Iiwgc3Vic3RyKCAkc1drLCBsZW5ndGgoICRzV2sgKSAtIDIsIDIgKSApOworICAgIG15ICRpUG9zID0gNDsKKyAgICBmb3IgKCBteSAkaUMgPSAkaVNjIDsgJGlDIDw9ICRpRWMgOyAkaUMrKyApIHsKKyAgICAgICAgbXkgJGlGID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgJGlQb3MsIDIgKSApOworICAgICAgICBfTmV3Q2VsbCgKKyAgICAgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgICAgICBLaW5kICAgICA9PiAnTXVsQmxhbmsnLAorICAgICAgICAgICAgVmFsICAgICAgPT4gJycsCisgICAgICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgICAgICBGb3JtYXQgICA9PiAkb0Jvb2stPntGb3JtYXR9WyRpRl0sCisgICAgICAgICAgICBOdW1lcmljICA9PiAwLAorICAgICAgICAgICAgQ29kZSAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICBCb29rICAgICA9PiAkb0Jvb2ssCisgICAgICAgICk7CisgICAgICAgICRpUG9zICs9IDI7CisgICAgfQorCisgICAgIzIuTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sCisgICAgX1NldERpbWVuc2lvbiggJG9Cb29rLCAkaVIsICRpU2MsICRpRWMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViTGFiZWxTU1QgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzNDUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTGFiZWxTU1QgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVIsICRpQywgJGlGLCAkaUlkeCApID0gdW5wYWNrKCAndjNWJywgJHNXayApOworCisgICAgX05ld0NlbGwoCisgICAgICAgICRvQm9vaywgJGlSLCAkaUMsCisgICAgICAgIEtpbmQgICAgID0+ICdQYWNrZWRJZHgnLAorICAgICAgICBWYWwgICAgICA9PiAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1RleHR9LAorICAgICAgICBGb3JtYXRObyA9PiAkaUYsCisgICAgICAgIEZvcm1hdCAgID0+ICRvQm9vay0+e0Zvcm1hdH1bJGlGXSwKKyAgICAgICAgTnVtZXJpYyAgPT4gMCwKKyAgICAgICAgQ29kZSAgICAgPT4gKCAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1VuaWNvZGV9ICkgPyAndWNzMicgOiB1bmRlZiwKKyAgICAgICAgQm9vayAgICAgPT4gJG9Cb29rLAorICAgICAgICBSaWNoICAgICA9PiAkb0Jvb2stPntQa2dTdHJ9WyRpSWR4XS0+e1JpY2h9LAorICAgICk7CisKKyAgICAjMi5NYXhSb3csIE1heENvbCwgTWluUm93LCBNaW5Db2wKKyAgICBfU2V0RGltZW5zaW9uKCAkb0Jvb2ssICRpUiwgJGlDLCAkaUMgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViRmxnMTkwNCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQMjk2CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkZsZzE5MDQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgJG9Cb29rLT57RmxnMTkwNH0gPSB1bnBhY2soICJ2IiwgJHNXayApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJSb3cgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDQwMworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJSb3cgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgIzAuIEdldCBXb3Jrc2hlZXQgaW5mbyAoTWF4Um93LCBNYXhDb2wsIE1pblJvdywgTWluQ29sKQorICAgIG15ICggJGlSLCAkaVNjLCAkaUVjLCAkaUhnaHQsICR1bmRlZjEsICR1bmRlZjIsICRpR3IsICRpWGYgKSA9CisgICAgICB1bnBhY2soICJ2OCIsICRzV2sgKTsKKyAgICAkaUVjLS07CisKKyAgICAjIFRPRE8uIHdlIG5lZWQgdG8gaGFuZGxlIGhpZGRlbiByb3dzOgorICAgICMgJGlHciAmIDB4MjAKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSb3dIZWlnaHR9WyRpUl0gPSAkaUhnaHQgLyAyMDsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgIF9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaVNjLCAkaUVjICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX1NldERpbWVuc2lvbiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9TZXREaW1lbnNpb24geworICAgIG15ICggJG9Cb29rLCAkaVIsICRpU2MsICRpRWMgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgICMyLk1heFJvdywgTWF4Q29sLCBNaW5Sb3csIE1pbkNvbAorICAgICMyLjEgTWluUm93CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWluUm93fSA9ICRpUgorICAgICAgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntNaW5Sb3d9ICkKKyAgICAgIGFuZCAoICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pblJvd30gPD0gJGlSICk7CisKKyAgICAjMi4yIE1heFJvdworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heFJvd30gPSAkaVIKKyAgICAgIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWF4Um93fSApCisgICAgICBhbmQgKCAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntNYXhSb3d9ID4gJGlSICk7CisKKyAgICAjMi4zIE1pbkNvbAorICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pbkNvbH0gPSAkaVNjCisgICAgICB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01pbkNvbH0gKQorICAgICAgYW5kICggJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWluQ29sfSA8PSAkaVNjICk7CisKKyAgICAjMi40IE1heENvbAorICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heENvbH0gPSAkaUVjCisgICAgICB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e01heENvbH0gKQorICAgICAgYW5kICggJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TWF4Q29sfSA+ICRpRWMgKTsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJEZWZhdWx0Um93SGVpZ2h0IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpICAgIERLOiBQMzE4CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkRlZmF1bHRSb3dIZWlnaHQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgIzEuIFJvd0hlaWdodAorICAgIG15ICggJGlEdW0sICRpSGdodCApID0gdW5wYWNrKCAidjIiLCAkc1drICk7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57RGVmUm93SGVpZ2h0fSA9ICRpSGdodCAvIDIwOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlN0YW5kYXJkV2lkdGgoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgICBESzpQNDEzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlN0YW5kYXJkV2lkdGggeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgJGlXID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAkb0Jvb2stPntTdGFuZGFyZFdpZHRofSA9IF9jb252ZXJ0X2NvbF93aWR0aCggJG9Cb29rLCAkaVcgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3ViRGVmQ29sV2lkdGgoKQorIworIyBSZWFkIHRoZSBERUZDT0xXSURUSCBCaWZmIHJlY29yZC4gVGhpcyBnaXZlcyB0aGUgd2lkdGggaW4gdGVybXMgb2YgY2hhcnMKKyMgYW5kIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB3aWR0aCBpbiB0aGUgQ09MSU5GTyByZWNvcmQuCisjCitzdWIgX3N1YkRlZkNvbFdpZHRoIHsKKworICAgIG15ICggJHNlbGYsICRyZWNvcmQsICRsZW5ndGgsICRkYXRhICkgPSBAXzsKKworICAgIG15ICR3aWR0aCA9IHVucGFjayAndicsICRkYXRhOworCisgICAgIyBBZGp1c3RtZW50IGZvciBkZWZhdWx0IEFyaWFsIDEwIHdpZHRoLgorICAgICR3aWR0aCA9IDguNDMgaWYgJHdpZHRoID09IDg7CisKKyAgICAkc2VsZi0+e1dvcmtzaGVldH0tPlsgJHNlbGYtPntfQ3VyU2hlZXR9IF0tPntEZWZDb2xXaWR0aH0gPSAkd2lkdGg7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NvbnZlcnRfY29sX3dpZHRoKCkKKyMKKyMgQ29udmVydHMgZnJvbSB0aGUgaW50ZXJuYWwgRXhjZWwgY29sdW1uIHdpZHRoIHVuaXRzIHRvIHVzZXIgdW5pdHMgc2VlbiBpbiB0aGUKKyMgaW50ZXJmYWNlLiBJdCBpcyBmaXJzdCBuZWNlc3NhcnkgdG8gY29udmVydCB0aGUgaW50ZXJuYWwgd2lkdGggdG8gcGl4ZWxzIGFuZAorIyB0aGVuIHRvIHVzZXIgdW5pdHMuIFRoZSBjb252ZXJzaW9uIGlzIHNwZWNpZmljIHRvIGEgZGVmYXVsdCBmb250IG9mIEFyaWFsIDEwLgorIyBUT0RPLCB0aGUgY29udmVyc2lvbiBzaG91bGQgYmUgZXh0ZW5kZWQgdG8gb3RoZXIgZm9udHMgYW5kIHNpemVzLgorIworc3ViIF9jb252ZXJ0X2NvbF93aWR0aCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXhjZWxfd2lkdGggPSBzaGlmdDsKKworICAgICMgQ29udmVydCBmcm9tIEV4Y2VsIHVuaXRzIHRvIHBpeGVscyAocm91bmRlZCB1cCkuCisgICAgbXkgJHBpeGVscyA9IGludCggMC41ICsgJGV4Y2VsX3dpZHRoICogNyAvIDI1NiApOworCisgICAgIyBDb252ZXJ0IGZyb20gcGl4ZWxzIHRvIHVzZXIgdW5pdHMuCisgICAgIyBUaGUgY29udmVyc2lvbiBpcyBkaWZmZXJlbnQgZm9yIGNvbHVtbnMgPD0gMSB1c2VyIHVuaXQgKDEyIHBpeGVscykuCisgICAgbXkgJHVzZXJfd2lkdGg7CisgICAgaWYgKCAkcGl4ZWxzIDw9IDEyICkgeworICAgICAgICAkdXNlcl93aWR0aCA9ICRwaXhlbHMgLyAxMjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR1c2VyX3dpZHRoID0gKCAkcGl4ZWxzIC0gNSApIC8gNzsKKyAgICB9CisKKyAgICAjIFJvdW5kIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuCisgICAgJHVzZXJfd2lkdGggPSBpbnQoICR1c2VyX3dpZHRoICogMTAwICsgMC41ICkgLyAxMDA7CisKKyAgICByZXR1cm4gJHVzZXJfd2lkdGg7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkNvbEluZm8gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMwOQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJDb2xJbmZvIHsKKworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fTsKKworICAgIG15ICggJGlTYywgJGlFYywgJGlXLCAkaVhGLCAkaUdyICkgPSB1bnBhY2soICJ2NSIsICRzV2sgKTsKKworICAgIGZvciAoIG15ICRpID0gJGlTYyA7ICRpIDw9ICRpRWMgOyAkaSsrICkgeworCisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0NvbFdpZHRofVskaV0gPQorICAgICAgICAgIF9jb252ZXJ0X2NvbF93aWR0aCggJG9Cb29rLCAkaVcgKTsKKworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntDb2xGbXROb31bJGldID0gJGlYRjsKKworICAgICAgICAjIFRPRE8uIHdlIG5lZWQgdG8gaGFuZGxlIGhpZGRlbiBjb2xzOiAkaUdyICYgMHgwMS4KKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YlNTVCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQNDEzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlNTVCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBfc3ViU3RyV2soICRvQm9vaywgc3Vic3RyKCAkc1drLCA4ICkgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViQ29udGludWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgICAgREs6UDMxMQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJDb250aW51ZSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKworICAgICNpZihkZWZpbmVkICRzZWxmLT57RnVuY1RibH0tPnskYk9wfSkgeworICAgICMgICAgJHNlbGYtPntGdW5jVGJsfS0+eyRQUkVGVU5DfS0+KCRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2spOworICAgICN9CisKKyAgICBfc3ViU3RyV2soICRvQm9vaywgJHNXaywgMSApIGlmICggJFBSRUZVTkMgPT0gMHhGQyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJXcml0ZUFjY2VzcyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzpQNDUxCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YldyaXRlQWNjZXNzIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiBpZiAoIGRlZmluZWQgJG9Cb29rLT57X0F1dGhvcn0gKTsKKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICAkb0Jvb2stPntBdXRob3J9ID0gX2NvbnZCSUZGOFN0cmluZyggJG9Cb29rLCAkc1drICk7CisgICAgfQorCisgICAgI0JlZm9yZSBCSUZGOAorICAgIGVsc2UgeworICAgICAgICBteSAoICRpTGVuICkgPSB1bnBhY2soICJjIiwgJHNXayApOworICAgICAgICAkb0Jvb2stPntBdXRob3J9ID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMSwgJGlMZW4gKSwgJ19uYXRpdmVfJyApOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfY29udkJJRkY4U3RyaW5nIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX2NvbnZCSUZGOFN0cmluZyB7CisgICAgbXkgKCAkb0Jvb2ssICRzV2ssICRpQ252RmxnICkgPSBAXzsKKyAgICBteSAoICRpTGVuLCAkaUZsZyApID0gdW5wYWNrKCAidmMiLCAkc1drICk7CisgICAgbXkgKCAkaUhpZ2gsICRpRXh0LCAkaVJpY2ggKSA9ICggJGlGbGcgJiAweDAxLCAkaUZsZyAmIDB4MDQsICRpRmxnICYgMHgwOCApOworICAgIG15ICggJGlTdFBvcywgJGlFeHRDbnQsICRpUmljaENudCwgJHNTdHIgKTsKKworICAgICMyLiBSaWNoIGFuZCBFeHQKKyAgICBpZiAoICRpUmljaCAmJiAkaUV4dCApIHsKKyAgICAgICAgJGlTdFBvcyA9IDk7CisgICAgICAgICggJGlSaWNoQ250LCAkaUV4dENudCApID0gdW5wYWNrKCAndlYnLCBzdWJzdHIoICRzV2ssIDMsIDYgKSApOworICAgIH0KKyAgICBlbHNpZiAoICRpUmljaCApIHsgICAgI09ubHkgUmljaAorICAgICAgICAkaVN0UG9zICAgPSA1OworICAgICAgICAkaVJpY2hDbnQgPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc1drLCAzLCAyICkgKTsKKyAgICAgICAgJGlFeHRDbnQgID0gMDsKKyAgICB9CisgICAgZWxzaWYgKCAkaUV4dCApIHsgICAgICNPbmx5IEV4dAorICAgICAgICAkaVN0UG9zICAgPSA3OworICAgICAgICAkaVJpY2hDbnQgPSAwOworICAgICAgICAkaUV4dENudCAgPSB1bnBhY2soICdWJywgc3Vic3RyKCAkc1drLCAzLCA0ICkgKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICNOb3RoaW5nIFNwZWNpYWwKKyAgICAgICAgJGlTdFBvcyAgID0gMzsKKyAgICAgICAgJGlFeHRDbnQgID0gMDsKKyAgICAgICAgJGlSaWNoQ250ID0gMDsKKyAgICB9CisKKyAgICAjMy5HZXQgU3RyaW5nCisgICAgaWYgKCAkaUhpZ2ggKSB7ICAgICAgICNDb21wcmVzc2VkCisgICAgICAgICRpTGVuICo9IDI7CisgICAgICAgICRzU3RyID0gc3Vic3RyKCAkc1drLCAkaVN0UG9zLCAkaUxlbiApOworICAgICAgICBfU3dhcEZvclVuaWNvZGUoIFwkc1N0ciApOworICAgICAgICAkc1N0ciA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNTdHIsICd1Y3MyJyApCisgICAgICAgICAgdW5sZXNzICggJGlDbnZGbGcgKTsKKyAgICB9CisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICNOb3QgQ29tcHJlc3NlZAorICAgICAgICAkc1N0ciA9IHN1YnN0ciggJHNXaywgJGlTdFBvcywgJGlMZW4gKTsKKyAgICAgICAgJHNTdHIgPSAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoICRzU3RyLCB1bmRlZiApIHVubGVzcyAoICRpQ252RmxnICk7CisgICAgfQorCisgICAgIzQuIHJldHVybgorICAgIGlmICggd2FudGFycmF5ICkgeworCisgICAgICAgICM0LjEgR2V0IFJpY2ggYW5kIEV4dAorICAgICAgICBpZiAoIGxlbmd0aCggJHNXayApIDwgJGlTdFBvcyArICRpTGVuICsgJGlSaWNoQ250ICogNCArICRpRXh0Q250ICkgeworICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBbIHVuZGVmLCAkaUhpZ2gsIHVuZGVmLCB1bmRlZiBdLAorICAgICAgICAgICAgICAgICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQgKyAkaUV4dENudCwKKyAgICAgICAgICAgICAgICAkaVN0UG9zLCAkaUxlbgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAkc1N0ciwKKyAgICAgICAgICAgICAgICAgICAgJGlIaWdoLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzV2ssICRpU3RQb3MgKyAkaUxlbiwgJGlSaWNoQ250ICogNCApLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzV2ssICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQsICRpRXh0Q250ICkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICRpU3RQb3MgKyAkaUxlbiArICRpUmljaENudCAqIDQgKyAkaUV4dENudCwKKyAgICAgICAgICAgICAgICAkaVN0UG9zLCAkaUxlbgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzU3RyOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViWEYgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgICAgIERLOlA0NTMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViWEYgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisKKyAgICBteSAoICRpRm50LCAkaUlkeCApOworICAgIG15ICgKKyAgICAgICAgJGlMb2NrLCAgICAkaUhpZGRlbiwgJGlTdHlsZSwgICRpMTIzLCAgICRpQWxILCAgICAkaVdyYXAsCisgICAgICAgICRpQWxWLCAgICAgJGlKdXN0TCwgICRpUm90YXRlLCAkaUluZCwgICAkaVNocmluaywgJGlNZXJnZSwKKyAgICAgICAgJGlSZWFkRGlyLCAkaUJkckQsICAgJGlCZHJTTCwgICRpQmRyU1IsICRpQmRyU1QsICAkaUJkclNCLAorICAgICAgICAkaUJkclNELCAgICRpQmRyQ0wsICAkaUJkckNSLCAgJGlCZHJDVCwgJGlCZHJDQiwgICRpQmRyQ0QsCisgICAgICAgICRpRmlsbFAsICAgJGlGaWxsQ0YsICRpRmlsbENCCisgICAgKTsKKworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjQgKSB7CisKKyAgICAgICAgIyBNaW5pbWFsIHN1cHBvcnQgZm9yIEV4Y2VsIDQuIFdlIGp1c3QgZ2V0IHRoZSBmb250IGFuZCBmb3JtYXQgaW5kaWNlcworICAgICAgICAjIHNvIHRoYXQgdGhlIGNlbGwgZGF0YSB2YWx1ZSBjYW4gYmUgZm9ybWF0dGVkLgorICAgICAgICAoICRpRm50LCAkaUlkeCwgKSA9IHVucGFjayggIkNDIiwgJHNXayApOworICAgIH0KKyAgICBlbHNpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA9PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgbXkgKCAkaUdlbiwgJGlBbGlnbiwgJGlHZW4yLCAkaUJkcjEsICRpQmRyMiwgJGlCZHIzLCAkaVB0biApOworCisgICAgICAgICggJGlGbnQsICRpSWR4LCAkaUdlbiwgJGlBbGlnbiwgJGlHZW4yLCAkaUJkcjEsICRpQmRyMiwgJGlCZHIzLCAkaVB0biApCisgICAgICAgICAgPSB1bnBhY2soICJ2N1Z2IiwgJHNXayApOworICAgICAgICAkaUxvY2sgICA9ICggJGlHZW4gJiAweDAxICkgICA/IDEgOiAwOworICAgICAgICAkaUhpZGRlbiA9ICggJGlHZW4gJiAweDAyICkgICA/IDEgOiAwOworICAgICAgICAkaVN0eWxlICA9ICggJGlHZW4gJiAweDA0ICkgICA/IDEgOiAwOworICAgICAgICAkaTEyMyAgICA9ICggJGlHZW4gJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkaUFsSCAgICA9ICggJGlBbGlnbiAmIDB4MDcgKTsKKyAgICAgICAgJGlXcmFwICAgPSAoICRpQWxpZ24gJiAweDA4ICkgPyAxIDogMDsKKyAgICAgICAgJGlBbFYgICAgPSAoICRpQWxpZ24gJiAweDcwICkgLyAweDEwOworICAgICAgICAkaUp1c3RMICA9ICggJGlBbGlnbiAmIDB4ODAgKSA/IDEgOiAwOworCisgICAgICAgICRpUm90YXRlID0gKCAoICRpQWxpZ24gJiAweEZGMDAgKSAvIDB4MTAwICkgJiAweDAwRkY7CisgICAgICAgICRpUm90YXRlID0gOTAgICAgICAgICAgICBpZiAoICRpUm90YXRlID09IDI1NSApOworICAgICAgICAkaVJvdGF0ZSA9IDkwIC0gJGlSb3RhdGUgaWYgKCAkaVJvdGF0ZSA+IDkwICk7CisKKyAgICAgICAgJGlJbmQgICAgID0gKCAkaUdlbjIgJiAweDBGICk7CisgICAgICAgICRpU2hyaW5rICA9ICggJGlHZW4yICYgMHgxMCApID8gMSA6IDA7CisgICAgICAgICRpTWVyZ2UgICA9ICggJGlHZW4yICYgMHgyMCApID8gMSA6IDA7CisgICAgICAgICRpUmVhZERpciA9ICggKCAkaUdlbjIgJiAweEMwICkgLyAweDQwICkgJiAweDAzOworICAgICAgICAkaUJkclNMICAgPSAkaUJkcjEgJiAweDBGOworICAgICAgICAkaUJkclNSICAgPSAoICggJGlCZHIxICYgMHhGMCApIC8gMHgxMCApICYgMHgwRjsKKyAgICAgICAgJGlCZHJTVCAgID0gKCAoICRpQmRyMSAmIDB4RjAwICkgLyAweDEwMCApICYgMHgwRjsKKyAgICAgICAgJGlCZHJTQiAgID0gKCAoICRpQmRyMSAmIDB4RjAwMCApIC8gMHgxMDAwICkgJiAweDBGOworCisgICAgICAgICRpQmRyQ0wgPSAoICggJGlCZHIyICYgMHg3RiApICkgJiAweDdGOworICAgICAgICAkaUJkckNSID0gKCAoICRpQmRyMiAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICAgICAgJGlCZHJEICA9ICggKCAkaUJkcjIgJiAweEMwMDAgKSAvIDB4NDAwMCApICYgMHgzOworCisgICAgICAgICRpQmRyQ1QgPSAoICggJGlCZHIzICYgMHg3RiApICkgJiAweDdGOworICAgICAgICAkaUJkckNCID0gKCAoICRpQmRyMyAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICAgICAgJGlCZHJDRCA9ICggKCAkaUJkcjMgJiAweDFGQzAwMCApIC8gMHg0MDAwICkgJiAweDdGOworICAgICAgICAkaUJkclNEID0gKCAoICRpQmRyMyAmIDB4MUUwMDAwMCApIC8gMHgyMDAwMDAgKSAmIDB4RjsKKyAgICAgICAgJGlGaWxsUCA9ICggKCAkaUJkcjMgJiAweEZDMDAwMDAwICkgLyAweDQwMDAwMDAgKSAmIDB4M0Y7CisKKyAgICAgICAgJGlGaWxsQ0YgPSAoICRpUHRuICYgMHg3RiApOworICAgICAgICAkaUZpbGxDQiA9ICggKCAkaVB0biAmIDB4M0Y4MCApIC8gMHg4MCApICYgMHg3RjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG15ICggJGlHZW4sICRpQWxpZ24sICRpUHRuLCAkaVB0bjIsICRpQmRyMSwgJGlCZHIyICk7CisKKyAgICAgICAgKCAkaUZudCwgJGlJZHgsICRpR2VuLCAkaUFsaWduLCAkaVB0biwgJGlQdG4yLCAkaUJkcjEsICRpQmRyMiApID0KKyAgICAgICAgICB1bnBhY2soICJ2OCIsICRzV2sgKTsKKyAgICAgICAgJGlMb2NrICAgPSAoICRpR2VuICYgMHgwMSApID8gMSA6IDA7CisgICAgICAgICRpSGlkZGVuID0gKCAkaUdlbiAmIDB4MDIgKSA/IDEgOiAwOworICAgICAgICAkaVN0eWxlICA9ICggJGlHZW4gJiAweDA0ICkgPyAxIDogMDsKKyAgICAgICAgJGkxMjMgICAgPSAoICRpR2VuICYgMHgwOCApID8gMSA6IDA7CisKKyAgICAgICAgJGlBbEggICA9ICggJGlBbGlnbiAmIDB4MDcgKTsKKyAgICAgICAgJGlXcmFwICA9ICggJGlBbGlnbiAmIDB4MDggKSA/IDEgOiAwOworICAgICAgICAkaUFsViAgID0gKCAkaUFsaWduICYgMHg3MCApIC8gMHgxMDsKKyAgICAgICAgJGlKdXN0TCA9ICggJGlBbGlnbiAmIDB4ODAgKSA/IDEgOiAwOworCisgICAgICAgICRpUm90YXRlID0gKCAoICRpQWxpZ24gJiAweDMwMCApIC8gMHgxMDAgKSAmIDB4MzsKKworICAgICAgICAkaUZpbGxDRiA9ICggJGlQdG4gJiAweDdGICk7CisgICAgICAgICRpRmlsbENCID0gKCAoICRpUHRuICYgMHgxRjgwICkgLyAweDgwICkgJiAweDdGOworCisgICAgICAgICRpRmlsbFAgPSAoICRpUHRuMiAmIDB4M0YgKTsKKyAgICAgICAgJGlCZHJTQiA9ICggKCAkaVB0bjIgJiAweDFDMCApIC8gMHg0MCApICYgMHg3OworICAgICAgICAkaUJkckNCID0gKCAoICRpUHRuMiAmIDB4RkUwMCApIC8gMHgyMDAgKSAmIDB4N0Y7CisKKyAgICAgICAgJGlCZHJTVCA9ICggJGlCZHIxICYgMHgwNyApOworICAgICAgICAkaUJkclNMID0gKCAoICRpQmRyMSAmIDB4MzggKSAvIDB4OCApICYgMHgwNzsKKyAgICAgICAgJGlCZHJTUiA9ICggKCAkaUJkcjEgJiAweDFDMCApIC8gMHg0MCApICYgMHgwNzsKKyAgICAgICAgJGlCZHJDVCA9ICggKCAkaUJkcjEgJiAweEZFMDAgKSAvIDB4MjAwICkgJiAweDdGOworCisgICAgICAgICRpQmRyQ0wgPSAoICRpQmRyMiAmIDB4N0YgKSAmIDB4N0Y7CisgICAgICAgICRpQmRyQ1IgPSAoICggJGlCZHIyICYgMHgzRjgwICkgLyAweDgwICkgJiAweDdGOworICAgIH0KKworICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9ybWF0fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIEZvbnRObyA9PiAkaUZudCwKKyAgICAgICAgRm9udCAgID0+ICRvQm9vay0+e0ZvbnR9WyRpRm50XSwKKyAgICAgICAgRm10SWR4ID0+ICRpSWR4LAorCisgICAgICAgIExvY2sgICAgID0+ICRpTG9jaywKKyAgICAgICAgSGlkZGVuICAgPT4gJGlIaWRkZW4sCisgICAgICAgIFN0eWxlICAgID0+ICRpU3R5bGUsCisgICAgICAgIEtleTEyMyAgID0+ICRpMTIzLAorICAgICAgICBBbGlnbkggICA9PiAkaUFsSCwKKyAgICAgICAgV3JhcCAgICAgPT4gJGlXcmFwLAorICAgICAgICBBbGlnblYgICA9PiAkaUFsViwKKyAgICAgICAgSnVzdExhc3QgPT4gJGlKdXN0TCwKKyAgICAgICAgUm90YXRlICAgPT4gJGlSb3RhdGUsCisKKyAgICAgICAgSW5kZW50ICA9PiAkaUluZCwKKyAgICAgICAgU2hyaW5rICA9PiAkaVNocmluaywKKyAgICAgICAgTWVyZ2UgICA9PiAkaU1lcmdlLAorICAgICAgICBSZWFkRGlyID0+ICRpUmVhZERpciwKKworICAgICAgICBCZHJTdHlsZSA9PiBbICRpQmRyU0wsICRpQmRyU1IsICAkaUJkclNULCAkaUJkclNCIF0sCisgICAgICAgIEJkckNvbG9yID0+IFsgJGlCZHJDTCwgJGlCZHJDUiwgICRpQmRyQ1QsICRpQmRyQ0IgXSwKKyAgICAgICAgQmRyRGlhZyAgPT4gWyAkaUJkckQsICAkaUJkclNELCAgJGlCZHJDRCBdLAorICAgICAgICBGaWxsICAgICA9PiBbICRpRmlsbFAsICRpRmlsbENGLCAkaUZpbGxDQiBdLAorICAgICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvcm1hdCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSAgREs6IFAzMzYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViRm9ybWF0IHsKKworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgJHNGbXQ7CisKKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA8PSB2ZXJCSUZGNSApIHsKKyAgICAgICAgJHNGbXQgPSBzdWJzdHIoICRzV2ssIDMsIHVucGFjayggJ2MnLCBzdWJzdHIoICRzV2ssIDIsIDEgKSApICk7CisgICAgICAgICRzRm10ID0gJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCAkc0ZtdCwgJ19uYXRpdmVfJyApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNGbXQgPSBfY29udkJJRkY4U3RyaW5nKCAkb0Jvb2ssIHN1YnN0ciggJHNXaywgMiApICk7CisgICAgfQorCisgICAgbXkgJGZvcm1hdF9pbmRleCA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzV2ssIDAsIDIgKSApOworCisgICAgIyBFeGNlbCA0IGFuZCBlYXJsaWVyIHVzZWQgYW4gaW5kZXggb2YgMCB0byBpbmRpY2F0ZSB0aGF0IGEgYnVpbHQtaW4gZm9ybWF0CisgICAgIyB0aGF0IHdhcyBzdG9yZWQgaW1wbGljaXRseS4KKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA8PSB2ZXJCSUZGNCAmJiAkZm9ybWF0X2luZGV4ID09IDAgKSB7CisgICAgICAgICRmb3JtYXRfaW5kZXggPSBrZXlzICV7ICRvQm9vay0+e0Zvcm1hdFN0cn0gfTsKKyAgICB9CisKKyAgICAkb0Jvb2stPntGb3JtYXRTdHJ9LT57JGZvcm1hdF9pbmRleH0gPSAkc0ZtdDsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViUGFsZXR0ZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM5MworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJQYWxldHRlIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgdW5wYWNrKCAndicsICRzV2sgKSA7ICRpKysgKSB7CisKKyAgICAgICAgIyAgICAgICAgcHVzaCBAYUNvbG9yLCB1bnBhY2soJ0g2Jywgc3Vic3RyKCRzV2ssICRpKjQrMikpOworICAgICAgICAkYUNvbG9yWyAkaSArIDggXSA9IHVucGFjayggJ0g2Jywgc3Vic3RyKCAkc1drLCAkaSAqIDQgKyAyICkgKTsKKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkZvbnQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6UDMzMworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJGb250IHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15ICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lLCAkc0ZudE5hbWUgKTsKKyAgICBteSAoICRiQm9sZCwgJGJJdGFsaWMsICRiVW5kZXJsaW5lLCAkYlN0cmlrZW91dCApOworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjggKSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lICkgPQorICAgICAgICAgIHVucGFjayggInY1YyIsICRzV2sgKTsKKyAgICAgICAgbXkgKCAkaVNpemUsICRpSGlnaCApID0gdW5wYWNrKCAnY2MnLCBzdWJzdHIoICRzV2ssIDE0LCAyICkgKTsKKyAgICAgICAgaWYgKCAkaUhpZ2ggKSB7CisgICAgICAgICAgICAkc0ZudE5hbWUgPSBzdWJzdHIoICRzV2ssIDE2LCAkaVNpemUgKiAyICk7CisgICAgICAgICAgICBfU3dhcEZvclVuaWNvZGUoIFwkc0ZudE5hbWUgKTsKKyAgICAgICAgICAgICRzRm50TmFtZSA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNGbnROYW1lLCAndWNzMicgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzRm50TmFtZSA9IHN1YnN0ciggJHNXaywgMTYsICRpU2l6ZSApOworICAgICAgICAgICAgJHNGbnROYW1lID0gJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCAkc0ZudE5hbWUsICdfbmF0aXZlXycgKTsKKyAgICAgICAgfQorICAgICAgICAkYkJvbGQgICAgICA9ICggJGlCb2xkID49IDB4MkJDICkgPyAxIDogMDsKKyAgICAgICAgJGJJdGFsaWMgICAgPSAoICRpQXR0ciAmIDB4MDIgKSAgID8gMSA6IDA7CisgICAgICAgICRiU3RyaWtlb3V0ID0gKCAkaUF0dHIgJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkYlVuZGVybGluZSA9ICggJGlVbmRlcmxpbmUgKSAgICAgPyAxIDogMDsKKyAgICB9CisgICAgZWxzaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPT0gdmVyQklGRjUgKSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciwgJGlDSWR4LCAkaUJvbGQsICRpU3VwZXIsICRpVW5kZXJsaW5lICkgPQorICAgICAgICAgIHVucGFjayggInY1YyIsICRzV2sgKTsKKyAgICAgICAgJHNGbnROYW1lID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30KKyAgICAgICAgICAtPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMTUsIHVucGFjayggImMiLCBzdWJzdHIoICRzV2ssIDE0LCAxICkgKSApLAorICAgICAgICAgICAgJ19uYXRpdmVfJyApOworICAgICAgICAkYkJvbGQgICAgICA9ICggJGlCb2xkID49IDB4MkJDICkgPyAxIDogMDsKKyAgICAgICAgJGJJdGFsaWMgICAgPSAoICRpQXR0ciAmIDB4MDIgKSAgID8gMSA6IDA7CisgICAgICAgICRiU3RyaWtlb3V0ID0gKCAkaUF0dHIgJiAweDA4ICkgICA/IDEgOiAwOworICAgICAgICAkYlVuZGVybGluZSA9ICggJGlVbmRlcmxpbmUgKSAgICAgPyAxIDogMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICggJGlIZWlnaHQsICRpQXR0ciApID0gdW5wYWNrKCAidjIiLCAkc1drICk7CisgICAgICAgICRpQ0lkeCAgPSB1bmRlZjsKKyAgICAgICAgJGlTdXBlciA9IDA7CisKKyAgICAgICAgJGJCb2xkICAgICAgPSAoICRpQXR0ciAmIDB4MDEgKSA/IDEgOiAwOworICAgICAgICAkYkl0YWxpYyAgICA9ICggJGlBdHRyICYgMHgwMiApID8gMSA6IDA7CisgICAgICAgICRiVW5kZXJsaW5lID0gKCAkaUF0dHIgJiAweDA0ICkgPyAxIDogMDsKKyAgICAgICAgJGJTdHJpa2VvdXQgPSAoICRpQXR0ciAmIDB4MDggKSA/IDEgOiAwOworCisgICAgICAgICRzRm50TmFtZSA9IHN1YnN0ciggJHNXaywgNSwgdW5wYWNrKCAiYyIsIHN1YnN0ciggJHNXaywgNCwgMSApICkgKTsKKyAgICB9CisgICAgcHVzaCBAeyAkb0Jvb2stPntGb250fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9udC0+bmV3KAorICAgICAgICBIZWlnaHQgICAgICAgICA9PiAkaUhlaWdodCAvIDIwLjAsCisgICAgICAgIEF0dHIgICAgICAgICAgID0+ICRpQXR0ciwKKyAgICAgICAgQ29sb3IgICAgICAgICAgPT4gJGlDSWR4LAorICAgICAgICBTdXBlciAgICAgICAgICA9PiAkaVN1cGVyLAorICAgICAgICBVbmRlcmxpbmVTdHlsZSA9PiAkaVVuZGVybGluZSwKKyAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJHNGbnROYW1lLAorCisgICAgICAgIEJvbGQgICAgICA9PiAkYkJvbGQsCisgICAgICAgIEl0YWxpYyAgICA9PiAkYkl0YWxpYywKKyAgICAgICAgVW5kZXJsaW5lID0+ICRiVW5kZXJsaW5lLAorICAgICAgICBTdHJpa2VvdXQgPT4gJGJTdHJpa2VvdXQsCisgICAgKTsKKworICAgICNTa2lwIEZvbnRbNF0KKyAgICBwdXNoIEB7ICRvQm9vay0+e0ZvbnR9IH0sIHt9IGlmICggc2NhbGFyKCBAeyAkb0Jvb2stPntGb250fSB9ICkgPT0gNCApOworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkJvdW5kU2hlZXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCk6IERLOiBQMzA3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YkJvdW5kU2hlZXQgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgbXkgKCAkaVBvcywgJGlHciwgJGlLaW5kICkgPSB1bnBhY2soICJMYzIiLCAkc1drICk7CisgICAgJGlLaW5kICY9IDB4MEY7CisgICAgcmV0dXJuIGlmICggKCAkaUtpbmQgIT0gMHgwMCApICYmICggJGlLaW5kICE9IDB4MDEgKSApOworCisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgIG15ICggJGlTaXplLCAkaVVuaSApID0gdW5wYWNrKCAiY2MiLCBzdWJzdHIoICRzV2ssIDYsIDIgKSApOworICAgICAgICBteSAkc1dzTmFtZSA9IHN1YnN0ciggJHNXaywgOCApOworICAgICAgICBpZiAoICRpVW5pICYgMHgwMSApIHsKKyAgICAgICAgICAgIF9Td2FwRm9yVW5pY29kZSggXCRzV3NOYW1lICk7CisgICAgICAgICAgICAkc1dzTmFtZSA9ICRvQm9vay0+e0ZtdENsYXNzfS0+VGV4dEZtdCggJHNXc05hbWUsICd1Y3MyJyApOworICAgICAgICB9CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e1NoZWV0Q291bnR9IF0gPQorICAgICAgICAgIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQtPm5ldygKKyAgICAgICAgICAgIE5hbWUgICAgID0+ICRzV3NOYW1lLAorICAgICAgICAgICAgS2luZCAgICAgPT4gJGlLaW5kLAorICAgICAgICAgICAgX1BvcyAgICAgPT4gJGlQb3MsCisgICAgICAgICAgICBfQm9vayAgICA9PiAkb0Jvb2ssCisgICAgICAgICAgICBfU2hlZXRObyA9PiAkb0Jvb2stPntTaGVldENvdW50fSwKKyAgICAgICAgICApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57U2hlZXRDb3VudH0gXSA9CisgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC0+bmV3KAorICAgICAgICAgICAgTmFtZSA9PgorICAgICAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgNyApLCAnX25hdGl2ZV8nICksCisgICAgICAgICAgICBLaW5kICAgICA9PiAkaUtpbmQsCisgICAgICAgICAgICBfUG9zICAgICA9PiAkaVBvcywKKyAgICAgICAgICAgIF9Cb29rICAgID0+ICRvQm9vaywKKyAgICAgICAgICAgIF9TaGVldE5vID0+ICRvQm9vay0+e1NoZWV0Q291bnR9LAorICAgICAgICAgICk7CisgICAgfQorICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1YkhlYWRlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIZWFkZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworICAgIG15ICRzVzsKKworICAgIGlmICggIWRlZmluZWQgJHNXayApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57SGVhZGVyfSA9IHVuZGVmOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI0JJRkY4CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgICRzVyA9IF9jb252QklGRjhTdHJpbmcoICRvQm9vaywgJHNXayApOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIZWFkZXJ9ID0KKyAgICAgICAgICAoICRzVyBlcSAiXHgwMCIgKSA/IHVuZGVmIDogJHNXOworICAgIH0KKworICAgICNCZWZvcmUgQklGRjgKKyAgICBlbHNlIHsKKyAgICAgICAgbXkgKCAkaUxlbiApID0gdW5wYWNrKCAiYyIsICRzV2sgKTsKKyAgICAgICAgJHNXID0KKyAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30tPlRleHRGbXQoIHN1YnN0ciggJHNXaywgMSwgJGlMZW4gKSwgJ19uYXRpdmVfJyApOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIZWFkZXJ9ID0KKyAgICAgICAgICAoICRzVyBlcSAiXHgwMFx4MDBceDAwIiApID8gdW5kZWYgOiAkc1c7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJGb290ZXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzMzUKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViRm9vdGVyIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKyAgICBteSAkc1c7CisKKyAgICBpZiAoICFkZWZpbmVkICRzV2sgKSB7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0Zvb3Rlcn0gPSB1bmRlZjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICNCSUZGOAorICAgIGlmICggJG9Cb29rLT57QklGRlZlcnNpb259ID49IHZlckJJRkY4ICkgeworICAgICAgICAkc1cgPSBfY29udkJJRkY4U3RyaW5nKCAkb0Jvb2ssICRzV2sgKTsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Rm9vdGVyfSA9CisgICAgICAgICAgKCAkc1cgZXEgIlx4MDAiICkgPyB1bmRlZiA6ICRzVzsKKyAgICB9CisKKyAgICAjQmVmb3JlIEJJRkY4CisgICAgZWxzZSB7CisgICAgICAgIG15ICggJGlMZW4gKSA9IHVucGFjayggImMiLCAkc1drICk7CisgICAgICAgICRzVyA9CisgICAgICAgICAgJG9Cb29rLT57Rm10Q2xhc3N9LT5UZXh0Rm10KCBzdWJzdHIoICRzV2ssIDEsICRpTGVuICksICdfbmF0aXZlXycgKTsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Rm9vdGVyfSA9CisgICAgICAgICAgKCAkc1cgZXEgIlx4MDBceDAwXHgwMCIgKSA/IHVuZGVmIDogJHNXOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViSFBhZ2VCcmVhayAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIUGFnZUJyZWFrIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIG15IEBhQnJlYWs7CisgICAgbXkgJGlDbnQgPSB1bnBhY2soICJ2IiwgJHNXayApOworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgI0JJRkY4CisgICAgaWYgKCAkb0Jvb2stPntCSUZGVmVyc2lvbn0gPj0gdmVyQklGRjggKSB7CisgICAgICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICAgICAgbXkgKCAkaVJvdywgJGlDb2xCLCAkaUNvbEUgKSA9CisgICAgICAgICAgICAgIHVucGFjayggJ3YzJywgc3Vic3RyKCAkc1drLCAyICsgJGkgKiA2LCA2ICkgKTsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpUm93LCAkaUNvbEIsICRpQ29sRV07CisgICAgICAgICAgICBwdXNoIEBhQnJlYWssICRpUm93OworICAgICAgICB9CisgICAgfQorCisgICAgI0JlZm9yZSBCSUZGOAorICAgIGVsc2UgeworICAgICAgICBmb3IgKCBteSAkaSA9IDAgOyAkaSA8ICRpQ250IDsgJGkrKyApIHsKKyAgICAgICAgICAgIG15ICggJGlSb3cgKSA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzV2ssIDIgKyAkaSAqIDIsIDIgKSApOworICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCAkaVJvdzsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpUm93LCAwLCAyNTVdOworICAgICAgICB9CisgICAgfQorICAgIEBhQnJlYWsgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQGFCcmVhazsKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntIUGFnZUJyZWFrfSA9IFxAYUJyZWFrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJWUGFnZUJyZWFrIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDQ3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlZQYWdlQnJlYWsgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgQGFCcmVhazsKKyAgICBteSAkaUNudCA9IHVucGFjayggInYiLCAkc1drICk7CisKKyAgICAjQklGRjgKKyAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA+PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgZm9yICggbXkgJGkgPSAwIDsgJGkgPCAkaUNudCA7ICRpKysgKSB7CisgICAgICAgICAgICBteSAoICRpQ29sLCAkaVJvd0IsICRpUm93RSApID0KKyAgICAgICAgICAgICAgdW5wYWNrKCAndjMnLCBzdWJzdHIoICRzV2ssIDIgKyAkaSAqIDYsIDYgKSApOworICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCAkaUNvbDsKKworICAgICAgICAgICAgIyAgICAgICAgICAgIHB1c2ggQGFCcmVhaywgWyRpQ29sLCAkaVJvd0IsICRpUm93RV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjQmVmb3JlIEJJRkY4CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICAgICAgbXkgKCAkaUNvbCApID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgMiArICRpICogMiwgMiApICk7CisgICAgICAgICAgICBwdXNoIEBhQnJlYWssICRpQ29sOworCisgICAgICAgICAgICAjICAgICAgICAgICAgcHVzaCBAYUJyZWFrLCBbJGlDb2wsIDAsIDY1NTM1XTsKKyAgICAgICAgfQorICAgIH0KKyAgICBAYUJyZWFrID0gc29ydCB7ICRhIDw9PiAkYiB9IEBhQnJlYWs7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VlBhZ2VCcmVha30gPSBcQGFCcmVhazsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViTWFyZ2luIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQMzA2LCAzNDUsIDQwMCwgNDQwCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1Yk1hcmdpbiB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAjIFRoZSAiTWVyZ2luIiBvcHRpb25zIGFyZSBhIHdvcmthcm91bmQgZm9yIGEgYmFja3dhcmQgY29tcGF0aWJsZSB0eXBvLgorCisgICAgbXkgJGRXayA9IF9jb252RHZhbCggc3Vic3RyKCAkc1drLCAwLCA4ICkgKTsKKyAgICBpZiAoICRiT3AgPT0gMHgyNiApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57TGVmdE1lcmdpbn0gPSAkZFdrOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntMZWZ0TWFyZ2lufSA9ICRkV2s7CisgICAgfQorICAgIGVsc2lmICggJGJPcCA9PSAweDI3ICkgeworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSaWdodE1lcmdpbn0gPSAkZFdrOworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntSaWdodE1hcmdpbn0gPSAkZFdrOworICAgIH0KKyAgICBlbHNpZiAoICRiT3AgPT0gMHgyOCApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VG9wTWVyZ2lufSA9ICRkV2s7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e1RvcE1hcmdpbn0gPSAkZFdrOworICAgIH0KKyAgICBlbHNpZiAoICRiT3AgPT0gMHgyOSApIHsKKyAgICAgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57Qm90dG9tTWVyZ2lufSA9ICRkV2s7CisgICAgICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0JvdHRvbU1hcmdpbn0gPSAkZFdrOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBfc3ViSGNlbnRlciAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM0MAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJIY2VudGVyIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgIG15ICRpV2sgPSB1bnBhY2soICJ2IiwgJHNXayApOworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e0hDZW50ZXJ9ID0gJGlXazsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJWY2VudGVyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDQ3CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YlZjZW50ZXIgeworICAgIG15ICggJG9Cb29rLCAkYk9wLCAkYkxlbiwgJHNXayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgJGlXayA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdLT57VkNlbnRlcn0gPSAkaVdrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJQcmludEdyaWRsaW5lcyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDM5NworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJQcmludEdyaWRsaW5lcyB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICBteSAkaVdrID0gdW5wYWNrKCAidiIsICRzV2sgKTsKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntQcmludEdyaWR9ID0gJGlXazsKKworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJQcmludEhlYWRlcnMgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzOTcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViUHJpbnRIZWFkZXJzIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgKCBkZWZpbmVkICRvQm9vay0+e19DdXJTaGVldH0gKTsKKworICAgIG15ICRpV2sgPSB1bnBhY2soICJ2IiwgJHNXayApOworICAgICRvQm9vay0+e1dvcmtzaGVldH1bICRvQm9vay0+e19DdXJTaGVldH0gXS0+e1ByaW50SGVhZGVyc30gPSAkaVdrOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJTRVRVUCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogUDQwOQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9zdWJTRVRVUCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAjIFdvcmthcm91bmQgZm9yIHNvbWUgYXBwcyBhbmQgb2xkZXIgRXhjZWxzIHRoYXQgZG9uJ3Qgd3JpdGUgYQorICAgICMgY29tcGxldGUgU0VUVVAgcmVjb3JkLgorICAgIHJldHVybiB1bmRlZiBpZiAkYkxlbiAhPSAzNDsKKworICAgIG15ICRvV2tTID0gJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57X0N1clNoZWV0fSBdOworICAgIG15ICRpR3JCaXQ7CisKKyAgICAoCisgICAgICAgICRvV2tTLT57UGFwZXJTaXplfSwgJG9Xa1MtPntTY2FsZX0sICAgICAkb1drUy0+e1BhZ2VTdGFydH0sCisgICAgICAgICRvV2tTLT57Rml0V2lkdGh9LCAgJG9Xa1MtPntGaXRIZWlnaHR9LCAkaUdyQml0LAorICAgICAgICAkb1drUy0+e1Jlc30sICAgICAgICRvV2tTLT57VlJlc30sCisgICAgKSA9IHVucGFjayggJ3Y4JywgJHNXayApOworCisgICAgJG9Xa1MtPntIZWFkZXJNYXJnaW59ID0gX2NvbnZEdmFsKCBzdWJzdHIoICRzV2ssIDE2LCA4ICkgKTsKKyAgICAkb1drUy0+e0Zvb3Rlck1hcmdpbn0gPSBfY29udkR2YWwoIHN1YnN0ciggJHNXaywgMjQsIDggKSApOworICAgICRvV2tTLT57Q29waXN9ID0gdW5wYWNrKCAndjInLCBzdWJzdHIoICRzV2ssIDMyLCAyICkgKTsKKyAgICAkb1drUy0+e0xlZnRUb1JpZ2h0fSA9ICggKCAkaUdyQml0ICYgMHgwMSApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e0xhbmRzY2FwZX0gICA9ICggKCAkaUdyQml0ICYgMHgwMiApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vUGxzfSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgwNCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vQ29sb3J9ICAgICA9ICggKCAkaUdyQml0ICYgMHgwOCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e0RyYWZ0fSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgxMCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vdGVzfSAgICAgICA9ICggKCAkaUdyQml0ICYgMHgyMCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e05vT3JpZW50fSAgICA9ICggKCAkaUdyQml0ICYgMHg0MCApID8gMSA6IDAgKTsKKyAgICAkb1drUy0+e1VzZVBhZ2V9ICAgICA9ICggKCAkaUdyQml0ICYgMHg4MCApID8gMSA6IDAgKTsKKworICAgICMgVGhlIE5vUGxzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlcyBoYXZlIG5vdCBiZWVuIHRha2VuIGZyb20gYW4KKyAgICAjIGFjdHVhbCBwcmludGVyIGFuZCB0aHVzIG1heSBub3QgYmUgYWNjdXJhdGUuCisKKyAgICAjIFNldCBkZWZhdWx0IHNjYWxlIGlmIE5vUGxzIG90aGVyd2lzZSBpdCBtYXkgYmUgYW4gaW52YWxpZCB2YWx1ZSBvZiAwWEZGLgorICAgICRvV2tTLT57U2NhbGV9ID0gMTAwIGlmICRvV2tTLT57Tm9QbHN9OworCisgICAgIyBXb3JrYXJvdW5kIGZvciBhIGJhY2t3YXJkIGNvbXBhdGlibGUgdHlwby4KKyAgICAkb1drUy0+e0hlYWRlck1lcmdpbn0gPSAkb1drUy0+e0hlYWRlck1hcmdpbn07CisgICAgJG9Xa1MtPntGb290ZXJNZXJnaW59ID0gJG9Xa1MtPntGb290ZXJNYXJnaW59OworCit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgX3N1Yk5hbWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IFAzNTAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfc3ViTmFtZSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICBteSAoCisgICAgICAgICRpR3JCaXQsICRjS2V5LCAgICAkY0NoLCAgICAkaUNjZSwgICAkaXhBbHMsCisgICAgICAgICRpVGFiLCAgICRjY2hDdXN0LCAkY2NoRHNjLCAkY2NoSGVwLCAkY2NoU3RhdHVzCisgICAgKSA9IHVucGFjayggJ3ZjMnYzYzQnLCAkc1drICk7CisKKyAgICAjQnVpbHRpbiBOYW1lICsgTGVuZ3RoID09IDEKKyAgICBpZiAoICggJGlHckJpdCAmIDB4MjAgKSAmJiAoICRjQ2ggPT0gMSApICkgeworCisgICAgICAgICNCSUZGOAorICAgICAgICBpZiAoICRvQm9vay0+e0JJRkZWZXJzaW9ufSA+PSB2ZXJCSUZGOCApIHsKKyAgICAgICAgICAgIG15ICRpTmFtZSAgPSB1bnBhY2soICduJywgc3Vic3RyKCAkc1drLCAxNCApICk7CisgICAgICAgICAgICBteSAkaVNoZWV0ID0gdW5wYWNrKCAndicsIHN1YnN0ciggJHNXaywgOCApICkgLSAxOworCisgICAgICAgICAgICAjIFdvcmthcm91bmQgZm9yIG1hbC1mb3JtZWQgRXhjZWwgd29ya2Jvb2tzIHdoZXJlIFByaW50X1RpdGxlIGlzCisgICAgICAgICAgICAjIHNldCBhcyBHbG9iYWwgKGkuZS4gaXRhYiA9IDApLiBOb3RlLCB0aGlzIHdpbGwgaGF2ZSB0byBiZQorICAgICAgICAgICAgIyB0cmVhdGVkIGRpZmZlcmVudGx5IHdoZW4gd2UgZ2V0IGFyb3VuZCB0byBoYW5kbGluZyBnbG9iYWwgbmFtZXMuCisgICAgICAgICAgICByZXR1cm4gdW5kZWYgaWYgJGlTaGVldCA9PSAtMTsKKworICAgICAgICAgICAgaWYgKCAkaU5hbWUgPT0gNiApIHsgICAgI1ByaW50QXJlYQorICAgICAgICAgICAgICAgIG15ICggJGlTaGVldFcsICRyYUFyZWEgKSA9IF9QYXJzZU5hbWVBcmVhKCBzdWJzdHIoICRzV2ssIDE2ICkgKTsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdID0gJHJhQXJlYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJGlOYW1lID09IDcgKSB7ICAgICNUaXRsZQorICAgICAgICAgICAgICAgIG15ICggJGlTaGVldFcsICRyYUFyZWEgKSA9IF9QYXJzZU5hbWVBcmVhKCBzdWJzdHIoICRzV2ssIDE2ICkgKTsKKyAgICAgICAgICAgICAgICBteSBAYVR0bFIgPSAoKTsKKyAgICAgICAgICAgICAgICBteSBAYVR0bEMgPSAoKTsKKyAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRyYUkgKCBAJHJhQXJlYSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkcmFJLT5bM10gPT0gMHhGRiApIHsgICAgI1JvdyBUaXRsZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAYVR0bFIsIFsgJHJhSS0+WzBdLCAkcmFJLT5bMl0gXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAjQ29sIFRpdGxlCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBhVHRsQywgWyAkcmFJLT5bMV0sICRyYUktPlszXSBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRvQm9vay0+e1ByaW50VGl0bGV9WyRpU2hlZXRdID0KKyAgICAgICAgICAgICAgICAgIHsgUm93ID0+IFxAYVR0bFIsIENvbHVtbiA9PiBcQGFUdGxDIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkaU5hbWUgPSB1bnBhY2soICdjJywgc3Vic3RyKCAkc1drLCAxNCApICk7CisgICAgICAgICAgICBpZiAoICRpTmFtZSA9PSA2ICkgeyAgICAgICAgICAgICAgICAgICNQcmludEFyZWEKKyAgICAgICAgICAgICAgICBteSAoICRpU2hlZXQsICRyYUFyZWEgKSA9CisgICAgICAgICAgICAgICAgICBfUGFyc2VOYW1lQXJlYTk1KCBzdWJzdHIoICRzV2ssIDE1ICkgKTsKKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdID0gJHJhQXJlYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJGlOYW1lID09IDcgKSB7ICAgICAgICAgICAgICAgI1RpdGxlCisgICAgICAgICAgICAgICAgbXkgKCAkaVNoZWV0LCAkcmFBcmVhICkgPQorICAgICAgICAgICAgICAgICAgX1BhcnNlTmFtZUFyZWE5NSggc3Vic3RyKCAkc1drLCAxNSApICk7CisgICAgICAgICAgICAgICAgbXkgQGFUdGxSID0gKCk7CisgICAgICAgICAgICAgICAgbXkgQGFUdGxDID0gKCk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkcmFJICggQCRyYUFyZWEgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHJhSS0+WzNdID09IDB4RkYgKSB7ICAgICNSb3cgVGl0bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQGFUdGxSLCBbICRyYUktPlswXSwgJHJhSS0+WzJdIF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgI0NvbCBUaXRsZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAYVR0bEMsIFsgJHJhSS0+WzFdLCAkcmFJLT5bM10gXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkb0Jvb2stPntQcmludFRpdGxlfVskaVNoZWV0XSA9CisgICAgICAgICAgICAgICAgICB7IFJvdyA9PiBcQGFUdGxSLCBDb2x1bW4gPT4gXEBhVHRsQyB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlTmFtZUFyZWEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IDQ5NCAocHRnQXJlYWQzZCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBfUGFyc2VOYW1lQXJlYSB7CisgICAgbXkgKCAkc09iaiApID0gQF87CisgICAgbXkgKCAkaU9wICk7CisgICAgbXkgQGFSZXMgPSAoKTsKKyAgICAkaU9wID0gdW5wYWNrKCAnQycsICRzT2JqICk7CisgICAgbXkgJGlTaGVldDsKKyAgICBpZiAoICRpT3AgPT0gMHgzYiApIHsKKyAgICAgICAgbXkgKCAkaVdrUywgJGlScywgJGlSZSwgJGlDcywgJGlDZSApID0KKyAgICAgICAgICB1bnBhY2soICd2NScsIHN1YnN0ciggJHNPYmosIDEgKSApOworICAgICAgICAkaVNoZWV0ID0gJGlXa1M7CisgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgIH0KKyAgICBlbHNpZiAoICRpT3AgPT0gMHgyOSApIHsKKyAgICAgICAgbXkgJGlMZW4gPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc09iaiwgMSwgMiApICk7CisgICAgICAgIG15ICRpU3QgPSAwOworICAgICAgICB3aGlsZSAoICRpU3QgPCAkaUxlbiApIHsKKyAgICAgICAgICAgIG15ICggJGlPcFcsICRpV2tTLCAkaVJzLCAkaVJlLCAkaUNzLCAkaUNlICkgPQorICAgICAgICAgICAgICB1bnBhY2soICdjdjUnLCBzdWJzdHIoICRzT2JqLCAkaVN0ICsgMywgMTEgKSApOworCisgICAgICAgICAgICBpZiAoICRpT3BXID09IDB4M2IgKSB7CisgICAgICAgICAgICAgICAgJGlTaGVldCA9ICRpV2tTOworICAgICAgICAgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoICRpU3QgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAkaVN0ICs9IDExOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGlTdCArPSAxMjsgICAgI1NraXAgMSBieXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoICRpU2hlZXQsIFxAYVJlcyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlTmFtZUFyZWE5NSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKSBESzogNDk0IChwdGdBcmVhZDNkKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9QYXJzZU5hbWVBcmVhOTUgeworICAgIG15ICggJHNPYmogKSA9IEBfOworICAgIG15ICggJGlPcCApOworICAgIG15IEBhUmVzID0gKCk7CisgICAgJGlPcCA9IHVucGFjayggJ0MnLCAkc09iaiApOworICAgIG15ICRpU2hlZXQ7CisgICAgaWYgKCAkaU9wID09IDB4M2IgKSB7CisgICAgICAgICRpU2hlZXQgPSB1bnBhY2soICd2Jywgc3Vic3RyKCAkc09iaiwgMTEsIDIgKSApOworICAgICAgICBteSAoICRpUnMsICRpUmUsICRpQ3MsICRpQ2UgKSA9CisgICAgICAgICAgdW5wYWNrKCAndjJDMicsIHN1YnN0ciggJHNPYmosIDE1LCA2ICkgKTsKKyAgICAgICAgcHVzaCBAYVJlcywgWyAkaVJzLCAkaUNzLCAkaVJlLCAkaUNlIF07CisgICAgfQorICAgIGVsc2lmICggJGlPcCA9PSAweDI5ICkgeworICAgICAgICBteSAkaUxlbiA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzT2JqLCAxLCAyICkgKTsKKyAgICAgICAgbXkgJGlTdCA9IDA7CisgICAgICAgIHdoaWxlICggJGlTdCA8ICRpTGVuICkgeworICAgICAgICAgICAgbXkgJGlPcFcgPSB1bnBhY2soICdjJywgc3Vic3RyKCAkc09iaiwgJGlTdCArIDMsIDYgKSApOworICAgICAgICAgICAgJGlTaGVldCA9IHVucGFjayggJ3YnLCBzdWJzdHIoICRzT2JqLCAkaVN0ICsgMTQsIDIgKSApOworICAgICAgICAgICAgbXkgKCAkaVJzLCAkaVJlLCAkaUNzLCAkaUNlICkgPQorICAgICAgICAgICAgICB1bnBhY2soICd2MkMyJywgc3Vic3RyKCAkc09iaiwgJGlTdCArIDE4LCA2ICkgKTsKKyAgICAgICAgICAgIHB1c2ggQGFSZXMsIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdIGlmICggJGlPcFcgPT0gMHgzYiApOworCisgICAgICAgICAgICBpZiAoICRpU3QgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAkaVN0ICs9IDIxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGlTdCArPSAyMjsgICAgI1NraXAgMSBieXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoICRpU2hlZXQsIFxAYVJlcyApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJCT09MIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQNDUyCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1YldTQk9PTCB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntQYWdlRml0fSA9CisgICAgICAoICggdW5wYWNrKCAndicsICRzV2sgKSAmIDB4MTAwICkgPyAxIDogMCApOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9zdWJNZXJnZUFyZWEgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkgREs6IChOb3QpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX3N1Yk1lcmdlQXJlYSB7CisgICAgbXkgKCAkb0Jvb2ssICRiT3AsICRiTGVuLCAkc1drICkgPSBAXzsKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzICggZGVmaW5lZCAkb0Jvb2stPntfQ3VyU2hlZXR9ICk7CisKKyAgICBteSAkaUNudCA9IHVucGFjayggInYiLCAkc1drICk7CisgICAgbXkgJG9Xa1MgPSAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF07CisgICAgJG9Xa1MtPntNZXJnZWRBcmVhfSA9IFtdIHVubGVzcyAoIGRlZmluZWQgJG9Xa1MtPntNZXJnZWRBcmVhfSApOworICAgIGZvciAoIG15ICRpID0gMCA7ICRpIDwgJGlDbnQgOyAkaSsrICkgeworICAgICAgICBteSAoICRpUnMsICRpUmUsICRpQ3MsICRpQ2UgKSA9CisgICAgICAgICAgdW5wYWNrKCAndjQnLCBzdWJzdHIoICRzV2ssICRpICogOCArIDIsIDggKSApOworICAgICAgICBmb3IgKCBteSAkaVIgPSAkaVJzIDsgJGlSIDw9ICRpUmUgOyAkaVIrKyApIHsKKyAgICAgICAgICAgIGZvciAoIG15ICRpQyA9ICRpQ3MgOyAkaUMgPD0gJGlDZSA7ICRpQysrICkgeworICAgICAgICAgICAgICAgICRvV2tTLT57Q2VsbHN9WyRpUl1bJGlDXS0+e01lcmdlZH0gPSAxCisgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntDZWxsc31bJGlSXVskaUNdICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcHVzaCBAeyAkb1drUy0+e01lcmdlZEFyZWF9IH0sIFsgJGlScywgJGlDcywgJGlSZSwgJGlDZSBdOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBEZWNvZGVCb29sRXJyIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpIERLOiBQMzA2CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgRGVjb2RlQm9vbEVyciB7CisgICAgbXkgKCAkaVZhbCwgJGlGbGcgKSA9IEBfOworICAgIGlmICggJGlGbGcgKSB7ICAgICMgRVJST1IKKyAgICAgICAgaWYgKCAkaVZhbCA9PSAweDAwICkgeworICAgICAgICAgICAgcmV0dXJuICIjTlVMTCEiOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGlWYWwgPT0gMHgwNyApIHsKKyAgICAgICAgICAgIHJldHVybiAiI0RJVi8wISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDBGICkgeworICAgICAgICAgICAgcmV0dXJuICIjVkFMVUUhIjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpVmFsID09IDB4MTcgKSB7CisgICAgICAgICAgICByZXR1cm4gIiNSRUYhIjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpVmFsID09IDB4MUQgKSB7CisgICAgICAgICAgICByZXR1cm4gIiNOQU1FPyI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDI0ICkgeworICAgICAgICAgICAgcmV0dXJuICIjTlVNISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaVZhbCA9PSAweDJBICkgeworICAgICAgICAgICAgcmV0dXJuICIjTi9BISI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIiNFUlIiOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKCAkaVZhbCApID8gIlRSVUUiIDogIkZBTFNFIjsKKyAgICB9Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2RlY29kZV9ya19udW1iZXIoKQorIworIyBDb252ZXJ0IGFuIGVuY29kZWQgUksgbnVtYmVyIGludG8gYSByZWFsIG51bWJlci4gVGhlIFJLIGVuY29kaW5nIGlzCisjIGV4cGxhaW5lZCBpbiBzb21lIGRldGFpbCBpbiB0aGUgTVMgZG9jcy4gSXQgaXMgYSB3YXkgb2Ygc3RvcmluZyBhcHBsaWNhYmxlCisjIGludHMgYW5kIGRvdWJsZXMgaW4gMzJiaXRzICgzMCBkYXRhICsgMiBpbmZvIGJpdHMpIGluIG9yZGVyIHRvIHNhdmUgc3BhY2UuCisjCitzdWIgX2RlY29kZV9ya19udW1iZXIgeworCisgICAgbXkgJHJrX251bWJlciA9IHNoaWZ0OworICAgIG15ICRudW1iZXI7CisKKyAgICAjIENoZWNrIHRoZSBtYWluIFJLIHR5cGUuCisgICAgaWYgKCAkcmtfbnVtYmVyICYgMHgwMiApIHsKKworICAgICAgICAjIFJLIFR5cGUgMiBhbmQgNCwgYSBwYWNrZWQgaW50ZWdlci4KKworICAgICAgICAjIFNoaWZ0IG9mZiB0aGUgaW5mbyBiaXRzLgorICAgICAgICAkbnVtYmVyID0gJHJrX251bWJlciA+PiAyOworCisgICAgICAgICMgQ29udmVydCBmcm9tIHVuc2lnbmVkIHRvIHNpZ25lZCBpZiByZXF1aXJlZC4KKyAgICAgICAgJG51bWJlciAtPSAweDQwMDAwMDAwIGlmICRudW1iZXIgJiAweDIwMDAwMDAwOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFJLIFR5cGUgMSBhbmQgMywgYSB0cnVuY2F0ZWQgSUVFRSBEb3VibGUuCisKKyAgICAgICAgIyBQYWNrIHRoZSBSSyBudW1iZXIgaW50byB0aGUgaGlnaCAzMCBiaXRzIG9mIGFuIElFRUUgZG91YmxlLgorICAgICAgICAkbnVtYmVyID0gcGFjayAiVlYiLCAweDAwMDAsICRya19udW1iZXIgJiAweEZGRkZGRkZDOworCisgICAgICAgICMgUmV2ZXJzZSB0aGUgcGFja2VkIElFRUUgZG91YmxlIG9uIGJpZy1lbmRpYW4gbWFjaGluZXMuCisgICAgICAgICRudW1iZXIgPSByZXZlcnNlICRudW1iZXIgaWYgJEJJR0VORElBTjsKKworICAgICAgICAjIFVucGFjayB0aGUgbnVtYmVyLgorICAgICAgICAkbnVtYmVyID0gdW5wYWNrICJkIiwgJG51bWJlcjsKKyAgICB9CisKKyAgICAjIFJLIFR5cGVzIDMgYW5kIDQgd2VyZSBtdWx0aXBsaWVkIGJ5IDEwMCBwcmlvciB0byBlbmNvZGluZy4KKyAgICAkbnVtYmVyIC89IDEwMCBpZiAkcmtfbnVtYmVyICYgMHgwMTsKKworICAgIHJldHVybiAkbnVtYmVyOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJTdHJXaygpCisjCisjIEV4dHJhY3QgdGhlIHdvcmtib29rIHN0cmluZ3MgZnJvbSB0aGUgU1NUIChTaGFyZWQgU3RyaW5nIFRhYmxlKSByZWNvcmQgYW5kCisjIGFueSBmb2xsb3dpbmcgQ09OVElOVUUgcmVjb3Jkcy4KKyMKKyMgVGhlIHdvcmtib29rIHN0cmluZ3MgYXJlIGluaXRpYWxseSBjb250YWluZWQgaW4gdGhlIFNTVCBibG9jayBidXQgbWF5IGFsc28KKyMgb2NjdXB5IG9uZSBvciBtb3JlIENPTlRJTlVFIGJsb2Nrcy4gUmVhZGluZyB0aGUgQ09OVElOVUUgYmxvY2tzIGlzIG1hZGUgYQorIyBsaXR0bGUgdHJpY2t5IGJ5IHRoZSBmYWN0IHRoYXQgdGhleSBjYW4gY29udGFpbiBhbiBhZGRpdGlvbmFsIGluaXRpYWwgYnl0ZQorIyBpZiBhIHN0cmluZyBpcyBjb250aW51ZWQgZnJvbSBhIHByZXZpb3VzIGJsb2NrLgorIworIyBQYXJzaW5nIGlzIGZ1cnRoZXIgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgY29udGludWVkIHNlY3Rpb24gb2YgdGhlCisjIHN0cmluZyBtYXkgaGF2ZSBhIGRpZmZlcmVudCBlbmNvZGluZyAoQVNDSUkgb3IgVVRGLTgpIGZyb20gdGhlIHByZXZpb3VzCisjIHNlY3Rpb24uIEV4Y2VsIGRvZXMgdGhpcyB0byBzYXZlIHNwYWNlLgorIworc3ViIF9zdWJTdHJXayB7CisKKyAgICBteSAoICRzZWxmLCAkYmlmZl9kYXRhLCAkaXNfY29udGludWUgKSA9IEBfOworCisgICAgaWYgKCAkaXNfY29udGludWUgKSB7CisKKyAgICAgICAgIyBXZSBhcmUgcmVhZGluZyBhIENPTlRJTlVFIHJlY29yZC4KKworICAgICAgICBpZiAoICRzZWxmLT57X2J1ZmZlcn0gZXEgJycgKSB7CisKKyAgICAgICAgICAgICMgQSBDT05USU5VRSBibG9jayB3aXRoIG5vIHByZXZpb3VzIFNTVC4KKyAgICAgICAgICAgICRzZWxmLT57X2J1ZmZlcn0gLj0gJGJpZmZfZGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICFkZWZpbmVkICRzZWxmLT57X3N0cmluZ19jb250aW51ZWR9ICkgeworCisgICAgICAgICAgICAjIFRoZSBDT05USU5VRSBibG9jayBzdGFydHMgd2l0aCBhIG5ldyAobm9uLWNvbnRpbnVlZCkgc3RyaW5nLgorCisgICAgICAgICAgICAjIFN0cmlwIHRoZSBHcmJpdCBieXRlIGFuZCBzdG9yZSB0aGUgc3RyaW5nIGRhdGEuCisgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49IHN1YnN0ciAkYmlmZl9kYXRhLCAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAjIEEgQ09OVElOVUUgYmxvY2sgdGhhdCBzdGFydHMgd2l0aCBhIGNvbnRpbnVlZCBzdHJpbmcuCisKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IGJ5dGUgKEdyYml0KSBvZiB0aGUgQ09OVElOVUUgcmVjb3JkIGluZGljYXRlcyBpZiAoMCkKKyAgICAgICAgICAgICMgdGhlIGNvbnRpbnVlZCBzdHJpbmcgc2VjdGlvbiBpcyBzaW5nbGUgYnl0ZXMgb3IgKDEpIGRvdWJsZSBieXRlcy4KKyAgICAgICAgICAgIG15ICRncmJpdCA9IG9yZCAkYmlmZl9kYXRhOworCisgICAgICAgICAgICBteSAoICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoICkgPSBAeyAkc2VsZi0+e19wcmV2aW91c19pbmZvfSB9OworICAgICAgICAgICAgbXkgJGJ1ZmZfbGVuZ3RoID0gbGVuZ3RoICRzZWxmLT57X2J1ZmZlcn07CisKKyAgICAgICAgICAgIGlmICggJGJ1ZmZfbGVuZ3RoID49ICggJHN0cl9wb3NpdGlvbiArICRzdHJfbGVuZ3RoICkgKSB7CisKKyAgICAgICAgICAgICAgICAjIE5vdCBpbiBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49ICRiaWZmX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICggJHNlbGYtPntfc3RyaW5nX2NvbnRpbnVlZH0gJiAweDAxICkgPT0gKCAkZ3JiaXQgJiAweDAxICkgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgIyBTYW1lIGVuY29kaW5nIGFzIHRoZSBwcmV2aW91cyBibG9jayBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgICAgICRzZWxmLT57X2J1ZmZlcn0gLj0gc3Vic3RyKCAkYmlmZl9kYXRhLCAxICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgICMgRGlmZmVyZW50IGVuY29kaW5nIHRvIHRoZSBwcmV2aW91cyBibG9jayBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgICAgIGlmICggJGdyYml0ICYgMHgwMSApIHsKKworICAgICAgICAgICAgICAgICAgICAjIEN1cnJlbnQgYmxvY2sgaXMgVVRGLTE2LCBwcmV2aW91cyB3YXMgQVNDSUkuCisgICAgICAgICAgICAgICAgICAgIG15ICggdW5kZWYsICRjY2ggKSA9IHVucGFjayAndmMnLCAkc2VsZi0+e19idWZmZXJ9OworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRzZWxmLT57X2J1ZmZlcn0sIDIsIDEgKSA9IHBhY2soICdDJywgJGNjaCB8IDB4MDEgKTsKKworICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgdGhlIHByZXZpb3VzIEFTQ0lJLCBzaW5nbGUgY2hhcmFjdGVyLCBwb3J0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICMgdGhlIHN0cmluZyBpbnRvIGEgZG91YmxlIGNoYXJhY3RlciBVVEYtMTYgc3RyaW5nIGJ5CisgICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0aW5nIHplcm8gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIGZvciAoCisgICAgICAgICAgICAgICAgICAgICAgICBteSAkaSA9ICggJGJ1ZmZfbGVuZ3RoIC0gJHN0cl9wb3NpdGlvbiApIDsKKyAgICAgICAgICAgICAgICAgICAgICAgICRpID49IDEgOworICAgICAgICAgICAgICAgICAgICAgICAgJGktLQorICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkc2VsZi0+e19idWZmZXJ9LCAkc3RyX3Bvc2l0aW9uICsgJGksIDAgKSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwIjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICMgQ3VycmVudCBibG9jayBpcyBBU0NJSSwgcHJldmlvdXMgd2FzIFVURi0xNi4KKworICAgICAgICAgICAgICAgICAgICAjIENvbnZlcnQgdGhlIGN1cnJlbnQgQVNDSUksIHNpbmdsZSBjaGFyYWN0ZXIsIHBvcnRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgc3RyaW5nIGludG8gYSBkb3VibGUgY2hhcmFjdGVyIFVURi0xNiBzdHJpbmcgYnkKKyAgICAgICAgICAgICAgICAgICAgIyBpbnNlcnRpbmcgbnVsbCBieXRlcy4KKyAgICAgICAgICAgICAgICAgICAgbXkgJGNoYW5nZV9sZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICggJHN0cl9wb3NpdGlvbiArICRzdHJfbGVuZ3RoICkgLSAkYnVmZl9sZW5ndGg7CisKKyAgICAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgdGhlIGN1cnJlbnQgQ09OVElOVUUgcmVjb3JkIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIG15ICRiaWZmX2xlbmd0aCA9IGxlbmd0aCAkYmlmZl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgICMgUmVzdHJpY3QgdGhlIHBvcnRpb24gdG8gYmUgY2hhbmdlZCB0byB0aGUgY3VycmVudCBibG9jaworICAgICAgICAgICAgICAgICAgICAjIGlmIHRoZSBzdHJpbmcgZXh0ZW5kcyBvdmVyIG1vcmUgdGhhbiBvbmUgYmxvY2suCisgICAgICAgICAgICAgICAgICAgIGlmICggJGNoYW5nZV9sZW5ndGggPiAoICRiaWZmX2xlbmd0aCAtIDEgKSAqIDIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkY2hhbmdlX2xlbmd0aCA9ICggJGJpZmZfbGVuZ3RoIC0gMSApICogMjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICMgSW5zZXJ0IHRoZSBudWxsIGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICBmb3IgKCBteSAkaSA9ICggJGNoYW5nZV9sZW5ndGggLyAyICkgOyAkaSA+PSAxIDsgJGktLSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGJpZmZfZGF0YSwgJGkgKyAxLCAwICkgPSAiXHgwMCI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICMgU3RyaXAgdGhlIEdyYml0IGJ5dGUgYW5kIHN0b3JlIHRoZSBzdHJpbmcgZGF0YS4KKyAgICAgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9IC49IHN1YnN0ciAkYmlmZl9kYXRhLCAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgTm90IGEgQ09OVElOVUUgYmxvY2sgdGhlcmVmb3JlIGFuIFNTVCBibG9jay4KKyAgICAgICAgJHNlbGYtPntfYnVmZmVyfSAuPSAkYmlmZl9kYXRhOworICAgIH0KKworICAgICMgUmVzZXQgdGhlIHN0YXRlIHZhcmlhYmxlcy4KKyAgICAkc2VsZi0+e19zdHJpbmdfY29udGludWVkfSA9IHVuZGVmOworICAgICRzZWxmLT57X3ByZXZpb3VzX2luZm99ICAgID0gdW5kZWY7CisKKyAgICAjIEV4dHJhY3Qgb3V0IGFueSBmdWxsIHN0cmluZ3MgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgbGVhdmluZyBiZWhpbmQgYQorICAgICMgcGFydGlhbCBzdHJpbmcgdGhhdCBpcyBjb250aW51ZWQgaW50byB0aGUgbmV4dCBibG9jaywgb3IgYW4gZW1wdHkKKyAgICAjIGJ1ZmZlciBpcyBubyBzdHJpbmcgaXMgY29udGludWVkLgorICAgIHdoaWxlICggbGVuZ3RoICRzZWxmLT57X2J1ZmZlcn0gPj0gNCApIHsKKyAgICAgICAgbXkgKCAkc3RyX2luZm8sICRsZW5ndGgsICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoICkgPQorICAgICAgICAgIF9jb252QklGRjhTdHJpbmcoICRzZWxmLCAkc2VsZi0+e19idWZmZXJ9LCAxICk7CisKKyAgICAgICAgaWYgKCBkZWZpbmVkICRzdHJfaW5mby0+WzBdICkgeworICAgICAgICAgICAgcHVzaCBAeyAkc2VsZi0+e1BrZ1N0cn0gfSwKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJHN0cl9pbmZvLT5bMF0sCisgICAgICAgICAgICAgICAgVW5pY29kZSA9PiAkc3RyX2luZm8tPlsxXSwKKyAgICAgICAgICAgICAgICBSaWNoICAgID0+ICRzdHJfaW5mby0+WzJdLAorICAgICAgICAgICAgICAgIEV4dCAgICAgPT4gJHN0cl9pbmZvLT5bM10sCisgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAkc2VsZi0+e19idWZmZXJ9ID0gc3Vic3RyKCAkc2VsZi0+e19idWZmZXJ9LCAkbGVuZ3RoICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkc2VsZi0+e19zdHJpbmdfY29udGludWVkfSA9ICRzdHJfaW5mby0+WzFdOworICAgICAgICAgICAgJHNlbGYtPntfcHJldmlvdXNfaW5mb30gPSBbICRzdHJfcG9zaXRpb24sICRzdHJfbGVuZ3RoIF07CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9Td2FwRm9yVW5pY29kZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIF9Td2FwRm9yVW5pY29kZSB7CisgICAgbXkgKCAkc09iaiApID0gQF87CisKKyAgICAjICAgIGZvcihteSAkaSA9IDA7ICRpPGxlbmd0aCgkJHNPYmopOyAkaSs9Mil7CisgICAgZm9yICggbXkgJGkgPSAwIDsgJGkgPCAoIGludCggbGVuZ3RoKCAkJHNPYmogKSAvIDIgKSAqIDIgKSA7ICRpICs9IDIgKSB7CisgICAgICAgIG15ICRzSXQgPSBzdWJzdHIoICQkc09iaiwgJGksIDEgKTsKKyAgICAgICAgc3Vic3RyKCAkJHNPYmosICRpLCAxICkgPSBzdWJzdHIoICQkc09iaiwgJGkgKyAxLCAxICk7CisgICAgICAgIHN1YnN0ciggJCRzT2JqLCAkaSArIDEsIDEgKSA9ICRzSXQ7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIF9OZXdDZWxsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgX05ld0NlbGwgeworICAgIG15ICggJG9Cb29rLCAkaVIsICRpQywgJXJoS2V5ICkgPSBAXzsKKyAgICBteSAoICRzV2ssICRpTGVuICk7CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rLT57X0N1clNoZWV0fSApOworCisgICAgbXkgJEZtdENsYXNzID0gJG9Cb29rLT57Rm10Q2xhc3N9OworICAgICRyaEtleXtUeXBlfSA9CisgICAgICAkRm10Q2xhc3MtPkNoa1R5cGUoICRyaEtleXtOdW1lcmljfSwgJHJoS2V5e0Zvcm1hdH17Rm10SWR4fSApOworICAgIG15ICRGbXRTdHIgPSAkb0Jvb2stPntGb3JtYXRTdHJ9eyAkcmhLZXl7Rm9ybWF0fXtGbXRJZHh9IH07CisKKyAgICAjIFNldCAiRGF0ZSIgdHlwZSBpZiByZXF1aXJlZCBmb3IgbnVtYmVycyBpbiBhIE11bFJLIEJJRkYgYmxvY2suCisgICAgaWYgKCBkZWZpbmVkICRGbXRTdHIgJiYgJHJoS2V5e1R5cGV9IGVxICJOdW1lcmljIiApIHsKKworICAgICAgICAjIE1hdGNoIGEgcmFuZ2Ugb2YgcG9zc2libGUgZGF0ZSBmb3JtYXRzLiBOb3RlOiB0aGlzIGlzbid0IGltcG9ydGFudAorICAgICAgICAjIGV4Y2VwdCBmb3IgcmVwb3J0aW5nLiBUaGUgbnVtYmVyIHdpbGwgc3RpbGwgYmUgY29udmVydGVkIHRvIGEgZGF0ZQorICAgICAgICAjIGJ5IEV4Y2VsRm10KCkgZXZlbiBpZiAnVHlwZScgaXNuJ3Qgc2V0IHRvICdEYXRlJy4KKyAgICAgICAgaWYgKCAkRm10U3RyID1+IG17XltkbXldWy1cXC9kbXldKiR9aSApIHsKKyAgICAgICAgICAgICRyaEtleXtUeXBlfSA9ICJEYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG15ICRvQ2VsbCA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsLT5uZXcoCisgICAgICAgIFZhbCAgICAgID0+ICRyaEtleXtWYWx9LAorICAgICAgICBGb3JtYXRObyA9PiAkcmhLZXl7Rm9ybWF0Tm99LAorICAgICAgICBGb3JtYXQgICA9PiAkcmhLZXl7Rm9ybWF0fSwKKyAgICAgICAgQ29kZSAgICAgPT4gJHJoS2V5e0NvZGV9LAorICAgICAgICBUeXBlICAgICA9PiAkcmhLZXl7VHlwZX0sCisgICAgKTsKKyAgICAkb0NlbGwtPntfS2luZH0gPSAkcmhLZXl7S2luZH07CisgICAgJG9DZWxsLT57X1ZhbHVlfSA9ICRGbXRDbGFzcy0+VmFsRm10KCAkb0NlbGwsICRvQm9vayApOworICAgIGlmICggJHJoS2V5e1JpY2h9ICkgeworICAgICAgICBteSBAYVJpY2ggPSAoKTsKKyAgICAgICAgbXkgJHNSaWNoID0gJHJoS2V5e1JpY2h9OworICAgICAgICBmb3IgKCBteSAkaVdrID0gMCA7ICRpV2sgPCBsZW5ndGgoICRzUmljaCApIDsgJGlXayArPSA0ICkgeworICAgICAgICAgICAgbXkgKCAkaVBvcywgJGlGbnQgKSA9IHVucGFjayggJ3YyJywgc3Vic3RyKCAkc1JpY2gsICRpV2sgKSApOworICAgICAgICAgICAgcHVzaCBAYVJpY2gsIFsgJGlQb3MsICRvQm9vay0+e0ZvbnR9WyRpRm50XSBdOworICAgICAgICB9CisgICAgICAgICRvQ2VsbC0+e1JpY2h9ID0gXEBhUmljaDsKKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgJF9DZWxsSGFuZGxlciApIHsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRfT2JqZWN0ICkgeworICAgICAgICAgICAgbm8gc3RyaWN0OworICAgICAgICAgICAgcmVmKCAkX0NlbGxIYW5kbGVyICkgZXEgIkNPREUiCisgICAgICAgICAgICAgID8gJF9DZWxsSGFuZGxlci0+KAorICAgICAgICAgICAgICAgICRfT2JqZWN0LCAkb0Jvb2ssICRvQm9vay0+e19DdXJTaGVldH0sICRpUiwgJGlDLCAkb0NlbGwKKyAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICA6ICRfQ2VsbEhhbmRsZXItPmNhbGxiYWNrKCAkX09iamVjdCwgJG9Cb29rLCAkb0Jvb2stPntfQ3VyU2hlZXR9LAorICAgICAgICAgICAgICAgICRpUiwgJGlDLCAkb0NlbGwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRfQ2VsbEhhbmRsZXItPiggJG9Cb29rLCAkb0Jvb2stPntfQ3VyU2hlZXR9LCAkaVIsICRpQywgJG9DZWxsICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdW5sZXNzICggJF9Ob3RTZXRDZWxsICkgeworICAgICAgICAkb0Jvb2stPntXb3Jrc2hlZXR9WyAkb0Jvb2stPntfQ3VyU2hlZXR9IF0tPntDZWxsc31bJGlSXVskaUNdID0gJG9DZWxsOworICAgIH0KKyAgICByZXR1cm4gJG9DZWxsOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbG9ySWR4VG9SR0IgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMKKyMgVE9ETyBKTU4gTWFrZSB0aGlzIGEgV29ya2Jvb2sgbWV0aG9kIGFuZCByZS1kb2N1bWVudC4KKyMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBDb2xvcklkeFRvUkdCIHsKKyAgICBteSAoICRzUGtnLCAkaUlkeCApID0gQF87CisgICAgcmV0dXJuICggKCBkZWZpbmVkICRhQ29sb3JbJGlJZHhdICkgPyAkYUNvbG9yWyRpSWR4XSA6ICRhQ29sb3JbMF0gKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGVycm9yKCkuCisjCisjIFJldHVybiBhbiBlcnJvciBzdHJpbmcgZm9yIGEgZmFpbGVkIHBhcnNlKCkuCisjCitzdWIgZXJyb3IgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRwYXJzZV9lcnJvciA9ICRzZWxmLT57X2Vycm9yX3N0YXR1c307CisKKyAgICBpZiAoIGV4aXN0cyAkZXJyb3Jfc3RyaW5nc3skcGFyc2VfZXJyb3J9ICkgeworICAgICAgICByZXR1cm4gJGVycm9yX3N0cmluZ3N7JHBhcnNlX2Vycm9yfTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAnVW5rbm93biBwYXJzZSBlcnJvcic7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZXJyb3JfY29kZSgpLgorIworIyBSZXR1cm4gYW4gZXJyb3IgY29kZSBmb3IgYSBmYWlsZWQgcGFyc2UoKS4KKyMKK3N1YiBlcnJvcl9jb2RlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfZXJyb3Jfc3RhdHVzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqUGFyc2UgPSAqcGFyc2U7Cit9CisKKzE7CisKK19fRU5EX18KKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgLSBSZWFkIGluZm9ybWF0aW9uIGZyb20gYW4gRXhjZWwgZmlsZS4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworCisgICAgbXkgJHBhcnNlciAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdCb29rMS54bHMnKTsKKworICAgIGlmICggIWRlZmluZWQgJHdvcmtib29rICkgeworICAgICAgICBkaWUgJHBhcnNlci0+ZXJyb3IoKSwgIi5cbiI7CisgICAgfQorCisgICAgZm9yIG15ICR3b3Jrc2hlZXQgKCAkd29ya2Jvb2stPndvcmtzaGVldHMoKSApIHsKKworICAgICAgICBteSAoICRyb3dfbWluLCAkcm93X21heCApID0gJHdvcmtzaGVldC0+cm93X3JhbmdlKCk7CisgICAgICAgIG15ICggJGNvbF9taW4sICRjb2xfbWF4ICkgPSAkd29ya3NoZWV0LT5jb2xfcmFuZ2UoKTsKKworICAgICAgICBmb3IgbXkgJHJvdyAoICRyb3dfbWluIC4uICRyb3dfbWF4ICkgeworICAgICAgICAgICAgZm9yIG15ICRjb2wgKCAkY29sX21pbiAuLiAkY29sX21heCApIHsKKworICAgICAgICAgICAgICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoICRyb3csICRjb2wgKTsKKyAgICAgICAgICAgICAgICBuZXh0IHVubGVzcyAkY2VsbDsKKworICAgICAgICAgICAgICAgIHByaW50ICJSb3csIENvbCAgICA9ICgkcm93LCAkY29sKVxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiVmFsdWUgICAgICAgPSAiLCAkY2VsbC0+dmFsdWUoKSwgICAgICAgIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiVW5mb3JtYXR0ZWQgPSAiLCAkY2VsbC0+dW5mb3JtYXR0ZWQoKSwgIlxuIjsKKyAgICAgICAgICAgICAgICBwcmludCAiXG4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHJlYWQgaW5mb3JtYXRpb24gZnJvbSBFeGNlbCA5NS0yMDAzIGJpbmFyeSBmaWxlcy4KKworVGhlIG1vZHVsZSBjYW5ub3QgcmVhZCBmaWxlcyBpbiB0aGUgRXhjZWwgMjAwNyBPcGVuIFhNTCBYTFNYIGZvcm1hdC4gU2VlIHRoZSBMPFNwcmVhZHNoZWV0OjpYTFNYPiBtb2R1bGUgaW5zdGVhZC4KKworPWhlYWQxIFBhcnNlcgorCis9aGVhZDIgbmV3KCkKKworVGhlIEM8bmV3KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPiBwYXJzZXIgb2JqZWN0LgorCisgICAgbXkgJHBhcnNlciA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoKTsKKworSXQgaXQgcG9zc2libGUgdG8gcGFzcyBhIHBhc3N3b3JkIHRvIGRlY3J5cHQgYW4gZW5jcnlwdGVkIGZpbGU6CisKKyAgICAkcGFyc2VyID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldyggUGFzc3dvcmQgPT4gJ3NlY3JldCcgKTsKKworT25seSB0aGUgZGVmYXVsdCBFeGNlbCBlbmNyeXB0aW9uIHNjaGVtZSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLiBTZWUgTDwvRGVjcnlwdGlvbj4uCisKK0FzIGFuIGFkdmFuY2VkIGZlYXR1cmUgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwYXNzIGEgY2FsbC1iYWNrIGhhbmRsZXIgdG8gdGhlIHBhcnNlciB0byBjb250cm9sIHRoZSBwYXJzaW5nIG9mIHRoZSBzcHJlYWRzaGVldC4KKworICAgICRwYXJzZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KAorICAgICAgICBDZWxsSGFuZGxlciA9PiBcJmNlbGxfaGFuZGxlciwKKyAgICAgICAgTm90U2V0Q2VsbCAgPT4gMSwKKyAgICApOworCitUaGUgY2FsbC1iYWNrIGNhbiBiZSB1c2VkIHRvIGlnbm9yZSBjZXJ0YWluIGNlbGxzIG9yIHRvIHJlZHVjZSBtZW1vcnkgdXNhZ2UuIFNlZSB0aGUgc2VjdGlvbiBMPFJlZHVjaW5nIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCisKKz1oZWFkMiBwYXJzZSgkZmlsZW5hbWUsICRmb3JtYXR0ZXIpCisKK1RoZSBQYXJzZXIgQzxwYXJzZSgpPiBtZXRob2QgcmV0dXJucyBhIEw8L1dvcmtib29rPiBvYmplY3QuCisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCitJZiBhbiBlcnJvciBvY2N1cnMgQzxwYXJzZSgpPiByZXR1cm5zIEM8dW5kZWY+LiBJbiBnZW5lcmFsLCBwcm9ncmFtcyBzaG91bGQgY29udGFpbiBhIHRlc3QgZm9yIGZhaWxlZCBwYXJzaW5nIGFzIGZvbGxvd3M6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCisgICAgaWYgKCAhZGVmaW5lZCAkd29ya2Jvb2sgKSB7CisgICAgICAgIGRpZSAkcGFyc2VyLT5lcnJvcigpLCAiLlxuIjsKKyAgICB9CisKK1RoZSBDPCRmaWxlbmFtZT4gcGFyYW1ldGVyIGlzIGdlbmVyYWxseSB0aGUgZmlsZSB0byBiZSBwYXJzZWQuIEhvd2V2ZXIsIGl0IGNhbiBhbHNvIGJlIGEgZmlsZWhhbmRsZSBvciBhIHNjYWxhciByZWZlcmVuY2UuCisKK1RoZSBvcHRpb25hbCBDPCRmb3JtYXR0ZXI+IHBhcmFtZXRlciBjYW4gYmUgYW4gcmVmZXJlbmNlIHRvIGEgTDwvRm9ybWF0dGVyIENsYXNzPiB0byBmb3JtYXQgdGhlIHZhbHVlIG9mIGNlbGxzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyB3b3JrYm9va3Mgd2l0aCBVbmljb2RlIG9yIEFzaWFuIGNoYXJhY3RlcnM6CisKKyAgICBteSAkcGFyc2VyICAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICRmb3JtYXR0ZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4tPm5ldygpOworICAgIG15ICR3b3JrYm9vayAgPSAkcGFyc2VyLT5wYXJzZSggJ0Jvb2sxLnhscycsICRmb3JtYXR0ZXIgKTsKKworVGhlIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuPiBmb3JtYXR0ZXIgYWxzbyBzdXBwb3J0cyBVbmljb2RlLiBJZiB5b3UgZW5jb3VudGVyIGFueSBlbmNvZGluZyBwcm9ibGVtcyB3aXRoIHRoZSBkZWZhdWx0IGZvcm1hdHRlciB0cnkgdGhhdCBpbnN0ZWFkLgorCisKKz1oZWFkMiBlcnJvcigpCisKK1RoZSBQYXJzZXIgQzxlcnJvcigpPiBtZXRob2QgcmV0dXJucyBhbiBlcnJvciBzdHJpbmcgaWYgYSBDPHBhcnNlKCk+IGZhaWxzOgorCisgICAgbXkgJHBhcnNlciAgID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygpOworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdCb29rMS54bHMnKTsKKworICAgIGlmICggIWRlZmluZWQgJHdvcmtib29rICkgeworICAgICAgICBkaWUgJHBhcnNlci0+ZXJyb3IoKSwgIi5cbiI7CisgICAgfQorCitJZiB5b3Ugd2lzaCB0byBnZW5lcmF0ZSB5b3Ugb3duIGVycm9yIHN0cmluZyB5b3UgY2FuIHVzZSB0aGUgQzxlcnJvcl9jb2RlKCk+IG1ldGhvZCBpbnN0ZWFkIChzZWUgYmVsb3cpLiBUaGUgQzxlcnJvcigpPiBhbmQgQzxlcnJvcl9jb2RlKCk+IHZhbHVlcyBhcmUgYXMgZm9sbG93czoKKworICAgIGVycm9yKCkgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSgpCisgICAgPT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT0KKyAgICAnJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAnRmlsZSBub3QgZm91bmQnICAgICAgICAgICAgICAgIDEKKyAgICAnTm8gRXhjZWwgZGF0YSBmb3VuZCBpbiBmaWxlJyAgIDIKKyAgICAnRmlsZSBpcyBlbmNyeXB0ZWQnICAgICAgICAgICAgIDMKKworCitUaGUgQzxlcnJvcl9jb2RlKCk+IG1ldGhvZCBpcyBleHBsYWluZWQgYmVsb3cuCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHdpbGwgdHJ5IHRvIGRlY3J5cHQgYW4gZW5jcnlwdGVkIEV4Y2VsIGZpbGUgdXNpbmcgdGhlIGRlZmF1bHQgcGFzc3dvcmQgb3IgYSB1c2VyIHN1cHBsaWVkIHBhc3N3b3JkIHBhc3NlZCB0byBDPG5ldygpPiwgc2VlIGFib3ZlLiBJZiB0aGVzZSBmYWlsIHRoZSBtb2R1bGUgd2lsbCByZXR1cm4gdGhlIEM8J0ZpbGUgaXMgZW5jcnlwdGVkJz4gZXJyb3IuIE9ubHkgdGhlIGRlZmF1bHQgRXhjZWwgZW5jcnlwdGlvbiBzY2hlbWUgaXMgY3VycmVudGx5IHN1cHBvcnRlZCwgc2VlIEw8L0RlY3J5cHRpb24+LgorCisKKz1oZWFkMiBlcnJvcl9jb2RlKCkKKworVGhlIFBhcnNlciBDPGVycm9yX2NvZGUoKT4gbWV0aG9kIHJldHVybnMgYW4gZXJyb3IgY29kZSBpZiBhIEM8cGFyc2UoKT4gZmFpbHM6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCisgICAgaWYgKCAhZGVmaW5lZCAkd29ya2Jvb2sgKSB7CisgICAgICAgIGRpZSAiR290IGVycm9yIGNvZGUgIiwgJHBhcnNlci0+ZXJyb3JfY29kZSwgIi5cbiI7CisgICAgfQorCitUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IHdpc2ggdG8gZW1wbG95IHlvdSBvd24gZXJyb3Igc3RyaW5ncyBvciBlcnJvciBoYW5kbGluZyBtZXRob2RzLgorCisKKz1oZWFkMSBXb3JrYm9vaworCitBIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rPiBpcyBjcmVhdGVkIHZpYSB0aGUgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gQzxwYXJzZSgpPiBtZXRob2Q6CisKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KCk7CisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ0Jvb2sxLnhscycpOworCitUaGUgbWFpbiBtZXRob2RzIG9mIHRoZSBXb3JrYm9vayBjbGFzcyBhcmU6CisKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldHMoKQorICAgICR3b3JrYm9vay0+d29ya3NoZWV0KCkKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldF9jb3VudCgpCisgICAgJHdvcmtib29rLT5nZXRfZmlsZW5hbWUoKQorCitUaGVzZSBtb3JlIGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiB0aGUgV29ya2Jvb2sgY2xhc3MgYXJlIG91dGxpbmVkIGJlbG93LiBUaGUgb3RoZXIsIGxlc3MgY29tbW9ubHkgdXNlZCwgbWV0aG9kcyBhcmUgZG9jdW1lbnRlZCBpbiBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+LgorCisKKz1oZWFkMiB3b3Jrc2hlZXRzKCkKKworUmV0dXJucyBhbiBhcnJheSBvZiBMPC9Xb3Jrc2hlZXQ+IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworCis9aGVhZDIgd29ya3NoZWV0KCkKKworVGhlIEM8d29ya3NoZWV0KCk+IG1ldGhvZCByZXR1cm5zIGEgc2luZ2xlIEM8V29ya3NoZWV0PiBvYmplY3QgdXNpbmcgZWl0aGVyIGl0cyBuYW1lIG9yIGluZGV4OgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHNoZWV0IG5hbWUgb3IgaW5kZXggZG9lc24ndCBleGlzdC4KKworCis9aGVhZDIgd29ya3NoZWV0X2NvdW50KCkKKworVGhlIEM8d29ya3NoZWV0X2NvdW50KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgV29ya3NoZWV0IG9iamVjdHMgaW4gdGhlIFdvcmtib29rLgorCisgICAgbXkgJHdvcmtzaGVldF9jb3VudCA9ICR3b3JrYm9vay0+d29ya3NoZWV0X2NvdW50KCk7CisKKworPWhlYWQyIGdldF9maWxlbmFtZSgpCisKK1RoZSBDPGdldF9maWxlbmFtZSgpPiBtZXRob2QgcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgRXhjZWwgZmlsZSBvZiBDPHVuZGVmPiBpZiB0aGUgZGF0YSB3YXMgcmVhZCBmcm9tIGEgZmlsZWhhbmRsZSByYXRoZXIgdGhhbiBhIGZpbGUuCisKKyAgICBteSAkZmlsZW5hbWUgPSAkd29ya2Jvb2stPmdldF9maWxlbmFtZSgpOworCisKKz1oZWFkMiBPdGhlciBXb3JrYm9vayBNZXRob2RzCisKK0ZvciBmdWxsIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMgYXZhaWxhYmxlIHZpYSBhIFdvcmtib29rIG9iamVjdCBzZWUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2s+LgorCis9aGVhZDEgV29ya3NoZWV0CisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+IGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgcHJvcGVydGllcyBvZiBhbiBFeGNlbCB3b3Jrc2hlZXQuCisKK0EgV29ya3NoZWV0IG9iamVjdCBpcyBvYnRhaW5lZCB2aWEgdGhlIEw8L3dvcmtzaGVldHMoKT4gb3IgTDwvd29ya3NoZWV0KCk+IG1ldGhvZHMuCisKKyAgICBmb3IgbXkgJHdvcmtzaGVldCAoICR3b3JrYm9vay0+d29ya3NoZWV0cygpICkgeworICAgICAgICAuLi4KKyAgICB9CisKKyAgICAjIE9yOgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1RoZSBtb3N0IGNvbW1vbmx5IHVzZWQgbWV0aG9kcyBvZiB0aGUgV29ya3NoZWV0IGNsYXNzIGFyZToKKworICAgICR3b3Jrc2hlZXQtPmdldF9jZWxsKCkKKyAgICAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKQorICAgICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X25hbWUoKQorCitUaGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldCBjbGFzcyBleHBvc2VzIGEgbG90IG9mIG1ldGhvZHMgYnV0IGluIGdlbmVyYWwgdmVyeSBmZXcgYXJlIHJlcXVpcmVkIHVubGVzcyB5b3UgYXJlIHdyaXRpbmcgYW4gYWR2YW5jZWQgZmlsdGVyLgorCitUaGUgbW9zdCBjb21tb25seSB1c2VkIG1ldGhvZHMgYXJlIGRldGFpbGVkIGJlbG93LiBUaGUgb3RoZXJzIGFyZSBkb2N1bWVudGVkIGluIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4uCisKKz1oZWFkMiBnZXRfY2VsbCgkcm93LCAkY29sKQorCitSZXR1cm4gdGhlIEw8L0NlbGw+IG9iamVjdCBhdCByb3cgQzwkcm93PiBhbmQgY29sdW1uIEM8JGNvbD4gaWYgaXQgaXMgZGVmaW5lZC4gT3RoZXJ3aXNlIHJldHVybnMgdW5kZWYuCisKKyAgICBteSAkY2VsbCA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCRyb3csICRjb2wpOworCisKKz1oZWFkMiByb3dfcmFuZ2UoKQorCitSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCBDPCgkbWluLCAkbWF4KT4gY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkZWZpbmVkIHJvd3MgaW4gdGhlIHdvcmtzaGVldC4gSWYgdGhlcmUgaXMgbm8gcm93IGRlZmluZWQgQzwkbWF4PiBpcyBzbWFsbGVyIHRoYW4gQzwkbWluPi4KKworICAgIG15ICggJHJvd19taW4sICRyb3dfbWF4ICkgPSAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKTsKKworCis9aGVhZDIgY29sX3JhbmdlKCkKKworUmV0dXJucyBhIHR3by1lbGVtZW50IGxpc3QgQzwoJG1pbiwgJG1heCk+IGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gb2YgZGVmaW5lZCBjb2x1bW5zIGluIHRoZSB3b3Jrc2hlZXQuIElmIHRoZXJlIGlzIG5vIGNvbHVtbiBkZWZpbmVkIEM8JG1heD4gaXMgc21hbGxlciB0aGFuIEM8JG1pbj4uCisKKyAgICBteSAoICRjb2xfbWluLCAkY29sX21heCApID0gJHdvcmtzaGVldC0+Y29sX3JhbmdlKCk7CisKKworPWhlYWQyIGdldF9uYW1lKCkKKworVGhlIEM8Z2V0X25hbWUoKT4gbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHdvcmtzaGVldCwgc3VjaCBhcyAnU2hlZXQxJy4KKworICAgIG15ICRuYW1lID0gJHdvcmtzaGVldC0+Z2V0X25hbWUoKTsKKworPWhlYWQyIE90aGVyIFdvcmtzaGVldCBNZXRob2RzCisKK0ZvciBvdGhlciwgbGVzcyBjb21tb25seSB1c2VkLCBXb3Jrc2hlZXQgbWV0aG9kcyBzZWUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya3NoZWV0Pi4KKworPWhlYWQxIENlbGwKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw+IGNsYXNzIGhhcyB0aGUgZm9sbG93aW5nIG1haW4gbWV0aG9kcy4KKworICAgICRjZWxsLT52YWx1ZSgpCisgICAgJGNlbGwtPnVuZm9ybWF0dGVkKCkKKworPWhlYWQyIHZhbHVlKCkKKworVGhlIEM8dmFsdWUoKT4gbWV0aG9kIHJldHVybnMgdGhlIGZvcm1hdHRlZCB2YWx1ZSBvZiB0aGUgY2VsbC4KKworICAgIG15ICR2YWx1ZSA9ICRjZWxsLT52YWx1ZSgpOworCitGb3JtYXR0ZWQgaW4gdGhpcyBzZW5zZSByZWZlcnMgdG8gdGhlIG51bWVyaWMgZm9ybWF0IG9mIHRoZSBjZWxsIHZhbHVlLiBGb3IgZXhhbXBsZSBhIG51bWJlciBzdWNoIGFzIDQwMTc3IG1pZ2h0IGJlIGZvcm1hdHRlZCBhcyA0MCwxMTcsIDQwMTE3LjAwMCBvciBldmVuIGFzIHRoZSBkYXRlIDIwMDkvMTIvMzAuCisKK0lmIHRoZSBjZWxsIGRvZXNuJ3QgY29udGFpbiBhIG51bWVyaWMgZm9ybWF0IHRoZW4gdGhlIGZvcm1hdHRlZCBhbmQgdW5mb3JtYXR0ZWQgY2VsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLCBzZWUgdGhlIEM8dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIGJlbG93LgorCitGb3IgYSBkZWZpbmVkIEM8JGNlbGw+IHRoZSBDPHZhbHVlKCk+IG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKworSW4gdGhlIGNhc2Ugb2YgYSBjZWxsIHdpdGggZm9ybWF0dGluZyBidXQgbm8gbnVtZXJpYyBvciBzdHJpbmcgY29udGVudHMgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nIEM8Jyc+LgorCisKKz1oZWFkMiB1bmZvcm1hdHRlZCgpCisKK1RoZSBDPHVuZm9ybWF0dGVkKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB1bmZvcm1hdHRlZCB2YWx1ZSBvZiB0aGUgY2VsbC4KKworICAgIG15ICR1bmZvcm1hdHRlZCA9ICRjZWxsLT51bmZvcm1hdHRlZCgpOworCitSZXR1cm5zIHRoZSBjZWxsIHZhbHVlIHdpdGhvdXQgYSBudW1lcmljIGZvcm1hdC4gU2VlIHRoZSBDPHZhbHVlKCk+IG1ldGhvZCBhYm92ZS4KKworPWhlYWQyIE90aGVyIENlbGwgTWV0aG9kcworCitGb3Igb3RoZXIsIGxlc3MgY29tbW9ubHkgdXNlZCwgV29ya3NoZWV0IG1ldGhvZHMgc2VlIEw8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw+LgorCisKKz1oZWFkMSBGb3JtYXQKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdD4gY2xhc3MgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKworPWhlYWQyIEZvcm1hdCBwcm9wZXJ0aWVzCisKKyAgICAkZm9ybWF0LT57Rm9udH0KKyAgICAkZm9ybWF0LT57QWxpZ25IfQorICAgICRmb3JtYXQtPntBbGlnblZ9CisgICAgJGZvcm1hdC0+e0luZGVudH0KKyAgICAkZm9ybWF0LT57V3JhcH0KKyAgICAkZm9ybWF0LT57U2hyaW5rfQorICAgICRmb3JtYXQtPntSb3RhdGV9CisgICAgJGZvcm1hdC0+e0p1c3RMYXN0fQorICAgICRmb3JtYXQtPntSZWFkRGlyfQorICAgICRmb3JtYXQtPntCZHJTdHlsZX0KKyAgICAkZm9ybWF0LT57QmRyQ29sb3J9CisgICAgJGZvcm1hdC0+e0JkckRpYWd9CisgICAgJGZvcm1hdC0+e0ZpbGx9CisgICAgJGZvcm1hdC0+e0xvY2t9CisgICAgJGZvcm1hdC0+e0hpZGRlbn0KKyAgICAkZm9ybWF0LT57U3R5bGV9CisKK1RoZXNlIHByb3BlcnRpZXMgYXJlIGdlbmVyYWxseSBvbmx5IG9mIGludGVyZXN0IHRvIGFkdmFuY2VkIHVzZXJzLiBDYXN1YWwgdXNlcnMgY2FuIHNraXAgdGhpcyBzZWN0aW9uLgorCis9aGVhZDIgJGZvcm1hdC0+e0ZvbnR9CisKK1JldHVybnMgdGhlIEw8L0ZvbnQ+IG9iamVjdCBmb3IgdGhlIEZvcm1hdC4KKworPWhlYWQyICRmb3JtYXQtPntBbGlnbkh9CisKK1JldHVybnMgdGhlIGhvcml6b250YWwgYWxpZ25tZW50IG9mIHRoZSBmb3JtYXQgd2hlcmUgdGhlIHZhbHVlIGhhcyB0aGUgZm9sbG93aW5nIG1lYW5pbmc6CisKKyAgICAwID0+IE5vIGFsaWdubWVudAorICAgIDEgPT4gTGVmdAorICAgIDIgPT4gQ2VudGVyCisgICAgMyA9PiBSaWdodAorICAgIDQgPT4gRmlsbAorICAgIDUgPT4gSnVzdGlmeQorICAgIDYgPT4gQ2VudGVyIGFjcm9zcworICAgIDcgPT4gRGlzdHJpYnV0ZWQvRXF1YWwgc3BhY2VkCisKKz1oZWFkMiAkZm9ybWF0LT57QWxpZ25WfQorCitSZXR1cm5zIHRoZSB2ZXJ0aWNhbCBhbGlnbm1lbnQgb2YgdGhlIGZvcm1hdCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKworICAgIDAgPT4gVG9wCisgICAgMSA9PiBDZW50ZXIKKyAgICAyID0+IEJvdHRvbQorICAgIDMgPT4gSnVzdGlmeQorICAgIDQgPT4gRGlzdHJpYnV0ZWQvRXF1YWwgc3BhY2VkCisKKz1oZWFkMiAkZm9ybWF0LT57SW5kZW50fQorCitSZXR1cm5zIHRoZSBpbmRlbnQgbGV2ZWwgb2YgdGhlIEM8TGVmdD4gaG9yaXpvbnRhbCBhbGlnbm1lbnQuCisKKz1oZWFkMiAkZm9ybWF0LT57V3JhcH0KKworUmV0dXJucyB0cnVlIGlmIHRleHR3cmFwIGlzIG9uLgorCis9aGVhZDIgJGZvcm1hdC0+e1Nocmlua30KKworUmV0dXJucyB0cnVlIGlmICJTaHJpbmsgdG8gZml0IiBpcyBzZXQgZm9yIHRoZSBmb3JtYXQuCisKKz1oZWFkMiAkZm9ybWF0LT57Um90YXRlfQorCitSZXR1cm5zIHRoZSB0ZXh0IHJvdGF0aW9uLiBJbiBFeGNlbDk3KywgaXQgcmV0dXJucyB0aGUgYW5nbGUgaW4gZGVncmVlcyBvZiB0aGUgdGV4dCByb3RhdGlvbi4KKworSW4gRXhjZWw5NSBvciBlYXJsaWVyIGl0IHJldHVybnMgYSB2YWx1ZSBhcyBmb2xsb3dzOgorCisgICAgMCA9PiBObyByb3RhdGlvbgorICAgIDEgPT4gVG9wIGRvd24KKyAgICAyID0+IDkwIGRlZ3JlZXMgYW50aS1jbG9ja3dpc2UsCisgICAgMyA9PiA5MCBjbG9ja3dpc2UKKworPWhlYWQyICRmb3JtYXQtPntKdXN0TGFzdH0KKworUmV0dXJuIHRydWUgaWYgdGhlICJqdXN0aWZ5IGxhc3QiIHByb3BlcnR5IGlzIHNldCBmb3IgdGhlIGZvcm1hdC4KKworPWhlYWQyICRmb3JtYXQtPntSZWFkRGlyfQorCitSZXR1cm5zIHRoZSBkaXJlY3Rpb24gdGhhdCB0aGUgdGV4dCBpcyByZWFkIGZyb20uCisKKz1oZWFkMiAkZm9ybWF0LT57QmRyU3R5bGV9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGJvcmRlciBzdHlsZXMgYXMgZm9sbG93czoKKworICAgIFsgJGxlZnQsICRyaWdodCwgJHRvcCwgJGJvdHRvbSBdCisKKz1oZWFkMiAkZm9ybWF0LT57QmRyQ29sb3J9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGJvcmRlciBjb2xvciBpbmRleGVzIGFzIGZvbGxvd3M6CisKKyAgICBbICRsZWZ0LCAkcmlnaHQsICR0b3AsICRib3R0b20gXQorCis9aGVhZDIgJGZvcm1hdC0+e0JkckRpYWd9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGRpYWdvbmFsIGJvcmRlciBraW5kLCBzdHlsZSBhbmQgY29sb3IgaW5kZXggYXMgZm9sbG93czoKKworICAgIFska2luZCwgJHN0eWxlLCAkY29sb3IgXQorCitXaGVyZSBraW5kIGlzOgorCisgICAgMCA9PiBOb25lCisgICAgMSA9PiBSaWdodC1Eb3duCisgICAgMiA9PiBSaWdodC1VcAorICAgIDMgPT4gQm90aAorCis9aGVhZDIgJGZvcm1hdC0+e0ZpbGx9CisKK1JldHVybnMgYW4gYXJyYXkgcmVmIG9mIGZpbGwgcGF0dGVybiBhbmQgY29sb3IgaW5kZXhlcyBhcyBmb2xsb3dzOgorCisgICAgWyAkcGF0dGVybiwgJGZyb250X2NvbG9yLCAkYmFja19jb2xvciBdCisKKz1oZWFkMiAkZm9ybWF0LT57TG9ja30KKworUmV0dXJucyB0cnVlIGlmIHRoZSBjZWxsIGlzIGxvY2tlZC4KKworPWhlYWQyICRmb3JtYXQtPntIaWRkZW59CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBIaWRkZW4uCisKKz1oZWFkMiAkZm9ybWF0LT57U3R5bGV9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9ybWF0IGlzIGEgU3R5bGUgZm9ybWF0LgorCisKKworCis9aGVhZDEgRm9udAorCitJPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250PgorCitGb3JtYXQgY2xhc3MgaGFzIHRoZXNlIHByb3BlcnRpZXM6CisKKz1oZWFkMSBGb250IFByb3BlcnRpZXMKKworICAgICRmb250LT57TmFtZX0KKyAgICAkZm9udC0+e0JvbGR9CisgICAgJGZvbnQtPntJdGFsaWN9CisgICAgJGZvbnQtPntIZWlnaHR9CisgICAgJGZvbnQtPntVbmRlcmxpbmV9CisgICAgJGZvbnQtPntVbmRlcmxpbmVTdHlsZX0KKyAgICAkZm9udC0+e0NvbG9yfQorICAgICRmb250LT57U3RyaWtlb3V0fQorICAgICRmb250LT57U3VwZXJ9CisKKz1oZWFkMiAkZm9udC0+e05hbWV9CisKK1JldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZvbnQsIGZvciBleGFtcGxlICdBcmlhbCcuCisKKz1oZWFkMiAkZm9udC0+e0JvbGR9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9udCBpcyBib2xkLgorCis9aGVhZDIgJGZvbnQtPntJdGFsaWN9CisKK1JldHVybnMgdHJ1ZSBpZiB0aGUgZm9udCBpcyBpdGFsaWMuCisKKz1oZWFkMiAkZm9udC0+e0hlaWdodH0KKworUmV0dXJucyB0aGUgc2l6ZSAoaGVpZ2h0KSBvZiB0aGUgZm9udC4KKworPWhlYWQyICRmb250LT57VW5kZXJsaW5lfQorCitSZXR1cm5zIHRydWUgaWYgdGhlIGZvbnQgaW4gdW5kZXJsaW5lZC4KKworPWhlYWQyICRmb250LT57VW5kZXJsaW5lU3R5bGV9CisKK1JldHVybnMgdGhlIHN0eWxlIG9mIGFuIHVuZGVybGluZWQgZm9udCB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSBmb2xsb3dpbmcgbWVhbmluZzoKKworICAgICAwID0+IE5vbmUKKyAgICAgMSA9PiBTaW5nbGUKKyAgICAgMiA9PiBEb3VibGUKKyAgICAzMyA9PiBTaW5nbGUgYWNjb3VudGluZworICAgIDM0ID0+IERvdWJsZSBhY2NvdW50aW5nCisKKz1oZWFkMiAkZm9udC0+e0NvbG9yfQorCitSZXR1cm5zIHRoZSBjb2xvciBpbmRleCBmb3IgdGhlIGZvbnQuIFRoZSBpbmRleCBjYW4gYmUgY29udmVydGVkIHRvIGEgUkdCIHN0cmluZyB1c2luZyB0aGUgQzxDb2xvcklkeFRvUkdCKCk+IFBhcnNlciBtZXRob2QuCisKKz1oZWFkMiAkZm9udC0+e1N0cmlrZW91dH0KKworUmV0dXJucyB0cnVlIGlmIHRoZSBmb250IGhhcyB0aGUgc3RyaWtlb3V0IHByb3BlcnR5IHNldC4KKworPWhlYWQyICRmb250LT57U3VwZXJ9CisKK1JldHVybnMgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGlmIHRoZSBzdXBlcnNjcmlwdCBvciBzdWJzY3JpcHQgcHJvcGVydHkgb2YgdGhlIGZvbnQgaXMgc2V0OgorCisgICAgMCA9PiBOb25lCisgICAgMSA9PiBTdXBlcnNjcmlwdAorICAgIDIgPT4gU3Vic2NyaXB0CisKKz1oZWFkMSBGb3JtYXR0ZXIgQ2xhc3MKKworRm9ybWF0dGVycyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBDPHBhcnNlKCk+IG1ldGhvZCB0byBkZWFsIHdpdGggVW5pY29kZSBvciBBc2lhbiBmb3JtYXR0aW5nLgorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCBpbmNsdWRlcyAyIGZvcm1hdHRlciBjbGFzc2VzLiBDPEZtdERlZmF1bHQ+IGFuZCBDPEZtdEphcGFuZXNlPi4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBjcmVhdGUgYSB1c2VyIGRlZmluZWQgZm9ybWF0dGluZyBjbGFzcy4KKworVGhlIGZvcm1hdHRlciBjbGFzcyBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXQqPiBzaG91bGQgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKworCis9aGVhZDIgQ2hrVHlwZSgkc2VsZiwgJGlzX251bWVyaWMsICRmb3JtYXRfaW5kZXgpCisKK01ldGhvZCB0byBjaGVjayB0aGUgdHlwZSBvZiBkYXRhIGluIHRoZSBjZWxsLiBTaG91bGQgcmV0dXJuIEM8RGF0ZT4sIEM8TnVtZXJpYz4gb3IgQzxUZXh0Pi4gSXQgaXMgcGFzc2VkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworPW92ZXIKKworPWl0ZW0gJHNlbGYKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBGb3JtYXR0ZXIgb2JqZWN0LgorCis9aXRlbSAkaXNfbnVtZXJpYworCitJZiB0cnVlLCB0aGUgdmFsdWUgc2VlbXMgdG8gYmUgbnVtYmVyLgorCis9aXRlbSAkZm9ybWF0X2luZGV4CisKK1RoZSBpbmRleCBudW1iZXIgZm9yIHRoZSBjZWxsIEZvcm1hdCBvYmplY3QuCisKKz1iYWNrCisKKz1oZWFkMiBUZXh0Rm10KCRzZWxmLCAkc3RyaW5nX2RhdGEsICRzdHJpbmdfZW5jb2RpbmcpCisKK0NvbnZlcnRzIHRoZSBzdHJpbmcgZGF0YSBpbiB0aGUgY2VsbCBpbnRvIHRoZSBjb3JyZWN0IGVuY29kaW5nLiAgSXQgaXMgcGFzc2VkIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworPW92ZXIKKworPWl0ZW0gJHNlbGYKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBGb3JtYXR0ZXIgb2JqZWN0LgorCis9aXRlbSAkc3RyaW5nX2RhdGEKKworVGhlIG9yaWdpbmFsIHN0cmluZy90ZXh0IGRhdGEuCisKKz1pdGVtICRzdHJpbmdfZW5jb2RpbmcKKworVGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiBvcmlnaW5hbCBzdHJpbmcvdGV4dC4KKworPWJhY2sKKworPWhlYWQyIFZhbEZtdCgkc2VsZiwgJGNlbGwsICR3b3JrYm9vaykKKworQ29udmVydCB0aGUgb3JpZ2luYWwgdW5mb3JtYXR0ZWQgY2VsbCB2YWx1ZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBmb3JtYXR0ZWQgdmFsdWUuIEZvciBpbnN0YW5jZSB0dXJuIGEgbnVtYmVyIGludG8gYSBmb3JtYXR0ZWQgZGF0ZS4gIEl0IGlzIHBhc3NlZCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKKz1vdmVyCisKKz1pdGVtICRzZWxmCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgRm9ybWF0dGVyIG9iamVjdC4KKworPWl0ZW0gJGNlbGwKKworQSBzY2FsYXIgcmVmZXJlbmNlIHRvIHRoZSBDZWxsIG9iamVjdC4KKworPWl0ZW0gJHdvcmtib29rCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgV29ya2Jvb2sgb2JqZWN0LgorCis9YmFjaworCisKKz1oZWFkMiBGbXRTdHJpbmcoJHNlbGYsICRjZWxsLCAkd29ya2Jvb2spCisKK0dldCB0aGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIENlbGwuICBJdCBpcyBwYXNzZWQgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCis9b3ZlcgorCis9aXRlbSAkc2VsZgorCitBIHNjYWxhciByZWZlcmVuY2UgdG8gdGhlIEZvcm1hdHRlciBvYmplY3QuCisKKz1pdGVtICRjZWxsCisKK0Egc2NhbGFyIHJlZmVyZW5jZSB0byB0aGUgQ2VsbCBvYmplY3QuCisKKz1pdGVtICR3b3JrYm9vaworCitBIHNjYWxhciByZWZlcmVuY2UgdG8gdGhlIFdvcmtib29rIG9iamVjdC4KKworPWJhY2sKKworCis9aGVhZDEgUmVkdWNpbmcgdGhlIG1lbW9yeSB1c2FnZSBvZiBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbAorCitJbiBzb21lIGNhc2VzIGEgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gYXBwbGljYXRpb24gbWF5IGNvbnN1bWUgYSBsb3Qgb2YgbWVtb3J5IHdoZW4gcHJvY2Vzc2luZyBhIGxhcmdlIEV4Y2VsIGZpbGUgYW5kLCBhcyBhIHJlc3VsdCwgbWF5IGZhaWwgdG8gY29tcGxldGUuIFRoZSBmb2xsb3dpbmcgZXhwbGFpbnMgd2h5IHRoaXMgY2FuIG9jY3VyIGFuZCBob3cgdG8gcmVzb2x2ZSBpdC4KKworQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4gcHJvY2Vzc2VzIGFuIEV4Y2VsIGZpbGUgaW4gdHdvIHN0YWdlcy4gSW4gdGhlIGZpcnN0IHN0YWdlIGl0IGV4dHJhY3RzIHRoZSBFeGNlbCBiaW5hcnkgc3RyZWFtIGZyb20gdGhlIE9MRSBjb250YWluZXIgZmlsZSB1c2luZyBDPE9MRTo6U3RvcmFnZV9MaXRlPi4gSW4gdGhlIHNlY29uZCBzdGFnZSBpdCBwYXJzZXMgdGhlIGJpbmFyeSBzdHJlYW0gdG8gcmVhZCB3b3JrYm9vaywgd29ya3NoZWV0IGFuZCBjZWxsIGRhdGEgd2hpY2ggaXQgdGhlbiBzdG9yZXMgaW4gbWVtb3J5LiBUaGUgbWFqb3JpdHkgb2YgdGhlIG1lbW9yeSB1c2FnZSBpcyByZXF1aXJlZCBmb3Igc3RvcmluZyBjZWxsIGRhdGEuCisKK1RoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBhcyB0aGUgRXhjZWwgZmlsZSBpcyBwYXJzZWQgYW5kIGVhY2ggY2VsbCBpcyBlbmNvdW50ZXJlZCBhIGNlbGwgaGFuZGxpbmcgZnVuY3Rpb24gY3JlYXRlcyBhIHJlbGF0aXZlbHkgbGFyZ2UgbmVzdGVkIGNlbGwgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIGNlbGwgdmFsdWUgYW5kIGFsbCBvZiB0aGUgZGF0YSB0aGF0IHJlbGF0ZXMgdG8gdGhlIGNlbGwgZm9ybWF0dGluZy4gRm9yIGxhcmdlIGZpbGVzIChhIDEwTUIgRXhjZWwgZmlsZSBvbiBhIDI1Nk1CIHN5c3RlbSkgdGhpcyBvdmVyaGVhZCBjYW4gY2F1c2UgdGhlIHN5c3RlbSB0byBncmluZCB0byBhIGhhbHQuCisKK0hvd2V2ZXIsIGluIGEgbG90IG9mIGNhc2VzIHdoZW4gYW4gRXhjZWwgZmlsZSBpcyBiZWluZyBwcm9jZXNzZWQgdGhlIG9ubHkgaW5mb3JtYXRpb24gdGhhdCBpcyByZXF1aXJlZCBhcmUgdGhlIGNlbGwgdmFsdWVzLiBJbiB0aGVzZSBjYXNlcyBpdCBpcyBwb3NzaWJsZSB0byBhdm9pZCBtb3N0IG9mIHRoZSBtZW1vcnkgb3ZlcmhlYWQgYnkgc3BlY2lmeWluZyB5b3VyIG93biBjZWxsIGhhbmRsaW5nIGZ1bmN0aW9uIGFuZCBieSB0ZWxsaW5nIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIG5vdCB0byBzdG9yZSB0aGUgcGFyc2VkIGNlbGwgZGF0YS4gVGhpcyBpcyBhY2hpZXZlZCBieSBwYXNzaW5nIGEgY2VsbCBoYW5kbGVyIGZ1bmN0aW9uIHRvIEM8bmV3KCk+IHdoZW4gY3JlYXRpbmcgdGhlIHBhcnNlIG9iamVjdC4gSGVyZSBpcyBhbiBleGFtcGxlLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKworICAgIG15ICRwYXJzZXIgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+bmV3KAorICAgICAgICBDZWxsSGFuZGxlciA9PiBcJmNlbGxfaGFuZGxlciwKKyAgICAgICAgTm90U2V0Q2VsbCAgPT4gMQorICAgICk7CisKKyAgICBteSAkd29ya2Jvb2sgPSAkcGFyc2VyLT5wYXJzZSgnZmlsZS54bHMnKTsKKworICAgIHN1YiBjZWxsX2hhbmRsZXIgeworCisgICAgICAgIG15ICR3b3JrYm9vayAgICA9ICRfWzBdOworICAgICAgICBteSAkc2hlZXRfaW5kZXggPSAkX1sxXTsKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMl07CisgICAgICAgIG15ICRjb2wgICAgICAgICA9ICRfWzNdOworICAgICAgICBteSAkY2VsbCAgICAgICAgPSAkX1s0XTsKKworICAgICAgICAjIERvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKworVGhlIHVzZXIgc3BlY2lmaWVkIGNlbGwgaGFuZGxlciBpcyBwYXNzZWQgYXMgYSBjb2RlIHJlZmVyZW5jZSB0byBDPG5ldygpPiBhbG9uZyB3aXRoIHRoZSBwYXJhbWV0ZXIgQzxOb3RTZXRDZWxsPiB3aGljaCB0ZWxscyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCBub3QgdG8gc3RvcmUgdGhlIHBhcnNlZCBjZWxsLiBOb3RlLCB5b3UgZG9uJ3QgaGF2ZSB0byBpdGVyYXRlIG92ZXIgdGhlIHJvd3MgYW5kIGNvbHVtbnMsIHRoaXMgaGFwcGVucyBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgdGhlIHBhcnNpbmcuCisKK1RoZSBjZWxsIGhhbmRsZXIgaXMgcGFzc2VkIDUgYXJndW1lbnRzLiBUaGUgZmlyc3QsIEM8JHdvcmtib29rPiwgaXMgYSByZWZlcmVuY2UgdG8gdGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rPiBvYmplY3QgdGhhdCByZXByZXNlbnQgdGhlIHBhcnNlZCB3b3JrYm9vay4gVGhpcyBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgYW55IG9mIHRoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vaz4gbWV0aG9kcywgc2VlIEw8L1dvcmtib29rPi4gVGhlIHNlY29uZCBDPCRzaGVldF9pbmRleD4gaXMgdGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHdvcmtzaGVldCBiZWluZyBwYXJzZWQuIFRoZSB0aGlyZCBhbmQgZm91cnRoLCBDPCRyb3c+IGFuZCBDPCRjb2w+LCBhcmUgdGhlIHplcm8tYmFzZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVyIG9mIHRoZSBjZWxsLiBUaGUgZmlmdGgsIEM8JGNlbGw+LCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbD4gb2JqZWN0LiBUaGlzIGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZGF0YSBmcm9tIHRoZSBjZWxsLiBTZWUgTDwvQ2VsbD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1RoaXMgdGVjaG5pcXVlIGNhbiBiZSB1c2VmdWwgaWYgeW91IGFyZSB3cml0aW5nIGFuIEV4Y2VsIHRvIGRhdGFiYXNlIGZpbHRlciBzaW5jZSB5b3UgY2FuIHB1dCB5b3VyIERCIGNhbGxzIGluIHRoZSBjZWxsIGhhbmRsZXIuCisKK0lmIHlvdSBkb24ndCB3YW50IGFsbCBvZiB0aGUgZGF0YSBpbiB0aGUgc3ByZWFkc2hlZXQgeW91IGNhbiBhZGQgc29tZSBjb250cm9sIGxvZ2ljIHRvIHRoZSBjZWxsIGhhbmRsZXIuIEZvciBleGFtcGxlIHdlIGNhbiBleHRlbmQgdGhlIHByZXZpb3VzIGV4YW1wbGUgc28gdGhhdCBpdCBvbmx5IHByaW50cyB0aGUgZmlyc3QgMTAgcm93cyBvZiB0aGUgZmlyc3QgdHdvIHdvcmtzaGVldHMgaW4gdGhlIHBhcnNlZCB3b3JrYm9vayBieSBhZGRpbmcgc29tZSBDPGlmKCk+IHN0YXRlbWVudHMgdG8gdGhlIGNlbGwgaGFuZGxlcjoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw7CisKKyAgICBteSAkcGFyc2VyID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwtPm5ldygKKyAgICAgICAgQ2VsbEhhbmRsZXIgPT4gXCZjZWxsX2hhbmRsZXIsCisgICAgICAgIE5vdFNldENlbGwgID0+IDEKKyAgICApOworCisgICAgbXkgJHdvcmtib29rID0gJHBhcnNlci0+cGFyc2UoJ2ZpbGUueGxzJyk7CisKKyAgICBzdWIgY2VsbF9oYW5kbGVyIHsKKworICAgICAgICBteSAkd29ya2Jvb2sgICAgPSAkX1swXTsKKyAgICAgICAgbXkgJHNoZWV0X2luZGV4ID0gJF9bMV07CisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICRfWzJdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAkX1szXTsKKyAgICAgICAgbXkgJGNlbGwgICAgICAgID0gJF9bNF07CisKKyAgICAgICAgIyBTa2lwIHNvbWUgd29ya3NoZWV0cyBhbmQgcm93cyAoaW5lZmZpY2llbnRseSkuCisgICAgICAgIHJldHVybiBpZiAkc2hlZXRfaW5kZXggPj0gMzsKKyAgICAgICAgcmV0dXJuIGlmICRyb3cgPj0gMTA7CisKKyAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKworSG93ZXZlciwgdGhpcyBzdGlsbCBwcm9jZXNzZXMgdGhlIGVudGlyZSB3b3JrYm9vay4gSWYgeW91IHdpc2ggdG8gc2F2ZSBzb21lIGFkZGl0aW9uYWwgcHJvY2Vzc2luZyB0aW1lIHlvdSBjYW4gYWJvcnQgdGhlIHBhcnNpbmcgYWZ0ZXIgeW91IGhhdmUgcmVhZCB0aGUgZGF0YSB0aGF0IHlvdSB3YW50LCB1c2luZyB0aGUgd29ya2Jvb2sgQzxQYXJzZUFib3J0PiBtZXRob2Q6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworCisgICAgbXkgJHBhcnNlciA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoCisgICAgICAgIENlbGxIYW5kbGVyID0+IFwmY2VsbF9oYW5kbGVyLAorICAgICAgICBOb3RTZXRDZWxsICA9PiAxCisgICAgKTsKKworICAgIG15ICR3b3JrYm9vayA9ICRwYXJzZXItPnBhcnNlKCdmaWxlLnhscycpOworCisgICAgc3ViIGNlbGxfaGFuZGxlciB7CisKKyAgICAgICAgbXkgJHdvcmtib29rICAgID0gJF9bMF07CisgICAgICAgIG15ICRzaGVldF9pbmRleCA9ICRfWzFdOworICAgICAgICBteSAkcm93ICAgICAgICAgPSAkX1syXTsKKyAgICAgICAgbXkgJGNvbCAgICAgICAgID0gJF9bM107CisgICAgICAgIG15ICRjZWxsICAgICAgICA9ICRfWzRdOworCisgICAgICAgICMgU2tpcCBzb21lIHdvcmtzaGVldHMgYW5kIHJvd3MgKG1vcmUgZWZmaWNpZW50bHkpLgorICAgICAgICBpZiAoICRzaGVldF9pbmRleCA+PSAxIGFuZCAkcm93ID49IDEwICkgeworICAgICAgICAgICAgJHdvcmtib29rLT5QYXJzZUFib3J0KDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZm9ybWF0dGVkIGNlbGwgdmFsdWUKKyAgICAgICAgcHJpbnQgJGNlbGwtPnZhbHVlKCksICJcbiI7CisKKyAgICB9CisKKz1oZWFkMSBEZWNyeXB0aW9uCisKK0lmIGEgd29ya2Jvb2sgaXMgInByb3RlY3RlZCIgdGhlbiBFeGNlbCB3aWxsIGVuY3J5cHQgdGhlIGZpbGUgd2hldGhlciBhIHBhc3N3b3JkIGlzIHN1cHBsaWVkIG9yIG5vdC4gQXMgb2YgdmVyc2lvbiAwLjU5IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHN1cHBvcnRzIGRlY3J5cHRpbmcgRXhjZWwgd29ya2Jvb2tzIHVzaW5nIGEgZGVmYXVsdCBvciB1c2VyIHN1cHBsaWVkIHBhc3N3b3JkLiBIb3dldmVyLCBvbmx5IHRoZSBmb2xsb3dpbmcgZW5jcnlwdGlvbiBzY2hlbWUgaXMgc3VwcG9ydGVkOgorCisgICAgT2ZmaWNlIDk3LzIwMDAgQ29tcGF0aWJsZSBlbmNyeXB0aW9uCisKK1RoZSBmb2xsb3dpbmcgZW5jcnlwdGlvbiBtZXRob2RzIGFyZSBub3Qgc3VwcG9ydGVkOgorCisgICAgV2VhayBFbmNyeXB0aW9uIChYT1IpCisgICAgUkM0LCBNaWNyb3NvZnQgQmFzZSBDcnlwdG9ncmFwaGljIFByb3ZpZGVyIHYxLjAKKyAgICBSQzQsIE1pY3Jvc29mdCBCYXNlIERTUyBhbmQgRGlmZmllLUhlbGxtYW4gQ3J5cHRvZ3JhcGhpYyBQcm92aWRlcgorICAgIFJDNCwgTWljcm9zb2Z0IERIIFNDaGFubmVsIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBDcnlwdG9ncmFwaGljIFByb3ZpZGVyIHYxLjAKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBEU1MgYW5kIERpZmZpZS1IZWxsbWFuIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBFbmhhbmNlZCBSU0EgYW5kIEFFUyBDcnlwdG9ncmFwaGljIFByb3ZpZGVyCisgICAgUkM0LCBNaWNyb3NvZnQgUlNBIFNDaGFubmVsIENyeXB0b2dyYXBoaWMgUHJvdmlkZXIKKyAgICBSQzQsIE1pY3Jvc29mdCBTdHJvbmcgQ3J5cHRvZ3JhcGhpYyBQcm92aWRlcgorCitTZWUgdGhlIGZvbGxvd2luZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBFeGNlbCBlbmNyeXB0aW9uOiBMPGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9vZmZpY2UtMjAwMy1yZXNvdXJjZS1raXQvaW1wb3J0YW50LWFzcGVjdHMtb2YtcGFzc3dvcmQtYW5kLWVuY3J5cHRpb24tcHJvdGVjdGlvbi1IQTAwMTE0MDMxMS5hc3B4Pi4KKworCisKKz1oZWFkMSBLTk9XTiBQUk9CTEVNUworCis9b3ZlcgorCis9aXRlbSAqIElzc3VlcyByZXBvcnRlZCBieSB1c2VyczogTDxodHRwOi8vcnQuY3Bhbi5vcmcvUHVibGljL0Rpc3QvRGlzcGxheS5odG1sP05hbWU9U3ByZWFkc2hlZXQtUGFyc2VFeGNlbD4KKworPWl0ZW0gKiBUaGlzIG1vZHVsZSBjYW5ub3QgcmVhZCB0aGUgdmFsdWVzIG9mIGZvcm11bGFzIGZyb20gZmlsZXMgY3JlYXRlZCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHVubGVzcyB0aGUgdXNlciBzcGVjaWZpZWQgdGhlIHZhbHVlcyB3aGVuIGNyZWF0aW5nIHRoZSBmaWxlICh3aGljaCBpcyBnZW5lcmFsbHkgbm90IHRoZSBjYXNlKS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdyaXRlcyB0aGUgZm9ybXVsYSBidXQgbm90IHRoZSBmb3JtdWxhIHJlc3VsdCBzaW5jZSBpdCBpc24ndCBpbiBhIHBvc2l0aW9uIHRvIGNhbGN1bGF0ZSBhcmJpdHJhcnkgRXhjZWwgZm9ybXVsYXMgd2l0aG91dCBhY2Nlc3MgdG8gRXhjZWwncyBmb3JtdWxhIGVuZ2luZS4KKworPWl0ZW0gKiBJZiBFeGNlbCBoYXMgZGF0ZSBmaWVsZHMgd2hlcmUgdGhlIHNwZWNpZmllZCBmb3JtYXQgaXMgZXF1YWwgdG8gdGhlIHN5c3RlbS1kZWZhdWx0IGZvciB0aGUgc2hvcnQtZGF0ZSBsb2NhbGUsIEV4Y2VsIGRvZXMgbm90IHN0b3JlIHRoZSBmb3JtYXQsIGJ1dCBkZWZhdWx0cyB0byBhbiBpbnRlcm5hbCBmb3JtYXQgd2hpY2ggaXMgc3lzdGVtIGRlcGVuZGVudC4gSW4gdGhlc2UgY2FzZXMgUGFyc2VFeGNlbCB1c2VzIHRoZSBkYXRlIGZvcm1hdCAneXl5eS1tbS1kZCcuCisKKz1iYWNrCisKKworCisKKz1oZWFkMSBSRVBPUlRJTkcgQSBCVUcKKworQnVncyBjYW4gYmUgcmVwb3J0ZWQgdmlhIHJ0LmNwYW4ub3JnLiBTZWUgdGhlIGZvbGxvd2luZyBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGJ1ZyByZXBvcnRpbmcgZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsCisKK0w8aHR0cDovL3J0LmNwYW4ub3JnL1B1YmxpYy9EaXN0L0Rpc3BsYXkuaHRtbD9OYW1lPVNwcmVhZHNoZWV0LVBhcnNlRXhjZWw+CisKKworCisKKz1oZWFkMSBTRUUgQUxTTworCis9b3ZlcgorCis9aXRlbSAqIHhsczJjc3YgYnkgS2VuIFByb3dzIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2VuL3hsczJjc3YtMS4wNi9zY3JpcHQveGxzMmNzdj4uCisKKz1pdGVtICogeGxzMmNzdiBhbmQgeGxzY2F0IGJ5IEguTWVyaWpuIEJyYW5kICh0aGVzZSB1dGlsaXRpZXMgYXJlIHBhcnQgb2YgU3ByZWFkc2hlZXQ6OlJlYWQsIHNlZSBiZWxvdykuCisKKz1pdGVtICogZXhjZWwydHh0IGJ5IEtlbiBZb3VlbnMtQ2xhcmssIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2NsYXJrL2V4Y2VsMnR4dC9leGNlbDJ0eHQ+LiBUaGlzIGlzIGFuIGV4Y2VsbGVudCBleGFtcGxlIG9mIGFuIEV4Y2VsIGZpbHRlciB1c2luZyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gSXQgY2FuIHByb2R1Y2UgQ1NWLCBUYWIgZGVsaW1pdGVkLCBIdG1sLCBYTUwgYW5kIFlhbWwuCisKKz1pdGVtICogWExTcGVybCBieSBKb24gQWxsZW4gTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35qb25hbGxlbi9YTFNwZXJsL2Jpbi9YTFNwZXJsPi4gVGhpcyBhcHBsaWNhdGlvbiBhbGxvd3MgeW91IHRvIHVzZSBQZXJsICJvbmUtbGluZXJzIiB3aXRoIE1pY3Jvc29mdCBFeGNlbCBmaWxlcy4KKworPWl0ZW0gKiBTcHJlYWRzaGVldDo6WExTWCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmRtb3cvU3ByZWFkc2hlZXQtWExTWC9saWIvU3ByZWFkc2hlZXQvWExTWC5wbT4gYnkgRG1pdHJ5IE92c3lhbmtvLiBBIG1vZHVsZSB3aXRoIGEgc2ltaWxhciBpbnRlcmZhY2UgdG8gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgZm9yIHBhcnNpbmcgRXhjZWwgMjAwNyBYTFNYIE9wZW5YTUwgZmlsZXMuCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OlJlYWQgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1NwcmVhZHNoZWV0LVJlYWQvUmVhZC5wbT4gYnkgSC5NZXJpam4gQnJhbmQuIEEgc2luZ2xlIGludGVyZmFjZSBmb3IgcmVhZGluZyBzZXZlcmFsIGRpZmZlcmVudCBzcHJlYWRzaGVldCBmb3JtYXRzLgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+am1jbmFtYXJhL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwvbGliL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwucG0+LiBBIHBlcmwgbW9kdWxlIGZvciBjcmVhdGluZyBuZXcgRXhjZWwgZmlsZXMuCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35qbWNuYW1hcmEvU3ByZWFkc2hlZXQtUGFyc2VFeGNlbC9saWIvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtPi4gVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgaXQgYWxsb3dzIHlvdSB0byAicmV3cml0ZSIgYW4gRXhjZWwgZmlsZS4gU2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmptY25hbWFyYS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsL2xpYi9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtI01PRElGWUlOR19BTkRfUkVXUklUSU5HX0VYQ0VMX0ZJTEVTPi4gSXQgaXMgcGFydCBvZiB0aGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgZGlzdHJvLgorCis9aXRlbSAqIFRleHQ6OkNTVl9YUyBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvVGV4dC1DU1ZfWFMvQ1NWX1hTLnBtPiBieSBILk1lcmlqbiBCcmFuZC4gQSBmYXN0IGFuZCByaWdvcm91cyBtb2R1bGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgQ1NWIGRhdGEuIERvbid0IGNvbnNpZGVyIHJvbGxpbmcgeW91ciBvd24gQ1NWIGhhbmRsaW5nLCB1c2UgdGhpcyBtb2R1bGUgaW5zdGVhZC4KKworPWJhY2sKKworCisKKworPWhlYWQxIE1BSUxJTkcgTElTVAorCitUaGVyZSBpcyBhIEdvb2dsZSBncm91cCBmb3IgZGlzY3Vzc2luZyBhbmQgYXNraW5nIHF1ZXN0aW9ucyBhYm91dCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc2VhcmNoIHRvIHNlZSBpZiB5b3VyIHF1ZXN0aW9uIGhhcyBiZWVuIGFza2VkIGJlZm9yZTogIEw8aHR0cDovL2dyb3Vwcy1iZXRhLmdvb2dsZS5jb20vZ3JvdXAvc3ByZWFkc2hlZXQtcGFyc2VleGNlbC8+CisKKworCisKKz1oZWFkMSBET05BVElPTlMKKworSWYgeW91J2QgY2FyZSB0byBkb25hdGUgdG8gdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHByb2plY3QsIHlvdSBjYW4gZG8gc28gdmlhIFBheVBhbDogTDxodHRwOi8vdGlueXVybC5jb20vN2F5ZXM+CisKKworCisKKz1oZWFkMSBUT0RPCisKKz1vdmVyCisKKz1pdGVtICogVGhlIGN1cnJlbnQgbWFpbnRlbmFuY2Ugd29yayBpcyBkaXJlY3RlZCB0b3dhcmRzIG1ha2luZyB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIHVzZWZ1bCwgaW1wcm92aW5nIGFuZCBzaW1wbGlmeWluZyB0aGUgQVBJLCBhbmQgaW1wcm92aW5nIHRoZSBtYWludGFpbmFiaWxpdHkgb2YgdGhlIGNvZGUgYmFzZS4gQWZ0ZXIgdGhhdCBuZXcgZmVhdHVyZXMgd2lsbCBiZSBhZGRlZC4KKworPWl0ZW0gKiBGaXggb3BlbiBidWdzIGFuZCBkb2N1bWVudGF0aW9uIGZvciBTYXZlUGFyc2VyLgorCis9aXRlbSAqIEFkZCBGb3JtdWxhIHN1cHBvcnQsIEh5cGVybGluayBzdXBwb3J0LCBOYW1lZCBSYW5nZSBzdXBwb3J0LgorCis9aXRlbSAqIEltcHJvdmUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgY29tcGF0aWJpbGl0eSB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aXRlbSAqIEltcHJvdmUgVW5pY29kZSBhbmQgb3RoZXIgZW5jb2Rpbmcgc3VwcG9ydC4gVGhpcyB3aWxsIHByb2JhYmx5IHJlcXVpcmUgZHJvcHBpbmcgc3VwcG9ydCBmb3IgcGVybHMgcHJpb3IgdG8gNS44Ky4KKworPWJhY2sKKworCisKKz1oZWFkMSBBQ0tOT1dMRURHRU1FTlRTCisKK0Zyb20gS2F3YWkgVGFrYW5vcmk6CisKK0ZpcnN0IG9mIGFsbCwgSSB3b3VsZCBsaWtlIHRvIGFja25vd2xlZGdlIHRoZSBmb2xsb3dpbmcgdmFsdWFibGUgcHJvZ3JhbXMgYW5kIG1vZHVsZXM6CitYSFRNTCwgT0xFOjpTdG9yYWdlIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworSW4gbm8gcGFydGljdWxhciBvcmRlcjogWWFtYWppIEhhcnVuYSwgU2ltYW1vdG8gVGFrZXNpLCBOb2d1Y2hpIEhhcnVtaSwgSWtlemF3YSBLYXp1aGlybywgU3V3YXpvbm8gU2h1Z28sIEhpcm9mdW1pIE1vcmlzYWRhLCBNaWNoYWVsIEVkd2FyZHMsIEtpbSBOYW11c2ssIFNsYXZlbiBSZXppYywgR3JhbnQgU3RldmVucywgSC5NZXJpam4gQnJhbmQgYW5kIG1hbnkgbWFueSBwZW9wbGUgKyBLYXdhaSBNaWtha28uCisKK0FsZXhleSBNYXp1cmluIGFkZGVkIHRoZSBkZWNyeXB0aW9uIGZhY2lsaXR5LgorCisKKworPWhlYWQxIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkKKworQmVjYXVzZSB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHNvZnR3YXJlLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdy4gRXhjZXB0IHdoZW4gb3RoZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3RoZXIgcGFydGllcyBwcm92aWRlIHRoZSBzb2Z0d2FyZSAiYXMgaXMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gVGhlIGVudGlyZSByaXNrIGFzIHRvIHRoZSBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgc29mdHdhcmUgaXMgd2l0aCB5b3UuIFNob3VsZCB0aGUgc29mdHdhcmUgcHJvdmUgZGVmZWN0aXZlLCB5b3UgYXNzdW1lIHRoZSBjb3N0IG9mIGFsbCBuZWNlc3Nhcnkgc2VydmljaW5nLCByZXBhaXIsIG9yIGNvcnJlY3Rpb24uCisKK0luIG5vIGV2ZW50IHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyB3aWxsIGFueSBjb3B5cmlnaHQgaG9sZGVyLCBvciBhbnkgb3RoZXIgcGFydHkgd2hvIG1heSBtb2RpZnkgYW5kL29yIHJlZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgYXMgcGVybWl0dGVkIGJ5IHRoZSBhYm92ZSBsaWNlbmNlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlIHNvZnR3YXJlIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGxvc3Mgb2YgZGF0YSBvciBkYXRhIGJlaW5nIHJlbmRlcmVkIGluYWNjdXJhdGUgb3IgbG9zc2VzIHN1c3RhaW5lZCBieSB5b3Ugb3IgdGhpcmQgcGFydGllcyBvciBhIGZhaWx1cmUgb2YgdGhlIHNvZnR3YXJlIHRvIG9wZXJhdGUgd2l0aCBhbnkgb3RoZXIgc29mdHdhcmUpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKworPWhlYWQxIExJQ0VOU0UKKworRWl0aGVyIHRoZSBQZXJsIEFydGlzdGljIExpY2VuY2UgTDxodHRwOi8vZGV2LnBlcmwub3JnL2xpY2Vuc2VzL2FydGlzdGljLmh0bWw+IG9yIHRoZSBHUEwgTDxodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocD4KKworCisKKworPWhlYWQxIEFVVEhPUgorCitDdXJyZW50IG1haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkgKEhpcHBvMjAwMCkga3dpdGtuckBjcGFuLm9yZworCisKKworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDExIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiBZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UuCisKKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9DZWxsLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9DZWxsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MjcwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0NlbGwucG0KQEAgLTAsMCArMSwzMTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGw7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkNlbGwgLSBBIGNsYXNzIGZvciBDZWxsIGRhdGEgYW5kIGZvcm1hdHRpbmcuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLgorIworc3ViIG5ldyB7CisgICAgbXkgKCAkcGFja2FnZSwgJXByb3BlcnRpZXMgKSA9IEBfOworICAgIG15ICRzZWxmID0gXCVwcm9wZXJ0aWVzOworCisgICAgYmxlc3MgJHNlbGYsICRwYWNrYWdlOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHZhbHVlKCkKKyMKKyMgUmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorIworc3ViIHZhbHVlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfVmFsdWV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHVuZm9ybWF0dGVkKCkKKyMKKyMgUmV0dXJucyB0aGUgdW5mb3JtYXR0ZWQgdmFsdWUgb2YgdGhlIGNlbGwuCisjCitzdWIgdW5mb3JtYXR0ZWQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ZhbH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2Zvcm1hdCgpCisjCisjIFJldHVybnMgdGhlIEZvcm1hdCBvYmplY3QgZm9yIHRoZSBjZWxsLgorIworc3ViIGdldF9mb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0Zvcm1hdH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgdHlwZSgpCisjCisjIFJldHVybnMgdGhlIHR5cGUgb2YgY2VsbCBzdWNoIGFzIFRleHQsIE51bWVyaWMgb3IgRGF0ZS4KKyMKK3N1YiB0eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntUeXBlfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBlbmNvZGluZygpCisjCisjIFJldHVybnMgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgY2VsbC4KKyMKK3N1YiBlbmNvZGluZyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKCAhZGVmaW5lZCAkc2VsZi0+e0NvZGV9ICkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzaWYgKCAkc2VsZi0+e0NvZGV9IGVxICd1Y3MyJyApIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGVsc2lmICggJHNlbGYtPntDb2RlfSBlcSAnX25hdGl2ZV8nICkgeworICAgICAgICByZXR1cm4gMzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiAkc2VsZi0+e0NvZGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX21lcmdlZCgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgY2VsbCBpcyBtZXJnZWQuCisjCitzdWIgaXNfbWVyZ2VkIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntNZXJnZWR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9yaWNoX3RleHQoKQorIworIyBSZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBmb250IGluZm9ybWF0aW9uIGFib3V0IGVhY2ggc3RyaW5nIGJsb2NrIGluIGEgInJpY2giLAorIyBpLmUuIG11bHRpLWZvcm1hdCwgc3RyaW5nLgorIworc3ViIGdldF9yaWNoX3RleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1JpY2h9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqVmFsdWUgPSAqdmFsdWU7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Q2VsbCAtIEEgY2xhc3MgZm9yIENlbGwgZGF0YSBhbmQgZm9ybWF0dGluZy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBNZXRob2RzCisKK1RoZSBmb2xsb3dpbmcgQ2VsbCBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICAkY2VsbC0+dmFsdWUoKQorICAgICRjZWxsLT51bmZvcm1hdHRlZCgpCisgICAgJGNlbGwtPmdldF9mb3JtYXQoKQorICAgICRjZWxsLT50eXBlKCkKKyAgICAkY2VsbC0+ZW5jb2RpbmcoKQorICAgICRjZWxsLT5pc19tZXJnZWQoKQorICAgICRjZWxsLT5nZXRfcmljaF90ZXh0KCkKKworCis9aGVhZDIgdmFsdWUoKQorCitUaGUgQzx2YWx1ZSgpPiBtZXRob2QgcmV0dXJucyB0aGUgZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorCisgICAgbXkgJHZhbHVlID0gJGNlbGwtPnZhbHVlKCk7CisKK0Zvcm1hdHRlZCBpbiB0aGlzIHNlbnNlIHJlZmVycyB0byB0aGUgbnVtZXJpYyBmb3JtYXQgb2YgdGhlIGNlbGwgdmFsdWUuIEZvciBleGFtcGxlIGEgbnVtYmVyIHN1Y2ggYXMgNDAxNzcgbWlnaHQgYmUgZm9ybWF0dGVkIGFzIDQwLDExNywgNDAxMTcuMDAwIG9yIGV2ZW4gYXMgdGhlIGRhdGUgMjAwOS8xMi8zMC4KKworSWYgdGhlIGNlbGwgZG9lc24ndCBjb250YWluIGEgbnVtZXJpYyBmb3JtYXQgdGhlbiB0aGUgZm9ybWF0dGVkIGFuZCB1bmZvcm1hdHRlZCBjZWxsIHZhbHVlcyBhcmUgdGhlIHNhbWUsIHNlZSB0aGUgQzx1bmZvcm1hdHRlZCgpPiBtZXRob2QgYmVsb3cuCisKK0ZvciBhIGRlZmluZWQgQzwkY2VsbD4gdGhlIEM8dmFsdWUoKT4gbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCitJbiB0aGUgY2FzZSBvZiBhIGNlbGwgd2l0aCBmb3JtYXR0aW5nIGJ1dCBubyBudW1lcmljIG9yIHN0cmluZyBjb250ZW50cyB0aGUgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcgQzwnJz4uCisKKworPWhlYWQyIHVuZm9ybWF0dGVkKCkKKworVGhlIEM8dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIHJldHVybnMgdGhlIHVuZm9ybWF0dGVkIHZhbHVlIG9mIHRoZSBjZWxsLgorCisgICAgbXkgJHVuZm9ybWF0dGVkID0gJGNlbGwtPnVuZm9ybWF0dGVkKCk7CisKK1JldHVybnMgdGhlIGNlbGwgdmFsdWUgd2l0aG91dCBhIG51bWVyaWMgZm9ybWF0LiBTZWUgdGhlIEM8dmFsdWUoKT4gbWV0aG9kIGFib3ZlLgorCisKKz1oZWFkMiBnZXRfZm9ybWF0KCkKKworVGhlIEM8Z2V0X2Zvcm1hdCgpPiBtZXRob2QgcmV0dXJucyB0aGUgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0PiBvYmplY3QgZm9yIHRoZSBjZWxsLgorCisgICAgbXkgJGZvcm1hdCA9ICRjZWxsLT5nZXRfZm9ybWF0KCk7CisKK0lmIGEgdXNlciBkZWZpbmVkIGZvcm1hdCBoYXNuJ3QgYmVlbiBhcHBsaWVkIHRvIHRoZSBjZWxsIHRoZW4gdGhlIGRlZmF1bHQgY2VsbCBmb3JtYXQgaXMgcmV0dXJuZWQuCisKKworPWhlYWQyIHR5cGUoKQorCitUaGUgQzx0eXBlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB0eXBlIG9mIGNlbGwgc3VjaCBhcyBUZXh0LCBOdW1lcmljIG9yIERhdGUuIElmIHRoZSB0eXBlIHdhcyBkZXRlY3RlZCBhcyBOdW1lcmljLCBhbmQgdGhlIENlbGwgRm9ybWF0IG1hdGNoZXMgQzxte15bZG15XVstXFwvZG15XSokfWk+LCBpdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBEYXRlIHR5cGUuCisKKyAgICBteSAkdHlwZSA9ICRjZWxsLT50eXBlKCk7CisKK1NlZSBhbHNvIEw8RGF0ZXMgYW5kIFRpbWUgaW4gRXhjZWw+LgorCisKKz1oZWFkMiBlbmNvZGluZygpCisKK1RoZSBDPGVuY29kaW5nKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIGNlbGwuCisKKyAgICBteSAkZW5jb2RpbmcgPSAkY2VsbC0+ZW5jb2RpbmcoKTsKKworVGhpcyBtZXRob2QgaXMgb25seSBvZiBpbnRlcmVzdCB0byBkZXZlbG9wZXJzLiBJbiBnZW5lcmFsIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIHdpbGwgcmV0dXJuIGFsbCBjaGFyYWN0ZXIgc3RyaW5ncyBpbiBVVEYtOCByZWdhcmRsZXNzIG9mIHRoZSBlbmNvZGluZyB1c2VkIGJ5IEV4Y2VsLgorCitUaGUgQzxlbmNvZGluZygpPiBtZXRob2QgcmV0dXJucyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKKz1vdmVyCisKKz1pdGVtICogMDogVW5rbm93biBmb3JtYXQuIFRoaXMgc2hvdWxkbid0IGhhcHBlbi4gSW4gdGhlIGRlZmF1bHQgY2FzZSB0aGUgZm9ybWF0IHNob3VsZCBiZSAxLgorCis9aXRlbSAqIDE6IDhiaXQgQVNDSUkgb3Igc2luZ2xlIGJ5dGUgVVRGLTE2LiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBjaGFyYWN0ZXJzIGFyZSBlbmNvZGVkIGluIGEgc2luZ2xlIGJ5dGUuIEluIEV4Y2VsIDk1IGFuZCBlYXJsaWVyIFRoaXMgdXN1YWxseSBtZWFudCBBU0NJSSBvciBhbiBpbnRlcm5hdGlvbmFsIHZhcmlhbnQuIEluIEV4Y2VsIDk3IGl0IHJlZmVycyB0byBhIGNvbXByZXNzZWQgVVRGLTE2IGNoYXJhY3RlciBzdHJpbmcgd2hlcmUgYWxsIG9mIHRoZSBoaWdoIG9yZGVyIGJ5dGVzIGFyZSAwIGFuZCBhcmUgb21pdHRlZCB0byBzYXZlIHNwYWNlLgorCis9aXRlbSAqIDI6IFVURi0xNkJFLgorCis9aXRlbSAqIDM6IE5hdGl2ZSBlbmNvZGluZy4gSW4gRXhjZWwgOTUgYW5kIGVhcmxpZXIgdGhpcyBlbmNvZGluZyB3YXMgdXNlZCB0byByZXByZXNlbnQgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgZW5jb2RpbmdzIHN1Y2ggYXMgU0pJUy4KKworPWJhY2sKKworCis9aGVhZDIgaXNfbWVyZ2VkKCkKKworVGhlIEM8aXNfbWVyZ2VkKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGNlbGwgaXMgbWVyZ2VkLgorCisgICAgbXkgJGlzX21lcmdlZCA9ICRjZWxsLT5pc19tZXJnZWQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfcmljaF90ZXh0KCkKKworVGhlIEM8Z2V0X3JpY2hfdGV4dCgpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgZm9udCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHN0cmluZyBibG9jayBpbiBhICJyaWNoIiwgaS5lLiBtdWx0aS1mb3JtYXQsIHN0cmluZy4KKworICAgIG15ICRyaWNoX3RleHQgPSAkY2VsbC0+Z2V0X3JpY2hfdGV4dCgpOworCitUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGFycmF5cmVmIG9mIGFycmF5cmVmcyBpbiB0aGUgZm9ybToKKworICAgIFsKKyAgICAgICAgWyAkc3RhcnRfcG9zaXRpb24sICRmb250X29iamVjdCBdLAorICAgICAgICAgLi4uLAorICAgIF0KKworUmV0dXJucyB1bmRlZiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMSBEYXRlcyBhbmQgVGltZSBpbiBFeGNlbAorCitEYXRlcyBhbmQgdGltZXMgaW4gRXhjZWwgYXJlIHJlcHJlc2VudGVkIGJ5IHJlYWwgbnVtYmVycywgZm9yIGV4YW1wbGUgIkphbiAxIDIwMDEgMTI6MzAgUE0iIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgMzY4OTIuNTIxLgorCitUaGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBudW1iZXIgc3RvcmVzIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZXBvY2ggYW5kIHRoZSBmcmFjdGlvbmFsIHBhcnQgc3RvcmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBkYXkuCisKK0EgZGF0ZSBvciB0aW1lIGluIEV4Y2VsIGlzIGp1c3QgbGlrZSBhbnkgb3RoZXIgbnVtYmVyLiBUaGUgd2F5IGluIHdoaWNoIGl0IGlzIGRpc3BsYXllZCBpcyBjb250cm9sbGVkIGJ5IHRoZSBudW1iZXIgZm9ybWF0OgorCisgICAgTnVtYmVyIGZvcm1hdCAgICAgICAgICAgICAgICRjZWxsLT52YWx1ZSgpICAgICAgICAgICAgJGNlbGwtPnVuZm9ybWF0dGVkKCkKKyAgICA9PT09PT09PT09PT09ICAgICAgICAgICAgICAgPT09PT09PT09PT09PT0gICAgICAgICAgICA9PT09PT09PT09PT09PQorICAgICdkZC9tbS95eScgICAgICAgICAgICAgICAgICAnMjgvMDIvMDgnICAgICAgICAgICAgICAgIDM5NTA2LjUKKyAgICAnbW0vZGQveXknICAgICAgICAgICAgICAgICAgJzAyLzI4LzA4JyAgICAgICAgICAgICAgICAzOTUwNi41CisgICAgJ2QtbS15eXl5JyAgICAgICAgICAgICAgICAgICcyOC0yLTIwMDgnICAgICAgICAgICAgICAgMzk1MDYuNQorICAgICdkZC9tbS95eSBoaDptbScgICAgICAgICAgICAnMjgvMDIvMDggMTI6MDAnICAgICAgICAgIDM5NTA2LjUKKyAgICAnZCBtbW0geXl5eScgICAgICAgICAgICAgICAgJzI4IEZlYiAyMDA4JyAgICAgICAgICAgICAzOTUwNi41CisgICAgJ21tbSBkIHl5eXkgaGg6bW0gQU0vUE0nICAgICdGZWIgMjggMjAwOCAxMjowMCBQTScgICAgMzk1MDYuNQorCisKK1RoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgY29udGFpbnMgYSBmdW5jdGlvbiBjYWxsZWQgQzxFeGNlbExvY2FsdGltZT4gd2hpY2ggd2lsbCBjb252ZXJ0IGJldHdlZW4gYW4gdW5mb3JtYXR0ZWQgRXhjZWwgZGF0ZS90aW1lIG51bWJlciBhbmQgYSBDPGxvY2FsdGltZSgpPiBsaWtlIGFycmF5LgorCitGb3IgZGF0ZSBjb252ZXJzaW9ucyB1c2luZyB0aGUgQ1BBTiBDPERhdGVUaW1lPiBmcmFtZXdvcmsgc2VlIEw8RGF0ZVRpbWU6OkZvcm1hdDo6RXhjZWw+IGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9RGF0ZVRpbWUtRm9ybWF0LUV4Y2VsCisKKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0R1bXAucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0R1bXAucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4NmRiMgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRHVtcC5wbQpAQCAtMCwwICsxLDM1NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcCAtIEEgY2xhc3MgZm9yIGR1bXBpbmcgRXhjZWwgcmVjb3Jkcy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICVOYW1lVGJsID0gKAorCisgICAgI1AyOTEKKyAgICAweDBBID0+ICdFT0YnLAorICAgIDB4MEMgPT4gJ0NBTENDT1VOVCcsCisgICAgMHgwRCA9PiAnQ0FMQ01PREUnLAorICAgIDB4MEUgPT4gJ1BSRUNJU0lPTicsCisgICAgMHgwRiA9PiAnUkVGTU9ERScsCisgICAgMHgxMCA9PiAnREVMVEEnLAorICAgIDB4MTEgPT4gJ0lURVJBVElPTicsCisgICAgMHgxMiA9PiAnUFJPVEVDVCcsCisgICAgMHgxMyA9PiAnUEFTU1dPUkQnLAorICAgIDB4MTQgPT4gJ0hFQURFUicsCisKKyAgICAweDE1ID0+ICdGT09URVInLAorICAgIDB4MTYgPT4gJ0VYVEVSTkNPVU5UJywKKyAgICAweDE3ID0+ICdFWFRFUk5TSEVFVCcsCisgICAgMHgxOSA9PiAnV0lORE9XUFJPVEVDVCcsCisgICAgMHgxQSA9PiAnVkVSVElDQUxQQUdFQlJFQUtTJywKKyAgICAweDFCID0+ICdIT1JJWk9OVEFMUEFHRUJSRUFLUycsCisgICAgMHgxQyA9PiAnTk9URScsCisgICAgMHgxRCA9PiAnU0VMRUNUSU9OJywKKyAgICAweDIyID0+ICcxOTA0JywKKyAgICAweDI2ID0+ICdMRUZUTUFSR0lOJywKKworICAgIDB4MjcgPT4gJ1JJR0hUTUFSR0lOJywKKyAgICAweDI4ID0+ICdUT1BNQVJHSU4nLAorICAgIDB4MjkgPT4gJ0JPVFRPTU1BUkdJTicsCisgICAgMHgyQSA9PiAnUFJJTlRIRUFERVJTJywKKyAgICAweDJCID0+ICdQUklOVEdSSURMSU5FUycsCisgICAgMHgyRiA9PiAnRklMRVBBU1MnLAorICAgIDB4M0MgPT4gJ0NPVU5USU5VRScsCisgICAgMHgzRCA9PiAnV0lORE9XMScsCisgICAgMHg0MCA9PiAnQkFDS1VQJywKKyAgICAweDQxID0+ICdQQU5FJywKKworICAgIDB4NDIgPT4gJ0NPREVQQUdFJywKKyAgICAweDREID0+ICdQTFMnLAorICAgIDB4NTAgPT4gJ0RDT04nLAorICAgIDB4NTEgPT4gJ0RDT05SRUYnLAorCisgICAgI1AyOTIKKyAgICAweDUyID0+ICdEQ09OTkFNRScsCisgICAgMHg1NSA9PiAnREVGQ09MV0lEVEgnLAorICAgIDB4NTkgPT4gJ1hDVCcsCisgICAgMHg1QSA9PiAnQ1JOJywKKyAgICAweDVCID0+ICdGSUxFU0hBUklORycsCisgICAgMHg1QyA9PiAnV1JJVEVBQ0NFUycsCisgICAgMHg1RCA9PiAnT0JKJywKKyAgICAweDVFID0+ICdVTkNBTENFRCcsCisgICAgMHg1RiA9PiAnU0FWRVJFQ0FMQycsCisgICAgMHg2MCA9PiAnVEVNUExBVEUnLAorCisgICAgMHg2MyA9PiAnT0JKUFJPVEVDVCcsCisgICAgMHg3RCA9PiAnQ09MSU5GTycsCisgICAgMHg3RSA9PiAnUksnLAorICAgIDB4N0YgPT4gJ0lNREFUQScsCisgICAgMHg4MCA9PiAnR1VUUycsCisgICAgMHg4MSA9PiAnV1NCT09MJywKKyAgICAweDgyID0+ICdHUklEU0VUJywKKyAgICAweDgzID0+ICdIQ0VOVEVSJywKKyAgICAweDg0ID0+ICdWQ0VOVEVSJywKKyAgICAweDg1ID0+ICdCT1VORFNIRUVUJywKKworICAgIDB4ODYgPT4gJ1dSSVRFUFJPVCcsCisgICAgMHg4NyA9PiAnQURESU4nLAorICAgIDB4ODggPT4gJ0VERycsCisgICAgMHg4OSA9PiAnUFVCJywKKyAgICAweDhDID0+ICdDT1VOVFJZJywKKyAgICAweDhEID0+ICdISURFT0JKJywKKyAgICAweDkwID0+ICdTT1JUJywKKyAgICAweDkxID0+ICdTVUInLAorICAgIDB4OTIgPT4gJ1BBTEVUVEUnLAorICAgIDB4OTQgPT4gJ0xIUkVDT1JEJywKKworICAgIDB4OTUgPT4gJ0xITkdSQVBIJywKKyAgICAweDk2ID0+ICdTT1VORCcsCisgICAgMHg5OCA9PiAnTFBSJywKKyAgICAweDk5ID0+ICdTVEFOREFSRFdJRFRIJywKKyAgICAweDlBID0+ICdGTkdST1VQTkFNRScsCisgICAgMHg5QiA9PiAnRklMVEVSTU9ERScsCisgICAgMHg5QyA9PiAnRk5HUk9VUENPVU5UJywKKworICAgICNQMjkzCisgICAgMHg5RCA9PiAnQVVUT0ZJTFRFUklORk8nLAorICAgIDB4OUUgPT4gJ0FVVE9GSUxURVInLAorICAgIDB4QTAgPT4gJ1NDTCcsCisgICAgMHhBMSA9PiAnU0VUVVAnLAorICAgIDB4QTkgPT4gJ0NPT1JETElTVCcsCisgICAgMHhBQiA9PiAnR0NXJywKKyAgICAweEFFID0+ICdTQ0VOTUFOJywKKyAgICAweEFGID0+ICdTQ0VOQVJJTycsCisgICAgMHhCMCA9PiAnU1hWSUVXJywKKyAgICAweEIxID0+ICdTWFZEJywKKworICAgIDB4QjIgPT4gJ1NYVicsCisgICAgMHhCNCA9PiAnU1hJVkQnLAorICAgIDB4QjUgPT4gJ1NYTEknLAorICAgIDB4QjYgPT4gJ1NYUEknLAorICAgIDB4QjggPT4gJ0RPQ1JPVVRFJywKKyAgICAweEI5ID0+ICdSRUNJUE5BTUUnLAorICAgIDB4QkMgPT4gJ1NIUkZNTEEnLAorICAgIDB4QkQgPT4gJ01VTFJLJywKKyAgICAweEJFID0+ICdNVUxCTEFOSycsCisgICAgMHhCRiA9PiAnVE9PTEJBUkhEUicsCisgICAgMHhDMCA9PiAnVE9PTEJBUkVORCcsCisgICAgMHhDMSA9PiAnTU1TJywKKworICAgIDB4QzIgPT4gJ0FERE1FTlUnLAorICAgIDB4QzMgPT4gJ0RFTE1FTlUnLAorICAgIDB4QzUgPT4gJ1NYREknLAorICAgIDB4QzYgPT4gJ1NYREInLAorICAgIDB4Q0QgPT4gJ1NYU1RSSU5HJywKKyAgICAweEQwID0+ICdTWFRCTCcsCisgICAgMHhEMSA9PiAnU1hUQlJHSUlUTScsCisgICAgMHhEMiA9PiAnU1hUQlBHJywKKyAgICAweEQzID0+ICdPQlBST0onLAorICAgIDB4RDUgPT4gJ1NYSVNEVE0nLAorCisgICAgMHhENiA9PiAnUlNUUklORycsCisgICAgMHhENyA9PiAnREJDRUxMJywKKyAgICAweERBID0+ICdCT09LQk9PTCcsCisgICAgMHhEQyA9PiAnUEFSQU1RUlknLAorICAgIDB4REMgPT4gJ1NYRVhUJywKKyAgICAweEREID0+ICdTQ0VOUFJPVEVDVCcsCisgICAgMHhERSA9PiAnT0xFU0laRScsCisKKyAgICAjUDI5NAorICAgIDB4REYgPT4gJ1VEREVTQycsCisgICAgMHhFMCA9PiAnWEYnLAorICAgIDB4RTEgPT4gJ0lOVEVSRkFDRUhEUicsCisgICAgMHhFMiA9PiAnSU5URVJGQUNFRU5EJywKKyAgICAweEUzID0+ICdTWFZTJywKKyAgICAweEVBID0+ICdUQUJJRENPTkYnLAorICAgIDB4RUIgPT4gJ01TT0RSQVdJTkdHUk9VUCcsCisgICAgMHhFQyA9PiAnTVNPRFJBV0lORycsCisgICAgMHhFRCA9PiAnTVNPRFJBV0lOR1NFTEVDVElPTicsCisgICAgMHhFRiA9PiAnUEhPTkVUSUNJTkZPJywKKyAgICAweEYwID0+ICdTWFJVTEUnLAorCisgICAgMHhGMSA9PiAnU1hFWFQnLAorICAgIDB4RjIgPT4gJ1NYRklMVCcsCisgICAgMHhGNiA9PiAnU1hOQU1FJywKKyAgICAweEY3ID0+ICdTWFNFTEVDVCcsCisgICAgMHhGOCA9PiAnU1hQQUlSJywKKyAgICAweEY5ID0+ICdTWEZNTEEnLAorICAgIDB4RkIgPT4gJ1NYRk9STUFUJywKKyAgICAweEZDID0+ICdTU1QnLAorICAgIDB4RkQgPT4gJ0xBQkVMU1NUJywKKyAgICAweEZGID0+ICdFWFRTU1QnLAorCisgICAgMHgxMDAgPT4gJ1NYVkRFWCcsCisgICAgMHgxMDMgPT4gJ1NYRk9STVVMQScsCisgICAgMHgxMjIgPT4gJ1NYREJFWCcsCisgICAgMHgxM0QgPT4gJ1RBQklEJywKKyAgICAweDE2MCA9PiAnVVNFU0VMRlMnLAorICAgIDB4MTYxID0+ICdEU0YnLAorICAgIDB4MTYyID0+ICdYTDVNT0RJRlknLAorICAgIDB4MUE1ID0+ICdGSUxFU0hBUklORzInLAorICAgIDB4MUE5ID0+ICdVU0VSQlZJRVcnLAorICAgIDB4MUFBID0+ICdVU0VSVklFV0JFR0lOJywKKworICAgIDB4MUFCID0+ICdVU0VSU1ZJRVdFTkQnLAorICAgIDB4MUFEID0+ICdRU0knLAorICAgIDB4MUFFID0+ICdTVVBCT09LJywKKyAgICAweDFBRiA9PiAnUFJPVDRSRVYnLAorICAgIDB4MUIwID0+ICdDT05ERk1UJywKKyAgICAweDFCMSA9PiAnQ0YnLAorICAgIDB4MUIyID0+ICdEVkFMJywKKworICAgICNQMjk1CisgICAgMHgxQjUgPT4gJ0RDT05CSU4nLAorICAgIDB4MUI2ID0+ICdUWE8nLAorICAgIDB4MUI3ID0+ICdSRUZSRVNIQUxMJywKKyAgICAweDFCOCA9PiAnSExJTksnLAorICAgIDB4MUJBID0+ICdDT0RFTkFNRScsCisgICAgMHgxQkIgPT4gJ1NYRkRCVFlQRScsCisgICAgMHgxQkMgPT4gJ1BST1Q0UkVWUEFTUycsCisgICAgMHgxQkUgPT4gJ0RWJywKKyAgICAweDIwMCA9PiAnRElNRU5TSU9OUycsCisgICAgMHgyMDEgPT4gJ0JMQU5LJywKKworICAgIDB4MjAyID0+ICdJbnRlZ2VyJywgICAgICAgICAgICAjTm90IERvY3VtZW50ZWQKKyAgICAweDIwMyA9PiAnTlVNQkVSJywKKyAgICAweDIwNCA9PiAnTEFCRUwnLAorICAgIDB4MjA1ID0+ICdCT09MRVJSJywKKyAgICAweDIwNyA9PiAnU1RSSU5HJywKKyAgICAweDIwOCA9PiAnUk9XJywKKyAgICAweDIwQiA9PiAnSU5ERVgnLAorICAgIDB4MjE4ID0+ICdOQU1FJywKKyAgICAweDIyMSA9PiAnQVJSQVknLAorICAgIDB4MjIzID0+ICdFWFRFUk5OQU1FJywKKyAgICAweDIyNSA9PiAnREVGQVVMVFJPV0hFSUdIVCcsCisKKyAgICAweDIzMSA9PiAnRk9OVCcsCisgICAgMHgyMzYgPT4gJ1RBQkxFJywKKyAgICAweDIzRSA9PiAnV0lORE9XMicsCisgICAgMHgyOTMgPT4gJ1NUWUxFJywKKyAgICAweDQwNiA9PiAnRk9STVVMQScsCisgICAgMHg0MUUgPT4gJ0ZPUk1BVCcsCisKKyAgICAweDE4ID0+ICdOQU1FJywKKworICAgIDB4MDYgPT4gJ0ZPUk1VTEEnLAorCisgICAgMHgwOSAgPT4gJ0JPRihCSUZGMiknLAorICAgIDB4MjA5ID0+ICdCT0YoQklGRjMpJywKKyAgICAweDQwOSA9PiAnQk9GKEJJRkY0KScsCisgICAgMHg4MDkgPT4gJ0JPRihCSUZGNS03KScsCisKKyAgICAweDMxID0+ICdGT05UJywgMHgyN0UgPT4gJ1JLJywKKworICAgICNDaGFydC9HcmFwaAorICAgIDB4MTAwMSA9PiAnVU5JVFMnLAorICAgIDB4MTAwMiA9PiAnQ0hBUlQnLAorICAgIDB4MTAwMyA9PiAnU0VSSVNFUycsCisgICAgMHgxMDA2ID0+ICdEQVRBRk9STUFUJywKKyAgICAweDEwMDcgPT4gJ0xJTkVGT1JNQVQnLAorICAgIDB4MTAwOSA9PiAnTUFLRVJGT1JNQVQnLAorICAgIDB4MTAwQSA9PiAnQVJFQUZPUk1BVCcsCisgICAgMHgxMDBCID0+ICdQSUVGT1JNQVQnLAorICAgIDB4MTAwQyA9PiAnQVRUQUNIRURMQUJFTCcsCisgICAgMHgxMDBEID0+ICdTRVJJRVNURVhUJywKKyAgICAweDEwMTQgPT4gJ0NIQVJURk9STUFUJywKKyAgICAweDEwMTUgPT4gJ0xFR0VORCcsCisgICAgMHgxMDE2ID0+ICdTRVJJRVNMSVNUJywKKyAgICAweDEwMTcgPT4gJ0JBUicsCisgICAgMHgxMDE4ID0+ICdMSU5FJywKKyAgICAweDEwMTkgPT4gJ1BJRScsCisgICAgMHgxMDFBID0+ICdBUkVBJywKKyAgICAweDEwMUIgPT4gJ1NDQVRURVInLAorICAgIDB4MTAxQyA9PiAnQ0hBUlRMSU5FJywKKyAgICAweDEwMUQgPT4gJ0FYSVMnLAorICAgIDB4MTAxRSA9PiAnVElDSycsCisgICAgMHgxMDFGID0+ICdWQUxVRVJBTkdFJywKKyAgICAweDEwMjAgPT4gJ0NBVFNFUlJBTkdFJywKKyAgICAweDEwMjEgPT4gJ0FYSVNMSU5FRk9STUFUJywKKyAgICAweDEwMjIgPT4gJ0NIQVJURk9STUFUTElOSycsCisgICAgMHgxMDI0ID0+ICdERUZBVUxUVEVYVCcsCisgICAgMHgxMDI1ID0+ICdURVhUJywKKyAgICAweDEwMjYgPT4gJ0ZPTlRYJywKKyAgICAweDEwMjcgPT4gJ09CSkVDVExJTksnLAorICAgIDB4MTAzMiA9PiAnRlJBTUUnLAorICAgIDB4MTAzMyA9PiAnQkVHSU4nLAorICAgIDB4MTAzNCA9PiAnRU5EJywKKyAgICAweDEwMzUgPT4gJ1BMT1RBUkVBJywKKyAgICAweDEwM0EgPT4gJzNEJywKKyAgICAweDEwM0MgPT4gJ1BJQ0YnLAorICAgIDB4MTAzRCA9PiAnRFJPUEJBUicsCisgICAgMHgxMDNFID0+ICdSQURBUicsCisgICAgMHgxMDNGID0+ICdTVVJGQUNFJywKKyAgICAweDEwNDAgPT4gJ1JBREFSQVJFQScsCisgICAgMHgxMDQxID0+ICdBWElTUEFSRU5UJywKKyAgICAweDEwNDMgPT4gJ0xFR0VORFhOJywKKyAgICAweDEwNDQgPT4gJ1NIVFBST1BTJywKKyAgICAweDEwNDUgPT4gJ1NFUlRPQ1JUJywKKyAgICAweDEwNDYgPT4gJ0FYRVNVU0VEJywKKyAgICAweDEwNDggPT4gJ1NCQVNFUkVGJywKKyAgICAweDEwNEEgPT4gJ1NFUlBBUkVOVCcsCisgICAgMHgxMDRCID0+ICdTRVJBVVhUUkVORCcsCisgICAgMHgxMDRFID0+ICdJRk1UJywKKyAgICAweDEwNEYgPT4gJ1BPUycsCisgICAgMHgxMDUwID0+ICdBTFJVTlMnLAorICAgIDB4MTA1MSA9PiAnQUknLAorICAgIDB4MTA1QiA9PiAnU0VSQVVYRVJSQkFSJywKKyAgICAweDEwNUQgPT4gJ1NFUkZNVCcsCisgICAgMHgxMDYwID0+ICdGQkknLAorICAgIDB4MTA2MSA9PiAnQk9QUE9QJywKKyAgICAweDEwNjIgPT4gJ0FYQ0VYVCcsCisgICAgMHgxMDYzID0+ICdEQVQnLAorICAgIDB4MTA2NCA9PiAnUExPVEdST1dUSCcsCisgICAgMHgxMDY1ID0+ICdTSU5ERVgnLAorICAgIDB4MTA2NiA9PiAnR0VMRlJBTUUnLAorICAgIDB4MTA2NyA9PiAnQlBPUFBPUENVU1RPTScsCispOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHN1YkRVTVAgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBzdWJEVU1QIHsKKyAgICBteSAoICRvQm9vaywgJGJPcCwgJGJMZW4sICRzV2sgKSA9IEBfOworICAgIHByaW50ZiAiJTA0WDolLTIzcyAoTGVuOiUzZCkgOiAlc1xuIiwKKyAgICAgICRiT3AsIE9wTmFtZSgkYk9wKSwgJGJMZW4sIHVucGFjayggIkg0MCIsICRzV2sgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC0+T3BOYW1lCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgT3BOYW1lIHsKKyAgICBteSAoJGJPcCkgPSBAXzsKKyAgICByZXR1cm4gKCBkZWZpbmVkICROYW1lVGJseyRiT3B9ICkgPyAkTmFtZVRibHskYk9wfSA6ICd1bmRlZic7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6RHVtcCAtIEEgY2xhc3MgZm9yIGR1bXBpbmcgRXhjZWwgcmVjb3Jkcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dAorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdERlZmF1bHQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdERlZmF1bHQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE2ODY2ZgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm10RGVmYXVsdC5wbQpAQCAtMCwwICsxLDIyMSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgcXcoRXhjZWxGbXQpOworb3VyICRWRVJTSU9OID0gJzAuNTknOworCitteSAlaEZtdERlZmF1bHQgPSAoCisgICAgMHgwMCA9PiAnQCcsCisgICAgMHgwMSA9PiAnMCcsCisgICAgMHgwMiA9PiAnMC4wMCcsCisgICAgMHgwMyA9PiAnIywjIzAnLAorICAgIDB4MDQgPT4gJyMsIyMwLjAwJywKKyAgICAweDA1ID0+ICcoJCMsIyMwXyk7KCQjLCMjMCknLAorICAgIDB4MDYgPT4gJygkIywjIzBfKTtbUkVEXSgkIywjIzApJywKKyAgICAweDA3ID0+ICcoJCMsIyMwLjAwXyk7KCQjLCMjMC4wMF8pJywKKyAgICAweDA4ID0+ICcoJCMsIyMwLjAwXyk7W1JFRF0oJCMsIyMwLjAwXyknLAorICAgIDB4MDkgPT4gJzAlJywKKyAgICAweDBBID0+ICcwLjAwJScsCisgICAgMHgwQiA9PiAnMC4wMEUrMDAnLAorICAgIDB4MEMgPT4gJyMgPy8/JywKKyAgICAweDBEID0+ICcjID8/Lz8/JywKKyAgICAweDBFID0+ICd5eXl5LW1tLWRkJywgICAgICAjIFdhcyAnbS1kLXl5Jywgd2hpY2ggaXMgYmFkIGFzIHN5c3RlbSBkZWZhdWx0CisgICAgMHgwRiA9PiAnZC1tbW0teXknLAorICAgIDB4MTAgPT4gJ2QtbW1tJywKKyAgICAweDExID0+ICdtbW0teXknLAorICAgIDB4MTIgPT4gJ2g6bW0gQU0vUE0nLAorICAgIDB4MTMgPT4gJ2g6bW06c3MgQU0vUE0nLAorICAgIDB4MTQgPT4gJ2g6bW0nLAorICAgIDB4MTUgPT4gJ2g6bW06c3MnLAorICAgIDB4MTYgPT4gJ20tZC15eSBoOm1tJywKKworICAgICMweDE3LTB4MjQgLS0gRGlmZmVycyBpbiBOYXRpbmFsCisgICAgMHgyNSA9PiAnKCMsIyMwXyk7KCMsIyMwKScsCisgICAgMHgyNiA9PiAnKCMsIyMwXyk7W1JFRF0oIywjIzApJywKKyAgICAweDI3ID0+ICcoIywjIzAuMDApOygjLCMjMC4wMCknLAorICAgIDB4MjggPT4gJygjLCMjMC4wMCk7W1JFRF0oIywjIzAuMDApJywKKyAgICAweDI5ID0+ICdfKCojLCMjMF8pO18oKigjLCMjMCk7XygqIi0iXyk7XyhAXyknLAorICAgIDB4MkEgPT4gJ18oJCojLCMjMF8pO18oJCooIywjIzApO18oKiItIl8pO18oQF8pJywKKyAgICAweDJCID0+ICdfKCojLCMjMC4wMF8pO18oKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyQyA9PiAnXygkKiMsIyMwLjAwXyk7XygkKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyRCA9PiAnbW06c3MnLAorICAgIDB4MkUgPT4gJ1toXTptbTpzcycsCisgICAgMHgyRiA9PiAnbW06c3MuMCcsCisgICAgMHgzMCA9PiAnIyMwLjBFKzAnLAorICAgIDB4MzEgPT4gJ0AnLAorKTsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICVoS2V5ICkgPSBAXzsKKyAgICBteSAkb1RoaXMgPSB7fTsKKyAgICBibGVzcyAkb1RoaXM7CisgICAgcmV0dXJuICRvVGhpczsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUZXh0Rm10IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgVGV4dEZtdCB7CisgICAgbXkgKCAkb1RoaXMsICRzVHh0LCAkc0NvZGUgKSA9IEBfOworICAgIHJldHVybiAkc1R4dCBpZiAoICggIWRlZmluZWQoJHNDb2RlKSApIHx8ICggJHNDb2RlIGVxICdfbmF0aXZlXycgKSApOworICAgIHJldHVybiBwYWNrKCAnVSonLCB1bnBhY2soICduKicsICRzVHh0ICkgKTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBGbXRTdHJpbmdEZWYgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBGbXRTdHJpbmdEZWYgeworICAgIG15ICggJG9UaGlzLCAkaUZtdElkeCwgJG9Cb29rLCAkcmhGbXQgKSA9IEBfOworICAgIG15ICRzRm10U3RyID0gJG9Cb29rLT57Rm9ybWF0U3RyfS0+eyRpRm10SWR4fTsKKworICAgIGlmICggISggZGVmaW5lZCgkc0ZtdFN0cikgKSAmJiBkZWZpbmVkKCRyaEZtdCkgKSB7CisgICAgICAgICRzRm10U3RyID0gJHJoRm10LT57JGlGbXRJZHh9OworICAgIH0KKyAgICAkc0ZtdFN0ciA9ICRoRm10RGVmYXVsdHskaUZtdElkeH0gdW5sZXNzICgkc0ZtdFN0cik7CisgICAgcmV0dXJuICRzRm10U3RyOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZtdFN0cmluZyAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEZtdFN0cmluZyB7CisgICAgbXkgKCAkb1RoaXMsICRvQ2VsbCwgJG9Cb29rICkgPSBAXzsKKworICAgIG15ICRzRm10U3RyID0KKyAgICAgICRvVGhpcy0+Rm10U3RyaW5nRGVmKCAkb0Jvb2stPntGb3JtYXR9WyAkb0NlbGwtPntGb3JtYXROb30gXS0+e0ZtdElkeH0sCisgICAgICAgICRvQm9vayApOworCisgICAgIyBTcGVjaWFsIGNhc2UgZm9yIGNlbGxzIHRoYXQgdXNlIExvdHVzMTIzIHN0eWxlIGxlYWRpbmcKKyAgICAjIGFwb3N0cm9waGUgdG8gZGVzaWduYXRlIHRleHQgZm9ybWF0dGluZy4KKyAgICBpZiAoICRvQm9vay0+e0Zvcm1hdH1bICRvQ2VsbC0+e0Zvcm1hdE5vfSBdLT57S2V5MTIzfSApIHsKKyAgICAgICAgJHNGbXRTdHIgPSAnQCc7CisgICAgfQorCisgICAgdW5sZXNzICggZGVmaW5lZCgkc0ZtdFN0cikgKSB7CisgICAgICAgIGlmICggJG9DZWxsLT57VHlwZX0gZXEgJ051bWVyaWMnICkgeworICAgICAgICAgICAgaWYgKCBpbnQoICRvQ2VsbC0+e1ZhbH0gKSAhPSAkb0NlbGwtPntWYWx9ICkgeworICAgICAgICAgICAgICAgICRzRm10U3RyID0gJzAuMDAnOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHNGbXRTdHIgPSAnMCc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkb0NlbGwtPntUeXBlfSBlcSAnRGF0ZScgKSB7CisgICAgICAgICAgICBpZiAoIGludCggJG9DZWxsLT57VmFsfSApIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgJHNGbXRTdHIgPSAnaDptbTpzcyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkc0ZtdFN0ciA9ICd5eXl5LW1tLWRkJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzRm10U3RyID0gJ0AnOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkc0ZtdFN0cjsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBWYWxGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBWYWxGbXQgeworICAgIG15ICggJG9UaGlzLCAkb0NlbGwsICRvQm9vayApID0gQF87CisKKyAgICBteSAoICREdCwgJGlGbXRJZHgsICRpTnVtZXJpYywgJEZsZzE5MDQgKTsKKworICAgIGlmICggJG9DZWxsLT57VHlwZX0gZXEgJ1RleHQnICkgeworICAgICAgICAkRHQgPQorICAgICAgICAgICggKCBkZWZpbmVkICRvQ2VsbC0+e1ZhbH0gKSAmJiAoICRvQ2VsbC0+e1ZhbH0gbmUgJycgKSApCisgICAgICAgICAgPyAkb1RoaXMtPlRleHRGbXQoICRvQ2VsbC0+e1ZhbH0sICRvQ2VsbC0+e0NvZGV9ICkKKyAgICAgICAgICA6ICcnOworCisgICAgICAgIHJldHVybiAkRHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkRHQgICAgICA9ICRvQ2VsbC0+e1ZhbH07CisgICAgICAgICRGbGcxOTA0ID0gJG9Cb29rLT57RmxnMTkwNH07CisgICAgICAgIG15ICRzRm10U3RyID0gJG9UaGlzLT5GbXRTdHJpbmcoICRvQ2VsbCwgJG9Cb29rICk7CisKKyAgICAgICAgcmV0dXJuIEV4Y2VsRm10KCAkc0ZtdFN0ciwgJER0LCAkRmxnMTkwNCwgJG9DZWxsLT57VHlwZX0gKTsKKyAgICB9Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ2hrVHlwZSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIENoa1R5cGUgeworICAgIG15ICggJG9Qa2csICRpTnVtZXJpYywgJGlGbXRJZHggKSA9IEBfOworICAgIGlmICgkaU51bWVyaWMpIHsKKyAgICAgICAgaWYgKCAgICggKCAkaUZtdElkeCA+PSAweDBFICkgJiYgKCAkaUZtdElkeCA8PSAweDE2ICkgKQorICAgICAgICAgICAgfHwgKCAoICRpRm10SWR4ID49IDB4MkQgKSAmJiAoICRpRm10SWR4IDw9IDB4MkYgKSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICJEYXRlIjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAiTnVtZXJpYyI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAiVGV4dCI7CisgICAgfQorfQorCisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdERlZmF1bHQgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm10SmFwYW4ucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZjJiMTYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuLnBtCkBAIC0wLDAgKzEsMjEwIEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbjsKK3VzZSB1dGY4OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRW5jb2RlIHF3KGZpbmRfZW5jb2RpbmcgZGVjb2RlKTsKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCc7CitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICVGb3JtYXRUYWJsZSA9ICgKKyAgICAweDAwID0+ICdAJywKKyAgICAweDAxID0+ICcwJywKKyAgICAweDAyID0+ICcwLjAwJywKKyAgICAweDAzID0+ICcjLCMjMCcsCisgICAgMHgwNCA9PiAnIywjIzAuMDAnLAorICAgIDB4MDUgPT4gJyhcXCMsIyMwXyk7KFxcIywjIzApJywKKyAgICAweDA2ID0+ICcoXFwjLCMjMF8pO1tSRURdKFxcIywjIzApJywKKyAgICAweDA3ID0+ICcoXFwjLCMjMC4wMF8pOyhcXCMsIyMwLjAwXyknLAorICAgIDB4MDggPT4gJyhcXCMsIyMwLjAwXyk7W1JFRF0oXFwjLCMjMC4wMF8pJywKKyAgICAweDA5ID0+ICcwJScsCisgICAgMHgwQSA9PiAnMC4wMCUnLAorICAgIDB4MEIgPT4gJzAuMDBFKzAwJywKKyAgICAweDBDID0+ICcjID8vPycsCisgICAgMHgwRCA9PiAnIyA/Py8/PycsCisKKyAgICAjICAgIDB4MEUgPT4gJ20vZC95eScsCisgICAgMHgwRSA9PiAneXl5eS9tL2QnLAorICAgIDB4MEYgPT4gJ2QtbW1tLXl5JywKKyAgICAweDEwID0+ICdkLW1tbScsCisgICAgMHgxMSA9PiAnbW1tLXl5JywKKyAgICAweDEyID0+ICdoOm1tIEFNL1BNJywKKyAgICAweDEzID0+ICdoOm1tOnNzIEFNL1BNJywKKyAgICAweDE0ID0+ICdoOm1tJywKKyAgICAweDE1ID0+ICdoOm1tOnNzJywKKworICAgICMgICAgMHgxNiA9PiAnbS9kL3l5IGg6bW0nLAorICAgIDB4MTYgPT4gJ3l5eXkvbS9kIGg6bW0nLAorCisgICAgIzB4MTctMHgyNCAtLSBEaWZmZXJzIGluIE5hdGluYWwKKyAgICAweDFFID0+ICdtL2QveXknLAorICAgIDB4MUYgPT4gJ3l5eXki5bm0Im0i5pyIImQi5pelIicsCisgICAgMHgyMCA9PiAnaCLmmYIibW0i5YiGIicsCisgICAgMHgyMSA9PiAnaCLmmYIibW0i5YiGInNzIuenkiInLAorCisgICAgIzB4MTctMHgyNCAtLSBEaWZmZXJzIGluIE5hdGluYWwKKyAgICAweDI1ID0+ICcoIywjIzBfKTsoIywjIzApJywKKyAgICAweDI2ID0+ICcoIywjIzBfKTtbUkVEXSgjLCMjMCknLAorICAgIDB4MjcgPT4gJygjLCMjMC4wMCk7KCMsIyMwLjAwKScsCisgICAgMHgyOCA9PiAnKCMsIyMwLjAwKTtbUkVEXSgjLCMjMC4wMCknLAorICAgIDB4MjkgPT4gJ18oKiMsIyMwXyk7XygqKCMsIyMwKTtfKCoiLSJfKTtfKEBfKScsCisgICAgMHgyQSA9PiAnXyhcXCojLCMjMF8pO18oXFwqKCMsIyMwKTtfKCoiLSJfKTtfKEBfKScsCisgICAgMHgyQiA9PiAnXygqIywjIzAuMDBfKTtfKCooIywjIzAuMDApO18oKiItIj8/Xyk7XyhAXyknLAorICAgIDB4MkMgPT4gJ18oXFwqIywjIzAuMDBfKTtfKFxcKigjLCMjMC4wMCk7XygqIi0iPz9fKTtfKEBfKScsCisgICAgMHgyRCA9PiAnbW06c3MnLAorICAgIDB4MkUgPT4gJ1toXTptbTpzcycsCisgICAgMHgyRiA9PiAnbW06c3MuMCcsCisgICAgMHgzMCA9PiAnIyMwLjBFKzAnLAorICAgIDB4MzEgPT4gJ0AnLAorCisgICAgMHgzNyA9PiAneXl5eSLlubQibSLmnIgiJywKKyAgICAweDM4ID0+ICdtIuaciCJkIuaXpSInLAorICAgIDB4MzkgPT4gJ2dlLm0uZCcsCisgICAgMHgzQSA9PiAnZ2dnZSLlubQibSLmnIgiZCLml6UiJywKKyk7CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgbmV3IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIG5ldyB7CisgICAgbXkgKCAkY2xhc3MsICVhcmdzICkgPSBAXzsKKyAgICBteSAkZW5jb2RpbmcgPSAkYXJnc3tDb2RlfSB8fCAkYXJnc3tlbmNvZGluZ307CisgICAgbXkgJHNlbGYgPSB7IENvZGUgPT4gJGVuY29kaW5nIH07CisgICAgaWYoJGVuY29kaW5nKXsKKyAgICAgICAgJHNlbGYtPntlbmNvZGluZ30gPSBmaW5kX2VuY29kaW5nKCRlbmNvZGluZyBlcSAnc2ppcycgPyAnY3A5MzInIDogJGVuY29kaW5nKQorICAgICAgICAgICAgb3IgZG97CisgICAgICAgICAgICAgICAgcmVxdWlyZSBDYXJwOworICAgICAgICAgICAgICAgIENhcnA6OmNyb2FrKHFxe1Vua25vd24gZW5jb2RpbmcgJyRlbmNvZGluZyd9KTsKKyAgICAgICAgICAgIH07CisgICAgfQorICAgIHJldHVybiBibGVzcyAkc2VsZiwgJGNsYXNzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4pCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgVGV4dEZtdCB7CisgICAgbXkgKCAkc2VsZiwgJHRleHQsICRpbnB1dF9lbmNvZGluZyApID0gQF87CisgICAgaWYoIWRlZmluZWQgJGlucHV0X2VuY29kaW5nKXsKKyAgICAgICAgJGlucHV0X2VuY29kaW5nID0gJ3V0ZjgnOworICAgIH0KKyAgICBlbHNpZigkaW5wdXRfZW5jb2RpbmcgZXEgJ19uYXRpdmVfJyl7CisgICAgICAgICRpbnB1dF9lbmNvZGluZyA9ICdjcDkzMic7ICMgU2hpZnRfSklTIGluIE1pY3Jvc29mdCBwcm9kdWN0cworICAgIH0KKyAgICAkdGV4dCA9IGRlY29kZSgkaW5wdXRfZW5jb2RpbmcsICR0ZXh0KTsKKyAgICByZXR1cm4gJHNlbGYtPntDb2RlfSA/ICRzZWxmLT57ZW5jb2Rpbmd9LT5lbmNvZGUoJHRleHQpIDogJHRleHQ7Cit9CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZtdFN0cmluZ0RlZiAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbikKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBGbXRTdHJpbmdEZWYgeworICAgIG15ICggJHNlbGYsICRmb3JtYXRfaW5kZXgsICRib29rICkgPSBAXzsKKyAgICByZXR1cm4gJHNlbGYtPlNVUEVSOjpGbXRTdHJpbmdEZWYoICRmb3JtYXRfaW5kZXgsICRib29rLCBcJUZvcm1hdFRhYmxlICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ252TmVuZ28gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4pCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgQ29udmVydCBBLkQuIGludG8gSmFwYW5lc2UgTmVuZ28gKGFrYSBHZW5nbykKKworbXkgQE5lbmdvID0gKAorCXsKKwkJbmFtZSAgICAgID0+ICflubPmiJAnLCAjIEhlaXNlaQorCQlhYmJyX25hbWUgPT4gJ0gnLAorCisJCWJhc2UgICAgICA9PiAxOTg4LAorCQlzdGFydCAgICAgPT4gMTk4OTAxMDgsCisJfSwKKwl7CisJCW5hbWUgICAgICA9PiAn5pit5ZKMJywgIyBTaG93YQorCQlhYmJyX25hbWUgPT4gJ1MnLAorCisJCWJhc2UgICAgICA9PiAxOTI1LAorCQlzdGFydCAgICAgPT4gMTkyNjEyMjUsCisJfSwKKwl7CisJCW5hbWUgICAgICA9PiAn5aSn5q2jJywgIyBUYWlzaG8KKwkJYWJicl9uYW1lID0+ICdUJywKKworCQliYXNlICAgICAgPT4gMTkxMSwKKwkJc3RhcnQgICAgID0+IDE5MTIwNzMwLAorCX0sCisJeworCQluYW1lICAgICAgPT4gJ+aYjuayuycsICMgTWVpamkKKwkJYWJicl9uYW1lID0+ICdNJywKKworCQliYXNlICAgICAgPT4gMTg2NywKKwkJc3RhcnQgICAgID0+IDE4NjgwOTA4LAorCX0sCispOworCisjIFVzYWdlOiBDbnZOZW5nbyhuYW1lID0+IEB0bSkgb3IgQ252TmVuZyhhYmJyX25hbWUgPT4gQHRtKQorc3ViIENudk5lbmdvIHsKKyAgICBteSAoICRraW5kLCBAdG0gKSA9IEBfOworICAgIG15ICR5ZWFyID0gJHRtWzVdICsgMTkwMDsKKyAgICBteSAkd2sgPSAoJHllYXIgKiAxMDAwMCkgKyAoJHRtWzRdICogMTAwKSArICgkdG1bM10gKiAxKTsKKyAgICAjbXkgJHdrID0gc3ByaW50ZiggJyUwNGQlMDJkJTAyZCcsICR5ZWFyLCAkdG1bNF0sICR0bVszXSApOworICAgIGZvcmVhY2ggbXkgJG5lbmdvKEBOZW5nbyl7CisgICAgICAgIGlmKCAkd2sgPj0gJG5lbmdvLT57c3RhcnR9ICl7CisgICAgICAgICAgICByZXR1cm4gJG5lbmdvLT57JGtpbmR9IC4gKCR5ZWFyIC0gJG5lbmdvLT57YmFzZX0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAkeWVhcjsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRKYXBhbjIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdEphcGFuMi5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMThjYjAxCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRKYXBhbjIucG0KQEAgLTAsMCArMSwxMDMgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuMjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yIC0gQSBjbGFzcyBmb3IgQ2VsbCBmb3JtYXRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisjCisjIENvcHlyaWdodCAoYykgMjAwOSAgICAgIEpvaG4gTWNOYW1hcmEKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKyMgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKyMKKyMgcGVybHRpZHkgd2l0aCBzdGFuZGFyZCBzZXR0aW5ncy4KKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBKY29kZTsKK3VzZSBVbmljb2RlOjpNYXA7Cit1c2UgYmFzZSAnU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuJzsKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIG5ldyB7CisgICAgbXkgKCAkc1BrZywgJWhLZXkgKSA9IEBfOworICAgIG15ICRvTWFwID0gVW5pY29kZTo6TWFwLT5uZXcoJ0NQOTMyRXhjZWwnKTsKKyAgICBkaWUgIk5PIE1BUCBGSUxFIENQOTMyRXhjZWwhISIKKyAgICAgIHVubGVzcyAoIC1yIFVuaWNvZGU6Ok1hcC0+bWFwcGluZygiQ1A5MzJFeGNlbCIpICk7CisKKyAgICBteSAkb1RoaXMgPSB7CisgICAgICAgIENvZGUgICAgPT4gJGhLZXl7Q29kZX0sCisgICAgICAgIF9VbmlNYXAgPT4gJG9NYXAsCisgICAgfTsKKyAgICBibGVzcyAkb1RoaXM7CisgICAgJG9UaGlzLT5TVVBFUjo6bmV3KCVoS2V5KTsKKyAgICByZXR1cm4gJG9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW4yKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFRleHRGbXQgeworICAgIG15ICggJG9UaGlzLCAkc1R4dCwgJHNDb2RlICkgPSBAXzsKKworICAgICMgICAgJHNDb2RlID0gJ3NqaXMnIGlmKCghIGRlZmluZWQoJHNDb2RlKSkgfHwgKCRzQ29kZSBlcSAnX25hdGl2ZV8nKSk7CisgICAgaWYgKCAkb1RoaXMtPntDb2RlfSApIHsKKyAgICAgICAgaWYgKCAhZGVmaW5lZCgkc0NvZGUpICkgeworICAgICAgICAgICAgJHNUeHQgPX4gcy8oLikvXHgwMCQxL3NnOworICAgICAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRzQ29kZSBlcSAndWNzMicgKSB7CisgICAgICAgICAgICAkc1R4dCA9ICRvVGhpcy0+e19VbmlNYXB9LT5mcm9tX3VuaWNvZGUoJHNUeHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBKY29kZTo6Y29udmVydCggJHNUeHQsICRvVGhpcy0+e0NvZGV9LCAnc2ppcycgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAkc1R4dDsKKyAgICB9Cit9CisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuMiAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRVbmljb2RlLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9GbXRVbmljb2RlLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMzY4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZtdFVuaWNvZGUucG0KQEAgLTAsMCArMSwxMDQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdFVuaWNvZGU7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdFVuaWNvZGUgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFVuaWNvZGU6Ok1hcDsKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10RGVmYXVsdCc7CisKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBuZXcgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10VW5pY29kZSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICVoS2V5ICkgPSBAXzsKKyAgICBteSAkc01hcCA9ICRoS2V5e1VuaWNvZGVfTWFwfTsKKyAgICBteSAkb01hcDsKKyAgICAkb01hcCA9IFVuaWNvZGU6Ok1hcC0+bmV3KCRzTWFwKSBpZiAkc01hcDsKKyAgICBteSAkb1RoaXMgPSB7CisgICAgICAgIFVuaWNvZGVfTWFwID0+ICRzTWFwLAorICAgICAgICBfVW5pTWFwICAgICA9PiAkb01hcCwKKyAgICB9OworICAgIGJsZXNzICRvVGhpczsKKyAgICByZXR1cm4gJG9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRleHRGbXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10VW5pY29kZSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBUZXh0Rm10IHsKKyAgICBteSAoICRvVGhpcywgJHNUeHQsICRzQ29kZSApID0gQF87CisgICAgaWYgKCAkb1RoaXMtPntfVW5pTWFwfSApIHsKKyAgICAgICAgaWYgKCAhZGVmaW5lZCgkc0NvZGUpICkgeworICAgICAgICAgICAgbXkgJHNTdiA9ICRzVHh0OworICAgICAgICAgICAgJHNUeHQgPX4gcy8oLikvXHgwMCQxL3NnOworICAgICAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KTsKKyAgICAgICAgICAgICRzVHh0ID0gJHNTdiB1bmxlc3MgKCRzVHh0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRzQ29kZSBlcSAndWNzMicgKSB7CisgICAgICAgICAgICAkc1R4dCA9ICRvVGhpcy0+e19VbmlNYXB9LT5mcm9tX3VuaWNvZGUoJHNUeHQpOworICAgICAgICB9CisKKyAgICAgICAgIyAgICAgICAgJHNUeHQgPSAkb1RoaXMtPntfVW5pTWFwfS0+ZnJvbV91bmljb2RlKCRzVHh0KQorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgaWYoZGVmaW5lZCgkc0NvZGUpICYmICRzQ29kZSBlcSAndWNzMicpOworICAgICAgICByZXR1cm4gJHNUeHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gJHNUeHQ7CisgICAgfQorfQorMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRVbmljb2RlIC0gQSBjbGFzcyBmb3IgQ2VsbCBmb3JtYXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZvbnQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0ZvbnQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzYjFmZAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvRm9udC5wbQpAQCAtMCwwICsxLDY5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250IC0gQSBjbGFzcyBmb3IgQ2VsbCBmb250cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK3N1YiBuZXcgeworICAgIG15ICggJGNsYXNzLCAlcmhJbmkgKSA9IEBfOworICAgIG15ICRzZWxmID0gXCVyaEluaTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9udCAtIEEgY2xhc3MgZm9yIENlbGwgZm9udHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Gb3JtYXQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL0Zvcm1hdC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI3NjJmCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Gb3JtYXQucG0KQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb3JtYXQgLSBBIGNsYXNzIGZvciBDZWxsIGZvcm1hdHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCitzdWIgbmV3IHsKKyAgICBteSAoICRjbGFzcywgJXJoSW5pICkgPSBAXzsKKyAgICBteSAkc2VsZiA9IFwlcmhJbmk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworfQorCisxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvcm1hdCAtIEEgY2xhc3MgZm9yIENlbGwgZm9ybWF0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMmNmOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIucG0KQEAgLTAsMCArMSwzMTAgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIgLSBSZXdyaXRlIGFuIGV4aXN0aW5nIEV4Y2VsIGZpbGUuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOwordXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3JrYm9vazsKK3VzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOwordXNlIGJhc2UgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsJzsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCitzdWIgbmV3IHsKKworICAgIG15ICggJHBhY2thZ2UsICVwYXJhbXMgKSA9IEBfOworICAgICRwYWNrYWdlLT5TVVBFUjo6bmV3KCVwYXJhbXMpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENyZWF0ZSgpCisjCitzdWIgQ3JlYXRlIHsKKworICAgIG15ICggJHNlbGYsICRmb3JtYXR0ZXIgKSA9IEBfOworCisgICAgIzAuIE5ldyAkd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2stPm5ldygpOworICAgICR3b3JrYm9vay0+e1NoZWV0Q291bnR9ID0gMDsKKworICAgICMgVXNlciBzcGVjaWZpZWQgZm9ybWF0ZXIgY2xhc3MuCisgICAgaWYgKCRmb3JtYXR0ZXIpIHsKKyAgICAgICAgJHdvcmtib29rLT57Rm10Q2xhc3N9ID0gJGZvcm1hdHRlcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR3b3JrYm9vay0+e0ZtdENsYXNzfSA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXREZWZhdWx0LT5uZXcoKTsKKyAgICB9CisKKyAgICByZXR1cm4gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rLT5uZXcoJHdvcmtib29rKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBQYXJzZSgpCisjCitzdWIgUGFyc2UgeworCisgICAgbXkgKCAkc2VsZiwgJHNGaWxlLCAkZm9ybWF0dGVyICkgPSBAXzsKKworICAgIG15ICR3b3JrYm9vayA9ICRzZWxmLT5TVVBFUjo6UGFyc2UoICRzRmlsZSwgJGZvcm1hdHRlciApOworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICR3b3JrYm9vazsKKyAgICByZXR1cm4gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rLT5uZXcoJHdvcmtib29rKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTYXZlQXMoKQorIworc3ViIFNhdmVBcyB7CisKKyAgICBteSAoICRzZWxmLCAkd29ya2Jvb2ssICRmaWxlbmFtZSApID0gQF87CisKKyAgICAkd29ya2Jvb2stPlNhdmVBcygkZmlsZW5hbWUpOworfQorCisxOworCitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyIC0gUmV3cml0ZSBhbiBleGlzdGluZyBFeGNlbCBmaWxlLgorCis9aGVhZDEgU1lOT1BTSVMKKworCisKK1NheSB3ZSBzdGFydCB3aXRoIGFuIEV4Y2VsIGZpbGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAgIHwgICAgICBBICAgICAgfCAgICAgIEIgICAgICB8ICAgICAgQyAgICAgIHwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAxIHwgSGVsbG8gICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAyIHwgV29ybGQgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAzIHwgKkJvbGQgdGV4dCogfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA0IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA1IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorCisKK1RoZW4gd2UgcHJvY2VzcyBpdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbToKKworICAgICMhL3Vzci9iaW4vcGVybAorCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2Ugd2FybmluZ3M7CisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOworCisKKyAgICAjIE9wZW4gYW4gZXhpc3RpbmcgZmlsZSB3aXRoIFNhdmVQYXJzZXIKKyAgICBteSAkcGFyc2VyICAgPSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlci0+bmV3KCk7CisgICAgbXkgJHRlbXBsYXRlID0gJHBhcnNlci0+UGFyc2UoJ3RlbXBsYXRlLnhscycpOworCisKKyAgICAjIEdldCB0aGUgZmlyc3Qgd29ya3NoZWV0LgorICAgIG15ICR3b3Jrc2hlZXQgPSAkdGVtcGxhdGUtPndvcmtzaGVldCgwKTsKKyAgICBteSAkcm93ICA9IDA7CisgICAgbXkgJGNvbCAgPSAwOworCisKKyAgICAjIE92ZXJ3cml0ZSB0aGUgc3RyaW5nIGluIGNlbGwgQTEKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCAkcm93LCAkY29sLCAnTmV3IHN0cmluZycgKTsKKworCisgICAgIyBBZGQgYSBuZXcgc3RyaW5nIGluIGNlbGwgQjEKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCAkcm93LCAkY29sICsgMSwgJ05ld2VyJyApOworCisKKyAgICAjIEFkZCBhIG5ldyBzdHJpbmcgaW4gY2VsbCBDMSB3aXRoIHRoZSBmb3JtYXQgZnJvbSBjZWxsIEEzLgorICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoICRyb3cgKyAyLCAkY29sICk7CisgICAgbXkgJGZvcm1hdF9udW1iZXIgPSAkY2VsbC0+e0Zvcm1hdE5vfTsKKworICAgICR3b3Jrc2hlZXQtPkFkZENlbGwoICRyb3csICRjb2wgKyAyLCAnTmV3ZXN0JywgJGZvcm1hdF9udW1iZXIgKTsKKworCisgICAgIyBXcml0ZSBvdmVyIHRoZSBleGlzdGluZyBmaWxlIG9yIHdyaXRlIGEgbmV3IGZpbGUuCisgICAgJHRlbXBsYXRlLT5TYXZlQXMoJ25ld2ZpbGUueGxzJyk7CisKKworV2Ugc2hvdWxkIG5vdyBoYXZlIGFuIEV4Y2VsIGZpbGUgdGhhdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAgIHwgICAgICBBICAgICAgfCAgICAgIEIgICAgICB8ICAgICAgQyAgICAgIHwKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgfCAxIHwgTmV3IHN0cmluZyAgfCBOZXdlciAgICAgICB8ICpOZXdlc3QqICAgIHwgIC4uLgorICAgfCAyIHwgV29ybGQgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCAzIHwgKkJvbGQgdGV4dCogfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA0IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorICAgfCA1IHwgLi4uICAgICAgICAgfCAuLi4gICAgICAgICB8IC4uLiAgICAgICAgIHwgIC4uLgorCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyPiBtb2R1bGUgcmV3cml0ZSBhbiBleGlzdGluZyBFeGNlbCBmaWxlIGJ5IHJlYWRpbmcgaXQgd2l0aCBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPiBhbmQgcmV3cml0aW5nIGl0IHdpdGggQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uCisKKz1oZWFkMSBNRVRIT0RTCisKKz1oZWFkMSBQYXJzZXIKKworPWhlYWQyIG5ldygpCisKKyAgICAkcGFyc2UgPSBuZXcgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXIoKTsKKworQ29uc3RydWN0b3IuCisKKz1oZWFkMiBQYXJzZSgpCisKKyAgICAkd29ya2Jvb2sgPSAkcGFyc2UtPlBhcnNlKCRzRmlsZU5hbWUpOworCisgICAgJHdvcmtib29rID0gJHBhcnNlLT5QYXJzZSgkc0ZpbGVOYW1lICwgJGZvcm1hdHRlcik7CisKK1JldHVybnMgYSBMPC9Xb3JrYm9vaz4gb2JqZWN0LiBJZiBhbiBlcnJvciBvY2N1cnMsIHJldHVybnMgdW5kZWYuCisKK1RoZSBvcHRpb25hbCBDPCRmb3JtYXR0ZXI+IGlzIGEgRm9ybWF0dGVyIENsYXNzIHRvIGZvcm1hdCB0aGUgdmFsdWUgb2YgY2VsbHMuCisKKworPWhlYWQxIFdvcmtib29rCisKK1RoZSBDPFBhcnNlKCk+IG1ldGhvZCByZXR1cm5zIGEgQzxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2s+IG9iamVjdC4KKworVGhpcyBpcyBhIHN1YmNsYXNzIG9mIHRoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vaz4gYW5kIGhhcyB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKz1oZWFkMiB3b3Jrc2hlZXRzKCkKKworUmV0dXJucyBhbiBhcnJheSBvZiBMPC9Xb3Jrc2hlZXQ+IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworPWhlYWQyIHdvcmtzaGVldCgpCisKK1RoZSBDPHdvcmtzaGVldCgpPiBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBDPFdvcmtzaGVldD4gb2JqZWN0IHVzaW5nIGVpdGhlciBpdHMgbmFtZSBvciBpbmRleDoKKworICAgICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPndvcmtzaGVldCgnU2hlZXQxJyk7CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KDApOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBzaGVldCBuYW1lIG9yIGluZGV4IGRvZXNuJ3QgZXhpc3QuCisKKworPWhlYWQyIEFkZFdvcmtzaGVldCgpCisKKyAgICAkd29ya2Jvb2sgPSAkd29ya2Jvb2stPkFkZFdvcmtzaGVldCgkbmFtZSwgJXByb3BlcnRpZXMpOworCitDcmVhdGUgYSBuZXcgV29ya3NoZWV0IG9iamVjdCBvZiB0eXBlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4uCisKK1RoZSBDPCVwcm9wZXJ0aWVzPiBoYXNoIGNvbnRhaW5zIHRoZSBwcm9wZXJ0aWVzIG9mIG5ldyBXb3Jrc2hlZXQuCisKKworPWhlYWQyIEFkZEZvbnQKKworICAgICR3b3JrYm9vayA9ICR3b3JrYm9vay0+QWRkRm9udCglcHJvcGVydGllcyk7CisKK0NyZWF0ZSBuZXcgRm9udCBvYmplY3Qgb2YgdHlwZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGb250Pi4KKworVGhlIEM8JXByb3BlcnRpZXM+IGhhc2ggY29udGFpbnMgdGhlIHByb3BlcnRpZXMgb2YgbmV3IEZvbnQuCisKKworPWhlYWQyIEFkZEZvcm1hdAorCisgICAgJHdvcmtib29rID0gJHdvcmtib29rLT5BZGRGb3JtYXQoJXByb3BlcnRpZXMpOworCitUaGUgQzwlcHJvcGVydGllcz4gaGFzaCBjb250YWlucyB0aGUgcHJvcGVydGllcyBvZiBuZXcgRm9udC4KKworCis9aGVhZDEgV29ya3NoZWV0CisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQKKworV29ya3NoZWV0IGlzIGEgc3ViY2xhc3Mgb2YgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldC4KK0FuZCBoYXMgdGhlc2UgbWV0aG9kcyA6CisKKworVGhlIEM8V29ya3Nib29rOjp3b3Jrc2hlZXQoKT4gbWV0aG9kIHJldHVybnMgYSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQ+IG9iamVjdC4KKworVGhpcyBpcyBhIHN1YmNsYXNzIG9mIHRoZSBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ+IGFuZCBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorCisKKz1oZWFkMSBBZGRDZWxsCisKKyAgICAkd29ya2Jvb2sgPSAkd29ya3NoZWV0LT5BZGRDZWxsKCRyb3csICRjb2wsICR2YWx1ZSwgJGZvcm1hdCBbJGVuY29kaW5nXSk7CisKK0NyZWF0ZSBuZXcgQ2VsbCBvYmplY3Qgb2YgdHlwZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsPi4KKworVGhlIEM8JGZvcm1hdD4gcGFyYW1ldGVyIGlzIHRoZSBmb3JtYXQgbnVtYmVyIHJhdGhlciB0aGFuIGEgZnVsbCBmb3JtYXQgb2JqZWN0LgorCitUbyBzcGVjaWZ5IGp1c3Qgc2FtZSBhcyBhbm90aGVyIGNlbGwsCit5b3UgY2FuIHNldCBpdCBsaWtlIGJlbG93OgorCisgICAgJHJvdyAgICAgICAgICAgID0gMDsKKyAgICAkY29sICAgICAgICAgICAgPSAwOworICAgICR3b3Jrc2hlZXQgICAgICA9ICR0ZW1wbGF0ZS0+d29ya3NoZWV0KDApOworICAgICRjZWxsICAgICAgICAgICA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCAkcm93LCAkY29sICk7CisgICAgJGZvcm1hdF9udW1iZXIgID0gJGNlbGwtPntGb3JtYXROb307CisKKyAgICAkd29ya3NoZWV0LT5BZGRDZWxsKCRyb3cgKzEsICRjb2xsLCAnTmV3IGRhdGEnLCAkZm9ybWF0X251bWJlcik7CisKKworCisKKz1oZWFkMSBUT0RPCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBtb2R1bGUgaXMgY3VycmVudGx5ICh2ZXJzaW9ucyAwLjUwLTAuNjApIHVuZGVyZ29pbmcgYSBtYWpvcgorcmVzdHJ1Y3R1cmluZyBhbmQgcmV3cml0aW5nLgorCis9aGVhZDEgS25vd24gUHJvYmxlbXMKKworCitZb3UgY2FuIG9ubHkgcmV3cml0ZSB0aGUgZmVhdHVyZXMgdGhhdCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBzdXBwb3J0cyBzbworbWFjcm9zLCBncmFwaHMgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMgaW4gdGhlIG9yaWdpbmFsIEV4Y2VsIGZpbGUgd2lsbCBiZSBsb3N0LgorQWxzbywgZm9ybXVsYXMgYXJlbid0IHJld3JpdHRlbiwgb25seSB0aGUgcmVzdWx0IG9mIGEgZm9ybXVsYSBpcyB3cml0dGVuLgorCitPbmx5IGxhc3QgcHJpbnQgYXJlYSB3aWxsIHJlbWFpbi4gKE90aGVycyB3aWxsIGJlIHJlbW92ZWQpCisKKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDAyIEthd2FpIFRha2Fub3JpIGFuZCBOaXBwb24tUkFEIENvLiBPUCBEaXZpc2lvbgorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIvV29ya2Jvb2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1NhdmVQYXJzZXIvV29ya2Jvb2sucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxMTU2MwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3JrYm9vay5wbQpAQCAtMCwwICsxLDQzNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2s7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rIC0gQSBjbGFzcyBmb3IgU2F2ZVBhcnNlciBXb3JrYm9va3MuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIGJhc2UgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vayc7CitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N1YiBuZXcgeworICAgIG15ICggJHNQa2csICRvQm9vayApID0gQF87CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyAoIGRlZmluZWQgJG9Cb29rICk7CisgICAgbXkgJW9UaGlzID0gJSRvQm9vazsKKyAgICBibGVzcyBcJW9UaGlzLCAkc1BrZzsKKworICAgICMgcmUtYmxlc3Mgd29ya3NoZWV0cyAoYW5kIHNldCB0aGVpciBfQm9vayBwcm9wZXJ0aWVzICEhISkKKyAgICBteSAkc1drUCA9IHJlZigkc1BrZykgfHwgIiRzUGtnIjsKKyAgICAkc1drUCA9fiBzL1dvcmtib29rJC9Xb3Jrc2hlZXQvOworICAgIG1hcCB7IGJsZXNzKCAkXywgJHNXa1AgKTsgfSBAeyAkb1RoaXN7V29ya3NoZWV0fSB9OworICAgIG1hcCB7ICRfLT57X0Jvb2t9ID0gXCVvVGhpczsgfSBAeyAkb1RoaXN7V29ya3NoZWV0fSB9OworICAgIHJldHVybiBcJW9UaGlzOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFBhcnNlIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFBhcnNlIHsKKyAgICBteSAoICRzQ2xhc3MsICRzRmlsZSwgJG9Xa0ZtdCApID0gQF87CisgICAgbXkgJG9Cb29rID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Oldvcmtib29rLT5QYXJzZSggJHNGaWxlLCAkb1drRm10ICk7CisgICAgYmxlc3MgJG9Cb29rLCAkc0NsYXNzOworCisgICAgIyByZS1ibGVzcyB3b3Jrc2hlZXRzIChhbmQgc2V0IHRoZWlyIF9Cb29rIHByb3BlcnRpZXMgISEhKQorICAgIG15ICRzV2tQID0gcmVmKCRzQ2xhc3MpIHx8ICIkc0NsYXNzIjsKKyAgICAkc1drUCA9fiBzL1dvcmtib29rJC9Xb3Jrc2hlZXQvOworICAgIG1hcCB7IGJsZXNzKCAkXywgJHNXa1AgKTsgfSBAeyAkb0Jvb2stPntXb3Jrc2hlZXR9IH07CisgICAgbWFwIHsgJF8tPntfQm9va30gPSAkb0Jvb2s7IH0gQHsgJG9Cb29rLT57V29ya3NoZWV0fSB9OworICAgIHJldHVybiAkb0Jvb2s7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgU2F2ZUFzIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFNhdmVBcyB7CisgICAgbXkgKCAkb0Jvb2ssICRzTmFtZSApID0gQF87CisKKyAgICAjIENyZWF0ZSBhIG5ldyBFeGNlbCB3b3JrYm9vaworICAgIG15ICRvV3JFeCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJHNOYW1lKTsKKyAgICAkb1dyRXgtPmNvbXBhdGliaWxpdHlfbW9kZSgpOworICAgIG15ICVoRm10OworCisgICAgbXkgJGlObyAgPSAwOworICAgIG15IEBhQWxIID0gKAorICAgICAgICAnbGVmdCcsICdsZWZ0JywgICAgJ2NlbnRlcicsICdyaWdodCcsCisgICAgICAgICdmaWxsJywgJ2p1c3RpZnknLCAnbWVyZ2UnLCAgJ2VxdWFsX3NwYWNlJworICAgICk7CisgICAgbXkgQGFBbFYgPSAoICd0b3AnLCAndmNlbnRlcicsICdib3R0b20nLCAndmp1c3RpZnknLCAndmVxdWFsX3NwYWNlJyApOworCisgICAgZm9yZWFjaCBteSAkcEZtdCAoIEB7ICRvQm9vay0+e0Zvcm1hdH0gfSApIHsKKyAgICAgICAgbXkgJG9GbXQgPSAkb1dyRXgtPmFkZGZvcm1hdCgpOyAgICAjIEFkZCBGb3JtYXRzCisgICAgICAgIHVubGVzcyAoICRwRm10LT57U3R5bGV9ICkgeworICAgICAgICAgICAgJGhGbXR7JGlOb30gPSAkb0ZtdDsKKyAgICAgICAgICAgIG15ICRyRm9udCA9ICRwRm10LT57Rm9udH07CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udCggJHJGb250LT57TmFtZX0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfc2l6ZSggJHJGb250LT57SGVpZ2h0fSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9jb2xvciggJHJGb250LT57Q29sb3J9ICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X2JvbGQoICRyRm9udC0+e0JvbGR9ICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X2l0YWxpYyggJHJGb250LT57SXRhbGljfSApOworICAgICAgICAgICAgJG9GbXQtPnNldF91bmRlcmxpbmUoICRyRm9udC0+e1VuZGVybGluZX0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udF9zdHJpa2VvdXQoICRyRm9udC0+e1N0cmlrZW91dH0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZm9udF9zY3JpcHQoICRyRm9udC0+e1N1cGVyfSApOworCisgICAgICAgICAgICAkb0ZtdC0+c2V0X2hpZGRlbiggJHJGb250LT57SGlkZGVufSApOyAgICAjQWRkCisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbG9ja2VkKCAkcEZtdC0+e0xvY2t9ICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfYWxpZ24oICRhQWxIWyAkcEZtdC0+e0FsaWduSH0gXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9hbGlnbiggJGFBbFZbICRwRm10LT57QWxpZ25WfSBdICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfcm90YXRpb24oICRwRm10LT57Um90YXRlfSApOworCisgICAgICAgICAgICAkb0ZtdC0+c2V0X251bV9mb3JtYXQoCisgICAgICAgICAgICAgICAgJG9Cb29rLT57Rm10Q2xhc3N9LT5GbXRTdHJpbmdEZWYoICRwRm10LT57Rm10SWR4fSwgJG9Cb29rICkgKTsKKworICAgICAgICAgICAgJG9GbXQtPnNldF90ZXh0X3dyYXAoICRwRm10LT57V3JhcH0gKTsKKworICAgICAgICAgICAgJG9GbXQtPnNldF9wYXR0ZXJuKCAkcEZtdC0+e0ZpbGx9LT5bMF0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfZmdfY29sb3IoICRwRm10LT57RmlsbH0tPlsxXSApCisgICAgICAgICAgICAgIGlmICggKCAkcEZtdC0+e0ZpbGx9LT5bMV0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0ZpbGx9LT5bMV0gPD0gNjMgKSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9iZ19jb2xvciggJHBGbXQtPntGaWxsfS0+WzJdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57RmlsbH0tPlsyXSA+PSA4ICkKKyAgICAgICAgICAgICAgICAmJiAoICRwRm10LT57RmlsbH0tPlsyXSA8PSA2MyApICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbGVmdCgKKyAgICAgICAgICAgICAgICAoICRwRm10LT57QmRyU3R5bGV9LT5bMF0gPiA3ICkgPyAzIDogJHBGbXQtPntCZHJTdHlsZX0tPlswXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF9yaWdodCgKKyAgICAgICAgICAgICAgICAoICRwRm10LT57QmRyU3R5bGV9LT5bMV0gPiA3ICkgPyAzIDogJHBGbXQtPntCZHJTdHlsZX0tPlsxXSApOworICAgICAgICAgICAgJG9GbXQtPnNldF90b3AoCisgICAgICAgICAgICAgICAgKCAkcEZtdC0+e0JkclN0eWxlfS0+WzJdID4gNyApID8gMyA6ICRwRm10LT57QmRyU3R5bGV9LT5bMl0gKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfYm90dG9tKAorICAgICAgICAgICAgICAgICggJHBGbXQtPntCZHJTdHlsZX0tPlszXSA+IDcgKSA/IDMgOiAkcEZtdC0+e0JkclN0eWxlfS0+WzNdICk7CisKKyAgICAgICAgICAgICRvRm10LT5zZXRfbGVmdF9jb2xvciggJHBGbXQtPntCZHJDb2xvcn0tPlswXSApCisgICAgICAgICAgICAgIGlmICggKCAkcEZtdC0+e0JkckNvbG9yfS0+WzBdID49IDggKQorICAgICAgICAgICAgICAgICYmICggJHBGbXQtPntCZHJDb2xvcn0tPlswXSA8PSA2MyApICk7CisgICAgICAgICAgICAkb0ZtdC0+c2V0X3JpZ2h0X2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzFdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bMV0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzFdIDw9IDYzICkgKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfdG9wX2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzJdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bMl0gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzJdIDw9IDYzICkgKTsKKyAgICAgICAgICAgICRvRm10LT5zZXRfYm90dG9tX2NvbG9yKCAkcEZtdC0+e0JkckNvbG9yfS0+WzNdICkKKyAgICAgICAgICAgICAgaWYgKCAoICRwRm10LT57QmRyQ29sb3J9LT5bM10gPj0gOCApCisgICAgICAgICAgICAgICAgJiYgKCAkcEZtdC0+e0JkckNvbG9yfS0+WzNdIDw9IDYzICkgKTsKKyAgICAgICAgfQorICAgICAgICAkaU5vKys7CisgICAgfQorICAgIGZvciAoIG15ICRpU2hlZXQgPSAwIDsgJGlTaGVldCA8ICRvQm9vay0+e1NoZWV0Q291bnR9IDsgJGlTaGVldCsrICkgeworICAgICAgICBteSAkb1drUyA9ICRvQm9vay0+e1dvcmtzaGVldH1bJGlTaGVldF07CisgICAgICAgIG15ICRvV3JTID0gJG9XckV4LT5hZGR3b3Jrc2hlZXQoICRvV2tTLT57TmFtZX0gKTsKKworICAgICAgICAjTGFuZHNjYXBlCisgICAgICAgIGlmICggISRvV2tTLT57TGFuZHNjYXBlfSApIHsgICAgIyBMYW5kc2NhcGUgKDA6SG9yaXpvbnRhbCwgMTpWZXJ0aWNhbCkKKyAgICAgICAgICAgICRvV3JTLT5zZXRfbGFuZHNjYXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb1dyUy0+c2V0X3BvcnRyYWl0KCk7CisgICAgICAgIH0KKworICAgICAgICAjUHJvdGVjdAorICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntQcm90ZWN0fSApCisgICAgICAgIHsgICAgIyBQcm90ZWN0ICgnJzpOb1Bhc3N3b3JkLCBQYXNzd29yZDpQYXNzd29yZCkKKyAgICAgICAgICAgIGlmICggJG9Xa1MtPntQcm90ZWN0fSBuZSAnJyApIHsKKyAgICAgICAgICAgICAgICAkb1dyUy0+cHJvdGVjdCggJG9Xa1MtPntQcm90ZWN0fSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJG9XclMtPnByb3RlY3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoICggJG9Xa1MtPntGaXRXaWR0aH0gPT0gMSApIGFuZCAoICRvV2tTLT57Rml0SGVpZ2h0fSA9PSAxICkgKSB7CisKKyAgICAgICAgICAgICMgUGFnZXMgb24gZml0IHdpdGggd2lkdGggYW5kIEhlaWd0CisgICAgICAgICAgICAkb1dyUy0+Zml0X3RvX3BhZ2VzKCAkb1drUy0+e0ZpdFdpZHRofSwgJG9Xa1MtPntGaXRIZWlnaHR9ICk7CisKKyAgICAgICAgICAgICNQcmludCBTY2FsZQorICAgICAgICAgICAgJG9XclMtPnNldF9wcmludF9zY2FsZSggJG9Xa1MtPntTY2FsZX0gKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgI1ByaW50IFNjYWxlCisgICAgICAgICAgICAkb1dyUy0+c2V0X3ByaW50X3NjYWxlKCAkb1drUy0+e1NjYWxlfSApOworCisgICAgICAgICAgICAjIFBhZ2VzIG9uIGZpdCB3aXRoIHdpZHRoIGFuZCBIZWlndAorICAgICAgICAgICAgJG9XclMtPmZpdF90b19wYWdlcyggJG9Xa1MtPntGaXRXaWR0aH0sICRvV2tTLT57Rml0SGVpZ2h0fSApOworICAgICAgICB9CisKKyAgICAgICAgIyBQYXBlciBTaXplCisgICAgICAgICRvV3JTLT5zZXRfcGFwZXIoICRvV2tTLT57UGFwZXJTaXplfSApOworCisgICAgICAgICMgTWFyZ2luCisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX2xlZnQoICRvV2tTLT57TGVmdE1hcmdpbn0gKTsKKyAgICAgICAgJG9XclMtPnNldF9tYXJnaW5fcmlnaHQoICRvV2tTLT57UmlnaHRNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX3RvcCggJG9Xa1MtPntUb3BNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfbWFyZ2luX2JvdHRvbSggJG9Xa1MtPntCb3R0b21NYXJnaW59ICk7CisKKyAgICAgICAgIyBIQ2VudGVyCisgICAgICAgICRvV3JTLT5jZW50ZXJfaG9yaXpvbnRhbGx5KCkgaWYgKCAkb1drUy0+e0hDZW50ZXJ9ICk7CisKKyAgICAgICAgIyBWQ2VudGVyCisgICAgICAgICRvV3JTLT5jZW50ZXJfdmVydGljYWxseSgpIGlmICggJG9Xa1MtPntWQ2VudGVyfSApOworCisgICAgICAgICMgSGVhZGVyLCBGb290ZXIKKyAgICAgICAgJG9XclMtPnNldF9oZWFkZXIoICRvV2tTLT57SGVhZGVyfSwgJG9Xa1MtPntIZWFkZXJNYXJnaW59ICk7CisgICAgICAgICRvV3JTLT5zZXRfZm9vdGVyKCAkb1drUy0+e0Zvb3Rlcn0sICRvV2tTLT57Rm9vdGVyTWFyZ2lufSApOworCisgICAgICAgICMgUHJpbnQgQXJlYQorICAgICAgICBpZiAoIHJlZiggJG9Cb29rLT57UHJpbnRBcmVhfVskaVNoZWV0XSApIGVxICdBUlJBWScgKSB7CisgICAgICAgICAgICBteSAkcmFQOworICAgICAgICAgICAgZm9yICRyYVAgKCBAeyAkb0Jvb2stPntQcmludEFyZWF9WyRpU2hlZXRdIH0gKSB7CisgICAgICAgICAgICAgICAgJG9XclMtPnByaW50X2FyZWEoQCRyYVApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBQcmludCBUaXRsZQorICAgICAgICBteSAkcmFXOworICAgICAgICBmb3JlYWNoICRyYVcgKCBAeyAkb0Jvb2stPntQcmludFRpdGxlfVskaVNoZWV0XS0+e1Jvd30gfSApIHsKKyAgICAgICAgICAgICRvV3JTLT5yZXBlYXRfcm93cyhAJHJhVyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yZWFjaCAkcmFXICggQHsgJG9Cb29rLT57UHJpbnRUaXRsZX1bJGlTaGVldF0tPntDb2x1bW59IH0gKSB7CisgICAgICAgICAgICAkb1dyUy0+cmVwZWF0X2NvbHVtbnMoQCRyYVcpOworICAgICAgICB9CisKKyAgICAgICAgIyBQcmludCBHcmlkbGluZXMKKyAgICAgICAgaWYgKCAkb1drUy0+e1ByaW50R3JpZH0gPT0gMSApIHsKKyAgICAgICAgICAgICRvV3JTLT5oaWRlX2dyaWRsaW5lcygwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRvV3JTLT5oaWRlX2dyaWRsaW5lcygxKTsKKyAgICAgICAgfQorCisgICAgICAgICMgUHJpbnQgSGVhZGluZ3MKKyAgICAgICAgaWYgKCAkb1drUy0+e1ByaW50SGVhZGVyc30gKSB7CisgICAgICAgICAgICAkb1dyUy0+cHJpbnRfcm93X2NvbF9oZWFkZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICAjIEhvcml6b250YWwgUGFnZSBCcmVha3MKKyAgICAgICAgJG9XclMtPnNldF9oX3BhZ2VicmVha3MoIEB7ICRvV2tTLT57SFBhZ2VCcmVha30gfSApOworCisgICAgICAgICMgVmVyaXRpY2FsIFBhZ2UgQnJlYWtzCisgICAgICAgICRvV3JTLT5zZXRfdl9wYWdlYnJlYWtzKCBAeyAkb1drUy0+e1ZQYWdlQnJlYWt9IH0gKTsKKworCisKKyMgICAgICAgIFBhZ2VTdGFydCAgICA9PiAkb1drUy0+e1BhZ2VTdGFydH0sICAgICAgICAgICAgIyBQYWdlIG51bWJlciBmb3Igc3RhcnQKKyMgICAgICAgIFVzZVBhZ2UgICAgICA9PiAkb1drUy0+e1VzZVBhZ2V9LCAgICAgICAgICAgICAgIyBVc2Ugb3duIHN0YXJ0IHBhZ2UgbnVtYmVyCisjICAgICAgICBOb0NvbG9yICAgICAgPT4gJG9Xa1MtPntOb0NvbG9yfSwgICAgICAgICAgICAgICAjIFByaW50IGluIGJsY2FrLXdoaXRlCisjICAgICAgICBEcmFmdCAgICAgICAgPT4gJG9Xa1MtPntEcmFmdH0sICAgICAgICAgICAgICAgICAjIFByaW50IGluIGRyYWZ0IG1vZGUKKyMgICAgICAgIE5vdGVzICAgICAgICA9PiAkb1drUy0+e05vdGVzfSwgICAgICAgICAgICAgICAgICMgUHJpbnQgbm90ZXMKKyMgICAgICAgIExlZnRUb1JpZ2h0ICA9PiAkb1drUy0+e0xlZnRUb1JpZ2h0fSwgICAgICAgICAgICMgTGVmdCB0byBSaWdodAorCisKKyAgICAgICAgZm9yICgKKyAgICAgICAgICAgIG15ICRpQyA9ICRvV2tTLT57TWluQ29sfSA7CisgICAgICAgICAgICBkZWZpbmVkICRvV2tTLT57TWF4Q29sfSAmJiAkaUMgPD0gJG9Xa1MtPntNYXhDb2x9IDsKKyAgICAgICAgICAgICRpQysrCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIGRlZmluZWQgJG9Xa1MtPntDb2xXaWR0aH1bJGlDXSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRvV2tTLT57Q29sV2lkdGh9WyRpQ10gPiAwICkgeworICAgICAgICAgICAgICAgICAgICAkb1dyUy0+c2V0X2NvbHVtbiggJGlDLCAkaUMsICRvV2tTLT57Q29sV2lkdGh9WyRpQ10gKQorICAgICAgICAgICAgICAgICAgICAgIDsgICAgIywgdW5kZWYsIDEpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRvV3JTLT5zZXRfY29sdW1uKCAkaUMsICRpQywgMCwgdW5kZWYsIDEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICgKKyAgICAgICAgICAgIG15ICRpUiA9ICRvV2tTLT57TWluUm93fSA7CisgICAgICAgICAgICBkZWZpbmVkICRvV2tTLT57TWF4Um93fSAmJiAkaVIgPD0gJG9Xa1MtPntNYXhSb3d9IDsKKyAgICAgICAgICAgICRpUisrCisgICAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAkb1dyUy0+c2V0X3JvdyggJGlSLCAkb1drUy0+e1Jvd0hlaWdodH1bJGlSXSApOworICAgICAgICAgICAgZm9yICgKKyAgICAgICAgICAgICAgICBteSAkaUMgPSAkb1drUy0+e01pbkNvbH0gOworICAgICAgICAgICAgICAgIGRlZmluZWQgJG9Xa1MtPntNYXhDb2x9ICYmICRpQyA8PSAkb1drUy0+e01heENvbH0gOworICAgICAgICAgICAgICAgICRpQysrCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIG15ICRvV2tDID0gJG9Xa1MtPntDZWxsc31bJGlSXVskaUNdOworICAgICAgICAgICAgICAgIGlmICgkb1drQykgeworICAgICAgICAgICAgICAgICAgICBpZiAoICRvV2tDLT57TWVyZ2VkfSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15ICRvRm10TiA9ICRvV3JFeC0+YWRkZm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4tPmNvcHkoICRoRm10eyAkb1drQy0+e0Zvcm1hdE5vfSB9ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4tPnNldF9tZXJnZSgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRvV3JTLT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvQm9vay0+e0ZtdENsYXNzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UZXh0Rm10KCAkb1drQy0+e1ZhbH0sICRvV2tDLT57Q29kZX0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0ZtdE4KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkb1dyUy0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb0Jvb2stPntGbXRDbGFzc30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VGV4dEZtdCggJG9Xa0MtPntWYWx9LCAkb1drQy0+e0NvZGV9ICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhGbXR7ICRvV2tDLT57Rm9ybWF0Tm99IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICRvV3JFeDsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRXb3Jrc2hlZXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkV29ya3NoZWV0IHsKKyAgICBteSAoICRvQm9vaywgJHNOYW1lLCAlaEF0dHIgKSA9IEBfOworICAgICRvQm9vay0+QWRkRm9ybWF0IGlmICggJCN7ICRvQm9vay0+e0Zvcm1hdH0gfSA8IDAgKTsKKyAgICAkaEF0dHJ7TmFtZX0gICAgICAgICB8fD0gJHNOYW1lOworICAgICRoQXR0cntMZWZ0TWFyZ2lufSAgIHx8PSAwOworICAgICRoQXR0cntSaWdodE1hcmdpbn0gIHx8PSAwOworICAgICRoQXR0cntUb3BNYXJnaW59ICAgIHx8PSAwOworICAgICRoQXR0cntCb3R0b21NYXJnaW59IHx8PSAwOworICAgICRoQXR0cntIZWFkZXJNYXJnaW59IHx8PSAwOworICAgICRoQXR0cntGb290ZXJNYXJnaW59IHx8PSAwOworICAgICRoQXR0cntGaXRXaWR0aH0gICAgIHx8PSAwOworICAgICRoQXR0cntGaXRIZWlnaHR9ICAgIHx8PSAwOworICAgICRoQXR0cntQcmludEdyaWR9ICAgIHx8PSAwOworICAgIG15ICRvV2tTID0gU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6OldvcmtzaGVldC0+bmV3KCVoQXR0cik7CisgICAgJG9Xa1MtPntfQm9va30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRvQm9vazsKKyAgICAkb1drUy0+e19TaGVldE5vfSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJG9Cb29rLT57U2hlZXRDb3VudH07CisgICAgJG9Cb29rLT57V29ya3NoZWV0fVsgJG9Cb29rLT57U2hlZXRDb3VudH0gXSA9ICRvV2tTOworICAgICRvQm9vay0+e1NoZWV0Q291bnR9Kys7CisgICAgcmV0dXJuICRvV2tTOyAgICAjJG9Cb29rLT57U2hlZXRDb3VudH0gLSAxOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZEZvbnQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkRm9udCB7CisgICAgbXkgKCAkb0Jvb2ssICVoQXR0ciApID0gQF87CisgICAgJGhBdHRye05hbWV9ICAgICAgfHw9ICdBcmlhbCc7CisgICAgJGhBdHRye0hlaWdodH0gICAgfHw9IDEwOworICAgICRoQXR0cntCb2xkfSAgICAgIHx8PSAwOworICAgICRoQXR0cntJdGFsaWN9ICAgIHx8PSAwOworICAgICRoQXR0cntVbmRlcmxpbmV9IHx8PSAwOworICAgICRoQXR0cntTdHJpa2VvdXR9IHx8PSAwOworICAgICRoQXR0cntTdXBlcn0gICAgIHx8PSAwOworICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9udH0gfSwgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZvbnQtPm5ldyglaEF0dHIpOworICAgIHJldHVybiAkI3sgJG9Cb29rLT57Rm9udH0gfTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRGb3JtYXQgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2spCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkRm9ybWF0IHsKKyAgICBteSAoICRvQm9vaywgJWhBdHRyICkgPSBAXzsKKyAgICAkaEF0dHJ7RmlsbH0gICAgIHx8PSBbIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QmRyU3R5bGV9IHx8PSBbIDAsIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QmRyQ29sb3J9IHx8PSBbIDAsIDAsIDAsIDAgXTsKKyAgICAkaEF0dHJ7QWxpZ25IfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7QWxpZ25WfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7Um90YXRlfSAgICB8fD0gMDsKKyAgICAkaEF0dHJ7TGFuZHNjYXBlfSB8fD0gMDsKKyAgICAkaEF0dHJ7Rm10SWR4fSAgICB8fD0gMDsKKworICAgIGlmICggIWRlZmluZWQoICRoQXR0cntGb250fSApICkgeworICAgICAgICBteSAkb0ZvbnQ7CisgICAgICAgIGlmICggZGVmaW5lZCAkaEF0dHJ7Rm9udE5vfSApIHsKKyAgICAgICAgICAgICRvRm9udCA9ICRvQm9vay0+e0ZvbnR9WyAkaEF0dHJ7Rm9udE5vfSBdOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggIWRlZmluZWQgJG9Gb250ICkgeworICAgICAgICAgICAgaWYgKCAkI3sgJG9Cb29rLT57Rm9udH0gfSA+PSAwICkgeworICAgICAgICAgICAgICAgICRvRm9udCA9ICRvQm9vay0+e0ZvbnR9WzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbXkgJGlObyA9ICRvQm9vay0+QWRkRm9udDsKKyAgICAgICAgICAgICAgICAkb0ZvbnQgPSAkb0Jvb2stPntGb250fVskaU5vXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAkaEF0dHJ7Rm9udH0gPSAkb0ZvbnQ7CisgICAgfQorICAgIHB1c2ggQHsgJG9Cb29rLT57Rm9ybWF0fSB9LCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm9ybWF0LT5uZXcoJWhBdHRyKTsKKyAgICByZXR1cm4gJCN7ICRvQm9vay0+e0Zvcm1hdH0gfTsKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBBZGRDZWxsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI6Oldvcmtib29rKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEFkZENlbGwgeworICAgIG15ICggJG9Cb29rLCAkaVNoZWV0LCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICkgPSBAXzsKKyAgICBteSAlcmhLZXk7CisgICAgJG9DZWxsIHx8PSAwOworICAgIG15ICRpRm10ID0KKyAgICAgICggVU5JVkVSU0FMOjppc2EoICRvQ2VsbCwgJ1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpDZWxsJyApICkKKyAgICAgID8gJG9DZWxsLT57Rm9ybWF0Tm99CisgICAgICA6ICggcmVmKCRvQ2VsbCkgKSA/IDAKKyAgICAgIDogICAgICAgICAgICAgICAgICAgJG9DZWxsICsgMDsKKyAgICAkcmhLZXl7Rm9ybWF0Tm99ICAgID0gJGlGbXQ7CisgICAgJHJoS2V5e0Zvcm1hdH0gICAgICA9ICRvQm9vay0+e0Zvcm1hdH1bJGlGbXRdOworICAgICRyaEtleXtWYWx9ICAgICAgICAgPSAkc1ZhbDsKKyAgICAkcmhLZXl7Q29kZX0gICAgICAgID0gJHNDb2RlIHx8ICdfbmF0aXZlXyc7CisgICAgJG9Cb29rLT57X0N1clNoZWV0fSA9ICRpU2hlZXQ7CisgICAgbXkgJG9OZXdDZWxsID0KKyAgICAgIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpfTmV3Q2VsbCggJG9Cb29rLCAkaVIsICRpQywgJXJoS2V5ICk7CisgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6Ol9TZXREaW1lbnNpb24oICRvQm9vaywgJGlSLCAkaUMsICRpQyApOworICAgIHJldHVybiAkb05ld0NlbGw7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya2Jvb2sgLSBBIGNsYXNzIGZvciBTYXZlUGFyc2VyIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworTWFpbnRhaW5lciAwLjQwKzogSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworTWFpbnRhaW5lciAwLjI3LTAuMzM6IEdhYm9yIFN6YWJvIHN6YWJnYWJAY3Bhbi5vcmcKKworT3JpZ2luYWwgYXV0aG9yOiBLYXdhaSBUYWthbm9yaSBrd2l0a25yQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IChjKSAyMDA5LTIwMTAgSm9obiBNY05hbWFyYQorCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworCitDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitZb3UgbWF5IGRpc3RyaWJ1dGUgdW5kZXIgdGhlIHRlcm1zIG9mIGVpdGhlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ugb3IgdGhlIEFydGlzdGljIExpY2Vuc2UsIGFzIHNwZWNpZmllZCBpbiB0aGUgUGVybCBSRUFETUUgZmlsZS4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9TYXZlUGFyc2VyL1dvcmtzaGVldC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3Jrc2hlZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJlOGZhNAotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvU2F2ZVBhcnNlci9Xb3Jrc2hlZXQucG0KQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQgLSBBIGNsYXNzIGZvciBTYXZlUGFyc2VyIFdvcmtzaGVldHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0CisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3VzZSBiYXNlICdTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya3NoZWV0JzsKK291ciAkVkVSU0lPTiA9ICcwLjU5JzsKKworc3ViIG5ldyB7CisgICAgbXkgKCAkc0NsYXNzLCAlcmhJbmkgKSA9IEBfOworICAgICRzQ2xhc3MtPlNVUEVSOjpuZXcoJXJoSW5pKTsgICAgIyByZXR1cm5zIG9iamVjdAorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZENlbGwgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIEFkZENlbGwgeworICAgIG15ICggJG9TZWxmLCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICkgPSBAXzsKKyAgICAkb1NlbGYtPntfQm9va30KKyAgICAgIC0+QWRkQ2VsbCggJG9TZWxmLT57X1NoZWV0Tm99LCAkaVIsICRpQywgJHNWYWwsICRvQ2VsbCwgJHNDb2RlICk7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgUHJvdGVjdCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyOjpXb3Jrc2hlZXQpCisjICAtIFBhc3N3b3JkID0gdW5kZWYgICAtPiAgTm8gcHJvdGVjdAorIyAgLSBQYXNzd29yZCA9ICcnICAgICAgLT4gIFByb3RlY3RlZC4gTm8gcGFzc3dvcmQKKyMgIC0gUGFzc3dvcmQgPSAkcHdkICAgIC0+ICBQcm90ZWN0ZWQuIFBhc3N3b3JkID0gJHB3ZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIFByb3RlY3QgeworICAgIG15ICggJG9TZWxmLCAkc1Bhc3N3b3JkICkgPSBAXzsKKyAgICAkb1NlbGYtPntQcm90ZWN0fSA9ICRzUGFzc3dvcmQ7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjo6V29ya3NoZWV0IC0gQSBjbGFzcyBmb3IgU2F2ZVBhcnNlciBXb3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitNYWludGFpbmVyIDAuNDArOiBKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitNYWludGFpbmVyIDAuMjctMC4zMzogR2Fib3IgU3phYm8gc3phYmdhYkBjcGFuLm9yZworCitPcmlnaW5hbCBhdXRob3I6IEthd2FpIFRha2Fub3JpIGt3aXRrbnJAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCBKb2huIE1jTmFtYXJhCisKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisKK0NvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1lvdSBtYXkgZGlzdHJpYnV0ZSB1bmRlciB0aGUgdGVybXMgb2YgZWl0aGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBvciB0aGUgQXJ0aXN0aWMgTGljZW5zZSwgYXMgc3BlY2lmaWVkIGluIHRoZSBQZXJsIFJFQURNRSBmaWxlLgorCis9Y3V0CmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1V0aWxpdHkucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1V0aWxpdHkucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMDllNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvVXRpbGl0eS5wbQpAQCAtMCwwICsxLDE2MTUgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgLSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgUGFyc2VFeGNlbC4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDkgICAgICBKb2huIE1jTmFtYXJhCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4IEdhYm9yIFN6YWJvCisjIENvcHlyaWdodCAoYykgMjAwMC0yMDA2IEthd2FpIFRha2Fub3JpCisjCisjIHBlcmx0aWR5IHdpdGggc3RhbmRhcmQgc2V0dGluZ3MuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCityZXF1aXJlIEV4cG9ydGVyOwordXNlIHZhcnMgcXcoQElTQSBARVhQT1JUX09LKTsKK0BJU0EgICAgICAgPSBxdyhFeHBvcnRlcik7CitARVhQT1JUX09LID0gcXcoRXhjZWxGbXQgTG9jYWx0aW1lRXhjZWwgRXhjZWxMb2NhbHRpbWUKKyAgY29sMmludCBpbnQyY29sIHNoZWV0UmVmIHhsczJjc3YpOworCitvdXIgJFZFUlNJT04gPSAnMC41OSc7CisKK215ICRxck5VTUJFUiA9IHFyLyheWystXT9cZCsoXC5cZCspPyQpfCheWystXT9cZCtcLj8oXGQqKVtlRV1bKy1dKFxkKykpJC87CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRXhjZWxGbXQoKQorIworIyBUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIEV4Y2VsIHN0eWxlIG51bWJlciBmb3JtYXQgYW5kIGNvbnZlcnRzIGEgbnVtYmVyIGludG8KKyMgdGhhdCBmb3JtYXQuIGZvciBleGFtcGxlOiAnaGg6bW06c3MgQU0vUE0nICsgMC4wMTAyMzE0OCA9ICcxMjoxNDo0NCBBTScuCisjCisjIEl0IGRvZXMgdGhpcyB3aXRoIGEgdHlwZSBvZiB0ZW1wbGF0aW5nIG1lY2hhbmlzbS4gVGhlIGZvcm1hdCBzdHJpbmcgaXMgcGFyc2VkCisjIHRvIGlkZW50aWZ5IHRva2VucyB0aGF0IG5lZWQgdG8gYmUgcmVwbGFjZWQgYW5kIHRoZWlyIHBvc2l0aW9uIHdpdGhpbiB0aGUKKyMgc3RyaW5nIGlzIHJlY29yZGVkLiBUaGVzZSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwbGFjZWhvbGRlcnMuIFRoZSBudW1iZXIgaXMKKyMgdGhlbiBjb252ZXJ0ZWQgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdHMgYW5kIHN1YnN0aXR1dGVkIGludG8gdGhlIHBsYWNlaG9sZGVycy4KKyMKKyMgSW50ZXJlc3RlZCBwYXJ0aWVzIHNob3VsZCByZWZlciB0byB0aGUgRXhjZWwgZG9jdW1lbnRhdGlvbiBvbiBjZWxsIGZvcm1hdHMgZm9yCisjIG1vcmUgaW5mb3JtYXRpb246IGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9leGNlbC9IUDA1MTk5NTAwMTAzMy5hc3B4CisjIFRoZSBNaWNyb3NvZnQgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIEV4Y2VsIEJpbmFyeSBGaWxlIEZvcm1hdCwgW01TLVhMU10ucGRmLAorIyBhbHNvIGNvbnRhaW5zIGEgQUJORiBncmFtbWFyIGZvciBudW1iZXIgZm9ybWF0IHN0cmluZ3MuCisjCisjIE1haW50YWluZXJzIG5vdGVzOgorIyA9PT09PT09PT09PT09PT09PT0KKyMKKyMgTm90ZSBvbiBmb3JtYXQgc3Vic2VjdGlvbnM6CisjIEEgZm9ybWF0IHN0cmluZyBjYW4gY29udGFpbiA0IHBvc3NpYmxlIHN1Yi1zZWN0aW9ucyBzZXBhcmF0ZWQgYnkgc2VtaS1jb2xvbnM6CisjIFBvc2l0aXZlIG51bWJlcnMsIG5lZ2F0aXZlIG51bWJlcnMsIHplcm8gdmFsdWVzLCBhbmQgdGV4dC4KKyMgRm9yIGV4YW1wbGU6IF8oKiAjLCMjMF8pO18oKiAoIywjIzApO18oKiAiLSJfKTtfKEBfKQorIworIyBOb3RlIG9uIGNvbmRpdGlvbmFsIGZvcm1hdHMuCisjIEEgbnVtYmVyIGZvcm1hdCBpbiBFeGNlbCBjYW4gaGF2ZSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gc3VjaCBhczoKKyMgICAgIFs+OTk5OTk5OV0oMDAwKTAwMC0wMDAwOzAwMC0wMDAwCisjIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGluIFBlcmw6CisjICAgICAkZm9ybWF0ID0gJG51bWJlciA+IDk5OTk5OTkgPyAnKDAwMCkwMDAtMDAwMCcgOiAnMDAwLTAwMDAnOworIyBOZXN0ZWQgY29uZGl0aW9uYWxzIGFyZSBhbHNvIHBvc3NpYmxlIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRoZW0uCisjCisjIEVmZmljaWVuY3k6IFRoZSBleGNlc3NpdmUgdXNlIG9mIHN1YnN0cigpIGlzbid0IHZlcnkgZWZmaWNpZW50LiBIb3dldmVyLAorIyBpdCBwcm9iYWJseSBkb2Vzbid0IG1lcml0IHJld3JpdGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggYSBwYXJzZXIgb3IgcmVndWxhcgorIyBleHByZXNzaW9ucyBhbmQgXEcuCisjCisjIFRPRE86IEkgdGhpbmsgdGhlIHNpbmdsZSBxdW90ZSBoYW5kbGluZyBtYXkgbm90IGJlIHJlcXVpcmVkLiBDaGVjay4KKyMKK3N1YiBFeGNlbEZtdCB7CisKKyAgICBteSAoICRmb3JtYXRfc3RyLCAkbnVtYmVyLCAkaXNfMTkwNCwgJG51bWJlcl90eXBlLCAkd2FudF9zdWJmb3JtYXRzICkgPSBAXzsKKworICAgICMgUmV0dXJuIHRleHQgc3RyaW5ncyB3aXRob3V0IGZ1cnRoZXIgZm9ybWF0dGluZy4KKyAgICByZXR1cm4gJG51bWJlciB1bmxlc3MgJG51bWJlciA9fiAkcXJOVU1CRVI7CisKKyAgICAjIEhhbmRsZSBPcGVuT2ZmaWNlLm9yZyBHRU5FUkFMIGZvcm1hdC4KKyAgICAkZm9ybWF0X3N0ciA9ICdAJyBpZiB1YygkZm9ybWF0X3N0cikgZXEgIkdFTkVSQUwiOworCisgICAgIyBDaGVjayBmb3IgYSBjb25kaXRpb25hbCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZvcm1hdC4gU2VlIG5vdGVzIGFib3ZlLgorICAgIG15ICRjb25kaXRpb25hbDsKKyAgICBpZiAoICRmb3JtYXRfc3RyID1+IC9eXFsoWzw+PV1bXlxdXSspXF0oLiopJC8gKSB7CisgICAgICAgICRjb25kaXRpb25hbCA9ICQxOworICAgICAgICAkZm9ybWF0X3N0ciAgPSAkMjsKKyAgICB9CisKKyAgICAjIElnbm9yZSB0aGUgdW5kZXJzY29yZSB0b2tlbiB3aGljaCBpcyB1c2VkIHRvIGluZGljYXRlIGEgcGFkZGluZyBzcGFjZS4KKyAgICAkZm9ybWF0X3N0ciA9fiBzL18vIC9nOworCisgICAgIyBTcGxpdCB0aGUgZm9ybWF0IHN0cmluZyBpbnRvIDQgcG9zc2libGUgc3ViLXNlY3Rpb25zOiBwb3NpdGl2ZSBudW1iZXJzLAorICAgICMgbmVnYXRpdmUgbnVtYmVycywgemVybyB2YWx1ZXMsIGFuZCB0ZXh0LiBTZWUgbm90ZXMgYWJvdmUuCisgICAgbXkgQGZvcm1hdHM7CisgICAgbXkgJHNlY3Rpb24gICAgICA9IDA7CisgICAgbXkgJGRvdWJsZV9xdW90ZSA9IDA7CisgICAgbXkgJHNpbmdsZV9xdW90ZSA9IDA7CisKKyAgICAjIEluaXRpYWwgcGFyc2luZyBvZiB0aGUgZm9ybWF0IHN0cmluZyB0byByZW1vdmUgZXNjYXBlIGNoYXJhY3RlcnMuIFRoaXMKKyAgICAjIGFsc28gaGFuZGxlcyBxdW90ZWQgc3RyaW5ncy4gU2VlIG5vdGUgYWJvdXQgc2luZ2xlIHF1b3RlcyBhYm92ZS4KKyAgQ0hBUkFDVEVSOgorICAgIGZvciBteSAkY2hhciAoIHNwbGl0IC8vLCAkZm9ybWF0X3N0ciApIHsKKworICAgICAgICBpZiAoICRkb3VibGVfcXVvdGUgb3IgJHNpbmdsZV9xdW90ZSApIHsKKyAgICAgICAgICAgICRmb3JtYXRzWyRzZWN0aW9uXSAuPSAkY2hhcjsKKyAgICAgICAgICAgICRkb3VibGVfcXVvdGUgPSAwIGlmICRjaGFyIGVxICciJzsKKyAgICAgICAgICAgICRzaW5nbGVfcXVvdGUgPSAwOworICAgICAgICAgICAgbmV4dCBDSEFSQUNURVI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoICRjaGFyIGVxICc7JyApIHsKKyAgICAgICAgICAgICRzZWN0aW9uKys7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICciJyApIHsKKyAgICAgICAgICAgICRkb3VibGVfcXVvdGUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGNoYXIgZXEgJyEnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnXFwnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKCcgKSB7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsgICAgIyBJZ25vcmUuCisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKScgKSB7CisgICAgICAgICAgICBuZXh0IENIQVJBQ1RFUjsgICAgIyBJZ25vcmUuCisgICAgICAgIH0KKworICAgICAgICAjIENvbnZlcnQgdXBwZXIgY2FzZSBPcGVuT2ZmaWNlLm9yZyBkYXRlL3RpbWUgZm9ybWF0cyB0byBsb3dlcmNhc2UuLgorICAgICAgICAkY2hhciA9IGxjKCRjaGFyKSBpZiAkY2hhciA9fiAvW0RNWUhTXS87CisKKyAgICAgICAgJGZvcm1hdHNbJHNlY3Rpb25dIC49ICRjaGFyOworICAgIH0KKworICAgICMgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBmb3JtYXQgZnJvbSB0aGUgNCBwb3NzaWJsZSBzdWItc2VjdGlvbnM6CisgICAgIyBwb3NpdGl2ZSBudW1iZXJzLCBuZWdhdGl2ZSBudW1iZXJzLCB6ZXJvIHZhbHVlcywgYW5kIHRleHQuCisgICAgIyBXZSBpZ25vcmUgdGhlIFRleHQgc2VjdGlvbiBzaW5jZSBub24tbnVtZXJpYyB2YWx1ZXMgYXJlIHJldHVybmVkCisgICAgIyB1bmZvcm1hdHRlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorICAgIG15ICRmb3JtYXQ7CisgICAgJHNlY3Rpb24gPSAwOworCisgICAgaWYgKCBAZm9ybWF0cyA9PSAxICkgeworICAgICAgICAkc2VjdGlvbiA9IDA7CisgICAgfQorICAgIGVsc2lmICggQGZvcm1hdHMgPT0gMiApIHsKKyAgICAgICAgaWYgKCAkbnVtYmVyIDwgMCApIHsKKyAgICAgICAgICAgICRzZWN0aW9uID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRzZWN0aW9uID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNpZiAoIEBmb3JtYXRzID09IDMgKSB7CisgICAgICAgIGlmICggJG51bWJlciA9PSAwICkgeworICAgICAgICAgICAgJHNlY3Rpb24gPSAyOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJG51bWJlciA8IDAgKSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkc2VjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWN0aW9uID0gMDsKKyAgICB9CisKKyAgICAjIE92ZXJyaWRlIHRoZSBwcmV2aW91cyBjaG9pY2UgaWYgdGhlIGZvcm1hdCBpcyBjb25kaXRpb25hbC4KKyAgICBpZiAoJGNvbmRpdGlvbmFsKSB7CisKKyAgICAgICAgIyBUT0RPLiBSZXBsYWNlIHN0cmluZyBldmFsIHdpdGggYSBmdW5jdGlvbi4KKyAgICAgICAgJHNlY3Rpb24gPSBldmFsICIkbnVtYmVyICRjb25kaXRpb25hbCIgPyAwIDogMTsKKyAgICB9CisKKyAgICAjIFdlIG5vdyBoYXZlIHRoZSByZXF1aXJlZCBmb3JtYXQuCisgICAgJGZvcm1hdCA9ICRmb3JtYXRzWyRzZWN0aW9uXTsKKworICAgICMgVGhlIGZvcm1hdCBzdHJpbmcgY2FuIGNvbnRhaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgY29sb3VyczoKKyAgICAjIFtCbGFja10gW0JsdWVdIFtDeWFuXSBbR3JlZW5dIFtNYWdlbnRhXSBbUmVkXSBbV2hpdGVdIFtZZWxsb3ddCisgICAgIyBvciB0aGUgc3RyaW5nIFtDb2xvclhdIHdoZXJlIHggaXMgYSBjb2xvdXIgaW5kZXggZnJvbSAxIHRvIDU2LgorICAgICMgV2UgZG9uJ3QgdXNlIHRoZSBjb2xvdXIgYnV0IHdlIHJldHVybiBpdCB0byB0aGUgY2FsbGVyLgorICAgICMKKyAgICBteSAkY29sb3IgPSAnJzsKKyAgICBpZiAoICRmb3JtYXQgPX4gcy9eKFxbW0EtWl1bYS16XXsyLH0oXGR7MSwyfSk/XF0pLy8gKSB7CisgICAgICAgICRjb2xvciA9ICQxOworICAgIH0KKworICAgICMgUmVtb3ZlIHRoZSBsb2NhbGUsIHN1Y2ggYXMgWyQtNDA5XSwgZnJvbSB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICBteSAkbG9jYWxlID0gJyc7CisgICAgaWYgKCAkZm9ybWF0ID1+IHMvXihcW1wkPy1cZCtcXSkvLyApIHsKKyAgICAgICAgJGxvY2FsZSA9ICQxOworICAgIH0KKworICAgICMgUmVwbGFjZSBjdXJyZW5jeSBsb2NhbGUsIHN1Y2ggYXMgWyQkLTQwOV0sIHdpdGggJCBpbiB0aGUgZm9ybWF0IHN0cmluZy4KKyAgICAjIFNlZSB0aGUgUlQjNjA1NDcgdGVzdCBjYXNlcyBpbiAyMV9udW1iZXJfZm9ybWF0X3VzZXIudC4KKyAgICBpZiAoICRmb3JtYXQgPX4gcy8oXFtcJChbXi1dKykoLVxkKyk/XF0pLyQyL3MgKSB7CisgICAgICAgICRsb2NhbGUgPSAkMTsKKyAgICB9CisKKworICAgICMgUmVtb3ZlIGxlYWRpbmcgIyBmcm9tICcjID8vPycsICcjID8/Lz8/JyBmcmFjdGlvbiBmb3JtYXRzLgorICAgICRmb3JtYXQgPX4gc3sjIFw/fXs/fWc7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBjcmVhdGUgYW4gQW9BIG9mIHBsYWNlaG9sZGVycyB0aGF0IGNvbnRhaW4KKyAgICAjIHRoZSBwYXJ0cyBvZiB0aGUgc3RyaW5nIHRvIGJlIHJlcGxhY2VkLiBUaGUgZm9ybWF0IG9mIHRoZSBpbmZvcm1hdGlvbgorICAgICMgc3RvcmVkIGlzOiBbICR0b2tlbiwgJHN0YXJ0X3BvcywgJGVuZF9wb3MsICRvcHRpb25faW5mbyBdLgorICAgICMKKyAgICBteSAkZm9ybWF0X21vZGUgID0gJyc7ICAgICMgRWl0aGVyOiAnJywgJ251bWJlcicsICdkYXRlJworICAgIG15ICRwb3MgICAgICAgICAgPSAwOyAgICAgIyBDaGFyYWN0ZXIgcG9zaXRpb24gd2l0aGluIGZvcm1hdCBzdHJpbmcuCisgICAgbXkgQHBsYWNlaG9sZGVycyA9ICgpOyAgICAjIEFyZWZzIHdpdGggcGFydHMgb2YgdGhlIGZvcm1hdCB0byBiZSByZXBsYWNlZC4KKyAgICBteSAkdG9rZW4gICAgICAgID0gJyc7ICAgICMgVGhlIGFjdHVhbCBmb3JtYXQgZXh0cmFjdGVkIGZyb20gdGhlIHRvdGFsIHN0ci4KKyAgICBteSAkc3RhcnRfcG9zOyAgICAgICAgICAgICMgQSBwb3NpdGlvbiB2YXJpYWJsZS4gSW5pdGlhbCBwYXJzZXIgcG9zaXRpb24uCisgICAgbXkgJHRva2VuX3N0YXJ0ID0gLTE7ICAgICAjIEEgcG9zaXRpb24gdmFyaWFibGUuCisgICAgbXkgJGRlY2ltYWxfcG9zID0gLTE7ICAgICAjIFBvc2l0aW9uIG9mIHRoZSBwdW5jdHVhdGlvbiBjaGFyICIuIiBvciAiLCIuCisgICAgbXkgJGNvbW1hX2NvdW50ID0gMDsgICAgICAjIENvdW50IG9mIHRoZSBjb21tYXMgaW4gdGhlIGZvcm1hdC4KKyAgICBteSAkaXNfZnJhY3Rpb24gPSAwOyAgICAgICMgTnVtYmVyIGZvcm1hdCBpcyBhIGZyYWN0aW9uLgorICAgIG15ICRpc19jdXJyZW5jeSA9IDA7ICAgICAgIyBOdW1iZXIgZm9ybWF0IGlzIGEgY3VycmVuY3kuCisgICAgbXkgJGlzX3BlcmNlbnQgID0gMDsgICAgICAjIE51bWJlciBmb3JtYXQgaXMgYSBwZXJjZW50YWdlLgorICAgIG15ICRpc18xMl9ob3VyICA9IDA7ICAgICAgIyBUaW1lIGZvcm1hdCBpcyB1c2luZyAxMiBob3VyIGNsb2NrLgorICAgIG15ICRzZWVuX2RvdCAgICA9IDA7ICAgICAgIyBUcmVhdCBvbmx5IHRoZSBmaXJzdCAiLiIgYXMgdGhlIGRlY2ltYWwgcG9pbnQuCisKKyAgICAjIFBhcnNlIHRoZSBmb3JtYXQuCisgIFBBUlNFUjoKKyAgICB3aGlsZSAoICRwb3MgPCBsZW5ndGggJGZvcm1hdCApIHsKKyAgICAgICAgJHN0YXJ0X3BvcyA9ICRwb3M7CisgICAgICAgIG15ICRjaGFyID0gc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICk7CisKKyAgICAgICAgIyBJZ25vcmUgY29udHJvbCBmb3JtYXQgY2hhcmFjdGVycyBzdWNoIGFzICcjMCstLj9lRSwlJy4gSG93ZXZlciwKKyAgICAgICAgIyBvbmx5IGlnbm9yZSAnLicgaWYgaXQgaXMgdGhlIGZpcnN0IG9uZSBlbmNvdW50ZXJlZC4gUlQgNDU1MDIuCisgICAgICAgIGlmICggKCAhJHNlZW5fZG90ICYmICRjaGFyICF+IC9bIzBcK1wtXC5cP2VFXCxcJV0vICkKKyAgICAgICAgICAgIHx8ICRjaGFyICF+IC9bIzBcK1wtXD9lRVwsXCVdLyApCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCApLAorICAgICAgICAgICAgICAgICAgICAkZGVjaW1hbF9wb3MsICRwb3MgLSAkdG9rZW5fc3RhcnQKKyAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAjIFByb2Nlc3NpbmcgZm9yIHF1b3RlZCBzdHJpbmdzIHdpdGhpbiB0aGUgZm9ybWF0LiBTZWUgbm90ZXMgYWJvdmUuCisgICAgICAgIGlmICggJGNoYXIgZXEgJyInICkgeworICAgICAgICAgICAgJGRvdWJsZV9xdW90ZSA9ICRkb3VibGVfcXVvdGUgPyAwIDogMTsKKyAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgIG5leHQgUEFSU0VSOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggJGNoYXIgZXEgJyEnICkgeworICAgICAgICAgICAgJHNpbmdsZV9xdW90ZSA9IDE7CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgICAgICBuZXh0IFBBUlNFUjsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICdcXCcgKSB7CisgICAgICAgICAgICBpZiAoICRzaW5nbGVfcXVvdGUgIT0gMSApIHsKKyAgICAgICAgICAgICAgICAkc2luZ2xlX3F1b3RlID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zKys7CisgICAgICAgICAgICAgICAgbmV4dCBQQVJTRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICAgKCBkZWZpbmVkKCRkb3VibGVfcXVvdGUpIGFuZCAoJGRvdWJsZV9xdW90ZSkgKQorICAgICAgICAgICAgb3IgKCBkZWZpbmVkKCRzaW5nbGVfcXVvdGUpIGFuZCAoJHNpbmdsZV9xdW90ZSkgKQorICAgICAgICAgICAgb3IgKCAkc2Vlbl9kb3QgJiYgJGNoYXIgZXEgJy4nICkgKQorICAgICAgICB7CisgICAgICAgICAgICAkc2luZ2xlX3F1b3RlID0gMDsKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAoICRmb3JtYXRfbW9kZSBuZSAnZGF0ZScgKQorICAgICAgICAgICAgICAgIGFuZCAoICAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceDgxXHhBMiIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceDgxXHhBMyIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceEEyXHhBNCIgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICJceEEyXHhBNSIgKSApCisgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICMgVGhlIGFib3ZlIG1hdGNoZXMgYXJlIGN1cnJlbmN5IHN5bWJvbHMuCisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSwgbGVuZ3RoKCR0b2tlbiksIDIgXTsKKyAgICAgICAgICAgICAgICAkaXNfY3VycmVuY3kgPSAxOworICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoCisgICAgICAgICAgICAoICRjaGFyID1+IC9bIzBcK1wuXD9lRVwsXCVdLyApCisgICAgICAgICAgICB8fCAoICAgICggJGZvcm1hdF9tb2RlIG5lICdkYXRlJyApCisgICAgICAgICAgICAgICAgYW5kICggKCAkY2hhciBlcSAnLScgKSB8fCAoICRjaGFyIGVxICcoJyApIHx8ICggJGNoYXIgZXEgJyknICkgKQorICAgICAgICAgICAgKQorICAgICAgICAgICkKKyAgICAgICAgeworICAgICAgICAgICAgJGZvcm1hdF9tb2RlID0gJ251bWJlcicgdW5sZXNzICRmb3JtYXRfbW9kZTsKKyAgICAgICAgICAgIGlmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgPX4gL1sjMF0vICkgeworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZm9ybWF0LCAkcG9zICkgPX4KKyAgICAgICAgICAgICAgICAgICAgL14oWyMwXStbXC5dP1swI10qW2VFXVtcK1wtXVswI10rKS8gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICQxLCAkcG9zLCBsZW5ndGgoJDEpIF07CisgICAgICAgICAgICAgICAgICAgICRwb3MgKz0gbGVuZ3RoKCQxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggJHRva2VuX3N0YXJ0ID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gJHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcyA9IGxlbmd0aCgkdG9rZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnPycgKSB7CisKKyAgICAgICAgICAgICAgICAjIExvb2sgZm9yIGEgZnJhY3Rpb24gZm9ybWF0IGxpa2UgPy8/IG9yID8/Lz8/CisgICAgICAgICAgICAgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzdHIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCwgJHRva2VuX3N0YXJ0LCAkcG9zIC0gJHRva2VuX3N0YXJ0ICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICRwb3MgLSAkdG9rZW5fc3RhcnQgKyAxCisgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHRva2VuX3N0YXJ0ID0gJHBvczsKKworICAgICAgICAgICAgICAgICMgRmluZCB0aGUgZW5kIG9mIHRoZSBmcmFjdGlvbiBmb3JtYXQuCisgICAgICAgICAgICAgIEZSQUNUSU9OOgorICAgICAgICAgICAgICAgIHdoaWxlICggJHBvcyA8IGxlbmd0aCgkZm9ybWF0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnLycgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkaXNfZnJhY3Rpb24gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2lmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJz8nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGUkFDVElPTjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJGlzX2ZyYWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSA9fiAvWzAtOV0vICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBDb3VsZCBpbnZlcnQgaWYoKSBsb2dpYyBhbmQgcmVtb3ZlIHRoaXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBvcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRlJBQ1RJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEZSQUNUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgJHBvcy0tOworCisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCArIDEgKSwKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKCR0b2tlbiksICRwb3MgLSAkdG9rZW5fc3RhcnQgKyAxCisgICAgICAgICAgICAgICAgICBdOworICAgICAgICAgICAgICAgICR0b2tlbl9zdGFydCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDMgKSA9fiAvXltlRV1bXCtcLV1bMCNdJC8gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MgKSA9fiAvKFtlRV1bXCtcLV1bMCNdKykvICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsIFsgJDEsICRwb3MsIGxlbmd0aCgkMSkgXTsKKyAgICAgICAgICAgICAgICAgICAgJHBvcyArPSBsZW5ndGgoJDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkdG9rZW5fc3RhcnQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggJHRva2VuX3N0YXJ0ICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkZm9ybWF0LCAkdG9rZW5fc3RhcnQsICRwb3MgLSAkdG9rZW5fc3RhcnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRkZWNpbWFsX3BvcywgJHBvcyAtICR0b2tlbl9zdGFydAorICAgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgICAgICAgICAgICAgICR0b2tlbl9zdGFydCA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApID1+IC9bXCtcLV0vICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSwgbGVuZ3RoKCR0b2tlbiksIDEgXTsKKyAgICAgICAgICAgICAgICAgICAgJGlzX2N1cnJlbmN5ID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnLicgKSB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgICAgICAkc2Vlbl9kb3QgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICcsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbW1hX2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICclJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGlzX3BlcmNlbnQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnKCcgKQorICAgICAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICcpJyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgICAgICBbIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApLCBsZW5ndGgoJHRva2VuKSwgMSBdOworICAgICAgICAgICAgICAgICAgICAkaXNfY3VycmVuY3kgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRwb3MrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyID1+IC9beW1kaHNhcGddL2kgKSB7CisgICAgICAgICAgICAkZm9ybWF0X21vZGUgPSAnZGF0ZScgdW5sZXNzICRmb3JtYXRfbW9kZTsKKyAgICAgICAgICAgIGlmICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA1ICkgPX4gL2FtXC9wbS9pICkgeworICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnYW0vcG0nLCBsZW5ndGgoJHRva2VuKSwgNSBdOworICAgICAgICAgICAgICAgICRpc18xMl9ob3VyID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMyApID1+IC9hXC9wL2kgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdhL3AnLCBsZW5ndGgoJHRva2VuKSwgMyBdOworICAgICAgICAgICAgICAgICRpc18xMl9ob3VyID0gMTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgNSApIGVxICdtbW1tbScgKSB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdtbW1tbScsIGxlbmd0aCgkdG9rZW4pLCA1IF07CisgICAgICAgICAgICAgICAgJHBvcyArPSA1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICkgZXEgJ21tbW0nICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgNCApIGVxICdkZGRkJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDQgKSBlcSAneXl5eScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICkgZXEgJ2dnZ2UnICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCA0ICksIGxlbmd0aCgkdG9rZW4pLCA0IF07CisgICAgICAgICAgICAgICAgJHBvcyArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ2RkZCcgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ21tbScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ3l5eScgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDMgKSwgbGVuZ3RoKCR0b2tlbiksIDMgXTsKKyAgICAgICAgICAgICAgICAkcG9zICs9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSBlcSAneXknICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICdtbScgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ2RkJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSBlcSAnaGgnICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMiApIGVxICdzcycgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ2dlJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ21tJyApCisgICAgICAgICAgICAgICAgICAgICYmIChAcGxhY2Vob2xkZXJzKQorICAgICAgICAgICAgICAgICAgICAmJiAoICAgKCAkcGxhY2Vob2xkZXJzWy0xXS0+WzBdIGVxICdoJyApCisgICAgICAgICAgICAgICAgICAgICAgICBvciAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJ2hoJyApICkKKyAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgIyBGb3IgdGhpcyBjYXNlICdtJyBpcyBtaW51dGVzIG5vdCBtb250aHMuCisgICAgICAgICAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnbW0nLCBsZW5ndGgoJHRva2VuKSwgMiwgJ21pbnV0ZXMnIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgWyBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDIgKSwgbGVuZ3RoKCR0b2tlbiksIDIgXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAyICkgZXEgJ3NzJyApCisgICAgICAgICAgICAgICAgICAgICYmICggQHBsYWNlaG9sZGVycyA+IDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKCAkcGxhY2Vob2xkZXJzWy0yXS0+WzBdIGVxICdtJyApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRwbGFjZWhvbGRlcnNbLTJdLT5bMF0gZXEgJ21tJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRwbGFjZWhvbGRlcnNbLTJdIH0sICdtaW51dGVzJyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRwb3MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICgoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdtJyApCisgICAgICAgICAgICAgICAgfHwgKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDEgKSBlcSAnZCcgKQorICAgICAgICAgICAgICAgIHx8ICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJ2gnICkKKyAgICAgICAgICAgICAgICB8fCAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdzJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoCisgICAgICAgICAgICAgICAgICAgICAgICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICkgZXEgJ20nICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKEBwbGFjZWhvbGRlcnMpCisgICAgICAgICAgICAgICAgICAgICYmICggICAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJ2gnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyc1stMV0tPlswXSBlcSAnaGgnICkgKQorICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdtJywgbGVuZ3RoKCR0b2tlbiksIDEsICdtaW51dGVzJyBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLAorICAgICAgICAgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICksIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggICAoIHN1YnN0ciggJGZvcm1hdCwgJHBvcywgMSApIGVxICdzJyApCisgICAgICAgICAgICAgICAgICAgICYmICggQHBsYWNlaG9sZGVycyA+IDEgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoICAgKCAkcGxhY2Vob2xkZXJzWy0yXS0+WzBdIGVxICdtJyApCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRwbGFjZWhvbGRlcnNbLTJdLT5bMF0gZXEgJ21tJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAjIEZvciB0aGlzIGNhc2UgJ20nIGlzIG1pbnV0ZXMgbm90IG1vbnRocy4KKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEB7ICRwbGFjZWhvbGRlcnNbLTJdIH0sICdtaW51dGVzJyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICRwb3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICggc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAzICkgZXEgJ1toXScgKSApIHsKKyAgICAgICAgICAgICRmb3JtYXRfbW9kZSA9ICdkYXRlJyB1bmxlc3MgJGZvcm1hdF9tb2RlOworICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdbaF0nLCBsZW5ndGgoJHRva2VuKSwgMyBdOworICAgICAgICAgICAgJHBvcyArPSAzOworICAgICAgICB9CisgICAgICAgIGVsc2lmICggKCBzdWJzdHIoICRmb3JtYXQsICRwb3MsIDQgKSBlcSAnW21tXScgKSApIHsKKyAgICAgICAgICAgICRmb3JtYXRfbW9kZSA9ICdkYXRlJyB1bmxlc3MgJGZvcm1hdF9tb2RlOworICAgICAgICAgICAgcHVzaCBAcGxhY2Vob2xkZXJzLCBbICdbbW1dJywgbGVuZ3RoKCR0b2tlbiksIDQgXTsKKyAgICAgICAgICAgICRwb3MgKz0gNDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRjaGFyIGVxICdAJyApIHsKKyAgICAgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywgWyAnQCcsIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkY2hhciBlcSAnKicgKSB7CisgICAgICAgICAgICBwdXNoIEBwbGFjZWhvbGRlcnMsCisgICAgICAgICAgICAgIFsgc3Vic3RyKCAkZm9ybWF0LCAkcG9zLCAxICksIGxlbmd0aCgkdG9rZW4pLCAxIF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkcG9zKys7CisgICAgICAgIH0KKyAgICAgICAgJHBvcysrIGlmICggJHBvcyA9PSAkc3RhcnRfcG9zICk7ICAgICNObyBGb3JtYXQgbWF0Y2gKKyAgICAgICAgJHRva2VuIC49IHN1YnN0ciggJGZvcm1hdCwgJHN0YXJ0X3BvcywgJHBvcyAtICRzdGFydF9wb3MgKTsKKworICAgIH0gICAgIyBFbmQgb2YgcGFyc2luZy4KKworICAgICMgQ29weSB0aGUgbG9jYXRlZCBmb3JtYXQgc3RyaW5nIHRvIGEgcmVzdWx0IHN0cmluZyB0aGF0IHdlIHdpbGwgcGVyZm9ybQorICAgICMgdGhlIHN1YnN0aXR1dGlvbnMgb24gYW5kIHJldHVybiB0byB0aGUgdXNlci4KKyAgICBteSAkcmVzdWx0ID0gJHRva2VuOworCisgICAgIyBBZGQgYSBwbGFjZWhvbGRlciBiZXR3ZWVuIHRoZSBkZWNpbWFsL2NvbW1hIGFuZCBlbmQgb2YgdGhlIHRva2VuLCBpZiBhbnkuCisgICAgaWYgKCAkdG9rZW5fc3RhcnQgIT0gLTEgKSB7CisgICAgICAgIHB1c2ggQHBsYWNlaG9sZGVycywKKyAgICAgICAgICBbCisgICAgICAgICAgICBzdWJzdHIoICRmb3JtYXQsICR0b2tlbl9zdGFydCwgJHBvcyAtICR0b2tlbl9zdGFydCArIDEgKSwKKyAgICAgICAgICAgICRkZWNpbWFsX3BvcywgJHBvcyAtICR0b2tlbl9zdGFydCArIDEKKyAgICAgICAgICBdOworICAgIH0KKworICAgICMKKyAgICAjIEluIHRoZSBuZXh0IHNlY3Rpb25zIHdlIHByb2Nlc3MgZGF0ZSwgbnVtYmVyIGFuZCB0ZXh0IGZvcm1hdHMuIFdlIHRha2UgYQorICAgICMgZm9ybWF0IHN1Y2ggYXMgeXl5eS9tbS9kZCBhbmQgcmVwbGFjZSBpdCB3aXRoIHNvbWV0aGluZyBsaWtlIDIwMDgvMTIvMjUuCisgICAgIworICAgIGlmICggKCAkZm9ybWF0X21vZGUgZXEgJ2RhdGUnICkgJiYgKCAkbnVtYmVyID1+ICRxck5VTUJFUiApICkgeworCisgICAgICAgICMgVGhlIG1heGltdW0gYWxsb3dhYmxlIGRhdGUgaW4gRXhjZWwgaXMgOTk5OS0xMi0zMVQyMzo1OTo1OS4wMDAgd2hpY2gKKyAgICAgICAgIyBlcXVhdGVzIHRvIDI5NTg0NjUuOTk5KyBpbiB0aGUgMTkwMCBlcG9jaCBhbmQgMjk1NzAwMy45OTkrIGluIHRoZQorICAgICAgICAjIDE5MDQgZXBvY2guIFdlIHVzZSAwIGFzIHRoZSBtaW5pbXVtIGluIGJvdGggZXBvY2hzLiBUaGUgMTkwNCBzeXN0ZW0KKyAgICAgICAgIyBhY3R1YWxseSBzdXBwb3J0cyBuZWdhdGl2ZSBudW1iZXJzIGJ1dCB0aGF0IGlzbid0IHdvcnRoIHRoZSBlZmZvcnQuCisgICAgICAgIG15ICRtaW5fZGF0ZSA9IDA7CisgICAgICAgIG15ICRtYXhfZGF0ZSA9IDI5NTg0NjY7CisgICAgICAgICRtYXhfZGF0ZSA9IDI5NTcwMDQgaWYgJGlzXzE5MDQ7CisKKyAgICAgICAgaWYgKCAkbnVtYmVyIDwgJG1pbl9kYXRlIHx8ICRudW1iZXIgPj0gJG1heF9kYXRlICkgeworICAgICAgICAgICAgcmV0dXJuICRudW1iZXI7ICAgICMgUmV0dXJuIHVuZm9ybWF0dGVkIG51bWJlci4KKyAgICAgICAgfQorCisgICAgICAgICMgUHJvY2VzcyBkYXRlIGZvcm1hdHMuCisgICAgICAgIG15IEB0aW1lID0gRXhjZWxMb2NhbHRpbWUoICRudW1iZXIsICRpc18xOTA0ICk7CisKKyAgICAgICAgIyAgICAwICAgICAxICAgICAyICAgICAgMyAgICAgNCAgICAgICA1ICAgICAgNiAgICAgIDcKKyAgICAgICAgbXkgKCAkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjICkgPSBAdGltZTsKKworICAgICAgICAkbW9udGgrKzsgICAgICAgICAgICAgICMgbG9jYWx0aW1lKCkgemVybyBpbmRleGVkIG1vbnRoLgorICAgICAgICAkeWVhciArPSAxOTAwOyAgICAgICAgICMgbG9jYWx0aW1lKCkgeWVhci4KKworICAgICAgICBteSBAZnVsbF9tb250aF9uYW1lID0gcXcoCisgICAgICAgICAgTm9uZSBKYW51YXJ5IEZlYnJ1YXJ5IE1hcmNoIEFwcmlsIE1heSBKdW5lIEp1bHkKKyAgICAgICAgICBBdWd1c3QgU2VwdGVtYmVyIE9jdG9iZXIgTm92ZW1iZXIgRGVjZW1iZXIKKyAgICAgICAgKTsKKyAgICAgICAgbXkgQHNob3J0X21vbnRoX25hbWUgPSBxdygKKyAgICAgICAgICBOb25lIEphbiBGZWIgTWFyIEFwciBNYXkgSnVuIEp1bCBBdWcgU2VwIE9jdCBOb3YgRGVjCisgICAgICAgICk7CisgICAgICAgIG15IEBmdWxsX2RheV9uYW1lID0gcXcoCisgICAgICAgICAgU3VuZGF5IE1vbmRheSBUdWVzZGF5IFdlZG5lc2RheSBUaHVyc2RheSBGcmlkYXkgU2F0dXJkYXkKKyAgICAgICAgKTsKKyAgICAgICAgbXkgQHNob3J0X2RheV9uYW1lID0gcXcoCisgICAgICAgICAgU3VuIE1vbiBUdWUgV2VkIFRodSBGcmkgU2F0CisgICAgICAgICk7CisKKyAgICAgICAgIyBSZXBsYWNlIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHRlbXBsYXRlIHN1Y2ggYXMgeXl5eSBtbSBkZCB3aXRoCisgICAgICAgICMgYWN0dWFsIG51bWJlcnMgb3Igc3RyaW5ncy4KKyAgICAgICAgbXkgJHJlcGxhY2VtZW50OworICAgICAgICBmb3IgKCBteSAkaSA9IEBwbGFjZWhvbGRlcnMgLSAxIDsgJGkgPj0gMCA7ICRpLS0gKSB7CisgICAgICAgICAgICBteSAkcGxhY2Vob2xkZXIgPSAkcGxhY2Vob2xkZXJzWyRpXTsKKworICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlstMV0gZXEgJ21pbnV0ZXMnICkgeworCisgICAgICAgICAgICAgICAgIyBGb3IgdGhpcyBjYXNlICdtL21tJyBpcyBtaW51dGVzIG5vdCBtb250aHMuCisgICAgICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW0nICkgeworICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAiJTAyZCIsICRtaW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICIlZCIsICRtaW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICd5eXl5JyApIHsKKworICAgICAgICAgICAgICAgICMgNCBkaWdpdCBZZWFyLiAyMDAwIC0+IDIwMDAuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwNGQnLCAkeWVhciApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAneXknICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IFllYXIuIDIwMDAgLT4gMDAuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwMmQnLCAkeWVhciAlIDEwMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW1tbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBGaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG1vbnRoIG5hbWUuIDEgLT4gSi4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzdWJzdHIoICRzaG9ydF9tb250aF9uYW1lWyRtb250aF0sIDAsIDEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ21tbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBGdWxsIG1vbnRoIG5hbWUuIDEgLT4gSmFudWFyeS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkZnVsbF9tb250aF9uYW1lWyRtb250aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdtbW0nICkgeworCisgICAgICAgICAgICAgICAgIyBTaG9ydCBtb250aCBuYW1lLiAxIC0+IEphbi4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkc2hvcnRfbW9udGhfbmFtZVskbW9udGhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnbW0nICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IG1vbnRoLiAxIC0+IDAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclMDJkJywgJG1vbnRoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdtJyApIHsKKworICAgICAgICAgICAgICAgICMgMSBkaWdpdCBtb250aC4gMSAtPiAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRtb250aCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnZGRkZCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIEZ1bGwgZGF5IG5hbWUuIFdlZG5lc2RheSAoZm9yIGV4YW1wbGUuKQorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICRmdWxsX2RheV9uYW1lWyR3ZGF5XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2RkZCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIFNob3J0IGRheSBuYW1lLiBXZWQgKGZvciBleGFtcGxlLikKKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAkc2hvcnRfZGF5X25hbWVbJHdkYXldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnZGQnICkgeworCisgICAgICAgICAgICAgICAgIyAyIGRpZ2l0IGRheS4gMSAtPiAwMS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJTAyZCcsICRkYXkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2QnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IGRheS4gMSAtPiAxLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRkYXkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2hoJyApIHsKKworICAgICAgICAgICAgICAgICMgMiBkaWdpdCBob3VyLgorICAgICAgICAgICAgICAgIGlmICgkaXNfMTJfaG91cikgeworICAgICAgICAgICAgICAgICAgICBteSAkaG91cl90bXAgPSAkaG91ciAlIDEyOworICAgICAgICAgICAgICAgICAgICAkaG91cl90bXAgPSAxMiBpZiAkaG91ciAlIDEyID09IDA7CisgICAgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9IHNwcmludGYoICclZCcsICRob3VyX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUwMmQnLCAkaG91ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2gnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IGhvdXIuCisgICAgICAgICAgICAgICAgaWYgKCRpc18xMl9ob3VyKSB7CisgICAgICAgICAgICAgICAgICAgIG15ICRob3VyX3RtcCA9ICRob3VyICUgMTI7CisgICAgICAgICAgICAgICAgICAgICRob3VyX3RtcCA9IDEyIGlmICRob3VyICUgMTIgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyUyZCcsICRob3VyX3RtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyVkJywgJGhvdXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdzcycgKSB7CisKKyAgICAgICAgICAgICAgICAjIDIgZGlnaXQgc2Vjb25kcy4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJTAyZCcsICRzZWMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ3MnICkgeworCisgICAgICAgICAgICAgICAgIyAxIGRpZ2l0IHNlY29uZHMuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gc3ByaW50ZiggJyVkJywgJHNlYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnYW0vcG0nICkgeworCisgICAgICAgICAgICAgICAgIyBBTS9QTS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAoICRob3VyID49IDEyICkgPyAnUE0nIDogJ0FNJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJ2EvcCcgKSB7CisKKyAgICAgICAgICAgICAgICAjIEFNL1BNLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICggJGhvdXIgPj0gMTIgKSA/ICdQJyA6ICdBJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJy4nICkgeworCisgICAgICAgICAgICAgICAgIyBEZWNpbWFsIHBvaW50IGZvciBzZWNvbmRzLgorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9ICcuJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gPX4gLyheMCskKS8gKSB7CisKKyAgICAgICAgICAgICAgICAjIE1pbGxpc2Vjb25kcy4gRm9yIGV4YW1wbGUgaDpzcy4wMDAuCisgICAgICAgICAgICAgICAgbXkgJGxlbmd0aCA9IGxlbmd0aCgkMSk7CisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgIHN1YnN0ciggc3ByaW50ZiggIiUuJHtsZW5ndGh9ZiIsICRtc2VjIC8gMTAwMCApLCAyLCAkbGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdbaF0nICkgeworCisgICAgICAgICAgICAgICAgIyBIb3VycyBtb2R1bHVzIDI0LiAyNSBkaXNwbGF5cyBhcyAyNSBub3QgYXMgMS4KKyAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSBzcHJpbnRmKCAnJWQnLCBpbnQoJG51bWJlcikgKiAyNCArICRob3VyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdbbW1dJyApIHsKKworICAgICAgICAgICAgICAgICMgTWlucyBtb2R1bHVzIDYwLiA3MiBkaXNwbGF5cyBhcyA3MiBub3QgYXMgMTIuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgIHNwcmludGYoICclZCcsICggaW50KCRudW1iZXIpICogMjQgKyAkaG91ciApICogNjAgKyAkbWluICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdnZScgKSB7CisgICAgICAgICAgICAgICAgcmVxdWlyZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW47CisgICAgICAgICAgICAgICAgIyBKYXBhbmVzZSBOZW5nbyAoYWthIEdlbmdvKSBpbiBpbml0aWFsaXNtIChhYmJyLiBuYW1lKQorICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPQorICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OkZtdEphcGFuOjpDbnZOZW5nbyggYWJicl9uYW1lID0+IEB0aW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdnZ2dlJyApIHsKKyAgICAgICAgICAgICAgICByZXF1aXJlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpGbXRKYXBhbjsKKyAgICAgICAgICAgICAgICAjIEphcGFuZXNlIE5lbmdvIChha2EgR2VuZ28pIGluIEthbmppIChmdWxsIG5hbWUpCisgICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCA9CisgICAgICAgICAgICAgICAgICBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6Rm10SmFwYW46OkNudk5lbmdvKCBuYW1lID0+IEB0aW1lICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdAJyApIHsKKworICAgICAgICAgICAgICAgICMgVGV4dCBmb3JtYXQuCisgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0gJG51bWJlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBTdWJzdGl0dXRlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgYmFjayBpbnRvIHRoZSB0ZW1wbGF0ZS4KKyAgICAgICAgICAgIHN1YnN0ciggJHJlc3VsdCwgJHBsYWNlaG9sZGVyLT5bMV0sICRwbGFjZWhvbGRlci0+WzJdLAorICAgICAgICAgICAgICAgICRyZXBsYWNlbWVudCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2lmICggKCAkZm9ybWF0X21vZGUgZXEgJ251bWJlcicgKSAmJiAoICRudW1iZXIgPX4gJHFyTlVNQkVSICkgKSB7CisKKyAgICAgICAgIyBQcm9jZXNzIG5vbiBkYXRlIGZvcm1hdHMuCisgICAgICAgIGlmIChAcGxhY2Vob2xkZXJzKSB7CisgICAgICAgICAgICB3aGlsZSAoICRwbGFjZWhvbGRlcnNbLTFdLT5bMF0gZXEgJywnICkgeworICAgICAgICAgICAgICAgICRjb21tYV9jb3VudC0tOworICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgJHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1stMV0tPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1stMV0tPlsyXSwgJycKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICRudW1iZXIgLz0gMTAwMDsKKyAgICAgICAgICAgICAgICBwb3AgQHBsYWNlaG9sZGVyczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXkgJG51bWJlcl9mb3JtYXQgPSBqb2luKCAnJywgbWFwIHsgJF8tPlswXSB9IEBwbGFjZWhvbGRlcnMgKTsKKyAgICAgICAgICAgIG15ICRudW1iZXJfcmVzdWx0OworICAgICAgICAgICAgbXkgJHN0cl9sZW5ndGggICAgPSAwOworICAgICAgICAgICAgbXkgJGVuZ2luZWVyaW5nICAgPSAwOworICAgICAgICAgICAgbXkgJGlzX2RlY2ltYWwgICAgPSAwOworICAgICAgICAgICAgbXkgJGlzX2ludGVnZXIgICAgPSAwOworICAgICAgICAgICAgbXkgJGFmdGVyX2RlY2ltYWwgPSB1bmRlZjsKKworICAgICAgICAgICAgZm9yIG15ICR0b2tlbiAoIHNwbGl0IC8vLCAkbnVtYmVyX2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBpZiAoICR0b2tlbiBlcSAnLicgKSB7CisgICAgICAgICAgICAgICAgICAgICRzdHJfbGVuZ3RoKys7CisgICAgICAgICAgICAgICAgICAgICRpc19kZWNpbWFsID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAoICR0b2tlbiBlcSAnRScgKSB8fCAoICR0b2tlbiBlcSAnZScgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVuZ2luZWVyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkdG9rZW4gZXEgJzAnICkgeworICAgICAgICAgICAgICAgICAgICAkc3RyX2xlbmd0aCsrOworICAgICAgICAgICAgICAgICAgICAkYWZ0ZXJfZGVjaW1hbCsrIGlmICRpc19kZWNpbWFsOworICAgICAgICAgICAgICAgICAgICAkaXNfaW50ZWdlciA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHRva2VuIGVxICcjJyApIHsKKyAgICAgICAgICAgICAgICAgICAgJGFmdGVyX2RlY2ltYWwrKyBpZiAkaXNfZGVjaW1hbDsKKyAgICAgICAgICAgICAgICAgICAgJGlzX2ludGVnZXIgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICR0b2tlbiBlcSAnPycgKSB7CisgICAgICAgICAgICAgICAgICAgICRhZnRlcl9kZWNpbWFsKysgaWYgJGlzX2RlY2ltYWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkbnVtYmVyICo9IDEwMC4wIGlmICRpc19wZXJjZW50OworCisgICAgICAgICAgICBteSAkZGF0YSA9ICgkaXNfY3VycmVuY3kpID8gYWJzKCRudW1iZXIpIDogJG51bWJlciArIDA7CisKKyAgICAgICAgICAgIGlmICgkaXNfZnJhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9IHNwcmludGYoICIlMCR7c3RyX2xlbmd0aH1kIiwgaW50KCRkYXRhKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCRpc19kZWNpbWFsKSB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRhZnRlcl9kZWNpbWFsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9yZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmICIlMCR7c3RyX2xlbmd0aH0uJHthZnRlcl9kZWNpbWFsfWYiLCAkZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRudW1iZXJfcmVzdWx0ID0gc3ByaW50ZiAiJTAke3N0cl9sZW5ndGh9ZiIsICRkYXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIyBGaXggZm9yIFBlcmwgYW5kIHNwcmludGYgbm90IHJvdW5kaW5nIHVwIGxpa2UgRXhjZWwuCisgICAgICAgICAgICAgICAgICAgICMgaHR0cDovL3J0LmNwYW4ub3JnL1B1YmxpYy9CdWcvRGlzcGxheS5odG1sP2lkPTQ1NjI2CisgICAgICAgICAgICAgICAgICAgIGlmICggJGRhdGEgPX4gL14ke251bWJlcl9yZXN1bHR9NS8gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYgIiUwJHtzdHJfbGVuZ3RofS4ke2FmdGVyX2RlY2ltYWx9ZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICRkYXRhIC4gJzEnOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX3Jlc3VsdCA9IHNwcmludGYoICIlMCR7c3RyX2xlbmd0aH0uMGYiLCAkZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgJG51bWJlcl9yZXN1bHQgPSBBZGRDb21tYSgkbnVtYmVyX3Jlc3VsdCkgaWYgJGNvbW1hX2NvdW50ID4gMDsKKworICAgICAgICAgICAgbXkgJG51bWJlcl9sZW5ndGggPSBsZW5ndGgoJG51bWJlcl9yZXN1bHQpOworICAgICAgICAgICAgbXkgJGRlY2ltYWxfcG9zICAgPSAtMTsKKyAgICAgICAgICAgIG15ICRyZXBsYWNlbWVudDsKKworICAgICAgICAgICAgZm9yICggbXkgJGkgPSBAcGxhY2Vob2xkZXJzIC0gMSA7ICRpID49IDAgOyAkaS0tICkgeworICAgICAgICAgICAgICAgIG15ICRwbGFjZWhvbGRlciA9ICRwbGFjZWhvbGRlcnNbJGldOworCisgICAgICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSA9fgorICAgICAgICAgICAgICAgICAgICAvKFsjMF0qKShbXC5dPykoWzAjXSopKFtlRV0pKFtcK1wtXSkoWzAjXSspLyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ha2VFKCAkcGxhY2Vob2xkZXItPlswXSwgJG51bWJlciApICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gPX4gL1wvLyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBNYWtlRnJhY3Rpb24oICRwbGFjZWhvbGRlci0+WzBdLCAkbnVtYmVyLCAkaXNfaW50ZWdlciApCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJy4nICkgeworICAgICAgICAgICAgICAgICAgICAkbnVtYmVyX2xlbmd0aC0tOworICAgICAgICAgICAgICAgICAgICAkZGVjaW1hbF9wb3MgPSAkbnVtYmVyX2xlbmd0aDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnKycgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJHJlc3VsdCwgJHBsYWNlaG9sZGVyLT5bMV0sICRwbGFjZWhvbGRlci0+WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgKCAkbnVtYmVyID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICA/ICcrJworICAgICAgICAgICAgICAgICAgICAgICAgOiAoICggJG51bWJlciA9PSAwICkgPyAnKycgOiAnLScgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICctJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXIgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKCAoICRudW1iZXIgPT0gMCApID8gJycgOiAnLScgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoICRwbGFjZWhvbGRlci0+WzBdIGVxICdAJyApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAkbnVtYmVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2lmICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgJyonICkgeworICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwgJycgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzaWYgKCggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4QTJceEE0IiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4QTJceEE1IiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4ODFceEEyIiApCisgICAgICAgICAgICAgICAgICAgIG9yICggJHBsYWNlaG9sZGVyLT5bMF0gZXEgIlx4ODFceEEzIiApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQsICAgICAgICAgICAkcGxhY2Vob2xkZXItPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRwbGFjZWhvbGRlci0+WzJdLCAkcGxhY2Vob2xkZXItPlswXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNpZiAoKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnKCcgKQorICAgICAgICAgICAgICAgICAgICBvciAoICRwbGFjZWhvbGRlci0+WzBdIGVxICcpJyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0cigKKyAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHQsICAgICAgICAgICAkcGxhY2Vob2xkZXItPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICRwbGFjZWhvbGRlci0+WzJdLCAkcGxhY2Vob2xkZXItPlswXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkbnVtYmVyX2xlbmd0aCA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRpIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJG51bWJlcl9yZXN1bHQsIDAsICRudW1iZXJfbGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHJlYWxfcGFydF9sZW5ndGggPSBsZW5ndGgoICRwbGFjZWhvbGRlci0+WzBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkZGVjaW1hbF9wb3MgPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICRwbGFjZWhvbGRlci0+WzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0ID1+IHMvXiMrLy87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0gbGVuZ3RoICRmb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXJfbGVuZ3RoIDw9ICRyZWFsX3BhcnRfbGVuZ3RoICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRudW1iZXJfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcmVhbF9wYXJ0X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICRudW1iZXJfbGVuZ3RoIDw9ICRyZWFsX3BhcnRfbGVuZ3RoICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICRudW1iZXJfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAkcmVhbF9wYXJ0X2xlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlcGxhY2VtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJG51bWJlcl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1iZXJfbGVuZ3RoIC0gJHJlYWxfcGFydF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWFsX3BhcnRfbGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG51bWJlcl9sZW5ndGggLT0gJHJlYWxfcGFydF9sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcmVwbGFjZW1lbnQgPSAnJzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdWJzdHIoICRyZXN1bHQsICRwbGFjZWhvbGRlci0+WzFdLCAkcGxhY2Vob2xkZXItPlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJceDAwIiAuICRyZXBsYWNlbWVudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRyZXBsYWNlbWVudCA9CisgICAgICAgICAgICAgICggJG51bWJlcl9sZW5ndGggPiAwICkKKyAgICAgICAgICAgICAgPyBzdWJzdHIoICRudW1iZXJfcmVzdWx0LCAwLCAkbnVtYmVyX2xlbmd0aCApCisgICAgICAgICAgICAgIDogJyc7CisgICAgICAgICAgICAkcmVzdWx0ID1+IHMvXHgwMC8kcmVwbGFjZW1lbnQvOworICAgICAgICAgICAgJHJlc3VsdCA9fiBzL1x4MDAvL2c7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBQcm9jZXNzIHRleHQgZm9ybWF0cworICAgICAgICBteSAkaXNfdGV4dCA9IDA7CisgICAgICAgIGZvciAoIG15ICRpID0gQHBsYWNlaG9sZGVycyAtIDEgOyAkaSA+PSAwIDsgJGktLSApIHsKKyAgICAgICAgICAgIG15ICRwbGFjZWhvbGRlciA9ICRwbGFjZWhvbGRlcnNbJGldOworICAgICAgICAgICAgaWYgKCAkcGxhY2Vob2xkZXItPlswXSBlcSAnQCcgKSB7CisgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICRudW1iZXIgKTsKKyAgICAgICAgICAgICAgICAkaXNfdGV4dCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3Vic3RyKCAkcmVzdWx0LCAkcGxhY2Vob2xkZXItPlsxXSwgJHBsYWNlaG9sZGVyLT5bMl0sICcnICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAkcmVzdWx0ID0gJG51bWJlciB1bmxlc3MgJGlzX3RleHQ7CisKKyAgICB9ICAgICMgRW5kIG9mIHBsYWNlaG9sZGVyIHN1YnN0aXR1dGlvbnMuCisKKyAgICAjIFRyaW0gdGhlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgcmVzdWx0cy4KKyAgICAkcmVzdWx0ID1+IHMvXlxzKy8vOworICAgICRyZXN1bHQgPX4gcy9ccyskLy87CisKKyAgICAjIEZpeCBmb3IgbmVnYXRpdmUgY3VycmVuY3kuCisgICAgJHJlc3VsdCA9fiBzL15cJFwtL1wtXCQvOworICAgICRyZXN1bHQgPX4gcy9eXCQgXC0vXC1cJCAvOworCisgICAgIyBSZXR1cm4gY29sb3IgYW5kIGxvY2FsZSBzdHJpbmdzIGlmIHJlcXVpcmVkLgorICAgIGlmICgkd2FudF9zdWJmb3JtYXRzKSB7CisgICAgICAgIHJldHVybiAoICRyZXN1bHQsICRjb2xvciwgJGxvY2FsZSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRyZXN1bHQ7CisgICAgfQorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFkZENvbW1hIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgQWRkQ29tbWEgeworICAgIG15ICgkc051bSkgPSBAXzsKKworICAgIGlmICggJHNOdW0gPX4gL14oW15cZF0qKShcZFxkXGRcZCspKFwuKi4qKSQvICkgeworICAgICAgICBteSAoICRzUHJlLCAkc09iaiwgJHNBZnQgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICBmb3IgKCBteSAkaSA9IGxlbmd0aCgkc09iaikgLSAzIDsgJGkgPiAwIDsgJGkgLT0gMyApIHsKKyAgICAgICAgICAgIHN1YnN0ciggJHNPYmosICRpLCAwLCAnLCcgKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gJHNQcmUgLiAkc09iaiAuICRzQWZ0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICRzTnVtOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWtlRnJhY3Rpb24gKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBNYWtlRnJhY3Rpb24geworICAgIG15ICggJHNGbXQsICRpRGF0YSwgJGlGbGcgKSA9IEBfOworICAgIG15ICRpQnVuYm87CisgICAgbXkgJGlTaG91OworCisgICAgIzEuIEluaXQKKyAgICAjIHByaW50ICJGTEc6ICRpRmxnXG4iOworICAgIGlmICgkaUZsZykgeworICAgICAgICAkaVNob3UgPSAkaURhdGEgLSBpbnQoJGlEYXRhKTsKKyAgICAgICAgcmV0dXJuICcnIGlmICggJGlTaG91ID09IDAgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRpU2hvdSA9ICRpRGF0YTsKKyAgICB9CisgICAgJGlTaG91ID0gYWJzKCRpU2hvdSk7CisgICAgbXkgJHNTV2s7CisKKyAgICAjMi5DYWxjIEJVTkJPCisgICAgIzIuMSBCVU5CTyBkZWZpbmVkCisgICAgaWYgKCAkc0ZtdCA9fiAvXC8oXGQrKSQvICkgeworICAgICAgICAkaUJ1bmJvID0gJDE7CisgICAgICAgIHJldHVybiBzcHJpbnRmKCAiJWQvJWQiLCAkaVNob3UgKiAkaUJ1bmJvLCAkaUJ1bmJvICk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMyLjIgQ2FsYyBCVU5CTworICAgICAgICAkc0ZtdCA9fiAvXC8oXD8rKSQvOworICAgICAgICBteSAkaUtldGEgPSBsZW5ndGgoJDEpOworICAgICAgICBteSAkaVNXayAgPSAxOworICAgICAgICBteSAkc1NXayAgPSAnJzsKKyAgICAgICAgbXkgJGlCdW5zaTsKKyAgICAgICAgZm9yICggbXkgJGlCdW5ibyA9IDIgOyAkaUJ1bmJvIDwgMTAqKiRpS2V0YSA7ICRpQnVuYm8rKyApIHsKKyAgICAgICAgICAgICRpQnVuc2kgPSBpbnQoICRpU2hvdSAqICRpQnVuYm8gKyAwLjUgKTsKKyAgICAgICAgICAgIG15ICRpQ21wID0gYWJzKCAkaVNob3UgLSAoICRpQnVuc2kgLyAkaUJ1bmJvICkgKTsKKyAgICAgICAgICAgIGlmICggJGlDbXAgPCAkaVNXayApIHsKKyAgICAgICAgICAgICAgICAkaVNXayA9ICRpQ21wOworICAgICAgICAgICAgICAgICRzU1drID0gc3ByaW50ZiggIiVkLyVkIiwgJGlCdW5zaSwgJGlCdW5ibyApOworICAgICAgICAgICAgICAgIGxhc3QgaWYgKCAkaVNXayA9PSAwICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICRzU1drOworICAgIH0KK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBNYWtlRSAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3ViIE1ha2VFIHsKKyAgICBteSAoICRzRm10LCAkaURhdGEgKSA9IEBfOworCisgICAgJHNGbXQgPX4gLygoWyMwXSopW1wuXT9bIzBdKikoW2VFXSkoW1wrXC1dWzAjXSspLzsKKyAgICBteSAoICRzS2FyaSwgJGlLZXRhLCAkc0UsICRzU2lzdSApID0gKCAkMSwgbGVuZ3RoKCQyKSwgJDMsICQ0ICk7CisgICAgJGlLZXRhID0gMSBpZiAoICRpS2V0YSA8PSAwICk7CisKKyAgICBteSAkaUxvZzEwID0gMDsKKyAgICAkaUxvZzEwID0gKCAkaURhdGEgPT0gMCApID8gMCA6ICggbG9nKCBhYnMoJGlEYXRhKSApIC8gbG9nKDEwKSApOworICAgICRpTG9nMTAgPSAoCisgICAgICAgIGludCggJGlMb2cxMCAvICRpS2V0YSApICsKKyAgICAgICAgICAoICggKCAkaUxvZzEwIC0gaW50KCAkaUxvZzEwIC8gJGlLZXRhICkgKSA8IDAgKSA/IC0xIDogMCApICkgKiAkaUtldGE7CisKKyAgICBteSAkc1VlID0gRXhjZWxGbXQoICRzS2FyaSwgJGlEYXRhICogKCAxMCoqKCAkaUxvZzEwICogLTEgKSApLCAwICk7CisgICAgbXkgJHNTaGl0YSA9IEV4Y2VsRm10KCAkc1Npc3UsICRpTG9nMTAsIDAgKTsKKyAgICByZXR1cm4gJHNVZSAuICRzRSAuICRzU2hpdGE7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTGVhcFllYXIgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBMZWFwWWVhciB7CisgICAgbXkgKCRpWWVhcikgPSBAXzsKKyAgICByZXR1cm4gMSBpZiAoICRpWWVhciA9PSAxOTAwICk7ICAgICNTcGVjaWFsIGZvciBFeGNlbAorICAgIHJldHVybiAoICggKCAkaVllYXIgJSA0ICkgPT0gMCApCisgICAgICAgICAgJiYgKCAoICRpWWVhciAlIDEwMCApIHx8ICggJGlZZWFyICUgNDAwICkgPT0gMCApICkKKyAgICAgID8gMQorICAgICAgOiAwOworfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExvY2FsdGltZUV4Y2VsIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdWIgTG9jYWx0aW1lRXhjZWwgeworICAgIG15ICggJGlTZWMsICRpTWluLCAkaUhvdXIsICRpRGF5LCAkaU1vbiwgJGlZZWFyLCAkaXdEYXksICRpTVNlYywgJGZsZzE5MDQgKQorICAgICAgPSBAXzsKKworICAgICMwLiBJbml0CisgICAgJGlNb24rKzsKKyAgICAkaVllYXIgKz0gMTkwMDsKKworICAgICMxLiBDYWxjIFRpbWUKKyAgICBteSAkaVRpbWU7CisgICAgJGlUaW1lID0gJGlIb3VyOworICAgICRpVGltZSAqPSA2MDsKKyAgICAkaVRpbWUgKz0gJGlNaW47CisgICAgJGlUaW1lICo9IDYwOworICAgICRpVGltZSArPSAkaVNlYzsKKyAgICAkaVRpbWUgKz0gJGlNU2VjIC8gMTAwMC4wIGlmICggZGVmaW5lZCgkaU1TZWMpICk7CisgICAgJGlUaW1lIC89IDg2NDAwLjA7ICAgICMzNjAwKjI0KDFkYXkgaW4gc2Vjb25kcykKKyAgICBteSAkaVk7CisgICAgbXkgJGlZRGF5czsKKworICAgICMyLiBDYWxjIERheXMKKyAgICBpZiAoJGZsZzE5MDQpIHsKKyAgICAgICAgJGlZID0gMTkwNDsKKyAgICAgICAgJGlUaW1lLS07ICAgICAgICAgI1N0YXJ0IGZyb20gSmFuIDFzdAorICAgICAgICAkaVlEYXlzID0gMzY2OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGlZICAgICA9IDE5MDA7CisgICAgICAgICRpWURheXMgPSAzNjY7ICAgICNJbiBFeGNlbCAxOTAwIGlzIGxlYXAgeWVhciAoVGhhdCdzIG5vdCBUUlVFISkKKyAgICB9CisgICAgd2hpbGUgKCAkaVkgPCAkaVllYXIgKSB7CisgICAgICAgICRpVGltZSArPSAkaVlEYXlzOworICAgICAgICAkaVkrKzsKKyAgICAgICAgJGlZRGF5cyA9ICggTGVhcFllYXIoJGlZKSApID8gMzY2IDogMzY1OworICAgIH0KKyAgICBmb3IgKCBteSAkaU0gPSAxIDsgJGlNIDwgJGlNb24gOyAkaU0rKyApIHsKKyAgICAgICAgaWYgKCAgICRpTSA9PSAxCisgICAgICAgICAgICB8fCAkaU0gPT0gMworICAgICAgICAgICAgfHwgJGlNID09IDUKKyAgICAgICAgICAgIHx8ICRpTSA9PSA3CisgICAgICAgICAgICB8fCAkaU0gPT0gOAorICAgICAgICAgICAgfHwgJGlNID09IDEwCisgICAgICAgICAgICB8fCAkaU0gPT0gMTIgKQorICAgICAgICB7CisgICAgICAgICAgICAkaVRpbWUgKz0gMzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU0gPT0gNCB8fCAkaU0gPT0gNiB8fCAkaU0gPT0gOSB8fCAkaU0gPT0gMTEgKSB7CisgICAgICAgICAgICAkaVRpbWUgKz0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU0gPT0gMiApIHsKKyAgICAgICAgICAgICRpVGltZSArPSAoIExlYXBZZWFyKCRpWWVhcikgKSA/IDI5IDogMjg7CisgICAgICAgIH0KKyAgICB9CisgICAgJGlUaW1lICs9ICRpRGF5OworICAgIHJldHVybiAkaVRpbWU7Cit9CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhjZWxMb2NhbHRpbWUgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N1YiBFeGNlbExvY2FsdGltZSB7CisKKyAgICBteSAoICRkT2JqLCAkZmxnMTkwNCApID0gQF87CisgICAgbXkgKCAkaVNlYywgJGlNaW4sICRpSG91ciwgJGlEYXksICRpTW9uLCAkaVllYXIsICRpd0RheSwgJGlNU2VjICk7CisgICAgbXkgKCAkaUR0LCAkaVRpbWUsICRpWURheXMgKTsKKworICAgICRpRHQgICA9IGludCgkZE9iaik7CisgICAgJGlUaW1lID0gJGRPYmogLSAkaUR0OworCisgICAgIzEuIENhbGMgRGF5cworICAgIGlmICgkZmxnMTkwNCkgeworICAgICAgICAkaVllYXIgPSAxOTA0OworICAgICAgICAkaUR0Kys7ICAgICNTdGFydCBmcm9tIEphbiAxc3QKKyAgICAgICAgJGlZRGF5cyA9IDM2NjsKKyAgICAgICAgJGl3RGF5ID0gKCAoICRpRHQgKyA0ICkgJSA3ICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkaVllYXIgID0gMTkwMDsKKyAgICAgICAgJGlZRGF5cyA9IDM2NjsgICAgI0luIEV4Y2VsIDE5MDAgaXMgbGVhcCB5ZWFyIChUaGF0J3Mgbm90IFRSVUUhKQorICAgICAgICAkaXdEYXkgPSAoICggJGlEdCArIDYgKSAlIDcgKTsKKyAgICB9CisgICAgd2hpbGUgKCAkaUR0ID4gJGlZRGF5cyApIHsKKyAgICAgICAgJGlEdCAtPSAkaVlEYXlzOworICAgICAgICAkaVllYXIrKzsKKyAgICAgICAgJGlZRGF5cyA9CisgICAgICAgICAgKCAgICAgICggKCAkaVllYXIgJSA0ICkgPT0gMCApCisgICAgICAgICAgICAgICYmICggKCAkaVllYXIgJSAxMDAgKSB8fCAoICRpWWVhciAlIDQwMCApID09IDAgKSApID8gMzY2IDogMzY1OworICAgIH0KKyAgICAkaVllYXIgLT0gMTkwMDsgICAgICAgIyBMb2NhbHRpbWUgeWVhciBpcyByZWxhdGl2ZSB0byAxOTAwLgorCisgICAgZm9yICggJGlNb24gPSAxIDsgJGlNb24gPCAxMiA7ICRpTW9uKysgKSB7CisgICAgICAgIG15ICRpTUQ7CisgICAgICAgIGlmICggICAkaU1vbiA9PSAxCisgICAgICAgICAgICB8fCAkaU1vbiA9PSAzCisgICAgICAgICAgICB8fCAkaU1vbiA9PSA1CisgICAgICAgICAgICB8fCAkaU1vbiA9PSA3CisgICAgICAgICAgICB8fCAkaU1vbiA9PSA4CisgICAgICAgICAgICB8fCAkaU1vbiA9PSAxMAorICAgICAgICAgICAgfHwgJGlNb24gPT0gMTIgKQorICAgICAgICB7CisgICAgICAgICAgICAkaU1EID0gMzE7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCAkaU1vbiA9PSA0IHx8ICRpTW9uID09IDYgfHwgJGlNb24gPT0gOSB8fCAkaU1vbiA9PSAxMSApIHsKKyAgICAgICAgICAgICRpTUQgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoICRpTW9uID09IDIgKSB7CisgICAgICAgICAgICAkaU1EID0gKCAoICRpWWVhciAlIDQgKSA9PSAwICkgPyAyOSA6IDI4OworICAgICAgICB9CisgICAgICAgIGxhc3QgaWYgKCAkaUR0IDw9ICRpTUQgKTsKKyAgICAgICAgJGlEdCAtPSAkaU1EOworICAgIH0KKworICAgICRpTW9uIC09IDE7ICAgICMgTG9jYWx0aW1lIG1vbnRoIGlzIDAgYmFzZWQuCisKKyAgICAjMi4gQ2FsYyBUaW1lCisgICAgJGlEYXkgPSAkaUR0OworICAgICRpVGltZSArPSAoIDAuMDAwNSAvIDg2NDAwLjAgKTsKKyAgICAkaVRpbWUgKj0gMjQuMDsKKyAgICAkaUhvdXIgPSBpbnQoJGlUaW1lKTsKKyAgICAkaVRpbWUgLT0gJGlIb3VyOworICAgICRpVGltZSAqPSA2MC4wOworICAgICRpTWluID0gaW50KCRpVGltZSk7CisgICAgJGlUaW1lIC09ICRpTWluOworICAgICRpVGltZSAqPSA2MC4wOworICAgICRpU2VjID0gaW50KCRpVGltZSk7CisgICAgJGlUaW1lIC09ICRpU2VjOworICAgICRpVGltZSAqPSAxMDAwLjA7CisgICAgJGlNU2VjID0gaW50KCRpVGltZSk7CisKKyAgICByZXR1cm4gKCAkaVNlYywgJGlNaW4sICRpSG91ciwgJGlEYXksICRpTW9uLCAkaVllYXIsICRpd0RheSwgJGlNU2VjICk7Cit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29sMmludCAoZm9yIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5KQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBjb252ZXJ0cyBhIGV4Y2VsIHJvdyBsZXR0ZXIgaW50byBhbiBpbnQgZm9yIHVzZSBpbiBhbiBhcnJheQorc3ViIGNvbDJpbnQgeworICAgIG15ICRyZXN1bHQgPSAwOworICAgIG15ICRzdHIgICAgPSBzaGlmdDsKKyAgICBteSAkaW5jciAgID0gMDsKKworICAgIGZvciAoIG15ICRpID0gbGVuZ3RoKCRzdHIpIDsgJGkgPiAwIDsgJGktLSApIHsKKyAgICAgICAgbXkgJGNoYXIgPSBzdWJzdHIoICRzdHIsICRpIC0gMSApOworICAgICAgICBteSAkY3VyciArPSBvcmQoIGxjKCRjaGFyKSApIC0gb3JkKCdhJykgKyAxOworICAgICAgICAkY3VyciAqPSAkaW5jciBpZiAoJGluY3IpOworICAgICAgICAkcmVzdWx0ICs9ICRjdXJyOworICAgICAgICAkaW5jciAgICs9IDI2OworICAgIH0KKworICAgICMgdGhpcyBpcyBvbmUgb3V0IGFzIHdlIHJhbmdlIDAuLngtMSBub3QgMS4ueAorICAgICRyZXN1bHQtLTsKKworICAgIHJldHVybiAkcmVzdWx0OworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGludDJjb2wgKGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIyBpbnQyY29sCisjIGNvbnZlcnQgYSBjb2x1bW4gbnVtYmVyIGludG8gY29sdW1uIGxldHRlcnMKKyMgQG5vdGUgdGhpcyBpcyBxdWl0ZSBhIGJydXRlIGZvcmNlIGNvYXJzZSBtZXRob2QKKyMgICBkb2VzIG5vdCBtYW5hZ2UgdmFsdWVzIG92ZXIgNzAxIChaWikKKyMgQGFyZyBudW1iZXIsIHRvIGNvbnZlcnQKKyMgQHJldHVybnMgc3RyaW5nLCBjb2x1bW4gbmFtZQorIworc3ViIGludDJjb2wgeworICAgIG15ICRvdXQgPSAiIjsKKyAgICBteSAkdmFsID0gc2hpZnQ7CisKKyAgICBkbyB7CisgICAgICAgICRvdXQgLj0gY2hyKCAoICR2YWwgJSAyNiApICsgb3JkKCdBJykgKTsKKyAgICAgICAgJHZhbCA9IGludCggJHZhbCAvIDI2ICkgLSAxOworICAgIH0gd2hpbGUgKCAkdmFsID49IDAgKTsKKworICAgIHJldHVybiBzY2FsYXIgcmV2ZXJzZSAkb3V0OworfQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNoZWV0UmVmIChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgc2hlZXRSZWYKKyMgY29udmVydCBhbiBleGNlbCBsZXR0ZXItbnVtYmVyIGFkZHJlc3MgaW50byBhIHVzZWZ1bCBhcnJheSBhZGRyZXNzCisjIEBub3RlIHRoYXQgYWxzbyBFeGNlbCB1c2VzIFgtWSBub3RhdGlvbiwgd2Ugbm9ybWFsbHkgdXNlIFktWCBpbiBhcnJheXMKKyMgQGFyZ3MgJHN0ciwgZXhjZWwgY29vcmQgZWcuIEEyCisjIEByZXR1cm5zIGFuIGFycmF5IC0gMiBlbGVtZW50cyAtIGNvbHVtbiwgcm93LCBvciB1bmRlZmluZWQKKyMKK3N1YiBzaGVldFJlZiB7CisgICAgbXkgJHN0ciA9IHNoaWZ0OworICAgIG15IEByZXQ7CisKKyAgICAkc3RyID1+IG0vXihcRCspKFxkKykkLzsKKworICAgIGlmICggJDEgJiYgJDIgKSB7CisgICAgICAgIHB1c2goIEByZXQsICQyIC0gMSwgY29sMmludCgkMSkgKTsKKyAgICB9CisgICAgaWYgKCAkcmV0WzBdIDwgMCApIHsKKyAgICAgICAgdW5kZWYgQHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gQHJldDsKK30KKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB4bHMyY3N2IChmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgeGxzMmNzdgorIyBjb252ZXJ0IGEgY2h1bmsgb2YgYW4gZXhjZWwgZmlsZSBpbnRvIGNzdiB0ZXh0IGNodW5rCisjIEBhcmdzICRwYXJhbSwgc2hlZXQtY29scm93OmNvbHJvdyAoMS1BMTpCMiBvciBBMTpCMiBmb3Igc2hlZXQgMQorIyBAYXJncyAkcm90YXRlLCAwIG9yIDEgZGVjaWRlcyBpZiBvdXRwdXQgc2hvdWxkIGJlIHJvdGF0ZWQgb3Igbm90CisjIEByZXR1cm5zIHN0cmluZyBjb250YWluaW5nIGEgY2h1bmsgb2YgY3N2CisjCitzdWIgeGxzMmNzdiB7CisgICAgbXkgKCAkZmlsZW5hbWUsICRyZWdpb25zLCAkcm90YXRlICkgPSBAXzsKKyAgICBteSAkc2hlZXQgPSAwOworCisgICAgIyBXZSBuZWVkIFRleHQ6OkNTVl9YUyBmb3IgcHJvcGVyIENTViBoYW5kbGluZy4KKyAgICByZXF1aXJlIFRleHQ6OkNTVl9YUzsKKworICAgICMgZXh0cmFjdCBhbnkgc2hlZXQgbnVtYmVyIGZyb20gdGhlIHJlZ2lvbiBzdHJpbmcKKyAgICAkcmVnaW9ucyA9fiBtL14oXGQrKS0oLiopLzsKKworICAgIGlmICgkMikgeworICAgICAgICAkc2hlZXQgICA9ICQxIC0gMTsKKyAgICAgICAgJHJlZ2lvbnMgPSAkMjsKKyAgICB9CisKKyAgICAjIG5vdyBleHRyYWN0IHRoZSBzdGFydCBhbmQgZW5kIHJlZ2lvbnMKKyAgICAkcmVnaW9ucyA9fiBtLyguKik6KC4qKS87CisKKyAgICBpZiAoICEkMSB8fCAhJDIgKSB7CisgICAgICAgIHByaW50IFNUREVSUiAiQmFkIFBhcmFtcyI7CisgICAgICAgIHJldHVybiAiIjsKKyAgICB9CisKKyAgICBteSBAc3RhcnQgPSBzaGVldFJlZigkMSk7CisgICAgbXkgQGVuZCAgID0gc2hlZXRSZWYoJDIpOworICAgIGlmICggIUBzdGFydCApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICJCYWQgY29vcmluYXRlcyAtICQxIjsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBpZiAoICFAZW5kICkgeworICAgICAgICBwcmludCBTVERFUlIgIkJhZCBjb29yaW5hdGVzIC0gJDIiOworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgaWYgKCAkc3RhcnRbMV0gPiAkZW5kWzFdICkgeworICAgICAgICBwcmludCBTVERFUlIgIkJhZCBDT0xVTU4gb3JkZXJpbmdcbiI7CisgICAgICAgIHByaW50IFNUREVSUiAiU3RhcnQgY29sdW1uICIgLiBpbnQyY29sKCAkc3RhcnRbMV0gKTsKKyAgICAgICAgcHJpbnQgU1RERVJSICIgYWZ0ZXIgZW5kIGNvbHVtbiAiIC4gaW50MmNvbCggJGVuZFsxXSApIC4gIlxuIjsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBpZiAoICRzdGFydFswXSA+ICRlbmRbMF0gKSB7CisgICAgICAgIHByaW50IFNUREVSUiAiQmFkIFJPVyBvcmRlcmluZ1xuIjsKKyAgICAgICAgcHJpbnQgU1RERVJSICJTdGFydCByb3cgIiAuICggJHN0YXJ0WzBdICsgMSApOworICAgICAgICBwcmludCBTVERFUlIgIiBhZnRlciBlbmQgcm93ICIgLiAoICRlbmRbMF0gKyAxICkgLiAiXG4iOworICAgICAgICBleGl0OworICAgIH0KKworICAgICMgc3RhcnQgdGhlIGV4Y2VsIG9iamVjdCBub3cKKyAgICBteSAkb0V4Y2VsID0gbmV3IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOworICAgIG15ICRvQm9vayAgPSAkb0V4Y2VsLT5QYXJzZSgkZmlsZW5hbWUpOworCisgICAgIyBvcGVuIHRoZSBzaGVldAorICAgIG15ICRvV2tTID0gJG9Cb29rLT57V29ya3NoZWV0fVskc2hlZXRdOworCisgICAgIyBub3cgY2hlY2sgdGhhdCB0aGUgcmVnaW9uIGV4aXN0cyBpbiB0aGUgZmlsZQorICAgICMgaWYgbm90IHRydW5jYXRlIHRvIHRoZSBwb3NzaWJsZSByZWdpb24KKyAgICAjIG91dHB1dCBhIHdhcm5pbmcgbXNnCisgICAgaWYgKCAkc3RhcnRbMV0gPCAkb1drUy0+e01pbkNvbH0gKSB7CisgICAgICAgIHByaW50IFNUREVSUiBpbnQyY29sKCAkc3RhcnRbMV0gKQorICAgICAgICAgIC4gIiA8IG1pbiBjb2wgIgorICAgICAgICAgIC4gaW50MmNvbCggJG9Xa1MtPntNaW5Db2x9ICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkc3RhcnRbMV0gPSAkb1drUy0+e01pbkNvbH07CisgICAgfQorICAgIGlmICggJGVuZFsxXSA+ICRvV2tTLT57TWF4Q29sfSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSIGludDJjb2woICRlbmRbMV0gKQorICAgICAgICAgIC4gIiA+IG1heCBjb2wgIgorICAgICAgICAgIC4gaW50MmNvbCggJG9Xa1MtPntNYXhDb2x9ICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkZW5kWzFdID0gJG9Xa1MtPntNYXhDb2x9OworICAgIH0KKyAgICBpZiAoICRzdGFydFswXSA8ICRvV2tTLT57TWluUm93fSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICIiCisgICAgICAgICAgLiAoICRzdGFydFswXSArIDEgKQorICAgICAgICAgIC4gIiA8IG1pbiByb3cgIgorICAgICAgICAgIC4gKCAkb1drUy0+e01pblJvd30gKyAxICkKKyAgICAgICAgICAuICIgUmVzZXR0aW5nXG4iOworICAgICAgICAkc3RhcnRbMF0gPSAkb1drUy0+e01pbkNvbH07CisgICAgfQorICAgIGlmICggJGVuZFswXSA+ICRvV2tTLT57TWF4Um93fSApIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICIiCisgICAgICAgICAgLiAoICRlbmRbMF0gKyAxICkKKyAgICAgICAgICAuICIgPiBtYXggcm93ICIKKyAgICAgICAgICAuICggJG9Xa1MtPntNYXhSb3d9ICsgMSApCisgICAgICAgICAgLiAiIFJlc2V0dGluZ1xuIjsKKyAgICAgICAgJGVuZFswXSA9ICRvV2tTLT57TWF4Um93fTsKKworICAgIH0KKworICAgIG15ICR4MSA9ICRzdGFydFsxXTsKKyAgICBteSAkeTEgPSAkc3RhcnRbMF07CisgICAgbXkgJHgyID0gJGVuZFsxXTsKKyAgICBteSAkeTIgPSAkZW5kWzBdOworCisgICAgbXkgQGNlbGxfZGF0YTsKKyAgICBteSAkcm93ID0gMDsKKworICAgIGlmICggISRyb3RhdGUgKSB7CisgICAgICAgIGZvciAoIG15ICR5ID0gJHkxIDsgJHkgPD0gJHkyIDsgJHkrKyApIHsKKyAgICAgICAgICAgIGZvciAoIG15ICR4ID0gJHgxIDsgJHggPD0gJHgyIDsgJHgrKyApIHsKKyAgICAgICAgICAgICAgICBteSAkY2VsbCA9ICRvV2tTLT57Q2VsbHN9WyR5XVskeF07CisKKyAgICAgICAgICAgICAgICBteSAkdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRjZWxsICkgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWUgLj0gJGNlbGwtPnZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAnJzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdXNoIEB7ICRjZWxsX2RhdGFbJHJvd10gfSwgJHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgJHJvdysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKCBteSAkeCA9ICR4MSA7ICR4IDw9ICR4MiA7ICR4KysgKSB7CisgICAgICAgICAgICBmb3IgKCBteSAkeSA9ICR5MSA7ICR5IDw9ICR5MiA7ICR5KysgKSB7CisgICAgICAgICAgICAgICAgbXkgJGNlbGwgPSAkb1drUy0+e0NlbGxzfVskeV1bJHhdOworCisgICAgICAgICAgICAgICAgbXkgJHZhbHVlOworICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkY2VsbCApIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlIC49ICRjZWxsLT52YWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlID0gJyc7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHVzaCBAeyAkY2VsbF9kYXRhWyRyb3ddIH0sICR2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICRyb3crKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ3JlYXRlIHRoZSBDU1Ygb3V0cHV0IHN0cmluZy4KKyAgICBteSAkY3N2ID0gVGV4dDo6Q1NWX1hTLT5uZXcoIHsgYmluYXJ5ID0+IDEsIGVvbCA9PiAkLyB9ICk7CisgICAgbXkgJG91dHB1dCA9ICIiOworCisgICAgZm9yIG15ICRyb3cgKEBjZWxsX2RhdGEpIHsKKyAgICAgICAgJGNzdi0+Y29tYmluZShAJHJvdyk7CisgICAgICAgICRvdXRwdXQgLj0gJGNzdi0+c3RyaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJuICRvdXRwdXQ7Cit9CisKKzE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSAtIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgcXcoRXhjZWxGbXQgRXhjZWxMb2NhbHRpbWUgTG9jYWx0aW1lRXhjZWwpOworCisgICAgIyBDb252ZXJ0IGxvY2FsdGltZSB0byBFeGNlbCB0aW1lCisgICAgbXkgJGRhdGV0aW1lID0gTG9jYWx0aW1lRXhjZWwoMTEsIDEwLCAxMiwgMjMsIDIsIDY0KTsgIyAxOTY0LTMtMjMgMTI6MTA6MTEKKworICAgIHByaW50ICRkYXRldGltZSwgIlxuIjsgIyAyMzQ1OS41MDcwNzE3NTkzIChFeGNlbCBkYXRlL3RpbWUgZm9ybWF0KQorCisgICAgIyBDb252ZXJ0IEV4Y2VsIFRpbWUgdG8gbG9jYWx0aW1lCisgICAgbXkgQHRpbWUgPSBFeGNlbExvY2FsdGltZSgkZGF0ZXRpbWUpOworICAgIHByaW50IGpvaW4oIjoiLCBAdGltZSksICJcbiI7ICAgIyAxMToxMDoxMjoyMzoyOjY0OjE6MAorCisgICAgIyBGb3JtYXR0aW5nCisgICAgcHJpbnQgRXhjZWxGbXQoJ3l5eXktbW0tZGQnLCAkZGF0ZXRpbWUpLCAiXG4iOyAjIDE5NjQtMy0yMworICAgIHByaW50IEV4Y2VsRm10KCdtLWQteXknLCAgICAgJGRhdGV0aW1lKSwgIlxuIjsgIyAzLTIzLTY0CisgICAgcHJpbnQgRXhjZWxGbXQoJyMsIyMwJywgICAgICAkZGF0ZXRpbWUpLCAiXG4iOyAjIDIzLDQ2MAorICAgIHByaW50IEV4Y2VsRm10KCcjLCMjMC4wMCcsICAgJGRhdGV0aW1lKSwgIlxuIjsgIyAyMyw0NTkuNTEKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCBQYXJzZUV4Y2VsIGFuZCBFeGNlbCBkYXRhLgorCis9aGVhZDEgRnVuY3Rpb25zCisKK0M8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHk+IGNhbiBleHBvcnQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CisKKyAgICBFeGNlbEZtdAorICAgIEV4Y2VsTG9jYWx0aW1lCisgICAgTG9jYWx0aW1lRXhjZWwKKyAgICBjb2wyaW50CisgICAgaW50MmNvbAorICAgIHNoZWV0UmVmCisgICAgeGxzMmNzdgorCitUaGVzZSBmdW5jdGlvbnMgbXVzdCBiZSBpbXBvcnRlZCBpbXBsaWNpdGx5OgorCisgICAgIyBKdXN0IG9uZSBmdW5jdGlvbi4KKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlV0aWxpdHkgJ2NvbDJpbnQnOworCisgICAgIyBNb3JlIHRoYW4gb25lLgorICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6VXRpbGl0eSBxdyhFeGNlbEZtdCBFeGNlbExvY2FsdGltZSBMb2NhbHRpbWVFeGNlbCk7CisKKworPWhlYWQyIEV4Y2VsRm10KCRmb3JtYXRfc3RyaW5nLCAkbnVtYmVyLCAkaXNfMTkwNCkKKworRXhjZWwgc3RvcmVzIGRhdGEgc3VjaCBhcyBkYXRlcyBhbmQgY3VycmVuY3kgdmFsdWVzIGFzIG51bWJlcnMuIFRoZSB3YXkgdGhlc2UgbnVtYmVycyBhcmUgZGlzcGxheWVkIGlzIGNvbnRyb2xsZWQgYnkgdGhlIG51bWJlciBmb3JtYXQgc3RyaW5nIGZvciB0aGUgY2VsbC4gRm9yIGV4YW1wbGUgYSBjZWxsIHdpdGggYSBudW1iZXIgZm9ybWF0IG9mIEM8JyQjLCMjMC4wMCc+IGZvciBjdXJyZW5jeSBhbmQgYSB2YWx1ZSBvZiAxMjM0LjU2NyB3b3VsZCBiZSBkaXNwbGF5ZWQgYXMgZm9sbG93czoKKworICAgICckIywjIzAuMDAnICsgMTIzNC41NjcgPSAnJDEsMjM0LjU3Jy4KKworVGhlIEM8RXhjZWxGbXQoKT4gZnVuY3Rpb24gdHJpZXMgdG8gZW11bGF0ZSB0aGlzIGZvcm1hdHRpbmcgc28gdGhhdCB0aGUgdXNlciBjYW4gY29udmVydCByYXcgbnVtYmVycyByZXR1cm5lZCBieSBDPFNwcmVhZHNoZWV0OjpQYXJzZUV4ZWw+IHRvIGEgZGVzaXJlZCBmb3JtYXQuIEZvciBleGFtcGxlOgorCisgICAgcHJpbnQgRXhjZWxGbXQoJyQjLCMjMC4wMCcsIDEyMzQuNTY3KTsgIyAkMSwyMzQuNTcuCisKK1RoZSBzeW50YXggb2YgdGhlIGZ1bmN0aW9uIGlzOgorCisgICAgbXkgJHRleHQgPSBFeGNlbEZtdCgkZm9ybWF0X3N0cmluZywgJG51bWJlciwgJGlzXzE5MDQpOworCitXaGVyZSBDPCRmb3JtYXRfc3RyaW5nPiBpcyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHN0cmluZywgQzwkbnVtYmVyPiBpcyBhIHJlYWwgb3IgaW50ZWdlciBudW1iZXIgYW5kIEM8aXNfMTkwND4gaXMgYW4gb3B0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGRhdGVzIHNob3VsZCB1c2UgRXhjZWwncyAxOTA0IGVwb2NoIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTkwMCBlcG9jaC4KKworQzxFeGNlbEZtdCgpPiBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSB0byBjb252ZXJ0IG51bWJlcnMgcmV0dXJuZWQgYnkgdGhlIEM8Q2VsbDo6dW5mb3JtYXR0ZWQoKT4gbWV0aG9kIHRvIHRoZSBmb3JtYXR0ZWQgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIEM8Q2VsbDo6dmFsdWUoKT4gbWV0aG9kOgorCisKKyAgICBteSAkY2VsbCA9ICR3b3Jrc2hlZXQtPmdldF9jZWxsKCAwLCAwICk7CisKKyAgICBwcmludCAkY2VsbC0+dW5mb3JtYXR0ZWQoKSwgIlxuIjsgIyAxMjM0LjU2NworICAgIHByaW50ICRjZWxsLT52YWx1ZSgpLCAgICAgICAiXG4iOyAjICQxLDIzNC41NworCitUaGUgbW9zdCBjb21tb24gdXNhZ2UgZm9yIEM8RXhjZWxGbXQ+IGlzIHRvIGNvbnZlcnQgbnVtYmVycyB0byBkYXRlcy4gRGF0ZXMgYW5kIHRpbWVzIGluIEV4Y2VsIGFyZSByZXByZXNlbnRlZCBieSByZWFsIG51bWJlcnMsIGZvciBleGFtcGxlICIxIEphbiAyMDAxIDEyOjMwIFBNIiBpcyByZXByZXNlbnRlZCBieSB0aGUgbnVtYmVyIDM2ODkyLjUyMS4gVGhlIGludGVnZXIgcGFydCBvZiB0aGUgbnVtYmVyIHN0b3JlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoIGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZGF5LiBCeSBhcHBseWluZyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHRoZSBudW1iZXIgaXMgY29udmVydGVkIHRvIHRoZSBkZXNpcmVkIHN0cmluZyByZXByZXNlbnRhdGlvbjoKKworICAgIHByaW50IEV4Y2VsRm10KCdkIG1tbSB5eXl5IGg6bW0gQU0vUE0nLCAzNjg5Mi41MjEpOyAgIyAxIEphbiAyMDAxIDEyOjMwIFBNCisKK0M8JGlzXzE5MDQ+IGlzIGFuIG9wdGlvbmFsIGZsYWcgdG8gaW5kaWNhdGUgdGhhdCBkYXRlcyBzaG91bGQgdXNlIEV4Y2VsJ3MgMTkwNCBlcG9jaCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDE5MDAgZXBvY2guIEV4Y2VsIGZvciBXaW5kb3dzIGdlbmVyYWxseSB1c2VzIDE5MDAgYW5kIEV4Y2VsIGZvciBNYWMgT1MgdXNlcyAxOTA0LiBUaGUgQzwkaXMxOTA0PiBmbGFnIGlzbid0IHJlcXVpcmVkIHZlcnkgb2Z0ZW4gYnkgYSBjYXN1YWwgdXNlciBhbmQgY2FuIHVzdWFsbHkgYmUgaWdub3JlZC4KKworCis9aGVhZDIgRXhjZWxMb2NhbHRpbWUoJGV4Y2VsX2RhdGV0aW1lLCAkaXNfMTkwNCkKKworVGhlIEM8RXhjZWxMb2NhbHRpbWUoKT4gZnVuY3Rpb24gY29udmVydHMgZnJvbSBhbiBFeGNlbCBkYXRlL3RpbWUgbnVtYmVyIHRvIGEgQzxsb2NhbHRpbWUoKT4tbGlrZSBhcnJheSBvZiB2YWx1ZXM6CisKKyAgICAgICAgbXkgQHRpbWUgPSBFeGNlbExvY2FsdGltZSgkZXhjZWxfZGF0ZXRpbWUpOworCisgICAgICAgICMgICAgMCAgICAgMSAgICAgMiAgICAgIDMgICAgIDQgICAgICAgNSAgICAgIDYgICAgICA3CisgICAgICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIsICR3ZGF5LCAkbXNlYyApID0gQHRpbWU7CisKK1RoZSBhcnJheSBlbGVtZW50cyBmcm9tIEM8KDAgLi4gNik+IGFyZSB0aGUgc2FtZSBhcyBQZXJsJ3MgQzxsb2NhbHRpbWUoKT4uIFRoZSBsYXN0IGVsZW1lbnQgQzwkbXNlYz4gaXMgbWlsbGlzZWNvbmRzLiBJbiBwYXJ0aWN1bGFyIGl0IHNob3VsZCBiZSBub3RlZCB0aGF0LCBpbiBjb21tb24gd2l0aCBDPGxvY2FsdGltZSgpPiwgdGhlIG1vbnRoIGlzIHplcm8gaW5kZXhlZCBhbmQgdGhlIHllYXIgaXMgdGhlIG51bWJlciBvZiB5ZWFycyBzaW5jZSAxOTAwLiBUaGlzIG1lYW5zIHRoYXQgeW91IHdpbGwgdXN1YWxseSBuZWVkIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgJG1vbnRoKys7CisgICAgICAgICR5ZWFyICs9IDE5MDA7CisKK1NlZSBhbHNvIFBlcmwncyBkb2N1bWVudGF0aW9uIGZvciBMPGxvY2FsdGltZSgpfHBlcmxmdW5jPjoKKworVGhlIEM8JGlzXzE5MDQ+IGZsYWcgaXMgYW4gb3B0aW9uYWwuIEl0IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBkYXRlcyBzaG91bGQgdXNlIEV4Y2VsJ3MgMTkwNCBlcG9jaCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDE5MDAgZXBvY2guCisKKz1oZWFkMiBMb2NhbHRpbWVFeGNlbCgkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjLCAkaXNfMTkwNCkKKworVGhlIEM8TG9jYWx0aW1lRXhjZWwoKT4gZnVuY3Rpb24gY29udmVydHMgZnJvbSBhIEM8bG9jYWx0aW1lKCk+LWxpa2UgYXJyYXkgb2YgdmFsdWVzIHRvIGFuIEV4Y2VsIGRhdGUvdGltZSBudW1iZXI6CisKKyAgICAkZXhjZWxfZGF0ZXRpbWUgPSBMb2NhbHRpbWVFeGNlbCgkc2VjLCAkbWluLCAkaG91ciwgJGRheSwgJG1vbnRoLCAkeWVhciwgJHdkYXksICRtc2VjKTsKKworVGhlIGFycmF5IGVsZW1lbnRzIGZyb20gQzwoMCAuLiA2KT4gYXJlIHRoZSBzYW1lIGFzIFBlcmwncyBDPGxvY2FsdGltZSgpPi4gVGhlIGxhc3QgZWxlbWVudCBDPCRtc2VjPiBpcyBtaWxsaXNlY29uZHMuIEluIHBhcnRpY3VsYXIgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQsIGluIGNvbW1vbiB3aXRoIEM8bG9jYWx0aW1lKCk+LCB0aGUgbW9udGggaXMgemVybyBpbmRleGVkIGFuZCB0aGUgeWVhciBpcyB0aGUgbnVtYmVyIG9mIHllYXJzIHNpbmNlIDE5MDAuIFNlZSBhbHNvIFBlcmwncyBkb2N1bWVudGF0aW9uIGZvciBMPGxvY2FsdGltZSgpfHBlcmxmdW5jPjoKKworVGhlIEM8JHdkYXk+IGFuZCBDPCRtc2VjPiBlbGVtZW50cyBhcmUgdXN1YWxseSBvcHRpb25hbC4gVGhpcyB0aW1lIGVsZW1lbnRzIGNhbiBhbHNvIGJlIHplcm9lZCBpZiB0aGV5IGFyZW4ndCBvZiBpbnRlcmVzdDoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWMsIG1pbiwgaG91ciwgZGF5LCBtb250aCwgeWVhcgorICAgICRleGNlbF9kYXRldGltZSA9IExvY2FsdGltZUV4Y2VsKCAwLCAgIDAsICAgMCwgICAgMSwgICAwLCAgICAgMTAxICk7CisKKyAgICBwcmludCBFeGNlbEZtdCgnZCBtbW0geXl5eScsICRleGNlbF9kYXRldGltZSk7ICAjIDEgSmFuIDIwMDEKKworVGhlIEM8JGlzXzE5MDQ+IGZsYWcgaXMgYWxzbyBvcHRpb25hbC4gSXQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGRhdGVzIHNob3VsZCB1c2UgRXhjZWwncyAxOTA0IGVwb2NoIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTkwMCBlcG9jaC4KKworCis9aGVhZDIgY29sMmludCgkY29sdW1uKQorCitUaGUgQzxjb2wyaW50KCk+IGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEV4Y2VsIGNvbHVtbiBsZXR0ZXIgdG8gYW4gemVyby1pbmRleGVkIGNvbHVtbiBudW1iZXI6CisKKyAgICBwcmludCBjb2wyaW50KCdBJyk7ICAjIDAKKyAgICBwcmludCBjb2wyaW50KCdBQScpOyAjIDI2CisKK1RoaXMgZnVuY3Rpb24gd2FzIGNvbnRyaWJ1dGVkIGJ5IEtldmluIE11bGhvbGxhbmQuCisKKworPWhlYWQyIGludDJjb2woJGNvbHVtbl9udW1iZXIpCisKK1RoZSBDPGludDJjb2woKT4gZnVuY3Rpb24gY29udmVydHMgYW4gemVyby1pbmRleGVkIEV4Y2VsIGNvbHVtbiBudW1iZXIgdG8gYSBjb2x1bW4gbGV0dGVyOgorCisgICAgcHJpbnQgaW50MmNvbCgwKTsgICMgJ0EnCisgICAgcHJpbnQgaW50MmNvbCgyNik7ICMgJ0FBJworCitUaGlzIGZ1bmN0aW9uIHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kLgorCisKKz1oZWFkMiBzaGVldFJlZigkY2VsbF9zdHJpbmcpCisKK1RoZSBDPHNoZWV0UmVmKCk+IGZ1bmN0aW9uIGNvbnZlcnRzIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluICdBMScgbm90YXRpb24gdG8gYSB6ZXJvLWluZGV4ZWQgQzwocm93LCBjb2wpPiBwYWlyLgorCisgICAgbXkgKCRyb3csICRjb2wpID0gc2hlZXRSZWYoJ0ExJyk7ICMgKCAwLCAwICkKKyAgICBteSAoJHJvdywgJGNvbCkgPSBzaGVldFJlZignQzInKTsgIyAoIDEsIDIgKQorCitUaGlzIGZ1bmN0aW9uIHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kLgorCisKKz1oZWFkMiB4bHMyY3N2KCRmaWxlbmFtZSwgJHJlZ2lvbiwgJHJvdGF0ZSkKKworVGhlIEM8eGxzMmNzdigpPiBmdW5jdGlvbiBjb252ZXJ0cyBhIHNlY3Rpb24gb2YgYW4gRXhjZWwgZmlsZSBpbnRvIGEgQ1NWIHRleHQgc3RyaW5nLgorCisgICAgJGNzdl90ZXh0ID0geGxzMmNzdigkZmlsZW5hbWUsICRyZWdpb24sICRyb3RhdGUpOworCitXaGVyZToKKworICAgICRyZWdpb24gPSAic2hlZXQtY29scm93OmNvbHJvdyIKKyAgICBGb3IgZXhhbXBsZSAnMS1BMTpCMicgbWVhbnMgJ0ExOkIyJyBmb3Igc2hlZXQgMS4KKworICAgIGFuZAorCisgICAgJHJvdGF0ZSAgPSAwIG9yIDEgKG91dHB1dCBpcyByb3RhdGVkL3RyYW5zcG9zZWQgb3Igbm90KQorCitUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIEM8VGV4dDo6Q1NWX1hTPiB0byBiZSBpbnN0YWxsZWQuIEl0IHdhcyBjb250cmlidXRlZCBieSBLZXZpbiBNdWxob2xsYW5kIGFsb25nIHdpdGggdGhlIEM8eGxzMmNzdj4gc2NyaXB0IGluIHRoZSBDPHNhbXBsZT4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK1NlZSBhbHNvIHRoZSBmb2xsb3dpbmcgeGxzMmNzdiB1dGlsaXRpZXM6IEtlbiBQcm93cycgQzx4bHMyY3N2PjogaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+a2VuL3hsczJjc3Yvc2NyaXB0L3hsczJjc3YgYW5kIEguTWVyaWpuIEJyYW5kJ3MgQzx4bHMyY3N2PiAod2hpY2ggaXMgcGFydCBvZiBTcHJlYWRzaGVldDo6UmVhZCk6IGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvU3ByZWFkc2hlZXQtUmVhZC8KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya2Jvb2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1dvcmtib29rLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTAzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9QYXJzZUV4Y2VsL1dvcmtib29rLnBtCkBAIC0wLDAgKzEsMjk3IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vazsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6V29ya2Jvb2sgLSBBIGNsYXNzIGZvciBXb3JrYm9va3MuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLgorIworc3ViIG5ldyB7CisgICAgbXkgKCRjbGFzcykgPSBAXzsKKyAgICBteSAkc2VsZiA9IHt9OworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd29ya3NoZWV0KCkKKyMKKyMgVGhpcyBtZXRob2QgcmV0dXJucyBhIHNpbmdsZSBXb3Jrc2hlZXQgb2JqZWN0IHVzaW5nIGVpdGhlciBpdHMgbmFtZSBvciBpbmRleC4KKyMKK3N1YiB3b3Jrc2hlZXQgeworICAgIG15ICggJG9Cb29rLCAkc05hbWUgKSA9IEBfOworICAgIG15ICRvV2tTOworICAgIGZvcmVhY2ggJG9Xa1MgKCBAeyAkb0Jvb2stPntXb3Jrc2hlZXR9IH0gKSB7CisgICAgICAgIHJldHVybiAkb1drUyBpZiAoICRvV2tTLT57TmFtZX0gZXEgJHNOYW1lICk7CisgICAgfQorICAgIGlmICggJHNOYW1lID1+IC9eXGQrJC8gKSB7CisgICAgICAgIHJldHVybiAkb0Jvb2stPntXb3Jrc2hlZXR9LT5bJHNOYW1lXTsKKyAgICB9CisgICAgcmV0dXJuIHVuZGVmOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdvcmtzaGVldHMoKQorIworIyBSZXR1cm5zIGFuIGFycmF5IG9mV29ya3NoZWV0IG9iamVjdHMuCisjCitzdWIgd29ya3NoZWV0cyB7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiBAeyAkc2VsZi0+e1dvcmtzaGVldH0gfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3b3Jrc2hlZXRfY291bnQoKQorIworIyBSZXR1cm5zIHRoZSBudW1iZXIgV29rc2hlZXQgb2JqZWN0cyBpbiB0aGUgV29ya2Jvb2suCisjCitzdWIgd29ya3NoZWV0X2NvdW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntTaGVldENvdW50fTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZmlsZW5hbWUoKQorIworIyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBFeGNlbCBmaWxlIG9mIEM8dW5kZWY+IGlmIHRoZSBkYXRhIHdhcyByZWFkIGZyb20gYSBmaWxlaGFuZGxlIHJhdGhlciB0aGFuIGEgZmlsZS4KKyMKK3N1YiBnZXRfZmlsZW5hbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0ZpbGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9hcmVhcygpCisjCisjIFJldHVybnMgYW4gYXJyYXkgcmVmIG9mIHByaW50IGFyZWFzLgorIworIyBUT0RPLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBXb3Jrc2hlZXQgbWV0aG9kLgorIworc3ViIGdldF9wcmludF9hcmVhcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57UHJpbnRBcmVhfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfcHJpbnRfdGl0bGVzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgcHJpbnQgdGl0bGUgaGFzaCByZWZzLgorIworIyBUT0RPLiBUaGlzIHNob3VsZCByZWFsbHkgYmUgYSBXb3Jrc2hlZXQgbWV0aG9kLgorIworc3ViIGdldF9wcmludF90aXRsZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ByaW50VGl0bGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHVzaW5nXzE5MDRfZGF0ZSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgRXhjZWwgZmlsZSBpcyB1c2luZyB0aGUgMTkwNCBkYXRlIGVwb2NoLgorIworc3ViIHVzaW5nXzE5MDRfZGF0ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RmxnMTkwNH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGFyc2VBYm9ydCgpCisjCisjIFRvZG8KKyMKK3N1YiBQYXJzZUFib3J0IHsKKyAgICBteSAoICRzZWxmLCAkdmFsICkgPSBAXzsKKyAgICAkc2VsZi0+e19QYXJzZUFib3J0fSA9ICR2YWw7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGFyc2UoKS4gRGVwcmVjYXRlZC4KKyMKKyMgU3ludGFjdGljIHdyYXBwZXIgYXJvdW5kIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpQYXJzZSgpLgorIyBUaGlzIG1ldGhvZCBpcyAqZGVwcmVjYXRlZCogc2luY2UgaXQgZG9lc24ndCBjb25mb3JtIHRvIHRoZSB0aGUgY3VycmVudAorIyBlcnJvciBoYW5kbGluZyBpbiB0aGUgUzo6UEUgUGFyc2UoKSBtZXRob2QuCisjCitzdWIgUGFyc2UgeworCisgICAgbXkgKCAkY2xhc3MsICRzb3VyY2UsICRmb3JtYXR0ZXIgKSA9IEBfOworICAgIG15ICRleGNlbCA9IFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsLT5uZXcoKTsKKyAgICBteSAkd29ya2Jvb2sgPSAkZXhjZWwtPlBhcnNlKCAkc291cmNlLCAkZm9ybWF0dGVyICk7CisgICAgJHdvcmtib29rLT57X0V4Y2VsfSA9ICRleGNlbDsKKyAgICByZXR1cm4gJHdvcmtib29rOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE1hcHBpbmcgYmV0d2VlbiBsZWdhY3kgbWV0aG9kIG5hbWVzIGFuZCBuZXcgbmFtZXMuCisjCit7CisgICAgbm8gd2FybmluZ3M7ICAgICMgSWdub3JlIHdhcm5pbmdzIGFib3V0IHZhcmlhYmxlcyB1c2VkIG9ubHkgb25jZS4KKyAgICAqV29ya3NoZWV0ID0gKndvcmtzaGVldDsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3JrYm9vayAtIEEgY2xhc3MgZm9yIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgTDxTcHJlYWRzaGVldDo6UGFyc2VFeGNlbD4uCisKKworPWhlYWQxIE1ldGhvZHMKKworVGhlIGZvbGxvd2luZyBXb3JrYm9vayBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldHMoKQorICAgICR3b3JrYm9vay0+d29ya3NoZWV0KCkKKyAgICAkd29ya2Jvb2stPndvcmtzaGVldF9jb3VudCgpCisgICAgJHdvcmtib29rLT5nZXRfZmlsZW5hbWUoKQorICAgICR3b3JrYm9vay0+Z2V0X3ByaW50X2FyZWFzKCkKKyAgICAkd29ya2Jvb2stPmdldF9wcmludF90aXRsZXMoKQorICAgICR3b3JrYm9vay0+dXNpbmdfMTkwNF9kYXRlKCkKKworCis9aGVhZDIgd29ya3NoZWV0cygpCisKK1RoZSBDPHdvcmtzaGVldHMoKT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXkgb2YgV29ya3NoZWV0IG9iamVjdHMuIFRoaXMgd2FzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvciBteSAkd29ya3NoZWV0ICggJHdvcmtib29rLT53b3Jrc2hlZXRzKCkgKSB7CisgICAgICAgIC4uLgorICAgIH0KKworCis9aGVhZDIgd29ya3NoZWV0KCkKKworVGhlIEM8d29ya3NoZWV0KCk+IG1ldGhvZCByZXR1cm5zIGEgc2luZ2xlIEM8V29ya3NoZWV0PiBvYmplY3QgdXNpbmcgZWl0aGVyIGl0cyBuYW1lIG9yIGluZGV4OgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+d29ya3NoZWV0KCdTaGVldDEnKTsKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT53b3Jrc2hlZXQoMCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHNoZWV0IG5hbWUgb3IgaW5kZXggZG9lc24ndCBleGlzdC4KKworCis9aGVhZDIgd29ya3NoZWV0X2NvdW50KCkKKworVGhlIEM8d29ya3NoZWV0X2NvdW50KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgV29rc2hlZXQgb2JqZWN0cyBpbiB0aGUgV29ya2Jvb2suCisKKyAgICBteSAkd29ya3NoZWV0X2NvdW50ID0gJHdvcmtib29rLT53b3Jrc2hlZXRfY291bnQoKTsKKworCis9aGVhZDIgZ2V0X2ZpbGVuYW1lKCkKKworVGhlIEM8Z2V0X2ZpbGVuYW1lKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBFeGNlbCBmaWxlIG9mIEM8dW5kZWY+IGlmIHRoZSBkYXRhIHdhcyByZWFkIGZyb20gYSBmaWxlaGFuZGxlIHJhdGhlciB0aGFuIGEgZmlsZS4KKworICAgIG15ICRmaWxlbmFtZSA9ICR3b3JrYm9vay0+Z2V0X2ZpbGVuYW1lKCk7CisKKworPWhlYWQyIGdldF9wcmludF9hcmVhcygpCisKK1RoZSBDPGdldF9wcmludF9hcmVhcygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgcHJpbnQgYXJlYXMuCisKKyAgICBteSAkcHJpbnRfYXJlYXMgPSAkd29ya2Jvb2stPmdldF9wcmludF9hcmVhcygpOworCitFYWNoIHByaW50IGFyZWEgaXMgYXMgZm9sbG93czoKKworICAgIFsgJHN0YXJ0X3JvdywgJHN0YXJ0X2NvbCwgJGVuZF9yb3csICRlbmRfY29sIF0KKworUmV0dXJucyB1bmRlZiBpZiB0aGVyZSBhcmUgbm8gcHJpbnQgYXJlYXMuCisKKworPWhlYWQyIGdldF9wcmludF90aXRsZXMoKQorCitUaGUgQzxnZXRfcHJpbnRfdGl0bGVzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBwcmludCB0aXRsZSBoYXNoIHJlZnMuCisKKyAgICBteSAkcHJpbnRfdGl0bGVzID0gJHdvcmtib29rLT5nZXRfcHJpbnRfdGl0bGVzKCk7CisKK0VhY2ggcHJpbnQgdGl0bGUgYXJyYXkgcmVmIGlzIGFzIGZvbGxvd3M6CisKKyAgICB7CisgICAgICAgIFJvdyAgICA9PiBbICRzdGFydF9yb3csICRlbmRfcm93IF0sCisgICAgICAgIENvbHVtbiA9PiBbICRzdGFydF9jb2wsICRlbmRfY29sIF0sCisgICAgfQorCisKK1JldHVybnMgdW5kZWYgaWYgdGhlcmUgYXJlIG5vIHByaW50IHRpdGxlcy4KKworCis9aGVhZDIgdXNpbmdfMTkwNF9kYXRlKCkKKworVGhlIEM8dXNpbmdfMTkwNF9kYXRlKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIEV4Y2VsIGZpbGUgaXMgdXNpbmcgdGhlIDE5MDQgZGF0ZSBlcG9jaCBpbnN0ZWFkIG9mIHRoZSAxOTAwIGVwb2NoLgorCisgICAgbXkgJHVzaW5nXzE5MDRfZGF0ZSA9ICR3b3JrYm9vay0+dXNpbmdfMTkwNF9kYXRlKCk7CisKKyBUaGUgV2luZG93cyB2ZXJzaW9uIG9mIEV4Y2VsIGdlbmVyYWxseSB1c2VzIHRoZSAxOTAwIGVwb2NoIHdoaWxlIHRoZSBNYWMgdmVyc2lvbiBvZiBFeGNlbCBnZW5lcmFsbHkgdXNlcyB0aGUgMTkwNCBlcG9jaC4KKworUmV0dXJucyAwIGlmIHRoZSAxOTAwIGVwb2NoIGlzIGluIHVzZS4KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya3NoZWV0LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvUGFyc2VFeGNlbC9Xb3Jrc2hlZXQucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkMzJkNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1BhcnNlRXhjZWwvV29ya3NoZWV0LnBtCkBAIC0wLDAgKzEsOTU1IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQ7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldCAtIEEgY2xhc3MgZm9yIFdvcmtzaGVldHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA5ICAgICAgSm9obiBNY05hbWFyYQorIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCBHYWJvciBTemFibworIyBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiBLYXdhaSBUYWthbm9yaQorIworIyBwZXJsdGlkeSB3aXRoIHN0YW5kYXJkIHNldHRpbmdzLgorIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKK3VzZSBTY2FsYXI6OlV0aWwgcXcod2Vha2VuKTsKKworb3VyICRWRVJTSU9OID0gJzAuNTknOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCitzdWIgbmV3IHsKKworICAgIG15ICggJGNsYXNzLCAlcHJvcGVydGllcyApID0gQF87CisKKyAgICBteSAkc2VsZiA9IFwlcHJvcGVydGllczsKKworICAgIHdlYWtlbiAkc2VsZi0+e19Cb29rfTsKKworICAgICRzZWxmLT57Q2VsbHN9ICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntEZWZDb2xXaWR0aH0gPSA4LjQzOworCisgICAgcmV0dXJuIGJsZXNzICRzZWxmLCAkY2xhc3M7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2NlbGwoICRyb3csICRjb2wgKQorIworIyBSZXR1cm5zIHRoZSBDZWxsIG9iamVjdCBhdCByb3cgJHJvdyBhbmQgY29sdW1uICRjb2wsIGlmIGRlZmluZWQuCisjCitzdWIgZ2V0X2NlbGwgeworCisgICAgbXkgKCAkc2VsZiwgJHJvdywgJGNvbCApID0gQF87CisKKyAgICBpZiAoICAgIWRlZmluZWQgJHJvdworICAgICAgICB8fCAhZGVmaW5lZCAkY29sCisgICAgICAgIHx8ICFkZWZpbmVkICRzZWxmLT57TWF4Um93fQorICAgICAgICB8fCAhZGVmaW5lZCAkc2VsZi0+e01heENvbH0gKQorICAgIHsKKworICAgICAgICAjIFJldHVybiB1bmRlZiBpZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuIG9yIGlmIG5vIGNlbGxzIGFyZSBkZWZpbmVkLgorICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgfQorICAgIGVsc2lmICgkcm93IDwgJHNlbGYtPntNaW5Sb3d9CisgICAgICAgIHx8ICRyb3cgPiAkc2VsZi0+e01heFJvd30KKyAgICAgICAgfHwgJGNvbCA8ICRzZWxmLT57TWluQ29sfQorICAgICAgICB8fCAkY29sID4gJHNlbGYtPntNYXhDb2x9ICkKKyAgICB7CisKKyAgICAgICAgIyBSZXR1cm4gdW5kZWYgaWYgb3V0c2lkZSBhbGxvd2FibGUgcm93L2NvbCByYW5nZS4KKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFJldHVybiB0aGUgQ2VsbCBvYmplY3QuCisgICAgICAgIHJldHVybiAkc2VsZi0+e0NlbGxzfS0+WyRyb3ddLT5bJGNvbF07CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJvd19yYW5nZSgpCisjCisjIFJldHVybnMgYSB0d28tZWxlbWVudCBsaXN0ICgkbWluLCAkbWF4KSBjb250YWluaW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtCisjIGRlZmluZWQgcm93cyBpbiB0aGUgd29ya3NoZWV0LgorIworIyBJZiB0aGVyZSBpcyBubyByb3cgZGVmaW5lZCAkbWF4IGlzIHNtYWxsZXIgdGhhbiAkbWluLgorIworc3ViIHJvd19yYW5nZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJG1pbiA9ICRzZWxmLT57TWluUm93fSB8fCAwOworICAgIG15ICRtYXggPSBkZWZpbmVkKCAkc2VsZi0+e01heFJvd30gKSA/ICRzZWxmLT57TWF4Um93fSA6ICggJG1pbiAtIDEgKTsKKworICAgIHJldHVybiAoICRtaW4sICRtYXggKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb2xfcmFuZ2UoKQorIworIyBSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCAoJG1pbiwgJG1heCkgY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bQorIyBkZWZpbmVkIGNvbHMgaW4gdGhlIHdvcmtzaGVldC4KKyMKKyMgSWYgdGhlcmUgaXMgbm8gY29sdW1uIGRlZmluZWQgJG1heCBpcyBzbWFsbGVyIHRoYW4gJG1pbi4KKyMKK3N1YiBjb2xfcmFuZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRtaW4gPSAkc2VsZi0+e01pbkNvbH0gfHwgMDsKKyAgICBteSAkbWF4ID0gZGVmaW5lZCggJHNlbGYtPntNYXhDb2x9ICkgPyAkc2VsZi0+e01heENvbH0gOiAoICRtaW4gLSAxICk7CisKKyAgICByZXR1cm4gKCAkbWluLCAkbWF4ICk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X25hbWUoKQorIworIyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQuCisjCitzdWIgZ2V0X25hbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e05hbWV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNoZWV0X251bSgpCisjCitzdWIgc2hlZXRfbnVtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntfU2hlZXROb307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2hfcGFnZWJyZWFrcygpCisjCisjIFJldHVybnMgYW4gYXJyYXkgcmVmIG9mIHJvdyBudW1iZXJzIHdoZXJlIGEgaG9yaXpvbnRhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKyMKK3N1YiBnZXRfaF9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIUGFnZUJyZWFrfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfdl9wYWdlYnJlYWtzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgY29sdW1uIG51bWJlcnMgd2hlcmUgYSB2ZXJ0aWNhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKyMKK3N1YiBnZXRfdl9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntWUGFnZUJyZWFrfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWVyZ2VkX2FyZWFzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheSByZWYgb2YgY2VsbHMgdGhhdCBhcmUgbWVyZ2VkLgorIworc3ViIGdldF9tZXJnZWRfYXJlYXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e01lcmdlZEFyZWF9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9yb3dfaGVpZ2h0cygpCisjCisjIFJldHVybnMgYW4gYXJyYXlfcmVmIG9mIHJvdyBoZWlnaHRzLgorIworc3ViIGdldF9yb3dfaGVpZ2h0cyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIEB7ICRzZWxmLT57Um93SGVpZ2h0fSB9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9jb2xfd2lkdGhzKCkKKyMKKyMgUmV0dXJucyBhbiBhcnJheV9yZWYgb2YgY29sdW1uIHdpZHRocy4KKyMKK3N1YiBnZXRfY29sX3dpZHRocyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIEB7ICRzZWxmLT57Q29sV2lkdGh9IH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RlZmF1bHRfcm93X2hlaWdodCgpCisjCisjIFJldHVybnMgdGhlIGRlZmF1bHQgcm93IGhlaWdodCBmb3IgdGhlIHdvcmtzaGVldC4gR2VuZXJhbGx5IDEyLjc1LgorIworc3ViIGdldF9kZWZhdWx0X3Jvd19oZWlnaHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0RlZlJvd0hlaWdodH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RlZmF1bHRfY29sX3dpZHRoKCkKKyMKKyMgUmV0dXJucyB0aGUgZGVmYXVsdCBjb2x1bW4gd2lkdGggZm9yIHRoZSB3b3Jrc2hlZXQuIEdlbmVyYWxseSA4LjQzLgorIworc3ViIGdldF9kZWZhdWx0X2NvbF93aWR0aCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RGVmQ29sV2lkdGh9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfcm93X3Byb3BlcnRpZXMoKQorIworIyBSZXR1cm5zIGFuIGFycmF5X3JlZiBvZiByb3cgcHJvcGVydGllcy4KKyMgVE9ETy4gVGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhIGZ1dHVyZSBtZXRob2QuCisjCitzdWIgX2dldF9yb3dfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Um93UHJvcGVydGllc307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2dldF9jb2xfcHJvcGVydGllcygpCisjCisjIFJldHVybnMgYW4gYXJyYXlfcmVmIG9mIGNvbHVtbiBwcm9wZXJ0aWVzLgorIyBUT0RPLiBUaGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgZnV0dXJlIG1ldGhvZC4KKyMKK3N1YiBfZ2V0X2NvbF9wcm9wZXJ0aWVzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntDb2xQcm9wZXJ0aWVzfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfaGVhZGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgd29ya3NoZWV0IGhlYWRlciBzdHJpbmcuCisjCitzdWIgZ2V0X2hlYWRlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57SGVhZGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9vdGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgd29ya3NoZWV0IGZvb3RlciBzdHJpbmcuCisjCitzdWIgZ2V0X2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Rm9vdGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWFyZ2luX2xlZnQoKQorIworIyBSZXR1cm5zIHRoZSBsZWZ0IG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX2xlZnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0xlZnRNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fcmlnaHQoKQorIworIyBSZXR1cm5zIHRoZSByaWdodCBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisjCitzdWIgZ2V0X21hcmdpbl9yaWdodCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57UmlnaHRNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fdG9wKCkKKyMKKyMgUmV0dXJucyB0aGUgdG9wIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX3RvcCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57VG9wTWFyZ2lufTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfbWFyZ2luX2JvdHRvbSgpCisjCisjIFJldHVybnMgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisjCitzdWIgZ2V0X21hcmdpbl9ib3R0b20geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e0JvdHRvbU1hcmdpbn07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X21hcmdpbl9oZWFkZXIoKQorIworIyBSZXR1cm5zIHRoZSBoZWFkZXIgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorIworc3ViIGdldF9tYXJnaW5faGVhZGVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIZWFkZXJNYXJnaW59OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9tYXJnaW5fZm9vdGVyKCkKKyMKKyMgUmV0dXJucyB0aGUgZm9vdGVyIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKyMKK3N1YiBnZXRfbWFyZ2luX2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57Rm9vdGVyTWFyZ2lufTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfcGFwZXIoKQorIworIyBSZXR1cm5zIHRoZSBwcmludGVyIHBhcGVyIHNpemUuCisjCitzdWIgZ2V0X3BhcGVyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntQYXBlclNpemV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9zdGFydF9wYWdlKCkKKyMKKyMgUmV0dXJucyB0aGUgcGFnZSBudW1iZXIgdGhhdCBwcmludGluZyB3aWxsIHN0YXJ0IGZyb20uCisjCitzdWIgZ2V0X3N0YXJ0X3BhZ2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgT25seSByZXR1cm4gdGhlIHBhZ2UgbnVtYmVyIGlmIHRoZSAiRmlyc3QgcGFnZSBudW1iZXIiIG9wdGlvbiBpcyBzZXQuCisgICAgaWYgKCAkc2VsZi0+e1VzZVBhZ2V9ICkgeworICAgICAgICByZXR1cm4gJHNlbGYtPntQYWdlU3RhcnR9OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9vcmRlcigpCisjCisjIFJldHVybnMgdGhlIFdvcmtzaGVldCBwYWdlIHByaW50aW5nIG9yZGVyLgorIworc3ViIGdldF9wcmludF9vcmRlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57TGVmdFRvUmlnaHR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9wcmludF9zY2FsZSgpCisjCisjIFJldHVybnMgdGhlIHdvcmtib29rIHNjYWxlIGZvciBwcmludGluZy4KKyMKK3N1YiBnZXRfcHJpbnRfc2NhbGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1NjYWxlfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZml0X3RvX3BhZ2VzKCkKKyMKKyMgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdpZGUgYW5kIGhpZ2ggdGhhdCB0aGUgcHJpbnRlZCB3b3Jrc2hlZXQgcGFnZQorIyB3aWxsIGZpdCB0by4KKyMKK3N1YiBnZXRfZml0X3RvX3BhZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoICEkc2VsZi0+e1BhZ2VGaXR9ICkgeworICAgICAgICByZXR1cm4gKCAwLCAwICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gKCAkc2VsZi0+e0ZpdFdpZHRofSwgJHNlbGYtPntGaXRIZWlnaHR9ICk7CisgICAgfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3BvcnRyYWl0KCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gc2V0IGZvciBwcmludGluZyBpbiBwb3J0cmFpdCBtb2RlLgorIworc3ViIGlzX3BvcnRyYWl0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntMYW5kc2NhcGV9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX2NlbnRlcmVkX2hvcml6b250YWxseSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IGhhcyBiZWVuIGNlbnRlcmVkIGhvcml6b250YWxseSBmb3IgcHJpbnRpbmcuCisjCitzdWIgaXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntIQ2VudGVyfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBpc19jZW50ZXJlZF92ZXJ0aWNhbGx5KCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gY2VudGVyZWQgdmVydGljYWxseSBmb3IgcHJpbnRpbmcuCisjCitzdWIgaXNfY2VudGVyZWRfdmVydGljYWxseSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57SENlbnRlcn07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaXNfcHJpbnRfZ3JpZGxpbmVzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImdyaWRsaW5lcyIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKyMKK3N1YiBpc19wcmludF9ncmlkbGluZXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e1ByaW50R3JpZH07Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgaXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgInJvdyBhbmQgY29sdW1uIGhlYWRpbmdzIiBvcHRpb24gaXMgb24uCisjCitzdWIgaXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntQcmludEhlYWRlcnN9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJibGFjayBhbmQgd2hpdGUiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisjCitzdWIgaXNfcHJpbnRfYmxhY2tfYW5kX3doaXRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntOb0NvbG9yfTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBpc19wcmludF9kcmFmdCgpCisjCisjIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJkcmFmdCIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKyMKK3N1YiBpc19wcmludF9kcmFmdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57RHJhZnR9OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGlzX3ByaW50X2NvbW1lbnRzKCkKKyMKKyMgUmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImNvbW1lbnRzIiBvcHRpb24gaXMgdHVybmVkIG9uLgorIworc3ViIGlzX3ByaW50X2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICByZXR1cm4gJHNlbGYtPntOb3Rlc307Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgTWFwcGluZyBiZXR3ZWVuIGxlZ2FjeSBtZXRob2QgbmFtZXMgYW5kIG5ldyBuYW1lcy4KKyMKK3sKKyAgICBubyB3YXJuaW5nczsgICAgIyBJZ25vcmUgd2FybmluZ3MgYWJvdXQgdmFyaWFibGVzIHVzZWQgb25seSBvbmNlLgorICAgICpzaGVldE5vICA9ICpzaGVldF9udW07CisgICAgKkNlbGwgICAgID0gKmdldF9jZWxsOworICAgICpSb3dSYW5nZSA9ICpyb3dfcmFuZ2U7CisgICAgKkNvbFJhbmdlID0gKmNvbF9yYW5nZTsKK30KKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpXb3Jrc2hlZXQgLSBBIGNsYXNzIGZvciBXb3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBMPFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsPi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbC4KKworPWhlYWQxIE1ldGhvZHMKKworVGhlIEM8U3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OldvcmtzaGVldD4gY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIEV4Y2VsIHdvcmtzaGVldC4gSXQgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworICAgICR3b3Jrc2hlZXQtPmdldF9jZWxsKCkKKyAgICAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKQorICAgICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X25hbWUoKQorICAgICR3b3Jrc2hlZXQtPmdldF9oX3BhZ2VicmVha3MoKQorICAgICR3b3Jrc2hlZXQtPmdldF92X3BhZ2VicmVha3MoKQorICAgICR3b3Jrc2hlZXQtPmdldF9tZXJnZWRfYXJlYXMoKQorICAgICR3b3Jrc2hlZXQtPmdldF9yb3dfaGVpZ2h0cygpCisgICAgJHdvcmtzaGVldC0+Z2V0X2NvbF93aWR0aHMoKQorICAgICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X3Jvd19oZWlnaHQoKQorICAgICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X2NvbF93aWR0aCgpCisgICAgJHdvcmtzaGVldC0+Z2V0X2hlYWRlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X2Zvb3RlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9sZWZ0KCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3JpZ2h0KCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3RvcCgpCisgICAgJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9ib3R0b20oKQorICAgICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5faGVhZGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX2Zvb3RlcigpCisgICAgJHdvcmtzaGVldC0+Z2V0X3BhcGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfc3RhcnRfcGFnZSgpCisgICAgJHdvcmtzaGVldC0+Z2V0X3ByaW50X29yZGVyKCkKKyAgICAkd29ya3NoZWV0LT5nZXRfcHJpbnRfc2NhbGUoKQorICAgICR3b3Jrc2hlZXQtPmdldF9maXRfdG9fcGFnZXMoKQorICAgICR3b3Jrc2hlZXQtPmlzX3BvcnRyYWl0KCkKKyAgICAkd29ya3NoZWV0LT5pc19jZW50ZXJlZF9ob3Jpem9udGFsbHkoKQorICAgICR3b3Jrc2hlZXQtPmlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkoKQorICAgICR3b3Jrc2hlZXQtPmlzX3ByaW50X2dyaWRsaW5lcygpCisgICAgJHdvcmtzaGVldC0+aXNfcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKyAgICAkd29ya3NoZWV0LT5pc19wcmludF9ibGFja19hbmRfd2hpdGUoKQorICAgICR3b3Jrc2hlZXQtPmlzX3ByaW50X2RyYWZ0KCkKKyAgICAkd29ya3NoZWV0LT5pc19wcmludF9jb21tZW50cygpCisKKworPWhlYWQyIGdldF9jZWxsKCRyb3csICRjb2wpCisKK1JldHVybiB0aGUgTDwvQ2VsbD4gb2JqZWN0IGF0IHJvdyBDPCRyb3c+IGFuZCBjb2x1bW4gQzwkY29sPiBpZiBpdCBpcyBkZWZpbmVkLiBPdGhlcndpc2UgcmV0dXJucyB1bmRlZi4KKworICAgIG15ICRjZWxsID0gJHdvcmtzaGVldC0+Z2V0X2NlbGwoJHJvdywgJGNvbCk7CisKKz1oZWFkMiByb3dfcmFuZ2UoKQorCitSZXR1cm5zIGEgdHdvLWVsZW1lbnQgbGlzdCBDPCgkbWluLCAkbWF4KT4gY29udGFpbmluZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkZWZpbmVkIHJvd3MgaW4gdGhlIHdvcmtzaGVldC4gSWYgdGhlcmUgaXMgbm8gcm93IGRlZmluZWQgQzwkbWF4PiBpcyBzbWFsbGVyIHRoYW4gQzwkbWluPi4KKworICAgIG15ICggJHJvd19taW4sICRyb3dfbWF4ICkgPSAkd29ya3NoZWV0LT5yb3dfcmFuZ2UoKTsKKworPWhlYWQyIGNvbF9yYW5nZSgpCisKK1JldHVybnMgYSB0d28tZWxlbWVudCBsaXN0IEM8KCRtaW4sICRtYXgpPiBjb250YWluaW5nIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG9mIGRlZmluZWQgY29sdW1ucyBpbiB0aGUgd29ya3NoZWV0LiBJZiB0aGVyZSBpcyBubyBjb2x1bW4gZGVmaW5lZCBDPCRtYXg+IGlzIHNtYWxsZXIgdGhhbiBDPCRtaW4+LgorCisgICAgbXkgKCAkY29sX21pbiwgJGNvbF9tYXggKSA9ICR3b3Jrc2hlZXQtPmNvbF9yYW5nZSgpOworCisKKz1oZWFkMiBnZXRfbmFtZSgpCisKK1RoZSBDPGdldF9uYW1lKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSB3b3Jrc2hlZXQuCisKKyAgICBteSAkbmFtZSA9ICR3b3Jrc2hlZXQtPmdldF9uYW1lKCk7CisKKworPWhlYWQyIGdldF9oX3BhZ2VicmVha3MoKQorCitUaGUgQzxnZXRfaF9wYWdlYnJlYWtzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiByb3cgbnVtYmVycyB3aGVyZSBhIGhvcml6b250YWwgcGFnZSBicmVhayBvY2N1cnMuCisKKyAgICBteSAkaF9wYWdlYnJlYWtzID0gJHdvcmtzaGVldC0+Z2V0X2hfcGFnZWJyZWFrcygpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZXJlIGFyZSBubyBwYWdlYnJlYWtzLgorCisKKz1oZWFkMiBnZXRfdl9wYWdlYnJlYWtzKCkKKworVGhlIEM8Z2V0X3ZfcGFnZWJyZWFrcygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheSByZWYgb2YgY29sdW1uIG51bWJlcnMgd2hlcmUgYSB2ZXJ0aWNhbCBwYWdlIGJyZWFrIG9jY3Vycy4KKworICAgIG15ICR2X3BhZ2VicmVha3MgPSAkd29ya3NoZWV0LT5nZXRfdl9wYWdlYnJlYWtzKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlcmUgYXJlIG5vIHBhZ2VicmVha3MuCisKKworPWhlYWQyIGdldF9tZXJnZWRfYXJlYXMoKQorCitUaGUgQzxnZXRfbWVyZ2VkX2FyZWFzKCk+IG1ldGhvZCByZXR1cm5zIGFuIGFycmF5IHJlZiBvZiBjZWxscyB0aGF0IGFyZSBtZXJnZWQuCisKKyAgICBteSAkbWVyZ2VkX2FyZWFzID0gJHdvcmtzaGVldC0+Z2V0X21lcmdlZF9hcmVhcygpOworCitFYWNoIG1lcmdlZCBhcmVhIGlzIHJlcHJlc2VudGVkIGFzIGZvbGxvd3M6CisKKyAgICBbICRzdGFydF9yb3csICRzdGFydF9jb2wsICRlbmRfcm93LCAkZW5kX2NvbF0KKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGVyZSBhcmUgbm8gbWVyZ2VkIGFyZWFzLgorCisKKz1oZWFkMiBnZXRfcm93X2hlaWdodHMoKQorCitUaGUgQzxnZXRfcm93X2hlaWdodHMoKT4gbWV0aG9kIHJldHVybnMgYW4gYXJyYXlfcmVmIG9mIHJvdyBoZWlnaHRzLgorCisgICAgbXkgJHJvd19oZWlnaHRzID0gJHdvcmtzaGVldC0+Z2V0X3Jvd19oZWlnaHRzKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X2NvbF93aWR0aHMoKQorCitUaGUgQzxnZXRfY29sX3dpZHRocygpPiBtZXRob2QgcmV0dXJucyBhbiBhcnJheV9yZWYgb2YgY29sdW1uIHdpZHRocy4KKworICAgIG15ICRjb2xfd2lkdGhzID0gJHdvcmtzaGVldC0+Z2V0X2NvbF93aWR0aHMoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfZGVmYXVsdF9yb3dfaGVpZ2h0KCkKKworVGhlIEM8Z2V0X2RlZmF1bHRfcm93X2hlaWdodCgpPiBtZXRob2QgcmV0dXJucyB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0IGZvciB0aGUgd29ya3NoZWV0LiBHZW5lcmFsbHkgMTIuNzUuCisKKyAgICBteSAkZGVmYXVsdF9yb3dfaGVpZ2h0ID0gJHdvcmtzaGVldC0+Z2V0X2RlZmF1bHRfcm93X2hlaWdodCgpOworCisKKz1oZWFkMiBnZXRfZGVmYXVsdF9jb2xfd2lkdGgoKQorCitUaGUgQzxnZXRfZGVmYXVsdF9jb2xfd2lkdGgoKT4gbWV0aG9kIHJldHVybnMgdGhlIGRlZmF1bHQgY29sdW1uIHdpZHRoIGZvciB0aGUgd29ya3NoZWV0LiBHZW5lcmFsbHkgOC40My4KKworICAgIG15ICRkZWZhdWx0X2NvbF93aWR0aCA9ICR3b3Jrc2hlZXQtPmdldF9kZWZhdWx0X2NvbF93aWR0aCgpOworCisKKz1oZWFkMiBnZXRfaGVhZGVyKCkKKworVGhlIEM8Z2V0X2hlYWRlcigpPiBtZXRob2QgcmV0dXJucyB0aGUgd29ya3NoZWV0IGhlYWRlciBzdHJpbmcuIFRoaXMgc3RyaW5nIGNhbiBjb250YWluIGNvbnRyb2wgY29kZXMgZm9yIGFsaWdubWVudCBhbmQgZm9udCBwcm9wZXJ0aWVzLiBSZWZlciB0byB0aGUgRXhjZWwgb24tbGluZSBoZWxwIG9uIGhlYWRlcnMgYW5kIGZvb3RlcnMgb3IgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24gZm9yIHNldF9oZWFkZXIoKS4KKworICAgIG15ICRoZWFkZXIgPSAkd29ya3NoZWV0LT5nZXRfaGVhZGVyKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X2Zvb3RlcigpCisKK1RoZSBDPGdldF9mb290ZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIHdvcmtzaGVldCBmb290ZXIgc3RyaW5nLiBUaGlzIHN0cmluZyBjYW4gY29udGFpbiBjb250cm9sIGNvZGVzIGZvciBhbGlnbm1lbnQgYW5kIGZvbnQgcHJvcGVydGllcy4gUmVmZXIgdG8gdGhlIEV4Y2VsIG9uLWxpbmUgaGVscCBvbiBoZWFkZXJzIGFuZCBmb290ZXJzIG9yIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGZvciBzZXRfaGVhZGVyKCkuCisKKyAgICBteSAkZm9vdGVyID0gJHdvcmtzaGVldC0+Z2V0X2Zvb3RlcigpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fbGVmdCgpCisKK1RoZSBDPGdldF9tYXJnaW5fbGVmdCgpPiBtZXRob2QgcmV0dXJucyB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2xlZnQgPSAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX2xlZnQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfbWFyZ2luX3JpZ2h0KCkKKworVGhlIEM8Z2V0X21hcmdpbl9yaWdodCgpPiBtZXRob2QgcmV0dXJucyB0aGUgcmlnaHQgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorCisgICAgbXkgJG1hcmdpbl9yaWdodCA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fcmlnaHQoKTsKKworUmV0dXJucyBDPHVuZGVmPiBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfbWFyZ2luX3RvcCgpCisKK1RoZSBDPGdldF9tYXJnaW5fdG9wKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB0b3AgbWFyZ2luIG9mIHRoZSB3b3Jrc2hlZXQgaW4gaW5jaGVzLgorCisgICAgbXkgJG1hcmdpbl90b3AgPSAkd29ya3NoZWV0LT5nZXRfbWFyZ2luX3RvcCgpOworCitSZXR1cm5zIEM8dW5kZWY+IGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fYm90dG9tKCkKKworVGhlIEM8Z2V0X21hcmdpbl9ib3R0b20oKT4gbWV0aG9kIHJldHVybnMgdGhlIGJvdHRvbSBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2JvdHRvbSA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fYm90dG9tKCk7CisKK1JldHVybnMgQzx1bmRlZj4gaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgZ2V0X21hcmdpbl9oZWFkZXIoKQorCitUaGUgQzxnZXRfbWFyZ2luX2hlYWRlcigpPiBtZXRob2QgcmV0dXJucyB0aGUgaGVhZGVyIG1hcmdpbiBvZiB0aGUgd29ya3NoZWV0IGluIGluY2hlcy4KKworICAgIG15ICRtYXJnaW5faGVhZGVyID0gJHdvcmtzaGVldC0+Z2V0X21hcmdpbl9oZWFkZXIoKTsKKworUmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgb2YgMC41IGlmIG5vdCBzZXQuCisKKworPWhlYWQyIGdldF9tYXJnaW5fZm9vdGVyKCkKKworVGhlIEM8Z2V0X21hcmdpbl9mb290ZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIGZvb3RlciBtYXJnaW4gb2YgdGhlIHdvcmtzaGVldCBpbiBpbmNoZXMuCisKKyAgICBteSAkbWFyZ2luX2Zvb3RlciA9ICR3b3Jrc2hlZXQtPmdldF9tYXJnaW5fZm9vdGVyKCk7CisKK1JldHVybnMgYSBkZWZhdWx0IHZhbHVlIG9mIDAuNSBpZiBub3Qgc2V0LgorCisKKz1oZWFkMiBnZXRfcGFwZXIoKQorCitUaGUgQzxnZXRfcGFwZXIoKT4gbWV0aG9kIHJldHVybnMgdGhlIHByaW50ZXIgcGFwZXIgc2l6ZS4KKworICAgIG15ICRwYXBlciA9ICR3b3Jrc2hlZXQtPmdldF9wYXBlcigpOworCitUaGUgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIGZvcm1hdHMgc2hvd24gYmVsb3c6CisKKyAgICBJbmRleCAgIFBhcGVyIGZvcm1hdCAgICAgICAgICAgIFBhcGVyIHNpemUKKyAgICA9PT09PSAgID09PT09PT09PT09PSAgICAgICAgICAgID09PT09PT09PT0KKyAgICAgIDAgICAgIFByaW50ZXIgZGVmYXVsdCAgICAgICAgIC0KKyAgICAgIDEgICAgIExldHRlciAgICAgICAgICAgICAgICAgIDggMS8yIHggMTEgaW4KKyAgICAgIDIgICAgIExldHRlciBTbWFsbCAgICAgICAgICAgIDggMS8yIHggMTEgaW4KKyAgICAgIDMgICAgIFRhYmxvaWQgICAgICAgICAgICAgICAgIDExIHggMTcgaW4KKyAgICAgIDQgICAgIExlZGdlciAgICAgICAgICAgICAgICAgIDE3IHggMTEgaW4KKyAgICAgIDUgICAgIExlZ2FsICAgICAgICAgICAgICAgICAgIDggMS8yIHggMTQgaW4KKyAgICAgIDYgICAgIFN0YXRlbWVudCAgICAgICAgICAgICAgIDUgMS8yIHggOCAxLzIgaW4KKyAgICAgIDcgICAgIEV4ZWN1dGl2ZSAgICAgICAgICAgICAgIDcgMS80IHggMTAgMS8yIGluCisgICAgICA4ICAgICBBMyAgICAgICAgICAgICAgICAgICAgICAyOTcgeCA0MjAgbW0KKyAgICAgIDkgICAgIEE0ICAgICAgICAgICAgICAgICAgICAgIDIxMCB4IDI5NyBtbQorICAgICAxMCAgICAgQTQgU21hbGwgICAgICAgICAgICAgICAgMjEwIHggMjk3IG1tCisgICAgIDExICAgICBBNSAgICAgICAgICAgICAgICAgICAgICAxNDggeCAyMTAgbW0KKyAgICAgMTIgICAgIEI0ICAgICAgICAgICAgICAgICAgICAgIDI1MCB4IDM1NCBtbQorICAgICAxMyAgICAgQjUgICAgICAgICAgICAgICAgICAgICAgMTgyIHggMjU3IG1tCisgICAgIDE0ICAgICBGb2xpbyAgICAgICAgICAgICAgICAgICA4IDEvMiB4IDEzIGluCisgICAgIDE1ICAgICBRdWFydG8gICAgICAgICAgICAgICAgICAyMTUgeCAyNzUgbW0KKyAgICAgMTYgICAgIC0gICAgICAgICAgICAgICAgICAgICAgIDEweDE0IGluCisgICAgIDE3ICAgICAtICAgICAgICAgICAgICAgICAgICAgICAxMXgxNyBpbgorICAgICAxOCAgICAgTm90ZSAgICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAxOSAgICAgRW52ZWxvcGUgIDkgICAgICAgICAgICAgMyA3LzggeCA4IDcvOAorICAgICAyMCAgICAgRW52ZWxvcGUgMTAgICAgICAgICAgICAgNCAxLzggeCA5IDEvMgorICAgICAyMSAgICAgRW52ZWxvcGUgMTEgICAgICAgICAgICAgNCAxLzIgeCAxMCAzLzgKKyAgICAgMjIgICAgIEVudmVsb3BlIDEyICAgICAgICAgICAgIDQgMy80IHggMTEKKyAgICAgMjMgICAgIEVudmVsb3BlIDE0ICAgICAgICAgICAgIDUgeCAxMSAxLzIKKyAgICAgMjQgICAgIEMgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjUgICAgIEQgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjYgICAgIEUgc2l6ZSBzaGVldCAgICAgICAgICAgIC0KKyAgICAgMjcgICAgIEVudmVsb3BlIERMICAgICAgICAgICAgIDExMCB4IDIyMCBtbQorICAgICAyOCAgICAgRW52ZWxvcGUgQzMgICAgICAgICAgICAgMzI0IHggNDU4IG1tCisgICAgIDI5ICAgICBFbnZlbG9wZSBDNCAgICAgICAgICAgICAyMjkgeCAzMjQgbW0KKyAgICAgMzAgICAgIEVudmVsb3BlIEM1ICAgICAgICAgICAgIDE2MiB4IDIyOSBtbQorICAgICAzMSAgICAgRW52ZWxvcGUgQzYgICAgICAgICAgICAgMTE0IHggMTYyIG1tCisgICAgIDMyICAgICBFbnZlbG9wZSBDNjUgICAgICAgICAgICAxMTQgeCAyMjkgbW0KKyAgICAgMzMgICAgIEVudmVsb3BlIEI0ICAgICAgICAgICAgIDI1MCB4IDM1MyBtbQorICAgICAzNCAgICAgRW52ZWxvcGUgQjUgICAgICAgICAgICAgMTc2IHggMjUwIG1tCisgICAgIDM1ICAgICBFbnZlbG9wZSBCNiAgICAgICAgICAgICAxNzYgeCAxMjUgbW0KKyAgICAgMzYgICAgIEVudmVsb3BlICAgICAgICAgICAgICAgIDExMCB4IDIzMCBtbQorICAgICAzNyAgICAgTW9uYXJjaCAgICAgICAgICAgICAgICAgMy44NzUgeCA3LjUgaW4KKyAgICAgMzggICAgIEVudmVsb3BlICAgICAgICAgICAgICAgIDMgNS84IHggNiAxLzIgaW4KKyAgICAgMzkgICAgIEZhbmZvbGQgICAgICAgICAgICAgICAgIDE0IDcvOCB4IDExIGluCisgICAgIDQwICAgICBHZXJtYW4gU3RkIEZhbmZvbGQgICAgICA4IDEvMiB4IDEyIGluCisgICAgIDQxICAgICBHZXJtYW4gTGVnYWwgRmFuZm9sZCAgICA4IDEvMiB4IDEzIGluCisgICAgIDI1NiAgICBVc2VyIGRlZmluZWQKKworVGhlIHR3byBtb3N0IGNvbW1vbiBwYXBlciBzaXplcyBhcmUgQzwxID0gIlVTIExldHRlciI+IGFuZCBDPDkgPSBBND4uIFJldHVybnMgOSBieSBkZWZhdWx0LgorCisKKz1oZWFkMiBnZXRfc3RhcnRfcGFnZSgpCisKK1RoZSBDPGdldF9zdGFydF9wYWdlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSBwYWdlIG51bWJlciB0aGF0IHByaW50aW5nIHdpbGwgc3RhcnQgZnJvbS4KKworICAgIG15ICRzdGFydF9wYWdlID0gJHdvcmtzaGVldC0+Z2V0X3N0YXJ0X3BhZ2UoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGdldF9wcmludF9vcmRlcigpCisKK1RoZSBDPGdldF9wcmludF9vcmRlcigpPiBtZXRob2QgcmV0dXJucyAwIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgInBhZ2Ugb3JkZXIiIGlzICJEb3duIHRoZW4gb3ZlciIgKHRoZSBkZWZhdWx0KSBvciAxIGlmIGl0IGlzICJPdmVyIHRoZW4gZG93biIuCisKKyAgICBteSAkcHJpbnRfb3JkZXIgPSAkd29ya3NoZWV0LT5nZXRfcHJpbnRfb3JkZXIoKTsKKworCis9aGVhZDIgZ2V0X3ByaW50X3NjYWxlKCkKKworVGhlIEM8Z2V0X3ByaW50X3NjYWxlKCk+IG1ldGhvZCByZXR1cm5zIHRoZSB3b3JrYm9vayBzY2FsZSBmb3IgcHJpbnRpbmcuIFRoZSBwcmludCBzY2FsZSBmY3RvciBjYW4gYmUgaW4gdGhlIHJhbmdlIDEwIC4uIDQwMC4KKworICAgIG15ICRwcmludF9zY2FsZSA9ICR3b3Jrc2hlZXQtPmdldF9wcmludF9zY2FsZSgpOworCitSZXR1cm5zIDEwMCBieSBkZWZhdWx0LgorCisKKz1oZWFkMiBnZXRfZml0X3RvX3BhZ2VzKCkKKworVGhlIEM8Z2V0X2ZpdF90b19wYWdlcygpPiBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHdpZGUgYW5kIGhpZ2ggdGhhdCB0aGUgcHJpbnRlZCB3b3Jrc2hlZXQgcGFnZSB3aWxsIGZpdCB0by4KKworICAgIG15ICgkcGFnZXNfd2lkZSwgJHBhZ2VzX2hpZ2gpID0gJHdvcmtzaGVldC0+Z2V0X2ZpdF90b19wYWdlcygpOworCitSZXR1cm5zICgwLCAwKSBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wb3J0cmFpdCgpCisKK1RoZSBDPGlzX3BvcnRyYWl0KCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBzZXQgZm9yIHByaW50aW5nIGluIHBvcnRyYWl0IG1vZGUuCisKKyAgICBteSAkaXNfcG9ydHJhaXQgPSAkd29ya3NoZWV0LT5pc19wb3J0cmFpdCgpOworCitSZXR1cm5zIDAgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBzZXQgZm9yIHByaW50aW5nIGluIGhvcml6b250YWwgbW9kZS4KKworCis9aGVhZDIgaXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5KCkKKworVGhlIEM8aXNfY2VudGVyZWRfaG9yaXpvbnRhbGx5KCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBoYXMgYmVlbiBjZW50ZXJlZCBob3Jpem9udGFsbHkgZm9yIHByaW50aW5nLgorCisgICAgbXkgJGlzX2NlbnRlcmVkX2hvcml6b250YWxseSA9ICR3b3Jrc2hlZXQtPmlzX2NlbnRlcmVkX2hvcml6b250YWxseSgpOworCitSZXR1cm5zIDAgaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDIgaXNfY2VudGVyZWRfdmVydGljYWxseSgpCisKK1RoZSBDPGlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IGhhcyBiZWVuIGNlbnRlcmVkIHZlcnRpY2FsbHkgZm9yIHByaW50aW5nLgorCisgICAgbXkgJGlzX2NlbnRlcmVkX3ZlcnRpY2FsbHkgPSAkd29ya3NoZWV0LT5pc19jZW50ZXJlZF92ZXJ0aWNhbGx5KCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9ncmlkbGluZXMoKQorCitUaGUgQzxpc19wcmludF9ncmlkbGluZXMoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJncmlkbGluZXMiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisKKyAgICBteSAkaXNfcHJpbnRfZ3JpZGxpbmVzID0gJHdvcmtzaGVldC0+aXNfcHJpbnRfZ3JpZGxpbmVzKCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9yb3dfY29sX2hlYWRlcnMoKQorCitUaGUgQzxpc19wcmludF9yb3dfY29sX2hlYWRlcnMoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJyb3cgYW5kIGNvbHVtbiBoZWFkaW5ncyIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9yb3dfY29sX2hlYWRlcnMgPSAkd29ya3NoZWV0LT5pc19wcmludF9yb3dfY29sX2hlYWRlcnMoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpCisKK1RoZSBDPGlzX3ByaW50X2JsYWNrX2FuZF93aGl0ZSgpPiBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSB3b3Jrc2hlZXQgcHJpbnQgImJsYWNrIGFuZCB3aGl0ZSIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9ibGFja19hbmRfd2hpdGUgPSAkd29ya3NoZWV0LT5pc19wcmludF9ibGFja19hbmRfd2hpdGUoKTsKKworUmV0dXJucyAwIGlmIHRoZSBwcm9wZXJ0eSBpc24ndCBzZXQuCisKKworPWhlYWQyIGlzX3ByaW50X2RyYWZ0KCkKKworVGhlIEM8aXNfcHJpbnRfZHJhZnQoKT4gbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya3NoZWV0IHByaW50ICJkcmFmdCIgb3B0aW9uIGlzIHR1cm5lZCBvbi4KKworICAgIG15ICRpc19wcmludF9kcmFmdCA9ICR3b3Jrc2hlZXQtPmlzX3ByaW50X2RyYWZ0KCk7CisKK1JldHVybnMgMCBpZiB0aGUgcHJvcGVydHkgaXNuJ3Qgc2V0LgorCisKKz1oZWFkMiBpc19wcmludF9jb21tZW50cygpCisKK1RoZSBDPGlzX3ByaW50X2NvbW1lbnRzKCk+IG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtzaGVldCBwcmludCAiY29tbWVudHMiIG9wdGlvbiBpcyB0dXJuZWQgb24uCisKKyAgICBteSAkaXNfcHJpbnRfY29tbWVudHMgPSAkd29ya3NoZWV0LT5pc19wcmludF9jb21tZW50cygpOworCitSZXR1cm5zIDAgaWYgdGhlIHByb3BlcnR5IGlzbid0IHNldC4KKworCis9aGVhZDEgQVVUSE9SCisKK01haW50YWluZXIgMC40MCs6IEpvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKK01haW50YWluZXIgMC4yNy0wLjMzOiBHYWJvciBTemFibyBzemFiZ2FiQGNwYW4ub3JnCisKK09yaWdpbmFsIGF1dGhvcjogS2F3YWkgVGFrYW5vcmkga3dpdGtuckBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCAoYykgMjAwOS0yMDEwIEpvaG4gTWNOYW1hcmEKKworQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggR2Fib3IgU3phYm8KKworQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYgS2F3YWkgVGFrYW5vcmkKKworQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworWW91IG1heSBkaXN0cmlidXRlIHVuZGVyIHRoZSB0ZXJtcyBvZiBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIG9yIHRoZSBBcnRpc3RpYyBMaWNlbnNlLCBhcyBzcGVjaWZpZWQgaW4gdGhlIFBlcmwgUkVBRE1FIGZpbGUuCisKKz1jdXQKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZmNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtCkBAIC0wLDAgKzEsNTQzNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXcml0ZUV4Y2VsLgorIworIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCAtIFdyaXRlIHRvIGEgY3Jvc3MtcGxhdGZvcm0gRXhjZWwgYmluYXJ5IGZpbGUuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vazsKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vayBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOyAjIFRoZSBMaWZlIFB1cnN1aXQKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IuIFdyYXBwZXIgZm9yIGEgV29ya2Jvb2sgb2JqZWN0LgorIyB1c2VzOiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcgorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQKKyMgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Ok9MRXdyaXRlcgorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya2Jvb2sKKyMgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldAorIyAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0CisjICAgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhCisjICAgICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpQcm9wZXJ0aWVzCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vay0+bmV3KEBfKTsKKworICAgICMgQ2hlY2sgZm9yIGZpbGUgY3JlYXRpb24gZmFpbHVyZXMgYmVmb3JlIHJlLWJsZXNzaW5nCisgICAgYmxlc3MgICRzZWxmLCAkY2xhc3MgaWYgZGVmaW5lZCAkc2VsZjsKKworICAgIHJldHVybiAkc2VsZjsKK30KKworCisxOworCisKK19fRU5EX18KKworCisKKz1oZWFkMSBOQU1FCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIC0gV3JpdGUgdG8gYSBjcm9zcy1wbGF0Zm9ybSBFeGNlbCBiaW5hcnkgZmlsZS4KKworPWhlYWQxIFZFUlNJT04KKworVGhpcyBkb2N1bWVudCByZWZlcnMgdG8gdmVyc2lvbiAyLjM3IG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLCByZWxlYXNlZCBGZWJydWFyeSAyLCAyMDEwLgorCisKKworCis9aGVhZDEgU1lOT1BTSVMKKworVG8gd3JpdGUgYSBzdHJpbmcsIGEgZm9ybWF0dGVkIHN0cmluZywgYSBudW1iZXIgYW5kIGEgZm9ybXVsYSB0byB0aGUgZmlyc3Qgd29ya3NoZWV0IGluIGFuIEV4Y2VsIHdvcmtib29rIGNhbGxlZCBwZXJsLnhsczoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IEV4Y2VsIHdvcmtib29rCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncGVybC54bHMnKTsKKworICAgICMgQWRkIGEgd29ya3NoZWV0CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyAgQWRkIGFuZCBkZWZpbmUgYSBmb3JtYXQKKyAgICAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7ICMgQWRkIGEgZm9ybWF0CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ3JlZCcpOworICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisKKyAgICAjIFdyaXRlIGEgZm9ybWF0dGVkIGFuZCB1bmZvcm1hdHRlZCBzdHJpbmcsIHJvdyBhbmQgY29sdW1uIG5vdGF0aW9uLgorICAgICRjb2wgPSAkcm93ID0gMDsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAkY29sLCAnSGkgRXhjZWwhJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgICAgJGNvbCwgJ0hpIEV4Y2VsIScpOworCisgICAgIyBXcml0ZSBhIG51bWJlciBhbmQgYSBmb3JtdWxhIHVzaW5nIEExIG5vdGF0aW9uCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgMS4yMzQ1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnPVNJTihQSSgpLzQpJyk7CisKKworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgUGVybCBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgY3Jvc3MtcGxhdGZvcm0gRXhjZWwgYmluYXJ5IGZpbGUuIE11bHRpcGxlIHdvcmtzaGVldHMgY2FuIGJlIGFkZGVkIHRvIGEgd29ya2Jvb2sgYW5kIGZvcm1hdHRpbmcgY2FuIGJlIGFwcGxpZWQgdG8gY2VsbHMuIFRleHQsIG51bWJlcnMsIGZvcm11bGFzLCBoeXBlcmxpbmtzLCBpbWFnZXMgYW5kIGNoYXJ0cyBjYW4gYmUgd3JpdHRlbiB0byB0aGUgY2VsbHMuCisKK1RoZSBmaWxlIHByb2R1Y2VkIGJ5IHRoaXMgbW9kdWxlIGlzIGNvbXBhdGlibGUgd2l0aCBFeGNlbCA5NywgMjAwMCwgMjAwMiwgMjAwMyBhbmQgMjAwNy4KKworVGhlIG1vZHVsZSB3aWxsIHdvcmsgb24gdGhlIG1ham9yaXR5IG9mIFdpbmRvd3MsIFVOSVggYW5kIE1hYyBwbGF0Zm9ybXMuIEdlbmVyYXRlZCBmaWxlcyBhcmUgYWxzbyBjb21wYXRpYmxlIHdpdGggdGhlIExpbnV4L1VOSVggc3ByZWFkc2hlZXQgYXBwbGljYXRpb25zIEdudW1lcmljIGFuZCBPcGVuT2ZmaWNlLm9yZy4KKworVGhpcyBtb2R1bGUgY2Fubm90IGJlIHVzZWQgdG8gd3JpdGUgdG8gYW4gZXhpc3RpbmcgRXhjZWwgZmlsZSAoU2VlIEw8TU9ESUZZSU5HIEFORCBSRVdSSVRJTkcgRVhDRUwgRklMRVM+KS4KKworCisKKworPWhlYWQxIFFVSUNLIFNUQVJUCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRyaWVzIHRvIHByb3ZpZGUgYW4gaW50ZXJmYWNlIHRvIGFzIG1hbnkgb2YgRXhjZWwncyBmZWF0dXJlcyBhcyBwb3NzaWJsZS4gQXMgYSByZXN1bHQgdGhlcmUgaXMgYSBsb3Qgb2YgZG9jdW1lbnRhdGlvbiB0byBhY2NvbXBhbnkgdGhlIGludGVyZmFjZSBhbmQgaXQgY2FuIGJlIGRpZmZpY3VsdCBhdCBmaXJzdCBnbGFuY2UgdG8gc2VlIHdoYXQgaXQgaW1wb3J0YW50IGFuZCB3aGF0IGlzIG5vdC4gU28gZm9yIHRob3NlIG9mIHlvdSB3aG8gcHJlZmVyIHRvIGFzc2VtYmxlIElrZWEgZnVybml0dXJlIGZpcnN0IGFuZCB0aGVuIHJlYWQgdGhlIGluc3RydWN0aW9ucywgaGVyZSBhcmUgdGhyZWUgZWFzeSBzdGVwczoKKworMS4gQ3JlYXRlIGEgbmV3IEV4Y2VsIEk8d29ya2Jvb2s+IChpLmUuIGZpbGUpIHVzaW5nIEM8bmV3KCk+LgorCisyLiBBZGQgYSBJPHdvcmtzaGVldD4gdG8gdGhlIG5ldyB3b3JrYm9vayB1c2luZyBDPGFkZF93b3Jrc2hlZXQoKT4uCisKKzMuIFdyaXRlIHRvIHRoZSB3b3Jrc2hlZXQgdXNpbmcgQzx3cml0ZSgpPi4KKworTGlrZSB0aGlzOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGVwIDAKKworICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ3BlcmwueGxzJyk7ICMgU3RlcCAxCisgICAgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7ICAgICAgICAgICAgICAgIyBTdGVwIDIKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGkgRXhjZWwhJyk7ICAgICAgICAgICAgICAgICAgICAjIFN0ZXAgMworCitUaGlzIHdpbGwgY3JlYXRlIGFuIEV4Y2VsIGZpbGUgY2FsbGVkIEM8cGVybC54bHM+IHdpdGggYSBzaW5nbGUgd29ya3NoZWV0IGFuZCB0aGUgdGV4dCBDPCdIaSBFeGNlbCEnPiBpbiB0aGUgcmVsZXZhbnQgY2VsbC4gQW5kIHRoYXQncyBpdC4gT2theSwgc28gdGhlcmUgaXMgYWN0dWFsbHkgYSB6ZXJvdGggc3RlcCBhcyB3ZWxsLCBidXQgQzx1c2UgbW9kdWxlPiBnb2VzIHdpdGhvdXQgc2F5aW5nLiBUaGVyZSBhcmUgYWxzbyBtb3JlIHRoYW4gODAgZXhhbXBsZXMgdGhhdCBjb21lIHdpdGggdGhlIGRpc3RyaWJ1dGlvbiBhbmQgd2hpY2ggeW91IGNhbiB1c2UgdG8gZ2V0IHlvdSBzdGFydGVkLiBTZWUgTDxFWEFNUExFUz4uCisKK1Rob3NlIG9mIHlvdSB3aG8gcmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIGZpcnN0IGFuZCBhc3NlbWJsZSB0aGUgZnVybml0dXJlIGFmdGVyd2FyZHMgd2lsbCBrbm93IGhvdyB0byBwcm9jZWVkLiA7LSkKKworCisKKworPWhlYWQxIFdPUktCT09LIE1FVEhPRFMKKworVGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSBwcm92aWRlcyBhbiBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHRvIGEgbmV3IEV4Y2VsIHdvcmtib29rLiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGEgbmV3IHdvcmtib29rLgorCisgICAgbmV3KCkKKyAgICBhZGRfd29ya3NoZWV0KCkKKyAgICBhZGRfZm9ybWF0KCkKKyAgICBhZGRfY2hhcnQoKQorICAgIGFkZF9jaGFydF9leHQoKQorICAgIGNsb3NlKCkKKyAgICBjb21wYXRpYmlsaXR5X21vZGUoKQorICAgIHNldF9wcm9wZXJ0aWVzKCkKKyAgICBkZWZpbmVfbmFtZSgpCisgICAgc2V0X3RlbXBkaXIoKQorICAgIHNldF9jdXN0b21fY29sb3IoKQorICAgIHNoZWV0cygpCisgICAgc2V0XzE5MDQoKQorICAgIHNldF9jb2RlcGFnZSgpCisKK0lmIHlvdSBhcmUgdW5mYW1pbGlhciB3aXRoIG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2VzIG9yIHRoZSB3YXkgdGhhdCB0aGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBQZXJsIGhhdmUgYSBsb29rIGF0IEM8cGVybG9iaj4gYW5kIEM8cGVybHRvb3Q+IGluIHRoZSBtYWluIFBlcmwgZG9jdW1lbnRhdGlvbi4KKworCisKKworPWhlYWQyIG5ldygpCisKK0EgbmV3IEV4Y2VsIHdvcmtib29rIGlzIGNyZWF0ZWQgdXNpbmcgdGhlIEM8bmV3KCk+IGNvbnN0cnVjdG9yIHdoaWNoIGFjY2VwdHMgZWl0aGVyIGEgZmlsZW5hbWUgb3IgYSBmaWxlaGFuZGxlIGFzIGEgcGFyYW1ldGVyLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIG5ldyBFeGNlbCBmaWxlIGJhc2VkIG9uIGEgZmlsZW5hbWU6CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZmlsZW5hbWUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdIaSBFeGNlbCEnKTsKKworSGVyZSBhcmUgc29tZSBvdGhlciBleGFtcGxlcyBvZiB1c2luZyBDPG5ldygpPiB3aXRoIGZpbGVuYW1lczoKKworICAgIG15ICR3b3JrYm9vazEgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRmaWxlbmFtZSk7CisgICAgbXkgJHdvcmtib29rMiA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJy90bXAvZmlsZW5hbWUueGxzJyk7CisgICAgbXkgJHdvcmtib29rMyA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImM6XFx0bXBcXGZpbGVuYW1lLnhscyIpOworICAgIG15ICR3b3JrYm9vazQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdjOlx0bXBcZmlsZW5hbWUueGxzJyk7CisKK1RoZSBsYXN0IHR3byBleGFtcGxlcyBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGZpbGUgb24gRE9TIG9yIFdpbmRvd3Mgd2hlcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGVpdGhlciBlc2NhcGUgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgQzxcPiBvciB0byB1c2Ugc2luZ2xlIHF1b3RlcyB0byBlbnN1cmUgdGhhdCBpdCBpc24ndCBpbnRlcnBvbGF0ZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uICBzZWUgQzxwZXJsZmFxNTogV2h5IGNhbid0IEkgdXNlICJDOlx0ZW1wXGZvbyIgaW4gRE9TIHBhdGhzPz4uCisKK1RoZSBDPG5ldygpPiBjb25zdHJ1Y3RvciByZXR1cm5zIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gYWRkIHdvcmtzaGVldHMgYW5kIHN0b3JlIGRhdGEuIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFsdGhvdWdoIEM8bXk+IGlzIG5vdCBzcGVjaWZpY2FsbHkgcmVxdWlyZWQgaXQgZGVmaW5lcyB0aGUgc2NvcGUgb2YgdGhlIG5ldyB3b3JrYm9vayB2YXJpYWJsZSBhbmQsIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgZW5zdXJlcyB0aGF0IHRoZSB3b3JrYm9vayBpcyBjbG9zZWQgcHJvcGVybHkgd2l0aG91dCBleHBsaWNpdGx5IGNhbGxpbmcgdGhlIEM8Y2xvc2UoKT4gbWV0aG9kLgorCitJZiB0aGUgZmlsZSBjYW5ub3QgYmUgY3JlYXRlZCwgZHVlIHRvIGZpbGUgcGVybWlzc2lvbnMgb3Igc29tZSBvdGhlciByZWFzb24sICBDPG5ldz4gd2lsbCByZXR1cm4gQzx1bmRlZj4uIFRoZXJlZm9yZSwgaXQgaXMgZ29vZCBwcmFjdGljZSB0byBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIEM8bmV3PiBiZWZvcmUgcHJvY2VlZGluZy4gQXMgdXN1YWwgdGhlIFBlcmwgdmFyaWFibGUgQzwkIT4gd2lsbCBiZSBzZXQgaWYgdGhlcmUgaXMgYSBmaWxlIGNyZWF0aW9uIGVycm9yLiBZb3Ugd2lsbCBhbHNvIHNlZSBvbmUgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgZGV0YWlsZWQgaW4gTDxESUFHTk9TVElDUz46CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncHJvdGVjdGVkLnhscycpOworICAgIGRpZSAiUHJvYmxlbXMgY3JlYXRpbmcgbmV3IEV4Y2VsIGZpbGU6ICQhIiB1bmxlc3MgZGVmaW5lZCAkd29ya2Jvb2s7CisKK1lvdSBjYW4gYWxzbyBwYXNzIGEgdmFsaWQgZmlsZWhhbmRsZSB0byB0aGUgQzxuZXcoKT4gY29uc3RydWN0b3IuIEZvciBleGFtcGxlIGluIGEgQ0dJIHByb2dyYW0geW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisKKyAgICBiaW5tb2RlKFNURE9VVCk7CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpTVERPVVQpOworCitUaGUgcmVxdWlyZW1lbnQgZm9yIEM8YmlubW9kZSgpPiBpcyBleHBsYWluZWQgYmVsb3cuCisKK0ZvciBDR0kgcHJvZ3JhbXMgeW91IGNhbiBhbHNvIHVzZSB0aGUgc3BlY2lhbCBQZXJsIGZpbGVuYW1lIEM8Jy0nPiB3aGljaCB3aWxsIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gU1RET1VUOgorCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJy0nKTsKKworU2VlIGFsc28sIHRoZSBDPGNnaS5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0hvd2V2ZXIsIHRoaXMgc3BlY2lhbCBjYXNlIHdpbGwgbm90IHdvcmsgaW4gQzxtb2RfcGVybD4gcHJvZ3JhbXMgd2hlcmUgeW91IHdpbGwgaGF2ZSB0byBkbyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgIyBtb2RfcGVybCAxCisgICAgLi4uCisgICAgdGllICpYTFMsICdBcGFjaGUnOworICAgIGJpbm1vZGUoWExTKTsKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgLi4uCisKKyAgICAjIG1vZF9wZXJsIDIKKyAgICAuLi4KKyAgICB0aWUgKlhMUyA9PiAkcjsgICMgVGllIHRvIHRoZSBBcGFjaGU6OlJlcXVlc3RSZWMgb2JqZWN0CisgICAgYmlubW9kZSgqWExTKTsKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgLi4uCisKK1NlZSBhbHNvLCB0aGUgQzxtb2RfcGVybDEucGw+IGFuZCBDPG1vZF9wZXJsMi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitGaWxlaGFuZGxlcyBjYW4gYWxzbyBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gc3RyZWFtIGFuIEV4Y2VsIGZpbGUgb3ZlciBhIHNvY2tldCBvciBpZiB5b3Ugd2FudCB0byBzdG9yZSBhbiBFeGNlbCBmaWxlIGluIGEgc2NhbGFyLgorCitGb3IgZXhhbXBsZSBoZXJlIGlzIGEgd2F5IHRvIHdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYSBzY2FsYXIgd2l0aCBDPHBlcmwgNS44PjoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICAjIFJlcXVpcmVzIHBlcmwgNS44IG9yIGxhdGVyCisgICAgb3BlbiBteSAkZmgsICc+JywgXG15ICRzdHIgb3IgZGllICJGYWlsZWQgdG8gb3BlbiBmaWxlaGFuZGxlOiAkISI7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkZmgpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICAnSGkgRXhjZWwhJyk7CisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGluIG5vdyBpbiAkc3RyLiBSZW1lbWJlciB0byBiaW5tb2RlKCkgdGhlIG91dHB1dAorICAgICMgZmlsZWhhbmRsZSBiZWZvcmUgcHJpbnRpbmcgaXQuCisgICAgYmlubW9kZSBTVERPVVQ7CisgICAgcHJpbnQgJHN0cjsKKworU2VlIGFsc28gdGhlIEM8d3JpdGVfdG9fc2NhbGFyLnBsPiBhbmQgQzxmaWxlaGFuZGxlLnBsPiBwcm9ncmFtcyBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0I8Tm90ZSBhYm91dCB0aGUgcmVxdWlyZW1lbnQgZm9yPiBDPGJpbm1vZGUoKT4uIEFuIEV4Y2VsIGZpbGUgaXMgY29tcHJpc2VkIG9mIGJpbmFyeSBkYXRhLiBUaGVyZWZvcmUsIGlmIHlvdSBhcmUgdXNpbmcgYSBmaWxlaGFuZGxlIHlvdSBzaG91bGQgZW5zdXJlIHRoYXQgeW91IEM8YmlubW9kZSgpPiBpdCBwcmlvciB0byBwYXNzaW5nIGl0IHRvIEM8bmV3KCk+LllvdSBzaG91bGQgZG8gdGhpcyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgeW91IGFyZSBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gb3Igbm90LiBUaGlzIGFwcGxpZXMgZXNwZWNpYWxseSB0byB1c2VycyBvZiBwZXJsIDUuOCBvbiBzeXN0ZW1zIHdoZXJlIEM8VVRGLTg+IGlzIGxpa2VseSB0byBiZSBpbiBvcGVyYXRpb24gc3VjaCBhcyBSZWRIYXQgTGludXggOS4gSWYgeW91ciBwcm9ncmFtLCBlaXRoZXIgaW50ZW50aW9uYWxseSBvciBub3QsIHdyaXRlcyBDPFVURi04PiBkYXRhIHRvIGEgZmlsZWhhbmRsZSB0aGF0IGlzIHBhc3NlZCB0byBDPG5ldygpPiBpdCB3aWxsIGNvcnJ1cHQgdGhlIEV4Y2VsIGZpbGUgdGhhdCBpcyBjcmVhdGVkLgorCitZb3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBDPGJpbm1vZGUoKT4gaWYgeW91IGFyZSB1c2luZyBmaWxlbmFtZXMgaW5zdGVhZCBvZiBmaWxlaGFuZGxlcy4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcGVyZm9ybXMgdGhlIEM8YmlubW9kZSgpPiBpbnRlcm5hbGx5IHdoZW4gaXQgY29udmVydHMgdGhlIGZpbGVuYW1lIHRvIGEgZmlsZWhhbmRsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgQzxiaW5tb2RlKCk+IHNlZSBDPHBlcmxmdW5jPiBhbmQgQzxwZXJsb3BlbnR1dD4gaW4gdGhlIG1haW4gUGVybCBkb2N1bWVudGF0aW9uLgorCisKKworCisKKz1oZWFkMiBhZGRfd29ya3NoZWV0KCRzaGVldG5hbWUsICR1dGZfMTZfYmUpCisKK0F0IGxlYXN0IG9uZSB3b3Jrc2hlZXQgc2hvdWxkIGJlIGFkZGVkIHRvIGEgbmV3IHdvcmtib29rLiBBIHdvcmtzaGVldCBpcyB1c2VkIHRvIHdyaXRlIGRhdGEgaW50byBjZWxsczoKKworICAgICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7ICAgICAgICAgICAjIFNoZWV0MQorICAgICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdGb2dsaW8yJyk7ICAjIEZvZ2xpbzIKKyAgICAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRGF0YScpOyAgICAgIyBEYXRhCisgICAgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsgICAgICAgICAgICMgU2hlZXQ0CisKK0lmIEM8JHNoZWV0bmFtZT4gaXMgbm90IHNwZWNpZmllZCB0aGUgZGVmYXVsdCBFeGNlbCBjb252ZW50aW9uIHdpbGwgYmUgZm9sbG93ZWQsIGkuZS4gU2hlZXQxLCBTaGVldDIsIGV0Yy4gVGhlIEM8JHV0Zl8xNl9iZT4gcGFyYW1ldGVyIGlzIG9wdGlvbmFsLCBzZWUgYmVsb3cuCisKK1RoZSB3b3Jrc2hlZXQgbmFtZSBtdXN0IGJlIGEgdmFsaWQgRXhjZWwgd29ya3NoZWV0IG5hbWUsIGkuZS4gaXQgY2Fubm90IGNvbnRhaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVycywgQzxbIF0gOiAqID8gLyBcPiBhbmQgaXQgbXVzdCBiZSBsZXNzIHRoYW4gMzIgY2hhcmFjdGVycy4gSW4gYWRkaXRpb24sIHlvdSBjYW5ub3QgdXNlIHRoZSBzYW1lLCBjYXNlIGluc2Vuc2l0aXZlLCBDPCRzaGVldG5hbWU+IGZvciBtb3JlIHRoYW4gb25lIHdvcmtzaGVldC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzxhZGRfd29ya3NoZWV0KCk+IG1ldGhvZCB3aWxsIGFsc28gaGFuZGxlIHN0cmluZ3MgaW4gQzxVVEYtOD4gZm9ybWF0LgorCisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgiXHh7MjYzYX0iKTsgIyBTbWlsZXkKKworT24gZWFybGllciBQZXJsIHN5c3RlbXMgeW91ciBjYW4gc3BlY2lmeSBDPFVURi0xNkJFPiB3b3Jrc2hlZXQgbmFtZXMgdXNpbmcgYW4gYWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXI6CisKKyAgICBteSAkbmFtZSA9IHBhY2sgJ24nLCAweDI2M2E7CisgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgkbmFtZSwgMSk7ICAgIyBTbWlsZXkKKworCisKKworPWhlYWQyIGFkZF9mb3JtYXQoJXByb3BlcnRpZXMpCisKK1RoZSBDPGFkZF9mb3JtYXQoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgRm9ybWF0IG9iamVjdHMgd2hpY2ggYXJlIHVzZWQgdG8gYXBwbHkgZm9ybWF0dGluZyB0byBhIGNlbGwuIFlvdSBjYW4gZWl0aGVyIGRlZmluZSB0aGUgcHJvcGVydGllcyBhdCBjcmVhdGlvbiB0aW1lIHZpYSBhIGhhc2ggb2YgcHJvcGVydHkgdmFsdWVzIG9yIGxhdGVyIHZpYSBtZXRob2QgY2FsbHMuCisKKyAgICAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCglcHJvcHMpOyAjIFNldCBwcm9wZXJ0aWVzIGF0IGNyZWF0aW9uCisgICAgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsgICAgICAgIyBTZXQgcHJvcGVydGllcyBsYXRlcgorCitTZWUgdGhlIEw8Q0VMTCBGT1JNQVRUSU5HPiBzZWN0aW9uIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgRm9ybWF0IHByb3BlcnRpZXMgYW5kIGhvdyB0byBzZXQgdGhlbS4KKworCisKKworPWhlYWQyIGFkZF9jaGFydCglcHJvcGVydGllcykKKworVGhpcyBtZXRob2QgaXMgdXNlIHRvIGNyZWF0ZSBhIG5ldyBjaGFydCBlaXRoZXIgYXMgYSBzdGFuZGFsb25lIHdvcmtzaGVldCAodGhlIGRlZmF1bHQpIG9yIGFzIGFuIGVtYmVkZGFibGUgb2JqZWN0IHRoYXQgY2FuIGJlIGluc2VydGVkIGludG8gYSB3b3Jrc2hlZXQgdmlhIHRoZSBDPGluc2VydF9jaGFydCgpPiBXb3Jrc2hlZXQgbWV0aG9kLgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworICAgIHR5cGUgICAgIChyZXF1aXJlZCkKKyAgICBuYW1lICAgICAob3B0aW9uYWwpCisgICAgZW1iZWRkZWQgKG9wdGlvbmFsKQorCis9b3ZlcgorCis9aXRlbSAqIEM8dHlwZT4KKworVGhpcyBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4gSXQgZGVmaW5lcyB0aGUgdHlwZSBvZiBjaGFydCB0aGF0IHdpbGwgYmUgY3JlYXRlZC4KKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJyApOworCitUaGUgYXZhaWxhYmxlIHR5cGVzIGFyZToKKworICAgIGFyZWEKKyAgICBiYXIKKyAgICBjb2x1bW4KKyAgICBsaW5lCisgICAgcGllCisgICAgc2NhdHRlcgorICAgIHN0b2NrCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgZm9yIHRoZSBjaGFydCBzaGVldC4gVGhlIG5hbWUgcHJvcGVydHkgaXMgb3B0aW9uYWwgYW5kIGlmIGl0IGlzbid0IHN1cHBsaWVkIHdpbGwgZGVmYXVsdCB0byBDPENoYXJ0MSAuLiBuPi4gVGhlIG5hbWUgbXVzdCBiZSBhIHZhbGlkIEV4Y2VsIHdvcmtzaGVldCBuYW1lLiBTZWUgQzxhZGRfd29ya3NoZWV0KCk+IGZvciBtb3JlIGRldGFpbHMgb24gdmFsaWQgc2hlZXQgbmFtZXMuIFRoZSBDPG5hbWU+IHByb3BlcnR5IGNhbiBiZSBvbWl0dGVkIGZvciBlbWJlZGRlZCBjaGFydHMuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScsIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnICk7CisKKz1pdGVtICogQzxlbWJlZGRlZD4KKworU3BlY2lmaWVzIHRoYXQgdGhlIENoYXJ0IG9iamVjdCB3aWxsIGJlIGluc2VydGVkIGluIGEgd29ya3NoZWV0IHZpYSB0aGUgQzxpbnNlcnRfY2hhcnQoKT4gV29ya3NoZWV0IG1ldGhvZC4gSXQgaXMgYW4gZXJyb3IgdG8gdHJ5IGluc2VydCBhIENoYXJ0IHRoYXQgZG9lc24ndCBoYXZlIHRoaXMgZmxhZyBzZXQuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAuLi4KKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSBhIHdvcmtzaGVldC4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdFMicsICRjaGFydCApOworCis9YmFjaworCitTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+IGZvciBkZXRhaWxzIG9uIGhvdyB0byBjb25maWd1cmUgdGhlIGNoYXJ0IG9iamVjdCBvbmNlIGl0IGlzIGNyZWF0ZWQuIFNlZSBhbHNvIHRoZSBDPGNoYXJ0XyoucGw+IHByb2dyYW1zIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworCisKKworPWhlYWQyIGFkZF9jaGFydF9leHQoJGNoYXJ0X2RhdGEsICRjaGFydG5hbWUpCisKK1RoaXMgbWV0aG9kIGlzIHVzZSB0byBpbmNsdWRlIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGNoYXJ0cyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydF9leHQoJ2NoYXJ0MDEuYmluJywgJ0NoYXJ0MScpOworCitUaGlzIGZlYXR1cmUgaXMgc2VtaS1kZXByZWNhdGVkIGluIGZhdm91ciBvZiB0aGUgIm5hdGl2ZSIgY2hhcnRzIGNyZWF0ZWQgdXNpbmcgQzxhZGRfY2hhcnQoKT4uIFJlYWQgQzxleHRlcm5hbF9jaGFydHMudHh0PiAob3IgQzwucG9kPikgaW4gdGhlIGV4dGVybmFsX2NoYXJ0cyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYSBmdWxsIGV4cGxhbmF0aW9uLgorCisKKworCis9aGVhZDIgY2xvc2UoKQorCitJbiBnZW5lcmFsIHlvdXIgRXhjZWwgZmlsZSB3aWxsIGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5IHdoZW4geW91ciBwcm9ncmFtIGVuZHMgb3Igd2hlbiB0aGUgV29ya2Jvb2sgb2JqZWN0IGdvZXMgb3V0IG9mIHNjb3BlLCBob3dldmVyIHRoZSBDPGNsb3NlKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBleHBsaWNpdGx5IGNsb3NlIGFuIEV4Y2VsIGZpbGUuCisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKK0FuIGV4cGxpY2l0IEM8Y2xvc2UoKT4gaXMgcmVxdWlyZWQgaWYgdGhlIGZpbGUgbXVzdCBiZSBjbG9zZWQgcHJpb3IgdG8gcGVyZm9ybWluZyBzb21lIGV4dGVybmFsIGFjdGlvbiBvbiBpdCBzdWNoIGFzIGNvcHlpbmcgaXQsIHJlYWRpbmcgaXRzIHNpemUgb3IgYXR0YWNoaW5nIGl0IHRvIGFuIGVtYWlsLgorCitJbiBhZGRpdGlvbiwgQzxjbG9zZSgpPiBtYXkgYmUgcmVxdWlyZWQgdG8gcHJldmVudCBwZXJsJ3MgZ2FyYmFnZSBjb2xsZWN0b3IgZnJvbSBkaXNwb3Npbmcgb2YgdGhlIFdvcmtib29rLCBXb3Jrc2hlZXQgYW5kIEZvcm1hdCBvYmplY3RzIGluIHRoZSB3cm9uZyBvcmRlci4gU2l0dWF0aW9ucyB3aGVyZSB0aGlzIGNhbiBvY2N1ciBhcmU6CisKKz1vdmVyIDQKKworPWl0ZW0gKgorCitJZiBDPG15KCk+IHdhcyBub3QgdXNlZCB0byBkZWNsYXJlIHRoZSBzY29wZSBvZiBhIHdvcmtib29rIHZhcmlhYmxlIGNyZWF0ZWQgdXNpbmcgQzxuZXcoKT4uCisKKz1pdGVtICoKKworSWYgdGhlIEM8bmV3KCk+LCBDPGFkZF93b3Jrc2hlZXQoKT4gb3IgQzxhZGRfZm9ybWF0KCk+IG1ldGhvZHMgYXJlIGNhbGxlZCBpbiBzdWJyb3V0aW5lcy4KKworPWJhY2sKKworVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHJlbGllcyBvbiBQZXJsJ3MgQzxERVNUUk9ZPiBtZWNoYW5pc20gdG8gdHJpZ2dlciBkZXN0cnVjdG9yIG1ldGhvZHMgaW4gYSBzcGVjaWZpYyBzZXF1ZW5jZS4gVGhpcyBtYXkgbm90IGhhcHBlbiBpbiBjYXNlcyB3aGVyZSB0aGUgV29ya2Jvb2ssIFdvcmtzaGVldCBhbmQgRm9ybWF0IHZhcmlhYmxlcyBhcmUgbm90IGxleGljYWxseSBzY29wZWQgb3Igd2hlcmUgdGhleSBoYXZlIGRpZmZlcmVudCBsZXhpY2FsIHNjb3Blcy4KKworSW4gZ2VuZXJhbCwgaWYgeW91IGNyZWF0ZSBhIGZpbGUgd2l0aCBhIHNpemUgb2YgMCBieXRlcyBvciB5b3UgZmFpbCB0byBjcmVhdGUgYSBmaWxlIHlvdSBuZWVkIHRvIGNhbGwgQzxjbG9zZSgpPi4KKworVGhlIHJldHVybiB2YWx1ZSBvZiBDPGNsb3NlKCk+IGlzIHRoZSBzYW1lIGFzIHRoYXQgcmV0dXJuZWQgYnkgcGVybCB3aGVuIGl0IGNsb3NlcyB0aGUgZmlsZSBjcmVhdGVkIGJ5IEM8bmV3KCk+LiBUaGlzIGFsbG93cyB5b3UgdG8gaGFuZGxlIGVycm9yIGNvbmRpdGlvbnMgaW4gdGhlIHVzdWFsIHdheToKKworICAgICR3b3JrYm9vay0+Y2xvc2UoKSBvciBkaWUgIkVycm9yIGNsb3NpbmcgZmlsZTogJCEiOworCisKKworCis9aGVhZDIgY29tcGF0aWJpbGl0eV9tb2RlKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGlyZCBwYXJ0eSBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIEV4Y2VsIGZpbGVzLgorCisgICAgJHdvcmtib29rLT5jb21wYXRpYmlsaXR5X21vZGUoKTsKKworQW4gRXhjZWwgZmlsZSBpcyBjb21wcmlzZWQgb2YgYmluYXJ5IHJlY29yZHMgdGhhdCBkZXNjcmliZSBwcm9wZXJ0aWVzIG9mIGEgc3ByZWFkc2hlZXQuIEV4Y2VsIGlzIHJlYXNvbmFibHkgbGliZXJhbCBhYm91dCB0aGlzIGFuZCwgb3V0c2lkZSBvZiBhIGNvcmUgc3Vic2V0LCBpdCBkb2Vzbid0IHJlcXVpcmUgZXZlcnkgcG9zc2libGUgcmVjb3JkIHRvIGJlIHByZXNlbnQgd2hlbiBpdCByZWFkcyBhIGZpbGUuIFRoaXMgaXMgYWxzbyB0cnVlIG9mIEdudW1lcmljIGFuZCBPcGVuT2ZmaWNlLk9yZyBDYWxjLgorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBmYWN0IHRvIG9taXQgc29tZSByZWNvcmRzIGluIG9yZGVyIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgZGF0YSBzdG9yZWQgaW4gbWVtb3J5IGFuZCB0byBzaW1wbGlmeSBhbmQgc3BlZWQgdXAgdGhlIHdyaXRpbmcgb2YgZmlsZXMuIEhvd2V2ZXIsIHNvbWUgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIHRoYXQgcmVhZCBFeGNlbCBmaWxlcyBvZnRlbiBleHBlY3QgY2VydGFpbiByZWNvcmRzIHRvIGJlIHByZXNlbnQuIEluICJjb21wYXRpYmlsaXR5IG1vZGUiIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdyaXRlcyB0aGVzZSByZWNvcmRzIGFuZCB0cmllcyB0byBiZSBhcyBjbG9zZSB0byBhbiBFeGNlbCBnZW5lcmF0ZWQgZmlsZSBhcyBwb3NzaWJsZS4KKworQXBwbGljYXRpb25zIHRoYXQgcmVxdWlyZSBDPGNvbXBhdGliaWxpdHlfbW9kZSgpPiBhcmUgQXBhY2hlIFBPSSwgQXBwbGUgTnVtYmVycywgYW5kIFF1aWNrb2ZmaWNlIG9uIE5va2lhLCBQYWxtIGFuZCBvdGhlciBkZXZpY2VzLiBZb3Ugc2hvdWxkIGFsc28gdXNlIEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+IGlmIHlvdXIgRXhjZWwgZmlsZSB3aWxsIGJlIHVzZWQgYXMgYW4gZXh0ZXJuYWwgZGF0YSBzb3VyY2UgYnkgYW5vdGhlciBFeGNlbCBmaWxlLgorCitJZiB5b3UgZW5jb3VudGVyIG90aGVyIHNpdHVhdGlvbnMgdGhhdCByZXF1aXJlIEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+LCBwbGVhc2UgbGV0IG1lIGtub3cuCisKK0l0IHNob3VsZCBiZSBub3RlZCB0aGF0IEM8Y29tcGF0aWJpbGl0eV9tb2RlKCk+IHJlcXVpcmVzIGFkZGl0aW9uYWwgZGF0YSB0byBiZSBzdG9yZWQgaW4gbWVtb3J5IGFuZCBhZGRpdGlvbmFsIHByb2Nlc3NpbmcuIFRoaXMgaW5jdXJzIGEgbWVtb3J5IGFuZCBzcGVlZCBwZW5hbHR5IGFuZCBtYXkgbm90IGJlIHN1aXRhYmxlIGZvciB2ZXJ5IGxhcmdlIGZpbGVzICg+MjBNQikuCisKK1lvdSBtdXN0IGNhbGwgQzxjb21wYXRpYmlsaXR5X21vZGUoKT4gYmVmb3JlIGNhbGxpbmcgQzxhZGRfd29ya3NoZWV0KCk+LgorCisKKworCis9aGVhZDIgc2V0X3Byb3BlcnRpZXMoKQorCitUaGUgQzxzZXRfcHJvcGVydGllcz4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgZG9jdW1lbnQgcHJvcGVydGllcyBvZiB0aGUgRXhjZWwgZmlsZSBjcmVhdGVkIGJ5IEM8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGVzZSBwcm9wZXJ0aWVzIGFyZSB2aXNpYmxlIHdoZW4geW91IHVzZSB0aGUgQzw8IEZpbGUtPlByb3BlcnRpZXMgPj4gbWVudSBvcHRpb24gaW4gRXhjZWwgYW5kIGFyZSBhbHNvIGF2YWlsYWJsZSB0byBleHRlcm5hbCBhcHBsaWNhdGlvbnMgdGhhdCByZWFkIG9yIGluZGV4IHdpbmRvd3MgZmlsZXMuCisKK1RoZSBwcm9wZXJ0aWVzIHNob3VsZCBiZSBwYXNzZWQgYXMgYSBoYXNoIG9mIHZhbHVlcyBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgdGl0bGUgICAgPT4gJ1RoaXMgaXMgYW4gZXhhbXBsZSBzcHJlYWRzaGVldCcsCisgICAgICAgIGF1dGhvciAgID0+ICdKb2huIE1jTmFtYXJhJywKKyAgICAgICAgY29tbWVudHMgPT4gJ0NyZWF0ZWQgd2l0aCBQZXJsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCcsCisgICAgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworICAgIHRpdGxlCisgICAgc3ViamVjdAorICAgIGF1dGhvcgorICAgIG1hbmFnZXIKKyAgICBjb21wYW55CisgICAgY2F0ZWdvcnkKKyAgICBrZXl3b3JkcworICAgIGNvbW1lbnRzCisKK1VzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIGR1ZSB0byBlZmZvcnQgcmVxdWlyZWQuCisKK0luIHBlcmwgNS44KyB5b3UgY2FuIGFsc28gcGFzcyBVVEYtOCBzdHJpbmdzIGFzIHByb3BlcnRpZXMuIFNlZSBMPFVOSUNPREUgSU4gRVhDRUw+LgorCisgICAgbXkgJHNtaWxleSA9IGNociAweDI2M0E7CisKKyAgICAkd29ya2Jvb2stPnNldF9wcm9wZXJ0aWVzKAorICAgICAgICBzdWJqZWN0ID0+ICJIYXBweSBub3c/ICRzbWlsZXkiLAorICAgICk7CisKK1dpdGggb2xkZXIgdmVyc2lvbnMgb2YgcGVybCB5b3UgY2FuIHVzZSBhIG1vZHVsZSB0byBjb252ZXJ0IGEgbm9uLUFTQ0lJIHN0cmluZyB0byBhIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiBVVEYtOCBhbmQgdGhlbiBwYXNzIGFuIGFkZGl0aW9uYWwgQzx1dGY4PiBmbGFnIHRvIEM8c2V0X3Byb3BlcnRpZXMoKT46CisKKyAgICBteSAkc21pbGV5ID0gcGFjayAnSConLCAnRTI5OEJBJzsKKworICAgICR3b3JrYm9vay0+c2V0X3Byb3BlcnRpZXMoCisgICAgICAgIHN1YmplY3QgPT4gIkhhcHB5IG5vdz8gJHNtaWxleSIsCisgICAgICAgIHV0ZjggICAgPT4gMSwKKyAgICApOworCitVc3VhbGx5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFsbG93cyB5b3UgdG8gdXNlIFVURi0xNiB3aXRoIHByZSA1LjggdmVyc2lvbnMgb2YgcGVybC4gSG93ZXZlciwgZG9jdW1lbnQgcHJvcGVydGllcyBkb24ndCBzdXBwb3J0IFVURi0xNiBmb3IgdGhlc2UgdHlwZSBvZiBzdHJpbmdzLgorCitJbiBvcmRlciB0byBwcm9tb3RlIHRoZSB1c2VmdWxuZXNzIG9mIFBlcmwgYW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgY29uc2lkZXIgYWRkaW5nIGEgY29tbWVudCBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgd2hlbiB1c2luZyBkb2N1bWVudCBwcm9wZXJ0aWVzOgorCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgLi4uLAorICAgICAgICBjb21tZW50cyA9PiAnQ3JlYXRlZCB3aXRoIFBlcmwgYW5kIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJywKKyAgICAgICAgLi4uLAorICAgICk7CisKK1RoaXMgZmVhdHVyZSByZXF1aXJlcyB0aGF0IHRoZSBDPE9MRTo6U3RvcmFnZV9MaXRlPiBtb2R1bGUgaXMgaW5zdGFsbGVkICh3aGljaCBpcyB1c3VhbGx5IHRoZSBjYXNlIGZvciBhIHN0YW5kYXJkIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGluc3RhbGxhdGlvbikuIEhvd2V2ZXIsIHRoaXMgYWxzbyBtZWFucyB0aGF0IHRoZSByZXN1bHRpbmcgT0xFIGRvY3VtZW50IG1heSBCPHBvc3NpYmx5PiBiZSBidWdneSBmb3IgZmlsZXMgbGVzcyB0aGFuIDdNQiBzaW5jZSBpdCBoYXNuJ3QgYmVlbiBhcyByaWdvcm91c2x5IHRlc3RlZCBpbiB0aGF0IGRvbWFpbi4gQXMgYSByZXN1bHQgb2YgdGhpcyBDPHNldF9wcm9wZXJ0aWVzPiBpcyBjdXJyZW50bHkgaW5jb21wYXRpYmxlIHdpdGggR251bWVyaWMgZm9yIGZpbGVzIGxlc3MgdGhhbiA3TUIuIFRoaXMgaXMgYmVpbmcgaW52ZXN0aWdhdGVkLiBJZiB5b3UgZW5jb3VudGVyIGFueSBwcm9ibGVtcyB3aXRoIHRoaXMgZmVhdHVyZXMgbGV0IG1lIGtub3cuCisKK0ZvciBjb252ZW5pZW5jZSBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGVpdGhlciBhIGhhc2ggb3IgaGFzaCByZWYgb2YgYXJndW1lbnRzIHRvIHRoaXMgbWV0aG9kLgorCitTZWUgYWxzbyB0aGUgQzxwcm9wZXJ0aWVzLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworCisKKworPWhlYWQyIGRlZmluZV9uYW1lKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZWZpbmVkIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlLCBhIHNpbmdsZSBjZWxsIG9yIGEgcmFuZ2Ugb2YgY2VsbHMgaW4gYSB3b3JrYm9vay4KKworICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ0V4Y2hhbmdlX3JhdGUnLCAnPTAuOTYnKTsKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdTYWxlcycsICAgICAgICAgJz1TaGVldDEhJEckMTokSCQxMCcpOworICAgICR3b3JrYm9vay0+ZGVmaW5lX25hbWUoJ1NoZWV0MiFTYWxlcycsICAnPVNoZWV0MiEkRyQxOiRHJDEwJyk7CisKK1NlZSB0aGUgZGVmaW5lZF9uYW1lLnBsIHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpciBvZiB0aGUgZGlzdHJvLgorCitOb3RlOiBUaGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZS4gTW9yZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyB3aWxsIGJlIGFkZGVkLgorCisKKworCis9aGVhZDIgc2V0X3RlbXBkaXIoKQorCitGb3Igc3BlZWQgYW5kIGVmZmljaWVuY3kgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gc3RvcmVzIHdvcmtzaGVldCBkYXRhIGluIHRlbXBvcmFyeSBmaWxlcyBwcmlvciB0byBhc3NlbWJsaW5nIHRoZSBmaW5hbCB3b3JrYm9vay4KKworSWYgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaXMgdW5hYmxlIHRvIGNyZWF0ZSB0aGVzZSB0ZW1wb3JhcnkgZmlsZXMgaXQgd2lsbCBzdG9yZSB0aGUgcmVxdWlyZWQgZGF0YSBpbiBtZW1vcnkuIFRoaXMgY2FuIGJlIHNsb3cgZm9yIGxhcmdlIGZpbGVzLgorCitUaGUgcHJvYmxlbSBvY2N1cnMgbWFpbmx5IHdpdGggSUlTIG9uIFdpbmRvd3MgYWx0aG91Z2ggaXQgY291bGQgZmVhc2libHkgb2NjdXIgb24gVW5peCBzeXN0ZW1zIGFzIHdlbGwuIFRoZSBwcm9ibGVtIGdlbmVyYWxseSBvY2N1cnMgYmVjYXVzZSB0aGUgZGVmYXVsdCB0ZW1wIGZpbGUgZGlyZWN0b3J5IGlzIGRlZmluZWQgYXMgQzxDOi8+IG9yIHNvbWUgb3RoZXIgZGlyZWN0b3J5IHRoYXQgSUlTIGRvZXNuJ3QgcHJvdmlkZSB3cml0ZSBhY2Nlc3MgdG8uCisKK1RvIGNoZWNrIGlmIHRoaXMgbWlnaHQgYmUgYSBwcm9ibGVtIG9uIGEgcGFydGljdWxhciBzeXN0ZW0geW91IGNhbiBydW4gYSBzaW1wbGUgdGVzdCBwcm9ncmFtIHdpdGggQzwtdz4gb3IgQzx1c2Ugd2FybmluZ3M+LiBUaGlzIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIGlmIHRoZSBtb2R1bGUgY2Fubm90IGNyZWF0ZSB0aGUgcmVxdWlyZWQgdGVtcG9yYXJ5IGZpbGVzOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygndGVzdC54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKK1RvIGF2b2lkIHRoaXMgcHJvYmxlbSB0aGUgQzxzZXRfdGVtcGRpcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGRpcmVjdG9yeSB0aGF0IGlzIGFjY2Vzc2libGUgZm9yIHRoZSBjcmVhdGlvbiBvZiB0ZW1wb3JhcnkgZmlsZXMuCisKK1RoZSBDPEZpbGU6OlRlbXA+IG1vZHVsZSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVzLiBGaWxlOjpUZW1wIHVzZXMgQzxGaWxlOjpTcGVjPiB0byBkZXRlcm1pbmUgYW4gYXBwcm9wcmlhdGUgbG9jYXRpb24gZm9yIHRoZXNlIGZpbGVzIHN1Y2ggYXMgQzwvdG1wPiBvciBDPGM6XHdpbmRvd3NcdGVtcD4uIFlvdSBjYW4gZmluZCBvdXQgd2hpY2ggZGlyZWN0b3J5IGlzIHVzZWQgb24geW91ciBzeXN0ZW0gYXMgZm9sbG93czoKKworICAgIHBlcmwgLU1GaWxlOjpTcGVjIC1sZSAicHJpbnQgRmlsZTo6U3BlYy0+dG1wZGlyIgorCitFdmVuIGlmIHRoZSBkZWZhdWx0IHRlbXBvcmFyeSBmaWxlIGRpcmVjdG9yeSBpcyBhY2Nlc3NpYmxlIHlvdSBtYXkgd2lzaCB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxvY2F0aW9uIGZvciBzZWN1cml0eSBvciBtYWludGVuYW5jZSByZWFzb25zOgorCisgICAgJHdvcmtib29rLT5zZXRfdGVtcGRpcignL3RtcC93cml0ZWV4Y2VsJyk7CisgICAgJHdvcmtib29rLT5zZXRfdGVtcGRpcignYzpcd2luZG93c1x0ZW1wXHdyaXRlZXhjZWwnKTsKKworVGhlIGRpcmVjdG9yeSBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlIG11c3QgZXhpc3QsIEM8c2V0X3RlbXBkaXIoKT4gd2lsbCBub3QgY3JlYXRlIGEgbmV3IGRpcmVjdG9yeS4KKworT25lIGRpc2FkdmFudGFnZSBvZiB1c2luZyB0aGUgQzxzZXRfdGVtcGRpcigpPiBtZXRob2QgaXMgdGhhdCBvbiBzb21lIFdpbmRvd3Mgc3lzdGVtcyBpdCB3aWxsIGxpbWl0IHlvdSB0byBhcHByb3hpbWF0ZWx5IDgwMCBjb25jdXJyZW50IHRlbXBmaWxlcy4gVGhpcyBtZWFucyB0aGF0IGEgc2luZ2xlIHByb2dyYW0gcnVubmluZyBvbiBvbmUgb2YgdGhlc2Ugc3lzdGVtcyB3aWxsIGJlIGxpbWl0ZWQgdG8gY3JlYXRpbmcgYSB0b3RhbCBvZiA4MDAgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCBvYmplY3RzLiBZb3UgY2FuIHJ1biBtdWx0aXBsZSwgbm9uLWNvbmN1cnJlbnQgcHJvZ3JhbXMgdG8gd29yayBhcm91bmQgdGhpcyBpZiBuZWNlc3NhcnkuCisKKworCisKKz1oZWFkMiBzZXRfY3VzdG9tX2NvbG9yKCRpbmRleCwgJHJlZCwgJGdyZWVuLCAkYmx1ZSkKKworVGhlIEM8c2V0X2N1c3RvbV9jb2xvcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgb25lIG9mIHRoZSBidWlsdC1pbiBwYWxldHRlIHZhbHVlcyB3aXRoIGEgbW9yZSBzdWl0YWJsZSBjb2xvdXIuCisKK1RoZSB2YWx1ZSBmb3IgQzwkaW5kZXg+IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uNjMsIHNlZSBMPENPTE9VUlMgSU4gRVhDRUw+LgorCitUaGUgZGVmYXVsdCBuYW1lZCBjb2xvdXJzIHVzZSB0aGUgZm9sbG93aW5nIGluZGljZXM6CisKKyAgICAgOCAgID0+ICAgYmxhY2sKKyAgICAgOSAgID0+ICAgd2hpdGUKKyAgICAxMCAgID0+ICAgcmVkCisgICAgMTEgICA9PiAgIGxpbWUKKyAgICAxMiAgID0+ICAgYmx1ZQorICAgIDEzICAgPT4gICB5ZWxsb3cKKyAgICAxNCAgID0+ICAgbWFnZW50YQorICAgIDE1ICAgPT4gICBjeWFuCisgICAgMTYgICA9PiAgIGJyb3duCisgICAgMTcgICA9PiAgIGdyZWVuCisgICAgMTggICA9PiAgIG5hdnkKKyAgICAyMCAgID0+ICAgcHVycGxlCisgICAgMjIgICA9PiAgIHNpbHZlcgorICAgIDIzICAgPT4gICBncmF5CisgICAgMzMgICA9PiAgIHBpbmsKKyAgICA1MyAgID0+ICAgb3JhbmdlCisKK0EgbmV3IGNvbG91ciBpcyBzZXQgdXNpbmcgaXRzIFJHQiAocmVkIGdyZWVuIGJsdWUpIGNvbXBvbmVudHMuIFRoZSBDPCRyZWQ+LCBDPCRncmVlbj4gYW5kIEM8JGJsdWU+IHZhbHVlcyBtdXN0IGJlIGluIHRoZSByYW5nZSAwLi4yNTUuIFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSByZXF1aXJlZCB2YWx1ZXMgaW4gRXhjZWwgdXNpbmcgdGhlIEM8VG9vbHMtRTxndD5PcHRpb25zLUU8Z3Q+Q29sb3JzLUU8Z3Q+TW9kaWZ5PiBkaWFsb2cuCisKK1RoZSBDPHNldF9jdXN0b21fY29sb3IoKT4gd29ya2Jvb2sgbWV0aG9kIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBhIEhUTUwgc3R5bGUgQzwjcnJnZ2JiPiBoZXggdmFsdWU6CisKKyAgICAkd29ya2Jvb2stPnNldF9jdXN0b21fY29sb3IoNDAsIDI1NSwgIDEwMiwgIDAgICApOyAjIE9yYW5nZQorICAgICR3b3JrYm9vay0+c2V0X2N1c3RvbV9jb2xvcig0MCwgMHhGRiwgMHg2NiwgMHgwMCk7ICMgU2FtZSB0aGluZworICAgICR3b3JrYm9vay0+c2V0X2N1c3RvbV9jb2xvcig0MCwgJyNGRjY2MDAnICAgICAgICk7ICMgU2FtZSB0aGluZworCisgICAgbXkgJGZvbnQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gNDApOyAjIFVzZSB0aGUgbW9kaWZpZWQgY29sb3VyCisKK1RoZSByZXR1cm4gdmFsdWUgZnJvbSBDPHNldF9jdXN0b21fY29sb3IoKT4gaXMgdGhlIGluZGV4IG9mIHRoZSBjb2xvdXIgdGhhdCB3YXMgY2hhbmdlZDoKKworICAgIG15ICRmZXJyYXJpID0gJHdvcmtib29rLT5zZXRfY3VzdG9tX2NvbG9yKDQwLCAyMTYsIDEyLCAxMik7CisKKyAgICBteSAkZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19jb2xvciA9PiAkZmVycmFyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisKKworPWhlYWQyIHNoZWV0cygwLCAxLCAuLi4pCisKK1RoZSBDPHNoZWV0cygpPiBtZXRob2QgcmV0dXJucyBhIGxpc3QsIG9yIGEgc2xpY2VkIGxpc3QsIG9mIHRoZSB3b3Jrc2hlZXRzIGluIGEgd29ya2Jvb2suCisKK0lmIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRoZSBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRoZSB3b3Jrc2hlZXRzIGluIHRoZSB3b3JrYm9vay4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gcmVwZWF0IGFuIG9wZXJhdGlvbiBvbiBlYWNoIHdvcmtzaGVldDoKKworICAgIGZvcmVhY2ggJHdvcmtzaGVldCAoJHdvcmtib29rLT5zaGVldHMoKSkgeworICAgICAgIHByaW50ICR3b3Jrc2hlZXQtPmdldF9uYW1lKCk7CisgICAgfQorCisKK1lvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgc2xpY2UgbGlzdCB0byByZXR1cm4gb25lIG9yIG1vcmUgd29ya3NoZWV0IG9iamVjdHM6CisKKyAgICAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5zaGVldHMoMCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7CisKKworT3Igc2luY2UgcmV0dXJuIHZhbHVlIGZyb20gQzxzaGVldHMoKT4gaXMgYSByZWZlcmVuY2UgdG8gYSB3b3Jrc2hlZXQgb2JqZWN0IHlvdSBjYW4gd3JpdGUgdGhlIGFib3ZlIGV4YW1wbGUgYXM6CisKKyAgICAkd29ya2Jvb2stPnNoZWV0cygwKS0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7CisKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHJldHVybnMgdGhlIGZpcnN0IGFuZCBsYXN0IHdvcmtzaGVldCBpbiBhIHdvcmtib29rOgorCisgICAgZm9yZWFjaCAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygwLCAtMSkpIHsKKyAgICAgICAjIERvIHNvbWV0aGluZworICAgIH0KKworCitBcnJheSBzbGljZXMgYXJlIGV4cGxhaW5lZCBpbiB0aGUgcGVybGRhdGEgbWFucGFnZS4KKworCisKKworPWhlYWQyIHNldF8xOTA0KCkKKworRXhjZWwgc3RvcmVzIGRhdGVzIGFzIHJlYWwgbnVtYmVycyB3aGVyZSB0aGUgaW50ZWdlciBwYXJ0IHN0b3JlcyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoIGFuZCB0aGUgZnJhY3Rpb25hbCBwYXJ0IHN0b3JlcyB0aGUgcGVyY2VudGFnZSBvZiB0aGUgZGF5LiBUaGUgZXBvY2ggY2FuIGJlIGVpdGhlciAxOTAwIG9yIDE5MDQuIEV4Y2VsIGZvciBXaW5kb3dzIHVzZXMgMTkwMCBhbmQgRXhjZWwgZm9yIE1hY2ludG9zaCB1c2VzIDE5MDQuIEhvd2V2ZXIsIEV4Y2VsIG9uIGVpdGhlciBwbGF0Zm9ybSB3aWxsIGNvbnZlcnQgYXV0b21hdGljYWxseSBiZXR3ZWVuIG9uZSBzeXN0ZW0gYW5kIHRoZSBvdGhlci4KKworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgc3RvcmVzIGRhdGVzIGluIHRoZSAxOTAwIGZvcm1hdCBieSBkZWZhdWx0LiBJZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhpcyB5b3UgY2FuIGNhbGwgdGhlIEM8c2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLiBZb3UgY2FuIHF1ZXJ5IHRoZSBjdXJyZW50IHZhbHVlIGJ5IGNhbGxpbmcgdGhlIEM8Z2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLiBUaGlzIHJldHVybnMgMCBmb3IgMTkwMCBhbmQgMSBmb3IgMTkwNC4KKworU2VlIGFsc28gTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd29ya2luZyB3aXRoIEV4Y2VsJ3MgZGF0ZSBzeXN0ZW0uCisKK0luIGdlbmVyYWwgeW91IHByb2JhYmx5IHdvbid0IG5lZWQgdG8gdXNlIEM8c2V0XzE5MDQoKT4uCisKKworCisKKz1oZWFkMiBzZXRfY29kZXBhZ2UoJGNvZGVwYWdlKQorCitUaGUgZGVmYXVsdCBjb2RlIHBhZ2Ugb3IgY2hhcmFjdGVyIHNldCB1c2VkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGlzIEFOU0kuIFRoaXMgaXMgYWxzbyB0aGUgZGVmYXVsdCB1c2VkIGJ5IEV4Y2VsIGZvciBXaW5kb3dzLiBPY2Nhc2lvbmFsbHkgaG93ZXZlciBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIGNoYW5nZSB0aGUgY29kZSBwYWdlIHZpYSB0aGUgQzxzZXRfY29kZXBhZ2UoKT4gbWV0aG9kLgorCitDaGFuZ2luZyB0aGUgY29kZSBwYWdlIG1heSBiZSByZXF1aXJlZCBpZiB5b3VyIGFyZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBvbiB0aGUgTWFjaW50b3NoIGFuZCB5b3UgYXJlIHVzaW5nIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgQVNDSUkgMTI4IGNoYXJhY3RlciBzZXQ6CisKKyAgICAkd29ya2Jvb2stPnNldF9jb2RlcGFnZSgxKTsgIyBBTlNJLCBNUyBXaW5kb3dzCisgICAgJHdvcmtib29rLT5zZXRfY29kZXBhZ2UoMik7ICMgQXBwbGUgTWFjaW50b3NoCisKK1RoZSBDPHNldF9jb2RlcGFnZSgpPiBtZXRob2QgaXMgcmFyZWx5IHJlcXVpcmVkLgorCisKKworCis9aGVhZDEgV09SS1NIRUVUIE1FVEhPRFMKKworQSBuZXcgd29ya3NoZWV0IGlzIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgQzxhZGRfd29ya3NoZWV0KCk+IG1ldGhvZCBmcm9tIGEgd29ya2Jvb2sgb2JqZWN0OgorCisgICAgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGEgbmV3IHdvcmtzaGVldDoKKworICAgIHdyaXRlKCkKKyAgICB3cml0ZV9udW1iZXIoKQorICAgIHdyaXRlX3N0cmluZygpCisgICAgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKQorICAgIHdyaXRlX3V0ZjE2bGVfc3RyaW5nKCkKKyAgICBrZWVwX2xlYWRpbmdfemVyb3MoKQorICAgIHdyaXRlX2JsYW5rKCkKKyAgICB3cml0ZV9yb3coKQorICAgIHdyaXRlX2NvbCgpCisgICAgd3JpdGVfZGF0ZV90aW1lKCkKKyAgICB3cml0ZV91cmwoKQorICAgIHdyaXRlX3VybF9yYW5nZSgpCisgICAgd3JpdGVfZm9ybXVsYSgpCisgICAgc3RvcmVfZm9ybXVsYSgpCisgICAgcmVwZWF0X2Zvcm11bGEoKQorICAgIHdyaXRlX2NvbW1lbnQoKQorICAgIHNob3dfY29tbWVudHMoKQorICAgIGFkZF93cml0ZV9oYW5kbGVyKCkKKyAgICBpbnNlcnRfaW1hZ2UoKQorICAgIGluc2VydF9jaGFydCgpCisgICAgZGF0YV92YWxpZGF0aW9uKCkKKyAgICBnZXRfbmFtZSgpCisgICAgYWN0aXZhdGUoKQorICAgIHNlbGVjdCgpCisgICAgaGlkZSgpCisgICAgc2V0X2ZpcnN0X3NoZWV0KCkKKyAgICBwcm90ZWN0KCkKKyAgICBzZXRfc2VsZWN0aW9uKCkKKyAgICBzZXRfcm93KCkKKyAgICBzZXRfY29sdW1uKCkKKyAgICBvdXRsaW5lX3NldHRpbmdzKCkKKyAgICBmcmVlemVfcGFuZXMoKQorICAgIHNwbGl0X3BhbmVzKCkKKyAgICBtZXJnZV9yYW5nZSgpCisgICAgc2V0X3pvb20oKQorICAgIHJpZ2h0X3RvX2xlZnQoKQorICAgIGhpZGVfemVybygpCisgICAgc2V0X3RhYl9jb2xvcigpCisgICAgYXV0b2ZpbHRlcigpCisKKworCisKKz1oZWFkMiBDZWxsIG5vdGF0aW9uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHN1cHBvcnRzIHR3byBmb3JtcyBvZiBub3RhdGlvbiB0byBkZXNpZ25hdGUgdGhlIHBvc2l0aW9uIG9mIGNlbGxzOiBSb3ctY29sdW1uIG5vdGF0aW9uIGFuZCBBMSBub3RhdGlvbi4KKworUm93LWNvbHVtbiBub3RhdGlvbiB1c2VzIGEgemVybyBiYXNlZCBpbmRleCBmb3IgYm90aCByb3cgYW5kIGNvbHVtbiB3aGlsZSBBMSBub3RhdGlvbiB1c2VzIHRoZSBzdGFuZGFyZCBFeGNlbCBhbHBoYW51bWVyaWMgc2VxdWVuY2Ugb2YgY29sdW1uIGxldHRlciBhbmQgMS1iYXNlZCByb3cuIEZvciBleGFtcGxlOgorCisgICAgKDAsIDApICAgICAgIyBUaGUgdG9wIGxlZnQgY2VsbCBpbiByb3ctY29sdW1uIG5vdGF0aW9uLgorICAgICgnQTEnKSAgICAgICMgVGhlIHRvcCBsZWZ0IGNlbGwgaW4gQTEgbm90YXRpb24uCisKKyAgICAoMTk5OSwgMjkpICAjIFJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgKCdBRDIwMDAnKSAgIyBUaGUgc2FtZSBjZWxsIGluIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlZmVycmluZyB0byBjZWxscyBwcm9ncmFtbWF0aWNhbGx5OgorCisgICAgZm9yIG15ICRpICgwIC4uIDkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICdIZWxsbycpOyAjIENlbGxzIEExIHRvIEExMAorICAgIH0KKworQTEgbm90YXRpb24gaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEgd29ya3NoZWV0IG1hbnVhbGx5IGFuZCBmb3Igd29ya2luZyB3aXRoIGZvcm11bGFzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0gxJywgMjAwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnPUgxKzEnKTsKKworSW4gZm9ybXVsYXMgYW5kIGFwcGxpY2FibGUgbWV0aG9kcyB5b3UgY2FuIGFsc28gdXNlIHRoZSBDPEE6QT4gY29sdW1uIG5vdGF0aW9uOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oQjpCKScpOworCitUaGUgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworCisgICAgKCRyb3csICRjb2wpICAgID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCitGb3Igc2ltcGxpY2l0eSwgdGhlIHBhcmFtZXRlciBsaXN0cyBmb3IgdGhlIHdvcmtzaGVldCBtZXRob2QgY2FsbHMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBhcmUgZ2l2ZW4gaW4gdGVybXMgb2Ygcm93LWNvbHVtbiBub3RhdGlvbi4gSW4gYWxsIGNhc2VzIGl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIEExIG5vdGF0aW9uLgorCitOb3RlOiBpbiBFeGNlbCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBhIFIxQzEgbm90YXRpb24uIFRoaXMgaXMgbm90IHN1cHBvcnRlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKworPWhlYWQyIHdyaXRlKCRyb3csICRjb2x1bW4sICR0b2tlbiwgJGZvcm1hdCkKKworRXhjZWwgbWFrZXMgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGRhdGEgdHlwZXMgc3VjaCBhcyBzdHJpbmdzLCBudW1iZXJzLCBibGFua3MsIGZvcm11bGFzIGFuZCBoeXBlcmxpbmtzLiBUbyBzaW1wbGlmeSB0aGUgcHJvY2VzcyBvZiB3cml0aW5nIGRhdGEgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGFjdHMgYXMgYSBnZW5lcmFsIGFsaWFzIGZvciBzZXZlcmFsIG1vcmUgc3BlY2lmaWMgbWV0aG9kczoKKworICAgIHdyaXRlX3N0cmluZygpCisgICAgd3JpdGVfbnVtYmVyKCkKKyAgICB3cml0ZV9ibGFuaygpCisgICAgd3JpdGVfZm9ybXVsYSgpCisgICAgd3JpdGVfdXJsKCkKKyAgICB3cml0ZV9yb3coKQorICAgIHdyaXRlX2NvbCgpCisKK1RoZSBnZW5lcmFsIHJ1bGUgaXMgdGhhdCBpZiB0aGUgZGF0YSBsb29rcyBsaWtlIGEgSTxzb21ldGhpbmc+IHRoZW4gYSBJPHNvbWV0aGluZz4gaXMgd3JpdHRlbi4gSGVyZSBhcmUgc29tZSBleGFtcGxlcyBpbiBib3RoIHJvdy1jb2x1bW4gYW5kIEExIG5vdGF0aW9uOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNhbWUgYXM6CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ0hlbGxvJyAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJ09uZScgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgIDIgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgIDMuMDAwMDEgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgICIiICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX2JsYW5rKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAwLCAgJycgICAgICAgICAgICAgICAgICAgICk7ICMgd3JpdGVfYmxhbmsoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsIDAsICB1bmRlZiAgICAgICAgICAgICAgICAgKTsgIyB3cml0ZV9ibGFuaygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMCAgICAgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX2JsYW5rKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJ2h0dHA6Ly93d3cucGVybC5jb20vJyk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgJ2Z0cDovL2Z0cC5jcGFuLm9yZy8nICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEwJywgJ2ludGVybmFsOlNoZWV0MSFBMScgICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTExJywgJ2V4dGVybmFsOmM6XGZvby54bHMnICk7ICMgd3JpdGVfdXJsKCkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEyJywgJz1BMyArIDMqQTQnICAgICAgICAgICk7ICMgd3JpdGVfZm9ybXVsYSgpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMycsICc9U0lOKFBJKCkvNCknICAgICAgICApOyAjIHdyaXRlX2Zvcm11bGEoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTQnLCBcQGFycmF5ICAgICAgICAgICAgICAgKTsgIyB3cml0ZV9yb3coKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTUnLCBbXEBhcnJheV0gICAgICAgICAgICAgKTsgIyB3cml0ZV9jb2woKQorCisgICAgIyBBbmQgaWYgdGhlIGtlZXBfbGVhZGluZ196ZXJvcyBwcm9wZXJ0eSBpcyBzZXQ6CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExNiwgIDIgICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX251bWJlcigpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExNywgIDAyICAgICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExOCwgIDAwMDAyICAgICAgICAgICAgICAgICApOyAjIHdyaXRlX3N0cmluZygpCisKKworVGhlICJsb29rcyBsaWtlIiBydWxlIGlzIGRlZmluZWQgYnkgcmVndWxhciBleHByZXNzaW9uczoKKworQzx3cml0ZV9udW1iZXIoKT4gaWYgQzwkdG9rZW4+IGlzIGEgbnVtYmVyIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgcmVnZXg6IEM8JHRva2VuID1+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvPi4KKworQzx3cml0ZV9zdHJpbmcoKT4gaWYgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gaXMgc2V0IGFuZCBDPCR0b2tlbj4gaXMgYW4gaW50ZWdlciB3aXRoIGxlYWRpbmcgemVyb3MgYmFzZWQgb24gdGhlIGZvbGxvd2luZyByZWdleDogQzwkdG9rZW4gPX4gL14wXGQrJC8+LgorCitDPHdyaXRlX2JsYW5rKCk+IGlmIEM8JHRva2VuPiBpcyB1bmRlZiBvciBhIGJsYW5rIHN0cmluZzogQzx1bmRlZj4sIEM8IiI+IG9yIEM8Jyc+LgorCitDPHdyaXRlX3VybCgpPiBpZiBDPCR0b2tlbj4gaXMgYSBodHRwLCBodHRwcywgZnRwIG9yIG1haWx0byBVUkwgYmFzZWQgb24gdGhlIGZvbGxvd2luZyByZWdleGVzOiBDPCR0b2tlbiA9fiBtfF5bZmhddHQ/cHM/Oi8vfD4gb3IgIEM8JHRva2VuID1+IG18Xm1haWx0bzp8Pi4KKworQzx3cml0ZV91cmwoKT4gaWYgQzwkdG9rZW4+IGlzIGFuIGludGVybmFsIG9yIGV4dGVybmFsIHNoZWV0IHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHJlZ2V4OiBDPCR0b2tlbiA9fiBtW14oaW58ZXgpdGVybmFsOl0+LgorCitDPHdyaXRlX2Zvcm11bGEoKT4gaWYgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBDPCR0b2tlbj4gaXMgQzwiPSI+LgorCitDPHdyaXRlX3JvdygpPiBpZiBDPCR0b2tlbj4gaXMgYW4gYXJyYXkgcmVmLgorCitDPHdyaXRlX2NvbCgpPiBpZiBDPCR0b2tlbj4gaXMgYW4gYXJyYXkgcmVmIG9mIGFycmF5IHJlZnMuCisKK0M8d3JpdGVfc3RyaW5nKCk+IGlmIG5vbmUgb2YgdGhlIHByZXZpb3VzIGNvbmRpdGlvbnMgYXBwbHkuCisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSXQgc2hvdWxkIGJlIGEgdmFsaWQgRm9ybWF0IG9iamVjdCwgc2VlIEw8Q0VMTCBGT1JNQVRUSU5HPjoKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJGZvcm1hdC0+c2V0X2FsaWduKCdjZW50ZXInKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICdIZWxsbycsICRmb3JtYXQpOyAjIEZvcm1hdHRlZCBzdHJpbmcKKworVGhlIHdyaXRlKCkgbWV0aG9kIHdpbGwgaWdub3JlIGVtcHR5IHN0cmluZ3Mgb3IgQzx1bmRlZj4gdG9rZW5zIHVubGVzcyBhIGZvcm1hdCBpcyBhbHNvIHN1cHBsaWVkLiBBcyBzdWNoIHlvdSBuZWVkbid0IHdvcnJ5IGFib3V0IHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVtcHR5IG9yIEM8dW5kZWY+IHZhbHVlcyBpbiB5b3VyIGRhdGEuIFNlZSBhbHNvIHRoZSBDPHdyaXRlX2JsYW5rKCk+IG1ldGhvZC4KKworT25lIHByb2JsZW0gd2l0aCB0aGUgQzx3cml0ZSgpPiBtZXRob2QgaXMgdGhhdCBvY2Nhc2lvbmFsbHkgZGF0YSBsb29rcyBsaWtlIGEgbnVtYmVyIGJ1dCB5b3UgZG9uJ3Qgd2FudCBpdCB0cmVhdGVkIGFzIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgemlwIGNvZGVzIG9yIElEIG51bWJlcnMgb2Z0ZW4gc3RhcnQgd2l0aCBhIGxlYWRpbmcgemVyby4gSWYgeW91IHdyaXRlIHRoaXMgZGF0YSBhcyBhIG51bWJlciB0aGVuIHRoZSBsZWFkaW5nIHplcm8ocykgd2lsbCBiZSBzdHJpcHBlZC4gWW91IGNhbiBjaGFuZ2UgdGhpcyBkZWZhdWx0IGJlaGF2aW91ciBieSB1c2luZyB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kLiBXaGlsZSB0aGlzIHByb3BlcnR5IGlzIGluIHBsYWNlIGFueSBpbnRlZ2VycyB3aXRoIGxlYWRpbmcgemVyb3Mgd2lsbCBiZSB0cmVhdGVkIGFzIHN0cmluZ3MgYW5kIHRoZSB6ZXJvcyB3aWxsIGJlIHByZXNlcnZlZC4gU2VlIHRoZSBDPGtlZXBfbGVhZGluZ196ZXJvcygpPiBzZWN0aW9uIGZvciBhIGZ1bGwgZGlzY3Vzc2lvbiBvZiB0aGlzIGlzc3VlLgorCitZb3UgY2FuIGFsc28gYWRkIHlvdXIgb3duIGRhdGEgaGFuZGxlcnMgdG8gdGhlIEM8d3JpdGUoKT4gbWV0aG9kIHVzaW5nIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4uCisKK09uIHN5c3RlbXMgd2l0aCBDPHBlcmwgNS44PiBhbmQgbGF0ZXIgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIHdpbGwgYWxzbyBoYW5kbGUgVW5pY29kZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4KKworVGhlIEM8d3JpdGU+IG1ldGhvZHMgcmV0dXJuOgorCisgICAgMCBmb3Igc3VjY2Vzcy4KKyAgIC0xIGZvciBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyAgIC0yIGZvciByb3cgb3IgY29sdW1uIG91dCBvZiBib3VuZHMuCisgICAtMyBmb3Igc3RyaW5nIHRvbyBsb25nLgorCisKKworCis9aGVhZDIgd3JpdGVfbnVtYmVyKCRyb3csICRjb2x1bW4sICRudW1iZXIsICRmb3JtYXQpCisKK1dyaXRlIGFuIGludGVnZXIgb3IgYSBmbG9hdCB0byB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPjoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX251bWJlcigwLCAwLCAgMTIzNDU2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIoJ0EyJywgIDIuMzQ1MSk7CisKK1NlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LiBUaGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuCisKK0luIGdlbmVyYWwgaXQgaXMgc3VmZmljaWVudCB0byB1c2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kLgorCisKKworCis9aGVhZDIgd3JpdGVfc3RyaW5nKCRyb3csICRjb2x1bW4sICRzdHJpbmcsICRmb3JtYXQpCisKK1dyaXRlIGEgc3RyaW5nIHRvIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2x1bW4+OgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKDAsIDAsICdZb3VyIHRleHQgaGVyZScgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0EyJywgJ29yIGhlcmUnICk7CisKK1RoZSBtYXhpbXVtIHN0cmluZyBzaXplIGlzIDMyNzY3IGNoYXJhY3RlcnMuIEhvd2V2ZXIgdGhlIG1heGltdW0gc3RyaW5nIHNlZ21lbnQgdGhhdCBFeGNlbCBjYW4gZGlzcGxheSBpbiBhIGNlbGwgaXMgMTAwMC4gQWxsIDMyNzY3IGNoYXJhY3RlcnMgY2FuIGJlIGRpc3BsYXllZCBpbiB0aGUgZm9ybXVsYSBiYXIuCisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzx3cml0ZSgpPiBtZXRob2Qgd2lsbCBhbHNvIGhhbmRsZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4gV2l0aCBvbGRlciBwZXJscyB5b3UgY2FuIGFsc28gd3JpdGUgVW5pY29kZSBpbiBDPFVURjE2PiBmb3JtYXQgdmlhIHRoZSBDPHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCk+IG1ldGhvZC4gU2VlIGFsc28gdGhlIEM8dW5pY29kZV8qLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0luIGdlbmVyYWwgaXQgaXMgc3VmZmljaWVudCB0byB1c2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kLiBIb3dldmVyLCB5b3UgbWF5IHNvbWV0aW1lcyB3aXNoIHRvIHVzZSB0aGUgQzx3cml0ZV9zdHJpbmcoKT4gbWV0aG9kIHRvIHdyaXRlIGRhdGEgdGhhdCBsb29rcyBsaWtlIGEgbnVtYmVyIGJ1dCB0aGF0IHlvdSBkb24ndCB3YW50IHRyZWF0ZWQgYXMgYSBudW1iZXIuIEZvciBleGFtcGxlLCB6aXAgY29kZXMgb3IgcGhvbmUgbnVtYmVyczoKKworICAgICMgV3JpdGUgYXMgYSBwbGFpbiBzdHJpbmcKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0ExJywgJzAxMjA5Jyk7CisKK0hvd2V2ZXIsIGlmIHRoZSB1c2VyIGVkaXRzIHRoaXMgc3RyaW5nIEV4Y2VsIG1heSBjb252ZXJ0IGl0IGJhY2sgdG8gYSBudW1iZXIuIFRvIGdldCBhcm91bmQgdGhpcyB5b3UgY2FuIHVzZSB0aGUgRXhjZWwgdGV4dCBmb3JtYXQgQzxAPjoKKworICAgICMgRm9ybWF0IGFzIGEgc3RyaW5nLiBEb2Vzbid0IGNoYW5nZSB0byBhIG51bWJlciB3aGVuIGVkaXRlZAorICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0EyJywgJzAxMjA5JywgJGZvcm1hdDEpOworCitTZWUgYWxzbyB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisKKworCis9aGVhZDIgd3JpdGVfdXRmMTZiZV9zdHJpbmcoJHJvdywgJGNvbHVtbiwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byB3cml0ZSBDPFVURi0xNkJFPiBzdHJpbmdzIHRvIGEgY2VsbCBpbiBFeGNlbC4gSXQgaXMgZnVuY3Rpb25hbGx5IHRoZSBzYW1lIGFzIHRoZSBDPHdyaXRlX3N0cmluZygpPiBtZXRob2QgZXhjZXB0IHRoYXQgdGhlIHN0cmluZyBzaG91bGQgYmUgaW4gQzxVVEYtMTZCRT4gVW5pY29kZSBmb3JtYXQuIEl0IGlzIGdlbmVyYWxseSBlYXNpZXIsIHdoZW4gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwsIHRvIHdyaXRlIHVuaWNvZGUgc3RyaW5ncyBpbiBDPFVURi04PiBmb3JtYXQsIHNlZSBMPFVOSUNPREUgSU4gRVhDRUw+LiBUaGUgQzx3cml0ZV91dGYxNmJlX3N0cmluZygpPiBtZXRob2QgaXMgbWFpbmx5IG9mIHVzZSBpbiB2ZXJzaW9ucyBvZiBwZXJsIHByaW9yIHRvIDUuOC4KKworCitUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGV4YW1wbGUgc2hvd2luZyBob3cgdG8gd3JpdGUgc29tZSBVbmljb2RlIHN0cmluZ3MgaW4gQzxVVEYtMTZCRT4gZm9ybWF0OgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBVbmljb2RlOjpNYXAoKTsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1dGZfMTZfYmUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBJbmNyZWFzZSB0aGUgY29sdW1uIHdpZHRoIGZvciBjbGFyaXR5CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjUpOworCisKKyAgICAjIFdyaXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIKKyAgICAjCisgICAgbXkgJHNtaWxleSA9IHBhY2sgJ24nLCAweDI2M2E7CisKKyAgICAjIEluY3JlYXNlIHRoZSBmb250IHNpemUgZm9yIGxlZ2liaWxpdHkuCisgICAgbXkgJGJpZ19mb250ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KHNpemUgPT4gNzIpOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0EzJywgJHNtaWxleSwgJGJpZ19mb250KTsKKworCisKKyAgICAjIFdyaXRlIGEgcGhyYXNlIGluIEN5cmlsbGljIHVzaW5nIGEgaGV4LWVuY29kZWQgc3RyaW5nCisgICAgIworICAgIG15ICRzdHIgPSBwYWNrICdIKicsICcwNDJkMDQ0MjA0M2UwMDIwMDQ0NDA0NDAwNDMwMDQzNzA0MzAwMDIwMDQzZCcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICcwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxJzsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNScsICRzdHIpOworCisKKworICAgICMgTWFwIGEgc3RyaW5nIHRvIFVURi0xNkJFIHVzaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4KKyAgICAjCisgICAgbXkgJG1hcCAgID0gVW5pY29kZTo6TWFwLT5uZXcoJ0lTTy04ODU5LTEnKTsKKyAgICBteSAkdXRmMTYgPSAkbWFwLT50b191bmljb2RlKCdIZWxsbyB3b3JsZCEnKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNycsICR1dGYxNik7CisKK1lvdSBjYW4gY29udmVydCBBU0NJSSBlbmNvZGluZ3MgdG8gdGhlIHJlcXVpcmVkIEM8VVRGLTE2QkU+IGZvcm1hdCB1c2luZyBvbmUgb2YgdGhlIG1hbnkgVW5pY29kZSBtb2R1bGVzIG9uIENQQU4uIEZvciBleGFtcGxlIEM8VW5pY29kZTo6TWFwPiBhbmQgQzxVbmljb2RlOjpTdHJpbmc+OiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvYXV0aG9yL01TQ0hXQVJUWi9Vbmljb2RlLU1hcC9NYXAucG0+IGFuZCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvYXV0aG9yL0dBQVMvVW5pY29kZS1TdHJpbmcvU3RyaW5nLnBtPi4KKworRm9yIGEgZnVsbCBsaXN0IG9mIHRoZSBQZXJsIFVuaWNvZGUgbW9kdWxlcyBzZWU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/cXVlcnk9dW5pY29kZSZtb2RlPWFsbD4uCisKK0M8VVRGLTE2QkU+IGlzIHRoZSBmb3JtYXQgbW9zdCBvZnRlbiByZXR1cm5lZCBieSBDPFBlcmw+IG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBDPFVURi0xNj4uIFRvIHdyaXRlIEM8VVRGLTE2PiBzdHJpbmdzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IHVzZSB0aGUgQzx3cml0ZV91dGYxNmJlX3N0cmluZ19sZSgpPiBtZXRob2QgYmVsb3cuCisKK1RoZSBDPHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCk+IG1ldGhvZCB3YXMgcHJldmlvdXNseSBjYWxsZWQgQzx3cml0ZV91bmljb2RlKCk+LiBUaGF0LCBvdmVybHkgZ2VuZXJhbCwgbmFtZSBpcyBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuCisKK1NlZSBhbHNvIHRoZSBDPHVuaWNvZGVfKi5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgd3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbHVtbiwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgQzx3cml0ZV91dGYxNmJlKCk+IGV4Y2VwdCB0aGF0IHRoZSBzdHJpbmcgc2hvdWxkIGJlIDE2LWJpdCBjaGFyYWN0ZXJzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LiBUaGlzIGlzIGdlbmVyYWxseSByZWZlcnJlZCB0byBhcyBDPFVURi0xNkxFPi4gU2VlIEw8VU5JQ09ERSBJTiBFWENFTD4uCisKK0M8VVRGLTE2PiBkYXRhIGNhbiBiZSBjaGFuZ2VkIGZyb20gbGl0dGxlLWVuZGlhbiB0byBiaWctZW5kaWFuIGZvcm1hdCAoYW5kIHZpY2UtdmVyc2EpIGFzIGZvbGxvd3M6CisKKyAgICAkdXRmMTZiZSA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICR1dGYxNmxlOworCisKKworCis9aGVhZDIga2VlcF9sZWFkaW5nX3plcm9zKCkKKworVGhpcyBtZXRob2QgY2hhbmdlcyB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiBpbnRlZ2VycyB3aXRoIGxlYWRpbmcgemVyb3Mgd2hlbiB1c2luZyB0aGUgQzx3cml0ZSgpPiBtZXRob2QuCisKK1RoZSBDPHdyaXRlKCk+IG1ldGhvZCB1c2VzIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdG8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBkYXRhIHRvIHdyaXRlIHRvIGFuIEV4Y2VsIHdvcmtzaGVldC4gSWYgdGhlIGRhdGEgbG9va3MgbGlrZSBhIG51bWJlciBpdCB3cml0ZXMgYSBudW1iZXIgdXNpbmcgQzx3cml0ZV9udW1iZXIoKT4uIE9uZSBwcm9ibGVtIHdpdGggdGhpcyBhcHByb2FjaCBpcyB0aGF0IG9jY2FzaW9uYWxseSBkYXRhIGxvb2tzIGxpa2UgYSBudW1iZXIgYnV0IHlvdSBkb24ndCB3YW50IGl0IHRyZWF0ZWQgYXMgYSBudW1iZXIuCisKK1ppcCBjb2RlcyBhbmQgSUQgbnVtYmVycywgZm9yIGV4YW1wbGUsIG9mdGVuIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHplcm8uIElmIHlvdSB3cml0ZSB0aGlzIGRhdGEgYXMgYSBudW1iZXIgdGhlbiB0aGUgbGVhZGluZyB6ZXJvKHMpIHdpbGwgYmUgc3RyaXBwZWQuIFRoaXMgaXMgdGhlIGFsc28gdGhlIGRlZmF1bHQgYmVoYXZpb3VyIHdoZW4geW91IGVudGVyIGRhdGEgbWFudWFsbHkgaW4gRXhjZWwuCisKK1RvIGdldCBhcm91bmQgdGhpcyB5b3UgY2FuIHVzZSBvbmUgb2YgdGhyZWUgb3B0aW9ucy4gV3JpdGUgYSBmb3JtYXR0ZWQgbnVtYmVyLCB3cml0ZSB0aGUgbnVtYmVyIGFzIGEgc3RyaW5nIG9yIHVzZSB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb2YgQzx3cml0ZSgpPjoKKworICAgICMgSW1wbGljaXRseSB3cml0ZSBhIG51bWJlciwgdGhlIGxlYWRpbmcgemVybyBpcyByZW1vdmVkOiAxMjA5CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzAxMjA5Jyk7CisKKyAgICAjIFdyaXRlIGEgemVybyBwYWRkZWQgbnVtYmVyIHVzaW5nIGEgZm9ybWF0OiAwMTIwOQorICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJzAwMDAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJzAxMjA5JywgJGZvcm1hdDEpOworCisgICAgIyBXcml0ZSBleHBsaWNpdGx5IGFzIGEgc3RyaW5nOiAwMTIwOQorICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygnQTMnLCAnMDEyMDknKTsKKworICAgICMgV3JpdGUgaW1wbGljaXRseSBhcyBhIHN0cmluZzogMDEyMDkKKyAgICAkd29ya3NoZWV0LT5rZWVwX2xlYWRpbmdfemVyb3MoKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnMDEyMDknKTsKKworCitUaGUgYWJvdmUgY29kZSB3b3VsZCBnZW5lcmF0ZSBhIHdvcmtzaGVldCB0aGF0IGxvb2tlZCBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgfCAgICAgQSAgICAgfCAgICAgQiAgICAgfCAgICAgQyAgICAgfCAgICAgRCAgICAgfCAuLi4KKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8IDEgfCAgICAgIDEyMDkgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDIgfCAgICAgMDEyMDkgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDMgfCAwMTIwOSAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKyAgICB8IDQgfCAwMTIwOSAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgfCAuLi4KKworCitUaGUgZXhhbXBsZXMgYXJlIG9uIGRpZmZlcmVudCBzaWRlcyBvZiB0aGUgY2VsbHMgZHVlIHRvIHRoZSBmYWN0IHRoYXQgRXhjZWwgZGlzcGxheXMgc3RyaW5ncyB3aXRoIGEgbGVmdCBqdXN0aWZpY2F0aW9uIGFuZCBudW1iZXJzIHdpdGggYSByaWdodCBqdXN0aWZpY2F0aW9uIGJ5IGRlZmF1bHQuIFlvdSBjYW4gY2hhbmdlIHRoaXMgYnkgdXNpbmcgYSBmb3JtYXQgdG8ganVzdGlmeSB0aGUgZGF0YSwgc2VlIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgaWYgdGhlIHVzZXIgZWRpdHMgdGhlIGRhdGEgaW4gZXhhbXBsZXMgQzxBMz4gYW5kIEM8QTQ+IHRoZSBzdHJpbmdzIHdpbGwgcmV2ZXJ0IGJhY2sgdG8gbnVtYmVycy4gQWdhaW4gdGhpcyBpcyBFeGNlbCdzIGRlZmF1bHQgYmVoYXZpb3VyLiBUbyBhdm9pZCB0aGlzIHlvdSBjYW4gdXNlIHRoZSB0ZXh0IGZvcm1hdCBDPEA+OgorCisgICAgIyBGb3JtYXQgYXMgYSBzdHJpbmcgKDAxMjA5KQorICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ0AnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJ0E1JywgJzAxMjA5JywgJGZvcm1hdDIpOworCitUaGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gcHJvcGVydHkgaXMgb2ZmIGJ5IGRlZmF1bHQuIFRoZSBDPGtlZXBfbGVhZGluZ196ZXJvcygpPiBtZXRob2QgdGFrZXMgMCBvciAxIGFzIGFuIGFyZ3VtZW50LiBJdCBkZWZhdWx0cyB0byAxIGlmIGFuIGFyZ3VtZW50IGlzbid0IHNwZWNpZmllZDoKKworICAgICR3b3Jrc2hlZXQtPmtlZXBfbGVhZGluZ196ZXJvcygpOyAgIyBTZXQgb24KKyAgICAkd29ya3NoZWV0LT5rZWVwX2xlYWRpbmdfemVyb3MoMSk7ICMgU2V0IG9uCisgICAgJHdvcmtzaGVldC0+a2VlcF9sZWFkaW5nX3plcm9zKDApOyAjIFNldCBvZmYKKworU2VlIGFsc28gdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gbWV0aG9kLgorCisKKz1oZWFkMiB3cml0ZV9ibGFuaygkcm93LCAkY29sdW1uLCAkZm9ybWF0KQorCitXcml0ZSBhIGJsYW5rIGNlbGwgc3BlY2lmaWVkIGJ5IEM8JHJvdz4gYW5kIEM8JGNvbHVtbj46CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygwLCAwLCAkZm9ybWF0KTsKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBhZGQgZm9ybWF0dGluZyB0byBhIGNlbGwgd2hpY2ggZG9lc24ndCBjb250YWluIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZS4KKworRXhjZWwgZGlmZmVyZW50aWF0ZXMgYmV0d2VlbiBhbiAiRW1wdHkiIGNlbGwgYW5kIGEgIkJsYW5rIiBjZWxsLiBBbiAiRW1wdHkiIGNlbGwgaXMgYSBjZWxsIHdoaWNoIGRvZXNuJ3QgY29udGFpbiBkYXRhIHdoaWxzdCBhICJCbGFuayIgY2VsbCBpcyBhIGNlbGwgd2hpY2ggZG9lc24ndCBjb250YWluIGRhdGEgYnV0IGRvZXMgY29udGFpbiBmb3JtYXR0aW5nLiBFeGNlbCBzdG9yZXMgIkJsYW5rIiBjZWxscyBidXQgaWdub3JlcyAiRW1wdHkiIGNlbGxzLgorCitBcyBzdWNoLCBpZiB5b3Ugd3JpdGUgYW4gZW1wdHkgY2VsbCB3aXRob3V0IGZvcm1hdHRpbmcgaXQgaXMgaWdub3JlZDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICB1bmRlZiwgJGZvcm1hdCk7ICMgd3JpdGVfYmxhbmsoKQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICB1bmRlZiAgICAgICAgICk7ICMgSWdub3JlZAorCitUaGlzIHNlZW1pbmdseSB1bmludGVyZXN0aW5nIGZhY3QgbWVhbnMgdGhhdCB5b3UgY2FuIHdyaXRlIGFycmF5cyBvZiBkYXRhIHdpdGhvdXQgc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHVuZGVmIG9yIGVtcHR5IHN0cmluZyB2YWx1ZXMuCisKK1NlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisKKworCis9aGVhZDIgd3JpdGVfcm93KCRyb3csICRjb2x1bW4sICRhcnJheV9yZWYsICRmb3JtYXQpCisKK1RoZSBDPHdyaXRlX3JvdygpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSAxRCBvciAyRCBhcnJheSBvZiBkYXRhIGluIG9uZSBnby4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnZlcnRpbmcgdGhlIHJlc3VsdHMgb2YgYSBkYXRhYmFzZSBxdWVyeSBpbnRvIGFuIEV4Y2VsIHdvcmtzaGVldC4gWW91IG11c3QgcGFzcyBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgb2YgZGF0YSByYXRoZXIgdGhhbiB0aGUgYXJyYXkgaXRzZWxmLiBUaGUgQzx3cml0ZSgpPiBtZXRob2QgaXMgdGhlbiBjYWxsZWQgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgZGF0YS4gRm9yIGV4YW1wbGU6CisKKyAgICBAYXJyYXkgICAgICA9ICgnYXdrJywgJ2dhd2snLCAnbWF3aycpOworICAgICRhcnJheV9yZWYgID0gXEBhcnJheTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3JvdygwLCAwLCAkYXJyYXlfcmVmKTsKKworICAgICMgVGhlIGFib3ZlIGV4YW1wbGUgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAkYXJyYXlbMF0pOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICRhcnJheVsxXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJGFycmF5WzJdKTsKKworCitOb3RlOiBGb3IgY29udmVuaWVuY2UgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGJlaGF2ZXMgaW4gdGhlIHNhbWUgd2F5IGFzIEM8d3JpdGVfcm93KCk+IGlmIGl0IGlzIHBhc3NlZCBhbiBhcnJheSByZWZlcmVuY2UuIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIHR3byBtZXRob2QgY2FsbHMgYXJlIGVxdWl2YWxlbnQ6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgJGFycmF5X3JlZik7ICMgV3JpdGUgYSByb3cgb2YgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAgICAnQTEnLCAkYXJyYXlfcmVmKTsgIyBTYW1lIHRoaW5nCisKK0FzIHdpdGggYWxsIG9mIHRoZSB3cml0ZSBtZXRob2RzIHRoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgYSBmb3JtYXQgaXMgc3BlY2lmaWVkIGl0IGlzIGFwcGxpZWQgdG8gYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgZGF0YSBhcnJheS4KKworQXJyYXkgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGRhdGEgd2lsbCBiZSB0cmVhdGVkIGFzIGNvbHVtbnMuIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSAyRCBhcnJheXMgb2YgZGF0YSBpbiBvbmUgZ28uIEZvciBleGFtcGxlOgorCisgICAgQGVlYyA9ICAoCisgICAgICAgICAgICAgICAgWydtYWdnaWUnLCAnbWlsbHknLCAnbW9sbHknLCAnbWF5JyAgXSwKKyAgICAgICAgICAgICAgICBbMTMsICAgICAgIDE0LCAgICAgIDE1LCAgICAgIDE2ICAgICBdLAorICAgICAgICAgICAgICAgIFsnc2hlbGwnLCAgJ3N0YXInLCAgJ2NyYWInLCAgJ3N0b25lJ10KKyAgICAgICAgICAgICk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgXEBlZWMpOworCisKK1dvdWxkIHByb2R1Y2UgYSB3b3Jrc2hlZXQgYXMgZm9sbG93czoKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICB8ICAgIEEgICAgfCAgICBCICAgIHwgICAgQyAgICB8ICAgIEQgICAgfCAgICBFICAgIHwgLi4uCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAxIHwgbWFnZ2llICB8IDEzICAgICAgfCBzaGVsbCAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDIgfCBtaWxseSAgIHwgMTQgICAgICB8IHN0YXIgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgMyB8IG1vbGx5ICAgfCAxNSAgICAgIHwgY3JhYiAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCA0IHwgbWF5ICAgICB8IDE2ICAgICAgfCBzdG9uZSAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDUgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgNiB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisKKworVG8gd3JpdGUgdGhlIGRhdGEgaW4gYSByb3ctY29sdW1uIG9yZGVyIHJlZmVyIHRvIHRoZSBDPHdyaXRlX2NvbCgpPiBtZXRob2QgYmVsb3cuCisKK0FueSBDPHVuZGVmPiB2YWx1ZXMgaW4gdGhlIGRhdGEgd2lsbCBiZSBpZ25vcmVkIHVubGVzcyBhIGZvcm1hdCBpcyBhcHBsaWVkIHRvIHRoZSBkYXRhLCBpbiB3aGljaCBjYXNlIGEgZm9ybWF0dGVkIGJsYW5rIGNlbGwgd2lsbCBiZSB3cml0dGVuLiBJbiBlaXRoZXIgY2FzZSB0aGUgYXBwcm9wcmlhdGUgcm93IG9yIGNvbHVtbiB2YWx1ZSB3aWxsIHN0aWxsIGJlIGluY3JlbWVudGVkLgorCitUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIgdG8gQzxwZXJscmVmPiBhbmQgQzxwZXJscmVmdHV0PiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uIFRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgMkQgYXJyYXlzIG9yICJsaXN0cyBvZiBsaXN0cyIgcmVmZXIgdG8gQzxwZXJsbG9sPi4KKworVGhlIEM8d3JpdGVfcm93KCk+IG1ldGhvZCByZXR1cm5zIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZCB3aGVuIHdyaXRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZSBkYXRhIG9yIHplcm8gaWYgbm8gZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQuIFNlZSB0aGUgcmV0dXJuIHZhbHVlcyBkZXNjcmliZWQgZm9yIHRoZSBDPHdyaXRlKCk+IG1ldGhvZCBhYm92ZS4KKworU2VlIGFsc28gdGhlIEM8d3JpdGVfYXJyYXlzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworVGhlIEM8d3JpdGVfcm93KCk+IG1ldGhvZCBhbGxvd3MgdGhlIGZvbGxvd2luZyBpZGlvbWF0aWMgY29udmVyc2lvbiBvZiBhIHRleHQgZmlsZSB0byBhbiBFeGNlbCBmaWxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdmaWxlLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG9wZW4gSU5QVVQsICdmaWxlLnR4dCcgb3IgZGllICJDb3VsZG4ndCBvcGVuIGZpbGU6ICQhIjsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCQuLTEsIDAsIFtzcGxpdF0pIHdoaWxlIDxJTlBVVD47CisKKworCisKKz1oZWFkMiB3cml0ZV9jb2woJHJvdywgJGNvbHVtbiwgJGFycmF5X3JlZiwgJGZvcm1hdCkKKworVGhlIEM8d3JpdGVfY29sKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byB3cml0ZSBhIDFEIG9yIDJEIGFycmF5IG9mIGRhdGEgaW4gb25lIGdvLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY29udmVydGluZyB0aGUgcmVzdWx0cyBvZiBhIGRhdGFiYXNlIHF1ZXJ5IGludG8gYW4gRXhjZWwgd29ya3NoZWV0LiBZb3UgbXVzdCBwYXNzIGEgcmVmZXJlbmNlIHRvIHRoZSBhcnJheSBvZiBkYXRhIHJhdGhlciB0aGFuIHRoZSBhcnJheSBpdHNlbGYuIFRoZSBDPHdyaXRlKCk+IG1ldGhvZCBpcyB0aGVuIGNhbGxlZCBmb3IgZWFjaCBlbGVtZW50IG9mIHRoZSBkYXRhLiBGb3IgZXhhbXBsZToKKworICAgIEBhcnJheSAgICAgID0gKCdhd2snLCAnZ2F3aycsICdtYXdrJyk7CisgICAgJGFycmF5X3JlZiAgPSBcQGFycmF5OworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29sKDAsIDAsICRhcnJheV9yZWYpOworCisgICAgIyBUaGUgYWJvdmUgZXhhbXBsZSBpcyBlcXVpdmFsZW50IHRvOgorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICRhcnJheVswXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMCwgJGFycmF5WzFdKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAkYXJyYXlbMl0pOworCitBcyB3aXRoIGFsbCBvZiB0aGUgd3JpdGUgbWV0aG9kcyB0aGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwuIElmIGEgZm9ybWF0IGlzIHNwZWNpZmllZCBpdCBpcyBhcHBsaWVkIHRvIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGRhdGEgYXJyYXkuCisKK0FycmF5IHJlZmVyZW5jZXMgd2l0aGluIHRoZSBkYXRhIHdpbGwgYmUgdHJlYXRlZCBhcyByb3dzLiBUaGlzIGFsbG93cyB5b3UgdG8gd3JpdGUgMkQgYXJyYXlzIG9mIGRhdGEgaW4gb25lIGdvLiBGb3IgZXhhbXBsZToKKworICAgIEBlZWMgPSAgKAorICAgICAgICAgICAgICAgIFsnbWFnZ2llJywgJ21pbGx5JywgJ21vbGx5JywgJ21heScgIF0sCisgICAgICAgICAgICAgICAgWzEzLCAgICAgICAxNCwgICAgICAxNSwgICAgICAxNiAgICAgXSwKKyAgICAgICAgICAgICAgICBbJ3NoZWxsJywgICdzdGFyJywgICdjcmFiJywgICdzdG9uZSddCisgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29sKCdBMScsIFxAZWVjKTsKKworCitXb3VsZCBwcm9kdWNlIGEgd29ya3NoZWV0IGFzIGZvbGxvd3M6CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgfCAgICBBICAgIHwgICAgQiAgICB8ICAgIEMgICAgfCAgICBEICAgIHwgICAgRSAgICB8IC4uLgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgMSB8IG1hZ2dpZSAgfCBtaWxseSAgIHwgbW9sbHkgICB8IG1heSAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCAyIHwgMTMgICAgICB8IDE0ICAgICAgfCAxNSAgICAgIHwgMTYgICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDMgfCBzaGVsbCAgIHwgc3RhciAgICB8IGNyYWIgICAgfCBzdG9uZSAgIHwgIC4uLiAgICB8IC4uLgorICAgIHwgNCB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAgLi4uICAgIHwgLi4uCisgICAgfCA1IHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgLi4uICAgICB8ICAuLi4gICAgfCAuLi4KKyAgICB8IDYgfCAuLi4gICAgIHwgLi4uICAgICB8IC4uLiAgICAgfCAuLi4gICAgIHwgIC4uLiAgICB8IC4uLgorCisKK1RvIHdyaXRlIHRoZSBkYXRhIGluIGEgY29sdW1uLXJvdyBvcmRlciByZWZlciB0byB0aGUgQzx3cml0ZV9yb3coKT4gbWV0aG9kIGFib3ZlLgorCitBbnkgQzx1bmRlZj4gdmFsdWVzIGluIHRoZSBkYXRhIHdpbGwgYmUgaWdub3JlZCB1bmxlc3MgYSBmb3JtYXQgaXMgYXBwbGllZCB0byB0aGUgZGF0YSwgaW4gd2hpY2ggY2FzZSBhIGZvcm1hdHRlZCBibGFuayBjZWxsIHdpbGwgYmUgd3JpdHRlbi4gSW4gZWl0aGVyIGNhc2UgdGhlIGFwcHJvcHJpYXRlIHJvdyBvciBjb2x1bW4gdmFsdWUgd2lsbCBzdGlsbCBiZSBpbmNyZW1lbnRlZC4KKworQXMgbm90ZWQgYWJvdmUgdGhlIEM8d3JpdGUoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIGFzIGEgc3lub255bSBmb3IgQzx3cml0ZV9yb3coKT4gYW5kIEM8d3JpdGVfcm93KCk+IGhhbmRsZXMgbmVzdGVkIGFycmF5IHJlZnMgYXMgY29sdW1ucy4gVGhlcmVmb3JlLCB0aGUgZm9sbG93aW5nIHR3byBtZXRob2QgY2FsbHMgYXJlIGVxdWl2YWxlbnQgYWx0aG91Z2ggdGhlIG1vcmUgZXhwbGljaXQgY2FsbCB0byBDPHdyaXRlX2NvbCgpPiB3b3VsZCBiZSBwcmVmZXJhYmxlIGZvciBtYWludGFpbmFiaWxpdHk6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb2woJ0ExJywgJGFycmF5X3JlZiAgICApOyAjIFdyaXRlIGEgY29sdW1uIG9mIGRhdGEKKyAgICAkd29ya3NoZWV0LT53cml0ZSggICAgJ0ExJywgWyAkYXJyYXlfcmVmIF0pOyAjIFNhbWUgdGhpbmcKKworVG8gZmluZCBvdXQgbW9yZSBhYm91dCBhcnJheSByZWZlcmVuY2VzIHJlZmVyIHRvIEM8cGVybHJlZj4gYW5kIEM8cGVybHJlZnR1dD4gaW4gdGhlIG1haW4gUGVybCBkb2N1bWVudGF0aW9uLiBUbyBmaW5kIG91dCBtb3JlIGFib3V0IDJEIGFycmF5cyBvciAibGlzdHMgb2YgbGlzdHMiIHJlZmVyIHRvIEM8cGVybGxvbD4uCisKK1RoZSBDPHdyaXRlX2NvbCgpPiBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQgd2hlbiB3cml0aW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZGF0YSBvciB6ZXJvIGlmIG5vIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLiBTZWUgdGhlIHJldHVybiB2YWx1ZXMgZGVzY3JpYmVkIGZvciB0aGUgQzx3cml0ZSgpPiBtZXRob2QgYWJvdmUuCisKK1NlZSBhbHNvIHRoZSBDPHdyaXRlX2FycmF5cy5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworCisKKz1oZWFkMiB3cml0ZV9kYXRlX3RpbWUoJHJvdywgJGNvbCwgJGRhdGVfc3RyaW5nLCAkZm9ybWF0KQorCitUaGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgZGF0ZSBvciB0aW1lIHRvIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2x1bW4+OgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCdBMScsICcyMDA0LTA1LTEzVDIzOjIwJywgJGRhdGVfZm9ybWF0KTsKKworVGhlIEM8JGRhdGVfc3RyaW5nPiBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisKKyAgICB5eXl5LW1tLWRkVGhoOm1tOnNzLnNzcworCitUaGlzIGNvbmZvcm1zIHRvIGFuIElTTzg2MDEgZGF0ZSBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIGZ1bGwgcmFuZ2Ugb2YgSVNPODYwMSBmb3JtYXRzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitUaGUgZm9sbG93aW5nIHZhcmlhdGlvbnMgb24gdGhlIEM8JGRhdGVfc3RyaW5nPiBwYXJhbWV0ZXIgYXJlIHBlcm1pdHRlZDoKKworICAgIHl5eXktbW0tZGRUaGg6bW06c3Muc3NzICAgICAgICAgIyBTdGFuZGFyZCBmb3JtYXQKKyAgICB5eXl5LW1tLWRkVCAgICAgICAgICAgICAgICAgICAgICMgTm8gdGltZQorICAgICAgICAgICAgICBUaGg6bW06c3Muc3NzICAgICAgICAgIyBObyBkYXRlCisgICAgeXl5eS1tbS1kZFRoaDptbTpzcy5zc3NaICAgICAgICAjIEFkZGl0aW9uYWwgWiAoYnV0IG5vdCB0aW1lIHpvbmVzKQorICAgIHl5eXktbW0tZGRUaGg6bW06c3MgICAgICAgICAgICAgIyBObyBmcmFjdGlvbmFsIHNlY29uZHMKKyAgICB5eXl5LW1tLWRkVGhoOm1tICAgICAgICAgICAgICAgICMgTm8gc2Vjb25kcworCitOb3RlIHRoYXQgdGhlIEM8VD4gaXMgcmVxdWlyZWQgaW4gYWxsIGNhc2VzLgorCitBIGRhdGUgc2hvdWxkIGFsd2F5cyBoYXZlIGEgQzwkZm9ybWF0Piwgb3RoZXJ3aXNlIGl0IHdpbGwgYXBwZWFyIGFzIGEgbnVtYmVyLCBzZWUgTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4gYW5kIEw8Q0VMTCBGT1JNQVRUSU5HPi4gSGVyZSBpcyBhIHR5cGljYWwgZXhhbXBsZToKKworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdtbS9kZC95eScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2RhdGVfdGltZSgnQTEnLCAnMjAwNC0wNS0xM1QyMzoyMCcsICRkYXRlX2Zvcm1hdCk7CisKK1ZhbGlkIGRhdGVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgMTkwMC0wMS0wMSB0byA5OTk5LTEyLTMxLCBmb3IgdGhlIDE5MDAgZXBvY2ggYW5kIDE5MDQtMDEtMDEgdG8gOTk5OS0xMi0zMSwgZm9yIHRoZSAxOTA0IGVwb2NoLiBBcyB3aXRoIEV4Y2VsLCBkYXRlcyBvdXRzaWRlIHRoZXNlIHJhbmdlcyB3aWxsIGJlIHdyaXR0ZW4gYXMgYSBzdHJpbmcuCisKK1NlZSBhbHNvIHRoZSBkYXRlX3RpbWUucGwgcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworCisKKz1oZWFkMiB3cml0ZV91cmwoJHJvdywgJGNvbCwgJHVybCwgJGxhYmVsLCAkZm9ybWF0KQorCitXcml0ZSBhIGh5cGVybGluayB0byBhIFVSTCBpbiB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPi4gVGhlIGh5cGVybGluayBpcyBjb21wcmlzZWQgb2YgdHdvIGVsZW1lbnRzOiB0aGUgdmlzaWJsZSBsYWJlbCBhbmQgdGhlIGludmlzaWJsZSBsaW5rLiBUaGUgdmlzaWJsZSBsYWJlbCBpcyB0aGUgc2FtZSBhcyB0aGUgbGluayB1bmxlc3MgYW4gYWx0ZXJuYXRpdmUgbGFiZWwgaXMgc3BlY2lmaWVkLiBUaGUgcGFyYW1ldGVycyBDPCRsYWJlbD4gYW5kIHRoZSBDPCRmb3JtYXQ+IGFyZSBvcHRpb25hbCBhbmQgdGhlaXIgcG9zaXRpb24gaXMgaW50ZXJjaGFuZ2VhYmxlLgorCitUaGUgbGFiZWwgaXMgd3JpdHRlbiB1c2luZyB0aGUgQzx3cml0ZSgpPiBtZXRob2QuIFRoZXJlZm9yZSBpdCBpcyBwb3NzaWJsZSB0byB3cml0ZSBzdHJpbmdzLCBudW1iZXJzIG9yIGZvcm11bGFzIGFzIGxhYmVscy4KKworVGhlcmUgYXJlIGZvdXIgd2ViIHN0eWxlIFVSSSdzIHN1cHBvcnRlZDogQzxodHRwOi8vPiwgQzxodHRwczovLz4sIEM8ZnRwOi8vPiBhbmQgIEM8bWFpbHRvOj46CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoMCwgMCwgICdmdHA6Ly93d3cucGVybC5vcmcvJyAgICAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKDEsIDAsICAnaHR0cDovL3d3dy5wZXJsLmNvbS8nLCAnUGVybCBob21lJyAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTMnLCAgJ2h0dHA6Ly93d3cucGVybC5jb20vJywgJGZvcm1hdCAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0E0JywgICdodHRwOi8vd3d3LnBlcmwuY29tLycsICdQZXJsJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNScsICAnbWFpbHRvOmptY25hbWFyYUBjcGFuLm9yZycgICAgICAgICAgICApOworCitUaGVyZSBhcmUgdHdvIGxvY2FsIFVSSXMgc3VwcG9ydGVkOiBDPGludGVybmFsOj4gYW5kIEM8ZXh0ZXJuYWw6Pi4gVGhlc2UgYXJlIHVzZWQgZm9yIGh5cGVybGlua3MgdG8gaW50ZXJuYWwgd29ya3NoZWV0IHJlZmVyZW5jZXMgb3IgZXh0ZXJuYWwgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCByZWZlcmVuY2VzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNicsICAnaW50ZXJuYWw6U2hlZXQyIUExJyAgICAgICAgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTcnLCAgJ2ludGVybmFsOlNoZWV0MiFBMScsICAgJGZvcm1hdCAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0E4JywgICdpbnRlcm5hbDpTaGVldDIhQTE6QjInICAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBOScsICBxe2ludGVybmFsOidTYWxlcyBEYXRhJyFBMX0gICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTEwJywgJ2V4dGVybmFsOmM6XHRlbXBcZm9vLnhscycgICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExMScsICdleHRlcm5hbDpjOlx0ZW1wXGZvby54bHMjU2hlZXQyIUExJyAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBMTInLCAnZXh0ZXJuYWw6Li5cLi5cLi5cZm9vLnhscycgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTEzJywgJ2V4dGVybmFsOi4uXC4uXC4uXGZvby54bHMjU2hlZXQyIUExJyAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExMycsICdleHRlcm5hbDpcXFxcTkVUV09SS1xzaGFyZVxmb28ueGxzJyAgICk7CisKK0FsbCBvZiB0aGUgdGhlc2UgVVJJIHR5cGVzIGFyZSByZWNvZ25pc2VkIGJ5IHRoZSBDPHdyaXRlKCk+IG1ldGhvZCwgc2VlIGFib3ZlLgorCitXb3Jrc2hlZXQgcmVmZXJlbmNlcyBhcmUgdHlwaWNhbGx5IG9mIHRoZSBmb3JtIEM8U2hlZXQxIUExPi4gWW91IGNhbiBhbHNvIHJlZmVyIHRvIGEgd29ya3NoZWV0IHJhbmdlIHVzaW5nIHRoZSBzdGFuZGFyZCBFeGNlbCBub3RhdGlvbjogQzxTaGVldDEhQTE6QjI+LgorCitJbiBleHRlcm5hbCBsaW5rcyB0aGUgd29ya2Jvb2sgYW5kIHdvcmtzaGVldCBuYW1lIG11c3QgYmUgc2VwYXJhdGVkIGJ5IHRoZSBDPCM+IGNoYXJhY3RlcjogQzxleHRlcm5hbDpXb3JrYm9vay54bHMjU2hlZXQxIUExJz4uCisKK1lvdSBjYW4gYWxzbyBsaW5rIHRvIGEgbmFtZWQgcmFuZ2UgaW4gdGhlIHRhcmdldCB3b3Jrc2hlZXQuIEZvciBleGFtcGxlIHNheSB5b3UgaGF2ZSBhIG5hbWVkIHJhbmdlIGNhbGxlZCBDPG15X25hbWU+IGluIHRoZSB3b3JrYm9vayBDPGM6XHRlbXBcZm9vLnhscz4geW91IGNvdWxkIGxpbmsgdG8gaXQgYXMgZm9sbG93czoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTE0JywgJ2V4dGVybmFsOmM6XHRlbXBcZm9vLnhscyNteV9uYW1lJyk7CisKK05vdGUsIHlvdSBjYW5ub3QgY3VycmVudGx5IGNyZWF0ZSBuYW1lZCByYW5nZXMgd2l0aCBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworRXhjZWwgcmVxdWlyZXMgdGhhdCB3b3Jrc2hlZXQgbmFtZXMgY29udGFpbmluZyBzcGFjZXMgb3Igbm9uIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFyZSBzaW5nbGUgcXVvdGVkIGFzIGZvbGxvd3MgQzwnU2FsZXMgRGF0YSchQTE+LiBJZiB5b3UgbmVlZCB0byBkbyB0aGlzIGluIGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcgdGhlbiB5b3UgY2FuIGVpdGhlciBlc2NhcGUgdGhlIHNpbmdsZSBxdW90ZXMgQzxcJz4gb3IgdXNlIHRoZSBxdW90ZSBvcGVyYXRvciBDPHF7fT4gYXMgZGVzY3JpYmVkIGluIEM8cGVybG9wPiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uCisKK0xpbmtzIHRvIG5ldHdvcmsgZmlsZXMgYXJlIGFsc28gc3VwcG9ydGVkLiBNUy9Ob3ZlbGwgTmV0d29yayBmaWxlcyBub3JtYWxseSBiZWdpbiB3aXRoIHR3byBiYWNrIHNsYXNoZXMgYXMgZm9sbG93cyBDPFxcTkVUV09SS1xldGM+LiBJbiBvcmRlciB0byBnZW5lcmF0ZSB0aGlzIGluIGEgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZWQgc3RyaW5nIHlvdSB3aWxsIGhhdmUgdG8gZXNjYXBlIHRoZSBiYWNrc2xhc2hlcywgIEM8J1xcXFxORVRXT1JLXGV0Yyc+LgorCitJZiB5b3UgYXJlIHVzaW5nIGRvdWJsZSBxdW90ZSBzdHJpbmdzIHRoZW4geW91IHNob3VsZCBiZSBjYXJlZnVsIHRvIGVzY2FwZSBhbnl0aGluZyB0aGF0IGxvb2tzIGxpa2UgYSBtZXRhY2hhcmFjdGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiAgc2VlIEM8cGVybGZhcTU6IFdoeSBjYW4ndCBJIHVzZSAiQzpcdGVtcFxmb28iIGluIERPUyBwYXRocz8+LgorCitGaW5hbGx5LCB5b3UgY2FuIGF2b2lkIG1vc3Qgb2YgdGhlc2UgcXVvdGluZyBwcm9ibGVtcyBieSB1c2luZyBmb3J3YXJkIHNsYXNoZXMuIFRoZXNlIGFyZSB0cmFuc2xhdGVkIGludGVybmFsbHkgdG8gYmFja3NsYXNoZXM6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoJ0ExNCcsICJleHRlcm5hbDpjOi90ZW1wL2Zvby54bHMiICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBMTUnLCAnZXh0ZXJuYWw6Ly9ORVRXT1JLL3NoYXJlL2Zvby54bHMnICAgICApOworCitTZWUgYWxzbywgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4KKworCisKKworPWhlYWQyIHdyaXRlX3VybF9yYW5nZSgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKworVGhpcyBtZXRob2QgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdGhlIEM8d3JpdGVfdXJsKCk+IG1ldGhvZCBkZXNjcmliZWQgYWJvdmUuIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgYSBsaW5rIGZvciBhIHJhbmdlIG9mIGNlbGxzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKDAsIDAsIDAsIDMsICdmdHA6Ly93d3cucGVybC5vcmcvJyAgICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91cmwoMSwgMCwgMCwgMywgJ2h0dHA6Ly93d3cucGVybC5jb20vJywgJ1BlcmwgaG9tZScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3VybCgnQTM6RDMnLCAgICAnaW50ZXJuYWw6U2hlZXQyIUExJyAgICAgICAgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsKCdBNDpENCcsICAgICdleHRlcm5hbDpjOlx0ZW1wXGZvby54bHMnICAgICAgICAgKTsKKworCitUaGlzIG1ldGhvZCBpcyBnZW5lcmFsbHkgb25seSByZXF1aXJlZCB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBtZXJnZWQgY2VsbHMuIFNlZSB0aGUgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgYW5kIHRoZSBDPG1lcmdlPiBwcm9wZXJ0eSBvZiBhIEZvcm1hdCBvYmplY3QsIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworVGhlcmUgaXMgbm8gd2F5IHRvIGZvcmNlIHRoaXMgYmVoYXZpb3VyIHRocm91Z2ggdGhlIEM8d3JpdGUoKT4gbWV0aG9kLgorCitUaGUgcGFyYW1ldGVycyBDPCRzdHJpbmc+IGFuZCB0aGUgQzwkZm9ybWF0PiBhcmUgb3B0aW9uYWwgYW5kIHRoZWlyIHBvc2l0aW9uIGlzIGludGVyY2hhbmdlYWJsZS4gSG93ZXZlciwgdGhleSBhcmUgYXBwbGllZCBvbmx5IHRvIHRoZSBmaXJzdCBjZWxsIGluIHRoZSByYW5nZS4KKworU2VlIGFsc28sIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKworCisKKz1oZWFkMiB3cml0ZV9mb3JtdWxhKCRyb3csICRjb2x1bW4sICRmb3JtdWxhLCAkZm9ybWF0LCAkdmFsdWUpCisKK1dyaXRlIGEgZm9ybXVsYSBvciBmdW5jdGlvbiB0byB0aGUgY2VsbCBzcGVjaWZpZWQgYnkgQzwkcm93PiBhbmQgQzwkY29sdW1uPjoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMCwgMCwgJz0kQiQzICsgQjQnICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMSwgMCwgJz1TSU4oUEkoKS80KScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoMiwgMCwgJz1TVU0oQjE6QjUpJyApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E0JywgJz1JRihBMz4xLCJZZXMiLCAiTm8iKScgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E1JywgJz1BVkVSQUdFKDEsIDIsIDMsIDQpJyAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2Zvcm11bGEoJ0E2JywgJz1EQVRFVkFMVUUoIjEtSmFuLTIwMDEiKScpOworCitTZWUgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd3JpdGluZyBFeGNlbCBmb3JtdWxhcyBzZWUgTDxGT1JNVUxBUyBBTkQgRlVOQ1RJT05TIElOIEVYQ0VMPgorCitTZWUgYWxzbyB0aGUgc2VjdGlvbiAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBhbmQgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBhbmQgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2RzLgorCitJZiByZXF1aXJlZCwgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IHRoZSBjYWxjdWxhdGVkIHZhbHVlIG9mIHRoZSBmb3JtdWxhLiBUaGlzIGlzIG9jY2FzaW9uYWxseSBuZWNlc3Nhcnkgd2hlbiB3b3JraW5nIHdpdGggbm9uLUV4Y2VsIGFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IGNhbGN1bGF0ZWQgdGhlIHZhbHVlIG9mIHRoZSBmb3JtdWxhLiBUaGUgY2FsY3VsYXRlZCBDPCR2YWx1ZT4gaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgbGlzdDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MisyJywgJGZvcm1hdCwgNCk7CisKK0hvd2V2ZXIsIHRoaXMgcHJvYmFibHkgaXNuJ3Qgc29tZXRoaW5nIHRoYXQgd2lsbCBldmVyIG5lZWQgdG8gZG8uIElmIHlvdSBkbyB1c2UgdGhpcyBmZWF0dXJlIHRoZW4gZG8gc28gd2l0aCBjYXJlLgorCisKKworCis9aGVhZDIgc3RvcmVfZm9ybXVsYSgkZm9ybXVsYSkKKworVGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBtZXRob2QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEM8cmVwZWF0X2Zvcm11bGEoKT4gdG8gc3BlZWQgdXAgdGhlIGdlbmVyYXRpb24gb2YgcmVwZWF0ZWQgZm9ybXVsYXMuIFNlZSAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBpbiBMPEZPUk1VTEFTIEFORCBGVU5DVElPTlMgSU4gRVhDRUw+LgorCitUaGUgQzxzdG9yZV9mb3JtdWxhKCk+IG1ldGhvZCBwcmUtcGFyc2VzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIGZvcm11bGEgYW5kIHN0b3JlcyBpdCBmb3IgdXNlIGF0IGEgbGF0ZXIgc3RhZ2UgYnkgdGhlIEM8cmVwZWF0X2Zvcm11bGEoKT4gbWV0aG9kLgorCitDPHN0b3JlX2Zvcm11bGEoKT4gY2FycmllcyB0aGUgc2FtZSBzcGVlZCBwZW5hbHR5IGFzIEM8d3JpdGVfZm9ybXVsYSgpPi4gSG93ZXZlciwgaW4gcHJhY3RpY2UgaXQgd2lsbCBiZSB1c2VkIGxlc3MgZnJlcXVlbnRseS4KKworVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHNjYWxhciB0aGF0IGNhbiBiZSB0aG91Z2h0IG9mIGFzIGEgcmVmZXJlbmNlIHRvIGEgZm9ybXVsYS4KKworICAgIG15ICRzaW4gPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9U0lOKEExKScpOworICAgIG15ICRjb3MgPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9Q09TKEExKScpOworCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJHNpbiwgJGZvcm1hdCwgJ0ExJywgJ0EyJyk7CisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0MxJywgJGNvcywgJGZvcm1hdCwgJ0ExJywgJ0EyJyk7CisKK0FsdGhvdWdoIEM8c3RvcmVfZm9ybXVsYSgpPiBpcyBhIHdvcmtzaGVldCBtZXRob2QgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgdXNlZCBpbiBhbnkgd29ya3NoZWV0OgorCisgICAgbXkgJG5vdyA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1OT1coKScpOworCisgICAgJHdvcmtzaGVldDEtPnJlcGVhdF9mb3JtdWxhKCdCMScsICRub3cpOworICAgICR3b3Jrc2hlZXQyLT5yZXBlYXRfZm9ybXVsYSgnQjEnLCAkbm93KTsKKyAgICAkd29ya3NoZWV0My0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJG5vdyk7CisKKworCis9aGVhZDIgcmVwZWF0X2Zvcm11bGEoJHJvdywgJGNvbCwgJGZvcm11bGEsICRmb3JtYXQsICgkcGF0dGVybiA9PiAkcmVwbGFjZSwgLi4uKSkKKworCitUaGUgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2QgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIEM8c3RvcmVfZm9ybXVsYSgpPiB0byBzcGVlZCB1cCB0aGUgZ2VuZXJhdGlvbiBvZiByZXBlYXRlZCBmb3JtdWxhcy4gIFNlZSAiSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzIiBpbiBMPEZPUk1VTEFTIEFORCBGVU5DVElPTlMgSU4gRVhDRUw+LgorCitJbiBtYW55IHJlc3BlY3RzIEM8cmVwZWF0X2Zvcm11bGEoKT4gYmVoYXZlcyBsaWtlIEM8d3JpdGVfZm9ybXVsYSgpPiBleGNlcHQgdGhhdCBpdCBpcyBzaWduaWZpY2FudGx5IGZhc3Rlci4KKworVGhlIEM8cmVwZWF0X2Zvcm11bGEoKT4gbWV0aG9kIGNyZWF0ZXMgYSBuZXcgZm9ybXVsYSBiYXNlZCBvbiB0aGUgcHJlLXBhcnNlZCB0b2tlbnMgcmV0dXJuZWQgYnkgQzxzdG9yZV9mb3JtdWxhKCk+LiBUaGUgbmV3IGZvcm11bGEgaXMgZ2VuZXJhdGVkIGJ5IHN1YnN0aXR1dGluZyBDPCRwYXR0ZXJuPiwgQzwkcmVwbGFjZT4gcGFpcnMgaW4gdGhlIHN0b3JlZCBmb3JtdWxhOgorCisgICAgbXkgJGZvcm11bGEgPSAkd29ya3NoZWV0LT5zdG9yZV9mb3JtdWxhKCc9QTEgKiAzICsgNTAnKTsKKworICAgIGZvciBteSAkcm93ICgwLi45OSkgeworICAgICAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgkcm93LCAxLCAkZm9ybXVsYSwgJGZvcm1hdCwgJ0ExJywgJ0EnLigkcm93ICsxKSk7CisgICAgfQorCitJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBDPHJlcGVhdF9mb3JtdWxhKCk+IGRvZXNuJ3QgbW9kaWZ5IHRoZSB0b2tlbnMuIEluIHRoZSBhYm92ZSBleGFtcGxlIHRoZSBzdWJzdGl0dXRpb24gaXMgYWx3YXlzIG1hZGUgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdG9rZW4sIEM8QTE+LCB3aGljaCBkb2Vzbid0IGNoYW5nZS4KKworQXMgdXN1YWwsIHlvdSBjYW4gdXNlIEM8dW5kZWY+IGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnkgYSBDPCRmb3JtYXQ+OgorCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IyJywgJGZvcm11bGEsICRmb3JtYXQsICdBMScsICdBMicpOworICAgICR3b3Jrc2hlZXQtPnJlcGVhdF9mb3JtdWxhKCdCMycsICRmb3JtdWxhLCB1bmRlZiwgICAnQTEnLCAnQTMnKTsKKworVGhlIHN1YnN0aXR1dGlvbnMgYXJlIG1hZGUgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCB5b3UgY2FuIHVzZSBhcyBtYW55IEM8JHBhdHRlcm4+LCBDPCRyZXBsYWNlPiBwYWlycyBhcyB5b3UgbmVlZC4gSG93ZXZlciwgZWFjaCBzdWJzdGl0dXRpb24gaXMgbWFkZSBvbmx5IG9uY2U6CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSArIEExJyk7CisKKyAgICAjIEdpdmVzICc9QjEgKyBBMScKKyAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgnQjEnLCAkZm9ybXVsYSwgdW5kZWYsICdBMScsICdCMScpOworCisgICAgIyBHaXZlcyAnPUIxICsgQjEnCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IyJywgJGZvcm11bGEsIHVuZGVmLCAoJ0ExJywgJ0IxJykgeCAyKTsKKworU2luY2UgdGhlIEM8JHBhdHRlcm4+IGlzIGludGVycG9sYXRlZCBlYWNoIHRpbWUgdGhhdCBpdCBpcyB1c2VkIGl0IGlzIHdvcnRoIHVzaW5nIHRoZSBDPHFyPiBvcGVyYXRvciB0byBxdW90ZSB0aGUgcGF0dGVybi4gVGhlIEM8cXI+IG9wZXJhdG9yIGlzIGV4cGxhaW5lZCBpbiB0aGUgQzxwZXJsb3A+IG1hbiBwYWdlLgorCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0IxJywgJGZvcm11bGEsICRmb3JtYXQsIHFyL0ExLywgJ0EyJyk7CisKK0NhcmUgc2hvdWxkIGJlIHRha2VuIHdpdGggdGhlIHZhbHVlcyB0aGF0IGFyZSBzdWJzdGl0dXRlZC4gVGhlIGZvcm11bGEgcmV0dXJuZWQgYnkgQzxyZXBlYXRfZm9ybXVsYSgpPiBjb250YWlucyBzZXZlcmFsIG90aGVyIHRva2VucyBpbiBhZGRpdGlvbiB0byB0aG9zZSBpbiB0aGUgZm9ybXVsYSBhbmQgdGhlc2UgbWlnaHQgYWxzbyBtYXRjaCB0aGUgIHBhdHRlcm4gdGhhdCB5b3UgYXJlIHRyeWluZyB0byByZXBsYWNlLiBJbiBwYXJ0aWN1bGFyIHlvdSBzaG91bGQgYXZvaWQgc3Vic3RpdHV0aW5nIGEgc2luZ2xlIDAsIDEsIDIgb3IgMy4KKworWW91IHNob3VsZCBhbHNvIGJlIGNhcmVmdWwgdG8gYXZvaWQgZmFsc2UgbWF0Y2hlcy4gRm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyBzbmlwcGV0IGlzIG1lYW50IHRvIGNoYW5nZSB0aGUgc3RvcmVkIGZvcm11bGEgaW4gc3RlcHMgZnJvbSBDPD1BMSArIFNJTihBMSk+IHRvIEM8PUExMCArIFNJTihBMTApPi4KKworICAgIG15ICRmb3JtdWxhID0gJHdvcmtzaGVldC0+c3RvcmVfZm9ybXVsYSgnPUExICsgU0lOKEExKScpOworCisgICAgZm9yIG15ICRyb3cgKDEgLi4gMTApIHsKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdyAtMSwgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvQTEvLCAnQScgLiAkcm93LCAgICMhIEJhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF3L0ExLywgJ0EnIC4gJHJvdyAgICAjISBCYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9CisKK0hvd2V2ZXIgaXQgY29udGFpbnMgYSBidWcuIEluIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aGVuIEM8JHJvdz4gaXMgMTAgdGhlIGZvbGxvd2luZyBzdWJzdGl0dXRpb25zIHdpbGwgb2NjdXI6CisKKyAgICBzL0ExL0ExMC87ICAgIGNoYW5nZXMgICAgPUExICsgU0lOKEExKSAgICAgdG8gICAgPUExMCArIFNJTihBMSkKKyAgICBzL0ExL0ExMC87ICAgIGNoYW5nZXMgICAgPUExMCArIFNJTihBMSkgICAgdG8gICAgPUExMDAgKyBTSU4oQTEpICMgISEKKworVGhlIHNvbHV0aW9uIGluIHRoaXMgY2FzZSBpcyB0byB1c2UgYSBtb3JlIGV4cGxpY2l0IG1hdGNoIHN1Y2ggYXMgQzxxdy9eQTEkLz46CisKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdyAtMSwgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvXkExJC8sICdBJyAuICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9eQTEkLywgJ0EnIC4gJHJvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0Fub3RoZXIgc2ltaWxhciBwcm9ibGVtIG9jY3VycyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBzdWJzdGl0dXRpb25zIGFyZSBtYWRlIGluIG9yZGVyLiBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHNuaXBwZXQgaXMgbWVhbnQgdG8gY2hhbmdlIHRoZSBzdG9yZWQgZm9ybXVsYSBmcm9tIEM8PUExMCArIEExMT4gIHRvIEM8PUExMSArIEExMj46CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMTAgKyBBMTEnKTsKKworICAgICR3b3Jrc2hlZXQtPnJlcGVhdF9mb3JtdWxhKCdBMScsICRmb3JtdWxhLCB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvQTEwLywgJ0ExMScsICAgIyEgQmFkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9BMTEvLCAnQTEyJyAgICAjISBCYWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitIb3dldmVyLCB0aGUgYWN0dWFsIHN1YnN0aXR1dGlvbiB5aWVsZHMgQzw9QTEyICsgQTExPjoKKworICAgIHMvQTEwL0ExMS87ICAgIGNoYW5nZXMgICAgPUExMCArIEExMSAgICB0byAgICA9QTExICsgQTExCisgICAgcy9BMTEvQTEyLzsgICAgY2hhbmdlcyAgICA9QTExICsgQTExICAgIHRvICAgID1BMTIgKyBBMTEgIyAhIQorCitUaGUgc29sdXRpb24gaGVyZSB3b3VsZCBiZSB0byByZXZlcnNlIHRoZSBvcmRlciBvZiB0aGUgc3Vic3RpdHV0aW9ucyBvciB0byBzdGFydCB3aXRoIGEgc3RvcmVkIGZvcm11bGEgdGhhdCB3b24ndCB5aWVsZCBhIGZhbHNlIG1hdGNoIHN1Y2ggYXMgQzw9WDEwICsgWTExPjoKKworICAgIG15ICRmb3JtdWxhID0gJHdvcmtzaGVldC0+c3RvcmVfZm9ybXVsYSgnPVgxMCArIFkxMScpOworCisgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJ0ExJywgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdy9YMTAvLCAnQTExJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXcvWTExLywgJ0ExMicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworSWYgeW91IHRoaW5rIHRoYXQgeW91IGhhdmUgYSBwcm9ibGVtIHJlbGF0ZWQgdG8gYSBmYWxzZSBtYXRjaCB5b3UgY2FuIGNoZWNrIHRoZSB0b2tlbnMgdGhhdCB5b3UgYXJlIHN1YnN0aXR1dGluZyBhZ2FpbnN0IGFzIGZvbGxvd3MuCisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSo1KzQnKTsKKyAgICBwcmludCAiQCRmb3JtdWxhXG4iOworCitTZWUgYWxzbyB0aGUgQzxyZXBlYXQucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgd3JpdGVfY29tbWVudCgkcm93LCAkY29sdW1uLCAkc3RyaW5nLCAuLi4pCisKK1RoZSBDPHdyaXRlX2NvbW1lbnQoKT4gbWV0aG9kIGlzIHVzZWQgdG8gYWRkIGEgY29tbWVudCB0byBhIGNlbGwuIEEgY2VsbCBjb21tZW50IGlzIGluZGljYXRlZCBpbiBFeGNlbCBieSBhIHNtYWxsIHJlZCB0cmlhbmdsZSBpbiB0aGUgdXBwZXIgcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuIE1vdmluZyB0aGUgY3Vyc29yIG92ZXIgdGhlIHJlZCB0cmlhbmdsZSB3aWxsIHJldmVhbCB0aGUgY29tbWVudC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBjb21tZW50IHRvIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlICAgICAgICAoMiwgMiwgJ0hlbGxvJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgyLCAyLCAnVGhpcyBpcyBhIGNvbW1lbnQuJyk7CisKK0FzIHVzdWFsIHlvdSBjYW4gcmVwbGFjZSB0aGUgQzwkcm93PiBhbmQgQzwkY29sdW1uPiBwYXJhbWV0ZXJzIHdpdGggYW4gQzxBMT4gY2VsbCByZWZlcmVuY2UuIFNlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAgICgnQzMnLCAnSGVsbG8nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdUaGlzIGlzIGEgY29tbWVudC4nKTsKKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzx3cml0ZV9jb21tZW50KCk+IG1ldGhvZCB3aWxsIGFsc28gaGFuZGxlIHN0cmluZ3MgaW4gQzxVVEYtOD4gZm9ybWF0LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAiXHh7MjYzYX0iKTsgICAgICAgIyBTbWlsZXkKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDNCcsICdDb21tZW50IGNhIHZhPycpOworCitJbiBhZGRpdGlvbiB0byB0aGUgYmFzaWMgMyBhcmd1bWVudCBmb3JtIG9mIEM8d3JpdGVfY29tbWVudCgpPiB5b3UgY2FuIHBhc3MgaW4gc2V2ZXJhbCBvcHRpb25hbCBrZXkvdmFsdWUgcGFpcnMgdG8gY29udHJvbCB0aGUgZm9ybWF0IG9mIHRoZSBjb21tZW50LiBGb3IgZXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgdmlzaWJsZSA9PiAxLCBhdXRob3IgPT4gJ1BlcmwnKTsKKworTW9zdCBvZiB0aGVzZSBvcHRpb25zIGFyZSBxdWl0ZSBzcGVjaWZpYyBhbmQgaW4gZ2VuZXJhbCB0aGUgZGVmYXVsdCBjb21tZW50IGJlaGF2aW91ciB3aWxsIGJlIGFsbCB0aGF0IHlvdSBuZWVkLiBIb3dldmVyLCBzaG91bGQgeW91IG5lZWQgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIGZvcm1hdCBvZiB0aGUgY2VsbCBjb21tZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgYXZhaWxhYmxlOgorCisgICAgZW5jb2RpbmcKKyAgICBhdXRob3IKKyAgICBhdXRob3JfZW5jb2RpbmcKKyAgICB2aXNpYmxlCisgICAgeF9zY2FsZQorICAgIHdpZHRoCisgICAgeV9zY2FsZQorICAgIGhlaWdodAorICAgIGNvbG9yCisgICAgc3RhcnRfY2VsbAorICAgIHN0YXJ0X3JvdworICAgIHN0YXJ0X2NvbAorICAgIHhfb2Zmc2V0CisgICAgeV9vZmZzZXQKKworCis9b3ZlciA0CisKKz1pdGVtIE9wdGlvbjogZW5jb2RpbmcKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tZW50IHN0cmluZyBpcyBlbmNvZGVkIGFzIEM8VVRGLTE2QkU+LgorCisgICAgbXkgJGNvbW1lbnQgPSBwYWNrICduJywgMHgyNjNhOyAjIFVURi0xNkJFIFNtaWxleSBzeW1ib2wKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIGVuY29kaW5nID0+IDEpOworCitJZiB5b3Ugd2lzaCB0byB1c2UgVW5pY29kZSBjaGFyYWN0ZXJzIGluIHRoZSBjb21tZW50IHN0cmluZyB0aGVuIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGlzIHRvIHVzZSBwZXJsIDUuOCBhbmQgQzxVVEYtOD4gc3RyaW5ncywgc2VlIEw8VU5JQ09ERSBJTiBFWENFTD4uCisKKworPWl0ZW0gT3B0aW9uOiBhdXRob3IKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB3aG8gdGhlIGF1dGhvciBvZiB0aGUgY29tbWVudCBpcy4gRXhjZWwgZGlzcGxheXMgdGhlIGF1dGhvciBvZiB0aGUgY29tbWVudCBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIG9mIHRoZSB3b3Jrc2hlZXQuIFRoaXMgaXMgdXN1YWxseSBvZiBpbnRlcmVzdCBpbiBjb3Jwb3JhdGUgZW52aXJvbm1lbnRzIHdoZXJlIHNldmVyYWwgcGVvcGxlIG1pZ2h0IHJldmlldyBhbmQgcHJvdmlkZSBjb21tZW50cyB0byBhIHdvcmtib29rLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnQXRvbmVtZW50JywgYXV0aG9yID0+ICdJYW4gTWNFd2FuJyk7CisKKworPWl0ZW0gT3B0aW9uOiBhdXRob3JfZW5jb2RpbmcKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBhdXRob3Igc3RyaW5nIGlzIGVuY29kZWQgYXMgQzxVVEYtMTZCRT4uCisKKworPWl0ZW0gT3B0aW9uOiB2aXNpYmxlCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gbWFrZSBhIGNlbGwgY29tbWVudCB2aXNpYmxlIHdoZW4gdGhlIHdvcmtzaGVldCBpcyBvcGVuZWQuIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpbiBFeGNlbCBpcyB0aGF0IGNvbW1lbnRzIGFyZSBpbml0aWFsbHkgaGlkZGVuLiBIb3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIGluIEV4Y2VsIHRvIG1ha2UgaW5kaXZpZHVhbCBvciBhbGwgY29tbWVudHMgdmlzaWJsZS4gSW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5kaXZpZHVhbCBjb21tZW50cyBjYW4gYmUgbWFkZSB2aXNpYmxlIGFzIGZvbGxvd3M6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIHZpc2libGUgPT4gMSk7CisKK0l0IGlzIHBvc3NpYmxlIHRvIG1ha2UgYWxsIGNvbW1lbnRzIGluIGEgd29ya3NoZWV0IHZpc2libGUgdXNpbmcgdGhlIEM8c2hvd19jb21tZW50cygpPiB3b3Jrc2hlZXQgbWV0aG9kIChzZWUgYmVsb3cpLiBBbHRlcm5hdGl2ZWx5LCBpZiBhbGwgb2YgdGhlIGNlbGwgY29tbWVudHMgaGF2ZSBiZWVuIG1hZGUgdmlzaWJsZSB5b3UgY2FuIGhpZGUgaW5kaXZpZHVhbCBjb21tZW50czoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgdmlzaWJsZSA9PiAwKTsKKworCis9aXRlbSBPcHRpb246IHhfc2NhbGUKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGFzIGEgZmFjdG9yIG9mIHRoZSBkZWZhdWx0IHdpZHRoLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB4X3NjYWxlID0+IDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0M0JywgJ0hlbGxvJywgeF9zY2FsZSA9PiA0LjIpOworCisKKz1pdGVtIE9wdGlvbjogd2lkdGgKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIHdpZHRoIG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGV4cGxpY2l0bHkgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB3aWR0aCA9PiAyMDApOworCisKKz1pdGVtIE9wdGlvbjogeV9zY2FsZQorCitUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGFzIGEgZmFjdG9yIG9mIHRoZSBkZWZhdWx0IGhlaWdodC4KKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJ0hlbGxvJywgeV9zY2FsZSA9PiAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDNCcsICdIZWxsbycsIHlfc2NhbGUgPT4gNC4yKTsKKworCis9aXRlbSBPcHRpb246IGhlaWdodAorCitUaGlzIG9wdGlvbiBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IG9mIHRoZSBjZWxsIGNvbW1lbnQgYm94IGV4cGxpY2l0bHkgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBoZWlnaHQgPT4gMjAwKTsKKworCis9aXRlbSBPcHRpb246IGNvbG9yCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBiYWNrZ3JvdW5kIGNvbG91ciBvZiBjZWxsIGNvbW1lbnQgYm94LiBZb3UgY2FuIHVzZSBvbmUgb2YgdGhlIG5hbWVkIGNvbG91cnMgcmVjb2duaXNlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBvciBhIGNvbG91ciBpbmRleC4gU2VlIEw8Q09MT1VSUyBJTiBFWENFTD4uCisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIGNvbG9yID0+ICdncmVlbicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0M0JywgJ0hlbGxvJywgY29sb3IgPT4gMHgzNSk7ICAgICMgT3JhbmdlCisKKworPWl0ZW0gT3B0aW9uOiBzdGFydF9jZWxsCisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBjZWxsIGluIHdoaWNoIHRoZSBjb21tZW50IHdpbGwgYXBwZWFyLiBCeSBkZWZhdWx0IEV4Y2VsIGRpc3BsYXlzIGNvbW1lbnRzIG9uZSBjZWxsIHRvIHRoZSByaWdodCBhbmQgb25lIGNlbGwgYWJvdmUgdGhlIGNlbGwgdG8gd2hpY2ggdGhlIGNvbW1lbnQgcmVsYXRlcy4gSG93ZXZlciwgeW91IGNhbiBjaGFuZ2UgdGhpcyBiZWhhdmlvdXIgaWYgeW91IHdpc2guIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSB0aGUgY29tbWVudCB3aGljaCB3b3VsZCBhcHBlYXIgYnkgZGVmYXVsdCBpbiBjZWxsIEM8RDI+IGlzIG1vdmVkIHRvIEM8RTI+LgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBzdGFydF9jZWxsID0+ICdFMicpOworCisKKz1pdGVtIE9wdGlvbjogc3RhcnRfcm93CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSByb3cgaW4gd2hpY2ggdGhlIGNvbW1lbnQgd2lsbCBhcHBlYXIuIFNlZSB0aGUgQzxzdGFydF9jZWxsPiBvcHRpb24gYWJvdmUuIFRoZSByb3cgaXMgemVybyBpbmRleGVkLgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCBzdGFydF9yb3cgPT4gMCk7CisKKworPWl0ZW0gT3B0aW9uOiBzdGFydF9jb2wKKworVGhpcyBvcHRpb24gaXMgdXNlZCB0byBzZXQgdGhlIGNvbHVtbiBpbiB3aGljaCB0aGUgY29tbWVudCB3aWxsIGFwcGVhci4gU2VlIHRoZSBDPHN0YXJ0X2NlbGw+IG9wdGlvbiBhYm92ZS4gVGhlIGNvbHVtbiBpcyB6ZXJvIGluZGV4ZWQuCisKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdDMycsICdIZWxsbycsIHN0YXJ0X2NvbCA9PiA0KTsKKworCis9aXRlbSBPcHRpb246IHhfb2Zmc2V0CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB4IG9mZnNldCwgaW4gcGl4ZWxzLCBvZiBhIGNvbW1lbnQgd2l0aGluIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHhfb2Zmc2V0ID0+IDMwKTsKKworCis9aXRlbSBPcHRpb246IHlfb2Zmc2V0CisKK1RoaXMgb3B0aW9uIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB5IG9mZnNldCwgaW4gcGl4ZWxzLCBvZiBhIGNvbW1lbnQgd2l0aGluIGEgY2VsbDoKKworICAgICR3b3Jrc2hlZXQtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHhfb2Zmc2V0ID0+IDMwKTsKKworCis9YmFjaworCitZb3UgY2FuIGFwcGx5IGFzIG1hbnkgb2YgdGhlc2Ugb3B0aW9ucyBhcyB5b3UgcmVxdWlyZS4KKworQjxOb3RlIGFib3V0IHJvdyBoZWlnaHQgYW5kIGNvbW1lbnRzPi4gSWYgeW91IHNwZWNpZnkgdGhlIGhlaWdodCBvZiBhIHJvdyB0aGF0IGNvbnRhaW5zIGEgY29tbWVudCB0aGVuIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIGNvbW1lbnQgdG8gbWFpbnRhaW4gdGhlIGRlZmF1bHQgb3IgdXNlciBzcGVjaWZpZWQgZGltZW5zaW9ucy4gSG93ZXZlciwgdGhlIGhlaWdodCBvZiBhIHJvdyBjYW4gYWxzbyBiZSBhZGp1c3RlZCBhdXRvbWF0aWNhbGx5IGJ5IEV4Y2VsIGlmIHRoZSB0ZXh0IHdyYXAgcHJvcGVydHkgaXMgc2V0IG9yIGxhcmdlIGZvbnRzIGFyZSB1c2VkIGluIHRoZSBjZWxsLiBUaGlzIG1lYW5zIHRoYXQgdGhlIGhlaWdodCBvZiB0aGUgcm93IGlzIHVua25vd24gdG8gV3JpdGVFeGNlbCBhdCBydW4gdGltZSBhbmQgdGh1cyB0aGUgY29tbWVudCBib3ggaXMgc3RyZXRjaGVkIHdpdGggdGhlIHJvdy4gVXNlIHRoZSBDPHNldF9yb3coKT4gbWV0aG9kIHRvIHNwZWNpZnkgdGhlIHJvdyBoZWlnaHQgZXhwbGljaXRseSBhbmQgYXZvaWQgdGhpcyBwcm9ibGVtLgorCisKKz1oZWFkMiBzaG93X2NvbW1lbnRzKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBtYWtlIGFsbCBjZWxsIGNvbW1lbnRzIHZpc2libGUgd2hlbiBhIHdvcmtzaGVldCBpcyBvcGVuZWQuCisKK0luZGl2aWR1YWwgY29tbWVudHMgY2FuIGJlIG1hZGUgdmlzaWJsZSB1c2luZyB0aGUgQzx2aXNpYmxlPiBwYXJhbWV0ZXIgb2YgdGhlIEM8d3JpdGVfY29tbWVudD4gbWV0aG9kIChzZWUgYWJvdmUpOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB2aXNpYmxlID0+IDEpOworCitJZiBhbGwgb2YgdGhlIGNlbGwgY29tbWVudHMgaGF2ZSBiZWVuIG1hZGUgdmlzaWJsZSB5b3UgY2FuIGhpZGUgaW5kaXZpZHVhbCBjb21tZW50cyBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfY29tbWVudCgnQzMnLCAnSGVsbG8nLCB2aXNpYmxlID0+IDApOworCisKKworCis9aGVhZDIgYWRkX3dyaXRlX2hhbmRsZXIoJHJlLCAkY29kZV9yZWYpCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXh0ZW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZCB0byBoYW5kbGUgdXNlciBkZWZpbmVkIGRhdGEuCisKK0lmIHlvdSByZWZlciB0byB0aGUgc2VjdGlvbiBvbiBDPHdyaXRlKCk+IGFib3ZlIHlvdSB3aWxsIHNlZSB0aGF0IGl0IGFjdHMgYXMgYW4gYWxpYXMgZm9yIHNldmVyYWwgbW9yZSBzcGVjaWZpYyBDPHdyaXRlXyo+IG1ldGhvZHMuIEhvd2V2ZXIsIGl0IGRvZXNuJ3QgYWx3YXlzIGFjdCBpbiBleGFjdGx5IHRoZSB3YXkgdGhhdCB5b3Ugd291bGQgbGlrZSBpdCB0by4KKworT25lIHNvbHV0aW9uIGlzIHRvIGZpbHRlciB0aGUgaW5wdXQgZGF0YSB5b3Vyc2VsZiBhbmQgY2FsbCB0aGUgYXBwcm9wcmlhdGUgQzx3cml0ZV8qPiBtZXRob2QuIEFub3RoZXIgYXBwcm9hY2ggaXMgdG8gdXNlIHRoZSBDPGFkZF93cml0ZV9oYW5kbGVyKCk+IG1ldGhvZCB0byBhZGQgeW91ciBvd24gYXV0b21hdGVkIGJlaGF2aW91ciB0byBDPHdyaXRlKCk+LgorCitUaGUgQzxhZGRfd3JpdGVfaGFuZGxlcigpPiBtZXRob2QgdGFrZSB0d28gYXJndW1lbnRzLCBDPCRyZT4sIGEgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIGluY29taW5nIGRhdGEgYW5kIEM8JGNvZGVfcmVmPiBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGhhbmRsZSB0aGUgbWF0Y2hlZCBkYXRhOgorCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXIvXlxkXGRcZFxkJC8sIFwmbXlfd3JpdGUpOworCisoSW4gdGhlIHRoZXNlIGV4YW1wbGVzIHRoZSBDPHFyPiBvcGVyYXRvciBpcyB1c2VkIHRvIHF1b3RlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gc3RyaW5ncywgc2VlIEw8cGVybG9wPiBmb3IgbW9yZSBkZXRhaWxzKS4KKworVGhlIG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3MuIHNheSB5b3Ugd2lzaGVkIHRvIHdyaXRlIDcgZGlnaXQgSUQgbnVtYmVycyBhcyBhIHN0cmluZyBzbyB0aGF0IGFueSBsZWFkaW5nIHplcm9zIHdlcmUgcHJlc2VydmVkKiwgeW91IGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAkd29ya3NoZWV0LT5hZGRfd3JpdGVfaGFuZGxlcihxci9eXGR7N30kLywgXCZ3cml0ZV9teV9pZCk7CisKKworICAgIHN1YiB3cml0ZV9teV9pZCB7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgcmV0dXJuICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorCisqIFlvdSBjb3VsZCBhbHNvIHVzZSB0aGUgQzxrZWVwX2xlYWRpbmdfemVyb3MoKT4gbWV0aG9kIGZvciB0aGlzLgorCitUaGVuIGlmIHlvdSBjYWxsIEM8d3JpdGUoKT4gd2l0aCBhbiBhcHByb3ByaWF0ZSBzdHJpbmcgaXQgd2lsbCBiZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHk6CisKKyAgICAjIFdyaXRlcyAwMDAwMDAwLiBJdCB3b3VsZCBub3JtYWxseSBiZSB3cml0dGVuIGFzIGEgbnVtYmVyOyAwLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcwMDAwMDAwJyk7CisKK1RoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGNhbGxpbmcgd29ya3NoZWV0IGFuZCBhbGwgb2YgdGhlIG90aGVyIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIEM8d3JpdGUoKT4uIFRoZSBjYWxsYmFjayB3aWxsIHNlZSBhbiBDPEBfPiBhcmd1bWVudCBsaXN0IHRoYXQgbG9va3MgbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgJF9bMF0gICBBIHJlZiB0byB0aGUgY2FsbGluZyB3b3Jrc2hlZXQuICoKKyAgICAkX1sxXSAgIFplcm8gYmFzZWQgcm93IG51bWJlci4KKyAgICAkX1syXSAgIFplcm8gYmFzZWQgY29sdW1uIG51bWJlci4KKyAgICAkX1szXSAgIEEgbnVtYmVyIG9yIHN0cmluZyBvciB0b2tlbi4KKyAgICAkX1s0XSAgIEEgZm9ybWF0IHJlZiBpZiBhbnkuCisgICAgJF9bNV0gICBBbnkgb3RoZXIgYXJndW1lbnRzLgorICAgIC4uLgorCisgICAgKiAgSXQgaXMgZ29vZCBzdHlsZSB0byBzaGlmdCB0aGlzIG9mZiB0aGUgbGlzdCBzbyB0aGUgQF8gaXMgdGhlIHNhbWUKKyAgICAgICBhcyB0aGUgYXJndW1lbnQgbGlzdCBzZWVuIGJ5IHdyaXRlKCkuCisKK1lvdXIgY2FsbGJhY2sgc2hvdWxkIEM8cmV0dXJuKCk+IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIEM8d3JpdGVfKj4gbWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBvciBDPHVuZGVmPiB0byBpbmRpY2F0ZSB0aGF0IHlvdSByZWplY3RlZCB0aGUgbWF0Y2ggYW5kIHdhbnQgQzx3cml0ZSgpPiB0byBjb250aW51ZSBhcyBub3JtYWwuCisKK1NvIGZvciBleGFtcGxlIGlmIHlvdSB3aXNoZWQgdG8gYXBwbHkgdGhlIHByZXZpb3VzIGZpbHRlciBvbmx5IHRvIElEIHZhbHVlcyB0aGF0IG9jY3VyIGluIHRoZSBmaXJzdCBjb2x1bW4geW91IGNvdWxkIG1vZGlmeSB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uIGFzIGZvbGxvd3M6CisKKworICAgIHN1YiB3cml0ZV9teV9pZCB7CisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOworCisgICAgICAgIGlmICgkY29sID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoQF8pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBSZWplY3QgdGhlIG1hdGNoIGFuZCByZXR1cm4gY29udHJvbCB0byB3cml0ZSgpCisgICAgICAgICAgICByZXR1cm4gdW5kZWY7CisgICAgICAgIH0KKyAgICB9CisKK05vdywgeW91IHdpbGwgZ2V0IGRpZmZlcmVudCBiZWhhdmlvdXIgZm9yIHRoZSBmaXJzdCBjb2x1bW4gYW5kIG90aGVyIGNvbHVtbnM6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcpOyAjIFdyaXRlcyAwMDAwMDAwCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJzAwMDAwMDAnKTsgIyBXcml0ZXMgMAorCisKK1lvdSBtYXkgYWRkIG1vcmUgdGhhbiBvbmUgaGFuZGxlciBpbiB3aGljaCBjYXNlIHRoZXkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSB3ZXJlIGFkZGVkLgorCitOb3RlLCB0aGUgQzxhZGRfd3JpdGVfaGFuZGxlcigpPiBtZXRob2QgaXMgcGFydGljdWxhcmx5IHN1aXRlZCBmb3IgaGFuZGxpbmcgZGF0ZXMuCisKK1NlZSB0aGUgQzx3cml0ZV9oYW5kbGVyIDEtND4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBmb3IgZnVydGhlciBleGFtcGxlcy4KKworCisKKworPWhlYWQyIGluc2VydF9pbWFnZSgkcm93LCAkY29sLCAkZmlsZW5hbWUsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbnNlcnQgYSBpbWFnZSBpbnRvIGEgd29ya3NoZWV0LiBUaGUgaW1hZ2UgY2FuIGJlIGluIFBORywgSlBFRyBvciBCTVAgZm9ybWF0LiBUaGUgQzwkeD4sIEM8JHk+LCBDPCRzY2FsZV94PiBhbmQgQzwkc2NhbGVfeT4gcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwuCisKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2ltYWdlKCdBMScsICdwZXJsLmJtcCcpOworICAgICR3b3Jrc2hlZXQyLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJy4uL2ltYWdlcy9wZXJsLmJtcCcpOworICAgICR3b3Jrc2hlZXQzLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJy5jOlxpbWFnZXNccGVybC5ibXAnKTsKKworVGhlIHBhcmFtZXRlcnMgQzwkeD4gYW5kIEM8JHk+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGhhbmQgY29ybmVyIG9mIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2w+LiBUaGUgb2Zmc2V0IHZhbHVlcyBhcmUgaW4gcGl4ZWxzLgorCisgICAgJHdvcmtzaGVldDEtPmluc2VydF9pbWFnZSgnQTEnLCAncGVybC5ibXAnLCAzMiwgMTApOworCitUaGUgZGVmYXVsdCB3aWR0aCBvZiBhIGNlbGwgaXMgNjMgcGl4ZWxzLiBUaGUgZGVmYXVsdCBoZWlnaHQgb2YgYSBjZWxsIGlzIDE3IHBpeGVscy4gVGhlIHBpeGVscyBvZmZzZXRzIGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgcmVsYXRpb25zaGlwczoKKworICAgIFdwID0gaW50KDEyV2UpICAgaWYgV2UgPCAgMQorICAgIFdwID0gaW50KDdXZSArNSkgaWYgV2UgPj0gMQorICAgIEhwID0gaW50KDQvM0hlKQorCisgICAgd2hlcmU6CisgICAgV2UgaXMgdGhlIGNlbGwgd2lkdGggaW4gRXhjZWxzIHVuaXRzCisgICAgV3AgaXMgd2lkdGggaW4gcGl4ZWxzCisgICAgSGUgaXMgdGhlIGNlbGwgaGVpZ2h0IGluIEV4Y2VscyB1bml0cworICAgIEhwIGlzIGhlaWdodCBpbiBwaXhlbHMKKworVGhlIG9mZnNldHMgY2FuIGJlIGdyZWF0ZXIgdGhhbiB0aGUgd2lkdGggb3IgaGVpZ2h0IG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwuIFRoaXMgY2FuIGJlIG9jY2FzaW9uYWxseSB1c2VmdWwgaWYgeW91IHdpc2ggdG8gYWxpZ24gdHdvIG9yIG1vcmUgaW1hZ2VzIHJlbGF0aXZlIHRvIHRoZSBzYW1lIGNlbGwuCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBjYW4gYmUgdXNlZCB0byBzY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2UgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5OgorCisgICAgIyBTY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2U6IHdpZHRoIHggMi4wLCBoZWlnaHQgeCAwLjgKKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3BlcmwuYm1wJywgMCwgMCwgMiwgMC44KTsKKworU2VlIGFsc28gdGhlIEM8aW1hZ2VzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3Ryby4KKworTm90ZTogeW91IG11c3QgY2FsbCBDPHNldF9yb3coKT4gb3IgQzxzZXRfY29sdW1uKCk+IGJlZm9yZSBDPGluc2VydF9pbWFnZSgpPiBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgZGltZW5zaW9ucyBvZiBhbnkgb2YgdGhlIHJvd3Mgb3IgY29sdW1ucyB0aGF0IHRoZSBpbWFnZSBvY2N1cGllcy4gVGhlIGhlaWdodCBvZiBhIHJvdyBjYW4gYWxzbyBjaGFuZ2UgaWYgeW91IHVzZSBhIGZvbnQgdGhhdCBpcyBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdC4gVGhpcyBpbiB0dXJuIHdpbGwgYWZmZWN0IHRoZSBzY2FsaW5nIG9mIHlvdXIgaW1hZ2UuIFRvIGF2b2lkIHRoaXMgeW91IHNob3VsZCBleHBsaWNpdGx5IHNldCB0aGUgaGVpZ2h0IG9mIHRoZSByb3cgdXNpbmcgQzxzZXRfcm93KCk+IGlmIGl0IGNvbnRhaW5zIGEgZm9udCBzaXplIHRoYXQgd2lsbCBjaGFuZ2UgdGhlIHJvdyBoZWlnaHQuCisKKworQk1QIGltYWdlcyBtdXN0IGJlIDI0IGJpdCwgdHJ1ZSBjb2xvdXIsIGJpdG1hcHMuIEluIGdlbmVyYWwgaXQgaXMgYmVzdCB0byBhdm9pZCBCTVAgaW1hZ2VzIHNpbmNlIHRoZXkgYXJlbid0IGNvbXByZXNzZWQuIFRoZSBvbGRlciBDPGluc2VydF9iaXRtYXAoKT4gbWV0aG9kIGlzIHN0aWxsIHN1cHBvcnRlZCBidXQgZGVwcmVjYXRlZC4KKworCisKKworPWhlYWQyIGluc2VydF9jaGFydCgkcm93LCAkY29sLCAkY2hhcnQsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbnNlcnQgYSBDaGFydCBvYmplY3QgaW50byBhIHdvcmtzaGVldC4gVGhlIENoYXJ0IG11c3QgYmUgY3JlYXRlZCBieSB0aGUgQzxhZGRfY2hhcnQoKT4gV29ya2Jvb2sgbWV0aG9kICBhbmQgaXQgbXVzdCBoYXZlIHRoZSBDPGVtYmVkZGVkPiBvcHRpb24gc2V0LgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgLi4uCisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgYSB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCk7CisKK1NlZSBDPGFkZF9jaGFydCgpPiBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3JlYXRlIHRoZSBDaGFydCBvYmplY3QgYW5kIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0PiBmb3IgZGV0YWlscyBvbiBob3cgdG8gY29uZmlndXJlIGl0LiBTZWUgYWxzbyB0aGUgQzxjaGFydF8qLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK1RoZSBDPCR4PiwgQzwkeT4sIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4KKworVGhlIHBhcmFtZXRlcnMgQzwkeD4gYW5kIEM8JHk+IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gb2Zmc2V0IGZyb20gdGhlIHRvcCBsZWZ0IGhhbmQgY29ybmVyIG9mIHRoZSBjZWxsIHNwZWNpZmllZCBieSBDPCRyb3c+IGFuZCBDPCRjb2w+LiBUaGUgb2Zmc2V0IHZhbHVlcyBhcmUgaW4gcGl4ZWxzLiBTZWUgdGhlIEM8aW5zZXJ0X2ltYWdlPiBtZXRob2QgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2l6ZXMuCisKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCwgMywgMyk7CisKK1RoZSBwYXJhbWV0ZXJzIEM8JHNjYWxlX3g+IGFuZCBDPCRzY2FsZV95PiBjYW4gYmUgdXNlZCB0byBzY2FsZSB0aGUgaW5zZXJ0ZWQgaW1hZ2UgaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5OgorCisgICAgIyBTY2FsZSB0aGUgd2lkdGggYnkgMTIwJSBhbmQgdGhlIGhlaWdodCBieSAxNTAlCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCdFMicsICRjaGFydCwgMCwgMCwgMS4yLCAxLjUpOworCitUaGUgZWFzaWVzdCB3YXkgdG8gY2FsY3VsYXRlIHRoZSByZXF1aXJlZCBzY2FsaW5nIGlzIHRvIGNyZWF0ZSBhIHRlc3QgY2hhcnQgd29ya3NoZWV0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIFRoZW4gb3BlbiB0aGUgZmlsZSwgc2VsZWN0IHRoZSBjaGFydCBhbmQgZHJhZyB0aGUgY29ybmVyIHRvIGdldCB0aGUgcmVxdWlyZWQgc2l6ZS4gV2hpbGUgaG9sZGluZyBkb3duIHRoZSBtb3VzZSB0aGUgc2NhbGUgb2YgdGhlIHJlc2l6ZWQgY2hhcnQgaXMgc2hvd24gdG8gdGhlIGxlZnQgb2YgdGhlIGZvcm11bGEgYmFyLgorCitOb3RlOiB5b3UgbXVzdCBjYWxsIEM8c2V0X3JvdygpPiBvciBDPHNldF9jb2x1bW4oKT4gYmVmb3JlIEM8aW5zZXJ0X2NoYXJ0KCk+IGlmIHlvdSB3aXNoIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBkaW1lbnNpb25zIG9mIGFueSBvZiB0aGUgcm93cyBvciBjb2x1bW5zIHRoYXQgdGhlIGNoYXJ0IG9jY3VwaWVzLiBUaGUgaGVpZ2h0IG9mIGEgcm93IGNhbiBhbHNvIGNoYW5nZSBpZiB5b3UgdXNlIGEgZm9udCB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0LiBUaGlzIGluIHR1cm4gd2lsbCBhZmZlY3QgdGhlIHNjYWxpbmcgb2YgeW91ciBjaGFydC4gVG8gYXZvaWQgdGhpcyB5b3Ugc2hvdWxkIGV4cGxpY2l0bHkgc2V0IHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB1c2luZyBDPHNldF9yb3coKT4gaWYgaXQgY29udGFpbnMgYSBmb250IHNpemUgdGhhdCB3aWxsIGNoYW5nZSB0aGUgcm93IGhlaWdodC4KKworCisKKworPWhlYWQyIGVtYmVkX2NoYXJ0KCRyb3csICRjb2wsICRmaWxlbmFtZSwgJHgsICR5LCAkc2NhbGVfeCwgJHNjYWxlX3kpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluc2VydCBhIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGNoYXJ0IGludG8gYSB3b3Jrc2hlZXQuIFRoZSBjaGFydCBtdXN0IGZpcnN0IGJlIGV4dHJhY3RlZCBmcm9tIGFuIGV4aXN0aW5nIEV4Y2VsIGZpbGUuIFRoaXMgZmVhdHVyZSBpcyBzZW1pLWRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSAibmF0aXZlIiBjaGFydHMgY3JlYXRlZCB1c2luZyBDPGFkZF9jaGFydCgpPi4gUmVhZCBDPGV4dGVybmFsX2NoYXJ0cy50eHQ+IChvciBDPC5wb2Q+KSBpbiB0aGUgZXh0ZXJuYWxfY2hhcnRzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvIGZvciBhIGZ1bGwgZXhwbGFuYXRpb24uCisKK0hlcmUgaXMgYW4gZXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPmVtYmVkX2NoYXJ0KCdCMicsICdzYWxlc19jaGFydC5iaW4nKTsKKworVGhlIEM8JHg+LCBDPCR5PiwgQzwkc2NhbGVfeD4gYW5kIEM8JHNjYWxlX3k+IHBhcmFtZXRlcnMgYXJlIG9wdGlvbmFsLiBTZWUgQzxpbnNlcnRfY2hhcnQoKT4gYWJvdmUgZm9yIGRldGFpbHMuCisKKworCisKKz1oZWFkMiBkYXRhX3ZhbGlkYXRpb24oKQorCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24oKT4gbWV0aG9kIGlzIHVzZWQgdG8gY29uc3RydWN0IGFuIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbiBvciB0byBsaW1pdCB0aGUgdXNlciBpbnB1dCB0byBhIGRyb3Bkb3duIGxpc3Qgb2YgdmFsdWVzLgorCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0IzJywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgPT4gMTAwLAorICAgICAgICB9KTsKKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjU6QjknLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSA9PiAnbGlzdCcsCisgICAgICAgICAgICB2YWx1ZSAgICA9PiBbJ29wZW4nLCAnaGlnaCcsICdjbG9zZSddLAorICAgICAgICB9KTsKKworVGhpcyBtZXRob2QgY29udGFpbnMgYSBsb3Qgb2YgcGFyYW1ldGVycyBhbmQgaXMgZGVzY3JpYmVkIGluIGRldGFpbCBpbiBhIHNlcGFyYXRlIHNlY3Rpb24gTDxEQVRBIFZBTElEQVRJT04gSU4gRVhDRUw+LgorCisKK1NlZSBhbHNvIHRoZSBDPGRhdGFfdmFsaWRhdGUucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvCisKKworCisKKz1oZWFkMiBnZXRfbmFtZSgpCisKK1RoZSBDPGdldF9uYW1lKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHJldHJpZXZlIHRoZSBuYW1lIG9mIGEgd29ya3NoZWV0LiBGb3IgZXhhbXBsZToKKworICAgIGZvcmVhY2ggbXkgJHNoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgIHByaW50ICRzaGVldC0+Z2V0X25hbWUoKTsKKyAgICB9CisKK0ZvciByZWFzb25zIHJlbGF0ZWQgdG8gdGhlIGRlc2lnbiBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgdG8gdGhlIGludGVybmFscyBvZiBFeGNlbCB0aGVyZSBpcyBubyBDPHNldF9uYW1lKCk+IG1ldGhvZC4gVGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgd29ya3NoZWV0IG5hbWUgaXMgdmlhIHRoZSBDPGFkZF93b3Jrc2hlZXQoKT4gbWV0aG9kLgorCisKKworCis9aGVhZDIgYWN0aXZhdGUoKQorCitUaGUgQzxhY3RpdmF0ZSgpPiBtZXRob2QgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHdvcmtzaGVldCBpcyBpbml0aWFsbHkgdmlzaWJsZSBpbiBhIG11bHRpLXNoZWV0IHdvcmtib29rOgorCisgICAgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1RvJyk7CisgICAgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ3RoZScpOworICAgICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCd3aW5kJyk7CisKKyAgICAkd29ya3NoZWV0My0+YWN0aXZhdGUoKTsKKworVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBFeGNlbCBWQkEgYWN0aXZhdGUgbWV0aG9kLiBNb3JlIHRoYW4gb25lIHdvcmtzaGVldCBjYW4gYmUgc2VsZWN0ZWQgdmlhIHRoZSBDPHNlbGVjdCgpPiBtZXRob2QsIHNlZSBiZWxvdywgaG93ZXZlciBvbmx5IG9uZSB3b3Jrc2hlZXQgY2FuIGJlIGFjdGl2ZS4KKworVGhlIGRlZmF1bHQgYWN0aXZlIHdvcmtzaGVldCBpcyB0aGUgZmlyc3Qgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgc2VsZWN0KCkKKworVGhlIEM8c2VsZWN0KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgYSB3b3Jrc2hlZXQgaXMgc2VsZWN0ZWQgaW4gYSBtdWx0aS1zaGVldCB3b3JrYm9vazoKKworICAgICR3b3Jrc2hlZXQxLT5hY3RpdmF0ZSgpOworICAgICR3b3Jrc2hlZXQyLT5zZWxlY3QoKTsKKyAgICAkd29ya3NoZWV0My0+c2VsZWN0KCk7CisKK0Egc2VsZWN0ZWQgd29ya3NoZWV0IGhhcyBpdHMgdGFiIGhpZ2hsaWdodGVkLiBTZWxlY3Rpbmcgd29ya3NoZWV0cyBpcyBhIHdheSBvZiBncm91cGluZyB0aGVtIHRvZ2V0aGVyIHNvIHRoYXQsIGZvciBleGFtcGxlLCBzZXZlcmFsIHdvcmtzaGVldHMgY291bGQgYmUgcHJpbnRlZCBpbiBvbmUgZ28uIEEgd29ya3NoZWV0IHRoYXQgaGFzIGJlZW4gYWN0aXZhdGVkIHZpYSB0aGUgQzxhY3RpdmF0ZSgpPiBtZXRob2Qgd2lsbCBhbHNvIGFwcGVhciBhcyBzZWxlY3RlZC4KKworCisKKworPWhlYWQyIGhpZGUoKQorCitUaGUgQzxoaWRlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGhpZGUgYSB3b3Jrc2hlZXQ6CisKKyAgICAkd29ya3NoZWV0Mi0+aGlkZSgpOworCitZb3UgbWF5IHdpc2ggdG8gaGlkZSBhIHdvcmtzaGVldCBpbiBvcmRlciB0byBhdm9pZCBjb25mdXNpbmcgYSB1c2VyIHdpdGggaW50ZXJtZWRpYXRlIGRhdGEgb3IgY2FsY3VsYXRpb25zLgorCitBIGhpZGRlbiB3b3Jrc2hlZXQgY2FuIG5vdCBiZSBhY3RpdmF0ZWQgb3Igc2VsZWN0ZWQgc28gdGhpcyBtZXRob2QgaXMgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggdGhlIEM8YWN0aXZhdGUoKT4gYW5kIEM8c2VsZWN0KCk+IG1ldGhvZHMuIEluIGFkZGl0aW9uLCBzaW5jZSB0aGUgZmlyc3Qgd29ya3NoZWV0IHdpbGwgZGVmYXVsdCB0byBiZWluZyB0aGUgYWN0aXZlIHdvcmtzaGVldCwgeW91IGNhbm5vdCBoaWRlIHRoZSBmaXJzdCB3b3Jrc2hlZXQgd2l0aG91dCBhY3RpdmF0aW5nIGFub3RoZXIgc2hlZXQ6CisKKyAgICAkd29ya3NoZWV0Mi0+YWN0aXZhdGUoKTsKKyAgICAkd29ya3NoZWV0MS0+aGlkZSgpOworCisKKworCis9aGVhZDIgc2V0X2ZpcnN0X3NoZWV0KCkKKworVGhlIEM8YWN0aXZhdGUoKT4gbWV0aG9kIGRldGVybWluZXMgd2hpY2ggd29ya3NoZWV0IGlzIGluaXRpYWxseSBzZWxlY3RlZC4gSG93ZXZlciwgaWYgdGhlcmUgYXJlIGEgbGFyZ2UgbnVtYmVyIG9mIHdvcmtzaGVldHMgdGhlIHNlbGVjdGVkIHdvcmtzaGVldCBtYXkgbm90IGFwcGVhciBvbiB0aGUgc2NyZWVuLiBUbyBhdm9pZCB0aGlzIHlvdSBjYW4gc2VsZWN0IHdoaWNoIGlzIHRoZSBsZWZ0bW9zdCB2aXNpYmxlIHdvcmtzaGVldCB1c2luZyBDPHNldF9maXJzdF9zaGVldCgpPjoKKworICAgIGZvciAoMS4uMjApIHsKKyAgICAgICAgJHdvcmtib29rLT5hZGRfd29ya3NoZWV0OworICAgIH0KKworICAgICR3b3Jrc2hlZXQyMSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICR3b3Jrc2hlZXQyMiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgJHdvcmtzaGVldDIxLT5zZXRfZmlyc3Rfc2hlZXQoKTsKKyAgICAkd29ya3NoZWV0MjItPmFjdGl2YXRlKCk7CisKK1RoaXMgbWV0aG9kIGlzIG5vdCByZXF1aXJlZCB2ZXJ5IG9mdGVuLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZmlyc3Qgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgcHJvdGVjdCgkcGFzc3dvcmQpCisKK1RoZSBDPHByb3RlY3QoKT4gbWV0aG9kIGlzIHVzZWQgdG8gcHJvdGVjdCBhIHdvcmtzaGVldCBmcm9tIG1vZGlmaWNhdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoKTsKKworSXQgY2FuIGJlIHR1cm5lZCBvZmYgaW4gRXhjZWwgdmlhIHRoZSBDPFRvb2xzLUU8Z3Q+UHJvdGVjdGlvbi1FPGd0PlVucHJvdGVjdCBTaGVldD4gbWVudSBjb21tYW5kLgorCitUaGUgQzxwcm90ZWN0KCk+IG1ldGhvZCBhbHNvIGhhcyB0aGUgZWZmZWN0IG9mIGVuYWJsaW5nIGEgY2VsbCdzIEM8bG9ja2VkPiBhbmQgQzxoaWRkZW4+IHByb3BlcnRpZXMgaWYgdGhleSBoYXZlIGJlZW4gc2V0LiBBICJsb2NrZWQiIGNlbGwgY2Fubm90IGJlIGVkaXRlZC4gQSAiaGlkZGVuIiBjZWxsIHdpbGwgZGlzcGxheSB0aGUgcmVzdWx0cyBvZiBhIGZvcm11bGEgYnV0IG5vdCB0aGUgZm9ybXVsYSBpdHNlbGYuIEluIEV4Y2VsIGEgY2VsbCdzIGxvY2tlZCBwcm9wZXJ0eSBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgIyBTZXQgc29tZSBmb3JtYXQgcHJvcGVydGllcworICAgIG15ICR1bmxvY2tlZCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobG9ja2VkID0+IDApOworICAgIG15ICRoaWRkZW4gICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoaGlkZGVuID0+IDEpOworCisgICAgIyBFbmFibGUgd29ya3NoZWV0IHByb3RlY3Rpb24KKyAgICAkd29ya3NoZWV0LT5wcm90ZWN0KCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW5ub3QgYmUgZWRpdGVkLCBpdCBpcyBsb2NrZWQgYnkgZGVmYXVsdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJyk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW4gYmUgZWRpdGVkCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJz0xKzInLCAkdW5sb2NrZWQpOworCisgICAgIyBUaGUgZm9ybXVsYSBpbiB0aGlzIGNlbGwgaXNuJ3QgdmlzaWJsZQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICc9MSsyJywgJGhpZGRlbik7CisKK1NlZSBhbHNvIHRoZSBDPHNldF9sb2NrZWQ+IGFuZCBDPHNldF9oaWRkZW4+IGZvcm1hdCBtZXRob2RzIGluIEw8Q0VMTCBGT1JNQVRUSU5HPi4KKworWW91IGNhbiBvcHRpb25hbGx5IGFkZCBhIHBhc3N3b3JkIHRvIHRoZSB3b3Jrc2hlZXQgcHJvdGVjdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoJ2Ryb3dzc2FwJyk7CisKK05vdGUsIHRoZSB3b3Jrc2hlZXQgbGV2ZWwgcGFzc3dvcmQgaW4gRXhjZWwgcHJvdmlkZXMgdmVyeSB3ZWFrIHByb3RlY3Rpb24uIEl0IGRvZXMgbm90IGVuY3J5cHQgeW91ciBkYXRhIGluIGFueSB3YXkgYW5kIGl0IGlzIHZlcnkgZWFzeSB0byBkZWFjdGl2YXRlLiBUaGVyZWZvcmUsIGRvIG5vdCB1c2UgdGhlIGFib3ZlIG1ldGhvZCBpZiB5b3Ugd2lzaCB0byBwcm90ZWN0IHNlbnNpdGl2ZSBkYXRhIG9yIGNhbGN1bGF0aW9ucy4gSG93ZXZlciwgYmVmb3JlIHlvdSBnZXQgd29ycmllZCwgRXhjZWwncyBvd24gd29ya2Jvb2sgbGV2ZWwgcGFzc3dvcmQgcHJvdGVjdGlvbiBkb2VzIHByb3ZpZGUgc3Ryb25nIGVuY3J5cHRpb24gaW4gRXhjZWwgOTcrLiBGb3IgdGVjaG5pY2FsIHJlYXNvbnMgdGhpcyB3aWxsIG5ldmVyIGJlIHN1cHBvcnRlZCBieSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworCisKKworPWhlYWQyIHNldF9zZWxlY3Rpb24oJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgd2hpY2ggY2VsbCBvciBjZWxscyBhcmUgc2VsZWN0ZWQgaW4gYSB3b3Jrc2hlZXQuIFRoZSBtb3N0IGNvbW1vbiByZXF1aXJlbWVudCBpcyB0byBzZWxlY3QgYSBzaW5nbGUgY2VsbCwgaW4gd2hpY2ggY2FzZSBDPCRsYXN0X3Jvdz4gYW5kIEM8JGxhc3RfY29sPiBjYW4gYmUgb21pdHRlZC4gVGhlIGFjdGl2ZSBjZWxsIHdpdGhpbiBhIHNlbGVjdGVkIHJhbmdlIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIGluIHdoaWNoIEM8JGZpcnN0PiBhbmQgQzwkbGFzdD4gYXJlIHNwZWNpZmllZC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgY2VsbCBvciBhIHJhbmdlIHVzaW5nIEExIG5vdGF0aW9uLiBTZWUgdGhlIG5vdGUgYWJvdXQgTDxDZWxsIG5vdGF0aW9uPi4KKworRXhhbXBsZXM6CisKKyAgICAkd29ya3NoZWV0MS0+c2V0X3NlbGVjdGlvbigzLCAzKTsgICAgICAgIyAxLiBDZWxsIEQ0LgorICAgICR3b3Jrc2hlZXQyLT5zZXRfc2VsZWN0aW9uKDMsIDMsIDYsIDYpOyAjIDIuIENlbGxzIEQ0IHRvIEc3LgorICAgICR3b3Jrc2hlZXQzLT5zZXRfc2VsZWN0aW9uKDYsIDYsIDMsIDMpOyAjIDMuIENlbGxzIEc3IHRvIEQ0LgorICAgICR3b3Jrc2hlZXQ0LT5zZXRfc2VsZWN0aW9uKCdENCcpOyAgICAgICAjIFNhbWUgYXMgMS4KKyAgICAkd29ya3NoZWV0NS0+c2V0X3NlbGVjdGlvbignRDQ6RzcnKTsgICAgIyBTYW1lIGFzIDIuCisgICAgJHdvcmtzaGVldDYtPnNldF9zZWxlY3Rpb24oJ0c3OkQ0Jyk7ICAgICMgU2FtZSBhcyAzLgorCitUaGUgZGVmYXVsdCBjZWxsIHNlbGVjdGlvbnMgaXMgKDAsIDApLCAnQTEnLgorCisKKworCis9aGVhZDIgc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIGEgcm93LiBBbGwgcGFyYW1ldGVycyBhcGFydCBmcm9tIEM8JHJvdz4gYXJlIG9wdGlvbmFsLgorCitUaGUgbW9zdCBjb21tb24gdXNlIGZvciB0aGlzIG1ldGhvZCBpcyB0byBjaGFuZ2UgdGhlIGhlaWdodCBvZiBhIHJvdzoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMjApOyAjIFJvdyAxIGhlaWdodCBzZXQgdG8gMjAKKworSWYgeW91IHdpc2ggdG8gc2V0IHRoZSBmb3JtYXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgaGVpZ2h0IHlvdSBjYW4gcGFzcyBDPHVuZGVmPiBhcyB0aGUgaGVpZ2h0IHBhcmFtZXRlcjoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgdW5kZWYsICRmb3JtYXQpOworCitUaGUgQzwkZm9ybWF0PiBwYXJhbWV0ZXIgd2lsbCBiZSBhcHBsaWVkIHRvIGFueSBjZWxscyBpbiB0aGUgcm93IHRoYXQgZG9uJ3QgIGhhdmUgYSBmb3JtYXQuIEZvciBleGFtcGxlCisKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIHVuZGVmLCAkZm9ybWF0MSk7ICAgICMgU2V0IHRoZSBmb3JtYXQgZm9yIHJvdyAxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvJyk7ICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0hlbGxvJywgJGZvcm1hdDIpOyAjIEtlZXBzICRmb3JtYXQyCisKK0lmIHlvdSB3aXNoIHRvIGRlZmluZSBhIHJvdyBmb3JtYXQgaW4gdGhpcyB3YXkgeW91IHNob3VsZCBjYWxsIHRoZSBtZXRob2QgYmVmb3JlIGFueSBjYWxscyB0byBDPHdyaXRlKCk+LiBDYWxsaW5nIGl0IGFmdGVyd2FyZHMgd2lsbCBvdmVyd3JpdGUgYW55IGZvcm1hdCB0aGF0IHdhcyBwcmV2aW91c2x5IHNwZWNpZmllZC4KKworVGhlIEM8JGhpZGRlbj4gcGFyYW1ldGVyIHNob3VsZCBiZSBzZXQgdG8gMSBpZiB5b3Ugd2lzaCB0byBoaWRlIGEgcm93LiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gaGlkZSBpbnRlcm1lZGlhcnkgc3RlcHMgaW4gYSBjb21wbGljYXRlZCBjYWxjdWxhdGlvbjoKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMjAsICAgICRmb3JtYXQsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMSwgdW5kZWYsIHVuZGVmLCAgIDEpOworCitUaGUgQzwkbGV2ZWw+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgb3V0bGluZSBsZXZlbCBvZiB0aGUgcm93LiBPdXRsaW5lcyBhcmUgZGVzY3JpYmVkIGluIEw8T1VUTElORVMgQU5EIEdST1VQSU5HIElOIEVYQ0VMPi4gQWRqYWNlbnQgcm93cyB3aXRoIHRoZSBzYW1lIG91dGxpbmUgbGV2ZWwgYXJlIGdyb3VwZWQgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBvdXRsaW5lLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBhbiBvdXRsaW5lIGxldmVsIG9mIDEgZm9yIHJvd3MgMSBhbmQgMiAoemVyby1pbmRleGVkKToKKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMSwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDIsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisKK1RoZSBDPCRoaWRkZW4+IHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIHRvIGhpZGUgY29sbGFwc2VkIG91dGxpbmVkIHJvd3Mgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIuCisKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDEsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygyLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworCitGb3IgY29sbGFwc2VkIG91dGxpbmVzIHlvdSBzaG91bGQgYWxzbyBpbmRpY2F0ZSB3aGljaCByb3cgaGFzIHRoZSBjb2xsYXBzZWQgQzwrPiBzeW1ib2wgdXNpbmcgdGhlIG9wdGlvbmFsIEM8JGNvbGxhcHNlZD4gcGFyYW1ldGVyLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygzLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOworCitGb3IgYSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgc2VlIHRoZSBDPG91dGxpbmUucGw+IGFuZCBDPG91dGxpbmVfY29sbGFwc2VkLnBsPiBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKK0V4Y2VsIGFsbG93cyB1cCB0byA3IG91dGxpbmUgbGV2ZWxzLiBUaGVyZWZvcmUgdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIgc2hvdWxkIGJlIGluIHRoZSByYW5nZSBDPDAgRTxsdD49ICRsZXZlbCBFPGx0Pj0gNz4uCisKKworCisKKz1oZWFkMiBzZXRfY29sdW1uKCRmaXJzdF9jb2wsICRsYXN0X2NvbCwgJHdpZHRoLCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIGNvbHVtbiBvciBhIHJhbmdlIG9mIGNvbHVtbnMuIEFsbCBwYXJhbWV0ZXJzIGFwYXJ0IGZyb20gQzwkZmlyc3RfY29sPiBhbmQgQzwkbGFzdF9jb2w+IGFyZSBvcHRpb25hbC4KKworSWYgQzxzZXRfY29sdW1uKCk+IGlzIGFwcGxpZWQgdG8gYSBzaW5nbGUgY29sdW1uIHRoZSB2YWx1ZSBvZiBDPCRmaXJzdF9jb2w+IGFuZCBDPCRsYXN0X2NvbD4gc2hvdWxkIGJlIHRoZSBzYW1lLiBJbiB0aGUgY2FzZSB3aGVyZSBDPCRsYXN0X2NvbD4gaXMgemVybyBpdCBpcyBzZXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgQzwkZmlyc3RfY29sPi4KKworSXQgaXMgYWxzbyBwb3NzaWJsZSwgYW5kIGdlbmVyYWxseSBjbGVhcmVyLCB0byBzcGVjaWZ5IGEgY29sdW1uIHJhbmdlIHVzaW5nIHRoZSBmb3JtIG9mIEExIG5vdGF0aW9uIHVzZWQgZm9yIGNvbHVtbnMuIFNlZSB0aGUgbm90ZSBhYm91dCBMPENlbGwgbm90YXRpb24+LgorCitFeGFtcGxlczoKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgIDIwKTsgIyBDb2x1bW4gIEEgICB3aWR0aCBzZXQgdG8gMjAKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDMsICAzMCk7ICMgQ29sdW1ucyBCLUQgd2lkdGggc2V0IHRvIDMwCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRTpFJywgMjApOyAjIENvbHVtbiAgRSAgIHdpZHRoIHNldCB0byAyMAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0Y6SCcsIDMwKTsgIyBDb2x1bW5zIEYtSCB3aWR0aCBzZXQgdG8gMzAKKworVGhlIHdpZHRoIGNvcnJlc3BvbmRzIHRvIHRoZSBjb2x1bW4gd2lkdGggdmFsdWUgdGhhdCBpcyBzcGVjaWZpZWQgaW4gRXhjZWwuIEl0IGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiBhIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBmb250IG9mIEFyaWFsIDEwLiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gc3BlY2lmeSAiQXV0b0ZpdCIgZm9yIGEgY29sdW1uIGluIHRoZSBFeGNlbCBmaWxlIGZvcm1hdC4gVGhpcyBmZWF0dXJlIGlzIG9ubHkgYXZhaWxhYmxlIGF0IHJ1bnRpbWUgZnJvbSB3aXRoaW4gRXhjZWwuCisKK0FzIHVzdWFsIHRoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciBpcyBvcHRpb25hbCwgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHNlZSBMPENFTEwgRk9STUFUVElORz4uIElmIHlvdSB3aXNoIHRvIHNldCB0aGUgZm9ybWF0IHdpdGhvdXQgY2hhbmdpbmcgdGhlIHdpZHRoIHlvdSBjYW4gcGFzcyBDPHVuZGVmPiBhcyB0aGUgd2lkdGggcGFyYW1ldGVyOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCB1bmRlZiwgJGZvcm1hdCk7CisKK1RoZSBDPCRmb3JtYXQ+IHBhcmFtZXRlciB3aWxsIGJlIGFwcGxpZWQgdG8gYW55IGNlbGxzIGluIHRoZSBjb2x1bW4gdGhhdCBkb24ndCAgaGF2ZSBhIGZvcm1hdC4gRm9yIGV4YW1wbGUKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIHVuZGVmLCAkZm9ybWF0MSk7ICMgU2V0IGZvcm1hdCBmb3IgY29sIDEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGVsbG8nKTsgICAgICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0hlbGxvJywgJGZvcm1hdDIpOyAgICAgIyBLZWVwcyAkZm9ybWF0MgorCitJZiB5b3Ugd2lzaCB0byBkZWZpbmUgYSBjb2x1bW4gZm9ybWF0IGluIHRoaXMgd2F5IHlvdSBzaG91bGQgY2FsbCB0aGUgbWV0aG9kIGJlZm9yZSBhbnkgY2FsbHMgdG8gQzx3cml0ZSgpPi4gSWYgeW91IGNhbGwgaXQgYWZ0ZXJ3YXJkcyBpdCB3b24ndCBoYXZlIGFueSBlZmZlY3QuCisKK0EgZGVmYXVsdCByb3cgZm9ybWF0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBhIGRlZmF1bHQgY29sdW1uIGZvcm1hdAorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCB1bmRlZiwgICAgICAgICRmb3JtYXQxKTsgIyBTZXQgZm9ybWF0IGZvciByb3cgMQorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIHVuZGVmLCAkZm9ybWF0Mik7ICMgU2V0IGZvcm1hdCBmb3IgY29sIDEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSGVsbG8nKTsgICAgICAgICAgICAgICAjIERlZmF1bHRzIHRvICRmb3JtYXQxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0hlbGxvJyk7ICAgICAgICAgICAgICAgIyBEZWZhdWx0cyB0byAkZm9ybWF0MgorCitUaGUgQzwkaGlkZGVuPiBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNldCB0byAxIGlmIHlvdSB3aXNoIHRvIGhpZGUgYSBjb2x1bW4uIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBoaWRlIGludGVybWVkaWFyeSBzdGVwcyBpbiBhIGNvbXBsaWNhdGVkIGNhbGN1bGF0aW9uOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRDpEJywgMjAsICAgICRmb3JtYXQsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0U6RScsIHVuZGVmLCB1bmRlZiwgICAxKTsKKworVGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIG91dGxpbmUgbGV2ZWwgb2YgdGhlIGNvbHVtbi4gT3V0bGluZXMgYXJlIGRlc2NyaWJlZCBpbiBMPE9VVExJTkVTIEFORCBHUk9VUElORyBJTiBFWENFTD4uIEFkamFjZW50IGNvbHVtbnMgd2l0aCB0aGUgc2FtZSBvdXRsaW5lIGxldmVsIGFyZSBncm91cGVkIHRvZ2V0aGVyIGludG8gYSBzaW5nbGUgb3V0bGluZS4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNldHMgYW4gb3V0bGluZSBsZXZlbCBvZiAxIGZvciBjb2x1bW5zIEIgdG8gRzoKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RycsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisKK1RoZSBDPCRoaWRkZW4+IHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIHRvIGhpZGUgY29sbGFwc2VkIG91dGxpbmVkIGNvbHVtbnMgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEM8JGxldmVsPiBwYXJhbWV0ZXIuCisKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkcnLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworCitGb3IgY29sbGFwc2VkIG91dGxpbmVzIHlvdSBzaG91bGQgYWxzbyBpbmRpY2F0ZSB3aGljaCByb3cgaGFzIHRoZSBjb2xsYXBzZWQgQzwrPiBzeW1ib2wgdXNpbmcgdGhlIG9wdGlvbmFsIEM8JGNvbGxhcHNlZD4gcGFyYW1ldGVyLgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignSDpIJywgdW5kZWYsIHVuZGVmLCAwLCAwLCAxKTsKKworRm9yIGEgbW9yZSBjb21wbGV0ZSBleGFtcGxlIHNlZSB0aGUgQzxvdXRsaW5lLnBsPiBhbmQgQzxvdXRsaW5lX2NvbGxhcHNlZC5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitFeGNlbCBhbGxvd3MgdXAgdG8gNyBvdXRsaW5lIGxldmVscy4gVGhlcmVmb3JlIHRoZSBDPCRsZXZlbD4gcGFyYW1ldGVyIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgQzwwIEU8bHQ+PSAkbGV2ZWwgRTxsdD49IDc+LgorCisKKworCis9aGVhZDIgb3V0bGluZV9zZXR0aW5ncygkdmlzaWJsZSwgJHN5bWJvbHNfYmVsb3csICRzeW1ib2xzX3JpZ2h0LCAkYXV0b19zdHlsZSkKKworVGhlIEM8b3V0bGluZV9zZXR0aW5ncygpPiBtZXRob2QgaXMgdXNlZCB0byBjb250cm9sIHRoZSBhcHBlYXJhbmNlIG9mIG91dGxpbmVzIGluIEV4Y2VsLiBPdXRsaW5lcyBhcmUgZGVzY3JpYmVkIGluIEw8T1VUTElORVMgQU5EIEdST1VQSU5HIElOIEVYQ0VMPi4KKworVGhlIEM8JHZpc2libGU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbnRyb2wgd2hldGhlciBvciBub3Qgb3V0bGluZXMgYXJlIHZpc2libGUuIFNldHRpbmcgdGhpcyBwYXJhbWV0ZXIgdG8gMCB3aWxsIGNhdXNlIGFsbCBvdXRsaW5lcyBvbiB0aGUgd29ya3NoZWV0IHRvIGJlIGhpZGRlbi4gVGhleSBjYW4gYmUgdW5oaWRkZW4gaW4gRXhjZWwgYnkgbWVhbnMgb2YgdGhlICJTaG93IE91dGxpbmUgU3ltYm9scyIgY29tbWFuZCBidXR0b24uIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMSBmb3IgdmlzaWJsZSBvdXRsaW5lcy4KKworICAgICR3b3Jrc2hlZXQtPm91dGxpbmVfc2V0dGluZ3MoMCk7CisKK1RoZSBDPCRzeW1ib2xzX2JlbG93PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIHJvdyBvdXRsaW5lIHN5bWJvbCB3aWxsIGFwcGVhciBhYm92ZSBvciBiZWxvdyB0aGUgb3V0bGluZSBsZXZlbCBiYXIuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMSBmb3Igc3ltYm9scyB0byBhcHBlYXIgYmVsb3cgdGhlIG91dGxpbmUgbGV2ZWwgYmFyLgorCitUaGUgQzxzeW1ib2xzX3JpZ2h0PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIGNvbHVtbiBvdXRsaW5lIHN5bWJvbCB3aWxsIGFwcGVhciB0byB0aGUgbGVmdCBvciB0aGUgcmlnaHQgb2YgdGhlIG91dGxpbmUgbGV2ZWwgYmFyLiBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzIDEgZm9yIHN5bWJvbHMgdG8gYXBwZWFyIHRvIHRoZSByaWdodCBvZiB0aGUgb3V0bGluZSBsZXZlbCBiYXIuCisKK1RoZSBDPCRhdXRvX3N0eWxlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBjb250cm9sIHdoZXRoZXIgdGhlIGF1dG9tYXRpYyBvdXRsaW5lIGdlbmVyYXRvciBpbiBFeGNlbCB1c2VzIGF1dG9tYXRpYyBzdHlsZXMgd2hlbiBjcmVhdGluZyBhbiBvdXRsaW5lLiBUaGlzIGhhcyBubyBlZmZlY3Qgb24gYSBmaWxlIGdlbmVyYXRlZCBieSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPiBidXQgaXQgZG9lcyBoYXZlIGFuIGVmZmVjdCBvbiBob3cgdGhlIHdvcmtzaGVldCBiZWhhdmVzIGFmdGVyIGl0IGlzIGNyZWF0ZWQuIFRoZSBkZWZhdWx0IHNldHRpbmcgaXMgMCBmb3IgIkF1dG9tYXRpYyBTdHlsZXMiIHRvIGJlIHR1cm5lZCBvZmYuCisKK1RoZSBkZWZhdWx0IHNldHRpbmdzIGZvciBhbGwgb2YgdGhlc2UgcGFyYW1ldGVycyBjb3JyZXNwb25kIHRvIEV4Y2VsJ3MgZGVmYXVsdCBwYXJhbWV0ZXJzLgorCisKK1RoZSB3b3Jrc2hlZXQgcGFyYW1ldGVycyBjb250cm9sbGVkIGJ5IEM8b3V0bGluZV9zZXR0aW5ncygpPiBhcmUgcmFyZWx5IHVzZWQuCisKKworCisKKz1oZWFkMiBmcmVlemVfcGFuZXMoJHJvdywgJGNvbCwgJHRvcF9yb3csICRsZWZ0X2NvbCkKKworVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGl2aWRlIGEgd29ya3NoZWV0IGludG8gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCByZWdpb25zIGtub3duIGFzIHBhbmVzIGFuZCB0byBhbHNvICJmcmVlemUiIHRoZXNlIHBhbmVzIHNvIHRoYXQgdGhlIHNwbGl0dGVyIGJhcnMgYXJlIG5vdCB2aXNpYmxlLiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBDPFdpbmRvdy1FPGd0PkZyZWV6ZSBQYW5lcz4gbWVudSBjb21tYW5kIGluIEV4Y2VsCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHJvdz4gYW5kIEM8JGNvbD4gYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgdGhlIHNwbGl0LiBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGUgc3BsaXQgaXMgc3BlY2lmaWVkIGF0IHRoZSB0b3Agb3IgbGVmdCBvZiBhIGNlbGwgYW5kIHRoYXQgdGhlIG1ldGhvZCB1c2VzIHplcm8gYmFzZWQgaW5kZXhpbmcuIFRoZXJlZm9yZSB0byBmcmVlemUgdGhlIGZpcnN0IHJvdyBvZiBhIHdvcmtzaGVldCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BlY2lmeSB0aGUgc3BsaXQgYXQgcm93IDIgKHdoaWNoIGlzIDEgYXMgdGhlIHplcm8tYmFzZWQgaW5kZXgpLiBUaGlzIG1pZ2h0IGxlYWQgeW91IHRvIHRoaW5rIHRoYXQgeW91IGFyZSB1c2luZyBhIDEgYmFzZWQgaW5kZXggYnV0IHRoaXMgaXMgbm90IHRoZSBjYXNlLgorCitZb3UgY2FuIHNldCBvbmUgb2YgdGhlIEM8JHJvdz4gYW5kIEM8JGNvbD4gcGFyYW1ldGVycyBhcyB6ZXJvIGlmIHlvdSBkbyBub3Qgd2FudCBlaXRoZXIgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHNwbGl0LgorCitFeGFtcGxlczoKKworICAgICR3b3Jrc2hlZXQtPmZyZWV6ZV9wYW5lcygxLCAwKTsgIyBGcmVlemUgdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQtPmZyZWV6ZV9wYW5lcygnQTInKTsgIyBTYW1lIHVzaW5nIEExIG5vdGF0aW9uCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKDAsIDEpOyAjIEZyZWV6ZSB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKCdCMScpOyAjIFNhbWUgdXNpbmcgQTEgbm90YXRpb24KKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSwgMik7ICMgRnJlZXplIGZpcnN0IHJvdyBhbmQgZmlyc3QgMiBjb2x1bW5zCisgICAgJHdvcmtzaGVldC0+ZnJlZXplX3BhbmVzKCdDMicpOyAjIFNhbWUgdXNpbmcgQTEgbm90YXRpb24KKworVGhlIHBhcmFtZXRlcnMgQzwkdG9wX3Jvdz4gYW5kIEM8JGxlZnRfY29sPiBhcmUgb3B0aW9uYWwuIFRoZXkgYXJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdG9wLW1vc3Qgb3IgbGVmdC1tb3N0IHZpc2libGUgcm93IG9yIGNvbHVtbiBpbiB0aGUgc2Nyb2xsaW5nIHJlZ2lvbiBvZiB0aGUgcGFuZXMuIEZvciBleGFtcGxlIHRvIGZyZWV6ZSB0aGUgZmlyc3Qgcm93IGFuZCB0byBoYXZlIHRoZSBzY3JvbGxpbmcgcmVnaW9uIGJlZ2luIGF0IHJvdyB0d2VudHk6CisKKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSwgMCwgMjAsIDApOworCitZb3UgY2Fubm90IHVzZSBBMSBub3RhdGlvbiBmb3IgdGhlIEM8JHRvcF9yb3c+IGFuZCBDPCRsZWZ0X2NvbD4gcGFyYW1ldGVycy4KKworCitTZWUgYWxzbyB0aGUgQzxwYW5lcy5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cmlidXRpb24uCisKKworCisKKz1oZWFkMiBzcGxpdF9wYW5lcygkeSwgJHgsICR0b3Bfcm93LCAkbGVmdF9jb2wpCisKK1RoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRpdmlkZSBhIHdvcmtzaGVldCBpbnRvIGhvcml6b250YWwgb3IgdmVydGljYWwgcmVnaW9ucyBrbm93biBhcyBwYW5lcy4gVGhpcyBtZXRob2QgaXMgZGlmZmVyZW50IGZyb20gdGhlIEM8ZnJlZXplX3BhbmVzKCk+IG1ldGhvZCBpbiB0aGF0IHRoZSBzcGxpdHMgYmV0d2VlbiB0aGUgcGFuZXMgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSB1c2VyIGFuZCBlYWNoIHBhbmUgd2lsbCBoYXZlIGl0cyBvd24gc2Nyb2xsIGJhcnMuCisKK1RoZSBwYXJhbWV0ZXJzIEM8JHk+IGFuZCBDPCR4PiBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc3BsaXQuIFRoZSB1bml0cyBmb3IgQzwkeT4gYW5kIEM8JHg+IGFyZSB0aGUgc2FtZSBhcyB0aG9zZSB1c2VkIGJ5IEV4Y2VsIHRvIHNwZWNpZnkgcm93IGhlaWdodCBhbmQgY29sdW1uIHdpZHRoLiBIb3dldmVyLCB0aGUgdmVydGljYWwgYW5kIGhvcml6b250YWwgdW5pdHMgYXJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuIFRoZXJlZm9yZSB5b3UgbXVzdCBzcGVjaWZ5IHRoZSBDPCR5PiBhbmQgQzwkeD4gcGFyYW1ldGVycyBpbiB0ZXJtcyBvZiB0aGUgcm93IGhlaWdodHMgYW5kIGNvbHVtbiB3aWR0aHMgdGhhdCB5b3UgaGF2ZSBzZXQgb3IgdGhlIGRlZmF1bHQgdmFsdWVzIHdoaWNoIGFyZSBDPDEyLjc1PiBmb3IgYSByb3cgYW5kICBDPDguNDM+IGZvciBhIGNvbHVtbi4KKworWW91IGNhbiBzZXQgb25lIG9mIHRoZSBDPCR5PiBhbmQgQzwkeD4gcGFyYW1ldGVycyBhcyB6ZXJvIGlmIHlvdSBkbyBub3Qgd2FudCBlaXRoZXIgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHNwbGl0LiBUaGUgcGFyYW1ldGVycyBDPCR0b3Bfcm93PiBhbmQgQzwkbGVmdF9jb2w+IGFyZSBvcHRpb25hbC4gVGhleSBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSB0b3AtbW9zdCBvciBsZWZ0LW1vc3QgdmlzaWJsZSByb3cgb3IgY29sdW1uIGluIHRoZSBib3R0b20tcmlnaHQgcGFuZS4KKworRXhhbXBsZToKKworICAgICR3b3Jrc2hlZXQtPnNwbGl0X3BhbmVzKDEyLjc1LCAwLCAgICAxLCAwKTsgIyBGaXJzdCByb3cKKyAgICAkd29ya3NoZWV0LT5zcGxpdF9wYW5lcygwLCAgICAgOC40MywgMCwgMSk7ICMgRmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+c3BsaXRfcGFuZXMoMTIuNzUsIDguNDMsIDEsIDEpOyAjIEZpcnN0IHJvdyBhbmQgY29sdW1uCisKK1lvdSBjYW5ub3QgdXNlIEExIG5vdGF0aW9uIHdpdGggdGhpcyBtZXRob2QuCisKK1NlZSBhbHNvIHRoZSBDPGZyZWV6ZV9wYW5lcygpPiBtZXRob2QgYW5kIHRoZSBDPHBhbmVzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKworCitOb3RlOiBUaGlzIEM8c3BsaXRfcGFuZXMoKT4gbWV0aG9kIHdhcyBjYWxsZWQgQzx0aGF3X3BhbmVzKCk+IGluIG9sZGVyIHZlcnNpb25zLiBUaGUgb2xkZXIgbmFtZSBpcyBzdGlsbCBhdmFpbGFibGUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorCisKKworCis9aGVhZDIgbWVyZ2VfcmFuZ2UoJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsICR0b2tlbiwgJGZvcm1hdCwgJHV0Zl8xNl9iZSkKKworTWVyZ2luZyBjZWxscyBjYW4gYmUgYWNoaWV2ZWQgYnkgc2V0dGluZyB0aGUgQzxtZXJnZT4gcHJvcGVydHkgb2YgYSBGb3JtYXQgb2JqZWN0LCBzZWUgTDxDRUxMIEZPUk1BVFRJTkc+LiBIb3dldmVyLCB0aGlzIG9ubHkgYWxsb3dzIHNpbXBsZSBFeGNlbDUgc3R5bGUgaG9yaXpvbnRhbCBtZXJnaW5nIHdoaWNoIEV4Y2VsIHJlZmVycyB0byBhcyAiY2VudGVyIGFjcm9zcyBzZWxlY3Rpb24iLgorCitUaGUgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgYWxsb3dzIHlvdSB0byBkbyBFeGNlbDk3KyBzdHlsZSBmb3JtYXR0aW5nIHdoZXJlIHRoZSBjZWxscyBjYW4gY29udGFpbiBvdGhlciB0eXBlcyBvZiBhbGlnbm1lbnQgaW4gYWRkaXRpb24gdG8gdGhlIG1lcmdpbmc6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0IzOkQ0JywgJ1ZlcnRpY2FsIGFuZCBob3Jpem9udGFsJywgJGZvcm1hdCk7CisKK0I8V0FSTklORz4uIFRoZSBmb3JtYXQgb2JqZWN0IHRoYXQgaXMgdXNlZCB3aXRoIGEgQzxtZXJnZV9yYW5nZSgpPiBtZXRob2QgY2FsbCBpcyBtYXJrZWQgaW50ZXJuYWxseSBhcyBiZWluZyBhc3NvY2lhdGVkIHdpdGggYSBtZXJnZWQgcmFuZ2UuIEl0IGlzIGEgZmF0YWwgZXJyb3IgdG8gdXNlIGEgbWVyZ2VkIGZvcm1hdCBpbiBhIG5vbi1tZXJnZWQgY2VsbC4gSW5zdGVhZCB5b3Ugc2hvdWxkIHVzZSBzZXBhcmF0ZSBmb3JtYXRzIGZvciBtZXJnZWQgYW5kIG5vbi1tZXJnZWQgY2VsbHMuIFRoaXMgcmVzdHJpY3Rpb24gd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisKK1RoZSBDPCR1dGZfMTZfYmU+IHBhcmFtZXRlciBpcyBvcHRpb25hbCwgc2VlIGJlbG93LgorCitDPG1lcmdlX3JhbmdlKCk+IHdyaXRlcyBpdHMgQzwkdG9rZW4+IGFyZ3VtZW50IHVzaW5nIHRoZSB3b3Jrc2hlZXQgQzx3cml0ZSgpPiBtZXRob2QuIFRoZXJlZm9yZSBpdCB3aWxsIGhhbmRsZSBudW1iZXJzLCBzdHJpbmdzLCBmb3JtdWxhcyBvciB1cmxzIGFzIHJlcXVpcmVkLgorCitTZXR0aW5nIHRoZSBDPG1lcmdlPiBwcm9wZXJ0eSBvZiB0aGUgZm9ybWF0IGlzbid0IHJlcXVpcmVkIHdoZW4geW91IGFyZSB1c2luZyBDPG1lcmdlX3JhbmdlKCk+LiBJbiBmYWN0IHVzaW5nIGl0IHdpbGwgZXhjbHVkZSB0aGUgdXNlIG9mIGFueSBvdGhlciBob3Jpem9udGFsIGFsaWdubWVudCBvcHRpb24uCisKK09uIHN5c3RlbXMgd2l0aCBDPHBlcmwgNS44PiBhbmQgbGF0ZXIgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gbWV0aG9kIHdpbGwgYWxzbyBoYW5kbGUgc3RyaW5ncyBpbiBDPFVURi04PiBmb3JtYXQuCisKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjM6RDQnLCAiXHh7MjYzYX0iLCAkZm9ybWF0KTsgIyBTbWlsZXkKKworT24gZWFybGllciBQZXJsIHN5c3RlbXMgeW91ciBjYW4gc3BlY2lmeSBDPFVURi0xNkJFPiB3b3Jrc2hlZXQgbmFtZXMgdXNpbmcgYW4gYWRkaXRpb25hbCBvcHRpb25hbCBwYXJhbWV0ZXI6CisKKyAgICBteSAkc3RyID0gcGFjayAnbicsIDB4MjYzYTsKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjM6RDQnLCAkc3RyLCAkZm9ybWF0LCAxKTsgIyBTbWlsZXkKKworVGhlIGZ1bGwgcG9zc2liaWxpdGllcyBvZiB0aGlzIG1ldGhvZCBhcmUgc2hvd24gaW4gdGhlIEM8bWVyZ2UzLnBsPiB0byBDPG1lcmdlNi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJpYnV0aW9uLgorCisKKworCis9aGVhZDIgc2V0X3pvb20oJHNjYWxlKQorCitTZXQgdGhlIHdvcmtzaGVldCB6b29tIGZhY3RvciBpbiB0aGUgcmFuZ2UgQzwxMCBFPGx0Pj0gJHNjYWxlIEU8bHQ+PSA0MDA+OgorCisgICAgJHdvcmtzaGVldDEtPnNldF96b29tKDUwKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3pvb20oNzUpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfem9vbSgzMDApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfem9vbSg0MDApOworCitUaGUgZGVmYXVsdCB6b29tIGZhY3RvciBpcyAxMDAuIFlvdSBjYW5ub3Qgem9vbSB0byAiU2VsZWN0aW9uIiBiZWNhdXNlIGl0IGlzIGNhbGN1bGF0ZWQgYnkgRXhjZWwgYXQgcnVuLXRpbWUuCisKK05vdGUsIEM8c2V0X3pvb20oKT4gZG9lcyBub3QgYWZmZWN0IHRoZSBzY2FsZSBvZiB0aGUgcHJpbnRlZCBwYWdlLiBGb3IgdGhhdCB5b3Ugc2hvdWxkIHVzZSBDPHNldF9wcmludF9zY2FsZSgpPi4KKworCisKKworPWhlYWQyIHJpZ2h0X3RvX2xlZnQoKQorCitUaGUgQzxyaWdodF90b19sZWZ0KCk+IG1ldGhvZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBkaXJlY3Rpb24gb2YgdGhlIHdvcmtzaGVldCBmcm9tIGxlZnQtdG8tcmlnaHQsIHdpdGggdGhlIEExIGNlbGwgaW4gdGhlIHRvcCBsZWZ0LCB0byByaWdodC10by1sZWZ0LCB3aXRoIHRoZSBoZSBBMSBjZWxsIGluIHRoZSB0b3AgcmlnaHQuCisKKyAgICAkd29ya3NoZWV0LT5yaWdodF90b19sZWZ0KCk7CisKK1RoaXMgaXMgdXNlZnVsIHdoZW4gY3JlYXRpbmcgQXJhYmljLCBIZWJyZXcgb3Igb3RoZXIgbmVhciBvciBmYXIgZWFzdGVybiB3b3Jrc2hlZXRzIHRoYXQgdXNlIHJpZ2h0LXRvLWxlZnQgYXMgdGhlIGRlZmF1bHQgZGlyZWN0aW9uLgorCisKKworCis9aGVhZDIgaGlkZV96ZXJvKCkKKworVGhlIEM8aGlkZV96ZXJvKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGhpZGUgYW55IHplcm8gdmFsdWVzIHRoYXQgYXBwZWFyIGluIGNlbGxzLgorCisgICAgJHdvcmtzaGVldC0+aGlkZV96ZXJvKCk7CisKK0luIEV4Y2VsIHRoaXMgb3B0aW9uIGlzIGZvdW5kIHVuZGVyIFRvb2xzLT5PcHRpb25zLT5WaWV3LgorCisKKworCis9aGVhZDIgc2V0X3RhYl9jb2xvcigpCisKK1RoZSBDPHNldF90YWJfY29sb3IoKT4gbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBjb2xvdXIgb2YgdGhlIHdvcmtzaGVldCB0YWIuIFRoaXMgZmVhdHVyZSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBFeGNlbCAyMDAyIGFuZCBsYXRlci4gWW91IGNhbiB1c2Ugb25lIG9mIHRoZSBzdGFuZGFyZCBjb2xvdXIgbmFtZXMgcHJvdmlkZWQgYnkgdGhlIEZvcm1hdCBvYmplY3Qgb3IgYSBjb2xvdXIgaW5kZXguIFNlZSBMPENPTE9VUlMgSU4gRVhDRUw+IGFuZCB0aGUgQzxzZXRfY3VzdG9tX2NvbG9yKCk+IG1ldGhvZC4KKworICAgICR3b3Jrc2hlZXQxLT5zZXRfdGFiX2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3RhYl9jb2xvcigweDBDKTsKKworU2VlIHRoZSBDPHRhYl9jb2xvcnMucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDIgYXV0b2ZpbHRlcigkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKworVGhpcyBtZXRob2QgYWxsb3dzIGFuIGF1dG9maWx0ZXIgdG8gYmUgYWRkZWQgdG8gYSB3b3Jrc2hlZXQuIEFuIGF1dG9maWx0ZXIgaXMgYSB3YXkgb2YgYWRkaW5nIGRyb3AgZG93biBsaXN0cyB0byB0aGUgaGVhZGVycyBvZiBhIDJEIHJhbmdlIG9mIHdvcmtzaGVldCBkYXRhLiBUaGlzIGlzIHR1cm4gYWxsb3cgdXNlcnMgdG8gZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uIHNpbXBsZSBjcml0ZXJpYSBzbyB0aGF0IHNvbWUgZGF0YSBpcyBzaG93biBhbmQgc29tZSBpcyBoaWRkZW4uCisKK1RvIGFkZCBhbiBhdXRvZmlsdGVyIHRvIGEgd29ya3NoZWV0OgorCisgICAgJHdvcmtzaGVldC0+YXV0b2ZpbHRlcigwLCAwLCAxMCwgMyk7CisgICAgJHdvcmtzaGVldC0+YXV0b2ZpbHRlcignQTE6RDExJyk7ICAgICMgU2FtZSBhcyBhYm92ZSBpbiBBMSBub3RhdGlvbi4KKworRmlsdGVyIGNvbmRpdGlvbnMgY2FuIGJlIGFwcGxpZWQgdXNpbmcgdGhlIEM8ZmlsdGVyX2NvbHVtbigpPiBtZXRob2QuCisKK1NlZSB0aGUgQzxhdXRvZmlsdGVyLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYSBtb3JlIGRldGFpbGVkIGV4YW1wbGUuCisKKworCisKKz1oZWFkMiBmaWx0ZXJfY29sdW1uKCRjb2x1bW4sICRleHByZXNzaW9uKQorCisKK1RoZSBDPGZpbHRlcl9jb2x1bW4+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIgY29sdW1ucyBpbiBhIGF1dG9maWx0ZXIgcmFuZ2UgYmFzZWQgb24gc2ltcGxlIGNvbmRpdGlvbnMuCisKK0I8Tk9URTo+IEl0IGlzbid0IHN1ZmZpY2llbnQgdG8ganVzdCBzcGVjaWZ5IHRoZSBmaWx0ZXIgY29uZGl0aW9uLiBZb3UgbXVzdCBhbHNvIGhpZGUgYW55IHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNvbmRpdGlvbi4gUm93cyBhcmUgaGlkZGVuIHVzaW5nIHRoZSBDPHNldF9yb3coKT4gQzx2aXNpYmxlPiBwYXJhbWV0ZXIuIEM8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+IGNhbm5vdCBkbyB0aGlzIGF1dG9tYXRpY2FsbHkgc2luY2UgaXQgaXNuJ3QgcGFydCBvZiB0aGUgZmlsZSBmb3JtYXQuIFNlZSB0aGUgQzxhdXRvZmlsdGVyLnBsPiBwcm9ncmFtIGluIHRoZSBleGFtcGxlcyBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RybyBmb3IgYW4gZXhhbXBsZS4KKworVGhlIGNvbmRpdGlvbnMgZm9yIHRoZSBmaWx0ZXIgYXJlIHNwZWNpZmllZCB1c2luZyBzaW1wbGUgZXhwcmVzc2lvbnM6CisKKyAgICAkd29ya3NoZWV0LT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggPiAyMDAwJyk7CisgICAgJHdvcmtzaGVldC0+ZmlsdGVyX2NvbHVtbignQicsICd4ID4gMjAwMCBhbmQgeCA8IDUwMDAnKTsKKworVGhlIEM8JGNvbHVtbj4gcGFyYW1ldGVyIGNhbiBlaXRoZXIgYmUgYSB6ZXJvIGluZGV4ZWQgY29sdW1uIG51bWJlciBvciBhIHN0cmluZyBjb2x1bW4gbmFtZS4KKworVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgYXJlIGF2YWlsYWJsZToKKworICAgIE9wZXJhdG9yICAgICAgICBTeW5vbnltcworICAgICAgID09ICAgICAgICAgICA9ICAgZXEgID1+CisgICAgICAgIT0gICAgICAgICAgIDw+ICBuZSAgIT0KKyAgICAgICA+CisgICAgICAgPAorICAgICAgID49CisgICAgICAgPD0KKworICAgICAgIGFuZCAgICAgICAgICAmJgorICAgICAgIG9yICAgICAgICAgICB8fAorCitUaGUgb3BlcmF0b3Igc3lub255bXMgYXJlIGp1c3Qgc3ludGFjdGljIHN1Z2FyIHRvIG1ha2UgeW91IG1vcmUgY29tZm9ydGFibGUgdXNpbmcgdGhlIGV4cHJlc3Npb25zLiBJdCBpcyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCB0aGUgZXhwcmVzc2lvbnMgd2lsbCBiZSBpbnRlcnByZXRlZCBieSBFeGNlbCBhbmQgbm90IGJ5IHBlcmwuCisKK0FuIGV4cHJlc3Npb24gY2FuIGNvbXByaXNlIGEgc2luZ2xlIHN0YXRlbWVudCBvciB0d28gc3RhdGVtZW50cyBzZXBhcmF0ZWQgYnkgdGhlIEM8YW5kPiBhbmQgQzxvcj4gb3BlcmF0b3JzLiBGb3IgZXhhbXBsZToKKworICAgICd4IDwgIDIwMDAnCisgICAgJ3ggPiAgMjAwMCcKKyAgICAneCA9PSAyMDAwJworICAgICd4ID4gIDIwMDAgYW5kIHggPCAgNTAwMCcKKyAgICAneCA9PSAyMDAwIG9yICB4ID09IDUwMDAnCisKK0ZpbHRlcmluZyBvZiBibGFuayBvciBub24tYmxhbmsgZGF0YSBjYW4gYmUgYWNoaWV2ZWQgYnkgdXNpbmcgYSB2YWx1ZSBvZiBDPEJsYW5rcz4gb3IgQzxOb25CbGFua3M+IGluIHRoZSBleHByZXNzaW9uOgorCisgICAgJ3ggPT0gQmxhbmtzJworICAgICd4ID09IE5vbkJsYW5rcycKKworVG9wIDEwIHN0eWxlIGZpbHRlcnMgY2FuIGJlIHNwZWNpZmllZCB1c2luZyBhIGV4cHJlc3Npb24gbGlrZSB0aGUgZm9sbG93aW5nOgorCisgICAgVG9wfEJvdHRvbSAxLTUwMCBJdGVtc3wlCisKK0ZvciBleGFtcGxlOgorCisgICAgJ1RvcCAgICAxMCBJdGVtcycKKyAgICAnQm90dG9tICA1IEl0ZW1zJworICAgICdUb3AgICAgMjUgJScKKyAgICAnQm90dG9tIDUwICUnCisKK0V4Y2VsIGFsc28gYWxsb3dzIHNvbWUgc2ltcGxlIHN0cmluZyBtYXRjaGluZyBvcGVyYXRpb25zOgorCisgICAgJ3ggPX4gYionICAgIyBiZWdpbnMgd2l0aCBiCisgICAgJ3ggIX4gYionICAgIyBkb2Vzbid0IGJlZ2luIHdpdGggYgorICAgICd4ID1+ICpiJyAgICMgZW5kcyB3aXRoIGIKKyAgICAneCAhfiAqYicgICAjIGRvZXNuJ3QgZW5kIHdpdGggYgorICAgICd4ID1+ICpiKicgICMgY29udGFpbnMgYgorICAgICd4ICF+ICpiKicgICMgZG9lc24ndCBjb250YWlucyBiCisKK1lvdSBjYW4gYWxzbyB1c2UgQzwqPiB0byBtYXRjaCBhbnkgY2hhcmFjdGVyIG9yIG51bWJlciBhbmQgQzw/PiB0byBtYXRjaCBhbnkgc2luZ2xlIGNoYXJhY3RlciBvciBudW1iZXIuIE5vIG90aGVyIHJlZ3VsYXIgZXhwcmVzc2lvbiBxdWFudGlmaWVyIGlzIHN1cHBvcnRlZCBieSBFeGNlbCdzIGZpbHRlcnMuIEV4Y2VsJ3MgcmVndWxhciBleHByZXNzaW9uIGNoYXJhY3RlcnMgY2FuIGJlIGVzY2FwZWQgdXNpbmcgQzx+Pi4KKworVGhlIHBsYWNlaG9sZGVyIHZhcmlhYmxlIEM8eD4gaW4gdGhlIGFib3ZlIGV4YW1wbGVzIGNhbiBiZSByZXBsYWNlZCBieSBhbnkgc2ltcGxlIHN0cmluZy4gVGhlIGFjdHVhbCBwbGFjZWhvbGRlciBuYW1lIGlzIGlnbm9yZWQgaW50ZXJuYWxseSBzbyB0aGUgZm9sbG93aW5nIGFyZSBhbGwgZXF1aXZhbGVudDoKKworICAgICd4ICAgICA8IDIwMDAnCisgICAgJ2NvbCAgIDwgMjAwMCcKKyAgICAnUHJpY2UgPCAyMDAwJworCitBbHNvLCBub3RlIHRoYXQgYSBmaWx0ZXIgY29uZGl0aW9uIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBjb2x1bW4gaW4gYSByYW5nZSBzcGVjaWZpZWQgYnkgdGhlIEM8YXV0b2ZpbHRlcigpPiBXb3Jrc2hlZXQgbWV0aG9kLgorCitTZWUgdGhlIEM8YXV0b2ZpbHRlci5wbD4gcHJvZ3JhbSBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8gZm9yIGEgbW9yZSBkZXRhaWxlZCBleGFtcGxlLgorCisKKworCis9aGVhZDEgUEFHRSBTRVQtVVAgTUVUSE9EUworCitQYWdlIHNldC11cCBtZXRob2RzIGFmZmVjdCB0aGUgd2F5IHRoYXQgYSB3b3Jrc2hlZXQgbG9va3Mgd2hlbiBpdCBpcyBwcmludGVkLiBUaGV5IGNvbnRyb2wgZmVhdHVyZXMgc3VjaCBhcyBwYWdlIGhlYWRlcnMgYW5kIGZvb3RlcnMgYW5kIG1hcmdpbnMuIFRoZXNlIG1ldGhvZHMgYXJlIHJlYWxseSBqdXN0IHN0YW5kYXJkIHdvcmtzaGVldCBtZXRob2RzLiBUaGV5IGFyZSBkb2N1bWVudGVkIGhlcmUgaW4gYSBzZXBhcmF0ZSBzZWN0aW9uIGZvciB0aGUgc2FrZSBvZiBjbGFyaXR5LgorCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSBmb3IgcGFnZSBzZXQtdXA6CisKKyAgICBzZXRfbGFuZHNjYXBlKCkKKyAgICBzZXRfcG9ydHJhaXQoKQorICAgIHNldF9wYWdlX3ZpZXcoKQorICAgIHNldF9wYXBlcigpCisgICAgY2VudGVyX2hvcml6b250YWxseSgpCisgICAgY2VudGVyX3ZlcnRpY2FsbHkoKQorICAgIHNldF9tYXJnaW5zKCkKKyAgICBzZXRfaGVhZGVyKCkKKyAgICBzZXRfZm9vdGVyKCkKKyAgICByZXBlYXRfcm93cygpCisgICAgcmVwZWF0X2NvbHVtbnMoKQorICAgIGhpZGVfZ3JpZGxpbmVzKCkKKyAgICBwcmludF9yb3dfY29sX2hlYWRlcnMoKQorICAgIHByaW50X2FyZWEoKQorICAgIHByaW50X2Fjcm9zcygpCisgICAgZml0X3RvX3BhZ2VzKCkKKyAgICBzZXRfc3RhcnRfcGFnZSgpCisgICAgc2V0X3ByaW50X3NjYWxlKCkKKyAgICBzZXRfaF9wYWdlYnJlYWtzKCkKKyAgICBzZXRfdl9wYWdlYnJlYWtzKCkKKworCitBIGNvbW1vbiByZXF1aXJlbWVudCB3aGVuIHdvcmtpbmcgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBpcyB0byBhcHBseSB0aGUgc2FtZSBwYWdlIHNldC11cCBmZWF0dXJlcyB0byBhbGwgb2YgdGhlIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vay4gVG8gZG8gdGhpcyB5b3UgY2FuIHVzZSB0aGUgQzxzaGVldHMoKT4gbWV0aG9kIG9mIHRoZSBDPHdvcmtib29rPiBjbGFzcyB0byBhY2Nlc3MgdGhlIGFycmF5IG9mIHdvcmtzaGVldHMgaW4gYSB3b3JrYm9vazoKKworICAgIGZvcmVhY2ggJHdvcmtzaGVldCAoJHdvcmtib29rLT5zaGVldHMoKSkgeworICAgICAgICR3b3Jrc2hlZXQtPnNldF9sYW5kc2NhcGUoKTsKKyAgICB9CisKKworCisKKz1oZWFkMiBzZXRfbGFuZHNjYXBlKCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIG9yaWVudGF0aW9uIG9mIGEgd29ya3NoZWV0J3MgcHJpbnRlZCBwYWdlIHRvIGxhbmRzY2FwZToKKworICAgICR3b3Jrc2hlZXQtPnNldF9sYW5kc2NhcGUoKTsgIyBMYW5kc2NhcGUgbW9kZQorCisKKworCis9aGVhZDIgc2V0X3BvcnRyYWl0KCkKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBzZXQgdGhlIG9yaWVudGF0aW9uIG9mIGEgd29ya3NoZWV0J3MgcHJpbnRlZCBwYWdlIHRvIHBvcnRyYWl0LiBUaGUgZGVmYXVsdCB3b3Jrc2hlZXQgb3JpZW50YXRpb24gaXMgcG9ydHJhaXQsIHNvIHlvdSB3b24ndCBnZW5lcmFsbHkgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BvcnRyYWl0KCk7ICMgUG9ydHJhaXQgbW9kZQorCisKKworPWhlYWQyIHNldF9wYWdlX3ZpZXcoKQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRpc3BsYXkgdGhlIHdvcmtzaGVldCBpbiAiUGFnZSBWaWV3IiBtb2RlLiBUaGlzIGlzIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRlZCBieSBNYWMgRXhjZWwsIHdoZXJlIGl0IGlzIHRoZSBkZWZhdWx0LgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BhZ2VfdmlldygpOworCisKKworPWhlYWQyIHNldF9wYXBlcigkaW5kZXgpCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwYXBlciBmb3JtYXQgZm9yIHRoZSBwcmludGVkIG91dHB1dCBvZiBhIHdvcmtzaGVldC4gVGhlIGZvbGxvd2luZyBwYXBlciBzdHlsZXMgYXJlIGF2YWlsYWJsZToKKworICAgIEluZGV4ICAgUGFwZXIgZm9ybWF0ICAgICAgICAgICAgUGFwZXIgc2l6ZQorICAgID09PT09ICAgPT09PT09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PQorICAgICAgMCAgICAgUHJpbnRlciBkZWZhdWx0ICAgICAgICAgLQorICAgICAgMSAgICAgTGV0dGVyICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAgMiAgICAgTGV0dGVyIFNtYWxsICAgICAgICAgICAgOCAxLzIgeCAxMSBpbgorICAgICAgMyAgICAgVGFibG9pZCAgICAgICAgICAgICAgICAgMTEgeCAxNyBpbgorICAgICAgNCAgICAgTGVkZ2VyICAgICAgICAgICAgICAgICAgMTcgeCAxMSBpbgorICAgICAgNSAgICAgTGVnYWwgICAgICAgICAgICAgICAgICAgOCAxLzIgeCAxNCBpbgorICAgICAgNiAgICAgU3RhdGVtZW50ICAgICAgICAgICAgICAgNSAxLzIgeCA4IDEvMiBpbgorICAgICAgNyAgICAgRXhlY3V0aXZlICAgICAgICAgICAgICAgNyAxLzQgeCAxMCAxLzIgaW4KKyAgICAgIDggICAgIEEzICAgICAgICAgICAgICAgICAgICAgIDI5NyB4IDQyMCBtbQorICAgICAgOSAgICAgQTQgICAgICAgICAgICAgICAgICAgICAgMjEwIHggMjk3IG1tCisgICAgIDEwICAgICBBNCBTbWFsbCAgICAgICAgICAgICAgICAyMTAgeCAyOTcgbW0KKyAgICAgMTEgICAgIEE1ICAgICAgICAgICAgICAgICAgICAgIDE0OCB4IDIxMCBtbQorICAgICAxMiAgICAgQjQgICAgICAgICAgICAgICAgICAgICAgMjUwIHggMzU0IG1tCisgICAgIDEzICAgICBCNSAgICAgICAgICAgICAgICAgICAgICAxODIgeCAyNTcgbW0KKyAgICAgMTQgICAgIEZvbGlvICAgICAgICAgICAgICAgICAgIDggMS8yIHggMTMgaW4KKyAgICAgMTUgICAgIFF1YXJ0byAgICAgICAgICAgICAgICAgIDIxNSB4IDI3NSBtbQorICAgICAxNiAgICAgLSAgICAgICAgICAgICAgICAgICAgICAgMTB4MTQgaW4KKyAgICAgMTcgICAgIC0gICAgICAgICAgICAgICAgICAgICAgIDExeDE3IGluCisgICAgIDE4ICAgICBOb3RlICAgICAgICAgICAgICAgICAgICA4IDEvMiB4IDExIGluCisgICAgIDE5ICAgICBFbnZlbG9wZSAgOSAgICAgICAgICAgICAzIDcvOCB4IDggNy84CisgICAgIDIwICAgICBFbnZlbG9wZSAxMCAgICAgICAgICAgICA0IDEvOCB4IDkgMS8yCisgICAgIDIxICAgICBFbnZlbG9wZSAxMSAgICAgICAgICAgICA0IDEvMiB4IDEwIDMvOAorICAgICAyMiAgICAgRW52ZWxvcGUgMTIgICAgICAgICAgICAgNCAzLzQgeCAxMQorICAgICAyMyAgICAgRW52ZWxvcGUgMTQgICAgICAgICAgICAgNSB4IDExIDEvMgorICAgICAyNCAgICAgQyBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNSAgICAgRCBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNiAgICAgRSBzaXplIHNoZWV0ICAgICAgICAgICAgLQorICAgICAyNyAgICAgRW52ZWxvcGUgREwgICAgICAgICAgICAgMTEwIHggMjIwIG1tCisgICAgIDI4ICAgICBFbnZlbG9wZSBDMyAgICAgICAgICAgICAzMjQgeCA0NTggbW0KKyAgICAgMjkgICAgIEVudmVsb3BlIEM0ICAgICAgICAgICAgIDIyOSB4IDMyNCBtbQorICAgICAzMCAgICAgRW52ZWxvcGUgQzUgICAgICAgICAgICAgMTYyIHggMjI5IG1tCisgICAgIDMxICAgICBFbnZlbG9wZSBDNiAgICAgICAgICAgICAxMTQgeCAxNjIgbW0KKyAgICAgMzIgICAgIEVudmVsb3BlIEM2NSAgICAgICAgICAgIDExNCB4IDIyOSBtbQorICAgICAzMyAgICAgRW52ZWxvcGUgQjQgICAgICAgICAgICAgMjUwIHggMzUzIG1tCisgICAgIDM0ICAgICBFbnZlbG9wZSBCNSAgICAgICAgICAgICAxNzYgeCAyNTAgbW0KKyAgICAgMzUgICAgIEVudmVsb3BlIEI2ICAgICAgICAgICAgIDE3NiB4IDEyNSBtbQorICAgICAzNiAgICAgRW52ZWxvcGUgICAgICAgICAgICAgICAgMTEwIHggMjMwIG1tCisgICAgIDM3ICAgICBNb25hcmNoICAgICAgICAgICAgICAgICAzLjg3NSB4IDcuNSBpbgorICAgICAzOCAgICAgRW52ZWxvcGUgICAgICAgICAgICAgICAgMyA1LzggeCA2IDEvMiBpbgorICAgICAzOSAgICAgRmFuZm9sZCAgICAgICAgICAgICAgICAgMTQgNy84IHggMTEgaW4KKyAgICAgNDAgICAgIEdlcm1hbiBTdGQgRmFuZm9sZCAgICAgIDggMS8yIHggMTIgaW4KKyAgICAgNDEgICAgIEdlcm1hbiBMZWdhbCBGYW5mb2xkICAgIDggMS8yIHggMTMgaW4KKworCitOb3RlLCBpdCBpcyBsaWtlbHkgdGhhdCBub3QgYWxsIG9mIHRoZXNlIHBhcGVyIHR5cGVzIHdpbGwgYmUgYXZhaWxhYmxlIHRvIHRoZSBlbmQgdXNlciBzaW5jZSBpdCB3aWxsIGRlcGVuZCBvbiB0aGUgcGFwZXIgZm9ybWF0cyB0aGF0IHRoZSB1c2VyJ3MgcHJpbnRlciBzdXBwb3J0cy4gVGhlcmVmb3JlLCBpdCBpcyBiZXN0IHRvIHN0aWNrIHRvIHN0YW5kYXJkIHBhcGVyIHR5cGVzLgorCisgICAgJHdvcmtzaGVldC0+c2V0X3BhcGVyKDEpOyAjIFVTIExldHRlcgorICAgICR3b3Jrc2hlZXQtPnNldF9wYXBlcig5KTsgIyBBNAorCitJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBwYXBlciB0eXBlIHRoZSB3b3Jrc2hlZXQgd2lsbCBwcmludCB1c2luZyB0aGUgcHJpbnRlcidzIGRlZmF1bHQgcGFwZXIuCisKKworCisKKz1oZWFkMiBjZW50ZXJfaG9yaXpvbnRhbGx5KCkKKworQ2VudGVyIHRoZSB3b3Jrc2hlZXQgZGF0YSBob3Jpem9udGFsbHkgYmV0d2VlbiB0aGUgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgJHdvcmtzaGVldC0+Y2VudGVyX2hvcml6b250YWxseSgpOworCisKKworCis9aGVhZDIgY2VudGVyX3ZlcnRpY2FsbHkoKQorCitDZW50ZXIgdGhlIHdvcmtzaGVldCBkYXRhIHZlcnRpY2FsbHkgYmV0d2VlbiB0aGUgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgJHdvcmtzaGVldC0+Y2VudGVyX3ZlcnRpY2FsbHkoKTsKKworCisKKworPWhlYWQyIHNldF9tYXJnaW5zKCRpbmNoZXMpCisKK1RoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBzZXR0aW5nIHRoZSB3b3Jrc2hlZXQgbWFyZ2lucyBvbiB0aGUgcHJpbnRlZCBwYWdlOgorCisgICAgc2V0X21hcmdpbnMoKSAgICAgICAgIyBTZXQgYWxsIG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUKKyAgICBzZXRfbWFyZ2luc19MUigpICAgICAjIFNldCBsZWZ0IGFuZCByaWdodCBtYXJnaW5zIHRvIHRoZSBzYW1lIHZhbHVlCisgICAgc2V0X21hcmdpbnNfVEIoKSAgICAgIyBTZXQgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZQorICAgIHNldF9tYXJnaW5fbGVmdCgpOyAgICMgU2V0IGxlZnQgbWFyZ2luCisgICAgc2V0X21hcmdpbl9yaWdodCgpOyAgIyBTZXQgcmlnaHQgbWFyZ2luCisgICAgc2V0X21hcmdpbl90b3AoKTsgICAgIyBTZXQgdG9wIG1hcmdpbgorICAgIHNldF9tYXJnaW5fYm90dG9tKCk7ICMgU2V0IGJvdHRvbSBtYXJnaW4KKworQWxsIG9mIHRoZXNlIG1ldGhvZHMgdGFrZSBhIGRpc3RhbmNlIGluIGluY2hlcyBhcyBhIHBhcmFtZXRlci4gTm90ZTogMSBpbmNoID0gMjUuNG1tLiA7LSkgVGhlIGRlZmF1bHQgbGVmdCBhbmQgcmlnaHQgbWFyZ2luIGlzIDAuNzUgaW5jaC4gVGhlIGRlZmF1bHQgdG9wIGFuZCBib3R0b20gbWFyZ2luIGlzIDEuMDAgaW5jaC4KKworCisKKz1oZWFkMiBzZXRfaGVhZGVyKCRzdHJpbmcsICRtYXJnaW4pCisKK0hlYWRlcnMgYW5kIGZvb3RlcnMgYXJlIGdlbmVyYXRlZCB1c2luZyBhIEM8JHN0cmluZz4gd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBwbGFpbiB0ZXh0IGFuZCBjb250cm9sIGNoYXJhY3RlcnMuIFRoZSBDPCRtYXJnaW4+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4KKworVGhlIGF2YWlsYWJsZSBjb250cm9sIGNoYXJhY3RlciBhcmU6CisKKyAgICBDb250cm9sICAgICAgICAgICAgIENhdGVnb3J5ICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICA9PT09PT09ICAgICAgICAgICAgID09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PT0KKyAgICAmTCAgICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICAgTGVmdAorICAgICZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXIKKyAgICAmUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQKKworICAgICZQICAgICAgICAgICAgICAgICAgSW5mb3JtYXRpb24gICAgICAgICBQYWdlIG51bWJlcgorICAgICZOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgcGFnZXMKKyAgICAmRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZQorICAgICZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lCisgICAgJkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgbmFtZQorICAgICZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3Jrc2hlZXQgbmFtZQorICAgICZaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JrYm9vayBwYXRoCisKKyAgICAmZm9udHNpemUgICAgICAgICAgIEZvbnQgICAgICAgICAgICAgICAgRm9udCBzaXplCisgICAgJiJmb250LHN0eWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQgbmFtZSBhbmQgc3R5bGUKKyAgICAmVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlIHVuZGVybGluZQorICAgICZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUgdW5kZXJsaW5lCisgICAgJlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2gKKyAgICAmWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwZXJzY3JpcHQKKyAgICAmWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0CisKKyAgICAmJiAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgICAgICAgTGl0ZXJhbCBhbXBlcnNhbmQgJgorCisKK1RleHQgaW4gaGVhZGVycyBhbmQgZm9vdGVycyBjYW4gYmUganVzdGlmaWVkIChhbGlnbmVkKSB0byB0aGUgbGVmdCwgY2VudGVyIGFuZCByaWdodCBieSBwcmVmaXhpbmcgdGhlIHRleHQgd2l0aCB0aGUgY29udHJvbCBjaGFyYWN0ZXJzIEM8Jkw+LCBDPCZDPiBhbmQgQzwmUj4uCisKK0ZvciBleGFtcGxlICh3aXRoIEFTQ0lJIGFydCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVzdWx0cyk6CisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCcmTEhlbGxvJyk7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IEhlbGxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZDSGVsbG8nKTsKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbGxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworCisgICAgJHdvcmtzaGVldC0+c2V0X2hlYWRlcignJlJIZWxsbycpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbGxvIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKK0ZvciBzaW1wbGUgdGV4dCwgaWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFueSBqdXN0aWZpY2F0aW9uIHRoZSB0ZXh0IHdpbGwgYmUgY2VudHJlZC4gSG93ZXZlciwgeW91IG11c3QgcHJlZml4IHRoZSB0ZXh0IHdpdGggQzwmQz4gaWYgeW91IHNwZWNpZnkgYSBmb250IG5hbWUgb3IgYW55IG90aGVyIGZvcm1hdHRpbmc6CisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCdIZWxsbycpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgSGVsbG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKK1lvdSBjYW4gaGF2ZSB0ZXh0IGluIGVhY2ggb2YgdGhlIGp1c3RpZmljYXRpb24gcmVnaW9uczoKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZMQ2lhbyZDQmVsbG8mUkNpZWxvJyk7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8IENpYW8gICAgICAgICAgICAgICAgICAgICBCZWxsbyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2llbG8gfAorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisKKworVGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgY2hhcmFjdGVycyBhY3QgYXMgdmFyaWFibGVzIHRoYXQgRXhjZWwgd2lsbCB1cGRhdGUgYXMgdGhlIHdvcmtib29rIG9yIHdvcmtzaGVldCBjaGFuZ2VzLiBUaW1lcyBhbmQgZGF0ZXMgYXJlIGluIHRoZSB1c2VycyBkZWZhdWx0IGZvcm1hdDoKKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoJyZDUGFnZSAmUCBvZiAmTicpOworCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2UgMSBvZiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCisKKyAgICAkd29ya3NoZWV0LT5zZXRfaGVhZGVyKCcmQ1VwZGF0ZWQgYXQgJlQnKTsKKworICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgIHwgICAgICAgICAgICAgICAgICAgIFVwZGF0ZWQgYXQgMTI6MzAgUE0gICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKworCisKK1lvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBzaXplIG9mIGEgc2VjdGlvbiBvZiB0aGUgdGV4dCBieSBwcmVmaXhpbmcgaXQgd2l0aCB0aGUgY29udHJvbCBjaGFyYWN0ZXIgQzwmbj4gd2hlcmUgQzxuPiBpcyB0aGUgZm9udCBzaXplOgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDJjMwSGVsbG8gQmlnJyAgKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hlYWRlcignJkMmMTBIZWxsbyBTbWFsbCcpOworCitZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgb2YgYSBzZWN0aW9uIG9mIHRoZSB0ZXh0IGJ5IHByZWZpeGluZyBpdCB3aXRoIHRoZSBjb250cm9sIHNlcXVlbmNlIEM8JiJmb250LHN0eWxlIj4gd2hlcmUgQzxmb250bmFtZT4gaXMgYSBmb250IG5hbWUgc3VjaCBhcyAiQ291cmllciBOZXciIG9yICJUaW1lcyBOZXcgUm9tYW4iIGFuZCBDPHN0eWxlPiBpcyBvbmUgb2YgdGhlIHN0YW5kYXJkIFdpbmRvd3MgZm9udCBkZXNjcmlwdGlvbnM6ICJSZWd1bGFyIiwgIkl0YWxpYyIsICJCb2xkIiBvciAiQm9sZCBJdGFsaWMiOgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDJiJDb3VyaWVyIE5ldyxJdGFsaWMiSGVsbG8nKTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hlYWRlcignJkMmIkNvdXJpZXIgTmV3LEJvbGQgSXRhbGljIkhlbGxvJyk7CisgICAgJHdvcmtzaGVldDMtPnNldF9oZWFkZXIoJyZDJiJUaW1lcyBOZXcgUm9tYW4sUmVndWxhciJIZWxsbycpOworCitJdCBpcyBwb3NzaWJsZSB0byBjb21iaW5lIGFsbCBvZiB0aGVzZSBmZWF0dXJlcyB0b2dldGhlciB0byBjcmVhdGUgc29waGlzdGljYXRlZCBoZWFkZXJzIGFuZCBmb290ZXJzLiBBcyBhbiBhaWQgdG8gc2V0dGluZyB1cCBjb21wbGljYXRlZCBoZWFkZXJzIGFuZCBmb290ZXJzIHlvdSBjYW4gcmVjb3JkIGEgcGFnZSBzZXQtdXAgYXMgYSBtYWNybyBpbiBFeGNlbCBhbmQgbG9vayBhdCB0aGUgZm9ybWF0IHN0cmluZ3MgdGhhdCBWQkEgcHJvZHVjZXMuIFJlbWVtYmVyIGhvd2V2ZXIgdGhhdCBWQkEgdXNlcyB0d28gZG91YmxlIHF1b3RlcyBDPCIiPiB0byBpbmRpY2F0ZSBhIHNpbmdsZSBkb3VibGUgcXVvdGUuIEZvciB0aGUgbGFzdCBleGFtcGxlIGFib3ZlIHRoZSBlcXVpdmFsZW50IFZCQSBjb2RlIGxvb2tzIGxpa2UgdGhpczoKKworICAgIC5MZWZ0SGVhZGVyICAgPSAiIgorICAgIC5DZW50ZXJIZWFkZXIgPSAiJiIiVGltZXMgTmV3IFJvbWFuLFJlZ3VsYXIiIkhlbGxvIgorICAgIC5SaWdodEhlYWRlciAgPSAiIgorCisKK1RvIGluY2x1ZGUgYSBzaW5nbGUgbGl0ZXJhbCBhbXBlcnNhbmQgQzwmPiBpbiBhIGhlYWRlciBvciBmb290ZXIgeW91IHNob3VsZCB1c2UgYSBkb3VibGUgYW1wZXJzYW5kIEM8JiY+OgorCisgICAgJHdvcmtzaGVldDEtPnNldF9oZWFkZXIoJyZDQ3VyaW91c2VyICYmIEN1cmlvdXNlciAtIEF0dG9ybmV5cyBhdCBMYXcnKTsKKworQXMgc3RhdGVkIGFib3ZlIHRoZSBtYXJnaW4gcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBBcyB3aXRoIHRoZSBvdGhlciBtYXJnaW5zIHRoZSB2YWx1ZSBzaG91bGQgYmUgaW4gaW5jaGVzLiBUaGUgZGVmYXVsdCBoZWFkZXIgYW5kIGZvb3RlciBtYXJnaW4gaXMgMC41MCBpbmNoLiBUaGUgaGVhZGVyIGFuZCBmb290ZXIgbWFyZ2luIHNpemUgY2FuIGJlIHNldCBhcyBmb2xsb3dzOgorCisgICAgJHdvcmtzaGVldC0+c2V0X2hlYWRlcignJkNIZWxsbycsIDAuNzUpOworCitUaGUgaGVhZGVyIGFuZCBmb290ZXIgbWFyZ2lucyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIHRvcCBhbmQgYm90dG9tIG1hcmdpbnMuCisKK05vdGUsIHRoZSBoZWFkZXIgb3IgZm9vdGVyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAyNTUgY2hhcmFjdGVycy4gU3RyaW5ncyBsb25nZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIHdyaXR0ZW4gYW5kIGEgd2FybmluZyB3aWxsIGJlIGdlbmVyYXRlZC4KKworT24gc3lzdGVtcyB3aXRoIEM8cGVybCA1Ljg+IGFuZCBsYXRlciB0aGUgQzxzZXRfaGVhZGVyKCk+IG1ldGhvZCBjYW4gYWxzbyBoYW5kbGUgVW5pY29kZSBzdHJpbmdzIGluIEM8VVRGLTg+IGZvcm1hdC4KKworICAgICR3b3Jrc2hlZXQtPnNldF9oZWFkZXIoIiZDXHh7MjYzYX0iKQorCisKK1NlZSwgYWxzbyB0aGUgQzxoZWFkZXJzLnBsPiBwcm9ncmFtIGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIGRpc3RyaWJ1dGlvbi4KKworCisKKworPWhlYWQyIHNldF9mb290ZXIoKQorCitUaGUgc3ludGF4IG9mIHRoZSBDPHNldF9mb290ZXIoKT4gbWV0aG9kIGlzIHRoZSBzYW1lIGFzIEM8c2V0X2hlYWRlcigpPiwgIHNlZSBhYm92ZS4KKworCisKKworPWhlYWQyIHJlcGVhdF9yb3dzKCRmaXJzdF9yb3csICRsYXN0X3JvdykKKworU2V0IHRoZSBudW1iZXIgb2Ygcm93cyB0byByZXBlYXQgYXQgdGhlIHRvcCBvZiBlYWNoIHByaW50ZWQgcGFnZS4KKworRm9yIGxhcmdlIEV4Y2VsIGRvY3VtZW50cyBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gaGF2ZSB0aGUgZmlyc3Qgcm93IG9yIHJvd3Mgb2YgdGhlIHdvcmtzaGVldCBwcmludCBvdXQgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UuIFRoaXMgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBDPHJlcGVhdF9yb3dzKCk+IG1ldGhvZC4gVGhlIHBhcmFtZXRlcnMgQzwkZmlyc3Rfcm93PiBhbmQgQzwkbGFzdF9yb3c+IGFyZSB6ZXJvIGJhc2VkLiBUaGUgQzwkbGFzdF9yb3c+IHBhcmFtZXRlciBpcyBvcHRpb25hbCBpZiB5b3Ugb25seSB3aXNoIHRvIHNwZWNpZnkgb25lIHJvdzoKKworICAgICR3b3Jrc2hlZXQxLT5yZXBlYXRfcm93cygwKTsgICAgIyBSZXBlYXQgdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQyLT5yZXBlYXRfcm93cygwLCAxKTsgIyBSZXBlYXQgdGhlIGZpcnN0IHR3byByb3dzCisKKworCisKKz1oZWFkMiByZXBlYXRfY29sdW1ucygkZmlyc3RfY29sLCAkbGFzdF9jb2wpCisKK1NldCB0aGUgY29sdW1ucyB0byByZXBlYXQgYXQgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIGVhY2ggcHJpbnRlZCBwYWdlLgorCitGb3IgbGFyZ2UgRXhjZWwgZG9jdW1lbnRzIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBoYXZlIHRoZSBmaXJzdCBjb2x1bW4gb3IgY29sdW1ucyBvZiB0aGUgd29ya3NoZWV0IHByaW50IG91dCBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgZWFjaCBwYWdlLiBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgQzxyZXBlYXRfY29sdW1ucygpPiBtZXRob2QuIFRoZSBwYXJhbWV0ZXJzIEM8JGZpcnN0X2NvbHVtbj4gYW5kIEM8JGxhc3RfY29sdW1uPiBhcmUgemVybyBiYXNlZC4gVGhlIEM8JGxhc3RfY29sdW1uPiBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgaWYgeW91IG9ubHkgd2lzaCB0byBzcGVjaWZ5IG9uZSBjb2x1bW4uIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBjb2x1bW5zIHVzaW5nIEExIGNvbHVtbiBub3RhdGlvbiwgc2VlIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKyAgICAkd29ya3NoZWV0MS0+cmVwZWF0X2NvbHVtbnMoMCk7ICAgICAjIFJlcGVhdCB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldDItPnJlcGVhdF9jb2x1bW5zKDAsIDEpOyAgIyBSZXBlYXQgdGhlIGZpcnN0IHR3byBjb2x1bW5zCisgICAgJHdvcmtzaGVldDMtPnJlcGVhdF9jb2x1bW5zKCdBOkEnKTsgIyBSZXBlYXQgdGhlIGZpcnN0IGNvbHVtbgorICAgICR3b3Jrc2hlZXQ0LT5yZXBlYXRfY29sdW1ucygnQTpCJyk7ICMgUmVwZWF0IHRoZSBmaXJzdCB0d28gY29sdW1ucworCisKKworCis9aGVhZDIgaGlkZV9ncmlkbGluZXMoJG9wdGlvbikKKworVGhpcyBtZXRob2QgaXMgdXNlZCB0byBoaWRlIHRoZSBncmlkbGluZXMgb24gdGhlIHNjcmVlbiBhbmQgcHJpbnRlZCBwYWdlLiBHcmlkbGluZXMgYXJlIHRoZSBsaW5lcyB0aGF0IGRpdmlkZSB0aGUgY2VsbHMgb24gYSB3b3Jrc2hlZXQuIFNjcmVlbiBhbmQgcHJpbnRlZCBncmlkbGluZXMgYXJlIHR1cm5lZCBvbiBieSBkZWZhdWx0IGluIGFuIEV4Y2VsIHdvcmtzaGVldC4gSWYgeW91IGhhdmUgZGVmaW5lZCB5b3VyIG93biBjZWxsIGJvcmRlcnMgeW91IG1heSB3aXNoIHRvIGhpZGUgdGhlIGRlZmF1bHQgZ3JpZGxpbmVzLgorCisgICAgJHdvcmtzaGVldC0+aGlkZV9ncmlkbGluZXMoKTsKKworVGhlIGZvbGxvd2luZyB2YWx1ZXMgb2YgQzwkb3B0aW9uPiBhcmUgdmFsaWQ6CisKKyAgICAwIDogRG9uJ3QgaGlkZSBncmlkbGluZXMKKyAgICAxIDogSGlkZSBwcmludGVkIGdyaWRsaW5lcyBvbmx5CisgICAgMiA6IEhpZGUgc2NyZWVuIGFuZCBwcmludGVkIGdyaWRsaW5lcworCitJZiB5b3UgZG9uJ3Qgc3VwcGx5IGFuIGFyZ3VtZW50IG9yIHVzZSBDPHVuZGVmPiB0aGUgZGVmYXVsdCBvcHRpb24gaXMgMSwgaS5lLiBvbmx5IHRoZSBwcmludGVkIGdyaWRsaW5lcyBhcmUgaGlkZGVuLgorCisKKworCis9aGVhZDIgcHJpbnRfcm93X2NvbF9oZWFkZXJzKCkKKworU2V0IHRoZSBvcHRpb24gdG8gcHJpbnQgdGhlIHJvdyBhbmQgY29sdW1uIGhlYWRlcnMgb24gdGhlIHByaW50ZWQgcGFnZS4KKworQW4gRXhjZWwgd29ya3NoZWV0IGxvb2tzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc7CisKKyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHwgMSB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgMiB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgMyB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwgNCB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgIHwuLi58ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorCitUaGUgaGVhZGVycyBhcmUgdGhlIGxldHRlcnMgYW5kIG51bWJlcnMgYXQgdGhlIHRvcCBhbmQgdGhlIGxlZnQgb2YgdGhlIHdvcmtzaGVldC4gU2luY2UgdGhlc2UgaGVhZGVycyBzZXJ2ZSBtYWlubHkgYXMgYSBpbmRpY2F0aW9uIG9mIHBvc2l0aW9uIG9uIHRoZSB3b3Jrc2hlZXQgdGhleSBnZW5lcmFsbHkgZG8gbm90IGFwcGVhciBvbiB0aGUgcHJpbnRlZCBwYWdlLiBJZiB5b3Ugd2lzaCB0byBoYXZlIHRoZW0gcHJpbnRlZCB5b3UgY2FuIHVzZSB0aGUgQzxwcmludF9yb3dfY29sX2hlYWRlcnMoKT4gbWV0aG9kIDoKKworICAgICR3b3Jrc2hlZXQtPnByaW50X3Jvd19jb2xfaGVhZGVycygpOworCitEbyBub3QgY29uZnVzZSB0aGVzZSBoZWFkZXJzIHdpdGggcGFnZSBoZWFkZXJzIGFzIGRlc2NyaWJlZCBpbiB0aGUgQzxzZXRfaGVhZGVyKCk+IHNlY3Rpb24gYWJvdmUuCisKKworCisKKz1oZWFkMiBwcmludF9hcmVhKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGFyZWEgb2YgdGhlIHdvcmtzaGVldCB0aGF0IHdpbGwgYmUgcHJpbnRlZC4gQWxsIGZvdXIgcGFyYW1ldGVycyBtdXN0IGJlIHNwZWNpZmllZC4gWW91IGNhbiBhbHNvIHVzZSBBMSBub3RhdGlvbiwgc2VlIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4uCisKKworICAgICR3b3Jrc2hlZXQxLT5wcmludF9hcmVhKCdBMTpIMjAnKTsgICAgIyBDZWxscyBBMSB0byBIMjAKKyAgICAkd29ya3NoZWV0Mi0+cHJpbnRfYXJlYSgwLCAwLCAxOSwgNyk7ICMgVGhlIHNhbWUKKyAgICAkd29ya3NoZWV0Mi0+cHJpbnRfYXJlYSgnQTpIJyk7ICAgICAgICMgQ29sdW1ucyBBIHRvIEggaWYgcm93cyBoYXZlIGRhdGEKKworCisKKworPWhlYWQyIHByaW50X2Fjcm9zcygpCisKK1RoZSBDPHByaW50X2Fjcm9zcz4gbWV0aG9kIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IHByaW50IGRpcmVjdGlvbi4gVGhpcyBpcyByZWZlcnJlZCB0byBieSBFeGNlbCBhcyB0aGUgc2hlZXQgInBhZ2Ugb3JkZXIiLgorCisgICAgJHdvcmtzaGVldC0+cHJpbnRfYWNyb3NzKCk7CisKK1RoZSBkZWZhdWx0IHBhZ2Ugb3JkZXIgaXMgc2hvd24gYmVsb3cgZm9yIGEgd29ya3NoZWV0IHRoYXQgZXh0ZW5kcyBvdmVyIDQgcGFnZXMuIFRoZSBvcmRlciBpcyBjYWxsZWQgImRvd24gdGhlbiBhY3Jvc3MiOgorCisgICAgWzFdIFszXQorICAgIFsyXSBbNF0KKworSG93ZXZlciwgYnkgdXNpbmcgdGhlIEM8cHJpbnRfYWNyb3NzPiBtZXRob2QgdGhlIHByaW50IG9yZGVyIHdpbGwgYmUgY2hhbmdlZCB0byAiYWNyb3NzIHRoZW4gZG93biI6CisKKyAgICBbMV0gWzJdCisgICAgWzNdIFs0XQorCisKKworCis9aGVhZDIgZml0X3RvX3BhZ2VzKCR3aWR0aCwgJGhlaWdodCkKKworVGhlIEM8Zml0X3RvX3BhZ2VzKCk+IG1ldGhvZCBpcyB1c2VkIHRvIGZpdCB0aGUgcHJpbnRlZCBhcmVhIHRvIGEgc3BlY2lmaWMgbnVtYmVyIG9mIHBhZ2VzIGJvdGggdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LiBJZiB0aGUgcHJpbnRlZCBhcmVhIGV4Y2VlZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGFnZXMgaXQgd2lsbCBiZSBzY2FsZWQgZG93biB0byBmaXQuIFRoaXMgZ3VhcmFudGVlcyB0aGF0IHRoZSBwcmludGVkIGFyZWEgd2lsbCBhbHdheXMgYXBwZWFyIG9uIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIHBhZ2VzIGV2ZW4gaWYgdGhlIHBhZ2Ugc2l6ZSBvciBtYXJnaW5zIGNoYW5nZS4KKworICAgICR3b3Jrc2hlZXQxLT5maXRfdG9fcGFnZXMoMSwgMSk7ICMgRml0IHRvIDF4MSBwYWdlcworICAgICR3b3Jrc2hlZXQyLT5maXRfdG9fcGFnZXMoMiwgMSk7ICMgRml0IHRvIDJ4MSBwYWdlcworICAgICR3b3Jrc2hlZXQzLT5maXRfdG9fcGFnZXMoMSwgMik7ICMgRml0IHRvIDF4MiBwYWdlcworCitUaGUgcHJpbnQgYXJlYSBjYW4gYmUgZGVmaW5lZCB1c2luZyB0aGUgQzxwcmludF9hcmVhKCk+IG1ldGhvZCBhcyBkZXNjcmliZWQgYWJvdmUuCisKK0EgY29tbW9uIHJlcXVpcmVtZW50IGlzIHRvIGZpdCB0aGUgcHJpbnRlZCBvdXRwdXQgdG8gSTxuPiBwYWdlcyB3aWRlIGJ1dCBoYXZlIHRoZSBoZWlnaHQgYmUgYXMgbG9uZyBhcyBuZWNlc3NhcnkuIFRvIGFjaGlldmUgdGhpcyBzZXQgdGhlIEM8JGhlaWdodD4gdG8gemVybyBvciBsZWF2ZSBpdCBibGFuazoKKworICAgICR3b3Jrc2hlZXQxLT5maXRfdG9fcGFnZXMoMSwgMCk7ICMgMSBwYWdlIHdpZGUgYW5kIGFzIGxvbmcgYXMgbmVjZXNzYXJ5CisgICAgJHdvcmtzaGVldDItPmZpdF90b19wYWdlcygxKTsgICAgIyBUaGUgc2FtZQorCisKK05vdGUgdGhhdCBhbHRob3VnaCBpdCBpcyB2YWxpZCB0byB1c2UgYm90aCBDPGZpdF90b19wYWdlcygpPiBhbmQgQzxzZXRfcHJpbnRfc2NhbGUoKT4gb24gdGhlIHNhbWUgd29ya3NoZWV0IG9ubHkgb25lIG9mIHRoZXNlIG9wdGlvbnMgY2FuIGJlIGFjdGl2ZSBhdCBhIHRpbWUuIFRoZSBsYXN0IG1ldGhvZCBjYWxsIG1hZGUgd2lsbCBzZXQgdGhlIGFjdGl2ZSBvcHRpb24uCisKK05vdGUgdGhhdCBDPGZpdF90b19wYWdlcygpPiB3aWxsIG92ZXJyaWRlIGFueSBtYW51YWwgcGFnZSBicmVha3MgdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgd29ya3NoZWV0LgorCisKKworCis9aGVhZDIgc2V0X3N0YXJ0X3BhZ2UoJHN0YXJ0X3BhZ2UpCisKK1RoZSBDPHNldF9zdGFydF9wYWdlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIHRoZSBzdGFydGluZyBwYWdlIHdoZW4gdGhlIHdvcmtzaGVldCBpcyBwcmludGVkIG91dC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMS4KKworICAgICR3b3Jrc2hlZXQtPnNldF9zdGFydF9wYWdlKDIpOworCisKKworCis9aGVhZDIgc2V0X3ByaW50X3NjYWxlKCRzY2FsZSkKKworU2V0IHRoZSBzY2FsZSBmYWN0b3Igb2YgdGhlIHByaW50ZWQgcGFnZS4gU2NhbGUgZmFjdG9ycyBpbiB0aGUgcmFuZ2UgQzwxMCBFPGx0Pj0gJHNjYWxlIEU8bHQ+PSA0MDA+IGFyZSB2YWxpZDoKKworICAgICR3b3Jrc2hlZXQxLT5zZXRfcHJpbnRfc2NhbGUoNTApOworICAgICR3b3Jrc2hlZXQyLT5zZXRfcHJpbnRfc2NhbGUoNzUpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcHJpbnRfc2NhbGUoMzAwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3ByaW50X3NjYWxlKDQwMCk7CisKK1RoZSBkZWZhdWx0IHNjYWxlIGZhY3RvciBpcyAxMDAuIE5vdGUsIEM8c2V0X3ByaW50X3NjYWxlKCk+IGRvZXMgbm90IGFmZmVjdCB0aGUgc2NhbGUgb2YgdGhlIHZpc2libGUgcGFnZSBpbiBFeGNlbC4gRm9yIHRoYXQgeW91IHNob3VsZCB1c2UgQzxzZXRfem9vbSgpPi4KKworTm90ZSBhbHNvIHRoYXQgYWx0aG91Z2ggaXQgaXMgdmFsaWQgdG8gdXNlIGJvdGggQzxmaXRfdG9fcGFnZXMoKT4gYW5kIEM8c2V0X3ByaW50X3NjYWxlKCk+IG9uIHRoZSBzYW1lIHdvcmtzaGVldCBvbmx5IG9uZSBvZiB0aGVzZSBvcHRpb25zIGNhbiBiZSBhY3RpdmUgYXQgYSB0aW1lLiBUaGUgbGFzdCBtZXRob2QgY2FsbCBtYWRlIHdpbGwgc2V0IHRoZSBhY3RpdmUgb3B0aW9uLgorCisKKworCis9aGVhZDIgc2V0X2hfcGFnZWJyZWFrcyhAYnJlYWtzKQorCitBZGQgaG9yaXpvbnRhbCBwYWdlIGJyZWFrcyB0byBhIHdvcmtzaGVldC4gQSBwYWdlIGJyZWFrIGNhdXNlcyBhbGwgdGhlIGRhdGEgdGhhdCBmb2xsb3dzIGl0IHRvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgcGFnZS4gSG9yaXpvbnRhbCBwYWdlIGJyZWFrcyBhY3QgYmV0d2VlbiByb3dzLiBUbyBjcmVhdGUgYSBwYWdlIGJyZWFrIGJldHdlZW4gcm93cyAyMCBhbmQgMjEgeW91IG11c3Qgc3BlY2lmeSB0aGUgYnJlYWsgYXQgcm93IDIxLiBIb3dldmVyIGluIHplcm8gaW5kZXggbm90YXRpb24gdGhpcyBpcyBhY3R1YWxseSByb3cgMjAuIFNvIHlvdSBjYW4gcHJldGVuZCBmb3IgYSBzbWFsbCB3aGlsZSB0aGF0IHlvdSBhcmUgdXNpbmcgMSBpbmRleCBub3RhdGlvbjoKKworICAgICR3b3Jrc2hlZXQxLT5zZXRfaF9wYWdlYnJlYWtzKDIwKTsgIyBCcmVhayBiZXR3ZWVuIHJvdyAyMCBhbmQgMjEKKworVGhlIEM8c2V0X2hfcGFnZWJyZWFrcygpPiBtZXRob2Qgd2lsbCBhY2NlcHQgYSBsaXN0IG9mIHBhZ2UgYnJlYWtzIGFuZCB5b3UgY2FuIGNhbGwgaXQgbW9yZSB0aGFuIG9uY2U6CisKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2hfcGFnZWJyZWFrcyggMjAsICA0MCwgIDYwLCAgODAsIDEwMCk7ICMgQWRkIGJyZWFrcworICAgICR3b3Jrc2hlZXQyLT5zZXRfaF9wYWdlYnJlYWtzKDEyMCwgMTQwLCAxNjAsIDE4MCwgMjAwKTsgIyBBZGQgc29tZSBtb3JlCisKK05vdGU6IElmIHlvdSBzcGVjaWZ5IHRoZSAiZml0IHRvIHBhZ2UiIG9wdGlvbiB2aWEgdGhlIEM8Zml0X3RvX3BhZ2VzKCk+IG1ldGhvZCBpdCB3aWxsIG92ZXJyaWRlIGFsbCBtYW51YWwgcGFnZSBicmVha3MuCisKK1RoZXJlIGlzIGEgc2lsZW50IGxpbWl0YXRpb24gb2YgYWJvdXQgMTAwMCBob3Jpem9udGFsIHBhZ2UgYnJlYWtzIHBlciB3b3Jrc2hlZXQgaW4gbGluZSB3aXRoIGFuIEV4Y2VsIGludGVybmFsIGxpbWl0YXRpb24uCisKKworCisKKz1oZWFkMiBzZXRfdl9wYWdlYnJlYWtzKEBicmVha3MpCisKK0FkZCB2ZXJ0aWNhbCBwYWdlIGJyZWFrcyB0byBhIHdvcmtzaGVldC4gQSBwYWdlIGJyZWFrIGNhdXNlcyBhbGwgdGhlIGRhdGEgdGhhdCBmb2xsb3dzIGl0IHRvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgcGFnZS4gVmVydGljYWwgcGFnZSBicmVha3MgYWN0IGJldHdlZW4gY29sdW1ucy4gVG8gY3JlYXRlIGEgcGFnZSBicmVhayBiZXR3ZWVuIGNvbHVtbnMgMjAgYW5kIDIxIHlvdSBtdXN0IHNwZWNpZnkgdGhlIGJyZWFrIGF0IGNvbHVtbiAyMS4gSG93ZXZlciBpbiB6ZXJvIGluZGV4IG5vdGF0aW9uIHRoaXMgaXMgYWN0dWFsbHkgY29sdW1uIDIwLiBTbyB5b3UgY2FuIHByZXRlbmQgZm9yIGEgc21hbGwgd2hpbGUgdGhhdCB5b3UgYXJlIHVzaW5nIDEgaW5kZXggbm90YXRpb246CisKKyAgICAkd29ya3NoZWV0MS0+c2V0X3ZfcGFnZWJyZWFrcygyMCk7ICMgQnJlYWsgYmV0d2VlbiBjb2x1bW4gMjAgYW5kIDIxCisKK1RoZSBDPHNldF92X3BhZ2VicmVha3MoKT4gbWV0aG9kIHdpbGwgYWNjZXB0IGEgbGlzdCBvZiBwYWdlIGJyZWFrcyBhbmQgeW91IGNhbiBjYWxsIGl0IG1vcmUgdGhhbiBvbmNlOgorCisgICAgJHdvcmtzaGVldDItPnNldF92X3BhZ2VicmVha3MoIDIwLCAgNDAsICA2MCwgIDgwLCAxMDApOyAjIEFkZCBicmVha3MKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3ZfcGFnZWJyZWFrcygxMjAsIDE0MCwgMTYwLCAxODAsIDIwMCk7ICMgQWRkIHNvbWUgbW9yZQorCitOb3RlOiBJZiB5b3Ugc3BlY2lmeSB0aGUgImZpdCB0byBwYWdlIiBvcHRpb24gdmlhIHRoZSBDPGZpdF90b19wYWdlcygpPiBtZXRob2QgaXQgd2lsbCBvdmVycmlkZSBhbGwgbWFudWFsIHBhZ2UgYnJlYWtzLgorCisKKworCis9aGVhZDEgQ0VMTCBGT1JNQVRUSU5HCisKK1RoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGZvciBmb3JtYXR0aW5nIGNlbGxzIGluIEV4Y2VsLiBUaGUgcHJvcGVydGllcyBvZiBhIGNlbGwgdGhhdCBjYW4gYmUgZm9ybWF0dGVkIGluY2x1ZGU6IGZvbnRzLCBjb2xvdXJzLCBwYXR0ZXJucywgYm9yZGVycywgYWxpZ25tZW50IGFuZCBudW1iZXIgZm9ybWF0dGluZy4KKworCis9aGVhZDIgQ3JlYXRpbmcgYW5kIHVzaW5nIGEgRm9ybWF0IG9iamVjdAorCitDZWxsIGZvcm1hdHRpbmcgaXMgZGVmaW5lZCB0aHJvdWdoIGEgRm9ybWF0IG9iamVjdC4gRm9ybWF0IG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgd29ya2Jvb2sgQzxhZGRfZm9ybWF0KCk+IG1ldGhvZCBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsgICAgICAgIyBTZXQgcHJvcGVydGllcyBsYXRlcgorICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVwcm9wcyk7ICMgU2V0IGF0IGNyZWF0aW9uCisKK1RoZSBmb3JtYXQgb2JqZWN0IGhvbGRzIGFsbCB0aGUgZm9ybWF0dGluZyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBjZWxsLCBhIHJvdyBvciBhIGNvbHVtbi4gVGhlIHByb2Nlc3Mgb2Ygc2V0dGluZyB0aGVzZSBwcm9wZXJ0aWVzIGlzIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCitPbmNlIGEgRm9ybWF0IG9iamVjdCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBhbmQgaXQgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0IGl0IGNhbiBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gdGhlIHdvcmtzaGVldCBDPHdyaXRlPiBtZXRob2RzIGFzIGZvbGxvd3M6CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnT25lJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKDEsIDAsICdUd28nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIoMiwgMCwgMywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoMywgMCwgJGZvcm1hdCk7CisKK0Zvcm1hdHMgY2FuIGFsc28gYmUgcGFzc2VkIHRvIHRoZSB3b3Jrc2hlZXQgQzxzZXRfcm93KCk+IGFuZCBDPHNldF9jb2x1bW4oKT4gbWV0aG9kcyB0byBkZWZpbmUgdGhlIGRlZmF1bHQgcHJvcGVydHkgZm9yIGEgcm93IG9yIGNvbHVtbi4KKworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMTUsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMTUsICRmb3JtYXQpOworCisKKworCis9aGVhZDIgRm9ybWF0IG1ldGhvZHMgYW5kIEZvcm1hdCBwcm9wZXJ0aWVzCisKK1RoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIEV4Y2VsIGZvcm1hdCBjYXRlZ29yaWVzLCB0aGUgZm9ybWF0dGluZyBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGFwcGxpZWQgYW5kIHRoZSBlcXVpdmFsZW50IG9iamVjdCBtZXRob2Q6CisKKworICAgIENhdGVnb3J5ICAgRGVzY3JpcHRpb24gICAgICAgUHJvcGVydHkgICAgICAgIE1ldGhvZCBOYW1lCisgICAgLS0tLS0tLS0gICAtLS0tLS0tLS0tLSAgICAgICAtLS0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0KKyAgICBGb250ICAgICAgIEZvbnQgdHlwZSAgICAgICAgIGZvbnQgICAgICAgICAgICBzZXRfZm9udCgpCisgICAgICAgICAgICAgICBGb250IHNpemUgICAgICAgICBzaXplICAgICAgICAgICAgc2V0X3NpemUoKQorICAgICAgICAgICAgICAgRm9udCBjb2xvciAgICAgICAgY29sb3IgICAgICAgICAgIHNldF9jb2xvcigpCisgICAgICAgICAgICAgICBCb2xkICAgICAgICAgICAgICBib2xkICAgICAgICAgICAgc2V0X2JvbGQoKQorICAgICAgICAgICAgICAgSXRhbGljICAgICAgICAgICAgaXRhbGljICAgICAgICAgIHNldF9pdGFsaWMoKQorICAgICAgICAgICAgICAgVW5kZXJsaW5lICAgICAgICAgdW5kZXJsaW5lICAgICAgIHNldF91bmRlcmxpbmUoKQorICAgICAgICAgICAgICAgU3RyaWtlb3V0ICAgICAgICAgZm9udF9zdHJpa2VvdXQgIHNldF9mb250X3N0cmlrZW91dCgpCisgICAgICAgICAgICAgICBTdXBlci9TdWJzY3JpcHQgICBmb250X3NjcmlwdCAgICAgc2V0X2ZvbnRfc2NyaXB0KCkKKyAgICAgICAgICAgICAgIE91dGxpbmUgICAgICAgICAgIGZvbnRfb3V0bGluZSAgICBzZXRfZm9udF9vdXRsaW5lKCkKKyAgICAgICAgICAgICAgIFNoYWRvdyAgICAgICAgICAgIGZvbnRfc2hhZG93ICAgICBzZXRfZm9udF9zaGFkb3coKQorCisgICAgTnVtYmVyICAgICBOdW1lcmljIGZvcm1hdCAgICBudW1fZm9ybWF0ICAgICAgc2V0X251bV9mb3JtYXQoKQorCisgICAgUHJvdGVjdGlvbiBMb2NrIGNlbGxzICAgICAgICBsb2NrZWQgICAgICAgICAgc2V0X2xvY2tlZCgpCisgICAgICAgICAgICAgICBIaWRlIGZvcm11bGFzICAgICBoaWRkZW4gICAgICAgICAgc2V0X2hpZGRlbigpCisKKyAgICBBbGlnbm1lbnQgIEhvcml6b250YWwgYWxpZ24gIGFsaWduICAgICAgICAgICBzZXRfYWxpZ24oKQorICAgICAgICAgICAgICAgVmVydGljYWwgYWxpZ24gICAgdmFsaWduICAgICAgICAgIHNldF9hbGlnbigpCisgICAgICAgICAgICAgICBSb3RhdGlvbiAgICAgICAgICByb3RhdGlvbiAgICAgICAgc2V0X3JvdGF0aW9uKCkKKyAgICAgICAgICAgICAgIFRleHQgd3JhcCAgICAgICAgIHRleHRfd3JhcCAgICAgICBzZXRfdGV4dF93cmFwKCkKKyAgICAgICAgICAgICAgIEp1c3RpZnkgbGFzdCAgICAgIHRleHRfanVzdGxhc3QgICBzZXRfdGV4dF9qdXN0bGFzdCgpCisgICAgICAgICAgICAgICBDZW50ZXIgYWNyb3NzICAgICBjZW50ZXJfYWNyb3NzICAgc2V0X2NlbnRlcl9hY3Jvc3MoKQorICAgICAgICAgICAgICAgSW5kZW50YXRpb24gICAgICAgaW5kZW50ICAgICAgICAgIHNldF9pbmRlbnQoKQorICAgICAgICAgICAgICAgU2hyaW5rIHRvIGZpdCAgICAgc2hyaW5rICAgICAgICAgIHNldF9zaHJpbmsoKQorCisgICAgUGF0dGVybiAgICBDZWxsIHBhdHRlcm4gICAgICBwYXR0ZXJuICAgICAgICAgc2V0X3BhdHRlcm4oKQorICAgICAgICAgICAgICAgQmFja2dyb3VuZCBjb2xvciAgYmdfY29sb3IgICAgICAgIHNldF9iZ19jb2xvcigpCisgICAgICAgICAgICAgICBGb3JlZ3JvdW5kIGNvbG9yICBmZ19jb2xvciAgICAgICAgc2V0X2ZnX2NvbG9yKCkKKworICAgIEJvcmRlciAgICAgQ2VsbCBib3JkZXIgICAgICAgYm9yZGVyICAgICAgICAgIHNldF9ib3JkZXIoKQorICAgICAgICAgICAgICAgQm90dG9tIGJvcmRlciAgICAgYm90dG9tICAgICAgICAgIHNldF9ib3R0b20oKQorICAgICAgICAgICAgICAgVG9wIGJvcmRlciAgICAgICAgdG9wICAgICAgICAgICAgIHNldF90b3AoKQorICAgICAgICAgICAgICAgTGVmdCBib3JkZXIgICAgICAgbGVmdCAgICAgICAgICAgIHNldF9sZWZ0KCkKKyAgICAgICAgICAgICAgIFJpZ2h0IGJvcmRlciAgICAgIHJpZ2h0ICAgICAgICAgICBzZXRfcmlnaHQoKQorICAgICAgICAgICAgICAgQm9yZGVyIGNvbG9yICAgICAgYm9yZGVyX2NvbG9yICAgIHNldF9ib3JkZXJfY29sb3IoKQorICAgICAgICAgICAgICAgQm90dG9tIGNvbG9yICAgICAgYm90dG9tX2NvbG9yICAgIHNldF9ib3R0b21fY29sb3IoKQorICAgICAgICAgICAgICAgVG9wIGNvbG9yICAgICAgICAgdG9wX2NvbG9yICAgICAgIHNldF90b3BfY29sb3IoKQorICAgICAgICAgICAgICAgTGVmdCBjb2xvciAgICAgICAgbGVmdF9jb2xvciAgICAgIHNldF9sZWZ0X2NvbG9yKCkKKyAgICAgICAgICAgICAgIFJpZ2h0IGNvbG9yICAgICAgIHJpZ2h0X2NvbG9yICAgICBzZXRfcmlnaHRfY29sb3IoKQorCitUaGVyZSBhcmUgdHdvIHdheXMgb2Ygc2V0dGluZyBGb3JtYXQgcHJvcGVydGllczogYnkgdXNpbmcgdGhlIG9iamVjdCBtZXRob2QgaW50ZXJmYWNlIG9yIGJ5IHNldHRpbmcgdGhlIHByb3BlcnR5IGRpcmVjdGx5LiBGb3IgZXhhbXBsZSwgYSB0eXBpY2FsIHVzZSBvZiB0aGUgbWV0aG9kIGludGVyZmFjZSB3b3VsZCBiZSBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdyZWQnKTsKKworQnkgY29tcGFyaXNvbiB0aGUgcHJvcGVydGllcyBjYW4gYmUgc2V0IGRpcmVjdGx5IGJ5IHBhc3NpbmcgYSBoYXNoIG9mIHByb3BlcnRpZXMgdG8gdGhlIEZvcm1hdCBjb25zdHJ1Y3RvcjoKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxLCBjb2xvciA9PiAncmVkJyk7CisKK29yIGFmdGVyIHRoZSBGb3JtYXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgYnkgbWVhbnMgb2YgdGhlIEM8c2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKCk+IG1ldGhvZCBhcyBmb2xsb3dzOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9mb3JtYXRfcHJvcGVydGllcyhib2xkID0+IDEsIGNvbG9yID0+ICdyZWQnKTsKKworWW91IGNhbiBhbHNvIHN0b3JlIHRoZSBwcm9wZXJ0aWVzIGluIG9uZSBvciBtb3JlIG5hbWVkIGhhc2hlcyBhbmQgcGFzcyB0aGVtIHRvIHRoZSByZXF1aXJlZCBtZXRob2Q6CisKKyAgICBteSAlZm9udCAgICA9ICgKKyAgICAgICAgICAgICAgICAgICAgZm9udCAgPT4gJ0FyaWFsJywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgIGNvbG9yID0+ICdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgYm9sZCAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAlc2hhZGluZyA9ICgKKyAgICAgICAgICAgICAgICAgICAgYmdfY29sb3IgPT4gJ2dyZWVuJywKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVmb250KTsgICAgICAgICAgICMgRm9udCBvbmx5CisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWZvbnQsICVzaGFkaW5nKTsgIyBGb250IGFuZCBzaGFkaW5nCisKKworVGhlIHByb3Zpc2lvbiBvZiB0d28gd2F5cyBvZiBzZXR0aW5nIHByb3BlcnRpZXMgbWlnaHQgbGVhZCB5b3UgdG8gd29uZGVyIHdoaWNoIGlzIHRoZSBiZXN0IHdheS4gVGhlIG1ldGhvZCBtZWNoYW5pc20gbWF5IGJlIGJldHRlciBpcyB5b3UgcHJlZmVyIHNldHRpbmcgcHJvcGVydGllcyB2aWEgbWV0aG9kIGNhbGxzICh3aGljaCB0aGUgYXV0aG9yIGRpZCB3aGVuIHRoZXkgd2VyZSBjb2RlIHdhcyBmaXJzdCB3cml0dGVuKSBvdGhlcndpc2UgcGFzc2luZyBwcm9wZXJ0aWVzIHRvIHRoZSBjb25zdHJ1Y3RvciBoYXMgcHJvdmVkIHRvIGJlIGEgbGl0dGxlIG1vcmUgZmxleGlibGUgYW5kIHNlbGYgZG9jdW1lbnRpbmcgaW4gcHJhY3RpY2UuIEFuIGFkZGl0aW9uYWwgYWR2YW50YWdlIG9mIHdvcmtpbmcgd2l0aCBwcm9wZXJ0eSBoYXNoZXMgaXMgdGhhdCBpdCBhbGxvd3MgeW91IHRvIHNoYXJlIGZvcm1hdHRpbmcgYmV0d2VlbiB3b3JrYm9vayBvYmplY3RzIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGFib3ZlLgorCitUaGUgUGVybC9UayBzdHlsZSBvZiBhZGRpbmcgcHJvcGVydGllcyBpcyBhbHNvIHN1cHBvcnRlZDoKKworICAgIG15ICVmb250ICAgID0gKAorICAgICAgICAgICAgICAgICAgICAtZm9udCAgICAgID0+ICdBcmlhbCcsCisgICAgICAgICAgICAgICAgICAgIC1zaXplICAgICAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgIC1jb2xvciAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAtYm9sZCAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICApOworCisKKworCis9aGVhZDIgV29ya2luZyB3aXRoIGZvcm1hdHMKKworVGhlIGRlZmF1bHQgZm9ybWF0IGlzIEFyaWFsIDEwIHdpdGggYWxsIG90aGVyIHByb3BlcnRpZXMgb2ZmLgorCitFYWNoIHVuaXF1ZSBmb3JtYXQgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBGb3JtYXQgb2JqZWN0LiBJdCBpc24ndCBwb3NzaWJsZSB0byB1c2UgYSBGb3JtYXQgd2l0aCBhIHdyaXRlKCkgbWV0aG9kIGFuZCB0aGVuIHJlZGVmaW5lIHRoZSBGb3JtYXQgZm9yIHVzZSBhdCBhIGxhdGVyIHN0YWdlLiBUaGlzIGlzIGJlY2F1c2UgYSBGb3JtYXQgaXMgYXBwbGllZCB0byBhIGNlbGwgbm90IGluIGl0cyBjdXJyZW50IHN0YXRlIGJ1dCBpbiBpdHMgZmluYWwgc3RhdGUuIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0NlbGwgQTEnLCAkZm9ybWF0KTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2dyZWVuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0NlbGwgQjEnLCAkZm9ybWF0KTsKKworQ2VsbCBBMSBpcyBhc3NpZ25lZCB0aGUgRm9ybWF0IEM8JGZvcm1hdD4gd2hpY2ggaXMgaW5pdGlhbGx5IHNldCB0byB0aGUgY29sb3VyIHJlZC4gSG93ZXZlciwgdGhlIGNvbG91ciBpcyBzdWJzZXF1ZW50bHkgc2V0IHRvIGdyZWVuLiBXaGVuIEV4Y2VsIGRpc3BsYXlzIENlbGwgQTEgaXQgd2lsbCBkaXNwbGF5IHRoZSBmaW5hbCBzdGF0ZSBvZiB0aGUgRm9ybWF0IHdoaWNoIGluIHRoaXMgY2FzZSB3aWxsIGJlIHRoZSBjb2xvdXIgZ3JlZW4uCisKK0luIGdlbmVyYWwgYSBtZXRob2QgY2FsbCB3aXRob3V0IGFuIGFyZ3VtZW50IHdpbGwgdHVybiBhIHByb3BlcnR5IG9uLCBmb3IgZXhhbXBsZToKKworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdDEtPnNldF9ib2xkKCk7ICAjIFR1cm5zIGJvbGQgb24KKyAgICAkZm9ybWF0MS0+c2V0X2JvbGQoMSk7ICMgQWxzbyB0dXJucyBib2xkIG9uCisgICAgJGZvcm1hdDEtPnNldF9ib2xkKDApOyAjIFR1cm5zIGJvbGQgb2ZmCisKKworCisKKz1oZWFkMSBGT1JNQVQgTUVUSE9EUworCitUaGUgRm9ybWF0IG9iamVjdCBtZXRob2RzIGFyZSBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEgUGVybCBwcm9ncmFtIGNhbGxlZCBDPGZvcm1hdHMucGw+IGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3Rvcnkgb2YgdGhlIFdyaXRlRXhjZWwgZGlzdHJpYnV0aW9uLiBUaGlzIHByb2dyYW0gY3JlYXRlcyBhbiBFeGNlbCB3b3JrYm9vayBjYWxsZWQgQzxmb3JtYXRzLnhscz4gd2hpY2ggY29udGFpbnMgZXhhbXBsZXMgb2YgYWxtb3N0IGFsbCB0aGUgZm9ybWF0IHR5cGVzLgorCitUaGUgZm9sbG93aW5nIEZvcm1hdCBtZXRob2RzIGFyZSBhdmFpbGFibGU6CisKKyAgICBzZXRfZm9udCgpCisgICAgc2V0X3NpemUoKQorICAgIHNldF9jb2xvcigpCisgICAgc2V0X2JvbGQoKQorICAgIHNldF9pdGFsaWMoKQorICAgIHNldF91bmRlcmxpbmUoKQorICAgIHNldF9mb250X3N0cmlrZW91dCgpCisgICAgc2V0X2ZvbnRfc2NyaXB0KCkKKyAgICBzZXRfZm9udF9vdXRsaW5lKCkKKyAgICBzZXRfZm9udF9zaGFkb3coKQorICAgIHNldF9udW1fZm9ybWF0KCkKKyAgICBzZXRfbG9ja2VkKCkKKyAgICBzZXRfaGlkZGVuKCkKKyAgICBzZXRfYWxpZ24oKQorICAgIHNldF9yb3RhdGlvbigpCisgICAgc2V0X3RleHRfd3JhcCgpCisgICAgc2V0X3RleHRfanVzdGxhc3QoKQorICAgIHNldF9jZW50ZXJfYWNyb3NzKCkKKyAgICBzZXRfaW5kZW50KCkKKyAgICBzZXRfc2hyaW5rKCkKKyAgICBzZXRfcGF0dGVybigpCisgICAgc2V0X2JnX2NvbG9yKCkKKyAgICBzZXRfZmdfY29sb3IoKQorICAgIHNldF9ib3JkZXIoKQorICAgIHNldF9ib3R0b20oKQorICAgIHNldF90b3AoKQorICAgIHNldF9sZWZ0KCkKKyAgICBzZXRfcmlnaHQoKQorICAgIHNldF9ib3JkZXJfY29sb3IoKQorICAgIHNldF9ib3R0b21fY29sb3IoKQorICAgIHNldF90b3BfY29sb3IoKQorICAgIHNldF9sZWZ0X2NvbG9yKCkKKyAgICBzZXRfcmlnaHRfY29sb3IoKQorCisKK1RoZSBhYm92ZSBtZXRob2RzIGNhbiBhbHNvIGJlIGFwcGxpZWQgZGlyZWN0bHkgYXMgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUgQzw8ICRmb3JtYXQtPnNldF9ib2xkKCkgPj4gaXMgZXF1aXZhbGVudCB0byBDPDwgJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSkgPj4uCisKKworPWhlYWQyIHNldF9mb3JtYXRfcHJvcGVydGllcyglcHJvcGVydGllcykKKworVGhlIHByb3BlcnRpZXMgb2YgYW4gZXhpc3RpbmcgRm9ybWF0IG9iamVjdCBjYW4gYmUgYWxzbyBiZSBzZXQgYnkgbWVhbnMgb2YgQzxzZXRfZm9ybWF0X3Byb3BlcnRpZXMoKT46CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2Zvcm1hdF9wcm9wZXJ0aWVzKGJvbGQgPT4gMSwgY29sb3IgPT4gJ3JlZCcpOworCitIb3dldmVyLCB0aGlzIG1ldGhvZCBpcyBoZXJlIG1haW5seSBmb3IgbGVnYWN5IHJlYXNvbnMuIEl0IGlzIHByZWZlcmFibGUgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBmb3JtYXQgY29uc3RydWN0b3I6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGJvbGQgPT4gMSwgY29sb3IgPT4gJ3JlZCcpOworCisKKz1oZWFkMiBzZXRfZm9udCgkZm9udG5hbWUpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIEZvbnQgaXMgQXJpYWwKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIE5vbmUKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEFueSB2YWxpZCBmb250IG5hbWUKKworU3BlY2lmeSB0aGUgZm9udCB1c2VkOgorCisgICAgJGZvcm1hdC0+c2V0X2ZvbnQoJ1RpbWVzIE5ldyBSb21hbicpOworCitFeGNlbCBjYW4gb25seSBkaXNwbGF5IGZvbnRzIHRoYXQgYXJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIHRoYXQgaXQgaXMgcnVubmluZyBvbi4gVGhlcmVmb3JlIGl0IGlzIGJlc3QgdG8gdXNlIHRoZSBmb250cyB0aGF0IGNvbWUgYXMgc3RhbmRhcmQgc3VjaCBhcyAnQXJpYWwnLCAnVGltZXMgTmV3IFJvbWFuJyBhbmQgJ0NvdXJpZXIgTmV3Jy4gU2VlIGFsc28gdGhlIEZvbnRzIHdvcmtzaGVldCBjcmVhdGVkIGJ5IGZvcm1hdHMucGwKKworCisKKworPWhlYWQyIHNldF9zaXplKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgRm9udCBzaXplIGlzIDEwCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgZm9udCBzaXplIHRvIDEKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEludGVnZXIgdmFsdWVzIGZyb20gMSB0byBhcyBiaWcgYXMgeW91ciBzY3JlZW4uCisKKworU2V0IHRoZSBmb250IHNpemUuIEV4Y2VsIGFkanVzdHMgdGhlIGhlaWdodCBvZiBhIHJvdyB0byBhY2NvbW1vZGF0ZSB0aGUgbGFyZ2VzdCBmb250IHNpemUgaW4gdGhlIHJvdy4gWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaGVpZ2h0IG9mIGEgcm93IHVzaW5nIHRoZSBzZXRfcm93KCkgd29ya3NoZWV0IG1ldGhvZC4KKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfc2l6ZSgzMCk7CisKKworCisKKworPWhlYWQyIHNldF9jb2xvcigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIEV4Y2VscyBkZWZhdWx0IGNvbG9yLCB1c3VhbGx5IGJsYWNrCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgdGhlIGRlZmF1bHQgY29sb3IKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIEludGVnZXJzIGZyb20gOC4uNjMgb3IgdGhlIGZvbGxvd2luZyBzdHJpbmdzOgorICAgICAgICAgICAgICAgICAgICAgICAgJ2JsYWNrJworICAgICAgICAgICAgICAgICAgICAgICAgJ2JsdWUnCisgICAgICAgICAgICAgICAgICAgICAgICAnYnJvd24nCisgICAgICAgICAgICAgICAgICAgICAgICAnY3lhbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdncmF5JworICAgICAgICAgICAgICAgICAgICAgICAgJ2dyZWVuJworICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbWUnCisgICAgICAgICAgICAgICAgICAgICAgICAnbWFnZW50YScKKyAgICAgICAgICAgICAgICAgICAgICAgICduYXZ5JworICAgICAgICAgICAgICAgICAgICAgICAgJ29yYW5nZScKKyAgICAgICAgICAgICAgICAgICAgICAgICdwaW5rJworICAgICAgICAgICAgICAgICAgICAgICAgJ3B1cnBsZScKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZWQnCisgICAgICAgICAgICAgICAgICAgICAgICAnc2lsdmVyJworICAgICAgICAgICAgICAgICAgICAgICAgJ3doaXRlJworICAgICAgICAgICAgICAgICAgICAgICAgJ3llbGxvdycKKworU2V0IHRoZSBmb250IGNvbG91ci4gVGhlIEM8c2V0X2NvbG9yKCk+IG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnd2hlZWxiYXJyb3cnLCAkZm9ybWF0KTsKKworTm90ZTogVGhlIEM8c2V0X2NvbG9yKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgY29sb3VyIG9mIHRoZSBmb250IGluIGEgY2VsbC4gVG8gc2V0IHRoZSBjb2xvdXIgb2YgYSBjZWxsIHVzZSB0aGUgQzxzZXRfYmdfY29sb3IoKT4gYW5kIEM8c2V0X3BhdHRlcm4oKT4gbWV0aG9kcy4KKworRm9yIGFkZGl0aW9uYWwgZXhhbXBsZXMgc2VlIHRoZSAnTmFtZWQgY29sb3JzJyBhbmQgJ1N0YW5kYXJkIGNvbG9ycycgd29ya3NoZWV0cyBjcmVhdGVkIGJ5IGZvcm1hdHMucGwgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KKworU2VlIGFsc28gTDxDT0xPVVJTIElOIEVYQ0VMPi4KKworCisKKworPWhlYWQyIHNldF9ib2xkKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgYm9sZCBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gYm9sZCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMSBbMV0KKworU2V0IHRoZSBib2xkIHByb3BlcnR5IG9mIHRoZSBmb250OgorCisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsgICMgVHVybiBib2xkIG9uCisKK1sxXSBBY3R1YWxseSwgdmFsdWVzIGluIHRoZSByYW5nZSAxMDAuLjEwMDAgYXJlIGFsc28gdmFsaWQuIDQwMCBpcyBub3JtYWwsIDcwMCBpcyBib2xkIGFuZCAxMDAwIGlzIHZlcnkgYm9sZCBpbmRlZWQuIEl0IGlzIHByb2JhYmx5IGJlc3QgdG8gc2V0IHRoZSB2YWx1ZSB0byAxIGFuZCB1c2Ugbm9ybWFsIGJvbGQuCisKKworCisKKz1oZWFkMiBzZXRfaXRhbGljKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgSXRhbGljIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBpdGFsaWMgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAsIDEKKworU2V0IHRoZSBpdGFsaWMgcHJvcGVydHkgb2YgdGhlIGZvbnQ6CisKKyAgICAkZm9ybWF0LT5zZXRfaXRhbGljKCk7ICAjIFR1cm4gaXRhbGljIG9uCisKKworCisKKz1oZWFkMiBzZXRfdW5kZXJsaW5lKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgVW5kZXJsaW5lIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBvbiBzaW5nbGUgdW5kZXJsaW5lCisgICAgVmFsaWQgYXJnczogICAgICAgICAwICA9IE5vIHVuZGVybGluZQorICAgICAgICAgICAgICAgICAgICAgICAgMSAgPSBTaW5nbGUgdW5kZXJsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAyICA9IERvdWJsZSB1bmRlcmxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIDMzID0gU2luZ2xlIGFjY291bnRpbmcgdW5kZXJsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAzNCA9IERvdWJsZSBhY2NvdW50aW5nIHVuZGVybGluZQorCitTZXQgdGhlIHVuZGVybGluZSBwcm9wZXJ0eSBvZiB0aGUgZm9udC4KKworICAgICRmb3JtYXQtPnNldF91bmRlcmxpbmUoKTsgICAjIFNpbmdsZSB1bmRlcmxpbmUKKworCisKKworPWhlYWQyIHNldF9mb250X3N0cmlrZW91dCgpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIFN0cmlrZW91dCBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gc3RyaWtlb3V0IG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAwLCAxCisKK1NldCB0aGUgc3RyaWtlb3V0IHByb3BlcnR5IG9mIHRoZSBmb250LgorCisKKworCis9aGVhZDIgc2V0X2ZvbnRfc2NyaXB0KCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgU3VwZXIvU3Vic2NyaXB0IGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBTdXBlcnNjcmlwdCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCAgPSBOb3JtYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEgID0gU3VwZXJzY3JpcHQKKyAgICAgICAgICAgICAgICAgICAgICAgIDIgID0gU3Vic2NyaXB0CisKK1NldCB0aGUgc3VwZXJzY3JpcHQvc3Vic2NyaXB0IHByb3BlcnR5IG9mIHRoZSBmb250LiBUaGlzIGZvcm1hdCBpcyBjdXJyZW50bHkgbm90IHZlcnkgdXNlZnVsLgorCisKKworCis9aGVhZDIgc2V0X2ZvbnRfb3V0bGluZSgpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIE91dGxpbmUgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIG91dGxpbmUgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAsIDEKKworTWFjaW50b3NoIG9ubHkuCisKKworCisKKz1oZWFkMiBzZXRfZm9udF9zaGFkb3coKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBTaGFkb3cgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIHNoYWRvdyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitNYWNpbnRvc2ggb25seS4KKworCisKKworPWhlYWQyIHNldF9udW1fZm9ybWF0KCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgR2VuZXJhbCBmb3JtYXQKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIEZvcm1hdCBpbmRleCAxCisgICAgVmFsaWQgYXJnczogICAgICAgICBTZWUgdGhlIGZvbGxvd2luZyB0YWJsZQorCitUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbnVtZXJpY2FsIGZvcm1hdCBvZiBhIG51bWJlciBpbiBFeGNlbC4gSXQgY29udHJvbHMgd2hldGhlciBhIG51bWJlciBpcyBkaXNwbGF5ZWQgYXMgYW4gaW50ZWdlciwgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGEgZGF0ZSwgYSBjdXJyZW5jeSB2YWx1ZSBvciBzb21lIG90aGVyIHVzZXIgZGVmaW5lZCBmb3JtYXQuCisKK1RoZSBudW1lcmljYWwgZm9ybWF0IG9mIGEgY2VsbCBjYW4gYmUgc3BlY2lmaWVkIGJ5IHVzaW5nIGEgZm9ybWF0IHN0cmluZyBvciBhbiBpbmRleCB0byBvbmUgb2YgRXhjZWwncyBidWlsdC1pbiBmb3JtYXRzOgorCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQxLT5zZXRfbnVtX2Zvcm1hdCgnZCBtbW0geXl5eScpOyAjIEZvcm1hdCBzdHJpbmcKKyAgICAkZm9ybWF0Mi0+c2V0X251bV9mb3JtYXQoMHgwZik7ICAgICAgICAgIyBGb3JtYXQgaW5kZXgKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDEpOyAgICAgICMgMSBKYW4gMjAwMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDIpOyAgICAgICMgMS1KYW4tMDEKKworCitVc2luZyBmb3JtYXQgc3RyaW5ncyB5b3UgY2FuIGRlZmluZSB2ZXJ5IHNvcGhpc3RpY2F0ZWQgZm9ybWF0dGluZyBvZiBudW1iZXJzLgorCisgICAgJGZvcm1hdDAxLT5zZXRfbnVtX2Zvcm1hdCgnMC4wMDAnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAgMCwgMy4xNDE1OTI2LCAkZm9ybWF0MDEpOyAgICAjIDMuMTQyCisKKyAgICAkZm9ybWF0MDItPnNldF9udW1fZm9ybWF0KCcjLCMjMCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsICAwLCAxMjM0LjU2LCAgICRmb3JtYXQwMik7ICAgICMgMSwyMzUKKworICAgICRmb3JtYXQwMy0+c2V0X251bV9mb3JtYXQoJyMsIyMwLjAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgIDAsIDEyMzQuNTYsICAgJGZvcm1hdDAzKTsgICAgIyAxLDIzNC41NgorCisgICAgJGZvcm1hdDA0LT5zZXRfbnVtX2Zvcm1hdCgnJDAuMDAnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAgMCwgNDkuOTksICAgICAkZm9ybWF0MDQpOyAgICAjICQ0OS45OQorCisgICAgIyBOb3RlIHlvdSBjYW4gdXNlIG90aGVyIGN1cnJlbmN5IHN5bWJvbHMgc3VjaCBhcyB0aGUgcG91bmQgb3IgeWVuIGFzIHdlbGwuCisgICAgIyBPdGhlciBjdXJyZW5jaWVzIG1heSByZXF1aXJlIHRoZSB1c2Ugb2YgVW5pY29kZS4KKworICAgICRmb3JtYXQwNy0+c2V0X251bV9mb3JtYXQoJ21tL2RkL3l5Jyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDA3KTsgICAgIyAwMS8wMS8wMQorCisgICAgJGZvcm1hdDA4LT5zZXRfbnVtX2Zvcm1hdCgnbW1tIGQgeXl5eScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAwLCAzNjg5Mi41MjEsICRmb3JtYXQwOCk7ICAgICMgSmFuIDEgMjAwMQorCisgICAgJGZvcm1hdDA5LT5zZXRfbnVtX2Zvcm1hdCgnZCBtbW1tIHl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAgMCwgMzY4OTIuNTIxLCAkZm9ybWF0MDkpOyAgICAjIDEgSmFudWFyeSAyMDAxCisKKyAgICAkZm9ybWF0MTAtPnNldF9udW1fZm9ybWF0KCdkZC9tbS95eXl5IGhoOm1tIEFNL1BNJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsIDM2ODkyLjUyMSwgJGZvcm1hdDEwKTsgICAgIyAwMS8wMS8yMDAxIDEyOjMwIEFNCisKKyAgICAkZm9ybWF0MTEtPnNldF9udW1fZm9ybWF0KCcwICJkb2xsYXIgYW5kIiAuMDAgImNlbnRzIicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAxLjg3LCAgICAgICRmb3JtYXQxMSk7ICAgICMgMSBkb2xsYXIgYW5kIC44NyBjZW50cworCisgICAgIyBDb25kaXRpb25hbCBmb3JtYXR0aW5nCisgICAgJGZvcm1hdDEyLT5zZXRfbnVtX2Zvcm1hdCgnW0dyZWVuXUdlbmVyYWw7W1JlZF0tR2VuZXJhbDtHZW5lcmFsJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTEsIDAsIDEyMywgICAgICAgJGZvcm1hdDEyKTsgICAgIyA+IDAgR3JlZW4KKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMiwgMCwgLTQ1LCAgICAgICAkZm9ybWF0MTIpOyAgICAjIDwgMCBSZWQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMywgMCwgMCwgICAgICAgICAkZm9ybWF0MTIpOyAgICAjID0gMCBEZWZhdWx0IGNvbG91cgorCisgICAgIyBaaXAgY29kZQorICAgICRmb3JtYXQxMy0+c2V0X251bV9mb3JtYXQoJzAwMDAwJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTQsIDAsICcwMTIwOScsICAgJGZvcm1hdDEzKTsKKworCitUaGUgbnVtYmVyIHN5c3RlbSB1c2VkIGZvciBkYXRlcyBpcyBkZXNjcmliZWQgaW4gTDxEQVRFUyBBTkQgVElNRSBJTiBFWENFTD4uCisKK1RoZSBjb2xvdXIgZm9ybWF0IHNob3VsZCBoYXZlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgIFtCbGFja10gW0JsdWVdIFtDeWFuXSBbR3JlZW5dIFtNYWdlbnRhXSBbUmVkXSBbV2hpdGVdIFtZZWxsb3ddCisKK0FsdGVybmF0aXZlbHkgeW91IGNhbiBzcGVjaWZ5IHRoZSBjb2xvdXIgYmFzZWQgb24gYSBjb2xvdXIgaW5kZXggYXMgZm9sbG93czogQzxbQ29sb3Igbl0+LCB3aGVyZSBuIGlzIGEgc3RhbmRhcmQgRXhjZWwgY29sb3VyIGluZGV4IC0gNy4gU2VlIHRoZSAnU3RhbmRhcmQgY29sb3JzJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvbiBmb3JtYXR0aW5nIGluIHRoZSBDPGRvY3M+IGRpcmVjdG9yeSBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZGlzdHJvLCB0aGUgRXhjZWwgb24tbGluZSBoZWxwIG9yIEw8aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2VuLWdiL2Fzc2lzdGFuY2UvSFAwNTE5OTUwMDEwMzMuYXNweD4uCisKK1lvdSBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBzdHJpbmcgaXMgdmFsaWQgaW4gRXhjZWwgcHJpb3IgdG8gdXNpbmcgaXQgaW4gV3JpdGVFeGNlbC4KKworRXhjZWwncyBidWlsdC1pbiBmb3JtYXRzIGFyZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCisgICAgSW5kZXggICBJbmRleCAgIEZvcm1hdCBTdHJpbmcKKyAgICAwICAgICAgIDB4MDAgICAgR2VuZXJhbAorICAgIDEgICAgICAgMHgwMSAgICAwCisgICAgMiAgICAgICAweDAyICAgIDAuMDAKKyAgICAzICAgICAgIDB4MDMgICAgIywjIzAKKyAgICA0ICAgICAgIDB4MDQgICAgIywjIzAuMDAKKyAgICA1ICAgICAgIDB4MDUgICAgKCQjLCMjMF8pOygkIywjIzApCisgICAgNiAgICAgICAweDA2ICAgICgkIywjIzBfKTtbUmVkXSgkIywjIzApCisgICAgNyAgICAgICAweDA3ICAgICgkIywjIzAuMDBfKTsoJCMsIyMwLjAwKQorICAgIDggICAgICAgMHgwOCAgICAoJCMsIyMwLjAwXyk7W1JlZF0oJCMsIyMwLjAwKQorICAgIDkgICAgICAgMHgwOSAgICAwJQorICAgIDEwICAgICAgMHgwYSAgICAwLjAwJQorICAgIDExICAgICAgMHgwYiAgICAwLjAwRSswMAorICAgIDEyICAgICAgMHgwYyAgICAjID8vPworICAgIDEzICAgICAgMHgwZCAgICAjID8/Lz8/CisgICAgMTQgICAgICAweDBlICAgIG0vZC95eQorICAgIDE1ICAgICAgMHgwZiAgICBkLW1tbS15eQorICAgIDE2ICAgICAgMHgxMCAgICBkLW1tbQorICAgIDE3ICAgICAgMHgxMSAgICBtbW0teXkKKyAgICAxOCAgICAgIDB4MTIgICAgaDptbSBBTS9QTQorICAgIDE5ICAgICAgMHgxMyAgICBoOm1tOnNzIEFNL1BNCisgICAgMjAgICAgICAweDE0ICAgIGg6bW0KKyAgICAyMSAgICAgIDB4MTUgICAgaDptbTpzcworICAgIDIyICAgICAgMHgxNiAgICBtL2QveXkgaDptbQorICAgIC4uICAgICAgLi4uLiAgICAuLi4uLi4uLi4uLgorICAgIDM3ICAgICAgMHgyNSAgICAoIywjIzBfKTsoIywjIzApCisgICAgMzggICAgICAweDI2ICAgICgjLCMjMF8pO1tSZWRdKCMsIyMwKQorICAgIDM5ICAgICAgMHgyNyAgICAoIywjIzAuMDBfKTsoIywjIzAuMDApCisgICAgNDAgICAgICAweDI4ICAgICgjLCMjMC4wMF8pO1tSZWRdKCMsIyMwLjAwKQorICAgIDQxICAgICAgMHgyOSAgICBfKCogIywjIzBfKTtfKCogKCMsIyMwKTtfKCogIi0iXyk7XyhAXykKKyAgICA0MiAgICAgIDB4MmEgICAgXygkKiAjLCMjMF8pO18oJCogKCMsIyMwKTtfKCQqICItIl8pO18oQF8pCisgICAgNDMgICAgICAweDJiICAgIF8oKiAjLCMjMC4wMF8pO18oKiAoIywjIzAuMDApO18oKiAiLSI/P18pO18oQF8pCisgICAgNDQgICAgICAweDJjICAgIF8oJCogIywjIzAuMDBfKTtfKCQqICgjLCMjMC4wMCk7XygkKiAiLSI/P18pO18oQF8pCisgICAgNDUgICAgICAweDJkICAgIG1tOnNzCisgICAgNDYgICAgICAweDJlICAgIFtoXTptbTpzcworICAgIDQ3ICAgICAgMHgyZiAgICBtbTpzcy4wCisgICAgNDggICAgICAweDMwICAgICMjMC4wRSswCisgICAgNDkgICAgICAweDMxICAgIEAKKworCitGb3IgZXhhbXBsZXMgb2YgdGhlc2UgZm9ybWF0dGluZyBjb2RlcyBzZWUgdGhlICdOdW1lcmljYWwgZm9ybWF0cycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4gU2VlIGFsc28gdGhlIG51bWJlcl9mb3JtYXRzMS5odG1sIGFuZCB0aGUgbnVtYmVyX2Zvcm1hdHMyLmh0bWwgZG9jdW1lbnRzIGluIHRoZSBDPGRvY3M+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitOb3RlIDEuIE51bWVyaWMgZm9ybWF0cyAyMyB0byAzNiBhcmUgbm90IGRvY3VtZW50ZWQgYnkgTWljcm9zb2Z0IGFuZCBtYXkgZGlmZmVyIGluIGludGVybmF0aW9uYWwgdmVyc2lvbnMuCisKK05vdGUgMi4gSW4gRXhjZWwgNSB0aGUgZG9sbGFyIHNpZ24gYXBwZWFycyBhcyBhIGRvbGxhciBzaWduLiBJbiBFeGNlbCA5Ny0yMDAwIGl0IGFwcGVhcnMgYXMgdGhlIGRlZmluZWQgbG9jYWwgY3VycmVuY3kgc3ltYm9sLgorCitOb3RlIDMuIFRoZSByZWQgbmVnYXRpdmUgbnVtZXJpYyBmb3JtYXRzIGRpc3BsYXkgc2xpZ2h0bHkgZGlmZmVyZW50bHkgaW4gRXhjZWwgNSBhbmQgRXhjZWwgOTctMjAwMC4KKworCisKKworPWhlYWQyIHNldF9sb2NrZWQoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBDZWxsIGxvY2tpbmcgaXMgb24KKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gbG9ja2luZyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIHByZXZlbnQgbW9kaWZpY2F0aW9uIG9mIGEgY2VsbHMgY29udGVudHMuIEZvbGxvd2luZyBFeGNlbCdzIGNvbnZlbnRpb24sIGNlbGwgbG9ja2luZyBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4gSG93ZXZlciwgaXQgb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gcHJvdGVjdGVkLCBzZWUgdGhlIHdvcmtzaGVldCBDPHByb3RlY3QoKT4gbWV0aG9kLgorCisgICAgbXkgJGxvY2tlZCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbG9ja2VkLT5zZXRfbG9ja2VkKDEpOyAjIEEgbm9uLW9wCisKKyAgICBteSAkdW5sb2NrZWQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbG9ja2VkLT5zZXRfbG9ja2VkKDApOworCisgICAgIyBFbmFibGUgd29ya3NoZWV0IHByb3RlY3Rpb24KKyAgICAkd29ya3NoZWV0LT5wcm90ZWN0KCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW5ub3QgYmUgZWRpdGVkLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJywgJGxvY2tlZCk7CisKKyAgICAjIFRoaXMgY2VsbCBjYW4gYmUgZWRpdGVkLgorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICc9MSsyJywgJHVubG9ja2VkKTsKKworTm90ZTogVGhpcyBvZmZlcnMgd2VhayBwcm90ZWN0aW9uIGV2ZW4gd2l0aCBhIHBhc3N3b3JkLCBzZWUgdGhlIG5vdGUgaW4gcmVsYXRpb24gdG8gdGhlIEM8cHJvdGVjdCgpPiBtZXRob2QuCisKKworCisKKz1oZWFkMiBzZXRfaGlkZGVuKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgRm9ybXVsYSBoaWRpbmcgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIGhpZGluZyBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCitUaGlzIHByb3BlcnR5IGlzIHVzZWQgdG8gaGlkZSBhIGZvcm11bGEgd2hpbGUgc3RpbGwgZGlzcGxheWluZyBpdHMgcmVzdWx0LiBUaGlzIGlzIGdlbmVyYWxseSB1c2VkIHRvIGhpZGUgY29tcGxleCBjYWxjdWxhdGlvbnMgZnJvbSBlbmQgdXNlcnMgd2hvIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIHJlc3VsdC4gSXQgb25seSBoYXMgYW4gZWZmZWN0IGlmIHRoZSB3b3Jrc2hlZXQgaGFzIGJlZW4gcHJvdGVjdGVkLCBzZWUgdGhlIHdvcmtzaGVldCBDPHByb3RlY3QoKT4gbWV0aG9kLgorCisgICAgbXkgJGhpZGRlbiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoaWRkZW4tPnNldF9oaWRkZW4oKTsKKworICAgICMgRW5hYmxlIHdvcmtzaGVldCBwcm90ZWN0aW9uCisgICAgJHdvcmtzaGVldC0+cHJvdGVjdCgpOworCisgICAgIyBUaGUgZm9ybXVsYSBpbiB0aGlzIGNlbGwgaXNuJ3QgdmlzaWJsZQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICc9MSsyJywgJGhpZGRlbik7CisKKworTm90ZTogVGhpcyBvZmZlcnMgd2VhayBwcm90ZWN0aW9uIGV2ZW4gd2l0aCBhIHBhc3N3b3JkLCBzZWUgdGhlIG5vdGUgaW4gcmVsYXRpb24gdG8gdGhlIEM8cHJvdGVjdCgpPiBtZXRob2QuCisKKworCisKKz1oZWFkMiBzZXRfYWxpZ24oKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBBbGlnbm1lbnQgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBMZWZ0IGFsaWdubWVudAorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgJ2xlZnQnICAgICAgICAgICAgICBIb3Jpem9udGFsCisgICAgICAgICAgICAgICAgICAgICAgICAnY2VudGVyJworICAgICAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0JworICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbGwnCisgICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeScKKyAgICAgICAgICAgICAgICAgICAgICAgICdjZW50ZXJfYWNyb3NzJworCisgICAgICAgICAgICAgICAgICAgICAgICAndG9wJyAgICAgICAgICAgICAgIFZlcnRpY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAndmNlbnRlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICdib3R0b20nCisgICAgICAgICAgICAgICAgICAgICAgICAndmp1c3RpZnknCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCB0ZXh0IGFsaWdubWVudCB3aXRoaW4gYSBjZWxsLiBWZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBhbGlnbm1lbnRzIGNhbiBiZSBjb21iaW5lZC4gVGhlIG1ldGhvZCBpcyB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDAsIDMwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnWCcsICRmb3JtYXQpOworCitUZXh0IGNhbiBiZSBhbGlnbmVkIGFjcm9zcyB0d28gb3IgbW9yZSBhZGphY2VudCBjZWxscyB1c2luZyB0aGUgQzxjZW50ZXJfYWNyb3NzPiBwcm9wZXJ0eS4gSG93ZXZlciwgZm9yIGdlbnVpbmUgbWVyZ2VkIGNlbGxzIGl0IGlzIGJldHRlciB0byB1c2UgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gd29ya3NoZWV0IG1ldGhvZC4KKworVGhlIEM8dmp1c3RpZnk+ICh2ZXJ0aWNhbCBqdXN0aWZ5KSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRvbWF0aWMgdGV4dCB3cmFwcGluZyBpbiBhIGNlbGwuIFRoZSBoZWlnaHQgb2YgdGhlIGNlbGwgd2lsbCBiZSBhZGp1c3RlZCB0byBhY2NvbW1vZGF0ZSB0aGUgd3JhcHBlZCB0ZXh0LiBUbyBzcGVjaWZ5IHdoZXJlIHRoZSB0ZXh0IHdyYXBzIHVzZSB0aGUgQzxzZXRfdGV4dF93cmFwKCk+IG1ldGhvZC4KKworCitGb3IgZnVydGhlciBleGFtcGxlcyBzZWUgdGhlICdBbGlnbm1lbnQnIHdvcmtzaGVldCBjcmVhdGVkIGJ5IGZvcm1hdHMucGwuCisKKworCisKKz1oZWFkMiBzZXRfY2VudGVyX2Fjcm9zcygpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIENlbnRlciBhY3Jvc3Mgc2VsZWN0aW9uIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgVHVybiBjZW50ZXIgYWNyb3NzIG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAxCisKK1RleHQgY2FuIGJlIGFsaWduZWQgYWNyb3NzIHR3byBvciBtb3JlIGFkamFjZW50IGNlbGxzIHVzaW5nIHRoZSBDPHNldF9jZW50ZXJfYWNyb3NzKCk+IG1ldGhvZC4gVGhpcyBpcyBhbiBhbGlhcyBmb3IgdGhlIEM8c2V0X2FsaWduKCdjZW50ZXJfYWNyb3NzJyk+IG1ldGhvZCBjYWxsLgorCitPbmx5IG9uZSBjZWxsIHNob3VsZCBjb250YWluIHRoZSB0ZXh0LCB0aGUgb3RoZXIgY2VsbHMgc2hvdWxkIGJlIGJsYW5rOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9jZW50ZXJfYWNyb3NzKCk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAnQ2VudGVyIGFjcm9zcyBzZWxlY3Rpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygxLCAyLCAkZm9ybWF0KTsKKworU2VlIGFsc28gdGhlIEM8bWVyZ2UxLnBsPiB0byBDPG1lcmdlNi5wbD4gcHJvZ3JhbXMgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBhbmQgdGhlIEM8bWVyZ2VfcmFuZ2UoKT4gbWV0aG9kLgorCisKKworPWhlYWQyIHNldF90ZXh0X3dyYXAoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IHdyYXAgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIHRleHQgd3JhcCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCisKK0hlcmUgaXMgYW4gZXhhbXBsZSB1c2luZyB0aGUgdGV4dCB3cmFwIHByb3BlcnR5LCB0aGUgZXNjYXBlIGNoYXJhY3RlciBDPFxuPiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgbGluZToKKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfdGV4dF93cmFwKCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkl0J3NcbmEgYnVtXG53cmFwIiwgJGZvcm1hdCk7CisKK0V4Y2VsIHdpbGwgYWRqdXN0IHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byBhY2NvbW1vZGF0ZSB0aGUgd3JhcHBlZCB0ZXh0LiBBIHNpbWlsYXIgZWZmZWN0IGNhbiBiZSBvYnRhaW5lZCB3aXRob3V0IG5ld2xpbmVzIHVzaW5nIHRoZSBDPHNldF9hbGlnbigndmp1c3RpZnknKT4gbWV0aG9kLiBTZWUgdGhlIEM8dGV4dHdyYXAucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeS4KKworCisKKworPWhlYWQyIHNldF9yb3RhdGlvbigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIFRleHQgcm90YXRpb24gaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBOb25lCisgICAgVmFsaWQgYXJnczogICAgICAgICBJbnRlZ2VycyBpbiB0aGUgcmFuZ2UgLTkwIHRvIDkwIGFuZCAyNzAKKworU2V0IHRoZSByb3RhdGlvbiBvZiB0aGUgdGV4dCBpbiBhIGNlbGwuIFRoZSByb3RhdGlvbiBjYW4gYmUgYW55IGFuZ2xlIGluIHRoZSByYW5nZSAtOTAgdG8gOTAgZGVncmVlcy4KKworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfcm90YXRpb24oMzApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdUaGlzIHRleHQgaXMgcm90YXRlZCcsICRmb3JtYXQpOworCisKK1RoZSBhbmdsZSAyNzAgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgaW5kaWNhdGVzIHRleHQgd2hlcmUgdGhlIGxldHRlcnMgcnVuIGZyb20gdG9wIHRvIGJvdHRvbS4KKworCisKKz1oZWFkMiBzZXRfaW5kZW50KCkKKworCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IGluZGVudGF0aW9uIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgSW5kZW50IHRleHQgMSBsZXZlbAorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgUG9zaXRpdmUgaW50ZWdlcnMKKworCitUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBpbmRlbnQgdGV4dC4gVGhlIGFyZ3VtZW50LCB3aGljaCBzaG91bGQgYmUgYW4gaW50ZWdlciwgaXMgdGFrZW4gYXMgdGhlIGxldmVsIG9mIGluZGVudGF0aW9uOgorCisKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2luZGVudCgyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnVGhpcyB0ZXh0IGlzIGluZGVudGVkJywgJGZvcm1hdCk7CisKKworSW5kZW50YXRpb24gaXMgYSBob3Jpem9udGFsIGFsaWdubWVudCBwcm9wZXJ0eS4gSXQgd2lsbCBvdmVycmlkZSBhbnkgb3RoZXIgaG9yaXpvbnRhbCBwcm9wZXJ0aWVzIGJ1dCBpdCBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHZlcnRpY2FsIHByb3BlcnRpZXMuCisKKworCisKKz1oZWFkMiBzZXRfc2hyaW5rKCkKKworCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBUZXh0IHNocmlua2luZyBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFR1cm4gInNocmluayB0byBmaXQiIG9uCisgICAgVmFsaWQgYXJnczogICAgICAgICAxCisKKworVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2hyaW5rIHRleHQgc28gdGhhdCBpdCBmaXRzIGluIGEgY2VsbC4KKworCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9zaHJpbmsoKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnSG9uZXksIEkgc2hydW5rIHRoZSB0ZXh0IScsICRmb3JtYXQpOworCisKKworCis9aGVhZDIgc2V0X3RleHRfanVzdGxhc3QoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBKdXN0aWZ5IGxhc3QgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBUdXJuIGp1c3RpZnkgbGFzdCBvbgorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMCwgMQorCisKK09ubHkgYXBwbGllcyB0byBGYXIgRWFzdGVybiB2ZXJzaW9ucyBvZiBFeGNlbC4KKworCisKKworPWhlYWQyIHNldF9wYXR0ZXJuKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgUGF0dGVybiBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFNvbGlkIGZpbGwgaXMgb24KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIDAgLi4gMTgKKworU2V0IHRoZSBiYWNrZ3JvdW5kIHBhdHRlcm4gb2YgYSBjZWxsLgorCitFeGFtcGxlcyBvZiB0aGUgYXZhaWxhYmxlIHBhdHRlcm5zIGFyZSBzaG93biBpbiB0aGUgJ1BhdHRlcm5zJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLiBIb3dldmVyLCBpdCBpcyB1bmxpa2VseSB0aGF0IHlvdSB3aWxsIGV2ZXIgbmVlZCBhbnl0aGluZyBvdGhlciB0aGFuIFBhdHRlcm4gMSB3aGljaCBpcyBhIHNvbGlkIGZpbGwgb2YgdGhlIGJhY2tncm91bmQgY29sb3IuCisKKworCisKKz1oZWFkMiBzZXRfYmdfY29sb3IoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBDb2xvciBpcyBvZmYKKyAgICBEZWZhdWx0IGFjdGlvbjogICAgIFNvbGlkIGZpbGwuCisgICAgVmFsaWQgYXJnczogICAgICAgICBTZWUgc2V0X2NvbG9yKCkKKworVGhlIEM8c2V0X2JnX2NvbG9yKCk+IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGJhY2tncm91bmQgY29sb3VyIG9mIGEgcGF0dGVybi4gUGF0dGVybnMgYXJlIGRlZmluZWQgdmlhIHRoZSBDPHNldF9wYXR0ZXJuKCk+IG1ldGhvZC4gSWYgYSBwYXR0ZXJuIGhhc24ndCBiZWVuIGRlZmluZWQgdGhlbiBhIHNvbGlkIGZpbGwgcGF0dGVybiBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0LgorCitIZXJlIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIHNldCB1cCBhIHNvbGlkIGZpbGwgaW4gYSBjZWxsOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworCisgICAgJGZvcm1hdC0+c2V0X3BhdHRlcm4oKTsgIyBUaGlzIGlzIG9wdGlvbmFsIHdoZW4gdXNpbmcgYSBzb2xpZCBmaWxsCisKKyAgICAkZm9ybWF0LT5zZXRfYmdfY29sb3IoJ2dyZWVuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ1JheScsICRmb3JtYXQpOworCitGb3IgZnVydGhlciBleGFtcGxlcyBzZWUgdGhlICdQYXR0ZXJucycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworPWhlYWQyIHNldF9mZ19jb2xvcigpCisKKyAgICBEZWZhdWx0IHN0YXRlOiAgICAgIENvbG9yIGlzIG9mZgorICAgIERlZmF1bHQgYWN0aW9uOiAgICAgU29saWQgZmlsbC4KKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIFNlZSBzZXRfY29sb3IoKQorCisKK1RoZSBDPHNldF9mZ19jb2xvcigpPiBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG91ciBvZiBhIHBhdHRlcm4uCisKK0ZvciBmdXJ0aGVyIGV4YW1wbGVzIHNlZSB0aGUgJ1BhdHRlcm5zJyB3b3Jrc2hlZXQgY3JlYXRlZCBieSBmb3JtYXRzLnBsLgorCisKKworCis9aGVhZDIgc2V0X2JvcmRlcigpCisKKyAgICBBbHNvIGFwcGxpZXMgdG86ICAgIHNldF9ib3R0b20oKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3RvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbGVmdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfcmlnaHQoKQorCisgICAgRGVmYXVsdCBzdGF0ZTogICAgICBCb3JkZXIgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBTZXQgYm9yZGVyIHR5cGUgMQorICAgIFZhbGlkIGFyZ3M6ICAgICAgICAgMC0xMywgU2VlIGJlbG93LgorCitBIGNlbGwgYm9yZGVyIGlzIGNvbXByaXNlZCBvZiBhIGJvcmRlciBvbiB0aGUgYm90dG9tLCB0b3AsIGxlZnQgYW5kIHJpZ2h0LiBUaGVzZSBjYW4gYmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIHVzaW5nIEM8c2V0X2JvcmRlcigpPiBvciBpbmRpdmlkdWFsbHkgdXNpbmcgdGhlIHJlbGV2YW50IG1ldGhvZCBjYWxscyBzaG93biBhYm92ZS4KKworVGhlIGZvbGxvd2luZyBzaG93cyB0aGUgYm9yZGVyIHN0eWxlcyBzb3J0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5kZXggbnVtYmVyOgorCisgICAgSW5kZXggICBOYW1lICAgICAgICAgICAgV2VpZ2h0ICAgU3R5bGUKKyAgICA9PT09PSAgID09PT09PT09PT09PT0gICA9PT09PT0gICA9PT09PT09PT09PQorICAgIDAgICAgICAgTm9uZSAgICAgICAgICAgIDAKKyAgICAxICAgICAgIENvbnRpbnVvdXMgICAgICAxICAgICAgICAtLS0tLS0tLS0tLQorICAgIDIgICAgICAgQ29udGludW91cyAgICAgIDIgICAgICAgIC0tLS0tLS0tLS0tCisgICAgMyAgICAgICBEYXNoICAgICAgICAgICAgMSAgICAgICAgLSAtIC0gLSAtIC0KKyAgICA0ICAgICAgIERvdCAgICAgICAgICAgICAxICAgICAgICAuIC4gLiAuIC4gLgorICAgIDUgICAgICAgQ29udGludW91cyAgICAgIDMgICAgICAgIC0tLS0tLS0tLS0tCisgICAgNiAgICAgICBEb3VibGUgICAgICAgICAgMyAgICAgICAgPT09PT09PT09PT0KKyAgICA3ICAgICAgIENvbnRpbnVvdXMgICAgICAwICAgICAgICAtLS0tLS0tLS0tLQorICAgIDggICAgICAgRGFzaCAgICAgICAgICAgIDIgICAgICAgIC0gLSAtIC0gLSAtCisgICAgOSAgICAgICBEYXNoIERvdCAgICAgICAgMSAgICAgICAgLSAuIC0gLiAtIC4KKyAgICAxMCAgICAgIERhc2ggRG90ICAgICAgICAyICAgICAgICAtIC4gLSAuIC0gLgorICAgIDExICAgICAgRGFzaCBEb3QgRG90ICAgIDEgICAgICAgIC0gLiAuIC0gLiAuCisgICAgMTIgICAgICBEYXNoIERvdCBEb3QgICAgMiAgICAgICAgLSAuIC4gLSAuIC4KKyAgICAxMyAgICAgIFNsYW50RGFzaCBEb3QgICAyICAgICAgICAvIC0gLiAvIC0gLgorCisKK1RoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGJvcmRlcnMgc29ydGVkIGJ5IHN0eWxlOgorCisgICAgTmFtZSAgICAgICAgICAgIFdlaWdodCAgIFN0eWxlICAgICAgICAgSW5kZXgKKyAgICA9PT09PT09PT09PT09ICAgPT09PT09ICAgPT09PT09PT09PT0gICA9PT09PQorICAgIENvbnRpbnVvdXMgICAgICAwICAgICAgICAtLS0tLS0tLS0tLSAgIDcKKyAgICBDb250aW51b3VzICAgICAgMSAgICAgICAgLS0tLS0tLS0tLS0gICAxCisgICAgQ29udGludW91cyAgICAgIDIgICAgICAgIC0tLS0tLS0tLS0tICAgMgorICAgIENvbnRpbnVvdXMgICAgICAzICAgICAgICAtLS0tLS0tLS0tLSAgIDUKKyAgICBEYXNoICAgICAgICAgICAgMSAgICAgICAgLSAtIC0gLSAtIC0gICAzCisgICAgRGFzaCAgICAgICAgICAgIDIgICAgICAgIC0gLSAtIC0gLSAtICAgOAorICAgIERhc2ggRG90ICAgICAgICAxICAgICAgICAtIC4gLSAuIC0gLiAgIDkKKyAgICBEYXNoIERvdCAgICAgICAgMiAgICAgICAgLSAuIC0gLiAtIC4gICAxMAorICAgIERhc2ggRG90IERvdCAgICAxICAgICAgICAtIC4gLiAtIC4gLiAgIDExCisgICAgRGFzaCBEb3QgRG90ICAgIDIgICAgICAgIC0gLiAuIC0gLiAuICAgMTIKKyAgICBEb3QgICAgICAgICAgICAgMSAgICAgICAgLiAuIC4gLiAuIC4gICA0CisgICAgRG91YmxlICAgICAgICAgIDMgICAgICAgID09PT09PT09PT09ICAgNgorICAgIE5vbmUgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICBTbGFudERhc2ggRG90ICAgMiAgICAgICAgLyAtIC4gLyAtIC4gICAxMworCisKK1RoZSBmb2xsb3dpbmcgc2hvd3MgdGhlIGJvcmRlcnMgaW4gdGhlIG9yZGVyIHNob3duIGluIHRoZSBFeGNlbCBEaWFsb2cuCisKKyAgICBJbmRleCAgIFN0eWxlICAgICAgICAgICAgIEluZGV4ICAgU3R5bGUKKyAgICA9PT09PSAgID09PT09ICAgICAgICAgICAgID09PT09ICAgPT09PT0KKyAgICAwICAgICAgIE5vbmUgICAgICAgICAgICAgIDEyICAgICAgLSAuIC4gLSAuIC4KKyAgICA3ICAgICAgIC0tLS0tLS0tLS0tICAgICAgIDEzICAgICAgLyAtIC4gLyAtIC4KKyAgICA0ICAgICAgIC4gLiAuIC4gLiAuICAgICAgIDEwICAgICAgLSAuIC0gLiAtIC4KKyAgICAxMSAgICAgIC0gLiAuIC0gLiAuICAgICAgIDggICAgICAgLSAtIC0gLSAtIC0KKyAgICA5ICAgICAgIC0gLiAtIC4gLSAuICAgICAgIDIgICAgICAgLS0tLS0tLS0tLS0KKyAgICAzICAgICAgIC0gLSAtIC0gLSAtICAgICAgIDUgICAgICAgLS0tLS0tLS0tLS0KKyAgICAxICAgICAgIC0tLS0tLS0tLS0tICAgICAgIDYgICAgICAgPT09PT09PT09PT0KKworCitFeGFtcGxlcyBvZiB0aGUgYXZhaWxhYmxlIGJvcmRlciBzdHlsZXMgYXJlIHNob3duIGluIHRoZSAnQm9yZGVycycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworPWhlYWQyIHNldF9ib3JkZXJfY29sb3IoKQorCisgICAgQWxzbyBhcHBsaWVzIHRvOiAgICBzZXRfYm90dG9tX2NvbG9yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF90b3BfY29sb3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2xlZnRfY29sb3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3JpZ2h0X2NvbG9yKCkKKworICAgIERlZmF1bHQgc3RhdGU6ICAgICAgQ29sb3IgaXMgb2ZmCisgICAgRGVmYXVsdCBhY3Rpb246ICAgICBVbmRlZmluZWQKKyAgICBWYWxpZCBhcmdzOiAgICAgICAgIFNlZSBzZXRfY29sb3IoKQorCisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBjZWxsIGJvcmRlcnMuIEEgY2VsbCBib3JkZXIgaXMgY29tcHJpc2VkIG9mIGEgYm9yZGVyIG9uIHRoZSBib3R0b20sIHRvcCwgbGVmdCBhbmQgcmlnaHQuIFRoZXNlIGNhbiBiZSBzZXQgdG8gdGhlIHNhbWUgY29sb3VyIHVzaW5nIEM8c2V0X2JvcmRlcl9jb2xvcigpPiBvciBpbmRpdmlkdWFsbHkgdXNpbmcgdGhlIHJlbGV2YW50IG1ldGhvZCBjYWxscyBzaG93biBhYm92ZS4gRXhhbXBsZXMgb2YgdGhlIGJvcmRlciBzdHlsZXMgYW5kIGNvbG91cnMgYXJlIHNob3duIGluIHRoZSAnQm9yZGVycycgd29ya3NoZWV0IGNyZWF0ZWQgYnkgZm9ybWF0cy5wbC4KKworCisKKworCis9aGVhZDIgY29weSgkZm9ybWF0KQorCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gY29weSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgZnJvbSBvbmUgRm9ybWF0IG9iamVjdCB0byBhbm90aGVyOgorCisgICAgbXkgJGxvcnJ5MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRsb3JyeTEtPnNldF9ib2xkKCk7CisgICAgJGxvcnJ5MS0+c2V0X2l0YWxpYygpOworICAgICRsb3JyeTEtPnNldF9jb2xvcigncmVkJyk7ICAgICMgbG9ycnkxIGlzIGJvbGQsIGl0YWxpYyBhbmQgcmVkCisKKyAgICBteSAkbG9ycnkyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGxvcnJ5Mi0+Y29weSgkbG9ycnkxKTsKKyAgICAkbG9ycnkyLT5zZXRfY29sb3IoJ3llbGxvdycpOyAjIGxvcnJ5MiBpcyBib2xkLCBpdGFsaWMgYW5kIHllbGxvdworCitUaGUgQzxjb3B5KCk+IG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBpZiB5b3UgYXJlIHVzaW5nIHRoZSBtZXRob2QgaW50ZXJmYWNlIHRvIEZvcm1hdCBwcm9wZXJ0aWVzLiBJdCBnZW5lcmFsbHkgaXNuJ3QgcmVxdWlyZWQgaWYgeW91IGFyZSBzZXR0aW5nIEZvcm1hdCBwcm9wZXJ0aWVzIGRpcmVjdGx5IHVzaW5nIGhhc2hlcy4KKworCitOb3RlOiB0aGlzIGlzIG5vdCBhIGNvcHkgY29uc3RydWN0b3IsIGJvdGggb2JqZWN0cyBtdXN0IGV4aXN0IHByaW9yIHRvIGNvcHlpbmcuCisKKworCisKKz1oZWFkMSBVTklDT0RFIElOIEVYQ0VMCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gaGFuZGxpbmcgVW5pY29kZSBpbiBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4KKworSTxGb3IgYSBtb3JlIGdlbmVyYWwgaW50cm9kdWN0aW9uIHRvIFVuaWNvZGUgaGFuZGxpbmcgaW4gUGVybCBzZWU+IEw8cGVybHVuaXR1dD4gYW5kIEw8cGVybHVuaWludHJvPi4KKworV2hlbiB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0aGUgYmVzdCBhbmQgZWFzaWVzdCB3YXkgdG8gd3JpdGUgdW5pY29kZSBzdHJpbmdzIHRvIGFuIEV4Y2VsIGZpbGUgaXMgdG8gdXNlIEM8VVRGLTg+IGVuY29kZWQgc3RyaW5ncyBhbmQgcGVybCA1LjggKG9yIGxhdGVyKS4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYWxzbyBhbGxvd3MgeW91IHRvIHdyaXRlIHVuaWNvZGUgc3RyaW5ncyB1c2luZyBvbGRlciBwZXJscyBidXQgaXQgZ2VuZXJhbGx5IHJlcXVpcmVzIG1vcmUgd29yaywgYXMgZXhwbGFpbmVkIGJlbG93LgorCitJbnRlcm5hbGx5LCBFeGNlbCBlbmNvZGVzIHVuaWNvZGUgZGF0YSBhcyBDPFVURi0xNkxFPiAod2hlcmUgTEUgbWVhbnMgbGl0dGxlLWVuZGlhbikuIElmIHlvdSBhcmUgdXNpbmcgcGVybCA1LjgrIHRoZW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgd2lsbCBjb252ZXJ0IEM8VVRGLTg+IHN0cmluZ3MgdG8gQzxVVEYtMTZMRT4gd2hlbiByZXF1aXJlZC4gTm8gZnVydGhlciBpbnRlcnZlbnRpb24gaXMgcmVxdWlyZWQgZnJvbSB0aGUgcHJvZ3JhbW1lciwgZm9yIGV4YW1wbGU6CisKKyAgICAjIHBlcmwgNS44KyBleGFtcGxlOgorICAgIG15ICRzbWlsZXkgPSAiXHh7MjYzQX0iOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0hlbGxvIHdvcmxkJyk7ICMgQVNDSUkKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAkc21pbGV5KTsgICAgICAgIyBVVEYtOAorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbHNvIGxldHMgeW91IHdyaXRlIHVuaWNvZGUgZGF0YSBhcyBDPFVURi0xNj4uIFNpbmNlIHRoZSBtYWpvcml0eSBvZiBDUEFOIG1vZHVsZXMgZGVmYXVsdCB0byBDPFVURi0xNkJFPiAoYmlnLWVuZGlhbikgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYWxzbyB1c2VzIEM8VVRGLTE2QkU+IGFuZCBjb252ZXJ0cyBpdCBpbnRlcm5hbGx5IHRvIEM8VVRGLTE2TEU+OgorCisgICAgIyBwZXJsIDUuMDA1IGV4YW1wbGU6CisgICAgbXkgJHNtaWxleSA9IHBhY2sgJ24nLCAweDI2M0E7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAgICAgICgnQTMnLCAnSGVsbG8gd29ybGQnKTsgIyBBU0NJSQorICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBNCcsICRzbWlsZXkpOyAgICAgICAjIFVURi0xNgorCitBbHRob3VnaCB0aGUgYWJvdmUgZXhhbXBsZXMgbG9vayBzaW1pbGFyIHRoZXJlIGlzIGFuIGltcG9ydGFudCBkaWZmZXJlbmNlLiBXaXRoIEM8dWZ0OD4gYW5kIHBlcmwgNS44KyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0cmVhdHMgQzxVVEYtOD4gc3RyaW5ncyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgc3RyaW5nLiBIb3dldmVyLCB3aXRoIEM8VVRGMTY+IGRhdGEgd2UgbmVlZCB0byBkaXN0aW5ndWlzaCBpdCBmcm9tIG90aGVyIHN0cmluZ3MgZWl0aGVyIGJ5IGNhbGxpbmcgYSBzZXBhcmF0ZSBmdW5jdGlvbiBvciBieSBwYXNzaW5nIGFuIGFkZGl0aW9uYWwgZmxhZyB0byBpbmRpY2F0ZSB0aGUgZGF0YSB0eXBlLgorCitJZiB5b3UgYXJlIGRlYWxpbmcgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyB0aGF0IGFyZW4ndCBpbiBDPFVURi04PiB0aGVuIHBlcmwgNS44KyBwcm92aWRlcyB1c2VmdWwgdG9vbHMgaW4gdGhlIGd1aXNlIG9mIHRoZSBDPEVuY29kZT4gbW9kdWxlIHRvIGhlbHAgeW91IHRvIGNvbnZlcnQgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC4gRm9yIGV4YW1wbGU6CisKKyAgICB1c2UgRW5jb2RlICdkZWNvZGUnOworCisgICAgbXkgJHN0cmluZyA9ICdzb21lIHN0cmluZyB3aXRoIGtvaTgtciBjaGFyYWN0ZXJzJzsKKyAgICAgICAkc3RyaW5nID0gZGVjb2RlKCdrb2k4LXInLCAkc3RyaW5nKTsgIyBrb2k4LXIgdG8gdXRmOAorCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVhZCBkYXRhIGZyb20gYW4gZW5jb2RlZCBmaWxlIGFuZCBjb252ZXJ0IGl0IHRvIEM8VVRGLTg+IGFzIHlvdSByZWFkIGl0IGluOgorCisKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2tvaThyLnR4dCc7CisgICAgb3BlbiBGSCwgJzw6ZW5jb2Rpbmcoa29pOC1yKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworCisgICAgbXkgJHJvdyA9IDA7CisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgIyBEYXRhIHJlYWQgaW4gaXMgbm93IGluIHV0ZjggZm9ybWF0LgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKworVGhlc2UgbWV0aG9kb2xvZ2llcyBhcmUgZXhwbGFpbmVkIGluIG1vcmUgZGV0YWlsIGluIEw8cGVybHVuaXR1dD4sIEw8cGVybHVuaWludHJvPiBhbmQgTDxwZXJsdW5pY29kZT4uCisKK1NlZSBhbHNvIHRoZSBDPHVuaWNvZGVfKi5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgQ09MT1VSUyBJTiBFWENFTAorCitFeGNlbCBwcm92aWRlcyBhIGNvbG91ciBwYWxldHRlIG9mIDU2IGNvbG91cnMuIEluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRoZXNlIGNvbG91cnMgYXJlIGFjY2Vzc2VkIHZpYSB0aGVpciBwYWxldHRlIGluZGV4IGluIHRoZSByYW5nZSA4Li42My4gVGhpcyBpbmRleCBpcyB1c2VkIHRvIHNldCB0aGUgY29sb3VyIG9mIGZvbnRzLCBjZWxsIHBhdHRlcm5zIGFuZCBjZWxsIGJvcmRlcnMuIEZvciBleGFtcGxlOgorCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9PiAxMiwgIyBpbmRleCBmb3IgYmx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgID0+ICdBcmlhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgPT4gMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitUaGUgbW9zdCBjb21tb25seSB1c2VkIGNvbG91cnMgY2FuIGFsc28gYmUgYWNjZXNzZWQgYnkgbmFtZS4gVGhlIG5hbWUgYWN0cyBhcyBhIHNpbXBsZSBhbGlhcyBmb3IgdGhlIGNvbG91ciBpbmRleDoKKworICAgIGJsYWNrICAgICA9PiAgICA4CisgICAgYmx1ZSAgICAgID0+ICAgMTIKKyAgICBicm93biAgICAgPT4gICAxNgorICAgIGN5YW4gICAgICA9PiAgIDE1CisgICAgZ3JheSAgICAgID0+ICAgMjMKKyAgICBncmVlbiAgICAgPT4gICAxNworICAgIGxpbWUgICAgICA9PiAgIDExCisgICAgbWFnZW50YSAgID0+ICAgMTQKKyAgICBuYXZ5ICAgICAgPT4gICAxOAorICAgIG9yYW5nZSAgICA9PiAgIDUzCisgICAgcGluayAgICAgID0+ICAgMzMKKyAgICBwdXJwbGUgICAgPT4gICAyMAorICAgIHJlZCAgICAgICA9PiAgIDEwCisgICAgc2lsdmVyICAgID0+ICAgMjIKKyAgICB3aGl0ZSAgICAgPT4gICAgOQorICAgIHllbGxvdyAgICA9PiAgIDEzCisKK0ZvciBleGFtcGxlOgorCisgICAgbXkgJGZvbnQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ3JlZCcpOworCitVc2VycyBvZiBWQkEgaW4gRXhjZWwgc2hvdWxkIG5vdGUgdGhhdCB0aGUgZXF1aXZhbGVudCBjb2xvdXIgaW5kaWNlcyBhcmUgaW4gdGhlIHJhbmdlIDEuLjU2IGluc3RlYWQgb2YgOC4uNjMuCisKK0lmIHRoZSBkZWZhdWx0IHBhbGV0dGUgZG9lcyBub3QgcHJvdmlkZSBhIHJlcXVpcmVkIGNvbG91ciB5b3UgY2FuIG92ZXJyaWRlIG9uZSBvZiB0aGUgYnVpbHQtaW4gdmFsdWVzLiBUaGlzIGlzIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSBDPHNldF9jdXN0b21fY29sb3IoKT4gd29ya2Jvb2sgbWV0aG9kIHRvIGFkanVzdCB0aGUgUkdCIChyZWQgZ3JlZW4gYmx1ZSkgY29tcG9uZW50cyBvZiB0aGUgY29sb3VyOgorCisgICAgbXkgJGZlcnJhcmkgPSAkd29ya2Jvb2stPnNldF9jdXN0b21fY29sb3IoNDAsIDIxNiwgMTIsIDEyKTsKKworICAgIG15ICRmb3JtYXQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnX2NvbG9yID0+ICRmZXJyYXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoJ0ExJywgJGZvcm1hdCk7CisKK1RoZSBkZWZhdWx0IEV4Y2VsIGNvbG91ciBwYWxldHRlIGlzIHNob3duIGluIEM8cGFsZXR0ZS5odG1sPiBpbiB0aGUgQzxkb2NzPiBkaXJlY3RvcnkgIG9mIHRoZSBkaXN0cm8uIFlvdSBjYW4gZ2VuZXJhdGUgYW4gRXhjZWwgdmVyc2lvbiBvZiB0aGUgcGFsZXR0ZSB1c2luZyBDPGNvbG9ycy5wbD4gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeS4KKworCisKKworPWhlYWQxIERBVEVTIEFORCBUSU1FIElOIEVYQ0VMCisKK1RoZXJlIGFyZSB0d28gaW1wb3J0YW50IHRoaW5ncyB0byB1bmRlcnN0YW5kIGFib3V0IGRhdGVzIGFuZCB0aW1lcyBpbiBFeGNlbDoKKworPW92ZXIgNAorCis9aXRlbSAxIEEgZGF0ZS90aW1lIGluIEV4Y2VsIGlzIGEgcmVhbCBudW1iZXIgcGx1cyBhbiBFeGNlbCBudW1iZXIgZm9ybWF0LgorCis9aXRlbSAyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGRhdGUvdGltZSBzdHJpbmdzIGluIEM8d3JpdGUoKT4gdG8gYW4gRXhjZWwgZGF0ZS90aW1lLgorCis9YmFjaworCitUaGVzZSB0d28gcG9pbnRzIGFyZSBleHBsYWluZWQgaW4gbW9yZSBkZXRhaWwgYmVsb3cgYWxvbmcgd2l0aCBzb21lIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBjb252ZXJ0IHRpbWVzIGFuZCBkYXRlcyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0LgorCisKKz1oZWFkMiBBbiBFeGNlbCBkYXRlL3RpbWUgaXMgYSBudW1iZXIgcGx1cyBhIGZvcm1hdAorCitJZiB5b3Ugd3JpdGUgYSBkYXRlIHN0cmluZyB3aXRoIEM8d3JpdGUoKT4gdGhlbiBhbGwgeW91IHdpbGwgZ2V0IGlzIGEgc3RyaW5nOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzAyLzAzLzA0Jyk7ICMgISEgV3JpdGVzIGEgc3RyaW5nIG5vdCBhIGRhdGUuICEhCisKK0RhdGVzIGFuZCB0aW1lcyBpbiBFeGNlbCBhcmUgcmVwcmVzZW50ZWQgYnkgcmVhbCBudW1iZXJzLCBmb3IgZXhhbXBsZSAiSmFuIDEgMjAwMSAxMjozMCBBTSIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIG51bWJlciAzNjg5Mi41MjEuCisKK1RoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIG51bWJlciBzdG9yZXMgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaCBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydCBzdG9yZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRheS4KKworQSBkYXRlIG9yIHRpbWUgaW4gRXhjZWwgaXMganVzdCBsaWtlIGFueSBvdGhlciBudW1iZXIuIFRvIGhhdmUgdGhlIG51bWJlciBkaXNwbGF5IGFzIGEgZGF0ZSB5b3UgbXVzdCBhcHBseSBhbiBFeGNlbCBudW1iZXIgZm9ybWF0IHRvIGl0LiBIZXJlIGFyZSBzb21lIGV4YW1wbGVzLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdkYXRlX2V4YW1wbGVzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDMwKTsgIyBGb3IgZXh0cmEgdmlzaWJpbGl0eS4KKworICAgIG15ICRudW1iZXIgICAgPSAzOTUwNi41OworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJG51bWJlcik7ICAgICAgICAgICAgIyAgICAgMzk1MDYuNQorCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZGQvbW0veXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAkbnVtYmVyICwgJGZvcm1hdDIpOyAjICAgICAyOC8wMi8wOAorCisgICAgbXkgJGZvcm1hdDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnbW0vZGQveXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAkbnVtYmVyICwgJGZvcm1hdDMpOyAjICAgICAwMi8yOC8wOAorCisgICAgbXkgJGZvcm1hdDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZC1tLXl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAkbnVtYmVyICwgJGZvcm1hdDQpOyAjICAgICAyOC0yLTIwMDgKKworICAgIG15ICRmb3JtYXQ1ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5IGhoOm1tJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E1JywgJG51bWJlciAsICRmb3JtYXQ1KTsgIyAgICAgMjgvMDIvMDggMTI6MDAKKworICAgIG15ICRmb3JtYXQ2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2QgbW1tIHl5eXknKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTYnLCAkbnVtYmVyICwgJGZvcm1hdDYpOyAjICAgICAyOCBGZWIgMjAwOAorCisgICAgbXkgJGZvcm1hdDcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnbW1tIGQgeXl5eSBoaDptbSBBTS9QTScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICRudW1iZXIgLCAkZm9ybWF0Nyk7ICMgICAgIEZlYiAyOCAyMDA4IDEyOjAwIFBNCisKKworPWhlYWQyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGRhdGUvdGltZSBzdHJpbmdzCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvZXNuJ3QgYXV0b21hdGljYWxseSBjb252ZXJ0IGlucHV0IGRhdGUgc3RyaW5ncyBpbnRvIEV4Y2VsJ3MgZm9ybWF0dGVkIGRhdGUgbnVtYmVycyBkdWUgdG8gdGhlIGxhcmdlIG51bWJlciBvZiBwb3NzaWJsZSBkYXRlIGZvcm1hdHMgYW5kIGFsc28gZHVlIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBtaXNpbnRlcnByZXRhdGlvbi4KKworRm9yIGV4YW1wbGUsIGRvZXMgQzwwMi8wMy8wND4gbWVhbiBNYXJjaCAyIDIwMDQsIEZlYnJ1YXJ5IDMgMjAwNCBvciBldmVuIE1hcmNoIDQgMjAwMi4KKworVGhlcmVmb3JlLCBpbiBvcmRlciB0byBoYW5kbGUgZGF0ZXMgeW91IHdpbGwgaGF2ZSB0byBjb252ZXJ0IHRoZW0gdG8gbnVtYmVycyBhbmQgYXBwbHkgYW4gRXhjZWwgZm9ybWF0LiBTb21lIG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgZGF0ZXMgYXJlIGxpc3RlZCBpbiB0aGUgbmV4dCBzZWN0aW9uLgorCitUaGUgbW9zdCBkaXJlY3Qgd2F5IGlzIHRvIGNvbnZlcnQgeW91ciBkYXRlcyB0byB0aGUgSVNPODYwMSBDPHl5eXktbW0tZGRUaGg6bW06c3Muc3NzPiBkYXRlIGZvcm1hdCBhbmQgdXNlIHRoZSBDPHdyaXRlX2RhdGVfdGltZSgpPiB3b3Jrc2hlZXQgbWV0aG9kOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCdBMicsICcyMDAxLTAxLTAxVDEyOjIwJywgJGZvcm1hdCk7CisKK1NlZSB0aGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorCitBIGdlbmVyYWwgbWV0aG9kb2xvZ3kgZm9yIGhhbmRsaW5nIGRhdGUgc3RyaW5ncyB3aXRoIEM8d3JpdGVfZGF0ZV90aW1lKCk+IGlzOgorCisgICAgMS4gSWRlbnRpZnkgaW5jb21pbmcgZGF0ZS90aW1lIHN0cmluZ3Mgd2l0aCBhIHJlZ2V4LgorICAgIDIuIEV4dHJhY3QgdGhlIGNvbXBvbmVudCBwYXJ0cyBvZiB0aGUgZGF0ZS90aW1lIHVzaW5nIHRoZSBzYW1lIHJlZ2V4LgorICAgIDMuIENvbnZlcnQgdGhlIGRhdGUvdGltZSB0byB0aGUgSVNPODYwMSBmb3JtYXQuCisgICAgNC4gV3JpdGUgdGhlIGRhdGUvdGltZSB1c2luZyB3cml0ZV9kYXRlX3RpbWUoKSBhbmQgYSBudW1iZXIgZm9ybWF0LgorCitIZXJlIGlzIGFuIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZXhhbXBsZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICMgU2V0IHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IgZGF0ZXMuCisgICAgbXkgJGRhdGVfZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ21tbSBkIHl5eXknKTsKKworICAgICMgSW5jcmVhc2UgY29sdW1uIHdpZHRoIHRvIGltcHJvdmUgdmlzaWJpbGl0eSBvZiBkYXRhLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QycsIDIwKTsKKworICAgICMgU2ltdWxhdGUgcmVhZGluZyBmcm9tIGEgZGF0YSBzb3VyY2UuCisgICAgbXkgJHJvdyA9IDA7CisKKyAgICB3aGlsZSAoPERBVEE+KSB7CisgICAgICAgIGNob21wOworCisgICAgICAgIG15ICRjb2wgID0gMDsKKyAgICAgICAgbXkgQGRhdGEgPSBzcGxpdCAnICc7CisKKyAgICAgICAgZm9yIG15ICRpdGVtIChAZGF0YSkgeworCisgICAgICAgICAgICAjIE1hdGNoIGRhdGVzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0czogZC9tL3l5LCBkL20veXl5eQorICAgICAgICAgICAgaWYgKCRpdGVtID1+IHFyW14oXGR7MSwyfSkvKFxkezEsMn0pLyhcZHs0fSkkXSkgeworCisgICAgICAgICAgICAgICAgIyBDaGFuZ2UgdG8gdGhlIGRhdGUgZm9ybWF0IHJlcXVpcmVkIGJ5IHdyaXRlX2RhdGVfdGltZSgpLgorICAgICAgICAgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkMywgJDIsICQxOworCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCRyb3csICRjb2wrKywgJGRhdGUsICRkYXRlX2Zvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIEp1c3QgcGxhaW4gZGF0YQorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wrKywgJGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICRyb3crKzsKKyAgICB9CisKKyAgICBfX0RBVEFfXworICAgIEl0ZW0gICAgQ29zdCAgICBEYXRlCisgICAgQm9vayAgICAxMCAgICAgIDEvOS8yMDA3CisgICAgQmVlciAgICA0ICAgICAgIDEyLzkvMjAwNworICAgIEJlZCAgICAgNTAwICAgICA1LzEwLzIwMDcKKworRm9yIGEgc2xpZ2h0bHkgbW9yZSBhZHZhbmNlZCBzb2x1dGlvbiB5b3UgY2FuIG1vZGlmeSB0aGUgQzx3cml0ZSgpPiBtZXRob2QgdG8gaGFuZGxlIGRhdGUgZm9ybWF0cyBvZiB5b3VyIGNob2ljZSB2aWEgdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gbWV0aG9kLiBTZWUgdGhlIEM8YWRkX3dyaXRlX2hhbmRsZXIoKT4gc2VjdGlvbiBvZiB0aGUgZG9jcyBhbmQgdGhlIHdyaXRlX2hhbmRsZXIzLnBsIGFuZCB3cml0ZV9oYW5kbGVyNC5wbCBwcm9ncmFtcyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworPWhlYWQyIENvbnZlcnRpbmcgZGF0ZXMgYW5kIHRpbWVzIHRvIGFuIEV4Y2VsIGRhdGUgb3IgdGltZQorCitUaGUgQzx3cml0ZV9kYXRlX3RpbWUoKT4gbWV0aG9kIGFib3ZlIGlzIGp1c3Qgb25lIHdheSBvZiBoYW5kbGluZyBkYXRlcyBhbmQgdGltZXMuCisKK1RoZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5PiBtb2R1bGUgd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBoYXMgZGF0ZS90aW1lIGhhbmRsaW5nIGZ1bmN0aW9uczoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsKKworICAgICRkYXRlICAgICAgICAgICA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAxKTsgICAgICAgICAjIDM3MjU3CisgICAgJGRhdGUgICAgICAgICAgID0geGxfcGFyc2VfZGF0ZSgiMTEgSnVseSAxOTk3Iik7ICAgICMgMzU2MjIKKyAgICAkdGltZSAgICAgICAgICAgPSB4bF9wYXJzZV90aW1lKCczOjIxOjM2IFBNJyk7ICAgICAgIyAwLjY0CisgICAgJGRhdGUgICAgICAgICAgID0geGxfZGVjb2RlX2RhdGVfRVUoIjEzIE1heSAyMDAyIik7ICMgMzczODkKKworTm90ZTogc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgcmVxdWlyZSBhZGRpdGlvbmFsIENQQU4gbW9kdWxlcy4KKworRm9yIGRhdGUgY29udmVyc2lvbnMgdXNpbmcgdGhlIENQQU4gQzxEYXRlVGltZT4gZnJhbWV3b3JrIHNlZSBMPERhdGVUaW1lOjpGb3JtYXQ6OkV4Y2VsPiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9RGF0ZVRpbWUtRm9ybWF0LUV4Y2VsPi4KKworCisKKworPWhlYWQxIE9VVExJTkVTIEFORCBHUk9VUElORyBJTiBFWENFTAorCisKK0V4Y2VsIGFsbG93cyB5b3UgdG8gZ3JvdXAgcm93cyBvciBjb2x1bW5zIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuIG9yIGRpc3BsYXllZCB3aXRoIGEgc2luZ2xlIG1vdXNlIGNsaWNrLiBUaGlzIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gYXMgb3V0bGluZXMuCisKK091dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIHN1bW1hcmllcy4KKworVGhpcyBmZWF0dXJlIGlzIGJlc3Qgdmlld2VkIGluIEV4Y2VsIGJ1dCB0aGUgZm9sbG93aW5nIGlzIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHdoYXQgYSB3b3Jrc2hlZXQgd2l0aCB0aHJlZSBvdXRsaW5lcyBtaWdodCBsb29rIGxpa2UuIFJvd3MgMy00IGFuZCByb3dzIDctOCBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAyLiBSb3dzIDItOSBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAxLiBUaGUgbGluZXMgYXQgdGhlIGxlZnQgaGFuZCBzaWRlIGFyZSBjYWxsZWQgb3V0bGluZSBsZXZlbCBiYXJzLgorCisKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxIDIgMyB8ICAgfCAgIEEgICB8ICAgQiAgIHwgICBDICAgfCAgIEQgICB8ICAuLi4KKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgXyAgICB8IDEgfCAgIEEgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgXyAgfCAyIHwgICBCICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgMyB8ICAoQykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDQgfCAgKEQpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAtICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgIF8gIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDcgfCAgKEcpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCA4IHwgIChIKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgLSAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworCitDbGlja2luZyB0aGUgbWludXMgc2lnbiBvbiBlYWNoIG9mIHRoZSBsZXZlbCAyIG91dGxpbmVzIHdpbGwgY29sbGFwc2UgYW5kIGhpZGUgdGhlIGRhdGEgYXMgc2hvd24gaW4gdGhlIG5leHQgZmlndXJlLiBUaGUgbWludXMgc2lnbiBjaGFuZ2VzIHRvIGEgcGx1cyBzaWduIHRvIGluZGljYXRlIHRoYXQgdGhlIGRhdGEgaW4gdGhlIG91dGxpbmUgaXMgaGlkZGVuLgorCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgMSAyIDMgfCAgIHwgICBBICAgfCAgIEIgICB8ICAgQyAgIHwgICBEICAgfCAgLi4uCisgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIF8gICAgfCAxIHwgICBBICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgICAgIHwgMiB8ICAgQiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICsgICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgICAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgKyAgIHwgOSB8ICAgSSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICAtICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworCitDbGlja2luZyBvbiB0aGUgbWludXMgc2lnbiBvbiB0aGUgbGV2ZWwgMSBvdXRsaW5lIHdpbGwgY29sbGFwc2UgdGhlIHJlbWFpbmluZyByb3dzIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAxIDIgMyB8ICAgfCAgIEEgICB8ICAgQiAgIHwgICBDICAgfCAgIEQgICB8ICAuLi4KKyAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICB8IDEgfCAgIEEgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgKyAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisKKworR3JvdXBpbmcgaW4gQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gaXMgYWNoaWV2ZWQgYnkgc2V0dGluZyB0aGUgb3V0bGluZSBsZXZlbCB2aWEgdGhlIEM8c2V0X3JvdygpPiBhbmQgQzxzZXRfY29sdW1uKCk+IHdvcmtzaGVldCBtZXRob2RzOgorCisgICAgc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkZm9ybWF0LCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgc2V0X2NvbHVtbigkZmlyc3RfY29sLCAkbGFzdF9jb2wsICR3aWR0aCwgJGZvcm1hdCwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBhbiBvdXRsaW5lIGxldmVsIG9mIDEgZm9yIHJvd3MgMSBhbmQgMiAoemVyby1pbmRleGVkKSBhbmQgY29sdW1ucyBCIHRvIEcuIFRoZSBwYXJhbWV0ZXJzIEM8JGhlaWdodD4gYW5kIEM8JFhGPiBhcmUgYXNzaWduZWQgZGVmYXVsdCB2YWx1ZXMgc2luY2UgdGhleSBhcmUgdW5kZWZpbmVkOgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygxLCB1bmRlZiwgdW5kZWYsIDAsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkcnLCB1bmRlZiwgdW5kZWYsIDAsIDEpOworCitFeGNlbCBhbGxvd3MgdXAgdG8gNyBvdXRsaW5lIGxldmVscy4gVGhlcmVmb3JlIHRoZSBDPCRsZXZlbD4gcGFyYW1ldGVyIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgQzwwIEU8bHQ+PSAkbGV2ZWwgRTxsdD49IDc+LgorCitSb3dzIGFuZCBjb2x1bW5zIGNhbiBiZSBjb2xsYXBzZWQgYnkgc2V0dGluZyB0aGUgQzwkaGlkZGVuPiBmbGFnIGZvciB0aGUgaGlkZGVuIHJvd3MvY29sdW1ucyBhbmQgc2V0dGluZyB0aGUgQzwkY29sbGFwc2VkPiBmbGFnIGZvciB0aGUgcm93L2NvbHVtbiB0aGF0IGhhcyB0aGUgY29sbGFwc2VkIEM8Kz4gc3ltYm9sOgorCisgICAgJHdvcmtzaGVldC0+c2V0X3JvdygxLCB1bmRlZiwgdW5kZWYsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDMsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7ICAgICAgICAjIENvbGxhcHNlZCBmbGFnLgorCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpHJywgdW5kZWYsIHVuZGVmLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdIOkgnLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOyAjIENvbGxhcHNlZCBmbGFnLgorCitOb3RlOiBTZXR0aW5nIHRoZSBDPCRjb2xsYXBzZWQ+IGZsYWcgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9wZW5PZmZpY2Uub3JnIGFuZCBHbnVtZXJpYy4KKworRm9yIGEgbW9yZSBjb21wbGV0ZSBleGFtcGxlIHNlZSB0aGUgQzxvdXRsaW5lLnBsPiBhbmQgQzxvdXRsaW5lX2NvbGxhcHNlZC5wbD4gcHJvZ3JhbXMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitTb21lIGFkZGl0aW9uYWwgb3V0bGluZSBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgdmlhIHRoZSBDPG91dGxpbmVfc2V0dGluZ3MoKT4gd29ya3NoZWV0IG1ldGhvZCwgc2VlIGFib3ZlLgorCisKKworCis9aGVhZDEgREFUQSBWQUxJREFUSU9OIElOIEVYQ0VMCisKK0RhdGEgdmFsaWRhdGlvbiBpcyBhIGZlYXR1cmUgb2YgRXhjZWwgd2hpY2ggYWxsb3dzIHlvdSB0byByZXN0cmljdCB0aGUgZGF0YSB0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmVzdHJpY3QgaW5wdXQgdG8gdmFsdWVzIGluIGEgZHJvcCBkb3duIGxpc3QuCisKK0EgdHlwaWNhbCB1c2UgY2FzZSBtaWdodCBiZSB0byByZXN0cmljdCBkYXRhIGluIGEgY2VsbCB0byBpbnRlZ2VyIHZhbHVlcyBpbiBhIGNlcnRhaW4gcmFuZ2UsIHRvIHByb3ZpZGUgYSBoZWxwIG1lc3NhZ2UgdG8gaW5kaWNhdGUgdGhlIHJlcXVpcmVkIHZhbHVlIGFuZCB0byBpc3N1ZSBhIHdhcm5pbmcgaWYgdGhlIGlucHV0IGRhdGEgZG9lc24ndCBtZWV0IHRoZSBzdGF0ZWQgY3JpdGVyaWEuIEluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdlIGNvdWxkIGRvIHRoYXQgYXMgZm9sbG93czoKKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAxLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgICA9PiAnSW5wdXQgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSAgID0+ICdCZXR3ZWVuIDEgYW5kIDEwMCcsCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICAgPT4gJ1NvcnJ5LCB0cnkgYWdhaW4uJywKKyAgICAgICAgfSk7CisKK1RoZSBhYm92ZSBleGFtcGxlIHdvdWxkIGxvb2sgbGlrZSB0aGlzIGluIEV4Y2VsOiBMPGh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9kYXRhX3ZhbGlkYXRpb24uanBnPi4KKworPWJlZ2luIGh0bWwKKworPGNlbnRlcj4KKzxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvZGF0YV92YWxpZGF0aW9uLmpwZyIgYWx0PSJUaGUgb3V0cHV0IGZyb20gdGhlIGFib3ZlIGV4YW1wbGUiPgorPC9jZW50ZXI+CisKKz1lbmQgaHRtbAorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBkYXRhIHZhbGlkYXRpb24gc2VlIHRoZSBmb2xsb3dpbmcgTWljcm9zb2Z0IHN1cHBvcnQgYXJ0aWNsZSAiRGVzY3JpcHRpb24gYW5kIGV4YW1wbGVzIG9mIGRhdGEgdmFsaWRhdGlvbiBpbiBFeGNlbCI6IEw8aHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8yMTE0ODU+LgorCitUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIGhvdyB0byB1c2UgdGhlIEM8ZGF0YV92YWxpZGF0aW9uKCk+IG1ldGhvZCBhbmQgaXRzIHZhcmlvdXMgb3B0aW9ucy4KKworCis9aGVhZDIgZGF0YV92YWxpZGF0aW9uKCRyb3csICRjb2wsIHsgcGFyYW1ldGVyID0+ICd2YWx1ZScsIC4uLiB9KQorCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24oKT4gbWV0aG9kIGlzIHVzZWQgdG8gY29uc3RydWN0IGFuIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbi4KKworSXQgY2FuIGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzLiBZb3UgY2FuIHBhc3MgMyBwYXJhbWV0ZXJzIHN1Y2ggYXMgIEM8KCRyb3csICRjb2wsIHsuLi59KT4gb3IgNSBwYXJhbWV0ZXJzIHN1Y2ggYXMgQzwoJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsIHsuLi59KT4uIFlvdSBjYW4gYWxzbyB1c2UgQzxBMT4gc3R5bGUgbm90YXRpb24uIEZvciBleGFtcGxlOgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKDAsIDAsICAgICAgIHsuLi59KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oMCwgMCwgNCwgMSwgey4uLn0pOworCisgICAgIyBXaGljaCBhcmUgdGhlIHNhbWUgYXM6CisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0ExJywgICAgICAgey4uLn0pOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTE6QjUnLCAgICB7Li4ufSk7CisKK1NlZSBhbHNvIHRoZSBub3RlIGFib3V0IEw8Q2VsbCBub3RhdGlvbj4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworVGhlIGxhc3QgcGFyYW1ldGVyIGluIEM8ZGF0YV92YWxpZGF0aW9uKCk+IG11c3QgYmUgYSBoYXNoIHJlZiBjb250YWluaW5nIHRoZSBwYXJhbWV0ZXJzIHRoYXQgZGVzY3JpYmUgdGhlIHR5cGUgYW5kIHN0eWxlIG9mIHRoZSBkYXRhIHZhbGlkYXRpb24uIFRoZSBhbGxvd2FibGUgcGFyYW1ldGVycyBhcmU6CisKKyAgICB2YWxpZGF0ZQorICAgIGNyaXRlcmlhCisgICAgdmFsdWUgfCBtaW5pbXVtIHwgc291cmNlCisgICAgbWF4aW11bQorICAgIGlnbm9yZV9ibGFuaworICAgIGRyb3Bkb3duCisKKyAgICBpbnB1dF90aXRsZQorICAgIGlucHV0X21lc3NhZ2UKKyAgICBzaG93X2lucHV0CisKKyAgICBlcnJvcl90aXRsZQorICAgIGVycm9yX21lc3NhZ2UKKyAgICBlcnJvcl90eXBlCisgICAgc2hvd19lcnJvcgorCitUaGVzZSBwYXJhbWV0ZXJzIGFyZSBleHBsYWluZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4gTW9zdCBvZiB0aGUgcGFyYW1ldGVycyBhcmUgb3B0aW9uYWwsIGhvd2V2ZXIsIHlvdSB3aWxsIGdlbmVyYWxseSByZXF1aXJlIHRoZSB0aHJlZSBtYWluIG9wdGlvbnMgQzx2YWxpZGF0ZT4sIEM8Y3JpdGVyaWE+IGFuZCBDPHZhbHVlPi4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQjMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgICAgICAgICB2YWx1ZSAgICA9PiAxMDAsCisgICAgICAgIH0pOworCitUaGUgQzxkYXRhX3ZhbGlkYXRpb24+IG1ldGhvZCByZXR1cm5zOgorCisgICAgIDAgZm9yIHN1Y2Nlc3MuCisgICAgLTEgZm9yIGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzLgorICAgIC0yIGZvciByb3cgb3IgY29sdW1uIG91dCBvZiBib3VuZHMuCisgICAgLTMgZm9yIGluY29ycmVjdCBwYXJhbWV0ZXIgb3IgdmFsdWUuCisKKworPWhlYWQyIHZhbGlkYXRlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzx2YWxpZGF0ZT4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2V0IHRoZSB0eXBlIG9mIGRhdGEgdGhhdCB5b3Ugd2lzaCB0byB2YWxpZGF0ZS4gSXQgaXMgYWx3YXlzIHJlcXVpcmVkIGFuZCBpdCBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4gQWxsb3dhYmxlIHZhbHVlcyBhcmU6CisKKyAgICBhbnkKKyAgICBpbnRlZ2VyCisgICAgZGVjaW1hbAorICAgIGxpc3QKKyAgICBkYXRlCisgICAgdGltZQorICAgIGxlbmd0aAorICAgIGN1c3RvbQorCis9b3ZlcgorCis9aXRlbSAqIEI8YW55PiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhhdCB0aGUgdHlwZSBvZiBkYXRhIGlzIHVucmVzdHJpY3RlZC4gVGhpcyBpcyB0aGUgc2FtZSBhcyBub3QgYXBwbHlpbmcgYSBkYXRhIHZhbGlkYXRpb24uIEl0IGlzIG9ubHkgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcyBhbmQgaXNuJ3QgdXNlZCB2ZXJ5IG9mdGVuIGluIHRoZSBjb250ZXh0IG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aXRlbSAqIEI8aW50ZWdlcj4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGludGVnZXIgdmFsdWVzLiBFeGNlbCByZWZlcnMgdG8gdGhpcyBhcyAnd2hvbGUgbnVtYmVyJy4KKworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMTAwLAorCis9aXRlbSAqIEI8ZGVjaW1hbD4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGRlY2ltYWwgdmFsdWVzLgorCisgICAgdmFsaWRhdGUgPT4gJ2RlY2ltYWwnLAorICAgIGNyaXRlcmlhID0+ICc+JywKKyAgICB2YWx1ZSAgICA9PiAzOC42LAorCis9aXRlbSAqIEI8bGlzdD4gcmVzdHJpY3RzIHRoZSBjZWxsIHRvIGEgc2V0IG9mIHVzZXIgc3BlY2lmaWVkIHZhbHVlcy4gVGhlc2UgY2FuIGJlIHBhc3NlZCBpbiBhbiBhcnJheSByZWYgb3IgYXMgYSBjZWxsIHJhbmdlIChuYW1lZCByYW5nZXMgYXJlbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQpOgorCisgICAgdmFsaWRhdGUgPT4gJ2xpc3QnLAorICAgIHZhbHVlICAgID0+IFsnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10sCisgICAgIyBPciBsaWtlIHRoaXM6CisgICAgdmFsdWUgICAgPT4gJ0IxOkIzJywKKworRXhjZWwgcmVxdWlyZXMgdGhhdCByYW5nZSByZWZlcmVuY2VzIGFyZSBvbmx5IHRvIGNlbGxzIG9uIHRoZSBzYW1lIHdvcmtzaGVldC4KKworPWl0ZW0gKiBCPGRhdGU+IHJlc3RyaWN0cyB0aGUgY2VsbCB0byBkYXRlIHZhbHVlcy4gRGF0ZXMgaW4gRXhjZWwgYXJlIGV4cHJlc3NlZCBhcyBpbnRlZ2VyIHZhbHVlcyBidXQgeW91IGNhbiBhbHNvIHBhc3MgYW4gSVNPODYwIHN0eWxlIHN0cmluZyBhcyB1c2VkIGluIEM8d3JpdGVfZGF0ZV90aW1lKCk+LiBTZWUgYWxzbyBMPERBVEVTIEFORCBUSU1FIElOIEVYQ0VMPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggRXhjZWwncyBkYXRlcy4KKworICAgIHZhbGlkYXRlID0+ICdkYXRlJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMzk2NTMsICMgMjQgSnVseSAyMDA4CisgICAgIyBPciBsaWtlIHRoaXM6CisgICAgdmFsdWUgICAgPT4gJzIwMDgtMDctMjRUJywKKworPWl0ZW0gKiBCPHRpbWU+IHJlc3RyaWN0cyB0aGUgY2VsbCB0byB0aW1lIHZhbHVlcy4gVGltZXMgaW4gRXhjZWwgYXJlIGV4cHJlc3NlZCBhcyBkZWNpbWFsIHZhbHVlcyBidXQgeW91IGNhbiBhbHNvIHBhc3MgYW4gSVNPODYwIHN0eWxlIHN0cmluZyBhcyB1c2VkIGluIEM8d3JpdGVfZGF0ZV90aW1lKCk+LiBTZWUgYWxzbyBMPERBVEVTIEFORCBUSU1FIElOIEVYQ0VMPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggRXhjZWwncyB0aW1lcy4KKworICAgIHZhbGlkYXRlID0+ICd0aW1lJywKKyAgICBjcml0ZXJpYSA9PiAnPicsCisgICAgdmFsdWUgICAgPT4gMC41LCAjIE5vb24KKyAgICAjIE9yIGxpa2UgdGhpczoKKyAgICB2YWx1ZSAgICA9PiAnVDEyOjAwOjAwJywKKworPWl0ZW0gKiBCPGxlbmd0aD4gcmVzdHJpY3RzIHRoZSBjZWxsIGRhdGEgYmFzZWQgb24gYW4gaW50ZWdlciBzdHJpbmcgbGVuZ3RoLiBFeGNlbCByZWZlcnMgdG8gdGhpcyBhcyAnVGV4dCBsZW5ndGgnLgorCisgICAgdmFsaWRhdGUgPT4gJ2xlbmd0aCcsCisgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgIHZhbHVlICAgID0+IDEwLAorCis9aXRlbSAqIEI8Y3VzdG9tPiByZXN0cmljdHMgdGhlIGNlbGwgYmFzZWQgb24gYW4gZXh0ZXJuYWwgRXhjZWwgZm9ybXVsYSB0aGF0IHJldHVybnMgYSBDPFRSVUUvRkFMU0U+IHZhbHVlLgorCisgICAgdmFsaWRhdGUgPT4gJ2N1c3RvbScsCisgICAgdmFsdWUgICAgPT4gJz1JRihBMTA+QjEwLFRSVUUsRkFMU0UpJywKKworPWJhY2sKKworCis9aGVhZDIgY3JpdGVyaWEKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGNyaXRlcmlhPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIGNyaXRlcmlhIGJ5IHdoaWNoIHRoZSBkYXRhIGluIHRoZSBjZWxsIGlzIHZhbGlkYXRlZC4gSXQgaXMgYWxtb3N0IGFsd2F5cyByZXF1aXJlZCBleGNlcHQgZm9yIHRoZSBDPGxpc3Q+IGFuZCBDPGN1c3RvbT4gdmFsaWRhdGUgb3B0aW9ucy4gSXQgaGFzIG5vIGRlZmF1bHQgdmFsdWUuIEFsbG93YWJsZSB2YWx1ZXMgYXJlOgorCisgICAgJ2JldHdlZW4nCisgICAgJ25vdCBiZXR3ZWVuJworICAgICdlcXVhbCB0bycgICAgICAgICAgICAgICAgICB8ICAnPT0nICB8ICAnPScKKyAgICAnbm90IGVxdWFsIHRvJyAgICAgICAgICAgICAgfCAgJyE9JyAgfCAgJzw+JworICAgICdncmVhdGVyIHRoYW4nICAgICAgICAgICAgICB8ICAnPicKKyAgICAnbGVzcyB0aGFuJyAgICAgICAgICAgICAgICAgfCAgJzwnCisgICAgJ2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgIHwgICc+PScKKyAgICAnbGVzcyB0aGFuIG9yIGVxdWFsIHRvJyAgICAgfCAgJzw9JworCitZb3UgY2FuIGVpdGhlciB1c2UgRXhjZWwncyB0ZXh0dWFsIGRlc2NyaXB0aW9uIHN0cmluZ3MsIGluIHRoZSBmaXJzdCBjb2x1bW4gYWJvdmUsIG9yIHRoZSBtb3JlIGNvbW1vbiBvcGVyYXRvciBhbHRlcm5hdGl2ZXMuIFRoZSBmb2xsb3dpbmcgYXJlIGVxdWl2YWxlbnQ6CisKKyAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgY3JpdGVyaWEgPT4gJ2dyZWF0ZXIgdGhhbicsCisgICAgdmFsdWUgICAgPT4gMTAwLAorCisgICAgdmFsaWRhdGUgPT4gJ2ludGVnZXInLAorICAgIGNyaXRlcmlhID0+ICc+JywKKyAgICB2YWx1ZSAgICA9PiAxMDAsCisKK1RoZSBDPGxpc3Q+IGFuZCBDPGN1c3RvbT4gdmFsaWRhdGUgb3B0aW9ucyBkb24ndCByZXF1aXJlIGEgQzxjcml0ZXJpYT4uIElmIHlvdSBzcGVjaWZ5IG9uZSBpdCB3aWxsIGJlIGlnbm9yZWQuCisKKyAgICB2YWxpZGF0ZSA9PiAnbGlzdCcsCisgICAgdmFsdWUgICAgPT4gWydvcGVuJywgJ2hpZ2gnLCAnY2xvc2UnXSwKKworICAgIHZhbGlkYXRlID0+ICdjdXN0b20nLAorICAgIHZhbHVlICAgID0+ICc9SUYoQTEwPkIxMCxUUlVFLEZBTFNFKScsCisKKworPWhlYWQyIHZhbHVlIHwgbWluaW11bSB8IHNvdXJjZQorCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8dmFsdWU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgbGltaXRpbmcgdmFsdWUgdG8gd2hpY2ggdGhlIEM8Y3JpdGVyaWE+IGlzIGFwcGxpZWQuIEl0IGlzIGFsd2F5cyByZXF1aXJlZCBhbmQgaXQgaGFzIG5vIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyB1c2UgdGhlIHN5bm9ueW1zIEM8bWluaW11bT4gb3IgQzxzb3VyY2U+IHRvIG1ha2UgdGhlIHZhbGlkYXRpb24gYSBsaXR0bGUgY2xlYXJlciBhbmQgY2xvc2VyIHRvIEV4Y2VsJ3MgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlcjoKKworICAgICMgVXNlICd2YWx1ZScKKyAgICB2YWxpZGF0ZSA9PiAnaW50ZWdlcicsCisgICAgY3JpdGVyaWEgPT4gJz4nLAorICAgIHZhbHVlICAgID0+IDEwMCwKKworICAgICMgVXNlICdtaW5pbXVtJworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnYmV0d2VlbicsCisgICAgbWluaW11bSAgPT4gMSwKKyAgICBtYXhpbXVtICA9PiAxMDAsCisKKyAgICAjIFVzZSAnc291cmNlJworICAgIHZhbGlkYXRlID0+ICdsaXN0JywKKyAgICBzb3VyY2UgICA9PiAnQjE6QjMnLAorCisKKz1oZWFkMiBtYXhpbXVtCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxtYXhpbXVtPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIHVwcGVyIGxpbWl0aW5nIHZhbHVlIHdoZW4gdGhlIEM8Y3JpdGVyaWE+IGlzIGVpdGhlciBDPCdiZXR3ZWVuJz4gb3IgQzwnbm90IGJldHdlZW4nPjoKKworICAgIHZhbGlkYXRlID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSA9PiAnYmV0d2VlbicsCisgICAgbWluaW11bSAgPT4gMSwKKyAgICBtYXhpbXVtICA9PiAxMDAsCisKKworPWhlYWQyIGlnbm9yZV9ibGFuaworCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8aWdub3JlX2JsYW5rPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0b2dnbGUgb24gYW5kIG9mZiB0aGUgJ0lnbm9yZSBibGFuaycgb3B0aW9uIGluIHRoZSBFeGNlbCBkYXRhIHZhbGlkYXRpb24gZGlhbG9nLiBXaGVuIHRoZSBvcHRpb24gaXMgb24gdGhlIGRhdGEgdmFsaWRhdGlvbiBpcyBub3QgYXBwbGllZCB0byBibGFuayBkYXRhIGluIHRoZSBjZWxsLiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgaWdub3JlX2JsYW5rID0+IDAsICAjIFR1cm4gdGhlIG9wdGlvbiBvZmYKKworCis9aGVhZDIgZHJvcGRvd24KKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGRyb3Bkb3duPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byB0b2dnbGUgb24gYW5kIG9mZiB0aGUgJ0luLWNlbGwgZHJvcGRvd24nIG9wdGlvbiBpbiB0aGUgRXhjZWwgZGF0YSB2YWxpZGF0aW9uIGRpYWxvZy4gV2hlbiB0aGUgb3B0aW9uIGlzIG9uIGEgZHJvcGRvd24gbGlzdCB3aWxsIGJlIHNob3duIGZvciBDPGxpc3Q+IHZhbGlkYXRpb25zLiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgZHJvcGRvd24gPT4gMCwgICAgICAjIFR1cm4gdGhlIG9wdGlvbiBvZmYKKworCis9aGVhZDIgaW5wdXRfdGl0bGUKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGlucHV0X3RpdGxlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIHRpdGxlIG9mIHRoZSBpbnB1dCBtZXNzYWdlIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gYSBjZWxsIGlzIGVudGVyZWQuIEl0IGhhcyBubyBkZWZhdWx0IHZhbHVlIGFuZCBpcyBvbmx5IGRpc3BsYXllZCBpZiB0aGUgaW5wdXQgbWVzc2FnZSBpcyBkaXNwbGF5ZWQuIFNlZSB0aGUgQzxpbnB1dF9tZXNzYWdlPiBwYXJhbWV0ZXIgYmVsb3cuCisKKyAgICBpbnB1dF90aXRsZSAgID0+ICdUaGlzIGlzIHRoZSBpbnB1dCB0aXRsZScsCisKK1RoZSBtYXhpbXVtIHRpdGxlIGxlbmd0aCBpcyAzMiBjaGFyYWN0ZXJzLiBVVEY4IHN0cmluZ3MgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBpbiBwZXJsIDUuOCBhbmQgbGF0ZXIuCisKKworPWhlYWQyIGlucHV0X21lc3NhZ2UKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGlucHV0X21lc3NhZ2U+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNldCB0aGUgaW5wdXQgbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIGEgY2VsbCBpcyBlbnRlcmVkLiBJdCBoYXMgbm8gZGVmYXVsdCB2YWx1ZS4KKworICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgIGNyaXRlcmlhICAgICAgPT4gJ2JldHdlZW4nLAorICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICBpbnB1dF90aXRsZSAgID0+ICdFbnRlciB0aGUgYXBwbGllZCBkaXNjb3VudDonLAorICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKworVGhlIG1lc3NhZ2UgY2FuIGJlIHNwbGl0IG92ZXIgc2V2ZXJhbCBsaW5lcyB1c2luZyBuZXdsaW5lcywgQzwiXG4iPiBpbiBkb3VibGUgcXVvdGVkIHN0cmluZ3MuCisKKyAgICBpbnB1dF9tZXNzYWdlID0+ICJUaGlzIGlzXG5hIHRlc3QuIiwKKworVGhlIG1heGltdW0gbWVzc2FnZSBsZW5ndGggaXMgMjU1IGNoYXJhY3RlcnMuIFVURjggc3RyaW5ncyBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGluIHBlcmwgNS44IGFuZCBsYXRlci4KKworCis9aGVhZDIgc2hvd19pbnB1dAorCitUaGlzIHBhcmFtZXRlciBpcyBwYXNzZWQgaW4gYSBoYXNoIHJlZiB0byBDPGRhdGFfdmFsaWRhdGlvbigpPi4KKworVGhlIEM8c2hvd19pbnB1dD4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gdG9nZ2xlIG9uIGFuZCBvZmYgdGhlICdTaG93IGlucHV0IG1lc3NhZ2Ugd2hlbiBjZWxsIGlzIHNlbGVjdGVkJyBvcHRpb24gaW4gdGhlIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbiBkaWFsb2cuIFdoZW4gdGhlIG9wdGlvbiBpcyBvZmYgYW4gaW5wdXQgbWVzc2FnZSBpcyBub3QgZGlzcGxheWVkIGV2ZW4gaWYgaXQgaGFzIGJlZW4gc2V0IHVzaW5nIEM8aW5wdXRfbWVzc2FnZT4uIEl0IGlzIG9uIGJ5IGRlZmF1bHQuCisKKyAgICBzaG93X2lucHV0ID0+IDAsICAgICAgIyBUdXJuIHRoZSBvcHRpb24gb2ZmCisKKworPWhlYWQyIGVycm9yX3RpdGxlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxlcnJvcl90aXRsZT4gcGFyYW1ldGVyIGlzIHVzZWQgdG8gc2V0IHRoZSB0aXRsZSBvZiB0aGUgZXJyb3IgbWVzc2FnZSB0aGF0IGlzIGRpc3BsYXllZCB3aGVuIHRoZSBkYXRhIHZhbGlkYXRpb24gY3JpdGVyaWEgaXMgbm90IG1ldC4gVGhlIGRlZmF1bHQgZXJyb3IgdGl0bGUgaXMgJ01pY3Jvc29mdCBFeGNlbCcuCisKKyAgICBlcnJvcl90aXRsZSAgID0+ICdJbnB1dCB2YWx1ZSBpcyBub3QgdmFsaWQnLAorCitUaGUgbWF4aW11bSB0aXRsZSBsZW5ndGggaXMgMzIgY2hhcmFjdGVycy4gVVRGOCBzdHJpbmdzIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgaW4gcGVybCA1LjggYW5kIGxhdGVyLgorCisKKz1oZWFkMiBlcnJvcl9tZXNzYWdlCisKK1RoaXMgcGFyYW1ldGVyIGlzIHBhc3NlZCBpbiBhIGhhc2ggcmVmIHRvIEM8ZGF0YV92YWxpZGF0aW9uKCk+LgorCitUaGUgQzxlcnJvcl9tZXNzYWdlPiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgdGhhdCBpcyBkaXNwbGF5ZWQgd2hlbiBhIGNlbGwgaXMgZW50ZXJlZC4gVGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZSBpcyAiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGlzIG5vdCB2YWxpZC5cbkEgdXNlciBoYXMgcmVzdHJpY3RlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgZW50ZXJlZCBpbnRvIHRoZSBjZWxsLiIuCisKKyAgICB2YWxpZGF0ZSAgICAgID0+ICdpbnRlZ2VyJywKKyAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgbWF4aW11bSAgICAgICA9PiAxMDAsCisgICAgZXJyb3JfdGl0bGUgICA9PiAnSW5wdXQgdmFsdWUgaXMgbm90IHZhbGlkJywKKyAgICBlcnJvcl9tZXNzYWdlID0+ICdJdCBzaG91bGQgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCcsCisKK1RoZSBtZXNzYWdlIGNhbiBiZSBzcGxpdCBvdmVyIHNldmVyYWwgbGluZXMgdXNpbmcgbmV3bGluZXMsIEM8IlxuIj4gaW4gZG91YmxlIHF1b3RlZCBzdHJpbmdzLgorCisgICAgaW5wdXRfbWVzc2FnZSA9PiAiVGhpcyBpc1xuYSB0ZXN0LiIsCisKK1RoZSBtYXhpbXVtIG1lc3NhZ2UgbGVuZ3RoIGlzIDI1NSBjaGFyYWN0ZXJzLiBVVEY4IHN0cmluZ3MgYXJlIGhhbmRsZWQgYXV0b21hdGljYWxseSBpbiBwZXJsIDUuOCBhbmQgbGF0ZXIuCisKKworPWhlYWQyIGVycm9yX3R5cGUKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPGVycm9yX3R5cGU+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgZXJyb3IgZGlhbG9nIHRoYXQgaXMgZGlzcGxheWVkLiBUaGVyZSBhcmUgMyBvcHRpb25zOgorCisgICAgJ3N0b3AnCisgICAgJ3dhcm5pbmcnCisgICAgJ2luZm9ybWF0aW9uJworCitUaGUgZGVmYXVsdCBpcyBDPCdzdG9wJz4uCisKKworPWhlYWQyIHNob3dfZXJyb3IKKworVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIGluIGEgaGFzaCByZWYgdG8gQzxkYXRhX3ZhbGlkYXRpb24oKT4uCisKK1RoZSBDPHNob3dfZXJyb3I+IHBhcmFtZXRlciBpcyB1c2VkIHRvIHRvZ2dsZSBvbiBhbmQgb2ZmIHRoZSAnU2hvdyBlcnJvciBhbGVydCBhZnRlciBpbnZhbGlkIGRhdGEgaXMgZW50ZXJlZCcgb3B0aW9uIGluIHRoZSBFeGNlbCBkYXRhIHZhbGlkYXRpb24gZGlhbG9nLiBXaGVuIHRoZSBvcHRpb24gaXMgb2ZmIGFuIGVycm9yIG1lc3NhZ2UgaXMgbm90IGRpc3BsYXllZCBldmVuIGlmIGl0IGhhcyBiZWVuIHNldCB1c2luZyBDPGVycm9yX21lc3NhZ2U+LiBJdCBpcyBvbiBieSBkZWZhdWx0LgorCisgICAgc2hvd19lcnJvciA9PiAwLCAgICAgICMgVHVybiB0aGUgb3B0aW9uIG9mZgorCis9aGVhZDIgRGF0YSBWYWxpZGF0aW9uIEV4YW1wbGVzCisKK0V4YW1wbGUgMS4gTGltaXRpbmcgaW5wdXQgdG8gYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gYSBmaXhlZCB2YWx1ZS4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTEnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICc+JywKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICA9PiAwLAorICAgICAgICB9KTsKKworRXhhbXBsZSAyLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBhIGZpeGVkIHZhbHVlIHdoZXJlIHRoZSB2YWx1ZSBpcyByZWZlcmVuY2VkIGZyb20gYSBjZWxsLgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCdBMicsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+ICc9RTMnLAorICAgICAgICB9KTsKKworRXhhbXBsZSAzLiBMaW1pdGluZyBpbnB1dCB0byBhIGRlY2ltYWwgaW4gYSBmaXhlZCByYW5nZS4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTMnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2RlY2ltYWwnLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAwLjEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gMC41LAorICAgICAgICB9KTsKKworRXhhbXBsZSA0LiBMaW1pdGluZyBpbnB1dCB0byBhIHZhbHVlIGluIGEgZHJvcGRvd24gbGlzdC4KKworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbignQTQnLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2xpc3QnLAorICAgICAgICAgICAgc291cmNlICAgICAgICAgID0+IFsnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10sCisgICAgICAgIH0pOworCitFeGFtcGxlIDUuIExpbWl0aW5nIGlucHV0IHRvIGEgdmFsdWUgaW4gYSBkcm9wZG93biBsaXN0IHdoZXJlIHRoZSBsaXN0IGlzIHNwZWNpZmllZCBhcyBhIGNlbGwgcmFuZ2UuCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0E1JywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdsaXN0JywKKyAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICA9PiAnPUU0Okc0JywKKyAgICAgICAgfSk7CisKK0V4YW1wbGUgNi4gTGltaXRpbmcgaW5wdXQgdG8gYSBkYXRlIGluIGEgZml4ZWQgcmFuZ2UuCisKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJ0E2JywKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdkYXRlJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gJzIwMDgtMDEtMDFUJywKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAnMjAwOC0xMi0xMlQnLAorICAgICAgICB9KTsKKworRXhhbXBsZSA3LiBEaXNwbGF5aW5nIGEgbWVzc2FnZSB3aGVuIHRoZSBjZWxsIGlzIHNlbGVjdGVkLgorCisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCdBNycsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgfSk7CisKK1NlZSBhbHNvIHRoZSBDPGRhdGFfdmFsaWRhdGUucGw+IHByb2dyYW0gaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgRk9STVVMQVMgQU5EIEZVTkNUSU9OUyBJTiBFWENFTAorCisKKz1oZWFkMiBDYXZlYXRzCisKK1RoZSBmaXJzdCB0aGluZyB0byBub3RlIGlzIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHNvbWUgb3V0c3RhbmRpbmcgaXNzdWVzIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9mIGZvcm11bGFzIGFuZCBmdW5jdGlvbnM6CisKKyAgICAxLiBXcml0aW5nIGEgZm9ybXVsYSBpcyBtdWNoIHNsb3dlciB0aGFuIHdyaXRpbmcgdGhlIGVxdWl2YWxlbnQgc3RyaW5nLgorICAgIDIuIFlvdSBjYW5ub3QgdXNlIGFycmF5IGNvbnN0YW50cywgaS5lLiB7MTsyOzN9LCBpbiBmdW5jdGlvbnMuCisgICAgMy4gVW5hcnkgbWludXMgaXNuJ3Qgc3VwcG9ydGVkLgorICAgIDQuIFdoaXRlc3BhY2UgaXMgbm90IHByZXNlcnZlZCBhcm91bmQgb3BlcmF0b3JzLgorICAgIDUuIE5hbWVkIHJhbmdlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICA2LiBBcnJheSBmb3JtdWxhcyBhcmUgbm90IHN1cHBvcnRlZC4KKworSG93ZXZlciwgdGhlc2UgY29uc3RyYWludHMgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gVGhleSBhcmUgaGVyZSBiZWNhdXNlIG9mIGEgdHJhZGUtb2ZmIGJldHdlZW4gZmVhdHVyZXMgYW5kIHRpbWUuIEFsc28sIGl0IGlzIHBvc3NpYmxlIHRvIHdvcmsgYXJvdW5kIGlzc3VlIDEgdXNpbmcgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiBhbmQgQzxyZXBlYXRfZm9ybXVsYSgpPiBtZXRob2RzIGFzIGRlc2NyaWJlZCBsYXRlciBpbiB0aGlzIHNlY3Rpb24uCisKKworCis9aGVhZDIgSW50cm9kdWN0aW9uCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gZm9ybXVsYXMgYW5kIGZ1bmN0aW9ucyBpbiBFeGNlbCBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK0EgZm9ybXVsYSBpcyBhIHN0cmluZyB0aGF0IGJlZ2lucyB3aXRoIGFuIGVxdWFscyBzaWduOgorCisgICAgJz1BMStCMScKKyAgICAnPUFWRVJBR0UoMSwgMiwgMyknCisKK1RoZSBmb3JtdWxhIGNhbiBjb250YWluIG51bWJlcnMsIHN0cmluZ3MsIGJvb2xlYW4gdmFsdWVzLCBjZWxsIHJlZmVyZW5jZXMsIGNlbGwgcmFuZ2VzIGFuZCBmdW5jdGlvbnMuIE5hbWVkIHJhbmdlcyBhcmUgbm90IHN1cHBvcnRlZC4gRm9ybXVsYXMgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhleSBhcHBlYXIgaW4gRXhjZWwsIHRoYXQgaXMgY2VsbHMgYW5kIGZ1bmN0aW9ucyBtdXN0IGJlIGluIHVwcGVyY2FzZS4KKworQ2VsbHMgaW4gRXhjZWwgYXJlIHJlZmVyZW5jZWQgdXNpbmcgdGhlIEExIG5vdGF0aW9uIHN5c3RlbSB3aGVyZSB0aGUgY29sdW1uIGlzIGRlc2lnbmF0ZWQgYnkgYSBsZXR0ZXIgYW5kIHRoZSByb3cgYnkgYSBudW1iZXIuIENvbHVtbnMgcmFuZ2UgZnJvbSBBIHRvIElWIGkuZS4gMCB0byAyNTUsIHJvd3MgcmFuZ2UgZnJvbSAxIHRvIDY1NTM2LiBUaGUgQzxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlIHRoYXQgaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RybyBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworCisgICAgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCitUaGUgRXhjZWwgQzwkPiBub3RhdGlvbiBpbiBjZWxsIHJlZmVyZW5jZXMgaXMgYWxzbyBzdXBwb3J0ZWQuIFRoaXMgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoZXRoZXIgYSByb3cgb3IgY29sdW1uIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlLiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBpZiB0aGUgY2VsbCBpcyBjb3BpZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyByZWxhdGl2ZSBhbmQgYWJzb2x1dGUgdmFsdWVzLgorCisgICAgJz1BMScgICAjIENvbHVtbiBhbmQgcm93IGFyZSByZWxhdGl2ZQorICAgICc9JEExJyAgIyBDb2x1bW4gaXMgYWJzb2x1dGUgYW5kIHJvdyBpcyByZWxhdGl2ZQorICAgICc9QSQxJyAgIyBDb2x1bW4gaXMgcmVsYXRpdmUgYW5kIHJvdyBpcyBhYnNvbHV0ZQorICAgICc9JEEkMScgIyBDb2x1bW4gYW5kIHJvdyBhcmUgYWJzb2x1dGUKKworRm9ybXVsYXMgY2FuIGFsc28gcmVmZXIgdG8gY2VsbHMgaW4gb3RoZXIgd29ya3NoZWV0cyBvZiB0aGUgY3VycmVudCB3b3JrYm9vay4gRm9yIGV4YW1wbGU6CisKKyAgICAnPVNoZWV0MiFBMScKKyAgICAnPVNoZWV0MiFBMTpBNScKKyAgICAnPVNoZWV0MjpTaGVldDMhQTEnCisgICAgJz1TaGVldDI6U2hlZXQzIUExOkE1JworICAgIHF7PSdUZXN0IERhdGEnIUExfQorICAgIHF7PSdUZXN0IERhdGExOlRlc3QgRGF0YTInIUExfQorCitUaGUgc2hlZXQgcmVmZXJlbmNlIGFuZCB0aGUgY2VsbCByZWZlcmVuY2UgYXJlIHNlcGFyYXRlZCBieSAgQzwhPiB0aGUgZXhjbGFtYXRpb24gbWFyayBzeW1ib2wuIElmIHdvcmtzaGVldCBuYW1lcyBjb250YWluIHNwYWNlcywgY29tbWFzIG8gcGFyZW50aGVzZXMgdGhlbiBFeGNlbCByZXF1aXJlcyB0aGF0IHRoZSBuYW1lIGlzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXMgc2hvd24gaW4gdGhlIGxhc3QgdHdvIGV4YW1wbGVzIGFib3ZlLiBJbiBvcmRlciB0byBhdm9pZCB1c2luZyBhIGxvdCBvZiBlc2NhcGUgY2hhcmFjdGVycyB5b3UgY2FuIHVzZSB0aGUgcXVvdGUgb3BlcmF0b3IgQzxxe30+IHRvIHByb3RlY3QgdGhlIHF1b3Rlcy4gU2VlIEM8cGVybG9wPiBpbiB0aGUgbWFpbiBQZXJsIGRvY3VtZW50YXRpb24uIE9ubHkgdmFsaWQgc2hlZXQgbmFtZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdXNpbmcgdGhlIEM8YWRkX3dvcmtzaGVldCgpPiBtZXRob2QgY2FuIGJlIHVzZWQgaW4gZm9ybXVsYXMuIFlvdSBjYW5ub3QgcmVmZXJlbmNlIGV4dGVybmFsIHdvcmtib29rcy4KKworCitUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHRoZSBvcGVyYXRvcnMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIEV4Y2VsJ3MgZm9ybXVsYXMuIFRoZSBtYWpvcml0eSBvZiB0aGUgb3BlcmF0b3JzIGFyZSB0aGUgc2FtZSBhcyBQZXJsJ3MsIGRpZmZlcmVuY2VzIGFyZSBpbmRpY2F0ZWQ6CisKKyAgICBBcml0aG1ldGljIG9wZXJhdG9yczoKKyAgICA9PT09PT09PT09PT09PT09PT09PT0KKyAgICBPcGVyYXRvciAgTWVhbmluZyAgICAgICAgICAgICAgICAgICBFeGFtcGxlCisgICAgICAgKyAgICAgIEFkZGl0aW9uICAgICAgICAgICAgICAgICAgMSsyCisgICAgICAgLSAgICAgIFN1YnRyYWN0aW9uICAgICAgICAgICAgICAgMi0xCisgICAgICAgKiAgICAgIE11bHRpcGxpY2F0aW9uICAgICAgICAgICAgMiozCisgICAgICAgLyAgICAgIERpdmlzaW9uICAgICAgICAgICAgICAgICAgMS80CisgICAgICAgXiAgICAgIEV4cG9uZW50aWF0aW9uICAgICAgICAgICAgMl4zICAgICAgIyBFcXVpdmFsZW50IHRvICoqCisgICAgICAgLSAgICAgIFVuYXJ5IG1pbnVzICAgICAgICAgICAgICAgLSgxKzIpICAgIyBOb3QgeWV0IHN1cHBvcnRlZAorICAgICAgICUgICAgICBQZXJjZW50IChOb3QgbW9kdWx1cykgICAgIDEzJSAgICAgICMgTm90IHN1cHBvcnRlZCwgWzFdCisKKworICAgIENvbXBhcmlzb24gb3BlcmF0b3JzOgorICAgID09PT09PT09PT09PT09PT09PT09PQorICAgIE9wZXJhdG9yICBNZWFuaW5nICAgICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgPSAgICAgRXF1YWwgdG8gICAgICAgICAgICAgICAgICBBMSA9ICBCMSAjIEVxdWl2YWxlbnQgdG8gPT0KKyAgICAgICAgPD4gICAgTm90IGVxdWFsIHRvICAgICAgICAgICAgICBBMSA8PiBCMSAjIEVxdWl2YWxlbnQgdG8gIT0KKyAgICAgICAgPiAgICAgR3JlYXRlciB0aGFuICAgICAgICAgICAgICBBMSA+ICBCMQorICAgICAgICA8ICAgICBMZXNzIHRoYW4gICAgICAgICAgICAgICAgIEExIDwgIEIxCisgICAgICAgID49ICAgIEdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAgQTEgPj0gQjEKKyAgICAgICAgPD0gICAgTGVzcyB0aGFuIG9yIGVxdWFsIHRvICAgICBBMSA8PSBCMQorCisKKyAgICBTdHJpbmcgb3BlcmF0b3I6CisgICAgPT09PT09PT09PT09PT09PQorICAgIE9wZXJhdG9yICBNZWFuaW5nICAgICAgICAgICAgICAgICAgIEV4YW1wbGUKKyAgICAgICAgJiAgICAgQ29uY2F0ZW5hdGlvbiAgICAgICAgICAgICAiSGVsbG8gIiAmICJXb3JsZCEiICMgWzJdCisKKworICAgIFJlZmVyZW5jZSBvcGVyYXRvcnM6CisgICAgPT09PT09PT09PT09PT09PT09PT0KKyAgICBPcGVyYXRvciAgTWVhbmluZyAgICAgICAgICAgICAgICAgICBFeGFtcGxlCisgICAgICAgIDogICAgIFJhbmdlIG9wZXJhdG9yICAgICAgICAgICAgQTE6QTQgICAgICAgICAgICAgICAjIFszXQorICAgICAgICAsICAgICBVbmlvbiBvcGVyYXRvciAgICAgICAgICAgIFNVTSgxLCAyKzIsIEIzKSAgICAgIyBbNF0KKworCisgICAgTm90ZXM6CisgICAgWzFdOiBZb3UgY2FuIGdldCBhIHBlcmNlbnRhZ2Ugd2l0aCBmb3JtYXR0aW5nIGFuZCBtb2R1bHVzIHdpdGggTU9EKCkuCisgICAgWzJdOiBFcXVpdmFsZW50IHRvICgiSGVsbG8gIiAuICJXb3JsZCEiKSBpbiBQZXJsLgorICAgIFszXTogVGhpcyByYW5nZSBpcyBlcXVpdmFsZW50IHRvIGNlbGxzIEExLCBBMiwgQTMgYW5kIEE0LgorICAgIFs0XTogVGhlIGNvbW1hIGJlaGF2ZXMgbGlrZSB0aGUgbGlzdCBzZXBhcmF0b3IgaW4gUGVybC4KKworVGhlIHJhbmdlIGFuZCBjb21tYSBvcGVyYXRvcnMgY2FuIGhhdmUgZGlmZmVyZW50IHN5bWJvbHMgaW4gbm9uLUVuZ2xpc2ggdmVyc2lvbnMgb2YgRXhjZWwuIFRoZXNlIHdpbGwgYmUgc3VwcG9ydGVkIGluIGEgbGF0ZXIgdmVyc2lvbiBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gRXVyb3BlYW4gdXNlcnMgb2YgRXhjZWwgdGFrZSBub3RlOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oMTsgMjsgMyknKTsgIyBXcm9uZyEhCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJz1TVU0oMSwgMiwgMyknKTsgIyBPa2F5CisKK1RoZSBmb2xsb3dpbmcgdGFibGUgbGlzdHMgYWxsIG9mIHRoZSBjb3JlIGZ1bmN0aW9ucyBzdXBwb3J0ZWQgYnkgRXhjZWwgNSBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIEFueSBhZGRpdGlvbmFsIGZ1bmN0aW9ucyB0aGF0IGFyZSBhdmFpbGFibGUgdGhyb3VnaCB0aGUgIkFuYWx5c2lzIFRvb2xQYWsiIG9yIG90aGVyIGFkZC1pbnMgYXJlIG5vdCBzdXBwb3J0ZWQuIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGFsbCBiZWVuIHRlc3RlZCB0byB2ZXJpZnkgdGhhdCB0aGV5IHdvcmsuCisKKyAgICBBQlMgICAgICAgICAgIERCICAgICAgICAgICAgSU5ESVJFQ1QgICAgICBOT1JNSU5WICAgICAgIFNMTgorICAgIEFDT1MgICAgICAgICAgRENPVU5UICAgICAgICBJTkZPICAgICAgICAgIE5PUk1TRElTVCAgICAgU0xPUEUKKyAgICBBQ09TSCAgICAgICAgIERDT1VOVEEgICAgICAgSU5UICAgICAgICAgICBOT1JNU0lOViAgICAgIFNNQUxMCisgICAgQUREUkVTUyAgICAgICBEREIgICAgICAgICAgIElOVEVSQ0VQVCAgICAgTk9UICAgICAgICAgICBTUVJUCisgICAgQU5EICAgICAgICAgICBERUdSRUVTICAgICAgIElQTVQgICAgICAgICAgTk9XICAgICAgICAgICBTVEFOREFSRElaRQorICAgIEFSRUFTICAgICAgICAgREVWU1EgICAgICAgICBJUlIgICAgICAgICAgIE5QRVIgICAgICAgICAgU1RERVYKKyAgICBBU0lOICAgICAgICAgIERHRVQgICAgICAgICAgSVNCTEFOSyAgICAgICBOUFYgICAgICAgICAgIFNUREVWUAorICAgIEFTSU5IICAgICAgICAgRE1BWCAgICAgICAgICBJU0VSUiAgICAgICAgIE9ERCAgICAgICAgICAgU1RFWVgKKyAgICBBVEFOICAgICAgICAgIERNSU4gICAgICAgICAgSVNFUlJPUiAgICAgICBPRkZTRVQgICAgICAgIFNVQlNUSVRVVEUKKyAgICBBVEFOMiAgICAgICAgIERPTExBUiAgICAgICAgSVNMT0dJQ0FMICAgICBPUiAgICAgICAgICAgIFNVQlRPVEFMCisgICAgQVRBTkggICAgICAgICBEUFJPRFVDVCAgICAgIElTTkEgICAgICAgICAgUEVBUlNPTiAgICAgICBTVU0KKyAgICBBVkVERVYgICAgICAgIERTVERFViAgICAgICAgSVNOT05URVhUICAgICBQRVJDRU5USUxFICAgIFNVTUlGCisgICAgQVZFUkFHRSAgICAgICBEU1RERVZQICAgICAgIElTTlVNQkVSICAgICAgUEVSQ0VOVFJBTksgICBTVU1QUk9EVUNUCisgICAgQkVUQURJU1QgICAgICBEU1VNICAgICAgICAgIElTUkVGICAgICAgICAgUEVSTVVUICAgICAgICBTVU1TUQorICAgIEJFVEFJTlYgICAgICAgRFZBUiAgICAgICAgICBJU1RFWFQgICAgICAgIFBJICAgICAgICAgICAgU1VNWDJNWTIKKyAgICBCSU5PTURJU1QgICAgIERWQVJQICAgICAgICAgS1VSVCAgICAgICAgICBQTVQgICAgICAgICAgIFNVTVgyUFkyCisgICAgQ0FMTCAgICAgICAgICBFUlJPUi5UWVBFICAgIExBUkdFICAgICAgICAgUE9JU1NPTiAgICAgICBTVU1YTVkyCisgICAgQ0VJTElORyAgICAgICBFVkVOICAgICAgICAgIExFRlQgICAgICAgICAgUE9XRVIgICAgICAgICBTWUQKKyAgICBDRUxMICAgICAgICAgIEVYQUNUICAgICAgICAgTEVOICAgICAgICAgICBQUE1UICAgICAgICAgIFQKKyAgICBDSEFSICAgICAgICAgIEVYUCAgICAgICAgICAgTElORVNUICAgICAgICBQUk9CICAgICAgICAgIFRBTgorICAgIENISURJU1QgICAgICAgRVhQT05ESVNUICAgICBMTiAgICAgICAgICAgIFBST0RVQ1QgICAgICAgVEFOSAorICAgIENISUlOViAgICAgICAgRkFDVCAgICAgICAgICBMT0cgICAgICAgICAgIFBST1BFUiAgICAgICAgVERJU1QKKyAgICBDSElURVNUICAgICAgIEZBTFNFICAgICAgICAgTE9HMTAgICAgICAgICBQViAgICAgICAgICAgIFRFWFQKKyAgICBDSE9PU0UgICAgICAgIEZESVNUICAgICAgICAgTE9HRVNUICAgICAgICBRVUFSVElMRSAgICAgIFRJTUUKKyAgICBDTEVBTiAgICAgICAgIEZJTkQgICAgICAgICAgTE9HSU5WICAgICAgICBSQURJQU5TICAgICAgIFRJTUVWQUxVRQorICAgIENPREUgICAgICAgICAgRklOViAgICAgICAgICBMT0dOT1JNRElTVCAgIFJBTkQgICAgICAgICAgVElOVgorICAgIENPTFVNTiAgICAgICAgRklTSEVSICAgICAgICBMT09LVVAgICAgICAgIFJBTksgICAgICAgICAgVE9EQVkKKyAgICBDT0xVTU5TICAgICAgIEZJU0hFUklOViAgICAgTE9XRVIgICAgICAgICBSQVRFICAgICAgICAgIFRSQU5TUE9TRQorICAgIENPTUJJTiAgICAgICAgRklYRUQgICAgICAgICBNQVRDSCAgICAgICAgIFJFR0lTVEVSLklEICAgVFJFTkQKKyAgICBDT05DQVRFTkFURSAgIEZMT09SICAgICAgICAgTUFYICAgICAgICAgICBSRVBMQUNFICAgICAgIFRSSU0KKyAgICBDT05GSURFTkNFICAgIEZPUkVDQVNUICAgICAgTURFVEVSTSAgICAgICBSRVBUICAgICAgICAgIFRSSU1NRUFOCisgICAgQ09SUkVMICAgICAgICBGUkVRVUVOQ1kgICAgIE1FRElBTiAgICAgICAgUklHSFQgICAgICAgICBUUlVFCisgICAgQ09TICAgICAgICAgICBGVEVTVCAgICAgICAgIE1JRCAgICAgICAgICAgUk9NQU4gICAgICAgICBUUlVOQworICAgIENPU0ggICAgICAgICAgRlYgICAgICAgICAgICBNSU4gICAgICAgICAgIFJPVU5EICAgICAgICAgVFRFU1QKKyAgICBDT1VOVCAgICAgICAgIEdBTU1BRElTVCAgICAgTUlOVVRFICAgICAgICBST1VORERPV04gICAgIFRZUEUKKyAgICBDT1VOVEEgICAgICAgIEdBTU1BSU5WICAgICAgTUlOVkVSU0UgICAgICBST1VORFVQICAgICAgIFVQUEVSCisgICAgQ09VTlRCTEFOSyAgICBHQU1NQUxOICAgICAgIE1JUlIgICAgICAgICAgUk9XICAgICAgICAgICBWQUxVRQorICAgIENPVU5USUYgICAgICAgR0VPTUVBTiAgICAgICBNTVVMVCAgICAgICAgIFJPV1MgICAgICAgICAgVkFSCisgICAgQ09WQVIgICAgICAgICBHUk9XVEggICAgICAgIE1PRCAgICAgICAgICAgUlNRICAgICAgICAgICBWQVJQCisgICAgQ1JJVEJJTk9NICAgICBIQVJNRUFOICAgICAgIE1PREUgICAgICAgICAgU0VBUkNIICAgICAgICBWREIKKyAgICBEQVRFICAgICAgICAgIEhMT09LVVAgICAgICAgTU9OVEggICAgICAgICBTRUNPTkQgICAgICAgIFZMT09LVVAKKyAgICBEQVRFVkFMVUUgICAgIEhPVVIgICAgICAgICAgTiAgICAgICAgICAgICBTSUdOICAgICAgICAgIFdFRUtEQVkKKyAgICBEQVZFUkFHRSAgICAgIEhZUEdFT01ESVNUICAgTkEgICAgICAgICAgICBTSU4gICAgICAgICAgIFdFSUJVTEwKKyAgICBEQVkgICAgICAgICAgIElGICAgICAgICAgICAgTkVHQklOT01ESVNUICBTSU5IICAgICAgICAgIFlFQVIKKyAgICBEQVlTMzYwICAgICAgIElOREVYICAgICAgICAgTk9STURJU1QgICAgICBTS0VXICAgICAgICAgIFpURVNUCisKK1lvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIG1vZHVsZSB0byBzdXBwb3J0IGZ1bmN0aW9uIG5hbWVzIGluIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBHZXJtYW4sIEZyZW5jaCwgU3BhbmlzaCwgUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guIFNlZSB0aGUgQzxmdW5jdGlvbl9sb2NhbGUucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCitGb3IgYSBnZW5lcmFsIGludHJvZHVjdGlvbiB0byBFeGNlbCdzIGZvcm11bGFzIGFuZCBhbiBleHBsYW5hdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoZSBmdW5jdGlvbiByZWZlciB0byB0aGUgRXhjZWwgaGVscCBmaWxlcyBvciB0aGUgZm9sbG93aW5nOiBMPGh0dHA6Ly9vZmZpY2UubWljcm9zb2Z0LmNvbS9lbi11cy9hc3Npc3RhbmNlL0NIMDYyNTI4MDMxMDMzLmFzcHg+LgorCitJZiB5b3VyIGZvcm11bGEgZG9lc24ndCB3b3JrIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRyeSB0aGUgZm9sbG93aW5nOgorCisgICAgMS4gVmVyaWZ5IHRoYXQgdGhlIGZvcm11bGEgd29ya3MgaW4gRXhjZWwgKG9yIEdudW1lcmljIG9yIE9wZW5PZmZpY2Uub3JnKS4KKyAgICAyLiBFbnN1cmUgdGhhdCBpdCBpc24ndCBvbiB0aGUgQ2F2ZWF0cyBsaXN0IHNob3duIGFib3ZlLgorICAgIDMuIEVuc3VyZSB0aGF0IGNlbGwgcmVmZXJlbmNlcyBhbmQgZm9ybXVsYSBuYW1lcyBhcmUgaW4gdXBwZXJjYXNlLgorICAgIDQuIEVuc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgJzonIGFzIHRoZSByYW5nZSBvcGVyYXRvciwgQTE6QTQuCisgICAgNS4gRW5zdXJlIHRoYXQgeW91IGFyZSB1c2luZyAnLCcgYXMgdGhlIHVuaW9uIG9wZXJhdG9yLCBTVU0oMSwyLDMpLgorICAgIDYuIEVuc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBpbiB0aGUgYWJvdmUgdGFibGUuCisKK0lmIHlvdSBnbyB0aHJvdWdoIHN0ZXBzIDEtNiBhbmQgeW91IHN0aWxsIGhhdmUgYSBwcm9ibGVtLCBtYWlsIG1lLgorCisKKworCis9aGVhZDIgSW1wcm92aW5nIHBlcmZvcm1hbmNlIHdoZW4gd29ya2luZyB3aXRoIGZvcm11bGFzCisKK1dyaXRpbmcgYSBsYXJnZSBudW1iZXIgb2YgZm9ybXVsYXMgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjYW4gYmUgc2xvdy4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdCBlYWNoIGZvcm11bGEgaGFzIHRvIGJlIHBhcnNlZCBhbmQgd2l0aCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB0aGlzIGlzIGNvbXB1dGF0aW9uYWxseSBleHBlbnNpdmUuCisKK0hvd2V2ZXIsIGluIGEgbG90IG9mIGNhc2VzIHRoZSBmb3JtdWxhcyB0aGF0IHlvdSB3cml0ZSB3aWxsIGJlIHF1aXRlIHNpbWlsYXIsIGZvciBleGFtcGxlOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjEnLCAgICAnPUExICogMyArIDUwJywgICAgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjInLCAgICAnPUEyICogMyArIDUwJywgICAgJGZvcm1hdCk7CisgICAgLi4uCisgICAgLi4uCisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjk5JywgICAnPUE5OTkgKiAzICsgNTAnLCAgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgnQjEwMDAnLCAnPUExMDAwICogMyArIDUwJywgJGZvcm1hdCk7CisKK0luIHRoaXMgZXhhbXBsZSB0aGUgY2VsbCByZWZlcmVuY2UgY2hhbmdlcyBpbiBpdGVyYXRpb25zIGZyb20gQzxBMT4gdG8gQzxBMTAwMD4uIFRoZSBwYXJzZXIgdHJlYXRzIHRoaXMgdmFyaWFibGUgYXMgYSBJPHRva2VuPiBhbmQgYXJyYW5nZXMgaXQgYWNjb3JkaW5nIHRvIHByZWRlZmluZWQgcnVsZXMuIEhvd2V2ZXIsIHNpbmNlIHRoZSBwYXJzZXIgaXMgb2JsaXZpb3VzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdG9rZW4sIGl0IGlzIGVzc2VudGlhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgY2FsY3VsYXRpb24gMTAwMCB0aW1lcy4gVGhpcyBpcyBpbmVmZmljaWVudC4KKworVGhlIHdheSB0byBhdm9pZCB0aGlzIGluZWZmaWNpZW5jeSBhbmQgdGhlcmVieSBzcGVlZCB1cCB0aGUgd3JpdGluZyBvZiBmb3JtdWxhcyBpcyB0byBwYXJzZSB0aGUgZm9ybXVsYSBvbmNlIGFuZCB0aGVuIHJlcGVhdGVkbHkgc3Vic3RpdHV0ZSBzaW1pbGFyIHRva2Vucy4KKworQSBmb3JtdWxhIGNhbiBiZSBwYXJzZWQgYW5kIHN0b3JlZCB2aWEgdGhlIEM8c3RvcmVfZm9ybXVsYSgpPiB3b3Jrc2hlZXQgbWV0aG9kLiBZb3UgY2FuIHRoZW4gdXNlIHRoZSBDPHJlcGVhdF9mb3JtdWxhKCk+IG1ldGhvZCB0byBzdWJzdGl0dXRlIEM8JHBhdHRlcm4+LCBDPCRyZXBsYWNlPiBwYWlycyBpbiB0aGUgc3RvcmVkIGZvcm11bGE6CisKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSAqIDMgKyA1MCcpOworCisgICAgZm9yIG15ICRyb3cgKDAuLjk5OSkgeworICAgICAgICAkd29ya3NoZWV0LT5yZXBlYXRfZm9ybXVsYSgkcm93LCAxLCAkZm9ybXVsYSwgJGZvcm1hdCwgJ0ExJywgJ0EnLigkcm93ICsxKSk7CisgICAgfQorCitPbiBhbiBhcmJpdHJhcnkgdGVzdCBtYWNoaW5lIHRoaXMgbWV0aG9kIHdhcyAxMCB0aW1lcyBmYXN0ZXIgdGhhbiB0aGUgYnJ1dGUgZm9yY2UgbWV0aG9kIHNob3duIGFib3ZlLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcGFyc2VzIGFuZCBzdG9yZXMgZm9ybXVsYXMgc2VlIHRoZSBDPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtdWxhPiBtYW4gcGFnZS4KKworSXQgc2hvdWxkIGJlIG5vdGVkIGhvd2V2ZXIgdGhhdCB0aGUgb3ZlcmFsbCBzcGVlZCBvZiBkaXJlY3QgZm9ybXVsYSBwYXJzaW5nIHdpbGwgYmUgaW1wcm92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4KKworCisKKworPWhlYWQxIEVYQU1QTEVTCisKK1NlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpFeGFtcGxlcz4gZm9yIGEgZnVsbCBsaXN0IG9mIGV4YW1wbGVzLgorCisKKz1oZWFkMiBFeGFtcGxlIDEKKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHNvbWUgb2YgdGhlIGJhc2ljIGZlYXR1cmVzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdzaW1wbGUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBUaGUgZ2VuZXJhbCBzeW50YXggaXMgd3JpdGUoJHJvdywgJGNvbHVtbiwgJHRva2VuKS4gTm90ZSB0aGF0IHJvdyBhbmQKKyAgICAjIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisKKyAgICAjIFdyaXRlIHNvbWUgdGV4dAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICAnSGkgRXhjZWwhJyk7CisKKworICAgICMgV3JpdGUgc29tZSBudW1iZXJzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgIDMpOyAgICAgICAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgIDMuMDAwMDApOyAgICAjIFdyaXRlcyAzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgIDMuMDAwMDEpOyAgICAjIFdyaXRlcyAzLjAwMDAxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgIDMuMTQxNTkpOyAgICAjIFRlWCByZXZpc2lvbiBuby4/CisKKworICAgICMgV3JpdGUgc29tZSBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICAnPUEzICsgQTYnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJz1JRihBNT4zLCJZZXMiLCAiTm8iKScpOworCisKKyAgICAjIFdyaXRlIGEgaHlwZXJsaW5rCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTAsIDAsICdodHRwOi8vd3d3LnBlcmwuY29tLycpOworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYV9zaW1wbGUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhX3NpbXBsZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKworCis9aGVhZDIgRXhhbXBsZSAyCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBnZW5lcmFsIGV4YW1wbGUgd2hpY2ggZGVtb25zdHJhdGVzIHNvbWUgZmVhdHVyZXMgb2Ygd29ya2luZyB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdyZWdpb25zLnhscycpOworCisgICAgIyBBZGQgc29tZSB3b3Jrc2hlZXRzCisgICAgbXkgJG5vcnRoID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdOb3J0aCcpOworICAgIG15ICRzb3V0aCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnU291dGgnKTsKKyAgICBteSAkZWFzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0Vhc3QnKTsKKyAgICBteSAkd2VzdCAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1dlc3QnKTsKKworICAgICMgQWRkIGEgRm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisKKyAgICAjIEFkZCBhIGNhcHRpb24gdG8gZWFjaCB3b3Jrc2hlZXQKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ1NhbGVzJywgJGZvcm1hdCk7CisgICAgfQorCisgICAgIyBXcml0ZSBzb21lIGRhdGEKKyAgICAkbm9ydGgtPndyaXRlKDAsIDEsIDIwMDAwMCk7CisgICAgJHNvdXRoLT53cml0ZSgwLCAxLCAxMDAwMDApOworICAgICRlYXN0LT53cml0ZSAoMCwgMSwgMTUwMDAwKTsKKyAgICAkd2VzdC0+d3JpdGUgKDAsIDEsIDEwMDAwMCk7CisKKyAgICAjIFNldCB0aGUgYWN0aXZlIHdvcmtzaGVldAorICAgICRzb3V0aC0+YWN0aXZhdGUoKTsKKworICAgICMgU2V0IHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgY29sdW1uCisgICAgJHNvdXRoLT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKworICAgICMgU2V0IHRoZSBhY3RpdmUgY2VsbAorICAgICRzb3V0aC0+c2V0X3NlbGVjdGlvbigwLCAxKTsKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlZ2lvbnMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByZWdpb25zLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworCisKKz1oZWFkMiBFeGFtcGxlIDMKKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSBjb25kaXRpb25hbCBudW1lcmljYWwgZm9ybWF0IHdpdGggY29sb3VycyB0byBpbmRpY2F0ZSBpZiBhIHNoYXJlIHByaWNlIGhhcyBnb25lIHVwIG9yIGRvd24uCisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnc3RvY2tzLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMSwgMiwgMyBhbmQgNAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMywgMTUpOworCisKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGNvbHVtbiBoZWFkaW5ncworICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfYm9sZCgpOworICAgICRoZWFkZXItPnNldF9zaXplKDEyKTsKKyAgICAkaGVhZGVyLT5zZXRfY29sb3IoJ2JsdWUnKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayBwcmljZQorICAgIG15ICRmX3ByaWNlID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZfcHJpY2UtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ByaWNlLT5zZXRfbnVtX2Zvcm1hdCgnJDAuMDAnKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayB2b2x1bWUKKyAgICBteSAkZl92b2x1bWUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl92b2x1bWUtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ZvbHVtZS0+c2V0X251bV9mb3JtYXQoJyMsIyMwJyk7CisKKworICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgcHJpY2UgY2hhbmdlLiBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYQorICAgICMgY29uZGl0aW9uYWwgZm9ybWF0LiBUaGUgbnVtYmVyIGlzIGZvcm1hdHRlZCBhcyBhIHBlcmNlbnRhZ2UuIElmIGl0IGlzCisgICAgIyBwb3NpdGl2ZSBpdCBpcyBmb3JtYXR0ZWQgaW4gZ3JlZW4sIGlmIGl0IGlzIG5lZ2F0aXZlIGl0IGlzIGZvcm1hdHRlZAorICAgICMgaW4gcmVkIGFuZCBpZiBpdCBpcyB6ZXJvIGl0IGlzIGZvcm1hdHRlZCBhcyB0aGUgZGVmYXVsdCBmb250IGNvbG91cgorICAgICMgKGluIHRoaXMgY2FzZSBibGFjaykuIE5vdGU6IHRoZSBbR3JlZW5dIGZvcm1hdCBwcm9kdWNlcyBhbiB1bmFwcGVhbGluZworICAgICMgbGltZSBncmVlbi4gVHJ5IFtDb2xvciAxMF0gaW5zdGVhZCBmb3IgYSBkYXJrIGdyZWVuLgorICAgICMKKyAgICBteSAkZl9jaGFuZ2UgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl9jaGFuZ2UtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX2NoYW5nZS0+c2V0X251bV9mb3JtYXQoJ1tHcmVlbl0wLjAlO1tSZWRdLTAuMCU7MC4wJScpOworCisKKyAgICAjIFdyaXRlIG91dCB0aGUgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdDb21wYW55JywkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAnUHJpY2UnLCAgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ1ZvbHVtZScsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICdDaGFuZ2UnLCAkaGVhZGVyKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdEYW1hZ2UgSW5jLicgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAzMC4yNSwgICAgJGZfcHJpY2UgKTsgIyAkMzAuMjUKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAxMjM0NTY3LCAgJGZfdm9sdW1lKTsgIyAxLDIzNCw1NjcKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAwLjA4NSwgICAgJGZfY2hhbmdlKTsgIyA4LjUlIGluIGdyZWVuCisKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAnRHVtcCBDb3JwLicgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMSwgMS41NiwgICAgICRmX3ByaWNlICk7ICMgJDEuNTYKKyAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAyLCA3NTY0LCAgICAgJGZfdm9sdW1lKTsgIyA3LDU2NAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDMsIC0wLjAxNSwgICAkZl9jaGFuZ2UpOyAjIC0xLjUlIGluIHJlZAorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJ1JldiBMdGQuJyAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDEsIDAuMTMsICAgICAkZl9wcmljZSApOyAjICQwLjEzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgMzIxLCAgICAgICRmX3ZvbHVtZSk7ICMgMzIxCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMywgMCwgICAgICAgICRmX2NoYW5nZSk7ICMgMCBpbiB0aGUgZm9udCBjb2xvciAoYmxhY2spCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdG9ja3MuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBzdG9ja3MucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCisKKworPWhlYWQyIEV4YW1wbGUgNAorCitUaGUgZm9sbG93aW5nIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgZnVuY3Rpb25zLgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnc3RhdHMueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCBkYXRhJyk7CisKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKworCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBoZWFkaW5ncworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworCisKKyAgICAjIFdyaXRlIHRoZSBzYW1wbGUgZGF0YQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdTYW1wbGUnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCA0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA1LCA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA2LCA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA3LCA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA4LCA4KTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdMZW5ndGgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAyNC44KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA0LCAyNS4wKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAyNS4zKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA2LCAyNC45KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA3LCAyNS4yKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA4LCAyNC44KTsKKworICAgICMgV3JpdGUgc29tZSBzdGF0aXN0aWNhbCBmdW5jdGlvbnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAgMCwgJ0NvdW50JywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgIDEsICc9Q09VTlQoQjE6STEpJyk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAgMCwgJ1N1bScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsICAxLCAnPVNVTShCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAwLCAnQXZlcmFnZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAxLCAnPUFWRVJBR0UoQjI6STIpJyk7CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMCwgJ01pbicsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsICAxLCAnPU1JTihCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDgsICAwLCAnTWF4JywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoOCwgIDEsICc9TUFYKEIyOkkyKScpOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsICdTdGFuZGFyZCBEZXZpYXRpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg5LCAgMSwgJz1TVERFVihCMjpJMiknKTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEwLCAwLCAnS3VydG9zaXMnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMSwgJz1LVVJUKEIyOkkyKScpOworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc3RhdHMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBzdGF0cy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKworCis9aGVhZDIgRXhhbXBsZSA1CisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb252ZXJ0cyBhIHRhYiBzZXBhcmF0ZWQgZmlsZSBjYWxsZWQgQzx0YWIudHh0PiBpbnRvIGFuIEV4Y2VsIGZpbGUgY2FsbGVkIEM8dGFiLnhscz4uCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgb3BlbiAoVEFCRklMRSwgJ3RhYi50eHQnKSBvciBkaWUgInRhYi50eHQ6ICQhIjsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd0YWIueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgIyBSb3cgYW5kIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisgICAgbXkgJHJvdyA9IDA7CisKKyAgICB3aGlsZSAoPFRBQkZJTEU+KSB7CisgICAgICAgIGNob21wOworICAgICAgICAjIFNwbGl0IG9uIHNpbmdsZSB0YWIKKyAgICAgICAgbXkgQEZsZCA9IHNwbGl0KCdcdCcsICRfKTsKKworICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEBGbGQpIHsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wsICR0b2tlbik7CisgICAgICAgICAgICAkY29sKys7CisgICAgICAgIH0KKyAgICAgICAgJHJvdysrOworICAgIH0KKworCitOT1RFOiBUaGlzIGlzIGEgc2ltcGxlIGNvbnZlcnNpb24gcHJvZ3JhbSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzIG9ubHkuIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkIHRleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcyBwYXJ0IG9mIEguTWVyaWpuIEJyYW5kJ3MgVGV4dDo6Q1NWX1hTIG1vZHVsZSBkaXN0cm8uCisKK1NlZSB0aGUgZXhhbXBsZXMvY3N2MnhscyBsaW5rIGhlcmU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4uCisKKworCisKKz1oZWFkMiBBZGRpdGlvbmFsIEV4YW1wbGVzCisKK1RoZSBmb2xsb3dpbmcgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZXhhbXBsZSBmaWxlcyB0aGF0IGFyZSBwcm92aWRlZAoraW4gdGhlIHN0YW5kYXJkIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRpc3RyaWJ1dGlvbi4gVGhleSBkZW1vbnN0cmF0ZSB0aGUKK2RpZmZlcmVudCBmZWF0dXJlcyBhbmQgb3B0aW9ucyBvZiB0aGUgbW9kdWxlLgorU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkV4YW1wbGVzPiBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgR2V0dGluZyBzdGFydGVkCisgICAgPT09PT09PT09PT09PT09CisgICAgYV9zaW1wbGUucGwgICAgICAgICAgICAgQSBnZXQgc3RhcnRlZCBleGFtcGxlIHdpdGggc29tZSBiYXNpYyBmZWF0dXJlcy4KKyAgICBkZW1vLnBsICAgICAgICAgICAgICAgICBBIGRlbW8gb2Ygc29tZSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLgorICAgIHJlZ2lvbnMucGwgICAgICAgICAgICAgIEEgc2ltcGxlIGV4YW1wbGUgb2YgbXVsdGlwbGUgd29ya3NoZWV0cy4KKyAgICBzdGF0cy5wbCAgICAgICAgICAgICAgICBCYXNpYyBmb3JtdWxhcyBhbmQgZnVuY3Rpb25zLgorICAgIGZvcm1hdHMucGwgICAgICAgICAgICAgIEFsbCB0aGUgYXZhaWxhYmxlIGZvcm1hdHRpbmcgb24gc2V2ZXJhbCB3b3Jrc2hlZXRzLgorICAgIGJ1Z19yZXBvcnQucGwgICAgICAgICAgIEEgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYnVnIHJlcG9ydHMuCisKKworICAgIEFkdmFuY2VkCisgICAgPT09PT09PT0KKyAgICBhdXRvZmlsdGVyLnBsICAgICAgICAgICBFeGFtcGxlcyBvZiB3b3Jrc2hlZXQgYXV0b2ZpbHRlcnMuCisgICAgYXV0b2ZpdC5wbCAgICAgICAgICAgICAgU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorICAgIGJpZ2ZpbGUucGwgICAgICAgICAgICAgIFdyaXRlIHBhc3QgdGhlIDdNQiBsaW1pdCB3aXRoIE9MRTo6U3RvcmFnZV9MaXRlLgorICAgIGNnaS5wbCAgICAgICAgICAgICAgICAgIEEgc2ltcGxlIENHSSBwcm9ncmFtLgorICAgIGNoYXJ0X2FyZWEucGwgICAgICAgICAgIEEgZGVtbyBvZiBhcmVhIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9iYXIucGwgICAgICAgICAgICBBIGRlbW8gb2YgYmFyICh2ZXJ0aWNhbCBoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9jb2x1bW4ucGwgICAgICAgICBBIGRlbW8gb2YgY29sdW1uIChoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKyAgICBjaGFydF9saW5lLnBsICAgICAgICAgICBBIGRlbW8gb2YgbGluZSBzdHlsZSBjaGFydHMuCisgICAgY2hhcnRfcGllLnBsICAgICAgICAgICAgQSBkZW1vIG9mIHBpZSBzdHlsZSBjaGFydHMuCisgICAgY2hhcnRfc2NhdHRlci5wbCAgICAgICAgQSBkZW1vIG9mIHNjYXR0ZXIgc3R5bGUgY2hhcnRzLgorICAgIGNoYXJ0X3N0b2NrLnBsICAgICAgICAgIEEgZGVtbyBvZiBzdG9jayBzdHlsZSBjaGFydHMuCisgICAgY2hlc3MucGwgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiByZXVzaW5nIGZvcm1hdHRpbmcgdmlhIHByb3BlcnRpZXMuCisgICAgY29sb3JzLnBsICAgICAgICAgICAgICAgQSBkZW1vIG9mIHRoZSBjb2xvdXIgcGFsZXR0ZSBhbmQgbmFtZWQgY29sb3Vycy4KKyAgICBjb21tZW50czEucGwgICAgICAgICAgICBBZGQgY29tbWVudHMgdG8gd29ya3NoZWV0IGNlbGxzLgorICAgIGNvbW1lbnRzMi5wbCAgICAgICAgICAgIEFkZCBjb21tZW50cyB3aXRoIGFkdmFuY2VkIG9wdGlvbnMuCisgICAgY29weWZvcm1hdC5wbCAgICAgICAgICAgRXhhbXBsZSBvZiBjb3B5aW5nIGEgY2VsbCBmb3JtYXQuCisgICAgZGF0YV92YWxpZGF0ZS5wbCAgICAgICAgQW4gZXhhbXBsZSBvZiBkYXRhIHZhbGlkYXRpb24gYW5kIGRyb3Bkb3duIGxpc3RzLgorICAgIGRhdGVfdGltZS5wbCAgICAgICAgICAgIFdyaXRlIGRhdGVzIGFuZCB0aW1lcyB3aXRoIHdyaXRlX2RhdGVfdGltZSgpLgorICAgIGRlZmluZWRfbmFtZS5wbCAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzLgorICAgIGRpYWdfYm9yZGVyLnBsICAgICAgICAgIEEgc2ltcGxlIGV4YW1wbGUgb2YgZGlhZ29uYWwgY2VsbCBib3JkZXJzLgorICAgIGVhc3Rlcl9lZ2cucGwgICAgICAgICAgIEV4cG9zZSB0aGUgRXhjZWw5NyBmbGlnaHQgc2ltdWxhdG9yLgorICAgIGZpbGVoYW5kbGUucGwgICAgICAgICAgIEV4YW1wbGVzIG9mIHdvcmtpbmcgd2l0aCBmaWxlaGFuZGxlcy4KKyAgICBmb3JtdWxhX3Jlc3VsdC5wbCAgICAgICBGb3JtdWxhcyB3aXRoIHVzZXIgc3BlY2lmaWVkIHJlc3VsdHMuCisgICAgaGVhZGVycy5wbCAgICAgICAgICAgICAgRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGhlYWRlcnMgYW5kIGZvb3RlcnMuCisgICAgaGlkZV9zaGVldC5wbCAgICAgICAgICAgU2ltcGxlIGV4YW1wbGUgb2YgaGlkaW5nIGEgd29ya3NoZWV0LgorICAgIGh5cGVybGluazEucGwgICAgICAgICAgIFNob3dzIGhvdyB0byBjcmVhdGUgd2ViIGh5cGVybGlua3MuCisgICAgaHlwZXJsaW5rMi5wbCAgICAgICAgICAgRXhhbXBsZXMgb2YgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGh5cGVybGlua3MuCisgICAgaW1hZ2VzLnBsICAgICAgICAgICAgICAgQWRkaW5nIGltYWdlcyB0byB3b3Jrc2hlZXRzLgorICAgIGluZGVudC5wbCAgICAgICAgICAgICAgIEFuIGV4YW1wbGUgb2YgY2VsbCBpbmRlbnRhdGlvbi4KKyAgICBtZXJnZTEucGwgICAgICAgICAgICAgICBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZy4KKyAgICBtZXJnZTIucGwgICAgICAgICAgICAgICBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisgICAgbWVyZ2UzLnBsICAgICAgICAgICAgICAgQWRkIGh5cGVybGlua3MgdG8gbWVyZ2VkIGNlbGxzLgorICAgIG1lcmdlNC5wbCAgICAgICAgICAgICAgIEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisgICAgbWVyZ2U1LnBsICAgICAgICAgICAgICAgQW4gYWR2YW5jZWQgZXhhbXBsZSBvZiBtZXJnaW5nIHdpdGggZm9ybWF0dGluZy4KKyAgICBtZXJnZTYucGwgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG1lcmdpbmcgd2l0aCBVbmljb2RlIHN0cmluZ3MuCisgICAgbW9kX3BlcmwxLnBsICAgICAgICAgICAgQSBzaW1wbGUgbW9kX3BlcmwgMSBwcm9ncmFtLgorICAgIG1vZF9wZXJsMi5wbCAgICAgICAgICAgIEEgc2ltcGxlIG1vZF9wZXJsIDIgcHJvZ3JhbS4KKyAgICBvdXRsaW5lLnBsICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG91dGxpbmVzIGFuZCBncm91cGluZy4KKyAgICBvdXRsaW5lX2NvbGxhcHNlZC5wbCAgICBBbiBleGFtcGxlIG9mIGNvbGxhcHNlZCBvdXRsaW5lcy4KKyAgICBwYW5lcy5wbCAgICAgICAgICAgICAgICBBbiBleGFtcGxlcyBvZiBob3cgdG8gY3JlYXRlIHBhbmVzLgorICAgIHByb3BlcnRpZXMucGwgICAgICAgICAgIEFkZCBkb2N1bWVudCBwcm9wZXJ0aWVzIHRvIGEgd29ya2Jvb2suCisgICAgcHJvdGVjdGlvbi5wbCAgICAgICAgICAgRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nLgorICAgIHJlcGVhdC5wbCAgICAgICAgICAgICAgIEV4YW1wbGUgb2Ygd3JpdGluZyByZXBlYXRlZCBmb3JtdWxhcy4KKyAgICByaWdodF90b19sZWZ0LnBsICAgICAgICBDaGFuZ2UgZGVmYXVsdCBzaGVldCBkaXJlY3Rpb24gdG8gcmlnaHQgdG8gbGVmdC4KKyAgICByb3dfd3JhcC5wbCAgICAgICAgICAgICBIb3cgdG8gd3JhcCBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIGFub3RoZXIuCisgICAgc2FsZXMucGwgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBzYWxlcyBzcHJlYWRzaGVldC4KKyAgICBzZW5kbWFpbC5wbCAgICAgICAgICAgICBTZW5kIGFuIEV4Y2VsIGVtYWlsIGF0dGFjaG1lbnQgdXNpbmcgTWFpbDo6U2VuZGVyLgorICAgIHN0YXRzX2V4dC5wbCAgICAgICAgICAgIFNhbWUgYXMgc3RhdHMucGwgd2l0aCBleHRlcm5hbCByZWZlcmVuY2VzLgorICAgIHN0b2Nrcy5wbCAgICAgICAgICAgICAgIERlbW9uc3RyYXRlcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgorICAgIHRhYl9jb2xvcnMucGwgICAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIHNldCB3b3Jrc2hlZXQgdGFiIGNvbG91cnMuCisgICAgdGV4dHdyYXAucGwgICAgICAgICAgICAgRGVtb25zdHJhdGVzIHRleHQgd3JhcHBpbmcgb3B0aW9ucy4KKyAgICB3aW4zMm9sZS5wbCAgICAgICAgICAgICBBIHNhbXBsZSBXaW4zMjo6T0xFIGV4YW1wbGUgZm9yIGNvbXBhcmlzb24uCisgICAgd3JpdGVfYXJyYXlzLnBsICAgICAgICAgRXhhbXBsZSBvZiB3cml0aW5nIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhLgorICAgIHdyaXRlX2hhbmRsZXIxLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAxLgorICAgIHdyaXRlX2hhbmRsZXIyLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAyLgorICAgIHdyaXRlX2hhbmRsZXIzLnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAzLgorICAgIHdyaXRlX2hhbmRsZXI0LnBsICAgICAgIEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCA0LgorICAgIHdyaXRlX3RvX3NjYWxhci5wbCAgICAgIEV4YW1wbGUgb2Ygd3JpdGluZyBhbiBFeGNlbCBmaWxlIHRvIGEgUGVybCBzY2FsYXIuCisKKworICAgIFVuaWNvZGUKKyAgICA9PT09PT09CisgICAgdW5pY29kZV91dGYxNi5wbCAgICAgICAgU2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgVW5pY29kZSBVVEYxNiBzdHJpbmdzLgorICAgIHVuaWNvZGVfdXRmMTZfamFwYW4ucGwgIFdyaXRlIEphcGFuZXNlIFVuaWNvZGUgc3RyaW5ncyB1c2luZyBVVEYtMTYuCisgICAgdW5pY29kZV9jeXJpbGxpYy5wbCAgICAgV3JpdGUgUnVzc2lhbiBDeXJpbGxpYyBzdHJpbmdzIHVzaW5nIFVURi04LgorICAgIHVuaWNvZGVfbGlzdC5wbCAgICAgICAgIExpc3QgdGhlIGNoYXJzIGluIGEgVW5pY29kZSBmb250LgorICAgIHVuaWNvZGVfMjAyMl9qcC5wbCAgICAgIEphcGFuZXNlOiBJU08tMjAyMi1KUCB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfODg1OV8xMS5wbCAgICAgIFRoYWk6ICAgICBJU08tODg1OV8xMSB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfODg1OV83LnBsICAgICAgIEdyZWVrOiAgICBJU08tODg1OV83ICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfYmlnNS5wbCAgICAgICAgIENoaW5lc2U6ICBCSUc1ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfY3AxMjUxLnBsICAgICAgIFJ1c3NpYW46ICBDUDEyNTEgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfY3AxMjU2LnBsICAgICAgIEFyYWJpYzogICBDUDEyNTYgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfa29pOHIucGwgICAgICAgIFJ1c3NpYW46ICBLT0k4LVIgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfcG9saXNoX3V0ZjgucGwgIFBvbGlzaCA6ICBVVEY4ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorICAgIHVuaWNvZGVfc2hpZnRfamlzLnBsICAgIEphcGFuZXNlOiBTaGlmdCBKSVMgICB0byB1dGY4IGluIHBlcmwgNS44LgorCisKKyAgICBVdGlsaXR5CisgICAgPT09PT09PQorICAgIGNzdjJ4bHMucGwgICAgICAgICAgICAgIFByb2dyYW0gdG8gY29udmVydCBhIENTViBmaWxlIHRvIGFuIEV4Y2VsIGZpbGUuCisgICAgdGFiMnhscy5wbCAgICAgICAgICAgICAgUHJvZ3JhbSB0byBjb252ZXJ0IGEgdGFiIHNlcGFyYXRlZCBmaWxlIHRvIHhscy4KKyAgICBkYXRlY2FsYzEucGwgICAgICAgICAgICBDb252ZXJ0IFVuaXgvUGVybCB0aW1lIHRvIEV4Y2VsIHRpbWUuCisgICAgZGF0ZWNhbGMyLnBsICAgICAgICAgICAgQ2FsY3VsYXRlIGFuIEV4Y2VsIGRhdGUgdXNpbmcgRGF0ZTo6Q2FsYy4KKyAgICBsZWN4ZS5wbCAgICAgICAgICAgICAgICBDb252ZXJ0IEV4Y2VsIHRvIFdyaXRlRXhjZWwgdXNpbmcgV2luMzI6Ok9MRS4KKworCisgICAgRGV2ZWxvcGVyCisgICAgPT09PT09PT09CisgICAgY29udmVydEExLnBsICAgICAgICAgICAgSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIEExIG5vdGF0aW9uLgorICAgIGZ1bmN0aW9uX2xvY2FsZS5wbCAgICAgIEFkZCBub24tRW5nbGlzaCBmdW5jdGlvbiBuYW1lcyB0byBGb3JtdWxhLnBtLgorICAgIHdyaXRlQTEucGwgICAgICAgICAgICAgIEV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgbW9kdWxlLgorCisKKworPWhlYWQxIExJTUlUQVRJT05TCisKK1RoZSBmb2xsb3dpbmcgbGltaXRzIGFyZSBpbXBvc2VkIGJ5IEV4Y2VsOgorCisgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIExpbWl0CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLQorICAgIE1heGltdW0gbnVtYmVyIG9mIGNoYXJzIGluIGEgc3RyaW5nICAzMjc2NworICAgIE1heGltdW0gbnVtYmVyIG9mIGNvbHVtbnMgICAgICAgICAgICAyNTYKKyAgICBNYXhpbXVtIG51bWJlciBvZiByb3dzICAgICAgICAgICAgICAgNjU1MzYKKyAgICBNYXhpbXVtIGNoYXJzIGluIGEgc2hlZXQgbmFtZSAgICAgICAgMzEKKyAgICBNYXhpbXVtIGNoYXJzIGluIGEgaGVhZGVyL2Zvb3RlciAgICAgMjU0CisKKworVGhlIG1pbmltdW0gZmlsZSBzaXplIGlzIDZLIGR1ZSB0byB0aGUgT0xFIG92ZXJoZWFkLiBUaGUgbWF4aW11bSBmaWxlIHNpemUgaXMgYXBwcm94aW1hdGVseSA3TUIgKDcwODcxMDQgYnl0ZXMpIG9mIEJJRkYgZGF0YS4gVGhpcyBjYW4gYmUgZXh0ZW5kZWQgYnkgaW5zdGFsbGluZyBUYWthbm9yaSBLYXdhaSdzIE9MRTo6U3RvcmFnZV9MaXRlIG1vZHVsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP2Rpc3Q9T0xFLVN0b3JhZ2VfTGl0ZT4gc2VlIHRoZSBDPGJpZ2ZpbGUucGw+IGV4YW1wbGUgaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgRE9XTkxPQURJTkcKKworVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIGlzIGFsd2F5cyBhdmFpbGFibGUgYXQ6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLz4uCisKKworCisKKz1oZWFkMSBSRVFVSVJFTUVOVFMKKworVGhpcyBtb2R1bGUgcmVxdWlyZXMgUGVybCA+PSA1LjAwNSwgUGFyc2U6OlJlY0Rlc2NlbnQsIEZpbGU6OlRlbXAgYW5kIE9MRTo6U3RvcmFnZV9MaXRlOgorCisgICAgaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1QYXJzZS1SZWNEZXNjZW50LyAjIEZvciBmb3JtdWxhcy4KKyAgICBodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PUZpbGUtVGVtcC8gICAgICAgICMgRm9yIHNldF90ZW1wZGlyKCkuCisgICAgaHR0cDovL3NlYXJjaC5jcGFuLm9yZy9zZWFyY2g/ZGlzdD1PTEUtU3RvcmFnZV9MaXRlLyAjIEZvciBmaWxlcyA+IDdNQi4KKworTm90ZSwgdGhlc2UgYXJlbid0IHN0cmljdCByZXF1aXJlbWVudHMuIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHdpbGwgd29yayB3aXRob3V0IHRoZXNlIG1vZHVsZXMgaWYgeW91IGRvbid0IHVzZSB3cml0ZV9mb3JtdWxhKCksIHNldF90ZW1wZGlyKCkgb3IgY3JlYXRlIGZpbGVzIGdyZWF0ZXIgdGhhbiA3TUIuIEhvd2V2ZXIsIGl0IGlzIGJlc3QgdG8gaW5zdGFsbCB0aGVtIGlmIHBvc3NpYmxlIGFuZCB0aGV5IHdpbGwgYmUgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkgaWYgeW91IHVzZSBhIHRvb2wgc3VjaCBhcyBDUEFOLnBtIG9yIHBwbS4KKworCis9aGVhZDEgSU5TVEFMTEFUSU9OCisKK1NlZSB0aGUgSU5TVEFMTCBvciBpbnN0YWxsLmh0bWwgZG9jcyB0aGF0IGNvbWUgd2l0aCB0aGUgZGlzdHJpYnV0aW9uIG9yOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzEvSU5TVEFMTD4uCisKKworCisKKz1oZWFkMSBQT1JUQUJJTElUWQorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB3aWxsIHdvcmsgb24gdGhlIG1ham9yaXR5IG9mIFdpbmRvd3MsIFVOSVggYW5kIE1hY2ludG9zaCBwbGF0Zm9ybXMuIFNwZWNpZmljYWxseSwgdGhlIG1vZHVsZSB3aWxsIHdvcmsgb24gYW55IHN5c3RlbSB3aGVyZSBwZXJsIHBhY2tzIGZsb2F0cyBpbiB0aGUgNjQgYml0IElFRUUgZm9ybWF0LiBUaGUgZmxvYXQgbXVzdCBhbHNvIGJlIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IGJ1dCBpdCB3aWxsIGJlIHJldmVyc2VkIGlmIG5lY2Vzc2FyeS4gVGh1czoKKworICAgIHByaW50IGpvaW4oJyAnLCBtYXAgeyBzcHJpbnRmICclIzAyeCcsICRfIH0gdW5wYWNrKCdDKicsIHBhY2sgJ2QnLCAxLjIzNDUpKSwgIlxuIjsKKworc2hvdWxkIGdpdmUgKG9yIGluIHJldmVyc2Ugb3JkZXIpOgorCisgICAgMHg4ZCAweDk3IDB4NmUgMHgxMiAweDgzIDB4YzAgMHhmMyAweDNmCisKK0luIGdlbmVyYWwsIGlmIHlvdSBkb24ndCBrbm93IHdoZXRoZXIgeW91ciBzeXN0ZW0gc3VwcG9ydHMgYSA2NCBiaXQgSUVFRSBmbG9hdCBvciBub3QsIGl0IHByb2JhYmx5IGRvZXMuIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3QsIFdyaXRlRXhjZWwgd2lsbCBDPGNyb2FrKCk+IHdpdGggdGhlIG1lc3NhZ2UgZ2l2ZW4gaW4gdGhlIEw8RElBR05PU1RJQ1M+IHNlY3Rpb24uIFlvdSBjYW4gY2hlY2sgd2hpY2ggcGxhdGZvcm1zIHRoZSBtb2R1bGUgaGFzIGJlZW4gdGVzdGVkIG9uIGF0IHRoZSBDUEFOIHRlc3RlcnMgc2l0ZTogTDxodHRwOi8vdGVzdGVycy5jcGFuLm9yZy9zZWFyY2g/cmVxdWVzdD1kaXN0JmRpc3Q9U3ByZWFkc2hlZXQtV3JpdGVFeGNlbD4uCisKKworCisKKz1oZWFkMSBESUFHTk9TVElDUworCisKKz1vdmVyIDQKKworPWl0ZW0gRmlsZW5hbWUgcmVxdWlyZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygpCisKK0EgZmlsZW5hbWUgbXVzdCBiZSBnaXZlbiBpbiB0aGUgY29uc3RydWN0b3IuCisKKz1pdGVtIENhbid0IG9wZW4gZmlsZW5hbWUuIEl0IG1heSBiZSBpbiB1c2Ugb3IgcHJvdGVjdGVkLgorCitUaGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nLiBUaGUgZGlyZWN0b3J5IHRoYXQgeW91IGFyZSB3cml0aW5nIHRvICBtYXkgYmUgcHJvdGVjdGVkIG9yIHRoZSBmaWxlIG1heSBiZSBpbiB1c2UgYnkgYW5vdGhlciBwcm9ncmFtLgorCis9aXRlbSBVbmFibGUgdG8gY3JlYXRlIHRtcCBmaWxlcyB2aWEgRmlsZTo6VGVtcDo6dGVtcGZpbGUoKS4uLgorCitUaGlzIGlzIGEgQzwtdz4gd2FybmluZy4gWW91IHdpbGwgc2VlIGl0IGlmIHlvdSBhcmUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdGVtcG9yYXJ5IGZpbGVzIGNhbm5vdCBiZSBjcmVhdGVkLCBpbiB3aGljaCBjYXNlIGFsbCBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIG1lbW9yeS4gVGhlIHdhcm5pbmcgaXMgZm9yIGluZm9ybWF0aW9uIG9ubHk6IGl0IGRvZXMgbm90IGFmZmVjdCBjcmVhdGlvbiBidXQgaXQgd2lsbCBhZmZlY3QgdGhlIHNwZWVkIG9mIGV4ZWN1dGlvbiBmb3IgbGFyZ2UgZmlsZXMuIFNlZSB0aGUgQzxzZXRfdGVtcGRpcj4gd29ya2Jvb2sgbWV0aG9kLgorCisKKz1pdGVtIE1heGltdW0gZmlsZSBzaXplLCA3MDg3MTA0LCBleGNlZWRlZC4KKworVGhlIGN1cnJlbnQgT0xFIGltcGxlbWVudGF0aW9uIG9ubHkgc3VwcG9ydHMgYSBtYXhpbXVtIEJJRkYgZmlsZSBvZiB0aGlzIHNpemUuIFRoaXMgbGltaXQgY2FuIGJlIGV4dGVuZGVkLCBzZWUgdGhlIEw8TElNSVRBVElPTlM+IHNlY3Rpb24uCisKKz1pdGVtIENhbid0IGxvY2F0ZSBQYXJzZS9SZWNEZXNjZW50LnBtIGluIEBJTkMgLi4uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHJlcXVpcmVzIHRoZSBQYXJzZTo6UmVjRGVzY2VudCBtb2R1bGUuIERvd25sb2FkIGl0IGZyb20gQ1BBTjogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PVBhcnNlLVJlY0Rlc2NlbnQ+CisKKz1pdGVtIENvdWxkbid0IHBhcnNlIGZvcm11bGEgLi4uCisKK1RoZXJlIGFyZSBhIGxhcmdlIG51bWJlciBvZiB3YXJuaW5ncyB3aGljaCByZWxhdGUgdG8gYmFkbHkgZm9ybWVkIGZvcm11bGFzIGFuZCBmdW5jdGlvbnMuIFNlZSB0aGUgTDxGT1JNVUxBUyBBTkQgRlVOQ1RJT05TIElOIEVYQ0VMPiBzZWN0aW9uIGZvciBzdWdnZXN0aW9ucyBvbiBob3cgdG8gYXZvaWQgdGhlc2UgZXJyb3JzLiBZb3Ugc2hvdWxkIGFsc28gY2hlY2sgdGhlIGZvcm11bGEgaW4gRXhjZWwgdG8gZW5zdXJlIHRoYXQgaXQgaXMgdmFsaWQuCisKKz1pdGVtIFJlcXVpcmVkIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0uCisKK09wZXJhdGluZyBzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IDY0IGJpdCBJRUVFIGZsb2F0IG9yIGl0IGlzIGJ5dGUtb3JkZXJlZCBpbiBhIHdheSB1bmtub3duIHRvIFdyaXRlRXhjZWwuCisKKworPWl0ZW0gJ2ZpbGUueGxzJyBjYW5ub3QgYmUgYWNjZXNzZWQuIFRoZSBmaWxlIG1heSBiZSByZWFkLW9ubHkgLi4uCisKK1lvdSBtYXkgc29tZXRpbWVzIGVuY291bnRlciB0aGUgZm9sbG93aW5nIGVycm9yIHdoZW4gdHJ5aW5nIHRvIG9wZW4gYSBmaWxlIGluIEV4Y2VsOiAiZmlsZS54bHMgY2Fubm90IGJlIGFjY2Vzc2VkLiBUaGUgZmlsZSBtYXkgYmUgcmVhZC1vbmx5LCBvciB5b3UgbWF5IGJlIHRyeWluZyB0byBhY2Nlc3MgYSByZWFkLW9ubHkgbG9jYXRpb24uIE9yLCB0aGUgc2VydmVyIHRoZSBkb2N1bWVudCBpcyBzdG9yZWQgb24gbWF5IG5vdCBiZSByZXNwb25kaW5nLiIKKworVGhpcyBlcnJvciBnZW5lcmFsbHkgbWVhbnMgdGhhdCB0aGUgRXhjZWwgZmlsZSBoYXMgYmVlbiBjb3JydXB0ZWQuIFRoZXJlIGFyZSB0d28gbGlrZWx5IGNhdXNlcyBvZiB0aGlzOiB0aGUgZmlsZSB3YXMgRlRQZWQgaW4gQVNDSUkgbW9kZSBpbnN0ZWFkIG9mIGJpbmFyeSBtb2RlIG9yIGVsc2UgdGhlIGZpbGUgd2FzIGNyZWF0ZWQgd2l0aCBDPFVURi04PiBkYXRhIHJldHVybmVkIGJ5IGFuIFhNTCBwYXJzZXIuIFNlZSBMPFdhcm5pbmcgYWJvdXQgWE1MOjpQYXJzZXIgYW5kIHBlcmwgNS42PiBmb3IgZnVydGhlciBkZXRhaWxzLgorCis9YmFjaworCisKKworCis9aGVhZDEgVEhFIEVYQ0VMIEJJTkFSWSBGT1JNQVQKKworVGhlIGZvbGxvd2luZyBpcyBzb21lIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4Y2VsIGJpbmFyeSBmb3JtYXQgZm9yIGFueW9uZSB3aG8gbWF5IGJlIGludGVyZXN0ZWQuCisKK0V4Y2VsIGRhdGEgaXMgc3RvcmVkIGluIHRoZSAiQmluYXJ5IEludGVyY2hhbmdlIEZpbGUgRm9ybWF0IiAoQklGRikgZmlsZSBmb3JtYXQuIERldGFpbHMgb2YgdGhpcyBmb3JtYXQgYXJlIGdpdmVuIGluICJFeGNlbCA5Ny0yMDA3IEJpbmFyeSBGaWxlIEZvcm1hdCBTcGVjaWZpY2F0aW9uIiBMPGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9pbnRlcm9wL2RvY3MvT2ZmaWNlQmluYXJ5Rm9ybWF0cy5tc3B4Pi4KKworRGFuaWVsIFJlbnR6IG9mIE9wZW5PZmZpY2Uub3JnIGhhcyBhbHNvIHdyaXR0ZW4gYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgRXhjZWwgd29ya2Jvb2sgcmVjb3Jkcywgc2VlIEw8aHR0cDovL3NjLm9wZW5vZmZpY2Uub3JnL2V4Y2VsZmlsZWZvcm1hdC5wZGY+LgorCitDaGFybGVzIFd5YmJsZSBoYXMgY29sbGVjdGVkIHRvZ2V0aGVyIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEV4Y2VsIGZpbGUgZm9ybWF0LiBTZWUgIlRoZSBDaGljYWdvIFByb2plY3QiIGF0IEw8aHR0cDovL2NoaWNhZ28uc291cmNlZm9yZ2UubmV0L2RldmVsLz4uCisKK1RoZSBCSUZGIGRhdGEgaXMgc3RvcmVkIGFsb25nIHdpdGggb3RoZXIgZGF0YSBpbiBhbiBPTEUgQ29tcG91bmQgRmlsZS4gVGhpcyBpcyBhIHN0cnVjdHVyZWQgc3RvcmFnZSB3aGljaCBhY3RzIGxpa2UgYSBmaWxlIHN5c3RlbSB3aXRoaW4gYSBmaWxlLiBBIENvbXBvdW5kIEZpbGUgaXMgY29tcHJpc2VkIG9mIHN0b3JhZ2VzIGFuZCBzdHJlYW1zIHdoaWNoLCB0byBmb2xsb3cgdGhlIGZpbGUgc3lzdGVtIGFuYWxvZ3ksIGFyZSBsaWtlIGRpcmVjdG9yaWVzIGFuZCBmaWxlcy4KKworVGhlIE9MRSBmb3JtYXQgaXMgZXhwbGFpbmVkIGluIHRoZSAiV2luZG93cyBDb21wb3VuZCBCaW5hcnkgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIgTDxodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vaW50ZXJvcC9kb2NzL3N1cHBvcnRpbmd0ZWNobm9sb2dpZXMubXNweD4KKworVGhlIERpZ2l0YWwgSW1hZ2luZyBHcm91cCBoYXZlIGFsc28gZGV0YWlsZWQgdGhlIE9MRSBmb3JtYXQgaW4gdGhlIEpQRUcyMDAwIHNwZWNpZmljYXRpb246IHNlZSBBcHBlbmRpeCBBIG9mIEw8aHR0cDovL3d3dy5pM2Eub3JnL3BkZi93ZzFuMTAxNy5wZGY+LgorCitQbGVhc2Ugbm90ZSB0aGF0IHRoZSBwcm92aXNpb24gb2YgdGhpcyBpbmZvcm1hdGlvbiBkb2VzIG5vdCBjb25zdGl0dXRlIGFuIGludml0YXRpb24gdG8gc3RhcnQgaGFja2luZyBhdCB0aGUgQklGRiBvciBPTEUgZmlsZSBmb3JtYXRzLiBUaGVyZSBhcmUgbW9yZSBpbnRlcmVzdGluZyB3YXlzIHRvIHdhc3RlIHlvdXIgdGltZS4gOy0pCisKKworCisKKz1oZWFkMSBXUklUSU5HIEVYQ0VMIEZJTEVTCisKK0RlcGVuZGluZyBvbiB5b3VyIHJlcXVpcmVtZW50cywgYmFja2dyb3VuZCBhbmQgZ2VuZXJhbCBzZW5zaWJpbGl0aWVzIHlvdSBtYXkgcHJlZmVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgb2YgZ2V0dGluZyBkYXRhIGludG8gRXhjZWw6CisKKz1vdmVyIDQKKworPWl0ZW0gKiBXaW4zMjo6T0xFIG1vZHVsZSBhbmQgb2ZmaWNlIGF1dG9tYXRpb24KKworVGhpcyByZXF1aXJlcyBhIFdpbmRvd3MgcGxhdGZvcm0gYW5kIGFuIGluc3RhbGxlZCBjb3B5IG9mIEV4Y2VsLiBUaGlzIGlzIHRoZSBtb3N0IHBvd2VyZnVsIGFuZCBjb21wbGV0ZSBtZXRob2QgZm9yIGludGVyZmFjaW5nIHdpdGggRXhjZWwuIFNlZSBMPGh0dHA6Ly93d3cuYWN0aXZlc3RhdGUuY29tL0FTUE4vUmVmZXJlbmNlL1Byb2R1Y3RzL0FjdGl2ZVBlcmwtNS42L2ZhcS9XaW5kb3dzL0FjdGl2ZVBlcmwtV2luZmFxMTIuaHRtbD4gYW5kIEw8aHR0cDovL3d3dy5hY3RpdmVzdGF0ZS5jb20vQVNQTi9SZWZlcmVuY2UvUHJvZHVjdHMvQWN0aXZlUGVybC01LjYvc2l0ZS9saWIvV2luMzIvT0xFLmh0bWw+LiBJZiB5b3VyIG1haW4gcGxhdGZvcm0gaXMgVU5JWCBidXQgeW91IGhhdmUgdGhlIHJlc291cmNlcyB0byBzZXQgdXAgYSBzZXBhcmF0ZSBXaW4zMi9NU09mZmljZSBzZXJ2ZXIsIHlvdSBjYW4gY29udmVydCBvZmZpY2UgZG9jdW1lbnRzIHRvIHRleHQsIHBvc3RzY3JpcHQgb3IgUERGIHVzaW5nIFdpbjMyOjpPTEUuIEZvciBhIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIGRvIHRoaXMgdXNpbmcgUGVybCBzZWUgRG9jc2VydmVyOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvc2VhcmNoP21vZGU9bW9kdWxlJnF1ZXJ5PWRvY3NlcnZlcj4uCisKKz1pdGVtICogQ1NWLCBjb21tYSBzZXBhcmF0ZWQgdmFyaWFibGVzIG9yIHRleHQKKworSWYgdGhlIGZpbGUgZXh0ZW5zaW9uIGlzIEM8Y3N2PiwgRXhjZWwgd2lsbCBvcGVuIGFuZCBjb252ZXJ0IHRoaXMgZm9ybWF0IGF1dG9tYXRpY2FsbHkuIEdlbmVyYXRpbmcgYSB2YWxpZCBDU1YgZmlsZSBpc24ndCBhcyBlYXN5IGFzIGl0IHNlZW1zLiBIYXZlIGEgbG9vayBhdCB0aGUgREJEOjpSQU0sIERCRDo6Q1NWLCBUZXh0Ojp4U1YgYW5kIFRleHQ6OkNTVl9YUyBtb2R1bGVzLgorCis9aXRlbSAqIERCSSB3aXRoIERCRDo6QURPIG9yIERCRDo6T0RCQworCitFeGNlbCBmaWxlcyBjb250YWluIGFuIGludGVybmFsIGluZGV4IHRhYmxlIHRoYXQgYWxsb3dzIHRoZW0gdG8gYWN0IGxpa2UgYSBkYXRhYmFzZSBmaWxlLiBVc2luZyBvbmUgb2YgdGhlIHN0YW5kYXJkIFBlcmwgZGF0YWJhc2UgbW9kdWxlcyB5b3UgY2FuIGNvbm5lY3QgdG8gYW4gRXhjZWwgZmlsZSBhcyBhIGRhdGFiYXNlLgorCis9aXRlbSAqIERCRDo6RXhjZWwKKworWW91IGNhbiBhbHNvIGFjY2VzcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB1c2luZyB0aGUgc3RhbmRhcmQgREJJIGludGVyZmFjZSB2aWEgVGFrYW5vcmkgS2F3YWkncyBEQkQ6OkV4Y2VsIG1vZHVsZSBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9EQkQtRXhjZWw+CisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWxYTUwKKworVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byBjcmVhdGUgYW4gRXhjZWwgWE1MIGZpbGUgdXNpbmcgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLiBTZWU6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWxYTUw+CisKKz1pdGVtICogRXhjZWw6OlRlbXBsYXRlCisKK1RoaXMgbW9kdWxlIGFsbG93cyB5b3UgdG8gY3JlYXRlIGFuIEV4Y2VsIGZpbGUgZnJvbSBhbiBYTUwgdGVtcGxhdGUgaW4gYSBtYW5uZXIgc2ltaWxhciB0byBIVE1MOjpUZW1wbGF0ZS4gU2VlIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L0V4Y2VsLVRlbXBsYXRlLz4uCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZyb21YTUwKKworVGhpcyBtb2R1bGUgYWxsb3dzIHlvdSB0byB0dXJuIGEgc2ltcGxlIFhNTCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhcyBhIGJhY2stZW5kLiBUaGUgZm9ybWF0IG9mIHRoZSBYTUwgZmlsZSBpcyBkZWZpbmVkIGJ5IGEgc3VwcGxpZWQgRFREOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21YTUw+LgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpTaW1wbGUKKworVGhpcyBwcm92aWRlcyBhbiBlYXNpZXIgaW50ZXJmYWNlIHRvIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLVNpbXBsZT4uCisKKz1pdGVtICogU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZyb21EQgorCitUaGlzIGlzIGEgdXNlZnVsIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgZmlsZXMgZGlyZWN0bHkgZnJvbSBhIERCIHRhYmxlOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21EQj4uCisKKz1pdGVtICogSFRNTCB0YWJsZXMKKworVGhpcyBpcyBhbiBlYXN5IHdheSBvZiBhZGRpbmcgZm9ybWF0dGluZyB2aWEgYSB0ZXh0IGJhc2VkIGZvcm1hdC4KKworPWl0ZW0gKiBYTUwgb3IgSFRNTAorCitUaGUgRXhjZWwgWE1MIGFuZCBIVE1MIGZpbGUgc3BlY2lmaWNhdGlvbiBhcmUgYXZhaWxhYmxlIGZyb20gTDxodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2xpYnJhcnkvb2ZmaWNlZGV2L29meG1sMmsvb2Z4bWwyay5odG0+LgorCis9YmFjaworCitGb3Igb3RoZXIgUGVybC1FeGNlbCBtb2R1bGVzIHRyeSB0aGUgZm9sbG93aW5nIHNlYXJjaDogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9tb2RlPW1vZHVsZSZxdWVyeT1leGNlbD4uCisKKworCisKKz1oZWFkMSBSRUFESU5HIEVYQ0VMIEZJTEVTCisKK1RvIHJlYWQgZGF0YSBmcm9tIEV4Y2VsIGZpbGVzIHRyeToKKworPW92ZXIgNAorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsCisKK1RoaXMgdXNlcyB0aGUgT0xFOjpTdG9yYWdlLUxpdGUgbW9kdWxlIHRvIGV4dHJhY3QgZGF0YSBmcm9tIGFuIEV4Y2VsIGZpbGUuIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCis9aXRlbSAqIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsX1hMSFRNTAorCitUaGlzIG1vZHVsZSB1c2VzIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsJ3MgaW50ZXJmYWNlIGJ1dCB1c2VzIHhsSHRtbCAoc2VlIGJlbG93KSB0byBkbyB0aGUgY29udmVyc2lvbjogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvU3ByZWFkc2hlZXQtUGFyc2VFeGNlbF9YTEhUTUw+CitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbF9YTEhUTUwKKworPWl0ZW0gKiB4bEh0bWwKKworVGhpcyBpcyBhbiBvcGVuIHNvdXJjZSAiRXhjZWwgdG8gSFRNTCBDb252ZXJ0ZXIiIEMvQysrIHByb2plY3QgYXQgTDxodHRwOi8vY2hpY2Fnby5zb3VyY2Vmb3JnZS5uZXQveGxodG1sLz4uCisKKz1pdGVtICogREJEOjpFeGNlbCAocmVhZGluZykKKworWW91IGNhbiBhbHNvIGFjY2VzcyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbCB1c2luZyB0aGUgc3RhbmRhcmQgREJJIGludGVyZmFjZSB2aWEgIFRha2Fub3JpIEthd2FpJ3MgREJEOjpFeGNlbCBtb2R1bGUgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvREJELUV4Y2VsPi4KKworPWl0ZW0gKiBXaW4zMjo6T0xFIG1vZHVsZSBhbmQgb2ZmaWNlIGF1dG9tYXRpb24gKHJlYWRpbmcpCisKK1NlZSwgdGhlIHNlY3Rpb24gTDxXUklUSU5HIEVYQ0VMIEZJTEVTPi4KKworPWl0ZW0gKiBIVE1MIHRhYmxlcyAocmVhZGluZykKKworSWYgdGhlIGZpbGVzIGFyZSBzYXZlZCBmcm9tIEV4Y2VsIGluIGEgSFRNTCBmb3JtYXQgdGhlIGRhdGEgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIEhUTUw6OlRhYmxlRXh0cmFjdCBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9IVE1MLVRhYmxlRXh0cmFjdD4uCisKKz1pdGVtICogREJJIHdpdGggREJEOjpBRE8gb3IgREJEOjpPREJDLgorCitTZWUsIHRoZSBzZWN0aW9uIEw8V1JJVElORyBFWENFTCBGSUxFUz4uCisKKz1pdGVtICogWE1MOjpFeGNlbAorCitDb252ZXJ0cyBFeGNlbCBmaWxlcyB0byBYTUwgdXNpbmcgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL2Rpc3QvWE1MLUV4Y2VsPi4KKworPWl0ZW0gKiBPTEU6OlN0b3JhZ2UsIGFrYSBMQU9MQQorCitUaGlzIGlzIGEgUGVybCBpbnRlcmZhY2UgdG8gT0xFIGZpbGUgZm9ybWF0cy4gSW4gcGFydGljdWxhciwgdGhlIGRpc3RybyBjb250YWlucyBhbiBFeGNlbCB0byBIVE1MIGNvbnZlcnRlciBjYWxsZWQgSGVyYmVydCwgTDxodHRwOi8vdXNlci5jcy50dS1iZXJsaW4uZGUvfnNjaHdhcnR6L3BtaC8+LiBUaGlzIGhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIG1vZHVsZS4KKworPWJhY2sKKworCitGb3Igb3RoZXIgUGVybC1FeGNlbCBtb2R1bGVzIHRyeSB0aGUgZm9sbG93aW5nIHNlYXJjaDogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9tb2RlPW1vZHVsZSZxdWVyeT1leGNlbD4uCisKK0lmIHlvdSB3aXNoIHRvIHZpZXcgRXhjZWwgZmlsZXMgb24gYSBVTklYL0xpbnV4IHBsYXRmb3JtIGNoZWNrIG91dCB0aGUgZXhjZWxsZW50IEdudW1lcmljIHNwcmVhZHNoZWV0IGFwcGxpY2F0aW9uIGF0IEw8aHR0cDovL3d3dy5nbm9tZS5vcmcvcHJvamVjdHMvZ251bWVyaWMvPiBvciBPcGVuT2ZmaWNlLm9yZyBhdCBMPGh0dHA6Ly93d3cub3Blbm9mZmljZS5vcmcvPi4KKworSWYgeW91IHdpc2ggdG8gdmlldyBFeGNlbCBmaWxlcyBvbiBhIFdpbmRvd3MgcGxhdGZvcm0gd2hpY2ggZG9lc24ndCBoYXZlIEV4Y2VsIGluc3RhbGxlZCB5b3UgY2FuIHVzZSB0aGUgZnJlZSBNaWNyb3NvZnQgRXhjZWwgVmlld2VyIEw8aHR0cDovL29mZmljZS5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy8yMDAwL3hsdmlld2VyLmFzcHg+LgorCisKKworCis9aGVhZDEgTU9ESUZZSU5HIEFORCBSRVdSSVRJTkcgRVhDRUwgRklMRVMKKworQW4gRXhjZWwgZmlsZSBpcyBhIGJpbmFyeSBmaWxlIHdpdGhpbiBhIGJpbmFyeSBmaWxlLiBJdCBjb250YWlucyBzZXZlcmFsIGludGVybGlua2VkIGNoZWNrc3VtcyBhbmQgY2hhbmdpbmcgZXZlbiBvbmUgYnl0ZSBjYW4gY2F1c2UgaXQgdG8gYmVjb21lIGNvcnJ1cHRlZC4KKworQXMgc3VjaCB5b3UgY2Fubm90IHNpbXBseSBhcHBlbmQgb3IgdXBkYXRlIGFuIEV4Y2VsIGZpbGUuIFRoZSBvbmx5IHdheSB0byBhY2hpZXZlIHRoaXMgaXMgdG8gcmVhZCB0aGUgZW50aXJlIGZpbGUgaW50byBtZW1vcnksIG1ha2UgdGhlIHJlcXVpcmVkIGNoYW5nZXMgb3IgYWRkaXRpb25zIGFuZCB0aGVuIHdyaXRlIHRoZSBmaWxlIG91dCBhZ2Fpbi4KKworWW91IGNhbiByZWFkIGFuZCByZXdyaXRlIGFuIEV4Y2VsIGZpbGUgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsOjpTYXZlUGFyc2VyIG1vZHVsZSB3aGljaCBpcyBhIHdyYXBwZXIgYXJvdW5kIFNwcmVhZHNoZWV0OjpQYXJzZUV4Y2VsIGFuZCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gSXQgaXMgcGFydCBvZiB0aGUgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWwgcGFja2FnZTogTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PVNwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCitIb3dldmVyLCB5b3UgY2FuIG9ubHkgcmV3cml0ZSB0aGUgZmVhdHVyZXMgdGhhdCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBzdXBwb3J0cyBzbyBtYWNyb3MsIGdyYXBocyBhbmQgc29tZSBvdGhlciBmZWF0dXJlcyBpbiB0aGUgb3JpZ2luYWwgRXhjZWwgZmlsZSB3aWxsIGJlIGxvc3QuIEFsc28sIGZvcm11bGFzIGFyZW4ndCByZXdyaXR0ZW4sIG9ubHkgdGhlIHJlc3VsdCBvZiBhIGZvcm11bGEgaXMgd3JpdHRlbi4KKworSGVyZSBpcyBhbiBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6OlNhdmVQYXJzZXI7CisKKyAgICAjIE9wZW4gdGhlIHRlbXBsYXRlIHdpdGggU2F2ZVBhcnNlcgorICAgIG15ICRwYXJzZXIgICA9IG5ldyBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDo6U2F2ZVBhcnNlcjsKKyAgICBteSAkdGVtcGxhdGUgPSAkcGFyc2VyLT5QYXJzZSgndGVtcGxhdGUueGxzJyk7CisKKyAgICBteSAkc2hlZXQgICAgPSAwOworICAgIG15ICRyb3cgICAgICA9IDA7CisgICAgbXkgJGNvbCAgICAgID0gMDsKKworICAgICMgR2V0IHRoZSBmb3JtYXQgZnJvbSB0aGUgY2VsbAorICAgIG15ICRmb3JtYXQgICA9ICR0ZW1wbGF0ZS0+e1dvcmtzaGVldH1bJHNoZWV0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0NlbGxzfVskcm93XVskY29sXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0Zvcm1hdE5vfTsKKworICAgICMgV3JpdGUgZGF0YSB0byBzb21lIGNlbGxzCisgICAgJHRlbXBsYXRlLT5BZGRDZWxsKDAsICRyb3csICAgJGNvbCwgICAxLCAgICAgJGZvcm1hdCk7CisgICAgJHRlbXBsYXRlLT5BZGRDZWxsKDAsICRyb3crMSwgJGNvbCwgIkhlbGxvIiwgJGZvcm1hdCk7CisKKyAgICAjIEFkZCBhIG5ldyB3b3Jrc2hlZXQKKyAgICAkdGVtcGxhdGUtPkFkZFdvcmtzaGVldCgnTmV3IERhdGEnKTsKKworICAgICMgVGhlIFNhdmVQYXJzZXIgU2F2ZUFzKCkgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYQorICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgb2JqZWN0LiBJZiB5b3Ugd2lzaCB5b3UgY2FuIHRoZW4KKyAgICAjIHVzZSB0aGlzIHRvIGFjY2VzcyBhbnkgb2YgdGhlIG1ldGhvZHMgdGhhdCBhcmVuJ3QKKyAgICAjIGF2YWlsYWJsZSBmcm9tIHRoZSBTYXZlUGFyc2VyIG9iamVjdC4gSWYgeW91IGRvbid0IG5lZWQKKyAgICAjIHRvIGRvIHRoaXMganVzdCB1c2UgU2F2ZUFzKCkuCisgICAgIworICAgIG15ICR3b3JrYm9vazsKKworICAgIHsKKyAgICAgICAgIyBTYXZlQXMgZ2VuZXJhdGVzIGEgbG90IG9mIGhhcm1sZXNzIHdhcm5pbmdzIGFib3V0IHVuc2V0CisgICAgICAgICMgV29ya3NoZWV0IHByb3BlcnRpZXMuIFlvdSBjYW4gaWdub3JlIHRoZW0gaWYgeW91IHdpc2guCisgICAgICAgIGxvY2FsICReVyA9IDA7CisKKyAgICAgICAgIyBSZXdyaXRlIHRoZSBmaWxlIG9yIHNhdmUgYXMgYSBuZXcgZmlsZQorICAgICAgICAkd29ya2Jvb2sgPSAkdGVtcGxhdGUtPlNhdmVBcygnbmV3LnhscycpOworICAgIH0KKworICAgICMgVXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1ldGhvZHMKKyAgICBteSAkd29ya3NoZWV0ICA9ICR3b3JrYm9vay0+c2hlZXRzKDApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysyLCAkY29sLCAiV29ybGQyIik7CisKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisKKworCisKKz1oZWFkMSBXYXJuaW5nIGFib3V0IFhNTDo6UGFyc2VyIGFuZCBwZXJsIDUuNgorCitZb3UgbXVzdCBiZSBjYXJlZnVsIHdoZW4gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW4gY29uanVuY3Rpb24gd2l0aCBwZXJsIDUuNiBhbmQgWE1MOjpQYXJzZXIgKGFuZCBvdGhlciBYTUwgcGFyc2VycykgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIHBhcnNlciBpcyBnZW5lcmFsbHkgaW4gQzxVVEYtOD4gZm9ybWF0LgorCitXaGVuIEM8VVRGLTg+IHN0cmluZ3MgYXJlIGFkZGVkIHRvIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJ3MgaW50ZXJuYWwgZGF0YSBpdCBjYXVzZXMgdGhlIGdlbmVyYXRlZCBFeGNlbCBmaWxlIHRvIGJlY29tZSBjb3JydXB0LgorCitOb3RlLCB0aGlzIGRvZXNuJ3QgYWZmZWN0IHBlcmwgNS4wMDUgKHdoaWNoIGRvZXNuJ3QgdHJ5IHRvIGhhbmRsZSBDPFVURi04Pikgb3IgNS44ICh3aGljaCBoYW5kbGVzIGl0IGNvcnJlY3RseSkuCisKK1RvIGF2b2lkIHRoaXMgcHJvYmxlbSB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gcGVybCA1LjgsIGlmIHBvc3NpYmxlLCBvciBlbHNlIHlvdSBzaG91bGQgY29udmVydCB0aGUgb3V0cHV0IGRhdGEgZnJvbSBYTUw6OlBhcnNlciB0byBBU0NJSSBvciBJU08tODg1OS0xIHVzaW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZHM6CisKKyAgICAkbmV3X3N0ciA9IHBhY2sgJ0MqJywgdW5wYWNrICdVKicsICR1dGY4X3N0cjsKKworCisgICAgdXNlIFVuaWNvZGU6Ok1hcFVURjggJ2Zyb21fdXRmOCc7CisgICAgJG5ld19zdHIgPSBmcm9tX3V0Zjgoey1zdHIgPT4gJHV0Zjhfc3RyLCAtY2hhcnNldCA9PiAnSVNPLTg4NTktMSd9KTsKKworCisKKworPWhlYWQxIFdhcm5pbmcgYWJvdXQgT2ZmaWNlIFNlcnZpY2UgUGFjayAzCisKK0lmIHlvdSBoYXZlIE9mZmljZSBTZXJ2aWNlIFBhY2sgMyAoU1AzKSBpbnN0YWxsZWQgeW91IG1heSBzZWUgdGhlIGZvbGxvd2luZyB3YXJuaW5nIHdoZW4geW91IG9wZW4gYSBmaWxlIGNyZWF0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAiRmlsZSBFcnJvcjogZGF0YSBtYXkgaGF2ZSBiZWVuIGxvc3QiLgorCitUaGlzIGlzIHVzdWFsbHkgY2F1c2VkIGJ5IG11bHRpcGxlIGluc3RhbmNlcyBvZiBkYXRhIGluIGEgY2VsbC4KKworU1AzIGNoYW5nZWQgRXhjZWwncyBkZWZhdWx0IGJlaGF2aW91ciB3aGVuIGl0IGVuY291bnRlcnMgbXVsdGlwbGUgZGF0YSBpbiBhIGNlbGwgc28gdGhhdCBpdCBpc3N1ZXMgYSB3YXJuaW5nIHdoZW4gdGhlIGZpbGUgaXMgb3BlbmVkIGFuZCBpdCBkaXNwbGF5cyB0aGUgZmlyc3QgZGF0YSB0aGF0IHdhcyB3cml0dGVuLiBQcmlvciB0byBTUDMgaXQgZGlkbid0IGlzc3VlIGEgd2FybmluZyBhbmQgZGlzcGxheWVkIHRoZSBsYXN0IGRhdGEgd3JpdHRlbi4KKworRm9yIGEgbG9uZ2VyIGRpc2N1c3Npb24gYW5kIHNvbWUgd29ya2Fyb3VuZHMgc2VlIHRoZSBmb2xsb3dpbmc6IEw8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3NwcmVhZHNoZWV0LXdyaXRlZXhjZWwvYnJvd3NlX3RocmVhZC90aHJlYWQvM2RjZWE0MGU2NjIwYWYzYT4uCisKKworCisKKz1oZWFkMSBCVUdTCisKK0Zvcm11bGFzIGFyZSBmb3JtdWxhZS4KKworWE1MIGFuZCBDPFVURi04PiBkYXRhIG9uIHBlcmwgNS42IGNhbiBjYXVzZSBFeGNlbCBmaWxlcyBjcmVhdGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGJlY29tZSBjb3JydXB0LiBTZWUgTDxXYXJuaW5nIGFib3V0IFhNTDo6UGFyc2VyIGFuZCBwZXJsIDUuNj4gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKworVGhlIGZvcm1hdCBvYmplY3QgdGhhdCBpcyB1c2VkIHdpdGggYSBDPG1lcmdlX3JhbmdlKCk+IG1ldGhvZCBjYWxsIGlzIG1hcmtlZCBpbnRlcm5hbGx5IGFzIGJlaW5nIGFzc29jaWF0ZWQgd2l0aCBhIG1lcmdlZCByYW5nZS4gSXQgaXMgYSBmYXRhbCBlcnJvciB0byB1c2UgYSBtZXJnZWQgZm9ybWF0IGluIGEgbm9uLW1lcmdlZCBjZWxsLiBUaGUgY3VycmVudCB3b3JrYXJvdW5kIGlzIHRvIHVzZSBzZXBhcmF0ZSBmb3JtYXRzIGZvciBtZXJnZWQgYW5kIG5vbi1tZXJnZWQgY2VsbC4gVGhpcyByZXN0cmljdGlvbiB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKworTmVzdGVkIGZvcm11bGFzIHNvbWV0aW1lcyBhcmVuJ3QgcGFyc2VkIGNvcnJlY3RseSBhbmQgZ2l2ZSBhIHJlc3VsdCBvZiAiI1ZBTFVFIi4gSWYgeW91IGNvbWUgYWNyb3NzIGEgZm9ybXVsYSB0aGF0IHBhcnNlcyBsaWtlIHRoaXMsIGxldCBtZSBrbm93LgorCitTcHJlYWRzaGVldDo6UGFyc2VFeGNlbDogQWxsIGZvcm11bGFzIGNyZWF0ZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYXJlIHJlYWQgYXMgaGF2aW5nIGEgdmFsdWUgb2YgemVyby4gVGhpcyBpcyBiZWNhdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG9ubHkgc3RvcmVzIHRoZSBmb3JtdWxhIGFuZCBub3QgdGhlIGNhbGN1bGF0ZWQgcmVzdWx0LgorCitPcGVuT2ZmaWNlLm9yZzogTm8ga25vd24gaXNzdWVzIGluIHRoaXMgcmVsZWFzZS4KKworR251bWVyaWM6IE5vIGtub3duIGlzc3VlcyBpbiB0aGlzIHJlbGVhc2UuCisKK0lmIHlvdSB3aXNoIHRvIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgcnVuIHRoZSBDPGJ1Z19yZXBvcnQucGw+IHByb2dyYW0gaW4gdGhlIEM8ZXhhbXBsZXM+IGRpcmVjdG9yeSBvZiB0aGUgZGlzdHJvLgorCisKKworCis9aGVhZDEgVE8gRE8KKworVGhlIHJvYWRtYXAgaXMgYXMgZm9sbG93czoKKworPW92ZXIgNAorCis9aXRlbSAqIEVuaGFuY2UgbmFtZWQgcmFuZ2VzLgorCis9YmFjaworCitBbHNvLCBoZXJlIGFyZSBzb21lIG9mIHRoZSBtb3N0IHJlcXVlc3RlZCBmZWF0dXJlcyB0aGF0IHByb2JhYmx5IHdvbid0IGdldCBhZGRlZDoKKworPW92ZXIgNAorCis9aXRlbSAqIE1hY3Jvcy4KKworVGhpcyB3b3VsZCBzb2x2ZSBzb21lIG90aGVyIHByb2JsZW1zIG5lYXRseS4gSG93ZXZlciwgdGhlIGZvcm1hdCBvZiBFeGNlbCBtYWNyb3MgaXNuJ3QgZG9jdW1lbnRlZC4KKworPWl0ZW0gKiBTb21lIGZlYXR1cmUgdGhhdCB5b3UgcmVhbGx5IG5lZWQuIDstKQorCisKKz1iYWNrCisKK0lmIHRoZXJlIGlzIHNvbWUgZmVhdHVyZSBvZiBhbiBFeGNlbCBmaWxlIHRoYXQgeW91IHJlYWxseSwgcmVhbGx5IG5lZWQgdGhlbiB5b3Ugc2hvdWxkIHVzZSBXaW4zMjo6T0xFIHdpdGggRXhjZWwgb24gV2luZG93cy4gSWYgeW91IGFyZSBvbiBVbml4IHlvdSBjb3VsZCBjb25zaWRlciBjb25uZWN0aW5nIHRvIGEgV2luZG93cyBzZXJ2ZXIgdmlhIERvY3NlcnZlciBvciBTT0FQLCBzZWUgTDxXUklUSU5HIEVYQ0VMIEZJTEVTPi4KKworCisKKworPWhlYWQxIFJFUE9TSVRPUlkKKworVGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHNvdXJjZSBjb2RlIGluIGhvc3Qgb24gZ2l0aHViOiBMPGh0dHA6Ly9naXRodWIuY29tL2ptY25hbWFyYS9zcHJlYWRzaGVldC13cml0ZWV4Y2VsPi4KKworCisKKworPWhlYWQxIE1BSUxJTkcgTElTVAorCitUaGVyZSBpcyBhIEdvb2dsZSBncm91cCBmb3IgZGlzY3Vzc2luZyBhbmQgYXNraW5nIHF1ZXN0aW9ucyBhYm91dCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4gVGhpcyBpcyBhIGdvb2QgcGxhY2UgdG8gc2VhcmNoIHRvIHNlZSBpZiB5b3VyIHF1ZXN0aW9uIGhhcyBiZWVuIGFza2VkIGJlZm9yZTogIEw8aHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL3NwcmVhZHNoZWV0LXdyaXRlZXhjZWw+LgorCis9YmVnaW4gaHRtbAorCis8Y2VudGVyPgorPHRhYmxlIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyBwYWRkaW5nOiA1cHg7IiBjZWxsc3BhY2luZz0wPgorICA8dHI+PHRkPgorICA8aW1nIHNyYz0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2ludGwvZW4vaW1hZ2VzL2xvZ29zL2dyb3Vwc19sb2dvX3NtLmdpZiIKKyAgICAgICAgIGhlaWdodD0zMCB3aWR0aD0xNDAgYWx0PSJHb29nbGUgR3JvdXBzIj4KKyAgPC90ZD48L3RyPgorICA8dHI+PHRkPgorICA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvc3ByZWFkc2hlZXQtd3JpdGVleGNlbCI+U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw8L2E+CisgIDwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L2NlbnRlcj4KKworPWVuZCBodG1sCisKKworCitBbHRlcm5hdGl2ZWx5IHlvdSBjYW4ga2VlcCB1cCB0byBkYXRlIHdpdGggZnV0dXJlIHJlbGVhc2VzIGJ5IHN1YnNjcmliaW5nIGF0OgorTDxodHRwOi8vZnJlc2htZWF0Lm5ldC9wcm9qZWN0cy93cml0ZWV4Y2VsLz4uCisKKworCisKKz1oZWFkMSBET05BVElPTlMKKworSWYgeW91J2QgY2FyZSB0byBkb25hdGUgdG8gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHByb2plY3QsIHlvdSBjYW4gZG8gc28gdmlhIFBheVBhbDogTDxodHRwOi8vdGlueXVybC5jb20vN2F5ZXM+LgorCisKKworCis9aGVhZDEgU0VFIEFMU08KKworU3ByZWFkc2hlZXQ6OlBhcnNlRXhjZWw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVBhcnNlRXhjZWw+LgorCitTcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLUZyb21YTUw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtRnJvbVhNTD4uCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGcm9tREI6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtRnJvbURCPi4KKworRXhjZWw6OlRlbXBsYXRlOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfnJraW55b24vRXhjZWwtVGVtcGxhdGUvPi4KKworRGF0ZVRpbWU6OkZvcm1hdDo6RXhjZWw6IEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9kaXN0L0RhdGVUaW1lLUZvcm1hdC1FeGNlbD4uCisKKyJSZWFkaW5nIGFuZCB3cml0aW5nIEV4Y2VsIGZpbGVzIHdpdGggUGVybCIgYnkgVGVvZG9yIFpsYXRhbm92LCBhdCBJQk0gZGV2ZWxvcGVyV29ya3M6IEw8aHR0cDovL3d3dy0xMDYuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9saWJyYXJ5L2wtcGV4Y2VsLz4uCisKKyJFeGNlbC1EYXRlaWVuIG1pdCBQZXJsIGVyc3RlbGxlbiAtIENvbnRyb2xsZXIgaW0gR2x1Y2siIGJ5IFBldGVyIERpbnRlbG1hbm4gYW5kIENocmlzdGlhbiBLaXJzY2ggaW4gdGhlIEdlcm1hbiBVbml4L3dlYiBqb3VybmFsIGlYOiBMPGh0dHA6Ly93d3cuaGVpc2UuZGUvaXgvYXJ0aWtlbC8yMDAxLzA2LzE3NS8+LgorCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uIGluIEphcGFuZXNlIGJ5IFRha2Fub3JpIEthd2FpLiBMPGh0dHA6Ly9tZW1iZXIubmlmdHkubmUuanAvaGlwcG8yMDAwL3Blcmx0aXBzL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwuaHRtPi4KKworT2VzdGVybHkgdXNlciBicnVzaGVzIHdpdGggZmFtZToKK0w8aHR0cDovL29lc3Rlcmx5LmNvbS9yZWxlYXNlcy8xMjEwMjAwMC5odG1sPi4KKworVGhlIGNzdjJ4bHMgcHJvZ3JhbSB0aGF0IGlzIHBhcnQgb2YgVGV4dDo6Q1NWX1hTOgorTDxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL35obWJyYW5kL1RleHQtQ1NWX1hTL01BTklGRVNUPi4KKworCisKKz1oZWFkMSBBQ0tOT1dMRURHTUVOVFMKKworCitUaGUgZm9sbG93aW5nIHBlb3BsZSBjb250cmlidXRlZCB0byB0aGUgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCitBbGV4YW5kZXIgRmFyYmVyLCBBbmRyZSBkZSBCcnVpbiwgQXJ0aHVyQGFpcywgQXJ0dXIgU2lsdmVpcmEgZGEgQ3VuaGEsIEJvYiBSb3NlLCBCb3JnYXIgT2xzZW4sIEJyaWFuIEZvbGV5LCBCcmlhbiBXaGl0ZSwgQm9iIE1hY2theSwgQ2VkcmljIEJvdXZpZXIsIENoYWQgSm9obnNvbiwgQ1BBTiB0ZXN0ZXJzLCBEYW15YW4gSXZhbm92LCBEYW5pZWwgQmVyZ2VyLCBEYW5pZWwgR2FyZG5lciwgRG1pdHJ5IEtvY2h1cm92LCBFcmljIEZyYXppZXIsIEVybmVzdG8gQmFzY2hueSwgRmVsaXBlIFBlcmV6IEdhbGlhbmEsIEdvcmRvbiBTaW1wc29uLCBIYW5jIFBhdmVsLCBIYXJvbGQgQmFtZm9yZCwgSmFtZXMgSG9sbWVzLCBKYW1lcyBXaWxraW5zb24sIEpvaGFuIEVrZW5iZXJnLCBKb2hhbm4gSGFubmUsIEpvbmF0aGFuIFNjb3R0IER1ZmYsIEouQy4gV3JlbiwgS2VubmV0aCBTdGFjZXksIEtlaXRoIE1pbGxlciwgS3lsZSBLcm9tLCBNYXJjIFJvc2VudGhhbCwgTWFya3VzIFNjaG1pdHosIE1pY2hhZWwgQnJhaWcsIE1pY2hhZWwgQnVzY2hhdWVyLCBNaWtlIEJsYXplciwgTWljaGFlbCBFcmlja3NvbiwgTWljaGFlbCBXIEogV2VzdCwgTmluZyBYaWUsIFBhdWwgSi4gRmFsYmUsIFBhdWwgTWVkeW5za2ksIFBldGVyIERpbnRlbG1hbm4sIFBpZXJyZSBMYXBsYW50ZSwgUHJhdmVlbiBLb3RoYSwgUmV0byBCYWRlcnRzY2hlciwgUmljaCBTb3JkZW4sIFNoYW5lIEFzaGJ5LCBTaGFycm9uIE1jS2VuemllLCBTaGVueXUgWmhlbmcsIFN0ZXBoYW4gTG9lc2NoZXIsIFN0ZXZlIFNhcG92aXRzLCBTdmVuIFBhc3NpZywgU3ZldG9zbGF2IE1hcmlub3YsIFRhbWFzIEd1bGFjc2ksIFRyb3kgRGFuaWVscywgVmFoZSBTYXJraXNzaWFuLgorCitUaGUgZm9sbG93aW5nIHBlb3BsZSBjb250cmlidXRlZCBwYXRjaGVzLCBleGFtcGxlcyBvciBFeGNlbCBpbmZvcm1hdGlvbjoKKworQW5kcmV3IEJlbmhhbSwgQmlsbCBZb3VuZywgQ2VkcmljIEJvdXZpZXIsIENoYXJsZXMgV3liYmxlLCBEYW5pZWwgUmVudHosIERhdmlkIFJvYmlucywgRnJhbmNvIFZlbnR1cmksIEd1eSBBbGJlcnRlbGxpLCBJYW4gUGVubWFuLCBKb2huIEhlaXRtYW5uLCBKb24gR3V5LCBLeWxlIFIuIEJ1cnRvbiwgUGllcnJlLUplYW4gVm91ZXR0ZSwgUnViaW8sIE1hcmNvIEdlcmksIE1hcmsgRm93bGVyLCBNYXRpc3NlIEVuemVyLCBTYW0gS2luZ3RvbiwgVGFrYW5vcmkgS2F3YWksIFRvbSBPJ1N1bGxpdmFuLgorCitNYW55IHRoYW5rcyB0byBSb24gTWNLZWx2ZXksIFJvbnpvIENvbnN1bHRpbmcgZm9yIFNpZW1lbnMsIHdobyBzcG9uc29yZWQgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBmb3JtdWxhIGNhY2hpbmcgcm91dGluZXMuCisKK01hbnkgdGhhbmtzIHRvIENhc3NlbnMgVHJhbnNwb3J0IHdobyBzcG9uc29yZWQgdGhlIGRldmVsb3BtZW50IG9mIHRoZSBlbWJlZGRlZCBjaGFydHMgYW5kIGF1dG9maWx0ZXJzLgorCitBZGRpdGlvbmFsIHRoYW5rcyB0byBUYWthbm9yaSBLYXdhaSBmb3IgdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50YXRpb24gaW50byBKYXBhbmVzZS4KKworR3VubmFyIFdvbGYgbWFpbnRhaW5zIHRoZSBEZWJpYW4gZGlzdHJvLgorCitUaGFua3MgdG8gRGFtaWFuIENvbndheSBmb3IgdGhlIGV4Y2VsbGVudCBQYXJzZTo6UmVjRGVzY2VudC4KKworVGhhbmtzIHRvIFRpbSBKZW5uZXNzIGZvciBGaWxlOjpUZW1wLgorCitUaGFua3MgdG8gTWljaGFlbCBNZWVrcyBhbmQgSm9keSBHb2xkYmVyZyBmb3IgdGhlaXIgd29yayBvbiBHbnVtZXJpYy4KKworCisKKworPWhlYWQxIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkKKworQmVjYXVzZSB0aGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGZyZWUgb2YgY2hhcmdlLCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHNvZnR3YXJlLCB0byB0aGUgZXh0ZW50IHBlcm1pdHRlZCBieSBhcHBsaWNhYmxlIGxhdy4gRXhjZXB0IHdoZW4gb3RoZXJ3aXNlIHN0YXRlZCBpbiB3cml0aW5nIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQvb3Igb3RoZXIgcGFydGllcyBwcm92aWRlIHRoZSBzb2Z0d2FyZSAiYXMgaXMiIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gVGhlIGVudGlyZSByaXNrIGFzIHRvIHRoZSBxdWFsaXR5IGFuZCBwZXJmb3JtYW5jZSBvZiB0aGUgc29mdHdhcmUgaXMgd2l0aCB5b3UuIFNob3VsZCB0aGUgc29mdHdhcmUgcHJvdmUgZGVmZWN0aXZlLCB5b3UgYXNzdW1lIHRoZSBjb3N0IG9mIGFsbCBuZWNlc3Nhcnkgc2VydmljaW5nLCByZXBhaXIsIG9yIGNvcnJlY3Rpb24uCisKK0luIG5vIGV2ZW50IHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyB3aWxsIGFueSBjb3B5cmlnaHQgaG9sZGVyLCBvciBhbnkgb3RoZXIgcGFydHkgd2hvIG1heSBtb2RpZnkgYW5kL29yIHJlZGlzdHJpYnV0ZSB0aGUgc29mdHdhcmUgYXMgcGVybWl0dGVkIGJ5IHRoZSBhYm92ZSBsaWNlbmNlLCBiZSBsaWFibGUgdG8geW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGdlbmVyYWwsIHNwZWNpYWwsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBhcmlzaW5nIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlIHNvZnR3YXJlIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGxvc3Mgb2YgZGF0YSBvciBkYXRhIGJlaW5nIHJlbmRlcmVkIGluYWNjdXJhdGUgb3IgbG9zc2VzIHN1c3RhaW5lZCBieSB5b3Ugb3IgdGhpcmQgcGFydGllcyBvciBhIGZhaWx1cmUgb2YgdGhlIHNvZnR3YXJlIHRvIG9wZXJhdGUgd2l0aCBhbnkgb3RoZXIgc29mdHdhcmUpLCBldmVuIGlmIHN1Y2ggaG9sZGVyIG9yIG90aGVyIHBhcnR5IGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKworCisKKworPWhlYWQxIExJQ0VOU0UKKworRWl0aGVyIHRoZSBQZXJsIEFydGlzdGljIExpY2VuY2UgTDxodHRwOi8vZGV2LnBlcmwub3JnL2xpY2Vuc2VzL2FydGlzdGljLmh0bWw+IG9yIHRoZSBHUEwgTDxodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2dwbC1saWNlbnNlLnBocD4uCisKKworCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworICAgIEFub3RoZXIgZGF5IGluIEp1bmUsIHdlJ2xsIHBpY2sgZWxldmVuIGZvciBmb290YmFsbAorICAgIChQaWNrIGVsZXZlbiBmb3IgZm9vdGJhbGwpCisgICAgV2UncmUgcGxheWluZyBmb3Igb3VyIGxpdmVzIHRoZSByZWZlcmVlIGdpdmVzIHVzIGZ1Y2sgYWxsCisgICAgKFJlZiB5b3UncmUgZ2l2aW5nIHVzIGZ1Y2sgYWxsKQorICAgIEkgc2F3IHlvdSB3aXRoIHRoZSBjb3JuZXIgb2YgbXkgZXllIG9uIHRoZSBzaWRlbGluZXMKKyAgICBZb3VyIGRhcmsgbWFzY2FyYSBiaWRzIG1lIHRvIGhpc3RvcmljYWwgZGVlZHMKKworICAgICAgICAtLSBCZWxsZSBhbmQgU2ViYXN0aWFuCisKKworCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0JJRkZ3cml0ZXIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0JJRkZ3cml0ZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2MThhNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQklGRndyaXRlci5wbQpAQCAtMCwwICsxLDMxNiBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCSUZGd3JpdGVyIC0gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRXhjZWwgd29ya2Jvb2tzIGFuZCB3b3Jrc2hlZXRzLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OworCisKKworCisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENsYXNzIGRhdGEuCisjCitteSAkYnl0ZV9vcmRlciAgID0gJyc7CitteSAkQklGRl92ZXJzaW9uID0gMHgwNjAwOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzICA9ICRfWzBdOworCisgICAgbXkgJHNlbGYgICA9IHsKKyAgICAgICAgICAgICAgICAgICAgX2J5dGVfb3JkZXIgICAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgX2RhdGEgICAgICAgICAgICA9PiAnJywKKyAgICAgICAgICAgICAgICAgICAgX2RhdGFzaXplICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbGltaXQgICAgICAgICAgID0+IDgyMjQsCisgICAgICAgICAgICAgICAgICAgIF9pZ25vcmVfY29udGludWUgPT4gMCwKKyAgICAgICAgICAgICAgICAgfTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9zZXRfYnl0ZV9vcmRlcigpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfYnl0ZV9vcmRlcigpCisjCisjIERldGVybWluZSB0aGUgYnl0ZSBvcmRlciBhbmQgc3RvcmUgaXQgYXMgY2xhc3MgZGF0YSB0byBhdm9pZAorIyByZWNhbGN1bGF0aW5nIGl0IGZvciBlYWNoIGNhbGwgdG8gbmV3KCkuCisjCitzdWIgX3NldF9ieXRlX29yZGVyIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBpZiAoJGJ5dGVfb3JkZXIgZXEgJycpeworICAgICAgICAjIENoZWNrIGlmICJwYWNrIiBnaXZlcyB0aGUgcmVxdWlyZWQgSUVFRSA2NGJpdCBmbG9hdAorICAgICAgICBteSAkdGVzdHN0ciA9IHBhY2sgImQiLCAxLjIzNDU7CisgICAgICAgIG15IEBoZXhkYXRhID0oMHg4RCwgMHg5NywgMHg2RSwgMHgxMiwgMHg4MywgMHhDMCwgMHhGMywgMHgzRik7CisgICAgICAgIG15ICRudW1iZXIgID0gcGFjayAiQzgiLCBAaGV4ZGF0YTsKKworICAgICAgICBpZiAoJG51bWJlciBlcSAkdGVzdHN0cikgeworICAgICAgICAgICAgJGJ5dGVfb3JkZXIgPSAwOyAgICAjIExpdHRsZSBFbmRpYW4KKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJG51bWJlciBlcSByZXZlcnNlKCR0ZXN0c3RyKSl7CisgICAgICAgICAgICAkYnl0ZV9vcmRlciA9IDE7ICAgICMgQmlnIEVuZGlhbgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBHaXZlIHVwLiBJJ2xsIGZpeCB0aGlzIGluIGEgbGF0ZXIgdmVyc2lvbi4KKyAgICAgICAgICAgIGNyb2FrICggIlJlcXVpcmVkIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBub3Qgc3VwcG9ydGVkICIgIC4KKyAgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0uIFNlZSB0aGUgcG9ydGFiaWxpdHkgc2VjdGlvbiAiIC4KKyAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBkb2N1bWVudGF0aW9uLiIKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgJHNlbGYtPntfYnl0ZV9vcmRlcn0gPSAkYnl0ZV9vcmRlcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wcmVwZW5kKCRkYXRhKQorIworIyBHZW5lcmFsIHN0b3JhZ2UgZnVuY3Rpb24KKyMKK3N1YiBfcHJlcGVuZCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgID0gam9pbignJywgQF8pOworCisgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICRzZWxmLT57X2RhdGF9ICAgICAgPSAkZGF0YSAuICRzZWxmLT57X2RhdGF9OworICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgkZGF0YSkKKyMKKyMgR2VuZXJhbCBzdG9yYWdlIGZ1bmN0aW9uCisjCitzdWIgX2FwcGVuZCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgID0gam9pbignJywgQF8pOworCisgICAgJGRhdGEgPSAkc2VsZi0+X2FkZF9jb250aW51ZSgkZGF0YSkgaWYgbGVuZ3RoKCRkYXRhKSA+ICRzZWxmLT57X2xpbWl0fTsKKworICAgICRzZWxmLT57X2RhdGF9ICAgICAgPSAkc2VsZi0+e19kYXRhfSAuICRkYXRhOworICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2JvZigkdHlwZSkKKyMKKyMgJHR5cGUgPSAweDAwMDUsIFdvcmtib29rCisjICR0eXBlID0gMHgwMDEwLCBXb3Jrc2hlZXQKKyMgJHR5cGUgPSAweDAwMjAsIENoYXJ0CisjCisjIFdyaXRlcyBFeGNlbCBCT0YgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJlYW0gb3IKKyMgc3ViLXN0cmVhbSBpbiB0aGUgQklGRiBmaWxlLgorIworc3ViIF9zdG9yZV9ib2YgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICA9IDB4MDgwOTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxMDsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHZlcnNpb24gPSAkQklGRl92ZXJzaW9uOworICAgIG15ICR0eXBlICAgID0gJF9bMF07CisKKyAgICAjIEFjY29yZGluZyB0byB0aGUgU0RLICRidWlsZCBhbmQgJHllYXIgc2hvdWxkIGJlIHNldCB0byB6ZXJvLgorICAgICMgSG93ZXZlciwgdGhpcyB0aHJvd3MgYSB3YXJuaW5nIGluIEV4Y2VsIDUuIFNvLCB1c2UgdGhlc2UKKyAgICAjIG1hZ2ljIG51bWJlcnMuCisgICAgbXkgJGJ1aWxkICAgPSAweDBEQkI7CisgICAgbXkgJHllYXIgICAgPSAweDA3Q0M7CisKKyAgICBteSAkYmZoICAgICA9IDB4MDAwMDAwNDE7CisgICAgbXkgJHNmbyAgICAgPSAweDAwMDAwMDA2OworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZ2VlYiLCAkdmVyc2lvbiwgJHR5cGUsICRidWlsZCwgJHllYXIsICRiZmgsICRzZm8pOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9lb2YoKQorIworIyBXcml0ZXMgRXhjZWwgRU9GIHJlY29yZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgQklGRiBzdHJlYW0uCisjCitzdWIgX3N0b3JlX2VvZiB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgICA9IDB4MDAwQTsgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMDA7ICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfY29udGludWUoKQorIworIyBFeGNlbCBsaW1pdHMgdGhlIHNpemUgb2YgQklGRiByZWNvcmRzLiBJbiBFeGNlbCA1IHRoZSBsaW1pdCBpcyAyMDg0IGJ5dGVzLiBJbgorIyBFeGNlbCA5NyB0aGUgbGltaXQgaXMgODIyOCBieXRlcy4gUmVjb3JkcyB0aGF0IGFyZSBsb25nZXIgdGhhbiB0aGVzZSBsaW1pdHMKKyMgbXVzdCBiZSBzcGxpdCB1cCBpbnRvIENPTlRJTlVFIGJsb2Nrcy4KKyMKKyMgVGhpcyBmdW5jdGlvbiB0YWtlIGEgbG9uZyBCSUZGIHJlY29yZCBhbmQgaW5zZXJ0cyBDT05USU5VRSByZWNvcmRzIGFzCisjIG5lY2Vzc2FyeS4KKyMKKyMgU29tZSByZWNvcmRzIGhhdmUgdGhlaXIgb3duIHNwZWNpYWxpc2VkIENvbnRpbnVlIGJsb2NrcyBzbyB0aGVyZSBpcyBhbHNvIGFuCisjIG9wdGlvbiB0byBieXBhc3MgdGhpcyBmdW5jdGlvbi4KKyMKK3N1YiBfYWRkX2NvbnRpbnVlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgICAgICA9ICRfWzBdOworICAgIG15ICRsaW1pdCAgICAgICA9ICRzZWxmLT57X2xpbWl0fTsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwM0M7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkaGVhZGVyOworICAgIG15ICR0bXA7CisKKyAgICAjIFNraXAgdGhpcyBpZiBhbm90aGVyIG1ldGhvZCBoYW5kbGVzIHRoZSBjb250aW51ZSBibG9ja3MuCisgICAgcmV0dXJuICRkYXRhIGlmICRzZWxmLT57X2lnbm9yZV9jb250aW51ZX07CisKKyAgICAjIFRoZSBmaXJzdCAyMDgwLzgyMjQgYnl0ZXMgcmVtYWluIGludGFjdC4gSG93ZXZlciwgd2UgaGF2ZSB0byBjaGFuZ2UKKyAgICAjIHRoZSBsZW5ndGggZmllbGQgb2YgdGhlIHJlY29yZC4KKyAgICAjCisgICAgJHRtcCA9IHN1YnN0cigkZGF0YSwgMCwgJGxpbWl0LCAiIik7CisgICAgc3Vic3RyKCR0bXAsIDIsIDIsIHBhY2soInYiLCAkbGltaXQtNCkpOworCisgICAgIyBTdHJpcCBvdXQgY2h1bmtzIG9mIDIwODAvODIyNCBieXRlcyArNCBmb3IgdGhlIGhlYWRlci4KKyAgICB3aGlsZSAobGVuZ3RoKCRkYXRhKSA+ICRsaW1pdCkgeworICAgICAgICAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxpbWl0KTsKKyAgICAgICAgJHRtcCAgICAuPSAkaGVhZGVyOworICAgICAgICAkdG1wICAgIC49IHN1YnN0cigkZGF0YSwgMCwgJGxpbWl0LCAiIik7CisgICAgfQorCisgICAgIyBNb3AgdXAgdGhlIGxhc3Qgb2YgdGhlIGRhdGEKKyAgICAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgbGVuZ3RoKCRkYXRhKSk7CisgICAgJHRtcCAgICAuPSAkaGVhZGVyOworICAgICR0bXAgICAgLj0gJGRhdGE7CisKKyAgICByZXR1cm4gJHRtcCA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYWRkX21zb19nZW5lcmljKCkKKyMKKyMgQ3JlYXRlIGEgbXNvIHN0cnVjdHVyZSB0aGF0IGlzIHBhcnQgb2YgYW4gRXNjaGVyIGRyYXdpbmcgb2JqZWN0LiBUaGVzZSBhcmUKKyMgYXJlIHVzZWQgZm9yIGltYWdlcywgY29tbWVudHMgYW5kIGZpbHRlcnMuIFRoaXMgZ2VuZXJpYyBtZXRob2QgaXMgdXNlZCBieQorIyBvdGhlciBtZXRob2RzIHRvIGNyZWF0ZSBzcGVjaWZpYyBtc28gcmVjb3Jkcy4KKyMKKyMgUmV0dXJucyB0aGUgcGFja2VkIHJlY29yZC4KKyMKK3N1YiBfYWRkX21zb19nZW5lcmljIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICR0eXBlICAgICAgICA9ICRfWzBdOworICAgIG15ICR2ZXJzaW9uICAgICA9ICRfWzFdOworICAgIG15ICRpbnN0YW5jZSAgICA9ICRfWzJdOworICAgIG15ICRkYXRhICAgICAgICA9ICRfWzNdOworICAgIG15ICRsZW5ndGggICAgICA9IGRlZmluZWQgJF9bNF0gPyAkX1s0XSA6IGxlbmd0aCgkZGF0YSk7CisKKyAgICAjIFRoZSBoZWFkZXIgY29udGFpbnMgdmVyc2lvbiBhbmQgaW5zdGFuY2UgaW5mbyBwYWNrZWQgaW50byAyIGJ5dGVzLgorICAgIG15ICRoZWFkZXIgICAgICA9ICR2ZXJzaW9uIHwgKCRpbnN0YW5jZSA8PCA0KTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IHBhY2sgInZ2ViIsICRoZWFkZXIsICR0eXBlLCAkbGVuZ3RoOworICAgICAgICRyZWNvcmQgICAgIC49ICRkYXRhOworCisgICAgcmV0dXJuICRyZWNvcmQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGb3IgZGVidWdnaW5nCisjCitzdWIgX2hleG91dCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcHJpbnQgKyhjYWxsZXIoMSkpWzNdLCAiXG4iOworCisgICAgbXkgJGRhdGEgPSBqb2luICcnLCBAXzsKKworICAgIG15IEBieXRlcyA9IHVucGFjaygiSCoiLCAkZGF0YSkgPX4gLy4uL2c7CisKKyAgICB3aGlsZSAoQGJ5dGVzID4gMTYpIHsKKyAgICAgICAgcHJpbnQgam9pbiAiICIsIHNwbGljZSBAYnl0ZXMsIDAsIDE2OworICAgICAgICBwcmludCAiXG4iOworICAgIH0KKyAgICBwcmludCBqb2luICIgIiwgQGJ5dGVzLCAiXG5cbiI7Cit9CisKKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitCSUZGd3JpdGVyIC0gQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRXhjZWwgd29ya2Jvb2tzIGFuZCB3b3Jrc2hlZXRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQmlnLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9CaWcucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyNmZlNgotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQmlnLnBtCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJpZzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXcml0ZUV4Y2VsOjpCaWcKKyMKKyMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgLSBXcml0ZSBmb3JtYXR0ZWQgdGV4dCBhbmQgbnVtYmVycyB0byBhCisjIGNyb3NzLXBsYXRmb3JtIEV4Y2VsIGJpbmFyeSBmaWxlLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLgorIworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vazsKKworCisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3JrYm9vayBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLiBUaGluIHdyYXBwZXIgZm9yIGEgV29ya2Jvb2sgb2JqZWN0LgorIworIyBUaGlzIG1vZHVsZSBpcyBubyBsb25nZXIgcmVxdWlyZWQgZGlyZWN0bHkgYW5kIGl0cyB1c2UgaXMgZGVwcmVjYXRlZC4gU2VlCisjIHRoZSBQb2QgZG9jdW1lbnRhdGlvbiBiZWxvdy4KKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rLT5uZXcoQF8pOworCisgICAgIyBDaGVjayBmb3IgZmlsZSBjcmVhdGlvbiBmYWlsdXJlcyBiZWZvcmUgcmUtYmxlc3NpbmcKKyAgICBibGVzcyAgJHNlbGYsICRjbGFzcyBpZiBkZWZpbmVkICRzZWxmOworCisgICAgcmV0dXJuICRzZWxmOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKworPWhlYWQxIE5BTUUKKworCitCaWcgLSBBIGNsYXNzIGZvciBjcmVhdGluZyBFeGNlbCBmaWxlcyA+IDdNQi4KKworCis9aGVhZDEgU1lOT1BTSVMKKworVXNlIG9mIHRoaXMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuIFNlZSBiZWxvdy4KKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIG1vZHVsZSB3YXMgYSBzdWItY2xhc3Mgb2YgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdXNlZCBmb3IgY3JlYXRpbmcgRXhjZWwgZmlsZXMgZ3JlYXRlciB0aGFuIDdNQi4gSG93ZXZlciwgaXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZCBpcyBub3cgZGVwcmVjYXRlZC4KKworQXMgb2YgdmVyc2lvbiAyLjE3IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNhbiBjcmVhdGUgZmlsZXMgbGFyZ2VyIHRoYW4gN01CIGRpcmVjdGx5IGlmIE9MRTo6U3RvcmFnZV9MaXRlIGlzIGluc3RhbGxlZC4KKworVGhpcyBtb2R1bGUgb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZiB5b3VyIHByb2dyYW1zIHVzZSA6OkJpZyB5b3Ugc2hvdWxkIGNvbnZlcnQgdGhlbSB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRFeGNlbCBkaXJlY3RseS4KKworCis9aGVhZDEgUkVRVUlSRU1FTlRTCisKK0w8T0xFOjpTdG9yYWdlX0xpdGU+LgorCisKKz1oZWFkMSBBVVRIT1IKKworCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCisKKz1oZWFkMSBDT1BZUklHSFQKKworCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJmNDkyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC5wbQpAQCAtMCwwICsxLDMwNjIgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIENoYXJ0IC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIENoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBGaWxlSGFuZGxlOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldCk7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEZvcm1hdHRpbmcgaW5mb3JtYXRpb24uCisjCisjIHBlcmx0aWR5IHdpdGggb3B0aW9uczogLW1ibD0yIC1wdD0wIC1ub2xhCisjCisjIEFueSBjYW1lbCBjYXNlIEh1bmdhcmlhbiBub3RhdGlvbiBzdHlsZSB2YXJpYWJsZSBuYW1lcyBpbiB0aGUgQklGRiByZWNvcmQKKyMgd3JpdGluZyBzdWItcm91dGluZXMgYmVsb3cgYXJlIGZvciBzaW1pbGFyaXR5IHdpdGggbmFtZXMgdXNlZCBpbiB0aGUgRXhjZWwKKyMgZG9jdW1lbnRhdGlvbi4gT3RoZXJ3aXNlIGxvd2VyY2FzZSB1bmRlcnNjb3JlIHN0eWxlIG5hbWVzIGFyZSB1c2VkLgorIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhlIGNoYXJ0IGNsYXNzIGhpZXJhcmNoeSBpcyBhcyBmb2xsb3dzLiBDaGFydC5wbSBhY3RzIGFzIGEgZmFjdG9yeSBmb3IgdGhlCisjIHN1Yi1jbGFzc2VzLgorIworIworIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJJRkZ3cml0ZXIKKyMgICAgICAgICAgICAgICAgICAgICBeCisjICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldAorIyAgICAgICAgICAgICAgICAgICAgIF4KKyMgICAgICAgICAgICAgICAgICAgICB8CisjICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQKKyMgICAgICAgICAgICAgICAgICAgICBeCisjICAgICAgICAgICAgICAgICAgICAgfAorIyAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjoqIChzdWItdHlwZXMpCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBmYWN0b3J5KCkKKyMKKyMgRmFjdG9yeSBtZXRob2QgZm9yIHJldHVybmluZyBjaGFydCBvYmplY3RzIGJhc2VkIG9uIHRoZWlyIGNsYXNzIHR5cGUuCisjCitzdWIgZmFjdG9yeSB7CisKKyAgICBteSAkY3VycmVudF9jbGFzcyAgPSBzaGlmdDsKKyAgICBteSAkY2hhcnRfc3ViY2xhc3MgPSBzaGlmdDsKKworICAgICRjaGFydF9zdWJjbGFzcyA9IHVjZmlyc3QgbGMgJGNoYXJ0X3N1YmNsYXNzOworCisgICAgbXkgJG1vZHVsZSA9ICJTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OiIgLiAkY2hhcnRfc3ViY2xhc3M7CisKKyAgICBldmFsICJyZXF1aXJlICRtb2R1bGUiOworCisgICAgIyBUT0RPLiBOZWVkIHRvIHJlLXJhaXNlIHRoaXMgZXJyb3IgZnJvbSBXb3JrYm9vazo6YWRkX2NoYXJ0KCkuCisgICAgZGllICJDaGFydCB0eXBlICckY2hhcnRfc3ViY2xhc3MnIG5vdCBzdXBwb3J0ZWQgaW4gYWRkX2NoYXJ0KClcbiIgaWYgJEA7CisKKyAgICByZXR1cm4gJG1vZHVsZS0+bmV3KCBAXyApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgRGVmYXVsdCBjb25zdHJ1Y3RvciBmb3Igc3ViLWNsYXNzZXMuCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQtPm5ldyggQF8gKTsKKworICAgICRzZWxmLT57X3NoZWV0X3R5cGV9ICA9IDB4MDIwMDsKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gPSAweDA7CisgICAgJHNlbGYtPntfc2VyaWVzfSAgICAgID0gW107CisgICAgJHNlbGYtPntfZW1iZWRkZWR9ICAgID0gMDsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9zZXRfZGVmYXVsdF9wcm9wZXJ0aWVzKCk7CisgICAgJHNlbGYtPl9zZXRfZGVmYXVsdF9jb25maWdfZGF0YSgpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFB1YmxpYyBtZXRob2RzLgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgYWRkX3NlcmllcygpCisjCisjIEFkZCBhIHNlcmllcyBhbmQgaXQncyBwcm9wZXJ0aWVzIHRvIGEgY2hhcnQuCisjCitzdWIgYWRkX3NlcmllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVhcmcgID0gQF87CisKKyAgICBjcm9hayAiTXVzdCBzcGVjaWZ5ICd2YWx1ZXMnIGluIGFkZF9zZXJpZXMoKSIgaWYgIWV4aXN0cyAkYXJne3ZhbHVlc307CisKKyAgICAjIFBhcnNlIHRoZSByYW5nZXMgdG8gdmFsaWRhdGUgdGhlbSBhbmQgZXh0cmFjdCBzYWxpZW50IGluZm9ybWF0aW9uLgorICAgIG15IEB2YWx1ZV9kYXRhICAgID0gJHNlbGYtPl9wYXJzZV9zZXJpZXNfZm9ybXVsYSggJGFyZ3t2YWx1ZXN9ICk7CisgICAgbXkgQGNhdGVnb3J5X2RhdGEgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne2NhdGVnb3JpZXN9ICk7CisgICAgbXkgJG5hbWVfZm9ybXVsYSAgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne25hbWVfZm9ybXVsYX0gKTsKKworICAgICMgRGVmYXVsdCBjYXRlZ29yeSBjb3VudCB0byB0aGUgc2FtZSBhcyB0aGUgdmFsdWUgY291bnQgaWYgbm90IGRlZmluZWQuCisgICAgaWYgKCAhZGVmaW5lZCAkY2F0ZWdvcnlfZGF0YVsxXSApIHsKKyAgICAgICAgJGNhdGVnb3J5X2RhdGFbMV0gPSAkdmFsdWVfZGF0YVsxXTsKKyAgICB9CisKKyAgICAjIEFkZCB0aGUgcGFyc2VkIGRhdGEgdG8gdGhlIHVzZXIgc3VwcGxpZWQgZGF0YS4KKyAgICAlYXJnID0gKAorICAgICAgICBAXywKKyAgICAgICAgX3ZhbHVlcyAgICAgICA9PiBcQHZhbHVlX2RhdGEsCisgICAgICAgIF9jYXRlZ29yaWVzICAgPT4gXEBjYXRlZ29yeV9kYXRhLAorICAgICAgICBfbmFtZV9mb3JtdWxhID0+ICRuYW1lX2Zvcm11bGEKKyAgICApOworCisgICAgIyBFbmNvZGUgdGhlIFNlcmllcyBuYW1lLgorICAgIG15ICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICRzZWxmLT5fZW5jb2RlX3V0ZjE2KCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9ICk7CisKKyAgICAkYXJne25hbWV9ICAgICAgICAgID0gJG5hbWU7CisgICAgJGFyZ3tuYW1lX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKworICAgIHB1c2ggQHsgJHNlbGYtPntfc2VyaWVzfSB9LCBcJWFyZzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF94X2F4aXMoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIFgtYXhpcy4KKyMKK3N1YiBzZXRfeF9heGlzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIG15ICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICRzZWxmLT5fZW5jb2RlX3V0ZjE2KCAkYXJne25hbWV9LCAkYXJne25hbWVfZW5jb2Rpbmd9ICk7CisKKyAgICBteSAkZm9ybXVsYSA9ICRzZWxmLT5fcGFyc2Vfc2VyaWVzX2Zvcm11bGEoICRhcmd7bmFtZV9mb3JtdWxhfSApOworCisgICAgJHNlbGYtPntfeF9heGlzX25hbWV9ICAgICA9ICRuYW1lOworICAgICRzZWxmLT57X3hfYXhpc19lbmNvZGluZ30gPSAkZW5jb2Rpbmc7CisgICAgJHNlbGYtPntfeF9heGlzX2Zvcm11bGF9ICA9ICRmb3JtdWxhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3lfYXhpcygpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgWS1heGlzLgorIworc3ViIHNldF95X2F4aXMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAlYXJnICA9IEBfOworCisgICAgbXkgKCAkbmFtZSwgJGVuY29kaW5nICkgPQorICAgICAgJHNlbGYtPl9lbmNvZGVfdXRmMTYoICRhcmd7bmFtZX0sICRhcmd7bmFtZV9lbmNvZGluZ30gKTsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPl9wYXJzZV9zZXJpZXNfZm9ybXVsYSggJGFyZ3tuYW1lX2Zvcm11bGF9ICk7CisKKyAgICAkc2VsZi0+e195X2F4aXNfbmFtZX0gICAgID0gJG5hbWU7CisgICAgJHNlbGYtPntfeV9heGlzX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKyAgICAkc2VsZi0+e195X2F4aXNfZm9ybXVsYX0gID0gJGZvcm11bGE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdGl0bGUoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IHRpdGxlLgorIworc3ViIHNldF90aXRsZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICVhcmcgID0gQF87CisKKyAgICBteSAoICRuYW1lLCAkZW5jb2RpbmcgKSA9CisgICAgICAkc2VsZi0+X2VuY29kZV91dGYxNiggJGFyZ3tuYW1lfSwgJGFyZ3tuYW1lX2VuY29kaW5nfSApOworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+X3BhcnNlX3Nlcmllc19mb3JtdWxhKCAkYXJne25hbWVfZm9ybXVsYX0gKTsKKworICAgICRzZWxmLT57X3RpdGxlX25hbWV9ICAgICA9ICRuYW1lOworICAgICRzZWxmLT57X3RpdGxlX2VuY29kaW5nfSA9ICRlbmNvZGluZzsKKyAgICAkc2VsZi0+e190aXRsZV9mb3JtdWxhfSAgPSAkZm9ybXVsYTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9sZWdlbmQoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGxlZ2VuZC4KKyMKK3N1YiBzZXRfbGVnZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIGlmICggZGVmaW5lZCAkYXJne3Bvc2l0aW9ufSApIHsKKyAgICAgICAgaWYgKCBsYyAkYXJne3Bvc2l0aW9ufSBlcSAnbm9uZScgKSB7CisgICAgICAgICAgICAkc2VsZi0+e19sZWdlbmR9LT57X3Zpc2libGV9ID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wbG90YXJlYSgpCisjCisjIFNldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgY2hhcnQgcGxvdGFyZWEuCisjCitzdWIgc2V0X3Bsb3RhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKyAgICByZXR1cm4gdW5sZXNzIGtleXMgJWFyZzsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfcGxvdGFyZWF9OworCisgICAgIyBTZXQgdGhlIHBsb3RhcmVhIHZpc2liaWxpdHkuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7dmlzaWJsZX0gKSB7CisgICAgICAgICRhcmVhLT57X3Zpc2libGV9ID0gJGFyZ3t2aXNpYmxlfTsKKyAgICAgICAgcmV0dXJuIGlmICEkYXJlYS0+e192aXNpYmxlfTsKKyAgICB9CisKKyAgICAjIFRPRE8uIGNvdWxkIG1vdmUgdGhpcyBvdXQgb2YgaWYgc3RhdGVtZW50LgorICAgICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fSA9IDB4MDg7CisKKyAgICAjIFNldCB0aGUgY2hhcnQgYmFja2dyb3VuZCBjb2xvdXIuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7Y29sb3J9ICkgeworICAgICAgICBteSAoICRpbmRleCwgJHJnYiApID0gJHNlbGYtPl9nZXRfY29sb3JfaW5kaWNlcyggJGFyZ3tjb2xvcn0gKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkICRpbmRleCApIHsKKyAgICAgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX2luZGV4fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX3JnYn0gICA9ICRyZ2I7CisgICAgICAgICAgICAkYXJlYS0+e19iZ19jb2xvcl9pbmRleH0gPSAweDA4OworICAgICAgICAgICAgJGFyZWEtPntfYmdfY29sb3JfcmdifSAgID0gMHgwMDAwMDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgY29sb3VyLgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfY29sb3J9ICkgeworICAgICAgICBteSAoICRpbmRleCwgJHJnYiApID0gJHNlbGYtPl9nZXRfY29sb3JfaW5kaWNlcyggJGFyZ3tsaW5lX2NvbG9yfSApOworICAgICAgICBpZiAoIGRlZmluZWQgJGluZGV4ICkgeworICAgICAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX3JnYn0gICA9ICRyZ2I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgcGF0dGVybi4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tsaW5lX3BhdHRlcm59ICkgeworICAgICAgICBteSAkcGF0dGVybiA9ICRzZWxmLT5fZ2V0X2xpbmVfcGF0dGVybiggJGFyZ3tsaW5lX3BhdHRlcm59ICk7CisgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gPSAkcGF0dGVybjsKKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgd2VpZ2h0LgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfd2VpZ2h0fSApIHsKKyAgICAgICAgbXkgJHdlaWdodCA9ICRzZWxmLT5fZ2V0X2xpbmVfd2VpZ2h0KCAkYXJne2xpbmVfd2VpZ2h0fSApOworICAgICAgICAkYXJlYS0+e19saW5lX3dlaWdodH0gPSAkd2VpZ2h0OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jaGFydGFyZWEoKQorIworIyBTZXQgdGhlIHByb3BlcnRpZXMgb2YgdGhlIGNoYXJ0IGNoYXJ0YXJlYS4KKyMKK3N1YiBzZXRfY2hhcnRhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKyAgICByZXR1cm4gdW5sZXNzIGtleXMgJWFyZzsKKworICAgIG15ICRhcmVhID0gJHNlbGYtPntfY2hhcnRhcmVhfTsKKworICAgICMgRW1iZWRkZWQgYXV0b21hdGljIGxpbmUgd2VpZ2h0IGhhcyBhIGRpZmZlcmVudCBkZWZhdWx0IHZhbHVlLgorICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSA9IDB4RkZGRiBpZiAkc2VsZi0+e19lbWJlZGRlZH07CisKKworICAgICMgU2V0IHRoZSBjaGFydCBiYWNrZ3JvdW5kIGNvbG91ci4KKyAgICBpZiAoIGRlZmluZWQgJGFyZ3tjb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2NvbG9yfSApOworICAgICAgICBpZiAoIGRlZmluZWQgJGluZGV4ICkgeworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgICAgICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fSA9IDB4MDg7CisgICAgICAgICAgICAkYXJlYS0+e19iZ19jb2xvcl9yZ2J9ICAgPSAweDAwMDAwMDsKKyAgICAgICAgICAgICRhcmVhLT57X2FyZWFfcGF0dGVybn0gICA9IDE7CisgICAgICAgICAgICAkYXJlYS0+e19hcmVhX29wdGlvbnN9ICAgPSAweDAwMDAgaWYgJHNlbGYtPntfZW1iZWRkZWR9OworICAgICAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgU2V0IHRoZSBib3JkZXIgbGluZSBjb2xvdXIuCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV9jb2xvcn0gKSB7CisgICAgICAgIG15ICggJGluZGV4LCAkcmdiICkgPSAkc2VsZi0+X2dldF9jb2xvcl9pbmRpY2VzKCAkYXJne2xpbmVfY29sb3J9ICk7CisgICAgICAgIGlmICggZGVmaW5lZCAkaW5kZXggKSB7CisgICAgICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9ICRpbmRleDsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSAgID0gJHJnYjsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfcGF0dGVybn0gICAgID0gMHgwMDsKKyAgICAgICAgICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30gICAgID0gMHgwMDAwOworICAgICAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgICAgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBTZXQgdGhlIGJvcmRlciBsaW5lIHBhdHRlcm4uCisgICAgaWYgKCBkZWZpbmVkICRhcmd7bGluZV9wYXR0ZXJufSApIHsKKyAgICAgICAgbXkgJHBhdHRlcm4gPSAkc2VsZi0+X2dldF9saW5lX3BhdHRlcm4oICRhcmd7bGluZV9wYXR0ZXJufSApOworICAgICAgICAkYXJlYS0+e19saW5lX3BhdHRlcm59ICAgICA9ICRwYXR0ZXJuOworICAgICAgICAkYXJlYS0+e19saW5lX29wdGlvbnN9ICAgICA9IDB4MDAwMDsKKyAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0gPSAweDRGIGlmICFkZWZpbmVkICRhcmd7bGluZV9jb2xvcn07CisgICAgICAgICRhcmVhLT57X3Zpc2libGV9ICAgICAgICAgID0gMTsKKyAgICB9CisKKyAgICAjIFNldCB0aGUgYm9yZGVyIGxpbmUgd2VpZ2h0LgorICAgIGlmICggZGVmaW5lZCAkYXJne2xpbmVfd2VpZ2h0fSApIHsKKyAgICAgICAgbXkgJHdlaWdodCA9ICRzZWxmLT5fZ2V0X2xpbmVfd2VpZ2h0KCAkYXJne2xpbmVfd2VpZ2h0fSApOworICAgICAgICAkYXJlYS0+e19saW5lX3dlaWdodH0gICAgICA9ICR3ZWlnaHQ7CisgICAgICAgICRhcmVhLT57X2xpbmVfb3B0aW9uc30gICAgID0gMHgwMDAwOworICAgICAgICAkYXJlYS0+e19saW5lX3BhdHRlcm59ICAgICA9IDB4MDAgaWYgIWRlZmluZWQgJGFyZ3tsaW5lX3BhdHRlcm59OworICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fSA9IDB4NEYgaWYgIWRlZmluZWQgJGFyZ3tsaW5lX2NvbG9yfTsKKyAgICAgICAgJGFyZWEtPntfdmlzaWJsZX0gICAgICAgICAgPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEludGVybmFsIG1ldGhvZHMuIFRoZSBmb2xsb3dpbmcgc2VjdGlvbiBvZiBtZXRob2RzIGFyZSB1c2VkIGZvciB0aGUgaW50ZXJuYWwKKyMgc3RydWN0dXJpbmcgb2YgdGhlIENoYXJ0IG9iamVjdCBhbmQgZmlsZSBmb3JtYXQuCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJlcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBUaGUgcGFyZW50IFdvcmtzaGVldCBjbGFzcyBuZWVkcyB0byBzdG9yZSBzb21lIGRhdGEgaW4gbWVtb3J5IGFuZCBzb21lIGluCisjIHRlbXBvcmFyeSBmaWxlcyBmb3IgZWZmaWNpZW5jeS4gVGhlIENoYXJ0KiBjbGFzc2VzIGRvbid0IG5lZWQgdG8gZG8gdGhpcworIyBzaW5jZSB0aGV5IGFyZSBkZWFsaW5nIHdpdGggc21hbGxlciBhbW91bnRzIG9mIGRhdGEgc28gd2Ugb3ZlcnJpZGUKKyMgX3ByZXBlbmQoKSB0byB0dXJuIGl0IGludG8gYW4gX2FwcGVuZCgpIG1ldGhvZC4gVGhpcyBhbGxvd3MgZm9yIGEgbW9yZQorIyBuYXR1cmFsIG1ldGhvZCBjYWxsaW5nIG9yZGVyLgorIworc3ViIF9wcmVwZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSA9IDA7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hcHBlbmQoIEBfICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKSwgb3ZlcnJpZGRlbi4KKyMKKyMgQ3JlYXRlIGFuZCBzdG9yZSB0aGUgQ2hhcnQgZGF0YSBzdHJ1Y3R1cmVzLgorIworc3ViIF9jbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBJZ25vcmUgYW55IGRhdGEgdGhhdCBoYXMgYmVlbiB3cml0dGVuIHNvIGZhciBzaW5jZSBpdCBpcyBwcm9iYWJseQorICAgICMgZnJvbSB1bndhbnRlZCBXb3Jrc2hlZXQgbWV0aG9kIGNhbGxzLgorICAgICRzZWxmLT57X2RhdGF9ID0gJyc7CisKKyAgICAjIFRPRE8uIENoZWNrIGZvciBjaGFydHMgd2l0aG91dCBhIHNlcmllcz8KKworICAgICMgU3RvcmUgdGhlIGNoYXJ0IEJPRi4KKyAgICAkc2VsZi0+X3N0b3JlX2JvZiggMHgwMDIwICk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGhlYWRlcgorICAgICRzZWxmLT5fc3RvcmVfaGVhZGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGZvb3RlcgorICAgICRzZWxmLT5fc3RvcmVfZm9vdGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIGhvcml6b250YWwgY2VudGVyaW5nCisgICAgJHNlbGYtPl9zdG9yZV9oY2VudGVyKCk7CisKKyAgICAjIFN0b3JlIHRoZSBwYWdlIHZlcnRpY2FsIGNlbnRlcmluZworICAgICRzZWxmLT5fc3RvcmVfdmNlbnRlcigpOworCisgICAgIyBTdG9yZSB0aGUgbGVmdCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9sZWZ0KCk7CisKKyAgICAjIFN0b3JlIHRoZSByaWdodCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9yaWdodCgpOworCisgICAgIyBTdG9yZSB0aGUgdG9wIG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX3RvcCgpOworCisgICAgIyBTdG9yZSB0aGUgYm90dG9tIG1hcmdpbgorICAgICRzZWxmLT5fc3RvcmVfbWFyZ2luX2JvdHRvbSgpOworCisgICAgIyBTdG9yZSB0aGUgcGFnZSBzZXR1cAorICAgICRzZWxmLT5fc3RvcmVfc2V0dXAoKTsKKworICAgICMgU3RvcmUgdGhlIHNoZWV0IHBhc3N3b3JkCisgICAgJHNlbGYtPl9zdG9yZV9wYXNzd29yZCgpOworCisgICAgIyBTdGFydCBvZiBDaGFydCBzcGVjaWZpYyByZWNvcmRzLgorCisgICAgIyBTdG9yZSB0aGUgRkJJIGZvbnQgcmVjb3Jkcy4KKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X251bWJlcnN9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X3Nlcmllc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZmJpKCBAeyAkc2VsZi0+e19jb25maWd9LT57X2ZvbnRfdGl0bGV9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZiaSggQHsgJHNlbGYtPntfY29uZmlnfS0+e19mb250X2F4ZXN9IH0gKTsKKworICAgICMgSWdub3JlIFVOSVRTIHJlY29yZC4KKworICAgICMgU3RvcmUgdGhlIENoYXJ0IHN1Yi1zdHJlYW0uCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydF9zdHJlYW0oKTsKKworICAgICMgQXBwZW5kIHRoZSBzaGVldCBkaW1lbnNpb25zCisgICAgJHNlbGYtPl9zdG9yZV9kaW1lbnNpb25zKCk7CisKKyAgICAjIFRPRE8gYWRkIFNJTkRFWCBhbmQgTlVNQkVSIHJlY29yZHMuCisKKyAgICBpZiAoICEkc2VsZi0+e19lbWJlZGRlZH0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfd2luZG93MigpOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfZW9mKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd2luZG93MigpLCBvdmVycmlkZGVuLgorIworIyBXcml0ZSBCSUZGIHJlY29yZCBXaW5kb3cyLiBOb3RlLCB0aGlzIG92ZXJyaWRlcyB0aGUgcGFyZW50IFdvcmtzaGVldAorIyByZWNvcmQgYmVjYXVzZSB0aGUgQ2hhcnQgdmVyc2lvbiBvZiB0aGUgcmVjb3JkIGlzIHNtYWxsZXIgYW5kIGlzIHVzZWQKKyMgbWFpbmx5IHRvIGluZGljYXRlIGlmIHRoZSBjaGFydCB0YWIgaXMgc2VsZWN0ZWQgb3Igbm90LgorIworc3ViIF9zdG9yZV93aW5kb3cyIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAyM0U7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwQTsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisgICAgbXkgJGdyYml0ICAgPSAweDAwMDA7ICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJHJ3VG9wICAgPSAweDAwMDA7ICAgICMgVG9wIHZpc2libGUgcm93CisgICAgbXkgJGNvbExlZnQgPSAweDAwMDA7ICAgICMgTGVmdG1vc3QgdmlzaWJsZSBjb2x1bW4KKyAgICBteSAkcmdiSGRyICA9IDB4MDAwMDsgICAgIyBSb3cvY29sIGhlYWRpbmcsIGdyaWQgY29sb3IKKworICAgICMgVGhlIG9wdGlvbnMgZmxhZ3MgdGhhdCBjb21wcmlzZSAkZ3JiaXQKKyAgICBteSAkZkRzcEZtbGEgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMCAtIGJpdAorICAgIG15ICRmRHNwR3JpZCAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAxCisgICAgbXkgJGZEc3BSd0NvbCAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDIKKyAgICBteSAkZkZyb3plbiAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgMworICAgIG15ICRmRHNwWmVyb3MgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyA0CisgICAgbXkgJGZEZWZhdWx0SGRyICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDUKKyAgICBteSAkZkFyYWJpYyAgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICMgNgorICAgIG15ICRmRHNwR3V0cyAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyA3CisgICAgbXkgJGZGcm96ZW5Ob1NwbGl0ID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDAgLSBiaXQKKyAgICBteSAkZlNlbGVjdGVkICAgICAgPSAkc2VsZi0+e19zZWxlY3RlZH07ICAgICMgMQorICAgIG15ICRmUGFnZWQgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgIyAyCisgICAgbXkgJGZCcmVha1ByZXZpZXcgID0gMDsgICAgICAgICAgICAgICAgICAgICAjIDMKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJGdyYml0ICAgICAgICAgICAgID0gJGZEc3BGbWxhOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3JpZCAgICAgICA8PCAxOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwUndDb2wgICAgICA8PCAyOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuICAgICAgICA8PCAzOworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwWmVyb3MgICAgICA8PCA0OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRGVmYXVsdEhkciAgICA8PCA1OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmQXJhYmljICAgICAgICA8PCA2OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRHNwR3V0cyAgICAgICA8PCA3OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmRnJvemVuTm9TcGxpdCA8PCA4OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmU2VsZWN0ZWQgICAgICA8PCA5OworICAgICRncmJpdCAgICAgICAgICAgIHw9ICRmUGFnZWQgICAgICAgICA8PCAxMDsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkJyZWFrUHJldmlldyAgPDwgMTE7CisgICAgIz4+PgorCisgICAgbXkgJGhlYWRlciA9IHBhY2soICJ2diIsICRyZWNvcmQsICRsZW5ndGggKTsKKyAgICBteSAkZGF0YSA9IHBhY2soICJ2dnZWIiwgJGdyYml0LCAkcndUb3AsICRjb2xMZWZ0LCAkcmdiSGRyICk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9zZXJpZXNfZm9ybXVsYSgpCisjCisjIFBhcnNlIHRoZSBmb3JtdWxhIHVzZWQgdG8gZGVmaW5lIGEgc2VyaWVzLiBXZSBhbHNvIGV4dHJhY3Qgc29tZSByYW5nZQorIyBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgX3N0b3JlX3NlcmllcygpIGFuZCB0aGUgU0VSSUVTIHJlY29yZC4KKyMKK3N1YiBfcGFyc2Vfc2VyaWVzX2Zvcm11bGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhICA9ICRfWzBdOworICAgIG15ICRlbmNvZGluZyA9IDA7CisgICAgbXkgJGxlbmd0aCAgID0gMDsKKyAgICBteSAkY291bnQgICAgPSAwOworICAgIG15IEB0b2tlbnM7CisKKyAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJGZvcm11bGE7CisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCAkZm9ybXVsYSApIH07CisKKyAgICBpZiAoICRAICkgeworICAgICAgICAkQCA9fiBzL1xuJC8vOyAgICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpLgorICAgICAgICBjcm9hayAkQDsgICAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvci4KKyAgICB9CisKKyAgICAjIEZvcmNlIHJhbmdlcyB0byBiZSBhIHJlZmVyZW5jZSBjbGFzcy4KKyAgICBzL19yZWYzZC9fcmVmM2RSLyAgICAgZm9yIEB0b2tlbnM7CisgICAgcy9fcmFuZ2UzZC9fcmFuZ2UzZFIvIGZvciBAdG9rZW5zOworICAgIHMvX25hbWUvX25hbWVSLyAgICAgICBmb3IgQHRva2VuczsKKworICAgICMgUGFyc2UgdGhlIHRva2VucyBpbnRvIGEgZm9ybXVsYSBzdHJpbmcuCisgICAgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoIEB0b2tlbnMgKTsKKworICAgICMgUmV0dXJuIGZvcm11bGEgZm9yIGEgc2luZ2xlIGNlbGwgYXMgdXNlZCBieSB0aXRsZSBhbmQgc2VyaWVzIG5hbWUuCisgICAgaWYgKCBvcmQgJGZvcm11bGEgPT0gMHgzQSApIHsKKyAgICAgICAgcmV0dXJuICRmb3JtdWxhOworICAgIH0KKworICAgICMgRXh0cmFjdCB0aGUgcmFuZ2UgZnJvbSB0aGUgcGFyc2UgZm9ybXVsYS4KKyAgICBpZiAoIG9yZCAkZm9ybXVsYSA9PSAweDNCICkgeworICAgICAgICBteSAoICRwdGcsICRleHRfcmVmLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIgKSA9IHVucGFjayAnQ3Y1JywKKyAgICAgICAgICAkZm9ybXVsYTsKKworICAgICAgICAjIFRPRE8uIFJlbW92ZSBoaWdoIGJpdCBvbiByZWxhdGl2ZSByZWZlcmVuY2VzLgorICAgICAgICAkY291bnQgPSAkcm93XzIgLSAkcm93XzEgKyAxOworICAgIH0KKworICAgIHJldHVybiAoICRmb3JtdWxhLCAkY291bnQgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZW5jb2RlX3V0ZjE2KCkKKyMKKyMgQ29udmVydCBVVEY4IHN0cmluZ3MgdXNlZCBpbiB0aGUgY2hhcnQgdG8gVVRGMTYuCisjCitzdWIgX2VuY29kZV91dGYxNiB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHN0cmluZyA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyA9IHNoaWZ0IHx8IDA7CisKKyAgICAjIEV4aXQgaWYgdGhlICRzdHJpbmcgaXNuJ3QgZGVmaW5lZCwgaS5lLiwgaGFzbid0IGJlZW4gc2V0IGJ5IHVzZXIuCisgICAgcmV0dXJuICggdW5kZWYsIHVuZGVmICkgaWYgIWRlZmluZWQgJHN0cmluZzsKKworICAgICMgUmV0dXJuIGlmIGVuY29kaW5nIGlzIHNldCwgaS5lLiwgc3RyaW5nIGhhcyBiZWVuIG1hbnVhbGx5IGVuY29kZWQuCisgICAgI3JldHVybiAoIHVuZGVmLCB1bmRlZiApIGlmICRzdHJpbmcgPT0gMTsKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoICRdID49IDUuMDA4ICkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoIEVuY29kZTo6aXNfdXRmOCggJHN0cmluZyApICkgeworICAgICAgICAgICAgJHN0cmluZyA9IEVuY29kZTo6ZW5jb2RlKCAiVVRGLTE2QkUiLCAkc3RyaW5nICk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgIyBDaGFydCBzdHJpbmdzIGFyZSBsaW1pdGVkIHRvIDI1NSBjaGFyYWN0ZXJzLgorICAgIG15ICRsaW1pdCA9ICRlbmNvZGluZyA/IDI1NSAqIDIgOiAyNTU7CisKKyAgICBpZiAoIGxlbmd0aCAkc3RyaW5nID49ICRsaW1pdCApIHsKKworICAgICAgICAjIHRydW5jYXRlIHRoZSBzdHJpbmcgYW5kIHJhaXNlIGEgd2FybmluZy4KKyAgICAgICAgJHN0cmluZyA9IHN1YnN0ciAkc3RyaW5nLCAwLCAkbGltaXQ7CisgICAgICAgIGNhcnAgJ0NoYXJ0IHN0cmluZ3MgbXVzdCBiZSBsZXNzIHRoYW4gMjU2IGNoYXJhY3RlcnMuICcKKyAgICAgICAgICAuICdTdHJpbmcgdHJ1bmNhdGVkJzsKKyAgICB9CisKKyAgICByZXR1cm4gKCAkc3RyaW5nLCAkZW5jb2RpbmcgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3JfaW5kaWNlcygpCisjCisjIENvbnZlcnQgdGhlIHVzZXIgc3BlY2lmaWVkIGNvbG91ciBpbmRleCBvciBzdHJpbmcgdG8gYW4gY29sb3VyIGluZGV4IGFuZAorIyBSR0IgY29sb3VyIG51bWJlci4KKyMKK3N1YiBfZ2V0X2NvbG9yX2luZGljZXMgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yID0gc2hpZnQ7CisgICAgbXkgJGluZGV4OworICAgIG15ICRyZ2I7CisKKyAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKSBpZiAhZGVmaW5lZCAkY29sb3I7CisKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICBhcXVhICAgID0+IDB4MEYsCisgICAgICAgIGN5YW4gICAgPT4gMHgwRiwKKyAgICAgICAgYmxhY2sgICA9PiAweDA4LAorICAgICAgICBibHVlICAgID0+IDB4MEMsCisgICAgICAgIGJyb3duICAgPT4gMHgxMCwKKyAgICAgICAgbWFnZW50YSA9PiAweDBFLAorICAgICAgICBmdWNoc2lhID0+IDB4MEUsCisgICAgICAgIGdyYXkgICAgPT4gMHgxNywKKyAgICAgICAgZ3JleSAgICA9PiAweDE3LAorICAgICAgICBncmVlbiAgID0+IDB4MTEsCisgICAgICAgIGxpbWUgICAgPT4gMHgwQiwKKyAgICAgICAgbmF2eSAgICA9PiAweDEyLAorICAgICAgICBvcmFuZ2UgID0+IDB4MzUsCisgICAgICAgIHBpbmsgICAgPT4gMHgyMSwKKyAgICAgICAgcHVycGxlICA9PiAweDE0LAorICAgICAgICByZWQgICAgID0+IDB4MEEsCisgICAgICAgIHNpbHZlciAgPT4gMHgxNiwKKyAgICAgICAgd2hpdGUgICA9PiAweDA5LAorICAgICAgICB5ZWxsb3cgID0+IDB4MEQsCisgICAgKTsKKworCisgICAgIyBDaGVjayBmb3IgdGhlIHZhcmlvdXMgc3VwcG9ydGVkIGNvbG91ciBpbmRleC9uYW1lIHBvc3NpYmlsaXRpZXMuCisgICAgaWYgKCBleGlzdHMgJGNvbG9yc3skY29sb3J9ICkgeworCisgICAgICAgICMgQ29sb3VyIG1hdGNoZXMgb25lIG9mIHRoZSBzdXBwb3J0ZWQgY29sb3VyIG5hbWVzLgorICAgICAgICAkaW5kZXggPSAkY29sb3JzeyRjb2xvcn07CisgICAgfQorICAgIGVsc2lmICggJGNvbG9yID1+IG0vXEQvICkgeworCisgICAgICAgICMgUmV0dXJuIHVuZGVmIGlmICRjb2xvciBpcyBhIHN0cmluZyBidXQgbm90IG9uZSBvZiB0aGUgc3VwcG9ydGVkIG9uZXMuCisgICAgICAgIHJldHVybiAoIHVuZGVmLCB1bmRlZiApOworICAgIH0KKyAgICBlbHNpZiAoICRjb2xvciA8IDggfHwgJGNvbG9yID4gNjMgKSB7CisKKyAgICAgICAgIyBSZXR1cm4gdW5kZWYgaWYgaW5kZXggaXMgb3V0IG9mIHJhbmdlLgorICAgICAgICByZXR1cm4gKCB1bmRlZiwgdW5kZWYgKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIyBXZSBzaG91bGQgaGF2ZSBhIHZhbGlkIGNvbG9yIGluZGV4IGluIGEgdmFsaWQgcmFuZ2UuCisgICAgICAgICRpbmRleCA9ICRjb2xvcjsKKyAgICB9CisKKyAgICAkcmdiID0gJHNlbGYtPl9nZXRfY29sb3JfcmJnKCAkaW5kZXggKTsKKyAgICByZXR1cm4gKCAkaW5kZXgsICRyZ2IgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3JfcmJnKCkKKyMKKyMgR2V0IHRoZSBSZWRHcmVlbkJsdWUgbnVtYmVyIGZvciB0aGUgY29sb3VyIGluZGV4IGZyb20gdGhlIFdvcmtib29rIHBhbGV0dGUuCisjCitzdWIgX2dldF9jb2xvcl9yYmcgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGluZGV4ID0gc2hpZnQ7CisKKyAgICAjIEFkanVzdCBjb2xvdXIgaW5kZXggZnJvbSA4LTYzICh1c2VyIHJhbmdlKSB0byAwLTU1IChFeGNlbCByYW5nZSkuCisgICAgJGluZGV4IC09IDg7CisKKyAgICBteSBAcmVkX2dyZWVuX2JsdWUgPSBAeyAkc2VsZi0+e19wYWxldHRlfS0+WyRpbmRleF0gfTsKKyAgICByZXR1cm4gdW5wYWNrICdWJywgcGFjayAnQyonLCBAcmVkX2dyZWVuX2JsdWU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X2xpbmVfcGF0dGVybigpCisjCisjIEdldCB0aGUgRXhjZWwgY2hhcnQgaW5kZXggZm9yIGxpbmUgcGF0dGVybiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB1c2VyCisjIGRlZmluZWQgdmFsdWUuCisjCitzdWIgX2dldF9saW5lX3BhdHRlcm4geworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkdmFsdWUgICA9IGxjIHNoaWZ0OworICAgIG15ICRkZWZhdWx0ID0gMDsKKyAgICBteSAkcGF0dGVybjsKKworICAgIG15ICVwYXR0ZXJucyA9ICgKKyAgICAgICAgMCAgICAgICAgICAgICAgPT4gNSwKKyAgICAgICAgMSAgICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgMiAgICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgMyAgICAgICAgICAgICAgPT4gMiwKKyAgICAgICAgNCAgICAgICAgICAgICAgPT4gMywKKyAgICAgICAgNSAgICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgNiAgICAgICAgICAgICAgPT4gNywKKyAgICAgICAgNyAgICAgICAgICAgICAgPT4gNiwKKyAgICAgICAgOCAgICAgICAgICAgICAgPT4gOCwKKyAgICAgICAgJ3NvbGlkJyAgICAgICAgPT4gMCwKKyAgICAgICAgJ2Rhc2gnICAgICAgICAgPT4gMSwKKyAgICAgICAgJ2RvdCcgICAgICAgICAgPT4gMiwKKyAgICAgICAgJ2Rhc2gtZG90JyAgICAgPT4gMywKKyAgICAgICAgJ2Rhc2gtZG90LWRvdCcgPT4gNCwKKyAgICAgICAgJ25vbmUnICAgICAgICAgPT4gNSwKKyAgICAgICAgJ2RhcmstZ3JheScgICAgPT4gNiwKKyAgICAgICAgJ21lZGl1bS1ncmF5JyAgPT4gNywKKyAgICAgICAgJ2xpZ2h0LWdyYXknICAgPT4gOCwKKyAgICApOworCisgICAgaWYgKCBleGlzdHMgJHBhdHRlcm5zeyR2YWx1ZX0gKSB7CisgICAgICAgICRwYXR0ZXJuID0gJHBhdHRlcm5zeyR2YWx1ZX07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGF0dGVybiA9ICRkZWZhdWx0OworICAgIH0KKworICAgIHJldHVybiAkcGF0dGVybjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfbGluZV93ZWlnaHQoKQorIworIyBHZXQgdGhlIEV4Y2VsIGNoYXJ0IGluZGV4IGZvciBsaW5lIHdlaWdodCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB1c2VyCisjIGRlZmluZWQgdmFsdWUuCisjCitzdWIgX2dldF9saW5lX3dlaWdodCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICR2YWx1ZSAgID0gbGMgc2hpZnQ7CisgICAgbXkgJGRlZmF1bHQgPSAwOworICAgIG15ICR3ZWlnaHQ7CisKKyAgICBteSAld2VpZ2h0cyA9ICgKKyAgICAgICAgMSAgICAgICAgICA9PiAtMSwKKyAgICAgICAgMiAgICAgICAgICA9PiAwLAorICAgICAgICAzICAgICAgICAgID0+IDEsCisgICAgICAgIDQgICAgICAgICAgPT4gMiwKKyAgICAgICAgJ2hhaXJsaW5lJyA9PiAtMSwKKyAgICAgICAgJ25hcnJvdycgICA9PiAwLAorICAgICAgICAnbWVkaXVtJyAgID0+IDEsCisgICAgICAgICd3aWRlJyAgICAgPT4gMiwKKyAgICApOworCisgICAgaWYgKCBleGlzdHMgJHdlaWdodHN7JHZhbHVlfSApIHsKKyAgICAgICAgJHdlaWdodCA9ICR3ZWlnaHRzeyR2YWx1ZX07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkd2VpZ2h0ID0gJGRlZmF1bHQ7CisgICAgfQorCisgICAgcmV0dXJuICR3ZWlnaHQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfc3RyZWFtKCkKKyMKKyMgU3RvcmUgdGhlIENIQVJUIHJlY29yZCBhbmQgaXQncyBzdWJzdHJlYW1zLgorIworc3ViIF9zdG9yZV9jaGFydF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfY2hhcnQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfY2hhcnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKworICAgICMgSWdub3JlIFNDTCByZWNvcmQgZm9yIG5vdy4KKyAgICAkc2VsZi0+X3N0b3JlX3Bsb3Rncm93dGgoKTsKKworICAgIGlmICggJHNlbGYtPntfY2hhcnRhcmVhfS0+e192aXNpYmxlfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9jaGFydGFyZWFfZnJhbWVfc3RyZWFtKCk7CisgICAgfQorCisgICAgIyBTdG9yZSBTRVJJRVMgc3RyZWFtIGZvciBlYWNoIHNlcmllcy4KKyAgICBteSAkaW5kZXggPSAwOworICAgIGZvciBteSAkc2VyaWVzICggQHsgJHNlbGYtPntfc2VyaWVzfSB9ICkgeworCisgICAgICAgICRzZWxmLT5fc3RvcmVfc2VyaWVzX3N0cmVhbSgKKyAgICAgICAgICAgIF9pbmRleCAgICAgICAgICAgID0+ICRpbmRleCwKKyAgICAgICAgICAgIF92YWx1ZV9mb3JtdWxhICAgID0+ICRzZXJpZXMtPntfdmFsdWVzfS0+WzBdLAorICAgICAgICAgICAgX3ZhbHVlX2NvdW50ICAgICAgPT4gJHNlcmllcy0+e192YWx1ZXN9LT5bMV0sCisgICAgICAgICAgICBfY2F0ZWdvcnlfY291bnQgICA9PiAkc2VyaWVzLT57X2NhdGVnb3JpZXN9LT5bMV0sCisgICAgICAgICAgICBfY2F0ZWdvcnlfZm9ybXVsYSA9PiAkc2VyaWVzLT57X2NhdGVnb3JpZXN9LT5bMF0sCisgICAgICAgICAgICBfbmFtZSAgICAgICAgICAgICA9PiAkc2VyaWVzLT57bmFtZX0sCisgICAgICAgICAgICBfbmFtZV9lbmNvZGluZyAgICA9PiAkc2VyaWVzLT57bmFtZV9lbmNvZGluZ30sCisgICAgICAgICAgICBfbmFtZV9mb3JtdWxhICAgICA9PiAkc2VyaWVzLT57X25hbWVfZm9ybXVsYX0sCisgICAgICAgICk7CisKKyAgICAgICAgJGluZGV4Kys7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9zaHRwcm9wcygpOworCisgICAgIyBXcml0ZSB0aGUgVEVYVCBzdHJlYW1zLgorICAgIGZvciBteSAkZm9udF9pbmRleCAoIDUgLi4gNiApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9kZWZhdWx0dGV4dCgpOworICAgICAgICAkc2VsZi0+X3N0b3JlX3Nlcmllc190ZXh0X3N0cmVhbSggJGZvbnRfaW5kZXggKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4ZXN1c2VkKCAxICk7CisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSgpOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3RpdGxlX25hbWV9IHx8IGRlZmluZWQgJHNlbGYtPntfdGl0bGVfZm9ybXVsYX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfdGl0bGVfdGV4dF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VyaWVzX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBTRVJJRVMgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9zZXJpZXNfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJWFyZyAgPSBAXzsKKworICAgIG15ICRuYW1lX3R5cGUgICAgID0gJGFyZ3tfbmFtZV9mb3JtdWxhfSAgICAgPyAyIDogMTsKKyAgICBteSAkdmFsdWVfdHlwZSAgICA9ICRhcmd7X3ZhbHVlX2Zvcm11bGF9ICAgID8gMiA6IDA7CisgICAgbXkgJGNhdGVnb3J5X3R5cGUgPSAkYXJne19jYXRlZ29yeV9mb3JtdWxhfSA/IDIgOiAwOworCisgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXMoICRhcmd7X3ZhbHVlX2NvdW50fSwgJGFyZ3tfY2F0ZWdvcnlfY291bnR9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAjIFN0b3JlIHRoZSBTZXJpZXMgbmFtZSBBSSByZWNvcmQuCisgICAgJHNlbGYtPl9zdG9yZV9haSggMCwgJG5hbWVfdHlwZSwgJGFyZ3tfbmFtZV9mb3JtdWxhfSApOworICAgIGlmICggZGVmaW5lZCAkYXJne19uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkYXJne19uYW1lfSwgJGFyZ3tfbmFtZV9lbmNvZGluZ30gKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAxLCAkdmFsdWVfdHlwZSwgICAgJGFyZ3tfdmFsdWVfZm9ybXVsYX0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAyLCAkY2F0ZWdvcnlfdHlwZSwgJGFyZ3tfY2F0ZWdvcnlfZm9ybXVsYX0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAzLCAxLCAgICAgICAgICAgICAgJycgKTsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdF9zdHJlYW0oICRhcmd7X2luZGV4fSwgJGFyZ3tfaW5kZXh9LCAweEZGRkYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX3NlcnRvY3J0KCAwICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kYXRhZm9ybWF0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBEQVRBRk9STUFUIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfZGF0YWZvcm1hdF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRzZXJpZXNfaW5kZXggPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdCggJHNlcmllc19pbmRleCwgJHNlcmllc19pbmRleCwgMHhGRkZGICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV8zZGJhcnNoYXBlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJpZXNfdGV4dF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgc2VyaWVzIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9zZXJpZXNfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb250X2luZGV4ID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfc2VyaWVzX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19zZXJpZXNfdGV4dF9wb3N9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZvbnR4KCAkZm9udF9pbmRleCApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsIDEsICcnICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgWC1heGlzIFRFWFQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPntfeF9heGlzX2Zvcm11bGF9OworICAgIG15ICRhaV90eXBlID0gJGZvcm11bGEgPyAyIDogMTsKKworICAgICRzZWxmLT5fc3RvcmVfdGV4dCggQHsgJHNlbGYtPntfY29uZmlnfS0+e194X2F4aXNfdGV4dH0gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfcG9zKCBAeyAkc2VsZi0+e19jb25maWd9LT57X3hfYXhpc190ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZm9udHgoIDggKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAkYWlfdHlwZSwgJGZvcm11bGEgKTsKKworICAgIGlmICggZGVmaW5lZCAkc2VsZi0+e194X2F4aXNfbmFtZX0gKSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfc2VyaWVzdGV4dCggJHNlbGYtPntfeF9heGlzX25hbWV9LAorICAgICAgICAgICAgJHNlbGYtPntfeF9heGlzX2VuY29kaW5nfSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX29iamVjdGxpbmsoIDMgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBZLWF4aXMgVEVYVCBzdWJzdHJlYW0uCisjCitzdWIgX3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJGZvcm11bGEgPSAkc2VsZi0+e195X2F4aXNfZm9ybXVsYX07CisgICAgbXkgJGFpX3R5cGUgPSAkZm9ybXVsYSA/IDIgOiAxOworCisgICAgJHNlbGYtPl9zdG9yZV90ZXh0KCBAeyAkc2VsZi0+e19jb25maWd9LT57X3lfYXhpc190ZXh0fSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wb3MoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfeV9heGlzX3RleHRfcG9zfSB9ICk7CisgICAgJHNlbGYtPl9zdG9yZV9mb250eCggOCApOworICAgICRzZWxmLT5fc3RvcmVfYWkoIDAsICRhaV90eXBlLCAkZm9ybXVsYSApOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3lfYXhpc19uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkc2VsZi0+e195X2F4aXNfbmFtZX0sCisgICAgICAgICAgICAkc2VsZi0+e195X2F4aXNfZW5jb2Rpbmd9LAorICAgICAgICApOworICAgIH0KKworICAgICRzZWxmLT5fc3RvcmVfb2JqZWN0bGluayggMiApOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIGxlZ2VuZCBURVhUIHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX3RleHQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19sZWdlbmRfdGV4dF9wb3N9IH0gKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAxLCAnJyApOworCisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90aXRsZV90ZXh0X3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSB0aXRsZSBURVhUIHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfdGl0bGVfdGV4dF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhID0gJHNlbGYtPntfdGl0bGVfZm9ybXVsYX07CisgICAgbXkgJGFpX3R5cGUgPSAkZm9ybXVsYSA/IDIgOiAxOworCisgICAgJHNlbGYtPl9zdG9yZV90ZXh0KCBAeyAkc2VsZi0+e19jb25maWd9LT57X3RpdGxlX3RleHR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e190aXRsZV90ZXh0X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfZm9udHgoIDcgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FpKCAwLCAkYWlfdHlwZSwgJGZvcm11bGEgKTsKKworICAgIGlmICggZGVmaW5lZCAkc2VsZi0+e190aXRsZV9uYW1lfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9zZXJpZXN0ZXh0KCAkc2VsZi0+e190aXRsZV9uYW1lfSwKKyAgICAgICAgICAgICRzZWxmLT57X3RpdGxlX2VuY29kaW5nfSwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX29iamVjdGxpbmsoIDEgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVNQQVJFTlQgY2hhcnQgc3Vic3RyZWFtLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50KCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19heGlzcGFyZW50X3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNfdmFsdWVzX3N0cmVhbSgpOworCisgICAgaWYgKCBkZWZpbmVkICRzZWxmLT57X3hfYXhpc19uYW1lfSB8fCBkZWZpbmVkICRzZWxmLT57X3hfYXhpc19mb3JtdWxhfSApIHsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV94X2F4aXNfdGV4dF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICBpZiAoIGRlZmluZWQgJHNlbGYtPntfeV9heGlzX25hbWV9IHx8IGRlZmluZWQgJHNlbGYtPntfeV9heGlzX2Zvcm11bGF9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3lfYXhpc190ZXh0X3N0cmVhbSgpOworICAgIH0KKworICAgIGlmICggJHNlbGYtPntfcGxvdGFyZWF9LT57X3Zpc2libGV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX3Bsb3RhcmVhKCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfcGxvdGFyZWFfZnJhbWVfc3RyZWFtKCk7CisgICAgfQorCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNfY2F0ZWdvcnlfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnQgY2F0ZWdvcnkuCisjCitzdWIgX3N0b3JlX2F4aXNfY2F0ZWdvcnlfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXMoIDAgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2NhdHNlcnJhbmdlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9heGNleHQoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RpY2soKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNfdmFsdWVzX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBBWElTIGNoYXJ0IHN1YnN0cmVhbSBmb3IgdGhlIGNoYXJ0IHZhbHVlcy4KKyMKK3N1YiBfc3RvcmVfYXhpc192YWx1ZXNfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXMoIDEgKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3ZhbHVlcmFuZ2UoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RpY2soKTsKKyAgICAkc2VsZi0+X3N0b3JlX2F4aXNsaW5lZm9ybWF0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDAsIDB4RkZGRiwgMHgwMDA5LCAweDAwNEQgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Bsb3RhcmVhX2ZyYW1lX3N0cmVhbSgpCisjCisjIFdyaXRlIHRoZSBGUkFNRSBjaGFydCBzdWJzdHJlYW0gZm9yIHRoZSBwbG90YXJlYS4KKyMKK3N1YiBfc3RvcmVfcGxvdGFyZWFfZnJhbWVfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkYXJlYSA9ICRzZWxmLT57X3Bsb3RhcmVhfTsKKworICAgICRzZWxmLT5fc3RvcmVfZnJhbWUoIDB4MDAsIDB4MDMgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2xpbmVfY29sb3JfcmdifSwgJGFyZWEtPntfbGluZV9wYXR0ZXJufSwKKyAgICAgICAgJGFyZWEtPntfbGluZV93ZWlnaHR9LCAgICAkYXJlYS0+e19saW5lX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoCisgICAgICAgICRhcmVhLT57X2ZnX2NvbG9yX3JnYn0sICAgJGFyZWEtPntfYmdfY29sb3JfcmdifSwKKyAgICAgICAgJGFyZWEtPntfYXJlYV9wYXR0ZXJufSwgICAkYXJlYS0+e19hcmVhX29wdGlvbnN9LAorICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9pbmRleH0sICRhcmVhLT57X2JnX2NvbG9yX2luZGV4fQorICAgICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0YXJlYV9mcmFtZV9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgRlJBTUUgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnRhcmVhLgorIworc3ViIF9zdG9yZV9jaGFydGFyZWFfZnJhbWVfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkYXJlYSA9ICRzZWxmLT57X2NoYXJ0YXJlYX07CisKKyAgICAkc2VsZi0+X3N0b3JlX2ZyYW1lKCAweDAwLCAweDAyICk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworCisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KAorICAgICAgICAkYXJlYS0+e19saW5lX2NvbG9yX3JnYn0sICRhcmVhLT57X2xpbmVfcGF0dGVybn0sCisgICAgICAgICRhcmVhLT57X2xpbmVfd2VpZ2h0fSwgICAgJGFyZWEtPntfbGluZV9vcHRpb25zfSwKKyAgICAgICAgJGFyZWEtPntfbGluZV9jb2xvcl9pbmRleH0KKyAgICApOworCisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KAorICAgICAgICAkYXJlYS0+e19mZ19jb2xvcl9yZ2J9LCAgICRhcmVhLT57X2JnX2NvbG9yX3JnYn0sCisgICAgICAgICRhcmVhLT57X2FyZWFfcGF0dGVybn0sICAgJGFyZWEtPntfYXJlYV9vcHRpb25zfSwKKyAgICAgICAgJGFyZWEtPntfZmdfY29sb3JfaW5kZXh9LCAkYXJlYS0+e19iZ19jb2xvcl9pbmRleH0KKyAgICApOworCisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRmb3JtYXRfc3RyZWFtKCkKKyMKKyMgV3JpdGUgdGhlIENIQVJURk9STUFUIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRmb3JtYXRfc3RyZWFtIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFRoZSBfdmFyeV9kYXRhX2NvbG9yIGlzIHNldCBieSBjbGFzc2VzIHRoYXQgbmVlZCBpdCwgbGlrZSBQaWUuCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdCggJHNlbGYtPntfdmFyeV9kYXRhX2NvbG9yfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworCisgICAgIyBTdG9yZSB0aGUgQklGRiByZWNvcmQgdGhhdCB3aWxsIGRlZmluZSB0aGUgY2hhcnQgdHlwZS4KKyAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0X3R5cGUoKTsKKworICAgICMgTm90ZSwgdGhlIENIQVJURk9STUFUTElOSyByZWNvcmQgaXMgb25seSB3cml0dGVuIGJ5IEV4Y2VsLgorCisgICAgaWYgKCAkc2VsZi0+e19sZWdlbmR9LT57X3Zpc2libGV9ICkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2xlZ2VuZF9zdHJlYW0oKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3N0b3JlX21hcmtlcl9kYXRhZm9ybWF0X3N0cmVhbSgpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIFRoaXMgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIHRoYXQgaXMgb3ZlcnJpZGRlbiBieSB0aGUgc3ViLWNsYXNzZXMgdG8gZGVmaW5lCisjIHRoZSBjaGFydCB0eXBlcyBzdWNoIGFzIENvbHVtbiwgTGluZSwgUGllLCBldGMuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkKKyMKKyMgVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QgdGhhdCBpcyBvdmVycmlkZGVuIGJ5IHRoZSBzdWItY2xhc3NlcyB0byBkZWZpbmUKKyMgcHJvcGVydGllcyBvZiBtYXJrZXJzLCBsaW5ldHlwZXMsIHBpZSBmb3JtYXRzIGFuZCBvdGhlci4KKyMKK3N1YiBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtIHsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xlZ2VuZF9zdHJlYW0oKQorIworIyBXcml0ZSB0aGUgTEVHRU5EIGNoYXJ0IHN1YnN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfbGVnZW5kX3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9sZWdlbmQoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kfSB9ICk7CisKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wb3MoIEB7ICRzZWxmLT57X2NvbmZpZ30tPntfbGVnZW5kX3Bvc30gfSApOworICAgICRzZWxmLT5fc3RvcmVfbGVnZW5kX3RleHRfc3RyZWFtKCk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJJRkYgUmVjb3Jkcy4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV8zZGJhcnNoYXBlKCkKKyMKKyMgV3JpdGUgdGhlIDNEQkFSU0hBUEUgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlXzNkYmFyc2hhcGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwNUY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyaXNlciAgPSAweDAwOyAgICAgICMgU2hhcGUgb2YgYmFzZS4KKyAgICBteSAkdGFwZXIgID0gMHgwMDsgICAgICAjIENvbHVtbiB0YXBlciB0eXBlLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkcmlzZXI7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0YXBlcjsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FpKCkKKyMKKyMgV3JpdGUgdGhlIEFJIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9haSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICA9IDB4MTA1MTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAwODsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaWQgICAgICAgICAgID0gJF9bMF07ICAgICAgICAgIyBMaW5rIGluZGV4LgorICAgIG15ICR0eXBlICAgICAgICAgPSAkX1sxXTsgICAgICAgICAjIFJlZmVyZW5jZSB0eXBlLgorICAgIG15ICRmb3JtdWxhICAgICAgPSAkX1syXTsgICAgICAgICAjIFByZS1wYXJzZWQgZm9ybXVsYS4KKyAgICBteSAkZm9ybWF0X2luZGV4ID0gJF9bM10gfHwgMDsgICAgIyBOdW0gZm9ybWF0IGluZGV4LgorICAgIG15ICRncmJpdCAgICAgICAgPSAweDAwMDA7ICAgICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRmb3JtdWxhX2xlbmd0aCA9IGxlbmd0aCAkZm9ybXVsYTsKKworICAgICRsZW5ndGggKz0gJGZvcm11bGFfbGVuZ3RoOworCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkaWQ7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0eXBlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRmb3JtYXRfaW5kZXg7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRmb3JtdWxhX2xlbmd0aDsKKyAgICAkZGF0YSAuPSAkZm9ybXVsYTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FyZWFmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgQVJFQUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4gQ29udGFpbnMgdGhlIHBhdHRlcm5zIGFuZCBjb2xvdXJzCisjIG9mIGEgY2hhcnQgYXJlYS4KKyMKK3N1YiBfc3RvcmVfYXJlYWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAwQTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDEwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJnYkZvcmUgICA9ICRfWzBdOyAgICAgIyBGb3JlZ3JvdW5kIFJHQiBjb2xvdXIuCisgICAgbXkgJHJnYkJhY2sgICA9ICRfWzFdOyAgICAgIyBCYWNrZ3JvdW5kIFJHQiBjb2xvdXIuCisgICAgbXkgJHBhdHRlcm4gICA9ICRfWzJdOyAgICAgIyBQYXR0ZXJuLgorICAgIG15ICRncmJpdCAgICAgPSAkX1szXTsgICAgICMgT3B0aW9uIGZsYWdzLgorICAgIG15ICRpbmRleEZvcmUgPSAkX1s0XTsgICAgICMgSW5kZXggdG8gRm9yZWdyb3VuZCBjb2xvdXIuCisgICAgbXkgJGluZGV4QmFjayA9ICRfWzVdOyAgICAgIyBJbmRleCB0byBCYWNrZ3JvdW5kIGNvbG91ci4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYkZvcmU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2JCYWNrOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcGF0dGVybjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXhGb3JlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaW5kZXhCYWNrOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhjZXh0KCkKKyMKKyMgV3JpdGUgdGhlIEFYQ0VYVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhjZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgID0gMHgxMDYyOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMTI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkY2F0TWluICAgICAgID0gMHgwMDAwOyAgICAjIE1pbmltdW0gY2F0ZWdvcnkgb24gYXhpcy4KKyAgICBteSAkY2F0TWF4ICAgICAgID0gMHgwMDAwOyAgICAjIE1heGltdW0gY2F0ZWdvcnkgb24gYXhpcy4KKyAgICBteSAkY2F0TWFqb3IgICAgID0gMHgwMDAxOyAgICAjIFZhbHVlIG9mIG1ham9yIHVuaXQuCisgICAgbXkgJHVuaXRNYWpvciAgICA9IDB4MDAwMDsgICAgIyBVbml0cyBvZiBtYWpvciB1bml0LgorICAgIG15ICRjYXRNaW5vciAgICAgPSAweDAwMDE7ICAgICMgVmFsdWUgb2YgbWlub3IgdW5pdC4KKyAgICBteSAkdW5pdE1pbm9yICAgID0gMHgwMDAwOyAgICAjIFVuaXRzIG9mIG1pbm9yIHVuaXQuCisgICAgbXkgJHVuaXRCYXNlICAgICA9IDB4MDAwMDsgICAgIyBCYXNlIHVuaXQgb2YgYXhpcy4KKyAgICBteSAkY2F0Q3Jvc3NEYXRlID0gMHgwMDAwOyAgICAjIENyb3NzaW5nIHBvaW50LgorICAgIG15ICRncmJpdCAgICAgICAgPSAweDAwRUY7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWluOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWF4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TWFqb3I7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR1bml0TWFqb3I7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNaW5vcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHVuaXRNaW5vcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHVuaXRCYXNlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0Q3Jvc3NEYXRlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGVzdXNlZCgpCisjCisjIFdyaXRlIHRoZSBBWEVTVVNFRCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhlc3VzZWQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTA0NjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbnVtX2F4ZXMgPSAkX1swXTsgICAgICMgTnVtYmVyIG9mIGF4ZXMgdXNlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJG51bV9heGVzOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpcygpCisjCisjIFdyaXRlIHRoZSBBWElTIGNoYXJ0IEJJRkYgcmVjb3JkIHRvIGRlZmluZSB0aGUgYXhpcyB0eXBlLgorIworc3ViIF9zdG9yZV9heGlzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgxMDFEOyAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDEyOyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICR0eXBlICAgICAgPSAkX1swXTsgICAgICAgICAjIEF4aXMgdHlwZS4KKyAgICBteSAkcmVzZXJ2ZWQxID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQyID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQzID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQ0ID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHR5cGU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDI7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDM7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9heGlzbGluZWZvcm1hdCgpCisjCisjIFdyaXRlIHRoZSBBWElTTElORUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfYXhpc2xpbmVmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MTAyMTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbGluZV9mb3JtYXQgPSAweDAwMDE7ICAgICMgQXhpcyBsaW5lIGZvcm1hdC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGxpbmVfZm9ybWF0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc3BhcmVudCgpCisjCisjIFdyaXRlIHRoZSBBWElTUEFSRU5UIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDQxOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMTI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaWF4ICAgID0gJF9bMF07ICAgICAjIEF4aXMgaW5kZXguCisgICAgbXkgJHggICAgICA9ICRfWzFdOyAgICAgIyBYLWNvb3JkLgorICAgIG15ICR5ICAgICAgPSAkX1syXTsgICAgICMgWS1jb29yZC4KKyAgICBteSAkZHggICAgID0gJF9bM107ICAgICAjIExlbmd0aCBvZiB4IGF4aXMuCisgICAgbXkgJGR5ICAgICA9ICRfWzRdOyAgICAgIyBMZW5ndGggb2YgeSBheGlzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWF4OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHk7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGR5OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYmVnaW4oKQorIworIyBXcml0ZSB0aGUgQkVHSU4gY2hhcnQgQklGRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgc3ViIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfYmVnaW4geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMzM7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2F0c2VycmFuZ2UoKQorIworIyBXcml0ZSB0aGUgQ0FUU0VSUkFOR0UgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NhdHNlcnJhbmdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMjA7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDA4OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGNhdENyb3NzID0gMHgwMDAxOyAgICAjIFZhbHVlL2NhdGVnb3J5IGNyb3NzaW5nLgorICAgIG15ICRjYXRMYWJlbCA9IDB4MDAwMTsgICAgIyBGcmVxdWVuY3kgb2YgbGFiZWxzLgorICAgIG15ICRjYXRNYXJrICA9IDB4MDAwMTsgICAgIyBGcmVxdWVuY3kgb2YgdGlja3MuCisgICAgbXkgJGdyYml0ICAgID0gMHgwMDAxOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGNhdENyb3NzOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0TGFiZWw7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRNYXJrOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydCgpCisjCisjIFdyaXRlIHRoZSBDSEFSVCBCSUZGIHJlY29yZC4gVGhpcyBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIHRoZSBjaGFydCBzdWItc3RyZWFtCisjIGFuZCBjb250YWlucyBkaW1lbnNpb25zIG9mIHRoZSBjaGFydCBvbiB0aGUgZGlzcGxheS4gVW5pdHMgYXJlIGluIDEvNzIgaW5jaAorIyBhbmQgYXJlIDIgYnl0ZSBpbnRlZ2VyIHdpdGggMiBieXRlIGZyYWN0aW9uLgorIworc3ViIF9zdG9yZV9jaGFydCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAwMjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDEwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHhfcG9zICA9ICRfWzBdOyAgICAgIyBYIHBvcyBvZiB0b3AgbGVmdCBjb3JuZXIuCisgICAgbXkgJHlfcG9zICA9ICRfWzFdOyAgICAgIyBZIHBvcyBvZiB0b3AgbGVmdCBjb3JuZXIuCisgICAgbXkgJGR4ICAgICA9ICRfWzJdOyAgICAgIyBYIHNpemUuCisgICAgbXkgJGR5ICAgICA9ICRfWzNdOyAgICAgIyBZIHNpemUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4X3BvczsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHlfcG9zOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeTsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0Zm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIENIQVJURk9STUFUIGNoYXJ0IEJJRkYgcmVjb3JkLiBUaGUgcGFyZW50IHJlY29yZCBmb3IgZm9ybWF0dGluZworIyBvZiBhIGNoYXJ0IGdyb3VwLgorIworc3ViIF9zdG9yZV9jaGFydGZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNDsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICA9IDB4MDAxNDsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkcmVzZXJ2ZWQxID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQyID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQzID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkcmVzZXJ2ZWQ0ID0gMHgwMDAwMDAwMDsgICAgIyBSZXNlcnZlZC4KKyAgICBteSAkZ3JiaXQgICAgID0gJF9bMF0gfHwgMDsgICAgIyBPcHRpb24gZmxhZ3MuCisgICAgbXkgJGljcnQgICAgICA9IDB4MDAwMDsgICAgICAgICMgRHJhd2luZyBvcmRlci4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkMzsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJlc2VydmVkNDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkaWNydDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0bGluZSgpCisjCisjIFdyaXRlIHRoZSBDSEFSVExJTkUgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NoYXJ0bGluZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxQzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHR5cGUgICA9IDB4MDAwMTsgICAgIyBEcm9wL2hpLWxvIGxpbmUgdHlwZS4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHR5cGU7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydHRleHQoKQorIworIyBXcml0ZSB0aGUgVEVYVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2hhcnR0ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgICA9IDB4MTAyNTsgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICAgICAgPSAweDAwMjA7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGhvcnpfYWxpZ24gICAgICAgPSAweDAyOyAgICAgICAgICAjIEhvcml6b250YWwgYWxpZ25tZW50LgorICAgIG15ICR2ZXJ0X2FsaWduICAgICAgID0gMHgwMjsgICAgICAgICAgIyBWZXJ0aWNhbCBhbGlnbm1lbnQuCisgICAgbXkgJGJnX21vZGUgICAgICAgICAgPSAweDAwMDE7ICAgICAgICAjIEJhY2tncm91bmQgZGlzcGxheS4KKyAgICBteSAkdGV4dF9jb2xvcl9yZ2IgICA9IDB4MDAwMDAwMDA7ICAgICMgVGV4dCBSR0IgY29sb3VyLgorICAgIG15ICR0ZXh0X3ggICAgICAgICAgID0gMHhGRkZGRkY0NjsgICAgIyBUZXh0IHgtcG9zLgorICAgIG15ICR0ZXh0X3kgICAgICAgICAgID0gMHhGRkZGRkYwNjsgICAgIyBUZXh0IHktcG9zLgorICAgIG15ICR0ZXh0X2R4ICAgICAgICAgID0gMHgwMDAwMDAwMDsgICAgIyBXaWR0aC4KKyAgICBteSAkdGV4dF9keSAgICAgICAgICA9IDB4MDAwMDAwMDA7ICAgICMgSGVpZ2h0LgorICAgIG15ICRncmJpdDEgICAgICAgICAgID0gMHgwMEIxOyAgICAgICAgIyBPcHRpb25zCisgICAgbXkgJHRleHRfY29sb3JfaW5kZXggPSAweDAwNEQ7ICAgICAgICAjIEF1dG8gQ29sb3VyLgorICAgIG15ICRncmJpdDIgICAgICAgICAgID0gMHgwMDAwOyAgICAgICAgIyBEYXRhIGxhYmVsIHBsYWNlbWVudC4KKyAgICBteSAkcm90YXRpb24gICAgICAgICA9IDB4MDAwMDsgICAgICAgICMgVGV4dCByb3RhdGlvbi4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJGhvcnpfYWxpZ247CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR2ZXJ0X2FsaWduOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkYmdfbW9kZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHRleHRfY29sb3JfcmdiOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF94OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF95OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkdGV4dF9keDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHRleHRfZHk7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDE7CisgICAgJGRhdGEgLj0gcGFjayAndicsICR0ZXh0X2NvbG9yX2luZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZ3JiaXQyOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcm90YXRpb247CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kYXRhZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIERBVEFGT1JNQVQgY2hhcnQgQklGRiByZWNvcmQuIFRoaXMgcmVjb3JkIHNwZWNpZmllcyB0aGUgc2VyaWVzCisjIHRoYXQgdGhlIHN1YnNlcXVlbnQgc3ViIHN0cmVhbSByZWZlcnMgdG8uCisjCitzdWIgX3N0b3JlX2RhdGFmb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgID0gMHgxMDA2OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgID0gMHgwMDA4OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHNlcmllc19pbmRleCAgPSAkX1swXTsgICAgICMgU2VyaWVzIGluZGV4LgorICAgIG15ICRzZXJpZXNfbnVtYmVyID0gJF9bMV07ICAgICAjIFNlcmllcyBudW1iZXIuIChTYW1lIGFzIGluZGV4KS4KKyAgICBteSAkcG9pbnRfbnVtYmVyICA9ICRfWzJdOyAgICAgIyBQb2ludCBudW1iZXIuCisgICAgbXkgJGdyYml0ICAgICAgICAgPSAweDAwMDA7ICAgICMgRm9ybWF0IGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcG9pbnRfbnVtYmVyOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkc2VyaWVzX2luZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkc2VyaWVzX251bWJlcjsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZGVmYXVsdHRleHQoKQorIworIyBXcml0ZSB0aGUgREVGQVVMVFRFWFQgY2hhcnQgQklGRiByZWNvcmQuIElkZW50aWZpZXIgZm9yIHN1YnNlcXVlbnQgVEVYVAorIyByZWNvcmQuCisjCitzdWIgX3N0b3JlX2RlZmF1bHR0ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDI0OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkdHlwZSAgID0gMHgwMDAyOyAgICAjIFR5cGUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICR0eXBlOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZHJvcGJhcigpCisjCisjIFdyaXRlIHRoZSBEUk9QQkFSIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9kcm9wYmFyIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwM0Q7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBlcmNlbnRfZ2FwID0gMHgwMDk2OyAgICAjIERyb3AgYmFyIHdpZHRoIGdhcCAoJSkuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRwZXJjZW50X2dhcDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2VuZCgpCisjCisjIFdyaXRlIHRoZSBFTkQgY2hhcnQgQklGRiByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiBhIHN1YiBzdHJlYW0uCisjCitzdWIgX3N0b3JlX2VuZCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAzNDsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAwOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9mYmkoKQorIworIyBXcml0ZSB0aGUgRkJJIGNoYXJ0IEJJRkYgcmVjb3JkLiBTcGVjaWZpZXMgdGhlIGZvbnQgaW5mb3JtYXRpb24gYXQgdGhlIHRpbWUKKyMgaXQgd2FzIGFwcGxpZWQgdG8gdGhlIGNoYXJ0LgorIworc3ViIF9zdG9yZV9mYmkgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDEwNjA7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMEE7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGluZGV4ICAgICAgICA9ICRfWzBdOyAgICAgICAgICMgRm9udCBpbmRleC4KKyAgICBteSAkaGVpZ2h0ICAgICAgID0gJF9bMV0gKiAyMDsgICAgIyBEZWZhdWx0IGZvbnQgaGVpZ2h0IGluIHR3aXBzLgorICAgIG15ICR3aWR0aF9iYXNpcyAgPSAkX1syXTsgICAgICAgICAjIFdpZHRoIGJhc2lzLCBpbiB0d2lwcy4KKyAgICBteSAkaGVpZ2h0X2Jhc2lzID0gJF9bM107ICAgICAgICAgIyBIZWlnaHQgYmFzaXMsIGluIHR3aXBzLgorICAgIG15ICRzY2FsZV9iYXNpcyAgPSAkX1s0XTsgICAgICAgICAjIFNjYWxlIGJ5IGNoYXJ0IGFyZWEgb3IgcGxvdCBhcmVhLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkd2lkdGhfYmFzaXM7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRoZWlnaHRfYmFzaXM7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRoZWlnaHQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRzY2FsZV9iYXNpczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZm9udHgoKQorIworIyBXcml0ZSB0aGUgRk9OVFggY2hhcnQgQklGRiByZWNvcmQgd2hpY2ggY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBGT05UCisjIHJlY29yZCBpbiB0aGUgV29ya2Jvb2suCisjCitzdWIgX3N0b3JlX2ZvbnR4IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDI2OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkaW5kZXggID0gJF9bMF07ICAgICAjIEZvbnQgaW5kZXguCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRpbmRleDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ZyYW1lKCkKKyMKKyMgV3JpdGUgdGhlIEZSQU1FIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9mcmFtZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgPSAweDEwMzI7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgPSAweDAwMDQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZnJhbWVfdHlwZSA9ICRfWzBdOyAgICAgIyBGcmFtZSB0eXBlLgorICAgIG15ICRncmJpdCAgICAgID0gJF9bMV07ICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGZyYW1lX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xlZ2VuZCgpCisjCisjIFdyaXRlIHRoZSBMRUdFTkQgY2hhcnQgQklGRiByZWNvcmQuIFRoZSBNYXJjdXMgSG9yYW4gbWV0aG9kLgorIworc3ViIF9zdG9yZV9sZWdlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAxNTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMTQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkeCAgICAgICAgPSAkX1swXTsgICAgICMgWC1wb3NpdGlvbi4KKyAgICBteSAkeSAgICAgICAgPSAkX1sxXTsgICAgICMgWS1wb3NpdGlvbi4KKyAgICBteSAkd2lkdGggICAgPSAkX1syXTsgICAgICMgV2lkdGguCisgICAgbXkgJGhlaWdodCAgID0gJF9bM107ICAgICAjIEhlaWdodC4KKyAgICBteSAkd1R5cGUgICAgPSAkX1s0XTsgICAgICMgVHlwZS4KKyAgICBteSAkd1NwYWNpbmcgPSAkX1s1XTsgICAgICMgU3BhY2luZy4KKyAgICBteSAkZ3JiaXQgICAgPSAkX1s2XTsgICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHk7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR3aWR0aDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJGhlaWdodDsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHdUeXBlOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkd1NwYWNpbmc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2xpbmVmb3JtYXQoKQorIworIyBXcml0ZSB0aGUgTElORUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbGluZWZvcm1hdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAwNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDBDOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHJnYiAgICA9ICRfWzBdOyAgICAgIyBMaW5lIFJHQiBjb2xvdXIuCisgICAgbXkgJGxucyAgICA9ICRfWzFdOyAgICAgIyBMaW5lIHBhdHRlcm4uCisgICAgbXkgJHdlICAgICA9ICRfWzJdOyAgICAgIyBMaW5lIHdlaWdodC4KKyAgICBteSAkZ3JiaXQgID0gJF9bM107ICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaW5kZXggID0gJF9bNF07ICAgICAjIEluZGV4IHRvIGNvbG91ciBvZiBsaW5lLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkbG5zOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkd2U7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIE1BUktFUkZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbWFya2VyZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTAwOTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICA9IDB4MDAxNDsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyZ2JGb3JlID0gJF9bMF07ICAgICAjIEZvcmVncm91bmQgUkdCIGNvbG9yLgorICAgIG15ICRyZ2JCYWNrID0gJF9bMV07ICAgICAjIEJhY2tncm91bmQgUkdCIGNvbG9yLgorICAgIG15ICRtYXJrZXIgID0gJF9bMl07ICAgICAjIFR5cGUgb2YgbWFya2VyLgorICAgIG15ICRncmJpdCAgID0gJF9bM107ICAgICAjIEZvcm1hdCBmbGFncy4KKyAgICBteSAkaWN2Rm9yZSA9ICRfWzRdOyAgICAgIyBDb2xvciBpbmRleCBtYXJrZXIgYm9yZGVyLgorICAgIG15ICRpY3ZCYWNrID0gJF9bNV07ICAgICAjIENvbG9yIGluZGV4IG1hcmtlciBmaWxsLgorICAgIG15ICRtaVNpemUgID0gJF9bNl07ICAgICAjIFNpemUgb2YgbGluZSBtYXJrZXJzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiRm9yZTsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHJnYkJhY2s7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRtYXJrZXI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGljdkZvcmU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRpY3ZCYWNrOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkbWlTaXplOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfb2JqZWN0bGluaygpCisjCisjIFdyaXRlIHRoZSBPQkpFQ1RMSU5LIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9vYmplY3RsaW5rIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwMjc7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGxpbmtfdHlwZSAgID0gJF9bMF07ICAgICAjIE9iamVjdCB0ZXh0IGxpbmsgdHlwZS4KKyAgICBteSAkbGlua19pbmRleDEgPSAweDAwMDA7ICAgICMgTGluayBpbmRleCAxLgorICAgIG15ICRsaW5rX2luZGV4MiA9IDB4MDAwMDsgICAgIyBMaW5rIGluZGV4IDIuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRsaW5rX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRsaW5rX2luZGV4MTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGxpbmtfaW5kZXgyOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGllZm9ybWF0KCkKKyMKKyMgV3JpdGUgdGhlIFBJRUZPUk1BVCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGllZm9ybWF0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MTAwQjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRwZXJjZW50ID0gMHgwMDAwOyAgICAjIERpc3RhbmNlICUgZnJvbSBjZW50ZXIuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwZXJjZW50OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGxvdGFyZWEoKQorIworIyBXcml0ZSB0aGUgUExPVEFSRUEgY2hhcnQgQklGRiByZWNvcmQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHN1YnNlcXVlbnQKKyMgRlJBTUUgcmVjb3JkIGJlbG9uZ3MgdG8gYSBwbG90IGFyZWEuCisjCitzdWIgX3N0b3JlX3Bsb3RhcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDM1OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDA7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Bsb3Rncm93dGgoKQorIworIyBXcml0ZSB0aGUgUExPVEdST1dUSCBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGxvdGdyb3d0aCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDEwNjQ7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRkeF9wbG90ID0gMHgwMDAxMDAwMDsgICAgIyBIb3J6IGdyb3d0aCBmb3IgZm9udCBzY2FsZS4KKyAgICBteSAkZHlfcGxvdCA9IDB4MDAwMTAwMDA7ICAgICMgVmVydCBncm93dGggZm9yIGZvbnQgc2NhbGUuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeF9wbG90OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHlfcGxvdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BvcygpCisjCisjIFdyaXRlIHRoZSBQT1MgY2hhcnQgQklGRiByZWNvcmQuIEdlbmVyYWxseSBub3QgcmVxdWlyZWQgd2hlbiB1c2luZworIyBhdXRvbWF0aWMgcG9zaXRpb25pbmcuCisjCitzdWIgX3N0b3JlX3BvcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDEwNEY7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMTQ7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbWRUb3BMdCA9ICRfWzBdOyAgICAgIyBUb3AgbGVmdC4KKyAgICBteSAkbWRCb3RSdCA9ICRfWzFdOyAgICAgIyBCb3R0b20gcmlnaHQuCisgICAgbXkgJHgxICAgICAgPSAkX1syXTsgICAgICMgWCBjb29yZGluYXRlLgorICAgIG15ICR5MSAgICAgID0gJF9bM107ICAgICAjIFkgY29vcmRpbmF0ZS4KKyAgICBteSAkeDIgICAgICA9ICRfWzRdOyAgICAgIyBXaWR0aC4KKyAgICBteSAkeTIgICAgICA9ICRfWzVdOyAgICAgIyBIZWlnaHQuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRtZFRvcEx0OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkbWRCb3RSdDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHgxOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkeTE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR4MjsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHkyOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2VyYXV4dHJlbmQoKQorIworIyBXcml0ZSB0aGUgU0VSQVVYVFJFTkQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NlcmF1eHRyZW5kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICA9IDB4MTA0QjsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgICA9IDB4MDAxQzsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRyZWdfdHlwZSAgID0gJF9bMF07ICAgICAjIFJlZ3Jlc3Npb24gdHlwZS4KKyAgICBteSAkcG9seV9vcmRlciA9ICRfWzFdOyAgICAgIyBQb2x5bm9taWFsIG9yZGVyLgorICAgIG15ICRlcXVhdGlvbiAgID0gJF9bMl07ICAgICAjIERpc3BsYXkgZXF1YXRpb24uCisgICAgbXkgJHJfc3F1YXJlZCAgPSAkX1szXTsgICAgICMgRGlzcGxheSBSLXNxdWFyZWQuCisgICAgbXkgJGludGVyY2VwdDsgICAgICAgICAgICAgICMgRm9yY2VkIGludGVyY2VwdC4KKyAgICBteSAkZm9yZWNhc3Q7ICAgICAgICAgICAgICAgIyBGb3JlY2FzdCBmb3J3YXJkLgorICAgIG15ICRiYWNrY2FzdDsgICAgICAgICAgICAgICAjIEZvcmVjYXN0IGJhY2t3YXJkLgorCisgICAgIyBUT0RPLiBXaGVuIHN1cHBvcnRlZCwgaW50ZXJjZXB0IG5lZWRzIHRvIGJlIE5BTiBpZiBub3QgdXNlZC4KKyAgICAjIEFsc28gbmVlZCB0byByZXZlcnNlIGRvdWJsZXMuCisgICAgJGludGVyY2VwdCA9IHBhY2sgJ0gqJywgJ0ZGRkZGRkZGMDAwMUZGRkYnOworICAgICRmb3JlY2FzdCAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAwMDAwMDAwJzsKKyAgICAkYmFja2Nhc3QgID0gcGFjayAnSConLCAnMDAwMDAwMDAwMDAwMDAwMCc7CisKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHJlZ190eXBlOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkcG9seV9vcmRlcjsKKyAgICAkZGF0YSAuPSAkaW50ZXJjZXB0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkZXF1YXRpb247CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRyX3NxdWFyZWQ7CisgICAgJGRhdGEgLj0gJGZvcmVjYXN0OworICAgICRkYXRhIC49ICRiYWNrY2FzdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlcmllcygpCisjCisjIFdyaXRlIHRoZSBTRVJJRVMgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NlcmllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgID0gMHgxMDAzOyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgICAgICA9IDB4MDAwQzsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRjYXRlZ29yeV90eXBlICA9IDB4MDAwMTsgICAgIyBUeXBlOiBjYXRlZ29yeS4KKyAgICBteSAkdmFsdWVfdHlwZSAgICAgPSAweDAwMDE7ICAgICMgVHlwZTogdmFsdWUuCisgICAgbXkgJGNhdGVnb3J5X2NvdW50ID0gJF9bMF07ICAgICAjIE51bSBvZiBjYXRlZ29yaWVzLgorICAgIG15ICR2YWx1ZV9jb3VudCAgICA9ICRfWzFdOyAgICAgIyBOdW0gb2YgdmFsdWVzLgorICAgIG15ICRidWJibGVfdHlwZSAgICA9IDB4MDAwMTsgICAgIyBUeXBlOiBidWJibGUuCisgICAgbXkgJGJ1YmJsZV9jb3VudCAgID0gMHgwMDAwOyAgICAjIE51bSBvZiBidWJibGUgdmFsdWVzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9ICcnOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkY2F0ZWdvcnlfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHZhbHVlX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRjYXRlZ29yeV9jb3VudDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHZhbHVlX2NvdW50OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkYnViYmxlX3R5cGU7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfY291bnQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJpZXN0ZXh0KCkKKyMKKyMgV3JpdGUgdGhlIFNFUklFU1RFWFQgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3Nlcmllc3RleHQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MTAwRDsgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwMDsgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGlkICAgICAgID0gMHgwMDAwOyAgICAgICAgICMgVGV4dCBpZC4KKyAgICBteSAkc3RyICAgICAgPSAkX1swXTsgICAgICAgICAgIyBUZXh0LgorICAgIG15ICRlbmNvZGluZyA9ICRfWzFdOyAgICAgICAgICAjIFN0cmluZyBlbmNvZGluZy4KKyAgICBteSAkY2NoICAgICAgPSBsZW5ndGggJHN0cjsgICAgIyBTdHJpbmcgbGVuZ3RoLgorCisgICAgIyBDaGFyYWN0ZXIgbGVuZ3RoIGlzIG51bSBvZiBjaGFycyBub3QgbnVtIG9mIGJ5dGVzCisgICAgJGNjaCAvPSAyIGlmICRlbmNvZGluZzsKKworICAgICMgQ2hhbmdlIHRoZSBVVEYtMTYgbmFtZSBmcm9tIEJFIHRvIExFCisgICAgJHN0ciA9IHBhY2sgJ24qJywgdW5wYWNrICd2KicsICRzdHIgaWYgJGVuY29kaW5nOworCisgICAgJGxlbmd0aCA9IDQgKyBsZW5ndGgoICRzdHIgKTsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGlkOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkY2NoOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkZW5jb2Rpbmc7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEsICRzdHIgKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXJwYXJlbnQoKQorIworIyBXcml0ZSB0aGUgU0VSUEFSRU5UIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9zZXJwYXJlbnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwNEE7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRzZXJpZXMgPSAkX1swXTsgICAgICMgU2VyaWVzIHBhcmVudC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJHNlcmllczsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlcnRvY3J0KCkKKyMKKyMgV3JpdGUgdGhlIFNFUlRPQ1JUIGNoYXJ0IEJJRkYgcmVjb3JkIHRvIGluZGljYXRlIHRoZSBjaGFydCBncm91cCBpbmRleC4KKyMKK3N1YiBfc3RvcmVfc2VydG9jcnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgID0gMHgxMDQ1OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGNoYXJ0Z3JvdXAgPSAweDAwMDA7ICAgICMgQ2hhcnQgZ3JvdXAgaW5kZXguCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRjaGFydGdyb3VwOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc2h0cHJvcHMoKQorIworIyBXcml0ZSB0aGUgU0hUUFJPUFMgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3NodHByb3BzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDEwNDQ7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA0OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGdyYml0ICAgICAgID0gMHgwMDBFOyAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkZW1wdHlfY2VsbHMgPSAweDAwMDA7ICAgICMgRW1wdHkgY2VsbCBoYW5kbGluZy4KKworICAgICRncmJpdCA9IDB4MDAwQSBpZiAkc2VsZi0+e19lbWJlZGRlZH07CisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGVtcHR5X2NlbGxzOworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdGV4dCgpCisjCisjIFdyaXRlIHRoZSBURVhUIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV90ZXh0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMjU7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAyMDsgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkYXQgICAgICAgPSAweDAyOyAgICAgICAgICAgICAjIEhvcml6b250YWwgYWxpZ25tZW50LgorICAgIG15ICR2YXQgICAgICA9IDB4MDI7ICAgICAgICAgICAgICMgVmVydGljYWwgYWxpZ25tZW50LgorICAgIG15ICR3QmtnTW9kZSA9IDB4MDAwMTsgICAgICAgICAgICMgQmFja2dyb3VuZCBkaXNwbGF5LgorICAgIG15ICRyZ2JUZXh0ICA9IDB4MDAwMDsgICAgICAgICAgICMgVGV4dCBSR0IgY29sb3VyLgorICAgIG15ICR4ICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICMgVGV4dCB4LXBvcy4KKyAgICBteSAkeSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAjIFRleHQgeS1wb3MuCisgICAgbXkgJGR4ICAgICAgID0gJF9bMl07ICAgICAgICAgICAgIyBXaWR0aC4KKyAgICBteSAkZHkgICAgICAgPSAkX1szXTsgICAgICAgICAgICAjIEhlaWdodC4KKyAgICBteSAkZ3JiaXQxICAgPSAkX1s0XTsgICAgICAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaWN2VGV4dCAgPSAweDAwNEQ7ICAgICAgICAgICAjIEF1dG8gQ29sb3VyLgorICAgIG15ICRncmJpdDIgICA9ICRfWzVdOyAgICAgICAgICAgICMgU2hvdyBsZWdlbmQuCisgICAgbXkgJHJvdGF0aW9uID0gJF9bNl0gfHwgMHgwMDsgICAgIyBTaG93IHZhbHVlLgorCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICRhdDsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHZhdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJHdCa2dNb2RlOworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkcmdiVGV4dDsKKyAgICAkZGF0YSAuPSBwYWNrICdWJywgJHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICR5OworICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkZHg7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRkeTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0MTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGljdlRleHQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDI7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRyb3RhdGlvbjsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90aWNrKCkKKyMKKyMgV3JpdGUgdGhlIFRJQ0sgY2hhcnQgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3RpY2sgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDEwMUU7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMUU7ICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHRrdE1ham9yICA9IDB4MDI7ICAgICAgICAgICMgVHlwZSBvZiBtYWpvciB0aWNrIG1hcmsuCisgICAgbXkgJHRrdE1pbm9yICA9IDB4MDA7ICAgICAgICAgICMgVHlwZSBvZiBtaW5vciB0aWNrIG1hcmsuCisgICAgbXkgJHRsdCAgICAgICA9IDB4MDM7ICAgICAgICAgICMgVGljayBsYWJlbCBwb3NpdGlvbi4KKyAgICBteSAkd0JrZ01vZGUgID0gMHgwMTsgICAgICAgICAgIyBCYWNrZ3JvdW5kIG1vZGUuCisgICAgbXkgJHJnYiAgICAgICA9IDB4MDAwMDAwMDA7ICAgICMgVGljay1sYWJlbCBSR0IgY29sb3VyLgorICAgIG15ICRyZXNlcnZlZDEgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDIgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDMgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRyZXNlcnZlZDQgPSAweDAwMDAwMDAwOyAgICAjIFJlc2VydmVkLgorICAgIG15ICRncmJpdCAgICAgPSAweDAwMjM7ICAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkaW5kZXggICAgID0gMHgwMDREOyAgICAgICAgIyBDb2xvdXIgaW5kZXguCisgICAgbXkgJHJlc2VydmVkNSA9IDB4MDAwMDsgICAgICAgICMgUmVzZXJ2ZWQuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAnQycsICR0a3RNYWpvcjsKKyAgICAkZGF0YSAuPSBwYWNrICdDJywgJHRrdE1pbm9yOworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkdGx0OworICAgICRkYXRhIC49IHBhY2sgJ0MnLCAkd0JrZ01vZGU7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZ2I7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDE7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDI7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDM7CisgICAgJGRhdGEgLj0gcGFjayAnVicsICRyZXNlcnZlZDQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGluZGV4OworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkcmVzZXJ2ZWQ1OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmFsdWVyYW5nZSgpCisjCisjIFdyaXRlIHRoZSBWQUxVRVJBTkdFIGNoYXJ0IEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV92YWx1ZXJhbmdlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDEwMUY7ICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggICA9IDB4MDAyQTsgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkbnVtTWluICAgPSAweDAwMDAwMDAwOyAgICAjIE1pbmltdW0gdmFsdWUgb24gYXhpcy4KKyAgICBteSAkbnVtTWF4ICAgPSAweDAwMDAwMDAwOyAgICAjIE1heGltdW0gdmFsdWUgb24gYXhpcy4KKyAgICBteSAkbnVtTWFqb3IgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIG9mIG1ham9yIGluY3JlbWVudC4KKyAgICBteSAkbnVtTWlub3IgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIG9mIG1pbm9yIGluY3JlbWVudC4KKyAgICBteSAkbnVtQ3Jvc3MgPSAweDAwMDAwMDAwOyAgICAjIFZhbHVlIHdoZXJlIGNhdGVnb3J5IGF4aXMgY3Jvc3Nlcy4KKyAgICBteSAkZ3JiaXQgICAgPSAweDAxMUY7ICAgICAgICAjIEZvcm1hdCBmbGFncy4KKworICAgICMgVE9ETy4gUmV2ZXJzZSBkb3VibGVzIHdoZW4gdGhleSBhcmUgaGFuZGxlZC4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1pbjsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1heDsKKyAgICAkZGF0YSAuPSBwYWNrICdkJywgJG51bU1ham9yOworICAgICRkYXRhIC49IHBhY2sgJ2QnLCAkbnVtTWlub3I7CisgICAgJGRhdGEgLj0gcGFjayAnZCcsICRudW1Dcm9zczsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb25maWcgZGF0YS4KKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfZGVmYXVsdF9wcm9wZXJ0aWVzKCkKKyMKKyMgU2V0dXAgdGhlIGRlZmF1bHQgcHJvcGVydGllcyBmb3IgYSBjaGFydC4KKyMKK3N1YiBfc2V0X2RlZmF1bHRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbGVnZW5kfSA9IHsKKyAgICAgICAgX3Zpc2libGUgID0+IDEsCisgICAgICAgIF9wb3NpdGlvbiA9PiAwLAorICAgICAgICBfdmVydGljYWwgPT4gMCwKKyAgICB9OworCisgICAgJHNlbGYtPntfY2hhcnRhcmVhfSA9IHsKKyAgICAgICAgX3Zpc2libGUgICAgICAgICAgPT4gMCwKKyAgICAgICAgX2ZnX2NvbG9yX2luZGV4ICAgPT4gMHg0RSwKKyAgICAgICAgX2ZnX2NvbG9yX3JnYiAgICAgPT4gMHhGRkZGRkYsCisgICAgICAgIF9iZ19jb2xvcl9pbmRleCAgID0+IDB4NEQsCisgICAgICAgIF9iZ19jb2xvcl9yZ2IgICAgID0+IDB4MDAwMDAwLAorICAgICAgICBfYXJlYV9wYXR0ZXJuICAgICA9PiAweDAwMDAsCisgICAgICAgIF9hcmVhX29wdGlvbnMgICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfcGF0dGVybiAgICAgPT4gMHgwMDA1LAorICAgICAgICBfbGluZV93ZWlnaHQgICAgICA9PiAweEZGRkYsCisgICAgICAgIF9saW5lX2NvbG9yX2luZGV4ID0+IDB4NEQsCisgICAgICAgIF9saW5lX2NvbG9yX3JnYiAgID0+IDB4MDAwMDAwLAorICAgICAgICBfbGluZV9vcHRpb25zICAgICA9PiAweDAwMDgsCisgICAgfTsKKworICAgICRzZWxmLT57X3Bsb3RhcmVhfSA9IHsKKyAgICAgICAgX3Zpc2libGUgICAgICAgICAgPT4gMSwKKyAgICAgICAgX2ZnX2NvbG9yX2luZGV4ICAgPT4gMHgxNiwKKyAgICAgICAgX2ZnX2NvbG9yX3JnYiAgICAgPT4gMHhDMEMwQzAsCisgICAgICAgIF9iZ19jb2xvcl9pbmRleCAgID0+IDB4NEYsCisgICAgICAgIF9iZ19jb2xvcl9yZ2IgICAgID0+IDB4MDAwMDAwLAorICAgICAgICBfYXJlYV9wYXR0ZXJuICAgICA9PiAweDAwMDEsCisgICAgICAgIF9hcmVhX29wdGlvbnMgICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfcGF0dGVybiAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV93ZWlnaHQgICAgICA9PiAweDAwMDAsCisgICAgICAgIF9saW5lX2NvbG9yX2luZGV4ID0+IDB4MTcsCisgICAgICAgIF9saW5lX2NvbG9yX3JnYiAgID0+IDB4ODA4MDgwLAorICAgICAgICBfbGluZV9vcHRpb25zICAgICA9PiAweDAwMDAsCisgICAgfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zZXRfZGVmYXVsdF9jb25maWdfZGF0YSgpCisjCisjIFNldHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYSBjaGFydC4KKyMKK3N1YiBfc2V0X2RlZmF1bHRfY29uZmlnX2RhdGEgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJHNlbGYtPntfY29uZmlnfSA9IHsKKyAgICAgICAgX2F4aXNwYXJlbnQgICAgICA9PiBbIDAsIDB4MDBGOCwgMHgwMUY1LCAweDBFN0YsIDB4MEIzNiAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2F4aXNwYXJlbnRfcG9zICA9PiBbIDIsIDIsIDB4MDA4QywgMHgwMUFBLCAweDBFRUEsIDB4MEM1MiAgICAgICAgICAgXSwKKyAgICAgICAgX2NoYXJ0ICAgICAgICAgICA9PiBbIDB4MDAwMCwgMHgwMDAwLCAweDAyREQ1MUUwLCAweDAxQzJCODM4ICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfbnVtYmVycyAgICA9PiBbIDUsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfc2VyaWVzICAgICA9PiBbIDYsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfdGl0bGUgICAgICA9PiBbIDcsIDEyLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfYXhlcyAgICAgICA9PiBbIDgsIDEwLCAweDM4QjgsIDB4MjJBMSwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZCAgICAgICAgICA9PiBbIDB4MDVGOSwgMHgwRUU5LCAweDA0N0QsIDB4OUMsIDB4MDAsIDB4MDEsIDB4MEYgXSwKKyAgICAgICAgX2xlZ2VuZF9wb3MgICAgICA9PiBbIDUsIDIsIDB4MDVGOSwgMHgwRUU5LCAwLCAwICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0ICAgICA9PiBbIDB4RkZGRkZGNDYsIDB4RkZGRkZGMDYsIDAsIDAsIDB4MDBCMSwgMHgwMDAwICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0ICAgICA9PiBbIDB4RkZGRkZGNDYsIDB4RkZGRkZGMDYsIDAsIDAsIDB4MDBCMSwgMHgxMDIwICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3RpdGxlX3RleHQgICAgICA9PiBbIDB4MDZFNCwgMHgwMDUxLCAweDAxREIsIDB4MDBDNCwgMHgwMDgxLCAweDEwMzAgXSwKKyAgICAgICAgX3RpdGxlX3RleHRfcG9zICA9PiBbIDIsIDIsIDAsIDAsIDB4NzMsIDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0ICAgICA9PiBbIDB4MDdFMSwgMHgwREZDLCAweEIyLCAweDlDLCAweDAwODEsIDB4MDAwMCAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsICAweDJCLCAgMHgxNyAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0ICAgICA9PiBbIDB4MDAyRCwgMHgwNkFBLCAweDVGLCAweDFDQywgMHgwMjgxLCAweDAwLCA5MCAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MTcsICAweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICB9OyAjPj4+CisKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpCisjCisjIFNldHVwIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGF0YSBmb3IgYW4gZW1iZWRkZWQgY2hhcnQuCisjCitzdWIgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfZW1iZWRkZWR9ID0gMTsKKworICAgICRzZWxmLT57X2NoYXJ0YXJlYX0gPSB7CisgICAgICAgIF92aXNpYmxlICAgICAgICAgID0+IDEsCisgICAgICAgIF9mZ19jb2xvcl9pbmRleCAgID0+IDB4NEUsCisgICAgICAgIF9mZ19jb2xvcl9yZ2IgICAgID0+IDB4RkZGRkZGLAorICAgICAgICBfYmdfY29sb3JfaW5kZXggICA9PiAweDRELAorICAgICAgICBfYmdfY29sb3JfcmdiICAgICA9PiAweDAwMDAwMCwKKyAgICAgICAgX2FyZWFfcGF0dGVybiAgICAgPT4gMHgwMDAxLAorICAgICAgICBfYXJlYV9vcHRpb25zICAgICA9PiAweDAwMDEsCisgICAgICAgIF9saW5lX3BhdHRlcm4gICAgID0+IDB4MDAwMCwKKyAgICAgICAgX2xpbmVfd2VpZ2h0ICAgICAgPT4gMHgwMDAwLAorICAgICAgICBfbGluZV9jb2xvcl9pbmRleCA9PiAweDRELAorICAgICAgICBfbGluZV9jb2xvcl9yZ2IgICA9PiAweDAwMDAwMCwKKyAgICAgICAgX2xpbmVfb3B0aW9ucyAgICAgPT4gMHgwMDA5LAorICAgIH07CisKKworICAgICM8PDwgUGVybHRpZHkgaWdub3JlIHRoaXMuCisgICAgJHNlbGYtPntfY29uZmlnfSA9IHsKKyAgICAgICAgX2F4aXNwYXJlbnQgICAgICA9PiBbIDAsIDB4MDFEOCwgMHgwMzFELCAweDBENzksIDB4MDdFOSAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2F4aXNwYXJlbnRfcG9zICA9PiBbIDIsIDIsIDB4MDEwQywgMHgwMjkyLCAweDBFNDYsIDB4MDlGRCAgICAgICAgICAgXSwKKyAgICAgICAgX2NoYXJ0ICAgICAgICAgICA9PiBbIDB4MDAwMCwgMHgwMDAwLCAweDAxODQ3RkU4LCAweDAwRjQ3RkU4ICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfbnVtYmVycyAgICA9PiBbIDUsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfc2VyaWVzICAgICA9PiBbIDYsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfdGl0bGUgICAgICA9PiBbIDcsIDEyLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAwICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2ZvbnRfYXhlcyAgICAgICA9PiBbIDgsIDEwLCAweDFEQzQsIDB4MTI4NCwgMHgwMDAxICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZCAgICAgICAgICA9PiBbIDB4MDQ0RSwgMHgwRTRBLCAweDA4OEQsIDB4MDEyMywgMHgwLCAweDEsIDB4RiAgXSwKKyAgICAgICAgX2xlZ2VuZF9wb3MgICAgICA9PiBbIDUsIDIsIDB4MDQ0RSwgMHgwRTRBLCAwLCAwICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0ICAgICA9PiBbIDB4RkZGRkZGRDksIDB4RkZGRkZGQzEsIDAsIDAsIDB4MDBCMSwgMHgwMDAwICAgXSwKKyAgICAgICAgX2xlZ2VuZF90ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0ICAgICA9PiBbIDB4RkZGRkZGRDksIDB4RkZGRkZGQzEsIDAsIDAsIDB4MDBCMSwgMHgxMDIwICAgXSwKKyAgICAgICAgX3Nlcmllc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3RpdGxlX3RleHQgICAgICA9PiBbIDB4MDYwRiwgMHgwMDRDLCAweDAzOEEsIDB4MDE2RiwgMHgwMDgxLCAweDEwMzAgXSwKKyAgICAgICAgX3RpdGxlX3RleHRfcG9zICA9PiBbIDIsIDIsIDAsIDAsIDB4NzMsIDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0ICAgICA9PiBbIDB4MDdFRiwgMHgwQzhGLCAweDE1MywgMHgxMjMsIDB4ODEsIDB4MDAgICAgICAgXSwKKyAgICAgICAgX3hfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MkIsIDB4MTcgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0ICAgICA9PiBbIDB4MDA1NywgMHgwNTY0LCAweEI1LCAweDAzNUQsIDB4MDI4MSwgMHgwMCwgOTAgXSwKKyAgICAgICAgX3lfYXhpc190ZXh0X3BvcyA9PiBbIDIsIDIsIDAsIDAsIDB4MTcsIDB4NDQgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICB9OyAjPj4+Cit9CisKKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitDaGFydCAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBDaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgY2hhcnQgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworCisgICAgbXkgJGNoYXJ0ICAgICA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBDPENoYXJ0PiBtb2R1bGUgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbW9kdWxlcyB0aGF0IGltcGxlbWVudCBjaGFydHMgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBpbmZvcm1hdGlvbiBiZWxvdyBpcyBhcHBsaWNhYmxlIHRvIGFsbCBvZiB0aGUgYXZhaWxhYmxlIHN1YmNsYXNzZXMuCisKK1RoZSBDPENoYXJ0PiBtb2R1bGUgaXNuJ3QgdXNlZCBkaXJlY3RseSwgYSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZCB3aGVyZSB0aGUgY2hhcnQgdHlwZSBpcyBzcGVjaWZpZWQ6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworCitDdXJyZW50bHkgdGhlIHN1cHBvcnRlZCBjaGFydCB0eXBlcyBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxhcmVhPjogQ3JlYXRlcyBhbiBBcmVhIChmaWxsZWQgbGluZSkgc3R5bGUgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QXJlYT4uCisKKz1pdGVtICogQzxiYXI+OiBDcmVhdGVzIGEgQmFyIHN0eWxlICh0cmFuc3Bvc2VkIGhpc3RvZ3JhbSkgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QmFyPi4KKworPWl0ZW0gKiBDPGNvbHVtbj46IENyZWF0ZXMgYSBjb2x1bW4gc3R5bGUgKGhpc3RvZ3JhbSkgY2hhcnQuIFNlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6Q29sdW1uPi4KKworPWl0ZW0gKiBDPGxpbmU+OiBDcmVhdGVzIGEgTGluZSBzdHlsZSBjaGFydC4gU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpMaW5lPi4KKworPWl0ZW0gKiBDPHBpZT46IENyZWF0ZXMgYW4gUGllIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlBpZT4uCisKKz1pdGVtICogQzxzY2F0dGVyPjogQ3JlYXRlcyBhbiBTY2F0dGVyIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlNjYXR0ZXI+LgorCis9aXRlbSAqIEM8c3RvY2s+OiBDcmVhdGVzIGFuIFN0b2NrIHN0eWxlIGNoYXJ0LiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlN0b2NrPi4KKworPWJhY2sKKworTW9yZSBjaGFydHMgYW5kIHN1Yi10eXBlcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB0aW1lLiBTZWUgdGhlIEw8L1RPRE8+IHNlY3Rpb24uCisKK01ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCB0eXBlcyBhcmUgZG9jdW1lbnRlZCBiZWxvdy4KKworPWhlYWQxIENIQVJUIE1FVEhPRFMKKworPWhlYWQyIGFkZF9zZXJpZXMoKQorCitJbiBhbiBFeGNlbCBjaGFydCBhICJzZXJpZXMiIGlzIGEgY29sbGVjdGlvbiBvZiBpbmZvcm1hdGlvbiBzdWNoIGFzIHZhbHVlcywgeC1heGlzIGxhYmVscyBhbmQgdGhlIG5hbWUgdGhhdCBkZWZpbmUgd2hpY2ggZGF0YSBpcyBwbG90dGVkLiBUaGVzZSBzZXR0aW5ncyBhcmUgZGlzcGxheWVkIHdoZW4geW91IHNlbGVjdCB0aGUgQzw8IENoYXJ0IC0+IFNvdXJjZSBEYXRhLi4uID4+IG1lbnUgb3B0aW9uLgorCitXaXRoIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2hhcnQgb2JqZWN0IHRoZSBDPGFkZF9zZXJpZXMoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIGZvciBhIHNlcmllczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICAgICAgbmFtZSAgICAgICAgICA9PiAnU2VyaWVzIG5hbWUnLAorICAgICAgICBuYW1lX2Zvcm11bGEgID0+ICc9U2hlZXQxISRCJDEnLAorICAgICk7CisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzx2YWx1ZXM+CisKK1RoaXMgaXMgdGhlIG1vc3QgaW1wb3J0YW50IHByb3BlcnR5IG9mIGEgc2VyaWVzIGFuZCBtdXN0IGJlIHNldCBmb3IgZXZlcnkgY2hhcnQgb2JqZWN0LiBJdCBsaW5rcyB0aGUgY2hhcnQgd2l0aCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCBpdCBkaXNwbGF5cy4gTm90ZSB0aGUgZm9ybWF0IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBmb3JtdWxhLiBTZWUgTDwvV29ya2luZyB3aXRoIENlbGwgUmFuZ2VzPi4KKworPWl0ZW0gKiBDPGNhdGVnb3JpZXM+CisKK1RoaXMgc2V0cyB0aGUgY2hhcnQgY2F0ZWdvcnkgbGFiZWxzLiBUaGUgY2F0ZWdvcnkgaXMgbW9yZSBvciBsZXNzIHRoZSBzYW1lIGFzIHRoZSBYLWF4aXMuIEluIG1vc3QgY2hhcnQgdHlwZXMgdGhlIEM8Y2F0ZWdvcmllcz4gcHJvcGVydHkgaXMgb3B0aW9uYWwgYW5kIHRoZSBjaGFydCB3aWxsIGp1c3QgYXNzdW1lIGEgc2VxdWVudGlhbCBzZXJpZXMgZnJvbSBDPDEgLi4gbj4uCisKKz1pdGVtICogQzxuYW1lPgorCitTZXQgdGhlIG5hbWUgZm9yIHRoZSBzZXJpZXMuIFRoZSBuYW1lIGlzIGRpc3BsYXllZCBpbiB0aGUgY2hhcnQgbGVnZW5kIGFuZCBpbiB0aGUgZm9ybXVsYSBiYXIuIFRoZSBuYW1lIHByb3BlcnR5IGlzIG9wdGlvbmFsIGFuZCBpZiBpdCBpc24ndCBzdXBwbGllZCB3aWxsIGRlZmF1bHQgdG8gQzxTZXJpZXMgMSAuLiBuPi4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKK1lvdSBjYW4gYWRkIG1vcmUgdGhhbiBvbmUgc2VyaWVzIHRvIGEgY2hhcnQsIGluIGZhY3Qgc29tZSBjaGFydCB0eXBlcyBzdWNoIGFzIEM8c3RvY2s+IHJlcXVpcmUgaXQuIFRoZSBzZXJpZXMgbnVtYmVyaW5nIGFuZCBvcmRlciBpbiB0aGUgZmluYWwgY2hhcnQgaXMgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIGluIHdoaWNoIHRoYXQgYXJlIGFkZGVkLgorCisgICAgIyBBZGQgdGhlIGZpcnN0IHNlcmllcy4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4gQ2F0ZWdvcnkgaXMgdGhlIHNhbWUgYnV0IHZhbHVlcyBhcmUgZGlmZmVyZW50LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKworCisKKz1oZWFkMiBzZXRfeF9heGlzKCkKKworVGhlIEM8c2V0X3hfYXhpcygpPiBtZXRob2QgaXMgdXNlZCB0byBzZXQgcHJvcGVydGllcyBvZiB0aGUgWCBheGlzLgorCisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChtKScgKTsKKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPG5hbWU+CisKK1NldCB0aGUgbmFtZSAodGl0bGUgb3IgY2FwdGlvbikgZm9yIHRoZSBheGlzLiBUaGUgbmFtZSBpcyBkaXNwbGF5ZWQgYmVsb3cgdGhlIFggYXhpcy4gVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbC4gVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBubyBheGlzIG5hbWUuCisKKz1pdGVtICogQzxuYW1lX2Zvcm11bGE+CisKK09wdGlvbmFsLCBjYW4gYmUgdXNlZCB0byBsaW5rIHRoZSBuYW1lIHRvIGEgd29ya3NoZWV0IGNlbGwuIFNlZSBMPC9DaGFydCBuYW1lcyBhbmQgbGlua3M+LgorCis9YmFjaworCitBZGRpdGlvbmFsIGF4aXMgcHJvcGVydGllcyBzdWNoIGFzIHJhbmdlLCBkaXZpc2lvbnMgYW5kIHRpY2tzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgaW4gbGF0ZXIgcmVsZWFzZXMuIFNlZSB0aGUgTDwvVE9ETz4gc2VjdGlvbi4KKworCis9aGVhZDIgc2V0X3lfYXhpcygpCisKK1RoZSBDPHNldF95X2F4aXMoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIFkgYXhpcy4KKworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIHdlaWdodCAoa2cpJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8bmFtZT4KKworU2V0IHRoZSBuYW1lICh0aXRsZSBvciBjYXB0aW9uKSBmb3IgdGhlIGF4aXMuIFRoZSBuYW1lIGlzIGRpc3BsYXllZCB0byB0aGUgbGVmdCBvZiB0aGUgWSBheGlzLiBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLiBUaGUgZGVmYXVsdCBpcyB0byBoYXZlIG5vIGF4aXMgbmFtZS4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKK0FkZGl0aW9uYWwgYXhpcyBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmFuZ2UsIGRpdmlzaW9ucyBhbmQgdGlja3Mgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBsYXRlciByZWxlYXNlcy4gU2VlIHRoZSBMPC9UT0RPPiBzZWN0aW9uLgorCis9aGVhZDIgc2V0X3RpdGxlKCkKKworVGhlIEM8c2V0X3RpdGxlKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCB0aXRsZS4KKworICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdZZWFyIEVuZCBSZXN1bHRzJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8bmFtZT4KKworU2V0IHRoZSBuYW1lICh0aXRsZSkgZm9yIHRoZSBjaGFydC4gVGhlIG5hbWUgaXMgZGlzcGxheWVkIGFib3ZlIHRoZSBjaGFydC4gVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbC4gVGhlIGRlZmF1bHQgaXMgdG8gaGF2ZSBubyBjaGFydCB0aXRsZS4KKworPWl0ZW0gKiBDPG5hbWVfZm9ybXVsYT4KKworT3B0aW9uYWwsIGNhbiBiZSB1c2VkIHRvIGxpbmsgdGhlIG5hbWUgdG8gYSB3b3Jrc2hlZXQgY2VsbC4gU2VlIEw8L0NoYXJ0IG5hbWVzIGFuZCBsaW5rcz4uCisKKz1iYWNrCisKKworPWhlYWQyIHNldF9sZWdlbmQoKQorCitUaGUgQzxzZXRfbGVnZW5kKCk+IG1ldGhvZCBpcyB1c2VkIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCBsZWdlbmQuCisKKyAgICAkY2hhcnQtPnNldF9sZWdlbmQoIHBvc2l0aW9uID0+ICdub25lJyApOworCitUaGUgcHJvcGVydGllcyB0aGF0IGNhbiBiZSBzZXQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqIEM8cG9zaXRpb24+CisKK1NldCB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJ0IGxlZ2VuZC4KKworICAgICRjaGFydC0+c2V0X2xlZ2VuZCggcG9zaXRpb24gPT4gJ25vbmUnICk7CisKK1RoZSBkZWZhdWx0IGxlZ2VuZCBwb3NpdGlvbiBpcyBDPGJvdHRvbT4uIFRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIGNoYXJ0IHBvc2l0aW9ucyBhcmU6CisKKyAgICBub25lCisgICAgYm90dG9tCisKK1RoZSBvdGhlciBsZWdlbmQgcG9zaXRpb25zIHdpbGwgYmUgYWRkZWQgc29vbi4KKworPWJhY2sKKworCis9aGVhZDIgc2V0X2NoYXJ0YXJlYSgpCisKK1RoZSBDPHNldF9jaGFydGFyZWEoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBjaGFydCBhcmVhLiBJbiBFeGNlbCB0aGUgY2hhcnQgYXJlYSBpcyB0aGUgYmFja2dyb3VuZCBhcmVhIGJlaGluZCB0aGUgY2hhcnQuCisKK1RoZSBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHNldCBhcmU6CisKKz1vdmVyCisKKz1pdGVtICogQzxjb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIGNoYXJ0IGFyZWEuIFRoZSBFeGNlbCBkZWZhdWx0IGNoYXJ0IGFyZWEgY29sb3IgaXMgJ3doaXRlJywgaW5kZXggOS4gU2VlIEw8L0NoYXJ0IG9iamVjdCBjb2xvdXJzPi4KKworPWl0ZW0gKiBDPGxpbmVfY29sb3I+CisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBjaGFydCBhcmVhIGJvcmRlciBsaW5lLiBUaGUgRXhjZWwgZGVmYXVsdCBib3JkZXIgbGluZSBjb2xvdXIgaXMgJ2JsYWNrJywgaW5kZXggOS4gIFNlZSBMPC9DaGFydCBvYmplY3QgY29sb3Vycz4uCisKKz1pdGVtICogQzxsaW5lX3BhdHRlcm4+CisKK1NldCB0aGUgcGF0dGVybiBvZiB0aGUgb2YgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHBhdHRlcm4gaXMgJ25vbmUnLCBpbmRleCAwIGZvciBhIGNoYXJ0IHNoZWV0IGFuZCAnc29saWQnLCBpbmRleCAxLCBmb3IgYW4gZW1iZWRkZWQgY2hhcnQuIFNlZSBMPC9DaGFydCBsaW5lIHBhdHRlcm5zPi4KKworPWl0ZW0gKiBDPGxpbmVfd2VpZ2h0PgorCitTZXQgdGhlIHdlaWdodCBvZiB0aGUgb2YgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHdlaWdodCBpcyAnbmFycm93JywgaW5kZXggMi4gU2VlIEw8L0NoYXJ0IGxpbmUgd2VpZ2h0cz4uCisKKz1iYWNrCisKK0hlcmUgaXMgYW4gZXhhbXBsZSBvZiBzZXR0aW5nIHNldmVyYWwgcHJvcGVydGllczoKKworICAgICRjaGFydC0+c2V0X2NoYXJ0YXJlYSgKKyAgICAgICAgY29sb3IgICAgICAgID0+ICdyZWQnLAorICAgICAgICBsaW5lX2NvbG9yICAgPT4gJ2JsYWNrJywKKyAgICAgICAgbGluZV9wYXR0ZXJuID0+IDIsCisgICAgICAgIGxpbmVfd2VpZ2h0ICA9PiAzLAorICAgICk7CisKK05vdGUsIGZvciBjaGFydCBzaGVldHMgdGhlIGNoYXJ0IGFyZWEgYm9yZGVyIGlzIG9mZiBieSBkZWZhdWx0LiBGb3IgZW1iZWRkZWQgY2hhcnRzIGlzIGlzIG9uIGJ5IGRlZmF1bHQuCisKKz1oZWFkMiBzZXRfcGxvdGFyZWEoKQorCitUaGUgQzxzZXRfcGxvdGFyZWEoKT4gbWV0aG9kIGlzIHVzZWQgdG8gc2V0IHByb3BlcnRpZXMgb2YgdGhlIHBsb3QgYXJlYSBvZiBhIGNoYXJ0LiBJbiBFeGNlbCB0aGUgcGxvdCBhcmVhIGlzIHRoZSBhcmVhIGJldHdlZW4gdGhlIGF4ZXMgb24gd2hpY2ggdGhlIGNoYXJ0IHNlcmllcyBhcmUgcGxvdHRlZC4KKworVGhlIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgc2V0IGFyZToKKworPW92ZXIKKworPWl0ZW0gKiBDPHZpc2libGU+CisKK1NldCB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgcGxvdCBhcmVhLiBUaGUgZGVmYXVsdCBpcyAxIGZvciB2aXNpYmxlLiBTZXQgdG8gMCB0byBoaWRlIHRoZSBwbG90IGFyZWEgYW5kIGhhdmUgdGhlIHNhbWUgY29sb3VyIGFzIHRoZSBiYWNrZ3JvdW5kIGNoYXJ0IGFyZWEuCisKKz1pdGVtICogQzxjb2xvcj4KKworU2V0IHRoZSBjb2xvdXIgb2YgdGhlIHBsb3QgYXJlYS4gVGhlIEV4Y2VsIGRlZmF1bHQgcGxvdCBhcmVhIGNvbG9yIGlzICdzaWx2ZXInLCBpbmRleCAyMy4gU2VlIEw8L0NoYXJ0IG9iamVjdCBjb2xvdXJzPi4KKworPWl0ZW0gKiBDPGxpbmVfY29sb3I+CisKK1NldCB0aGUgY29sb3VyIG9mIHRoZSBwbG90IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IGJvcmRlciBsaW5lIGNvbG91ciBpcyAnZ3JheScsIGluZGV4IDIyLiBTZWUgTDwvQ2hhcnQgb2JqZWN0IGNvbG91cnM+LgorCis9aXRlbSAqIEM8bGluZV9wYXR0ZXJuPgorCitTZXQgdGhlIHBhdHRlcm4gb2YgdGhlIG9mIHRoZSBwbG90IGFyZWEgYm9yZGVyIGxpbmUuIFRoZSBFeGNlbCBkZWZhdWx0IHBhdHRlcm4gaXMgJ3NvbGlkJywgaW5kZXggMS4gU2VlIEw8L0NoYXJ0IGxpbmUgcGF0dGVybnM+LgorCis9aXRlbSAqIEM8bGluZV93ZWlnaHQ+CisKK1NldCB0aGUgd2VpZ2h0IG9mIHRoZSBvZiB0aGUgcGxvdCBhcmVhIGJvcmRlciBsaW5lLiBUaGUgRXhjZWwgZGVmYXVsdCB3ZWlnaHQgaXMgJ25hcnJvdycsIGluZGV4IDIuIFNlZSBMPC9DaGFydCBsaW5lIHdlaWdodHM+LgorCis9YmFjaworCitIZXJlIGlzIGFuIGV4YW1wbGUgb2Ygc2V0dGluZyBzZXZlcmFsIHByb3BlcnRpZXM6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSgKKyAgICAgICAgY29sb3IgICAgICAgID0+ICdyZWQnLAorICAgICAgICBsaW5lX2NvbG9yICAgPT4gJ2JsYWNrJywKKyAgICAgICAgbGluZV9wYXR0ZXJuID0+IDIsCisgICAgICAgIGxpbmVfd2VpZ2h0ICA9PiAzLAorICAgICk7CisKKworCis9aGVhZDEgV09SS1NIRUVUIE1FVEhPRFMKKworSW4gRXhjZWwgYSBjaGFydCBzaGVldCAoaS5lLCBhIGNoYXJ0IHRoYXQgaXNuJ3QgZW1iZWRkZWQpIHNoYXJlcyBwcm9wZXJ0aWVzIHdpdGggZGF0YSB3b3Jrc2hlZXRzIHN1Y2ggYXMgdGFiIHNlbGVjdGlvbiwgaGVhZGVycywgZm9vdGVycywgbWFyZ2lucyBhbmQgcHJpbnQgcHJvcGVydGllcy4KKworSW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgeW91IGNhbiBzZXQgY2hhcnQgc2hlZXQgcHJvcGVydGllcyB1c2luZyB0aGUgc2FtZSBtZXRob2RzIHRoYXQgYXJlIHVzZWQgZm9yIFdvcmtzaGVldCBvYmplY3RzLgorCitUaGUgZm9sbG93aW5nIFdvcmtzaGVldCBtZXRob2RzIGFyZSBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIGEgbm9uLWVtYmVkZGVkIENoYXJ0IG9iamVjdDoKKworICAgIGdldF9uYW1lKCkKKyAgICBhY3RpdmF0ZSgpCisgICAgc2VsZWN0KCkKKyAgICBoaWRlKCkKKyAgICBzZXRfZmlyc3Rfc2hlZXQoKQorICAgIHByb3RlY3QoKQorICAgIHNldF96b29tKCkKKyAgICBzZXRfdGFiX2NvbG9yKCkKKworICAgIHNldF9sYW5kc2NhcGUoKQorICAgIHNldF9wb3J0cmFpdCgpCisgICAgc2V0X3BhcGVyKCkKKyAgICBzZXRfbWFyZ2lucygpCisgICAgc2V0X2hlYWRlcigpCisgICAgc2V0X2Zvb3RlcigpCisKK1NlZSBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPiBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGVzZSBtZXRob2RzLgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBzb21lIG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfYXJlYS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdhcmVhJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9hcmVhMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIENoYXJ0IG9iamVjdCBjb2xvdXJzCisKK01hbnkgb2YgdGhlIGNoYXJ0IG9iamVjdHMgc3VwcG9ydGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2wgYWxsb3cgdGhlIGRlZmF1bHQgY29sb3VycyB0byBiZSBjaGFuZ2VkLiBFeGNlbCBwcm92aWRlcyBhIHBhbGV0dGUgb2YgNTYgY29sb3VycyBhbmQgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdGhlc2UgY29sb3VycyBhcmUgYWNjZXNzZWQgdmlhIHRoZWlyIHBhbGV0dGUgaW5kZXggaW4gdGhlIHJhbmdlIDguLjYzLgorCitUaGUgbW9zdCBjb21tb25seSB1c2VkIGNvbG91cnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IG5hbWUgb3IgaW5kZXguCisKKyAgICBibGFjayAgID0+ICAgOCwgICAgZ3JlZW4gICAgPT4gIDE3LCAgICBuYXZ5ICAgICA9PiAgMTgsCisgICAgd2hpdGUgICA9PiAgIDksICAgIG9yYW5nZSAgID0+ICA1MywgICAgcGluayAgICAgPT4gIDMzLAorICAgIHJlZCAgICAgPT4gIDEwLCAgICBncmF5ICAgICA9PiAgMjMsICAgIHB1cnBsZSAgID0+ICAyMCwKKyAgICBibHVlICAgID0+ICAxMiwgICAgbGltZSAgICAgPT4gIDExLCAgICBzaWx2ZXIgICA9PiAgMjIsCisgICAgeWVsbG93ICA9PiAgMTMsICAgIGN5YW4gICAgID0+ICAxNSwKKyAgICBicm93biAgID0+ICAxNiwgICAgbWFnZW50YSAgPT4gIDE0LAorCitGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGFyZSBlcXVpdmFsZW50LgorCisgICAgJGNoYXJ0LT5zZXRfcGxvdGFyZWEoIGNvbG9yID0+IDEwICAgICk7CisgICAgJGNoYXJ0LT5zZXRfcGxvdGFyZWEoIGNvbG9yID0+ICdyZWQnICk7CisKK1RoZSBjb2xvdXIgcGFsZXR0ZSBpcyBzaG93biBpbiBDPHBhbGV0dGUuaHRtbD4gaW4gdGhlIEM8ZG9jcz4gZGlyZWN0b3J5ICBvZiB0aGUgZGlzdHJvLiBBbiBFeGNlbCB2ZXJzaW9uIG9mIHRoZSBwYWxldHRlIGNhbiBiZSBnZW5lcmF0ZWQgdXNpbmcgQzxjb2xvcnMucGw+IGluIHRoZSBDPGV4YW1wbGVzPiBkaXJlY3RvcnkuCisKK1VzZXIgZGVmaW5lZCBjb2xvdXJzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIEM8c2V0X2N1c3RvbV9jb2xvcigpPiB3b3JrYm9vayBtZXRob2QuIFRoaXMgYW5kIG90aGVyIGFzcGVjdHMgb2YgdXNpbmcgY29sb3VycyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAiQ29sb3VycyBpbiBFeGNlbCIgc2VjdGlvbiBvZiB0aGUgbWFpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uOiBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvZGlzdC9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsL2xpYi9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsLnBtI0NPTE9VUlNfSU5fRVhDRUw+LgorCis9aGVhZDEgQ2hhcnQgbGluZSBwYXR0ZXJucworCitDaGFydCBsaW5lcyBwYXR0ZXJucyBjYW4gYmUgc2V0IHVzaW5nIGVpdGhlciBhbiBpbmRleCBvciBhIG5hbWU6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+IDIgICAgICApOworICAgICRjaGFydC0+c2V0X3Bsb3RhcmVhKCB3ZWlnaHQgPT4gJ2Rhc2gnICk7CisKK0NoYXJ0IGxpbmVzIGhhdmUgOSBwb3NzaWJsZSBwYXR0ZXJucyBhcmUgZm9sbG93czoKKworICAgICdub25lJyAgICAgICAgID0+IDAsCisgICAgJ3NvbGlkJyAgICAgICAgPT4gMSwKKyAgICAnZGFzaCcgICAgICAgICA9PiAyLAorICAgICdkb3QnICAgICAgICAgID0+IDMsCisgICAgJ2Rhc2gtZG90JyAgICAgPT4gNCwKKyAgICAnZGFzaC1kb3QtZG90JyA9PiA1LAorICAgICdtZWRpdW0tZ3JheScgID0+IDYsCisgICAgJ2RhcmstZ3JheScgICAgPT4gNywKKyAgICAnbGlnaHQtZ3JheScgICA9PiA4LAorCitUaGUgcGF0dGVybnMgMS04IGFyZSBzaG93biBpbiBvcmRlciBpbiB0aGUgZHJvcCBkb3duIGRpYWxvZyBib3hlcyBpbiBFeGNlbC4gVGhlIGRlZmF1bHQgcGF0dGVybiBpcyAnc29saWQnLCBpbmRleCAxLgorCisKKz1oZWFkMSBDaGFydCBsaW5lIHdlaWdodHMKKworQ2hhcnQgbGluZXMgd2VpZ2h0cyBjYW4gYmUgc2V0IHVzaW5nIGVpdGhlciBhbiBpbmRleCBvciBhIG5hbWU6CisKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+IDEgICAgICAgICAgKTsKKyAgICAkY2hhcnQtPnNldF9wbG90YXJlYSggd2VpZ2h0ID0+ICdoYWlybGluZScgKTsKKworQ2hhcnQgbGluZXMgaGF2ZSA0IHBvc3NpYmxlIHdlaWdodHMgYXJlIGZvbGxvd3M6CisKKyAgICAnaGFpcmxpbmUnID0+IDEsCisgICAgJ25hcnJvdycgICA9PiAyLAorICAgICdtZWRpdW0nICAgPT4gMywKKyAgICAnd2lkZScgICAgID0+IDQsCisKK1RoZSB3ZWlnaHRzIDEtNCBhcmUgc2hvd24gaW4gb3JkZXIgaW4gdGhlIGRyb3AgZG93biBkaWFsb2cgYm94ZXMgaW4gRXhjZWwuIFRoZSBkZWZhdWx0IHdlaWdodCBpcyAnbmFycm93JywgaW5kZXggMi4KKworCis9aGVhZDEgQ2hhcnQgbmFtZXMgYW5kIGxpbmtzCisKK1RoZSBDPGFkZF9zZXJpZXMoKSk+LCBDPHNldF94X2F4aXMoKT4sIEM8c2V0X3lfYXhpcygpPiBhbmQgQzxzZXRfdGl0bGUoKT4gbWV0aG9kcyBhbGwgc3VwcG9ydCBhIEM8bmFtZT4gcHJvcGVydHkuIEluIGdlbmVyYWwgdGhlc2UgbmFtZXMgY2FuIGJlIGVpdGhlciBhIHN0YXRpYyBzdHJpbmcgb3IgYSBsaW5rIHRvIGEgd29ya3NoZWV0IGNlbGwuIElmIHlvdSBjaG9vc2UgdG8gdXNlIHRoZSBDPG5hbWVfZm9ybXVsYT4gcHJvcGVydHkgdG8gc3BlY2lmeSBhIGxpbmsgdGhlbiB5b3Ugc2hvdWxkIGFsc28gdGhlIEM8bmFtZT4gcHJvcGVydHkuIFRoaXMgaXNuJ3Qgc3RyaWN0bHkgcmVxdWlyZWQgYnkgRXhjZWwgYnV0IHNvbWUgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIGV4cGVjdCBpdCB0byBiZSBwcmVzZW50LgorCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoCisgICAgICAgIG5hbWUgICAgICAgICAgPT4gJ1llYXIgRW5kIFJlc3VsdHMnLAorICAgICAgICBuYW1lX2Zvcm11bGEgID0+ICc9U2hlZXQxISRDJDEnLAorICAgICk7CisKK1RoZXNlIGxpbmtzIHNob3VsZCBiZSB1c2VkIHNwYXJpbmdseSBzaW5jZSB0aGV5IGFyZW4ndCBjb21tb25seSB1c2VkIGluIEV4Y2VsIGNoYXJ0cy4KKworCis9aGVhZDEgQ2hhcnQgbmFtZXMgYW5kIFVuaWNvZGUKKworVGhlIEM8YWRkX3NlcmllcygpKT4sIEM8c2V0X3hfYXhpcygpPiwgQzxzZXRfeV9heGlzKCk+IGFuZCBDPHNldF90aXRsZSgpPiBtZXRob2RzIGFsbCBzdXBwb3J0IGEgQzxuYW1lPiBwcm9wZXJ0eS4gVGhlc2UgbmFtZXMgY2FuIGJlIFVURjggc3RyaW5ncyBpZiB5b3UgYXJlIHVzaW5nIHBlcmwgNS44Ky4KKworCisgICAgIyBwZXJsIDUuOCsgZXhhbXBsZToKKyAgICBteSAkc21pbGV5ID0gIlx4ezI2M0F9IjsKKworICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICJCZXN0LiBSZXN1bHRzLiBFdmVyISAkc21pbGV5IiApOworCitGb3Igb2xkZXIgcGVybHMgeW91IHdyaXRlIFVuaWNvZGUgc3RyaW5ncyBhcyBVVEYtMTZCRSBieSBhZGRpbmcgYSBDPG5hbWVfZW5jb2Rpbmc+IHByb3BlcnR5OgorCisgICAgIyBwZXJsIDUuMDA1IGV4YW1wbGU6CisgICAgbXkgJHV0ZjE2YmVfbmFtZSA9IHBhY2sgJ24nLCAweDI2M0E7CisKKyAgICAkY2hhcnQtPnNldF90aXRsZSgKKyAgICAgICAgbmFtZSAgICAgICAgICA9PiAkdXRmMTZiZV9uYW1lLAorICAgICAgICBuYW1lX2VuY29kaW5nID0+IDEsCisgICAgKTsKKworVGhpcyBtZXRob2RvbG9neSBpcyBleHBsYWluZWQgaW4gdGhlICJVTklDT0RFIElOIEVYQ0VMIiBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+IGJ1dCBpcyBzZW1pLWRlcHJlY2F0ZWQuIElmIHlvdSBhcmUgdXNpbmcgVW5pY29kZSB0aGUgZWFzaWVzdCBvcHRpb24gaXMgdG8ganVzdCB1c2UgVVRGOCBpbiBwZXJsIDUuOCsuCisKKworPWhlYWQxIFdvcmtpbmcgd2l0aCBDZWxsIFJhbmdlcworCisKK0luIHRoZSBzZWN0aW9uIG9uIEM8YWRkX3NlcmllcygpPiBpdCB3YXMgbm90ZWQgdGhhdCB0aGUgc2VyaWVzIG11c3QgYmUgZGVmaW5lZCB1c2luZyBhIHJhbmdlIGZvcm11bGE6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJyApOworCitUaGUgd29ya3NoZWV0IG5hbWUgbXVzdCBiZSBzcGVjaWZpZWQgKGV2ZW4gZm9yIGVtYmVkZGVkIGNoYXJ0cykgYW5kIHRoZSBjZWxsIHJlZmVyZW5jZXMgbXVzdCBiZSAiYWJzb2x1dGUiIHJlZmVyZW5jZXMsIGkuZS4sIHRoZXkgbXVzdCBjb250YWluIEM8JD4gc2lnbnMuIFRoaXMgaXMgdGhlIGZvcm1hdCB0aGF0IGlzIHJlcXVpcmVkIGJ5IEV4Y2VsIGZvciBjaGFydCByZWZlcmVuY2VzLgorCitTaW5jZSBpdCBpc24ndCB2ZXJ5IGNvbnZlbmllbnQgdG8gd29yayB3aXRoIHRoaXMgdHlwZSBvZiBzdHJpbmcgcHJvZ3JhbW1hdGljYWxseSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLCB3aGljaCBpcyBpbmNsdWRlZCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLCBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGxlZCBDPHhsX3JhbmdlX2Zvcm11bGEoKT4gdG8gY29udmVydCBmcm9tIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2VzIHRvIGFuIEExIHN0eWxlIGZvcm11bGEgc3RyaW5nLgorCitUaGUgc3ludGF4IGlzOgorCisgICAgeGxfcmFuZ2VfZm9ybXVsYSgkc2hlZXRuYW1lLCAkcm93XzEsICRyb3dfMiwgJGNvbF8xLCAkY29sXzIpCisKK0lmIHlvdSBpbmNsdWRlIGl0IGluIHlvdXIgcHJvZ3JhbSwgdXNpbmcgdGhlIHN0YW5kYXJkIGltcG9ydCBzeW50YXgsIHlvdSBjYW4gdXNlIHRoZSBmdW5jdGlvbiBhcyBmb2xsb3dzOgorCisKKyAgICAjIEluY2x1ZGUgdGhlIFV0aWxpdHkgbW9kdWxlIG9yIGp1c3QgdGhlIGZ1bmN0aW9uIHlvdSBuZWVkLgorICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eSBxdyggeGxfcmFuZ2VfZm9ybXVsYSApOworICAgIC4uLgorCisgICAgIyBUaGVuIHVzZSBpdCBhcyByZXF1aXJlZC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4geGxfcmFuZ2VfZm9ybXVsYSggJ1NoZWV0MScsIDEsIDksIDAsIDAgKSwKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCAnU2hlZXQxJywgMSwgOSwgMSwgMSApOywKKyAgICApOworCisgICAgIyBXaGljaCBpcyB0aGUgc2FtZSBhczoKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgKTsKKworU2VlIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHk+IGZvciBtb3JlIGRldGFpbHMuCisKKworPWhlYWQxIFRPRE8KKworQ2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFyZSBhIHdvcmsgaW4gcHJvZ3Jlc3MuIE1vcmUgY2hhcnQgdHlwZXMgYW5kIGZlYXR1cmVzIHdpbGwgYmUgYWRkZWQgaW4gdGltZS4gUGxlYXNlIGJlIHBhdGllbnQuIEV2ZW4gYSBzbWFsbCBmZWF0dXJlIGNhbiB0YWtlIGEgd2VlayBvciBtb3JlIHRvIGltcGxlbWVudCwgdGVzdCBhbmQgZG9jdW1lbnQuCisKK0ZlYXR1cmVzIHRoYXQgYXJlIG9uIHRoZSBUT0RPIGxpc3QgYW5kIHdpbGwgYmUgYWRkZWQgYXJlOgorCis9b3ZlcgorCis9aXRlbSAqICBDaGFydCBzdWItdHlwZXMuCisKKz1pdGVtICogQ29sb3VycyBhbmQgZm9ybWF0dGluZyBvcHRpb25zLiBGb3Igbm93IHlvdSB3aWxsIGhhdmUgdG8gbWFrZSBkbyB3aXRoIHRoZSBkZWZhdWx0IEV4Y2VsIGNvbG91cnMgYW5kIGZvcm1hdHMuCisKKz1pdGVtICogQXhpcyBjb250cm9scywgZ3JpZGxpbmVzLgorCis9aXRlbSAqIDNEIGNoYXJ0cy4KKworPWl0ZW0gKiBFbWJlZGRlZCBkYXRhIGluIGNoYXJ0cyBmb3IgdGhpcmQgcGFydHkgYXBwbGljYXRpb24gc3VwcG9ydC4gU2VlIEtub3duIElzc3Vlcy4KKworPWl0ZW0gKiBBZGRpdGlvbmFsIGNoYXJ0IHR5cGVzIHN1Y2ggYXMgQnViYmxlIGFuZCBSYWRhci4gU2VuZCBhbiBlbWFpbCBpZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gb3RoZXIgdHlwZXMgYW5kIHRoZXkgd2lsbCBiZSBhZGRlZCB0byB0aGUgcXVldWUuCisKKz1iYWNrCisKK0lmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBzcG9uc29yaW5nIGEgZmVhdHVyZSBsZXQgbWUga25vdy4KKworPWhlYWQxIEtOT1dOIElTU1VFUworCis9b3ZlcgorCis9aXRlbSAqIEN1cnJlbnRseSBjaGFydHMgZG9uJ3QgY29udGFpbiBlbWJlZGRlZCBkYXRhIGZyb20gd2hpY2ggdGhlIGNoYXJ0cyBjYW4gYmUgcmVuZGVyZWQuIEV4Y2VsIGFuZCBtb3N0IG90aGVyIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9ucyBpZ25vcmUgdGhpcyBhbmQgcmVhZCB0aGUgZGF0YSB2aWEgdGhlIGxpbmtzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZC4gSG93ZXZlciwgc29tZSBhcHBsaWNhdGlvbnMgbWF5IGNvbXBsYWluIG9yIG5vdCByZW5kZXIgY2hhcnRzIGNvcnJlY3RseS4gVGhlIHByZXZpZXcgb3B0aW9uIGluIE1hYyBPUyBYIGlzIGFuIGtub3duIGV4YW1wbGUuIFRoaXMgd2lsbCBiZSBmaXhlZCBpbiBhIGxhdGVyIHJlbGVhc2UuCisKKz1pdGVtICogV2hlbiB0aGVyZSBhcmUgc2V2ZXJhbCBjaGFydHMgd2l0aCB0aXRsZXMgc2V0IGluIGEgd29ya2Jvb2sgc29tZSBvZiB0aGUgdGl0bGVzIG1heSBkaXNwbGF5IGF0IGEgZm9udCBzaXplIG9mIDEwIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMTIgdW50aWwgYW5vdGhlciBjaGFydCB3aXRoIHRoZSB0aXRsZSBzZXQgaXMgdmlld2VkLgorCis9aXRlbSAqIFN0b2NrIChhbmQgb3RoZXIpIGNoYXJ0cyBzaG91bGQgaGF2ZSB0aGUgWC1heGlzIGRhdGVzIGFsaWduZWQgYXQgYW4gYW5nbGUgZm9yIGNsYXJpdHkuIFRoaXMgd2lsbCBiZSBmaXhlZCBhdCBhIGxhdGVyIHN0YWdlLgorCis9YmFjaworCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQXJlYS5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQXJlYS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDI1Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9BcmVhLnBtCkBAIC0wLDAgKzEsMTk0IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QXJlYTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBBcmVhIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIEFyZWEgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgQVJFQSBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGFyZWEgY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxQTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDAyOyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGdyYml0ICA9IDB4MDAwMTsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0FyZWEgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQXJlYSBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgQXJlYSBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIEFyZWEgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIEFyZWEgQ2hhcnQgTWV0aG9kcworCitUaGVyZSBhcmVuJ3QgY3VycmVudGx5IGFueSBhcmVhIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2FyZWEueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBmaXJzdCBzZXJpZXMuIChTYW1wbGUgMSkKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAxJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZWNvbmQgc2VyaWVzLiAoU2FtcGxlIDIpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMicsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlICggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdUZXN0IG51bWJlcicgKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSB3b3Jrc2hlZXQgKHdpdGggYW4gb2Zmc2V0KS4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdEMicsICRjaGFydCwgMjUsIDEwICk7CisKKyAgICBfX0VORF9fCisKKworPWJlZ2luIGh0bWwKKworPHA+VGhpcyB3aWxsIHByb2R1Y2UgYSBjaGFydCB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvYXJlYTEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQmFyLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9CYXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwZDliNwotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQmFyLnBtCkBAIC0wLDAgKzEsMjI4IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6QmFyOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEJhciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBCYXIgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisKKyAgICAjIFRoZSBheGlzIHBvc2l0aW9ucyBhcmUgcmV2ZXJzZWQgZm9yIGEgYmFyIGNoYXJ0IHNvIHdlIGNoYW5nZSB0aGUgY29uZmlnLgorICAgIG15ICRjID0gJHNlbGYtPntfY29uZmlnfTsKKyAgICAkYy0+e194X2F4aXNfdGV4dH0gICAgID0gWyAweDJELCAgIDB4NkQ5LCAgMHg1RiwgICAweDFDQywgMHgyODEsICAweDAsIDkwIF07CisgICAgJGMtPntfeF9heGlzX3RleHRfcG9zfSA9IFsgMiwgICAgICAyLCAgICAgIDAsICAgICAgMCwgICAgIDB4MTcsICAgMHgyQSBdOworICAgICRjLT57X3lfYXhpc190ZXh0fSAgICAgPSBbIDB4MDc4QSwgMHgwREZDLCAweDAxMUQsIDB4OUMsICAweDAwODEsIDB4MDAwMCBdOworICAgICRjLT57X3lfYXhpc190ZXh0X3Bvc30gPSBbIDIsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAweDQ1LCAgIDB4MTcgXTsKKworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIEJBUiBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGJhciBvciBjb2x1bW4gY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBjT3ZlcmxhcCA9IDB4MDAwMDsgICAgIyBTcGFjZSBiZXR3ZWVuIGJhcnMuCisgICAgbXkgJHBjR2FwICAgICA9IDB4MDA5NjsgICAgIyBTcGFjZSBiZXR3ZWVuIGNhdHMuCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAwMTsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY092ZXJsYXA7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY0dhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpCisjCisjIE92ZXJyaWRlIHNvbWUgb2YgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBkYXRhIGZvciBhbiBlbWJlZGRlZCBjaGFydC4KKyMKK3N1YiBfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFNldCB0aGUgcGFyZW50IGNvbmZpZ3VyYXRpb24gZmlyc3QuCisgICAgJHNlbGYtPlNVUEVSOjpfc2V0X2VtYmVkZGVkX2NvbmZpZ19kYXRhKCk7CisKKyAgICAjIFRoZSBheGlzIHBvc2l0aW9ucyBhcmUgcmV2ZXJzZWQgZm9yIGEgYmFyIGNoYXJ0IHNvIHdlIGNoYW5nZSB0aGUgY29uZmlnLgorICAgIG15ICRjID0gJHNlbGYtPntfY29uZmlnfTsKKyAgICAkYy0+e194X2F4aXNfdGV4dH0gICAgID0gWyAweDU3LCAgIDB4NUJDLCAgMHhCNSwgICAweDIxNCwgMHgyODEsIDB4MCwgOTAgXTsKKyAgICAkYy0+e194X2F4aXNfdGV4dF9wb3N9ID0gWyAyLCAgICAgIDIsICAgICAgMCwgICAgICAwLCAgICAgMHgxNywgIDB4MkEgXTsKKyAgICAkYy0+e195X2F4aXNfdGV4dH0gICAgID0gWyAweDA3NEEsIDB4MEM4RiwgMHgwMjFGLCAweDEyMywgMHg4MSwgIDB4MDAwMCBdOworICAgICRjLT57X3lfYXhpc190ZXh0X3Bvc30gPSBbIDIsICAgICAgMiwgICAgICAwLCAgICAgIDAsICAgICAweDQ1LCAgMHgxNyBdOworCit9CisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK0JhciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBCYXIgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIEJhciBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgQmFyIGNoYXJ0cyBmb3IgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIEJhciBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IGJhciBjaGFydCBzcGVjaWZpYyBtZXRob2RzLiBTZWUgdGhlIFRPRE8gc2VjdGlvbiBvZiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9iYXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYmFyJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9iYXIxLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0NvbHVtbi5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvQ29sdW1uLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDA0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0NvbHVtbi5wbQpAQCAtMCwwICsxLDE5OSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OkNvbHVtbjsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBDb2x1bW4gLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgQ29sdW1uIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIEJBUiBjaGFydCBCSUZGIHJlY29yZC4gRGVmaW5lcyBhIGJhciBvciBjb2x1bW4gY2hhcnQgdHlwZS4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICA9IDB4MTAxNzsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJHBjT3ZlcmxhcCA9IDB4MDAwMDsgICAgIyBTcGFjZSBiZXR3ZWVuIGJhcnMuCisgICAgbXkgJHBjR2FwICAgICA9IDB4MDA5NjsgICAgIyBTcGFjZSBiZXR3ZWVuIGNhdHMuCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY092ZXJsYXA7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRwY0dhcDsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworQ29sdW1uIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIENvbHVtbiBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgQ29sdW1uIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworCisgICAgIyBDb25maWd1cmUgdGhlIGNoYXJ0LgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGUgY2hhcnQgcmVmZXJzIHRvLgorICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdDYXRlZ29yeScsIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAnVmFsdWUnLCAgICAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkZGF0YSApOworCisgICAgX19FTkRfXworCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBDb2x1bW4gY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgQ29sdW1uIENoYXJ0IE1ldGhvZHMKKworVGhlcmUgYXJlbid0IGN1cnJlbnRseSBhbnkgY29sdW1uIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2NvbHVtbi54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdjb2x1bW4nLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgZmlyc3Qgc2VyaWVzLiAoU2FtcGxlIDEpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2Vjb25kIHNlcmllcy4gKFNhbXBsZSAyKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDInLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICApOworCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgc29tZSBheGlzIGxhYmVscy4KKyAgICAkY2hhcnQtPnNldF90aXRsZSAoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnVGVzdCBudW1iZXInICk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgd29ya3NoZWV0ICh3aXRoIGFuIG9mZnNldCkuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRDInLCAkY2hhcnQsIDI1LCAxMCApOworCisgICAgX19FTkRfXworCisKKz1iZWdpbiBodG1sCisKKzxwPlRoaXMgd2lsbCBwcm9kdWNlIGEgY2hhcnQgdGhhdCBsb29rcyBsaWtlIHRoaXM6PC9wPgorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NvbHVtbjEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvRXh0ZXJuYWwucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0V4dGVybmFsLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDBiODUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0V4dGVybmFsLnBtCkBAIC0wLDAgKzEsMTE5IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6RXh0ZXJuYWw7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRXh0ZXJuYWwgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgZXh0ZXJuYWwgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgcGVybHRpZHkgd2l0aCBvcHRpb25zOiAtbWJsPTIgLXB0PTAgLW5vbGEKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXh0ZXJuYWxfZmlsZW5hbWUgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgICAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgICRzZWxmLT57X2ZpbGVuYW1lfSAgICAgPSAkZXh0ZXJuYWxfZmlsZW5hbWU7CisgICAgJHNlbGYtPntfZXh0ZXJuYWxfYmlufSA9IDE7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgICRzZWxmLT5faW5pdGlhbGl6ZSgpOyAgICAjIFJlcXVpcmVzIG92ZXJyaWRkZW4gaW5pdGlhbGl6ZSgpLgorICAgIHJldHVybiAkc2VsZjsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW5pdGlhbGl6ZSgpCisjCisjIFJlYWQgYWxsIHRoZSBkYXRhIGludG8gbWVtb3J5IGZvciB0aGUgZXh0ZXJuYWwgYmluYXJ5IHN0eWxlIGNoYXJ0LgorIworIworc3ViIF9pbml0aWFsaXplIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkZmlsZW5hbWUgICA9ICRzZWxmLT57X2ZpbGVuYW1lfTsKKyAgICBteSAkZmlsZWhhbmRsZSA9IEZpbGVIYW5kbGUtPm5ldyggJGZpbGVuYW1lICkKKyAgICAgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZW5hbWUgaW4gYWRkX2NoYXJ0X2V4dCgpOiAkIS5cbiI7CisKKyAgICBiaW5tb2RlKCAkZmlsZWhhbmRsZSApOworCisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gICAgPSAkZmlsZWhhbmRsZTsKKyAgICAkc2VsZi0+e19kYXRhc2l6ZX0gICAgICA9IC1zICRmaWxlaGFuZGxlOworICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ID0gMDsKKworICAgICMgUmVhZCB0aGUgZW50aXJlIGV4dGVybmFsIGNoYXJ0IGJpbmFyeSBpbnRvIHRoZSB0aGUgZGF0YSBidWZmZXIuCisgICAgIyBUaGlzIHdpbGwgYmUgcmV0cmlldmVkIGJ5IF9nZXRfZGF0YSgpIHdoZW4gdGhlIGNoYXJ0IGlzIGNsb3NlZCgpLgorICAgIHJlYWQoICRzZWxmLT57X2ZpbGVoYW5kbGV9LCAkc2VsZi0+e19kYXRhfSwgJHNlbGYtPntfZGF0YXNpemV9ICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKQorIworIyBXZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBvciBzdG9yZSBDaGFydCBkYXRhIHN0cnVjdHVyZXMgd2hlbiB1c2luZyBhbgorIyBleHRlcm5hbCBiaW5hcnksIHNvIHdlIGhhdmUgYSBkZWZhdWx0IGNsb3NlIG1ldGhvZC4KKyMKK3N1YiBfY2xvc2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmRlZjsKK30KKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworRXh0ZXJuYWwgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgZXh0ZXJuYWwgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVGhpcyBtb2R1bGUgaXMgdXNlZCB0byBpbmNsdWRlIGV4dGVybmFsIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgdG8gaW5jbHVkZSBleHRlcm5hbCBjaGFydHMgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIEl0IGlzIGFuIGludGVybmFsIG1vZHVsZSBhbmQgaXNuJ3QgdXNlZCBkaXJlY3RseSBieSB0aGUgZW5kIHVzZXIuCisKK0l0IGlzIHNlbWktZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdXNpbmcgIm5hdGl2ZSIgY2hhcnRzLiBTZWUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCitGb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZWQgZXh0ZXJuYWwgY2hhcnRzIHNlZSB0aGUgQzxleHRlcm5hbF9jaGFydHMudHh0PiAgKG9yIEM8LnBvZD4pIGluIHRoZSBDPGV4dGVybmFsX2NoYXJ0cz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9MaW5lLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9MaW5lLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMzIwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L0xpbmUucG0KQEAgLTAsMCArMSwxOTQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpMaW5lOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIExpbmUgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgTGluZSBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY2hhcnRfdHlwZSgpCisjCisjIEltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBtZXRob2QgZnJvbSB0aGUgc3BlY2lmaWMgY2hhcnQgY2xhc3MuCisjCisjIFdyaXRlIHRoZSBMSU5FIGNoYXJ0IEJJRkYgcmVjb3JkLiBEZWZpbmVzIGEgbGluZSBjaGFydCB0eXBlLgorIworc3ViIF9zdG9yZV9jaGFydF90eXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkID0gMHgxMDE4OyAgICAjIFJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRsZW5ndGggPSAweDAwMDI7ICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdy4KKyAgICBteSAkZ3JiaXQgID0gMHgwMDAwOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworTGluZSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBMaW5lIGNoYXJ0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1RvIGNyZWF0ZSBhIHNpbXBsZSBFeGNlbCBmaWxlIHdpdGggYSBMaW5lIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgTGluZSBjaGFydHMgZm9yIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+LiBUaGUgY2hhcnQgb2JqZWN0IGlzIGNyZWF0ZWQgdmlhIHRoZSBXb3JrYm9vayBDPGFkZF9jaGFydCgpPiBtZXRob2Q6CisKKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKworT25jZSB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyB0aGF0IGFyZSBjb21tb24gdG8gYWxsIGNoYXJ0IGNsYXNzZXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoKTsKKyAgICAkY2hhcnQtPnNldF90aXRsZSgpOworCitUaGVzZSBtZXRob2RzIGFyZSBleHBsYWluZWQgaW4gZGV0YWlsIGluIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4gQ2xhc3Mgc3BlY2lmaWMgbWV0aG9kcyBvciBzZXR0aW5ncywgaWYgYW55LCBhcmUgZXhwbGFpbmVkIGJlbG93LgorCis9aGVhZDEgTGluZSBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IGxpbmUgY2hhcnQgc3BlY2lmaWMgbWV0aG9kcy4gU2VlIHRoZSBUT0RPIHNlY3Rpb24gb2YgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfbGluZS54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ051bWJlcicsICdTYW1wbGUgMScsICdTYW1wbGUgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKworICAgICMgQ3JlYXRlIGEgbmV3IGNoYXJ0IG9iamVjdC4gSW4gdGhpcyBjYXNlIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdsaW5lJywgZW1iZWRkZWQgPT4gMSApOworCisgICAgIyBDb25maWd1cmUgdGhlIGZpcnN0IHNlcmllcy4gKFNhbXBsZSAxKQorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgbmFtZSAgICAgICA9PiAnU2FtcGxlIDEnLAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBDb25maWd1cmUgdGhlIHNlY29uZCBzZXJpZXMuIChTYW1wbGUgMikKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAyJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgKTsKKworICAgICMgQWRkIGEgY2hhcnQgdGl0bGUgYW5kIHNvbWUgYXhpcyBsYWJlbHMuCisgICAgJGNoYXJ0LT5zZXRfdGl0bGUgKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1Rlc3QgbnVtYmVyJyApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9saW5lMS5qcGciIHdpZHRoPSI1MjciIGhlaWdodD0iMzIwIiBhbHQ9IkNoYXJ0IGV4YW1wbGUuIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKwpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9QaWUucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1BpZS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI3ZTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9DaGFydC9QaWUucG0KQEAgLTAsMCArMSwyMTcgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OjpQaWU7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgUGllIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFBpZSBjaGFydHMuCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIFNlZSBmb3JtYXR0aW5nIG5vdGUgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3JlcXVpcmUgRXhwb3J0ZXI7CisKK3VzZSBzdHJpY3Q7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0OworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydCBFeHBvcnRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyA9IHNoaWZ0OworICAgIG15ICRzZWxmICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC0+bmV3KCBAXyApOworCisgICAgJHNlbGYtPntfdmFyeV9kYXRhX2NvbG9yfSA9IDE7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIFBpZSBjaGFydCBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfY2hhcnRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCA9IDB4MTAxOTsgICAgIyBSZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkbGVuZ3RoID0gMHgwMDA2OyAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cuCisgICAgbXkgJGFuZ2xlICA9IDB4MDAwMDsgICAgIyBBbmdsZS4KKyAgICBteSAkZG9udXQgID0gMHgwMDAwOyAgICAjIERvbnV0IGhvbGUgc2l6ZS4KKyAgICBteSAkZ3JiaXQgID0gMHgwMDAyOyAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIG15ICRoZWFkZXIgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgPSAnJzsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGFuZ2xlOworICAgICRkYXRhIC49IHBhY2sgJ3YnLCAkZG9udXQ7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRncmJpdDsKKworICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLCAkZGF0YSApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F4aXNwYXJlbnRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFdyaXRlIHRoZSBBWElTUEFSRU5UIGNoYXJ0IHN1YnN0cmVhbS4KKyMKKyMgQSBQaWUgY2hhcnQgaGFzIG5vIFggb3IgWSBheGlzIHNvIHdlIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHJlbW92ZSB0aGVtLgorIworc3ViIF9zdG9yZV9heGlzcGFyZW50X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9heGlzcGFyZW50KCBAeyAkc2VsZi0+e19jb25maWd9LT57X2F4aXNwYXJlbnR9IH0gKTsKKworICAgICRzZWxmLT5fc3RvcmVfYmVnaW4oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BvcyggQHsgJHNlbGYtPntfY29uZmlnfS0+e19heGlzcGFyZW50X3Bvc30gfSApOworCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGZvcm1hdF9zdHJlYW0oKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1BpZSAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBQaWUgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIFBpZSBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBjaGFydC4KKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhlIGNoYXJ0IHJlZmVycyB0by4KKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAnQ2F0ZWdvcnknLCAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgJ1ZhbHVlJywgICAgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGRhdGEgKTsKKworICAgIF9fRU5EX18KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgUGllIGNoYXJ0cyBmb3IgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4uIFRoZSBjaGFydCBvYmplY3QgaXMgY3JlYXRlZCB2aWEgdGhlIFdvcmtib29rIEM8YWRkX2NoYXJ0KCk+IG1ldGhvZDoKKworICAgIG15ICRjaGFydCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdwaWUnICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIFBpZSBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IHBpZSBjaGFydCBzcGVjaWZpYyBtZXRob2RzLiBTZWUgdGhlIFRPRE8gc2VjdGlvbiBvZiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uCisKK0EgUGllIGNoYXJ0IGRvZXNuJ3QgaGF2ZSBhbiBYIG9yIFkgYXhpcyBzbyB0aGUgZm9sbG93aW5nIGNvbW1vbiBjaGFydCBtZXRob2RzIGFyZSBpZ25vcmVkLgorCisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisKKz1oZWFkMSBFWEFNUExFCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIG1vc3Qgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcyB3aGVuIGNyZWF0aW5nIGEgY2hhcnQuCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9waWUueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMnIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0FwcGxlJywgJ0NoZXJyeScsICdQZWNhbicgXSwKKyAgICAgICAgWyA2MCwgICAgICAgMzAsICAgICAgIDEwICAgICBdLAorICAgIF07CisKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworCisgICAgIyBDcmVhdGUgYSBuZXcgY2hhcnQgb2JqZWN0LiBJbiB0aGlzIGNhc2UgYW4gZW1iZWRkZWQgY2hhcnQuCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICk7CisKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdQb3B1bGFyIFBpZSBUeXBlcycgKTsKKworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0MyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9waWUxLmpwZyIgd2lkdGg9IjUyNyIgaGVpZ2h0PSIzMjAiIGFsdD0iQ2hhcnQgZXhhbXBsZS4iIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworQ29weXJpZ2h0IE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1NjYXR0ZXIucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1NjYXR0ZXIucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyMDVkZQotLS0gL2Rldi9udWxsCisrKyBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU2NhdHRlci5wbQpAQCAtMCwwICsxLDI0NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ6OlNjYXR0ZXI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU2NhdHRlciAtIEEgd3JpdGVyIGNsYXNzIGZvciBFeGNlbCBTY2F0dGVyIGNoYXJ0cy4KKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgU2VlIGZvcm1hdHRpbmcgbm90ZSBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQuCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKworcmVxdWlyZSBFeHBvcnRlcjsKKwordXNlIHN0cmljdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7CisKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0IEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LT5uZXcoIEBfICk7CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9jaGFydF90eXBlKCkKKyMKKyMgSW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IG1ldGhvZCBmcm9tIHRoZSBzcGVjaWZpYyBjaGFydCBjbGFzcy4KKyMKKyMgV3JpdGUgdGhlIFNDQVRURVIgY2hhcnQgQklGRiByZWNvcmQuIERlZmluZXMgYSBzY2F0dGVyIGNoYXJ0IHR5cGUuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDEwMUI7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCAgICAgICA9IDB4MDAwNjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRidWJibGVfcmF0aW8gPSAweDAwNjQ7ICAgICMgQnViYmxlIHJhdGlvLgorICAgIG15ICRidWJibGVfdHlwZSAgPSAweDAwMDE7ICAgICMgQnViYmxlIHR5cGUuCisgICAgbXkgJGdyYml0ICAgICAgICA9IDB4MDAwMDsgICAgIyBPcHRpb24gZmxhZ3MuCisKKyAgICBteSAkaGVhZGVyID0gcGFjayAndnYnLCAkcmVjb3JkLCAkbGVuZ3RoOworICAgIG15ICRkYXRhID0gJyc7CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfcmF0aW87CisgICAgJGRhdGEgLj0gcGFjayAndicsICRidWJibGVfdHlwZTsKKyAgICAkZGF0YSAuPSBwYWNrICd2JywgJGdyYml0OworCisgICAgJHNlbGYtPl9hcHBlbmQoICRoZWFkZXIsICRkYXRhICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0oKS4gT3ZlcnJpZGRlbi4KKyMKKyMgV3JpdGUgdGhlIEFYSVMgY2hhcnQgc3Vic3RyZWFtIGZvciB0aGUgY2hhcnQgY2F0ZWdvcnkuCisjCisjIEZvciBhIFNjYXR0ZXIgY2hhcnQgdGhlIGNhdGVnb3J5IHN0cmVhbSBpcyByZXBsYWNlIHdpdGggYSB2YWx1ZXMgc3RyZWFtLiBXZQorIyBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgdHVybiBpdCBpbnRvIGEgdmFsdWVzIHN0cmVhbS4KKyMKK3N1YiBfc3RvcmVfYXhpc19jYXRlZ29yeV9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfYXhpcyggMCApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfdmFsdWVyYW5nZSgpOworICAgICRzZWxmLT5fc3RvcmVfdGljaygpOworICAgICRzZWxmLT5fc3RvcmVfZW5kKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmVudCBhYnN0cmFjdCBtZXRob2QgIHRvIGRlZmluZQorIyBwcm9wZXJ0aWVzIG9mIG1hcmtlcnMsIGxpbmV0eXBlcywgcGllIGZvcm1hdHMgYW5kIG90aGVyLgorIworc3ViIF9zdG9yZV9tYXJrZXJfZGF0YWZvcm1hdF9zdHJlYW0geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5fc3RvcmVfZGF0YWZvcm1hdCggMHgwMDAwLCAweEZGRkQsIDB4MDAwMCApOworCisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfM2RiYXJzaGFwZSgpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDA1LCAweEZGRkYsIDB4MDAwOCwgMHgwMDREICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwRkZGRkZGLCAweDAwMDAsIDB4MDEsIDB4MDEsIDB4NEUsIDB4NEQgKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BpZWZvcm1hdCgpOworICAgICRzZWxmLT5fc3RvcmVfbWFya2VyZm9ybWF0KCAweDAwLCAweDAwLCAweDAyLCAweDAxLCAweDRELCAweDRELCAweDNDICk7CisgICAgJHNlbGYtPl9zdG9yZV9lbmQoKTsKKworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1NjYXR0ZXIgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU2NhdHRlciBjaGFydHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitUbyBjcmVhdGUgYSBzaW1wbGUgRXhjZWwgZmlsZSB3aXRoIGEgU2NhdHRlciBjaGFydCB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDoKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0LnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisKKyAgICBteSAkY2hhcnQgICAgID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisKKyAgICAjIENvbmZpZ3VyZSB0aGUgY2hhcnQuCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgJ0NhdGVnb3J5JywgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbICdWYWx1ZScsICAgIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICBdOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRkYXRhICk7CisKKyAgICBfX0VORF9fCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIFNjYXR0ZXIgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisKK09uY2UgdGhlIG9iamVjdCBpcyBjcmVhdGVkIGl0IGNhbiBiZSBjb25maWd1cmVkIHZpYSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBjaGFydCBjbGFzc2VzOgorCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKCk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfeV9heGlzKCk7CisgICAgJGNoYXJ0LT5zZXRfdGl0bGUoKTsKKworVGhlc2UgbWV0aG9kcyBhcmUgZXhwbGFpbmVkIGluIGRldGFpbCBpbiBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydD4uIENsYXNzIHNwZWNpZmljIG1ldGhvZHMgb3Igc2V0dGluZ3MsIGlmIGFueSwgYXJlIGV4cGxhaW5lZCBiZWxvdy4KKworPWhlYWQxIFNjYXR0ZXIgQ2hhcnQgTWV0aG9kcworCitUaGVyZSBhcmVuJ3QgY3VycmVudGx5IGFueSBzY2F0dGVyIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworPWhlYWQxIEVYQU1QTEUKKworSGVyZSBpcyBhIGNvbXBsZXRlIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgbW9zdCBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzIHdoZW4gY3JlYXRpbmcgYSBjaGFydC4KKworICAgICMhL3Vzci9iaW4vcGVybCAtdworCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3NjYXR0ZXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKworICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdOdW1iZXInLCAnU2FtcGxlIDEnLCAnU2FtcGxlIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc2NhdHRlcicsIGVtYmVkZGVkID0+IDEgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBmaXJzdCBzZXJpZXMuIChTYW1wbGUgMSkKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1NhbXBsZSAxJywKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgKTsKKworICAgICMgQ29uZmlndXJlIHRoZSBzZWNvbmQgc2VyaWVzLiAoU2FtcGxlIDIpCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBuYW1lICAgICAgID0+ICdTYW1wbGUgMicsCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDcnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlICggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0LT5zZXRfeF9heGlzKCBuYW1lID0+ICdUZXN0IG51bWJlcicgKTsKKyAgICAkY2hhcnQtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKworICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSB3b3Jrc2hlZXQgKHdpdGggYW4gb2Zmc2V0KS4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdEMicsICRjaGFydCwgMjUsIDEwICk7CisKKyAgICBfX0VORF9fCisKKworPWJlZ2luIGh0bWwKKworPHA+VGhpcyB3aWxsIHByb2R1Y2UgYSBjaGFydCB0aGF0IGxvb2tzIGxpa2UgdGhpczo8L3A+CisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc2NhdHRlcjEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvQ2hhcnQvU3RvY2sucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1N0b2NrLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNTI5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0NoYXJ0L1N0b2NrLnBtCkBAIC0wLDAgKzEsMjU3IEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDo6U3RvY2s7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU3RvY2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU3RvY2sgY2hhcnRzLgorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0LgorIworIyBTZWUgZm9ybWF0dGluZyBub3RlIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydC4KKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCityZXF1aXJlIEV4cG9ydGVyOworCit1c2Ugc3RyaWN0OwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpDaGFydDsKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPm5ldyggQF8gKTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X3R5cGUoKQorIworIyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgbWV0aG9kIGZyb20gdGhlIHNwZWNpZmljIGNoYXJ0IGNsYXNzLgorIworIyBXcml0ZSB0aGUgTElORSBjaGFydCBCSUZGIHJlY29yZC4gQSBzdG9jayBjaGFydCB1c2VzIHRoZSBzYW1lIExJTkUgcmVjb3JkCisjIGFzIGEgbGluZSBjaGFydCBidXQgd2l0aCBhZGRpdGlvbmFsIERST1BCQVIgYW5kIENIQVJUTElORSByZWNvcmRzIHRvIGRlZmluZQorIyB0aGUgc3RvY2sgc3R5bGUuCisjCitzdWIgX3N0b3JlX2NoYXJ0X3R5cGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgPSAweDEwMTg7ICAgICMgUmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJGxlbmd0aCA9IDB4MDAwMjsgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93LgorICAgIG15ICRncmJpdCAgPSAweDAwMDA7ICAgICMgT3B0aW9uIGZsYWdzLgorCisgICAgbXkgJGhlYWRlciA9IHBhY2sgJ3Z2JywgJHJlY29yZCwgJGxlbmd0aDsKKyAgICBteSAkZGF0YSA9IHBhY2sgJ3YnLCAkZ3JiaXQ7CisKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwgJGRhdGEgKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFya2VyX2RhdGFmb3JtYXRfc3RyZWFtKCkuIE92ZXJyaWRkZW4uCisjCisjIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHBhcmVudCBhYnN0cmFjdCBtZXRob2QgdG8gZGVmaW5lCisjIHByb3BlcnRpZXMgb2YgbWFya2VycywgbGluZXR5cGVzLCBwaWUgZm9ybWF0cyBhbmQgb3RoZXIuCisjCitzdWIgX3N0b3JlX21hcmtlcl9kYXRhZm9ybWF0X3N0cmVhbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPl9zdG9yZV9kcm9wYmFyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMSwgMHgwMDRGICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwRkZGRkZGLCAweDAwMDAsIDB4MDEsIDB4MDEsIDB4MDksIDB4MDggKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCisgICAgJHNlbGYtPl9zdG9yZV9kcm9wYmFyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9iZWdpbigpOworICAgICRzZWxmLT5fc3RvcmVfbGluZWZvcm1hdCggMHgwMDAwMDAwMCwgMHgwMDAwLCAweEZGRkYsIDB4MDAwMSwgMHgwMDRGICk7CisgICAgJHNlbGYtPl9zdG9yZV9hcmVhZm9ybWF0KCAweDAwMDAsIDB4MDBGRkZGRkYsIDB4MDEsIDB4MDEsIDB4MDgsIDB4MDkgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCisgICAgJHNlbGYtPl9zdG9yZV9jaGFydGxpbmUoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2xpbmVmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHhGRkZGLCAweDAwMDAsIDB4MDA0RiApOworCisKKyAgICAkc2VsZi0+X3N0b3JlX2RhdGFmb3JtYXQoIDB4MDAwMCwgMHhGRkZELCAweDAwMDAgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JlZ2luKCk7CisgICAgJHNlbGYtPl9zdG9yZV8zZGJhcnNoYXBlKCk7CisgICAgJHNlbGYtPl9zdG9yZV9saW5lZm9ybWF0KCAweDAwMDAwMDAwLCAweDAwMDUsIDB4RkZGRiwgMHgwMDAwLCAweDAwNEYgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FyZWFmb3JtYXQoIDB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMCwgMHgwMSwgMHg0RCwgMHg0RCApOworICAgICRzZWxmLT5fc3RvcmVfcGllZm9ybWF0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9tYXJrZXJmb3JtYXQoIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NEQsIDB4NEQsIDB4M0MgKTsKKyAgICAkc2VsZi0+X3N0b3JlX2VuZCgpOworCit9CisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworU3RvY2sgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgU3RvY2sgY2hhcnRzLgorCis9aGVhZDEgU1lOT1BTSVMKKworVG8gY3JlYXRlIGEgc2ltcGxlIEV4Y2VsIGZpbGUgd2l0aCBhIFN0b2NrIGNoYXJ0IHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnQueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKworICAgIG15ICRjaGFydCAgICAgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snICk7CisKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBPcGVuLUhpZ2gtTG93LUNsb3NlLgorICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEIkMjokQiQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEMkMjokQyQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEQkMjokRCQ2JyApOworICAgICRjaGFydC0+YWRkX3NlcmllcyggY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLCB2YWx1ZXMgPT4gJz1TaGVldDEhJEUkMjokRSQ2JyApOworCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoZSBjaGFydCByZWZlcnMgdG8uCisgICAgIyAuLi4gU2VlIHRoZSBmdWxsIGV4YW1wbGUgYmVsb3cuCisKKyAgICBfX0VORF9fCisKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgU3RvY2sgY2hhcnRzIGZvciBMPFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsPi4gVGhlIGNoYXJ0IG9iamVjdCBpcyBjcmVhdGVkIHZpYSB0aGUgV29ya2Jvb2sgQzxhZGRfY2hhcnQoKT4gbWV0aG9kOgorCisgICAgbXkgJGNoYXJ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3N0b2NrJyApOworCitPbmNlIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBpdCBjYW4gYmUgY29uZmlndXJlZCB2aWEgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRoYXQgYXJlIGNvbW1vbiB0byBhbGwgY2hhcnQgY2xhc3NlczoKKworICAgICRjaGFydC0+YWRkX3NlcmllcygpOworICAgICRjaGFydC0+c2V0X3hfYXhpcygpOworICAgICRjaGFydC0+c2V0X3lfYXhpcygpOworICAgICRjaGFydC0+c2V0X3RpdGxlKCk7CisKK1RoZXNlIG1ldGhvZHMgYXJlIGV4cGxhaW5lZCBpbiBkZXRhaWwgaW4gTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ+LiBDbGFzcyBzcGVjaWZpYyBtZXRob2RzIG9yIHNldHRpbmdzLCBpZiBhbnksIGFyZSBleHBsYWluZWQgYmVsb3cuCisKKz1oZWFkMSBTdG9jayBDaGFydCBNZXRob2RzCisKK1RoZXJlIGFyZW4ndCBjdXJyZW50bHkgYW55IHN0b2NrIGNoYXJ0IHNwZWNpZmljIG1ldGhvZHMuIFNlZSB0aGUgVE9ETyBzZWN0aW9uIG9mIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNoYXJ0Pi4KKworVGhlIGRlZmF1bHQgU3RvY2sgY2hhcnQgaXMgYW4gT3Blbi1IaWdoLUxvdy1DbG9zZSBjaGFydC4gQSBzZXJpZXMgbXVzdCBiZSBhZGRlZCBmb3IgZWFjaCBvZiB0aGVzZSBkYXRhIHNvdXJjZXMuCisKK1RoZSBkZWZhdWx0IFN0b2NrIGNoYXJ0IGlzIGluIGJsYWNrIGFuZCB3aGl0ZS4gVXNlciBkZWZpbmVkIGNvbG91cnMgd2lsbCBiZSBhZGRlZCBhdCBhIGxhdGVyIHN0YWdlLgorCis9aGVhZDEgRVhBTVBMRQorCitIZXJlIGlzIGEgY29tcGxldGUgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBtb3N0IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMgd2hlbiBjcmVhdGluZyBhIFN0b2NrIGNoYXJ0LgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKworICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9zdG9ja19leC54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5eXknICk7CisKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnRGF0ZScsICdPcGVuJywgJ0hpZ2gnLCAnTG93JywgJ0Nsb3NlJyBdOworICAgIG15IEBkYXRhID0gKAorICAgICAgICBbICcyMDA5LTA4LTIzJywgMTEwLjc1LCAxMTMuNDgsIDEwOS4wNSwgMTA5LjQwIF0sCisgICAgICAgIFsgJzIwMDktMDgtMjQnLCAxMTEuMjQsIDExMS42MCwgMTAzLjU3LCAxMDQuODcgXSwKKyAgICAgICAgWyAnMjAwOS0wOC0yNScsIDEwNC45NiwgMTA4LjAwLCAxMDMuODgsIDEwNi4wMCBdLAorICAgICAgICBbICcyMDA5LTA4LTI2JywgMTA0Ljk1LCAxMDcuOTUsIDEwNC42NiwgMTA3LjkxIF0sCisgICAgICAgIFsgJzIwMDktMDgtMjcnLCAxMDguMTAsIDEwOC42MiwgMTA1LjY5LCAxMDYuMTUgXSwKKyAgICApOworCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKworICAgIG15ICRyb3cgPSAxOworICAgIGZvciBteSAkZGF0YSAoIEBkYXRhICkgeworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSggJHJvdywgMCwgJGRhdGEtPlswXSwgJGRhdGVfZm9ybWF0ICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAxLCAkZGF0YS0+WzFdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAyLCAkZGF0YS0+WzJdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAzLCAkZGF0YS0+WzNdICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCA0LCAkZGF0YS0+WzRdICk7CisgICAgICAgICRyb3crKzsKKyAgICB9CisKKyAgICAjIENyZWF0ZSBhIG5ldyBjaGFydCBvYmplY3QuIEluIHRoaXMgY2FzZSBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICBteSAkY2hhcnQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnc3RvY2snLCBlbWJlZGRlZCA9PiAxICk7CisKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBvZiB0aGUgT3Blbi1IaWdoLUxvdy1DbG9zZSBjb2x1bW5zLgorICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDYnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNicsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ09wZW4nLAorICAgICk7CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ2JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDYnLAorICAgICAgICBuYW1lICAgICAgID0+ICdIaWdoJywKKyAgICApOworCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEQkMjokRCQ2JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnTG93JywKKyAgICApOworCisgICAgJGNoYXJ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNicsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEUkMjokRSQ2JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnQ2xvc2UnLAorICAgICk7CisKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBzb21lIGF4aXMgbGFiZWxzLgorICAgICRjaGFydC0+c2V0X3RpdGxlKCBuYW1lID0+ICdPcGVuLUhpZ2gtTG93LUNsb3NlJywgKTsKKyAgICAkY2hhcnQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ0RhdGUnLCApOworICAgICRjaGFydC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2hhcmUgcHJpY2UnLCApOworCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIHdvcmtzaGVldCAod2l0aCBhbiBvZmZzZXQpLgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0YyJywgJGNoYXJ0LCAyNSwgMTAgKTsKKworICAgIF9fRU5EX18KKworCis9YmVnaW4gaHRtbAorCis8cD5UaGlzIHdpbGwgcHJvZHVjZSBhIGNoYXJ0IHRoYXQgbG9va3MgbGlrZSB0aGlzOjwvcD4KKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdG9jazEuanBnIiB3aWR0aD0iNTI3IiBoZWlnaHQ9IjMyMCIgYWx0PSJDaGFydCBleGFtcGxlLiIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCitDb3B5cmlnaHQgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRXhhbXBsZXMucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0V4YW1wbGVzLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjk2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0V4YW1wbGVzLnBtCkBAIC0wLDAgKzEsMTA2MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkV4YW1wbGVzOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIEV4YW1wbGVzIC0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZXhhbXBsZXMuCisjCisjIEEgZG9jdW1lbnRhdGlvbiBvbmx5IG1vZHVsZSBzaG93aW5nIHRoZSBleGFtcGxlcyB0aGF0IGFyZQorIyBpbmNsdWRlZCBpbiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZGlzdHJpYnV0aW9uLiBUaGlzCisjIGZpbGUgd2FzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IHZpYSB0aGUgZ2VuX2V4YW1wbGVzX3BvZC5wbAorIyBwcm9ncmFtIHRoYXQgaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBzdHJpY3Q7Cit1c2UgdmFycyBxdygkVkVSU0lPTik7CiskVkVSU0lPTiA9ICcyLjM3JzsKKworMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0V4YW1wbGVzIC0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZXhhbXBsZSBwcm9ncmFtcy4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgaXMgYSBkb2N1bWVudGF0aW9uIG9ubHkgbW9kdWxlIHNob3dpbmcgdGhlIGV4YW1wbGVzIHRoYXQgYXJlCitpbmNsdWRlZCBpbiB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbD4gZGlzdHJpYnV0aW9uLgorCitUaGlzIGZpbGUgd2FzIGF1dG8tZ2VuZXJhdGVkIHZpYSB0aGUgZ2VuX2V4YW1wbGVzX3BvZC5wbAorcHJvZ3JhbSB0aGF0IGlzIGFsc28gaW5jbHVkZWQgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4KKworPWhlYWQxIEV4YW1wbGUgcHJvZ3JhbXMKKworVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2YgdGhlIDg1IGV4YW1wbGUgcHJvZ3JhbXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRpc3RyaWJ1dGlvbi4KKworPW92ZXIKKworPWl0ZW0gKiBMPEV4YW1wbGU6IGFfc2ltcGxlLnBsPiBBIGdldCBzdGFydGVkIGV4YW1wbGUgd2l0aCBzb21lIGJhc2ljIGZlYXR1cmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGVtby5wbD4gQSBkZW1vIG9mIHNvbWUgb2YgdGhlIGF2YWlsYWJsZSBmZWF0dXJlcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHJlZ2lvbnMucGw+IEEgc2ltcGxlIGV4YW1wbGUgb2YgbXVsdGlwbGUgd29ya3NoZWV0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHN0YXRzLnBsPiBCYXNpYyBmb3JtdWxhcyBhbmQgZnVuY3Rpb25zLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZm9ybWF0cy5wbD4gQWxsIHRoZSBhdmFpbGFibGUgZm9ybWF0dGluZyBvbiBzZXZlcmFsIHdvcmtzaGVldHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBidWdfcmVwb3J0LnBsPiBBIHRlbXBsYXRlIGZvciBzdWJtaXR0aW5nIGJ1ZyByZXBvcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYXV0b2ZpbHRlci5wbD4gRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGF1dG9maWx0ZXJzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYXV0b2ZpdC5wbD4gU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogYmlnZmlsZS5wbD4gV3JpdGUgcGFzdCB0aGUgN01CIGxpbWl0IHdpdGggT0xFOjpTdG9yYWdlX0xpdGUuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjZ2kucGw+IEEgc2ltcGxlIENHSSBwcm9ncmFtLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfYXJlYS5wbD4gQSBkZW1vIG9mIGFyZWEgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfYmFyLnBsPiBBIGRlbW8gb2YgYmFyICh2ZXJ0aWNhbCBoaXN0b2dyYW0pIHN0eWxlIGNoYXJ0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNoYXJ0X2NvbHVtbi5wbD4gQSBkZW1vIG9mIGNvbHVtbiAoaGlzdG9ncmFtKSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9saW5lLnBsPiBBIGRlbW8gb2YgbGluZSBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGFydF9waWUucGw+IEEgZGVtbyBvZiBwaWUgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfc2NhdHRlci5wbD4gQSBkZW1vIG9mIHNjYXR0ZXIgc3R5bGUgY2hhcnRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogY2hhcnRfc3RvY2sucGw+IEEgZGVtbyBvZiBzdG9jayBzdHlsZSBjaGFydHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjaGVzcy5wbD4gQW4gZXhhbXBsZSBvZiByZXVzaW5nIGZvcm1hdHRpbmcgdmlhIHByb3BlcnRpZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb2xvcnMucGw+IEEgZGVtbyBvZiB0aGUgY29sb3VyIHBhbGV0dGUgYW5kIG5hbWVkIGNvbG91cnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb21tZW50czEucGw+IEFkZCBjb21tZW50cyB0byB3b3Jrc2hlZXQgY2VsbHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb21tZW50czIucGw+IEFkZCBjb21tZW50cyB3aXRoIGFkdmFuY2VkIG9wdGlvbnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBjb3B5Zm9ybWF0LnBsPiBFeGFtcGxlIG9mIGNvcHlpbmcgYSBjZWxsIGZvcm1hdC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGFfdmFsaWRhdGUucGw+IEFuIGV4YW1wbGUgb2YgZGF0YSB2YWxpZGF0aW9uIGFuZCBkcm9wZG93biBsaXN0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGVfdGltZS5wbD4gV3JpdGUgZGF0ZXMgYW5kIHRpbWVzIHdpdGggd3JpdGVfZGF0ZV90aW1lKCkuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkZWZpbmVkX25hbWUucGw+IEV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBkZWZpbmVkIG5hbWVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZGlhZ19ib3JkZXIucGw+IEEgc2ltcGxlIGV4YW1wbGUgb2YgZGlhZ29uYWwgY2VsbCBib3JkZXJzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZWFzdGVyX2VnZy5wbD4gRXhwb3NlIHRoZSBFeGNlbDk3IGZsaWdodCBzaW11bGF0b3IuCisKKz1pdGVtICogTDxFeGFtcGxlOiBmaWxlaGFuZGxlLnBsPiBFeGFtcGxlcyBvZiB3b3JraW5nIHdpdGggZmlsZWhhbmRsZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBmb3JtdWxhX3Jlc3VsdC5wbD4gRm9ybXVsYXMgd2l0aCB1c2VyIHNwZWNpZmllZCByZXN1bHRzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogaGVhZGVycy5wbD4gRXhhbXBsZXMgb2Ygd29ya3NoZWV0IGhlYWRlcnMgYW5kIGZvb3RlcnMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoaWRlX3NoZWV0LnBsPiBTaW1wbGUgZXhhbXBsZSBvZiBoaWRpbmcgYSB3b3Jrc2hlZXQuCisKKz1pdGVtICogTDxFeGFtcGxlOiBoeXBlcmxpbmsxLnBsPiBTaG93cyBob3cgdG8gY3JlYXRlIHdlYiBoeXBlcmxpbmtzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogaHlwZXJsaW5rMi5wbD4gRXhhbXBsZXMgb2YgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGh5cGVybGlua3MuCisKKz1pdGVtICogTDxFeGFtcGxlOiBpbWFnZXMucGw+IEFkZGluZyBpbWFnZXMgdG8gd29ya3NoZWV0cy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGluZGVudC5wbD4gQW4gZXhhbXBsZSBvZiBjZWxsIGluZGVudGF0aW9uLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbWVyZ2UxLnBsPiBBIHNpbXBsZSBleGFtcGxlIG9mIGNlbGwgbWVyZ2luZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1lcmdlMi5wbD4gQSBzaW1wbGUgZXhhbXBsZSBvZiBjZWxsIG1lcmdpbmcgd2l0aCBmb3JtYXR0aW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbWVyZ2UzLnBsPiBBZGQgaHlwZXJsaW5rcyB0byBtZXJnZWQgY2VsbHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTQucGw+IEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTUucGw+IEFuIGFkdmFuY2VkIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIGZvcm1hdHRpbmcuCisKKz1pdGVtICogTDxFeGFtcGxlOiBtZXJnZTYucGw+IEFuIGV4YW1wbGUgb2YgbWVyZ2luZyB3aXRoIFVuaWNvZGUgc3RyaW5ncy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG1vZF9wZXJsMS5wbD4gQSBzaW1wbGUgbW9kX3BlcmwgMSBwcm9ncmFtLgorCis9aXRlbSAqIEw8RXhhbXBsZTogbW9kX3BlcmwyLnBsPiBBIHNpbXBsZSBtb2RfcGVybCAyIHByb2dyYW0uCisKKz1pdGVtICogTDxFeGFtcGxlOiBvdXRsaW5lLnBsPiBBbiBleGFtcGxlIG9mIG91dGxpbmVzIGFuZCBncm91cGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IG91dGxpbmVfY29sbGFwc2VkLnBsPiBBbiBleGFtcGxlIG9mIGNvbGxhcHNlZCBvdXRsaW5lcy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHBhbmVzLnBsPiBBbiBleGFtcGxlcyBvZiBob3cgdG8gY3JlYXRlIHBhbmVzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcHJvcGVydGllcy5wbD4gQWRkIGRvY3VtZW50IHByb3BlcnRpZXMgdG8gYSB3b3JrYm9vay4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHByb3RlY3Rpb24ucGw+IEV4YW1wbGUgb2YgY2VsbCBsb2NraW5nIGFuZCBmb3JtdWxhIGhpZGluZy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHJlcGVhdC5wbD4gRXhhbXBsZSBvZiB3cml0aW5nIHJlcGVhdGVkIGZvcm11bGFzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogcmlnaHRfdG9fbGVmdC5wbD4gQ2hhbmdlIGRlZmF1bHQgc2hlZXQgZGlyZWN0aW9uIHRvIHJpZ2h0IHRvIGxlZnQuCisKKz1pdGVtICogTDxFeGFtcGxlOiByb3dfd3JhcC5wbD4gSG93IHRvIHdyYXAgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byBhbm90aGVyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogc2FsZXMucGw+IEFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgc2FsZXMgc3ByZWFkc2hlZXQuCisKKz1pdGVtICogTDxFeGFtcGxlOiBzZW5kbWFpbC5wbD4gU2VuZCBhbiBFeGNlbCBlbWFpbCBhdHRhY2htZW50IHVzaW5nIE1haWw6OlNlbmRlci4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHN0YXRzX2V4dC5wbD4gU2FtZSBhcyBzdGF0cy5wbCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZXMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBzdG9ja3MucGw+IERlbW9uc3RyYXRlcyBjb25kaXRpb25hbCBmb3JtYXR0aW5nLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdGFiX2NvbG9ycy5wbD4gRXhhbXBsZSBvZiBob3cgdG8gc2V0IHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHRleHR3cmFwLnBsPiBEZW1vbnN0cmF0ZXMgdGV4dCB3cmFwcGluZyBvcHRpb25zLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd2luMzJvbGUucGw+IEEgc2FtcGxlIFdpbjMyOjpPTEUgZXhhbXBsZSBmb3IgY29tcGFyaXNvbi4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHdyaXRlX2FycmF5cy5wbD4gRXhhbXBsZSBvZiB3cml0aW5nIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjEucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAxLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjIucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjMucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCAzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfaGFuZGxlcjQucGw+IEV4YW1wbGUgb2YgZXh0ZW5kaW5nIHRoZSB3cml0ZSgpIG1ldGhvZC4gU3RlcCA0LgorCis9aXRlbSAqIEw8RXhhbXBsZTogd3JpdGVfdG9fc2NhbGFyLnBsPiBFeGFtcGxlIG9mIHdyaXRpbmcgYW4gRXhjZWwgZmlsZSB0byBhIFBlcmwgc2NhbGFyLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV91dGYxNi5wbD4gU2ltcGxlIGV4YW1wbGUgb2YgdXNpbmcgVW5pY29kZSBVVEYxNiBzdHJpbmdzLgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV91dGYxNl9qYXBhbi5wbD4gV3JpdGUgSmFwYW5lc2UgVW5pY29kZSBzdHJpbmdzIHVzaW5nIFVURi0xNi4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfY3lyaWxsaWMucGw+IFdyaXRlIFJ1c3NpYW4gQ3lyaWxsaWMgc3RyaW5ncyB1c2luZyBVVEYtOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfbGlzdC5wbD4gTGlzdCB0aGUgY2hhcnMgaW4gYSBVbmljb2RlIGZvbnQuCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlXzIwMjJfanAucGw+IEphcGFuZXNlOiBJU08tMjAyMi1KUCB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV84ODU5XzExLnBsPiBUaGFpOiAgICAgSVNPLTg4NTlfMTEgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfODg1OV83LnBsPiBHcmVlazogICAgSVNPLTg4NTlfNyAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfYmlnNS5wbD4gQ2hpbmVzZTogIEJJRzUgICAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2NwMTI1MS5wbD4gUnVzc2lhbjogIENQMTI1MSAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2NwMTI1Ni5wbD4gQXJhYmljOiAgIENQMTI1NiAgICAgIHRvIHV0ZjggaW4gcGVybCA1LjguCisKKz1pdGVtICogTDxFeGFtcGxlOiB1bmljb2RlX2tvaThyLnBsPiBSdXNzaWFuOiAgS09JOC1SICAgICAgdG8gdXRmOCBpbiBwZXJsIDUuOC4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHVuaWNvZGVfcG9saXNoX3V0ZjgucGw+IFBvbGlzaCA6ICBVVEY4ICAgICAgICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogdW5pY29kZV9zaGlmdF9qaXMucGw+IEphcGFuZXNlOiBTaGlmdCBKSVMgICB0byB1dGY4IGluIHBlcmwgNS44LgorCis9aXRlbSAqIEw8RXhhbXBsZTogY3N2Mnhscy5wbD4gUHJvZ3JhbSB0byBjb252ZXJ0IGEgQ1NWIGZpbGUgdG8gYW4gRXhjZWwgZmlsZS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHRhYjJ4bHMucGw+IFByb2dyYW0gdG8gY29udmVydCBhIHRhYiBzZXBhcmF0ZWQgZmlsZSB0byB4bHMuCisKKz1pdGVtICogTDxFeGFtcGxlOiBkYXRlY2FsYzEucGw+IENvbnZlcnQgVW5peC9QZXJsIHRpbWUgdG8gRXhjZWwgdGltZS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGRhdGVjYWxjMi5wbD4gQ2FsY3VsYXRlIGFuIEV4Y2VsIGRhdGUgdXNpbmcgRGF0ZTo6Q2FsYy4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGxlY3hlLnBsPiBDb252ZXJ0IEV4Y2VsIHRvIFdyaXRlRXhjZWwgdXNpbmcgV2luMzI6Ok9MRS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IGNvbnZlcnRBMS5wbD4gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIEExIG5vdGF0aW9uLgorCis9aXRlbSAqIEw8RXhhbXBsZTogZnVuY3Rpb25fbG9jYWxlLnBsPiBBZGQgbm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMgdG8gRm9ybXVsYS5wbS4KKworPWl0ZW0gKiBMPEV4YW1wbGU6IHdyaXRlQTEucGw+IEV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgbW9kdWxlLgorCis9YmFjaworCis9aGVhZDIgRXhhbXBsZTogYV9zaW1wbGUucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlCitzb21lICB0ZXh0IGFuZCBudW1iZXJzIHRvIGFuIEV4Y2VsIGJpbmFyeSBmaWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9hX3NpbXBsZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGFfc2ltcGxlLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUKKyAgICAjIHNvbWUgIHRleHQgYW5kIG51bWJlcnMgdG8gYW4gRXhjZWwgYmluYXJ5IGZpbGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgY2FsbGVkIHNpbXBsZS54bHMgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdhX3NpbXBsZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBUaGUgZ2VuZXJhbCBzeW50YXggaXMgd3JpdGUoJHJvdywgJGNvbHVtbiwgJHRva2VuKS4gTm90ZSB0aGF0IHJvdyBhbmQKKyAgICAjIGNvbHVtbiBhcmUgemVybyBpbmRleGVkCisgICAgIworICAgIAorICAgICMgV3JpdGUgc29tZSB0ZXh0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgbnVtYmVycworICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICAzKTsgICAgICAgICAgIyBXcml0ZXMgMworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICAzLjAwMDAwKTsgICAgIyBXcml0ZXMgMworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICAzLjAwMDAxKTsgICAgIyBXcml0ZXMgMy4wMDAwMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDAsICAzLjE0MTU5KTsgICAgIyBUZVggcmV2aXNpb24gbm8uPworICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICAnPUEzICsgQTYnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAwLCAgJz1JRihBNT4zLCJZZXMiLCAiTm8iKScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgYSBoeXBlcmxpbmsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMCwgJ2h0dHA6Ly93d3cucGVybC5jb20vJyk7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hX3NpbXBsZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRlbW8ucGwKKworCisKK0Egc2ltcGxlIGRlbW8gb2Ygc29tZSBvZiB0aGUgZmVhdHVyZXMgb2YgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBzY3JlZW5zaG90IGZvciBGcmVzaG1lYXQ6CitMPGh0dHA6Ly9mcmVzaG1lYXQubmV0L3Byb2plY3RzL3dyaXRlZXhjZWwvPgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kZW1vLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZGVtby5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIHNvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgcHJvamVjdCBzY3JlZW5zaG90IGZvciBGcmVzaG1lYXQ6CisgICAgIyBMPGh0dHA6Ly9mcmVzaG1lYXQubmV0L3Byb2plY3RzL3dyaXRlZXhjZWwvPgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgT2N0b2JlciAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJkZW1vLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdEZW1vJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0Fub3RoZXIgc2hlZXQnKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQW5kIGFub3RoZXInKTsKKyAgICAKKyAgICBteSAkYm9sZCAgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgV3JpdGUgYSBnZW5lcmFsIGhlYWRpbmcKKyAgICAjCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMzYsICRib2xkKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkInLCAyMCAgICAgICApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3cgICAoMCwgICAgIDQwICAgICAgICk7CisgICAgCisgICAgbXkgJGhlYWRpbmcgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplICAgID0+IDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZSAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICA9PiAndmNlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgbXkgQGhlYWRpbmdzID0gKCdGZWF0dXJlcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCcsICcnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9yb3coJ0ExJywgXEBoZWFkaW5ncywgJGhlYWRpbmcpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSB0ZXh0IGV4YW1wbGVzCisgICAgIworICAgIG15ICR0ZXh0X2Zvcm1hdCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGFsaWMgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICA9PiAxOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgICAgPT4nTHVjaWRhIENhbGxpZ3JhcGh5JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgQSBwaHJhc2UgaW4gQ3lyaWxsaWMKKyAgICBteSAkdW5pY29kZSA9IHBhY2sgIkgqIiwgIjA0MmQwNDQyMDQzZTAwMjAwNDQ0MDQ0MDA0MzAwNDM3MDQzMDAwMjAwNCIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIzZDA0MzAwMDIwMDQ0MDA0NDMwNDQxMDQ0MTA0M2EwNDNlMDQzYzAwMjEiOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICJUZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgIkhlbGxvIEV4Y2VsIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgIkZvcm1hdHRlZCB0ZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IzJywgIkhlbGxvIEV4Y2VsIiwgJHRleHRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAiVW5pY29kZSB0ZXh0Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0I0JywgJHVuaWNvZGUpOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSBudW1lcmljIGV4YW1wbGVzCisgICAgIworICAgIG15ICRudW0xX2Zvcm1hdCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnJCMsIyMwLjAwJyk7CisgICAgbXkgJG51bTJfZm9ybWF0ICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICcgZCBtbW1tIHl5eScpOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICJOdW1iZXJzIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I1JywgMTIzNC41Nik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgIkZvcm1hdHRlZCBudW1iZXJzIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgMTIzNC41NiwgJG51bTFfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTcnLCAiRm9ybWF0dGVkIG51bWJlcnMiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjcnLCAzNzI1NywgJG51bTJfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEZvcm11bGFlCisgICAgIworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0I4Jyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E4JywgJ0Zvcm11bGFzIGFuZCBmdW5jdGlvbnMsICI9U0lOKFBJKCkvNCkiJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I4JywgJz1TSU4oUEkoKS80KScpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgSHlwZXJsaW5rcworICAgICMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAiSHlwZXJsaW5rcyIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICAnaHR0cDovL3d3dy5wZXJsLmNvbS8nICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBJbWFnZXMKKyAgICAjCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMCcsICJJbWFnZXMiKTsKKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfaW1hZ2UoJ0IxMCcsICdyZXB1YmxpYy5wbmcnLCAxNiwgOCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBNaXNjCisgICAgIworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTgnLCAiUGFnZS9wcmludGVyIHNldHVwIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExOScsICJNdWx0aXBsZSB3b3Jrc2hlZXRzIik7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kZW1vLnBsPgorCis9aGVhZDIgRXhhbXBsZTogcmVnaW9ucy5wbAorCisKKworQW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDpXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBhIGJhc2ljCitFeGNlbCB3b3JrYm9vayB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlZ2lvbnMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByZWdpb25zLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDpXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBhIGJhc2ljCisgICAgIyBFeGNlbCB3b3JrYm9vayB3aXRoIG11bHRpcGxlIHdvcmtzaGVldHMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJyZWdpb25zLnhscyIpOworICAgIAorICAgICMgQWRkIHNvbWUgd29ya3NoZWV0cworICAgIG15ICRub3J0aCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgiTm9ydGgiKTsKKyAgICBteSAkc291dGggPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoIlNvdXRoIik7CisgICAgbXkgJGVhc3QgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCJFYXN0Iik7CisgICAgbXkgJHdlc3QgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCJXZXN0Iik7CisgICAgCisgICAgIyBBZGQgYSBGb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfY29sb3IoJ2JsdWUnKTsKKyAgICAKKyAgICAjIEFkZCBhIGNhcHRpb24gdG8gZWFjaCB3b3Jrc2hlZXQKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKCR3b3JrYm9vay0+c2hlZXRzKCkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIlNhbGVzIiwgJGZvcm1hdCk7CisgICAgfQorICAgIAorICAgICMgV3JpdGUgc29tZSBkYXRhCisgICAgJG5vcnRoLT53cml0ZSgwLCAxLCAyMDAwMDApOworICAgICRzb3V0aC0+d3JpdGUoMCwgMSwgMTAwMDAwKTsKKyAgICAkZWFzdC0+d3JpdGUgKDAsIDEsIDE1MDAwMCk7CisgICAgJHdlc3QtPndyaXRlICgwLCAxLCAxMDAwMDApOworICAgIAorICAgICMgU2V0IHRoZSBhY3RpdmUgd29ya3NoZWV0CisgICAgJHNvdXRoLT5hY3RpdmF0ZSgpOworICAgIAorICAgICMgU2V0IHRoZSB3aWR0aCBvZiB0aGUgZmlyc3QgY29sdW1uCisgICAgJHNvdXRoLT5zZXRfY29sdW1uKDAsIDAsIDIwKTsKKyAgICAKKyAgICAjIFNldCB0aGUgYWN0aXZlIGNlbGwKKyAgICAkc291dGgtPnNldF9zZWxlY3Rpb24oMCwgMSk7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JlZ2lvbnMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdGF0cy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zdGF0cy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHN0YXRzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICMgbW9kdWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic3RhdHMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCBkYXRhJyk7CisgICAgCisgICAgIyBTZXQgdGhlIGNvbHVtbiB3aWR0aCBmb3IgY29sdW1ucyAxCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBoZWFkaW5ncworICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHNhbXBsZSBkYXRhCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJ1NhbXBsZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsIDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsIDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsIDMpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDQsIDQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsIDUpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDYsIDYpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDcsIDcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDgsIDgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdMZW5ndGgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAyLCAyNS40KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAyNC44KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA0LCAyNS4wKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAyNS4zKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA2LCAyNC45KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA3LCAyNS4yKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA4LCAyNC44KTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgc3RhdGlzdGljYWwgZnVuY3Rpb25zCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgIDAsICdDb3VudCcsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsICAxLCAnPUNPVU5UKEIxOkkxKScpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsICAwLCAnU3VtJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgIDEsICc9U1VNKEIyOkkyKScpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAwLCAnQXZlcmFnZScsICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsICAxLCAnPUFWRVJBR0UoQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgIDAsICdNaW4nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMSwgJz1NSU4oQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOCwgIDAsICdNYXgnLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg4LCAgMSwgJz1NQVgoQjI6STIpJyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoOSwgIDAsICdTdGFuZGFyZCBEZXZpYXRpb24nLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSg5LCAgMSwgJz1TVERFVihCMjpJMiknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxMCwgMCwgJ0t1cnRvc2lzJywgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMTAsIDEsICc9S1VSVChCMjpJMiknKTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3N0YXRzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZm9ybWF0cy5wbAorCisKKworRXhhbXBsZXMgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIGFsbW9zdCBhbGwgcG9zc2libGUgZm9ybWF0dGluZyBvcHRpb25zLiBJdCBpcyB3b3J0aAorcnVubmluZyB0aGlzIHByb2dyYW0gYW5kIHZpZXdpbmcgdGhlIG91dHB1dCBFeGNlbCBmaWxlIGlmIHlvdSBhcmUgaW50ZXJlc3RlZAoraW4gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBwb3NzaWJpbGl0aWVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9mb3JtYXRzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZm9ybWF0cy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGZvcm1hdHRpbmcgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4KKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIGFsbW9zdCBhbGwgcG9zc2libGUgZm9ybWF0dGluZyBvcHRpb25zLiBJdCBpcyB3b3J0aAorICAgICMgcnVubmluZyB0aGlzIHByb2dyYW0gYW5kIHZpZXdpbmcgdGhlIG91dHB1dCBFeGNlbCBmaWxlIGlmIHlvdSBhcmUgaW50ZXJlc3RlZAorICAgICMgaW4gdGhlIHZhcmlvdXMgZm9ybWF0dGluZyBwb3NzaWJpbGl0aWVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdmb3JtYXRzLnhscycpOworICAgIAorICAgICMgU29tZSBjb21tb24gZm9ybWF0cworICAgIG15ICRjZW50ZXIgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGFsaWduID0+ICdjZW50ZXInKTsKKyAgICBteSAkaGVhZGluZyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChhbGlnbiA9PiAnY2VudGVyJywgYm9sZCA9PiAxKTsKKyAgICAKKyAgICAjIFRoZSBuYW1lZCBjb2xvcnMKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICAgICAgICAgICAgICAweDA4LCAnYmxhY2snLAorICAgICAgICAgICAgICAgICAgICAweDBDLCAnYmx1ZScsCisgICAgICAgICAgICAgICAgICAgIDB4MTAsICdicm93bicsCisgICAgICAgICAgICAgICAgICAgIDB4MEYsICdjeWFuJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNywgJ2dyYXknLAorICAgICAgICAgICAgICAgICAgICAweDExLCAnZ3JlZW4nLAorICAgICAgICAgICAgICAgICAgICAweDBCLCAnbGltZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEUsICdtYWdlbnRhJywKKyAgICAgICAgICAgICAgICAgICAgMHgxMiwgJ25hdnknLAorICAgICAgICAgICAgICAgICAgICAweDM1LCAnb3JhbmdlJywKKyAgICAgICAgICAgICAgICAgICAgMHgyMSwgJ3BpbmsnLAorICAgICAgICAgICAgICAgICAgICAweDE0LCAncHVycGxlJywKKyAgICAgICAgICAgICAgICAgICAgMHgwQSwgJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgIDB4MTYsICdzaWx2ZXInLAorICAgICAgICAgICAgICAgICAgICAweDA5LCAnd2hpdGUnLAorICAgICAgICAgICAgICAgICAgICAweDBELCAneWVsbG93JywKKyAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIENhbGwgdGhlc2Ugc3Vicm91dGluZXMgdG8gZGVtb25zdHJhdGUgZGlmZmVyZW50IGZvcm1hdHRpbmcgb3B0aW9ucworICAgIGludHJvKCk7CisgICAgZm9udHMoKTsKKyAgICBuYW1lZF9jb2xvcnMoKTsKKyAgICBzdGFuZGFyZF9jb2xvcnMoKTsKKyAgICBudW1lcmljX2Zvcm1hdHMoKTsKKyAgICBib3JkZXJzKCk7CisgICAgcGF0dGVybnMoKTsKKyAgICBhbGlnbm1lbnQoKTsKKyAgICBtaXNjKCk7CisgICAgCisgICAgIyBOb3RlOiB0aGlzIGlzIHJlcXVpcmVkCisgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBJbnRyby4KKyAgICAjCisgICAgc3ViIGludHJvIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW50cm9kdWN0aW9uJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgNjApOworICAgIAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE0KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgICAgICRmb3JtYXQtPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQyLT5zZXRfYm9sZCgpOworICAgICAgICAkZm9ybWF0Mi0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdUaGlzIHdvcmtib29rIGRlbW9uc3RyYXRlcyBzb21lIG9mJywgICRmb3JtYXQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAwLCAndGhlIGZvcm1hdHRpbmcgb3B0aW9ucyBwcm92aWRlZCBieScsICAkZm9ybWF0KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNCwgMCwgJ3RoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuJywgJGZvcm1hdCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICAnU2VjdGlvbnM6JywgJGZvcm1hdDIpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAgImludGVybmFsOkZvbnRzIUExIiwgICAgICAgICAgICAgJ0ZvbnRzJyAgICAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgImludGVybmFsOidOYW1lZCBjb2xvcnMnIUExIiwgICAgJ05hbWVkIGNvbG9ycycgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEwJywgImludGVybmFsOidTdGFuZGFyZCBjb2xvcnMnIUExIiwgJ1N0YW5kYXJkIGNvbG9ycycpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTExJywgImludGVybmFsOidOdW1lcmljIGZvcm1hdHMnIUExIiwgJ051bWVyaWMgZm9ybWF0cycpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEyJywgImludGVybmFsOkJvcmRlcnMhQTEiLCAgICAgICAgICAgJ0JvcmRlcnMnICAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEzJywgImludGVybmFsOlBhdHRlcm5zIUExIiwgICAgICAgICAgJ1BhdHRlcm5zJyAgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTE0JywgImludGVybmFsOkFsaWdubWVudCFBMSIsICAgICAgICAgJ0FsaWdubWVudCcgICAgICApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTE1JywgImludGVybmFsOk1pc2NlbGxhbmVvdXMhQTEiLCAgICAgJ01pc2NlbGxhbmVvdXMnICApOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIG5hbWVkIGNvbG9ycy4KKyAgICAjCisgICAgc3ViIG5hbWVkX2NvbG9ycyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ05hbWVkIGNvbG9ycycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDMsIDE1KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIkNvbG9yIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBteSAkaSA9IDE7CisgICAgCisgICAgICAgIHdoaWxlIChteSgkaW5kZXgsICRjb2xvcikgPSBlYWNoICVjb2xvcnMpIHsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZ19jb2xvciA9PiAkY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgPT4gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpKzEsIDAsICRpbmRleCwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGkrMSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGluZGV4KSwgJGNlbnRlcik7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkaSsxLCAyLCAkY29sb3IsICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpKzEsIDMsICcnLCAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNvbG9ycyBpbiB0aGUgcmFuZ2UgOC4uNjMuCisgICAgIworICAgIHN1YiBzdGFuZGFyZF9jb2xvcnMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdTdGFuZGFyZCBjb2xvcnMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAyLCAiQ29sb3IiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAKKyAgICAgICAgZm9yIG15ICRpICg4Li42MykgeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnX2NvbG9yID0+ICRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoJGkgLTcpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKCRpIC03KSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgkaSAtNyksIDIsICcnLCAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgCisgICAgICAgICAgICAjIEFkZCB0aGUgIGNvbG9yIG5hbWVzCisgICAgICAgICAgICBpZiAoZXhpc3RzICRjb2xvcnN7JGl9KSB7CisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKCRpIC03KSwgMywgJGNvbG9yc3skaX0sICRjZW50ZXIpOworICAgIAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSB0aGUgc3RhbmRhcmQgbnVtZXJpYyBmb3JtYXRzLgorICAgICMKKyAgICBzdWIgbnVtZXJpY19mb3JtYXRzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTnVtZXJpYyBmb3JtYXRzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNCwgMTUpOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDUsIDUsIDQ1KTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgICAgICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAgICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDIsICJVbmZvcm1hdHRlZCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMywgIkZvcm1hdHRlZCIsICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCAiTmVnYXRpdmUiLCAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsICJGb3JtYXQiLCAgICAgICRoZWFkaW5nKTsKKyAgICAKKyAgICAgICAgbXkgQGZvcm1hdHM7CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwMCwgMTIzNC41NjcsICAgMCwgICAgICAgICAnR2VuZXJhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDAxLCAxMjM0LjU2NywgICAwLCAgICAgICAgICcwJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDIsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJzAuMDAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwMywgMTIzNC41NjcsICAgMCwgICAgICAgICAnIywjIzAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNCwgMTIzNC41NjcsICAgMCwgICAgICAgICAnIywjIzAuMDAnIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgwNSwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnKCQjLCMjMF8pOygkIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDYsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygkIywjIzBfKTtbUmVkXSgkIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MDcsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygkIywjIzAuMDBfKTsoJCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA4LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoJCMsIyMwLjAwXyk7W1JlZF0oJCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDA5LCAwLjU2NywgICAgICAwLCAgICAgICAgICcwJScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBhLCAwLjU2NywgICAgICAwLCAgICAgICAgICcwLjAwJScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBiLCAxMjM0LjU2NywgICAwLCAgICAgICAgICcwLjAwRSswMCcgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBjLCAwLjc1LCAgICAgICAwLCAgICAgICAgICcjID8vPycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBkLCAwLjMxMjUsICAgICAwLCAgICAgICAgICcjID8/Lz8/JyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MGUsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ20vZC95eScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDBmLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdkLW1tbS15eScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDEwLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdkLW1tbScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDExLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtbW0teXknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgxMiwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnaDptbSBBTS9QTScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDEzLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdoOm1tOnNzIEFNL1BNJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MTQsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ2g6bW0nIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgxNSwgMzY4OTIuNTIxLCAgMCwgICAgICAgICAnaDptbTpzcycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDE2LCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtL2QveXkgaDptbScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI1LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoIywjIzBfKTsoIywjIzApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjYsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMF8pO1tSZWRdKCMsIyMwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI3LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICcoIywjIzAuMDBfKTsoIywjIzAuMDApJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MjgsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJygjLCMjMC4wMF8pO1tSZWRdKCMsIyMwLjAwKScgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDI5LCAxMjM0LjU2NywgICAtMTIzNC41NjcsICdfKCogIywjIzBfKTtfKCogKCMsIyMwKTtfKCogIi0iXyk7XyhAXyknIF07CisgICAgICAgIHB1c2ggQGZvcm1hdHMsIFsgMHgyYSwgMTIzNC41NjcsICAgLTEyMzQuNTY3LCAnXygkKiAjLCMjMF8pO18oJCogKCMsIyMwKTtfKCQqICItIl8pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmIsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJ18oKiAjLCMjMC4wMF8pO18oKiAoIywjIzAuMDApO18oKiAiLSI/P18pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmMsIDEyMzQuNTY3LCAgIC0xMjM0LjU2NywgJ18oJCogIywjIzAuMDBfKTtfKCQqICgjLCMjMC4wMCk7XygkKiAiLSI/P18pO18oQF8pJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmQsIDM2ODkyLjUyMSwgIDAsICAgICAgICAgJ21tOnNzJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MmUsIDMuMDE1MywgICAgIDAsICAgICAgICAgJ1toXTptbTpzcycgXTsKKyAgICAgICAgcHVzaCBAZm9ybWF0cywgWyAweDJmLCAzNjg5Mi41MjEsICAwLCAgICAgICAgICdtbTpzcy4wJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MzAsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJyMjMC4wRSswJyBdOworICAgICAgICBwdXNoIEBmb3JtYXRzLCBbIDB4MzEsIDEyMzQuNTY3LCAgIDAsICAgICAgICAgJ0AnIF07CisgICAgCisgICAgICAgIG15ICRpOworICAgICAgICBmb3JlYWNoIG15ICRmb3JtYXQgKEBmb3JtYXRzKXsKKyAgICAgICAgICAgIG15ICRzdHlsZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICAgICAgJHN0eWxlLT5zZXRfbnVtX2Zvcm1hdCgkZm9ybWF0LT5bMF0pOworICAgIAorICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAwLCAkZm9ybWF0LT5bMF0sICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAxLCBzcHJpbnRmKCIweCUwMlgiLCAkZm9ybWF0LT5bMF0pLCAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAyLCAkZm9ybWF0LT5bMV0sICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAzLCAkZm9ybWF0LT5bMV0sICAgICAgICAgICAgICAgICAgICAkc3R5bGUpOworICAgIAorICAgICAgICAgICAgaWYgKCRmb3JtYXQtPlsyXSkgeworICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCA0LCAkZm9ybWF0LT5bMl0sICRzdHlsZSk7CisgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJGksIDUsICRmb3JtYXQtPlszXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIHRoZSBmb250IG9wdGlvbnMuCisgICAgIworICAgIHN1YiBmb250cyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0ZvbnRzJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMzApOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDEsIDEwKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkZvbnQgbmFtZSIsICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiRm9udCBzaXplIiwgICAkaGVhZGluZyk7CisgICAgCisgICAgICAgIG15IEBmb250czsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTAsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTQsICdBcmlhbCcgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCBCbGFjaycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBcmlhbCBOYXJyb3cnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnQ2VudHVyeSBTY2hvb2xib29rJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0NvdXJpZXInIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnQ291cmllciBOZXcnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnR2FyYW1vbmQnIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnSW1wYWN0JyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ0x1Y2lkYSBIYW5kd3JpdGluZyddIDsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdUaW1lcyBOZXcgUm9tYW4nIF07CisgICAgICAgIHB1c2ggQGZvbnRzLCBbIDEyLCAnU3ltYm9sJyBdOworICAgICAgICBwdXNoIEBmb250cywgWyAxMiwgJ1dpbmdkaW5ncycgXTsKKyAgICAgICAgcHVzaCBAZm9udHMsIFsgMTIsICdBIGZvbnQgdGhhdCBkb2VzblwndCBleGlzdCcgXTsKKyAgICAKKyAgICAgICAgbXkgJGk7CisgICAgICAgIGZvcmVhY2ggbXkgJGZvbnQgKEBmb250cyl7CisgICAgICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgCisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfc2l6ZSgkZm9udC0+WzBdKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9mb250KCRmb250LT5bMV0pOworICAgIAorICAgICAgICAgICAgJGkrKzsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAwLCAkZm9udC0+WzFdLCAkZm9ybWF0KTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRpLCAxLCAkZm9udC0+WzBdLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGJvcmRlciBzdHlsZXMuCisgICAgIworICAgIHN1YiBib3JkZXJzIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQm9yZGVycycpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDQsIDEwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbig1LCA1LCA0MCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAiU3R5bGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDUsICJUaGUgc3R5bGUgaXMgaGlnaGxpZ2h0ZWQgaW4gcmVkIGZvciAiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDUsICJlbXBoYXNpcywgdGhlIGRlZmF1bHQgY29sb3IgaXMgYmxhY2suIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDAuLjEzKXsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9ib3JkZXIoJGkpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2JvcmRlcl9jb2xvcigncmVkJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMCwgJGksICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAzLCAiQm9yZGVyIiwgJGZvcm1hdCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMzAsIDAsICJEaWFnIHR5cGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCAzLCAiU3R5bGUiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMwLCA1LCAiRGlhZ29uYWwgQm9kZXIgc3R5bGVzIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDEuLjMpeworICAgICAgICAgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICAgICAgJGZvcm1hdC0+c2V0X2RpYWdfdHlwZSgkaSk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZGlhZ19ib3JkZXIoMSk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZGlhZ19jb2xvcigncmVkJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDAsICRpLCAgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgICRjZW50ZXIpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzE1KSksIDMsICJCb3JkZXIiLCAkZm9ybWF0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNlbGwgcGF0dGVybnMuCisgICAgIworICAgIHN1YiBwYXR0ZXJucyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhdHRlcm5zJyk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNCwgMTApOworICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDUsIDUsIDUwKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAiSW5kZXgiLCAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJQYXR0ZXJuIiwgJGhlYWRpbmcpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA1LCAiVGhlIGJhY2tncm91bmQgY29sb3VyIGhhcyBiZWVuIHNldCB0byBzaWx2ZXIuIiwgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCA1LCAiVGhlIGZvcmVncm91bmQgY29sb3VyIGhhcyBiZWVuIHNldCB0byBncmVlbi4iLCAgJGhlYWRpbmcpOworICAgIAorICAgICAgICBmb3IgbXkgJGkgKDAuLjE4KXsKKyAgICAgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9wYXR0ZXJuKCRpKTsKKyAgICAgICAgICAgICRmb3JtYXQtPnNldF9iZ19jb2xvcignc2lsdmVyJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfZmdfY29sb3IoJ2dyZWVuJyk7CisgICAgICAgICAgICAkZm9ybWF0LT5zZXRfYWxpZ24oJ2NlbnRlcicpOworICAgIAorICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoKDIqKCRpKzEpKSwgMCwgJGksICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCgyKigkaSsxKSksIDEsIHNwcmludGYoIjB4JTAyWCIsICRpKSwgJGNlbnRlcik7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCAzLCAiUGF0dGVybiIsICRmb3JtYXQpOworICAgIAorICAgICAgICAgICAgaWYgKCRpID09IDEpIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgoMiooJGkrMSkpLCA1LCAiVGhpcyBpcyBzb2xpZCBjb2xvdXIsIHRoZSBtb3N0IHVzZWZ1bCBwYXR0ZXJuLiIsICRoZWFkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNlbGwgYWxpZ25tZW50cy4KKyAgICAjCisgICAgc3ViIGFsaWdubWVudCB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0FsaWdubWVudCcpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDAsIDcsIDEyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCA0MCk7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oNywgMCk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQwMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDAzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDggPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA5ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxMCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDEyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxMyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDE1ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQxNiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MTcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDAyLT5zZXRfYWxpZ24oJ3RvcCcpOworICAgICAgICAkZm9ybWF0MDMtPnNldF9hbGlnbignYm90dG9tJyk7CisgICAgICAgICRmb3JtYXQwNC0+c2V0X2FsaWduKCd2Y2VudGVyJyk7CisgICAgICAgICRmb3JtYXQwNS0+c2V0X2FsaWduKCd2anVzdGlmeScpOworICAgICAgICAkZm9ybWF0MDYtPnNldF90ZXh0X3dyYXAoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDA3LT5zZXRfYWxpZ24oJ2xlZnQnKTsKKyAgICAgICAgJGZvcm1hdDA4LT5zZXRfYWxpZ24oJ3JpZ2h0Jyk7CisgICAgICAgICRmb3JtYXQwOS0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAgICAgJGZvcm1hdDEwLT5zZXRfYWxpZ24oJ2ZpbGwnKTsKKyAgICAgICAgJGZvcm1hdDExLT5zZXRfYWxpZ24oJ2p1c3RpZnknKTsKKyAgICAgICAgJGZvcm1hdDEyLT5zZXRfbWVyZ2UoKTsKKyAgICAKKyAgICAgICAgJGZvcm1hdDEzLT5zZXRfcm90YXRpb24oNDUpOworICAgICAgICAkZm9ybWF0MTQtPnNldF9yb3RhdGlvbigtNDUpOworICAgICAgICAkZm9ybWF0MTUtPnNldF9yb3RhdGlvbigyNzApOworICAgIAorICAgICAgICAkZm9ybWF0MTYtPnNldF9zaHJpbmsoKTsKKyAgICAgICAgJGZvcm1hdDE3LT5zZXRfaW5kZW50KDEpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnVmVydGljYWwnLCAgICAgJGhlYWRpbmcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAndG9wJywgICAgICAgICAgJGZvcm1hdDAyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ2JvdHRvbScsICAgICAgICRmb3JtYXQwMyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICd2Y2VudGVyJywgICAgICAkZm9ybWF0MDQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgwLCA0LCAndmp1c3RpZnknLCAgICAgJGZvcm1hdDA1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgNSwgInRleHRcbndyYXAiLCAgICRmb3JtYXQwNik7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdIb3Jpem9udGFsJywgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDEsICdsZWZ0JywgICAgICAgICAkZm9ybWF0MDcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAyLCAncmlnaHQnLCAgICAgICAgJGZvcm1hdDA4KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMywgJ2NlbnRlcicsICAgICAgICRmb3JtYXQwOSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDQsICdmaWxsJywgICAgICAgICAkZm9ybWF0MTApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCA1LCAnanVzdGlmeScsICAgICAgJGZvcm1hdDExKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMSwgJ21lcmdlJywgICAgICAgICRmb3JtYXQxMik7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDIsICcnLCAgICAgICAgICAgICAkZm9ybWF0MTIpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAzLCAnU2hyaW5rICcgeCAzLCAgJGZvcm1hdDE2KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgNCwgJ0luZGVudCcsICAgICAgICRmb3JtYXQxNyk7CisgICAgCisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDAsICdSb3RhdGlvbicsICAgICAkaGVhZGluZyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDEsICdSb3RhdGUgNDUnLCAgICAkZm9ybWF0MTMpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg2LCAxLCAnUm90YXRlIC00NScsICAgJGZvcm1hdDE0KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNywgMSwgJ1JvdGF0ZSAyNzAnLCAgICRmb3JtYXQxNSk7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBEZW1vbnN0cmF0ZSBvdGhlciBtaXNjZWxsYW5lb3VzIGZlYXR1cmVzLgorICAgICMKKyAgICBzdWIgbWlzYyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ01pc2NlbGxhbmVvdXMnKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigyLCAyLCAyNSk7CisgICAgCisgICAgICAgIG15ICRmb3JtYXQwMSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDAzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAgICAgbXkgJGZvcm1hdDA2ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgIG15ICRmb3JtYXQwNyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgICAgICAkZm9ybWF0MDEtPnNldF91bmRlcmxpbmUoMHgwMSk7CisgICAgICAgICRmb3JtYXQwMi0+c2V0X3VuZGVybGluZSgweDAyKTsKKyAgICAgICAgJGZvcm1hdDAzLT5zZXRfdW5kZXJsaW5lKDB4MjEpOworICAgICAgICAkZm9ybWF0MDQtPnNldF91bmRlcmxpbmUoMHgyMik7CisgICAgICAgICRmb3JtYXQwNS0+c2V0X2ZvbnRfc3RyaWtlb3V0KCk7CisgICAgICAgICRmb3JtYXQwNi0+c2V0X2ZvbnRfb3V0bGluZSgpOworICAgICAgICAkZm9ybWF0MDctPnNldF9mb250X3NoYWRvdygpOworICAgIAorICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAgMiwgJ1VuZGVybGluZSAgMHgwMScsICAgICAgICAgICRmb3JtYXQwMSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsICAyLCAnVW5kZXJsaW5lICAweDAyJywgICAgICAgICAgJGZvcm1hdDAyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgIDIsICdVbmRlcmxpbmUgIDB4MjEnLCAgICAgICAgICAkZm9ybWF0MDMpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAgMiwgJ1VuZGVybGluZSAgMHgyMicsICAgICAgICAgICRmb3JtYXQwNCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDksICAyLCAnU3RyaWtlb3V0JywgICAgICAgICAgICAgICAgJGZvcm1hdDA1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMTEsIDIsICdPdXRsaW5lIChNYWNpbnRvc2ggb25seSknLCAkZm9ybWF0MDYpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgxMywgMiwgJ1NoYWRvdyAoTWFjaW50b3NoIG9ubHkpJywgICRmb3JtYXQwNyk7CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZm9ybWF0cy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGJ1Z19yZXBvcnQucGwKKworCisKK0EgdGVtcGxhdGUgZm9yIHN1Ym1pdHRpbmcgYSBidWcgcmVwb3J0LgorCitSdW4gdGhpcyBwcm9ncmFtIGFuZCByZWFkIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHRlbXBsYXRlIGZvciBzdWJtaXR0aW5nIGEgYnVnIHJlcG9ydC4KKyAgICAjCisgICAgIyBSdW4gdGhpcyBwcm9ncmFtIGFuZCByZWFkIHRoZSBvdXRwdXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgCisgICAgcHJpbnQgPDwgJ0hJTlRTXzEnOworICAgIAorICAgIFJFUE9SVElORyBBIEJVRyBPUiBBU0tJTkcgQSBRVUVTVElPTgorICAgIAorICAgICAgICBGZWVsIGZyZWUgdG8gcmVwb3J0IGJ1Z3Mgb3IgYXNrIHF1ZXN0aW9ucy4gSG93ZXZlciwgdG8gc2F2ZSB0aW1lCisgICAgICAgIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgc3RlcHMgZmlyc3Q6CisgICAgCisgICAgICAgIFJlYWQgdGhlIGRvY3VtZW50YXRpb246CisgICAgCisgICAgICAgICAgICBUaGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiByZWZpbmVkIGluCisgICAgICAgICAgICByZXNwb25zZSB0byB1c2VyIHF1ZXN0aW9ucy4gVGhlcmVmb3JlLCBpZiB5b3UgaGF2ZSBhIHF1ZXN0aW9uIGl0IGlzCisgICAgICAgICAgICBwb3NzaWJsZSB0aGF0IHNvbWVvbmUgZWxzZSBoYXMgYXNrZWQgaXQgYmVmb3JlIHlvdSBhbmQgdGhhdCBpdCBpcworICAgICAgICAgICAgYWxyZWFkeSBhZGRyZXNzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFNpbmNlIHRoZXJlIGlzIGEgbG90IG9mCisgICAgICAgICAgICBkb2N1bWVudGF0aW9uIHRvIGdldCB0aHJvdWdoIHlvdSBzaG91bGQgYXQgbGVhc3QgcmVhZCB0aGUgdGFibGUgb2YKKyAgICAgICAgICAgIGNvbnRlbnRzIGFuZCBzZWFyY2ggZm9yIGtleXdvcmRzIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkIGluLgorICAgIAorICAgICAgICBMb29rIGF0IHRoZSBleGFtcGxlIHByb2dyYW1zOgorICAgIAorICAgICAgICAgICAgVGhlcmUgYXJlIG92ZXIgNzAgZXhhbXBsZSBwcm9ncmFtcyBzaGlwcGVkIHdpdGggdGhlIHN0YW5kYXJkCisgICAgICAgICAgICBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkaXN0cmlidXRpb24uIE1hbnkgb2YgdGhlc2Ugd2VyZSBjcmVhdGVkIGluCisgICAgICAgICAgICByZXNwb25zZSB0byB1c2VyIHF1ZXN0aW9ucy4gVHJ5IHRvIGlkZW50aWZ5IGFuIGV4YW1wbGUgcHJvZ3JhbSB0aGF0CisgICAgICAgICAgICBjb3JyZXNwb25kcyB0byB5b3VyIHF1ZXJ5IGFuZCBhZGFwdCBpdCB0byB5b3VyIG5lZWRzLgorICAgIAorICAgIEhJTlRTXzEKKyAgICBwcmludCAiUHJlc3MgZW50ZXIgLi4uIjsgPFNURElOPjsKKyAgICAKKyAgICBwcmludCA8PCAnSElOVFNfMic7CisgICAgCisgICAgICAgIElmIHlvdSBzdWJtaXQgYSBidWcgcmVwb3J0IGhlcmUgYXJlIHNvbWUgcG9pbnRlcnMuCisgICAgCisgICAgICAgIDEuICBQdXQgIldyaXRlRXhjZWw6IiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdWJqZWN0IGxpbmUuIFRoaXMgaGVscHMKKyAgICAgICAgICAgIHRvIGZpbHRlciBnZW51aW5lIG1lc3NhZ2VzIGZyb20gc3BhbS4KKyAgICAKKyAgICAgICAgMi4gIERlc2NyaWJlIHRoZSBwcm9ibGVtcyBhcyBjbGVhcmx5IGFuZCBhcyBjb25jaXNlbHkgYXMgcG9zc2libGUuCisgICAgCisgICAgICAgIDMuICBTZW5kIGEgc2FtcGxlIHByb2dyYW0uIEl0IGlzIG9mdGVuIGVhc2llciB0byBkZXNjcmliZSBhIHByb2JsZW0gaW4KKyAgICAgICAgICAgIGNvZGUgdGhhbiBpbiB3cml0dGVuIHByb3NlLgorICAgIAorICAgICAgICA0LiAgVGhlIHNhbXBsZSBwcm9ncmFtIHNob3VsZCBiZSBhcyBzbWFsbCBhcyBwb3NzaWJsZSB0byBkZW1vbnN0cmF0ZSB0aGUKKyAgICAgICAgICAgIHByb2JsZW0uIERvbid0IGNvcHkgYW5kIHBhc3QgbGFyZ2Ugc2VjdGlvbnMgb2YgeW91ciBwcm9ncmFtLiBUaGUKKyAgICAgICAgICAgIHByb2dyYW0gc2hvdWxkIGFsc28gYmUgc2VsZiBjb250YWluZWQgYW5kIHdvcmtpbmcuCisgICAgCisgICAgICAgIEEgc2FtcGxlIGJ1ZyByZXBvcnQgaXMgZ2VuZXJhdGVkIGJlbG93LiBJZiB5b3UgdXNlIHRoaXMgZm9ybWF0IHRoZW4gaXQKKyAgICAgICAgd2lsbCBoZWxwIHRvIGFuYWx5c2UgeW91ciBxdWVzdGlvbiBhbmQgcmVzcG9uZCB0byBpdCBtb3JlIHF1aWNrbHkuCisgICAgCisgICAgICAgIFBsZWFzZSBkb24ndCBzZW5kIHBhdGNoZXMgd2l0aG91dCBjb250YWN0aW5nIHRoZSBhdXRob3IgZmlyc3QuCisgICAgCisgICAgCisgICAgSElOVFNfMgorICAgIHByaW50ICJQcmVzcyBlbnRlciAuLi4iOyA8U1RESU4+OworICAgIAorICAgIAorICAgIHByaW50IDw8ICdFTUFJTCc7CisgICAgCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAKKyAgICBUbzogICAgICBKb2huIE1jTmFtYXJhIDxqbWNuYW1hcmFAY3Bhbi5vcmc+CisgICAgU3ViamVjdDogV3JpdGVFeGNlbDogUHJvYmxlbSB3aXRoIHNvbWV0aGluZy4KKyAgICAKKyAgICBIaSBKb2huLAorICAgIAorICAgIEkgYW0gdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIEkgaGF2ZSBlbmNvdW50ZXJlZCBhIHByb2JsZW0uIEkKKyAgICB3YW50IGl0IHRvIGRvIFNPTUVUSElORyBidXQgdGhlIG1vZHVsZSBhcHBlYXJzIHRvIGRvIFNPTUVUSElOR19FTFNFLgorICAgIAorICAgIEhlcmUgaXMgc29tZSBjb2RlIHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtLgorICAgIAorICAgICAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAgICAgdXNlIHN0cmljdDsKKyAgICAgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicmVsb2FkLnhscyIpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAgICAgX19FTkRfXworICAgIAorICAgIAorICAgIEkgdGVzdGVkIHVzaW5nIEV4Y2VsIFhYIChvciBHbnVtZXJpYyBvciBPcGVuT2ZmaWNlLm9yZykuCisgICAgCisgICAgTXkgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgc3lzdGVtIGRldGFpbHMgYXJlIGFzIGZvbGxvd3M6CisgICAgRU1BSUwKKyAgICAKKyAgICAKKyAgICBwcmludCAiXG4gICAgUGVybCB2ZXJzaW9uICAgOiAkXSI7CisgICAgcHJpbnQgIlxuICAgIE9TIG5hbWUgICAgICAgIDogJF5PIjsKKyAgICBwcmludCAiXG4gICAgTW9kdWxlIHZlcnNpb25zOiAobm90IGFsbCBhcmUgcmVxdWlyZWQpXG4iOworICAgIAorICAgIAorICAgIG15IEBtb2R1bGVzID0gcXcoCisgICAgICAgICAgICAgICAgICAgICAgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyAgICAgICAgICAgICAgICAgICAgICBTcHJlYWRzaGVldDo6UGFyc2VFeGNlbAorICAgICAgICAgICAgICAgICAgICAgIE9MRTo6U3RvcmFnZV9MaXRlCisgICAgICAgICAgICAgICAgICAgICAgUGFyc2U6OlJlY0Rlc2NlbnQKKyAgICAgICAgICAgICAgICAgICAgICBGaWxlOjpUZW1wCisgICAgICAgICAgICAgICAgICAgICAgRGlnZXN0OjpNRDQKKyAgICAgICAgICAgICAgICAgICAgICBEaWdlc3Q6OlBlcmw6Ok1ENAorICAgICAgICAgICAgICAgICAgICAgIERpZ2VzdDo6TUQ1CisgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgZm9yIG15ICRtb2R1bGUgKEBtb2R1bGVzKSB7CisgICAgICAgIG15ICR2ZXJzaW9uOworICAgICAgICBldmFsICJyZXF1aXJlICRtb2R1bGUiOworICAgIAorICAgICAgICBpZiAobm90ICRAKSB7CisgICAgICAgICAgICAkdmVyc2lvbiA9ICRtb2R1bGUtPlZFUlNJT047CisgICAgICAgICAgICAkdmVyc2lvbiA9ICcodW5rbm93biknIGlmIG5vdCBkZWZpbmVkICR2ZXJzaW9uOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJHZlcnNpb24gPSAnKG5vdCBpbnN0YWxsZWQpJzsKKyAgICAgICAgfQorICAgIAorICAgICAgICBwcmludGYgIiUyMXMlLTI0c1x0JXNcbiIsICIiLCAkbW9kdWxlLCAkdmVyc2lvbjsKKyAgICB9CisgICAgCisgICAgCisgICAgcHJpbnQgPDwgIkJZRSI7CisgICAgWW91cnMgZXRjLiwKKyAgICAKKyAgICBBLiBQZXJzb24KKyAgICAtLQorICAgIAorICAgIEJZRQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvYnVnX3JlcG9ydC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGF1dG9maWx0ZXIucGwKKworCisKK0FuIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhdXRvZmlsdGVycyB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitBbiBhdXRvZmlsdGVyIGlzIGEgd2F5IG9mIGFkZGluZyBkcm9wIGRvd24gbGlzdHMgdG8gdGhlIGhlYWRlcnMgb2YgYSAyRCByYW5nZQorb2Ygd29ya3NoZWV0IGRhdGEuIFRoaXMgaXMgdHVybiBhbGxvdyB1c2VycyB0byBmaWx0ZXIgdGhlIGRhdGEgYmFzZWQgb24KK3NpbXBsZSBjcml0ZXJpYSBzbyB0aGF0IHNvbWUgZGF0YSBpcyBzaG93biBhbmQgc29tZSBpcyBoaWRkZW4uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2F1dG9maWx0ZXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhdXRvZmlsdGVyLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiBob3cgdG8gY3JlYXRlIGF1dG9maWx0ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgQW4gYXV0b2ZpbHRlciBpcyBhIHdheSBvZiBhZGRpbmcgZHJvcCBkb3duIGxpc3RzIHRvIHRoZSBoZWFkZXJzIG9mIGEgMkQgcmFuZ2UKKyAgICAjIG9mIHdvcmtzaGVldCBkYXRhLiBUaGlzIGlzIHR1cm4gYWxsb3cgdXNlcnMgdG8gZmlsdGVyIHRoZSBkYXRhIGJhc2VkIG9uCisgICAgIyBzaW1wbGUgY3JpdGVyaWEgc28gdGhhdCBzb21lIGRhdGEgaXMgc2hvd24gYW5kIHNvbWUgaXMgaGlkZGVuLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDcsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2F1dG9maWx0ZXIueGxzJyk7CisgICAgCisgICAgZGllICJDb3VsZG4ndCBjcmVhdGUgbmV3IEV4Y2VsIGZpbGU6ICQhLlxuIiB1bmxlc3MgZGVmaW5lZCAkd29ya2Jvb2s7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ2ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgbXkgJGJvbGQgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIEV4dHJhY3QgdGhlIGRhdGEgZW1iZWRkZWQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuCisgICAgbXkgQGhlYWRpbmdzID0gc3BsaXQgJyAnLCA8REFUQT47CisgICAgbXkgQGRhdGE7CisgICAgcHVzaCBAZGF0YSwgW3NwbGl0XSB3aGlsZSA8REFUQT47CisgICAgCisgICAgCisgICAgIyBTZXQgdXAgc2V2ZXJhbCBzaGVldHMgd2l0aCB0aGUgc2FtZSBkYXRhLgorICAgIGZvciBteSAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6RCcsIDEyKTsKKyAgICAgICAgJHdvcmtzaGVldC0+c2V0X3JvdygwLCAyMCwgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCBcQGhlYWRpbmdzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQXV0b2ZpbHRlciB3aXRob3V0IGNvbmRpdGlvbnMuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQxLT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0EyJywgW1tAZGF0YV1dKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQXV0b2ZpbHRlciB3aXRoIGEgZmlsdGVyIGNvbmRpdGlvbiBpbiB0aGUgZmlyc3QgY29sdW1uLgorICAgICMKKyAgICAKKyAgICAjIFRoZSByYW5nZSBpbiB0aGlzIGV4YW1wbGUgaXMgdGhlIHNhbWUgYXMgYWJvdmUgYnV0IGluIHJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgJHdvcmtzaGVldDItPmF1dG9maWx0ZXIoMCwgMCwgNTAsIDMpOworICAgIAorICAgICMgVGhlIHBsYWNlaG9sZGVyICJSZWdpb24iIGluIHRoZSBmaWx0ZXIgaXMgaWdub3JlZCBhbmQgY2FuIGJlIGFueSBzdHJpbmcKKyAgICAjIHRoYXQgYWRkcyBjbGFyaXR5IHRvIHRoZSBleHByZXNzaW9uLgorICAgICMKKyAgICAkd29ya3NoZWV0Mi0+ZmlsdGVyX2NvbHVtbigwLCAnUmVnaW9uIGVxIEVhc3QnKTsKKyAgICAKKyAgICAjCisgICAgIyBIaWRlIHRoZSByb3dzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGZpbHRlciBjcml0ZXJpYS4KKyAgICAjCisgICAgbXkgJHJvdyA9IDE7CisgICAgCisgICAgZm9yIG15ICRyb3dfZGF0YSAoQGRhdGEpIHsKKyAgICAgICAgbXkgJHJlZ2lvbiA9ICRyb3dfZGF0YS0+WzBdOworICAgIAorICAgICAgICBpZiAoJHJlZ2lvbiBlcSAnRWFzdCcpIHsKKyAgICAgICAgICAgICMgUm93IGlzIHZpc2libGUuCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIEhpZGUgcm93LgorICAgICAgICAgICAgJHdvcmtzaGVldDItPnNldF9yb3coJHJvdywgdW5kZWYsIHVuZGVmLCAxKTsKKyAgICAgICAgfQorICAgIAorICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJHJvdysrLCAwLCAkcm93X2RhdGEpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gQXV0b2ZpbHRlciB3aXRoIGEgZHVhbCBmaWx0ZXIgY29uZGl0aW9uIGluIG9uZSBvZiB0aGUgY29sdW1ucy4KKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDMtPmF1dG9maWx0ZXIoJ0ExOkQ1MScpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5maWx0ZXJfY29sdW1uKCdBJywgJ3ggZXEgRWFzdCBvciB4IGVxIFNvdXRoJyk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAKKyAgICAgICAgaWYgKCRyZWdpb24gZXEgJ0Vhc3QnIG9yICRyZWdpb24gZXEgJ1NvdXRoJykgeworICAgICAgICAgICAgIyBSb3cgaXMgdmlzaWJsZS4KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgSGlkZSByb3cuCisgICAgICAgICAgICAkd29ya3NoZWV0My0+c2V0X3Jvdygkcm93LCB1bmRlZiwgdW5kZWYsIDEpOworICAgICAgICB9CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgkcm93KyssIDAsICRyb3dfZGF0YSk7CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBBdXRvZmlsdGVyIHdpdGggZmlsdGVyIGNvbmRpdGlvbnMgaW4gdHdvIGNvbHVtbnMuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+ZmlsdGVyX2NvbHVtbignQScsICd4IGVxIEVhc3QnKTsKKyAgICAkd29ya3NoZWV0NC0+ZmlsdGVyX2NvbHVtbignQycsICd4ID4gMzAwMCBhbmQgeCA8IDgwMDAnICk7CisgICAgCisgICAgIworICAgICMgSGlkZSB0aGUgcm93cyB0aGF0IGRvbid0IG1hdGNoIHRoZSBmaWx0ZXIgY3JpdGVyaWEuCisgICAgIworICAgICRyb3cgPSAxOworICAgIAorICAgIGZvciBteSAkcm93X2RhdGEgKEBkYXRhKSB7CisgICAgICAgIG15ICRyZWdpb24gPSAkcm93X2RhdGEtPlswXTsKKyAgICAgICAgbXkgJHZvbHVtZSA9ICRyb3dfZGF0YS0+WzJdOworICAgIAorICAgICAgICBpZiAoJHJlZ2lvbiBlcSAnRWFzdCcgYW5kCisgICAgICAgICAgICAkdm9sdW1lID4gIDMwMDAgICBhbmQgJHZvbHVtZSA8IDgwMDAKKyAgICAgICAgKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIEF1dG9maWx0ZXIgd2l0aCBmaWx0ZXIgZm9yIGJsYW5rcy4KKyAgICAjCisgICAgCisgICAgIyBDcmVhdGUgYSBibGFuayBjZWxsIGluIG91ciB0ZXN0IGRhdGEuCisgICAgJGRhdGFbNV0tPlswXSA9ICcnOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQ1LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0NS0+ZmlsdGVyX2NvbHVtbignQScsICd4ID09IEJsYW5rcycpOworICAgIAorICAgICMKKyAgICAjIEhpZGUgdGhlIHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNyaXRlcmlhLgorICAgICMKKyAgICAkcm93ID0gMTsKKyAgICAKKyAgICBmb3IgbXkgJHJvd19kYXRhIChAZGF0YSkgeworICAgICAgICBteSAkcmVnaW9uID0gJHJvd19kYXRhLT5bMF07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIGVxICcnKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ1LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDUtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjCisgICAgIyBFeGFtcGxlIDYuIEF1dG9maWx0ZXIgd2l0aCBmaWx0ZXIgZm9yIG5vbi1ibGFua3MuCisgICAgIworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQ2LT5hdXRvZmlsdGVyKCdBMTpENTEnKTsKKyAgICAkd29ya3NoZWV0Ni0+ZmlsdGVyX2NvbHVtbignQScsICd4ID09IE5vbkJsYW5rcycpOworICAgIAorICAgICMKKyAgICAjIEhpZGUgdGhlIHJvd3MgdGhhdCBkb24ndCBtYXRjaCB0aGUgZmlsdGVyIGNyaXRlcmlhLgorICAgICMKKyAgICAkcm93ID0gMTsKKyAgICAKKyAgICBmb3IgbXkgJHJvd19kYXRhIChAZGF0YSkgeworICAgICAgICBteSAkcmVnaW9uID0gJHJvd19kYXRhLT5bMF07CisgICAgCisgICAgICAgIGlmICgkcmVnaW9uIG5lICcnKQorICAgICAgICB7CisgICAgICAgICAgICAjIFJvdyBpcyB2aXNpYmxlLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBIaWRlIHJvdy4KKyAgICAgICAgICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KCRyb3csIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDYtPndyaXRlKCRyb3crKywgMCwgJHJvd19kYXRhKTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgX19EQVRBX18KKyAgICBSZWdpb24gICAgSXRlbSAgICAgIFZvbHVtZSAgICBNb250aAorICAgIEVhc3QgICAgICBBcHBsZSAgICAgOTAwMCAgICAgIEp1bHkKKyAgICBFYXN0ICAgICAgQXBwbGUgICAgIDUwMDAgICAgICBKdWx5CisgICAgU291dGggICAgIE9yYW5nZSAgICA5MDAwICAgICAgU2VwdGVtYmVyCisgICAgTm9ydGggICAgIEFwcGxlICAgICAyMDAwICAgICAgTm92ZW1iZXIKKyAgICBXZXN0ICAgICAgQXBwbGUgICAgIDkwMDAgICAgICBOb3ZlbWJlcgorICAgIFNvdXRoICAgICBQZWFyICAgICAgNzAwMCAgICAgIE9jdG9iZXIKKyAgICBOb3J0aCAgICAgUGVhciAgICAgIDkwMDAgICAgICBBdWd1c3QKKyAgICBXZXN0ICAgICAgT3JhbmdlICAgIDEwMDAgICAgICBEZWNlbWJlcgorICAgIFdlc3QgICAgICBHcmFwZSAgICAgMTAwMCAgICAgIE5vdmVtYmVyCisgICAgU291dGggICAgIFBlYXIgICAgICAxMDAwMCAgICAgQXByaWwKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDYwMDAgICAgICBKYW51YXJ5CisgICAgU291dGggICAgIE9yYW5nZSAgICAzMDAwICAgICAgTWF5CisgICAgTm9ydGggICAgIEFwcGxlICAgICAzMDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDcwMDAgICAgICBGZWJydWFyeQorICAgIFdlc3QgICAgICBHcmFwZSAgICAgMTAwMCAgICAgIERlY2VtYmVyCisgICAgRWFzdCAgICAgIEdyYXBlICAgICA4MDAwICAgICAgRmVicnVhcnkKKyAgICBTb3V0aCAgICAgR3JhcGUgICAgIDEwMDAwICAgICBKdW5lCisgICAgV2VzdCAgICAgIFBlYXIgICAgICA3MDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDIwMDAgICAgICBPY3RvYmVyCisgICAgRWFzdCAgICAgIEdyYXBlICAgICA3MDAwICAgICAgRGVjZW1iZXIKKyAgICBOb3J0aCAgICAgR3JhcGUgICAgIDYwMDAgICAgICBBcHJpbAorICAgIEVhc3QgICAgICBQZWFyICAgICAgODAwMCAgICAgIEZlYnJ1YXJ5CisgICAgTm9ydGggICAgIEFwcGxlICAgICA3MDAwICAgICAgQXVndXN0CisgICAgTm9ydGggICAgIE9yYW5nZSAgICA3MDAwICAgICAgSnVseQorICAgIE5vcnRoICAgICBBcHBsZSAgICAgNjAwMCAgICAgIEp1bmUKKyAgICBTb3V0aCAgICAgR3JhcGUgICAgIDgwMDAgICAgICBTZXB0ZW1iZXIKKyAgICBXZXN0ICAgICAgQXBwbGUgICAgIDMwMDAgICAgICBPY3RvYmVyCisgICAgU291dGggICAgIE9yYW5nZSAgICAxMDAwMCAgICAgTm92ZW1iZXIKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDQwMDAgICAgICBKdWx5CisgICAgTm9ydGggICAgIE9yYW5nZSAgICA1MDAwICAgICAgQXVndXN0CisgICAgRWFzdCAgICAgIE9yYW5nZSAgICAxMDAwICAgICAgTm92ZW1iZXIKKyAgICBFYXN0ICAgICAgT3JhbmdlICAgIDQwMDAgICAgICBPY3RvYmVyCisgICAgTm9ydGggICAgIEdyYXBlICAgICA1MDAwICAgICAgQXVndXN0CisgICAgRWFzdCAgICAgIEFwcGxlICAgICAxMDAwICAgICAgRGVjZW1iZXIKKyAgICBTb3V0aCAgICAgQXBwbGUgICAgIDEwMDAwICAgICBNYXJjaAorICAgIEVhc3QgICAgICBHcmFwZSAgICAgNzAwMCAgICAgIE9jdG9iZXIKKyAgICBXZXN0ICAgICAgR3JhcGUgICAgIDEwMDAgICAgICBTZXB0ZW1iZXIKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDEwMDAwICAgICBPY3RvYmVyCisgICAgU291dGggICAgIE9yYW5nZSAgICA4MDAwICAgICAgTWFyY2gKKyAgICBOb3J0aCAgICAgQXBwbGUgICAgIDQwMDAgICAgICBKdWx5CisgICAgU291dGggICAgIE9yYW5nZSAgICA1MDAwICAgICAgSnVseQorICAgIFdlc3QgICAgICBBcHBsZSAgICAgNDAwMCAgICAgIEp1bmUKKyAgICBFYXN0ICAgICAgQXBwbGUgICAgIDUwMDAgICAgICBBcHJpbAorICAgIE5vcnRoICAgICBQZWFyICAgICAgMzAwMCAgICAgIEF1Z3VzdAorICAgIEVhc3QgICAgICBHcmFwZSAgICAgOTAwMCAgICAgIE5vdmVtYmVyCisgICAgTm9ydGggICAgIE9yYW5nZSAgICA4MDAwICAgICAgT2N0b2JlcgorICAgIEVhc3QgICAgICBBcHBsZSAgICAgMTAwMDAgICAgIEp1bmUKKyAgICBTb3V0aCAgICAgUGVhciAgICAgIDEwMDAgICAgICBEZWNlbWJlcgorICAgIE5vcnRoICAgICBHcmFwZSAgICAgMTAwMDAgICAgIEp1bHkKKyAgICBFYXN0ICAgICAgR3JhcGUgICAgIDYwMDAgICAgICBGZWJydWFyeQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hdXRvZmlsdGVyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogYXV0b2ZpdC5wbAorCisKKworU2ltdWxhdGUgRXhjZWwncyBhdXRvZml0IGZvciBjb2x1bW4gd2lkdGhzLgorCitFeGNlbCBwcm92aWRlcyBhIGZ1bmN0aW9uIGNhbGxlZCBBdXRvZml0IChGb3JtYXQtPkNvbHVtbnMtPkF1dG9maXQpIHRoYXQKK2FkanVzdHMgY29sdW1uIHdpZHRocyB0byBtYXRjaCB0aGUgbGVuZ3RoIG9mIHRoZSBsb25nZXN0IHN0cmluZyBpbiBhIGNvbHVtbi4KK0V4Y2VsIGNhbGN1bGF0ZXMgdGhlc2Ugd2lkdGhzIGF0IHJ1biB0aW1lIHdoZW4gaXQgaGFzIGFjY2VzcyB0byBpbmZvcm1hdGlvbgorYWJvdXQgc3RyaW5nIGxlbmd0aHMgYW5kIGZvbnQgaW5mb3JtYXRpb24uIFRoaXMgZnVuY3Rpb24gaXMgKm5vdCogYSBmZWF0dXJlCitvZiB0aGUgZmlsZSBmb3JtYXQgYW5kIHRodXMgY2Fubm90IGJlIGltcGxlbWVudGVkIGJ5IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitIb3dldmVyLCB3ZSBjYW4gbWFrZSBhbiBhdHRlbXB0IHRvIHNpbXVsYXRlIGl0IGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCitsb25nZXN0IHN0cmluZyB3cml0dGVuIHRvIGVhY2ggY29sdW1uIGFuZCB0aGVuIGFkanVzdGluZyB0aGUgY29sdW1uIHdpZHRocworcHJpb3IgdG8gY2xvc2luZyB0aGUgZmlsZS4KKworV2Uga2VlcCB0cmFjayBvZiB0aGUgbG9uZ2VzdCBzdHJpbmdzIGJ5IGFkZGluZyBhIGhhbmRsZXIgdG8gdGhlIHdyaXRlKCkKK2Z1bmN0aW9uLiBTZWUgYWRkX2hhbmRsZXIoKSBpbiB0aGUgUzo6V0UgZG9jcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVGhlIG1haW4gcHJvYmxlbSB3aXRoIHRyeWluZyB0byBzaW11bGF0ZSBBdXRvZml0IGxpZXMgaW4gZGVmaW5pbmcgYQorcmVsYXRpb25zaGlwIGJldHdlZW4gYSBzdHJpbmcgbGVuZ3RoIGFuZCBpdHMgd2lkdGggaW4gYSBhcmJpdHJhcnkgZm9udCBhbmQKK3NpemUuIFdlIHVzZSB0d28gYXBwcm9hY2hlcyBiZWxvdy4gVGhlIGZpcnN0IGlzIGEgc2ltcGxlIGRpcmVjdCByZWxhdGlvbnNoaXAKK29idGFpbmVkIGJ5IHRyaWFsIGFuZCBlcnJvci4gVGhlIHNlY29uZCBpcyBhIHNsaWdodGx5IG1vcmUgc29waGlzdGljYXRlZAorbWV0aG9kIHVzaW5nIGFuIGV4dGVybmFsIG1vZHVsZS4gRm9yIG1vcmUgY29tcGxpY2F0ZWQgYXBwbGljYXRpb25zIHlvdSB3aWxsCitwcm9iYWJseSBoYXZlIHRvIHdvcmsgb3V0IHlvdXIgb3duIG1ldGhvZHMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2F1dG9maXQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBhdXRvZml0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaW11bGF0ZSBFeGNlbCdzIGF1dG9maXQgZm9yIGNvbHVtbiB3aWR0aHMuCisgICAgIworICAgICMgRXhjZWwgcHJvdmlkZXMgYSBmdW5jdGlvbiBjYWxsZWQgQXV0b2ZpdCAoRm9ybWF0LT5Db2x1bW5zLT5BdXRvZml0KSB0aGF0CisgICAgIyBhZGp1c3RzIGNvbHVtbiB3aWR0aHMgdG8gbWF0Y2ggdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gYSBjb2x1bW4uCisgICAgIyBFeGNlbCBjYWxjdWxhdGVzIHRoZXNlIHdpZHRocyBhdCBydW4gdGltZSB3aGVuIGl0IGhhcyBhY2Nlc3MgdG8gaW5mb3JtYXRpb24KKyAgICAjIGFib3V0IHN0cmluZyBsZW5ndGhzIGFuZCBmb250IGluZm9ybWF0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzICpub3QqIGEgZmVhdHVyZQorICAgICMgb2YgdGhlIGZpbGUgZm9ybWF0IGFuZCB0aHVzIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBieSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBIb3dldmVyLCB3ZSBjYW4gbWFrZSBhbiBhdHRlbXB0IHRvIHNpbXVsYXRlIGl0IGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCisgICAgIyBsb25nZXN0IHN0cmluZyB3cml0dGVuIHRvIGVhY2ggY29sdW1uIGFuZCB0aGVuIGFkanVzdGluZyB0aGUgY29sdW1uIHdpZHRocworICAgICMgcHJpb3IgdG8gY2xvc2luZyB0aGUgZmlsZS4KKyAgICAjCisgICAgIyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsb25nZXN0IHN0cmluZ3MgYnkgYWRkaW5nIGEgaGFuZGxlciB0byB0aGUgd3JpdGUoKQorICAgICMgZnVuY3Rpb24uIFNlZSBhZGRfaGFuZGxlcigpIGluIHRoZSBTOjpXRSBkb2NzIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICMKKyAgICAjIFRoZSBtYWluIHByb2JsZW0gd2l0aCB0cnlpbmcgdG8gc2ltdWxhdGUgQXV0b2ZpdCBsaWVzIGluIGRlZmluaW5nIGEKKyAgICAjIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgc3RyaW5nIGxlbmd0aCBhbmQgaXRzIHdpZHRoIGluIGEgYXJiaXRyYXJ5IGZvbnQgYW5kCisgICAgIyBzaXplLiBXZSB1c2UgdHdvIGFwcHJvYWNoZXMgYmVsb3cuIFRoZSBmaXJzdCBpcyBhIHNpbXBsZSBkaXJlY3QgcmVsYXRpb25zaGlwCisgICAgIyBvYnRhaW5lZCBieSB0cmlhbCBhbmQgZXJyb3IuIFRoZSBzZWNvbmQgaXMgYSBzbGlnaHRseSBtb3JlIHNvcGhpc3RpY2F0ZWQKKyAgICAjIG1ldGhvZCB1c2luZyBhbiBleHRlcm5hbCBtb2R1bGUuIEZvciBtb3JlIGNvbXBsaWNhdGVkIGFwcGxpY2F0aW9ucyB5b3Ugd2lsbAorICAgICMgcHJvYmFibHkgaGF2ZSB0byB3b3JrIG91dCB5b3VyIG93biBtZXRob2RzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdhdXRvZml0LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIHRvIHN0b3JlIHRoZSB3aWR0aCBvZiB0aGUgbG9uZ2VzdCBzdHJpbmcgd3JpdHRlbiB0byBhIGNvbHVtbi4KKyAgICAjIFdlIHVzZSB0aGUgc3RvcmVkIHdpZHRoIHRvIHNpbXVsYXRlIGFuIGF1dG9maXQgb2YgdGhlIGNvbHVtbiB3aWR0aHMuCisgICAgIworICAgICMgWW91IHNob3VsZCBkbyB0aGlzIGZvciBldmVyeSB3b3Jrc2hlZXQgeW91IHdhbnQgdG8gYXV0b2ZpdC4KKyAgICAjCisgICAgJHdvcmtzaGVldC0+YWRkX3dyaXRlX2hhbmRsZXIocXJbXHddLCBcJnN0b3JlX3N0cmluZ193aWR0aHMpOworICAgIAorICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdIZWxsbycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICdIZWxsbyBXb3JsZCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICdIZWxsbycpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdGMScsICdUaGlzIGlzIGEgbG9uZyBzdHJpbmcgYXMgYW4gZXhhbXBsZS4nKTsKKyAgICAKKyAgICAjIFJ1biB0aGUgYXV0b2ZpdCBhZnRlciB5b3UgaGF2ZSBmaW5pc2hlZCB3cml0aW5nIHN0cmluZ3MgdG8gdGhlIHdvcmtib29rLgorICAgIGF1dG9maXRfY29sdW1ucygkd29ya3NoZWV0KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRnVuY3Rpb25zIHVzZWQgZm9yIEF1dG9maXQuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQWRqdXN0IHRoZSBjb2x1bW4gd2lkdGhzIHRvIGZpdCB0aGUgbG9uZ2VzdCBzdHJpbmcgaW4gdGhlIGNvbHVtbi4KKyAgICAjCisgICAgc3ViIGF1dG9maXRfY29sdW1ucyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9IDA7CisgICAgCisgICAgICAgIGZvciBteSAkd2lkdGggKEB7JHdvcmtzaGVldC0+e19fY29sX3dpZHRoc319KSB7CisgICAgCisgICAgICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCRjb2wsICRjb2wsICR3aWR0aCkgaWYgJHdpZHRoOworICAgICAgICAgICAgJGNvbCsrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIGEgY2FsbGJhY2sgdGhhdCB3YXMgYWRkZWQgdmlhIGFkZF93cml0ZV9oYW5kbGVyKCkKKyAgICAjIGFib3ZlLiBJdCBtb2RpZmllcyB0aGUgd3JpdGUoKSBmdW5jdGlvbiBzbyB0aGF0IGl0IHN0b3JlcyB0aGUgbWF4aW11bQorICAgICMgdW53cmFwcGVkIHdpZHRoIG9mIGEgc3RyaW5nIGluIGEgY29sdW1uLgorICAgICMKKyAgICBzdWIgc3RvcmVfc3RyaW5nX3dpZHRocyB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOworICAgICAgICBteSAkdG9rZW4gICAgID0gJF9bMl07CisgICAgCisgICAgICAgICMgSWdub3JlIHNvbWUgdG9rZW5zIHRoYXQgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4uCisgICAgICAgIHJldHVybiBpZiBub3QgZGVmaW5lZCAkdG9rZW47ICAgICAgICMgSWdub3JlIHVuZGVmcy4KKyAgICAgICAgcmV0dXJuIGlmICR0b2tlbiBlcSAnJzsgICAgICAgICAgICAgIyBJZ25vcmUgYmxhbmsgY2VsbHMuCisgICAgICAgIHJldHVybiBpZiByZWYgJHRva2VuIGVxICdBUlJBWSc7ICAgICMgSWdub3JlIGFycmF5IHJlZnMuCisgICAgICAgIHJldHVybiBpZiAkdG9rZW4gPX4gL149LzsgICAgICAgICAgICMgSWdub3JlIGZvcm11bGEKKyAgICAKKyAgICAgICAgIyBJZ25vcmUgbnVtYmVycworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvOworICAgIAorICAgICAgICAjIElnbm9yZSB2YXJpb3VzIGludGVybmFsIGFuZCBleHRlcm5hbCBoeXBlcmxpbmtzLiBJbiBhIHJlYWwgc2NlbmFyaW8KKyAgICAgICAgIyB5b3UgbWF5IHdpc2ggdG8gdHJhY2sgdGhlIGxlbmd0aCBvZiB0aGUgb3B0aW9uYWwgc3RyaW5ncyB1c2VkIHdpdGgKKyAgICAgICAgIyB1cmxzLgorICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17XltmaF10dD9wcz86Ly99OworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17Xm1haWx0bzp9OworICAgICAgICByZXR1cm4gaWYgJHRva2VuID1+IG17Xig/OmlufGV4KXRlcm5hbDp9OworICAgIAorICAgIAorICAgICAgICAjIFdlIHN0b3JlIHRoZSBzdHJpbmcgd2lkdGggYXMgZGF0YSBpbiB0aGUgV29ya3NoZWV0IG9iamVjdC4gV2UgdXNlCisgICAgICAgICMgYSBkb3VibGUgdW5kZXJzY29yZSBrZXkgbmFtZSB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBmdXR1cmUgbmFtZXMuCisgICAgICAgICMKKyAgICAgICAgbXkgJG9sZF93aWR0aCAgICA9ICR3b3Jrc2hlZXQtPntfX2NvbF93aWR0aHN9LT5bJGNvbF07CisgICAgICAgIG15ICRzdHJpbmdfd2lkdGggPSBzdHJpbmdfd2lkdGgoJHRva2VuKTsKKyAgICAKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRvbGRfd2lkdGggb3IgJHN0cmluZ193aWR0aCA+ICRvbGRfd2lkdGgpIHsKKyAgICAgICAgICAgICMgWW91IG1heSB3aXNoIHRvIHNldCBhIG1pbmltdW0gY29sdW1uIHdpZHRoIGFzIGZvbGxvd3MuCisgICAgICAgICAgICAjcmV0dXJuIHVuZGVmIGlmICRzdHJpbmdfd2lkdGggPCAxMDsKKyAgICAKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfX2NvbF93aWR0aHN9LT5bJGNvbF0gPSAkc3RyaW5nX3dpZHRoOworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICMgUmV0dXJuIGNvbnRyb2wgdG8gd3JpdGUoKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVmVyeSBzaW1wbGUgY29udmVyc2lvbiBiZXR3ZWVuIHN0cmluZyBsZW5ndGggYW5kIHN0cmluZyB3aWR0aCBmb3IgQXJpYWwgMTAuCisgICAgIyBTZWUgYmVsb3cgZm9yIGEgbW9yZSBzb3BoaXN0aWNhdGVkIG1ldGhvZC4KKyAgICAjCisgICAgc3ViIHN0cmluZ193aWR0aCB7CisgICAgCisgICAgICAgIHJldHVybiAwLjkgKiBsZW5ndGggJF9bMF07CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiB1c2VzIGFuIGV4dGVybmFsIG1vZHVsZSB0byBnZXQgYSBtb3JlIGFjY3VyYXRlIHdpZHRoIGZvciBhCisgICAgIyBzdHJpbmcuIE5vdGUgdGhhdCBpbiBhIHJlYWwgcHJvZ3JhbSB5b3UgY291bGQgInVzZSIgdGhlIG1vZHVsZSBpbnN0ZWFkIG9mCisgICAgIyAicmVxdWlyZSItaW5nIGl0IGFuZCB5b3UgY291bGQgbWFrZSB0aGUgRm9udCBvYmplY3QgZ2xvYmFsIHRvIGF2b2lkIHJlcGVhdGVkCisgICAgIyBpbml0aWFsaXNhdGlvbi4KKyAgICAjCisgICAgIyBOb3RlIGFsc28gdGhhdCB0aGUgJHBpeGVsX3dpZHRoIHRvICRjZWxsX3dpZHRoIGlzIHNwZWNpZmljIHRvIEFyaWFsLiBGb3IKKyAgICAjIG90aGVyIGZvbnRzIHlvdSBzaG91bGQgY2FsY3VsYXRlIGFwcHJvcHJpYXRlIHJlbGF0aW9uc2hpcHMuIEEgZnV0dXJlIHZlcnNpb24KKyAgICAjIG9mIFM6OldFIHdpbGwgcHJvdmlkZSBhIHdheSBvZiBzcGVjaWZ5aW5nIGNvbHVtbiB3aWR0aHMgaW4gcGl4ZWxzIGluc3RlYWQgb2YKKyAgICAjIGNlbGwgdW5pdHMgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhpcyBjb252ZXJzaW9uLgorICAgICMKKyAgICBzdWIgc3RyaW5nX3dpZHRoIHsKKyAgICAKKyAgICAgICAgcmVxdWlyZSBGb250OjpUVEZNZXRyaWNzOworICAgIAorICAgICAgICBteSAkYXJpYWwgICAgICAgID0gRm9udDo6VFRGTWV0cmljcy0+bmV3KCdjOlx3aW5kb3dzXGZvbnRzXGFyaWFsLnR0ZicpOworICAgIAorICAgICAgICBteSAkZm9udF9zaXplICAgID0gMTA7CisgICAgICAgIG15ICRkcGkgICAgICAgICAgPSA5NjsKKyAgICAgICAgbXkgJHVuaXRzX3Blcl9lbSA9ICRhcmlhbC0+Z2V0X3VuaXRzX3Blcl9lbSgpOworICAgICAgICBteSAkZm9udF93aWR0aCAgID0gJGFyaWFsLT5zdHJpbmdfd2lkdGgoJF9bMF0pOworICAgIAorICAgICAgICAjIENvbnZlcnQgdG8gcGl4ZWxzIGFzIHBlciBUVEZNZXRyaWNzIGRvY3MuCisgICAgICAgIG15ICRwaXhlbF93aWR0aCAgPSA2ICsgJGZvbnRfd2lkdGggKiRmb250X3NpemUgKiRkcGkgLyg3MiAqJHVuaXRzX3Blcl9lbSk7CisgICAgCisgICAgICAgICMgQWRkIGV4dHJhIHBpeGVscyBmb3IgYm9yZGVyIGFyb3VuZCB0ZXh0LgorICAgICAgICAkcGl4ZWxfd2lkdGggICs9IDY7CisgICAgCisgICAgICAgICMgQ29udmVydCB0byBjZWxsIHdpZHRoIChmb3IgQXJpYWwpIGFuZCBmb3IgY2VsbCB3aWR0aHMgPiAxLgorICAgICAgICBteSAkY2VsbF93aWR0aCAgID0gKCRwaXhlbF93aWR0aCAtNSkgLzc7CisgICAgCisgICAgICAgIHJldHVybiAkY2VsbF93aWR0aDsKKyAgICAKKyAgICB9CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9hdXRvZml0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogYmlnZmlsZS5wbAorCisKKworRXhhbXBsZSBvZiBjcmVhdGluZyBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlCitkZWZhdWx0IDdNQiBsaW1pdC4KKworVGhpcyBpcyBleGFjdGx5IHRoYXQgc2FtZSBhcyBhbnkgb3RoZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcHJvZ3JhbSBleGNlcHQKK3RoYXQgaXMgcmVxdWlyZXMgdGhhdCB0aGUgT0xFOjpTdG9yYWdlIG1vZHVsZSBpcyBpbnN0YWxsZWQuCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9iaWdmaWxlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gYmlnZmlsZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgY3JlYXRpbmcgYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0aGF0IGlzIGxhcmdlciB0aGFuIHRoZQorICAgICMgZGVmYXVsdCA3TUIgbGltaXQuCisgICAgIworICAgICMgVGhpcyBpcyBleGFjdGx5IHRoYXQgc2FtZSBhcyBhbnkgb3RoZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgcHJvZ3JhbSBleGNlcHQKKyAgICAjIHRoYXQgaXMgcmVxdWlyZXMgdGhhdCB0aGUgT0xFOjpTdG9yYWdlIG1vZHVsZSBpcyBpbnN0YWxsZWQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKYW4gMjAwNywgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2JpZ2ZpbGUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgNTAsIDE4KTsKKyAgICAKKyAgICBmb3IgbXkgJGNvbCAoMCAuLiA1MCkgeworICAgICAgICBmb3IgbXkgJHJvdyAoMCAuLiA2MDAwKSB7CisgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAkY29sLCAiUm93OiAkcm93IENvbDogJGNvbCIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvYmlnZmlsZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNnaS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorZmlsZSB0byBhIGJyb3dzZXIgaW4gYSBDR0kgcHJvZ3JhbS4KKworT24gV2luZG93cyB0aGUgaGFzaC1iYW5nIGxpbmUgc2hvdWxkIGJlIHNvbWV0aGluZyBsaWtlOgorCisgICAgIyFDOlxQZXJsXGJpblxwZXJsLmV4ZQorCitUaGUgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGxpbmUgd2lsbCBjYXVzZSBhIHByb21wdCB0byBiZSBnZW5lcmF0ZWQgdG8gc2F2ZQordGhlIGZpbGUuIElmIHlvdSB3YW50IHRvIHN0cmVhbSB0aGUgZmlsZSB0byB0aGUgYnJvd3NlciBpbnN0ZWFkLCBjb21tZW50IG91dAordGhhdCBsaW5lIGFzIHNob3duIGJlbG93LgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byBzZW5kIGFuIEV4Y2VsCisgICAgIyBmaWxlIHRvIGEgYnJvd3NlciBpbiBhIENHSSBwcm9ncmFtLgorICAgICMKKyAgICAjIE9uIFdpbmRvd3MgdGhlIGhhc2gtYmFuZyBsaW5lIHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZToKKyAgICAjCisgICAgIyAgICAgIyFDOlxQZXJsXGJpblxwZXJsLmV4ZQorICAgICMKKyAgICAjIFRoZSAiQ29udGVudC1EaXNwb3NpdGlvbiIgbGluZSB3aWxsIGNhdXNlIGEgcHJvbXB0IHRvIGJlIGdlbmVyYXRlZCB0byBzYXZlCisgICAgIyB0aGUgZmlsZS4gSWYgeW91IHdhbnQgdG8gc3RyZWFtIHRoZSBmaWxlIHRvIHRoZSBicm93c2VyIGluc3RlYWQsIGNvbW1lbnQgb3V0CisgICAgIyB0aGF0IGxpbmUgYXMgc2hvd24gYmVsb3cuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBTZXQgdGhlIGZpbGVuYW1lIGFuZCBzZW5kIHRoZSBjb250ZW50IHR5cGUKKyAgICBteSAkZmlsZW5hbWUgPSJjZ2l0ZXN0LnhscyI7CisgICAgCisgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXG4iOworICAgICMgVGhlIENvbnRlbnQtRGlzcG9zaXRpb24gd2lsbCBnZW5lcmF0ZSBhIHByb21wdCB0byBzYXZlIHRoZSBmaWxlLiBJZiB5b3Ugd2FudAorICAgICMgdG8gc3RyZWFtIHRoZSBmaWxlIHRvIHRoZSBicm93c2VyLCBjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGxpbmUuCisgICAgcHJpbnQgIkNvbnRlbnQtRGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSRmaWxlbmFtZVxuIjsKKyAgICBwcmludCAiXG4iOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQuIFRoZSBzcGVjaWFsIFBlcmwgZmlsZWhhbmRsZSAtIHdpbGwKKyAgICAjIHJlZGlyZWN0IHRoZSBvdXRwdXQgdG8gU1RET1VUCisgICAgIworICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCItIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLCAwLCAyMCk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X2JvbGQoKTsKKyAgICAkZm9ybWF0LT5zZXRfc2l6ZSgxNSk7CisgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0byB0aGUgd29ya2Jvb2sKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAiSGkgRXhjZWwhIiwgJGZvcm1hdCk7CisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jZ2kucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9hcmVhLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIEFyZWEgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9hcmVhLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfYXJlYS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgQXJlYSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9hcmVhLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnYXJlYScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdhcmVhJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2FyZWEnLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfYXJlYS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X2Jhci5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBCYXIgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9iYXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9iYXIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIEJhciBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9iYXIueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzIDEnLCAnVmFsdWVzIDInIF07CisgICAgbXkgJGRhdGEgPSBbCisgICAgICAgIFsgMiwgMywgNCwgNSwgNiwgNyBdLAorICAgICAgICBbIDEsIDQsIDUsIDIsIDEsIDUgXSwKKyAgICAgICAgWyAzLCA2LCA3LCA1LCA0LCAzIF0sCisgICAgXTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0ExJywgJGhlYWRpbmdzLCAkYm9sZCApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTInLCAkZGF0YSApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDEuIEEgbWluaW1hbCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0MSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisgICAgCisgICAgIyBBZGQgdmFsdWVzIG9ubHkuIFVzZSB0aGUgZGVmYXVsdCBjYXRlZ29yaWVzLgorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQSBtaW5pbWFsIGNoYXJ0IHdpdGggdXNlciBzcGVjaWZpZWQgY2F0ZWdvcmllcyAoWCBheGlzKQorICAgICMgICAgICAgICAgICBhbmQgYSBzZXJpZXMgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0My0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQzLT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDMtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHNlcmllcyBhbmQgd2l0aCBhCisgICAgIyAgICAgICAgICAgIHVzZXIgc3BlY2lmaWVkIGNoYXJ0IHNoZWV0IG5hbWUuCisgICAgIworICAgIG15ICRjaGFydDQgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggbmFtZSA9PiAnUmVzdWx0cyBDaGFydCcsIHR5cGUgPT4gJ2JhcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYW5vdGhlciBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIFNhbWUgYXMgRXhhbXBsZSAzIGJ1dCBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0NSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdiYXInLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfYmFyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfY29sdW1uLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIENvbHVtbiBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X2NvbHVtbi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X2NvbHVtbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgQ29sdW1uIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDksIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X2NvbHVtbi54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMgMScsICdWYWx1ZXMgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhZGRlZCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgIworICAgIG15ICRjaGFydDMgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQzLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDMtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0My0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgc2VyaWVzIGFuZCB3aXRoIGEKKyAgICAjICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAnY29sdW1uJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2NvbHVtbicsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgc29tZSBsYWJlbHMuCisgICAgJGNoYXJ0NS0+c2V0X3RpdGxlKCBuYW1lID0+ICdSZXN1bHRzIG9mIHNhbXBsZSBhbmFseXNpcycgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeF9heGlzKCBuYW1lID0+ICdTYW1wbGUgbnVtYmVyJyApOworICAgICRjaGFydDUtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBsZW5ndGggKGNtKScgKTsKKyAgICAKKyAgICAjIEluc2VydCB0aGUgY2hhcnQgaW50byB0aGUgbWFpbiB3b3Jrc2hlZXQuCisgICAgJHdvcmtzaGVldC0+aW5zZXJ0X2NoYXJ0KCAnRTInLCAkY2hhcnQ1ICk7CisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jaGFydF9jb2x1bW4ucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9saW5lLnBsCisKKworCitBIHNpbXBsZSBkZW1vIG9mIExpbmUgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9saW5lLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfbGluZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGRlbW8gb2YgTGluZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9saW5lLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGJvbGQgICAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggYm9sZCA9PiAxICk7CisgICAgCisgICAgIyBBZGQgdGhlIHdvcmtzaGVldCBkYXRhIHRoYXQgdGhlIGNoYXJ0cyB3aWxsIHJlZmVyIHRvLgorICAgIG15ICRoZWFkaW5ncyA9IFsgJ0NhdGVnb3J5JywgJ1ZhbHVlcyAxJywgJ1ZhbHVlcyAyJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbIDIsIDMsIDQsIDUsIDYsIDcgXSwKKyAgICAgICAgWyAxLCA0LCA1LCAyLCAxLCA1IF0sCisgICAgICAgIFsgMywgNiwgNywgNSwgNCwgMyBdLAorICAgIF07CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMScsICRoZWFkaW5ncywgJGJvbGQgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJ0EyJywgJGRhdGEgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBBIG1pbmltYWwgY2hhcnQuCisgICAgIworICAgIG15ICRjaGFydDEgPSAkd29ya2Jvb2stPmFkZF9jaGFydCggdHlwZSA9PiAnbGluZScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNycgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIChYIGF4aXMpCisgICAgIyAgICAgICAgICAgIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDMuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYWRkZWQgdGl0bGUgYW5kIGF4ZXMgbGFiZWxzLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQzLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0My0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQzLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCBidXQgd2l0aCBhbiBhZGRlZCBzZXJpZXMgYW5kIHdpdGggYQorICAgICMgICAgICAgICAgICB1c2VyIHNwZWNpZmllZCBjaGFydCBzaGVldCBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQ0ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIG5hbWUgPT4gJ1Jlc3VsdHMgQ2hhcnQnLCB0eXBlID0+ICdsaW5lJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhbm90aGVyIHNlcmllcy4KKyAgICAkY2hhcnQ0LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEMkMjokQyQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAyJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NC0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ0LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ2xpbmUnLCBlbWJlZGRlZCA9PiAxICk7CisgICAgCisgICAgIyBDb25maWd1cmUgdGhlIHNlcmllcy4KKyAgICAkY2hhcnQ1LT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkNycsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQ3JywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnVGVzdCBkYXRhIHNlcmllcyAxJywKKyAgICApOworICAgIAorICAgICMgQWRkIHNvbWUgbGFiZWxzLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUmVzdWx0cyBvZiBzYW1wbGUgYW5hbHlzaXMnICk7CisgICAgJGNoYXJ0NS0+c2V0X3hfYXhpcyggbmFtZSA9PiAnU2FtcGxlIG51bWJlcicgKTsKKyAgICAkY2hhcnQ1LT5zZXRfeV9heGlzKCBuYW1lID0+ICdTYW1wbGUgbGVuZ3RoIChjbSknICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0UyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfbGluZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNoYXJ0X3BpZS5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBQaWUgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jaGFydF9waWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjaGFydF9waWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFBpZSBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBEZWNlbWJlciAyMDA5LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoICdjaGFydF9waWUueGxzJyApOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkYm9sZCAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCBib2xkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgd29ya3NoZWV0IGRhdGEgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uCisgICAgbXkgJGhlYWRpbmdzID0gWyAnQ2F0ZWdvcnknLCAnVmFsdWVzJyBdOworICAgIG15ICRkYXRhID0gWworICAgICAgICBbICdBcHBsZScsICdDaGVycnknLCAnUGVjYW4nIF0sCisgICAgICAgIFsgNjAsICAgICAgIDMwLCAgICAgICAxMCAgICAgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIEFkZCB2YWx1ZXMgb25seS4gVXNlIHRoZSBkZWZhdWx0IGNhdGVnb3JpZXMuCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcyggdmFsdWVzID0+ICc9U2hlZXQxISRCJDI6JEIkNCcgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBBIG1pbmltYWwgY2hhcnQgd2l0aCB1c2VyIHNwZWNpZmllZCBjYXRlZ29yaWVzIGFuZCBhIHNlcmllcyBuYW1lLgorICAgICMKKyAgICBteSAkY2hhcnQyID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFuIGFkZGVkIHRpdGxlLgorICAgICMKKyAgICBteSAkY2hhcnQzID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDMtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDMtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gU2FtZSBhcyBwcmV2aW91cyBjaGFydCB3aXRoIGEgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAncGllJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDQnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1BpZSBzYWxlcyBkYXRhJywKKyAgICApOworICAgIAorICAgICMgVGhlIG90aGVyIGNoYXJ0XyoucGwgZXhhbXBsZXMgYWRkIGEgc2Vjb25kIHNlcmllcyBpbiBleGFtcGxlIDQgYnV0IGFkZGl0aW9uYWwKKyAgICAjIHNlcmllcyBhcmVuJ3QgcGxvdHRlZCBpbiBhIHBpZSBjaGFydC4KKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDQtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNS4gU2FtZSBhcyBFeGFtcGxlIDMgYnV0IGFzIGFuIGVtYmVkZGVkIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQ1ID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3BpZScsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDUtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ0JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDQnLAorICAgICAgICBuYW1lICAgICAgID0+ICdQaWUgc2FsZXMgZGF0YScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIHRpdGxlLgorICAgICRjaGFydDUtPnNldF90aXRsZSggbmFtZSA9PiAnUG9wdWxhciBQaWUgVHlwZXMnICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0QyJywgJGNoYXJ0NSApOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hhcnRfcGllLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hhcnRfc2NhdHRlci5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBTY2F0dGVyIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY2hhcnRfc2NhdHRlci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGNoYXJ0X3NjYXR0ZXIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFNjYXR0ZXIgY2hhcnRzIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRGVjZW1iZXIgMjAwOSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCAnY2hhcnRfc2NhdHRlci54bHMnICk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgPT4gMSApOworICAgIAorICAgICMgQWRkIHRoZSB3b3Jrc2hlZXQgZGF0YSB0aGF0IHRoZSBjaGFydHMgd2lsbCByZWZlciB0by4KKyAgICBteSAkaGVhZGluZ3MgPSBbICdDYXRlZ29yeScsICdWYWx1ZXMgMScsICdWYWx1ZXMgMicgXTsKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgWyAyLCAzLCA0LCA1LCA2LCA3IF0sCisgICAgICAgIFsgMSwgNCwgNSwgMiwgMSwgNSBdLAorICAgICAgICBbIDMsIDYsIDcsIDUsIDQsIDMgXSwKKyAgICBdOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCAnQTEnLCAkaGVhZGluZ3MsICRib2xkICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoICdBMicsICRkYXRhICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBtaW5pbWFsIGNoYXJ0LgorICAgICMKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3NjYXR0ZXInICk7CisgICAgCisgICAgIyBBZGQgdmFsdWVzIG9ubHkuIFVzZSB0aGUgZGVmYXVsdCBjYXRlZ29yaWVzLgorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoIHZhbHVlcyA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnICk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMi4gQSBtaW5pbWFsIGNoYXJ0IHdpdGggdXNlciBzcGVjaWZpZWQgY2F0ZWdvcmllcyAoWCBheGlzKQorICAgICMgICAgICAgICAgICBhbmQgYSBzZXJpZXMgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzLiBTYW1lIGFzIHByZXZpb3VzIGNoYXJ0IGJ1dCB3aXRoIGFkZGVkIHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAjCisgICAgbXkgJGNoYXJ0MyA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJyApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0My0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQzLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDMtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0My0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQuIFNhbWUgYXMgcHJldmlvdXMgY2hhcnQgYnV0IHdpdGggYW4gYWRkZWQgc2VyaWVzIGFuZCB3aXRoIGEKKyAgICAjICAgICAgICAgICAgdXNlciBzcGVjaWZpZWQgY2hhcnQgc2hlZXQgbmFtZS4KKyAgICAjCisgICAgbXkgJGNoYXJ0NCA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCBuYW1lID0+ICdSZXN1bHRzIENoYXJ0JywgdHlwZSA9PiAnc2NhdHRlcicgKTsKKyAgICAKKyAgICAjIENvbmZpZ3VyZSB0aGUgc2VyaWVzLgorICAgICRjaGFydDQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQ3JywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDcnLAorICAgICAgICBuYW1lICAgICAgID0+ICdUZXN0IGRhdGEgc2VyaWVzIDEnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYW5vdGhlciBzZXJpZXMuCisgICAgJGNoYXJ0NC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMicsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ0LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDQtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NC0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIFNhbWUgYXMgRXhhbXBsZSAzIGJ1dCBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgbXkgJGNoYXJ0NSA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzY2F0dGVyJywgZW1iZWRkZWQgPT4gMSApOworICAgIAorICAgICMgQ29uZmlndXJlIHRoZSBzZXJpZXMuCisgICAgJGNoYXJ0NS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDcnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRCJDI6JEIkNycsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ1Rlc3QgZGF0YSBzZXJpZXMgMScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBzb21lIGxhYmVscy4KKyAgICAkY2hhcnQ1LT5zZXRfdGl0bGUoIG5hbWUgPT4gJ1Jlc3VsdHMgb2Ygc2FtcGxlIGFuYWx5c2lzJyApOworICAgICRjaGFydDUtPnNldF94X2F4aXMoIG5hbWUgPT4gJ1NhbXBsZSBudW1iZXInICk7CisgICAgJGNoYXJ0NS0+c2V0X3lfYXhpcyggbmFtZSA9PiAnU2FtcGxlIGxlbmd0aCAoY20pJyApOworICAgIAorICAgICMgSW5zZXJ0IHRoZSBjaGFydCBpbnRvIHRoZSBtYWluIHdvcmtzaGVldC4KKyAgICAkd29ya3NoZWV0LT5pbnNlcnRfY2hhcnQoICdFMicsICRjaGFydDUgKTsKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NoYXJ0X3NjYXR0ZXIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjaGFydF9zdG9jay5wbAorCisKKworQSBzaW1wbGUgZGVtbyBvZiBTdG9jayBjaGFydHMgaW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoYXJ0X3N0b2NrLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hhcnRfc3RvY2sucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBkZW1vIG9mIFN0b2NrIGNoYXJ0cyBpbiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCfCqScpLCBKYW51YXJ5IDIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyggJ2NoYXJ0X3N0b2NrLnhscycgKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNldCB1cCB0aGUgZGF0YSB3b3Jrc2hlZXQgdGhhdCB0aGUgY2hhcnRzIHdpbGwgcmVmZXIgdG8uIFdlIHJlYWQgdGhlIGV4YW1wbGUKKyAgICAjIGRhdGEgZnJvbSB0aGUgX19EQVRBX18gc2VjdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLiBUaGlzIHNpbXVsYXRlcworICAgICMgcmVhZGluZyB0aGUgZGF0YSBmcm9tIGEgZGF0YWJhc2Ugb3Igb3RoZXIgc291cmNlLgorICAgICMKKyAgICAjIFRoZSBkZWZhdWx0IEV4Y2VsIFN0b2NrIGNoYXJ0IGlzIGFuIE9wZW4tSGlnaC1Mb3ctQ2xvc2UgY2hhcnQuIFRoZXJlZm9yZQorICAgICMgd2Ugd2lsbCBuZWVkIGRhdGEgZm9yIGVhY2ggb2YgdGhvc2Ugc2VyaWVzLgorICAgICMKKyAgICAjIFRoZSBsYXlvdXQgb2YgdGhlIF9fREFUQV9fIHNlY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgbGF5b3V0IG9mIHRoZSB3b3Jrc2hlZXQuCisgICAgIworICAgIAorICAgICMgQWRkIHNvbWUgZm9ybWF0cy4KKyAgICBteSAkYm9sZCAgICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoIGJvbGQgICAgICAgPT4gMSApOworICAgIG15ICRkYXRlX2Zvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCggbnVtX2Zvcm1hdCA9PiAnZGQvbW0veXl5eScgKTsKKyAgICAKKyAgICAjIEluY3JlYXNlIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIHVzZWQgZm9yIGRhdGUgdG8gbWFrZSBpdCBjbGVhcmVyLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oICdBOkEnLCAxMiApOworICAgIAorICAgICMgUmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBfX0RBVEFfXyBzZWN0aW9uIGF0IHRoZSBlbmQuIEluIGEgcmVhbCBleGFtcGxlIHRoaXMKKyAgICAjIHdvdWxkIHByb2JhYmx5IGJlIGEgZGF0YWJhc2UgcXVlcnkuCisgICAgbXkgQHN0b2NrX2RhdGE7CisgICAgCisgICAgd2hpbGUgKCA8REFUQT4gKSB7CisgICAgICAgIG5leHQgdW5sZXNzIC9cUy87ICAgICMgU2tpcCBibGFuayBsaW5lcy4KKyAgICAgICAgbmV4dCBpZiAvXiMvOyAgICAgICAgIyBTa2lwIGNvbW1lbnRzLgorICAgIAorICAgICAgICBwdXNoIEBzdG9ja19kYXRhLCBbc3BsaXRdOworICAgIH0KKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIHRvIHRoZSB3b3Jrc2hlZXQuCisgICAgbXkgJHJvdyA9IDA7CisgICAgbXkgJGNvbCA9IDA7CisgICAgCisgICAgbXkgJGhlYWRlcnMgPSBzaGlmdCBAc3RvY2tfZGF0YTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSggJHJvdysrLCAkY29sLCAkaGVhZGVycywgJGJvbGQgKTsKKyAgICAKKyAgICBmb3IgbXkgJHN0b2NrX2RhdGEgKCBAc3RvY2tfZGF0YSApIHsKKyAgICAKKyAgICAgICAgbXkgQGRhdGEgPSBAJHN0b2NrX2RhdGE7CisgICAgICAgIG15ICRkYXRlID0gc2hpZnQgQGRhdGE7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAkY29sLCAkZGF0ZSwgJGRhdGVfZm9ybWF0ICk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCAkcm93LCAkY29sICsgMSwgXEBkYXRhICk7CisgICAgCisgICAgICAgICRyb3crKzsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gQSBkZWZhdWx0IE9wZW4tSGlnaC1Mb3ctQ2xvc2UgY2hhcnQgd2l0aCBzZXJpZXMgbmFtZXMsIGF4ZXMgbGFiZWxzCisgICAgIyAgICAgICAgICAgIGFuZCBhIHRpdGxlLgorICAgICMKKyAgICAKKyAgICBteSAkY2hhcnQxID0gJHdvcmtib29rLT5hZGRfY2hhcnQoIHR5cGUgPT4gJ3N0b2NrJyApOworICAgIAorICAgICMgQWRkIGEgc2VyaWVzIGZvciBlYWNoIG9mIHRoZSBPcGVuLUhpZ2gtTG93LUNsb3NlIGNvbHVtbnMuIFRoZSBjYXRlZ29yaWVzIGFyZQorICAgICMgdGhlIGRhdGVzIGluIHRoZSBmaXJzdCBjb2x1bW4uCisgICAgCisgICAgJGNoYXJ0MS0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQiQyOiRCJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnT3BlbicsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRDJDI6JEMkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdIaWdoJywKKyAgICApOworICAgIAorICAgICRjaGFydDEtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEQkMjokRCQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ0xvdycsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQxLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISRFJDI6JEUkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdDbG9zZScsCisgICAgKTsKKyAgICAKKyAgICAjIEFkZCBhIGNoYXJ0IHRpdGxlIGFuZCBheGVzIGxhYmVscy4KKyAgICAkY2hhcnQxLT5zZXRfdGl0bGUoIG5hbWUgPT4gJ09wZW4tSGlnaC1Mb3ctQ2xvc2UnLCApOworICAgICRjaGFydDEtPnNldF94X2F4aXMoIG5hbWUgPT4gJ0RhdGUnLCApOworICAgICRjaGFydDEtPnNldF95X2F4aXMoIG5hbWUgPT4gJ1NoYXJlIHByaWNlJywgKTsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBTYW1lIGFzIHRoZSBwcmV2aW91cyBhcyBhbiBlbWJlZGRlZCBjaGFydC4KKyAgICAjCisgICAgCisgICAgbXkgJGNoYXJ0MiA9ICR3b3JrYm9vay0+YWRkX2NoYXJ0KCB0eXBlID0+ICdzdG9jaycsIGVtYmVkZGVkID0+IDEgKTsKKyAgICAKKyAgICAjIEFkZCBhIHNlcmllcyBmb3IgZWFjaCBvZiB0aGUgT3Blbi1IaWdoLUxvdy1DbG9zZSBjb2x1bW5zLiBUaGUgY2F0ZWdvcmllcyBhcmUKKyAgICAjIHRoZSBkYXRlcyBpbiB0aGUgZmlyc3QgY29sdW1uLgorICAgIAorICAgICRjaGFydDItPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgICAgIG5hbWUgICAgICAgPT4gJ09wZW4nLAorICAgICk7CisgICAgCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkQyQyOiRDJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnSGlnaCcsCisgICAgKTsKKyAgICAKKyAgICAkY2hhcnQyLT5hZGRfc2VyaWVzKAorICAgICAgICBjYXRlZ29yaWVzID0+ICc9U2hlZXQxISRBJDI6JEEkMTAnLAorICAgICAgICB2YWx1ZXMgICAgID0+ICc9U2hlZXQxISREJDI6JEQkMTAnLAorICAgICAgICBuYW1lICAgICAgID0+ICdMb3cnLAorICAgICk7CisgICAgCisgICAgJGNoYXJ0Mi0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyA9PiAnPVNoZWV0MSEkQSQyOiRBJDEwJywKKyAgICAgICAgdmFsdWVzICAgICA9PiAnPVNoZWV0MSEkRSQyOiRFJDEwJywKKyAgICAgICAgbmFtZSAgICAgICA9PiAnQ2xvc2UnLAorICAgICk7CisgICAgCisgICAgIyBBZGQgYSBjaGFydCB0aXRsZSBhbmQgYXhlcyBsYWJlbHMuCisgICAgJGNoYXJ0Mi0+c2V0X3RpdGxlKCBuYW1lID0+ICdPcGVuLUhpZ2gtTG93LUNsb3NlJywgKTsKKyAgICAkY2hhcnQyLT5zZXRfeF9heGlzKCBuYW1lID0+ICdEYXRlJywgKTsKKyAgICAkY2hhcnQyLT5zZXRfeV9heGlzKCBuYW1lID0+ICdTaGFyZSBwcmljZScsICk7CisgICAgCisgICAgIyBJbnNlcnQgdGhlIGNoYXJ0IGludG8gdGhlIG1haW4gd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPmluc2VydF9jaGFydCggJ0cyJywgJGNoYXJ0MiApOworICAgIAorICAgIAorICAgIF9fREFUQV9fCisgICAgIyBTb21lIHNhbXBsZSBzdG9jayBkYXRhIHVzZWQgZm9yIGNoYXJ0aW5nLgorICAgIERhdGUgICAgICAgIE9wZW4gICAgSGlnaCAgICBMb3cgICAgIENsb3NlCisgICAgMjAwOS0wOC0xOSAgMTAwLjAwICAxMDQuMDYgIDk1Ljk2ICAgMTAwLjM0CisgICAgMjAwOS0wOC0yMCAgMTAxLjAxICAxMDkuMDggIDEwMC41MCAgMTA4LjMxCisgICAgMjAwOS0wOC0yMyAgMTEwLjc1ICAxMTMuNDggIDEwOS4wNSAgMTA5LjQwCisgICAgMjAwOS0wOC0yNCAgMTExLjI0ICAxMTEuNjAgIDEwMy41NyAgMTA0Ljg3CisgICAgMjAwOS0wOC0yNSAgMTA0Ljk2ICAxMDguMDAgIDEwMy44OCAgMTA2LjAwCisgICAgMjAwOS0wOC0yNiAgMTA0Ljk1ICAxMDcuOTUgIDEwNC42NiAgMTA3LjkxCisgICAgMjAwOS0wOC0yNyAgMTA4LjEwICAxMDguNjIgIDEwNS42OSAgMTA2LjE1CisgICAgMjAwOS0wOC0zMCAgMTA1LjI4ICAxMDUuNDkgIDEwMi4wMSAgMTAyLjAxCisgICAgMjAwOS0wOC0zMSAgMTAyLjMwICAxMDMuNzEgIDEwMi4xNiAgMTAyLjM3CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NoYXJ0X3N0b2NrLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY2hlc3MucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHZpYQorcHJvcGVydHkgaGFzaGVzLgorCitTZXR0aW5nIGZvcm1hdCBwcm9wZXJ0aWVzIHZpYSBoYXNoZXMgb2YgdmFsdWVzIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCit0byBkZWFsIHdpdGggYSBsYXJnZSBudW1iZXIgb2Ygc2ltaWxhciBmb3JtYXRzLiBDb25zaWRlciBmb3IgZXhhbXBsZSBhCitjaGVzcyBib2FyZCBwYXR0ZXJuIHdpdGggYmxhY2sgc3F1YXJlcywgd2hpdGUgdW5mb3JtYXR0ZWQgc3F1YXJlcyBhbmQKK2EgYm9yZGVyLgorCitUaGlzIHJlbGF0aXZlbHkgc2ltcGxlIGV4YW1wbGUgcmVxdWlyZXMgMTQgc2VwYXJhdGUgRm9ybWF0CitvYmplY3RzIGFsdGhvdWdoIHRoZXJlIGFyZSBvbmx5IDUgZGlmZmVyZW50IHByb3BlcnRpZXM6IGJsYWNrCitiYWNrZ3JvdW5kLCB0b3AgYm9yZGVyLCBib3R0b20gYm9yZGVyLCBsZWZ0IGJvcmRlciBhbmQgcmlnaHQgYm9yZGVyLgorCitVc2luZyBwcm9wZXJ0eSBoYXNoZXMgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHRoZXNlIDUgc2V0cyBvZgorcHJvcGVydGllcyBhbmQgdGhlbiBhZGQgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIDE0IEZvcm1hdAorY29uZmlndXJhdGlvbnMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2NoZXNzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY2hlc3MucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHZpYQorICAgICMgcHJvcGVydHkgaGFzaGVzLgorICAgICMKKyAgICAjIFNldHRpbmcgZm9ybWF0IHByb3BlcnRpZXMgdmlhIGhhc2hlcyBvZiB2YWx1ZXMgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUKKyAgICAjIHRvIGRlYWwgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBzaW1pbGFyIGZvcm1hdHMuIENvbnNpZGVyIGZvciBleGFtcGxlIGEKKyAgICAjIGNoZXNzIGJvYXJkIHBhdHRlcm4gd2l0aCBibGFjayBzcXVhcmVzLCB3aGl0ZSB1bmZvcm1hdHRlZCBzcXVhcmVzIGFuZAorICAgICMgYSBib3JkZXIuCisgICAgIworICAgICMgVGhpcyByZWxhdGl2ZWx5IHNpbXBsZSBleGFtcGxlIHJlcXVpcmVzIDE0IHNlcGFyYXRlIEZvcm1hdAorICAgICMgb2JqZWN0cyBhbHRob3VnaCB0aGVyZSBhcmUgb25seSA1IGRpZmZlcmVudCBwcm9wZXJ0aWVzOiBibGFjaworICAgICMgYmFja2dyb3VuZCwgdG9wIGJvcmRlciwgYm90dG9tIGJvcmRlciwgbGVmdCBib3JkZXIgYW5kIHJpZ2h0IGJvcmRlci4KKyAgICAjCisgICAgIyBVc2luZyBwcm9wZXJ0eSBoYXNoZXMgaXQgaXMgcG9zc2libGUgdG8gZGVmaW5lIHRoZXNlIDUgc2V0cyBvZgorICAgICMgcHJvcGVydGllcyBhbmQgdGhlbiBhZGQgdGhlbSB0b2dldGhlciB0byBjcmVhdGUgdGhlIDE0IEZvcm1hdAorICAgICMgY29uZmlndXJhdGlvbnMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKdWx5IDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiY2hlc3MueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgU29tZSByb3cgYW5kIGNvbHVtbiBmb3JtYXR0aW5nCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpJJywgMTApOworICAgIAorICAgIGZvciBteSAkaSAoMS4uOCkgeworICAgICAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRpLCA1MCk7CisgICAgfQorICAgIAorICAgIAorICAgICMgRGVmaW5lIHRoZSBwcm9wZXJ0eSBoYXNoZXMKKyAgICAjCisgICAgbXkgJWJsYWNrID0gKAorICAgICAgICAgICAgICAgICAgICAnZmdfY29sb3InICA9PiAnYmxhY2snLAorICAgICAgICAgICAgICAgICAgICAncGF0dGVybicgICA9PiAxLAorICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgbXkgJXRvcCAgICAgPSAoICd0b3AnICAgID0+IDYgKTsKKyAgICBteSAlYm90dG9tICA9ICggJ2JvdHRvbScgPT4gNiApOworICAgIG15ICVsZWZ0ICAgID0gKCAnbGVmdCcgICA9PiA2ICk7CisgICAgbXkgJXJpZ2h0ICAgPSAoICdyaWdodCcgID0+IDYgKTsKKyAgICAKKyAgICAKKyAgICAjIERlZmluZSB0aGUgZm9ybWF0cworICAgICMKKyAgICBteSAkZm9ybWF0MDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJWxlZnQgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXRvcCwgICAgJXJpZ2h0LCAlYmxhY2sgKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MDUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWxlZnQgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDYgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJsYWNrICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDggPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXJpZ2h0LCAgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MDkgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJXJpZ2h0ICAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWxlZnQsICAgJWJsYWNrICAgICAgICAgKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MTEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJWxlZnQsICAlYmxhY2sgKTsKKyAgICBteSAkZm9ybWF0MTIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSAgICAgICAgICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTMgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJWJsYWNrICAgICAgICAgKTsKKyAgICBteSAkZm9ybWF0MTQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoJWJvdHRvbSwgJXJpZ2h0ICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIERyYXcgdGhlIHBhdHRlcm4KKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAnJywgJGZvcm1hdDAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzInLCAnJywgJGZvcm1hdDAyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnJywgJGZvcm1hdDAzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTInLCAnJywgJGZvcm1hdDA0KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzMnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDMnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTMnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjQnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzQnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDQnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTQnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjUnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzUnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDUnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTUnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjYnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzYnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDYnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTYnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjcnLCAnJywgJGZvcm1hdDEwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzcnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDcnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTcnLCAnJywgJGZvcm1hdDA5KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjgnLCAnJywgJGZvcm1hdDA1KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzgnLCAnJywgJGZvcm1hdDA2KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDgnLCAnJywgJGZvcm1hdDA3KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTgnLCAnJywgJGZvcm1hdDA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjknLCAnJywgJGZvcm1hdDExKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQzknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRTknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRjknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRzknLCAnJywgJGZvcm1hdDEyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDknLCAnJywgJGZvcm1hdDEzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSTknLCAnJywgJGZvcm1hdDE0KTsKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY2hlc3MucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBjb2xvcnMucGwKKworCisKK0RlbW9uc3RyYXRlcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCdzIG5hbWVkIGNvbG9ycyBhbmQgdGhlIEV4Y2VsIGNvbG9yCitwYWxldHRlLgorCitUaGUgc2V0X2N1c3RvbV9jb2xvcigpIFdvcmtzaGVldCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgb25lIG9mIHRoZQorYnVpbHQtaW4gcGFsZXR0ZSB2YWx1ZXMgd2l0aCBhIG1vcmUgc3VpdGFibGUgY29sb3VyLiBTZWUgdGhlIG1haW4gZG9jcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY29sb3JzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29sb3JzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlcyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCdzIG5hbWVkIGNvbG9ycyBhbmQgdGhlIEV4Y2VsIGNvbG9yCisgICAgIyBwYWxldHRlLgorICAgICMKKyAgICAjIFRoZSBzZXRfY3VzdG9tX2NvbG9yKCkgV29ya3NoZWV0IG1ldGhvZCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBvbmUgb2YgdGhlCisgICAgIyBidWlsdC1pbiBwYWxldHRlIHZhbHVlcyB3aXRoIGEgbW9yZSBzdWl0YWJsZSBjb2xvdXIuIFNlZSB0aGUgbWFpbiBkb2NzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbG9ycy54bHMiKTsKKyAgICAKKyAgICAjIFNvbWUgY29tbW9uIGZvcm1hdHMKKyAgICBteSAkY2VudGVyICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChhbGlnbiA9PiAnY2VudGVyJyk7CisgICAgbXkgJGhlYWRpbmcgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYWxpZ24gPT4gJ2NlbnRlcicsIGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlIHRoZSBuYW1lZCBjb2xvcnMuCisgICAgIworICAgIAorICAgIG15ICVjb2xvcnMgPSAoCisgICAgICAgICAgICAgICAgICAgIDB4MDgsICdibGFjaycsCisgICAgICAgICAgICAgICAgICAgIDB4MEMsICdibHVlJywKKyAgICAgICAgICAgICAgICAgICAgMHgxMCwgJ2Jyb3duJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRiwgJ2N5YW4nLAorICAgICAgICAgICAgICAgICAgICAweDE3LCAnZ3JheScsCisgICAgICAgICAgICAgICAgICAgIDB4MTEsICdncmVlbicsCisgICAgICAgICAgICAgICAgICAgIDB4MEIsICdsaW1lJywKKyAgICAgICAgICAgICAgICAgICAgMHgwRSwgJ21hZ2VudGEnLAorICAgICAgICAgICAgICAgICAgICAweDEyLCAnbmF2eScsCisgICAgICAgICAgICAgICAgICAgIDB4MzUsICdvcmFuZ2UnLAorICAgICAgICAgICAgICAgICAgICAweDIxLCAncGluaycsCisgICAgICAgICAgICAgICAgICAgIDB4MTQsICdwdXJwbGUnLAorICAgICAgICAgICAgICAgICAgICAweDBBLCAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgMHgxNiwgJ3NpbHZlcicsCisgICAgICAgICAgICAgICAgICAgIDB4MDksICd3aGl0ZScsCisgICAgICAgICAgICAgICAgICAgIDB4MEQsICd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICApOworICAgIAorICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdOYW1lZCBjb2xvcnMnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAyLCAiTmFtZSIsICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDMsICJDb2xvciIsICRoZWFkaW5nKTsKKyAgICAKKyAgICBteSAkaSA9IDE7CisgICAgCisgICAgd2hpbGUgKG15KCRpbmRleCwgJGNvbG9yKSA9IGVhY2ggJWNvbG9ycykgeworICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciA9PiAkY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgID0+IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpKzEsIDAsICRpbmRleCwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUoJGkrMSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGluZGV4KSwgJGNlbnRlcik7CisgICAgICAgICR3b3Jrc2hlZXQxLT53cml0ZSgkaSsxLCAyLCAkY29sb3IsICAgICAgICAgICAgICAgICAgICAkY2VudGVyKTsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpKzEsIDMsICcnLCAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICAgICAkaSsrOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGUgdGhlIHN0YW5kYXJkIEV4Y2VsIGNvbG9ycyBpbiB0aGUgcmFuZ2UgOC4uNjMuCisgICAgIworICAgIAorICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdTdGFuZGFyZCBjb2xvcnMnKTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbigwLCAzLCAxNSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDAsICJJbmRleCIsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMSwgIkluZGV4IiwgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAyLCAiQ29sb3IiLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDMsICJOYW1lIiwgICRoZWFkaW5nKTsKKyAgICAKKyAgICBmb3IgbXkgJGkgKDguLjYzKSB7CisgICAgICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnX2NvbG9yID0+ICRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICA9PiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgoJGkgLTcpLCAwLCAkaSwgICAgICAgICAgICAgICAgICAgICRjZW50ZXIpOworICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoKCRpIC03KSwgMSwgc3ByaW50ZigiMHglMDJYIiwgJGkpLCAkY2VudGVyKTsKKyAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCgkaSAtNyksIDIsICcnLCAgICAgICAgICAgICAgICAgICAgJGZvcm1hdCk7CisgICAgCisgICAgICAgICMgQWRkIHRoZSAgY29sb3IgbmFtZXMKKyAgICAgICAgaWYgKGV4aXN0cyAkY29sb3JzeyRpfSkgeworICAgICAgICAgICAgJHdvcmtzaGVldDItPndyaXRlKCgkaSAtNyksIDMsICRjb2xvcnN7JGl9LCAkY2VudGVyKTsKKyAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbG9ycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvbW1lbnRzMS5wbAorCisKKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB3cml0aW5nIGNlbGwgY29tbWVudHMuCisKK0EgY2VsbCBjb21tZW50IGlzIGluZGljYXRlZCBpbiBFeGNlbCBieSBhIHNtYWxsIHJlZCB0cmlhbmdsZSBpbiB0aGUgdXBwZXIKK3JpZ2h0LWhhbmQgY29ybmVyIG9mIHRoZSBjZWxsLgorCitGb3IgbW9yZSBhZHZhbmNlZCBjb21tZW50IG9wdGlvbnMgc2VlIGNvbW1lbnRzMi5wbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvY29tbWVudHMxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29tbWVudHMxLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB3cml0aW5nIGNlbGwgY29tbWVudHMuCisgICAgIworICAgICMgQSBjZWxsIGNvbW1lbnQgaXMgaW5kaWNhdGVkIGluIEV4Y2VsIGJ5IGEgc21hbGwgcmVkIHRyaWFuZ2xlIGluIHRoZSB1cHBlcgorICAgICMgcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuCisgICAgIworICAgICMgRm9yIG1vcmUgYWR2YW5jZWQgY29tbWVudCBvcHRpb25zIHNlZSBjb21tZW50czIucGwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBOb3ZlbWJlciAyMDA1LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbW1lbnRzMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAgICgnQTEnLCAnSGVsbG8nICAgICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9jb21tZW50KCdBMScsICdUaGlzIGlzIGEgY29tbWVudCcpOworICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvY29tbWVudHMxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogY29tbWVudHMyLnBsCisKKworCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKworQSBjZWxsIGNvbW1lbnQgaXMgaW5kaWNhdGVkIGluIEV4Y2VsIGJ5IGEgc21hbGwgcmVkIHRyaWFuZ2xlIGluIHRoZSB1cHBlcgorcmlnaHQtaGFuZCBjb3JuZXIgb2YgdGhlIGNlbGwuCisKK0VhY2ggb2YgdGhlIHdvcmtzaGVldHMgZGVtb25zdHJhdGVzIGRpZmZlcmVudCBmZWF0dXJlcyBvZiBjZWxsIGNvbW1lbnRzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb21tZW50czIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBjb21tZW50czIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIHdyaXRpbmcgY2VsbCBjb21tZW50cy4KKyAgICAjCisgICAgIyBBIGNlbGwgY29tbWVudCBpcyBpbmRpY2F0ZWQgaW4gRXhjZWwgYnkgYSBzbWFsbCByZWQgdHJpYW5nbGUgaW4gdGhlIHVwcGVyCisgICAgIyByaWdodC1oYW5kIGNvcm5lciBvZiB0aGUgY2VsbC4KKyAgICAjCisgICAgIyBFYWNoIG9mIHRoZSB3b3Jrc2hlZXRzIGRlbW9uc3RyYXRlcyBkaWZmZXJlbnQgZmVhdHVyZXMgb2YgY2VsbCBjb21tZW50cy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE5vdmVtYmVyIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImNvbW1lbnRzMi54bHMiKTsKKyAgICBteSAkdGV4dF93cmFwICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCh0ZXh0X3dyYXAgPT4gMSwgdmFsaWduID0+ICd0b3AnKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0NyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ4ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBWYXJpYWJsZXMgdGhhdCB3ZSB3aWxsIHVzZSBpbiBlYWNoIGV4YW1wbGUuCisgICAgbXkgJGNlbGxfdGV4dCA9ICcnOworICAgIG15ICRjb21tZW50ICAgPSAnJzsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxLiBEZW1vbnN0cmF0ZXMgYSBzaW1wbGUgY2VsbCBjb21tZW50IHdpdGhvdXQgZm9ybWF0dGluZyBhbmQgVW5pY29kZQorICAgICMgICAgICAgICAgICBjb21tZW50cyBlbmNvZGVkIGFzIFVURi0xNiBhbmQgYXMgVVRGLTguCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDIsIDUwKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg1LCA1MCk7CisgICAgCisgICAgCisgICAgIyBTaW1wbGUgYXNjaWkgc3RyaW5nLgorICAgICRjZWxsX3RleHQgPSAnSG9sZCB0aGUgbW91c2Ugb3ZlciB0aGlzIGNlbGwgdG8gc2VlIHRoZSBjb21tZW50Lic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdUaGlzIGlzIGEgY29tbWVudC4nOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAjIFVURi0xNiBzdHJpbmcuCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGlzIGEgVVRGLTE2IGNvbW1lbnQuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gcGFjayAibiIsIDB4MjYzYTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCwgZW5jb2RpbmcgPT4gMSk7CisgICAgCisgICAgCisgICAgIyBVVEYtOCBzdHJpbmcgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQxLT5zZXRfcm93KDgsIDUwKTsKKyAgICAgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGlzIGEgVVRGLTggc3RyaW5nLic7CisgICAgICAgICRjb21tZW50ICAgPSBjaHIgMHgyNjNhOworICAgIAorICAgICAgICAkd29ya3NoZWV0MS0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlX2NvbW1lbnQoJ0M5JywgJGNvbW1lbnQpOworICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAyLiBEZW1vbnN0cmF0ZXMgdmlzaWJsZSBhbmQgaGlkZGVuIGNvbW1lbnRzLgorICAgICMKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldDItPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0Mi0+c2V0X3JvdygyLCA1MCk7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgNTApOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgdmlzaWJsZS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCwgdmlzaWJsZSA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gIlRoaXMgY2VsbCBjb21tZW50IGlzbid0IHZpc2libGUgKHRoZSBkZWZhdWx0KS4iOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUgICAgICAgICgnQzYnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGVfY29tbWVudCgnQzYnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gRGVtb25zdHJhdGVzIHZpc2libGUgYW5kIGhpZGRlbiBjb21tZW50cyBzZXQgYXQgdGhlIHdvcmtzaGVldAorICAgICMgICAgICAgICAgICBsZXZlbC4KKyAgICAjCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDMtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDUsIDUwKTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3Jvdyg4LCA1MCk7CisgICAgCisgICAgIyBNYWtlIGFsbCBjb21tZW50cyBvbiB0aGUgd29ya3NoZWV0IHZpc2libGUuCisgICAgJHdvcmtzaGVldDMtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIHZpc2libGUsIGV4cGxpY2l0bHkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQsIHZpc2libGUgPT4gMSk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyBhbHNvIHZpc2libGUgYmVjYXVzZSAnLgorICAgICAgICAgICAgICAgICAnd2UgdXNlZCBzaG93X2NvbW1lbnRzKCkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnSG93ZXZlciwgd2UgY2FuIHN0aWxsIG92ZXJyaWRlIGl0IGxvY2FsbHkuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDMtPndyaXRlICAgICAgICAoJ0M5JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbW1lbnQoJ0M5JywgJGNvbW1lbnQsIHZpc2libGUgPT4gMCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNC4gRGVtb25zdHJhdGVzIGNoYW5nZXMgdG8gdGhlIGNvbW1lbnQgYm94IGRpbWVuc2lvbnMuCisgICAgIworICAgIAorICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICA1MCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNSwgIDUwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg4LCAgNTApOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDE1LCA1MCk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIGRlZmF1bHQgc2l6ZS4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzMnLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29tbWVudCgnQzMnLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBpcyB0d2ljZSBhcyB3aWRlLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50LCB4X3NjYWxlID0+IDIpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgdHdpY2UgYXMgaGlnaC4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0NC0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCwgeV9zY2FsZSA9PiAyKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGlzIHNjYWxlZCBpbiBib3RoIGRpcmVjdGlvbnMuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlICAgICAgICAoJ0MxNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDMTYnLCAkY29tbWVudCwgeF9zY2FsZSA9PiAxLjIsIHlfc2NhbGUgPT4gMC44KTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGhhcyB3aWR0aCBhbmQgaGVpZ2h0IHNwZWNpZmllZCBpbiBwaXhlbHMuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlICAgICAgICAoJ0MxOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZV9jb21tZW50KCdDMTknLCAkY29tbWVudCwgd2lkdGggPT4gMjAwLCBoZWlnaHQgPT4gMjApOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIERlbW9uc3RyYXRlcyBjaGFuZ2VzIHRvIHRoZSBjZWxsIGNvbW1lbnQgcG9zaXRpb24uCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ1LT5zZXRfY29sdW1uKCdDOkMnLCAyNSk7CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMiwgNTApOworICAgICR3b3Jrc2hlZXQ1LT5zZXRfcm93KDUsIDUwKTsKKyAgICAkd29ya3NoZWV0NS0+c2V0X3Jvdyg4LCA1MCk7CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMTEsIDUwKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+c2hvd19jb21tZW50cygpOworICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaXMgaW4gdGhlIGRlZmF1bHQgcG9zaXRpb24uJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDUtPndyaXRlICAgICAgICAoJ0MzJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0MzJywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gbW92ZWQgdG8gYW5vdGhlciBjZWxsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ1LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50LCBzdGFydF9jZWxsID0+ICdFNCcpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gbW92ZWQgdG8gYW5vdGhlciBjZWxsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSAgICAgICAgKCdDOScsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ1LT53cml0ZV9jb21tZW50KCdDOScsICRjb21tZW50LCBzdGFydF9yb3cgPT4gOCwgc3RhcnRfY29sID0+IDQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGJlZW4gc2hpZnRlZCB3aXRoaW4gaXRzIGRlZmF1bHQgY2VsbC4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0NS0+d3JpdGUgICAgICAgICgnQzEyJywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbW1lbnQoJ0MxMicsICRjb21tZW50LCB4X29mZnNldCA9PiAzMCwgeV9vZmZzZXQgPT4gMTIpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDYuIERlbW9uc3RyYXRlcyBjaGFuZ2VzIHRvIHRoZSBjb21tZW50IGJhY2tncm91bmQgY29sb3VyLgorICAgICMKKyAgICAKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQzpDJywgMjUpOworICAgICR3b3Jrc2hlZXQ2LT5zZXRfcm93KDIsIDUwKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X3Jvdyg1LCA1MCk7CisgICAgJHdvcmtzaGVldDYtPnNldF9yb3coOCwgNTApOworICAgIAorICAgICR3b3Jrc2hlZXQ2LT5zaG93X2NvbW1lbnRzKCk7CisgICAgCisgICAgJGNlbGxfdGV4dCA9ICdUaGlzIGNlbGwgY29tbWVudCBoYXMgYSBkaWZmZXJlbnQgY29sb3VyLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ2LT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ2LT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50LCBjb2xvciA9PiAnZ3JlZW4nKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoaXMgY2VsbCBjb21tZW50IGhhcyB0aGUgZGVmYXVsdCBjb2xvdXIuJzsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDYtPndyaXRlICAgICAgICAoJ0M2JywgJGNlbGxfdGV4dCwgJHRleHRfd3JhcCk7CisgICAgJHdvcmtzaGVldDYtPndyaXRlX2NvbW1lbnQoJ0M2JywgJGNvbW1lbnQpOworICAgIAorICAgIAorICAgICRjZWxsX3RleHQgPSAnVGhpcyBjZWxsIGNvbW1lbnQgaGFzIGEgZGlmZmVyZW50IGNvbG91ci4nOworICAgIAorICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUgICAgICAgICgnQzknLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGVfY29tbWVudCgnQzknLCAkY29tbWVudCwgY29sb3IgPT4gMHgzNSk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgNy4gRGVtb25zdHJhdGVzIGhvdyB0byBzZXQgdGhlIGNlbGwgY29tbWVudCBhdXRob3IuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQ3LT5zZXRfY29sdW1uKCdDOkMnLCAzMCk7CisgICAgJHdvcmtzaGVldDctPnNldF9yb3coMiwgIDUwKTsKKyAgICAkd29ya3NoZWV0Ny0+c2V0X3Jvdyg1LCAgNTApOworICAgICR3b3Jrc2hlZXQ3LT5zZXRfcm93KDgsICA1MCk7CisgICAgJHdvcmtzaGVldDctPnNldF9yb3coMTEsIDUwKTsKKyAgICAKKyAgICBteSAkYXV0aG9yID0gJyc7CisgICAgbXkgJGNlbGwgICA9ICdDMyc7CisgICAgCisgICAgJGNlbGxfdGV4dCA9ICJNb3ZlIHRoZSBtb3VzZSBvdmVyIHRoaXMgY2VsbCBhbmQgeW91IHdpbGwgc2VlICdDZWxsIGNvbW1lbnRlZCAiLgorICAgICAgICAgICAgICAgICAiYnkgJGF1dGhvcicgKGJsYW5rKSBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCk7CisgICAgCisgICAgCisgICAgJGF1dGhvciAgICA9ICdQZXJsJzsKKyAgICAkY2VsbCAgICAgID0gJ0M2JzsKKyAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICJieSAkYXV0aG9yJyBpbiB0aGUgc3RhdHVzIGJhciBhdCB0aGUgYm90dG9tIjsKKyAgICAKKyAgICAkY29tbWVudCAgID0gJ0hlbGxvLic7CisgICAgCisgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ3LT53cml0ZV9jb21tZW50KCRjZWxsLCAkY29tbWVudCwgYXV0aG9yID0+ICRhdXRob3IpOworICAgIAorICAgIAorICAgICRhdXRob3IgICAgPSBwYWNrICJuIiwgMHgyMEFDOyAjIFVURi0xNiBFdXJvCisgICAgJGNlbGwgICAgICA9ICdDOSc7CisgICAgJGNlbGxfdGV4dCA9ICJNb3ZlIHRoZSBtb3VzZSBvdmVyIHRoaXMgY2VsbCBhbmQgeW91IHdpbGwgc2VlICdDZWxsIGNvbW1lbnRlZCAiLgorICAgICAgICAgICAgICAgICAiYnkgRXVybycgaW4gdGhlIHN0YXR1cyBiYXIgYXQgdGhlIGJvdHRvbSI7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ3LT53cml0ZSAgICAgICAgKCRjZWxsLCAkY2VsbF90ZXh0LCAkdGV4dF93cmFwKTsKKyAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29tbWVudCgkY2VsbCwgJGNvbW1lbnQsIGF1dGhvciAgICAgICAgICA9PiAkYXV0aG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yX2VuY29kaW5nID0+IDEgICAgICApOworICAgIAorICAgICMgVVRGLTggc3RyaW5nIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICAkYXV0aG9yICAgID0gY2hyIDB4MjBBQzsKKyAgICAgICAgJGNlbGwgICAgICA9ICdDMTInOworICAgICAgICAkY2VsbF90ZXh0ID0gIk1vdmUgdGhlIG1vdXNlIG92ZXIgdGhpcyBjZWxsIGFuZCB5b3Ugd2lsbCBzZWUgJ0NlbGwgY29tbWVudGVkICIuCisgICAgICAgICAgICAgICAgICAgICAiYnkgJGF1dGhvcicgaW4gdGhlIHN0YXR1cyBiYXIgYXQgdGhlIGJvdHRvbSI7CisgICAgICAgICRjb21tZW50ICAgPSAnSGVsbG8uJzsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldDctPndyaXRlICAgICAgICAoJGNlbGwsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29tbWVudCgkY2VsbCwgJGNvbW1lbnQsIGF1dGhvciA9PiAkYXV0aG9yKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgOC4gRGVtb25zdHJhdGVzIHRoZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSByb3cgaGVpZ2h0LgorICAgICMKKyAgICAKKyAgICAjIFNldCB1cCBzb21lIGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldDgtPnNldF9jb2x1bW4oJ0M6QycsIDI1KTsKKyAgICAkd29ya3NoZWV0OC0+c2V0X3JvdygyLCA4MCk7CisgICAgCisgICAgJHdvcmtzaGVldDgtPnNob3dfY29tbWVudHMoKTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoZSBoZWlnaHQgb2YgdGhpcyByb3cgaGFzIGJlZW4gYWRqdXN0ZWQgZXhwbGljaXRseSB1c2luZyAnIC4KKyAgICAgICAgICAgICAgICAgJ3NldF9yb3coKS4gVGhlIHNpemUgb2YgdGhlIGNvbW1lbnQgYm94IGlzIGFkanVzdGVkICcgICAgICAgICAuCisgICAgICAgICAgICAgICAgICdhY2NvcmRpbmdseSBieSBXcml0ZUV4Y2VsLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ4LT53cml0ZSAgICAgICAgKCdDMycsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ4LT53cml0ZV9jb21tZW50KCdDMycsICRjb21tZW50KTsKKyAgICAKKyAgICAKKyAgICAkY2VsbF90ZXh0ID0gJ1RoZSBoZWlnaHQgb2YgdGhpcyByb3cgaGFzIGJlZW4gYWRqdXN0ZWQgYnkgRXhjZWwgZHVlIHRvIHRoZSAnICAuCisgICAgICAgICAgICAgICAgICd0ZXh0IHdyYXAgcHJvcGVydHkgYmVpbmcgc2V0LiBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhhdCAnICAgLgorICAgICAgICAgICAgICAgICAndGhlIGhlaWdodCBvZiB0aGUgcm93IGlzIHVua25vd24gdG8gV3JpdGVFeGNlbCBhdCBydW4gdGltZSAnICAgIC4KKyAgICAgICAgICAgICAgICAgImFuZCB0aHVzIHRoZSBjb21tZW50IGJveCBpcyBzdHJldGNoZWQgYXMgd2VsbC5cblxuIiAgICAgICAgICAgICAuCisgICAgICAgICAgICAgICAgICdVc2Ugc2V0X3JvdygpIHRvIHNwZWNpZnkgdGhlIHJvdyBoZWlnaHQgZXhwbGljaXRseSB0byBhdm9pZCAnICAgLgorICAgICAgICAgICAgICAgICAndGhpcyBwcm9ibGVtLic7CisgICAgCisgICAgJGNvbW1lbnQgICA9ICdIZWxsby4nOworICAgIAorICAgICR3b3Jrc2hlZXQ4LT53cml0ZSAgICAgICAgKCdDNicsICRjZWxsX3RleHQsICR0ZXh0X3dyYXApOworICAgICR3b3Jrc2hlZXQ4LT53cml0ZV9jb21tZW50KCdDNicsICRjb21tZW50KTsKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbW1lbnRzMi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvcHlmb3JtYXQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgZm9ybWF0IGNvcHlpbmcgbWV0aG9kIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgZmVhdHVyZSBpc24ndCByZXF1aXJlZCB2ZXJ5IG9mdGVuLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9jb3B5Zm9ybWF0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gY29weWZvcm1hdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgZm9ybWF0IGNvcHlpbmcgbWV0aG9kIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhpcyBmZWF0dXJlIGlzbid0IHJlcXVpcmVkIHZlcnkgb2Z0ZW4uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgd29ya2Jvb2sxCisgICAgbXkgJHdvcmtib29rMSAgICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndvcmtib29rMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSAgICAgID0gJHdvcmtib29rMS0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRmb3JtYXQxYSAgICAgICAgPSAkd29ya2Jvb2sxLT5hZGRfZm9ybWF0KCk7CisgICAgbXkgJGZvcm1hdDFiICAgICAgICA9ICR3b3JrYm9vazEtPmFkZF9mb3JtYXQoKTsKKyAgICAKKyAgICAjIENyZWF0ZSB3b3JrYm9vazIKKyAgICBteSAkd29ya2Jvb2syICAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid29ya2Jvb2syLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQyICAgICAgPSAkd29ya2Jvb2syLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGZvcm1hdDJhICAgICAgICA9ICR3b3JrYm9vazItPmFkZF9mb3JtYXQoKTsKKyAgICBteSAkZm9ybWF0MmIgICAgICAgID0gJHdvcmtib29rMi0+YWRkX2Zvcm1hdCgpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZ2xvYmFsIGZvcm1hdCBvYmplY3QgdGhhdCBpc24ndCB0aWVkIHRvIGEgd29ya2Jvb2sKKyAgICBteSAkZ2xvYmFsX2Zvcm1hdCAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KCk7CisgICAgCisgICAgIyBTZXQgdGhlIGZvcm1hdHRpbmcKKyAgICAkZ2xvYmFsX2Zvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgJGdsb2JhbF9mb3JtYXQtPnNldF9ib2xkKCk7CisgICAgJGdsb2JhbF9mb3JtYXQtPnNldF9pdGFsaWMoKTsKKyAgICAKKyAgICAjIENyZWF0ZSBhbm90aGVyIGV4YW1wbGUgZm9ybWF0CisgICAgJGZvcm1hdDFiLT5zZXRfY29sb3IoJ3JlZCcpOworICAgIAorICAgICMgQ29weSB0aGUgZ2xvYmFsIGZvcm1hdCBwcm9wZXJ0aWVzIHRvIHRoZSB3b3Jrc2hlZXQgZm9ybWF0cworICAgICRmb3JtYXQxYS0+Y29weSgkZ2xvYmFsX2Zvcm1hdCk7CisgICAgJGZvcm1hdDJhLT5jb3B5KCRnbG9iYWxfZm9ybWF0KTsKKyAgICAKKyAgICAjIENvcHkgYSBmb3JtYXQgZnJvbSB3b3Jrc2hlZXQxIHRvIHdvcmtzaGVldDIKKyAgICAkZm9ybWF0MmItPmNvcHkoJGZvcm1hdDFiKTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgb3V0cHV0CisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICJDaWFvIiwgJGZvcm1hdDFhKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMSwgMCwgIkNpYW8iLCAkZm9ybWF0MWIpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgwLCAwLCAiSGVsbG8iLCAkZm9ybWF0MmEpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgxLCAwLCAiSGVsbG8iLCAkZm9ybWF0MmIpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jb3B5Zm9ybWF0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGF0YV92YWxpZGF0ZS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGRhdGEgdmFsaWRhdGlvbiBhbmQgZHJvcGRvd24gbGlzdHMgdG8gYQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKworRGF0YSB2YWxpZGF0aW9uIGlzIGEgZmVhdHVyZSBvZiBFeGNlbCB3aGljaCBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IHRoZSBkYXRhCit0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdAorYWxzbyBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IGlucHV0IHRvIHZhbHVlcyBpbiBhIGRyb3AgZG93biBsaXN0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kYXRhX3ZhbGlkYXRlLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZGF0YV92YWxpZGF0ZS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBkYXRhIHZhbGlkYXRpb24gYW5kIGRyb3Bkb3duIGxpc3RzIHRvIGEKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisgICAgIworICAgICMgRGF0YSB2YWxpZGF0aW9uIGlzIGEgZmVhdHVyZSBvZiBFeGNlbCB3aGljaCBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IHRoZSBkYXRhCisgICAgIyB0aGF0IGEgdXNlcnMgZW50ZXJzIGluIGEgY2VsbCBhbmQgdG8gZGlzcGxheSBoZWxwIGFuZCB3YXJuaW5nIG1lc3NhZ2VzLiBJdAorICAgICMgYWxzbyBhbGxvd3MgeW91IHRvIHJlc3RyaWN0IGlucHV0IHRvIHZhbHVlcyBpbiBhIGRyb3AgZG93biBsaXN0LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDgsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGF0YV92YWxpZGF0ZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBBZGQgYSBmb3JtYXQgZm9yIHRoZSBoZWFkZXIgY2VsbHMuCisgICAgbXkgJGhlYWRlcl9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmdfY29sb3IgICAgPT4gNDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF93cmFwICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgICMgU2V0IHVwIGxheW91dCBvZiB0aGUgd29ya3NoZWV0LgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDY0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkInLCAxNSk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignRDpEJywgMTUpOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMzYpOworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0IzJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgaGVhZGVyIGNlbGxzIGFuZCBzb21lIGRhdGEgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIGV4YW1wbGVzLgorICAgIG15ICRyb3cgPSAwOworICAgIG15ICR0eHQ7CisgICAgbXkgJGhlYWRpbmcxID0gJ1NvbWUgZXhhbXBsZXMgb2YgZGF0YSB2YWxpZGF0aW9uIGluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsJzsKKyAgICBteSAkaGVhZGluZzIgPSAnRW50ZXIgdmFsdWVzIGluIHRoaXMgY29sdW1uJzsKKyAgICBteSAkaGVhZGluZzMgPSAnU2FtcGxlIERhdGEnOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICRoZWFkaW5nMSwgJGhlYWRlcl9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICRoZWFkaW5nMiwgJGhlYWRlcl9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMScsICRoZWFkaW5nMywgJGhlYWRlcl9mb3JtYXQpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdEMycsIFsnSW50ZWdlcnMnLCAgIDEsIDEwXSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0Q0JywgWydMaXN0IGRhdGEnLCAnb3BlbicsICdoaWdoJywgJ2Nsb3NlJ10pOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdENScsIFsnRm9ybXVsYScsICAgJz1BTkQoRjU9NTAsRzU9NjApJywgNTAsIDYwXSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAxLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGluIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gMTAsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMi4gTGltaXRpbmcgaW5wdXQgdG8gYW4gaW50ZWdlciBvdXRzaWRlIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYW4gaW50ZWdlciB0aGF0IGlzIG5vdCBiZXR3ZWVuIDEgYW5kIDEwICh1c2luZyBjZWxsIHJlZmVyZW5jZXMpJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ25vdCBiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAnPUUzJywKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAnPUYzJywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSAzLiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBhIGZpeGVkIHZhbHVlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdpbnRlZ2VyJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnPicsCisgICAgICAgICAgICB2YWx1ZSAgICAgICAgICAgPT4gMCwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA0LiBMaW1pdGluZyBpbnB1dCB0byBhbiBpbnRlZ2VyIGxlc3MgdGhhbiBhIGZpeGVkIHZhbHVlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGFuIGludGVnZXIgbGVzcyB0aGFuIDEwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJzwnLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+IDEwLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDUuIExpbWl0aW5nIGlucHV0IHRvIGEgZGVjaW1hbCBpbiBhIGZpeGVkIHJhbmdlLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgZGVjaW1hbCBiZXR3ZWVuIDAuMSBhbmQgMC41JzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnZGVjaW1hbCcsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJ2JldHdlZW4nLAorICAgICAgICAgICAgbWluaW11bSAgICAgICAgID0+IDAuMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgICA9PiAwLjUsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgNi4gTGltaXRpbmcgaW5wdXQgdG8gYSB2YWx1ZSBpbiBhIGRyb3Bkb3duIGxpc3QuCisgICAgIworICAgICR0eHQgPSAnU2VsZWN0IGEgdmFsdWUgZnJvbSBhIGRyb3AgZG93biBsaXN0JzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnbGlzdCcsCisgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgPT4gWydvcGVuJywgJ2hpZ2gnLCAnY2xvc2UnXSwKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA2LiBMaW1pdGluZyBpbnB1dCB0byBhIHZhbHVlIGluIGEgZHJvcGRvd24gbGlzdC4KKyAgICAjCisgICAgJHR4dCA9ICdTZWxlY3QgYSB2YWx1ZSBmcm9tIGEgZHJvcCBkb3duIGxpc3QgKHVzaW5nIGEgY2VsbCByYW5nZSknOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICdsaXN0JywKKyAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICA9PiAnPUU0Okc0JywKKyAgICAgICAgfSk7CisgICAgCisgICAgCisgICAgIworICAgICMgRXhhbXBsZSA3LiBMaW1pdGluZyBpbnB1dCB0byBhIGRhdGUgaW4gYSBmaXhlZCByYW5nZS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhIGRhdGUgYmV0d2VlbiAxLzEvMjAwOCBhbmQgMTIvMTIvMjAwOCc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2RhdGUnLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgICA9PiAnMjAwOC0wMS0wMVQnLAorICAgICAgICAgICAgbWF4aW11bSAgICAgICAgID0+ICcyMDA4LTEyLTEyVCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgOC4gTGltaXRpbmcgaW5wdXQgdG8gYSB0aW1lIGluIGEgZml4ZWQgcmFuZ2UuCisgICAgIworICAgICR0eHQgPSAnRW50ZXIgYSB0aW1lIGJldHdlZW4gNjowMCBhbmQgMTI6MDAnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICAgID0+ICd0aW1lJywKKyAgICAgICAgICAgIGNyaXRlcmlhICAgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgPT4gJ1QwNjowMCcsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgICAgPT4gJ1QxMjowMCcsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgOS4gTGltaXRpbmcgaW5wdXQgdG8gYSBzdHJpbmcgZ3JlYXRlciB0aGFuIGEgZml4ZWQgbGVuZ3RoLgorICAgICMKKyAgICAkdHh0ID0gJ0VudGVyIGEgc3RyaW5nIGxvbmdlciB0aGFuIDMgY2hhcmFjdGVycyc7CisgICAgJHJvdyArPSAyOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICR0eHQpOworICAgICR3b3Jrc2hlZXQtPmRhdGFfdmFsaWRhdGlvbigkcm93LCAxLAorICAgICAgICB7CisgICAgICAgICAgICB2YWxpZGF0ZSAgICAgICAgPT4gJ2xlbmd0aCcsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgPT4gJz4nLAorICAgICAgICAgICAgdmFsdWUgICAgICAgICAgID0+IDMsCisgICAgICAgIH0pOworICAgIAorICAgIAorICAgICMKKyAgICAjIEV4YW1wbGUgMTAuIExpbWl0aW5nIGlucHV0IGJhc2VkIG9uIGEgZm9ybXVsYS4KKyAgICAjCisgICAgJHR4dCA9ICdFbnRlciBhIHZhbHVlIGlmIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZSAiPUFORChGNT01MCxHNT02MCkiJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICA9PiAnY3VzdG9tJywKKyAgICAgICAgICAgIHZhbHVlICAgICAgICAgICA9PiAnPUFORChGNT01MCxHNT02MCknLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDExLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXlzIGEgbWVzc2FnZSB3aGVuIHlvdSBzZWxlY3QgdGhlIGNlbGwnOworICAgICRyb3cgKz0gMjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93LCAwLCAkdHh0KTsKKyAgICAkd29ya3NoZWV0LT5kYXRhX3ZhbGlkYXRpb24oJHJvdywgMSwKKyAgICAgICAgeworICAgICAgICAgICAgdmFsaWRhdGUgICAgICA9PiAnaW50ZWdlcicsCisgICAgICAgICAgICBjcml0ZXJpYSAgICAgID0+ICdiZXR3ZWVuJywKKyAgICAgICAgICAgIG1pbmltdW0gICAgICAgPT4gMSwKKyAgICAgICAgICAgIG1heGltdW0gICAgICAgPT4gMTAwLAorICAgICAgICAgICAgaW5wdXRfdGl0bGUgICA9PiAnRW50ZXIgYW4gaW50ZWdlcjonLAorICAgICAgICAgICAgaW5wdXRfbWVzc2FnZSA9PiAnYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDEyLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXkgYSBjdXN0b20gZXJyb3IgbWVzc2FnZSB3aGVuIGludGVnZXIgaXNuXCd0IGJldHdlZW4gMSBhbmQgMTAwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgICAgIGVycm9yX3RpdGxlICAgPT4gJ0lucHV0IHZhbHVlIGlzIG5vdCB2YWxpZCEnLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9PiAnSXQgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBFeGFtcGxlIDEzLiBEaXNwbGF5aW5nIGFuZCBtb2RpZnkgZGF0YSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgorICAgICMKKyAgICAkdHh0ID0gJ0Rpc3BsYXkgYSBjdXN0b20gaW5mb3JtYXRpb24gbWVzc2FnZSB3aGVuIGludGVnZXIgaXNuXCd0IGJldHdlZW4gMSBhbmQgMTAwJzsKKyAgICAkcm93ICs9IDI7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgJHR4dCk7CisgICAgJHdvcmtzaGVldC0+ZGF0YV92YWxpZGF0aW9uKCRyb3csIDEsCisgICAgICAgIHsKKyAgICAgICAgICAgIHZhbGlkYXRlICAgICAgPT4gJ2ludGVnZXInLAorICAgICAgICAgICAgY3JpdGVyaWEgICAgICA9PiAnYmV0d2VlbicsCisgICAgICAgICAgICBtaW5pbXVtICAgICAgID0+IDEsCisgICAgICAgICAgICBtYXhpbXVtICAgICAgID0+IDEwMCwKKyAgICAgICAgICAgIGlucHV0X3RpdGxlICAgPT4gJ0VudGVyIGFuIGludGVnZXI6JywKKyAgICAgICAgICAgIGlucHV0X21lc3NhZ2UgPT4gJ2JldHdlZW4gMSBhbmQgMTAwJywKKyAgICAgICAgICAgIGVycm9yX3RpdGxlICAgPT4gJ0lucHV0IHZhbHVlIGlzIG5vdCB2YWxpZCEnLAorICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSA9PiAnSXQgc2hvdWxkIGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDAnLAorICAgICAgICAgICAgZXJyb3JfdHlwZSAgICA9PiAnaW5mb3JtYXRpb24nLAorICAgICAgICB9KTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RhdGFfdmFsaWRhdGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBkYXRlX3RpbWUucGwKKworCisKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGV4YW1wbGUgb2Ygd3JpdGluZyBkYXRlcyBhbmQgdGltZXMgdXNpbmcgdGhlCit3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kYXRlX3RpbWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkYXRlX3RpbWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBleGFtcGxlIG9mIHdyaXRpbmcgZGF0ZXMgYW5kIHRpbWVzIHVzaW5nIHRoZQorICAgICMgd3JpdGVfZGF0ZV90aW1lKCkgV29ya3NoZWV0IG1ldGhvZC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEF1Z3VzdCAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJkYXRlX3RpbWUueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRib2xkICAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICBteSAkcm93ICAgICAgID0gMDsKKyAgICAKKyAgICAKKyAgICAjIEV4cGFuZCB0aGUgZmlyc3QgY29sdW1uIHNvIHRoYXQgdGhlIGRhdGUgaXMgdmlzaWJsZS4KKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCJBOkIiLCAzMCk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSB0aGUgY29sdW1uIGhlYWRlcnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnRm9ybWF0dGVkIGRhdGUnLCAkYm9sZCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0Zvcm1hdCcsICAgICAgICAgJGJvbGQpOworICAgIAorICAgIAorICAgICMgRXhhbXBsZXMgZGF0ZSBhbmQgdGltZSBmb3JtYXRzLiBJbiB0aGUgb3V0cHV0IGZpbGUgY29tcGFyZSBob3cgY2hhbmdpbmcKKyAgICAjIHRoZSBmb3JtYXQgY29kZXMgY2hhbmdlIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBkYXRlLgorICAgICMKKyAgICBteSBAZGF0ZV9mb3JtYXRzID0gKAorICAgICAgICAnZGQvbW0veXknLAorICAgICAgICAnbW0vZGQveXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2QgbW0geXknLAorICAgICAgICAnZGQgbW0geXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2RkIG0geXknLAorICAgICAgICAnZGQgbW0geXknLAorICAgICAgICAnZGQgbW1tIHl5JywKKyAgICAgICAgJ2RkIG1tbW0geXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2RkIG1tIHknLAorICAgICAgICAnZGQgbW0geXl5JywKKyAgICAgICAgJ2RkIG1tIHl5eXknLAorICAgICAgICAnJywKKyAgICAgICAgJ2QgbW1tbSB5eXl5JywKKyAgICAgICAgJycsCisgICAgICAgICdkZC9tbS95eScsCisgICAgICAgICdkZC9tbS95eSBoaDptbScsCisgICAgICAgICdkZC9tbS95eSBoaDptbTpzcycsCisgICAgICAgICdkZC9tbS95eSBoaDptbTpzcy4wMDAnLAorICAgICAgICAnJywKKyAgICAgICAgJ2hoOm1tJywKKyAgICAgICAgJ2hoOm1tOnNzJywKKyAgICAgICAgJ2hoOm1tOnNzLjAwMCcsCisgICAgKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBzYW1lIGRhdGUgYW5kIHRpbWUgdXNpbmcgZWFjaCBvZiB0aGUgYWJvdmUgZm9ybWF0cy4gVGhlIGVtcHR5CisgICAgIyBzdHJpbmcgZm9ybWF0cyBjcmVhdGUgYSBibGFuayBsaW5lIHRvIG1ha2UgdGhlIGV4YW1wbGUgY2xlYXJlci4KKyAgICAjCisgICAgZm9yIG15ICRkYXRlX2Zvcm1hdCAoQGRhdGVfZm9ybWF0cykgeworICAgICAgICAkcm93Kys7CisgICAgICAgIG5leHQgaWYgJGRhdGVfZm9ybWF0IGVxICcnOworICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGRhdGUgb3IgdGltZS4KKyAgICAgICAgbXkgJGZvcm1hdCA9ICAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mb3JtYXQgPT4gJGRhdGVfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgID0+ICdsZWZ0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgICAgICMgV3JpdGUgdGhlIHNhbWUgZGF0ZSB1c2luZyBkaWZmZXJlbnQgZm9ybWF0cy4KKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKCRyb3csIDAsICcyMDA0LTA4LTAxVDEyOjMwOjQ1LjEyMycsICRmb3JtYXQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAoJHJvdywgMSwgJGRhdGVfZm9ybWF0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBUaGUgZm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2YgYW4gaW52YWxpZCBkYXRlLiBJdCBpcyB3cml0dGVuIGFzIGEgc3RyaW5nCisgICAgIyBpbnN0ZWFkIG9mIGEgbnVtYmVyLiBUaGlzIGlzIGFsc28gRXhjZWwncyBkZWZhdWx0IGJlaGF2aW91ci4KKyAgICAjCisgICAgJHJvdyArPSAyOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2RhdGVfdGltZSgkcm93LCAwLCAnMjAwNC0xMy0wMVQxMjozMDo0NS4xMjMnKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICAgICAoJHJvdywgMSwgJ0ludmFsaWQgZGF0ZS4gV3JpdHRlbiBhcyBzdHJpbmcuJywgJGJvbGQpOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGF0ZV90aW1lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGVmaW5lZF9uYW1lLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgZGVmaW5lZCBuYW1lcyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisKK1RoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZGVmaW5lZCBhIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgYSB2YWx1ZSwKK2Egc2luZ2xlIGNlbGwgb3IgYSByYW5nZSBvZiBjZWxscyBpbiBhIHdvcmtib29rLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9kZWZpbmVkX25hbWUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkZWZpbmVkX25hbWUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgZGVmaW5lZCBuYW1lcyBpbiBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZpbGUuCisgICAgIworICAgICMgVGhpcyBtZXRob2QgaXMgdXNlZCB0byBkZWZpbmVkIGEgbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHZhbHVlLAorICAgICMgYSBzaW5nbGUgY2VsbCBvciBhIHJhbmdlIG9mIGNlbGxzIGluIGEgd29ya2Jvb2suCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwOCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGVmaW5lZF9uYW1lLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdFeGNoYW5nZV9yYXRlJywgJz0wLjk2Jyk7CisgICAgJHdvcmtib29rLT5kZWZpbmVfbmFtZSgnU2FsZXMnLCAgICAgICAgICc9U2hlZXQxISRHJDE6JEgkMTAnKTsKKyAgICAkd29ya2Jvb2stPmRlZmluZV9uYW1lKCdTaGVldDIhU2FsZXMnLCAgJz1TaGVldDIhJEckMTokRyQxMCcpOworICAgIAorICAgIAorICAgIGZvciBteSAkd29ya3NoZWV0ICgkd29ya2Jvb2stPnNoZWV0cygpKSB7CisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDQ1KTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ1RoaXMgd29ya3NoZWV0IGNvbnRhaW5zIHNvbWUgZGVmaW5lZCBuYW1lcywnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJ1NlZSB0aGUgSW5zZXJ0IC0+IE5hbWUgLT4gRGVmaW5lIGRpYWxvZy4nKTsKKyAgICAKKyAgICB9CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNCcsICc9RXhjaGFuZ2VfcmF0ZScpOworICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZGVmaW5lZF9uYW1lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZGlhZ19ib3JkZXIucGwKKworCisKK0Egc2ltcGxlIGZvcm1hdHRpbmcgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBob3cgdG8gYWRkIGEgZGlhZ29uYWwgY2VsbAorYm9yZGVyIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvZGlhZ19ib3JkZXIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBkaWFnX2JvcmRlci5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZm9ybWF0dGluZyBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBhZGQgYSBkaWFnb25hbCBjZWxsCisgICAgIyBib3JkZXIgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZGlhZ19ib3JkZXIueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgIG15ICRmb3JtYXQxICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoZGlhZ190eXBlICAgICAgID0+ICcxJyk7CisgICAgCisgICAgbXkgJGZvcm1hdDIgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChkaWFnX3R5cGUgICAgICAgPT4gJzInKTsKKyAgICAKKyAgICBteSAkZm9ybWF0MyAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGRpYWdfdHlwZSAgICAgICA9PiAnMycpOworICAgIAorICAgIG15ICRmb3JtYXQ0ICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnX3R5cGUgICAgICAgPT4gJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ19ib3JkZXIgICAgID0+ICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdfY29sb3IgICAgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAgJ1RleHQnLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgICdUZXh0JywgJGZvcm1hdDIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOScsICAnVGV4dCcsICRmb3JtYXQzKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjEyJywgJ1RleHQnLCAkZm9ybWF0NCk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kaWFnX2JvcmRlci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGVhc3Rlcl9lZ2cucGwKKworCisKK1RoaXMgdXNlcyB0aGUgV2luMzI6Ok9MRSBtb2R1bGUgdG8gZXhwb3NlIHRoZSBGbGlnaHQgU2ltdWxhdG9yIGVhc3RlciBlZ2cKK2luIEV4Y2VsIDk3IFNSMi4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyB1c2VzIHRoZSBXaW4zMjo6T0xFIG1vZHVsZSB0byBleHBvc2UgdGhlIEZsaWdodCBTaW11bGF0b3IgZWFzdGVyIGVnZworICAgICMgaW4gRXhjZWwgOTcgU1IyLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFdpbjMyOjpPTEU7CisgICAgCisgICAgbXkgJGFwcGxpY2F0aW9uID0gV2luMzI6Ok9MRS0+bmV3KCJFeGNlbC5BcHBsaWNhdGlvbiIpOworICAgIG15ICR3b3JrYm9vayAgICA9ICRhcHBsaWNhdGlvbi0+V29ya2Jvb2tzLT5BZGQ7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5Xb3Jrc2hlZXRzKDEpOworICAgIAorICAgICRhcHBsaWNhdGlvbi0+e1Zpc2libGV9ID0gMTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT5SYW5nZSgiTDk3Olg5NyIpLT5TZWxlY3Q7CisgICAgJHdvcmtzaGVldC0+UmFuZ2UoIk05NyIpLT5BY3RpdmF0ZTsKKyAgICAKKyAgICBteSAkbWVzc2FnZSA9ICAiSG9sZCBkb3duIFNoaWZ0IGFuZCBDdHJsIGFuZCBjbGljayB0aGUgIi4KKyAgICAgICAgICAgICAgICAgICAiQ2hhcnQgV2l6YXJkIGljb24gb24gdGhlIHRvb2xiYXIuXG5cbiIuCisgICAgICAgICAgICAgICAgICAgIlVzZSB0aGUgbW91c2UgbW90aW9uIGFuZCBidXR0b25zIHRvIGNvbnRyb2wgIi4KKyAgICAgICAgICAgICAgICAgICAibW92ZW1lbnQuIFRyeSB0byBmaW5kIHRoZSBtb25vbGl0aC4gIi4KKyAgICAgICAgICAgICAgICAgICAiQ2xvc2UgdGhpcyBkaWFsb2cgZmlyc3QuIjsKKyAgICAKKyAgICAkYXBwbGljYXRpb24tPklucHV0Qm94KCRtZXNzYWdlKTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZWFzdGVyX2VnZy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGZpbGVoYW5kbGUucGwKKworCisKK0V4YW1wbGUgb2YgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgRXhjZWwgZmlsZXMgdG8KK2RpZmZlcmVudCBmaWxlaGFuZGxlcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvZmlsZWhhbmRsZS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGZpbGVoYW5kbGUucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIHVzaW5nIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIHdyaXRlIEV4Y2VsIGZpbGVzIHRvCisgICAgIyBkaWZmZXJlbnQgZmlsZWhhbmRsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBcHJpbCAyMDAzLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgdXNlIElPOjpTY2FsYXI7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMS4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBhbiBFeGNlbCBmaWxlIGJ5CisgICAgIyBzcGVjaWZ5aW5nIGEgZmlsZSBuYW1lLgorICAgICMKKyAgICAKKyAgICBteSAkd29ya2Jvb2sxICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2ZoXzAxLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rMS0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDIuIFdyaXRlIGFuIEV4Y2VsIGZpbGUgdG8gYW4gZXhpc3RpbmcgZmlsZWhhbmRsZS4KKyAgICAjCisgICAgCisgICAgb3BlbiAgICBURVNULCAiPiBmaF8wMi54bHMiIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiBmaWxlOiAkISI7CisgICAgYmlubW9kZSBURVNUOyAjIEFsd2F5cyBkbyB0aGlzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcGxhdGZvcm0gcmVxdWlyZXMgaXQuCisgICAgCisgICAgbXkgJHdvcmtib29rMiAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KFwqVEVTVCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2syLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKDAsIDAsICAiSGkgRXhjZWwhIik7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMy4gV3JpdGUgYW4gRXhjZWwgZmlsZSB0byBhbiBleGlzdGluZyBPTyBzdHlsZSBmaWxlaGFuZGxlLgorICAgICMKKyAgICAKKyAgICBteSAkZmggPSBGaWxlSGFuZGxlLT5uZXcoIj4gZmhfMDMueGxzIikKKyAgICAgICAgICAgICBvciBkaWUgIkNvdWxkbid0IG9wZW4gZmlsZTogJCEiOworICAgIAorICAgIGJpbm1vZGUoJGZoKTsKKyAgICAKKyAgICBteSAkd29ya2Jvb2szICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJGZoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vazMtPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoMCwgMCwgICJIaSBFeGNlbCEiKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0LiBXcml0ZSBhbiBFeGNlbCBmaWxlIHRvIGEgc3RyaW5nIHZpYSBJTzo6U2NhbGFyLiBQbGVhc2UgcmVmZXIgdG8KKyAgICAjIHRoZSBJTzo6U2NhbGFyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAjCisgICAgCisgICAgbXkgJHhsc19zdHI7CisgICAgCisgICAgdGllICpYTFMsICdJTzo6U2NhbGFyJywgXCR4bHNfc3RyOworICAgIAorICAgIG15ICR3b3JrYm9vazQgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldyhcKlhMUyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2s0LT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCA0Iik7CisgICAgJHdvcmtib29rNC0+Y2xvc2UoKTsgIyBUaGlzIGlzIHJlcXVpcmVkIGJlZm9yZSB3ZSB1c2UgdGhlIHNjYWxhcgorICAgIAorICAgIAorICAgICMgVGhlIEV4Y2VsIGZpbGUgaXMgbm93IGluICR4bHNfc3RyLiBBcyBhIGRlbW9uc3RyYXRpb24sIHByaW50IGl0IHRvIGEgZmlsZS4KKyAgICBvcGVuICAgIFRNUCwgIj4gZmhfMDQueGxzIiBvciBkaWUgIkNvdWxkbid0IG9wZW4gZmlsZTogJCEiOworICAgIGJpbm1vZGUgVE1QOworICAgIHByaW50ICAgVE1QICAkeGxzX3N0cjsKKyAgICBjbG9zZSAgIFRNUDsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA1LiBXcml0ZSBhbiBFeGNlbCBmaWxlIHRvIGEgc3RyaW5nIHZpYSBJTzo6U2NhbGFyJ3MgbmV3ZXIgaW50ZXJmYWNlLgorICAgICMgUGxlYXNlIHJlZmVyIHRvIHRoZSBJTzo6U2NhbGFyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4KKyAgICAjCisgICAgbXkgJHhsc19zdHIyOworICAgIAorICAgIG15ICRmaDUgPSBJTzo6U2NhbGFyLT5uZXcoXCR4bHNfc3RyMik7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rNSAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCRmaDUpOworICAgIG15ICR3b3Jrc2hlZXQ1ID0gJHdvcmtib29rNS0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT53cml0ZSgwLCAwLCAiSGkgRXhjZWwgNSIpOworICAgICR3b3JrYm9vazUtPmNsb3NlKCk7ICMgVGhpcyBpcyByZXF1aXJlZCBiZWZvcmUgd2UgdXNlIHRoZSBzY2FsYXIKKyAgICAKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGlzIG5vdyBpbiAkeGxzX3N0ci4gQXMgYSBkZW1vbnN0cmF0aW9uLCBwcmludCBpdCB0byBhIGZpbGUuCisgICAgb3BlbiAgICBUTVAsICI+IGZoXzA1LnhscyIgb3IgZGllICJDb3VsZG4ndCBvcGVuIGZpbGU6ICQhIjsKKyAgICBiaW5tb2RlIFRNUDsKKyAgICBwcmludCAgIFRNUCAgJHhsc19zdHIyOworICAgIGNsb3NlICAgVE1QOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9maWxlaGFuZGxlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogZm9ybXVsYV9yZXN1bHQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHdyaXRlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGZvcm11bGFzIHdpdGggYSB1c2VyCitzcGVjaWZpZWQgcmVzdWx0LgorCitUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHJlcXVpcmVkIHdoZW4gd3JpdGluZyBhIHNwcmVhZHNoZWV0IGZvciBhbgorYXBwbGljYXRpb24gb3RoZXIgdGhhbiBFeGNlbCB3aGVyZSB0aGUgZm9ybXVsYSBpc24ndCBldmFsdWF0ZWQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL2Zvcm11bGFfcmVzdWx0LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gZm9ybXVsYV9yZXN1bHQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gd3JpdGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZm9ybXVsYXMgd2l0aCBhIHVzZXIKKyAgICAjIHNwZWNpZmllZCByZXN1bHQuCisgICAgIworICAgICMgVGhpcyBpcyBnZW5lcmFsbHkgb25seSByZXF1aXJlZCB3aGVuIHdyaXRpbmcgYSBzcHJlYWRzaGVldCBmb3IgYW4KKyAgICAjIGFwcGxpY2F0aW9uIG90aGVyIHRoYW4gRXhjZWwgd2hlcmUgdGhlIGZvcm11bGEgaXNuJ3QgZXZhbHVhdGVkLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnZm9ybXVsYV9yZXN1bHQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICRmb3JtYXQgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ2JsdWUnKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnPTErMicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICc9MSsyJywgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0LCA0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnPSJBQkMiJywgICAgICAgICAgICAgICAgICAgdW5kZWYsICAgJ0RFRicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICc9SUYoQTEgPiAxLCBUUlVFLCBGQUxTRSknLCB1bmRlZiwgICAnVFJVRScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICc9MS8wJywgICAgICAgICAgICAgICAgICAgICB1bmRlZiwgICAnI0RJVi8wIScpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvZm9ybXVsYV9yZXN1bHQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBoZWFkZXJzLnBsCisKKworCitUaGlzIHByb2dyYW0gc2hvd3Mgc2V2ZXJhbCBleGFtcGxlcyBvZiBob3cgdG8gc2V0IHVwIGhlYWRlcnMgYW5kCitmb290ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoZSBjb250cm9sIGNoYXJhY3RlcnMgdXNlZCBpbiB0aGUgaGVhZGVyL2Zvb3RlciBzdHJpbmdzIGFyZToKKworICAgIENvbnRyb2wgICAgICAgICAgICAgQ2F0ZWdvcnkgICAgICAgICAgICBEZXNjcmlwdGlvbgorICAgID09PT09PT0gICAgICAgICAgICAgPT09PT09PT0gICAgICAgICAgICA9PT09PT09PT09PQorICAgICZMICAgICAgICAgICAgICAgICAgSnVzdGlmaWNhdGlvbiAgICAgICBMZWZ0CisgICAgJkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRlcgorICAgICZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSaWdodAorCisgICAgJlAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiAgICAgICAgIFBhZ2UgbnVtYmVyCisgICAgJk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBwYWdlcworICAgICZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlCisgICAgJlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUKKyAgICAmRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBuYW1lCisgICAgJkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCBuYW1lCisKKyAgICAmZm9udHNpemUgICAgICAgICAgIEZvbnQgICAgICAgICAgICAgICAgRm9udCBzaXplCisgICAgJiJmb250LHN0eWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnQgbmFtZSBhbmQgc3R5bGUKKyAgICAmVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlIHVuZGVybGluZQorICAgICZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGUgdW5kZXJsaW5lCisgICAgJlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2gKKyAgICAmWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwZXJzY3JpcHQKKyAgICAmWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Vic2NyaXB0CisKKyAgICAmJiAgICAgICAgICAgICAgICAgIE1pc2NlbGxhbmVvdXMgICAgICAgTGl0ZXJhbCBhbXBlcnNhbmQgJgorCitTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvaGVhZGVycy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGhlYWRlcnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gc2hvd3Mgc2V2ZXJhbCBleGFtcGxlcyBvZiBob3cgdG8gc2V0IHVwIGhlYWRlcnMgYW5kCisgICAgIyBmb290ZXJzIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhlIGNvbnRyb2wgY2hhcmFjdGVycyB1c2VkIGluIHRoZSBoZWFkZXIvZm9vdGVyIHN0cmluZ3MgYXJlOgorICAgICMKKyAgICAjICAgICBDb250cm9sICAgICAgICAgICAgIENhdGVnb3J5ICAgICAgICAgICAgRGVzY3JpcHRpb24KKyAgICAjICAgICA9PT09PT09ICAgICAgICAgICAgID09PT09PT09ICAgICAgICAgICAgPT09PT09PT09PT0KKyAgICAjICAgICAmTCAgICAgICAgICAgICAgICAgIEp1c3RpZmljYXRpb24gICAgICAgTGVmdAorICAgICMgICAgICZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50ZXIKKyAgICAjICAgICAmUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHQKKyAgICAjCisgICAgIyAgICAgJlAgICAgICAgICAgICAgICAgICBJbmZvcm1hdGlvbiAgICAgICAgIFBhZ2UgbnVtYmVyCisgICAgIyAgICAgJk4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsIG51bWJlciBvZiBwYWdlcworICAgICMgICAgICZEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlCisgICAgIyAgICAgJlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWUKKyAgICAjICAgICAmRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBuYW1lCisgICAgIyAgICAgJkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtzaGVldCBuYW1lCisgICAgIworICAgICMgICAgICZmb250c2l6ZSAgICAgICAgICAgRm9udCAgICAgICAgICAgICAgICBGb250IHNpemUKKyAgICAjICAgICAmImZvbnQsc3R5bGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9udCBuYW1lIGFuZCBzdHlsZQorICAgICMgICAgICZVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGUgdW5kZXJsaW5lCisgICAgIyAgICAgJkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZSB1bmRlcmxpbmUKKyAgICAjICAgICAmUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWtldGhyb3VnaAorICAgICMgICAgICZYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdAorICAgICMgICAgICZZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzY3JpcHQKKyAgICAjCisgICAgIyAgICAgJiYgICAgICAgICAgICAgICAgICBNaXNjZWxsYW5lb3VzICAgICAgIExpdGVyYWwgYW1wZXJzYW5kICYKKyAgICAjCisgICAgIyBTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiaGVhZGVycy54bHMiKTsKKyAgICBteSAkcHJldmlldyAgID0gIlNlbGVjdCBQcmludCBQcmV2aWV3IHRvIHNlZSB0aGUgaGVhZGVyIGFuZCBmb290ZXIiOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIHRvIHN0YXJ0CisgICAgIworICAgIG15ICR3b3Jrc2hlZXQxICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnU2ltcGxlJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjEgICAgID0gJyZDSGVyZSBpcyBzb21lIGNlbnRyZWQgdGV4dC4nOworICAgIAorICAgIG15ICRmb290ZXIxICAgICA9ICcmTEhlcmUgaXMgc29tZSBsZWZ0IGFsaWduZWQgdGV4dC4nOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQxLT5zZXRfaGVhZGVyKCRoZWFkZXIxKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X2Zvb3RlcigkZm9vdGVyMSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgJHByZXZpZXcpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc29tZSBvZiB0aGUgaGVhZGVyL2Zvb3RlciB2YXJpYWJsZXMuCisgICAgIworICAgIG15ICR3b3Jrc2hlZXQyICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVmFyaWFibGVzJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjIgICAgID0gJyZMUGFnZSAmUCBvZiAmTicuCisgICAgICAgICAgICAgICAgICAgICAgJyZDRmlsZW5hbWU6ICZGJyAuCisgICAgICAgICAgICAgICAgICAgICAgJyZSU2hlZXRuYW1lOiAmQSc7CisgICAgCisgICAgbXkgJGZvb3RlcjIgICAgID0gJyZMQ3VycmVudCBkYXRlOiAmRCcuCisgICAgICAgICAgICAgICAgICAgICAgJyZSQ3VycmVudCB0aW1lOiAmVCc7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9oZWFkZXIoJGhlYWRlcjIpOworICAgICR3b3Jrc2hlZXQyLT5zZXRfZm9vdGVyKCRmb290ZXIyKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEnLCAkcHJldmlldyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMjEnLCAiTmV4dCBzaGVldCIpOworICAgICR3b3Jrc2hlZXQyLT5zZXRfaF9wYWdlYnJlYWtzKDIwKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgbW9yZSB0aGFuIG9uZSBmb250CisgICAgIworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdNaXhlZCBmb250cycpOworICAgIAorICAgIG15ICRoZWFkZXIzICAgID0gJyZDJyAuCisgICAgICAgICAgICAgICAgICAgICAnJiJDb3VyaWVyIE5ldyxCb2xkIkhlbGxvICcgLgorICAgICAgICAgICAgICAgICAgICAgJyYiQXJpYWwsSXRhbGljIldvcmxkJzsKKyAgICAKKyAgICBteSAkZm9vdGVyMyAgICA9ICcmQycgLgorICAgICAgICAgICAgICAgICAgICAgJyYiU3ltYm9sImUnIC4KKyAgICAgICAgICAgICAgICAgICAgICcmIkFyaWFsIiA9IG1jJlgyJzsKKyAgICAKKyAgICAkd29ya3NoZWV0My0+c2V0X2hlYWRlcigkaGVhZGVyMyk7CisgICAgJHdvcmtzaGVldDMtPnNldF9mb290ZXIoJGZvb3RlcjMpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBsaW5lIHdyYXBwaW5nCisgICAgIworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdXb3JkIHdyYXAnKTsKKyAgICAKKyAgICBteSAkaGVhZGVyNCAgICA9ICImQ0hlYWRpbmcgMVxuSGVhZGluZyAyXG5IZWFkaW5nIDMiOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfaGVhZGVyKCRoZWFkZXI0KTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgnQTEnLCAkcHJldmlldyk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaW5zZXJ0aW5nIGEgbGl0ZXJhbCBhbXBlcnNhbmQgJgorICAgICMKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQW1wZXJzYW5kJyk7CisgICAgCisgICAgbXkgJGhlYWRlcjUgICAgPSAiJkNDdXJpb3VzZXIgJiYgQ3VyaW91c2VyIC0gQXR0b3JuZXlzIGF0IExhdyI7CisgICAgCisgICAgJHdvcmtzaGVldDUtPnNldF9oZWFkZXIoJGhlYWRlcjUpOworICAgIAorICAgICR3b3Jrc2hlZXQ1LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdBMScsICRwcmV2aWV3KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaGVhZGVycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGhpZGVfc2hlZXQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGhpZGUgYSB3b3Jrc2hlZXQgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvaGlkZV9zaGVldC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIGhpZGVfc2hlZXQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gaGlkZSBhIHdvcmtzaGVldCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXByaWwgMjAwNSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnaGlkZGVuLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgU2hlZXQyIHdvbid0IGJlIHZpc2libGUgdW50aWwgaXQgaXMgdW5oaWRkZW4gaW4gRXhjZWwuCisgICAgJHdvcmtzaGVldDItPmhpZGUoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoMCwgMCwgJ1NoZWV0MiBpcyBoaWRkZW4nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgJ0hvdyBkaWQgeW91IGZpbmQgbWU/Jyk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKDAsIDAsICdTaGVldDIgaXMgaGlkZGVuJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oaWRlX3NoZWV0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogaHlwZXJsaW5rMS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byB3cml0ZSBoeXBlcmxpbmtzLgorCitTZWUgYWxzbyBoeXBlcmxpbmsyLnBsIGZvciB3b3Jrc2hlZXQgVVJMIGV4YW1wbGVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9oeXBlcmxpbmsxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gaHlwZXJsaW5rMS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUgaHlwZXJsaW5rcy4KKyAgICAjCisgICAgIyBTZWUgYWxzbyBoeXBlcmxpbmsyLnBsIGZvciB3b3Jrc2hlZXQgVVJMIGV4YW1wbGVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiaHlwZXJsaW5rLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0h5cGVybGlua3MnKTsKKyAgICAKKyAgICAjIEZvcm1hdCB0aGUgZmlyc3QgY29sdW1uCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9zZWxlY3Rpb24oJ0IxJyk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBzYW1wbGUgZm9ybWF0CisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmb3JtYXQtPnNldF9zaXplKDEyKTsKKyAgICAkZm9ybWF0LT5zZXRfYm9sZCgpOworICAgICRmb3JtYXQtPnNldF9jb2xvcigncmVkJyk7CisgICAgJGZvcm1hdC0+c2V0X3VuZGVybGluZSgpOworICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBoeXBlcmxpbmtzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ2h0dHA6Ly93d3cucGVybC5jb20vJyAgICAgICAgICAgICAgICApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICdodHRwOi8vd3d3LnBlcmwuY29tLycsICdQZXJsIGhvbWUnICAgKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nLCB1bmRlZiwgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E3JywgJ21haWx0bzpqbWNuYW1hcmFAY3Bhbi5vcmcnLCAnTWFpbCBtZScpOworICAgIAorICAgICMgV3JpdGUgYSBVUkwgdGhhdCBpc24ndCBhIGh5cGVybGluaworICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZygnQTknLCAnaHR0cDovL3d3dy5wZXJsLmNvbS8nKTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaHlwZXJsaW5rMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGh5cGVybGluazIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gd3JpdGUgaW50ZXJuYWwgYW5kIGludGVybmFsCitoeXBlcmxpbmtzLgorCitJZiB5b3Ugd2lzaCB0byBydW4gdGhpcyBwcm9ncmFtIGFuZCBmb2xsb3cgdGhlIGh5cGVybGlua3MgeW91IHNob3VsZCBjcmVhdGUKK3RoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZToKKworICAgIEM6XCAtLSBUZW1wIC0tKy0tIEV1cm9wZQorICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgXC0tIEFzaWEKKworCitTZWUgYWxzbyBoeXBlcmxpbmsxLnBsIGZvciB3ZWIgVVJMIGV4YW1wbGVzLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFdyaXRlRXhjZWwgbW9kdWxlIHRvIHdyaXRlIGludGVybmFsIGFuZCBpbnRlcm5hbAorICAgICMgaHlwZXJsaW5rcy4KKyAgICAjCisgICAgIyBJZiB5b3Ugd2lzaCB0byBydW4gdGhpcyBwcm9ncmFtIGFuZCBmb2xsb3cgdGhlIGh5cGVybGlua3MgeW91IHNob3VsZCBjcmVhdGUKKyAgICAjIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZToKKyAgICAjCisgICAgIyAgICAgQzpcIC0tIFRlbXAgLS0rLS0gRXVyb3BlCisgICAgIyAgICAgICAgICAgICAgICAgICB8CisgICAgIyAgICAgICAgICAgICAgICAgICBcLS0gQXNpYQorICAgICMKKyAgICAjCisgICAgIyBTZWUgYWxzbyBoeXBlcmxpbmsxLnBsIGZvciB3ZWIgVVJMIGV4YW1wbGVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgRmVicnVhcnkgMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIHRocmVlIHdvcmtib29rczoKKyAgICAjICAgQzpcVGVtcFxFdXJvcGVcSXJlbGFuZC54bHMKKyAgICAjICAgQzpcVGVtcFxFdXJvcGVcSXRhbHkueGxzCisgICAgIyAgIEM6XFRlbXBcQXNpYVxDaGluYS54bHMKKyAgICAjCisgICAgbXkgJGlyZWxhbmQgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ0M6XFRlbXBcRXVyb3BlXElyZWxhbmQueGxzJyk7CisgICAgbXkgJGlyZV9saW5rcyA9ICRpcmVsYW5kLT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRpcmVfc2FsZXMgPSAkaXJlbGFuZC0+YWRkX3dvcmtzaGVldCgnU2FsZXMnKTsKKyAgICBteSAkaXJlX2RhdGEgID0gJGlyZWxhbmQtPmFkZF93b3Jrc2hlZXQoJ1Byb2R1Y3QgRGF0YScpOworICAgIAorICAgIG15ICRpdGFseSAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdDOlxUZW1wXEV1cm9wZVxJdGFseS54bHMnKTsKKyAgICBteSAkaXRhX2xpbmtzID0gJGl0YWx5LT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRpdGFfc2FsZXMgPSAkaXRhbHktPmFkZF93b3Jrc2hlZXQoJ1NhbGVzJyk7CisgICAgbXkgJGl0YV9kYXRhICA9ICRpdGFseS0+YWRkX3dvcmtzaGVldCgnUHJvZHVjdCBEYXRhJyk7CisgICAgCisgICAgbXkgJGNoaW5hICAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ0M6XFRlbXBcQXNpYVxDaGluYS54bHMnKTsKKyAgICBteSAkY2hhX2xpbmtzID0gJGNoaW5hLT5hZGRfd29ya3NoZWV0KCdMaW5rcycpOworICAgIG15ICRjaGFfc2FsZXMgPSAkY2hpbmEtPmFkZF93b3Jrc2hlZXQoJ1NhbGVzJyk7CisgICAgbXkgJGNoYV9kYXRhICA9ICRjaGluYS0+YWRkX3dvcmtzaGVldCgnUHJvZHVjdCBEYXRhJyk7CisgICAgCisgICAgIyBBZGQgYSBmb3JtYXQKKyAgICBteSAkZm9ybWF0ID0gJGlyZWxhbmQtPmFkZF9mb3JtYXQoY29sb3IgPT4gJ2dyZWVuJywgYm9sZCA9PiAxKTsKKyAgICAkaXJlX2xpbmtzLT5zZXRfY29sdW1uKCdBOkInLCAyNSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGludGVybmFsIGxpbmtzCisgICAgIworICAgICRpcmVfbGlua3MtPndyaXRlKCdBMScsICdJbnRlcm5hbCBsaW5rcycsICRmb3JtYXQpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluaworICAgICRpcmVfbGlua3MtPndyaXRlKCdBMicsICdpbnRlcm5hbDpTYWxlcyFBMicpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayB0byBhIHJhbmdlCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0EzJywgJ2ludGVybmFsOlNhbGVzIUEzOkQzJyk7CisgICAgCisgICAgIyBJbnRlcm5hbCBsaW5rIHdpdGggYW4gYWx0ZXJuYXRpdmUgc3RyaW5nCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0E0JywgJ2ludGVybmFsOlNhbGVzIUE0JywgJ0xpbmsnKTsKKyAgICAKKyAgICAjIEludGVybmFsIGxpbmsgd2l0aCBhIGZvcm1hdAorICAgICRpcmVfbGlua3MtPndyaXRlKCdBNScsICdpbnRlcm5hbDpTYWxlcyFBNScsICRmb3JtYXQpOworICAgIAorICAgICMgSW50ZXJuYWwgbGluayB3aXRoIGFuIGFsdGVybmF0aXZlIHN0cmluZyBhbmQgZm9ybWF0CisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0E2JywgJ2ludGVybmFsOlNhbGVzIUE2JywgJ0xpbmsnLCAkZm9ybWF0KTsKKyAgICAKKyAgICAjIEludGVybmFsIGxpbmsgKHNwYWNlcyBpbiB3b3Jrc2hlZXQgbmFtZSkKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQTcnLCBxe2ludGVybmFsOidQcm9kdWN0IERhdGEnIUE3fSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGVzIG9mIGV4dGVybmFsIGxpbmtzCisgICAgIworICAgICRpcmVfbGlua3MtPndyaXRlKCdCMScsICdFeHRlcm5hbCBsaW5rcycsICRmb3JtYXQpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIGxvY2FsIGZpbGUKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjInLCAnZXh0ZXJuYWw6SXRhbHkueGxzJyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgbG9jYWwgZmlsZSB3aXRoIHdvcmtzaGVldAorICAgICRpcmVfbGlua3MtPndyaXRlKCdCMycsICdleHRlcm5hbDpJdGFseS54bHMjU2FsZXMhQjMnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSBsb2NhbCBmaWxlIHdpdGggd29ya3NoZWV0IGFuZCBhbHRlcm5hdGl2ZSBzdHJpbmcKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjQnLCAnZXh0ZXJuYWw6SXRhbHkueGxzI1NhbGVzIUI0JywgJ0xpbmsnKTsKKyAgICAKKyAgICAjIEV4dGVybmFsIGxpbmsgdG8gYSBsb2NhbCBmaWxlIHdpdGggd29ya3NoZWV0IGFuZCBmb3JtYXQKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjUnLCAnZXh0ZXJuYWw6SXRhbHkueGxzI1NhbGVzIUI1JywgJGZvcm1hdCk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUsIGFic29sdXRlIHBhdGgKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjYnLCAnZXh0ZXJuYWw6YzovVGVtcC9Bc2lhL0NoaW5hLnhscycpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIHJlbW90ZSBmaWxlLCByZWxhdGl2ZSBwYXRoCisgICAgJGlyZV9saW5rcy0+d3JpdGUoJ0I3JywgJ2V4dGVybmFsOi4uL0FzaWEvQ2hpbmEueGxzJyk7CisgICAgCisgICAgIyBFeHRlcm5hbCBsaW5rIHRvIGEgcmVtb3RlIGZpbGUgd2l0aCB3b3Jrc2hlZXQKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjgnLCAnZXh0ZXJuYWw6YzovVGVtcC9Bc2lhL0NoaW5hLnhscyNTYWxlcyFCOCcpOworICAgIAorICAgICMgRXh0ZXJuYWwgbGluayB0byBhIHJlbW90ZSBmaWxlIHdpdGggd29ya3NoZWV0ICh3aXRoIHNwYWNlcyBpbiB0aGUgbmFtZSkKKyAgICAkaXJlX2xpbmtzLT53cml0ZSgnQjknLCBxe2V4dGVybmFsOmM6L1RlbXAvQXNpYS9DaGluYS54bHMjJ1Byb2R1Y3QgRGF0YSchQjl9KTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU29tZSB1dGlsaXR5IGxpbmtzIHRvIHJldHVybiB0byB0aGUgbWFpbiBzaGVldAorICAgICMKKyAgICAkaXJlX3NhbGVzLT53cml0ZSgnQTInLCAnaW50ZXJuYWw6TGlua3MhQTInLCAnQmFjaycpOworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBMycsICdpbnRlcm5hbDpMaW5rcyFBMycsICdCYWNrJyk7CisgICAgJGlyZV9zYWxlcy0+d3JpdGUoJ0E0JywgJ2ludGVybmFsOkxpbmtzIUE0JywgJ0JhY2snKTsKKyAgICAkaXJlX3NhbGVzLT53cml0ZSgnQTUnLCAnaW50ZXJuYWw6TGlua3MhQTUnLCAnQmFjaycpOworICAgICRpcmVfc2FsZXMtPndyaXRlKCdBNicsICdpbnRlcm5hbDpMaW5rcyFBNicsICdCYWNrJyk7CisgICAgJGlyZV9kYXRhLT4gd3JpdGUoJ0E3JywgJ2ludGVybmFsOkxpbmtzIUE3JywgJ0JhY2snKTsKKyAgICAKKyAgICAkaXRhX2xpbmtzLT53cml0ZSgnQTEnLCAnZXh0ZXJuYWw6SXJlbGFuZC54bHMjTGlua3MhQjInLCAnQmFjaycpOworICAgICRpdGFfc2FsZXMtPndyaXRlKCdCMycsICdleHRlcm5hbDpJcmVsYW5kLnhscyNMaW5rcyFCMycsICdCYWNrJyk7CisgICAgJGl0YV9zYWxlcy0+d3JpdGUoJ0I0JywgJ2V4dGVybmFsOklyZWxhbmQueGxzI0xpbmtzIUI0JywgJ0JhY2snKTsKKyAgICAkaXRhX3NhbGVzLT53cml0ZSgnQjUnLCAnZXh0ZXJuYWw6SXJlbGFuZC54bHMjTGlua3MhQjUnLCAnQmFjaycpOworICAgICRjaGFfbGlua3MtPndyaXRlKCdBMScsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjYnLCAnQmFjaycpOworICAgICRjaGFfc2FsZXMtPndyaXRlKCdCOCcsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjgnLCAnQmFjaycpOworICAgICRjaGFfZGF0YS0+IHdyaXRlKCdCOScsICdleHRlcm5hbDouLi9FdXJvcGUvSXJlbGFuZC54bHMjTGlua3MhQjknLCAnQmFjaycpOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9oeXBlcmxpbmsyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaW1hZ2VzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBpbnNlcnQgaW1hZ2VzIGludG8gYW4gRXhjZWwgd29ya3NoZWV0IHVzaW5nIHRoZQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgaW5zZXJ0X2ltYWdlKCkgbWV0aG9kLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9pbWFnZXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBpbWFnZXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gaW5zZXJ0IGltYWdlcyBpbnRvIGFuIEV4Y2VsIHdvcmtzaGVldCB1c2luZyB0aGUKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGluc2VydF9pbWFnZSgpIG1ldGhvZC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE9jdG9iZXIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGNhbGxlZCBzaW1wbGUueGxzIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoImltYWdlcy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW1hZ2UgMScpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdJbWFnZSAyJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0ltYWdlIDMnKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnSW1hZ2UgNCcpOworICAgIAorICAgICMgSW5zZXJ0IGEgYmFzaWMgaW1hZ2UKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMCcsICJJbWFnZSBpbnNlcnRlZCBpbnRvIHdvcmtzaGVldC4iKTsKKyAgICAkd29ya3NoZWV0MS0+aW5zZXJ0X2ltYWdlKCdBMScsICdyZXB1YmxpYy5wbmcnKTsKKyAgICAKKyAgICAKKyAgICAjIEluc2VydCBhbiBpbWFnZSB3aXRoIGFuIG9mZnNldAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEwJywgIkltYWdlIGluc2VydGVkIHdpdGggYW4gb2Zmc2V0LiIpOworICAgICR3b3Jrc2hlZXQyLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycsIDMyLCAxMCk7CisgICAgCisgICAgIyBJbnNlcnQgYSBzY2FsZWQgaW1hZ2UKKyAgICAkd29ya3NoZWV0My0+d3JpdGUoJ0ExMCcsICJJbWFnZSBzY2FsZWQ6IHdpZHRoIHggMiwgaGVpZ2h0IHggMC44LiIpOworICAgICR3b3Jrc2hlZXQzLT5pbnNlcnRfaW1hZ2UoJ0ExJywgJ3JlcHVibGljLnBuZycsIDAsIDAsIDIsIDAuOCk7CisgICAgCisgICAgIyBJbnNlcnQgYW4gaW1hZ2Ugb3ZlciB2YXJpZWQgY29sdW1uIGFuZCByb3cgc2l6ZXMKKyAgICAjIFRoaXMgZG9lcyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCB3b3JrCisgICAgCisgICAgIyBTZXQgdGhlIGNvbHMgYW5kIHJvdyBzaXplcworICAgICMgTk9URTogeW91IG11c3QgZG8gdGhpcyBiZWZvcmUgeW91IGNhbGwgaW5zZXJ0X2ltYWdlKCkKKyAgICAkd29ya3NoZWV0NC0+c2V0X2NvbHVtbignQTpBJywgNSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9jb2x1bW4oJ0I6QicsIHVuZGVmLCB1bmRlZiwgMSk7ICMgSGlkZGVuCisgICAgJHdvcmtzaGVldDQtPnNldF9jb2x1bW4oJ0M6RCcsIDEwKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygwLCAzMCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMywgNSk7CisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlKCdBMTAnLCAiSW1hZ2UgaW5zZXJ0ZWQgb3ZlciBzY2FsZWQgcm93cyBhbmQgY29sdW1ucy4iKTsKKyAgICAkd29ya3NoZWV0NC0+aW5zZXJ0X2ltYWdlKCdBMScsICdyZXB1YmxpYy5wbmcnKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvaW1hZ2VzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogaW5kZW50LnBsCisKKworCitBIHNpbXBsZSBmb3JtYXR0aW5nIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKK1RoaXMgcHJvZ3JhbSBkZW1vbnN0cmF0ZXMgdGhlIGluZGVudGF0aW9uIGNlbGwgZm9ybWF0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9pbmRlbnQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBpbmRlbnQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGZvcm1hdHRpbmcgZXhhbXBsZSB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIHByb2dyYW0gZGVtb25zdHJhdGVzIHRoZSBpbmRlbnRhdGlvbiBjZWxsIGZvcm1hdC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ2luZGVudC54bHMnKTsKKyAgICAKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGluZGVudDEgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChpbmRlbnQgPT4gMSk7CisgICAgbXkgJGluZGVudDIgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChpbmRlbnQgPT4gMik7CisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNDApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICJUaGlzIHRleHQgaXMgaW5kZW50ZWQgMSBsZXZlbCIsICAkaW5kZW50MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgIlRoaXMgdGV4dCBpcyBpbmRlbnRlZCAyIGxldmVscyIsICRpbmRlbnQyKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2luZGVudC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IG1lcmdlMS5wbAorCisKKworU2ltcGxlIGV4YW1wbGUgb2YgbWVyZ2luZyBjZWxscyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitUaGlzIGV4YW1wbGUgbWVyZ2VzIHRocmVlIGNlbGxzIHVzaW5nIHRoZSAiQ2VudHJlIEFjcm9zcyBTZWxlY3Rpb24iCithbGlnbm1lbnQgd2hpY2ggd2FzIHRoZSBFeGNlbCA1IG1ldGhvZCBvZiBhY2hpZXZpbmcgYSBtZXJnZS4gRm9yIGEgbW9yZQorbW9kZXJuIGFwcHJvYWNoIHVzZSB0aGUgbWVyZ2VfcmFuZ2UoKSB3b3Jrc2hlZXQgbWV0aG9kIGluc3RlYWQuCitTZWUgdGhlIG1lcmdlMy5wbCAtIG1lcmdlNi5wbCBwcm9ncmFtcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2UxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2UxLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2ltcGxlIGV4YW1wbGUgb2YgbWVyZ2luZyBjZWxscyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBtZXJnZXMgdGhyZWUgY2VsbHMgdXNpbmcgdGhlICJDZW50cmUgQWNyb3NzIFNlbGVjdGlvbiIKKyAgICAjIGFsaWdubWVudCB3aGljaCB3YXMgdGhlIEV4Y2VsIDUgbWV0aG9kIG9mIGFjaGlldmluZyBhIG1lcmdlLiBGb3IgYSBtb3JlCisgICAgIyBtb2Rlcm4gYXBwcm9hY2ggdXNlIHRoZSBtZXJnZV9yYW5nZSgpIHdvcmtzaGVldCBtZXRob2QgaW5zdGVhZC4KKyAgICAjIFNlZSB0aGUgbWVyZ2UzLnBsIC0gbWVyZ2U2LnBsIHByb2dyYW1zLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIm1lcmdlMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RCcsIDIwKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KDIsIDMwKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIG1lcmdlIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY2VudGVyX2Fjcm9zcyA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAjIE9ubHkgb25lIGNlbGwgc2hvdWxkIGNvbnRhaW4gdGV4dCwgdGhlIG90aGVycyBzaG91bGQgYmUgYmxhbmsuCisgICAgJHdvcmtzaGVldC0+d3JpdGUgICAgICAoMiwgMSwgIkNlbnRlciBhY3Jvc3Mgc2VsZWN0aW9uIiwgJGZvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfYmxhbmsoMiwgMiwgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKDIsIDMsICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2UxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2UyLnBsCisKKworCitTaW1wbGUgZXhhbXBsZSBvZiBtZXJnaW5nIGNlbGxzIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKworVGhpcyBleGFtcGxlIG1lcmdlcyB0aHJlZSBjZWxscyB1c2luZyB0aGUgIkNlbnRyZSBBY3Jvc3MgU2VsZWN0aW9uIgorYWxpZ25tZW50IHdoaWNoIHdhcyB0aGUgRXhjZWwgNSBtZXRob2Qgb2YgYWNoaWV2aW5nIGEgbWVyZ2UuIEZvciBhIG1vcmUKK21vZGVybiBhcHByb2FjaCB1c2UgdGhlIG1lcmdlX3JhbmdlKCkgd29ya3NoZWV0IG1ldGhvZCBpbnN0ZWFkLgorU2VlIHRoZSBtZXJnZTMucGwgLSBtZXJnZTYucGwgcHJvZ3JhbXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlMi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlMi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNpbXBsZSBleGFtcGxlIG9mIG1lcmdpbmcgY2VsbHMgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBtZXJnZXMgdGhyZWUgY2VsbHMgdXNpbmcgdGhlICJDZW50cmUgQWNyb3NzIFNlbGVjdGlvbiIKKyAgICAjIGFsaWdubWVudCB3aGljaCB3YXMgdGhlIEV4Y2VsIDUgbWV0aG9kIG9mIGFjaGlldmluZyBhIG1lcmdlLiBGb3IgYSBtb3JlCisgICAgIyBtb2Rlcm4gYXBwcm9hY2ggdXNlIHRoZSBtZXJnZV9yYW5nZSgpIHdvcmtzaGVldCBtZXRob2QgaW5zdGVhZC4KKyAgICAjIFNlZSB0aGUgbWVyZ2UzLnBsIC0gbWVyZ2U2LnBsIHByb2dyYW1zLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIm1lcmdlMi54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMSwgMiwgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMiwgNDApOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgbWVyZ2VkIGZvcm1hdAorICAgIG15ICRmb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcl9hY3Jvc3MgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgICAgID0+IDE1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgICAgICA9PiAnd2hpdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciAgICAgICAgPT4gJ2dyZWVuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyX2NvbG9yICAgID0+ICd5ZWxsb3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICAgICAgPT4gJ3ZjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICMgT25seSBvbmUgY2VsbCBzaG91bGQgY29udGFpbiB0ZXh0LCB0aGUgb3RoZXJzIHNob3VsZCBiZSBibGFuay4KKyAgICAkd29ya3NoZWV0LT53cml0ZSAgICAgICgyLCAxLCAiQ2VudGVyIGFjcm9zcyBzZWxlY3Rpb24iLCAkZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygyLCAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2UyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2UzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgYSBoeXBlcmxpbmsgaW4gYQorbWVyZ2VkIGNlbGwuIFRoZXJlIGFyZSB0d28gb3B0aW9ucyB3cml0ZV91cmxfcmFuZ2UoKSB3aXRoIGEgc3RhbmRhcmQgbWVyZ2UKK2Zvcm1hdCBvciBtZXJnZV9yYW5nZSgpLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gd3JpdGUgYSBoeXBlcmxpbmsgaW4gYQorICAgICMgbWVyZ2VkIGNlbGwuIFRoZXJlIGFyZSB0d28gb3B0aW9ucyB3cml0ZV91cmxfcmFuZ2UoKSB3aXRoIGEgc3RhbmRhcmQgbWVyZ2UKKyAgICAjIGZvcm1hdCBvciBtZXJnZV9yYW5nZSgpLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlMy54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDMwKSBmb3IgKDEsIDMsIDYsIDcpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6RCcsIDIwKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBNZXJnZSBjZWxscyBjb250YWluaW5nIGEgaHlwZXJsaW5rIHVzaW5nIHdyaXRlX3VybF9yYW5nZSgpCisgICAgIyBhbmQgdGhlIHN0YW5kYXJkIEV4Y2VsIDUrIG1lcmdlIHByb3BlcnR5LgorICAgICMKKyAgICBteSAkZm9ybWF0MSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJfYWNyb3NzICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgY2VsbHMgdG8gYmUgbWVyZ2VkCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXJsX3JhbmdlKCdCMjpEMicsICdodHRwOi8vd3d3LnBlcmwuY29tJywgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX2JsYW5rKCdDMicsICRmb3JtYXQxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9ibGFuaygnRDInLCAkZm9ybWF0MSk7CisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogTWVyZ2UgY2VsbHMgY29udGFpbmluZyBhIGh5cGVybGluayB1c2luZyBtZXJnZV9yYW5nZSgpLgorICAgICMKKyAgICBteSAkZm9ybWF0MiA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ2JsdWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAjIE1lcmdlIDMgY2VsbHMKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjQ6RDQnLCAnaHR0cDovL3d3dy5wZXJsLmNvbScsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAjIE1lcmdlIDMgY2VsbHMgb3ZlciB0d28gcm93cworICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCNzpEOCcsICdodHRwOi8vd3d3LnBlcmwuY29tJywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfcmFuZ2UoKSB3b3JrYm9vaworbWV0aG9kIHdpdGggY29tcGxleCBmb3JtYXR0aW5nLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9tZXJnZTQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBtZXJnZTQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1lcmdlX3JhbmdlKCkgd29ya2Jvb2sKKyAgICAjIG1ldGhvZCB3aXRoIGNvbXBsZXggZm9ybWF0dGluZy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdtZXJnZTQueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgSW5jcmVhc2UgdGhlIGNlbGwgc2l6ZSBvZiB0aGUgbWVyZ2VkIGNlbGxzIHRvIGhpZ2hsaWdodCB0aGUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRfLCAzMCkgZm9yICgxLi4xMSk7CisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQjpEJywgMjApOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IFRleHQgY2VudGVyZWQgdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5CisgICAgIworICAgIG15ICRmb3JtYXQxID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICd2Y2VudGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgID0+ICdjZW50ZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjI6RDMnLCAnVmVydGljYWwgYW5kIGhvcml6b250YWwnLCAkZm9ybWF0MSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogVGV4dCBhbGlnbmVkIHRvIHRoZSB0b3AgYW5kIGxlZnQKKyAgICAjCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ3RvcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICA9PiAnbGVmdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I1OkQ2JywgJ0FsaWduZWQgdG8gdGhlIHRvcCBhbmQgbGVmdCcsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzOiAgVGV4dCBhbGlnbmVkIHRvIHRoZSBib3R0b20gYW5kIHJpZ2h0CisgICAgIworICAgIG15ICRmb3JtYXQzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gID0+ICdib3R0b20nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgPT4gJ3JpZ2h0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjg6RDknLCAnQWxpZ25lZCB0byB0aGUgYm90dG9tIGFuZCByaWdodCcsICRmb3JtYXQzKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0OiAgVGV4dCBqdXN0aWZpZWQgKGkuZS4gd3JhcHBlZCkgaW4gdGhlIGNlbGwKKyAgICAjCisgICAgbXkgJGZvcm1hdDQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgPT4gJ3RvcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICA9PiAnanVzdGlmeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0IxMTpEMTInLCAnSnVzdGlmaWVkOiAnLidzbyBvbiBhbmQgJyB4MTgsICRmb3JtYXQ0KTsKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbWVyZ2U0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogbWVyZ2U1LnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1lcmdlX2NlbGxzKCkgd29ya2Jvb2sKK21ldGhvZCB3aXRoIGNvbXBsZXggZm9ybWF0dGluZyBhbmQgcm90YXRpb24uCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvbWVyZ2U1LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gbWVyZ2U1LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtZXJnZV9jZWxscygpIHdvcmtib29rCisgICAgIyBtZXRob2Qgd2l0aCBjb21wbGV4IGZvcm1hdHRpbmcgYW5kIHJvdGF0aW9uLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCdtZXJnZTUueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgSW5jcmVhc2UgdGhlIGNlbGwgc2l6ZSBvZiB0aGUgbWVyZ2VkIGNlbGxzIHRvIGhpZ2hsaWdodCB0aGUgZm9ybWF0dGluZy4KKyAgICAkd29ya3NoZWV0LT5zZXRfcm93KCRfLCAzNikgICAgICAgICBmb3IgKDMuLjgpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJF8sICRfICwgMTUpIGZvciAoMSwzLDUpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBSb3RhdGlvbiAxLCBsZXR0ZXJzIHJ1biBmcm9tIHRvcCB0byBib3R0b20KKyAgICAjCisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiAgICA9PiAyNzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I0OkI5JywgJ1JvdGF0aW9uIDI3MCcsICRmb3JtYXQxKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgUm90YXRpb24gMiwgOTCwIGFudGljbG9ja3dpc2UKKyAgICAjCisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yICAgICAgID0+ICdyZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlnbiAgICAgID0+ICd2Y2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbiAgICAgICA9PiAnY2VudHJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiAgICA9PiA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICAKKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnRDQ6RDknLCAnUm90YXRpb24gOTCwJywgJGZvcm1hdDIpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBSb3RhdGlvbiAzLCA5MLAgY2xvY2t3aXNlCisgICAgIworICAgIG15ICRmb3JtYXQzID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvcmRlciAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciAgICAgICA9PiAncmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZ24gICAgICA9PiAndmNlbnRyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2NlbnRyZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24gICAgPT4gLTkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdGNDpGOScsICdSb3RhdGlvbiAtOTCwJywgJGZvcm1hdDMpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtZXJnZTYucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfY2VsbHMoKSB3b3JrYm9vaworbWV0aG9kIHdpdGggVW5pY29kZSBzdHJpbmdzLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL21lcmdlNi5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIG1lcmdlNi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbWVyZ2VfY2VsbHMoKSB3b3JrYm9vaworICAgICMgbWV0aG9kIHdpdGggVW5pY29kZSBzdHJpbmdzLgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIERlY2VtYmVyIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ21lcmdlNi54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgIyBJbmNyZWFzZSB0aGUgY2VsbCBzaXplIG9mIHRoZSBtZXJnZWQgY2VsbHMgdG8gaGlnaGxpZ2h0IHRoZSBmb3JtYXR0aW5nLgorICAgICR3b3Jrc2hlZXQtPnNldF9yb3coJF8sIDM2KSBmb3IgMi4uOTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdCOkQnLCAyNSk7CisgICAgCisgICAgCisgICAgIyBGb3JtYXQgZm9yIHRoZSBtZXJnZWQgY2VsbHMuCisgICAgbXkgJGZvcm1hdCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXIgICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbGQgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgPT4gJ3JlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgPT4gMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWduICAgICAgPT4gJ3ZjZW50cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduICAgICAgID0+ICdsZWZ0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBXcml0ZSBhbiBBc2NpaSBzdHJpbmcuCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQtPm1lcmdlX3JhbmdlKCdCMzpENCcsICdBU0NJSTogQSBzaW1wbGUgc3RyaW5nJywgJGZvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFdyaXRlIGEgVVRGLTE2IFVuaWNvZGUgc3RyaW5nLgorICAgICMKKyAgICAKKyAgICAjIEEgcGhyYXNlIGluIEN5cmlsbGljIGVuY29kZWQgYXMgVVRGLTE2QkUuCisgICAgbXkgJHV0ZjE2X3N0ciA9IHBhY2sgIkgqIiwgJzAwNTUwMDU0MDA0NjAwMmQwMDMxMDAzNjAwM2EwMDIwJy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMDQyZDA0NDIwNDNlMDAyMDA0NDQwNDQwMDQzMDA0MzcwNDMwMDAyMDA0Jy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnM2QwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxJzsKKyAgICAKKyAgICAjIE5vdGUgdGhlIGV4dHJhIHBhcmFtZXRlciBhdCB0aGUgZW5kIHRvIGluZGljYXRlIFVURi0xNiBlbmNvZGluZy4KKyAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjY6RDcnLCAkdXRmMTZfc3RyLCAkZm9ybWF0LCAxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgV3JpdGUgYSBVVEYtOCBVbmljb2RlIHN0cmluZy4KKyAgICAjCisgICAgCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIG15ICRzbWlsZXkgPSBjaHIgMHgyNjNhOworICAgICAgICAkd29ya3NoZWV0LT5tZXJnZV9yYW5nZSgnQjk6RDEwJywgIlVURi04OiBBIFVuaWNvZGUgc21pbGV5ICRzbWlsZXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHdvcmtzaGVldC0+bWVyZ2VfcmFuZ2UoJ0I5OkQxMCcsICJVVEYtODogUmVxdWlyZXMgUGVybCA1LjgiLCAkZm9ybWF0KTsKKyAgICB9CisgICAgCisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tZXJnZTYucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtb2RfcGVybDEucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKK2ZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDEgYW5kIEFwYWNoZQorCitUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCit0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorCitUaGlzIHNjcmlwdCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2dpLnBsIGV4YW1wbGUuCisKK0NoYW5nZSB0aGUgbmFtZSBvZiB0aGlzIGZpbGUgdG8gQ2dpLnBtLgorQ2hhbmdlIHRoZSBwYWNrYWdlIGxvY2F0aW9uIHRvIHdoZXJlIGV2ZXIgeW91IGxvY2F0ZSB0aGlzIHBhY2thZ2UuCitJbiB0aGUgZXhhbXBsZSBiZWxvdyBpdCBpcyBsb2NhdGVkIGluIHRoZSBXcml0ZUV4Y2VsIGRpcmVjdG9yeS4KKworWW91ciBodHRwZC5jb25mIGVudHJ5IGZvciB0aGlzIG1vZHVsZSwgc2hvdWxkIHlvdSBjaG9vc2UgdG8gdXNlIGl0CithcyBhIHN0YW5kIGFsb25lIGFwcCwgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgorCisgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICAgUGVybEhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNnaQorICAgICAgUGVybFNlbmRIZWFkZXIgT24KKyAgICA8L0xvY2F0aW9uPgorCitUaGUgUGVybEhhbmRsZXIgbmFtZSBhYm92ZSBhbmQgdGhlIHBhY2thZ2UgbmFtZSBiZWxvdyAqaGF2ZSogdG8gbWF0Y2guCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8gc2VuZCBhbiBFeGNlbAorICAgICMgZmlsZSB0byBhIGJyb3dzZXIgdXNpbmcgbW9kX3BlcmwgMSBhbmQgQXBhY2hlCisgICAgIworICAgICMgVGhpcyBtb2R1bGUgdGllcyAqWExTIGRpcmVjdGx5IHRvIEFwYWNoZSwgYW5kIHdpdGggdGhlIGNvcnJlY3QKKyAgICAjIGNvbnRlbnQtZGlzcG9zaXRpb24vdHlwZXMgaXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZQorICAgICMgdGhlIGZpbGUsIG9yIG9wZW4gaXQgYXQgdGhpcyBsb2NhdGlvbi4KKyAgICAjCisgICAgIyBUaGlzIHNjcmlwdCBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY2dpLnBsIGV4YW1wbGUuCisgICAgIworICAgICMgQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgZmlsZSB0byBDZ2kucG0uCisgICAgIyBDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KKyAgICAjIEluIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIFlvdXIgaHR0cGQuY29uZiBlbnRyeSBmb3IgdGhpcyBtb2R1bGUsIHNob3VsZCB5b3UgY2hvb3NlIHRvIHVzZSBpdAorICAgICMgYXMgYSBzdGFuZCBhbG9uZSBhcHAsIHNob3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICMgICAgICAgU2V0SGFuZGxlciBwZXJsLXNjcmlwdAorICAgICMgICAgICAgUGVybEhhbmRsZXIgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkNnaQorICAgICMgICAgICAgUGVybFNlbmRIZWFkZXIgT24KKyAgICAjICAgICA8L0xvY2F0aW9uPgorICAgICMKKyAgICAjIFRoZSBQZXJsSGFuZGxlciBuYW1lIGFib3ZlIGFuZCB0aGUgcGFja2FnZSBuYW1lIGJlbG93ICpoYXZlKiB0byBtYXRjaC4KKyAgICAKKyAgICAjIEFwciAyMDAxLCBUaG9tYXMgU3VsbGl2YW4sIHdlYm1hc3RlckA4NjAub3JnCisgICAgIyBGZWIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2dpOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgUHJhZ21hIERlZmluaXRpb25zCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFJlcXVpcmVkIE1vZHVsZXMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICB1c2UgQXBhY2hlOjpDb25zdGFudHMgcXcoOmNvbW1vbik7CisgICAgdXNlIEFwYWNoZTo6UmVxdWVzdDsKKyAgICB1c2UgQXBhY2hlOjpVUkk7ICMgVGhpcyBtYXkgbm90IGJlIG5lZWRlZAorICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIE1haW4gQXBwIEJvZHkKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBzdWIgaGFuZGxlciB7CisgICAgICAgICMgTmV3IGFwYWNoZSBvYmplY3QKKyAgICAgICAgIyBTaG91bGQgeW91IGRlY2lkZSB0byB1c2UgaXQuCisgICAgICAgIG15ICRyID0gQXBhY2hlOjpSZXF1ZXN0LT5uZXcoc2hpZnQpOworICAgIAorICAgICAgICAjIFNldCB0aGUgZmlsZW5hbWUgYW5kIHNlbmQgdGhlIGNvbnRlbnQgdHlwZQorICAgICAgICAjIFRoaXMgd2lsbCBhcHBlYXIgd2hlbiB0aGV5IHNhdmUgdGhlIHNwcmVhZHNoZWV0CisgICAgICAgIG15ICRmaWxlbmFtZSA9ImNnaXRlc3QueGxzIjsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIyBTZW5kIHRoZSBjb250ZW50IHR5cGUgaGVhZGVycworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIHByaW50ICJDb250ZW50LWRpc3Bvc2l0aW9uOiBhdHRhY2htZW50O2ZpbGVuYW1lPSRmaWxlbmFtZVxuIjsKKyAgICAgICAgcHJpbnQgIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsXG5cbiI7CisgICAgCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBUaWUgYSBmaWxlaGFuZGxlIHRvIEFwYWNoZSdzIFNURE9VVC4KKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldC4KKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICB0aWUgKlhMUyA9PiAnQXBhY2hlJzsKKyAgICAgICAgYmlubW9kZSgqWExTKTsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpYTFMpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMjApOworICAgIAorICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE1KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgICAgICMgV3JpdGUgdG8gdGhlIHdvcmtib29rCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICJIaSBFeGNlbCEiLCAkZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBZb3UgbXVzdCBjbG9zZSB0aGUgd29ya2Jvb2sgZm9yIENvbnRlbnQtZGlzcG9zaXRpb24KKyAgICAgICAgJHdvcmtib29rLT5jbG9zZSgpOworICAgIH0KKyAgICAKKyAgICAxOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9tb2RfcGVybDEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBtb2RfcGVybDIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKK2ZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDIgYW5kIEFwYWNoZS4KKworVGhpcyBtb2R1bGUgdGllcyAqWExTIGRpcmVjdGx5IHRvIEFwYWNoZSwgYW5kIHdpdGggdGhlIGNvcnJlY3QKK2NvbnRlbnQtZGlzcG9zaXRpb24vdHlwZXMgaXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gc2F2ZQordGhlIGZpbGUsIG9yIG9wZW4gaXQgYXQgdGhpcyBsb2NhdGlvbi4KKworVGhpcyBzY3JpcHQgaXMgYSBtb2RpZmljYXRpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGNnaS5wbCBleGFtcGxlLgorCitDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRvIE1QMlRlc3QucG0uCitDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KK0luIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorCitZb3VyIGh0dHBkLmNvbmYgZW50cnkgZm9yIHRoaXMgbW9kdWxlLCBzaG91bGQgeW91IGNob29zZSB0byB1c2UgaXQKK2FzIGEgc3RhbmQgYWxvbmUgYXBwLCBzaG91bGQgbG9vayBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RSZWMKKyAgICBQZXJsTW9kdWxlIEFQUjo6VGFibGUKKyAgICBQZXJsTW9kdWxlIEFwYWNoZTI6OlJlcXVlc3RJTworCisgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICAgIFNldEhhbmRsZXIgcGVybC1zY3JpcHQKKyAgICAgICBQZXJsUmVzcG9uc2VIYW5kbGVyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpNUDJUZXN0CisgICAgPC9Mb2NhdGlvbj4KKworVGhlIFBlcmxSZXNwb25zZUhhbmRsZXIgbXVzdCBtYXRjaCB0aGUgcGFja2FnZSBuYW1lIGJlbG93LgorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlIHRvIHNlbmQgYW4gRXhjZWwKKyAgICAjIGZpbGUgdG8gYSBicm93c2VyIHVzaW5nIG1vZF9wZXJsIDIgYW5kIEFwYWNoZS4KKyAgICAjCisgICAgIyBUaGlzIG1vZHVsZSB0aWVzICpYTFMgZGlyZWN0bHkgdG8gQXBhY2hlLCBhbmQgd2l0aCB0aGUgY29ycmVjdAorICAgICMgY29udGVudC1kaXNwb3NpdGlvbi90eXBlcyBpdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBzYXZlCisgICAgIyB0aGUgZmlsZSwgb3Igb3BlbiBpdCBhdCB0aGlzIGxvY2F0aW9uLgorICAgICMKKyAgICAjIFRoaXMgc2NyaXB0IGlzIGEgbW9kaWZpY2F0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjZ2kucGwgZXhhbXBsZS4KKyAgICAjCisgICAgIyBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIHRvIE1QMlRlc3QucG0uCisgICAgIyBDaGFuZ2UgdGhlIHBhY2thZ2UgbG9jYXRpb24gdG8gd2hlcmUgZXZlciB5b3UgbG9jYXRlIHRoaXMgcGFja2FnZS4KKyAgICAjIEluIHRoZSBleGFtcGxlIGJlbG93IGl0IGlzIGxvY2F0ZWQgaW4gdGhlIFdyaXRlRXhjZWwgZGlyZWN0b3J5LgorICAgICMKKyAgICAjIFlvdXIgaHR0cGQuY29uZiBlbnRyeSBmb3IgdGhpcyBtb2R1bGUsIHNob3VsZCB5b3UgY2hvb3NlIHRvIHVzZSBpdAorICAgICMgYXMgYSBzdGFuZCBhbG9uZSBhcHAsIHNob3VsZCBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgICAgUGVybE1vZHVsZSBBcGFjaGUyOjpSZXF1ZXN0UmVjCisgICAgIyAgICAgUGVybE1vZHVsZSBBUFI6OlRhYmxlCisgICAgIyAgICAgUGVybE1vZHVsZSBBcGFjaGUyOjpSZXF1ZXN0SU8KKyAgICAjCisgICAgIyAgICAgPExvY2F0aW9uIC9zcHJlYWRzaGVldC10ZXN0PgorICAgICMgICAgICAgIFNldEhhbmRsZXIgcGVybC1zY3JpcHQKKyAgICAjICAgICAgICBQZXJsUmVzcG9uc2VIYW5kbGVyIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpNUDJUZXN0CisgICAgIyAgICAgPC9Mb2NhdGlvbj4KKyAgICAjCisgICAgIyBUaGUgUGVybFJlc3BvbnNlSGFuZGxlciBtdXN0IG1hdGNoIHRoZSBwYWNrYWdlIG5hbWUgYmVsb3cuCisgICAgCisgICAgIyBKdW4gMjAwNCwgTWF0aXNzZSBFbnplciwgbWF0aXNzZUBtYXRpc3NlLm5ldCAgKG1vZF9wZXJsIDIgdmVyc2lvbikKKyAgICAjIEFwciAyMDAxLCBUaG9tYXMgU3VsbGl2YW4sIHdlYm1hc3RlckA4NjAub3JnCisgICAgIyBGZWIgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgCisgICAgcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6TVAyVGVzdDsKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIFByYWdtYSBEZWZpbml0aW9ucworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHVzZSBzdHJpY3Q7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBSZXF1aXJlZCBNb2R1bGVzCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgdXNlIEFwYWNoZTI6OkNvbnN0IC1jb21waWxlID0+IHF3KCA6Y29tbW9uICk7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMgTWFpbiBBcHAgQm9keQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiBoYW5kbGVyIHsKKyAgICAgICAgbXkoJHIpID0gQF87ICAjIEFwYWNoZSByZXF1ZXN0IG9iamVjdCBpcyBwYXNzZWQgdG8gaGFuZGxlciBpbiBtb2RfcGVybCAyCisgICAgCisgICAgICAgICMgU2V0IHRoZSBmaWxlbmFtZSBhbmQgc2VuZCB0aGUgY29udGVudCB0eXBlCisgICAgICAgICMgVGhpcyB3aWxsIGFwcGVhciB3aGVuIHRoZXkgc2F2ZSB0aGUgc3ByZWFkc2hlZXQKKyAgICAgICAgbXkgJGZpbGVuYW1lID0ibW9kX3BlcmwyX3Rlc3QueGxzIjsKKyAgICAKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIyBTZW5kIHRoZSBjb250ZW50IHR5cGUgaGVhZGVycyB0aGUgbW9kX3BlcmwgMiB3YXkKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAkci0+aGVhZGVyc19vdXQtPnsnQ29udGVudC1EaXNwb3NpdGlvbid9ID0gImF0dGFjaG1lbnQ7ZmlsZW5hbWU9JGZpbGVuYW1lIjsKKyAgICAgICAgJHItPmNvbnRlbnRfdHlwZSgnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyk7CisgICAgCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBUaWUgYSBmaWxlaGFuZGxlIHRvIEFwYWNoZSdzIFNURE9VVC4KKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldC4KKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICB0aWUgKlhMUyA9PiAkcjsgICMgVGhlIG1vZF9wZXJsIDIgd2F5LiBUaWUgdG8gdGhlIEFwYWNoZTo6UmVxdWVzdFJlYyBvYmplY3QKKyAgICAgICAgYmlubW9kZSgqWExTKTsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoXCpYTFMpOworICAgICAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbiAxCisgICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMCwgMjApOworICAgIAorICAgIAorICAgICAgICAjIENyZWF0ZSBhIGZvcm1hdAorICAgICAgICBteSAkZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgICAgICRmb3JtYXQtPnNldF9ib2xkKCk7CisgICAgICAgICRmb3JtYXQtPnNldF9zaXplKDE1KTsKKyAgICAgICAgJGZvcm1hdC0+c2V0X2NvbG9yKCdibHVlJyk7CisgICAgCisgICAgCisgICAgICAgICMgV3JpdGUgdG8gdGhlIHdvcmtib29rCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICdIaSBFeGNlbCEgZnJvbSAnIC4gJHItPmhvc3RuYW1lICwgJGZvcm1hdCk7CisgICAgCisgICAgICAgICMgWW91IG11c3QgY2xvc2UgdGhlIHdvcmtib29rIGZvciBDb250ZW50LWRpc3Bvc2l0aW9uCisgICAgICAgICR3b3JrYm9vay0+Y2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIEFwYWNoZTI6OkNvbnN0OjpPSzsKKyAgICB9CisgICAgCisgICAgMTsKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvbW9kX3BlcmwyLnBsPgorCis9aGVhZDIgRXhhbXBsZTogb3V0bGluZS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGdlbmVyYXRlIEV4Y2VsIG91dGxpbmVzIGFuZAorZ3JvdXBpbmcuCisKKworRXhjZWwgYWxsb3dzIHlvdSB0byBncm91cCByb3dzIG9yIGNvbHVtbnMgc28gdGhhdCB0aGV5IGNhbiBiZSBoaWRkZW4gb3IKK2Rpc3BsYXllZCB3aXRoIGEgc2luZ2xlIG1vdXNlIGNsaWNrLiBUaGlzIGZlYXR1cmUgaXMgcmVmZXJyZWQgdG8gYXMgb3V0bGluZXMuCisKK091dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIAorc3VtbWFyaWVzLgorCitUaGlzIGZlYXR1cmUgaXMgYmVzdCB2aWV3ZWQgaW4gRXhjZWwgYnV0IHRoZSBmb2xsb3dpbmcgaXMgYW4gQVNDSUkKK3JlcHJlc2VudGF0aW9uIG9mIHdoYXQgYSB3b3Jrc2hlZXQgd2l0aCB0aHJlZSBvdXRsaW5lcyBtaWdodCBsb29rIGxpa2UuCitSb3dzIDMtNCBhbmQgcm93cyA3LTggYXJlIGdyb3VwZWQgYXQgbGV2ZWwgMi4gUm93cyAyLTkgYXJlIGdyb3VwZWQgYXQKK2xldmVsIDEuIFRoZSBsaW5lcyBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgYXJlIGNhbGxlZCBvdXRsaW5lIGxldmVsIGJhcnMuCisKKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICBfICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCB8ICAgfCAzIHwgIChDKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgNCB8ICAoRCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IC0gICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAgXyAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgfCAgIHwgNyB8ICAoRykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8IHwgICB8IDggfCAgKEgpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCAtICAgfCA5IHwgICBJICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIC0gICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorCisKK0NsaWNraW5nIHRoZSBtaW51cyBzaWduIG9uIGVhY2ggb2YgdGhlIGxldmVsIDIgb3V0bGluZXMgd2lsbCBjb2xsYXBzZSBhbmQKK2hpZGUgdGhlIGRhdGEgYXMgc2hvd24gaW4gdGhlIG5leHQgZmlndXJlLiBUaGUgbWludXMgc2lnbiBjaGFuZ2VzIHRvIGEgcGx1cworc2lnbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBkYXRhIGluIHRoZSBvdXRsaW5lIGlzIGhpZGRlbi4KKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICAgICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgfCArICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIHwgICAgIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICB8ICsgICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisKKworQ2xpY2tpbmcgb24gdGhlIG1pbnVzIHNpZ24gb24gdGhlIGxldmVsIDEgb3V0bGluZSB3aWxsIGNvbGxhcHNlIHRoZSByZW1haW5pbmcKK3Jvd3MgYXMgZm9sbG93czoKKworICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICArICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKworU2VlIHRoZSBtYWluIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL291dGxpbmUuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBvdXRsaW5lLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIHRvIGdlbmVyYXRlIEV4Y2VsIG91dGxpbmVzIGFuZAorICAgICMgZ3JvdXBpbmcuCisgICAgIworICAgICMKKyAgICAjIEV4Y2VsIGFsbG93cyB5b3UgdG8gZ3JvdXAgcm93cyBvciBjb2x1bW5zIHNvIHRoYXQgdGhleSBjYW4gYmUgaGlkZGVuIG9yCisgICAgIyBkaXNwbGF5ZWQgd2l0aCBhIHNpbmdsZSBtb3VzZSBjbGljay4gVGhpcyBmZWF0dXJlIGlzIHJlZmVycmVkIHRvIGFzIG91dGxpbmVzLgorICAgICMKKyAgICAjIE91dGxpbmVzIGNhbiByZWR1Y2UgY29tcGxleCBkYXRhIGRvd24gdG8gYSBmZXcgc2FsaWVudCBzdWItdG90YWxzIG9yIAorICAgICMgc3VtbWFyaWVzLgorICAgICMKKyAgICAjIFRoaXMgZmVhdHVyZSBpcyBiZXN0IHZpZXdlZCBpbiBFeGNlbCBidXQgdGhlIGZvbGxvd2luZyBpcyBhbiBBU0NJSQorICAgICMgcmVwcmVzZW50YXRpb24gb2Ygd2hhdCBhIHdvcmtzaGVldCB3aXRoIHRocmVlIG91dGxpbmVzIG1pZ2h0IGxvb2sgbGlrZS4KKyAgICAjIFJvd3MgMy00IGFuZCByb3dzIDctOCBhcmUgZ3JvdXBlZCBhdCBsZXZlbCAyLiBSb3dzIDItOSBhcmUgZ3JvdXBlZCBhdAorICAgICMgbGV2ZWwgMS4gVGhlIGxpbmVzIGF0IHRoZSBsZWZ0IGhhbmQgc2lkZSBhcmUgY2FsbGVkIG91dGxpbmUgbGV2ZWwgYmFycy4KKyAgICAjCisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICBfICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCB8ICAgfCAzIHwgIChDKSAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgfCAgIHwgNCB8ICAoRCkgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IC0gICB8IDUgfCAgIEUgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCAgXyAgfCA2IHwgICBGICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgfCAgIHwgNyB8ICAoRykgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8IHwgICB8IDggfCAgKEgpICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCAtICAgfCA5IHwgICBJICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIC0gICAgIHwgLiB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLgorICAgICMKKyAgICAjCisgICAgIyBDbGlja2luZyB0aGUgbWludXMgc2lnbiBvbiBlYWNoIG9mIHRoZSBsZXZlbCAyIG91dGxpbmVzIHdpbGwgY29sbGFwc2UgYW5kCisgICAgIyBoaWRlIHRoZSBkYXRhIGFzIHNob3duIGluIHRoZSBuZXh0IGZpZ3VyZS4gVGhlIG1pbnVzIHNpZ24gY2hhbmdlcyB0byBhIHBsdXMKKyAgICAjIHNpZ24gdG8gaW5kaWNhdGUgdGhhdCB0aGUgZGF0YSBpbiB0aGUgb3V0bGluZSBpcyBoaWRkZW4uCisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICBfICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICAgICB8IDIgfCAgIEIgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgfCArICAgfCA1IHwgICBFICAgfCAgICAgICB8ICAgICAgIHwgICAgICAgfCAgLi4uCisgICAgIyAgICAgIHwgICAgIHwgNiB8ICAgRiAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICB8ICsgICB8IDkgfCAgIEkgICB8ICAgICAgIHwgICAgICAgfCAgICAgICB8ICAuLi4KKyAgICAjICAgICAgLSAgICAgfCAuIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uCisgICAgIworICAgICMKKyAgICAjIENsaWNraW5nIG9uIHRoZSBtaW51cyBzaWduIG9uIHRoZSBsZXZlbCAxIG91dGxpbmUgd2lsbCBjb2xsYXBzZSB0aGUgcmVtYWluaW5nCisgICAgIyByb3dzIGFzIGZvbGxvd3M6CisgICAgIworICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgIDEgMiAzIHwgICB8ICAgQSAgIHwgICBCICAgfCAgIEMgICB8ICAgRCAgIHwgIC4uLgorICAgICMgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAgICAgICAgICAgIHwgMSB8ICAgQSAgIHwgICAgICAgfCAgICAgICB8ICAgICAgIHwgIC4uLgorICAgICMgICAgICArICAgICB8IC4gfCAgLi4uICB8ICAuLi4gIHwgIC4uLiAgfCAgLi4uICB8ICAuLi4KKyAgICAjCisgICAgIyBTZWUgdGhlIG1haW4gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEFwcmlsIDIwMDMsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIHNvbWUgd29ya3NoZWV0cworICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygnb3V0bGluZS54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnT3V0bGluZWQgUm93cycpOworICAgIG15ICR3b3Jrc2hlZXQyID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgUm93cycpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lIENvbHVtbnMnKTsKKyAgICBteSAkd29ya3NoZWV0NCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnT3V0bGluZSBsZXZlbHMnKTsKKyAgICAKKyAgICAjIEFkZCBhIGdlbmVyYWwgZm9ybWF0CisgICAgbXkgJGJvbGQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoYm9sZCA9PiAxKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCByb3dzLiBJdCBhbHNvIGluY2x1ZGVzIFNVQlRPVEFMKCkKKyAgICAjIGZ1bmN0aW9ucyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlIHR5cGUgb2YgYXV0b21hdGljIG91dGxpbmVzIHRoYXQgYXJlCisgICAgIyBnZW5lcmF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBFeGNlbCBEYXRhLT5TdWJUb3RhbHMgbWVudSBpdGVtLgorICAgICMKKyAgICAKKyAgICAKKyAgICAjIEZvciBvdXRsaW5lcyB0aGUgaW1wb3J0YW50IHBhcmFtZXRlcnMgYXJlICRoaWRkZW4gYW5kICRsZXZlbC4gUm93cyB3aXRoIHRoZQorICAgICMgc2FtZSAkbGV2ZWwgYXJlIGdyb3VwZWQgdG9nZXRoZXIuIFRoZSBncm91cCB3aWxsIGJlIGNvbGxhcHNlZCBpZiAkaGlkZGVuIGlzCisgICAgIyBub24temVyby4gJGhlaWdodCBhbmQgJFhGIGFyZSBhc3NpZ25lZCBkZWZhdWx0IHZhbHVlcyBpZiB0aGV5IGFyZSB1bmRlZi4KKyAgICAjCisgICAgIyBUaGUgc3ludGF4IGlzOiBzZXRfcm93KCRyb3csICRoZWlnaHQsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICMKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygyLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg0LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg1LCAgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg3LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg4LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCAwLCAyKTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygxMCwgdW5kZWYsIHVuZGVmLCAwLCAxKTsKKyAgICAKKyAgICAKKyAgICAjIEFkZCBhIGNvbHVtbiBmb3JtYXQgZm9yIGNsYXJpdHkKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgICMgQWRkIHRoZSBkYXRhLCBsYWJlbHMgYW5kIGZvcm11bGFzCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMScsICAnUmVnaW9uJywgJGJvbGQpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTInLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMycsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E0JywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTUnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNicsICAnTm9ydGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMScsICAnU2FsZXMnLCAgJGJvbGQpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjInLCAgMTAwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMycsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I0JywgIDkwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCNScsICAxMjAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I2JywgICc9U1VCVE9UQUwoOSxCMjpCNSknLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBNycsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E4JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTknLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMTAnLCAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMScsICdTb3V0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I3JywgIDQwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCOCcsICA2MDApOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjknLCAgNTAwKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxMCcsIDYwMCk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMTEnLCAnPVNVQlRPVEFMKDksQjc6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExMicsICdHcmFuZCBUb3RhbCcsICRib2xkKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0IxMicsICc9U1VCVE9UQUwoOSxCMjpCMTApJywgJGJvbGQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDI6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlCisgICAgIyBwcmV2aW91cyBleGFtcGxlIGV4Y2VwdCB0aGF0IHRoZSByb3dzIGFyZSBjb2xsYXBzZWQuCisgICAgIyBOb3RlOiBXZSBuZWVkIHRvIGluZGljYXRlIHRoZSByb3cgdGhhdCBjb250YWlucyB0aGUgY29sbGFwc2VkIHN5bWJvbCAnKycKKyAgICAjIHdpdGggdGhlIG9wdGlvbmFsIHBhcmFtZXRlciwgJGNvbGxhcHNlZC4KKyAgICAKKyAgICAjIFRoZSBncm91cCB3aWxsIGJlIGNvbGxhcHNlZCBpZiAkaGlkZGVuIGlzIG5vbi16ZXJvLgorICAgICMgVGhlIHN5bnRheCBpczogc2V0X3Jvdygkcm93LCAkaGVpZ2h0LCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAjCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7CisgICAgCisgICAgCisgICAgIyBBZGQgYSBjb2x1bW4gZm9ybWF0IGZvciBjbGFyaXR5CisgICAgJHdvcmtzaGVldDItPnNldF9jb2x1bW4oJ0E6QScsIDIwKTsKKyAgICAKKyAgICAjIEFkZCB0aGUgZGF0YSwgbGFiZWxzIGFuZCBmb3JtdWxhcworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEnLCAgJ1JlZ2lvbicsICRib2xkKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0EyJywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTMnLCAgJ05vcnRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNCcsICAnTm9ydGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E1JywgICdOb3J0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTYnLCAgJ05vcnRoIFRvdGFsJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjEnLCAgJ1NhbGVzJywgICRib2xkKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IyJywgIDEwMDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjMnLCAgMTIwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNCcsICA5MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjUnLCAgMTIwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNicsICAnPVNVQlRPVEFMKDksQjI6QjUpJywgJGJvbGQpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTcnLCAgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBOCcsICAnU291dGgnKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E5JywgICdTb3V0aCcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTEwJywgJ1NvdXRoJyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTEnLCAnU291dGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNycsICA0MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjgnLCAgNjAwKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I5JywgIDUwMCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMTAnLCA2MDApOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjExJywgJz1TVUJUT1RBTCg5LEI3OkIxMCknLCAkYm9sZCk7CisgICAgCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMTInLCAnR3JhbmQgVG90YWwnLCAkYm9sZCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMTInLCAnPVNVQlRPVEFMKDksQjI6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAzOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCBjb2x1bW5zLgorICAgICMKKyAgICBteSAkZGF0YSA9IFsKKyAgICAgICAgICAgICAgICBbJ01vbnRoJywgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywnIFRvdGFsJ10sCisgICAgICAgICAgICAgICAgWydOb3J0aCcsIDUwLCAgICAyMCwgICAgMTUsICAgIDI1LCAgICA2NSwgICAgODAsICAgICwnPVNVTShCMjpHMiknXSwKKyAgICAgICAgICAgICAgICBbJ1NvdXRoJywgMTAsICAgIDIwLCAgICAzMCwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgLCc9U1VNKEIzOkczKSddLAorICAgICAgICAgICAgICAgIFsnRWFzdCcsICA0NSwgICAgNzUsICAgIDUwLCAgICAxNSwgICAgNzUsICAgIDEwMCwgICAsJz1TVU0oQjQ6RzQpJ10sCisgICAgICAgICAgICAgICAgWydXZXN0JywgIDE1LCAgICAxNSwgICAgNTUsICAgIDM1LCAgICAyMCwgICAgNTAsICAgICwnPVNVTShCNTpHNiknXSwKKyAgICAgICAgICAgICAgIF07CisgICAgCisgICAgIyBBZGQgYm9sZCBmb3JtYXQgdG8gdGhlIGZpcnN0IHJvdworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDAsIHVuZGVmLCAkYm9sZCk7CisgICAgCisgICAgIyBTeW50YXg6IHNldF9jb2x1bW4oJGNvbDEsICRjb2wyLCAkd2lkdGgsICRYRiwgJGhpZGRlbiwgJGxldmVsLCAkY29sbGFwc2VkKQorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOkEnLCAxMCwgJGJvbGQgICAgICApOworICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdCOkcnLCA1LCAgdW5kZWYsIDAsIDEpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdIOkgnLCAxMCk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgZGF0YSBhbmQgYSBmb3JtdWxhCisgICAgJHdvcmtzaGVldDMtPndyaXRlX2NvbCgnQTEnLCAkZGF0YSk7CisgICAgJHdvcmtzaGVldDMtPndyaXRlKCdINicsICc9U1VNKEgyOkg1KScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA0OiBTaG93IGFsbCBwb3NzaWJsZSBvdXRsaW5lIGxldmVscy4KKyAgICAjCisgICAgbXkgJGxldmVscyA9IFsiTGV2ZWwgMSIsICJMZXZlbCAyIiwgIkxldmVsIDMiLCAiTGV2ZWwgNCIsCisgICAgICAgICAgICAgICAgICAiTGV2ZWwgNSIsICJMZXZlbCA2IiwgIkxldmVsIDciLCAiTGV2ZWwgNiIsCisgICAgICAgICAgICAgICAgICAiTGV2ZWwgNSIsICJMZXZlbCA0IiwgIkxldmVsIDMiLCAiTGV2ZWwgMiIsICJMZXZlbCAxIl07CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbCgnQTEnLCAkbGV2ZWxzKTsKKyAgICAKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygwLCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCAzKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygzLCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDUpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA2KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg2LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNyk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDYpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIHVuZGVmLCA1KTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3Jvdyg5LCAgdW5kZWYsIHVuZGVmLCB1bmRlZiwgNCk7CisgICAgJHdvcmtzaGVldDQtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgdW5kZWYsIDMpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDExLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCAyKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3JvdygxMiwgdW5kZWYsIHVuZGVmLCB1bmRlZiwgMSk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9vdXRsaW5lLnBsPgorCis9aGVhZDIgRXhhbXBsZTogb3V0bGluZV9jb2xsYXBzZWQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCB0byBnZW5lcmF0ZSBFeGNlbCBvdXRsaW5lcyBhbmQKK2dyb3VwaW5nLgorCitUaGVzZSBleGFtcGxlIGZvY3VzIG1haW5seSBvbiBjb2xsYXBzZWQgb3V0bGluZXMuIFNlZSBhbHNvIHRoZQorb3V0bGluZXMucGwgZXhhbXBsZSBwcm9ncmFtIGZvciBtb3JlIGdlbmVyYWwgZXhhbXBsZXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL291dGxpbmVfY29sbGFwc2VkLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gb3V0bGluZV9jb2xsYXBzZWQucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZ2VuZXJhdGUgRXhjZWwgb3V0bGluZXMgYW5kCisgICAgIyBncm91cGluZy4KKyAgICAjCisgICAgIyBUaGVzZSBleGFtcGxlIGZvY3VzIG1haW5seSBvbiBjb2xsYXBzZWQgb3V0bGluZXMuIFNlZSBhbHNvIHRoZQorICAgICMgb3V0bGluZXMucGwgZXhhbXBsZSBwcm9ncmFtIGZvciBtb3JlIGdlbmVyYWwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDA4LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBzb21lIHdvcmtzaGVldHMKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoJ291dGxpbmVfY29sbGFwc2VkLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdPdXRsaW5lZCBSb3dzJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0NvbGxhcHNlZCBSb3dzIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnQ29sbGFwc2VkIFJvd3MgMicpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgUm93cyAzJyk7CisgICAgbXkgJHdvcmtzaGVldDUgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ091dGxpbmUgQ29sdW1ucycpOworICAgIG15ICR3b3Jrc2hlZXQ2ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdDb2xsYXBzZWQgQ29sdW1ucycpOworICAgIAorICAgIAorICAgICMgQWRkIGEgZ2VuZXJhbCBmb3JtYXQKKyAgICBteSAkYm9sZCA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChib2xkID0+IDEpOworICAgIAorICAgIAorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZSB0aGUgc2FtZSBkYXRhIGFuZCBzdWItdG90YWxzIG9uIGVhY2ggd29ya3NoZWV0LgorICAgICMKKyAgICBzdWIgY3JlYXRlX3N1Yl90b3RhbHMgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gJF9bMF07CisgICAgCisgICAgICAgICMgQWRkIGEgY29sdW1uIGZvcm1hdCBmb3IgY2xhcml0eQorICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgCisgICAgICAgICMgQWRkIHRoZSBkYXRhLCBsYWJlbHMgYW5kIGZvcm11bGFzCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICAnUmVnaW9uJywgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAgJ05vcnRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICAnTm9ydGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E0JywgICdOb3J0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAgJ05vcnRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNicsICAnTm9ydGggVG90YWwnLCAkYm9sZCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICAnU2FsZXMnLCAgJGJvbGQpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjInLCAgMTAwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMycsICAxMjAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I0JywgIDkwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCNScsICAxMjAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I2JywgICc9U1VCVE9UQUwoOSxCMjpCNSknLCAkYm9sZCk7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNycsICAnU291dGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E4JywgICdTb3V0aCcpOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAgJ1NvdXRoJyk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTAnLCAnU291dGgnKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMScsICdTb3V0aCBUb3RhbCcsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0I3JywgIDQwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCOCcsICA2MDApOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQjknLCAgNTAwKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxMCcsIDYwMCk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMTEnLCAnPVNVQlRPVEFMKDksQjc6QjEwKScsICRib2xkKTsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExMicsICdHcmFuZCBUb3RhbCcsICRib2xkKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxMicsICc9U1VCVE9UQUwoOSxCMjpCMTApJywgJGJvbGQpOworICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSAxOiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBvdXRsaW5lZCByb3dzLiBJdCBhbHNvIGluY2x1ZGVzIFNVQlRPVEFMKCkKKyAgICAjIGZ1bmN0aW9ucyBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlIHR5cGUgb2YgYXV0b21hdGljIG91dGxpbmVzIHRoYXQgYXJlCisgICAgIyBnZW5lcmF0ZWQgd2hlbiB5b3UgdXNlIHRoZSBFeGNlbCBEYXRhLT5TdWJUb3RhbHMgbWVudSBpdGVtLgorICAgICMKKyAgICAKKyAgICAjIFRoZSBzeW50YXggaXM6IHNldF9yb3coJHJvdywgJGhlaWdodCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMCwgMik7CisgICAgJHdvcmtzaGVldDEtPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMCwgMSk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0MSk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMjogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggY29sbGFwc2VkIG91dGxpbmVkIHJvd3MuCisgICAgIyBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSBhbGwgcm93cyBhcmUgY29sbGFwc2VkLgorICAgICMgTm90ZTogV2UgbmVlZCB0byBpbmRpY2F0ZSB0aGUgcm93IHRoYXQgY29udGFpbnMgdGhlIGNvbGxhcHNlZCBzeW1ib2wgJysnIHdpdGgKKyAgICAjIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIsICRjb2xsYXBzZWQuCisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNSwgIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNiwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coNywgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOCwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coOSwgIHVuZGVmLCB1bmRlZiwgMSwgMik7CisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTAsIHVuZGVmLCB1bmRlZiwgMSwgMSk7CisgICAgCisgICAgJHdvcmtzaGVldDItPnNldF9yb3coMTEsIHVuZGVmLCB1bmRlZiwgMCwgMCwgMSk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgc3ViLXRvdGFsIGRhdGEgdGhhdCBpcyBjb21tb24gdG8gdGhlIHJvdyBleGFtcGxlcy4KKyAgICBjcmVhdGVfc3ViX3RvdGFscygkd29ya3NoZWV0Mik7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgMzogQ3JlYXRlIGEgd29ya3NoZWV0IHdpdGggY29sbGFwc2VkIG91dGxpbmVkIHJvd3MuCisgICAgIyBTYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSB0d28gc3ViLXRvdGFscyBhcmUgY29sbGFwc2VkLgorICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDEsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDQsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIDAsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDcsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQzLT5zZXRfcm93KDEwLCB1bmRlZiwgdW5kZWYsIDAsIDEsIDEpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHN1Yi10b3RhbCBkYXRhIHRoYXQgaXMgY29tbW9uIHRvIHRoZSByb3cgZXhhbXBsZXMuCisgICAgY3JlYXRlX3N1Yl90b3RhbHMoJHdvcmtzaGVldDMpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDQ6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIHJvd3MuCisgICAgIyBTYW1lIGFzIHRoZSBleGFtcGxlIDEgIGV4Y2VwdCB0aGF0IHRoZSB0d28gc3ViLXRvdGFscyBhcmUgY29sbGFwc2VkLgorICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDEsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDIsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDMsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDQsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDUsICB1bmRlZiwgdW5kZWYsIDEsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDYsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDcsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDgsICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDksICB1bmRlZiwgdW5kZWYsIDEsIDIpOworICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDEwLCB1bmRlZiwgdW5kZWYsIDEsIDEsIDEpOworICAgIAorICAgICR3b3Jrc2hlZXQ0LT5zZXRfcm93KDExLCB1bmRlZiwgdW5kZWYsIDAsIDAsIDEpOworICAgIAorICAgICMgV3JpdGUgdGhlIHN1Yi10b3RhbCBkYXRhIHRoYXQgaXMgY29tbW9uIHRvIHRoZSByb3cgZXhhbXBsZXMuCisgICAgY3JlYXRlX3N1Yl90b3RhbHMoJHdvcmtzaGVldDQpOworICAgIAorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIDU6IENyZWF0ZSBhIHdvcmtzaGVldCB3aXRoIG91dGxpbmVkIGNvbHVtbnMuCisgICAgIworICAgIG15ICRkYXRhID0gWworICAgICAgICAgICAgICAgIFsnTW9udGgnLCAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCcgVG90YWwnXSwKKyAgICAgICAgICAgICAgICBbJ05vcnRoJywgNTAsICAgIDIwLCAgICAxNSwgICAgMjUsICAgIDY1LCAgICA4MCwgICAgLCc9U1VNKEIyOkcyKSddLAorICAgICAgICAgICAgICAgIFsnU291dGgnLCAxMCwgICAgMjAsICAgIDMwLCAgICA1MCwgICAgNTAsICAgIDUwLCAgICAsJz1TVU0oQjM6RzMpJ10sCisgICAgICAgICAgICAgICAgWydFYXN0JywgIDQ1LCAgICA3NSwgICAgNTAsICAgIDE1LCAgICA3NSwgICAgMTAwLCAgICwnPVNVTShCNDpHNCknXSwKKyAgICAgICAgICAgICAgICBbJ1dlc3QnLCAgMTUsICAgIDE1LCAgICA1NSwgICAgMzUsICAgIDIwLCAgICA1MCwgICAgLCc9U1VNKEI1Okc2KSddLAorICAgICAgICAgICAgICAgXTsKKyAgICAKKyAgICAjIEFkZCBib2xkIGZvcm1hdCB0byB0aGUgZmlyc3Qgcm93CisgICAgJHdvcmtzaGVldDUtPnNldF9yb3coMCwgdW5kZWYsICRib2xkKTsKKyAgICAKKyAgICAjIFN5bnRheDogc2V0X2NvbHVtbigkY29sMSwgJGNvbDIsICR3aWR0aCwgJFhGLCAkaGlkZGVuLCAkbGV2ZWwsICRjb2xsYXBzZWQpCisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0E6QScsIDEwLCAkYm9sZCAgICAgICk7CisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0I6RycsIDUsICB1bmRlZiwgMCwgMSk7CisgICAgJHdvcmtzaGVldDUtPnNldF9jb2x1bW4oJ0g6SCcsIDEwICAgICAgICAgICAgICk7CisgICAgCisgICAgIyBXcml0ZSB0aGUgZGF0YSBhbmQgYSBmb3JtdWxhCisgICAgJHdvcmtzaGVldDUtPndyaXRlX2NvbCgnQTEnLCAkZGF0YSk7CisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdINicsICc9U1VNKEgyOkg1KScsICRib2xkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSA2OiBDcmVhdGUgYSB3b3Jrc2hlZXQgd2l0aCBjb2xsYXBzZWQgb3V0bGluZWQgY29sdW1ucy4KKyAgICAjIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGUgZXhjZXB0IGNvbGxhcHNlZCBjb2x1bW5zLgorICAgIAorICAgICMgQWRkIGJvbGQgZm9ybWF0IHRvIHRoZSBmaXJzdCByb3cKKyAgICAkd29ya3NoZWV0Ni0+c2V0X3JvdygwLCB1bmRlZiwgJGJvbGQpOworICAgIAorICAgICMgU3ludGF4OiBzZXRfY29sdW1uKCRjb2wxLCAkY29sMiwgJHdpZHRoLCAkWEYsICRoaWRkZW4sICRsZXZlbCwgJGNvbGxhcHNlZCkKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQTpBJywgMTAsICRib2xkICAgICAgICAgKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignQjpHJywgNSwgIHVuZGVmLCAxLCAxICAgKTsKKyAgICAkd29ya3NoZWV0Ni0+c2V0X2NvbHVtbignSDpIJywgMTAsIHVuZGVmLCAwLCAwLCAxKTsKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBkYXRhIGFuZCBhIGZvcm11bGEKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGVfY29sKCdBMScsICRkYXRhKTsKKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUoJ0g2JywgJz1TVU0oSDI6SDUpJywgJGJvbGQpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvb3V0bGluZV9jb2xsYXBzZWQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBwYW5lcy5wbAorCisKKworRXhhbXBsZSBvZiB1c2luZyB0aGUgV3JpdGVFeGNlbCBtb2R1bGUgdG8gY3JlYXRlIHdvcmtzaGVldCBwYW5lcy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcGFuZXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSBwYW5lcy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIHVzaW5nIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZSB0byBjcmVhdGUgd29ya3NoZWV0IHBhbmVzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygicGFuZXMueGxzIik7CisgICAgCisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhbmVzIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnUGFuZXMgMicpOworICAgIG15ICR3b3Jrc2hlZXQzID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdQYW5lcyAzJyk7CisgICAgbXkgJHdvcmtzaGVldDQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ1BhbmVzIDQnKTsKKyAgICAKKyAgICAjIEZyZWV6ZSBwYW5lcworICAgICR3b3Jrc2hlZXQxLT5mcmVlemVfcGFuZXMoMSwgMCk7ICMgMSByb3cKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+ZnJlZXplX3BhbmVzKDAsIDEpOyAjIDEgY29sdW1uCisgICAgJHdvcmtzaGVldDMtPmZyZWV6ZV9wYW5lcygxLCAxKTsgIyAxIHJvdyBhbmQgY29sdW1uCisgICAgCisgICAgIyBTcGxpdCBwYW5lcy4KKyAgICAjIFRoZSBkaXZpc2lvbnMgbXVzdCBiZSBzcGVjaWZpZWQgaW4gdGVybXMgb2Ygcm93IGFuZCBjb2x1bW4gZGltZW5zaW9ucy4KKyAgICAjIFRoZSBkZWZhdWx0IHJvdyBoZWlnaHQgaXMgMTIuNzUgYW5kIHRoZSBkZWZhdWx0IGNvbHVtbiB3aWR0aCBpcyA4LjQzCisgICAgIworICAgICR3b3Jrc2hlZXQ0LT5zcGxpdF9wYW5lcygxMi43NSwgOC40MywgMSwgMSk7ICMgMSByb3cgYW5kIGNvbHVtbgorICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgU2V0IHVwIHNvbWUgZm9ybWF0dGluZyBhbmQgdGV4dCB0byBoaWdobGlnaHQgdGhlIHBhbmVzCisgICAgIworICAgIAorICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfY29sb3IoJ3doaXRlJyk7CisgICAgJGhlYWRlci0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAkaGVhZGVyLT5zZXRfYWxpZ24oJ3ZjZW50ZXInKTsKKyAgICAkaGVhZGVyLT5zZXRfcGF0dGVybigpOworICAgICRoZWFkZXItPnNldF9mZ19jb2xvcignZ3JlZW4nKTsKKyAgICAKKyAgICBteSAkY2VudGVyID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGNlbnRlci0+c2V0X2FsaWduKCdjZW50ZXInKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDEKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDEtPnNldF9jb2x1bW4oJ0E6SScsIDE2KTsKKyAgICAkd29ya3NoZWV0MS0+c2V0X3JvdygwLCAyMCk7CisgICAgJHdvcmtzaGVldDEtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgwLi44KXsKKyAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsICRpLCAnU2Nyb2xsIGRvd24nLCAkaGVhZGVyKTsKKyAgICB9CisgICAgCisgICAgZm9yIG15ICRpICgxLi4xMDApeworICAgICAgICBmb3IgbXkgJGogKDAuLjgpeworICAgICAgICAgICAgJHdvcmtzaGVldDEtPndyaXRlKCRpLCAkaiwgJGkrMSwgJGNlbnRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaGVldCAyCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQyLT5zZXRfY29sdW1uKCdBOkEnLCAxNik7CisgICAgJHdvcmtzaGVldDItPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgwLi40OSl7CisgICAgICAgICR3b3Jrc2hlZXQyLT5zZXRfcm93KCRpLCAxNSk7CisgICAgICAgICR3b3Jrc2hlZXQyLT53cml0ZSgkaSwgMCwgJ1Njcm9sbCByaWdodCcsICRoZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDAuLjQ5KXsKKyAgICAgICAgZm9yIG15ICRqICgxLi4yNSl7CisgICAgICAgICAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJGksICRqLCAkaiwgJGNlbnRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBTaGVldCAzCisgICAgIworICAgIAorICAgICR3b3Jrc2hlZXQzLT5zZXRfY29sdW1uKCdBOlonLCAxNik7CisgICAgJHdvcmtzaGVldDMtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgxLi4yNSl7CisgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgwLCAkaSwgJ1Njcm9sbCBkb3duJywgICRoZWFkZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjQ5KXsKKyAgICAgICAgJHdvcmtzaGVldDMtPndyaXRlKCRpLCAwLCAnU2Nyb2xsIHJpZ2h0JywgJGhlYWRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICBmb3IgbXkgJGogKDEuLjI1KXsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQzLT53cml0ZSgkaSwgJGosICRqLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFNoZWV0IDQKKyAgICAjCisgICAgCisgICAgJHdvcmtzaGVldDQtPnNldF9zZWxlY3Rpb24oJ0MzJyk7CisgICAgCisgICAgZm9yIG15ICRpICgxLi4yNSl7CisgICAgICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgwLCAkaSwgJ1Njcm9sbCcsICRjZW50ZXIpOworICAgIH0KKyAgICAKKyAgICBmb3IgbXkgJGkgKDEuLjQ5KXsKKyAgICAgICAgJHdvcmtzaGVldDQtPndyaXRlKCRpLCAwLCAnU2Nyb2xsJywgJGNlbnRlcik7CisgICAgfQorICAgIAorICAgIGZvciBteSAkaSAoMS4uNDkpeworICAgICAgICBmb3IgbXkgJGogKDEuLjI1KXsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQ0LT53cml0ZSgkaSwgJGosICRqLCAkY2VudGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcGFuZXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBwcm9wZXJ0aWVzLnBsCisKKworCitBbiBleGFtcGxlIG9mIGFkZGluZyBkb2N1bWVudCBwcm9wZXJ0aWVzIHRvIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZS4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvcHJvcGVydGllcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHByb3BlcnRpZXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFuIGV4YW1wbGUgb2YgYWRkaW5nIGRvY3VtZW50IHByb3BlcnRpZXMgdG8gYSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBmaWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDgsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncHJvcGVydGllcy54bHMnKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgJHdvcmtib29rLT5zZXRfcHJvcGVydGllcygKKyAgICAgICAgdGl0bGUgICAgPT4gJ1RoaXMgaXMgYW4gZXhhbXBsZSBzcHJlYWRzaGVldCcsCisgICAgICAgIHN1YmplY3QgID0+ICdXaXRoIGRvY3VtZW50IHByb3BlcnRpZXMnLAorICAgICAgICBhdXRob3IgICA9PiAnSm9obiBNY05hbWFyYScsCisgICAgICAgIG1hbmFnZXIgID0+ICdEci4gSGVpbnogRG9vZmVuc2htaXJ0eiAnLAorICAgICAgICBjb21wYW55ICA9PiAnb2YgV29sdmVzJywKKyAgICAgICAgY2F0ZWdvcnkgPT4gJ0V4YW1wbGUgc3ByZWFkc2hlZXRzJywKKyAgICAgICAga2V5d29yZHMgPT4gJ1NhbXBsZSwgRXhhbXBsZSwgUHJvcGVydGllcycsCisgICAgICAgIGNvbW1lbnRzID0+ICdDcmVhdGVkIHdpdGggUGVybCBhbmQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwnLAorICAgICk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICdTZWxlY3QgRmlsZS0+UHJvcGVydGllcyB0byBzZWUgdGhlIGZpbGUgcHJvcGVydGllcycpOworICAgIAorICAgIAorICAgIF9fRU5EX18KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcHJvcGVydGllcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHByb3RlY3Rpb24ucGwKKworCisKK0V4YW1wbGUgb2YgY2VsbCBsb2NraW5nIGFuZCBmb3JtdWxhIGhpZGluZyBpbiBhbiBFeGNlbCB3b3Jrc2hlZXQgdmlhCit0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9wcm90ZWN0aW9uLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcHJvdGVjdGlvbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBjZWxsIGxvY2tpbmcgYW5kIGZvcm11bGEgaGlkaW5nIGluIGFuIEV4Y2VsIHdvcmtzaGVldCB2aWEKKyAgICAjIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBBdWd1c3QgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJwcm90ZWN0aW9uLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIENyZWF0ZSBzb21lIGZvcm1hdCBvYmplY3RzCisgICAgbXkgJGxvY2tlZCAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChsb2NrZWQgPT4gMSk7CisgICAgbXkgJHVubG9ja2VkICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChsb2NrZWQgPT4gMCk7CisgICAgbXkgJGhpZGRlbiAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChoaWRkZW4gPT4gMSk7CisgICAgCisgICAgIyBGb3JtYXQgdGhlIGNvbHVtbnMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA0Mik7CisgICAgJHdvcmtzaGVldC0+c2V0X3NlbGVjdGlvbignQjM6QjMnKTsKKyAgICAKKyAgICAjIFByb3RlY3QgdGhlIHdvcmtzaGVldAorICAgICR3b3Jrc2hlZXQtPnByb3RlY3QoKTsKKyAgICAKKyAgICAjIEV4YW1wbGVzIG9mIGNlbGwgbG9ja2luZyBhbmQgaGlkaW5nCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJ0NlbGwgQjEgaXMgbG9ja2VkLiBJdCBjYW5ub3QgYmUgZWRpdGVkLicpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICc9MSsyJywgJGxvY2tlZCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EyJywgJ0NlbGwgQjIgaXMgdW5sb2NrZWQuIEl0IGNhbiBiZSBlZGl0ZWQuJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgJz0xKzInLCAkdW5sb2NrZWQpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMycsICJDZWxsIEIzIGlzIGhpZGRlbi4gVGhlIGZvcm11bGEgaXNuJ3QgdmlzaWJsZS4iKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQjMnLCAnPTErMicsICRoaWRkZW4pOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNScsICdVc2UgTWVudS0+VG9vbHMtPlByb3RlY3Rpb24tPlVucHJvdGVjdCBTaGVldCcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNicsICd0byByZW1vdmUgdGhlIHdvcmtzaGVldCBwcm90ZWN0aW9uLiAgICcpOworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9wcm90ZWN0aW9uLnBsPgorCis9aGVhZDIgRXhhbXBsZTogcmVwZWF0LnBsCisKKworCitFeGFtcGxlIG9mIHdyaXRpbmcgcmVwZWF0ZWQgZm9ybXVsYXMuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JlcGVhdC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHJlcGVhdC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2Ygd3JpdGluZyByZXBlYXRlZCBmb3JtdWxhcy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEF1Z3VzdCAyMDAyLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInJlcGVhdC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgCisgICAgbXkgJGxpbWl0ID0gMTAwMDsKKyAgICAKKyAgICAjIFdyaXRlIGEgY29sdW1uIG9mIG51bWJlcnMKKyAgICBmb3IgbXkgJHJvdyAoMC4uJGxpbWl0KSB7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDAsICAkcm93KTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBTdG9yZSBhIGZvcm11bGEKKyAgICBteSAkZm9ybXVsYSA9ICR3b3Jrc2hlZXQtPnN0b3JlX2Zvcm11bGEoJz1BMSo1KzQnKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIGEgY29sdW1uIG9mIGZvcm11bGFzIGJhc2VkIG9uIHRoZSBzdG9yZWQgZm9ybXVsYQorICAgIGZvciBteSAkcm93ICgwLi4kbGltaXQpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+cmVwZWF0X2Zvcm11bGEoJHJvdywgMSwgJGZvcm11bGEsIHVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxci9eQTEkLywgJ0EnLigkcm93KzEpKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBEaXJlY3QgZm9ybXVsYSB3cml0aW5nLiBBcyBhIHNwZWVkIGNvbXBhcmlzb24gdW5jb21tZW50IHRoZQorICAgICMgZm9sbG93aW5nIGFuZCBydW4gdGhlIHByb2dyYW0gYWdhaW4KKyAgICAKKyAgICAjZm9yIG15ICRyb3cgKDAuLiRsaW1pdCkgeworICAgICMgICAgJHdvcmtzaGVldC0+d3JpdGVfZm9ybXVsYSgkcm93LCAyLCAnPUEnLigkcm93KzEpLicqNSs0Jyk7CisgICAgI30KKyAgICAKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JlcGVhdC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHJpZ2h0X3RvX2xlZnQucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB3b3Jrc2hlZXQgZGlyZWN0aW9uIGZyb20KK2xlZnQtdG8tcmlnaHQgdG8gcmlnaHQtdG8tbGVmdCBhcyByZXF1aXJlZCBieSBzb21lIGVhc3Rlcm4gdmVyaW9ucworb2YgRXhjZWwuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3JpZ2h0X3RvX2xlZnQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSByaWdodF90b19sZWZ0LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCB3b3Jrc2hlZXQgZGlyZWN0aW9uIGZyb20KKyAgICAjIGxlZnQtdG8tcmlnaHQgdG8gcmlnaHQtdG8tbGVmdCBhcyByZXF1aXJlZCBieSBzb21lIGVhc3Rlcm4gdmVyaW9ucworICAgICMgb2YgRXhjZWwuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBKYW51YXJ5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInJpZ2h0X3RvX2xlZnQueGxzIik7CisgICAgbXkgJHdvcmtzaGVldDEgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICR3b3Jrc2hlZXQyLT5yaWdodF90b19sZWZ0KCk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKDAsIDAsICdIZWxsbycpOyAjICBBMSwgQjEsIEMxLCAuLi4KKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoMCwgMCwgJ0hlbGxvJyk7ICMgLi4uLCBDMSwgQjEsIEExCisgICAgCisgICAgCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3JpZ2h0X3RvX2xlZnQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiByb3dfd3JhcC5wbAorCisKKworRGVtb25zdHJhdGVzIGhvdyB0byB3cmFwIGRhdGEgZnJvbSBvbmUgd29ya3NoZWV0IG9udG8gYW5vdGhlci4KKworRXhjZWwgaGFzIGEgcm93IGxpbWl0IG9mIDY1NTM2IHJvd3MuIFNvbWV0aW1lcyB0aGUgYW1vdW50IG9mIHJvdyBkYXRhIHRvIGJlCit3cml0dGVuIHRvIGEgZmlsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyBsaW1pdC4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgdXNlZnVsCit0ZWNobmlxdWUgdG8gd3JhcCB0aGUgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byB0aGUgbmV4dCBzbyB0aGF0IHdlIGdldAorc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKworICBTaGVldDEgIFJvdyAgICAgMSAgLSAgNjU1MzYKKyAgU2hlZXQyICBSb3cgNjU1MzcgIC0gMTMxMDcyCisgIFNoZWV0MyAgUm93IDEzMTA3MyAtIC4uLgorCitJbiBvcmRlciB0byBhY2hpZXZlIHRoaXMgd2UgdXNlIGEgc2luZ2xlIHdvcmtzaGVldCByZWZlcmVuY2UgYW5kCityZWluaXRpYWxpc2UgaXQgdG8gcG9pbnQgdG8gYSBuZXcgd29ya3NoZWV0IHdoZW4gcmVxdWlyZWQuCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3Jvd193cmFwLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gcm93X3dyYXAucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIERlbW9uc3RyYXRlcyBob3cgdG8gd3JhcCBkYXRhIGZyb20gb25lIHdvcmtzaGVldCBvbnRvIGFub3RoZXIuCisgICAgIworICAgICMgRXhjZWwgaGFzIGEgcm93IGxpbWl0IG9mIDY1NTM2IHJvd3MuIFNvbWV0aW1lcyB0aGUgYW1vdW50IG9mIHJvdyBkYXRhIHRvIGJlCisgICAgIyB3cml0dGVuIHRvIGEgZmlsZSBpcyBncmVhdGVyIHRoYW4gdGhpcyBsaW1pdC4gSW4gdGhpcyBjYXNlIGl0IGlzIGEgdXNlZnVsCisgICAgIyB0ZWNobmlxdWUgdG8gd3JhcCB0aGUgZGF0YSBmcm9tIG9uZSB3b3Jrc2hlZXQgb250byB0aGUgbmV4dCBzbyB0aGF0IHdlIGdldAorICAgICMgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZzoKKyAgICAjCisgICAgIyAgIFNoZWV0MSAgUm93ICAgICAxICAtICA2NTUzNgorICAgICMgICBTaGVldDIgIFJvdyA2NTUzNyAgLSAxMzEwNzIKKyAgICAjICAgU2hlZXQzICBSb3cgMTMxMDczIC0gLi4uCisgICAgIworICAgICMgSW4gb3JkZXIgdG8gYWNoaWV2ZSB0aGlzIHdlIHVzZSBhIHNpbmdsZSB3b3Jrc2hlZXQgcmVmZXJlbmNlIGFuZAorICAgICMgcmVpbml0aWFsaXNlIGl0IHRvIHBvaW50IHRvIGEgbmV3IHdvcmtzaGVldCB3aGVuIHJlcXVpcmVkLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDYsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygncm93X3dyYXAueGxzJyk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMgV29ya3NoZWV0IGZvcm1hdHRpbmcuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgIAorICAgICMgRm9yIHRoZSBzYWtlIG9mIHRoaXMgZXhhbXBsZSB3ZSB3aWxsIHVzZSBhIHNtYWxsIHJvdyBsaW1pdC4gSW4gb3JkZXIgdG8gdXNlCisgICAgIyB0aGUgZW50aXJlIHJvdyByYW5nZSBzZXQgdGhlICRyb3dfbGltaXQgdG8gNjU1MzYuCisgICAgbXkgJHJvd19saW1pdCA9IDEwOworICAgIG15ICRyb3cgICAgICAgPSAwOworICAgIAorICAgIGZvciBteSAkY291bnQgKDEgLi4gMiAqICRyb3dfbGltaXQgKzEwKSB7CisgICAgCisgICAgICAgICMgV2hlbiB3ZSBoaXQgdGhlIHJvdyBsaW1pdCB3ZSByZWRpcmVjdCB0aGUgb3V0cHV0CisgICAgICAgICMgdG8gYSBuZXcgd29ya3NoZWV0IGFuZCByZXNldCB0aGUgcm93IG51bWJlci4KKyAgICAgICAgaWYgKCRyb3cgPT0gJHJvd19saW1pdCkgeworICAgICAgICAgICAgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICAgICAgJHJvdyA9IDA7CisgICAgCisgICAgICAgICAgICAjIFJlcGVhdCBhbnkgd29ya3NoZWV0IGZvcm1hdHRpbmcuCisgICAgICAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCAyMCk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgICJUaGlzIGlzIHJvdyAkY291bnQiKTsKKyAgICAgICAgJHJvdysrOworICAgIH0KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvcm93X3dyYXAucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzYWxlcy5wbAorCisKKworRXhhbXBsZSBvZiBhIHNhbGVzIHdvcmtzaGVldCB0byBkZW1vbnN0cmF0ZSBzZXZlcmFsIGRpZmZlcmVudCBmZWF0dXJlcy4KK0Fsc28gdXNlcyBmdW5jdGlvbnMgZnJvbSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy9zYWxlcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHNhbGVzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBhIHNhbGVzIHdvcmtzaGVldCB0byBkZW1vbnN0cmF0ZSBzZXZlcmFsIGRpZmZlcmVudCBmZWF0dXJlcy4KKyAgICAjIEFsc28gdXNlcyBmdW5jdGlvbnMgZnJvbSB0aGUgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4gbW9kdWxlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgT2N0b2JlciAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5OworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgICAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic2FsZXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgICAgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnTWF5IFNhbGVzJyk7CisgICAgCisgICAgCisgICAgIyBTZXQgdXAgc29tZSBmb3JtYXRzCisgICAgbXkgJWhlYWRpbmcgICAgICAgICA9ICAgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ19jb2xvciAgICA9PiAxOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ24gICAgICAgPT4gJ2NlbnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSAldG90YWwgICAgICAgICAgID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3AgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9mb3JtYXQgID0+ICckIywjIzAuMDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAKKyAgICBteSAkaGVhZGluZyAgICAgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCVoZWFkaW5nKTsKKyAgICBteSAkdG90YWxfZm9ybWF0ICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KCV0b3RhbCk7CisgICAgbXkgJHByaWNlX2Zvcm1hdCAgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICckIywjIzAuMDAnKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgICAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ21tbSBkIHl5eScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIG1haW4gaGVhZGluZ3MKKyAgICAkd29ya3NoZWV0LT5mcmVlemVfcGFuZXMoMSk7ICMgRnJlZXplIHRoZSBmaXJzdCByb3cKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnSXRlbScsICAgICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ1F1YW50aXR5JywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdDMScsICdQcmljZScsICAgICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDEnLCAnVG90YWwnLCAgICAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0UxJywgJ0RhdGUnLCAgICAgJGhlYWRpbmcpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGhzCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgMjUpOworICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0I6QicsIDEwKTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdDOkUnLCAxNik7CisgICAgCisgICAgCisgICAgIyBFeHRyYWN0IHRoZSBzYWxlcyBkYXRhIGZyb20gdGhlIF9fREFUQV9fIHNlY3Rpb24gYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KKyAgICAjIEluIHJlYWxpdHkgdGhpcyBpbmZvcm1hdGlvbiB3b3VsZCBwcm9iYWJseSBjb21lIGZyb20gYSBkYXRhYmFzZQorICAgIG15IEBzYWxlczsKKyAgICAKKyAgICBmb3JlYWNoIG15ICRsaW5lICg8REFUQT4pIHsKKyAgICAgICAgY2hvbXAgJGxpbmU7CisgICAgICAgIG5leHQgaWYgJGxpbmUgZXEgJyc7CisgICAgICAgICMgU2ltcGxlLW1pbmRlZCBwcm9jZXNzaW5nIG9mIENTViBkYXRhLiBSZWZlciB0byB0aGUgVGV4dDo6Q1NWX1hTCisgICAgICAgICMgYW5kIFRleHQ6OnhTViBtb2R1bGVzIGZvciBhIG1vcmUgY29tcGxldGUgQ1NWIGhhbmRsaW5nLgorICAgICAgICBteSBAaXRlbXMgPSBzcGxpdCAvLC8sICRsaW5lOworICAgICAgICBwdXNoIEBzYWxlcywgXEBpdGVtczsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBXcml0ZSBvdXQgdGhlIGl0ZW1zIGZyb20gZWFjaCByb3cKKyAgICBteSAkcm93ID0gMTsKKyAgICBmb3JlYWNoIG15ICRzYWxlIChAc2FsZXMpIHsKKyAgICAKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMCwgQCRzYWxlWzBdKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMSwgQCRzYWxlWzFdKTsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgMiwgQCRzYWxlWzJdLCAkcHJpY2VfZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBDcmVhdGUgYSBmb3JtdWxhIGxpa2UgJz1CMipDMicKKyAgICAgICAgbXkgJGZvcm11bGEgPSAgICc9JworICAgICAgICAgICAgICAgICAgICAgICAgLiB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgLiAiKiIKKyAgICAgICAgICAgICAgICAgICAgICAgIC4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgMik7CisgICAgCisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDMsICRmb3JtdWxhLCAkcHJpY2VfZm9ybWF0KTsKKyAgICAKKyAgICAgICAgIyBQYXJzZSB0aGUgZGF0ZQorICAgICAgICBteSAkZGF0ZSA9IHhsX2RlY29kZV9kYXRlX1VTKEAkc2FsZVszXSk7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDQsICRkYXRlLCAkZGF0ZV9mb3JtYXQpOworICAgICAgICAkcm93Kys7CisgICAgfQorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybXVsYSB0byBzdW0gdGhlIHRvdGFscywgbGlrZSAnPVNVTShEMjpENiknCisgICAgbXkgJHRvdGFsID0gJz1TVU0oRDI6JworICAgICAgICAgICAgICAgIC4geGxfcm93Y29sX3RvX2NlbGwoJHJvdy0xLCAzKQorICAgICAgICAgICAgICAgIC4gIikiOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csIDMsICR0b3RhbCwgJHRvdGFsX2Zvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgX19EQVRBX18KKyAgICA1ODYgY2FyZCwyMCwxMjUuNTAsNS8xMi8wMQorICAgIEZsYXQgU2NyZWVuIE1vbml0b3IsMSwxMzAwLjAwLDUvMTIvMDEKKyAgICA2NCBNQiBkaW1tcyw0NSw0OS45OSw1LzEzLzAxCisgICAgMTUgR0IgSEQsMTIsMzAwLjAwLDUvMTMvMDEKKyAgICBTcGVha2VycyAocGFpciksNSwxNS41MCw1LzE0LzAxCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3NhbGVzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogc2VuZG1haWwucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSBNYWlsOjpTZW5kZXIgdG8gc2VuZCBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEV4Y2VsCitmaWxlIGFzIGFuIGF0dGFjaG1lbnQuCisKK1RoZSBtYWluIHRoaW5nIGlzIHRvIGVuc3VyZSB0aGF0IHlvdSBjbG9zZSgpIHRoZSBXb3Jib29rIGJlZm9yZSB5b3Ugc2VuZCBpdC4KKworU2VlIHRoZSBMPE1haWw6OlNlbmRlcj4gbW9kdWxlIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSBNYWlsOjpTZW5kZXIgdG8gc2VuZCBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIEV4Y2VsCisgICAgIyBmaWxlIGFzIGFuIGF0dGFjaG1lbnQuCisgICAgIworICAgICMgVGhlIG1haW4gdGhpbmcgaXMgdG8gZW5zdXJlIHRoYXQgeW91IGNsb3NlKCkgdGhlIFdvcmJvb2sgYmVmb3JlIHlvdSBzZW5kIGl0LgorICAgICMKKyAgICAjIFNlZSB0aGUgTDxNYWlsOjpTZW5kZXI+IG1vZHVsZSBmb3IgZnVydGhlciBkZXRhaWxzLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgQXVndXN0IDIwMDIsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgTWFpbDo6U2VuZGVyOworICAgIAorICAgICMgQ3JlYXRlIGFuIEV4Y2VsIGZpbGUKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygic2VuZG1haWwueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldDsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAiSGVsbG8gV29ybGQhIik7CisgICAgCisgICAgJHdvcmtib29rLT5jbG9zZSgpOyAjIE11c3QgY2xvc2UgYmVmb3JlIHNlbmRpbmcKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFNlbmQgdGhlIGZpbGUuICBDaGFuZ2UgYWxsIHZhcmlhYmxlcyB0byBzdWl0CisgICAgbXkgJHNlbmRlciA9IG5ldyBNYWlsOjpTZW5kZXIKKyAgICB7CisgICAgICAgIHNtdHAgPT4gJzEyMy4xMjMuMTIzLjEyMycsCisgICAgICAgIGZyb20gPT4gJ1NvbWVvbmUnCisgICAgfTsKKyAgICAKKyAgICAkc2VuZGVyLT5NYWlsRmlsZSgKKyAgICB7CisgICAgICAgIHRvICAgICAgPT4gJ2Fub3RoZXJAbWFpbC5jb20nLAorICAgICAgICBzdWJqZWN0ID0+ICdFeGNlbCBmaWxlJywKKyAgICAgICAgbXNnICAgICA9PiAiSGVyZSBpcyB0aGUgZGF0YS5cbiIsCisgICAgICAgIGZpbGUgICAgPT4gJ21haWwueGxzJywKKyAgICB9KTsKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc2VuZG1haWwucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdGF0c19leHQucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisKK1RoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZ1bmN0aW9ucyB0aGF0IHJlZmVyZW5jZSBjZWxscyBpbgorb3RoZXIgd29ya3NoZWV0cyB3aXRoaW4gdGhlIHNhbWUgd29ya2Jvb2suCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3N0YXRzX2V4dC5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHN0YXRzX2V4dC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byB1c2UgZnVuY3Rpb25zIHRoYXQgcmVmZXJlbmNlIGNlbGxzIGluCisgICAgIyBvdGhlciB3b3Jrc2hlZXRzIHdpdGhpbiB0aGUgc2FtZSB3b3JrYm9vay4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInN0YXRzX2V4dC54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0MSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnVGVzdCByZXN1bHRzJyk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0RhdGEnKTsKKyAgICAKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEKKyAgICAkd29ya3NoZWV0MS0+c2V0X2NvbHVtbignQTpBJywgMjApOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgaGVhZGluZ3MKKyAgICBteSAkaGVhZGluZyA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkaW5nLT5zZXRfYm9sZCgpOworICAgIAorICAgICMgQ3JlYXRlIGEgbnVtZXJpY2FsIGZvcm1hdAorICAgIG15ICRudW1mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkbnVtZm9ybWF0LT5zZXRfbnVtX2Zvcm1hdCgnMC4wMCcpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBzdGF0aXN0aWNhbCBmdW5jdGlvbnMKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgJ0NvdW50JywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjEnLCAnPUNPVU5UKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMicsICdTdW0nLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCMicsICc9U1VNKERhdGEhQjI6QjkpJyk7CisgICAgCisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdBMycsICdBdmVyYWdlJywgJGhlYWRpbmcpOworICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQjMnLCAnPUFWRVJBR0UoRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E0JywgJ01pbicsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I0JywgJz1NSU4oRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E1JywgJ01heCcsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I1JywgJz1NQVgoRGF0YSFCMjpCOSknKTsKKyAgICAKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0E2JywgJ1N0YW5kYXJkIERldmlhdGlvbicsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0I2JywgJz1TVERFVihEYXRhIUIyOkI5KScpOworICAgIAorICAgICR3b3Jrc2hlZXQxLT53cml0ZSgnQTcnLCAnS3VydG9zaXMnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDEtPndyaXRlKCdCNycsICc9S1VSVChEYXRhIUIyOkI5KScpOworICAgIAorICAgIAorICAgICMgV3JpdGUgdGhlIHNhbXBsZSBkYXRhCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsICdTYW1wbGUnLCAkaGVhZGluZyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMicsIDEpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTMnLCAyKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E0JywgMyk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBNScsIDQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTYnLCA1KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0E3JywgNik7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBOCcsIDcpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQTknLCA4KTsKKyAgICAKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IxJywgJ0xlbmd0aCcsICRoZWFkaW5nKTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0IyJywgMjUuNCwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCMycsIDI1LjQsICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjQnLCAyNC44LCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I1JywgMjUuMCwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCNicsIDI1LjMsICRudW1mb3JtYXQpOworICAgICR3b3Jrc2hlZXQyLT53cml0ZSgnQjcnLCAyNC45LCAkbnVtZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0Mi0+d3JpdGUoJ0I4JywgMjUuMiwgJG51bWZvcm1hdCk7CisgICAgJHdvcmtzaGVldDItPndyaXRlKCdCOScsIDI0LjgsICRudW1mb3JtYXQpOworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9zdGF0c19leHQucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBzdG9ja3MucGwKKworCisKK0V4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisKK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGEgY29uZGl0aW9uYWwgbnVtZXJpY2FsIGZvcm1hdAord2l0aCBjb2xvdXJzIHRvIGluZGljYXRlIGlmIGEgc2hhcmUgcHJpY2UgaGFzIGdvbmUgdXAgb3IgZG93bi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvc3RvY2tzLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gc3RvY2tzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBmb3JtYXR0aW5nIHVzaW5nIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGNvbmRpdGlvbmFsIG51bWVyaWNhbCBmb3JtYXQKKyAgICAjIHdpdGggY29sb3VycyB0byBpbmRpY2F0ZSBpZiBhIHNoYXJlIHByaWNlIGhhcyBnb25lIHVwIG9yIGRvd24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgd29ya2Jvb2sgYW5kIGFkZCBhIHdvcmtzaGVldAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJzdG9ja3MueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgU2V0IHRoZSBjb2x1bW4gd2lkdGggZm9yIGNvbHVtbnMgMSwgMiwgMyBhbmQgNAorICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oMCwgMywgMTUpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgY29sdW1uIGhlYWRpbmdzCisgICAgbXkgJGhlYWRlciA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRoZWFkZXItPnNldF9ib2xkKCk7CisgICAgJGhlYWRlci0+c2V0X3NpemUoMTIpOworICAgICRoZWFkZXItPnNldF9jb2xvcignYmx1ZScpOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgZm9ybWF0IGZvciB0aGUgc3RvY2sgcHJpY2UKKyAgICBteSAkZl9wcmljZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmX3ByaWNlLT5zZXRfYWxpZ24oJ2xlZnQnKTsKKyAgICAkZl9wcmljZS0+c2V0X251bV9mb3JtYXQoJyQwLjAwJyk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBzdG9jayB2b2x1bWUKKyAgICBteSAkZl92b2x1bWUgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZl92b2x1bWUtPnNldF9hbGlnbignbGVmdCcpOworICAgICRmX3ZvbHVtZS0+c2V0X251bV9mb3JtYXQoJyMsIyMwJyk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBmb3JtYXQgZm9yIHRoZSBwcmljZSBjaGFuZ2UuIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIGNvbmRpdGlvbmFsCisgICAgIyBmb3JtYXQuIFRoZSBudW1iZXIgaXMgZm9ybWF0dGVkIGFzIGEgcGVyY2VudGFnZS4gSWYgaXQgaXMgcG9zaXRpdmUgaXQgaXMKKyAgICAjIGZvcm1hdHRlZCBpbiBncmVlbiwgaWYgaXQgaXMgbmVnYXRpdmUgaXQgaXMgZm9ybWF0dGVkIGluIHJlZCBhbmQgaWYgaXQgaXMKKyAgICAjIHplcm8gaXQgaXMgZm9ybWF0dGVkIGFzIHRoZSBkZWZhdWx0IGZvbnQgY29sb3VyIChpbiB0aGlzIGNhc2UgYmxhY2spLgorICAgICMgTm90ZTogdGhlIFtHcmVlbl0gZm9ybWF0IHByb2R1Y2VzIGFuIHVuYXBwZWFsaW5nIGxpbWUgZ3JlZW4uIFRyeQorICAgICMgW0NvbG9yIDEwXSBpbnN0ZWFkIGZvciBhIGRhcmsgZ3JlZW4uCisgICAgIworICAgIG15ICRmX2NoYW5nZSA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdCgpOworICAgICRmX2NoYW5nZS0+c2V0X2FsaWduKCdsZWZ0Jyk7CisgICAgJGZfY2hhbmdlLT5zZXRfbnVtX2Zvcm1hdCgnW0dyZWVuXTAuMCU7W1JlZF0tMC4wJTswLjAlJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBvdXQgdGhlIGRhdGEKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAnQ29tcGFueScsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDEsICdQcmljZScsICAgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgJ1ZvbHVtZScsICAkaGVhZGVyKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAzLCAnQ2hhbmdlJywgICRoZWFkZXIpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICdEYW1hZ2UgSW5jLicgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMSwgMzAuMjUsICAgICAkZl9wcmljZSk7ICAjICQzMC4yNQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDIsIDEyMzQ1NjcsICAgJGZfdm9sdW1lKTsgIyAxLDIzNCw1NjcKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAzLCAwLjA4NSwgICAgICRmX2NoYW5nZSk7ICMgOC41JSBpbiBncmVlbgorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDIsIDAsICdEdW1wIENvcnAuJyAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMSwgMS41NiwgICAgICAkZl9wcmljZSk7ICAjICQxLjU2CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMiwgNzU2NCwgICAgICAkZl92b2x1bWUpOyAjIDcsNTY0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMywgLTAuMDE1LCAgICAkZl9jaGFuZ2UpOyAjIC0xLjUlIGluIHJlZAorICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICdSZXYgTHRkLicgICAgICAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMSwgMC4xMywgICAgICAkZl9wcmljZSk7ICAjICQwLjEzCisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMiwgMzIxLCAgICAgICAkZl92b2x1bWUpOyAjIDMyMQorICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDMsIDAsICAgICAgICAgJGZfY2hhbmdlKTsgIyAwIGluIHRoZSBmb250IGNvbG9yIChibGFjaykKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvc3RvY2tzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdGFiX2NvbG9ycy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gc2V0IEV4Y2VsIHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdGFiX2NvbG9ycy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHRhYl9jb2xvcnMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gc2V0IEV4Y2VsIHdvcmtzaGVldCB0YWIgY29sb3Vycy4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1heSAyMDA2LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd0YWJfY29sb3JzLnhscycpOworICAgIAorICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJHdvcmtzaGVldDIgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkd29ya3NoZWV0MyA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBXb3Jrc2hlZXQxIHdpbGwgaGF2ZSB0aGUgZGVmYXVsdCB0YWIgY29sb3VyLgorICAgICR3b3Jrc2hlZXQyLT5zZXRfdGFiX2NvbG9yKCdyZWQnKTsKKyAgICAkd29ya3NoZWV0My0+c2V0X3RhYl9jb2xvcignZ3JlZW4nKTsKKyAgICAkd29ya3NoZWV0NC0+c2V0X3RhYl9jb2xvcigweDM1KTsgIyBPcmFuZ2UKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGFiX2NvbG9ycy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHRleHR3cmFwLnBsCisKKworCitFeGFtcGxlIG9mIGZvcm1hdHRpbmcgdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZQorCitUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHdyYXAgdGV4dCBpbiBhIGNlbGwuIFRoZXJlIGFyZSB0d28gYWx0ZXJuYXRpdmVzLAordmVydGljYWwganVzdGlmaWNhdGlvbiBhbmQgdGV4dCB3cmFwLgorCitXaXRoIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gdGhlIHRleHQgaXMgd3JhcHBlZCBhdXRvbWF0aWNhbGx5IHRvIGZpdCB0aGUKK2NvbHVtbiB3aWR0aC4gV2l0aCB0ZXh0IHdyYXAgeW91IG11c3Qgc3BlY2lmeSBhIG5ld2xpbmUgd2l0aCBhbiBlbWJlZGRlZCBcbi4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdGV4dHdyYXAuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB0ZXh0d3JhcC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgZm9ybWF0dGluZyB1c2luZyB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB3cmFwIHRleHQgaW4gYSBjZWxsLiBUaGVyZSBhcmUgdHdvIGFsdGVybmF0aXZlcywKKyAgICAjIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gYW5kIHRleHQgd3JhcC4KKyAgICAjCisgICAgIyBXaXRoIHZlcnRpY2FsIGp1c3RpZmljYXRpb24gdGhlIHRleHQgaXMgd3JhcHBlZCBhdXRvbWF0aWNhbGx5IHRvIGZpdCB0aGUKKyAgICAjIGNvbHVtbiB3aWR0aC4gV2l0aCB0ZXh0IHdyYXAgeW91IG11c3Qgc3BlY2lmeSBhIG5ld2xpbmUgd2l0aCBhbiBlbWJlZGRlZCBcbi4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAjIENyZWF0ZSBhIG5ldyB3b3JrYm9vayBhbmQgYWRkIGEgd29ya3NoZWV0CisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInRleHR3cmFwLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAjIFNldCB0aGUgY29sdW1uIHdpZHRoIGZvciBjb2x1bW5zIDEsIDIgYW5kIDMKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDEsIDEsIDI0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDIsIDIsIDM0KTsKKyAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKDMsIDMsIDM0KTsKKyAgICAKKyAgICAjIFNldCB0aGUgcm93IGhlaWdodCBmb3Igcm93cyAxLCA0LCBhbmQgNi4gVGhlIGhlaWdodCBvZiByb3cgMiB3aWxsIGFkanVzdAorICAgICMgYXV0b21hdGljYWxseSB0byBmaXQgdGhlIHRleHQuCisgICAgIworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMCwgMzApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coMywgNDApOworICAgICR3b3Jrc2hlZXQtPnNldF9yb3coNSwgODApOworICAgIAorICAgIAorICAgICMgTm8gbmV3bGluZXMKKyAgICBteSAkc3RyMSAgPSAiRm9yIHdoYXRldmVyIHdlIGxvc2UgKGxpa2UgYSB5b3Ugb3IgYSBtZSkgIjsKKyAgICAkc3RyMSAgICAuPSAiaXQncyBhbHdheXMgb3Vyc2VsdmVzIHdlIGZpbmQgaW4gdGhlIHNlYSI7CisgICAgCisgICAgIyBFbWJlZGRlZCBuZXdsaW5lcworICAgIG15ICRzdHIyICA9ICJGb3Igd2hhdGV2ZXIgd2UgbG9zZVxuKGxpa2UgYSB5b3Ugb3IgYSBtZSlcbiI7CisgICAgICAgJHN0cjIgLj0gIml0J3MgYWx3YXlzIG91cnNlbHZlc1xud2UgZmluZCBpbiB0aGUgc2VhIjsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBhIGZvcm1hdCBmb3IgdGhlIGNvbHVtbiBoZWFkaW5ncworICAgIG15ICRoZWFkZXIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkaGVhZGVyLT5zZXRfYm9sZCgpOworICAgICRoZWFkZXItPnNldF9mb250KCJDb3VyaWVyIE5ldyIpOworICAgICRoZWFkZXItPnNldF9hbGlnbignY2VudGVyJyk7CisgICAgJGhlYWRlci0+c2V0X2FsaWduKCd2Y2VudGVyJyk7CisgICAgCisgICAgIyBDcmVhdGUgYSAidmVydGljYWwganVzdGlmaWNhdGlvbiIgZm9ybWF0CisgICAgbXkgJGZvcm1hdDEgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0MS0+c2V0X2FsaWduKCd2anVzdGlmeScpOworICAgIAorICAgICMgQ3JlYXRlIGEgInRleHQgd3JhcCIgZm9ybWF0CisgICAgbXkgJGZvcm1hdDIgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0Mi0+c2V0X3RleHRfd3JhcCgpOworICAgIAorICAgICMgV3JpdGUgdGhlIGhlYWRlcnMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAxLCAic2V0X2FsaWduKCd2anVzdGlmeScpIiwgJGhlYWRlcik7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMiwgInNldF9hbGlnbigndmp1c3RpZnknKSIsICRoZWFkZXIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDMsICJzZXRfdGV4dF93cmFwKCkiLCAkaGVhZGVyKTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgZXhhbXBsZXMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMSwgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgzLCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAxLCAkc3RyMSwgJGZvcm1hdDEpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKDUsIDIsICRzdHIxLCAkZm9ybWF0MSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMywgJHN0cjIsICRmb3JtYXQyKTsKKyAgICAKKyAgICAKKyAgICAKKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGV4dHdyYXAucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3aW4zMm9sZS5wbAorCisKKworVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGhvdyB0byBjcmVhdGUgYW4gRXhjZWwgZmlsZSB1c2luZyB0aGUKK1dpbjMyOjpPTEUgbW9kdWxlIGZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIGNyZWF0ZSBhbiBFeGNlbCBmaWxlIHVzaW5nIHRoZQorICAgICMgV2luMzI6Ok9MRSBtb2R1bGUgZm9yIHRoZSBzYWtlIG9mIGNvbXBhcmlzb24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgQ3dkOworICAgIHVzZSBXaW4zMjo6T0xFOworICAgIHVzZSBXaW4zMjo6T0xFOjpDb25zdCAnTWljcm9zb2Z0IEV4Y2VsJzsKKyAgICAKKyAgICAKKyAgICBteSAkYXBwbGljYXRpb24gPSBXaW4zMjo6T0xFLT5uZXcoIkV4Y2VsLkFwcGxpY2F0aW9uIik7CisgICAgbXkgJHdvcmtib29rICAgID0gJGFwcGxpY2F0aW9uLT5Xb3JrYm9va3MtPkFkZDsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPldvcmtzaGVldHMoMSk7CisgICAgCisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+e1ZhbHVlfSA9ICJIZWxsbyBXb3JsZCI7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMiwxKS0+e1ZhbHVlfSA9ICJPbmUiOworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDMsMSktPntWYWx1ZX0gPSAiVHdvIjsKKyAgICAkd29ya3NoZWV0LT5DZWxscyg0LDEpLT57VmFsdWV9ID0gIDM7CisgICAgJHdvcmtzaGVldC0+Q2VsbHMoNSwxKS0+e1ZhbHVlfSA9ICA0LjAwMDAwMDE7CisgICAgCisgICAgIyBBZGQgc29tZSBmb3JtYXR0aW5nCisgICAgJHdvcmtzaGVldC0+Q2VsbHMoMSwxKS0+Rm9udC0+e0JvbGR9ICAgICAgID0gIlRydWUiOworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDEsMSktPkZvbnQtPntTaXplfSAgICAgICA9IDE2OworICAgICR3b3Jrc2hlZXQtPkNlbGxzKDEsMSktPkZvbnQtPntDb2xvckluZGV4fSA9IDM7CisgICAgJHdvcmtzaGVldC0+Q29sdW1ucygiQTpBIiktPntDb2x1bW5XaWR0aH0gID0gMjU7CisgICAgCisgICAgIyBXcml0ZSBhIGh5cGVybGluaworICAgIG15ICRyYW5nZSA9ICR3b3Jrc2hlZXQtPlJhbmdlKCJBNzpBNyIpOworICAgICR3b3Jrc2hlZXQtPkh5cGVybGlua3MtPkFkZCh7IEFuY2hvciA9PiAkcmFuZ2UsIEFkZHJlc3MgPT4gImh0dHA6Ly93d3cucGVybC5jb20vIn0pOworICAgIAorICAgICMgR2V0IGN1cnJlbnQgZGlyZWN0b3J5IHVzaW5nIEN3ZC5wbQorICAgIG15ICRkaXIgPSBjd2QoKTsKKyAgICAKKyAgICAkd29ya2Jvb2stPlNhdmVBcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlTmFtZSAgID0+ICRkaXIgLiAnL3dpbjMyb2xlLnhscycsCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRm9ybWF0ID0+IHhsTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICR3b3JrYm9vay0+Q2xvc2U7CisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dpbjMyb2xlLnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfYXJyYXlzLnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byB1c2UgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0bword3JpdGUgMUQgYW5kIDJEIGFycmF5cyBvZiBkYXRhLgorCitUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIoISEpIHRvIHRoZSBwZXJscmVmIGFuZAorcGVybHJlZnR1dCBtYW5wYWdlcy4gVG8gZmluZCBvdXQgbW9yZSBhYm91dCAyRCBhcnJheXMgb3IgImxpc3Qgb2YKK2xpc3RzIiByZWZlciB0byB0aGUgcGVybGxvbCBtYW5wYWdlLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy93cml0ZV9hcnJheXMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9hcnJheXMucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUgdG8KKyAgICAjIHdyaXRlIDFEIGFuZCAyRCBhcnJheXMgb2YgZGF0YS4KKyAgICAjCisgICAgIyBUbyBmaW5kIG91dCBtb3JlIGFib3V0IGFycmF5IHJlZmVyZW5jZXMgcmVmZXIoISEpIHRvIHRoZSBwZXJscmVmIGFuZAorICAgICMgcGVybHJlZnR1dCBtYW5wYWdlcy4gVG8gZmluZCBvdXQgbW9yZSBhYm91dCAyRCBhcnJheXMgb3IgImxpc3Qgb2YKKyAgICAjIGxpc3RzIiByZWZlciB0byB0aGUgcGVybGxvbCBtYW5wYWdlLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMiwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfYXJyYXlzLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQxID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDEnKTsKKyAgICBteSAkd29ya3NoZWV0MiA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSAyJyk7CisgICAgbXkgJHdvcmtzaGVldDMgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgMycpOworICAgIG15ICR3b3Jrc2hlZXQ0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDQnKTsKKyAgICBteSAkd29ya3NoZWV0NSA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSA1Jyk7CisgICAgbXkgJHdvcmtzaGVldDYgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJ0V4YW1wbGUgNicpOworICAgIG15ICR3b3Jrc2hlZXQ3ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCdFeGFtcGxlIDcnKTsKKyAgICBteSAkd29ya3NoZWV0OCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgnRXhhbXBsZSA4Jyk7CisgICAgCisgICAgbXkgJGZvcm1hdCAgICAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoY29sb3IgPT4gJ3JlZCcsIGJvbGQgPT4gMSk7CisgICAgCisgICAgCisgICAgIyBEYXRhIGFycmF5cyB1c2VkIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuCisgICAgIyB1bmRlZiB2YWx1ZXMgYXJlIHdyaXR0ZW4gYXMgYmxhbmsgY2VsbHMgKHdpdGggZm9ybWF0IGlmIHNwZWNpZmllZCkuCisgICAgIworICAgIG15IEBhcnJheSAgID0gICAoICdvbmUnLCAndHdvJywgdW5kZWYsICdmb3VyJyApOworICAgIAorICAgIG15IEBhcnJheTJkID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICBbJ21hZ2dpZScsICdtaWxseScsICdtb2xseScsICdtYXknICBdLAorICAgICAgICAgICAgICAgICAgICAgICAgWzEzLCAgICAgICAxNCwgICAgICAxNSwgICAgICAxNiAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnc2hlbGwnLCAgJ3N0YXInLCAgJ2NyYWInLCAgJ3N0b25lJ10sCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgCisgICAgCisgICAgIyAxLiBXcml0ZSBhIHJvdyBvZiBkYXRhIHVzaW5nIGFuIGFycmF5IHJlZmVyZW5jZS4KKyAgICAkd29ya3NoZWV0MS0+d3JpdGUoJ0ExJywgXEBhcnJheSk7CisgICAgCisgICAgIyAyLiBTYW1lIGFzIDEuIGFib3ZlIHVzaW5nIGFuIGFub255bW91cyBhcnJheSByZWYuCisgICAgJHdvcmtzaGVldDItPndyaXRlKCdBMScsIFsgQGFycmF5IF0pOworICAgIAorICAgICMgMy4gV3JpdGUgYSByb3cgb2YgZGF0YSB1c2luZyBhbiBleHBsaWNpdCB3cml0ZV9yb3coKSBtZXRob2QgY2FsbC4KKyAgICAjICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyB3cml0ZSgpIGluIEV4LiAxIGFib3ZlLgorICAgICMKKyAgICAkd29ya3NoZWV0My0+d3JpdGVfcm93KCdBMScsIFxAYXJyYXkpOworICAgIAorICAgICMgNC4gV3JpdGUgYSBjb2x1bW4gb2YgZGF0YSB1c2luZyB0aGUgd3JpdGVfY29sKCkgbWV0aG9kIGNhbGwuCisgICAgJHdvcmtzaGVldDQtPndyaXRlX2NvbCgnQTEnLCBcQGFycmF5KTsKKyAgICAKKyAgICAjIDUuIFdyaXRlIGEgY29sdW1uIG9mIGRhdGEgdXNpbmcgYSByZWYgdG8gYW4gYXJyYXkgcmVmLCBpLmUuIGEgMkQgYXJyYXkuCisgICAgJHdvcmtzaGVldDUtPndyaXRlKCdBMScsIFsgXEBhcnJheSBdKTsKKyAgICAKKyAgICAjIDYuIFdyaXRlIGEgMkQgYXJyYXkgaW4gY29sLXJvdyBvcmRlci4KKyAgICAkd29ya3NoZWV0Ni0+d3JpdGUoJ0ExJywgXEBhcnJheTJkKTsKKyAgICAKKyAgICAjIDcuIFdyaXRlIGEgMkQgYXJyYXkgaW4gcm93LWNvbCBvcmRlci4KKyAgICAkd29ya3NoZWV0Ny0+d3JpdGVfY29sKCdBMScsIFxAYXJyYXkyZCk7CisgICAgCisgICAgIyA4LiBXcml0ZSBhIHJvdyBvZiBkYXRhIHdpdGggZm9ybWF0dGluZy4gVGhlIGJsYW5rIGNlbGwgaXMgYWxzbyBmb3JtYXR0ZWQuCisgICAgJHdvcmtzaGVldDgtPndyaXRlKCdBMScsIFxAYXJyYXksICRmb3JtYXQpOworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZV9hcnJheXMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMS5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3dyaXRlX2hhbmRsZXIxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gd3JpdGVfaGFuZGxlcjEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CisgICAgIyBXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgaGFuZGxlciBmb3IgYSA3IGRpZ2l0IElEIG51bWJlci4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndyaXRlX2hhbmRsZXIxLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIGZvciA3IGRpZ2l0IGlkIG51bWJlcnMuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgYSBzdHJpbmcKKyAgICAjIHN1Y2ggYXMgMDAwMDAwMSB3cml0dGVuIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1iZXIgYW5kIHRodXMgcHJlc2VydmUKKyAgICAjIHRoZSBsZWFkaW5nIHplcm9lcy4KKyAgICAjCisgICAgIyBOb3RlOiB5b3UgY2FuIGdldCB0aGUgc2FtZSBlZmZlY3QgdXNpbmcgdGhlIGtlZXBfbGVhZGluZ196ZXJvcygpIG1ldGhvZCBidXQKKyAgICAjIHRoaXMgc2VydmVzIGFzIGEgc2ltcGxlIGV4YW1wbGUuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHs3fSRdLCBcJndyaXRlX215X2lkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfaWQgeworICAgIAorICAgICAgICBteSAkd29ya3NoZWV0ID0gc2hpZnQ7CisgICAgCisgICAgICAgIHJldHVybiAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoQF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFRoaXMgZm9ybWF0IG1haW50YWlucyB0aGUgY2VsbCBhcyB0ZXh0IGV2ZW4gaWYgaXQgaXMgZWRpdGVkLgorICAgIG15ICRpZF9mb3JtYXQgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdAJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIG51bWJlcnMgaW4gdGhlIHVzZXIgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICcwMDAwMDAxJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJzAwMDQwMDAnLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTQnLCAnMTIzNDU2NycsICRpZF9mb3JtYXQpOworICAgIAorICAgICMgV3JpdGUgc29tZSBudW1iZXJzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGRlZmluZWQgZm9ybWF0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgJzAwMDAwMCcsICAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTcnLCAnMDAwMDAxJywgICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBOCcsICcwMDQwMDAnLCAgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E5JywgJzEyMzQ1NicsICAkaWRfZm9ybWF0KTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2hhbmRsZXIxLnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfaGFuZGxlcjIucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKK1dyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgaGFuZGxlciBmb3IgYSA3IGRpZ2l0IElEIG51bWJlci4KK0l0IGFkZHMgYW4gYWRkaXRpb25hbCBjb25zdHJhaW50IHRvIHRoZSB3cml0ZV9oYW5kbGVyMS5wbCBpbiB0aGF0IGl0IG9ubHkKK2ZpbHRlcnMgZGF0YSB0aGF0IGlzbid0IGluIHRoZSB0aGlyZCBjb2x1bW4uCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjIuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyMi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBhIDcgZGlnaXQgSUQgbnVtYmVyLgorICAgICMgSXQgYWRkcyBhbiBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgdG8gdGhlIHdyaXRlX2hhbmRsZXIxLnBsIGluIHRoYXQgaXQgb25seQorICAgICMgZmlsdGVycyBkYXRhIHRoYXQgaXNuJ3QgaW4gdGhlIHRoaXJkIGNvbHVtbi4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoIndyaXRlX2hhbmRsZXIyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgICA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBZGQgYSBoYW5kbGVyIGZvciA3IGRpZ2l0IGlkIG51bWJlcnMuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91IHdhbnQgYSBzdHJpbmcKKyAgICAjIHN1Y2ggYXMgMDAwMDAwMSB3cml0dGVuIGFzIGEgc3RyaW5nIGluc3RlYWQgb2YgYSBudW1iZXIgYW5kIHRodXMgcHJlc2VydmUKKyAgICAjIHRoZSBsZWFkaW5nIHplcm9lcy4KKyAgICAjCisgICAgIyBOb3RlOiB5b3UgY2FuIGdldCB0aGUgc2FtZSBlZmZlY3QgdXNpbmcgdGhlIGtlZXBfbGVhZGluZ196ZXJvcygpIG1ldGhvZCBidXQKKyAgICAjIHRoaXMgc2VydmVzIGFzIGEgc2ltcGxlIGV4YW1wbGUuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHs3fSRdLCBcJndyaXRlX215X2lkKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLiBUaGUgaGFuZGxlcgorICAgICMgaXMgc2V0IHVwIHNvIHRoYXQgaXQgb25seSBmaWx0ZXJzIGRhdGEgaWYgaXQgaXMgaW4gdGhlIHRoaXJkIGNvbHVtbi4KKyAgICAjCisgICAgc3ViIHdyaXRlX215X2lkIHsKKyAgICAKKyAgICAgICAgbXkgJHdvcmtzaGVldCA9IHNoaWZ0OworICAgICAgICBteSAkY29sICAgICAgID0gJF9bMV07CisgICAgCisgICAgICAgICMgY29sIGlzIHplcm8gYmFzZWQKKyAgICAgICAgaWYgKCRjb2wgIT0gMikgeworICAgICAgICAgICAgcmV0dXJuICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyhAXyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFJlamVjdCB0aGUgbWF0Y2ggYW5kIHJldHVybiBjb250cm9sIHRvIHdyaXRlKCkKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorICAgIAorICAgIH0KKyAgICAKKyAgICAKKyAgICAjIFRoaXMgZm9ybWF0IG1haW50YWlucyB0aGUgY2VsbCBhcyB0ZXh0IGV2ZW4gaWYgaXQgaXMgZWRpdGVkLgorICAgIG15ICRpZF9mb3JtYXQgICA9ICR3b3JrYm9vay0+YWRkX2Zvcm1hdChudW1fZm9ybWF0ID0+ICdAJyk7CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIG51bWJlcnMgaW4gdGhlIHVzZXIgZGVmaW5lZCBmb3JtYXQKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAnMDAwMDAwMCcsICRpZF9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdCMScsICcwMDAwMDAxJywgJGlkX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0MxJywgJzAwMDAwMDInLCAkaWRfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnRDEnLCAnMDAwMDAwMycsICRpZF9mb3JtYXQpOworICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVfaGFuZGxlcjIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZV9oYW5kbGVyMy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gYWRkIGEgdXNlciBkZWZpbmVkIGRhdGEgaGFuZGxlciB0byB0aGUgU3ByZWFkc2hlZXQ6OgorV3JpdGVFeGNlbCB3cml0ZSgpIG1ldGhvZC4KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCitmb3JtYXQuCisKK1NlZSB3cml0ZV9oYW5kbGVyNC5wbCBmb3IgYSBtb3JlIHJpZ29yb3VzIGV4YW1wbGUgd2l0aCBlcnJvciBoYW5kbGluZy4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyMy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCisgICAgIyBmb3JtYXQuCisgICAgIworICAgICMgU2VlIHdyaXRlX2hhbmRsZXI0LnBsIGZvciBhIG1vcmUgcmlnb3JvdXMgZXhhbXBsZSB3aXRoIGVycm9yIGhhbmRsaW5nLgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ3cml0ZV9oYW5kbGVyMy54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ICAgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICBteSAkZGF0ZV9mb3JtYXQgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQobnVtX2Zvcm1hdCA9PiAnZGQvbW0veXknKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQWRkIGEgaGFuZGxlciB0byBtYXRjaCBkYXRlcyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDogZC9tL3l5eXkKKyAgICAjCisgICAgIyBUaGUgZGF5IGFuZCBtb250aCBjYW4gYmUgc2luZ2xlIG9yIGRvdWJsZSBkaWdpdHMuCisgICAgIworICAgICR3b3Jrc2hlZXQtPmFkZF93cml0ZV9oYW5kbGVyKHFyW15cZHsxLDJ9L1xkezEsMn0vXGR7NH0kXSwgXCZ3cml0ZV9teV9kYXRlKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMgU2VlIHdyaXRlX2hhbmRsZXI0LnBsIGZvciBhIG1vcmUgcmlnb3JvdXMgZXhhbXBsZSB3aXRoIGVycm9yIGhhbmRsaW5nLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfZGF0ZSB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgQGFyZ3MgICAgICA9IEBfOworICAgIAorICAgICAgICBteSAkdG9rZW4gICAgID0gJGFyZ3NbMl07CisgICAgICAgICAgICR0b2tlbiAgICAgPX4gcXJbXihcZHsxLDJ9KS8oXGR7MSwyfSkvKFxkezR9KSRdOworICAgIAorICAgICAgICAjIENoYW5nZSB0byB0aGUgZGF0ZSBmb3JtYXQgcmVxdWlyZWQgYnkgd3JpdGVfZGF0ZV90aW1lKCkuCisgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkMywgJDIsICQxOworICAgIAorICAgICAgICAkYXJnc1syXSA9ICRkYXRlOworICAgIAorICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfZGF0ZV90aW1lKEBhcmdzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyBXcml0ZSBzb21lIGRhdGVzIGluIHRoZSB1c2VyIGRlZmluZWQgZm9ybWF0CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0ExJywgJzIyLzEyLzIwMDQnLCAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMicsICcxLzEvMTk5NScsICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTMnLCAnMDEvMDEvMTk5NScsICRkYXRlX2Zvcm1hdCk7CisgICAgCisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy93cml0ZV9oYW5kbGVyMy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHdyaXRlX2hhbmRsZXI0LnBsCisKKworCitFeGFtcGxlIG9mIGhvdyB0byBhZGQgYSB1c2VyIGRlZmluZWQgZGF0YSBoYW5kbGVyIHRvIHRoZSBTcHJlYWRzaGVldDo6CitXcml0ZUV4Y2VsIHdyaXRlKCkgbWV0aG9kLgorCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGFkZCBhIGhhbmRsZXIgZm9yIGRhdGVzIGluIGEgc3BlY2lmaWMKK2Zvcm1hdC4KKworVGhpcyBpcyBhIG1vcmUgcmlnb3JvdXMgdmVyc2lvbiBvZiB3cml0ZV9oYW5kbGVyMy5wbC4KKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvd3JpdGVfaGFuZGxlcjQuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB3cml0ZV9oYW5kbGVyNC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIGFkZCBhIHVzZXIgZGVmaW5lZCBkYXRhIGhhbmRsZXIgdG8gdGhlIFNwcmVhZHNoZWV0OjoKKyAgICAjIFdyaXRlRXhjZWwgd3JpdGUoKSBtZXRob2QuCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBhZGQgYSBoYW5kbGVyIGZvciBkYXRlcyBpbiBhIHNwZWNpZmljCisgICAgIyBmb3JtYXQuCisgICAgIworICAgICMgVGhpcyBpcyBhIG1vcmUgcmlnb3JvdXMgdmVyc2lvbiBvZiB3cml0ZV9oYW5kbGVyMy5wbC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVfaGFuZGxlcjQueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCAgID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgbXkgJGRhdGVfZm9ybWF0ID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KG51bV9mb3JtYXQgPT4gJ2RkL21tL3l5Jyk7CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEFkZCBhIGhhbmRsZXIgdG8gbWF0Y2ggZGF0ZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXRzOiBkL20veXksIGQvbS95eXl5CisgICAgIworICAgICMgVGhlIGRheSBhbmQgbW9udGggY2FuIGJlIHNpbmdsZSBvciBkb3VibGUgZGlnaXRzIGFuZCB0aGUgeWVhciBjYW4gYmUgIDIgb3IgNAorICAgICMgZGlnaXRzLgorICAgICMKKyAgICAkd29ya3NoZWV0LT5hZGRfd3JpdGVfaGFuZGxlcihxclteXGR7MSwyfS9cZHsxLDJ9L1xkezIsNH0kXSwgXCZ3cml0ZV9teV9kYXRlKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBwcm9jZXNzZXMgdGhlIGRhdGEgd2hlbiBhIG1hdGNoIGlzIGZvdW5kLgorICAgICMKKyAgICBzdWIgd3JpdGVfbXlfZGF0ZSB7CisgICAgCisgICAgICAgIG15ICR3b3Jrc2hlZXQgPSBzaGlmdDsKKyAgICAgICAgbXkgQGFyZ3MgICAgICA9IEBfOworICAgIAorICAgICAgICBteSAkdG9rZW4gICAgID0gJGFyZ3NbMl07CisgICAgCisgICAgICAgIGlmICgkdG9rZW4gPX4gIHFyW14oXGR7MSwyfSkvKFxkezEsMn0pLyhcZHsyLDR9KSRdKSB7CisgICAgCisgICAgICAgICAgICBteSAkZGF5ICA9ICQxOworICAgICAgICAgICAgbXkgJG1vbiAgPSAkMjsKKyAgICAgICAgICAgIG15ICR5ZWFyID0gJDM7CisgICAgCisgICAgICAgICAgICAjIFVzZSBhIHdpbmRvdyBmb3IgMiBkaWdpdCBkYXRlcy4gVGhpcyB3aWxsIGtlZXAgc29tZSByYWdnZWQgUGVybAorICAgICAgICAgICAgIyBwcm9ncmFtbWVyIGVtcGxveWVkIGluIHRoaXJ0eSB5ZWFycyB0aW1lLiA6LSkKKyAgICAgICAgICAgIGlmIChsZW5ndGggJHllYXIgPT0gMikgeworICAgICAgICAgICAgICAgIGlmICgkeWVhciA8IDUwKSB7CisgICAgICAgICAgICAgICAgICAgICR5ZWFyICs9IDIwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkeWVhciArPSAxOTAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAKKyAgICAgICAgICAgIG15ICRkYXRlID0gc3ByaW50ZiAiJTRkLSUwMmQtJTAyZFQiLCAkeWVhciwgJG1vbiwgJGRheTsKKyAgICAKKyAgICAgICAgICAgICMgQ29udmVydCB0aGUgSVNPIElTTzg2MDEgc3R5bGUgc3RyaW5nIHRvIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICRkYXRlID0gJHdvcmtzaGVldC0+Y29udmVydF9kYXRlX3RpbWUoJGRhdGUpOworICAgIAorICAgICAgICAgICAgaWYgKGRlZmluZWQgJGRhdGUpIHsKKyAgICAgICAgICAgICAgICAjIERhdGUgd2FzIHZhbGlkCisgICAgICAgICAgICAgICAgJGFyZ3NbMl0gPSAkZGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyKEBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICMgTm90IGEgdmFsaWQgZGF0ZSB0aGVyZWZvcmUgd3JpdGUgYXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nKEBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgU2hvdWxkbid0IGhhcHBlbiBpZiB0aGUgc2FtZSBtYXRjaCBpcyB1c2VkIGluIHRoZSByZSBhbmQgc3ViLgorICAgICAgICAgICAgcmV0dXJuIHVuZGVmOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMgV3JpdGUgc29tZSBkYXRlcyBpbiB0aGUgdXNlciBkZWZpbmVkIGZvcm1hdAorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICcyMi8xMi8yMDA0JywgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTInLCAnMjIvMTIvMDQnLCAgICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0EzJywgJzIvMTIvMDQnLCAgICAkZGF0ZV9mb3JtYXQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBNCcsICcyLzUvMDQnLCAgICAgJGRhdGVfZm9ybWF0KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTUnLCAnMi81Lzk1JywgICAgICRkYXRlX2Zvcm1hdCk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0E2JywgJzIvNS8xOTk1JywgICAkZGF0ZV9mb3JtYXQpOworICAgIAorICAgICMgU29tZSBlcnJvbmVvdXMgZGF0ZXMKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTgnLCAnMi81LzE4OTUnLCAgICRkYXRlX2Zvcm1hdCk7ICMgRGF0ZSBvdXQgb2YgRXhjZWwgcmFuZ2UKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnQTknLCAnMjkvMi8yMDAzJywgICRkYXRlX2Zvcm1hdCk7ICMgSW52YWxpZCBsZWFwIGRheQorICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMTAnLCc1MC81MC81MCcsICAgJGRhdGVfZm9ybWF0KTsgIyBNYXRjaGVzIGJ1dCBpc24ndCBhIGRhdGUKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX2hhbmRsZXI0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogd3JpdGVfdG9fc2NhbGFyLnBsCisKKworCitBbiBleGFtcGxlIG9mIHdyaXRpbmcgYW4gRXhjZWwgZmlsZSB0byBhIFBlcmwgc2NhbGFyIHVzaW5nIFNwcmVhZHNoZWV0OjoKK1dyaXRlRXhjZWwgYW5kIHRoZSBuZXcgZmVhdHVyZXMgb2YgcGVybCA1LjguCisKK0ZvciBhbiBleGFtcGxlcyBvZiBob3cgdG8gd3JpdGUgdG8gYSBzY2FsYXIgaW4gdmVyc2lvbnMgcHJpb3IgdG8gcGVybCA1LjgKK3NlZSB0aGUgZmlsZWhhbmRsZS5wbCBwcm9ncmFtIGFuZCBJTzpTY2FsYXIuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQW4gZXhhbXBsZSBvZiB3cml0aW5nIGFuIEV4Y2VsIGZpbGUgdG8gYSBQZXJsIHNjYWxhciB1c2luZyBTcHJlYWRzaGVldDo6CisgICAgIyBXcml0ZUV4Y2VsIGFuZCB0aGUgbmV3IGZlYXR1cmVzIG9mIHBlcmwgNS44LgorICAgICMKKyAgICAjIEZvciBhbiBleGFtcGxlcyBvZiBob3cgdG8gd3JpdGUgdG8gYSBzY2FsYXIgaW4gdmVyc2lvbnMgcHJpb3IgdG8gcGVybCA1LjgKKyAgICAjIHNlZSB0aGUgZmlsZWhhbmRsZS5wbCBwcm9ncmFtIGFuZCBJTzpTY2FsYXIuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgCisgICAgIyBVc2UgcGVybCA1LjgncyBmZWF0dXJlIG9mIHVzaW5nIGEgc2NhbGFyIGFzIGEgZmlsZWhhbmRsZS4KKyAgICBteSAgICRmaDsKKyAgICBteSAgICRzdHIgPSAnJzsKKyAgICBvcGVuICRmaCwgJz4nLCBcJHN0ciBvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZpbGVoYW5kbGU6ICQhIjs7CisgICAgCisgICAgCisgICAgIyBPciByZXBsYWNlIHRoZSBwcmV2aW91cyB0aHJlZSBsaW5lcyB3aXRoIHRoaXM6CisgICAgIyBvcGVuIG15ICRmaCwgJz4nLCBcbXkgJHN0ciBvciBkaWUgIkZhaWxlZCB0byBvcGVuIGZpbGVoYW5kbGU6ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2UgYWNjZXB0cyBmaWxlaGFuZGxlIGFzIHdlbGwgYXMgZmlsZSBuYW1lcy4KKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkZmgpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZSgwLCAwLCAgIkhpIEV4Y2VsISIpOworICAgIAorICAgICR3b3JrYm9vay0+Y2xvc2UoKTsKKyAgICAKKyAgICAKKyAgICAjIFRoZSBFeGNlbCBmaWxlIGluIG5vdyBpbiAkc3RyLiBSZW1lbWJlciB0byBiaW5tb2RlKCkgdGhlIG91dHB1dAorICAgICMgZmlsZWhhbmRsZSBiZWZvcmUgcHJpbnRpbmcgaXQuCisgICAgYmlubW9kZSBTVERPVVQ7CisgICAgcHJpbnQgJHN0cjsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3dyaXRlX3RvX3NjYWxhci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfdXRmMTYucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFVuaWNvZGUgdGV4dCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKK3V0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfdXRmMTYuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX3V0ZjE2LnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBVbmljb2RlIHRleHQgd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKKyAgICAjIHV0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1bmljb2RlX3V0ZjE2LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIHRoZSBVbmljb2RlIHNtaWxleSBmYWNlICh3aXRoIGluY3JlYXNlZCBmb250IGZvciBsZWdpYmlsaXR5KQorICAgIG15ICRzbWlsZXkgICAgPSBwYWNrICJuIiwgMHgyNjNhOworICAgIG15ICRiaWdfZm9udCAgPSAkd29ya2Jvb2stPmFkZF9mb3JtYXQoc2l6ZSA9PiA0MCk7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0EzJywgJHNtaWxleSwgJGJpZ19mb250KTsKKyAgICAKKyAgICAKKyAgICAjIFdyaXRlIGEgcGhyYXNlIGluIEN5cmlsbGljCisgICAgbXkgJHVuaV9zdHIgPSBwYWNrICJIKiIsICIwNDJkMDQ0MjA0M2UwMDIwMDQ0NDA0NDAwNDMwMDQzNzA0MzAwMDIwMDQiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiM2QwNDMwMDAyMDA0NDAwNDQzMDQ0MTA0NDEwNDNhMDQzZTA0M2MwMDIxIjsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTUnLCAkdW5pX3N0cik7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0E3JywgcGFjayAiSCoiLCAiMDA3NDAwNjUwMDczMDA3NCIpOworICAgIAorICAgIAorICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV91dGYxNi5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfdXRmMTZfamFwYW4ucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2Ygd3JpdGluZyBzb21lIFVuaWNvZGUgdGV4dCB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCitUaGlzIGNyZWF0ZXMgYW4gRXhjZWwgZmlsZSB3aXRoIHRoZSB3b3JkIE5pcHBvbiBpbiAzIGNoYXJhY3RlciBzZXRzLgorCitUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKK3V0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisKK1NlZSBhbHNvIHRoZSB1bmljb2RlXzIwMjJfanAucGwgYW5kIHVuaWNvZGVfc2hpZnRfamlzLnBsIGV4YW1wbGVzLgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3V0ZjE2X2phcGFuLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV91dGYxNl9qYXBhbi5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisgICAgIworICAgICMgVGhpcyBjcmVhdGVzIGFuIEV4Y2VsIGZpbGUgd2l0aCB0aGUgd29yZCBOaXBwb24gaW4gMyBjaGFyYWN0ZXIgc2V0cy4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgc2hvd3MgVVRGMTYgZW5jb2RpbmcuIFdpdGggcGVybCA1LjggaXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UKKyAgICAjIHV0Zjggd2l0aG91dCBtb2RpZmljYXRpb24uCisgICAgIworICAgICMgU2VlIGFsc28gdGhlIHVuaWNvZGVfMjAyMl9qcC5wbCBhbmQgdW5pY29kZV9zaGlmdF9qaXMucGwgZXhhbXBsZXMuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXkgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCd1bmljb2RlX3V0ZjE2X2phcGFuLnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFNldCBhIFVuaWNvZGUgZm9udC4KKyAgICBteSAkdW5pX2ZvbnQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0FyaWFsIFVuaWNvZGUgTVMnKTsKKyAgICAKKyAgICAKKyAgICAjIENyZWF0ZSBzb21lIFVURi0xNkJFIFVuaWNvZGUgdGV4dC4KKyAgICBteSAka2FuamkgICAgID0gcGFjayAnbionLCAweDY1ZTUsIDB4NjcyYzsKKyAgICBteSAka2F0YWthbmEgID0gcGFjayAnbionLCAweGZmODYsIDB4ZmY4ZSwgMHhmZjlkOworICAgIG15ICRoaXJhZ2FuYSAgPSBwYWNrICduKicsIDB4MzA2YiwgMHgzMDdiLCAweDMwOTM7CisgICAgCisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJ0ExJywgJGthbmppLCAgICAkdW5pX2ZvbnQpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3V0ZjE2YmVfc3RyaW5nKCdBMicsICRrYXRha2FuYSwgJHVuaV9mb250KTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygnQTMnLCAkaGlyYWdhbmEsICR1bmlfZm9udCk7CisgICAgCisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IxJywgJ0thbmppJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IyJywgJ0thdGFrYW5hJyk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0IzJywgJ0hpcmFnYW5hJyk7CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3V0ZjE2X2phcGFuLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9jeXJpbGxpYy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiB3cml0aW5nIHNvbWUgUnVzc2lhbiBjeXJpbGxpYyB0ZXh0IHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3lyaWxsaWMuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2N5cmlsbGljLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIHdyaXRpbmcgc29tZSBSdXNzaWFuIGN5cmlsbGljIHRleHQgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDUsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgIyBJbiB0aGlzIGV4YW1wbGUgd2UgZ2VuZXJhdGUgdXRmOCBzdHJpbmdzIGZyb20gY2hhcmFjdGVyIGRhdGEgYnV0IGluIGEKKyAgICAjIHJlYWwgYXBwbGljYXRpb24gd2Ugd291bGQgZXhwZWN0IHRoZW0gdG8gY29tZSBmcm9tIGFuIGV4dGVybmFsIHNvdXJjZS4KKyAgICAjCisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBSdXNzaWFuIHdvcmtzaGVldCBuYW1lIGluIHV0ZjguCisgICAgbXkgJHNoZWV0ICAgPSBwYWNrICJVKiIsIDB4MDQyMSwgMHgwNDQyLCAweDA0NDAsIDB4MDQzMCwgMHgwNDNELCAweDA0MzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NiwgMHgwNDMwOworICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgUnVzc2lhbiBzdHJpbmcuCisgICAgbXkgJHN0ciAgICAgPSBwYWNrICJVKiIsIDB4MDQxNywgMHgwNDM0LCAweDA0NDAsIDB4MDQzMCwgMHgwNDMyLCAweDA0NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MiwgMHgwNDMyLCAweDA0NDMsIDB4MDQzOSwgMHgwMDIwLCAweDA0MUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQzOCwgMHgwNDQwLCAweDAwMjE7CisgICAgCisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfY3lyaWxsaWMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgkc2hlZXQgLiAnMScpOworICAgIAorICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDE4KTsKKyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgnQTEnLCAkc3RyKTsKKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfY3lyaWxsaWMucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2xpc3QucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZGlzcGxheSBhbGwgYXZhaWxhYmxlCitVbmljb2RlIGNoYXJhY3RlcnMgaW4gYSBmb250LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX2xpc3QuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlX2xpc3QucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgdXNpbmcgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdG8gZGlzcGxheSBhbGwgYXZhaWxhYmxlCisgICAgIyBVbmljb2RlIGNoYXJhY3RlcnMgaW4gYSBmb250LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWF5IDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygndW5pY29kZV9saXN0LnhscycpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAKKyAgICAKKyAgICAjIFNldCBhIFVuaWNvZGUgZm9udC4KKyAgICBteSAkdW5pX2ZvbnQgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0FyaWFsIFVuaWNvZGUgTVMnKTsKKyAgICAKKyAgICAjIEFzY2lpIGZvbnQgZm9yIGxhYmVscy4KKyAgICBteSAkY291cmllciAgID0gJHdvcmtib29rLT5hZGRfZm9ybWF0KGZvbnQgPT4gJ0NvdXJpZXIgTmV3Jyk7CisgICAgCisgICAgCisgICAgbXkgJGNoYXIgPSAwOworICAgIAorICAgICMgTG9vcCB0aHJvdWdoIGFsbCAzMjc2OCBVVEYtMTZCRSBjaGFyYWN0ZXJzLgorICAgICMKKyAgICBmb3IgbXkgJHJvdyAoMCAuLiAyICoqIDEyIC0xKSB7CisgICAgICAgIGZvciBteSAkY29sICgwIC4uIDMxKSB7CisgICAgCisgICAgICAgICAgICBsYXN0IGlmICRjaGFyID09IDB4ZmZmZjsKKyAgICAKKyAgICAgICAgICAgIGlmICgkY29sICUgMiA9PSAwKXsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcoJHJvdywgJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZignMHglMDRYJywgJGNoYXIpLCAkY291cmllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT53cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFjaygnbicsICRjaGFyKyspLCAkdW5pX2ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9saXN0LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV8yMDIyX2pwLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgSmFwYW5lc2UgZnJvbSBhIGZpbGUgd2l0aCBJU08tMjAyMi1KUAorZW5jb2RlZCB0ZXh0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlXzIwMjJfanAuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzIwMjJfanAucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEphcGFuZXNlIGZyb20gYSBmaWxlIHdpdGggSVNPLTIwMjItSlAKKyAgICAjIGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlXzIwMjJfanAueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlXzIwMjJfanAudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyhpc28tMjAyMi1qcCknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV8yMDIyX2pwLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV84ODU5XzExLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgVGhhaSBmcm9tIGEgZmlsZSB3aXRoIElTTy04ODU5LTExIGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlXzg4NTlfMTEuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzg4NTlfMTEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFRoYWkgZnJvbSBhIGZpbGUgd2l0aCBJU08tODg1OS0xMSBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfODg1OV8xMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfODg1OV8xMS50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGlzby04ODU5LTExKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlXzg4NTlfMTEucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlXzg4NTlfNy5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEdyZWVrIGZyb20gYSBmaWxlIHdpdGggSVNPLTg4NTktNyBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV84ODU5XzcuanBnIiB3aWR0aD0iNjQwIiBoZWlnaHQ9IjQyMCIgYWx0PSJPdXRwdXQgZnJvbSB1bmljb2RlXzg4NTlfNy5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgR3JlZWsgZnJvbSBhIGZpbGUgd2l0aCBJU08tODg1OS03IGVuY29kZWQgdGV4dC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV84ODU5XzcueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlXzg4NTlfNy50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGlzby04ODU5LTcpJywgJGZpbGUgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkZmlsZTogJCFcbiI7CisgICAgCisgICAgbXkgJHJvdyA9IDA7CisgICAgCisgICAgd2hpbGUgKDxGSD4pIHsKKyAgICAgICAgbmV4dCBpZiAvXiMvOyAjIElnbm9yZSB0aGUgY29tbWVudHMgaW4gdGhlIHNhbXBsZSBmaWxlLgorICAgICAgICBjaG9tcDsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdysrLCAwLCAgJF8pOworICAgIH0KKyAgICAKKyAgICAKKyAgICBfX0VORF9fCisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL3VuaWNvZGVfODg1OV83LnBsPgorCis9aGVhZDIgRXhhbXBsZTogdW5pY29kZV9iaWc1LnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQ2hpbmVzZSBmcm9tIGEgZmlsZSB3aXRoIEJJRzUgZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfYmlnNS5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfYmlnNS5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQ2hpbmVzZSBmcm9tIGEgZmlsZSB3aXRoIEJJRzUgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2JpZzUueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDgwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2JpZzUudHh0JzsKKyAgICAKKyAgICBvcGVuIEZILCAnPDplbmNvZGluZyhiaWc1KScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2JpZzUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2NwMTI1MS5wbAorCisKKworQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKK1NwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKworVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBDUDEyNTEgZW5jb2RlZCB0ZXh0LgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3AxMjUxLmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9jcDEyNTEucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBDUDEyNTEgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2NwMTI1MS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbignQTpBJywgNTApOworICAgIAorICAgIAorICAgIG15ICRmaWxlID0gJ3VuaWNvZGVfY3AxMjUxLnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcoY3AxMjUxKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX2NwMTI1MS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfY3AxMjU2LnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgQXJhYmljIHRleHQgZnJvbSBhIENQLTEyNTYgZW5jb2RlZCBmaWxlLgorCisKKworCis9YmVnaW4gaHRtbAorCis8cD48Y2VudGVyPjxpbWcgc3JjPSJodHRwOi8vaG9tZXBhZ2UuZWlyY29tLm5ldC9+am1jbmFtYXJhL3BlcmwvaW1hZ2VzL3VuaWNvZGVfY3AxMjU2LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9jcDEyNTYucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIEFyYWJpYyB0ZXh0IGZyb20gYSBDUC0xMjU2IGVuY29kZWQgZmlsZS4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9jcDEyNTYueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX2NwMTI1Ni50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGNwMTI1NiknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9jcDEyNTYucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB1bmljb2RlX2tvaThyLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUnVzc2lhbiBmcm9tIGEgZmlsZSB3aXRoIEtPSTgtUiBlbmNvZGVkIHRleHQuCisKKworCisKKz1iZWdpbiBodG1sCisKKzxwPjxjZW50ZXI+PGltZyBzcmM9Imh0dHA6Ly9ob21lcGFnZS5laXJjb20ubmV0L35qbWNuYW1hcmEvcGVybC9pbWFnZXMvdW5pY29kZV9rb2k4ci5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfa29pOHIucGwiIC8+PC9jZW50ZXI+PC9wPgorCis9ZW5kIGh0bWwKKworU291cmNlIGNvZGUgZm9yIHRoaXMgZXhhbXBsZToKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEEgc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCisgICAgIyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisgICAgIworICAgICMgVGhpcyBleGFtcGxlIGdlbmVyYXRlcyBzb21lIFJ1c3NpYW4gZnJvbSBhIGZpbGUgd2l0aCBLT0k4LVIgZW5jb2RlZCB0ZXh0LgorICAgICMKKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIFNlcHRlbWJlciAyMDA0LCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgIyBQZXJsIDUuOCBvciBsYXRlciBpcyByZXF1aXJlZCBmb3IgcHJvcGVyIHV0ZjggaGFuZGxpbmcuIEZvciBvbGRlciBwZXJsCisgICAgIyB2ZXJzaW9ucyB5b3Ugc2hvdWxkIHVzZSBVVEYxNiBhbmQgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nKCkgbWV0aG9kLgorICAgICMgU2VlIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZyBzZWN0aW9uIG9mIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2NzLgorICAgICMKKyAgICByZXF1aXJlIDUuMDA4OworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIG15ICR3b3JrYm9vayAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJ1bmljb2RlX2tvaThyLnhscyIpOworICAgIG15ICR3b3Jrc2hlZXQgPSAkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoKTsKKyAgICAgICAkd29ya3NoZWV0LT5zZXRfY29sdW1uKCdBOkEnLCA1MCk7CisgICAgCisgICAgCisgICAgbXkgJGZpbGUgPSAndW5pY29kZV9rb2k4ci50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKGtvaTgtciknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9rb2k4ci5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfcG9saXNoX3V0ZjgucGwKKworCisKK0Egc2ltcGxlIGV4YW1wbGUgb2YgY29udmVydGluZyBzb21lIFVuaWNvZGUgdGV4dCB0byBhbiBFeGNlbCBmaWxlIHVzaW5nCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBhbmQgcGVybCA1LjguCisKK1RoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBQb2xpc2ggZnJvbSBhIGZpbGUgd2l0aCBVVEY4IGVuY29kZWQgdGV4dC4KKworCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3BvbGlzaF91dGY4LmpwZyIgd2lkdGg9IjY0MCIgaGVpZ2h0PSI0MjAiIGFsdD0iT3V0cHV0IGZyb20gdW5pY29kZV9wb2xpc2hfdXRmOC5wbCIgLz48L2NlbnRlcj48L3A+CisKKz1lbmQgaHRtbAorCitTb3VyY2UgY29kZSBmb3IgdGhpcyBleGFtcGxlOgorCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgQSBzaW1wbGUgZXhhbXBsZSBvZiBjb252ZXJ0aW5nIHNvbWUgVW5pY29kZSB0ZXh0IHRvIGFuIEV4Y2VsIGZpbGUgdXNpbmcKKyAgICAjIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGFuZCBwZXJsIDUuOC4KKyAgICAjCisgICAgIyBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgUG9saXNoIGZyb20gYSBmaWxlIHdpdGggVVRGOCBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgU2VwdGVtYmVyIDIwMDQsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICAKKyAgICAjIFBlcmwgNS44IG9yIGxhdGVyIGlzIHJlcXVpcmVkIGZvciBwcm9wZXIgdXRmOCBoYW5kbGluZy4gRm9yIG9sZGVyIHBlcmwKKyAgICAjIHZlcnNpb25zIHlvdSBzaG91bGQgdXNlIFVURjE2IGFuZCB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcoKSBtZXRob2QuCisgICAgIyBTZWUgdGhlIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHNlY3Rpb24gb2YgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3MuCisgICAgIworICAgIHJlcXVpcmUgNS4wMDg7CisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgCisgICAgbXkgJHdvcmtib29rICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLT5uZXcoInVuaWNvZGVfcG9saXNoX3V0ZjgueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX3BvbGlzaF91dGY4LnR4dCc7CisgICAgCisgICAgb3BlbiBGSCwgJzw6ZW5jb2RpbmcodXRmOCknLCAkZmlsZSAgb3IgZGllICJDb3VsZG4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKyAgICAKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICB3aGlsZSAoPEZIPikgeworICAgICAgICBuZXh0IGlmIC9eIy87ICMgSWdub3JlIHRoZSBjb21tZW50cyBpbiB0aGUgc2FtcGxlIGZpbGUuCisgICAgICAgIGNob21wOworICAgICAgICAkd29ya3NoZWV0LT53cml0ZSgkcm93KyssIDAsICAkXyk7CisgICAgfQorICAgIAorICAgIAorICAgIF9fRU5EX18KKyAgICAKKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdW5pY29kZV9wb2xpc2hfdXRmOC5wbD4KKworPWhlYWQyIEV4YW1wbGU6IHVuaWNvZGVfc2hpZnRfamlzLnBsCisKKworCitBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorCitUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIHNvbWUgSmFwZW5lc2UgdGV4dCBmcm9tIGEgZmlsZSB3aXRoIFNoaWZ0LUpJUworZW5jb2RlZCB0ZXh0LgorCisKKworPWJlZ2luIGh0bWwKKworPHA+PGNlbnRlcj48aW1nIHNyYz0iaHR0cDovL2hvbWVwYWdlLmVpcmNvbS5uZXQvfmptY25hbWFyYS9wZXJsL2ltYWdlcy91bmljb2RlX3NoaWZ0X2ppcy5qcGciIHdpZHRoPSI2NDAiIGhlaWdodD0iNDIwIiBhbHQ9Ik91dHB1dCBmcm9tIHVuaWNvZGVfc2hpZnRfamlzLnBsIiAvPjwvY2VudGVyPjwvcD4KKworPWVuZCBodG1sCisKK1NvdXJjZSBjb2RlIGZvciB0aGlzIGV4YW1wbGU6CisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBBIHNpbXBsZSBleGFtcGxlIG9mIGNvbnZlcnRpbmcgc29tZSBVbmljb2RlIHRleHQgdG8gYW4gRXhjZWwgZmlsZSB1c2luZworICAgICMgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgYW5kIHBlcmwgNS44LgorICAgICMKKyAgICAjIFRoaXMgZXhhbXBsZSBnZW5lcmF0ZXMgc29tZSBKYXBlbmVzZSB0ZXh0IGZyb20gYSBmaWxlIHdpdGggU2hpZnQtSklTCisgICAgIyBlbmNvZGVkIHRleHQuCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBTZXB0ZW1iZXIgMjAwNCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIAorICAgIAorICAgICMgUGVybCA1Ljggb3IgbGF0ZXIgaXMgcmVxdWlyZWQgZm9yIHByb3BlciB1dGY4IGhhbmRsaW5nLiBGb3Igb2xkZXIgcGVybAorICAgICMgdmVyc2lvbnMgeW91IHNob3VsZCB1c2UgVVRGMTYgYW5kIHRoZSB3cml0ZV91dGYxNmJlX3N0cmluZygpIG1ldGhvZC4KKyAgICAjIFNlZSB0aGUgd3JpdGVfdXRmMTZiZV9zdHJpbmcgc2VjdGlvbiBvZiB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZG9jcy4KKyAgICAjCisgICAgcmVxdWlyZSA1LjAwODsKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygidW5pY29kZV9zaGlmdF9qaXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgICAgICR3b3Jrc2hlZXQtPnNldF9jb2x1bW4oJ0E6QScsIDUwKTsKKyAgICAKKyAgICAKKyAgICBteSAkZmlsZSA9ICd1bmljb2RlX3NoaWZ0X2ppcy50eHQnOworICAgIAorICAgIG9wZW4gRkgsICc8OmVuY29kaW5nKHNoaWZ0amlzKScsICRmaWxlICBvciBkaWUgIkNvdWxkbid0IG9wZW4gJGZpbGU6ICQhXG4iOworICAgIAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8Rkg+KSB7CisgICAgICAgIG5leHQgaWYgL14jLzsgIyBJZ25vcmUgdGhlIGNvbW1lbnRzIGluIHRoZSBzYW1wbGUgZmlsZS4KKyAgICAgICAgY2hvbXA7CisgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3crKywgMCwgICRfKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy91bmljb2RlX3NoaWZ0X2ppcy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNzdjJ4bHMucGwKKworCisKK0V4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUKKworU2ltcGxlIHByb2dyYW0gdG8gY29udmVydCBhIENTViBjb21tYS1zZXBhcmF0ZWQgdmFsdWUgZmlsZSB0byBhbiBFeGNlbCBmaWxlLgorVGhpcyBpcyBtb3JlIG9yIGxlc3MgYW4gbm9uLW9wIHNpbmNlIEV4Y2VsIGNhbiByZWFkIENTViBmaWxlcy4KK1RoZSBwcm9ncmFtIHVzZXMgVGV4dDo6Q1NWX1hTIHRvIHBhcnNlIHRoZSBDU1YuCisKK1VzYWdlOiBjc3YyeGxzLnBsIGZpbGUuY3N2IG5ld2ZpbGUueGxzCisKKworTk9URTogVGhpcyBpcyBvbmx5IGEgc2ltcGxlIGNvbnZlcnNpb24gdXRpbGl0eSBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzLgorRm9yIGNvbnZlcnRpbmcgYSBDU1Ygb3IgVGFiIHNlcGFyYXRlZCBvciBhbnkgb3RoZXIgdHlwZSBvZiBkZWxpbWl0ZWQKK3RleHQgZmlsZSB0byBFeGNlbCBJIHJlY29tbWVuZCB0aGUgbW9yZSByaWdvcm91cyBjc3YyeGxzIHByb2dyYW0gdGhhdCBpcworcGFydCBvZiBILk1lcmlqbiBCcmFuZCdzIFRleHQ6OkNTVl9YUyBtb2R1bGUgZGlzdHJvLgorCitTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKworCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorICAgICMKKyAgICAjIFNpbXBsZSBwcm9ncmFtIHRvIGNvbnZlcnQgYSBDU1YgY29tbWEtc2VwYXJhdGVkIHZhbHVlIGZpbGUgdG8gYW4gRXhjZWwgZmlsZS4KKyAgICAjIFRoaXMgaXMgbW9yZSBvciBsZXNzIGFuIG5vbi1vcCBzaW5jZSBFeGNlbCBjYW4gcmVhZCBDU1YgZmlsZXMuCisgICAgIyBUaGUgcHJvZ3JhbSB1c2VzIFRleHQ6OkNTVl9YUyB0byBwYXJzZSB0aGUgQ1NWLgorICAgICMKKyAgICAjIFVzYWdlOiBjc3YyeGxzLnBsIGZpbGUuY3N2IG5ld2ZpbGUueGxzCisgICAgIworICAgICMKKyAgICAjIE5PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgICAjIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCisgICAgIyB0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKKyAgICAjIHBhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKyAgICAjCisgICAgIyBTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgICMgICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICB1c2UgVGV4dDo6Q1NWX1hTOworICAgIAorICAgICMgQ2hlY2sgZm9yIHZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICBpZiAoKCQjQVJHViA8IDEpIHx8ICgkI0FSR1YgPiAyKSkgeworICAgICAgIGRpZSgiVXNhZ2U6IGNzdjJ4bHMgY3N2ZmlsZS50eHQgbmV3ZmlsZS54bHNcbiIpOworICAgIH07CisgICAgCisgICAgIyBPcGVuIHRoZSBDb21tYSBTZXBhcmF0ZWQgVmFyaWFibGUgZmlsZQorICAgIG9wZW4gKENTVkZJTEUsICRBUkdWWzBdKSBvciBkaWUgIiRBUkdWWzBdOiAkISI7CisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkQVJHVlsxXSk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IENTViBwYXJzaW5nIG9iamVjdAorICAgIG15ICRjc3YgPSBUZXh0OjpDU1ZfWFMtPm5ldzsKKyAgICAKKyAgICAjIFJvdyBhbmQgY29sdW1uIGFyZSB6ZXJvIGluZGV4ZWQKKyAgICBteSAkcm93ID0gMDsKKyAgICAKKyAgICAKKyAgICB3aGlsZSAoPENTVkZJTEU+KSB7CisgICAgICAgIGlmICgkY3N2LT5wYXJzZSgkXykpIHsKKyAgICAgICAgICAgIG15IEBGbGQgPSAkY3N2LT5maWVsZHM7CisgICAgCisgICAgICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJHRva2VuIChARmxkKSB7CisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJHJvdywgJGNvbCwgJHRva2VuKTsKKyAgICAgICAgICAgICAgICAkY29sKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAkcm93Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBteSAkZXJyID0gJGNzdi0+ZXJyb3JfaW5wdXQ7CisgICAgICAgICAgICBwcmludCAiVGV4dDo6Q1NWX1hTIHBhcnNlKCkgZmFpbGVkIG9uIGFyZ3VtZW50OiAiLCAkZXJyLCAiXG4iOworICAgICAgICB9CisgICAgfQorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9jc3YyeGxzLnBsPgorCis9aGVhZDIgRXhhbXBsZTogdGFiMnhscy5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNlIHRoZSBXcml0ZUV4Y2VsIG1vZHVsZQorCitUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgdGFiIHNlcGFyYXRlZCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZQorCitVc2FnZTogdGFiMnhscy5wbCB0YWJmaWxlLnR4dCBuZXdmaWxlLnhscworCisKK05PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KK0ZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCit0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKK3BhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKworU2VlIHRoZSBleGFtcGxlcy9jc3YyeGxzIGxpbmsgaGVyZToKKyAgICBMPGh0dHA6Ly9zZWFyY2guY3Bhbi5vcmcvfmhtYnJhbmQvVGV4dC1DU1ZfWFMvTUFOSUZFU1Q+CisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIEV4YW1wbGUgb2YgaG93IHRvIHVzZSB0aGUgV3JpdGVFeGNlbCBtb2R1bGUKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGNvbnZlcnRzIGEgdGFiIHNlcGFyYXRlZCBmaWxlIGludG8gYW4gRXhjZWwgZmlsZQorICAgICMKKyAgICAjIFVzYWdlOiB0YWIyeGxzLnBsIHRhYmZpbGUudHh0IG5ld2ZpbGUueGxzCisgICAgIworICAgICMKKyAgICAjIE5PVEU6IFRoaXMgaXMgb25seSBhIHNpbXBsZSBjb252ZXJzaW9uIHV0aWxpdHkgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4KKyAgICAjIEZvciBjb252ZXJ0aW5nIGEgQ1NWIG9yIFRhYiBzZXBhcmF0ZWQgb3IgYW55IG90aGVyIHR5cGUgb2YgZGVsaW1pdGVkCisgICAgIyB0ZXh0IGZpbGUgdG8gRXhjZWwgSSByZWNvbW1lbmQgdGhlIG1vcmUgcmlnb3JvdXMgY3N2MnhscyBwcm9ncmFtIHRoYXQgaXMKKyAgICAjIHBhcnQgb2YgSC5NZXJpam4gQnJhbmQncyBUZXh0OjpDU1ZfWFMgbW9kdWxlIGRpc3Ryby4KKyAgICAjCisgICAgIyBTZWUgdGhlIGV4YW1wbGVzL2NzdjJ4bHMgbGluayBoZXJlOgorICAgICMgICAgIEw8aHR0cDovL3NlYXJjaC5jcGFuLm9yZy9+aG1icmFuZC9UZXh0LUNTVl9YUy9NQU5JRkVTVD4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIE1hcmNoIDIwMDEsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworICAgICMKKyAgICAKKyAgICAKKyAgICB1c2Ugc3RyaWN0OworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDsKKyAgICAKKyAgICAKKyAgICAjIENoZWNrIGZvciB2YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzCisgICAgaWYgKCgkI0FSR1YgPCAxKSB8fCAoJCNBUkdWID4gMikpIHsKKyAgICAgICAgZGllKCJVc2FnZTogdGFiMnhscyB0YWJmaWxlLnR4dCBuZXdmaWxlLnhsc1xuIik7CisgICAgfTsKKyAgICAKKyAgICAKKyAgICAjIE9wZW4gdGhlIHRhYiBkZWxpbWl0ZWQgZmlsZQorICAgIG9wZW4gKFRBQkZJTEUsICRBUkdWWzBdKSBvciBkaWUgIiRBUkdWWzBdOiAkISI7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgYSBuZXcgRXhjZWwgd29ya2Jvb2sKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygkQVJHVlsxXSk7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgICMgUm93IGFuZCBjb2x1bW4gYXJlIHplcm8gaW5kZXhlZAorICAgIG15ICRyb3cgPSAwOworICAgIAorICAgIHdoaWxlICg8VEFCRklMRT4pIHsKKyAgICAgICAgY2hvbXA7CisgICAgICAgICMgU3BsaXQgb24gc2luZ2xlIHRhYgorICAgICAgICBteSBARmxkID0gc3BsaXQoJ1x0JywgJF8pOworICAgIAorICAgICAgICBteSAkY29sID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkdG9rZW4gKEBGbGQpIHsKKyAgICAgICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKCRyb3csICRjb2wsICR0b2tlbik7CisgICAgICAgICAgICAkY29sKys7CisgICAgICAgIH0KKyAgICAgICAgJHJvdysrOworICAgIH0KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvdGFiMnhscy5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRhdGVjYWxjMS5wbAorCisKKworTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorCisKKworRGVtb25zdHJhdGlvbiBvZiB3cml0aW5nIGRhdGUvdGltZSBjZWxscyB0byBFeGNlbCBzcHJlYWRzaGVldHMsCit1c2luZyBVTklYL1BlcmwgdGltZSBhcyBzb3VyY2Ugb2YgZGF0ZS90aW1lLgorCisKKworVU5JWC9QZXJsIHRpbWUgaXMgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoICgwMDowMDowMCBHTVQsIDEgSmFuIDE5NzApCittZWFzdXJlZCBpbiBzZWNvbmRzLgorCitBbiBFeGNlbCBmaWxlIGNhbiB1c2UgZXhhY3RseSBvbmUgb2YgdHdvIGRpZmZlcmVudCBkYXRlL3RpbWUgc3lzdGVtcy4KK0luIHRoZXNlIHN5c3RlbXMsIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkYXlzCisoYW5kIGZyYWN0aW9uYWwgcGFydHMgb2YgdGhlIGRheSkgc2luY2UgYSBzdGFydCBwb2ludC4gVGhlIGZsb2F0aW5nIHBvaW50CitudW1iZXIgaXMgcmVmZXJyZWQgdG8gYXMgYSAnc2VyaWFsJy4KKworVGhlIHR3byBzeXN0ZW1zICgnMTkwMCcgYW5kICcxOTA0JykgdXNlIGRpZmZlcmVudCBzdGFydGluZyBwb2ludHM6CisKKyAnMTkwMCc7ICcxLjAwJyBpcyAxIEphbiAxOTAwIEJVVCAxOTAwIGlzIGVycm9uZW91c2x5IHJlZ2FyZGVkIGFzCisgICAgICAgICBhIGxlYXAgeWVhciAtIHNlZToKKyAgICAgICAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKyAgICAgICAgIGZvciB0aGUgZXhjdXNlXkheSF5IXkheSF5IcmVhc29uLgorICcxOTA0JzsgJzEuMDAnIGlzIDIgSmFuIDE5MDQuCisKK1RoZSAnMTkwNCcgc3lzdGVtIGlzIHRoZSBkZWZhdWx0IGZvciBBcHBsZSBNYWNzLiBXaW5kb3dzIHZlcnNpb25zIG9mCitFeGNlbCBoYXZlIHRoZSBvcHRpb24gdG8gdXNlIHRoZSAnMTkwNCcgc3lzdGVtLgorCitOb3RlIHRoYXQgVmlzdWFsIEJhc2ljJ3MgIkRhdGVTZXJpYWwiIGZ1bmN0aW9uIGRvZXMgTk9UIGVycm9uZW91c2x5CityZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKK3RoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorCitOb3RlIHRoYXQgU3Rhck9mZmljZSAoYXQgbGVhc3QgYXQgdmVyc2lvbiA1LjIpIGRvZXMgTk9UIGVycm9uZW91c2x5CityZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKK3RoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorCisKKyAgICAjIS91c3IvYmluL3BlcmwgLXcKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgIyAgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgRGVtb25zdHJhdGlvbiBvZiB3cml0aW5nIGRhdGUvdGltZSBjZWxscyB0byBFeGNlbCBzcHJlYWRzaGVldHMsCisgICAgIyB1c2luZyBVTklYL1BlcmwgdGltZSBhcyBzb3VyY2Ugb2YgZGF0ZS90aW1lLgorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVU5JWC9QZXJsIHRpbWUgaXMgdGhlIHRpbWUgc2luY2UgdGhlIEVwb2NoICgwMDowMDowMCBHTVQsIDEgSmFuIDE5NzApCisgICAgIyBtZWFzdXJlZCBpbiBzZWNvbmRzLgorICAgICMKKyAgICAjIEFuIEV4Y2VsIGZpbGUgY2FuIHVzZSBleGFjdGx5IG9uZSBvZiB0d28gZGlmZmVyZW50IGRhdGUvdGltZSBzeXN0ZW1zLgorICAgICMgSW4gdGhlc2Ugc3lzdGVtcywgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMKKyAgICAjIChhbmQgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgZGF5KSBzaW5jZSBhIHN0YXJ0IHBvaW50LiBUaGUgZmxvYXRpbmcgcG9pbnQKKyAgICAjIG51bWJlciBpcyByZWZlcnJlZCB0byBhcyBhICdzZXJpYWwnLgorICAgICMKKyAgICAjIFRoZSB0d28gc3lzdGVtcyAoJzE5MDAnIGFuZCAnMTkwNCcpIHVzZSBkaWZmZXJlbnQgc3RhcnRpbmcgcG9pbnRzOgorICAgICMKKyAgICAjICAnMTkwMCc7ICcxLjAwJyBpcyAxIEphbiAxOTAwIEJVVCAxOTAwIGlzIGVycm9uZW91c2x5IHJlZ2FyZGVkIGFzCisgICAgIyAgICAgICAgICBhIGxlYXAgeWVhciAtIHNlZToKKyAgICAjICAgICAgICAgICAgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKyAgICAjICAgICAgICAgIGZvciB0aGUgZXhjdXNlXkheSF5IXkheSF5IcmVhc29uLgorICAgICMgICcxOTA0JzsgJzEuMDAnIGlzIDIgSmFuIDE5MDQuCisgICAgIworICAgICMgVGhlICcxOTA0JyBzeXN0ZW0gaXMgdGhlIGRlZmF1bHQgZm9yIEFwcGxlIE1hY3MuIFdpbmRvd3MgdmVyc2lvbnMgb2YKKyAgICAjIEV4Y2VsIGhhdmUgdGhlIG9wdGlvbiB0byB1c2UgdGhlICcxOTA0JyBzeXN0ZW0uCisgICAgIworICAgICMgTm90ZSB0aGF0IFZpc3VhbCBCYXNpYydzICJEYXRlU2VyaWFsIiBmdW5jdGlvbiBkb2VzIE5PVCBlcnJvbmVvdXNseQorICAgICMgcmVnYXJkIDE5MDAgYXMgYSBsZWFwIHllYXIsIGFuZCB0aHVzIGl0cyBzZXJpYWxzIGRvIG5vdCBhZ3JlZSB3aXRoCisgICAgIyB0aGUgMTkwMCBzZXJpYWxzIG9mIEV4Y2VsIGZvciBkYXRlcyBiZWZvcmUgMSBNYXIgMTkwMC4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgU3Rhck9mZmljZSAoYXQgbGVhc3QgYXQgdmVyc2lvbiA1LjIpIGRvZXMgTk9UIGVycm9uZW91c2x5CisgICAgIyByZWdhcmQgMTkwMCBhcyBhIGxlYXAgeWVhciwgYW5kIHRodXMgaXRzIHNlcmlhbHMgZG8gbm90IGFncmVlIHdpdGgKKyAgICAjIHRoZSAxOTAwIHNlcmlhbHMgb2YgRXhjZWwgZm9yIGRhdGVzIGJlZm9yZSAxIE1hciAxOTAwLgorICAgICMKKyAgICAKKyAgICAjIENvcHlyaWdodCAyMDAwLCBBbmRyZXcgQmVuaGFtLCBhZHNiQGJpZ2Zvb3QuY29tCisgICAgIworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBDYWxjdWxhdGlvbiBkZXNjcmlwdGlvbgorICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjCisgICAgIyAxOTAwIHN5c3RlbQorICAgICMgLS0tLS0tLS0tLS0KKyAgICAjIFVuaXggdGltZSBpcyAnMCcgYXQgMDA6MDA6MDAgR01UIDEgSmFuIDE5NzAsIGkuZS4gNzAgeWVhcnMgYWZ0ZXIgMSBKYW4gMTkwMC4KKyAgICAjIE9mIHRob3NlIDcwIHllYXJzLCAxNyAoMTkwNCwwOCwxMiwxNiwyMCwyNCwyOCwzMiwzNiw0MCw0NCw0OCw1Miw1Niw2MCw2NCw2OCkKKyAgICAjIHdlcmUgbGVhcCB5ZWFycyB3aXRoIGFuIGV4dHJhIGRheS4KKyAgICAjIFRodXMgdGhlcmUgd2VyZSAxNyArIDcwKjM2NSBkYXlzID0gMjU1NjcgZGF5cyBiZXR3ZWVuIDEgSmFuIDE5MDAgYW5kCisgICAgIyAxIEphbiAxOTcwLgorICAgICMgSW4gdGhlIDE5MDAgc3lzdGVtLCAnMScgaXMgMSBKYW4gMTkwMCwgYnV0IGFzIDE5MDAgd2FzIG5vdCBhIGxlYXAgeWVhcgorICAgICMgMSBKYW4gMTkwMCBzaG91bGQgcmVhbGx5IGJlICcyJywgc28gMSBKYW4gMTk3MCBpcyAnMjU1NjknLgorICAgICMKKyAgICAjIDE5MDQgc3lzdGVtCisgICAgIyAtLS0tLS0tLS0tLQorICAgICMgVW5peCB0aW1lIGlzICcwJyBhdCAwMDowMDowMCBHTVQgMSBKYW4gMTk3MCwgaS5lLiA2NiB5ZWFycyBhZnRlciAxIEphbiAxOTA0LgorICAgICMgT2YgdGhvc2UgNjYgeWVhcnMsIDE3ICgxOTA0LDA4LDEyLDE2LDIwLDI0LDI4LDMyLDM2LDQwLDQ0LDQ4LDUyLDU2LDYwLDY0LDY4KQorICAgICMgd2VyZSBsZWFwIHllYXJzIHdpdGggYW4gZXh0cmEgZGF5LgorICAgICMgVGh1cyB0aGVyZSB3ZXJlIDE3ICsgNjYqMzY1IGRheXMgPSAyNDEwNyBkYXlzIGJldHdlZW4gMSBKYW4gMTkwNCBhbmQKKyAgICAjIDEgSmFuIDE5NzAuCisgICAgIyBJbiB0aGUgMTkwNCBzeXN0ZW0sIDIgSmFuIDE5MDQgYmVpbmcgJzEnLCAxIEphbiAxOTcwIGlzICcyNDEwNycuCisgICAgIworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBDb3B5cmlnaHQgKGMpIDIwMDAsIEFuZHJldyBCZW5oYW0uCisgICAgIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yCisgICAgIyBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKyAgICAjCisgICAgIyBBbmRyZXcgQmVuaGFtLCBhZHNiQGJpZ2Zvb3QuY29tCisgICAgIyBMb25kb24sIFVuaXRlZCBLaW5nZG9tCisgICAgIyAxMSBOb3YgMjAwMAorICAgICMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw7CisgICAgCisgICAgdXNlIFRpbWU6OkxvY2FsOworICAgIAorICAgIHVzZSB2YXJzIHF3LyREQVRFX1NZU1RFTS87CisgICAgCisgICAgIyBVc2UgMTkwMCBkYXRlIHN5c3RlbSBvbiBhbGwgcGxhdGZvcm1zIG90aGVyIHRoYW4gQXBwbGUgTWFjIChmb3Igd2hpY2gKKyAgICAjIHVzZSAxOTA0IGRhdGUgc3lzdGVtKS4KKyAgICAkREFURV9TWVNURU0gPSAoJF5PIGVxICdNYWNPUycpID8gMSA6IDA7CisgICAgCisgICAgbXkgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiZGF0ZXMueGxzIik7CisgICAgbXkgJHdvcmtzaGVldCA9ICR3b3JrYm9vay0+YWRkX3dvcmtzaGVldCgpOworICAgIAorICAgIG15ICRmb3JtYXRfZGF0ZSA9ICAkd29ya2Jvb2stPmFkZF9mb3JtYXQoKTsKKyAgICAkZm9ybWF0X2RhdGUtPnNldF9udW1fZm9ybWF0KCdkIG1tbW0geXl5Jyk7CisgICAgCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigwLDEsMjEpOworICAgIAorICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyAoMCwwLCJUaGUgZXBvY2ggKEdNVCkiKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZV9udW1iZXIgKDAsMSwmY2FsY19zZXJpYWwoMCwxKSwweDE2KTsKKyAgICAKKyAgICAkd29ya3NoZWV0LT53cml0ZV9zdHJpbmcgKDEsMCwiVGhlIGVwb2NoIChsb2NhbHRpbWUpIik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyICgxLDEsJmNhbGNfc2VyaWFsKDAsMCksMHgxNik7CisgICAgCisgICAgJHdvcmtzaGVldC0+d3JpdGVfc3RyaW5nICgyLDAsIlRvZGF5Iik7CisgICAgJHdvcmtzaGVldC0+d3JpdGVfbnVtYmVyICgyLDEsJmNhbGNfc2VyaWFsKCksJGZvcm1hdF9kYXRlKTsKKyAgICAKKyAgICBteSAkY2hyaXN0bWFzMjAwMCA9IHRpbWVsb2NhbCgwLDAsMCwyNSwxMSwxMDApOworICAgICR3b3Jrc2hlZXQtPndyaXRlX3N0cmluZyAoMywwLCJDaHJpc3RtYXMgMjAwMCIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlX251bWJlciAoMywxLCZjYWxjX3NlcmlhbCgkY2hyaXN0bWFzMjAwMCksJGZvcm1hdF9kYXRlKTsKKyAgICAKKyAgICAkd29ya2Jvb2stPmNsb3NlKCk7CisgICAgCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBjYWxjX3NlcmlhbCgpCisgICAgIworICAgICMgQ2FsbGVkIHdpdGggKHVwIHRvKSAyIHBhcmFtZXRlcnMuCisgICAgIyAgIDEuICBVbml4IHRpbWVzdGFtcC4gIElmIG9taXR0ZWQsIHVzZXMgY3VycmVudCB0aW1lLgorICAgICMgICAyLiAgR01UIGZsYWcuIFNldCB0byAnMScgdG8gcmV0dXJuIHNlcmlhbCBpbiBHTVQuCisgICAgIyAgICAgICBJZiBvbWl0dGVkLCByZXR1cm5zIHNlcmlhbCBpbiBhcHByb3ByaWF0ZSB0aW1lem9uZS4KKyAgICAjCisgICAgIyBSZXR1cm5zIGRhdGUvdGltZSBzZXJpYWwgYWNjb3JkaW5nIHRvICREQVRFX1NZU1RFTSBzZWxlY3RlZAorICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN1YiBjYWxjX3NlcmlhbCB7CisgICAgCW15ICR0aW1lID0gKGRlZmluZWQgJF9bMF0pID8gJF9bMF0gOiB0aW1lKCk7CisgICAgCW15ICRnbXRmbGFnID0gKGRlZmluZWQgJF9bMV0pID8gJF9bMV0gOiAwOworICAgIAorICAgIAkjIERpdmlkZSB0aW1lc3RhbXAgYnkgbnVtYmVyIG9mIHNlY29uZHMgaW4gYSBkYXkuCisgICAgCSMgVGhpcyBnaXZlcyBhIGRhdGUgc2VyaWFsIHdpdGggJzAnIG9uIDEgSmFuIDE5NzAuCisgICAgCW15ICRzZXJpYWwgPSAkdGltZSAvIDg2NDAwOworICAgIAorICAgIAkjIEFkanVzdCB0aGUgZGF0ZSBzZXJpYWwgYnkgdGhlIG9mZnNldCBhcHByb3ByaWF0ZSB0byB0aGUKKyAgICAJIyBjdXJyZW50bHkgc2VsZWN0ZWQgc3lzdGVtICgxOTAwLzE5MDQpLgorICAgIAlpZiAoJERBVEVfU1lTVEVNID09IDApIHsJIyB1c2UgMTkwMCBzeXN0ZW0KKyAgICAJCSRzZXJpYWwgKz0gMjU1Njk7CisgICAgCX0gZWxzZSB7CQkJIyB1c2UgMTkwNCBzeXN0ZW0KKyAgICAJCSRzZXJpYWwgKz0gMjQxMDc7CisgICAgCX0KKyAgICAKKyAgICAJdW5sZXNzICgkZ210ZmxhZykgeworICAgIAkJIyBOb3cgaGF2ZSBhICdyYXcnIHNlcmlhbCB3aXRoIHRoZSByaWdodCBvZmZzZXQuIEJ1dCB0aGlzCisgICAgCQkjIGdpdmVzIGEgc2VyaWFsIGluIEdNVCwgd2hpY2ggaXMgZmFsc2UgdW5sZXNzIHRoZSB0aW1lem9uZQorICAgIAkJIyBpcyBHTVQuIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSBzZXJpYWwgYnkgdGhlIGFwcHJvcHJpYXRlCisgICAgCQkjIHRpbWV6b25lIG9mZnNldC4KKyAgICAJCSMgQ2FsY3VsYXRlIHRoZSBhcHByb3ByaWF0ZSB0aW1lem9uZSBvZmZzZXQgYnkgc2VlaW5nIHdoYXQKKyAgICAJCSMgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gbG9jYWx0aW1lIGFuZCBnbXRpbWUgZm9yIHRoZSBnaXZlbgorICAgIAkJIyB0aW1lIGFyZS4KKyAgICAKKyAgICAJCW15IEBnbXRpbWUgPSBnbXRpbWUoJHRpbWUpOworICAgIAkJbXkgQGx0aW1lICA9IGxvY2FsdGltZSgkdGltZSk7CisgICAgCisgICAgCQkjIEZvciB0aGUgZmlyc3QgNyBlbGVtZW50cyBvZiB0aGUgdHdvIGFycmF5cywgYWRqdXN0IHRoZQorICAgIAkJIyBkYXRlIHNlcmlhbCB3aGVyZSB0aGUgZWxlbWVudHMgZGlmZmVyLgorICAgIAkJZm9yICgwIC4uIDYpIHsKKyAgICAJCQlteSAkZGlmZiA9ICRsdGltZVskX10gLSAkZ210aW1lWyRfXTsKKyAgICAJCQlpZiAoJGRpZmYpIHsKKyAgICAJCQkJJHNlcmlhbCArPSBfYWRqdXN0bWVudCgkZGlmZiwkXyk7CisgICAgCQkJfQorICAgIAkJfQorICAgIAl9CisgICAgCisgICAgCSMgUGVycGV0dWF0ZSB0aGUgZXJyb3IgdGhhdCAxOTAwIHdhcyBhIGxlYXAgeWVhciBieSBkZWNyZW1lbnRpbmcKKyAgICAJIyB0aGUgc2VyaWFsIGlmIHdlJ3JlIHVzaW5nIHRoZSAxOTAwIHN5c3RlbSBhbmQgdGhlIGRhdGUgaXMgcHJpb3IgdG8KKyAgICAJIyAxIE1hciAxOTAwLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIG1ha2luZyBzZXJpYWwgdmFsdWUgJzYwJworICAgIAkjIDI5IEZlYiAxOTAwLgorICAgIAorICAgIAkjIFRoaXMgZml4IG9ubHkgaGFzIGFueSBlZmZlY3QgaWYgVU5JWC9QZXJsIHRpbWUgb24gdGhlIHBsYXRmb3JtCisgICAgCSMgY2FuIHJlcHJlc2VudCAxOTAwLiBNYW55IGNhbid0LgorICAgIAorICAgIAl1bmxlc3MgKCREQVRFX1NZU1RFTSkgeworICAgIAkJJHNlcmlhbC0tIGlmICgkc2VyaWFsIDwgNjEpOwkjICc2MScgaXMgMSBNYXIgMTkwMAorICAgIAl9CisgICAgCXJldHVybiAkc2VyaWFsOworICAgIH0KKyAgICAKKyAgICBzdWIgX2FkanVzdG1lbnQgeworICAgIAkjIEJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGluIHRoZSBsb2NhbHRpbWUvZ210aW1lIGFycmF5IGVsZW1lbnRzCisgICAgCSMgbnVtYmVyLCByZXR1cm4gdGhlIGFkanVzdG1lbnQgcmVxdWlyZWQgdG8gdGhlIHNlcmlhbC4KKyAgICAKKyAgICAJIyBXZSBvbmx5IGxvb2sgYXQgc29tZSBlbGVtZW50cyBvZiB0aGUgbG9jYWx0aW1lL2dtdGltZSBhcnJheXM6CisgICAgCSMgICAgc2Vjb25kcyAgICB1bmxpa2VseSB0byBiZSBkaWZmZXJlbnQgYXMgYWxsIGtub3duIHRpbWV6b25lcworICAgIAkjICAgICAgICAgICAgICAgaGF2ZSBhbiBvZmZzZXQgb2YgaW50ZWdyYWwgbXVsdGlwbGVzIG9mIDE1IG1pbnV0ZXMsCisgICAgCSMJCWJ1dCBpdCdzIGVhc3kgdG8gZG8uCisgICAgCSMgICAgbWludXRlcyAgICB3aWxsIGJlIGRpZmZlcmVudCBmb3IgdGltZXpvbmUgb2Zmc2V0cyB3aGljaCBhcmUKKyAgICAJIwkJbm90IGFuIGV4YWN0IG51bWJlciBvZiBob3Vycy4KKyAgICAJIyAgICBob3Vycwl2ZXJ5IGxpa2VseSB0byBiZSBkaWZmZXJlbnQuCisgICAgCSMgICAgd2Vla2RheQl3aWxsIGRpZmZlciB3aGVuIGxvY2FsdGltZS9nbXRpbWUgZGlmZmVyZW5jZQorICAgIAkjCQlzdHJhZGRsZXMgbWlkbmlnaHQuCisgICAgCSMKKyAgICAJIyBBc3N1bWUgdGhhdCBkaWZmZXJlbmNlIGJldHdlZW4gbG9jYWx0aW1lIGFuZCBnbXRpbWUgaXMgbGVzcyB0aGFuCisgICAgCSMgNSBkYXlzLCB0aGVuIGRvbid0IGhhdmUgdG8gZG8gbWF0aHMgZm9yIGRheSBvZiBtb250aCwgbW9udGggbnVtYmVyLAorICAgIAkjIHllYXIgbnVtYmVyLCBldGMuLi4KKyAgICAKKyAgICAJbXkgKCRkZWx0YSwkZWxlbWVudCkgPSBAXzsKKyAgICAJbXkgJGFkanVzdCA9IDA7CisgICAgCisgICAgCWlmICgkZWxlbWVudCA9PSAwKSB7CQkjIFNlY29uZHMKKyAgICAJCSRhZGp1c3QgPSAkZGVsdGEvODY0MDA7CQkjIDYwICogNjAgKiAyNAorICAgIAl9IGVsc2lmICgkZWxlbWVudCA9PSAxKSB7CSMgTWludXRlcworICAgIAkJJGFkanVzdCA9ICRkZWx0YS8xNDQwOwkJIyA2MCAqIDI0CisgICAgCX0gZWxzaWYgKCRlbGVtZW50ID09IDIpIHsJIyBIb3VycworICAgIAkJJGFkanVzdCA9ICRkZWx0YS8yNDsJCSMgMjQKKyAgICAJfSBlbHNpZiAoJGVsZW1lbnQgPT0gNikgewkjIERheSBvZiB3ZWVrIG51bWJlcgorICAgIAkJIyBDYXRjaCBkaWZmZXJlbmNlIHN0cmFkZGxpbmcgU2F0L1N1biBpbiBlaXRoZXIgZGlyZWN0aW9uCisgICAgCQkkZGVsdGEgKz0gNyBpZiAoJGRlbHRhIDwgLTQpOworICAgIAkJJGRlbHRhIC09IDcgaWYgKCRkZWx0YSA+IDQpOworICAgIAorICAgIAkJJGFkanVzdCA9ICRkZWx0YTsKKyAgICAJfQorICAgIAlyZXR1cm4gJGFkanVzdDsKKyAgICB9CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2RhdGVjYWxjMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGRhdGVjYWxjMi5wbAorCisKKworRXhhbXBsZSBvZiBob3cgdG8gdXNpbmcgdGhlIERhdGU6OkNhbGMgbW9kdWxlIHRvIGNhbGN1bGF0ZSBFeGNlbCBkYXRlcy4KKworTk9URTogQW4gZWFzaWVyIHdheSBvZiB3cml0aW5nIGRhdGVzIGFuZCB0aW1lcyBpcyB0byB1c2UgdGhlIG5ld2VyCisgICAgICB3cml0ZV9kYXRlX3RpbWUoKSBXb3Jrc2hlZXQgbWV0aG9kLiBTZWUgdGhlIGRhdGVfdGltZS5wbCBleGFtcGxlLgorCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBFeGFtcGxlIG9mIGhvdyB0byB1c2luZyB0aGUgRGF0ZTo6Q2FsYyBtb2R1bGUgdG8gY2FsY3VsYXRlIEV4Y2VsIGRhdGVzLgorICAgICMKKyAgICAjIE5PVEU6IEFuIGVhc2llciB3YXkgb2Ygd3JpdGluZyBkYXRlcyBhbmQgdGltZXMgaXMgdG8gdXNlIHRoZSBuZXdlcgorICAgICMgICAgICAgd3JpdGVfZGF0ZV90aW1lKCkgV29ya3NoZWV0IG1ldGhvZC4gU2VlIHRoZSBkYXRlX3RpbWUucGwgZXhhbXBsZS4KKyAgICAjCisgICAgIyByZXZlcnNlKCepJyksIEp1bmUgMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIHVzZSBEYXRlOjpDYWxjIHF3KERlbHRhX0RITVMpOyAjIFlvdSBtYXkgbmVlZCB0byBpbnN0YWxsIHRoaXMgbW9kdWxlLgorICAgIAorICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC0+bmV3KCJleGNlbF9kYXRlMi54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBFeHBhbmQgdGhlIGZpcnN0IGNvbHVtbiBzbyB0aGF0IHRoZSBkYXRlIGlzIHZpc2libGUuCisgICAgJHdvcmtzaGVldC0+c2V0X2NvbHVtbigiQTpBIiwgMjUpOworICAgIAorICAgIAorICAgICMgQWRkIGEgZm9ybWF0IGZvciB0aGUgZGF0ZQorICAgIG15ICRmb3JtYXQgPSAgJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7CisgICAgJGZvcm1hdC0+c2V0X251bV9mb3JtYXQoJ2QgbW1tbSB5eXkgSEg6TU06U1MnKTsKKyAgICAKKyAgICAKKyAgICBteSAkZGF0ZTsKKyAgICAKKyAgICAjIFdyaXRlIHNvbWUgZGF0ZXMgYW5kIHRpbWVzCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgxOTAwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgiQTEiLCAkZGF0ZSwgJGZvcm1hdCk7CisgICAgCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgyMDAwLCAxLCAxKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgiQTIiLCAkZGF0ZSwgJGZvcm1hdCk7CisgICAgCisgICAgJGRhdGUgPSAgZXhjZWxfZGF0ZSgyMDAwLCA0LCAxNywgMTQsIDMzLCAxNSk7CisgICAgJHdvcmtzaGVldC0+d3JpdGUoIkEzIiwgJGRhdGUsICRmb3JtYXQpOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBleGNlbF9kYXRlKCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorICAgICMKKyAgICAjIENyZWF0ZSBhbiBFeGNlbCBkYXRlIGluIHRoZSAxOTAwIGZvcm1hdC4gQWxsIG9mIHRoZSBhcmd1bWVudHMgYXJlIG9wdGlvbmFsCisgICAgIyBidXQgeW91IHNob3VsZCBhdCBsZWFzdCBhZGQgJHllYXJzLgorICAgICMKKyAgICAjIENvcnJlY3RzIGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMC4gU2VlIGV4Y2VsX3RpbWUxLnBsIGZvciBhbgorICAgICMgZXhwbGFuYXRpb24uCisgICAgIworICAgIHN1YiBleGNlbF9kYXRlIHsKKyAgICAKKyAgICAgICAgbXkgJHllYXJzICAgPSAkX1swXSB8fCAxOTAwOworICAgICAgICBteSAkbW9udGhzICA9ICRfWzFdIHx8IDE7CisgICAgICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICAgICAgbXkgJGhvdXJzICAgPSAkX1szXSB8fCAwOworICAgICAgICBteSAkbWludXRlcyA9ICRfWzRdIHx8IDA7CisgICAgICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKyAgICAKKyAgICAgICAgbXkgQGRhdGUgPSAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworICAgICAgICBteSBAZXBvY2ggPSAoMTg5OSwgMTIsIDMxLCAwLCAwLCAwKTsKKyAgICAKKyAgICAgICAgKCRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykgPSBEZWx0YV9ESE1TKEBlcG9jaCwgQGRhdGUpOworICAgIAorICAgICAgICBteSAkZGF0ZSA9ICRkYXlzICsgKCRob3VycyozNjAwICskbWludXRlcyo2MCArJHNlY29uZHMpLygyNCo2MCo2MCk7CisgICAgCisgICAgICAgICMgQWRkIGEgZGF5IGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMAorICAgICAgICAkZGF0ZSsrIGlmICgkZGF0ZSA+IDU5KTsKKyAgICAKKyAgICAgICAgcmV0dXJuICRkYXRlOworICAgIH0KKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgZXhjZWxfZGF0ZSgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykKKyAgICAjCisgICAgIyBDcmVhdGUgYW4gRXhjZWwgZGF0ZSBpbiB0aGUgMTkwNCBmb3JtYXQuIEFsbCBvZiB0aGUgYXJndW1lbnRzIGFyZSBvcHRpb25hbAorICAgICMgYnV0IHlvdSBzaG91bGQgYXQgbGVhc3QgYWRkICR5ZWFycy4KKyAgICAjCisgICAgIyBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gY2FsbCAkd29ya2Jvb2stPnNldF8xOTA0KCkgZm9yIHRoaXMgZm9ybWF0IHRvIGJlIHZhbGlkLgorICAgICMKKyAgICBzdWIgZXhjZWxfZGF0ZV8xOTA0IHsKKyAgICAKKyAgICAgICAgbXkgJHllYXJzICAgPSAkX1swXSB8fCAxOTAwOworICAgICAgICBteSAkbW9udGhzICA9ICRfWzFdIHx8IDE7CisgICAgICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICAgICAgbXkgJGhvdXJzICAgPSAkX1szXSB8fCAwOworICAgICAgICBteSAkbWludXRlcyA9ICRfWzRdIHx8IDA7CisgICAgICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKyAgICAKKyAgICAgICAgbXkgQGRhdGUgPSAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpOworICAgICAgICBteSBAZXBvY2ggPSAoMTkwNCwgMSwgMSwgMCwgMCwgMCk7CisgICAgCisgICAgICAgICgkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpID0gRGVsdGFfREhNUyhAZXBvY2gsIEBkYXRlKTsKKyAgICAKKyAgICAgICAgbXkgJGRhdGUgPSAkZGF5cyArICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworICAgIAorICAgICAgICByZXR1cm4gJGRhdGU7CisgICAgfQorICAgIAorICAgIAorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9kYXRlY2FsYzIucGw+CisKKz1oZWFkMiBFeGFtcGxlOiBsZWN4ZS5wbAorCisKK1V0aWxpdHkgcHJvZ3JhbSB0byBjb252ZXJ0IGFuIEV4Y2VsIGZpbGUgaW50byBhIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCitwcm9ncmFtIHVzaW5nIFdpbjMyOjpPTEUKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIworICAgICMgVXRpbGl0eSBwcm9ncmFtIHRvIGNvbnZlcnQgYW4gRXhjZWwgZmlsZSBpbnRvIGEgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyAgICAjIHByb2dyYW0gdXNpbmcgV2luMzI6Ok9MRQorICAgICMKKyAgICAKKyAgICAjCisgICAgIyBsZWN4ZSBwcm9ncmFtCisgICAgIyBieSB0MG1hc0BuZXRsb3Jkcy5uZXQKKyAgICAjCisgICAgIyBWZXJzaW9uICAwLjAxYSAgICBJbml0aWFsIHJlbGVhc2UgKGFscGhhKQorICAgIAorICAgIAorICAgICMgTW9kdWxlcworICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFdpbjMyOjpPTEU7CisgICAgdXNlIFdpbjMyOjpPTEU6OkNvbnN0OworICAgIHVzZSBHZXRvcHQ6OlN0ZDsKKyAgICAKKyAgICAKKyAgICAjIFZhcnMKKyAgICB1c2UgdmFycyBxdyglb3B0cyk7CisgICAgCisgICAgCisgICAgIyBHZXQgb3B0aW9ucworICAgIGdldG9wdHMoJ2k6bzp2JyxcJW9wdHMpOworICAgIAorICAgIAorICAgICMgTm90IGVub3VnaCBvcHRpb25zCisgICAgZXhpdCAmdXNhZ2UgdW5sZXNzICgkb3B0c3tpfSAmJiAkb3B0c3tvfSk7CisgICAgCisgICAgCisgICAgIyBDcmVhdGUgRXhjZWwgb2JqZWN0CisgICAgbXkgJEV4Y2VsID0gbmV3IFdpbjMyOjpPTEUoIkV4Y2VsLkFwcGxpY2F0aW9uIiwiUXVpdCIpIG9yCisgICAgICAgICAgICBkaWUgIkNhbid0IHN0YXJ0IGV4Y2VsOiAkISI7CisgICAgCisgICAgCisgICAgIyBHZXQgY29uc3RhbnRzCisgICAgbXkgJEV4Y2VsQ29uc3Q9V2luMzI6Ok9MRTo6Q29uc3QtPkxvYWQoIk1pY3Jvc29mdCBFeGNlbCIpOworICAgIAorICAgIAorICAgICMgU2hvdyBFeGNlbAorICAgICRFeGNlbC0+e1Zpc2libGV9ID0gMSBpZiAoJG9wdHN7dn0pOworICAgIAorICAgIAorICAgICMgT3BlbiBpbmZpbGUKKyAgICBteSAkV29ya2Jvb2sgPSAkRXhjZWwtPldvcmtib29rcy0+T3Blbih7RmlsZW5hbWU9PiRvcHRze2l9fSk7CisgICAgCisgICAgCisgICAgIyBPcGVuIG91dGZpbGUKKyAgICBvcGVuIChPVVRGSUxFLCI+JG9wdHN7b30iKSBvciBkaWUgIkNhbid0IG9wZW4gb3V0ZmlsZSAkb3B0c3tvfTogJCEiOworICAgIAorICAgIAorICAgICMgUHJpbnQgaGVhZGVyIGZvciBvdXRmaWxlCisgICAgcHJpbnQgT1VURklMRSA8PCdFT0gnOworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgIAorICAgIHVzZSB2YXJzIHF3KCR3b3JrYm9vayAld29ya3NoZWV0cyAlZm9ybWF0cyk7CisgICAgCisgICAgCisgICAgJHdvcmtib29rID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygiX2NoYW5nZV9tZV8ueGxzIik7CisgICAgCisgICAgCisgICAgRU9ICisgICAgCisgICAgCisgICAgIyBMb29wIGFsbCBzaGVldHMKKyAgICBmb3JlYWNoIG15ICRzaGVldG51bSAoMS4uJEV4Y2VsLT5Xb3JrYm9va3MoMSktPldvcmtzaGVldHMtPkNvdW50KSB7CisgICAgCisgICAgCisgICAgICAgICAgICAjIEZvcm1hdCBzaGVldAorICAgICAgICAgICAgbXkgJG5hbWU9JEV4Y2VsLT5Xb3JrYm9va3MoMSktPldvcmtzaGVldHMoJHNoZWV0bnVtKS0+TmFtZTsKKyAgICAgICAgICAgIHByaW50ICJTaGVldCAkbmFtZVxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiIyBTaGVldCAkbmFtZVxuIjsKKyAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfSA9IFwkd29ya2Jvb2stPmFkZF93b3Jrc2hlZXQoJyRuYW1lJyk7XG4iOworICAgIAorICAgIAorICAgICAgICAgICAgIyBHZXQgdXNlZHJhbmdlIG9mIGNlbGxzIGluIHdvcmtzaGVldAorICAgICAgICAgICAgbXkgJHVzZWRyYW5nZT0kRXhjZWwtPldvcmtib29rcygxKS0+V29ya3NoZWV0cygkc2hlZXRudW0pLT5Vc2VkUmFuZ2U7CisgICAgCisgICAgCisgICAgICAgICAgICAjIExvb3AgYWxsIGNvbHVtbnMgaW4gdXNlZCByYW5nZQorICAgICAgICAgICAgZm9yZWFjaCBteSAkaiAoMS4uJHVzZWRyYW5nZS0+Q29sdW1ucy0+Q291bnQpeworICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAjIEZvcm1hdCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkNvbCAkalxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgICAgICAgICBteSAoJGNvbHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgJGNvbHdpZHRoPSR1c2VkcmFuZ2UtPkNvbHVtbnMoJGopLT5Db2x1bW5XaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAiIyBDb2x1bW4gJGpcbiI7CisgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+c2V0X2NvbHVtbigiLigkai0xKS4iLCIuKCRqLTEpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICRjb2x3aWR0aCk7XG4iOworICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAjIExvb3AgYWxsIHJvd3MgaW4gdXNlZCByYW5nZQorICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRpICgxLi4kdXNlZHJhbmdlLT5Sb3dzLT5Db3VudCl7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtYXQgcm93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlJvdyAkaVxuIiBpZiAoJG9wdHN7dn0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIiMgUm93ICRpXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkcm93aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3doZWlnaHQ9JHVzZWRyYW5nZS0+Um93cygkaSktPlJvd0hlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+c2V0X3JvdygiLigkaS0xKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgJHJvd2hlaWdodCk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gaWYgKCRqPT0xKTsKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNyZWF0aW5nIGNlbGwgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJGZuYW1lPSJcJGZvcm1hdHN7JyIuJG5hbWUuJ1InLiRpLidDJy4kai4iJ30iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRmb3JtYXQ9IiRmbmFtZT1cJHdvcmtib29rLT5hZGRfZm9ybWF0KCk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRwcmludF9mb3JtYXQ9MDsKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBib3JkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQGJmbmFtZXM9cXcobGVmdCByaWdodCB0b3AgYm90dG9tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRrICgxLi4kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkJvcmRlcnMtPkNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkbHN0eWxlPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+Qm9yZGVycygkayktPkxpbmVTdHlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbHN0eWxlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0XyIuJGJmbmFtZXNbJGstMV0uIigkbHN0eWxlKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgZm9udAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkZm9udGF0dHIsJHByb3AsJGZ1bmMsJWZvbnRzZXRzLCRmb250Q29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICVmb250c2V0cz0oTmFtZT0+J3NldF9mb250JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplPT4nc2V0X3NpemUnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRwcm9wLCRmdW5jKSA9IGVhY2ggJWZvbnRzZXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9udGF0dHI9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb250LT4kcHJvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm9udGF0dHIgbmUgIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPiRmdW5jKCckZm9udGF0dHInKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJWZvbnRzZXRzPShCb2xkPT4nc2V0X2JvbGQoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0YWxpYz0+J3NldF9pdGFsaWMoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZGVybGluZT0+J3NldF91bmRlcmxpbmUoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlrZXRocm91Z2g9PidzZXRfc3RyaWtlb3V0KDEpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdD0+J3NldF9zY3JpcHQoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNjcmlwdD0+J3NldF9zY3JpcHQoMiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dGxpbmVGb250PT4nc2V0X291dGxpbmUoMSknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRvdz0+J3NldF9zaGFkb3coMSknKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKCRwcm9wLCRmdW5jKSA9IGVhY2ggJWZvbnRzZXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9udGF0dHI9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb250LT4kcHJvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZm9udGF0dHI9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPiRmdW5jO1xuIiA7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvbnRDb2xvcj0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkZvbnQtPkNvbG9ySW5kZXgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGZvbnRDb2xvcj4wJiYkZm9udENvbG9yIT0kRXhjZWxDb25zdC0+e3hsQ29sb3JJbmRleEF1dG9tYXRpY30pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfY29sb3IoIi4oJGZvbnRDb2xvcis3KS4iKTtcbiIgOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRleHQgYWxpZ25tZW50LCBtZXJnaW5nIGFuZCB3cmFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICgkaGFsaWduLCR2YWxpZ24sJG1lcmdlLCR3cmFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGFsaWduPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SG9yaXpvbnRhbEFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlaEFsaWducz0oJEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkNlbnRlcn09PiInY2VudGVyJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsSEFsaWduSnVzdGlmeX09PiInanVzdGlmeSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkxlZnR9PT4iJ2xlZnQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25SaWdodH09PiIncmlnaHQnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxIQWxpZ25GaWxsfT0+IidmaWxsJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsSEFsaWduQ2VudGVyQWNyb3NzU2VsZWN0aW9ufT0+IidtZXJnZSciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhhbGlnbiE9JEV4Y2VsQ29uc3QtPnt4bEhBbGlnbkdlbmVyYWx9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X2FsaWduKCRoQWxpZ25zeyRoYWxpZ259KTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR2YWxpZ249JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5WZXJ0aWNhbEFsaWdubWVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAldkFsaWducz0oJEV4Y2VsQ29uc3QtPnt4bFZBbGlnbkJvdHRvbX09PiInYm90dG9tJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsVkFsaWduQ2VudGVyfT0+Iid2Y2VudGVyJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXhjZWxDb25zdC0+e3hsVkFsaWduSnVzdGlmeX09PiIndmp1c3RpZnknIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFeGNlbENvbnN0LT57eGxWQWxpZ25Ub3B9PT4iJ3RvcCciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHZhbGlnbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9hbGlnbigkdkFsaWduc3skdmFsaWdufSk7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByaW50X2Zvcm1hdD0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWVyZ2U9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5NZXJnZUNlbGxzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbWVyZ2U9PTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfbWVyZ2UoKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3cmFwPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+V3JhcFRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR3cmFwPT0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X3RleHRfd3JhcCgxKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgcGF0dGVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJHBhdHRlcm4sJXBhdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICVwYXRzPSgtNDE0Mj0+MCwtNDEyNT0+MiwtNDEyNj0+MywtNDEyND0+NCwtNDEyOD0+NSwtNDE2Nj0+NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTQxMjE9PjcsLTQxNjI9PjgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuPSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+SW50ZXJpb3ItPlBhdHRlcm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXR0ZXJuJiYkcGF0dGVybiE9JEV4Y2VsQ29uc3QtPnt4bFBhdHRlcm5BdXRvbWF0aWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGF0dGVybj0kcGF0c3skcGF0dGVybn0gaWYgKCRwYXR0ZXJuPDAgJiYgZGVmaW5lZCAkcGF0c3skcGF0dGVybn0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9wYXR0ZXJuKCRwYXR0ZXJuKTtcbiI7CisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIENvbG9ycyBmZy9iZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCRjSW5kZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNJbmRleD0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkludGVyaW9yLT5QYXR0ZXJuQ29sb3JJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkY0luZGV4PjAmJiRjSW5kZXghPSRFeGNlbENvbnN0LT57eGxDb2xvckluZGV4QXV0b21hdGljfSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZm9ybWF0Lj0kZm5hbWUuIi0+c2V0X2JnX2NvbG9yKCIuKCRjSW5kZXgrNykuIik7XG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNJbmRleD0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPkludGVyaW9yLT5Db2xvckluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjSW5kZXg+MCYmJGNJbmRleCE9JEV4Y2VsQ29uc3QtPnt4bENvbG9ySW5kZXhBdXRvbWF0aWN9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRmb3JtYXQuPSRmbmFtZS4iLT5zZXRfZmdfY29sb3IoIi4oJGNJbmRleCs3KS4iKTtcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJpbnRfZm9ybWF0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZm9yIG51bWJlciBmb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJG51bV9mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1fZm9ybWF0PSR1c2VkcmFuZ2UtPkNlbGxzKCRpLCRqKS0+TnVtYmVyRm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbnVtX2Zvcm1hdCBuZSAiIikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1hdC49JGZuYW1lLiItPnNldF9udW1fZm9ybWF0KCckbnVtX2Zvcm1hdCcpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwcmludF9mb3JtYXQ9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgY29udGVudHMgKHRleHQgb3IgZm9ybXVsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAoJGNvbnRlbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudHM9JHVzZWRyYW5nZS0+Q2VsbHMoJGksJGopLT5Gb3JtdWxhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50cz0kdXNlZHJhbmdlLT5DZWxscygkaSwkaiktPlRleHQgaWYgKCRjb250ZW50cyBlcSAiIik7CisgICAgCisgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcmludCBjZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRjb250ZW50cyBuZSAiIiBvciAkcHJpbnRfZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIjIENlbGwoJGksJGopXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgT1VURklMRSAkZm9ybWF0IGlmICgkcHJpbnRfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE9VVEZJTEUgIlwkd29ya3NoZWV0c3snJG5hbWUnfS0+d3JpdGUoIi4oJGktMSkuIiwiLigkai0xKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwnJGNvbnRlbnRzJyI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIsJGZuYW1lIiBpZiAoJHByaW50X2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBPVVRGSUxFICIpO1xuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgCisgICAgIyBGYW1vdXMgbGFzdCB3b3Jkcy4uLgorICAgIHByaW50IE9VVEZJTEUgIlwkd29ya2Jvb2stPmNsb3NlKCk7XG4iOworICAgIAorICAgIAorICAgICMgQ2xvc2Ugb3V0ZmlsZQorICAgIGNsb3NlIChPVVRGSUxFKSBvciBkaWUgIkNhbid0IGNsb3NlIG91dGZpbGUgJG9wdHN7b306ICQhIjsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIHN1YiB1c2FnZSB7CisgICAgICAgICAgICBwcmludGYgU1RERVJSICJ1c2FnZTogJDAgW29wdGlvbnNdXG4iLgorICAgICAgICAgICAgICAgICAgICAiXHRPcHRpb25zOlxuIi4KKyAgICAgICAgICAgICAgICAgICAgIlx0XHQtdiAgICAgICBcdHZlcmJvc2UgbW9kZVxuIiAuCisgICAgICAgICAgICAgICAgICAgICJcdFx0LWkgPG5hbWU+XHRuYW1lIG9mIGlucHV0IGZpbGVcbiIgLgorICAgICAgICAgICAgICAgICAgICAiXHRcdC1vIDxuYW1lPlx0bmFtZSBvZiBvdXRwdXQgZmlsZVxuIjsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICBzdWIgRU5EIHsKKyAgICAgICAgICAgICMgUXVpdCBleGNlbAorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAkRXhjZWwtPntEaXNwbGF5QWxlcnRzfSA9IDA7CisgICAgICAgICAgICAgICAgICAgICRFeGNlbC0+UXVpdDsKKyAgICAgICAgICAgIH0gaWYgKGRlZmluZWQgJEV4Y2VsKTsKKyAgICB9CisgICAgCisgICAgCisgICAgX19FTkRfXworICAgIAorICAgIAorICAgID1oZWFkMSBOQU1FCisgICAgCisgICAgCisgICAgbGVjeGUgLSBBIEV4Y2VsIGZpbGUgdG8gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgY29kZSBjb252ZXJ0ZXIKKyAgICAKKyAgICAKKyAgICA9aGVhZDEgREVTQ1JJUFRJT04KKyAgICAKKyAgICAKKyAgICBUaGlzIHByb2dyYW0gdGFrZXMgYW4gTVMgRXhjZWwgd29ya2Jvb2sgZmlsZSBhcyBpbnB1dCBhbmQgZnJvbQorICAgIHRoYXQgZmlsZSwgcHJvZHVjZXMgYW4gb3V0cHV0IGZpbGUgd2l0aCBQZXJsIGNvZGUgdGhhdCB1c2VzIHRoZQorICAgIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZSB0byByZXByb2R1Y2UgdGhlIG9yaWdpbmFsCisgICAgZmlsZS4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgU1RVRkYKKyAgICAKKyAgICAKKyAgICBBZGRpdGlvbmFsIGhhbmRzLW9uIGVkaXRpbmcgb2YgdGhlIG91dHB1dCBmaWxlIG1pZ2h0IGJlIG5lY2NlY2FyeQorICAgIGFzOgorICAgIAorICAgIAorICAgICogVGhpcyBwcm9ncmFtIGFsd2F5cyBuYW1lcyB0aGUgZmlsZSBwcm9kdWNlZCBieSBvdXRwdXQgc2NyaXB0CisgICAgICBfY2hhbmdlX21lXy54bHMKKyAgICAKKyAgICAKKyAgICAqIFVzZXJzIG9mIGludGVybmF0aW9uYWwgRXhjZWwgdmVyc2lvbnMgd2lsbCBoYXZlIHNvbSB3b3JrIHRvIGRvCisgICAgICBvbiBsaXN0IHNlcGFyYXRvcnMgYW5kIG51bWVyaWMgcHVuY3RhdGlvbiBjaGFyYWN0ZXJzLgorICAgIAorICAgIAorICAgID1oZWFkMSBTRUUgQUxTTworICAgIAorICAgIAorICAgIEw8V2luMzI6Ok9MRT4sIEw8V2luMzI6Ok9MRTo6VmFyaWFudD4sIEw8U3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw+CisgICAgCisgICAgCisgICAgPWhlYWQxIEJVR1MKKyAgICAKKyAgICAKKyAgICAqIFBpY2tzIHdyb25nIGNvbG9yIG9uIGNlbGxzIHNvbWV0aW1lcy4KKyAgICAKKyAgICAKKyAgICAqIFByb2JhYmx5IGEgZmV3IG90aGVyLi4uCisgICAgCisgICAgCisgICAgPWhlYWQxIERJU0NMQUlNRVIKKyAgICAKKyAgICAKKyAgICBJIGRvIG5vdCBndWFyYW50ZWUgQjxBTllUSElORz4gd2l0aCB0aGlzIHByb2dyYW0uIElmIHlvdSB1c2UgaXQgeW91CisgICAgYXJlIGRvaW5nIHNvIEI8QVQgWU9VUiBPV04gUklTSz4hIEkgbWF5IG9yIG1heSBub3Qgc3VwcG9ydCB0aGlzCisgICAgZGVwZW5kaW5nIG9uIG15IHRpbWUgc2NoZWR1bGUuLi4KKyAgICAKKyAgICAKKyAgICA9aGVhZDEgQVVUSE9SCisgICAgCisgICAgCisgICAgdDBtYXNAbmV0bG9yZHMubmV0CisgICAgCisgICAgCisgICAgPWhlYWQxIENPUFlSSUdIVAorICAgIAorICAgIAorICAgIENvcHlyaWdodCAyMDAxLCB0MG1hc0BuZXRsb3Jkcy5uZXQKKyAgICAKKyAgICAKKyAgICBUaGlzIHBhY2thZ2UgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9sZWN4ZS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGNvbnZlcnRBMS5wbAorCisKKworVGhpcyBwcm9ncmFtIGNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIHRoZSBFeGNlbCBBMSBjZWxsCityZWZlcmVuY2UgIG5vdGF0aW9uLgorCitUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHN1cGVyc2VkZWQgYnkgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4uCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgcHJvZ3JhbSBjb250YWlucyBoZWxwZXIgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCB0aGUgRXhjZWwgQTEgY2VsbAorICAgICMgcmVmZXJlbmNlICBub3RhdGlvbi4KKyAgICAjCisgICAgIyBUaGVzZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIHN1cGVyc2VkZWQgYnkgTDxTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eT4uCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpLCBNYXJjaCAyMDAxLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICBwcmludCAiXG4iOworICAgIHByaW50ICJDZWxsIEI3ICAgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJ0I3Jyk7CisgICAgcHJpbnQgIikgaW4gcm93IGNvbHVtbiBub3RhdGlvbi5cbiI7CisgICAgCisgICAgcHJpbnQgIkNlbGwgXCRCNyAgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJyRCNycpOworICAgIHByaW50ICIpIGluIHJvdyBjb2x1bW4gbm90YXRpb24uXG4iOworICAgIAorICAgIHByaW50ICJDZWxsIEJcJDcgIGlzIGVxdWl2YWxlbnQgdG8gKCI7CisgICAgcHJpbnQgam9pbiAiICIsIGNlbGxfdG9fcm93Y29sKCdCJDcnKTsKKyAgICBwcmludCAiKSBpbiByb3cgY29sdW1uIG5vdGF0aW9uLlxuIjsKKyAgICAKKyAgICBwcmludCAiQ2VsbCBcJEJcJDcgaXMgZXF1aXZhbGVudCB0byAoIjsKKyAgICBwcmludCBqb2luICIgIiwgY2VsbF90b19yb3djb2woJyRCJDcnKTsKKyAgICBwcmludCAiKSBpbiByb3cgY29sdW1uIG5vdGF0aW9uLlxuXG4iOworICAgIAorICAgIHByaW50ICJSb3cgYW5kIGNvbHVtbiAoMTk5OSwgMjkpICAgICAgIGFyZSBlcXVpdmFsZW50IHRvICI7CisgICAgcHJpbnQgcm93Y29sX3RvX2NlbGwoMTk5OSwgMjkpLCAgICIuXG4iOworICAgIAorICAgIHByaW50ICJSb3cgYW5kIGNvbHVtbiAoMTk5OSwgMjksIDAsIDEpIGFyZSBlcXVpdmFsZW50IHRvICI7CisgICAgcHJpbnQgcm93Y29sX3RvX2NlbGwoMTk5OSwgMjksIDAsIDEpLCAgICIuXG5cbiI7CisgICAgCisgICAgcHJpbnQgIlRoZSBiYXNlIGNlbGwgaXM6ICAgICBaN1xuIjsKKyAgICBwcmludCAiSW5jcmVtZW50IHRoZSByb3c6ICAgICIsIGluY19jZWxsX3JvdygnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiRGVjcmVtZW50IHRoZSByb3c6ICAgICIsIGRlY19jZWxsX3JvdygnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiSW5jcmVtZW50IHRoZSBjb2x1bW46ICIsIGluY19jZWxsX2NvbCgnWjcnKSwgIlxuIjsKKyAgICBwcmludCAiRGVjcmVtZW50IHRoZSBjb2x1bW46ICIsIGRlY19jZWxsX2NvbCgnWjcnKSwgIlxuXG4iOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyByb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlKQorICAgICMKKyAgICAjIENvbnZlcnQgYSB6ZXJvIGJhc2VkIHJvdyBhbmQgY29sdW1uIHJlZmVyZW5jZSB0byBhIEExIHJlZmVyZW5jZS4gRm9yIGV4YW1wbGUKKyAgICAjICgwLCAyKSB0byBDMS4gJHJvd19hYnNvbHV0ZSwgJGNvbF9hYnNvbHV0ZSBhcmUgb3B0aW9uYWwuIFRoZXkgYXJlIGJvb2xlYW4KKyAgICAjIHZhbHVlcyB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSByb3cgb3IgY29sdW1uIHZhbHVlIGlzIGFic29sdXRlLCBpLmUuIGlmIGl0IGlzCisgICAgIyBwcmVmaXhlZCBieSBhICQgc2lnbjogZWcuICgwLCAyLCAwLCAxKSBjb252ZXJ0cyB0byAkQzEuCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiByb3djb2xfdG9fY2VsbCB7CisgICAgCisgICAgICAgIG15ICRyb3cgICAgID0gJF9bMF07CisgICAgICAgIG15ICRjb2wgICAgID0gJF9bMV07CisgICAgICAgIG15ICRyb3dfYWJzID0gJF9bMl0gfHwgMDsKKyAgICAgICAgbXkgJGNvbF9hYnMgPSAkX1szXSB8fCAwOworICAgIAorICAgIAorICAgICAgICBpZiAoJHJvd19hYnMpIHsKKyAgICAgICAgICAgICRyb3dfYWJzID0gJyQnCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkcm93X2FicyA9ICcnCisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYgKCRjb2xfYWJzKSB7CisgICAgICAgICAgICAkY29sX2FicyA9ICckJworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgJGNvbF9hYnMgPSAnJworICAgICAgICB9CisgICAgCisgICAgCisgICAgICAgIG15ICRpbnQgID0gaW50ICgkY29sIC8gMjYpOworICAgICAgICBteSAkZnJhYyA9ICRjb2wgJSAyNiArMTsKKyAgICAKKyAgICAgICAgbXkgJGNocjEgPScnOworICAgICAgICBteSAkY2hyMiA9Jyc7CisgICAgCisgICAgCisgICAgICAgIGlmICgkZnJhYyAhPSAwKSB7CisgICAgICAgICAgICAkY2hyMiA9IGNociAob3JkKCdBJykgKyAkZnJhYyAtMSk7OworICAgICAgICB9CisgICAgCisgICAgICAgIGlmICgkaW50ID4gMCkgeworICAgICAgICAgICAgJGNocjEgPSBjaHIgKG9yZCgnQScpICsgJGludCAgLTEpOworICAgICAgICB9CisgICAgCisgICAgICAgICRyb3crKzsgICAgICMgWmVybyBpbmRleCB0byAxLWluZGV4CisgICAgCisgICAgICAgIHJldHVybiAkY29sX2FicyAuICRjaHIxIC4gJGNocjIgLiAkcm93X2Ficy4gJHJvdzsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGNlbGxfdG9fcm93Y29sKCRjZWxsX3JlZikKKyAgICAjCisgICAgIyBDb252ZXJ0IGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIHRvIGEgemVybyBiYXNlZCByb3cgYW5kIGNvbHVtbgorICAgICMgcmVmZXJlbmNlOyBjb252ZXJ0cyBDMSB0byAoMCwgMiwgMCwgMCkuCisgICAgIworICAgICMgUmV0dXJuczogcm93LCBjb2x1bW4sIHJvd19pc19hYnNvbHV0ZSwgY29sdW1uX2lzX2Fic29sdXRlCisgICAgIworICAgICMKKyAgICBzdWIgY2VsbF90b19yb3djb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgIAorICAgICAgICAkY2VsbCA9fiAvKFwkPykoW0EtSV0/W0EtWl0pKFwkPykoXGQrKS87CisgICAgCisgICAgICAgIG15ICRjb2xfYWJzID0gJDEgZXEgIiIgPyAwIDogMTsKKyAgICAgICAgbXkgJGNvbCAgICAgPSAkMjsKKyAgICAgICAgbXkgJHJvd19hYnMgPSAkMyBlcSAiIiA/IDAgOiAxOworICAgICAgICBteSAkcm93ICAgICA9ICQ0OworICAgIAorICAgICAgICAjIENvbnZlcnQgYmFzZTI2IGNvbHVtbiBzdHJpbmcgdG8gbnVtYmVyCisgICAgICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLgorICAgICAgICBteSBAY2hhcnMgID0gc3BsaXQgLy8sICRjb2w7CisgICAgICAgIG15ICRleHBuICAgPSAwOworICAgICAgICAkY29sICAgICAgID0gMDsKKyAgICAKKyAgICAgICAgd2hpbGUgKEBjaGFycykgeworICAgICAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgICAgICRleHBuKys7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgIyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleAorICAgICAgICAkcm93LS07CisgICAgICAgICRjb2wtLTsKKyAgICAKKyAgICAgICAgcmV0dXJuICRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FiczsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGluY19jZWxsX3JvdygkY2VsbF9yZWYpCisgICAgIworICAgICMgSW5jcmVtZW50cyB0aGUgcm93IG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEMzIHRvIEM0CisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBpbmNfY2VsbF9yb3cgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJHJvdysrOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGRlY19jZWxsX3JvdygkY2VsbF9yZWYpCisgICAgIworICAgICMgRGVjcmVtZW50cyB0aGUgcm93IG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEM0IHRvIEMzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBkZWNfY2VsbF9yb3cgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJHJvdy0tOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGluY19jZWxsX2NvbCgkY2VsbF9yZWYpCisgICAgIworICAgICMgSW5jcmVtZW50cyB0aGUgY29sdW1uIG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEMzIHRvIEQzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBpbmNfY2VsbF9jb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJGNvbCsrOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIGRlY19jZWxsX2NvbCgkY2VsbF9yZWYpCisgICAgIworICAgICMgRGVjcmVtZW50cyB0aGUgY29sdW1uIG51bWJlciBvZiBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbi4KKyAgICAjIEZvciBleGFtcGxlIEQzIHRvIEMzCisgICAgIworICAgICMgUmV0dXJuczogYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcuCisgICAgIworICAgIHN1YiBkZWNfY2VsbF9jb2wgeworICAgIAorICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IGNlbGxfdG9fcm93Y29sKCRjZWxsKTsKKyAgICAKKyAgICAgICAgJGNvbC0tOworICAgIAorICAgICAgICByZXR1cm4gcm93Y29sX3RvX2NlbGwoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKKyAgICB9CisgICAgCisKKworRG93bmxvYWQgdGhpcyBleGFtcGxlOiBMPGh0dHA6Ly9jcGFuc2VhcmNoLnBlcmwub3JnL3NyYy9KTUNOQU1BUkEvU3ByZWFkc2hlZXQtV3JpdGVFeGNlbC0yLjM3L2V4YW1wbGVzL2NvbnZlcnRBMS5wbD4KKworPWhlYWQyIEV4YW1wbGU6IGZ1bmN0aW9uX2xvY2FsZS5wbAorCisKKworR2VuZXJhdGUgZnVuY3Rpb24gbmFtZXMgZm9yIGRpZmZlcmVudCBsb2NhbGVzLgorCitUaGlzIHByb2dyYW0gY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGhhc2ggb2Yga25vd24gZnVuY3Rpb25zIGZvciB1c2UgaW4KK3RoZSBGb3JtdWxhLnBtIG1vZHVsZS4gQnkgZGVmYXVsdCB0aGUgZnVuY3Rpb24gbmFtZXMgYXJlIGluIEVuZ2xpc2ggYnV0IHlvdQorY2FuIGFsc28gY2hvb3NlIHRvIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBsYW5ndWFnZXM6IEdlcm1hbiwgRnJlbmNoLCBTcGFuaXNoLAorUG9ydHVndWVzZSwgRHV0Y2gsIEZpbm5pc2gsIEl0YWxpYW4gYW5kIFN3ZWRpc2guCisKK1RoaXMgd291bGQgYWxsb3cgeW91IHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDAsIDAsICc9U1VNKEMxOkMzKScgICk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSgxLCAwLCAnPVNVTU1FKEMxOkMzKScpOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMiwgMCwgJz1TT01NRShDMTpDMyknKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDMsIDAsICc9U1VNQShDMTpDMyknICk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSg0LCAwLCAnPVNPTUEoQzE6QzMpJyApOworICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNSwgMCwgJz1TT00oQzE6QzMpJyAgKTsKKyAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDYsIDAsICc9U1VNTUEoQzE6QzMpJyk7CisgICAgICAkd29ya3NoZWV0LT53cml0ZSg3LCAwLCAnPVNPTU1BKEMxOkMzKScpOworCitVbmZvcnR1bmF0ZWx5LCBpZiB5b3Ugd2lzaCB0byBzdXBwb3J0IG1vcmUgdGhhbiBvbmUgbGFuZ3VhZ2UgdGhlcmUgYXJlIHNvbWUKK2NvbmZsaWN0cyBiZXR3ZWVuIGZ1bmN0aW9uIG5hbWVzOgorCisgICAgICBGdW5jdGlvbiAgICAgICAgTGFuZ3VhZ2UgMSAgICAgICAgICAgICAgTGFuZ3VhZ2UgMgorICAgICAgPT09PT09PT0gICAgICAgID09PT09PT09PT0gICAgICAgICAgICAgID09PT09PT09PT0KKyAgICAgIE5CICAgICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBEdXRjaAorICAgICAgTkEgICAgICAgICAgICAgIEVuZ2xpc2gvRnJlbmNoICAgICAgICAgIEZpbm5pc2gKKyAgICAgIFRSSU0gICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBFbmdsaXNoCisgICAgICBESUEgICAgICAgICAgICAgU3BhbmlzaC9Qb3J0dWd1ZXNlICAgICAgR2VybWFuCisKK1RoZXJlZm9yZSwgaWYgeW91IHRyeSB0byBnZW5lcmF0ZSBhIGhhc2ggb2YgZnVuY3Rpb24gbmFtZXMgdG8gc3VwcG9ydCBib3RoCitGcmVuY2ggYW5kIEVuZ2xpc2ggdGhlbiB0aGUgZnVuY3Rpb24gVFJJTSB3aWxsIGJlIGFzc2lnbmVkIHRoZSBtZWFuaW5nIG9mIHRoZQorZmlyc3QgbGFuZ3VhZ2UgdGhhdCBkZWZpbmVzIGl0LCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgRnJlbmNoLiBZb3UgY2FuIGdldAorYXJvdW5kIHRoaXMgYnkgcmVuYW1pbmcgdGhlIGZ1bmN0aW9uIGZvciBvbmUgb2YgdGhlIGxhbmd1YWdlcyBhbmQgZG9jdW1lbnRpbmcKK3RoZSBjaGFuZ2UsIGZvciBleGFtcGxlOiBUUklNLkVOIG9yIFRSSU0uRlIuCisKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBvbmx5IHBhcnRpYWxseSBzb2x2ZXMgdGhlIHByb2JsZW0gb2YgbG9jYWxpc2F0aW9uLgorVGhlcmUgYXJlIGFsc28gbnVtYmVyIGZvcm1hdHMgdG8gY29uc2lkZXIgKDEuNSA9PSAxLDUpIGFuZCB0aGUgZmFjdCB0aGF0IHRoZQorbGlzdCBzZXBhcmF0b3IgIiwiIGFuZCB0aGUgYXJyYXkgc2VwYXJhdG9yICI7IiBhcmUgaW50ZXJjaGFuZ2VkIGluIGRpZmZlcmVudAorbG9jYWxlcy4KKworVGhlIGxvbmdlc3QgZnVuY3Rpb24gbmFtZSBpcyBMT0kuTk9STUFMRS5TVEFOREFSRC5JTlZFUlNFICgyOSBjaGFycykgZm9sbG93ZWQKK2J5IE5PUk0uSkFLQVVNQS5OT1JNSVQuS8TETlQgKDI1IGNoYXJzKS4KK1RoZSBzaG9ydGVzdCBmdW5jdGlvbiBuYW1lIGluIGFsbCBsYW5ndWFnZXMgaXMgVC4KKworCisKKworICAgICMhL3Vzci9iaW4vcGVybCAtdworICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBHZW5lcmF0ZSBmdW5jdGlvbiBuYW1lcyBmb3IgZGlmZmVyZW50IGxvY2FsZXMuCisgICAgIworICAgICMgVGhpcyBwcm9ncmFtIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBoYXNoIG9mIGtub3duIGZ1bmN0aW9ucyBmb3IgdXNlIGluCisgICAgIyB0aGUgRm9ybXVsYS5wbSBtb2R1bGUuIEJ5IGRlZmF1bHQgdGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSBpbiBFbmdsaXNoIGJ1dCB5b3UKKyAgICAjIGNhbiBhbHNvIGNob29zZSB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOiBHZXJtYW4sIEZyZW5jaCwgU3BhbmlzaCwKKyAgICAjIFBvcnR1Z3Vlc2UsIER1dGNoLCBGaW5uaXNoLCBJdGFsaWFuIGFuZCBTd2VkaXNoLgorICAgICMKKyAgICAjIFRoaXMgd291bGQgYWxsb3cgeW91IHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisgICAgIworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMCwgMCwgJz1TVU0oQzE6QzMpJyAgKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDEsIDAsICc9U1VNTUUoQzE6QzMpJyk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSgyLCAwLCAnPVNPTU1FKEMxOkMzKScpOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoMywgMCwgJz1TVU1BKEMxOkMzKScgKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDQsIDAsICc9U09NQShDMTpDMyknICk7CisgICAgIyAgICAgICAkd29ya3NoZWV0LT53cml0ZSg1LCAwLCAnPVNPTShDMTpDMyknICApOworICAgICMgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoNiwgMCwgJz1TVU1NQShDMTpDMyknKTsKKyAgICAjICAgICAgICR3b3Jrc2hlZXQtPndyaXRlKDcsIDAsICc9U09NTUEoQzE6QzMpJyk7CisgICAgIworICAgICMgVW5mb3J0dW5hdGVseSwgaWYgeW91IHdpc2ggdG8gc3VwcG9ydCBtb3JlIHRoYW4gb25lIGxhbmd1YWdlIHRoZXJlIGFyZSBzb21lCisgICAgIyBjb25mbGljdHMgYmV0d2VlbiBmdW5jdGlvbiBuYW1lczoKKyAgICAjCisgICAgIyAgICAgICBGdW5jdGlvbiAgICAgICAgTGFuZ3VhZ2UgMSAgICAgICAgICAgICAgTGFuZ3VhZ2UgMgorICAgICMgICAgICAgPT09PT09PT0gICAgICAgID09PT09PT09PT0gICAgICAgICAgICAgID09PT09PT09PT0KKyAgICAjICAgICAgIE5CICAgICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBEdXRjaAorICAgICMgICAgICAgTkEgICAgICAgICAgICAgIEVuZ2xpc2gvRnJlbmNoICAgICAgICAgIEZpbm5pc2gKKyAgICAjICAgICAgIFRSSU0gICAgICAgICAgICBGcmVuY2ggICAgICAgICAgICAgICAgICBFbmdsaXNoCisgICAgIyAgICAgICBESUEgICAgICAgICAgICAgU3BhbmlzaC9Qb3J0dWd1ZXNlICAgICAgR2VybWFuCisgICAgIworICAgICMgVGhlcmVmb3JlLCBpZiB5b3UgdHJ5IHRvIGdlbmVyYXRlIGEgaGFzaCBvZiBmdW5jdGlvbiBuYW1lcyB0byBzdXBwb3J0IGJvdGgKKyAgICAjIEZyZW5jaCBhbmQgRW5nbGlzaCB0aGVuIHRoZSBmdW5jdGlvbiBUUklNIHdpbGwgYmUgYXNzaWduZWQgdGhlIG1lYW5pbmcgb2YgdGhlCisgICAgIyBmaXJzdCBsYW5ndWFnZSB0aGF0IGRlZmluZXMgaXQsIHdoaWNoIGluIHRoaXMgY2FzZSBpcyBGcmVuY2guIFlvdSBjYW4gZ2V0CisgICAgIyBhcm91bmQgdGhpcyBieSByZW5hbWluZyB0aGUgZnVuY3Rpb24gZm9yIG9uZSBvZiB0aGUgbGFuZ3VhZ2VzIGFuZCBkb2N1bWVudGluZworICAgICMgdGhlIGNoYW5nZSwgZm9yIGV4YW1wbGU6IFRSSU0uRU4gb3IgVFJJTS5GUi4KKyAgICAjCisgICAgIyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgb25seSBwYXJ0aWFsbHkgc29sdmVzIHRoZSBwcm9ibGVtIG9mIGxvY2FsaXNhdGlvbi4KKyAgICAjIFRoZXJlIGFyZSBhbHNvIG51bWJlciBmb3JtYXRzIHRvIGNvbnNpZGVyICgxLjUgPT0gMSw1KSBhbmQgdGhlIGZhY3QgdGhhdCB0aGUKKyAgICAjIGxpc3Qgc2VwYXJhdG9yICIsIiBhbmQgdGhlIGFycmF5IHNlcGFyYXRvciAiOyIgYXJlIGludGVyY2hhbmdlZCBpbiBkaWZmZXJlbnQKKyAgICAjIGxvY2FsZXMuCisgICAgIworICAgICMgVGhlIGxvbmdlc3QgZnVuY3Rpb24gbmFtZSBpcyBMT0kuTk9STUFMRS5TVEFOREFSRC5JTlZFUlNFICgyOSBjaGFycykgZm9sbG93ZWQKKyAgICAjIGJ5IE5PUk0uSkFLQVVNQS5OT1JNSVQuS8TETlQgKDI1IGNoYXJzKS4KKyAgICAjIFRoZSBzaG9ydGVzdCBmdW5jdGlvbiBuYW1lIGluIGFsbCBsYW5ndWFnZXMgaXMgVC4KKyAgICAjCisgICAgIworICAgICMgcmV2ZXJzZSgnqScpOyBKb2huIE1jTmFtYXJhLCBNYXJjaCAyMDAxLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyAgICAjCisgICAgCisgICAgCisgICAgCisgICAgdXNlIHN0cmljdDsKKyAgICAKKyAgICAKKyAgICAjCisgICAgIyBNb2RpZnkgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgdG8gYWRkIHRoZSBsYW5ndWFnZSB0byB0aGUgZnVuY3Rpb24gbmFtZSBoYXNoCisgICAgIworICAgIG15ICRlbmdsaXNoICAgID0gMTsKKyAgICBteSAkZ2VybWFuICAgICA9IDA7CisgICAgbXkgJGZyZW5jaCAgICAgPSAwOworICAgIG15ICRzcGFuaXNoICAgID0gMDsKKyAgICBteSAkcG9ydHVndWVzZSA9IDA7CisgICAgbXkgJGR1dGNoICAgICAgPSAwOworICAgIG15ICRmaW5uaXNoICAgID0gMDsKKyAgICBteSAkaXRhbGlhbiAgICA9IDA7CisgICAgbXkgJHN3ZWRpc2ggICAgPSAwOworICAgIAorICAgIG15ICVmdW5jczsKKyAgICAKKyAgICAjIElnbm9yZSB0aGUgaGVhZGluZ3MKKyAgICA8REFUQT47CisgICAgCisgICAgIyBQcmludCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBoYXNoIGRlZmluaXRpb24KKyAgICBwcmludCAiICAgICVmdW5jdGlvbnMgID0gKFxuIjsKKyAgICBwcmludCAiICAgICAgICAjIiAuICIgIiB4IDM3IDsKKyAgICBwcmludCAicHRnICBhcmdzICBjbGFzcyAgdm9sXG4iOworICAgIAorICAgIHdoaWxlICg8REFUQT4peworICAgICAgICBteSBARiA9IHNwbGl0ICIgIjsKKyAgICAgICAgbXkgJHZhbHVlID0gJEZbMF07CisgICAgICAgIG15ICRhcmdzICA9ICRGWzFdOworICAgICAgICBteSAkcmVmICAgPSAkRlsyXTsKKyAgICAgICAgbXkgJHZvbCAgID0gJEZbM107CisgICAgCisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzRdLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJGVuZ2xpc2g7CisgICAgICAgIHByaW50X2Z1bmN0aW9uKCRGWzVdLCAgJHZhbHVlLCAkYXJncywgJHJlZiwgJHZvbCkgaWYgJGdlcm1hbjsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbNl0sICAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZnJlbmNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls3XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRzcGFuaXNoOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls4XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRwb3J0dWd1ZXNlOworICAgICAgICBwcmludF9mdW5jdGlvbigkRls5XSwgICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpIGlmICRkdXRjaDsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTBdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkZmlubmlzaDsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTFdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkaXRhbGlhbjsKKyAgICAgICAgcHJpbnRfZnVuY3Rpb24oJEZbMTJdLCAkdmFsdWUsICRhcmdzLCAkcmVmLCAkdm9sKSBpZiAkc3dlZGlzaDsKKyAgICB9CisgICAgIyBQcmludCB0aGUgZW5kIG9mIHRoZSBoYXNoIGRlZmluaXRpb24KKyAgICBwcmludCAiICAgICk7XG4iOworICAgIAorICAgIAorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBGdW5jdGlvbiB0byBwcmludCB0aGUgZnVuY3Rpb24gbmFtZXMuIEl0IHByaW50cyBhIHdhcm5pbmcgaWYgdGhlcmUgaXMgYQorICAgICMgY2xhc2guCisgICAgIworICAgIHN1YiBwcmludF9mdW5jdGlvbiB7CisgICAgCisgICAgICAgIG15ICRmdW5jICA9IHNoaWZ0OworICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKKyAgICAgICAgbXkgJGFyZ3MgID0gc2hpZnQ7CisgICAgICAgIG15ICRyZWYgICA9IHNoaWZ0OworICAgICAgICBteSAkdm9sICAgPSBzaGlmdDsKKyAgICAKKyAgICAgICAgJGZ1bmMgPSAiJyRmdW5jJyI7CisgICAgCisgICAgICAgIGlmIChub3QgZXhpc3RzICRmdW5jc3skZnVuY30pIHsKKyAgICAgICAgICAgIHByaW50ZigiICAgICAgICAlLTMxcyA9PiBbJTRkLCAlNGQsICU0ZCwgJTRkIF0sXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMsICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpOworICAgICAgICAgICAgJGZ1bmNzeyRmdW5jfSA9ICR2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgkZnVuY3N7JGZ1bmN9ICE9ICR2YWx1ZSkgeworICAgICAgICAgICAgICAgIHByaW50ICIgICAgICAgICMgV2FybmluZyAiOworICAgICAgICAgICAgICAgIHByaW50ICRmdW5jLCAiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBhbm90aGVyIGxhbmd1YWdlXG4iOworICAgICAgICAgICAgICAgIHByaW50ZigiICAgICAgICAjJS0zMXMgPT4gWyU0ZCwgJTRkLCAlNGQsICU0ZCBdLFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZ1bmMsICR2YWx1ZSwgJGFyZ3MsICRyZWYsICR2b2wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIAorICAgICMgTm90ZTogVGhlIGZvbGxvd2luZyBkYXRhIGNvbnRhaW5zIHRoZSBmdW5jdGlvbiBuYW1lcyBpbiB0aGUgdmFyaW91cworICAgICMgbGFuZ3VhZ2VzLiBUaGVzZSBsaW5lcyBhcmUgTE9ORy4KKyAgICAKKyAgICBfX0RBVEFfXworICAgIFZhbHVlICAgQXJncyAgICBSZWZjbGFzcyAgIFZvbGF0aWxlICAgRW5nbGlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXJtYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZW5jaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhbmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0dWd1ZXNlICAgICAgICAgICAgICAgICAgICAgICAgIER1dGNoICAgICAgICAgICAgICAgICAgICAgICAgRmlubmlzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGFsaWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3ZWRpc2gKKyAgICAwICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5aQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVC5O2k0gICAgICAgICAgICAgICAgICAgICAgICAgICBBQU5UQUwgICAgICAgICAgICAgICAgICAgICAgIExBU0tFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEEuTlVNRVJJICAgICAgICAgICAgICAgICAgICAgICBBTlRBTAorICAgIDEgICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRU5OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUyAgICAgICAgICAgICAgICAgICAgICAgICAgSk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NCisgICAgMiAgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU05BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVE5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU05PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMkuTsNPLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgSVNOQiAgICAgICAgICAgICAgICAgICAgICAgICBPTlBVVVRUVVUgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5OT04uRElTUCAgICAgICAgICAgICAgICAgICAgICAgxFJTQUtOQUQKKyAgICAzICAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNURkVITEVSICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RFUlJFVVIgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgyUVSUk9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0ZPVVQgICAgICAgICAgICAgICAgICAgICAgIE9OVklSSEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLkVSUk9SRSAgICAgICAgICAgICAgICAgICAgICAgICDEUkZFTAorICAgIDQgICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT01BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTSAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT01NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1BCisgICAgNSAgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBBVkVSQUdFICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JVFRFTFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9NRURJTyAgICAgICAgICAgICAgICAgICAgICAgICAgIE3JRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VNSURERUxERSAgICAgICAgICAgICAgICAgICBLRVNLSUFSVk8gICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVERUwKKyAgICA2ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTc1OSU1PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4gICAgICAgICAgICAgICAgICAgICAgICAgIE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU4KKyAgICA3ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTcFYSU1PICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVggICAgICAgICAgICAgICAgICAgICAgICAgIE1BS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVgKKyAgICA4ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFJPVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkVJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUdORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUogICAgICAgICAgICAgICAgICAgICAgICAgIFJJVkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklGLlJJR0EgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUQKKyAgICA5ICAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPTFVNTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBTFRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPTk5FICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFVNTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0xPTSAgICAgICAgICAgICAgICAgICAgICAgIFNBUkFLRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklGLkNPTE9OTkEgICAgICAgICAgICAgICAgICAgICAgICBLT0xVTU4KKyAgICAxMCAgICAgICAwICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTsNPLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgICBOQiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVVVRUVVUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9OLkRJU1AgICAgICAgICAgICAgICAgICAgICAgICAgICBTQUtOQVMKKyAgICAxMSAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5QViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSFcgICAgICAgICAgICAgICAgICAgICAgICAgIE5OQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVROVVbEUkRFCisgICAgMTIgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVERFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQUJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUNBUlRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICBERVNWRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZQQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RERVYgICAgICAgICAgICAgICAgICAgICAgICBLRVNLSUhBSk9OVEEgICAgICAgICAgICAgICAgICAgICAgIERFVi5TVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1REQVYKKyAgICAxMyAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERPTExBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PTkVEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9FREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVUxERU4gICAgICAgICAgICAgICAgICAgICAgIFZBTFVVVFRBICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVVEEKKyAgICAxNCAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJWEVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVFhUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ0lNQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGLk7aTS5ERUMgICAgICAgICAgICAgICAgICAgICAgICBWQVNUICAgICAgICAgICAgICAgICAgICAgICAgIEtJSU5URcQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVNUVEFMCisgICAgMTUgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOICAgICAgICAgICAgICAgICAgICAgICAgICBTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lOCisgICAgMTYgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TICAgICAgICAgICAgICAgICAgICAgICAgICBDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TCisgICAgMTcgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOICAgICAgICAgICAgICAgICAgICAgICAgICBUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOCisgICAgMTggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTiAgICAgICAgICAgICAgICAgICAgICBBVEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOCisgICAgMTkgICAgICAgMCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJLkdSRUNPICAgICAgICAgICAgICAgICAgICAgICAgICAgUEkKKyAgICAyMCAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNRUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1VSWkVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQUNJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBSVogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFJWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JURUwgICAgICAgICAgICAgICAgICAgICAgIE5FTEnWSlVVUkkgICAgICAgICAgICAgICAgICAgICAgICAgUkFEUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBST1QKKyAgICAyMSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAgICAgICAgICAgICAgICAgICAgICAgICAgIEVLU1BPTkVOVFRJICAgICAgICAgICAgICAgICAgICAgICAgRVhQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFAKKyAgICAyMiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTiAgICAgICAgICAgICAgICAgICAgICAgICAgIExVT05OTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTgorICAgIDIzICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwICAgICAgICAgICAgICAgICAgICAgICAgTE9HMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRzEwCisgICAgMjQgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTICAgICAgICAgICAgICAgICAgICAgICAgICBJVFNFSVNBUlZPICAgICAgICAgICAgICAgICAgICAgICAgIEFTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTCisgICAgMjUgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTlpaQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URUdFUiAgICAgICAgICAgICAgICAgICAgICBLT0tPTkFJU0xVS1UgICAgICAgICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVMVEFMCisgICAgMjYgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBTSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZPUlpFSUNIRU4gICAgICAgICAgICAgICAgICAgICAgICAgU0lHTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSUdOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TLk5FRyAgICAgICAgICAgICAgICAgICAgICBFVFVNRVJLS0kgICAgICAgICAgICAgICAgICAgICAgICAgIFNFR05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVDS0VOCisgICAgMjcgICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST05ESSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQVIgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUZST05ERU4gICAgICAgICAgICAgICAgICAgICBQWdZSSVNUxCAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUk9UT05EQSAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSVU5EQQorICAgIDI4ICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTE9PS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJXRUlTICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ0hFUkNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgQlVTQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpPRUtFTiAgICAgICAgICAgICAgICAgICAgICAgSEFLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJDQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVEFVUFAKKyAgICAyOSAgICAgIC0xICAgICAgMCAgICAgICAgICAxICAgICAgICAgIElOREVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgzU5ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWCAgICAgICAgICAgICAgICAgICAgICAgIElOREVLU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRFWAorICAgIDMwICAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkVQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSUVERVJIT0xFTiAgICAgICAgICAgICAgICAgICAgICAgIFJFUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQRVRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBFVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFUkhBTElORyAgICAgICAgICAgICAgICAgICAgVE9JU1RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSVBFVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUAorICAgIDMxICAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUlMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhUUkFFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFQuVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgIERFRUwgICAgICAgICAgICAgICAgICAgICAgICAgUE9JTUkuVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICBTVFJJTkdBLkVTVFJBSSAgICAgICAgICAgICAgICAgICAgIEVYVEVYVAorICAgIDMyICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMxE5HRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEFSR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBO2k0uQ0FSQUNUICAgICAgICAgICAgICAgICAgICAgICAgIExFTkdURSAgICAgICAgICAgICAgICAgICAgICAgUElUVVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVU5HSEVaWkEgICAgICAgICAgICAgICAgICAgICAgICAgIEzETkdECisgICAgMzMgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FBUkRFICAgICAgICAgICAgICAgICAgICAgICBBUlZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVE5VTQorICAgIDM0ICAgICAgIDAgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFJVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZSQUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSREFERVJPICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJEQURFSVJPICAgICAgICAgICAgICAgICAgICAgICAgIFdBQVIgICAgICAgICAgICAgICAgICAgICAgICAgVE9TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTlQKKyAgICAzNSAgICAgICAwICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQVVYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTldBQVIgICAgICAgICAgICAgICAgICAgICAgIEVQxFRPU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTS1QKKyAgICAzNiAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQ0gKKyAgICAzNyAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTExFUgorICAgIDM4ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOSUNIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOw08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JRVQgICAgICAgICAgICAgICAgICAgICAgICAgRUkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDS0UKKyAgICAzOSAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE1PRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFU0lEVU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUICAgICAgICAgICAgICAgICAgICAgICAgIEpBS09KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVTVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVNUCisgICAgNDAgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEQ09VTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCQU5aQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgQkROQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRENPTlRBUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEQ09OVEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgREJBQU5UQUwgICAgICAgICAgICAgICAgICAgICBUTEFTS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLkNPTlRBLk5VTUVSSSAgICAgICAgICAgICAgICAgICAgREFOVEFMCisgICAgNDEgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEU1VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1VNTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRTT01NRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFNVTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEU09NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTT00gICAgICAgICAgICAgICAgICAgICAgICBUU1VNTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLlNPTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgRFNVTU1BCisgICAgNDIgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEQVZFUkFHRSAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUlUVEVMV0VSVCAgICAgICAgICAgICAgICAgICAgICAgQkRNT1lFTk5FICAgICAgICAgICAgICAgICAgICAgICAgICBCRFBST01FRElPICAgICAgICAgICAgICAgICAgICAgICAgIEJETclESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJHRU1JRERFTERFICAgICAgICAgICAgICAgICBUS0VTS0lBUlZPICAgICAgICAgICAgICAgICAgICAgICAgIERCLk1FRElBICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1FREVMCisgICAgNDMgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBETUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETc1OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJNSU4gICAgICAgICAgICAgICAgICAgICAgICBUTUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCLk1JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE1JTgorICAgIDQ0ICAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRE1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQk1BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETUFYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRNQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRE3BWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTUFYICAgICAgICAgICAgICAgICAgICAgICAgVE1BS1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgIERNQVgKKyAgICA0NSAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERTVERFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJTVERBQlcgICAgICAgICAgICAgICAgICAgICAgICAgICBCREVDQVJUWVBFICAgICAgICAgICAgICAgICAgICAgICAgIEJEREVTVkVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgQkRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNUREVWICAgICAgICAgICAgICAgICAgICAgIFRLRVNLSUhBSk9OVEEgICAgICAgICAgICAgICAgICAgICAgREIuREVWLlNUICAgICAgICAgICAgICAgICAgICAgICAgICBEU1REQVYKKyAgICA0NiAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFOWiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5TCisgICAgNDcgICAgICAgMyAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBEVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCVkFSSUFOWiAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSRVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgREJWQVIgICAgICAgICAgICAgICAgICAgICAgICBUVkFSSUFOU1NJICAgICAgICAgICAgICAgICAgICAgICAgIERCLlZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFZBUklBTlMKKyAgICA0OCAgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURUtTVCAgICAgICAgICAgICAgICAgICAgICAgIFRFS1NUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVhUCisgICAgNDkgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMSU5FU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJPSVRFUkVHICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RJTUFDSU9OLkxJTkVBTCAgICAgICAgICAgICAgICAgIFBST0ouTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgTElKTlNDSCAgICAgICAgICAgICAgICAgICAgICBMSU5SRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR1IuTElOICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHUgorICAgIDUwICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgVFJFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTkRBTkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVOREVOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICBURU5Eyk5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgIFRSRU5EICAgICAgICAgICAgICAgICAgICAgICAgU1VVTlRBVVMgICAgICAgICAgICAgICAgICAgICAgICAgICBURU5ERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSRU5ECisgICAgNTEgICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMT0dFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJLUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HUkVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RJTUFDSU9OLkxPR0FSSVRNSUNBICAgICAgICAgICAgIFBST0ouTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HU0NIICAgICAgICAgICAgICAgICAgICAgICBMT0dSRUdSICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR1IuTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQUkVHUgorICAgIDUyICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgR1JPV1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIENST0lTU0FOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFQ0lNSUVOVE8gICAgICAgICAgICAgICAgICAgICAgICBDUkVTQ0lNRU5UTyAgICAgICAgICAgICAgICAgICAgICAgIEdST0VJICAgICAgICAgICAgICAgICAgICAgICAgS0FTVlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUkVTQ0lUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUFRSRU5ECisgICAgNTYgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFcgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVWxFJERQorICAgIDU3ICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRXICAgICAgICAgICAgICAgICAgICAgICAgICAgVFVMRVZBLkFSVk8gICAgICAgICAgICAgICAgICAgICAgICBWQUwuRlVUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMVVRWxFJERQorICAgIDU4ICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTlBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaWlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOUEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5QRVIgICAgICAgICAgICAgICAgICAgICAgICAgTkpBS1NPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU0uUkFURSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUklPREVSCisgICAgNTkgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJNWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBHVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtTVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVUQUxOSU5HCisgICAgNjAgICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBSQVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpJTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFVWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBWEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVOVEUgICAgICAgICAgICAgICAgICAgICAgICBLT1JLTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBU1NPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUsROVEEKKyAgICA2MSAgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1JUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUUlLViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUklNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVRJUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSVIgICAgICAgICAgICAgICAgICAgICAgICAgIE1TSVPESU5FTiAgICAgICAgICAgICAgICAgICAgICAgICAgVElSLlZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RJUgorICAgIDYyICAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgSVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJS1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lTxElORU4uS09SS08gICAgICAgICAgICAgICAgICAgICBUSVIuQ09TVCAgICAgICAgICAgICAgICAgICAgICAgICAgIElSCisgICAgNjMgICAgICAgMCAgICAgIDEgICAgICAgICAgMSAgICAgICAgICBSQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpVRkFMTFNaQUhMICAgICAgICAgICAgICAgICAgICAgICAgQUxFQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTEVBVE9SSU8gICAgICAgICAgICAgICAgICAgICAgICAgIEFMRUFU01JJTyAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTEVDVCAgICAgICAgICAgICAgICAgICAgICBTQVRVTk5BSVNMVUtVICAgICAgICAgICAgICAgICAgICAgIENBU1VBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xVTVAKKyAgICA2NCAgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIE1BVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSR0xFSUNIICAgICAgICAgICAgICAgICAgICAgICAgICBFUVVJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSU5DSURJUiAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJHRUxJSktFTiAgICAgICAgICAgICAgICAgIFZBU1RJTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORlJPTlRBICAgICAgICAgICAgICAgICAgICAgICAgICBQQVNTQQorICAgIDY1ICAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREFURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkVDSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNICAgICAgICAgICAgICAgICAgICAgICAgUMRJVsRZUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVFVNCisgICAgNjYgICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0hPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElKRCAgICAgICAgICAgICAgICAgICAgICAgICBBSUtBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SQVJJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0xPQ0tTTEFHCisgICAgNjcgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEQVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHICAgICAgICAgICAgICAgICAgICAgICAgICBQxElWxCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJT1JOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHCisgICAgNjggICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBNT05USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PTkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9JUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE3KUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFBTkQgICAgICAgICAgICAgICAgICAgICAgICBLVVVLQVVTSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTcVOQUQKKyAgICA2OSAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFlFQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFIUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk5FRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEHRTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQUFSICAgICAgICAgICAgICAgICAgICAgICAgIFZVT1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDFUgorICAgIDcwICAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgV0VFS0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT0NIRU5UQUcgICAgICAgICAgICAgICAgICAgICAgICAgIEpPVVJTRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRElBU0VNICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEuREEuU0VNQU5BICAgICAgICAgICAgICAgICAgICAgIFdFRUtEQUcgICAgICAgICAgICAgICAgICAgICAgVklJS09OUMRJVsQgICAgICAgICAgICAgICAgICAgICAgICBHSU9STk8uU0VUVElNQU5BICAgICAgICAgICAgICAgICAgIFZFQ0tPREFHCisgICAgNzEgICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBIT1VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUVU5ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVVUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVSICAgICAgICAgICAgICAgICAgICAgICAgICBUVU5OSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElNTUUKKyAgICA3MiAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE1JTlVURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVVQgICAgICAgICAgICAgICAgICAgICAgIE1JTlVVVElUICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VVAorICAgIDczICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0VDT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUtVTkRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09OREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VHVU5ETyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUdVTkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ09OREUgICAgICAgICAgICAgICAgICAgICAgU0VLVU5OSVQgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRPICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFS1VORAorICAgIDc0ICAgICAgIDAgICAgICAxICAgICAgICAgIDEgICAgICAgICAgTk9XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKRVRaVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSU5URU5BTlQgICAgICAgICAgICAgICAgICAgICAgICAgQUhPUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBR09SQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VICAgICAgICAgICAgICAgICAgICAgICAgICAgTllUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBREVTU08gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VCisgICAgNzUgICAgICAgMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBBUkVBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFUkVJQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgWk9ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkVBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIMFSRUFTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVSRUlLRU4gICAgICAgICAgICAgICAgICAgICBBTFVFRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01SxURFTgorICAgIDc2ICAgICAgIDEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgUk9XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUlMRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJR05FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMQVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJJSkVOICAgICAgICAgICAgICAgICAgICAgICAgUklWSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUdIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBREVSCisgICAgNzcgICAgICAgMSAgICAgIDAgICAgICAgICAgMSAgICAgICAgICBDT0xVTU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQQUxURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT05ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xVTU5BUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09MT01NRU4gICAgICAgICAgICAgICAgICAgICBTQVJBS0tFRVQgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9OTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09MVU1ORVIKKyAgICA3OCAgICAgIC0xICAgICAgMCAgICAgICAgICAxICAgICAgICAgIE9GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVSRUlDSC5WRVJTQ0hJRUJFTiAgICAgICAgICAgICAgICBERUNBTEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1JFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJTQ0hVSVZJTkcgICAgICAgICAgICAgICAgIFNJSVJUWU3EICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NBUlRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG1lJTS0pVVE5JTkcKKyAgICA4MiAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNFQVJDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VDSEVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVSQ0hFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTExBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9DQUxJWkFSICAgICAgICAgICAgICAgICAgICAgICAgICBWSU5ELlNQRUMgICAgICAgICAgICAgICAgICAgIEvEWS5MxFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgUklDRVJDQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBT1ksKKyAgICA4MyAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRSQU5TUE9TRSAgICAgICAgICAgICAgICAgICAgICAgICAgTVRSQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPU0UgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQU5TUE9ORVIgICAgICAgICAgICAgICAgICAgICAgICAgVFJBTlNQT1IgICAgICAgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPTkVSRU4gICAgICAgICAgICAgICAgIFRSQU5TUE9OT0kgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUi5UUkFTUE9TVEEgICAgICAgICAgICAgICAgICAgICBUUkFOU1BPTkVSQQorICAgIDg2ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElQTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUgICAgICAgICAgICAgICAgICAgICAgICAgVFlZUFBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVBPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFbEUkRFVFlQCisgICAgOTcgICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU4yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTjIgICAgICAgICAgICAgICAgICAgICBBVEFOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTi4yICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOMgorICAgIDk4ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQVNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dTSU4gICAgICAgICAgICAgICAgICAgICAgQVNJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTgorICAgIDk5ICAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dDT1MgICAgICAgICAgICAgICAgICAgICAgQUNPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ0NPUworICAgIDEwMCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0hPT1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIT0lTSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxFR0lSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0NPTEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIEtJRVpFTiAgICAgICAgICAgICAgICAgICAgICAgVkFMSVRTRS5JTkRFS1NJICAgICAgICAgICAgICAgICAgICBTQ0VHTEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFbETEoKKyAgICAxMDEgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEhMT09LVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1ZFUldFSVMgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIRVJDSEVIICAgICAgICAgICAgICAgICAgICAgICAgIEJVU0NBUkggICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JJWi5aT0VLRU4gICAgICAgICAgICAgICAgIFZIQUtVICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VSQ0EuT1JJWlogICAgICAgICAgICAgICAgICAgICAgICBMRVRBS09MVU1OCisgICAgMTAyICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBWTE9PS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNWRVJXRUlTICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSEVSQ0hFViAgICAgICAgICAgICAgICAgICAgICAgICBCVVNDQVJWICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkVSVC5aT0VLRU4gICAgICAgICAgICAgICAgICBQSEFLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFUkNBLlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgTEVUQVJBRAorICAgIDEwNSAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgSVNSRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RCRVpVRyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVFJFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNSRUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDJUkVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTVkVSV0lKWklORyAgICAgICAgICAgICAgICAgT05WSUlUVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuUklGICAgICAgICAgICAgICAgICAgICAgICAgICAgIMRSUkVGCisgICAgMTA5ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HCisgICAgMTExICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBDSEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSUNIRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQVJBQ1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUkFDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVLRU4gICAgICAgICAgICAgICAgICAgICAgICBNRVJLS0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRElDRS5DQVJBVFQgICAgICAgICAgICAgICAgICAgICAgVEVDS0VOS09ECisgICAgMTEyICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT1dFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMRUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVVNDVUxFICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5VU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTtpTQ1VMQSAgICAgICAgICAgICAgICAgICAgICAgICAgS0xFSU5FLkxFVFRFUlMgICAgICAgICAgICAgICBQSUVORVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VNRU5FUgorICAgIDExMyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgVVBQRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUk9TUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSlVTQ1VMRSAgICAgICAgICAgICAgICAgICAgICAgICAgTUFZVVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUnaU0NVTEEgICAgICAgICAgICAgICAgICAgICAgICAgIEhPT0ZETEVUVEVSUyAgICAgICAgICAgICAgICAgSVNPVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUlVU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZFUlNBTEVSCisgICAgMTE0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBQUk9QRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdST1NTMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9NUFJPUFJFICAgICAgICAgICAgICAgICAgICAgICAgICBOT01QUk9QSU8gICAgICAgICAgICAgICAgICAgICAgICAgIFBSSS5NQUnaU0NVTEEgICAgICAgICAgICAgICAgICAgICAgQkVHSU5MRVRURVJTICAgICAgICAgICAgICAgICBFUklTTklNSSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSVVTQy5JTklaICAgICAgICAgICAgICAgICAgICAgICAgSU5JVElBTAorICAgIDExNSAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBVUNIRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVpRVUlFUkRBICAgICAgICAgICAgICAgICAgICAgICAgICBFU1FVRVJEQSAgICAgICAgICAgICAgICAgICAgICAgICAgIExJTktTICAgICAgICAgICAgICAgICAgICAgICAgVkFTRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU5JU1RSQSAgICAgICAgICAgICAgICAgICAgICAgICAgIFbETlNURVIKKyAgICAxMTYgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDSFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk9JVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUkVDSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElSRUlUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNIVFMgICAgICAgICAgICAgICAgICAgICAgIE9JS0VBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVFJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBI1kdFUgorICAgIDExNyAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgRVhBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVOVElTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgIEVYQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUdVQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWEFUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTElKSyAgICAgICAgICAgICAgICAgICAgICAgVkVSVEFBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREVOVElDTyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYQUtUCisgICAgMTE4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUUklNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMxFRURU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQUFJFU1BBQ0UgICAgICAgICAgICAgICAgICAgICAgICBFU1BBQ0lPUyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUlVNQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BBVElFUy5XSVNTRU4gICAgICAgICAgICAgICBQT0lTVEEuVsRMSVQgICAgICAgICAgICAgICAgICAgICAgIEFOTlVMTEEuU1BBWkkgICAgICAgICAgICAgICAgICAgICAgUkVOU0EKKyAgICAxMTkgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJFUExBQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVJTRVRaRU4gICAgICAgICAgICAgICAgICAgICAgICAgICBSRU1QTEFDRVIgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRU1QTEFaQVIgICAgICAgICAgICAgICAgICAgICAgICAgTVVEQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRVJWQU5HRU4gICAgICAgICAgICAgICAgICAgIEtPUlZBQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUklNUElBWlpBICAgICAgICAgICAgICAgICAgICAgICAgICBFUlPEVFQKKyAgICAxMjAgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNVQlNUSVRVVEUgICAgICAgICAgICAgICAgICAgICAgICAgV0VDSFNFTE4gICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVElUVUUgICAgICAgICAgICAgICAgICAgICAgICAgIFNVU1RJVFVJUiAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RJVFVJUiAgICAgICAgICAgICAgICAgICAgICAgICBTVUJTVElUVUVSRU4gICAgICAgICAgICAgICAgIFZBSUhEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09TVElUVUlTQ0kgICAgICAgICAgICAgICAgICAgICAgICBCWVQuVVQKKyAgICAxMjEgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRElHTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ9NESUdPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0RFICAgICAgICAgICAgICAgICAgICAgICAgIEtPT0RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ESUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLT0QKKyAgICAxMjQgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOREVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9VVkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09OVFJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ1VSQVIgICAgICAgICAgICAgICAgICAgICAgICAgICBWSU5ELkFMTEVTICAgICAgICAgICAgICAgICAgIEVUU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJPVkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISVRUQQorICAgIDEyNSAgICAgLTEgICAgICAwICAgICAgICAgIDEgICAgICAgICAgQ0VMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaRUxMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTExVTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDyUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTCAgICAgICAgICAgICAgICAgICAgICAgICAgU09MVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRUxMQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTEwKKyAgICAxMjYgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNURkVITCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RFUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTRVJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgyUVSUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0ZPVVQyICAgICAgICAgICAgICAgICAgICAgIE9OVklSSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLkVSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICDEUkYKKyAgICAxMjcgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUVEVYVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1RURVhURSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgyVRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RFS1NUICAgICAgICAgICAgICAgICAgICAgIE9OVEVLU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLlRFU1RPICAgICAgICAgICAgICAgICAgICAgICAgICDEUlRFWFQKKyAgICAxMjggICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIElTTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNUWkFITCAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU1ROVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgyU7aTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU0dFVEFMICAgICAgICAgICAgICAgICAgICAgIE9OTFVLVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMLk5VTUVSTyAgICAgICAgICAgICAgICAgICAgICAgICDEUlRBTAorICAgIDEyOSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVNCTEFOSyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU1RMRUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTVFZJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNCTEFOQ08gICAgICAgICAgICAgICAgICAgICAgICAgICDJQ8lMLlZBWklBICAgICAgICAgICAgICAgICAgICAgICAgIElTTEVFRyAgICAgICAgICAgICAgICAgICAgICAgT05UWUhKxCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUwuVlVPVE8gICAgICAgICAgICAgICAgICAgICAgICAgIMRSVE9NCisgICAgMTMwICAgICAgMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVAorICAgIDEzMSAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4KKyAgICAxNDAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERBVEVWQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgREFUV0VSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRFVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZFQ0hBTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgREFUQS5WQUxPUiAgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTVdBQVJERSAgICAgICAgICAgICAgICAgIFDESVbEWVNBUlZPICAgICAgICAgICAgICAgICAgICAgICAgREFUQS5WQUxPUkUgICAgICAgICAgICAgICAgICAgICAgICBEQVRVTVbEUkRFCisgICAgMTQxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU1FVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgIFpFSVRXRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVNUFNWQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1JBTlVNRVJPICAgICAgICAgICAgICAgICAgICAgICAgIFZBTE9SLlRFTVBPICAgICAgICAgICAgICAgICAgICAgICAgVElKRFdBQVJERSAgICAgICAgICAgICAgICAgICBBSUtBX0FSVk8gICAgICAgICAgICAgICAgICAgICAgICAgIE9SQVJJTy5WQUxPUkUgICAgICAgICAgICAgICAgICAgICAgVElEVsRSREUKKyAgICAxNDIgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU9STElOICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFBEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU4uQUZTQ0hSICAgICAgICAgICAgICAgICAgIFNUUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JULkNPU1QgICAgICAgICAgICAgICAgICAgICAgICBMSU5BVlNLUgorICAgIDE0MyAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZRCAgICAgICAgICAgICAgICAgICAgICAgICAgVlVPU0lQT0lTVE8gICAgICAgICAgICAgICAgICAgICAgICBBTU1PUlQuQU5OVU8gICAgICAgICAgICAgICAgICAgICAgIMVSU0FWU0tSCisgICAgMTQ0ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRERCICAgICAgICAgICAgICAgICAgICAgICAgICBEREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTU9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVHQVZTS1IKKyAgICAxNDggICAgIC0xICAgICAgMSAgICAgICAgICAxICAgICAgICAgIElORElSRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFS1QgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSRUNUTyAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFVE8gICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVDVCAgICAgICAgICAgICAgICAgICAgIEVQxFNVT1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5ESVJFVFRPICAgICAgICAgICAgICAgICAgICAgICAgICBJTkRJUkVLVAorICAgIDE1MCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUZSVUZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPTkNUSU9OLkFQUEVMQU5URSAgICAgICAgICAgICAgICAgTExBTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFNQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPRVBFTiAgICAgICAgICAgICAgICAgICAgICAgS1VUU1UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSUNISUFNQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOUk9QQQorICAgIDE2MiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0xFQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTxFVCRVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVQVVJBR0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElNUElBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSVJBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJU1NFTi5DT05UUk9MICAgICAgICAgICAgICAgU0lJVk9BICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJFUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUxERBCisgICAgMTYzICAgICAgMSAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ERVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVURVJNQVQgICAgICAgICAgICAgICAgICAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFJJWi5ERVRFUk0gICAgICAgICAgICAgICAgICAgICAgREVURVJNSU5BTlRNQVQgICAgICAgICAgICAgICBNREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFIuREVURVJNICAgICAgICAgICAgICAgICAgICAgICAgTURFVEVSTQorICAgIDE2NCAgICAgIDEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgTUlOVkVSU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBNSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkVSU0VNQVQgICAgICAgICAgICAgICAgICAgICAgICAgTUlOVkVSU0EgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRSSVouSU5WRVJTTyAgICAgICAgICAgICAgICAgICAgIElOVkVSU0VNQVQgICAgICAgICAgICAgICAgICAgTUvExE5URUlORU4gICAgICAgICAgICAgICAgICAgICAgICBNQVRSLklOVkVSU0EgICAgICAgICAgICAgICAgICAgICAgIE1JTlZFUlQKKyAgICAxNjUgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIE1NVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU1VTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUlUTUFUICAgICAgICAgICAgICAgICAgICAgICAgIE1NVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUklaLk1VTFQgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUtUTUFUICAgICAgICAgICAgICAgICAgIE1LRVJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUi5QUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICBNTVVMVAorICAgIDE2NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgSVBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBaSU5TWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVFBFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHT0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUEdUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElCRVQgICAgICAgICAgICAgICAgICAgICAgICAgSVBNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUkVTU0kgICAgICAgICAgICAgICAgICAgICAgICAgIFJCRVRBTE5JTkcKKyAgICAxNjggICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0FQWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklOQ1BFUiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBR09QUklOICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBHVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQkVUICAgICAgICAgICAgICAgICAgICAgICAgIFBQTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUC5SQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTU9SVAorICAgIDE2OSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTlpBSEwyICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5CVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05ULlZBTE9SRVMgICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTEFSRyAgICAgICAgICAgICAgICAgICAgTEFTS0UuQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5WQUxPUkkgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMVgorICAgIDE4MyAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUFJPRFVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUtUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVSVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRFVDVE8gICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgVFVMTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0RVS1QKKyAgICAxODQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFLVUxUxFQgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUT1JJQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUNVTFRFSVQgICAgICAgICAgICAgICAgICAgIEtFUlRPTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFUVE9SSUFMRSAgICAgICAgICAgICAgICAgICAgICAgICBGQUtVTFRFVAorICAgIDE4OSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFBST0RVQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlBST0RVS1QgICAgICAgICAgICAgICAgICAgICAgICAgIEJEUFJPRFVJVCAgICAgICAgICAgICAgICAgICAgICAgICAgQkRQUk9EVUNUTyAgICAgICAgICAgICAgICAgICAgICAgICBCRE1VTFRJUEwgICAgICAgICAgICAgICAgICAgICAgICAgIERCUFJPRFVLVCAgICAgICAgICAgICAgICAgICAgVFRVTE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5QUk9ET1RUTyAgICAgICAgICAgICAgICAgICAgICAgIERQUk9EVUtUCisgICAgMTkwICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU05PTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgIElTVEtURVhUICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTk9OVEVYVEUgICAgICAgICAgICAgICAgICAgICAgICBFU05PVEVYVE8gICAgICAgICAgICAgICAgICAgICAgICAgIMkuTsNPLlRFWFRPICAgICAgICAgICAgICAgICAgICAgICAgSVNHRUVOVEVLU1QgICAgICAgICAgICAgICAgICBPTkVJX1RFS1NUSSAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5OT04uVEVTVE8gICAgICAgICAgICAgICAgICAgICAgxFJFSlRFWFQKKyAgICAxOTMgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFNUREVWUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBQldOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0FSVFlQRVAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZFU1RQICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVlBBRFAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERFVlAgICAgICAgICAgICAgICAgICAgICAgIEtFU0tJSEFKT05UQVAgICAgICAgICAgICAgICAgICAgICAgREVWLlNULlBPUCAgICAgICAgICAgICAgICAgICAgICAgICBTVERBVlAKKyAgICAxOTQgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFOWkVOICAgICAgICAgICAgICAgICAgICAgICAgICBWQVIuUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJQICAgICAgICAgICAgICAgICAgICAgICAgIFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSLlBPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQU5TUAorICAgIDE5NSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRFNUREVWUCAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlNUREFCV04gICAgICAgICAgICAgICAgICAgICAgICAgIEJERUNBUlRZUEVQICAgICAgICAgICAgICAgICAgICAgICAgQkRERVNWRVNUUCAgICAgICAgICAgICAgICAgICAgICAgICBCRERFU1ZQQSAgICAgICAgICAgICAgICAgICAgICAgICAgIERCU1RERVZQICAgICAgICAgICAgICAgICAgICAgVEtFU0tJSEFKT05UQVAgICAgICAgICAgICAgICAgICAgICBEQi5ERVYuU1QuUE9QICAgICAgICAgICAgICAgICAgICAgIERTVERBVlAKKyAgICAxOTYgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJWQVJJQU5aRU4gICAgICAgICAgICAgICAgICAgICAgICBCRFZBUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVkFSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWQVJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQlZBUlAgICAgICAgICAgICAgICAgICAgICAgIFRWQVJJQU5TU0lQICAgICAgICAgICAgICAgICAgICAgICAgREIuVkFSLlBPUCAgICAgICAgICAgICAgICAgICAgICAgICBEVkFSSUFOU1AKKyAgICAxOTcgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRSVU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS9xSWkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUk9OUVVFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVU5DQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVTkNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRUhFRUwgICAgICAgICAgICAgICAgICAgICAgIEtBVEtBSVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJPTkNBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVktPUlRBCisgICAgMTk4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBJU0xPR0lDQUwgICAgICAgICAgICAgICAgICAgICAgICAgIElTVExPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVNUTE9HSVFVRSAgICAgICAgICAgICAgICAgICAgICAgICBFU0xPR0lDTyAgICAgICAgICAgICAgICAgICAgICAgICAgIMlM00dJQ08gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNMT0dJU0NIICAgICAgICAgICAgICAgICAgICBPTlRPVFVVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTC5MT0dJQ08gICAgICAgICAgICAgICAgICAgICAgICAgxFJMT0dJU0sKKyAgICAxOTkgICAgICAzICAgICAgMCAgICAgICAgICAwICAgICAgICAgIERDT1VOVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJBTlpBSEwyICAgICAgICAgICAgICAgICAgICAgICAgICBCRE5CVkFMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEQ09OVEFSQSAgICAgICAgICAgICAgICAgICAgICAgICAgQkRDT05UQVJBICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFBTlRBTEMgICAgICAgICAgICAgICAgICAgIFRMQVNLRUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgREIuQ09OVEEuVkFMT1JJICAgICAgICAgICAgICAgICAgICBEQU5UQUxWCisgICAgMjEyICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST1VORFVQICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRlJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgQVJST05ESS5TVVAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQVIuTUFTICAgICAgICAgICAgICAgICAgICAgIEFSUkVET05EQVIuUEFSQS5DSU1BICAgICAgICAgICAgICAgQUZST05ERU4uTkFBUi5CT1ZFTiAgICAgICAgICBQWdZSSVNUxC5ERVMuWUzWUyAgICAgICAgICAgICAgICAgIEFSUk9UT05EQS5QRVIuRUNDICAgICAgICAgICAgICAgICAgQVZSVU5EQS5VUFDFVAorICAgIDIxMyAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUk9VTkRET1dOICAgICAgICAgICAgICAgICAgICAgICAgICBBQlJVTkRFTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSUk9OREkuSU5GICAgICAgICAgICAgICAgICAgICAgICAgUkVET05ERUFSLk1FTk9TICAgICAgICAgICAgICAgICAgICBBUlJFRE9OREFSLlBBUkEuQkFJWE8gICAgICAgICAgICAgIEFGUk9OREVOLk5BQVIuQkVORURFTiAgICAgICAgUFnWUklTVMQuREVTLkFMQVMgICAgICAgICAgICAgICAgICBBUlJPVE9OREEuUEVSLkRJRiAgICAgICAgICAgICAgICAgIEFWUlVOREEuTkVExVQKKyAgICAyMTYgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFJBTksgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpFUkFSUVVJQSAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HICAgICAgICAgICAgICAgICAgICAgICAgIEFSVk9OLk1VS0FBTiAgICAgICAgICAgICAgICAgICAgICAgUkFOR08gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQU5HCisgICAgMjE5ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFEUkVTU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVNTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVJFQ0NJT04gICAgICAgICAgICAgICAgICAgICAgICAgIEVOREVSRcdPICAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVMgICAgICAgICAgICAgICAgICAgICAgICBPU09JVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORElSSVpaTyAgICAgICAgICAgICAgICAgICAgICAgICAgQURSRVNTCisgICAgMjIwICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBEQVlTMzYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR0UzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSk9VUlMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUFTMzYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQVMzNjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHRU4zNjAgICAgICAgICAgICAgICAgICAgICBQxElWxFQzNjAgICAgICAgICAgICAgICAgICAgICAgICAgIEdJT1JOTzM2MCAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQVIzNjAKKyAgICAyMjEgICAgICAwICAgICAgMSAgICAgICAgICAxICAgICAgICAgIFRPREFZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVVVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVUpPVVJESFVJICAgICAgICAgICAgICAgICAgICAgICAgIEhPWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9KRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQU5EQUFHICAgICAgICAgICAgICAgICAgICAgIFTETcQuUMRJVsQgICAgICAgICAgICAgICAgICAgICAgICAgT0dHSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJREFHCisgICAgMjIyICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRCICAgICAgICAgICAgICAgICAgICAgICAgICBWREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNTU9SVC5WQVIgICAgICAgICAgICAgICAgICAgICAgICAgVkRFR1JBVlNLUgorICAgIDIyNyAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgTUVESUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFOQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBQU4gICAgICAgICAgICAgICAgICAgICAgTUVESUFBTkkgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBTgorICAgIDIyOCAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU1VNUFJPRFVDVCAgICAgICAgICAgICAgICAgICAgICAgICBTVU1NRU5QUk9EVUtUICAgICAgICAgICAgICAgICAgICAgIFNPTU1FUFJPRCAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNQVBST0RVQ1RPICAgICAgICAgICAgICAgICAgICAgICBTT01BUlBST0RVVE8gICAgICAgICAgICAgICAgICAgICAgIFNPTVBST0RVS1QgICAgICAgICAgICAgICAgICAgVFVMT0pFTi5TVU1NQSAgICAgICAgICAgICAgICAgICAgICBNQVRSLlNPTU1BLlBST0RPVFRPICAgICAgICAgICAgICAgIFBST0RVS1RTVU1NQQorICAgIDIyOSAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU5IWVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VOT0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkggICAgICAgICAgICAgICAgICAgICAgICAgU0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTkgKKyAgICAyMzAgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSFlQICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NIICAgICAgICAgICAgICAgICAgICAgICAgIENPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1NICisgICAgMjMxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICBUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFOSAorICAgIDIzMiAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQVNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTSU5IWVAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTSU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNFTk9IICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0VOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0dTSU5IICAgICAgICAgICAgICAgICAgICAgQVNJTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNTRU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1NJTkgKKyAgICAyMzMgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDQ09TSFlQICAgICAgICAgICAgICAgICAgICAgICAgICBBQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNPU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09HQ09TSCAgICAgICAgICAgICAgICAgICAgIEFDT1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDQ09TSCAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUkNDT1NICisgICAgMjM0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTkhZUCAgICAgICAgICAgICAgICAgICAgICAgICAgQVRBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUQU5IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PR1RBTkggICAgICAgICAgICAgICAgICAgICBBVEFOSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSQ1RBTkggICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDVEFOSAorICAgIDIzNSAgICAgIDMgICAgICAwICAgICAgICAgIDAgICAgICAgICAgREdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkFVU1pVRyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJETElSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRFWFRSQUVSICAgICAgICAgICAgICAgICAgICAgICAgICBCREVYVFJBSVIgICAgICAgICAgICAgICAgICAgICAgICAgIERCTEVaRU4gICAgICAgICAgICAgICAgICAgICAgVE5PVURBICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQi5WQUxPUkkgICAgICAgICAgICAgICAgICAgICAgICAgIERIxE1UQQorICAgIDI0NCAgICAgIDEgICAgICAxICAgICAgICAgIDEgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElORk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkZPUk1Bx8NPICAgICAgICAgICAgICAgICAgICAgICAgIElORk8gICAgICAgICAgICAgICAgICAgICAgICAgS1VWQVVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUJJRU5URS5JTkZPICAgICAgICAgICAgICAgICAgICAgIElORk8KKyAgICAyNDcgICAgIC0xICAgICAgMSAgICAgICAgICAwICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0RBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQiAgICAgICAgICAgICAgICAgICAgICAgICAgIERCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1NT1JULkZJU1NPICAgICAgICAgICAgICAgICAgICAgICBEQgorICAgIDI1MiAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgRlJFUVVFTkNZICAgICAgICAgICAgICAgICAgICAgICAgICBIxFVGSUdLRUlUICAgICAgICAgICAgICAgICAgICAgICAgIEZSRVFVRU5DRSAgICAgICAgICAgICAgICAgICAgICAgICAgRlJFQ1VFTkNJQSAgICAgICAgICAgICAgICAgICAgICAgICBGUkVR3MpOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVSVkFMICAgICAgICAgICAgICAgICAgICAgVEFBSlVVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVRVUVOWkEgICAgICAgICAgICAgICAgICAgICAgICAgIEZSRUtWRU5TCisgICAgMjYxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBFUlJPUi5UWVBFICAgICAgICAgICAgICAgICAgICAgICAgIEZFSExFUi5UWVAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRS5FUlJFVVIgICAgICAgICAgICAgICAgICAgICAgICBUSVBPLkRFLkVSUk9SICAgICAgICAgICAgICAgICAgICAgIFRJUE8uRVJSTyAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRS5GT1VUICAgICAgICAgICAgICAgICAgICBWSVJIRUVOLkxBSkkgICAgICAgICAgICAgICAgICAgICAgIEVSUk9SRS5USVBPICAgICAgICAgICAgICAgICAgICAgICAgRkVMLlRZUAorICAgIDI2NyAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUkVHSVNURVIuSUQgICAgICAgICAgICAgICAgICAgICAgICBSRUdJU1RFUi5LRU5OVU1NRVIgICAgICAgICAgICAgICAgIFJFR0lTVFJFLk5VTUVSTyAgICAgICAgICAgICAgICAgICAgSUQuUkVHSVNUUk8gICAgICAgICAgICAgICAgICAgICAgICBJREVOVC5SRUdJU1RSTyAgICAgICAgICAgICAgICAgICAgIFJFR0lTVFJBVElFLklEICAgICAgICAgICAgICAgUkVLSVNURVJJLlRVTk5VUyAgICAgICAgICAgICAgICAgICBJREVOVElGSUNBVE9SRS5SRUdJU1RSTyAgICAgICAgICAgIFJFR0lTVFJFUkEuSUQKKyAgICAyNjkgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIEFWRURFViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlUVEVMQUJXICAgICAgICAgICAgICAgICAgICAgICAgICBFQ0FSVC5NT1lFTiAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZQUk9NICAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVi5NyURJTyAgICAgICAgICAgICAgICAgICAgICAgICBHRU0uREVWSUFUSUUgICAgICAgICAgICAgICAgIEtFU0tJUE9JS0tFQU1BICAgICAgICAgICAgICAgICAgICAgTUVESUEuREVWICAgICAgICAgICAgICAgICAgICAgICAgICBNRURFTEFWVgorICAgIDI3MCAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQkVUQURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5CRVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICBESVNUQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEuVkVSRCAgICAgICAgICAgICAgICAgICAgQkVFVEFKQUtBVU1BICAgICAgICAgICAgICAgICAgICAgICBESVNUUklCLkJFVEEgICAgICAgICAgICAgICAgICAgICAgIEJFVEFG1lJECisgICAgMjcxICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQUxOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BTE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTE5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQU1NQS5MTiAgICAgICAgICAgICAgICAgICAgICAgICAgIExOR0FNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuTE4gICAgICAgICAgICAgICAgICAgICBHQU1NQUxOICAgICAgICAgICAgICAgICAgICAgICAgICAgIExOLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFMTgorICAgIDI3MiAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQkVUQUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRVRBSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEEuSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgICAgRElTVFIuQkVUQS5JTlYgICAgICAgICAgICAgICAgICAgICBCRVRBLkFDVU0uSU5WICAgICAgICAgICAgICAgICAgICAgIEJFVEEuSU5WICAgICAgICAgICAgICAgICAgICAgQkVFVEFKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICBJTlYuQkVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgIEJFVEFJTlYKKyAgICAyNzMgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEJJTk9NRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgQklOT01WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuQklOT01JQUxFICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJCSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBCSU5PTUlBTEUuVkVSRCAgICAgICAgICAgICAgIEJJTk9NSUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5CSU5PTSAgICAgICAgICAgICAgICAgICAgICBCSU5PTUbWUkQKKyAgICAyNzQgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENISURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hJVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuS0hJREVVWCAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkNISSAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVC5RVUkgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEkuS1dBRFJBQVQgICAgICAgICAgICAgICAgIENISUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5DSEkgICAgICAgICAgICAgICAgICAgICAgICBDSEkyRtZSRAorICAgIDI3NSAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ0hJSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtISURFVVguSU5WRVJTRSAgICAgICAgICAgICAgICAgICAgUFJVRUJBLkNISS5JTlYgICAgICAgICAgICAgICAgICAgICBJTlYuUVVJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISS5LV0FEUkFBVC5JTlYgICAgICAgICAgICAgQ0hJSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgICBJTlYuQ0hJICAgICAgICAgICAgICAgICAgICAgICAgICAgIENISTJJTlYKKyAgICAyNzYgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPTUJJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS09NQklOQVRJT05FTiAgICAgICAgICAgICAgICAgICAgICBDT01CSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTUJJTkFUICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01CSU5BVElFUyAgICAgICAgICAgICAgICAgIEtPTUJJTkFBVElPICAgICAgICAgICAgICAgICAgICAgICAgQ09NQklOQVpJT05FICAgICAgICAgICAgICAgICAgICAgICBLT01CSU4KKyAgICAyNzcgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENPTkZJREVOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgS09ORklERU5aICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFUlZBTExFLkNPTkZJQU5DRSAgICAgICAgICAgICAgIElOVEVSVkFMTy5DT05GSUFOWkEgICAgICAgICAgICAgICAgSU5ULkNPTkZJQU7HQSAgICAgICAgICAgICAgICAgICAgICBCRVRST1VXQkFBUkhFSUQgICAgICAgICAgICAgIExVT1RUQU1VU1bETEkgICAgICAgICAgICAgICAgICAgICAgQ09ORklERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICBLT05GSURFTlMKKyAgICAyNzggICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENSSVRCSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICAgS1JJVEJJTk9NICAgICAgICAgICAgICAgICAgICAgICAgICBDUklURVJFLkxPSS5CSU5PTUlBTEUgICAgICAgICAgICAgIEJJTk9NLkNSSVQgICAgICAgICAgICAgICAgICAgICAgICAgQ1JJVC5CSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBDUklULkJJTk9NICAgICAgICAgICAgICAgICAgIEJJTk9NSUpBS0FVTUEuS1JJVCAgICAgICAgICAgICAgICAgQ1JJVC5CSU5PTSAgICAgICAgICAgICAgICAgICAgICAgICBLUklUQklOT00KKyAgICAyNzkgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEVWRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUlSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRE9OREVBLlBBUiAgICAgICAgICAgICAgICAgICAgICAgUEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOICAgICAgICAgICAgICAgICAgICAgICAgIFBBUklMTElORU4gICAgICAgICAgICAgICAgICAgICAgICAgUEFSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKxE1OCisgICAgMjgwICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBFWFBPTkRJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUE9OVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkVYUE9ORU5USUVMTEUgICAgICAgICAgICAgICAgICBESVNUUi5FWFAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RFWFBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQT04uVkVSRCAgICAgICAgICAgICAgICAgICBFS1NQT05FTlRJQUFMSUpBS0FVTUEgICAgICAgICAgICAgIERJU1RSSUIuRVhQICAgICAgICAgICAgICAgICAgICAgICAgRVhQT05G1lJECisgICAgMjgxICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZWRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5GICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi5WRVJERUxJTkcgICAgICAgICAgICAgICAgICBGSkFLQVVNQSAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuRiAgICAgICAgICAgICAgICAgICAgICAgICAgRkbWUkQKKyAgICAyODIgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEZJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZFUlNFLkxPSS5GICAgICAgICAgICAgICAgICAgICAgIERJU1RSLkYuSU5WICAgICAgICAgICAgICAgICAgICAgICAgSU5WRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLklOVkVSU0UgICAgICAgICAgICAgICAgICAgIEZKQUtBVU1BLkvExE5UICAgICAgICAgICAgICAgICAgICAgSU5WLkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSU5WCisgICAgMjgzICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSICAgICAgICAgICAgICAgICAgICAgICBGSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSCisgICAgMjg0ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGSVNIRVJJTlYgICAgICAgICAgICAgICAgICAgICAgICAgIEZJU0hFUklOViAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSLklOVkVSU0UgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuRklTSEVSLklOViAgICAgICAgICAgICAgICAgIEZJU0hFUklOViAgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSLklOViAgICAgICAgICAgICAgICAgICBGSVNIRVIuS8TETlQgICAgICAgICAgICAgICAgICAgICAgIElOVi5GSVNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgRklTSEVSSU5WCisgICAgMjg1ICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBGTE9PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOVEVSR1JFTlpFICAgICAgICAgICAgICAgICAgICAgICAgUExBTkNIRVIgICAgICAgICAgICAgICAgICAgICAgICAgICBNVUxUSVBMTy5JTkZFUklPUiAgICAgICAgICAgICAgICAgIEFSUkVETVVMVEIgICAgICAgICAgICAgICAgICAgICAgICAgQUZST05ERU4uQkVORURFTiAgICAgICAgICAgICBQWdZSSVNUxC5LRVJSLkFMQVMgICAgICAgICAgICAgICAgIEFSUk9UT05EQS5ESUZFVFRPICAgICAgICAgICAgICAgICAgUlVOREEuTkVSCisgICAgMjg2ICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQURJU1QgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BVkVSVCAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkdBTU1BICAgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgIERJU1RHQU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuVkVSRCAgICAgICAgICAgICAgICAgICBHQU1NQUpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuR0FNTUEgICAgICAgICAgICAgICAgICAgICAgR0FNTUFG1lJECisgICAgMjg3ICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBHQU1NQUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgIEdBTU1BSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkdBTU1BLklOVkVSU0UgICAgICAgICAgICAgICAgICBESVNUUi5HQU1NQS5JTlYgICAgICAgICAgICAgICAgICAgIElOVkdBTUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUEuSU5WICAgICAgICAgICAgICAgICAgICBHQU1NQUpBS0FVTUEuS8TETlQgICAgICAgICAgICAgICAgIElOVi5HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgICAgR0FNTUFJTlYKKyAgICAyODggICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIENFSUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0JFUkdSRU5aRSAgICAgICAgICAgICAgICAgICAgICAgICBQTEFGT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VTFRJUExPLlNVUEVSSU9SICAgICAgICAgICAgICAgICAgVEVUTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRlJPTkRFTi5CT1ZFTiAgICAgICAgICAgICAgIFBZ1lJJU1TELktFUlIuWUzWUyAgICAgICAgICAgICAgICAgQVJST1RPTkRBLkVDQ0VTU08gICAgICAgICAgICAgICAgICBSVU5EQS5VUFAKKyAgICAyODkgICAgICA0ICAgICAgMSAgICAgICAgICAwICAgICAgICAgIEhZUEdFT01ESVNUICAgICAgICAgICAgICAgICAgICAgICAgSFlQR0VPTVZFUlQgICAgICAgICAgICAgICAgICAgICAgICBMT0kuSFlQRVJHRU9NRVRSSVFVRSAgICAgICAgICAgICAgIERJU1RSLkhJUEVSR0VPTSAgICAgICAgICAgICAgICAgICAgRElTVC5ISVBFUkdFT00gICAgICAgICAgICAgICAgICAgICBIWVBFUkdFTy5WRVJEICAgICAgICAgICAgICAgIEhZUEVSR0VPTS5KQUtBVU1BICAgICAgICAgICAgICAgICAgRElTVFJJQi5JUEVSR0VPTSAgICAgICAgICAgICAgICAgICBIWVBHRU9NRtZSRAorICAgIDI5MCAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgTE9HTk9STURJU1QgICAgICAgICAgICAgICAgICAgICAgICBMT0dOT1JNVkVSVCAgICAgICAgICAgICAgICAgICAgICAgIExPSS5MT0dOT1JNQUxFICAgICAgICAgICAgICAgICAgICAgRElTVFIuTE9HLk5PUk0gICAgICAgICAgICAgICAgICAgICBESVNULkxPR05PUk1BTCAgICAgICAgICAgICAgICAgICAgIExPRy5OT1JNLlZFUkQgICAgICAgICAgICAgICAgTE9HTk9STS5KQUtBVU1BICAgICAgICAgICAgICAgICAgICBESVNUUklCLkxPR05PUk0gICAgICAgICAgICAgICAgICAgIExPR05PUk1G1lJECisgICAgMjkxICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBMT0dJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0lOViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLkxPR05PUk1BTEUuSU5WRVJTRSAgICAgICAgICAgICBESVNUUi5MT0cuSU5WICAgICAgICAgICAgICAgICAgICAgIElOVkxPRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLk5PUk0uSU5WICAgICAgICAgICAgICAgICBMT0dOT1JNLkpBS0FVTUEuS8TETlQgICAgICAgICAgICAgIElOVi5MT0dOT1JNICAgICAgICAgICAgICAgICAgICAgICAgTE9HSU5WCisgICAgMjkyICAgICAgMyAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBORUdCSU5PTURJU1QgICAgICAgICAgICAgICAgICAgICAgIE5FR0JJTk9NVkVSVCAgICAgICAgICAgICAgICAgICAgICAgTE9JLkJJTk9NSUFMRS5ORUcgICAgICAgICAgICAgICAgICBORUdCSU5PTURJU1QgICAgICAgICAgICAgICAgICAgICAgIERJU1QuQklOLk5FRyAgICAgICAgICAgICAgICAgICAgICAgTkVHLkJJTk9NLlZFUkQgICAgICAgICAgICAgICBCSU5PTUlKQUtBVU1BLk5FRyAgICAgICAgICAgICAgICAgIERJU1RSSUIuQklOT00uTkVHICAgICAgICAgICAgICAgICAgTkVHQklOT01G1lJECisgICAgMjkzICAgICAgNCAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOT1JNRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1WRVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLk5PUk1BTEUgICAgICAgICAgICAgICAgICAgICAgICBESVNUUi5OT1JNICAgICAgICAgICAgICAgICAgICAgICAgIERJU1QuTk9STSAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STS5WRVJEICAgICAgICAgICAgICAgICAgICBOT1JNLkpBS0FVTUEgICAgICAgICAgICAgICAgICAgICAgIERJU1RSSUIuTk9STSAgICAgICAgICAgICAgICAgICAgICAgTk9STUbWUkQKKyAgICAyOTQgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1TRElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkROT1JNVkVSVCAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRS5TVEFOREFSRCAgICAgICAgICAgICAgIERJU1RSLk5PUk0uRVNUQU5EICAgICAgICAgICAgICAgICAgRElTVC5OT1JNUCAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORC5OT1JNLlZFUkQgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQS5OT1JNSVQgICAgICAgICAgICAgICAgRElTVFJJQi5OT1JNLlNUICAgICAgICAgICAgICAgICAgICBOT1JNU0bWUkQKKyAgICAyOTUgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIE5PUk1JTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STUlOViAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuTk9STUFMRS5JTlZFUlNFICAgICAgICAgICAgICAgIERJU1RSLk5PUk0uSU5WICAgICAgICAgICAgICAgICAgICAgSU5WLk5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNLklOViAgICAgICAgICAgICAgICAgICAgIE5PUk0uSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgSU5WLk5PUk0gICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNSU5WCisgICAgMjk2ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBOT1JNU0lOViAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQU5ETk9STUlOViAgICAgICAgICAgICAgICAgICAgICAgTE9JLk5PUk1BTEUuU1RBTkRBUkQuSU5WRVJTRSAgICAgICBESVNUUi5OT1JNLkVTVEFORC5JTlYgICAgICAgICAgICAgIElOVi5OT1JNUCAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkQuTk9STS5JTlYgICAgICAgICAgICAgICBOT1JNLkpBS0FVTUEuTk9STUlULkvExE5UICAgICAgICAgIElOVi5OT1JNLlNUICAgICAgICAgICAgICAgICAgICAgICAgTk9STVNJTlYKKyAgICAyOTcgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFNUQU5EQVJESVpFICAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRBUkRJU0lFUlVORyAgICAgICAgICAgICAgICAgICBDRU5UUkVFLlJFRFVJVEUgICAgICAgICAgICAgICAgICAgIE5PUk1BTElaQUNJT04gICAgICAgICAgICAgICAgICAgICAgUEFEUk9OSVpBUiAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNQUxJU0VSRU4gICAgICAgICAgICAgICAgIE5PUk1JVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STUFMSVpaQSAgICAgICAgICAgICAgICAgICAgICAgICBTVEFOREFSRElTRVJBCisgICAgMjk4ICAgICAgMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBPREQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOR0VSQURFICAgICAgICAgICAgICAgICAgICAgICAgICAgSU1QQUlSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRURPTkRFQS5JTVBBUiAgICAgICAgICAgICAgICAgICAgIM1NUEFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT05FVkVOICAgICAgICAgICAgICAgICAgICAgICBQQVJJVE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BBUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUREQQorICAgIDI5OSAgICAgIDIgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUEVSTVVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQVRJT05FTiAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgUEVSTVVUQUNJT05FUyAgICAgICAgICAgICAgICAgICAgICBQRVJNVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVEFUSUVTICAgICAgICAgICAgICAgICAgUEVSTVVUQUFUSU8gICAgICAgICAgICAgICAgICAgICAgICBQRVJNVVRBWklPTkUgICAgICAgICAgICAgICAgICAgICAgIFBFUk1VVAorICAgIDMwMCAgICAgIDMgICAgICAxICAgICAgICAgIDAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5QT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04gICAgICAgICAgICAgICAgICAgICAgUE9JU1NPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQT0lTU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPSVNTT04KKyAgICAzMDEgICAgICAzICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFRESVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0kuU1RVREVOVCAgICAgICAgICAgICAgICAgICAgICAgIERJU1RSLlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULlZFUkQgICAgICAgICAgICAgICAgICAgICAgIFRKQUtBVU1BICAgICAgICAgICAgICAgICAgICAgICAgICAgRElTVFJJQi5UICAgICAgICAgICAgICAgICAgICAgICAgICBURtZSRAorICAgIDMwMiAgICAgIDQgICAgICAxICAgICAgICAgIDAgICAgICAgICAgV0VJQlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPSS5XRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgRElTVC5XRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwgICAgICAgICAgICAgICAgICAgICAgV0VJQlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBXRUlCVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFSUJVTEwKKyAgICAzMDMgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNVTVhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVYTVkyICAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5YTVkyICAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFYTUVOT1NZMiAgICAgICAgICAgICAgICAgICAgICAgU09NQVhNWTIgICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uWE1JTlkuMiAgICAgICAgICAgICAgICAgIEVST1RVU1RFTi5ORUxJ1lNVTU1BICAgICAgICAgICAgICAgU09NTUEuUS5ESUZGICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVhNWTIKKyAgICAzMDQgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNVTVgyTVkyICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUVYMk1ZMiAgICAgICAgICAgICAgICAgICAgICAgICBTT01NRS5YMk1ZMiAgICAgICAgICAgICAgICAgICAgICAgIFNVTUFYMk1FTk9TWTIgICAgICAgICAgICAgICAgICAgICAgU09NQVgyRFkyICAgICAgICAgICAgICAgICAgICAgICAgICBTT00uWDJNSU5ZMiAgICAgICAgICAgICAgICAgIE5FTEnWU1VNTUlFTi5FUk9UVVMgICAgICAgICAgICAgICAgU09NTUEuRElGRi5RICAgICAgICAgICAgICAgICAgICAgICBTVU1NQVgyTVkyCisgICAgMzA1ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBTVU1YMlBZMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FWDJQWTIgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuWDJQWTIgICAgICAgICAgICAgICAgICAgICAgICBTVU1BWDJNQVNZMiAgICAgICAgICAgICAgICAgICAgICAgIFNPTUFYMlNZMiAgICAgICAgICAgICAgICAgICAgICAgICAgU09NLlgyUExVU1kyICAgICAgICAgICAgICAgICBORUxJ1lNVTU1JRU4uU1VNTUEgICAgICAgICAgICAgICAgIFNPTU1BLlNPTU1BLlEgICAgICAgICAgICAgICAgICAgICAgU1VNTUFYMlBZMgorICAgIDMwNiAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgQ0hJVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSElURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuS0hJREVVWCAgICAgICAgICAgICAgICAgICAgICAgUFJVRUJBLkNISSAgICAgICAgICAgICAgICAgICAgICAgICBURVNURS5RVUkgICAgICAgICAgICAgICAgICAgICAgICAgIENISS5UT0VUUyAgICAgICAgICAgICAgICAgICAgQ0hJVEVTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULkNISSAgICAgICAgICAgICAgICAgICAgICAgICAgIENISTJURVNUCisgICAgMzA3ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBDT1JSRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPUlJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZJQ0lFTlQuQ09SUkVMQVRJT04gICAgICAgICAgICBDT0VGLkRFLkNPUlJFTCAgICAgICAgICAgICAgICAgICAgIENPUlJFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SUkVMQVRJRSAgICAgICAgICAgICAgICAgICBLT1JSRUxBQVRJTyAgICAgICAgICAgICAgICAgICAgICAgIENPUlJFTEFaSU9ORSAgICAgICAgICAgICAgICAgICAgICAgS09SUkVMCisgICAgMzA4ICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBDT1ZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVJJQU5DRSAgICAgICAgICAgICAgICAgICAgICAgICBDT1ZBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPVkFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09WQVJJQU5USUUgICAgICAgICAgICAgICAgICBLT1ZBUklBTlNTSSAgICAgICAgICAgICAgICAgICAgICAgIENPVkFSSUFOWkEgICAgICAgICAgICAgICAgICAgICAgICAgS09WQVIKKyAgICAzMDkgICAgICAzICAgICAgMiAgICAgICAgICAwICAgICAgICAgIEZPUkVDQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIxFRaRVIgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVWSVNJT04gICAgICAgICAgICAgICAgICAgICAgICAgIFBST05PU1RJQ08gICAgICAgICAgICAgICAgICAgICAgICAgUFJFVklTw08gICAgICAgICAgICAgICAgICAgICAgICAgICBWT09SU1BFTExFTiAgICAgICAgICAgICAgICAgIEVOTlVTVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFVklTSU9ORSAgICAgICAgICAgICAgICAgICAgICAgICBQUkVESUtUSU9OCisgICAgMzEwICAgICAgMiAgICAgIDIgICAgICAgICAgMCAgICAgICAgICBGVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5GICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUlVFQkEuRiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RFRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi5UT0VUUyAgICAgICAgICAgICAgICAgICAgICBGVEVTVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRFU1QKKyAgICAzMTEgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIElOVEVSQ0VQVCAgICAgICAgICAgICAgICAgICAgICAgICAgQUNIU0VOQUJTQ0hOSVRUICAgICAgICAgICAgICAgICAgICBPUkRPTk5FRS5PUklHSU5FICAgICAgICAgICAgICAgICAgIElOVEVSU0VDQ0lPTiAgICAgICAgICAgICAgICAgICAgICAgSU5URVJDRVDHw08gICAgICAgICAgICAgICAgICAgICAgICBTTklKUFVOVCAgICAgICAgICAgICAgICAgICAgIExFSUtLQVVTUElTVEUgICAgICAgICAgICAgICAgICAgICAgSU5URVJDRVRUQSAgICAgICAgICAgICAgICAgICAgICAgICBTS8RSTklOR1NQVU5LVAorICAgIDMxMiAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04gICAgICAgICAgICAgICAgICAgICAgUEVBUlNPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQRUFSU09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFQVJTT04KKyAgICAzMTMgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFJTUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkVTVElNTVRIRUlUU01BU1MgICAgICAgICAgICAgICAgICBDT0VGRklDSUVOVC5ERVRFUk1JTkFUSU9OICAgICAgICAgIENPRUZJQ0lFTlRFLlIyICAgICAgICAgICAgICAgICAgICAgUlFVQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLktXQURSQUFUICAgICAgICAgICAgICAgICAgIFBFQVJTT04uTkVMSdYgICAgICAgICAgICAgICAgICAgICAgUlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSS1YKKyAgICAzMTQgICAgICAyICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFNURVlYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RGRUhMRVJZWCAgICAgICAgICAgICAgICAgICAgICAgICBFUlJFVVIuVFlQRS5YWSAgICAgICAgICAgICAgICAgICAgIEVSUk9SLlRJUElDTy5YWSAgICAgICAgICAgICAgICAgICAgRVBBRFlYICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFORC5GT1VULllYICAgICAgICAgICAgICAgIEtFU0tJVklSSEUgICAgICAgICAgICAgICAgICAgICAgICAgRVJSLlNURC5ZWCAgICAgICAgICAgICAgICAgICAgICAgICBTVERGRUxZWAorICAgIDMxNSAgICAgIDIgICAgICAyICAgICAgICAgIDAgICAgICAgICAgU0xPUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEVJR1VORyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFTlRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEVORElFTlRFICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNMSU5Bx8NPICAgICAgICAgICAgICAgICAgICAgICAgIFJJQ0hUSU5HICAgICAgICAgICAgICAgICAgICAgS1VMTUFLRVJST0lOICAgICAgICAgICAgICAgICAgICAgICBQRU5ERU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgIExVVE5JTkcKKyAgICAzMTYgICAgICA0ICAgICAgMiAgICAgICAgICAwICAgICAgICAgIFRURVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULlNUVURFTlQgICAgICAgICAgICAgICAgICAgICAgIFBSVUVCQS5UICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVEVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULlRPRVRTICAgICAgICAgICAgICAgICAgICAgIFRURVNUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEVTVC5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEVTVAorICAgIDMxNyAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgUFJPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQUhSU0NIQkVSRUlDSCAgICAgICAgICAgICAgICAgICAgIFBST0JBQklMSVRFICAgICAgICAgICAgICAgICAgICAgICAgUFJPQkFCSUxJREFEICAgICAgICAgICAgICAgICAgICAgICBQUk9CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtBTlMgICAgICAgICAgICAgICAgICAgICAgICAgVE9ERU5OxEvWSVNZWVMgICAgICAgICAgICAgICAgICAgICBQUk9CQUJJTElUwCAgICAgICAgICAgICAgICAgICAgICAgIFNBTk5PTElLSEVUCisgICAgMzE4ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBERVZTUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTVFVQURBQlcgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuQ0FSUkVTLkVDQVJUUyAgICAgICAgICAgICAgICBERVNWSUEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1ZRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVWLktXQUQgICAgICAgICAgICAgICAgICAgICBPSUtBSVNUVS5ORUxJ1lNVTU1BICAgICAgICAgICAgICAgIERFVi5RICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZBREFWVgorICAgIDMxOSAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgR0VPTUVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU9NSVRURUwgICAgICAgICAgICAgICAgICAgICAgICAgIE1PWUVOTkUuR0VPTUVUUklRVUUgICAgICAgICAgICAgICAgTUVESUEuR0VPTSAgICAgICAgICAgICAgICAgICAgICAgICBNyURJQS5HRU9NyVRSSUNBICAgICAgICAgICAgICAgICAgIE1FRVRLLkdFTSAgICAgICAgICAgICAgICAgICAgS0VTS0lBUlZPLkdFT00gICAgICAgICAgICAgICAgICAgICBNRURJQS5HRU9NRVRSSUNBICAgICAgICAgICAgICAgICAgIEdFT01FREVMCisgICAgMzIwICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBIQVJNRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBUk1JVFRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORS5IQVJNT05JUVVFICAgICAgICAgICAgICAgICBNRURJQS5BUk1PICAgICAgICAgICAgICAgICAgICAgICAgIE3JRElBLkhBUk3UTklDQSAgICAgICAgICAgICAgICAgICAgSEFSTS5HRU0gICAgICAgICAgICAgICAgICAgICBLRVNLSUFSVk8uSEFSTSAgICAgICAgICAgICAgICAgICAgIE1FRElBLkFSTU9OSUNBICAgICAgICAgICAgICAgICAgICAgSEFSTU1FREVMCisgICAgMzIxICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVU1TUSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQURSQVRFU1VNTUUgICAgICAgICAgICAgICAgICAgICAgU09NTUUuQ0FSUkVTICAgICAgICAgICAgICAgICAgICAgICBTVU1BLkNVQURSQURPUyAgICAgICAgICAgICAgICAgICAgIFNPTUFRVUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgS1dBRFJBVEVOU09NICAgICAgICAgICAgICAgICBORUxJ1lNVTU1BICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1BLlEgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1ZBRFJBVFNVTU1BCisgICAgMzIyICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBLVVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1VSVE9TSVMgICAgICAgICAgICAgICAgICAgICAgICAgICBDVVJUT1NJUyAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS1VSVE9TSVMgICAgICAgICAgICAgICAgICAgICBLVVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVUlRPU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QUElHSEVUCisgICAgMzIzICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTS0VXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSElFRkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09FRkZJQ0lFTlQuQVNZTUVUUklFICAgICAgICAgICAgICBDT0VGSUNJRU5URS5BU0lNRVRSSUEgICAgICAgICAgICAgIERJU1RPUsfDTyAgICAgICAgICAgICAgICAgICAgICAgICAgU0NIRUVGSEVJRCAgICAgICAgICAgICAgICAgICBKQUtBVU1BTi5WSU5PVVMgICAgICAgICAgICAgICAgICAgIEFTSU1NRVRSSUEgICAgICAgICAgICAgICAgICAgICAgICAgU05FREhFVAorICAgIDMyNCAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgWlRFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHVEVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1QuWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJVRUJBLlogICAgICAgICAgICAgICAgICAgICAgICAgICBURVNURVogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFouVE9FVFMgICAgICAgICAgICAgICAgICAgICAgWlRFU1RJICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNULlogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpURVNUCisgICAgMzI1ICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBMQVJHRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtHUtZTU1RFICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBTkRFLlZBTEVVUiAgICAgICAgICAgICAgICAgICAgICBLLkVTSU1PLk1BWU9SICAgICAgICAgICAgICAgICAgICAgIE1BSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JPT1RTVEUgICAgICAgICAgICAgICAgICAgICBTVVVSSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQU5ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1TWUlNUQQorICAgIDMyNiAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU01BTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLS0xFSU5TVEUgICAgICAgICAgICAgICAgICAgICAgICAgIFBFVElURS5WQUxFVVIgICAgICAgICAgICAgICAgICAgICAgSy5FU0lNTy5NRU5PUiAgICAgICAgICAgICAgICAgICAgICBNRU5PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtMRUlOU1RFICAgICAgICAgICAgICAgICAgICAgUElFTkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSUNDT0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JTlNUQQorICAgIDMyNyAgICAgIDIgICAgICAwICAgICAgICAgIDAgICAgICAgICAgUVVBUlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVQVJUSUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1VBUlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtXQVJUSUVMICAgICAgICAgICAgICAgICAgICAgTkVMSsROTkVTICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFSVElMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIEtWQVJUSUwKKyAgICAzMjggICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFBFUkNFTlRJTEUgICAgICAgICAgICAgICAgICAgICAgICAgUVVBTlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRU5USUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBFUkNFTlRJTCAgICAgICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVElMICAgICAgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUVMICAgICAgICAgICAgICAgICAgIFBST1NFTlRUSVBJU1RFICAgICAgICAgICAgICAgICAgICAgUEVSQ0VOVElMRSAgICAgICAgICAgICAgICAgICAgICAgICBQRVJDRU5USUwKKyAgICAzMjkgICAgIC0xICAgICAgMCAgICAgICAgICAwICAgICAgICAgIFBFUkNFTlRSQU5LICAgICAgICAgICAgICAgICAgICAgICAgUVVBTlRJTFNSQU5HICAgICAgICAgICAgICAgICAgICAgICBSQU5HLlBPVVJDRU5UQUdFICAgICAgICAgICAgICAgICAgIFJBTkdPLlBFUkNFTlRJTCAgICAgICAgICAgICAgICAgICAgT1JERU0uUE9SQ0VOVFVBTCAgICAgICAgICAgICAgICAgICBQRVJDRU5ULlJBTkcgICAgICAgICAgICAgICAgIFBST1NFTlRUSUrEUkpFU1RZUyAgICAgICAgICAgICAgICAgUEVSQ0VOVC5SQU5HTyAgICAgICAgICAgICAgICAgICAgICBQUk9DRU5UUkFORworICAgIDMzMCAgICAgLTEgICAgICAyICAgICAgICAgIDAgICAgICAgICAgTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RBTFdFUlQgICAgICAgICAgICAgICAgICAgICAgICAgIE1PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PRFVTICAgICAgICAgICAgICAgICAgICAgICAgTU9PREkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUFbEUkRFCisgICAgMzMxICAgICAgMiAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBUUklNTUVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFU1RVVFpUTUlUVEVMICAgICAgICAgICAgICAgICAgICAgTU9ZRU5ORS5SRURVSVRFICAgICAgICAgICAgICAgICAgICBNRURJQS5BQ09UQURBICAgICAgICAgICAgICAgICAgICAgIE3JRElBLklOVEVSTkEgICAgICAgICAgICAgICAgICAgICAgR0VUUklNRC5HRU0gICAgICAgICAgICAgICAgICBLRVNLSUFSVk8uVEFTQVRUVSAgICAgICAgICAgICAgICAgIE1FRElBLlRST05DQVRBICAgICAgICAgICAgICAgICAgICAgVFJJTU1FREVMCisgICAgMzMyICAgICAgMiAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBUSU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJTlYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9JLlNUVURFTlQuSU5WRVJTRSAgICAgICAgICAgICAgICBESVNUUi5ULklOViAgICAgICAgICAgICAgICAgICAgICAgIElOVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVC5JTlYgICAgICAgICAgICAgICAgICAgICAgICBUSkFLQVVNQS5LxMROVCAgICAgICAgICAgICAgICAgICAgIElOVi5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElOVgorICAgIDMzNiAgICAgLTEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgQ09OQ0FURU5BVEUgICAgICAgICAgICAgICAgICAgICAgICBWRVJLRVRURU4gICAgICAgICAgICAgICAgICAgICAgICAgIENPTkNBVEVORVIgICAgICAgICAgICAgICAgICAgICAgICAgQ09OQ0FURU5BUiAgICAgICAgICAgICAgICAgICAgICAgICBDT05DQVRFTkFSICAgICAgICAgICAgICAgICAgICAgICAgIFRFS1NULlNBTUVOVk9FR0VOICAgICAgICAgICAgS0VUSlVUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05DQVRFTkEgICAgICAgICAgICAgICAgICAgICAgICAgIFNBTU1BTkZPR0EKKyAgICAzMzcgICAgICAyICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFBPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5aICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVUlTU0FOQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIFBPVEVOQ0lBICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9Uyk5DSUEgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUNIVCAgICAgICAgICAgICAgICAgICAgICAgIFBPVEVOU1NJICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9URU5aQSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUFBI1kpULlRJTEwKKyAgICAzNDIgICAgICAxICAgICAgMSAgICAgICAgICAwICAgICAgICAgIFJBRElBTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBRElBTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOT1MgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQUxFTiAgICAgICAgICAgICAgICAgICAgIFJBRElBQU5JVCAgICAgICAgICAgICAgICAgICAgICAgICAgUkFESUFOVEkgICAgICAgICAgICAgICAgICAgICAgICAgICBSQURJQU5FUgorICAgIDM0MyAgICAgIDEgICAgICAxICAgICAgICAgIDAgICAgICAgICAgREVHUkVFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFR1JFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1JBRE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQURFTiAgICAgICAgICAgICAgICAgICAgICAgQVNURUVUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUkFESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdSQURFUgorICAgIDM0NCAgICAgLTEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgU1VCVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICBURUlMRVJHRUJOSVMgICAgICAgICAgICAgICAgICAgICAgIFNPVVMuVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgU1VCVE9UQUxFUyAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUT1RBTCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlRPVEFBTCAgICAgICAgICAgICAgICAgICAgVsRMSVNVTU1BICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJUT1RBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIERFTFNVTU1BCisgICAgMzQ1ICAgICAtMSAgICAgIDAgICAgICAgICAgMCAgICAgICAgICBTVU1JRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVTU1FV0VOTiAgICAgICAgICAgICAgICAgICAgICAgICAgU09NTUUuU0kgICAgICAgICAgICAgICAgICAgICAgICAgICBTVU1BUi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTUFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09NLkFMUyAgICAgICAgICAgICAgICAgICAgICBTVU1NQS5KT1MgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTU1BLlNFICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VNTUEuT00KKyAgICAzNDYgICAgICAyICAgICAgMCAgICAgICAgICAwICAgICAgICAgIENPVU5USUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgWsRITEVOV0VOTiAgICAgICAgICAgICAgICAgICAgICAgICBOQi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTlRBUi5TSSAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVC5TRSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQU5UQUwuQUxTICAgICAgICAgICAgICAgICAgIExBU0tFLkpPUyAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEEuU0UgICAgICAgICAgICAgICAgICAgICAgICAgICBBTlRBTC5PTQorICAgIDM0NyAgICAgIDEgICAgICAwICAgICAgICAgIDAgICAgICAgICAgQ09VTlRCTEFOSyAgICAgICAgICAgICAgICAgICAgICAgICBBTlpBSExMRUVSRVpFTExFTiAgICAgICAgICAgICAgICAgIE5CLlZJREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09OVEFSLkJMQU5DTyAgICAgICAgICAgICAgICAgICAgICBDT05UQVIuVkFaSU8gICAgICAgICAgICAgICAgICAgICAgIEFBTlRBTC5MRUdFLkNFTExFTiAgICAgICAgICAgTEFTS0UuVFlISsRUICAgICAgICAgICAgICAgICAgICAgICBDT05UQS5WVU9URSAgICAgICAgICAgICAgICAgICAgICAgIEFOVEFMLlRPTU1BCisgICAgMzU0ICAgICAtMSAgICAgIDEgICAgICAgICAgMCAgICAgICAgICBST01BTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFLWTUlTQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1FUk8uUk9NQU5PICAgICAgICAgICAgICAgICAgICAgIFJPTUFOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NRUlOUyAgICAgICAgICAgICAgICAgICAgICBST01BTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJPTUFOTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9NRVJTSworCisKK0Rvd25sb2FkIHRoaXMgZXhhbXBsZTogTDxodHRwOi8vY3BhbnNlYXJjaC5wZXJsLm9yZy9zcmMvSk1DTkFNQVJBL1NwcmVhZHNoZWV0LVdyaXRlRXhjZWwtMi4zNy9leGFtcGxlcy9mdW5jdGlvbl9sb2NhbGUucGw+CisKKz1oZWFkMiBFeGFtcGxlOiB3cml0ZUExLnBsCisKKworCitUaGlzIGlzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGV4dGVuZCB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgbW9kdWxlLgorCitDb2RlIGlzIGFwcGVuZGVkIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0IG1vZHVsZSBieSByZXVzaW5nCit0aGUgcGFja2FnZSBuYW1lLiBUaGUgbmV3IGNvZGUgcHJvdmlkZXMgYSB3cml0ZSgpIG1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8KK3VzZSBFeGNlbHMgQTEgc3R5bGUgY2VsbCByZWZlcmVuY2VzLiAgVGhpcyBpcyBub3QgcGFydGljdWxhcmx5IHVzZWZ1bCBidXQgaXQKK3NlcnZlcyBhcyBhbiBleGFtcGxlIG9mIGhvdyB0aGUgbW9kdWxlIGNhbiBiZSBleHRlbmRlZCB3aXRob3V0IG1vZGlmeWluZyB0aGUKK2NvZGUgZGlyZWN0bHkuCisKKworCisgICAgIyEvdXNyL2Jpbi9wZXJsIC13CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gZXh0ZW5kIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBtb2R1bGUuCisgICAgIworICAgICMgQ29kZSBpcyBhcHBlbmRlZCB0byB0aGUgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldCBtb2R1bGUgYnkgcmV1c2luZworICAgICMgdGhlIHBhY2thZ2UgbmFtZS4gVGhlIG5ldyBjb2RlIHByb3ZpZGVzIGEgd3JpdGUoKSBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvCisgICAgIyB1c2UgRXhjZWxzIEExIHN0eWxlIGNlbGwgcmVmZXJlbmNlcy4gIFRoaXMgaXMgbm90IHBhcnRpY3VsYXJseSB1c2VmdWwgYnV0IGl0CisgICAgIyBzZXJ2ZXMgYXMgYW4gZXhhbXBsZSBvZiBob3cgdGhlIG1vZHVsZSBjYW4gYmUgZXh0ZW5kZWQgd2l0aG91dCBtb2RpZnlpbmcgdGhlCisgICAgIyBjb2RlIGRpcmVjdGx5LgorICAgICMKKyAgICAjIHJldmVyc2UoJ6knKSwgTWFyY2ggMjAwMSwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisgICAgIworICAgIAorICAgIHVzZSBzdHJpY3Q7CisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOworICAgIAorICAgICMgQ3JlYXRlIGEgbmV3IHdvcmtib29rIGNhbGxlZCBzaW1wbGUueGxzIGFuZCBhZGQgYSB3b3Jrc2hlZXQKKyAgICBteSAkd29ya2Jvb2sgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygid3JpdGVBMS54bHMiKTsKKyAgICBteSAkd29ya3NoZWV0ID0gJHdvcmtib29rLT5hZGRfd29ya3NoZWV0KCk7CisgICAgCisgICAgIyBXcml0ZSBudW1iZXJzIG9yIHRleHQKKyAgICAkd29ya3NoZWV0LT53cml0ZSAgKDAsIDAsICJIZWxsbyIpOworICAgICR3b3Jrc2hlZXQtPndyaXRlQTEoIkEzIiwgIkEzIiAgICk7CisgICAgJHdvcmtzaGVldC0+d3JpdGVBMSgiQTUiLCAxLjIzNDUgKTsKKyAgICAKKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgVGhlIGZvbGxvd2luZyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6V29ya3NoZWV0CisgICAgIyBwYWNrYWdlLgorICAgICMKKyAgICAKKyAgICBwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7CisgICAgCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIHdyaXRlQTEoJGNlbGwsICR0b2tlbiwgJGZvcm1hdCkKKyAgICAjCisgICAgIyBDb252ZXJ0ICRjZWxsIGZyb20gRXhjZWwgQTEgbm90YXRpb24gdG8gJHJvdywgJGNvbCBub3RhdGlvbiBhbmQKKyAgICAjIGNhbGwgd3JpdGUoKSBvbiAkdG9rZW4uCisgICAgIworICAgICMgUmV0dXJuczogcmV0dXJuIHZhbHVlIG9mIGNhbGxlZCBzdWJyb3V0aW5lIG9yIC00IGZvciBpbnZhbGlkIGNlbGwKKyAgICAjIHJlZmVyZW5jZS4KKyAgICAjCisgICAgc3ViIHdyaXRlQTEgeworICAgICAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgICAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgICAgICBteSAkY29sOworICAgICAgICBteSAkcm93OworICAgIAorICAgICAgICBpZiAoJGNlbGwgPX4gLyhbQS16XSspKFxkKykvKSB7CisgICAgICAgICAgICgkcm93LCAkY29sKSA9IF9jb252ZXJ0QTEoJDIsICQxKTsKKyAgICAgICAgICAgJHNlbGYtPndyaXRlKCRyb3csICRjb2wsIEBfKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtNDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgX2NvbnZlcnRBMSgkcm93LCAkY29sKQorICAgICMKKyAgICAjIENvbnZlcnQgRXhjZWwgQTEgbm90YXRpb24gdG8gJHJvdywgJGNvbCBub3RhdGlvbi4gQ29udmVydCBiYXNlMjYgY29sdW1uCisgICAgIyBzdHJpbmcgdG8gYSBudW1iZXIuCisgICAgIworICAgIHN1YiBfY29udmVydEExIHsKKyAgICAgICAgbXkgJHJvdyAgICA9ICRfWzBdOworICAgICAgICBteSAkY29sICAgID0gJF9bMV07ICMgU3RyaW5nIGluIEFBIG5vdGF0aW9uCisgICAgCisgICAgICAgIG15IEBjaGFycyAgPSBzcGxpdCAvLywgJGNvbDsKKyAgICAgICAgbXkgJGV4cG4gICA9IDA7CisgICAgICAgICRjb2wgICAgICAgPSAwOworICAgIAorICAgICAgICB3aGlsZSAoQGNoYXJzKSB7CisgICAgICAgICAgICBteSAkY2hhciA9IHVjKHBvcChAY2hhcnMpKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgICAgICRleHBuKys7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgIyBDb252ZXJ0IDEgaW5kZXggdG8gMCBpbmRleAorICAgICAgICAkcm93LS07CisgICAgICAgICRjb2wtLTsKKyAgICAKKyAgICAgICAgcmV0dXJuKCRyb3csICRjb2wpOworICAgIH0KKworCitEb3dubG9hZCB0aGlzIGV4YW1wbGU6IEw8aHR0cDovL2NwYW5zZWFyY2gucGVybC5vcmcvc3JjL0pNQ05BTUFSQS9TcHJlYWRzaGVldC1Xcml0ZUV4Y2VsLTIuMzcvZXhhbXBsZXMvd3JpdGVBMS5wbD4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCitDb250cmlidXRlZCBleGFtcGxlcyBjb250YWluIHRoZSBvcmlnaW5hbCBhdXRob3IncyBuYW1lLgorCis9aGVhZDEgQ09QWVJJR0hUCisKK0NvcHlyaWdodCBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWN1dApkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtYXQucG0gYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL0Zvcm1hdC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjE1ZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtYXQucG0KQEAgLTAsMCArMSw4MTMgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBGb3JtYXQgLSBBIGNsYXNzIGZvciBkZWZpbmluZyBFeGNlbCBmb3JtYXR0aW5nLgorIworIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKyMKKyMgQ29weXJpZ2h0IDIwMDAtMjAxMCwgSm9obiBNY05hbWFyYSwgam1jbmFtYXJhQGNwYW4ub3JnCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7CisKKworCisKKworCit1c2UgdmFycyBxdygkQVVUT0xPQUQgJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3RvcgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgID0gc2hpZnQ7CisKKyAgICBteSAkc2VsZiAgID0geworICAgICAgICAgICAgICAgICAgICBfeGZfaW5kZXggICAgICAgPT4gc2hpZnQgfHwgMCwKKworICAgICAgICAgICAgICAgICAgICBfdHlwZSAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfaW5kZXggICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250ICAgICAgICAgICA9PiAnQXJpYWwnLAorICAgICAgICAgICAgICAgICAgICBfc2l6ZSAgICAgICAgICAgPT4gMTAsCisgICAgICAgICAgICAgICAgICAgIF9ib2xkICAgICAgICAgICA9PiAweDAxOTAsCisgICAgICAgICAgICAgICAgICAgIF9pdGFsaWMgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfY29sb3IgICAgICAgICAgPT4gMHg3RkZGLAorICAgICAgICAgICAgICAgICAgICBfdW5kZXJsaW5lICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfc3RyaWtlb3V0ID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X291dGxpbmUgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9zaGFkb3cgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfc2NyaXB0ICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9mb250X2ZhbWlseSAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZm9udF9jaGFyc2V0ICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfZW5jb2RpbmcgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX251bV9mb3JtYXQgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9udW1fZm9ybWF0X2VuYyA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9oaWRkZW4gICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfbG9ja2VkICAgICAgICAgPT4gMSwKKworICAgICAgICAgICAgICAgICAgICBfdGV4dF9oX2FsaWduICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3RleHRfd3JhcCAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF90ZXh0X3ZfYWxpZ24gICA9PiAyLAorICAgICAgICAgICAgICAgICAgICBfdGV4dF9qdXN0bGFzdCAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3JvdGF0aW9uICAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2ZnX2NvbG9yICAgICAgID0+IDB4NDAsCisgICAgICAgICAgICAgICAgICAgIF9iZ19jb2xvciAgICAgICA9PiAweDQxLAorCisgICAgICAgICAgICAgICAgICAgIF9wYXR0ZXJuICAgICAgICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9ib3R0b20gICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfdG9wICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2xlZnQgICAgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9yaWdodCAgICAgICAgICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9ib3R0b21fY29sb3IgICA9PiAweDQwLAorICAgICAgICAgICAgICAgICAgICBfdG9wX2NvbG9yICAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX2xlZnRfY29sb3IgICAgID0+IDB4NDAsCisgICAgICAgICAgICAgICAgICAgIF9yaWdodF9jb2xvciAgICA9PiAweDQwLAorCisgICAgICAgICAgICAgICAgICAgIF9pbmRlbnQgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfc2hyaW5rICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX21lcmdlX3JhbmdlICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgIF9yZWFkaW5nX29yZGVyICA9PiAwLAorCisgICAgICAgICAgICAgICAgICAgIF9kaWFnX3R5cGUgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICBfZGlhZ19jb2xvciAgICAgPT4gMHg0MCwKKyAgICAgICAgICAgICAgICAgICAgX2RpYWdfYm9yZGVyICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgX2ZvbnRfb25seSAgICAgID0+IDAsCisKKyAgICAgICAgICAgICAgICAgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICAgICAgICAgICAgICAgICBfdXNlZF9tZXJnZSAgICAgPT4gMCwKKworICAgICAgICAgICAgICAgICB9OworCisgICAgYmxlc3MgICRzZWxmLCAkY2xhc3M7CisKKyAgICAjIFNldCBwcm9wZXJ0aWVzIHBhc3NlZCB0byBXb3JrYm9vazo6YWRkX2Zvcm1hdCgpCisgICAgJHNlbGYtPnNldF9mb3JtYXRfcHJvcGVydGllcyhAXykgaWYgQF87CisKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb3B5KCRmb3JtYXQpCisjCisjIENvcHkgdGhlIGF0dHJpYnV0ZXMgb2YgYW5vdGhlciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0IG9iamVjdC4KKyMKK3N1YiBjb3B5IHsKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkb3RoZXIgPSAkX1swXTsKKworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkb3RoZXI7CisgICAgcmV0dXJuIHVubGVzcyAocmVmKCRzZWxmKSBlcSByZWYoJG90aGVyKSk7CisKKyAgICAjIFN0b3JlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgd2UgZG9uJ3Qgd2FudCBvdmVyd3JpdHRlbi4KKyAgICBteSAkeGYgICAgICAgICAgICAgICAgICA9ICRzZWxmLT57X3hmX2luZGV4fTsKKyAgICBteSAkbWVyZ2VfcmFuZ2UgICAgICAgICA9ICRzZWxmLT57X21lcmdlX3JhbmdlfTsKKyAgICBteSAkdXNlZF9tZXJnZSAgICAgICAgICA9ICRzZWxmLT57X3VzZWRfbWVyZ2V9OworCisgICAgJSRzZWxmICAgICAgICAgICAgICAgICAgPSAlJG90aGVyOyAjIENvcHkgcHJvcGVydGllcworCisgICAgIyBSZXN0b3JlIHNhdmVkIHByb3BlcnRpZXMuCisgICAgJHNlbGYtPntfeGZfaW5kZXh9ICAgICAgPSAkeGY7CisgICAgJHNlbGYtPntfbWVyZ2VfcmFuZ2V9ICAgPSAkbWVyZ2VfcmFuZ2U7CisgICAgJHNlbGYtPntfdXNlZF9tZXJnZX0gICAgPSAkdXNlZF9tZXJnZTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF94Zigkc3R5bGUpCisjCisjIEdlbmVyYXRlIGFuIEV4Y2VsIEJJRkYgWEYgcmVjb3JkLgorIworc3ViIGdldF94ZiB7CisKKyAgICB1c2UgaW50ZWdlcjsgICAgIyBBdm9pZCA8PCBzaGlmdCBidWcgaW4gUGVybCA1LjYuMCBvbiBIUC1VWAorCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQ7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGlmbnQ7ICAgICAgICMgSW5kZXggdG8gRk9OVCByZWNvcmQKKyAgICBteSAkaWZtdDsgICAgICAgIyBJbmRleCB0byBGT1JNQVQgcmVjb3JkCisgICAgbXkgJHN0eWxlOyAgICAgICMgU3R5bGUgYW5kIG90aGVyIG9wdGlvbnMKKyAgICBteSAkYWxpZ247ICAgICAgIyBBbGlnbm1lbnQKKyAgICBteSAkaW5kZW50OyAgICAgIworICAgIG15ICRpY3Y7ICAgICAgICAjIGZnIGFuZCBiZyBwYXR0ZXJuIGNvbG9ycworICAgIG15ICRib3JkZXIxOyAgICAjIEJvcmRlciBsaW5lIG9wdGlvbnMKKyAgICBteSAkYm9yZGVyMjsgICAgIyBCb3JkZXIgbGluZSBvcHRpb25zCisgICAgbXkgJGJvcmRlcjM7ICAgICMgQm9yZGVyIGxpbmUgb3B0aW9ucworCisKKyAgICAjIFNldCB0aGUgdHlwZSBvZiB0aGUgWEYgcmVjb3JkIGFuZCBzb21lIG9mIHRoZSBhdHRyaWJ1dGVzLgorICAgIGlmICgkc2VsZi0+e190eXBlfSA9PSAweEZGRjUpIHsKKyAgICAgICAgJHN0eWxlID0gMHhGRkY1OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHN0eWxlICAgPSAkc2VsZi0+e19sb2NrZWR9OworICAgICAgICAkc3R5bGUgIHw9ICRzZWxmLT57X2hpZGRlbn0gPDwgMTsKKyAgICB9CisKKworICAgICMgRmxhZ3MgdG8gaW5kaWNhdGUgaWYgYXR0cmlidXRlcyBoYXZlIGJlZW4gc2V0LgorICAgIG15ICRhdHJfbnVtICAgICA9ICgkc2VsZi0+e19udW1fZm9ybWF0fSAgICAgIT0gMCk7CisKKyAgICBteSAkYXRyX2ZudCAgICAgPSAoJHNlbGYtPntfZm9udF9pbmRleH0gICAgICE9IDApOworCisgICAgbXkgJGF0cl9hbGMgICAgID0gKCRzZWxmLT57X3RleHRfaF9hbGlnbn0gICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZXh0X3ZfYWxpZ259ICAgIT0gMiAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfc2hyaW5rfSAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X21lcmdlX3JhbmdlfSAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZXh0X3dyYXB9ICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfaW5kZW50fSAgICAgICAgICE9IDApID8gMSA6IDA7CisKKyAgICBteSAkYXRyX2JkciAgICAgPSAoJHNlbGYtPntfYm90dG9tfSAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RvcH0gICAgICAgICAgICAhPSAwICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19sZWZ0fSAgICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcmlnaHR9ICAgICAgICAgICE9IDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X2RpYWdfdHlwZX0gICAgICAhPSAwKSA/IDE6IDA7CisKKyAgICBteSAkYXRyX3BhdCAgICAgPSAoJHNlbGYtPntfZmdfY29sb3J9ICAgICAgICE9IDB4NDAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X2JnX2NvbG9yfSAgICAgICAhPSAweDQxICB8fAorICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e19wYXR0ZXJufSAgICAgICAgIT0gMHgwMCkgPyAxIDogMDsKKworICAgIG15ICRhdHJfcHJvdCAgICA9ICgkc2VsZi0+e19oaWRkZW59ICAgICAgICAgIT0gMCAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfbG9ja2VkfSAgICAgICAgICE9IDEpID8gMSA6IDA7CisKKworICAgICMgU2V0IGF0dHJpYnV0ZSBjaGFuZ2VkIGZsYWdzIGZvciB0aGUgc3R5bGUgZm9ybWF0cy4KKyAgICBpZiAoJHNlbGYtPntfeGZfaW5kZXh9ICE9IDAgYW5kICRzZWxmLT57X3R5cGV9ID09IDB4RkZGNSkgeworCisgICAgICAgIGlmICgkc2VsZi0+e194Zl9pbmRleH0gPj0gMTYpIHsKKyAgICAgICAgICAgICRhdHJfbnVtICAgID0gMDsKKyAgICAgICAgICAgICRhdHJfZm50ICAgID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRhdHJfbnVtICAgID0gMTsKKyAgICAgICAgICAgICRhdHJfZm50ICAgID0gMDsKKyAgICAgICAgfQorCisgICAgICAgICRhdHJfYWxjICAgID0gMTsKKyAgICAgICAgJGF0cl9iZHIgICAgPSAxOworICAgICAgICAkYXRyX3BhdCAgICA9IDE7CisgICAgICAgICRhdHJfcHJvdCAgID0gMTsKKyAgICB9CisKKworICAgICMgU2V0IGEgZGVmYXVsdCBkaWFnb25hbCBib3JkZXIgc3R5bGUgaWYgbm9uZSB3YXMgc3BlY2lmaWVkLgorICAgICRzZWxmLT57X2RpYWdfYm9yZGVyfSA9IDEgaWYgISRzZWxmLT57X2RpYWdfYm9yZGVyfSBhbmQgJHNlbGYtPntfZGlhZ190eXBlfTsKKworCisgICAgIyBSZXNldCB0aGUgZGVmYXVsdCBjb2xvdXJzIGZvciB0aGUgbm9uLWZvbnQgcHJvcGVydGllcworICAgICRzZWxmLT57X2ZnX2NvbG9yfSAgICAgPSAweDQwIGlmICRzZWxmLT57X2ZnX2NvbG9yfSAgICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2JnX2NvbG9yfSAgICAgPSAweDQxIGlmICRzZWxmLT57X2JnX2NvbG9yfSAgICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2JvdHRvbV9jb2xvcn0gPSAweDQwIGlmICRzZWxmLT57X2JvdHRvbV9jb2xvcn0gPT0gMHg3RkZGOworICAgICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPSAweDQwIGlmICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2xlZnRfY29sb3J9ICAgPSAweDQwIGlmICRzZWxmLT57X2xlZnRfY29sb3J9ICAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X3JpZ2h0X2NvbG9yfSAgPSAweDQwIGlmICRzZWxmLT57X3JpZ2h0X2NvbG9yfSAgPT0gMHg3RkZGOworICAgICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPSAweDQwIGlmICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPT0gMHg3RkZGOworCisKKyAgICAjIFplcm8gdGhlIGRlZmF1bHQgYm9yZGVyIGNvbG91ciBpZiB0aGUgYm9yZGVyIGhhcyBub3QgYmVlbiBzZXQuCisgICAgJHNlbGYtPntfYm90dG9tX2NvbG9yfSA9IDAgaWYgJHNlbGYtPntfYm90dG9tfSAgICA9PSAwOworICAgICRzZWxmLT57X3RvcF9jb2xvcn0gICAgPSAwIGlmICRzZWxmLT57X3RvcH0gICAgICAgPT0gMDsKKyAgICAkc2VsZi0+e19yaWdodF9jb2xvcn0gID0gMCBpZiAkc2VsZi0+e19yaWdodH0gICAgID09IDA7CisgICAgJHNlbGYtPntfbGVmdF9jb2xvcn0gICA9IDAgaWYgJHNlbGYtPntfbGVmdH0gICAgICA9PSAwOworICAgICRzZWxmLT57X2RpYWdfY29sb3J9ICAgPSAwIGlmICRzZWxmLT57X2RpYWdfdHlwZX0gPT0gMDsKKworCisgICAgIyBUaGUgZm9sbG93aW5nIDIgbG9naWNhbCBzdGF0ZW1lbnRzIHRha2UgY2FyZSBvZiBzcGVjaWFsIGNhc2VzIGluIHJlbGF0aW9uCisgICAgIyB0byBjZWxsIGNvbG91cnMgYW5kIHBhdHRlcm5zOgorICAgICMgMS4gRm9yIGEgc29saWQgZmlsbCAoX3BhdHRlcm4gPT0gMSkgRXhjZWwgcmV2ZXJzZXMgdGhlIHJvbGUgb2YgZm9yZWdyb3VuZAorICAgICMgICAgYW5kIGJhY2tncm91bmQgY29sb3Vycy4KKyAgICAjIDIuIElmIHRoZSB1c2VyIHNwZWNpZmllcyBhIGZvcmVncm91bmQgb3IgYmFja2dyb3VuZCBjb2xvdXIgd2l0aG91dCBhCisgICAgIyAgICBwYXR0ZXJuIHRoZXkgcHJvYmFibHkgd2FudGVkIGEgc29saWQgZmlsbCwgc28gd2UgZmlsbCBpbiB0aGUgZGVmYXVsdHMuCisgICAgIworICAgIGlmICgkc2VsZi0+e19wYXR0ZXJufSAgPD0gMHgwMSBhbmQKKyAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ICE9IDB4NDEgYW5kCisgICAgICAgICRzZWxmLT57X2ZnX2NvbG9yfSA9PSAweDQwICAgICkKKyAgICB7CisgICAgICAgICRzZWxmLT57X2ZnX2NvbG9yfSA9ICRzZWxmLT57X2JnX2NvbG9yfTsKKyAgICAgICAgJHNlbGYtPntfYmdfY29sb3J9ID0gMHg0MDsKKyAgICAgICAgJHNlbGYtPntfcGF0dGVybn0gID0gMTsKKyAgICB9CisKKyAgICBpZiAoJHNlbGYtPntfcGF0dGVybn0gIDw9IDB4MDEgYW5kCisgICAgICAgICRzZWxmLT57X2JnX2NvbG9yfSA9PSAweDQxIGFuZAorICAgICAgICAkc2VsZi0+e19mZ19jb2xvcn0gIT0gMHg0MCAgICApCisgICAgeworICAgICAgICAkc2VsZi0+e19iZ19jb2xvcn0gPSAweDQwOworICAgICAgICAkc2VsZi0+e19wYXR0ZXJufSAgPSAxOworICAgIH0KKworCisgICAgIyBTZXQgZGVmYXVsdCBhbGlnbm1lbnQgaWYgaW5kZW50IGlzIHNldC4KKyAgICAkc2VsZi0+e190ZXh0X2hfYWxpZ259ID0gMSBpZiAkc2VsZi0+e19pbmRlbnR9IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57X3RleHRfaF9hbGlnbn0gPT0gMDsKKworCisgICAgJHJlY29yZCAgICAgICAgID0gMHgwMEUwOworICAgICRsZW5ndGggICAgICAgICA9IDB4MDAxNDsKKworICAgICRpZm50ICAgICAgICAgICA9ICRzZWxmLT57X2ZvbnRfaW5kZXh9OworICAgICRpZm10ICAgICAgICAgICA9ICRzZWxmLT57X251bV9mb3JtYXR9OworCisKKyAgICAkYWxpZ24gICAgICAgICAgPSAkc2VsZi0+e190ZXh0X2hfYWxpZ259OworICAgICRhbGlnbiAgICAgICAgIHw9ICRzZWxmLT57X3RleHRfd3JhcH0gICAgIDw8IDM7CisgICAgJGFsaWduICAgICAgICAgfD0gJHNlbGYtPntfdGV4dF92X2FsaWdufSAgPDwgNDsKKyAgICAkYWxpZ24gICAgICAgICB8PSAkc2VsZi0+e190ZXh0X2p1c3RsYXN0fSA8PCA3OworICAgICRhbGlnbiAgICAgICAgIHw9ICRzZWxmLT57X3JvdGF0aW9ufSAgICAgIDw8IDg7CisKKworCisgICAgJGluZGVudCAgICAgICAgID0gJHNlbGYtPntfaW5kZW50fTsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkc2VsZi0+e19zaHJpbmt9ICAgICAgICA8PCA0OworICAgICRpbmRlbnQgICAgICAgIHw9ICRzZWxmLT57X21lcmdlX3JhbmdlfSAgIDw8IDU7CisgICAgJGluZGVudCAgICAgICAgfD0gJHNlbGYtPntfcmVhZGluZ19vcmRlcn0gPDwgNjsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX251bSAgICAgICAgICAgICAgICA8PCAxMDsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2ZudCAgICAgICAgICAgICAgICA8PCAxMTsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2FsYyAgICAgICAgICAgICAgICA8PCAxMjsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX2JkciAgICAgICAgICAgICAgICA8PCAxMzsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX3BhdCAgICAgICAgICAgICAgICA8PCAxNDsKKyAgICAkaW5kZW50ICAgICAgICB8PSAkYXRyX3Byb3QgICAgICAgICAgICAgICA8PCAxNTsKKworCisgICAgJGJvcmRlcjEgICAgICAgID0gJHNlbGYtPntfbGVmdH07CisgICAgJGJvcmRlcjEgICAgICAgfD0gJHNlbGYtPntfcmlnaHR9ICAgICAgICAgPDwgNDsKKyAgICAkYm9yZGVyMSAgICAgICB8PSAkc2VsZi0+e190b3B9ICAgICAgICAgICA8PCA4OworICAgICRib3JkZXIxICAgICAgIHw9ICRzZWxmLT57X2JvdHRvbX0gICAgICAgIDw8IDEyOworCisgICAgJGJvcmRlcjIgICAgICAgID0gJHNlbGYtPntfbGVmdF9jb2xvcn07CisgICAgJGJvcmRlcjIgICAgICAgfD0gJHNlbGYtPntfcmlnaHRfY29sb3J9ICAgPDwgNzsKKyAgICAkYm9yZGVyMiAgICAgICB8PSAkc2VsZi0+e19kaWFnX3R5cGV9ICAgICA8PCAxNDsKKworCisgICAgJGJvcmRlcjMgICAgICAgID0gJHNlbGYtPntfdG9wX2NvbG9yfTsKKyAgICAkYm9yZGVyMyAgICAgICB8PSAkc2VsZi0+e19ib3R0b21fY29sb3J9ICA8PCA3OworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X2RpYWdfY29sb3J9ICAgIDw8IDE0OworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X2RpYWdfYm9yZGVyfSAgIDw8IDIxOworICAgICRib3JkZXIzICAgICAgIHw9ICRzZWxmLT57X3BhdHRlcm59ICAgICAgIDw8IDI2OworCisgICAgJGljdiAgICAgICAgICAgID0gJHNlbGYtPntfZmdfY29sb3J9OworICAgICRpY3YgICAgICAgICAgIHw9ICRzZWxmLT57X2JnX2NvbG9yfSAgICAgIDw8IDc7CisKKworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2dnZ2dlZ2IiwgJGlmbnQsICRpZm10LCAkc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFsaWduLCAkaW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib3JkZXIxLCAkYm9yZGVyMiwgJGJvcmRlcjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGljdik7CisKKyAgICByZXR1cm4oJGhlYWRlciAuICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE5vdGUgdG8gcG9ydGVycy4gVGhlIG1ham9yaXR5IG9mIHRoZSBzZXRfcHJvcGVydHkoKSBtZXRob2RzIGFyZSBjcmVhdGVkCisjIGR5bmFtaWNhbGx5IHZpYSBQZXJsJyBBVVRPTE9BRCBzdWIsIHNlZSBiZWxvdy4gWW91IG1heSBwcmVmZXIvaGF2ZSB0byBzcGVjaWZ5CisjIHRoZW0gZXhwbGljaXRseSBpbiBvdGhlciBpbXBsZW1lbnRhdGlvbiBsYW5ndWFnZXMuCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9udCgpCisjCisjIEdlbmVyYXRlIGFuIEV4Y2VsIEJJRkYgRk9OVCByZWNvcmQuCisjCitzdWIgZ2V0X2ZvbnQgeworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZDsgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgIyBSZWNvcmQgbGVuZ3RoCisKKyAgICBteSAkZHlIZWlnaHQ7ICAgIyBIZWlnaHQgb2YgZm9udCAoMS8yMCBvZiBhIHBvaW50KQorICAgIG15ICRncmJpdDsgICAgICAjIEZvbnQgYXR0cmlidXRlcworICAgIG15ICRpY3Y7ICAgICAgICAjIEluZGV4IHRvIGNvbG9yIHBhbGV0dGUKKyAgICBteSAkYmxzOyAgICAgICAgIyBCb2xkIHN0eWxlCisgICAgbXkgJHNzczsgICAgICAgICMgU3VwZXJzY3JpcHQvc3Vic2NyaXB0CisgICAgbXkgJHVsczsgICAgICAgICMgVW5kZXJsaW5lCisgICAgbXkgJGJGYW1pbHk7ICAgICMgRm9udCBmYW1pbHkKKyAgICBteSAkYkNoYXJTZXQ7ICAgIyBDaGFyYWN0ZXIgc2V0CisgICAgbXkgJHJlc2VydmVkOyAgICMgUmVzZXJ2ZWQKKyAgICBteSAkY2NoOyAgICAgICAgIyBMZW5ndGggb2YgZm9udCBuYW1lCisgICAgbXkgJHJnY2g7ICAgICAgICMgRm9udCBuYW1lCisgICAgbXkgJGVuY29kaW5nOyAgICMgRm9udCBuYW1lIGNoYXJhY3RlciBlbmNvZGluZworCisKKyAgICAkZHlIZWlnaHQgICA9ICRzZWxmLT57X3NpemV9ICogMjA7CisgICAgJGljdiAgICAgICAgPSAkc2VsZi0+e19jb2xvcn07CisgICAgJGJscyAgICAgICAgPSAkc2VsZi0+e19ib2xkfTsKKyAgICAkc3NzICAgICAgICA9ICRzZWxmLT57X2ZvbnRfc2NyaXB0fTsKKyAgICAkdWxzICAgICAgICA9ICRzZWxmLT57X3VuZGVybGluZX07CisgICAgJGJGYW1pbHkgICAgPSAkc2VsZi0+e19mb250X2ZhbWlseX07CisgICAgJGJDaGFyU2V0ICAgPSAkc2VsZi0+e19mb250X2NoYXJzZXR9OworICAgICRyZ2NoICAgICAgID0gJHNlbGYtPntfZm9udH07CisgICAgJGVuY29kaW5nICAgPSAkc2VsZi0+e19mb250X2VuY29kaW5nfTsKKworICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkcmdjaCkpIHsKKyAgICAgICAgICAgICRyZ2NoID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJHJnY2gpOworICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICRjY2ggPSBsZW5ndGggJHJnY2g7CisKKyAgICAjIEhhbmRsZSBVbmljb2RlIGZvbnQgbmFtZXMuCisgICAgaWYgKCRlbmNvZGluZyA9PSAxKSB7CisgICAgICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIFVuaWNvZGUgZm9udCBuYW1lIiBpZiAkY2NoICUgMjsKKyAgICAgICAgJGNjaCAgLz0gMiBpZiAkZW5jb2Rpbmc7CisgICAgICAgICRyZ2NoICA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRyZ2NoOworICAgIH0KKworICAgICRyZWNvcmQgICAgID0gMHgzMTsKKyAgICAkbGVuZ3RoICAgICA9IDB4MTAgKyBsZW5ndGggJHJnY2g7CisgICAgJHJlc2VydmVkICAgPSAweDAwOworCisgICAgJGdyYml0ICAgICAgPSAweDAwOworICAgICRncmJpdCAgICAgfD0gMHgwMiBpZiAkc2VsZi0+e19pdGFsaWN9OworICAgICRncmJpdCAgICAgfD0gMHgwOCBpZiAkc2VsZi0+e19mb250X3N0cmlrZW91dH07CisgICAgJGdyYml0ICAgICB8PSAweDEwIGlmICRzZWxmLT57X2ZvbnRfb3V0bGluZX07CisgICAgJGdyYml0ICAgICB8PSAweDIwIGlmICRzZWxmLT57X2ZvbnRfc2hhZG93fTsKKworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgID0gcGFjaygidnZ2dnZDQ0NDQ0MiLCAkZHlIZWlnaHQsICRncmJpdCwgJGljdiwgJGJscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNzcywgJHVscywgJGJGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRiQ2hhclNldCwgJHJlc2VydmVkLCAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgcmV0dXJuKCRoZWFkZXIgLiAkZGF0YSAuICRyZ2NoKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBnZXRfZm9udF9rZXkoKQorIworIyBSZXR1cm5zIGEgdW5pcXVlIGhhc2gga2V5IGZvciBhIGZvbnQuIFVzZWQgYnkgV29ya2Jvb2stPl9zdG9yZV9hbGxfZm9udHMoKQorIworc3ViIGdldF9mb250X2tleSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBUaGUgZm9sbG93aW5nIGVsZW1lbnRzIGFyZSBhcnJhbmdlZCB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgb2YKKyAgICAjIGdlbmVyYXRpbmcgYSB1bmlxdWUga2V5LiBFbGVtZW50cyB0aGF0IGhvbGQgYSBsYXJnZSByYW5nZSBvZiBudW1iZXJzCisgICAgIyBlLmcuIF9jb2xvciBhcmUgcGxhY2VkIGJldHdlZW4gdHdvIGJpbmFyeSBlbGVtZW50cyBzdWNoIGFzIF9pdGFsaWMKKyAgICAjCisgICAgbXkgJGtleSA9ICIkc2VsZi0+e19mb250fSRzZWxmLT57X3NpemV9IjsKKyAgICAka2V5ICAgLj0gIiRzZWxmLT57X2ZvbnRfc2NyaXB0fSRzZWxmLT57X3VuZGVybGluZX0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9zdHJpa2VvdXR9JHNlbGYtPntfYm9sZH0kc2VsZi0+e19mb250X291dGxpbmV9IjsKKyAgICAka2V5ICAgLj0gIiRzZWxmLT57X2ZvbnRfZmFtaWx5fSRzZWxmLT57X2ZvbnRfY2hhcnNldH0iOworICAgICRrZXkgICAuPSAiJHNlbGYtPntfZm9udF9zaGFkb3d9JHNlbGYtPntfY29sb3J9JHNlbGYtPntfaXRhbGljfSI7CisgICAgJGtleSAgIC49ICIkc2VsZi0+e19mb250X2VuY29kaW5nfSI7CisgICAgJGtleSAgICA9fiBzLyAvXy9nOyAjIENvbnZlcnQgdGhlIGtleSB0byBhIHNpbmdsZSB3b3JkCisKKyAgICByZXR1cm4gJGtleTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF94Zl9pbmRleCgpCisjCisjIFJldHVybnMgdGhlIHVzZWQgYnkgV29ya3NoZWV0LT5fWEYoKQorIworc3ViIGdldF94Zl9pbmRleCB7CisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57X3hmX2luZGV4fTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY29sb3IoKQorIworIyBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHNldF94eHhfY29sb3IgbWV0aG9kcyB0byBjb252ZXJ0IGEgY29sb3IKKyMgc3RyaW5nIGludG8gYSBudW1iZXIuIENvbG9yIHJhbmdlIGlzIDAuLjYzIGJ1dCB3ZSB3aWxsIHJlc3RyaWN0IGl0CisjIHRvIDguLjYzIHRvIGNvbXBseSB3aXRoIEdudW1lcmljLiBDb2xvcnMgMC4uNyBhcmUgcmVwZWF0ZWQgaW4gOC4uMTUuCisjCitzdWIgX2dldF9jb2xvciB7CisKKyAgICBteSAlY29sb3JzID0gKAorICAgICAgICAgICAgICAgICAgICBhcXVhICAgID0+IDB4MEYsCisgICAgICAgICAgICAgICAgICAgIGN5YW4gICAgPT4gMHgwRiwKKyAgICAgICAgICAgICAgICAgICAgYmxhY2sgICA9PiAweDA4LAorICAgICAgICAgICAgICAgICAgICBibHVlICAgID0+IDB4MEMsCisgICAgICAgICAgICAgICAgICAgIGJyb3duICAgPT4gMHgxMCwKKyAgICAgICAgICAgICAgICAgICAgbWFnZW50YSA9PiAweDBFLAorICAgICAgICAgICAgICAgICAgICBmdWNoc2lhID0+IDB4MEUsCisgICAgICAgICAgICAgICAgICAgIGdyYXkgICAgPT4gMHgxNywKKyAgICAgICAgICAgICAgICAgICAgZ3JleSAgICA9PiAweDE3LAorICAgICAgICAgICAgICAgICAgICBncmVlbiAgID0+IDB4MTEsCisgICAgICAgICAgICAgICAgICAgIGxpbWUgICAgPT4gMHgwQiwKKyAgICAgICAgICAgICAgICAgICAgbmF2eSAgICA9PiAweDEyLAorICAgICAgICAgICAgICAgICAgICBvcmFuZ2UgID0+IDB4MzUsCisgICAgICAgICAgICAgICAgICAgIHBpbmsgICAgPT4gMHgyMSwKKyAgICAgICAgICAgICAgICAgICAgcHVycGxlICA9PiAweDE0LAorICAgICAgICAgICAgICAgICAgICByZWQgICAgID0+IDB4MEEsCisgICAgICAgICAgICAgICAgICAgIHNpbHZlciAgPT4gMHgxNiwKKyAgICAgICAgICAgICAgICAgICAgd2hpdGUgICA9PiAweDA5LAorICAgICAgICAgICAgICAgICAgICB5ZWxsb3cgID0+IDB4MEQsCisgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIFJldHVybiB0aGUgZGVmYXVsdCBjb2xvciwgMHg3RkZGLCBpZiB1bmRlZiwKKyAgICByZXR1cm4gMHg3RkZGIHVubGVzcyBkZWZpbmVkICRfWzBdOworCisgICAgIyBvciB0aGUgY29sb3Igc3RyaW5nIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyLAorICAgIHJldHVybiAkY29sb3Jze2xjKCRfWzBdKX0gaWYgZXhpc3RzICRjb2xvcnN7bGMoJF9bMF0pfTsKKworICAgICMgb3IgdGhlIGRlZmF1bHQgY29sb3IgaWYgc3RyaW5nIGlzIHVucmVjb2duaXNlZCwKKyAgICByZXR1cm4gMHg3RkZGIGlmICgkX1swXSA9fiBtL1xELyk7CisKKyAgICAjIG9yIGFuIGluZGV4IDwgOCBtYXBwZWQgaW50byB0aGUgY29ycmVjdCByYW5nZSwKKyAgICByZXR1cm4gJF9bMF0gKyA4IGlmICRfWzBdIDwgODsKKworICAgICMgb3IgdGhlIGRlZmF1bHQgY29sb3IgaWYgYXJnIGlzIG91dHNpZGUgcmFuZ2UsCisgICAgcmV0dXJuIDB4N0ZGRiBpZiAkX1swXSA+IDYzOworCisgICAgIyBvciBhbiBpbnRlZ2VyIGluIHRoZSB2YWxpZCByYW5nZQorICAgIHJldHVybiAkX1swXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF90eXBlKCkKKyMKKyMgU2V0IHRoZSBYRiBvYmplY3QgdHlwZSBhcyAwID0gY2VsbCBYRiBvciAweEZGRjUgPSBzdHlsZSBYRi4KKyMKK3N1YiBzZXRfdHlwZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICR0eXBlID0gJF9bMF07CisKKyAgICBpZiAoZGVmaW5lZCAkX1swXSBhbmQgJF9bMF0gZXEgMCkgeworICAgICAgICAkc2VsZi0+e190eXBlfSA9IDB4MDAwMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X3R5cGV9ID0gMHhGRkY1OworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9hbGlnbigpCisjCisjIFNldCBjZWxsIGFsaWdubWVudC4KKyMKK3N1YiBzZXRfYWxpZ24geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGxvY2F0aW9uID0gJF9bMF07CisKKyAgICByZXR1cm4gaWYgbm90IGRlZmluZWQgJGxvY2F0aW9uOyAgIyBObyBkZWZhdWx0CisgICAgcmV0dXJuIGlmICRsb2NhdGlvbiA9fiBtL1xkLzsgICAgICMgSWdub3JlIG51bWJlcnMKKworICAgICRsb2NhdGlvbiA9IGxjKCRsb2NhdGlvbik7CisKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbigxKSBpZiAoJGxvY2F0aW9uIGVxICdsZWZ0Jyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnY2VudHJlJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnY2VudGVyJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oMykgaWYgKCRsb2NhdGlvbiBlcSAncmlnaHQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICdmaWxsJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNSkgaWYgKCRsb2NhdGlvbiBlcSAnanVzdGlmeScpOworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpIGlmICgkbG9jYXRpb24gZXEgJ2NlbnRlcl9hY3Jvc3MnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig2KSBpZiAoJGxvY2F0aW9uIGVxICdjZW50cmVfYWNyb3NzJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNikgaWYgKCRsb2NhdGlvbiBlcSAnbWVyZ2UnKTsgICAgICAgICMgUzpXRSBuYW1lCisgICAgJHNlbGYtPnNldF90ZXh0X2hfYWxpZ24oNykgaWYgKCRsb2NhdGlvbiBlcSAnZGlzdHJpYnV0ZWQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig3KSBpZiAoJGxvY2F0aW9uIGVxICdlcXVhbF9zcGFjZScpOyAgIyBQYXJzZUV4Y2VsCisKKworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDApIGlmICgkbG9jYXRpb24gZXEgJ3RvcCcpOworICAgICRzZWxmLT5zZXRfdGV4dF92X2FsaWduKDEpIGlmICgkbG9jYXRpb24gZXEgJ3ZjZW50cmUnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbigxKSBpZiAoJGxvY2F0aW9uIGVxICd2Y2VudGVyJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMikgaWYgKCRsb2NhdGlvbiBlcSAnYm90dG9tJyk7CisgICAgJHNlbGYtPnNldF90ZXh0X3ZfYWxpZ24oMykgaWYgKCRsb2NhdGlvbiBlcSAndmp1c3RpZnknKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICd2ZGlzdHJpYnV0ZWQnKTsKKyAgICAkc2VsZi0+c2V0X3RleHRfdl9hbGlnbig0KSBpZiAoJGxvY2F0aW9uIGVxICd2ZXF1YWxfc3BhY2UnKTsgIyBQYXJzZUV4Y2VsCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdmFsaWduKCkKKyMKKyMgU2V0IHZlcnRpY2FsIGNlbGwgYWxpZ25tZW50LiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHRoZSBzZXRfZm9ybWF0X3Byb3BlcnRpZXMoKQorIyBtZXRob2QgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBwcm9wZXJ0aWVzLgorIworc3ViIHNldF92YWxpZ24geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICAkc2VsZi0+c2V0X2FsaWduKEBfKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9jZW50ZXJfYWNyb3NzKCkKKyMKKyMgSW1wbGVtZW50cyB0aGUgRXhjZWw1IHN0eWxlICJtZXJnZSIuCisjCitzdWIgc2V0X2NlbnRlcl9hY3Jvc3MgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X3RleHRfaF9hbGlnbig2KTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tZXJnZSgpCisjCisjIFRoaXMgd2FzIHRoZSB3YXkgdG8gaW1wbGVtZW50IGEgbWVyZ2UgaW4gRXhjZWw1LiBIb3dldmVyIGl0IHNob3VsZCBoYXZlIGJlZW4KKyMgY2FsbGVkICJjZW50ZXJfYWNyb3NzIiBhbmQgbm90ICJtZXJnZSIuCisjIFRoaXMgaXMgbm93IGRlcHJlY2F0ZWQuIFVzZSBzZXRfY2VudGVyX2Fjcm9zcygpIG9yIGJldHRlciBtZXJnZV9yYW5nZSgpLgorIworIworc3ViIHNldF9tZXJnZSB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfdGV4dF9oX2FsaWduKDYpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2JvbGQoKQorIworIyBCb2xkIGhhcyBhIHJhbmdlIDB4NjQuLjB4M0U4LgorIyAweDE5MCBpcyBub3JtYWwuIDB4MkJDIGlzIGJvbGQuIFNvIGlzIGFuIGV4Y2Vzc2l2ZSB1c2Ugb2YgQVVUT0xPQUQuCisjCitzdWIgc2V0X2JvbGQgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICR3ZWlnaHQgPSAkX1swXTsKKworICAgICR3ZWlnaHQgPSAweDJCQyBpZiBub3QgZGVmaW5lZCAkd2VpZ2h0OyAjIEJvbGQgdGV4dAorICAgICR3ZWlnaHQgPSAweDJCQyBpZiAkd2VpZ2h0ID09IDE7ICAgICAgICAjIEJvbGQgdGV4dAorICAgICR3ZWlnaHQgPSAweDE5MCBpZiAkd2VpZ2h0ID09IDA7ICAgICAgICAjIE5vcm1hbCB0ZXh0CisgICAgJHdlaWdodCA9IDB4MTkwIGlmICR3ZWlnaHQgPCAgMHgwNjQ7ICAgICMgTG93ZXIgYm91bmQKKyAgICAkd2VpZ2h0ID0gMHgxOTAgaWYgJHdlaWdodCA+ICAweDNFODsgICAgIyBVcHBlciBib3VuZAorCisgICAgJHNlbGYtPntfYm9sZH0gPSAkd2VpZ2h0OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2JvcmRlcigkc3R5bGUpCisjCisjIFNldCBjZWxscyBib3JkZXJzIHRvIHRoZSBzYW1lIHN0eWxlCisjCitzdWIgc2V0X2JvcmRlciB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkc3R5bGUgPSAkX1swXTsKKworICAgICRzZWxmLT5zZXRfYm90dG9tKCRzdHlsZSk7CisgICAgJHNlbGYtPnNldF90b3AoJHN0eWxlKTsKKyAgICAkc2VsZi0+c2V0X2xlZnQoJHN0eWxlKTsKKyAgICAkc2VsZi0+c2V0X3JpZ2h0KCRzdHlsZSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfYm9yZGVyX2NvbG9yKCRjb2xvcikKKyMKKyMgU2V0IGNlbGxzIGJvcmRlciB0byB0aGUgc2FtZSBjb2xvcgorIworc3ViIHNldF9ib3JkZXJfY29sb3IgeworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yID0gJF9bMF07CisKKyAgICAkc2VsZi0+c2V0X2JvdHRvbV9jb2xvcigkY29sb3IpOworICAgICRzZWxmLT5zZXRfdG9wX2NvbG9yKCRjb2xvcik7CisgICAgJHNlbGYtPnNldF9sZWZ0X2NvbG9yKCRjb2xvcik7CisgICAgJHNlbGYtPnNldF9yaWdodF9jb2xvcigkY29sb3IpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3JvdGF0aW9uKCRhbmdsZSkKKyMKKyMgU2V0IHRoZSByb3RhdGlvbiBhbmdsZSBvZiB0aGUgdGV4dC4gQW4gYWxpZ25tZW50IHByb3BlcnR5LgorIworc3ViIHNldF9yb3RhdGlvbiB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcm90YXRpb24gPSAkX1swXTsKKworICAgICMgQXJndW1lbnQgc2hvdWxkIGJlIGEgbnVtYmVyCisgICAgcmV0dXJuIGlmICRyb3RhdGlvbiAhfiAvXihbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLzsKKworICAgICMgVGhlIGFyZyB0eXBlIGNhbiBiZSBhIGRvdWJsZSBidXQgdGhlIEV4Y2VsIGRpYWxvZyBvbmx5IGFsbG93cyBpbnRlZ2Vycy4KKyAgICAkcm90YXRpb24gPSBpbnQgJHJvdGF0aW9uOworCisgICAgaWYgKCRyb3RhdGlvbiA9PSAyNzApIHsKKyAgICAgICAgJHJvdGF0aW9uID0gMjU1OworICAgIH0KKyAgICBlbHNpZiAoJHJvdGF0aW9uID49IC05MCBvciAkcm90YXRpb24gPD0gOTApIHsKKyAgICAgICAgJHJvdGF0aW9uID0gLSRyb3RhdGlvbiArOTAgaWYgJHJvdGF0aW9uIDwgMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNhcnAgIlJvdGF0aW9uICRyb3RhdGlvbiBvdXRzaWRlIHJhbmdlOiAtOTAgPD0gYW5nbGUgPD0gOTAiOworICAgICAgICAkcm90YXRpb24gPSAwOworICAgIH0KKworICAgICRzZWxmLT57X3JvdGF0aW9ufSA9ICRyb3RhdGlvbjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9mb3JtYXRfcHJvcGVydGllcygpCisjCisjIENvbnZlcnQgaGFzaGVzIG9mIHByb3BlcnRpZXMgdG8gbWV0aG9kIGNhbGxzLgorIworc3ViIHNldF9mb3JtYXRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbXkgJXByb3BlcnRpZXMgPSBAXzsgIyBNZXJnZSBtdWx0aXBsZSBoYXNoZXMgaW50byBvbmUKKworICAgIHdoaWxlIChteSgka2V5LCAkdmFsdWUpID0gZWFjaCglcHJvcGVydGllcykpIHsKKworICAgICAgICAjIFN0cmlwIGxlYWRpbmcgIi0iIGZyb20gVGsgc3R5bGUgcHJvcGVydGllcyBlLmcuIC1jb2xvciA9PiAncmVkJy4KKyAgICAgICAgJGtleSA9fiBzL14tLy87CisKKyAgICAgICAgIyBDcmVhdGUgYSBzdWIgdG8gc2V0IHRoZSBwcm9wZXJ0eS4KKyAgICAgICAgbXkgJHN1YiA9IFwmeyJzZXRfJGtleSJ9OworICAgICAgICAkc3ViLT4oJHNlbGYsICR2YWx1ZSk7CisgICB9Cit9CisKKyMgUmVuYW1lZCByYXJlbHkgdXNlZCBzZXRfcHJvcGVydGllcygpIHRvIHNldF9mb3JtYXRfcHJvcGVydGllcygpIHRvIGF2b2lkCisjIGNvbmZ1c2lvbiB3aXRoIFdvcmtib29rIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiBUaGUgZm9sbG93aW5nIGFjdHMgYXMgYW4KKyMgYWxpYXMgZm9yIGFueSBjb2RlIHRoYXQgdXNlcyB0aGUgb2xkIG5hbWUuCisqc2V0X3Byb3BlcnRpZXMgPSAqc2V0X2Zvcm1hdF9wcm9wZXJ0aWVzOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQVVUT0xPQUQuIERldXMgZXggbWFjaGluYS4KKyMKKyMgRHluYW1pY2FsbHkgY3JlYXRlIHNldCBtZXRob2RzIHRoYXQgYXJlbid0IGFscmVhZHkgZGVmaW5lZC4KKyMKK3N1YiBBVVRPTE9BRCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBJZ25vcmUgY2FsbHMgdG8gREVTVFJPWQorICAgIHJldHVybiBpZiAkQVVUT0xPQUQgPX4gLzo6REVTVFJPWSQvOworCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCBtZXRob2QgbmFtZXMsIGkuZS4gInNldF94eHhfeXl5Ii4KKyAgICAkQVVUT0xPQUQgPX4gLy4qOjpzZXQoXHcrKS8gb3IgZGllICJVbmtub3duIG1ldGhvZDogJEFVVE9MT0FEXG4iOworCisgICAgIyBNYXRjaCB0aGUgYXR0cmlidXRlLCBpLmUuICJfeHh4X3l5eSIuCisgICAgbXkgJGF0dHJpYnV0ZSA9ICQxOworCisgICAgIyBDaGVjayB0aGF0IHRoZSBhdHRyaWJ1dGUgZXhpc3RzCisgICAgZXhpc3RzICRzZWxmLT57JGF0dHJpYnV0ZX0gIG9yIGRpZSAiVW5rbm93biBtZXRob2Q6ICRBVVRPTE9BRFxuIjsKKworICAgICMgVGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAgIG15ICR2YWx1ZTsKKworCisgICAgIyBUaGVyZSBhcmUgdHdvIHR5cGVzIG9mIHNldCBtZXRob2RzOiBzZXRfcHJvcGVydHkoKSBhbmQKKyAgICAjIHNldF9wcm9wZXJ0eV9jb2xvcigpLiBXaGVuIGEgbWV0aG9kIGlzIEFVVE9MT0FERUQgd2Ugc3RvcmUgYSBuZXcgYW5vbnltb3VzCisgICAgIyBzdWIgaW4gdGhlIGFwcHJvcHJpYXRlIHNsb3QgaW4gdGhlIHN5bWJvbCB0YWJsZS4gVGhlIHNwZWVkcyB1cCBzdWJzZXF1ZW50CisgICAgIyBjYWxscyB0byB0aGUgc2FtZSBtZXRob2QuCisgICAgIworICAgIG5vIHN0cmljdCAncmVmcyc7ICMgVG8gYWxsb3cgc3ltYm9sIHRhYmxlIGhhY2tlcnkKKworICAgIGlmICgkQVVUT0xPQUQgPX4gLy4qOjpzZXRcdytjb2xvciQvKSB7CisgICAgICAgICMgRm9yICJzZXRfcHJvcGVydHlfY29sb3IiIG1ldGhvZHMKKyAgICAgICAgJHZhbHVlID0gIF9nZXRfY29sb3IoJF9bMF0pOworCisgICAgICAgICp7JEFVVE9MT0FEfSA9IHN1YiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRzZWxmICA9IHNoaWZ0OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZWxmLT57JGF0dHJpYnV0ZX0gPSBfZ2V0X2NvbG9yKCRfWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICR2YWx1ZSA9ICRfWzBdOworICAgICAgICAkdmFsdWUgPSAxIGlmIG5vdCBkZWZpbmVkICR2YWx1ZTsgIyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbHdheXMgMQorCisgICAgICAgICp7JEFVVE9MT0FEfSA9IHN1YiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkdmFsdWUgPSBzaGlmdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFsdWUgPSAxIGlmIG5vdCBkZWZpbmVkICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPnskYXR0cmlidXRlfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgIH0KKworCisgICAgJHNlbGYtPnskYXR0cmlidXRlfSA9ICR2YWx1ZTsKK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitGb3JtYXQgLSBBIGNsYXNzIGZvciBkZWZpbmluZyBFeGNlbCBmb3JtYXR0aW5nLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRm9ybXVsYS5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvRm9ybXVsYS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDk4MzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Gb3JtdWxhLnBtCkBAIC0wLDAgKzEsMTQ4NSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYTsNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgRm9ybXVsYSAtIEEgY2xhc3MgZm9yIGdlbmVyYXRpbmcgRXhjZWwgZm9ybXVsYXMuDQorIw0KKyMNCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbA0KKyMNCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZw0KKyMNCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXw0KKyMNCisNCit1c2UgRXhwb3J0ZXI7DQordXNlIHN0cmljdDsNCit1c2UgQ2FycDsNCisNCisNCisNCisNCisNCisNCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsNCitASVNBID0gcXcoRXhwb3J0ZXIpOw0KKw0KKyRWRVJTSU9OID0gJzIuMzcnOw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBDbGFzcyBkYXRhLg0KKyMNCitteSAkcGFyc2VyOw0KK215ICVwdGc7DQorbXkgJWZ1bmN0aW9uczsNCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgRm9yIGRlYnVnZ2luZy4NCisjDQorbXkgJF9kZWJ1ZyA9IDA7DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIG5ldygpDQorIw0KKyMgQ29uc3RydWN0b3INCisjDQorc3ViIG5ldyB7DQorDQorICAgIG15ICRjbGFzcyAgPSAkX1swXTsNCisNCisgICAgbXkgJHNlbGYgICA9IHsNCisgICAgICAgICAgICAgICAgICAgIF9ieXRlX29yZGVyICAgICA9PiAkX1sxXSwNCisgICAgICAgICAgICAgICAgICAgIF93b3JrYm9vayAgICAgICA9PiAiIiwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfc2hlZXRzICAgICA9PiB7fSwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfcmVmcyAgICAgICA9PiB7fSwNCisgICAgICAgICAgICAgICAgICAgIF9leHRfcmVmX2NvdW50ICA9PiAwLA0KKyAgICAgICAgICAgICAgICAgICAgX2V4dF9uYW1lcyAgICAgID0+IHt9LA0KKyAgICAgICAgICAgICAgICAgfTsNCisNCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsNCisgICAgcmV0dXJuICRzZWxmOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2luaXRfcGFyc2VyKCkNCisjDQorIyBUaGVyZSBpcyBhIHNtYWxsIG92ZXJoZWFkIGludm9sdmVkIGluIGdlbmVyYXRpbmcgdGhlIHBhcnNlci4gVGhlcmVmb3JlLCB0aGUNCisjIGluaXRpYWxpc2F0aW9uIGlzIGRlbGF5ZWQgdW50aWwgYSBmb3JtdWxhIGlzIHJlcXVpcmVkLg0KKyMgVE9ETzogdXNlIGEgcHJlLWNvbXBpbGVkIGdyYW1tYXIuDQorIw0KKyMgUG9ydGVycyB0YWtlIG5vdGUsIGEgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIGlzbid0IG1hbmRhdG9yeS4gQSBmdXR1cmUNCisjIHZlcnNpb24gb2YgdGhpcyBtb2R1bGUgbWF5IHVzZSBhIFlBQ0MgYmFzZWQgcGFyc2VyIGluc3RlYWQuDQorIw0KK3N1YiBfaW5pdF9wYXJzZXIgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICAjIERlbGF5IGxvYWRpbmcgUGFyc2U6OlJlY0Rlc2NlbnQgdG8gcmVkdWNlIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLg0KKyAgICBldmFsIHsgcmVxdWlyZSBQYXJzZTo6UmVjRGVzY2VudCB9Ow0KKyAgICBkaWUgICJUaGUgUGFyc2U6OlJlY0Rlc2NlbnQgbW9kdWxlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyICIuDQorICAgICAgICAgInRvIHdyaXRlIGFuIEV4Y2VsIGZvcm11bGFcbiIgaWYgJEA7DQorDQorICAgICRzZWxmLT5faW5pdGlhbGl6ZV9oYXNoZXMoKTsNCisNCisgICAgIyBUaGUgcGFyc2luZyBncmFtbWFyLg0KKyAgICAjDQorICAgICMgVE9ETzogQWRkIHN1cHBvcnQgZm9yIGludGVybmF0aW9uYWwgdmVyc2lvbnMgb2YgRXhjZWwNCisgICAgIw0KKyAgICAkcGFyc2VyID0gUGFyc2U6OlJlY0Rlc2NlbnQtPm5ldyg8PCdFbmRHcmFtbWFyJyk7DQorDQorICAgICAgICBleHByOiAgICAgICAgICAgbGlzdA0KKw0KKyAgICAgICAgIyBNYXRjaCBhcmcgbGlzdHMgc3VjaCBhcyBTVU0oMSwyLCAzKQ0KKyAgICAgICAgbGlzdDogICAgICAgICAgIDxsZWZ0b3A6IGFkZGl0aW9uICcsJyBhZGRpdGlvbj4NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsgJGl0ZW1bMV0sICdfYXJnJywgc2NhbGFyIEB7JGl0ZW1bMV19IF0gfQ0KKw0KKyAgICAgICAgYWRkaXRpb246ICAgICAgIDxsZWZ0b3A6IG11bHRpcGxpY2F0aW9uIGFkZF9vcCBtdWx0aXBsaWNhdGlvbj4NCisNCisgICAgICAgICMgVE9ETzogVGhlIGFkZF9vcCBvcGVyYXRvcnMgZG9uJ3QgaGF2ZSBlcXVhbCBwcmVjZWRlbmNlLg0KKyAgICAgICAgYWRkX29wOiAgICAgICAgIGFkZCB8ICBzdWIgfCBjb25jYXQNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGVxIHwgbmUgfCBsZSB8IGdlIHwgbHQgfCBndCAgICMgT3JkZXIgaXMgaW1wb3J0YW50DQorDQorICAgICAgICBhZGQ6ICAgICAgICAgICAgJysnICB7ICdwdGdBZGQnICAgIH0NCisgICAgICAgIHN1YjogICAgICAgICAgICAnLScgIHsgJ3B0Z1N1YicgICAgfQ0KKyAgICAgICAgY29uY2F0OiAgICAgICAgICcmJyAgeyAncHRnQ29uY2F0JyB9DQorICAgICAgICBlcTogICAgICAgICAgICAgJz0nICB7ICdwdGdFUScgICAgIH0NCisgICAgICAgIG5lOiAgICAgICAgICAgICAnPD4nIHsgJ3B0Z05FJyAgICAgfQ0KKyAgICAgICAgbGU6ICAgICAgICAgICAgICc8PScgeyAncHRnTEUnICAgICB9DQorICAgICAgICBnZTogICAgICAgICAgICAgJz49JyB7ICdwdGdHRScgICAgIH0NCisgICAgICAgIGx0OiAgICAgICAgICAgICAnPCcgIHsgJ3B0Z0xUJyAgICAgfQ0KKyAgICAgICAgZ3Q6ICAgICAgICAgICAgICc+JyAgeyAncHRnR1QnICAgICB9DQorDQorDQorICAgICAgICBtdWx0aXBsaWNhdGlvbjogPGxlZnRvcDogZXhwb25lbnRpb24gbXVsdF9vcCBleHBvbmVudGlvbj4NCisNCisgICAgICAgIG11bHRfb3A6ICAgICAgICBtdWx0ICB8IGRpdg0KKyAgICAgICAgbXVsdDogICAgICAgICAgICcqJyB7ICdwdGdNdWwnIH0NCisgICAgICAgIGRpdjogICAgICAgICAgICAnLycgeyAncHRnRGl2JyB9DQorDQorICAgICAgICAjIExlZnQgYXNzb2NpYXRpdmUgKGFwcGFyZW50bHkpDQorICAgICAgICBleHBvbmVudGlvbjogICAgPGxlZnRvcDogZmFjdG9yIGV4cF9vcCBmYWN0b3I+DQorDQorICAgICAgICBleHBfb3A6ICAgICAgICAgJ14nIHsgJ3B0Z1Bvd2VyJyB9DQorDQorICAgICAgICBmYWN0b3I6ICAgICAgICAgbnVtYmVyICAgICAgICMgT3JkZXIgaXMgaW1wb3J0YW50DQorICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHJhbmdlMmQNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHJhbmdlM2QNCisgICAgICAgICAgICAgICAgICAgICAgICB8IHRydWUNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGZhbHNlDQorICAgICAgICAgICAgICAgICAgICAgICAgfCByZWYyZA0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVmM2QNCisgICAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmN0aW9uDQorICAgICAgICAgICAgICAgICAgICAgICAgfCBuYW1lDQorICAgICAgICAgICAgICAgICAgICAgICAgfCAnKCcgZXhwciAnKScgIHsgWyRpdGVtWzJdLCAncHRnUGFyZW4nXSB9DQorDQorICAgICAgICAjIE1hdGNoIGEgc3RyaW5nLg0KKyAgICAgICAgIyBSZWdleCBieSBtZXJseW4uIFNlZSBodHRwOi8vd3d3LnBlcmxtb25rcy5vcmcvaW5kZXgucGw/bm9kZV9pZD0zMzAyODANCisgICAgICAgICMNCisgICAgICAgIHN0cmluZzogICAgICAgICAgIC8iKFteIl18IiIpKiIvICAgICAjIiBGb3IgZWRpdG9ycw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWyAnX3N0cicsICRpdGVtWzFdXSB9DQorDQorICAgICAgICAjIE1hdGNoIGZsb2F0IG9yIGludGVnZXINCisgICAgICAgIG51bWJlcjogICAgICAgICAgIC8oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/Lw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfbnVtJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTm90ZTogVGhlIGhpZ2hlc3QgY29sdW1uIHZhbHVlcyBpcyBJVi4gVGhlIGZvbGxvd2luZyByZWdleGVzIG1hdGNoDQorICAgICAgICAjIHVwIHRvIElaLiBPdXQgb2YgcmFuZ2UgdmFsdWVzIGFyZSBjYXVnaHQgaW4gdGhlIGNvZGUuDQorICAgICAgICAjDQorICAgICAgICAjIE5vdGU6IHNoZWV0bmFtZXMgd2l0aCB3aGl0ZXNwYWNlLCBjb21tYXMsIG9yIHBhcmVudGhlc2VzIG11c3QgYmUgaW4NCisgICAgICAgICMgc2luZ2xlIHF1b3Rlcy4gQXBwbGllcyB0byByZWYzZCBhbmQgcmFuZ2UzZA0KKyAgICAgICAgIw0KKw0KKyAgICAgICAgIyBNYXRjaCBBMSwgJEExLCBBJDEgb3IgJEEkMS4NCisgICAgICAgIHJlZjJkOiAgICAgICAgICAgIC9cJD9bQS1JXT9bQS1aXVwkP1xkKy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JlZjJkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYW4gZXh0ZXJuYWwgc2hlZXQgcmVmZXJlbmNlOiBTaGVldDEhQTEgb3IgJ1NoZWV0ICgxKSchQTENCisgICAgICAgIHJlZjNkOiAgICAgICAgICAgIC9bXiEoLF0rIVwkP1tBLUldP1tBLVpdXCQ/XGQrLw0KKyAgICAgICAgICAgICAgICAgICAgICAgIHsgWydfcmVmM2QnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgLydbXiddKychXCQ/W0EtSV0/W0EtWl1cJD9cZCsvDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yZWYzZCcsICRpdGVtWzFdXSB9DQorDQorICAgICAgICAjIE1hdGNoIEExOkM1LCAkQTE6JEM1IG9yIEE6QyBldGMuDQorICAgICAgICByYW5nZTJkOiAgICAgICAgICAvXCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT86XCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT8vDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yYW5nZTJkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYW4gZXh0ZXJuYWwgc2hlZXQgcmFuZ2UuICdTaGVldCAxOlNoZWV0IDInIUIyOkM1DQorICAgICAgICByYW5nZTNkOiAgICAgICAgICAvW14hKCxdKyFcJD9bQS1JXT9bQS1aXVwkPyhcZCspPzpcJD9bQS1JXT9bQS1aXVwkPyhcZCspPy8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX3JhbmdlM2QnLCAkaXRlbVsxXV0gfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIHwgLydbXiddKychXCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT86XCQ/W0EtSV0/W0EtWl1cJD8oXGQrKT8vDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19yYW5nZTNkJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYSBmdW5jdGlvbiBuYW1lLg0KKyAgICAgICAgZnVuY3Rpb246ICAgICAgICAgL1tBLVowLTnALdxfLl0rLyAnKCknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB8IC9bQS1aMC05wC3cXy5dKy8gJygnIGV4cHIgJyknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19jbGFzcycsICRpdGVtWzFdLCAkaXRlbVszXSwgJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisgICAgICAgICAgICAgICAgICAgICAgICB8IC9bQS1aMC05wC3cXy5dKy8gJygnIGxpc3QgJyknDQorICAgICAgICAgICAgICAgICAgICAgICAgeyBbJ19jbGFzcycsICRpdGVtWzFdLCAkaXRlbVszXSwgJ19mdW5jJywgJGl0ZW1bMV1dIH0NCisNCisgICAgICAgICMgTWF0Y2ggYSBkZWZpbmVkIG5hbWUuDQorICAgICAgICBuYW1lOiAgICAgICAgICAgL1tBLVphLXpfXVx3Ky8NCisgICAgICAgICAgICAgICAgICAgICAgICB7IFsnX25hbWUnLCAkaXRlbVsxXV0gfQ0KKw0KKyAgICAgICAgIyBCb29sZWFuIHZhbHVlcy4NCisgICAgICAgIHRydWU6ICAgICAgICAgICAnVFJVRScgIHsgWyAncHRnQm9vbCcsIDEgXSB9DQorDQorICAgICAgICBmYWxzZTogICAgICAgICAgJ0ZBTFNFJyB7IFsgJ3B0Z0Jvb2wnLCAwIF0gfQ0KKw0KK0VuZEdyYW1tYXINCisNCitwcmludCAiSW5pdF9wYXJzZXIuXG5cbiIgaWYgJF9kZWJ1ZzsNCit9DQorDQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIHBhcnNlX2Zvcm11bGEoKQ0KKyMNCisjIFRha2VzIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiBhIGZvcm11bGEgYW5kIHJldHVybnMgYSBSUE4gZW5jb2RlZCBieXRlDQorIyBzdHJpbmcuDQorIw0KK3N1YiBwYXJzZV9mb3JtdWxhIHsNCisNCisgICAgbXkgJHNlbGY9IHNoaWZ0Ow0KKw0KKyAgICAjIEluaXRpYWxpc2UgdGhlIHBhcnNlciBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsDQorICAgICRzZWxmLT5faW5pdF9wYXJzZXIoKSBpZiBub3QgZGVmaW5lZCAkcGFyc2VyOw0KKw0KKyAgICBteSAkZm9ybXVsYSA9IHNoaWZ0IEBfOw0KKyAgICBteSAkdG9rZW5zOw0KKw0KKyAgICBwcmludCAkZm9ybXVsYSwgIlxuIiBpZiAkX2RlYnVnOw0KKw0KKyAgICAjIEJ1aWxkIHRoZSBwYXJzZSB0cmVlIGZvciB0aGUgZm9ybXVsYQ0KKyAgICBteSAkcGFyc2V0cmVlID0kcGFyc2VyLT5leHByKCRmb3JtdWxhKTsNCisNCisgICAgIyBDaGVjayBpZiBwYXJzaW5nIHdvcmtlZC4NCisgICAgaWYgKGRlZmluZWQgJHBhcnNldHJlZSkgew0KKyAgICAgICAgbXkgQHRva2VucyA9ICRzZWxmLT5fcmV2ZXJzZV90cmVlKEAkcGFyc2V0cmVlKTsNCisNCisgICAgICAgICMgQWRkIGEgdm9sYXRpbGUgdG9rZW4gaWYgdGhlIGZvcm11bGEgY29udGFpbnMgYSB2b2xhdGlsZSBmdW5jdGlvbi4NCisgICAgICAgICMgVGhpcyBtdXN0IGJlIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgbGlzdA0KKyAgICAgICAgIw0KKyAgICAgICAgdW5zaGlmdCBAdG9rZW5zLCAnX3ZvbCcgaWYgJHNlbGYtPl9jaGVja192b2xhdGlsZShAdG9rZW5zKTsNCisNCisgICAgICAgICMgVGhlIHJldHVybiB2YWx1ZSBkZXBlbmRzIG9uIHdoaWNoIFdvcmtzaGVldC5wbSBtZXRob2QgaXMgdGhlIGNhbGxlcg0KKyAgICAgICAgaWYgKHdhbnRhcnJheSkgew0KKyAgICAgICAgICAgICMgUGFyc2UgZm9ybXVsYSB0byBzZWUgaWYgaXQgdGhyb3dzIGFueSBlcnJvcnMgYW5kIHRoZW4NCisgICAgICAgICAgICAjIHJldHVybiByYXcgdG9rZW5zIHRvIFdvcmtzaGVldDo6c3RvcmVfZm9ybXVsYSgpDQorICAgICAgICAgICAgIw0KKyAgICAgICAgICAgICRzZWxmLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7DQorICAgICAgICAgICAgcmV0dXJuIEB0b2tlbnM7DQorICAgICAgICB9DQorICAgICAgICBlbHNlew0KKyAgICAgICAgICAgICMgUmV0dXJuIGJ5dGUgc3RyZWFtIHRvIFdvcmtzaGVldDo6d3JpdGVfZm9ybXVsYSgpDQorICAgICAgICAgICAgcmV0dXJuICRzZWxmLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7DQorICAgICAgICB9DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICBkaWUgIkNvdWxkbid0IHBhcnNlIGZvcm11bGE6ID0kZm9ybXVsYVxuIjsNCisgICAgfQ0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgcGFyc2VfdG9rZW5zKCkNCisjDQorIyBDb252ZXJ0IGVhY2ggdG9rZW4gb3IgdG9rZW4gcGFpciB0byBpdHMgRXhjZWwgJ3B0ZycgZXF1aXZhbGVudC4NCisjDQorc3ViIHBhcnNlX3Rva2VucyB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkcGFyc2Vfc3RyICAgPSAnJzsNCisgICAgbXkgJGxhc3RfdHlwZSAgID0gJyc7DQorICAgIG15ICRtb2RpZmllciAgICA9ICcnOw0KKyAgICBteSAkbnVtX2FyZ3MgICAgPSAwOw0KKyAgICBteSAkY2xhc3MgICAgICAgPSAwOw0KKyAgICBteSBAY2xhc3MgICAgICAgPSAxOw0KKyAgICBteSBAdG9rZW5zICAgICAgPSBAXzsNCisNCisNCisgICAgIyBBIG5vdGUgYWJvdXQgdGhlIGNsYXNzIG1vZGlmaWVycyB1c2VkIGJlbG93LiBJbiBnZW5lcmFsIHRoZSBjbGFzcywNCisgICAgIyAicmVmZXJlbmNlIiBvciAidmFsdWUiLCBvZiBhIGZ1bmN0aW9uIGlzIGFwcGxpZWQgdG8gYWxsIG9mIGl0cyBvcGVyYW5kcy4NCisgICAgIyBIb3dldmVyLCBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgdGhlIG9wZXJhbmRzIGNhbiBoYXZlIG1peGVkIGNsYXNzZXMsDQorICAgICMgZS5nLiA9VkxPT0tVUCB3aXRoIGV4dGVybmFsIHJlZmVyZW5jZXMuIFRoZXNlIHdpbGwgZXZlbnR1YWxseSBiZSBkZWFsdA0KKyAgICAjIHdpdGggYnkgdGhlIHBhcnNlci4gSG93ZXZlciwgYXMgYSB3b3JrYXJvdW5kIHRoZSBjbGFzcyB0eXBlIG9mIGEgdG9rZW4NCisgICAgIyBjYW4gYmUgY2hhbmdlZCB2aWEgdGhlIHJlcGVhdF9mb3JtdWxhIGludGVyZmFjZS4gVGh1cywgYSBfcmVmMmQgdG9rZW4gY2FuDQorICAgICMgYmUgY2hhbmdlZCBieSB0aGUgdXNlciB0byBfcmVmMmRBIG9yIF9yZWYyZFIgdG8gY2hhbmdlIGl0cyB0b2tlbiBjbGFzcy4NCisgICAgIw0KKyAgICB3aGlsZSAoQF8pIHsNCisgICAgICAgIG15ICR0b2tlbiA9IHNoaWZ0IEBfOw0KKw0KKyAgICAgICAgaWYgKCR0b2tlbiBlcSAnX2FyZycpIHsNCisgICAgICAgICAgICAkbnVtX2FyZ3MgPSBzaGlmdCBAXzsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19jbGFzcycpIHsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkY2xhc3MgPSAkZnVuY3Rpb25zeyR0b2tlbn1bMl07DQorICAgICAgICAgICAgIyBJZiAkY2xhc3MgaXMgdW5kZWYgdGhlbiBpdCBtZWFucyB0aGF0IHRoZSBmdW5jdGlvbiBpc24ndCB2YWxpZC4NCisgICAgICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gJHRva2VuKCkgaW4gZm9ybXVsYVxuIiB1bmxlc3MgZGVmaW5lZCAkY2xhc3M7DQorICAgICAgICAgICAgcHVzaCBAY2xhc3MsICRjbGFzczsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ192b2wnKSB7DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAgLj0gJHNlbGYtPl9jb252ZXJ0X3ZvbGF0aWxlKCk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdwdGdCb29sJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X2Jvb2woJHRva2VuKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gZXEgJ19udW0nKSB7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfbnVtYmVyKCR0b2tlbik7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdfc3RyJykgew0KKyAgICAgICAgICAgICR0b2tlbiA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3N0cmluZygkdG9rZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiA9fiAvXl9yZWYyZC8pIHsNCisgICAgICAgICAgICAoJG1vZGlmaWVyICA9ICR0b2tlbikgPX4gcy9fcmVmMmQvLzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9ICRjbGFzc1stMV07DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAwIGlmICRtb2RpZmllciBlcSAnUic7DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAxIGlmICRtb2RpZmllciBlcSAnVic7DQorICAgICAgICAgICAgJHRva2VuICAgICAgPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9yZWYyZCgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX3JlZjNkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yZWYzZC8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gICAgICA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3JlZjNkKCR0b2tlbiwgJGNsYXNzKTsNCisgICAgICAgIH0NCisgICAgICAgIGVsc2lmICgkdG9rZW4gPX4gL15fcmFuZ2UyZC8pIHsNCisgICAgICAgICAgICAoJG1vZGlmaWVyICA9ICR0b2tlbikgPX4gcy9fcmFuZ2UyZC8vOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gJGNsYXNzWy0xXTsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDAgaWYgJG1vZGlmaWVyIGVxICdSJzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9IDEgaWYgJG1vZGlmaWVyIGVxICdWJzsNCisgICAgICAgICAgICAkdG9rZW4gICAgICA9IHNoaWZ0IEBfOw0KKyAgICAgICAgICAgICRwYXJzZV9zdHIgLj0gJHNlbGYtPl9jb252ZXJ0X3JhbmdlMmQoJHRva2VuLCAkY2xhc3MpOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKCR0b2tlbiA9fiAvXl9yYW5nZTNkLykgew0KKyAgICAgICAgICAgICgkbW9kaWZpZXIgID0gJHRva2VuKSA9fiBzL19yYW5nZTNkLy87DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAkY2xhc3NbLTFdOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMCBpZiAkbW9kaWZpZXIgZXEgJ1InOw0KKyAgICAgICAgICAgICRjbGFzcyAgICAgID0gMSBpZiAkbW9kaWZpZXIgZXEgJ1YnOw0KKyAgICAgICAgICAgICR0b2tlbiAgICAgID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfcmFuZ2UzZCgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuID1+IC9eX25hbWUvKSB7DQorICAgICAgICAgICAgKCRtb2RpZmllciAgPSAkdG9rZW4pID1+IHMvX25hbWUvLzsNCisgICAgICAgICAgICAkY2xhc3MgICAgICA9ICRjbGFzc1stMV07DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAwIGlmICRtb2RpZmllciBlcSAnUic7DQorICAgICAgICAgICAgJGNsYXNzICAgICAgPSAxIGlmICRtb2RpZmllciBlcSAnVic7DQorICAgICAgICAgICAgJHRva2VuID0gc2hpZnQgQF87DQorICAgICAgICAgICAgJHBhcnNlX3N0ciAuPSAkc2VsZi0+X2NvbnZlcnRfbmFtZSgkdG9rZW4sICRjbGFzcyk7DQorICAgICAgICB9DQorICAgICAgICBlbHNpZiAoJHRva2VuIGVxICdfZnVuYycpIHsNCisgICAgICAgICAgICAkdG9rZW4gPSBzaGlmdCBAXzsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49ICRzZWxmLT5fY29udmVydF9mdW5jdGlvbigkdG9rZW4sICRudW1fYXJncyk7DQorICAgICAgICAgICAgcG9wIEBjbGFzczsNCisgICAgICAgICAgICAkbnVtX2FyZ3MgPSAwOyAjIFJlc2V0IGFmdGVyIHVzZQ0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzaWYgKGV4aXN0cyAkcHRneyR0b2tlbn0pIHsNCisgICAgICAgICAgICAkcGFyc2Vfc3RyIC49IHBhY2soIkMiLCAkcHRneyR0b2tlbn0pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgIyBVbnJlY29nbmlzZWQgdG9rZW4NCisgICAgICAgICAgICByZXR1cm4gdW5kZWY7DQorICAgICAgICB9DQorICAgIH0NCisNCisNCisgICAgaWYgKCRfZGVidWcpIHsNCisgICAgICAgIHByaW50IGpvaW4oIiAiLCBtYXAgeyBzcHJpbnRmICIlMDJYIiwgJF8gfSB1bnBhY2soIkMqIiwkcGFyc2Vfc3RyKSk7DQorICAgICAgICBwcmludCAiXG5cbiI7DQorICAgICAgICBwcmludCBqb2luKCIgIiwgQHRva2VucyksICJcblxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHBhcnNlX3N0cjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjICBfcmV2ZXJzZV90cmVlKCkNCisjDQorIyBUaGlzIGZ1bmN0aW9uIGRlc2NlbmRzIHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIHBhcnNlIHRyZWUuIEF0IGVhY2ggbGV2ZWwgaXQNCisjIHN3YXBzIHRoZSBvcmRlciBvZiBhbiBvcGVyYXRvciBmb2xsb3dlZCBieSBhbiBvcGVyYW5kLg0KKyMgRm9yIGV4YW1wbGUsIDErMiozIHdvdWxkIGJlIGNvbnZlcnRlZCBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOg0KKyMgICAgICAgICAgICAgICAxICsgMiAqIDMNCisjICAgICAgICAgICAgICAgMSArICgyICogMykNCisjICAgICAgICAgICAgICAgMSArICgyIDMgKikNCisjICAgICAgICAgICAgICAgMSAoMiAzICopICsNCisjICAgICAgICAgICAgICAgMSAyIDMgKiArDQorIw0KK3N1YiBfcmV2ZXJzZV90cmVlDQorew0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKw0KKyAgICBteSBAdG9rZW5zOw0KKyAgICBteSBAZXhwcmVzc2lvbiA9IEBfOw0KKyAgICBteSBAc3RhY2s7DQorDQorICAgIHdoaWxlIChAZXhwcmVzc2lvbikgew0KKyAgICAgICAgbXkgJHRva2VuID0gc2hpZnQgQGV4cHJlc3Npb247DQorDQorICAgICAgICAjIElmIHRoZSB0b2tlbiBpcyBhbiBvcGVyYXRvciBzd2FwIGl0IHdpdGggdGhlIGZvbGxvd2luZyBvcGVyYW5kDQorICAgICAgICBpZiAoICAgICR0b2tlbiBlcSAncHRnQWRkJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnU3ViJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnQ29uY2F0JyAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTXVsJyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnRGl2JyAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnUG93ZXInICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnRVEnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTkUnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTEUnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnR0UnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnTFQnICAgICAgIHx8DQorICAgICAgICAgICAgICAgICR0b2tlbiBlcSAncHRnR1QnKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG15ICRvcGVyYW5kID0gc2hpZnQgQGV4cHJlc3Npb247DQorICAgICAgICAgICAgcHVzaCBAc3RhY2ssICRvcGVyYW5kOw0KKyAgICAgICAgfQ0KKw0KKyAgICAgICAgcHVzaCBAc3RhY2ssICR0b2tlbjsNCisgICAgfQ0KKw0KKyAgICAjIFJlY3Vyc2UgdGhyb3VnaCB0aGUgcGFyc2UgdHJlZQ0KKyAgICBmb3JlYWNoIG15ICR0b2tlbiAoQHN0YWNrKSB7DQorICAgICAgICBpZiAocmVmKCR0b2tlbikpIHsNCisgICAgICAgICAgICBwdXNoIEB0b2tlbnMsICRzZWxmLT5fcmV2ZXJzZV90cmVlKEAkdG9rZW4pOw0KKyAgICAgICAgfQ0KKyAgICAgICAgZWxzZSB7DQorICAgICAgICAgICAgcHVzaCBAdG9rZW5zLCAkdG9rZW47DQorICAgICAgICB9DQorICAgIH0NCisNCisgICAgcmV0dXJuICBAdG9rZW5zOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgIF9jaGVja192b2xhdGlsZSgpDQorIw0KKyMgQ2hlY2sgaWYgdGhlIGZvcm11bGEgY29udGFpbnMgYSB2b2xhdGlsZSBmdW5jdGlvbiwgaS5lLiBhIGZ1bmN0aW9uIHRoYXQgbXVzdA0KKyMgYmUgcmVjYWxjdWxhdGVkIGVhY2ggdGltZSBhIGNlbGwgaXMgdXBkYXRlZC4gVGhlc2UgZm9ybXVsYXMgcmVxdWlyZSBhIHB0Z0F0dHINCisjIHdpdGggdGhlIHZvbGF0aWxlIGZsYWcgc2V0IGFzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgcGFyc2VkIGV4cHJlc3Npb24uDQorIw0KKyMgRXhhbXBsZXMgb2Ygdm9sYXRpbGUgZnVuY3Rpb25zOiBSQU5EKCksIE5PVygpLCBUT0RBWSgpDQorIw0KK3N1YiBfY2hlY2tfdm9sYXRpbGUgew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgQHRva2VucyAgID0gQF87DQorICAgIG15ICR2b2xhdGlsZSA9IDA7DQorDQorICAgIGZvciBteSAkaSAoMC4uQHRva2Vucy0xKSB7DQorICAgICAgICAjIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZnVuY3Rpb24gY2hlY2sgaWYgaXQgaXMgdm9sYXRpbGUuDQorICAgICAgICBpZiAoJHRva2Vuc1skaV0gZXEgJ19mdW5jJyBhbmQgJGZ1bmN0aW9uc3skdG9rZW5zWyRpKzFdfVszXSkgew0KKyAgICAgICAgICAgICR2b2xhdGlsZSA9IDE7DQorICAgICAgICAgICAgbGFzdDsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHZvbGF0aWxlOw0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgX2NvbnZlcnRfdm9sYXRpbGUoKQ0KKyMNCisjIENvbnZlcnQgX3ZvbCB0byBhIHB0Z0F0dHIgdGFnIGZvcm1hdHRlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBmb3JtdWxhIGNvbnRhaW5zDQorIyBhIHZvbGF0aWxlIGZ1bmN0aW9uLiBTZWUgX2NoZWNrX3ZvbGF0aWxlKCkNCisjDQorc3ViIF9jb252ZXJ0X3ZvbGF0aWxlIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisNCisgICAgIyBTZXQgYml0RmF0dHJTZW1pIGZsYWcgdG8gaW5kaWNhdGUgdm9sYXRpbGUgZnVuY3Rpb24sICJ3IiBpcyBzZXQgdG8gemVyby4NCisgICAgcmV0dXJuIHBhY2soIkNDdiIsICRwdGd7cHRnQXR0cn0sIDB4MSwgMHgwKTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X2Jvb2woKQ0KKyMNCisjIENvbnZlcnQgYSBib29sZWFuIHRva2VuIHRvIHB0Z0Jvb2wNCisjDQorc3ViIF9jb252ZXJ0X2Jvb2wgew0KKw0KKyAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KKyAgICBteSAkYm9vbCA9IHNoaWZ0Ow0KKw0KKyAgICByZXR1cm4gcGFjaygiQ0MiLCAkcHRne3B0Z0Jvb2x9LCAkYm9vbCk7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9udW1iZXIoKQ0KKyMNCisjIENvbnZlcnQgYSBudW1iZXIgdG9rZW4gdG8gcHRnSW50IG9yIHB0Z051bQ0KKyMNCitzdWIgX2NvbnZlcnRfbnVtYmVyIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJG51bSAgPSBzaGlmdDsNCisNCisgICAgIyBJbnRlZ2VyIGluIHRoZSByYW5nZSAwLi4yKioxNi0xDQorICAgIGlmICgoJG51bSA9fiAvXlxkKyQvKSAmJiAoJG51bSA8PSA2NTUzNSkpIHsNCisgICAgICAgIHJldHVybiBwYWNrKCJDdiIsICRwdGd7cHRnSW50fSwgJG51bSk7DQorICAgIH0NCisgICAgZWxzZSB7ICMgQSBmbG9hdA0KKyAgICAgICAgJG51bSA9IHBhY2soImQiLCAkbnVtKTsNCisgICAgICAgICRudW0gPSByZXZlcnNlICRudW0gaWYgJHNlbGYtPntfYnl0ZV9vcmRlcn07DQorICAgICAgICByZXR1cm4gcGFjaygiQyIsICRwdGd7cHRnTnVtfSkgLiAkbnVtOw0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9zdHJpbmcoKQ0KKyMNCisjIENvbnZlcnQgYSBzdHJpbmcgdG8gYSBwdGcgU3RyLg0KKyMNCitzdWIgX2NvbnZlcnRfc3RyaW5nIHsNCisNCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7DQorICAgIG15ICRzdHIgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkZW5jb2RpbmcgPSAwOw0KKw0KKyAgICAkc3RyID1+IHMvXiIvLzsgICAjIFJlbW92ZSBsZWFkaW5nICAiDQorICAgICRzdHIgPX4gcy8iJC8vOyAgICMgUmVtb3ZlIHRyYWlsaW5nICINCisgICAgJHN0ciA9fiBzLyIiLyIvZzsgIyBTdWJzdGl0dXRlIEV4Y2VsJ3MgZXNjYXBlZCBkb3VibGUgcXVvdGUgIiIgZm9yICINCisNCisgICAgbXkgJGxlbmd0aCA9IGxlbmd0aCgkc3RyKTsNCisNCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44Lg0KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsNCisgICAgICAgIHJlcXVpcmUgRW5jb2RlOw0KKw0KKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyKSkgew0KKyAgICAgICAgICAgICRzdHIgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyKTsNCisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOw0KKyAgICAgICAgfQ0KKyAgICB9DQorDQorICAgIGRpZSAiU3RyaW5nIGluIGZvcm11bGEgaGFzIG1vcmUgdGhhbiAyNTUgY2hhcnNcbiIgaWYgJGxlbmd0aCA+IDI1NTsNCisNCisgICAgcmV0dXJuIHBhY2soIkNDQyIsICRwdGd7cHRnU3RyfSwgJGxlbmd0aCwgJGVuY29kaW5nKSAuICRzdHI7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9yZWYyZCgpDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCByZWZlcmVuY2Ugc3VjaCBhcyBBMSwgJEIyLCBDJDMgb3IgJEQkNCB0byBhIHB0Z1JlZlYuDQorIw0KK3N1YiBfY29udmVydF9yZWYyZCB7DQorDQorICAgIG15ICRzZWxmICA9IHNoaWZ0Ow0KKyAgICBteSAkY2VsbCAgPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdSZWY7DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2UNCisgICAgbXkgKCRyb3csICRjb2wpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwpOw0KKw0KKyAgICAjIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4NCisgICAgaWYgICAgKCRjbGFzcyA9PSAwKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmfSk7DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAxKSB7DQorICAgICAgICAkcHRnUmVmID0gcGFjaygiQyIsICRwdGd7cHRnUmVmVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZkF9KTsNCisgICAgfQ0KKyAgICBlbHNlew0KKyAgICAgICAgZGllICJVbmtub3duIGZ1bmN0aW9uIGNsYXNzIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisNCisgICAgcmV0dXJuICRwdGdSZWYgLiAkcm93IC4gJGNvbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JlZjNkDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCAzZCByZWZlcmVuY2Ugc3VjaCBhcyAiU2hlZXQxIUExIiBvciAiU2hlZXQxOlNoZWV0MiFBMSIgdG8gYQ0KKyMgcHRnUmVmM2RWLg0KKyMNCitzdWIgX2NvbnZlcnRfcmVmM2Qgew0KKw0KKyAgICBteSAkc2VsZiAgPSBzaGlmdDsNCisgICAgbXkgJHRva2VuID0gc2hpZnQ7DQorICAgIG15ICRjbGFzcyA9IHNoaWZ0Ow0KKyAgICBteSAkcHRnUmVmOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByZWYgYXQgdGhlICEgc3ltYm9sDQorICAgIG15ICgkZXh0X3JlZiwgJGNlbGwpID0gc3BsaXQgJyEnLCAkdG9rZW47DQorDQorICAgICMgQ29udmVydCB0aGUgZXh0ZXJuYWwgcmVmZXJlbmNlIHBhcnQNCisgICAgJGV4dF9yZWYgPSAkc2VsZi0+X3BhY2tfZXh0X3JlZigkZXh0X3JlZik7DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2UgcGFydA0KKyAgICBteSAoJHJvdywgJGNvbCkgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbCk7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdSZWYgPSBwYWNrKCJDIiwgJHB0Z3twdGdSZWYzZH0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMSkgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZjNkVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z1JlZiA9IHBhY2soIkMiLCAkcHRne3B0Z1JlZjNkQX0pOw0KKyAgICB9DQorICAgIGVsc2V7DQorICAgICAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gY2xhc3MgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gJHB0Z1JlZiAuICRleHRfcmVmLiAkcm93IC4gJGNvbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JhbmdlMmQoKQ0KKyMNCisjIENvbnZlcnQgYW4gRXhjZWwgcmFuZ2Ugc3VjaCBhcyBBMTpENCBvciBBOkQgdG8gYSBwdGdSZWZWLg0KKyMNCitzdWIgX2NvbnZlcnRfcmFuZ2UyZCB7DQorDQorICAgIG15ICRzZWxmICA9IHNoaWZ0Ow0KKyAgICBteSAkcmFuZ2UgPSBzaGlmdDsNCisgICAgbXkgJGNsYXNzID0gc2hpZnQ7DQorICAgIG15ICRwdGdBcmVhOw0KKw0KKyAgICAjIFNwbGl0IHRoZSByYW5nZSBpbnRvIDIgY2VsbCByZWZzDQorICAgIG15ICgkY2VsbDEsICRjZWxsMikgPSBzcGxpdCAnOicsICRyYW5nZTsNCisNCisgICAgIyBBIHJhbmdlIHN1Y2ggYXMgQTpEIGlzIGVxdWl2YWxlbnQgdG8gQTE6RDY1NTM2LCBzbyBhZGQgcm93cyBhcyByZXF1aXJlZA0KKyAgICAkY2VsbDEgLj0gJzEnICAgICBpZiAkY2VsbDEgIX4gL1xkLzsNCisgICAgJGNlbGwyIC49ICc2NTUzNicgaWYgJGNlbGwyICF+IC9cZC87DQorDQorICAgICMgQ29udmVydCB0aGUgY2VsbCByZWZlcmVuY2VzDQorICAgIG15ICgkcm93MSwgJGNvbDEpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwxKTsNCisgICAgbXkgKCRyb3cyLCAkY29sMikgPSAkc2VsZi0+X2NlbGxfdG9fcGFja2VkX3Jvd2NvbCgkY2VsbDIpOw0KKw0KKyAgICAjIFRoZSBwdGcgdmFsdWUgZGVwZW5kcyBvbiB0aGUgY2xhc3Mgb2YgdGhlIHB0Zy4NCisgICAgaWYgICAgKCRjbGFzcyA9PSAwKSB7DQorICAgICAgICAkcHRnQXJlYSA9IHBhY2soIkMiLCAkcHRne3B0Z0FyZWF9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYVZ9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDIpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYUF9KTsNCisgICAgfQ0KKyAgICBlbHNlew0KKyAgICAgICAgZGllICJVbmtub3duIGZ1bmN0aW9uIGNsYXNzIGluIGZvcm11bGFcbiI7DQorICAgIH0NCisNCisgICAgcmV0dXJuICRwdGdBcmVhIC4gJHJvdzEgLiAkcm93MiAuICRjb2wxLiAkY29sMjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jb252ZXJ0X3JhbmdlM2QNCisjDQorIyBDb252ZXJ0IGFuIEV4Y2VsIDNkIHJhbmdlIHN1Y2ggYXMgIlNoZWV0MSFBMTpENCIgb3IgIlNoZWV0MTpTaGVldDIhQTE6RDQiIHRvDQorIyBhIHB0Z0FyZWEzZFYuDQorIw0KK3N1YiBfY29udmVydF9yYW5nZTNkIHsNCisNCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkdG9rZW4gICAgID0gc2hpZnQ7DQorICAgIG15ICRjbGFzcyA9IHNoaWZ0Ow0KKyAgICBteSAkcHRnQXJlYTsNCisNCisgICAgIyBTcGxpdCB0aGUgcmVmIGF0IHRoZSAhIHN5bWJvbA0KKyAgICBteSAoJGV4dF9yZWYsICRyYW5nZSkgPSBzcGxpdCAnIScsICR0b2tlbjsNCisNCisgICAgIyBDb252ZXJ0IHRoZSBleHRlcm5hbCByZWZlcmVuY2UgcGFydA0KKyAgICAkZXh0X3JlZiA9ICRzZWxmLT5fcGFja19leHRfcmVmKCRleHRfcmVmKTsNCisNCisgICAgIyBTcGxpdCB0aGUgcmFuZ2UgaW50byAyIGNlbGwgcmVmcw0KKyAgICBteSAoJGNlbGwxLCAkY2VsbDIpID0gc3BsaXQgJzonLCAkcmFuZ2U7DQorDQorICAgICMgQSByYW5nZSBzdWNoIGFzIEE6RCBpcyBlcXVpdmFsZW50IHRvIEExOkQ2NTUzNiwgc28gYWRkIHJvd3MgYXMgcmVxdWlyZWQNCisgICAgJGNlbGwxIC49ICcxJyAgICAgaWYgJGNlbGwxICF+IC9cZC87DQorICAgICRjZWxsMiAuPSAnNjU1MzYnIGlmICRjZWxsMiAhfiAvXGQvOw0KKw0KKyAgICAjIENvbnZlcnQgdGhlIGNlbGwgcmVmZXJlbmNlcw0KKyAgICBteSAoJHJvdzEsICRjb2wxKSA9ICRzZWxmLT5fY2VsbF90b19wYWNrZWRfcm93Y29sKCRjZWxsMSk7DQorICAgIG15ICgkcm93MiwgJGNvbDIpID0gJHNlbGYtPl9jZWxsX3RvX3BhY2tlZF9yb3djb2woJGNlbGwyKTsNCisNCisgICAgIyBUaGUgcHRnIHZhbHVlIGRlcGVuZHMgb24gdGhlIGNsYXNzIG9mIHRoZSBwdGcuDQorICAgIGlmICAgICgkY2xhc3MgPT0gMCkgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhM2R9KTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdBcmVhID0gcGFjaygiQyIsICRwdGd7cHRnQXJlYTNkVn0pOw0KKyAgICB9DQorICAgIGVsc2lmICgkY2xhc3MgPT0gMikgew0KKyAgICAgICAgJHB0Z0FyZWEgPSBwYWNrKCJDIiwgJHB0Z3twdGdBcmVhM2RBfSk7DQorICAgIH0NCisgICAgZWxzZXsNCisgICAgICAgIGRpZSAiVW5rbm93biBmdW5jdGlvbiBjbGFzcyBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorDQorICAgIHJldHVybiAkcHRnQXJlYSAuICRleHRfcmVmIC4gJHJvdzEgLiAkcm93MiAuICRjb2wxLiAkY29sMjsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9wYWNrX2V4dF9yZWYoKQ0KKyMNCisjIENvbnZlcnQgdGhlIHNoZWV0IG5hbWUgcGFydCBvZiBhbiBleHRlcm5hbCByZWZlcmVuY2UsIGZvciBleGFtcGxlICJTaGVldDEiIG9yDQorIyAiU2hlZXQxOlNoZWV0MiIsIHRvIGEgcGFja2VkIHN0cnVjdHVyZS4NCisjDQorc3ViIF9wYWNrX2V4dF9yZWYgew0KKw0KKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0Ow0KKyAgICBteSAkZXh0X3JlZiA9IHNoaWZ0Ow0KKyAgICBteSAkc2hlZXQxOw0KKyAgICBteSAkc2hlZXQyOw0KKw0KKyAgICAkZXh0X3JlZiA9fiBzL14nLy87ICAgIyBSZW1vdmUgbGVhZGluZyAgJyBpZiBhbnkuDQorICAgICRleHRfcmVmID1+IHMvJyQvLzsgICAjIFJlbW92ZSB0cmFpbGluZyAnIGlmIGFueS4NCisNCisgICAgIyBDaGVjayBpZiB0aGVyZSBpcyBhIHNoZWV0IHJhbmdlIGVnLiwgU2hlZXQxOlNoZWV0Mi4NCisgICAgaWYgKCRleHRfcmVmID1+IC86Lykgew0KKyAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gc3BsaXQgJzonLCAkZXh0X3JlZjsNCisNCisgICAgICAgICRzaGVldDEgPSAkc2VsZi0+X2dldF9zaGVldF9pbmRleCgkc2hlZXQxKTsNCisgICAgICAgICRzaGVldDIgPSAkc2VsZi0+X2dldF9zaGVldF9pbmRleCgkc2hlZXQyKTsNCisNCisgICAgICAgICMgUmV2ZXJzZSBtYXggYW5kIG1pbiBzaGVldCBudW1iZXJzIGlmIG5lY2Vzc2FyeQ0KKyAgICAgICAgaWYgKCRzaGVldDEgPiAkc2hlZXQyKSB7DQorICAgICAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gKCRzaGVldDIsICRzaGVldDEpOw0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgIyBTaW5nbGUgc2hlZXQgbmFtZSBvbmx5Lg0KKyAgICAgICAgKCRzaGVldDEsICRzaGVldDIpID0gKCRleHRfcmVmLCAkZXh0X3JlZik7DQorDQorICAgICAgICAkc2hlZXQxID0gJHNlbGYtPl9nZXRfc2hlZXRfaW5kZXgoJHNoZWV0MSk7DQorICAgICAgICAkc2hlZXQyID0gJHNoZWV0MTsNCisgICAgfQ0KKw0KKyAgICBteSAka2V5ID0gIiRzaGVldDE6JHNoZWV0MiI7DQorICAgIG15ICRpbmRleDsNCisNCisgICAgaWYgKGV4aXN0cyAkc2VsZi0+e19leHRfcmVmc30tPnska2V5fSkgew0KKyAgICAgICAgJGluZGV4ID0gJHNlbGYtPntfZXh0X3JlZnN9LT57JGtleX07DQorICAgIH0NCisgICAgZWxzZSB7DQorICAgICAgICAkaW5kZXggPSAkc2VsZi0+e19leHRfcmVmX2NvdW50fTsNCisgICAgICAgICRzZWxmLT57X2V4dF9yZWZzfS0+eyRrZXl9ID0gJGluZGV4Ow0KKyAgICAgICAgJHNlbGYtPntfZXh0X3JlZl9jb3VudH0rKzsNCisgICAgfQ0KKw0KKyAgICByZXR1cm4gcGFjaygidiIsJGluZGV4KTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9nZXRfc2hlZXRfaW5kZXgoKQ0KKyMNCisjIExvb2sgdXAgdGhlIGluZGV4IHRoYXQgY29ycmVzcG9uZHMgdG8gYW4gZXh0ZXJuYWwgc2hlZXQgbmFtZS4gVGhlIGhhc2ggb2YNCisjIHNoZWV0IG5hbWVzIGlzIHVwZGF0ZWQgYnkgdGhlIGFkZF93b3Jrc2hlZXQoKSBtZXRob2Qgb2YgdGhlIFdvcmtib29rIGNsYXNzLg0KKyMNCitzdWIgX2dldF9zaGVldF9pbmRleCB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkc2hlZXRfbmFtZSAgPSBzaGlmdDsNCisNCisgICAgIyBIYW5kbGUgdXRmOCBzaGVldG5hbWVzIGluIHBlcmwgNS44Lg0KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsNCisgICAgICAgIHJlcXVpcmUgRW5jb2RlOw0KKw0KKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc2hlZXRfbmFtZSkpIHsNCisgICAgICAgICAgICAkc2hlZXRfbmFtZSA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRzaGVldF9uYW1lKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKw0KKyAgICBpZiAobm90IGV4aXN0cyAkc2VsZi0+e19leHRfc2hlZXRzfS0+eyRzaGVldF9uYW1lfSkgew0KKyAgICAgICAgZGllICJVbmtub3duIHNoZWV0IG5hbWUgJHNoZWV0X25hbWUgaW4gZm9ybXVsYVxuIjsNCisgICAgfQ0KKyAgICBlbHNlIHsNCisgICAgICAgIHJldHVybiAkc2VsZi0+e19leHRfc2hlZXRzfS0+eyRzaGVldF9uYW1lfTsNCisgICAgfQ0KK30NCisNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorIw0KKyMgc2V0X2V4dF9zaGVldHMoKQ0KKyMNCisjIFRoaXMgc2VtaS1wdWJsaWMgbWV0aG9kIGlzIHVzZWQgdG8gdXBkYXRlIHRoZSBoYXNoIG9mIHNoZWV0IG5hbWVzLiBJdCBpcw0KKyMgdXBkYXRlZCBieSB0aGUgYWRkX3dvcmtzaGVldCgpIG1ldGhvZCBvZiB0aGUgV29ya2Jvb2sgY2xhc3MuDQorIw0KK3N1YiBzZXRfZXh0X3NoZWV0cyB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkd29ya3NoZWV0ICAgPSBzaGlmdDsNCisgICAgbXkgJGluZGV4ICAgICAgID0gc2hpZnQ7DQorDQorICAgICMgVGhlIF9leHRfc2hlZXRzIGhhc2ggaXMgdXNlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiB3b3Jrc2hlZXQgbmFtZXMNCisgICAgIyBhbmQgdGhlaXIgaW5kZXgNCisgICAgJHNlbGYtPntfZXh0X3NoZWV0c30tPnskd29ya3NoZWV0fSA9ICRpbmRleDsNCisNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIGdldF9leHRfc2hlZXRzKCkNCisjDQorIyBUaGlzIHNlbWktcHVibGljIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgd29ya3NoZWV0IHJlZmVyZW5jZXMgdGhhdCB3ZXJlDQorIyB1c2VkIGluIGZvcm11bGFzIGZvciBpbmNsdXNpb24gaW4gdGhlIEVYVEVSTlNIRUVUIFdvcmtib29rIHJlY29yZC4NCisjDQorc3ViIGdldF9leHRfc2hlZXRzIHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorDQorICAgIHJldHVybiAleyRzZWxmLT57X2V4dF9yZWZzfX07DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBnZXRfZXh0X3JlZl9jb3VudCgpDQorIw0KKyMgVGhpcyBzZW1pLXB1YmxpYyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGhhc2ggb2Ygc2hlZXQgbmFtZXMuIEl0IGlzDQorIyB1cGRhdGVkIGJ5IHRoZSBhZGRfd29ya3NoZWV0KCkgbWV0aG9kIG9mIHRoZSBXb3JrYm9vayBjbGFzcy4NCisjDQorc3ViIGdldF9leHRfcmVmX2NvdW50IHsNCisNCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7DQorDQorICAgIHJldHVybiAkc2VsZi0+e19leHRfcmVmX2NvdW50fTsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9nZXRfbmFtZV9pbmRleCgpDQorIw0KKyMgTG9vayB1cCB0aGUgaW5kZXggdGhhdCBjb3JyZXNwb25kcyB0byBhbiBleHRlcm5hbCBkZWZpbmVkIG5hbWUuIFRoZSBoYXNoIG9mDQorIyBkZWZpbmVkIG5hbWVzIGlzIHVwZGF0ZWQgYnkgdGhlIGRlZmluZV9uYW1lKCkgbWV0aG9kIGluIHRoZSBXb3JrYm9vayBjbGFzcy4NCisjDQorc3ViIF9nZXRfbmFtZV9pbmRleCB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkbmFtZSAgICAgICAgPSBzaGlmdDsNCisNCisgICAgaWYgKG5vdCBleGlzdHMgJHNlbGYtPntfZXh0X25hbWVzfS0+eyRuYW1lfSkgew0KKyAgICAgICAgZGllICJVbmtub3duIGRlZmluZWQgbmFtZSAkbmFtZSBpbiBmb3JtdWxhXG4iOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgcmV0dXJuICRzZWxmLT57X2V4dF9uYW1lc30tPnskbmFtZX07DQorICAgIH0NCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIHNldF9leHRfbmFtZSgpDQorIw0KKyMgVGhpcyBzZW1pLXB1YmxpYyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGhhc2ggb2YgZGVmaW5lZCBuYW1lcy4NCisjDQorc3ViIHNldF9leHRfbmFtZSB7DQorDQorICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkbmFtZSAgICAgICAgPSBzaGlmdDsNCisgICAgbXkgJGluZGV4ICAgICAgID0gc2hpZnQ7DQorDQorICAgICRzZWxmLT57X2V4dF9uYW1lc30tPnskbmFtZX0gPSAkaW5kZXg7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9mdW5jdGlvbigpDQorIw0KKyMgQ29udmVydCBhIGZ1bmN0aW9uIHRvIGEgcHRnRnVuYyBvciBwdGdGdW5jVmFyViBkZXBlbmRpbmcgb24gdGhlIG51bWJlciBvZg0KKyMgYXJncyB0aGF0IGl0IHRha2VzLg0KKyMNCitzdWIgX2NvbnZlcnRfZnVuY3Rpb24gew0KKw0KKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsNCisgICAgbXkgJHRva2VuICAgID0gc2hpZnQ7DQorICAgIG15ICRudW1fYXJncyA9IHNoaWZ0Ow0KKw0KKyAgICBkaWUgIlVua25vd24gZnVuY3Rpb24gJHRva2VuKCkgaW4gZm9ybXVsYVxuIg0KKyAgICAgICAgdW5sZXNzIGRlZmluZWQgJGZ1bmN0aW9uc3skdG9rZW59WzBdOw0KKw0KKyAgICBteSAkYXJncyA9ICRmdW5jdGlvbnN7JHRva2VufVsxXTsNCisNCisgICAgIyBGaXhlZCBudW1iZXIgb2YgYXJncyBlZy4gVElNRSgkaSwkaiwkaykuDQorICAgIGlmICgkYXJncyA+PSAwKSB7DQorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBhcmdzIGlzIHZhbGlkLg0KKyAgICAgICAgaWYgKCRhcmdzICE9ICRudW1fYXJncykgew0KKyAgICAgICAgICAgIGRpZSAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgZm9yICR0b2tlbigpIGluIGZvcm11bGFcbiI7DQorICAgICAgICB9DQorICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICByZXR1cm4gcGFjaygiQ3YiLCAkcHRne3B0Z0Z1bmNWfSwgJGZ1bmN0aW9uc3skdG9rZW59WzBdKTsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICAjIFZhcmlhYmxlIG51bWJlciBvZiBhcmdzIGVnLiBTVU0oJGksJGosJGssIC4uKS4NCisgICAgaWYgKCRhcmdzID09IC0xKSB7DQorICAgICAgICByZXR1cm4gcGFjayAiQ0N2IiwgJHB0Z3twdGdGdW5jVmFyVn0sICRudW1fYXJncywgJGZ1bmN0aW9uc3skdG9rZW59WzBdOw0KKyAgICB9DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfY29udmVydF9uYW1lKCkNCisjDQorIyBDb252ZXJ0IGEgc3ltYm9saWMgbmFtZSBpbnRvIGEgbmFtZSByZWZlcmVuY2UuDQorIw0KK3N1YiBfY29udmVydF9uYW1lIHsNCisNCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7DQorICAgIG15ICRuYW1lICAgICA9IHNoaWZ0Ow0KKyAgICBteSAkY2xhc3MgICAgPSBzaGlmdDsNCisNCisgICAgbXkgJHB0Z05hbWU7DQorDQorICAgIG15ICRuYW1lX2luZGV4ID0gJHNlbGYtPl9nZXRfbmFtZV9pbmRleCgkbmFtZSk7DQorDQorICAgICMgVGhlIHB0ZyB2YWx1ZSBkZXBlbmRzIG9uIHRoZSBjbGFzcyBvZiB0aGUgcHRnLg0KKyAgICBpZiAgICAoJGNsYXNzID09IDApIHsNCisgICAgICAgICRwdGdOYW1lID0gJHB0Z3twdGdOYW1lfTsNCisgICAgfQ0KKyAgICBlbHNpZiAoJGNsYXNzID09IDEpIHsNCisgICAgICAgICRwdGdOYW1lID0gJHB0Z3twdGdOYW1lVn07DQorICAgIH0NCisgICAgZWxzaWYgKCRjbGFzcyA9PSAyKSB7DQorICAgICAgICAkcHRnTmFtZSA9ICRwdGd7cHRnTmFtZUF9Ow0KKyAgICB9DQorDQorDQorICAgIHJldHVybiBwYWNrICdDVicsICRwdGdOYW1lLCAkbmFtZV9pbmRleDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jZWxsX3RvX3Jvd2NvbCgkY2VsbF9yZWYpDQorIw0KKyMgQ29udmVydCBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBzdWNoIGFzIEExIG9yICRCMiBvciBDJDMgb3IgJEQkNCB0byBhIHplcm8NCisjIGluZGV4ZWQgcm93IGFuZCBjb2x1bW4gbnVtYmVyLiBBbHNvIHJldHVybnMgdHdvIGJvb2xlYW4gdmFsdWVzIHRvIGluZGljYXRlDQorIyB3aGV0aGVyIHRoZSByb3cgb3IgY29sdW1uIGFyZSByZWxhdGl2ZSByZWZlcmVuY2VzLg0KKyMgVE9ETyB1c2UgZnVuY3Rpb24gaW4gVXRpbGl0eS5wbQ0KKyMNCitzdWIgX2NlbGxfdG9fcm93Y29sIHsNCisNCisgICAgbXkgJHNlbGYgPSBzaGlmdDsNCisgICAgbXkgJGNlbGwgPSBzaGlmdDsNCisNCisgICAgJGNlbGwgPX4gLyhcJD8pKFtBLUldP1tBLVpdKShcJD8pKFxkKykvOw0KKw0KKyAgICBteSAkY29sX3JlbCA9ICQxIGVxICIiID8gMSA6IDA7DQorICAgIG15ICRjb2wgICAgID0gJDI7DQorICAgIG15ICRyb3dfcmVsID0gJDMgZXEgIiIgPyAxIDogMDsNCisgICAgbXkgJHJvdyAgICAgPSAkNDsNCisNCisgICAgIyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIGEgbnVtYmVyLg0KKyAgICAjIEFsbCB5b3VyIEJhc2UgYXJlIGJlbG9uZyB0byB1cy4NCisgICAgbXkgQGNoYXJzICA9IHNwbGl0IC8vLCAkY29sOw0KKyAgICBteSAkZXhwbiAgID0gMDsNCisgICAgJGNvbCAgICAgICA9IDA7DQorDQorICAgIHdoaWxlIChAY2hhcnMpIHsNCisgICAgICAgIG15ICRjaGFyID0gcG9wKEBjaGFycyk7ICMgTFMgY2hhciBmaXJzdA0KKyAgICAgICAgJGNvbCArPSAob3JkKCRjaGFyKSAtIG9yZCgnQScpICsgMSkgKiAoMjYqKiRleHBuKTsNCisgICAgICAgICRleHBuKys7DQorICAgIH0NCisNCisgICAgIyBDb252ZXJ0IDEtaW5kZXggdG8gemVyby1pbmRleA0KKyAgICAkcm93LS07DQorICAgICRjb2wtLTsNCisNCisgICAgcmV0dXJuICRyb3csICRjb2wsICRyb3dfcmVsLCAkY29sX3JlbDsNCit9DQorDQorDQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMNCisjIF9jZWxsX3RvX3BhY2tlZF9yb3djb2woJHJvdywgJGNvbCwgJHJvd19yZWwsICRjb2xfcmVsKQ0KKyMNCisjIHBhY2soKSByb3cgYW5kIGNvbHVtbiBpbnRvIHRoZSByZXF1aXJlZCAzIGJ5dGUgZm9ybWF0Lg0KKyMNCitzdWIgX2NlbGxfdG9fcGFja2VkX3Jvd2NvbCB7DQorDQorICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYDQorDQorICAgIG15ICRzZWxmID0gc2hpZnQ7DQorICAgIG15ICRjZWxsID0gc2hpZnQ7DQorDQorICAgIG15ICgkcm93LCAkY29sLCAkcm93X3JlbCwgJGNvbF9yZWwpID0gJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7DQorDQorICAgIGRpZSAiQ29sdW1uICRjZWxsIGdyZWF0ZXIgdGhhbiBJViBpbiBmb3JtdWxhXG4iIGlmICRjb2wgPj0gMjU2Ow0KKyAgICBkaWUgIlJvdyAkY2VsbCBncmVhdGVyIHRoYW4gNjU1MzYgaW4gZm9ybXVsYVxuIiBpZiAkcm93ID49IDY1NTM2Ow0KKw0KKyAgICAjIFNldCB0aGUgaGlnaCBiaXRzIHRvIGluZGljYXRlIGlmIHJvdyBvciBjb2wgYXJlIHJlbGF0aXZlLg0KKyAgICAkY29sICAgIHw9ICRjb2xfcmVsIDw8IDE0Ow0KKyAgICAkY29sICAgIHw9ICRyb3dfcmVsIDw8IDE1Ow0KKw0KKyAgICAkcm93ICAgICA9IHBhY2soJ3YnLCAkcm93KTsNCisgICAgJGNvbCAgICAgPSBwYWNrKCd2JywgJGNvbCk7DQorDQorICAgIHJldHVybiAoJHJvdywgJGNvbCk7DQorfQ0KKw0KKw0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCisjDQorIyBfaW5pdGlhbGl6ZV9oYXNoZXMoKQ0KKyMNCitzdWIgX2luaXRpYWxpemVfaGFzaGVzIHsNCisNCisgICAgIyBUaGUgRXhjZWwgcHRnIGluZGljZXMNCisgICAgJXB0ZyA9ICgNCisgICAgICAgICdwdGdFeHAnICAgICAgICAgICAgPT4gMHgwMSwNCisgICAgICAgICdwdGdUYmwnICAgICAgICAgICAgPT4gMHgwMiwNCisgICAgICAgICdwdGdBZGQnICAgICAgICAgICAgPT4gMHgwMywNCisgICAgICAgICdwdGdTdWInICAgICAgICAgICAgPT4gMHgwNCwNCisgICAgICAgICdwdGdNdWwnICAgICAgICAgICAgPT4gMHgwNSwNCisgICAgICAgICdwdGdEaXYnICAgICAgICAgICAgPT4gMHgwNiwNCisgICAgICAgICdwdGdQb3dlcicgICAgICAgICAgPT4gMHgwNywNCisgICAgICAgICdwdGdDb25jYXQnICAgICAgICAgPT4gMHgwOCwNCisgICAgICAgICdwdGdMVCcgICAgICAgICAgICAgPT4gMHgwOSwNCisgICAgICAgICdwdGdMRScgICAgICAgICAgICAgPT4gMHgwQSwNCisgICAgICAgICdwdGdFUScgICAgICAgICAgICAgPT4gMHgwQiwNCisgICAgICAgICdwdGdHRScgICAgICAgICAgICAgPT4gMHgwQywNCisgICAgICAgICdwdGdHVCcgICAgICAgICAgICAgPT4gMHgwRCwNCisgICAgICAgICdwdGdORScgICAgICAgICAgICAgPT4gMHgwRSwNCisgICAgICAgICdwdGdJc2VjdCcgICAgICAgICAgPT4gMHgwRiwNCisgICAgICAgICdwdGdVbmlvbicgICAgICAgICAgPT4gMHgxMCwNCisgICAgICAgICdwdGdSYW5nZScgICAgICAgICAgPT4gMHgxMSwNCisgICAgICAgICdwdGdVcGx1cycgICAgICAgICAgPT4gMHgxMiwNCisgICAgICAgICdwdGdVbWludXMnICAgICAgICAgPT4gMHgxMywNCisgICAgICAgICdwdGdQZXJjZW50JyAgICAgICAgPT4gMHgxNCwNCisgICAgICAgICdwdGdQYXJlbicgICAgICAgICAgPT4gMHgxNSwNCisgICAgICAgICdwdGdNaXNzQXJnJyAgICAgICAgPT4gMHgxNiwNCisgICAgICAgICdwdGdTdHInICAgICAgICAgICAgPT4gMHgxNywNCisgICAgICAgICdwdGdBdHRyJyAgICAgICAgICAgPT4gMHgxOSwNCisgICAgICAgICdwdGdTaGVldCcgICAgICAgICAgPT4gMHgxQSwNCisgICAgICAgICdwdGdFbmRTaGVldCcgICAgICAgPT4gMHgxQiwNCisgICAgICAgICdwdGdFcnInICAgICAgICAgICAgPT4gMHgxQywNCisgICAgICAgICdwdGdCb29sJyAgICAgICAgICAgPT4gMHgxRCwNCisgICAgICAgICdwdGdJbnQnICAgICAgICAgICAgPT4gMHgxRSwNCisgICAgICAgICdwdGdOdW0nICAgICAgICAgICAgPT4gMHgxRiwNCisgICAgICAgICdwdGdBcnJheScgICAgICAgICAgPT4gMHgyMCwNCisgICAgICAgICdwdGdGdW5jJyAgICAgICAgICAgPT4gMHgyMSwNCisgICAgICAgICdwdGdGdW5jVmFyJyAgICAgICAgPT4gMHgyMiwNCisgICAgICAgICdwdGdOYW1lJyAgICAgICAgICAgPT4gMHgyMywNCisgICAgICAgICdwdGdSZWYnICAgICAgICAgICAgPT4gMHgyNCwNCisgICAgICAgICdwdGdBcmVhJyAgICAgICAgICAgPT4gMHgyNSwNCisgICAgICAgICdwdGdNZW1BcmVhJyAgICAgICAgPT4gMHgyNiwNCisgICAgICAgICdwdGdNZW1FcnInICAgICAgICAgPT4gMHgyNywNCisgICAgICAgICdwdGdNZW1Ob01lbScgICAgICAgPT4gMHgyOCwNCisgICAgICAgICdwdGdNZW1GdW5jJyAgICAgICAgPT4gMHgyOSwNCisgICAgICAgICdwdGdSZWZFcnInICAgICAgICAgPT4gMHgyQSwNCisgICAgICAgICdwdGdBcmVhRXJyJyAgICAgICAgPT4gMHgyQiwNCisgICAgICAgICdwdGdSZWZOJyAgICAgICAgICAgPT4gMHgyQywNCisgICAgICAgICdwdGdBcmVhTicgICAgICAgICAgPT4gMHgyRCwNCisgICAgICAgICdwdGdNZW1BcmVhTicgICAgICAgPT4gMHgyRSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHgyRiwNCisgICAgICAgICdwdGdOYW1lWCcgICAgICAgICAgPT4gMHgzOSwNCisgICAgICAgICdwdGdSZWYzZCcgICAgICAgICAgPT4gMHgzQSwNCisgICAgICAgICdwdGdBcmVhM2QnICAgICAgICAgPT4gMHgzQiwNCisgICAgICAgICdwdGdSZWZFcnIzZCcgICAgICAgPT4gMHgzQywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHgzRCwNCisgICAgICAgICdwdGdBcnJheVYnICAgICAgICAgPT4gMHg0MCwNCisgICAgICAgICdwdGdGdW5jVicgICAgICAgICAgPT4gMHg0MSwNCisgICAgICAgICdwdGdGdW5jVmFyVicgICAgICAgPT4gMHg0MiwNCisgICAgICAgICdwdGdOYW1lVicgICAgICAgICAgPT4gMHg0MywNCisgICAgICAgICdwdGdSZWZWJyAgICAgICAgICAgPT4gMHg0NCwNCisgICAgICAgICdwdGdBcmVhVicgICAgICAgICAgPT4gMHg0NSwNCisgICAgICAgICdwdGdNZW1BcmVhVicgICAgICAgPT4gMHg0NiwNCisgICAgICAgICdwdGdNZW1FcnJWJyAgICAgICAgPT4gMHg0NywNCisgICAgICAgICdwdGdNZW1Ob01lbVYnICAgICAgPT4gMHg0OCwNCisgICAgICAgICdwdGdNZW1GdW5jVicgICAgICAgPT4gMHg0OSwNCisgICAgICAgICdwdGdSZWZFcnJWJyAgICAgICAgPT4gMHg0QSwNCisgICAgICAgICdwdGdBcmVhRXJyVicgICAgICAgPT4gMHg0QiwNCisgICAgICAgICdwdGdSZWZOVicgICAgICAgICAgPT4gMHg0QywNCisgICAgICAgICdwdGdBcmVhTlYnICAgICAgICAgPT4gMHg0RCwNCisgICAgICAgICdwdGdNZW1BcmVhTlYnICAgICAgPT4gMHg0RSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHg0RiwNCisgICAgICAgICdwdGdGdW5jQ0VWJyAgICAgICAgPT4gMHg1OCwNCisgICAgICAgICdwdGdOYW1lWFYnICAgICAgICAgPT4gMHg1OSwNCisgICAgICAgICdwdGdSZWYzZFYnICAgICAgICAgPT4gMHg1QSwNCisgICAgICAgICdwdGdBcmVhM2RWJyAgICAgICAgPT4gMHg1QiwNCisgICAgICAgICdwdGdSZWZFcnIzZFYnICAgICAgPT4gMHg1QywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHg1RCwNCisgICAgICAgICdwdGdBcnJheUEnICAgICAgICAgPT4gMHg2MCwNCisgICAgICAgICdwdGdGdW5jQScgICAgICAgICAgPT4gMHg2MSwNCisgICAgICAgICdwdGdGdW5jVmFyQScgICAgICAgPT4gMHg2MiwNCisgICAgICAgICdwdGdOYW1lQScgICAgICAgICAgPT4gMHg2MywNCisgICAgICAgICdwdGdSZWZBJyAgICAgICAgICAgPT4gMHg2NCwNCisgICAgICAgICdwdGdBcmVhQScgICAgICAgICAgPT4gMHg2NSwNCisgICAgICAgICdwdGdNZW1BcmVhQScgICAgICAgPT4gMHg2NiwNCisgICAgICAgICdwdGdNZW1FcnJBJyAgICAgICAgPT4gMHg2NywNCisgICAgICAgICdwdGdNZW1Ob01lbUEnICAgICAgPT4gMHg2OCwNCisgICAgICAgICdwdGdNZW1GdW5jQScgICAgICAgPT4gMHg2OSwNCisgICAgICAgICdwdGdSZWZFcnJBJyAgICAgICAgPT4gMHg2QSwNCisgICAgICAgICdwdGdBcmVhRXJyQScgICAgICAgPT4gMHg2QiwNCisgICAgICAgICdwdGdSZWZOQScgICAgICAgICAgPT4gMHg2QywNCisgICAgICAgICdwdGdBcmVhTkEnICAgICAgICAgPT4gMHg2RCwNCisgICAgICAgICdwdGdNZW1BcmVhTkEnICAgICAgPT4gMHg2RSwNCisgICAgICAgICdwdGdNZW1Ob01lbU4nICAgICAgPT4gMHg2RiwNCisgICAgICAgICdwdGdGdW5jQ0VBJyAgICAgICAgPT4gMHg3OCwNCisgICAgICAgICdwdGdOYW1lWEEnICAgICAgICAgPT4gMHg3OSwNCisgICAgICAgICdwdGdSZWYzZEEnICAgICAgICAgPT4gMHg3QSwNCisgICAgICAgICdwdGdBcmVhM2RBJyAgICAgICAgPT4gMHg3QiwNCisgICAgICAgICdwdGdSZWZFcnIzZEEnICAgICAgPT4gMHg3QywNCisgICAgICAgICdwdGdBcmVhRXJyM2QnICAgICAgPT4gMHg3RCwNCisgICAgKTsNCisNCisgICAgIyBUaGFua3MgdG8gTWljaGFlbCBNZWVrcyBhbmQgR251bWVyaWMgZm9yIHRoZSBpbml0aWFsIGFyZyB2YWx1ZXMuDQorICAgICMNCisgICAgIyBUaGUgZm9sbG93aW5nIGhhc2ggd2FzIGdlbmVyYXRlZCBieSAiZnVuY3Rpb25fbG9jYWxlLnBsIiBpbiB0aGUgZGlzdHJvLg0KKyAgICAjIFJlZmVyIHRvIGZ1bmN0aW9uX2xvY2FsZS5wbCBmb3Igbm9uLUVuZ2xpc2ggZnVuY3Rpb24gbmFtZXMuDQorICAgICMNCisgICAgIyBUaGUgYXJyYXkgZWxlbWVudHMgYXJlIGFzIGZvbGxvdzoNCisgICAgIyBwdGc6ICAgVGhlIEV4Y2VsIGZ1bmN0aW9uIHB0ZyBjb2RlLg0KKyAgICAjIGFyZ3M6ICBUaGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0IHRoZSBmdW5jdGlvbiB0YWtlczoNCisgICAgIyAgICAgICAgICAgPj0wIGlzIGEgZml4ZWQgbnVtYmVyIG9mIGFyZ3VtZW50cy4NCisgICAgIyAgICAgICAgICAgLTEgIGlzIGEgdmFyaWFibGUgIG51bWJlciBvZiBhcmd1bWVudHMuDQorICAgICMgY2xhc3M6IFRoZSByZWZlcmVuY2UsIHZhbHVlIG9yIGFycmF5IGNsYXNzIG9mIHRoZSBmdW5jdGlvbiBhcmdzLg0KKyAgICAjIHZvbDogICBUaGUgZnVuY3Rpb24gaXMgdm9sYXRpbGUuDQorICAgICMNCisgICAgJWZ1bmN0aW9ucyAgPSAoDQorICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ZyAgYXJncyAgY2xhc3MgIHZvbA0KKyAgICAgICAgJ0NPVU5UJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lGJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTkEnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTRVJST1InICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVTScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0FWRVJBR0UnICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01JTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01BWCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgNywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPVycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPTFVNTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAgOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ05BJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMCwgICAgMCwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ05QVicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUREVWJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RPTExBUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxMywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJWEVEJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NJTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPUycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RBTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxNywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BJJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAxOSwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NRUlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYUCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xOJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPRzEwJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FCUycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lOVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NJR04nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5EJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPT0tVUCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lOREVYJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAyOSwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1JFUFQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xFTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1ZBTFVFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSVUUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNCwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZBTFNFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNSwgICAgMCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FORCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ09SJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzNywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01PRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICAzOSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RDT1VOVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MCwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVU0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVkVSQUdFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MiwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RNSU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0MywgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RNQVgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NCwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVERFVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZBUicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RWQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0NywgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RFWFQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0OCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xJTkVTVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA0OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RSRU5EJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xPR0VTVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0dST1dUSCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1MiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BWJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1NiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZWJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05QRVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1OCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BNVCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA1OSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBVEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JUlInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lSUicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JBTkQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2MywgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ01BVENIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RJTUUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RBWScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2NywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01PTlRIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1lFQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA2OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1dFRUtEQVknICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hPVVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01JTlVURScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NFQ09ORCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PVycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NCwgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0FSRUFTJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NSwgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1JPV1MnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NiwgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ0NPTFVNTlMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3NywgICAgMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ09GRlNFVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA3OCwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ1NFQVJDSCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA4MiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSQU5TUE9TRScgICAgICAgICAgICAgICAgICAgICA9PiBbICA4MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RZUEUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA4NiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU4yJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5NywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FTSU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FDT1MnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbICA5OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NIT09TRScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hMT09LVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZMT09LVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lTUkVGJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwNSwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xPRycgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEwOSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NIQVInICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPV0VSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1VQUEVSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BST1BFUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xFRlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JJR0hUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYQUNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RSSU0nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JFUExBQ0UnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDExOSwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVQlNUSVRVVEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDEyMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPREUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJTkQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NFTEwnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNSwgICAtMSwgICAgMCwgICAgMSBdLA0KKyAgICAgICAgJ0lTRVJSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTVEVYVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyNywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTlVNQkVSJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyOCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTQkxBTksnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEyOSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEzMCwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ04nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEzMSwgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RBVEVWQUxVRScgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RJTUVWQUxVRScgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NMTicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NZRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0REQicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0NCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lORElSRUNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE0OCwgICAtMSwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0NBTEwnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE1MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NMRUFOJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01ERVRFUk0nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2MywgICAgMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ01JTlZFUlNFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NCwgICAgMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ01NVUxUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0lQTVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BQTVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2OCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5UQScgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE2OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BST0RVQ1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4MywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0ZBQ1QnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RQUk9EVUNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE4OSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lTTk9OVEVYVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5MCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUREVWUCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5MywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1ZBUlAnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RTVERFVlAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0RWQVJQJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NiwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RSVU5DJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0lTTE9HSUNBTCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RDT1VOVEEnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDE5OSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5EVVAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxMiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JPVU5ERE9XTicgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxMywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBTksnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxNiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0FERFJFU1MnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIxOSwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RBWVMzNjAnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RPREFZJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMSwgICAgMCwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ1ZEQicgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyMiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ01FRElBTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyNywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVBST0RVQ1QnICAgICAgICAgICAgICAgICAgICA9PiBbIDIyOCwgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NJTkgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIyOSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPU0gnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RBTkgnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FTSU5IJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FDT1NIJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzMywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FUQU5IJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzNCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RHRVQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDIzNSwgICAgMywgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0lORk8nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI0NCwgICAgMSwgICAgMSwgICAgMSBdLA0KKyAgICAgICAgJ0RCJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI0NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZSRVFVRU5DWScgICAgICAgICAgICAgICAgICAgICA9PiBbIDI1MiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0VSUk9SLlRZUEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDI2MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JFR0lTVEVSLklEJyAgICAgICAgICAgICAgICAgICA9PiBbIDI2NywgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0FWRURFVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI2OSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0JFVEFESVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BTE4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0JFVEFJTlYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0JJTk9NRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NISURJU1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NISUlOVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTUJJTicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTkZJREVOQ0UnICAgICAgICAgICAgICAgICAgICA9PiBbIDI3NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NSSVRCSU5PTScgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3OCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VWRU4nICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI3OSwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0VYUE9ORElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZESVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJU0hFUicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZJU0hFUklOVicgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0ZMT09SJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NiwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0dBTU1BSU5WJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NFSUxJTkcnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI4OCwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0hZUEdFT01ESVNUJyAgICAgICAgICAgICAgICAgICA9PiBbIDI4OSwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPR05PUk1ESVNUJyAgICAgICAgICAgICAgICAgICA9PiBbIDI5MCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0xPR0lOVicgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5MSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05FR0JJTk9NRElTVCcgICAgICAgICAgICAgICAgICA9PiBbIDI5MiwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1ESVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5MywgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1TRElTVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1JTlYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ05PUk1TSU5WJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5NiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NUQU5EQVJESVpFJyAgICAgICAgICAgICAgICAgICA9PiBbIDI5NywgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ09ERCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5OCwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BFUk1VVCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDI5OSwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BPSVNTT04nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMCwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1RESVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMSwgICAgMywgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1dFSUJVTEwnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMiwgICAgNCwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVhNWTInICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwMywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVgyTVkyJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVgyUFkyJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NISVRFU1QnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNiwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NPUlJFTCcgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwNywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0NPVkFSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwOCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0ZPUkVDQVNUJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMwOSwgICAgMywgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0ZURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0lOVEVSQ0VQVCcgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1BFQVJTT04nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMiwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1JTUScgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxMywgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NURVlYJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNCwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1NMT1BFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNSwgICAgMiwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1RURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNiwgICAgNCwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1BST0InICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxNywgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ0RFVlNRJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxOCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0dFT01FQU4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMxOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0hBUk1FQU4nICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTVNRJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0tVUlQnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMiwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NLRVcnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyMywgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1pURVNUJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0xBUkdFJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNSwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NNQUxMJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1FVQVJUSUxFJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMyNywgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BFUkNFTlRJTEUnICAgICAgICAgICAgICAgICAgICA9PiBbIDMyOCwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1BFUkNFTlRSQU5LJyAgICAgICAgICAgICAgICAgICA9PiBbIDMyOSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ01PREUnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMCwgICAtMSwgICAgMiwgICAgMCBdLA0KKyAgICAgICAgJ1RSSU1NRUFOJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMSwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1RJTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzMiwgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0NPTkNBVEVOQVRFJyAgICAgICAgICAgICAgICAgICA9PiBbIDMzNiwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1BPV0VSJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDMzNywgICAgMiwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1JBRElBTlMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0MiwgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ0RFR1JFRVMnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0MywgICAgMSwgICAgMSwgICAgMCBdLA0KKyAgICAgICAgJ1NVQlRPVEFMJyAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NCwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1NVTUlGJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NSwgICAtMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5USUYnICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NiwgICAgMiwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ0NPVU5UQkxBTksnICAgICAgICAgICAgICAgICAgICA9PiBbIDM0NywgICAgMSwgICAgMCwgICAgMCBdLA0KKyAgICAgICAgJ1JPTUFOJyAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDM1NCwgICAtMSwgICAgMSwgICAgMCBdLA0KKyAgICApOw0KKw0KK30NCisNCisNCisNCisNCisxOw0KKw0KKw0KK19fRU5EX18NCisNCisNCis9aGVhZDEgTkFNRQ0KKw0KK0Zvcm11bGEgLSBBIGNsYXNzIGZvciBnZW5lcmF0aW5nIEV4Y2VsIGZvcm11bGFzDQorDQorPWhlYWQxIFNZTk9QU0lTDQorDQorU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbA0KKw0KKz1oZWFkMSBERVNDUklQVElPTg0KKw0KK1RoaXMgbW9kdWxlIGlzIHVzZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuIFlvdSBkbyBub3QgbmVlZCB0byB1c2UgaXQgZGlyZWN0bHkuDQorDQorDQorPWhlYWQxIE5PVEVTDQorDQorVGhlIGZvbGxvd2luZyBub3RlcyBhcmUgdG8gaGVscCBkZXZlbG9wZXJzIGFuZCBtYWludGFpbmVycyB1bmRlcnN0YW5kIHRoZSBzZXF1ZW5jZSBvZiBvcGVyYXRpb24uIFRoZXkgYXJlIGFsc28gaW50ZW5kZWQgYXMgYSBwcm8tbWVtb3JpYSBmb3IgdGhlIGF1dGhvci4gOy0pDQorDQorU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGEgY29udmVydHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9ybXVsYSBpbnRvIHRoZSBwcmUtcGFyc2VkIGJpbmFyeSBmb3JtYXQgdGhhdCBFeGNlbCB1c2VzIHRvIHN0b3JlIGZvcm11bGFzLiBGb3IgZXhhbXBsZSBDPDErMiozPiBpcyBzdG9yZWQgYXMgZm9sbG93czogQzwxRSAwMSAwMCAxRSAwMiAwMCAxRSAwMyAwMCAwNSAwMz4uDQorDQorVGhpcyBzdHJpbmcgaXMgY29tcHJpc2VkIG9mIG9wZXJhdG9ycyBhbmQgb3BlcmFuZHMgYXJyYW5nZWQgaW4gYSByZXZlcnNlLVBvbGlzaCBmb3JtYXQuIFRoZSBtZWFuaW5nIG9mIHRoZSB0b2tlbnMgaW4gdGhlIGFib3ZlIGV4YW1wbGUgaXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZToNCisNCisgICAgVG9rZW4gICBOYW1lICAgICAgICBWYWx1ZQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDEgICAoc3RvcmVkIGFzIDAxIDAwKQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDIgICAoc3RvcmVkIGFzIDAyIDAwKQ0KKyAgICAxRSAgICAgIHB0Z0ludCAgICAgIDAwMDMgICAoc3RvcmVkIGFzIDAzIDAwKQ0KKyAgICAwNSAgICAgIHB0Z011bA0KKyAgICAwMyAgICAgIHB0Z0FkZA0KKw0KK1RoZSB0b2tlbnMgYW5kIHRva2VuIG5hbWVzIGFyZSBkZWZpbmVkIGluIHRoZSAiRXhjZWwgRGV2ZWxvcGVyJ3MgS2l0IiBmcm9tIE1pY3Jvc29mdCBQcmVzcy4gQzxwdGc+IHN0YW5kcyBmb3IgUGFyc2UgVGhpbkcgKGFzIGluICJUaGF0IGxleGVyIGNhbid0IGdyb2sgaXQsIGl0J3MgYSBwYXJzZSB0aGFuZy4iKQ0KKw0KK0luIGdlbmVyYWwgdGhlIHRva2VucyBmYWxsIGludG8gdHdvIGNhdGVnb3JpZXM6IG9wZXJhdG9ycyBzdWNoIGFzIEM8cHRnTXVsPiBhbmQgb3BlcmFuZHMgc3VjaCBhcyBDPHB0Z0ludD4uIFdoZW4gdGhlIGZvcm11bGEgaXMgZXZhbHVhdGVkIGJ5IEV4Y2VsIHRoZSBvcGVyYW5kIHRva2VucyBwdXNoIHZhbHVlcyBvbnRvIGEgc3RhY2suIFRoZSBvcGVyYXRvciB0b2tlbnMgdGhlbiBwb3AgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBvcGVyYW5kcyBvZmYgb2YgdGhlIHN0YWNrLCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBhbmQgcHVzaCB0aGUgcmVzdWx0aW5nIHZhbHVlIGJhY2sgb250byB0aGUgc3RhY2suIFRoaXMgbWV0aG9kb2xvZ3kgaXMgc2ltaWxhciB0byB0aGUgYmFzaWMgb3BlcmF0aW9uIG9mIGEgcmV2ZXJzZS1Qb2xpc2ggKFJQTikgY2FsY3VsYXRvci4NCisNCitTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybXVsYSBwYXJzZXMgYSBmb3JtdWxhIHVzaW5nIGEgQzxQYXJzZTo6UmVjRGVzY2VudD4gcGFyc2VyIChhdCBhIGxhdGVyIHN0YWdlIGl0IG1heSB1c2UgYSBDPFBhcnNlOjpZYXBwPiBwYXJzZXIgb3IgQzxQYXJzZTo6RmFzdERlc2NlbnQ+KS4NCisNCitUaGUgcGFyc2VyIGNvbnZlcnRzIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9ybXVsYSBpbnRvIGEgcGFyc2UgdHJlZS4gVGh1cywgQzwxKzIqMz4gaXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywgQzxlPiBzdGFuZHMgZm9yIGV4cHJlc3Npb246DQorDQorICAgICAgICAgICAgIGUNCisgICAgICAgICAgIC8gfCBcDQorICAgICAgICAgMSAgICsgICBlDQorICAgICAgICAgICAgICAgLyB8IFwNCisgICAgICAgICAgICAgMiAgICogICAzDQorDQorDQorVGhlIGZ1bmN0aW9uIEM8X3JldmVyc2VfdHJlZSgpPiByZWN1cnNlcyBkb3duIHRocm91Z2ggdGhpcyBzdHJ1Y3R1cmUgc3dhcHBpbmcgdGhlIG9yZGVyIG9mIG9wZXJhdG9ycyBmb2xsb3dlZCBieSBvcGVyYW5kcyB0byBwcm9kdWNlIGEgcmV2ZXJzZS1Qb2xpc2ggdHJlZS4gSW4gb3RoZXIgd29yZHMgdGhlIGZvcm11bGEgaXMgY29udmVydGVkIGZyb20gaW4tZml4IG5vdGF0aW9uIHRvIHBvc3QtZml4LiBGb2xsb3dpbmcgdGhlIGFib3ZlIGV4YW1wbGUgdGhlIHJlc3VsdGluZyB0cmVlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOg0KKw0KKw0KKyAgICAgICAgICAgICBlDQorICAgICAgICAgICAvIHwgXA0KKyAgICAgICAgIDEgICBlICAgKw0KKyAgICAgICAgICAgLyB8IFwNCisgICAgICAgICAyICAgMyAgICoNCisNCitUaGUgcmVzdWx0IG9mIHRoZSByZWN1cnNpb24gaXMgYSBzaW5nbGUgYXJyYXkgb2YgdG9rZW5zLiBJbiBvdXIgZXhhbXBsZSB0aGUgc2ltcGxpZmllZCBmb3JtIHdvdWxkIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nOg0KKw0KKyAgICAoMSwgMiwgMywgKiwgKykNCisNCitUaGUgYWN0dWFsIHJldHVybiB2YWx1ZSBjb250YWlucyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gaGVscCBpbiB0aGUgc2Vjb25kYXJ5IHBhcnNpbmcgc3RhZ2U6DQorDQorICAgIChfbnVtLCAxLCBfbnVtLCAyLCBfbnVtLCAzLCBwdGdNdWwsIHB0Z0FkZCwgX2FyZywgMSkNCisNCitUaGUgYWRkaXRpb25hbCB0b2tlbnMgYXJlOg0KKw0KKyAgICBUb2tlbiAgICAgICBNZWFuaW5nDQorICAgIF9udW0gICAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgbnVtYmVyDQorICAgIF9zdHIgICAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nDQorICAgIF9yZWYyZCAgICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgMmQgY2VsbCByZWZlcmVuY2UNCisgICAgX3JlZjNkICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSAzZCBjZWxsIHJlZmVyZW5jZQ0KKyAgICBfcmFuZ2UyZCAgICBUaGUgbmV4dCB0b2tlbiBpcyBhIDJkIHJhbmdlDQorICAgIF9yYW5nZTNkICAgIFRoZSBuZXh0IHRva2VuIGlzIGEgM2QgcmFuZ2UNCisgICAgX2Z1bmMgICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBmdW5jdGlvbg0KKyAgICBfYXJnICAgICAgICBUaGUgbmV4dCB0b2tlbiBpcyB0aGUgbnVtYmVyIG9mIGFyZ3MgZm9yIGEgZnVuY3Rpb24NCisgICAgX2NsYXNzICAgICAgVGhlIG5leHQgdG9rZW4gaXMgYSBmdW5jdGlvbiBuYW1lDQorICAgIF92b2wgICAgICAgIFRoZSBmb3JtdWxhIGNvbnRhaW5zIGEgdm9sdGlsZSBmdW5jdGlvbg0KKw0KK1RoZSBDPF9hcmc+IHRva2VuIGlzIGdlbmVyYXRlZCBmb3IgYWxsIGxpc3RzIGJ1dCBpcyBvbmx5IHVzZWQgZm9yIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLg0KKw0KK1RoZSBDPF9jbGFzcz4gdG9rZW4gaW5kaWNhdGVzIHRoZSBzdGFydCBvZiB0aGUgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24uIFRoaXMgYWxsb3dzIHRoZSBwb3N0LXByb2Nlc3NvciB0byBkZWNpZGUgdGhlICJjbGFzcyIgb2YgdGhlIHJlZiBhbmQgcmFuZ2UgYXJndW1lbnRzIHRoYXQgdGhlIGZ1bmN0aW9uIHRha2VzLiBUaGUgY2xhc3MgY2FuIGJlIHJlZmVyZW5jZSwgdmFsdWUgb3IgYXJyYXkuIFNpbmNlIGZ1bmN0aW9uIGNhbGxzIGNhbiBiZSBuZXN0ZWQsIHRoZSBjbGFzcyB2YXJpYWJsZSBpcyBzdG9yZWQgb24gYSBzdGFjayBpbiB0aGUgQzxAY2xhc3M+IGFycmF5LiBUaGUgY2xhc3Mgb2YgdGhlIHJlZiBvciByYW5nZSBpcyB0aGVuIHJlYWQgYXMgdGhlIHRvcCBlbGVtZW50IG9mIHRoZSBzdGFjayBDPCRjbGFzc1stMV0+LiBXaGVuIGEgQzxfZnVuYz4gaXMgcmVhZCBpdCBwb3BzIHRoZSBjbGFzcyB2YWx1ZS4NCisNCitDZXJ0YWluIEV4Y2VsIGZ1bmN0aW9ucyBzdWNoIGFzIFJBTkQoKSBhbmQgTk9XKCkgYXJlIGRlc2lnbmF0ZWQgYXMgdm9sYXRpbGUgYW5kIG11c3QgYmUgcmVjYWxjdWxhdGVkIGJ5IEV4Y2VsIGV2ZXJ5IHRpbWUgdGhhdCBhIGNlbGwgaXMgdXBkYXRlZC4gQW55IGZvcm11bGFzIHRoYXQgY29udGFpbiBvbmUgb2YgdGhlc2UgZnVuY3Rpb25zIGhhcyBhIHNwZWNpYWxseSBmb3JtYXR0ZWQgQzxwdGdBdHRyPiB0YWcgcHJlcGVuZGVkIHRvIGl0IHRvIGluZGljYXRlIHRoYXQgaXQgaXMgdm9sYXRpbGUuDQorDQorQSBzZWNvbmRhcnkgcGFyc2luZyBzdGFnZSBpcyBjYXJyaWVkIG91dCBieSBDPHBhcnNlX3Rva2VucygpPiB3aGljaCBjb252ZXJ0cyB0aGVzZSB0b2tlbnMgaW50byBhIGJpbmFyeSBzdHJpbmcuIEZvciB0aGUgQzwxKzIqMz4gZXhhbXBsZSB0aGlzIHdvdWxkIGdpdmU6DQorDQorICAgIDFFIDAxIDAwIDFFIDAyIDAwIDFFIDAzIDAwIDA1IDAzDQorDQorVGhpcyB0d28tcGFzcyBtZXRob2QgY291bGQgcHJvYmFibHkgaGF2ZSBiZWVuIHJlZHVjZWQgdG8gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHRoZSBDPFBhcnNlOjpSZWNEZXNjZW50PiBwYXJzZXIuIEhvd2V2ZXIsIGl0IHdhcyBlYXNpZXIgdG8gZGV2ZWxvcCBhbmQgZGVidWcgdGhpcyB3YXkuDQorDQorVGhlIHRva2VuIHZhbHVlcyBhbmQgZm9ybXVsYSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgQzwlcHRnPiBhbmQgQzwlZnVuY3Rpb25zPiBoYXNoZXMuIFRoZXNlIGhhc2hlcyBhbmQgdGhlIHBhcnNlciBvYmplY3QgQzwkcGFyc2VyPiBhcmUgZXhwb3NlZCBhcyBnbG9iYWwgZGF0YS4gVGhpcyBicmVha3MgdGhlIE9PIGVuY2Fwc3VsYXRpb24sIGJ1dCBtZWFucyB0aGF0IHRoZXkgY2FuIGJlIHNoYXJlZCBieSBzZXZlcmFsIGluc3RhbmNlcyBvZiBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBjYWxsZWQgZnJvbSB0aGUgc2FtZSBwcm9ncmFtLg0KKw0KK05vbi1FbmdsaXNoIGZ1bmN0aW9uIG5hbWVzIGNhbiBiZSBhZGRlZCB0byB0aGUgQzwlZnVuY3Rpb25zPiBoYXNoIHVzaW5nIHRoZSBDPGZ1bmN0aW9uX2xvY2FsZS5wbD4gcHJvZ3JhbSBpbiB0aGUgQzxleGFtcGxlcz4gZGlyZWN0b3J5IG9mIHRoZSBkaXN0cm8uIFRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogR2VybWFuLCBGcmVuY2gsIFNwYW5pc2gsIFBvcnR1Z3Vlc2UsIER1dGNoLCBGaW5uaXNoLCBJdGFsaWFuIGFuZCBTd2VkaXNoLiBUaGVzZSBsYW5ndWFnZXMgYXJlIG5vdCBhZGRlZCBieSBkZWZhdWx0IGJlY2F1c2UgdGhlcmUgYXJlIGNvbmZsaWN0cyBiZXR3ZWVuIGZ1bmN0aW9ucyBuYW1lcyBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzLg0KKw0KK1RoZSBwYXJzZXIgaXMgaW5pdGlhbGlzZWQgYnkgQzxfaW5pdF9wYXJzZXIoKT4uIFRoZSBpbml0aWFsaXNhdGlvbiBpcyBkZWxheWVkIHVudGlsIHRoZSBmaXJzdCBmb3JtdWxhIGlzIHBhcnNlZC4gVGhpcyBlbGltaW5hdGVzIHRoZSBvdmVyaGVhZCBvZiBnZW5lcmF0aW5nIHRoZSBwYXJzZXIgaW4gcHJvZ3JhbXMgdGhhdCBhcmUgbm90IHByb2Nlc3NpbmcgZm9ybXVsYXMuIChUaGUgcGFyc2VyIHNob3VsZCByZWFsbHkgYmUgcHJlLWNvbXBpbGVkLCB0aGlzIGlzIHRvLWRvIHdoZW4gdGhlIGdyYW1tYXIgc3RhYmlsaXNlcykuDQorDQorDQorDQorDQorPWhlYWQxIEFVVEhPUg0KKw0KK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnDQorDQorPWhlYWQxIENPUFlSSUdIVA0KKw0KK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLg0KKw0KK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4NCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL09MRXdyaXRlci5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvT0xFd3JpdGVyLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYmI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL09MRXdyaXRlci5wbQpAQCAtMCwwICsxLDQ0OSBAQAorcGFja2FnZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6T0xFd3JpdGVyOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIE9MRXdyaXRlciAtIEEgd3JpdGVyIGNsYXNzIHRvIHN0b3JlIEJJRkYgZGF0YSBpbiBhIE9MRSBjb21wb3VuZCBzdG9yYWdlIGZpbGUuCisjCisjCisjIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMgRG9jdW1lbnRhdGlvbiBhZnRlciBfX0VORF9fCisjCisKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBGaWxlSGFuZGxlOworCisKKworCisKK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EpOworQElTQSA9IHF3KEV4cG9ydGVyKTsKKworJFZFUlNJT04gPSAnMi4zNyc7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgbmV3KCkKKyMKKyMgQ29uc3RydWN0b3IKKyMKK3N1YiBuZXcgeworCisgICAgbXkgJGNsYXNzICA9IHNoaWZ0OworICAgIG15ICRzZWxmICAgPSB7CisgICAgICAgICAgICAgICAgICAgIF9vbGVmaWxlbmFtZSAgID0+ICRfWzBdLAorICAgICAgICAgICAgICAgICAgICBfZmlsZWhhbmRsZSAgICA9PiAiIiwKKyAgICAgICAgICAgICAgICAgICAgX2ZpbGVjbG9zZWQgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2ludGVybmFsX2ZoICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZmZfb25seSAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3NpemVfYWxsb3dlZCAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZmZzaXplICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2Jvb2tzaXplICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2JpZ19ibG9ja3MgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2xpc3RfYmxvY2tzICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX3Jvb3Rfc3RhcnQgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgX2Jsb2NrX2NvdW50ICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgfTsKKworICAgIGJsZXNzICRzZWxmLCAkY2xhc3M7CisgICAgJHNlbGYtPl9pbml0aWFsaXplKCk7CisgICAgcmV0dXJuICRzZWxmOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2luaXRpYWxpemUoKQorIworIyBDcmVhdGUgYSBuZXcgZmlsZWhhbmRsZSBvciB1c2UgdGhlIHByb3ZpZGVkIGZpbGVoYW5kbGUuCisjCitzdWIgX2luaXRpYWxpemUgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKyAgICBteSAkb2xlZmlsZSA9ICRzZWxmLT57X29sZWZpbGVuYW1lfTsKKyAgICBteSAkZmg7CisKKyAgICAjIElmIHRoZSBmaWxlbmFtZSBpcyBhIHJlZmVyZW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMgYSB2YWxpZAorICAgICMgZmlsZWhhbmRsZSwgaWYgbm90IHdlIGNyZWF0ZSBhIGZpbGVoYW5kbGUuCisgICAgIworICAgIGlmIChyZWYoJG9sZWZpbGUpKSB7CisgICAgICAgICRmaCA9ICRvbGVmaWxlOworICAgIH0KKyAgICBlbHNleworCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IGZpbGUsIG9wZW4gZm9yIHdyaXRpbmcKKyAgICAgICAgJGZoID0gRmlsZUhhbmRsZS0+bmV3KCI+ICRvbGVmaWxlIik7CisKKyAgICAgICAgIyBXb3JrYm9vay5wbSBhbHNvIGNoZWNrcyB0aGlzIGJ1dCBzb21ldGhpbmcgbWF5IGhhdmUgaGFwcGVuZWQgc2luY2UKKyAgICAgICAgIyB0aGVuLgorICAgICAgICBpZiAobm90IGRlZmluZWQgJGZoKSB7CisgICAgICAgICAgICBjcm9hayAiQ2FuJ3Qgb3BlbiAkb2xlZmlsZS4gSXQgbWF5IGJlIGluIHVzZSBvciBwcm90ZWN0ZWQuXG4iOworICAgICAgICB9CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QKKyAgICAgICAgYmlubW9kZSgkZmgpOworCisgICAgICAgICRzZWxmLT57X2ludGVybmFsX2ZofSA9IDE7CisgICAgfQorCisgICAgIyBTdG9yZSBmaWxlaGFuZGxlCisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gPSAkZmg7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfc2l6ZSgkYmlmZnNpemUpCisjCisjIFNldCB0aGUgc2l6ZSBvZiB0aGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBPTEUgc3RyZWFtCisjCisjICAgJGJpZ19ibG9ja3MgPSAoMTA5IGRlcG90IGJsb2NrIHggKDEyOCAtMSBtYXJrZXIgd29yZCkKKyMgICAgICAgICAgICAgICAgIC0gKDEgeCBlbmQgd29yZHMpKSA9IDEzODQyCisjICAgJG1heHNpemUgICAgPSAkYmlnX2Jsb2NrcyAqIDUxMiBieXRlcyA9IDcwODcxMDQKKyMKK3N1YiBzZXRfc2l6ZSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICRtYXhzaXplID0gN18wODdfMTA0OyAjIFVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QmlnIHRvIGV4Y2VlZCB0aGlzCisKKyAgICBpZiAoJF9bMF0gPiAkbWF4c2l6ZSkgeworICAgICAgICByZXR1cm4gJHNlbGYtPntfc2l6ZV9hbGxvd2VkfSA9IDA7CisgICAgfQorCisgICAgJHNlbGYtPntfYmlmZnNpemV9ID0gJF9bMF07CisKKyAgICAjIFNldCB0aGUgbWluIGZpbGUgc2l6ZSB0byA0ayB0byBhdm9pZCBoYXZpbmcgdG8gdXNlIHNtYWxsIGJsb2NrcworICAgIGlmICgkX1swXSA+IDQwOTYpIHsKKyAgICAgICAgJHNlbGYtPntfYm9va3NpemV9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19ib29rc2l6ZX0gPSA0MDk2OworICAgIH0KKworICAgIHJldHVybiAkc2VsZi0+e19zaXplX2FsbG93ZWR9ID0gMTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NhbGN1bGF0ZV9zaXplcygpCisjCisjIENhbGN1bGF0ZSB2YXJpb3VzIHNpemVzIG5lZWRlZCBmb3IgdGhlIE9MRSBzdHJlYW0KKyMKK3N1YiBfY2FsY3VsYXRlX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhc2l6ZSA9ICRzZWxmLT57X2Jvb2tzaXplfTsKKworICAgIGlmICgkZGF0YXNpemUgJSA1MTIgPT0gMCkgeworICAgICAgICAkc2VsZi0+e19iaWdfYmxvY2tzfSA9ICRkYXRhc2l6ZS81MTI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19iaWdfYmxvY2tzfSA9IGludCgkZGF0YXNpemUvNTEyKSArMTsKKyAgICB9CisgICAgIyBUaGVyZSBhcmUgMTI3IGxpc3QgYmxvY2tzIGFuZCAxIG1hcmtlciBibG9ja3MgZm9yIGVhY2ggYmlnIGJsb2NrCisgICAgIyBkZXBvdCArIDEgZW5kIG9mIGNoYWluIGJsb2NrCisgICAgJHNlbGYtPntfbGlzdF9ibG9ja3N9ID0gaW50KCgkc2VsZi0+e19iaWdfYmxvY2tzfSkvMTI3KSArMTsKKyAgICAkc2VsZi0+e19yb290X3N0YXJ0fSAgPSAkc2VsZi0+e19iaWdfYmxvY2tzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNsb3NlKCkKKyMKKyMgV3JpdGUgcm9vdCBlbnRyeSwgYmlnIGJsb2NrIGxpc3QgYW5kIGNsb3NlIHRoZSBmaWxlaGFuZGxlLgorIyBUaGlzIHJvdXRpbmUgaXMgdXNlZCB0byBleHBsaWNpdGx5IGNsb3NlIHRoZSBvcGVuIGZpbGVoYW5kbGUgd2l0aG91dAorIyBoYXZpbmcgdG8gd2FpdCBmb3IgREVTVFJPWS4KKyMKK3N1YiBjbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmIG5vdCAkc2VsZi0+e19zaXplX2FsbG93ZWR9OworCisgICAgJHNlbGYtPl93cml0ZV9wYWRkaW5nKCkgICAgICAgICAgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl93cml0ZV9wcm9wZXJ0eV9zdG9yYWdlKCkgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl93cml0ZV9iaWdfYmxvY2tfZGVwb3QoKSAgaWYgbm90ICRzZWxmLT57X2JpZmZfb25seX07CisKKyAgICBteSAkY2xvc2UgPSAxOyAjIERlZmF1bHQgdG8gbm8gZXJyb3IgZm9yIGV4dGVybmFsIGZpbGVoYW5kbGVzLgorCisgICAgIyBDbG9zZSB0aGUgZmlsZWhhbmRsZSBpZiBpdCB3YXMgY3JlYXRlZCBpbnRlcm5hbGx5LgorICAgICRjbG9zZSA9IENPUkU6OmNsb3NlKCRzZWxmLT57X2ZpbGVoYW5kbGV9KSBpZiAkc2VsZi0+e19pbnRlcm5hbF9maH07CisKKyAgICAkc2VsZi0+e19maWxlY2xvc2VkfSA9IDE7CisKKyAgICByZXR1cm4gJGNsb3NlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgREVTVFJPWSgpCisjCisjIENsb3NlIHRoZSBmaWxlaGFuZGxlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBjbG9zZWQuCisjCitzdWIgREVTVFJPWSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgbG9jYWwgKCRALCAkISwgJF5FLCAkPyk7CisKKyAgICAkc2VsZi0+Y2xvc2UoKSB1bmxlc3MgJHNlbGYtPntfZmlsZWNsb3NlZH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZSgkZGF0YSkKKyMKKyMgV3JpdGUgQklGRiBkYXRhIHRvIE9MRSBmaWxlLgorIworc3ViIHdyaXRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICRfWzBdOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfaGVhZGVyKCkKKyMKKyMgV3JpdGUgT0xFIGhlYWRlciBibG9jay4KKyMKK3N1YiB3cml0ZV9oZWFkZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuIGlmICRzZWxmLT57X2JpZmZfb25seX07CisgICAgJHNlbGYtPl9jYWxjdWxhdGVfc2l6ZXMoKTsKKworICAgIG15ICRyb290X3N0YXJ0ICAgICAgPSAkc2VsZi0+e19yb290X3N0YXJ0fTsKKyAgICBteSAkbnVtX2xpc3RzICAgICAgID0gJHNlbGYtPntfbGlzdF9ibG9ja3N9OworCisgICAgbXkgJGlkICAgICAgICAgICAgICA9IHBhY2soIk5OIiwgICAweEQwQ0YxMUUwLCAweEExQjExQUUxKTsKKyAgICBteSAkdW5rbm93bjEgICAgICAgID0gcGFjaygiVlZWViIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDApOworICAgIG15ICR1bmtub3duMiAgICAgICAgPSBwYWNrKCJ2diIsICAgMHgzRSwgMHgwMyk7CisgICAgbXkgJHVua25vd24zICAgICAgICA9IHBhY2soInYiLCAgICAtMik7CisgICAgbXkgJHVua25vd240ICAgICAgICA9IHBhY2soInYiLCAgICAweDA5KTsKKyAgICBteSAkdW5rbm93bjUgICAgICAgID0gcGFjaygiVlZWIiwgIDB4MDYsIDB4MDAsIDB4MDApOworICAgIG15ICRudW1fYmJkX2Jsb2NrcyAgPSBwYWNrKCJWIiwgICAgJG51bV9saXN0cyk7CisgICAgbXkgJHJvb3Rfc3RhcnRibG9jayA9IHBhY2soIlYiLCAgICAkcm9vdF9zdGFydCk7CisgICAgbXkgJHVua25vd242ICAgICAgICA9IHBhY2soIlZWIiwgICAweDAwLCAweDEwMDApOworICAgIG15ICRzYmRfc3RhcnRibG9jayAgPSBwYWNrKCJWIiwgICAgLTIpOworICAgIG15ICR1bmtub3duNyAgICAgICAgPSBwYWNrKCJWVlYiLCAgMHgwMCwgLTIgLDB4MDApOworICAgIG15ICR1bnVzZWQgICAgICAgICAgPSBwYWNrKCJWIiwgICAgLTEpOworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkaWQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd24xOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMjsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjM7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHVua25vd240OworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duNTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkbnVtX2JiZF9ibG9ja3M7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHJvb3Rfc3RhcnRibG9jazsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkdW5rbm93bjY7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHNiZF9zdGFydGJsb2NrOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duNzsKKworICAgIGZvciAoMS4uJG51bV9saXN0cykgeworICAgICAgICAkcm9vdF9zdGFydCsrOworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICBwYWNrKCJWIiwgJHJvb3Rfc3RhcnQpOworICAgIH0KKworICAgIGZvciAoJG51bV9saXN0cy4uMTA4KSB7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bnVzZWQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX2JpZ19ibG9ja19kZXBvdCgpCisjCisjIFdyaXRlIGJpZyBibG9jayBkZXBvdC4KKyMKK3N1YiBfd3JpdGVfYmlnX2Jsb2NrX2RlcG90IHsKKworICAgIG15ICRzZWxmICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkbnVtX2Jsb2NrcyAgID0gJHNlbGYtPntfYmlnX2Jsb2Nrc307CisgICAgbXkgJG51bV9saXN0cyAgICA9ICRzZWxmLT57X2xpc3RfYmxvY2tzfTsKKyAgICBteSAkdG90YWxfYmxvY2tzID0gJG51bV9saXN0cyAqMTI4OworICAgIG15ICR1c2VkX2Jsb2NrcyAgPSAkbnVtX2Jsb2NrcyArICRudW1fbGlzdHMgKzI7CisKKyAgICBteSAkbWFya2VyICAgICAgID0gcGFjaygiViIsIC0zKTsKKyAgICBteSAkZW5kX29mX2NoYWluID0gcGFjaygiViIsIC0yKTsKKyAgICBteSAkdW51c2VkICAgICAgID0gcGFjaygiViIsIC0xKTsKKworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBmb3IgbXkgJGkgKDEuLiRudW1fYmxvY2tzLTEpIHsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgcGFjaygiViIsJGkpOworICAgIH0KKworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRlbmRfb2ZfY2hhaW47CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJGVuZF9vZl9jaGFpbjsKKworICAgIGZvciAoMS4uJG51bV9saXN0cykgeworICAgICAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkbWFya2VyOworICAgIH0KKworICAgIGZvciAoJHVzZWRfYmxvY2tzLi4kdG90YWxfYmxvY2tzKSB7CisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bnVzZWQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3Byb3BlcnR5X3N0b3JhZ2UoKQorIworIyBXcml0ZSBwcm9wZXJ0eSBzdG9yYWdlLiBUT0RPOiBhZGQgc3VtbWFyeSBzaGVldHMKKyMKK3N1YiBfd3JpdGVfcHJvcGVydHlfc3RvcmFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgIG15ICRyb290c2l6ZSA9IC0yOworICAgIG15ICRib29rc2l6ZSA9ICRzZWxmLT57X2Jvb2tzaXplfTsKKworICAgICMjIyMjIyMjIyMjIyMjIyMjICBuYW1lICAgICAgICAgdHlwZSAgIGRpciBzdGFydCBzaXplCisgICAgJHNlbGYtPl93cml0ZV9wcHMoJ1Jvb3QgRW50cnknLCAweDA1LCAgIDEsICAgLTIsIDB4MDApOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCdXb3JrYm9vaycsICAgMHgwMiwgIC0xLCAweDAwLCAkYm9va3NpemUpOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCcnLCAgICAgICAgICAgMHgwMCwgIC0xLCAweDAwLCAweDAwMDApOworICAgICRzZWxmLT5fd3JpdGVfcHBzKCcnLCAgICAgICAgICAgMHgwMCwgIC0xLCAweDAwLCAweDAwMDApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3BwcygpCisjCisjIFdyaXRlIHByb3BlcnR5IHNoZWV0IGluIHByb3BlcnR5IHN0b3JhZ2UKKyMKK3N1YiBfd3JpdGVfcHBzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRuYW1lICAgICAgICAgICAgPSAkX1swXTsKKyAgICBteSBAbmFtZSAgICAgICAgICAgID0gKCk7CisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDA7CisKKyAgICBpZiAoJG5hbWUgbmUgJycpIHsKKyAgICAgICAgJG5hbWUgICA9ICRfWzBdIC4gIlwwIjsKKyAgICAgICAgIyBTaW11bGF0ZSBhIFVuaWNvZGUgc3RyaW5nCisgICAgICAgIEBuYW1lICAgPSBtYXAob3JkLCBzcGxpdCgnJywgJG5hbWUpKTsKKyAgICAgICAgJGxlbmd0aCA9IGxlbmd0aCgkbmFtZSkgKiAyOworICAgIH0KKworICAgIG15ICRyYXduYW1lICAgICAgICAgPSBwYWNrKCJ2KiIsIEBuYW1lKTsKKyAgICBteSAkemVybyAgICAgICAgICAgID0gcGFjaygiQyIsICAwKTsKKworICAgIG15ICRwcHNfc2l6ZW9mbmFtZSAgPSBwYWNrKCJ2IiwgICRsZW5ndGgpOyAgICAjMHg0MAorICAgIG15ICRwcHNfdHlwZSAgICAgICAgPSBwYWNrKCJ2IiwgICRfWzFdKTsgICAgICAjMHg0MgorICAgIG15ICRwcHNfcHJldiAgICAgICAgPSBwYWNrKCJWIiwgIC0xKTsgICAgICAgICAjMHg0NAorICAgIG15ICRwcHNfbmV4dCAgICAgICAgPSBwYWNrKCJWIiwgIC0xKTsgICAgICAgICAjMHg0OAorICAgIG15ICRwcHNfZGlyICAgICAgICAgPSBwYWNrKCJWIiwgICRfWzJdKTsgICAgICAjMHg0YworCisgICAgbXkgJHVua25vd24xICAgICAgICA9IHBhY2soIlYiLCAgMCk7CisKKyAgICBteSAkcHBzX3RzMXMgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NjQKKyAgICBteSAkcHBzX3RzMWQgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NjgKKyAgICBteSAkcHBzX3RzMnMgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NmMKKyAgICBteSAkcHBzX3RzMmQgICAgICAgID0gcGFjaygiViIsICAwKTsgICAgICAgICAgIzB4NzAKKyAgICBteSAkcHBzX3NiICAgICAgICAgID0gcGFjaygiViIsICAkX1szXSk7ICAgICAgIzB4NzQKKyAgICBteSAkcHBzX3NpemUgICAgICAgID0gcGFjaygiViIsICAkX1s0XSk7ICAgICAgIzB4NzgKKworCisgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgIGxvY2FsICRcID0gdW5kZWY7CisKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcmF3bmFtZTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkemVybyB4ICg2NCAtJGxlbmd0aCk7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19zaXplb2ZuYW1lOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfdHlwZTsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3ByZXY7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19uZXh0OworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfZGlyOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMSB4IDU7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190czFzOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfdHMxZDsKKyAgICBwcmludCB7JHNlbGYtPntfZmlsZWhhbmRsZX19ICAkcHBzX3RzMmQ7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc190czJkOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICRwcHNfc2I7CisgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgJHBwc19zaXplOworICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gICR1bmtub3duMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV9wYWRkaW5nKCkKKyMKKyMgUGFkIHRoZSBlbmQgb2YgdGhlIGZpbGUKKyMKK3N1YiBfd3JpdGVfcGFkZGluZyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkYmlmZnNpemUgPSAkc2VsZi0+e19iaWZmc2l6ZX07CisgICAgbXkgJG1pbl9zaXplOworCisgICAgaWYgKCRiaWZmc2l6ZSA8IDQwOTYpIHsKKyAgICAgICAgJG1pbl9zaXplID0gNDA5NjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRtaW5fc2l6ZSA9IDUxMjsKKyAgICB9CisKKyAgICAjIFByb3RlY3QgcHJpbnQoKSBmcm9tIC1sIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgIGlmICgkYmlmZnNpemUgJSAkbWluX3NpemUgIT0gMCkgeworICAgICAgICBteSAkcGFkZGluZyAgPSAkbWluX3NpemUgLSAoJGJpZmZzaXplICUgJG1pbl9zaXplKTsKKyAgICAgICAgcHJpbnQgeyRzZWxmLT57X2ZpbGVoYW5kbGV9fSAgIlwwIiB4ICRwYWRkaW5nOworICAgIH0KK30KKworCisxOworCisKK19fRU5EX18KKworCis9aGVhZDEgTkFNRQorCitPTEV3cml0ZXIgLSBBIHdyaXRlciBjbGFzcyB0byBzdG9yZSBCSUZGIGRhdGEgaW4gYSBPTEUgY29tcG91bmQgc3RvcmFnZSBmaWxlLgorCis9aGVhZDEgU1lOT1BTSVMKKworU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCis9aGVhZDEgQVVUSE9SCisKK0pvaG4gTWNOYW1hcmEgam1jbmFtYXJhQGNwYW4ub3JnCisKKz1oZWFkMSBDT1BZUklHSFQKKworqSBNTS1NTVgsIEpvaG4gTWNOYW1hcmEuCisKK0FsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgbW9kdWxlIGlzIGZyZWUgc29mdHdhcmUuIEl0IG1heSBiZSB1c2VkLCByZWRpc3RyaWJ1dGVkIGFuZC9vciBtb2RpZmllZCB1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KZGlmZiAtLWdpdCBhL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvUHJvcGVydGllcy5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvUHJvcGVydGllcy5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmM5MzNhCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Qcm9wZXJ0aWVzLnBtCkBAIC0wLDAgKzEsMzUyIEBACitwYWNrYWdlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpQcm9wZXJ0aWVzOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFByb3BlcnRpZXMgLSBBIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgcHJvcGVydHkgc2V0cy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEuCisjCisjIERvY3VtZW50YXRpb24gYWZ0ZXIgX19FTkRfXworIworCit1c2UgRXhwb3J0ZXI7Cit1c2Ugc3RyaWN0OwordXNlIENhcnA7Cit1c2UgUE9TSVggJ2Ztb2QnOwordXNlIFRpbWU6OkxvY2FsICd0aW1lbG9jYWwnOworCisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBIEBFWFBPUlQgQEVYUE9SVF9PSyAlRVhQT1JUX1RBR1MpOworQElTQSAgICAgICAgPSBxdyhFeHBvcnRlcik7CisKKyRWRVJTSU9OICAgID0gJzIuMzcnOworCisjIFNldCB1cCB0aGUgZXhwb3J0cy4KK215IEBhbGxfZnVuY3Rpb25zID0gcXcoCisgICAgY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0CisgICAgY3JlYXRlX2RvY19zdW1tYXJ5X3Byb3BlcnR5X3NldAorICAgIF9wYWNrX3Byb3BlcnR5X2RhdGEKKyAgICBfcGFja19WVF9JMgorICAgIF9wYWNrX1ZUX0xQU1RSCisgICAgX3BhY2tfVlRfRklMRVRJTUUKKyk7CisKK215IEBwcHNfc3VtbWFyaWVzID0gcXcoCisgICAgY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0CisgICAgY3JlYXRlX2RvY19zdW1tYXJ5X3Byb3BlcnR5X3NldAorKTsKKworQEVYUE9SVCAgICAgICAgID0gKCk7CitARVhQT1JUX09LICAgICAgPSAoQGFsbF9mdW5jdGlvbnMpOworJUVYUE9SVF9UQUdTICAgID0gKHRlc3RpbmcgICAgICAgICAgPT4gXEBhbGxfZnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X3NldHMgICAgPT4gXEBwcHNfc3VtbWFyaWVzLAorICAgICAgICAgICAgICAgICAgKTsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNyZWF0ZV9zdW1tYXJ5X3Byb3BlcnR5X3NldCgpLgorIworIyBDcmVhdGUgdGhlIFN1bW1hcnlJbmZvcm1hdGlvbiBwcm9wZXJ0eSBzZXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgZm9yIHRoZQorIyBUaXRsZSwgU3ViamVjdCwgQXV0aG9yLCBLZXl3b3JkcywgQ29tbWVudHMsIExhc3QgYXV0aG9yIGtleXdvcmRzIGFuZCB0aGUKKyMgY3JlYXRpb24gZGF0ZS4KKyMKK3N1YiBjcmVhdGVfc3VtbWFyeV9wcm9wZXJ0eV9zZXQgeworCisgICAgbXkgQHByb3BlcnRpZXMgICAgICAgICAgPSBAeyRfWzBdfTsKKworICAgIG15ICRieXRlX29yZGVyICAgICAgICAgID0gcGFjayAndicsICAweEZGRkU7CisgICAgbXkgJHZlcnNpb24gICAgICAgICAgICAgPSBwYWNrICd2JywgIDB4MDAwMDsKKyAgICBteSAkc3lzdGVtX2lkICAgICAgICAgICA9IHBhY2sgJ1YnLCAgMHgwMDAyMDEwNTsKKyAgICBteSAkY2xhc3NfaWQgICAgICAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzsKKyAgICBteSAkbnVtX3Byb3BlcnR5X3NldHMgICA9IHBhY2sgJ1YnLCAgMHgwMDAxOworICAgIG15ICRmb3JtYXRfaWQgICAgICAgICAgID0gcGFjayAnSConLCAnRTA4NTlGRjJGOTRGNjgxMEFCOTEwODAwMkIyN0IzRDknOworICAgIG15ICRvZmZzZXQgICAgICAgICAgICAgID0gcGFjayAnVicsICAweDAwMzA7CisgICAgbXkgJG51bV9wcm9wZXJ0eSAgICAgICAgPSBwYWNrICdWJywgIHNjYWxhciBAcHJvcGVydGllczsKKyAgICBteSAkcHJvcGVydHlfb2Zmc2V0cyAgICA9ICcnOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHNldCBkYXRhIGJsb2NrIGFuZCBjYWxjdWxhdGUgdGhlIG9mZnNldHMgaW50byBpdC4KKyAgICBteSAoJHByb3BlcnR5X2RhdGEsICRvZmZzZXRzKSA9IF9wYWNrX3Byb3BlcnR5X2RhdGEoXEBwcm9wZXJ0aWVzKTsKKworICAgICMgQ3JlYXRlIHRoZSBwcm9wZXJ0eSB0eXBlIGFuZCBvZmZzZXRzIGJhc2VkIG9uIHRoZSBwcmV2aW91cyBjYWxjdWxhdGlvbi4KKyAgICBmb3IgbXkgJGkgKDAgLi4gQHByb3BlcnRpZXMgLTEpIHsKKyAgICAgICAgJHByb3BlcnR5X29mZnNldHMgLj0gcGFjaygnVlYnLCAkcHJvcGVydGllc1skaV0tPlswXSwgJG9mZnNldHMtPlskaV0pOworICAgIH0KKworICAgICMgU2l6ZSBvZiAkc2l6ZSAoNCBieXRlcykgKyAgJG51bV9wcm9wZXJ0eSAoNCBieXRlcykgKyB0aGUgZGF0YSBzdHJ1Y3R1cmVzLgorICAgIG15ICRzaXplID0gOCArIGxlbmd0aCgkcHJvcGVydHlfb2Zmc2V0cykgKyBsZW5ndGgoJHByb3BlcnR5X2RhdGEpOworICAgICAgICRzaXplID0gcGFjayAnVicsICAkc2l6ZTsKKworCisgICAgcmV0dXJuICAkYnl0ZV9vcmRlciAgICAgICAgIC4KKyAgICAgICAgICAgICR2ZXJzaW9uICAgICAgICAgICAgLgorICAgICAgICAgICAgJHN5c3RlbV9pZCAgICAgICAgICAuCisgICAgICAgICAgICAkY2xhc3NfaWQgICAgICAgICAgIC4KKyAgICAgICAgICAgICRudW1fcHJvcGVydHlfc2V0cyAgLgorICAgICAgICAgICAgJGZvcm1hdF9pZCAgICAgICAgICAuCisgICAgICAgICAgICAkb2Zmc2V0ICAgICAgICAgICAgIC4KKyAgICAgICAgICAgICRzaXplICAgICAgICAgICAgICAgLgorICAgICAgICAgICAgJG51bV9wcm9wZXJ0eSAgICAgICAuCisgICAgICAgICAgICAkcHJvcGVydHlfb2Zmc2V0cyAgIC4KKyAgICAgICAgICAgICRwcm9wZXJ0eV9kYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQ3JlYXRlIHRoZSBEb2NTdW1tYXJ5SW5mb3JtYXRpb24gcHJvcGVydHkgc2V0LiBUaGlzIGlzIG1haW5seSB1c2VkIGZvciB0aGUKKyMgTWFuYWdlciwgQ29tcGFueSBhbmQgQ2F0ZWdvcnkga2V5d29yZHMuCisjCisjIFRoZSBEb2NTdW1tYXJ5IGFsc28gY29udGFpbnMgYSBzdHJlYW0gZm9yIHVzZXIgZGVmaW5lZCBwcm9wZXJ0aWVzLiBIb3dldmVyCisjIHRoaXMgaXMgYSBsaXR0bGUgYXJjYW5lIGFuZCBwcm9iYWJseSBub3Qgd29ydGggdGhlIGltcGxlbWVudGF0aW9uIGVmZm9ydC4KKyMKK3N1YiBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0IHsKKworICAgIG15IEBwcm9wZXJ0aWVzICAgICAgICAgID0gQHskX1swXX07CisKKyAgICBteSAkYnl0ZV9vcmRlciAgICAgICAgICA9IHBhY2sgJ3YnLCAgMHhGRkZFOworICAgIG15ICR2ZXJzaW9uICAgICAgICAgICAgID0gcGFjayAndicsICAweDAwMDA7CisgICAgbXkgJHN5c3RlbV9pZCAgICAgICAgICAgPSBwYWNrICdWJywgIDB4MDAwMjAxMDU7CisgICAgbXkgJGNsYXNzX2lkICAgICAgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCc7CisgICAgbXkgJG51bV9wcm9wZXJ0eV9zZXRzICAgPSBwYWNrICdWJywgIDB4MDAwMjsKKworICAgIG15ICRmb3JtYXRfaWRfMCAgICAgICAgID0gcGFjayAnSConLCAnMDJENUNERDU5QzJFMUIxMDkzOTcwODAwMkIyQ0Y5QUUnOworICAgIG15ICRmb3JtYXRfaWRfMSAgICAgICAgID0gcGFjayAnSConLCAnMDVENUNERDU5QzJFMUIxMDkzOTcwODAwMkIyQ0Y5QUUnOworICAgIG15ICRvZmZzZXRfMCAgICAgICAgICAgID0gcGFjayAnVicsICAweDAwNDQ7CisgICAgbXkgJG51bV9wcm9wZXJ0eV8wICAgICAgPSBwYWNrICdWJywgIHNjYWxhciBAcHJvcGVydGllczsKKyAgICBteSAkcHJvcGVydHlfb2Zmc2V0c18wICA9ICcnOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHNldCBkYXRhIGJsb2NrIGFuZCBjYWxjdWxhdGUgdGhlIG9mZnNldHMgaW50byBpdC4KKyAgICBteSAoJHByb3BlcnR5X2RhdGFfMCwgJG9mZnNldHMpID0gX3BhY2tfcHJvcGVydHlfZGF0YShcQHByb3BlcnRpZXMpOworCisgICAgIyBDcmVhdGUgdGhlIHByb3BlcnR5IHR5cGUgYW5kIG9mZnNldHMgYmFzZWQgb24gdGhlIHByZXZpb3VzIGNhbGN1bGF0aW9uLgorICAgIGZvciBteSAkaSAoMCAuLiBAcHJvcGVydGllcyAtMSkgeworICAgICAgICAkcHJvcGVydHlfb2Zmc2V0c18wIC49IHBhY2soJ1ZWJywgJHByb3BlcnRpZXNbJGldLT5bMF0sICRvZmZzZXRzLT5bJGldKTsKKyAgICB9CisKKyAgICAjIFNpemUgb2YgJHNpemUgKDQgYnl0ZXMpICsgICRudW1fcHJvcGVydHkgKDQgYnl0ZXMpICsgdGhlIGRhdGEgc3RydWN0dXJlcy4KKyAgICBteSAkZGF0YV9sZW4gPSA4ICsgbGVuZ3RoKCRwcm9wZXJ0eV9vZmZzZXRzXzApICsgbGVuZ3RoKCRwcm9wZXJ0eV9kYXRhXzApOworICAgIG15ICRzaXplXzAgICA9IHBhY2sgJ1YnLCAgJGRhdGFfbGVuOworCisKKyAgICAjIFRoZSBzZWNvbmQgcHJvcGVydHkgc2V0IG9mZnNldCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdCBwcm9wZXJ0eSBzZXQuCisgICAgbXkgJG9mZnNldF8xID0gcGFjayAnVicsICAweDAwNDQgKyAkZGF0YV9sZW47CisKKyAgICAjIFdlIHdpbGwgdXNlIGEgc3RhdGljIHByb3BlcnR5IHNldCBzdHJlYW0gcmF0aGVyIHRoYW4gdHJ5IHRvIGdlbmVyYXRlIGl0LgorICAgIG15ICRwcm9wZXJ0eV9kYXRhXzEgPSBwYWNrICdIKicsIGpvaW4gJycsIHF3ICgKKyAgICAgICAgOTggMDAgMDAgMDAgMDMgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMjAgMDAgMDAgMDAKKyAgICAgICAgMDEgMDAgMDAgMDAgMzYgMDAgMDAgMDAgMDIgMDAgMDAgMDAgM0UgMDAgMDAgMDAKKyAgICAgICAgMDEgMDAgMDAgMDAgMDIgMDAgMDAgMDAgMEEgMDAgMDAgMDAgNUYgNTAgNDkgNDQKKyAgICAgICAgNUYgNDcgNTUgNDkgNDQgMDAgMDIgMDAgMDAgMDAgRTQgMDQgMDAgMDAgNDEgMDAKKyAgICAgICAgMDAgMDAgNEUgMDAgMDAgMDAgN0IgMDAgMzEgMDAgMzYgMDAgNDMgMDAgMzQgMDAKKyAgICAgICAgNDIgMDAgMzggMDAgMzMgMDAgNDIgMDAgMkQgMDAgMzkgMDAgMzYgMDAgMzUgMDAKKyAgICAgICAgNDYgMDAgMkQgMDAgMzQgMDAgNDIgMDAgMzIgMDAgMzEgMDAgMkQgMDAgMzkgMDAKKyAgICAgICAgMzAgMDAgMzMgMDAgNDQgMDAgMkQgMDAgMzkgMDAgMzEgMDAgMzAgMDAgNDYgMDAKKyAgICAgICAgNDEgMDAgNDQgMDAgNDYgMDAgNDEgMDAgMzcgMDAgMzAgMDAgMzEgMDAgNDIgMDAKKyAgICAgICAgN0QgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMkQgMDAgMzkgMDAgMzAgMDAgMzMgMDAKKyAgICApOworCisKKyAgICByZXR1cm4gICRieXRlX29yZGVyICAgICAgICAgLgorICAgICAgICAgICAgJHZlcnNpb24gICAgICAgICAgICAuCisgICAgICAgICAgICAkc3lzdGVtX2lkICAgICAgICAgIC4KKyAgICAgICAgICAgICRjbGFzc19pZCAgICAgICAgICAgLgorICAgICAgICAgICAgJG51bV9wcm9wZXJ0eV9zZXRzICAuCisgICAgICAgICAgICAkZm9ybWF0X2lkXzAgICAgICAgIC4KKyAgICAgICAgICAgICRvZmZzZXRfMCAgICAgICAgICAgLgorICAgICAgICAgICAgJGZvcm1hdF9pZF8xICAgICAgICAuCisgICAgICAgICAgICAkb2Zmc2V0XzEgICAgICAgICAgIC4KKworICAgICAgICAgICAgJHNpemVfMCAgICAgICAgICAgICAuCisgICAgICAgICAgICAkbnVtX3Byb3BlcnR5XzAgICAgIC4KKyAgICAgICAgICAgICRwcm9wZXJ0eV9vZmZzZXRzXzAgLgorICAgICAgICAgICAgJHByb3BlcnR5X2RhdGFfMCAgICAuCisKKyAgICAgICAgICAgICRwcm9wZXJ0eV9kYXRhXzE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19wcm9wZXJ0eV9kYXRhKCkuCisjCisjIENyZWF0ZSBhIHBhY2tlZCBwcm9wZXJ0eSBzZXQgc3RydWN0dXJlLiBTdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgYW5kCisjIHBhZGRlZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4gV2UgYWxzbyB1c2UgdGhpcyBmdW5jdGlvbiB0byBrZWVwIHRyYWNrIG9mIHRoZQorIyBwcm9wZXJ0eSBvZmZzZXRzIHdpdGhpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUuIFRoZXNlIG9mZnNldHMgYXJlIHVzZWQgYnkgdGhlCisjIGNhbGxpbmcgZnVuY3Rpb25zLiBDdXJyZW50bHkgd2Ugb25seSBuZWVkIHRvIGhhbmRsZSA0IHByb3BlcnR5IHR5cGVzOgorIyBWVF9JMiwgVlRfTFBTVFIsIFZUX0ZJTEVUSU1FLgorIworc3ViIF9wYWNrX3Byb3BlcnR5X2RhdGEgeworCisgICAgbXkgQHByb3BlcnRpZXMgICAgICAgICAgPSBAeyRfWzBdfTsKKyAgICBteSAkb2Zmc2V0ICAgICAgICAgICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJHBhY2tlZF9wcm9wZXJ0eSAgICAgPSAnJzsKKyAgICBteSAkZGF0YSAgICAgICAgICAgICAgICA9ICcnOworICAgIG15IEBvZmZzZXRzOworCisgICAgIyBHZXQgdGhlIHN0cmluZ3MgY29kZXBhZ2UgZnJvbSB0aGUgZmlyc3QgcHJvcGVydHkuCisgICAgbXkgJGNvZGVwYWdlID0gJHByb3BlcnRpZXNbMF0tPlsyXTsKKworICAgICMgVGhlIHByb3BlcnRpZXMgc3RhcnQgYWZ0ZXIgOCBieXRlcyBmb3Igc2l6ZSArIG51bV9wcm9wZXJ0aWVzICsgOCBieXRlcworICAgICMgZm9yIGVhY2ggcHJvcGV0eSB0eXBlL29mZnNldCBwYWlyLgorICAgICRvZmZzZXQgKz0gOCAqIChAcHJvcGVydGllcyArIDEpOworCisgICAgZm9yIG15ICRwcm9wZXJ0eSAoQHByb3BlcnRpZXMpIHsKKyAgICAgICAgcHVzaCBAb2Zmc2V0cywgJG9mZnNldDsKKworICAgICAgICBteSAkcHJvcGVydHlfdHlwZSA9ICRwcm9wZXJ0eS0+WzFdOworCisgICAgICAgIGlmICAgICgkcHJvcGVydHlfdHlwZSBlcSAnVlRfSTInKSB7CisgICAgICAgICAgICAkcGFja2VkX3Byb3BlcnR5ID0gX3BhY2tfVlRfSTIoJHByb3BlcnR5LT5bMl0pOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkcHJvcGVydHlfdHlwZSBlcSAnVlRfTFBTVFInKSB7CisgICAgICAgICAgICAkcGFja2VkX3Byb3BlcnR5ID0gX3BhY2tfVlRfTFBTVFIoJHByb3BlcnR5LT5bMl0sICRjb2RlcGFnZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRwcm9wZXJ0eV90eXBlIGVxICdWVF9GSUxFVElNRScpIHsKKyAgICAgICAgICAgICRwYWNrZWRfcHJvcGVydHkgPSBfcGFja19WVF9GSUxFVElNRSgkcHJvcGVydHktPlsyXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjcm9hayAiVW5rbm93biBwcm9wZXJ0eSB0eXBlOiAkcHJvcGVydHlfdHlwZVxuIjsKKyAgICAgICAgfQorCisgICAgICAgICRvZmZzZXQgKz0gbGVuZ3RoICRwYWNrZWRfcHJvcGVydHk7CisgICAgICAgICRkYXRhICAgLj0gJHBhY2tlZF9wcm9wZXJ0eTsKKyAgICB9CisKKyAgICByZXR1cm4gJGRhdGEsIFxAb2Zmc2V0czsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX1ZUX0kyKCkuCisjCisjIFBhY2sgYW4gT0xFIHByb3BlcnR5IHR5cGU6IFZUX0kyLCAxNi1iaXQgc2lnbmVkIGludGVnZXIuCisjCitzdWIgX3BhY2tfVlRfSTIgeworCisgICAgbXkgJHR5cGUgICAgPSAweDAwMDI7CisgICAgbXkgJHZhbHVlICAgPSAkX1swXTsKKworICAgIG15ICRkYXRhID0gcGFjayAnVlYnLCAkdHlwZSwgJHZhbHVlOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfVlRfTFBTVFIoKS4KKyMKKyMgUGFjayBhbiBPTEUgcHJvcGVydHkgdHlwZTogVlRfTFBTVFIsIFN0cmluZyBpbiB0aGUgQ29kZXBhZ2UgZW5jb2RpbmcuCisjIFRoZSBzdHJpbmdzIGFyZSBudWxsIHRlcm1pbmF0ZWQgYW5kIHBhZGRlZCB0byBhIDQgYnl0ZSBib3VuZGFyeS4KKyMKK3N1YiBfcGFja19WVF9MUFNUUiB7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweDAwMUU7CisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF0gLiAiXDAiOworICAgIG15ICRjb2RlcGFnZSAgICA9ICRfWzFdOworICAgIG15ICRsZW5ndGg7CisgICAgbXkgJGJ5dGVfc3RyaW5nOworCisgICAgaWYgKCRjb2RlcGFnZSA9PSAweDA0RTQpIHsKKyAgICAgICAgIyBMYXRpbjEKKyAgICAgICAgJGJ5dGVfc3RyaW5nID0gJHN0cmluZzsKKyAgICAgICAgJGxlbmd0aCAgICAgID0gbGVuZ3RoICRieXRlX3N0cmluZzsKKyAgICB9CisgICAgZWxzaWYgKCRjb2RlcGFnZSA9PSAweEZERTkpIHsKKyAgICAgICAgIyBVVEYtOAorICAgICAgICBpZiAoICRdID4gNS4wMDggKSB7CisgICAgICAgICAgICByZXF1aXJlIEVuY29kZTsKKyAgICAgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAkYnl0ZV9zdHJpbmcgPSBFbmNvZGU6OmVuY29kZV91dGY4KCRzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJGJ5dGVfc3RyaW5nID0gJHN0cmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRieXRlX3N0cmluZyA9ICRzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICAkbGVuZ3RoID0gbGVuZ3RoICRieXRlX3N0cmluZzsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGNyb2FrICJVbmtub3duIGNvZGVwYWdlOiAkY29kZXBhZ2VcbiI7CisgICAgfQorCisgICAgIyBQYWNrIHRoZSBkYXRhLgorICAgIG15ICRkYXRhICA9IHBhY2sgJ1ZWJywgJHR5cGUsICRsZW5ndGg7CisgICAgICAgJGRhdGEgLj0gJGJ5dGVfc3RyaW5nOworCisgICAgIyBUaGUgcGFja2VkIGRhdGEgaGFzIHRvIG51bGwgcGFkZGVkIHRvIGEgNCBieXRlIGJvdW5kYXJ5LgorICAgIGlmIChteSAkZXh0cmEgPSAkbGVuZ3RoICUgNCkgeworICAgICAgICAkZGF0YSAuPSAiXDAiIHggKDQgLSAkZXh0cmEpOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX1ZUX0ZJTEVUSU1FKCkuCisjCisjIFBhY2sgYW4gT0xFIHByb3BlcnR5IHR5cGU6IFZUX0ZJTEVUSU1FLgorIworc3ViIF9wYWNrX1ZUX0ZJTEVUSU1FIHsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4MDA0MDsKKyAgICBteSAkbG9jYWx0aW1lICAgPSAkX1swXTsKKworICAgICMgQ29udmVydCBmcm9tIGxvY2FsdGltZSB0byBzZWNvbmRzLgorICAgIG15ICRzZWNvbmRzID0gVGltZTo6TG9jYWw6OnRpbWVsb2NhbChAeyRsb2NhbHRpbWV9KTsKKworICAgICMgQWRkIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIHRoZSAxNjAxIGFuZCAxOTcwIGVwb2Nocy4KKyAgICAkc2Vjb25kcyArPSAxMTY0NDQ3MzYwMDsKKworICAgICMgVGhlIEZJTEVUSU1FIHNlY29uZHMgYXJlIGluIHVuaXRzIG9mIDEwMCBuYW5vc2Vjb25kcy4KKyAgICBteSAkbmFub3NlY29uZHMgPSAkc2Vjb25kcyAqIDFFNzsKKworICAgICMgUGFjayB0aGUgdG90YWwgbmFub3NlY29uZHMgaW50byA2NCBiaXRzLgorICAgIG15ICR0aW1lX2hpID0gaW50KCRuYW5vc2Vjb25kcyAvIDIqKjMyKTsKKyAgICBteSAkdGltZV9sbyA9IFBPU0lYOjpmbW9kKCRuYW5vc2Vjb25kcywgMioqMzIpOworCisgICAgbXkgJGRhdGEgPSBwYWNrICdWVlYnLCAkdHlwZSwgJHRpbWVfbG8sICR0aW1lX2hpOworCisgICAgcmV0dXJuICRkYXRhOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1Byb3BlcnRpZXMgLSBBIG1vZHVsZSBmb3IgY3JlYXRpbmcgRXhjZWwgcHJvcGVydHkgc2V0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgQzxzZXRfcHJvcGVydGllcygpPiBtZXRob2QgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgpkaWZmIC0tZ2l0IGEvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9VdGlsaXR5LnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9VdGlsaXR5LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NjE3ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1V0aWxpdHkucG0KQEAgLTAsMCArMSw5MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVXRpbGl0eSAtIEhlbHBlciBmdW5jdGlvbnMgZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorIworIyBDb3B5cmlnaHQgMjAwMC0yMDEwLCBKb2huIE1jTmFtYXJhLCBqbWNuYW1hcmFAY3Bhbi5vcmcKKyMKKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBhdXRvdXNlICdEYXRlOjpDYWxjJyAgPT4gcXcoRGVsdGFfREhNUyBEZWNvZGVfRGF0ZV9FVSBEZWNvZGVfRGF0ZV9VUyk7Cit1c2UgYXV0b3VzZSAnRGF0ZTo6TWFuaXAnID0+IHF3KFBhcnNlRGF0ZSBEYXRlX0luaXQpOworCisKKyMgRG8gYWxsIG9mIHRoZSBleHBvcnQgcHJlcGFyYXRpb24KK3VzZSB2YXJzIHF3KCRWRVJTSU9OIEBJU0EgQEVYUE9SVCBARVhQT1JUX09LICVFWFBPUlRfVEFHUyk7CisKKyMgUm93IGFuZCBjb2x1bW4gZnVuY3Rpb25zCitteSBAcm93Y29sICAgICAgPSBxdygKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX3Jvd2NvbF90b19jZWxsCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9jZWxsX3RvX3Jvd2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfcmFuZ2VfZm9ybXVsYQorICAgICAgICAgICAgICAgICAgICAgICAgeGxfaW5jX3JvdworICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGVjX3JvdworICAgICAgICAgICAgICAgICAgICAgICAgeGxfaW5jX2NvbAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGVjX2NvbAorICAgICAgICAgICAgICAgICAgICApOworCisjIERhdGUgYW5kIFRpbWUgZnVuY3Rpb25zCitteSBAZGF0ZXMgICAgICAgPSBxdygKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2RhdGVfbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgeGxfZGF0ZV8xOTA0CisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV90aW1lCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV9kYXRlCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9wYXJzZV9kYXRlX2luaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHhsX2RlY29kZV9kYXRlX0VVCisgICAgICAgICAgICAgICAgICAgICAgICB4bF9kZWNvZGVfZGF0ZV9VUworICAgICAgICAgICAgICAgICAgICApOworCisKK0BJU0EgICAgICAgICAgICA9IHF3KEV4cG9ydGVyKTsKK0BFWFBPUlRfT0sgICAgICA9ICAgKCk7CitARVhQT1JUICAgICAgICAgPSAgIChAcm93Y29sLCBAZGF0ZXMpOworJUVYUE9SVF9UQUdTICAgID0gICAoCisgICAgICAgICAgICAgICAgICAgICAgICByb3djb2wgID0+IFxAcm93Y29sLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZXMgICA9PiBcQGRhdGVzCisgICAgICAgICAgICAgICAgICAgICk7CisKKyRWRVJTSU9OICAgICAgICA9ICcyLjM3JzsKKworCisKKworPWhlYWQxIE5BTUUKKworVXRpbGl0eSAtIEhlbHBlciBmdW5jdGlvbnMgZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsLgorCisKKworPWhlYWQxIFNZTk9QU0lTCisKK0Z1bmN0aW9ucyB0byBoZWxwIHdpdGggc29tZSBjb21tb24gdGFza3Mgd2hlbiB1c2luZyBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworVGhlc2UgZnVuY3Rpb25zIG1haW5seSByZWxhdGUgdG8gZGVhbGluZyB3aXRoIHJvd3MgYW5kIGNvbHVtbnMgaW4gQTEgbm90YXRpb24gYW5kIHRvIGhhbmRsaW5nIGRhdGVzIGFuZCB0aW1lcy4KKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsgICAgICAgICAgICAgICAjIEltcG9ydCBldmVyeXRoaW5nCisKKyAgICAoJHJvdywgJGNvbCkgICAgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQzInKTsgICAgICAgICAgIyAoMSwgMikKKyAgICAkc3RyICAgICAgICAgICAgPSB4bF9yb3djb2xfdG9fY2VsbCgxLCAyKTsgICAgICAgICAgIyBDMgorICAgICRzdHIgICAgICAgICAgICA9IHhsX2luY19jb2woJ1oxJyAgKTsgICAgICAgICAgICAgICAjIEFBMQorICAgICRzdHIgICAgICAgICAgICA9IHhsX2RlY19jb2woJ0FBMScgKTsgICAgICAgICAgICAgICAjIFoxCisKKyAgICAkZGF0ZSAgICAgICAgICAgPSB4bF9kYXRlX2xpc3QoMjAwMiwgMSwgMSk7ICAgICAgICAgIyAzNzI1NworICAgICRkYXRlICAgICAgICAgICA9IHhsX3BhcnNlX2RhdGUoIjExIEp1bHkgMTk5NyIpOyAgICAjIDM1NjIyCisgICAgJHRpbWUgICAgICAgICAgID0geGxfcGFyc2VfdGltZSgnMzoyMTozNiBQTScpOyAgICAgICMgMC42NAorICAgICRkYXRlICAgICAgICAgICA9IHhsX2RlY29kZV9kYXRlX0VVKCIxMyBNYXkgMjAwMiIpOyAjIDM3Mzg5CisKKworCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHNldCBvZiBmdW5jdGlvbnMgdG8gaGVscCB3aXRoIHNvbWUgY29tbW9uIHRhc2tzIGVuY291bnRlcmVkIHdoZW4gdXNpbmcgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIG1vZHVsZS4gVGhlIHR3byBtYWluIGNhdGVnb3JpZXMgb2YgZnVuY3Rpb24gYXJlOgorCitSb3cgYW5kIGNvbHVtbiBmdW5jdGlvbnM6IHRoZXNlIGFyZSB1c2VkIHRvIGRlYWwgd2l0aCBFeGNlbCdzIEExIHJlcHJlc2VudGF0aW9uIG9mIGNlbGxzLiBUaGUgZnVuY3Rpb25zIGluIHRoaXMgY2F0ZWdvcnkgYXJlOgorCisgICAgeGxfcm93Y29sX3RvX2NlbGwKKyAgICB4bF9jZWxsX3RvX3Jvd2NvbAorICAgIHhsX3JhbmdlX2Zvcm11bGEKKyAgICB4bF9pbmNfcm93CisgICAgeGxfZGVjX3JvdworICAgIHhsX2luY19jb2wKKyAgICB4bF9kZWNfY29sCisKK0RhdGUgYW5kIFRpbWUgZnVuY3Rpb25zOiB0aGVzZSBhcmUgdXNlZCB0byBjb252ZXJ0IGRhdGVzIGFuZCB0aW1lcyB0byB0aGUgbnVtZXJpYyBmb3JtYXQgdXNlZCBieSBFeGNlbC4gVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGNhdGVnb3J5IGFyZToKKworICAgIHhsX2RhdGVfbGlzdAorICAgIHhsX2RhdGVfMTkwNAorICAgIHhsX3BhcnNlX3RpbWUKKyAgICB4bF9wYXJzZV9kYXRlCisgICAgeGxfcGFyc2VfZGF0ZV9pbml0CisgICAgeGxfZGVjb2RlX2RhdGVfRVUKKyAgICB4bF9kZWNvZGVfZGF0ZV9VUworCitBbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LiBIb3dldmVyLCB5b3UgY2FuIHVzZSBpbXBvcnQgbGlzdHMgaWYgeW91IHdpc2ggdG8gbGltaXQgdGhlIGZ1bmN0aW9ucyB0aGF0IGFyZSBpbXBvcnRlZDoKKworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eTsgICAgICAgICAgICAgICAgICAjIEltcG9ydCBldmVyeXRoaW5nCisgICAgdXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpVdGlsaXR5IHF3KHhsX2RhdGVfbGlzdCk7ICMgeGxfZGF0ZV9saXN0IG9ubHkKKyAgICB1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlV0aWxpdHkgcXcoOnJvd2NvbCk7ICAgICAgIyBSb3cvY29sIGZ1bmN0aW9ucworICAgIHVzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6VXRpbGl0eSBxdyg6ZGF0ZXMpOyAgICAgICAjIERhdGUgZnVuY3Rpb25zCisKKworCis9aGVhZDEgUk9XIEFORCBDT0xVTU4gRlVOQ1RJT05TCisKKworU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgc3VwcG9ydHMgdHdvIGZvcm1zIG9mIG5vdGF0aW9uIHRvIGRlc2lnbmF0ZSB0aGUgcG9zaXRpb24gb2YgY2VsbHM6IFJvdy1jb2x1bW4gbm90YXRpb24gYW5kIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIHVzZXMgYSB6ZXJvIGJhc2VkIGluZGV4IGZvciBib3RoIHJvdyBhbmQgY29sdW1uIHdoaWxlIEExIG5vdGF0aW9uIHVzZXMgdGhlIHN0YW5kYXJkIEV4Y2VsIGFscGhhbnVtZXJpYyBzZXF1ZW5jZSBvZiBjb2x1bW4gbGV0dGVyIGFuZCAxLWJhc2VkIHJvdy4gQ29sdW1ucyByYW5nZSBmcm9tIEEgdG8gSVYgaS5lLiAwIHRvIDI1NSwgcm93cyByYW5nZSBmcm9tIDEgdG8gMTYzODQgaW4gRXhjZWwgNSBhbmQgNjU1MzYgaW4gRXhjZWwgOTcuIEZvciBleGFtcGxlOgorCisgICAgKDAsIDApICAgICAgIyBUaGUgdG9wIGxlZnQgY2VsbCBpbiByb3ctY29sdW1uIG5vdGF0aW9uLgorICAgICgnQTEnKSAgICAgICMgVGhlIHRvcCBsZWZ0IGNlbGwgaW4gQTEgbm90YXRpb24uCisKKyAgICAoMTk5OSwgMjkpICAjIFJvdy1jb2x1bW4gbm90YXRpb24uCisgICAgKCdBRDIwMDAnKSAgIyBUaGUgc2FtZSBjZWxsIGluIEExIG5vdGF0aW9uLgorCitSb3ctY29sdW1uIG5vdGF0aW9uIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIHJlZmVycmluZyB0byBjZWxscyBwcm9ncmFtbWF0aWNhbGx5OgorCisgICAgZm9yIG15ICRpICgwIC4uIDkpIHsKKyAgICAgICAgJHdvcmtzaGVldC0+d3JpdGUoJGksIDAsICdIZWxsbycpOyAjIENlbGxzIEExIHRvIEExMAorICAgIH0KKworQTEgbm90YXRpb24gaXMgdXNlZnVsIGZvciBzZXR0aW5nIHVwIGEgd29ya3NoZWV0IG1hbnVhbGx5IGFuZCBmb3Igd29ya2luZyB3aXRoIGZvcm11bGFzOgorCisgICAgJHdvcmtzaGVldC0+d3JpdGUoJ0gxJywgMjAwKTsKKyAgICAkd29ya3NoZWV0LT53cml0ZSgnSDInLCAnPUg3KzEnKTsKKworVGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGNhbiBiZSB1c2VkIGZvciBkZWFsaW5nIHdpdGggQTEgbm90YXRpb24sIGZvciBleGFtcGxlOgorCisgICAgKCRyb3csICRjb2wpICAgID0geGxfY2VsbF90b19yb3djb2woJ0MyJyk7ICAjICgxLCAyKQorICAgICRzdHIgICAgICAgICAgICA9IHhsX3Jvd2NvbF90b19jZWxsKDEsIDIpOyAgIyBDMgorCisKK0NlbGwgcmVmZXJlbmNlcyBpbiBFeGNlbCBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yIGFic29sdXRlLiBBYnNvbHV0ZSByZWZlcmVuY2VzIGFyZSBwcmVmaXhlZCBieSB0aGUgZG9sbGFyIHN5bWJvbCBhcyBzaG93biBiZWxvdzoKKworICAgIEExICAgICAgIyBDb2x1bW4gYW5kIHJvdyBhcmUgcmVsYXRpdmUKKyAgICAkQTEgICAgICMgQ29sdW1uIGlzIGFic29sdXRlIGFuZCByb3cgaXMgcmVsYXRpdmUKKyAgICBBJDEgICAgICMgQ29sdW1uIGlzIHJlbGF0aXZlIGFuZCByb3cgaXMgYWJzb2x1dGUKKyAgICAkQSQxICAgICMgQ29sdW1uIGFuZCByb3cgYXJlIGFic29sdXRlCisKK0FuIGFic29sdXRlIHJlZmVyZW5jZSBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlIGNlbGwgaXMgY29waWVkLiBSZWZlciB0byB0aGUgRXhjZWwgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBhYnNvbHV0ZSByZWZlcmVuY2VzLgorCis9Y3V0CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3Jvd2NvbF90b19jZWxsKCRyb3csICRjb2wsICRyb3dfYWJzb2x1dGUsICRjb2xfYWJzb2x1dGUpCisKKyAgICBQYXJhbWV0ZXJzOiAkcm93OiAgICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRjb2w6ICAgICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJHJvd19hYnNvbHV0ZTogIEJvb2xlYW4gKDEvMCkgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisgICAgICAgICAgICAgICAgJGNvbF9hYnNvbHV0ZTogIEJvb2xlYW4gKDEvMCkgW29wdGlvbmFsLCBkZWZhdWx0IGlzIDBdCisKKyAgICBSZXR1cm5zOiAgICBBIHN0cmluZyBpbiBBMSBjZWxsIG5vdGF0aW9uCisKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2UgdG8gYSBBMSBzdHlsZSBzdHJpbmc6CisKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMCk7ICMgQTEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMSk7ICMgQjEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMSwgMCk7ICMgQTIKKworCitUaGUgb3B0aW9uYWwgcGFyYW1ldGVycyBDPCRyb3dfYWJzb2x1dGU+IGFuZCBDPCRjb2xfYWJzb2x1dGU+IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIGlmIHRoZSByb3cgb3IgY29sdW1uIGlzIGFic29sdXRlOgorCisgICAgJHN0ciA9IHhsX3Jvd2NvbF90b19jZWxsKDAsIDAsIDAsIDEpOyAjICRBMQorICAgICRzdHIgPSB4bF9yb3djb2xfdG9fY2VsbCgwLCAwLCAxLCAwKTsgIyBBJDEKKyAgICAkc3RyID0geGxfcm93Y29sX3RvX2NlbGwoMCwgMCwgMSwgMSk7ICMgJEEkMQorCitTZWUgTDxST1cgQU5EIENPTFVNTiBGVU5DVElPTlM+IGZvciBhbiBleHBsYW5hdGlvbiBvZiBhYnNvbHV0ZSBjZWxsIHJlZmVyZW5jZXMuCisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9yb3djb2xfdG9fY2VsbCgkcm93LCAkY29sLCAkcm93X2Fic29sdXRlLCAkY29sX2Fic29sdXRlKQorIworc3ViIHhsX3Jvd2NvbF90b19jZWxsIHsKKworICAgIG15ICRyb3cgICAgID0gJF9bMF07CisgICAgbXkgJGNvbCAgICAgPSAkX1sxXTsKKyAgICBteSAkcm93X2FicyA9ICRfWzJdID8gJyQnIDogJyc7CisgICAgbXkgJGNvbF9hYnMgPSAkX1szXSA/ICckJyA6ICcnOworCisKKyAgICBteSAkaW50ICA9IGludCAoJGNvbCAvIDI2KTsKKyAgICBteSAkZnJhYyA9ICRjb2wgJSAyNjsKKworICAgIG15ICRjaHIxID0nJzsgIyBNb3N0IHNpZ25pZmljYW50IGNoYXJhY3RlciBpbiBBQTEKKworICAgIGlmICgkaW50ID4gMCkgeworICAgICAgICAkY2hyMSA9IGNociggb3JkKCdBJykgKyAkaW50ICAtMSApOworICAgIH0KKworICAgIG15ICRjaHIyID0gY2hyKCBvcmQoJ0EnKSArICRmcmFjICk7CisKKyAgICAjIFplcm8gaW5kZXggdG8gMS1pbmRleAorICAgICRyb3crKzsKKworICAgIHJldHVybiAkY29sX2FicyAuICRjaHIxIC4gJGNocjIgLiAkcm93X2Ficy4gJHJvdzsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfY2VsbF90b19yb3djb2woJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZyAgICAgICAgIFN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIExpc3QgICAgICAgICAgICAoJHJvdywgJGNvbCkKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiB0byBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4uIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gaGFuZGxlIEV4Y2VsJ3MgYWJzb2x1dGUsIEM8JD4sIGNlbGwgbm90YXRpb24uCisKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnQTEnKTsgICAgICMgKDAsIDApCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0IxJyk7ICAgICAjICgwLCAxKQorICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCdDMicpOyAgICAgIyAoMSwgMikKKyAgICBteSAoJHJvdywgJGNvbCkgPSB4bF9jZWxsX3RvX3Jvd2NvbCgnJEMyJyApOyAgICMgKDEsIDIpCisgICAgbXkgKCRyb3csICRjb2wpID0geGxfY2VsbF90b19yb3djb2woJ0MkMicgKTsgICAjICgxLCAyKQorICAgIG15ICgkcm93LCAkY29sKSA9IHhsX2NlbGxfdG9fcm93Y29sKCckQyQyJyk7ICAgIyAoMSwgMikKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9jZWxsX3RvX3Jvd2NvbCgkc3RyaW5nKQorIworIyBSZXR1cm5zOiAoJHJvdywgJGNvbCwgJHJvd19hYnNvbHV0ZSwgJGNvbF9hYnNvbHV0ZSkKKyMKKyMgVGhlICRyb3dfYWJzb2x1dGUgYW5kICRjb2xfYWJzb2x1dGUgcGFyYW1ldGVycyBhcmVuJ3QgZG9jdW1lbnRlZCBiZWNhdXNlIHRoZXkKKyMgbWFpbmx5IHVzZWQgaW50ZXJuYWxseSBhbmQgYXJlbid0IHZlcnkgdXNlZnVsIHRvIHRoZSB1c2VyLgorIworc3ViIHhsX2NlbGxfdG9fcm93Y29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisKKyAgICAkY2VsbCA9fiAvKFwkPykoW0EtSV0/W0EtWl0pKFwkPykoXGQrKS87CisKKyAgICBteSAkY29sX2FicyA9ICQxIGVxICIiID8gMCA6IDE7CisgICAgbXkgJGNvbCAgICAgPSAkMjsKKyAgICBteSAkcm93X2FicyA9ICQzIGVxICIiID8gMCA6IDE7CisgICAgbXkgJHJvdyAgICAgPSAkNDsKKworICAgICMgQ29udmVydCBiYXNlMjYgY29sdW1uIHN0cmluZyB0byBudW1iZXIKKyAgICAjIEFsbCB5b3VyIEJhc2UgYXJlIGJlbG9uZyB0byB1cy4KKyAgICBteSBAY2hhcnMgID0gc3BsaXQgLy8sICRjb2w7CisgICAgbXkgJGV4cG4gICA9IDA7CisgICAgJGNvbCAgICAgICA9IDA7CisKKyAgICB3aGlsZSAoQGNoYXJzKSB7CisgICAgICAgIG15ICRjaGFyID0gcG9wKEBjaGFycyk7ICMgTFMgY2hhciBmaXJzdAorICAgICAgICAkY29sICs9IChvcmQoJGNoYXIpIC1vcmQoJ0EnKSArMSkgKiAoMjYqKiRleHBuKTsKKyAgICAgICAgJGV4cG4rKzsKKyAgICB9CisKKyAgICAjIENvbnZlcnQgMS1pbmRleCB0byB6ZXJvLWluZGV4CisgICAgJHJvdy0tOworICAgICRjb2wtLTsKKworICAgIHJldHVybiAkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnM7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3JhbmdlX2Zvcm11bGEoJHNoZWV0bmFtZSwgJHJvd18xLCAkcm93XzIsICRjb2xfMSwgJGNvbF8yKQorCisgICAgUGFyYW1ldGVyczogJHNoZWV0bmFtZSAgICAgIFN0cmluZworICAgICAgICAgICAgICAgICRyb3dfMTogICAgICAgICBJbnRlZ2VyCisgICAgICAgICAgICAgICAgJHJvd18yOiAgICAgICAgIEludGVnZXIKKyAgICAgICAgICAgICAgICAkY29sXzE6ICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRjb2xfMjogICAgICAgICBJbnRlZ2VyCisKKyAgICBSZXR1cm5zOiAgICBBIHdvcmtzaGVldCByYW5nZSBmb3JtdWxhIGFzIGEgc3RyaW5nLgorCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4gY2VsbCByZWZlcmVuY2VzIHRvIGFuIEExIHN0eWxlIGZvcm11bGEgc3RyaW5nOgorCisgICAgbXkgJHN0ciA9IHhsX3JhbmdlX2Zvcm11bGEoJ1NoZWV0MScsICAgMCwgIDksIDAsIDApOyAjID1TaGVldDEhJEEkMTokQSQxMAorICAgIG15ICRzdHIgPSB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDInLCAgIDYsIDY1LCAxLCAxKTsgIyA9U2hlZXQyISRCJDc6JEIkNjYKKyAgICBteSAkc3RyID0geGxfcmFuZ2VfZm9ybXVsYSgnTmV3IGRhdGEnLCAxLCAgOCwgMiwgMik7ICMgPSdOZXcgZGF0YSchJEMkMjokQyQ5CisKKworVGhpcyBpcyB1c2VmdWwgZm9yIHNldHRpbmcgcmFuZ2VzIGluIENoYXJ0IG9iamVjdHM6CisKKworICAgICRjaGFydC0+YWRkX3NlcmllcygKKyAgICAgICAgY2F0ZWdvcmllcyAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDEnLCAxLCA5LCAwLCAwKSwKKyAgICAgICAgdmFsdWVzICAgICAgICA9PiB4bF9yYW5nZV9mb3JtdWxhKCdTaGVldDEnLCAxLCA5LCAxLCAxKTssCisgICAgKTsKKworICAgICMgV2hpY2ggaXMgdGhlIHNhbWUgYXM6CisKKyAgICAkY2hhcnQtPmFkZF9zZXJpZXMoCisgICAgICAgIGNhdGVnb3JpZXMgICAgPT4gJz1TaGVldDEhJEEkMjokQSQxMCcsCisgICAgICAgIHZhbHVlcyAgICAgICAgPT4gJz1TaGVldDEhJEIkMjokQiQxMCcsCisgICAgKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3JhbmdlX2Zvcm11bGEoJHNoZWV0bmFtZSwgJHJvd18xLCAkcm93XzIsICRjb2xfMSwgJGNvbF8yKQorIworc3ViIHhsX3JhbmdlX2Zvcm11bGEgeworCisgICAgbXkgKCRzaGVldG5hbWUsICRyb3dfMSwgJHJvd18yLCAkY29sXzEsICRjb2xfMikgPSBAXzsKKworICAgICMgVXNlIEV4Y2VsJ3MgY29udmVudGlvbnMgYW5kIHF1b3RlIHRoZSBzaGVldCBuYW1lIGlmIGl0IGNvbnRhaW5zIGFueQorICAgICMgbm9uLXdvcmQgY2hhcmFjdGVyIG9yIGlmIGl0IGlzbid0IGFscmVhZHkgcXVvdGVkLgorICAgIGlmICgkc2hlZXRuYW1lID1+IC9cVy8gJiYgJHNoZWV0bmFtZSAhfiAvXicvKSB7CisgICAgICAgICRzaGVldG5hbWUgPSBxKCcpIC4gJHNoZWV0bmFtZSAuIHEoJyk7CisgICAgfQorCisgICAgbXkgJHJhbmdlMSA9IHhsX3Jvd2NvbF90b19jZWxsKCRyb3dfMSwgJGNvbF8xLCAxLCAxKTsKKyAgICBteSAkcmFuZ2UyID0geGxfcm93Y29sX3RvX2NlbGwoJHJvd18yLCAkY29sXzIsIDEsIDEpOworCisgICAgcmV0dXJuICc9JyAuICRzaGVldG5hbWUgLiAnIScgLiAkcmFuZ2UxIC4gJzonIC4gJHJhbmdlMjsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfaW5jX3Jvdygkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIEluY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGluY3JlbWVudHMgdGhlIHJvdy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9pbmNfcm93KCdBMScgICk7ICMgQTIKKyAgICBteSAkc3RyID0geGxfaW5jX3JvdygnQiQyJyApOyAjIEIkMworICAgIG15ICRzdHIgPSB4bF9pbmNfcm93KCckQzMnICk7ICMgJEM0CisgICAgbXkgJHN0ciA9IHhsX2luY19yb3coJyREJDQnKTsgIyAkRCQ1CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9pbmNfcm93KCRzdHJpbmcpCisjCitzdWIgeGxfaW5jX3JvdyB7CisKKyAgICBteSAkY2VsbCA9IHNoaWZ0OworICAgIG15ICgkcm93LCAkY29sLCAkcm93X2FicywgJGNvbF9hYnMpID0geGxfY2VsbF90b19yb3djb2woJGNlbGwpOworCisgICAgcmV0dXJuIHhsX3Jvd2NvbF90b19jZWxsKCsrJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGVjX3Jvdygkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIERlY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGRlY3JlbWVudHMgdGhlIHJvdy4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9kZWNfcm93KCdBMicgICk7ICMgQTEKKyAgICBteSAkc3RyID0geGxfZGVjX3JvdygnQiQzJyApOyAjIEIkMgorICAgIG15ICRzdHIgPSB4bF9kZWNfcm93KCckQzQnICk7ICMgJEMzCisgICAgbXkgJHN0ciA9IHhsX2RlY19yb3coJyREJDUnKTsgIyAkRCQ0CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9kZWNfcm93KCRzdHJpbmcpCisjCisjIERlY3JlbWVudHMgdGhlIHJvdyBudW1iZXIgb2YgYW4gRXhjZWwgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24uCisjIEZvciBleGFtcGxlIEM0IHRvIEMzCisjCisjIFJldHVybnM6IGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nLgorIworc3ViIHhsX2RlY19yb3cgeworCisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKyAgICBteSAoJHJvdywgJGNvbCwgJHJvd19hYnMsICRjb2xfYWJzKSA9IHhsX2NlbGxfdG9fcm93Y29sKCRjZWxsKTsKKworICAgIHJldHVybiB4bF9yb3djb2xfdG9fY2VsbCgtLSRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2Ficyk7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2luY19jb2woJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSBzdHJpbmcgaW4gQTEgZm9ybWF0CisKKyAgICBSZXR1cm5zOiAgICBJbmNyZW1lbnRlZCBzdHJpbmcgaW4gQTEgZm9ybWF0CisKK1RoaXMgZnVuY3Rpb25zIHRha2VzIGEgY2VsbCByZWZlcmVuY2Ugc3RyaW5nIGluIEExIG5vdGF0aW9uIGFuZCBpbmNyZW1lbnRzIHRoZSBjb2x1bW4uIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gaGFuZGxlIEV4Y2VsJ3MgYWJzb2x1dGUsIEM8JD4sIGNlbGwgbm90YXRpb246CisKKyAgICBteSAkc3RyID0geGxfaW5jX2NvbCgnQTEnICApOyAjIEIxCisgICAgbXkgJHN0ciA9IHhsX2luY19jb2woJ1oxJyAgKTsgIyBBQTEKKyAgICBteSAkc3RyID0geGxfaW5jX2NvbCgnJEIxJyApOyAjICRDMQorICAgIG15ICRzdHIgPSB4bF9pbmNfY29sKCckRCQ1Jyk7ICMgJEUkNQorCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfaW5jX2NvbCgkc3RyaW5nKQorIworIyBJbmNyZW1lbnRzIHRoZSBjb2x1bW4gbnVtYmVyIG9mIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uLgorIyBGb3IgZXhhbXBsZSBDMyB0byBEMworIworIyBSZXR1cm5zOiBhIGNlbGwgcmVmZXJlbmNlIHN0cmluZy4KKyMKK3N1YiB4bF9pbmNfY29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FicykgPSB4bF9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7CisKKyAgICByZXR1cm4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgKyskY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKz1oZWFkMiB4bF9kZWNfY29sKCRzdHJpbmcpCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHN0cmluZyBpbiBBMSBmb3JtYXQKKworICAgIFJldHVybnM6ICAgIERlY3JlbWVudGVkIHN0cmluZyBpbiBBMSBmb3JtYXQKKworVGhpcyBmdW5jdGlvbnMgdGFrZXMgYSBjZWxsIHJlZmVyZW5jZSBzdHJpbmcgaW4gQTEgbm90YXRpb24gYW5kIGRlY3JlbWVudHMgdGhlIGNvbHVtbi4gVGhlIGZ1bmN0aW9uIHdpbGwgYWxzbyBoYW5kbGUgRXhjZWwncyBhYnNvbHV0ZSwgQzwkPiwgY2VsbCBub3RhdGlvbjoKKworICAgIG15ICRzdHIgPSB4bF9kZWNfY29sKCdCMScgICk7ICMgQTEKKyAgICBteSAkc3RyID0geGxfZGVjX2NvbCgnQUExJyApOyAjIFoxCisgICAgbXkgJHN0ciA9IHhsX2RlY19jb2woJyRDMScgKTsgIyAkQjEKKyAgICBteSAkc3RyID0geGxfZGVjX2NvbCgnJEUkNScpOyAjICREJDUKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RlY19jb2woJHN0cmluZykKKyMKK3N1YiB4bF9kZWNfY29sIHsKKworICAgIG15ICRjZWxsID0gc2hpZnQ7CisgICAgbXkgKCRyb3csICRjb2wsICRyb3dfYWJzLCAkY29sX2FicykgPSB4bF9jZWxsX3RvX3Jvd2NvbCgkY2VsbCk7CisKKyAgICByZXR1cm4geGxfcm93Y29sX3RvX2NlbGwoJHJvdywgLS0kY29sLCAkcm93X2FicywgJGNvbF9hYnMpOworfQorCisKKworCis9aGVhZDEgVElNRSBBTkQgREFURSBGVU5DVElPTlMKKworCitEYXRlcyBhbmQgdGltZXMgaW4gRXhjZWwgYXJlIHJlcHJlc2VudGVkIGJ5IHJlYWwgbnVtYmVycywgZm9yIGV4YW1wbGUgIkphbiAxIDIwMDEgMTI6MzAgQU0iIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBudW1iZXIgMzY4OTIuNTIxLgorCitUaGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBudW1iZXIgc3RvcmVzIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZXBvY2ggYW5kIHRoZSBmcmFjdGlvbmFsIHBhcnQgc3RvcmVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBkYXkgaW4gc2Vjb25kcy4KKworVGhlIGVwb2NoIGNhbiBiZSBlaXRoZXIgMTkwMCBvciAxOTA0LiBFeGNlbCBmb3IgV2luZG93cyB1c2VzIDE5MDAgYW5kIEV4Y2VsIGZvciBNYWNpbnRvc2ggdXNlcyAxOTA0LiBUaGUgZXBvY2hzIGFyZToKKworICAgIDE5MDA6IDAgSmFudWFyeSAxOTAwIGkuZS4gMzEgRGVjZW1iZXIgMTg5OQorICAgIDE5MDQ6IDEgSmFudWFyeSAxOTA0CisKK0V4Y2VsIG9uIFdpbmRvd3MgYW5kIHRoZSBNYWNpbnRvc2ggd2lsbCBjb252ZXJ0IGF1dG9tYXRpY2FsbHkgYmV0d2VlbiBvbmUgc3lzdGVtIGFuZCB0aGUgb3RoZXIuIEJ5IGRlZmF1bHQgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgdXNlcyB0aGUgMTkwMCBmb3JtYXQuIFRvIHVzZSB0aGUgMTkwNCBlcG9jaCB5b3UgbXVzdCB1c2UgdGhlIEM8c2V0XzE5MDQoKT4gd29ya2Jvb2sgbWV0aG9kLCBzZWUgdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKK1RoZXJlIGFyZSB0d28gdGhpbmdzIHRvIG5vdGUgYWJvdXQgdGhlIDE5MDAgZGF0ZSBmb3JtYXQuIFRoZSBmaXJzdCBpcyB0aGF0IHRoZSBlcG9jaCBzdGFydHMgb24gMCBKYW51YXJ5IDE5MDAuIFRoZSBzZWNvbmQgaXMgdGhhdCB0aGUgeWVhciAxOTAwIGlzIGVycm9uZW91c2x5IGJ1dCBkZWxpYmVyYXRlbHkgdHJlYXRlZCBhcyBhIGxlYXAgeWVhci4gVGhlcmVmb3JlIHlvdSBtdXN0IGFkZCBhbiBleHRyYSBkYXkgdG8gZGF0ZXMgYWZ0ZXIgMjggRmVicnVhcnkgMTkwMC4gVGhlIGZ1bmN0aW9ucyBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb24gd2lsbCBkZWFsIHdpdGggdGhlc2UgaXNzdWVzIGF1dG9tYXRpY2FsbHkuIFRoZSByZWFzb24gZm9yIHRoaXMgYW5vbWFseSBpcyBleHBsYWluZWQgYXQgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9zdXBwb3J0L2tiL2FydGljbGVzL1ExODEvMy83MC5hc3AKKworTm90ZSwgYSBkYXRlIG9yIHRpbWUgaW4gRXhjZWwgaXMgbGlrZSBhbnkgb3RoZXIgbnVtYmVyLiBUbyBkaXNwbGF5IHRoZSBudW1iZXIgYXMgYSBkYXRlIHlvdSBtdXN0IGFwcGx5IGEgbnVtYmVyIGZvcm1hdCB0byBpdDogUmVmZXIgdG8gdGhlIEM8c2V0X251bV9mb3JtYXQoKT4gbWV0aG9kIGluIHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uOgorCisgICAgJGRhdGUgPSB4bF9kYXRlX2xpc3QoMjAwMSwgMSwgMSwgMTIsIDMwKTsKKyAgICAkZm9ybWF0LT5zZXRfbnVtX2Zvcm1hdCgnbW1tIGQgeXl5eSBoaDptbSBBTS9QTScpOworICAgICR3b3Jrc2hlZXQtPndyaXRlKCdBMScsICRkYXRlICwgJGZvcm1hdCk7ICMgSmFuIDEgMjAwMSAxMjozMCBBTQorCitUbyB1c2UgdGhlc2UgZnVuY3Rpb25zIHlvdSBtdXN0IGluc3RhbGwgdGhlIEM8RGF0ZTo6TWFuaXA+IGFuZCBDPERhdGU6OkNhbGM+IG1vZHVsZXMuIFNlZSBMPFJFUVVJUkVNRU5UUz4gYW5kIHRoZSBpbmRpdmlkdWFsIHJlcXVpcmVtZW50cyBvZiBlYWNoIGZ1bmN0aW9ucy4KKworU2VlIGFsc28gdGhlIERhdGVUaW1lOjpGb3JtYXQ6OkV4Y2VsIG1vZHVsZSxodHRwOi8vc2VhcmNoLmNwYW4ub3JnL3NlYXJjaD9kaXN0PURhdGVUaW1lLUZvcm1hdC1FeGNlbCB3aGljaCBpcyBwYXJ0IG9mIHRoZSBEYXRlVGltZSBwcm9qZWN0IGFuZCB3aGljaCBkZWFscyBzcGVjaWZpY2FsbHkgd2l0aCBjb252ZXJ0aW5nIGRhdGVzIGFuZCB0aW1lcyB0byBhbmQgZnJvbSBFeGNlbCdzIGZvcm1hdC4KKworCis9Y3V0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGF0ZV9saXN0KCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkeWVhcnM6ICAgICAgICAgSW50ZWdlcgorICAgICAgICAgICAgICAgICRtb250aHM6ICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAxXQorICAgICAgICAgICAgICAgICRkYXlzOiAgICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAxXQorICAgICAgICAgICAgICAgICRob3VyczogICAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorICAgICAgICAgICAgICAgICRtaW51dGVzOiAgICAgICBJbnRlZ2VyIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorICAgICAgICAgICAgICAgICRzZWNvbmRzOiAgICAgICBGbG9hdCAgIFtvcHRpb25hbCwgZGVmYXVsdCBpcyAwXQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCBkYXRlLgorCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGFuIGFycmF5IG9mIGRhdGEgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4gQWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBleGNlcHQgZm9yIEM8JHllYXJzPi4KKworICAgICRkYXRlMSA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyKTsgICAgICAgICAgICAgICMgMiBKYW4gMjAwMgorICAgICRkYXRlMiA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMik7ICAgICAgICAgICMgMiBKYW4gMjAwMiAxMjowMCBwbQorICAgICRkYXRlMyA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMiwgMzApOyAgICAgICMgMiBKYW4gMjAwMiAxMjozMCBwbQorICAgICRkYXRlNCA9IHhsX2RhdGVfbGlzdCgyMDAyLCAxLCAyLCAxMiwgMzAsIDQ1KTsgICMgMiBKYW4gMjAwMiAxMjozMDo0NSBwbQorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZnVuY3Rpb25zIHRoYXQgcGFyc2UgZGF0ZSBhbmQgdGltZSBzdHJpbmdzLiBJbiBmYWN0IGl0IGlzIHVzZWQgaW4gbW9zdCBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RhdGVfbGlzdCgkeWVhcnMsICRtb250aHMsICRkYXlzLCAkaG91cnMsICRtaW51dGVzLCAkc2Vjb25kcykKKyMKK3N1YiB4bF9kYXRlX2xpc3QgeworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAXzsKKworICAgIG15ICR5ZWFycyAgID0gJF9bMF07CisgICAgbXkgJG1vbnRocyAgPSAkX1sxXSB8fCAxOworICAgIG15ICRkYXlzICAgID0gJF9bMl0gfHwgMTsKKyAgICBteSAkaG91cnMgICA9ICRfWzNdIHx8IDA7CisgICAgbXkgJG1pbnV0ZXMgPSAkX1s0XSB8fCAwOworICAgIG15ICRzZWNvbmRzID0gJF9bNV0gfHwgMDsKKworICAgIG15IEBkYXRlID0gKCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKKyAgICBteSBAZXBvY2ggPSAoMTg5OSwgMTIsIDMxLCAwLCAwLCAwKTsKKworICAgICgkZGF5cywgJGhvdXJzLCAkbWludXRlcywgJHNlY29uZHMpID0gRGVsdGFfREhNUyhAZXBvY2gsIEBkYXRlKTsKKworICAgIG15ICRkYXRlID0gJGRheXMgKyAoJGhvdXJzKjM2MDAgKyRtaW51dGVzKjYwICskc2Vjb25kcykvKDI0KjYwKjYwKTsKKworICAgICMgQWRkIGEgZGF5IGZvciBFeGNlbCdzIG1pc3NpbmcgbGVhcCBkYXkgaW4gMTkwMAorICAgICRkYXRlKysgaWYgKCRkYXRlID4gNTkpOworCisgICAgcmV0dXJuICRkYXRlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX3BhcnNlX3RpbWUoJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgdGltZQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIHRpbWUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCB0aW1lLgorCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgdGltZS4gVGhlIGZvbGxvd2luZyB0aW1lIGZvcm1hdHMgYXJlIHZhbGlkOgorCisgICAgaGg6bW0gICAgICAgW0FNfFBNXQorICAgIGhoOm1tICAgICAgIFtBTXxQTV0KKyAgICBoaDptbTpzcyAgICBbQU18UE1dCisgICAgaGg6bW06c3Muc3MgW0FNfFBNXQorCisKK1RoZSBtZXJpZGlhbiwgQU0gb3IgUE0sIGlzIG9wdGlvbmFsIGFuZCBjYXNlIGluc2Vuc2l0aXZlLiBBIDI0IGhvdXIgdGltZSBpcyBhc3N1bWVkIGlmIHRoZSBtZXJpZGlhbiBpcyBvbWl0dGVkCisKKyAgICAkdGltZTEgPSB4bF9wYXJzZV90aW1lKCcxMjoxOCcpOworICAgICR0aW1lMiA9IHhsX3BhcnNlX3RpbWUoJzEyOjE4OjE0Jyk7CisgICAgJHRpbWUzID0geGxfcGFyc2VfdGltZSgnMTI6MTg6MTQgQU0nKTsKKyAgICAkdGltZTQgPSB4bF9wYXJzZV90aW1lKCcxOjE4OjE0IEFNJyk7CisKK1RpbWUgaW4gRXhjZWwgaXMgZXhwcmVzc2VkIGFzIGEgZnJhY3Rpb24gb2YgdGhlIGRheSBpbiBzZWNvbmRzLiBUaGVyZWZvcmUgeW91IGNhbiBjYWxjdWxhdGUgYW4gRXhjZWwgdGltZSBhcyBmb2xsb3dzOgorCisgICAgJHRpbWUgPSAoJGhvdXJzKjM2MDAgKyRtaW51dGVzKjYwICskc2Vjb25kcykvKDI0KjYwKjYwKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX3BhcnNlX3RpbWUoJHN0cmluZykKKyMKK3N1YiB4bF9wYXJzZV90aW1lIHsKKworICAgIG15ICR0aW1lID0gc2hpZnQ7CisKKyAgICBpZiAoJHRpbWUgPX4gLyhcZHsxLDJ9KTooXGRcZCk6PygoPzpcZFxkKSg/OlwuXGQrKT8pPyg/OlxzKyk/KGFtfHBtKT8vaSkgeworCisgICAgICAgIG15ICRob3VycyAgICAgICA9ICQxOworICAgICAgICBteSAkbWludXRlcyAgICAgPSAkMjsKKyAgICAgICAgbXkgJHNlY29uZHMgICAgID0gJDMgICAgIHx8IDA7CisgICAgICAgIG15ICRtZXJpZGlhbiAgICA9IGxjKCQ0KSB8fCAnJzsKKworICAgICAgICAjIE5vcm1hbGlzZSBtaWRuaWdodCBhbmQgbWlkZGF5CisgICAgICAgICRob3VycyA9IDAgaWYgKCRob3VycyA9PSAxMiAmJiAkbWVyaWRpYW4gbmUgJycpOworCisgICAgICAgICMgQWRkIDEyIGhvdXJzIHRvIHRoZSBwbSB0aW1lcy4gTm90ZTogMTIuMDAgcG0gaGFzIGJlZW4gc2V0IHRvIDAuMDAuCisgICAgICAgICRob3VycyArPSAxMiBpZiAkbWVyaWRpYW4gZXEgJ3BtJzsKKworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgdGltZSBhcyBhIGZyYWN0aW9uIG9mIDI0IGhvdXJzIGluIHNlY29uZHMKKyAgICAgICAgcmV0dXJuICgkaG91cnMqMzYwMCArJG1pbnV0ZXMqNjAgKyRzZWNvbmRzKS8oMjQqNjAqNjApOworCisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gdW5kZWY7ICMgTm90IGEgdmFsaWQgdGltZSBzdHJpbmcKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcGFyc2VfZGF0ZSgkc3RyaW5nKQorCisKKyAgICBQYXJhbWV0ZXJzOiAkc3RyaW5nLCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBkYXRlIGFuZCB0aW1lCisKKyAgICBSZXR1cm5zOiAgICBBIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZQorICAgICAgICAgICAgICAgIG9yIHVuZGVmIGZvciBhbiBpbnZhbGlkIGRhdGUuCisKKyAgICBSZXF1aXJlczogICBEYXRlOjpNYW5pcCBhbmQgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4KKworVGhlIHBhcnNpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBDPFBhcnNlRGF0ZSgpPiBmdW5jdGlvbiBvZiB0aGUgRGF0ZTo6TWFuaXAgbW9kdWxlLiBSZWZlciB0byB0aGUgRGF0ZTo6TWFuaXAgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSBhbmQgdGltZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC4gSW4gb3JkZXIgdG8gdXNlIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgcHJvYmFibHkgaGF2ZSB0byBpbml0aWFsaXNlIHNvbWUgRGF0ZTo6TWFuaXAgdmFyaWFibGVzIHZpYSB0aGUgQzx4bF9wYXJzZV9kYXRlX2luaXQoKT4gZnVuY3Rpb24sIHNlZSBiZWxvdy4KKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9R01UIiwiRGF0ZUZvcm1hdD1ub24tVVMiKTsKKworICAgICRkYXRlMSA9IHhsX3BhcnNlX2RhdGUoIjExLzcvOTciKTsKKyAgICAkZGF0ZTIgPSB4bF9wYXJzZV9kYXRlKCJGcmlkYXkgMTEgSnVseSAxOTk3Iik7CisgICAgJGRhdGUzID0geGxfcGFyc2VfZGF0ZSgiMTA6MzAgQU0gRnJpZGF5IDExIEp1bHkgMTk5NyIpOworICAgICRkYXRlNCA9IHhsX3BhcnNlX2RhdGUoIlRvZGF5Iik7CisgICAgJGRhdGU1ID0geGxfcGFyc2VfZGF0ZSgiWWVzdGVyZGF5Iik7CisKK05vdGUsIGlmIHlvdSBwYXJzZSBhIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSB0aW1lIGJ1dCBub3QgYSBkYXRlIHRoaXMgZnVuY3Rpb24gd2lsbCBhZGQgdGhlIGN1cnJlbnQgZGF0ZS4gSWYgeW91IHdhbnQgdGhlIHRpbWUgd2l0aG91dCB0aGUgZGF0ZSB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CisKKyAgICAkdGltZSAgPSB4bF9wYXJzZV9kYXRlKCIxMDozMCBBTSIpOworICAgICR0aW1lIC09IGludCgkdGltZSk7CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9wYXJzZV9kYXRlKCRzdHJpbmcpCisjCitzdWIgeGxfcGFyc2VfZGF0ZSB7CisKKyAgICBteSAkZGF0ZSA9IFBhcnNlRGF0ZSgkX1swXSk7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJGRhdGU7CisKKyAgICAjIFVucGFjayB0aGUgcmV0dXJuIHZhbHVlIGZyb20gUGFyc2VEYXRlKCkKKyAgICBteSAgICAoJHllYXJzLCAkbW9udGhzLCAkZGF5cywgJGhvdXJzLCB1bmRlZiwgJG1pbnV0ZXMsIHVuZGVmLCAkc2Vjb25kcykgPQorICAgIHVucGFjaygiQTQgICAgIEEyICAgICAgIEEyICAgICBBMiAgICAgIEMgICAgICBBMiAgICAgICAgQyAgICAgIEEyIiwgJGRhdGUpOworCisgICAgIyBDb252ZXJ0IHRvIEV4Y2VsIGRhdGUKKyAgICByZXR1cm4geGxfZGF0ZV9saXN0KCR5ZWFycywgJG1vbnRocywgJGRheXMsICRob3VycywgJG1pbnV0ZXMsICRzZWNvbmRzKTsKK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfcGFyc2VfZGF0ZV9pbml0KCJ2YXJpYWJsZT12YWx1ZSIsIC4uLikKKworCisgICAgUGFyYW1ldGVyczogQSBsaXN0IG9mIERhdGU6Ok1hbmlwIHZhcmlhYmxlIHN0cmluZ3MKKworICAgIFJldHVybnM6ICAgIEEgbGlzdCBvZiBhbGwgdGhlIERhdGU6Ok1hbmlwIHN0cmluZ3MKKworICAgIFJlcXVpcmVzOiAgIERhdGU6Ok1hbmlwCisKK1RoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXNlIHZhcmlhYmxlcyByZXF1aXJlZCBieSB0aGUgRGF0ZTo6TWFuaXAgbW9kdWxlLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgY2FsbGluZyBDPHhsX3BhcnNlX2RhdGUoKT4uIEl0IG5lZWQgb25seSBiZSBjYWxsZWQgb25jZS4KKworVGhpcyBmdW5jdGlvbiBpcyBhIHRoaW4gd3JhcHBlciBmb3IgdGhlIEM8RGF0ZTo6TWFuaXA6OkRhdGVfSW5pdCgpPiBmdW5jdGlvbi4gWW91IGNhbiB1c2UgQzxEYXRlX0luaXQoKT4gIGRpcmVjdGx5IGlmIHlvdSB3aXNoLiBSZWZlciB0byB0aGUgRGF0ZTo6TWFuaXAgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9TVNUIiwiRGF0ZUZvcm1hdD1VUyIpOworICAgICRkYXRlMSA9IHhsX3BhcnNlX2RhdGUoIjExLzcvOTciKTsgICMgTm92ZW1iZXIgN3RoIDE5OTcKKworICAgIHhsX3BhcnNlX2RhdGVfaW5pdCgiVFo9R01UIiwiRGF0ZUZvcm1hdD1ub24tVVMiKTsKKyAgICAkZGF0ZTEgPSB4bF9wYXJzZV9kYXRlKCIxMS83Lzk3Iik7ICAjIEp1bHkgMTF0aCAxOTk3CisKKworPWN1dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB4bF9wYXJzZV9kYXRlX2luaXQoInZhcmlhYmxlPXZhbHVlIiwgLi4uKQorIworc3ViIHhsX3BhcnNlX2RhdGVfaW5pdCB7CisKKyAgICBEYXRlX0luaXQoQF8pOyAjIEhvdyBsYXp5IGlzIHRoYXQuCit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2RlY29kZV9kYXRlX0VVKCRzdHJpbmcpCisKKworICAgIFBhcmFtZXRlcnM6ICRzdHJpbmcsIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiBhIGRhdGUgYW5kIHRpbWUKKworICAgIFJldHVybnM6ICAgIEEgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyBhbiBFeGNlbCBkYXRlCisgICAgICAgICAgICAgICAgb3IgdW5kZWYgZm9yIGFuIGludmFsaWQgZGF0ZS4KKworICAgIFJlcXVpcmVzOiAgIERhdGU6OkNhbGMKKworVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyBhIGRhdGUgYW5kIHRpbWUgc3RyaW5nIGludG8gYSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUuCisKK1RoZSBkYXRlIHBhcnNpbmcgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSBDPERlY29kZV9EYXRlX0VVKCk+IGZ1bmN0aW9uIG9mIHRoZSBEYXRlOjpDYWxjIG1vZHVsZS4gUmVmZXIgdG8gdGhlIERhdGU6OkNhbGMgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgZm9ybWF0cyB0aGF0IGNhbiBiZSBwYXJzZWQuIEFsc28gbm90ZSB0aGUgZm9sbG93aW5nIGZyb20gdGhlIERhdGU6OkNhbGMgZG9jdW1lbnRhdGlvbjoKKworIklmIHRoZSB5ZWFyIGlzIGdpdmVuIGFzIG9uZSBvciB0d28gZGlnaXRzIG9ubHkgKGkuZS4sIGlmIHRoZSB5ZWFyIGlzIGxlc3MgdGhhbiAxMDApLCBpdCBpcyBtYXBwZWQgdG8gdGhlIHdpbmRvdyAxOTcwIC0yMDY5IGFzIGZvbGxvd3MiOgorCisgICAgIDAgRTxsdD49ICR5ZWFyIEU8bHQ+ICA3MCAgPT0+ICAkeWVhciArPSAyMDAwOworICAgIDcwIEU8bHQ+PSAkeWVhciBFPGx0PiAxMDAgID09PiAgJHllYXIgKz0gMTkwMDsKKworVGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIGlzIHBhcnNlZCB1c2luZyB0aGUgQzx4bF9wYXJzZV90aW1lKCk+IGZ1bmN0aW9uIGRlc2NyaWJlZCBhYm92ZS4KKworTm90ZTogdGhlIEVVIGluIHRoZSBmdW5jdGlvbiBuYW1lIG1lYW5zIHRoYXQgYSBFdXJvcGVhbiBkYXRlIGZvcm1hdCBpcyBhc3N1bWVkIGlmIGl0IGlzIG5vdCBjbGVhciBmcm9tIHRoZSBzdHJpbmcuIFNlZSB0aGUgZmlyc3QgZXhhbXBsZSBiZWxvdy4KKworICAgICRkYXRlMSA9IHhsX2RlY29kZV9kYXRlX0VVKCIxMS83Lzk3Iik7ICMxMSBKdWx5IDE5OTcKKyAgICAkZGF0ZTIgPSB4bF9kZWNvZGVfZGF0ZV9FVSgiU2F0IDEyIFNlcHQgMTk5OCIpOworICAgICRkYXRlMyA9IHhsX2RlY29kZV9kYXRlX0VVKCI0OjMwIEFNIFNhdCAxMiBTZXB0IDE5OTgiKTsKKworCis9Y3V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHhsX2RlY29kZV9kYXRlX0VVKCRzdHJpbmcpCisjCitzdWIgeGxfZGVjb2RlX2RhdGVfRVUgeworCisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAXzsKKworICAgIG15ICRkYXRlID0gc2hpZnQ7CisgICAgbXkgQGRhdGU7CisgICAgbXkgJHRpbWUgPSAwOworCisgICAgIyBSZW1vdmUgYW5kIGRlY29kZSB0aGUgdGltZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcKKyAgICBpZiAoJGRhdGUgPX4gcy8oXGR7MSwyfTpcZFxkOj8oXGRcZChcLlxkKyk/KT8oXHMrKT8oYW18cG0pPykvL2kpIHsKKyAgICAgICAgJHRpbWUgPSB4bF9wYXJzZV90aW1lKCQxKTsKKyAgICAgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBkZWZpbmVkICR0aW1lOworICAgIH0KKworICAgICMgUmV0dXJuIGlmIHRoZSBzdHJpbmcgaXMgbm93IGJsYW5rLCBpLmUuIGl0IGNvbnRhaW5lZCBhIHRpbWUgb25seS4KKyAgICByZXR1cm4gJHRpbWUgaWYgJGRhdGUgPX4gL15ccyokLzsKKworICAgICMgRGVjb2RlIHRoZSBkYXRlIHBvcnRpb24gb2YgdGhlIHN0cmluZworICAgIEBkYXRlID0gRGVjb2RlX0RhdGVfRVUoJGRhdGUpOworICAgIHJldHVybiB1bmRlZiB1bmxlc3MgQGRhdGU7CisKKyAgICByZXR1cm4geGxfZGF0ZV9saXN0KEBkYXRlKSArICR0aW1lOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCis9aGVhZDIgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKworCisgICAgUGFyYW1ldGVyczogJHN0cmluZywgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgZGF0ZSBhbmQgdGltZQorCisgICAgUmV0dXJuczogICAgQSBudW1iZXIgdGhhdCByZXByZXNlbnRzIGFuIEV4Y2VsIGRhdGUKKyAgICAgICAgICAgICAgICBvciB1bmRlZiBmb3IgYW4gaW52YWxpZCBkYXRlLgorCisgICAgUmVxdWlyZXM6ICAgRGF0ZTo6Q2FsYworCitUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIGEgZGF0ZSBhbmQgdGltZSBzdHJpbmcgaW50byBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gRXhjZWwgZGF0ZS4KKworVGhlIGRhdGUgcGFyc2luZyBpcyBwZXJmb3JtZWQgdXNpbmcgdGhlIEM8RGVjb2RlX0RhdGVfVVMoKT4gZnVuY3Rpb24gb2YgdGhlIERhdGU6OkNhbGMgbW9kdWxlLiBSZWZlciB0byB0aGUgRGF0ZTo6Q2FsYyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGF0ZSBmb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZC4gQWxzbyBub3RlIHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUgRGF0ZTo6Q2FsYyBkb2N1bWVudGF0aW9uOgorCisiSWYgdGhlIHllYXIgaXMgZ2l2ZW4gYXMgb25lIG9yIHR3byBkaWdpdHMgb25seSAoaS5lLiwgaWYgdGhlIHllYXIgaXMgbGVzcyB0aGFuIDEwMCksIGl0IGlzIG1hcHBlZCB0byB0aGUgd2luZG93IDE5NzAgLTIwNjkgYXMgZm9sbG93cyI6CisKKyAgICAgMCA8PSAkeWVhciA8ICA3MCAgPT0+ICAkeWVhciArPSAyMDAwOworICAgIDcwIDw9ICR5ZWFyIDwgMTAwICA9PT4gICR5ZWFyICs9IDE5MDA7CisKK1RoZSB0aW1lIHBvcnRpb24gb2YgdGhlIHN0cmluZyBpcyBwYXJzZWQgdXNpbmcgdGhlIEM8eGxfcGFyc2VfdGltZSgpPiBmdW5jdGlvbiBkZXNjcmliZWQgYWJvdmUuCisKK05vdGU6IHRoZSBVUyBpbiB0aGUgZnVuY3Rpb24gbmFtZSBtZWFucyB0aGF0IGFuIEFtZXJpY2FuIGRhdGUgZm9ybWF0IGlzIGFzc3VtZWQgaWYgaXQgaXMgbm90IGNsZWFyIGZyb20gdGhlIHN0cmluZy4gU2VlIHRoZSBmaXJzdCBleGFtcGxlIGJlbG93LgorCisgICAgJGRhdGUxID0geGxfZGVjb2RlX2RhdGVfVVMoIjExLzcvOTciKTsgIyA3IE5vdmVtYmVyIDE5OTcKKyAgICAkZGF0ZTIgPSB4bF9kZWNvZGVfZGF0ZV9VUygiMTIgU2VwdCBTYXR1cmRheSAxOTk4Iik7CisgICAgJGRhdGUzID0geGxfZGVjb2RlX2RhdGVfVVMoIjQ6MzAgQU0gMTIgU2VwdCBTYXQgMTk5OCIpOworCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKyMKK3N1YiB4bF9kZWNvZGVfZGF0ZV9VUyB7CisKKyAgICByZXR1cm4gdW5kZWYgdW5sZXNzIEBfOworCisgICAgbXkgJGRhdGUgPSBzaGlmdDsKKyAgICBteSBAZGF0ZTsKKyAgICBteSAkdGltZSA9IDA7CisKKyAgICAjIFJlbW92ZSBhbmQgZGVjb2RlIHRoZSB0aW1lIHBvcnRpb24gb2YgdGhlIHN0cmluZworICAgIGlmICgkZGF0ZSA9fiBzLyhcZHsxLDJ9OlxkXGQ6PyhcZFxkKFwuXGQrKT8pPyhccyspPyhhbXxwbSk/KS8vaSkgeworICAgICAgICAkdGltZSA9IHhsX3BhcnNlX3RpbWUoJDEpOworICAgICAgICByZXR1cm4gdW5kZWYgdW5sZXNzIGRlZmluZWQgJHRpbWU7CisgICAgfQorCisgICAgIyBSZXR1cm4gaWYgdGhlIHN0cmluZyBpcyBub3cgYmxhbmssIGkuZS4gaXQgY29udGFpbmVkIGEgdGltZSBvbmx5LgorICAgIHJldHVybiAkdGltZSBpZiAkZGF0ZSA9fiAvXlxzKiQvOworCisgICAgIyBEZWNvZGUgdGhlIGRhdGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nCisgICAgQGRhdGUgPSBEZWNvZGVfRGF0ZV9VUygkZGF0ZSk7CisgICAgcmV0dXJuIHVuZGVmIHVubGVzcyBAZGF0ZTsKKworICAgIHJldHVybiB4bF9kYXRlX2xpc3QoQGRhdGUpICsgJHRpbWU7Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworPWhlYWQyIHhsX2RhdGVfMTkwNCgkZGF0ZSkKKworCisgICAgUGFyYW1ldGVyczogJGRhdGUsIGFuIEV4Y2VsIGRhdGUgd2l0aCBhIDE5MDAgZXBvY2gKKworICAgIFJldHVybnM6ICAgIGFuIEV4Y2VsIGRhdGUgd2l0aCBhIDE5MDQgZXBvY2ggb3IgemVybyBpZgorICAgICAgICAgICAgICAgIHRoZSAkZGF0ZSBpcyBiZWZvcmUgMTkwNAorCisKK1RoaXMgZnVuY3Rpb24gY29udmVydHMgYW4gRXhjZWwgZGF0ZSBiYXNlZCBvbiB0aGUgMTkwMCBlcG9jaCBpbnRvIGEgZGF0ZSBiYXNlZCBvbiB0aGUgMTkwNCBlcG9jaC4KKworCisgICAgJGRhdGUxID0geGxfZGF0ZV9saXN0KDIwMDIsIDEsIDEzKTsgIyAxMyBKYW4gMjAwMiwgMTkwMCBlcG9jaAorICAgICRkYXRlMiA9IHhsX2RhdGVfMTkwNCgkZGF0ZTEpOyAgICAgICMgMTMgSmFuIDIwMDIsIDE5MDQgZXBvY2gKKworCitTZWUgYWxzbyB0aGUgQzxzZXRfMTkwNCgpPiB3b3JrYm9vayBtZXRob2QgaW4gdGhlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uCisKKz1jdXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgeGxfZGVjb2RlX2RhdGVfVVMoJHN0cmluZykKKyMKK3N1YiB4bF9kYXRlXzE5MDQgeworCisgICAgbXkgJGRhdGUgPSAkX1swXSB8fCAwOworCisgICAgaWYgKCRkYXRlIDwgMTQ2MikgeworICAgICAgICAjIGJlZm9yZSAxOTA0CisgICAgICAgICRkYXRlID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRkYXRlIC09IDE0NjI7CisgICAgfQorCisgICAgcmV0dXJuICRkYXRlOworfQorCisKKworCisKKz1oZWFkMSBSRVFVSVJFTUVOVFMKKworVGhlIGRhdGUgYW5kIHRpbWUgZnVuY3Rpb25zIHJlcXVpcmUgZnVuY3Rpb25zIGZyb20gdGhlIEM8RGF0ZTo6TWFuaXA+IGFuZCBDPERhdGU6OkNhbGM+IG1vZHVsZXMuIFRoZSByZXF1aXJlZCBmdW5jdGlvbnMgYXJlICJhdXRvdXNlZCIgZnJvbSB0aGVzZSBtb2R1bGVzIHNvIHRoYXQgeW91IGRvIG5vdCBoYXZlIHRvIGluc3RhbGwgdGhlbSB1bmxlc3MgeW91IHdpc2ggdG8gdXNlIHRoZSBkYXRlIGFuZCB0aW1lIHJvdXRpbmVzLiBUaGVyZWZvcmUgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSByb3cgYW5kIGNvbHVtbiBmdW5jdGlvbnMgd2l0aG91dCBoYXZpbmcgQzxEYXRlOjpNYW5pcD4gYW5kIEM8RGF0ZTo6Q2FsYz4gaW5zdGFsbGVkLgorCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCAiYXV0b3VzaW5nIiByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvbiB0aGUgQzxhdXRvdXNlPiBwcmFnbWEuCisKKworCis9aGVhZDEgQlVHUworCitXaGVuIHVzaW5nIHRoZSBhdXRvdXNlZCBmdW5jdGlvbnMgZnJvbSBDPERhdGU6Ok1hbmlwPiBhbmQgQzxEYXRlOjpDYWxjPiBvbiBQZXJsIDUuNi4wIHdpdGggQzwtdz4geW91IHdpbGwgZ2V0IGEgd2FybmluZyBsaWtlIHRoaXM6CisKKyAgICAiU3Vicm91dGluZSB4eHggcmVkZWZpbmVkIC4uLiIKKworVGhlIGN1cnJlbnQgd29ya2Fyb3VuZCBmb3IgdGhpcyBpcyB0byBwdXQgQzx1c2Ugd2FybmluZ3M7PiBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9ncmFtLgorCisKKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCisKKworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCisKKz1jdXQKKworCisKKzE7CisKKworX19FTkRfXworCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtib29rLnBtIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Xb3JrYm9vay5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjc2YmIyCi0tLSAvZGV2L251bGwKKysrIGIvbWN1L3Rvb2xzL3BlcmwvU3ByZWFkc2hlZXQvV3JpdGVFeGNlbC9Xb3JrYm9vay5wbQpAQCAtMCwwICsxLDM2MzggQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6Oldvcmtib29rOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFdvcmtib29rIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtib29rcy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKK3VzZSBFeHBvcnRlcjsKK3VzZSBzdHJpY3Q7Cit1c2UgQ2FycDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6T0xFd3JpdGVyOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpXb3Jrc2hlZXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdDsKK3VzZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OlByb3BlcnRpZXMgJzpwcm9wZXJ0eV9zZXRzJzsKKwordXNlIHZhcnMgcXcoJFZFUlNJT04gQElTQSk7CitASVNBID0gcXcoU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkJJRkZ3cml0ZXIgRXhwb3J0ZXIpOworCiskVkVSU0lPTiA9ICcyLjM3JzsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBuZXcoKQorIworIyBDb25zdHJ1Y3Rvci4gQ3JlYXRlcyBhIG5ldyBXb3JrYm9vayBvYmplY3QgZnJvbSBhIEJJRkZ3cml0ZXIgb2JqZWN0LgorIworc3ViIG5ldyB7CisKKyAgICBteSAkY2xhc3MgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2VsZiAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlci0+bmV3KCk7CisgICAgbXkgJGJ5dGVfb3JkZXIgID0gJHNlbGYtPntfYnl0ZV9vcmRlcn07CisgICAgbXkgJHBhcnNlciAgICAgID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGEtPm5ldygkYnl0ZV9vcmRlcik7CisKKyAgICAkc2VsZi0+e19maWxlbmFtZX0gICAgICAgICAgICAgID0gJF9bMF0gfHwgJyc7CisgICAgJHNlbGYtPntfcGFyc2VyfSAgICAgICAgICAgICAgICA9ICRwYXJzZXI7CisgICAgJHNlbGYtPntfdGVtcGRpcn0gICAgICAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57XzE5MDR9ICAgICAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2FjdGl2ZXNoZWV0fSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpcnN0c2hlZXR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3NlbGVjdGVkfSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3hmX2luZGV4fSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2JpZmZzaXplfSAgICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3NoZWV0X25hbWV9ICAgICAgICAgICAgID0gJ1NoZWV0JzsKKyAgICAkc2VsZi0+e19jaGFydF9uYW1lfSAgICAgICAgICAgICA9ICdDaGFydCc7CisgICAgJHNlbGYtPntfc2hlZXRfY291bnR9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfY2hhcnRfY291bnR9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0gICAgICAgICAgICA9ICcnOworICAgICRzZWxmLT57X2NvZGVwYWdlfSAgICAgICAgICAgICAgPSAweDA0RTQ7CisgICAgJHNlbGYtPntfY291bnRyeX0gICAgICAgICAgICAgICA9IDE7CisgICAgJHNlbGYtPntfd29ya3NoZWV0c30gICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3NoZWV0bmFtZXN9ICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19mb3JtYXRzfSAgICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfcGFsZXR0ZX0gICAgICAgICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gICAgICAgICA9IDE7CisgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gICAgICAgICAgICA9ICIiOworICAgICRzZWxmLT57X3RlbXBfZmlsZX0gICAgICAgICAgICAgPSAiIjsKKyAgICAkc2VsZi0+e19pbnRlcm5hbF9maH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maF9vdXR9ICAgICAgICAgICAgICAgID0gIiI7CisKKyAgICAkc2VsZi0+e19zdHJfdG90YWx9ICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19zdHJfdW5pcXVlfSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19zdHJfdGFibGV9ICAgICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfc3RyX2FycmF5fSAgICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3N0cl9ibG9ja19zaXplc30gICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19leHRzc3Rfb2Zmc2V0c30gICAgICAgID0gW107CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldHN9ICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldF9zaXplfSAgICA9IDA7CisKKyAgICAkc2VsZi0+e19leHRfcmVmX2NvdW50fSAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19leHRfcmVmc30gICAgICAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e19tc29fY2x1c3RlcnN9ICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfbXNvX3NpemV9ICAgICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19oaWRlb2JqfSAgICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSAgICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2FkZF9kb2NfcHJvcGVydGllc30gICAgPSAwOworICAgICRzZWxmLT57X2xvY2FsdGltZX0gICAgICAgICAgICAgPSBbbG9jYWx0aW1lKCldOworCisgICAgJHNlbGYtPntfZGVmaW5lZF9uYW1lc30gICAgICAgICA9IFtdOworCisgICAgYmxlc3MgJHNlbGYsICRjbGFzczsKKworCisgICAgIyBBZGQgdGhlIGluLWJ1aWx0IHN0eWxlIGZvcm1hdHMgYW5kIHRoZSBkZWZhdWx0IGNlbGwgZm9ybWF0LgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICAwIE5vcm1hbAorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICAxIFJvd0xldmVsIDEKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgMiBSb3dMZXZlbCAyCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDMgUm93TGV2ZWwgMworICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA0IFJvd0xldmVsIDQKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgNSBSb3dMZXZlbCA1CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDYgUm93TGV2ZWwgNgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjICA3IFJvd0xldmVsIDcKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAgOCBDb2xMZXZlbCAxCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgIDkgQ29sTGV2ZWwgMgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDEwIENvbExldmVsIDMKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAxMSBDb2xMZXZlbCA0CisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICMgMTIgQ29sTGV2ZWwgNQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAjIDEzIENvbExldmVsIDYKKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEpOyAgICAgICAgICAgICAgICAgICAgICAgIyAxNCBDb2xMZXZlbCA3CisgICAgJHNlbGYtPmFkZF9mb3JtYXQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMTUgQ2VsbCBYRgorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSwgbnVtX2Zvcm1hdCA9PiAweDJCKTsgICAjIDE2IENvbW1hCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MjkpOyAgICMgMTcgQ29tbWFbMF0KKyAgICAkc2VsZi0+YWRkX2Zvcm1hdCh0eXBlID0+IDEsIG51bV9mb3JtYXQgPT4gMHgyQyk7ICAgIyAxOCBDdXJyZW5jeQorICAgICRzZWxmLT5hZGRfZm9ybWF0KHR5cGUgPT4gMSwgbnVtX2Zvcm1hdCA9PiAweDJBKTsgICAjIDE5IEN1cnJlbmN5WzBdCisgICAgJHNlbGYtPmFkZF9mb3JtYXQodHlwZSA9PiAxLCBudW1fZm9ybWF0ID0+IDB4MDkpOyAgICMgMjAgUGVyY2VudAorCisKKyAgICAjIEFkZCB0aGUgZGVmYXVsdCBmb3JtYXQgZm9yIGh5cGVybGlua3MKKyAgICAkc2VsZi0+e191cmxfZm9ybWF0fSA9ICRzZWxmLT5hZGRfZm9ybWF0KGNvbG9yID0+ICdibHVlJywgdW5kZXJsaW5lID0+IDEpOworCisKKyAgICAjIENoZWNrIGZvciBhIGZpbGVuYW1lIHVubGVzcyBpdCBpcyBhbiBleGlzdGluZyBmaWxlaGFuZGxlCisgICAgaWYgKG5vdCByZWYgJHNlbGYtPntfZmlsZW5hbWV9IGFuZCAkc2VsZi0+e19maWxlbmFtZX0gZXEgJycpIHsKKyAgICAgICAgY2FycCAnRmlsZW5hbWUgcmVxdWlyZWQgYnkgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwtPm5ldygpJzsKKyAgICAgICAgcmV0dXJuIHVuZGVmOworICAgIH0KKworCisgICAgIyBDb252ZXJ0IHRoZSBmaWxlbmFtZSB0byBhIGZpbGVoYW5kbGUgdG8gcGFzcyB0byB0aGUgT0xFIHdyaXRlciB3aGVuIHRoZQorICAgICMgZmlsZSBpcyBjbG9zZWQuIElmIHRoZSBmaWxlbmFtZSBpcyBhIHJlZmVyZW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgaXQgaXMKKyAgICAjIGEgdmFsaWQgZmlsZWhhbmRsZS4KKyAgICAjCisgICAgaWYgKG5vdCByZWYgJHNlbGYtPntfZmlsZW5hbWV9KSB7CisKKyAgICAgICAgbXkgJGZoID0gRmlsZUhhbmRsZS0+bmV3KCc+Jy4gJHNlbGYtPntfZmlsZW5hbWV9KTsKKworICAgICAgICBpZiAobm90IGRlZmluZWQgJGZoKSB7CisgICAgICAgICAgICBjYXJwICJDYW4ndCBvcGVuICIgLgorICAgICAgICAgICAgICAgICAgJHNlbGYtPntfZmlsZW5hbWV9IC4KKyAgICAgICAgICAgICAgICAgICIuIEl0IG1heSBiZSBpbiB1c2Ugb3IgcHJvdGVjdGVkIjsKKyAgICAgICAgICAgIHJldHVybiB1bmRlZjsKKyAgICAgICAgfQorCisgICAgICAgICMgYmlubW9kZSBmaWxlIHdoZXRoZXIgcGxhdGZvcm0gcmVxdWlyZXMgaXQgb3Igbm90CisgICAgICAgIGJpbm1vZGUoJGZoKTsKKyAgICAgICAgJHNlbGYtPntfaW50ZXJuYWxfZmh9ID0gMTsKKyAgICAgICAgJHNlbGYtPntfZmhfb3V0fSAgICAgID0gJGZoOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfaW50ZXJuYWxfZmh9ID0gMDsKKyAgICAgICAgJHNlbGYtPntfZmhfb3V0fSAgICAgID0gJHNlbGYtPntfZmlsZW5hbWV9OworCisgICAgfQorCisKKyAgICAjIFNldCBjb2xvdXIgcGFsZXR0ZS4KKyAgICAkc2VsZi0+c2V0X3BhbGV0dGVfeGw5NygpOworCisgICAgIyBMb2FkIEVuY29kZSBpZiB3ZSBjYW4uCisgICAgcmVxdWlyZSBFbmNvZGUgaWYgJF0gPj0gNS4wMDg7CisKKyAgICAkc2VsZi0+X2luaXRpYWxpemUoKTsKKyAgICAkc2VsZi0+X2dldF9jaGVja3N1bV9tZXRob2QoKTsKKyAgICByZXR1cm4gJHNlbGY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfaW5pdGlhbGl6ZSgpCisjCisjIE9wZW4gYSB0bXAgZmlsZSB0byBzdG9yZSB0aGUgbWFqb3JpdHkgb2YgdGhlIFdvcmtzaGVldCBkYXRhLiBJZiB0aGlzIGZhaWxzLAorIyBmb3IgZXhhbXBsZSBkdWUgdG8gd3JpdGUgcGVybWlzc2lvbnMsIHN0b3JlIHRoZSBkYXRhIGluIG1lbW9yeS4gVGhpcyBjYW4gYmUKKyMgc2xvdyBmb3IgbGFyZ2UgZmlsZXMuCisjCisjIFRPRE86IE1vdmUgdGhpcyBhbmQgb3RoZXIgbWV0aG9kcyBzaGFyZWQgd2l0aCBXb3Jrc2hlZXQgdXAgaW50byBCSUZGd3JpdGVyLgorIworc3ViIF9pbml0aWFsaXplIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGZoOworICAgIG15ICR0bXBfZGlyOworCisgICAgIyBUaGUgZm9sbG93aW5nIGNvZGUgaXMgY29tcGxpY2F0ZWQgYnkgV2luZG93cyBsaW1pdGF0aW9ucy4gUG9ydGVycyBjYW4KKyAgICAjIGNob29zZSBhIG1vcmUgZGlyZWN0IG1ldGhvZC4KKworCisKKyAgICAjIEluIHRoZSBkZWZhdWx0IGNhc2Ugd2UgdXNlIElPOjpGaWxlLT5uZXdfdG1wZmlsZSgpLiBUaGlzIG1heSBmYWlsLCBpbgorICAgICMgcGFydGljdWxhciB3aXRoIElJUyBvbiBXaW5kb3dzLCBzbyB3ZSBhbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgdGVtcAorICAgICMgZGlyZWN0b3J5IHZpYSBGaWxlOjpUZW1wLgorICAgICMKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e190ZW1wZGlyfSkgeworCisgICAgICAgICMgRGVsYXkgbG9hZGluZyBGaWxlOlRlbXAgdG8gcmVkdWNlIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLgorICAgICAgICBldmFsIHsgcmVxdWlyZSBGaWxlOjpUZW1wIH07CisgICAgICAgIGRpZSAiVGhlIEZpbGU6OlRlbXAgbW9kdWxlIG11c3QgYmUgaW5zdGFsbGVkIGluIG9yZGVyICIuCisgICAgICAgICAgICAidG8gY2FsbCBzZXRfdGVtcGRpcigpLlxuIiBpZiAkQDsKKworCisgICAgICAgICMgVHJhcCBidXQgaWdub3JlIEZpbGU6OlRlbXAgZXJyb3JzLgorICAgICAgICBldmFsIHsgJGZoID0gRmlsZTo6VGVtcDo6dGVtcGZpbGUoRElSID0+ICRzZWxmLT57X3RlbXBkaXJ9KSB9OworCisgICAgICAgICMgU3RvcmUgdGhlIGZhaWxlZCB0bXAgZGlyIGluIGNhc2Ugb2YgZXJyb3JzLgorICAgICAgICAkdG1wX2RpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpciBpZiBub3QgJGZoOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAkZmggPSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKTsKKworICAgICAgICAjIFN0b3JlIHRoZSBmYWlsZWQgdG1wIGRpciBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgJHRtcF9kaXIgPSAiUE9TSVg6OnRtcG5hbSgpIGRpcmVjdG9yeSIgaWYgbm90ICRmaDsKKyAgICB9CisKKworICAgICMgQ2hlY2sgaWYgdGhlIHRlbXAgZmlsZSBjcmVhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gRWxzZSBzdG9yZSBkYXRhIGluIG1lbW9yeS4KKyAgICBpZiAoJGZoKSB7CisKKyAgICAgICAgIyBiaW5tb2RlIGZpbGUgd2hldGhlciBwbGF0Zm9ybSByZXF1aXJlcyBpdCBvciBub3QuCisgICAgICAgIGJpbm1vZGUoJGZoKTsKKworICAgICAgICAjIFN0b3JlIGZpbGVoYW5kbGUKKyAgICAgICAgJHNlbGYtPntfZmlsZWhhbmRsZX0gPSAkZmg7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgICMgU2V0IGZsYWcgdG8gc3RvcmUgZGF0YSBpbiBtZW1vcnkgaWYgWFg6OnRlbXBmaWxlKCkgZmFpbGVkLgorICAgICAgICAkc2VsZi0+e191c2luZ190bXBmaWxlfSA9IDA7CisKKyAgICAgICAgaWYgKCReVykgeworICAgICAgICAgICAgbXkgJGRpciA9ICRzZWxmLT57X3RlbXBkaXJ9IHx8IEZpbGU6OlNwZWMtPnRtcGRpcigpOworCisgICAgICAgICAgICB3YXJuICJVbmFibGUgdG8gY3JlYXRlIHRlbXAgZmlsZXMgaW4gJHRtcF9kaXIuIERhdGEgd2lsbCBiZSAiLgorICAgICAgICAgICAgICAgICAic3RvcmVkIGluIG1lbW9yeS4gUmVmZXIgdG8gc2V0X3RlbXBkaXIoKSBpbiB0aGUgIi4KKyAgICAgICAgICAgICAgICAgIlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsIGRvY3VtZW50YXRpb24uXG4iIDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfY2hlY2tzdW1fbWV0aG9kLgorIworIyBDaGVjayBmb3IgbW9kdWxlcyBhdmFpbGFibGUgdG8gY2FsY3VsYXRlIGltYWdlIGNoZWNrc3VtLiBFeGNlbCB1c2VzIE1ENCBidXQKKyMgTUQ1IHdpbGwgYWxzbyB3b3JrLgorIworc3ViIF9nZXRfY2hlY2tzdW1fbWV0aG9kIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBldmFsIHsgcmVxdWlyZSBEaWdlc3Q6Ok1ENH07CisgICAgaWYgKG5vdCAkQCkgeworICAgICAgICAkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgZXZhbCB7IHJlcXVpcmUgRGlnZXN0OjpQZXJsOjpNRDR9OworICAgIGlmIChub3QgJEApIHsKKyAgICAgICAgJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9IDI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKworICAgIGV2YWwgeyByZXF1aXJlIERpZ2VzdDo6TUQ1fTsKKyAgICBpZiAobm90ICRAKSB7CisgICAgICAgICRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPSAzOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgIyBEZWZhdWx0LgorICAgICRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPSAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBTdG9yZSBXb3Jrc2hlZXQgZGF0YSBpbiBtZW1vcnkgdXNpbmcgdGhlIGJhc2UgY2xhc3MgX2FwcGVuZCgpIG9yIHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUsIHRoZSBkZWZhdWx0LgorIworc3ViIF9hcHBlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZGF0YSA9ICcnOworCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgICRkYXRhID0gam9pbignJywgQF8pOworCisgICAgICAgICMgQWRkIENPTlRJTlVFIHJlY29yZHMgaWYgbmVjZXNzYXJ5CisgICAgICAgICRkYXRhID0gJHNlbGYtPl9hZGRfY29udGludWUoJGRhdGEpIGlmIGxlbmd0aCgkZGF0YSkgPiAkc2VsZi0+e19saW1pdH07CisKKyAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gJGRhdGE7CisgICAgICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+U1VQRVI6Ol9hcHBlbmQoQF8pOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9kYXRhKCkuCisjCisjIFJldHJpZXZlcyBkYXRhIGZyb20gbWVtb3J5IGluIG9uZSBjaHVuaywgb3IgZnJvbSBkaXNrIGluICRidWZmZXIKKyMgc2l6ZWQgY2h1bmtzLgorIworc3ViIGdldF9kYXRhIHsKKworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKyAgICBteSAkYnVmZmVyID0gNDA5NjsKKyAgICBteSAkdG1wOworCisgICAgIyBSZXR1cm4gZGF0YSBzdG9yZWQgaW4gbWVtb3J5CisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfZGF0YX0pIHsKKyAgICAgICAgJHRtcCAgICAgICAgICAgPSAkc2VsZi0+e19kYXRhfTsKKyAgICAgICAgJHNlbGYtPntfZGF0YX0gPSB1bmRlZjsKKyAgICAgICAgbXkgJGZoICAgICAgICAgPSAkc2VsZi0+e19maWxlaGFuZGxlfTsKKyAgICAgICAgc2VlaygkZmgsIDAsIDApIGlmICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9OworICAgICAgICByZXR1cm4gJHRtcDsKKyAgICB9CisKKyAgICAjIFJldHVybiBkYXRhIHN0b3JlZCBvbiBkaXNrCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgIHJldHVybiAkdG1wIGlmIHJlYWQoJHNlbGYtPntfZmlsZWhhbmRsZX0sICR0bXAsICRidWZmZXIpOworICAgIH0KKworICAgICMgTm8gZGF0YSB0byByZXR1cm4KKyAgICByZXR1cm4gdW5kZWY7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjbG9zZSgpCisjCisjIENhbGxzIGZpbmFsaXphdGlvbiBtZXRob2RzIGFuZCBleHBsaWNpdGx5IGNsb3NlIHRoZSBPTEV3cml0ZXIgZmlsZQorIyBoYW5kbGUuCisjCitzdWIgY2xvc2UgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiBpZiAkc2VsZi0+e19maWxlY2xvc2VkfTsgIyBQcmV2ZW50IGNsb3NlKCkgZnJvbSBiZWluZyBjYWxsZWQgdHdpY2UuCisKKyAgICAkc2VsZi0+e19maWxlY2xvc2VkfSA9IDE7CisKKyAgICByZXR1cm4gJHNlbGYtPl9zdG9yZV93b3JrYm9vaygpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgREVTVFJPWSgpCisjCisjIENsb3NlIHRoZSB3b3JrYm9vayBpZiBpdCBoYXNuJ3QgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgY2xvc2VkLgorIworc3ViIERFU1RST1kgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGxvY2FsICgkQCwgJCEsICReRSwgJD8pOworCisgICAgJHNlbGYtPmNsb3NlKCkgaWYgbm90ICRzZWxmLT57X2ZpbGVjbG9zZWR9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2hlZXRzKHNsaWNlLC4uLikKKyMKKyMgQW4gYWNjZXNzb3IgZm9yIHRoZSBfd29ya3NoZWV0c1tdIGFycmF5CisjCisjIFJldHVybnM6IGFuIG9wdGlvbmFsbHkgc2xpY2VkIGxpc3Qgb2YgdGhlIHdvcmtzaGVldCBvYmplY3RzIGluIGEgd29ya2Jvb2suCisjCitzdWIgc2hlZXRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoQF8pIHsKKyAgICAgICAgIyBSZXR1cm4gYSBzbGljZSBvZiB0aGUgYXJyYXkKKyAgICAgICAgcmV0dXJuIEB7JHNlbGYtPntfd29ya3NoZWV0c319W0BfXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgUmV0dXJuIHRoZSBlbnRpcmUgbGlzdAorICAgICAgICByZXR1cm4gQHskc2VsZi0+e193b3Jrc2hlZXRzfX07CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd29ya3NoZWV0cygpCisjCisjIEFuIGFjY2Vzc29yIGZvciB0aGUgX3dvcmtzaGVldHNbXSBhcnJheS4KKyMgVGhpcyBtZXRob2QgaXMgbm93IGRlcHJlY2F0ZWQuIFVzZSB0aGUgc2hlZXRzKCkgbWV0aG9kIGluc3RlYWQuCisjCisjIFJldHVybnM6IGFuIGFycmF5IHJlZmVyZW5jZQorIworc3ViIHdvcmtzaGVldHMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiAkc2VsZi0+e193b3Jrc2hlZXRzfTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF93b3Jrc2hlZXQoJG5hbWUsICRlbmNvZGluZykKKyMKKyMgQWRkIGEgbmV3IHdvcmtzaGVldCB0byB0aGUgRXhjZWwgd29ya2Jvb2suCisjCisjIFJldHVybnM6IHJlZmVyZW5jZSB0byBhIHdvcmtzaGVldCBvYmplY3QKKyMKK3N1YiBhZGRfd29ya3NoZWV0IHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRpbmRleCAgICA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworCisgICAgbXkgKCRuYW1lLCAkZW5jb2RpbmcpID0gJHNlbGYtPl9jaGVja19zaGVldG5hbWUoJF9bMF0sICRfWzFdKTsKKworCisgICAgIyBQb3J0ZXJzIHRha2Ugbm90ZSwgdGhlIGZvbGxvd2luZyBzY2hlbWUgb2YgcGFzc2luZyByZWZlcmVuY2VzIHRvIFdvcmtib29rCisgICAgIyBkYXRhIChpbiB0aGUgXCRzZWxmLT57X2Zvb30gY2FzZXMpIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8gdGhlIFdvcmtib29rCisgICAgIyBpdHNlbGYgaXMgYSB3b3JrYXJvdW5kIHRvIGF2b2lkIGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlbiBXb3JrYm9vayBhbmQKKyAgICAjIFdvcmtzaGVldCBvYmplY3RzLiBGZWVsIGZyZWUgdG8gaW1wbGVtZW50IHRoaXMgaW4gYW55IHdheSB0aGUgc3VpdHMgeW91cgorICAgICMgbGFuZ3VhZ2UuCisgICAgIworICAgIG15IEBpbml0X2RhdGEgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFyc2VyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZW1wZGlyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19zdHJfdG90YWx9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl91bmlxdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90YWJsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfMTkwNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWYsICMgUGFsZXR0ZS4gTm90IHVzZWQgeWV0LiBTZWUgYWRkX2NoYXJ0KCkuCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkd29ya3NoZWV0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldC0+bmV3KEBpbml0X2RhdGEpOworICAgICRzZWxmLT57X3dvcmtzaGVldHN9LT5bJGluZGV4XSA9ICR3b3Jrc2hlZXQ7ICAgICAjIFN0b3JlIHJlZiBmb3IgaXRlcmF0b3IKKyAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICAgICAgIyBTdG9yZSBFWFRFUk5TSEVFVCBuYW1lcworICAgICRzZWxmLT57X3BhcnNlcn0tPnNldF9leHRfc2hlZXRzKCRuYW1lLCAkaW5kZXgpOyAjIFN0b3JlIG5hbWVzIGluIEZvcm11bGEucG0KKyAgICByZXR1cm4gJHdvcmtzaGVldDsKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqYWRkd29ya3NoZWV0ID0gKmFkZF93b3Jrc2hlZXQ7CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfY2hhcnQoJWFyZ3MpCisjCisjIENyZWF0ZSBhIGNoYXJ0IGZvciBlbWJlZGRpbmcgb3IgYXMgYXMgbmV3IHNoZWV0LgorIworIworc3ViIGFkZF9jaGFydCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAlYXJnICAgICAgPSBAXzsKKyAgICBteSAkbmFtZSAgICAgPSAnJzsKKyAgICBteSAkZW5jb2RpbmcgPSAwOworICAgIG15ICRpbmRleCAgICA9IEB7ICRzZWxmLT57X3dvcmtzaGVldHN9IH07CisKKyAgICAjIFR5cGUgbXVzdCBiZSBzcGVjaWZpZWQgc28gd2UgY2FuIGNyZWF0ZSB0aGUgcmVxdWlyZWQgY2hhcnQgaW5zdGFuY2UuCisgICAgbXkgJHR5cGUgPSAkYXJne3R5cGV9OworICAgIGlmICggIWRlZmluZWQgJHR5cGUgKSB7CisgICAgICAgIGNyb2FrICJNdXN0IGRlZmluZSBjaGFydCB0eXBlIGluIGFkZF9jaGFydCgpIjsKKyAgICB9CisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZSBjaGFydCBkZWZhdWx0cyB0byBub24gZW1iZWRkZWQuCisgICAgbXkgJGVtYmVkZGVkID0gJGFyZ3tlbWJlZGRlZH0gfHw9IDA7CisKKyAgICAjIENoZWNrIHRoZSB3b3Jrc2hlZXQgbmFtZSBmb3Igbm9uLWVtYmVkZGVkIGNoYXJ0cy4KKyAgICBpZiAoICEkZW1iZWRkZWQgKSB7CisgICAgICAgICggJG5hbWUsICRlbmNvZGluZyApID0KKyAgICAgICAgICAkc2VsZi0+X2NoZWNrX3NoZWV0bmFtZSggJGFyZ3tuYW1lfSwgJGFyZ3tuYW1lX2VuY29kaW5nfSwgMSApOworICAgIH0KKworICAgIG15IEBpbml0X2RhdGEgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFyc2VyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkc2VsZi0+e190ZW1wZGlyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19zdHJfdG90YWx9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl91bmlxdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgXCRzZWxmLT57X3N0cl90YWJsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfMTkwNH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJHNlbGYtPntfcGFsZXR0ZX0sCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkY2hhcnQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPmZhY3RvcnkoICR0eXBlLCBAaW5pdF9kYXRhICk7CisKKyAgICAjIElmIHRoZSBjaGFydCBpc24ndCBlbWJlZGRlZCBsZXQgdGhlIHdvcmtib29rIGNvbnRyb2wgaXQuCisgICAgaWYgKCAhJGVtYmVkZGVkICkgeworICAgICAgICAkc2VsZi0+e193b3Jrc2hlZXRzfS0+WyRpbmRleF0gPSAkY2hhcnQ7ICAgICMgU3RvcmUgcmVmIGZvciBpdGVyYXRvcgorICAgICAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICMgU3RvcmUgRVhURVJOU0hFRVQgbmFtZXMKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgU2V0IGluZGV4IHRvIDAgc28gdGhhdCB0aGUgYWN0aXZhdGUoKSBhbmQgc2V0X2ZpcnN0X3NoZWV0KCkgbWV0aG9kcworICAgICAgICAjIHBvaW50IGJhY2sgdG8gdGhlIGZpcnN0IHdvcmtzaGVldCBpZiB1c2VkIGZvciBlbWJlZGRlZCBjaGFydHMuCisgICAgICAgICRjaGFydC0+e19pbmRleH0gPSAwOworCisgICAgICAgICRjaGFydC0+X3NldF9lbWJlZGRlZF9jb25maWdfZGF0YSgpOworICAgIH0KKworICAgIHJldHVybiAkY2hhcnQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfY2hhcnRfZXh0KCRmaWxlbmFtZSwgJG5hbWUpCisjCisjIEFkZCBhbiBleHRlcm5hbGx5IGNyZWF0ZWQgY2hhcnQuCisjCisjCitzdWIgYWRkX2NoYXJ0X2V4dCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkZmlsZW5hbWUgPSAkX1swXTsKKyAgICBteSAkaW5kZXggICAgPSBAeyRzZWxmLT57X3dvcmtzaGVldHN9fTsKKyAgICBteSAkdHlwZSAgICAgPSAnZXh0ZXJuYWwnOworCisgICAgbXkgKCRuYW1lLCAkZW5jb2RpbmcpID0gJHNlbGYtPl9jaGVja19zaGVldG5hbWUoJF9bMV0sICRfWzJdKTsKKworCisgICAgbXkgQGluaXRfZGF0YSA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAkZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICRlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFwkc2VsZi0+e19hY3RpdmVzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICAgICBcJHNlbGYtPntfZmlyc3RzaGVldH0sCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkY2hhcnQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQtPmZhY3RvcnkoJHR5cGUsIEBpbml0X2RhdGEpOworICAgICRzZWxmLT57X3dvcmtzaGVldHN9LT5bJGluZGV4XSA9ICRjaGFydDsgICAgICAgICAjIFN0b3JlIHJlZiBmb3IgaXRlcmF0b3IKKyAgICAkc2VsZi0+e19zaGVldG5hbWVzfS0+WyRpbmRleF0gPSAkbmFtZTsgICAgICAgICAgIyBTdG9yZSBFWFRFUk5TSEVFVCBuYW1lcworCisgICAgcmV0dXJuICRjaGFydDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jaGVja19zaGVldG5hbWUoJG5hbWUsICRlbmNvZGluZykKKyMKKyMgQ2hlY2sgZm9yIHZhbGlkIHdvcmtzaGVldCBuYW1lcy4gV2UgY2hlY2sgdGhlIGxlbmd0aCwgaWYgaXQgY29udGFpbnMgYW55CisjIGludmFsaWQgY2hhcmFjdGVycyBhbmQgaWYgdGhlIG5hbWUgaXMgdW5pcXVlIGluIHRoZSB3b3JrYm9vay4KKyMKK3N1YiBfY2hlY2tfc2hlZXRuYW1lIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkbmFtZSAgICAgICAgICAgID0gJF9bMF0gfHwgIiI7CisgICAgbXkgJGVuY29kaW5nICAgICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJGNoYXJ0ICAgICAgICAgICA9ICRfWzJdIHx8IDA7CisgICAgbXkgJGxpbWl0ICAgICAgICAgICA9ICRlbmNvZGluZyA/IDYyIDogMzE7CisgICAgbXkgJGludmFsaWRfY2hhciAgICA9IHFyKFtcW1xdOio/L1xcXSk7CisKKyAgICAjIEluY3JlbWVudCB0aGUgU2hlZXQvQ2hhcnQgbnVtYmVyIHVzZWQgZm9yIGRlZmF1bHQgc2hlZXQgbmFtZXMgYmVsb3cuCisgICAgaWYgKCAkY2hhcnQgKSB7CisgICAgICAgICRzZWxmLT57X2NoYXJ0X2NvdW50fSsrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfc2hlZXRfY291bnR9Kys7CisgICAgfQorCisgICAgIyBTdXBwbHkgZGVmYXVsdCBTaGVldC9DaGFydCBuYW1lIGlmIG5vbmUgaGFzIGJlZW4gZGVmaW5lZC4KKyAgICBpZiAoICRuYW1lIGVxICIiICkgeworICAgICAgICAkZW5jb2RpbmcgPSAwOworCisgICAgICAgIGlmICggJGNoYXJ0ICkgeworICAgICAgICAgICAgJG5hbWUgPSAkc2VsZi0+e19jaGFydF9uYW1lfSAuICRzZWxmLT57X2NoYXJ0X2NvdW50fTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICRuYW1lID0gJHNlbGYtPntfc2hlZXRfbmFtZX0gLiAkc2VsZi0+e19zaGVldF9jb3VudH07CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hlY2sgdGhhdCBzaGVldG5hbWUgaXMgPD0gMzEgKDEgb3IgMiBieXRlIGNoYXJzKS4gRXhjZWwgbGltaXQuCisgICAgY3JvYWsgIlNoZWV0bmFtZSAkbmFtZSBtdXN0IGJlIDw9IDMxIGNoYXJzIiBpZiBsZW5ndGggJG5hbWUgPiAkbGltaXQ7CisKKyAgICAjIENoZWNrIHRoYXQgVW5pY29kZSBzaGVldG5hbWUgaGFzIGFuIGV2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgICAgY3JvYWsgJ09kZCBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSB3b3Jrc2hlZXQgbmFtZTonIC4gJG5hbWUKKyAgICAgICAgICBpZiAkZW5jb2RpbmcgPT0gMSBhbmQgbGVuZ3RoKCRuYW1lKSAlIDI7CisKKworICAgICMgQ2hlY2sgdGhhdCBzaGVldG5hbWUgZG9lc24ndCBjb250YWluIGFueSBpbnZhbGlkIGNoYXJhY3RlcnMKKyAgICBpZiAoJGVuY29kaW5nICE9IDEgYW5kICRuYW1lID1+ICRpbnZhbGlkX2NoYXIpIHsKKyAgICAgICAgIyBDaGVjayBBU0NJSSBuYW1lcworICAgICAgICBjcm9hayAnSW52YWxpZCBjaGFyYWN0ZXIgW106Kj8vXFwgaW4gd29ya3NoZWV0IG5hbWU6ICcgLiAkbmFtZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgRXh0cmFjdCBhbnkgOGJpdCBjbGVhbiBjaGFycyBmcm9tIHRoZSBVVEYxNiBuYW1lIGFuZCB2YWxpZGF0ZSB0aGVtLgorICAgICAgICBmb3IgbXkgJHdjaGFyICgkbmFtZSA9fiAvLi4vc2cpIHsKKyAgICAgICAgICAgIG15ICgkaGksICRsbykgPSB1bnBhY2sgImFhIiwgJHdjaGFyOworICAgICAgICAgICAgaWYgKCRoaSBlcSAiXDAiIGFuZCAkbG8gPX4gJGludmFsaWRfY2hhcikgeworICAgICAgICAgICAgICAgIGNyb2FrICdJbnZhbGlkIGNoYXJhY3RlciBbXToqPy9cXCBpbiB3b3Jrc2hlZXQgbmFtZTogJyAuICRuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJG5hbWUpKSB7CisgICAgICAgICAgICAkbmFtZSA9IEVuY29kZTo6ZW5jb2RlKCJVVEYtMTZCRSIsICRuYW1lKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgd29ya3NoZWV0IG5hbWUgZG9lc24ndCBhbHJlYWR5IGV4aXN0IHNpbmNlIHRoaXMgaXMgYSBmYXRhbAorICAgICMgZXJyb3IgaW4gRXhjZWwgOTcuIFRoZSBjaGVjayBtdXN0IGFsc28gZXhjbHVkZSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoZXMKKyAgICAjIHNpbmNlIHRoZSBuYW1lcyAnU2hlZXQxJyBhbmQgJ3NoZWV0MScgYXJlIGVxdWl2YWxlbnQuIFRoZSB0ZXN0cyBhbHNvIGhhdmUKKyAgICAjIHRvIHRha2UgdGhlIGVuY29kaW5nIGludG8gYWNjb3VudC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkd29ya3NoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBteSAkbmFtZV9hICA9ICRuYW1lOworICAgICAgICBteSAkZW5jZF9hICA9ICRlbmNvZGluZzsKKyAgICAgICAgbXkgJG5hbWVfYiAgPSAkd29ya3NoZWV0LT57X25hbWV9OworICAgICAgICBteSAkZW5jZF9iICA9ICR3b3Jrc2hlZXQtPntfZW5jb2Rpbmd9OworICAgICAgICBteSAkZXJyb3IgICA9IDA7CisKKyAgICAgICAgaWYgICAgKCRlbmNkX2EgPT0gMCBhbmQgJGVuY2RfYiA9PSAwKSB7CisgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGVuY2RfYSA9PSAwIGFuZCAkZW5jZF9iID09IDEpIHsKKyAgICAgICAgICAgICRuYW1lX2EgPSBwYWNrICJuKiIsIHVucGFjayAiQyoiLCAkbmFtZV9hOworICAgICAgICAgICAgJGVycm9yICA9IDEgaWYgbGMoJG5hbWVfYSkgZXEgbGMoJG5hbWVfYik7CisgICAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRlbmNkX2EgPT0gMSBhbmQgJGVuY2RfYiA9PSAwKSB7CisgICAgICAgICAgICAkbmFtZV9iID0gcGFjayAibioiLCB1bnBhY2sgIkMqIiwgJG5hbWVfYjsKKyAgICAgICAgICAgICRlcnJvciAgPSAxIGlmIGxjKCRuYW1lX2EpIGVxIGxjKCRuYW1lX2IpOworICAgICAgICB9CisgICAgICAgIGVsc2lmICgkZW5jZF9hID09IDEgYW5kICRlbmNkX2IgPT0gMSkgeworICAgICAgICAgICAgIyBXZSBjYW4gZG8gYSB0cnVlIGNhc2UgaW5zZW5zaXRpdmUgdGVzdCB3aXRoIFBlcmwgNS44IGFuZCB1dGY4LgorICAgICAgICAgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgICAgICAgICAgJG5hbWVfYSA9IEVuY29kZTo6ZGVjb2RlKCJVVEYtMTZCRSIsICRuYW1lX2EpOworICAgICAgICAgICAgICAgICRuYW1lX2IgPSBFbmNvZGU6OmRlY29kZSgiVVRGLTE2QkUiLCAkbmFtZV9iKTsKKyAgICAgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiBsYygkbmFtZV9hKSBlcSBsYygkbmFtZV9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXZSBjYW4ndCBlYXNpbHkgZG8gYSBjYXNlIGluc2Vuc2l0aXZlIHRlc3Qgb2YgdGhlIFVURjE2IG5hbWVzLgorICAgICAgICAgICAgIyBBcyBhIHNwZWNpYWwgY2FzZSB3ZSBjaGVjayBpZiBhbGwgb2YgdGhlIGhpZ2ggYnl0ZXMgYXJlIG51bGxzIGFuZAorICAgICAgICAgICAgIyB0aGVuIGRvIGFuIEFTQ0lJIHN0eWxlIGNhc2UgaW5zZW5zaXRpdmUgdGVzdC4KKworICAgICAgICAgICAgICAgICMgU3RyaXAgb3V0IHRoZSBoaWdoIGJ5dGVzIChmdW5raWx5KS4KKyAgICAgICAgICAgICAgICBteSAkaGlfYSA9IGdyZXAge29yZH0gJG5hbWVfYSA9fiAvKC4pLi9zZzsKKyAgICAgICAgICAgICAgICBteSAkaGlfYiA9IGdyZXAge29yZH0gJG5hbWVfYiA9fiAvKC4pLi9zZzsKKworICAgICAgICAgICAgICAgIGlmICgkaGlfYSBvciAkaGlfYikgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3IgID0gMSBpZiAgICAkbmFtZV9hICBlcSAgICAkbmFtZV9iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yICA9IDEgaWYgbGMoJG5hbWVfYSkgZXEgbGMoJG5hbWVfYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBJZiBhbnkgb2YgdGhlIGNhc2VzIGZhaWxlZCB3ZSB0aHJvdyB0aGUgZXJyb3IgaGVyZS4KKyAgICAgICAgaWYgKCRlcnJvcikgeworICAgICAgICAgICAgY3JvYWsgIldvcmtzaGVldCBuYW1lICckbmFtZScsIHdpdGggY2FzZSBpZ25vcmVkLCAiIC4KKyAgICAgICAgICAgICAgICAgICJpcyBhbHJlYWR5IGluIHVzZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCRuYW1lLCAgJGVuY29kaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGFkZF9mb3JtYXQoJXByb3BlcnRpZXMpCisjCisjIEFkZCBhIG5ldyBmb3JtYXQgdG8gdGhlIEV4Y2VsIHdvcmtib29rLiBUaGlzIGFkZHMgYW4gWEYgcmVjb3JkIGFuZAorIyBhIEZPTlQgcmVjb3JkLiBBbHNvLCBwYXNzIGFueSBwcm9wZXJ0aWVzIHRvIHRoZSBGb3JtYXQ6Om5ldygpLgorIworc3ViIGFkZF9mb3JtYXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRmb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoJHNlbGYtPntfeGZfaW5kZXh9LCBAXyk7CisKKyAgICAkc2VsZi0+e194Zl9pbmRleH0gKz0gMTsKKyAgICBwdXNoIEB7JHNlbGYtPntfZm9ybWF0c319LCAkZm9ybWF0OyAjIFN0b3JlIGZvcm1hdCByZWZlcmVuY2UKKworICAgIHJldHVybiAkZm9ybWF0OworfQorCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyphZGRmb3JtYXQgPSAqYWRkX2Zvcm1hdDsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGNvbXBhdGliaWxpdHlfbW9kZSgpCisjCisjIFNldCB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorIworIyBFeGNlbCBkb2Vzbid0IHJlcXVpcmUgZXZlcnkgcG9zc2libGUgQmlmZiByZWNvcmQgdG8gYmUgcHJlc2VudCBpbiBhIGZpbGUuCisjIEluIHBhcnRpY3VsYXIgaWYgdGhlIGluZGV4aW5nIHJlY29yZHMgSU5ERVgsIFJPVyBhbmQgREJDRUxMIGFyZW4ndCBwcmVzZW50CisjIGl0IGp1c3QgaWdub3JlcyB0aGUgZmFjdCBhbmQgcmVhZHMgdGhlIGNlbGxzIGFueXdheS4gVGhpcyBpcyBhbHNvIHRydWUgb2YKKyMgdGhlIEVYVFNTVCByZWNvcmQuIEdudW1lcmljIGFuZCBPT28gYWxzbyB0YWtlIHRoaXMgYXBwcm9hY2guIFRoaXMgYWxsb3dzCisjIFdyaXRlRXhjZWwgdG8gaWdub3JlIHRoZXNlIHJlY29yZHMgaW4gb3JkZXIgdG8gbWluaW1pc2UgdGhlIGFtb3VudCBvZiBkYXRhCisjIHN0b3JlZCBpbiBtZW1vcnkuIEhvd2V2ZXIsIG90aGVyIHRoaXJkIHBhcnR5IGFwcGxpY2F0aW9ucyB0aGF0IHJlYWQgRXhjZWwKKyMgZmlsZXMgb2Z0ZW4gZXhwZWN0IHRoZXNlIHJlY29yZHMgdG8gYmUgcHJlc2VudC4gSW4gImNvbXBhdGliaWxpdHkgbW9kZSIKKyMgV3JpdGVFeGNlbCB3cml0ZXMgdGhlc2UgcmVjb3JkcyBhbmQgdHJpZXMgdG8gYmUgYXMgY2xvc2UgdG8gYW4gRXhjZWwKKyMgZ2VuZXJhdGVkIGZpbGUgYXMgcG9zc2libGUuCisjCisjIFRoaXMgcmVxdWlyZXMgYWRkaXRpb25hbCBkYXRhIHRvIGJlIHN0b3JlZCBpbiBtZW1vcnkgdW50aWwgdGhlIGZpbGUgaXMKKyMgYWJvdXQgdG8gYmUgd3JpdHRlbi4gVGhpcyBpbmN1cnMgYSBtZW1vcnkgYW5kIHNwZWVkIHBlbmFsdHkgYW5kIG1heSBub3QgYmUKKyMgc3VpdGFibGUgZm9yIHZlcnkgbGFyZ2UgZmlsZXMuCisjCitzdWIgY29tcGF0aWJpbGl0eV9tb2RlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIGNyb2FrICJjb21wYXRpYmlsaXR5X21vZGUoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWRkX3dvcmtzaGVldCgpIgorICAgICAgICAgIGlmICRzZWxmLT5zaGVldHMoKTsKKworICAgIGlmIChkZWZpbmVkKCRfWzBdKSkgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF8xOTA0KCkKKyMKKyMgU2V0IHRoZSBkYXRlIHN5c3RlbTogMCA9IDE5MDAgKHRoZSBkZWZhdWx0KSwgMSA9IDE5MDQKKyMKK3N1YiBzZXRfMTkwNCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBjcm9hayAic2V0XzE5MDQoKSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYWRkX3dvcmtzaGVldCgpIgorICAgICAgICAgIGlmICRzZWxmLT5zaGVldHMoKTsKKworCisgICAgaWYgKGRlZmluZWQoJF9bMF0pKSB7CisgICAgICAgICRzZWxmLT57XzE5MDR9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e18xOTA0fSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0XzE5MDQoKQorIworIyBSZXR1cm4gdGhlIGRhdGUgc3lzdGVtOiAwID0gMTkwMCwgMSA9IDE5MDQKKyMKK3N1YiBnZXRfMTkwNCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57XzE5MDR9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2N1c3RvbV9jb2xvcigpCisjCisjIENoYW5nZSB0aGUgUkdCIGNvbXBvbmVudHMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBjb2xvdXIgcGFsZXR0ZS4KKyMKK3N1YiBzZXRfY3VzdG9tX2NvbG9yIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKworICAgICMgTWF0Y2ggYSBIVE1MICN4eHl5enogc3R5bGUgcGFyYW1ldGVyCisgICAgaWYgKGRlZmluZWQgJF9bMV0gYW5kICRfWzFdID1+IC9eIyhcd1x3KShcd1x3KShcd1x3KS8gKSB7CisgICAgICAgIEBfID0gKCRfWzBdLCBoZXggJDEsIGhleCAkMiwgaGV4ICQzKTsKKyAgICB9CisKKworICAgIG15ICRpbmRleCAgID0gJF9bMF0gfHwgMDsKKyAgICBteSAkcmVkICAgICA9ICRfWzFdIHx8IDA7CisgICAgbXkgJGdyZWVuICAgPSAkX1syXSB8fCAwOworICAgIG15ICRibHVlICAgID0gJF9bM10gfHwgMDsKKworICAgIG15ICRhcmVmICAgID0gJHNlbGYtPntfcGFsZXR0ZX07CisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGNvbG91ciBpbmRleCBpcyB0aGUgcmlnaHQgcmFuZ2UKKyAgICBpZiAoJGluZGV4IDwgOCBvciAkaW5kZXggPiA2NCkgeworICAgICAgICBjYXJwICJDb2xvciBpbmRleCAkaW5kZXggb3V0c2lkZSByYW5nZTogOCA8PSBpbmRleCA8PSA2NCI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICMgQ2hlY2sgdGhhdCB0aGUgY29sb3VyIGNvbXBvbmVudHMgYXJlIGluIHRoZSByaWdodCByYW5nZQorICAgIGlmICggKCRyZWQgICA8IDAgb3IgJHJlZCAgID4gMjU1KSB8fAorICAgICAgICAgKCRncmVlbiA8IDAgb3IgJGdyZWVuID4gMjU1KSB8fAorICAgICAgICAgKCRibHVlICA8IDAgb3IgJGJsdWUgID4gMjU1KSApCisgICAgeworICAgICAgICBjYXJwICJDb2xvciBjb21wb25lbnQgb3V0c2lkZSByYW5nZTogMCA8PSBjb2xvciA8PSAyNTUiOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAkaW5kZXggLT04OyAjIEFkanVzdCBjb2xvdXIgaW5kZXggKHdpbmdsZXNzIGRyYWdvbmZseSkKKworICAgICMgU2V0IHRoZSBSR0IgdmFsdWUKKyAgICAkYXJlZi0+WyRpbmRleF0gPSBbJHJlZCwgJGdyZWVuLCAkYmx1ZSwgMF07CisKKyAgICByZXR1cm4gJGluZGV4ICs4OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BhbGV0dGVfeGw5NygpCisjCisjIFNldHMgdGhlIGNvbG91ciBwYWxldHRlIHRvIHRoZSBFeGNlbCA5NysgZGVmYXVsdC4KKyMKK3N1YiBzZXRfcGFsZXR0ZV94bDk3IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19wYWxldHRlfSA9IFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0sICAgIyA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ZmYsIDB4MDAsIDB4MDBdLCAgICMgMTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAxMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDAwLCAweDAwXSwgICAjIDEzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDBdLCAgICMgMTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyAxNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDE2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ODAsIDB4MDAsIDB4MDBdLCAgICMgMTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAxOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDgwLCAweDAwLCAweDAwXSwgICAjIDE5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4MDAsIDB4ODAsIDB4MDBdLCAgICMgMjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg4MCwgMHg4MCwgMHgwMF0sICAgIyAyMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGMwLCAweGMwLCAweGMwLCAweDAwXSwgICAjIDIyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ODAsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMjMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHg5OSwgMHhmZiwgMHgwMF0sICAgIyAyNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDMzLCAweDY2LCAweDAwXSwgICAjIDI1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ZmYsIDB4Y2MsIDB4MDBdLCAgICMgMjYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhjYywgMHhmZiwgMHhmZiwgMHgwMF0sICAgIyAyNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDY2LCAweDAwLCAweDY2LCAweDAwXSwgICAjIDI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMjkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHg2NiwgMHhjYywgMHgwMF0sICAgIyAzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweGNjLCAweGZmLCAweDAwXSwgICAjIDMxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4MDAsIDB4ODAsIDB4MDBdLCAgICMgMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAzMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDAwLCAweDAwXSwgICAjIDM0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgMzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg4MCwgMHgwMCwgMHg4MCwgMHgwMF0sICAgIyAzNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDgwLCAweDAwLCAweDAwLCAweDAwXSwgICAjIDM3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4ODAsIDB4ODAsIDB4MDBdLCAgICMgMzgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgwMCwgMHgwMCwgMHhmZiwgMHgwMF0sICAgIyAzOQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweGNjLCAweGZmLCAweDAwXSwgICAjIDQwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4Y2MsIDB4ZmYsIDB4ZmYsIDB4MDBdLCAgICMgNDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhjYywgMHhmZiwgMHhjYywgMHgwMF0sICAgIyA0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweGZmLCAweDk5LCAweDAwXSwgICAjIDQzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4Y2MsIDB4ZmYsIDB4MDBdLCAgICMgNDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHg5OSwgMHhjYywgMHgwMF0sICAgIyA0NQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGNjLCAweDk5LCAweGZmLCAweDAwXSwgICAjIDQ2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4Y2MsIDB4OTksIDB4MDBdLCAgICMgNDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHg2NiwgMHhmZiwgMHgwMF0sICAgIyA0OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDMzLCAweGNjLCAweGNjLCAweDAwXSwgICAjIDQ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4OTksIDB4Y2MsIDB4MDAsIDB4MDBdLCAgICMgNTAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHhmZiwgMHhjYywgMHgwMCwgMHgwMF0sICAgIyA1MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweGZmLCAweDk5LCAweDAwLCAweDAwXSwgICAjIDUyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4ZmYsIDB4NjYsIDB4MDAsIDB4MDBdLCAgICMgNTMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg2NiwgMHg2NiwgMHg5OSwgMHgwMF0sICAgIyA1NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk2LCAweDk2LCAweDk2LCAweDAwXSwgICAjIDU1CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MDAsIDB4MzMsIDB4NjYsIDB4MDBdLCAgICMgNTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHg5OSwgMHg2NiwgMHgwMF0sICAgIyA1NworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDAwLCAweDMzLCAweDAwLCAweDAwXSwgICAjIDU4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MzMsIDB4MzMsIDB4MDAsIDB4MDBdLCAgICMgNTkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHg5OSwgMHgzMywgMHgwMCwgMHgwMF0sICAgIyA2MAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsweDk5LCAweDMzLCAweDY2LCAweDAwXSwgICAjIDYxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzB4MzMsIDB4MzMsIDB4OTksIDB4MDBdLCAgICMgNjIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMHgzMywgMHgzMywgMHgzMywgMHgwMF0sICAgIyA2MworICAgICAgICAgICAgICAgICAgICAgICAgXTsKKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3RlbXBkaXIoKQorIworIyBDaGFuZ2UgdGhlIGRlZmF1bHQgdGVtcCBkaXJlY3RvcnkgdXNlZCBieSBfaW5pdGlhbGl6ZSgpIGluIFdvcmtzaGVldC5wbS4KKyMKK3N1YiBzZXRfdGVtcGRpciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBXaW5kb3dzIHdvcmthcm91bmQuIFNlZSBXb3Jrc2hlZXQ6Ol9pbml0aWFsaXplKCkKKyAgICBteSAkZGlyICA9IHNoaWZ0IHx8ICcnOworCisgICAgY3JvYWsgIiRkaXIgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiAgICAgICBpZiAkZGlyIG5lICcnIGFuZCBub3QgLWQgJGRpcjsKKyAgICBjcm9hayAic2V0X3RlbXBkaXIgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFkZF93b3Jrc2hlZXQiIGlmICRzZWxmLT5zaGVldHMoKTsKKworICAgICRzZWxmLT57X3RlbXBkaXJ9ID0gJGRpciA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY29kZXBhZ2UoKQorIworIyBTZWUgYWxzbyB0aGUgX3N0b3JlX2NvZGVwYWdlIG1ldGhvZC4gVGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjb2RlIHBhZ2UsIGkuZS4KKyMgdGhlIGNoYXJhY3RlciBzZXQgdXNlZCBpbiB0aGUgd29ya2Jvb2suCisjCitzdWIgc2V0X2NvZGVwYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvZGVwYWdlICAgID0gJF9bMF0gfHwgMTsKKyAgICAgICAkY29kZXBhZ2UgICAgPSAweDA0RTQgaWYgJGNvZGVwYWdlID09IDE7CisgICAgICAgJGNvZGVwYWdlICAgID0gMHg4MDAwIGlmICRjb2RlcGFnZSA9PSAyOworCisgICAgJHNlbGYtPntfY29kZXBhZ2V9ID0gJGNvZGVwYWdlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NvdW50cnkoKQorIworIyBTZWUgYWxzbyB0aGUgX3N0b3JlX2NvdW50cnkgbWV0aG9kLiBUaGlzIGlzIHVzZWQgdG8gc3RvcmUgdGhlIGNvdW50cnkgY29kZS4KKyMgU29tZSBub24tZW5nbGlzaCB2ZXJzaW9ucyBvZiBFeGNlbCBtYXkgbmVlZCB0aGlzIHNldCB0byBzb21lIHZhbHVlIG90aGVyCisjIHRoYW4gMSA9ICJVbml0ZWQgU3RhdGVzIi4gSW4gZ2VuZXJhbCB0aGUgY291bnRyeSBjb2RlIGlzIGVxdWFsIHRvIHRoZQorIyBpbnRlcm5hdGlvbmFsIGRpYWxsaW5nIGNvZGUuCisjCitzdWIgc2V0X2NvdW50cnkgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfY291bnRyeX0gICA9ICRfWzBdIHx8IDE7Cit9CisKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZGVmaW5lX25hbWUoKQorIworIyBUT0RPLgorIworc3ViIGRlZmluZV9uYW1lIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRuYW1lICAgICAgICA9IHNoaWZ0OworICAgIG15ICRmb3JtdWxhICAgICA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyAgICA9IHNoaWZ0IHx8IDA7CisgICAgbXkgJHNoZWV0X2luZGV4ID0gMDsKKyAgICBteSBAdG9rZW5zOworCisgICAgbXkgJGZ1bGxfbmFtZSAgID0gJG5hbWU7CisKKyAgICBpZiAoJG5hbWUgPX4gL14oLiopISguKikkLykgeworICAgICAgICBteSAkc2hlZXRuYW1lICAgPSAkMTsKKyAgICAgICAgJG5hbWUgICAgICAgICAgID0gJDI7CisgICAgICAgICRzaGVldF9pbmRleCAgICA9IDEgKyAkc2VsZi0+e19wYXJzZXJ9LT5fZ2V0X3NoZWV0X2luZGV4KCRzaGVldG5hbWUpOworICAgIH0KKworCisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyICA9ICRzZWxmLT57X3BhcnNlcn07CisKKyAgICAjIEluIG9yZGVyIHRvIHJhaXNlIGZvcm11bGEgZXJyb3JzIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGNhbGxpbmcKKyAgICAjIHByb2dyYW0gd2UgdXNlIGFuIGV2YWwgYmxvY2sgYW5kIHJlLXJhaXNlIHRoZSBlcnJvciBmcm9tIGhlcmUuCisgICAgIworICAgIGV2YWwgeyBAdG9rZW5zID0gJHBhcnNlci0+cGFyc2VfZm9ybXVsYSgkZm9ybXVsYSkgfTsKKworICAgIGlmICgkQCkgeworICAgICAgICAkQCA9fiBzL1xuJC8vOyAgIyBTdHJpcCB0aGUgXG4gdXNlZCBpbiB0aGUgRm9ybXVsYS5wbSBkaWUoKQorICAgICAgICBjcm9hayAkQDsgICAgICAgIyBSZS1yYWlzZSB0aGUgZXJyb3IKKyAgICB9CisKKyAgICAjIEZvcmNlIDJkIHJhbmdlcyB0byBiZSBhIHJlZmVyZW5jZSBjbGFzcy4KKyAgICBzL19yZWYzZC9fcmVmM2RSLyAgICAgZm9yIEB0b2tlbnM7CisgICAgcy9fcmFuZ2UzZC9fcmFuZ2UzZFIvIGZvciBAdG9rZW5zOworCisKKyAgICAjIFBhcnNlIHRoZSB0b2tlbnMgaW50byBhIGZvcm11bGEgc3RyaW5nLgorICAgICRmb3JtdWxhID0gJHBhcnNlci0+cGFyc2VfdG9rZW5zKEB0b2tlbnMpOworCisKKworICAgICRmdWxsX25hbWUgPSBsYyAkZnVsbF9uYW1lOworCisgICAgcHVzaCBAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fSwgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAgID0+ICRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAgICA9PiAkZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWV0X2luZGV4ID0+ICRzaGVldF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybXVsYSAgICAgPT4gJGZvcm11bGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgIG15ICRpbmRleCA9IHNjYWxhciBAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fTsKKworICAgICRwYXJzZXItPnNldF9leHRfbmFtZSgkbmFtZSwgJGluZGV4KTsKK30KKworCisKKworCisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3Byb3BlcnRpZXMoKQorIworIyBTZXQgdGhlIGRvY3VtZW50IHByb3BlcnRpZXMgc3VjaCBhcyBUaXRsZSwgQXV0aG9yIGV0Yy4gVGhlc2UgYXJlIHdyaXR0ZW4gdG8KKyMgcHJvcGVydHkgc2V0cyBpbiB0aGUgT0xFIGNvbnRhaW5lci4KKyMKK3N1YiBzZXRfcHJvcGVydGllcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworICAgIG15ICVwYXJhbTsKKworICAgICMgSWdub3JlIGlmIG5vIGFyZ3Mgd2VyZSBwYXNzZWQuCisgICAgcmV0dXJuIC0xIHVubGVzcyBAXzsKKworCisgICAgIyBBbGxvdyB0aGUgcGFyYW1ldGVycyB0byBiZSBwYXNzZWQgYXMgYSBoYXNoIG9yIGhhc2ggcmVmLgorICAgIGlmIChyZWYgJF9bMF0gZXEgJ0hBU0gnKSB7CisgICAgICAgICVwYXJhbSA9ICV7JF9bMF19OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJXBhcmFtID0gQF87CisgICAgfQorCisKKyAgICAjIExpc3Qgb2YgdmFsaWQgaW5wdXQgcGFyYW1ldGVycy4KKyAgICBteSAlcHJvcGVydGllcyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXBhZ2UgICAgICA9PiBbMHgwMDAxLCAnVlRfSTInICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUgICAgICAgICA9PiBbMHgwMDAyLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdCAgICAgICA9PiBbMHgwMDAzLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yICAgICAgICA9PiBbMHgwMDA0LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZHMgICAgICA9PiBbMHgwMDA1LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMgICAgICA9PiBbMHgwMDA2LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9hdXRob3IgICA9PiBbMHgwMDA4LCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCAgICAgICA9PiBbMHgwMDBDLCAnVlRfRklMRVRJTUUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnkgICAgICA9PiBbMHgwMDAyLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciAgICAgICA9PiBbMHgwMDBFLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueSAgICAgICA9PiBbMHgwMDBGLCAnVlRfTFBTVFInICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOCAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIGZvciBteSAkcGFyYW1ldGVyIChrZXlzICVwYXJhbSkgeworICAgICAgICBpZiAobm90IGV4aXN0cyAkcHJvcGVydGllc3skcGFyYW1ldGVyfSkgeworICAgICAgICAgICAgY2FycCAiVW5rbm93biBwYXJhbWV0ZXIgJyRwYXJhbWV0ZXInIGluIHNldF9wcm9wZXJ0aWVzKCkiOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgY3JlYXRpb24gdGltZSB1bmxlc3Mgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAgIGlmICghZXhpc3RzICRwYXJhbXtjcmVhdGVkfSl7CisgICAgICAgICRwYXJhbXtjcmVhdGVkfSA9ICRzZWxmLT57X2xvY2FsdGltZX07CisgICAgfQorCisKKyAgICAjCisgICAgIyBDcmVhdGUgdGhlIFN1bW1hcnlJbmZvcm1hdGlvbiBwcm9wZXJ0eSBzZXQuCisgICAgIworCisgICAgIyBHZXQgdGhlIGNvZGVwYWdlIG9mIHRoZSBzdHJpbmdzIGluIHRoZSBwcm9wZXJ0eSBzZXQuCisgICAgbXkgQHN0cmluZ3MgICAgICA9IHF3KHRpdGxlIHN1YmplY3QgYXV0aG9yIGtleXdvcmRzIGNvbW1lbnRzIGxhc3RfYXV0aG9yKTsKKyAgICAkcGFyYW17Y29kZXBhZ2V9ID0gJHNlbGYtPl9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlKFwlcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcQHN0cmluZ3MpOworCisgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2YgcHJvcGVydHkgc2V0IHZhbHVlcy4KKyAgICBteSBAcHJvcGVydHlfc2V0czsKKworICAgIGZvciBteSAkcHJvcGVydHkgKHF3KGNvZGVwYWdlIHRpdGxlICAgIHN1YmplY3QgICAgIGF1dGhvcgorICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmRzIGNvbW1lbnRzIGxhc3RfYXV0aG9yIGNyZWF0ZWQpKQorICAgIHsKKyAgICAgICAgaWYgKGV4aXN0cyAkcGFyYW17JHByb3BlcnR5fSAmJiBkZWZpbmVkICRwYXJhbXskcHJvcGVydHl9KSB7CisgICAgICAgICAgICBwdXNoIEBwcm9wZXJ0eV9zZXRzLCBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcHJvcGVydGllc3skcHJvcGVydHl9LT5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW17JHByb3BlcnR5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgUGFjayB0aGUgcHJvcGVydHkgc2V0cy4KKyAgICAkc2VsZi0+e3N1bW1hcnl9ID0gY3JlYXRlX3N1bW1hcnlfcHJvcGVydHlfc2V0KFxAcHJvcGVydHlfc2V0cyk7CisKKworICAgICMKKyAgICAjIENyZWF0ZSB0aGUgRG9jU3VtbWFyeUluZm9ybWF0aW9uIHByb3BlcnR5IHNldC4KKyAgICAjCisKKyAgICAjIEdldCB0aGUgY29kZXBhZ2Ugb2YgdGhlIHN0cmluZ3MgaW4gdGhlIHByb3BlcnR5IHNldC4KKyAgICBAc3RyaW5ncyAgICAgICAgID0gcXcoY2F0ZWdvcnkgbWFuYWdlciBjb21wYW55KTsKKyAgICAkcGFyYW17Y29kZXBhZ2V9ID0gJHNlbGYtPl9nZXRfcHJvcGVydHlfc2V0X2NvZGVwYWdlKFwlcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcQHN0cmluZ3MpOworCisgICAgIyBDcmVhdGUgYW4gYXJyYXkgb2YgcHJvcGVydHkgc2V0IHZhbHVlcy4KKyAgICBAcHJvcGVydHlfc2V0cyA9ICgpOworCisgICAgZm9yIG15ICRwcm9wZXJ0eSAocXcoY29kZXBhZ2UgY2F0ZWdvcnkgbWFuYWdlciBjb21wYW55KSkKKyAgICB7CisgICAgICAgIGlmIChleGlzdHMgJHBhcmFteyRwcm9wZXJ0eX0gJiYgZGVmaW5lZCAkcGFyYW17JHByb3BlcnR5fSkgeworICAgICAgICAgICAgcHVzaCBAcHJvcGVydHlfc2V0cywgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BlcnRpZXN7JHByb3BlcnR5fS0+WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHByb3BlcnRpZXN7JHByb3BlcnR5fS0+WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFteyRwcm9wZXJ0eX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIHByb3BlcnR5IHNldHMuCisgICAgJHNlbGYtPntkb2Nfc3VtbWFyeX0gPSBjcmVhdGVfZG9jX3N1bW1hcnlfcHJvcGVydHlfc2V0KFxAcHJvcGVydHlfc2V0cyk7CisKKyAgICAjIFNldCBhIGZsYWcgZm9yIHdoZW4gdGhlIGZpbGVzIGlzIHdyaXR0ZW4uCisgICAgJHNlbGYtPntfYWRkX2RvY19wcm9wZXJ0aWVzfSA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZ2V0X3Byb3BlcnR5X3NldF9jb2RlcGFnZSgpCisjCisjIEdldCB0aGUgY2hhcmFjdGVyIGNvZGVwYWdlIHVzZWQgYnkgdGhlIHN0cmluZ3MgaW4gYSBwcm9wZXJ0eSBzZXQuIElmIG9uZSBvZgorIyB0aGUgc3RyaW5ncyB1c2VkIGlzIHV0ZjggdGhlbiB0aGUgY29kZXBhZ2UgaXMgbWFya2VkIGFzIHV0ZjguIE90aGVyd2lzZQorIyBMYXRpbiAxIGlzIHVzZWQgKGFsdGhvdWdoIGluIG91ciBjYXNlIHRoaXMgaXMgbGltaXRlZCB0byA3Yml0IEFTQ0lJKS4KKyMKK3N1YiBfZ2V0X3Byb3BlcnR5X3NldF9jb2RlcGFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRwYXJhbXMgICAgICA9ICRfWzBdOworICAgIG15ICRzdHJpbmdzICAgICA9ICRfWzFdOworCisgICAgIyBBbGxvdyBmb3IgbWFudWFsbHkgbWFya2VkIHV0Zjggc3RyaW5ncy4KKyAgICByZXR1cm4gMHhGREU5IGlmIGRlZmluZWQgJHBhcmFtcy0+e3V0Zjh9OworCisgICAgIyBDaGVjayBmb3IgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKyAgICAgICAgZm9yIG15ICRzdHJpbmcgKEB7JHN0cmluZ3MgfSkgeworICAgICAgICAgICAgbmV4dCB1bmxlc3MgZXhpc3RzICRwYXJhbXMtPnskc3RyaW5nfTsKKyAgICAgICAgICAgIHJldHVybiAweEZERTkgaWYgRW5jb2RlOjppc191dGY4KCRwYXJhbXMtPnskc3RyaW5nfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMHgwNEU0OyAjIERlZmF1bHQgY29kZXBhZ2UsIExhdGluIDEuCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd29ya2Jvb2soKQorIworIyBBc3NlbWJsZSB3b3Jrc2hlZXRzIGludG8gYSB3b3JrYm9vayBhbmQgc2VuZCB0aGUgQklGRiBkYXRhIHRvIGFuIE9MRQorIyBzdG9yYWdlLgorIworc3ViIF9zdG9yZV93b3JrYm9vayB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBBZGQgYSBkZWZhdWx0IHdvcmtzaGVldCBpZiBub24gaGF2ZSBiZWVuIGFkZGVkLgorICAgICRzZWxmLT5hZGRfd29ya3NoZWV0KCkgaWYgbm90IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworCisgICAgIyBDYWxjdWxhdGUgc2l6ZSByZXF1aXJlZCBmb3IgTVNPIHJlY29yZHMgYW5kIHVwZGF0ZSB3b3Jrc2hlZXRzLgorICAgICRzZWxmLT5fY2FsY19tc29fc2l6ZXMoKTsKKworICAgICMgRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIHdvcmtzaGVldCBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgICBpZiAoJHNlbGYtPntfYWN0aXZlc2hlZXR9ID09IDApIHsKKyAgICAgICAgQHskc2VsZi0+e193b3Jrc2hlZXRzfX1bMF0tPntfc2VsZWN0ZWR9ID0gMTsKKyAgICAgICAgQHskc2VsZi0+e193b3Jrc2hlZXRzfX1bMF0tPntfaGlkZGVufSAgID0gMDsKKyAgICB9CisKKyAgICAjIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNlbGVjdGVkIHNoZWV0IHRhYnMgYW5kIHNldCB0aGUgYWN0aXZlIHNoZWV0LgorICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICAkc2VsZi0+e19zZWxlY3RlZH0rKyBpZiAkc2hlZXQtPntfc2VsZWN0ZWR9OworICAgICAgICAkc2hlZXQtPntfYWN0aXZlfSA9IDEgaWYgJHNoZWV0LT57X2luZGV4fSA9PSAkc2VsZi0+e19hY3RpdmVzaGVldH07CisgICAgfQorCisgICAgIyBBZGQgV29ya2Jvb2sgZ2xvYmFscworICAgICRzZWxmLT5fc3RvcmVfYm9mKDB4MDAwNSk7CisgICAgJHNlbGYtPl9zdG9yZV9jb2RlcGFnZSgpOworICAgICRzZWxmLT5fc3RvcmVfd2luZG93MSgpOworICAgICRzZWxmLT5fc3RvcmVfaGlkZW9iaigpOworICAgICRzZWxmLT5fc3RvcmVfMTkwNCgpOworICAgICRzZWxmLT5fc3RvcmVfYWxsX2ZvbnRzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9hbGxfbnVtX2Zvcm1hdHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FsbF94ZnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2FsbF9zdHlsZXMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BhbGV0dGUoKTsKKworICAgICMgQ2FsY3VsYXRlIHRoZSBvZmZzZXRzIHJlcXVpcmVkIGJ5IHRoZSBCT1VORFNIRUVUIHJlY29yZHMKKyAgICAkc2VsZi0+X2NhbGNfc2hlZXRfb2Zmc2V0cygpOworCisgICAgIyBBZGQgQk9VTkRTSEVFVCByZWNvcmRzLgorICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICAkc2VsZi0+X3N0b3JlX2JvdW5kc2hlZXQoJHNoZWV0LT57X25hbWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0LT57X29mZnNldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQtPntfc2hlZXRfdHlwZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2hlZXQtPntfaGlkZGVufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGVldC0+e19lbmNvZGluZ30pOworICAgIH0KKworICAgICMgTk9URTogSWYgYW55IHJlY29yZHMgYXJlIGFkZGVkIGJldHdlZW4gaGVyZSBhbmQgRU9GIHRoZQorICAgICMgX2NhbGNfc2hlZXRfb2Zmc2V0cygpIHNob3VsZCBiZSB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIG5ldyBsZW5ndGguCisgICAgJHNlbGYtPl9zdG9yZV9jb3VudHJ5KCk7CisgICAgaWYgKCRzZWxmLT57X2V4dF9yZWZfY291bnR9KSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfc3VwYm9vaygpOworICAgICAgICAkc2VsZi0+X3N0b3JlX2V4dGVybnNoZWV0KCk7CisgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZXMoKTsKKyAgICB9CisgICAgJHNlbGYtPl9hZGRfbXNvX2RyYXdpbmdfZ3JvdXAoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3NoYXJlZF9zdHJpbmdzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9leHRzc3QoKTsKKworICAgICMgRW5kIFdvcmtib29rIGdsb2JhbHMKKyAgICAkc2VsZi0+X3N0b3JlX2VvZigpOworCisgICAgIyBTdG9yZSB0aGUgd29ya2Jvb2sgaW4gYW4gT0xFIGNvbnRhaW5lcgorICAgIHJldHVybiAkc2VsZi0+X3N0b3JlX09MRV9maWxlKCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfT0xFX2ZpbGUoKQorIworIyBTdG9yZSB0aGUgd29ya2Jvb2sgaW4gYW4gT0xFIGNvbnRhaW5lciB1c2luZyB0aGUgZGVmYXVsdCBoYW5kbGVyIG9yIHVzaW5nCisjIE9MRTo6U3RvcmFnZV9MaXRlIGlmIHRoZSB3b3JrYm9vayBkYXRhIGlzID4gfiA3TUIuCisjCitzdWIgX3N0b3JlX09MRV9maWxlIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJG1heHNpemUgPSA3XzA4N18xMDQ7CisKKyAgICBpZiAoISRzZWxmLT57X2FkZF9kb2NfcHJvcGVydGllc30gJiYgJHNlbGYtPntfYmlmZnNpemV9IDw9ICRtYXhzaXplKSB7CisgICAgICAgICMgV3JpdGUgdGhlIE9MRSBmaWxlIHVzaW5nIE9MRXdyaXRlciBpZiBkYXRhIDw9IDdNQgorICAgICAgICBteSAkT0xFICA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpPTEV3cml0ZXItPm5ldygkc2VsZi0+e19maF9vdXR9KTsKKworICAgICAgICAjIFdyaXRlIHRoZSBCSUZGIGRhdGEgd2l0aG91dCB0aGUgT0xFIGNvbnRhaW5lciBmb3IgdGVzdGluZy4KKyAgICAgICAgJE9MRS0+e19iaWZmX29ubHl9ID0gJHNlbGYtPntfYmlmZl9vbmx5fTsKKworICAgICAgICAjIEluZGljYXRlIHRoYXQgd2UgY3JlYXRlZCB0aGUgZmlsZWhhbmRsZSBhbmQgd2FudCB0byBjbG9zZSBpdC4KKyAgICAgICAgJE9MRS0+e19pbnRlcm5hbF9maH0gPSAkc2VsZi0+e19pbnRlcm5hbF9maH07CisKKyAgICAgICAgJE9MRS0+c2V0X3NpemUoJHNlbGYtPntfYmlmZnNpemV9KTsKKyAgICAgICAgJE9MRS0+d3JpdGVfaGVhZGVyKCk7CisKKyAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkc2VsZi0+Z2V0X2RhdGEoKSkgeworICAgICAgICAgICAgJE9MRS0+d3JpdGUoJHRtcCk7CisgICAgICAgIH0KKworICAgICAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICAgICB3aGlsZSAobXkgJHRtcCA9ICR3b3Jrc2hlZXQtPmdldF9kYXRhKCkpIHsKKyAgICAgICAgICAgICAgICAkT0xFLT53cml0ZSgkdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAkT0xFLT5jbG9zZSgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBXcml0ZSB0aGUgT0xFIGZpbGUgdXNpbmcgT0xFOjpTdG9yYWdlX0xpdGUgaWYgZGF0YSA+IDdNQgorICAgICAgICBldmFsIHsgcmVxdWlyZSBPTEU6OlN0b3JhZ2VfTGl0ZSB9OworCisgICAgICAgIGlmIChub3QgJEApIHsKKworICAgICAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgbG9jYWwgJFwgPSB1bmRlZjsKKworICAgICAgICAgICAgbXkgQHN0cmVhbXM7CisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBXb3JrYm9vayBzdHJlYW0uCisgICAgICAgICAgICBteSAkc3RyZWFtICAgPSBwYWNrICd2KicsIHVucGFjayAnQyonLCAnV29ya2Jvb2snOworICAgICAgICAgICAgbXkgJHdvcmtib29rID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6RmlsZS0+bmV3RmlsZSgkc3RyZWFtKTsKKworICAgICAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkc2VsZi0+Z2V0X2RhdGEoKSkgeworICAgICAgICAgICAgICAgICR3b3JrYm9vay0+YXBwZW5kKCR0bXApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKG15ICR0bXAgPSAkd29ya3NoZWV0LT5nZXRfZGF0YSgpKSB7CisgICAgICAgICAgICAgICAgICAgICR3b3JrYm9vay0+YXBwZW5kKCR0bXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVzaCBAc3RyZWFtcywgJHdvcmtib29rOworCisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBwcm9wZXJ0aWVzIHN0cmVhbXMsIGlmIGFueS4KKyAgICAgICAgICAgIGlmICgkc2VsZi0+e19hZGRfZG9jX3Byb3BlcnRpZXN9KSB7CisgICAgICAgICAgICAgICAgbXkgJHN0cmVhbTsKKyAgICAgICAgICAgICAgICBteSAkc3VtbWFyeTsKKworICAgICAgICAgICAgICAgICRzdHJlYW0gID0gcGFjayAndionLCB1bnBhY2sgJ0MqJywgIlw1U3VtbWFyeUluZm9ybWF0aW9uIjsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9ICRzZWxmLT57c3VtbWFyeX07CisgICAgICAgICAgICAgICAgJHN1bW1hcnkgPSBPTEU6OlN0b3JhZ2VfTGl0ZTo6UFBTOjpGaWxlLT5uZXcoJHN0cmVhbSwgJHN1bW1hcnkpOworICAgICAgICAgICAgICAgIHB1c2ggQHN0cmVhbXMsICRzdW1tYXJ5OworCisgICAgICAgICAgICAgICAgJHN0cmVhbSAgPSBwYWNrICd2KicsIHVucGFjayAnQyonLCAiXDVEb2N1bWVudFN1bW1hcnlJbmZvcm1hdGlvbiI7CisgICAgICAgICAgICAgICAgJHN1bW1hcnkgPSAkc2VsZi0+e2RvY19zdW1tYXJ5fTsKKyAgICAgICAgICAgICAgICAkc3VtbWFyeSA9IE9MRTo6U3RvcmFnZV9MaXRlOjpQUFM6OkZpbGUtPm5ldygkc3RyZWFtLCAkc3VtbWFyeSk7CisgICAgICAgICAgICAgICAgcHVzaCBAc3RyZWFtcywgJHN1bW1hcnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgQ3JlYXRlIHRoZSBPTEUgcm9vdCBkb2N1bWVudCBhbmQgYWRkIHRoZSBzdWJzdHJlYW1zLgorICAgICAgICAgICAgbXkgQGxvY2FsdGltZSA9IEB7ICRzZWxmLT57X2xvY2FsdGltZX0gfTsKKyAgICAgICAgICAgIHNwbGljZShAbG9jYWx0aW1lLCA2KTsKKworICAgICAgICAgICAgbXkgJG9sZV9yb290ID0gT0xFOjpTdG9yYWdlX0xpdGU6OlBQUzo6Um9vdC0+bmV3KFxAbG9jYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAbG9jYWx0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxAc3RyZWFtcyk7CisgICAgICAgICAgICAkb2xlX3Jvb3QtPnNhdmUoJHNlbGYtPntfZmlsZW5hbWV9KTsKKworCisgICAgICAgICAgICAjIENsb3NlIHRoZSBmaWxlaGFuZGxlIGlmIGl0IHdhcyBjcmVhdGVkIGludGVybmFsbHkuCisgICAgICAgICAgICByZXR1cm4gQ09SRTo6Y2xvc2UoJHNlbGYtPntfZmhfb3V0fSkgaWYgJHNlbGYtPntfaW50ZXJuYWxfZmh9OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBGaWxlIGluIGdyZWF0ZXIgdGhhbiBsaW1pdCwgc2V0ICQhIHRvICJGaWxlIHRvbyBsYXJnZSIKKyAgICAgICAgICAgICQhID0gMjc7ICMgUGVybCBlcnJvciBjb2RlICJGaWxlIHRvbyBsYXJnZSIKKworICAgICAgICAgICAgY3JvYWsgIk1heGltdW0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwgZmlsZXNpemUsICRtYXhzaXplIGJ5dGVzLCAiLgorICAgICAgICAgICAgICAgICAgImV4Y2VlZGVkLiBUbyBjcmVhdGUgZmlsZXMgYmlnZ2VyIHRoYW4gdGhpcyBsaW1pdCBwbGVhc2UgIiAgLgorICAgICAgICAgICAgICAgICAgImluc3RhbGwgT0xFOjpTdG9yYWdlX0xpdGVcbiI7CisKKyAgICAgICAgICAgICMgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY19zaGVldF9vZmZzZXRzKCkKKyMKKyMgQ2FsY3VsYXRlIFdvcmtzaGVldCBCT0Ygb2Zmc2V0cyByZWNvcmRzIGZvciB1c2UgaW4gdGhlIEJPVU5EU0hFRVQgcmVjb3Jkcy4KKyMKK3N1YiBfY2FsY19zaGVldF9vZmZzZXRzIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJEJPRiAgICAgPSAxMjsKKyAgICBteSAkRU9GICAgICA9IDQ7CisgICAgbXkgJG9mZnNldCAgPSAkc2VsZi0+e19kYXRhc2l6ZX07CisKKyAgICAjIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBDT1VOVFJZIHJlY29yZAorICAgICRvZmZzZXQgKz0gODsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIFNTVCBhbmQgYXNzb2NpYXRlZCBDT05USU5VRXMKKyAgICAkb2Zmc2V0ICs9ICRzZWxmLT5fY2FsY3VsYXRlX3NoYXJlZF9zdHJpbmdfc2l6ZXMoKTsKKworICAgICMgQWRkIHRoZSBsZW5ndGggb2YgdGhlIEVYVFNTVCByZWNvcmQuCisgICAgJG9mZnNldCArPSAkc2VsZi0+X2NhbGN1bGF0ZV9leHRzc3Rfc2l6ZSgpOworCisgICAgIyBBZGQgdGhlIGxlbmd0aCBvZiB0aGUgU1VQQk9PSywgRVhURVJOU0hFRVQgYW5kIE5BTUUgcmVjb3JkcworICAgICRvZmZzZXQgKz0gJHNlbGYtPl9jYWxjdWxhdGVfZXh0ZXJuX3NpemVzKCk7CisKKyAgICAjIEFkZCB0aGUgbGVuZ3RoIG9mIHRoZSBNU09EUkFXSU5HR1JPVVAgcmVjb3JkcyBpbmNsdWRpbmcgYW4gZXh0cmEgNCBieXRlcworICAgICMgZm9yIGFueSBDT05USU5VRSBoZWFkZXJzLiBTZWUgX2FkZF9tc29fZHJhd2luZ19ncm91cF9jb250aW51ZSgpLgorICAgIG15ICRtc29fc2l6ZSA9ICRzZWxmLT57X21zb19zaXplfTsKKyAgICAkbXNvX3NpemUgKz0gNCAqIGludCgoJG1zb19zaXplIC0xKSAvICRzZWxmLT57X2xpbWl0fSk7CisgICAgJG9mZnNldCAgICs9ICRtc29fc2l6ZSA7CisKKyAgICBmb3JlYWNoIG15ICRzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKyAgICAgICAgJG9mZnNldCArPSAkQk9GICsgbGVuZ3RoKCRzaGVldC0+e19uYW1lfSk7CisgICAgfQorCisgICAgJG9mZnNldCArPSAkRU9GOworCisgICAgZm9yZWFjaCBteSAkc2hlZXQgKEB7JHNlbGYtPntfd29ya3NoZWV0c319KSB7CisgICAgICAgICRzaGVldC0+e19vZmZzZXR9ID0gJG9mZnNldDsKKyAgICAgICAgJHNoZWV0LT5fY2xvc2UoKTsKKyAgICAgICAgJG9mZnNldCArPSAkc2hlZXQtPntfZGF0YXNpemV9OworICAgIH0KKworICAgICRzZWxmLT57X2JpZmZzaXplfSA9ICRvZmZzZXQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY19tc29fc2l6ZXMoKQorIworIyBDYWxjdWxhdGUgdGhlIE1TT0RSQVdJTkdHUk9VUCBzaXplcyBhbmQgdGhlIGluZGV4ZXMgb2YgdGhlIFdvcmtzaGVldAorIyBNU09EUkFXSU5HIHJlY29yZHMuCisjCisjIEluIHRoZSBmb2xsb3dpbmcgU1BJRCBpcyBzaGFwZSBpZCwgYWNjb3JkaW5nIHRvIEVzY2hlciBub21lbmNsYXR1cmUuCisjCitzdWIgX2NhbGNfbXNvX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRtc29fc2l6ZSAgICAgICAgPSAwOyAgICAjIFNpemUgb2YgdGhlIE1TT0RSQVdJTkdHUk9VUCByZWNvcmQKKyAgICBteSAkc3RhcnRfc3BpZCAgICAgID0gMTAyNDsgIyBJbml0aWFsIHNwaWQgZm9yIGVhY2ggc2hlZXQKKyAgICBteSAkbWF4X3NwaWQgICAgICAgID0gMTAyNDsgIyBzcGlkTWF4CisgICAgbXkgJG51bV9jbHVzdGVycyAgICA9IDE7ICAgICMgY2lkY2wKKyAgICBteSAkc2hhcGVzX3NhdmVkICAgID0gMDsgICAgIyBjc3BTYXZlZAorICAgIG15ICRkcmF3aW5nc19zYXZlZCAgPSAwOyAgICAjIGNkZ1NhdmVkCisgICAgbXkgQGNsdXN0ZXJzICAgICAgICA9ICgpOworCisKKyAgICAkc2VsZi0+X3Byb2Nlc3NfaW1hZ2VzKCk7CisKKyAgICAjIEFkZCBCc3RvcmUgY29udGFpbmVyIHNpemUgaWYgdGhlcmUgYXJlIGltYWdlcy4KKyAgICAkbXNvX3NpemUgKz0gOCBpZiBAeyRzZWxmLT57X2ltYWdlc19kYXRhfX07CisKKworICAgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSB3b3Jrc2hlZXRzLCBjYWxjdWxhdGUgdGhlIE1TT0RSQVdJTkdHUk9VUCBwYXJhbWV0ZXJzCisgICAgIyBhbmQgc3BhY2UgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIHJlY29yZCBhbmQgdGhlIE1TT0RSQVdJTkcgcGFyYW1ldGVycworICAgICMgcmVxdWlyZWQgYnkgZWFjaCB3b3Jrc2hlZXQuCisgICAgIworICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBuZXh0IHVubGVzcyAkc2hlZXQtPntfc2hlZXRfdHlwZX0gPT0gMHgwMDAwOyAjIElnbm9yZSBjaGFydHMuCisKKyAgICAgICAgbXkgJG51bV9pbWFnZXMgICAgID0gJHNoZWV0LT57X251bV9pbWFnZXN9IHx8IDA7CisgICAgICAgIG15ICRpbWFnZV9tc29fc2l6ZSA9ICRzaGVldC0+e19pbWFnZV9tc29fc2l6ZX0gfHwgMDsKKyAgICAgICAgbXkgJG51bV9jb21tZW50cyAgID0gJHNoZWV0LT5fcHJlcGFyZV9jb21tZW50cygpOworICAgICAgICBteSAkbnVtX2NoYXJ0cyAgICAgPSAkc2hlZXQtPl9wcmVwYXJlX2NoYXJ0cygpOworICAgICAgICBteSAkbnVtX2ZpbHRlcnMgICAgPSAkc2hlZXQtPntfZmlsdGVyX2NvdW50fTsKKworICAgICAgICBuZXh0IHVubGVzcyAkbnVtX2ltYWdlcyArICRudW1fY29tbWVudHMgKyAkbnVtX2NoYXJ0cyArJG51bV9maWx0ZXJzOworCisKKyAgICAgICAgIyBJbmNsdWRlIDEgcGFyZW50IE1TT0RSQVdJTkcgc2hhcGUsIHBlciBzaGVldCwgaW4gdGhlIHNoYXBlIGNvdW50LgorICAgICAgICBteSAkbnVtX3NoYXBlcyAgICs9IDEgKyAkbnVtX2ltYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAkbnVtX2NvbW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICRudW1fY2hhcnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICRudW1fZmlsdGVyczsKKyAgICAgICAgICAgJHNoYXBlc19zYXZlZCArPSAkbnVtX3NoYXBlczsKKyAgICAgICAgICAgJG1zb19zaXplICAgICArPSAkaW1hZ2VfbXNvX3NpemU7CisKKworICAgICAgICAjIEFkZCBhIGRyYXdpbmcgb2JqZWN0IGZvciBlYWNoIHNoZWV0IHdpdGggY29tbWVudHMuCisgICAgICAgICRkcmF3aW5nc19zYXZlZCsrOworCisKKyAgICAgICAgIyBGb3IgZWFjaCBzaGVldCBzdGFydCB0aGUgc3BpZHMgYXQgdGhlIG5leHQgMTAyNCBpbnRlcnZhbC4KKyAgICAgICAgJG1heF9zcGlkICAgPSAxMDI0ICogKDEgKyBpbnQoKCRtYXhfc3BpZCAtMSkvMTAyNCkpOworICAgICAgICAkc3RhcnRfc3BpZCA9ICRtYXhfc3BpZDsKKworCisgICAgICAgICMgTWF4IHNwaWQgZm9yIGVhY2ggc2hlZXQgYW5kIGV2ZW50dWFsbHkgZm9yIHRoZSB3b3JrYm9vay4KKyAgICAgICAgJG1heF9zcGlkICArPSAkbnVtX3NoYXBlczsKKworCisgICAgICAgICMgU3RvcmUgdGhlIGNsdXN0ZXIgaWRzCisgICAgICAgIGZvciAobXkgJGkgPSAkbnVtX3NoYXBlczsgJGkgPiAwOyAkaSAtPSAxMDI0KSB7CisgICAgICAgICAgICAkbnVtX2NsdXN0ZXJzICArPSAxOworICAgICAgICAgICAgJG1zb19zaXplICAgICAgKz0gODsKKyAgICAgICAgICAgIG15ICRzaXplICAgICAgICA9ICRpID4gMTAyNCA/IDEwMjQgOiAkaTsKKworICAgICAgICAgICAgcHVzaCBAY2x1c3RlcnMsIFskZHJhd2luZ3Nfc2F2ZWQsICRzaXplXTsKKyAgICAgICAgfQorCisKKyAgICAgICAgIyBQYXNzIGNhbGN1bGF0ZWQgdmFsdWVzIGJhY2sgdG8gdGhlIHdvcmtzaGVldAorICAgICAgICAkc2hlZXQtPntfb2JqZWN0X2lkc30gPSBbJHN0YXJ0X3NwaWQsICRkcmF3aW5nc19zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbnVtX3NoYXBlcywgJG1heF9zcGlkIC0xXTsKKyAgICB9CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBNU09EUkFXSU5HR1JPVVAgc2l6ZSBpZiB3ZSBoYXZlIHN0b3JlZCBzb21lIHNoYXBlcy4KKyAgICAkbXNvX3NpemUgICAgICAgICAgICAgICs9IDg2IGlmICRtc29fc2l6ZTsgIyBTbWFsbGVzdCBzaXplIGlzIDg2Kzg9OTQKKworCisgICAgJHNlbGYtPntfbXNvX3NpemV9ICAgICAgPSAkbXNvX3NpemU7CisgICAgJHNlbGYtPntfbXNvX2NsdXN0ZXJzfSAgPSBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhfc3BpZCwgJG51bV9jbHVzdGVycywgJHNoYXBlc19zYXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGRyYXdpbmdzX3NhdmVkLCBbQGNsdXN0ZXJzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3Byb2Nlc3NfaW1hZ2VzKCkKKyMKKyMgV2UgbmVlZCB0byBwcm9jZXNzIGVhY2ggaW1hZ2UgaW4gZWFjaCB3b3Jrc2hlZXQgYW5kIGV4dHJhY3QgaW5mb3JtYXRpb24uCisjIFNvbWUgb2YgdGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHVzZWQgaW4gdGhlIFdvcmtib29rIGFuZCBzb21lIGlzCisjIHBhc3NlZCBiYWNrIGludG8gZWFjaCBXb3Jrc2hlZXQuIFRoZSBvdmVyYWxsIHNpemUgZm9yIHRoZSBpbWFnZSByZWxhdGVkCisjIEJJRkYgc3RydWN0dXJlcyBpbiB0aGUgV29ya2Jvb2sgaXMgY2FsY3VsYXRlZCBoZXJlLgorIworIyBNU08gc2l6ZSA9ICA4IGJ5dGVzIGZvciBic3RvcmVfY29udGFpbmVyICsKKyMgICAgICAgICAgICA0NCBieXRlcyBmb3IgYmxpcF9zdG9yZV9lbnRyeSArCisjICAgICAgICAgICAgMjUgYnl0ZXMgZm9yIGJsaXAKKyMgICAgICAgICAgPSA3NyArIGltYWdlIHNpemUuCisjCitzdWIgX3Byb2Nlc3NfaW1hZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAlaW1hZ2VzX3NlZW47CisgICAgbXkgQGltYWdlX2RhdGE7CisgICAgbXkgQHByZXZpb3VzX2ltYWdlczsKKyAgICBteSAkaW1hZ2VfaWQgICAgPSAxOworICAgIG15ICRpbWFnZXNfc2l6ZSA9IDA7CisKKworICAgIGZvcmVhY2ggbXkgJHNoZWV0IChAeyRzZWxmLT57X3dvcmtzaGVldHN9fSkgeworICAgICAgICBuZXh0IHVubGVzcyAkc2hlZXQtPntfc2hlZXRfdHlwZX0gPT0gMHgwMDAwOyAjIElnbm9yZSBjaGFydHMuCisgICAgICAgIG5leHQgdW5sZXNzICRzaGVldC0+X3ByZXBhcmVfaW1hZ2VzKCk7CisKKyAgICAgICAgbXkgJG51bV9pbWFnZXMgICAgICA9IDA7CisgICAgICAgIG15ICRpbWFnZV9tc29fc2l6ZSAgPSAwOworCisKKyAgICAgICAgZm9yIG15ICRpbWFnZV9yZWYgKEB7JHNoZWV0LT57X2ltYWdlc19hcnJheX19KSB7CisgICAgICAgICAgICBteSAkZmlsZW5hbWUgPSAkaW1hZ2VfcmVmLT5bMl07CisgICAgICAgICAgICAkbnVtX2ltYWdlcysrOworCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIEZvciBlYWNoIFdvcmtzaGVldCBpbWFnZSB3ZSBnZXQgYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzCisgICAgICAgICAgICAjIFsKKyAgICAgICAgICAgICMgICAkcm93LAorICAgICAgICAgICAgIyAgICRjb2wsCisgICAgICAgICAgICAjICAgJG5hbWUsCisgICAgICAgICAgICAjICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgIyAgICR5X29mZnNldCwKKyAgICAgICAgICAgICMgICAkc2NhbGVfeCwKKyAgICAgICAgICAgICMgICAkc2NhbGVfeSwKKyAgICAgICAgICAgICMgXQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBBbmQgd2UgYWRkIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICAgJGltYWdlX2lkLAorICAgICAgICAgICAgIyAgICR0eXBlLAorICAgICAgICAgICAgIyAgICR3aWR0aCwKKyAgICAgICAgICAgICMgICAkaGVpZ2h0OworCisgICAgICAgICAgICBpZiAobm90IGV4aXN0cyAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSkgeworICAgICAgICAgICAgICAgICMgVE9ETyBzaG91bGQgYWxzbyBtYXRjaCBzZWVuIGltYWdlcyBiYXNlZCBvbiBjaGVja3N1bS4KKworICAgICAgICAgICAgICAgICMgT3BlbiB0aGUgaW1hZ2UgZmlsZSBhbmQgaW1wb3J0IHRoZSBkYXRhLgorICAgICAgICAgICAgICAgIG15ICRmaCA9IEZpbGVIYW5kbGUtPm5ldygkZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGNyb2FrICJDb3VsZG4ndCBpbXBvcnQgJGZpbGVuYW1lOiAkISIgdW5sZXNzIGRlZmluZWQgJGZoOworICAgICAgICAgICAgICAgIGJpbm1vZGUgJGZoOworCisgICAgICAgICAgICAgICAgIyBTbHVycCB0aGUgZmlsZSBpbnRvIGEgc3RyaW5nIGFuZCBkbyBzb21lIHNpemUgY2FsY3MuCisgICAgICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gZG8ge2xvY2FsICQvOyA8JGZoPn07CisgICAgICAgICAgICAgICAgbXkgJHNpemUgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgICAgIG15ICRjaGVja3N1bTEgICA9ICRzZWxmLT5faW1hZ2VfY2hlY2tzdW0oJGRhdGEsICRpbWFnZV9pZCk7CisgICAgICAgICAgICAgICAgbXkgJGNoZWNrc3VtMiAgID0gJGNoZWNrc3VtMTsKKyAgICAgICAgICAgICAgICBteSAkcmVmX2NvdW50ICAgPSAxOworCisKKyAgICAgICAgICAgICAgICAjIFByb2Nlc3MgdGhlIGltYWdlIGFuZCBleHRyYWN0IGRpbWVuc2lvbnMuCisgICAgICAgICAgICAgICAgbXkgKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworCisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBQTkdzLi4uCisgICAgICAgICAgICAgICAgaWYgICAgKHVucGFjaygneCBBMycsICRkYXRhKSBlcSAnUE5HJykgeworICAgICAgICAgICAgICAgICAgICAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCkgPSAkc2VsZi0+X3Byb2Nlc3NfcG5nKCRkYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBKRklGIGFuZCBFeGlmIEpQRUdzLi4uCisgICAgICAgICAgICAgICAgZWxzaWYgKCAodW5wYWNrKCduJywgJGRhdGEpID09IDB4RkZEOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh1bnBhY2soJ3g2IEE0JywgJGRhdGEpIGVxICdKRklGJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnBhY2soJ3g2IEE0JywgJGRhdGEpIGVxICdFeGlmJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpID0gJHNlbGYtPl9wcm9jZXNzX2pwZygkZGF0YSwgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIyBUZXN0IGZvciBCTVBzLi4uCisgICAgICAgICAgICAgICAgZWxzaWYgKHVucGFjaygnQTInLCAgICRkYXRhKSBlcSAnQk0nKSB7CisgICAgICAgICAgICAgICAgICAgICgkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0KSA9ICRzZWxmLT5fcHJvY2Vzc19ibXAoJGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgMTQgYnl0ZSBoZWFkZXIgb2YgdGhlIEJNUCBpcyBzdHJpcHBlZCBvZmYuCisgICAgICAgICAgICAgICAgICAgICRkYXRhICAgICAgID0gc3Vic3RyICRkYXRhLCAxNDsKKworICAgICAgICAgICAgICAgICAgICAjIEEgY2hlY2tzdW0gb2YgdGhlIG5ldyBpbWFnZSBkYXRhIGlzIGFsc28gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTIgID0gJHNlbGYtPl9pbWFnZV9jaGVja3N1bSgkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV9pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgICAgICAjIEFkanVzdCBzaXplIC0xNCAoaGVhZGVyKSArIDE2IChleHRyYSBjaGVja3N1bSkuCisgICAgICAgICAgICAgICAgICAgICRzaXplICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjcm9hayAiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IGZvciBmaWxlOiAkZmlsZW5hbWVcbiI7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAjIFB1c2ggdGhlIG5ldyBkYXRhIGJhY2sgaW50byB0aGUgV29ya3NoZWV0IGFycmF5OworICAgICAgICAgICAgICAgIHB1c2ggQCRpbWFnZV9yZWYsICRpbWFnZV9pZCwgJHR5cGUsICR3aWR0aCwgJGhlaWdodDsKKworICAgICAgICAgICAgICAgICMgQWxzbyBzdG9yZSBuZXcgZGF0YSBmb3IgdXNlIGluIGR1cGxpY2F0ZSBpbWFnZXMuCisgICAgICAgICAgICAgICAgcHVzaCBAcHJldmlvdXNfaW1hZ2VzLCBbJGltYWdlX2lkLCAkdHlwZSwgJHdpZHRoLCAkaGVpZ2h0XTsKKworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgV29ya2Jvb2suCisgICAgICAgICAgICAgICAgcHVzaCBAaW1hZ2VfZGF0YSwgWyRyZWZfY291bnQsICR0eXBlLCAkZGF0YSwgJHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTEsICRjaGVja3N1bTJdOworCisgICAgICAgICAgICAgICAgIyBLZWVwIHRyYWNrIG9mIG92ZXJhbGwgZGF0YSBzaXplLgorICAgICAgICAgICAgICAgICRpbWFnZXNfc2l6ZSAgICAgICArPSAkc2l6ZSArNjE7ICMgU2l6ZSBmb3IgYnN0b3JlIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICAkaW1hZ2VfbXNvX3NpemUgICAgKz0gJHNpemUgKzY5OyAjIFNpemUgZm9yIGRnZyBjb250YWluZXIuCisKKyAgICAgICAgICAgICAgICAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSA9ICRpbWFnZV9pZCsrOworICAgICAgICAgICAgICAgICRmaC0+Y2xvc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAjIFdlJ3ZlIHByb2Nlc3NlZCB0aGlzIGZpbGUgYWxyZWFkeS4KKyAgICAgICAgICAgICAgICBteSAkaW5kZXggPSAkaW1hZ2VzX3NlZW57JGZpbGVuYW1lfSAtMTsKKworICAgICAgICAgICAgICAgICMgSW5jcmVhc2UgaW1hZ2UgcmVmZXJlbmNlIGNvdW50LgorICAgICAgICAgICAgICAgICRpbWFnZV9kYXRhWyRpbmRleF0tPlswXSsrOworCisgICAgICAgICAgICAgICAgIyBBZGQgcHJldmlvdXNseSBjYWxjdWxhdGVkIGRhdGEgYmFjayBvbnRvIHRoZSBXb3Jrc2hlZXQgYXJyYXkuCisgICAgICAgICAgICAgICAgIyAkaW1hZ2VfaWQsICR0eXBlLCAkd2lkdGgsICRoZWlnaHQKKyAgICAgICAgICAgICAgICBteSAkYV9yZWYgPSAkc2hlZXQtPntfaW1hZ2VzX2FycmF5fS0+WyRpbmRleF07CisgICAgICAgICAgICAgICAgcHVzaCBAJGltYWdlX3JlZiwgQHskcHJldmlvdXNfaW1hZ2VzWyRpbmRleF19OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgIyBTdG9yZSBpbmZvcm1hdGlvbiByZXF1aXJlZCBieSB0aGUgV29ya3NoZWV0LgorICAgICAgICAkc2hlZXQtPntfbnVtX2ltYWdlc30gICAgID0gJG51bV9pbWFnZXM7CisgICAgICAgICRzaGVldC0+e19pbWFnZV9tc29fc2l6ZX0gPSAkaW1hZ2VfbXNvX3NpemU7CisKKyAgICB9CisKKworICAgICMgU3RvcmUgaW5mb3JtYXRpb24gcmVxdWlyZWQgYnkgdGhlIFdvcmtib29rLgorICAgICRzZWxmLT57X2ltYWdlc19zaXplfSA9ICRpbWFnZXNfc2l6ZTsKKyAgICAkc2VsZi0+e19pbWFnZXNfZGF0YX0gPSBcQGltYWdlX2RhdGE7ICMgU3RvcmUgdGhlIGRhdGEgZm9yIE1TT0RSQVdJTkdHUk9VUC4KKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2ltYWdlX2NoZWNrc3VtKCkKKyMKKyMgR2VuZXJhdGUgYSBjaGVja3N1bSBmb3IgdGhlIGltYWdlIHVzaW5nIHdoaWNoZXZlciBtb2R1bGUgaXMgYXZhaWxhYmxlLi5UaGUKKyMgYXZhaWxhYmxlIG1vZHVsZXMgYXJlIGNoZWNrZWQgaW4gX2dldF9jaGVja3N1bV9tZXRob2QoKS4gRXhjZWwgdXNlcyBhbiBNRDQKKyMgY2hlY2tzdW0gYnV0IGFueSBvdGhlciB3aWxsIGRvLiBJbiB0aGUgZXZlbnQgb2Ygbm8gY2hlY2tzdW0gbW9kdWxlIGJlaW5nCisjIGF2YWlsYWJsZSB3ZSBzaW11bGF0ZSBhIGNoZWNrc3VtIHVzaW5nIHRoZSBpbWFnZSBpbmRleC4KKyMKK3N1YiBfaW1hZ2VfY2hlY2tzdW0geworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRkYXRhICAgID0gJF9bMF07CisgICAgbXkgJGluZGV4MSAgPSAkX1sxXTsKKyAgICBteSAkaW5kZXgyICA9ICRfWzJdIHx8IDA7CisKKyAgICBpZiAgICAoJHNlbGYtPntfY2hlY2tzdW1fbWV0aG9kfSA9PSAxKSB7CisgICAgICAgICMgRGlnZXN0OjpNRDQKKyAgICAgICAgcmV0dXJuIERpZ2VzdDo6TUQ0OjptZDRfaGV4KCRkYXRhKTsKKyAgICB9CisgICAgZWxzaWYgKCRzZWxmLT57X2NoZWNrc3VtX21ldGhvZH0gPT0gMikgeworICAgICAgICAjIERpZ2VzdDo6UGVybDo6TUQ0CisgICAgICAgIHJldHVybiBEaWdlc3Q6OlBlcmw6Ok1ENDo6bWQ0X2hleCgkZGF0YSk7CisgICAgfQorICAgIGVsc2lmICgkc2VsZi0+e19jaGVja3N1bV9tZXRob2R9ID09IDMpIHsKKyAgICAgICAgIyBEaWdlc3Q6Ok1ENQorICAgICAgICByZXR1cm4gRGlnZXN0OjpNRDU6Om1kNV9oZXgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBEZWZhdWx0CisgICAgICAgIHJldHVybiBzcHJpbnRmICclMDE2WCUwMTZYJywgJGluZGV4MiwgJGluZGV4MTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19wbmcoKQorIworIyBFeHRyYWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gZnJvbSBhIFBORyBmaWxlLgorIworc3ViIF9wcm9jZXNzX3BuZyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgPSA2OyAjIEV4Y2VsIEJsaXAgdHlwZSAoTVNPQkxJUFRZUEUpLgorICAgIG15ICR3aWR0aCAgID0gdW5wYWNrICJOIiwgc3Vic3RyICRfWzBdLCAxNiwgNDsKKyAgICBteSAkaGVpZ2h0ICA9IHVucGFjayAiTiIsIHN1YnN0ciAkX1swXSwgMjAsIDQ7CisKKyAgICByZXR1cm4gKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3Byb2Nlc3NfYm1wKCkKKyMKKyMgRXh0cmFjdCB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uIGZyb20gYSBCTVAgZmlsZS4KKyMKKyMgTW9zdCBvZiB0aGVzZSBjaGVja3MgY2FtZSBmcm9tIHRoZSBvbGQgV29ya3NoZWV0OjpfcHJvY2Vzc19iaXRtYXAoKSBtZXRob2QuCisjCitzdWIgX3Byb2Nlc3NfYm1wIHsKKworICAgIG15ICRzZWxmICAgICA9IHNoaWZ0OworICAgIG15ICRkYXRhICAgICA9ICRfWzBdOworICAgIG15ICRmaWxlbmFtZSA9ICRfWzFdOworICAgIG15ICR0eXBlICAgICA9IDc7ICMgRXhjZWwgQmxpcCB0eXBlIChNU09CTElQVFlQRSkuCisKKworICAgICMgQ2hlY2sgdGhhdCB0aGUgZmlsZSBpcyBiaWcgZW5vdWdoIHRvIGJlIGEgYml0bWFwLgorICAgIGlmIChsZW5ndGggJGRhdGEgPD0gMHgzNikgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lIGRvZXNuJ3QgY29udGFpbiBlbm91Z2ggZGF0YS4iOworICAgIH0KKworCisgICAgIyBSZWFkIHRoZSBiaXRtYXAgd2lkdGggYW5kIGhlaWdodC4gVmVyaWZ5IHRoZSBzaXplcy4KKyAgICBteSAoJHdpZHRoLCAkaGVpZ2h0KSA9IHVucGFjayAieDE4IFYyIiwgJGRhdGE7CisKKyAgICBpZiAoJHdpZHRoID4gMHhGRkZGKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IGxhcmdlc3QgaW1hZ2Ugd2lkdGggJHdpZHRoIHN1cHBvcnRlZCBpcyA2NWsuIjsKKyAgICB9CisKKyAgICBpZiAoJGhlaWdodCA+IDB4RkZGRikgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lOiBsYXJnZXN0IGltYWdlIGhlaWdodCBzdXBwb3J0ZWQgaXMgNjVrLiI7CisgICAgfQorCisgICAgIyBSZWFkIHRoZSBiaXRtYXAgcGxhbmVzIGFuZCBicHAgZGF0YS4gVmVyaWZ5IHRoZW0uCisgICAgbXkgKCRwbGFuZXMsICRiaXRjb3VudCkgPSB1bnBhY2sgIngyNiB2MiIsICRkYXRhOworCisgICAgaWYgKCRiaXRjb3VudCAhPSAyNCkgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lIGlzbid0IGEgMjRiaXQgdHJ1ZSBjb2xvciBiaXRtYXAuIjsKKyAgICB9CisKKyAgICBpZiAoJHBsYW5lcyAhPSAxKSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IG9ubHkgMSBwbGFuZSBzdXBwb3J0ZWQgaW4gYml0bWFwIGltYWdlLiI7CisgICAgfQorCisKKyAgICAjIFJlYWQgdGhlIGJpdG1hcCBjb21wcmVzc2lvbi4gVmVyaWZ5IGNvbXByZXNzaW9uLgorICAgIG15ICRjb21wcmVzc2lvbiA9IHVucGFjayAieDMwIFYiLCAkZGF0YTsKKworICAgIGlmICgkY29tcHJlc3Npb24gIT0gMCkgeworICAgICAgICBjcm9hayAiJGZpbGVuYW1lOiBjb21wcmVzc2lvbiBub3Qgc3VwcG9ydGVkIGluIGJpdG1hcCBpbWFnZS4iOworICAgIH0KKworICAgIHJldHVybiAoJHR5cGUsICR3aWR0aCwgJGhlaWdodCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcHJvY2Vzc19qcGcoKQorIworIyBFeHRyYWN0IHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gZnJvbSBhIEpQRUcgZmlsZS4KKyMKK3N1YiBfcHJvY2Vzc19qcGcgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJGRhdGEgICAgID0gJF9bMF07CisgICAgbXkgJGZpbGVuYW1lID0gJF9bMV07CisgICAgbXkgJHR5cGUgICAgID0gNTsgIyBFeGNlbCBCbGlwIHR5cGUgKE1TT0JMSVBUWVBFKS4KKyAgICBteSAkd2lkdGg7CisgICAgbXkgJGhlaWdodDsKKworICAgIG15ICRvZmZzZXQgPSAyOworICAgIG15ICRkYXRhX2xlbmd0aCA9IGxlbmd0aCAkZGF0YTsKKworICAgICMgU2VhcmNoIHRocm91Z2ggdGhlIGltYWdlIGRhdGEgdG8gZmluZCB0aGUgMHhGRkMwIG1hcmtlci4gVGhlIGhlaWdodCBhbmQKKyAgICAjIHdpZHRoIGFyZSBjb250YWluZWQgaW4gdGhlIGRhdGEgZm9yIHRoYXQgc3ViIGVsZW1lbnQuCisgICAgd2hpbGUgKCRvZmZzZXQgPCAkZGF0YV9sZW5ndGgpIHsKKworICAgICAgICBteSAkbWFya2VyICA9IHVucGFjayAibiIsIHN1YnN0ciAkZGF0YSwgJG9mZnNldCwgICAgMjsKKyAgICAgICAgbXkgJGxlbmd0aCAgPSB1bnBhY2sgIm4iLCBzdWJzdHIgJGRhdGEsICRvZmZzZXQgKzIsIDI7CisKKyAgICAgICAgaWYgKCRtYXJrZXIgPT0gMHhGRkMwIHx8ICRtYXJrZXIgPT0gMHhGRkMyKSB7CisgICAgICAgICAgICAkaGVpZ2h0ID0gdW5wYWNrICJuIiwgc3Vic3RyICRkYXRhLCAkb2Zmc2V0ICs1LCAyOworICAgICAgICAgICAgJHdpZHRoICA9IHVucGFjayAibiIsIHN1YnN0ciAkZGF0YSwgJG9mZnNldCArNywgMjsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKworICAgICAgICAkb2Zmc2V0ID0gJG9mZnNldCArICRsZW5ndGggKyAyOworICAgICAgICBsYXN0IGlmICRtYXJrZXIgPT0gMHhGRkRBOworICAgIH0KKworICAgIGlmIChub3QgZGVmaW5lZCAkaGVpZ2h0KSB7CisgICAgICAgIGNyb2FrICIkZmlsZW5hbWU6IG5vIHNpemUgZGF0YSBmb3VuZCBpbiBqcGVnIGltYWdlLlxuIjsKKyAgICB9CisKKyAgICByZXR1cm4gKCR0eXBlLCAkd2lkdGgsICRoZWlnaHQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FsbF9mb250cygpCisjCisjIFN0b3JlIHRoZSBFeGNlbCBGT05UIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2FsbF9mb250cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGZvcm1hdCAgPSAkc2VsZi0+e19mb3JtYXRzfS0+WzE1XTsgIyBUaGUgZGVmYXVsdCBjZWxsIGZvcm1hdC4KKyAgICBteSAkZm9udCAgICA9ICRmb3JtYXQtPmdldF9mb250KCk7CisKKyAgICAjIEZvbnRzIGFyZSAwLWluZGV4ZWQuIEFjY29yZGluZyB0byB0aGUgU0RLIHRoZXJlIGlzIG5vIGluZGV4IDQsCisgICAgZm9yICgwLi4zKSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRmb250KTsKKyAgICB9CisKKworICAgICMgQWRkIHRoZSBkZWZhdWx0IGZvbnRzIGZvciBjaGFydHMgYW5kIGNvbW1lbnRzLiBUaGlzIGFyZW4ndCBjb25uZWN0ZWQKKyAgICAjIHRvIFhGIGZvcm1hdHMuIE5vdGUsIHRoZSBmb250IHNpemUsIGFuZCBzb21lIG90aGVyIHByb3BlcnRpZXMgb2YKKyAgICAjIGNoYXJ0IGZvbnRzIGFyZSBzZXQgaW4gdGhlIEZCSSByZWNvcmQgb2YgdGhlIGNoYXJ0LgorICAgIG15ICR0bXBfZm9ybWF0OworCisgICAgIyBJbmRleCA1LiBBeGlzIG51bWJlcnMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA2LiBTZXJpZXMgbmFtZXMuCisgICAgJHRtcF9mb3JtYXQgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Rm9ybWF0LT5uZXcoCisgICAgICAgIHVuZGVmLAorICAgICAgICBmb250X29ubHkgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA3LiBUaXRsZS4KKyAgICAkdG1wX2Zvcm1hdCA9IFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQtPm5ldygKKyAgICAgICAgdW5kZWYsCisgICAgICAgIGZvbnRfb25seSA9PiAxLAorICAgICAgICBib2xkICAgICAgPT4gMSwKKyAgICApOworICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wX2Zvcm1hdC0+Z2V0X2ZvbnQoKSApOworCisgICAgIyBJbmRleCA4LiBBeGVzLgorICAgICR0bXBfZm9ybWF0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KAorICAgICAgICB1bmRlZiwKKyAgICAgICAgZm9udF9vbmx5ID0+IDEsCisgICAgICAgIGJvbGQgICAgICA9PiAxLAorICAgICk7CisgICAgJHNlbGYtPl9hcHBlbmQoICR0bXBfZm9ybWF0LT5nZXRfZm9udCgpICk7CisKKyAgICAjIEluZGV4IDkuIENvbW1lbnRzLgorICAgICR0bXBfZm9ybWF0ID0gU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm1hdC0+bmV3KAorICAgICAgICB1bmRlZiwKKyAgICAgICAgZm9udF9vbmx5ID0+IDEsCisgICAgICAgIGZvbnQgICAgICA9PiAnVGFob21hJywKKyAgICAgICAgc2l6ZSAgICAgID0+IDgsCisgICAgKTsKKyAgICAkc2VsZi0+X2FwcGVuZCggJHRtcF9mb3JtYXQtPmdldF9mb250KCkgKTsKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIFhGIG9iamVjdHMgYW5kIHdyaXRlIGEgRk9OVCByZWNvcmQgaWYgaXQgaXNuJ3QgdGhlCisgICAgIyBzYW1lIGFzIHRoZSBkZWZhdWx0IEZPTlQgYW5kIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gdXNlZC4KKyAgICAjCisgICAgbXkgJWZvbnRzOworICAgIG15ICRrZXk7CisgICAgbXkgJGluZGV4ID0gMTA7ICAgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgdXNlciBkZWZpbmVkIEZPTlQKKworICAgICRrZXkgPSAkZm9ybWF0LT5nZXRfZm9udF9rZXkoKTsgIyBUaGUgZGVmYXVsdCBmb250IGZvciBjZWxsIGZvcm1hdHMuCisgICAgJGZvbnRzeyRrZXl9ID0gMDsgICAgICAgICAgICAgICAjIEluZGV4IG9mIHRoZSBkZWZhdWx0IGZvbnQKKworICAgICMgRm9udHMgdGhhdCBhcmUgbWFya2VkIGFzICdfZm9udF9vbmx5JyBhcmUgYWx3YXlzIHN0b3JlZC4gVGhlc2UgYXJlIHVzZWQKKyAgICAjIG1haW5seSBmb3IgY2hhcnRzIGFuZCBtYXkgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBYRiByZWNvcmQuCisKKyAgICBmb3JlYWNoICRmb3JtYXQgKEB7JHNlbGYtPntfZm9ybWF0c319KSB7CisgICAgICAgICRrZXkgPSAkZm9ybWF0LT5nZXRfZm9udF9rZXkoKTsKKworICAgICAgICBpZiAobm90ICRmb3JtYXQtPntfZm9udF9vbmx5fSBhbmQgZXhpc3RzICRmb250c3ska2V5fSkgeworICAgICAgICAgICAgIyBGT05UIGhhcyBhbHJlYWR5IGJlZW4gdXNlZAorICAgICAgICAgICAgJGZvcm1hdC0+e19mb250X2luZGV4fSA9ICRmb250c3ska2V5fTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgQWRkIGEgbmV3IEZPTlQgcmVjb3JkCisKKyAgICAgICAgICAgIGlmIChub3QgJGZvcm1hdC0+e19mb250X29ubHl9KSB7CisgICAgICAgICAgICAgICAgJGZvbnRzeyRrZXl9ID0gJGluZGV4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAkZm9ybWF0LT57X2ZvbnRfaW5kZXh9ID0gJGluZGV4OworICAgICAgICAgICAgJGluZGV4Kys7CisgICAgICAgICAgICAkZm9udCA9ICRmb3JtYXQtPmdldF9mb250KCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkZm9udCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYWxsX251bV9mb3JtYXRzKCkKKyMKKyMgU3RvcmUgdXNlciBkZWZpbmVkIG51bWVyaWNhbCBmb3JtYXRzIGkuZS4gRk9STUFUIHJlY29yZHMKKyMKK3N1YiBfc3RvcmVfYWxsX251bV9mb3JtYXRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAlbnVtX2Zvcm1hdHM7CisgICAgbXkgQG51bV9mb3JtYXRzOworICAgIG15ICRudW1fZm9ybWF0OworICAgIG15ICRpbmRleCA9IDE2NDsgIyBVc2VyIGRlZmluZWQgRk9STUFUIHJlY29yZHMgc3RhcnQgZnJvbSAweEE0CisKKworICAgICMgSXRlcmF0ZSB0aHJvdWdoIHRoZSBYRiBvYmplY3RzIGFuZCB3cml0ZSBhIEZPUk1BVCByZWNvcmQgaWYgaXQgaXNuJ3QgYQorICAgICMgYnVpbHQtaW4gZm9ybWF0IHR5cGUgYW5kIGlmIHRoZSBGT1JNQVQgc3RyaW5nIGhhc24ndCBhbHJlYWR5IGJlZW4gdXNlZC4KKyAgICAjCisgICAgZm9yZWFjaCBteSAkZm9ybWF0IChAeyRzZWxmLT57X2Zvcm1hdHN9fSkgeworICAgICAgICBteSAkbnVtX2Zvcm1hdCA9ICRmb3JtYXQtPntfbnVtX2Zvcm1hdH07CisgICAgICAgIG15ICRlbmNvZGluZyAgID0gJGZvcm1hdC0+e19udW1fZm9ybWF0X2VuY307CisKKyAgICAgICAgIyBDaGVjayBpZiAkbnVtX2Zvcm1hdCBpcyBhbiBpbmRleCB0byBhIGJ1aWx0LWluIGZvcm1hdC4KKyAgICAgICAgIyBBbHNvIGNoZWNrIGZvciBhIHN0cmluZyBvZiB6ZXJvcywgd2hpY2ggaXMgYSB2YWxpZCBmb3JtYXQgc3RyaW5nCisgICAgICAgICMgYnV0IHdvdWxkIGV2YWx1YXRlIHRvIHplcm8uCisgICAgICAgICMKKyAgICAgICAgaWYgKCRudW1fZm9ybWF0ICF+IG0vXjArXGQvKSB7CisgICAgICAgICAgICBuZXh0IGlmICRudW1fZm9ybWF0ID1+IG0vXlxkKyQvOyAjIGJ1aWx0LWluCisgICAgICAgIH0KKworICAgICAgICBpZiAoZXhpc3RzKCRudW1fZm9ybWF0c3skbnVtX2Zvcm1hdH0pKSB7CisgICAgICAgICAgICAjIEZPUk1BVCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQKKyAgICAgICAgICAgICRmb3JtYXQtPntfbnVtX2Zvcm1hdH0gPSAkbnVtX2Zvcm1hdHN7JG51bV9mb3JtYXR9OworICAgICAgICB9CisgICAgICAgIGVsc2V7CisgICAgICAgICAgICAjIEFkZCBhIG5ldyBGT1JNQVQKKyAgICAgICAgICAgICRudW1fZm9ybWF0c3skbnVtX2Zvcm1hdH0gPSAkaW5kZXg7CisgICAgICAgICAgICAkZm9ybWF0LT57X251bV9mb3JtYXR9ICAgID0gJGluZGV4OworICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9udW1fZm9ybWF0KCRudW1fZm9ybWF0LCAkaW5kZXgsICRlbmNvZGluZyk7CisgICAgICAgICAgICAkaW5kZXgrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hbGxfeGZzKCkKKyMKKyMgV3JpdGUgYWxsIFhGIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2FsbF94ZnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGZvcmVhY2ggbXkgJGZvcm1hdCAoQHskc2VsZi0+e19mb3JtYXRzfX0pIHsKKyAgICAgICAgbXkgJHhmID0gJGZvcm1hdC0+Z2V0X3hmKCk7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCR4Zik7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2FsbF9zdHlsZXMoKQorIworIyBXcml0ZSBhbGwgU1RZTEUgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfYWxsX3N0eWxlcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBFeGNlbCBhZGRzIHRoZSBidWlsdC1pbiBzdHlsZXMgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLgorICAgIG15IEBidWlsdF9pbnMgPSAoCisgICAgICAgIFsweDAzLCAxNl0sICMgQ29tbWEKKyAgICAgICAgWzB4MDYsIDE3XSwgIyBDb21tYVswXQorICAgICAgICBbMHgwNCwgMThdLCAjIEN1cnJlbmN5CisgICAgICAgIFsweDA3LCAxOV0sICMgQ3VycmVuY3lbMF0KKyAgICAgICAgWzB4MDAsICAwXSwgIyBOb3JtYWwKKyAgICAgICAgWzB4MDUsIDIwXSwgIyBQZXJjZW50CisKKyAgICAgICAgIyBXZSBkb24ndCBkZWFsIHdpdGggdGhlc2Ugc3R5bGVzIHlldC4KKyAgICAgICAgI1sweDA4LCAyMV0sICMgSHlwZXJsaW5rCisgICAgICAgICNbMHgwMiwgIDhdLCAjIENvbExldmVsX24KKyAgICAgICAgI1sweDAxLCAgMV0sICMgUm93TGV2ZWxfbgorICAgICk7CisKKworICAgIGZvciBteSAkYXJlZiAoQGJ1aWx0X2lucykgeworICAgICAgICBteSAkdHlwZSAgICAgPSAkYXJlZi0+WzBdOworICAgICAgICBteSAkeGZfaW5kZXggPSAkYXJlZi0+WzFdOworCisgICAgICAgICRzZWxmLT5fc3RvcmVfc3R5bGUoJHR5cGUsICR4Zl9pbmRleCk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX25hbWVzKCkKKyMKKyMgV3JpdGUgdGhlIE5BTUUgcmVjb3JkIHRvIGRlZmluZSB0aGUgcHJpbnQgYXJlYSBhbmQgdGhlIHJlcGVhdCByb3dzIGFuZCBjb2xzLgorIworc3ViIF9zdG9yZV9uYW1lcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkaW5kZXg7CisgICAgbXkgJWV4dF9yZWZzICAgID0gJXskc2VsZi0+e19leHRfcmVmc319OworCisKKyAgICAjIENyZWF0ZSB0aGUgdXNlciBkZWZpbmVkIG5hbWVzLgorICAgIGZvciBteSAkZGVmaW5lZF9uYW1lIChAeyRzZWxmLT57X2RlZmluZWRfbmFtZXN9fSkgeworCisgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZSgKKyAgICAgICAgICAgICRkZWZpbmVkX25hbWUtPntuYW1lfSwKKyAgICAgICAgICAgICRkZWZpbmVkX25hbWUtPntlbmNvZGluZ30sCisgICAgICAgICAgICAkZGVmaW5lZF9uYW1lLT57c2hlZXRfaW5kZXh9LAorICAgICAgICAgICAgJGRlZmluZWRfbmFtZS0+e2Zvcm11bGF9LAorICAgICAgICApOworICAgIH0KKworICAgICMgU29ydCB0aGUgd29ya3NoZWV0cyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlciBieSBuYW1lLiBUaGlzIGlzIGEKKyAgICAjIHJlcXVpcmVtZW50IGZvciBzb21lIG5vbi1FbmdsaXNoIGxhbmd1YWdlIEV4Y2VsIHBhdGNoIGxldmVscy4KKyAgICBteSBAd29ya3NoZWV0cyA9IEB7JHNlbGYtPntfd29ya3NoZWV0c319OworICAgICAgIEB3b3Jrc2hlZXRzID0gc29ydCB7ICRhLT57X25hbWV9IGNtcCAkYi0+e19uYW1lfSB9IEB3b3Jrc2hlZXRzOworCisgICAgIyBDcmVhdGUgdGhlIGF1dG9maWx0ZXIgTkFNRSByZWNvcmRzCisgICAgZm9yZWFjaCBteSAkd29ya3NoZWV0IChAd29ya3NoZWV0cykgeworICAgICAgICAkaW5kZXggID0gJHdvcmtzaGVldC0+e19pbmRleH07CisgICAgICAgIG15ICRrZXkgPSAiJGluZGV4OiRpbmRleCI7CisgICAgICAgIG15ICRyZWYgPSAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgIyBXcml0ZSBhIE5hbWUgcmVjb3JkIGlmIEF1dG9maWx0ZXIgaGFzIGJlZW4gZGVmaW5lZAorICAgICAgICBpZiAoJHdvcmtzaGVldC0+e19maWx0ZXJfY291bnR9KSB7CisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfc2hvcnQoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwRCwgIyBOQU1FIHR5cGUgPSBGaWx0ZXIgRGF0YWJhc2UKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfZmlsdGVyX2FyZWF9LT5bMF0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19maWx0ZXJfYXJlYX0tPlsxXSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2ZpbHRlcl9hcmVhfS0+WzJdLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfZmlsdGVyX2FyZWF9LT5bM10sCisgICAgICAgICAgICAgICAgMSwgIyBIaWRkZW4KKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIENyZWF0ZSB0aGUgcHJpbnQgYXJlYSBOQU1FIHJlY29yZHMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB3b3Jrc2hlZXRzKSB7CisgICAgICAgICRpbmRleCAgPSAkd29ya3NoZWV0LT57X2luZGV4fTsKKyAgICAgICAgbXkgJGtleSA9ICIkaW5kZXg6JGluZGV4IjsKKyAgICAgICAgbXkgJHJlZiA9ICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAjIFdyaXRlIGEgTmFtZSByZWNvcmQgaWYgdGhlIHByaW50IGFyZWEgaGFzIGJlZW4gZGVmaW5lZAorICAgICAgICBpZiAoZGVmaW5lZCAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21pbn0pIHsKKyAgICAgICAgICAgICRzZWxmLT5fc3RvcmVfbmFtZV9zaG9ydCgKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X2luZGV4fSwKKyAgICAgICAgICAgICAgICAweDA2LCAjIE5BTUUgdHlwZSA9IFByaW50X0FyZWEKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfcHJpbnRfcm93bWlufSwKKyAgICAgICAgICAgICAgICAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21heH0sCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19wcmludF9jb2xtaW59LAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfcHJpbnRfY29sbWF4fQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ3JlYXRlIHRoZSBwcmludCB0aXRsZSBOQU1FIHJlY29yZHMKKyAgICBmb3JlYWNoIG15ICR3b3Jrc2hlZXQgKEB3b3Jrc2hlZXRzKSB7CisgICAgICAgICRpbmRleCAgPSAkd29ya3NoZWV0LT57X2luZGV4fTsKKworICAgICAgICBteSAkcm93bWluID0gJHdvcmtzaGVldC0+e190aXRsZV9yb3dtaW59OworICAgICAgICBteSAkcm93bWF4ID0gJHdvcmtzaGVldC0+e190aXRsZV9yb3dtYXh9OworICAgICAgICBteSAkY29sbWluID0gJHdvcmtzaGVldC0+e190aXRsZV9jb2xtaW59OworICAgICAgICBteSAkY29sbWF4ID0gJHdvcmtzaGVldC0+e190aXRsZV9jb2xtYXh9OworICAgICAgICBteSAka2V5ICAgID0gIiRpbmRleDokaW5kZXgiOworICAgICAgICBteSAkcmVmICAgID0gJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICMgRGV0ZXJtaW5lIGlmIHJvdyArIGNvbCwgcm93LCBjb2wgb3Igbm90aGluZyBoYXMgYmVlbiBkZWZpbmVkCisgICAgICAgICMgYW5kIHdyaXRlIHRoZSBhcHByb3ByaWF0ZSByZWNvcmQKKyAgICAgICAgIworICAgICAgICBpZiAoZGVmaW5lZCAkcm93bWluICYmIGRlZmluZWQgJGNvbG1pbikgeworICAgICAgICAgICAgIyBSb3cgYW5kIGNvbHVtbiB0aXRsZXMgaGF2ZSBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAjIFJvdyB0aXRsZSBoYXMgYmVlbiBkZWZpbmVkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lX2xvbmcoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwNywgIyBOQU1FIHR5cGUgPSBQcmludF9UaXRsZXMKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgICRyb3dtaW4sCisgICAgICAgICAgICAgICAgJHJvd21heCwKKyAgICAgICAgICAgICAgICAkY29sbWluLAorICAgICAgICAgICAgICAgICRjb2xtYXgKKyAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoZGVmaW5lZCAkcm93bWluKSB7CisgICAgICAgICAgICAjIFJvdyB0aXRsZSBoYXMgYmVlbiBkZWZpbmVkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9uYW1lX3Nob3J0KAorICAgICAgICAgICAgICAgICR3b3Jrc2hlZXQtPntfaW5kZXh9LAorICAgICAgICAgICAgICAgIDB4MDcsICMgTkFNRSB0eXBlID0gUHJpbnRfVGl0bGVzCisgICAgICAgICAgICAgICAgJHJlZiwKKyAgICAgICAgICAgICAgICAkcm93bWluLAorICAgICAgICAgICAgICAgICRyb3dtYXgsCisgICAgICAgICAgICAgICAgMHgwMCwKKyAgICAgICAgICAgICAgICAweGZmCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2lmIChkZWZpbmVkICRjb2xtaW4pIHsKKyAgICAgICAgICAgICMgQ29sdW1uIHRpdGxlIGhhcyBiZWVuIGRlZmluZWQuCisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX25hbWVfc2hvcnQoCisgICAgICAgICAgICAgICAgJHdvcmtzaGVldC0+e19pbmRleH0sCisgICAgICAgICAgICAgICAgMHgwNywgIyBOQU1FIHR5cGUgPSBQcmludF9UaXRsZXMKKyAgICAgICAgICAgICAgICAkcmVmLAorICAgICAgICAgICAgICAgIDB4MDAwMCwKKyAgICAgICAgICAgICAgICAweGZmZmYsCisgICAgICAgICAgICAgICAgJGNvbG1pbiwKKyAgICAgICAgICAgICAgICAkY29sbWF4CisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBOb3RoaW5nIGxlZnQgdG8gZG8KKyAgICAgICAgfQorICAgIH0KK30KKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBCSUZGIFJFQ09SRFMKKyMKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV93aW5kb3cxKCkKKyMKKyMgV3JpdGUgRXhjZWwgQklGRiBXSU5ET1cxIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfd2luZG93MSB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDNEOyAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwMTI7ICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICR4V24gICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICAjIEhvcml6b250YWwgcG9zaXRpb24gb2Ygd2luZG93CisgICAgbXkgJHlXbiAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAgICMgVmVydGljYWwgcG9zaXRpb24gb2Ygd2luZG93CisgICAgbXkgJGR4V24gICAgICA9IDB4MzU1QzsgICAgICAgICAgICAgICAgICMgV2lkdGggb2Ygd2luZG93CisgICAgbXkgJGR5V24gICAgICA9IDB4MzBFRDsgICAgICAgICAgICAgICAgICMgSGVpZ2h0IG9mIHdpbmRvdworCisgICAgbXkgJGdyYml0ICAgICA9IDB4MDAzODsgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJGN0YWJzZWwgICA9ICRzZWxmLT57X3NlbGVjdGVkfTsgICAgICMgTnVtYmVyIG9mIHdvcmtib29rIHRhYnMgc2VsZWN0ZWQKKyAgICBteSAkd1RhYlJhdGlvID0gMHgwMjU4OyAgICAgICAgICAgICAgICAgIyBUYWIgdG8gc2Nyb2xsYmFyIHJhdGlvCisKKyAgICBteSAkaXRhYkZpcnN0ID0gJHNlbGYtPntfZmlyc3RzaGVldH07ICAgIyAxc3QgZGlzcGxheWVkIHdvcmtzaGVldAorICAgIG15ICRpdGFiQ3VyICAgPSAkc2VsZi0+e19hY3RpdmVzaGVldH07ICAjIEFjdGl2ZSB3b3Jrc2hlZXQKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2dnZ2dnZ2IiwgJHhXbiwgJHlXbiwgJGR4V24sICRkeVduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZ3JiaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpdGFiQ3VyLCAkaXRhYkZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY3RhYnNlbCwgJHdUYWJSYXRpbyk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfYm91bmRzaGVldCgpCisjCisjIFdyaXRlcyBFeGNlbCBCSUZGIEJPVU5EU0hFRVQgcmVjb3JkLgorIworc3ViIF9zdG9yZV9ib3VuZHNoZWV0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwODU7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDA4ICsgbGVuZ3RoKCRfWzBdKTsgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkc2hlZXRuYW1lID0gJF9bMF07ICAgICAgICAgICAgICAgICMgV29ya3NoZWV0IG5hbWUKKyAgICBteSAkb2Zmc2V0ICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICMgTG9jYXRpb24gb2Ygd29ya3NoZWV0IEJPRgorICAgIG15ICR0eXBlICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgIyBXb3Jrc2hlZXQgdHlwZQorICAgIG15ICRoaWRkZW4gICAgPSAkX1szXTsgICAgICAgICAgICAgICAgIyBXb3Jrc2hlZXQgaGlkZGVuIGZsYWcKKyAgICBteSAkZW5jb2RpbmcgID0gJF9bNF07ICAgICAgICAgICAgICAgICMgU2hlZXQgbmFtZSBlbmNvZGluZworICAgIG15ICRjY2ggICAgICAgPSBsZW5ndGgoJHNoZWV0bmFtZSk7ICAgIyBMZW5ndGggb2Ygc2hlZXQgbmFtZQorCisgICAgbXkgJGdyYml0ICAgICA9ICR0eXBlIHwgJGhpZGRlbjsKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggLz0gMiBpZiAkZW5jb2Rpbmc7CisKKyAgICAjIENoYW5nZSB0aGUgVVRGLTE2IG5hbWUgZnJvbSBCRSB0byBMRQorICAgICRzaGVldG5hbWUgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc2hlZXRuYW1lIGlmICRlbmNvZGluZzsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soIlZ2Q0MiLCAkb2Zmc2V0LCAkZ3JiaXQsICRjY2gsICRlbmNvZGluZyk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJHNoZWV0bmFtZSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfc3R5bGUoKQorIworIyBXcml0ZSBFeGNlbCBCSUZGIFNUWUxFIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX3N0eWxlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAyOTM7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDA0OyAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHR5cGUgICAgICA9ICRfWzBdOyAgIyBCdWlsdC1pbiBzdHlsZQorICAgIG15ICR4Zl9pbmRleCAgPSAkX1sxXTsgICMgSW5kZXggdG8gc3R5bGUgWEYKKyAgICBteSAkbGV2ZWwgICAgID0gMHhmZjsgICAjIE91dGxpbmUgc3R5bGUgbGV2ZWwKKworICAgICR4Zl9pbmRleCAgICB8PSAweDgwMDA7ICMgQWRkIGZsYWcgdG8gaW5kaWNhdGUgYnVpbHQtaW4gc3R5bGUuCisKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidkNDIiwgJHhmX2luZGV4LCAkdHlwZSwgJGxldmVsKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9udW1fZm9ybWF0KCkKKyMKKyMgV3JpdGVzIEV4Y2VsIEZPUk1BVCByZWNvcmQgZm9yIG5vbiAiYnVpbHQtaW4iIG51bWVyaWNhbCBmb3JtYXRzLgorIworc3ViIF9zdG9yZV9udW1fZm9ybWF0IHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDA0MUU7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZm9ybWF0ICAgID0gJF9bMF07ICAgICAgICAgICMgQ3VzdG9tIGZvcm1hdCBzdHJpbmcKKyAgICBteSAkaWZtdCAgICAgID0gJF9bMV07ICAgICAgICAgICMgRm9ybWF0IGluZGV4IGNvZGUKKyAgICBteSAkZW5jb2RpbmcgID0gJF9bMl07ICAgICAgICAgICMgQ2hhciBlbmNvZGluZyBmb3IgZm9ybWF0IHN0cmluZworCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJGZvcm1hdCkpIHsKKyAgICAgICAgICAgICRmb3JtYXQgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkZm9ybWF0KTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgQ2hhciBsZW5ndGggb2YgZm9ybWF0IHN0cmluZworICAgIG15ICRjY2ggPSBsZW5ndGggJGZvcm1hdDsKKworCisgICAgIyBIYW5kbGUgVW5pY29kZSBmb3JtYXQgc3RyaW5ncy4KKyAgICBpZiAoJGVuY29kaW5nID09IDEpIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gVW5pY29kZSBmb250IG5hbWUiIGlmICRjY2ggJSAyOworICAgICAgICAkY2NoICAgIC89IDIgaWYgJGVuY29kaW5nOworICAgICAgICAkZm9ybWF0ICA9IHBhY2sgJ3YqJywgdW5wYWNrICduKicsICRmb3JtYXQ7CisgICAgfQorCisKKyAgICAjIFNwZWNpYWwgY2FzZSB0byBoYW5kbGUgRXVybyBzeW1ib2wsIDB4ODAsIGluIG5vbi1Vbmljb2RlIHN0cmluZ3MuCisgICAgaWYgKCRlbmNvZGluZyA9PSAwIGFuZCAkZm9ybWF0ID1+IC9ceDgwLykgeworICAgICAgICAkZm9ybWF0ICAgPSAgcGFjayAndionLCB1bnBhY2sgJ0MqJywgJGZvcm1hdDsKKyAgICAgICAgJGZvcm1hdCAgID1+IHMvXHg4MFx4MDAvXHhBQ1x4MjAvZzsKKyAgICAgICAgJGVuY29kaW5nID0gIDE7CisgICAgfQorCisgICAgJGxlbmd0aCAgICAgICA9IDB4MDUgKyBsZW5ndGggJGZvcm1hdDsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dkMiLCAkaWZtdCwgJGNjaCwgJGVuY29kaW5nKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkZm9ybWF0KTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV8xOTA0KCkKKyMKKyMgV3JpdGUgRXhjZWwgMTkwNCByZWNvcmQgdG8gaW5kaWNhdGUgdGhlIGRhdGUgc3lzdGVtIGluIHVzZS4KKyMKK3N1YiBfc3RvcmVfMTkwNCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDIyOyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDAyOyAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZjE5MDQgICAgID0gJHNlbGYtPntfMTkwNH07ICMgRmxhZyBmb3IgMTkwNCBkYXRlIHN5c3RlbQorCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2IiwgJGYxOTA0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zdXBib29rKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgU1VQQk9PSyB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3b3JrYm9vayBjb250YWlucyBleHRlcm5hbAorIyByZWZlcmVuY2VzLCBpbiBvdXIgY2FzZSwgZm9ybXVsYSwgcHJpbnQgYXJlYSBhbmQgcHJpbnQgdGl0bGUgcmVmcy4KKyMKK3N1YiBfc3RvcmVfc3VwYm9vayB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFBRTsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwNDsgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkY3RhYnMgICAgICAgPSBAeyRzZWxmLT57X3dvcmtzaGVldHN9fTsgICMgTnVtYmVyIG9mIHdvcmtzaGVldHMKKyAgICBteSAkU3RWaXJ0UGF0aCAgPSAweDA0MDE7ICAgICAgICAgICAgICAgICAgICMgRW5jb2RlZCB3b3JrYm9vayBmaWxlbmFtZQorCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2diIsICRjdGFicywgJFN0VmlydFBhdGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2V4dGVybnNoZWV0KCkKKyMKKyMgV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQorIyBmb3JtdWxhcy4gVE9ETyBOQU1FIHJlY29yZCBpcyByZXF1aXJlZCB0byBkZWZpbmUgdGhlIHByaW50IGFyZWEgYW5kIHRoZQorIyByZXBlYXQgcm93cyBhbmQgY29sdW1ucy4KKyMKK3N1YiBfc3RvcmVfZXh0ZXJuc2hlZXQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMTc7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisKKyAgICAjIEdldCB0aGUgZXh0ZXJuYWwgcmVmcworICAgIG15ICVleHRfcmVmcyA9ICV7JHNlbGYtPntfZXh0X3JlZnN9fTsKKyAgICBteSBAZXh0X3JlZnMgPSBzb3J0IHskZXh0X3JlZnN7JGF9IDw9PiAkZXh0X3JlZnN7JGJ9fSBrZXlzICVleHRfcmVmczsKKworICAgICMgQ2hhbmdlIHRoZSBleHRlcm5hbCByZWZzIGZyb20gc3RyaW5naWZpZWQgIjE6MSIgdG8gWzEsIDFdCisgICAgZm9yZWFjaCBteSAkcmVmIChAZXh0X3JlZnMpIHsKKyAgICAgICAgJHJlZiA9IFtzcGxpdCAvOi8sICRyZWZdOworICAgIH0KKworCisgICAgbXkgJGN4dGkgICAgICAgID0gc2NhbGFyIEBleHRfcmVmczsgICAgICAgICAjIE51bWJlciBvZiBFeGNlbCBYVEkgc3RydWN0dXJlcworICAgIG15ICRyZ3h0aSAgICAgICA9ICcnOyAgICAgICAgICAgICAgICAgICAgICAgIyBBcnJheSBvZiBYVEkgc3RydWN0dXJlcworCisgICAgIyBXcml0ZSB0aGUgWFRJIHN0cnVjdHMKKyAgICBmb3JlYWNoIG15ICRleHRfcmVmIChAZXh0X3JlZnMpIHsKKyAgICAgICAgJHJneHRpIC49IHBhY2soInZ2diIsIDAsICRleHRfcmVmLT5bMF0sICRleHRfcmVmLT5bMV0pCisgICAgfQorCisKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgJGN4dGkpIC4gJHJneHRpOworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgbGVuZ3RoICRkYXRhKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lKCkKKyMKKyMKKyMgU3RvcmUgdGhlIE5BTUUgcmVjb3JkIHVzZWQgZm9yIHN0b3JpbmcgdGhlIHByaW50IGFyZWEsIHJlcGVhdCByb3dzLCByZXBlYXQKKyMgY29sdW1ucywgYXV0b2ZpbHRlcnMgYW5kIGRlZmluZWQgbmFtZXMuCisjCisjIFRPRE8uIFRoaXMgaXMgYSBtb3JlIGdlbmVyaWMgdmVyc2lvbiB0aGF0IHdpbGwgcmVwbGFjZSBfc3RvcmVfbmFtZV9zaG9ydCgpCisjICAgICAgIGFuZCBfc3RvcmVfbmFtZV9sb25nKCkuCisjCitzdWIgX3N0b3JlX25hbWUgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDAxODsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG5hbWUgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRlbmNvZGluZyAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc2hlZXRfaW5kZXggICAgID0gc2hpZnQ7CisgICAgbXkgJGZvcm11bGEgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHRleHRfbGVuZ3RoICAgICA9IGxlbmd0aCAkbmFtZTsKKyAgICBteSAkZm9ybXVsYV9sZW5ndGggID0gbGVuZ3RoICRmb3JtdWxhOworCisgICAgIyBVVEYtMTYgc3RyaW5nIGxlbmd0aCBpcyBpbiBjaGFyYWN0ZXJzIG5vdCBieXRlcy4KKyAgICAkdGV4dF9sZW5ndGggICAgICAgLz0gMiBpZiAkZW5jb2Rpbmc7CisKKworICAgIG15ICRncmJpdCAgICAgICAgICAgPSAweDAwMDA7ICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJHNob3J0Y3V0ICAgICAgICA9IDB4MDA7ICAgICAgICAgIyBLZXlib2FyZCBzaG9ydGN1dAorICAgIG15ICRpeGFscyAgICAgICAgICAgPSAweDAwMDA7ICAgICAgICMgVW51c2VkIGluZGV4LgorICAgIG15ICRtZW51X2xlbmd0aCAgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGN1c3QgbWVudSB0ZXh0CisgICAgbXkgJGRlc2NfbGVuZ3RoICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgZGVzY3JpcHRpb24gdGV4dAorICAgIG15ICRoZWxwX2xlbmd0aCAgICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGhlbHAgdG9waWMgdGV4dAorICAgIG15ICRzdGF0dXNfbGVuZ3RoICAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIHN0YXR1cyBiYXIgdGV4dAorCisgICAgIyBTZXQgZ3JiaXQgYnVpbHQtaW4gZmxhZyBhbmQgdGhlIGhpZGRlbiBmbGFnIGZvciBhdXRvZmlsdGVycy4KKyAgICBpZiAoJHRleHRfbGVuZ3RoID09IDEpIHsKKyAgICAgICAgJGdyYml0ID0gMHgwMDIwIGlmIG9yZCAkbmFtZSA9PSAweDA2OyAjIFByaW50IGFyZWEKKyAgICAgICAgJGdyYml0ID0gMHgwMDIwIGlmIG9yZCAkbmFtZSA9PSAweDA3OyAjIFByaW50IHRpdGxlcworICAgICAgICAkZ3JiaXQgPSAweDAwMjEgaWYgb3JkICRuYW1lID09IDB4MEQ7ICMgQXV0b2ZpbHRlcgorICAgIH0KKworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrICJ2IiwgJGdyYml0OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHNob3J0Y3V0OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHRleHRfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJGZvcm11bGFfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJGl4YWxzOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJ2IiwgJHNoZWV0X2luZGV4OworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJG1lbnVfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJGRlc2NfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJGhlbHBfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrICJDIiwgJHN0YXR1c19sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIkMiLCAkZW5jb2Rpbmc7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49ICRuYW1lOworICAgICRkYXRhICAgICAgICAgICAgICAuPSAkZm9ybXVsYTsKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrICJ2diIsICRyZWNvcmQsIGxlbmd0aCAkZGF0YTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lX3Nob3J0KCkKKyMKKyMKKyMgU3RvcmUgdGhlIE5BTUUgcmVjb3JkIGluIHRoZSBzaG9ydCBmb3JtYXQgdGhhdCBpcyB1c2VkIGZvciBzdG9yaW5nIHRoZSBwcmludAorIyBhcmVhLCByZXBlYXQgcm93cyBvbmx5IGFuZCByZXBlYXQgY29sdW1ucyBvbmx5LgorIworc3ViIF9zdG9yZV9uYW1lX3Nob3J0IHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwMTg7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDFiOyAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRpbmRleCAgICAgICAgICAgPSBzaGlmdDsgICAgICAgICMgU2hlZXQgaW5kZXgKKyAgICBteSAkdHlwZSAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4dF9yZWYgICAgICAgICA9IHNoaWZ0OyAgICAgICAgIyBUT0RPCisKKyAgICBteSAkZ3JiaXQgICAgICAgICAgID0gMHgwMDIwOyAgICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRjaEtleSAgICAgICAgICAgPSAweDAwOyAgICAgICAgICMgS2V5Ym9hcmQgc2hvcnRjdXQKKyAgICBteSAkY2NoICAgICAgICAgICAgID0gMHgwMTsgICAgICAgICAjIExlbmd0aCBvZiB0ZXh0IG5hbWUKKyAgICBteSAkY2NlICAgICAgICAgICAgID0gMHgwMDBiOyAgICAgICAjIExlbmd0aCBvZiB0ZXh0IGRlZmluaXRpb24KKyAgICBteSAkdW5rbm93bjAxICAgICAgID0gMHgwMDAwOyAgICAgICAjCisgICAgbXkgJGl4YWxzICAgICAgICAgICA9ICRpbmRleCArMTsgICAgIyBTaGVldCBpbmRleAorICAgIG15ICR1bmtub3duMDIgICAgICAgPSAweDAwOyAgICAgICAgICMKKyAgICBteSAkY2NoQ3VzdE1lbnUgICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBjdXN0IG1lbnUgdGV4dAorICAgIG15ICRjY2hEZXNjcmlwdGlvbiAgPSAweDAwOyAgICAgICAgICMgTGVuZ3RoIG9mIGRlc2NyaXB0aW9uIHRleHQKKyAgICBteSAkY2NoSGVscHRvcGljICAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBoZWxwIHRvcGljIHRleHQKKyAgICBteSAkY2NoU3RhdHVzdGV4dCAgID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBzdGF0dXMgYmFyIHRleHQKKyAgICBteSAkcmdjaCAgICAgICAgICAgID0gJHR5cGU7ICAgICAgICAjIEJ1aWx0LWluIG5hbWUgdHlwZQorICAgIG15ICR1bmtub3duMDMgICAgICAgPSAweDNiOyAgICAgICAgICMKKworICAgIG15ICRyb3dtaW4gICAgICAgICAgPSAkX1swXTsgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJHJvd21heCAgICAgICAgICA9ICRfWzFdOyAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbG1pbiAgICAgICAgICA9ICRfWzJdOyAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkY29sbWF4ICAgICAgICAgID0gJF9bM107ICAgICAgICAjIGVuZCBjb2x1bW4KKworICAgIG15ICRoaWRkZW4gICAgICAgICAgPSAkX1s0XTsgICAgICAgICMgTmFtZSBpcyBoaWRkZW4KKyAgICAkZ3JiaXQgICAgICAgICAgICAgID0gMHgwMDIxIGlmICRoaWRkZW47CisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkZ3JiaXQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjaEtleSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNjZSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJHVua25vd24wMSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGl4YWxzKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkdW5rbm93bjAyKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoQ3VzdE1lbnUpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hEZXNjcmlwdGlvbik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaEhlbHB0b3BpYyk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaFN0YXR1c3RleHQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRyZ2NoKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkdW5rbm93bjAzKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkZXh0X3JlZik7CisKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkcm93bWluKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkcm93bWF4KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWluKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY29sbWF4KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9uYW1lX2xvbmcoKQorIworIworIyBTdG9yZSB0aGUgTkFNRSByZWNvcmQgaW4gdGhlIGxvbmcgZm9ybWF0IHRoYXQgaXMgdXNlZCBmb3Igc3RvcmluZyB0aGUgcmVwZWF0CisjIHJvd3MgYW5kIGNvbHVtbnMgd2hlbiBib3RoIGFyZSBzcGVjaWZpZWQuIFRoaXMgc2hhcmUgYSBsb3Qgb2YgY29kZSB3aXRoCisjIF9zdG9yZV9uYW1lX3Nob3J0KCkgYnV0IHdlIHVzZSBhIHNlcGFyYXRlIG1ldGhvZCB0byBrZWVwIHRoZSBjb2RlIGNsZWFuLgorIyBDb2RlIGFic3RyYWN0aW9uIGZvciByZXVzZSBjYW4gYmUgY2FycmllZCB0b28gZmFyLCBhbmQgSSBzaG91bGQga25vdy4gOy0pCisjCitzdWIgX3N0b3JlX25hbWVfbG9uZyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDE4OyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAyYTsgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gc2hpZnQ7ICAgICAgICAjIFNoZWV0IGluZGV4CisgICAgbXkgJHR5cGUgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHRfcmVmICAgICAgICAgPSBzaGlmdDsgICAgICAgICMgVE9ETworCisgICAgbXkgJGdyYml0ICAgICAgICAgICA9IDB4MDAyMDsgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkY2hLZXkgICAgICAgICAgID0gMHgwMDsgICAgICAgICAjIEtleWJvYXJkIHNob3J0Y3V0CisgICAgbXkgJGNjaCAgICAgICAgICAgICA9IDB4MDE7ICAgICAgICAgIyBMZW5ndGggb2YgdGV4dCBuYW1lCisgICAgbXkgJGNjZSAgICAgICAgICAgICA9IDB4MDAxYTsgICAgICAgIyBMZW5ndGggb2YgdGV4dCBkZWZpbml0aW9uCisgICAgbXkgJHVua25vd24wMSAgICAgICA9IDB4MDAwMDsgICAgICAgIworICAgIG15ICRpeGFscyAgICAgICAgICAgPSAkaW5kZXggKzE7ICAgICMgU2hlZXQgaW5kZXgKKyAgICBteSAkdW5rbm93bjAyICAgICAgID0gMHgwMDsgICAgICAgICAjCisgICAgbXkgJGNjaEN1c3RNZW51ICAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgY3VzdCBtZW51IHRleHQKKyAgICBteSAkY2NoRGVzY3JpcHRpb24gID0gMHgwMDsgICAgICAgICAjIExlbmd0aCBvZiBkZXNjcmlwdGlvbiB0ZXh0CisgICAgbXkgJGNjaEhlbHB0b3BpYyAgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2YgaGVscCB0b3BpYyB0ZXh0CisgICAgbXkgJGNjaFN0YXR1c3RleHQgICA9IDB4MDA7ICAgICAgICAgIyBMZW5ndGggb2Ygc3RhdHVzIGJhciB0ZXh0CisgICAgbXkgJHJnY2ggICAgICAgICAgICA9ICR0eXBlOyAgICAgICAgIyBCdWlsdC1pbiBuYW1lIHR5cGUKKworICAgIG15ICR1bmtub3duMDMgICAgICAgPSAweDI5OworICAgIG15ICR1bmtub3duMDQgICAgICAgPSAweDAwMTc7CisgICAgbXkgJHVua25vd24wNSAgICAgICA9IDB4M2I7CisKKyAgICBteSAkcm93bWluICAgICAgICAgID0gJF9bMF07ICAgICAgICAjIFN0YXJ0IHJvdworICAgIG15ICRyb3dtYXggICAgICAgICAgPSAkX1sxXTsgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2xtaW4gICAgICAgICAgPSAkX1syXTsgICAgICAgICMgU3RhcnQgY29sdW1uCisgICAgbXkgJGNvbG1heCAgICAgICAgICA9ICRfWzNdOyAgICAgICAgIyBlbmQgY29sdW1uCisKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICAgICAgPSBwYWNrKCJ2IiwgICRncmJpdCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNoS2V5KTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkY2NlKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkdW5rbm93bjAxKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAkaXhhbHMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDIpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICRjY2hDdXN0TWVudSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJGNjaERlc2NyaXB0aW9uKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoSGVscHRvcGljKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAkY2NoU3RhdHVzdGV4dCk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHJnY2gpOworCisgICAgIyBDb2x1bW4gZGVmaW5pdGlvbgorICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDMpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICR1bmtub3duMDQpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJDIiwgICR1bmtub3duMDUpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRleHRfcmVmKTsKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygidiIsICAweDAwMDApOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4ZmZmZik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNvbG1pbik7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGNvbG1heCk7CisKKyAgICAjIFJvdyBkZWZpbml0aW9uCisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soIkMiLCAgJHVua25vd24wNSk7CisgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2soInYiLCAgJGV4dF9yZWYpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtaW4pOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgICRyb3dtYXgpOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4MDApOworICAgICRkYXRhICAgICAgICAgICAgICAuPSBwYWNrKCJ2IiwgIDB4ZmYpOworICAgICMgRW5kIG9mIGRhdGEKKyAgICAkZGF0YSAgICAgICAgICAgICAgLj0gcGFjaygiQyIsICAweDEwKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wYWxldHRlKCkKKyMKKyMgU3RvcmVzIHRoZSBQQUxFVFRFIGJpZmYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9wYWxldHRlIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRhcmVmICAgICAgICAgICAgPSAkc2VsZi0+e19wYWxldHRlfTsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwOTI7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDIgKyA0ICogQCRhcmVmOyAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRjY3YgICAgICAgICAgICAgPSAgICAgICAgIEAkYXJlZjsgICAjIE51bWJlciBvZiBSR0IgdmFsdWVzIHRvIGZvbGxvdworICAgIG15ICRkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBSR0IgZGF0YQorCisgICAgIyBQYWNrIHRoZSBSR0IgZGF0YQorICAgICRkYXRhIC49IHBhY2sgIkNDQ0MiLCBAJF8gZm9yIEAkYXJlZjsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2dnYiLCAgJHJlY29yZCwgJGxlbmd0aCwgJGNjdik7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY29kZXBhZ2UoKQorIworIyBTdG9yZXMgdGhlIENPREVQQUdFIGJpZmYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9jb2RlcGFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDQyOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRjdiAgICAgICAgICAgICAgPSAkc2VsZi0+e19jb2RlcGFnZX07ICAgIyBUaGUgY29kZSBwYWdlCisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkY3YpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NvdW50cnkoKQorIworIyBTdG9yZXMgdGhlIENPVU5UUlkgYmlmZiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NvdW50cnkgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgICAgICA9IDB4MDA4QzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwNDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKyAgICBteSAkY291bnRyeV9kZWZhdWx0ID0gJHNlbGYtPntfY291bnRyeX07CisgICAgbXkgJGNvdW50cnlfd2luX2luaSA9ICRzZWxmLT57X2NvdW50cnl9OworCisgICAgbXkgJGhlYWRlciAgICAgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2soInZ2IiwgJGNvdW50cnlfZGVmYXVsdCwgJGNvdW50cnlfd2luX2luaSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfaGlkZW9iaigpCisjCisjIFN0b3JlcyB0aGUgSElERU9CSiBiaWZmIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfaGlkZW9iaiB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDhEOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRoaWRlICAgICAgICAgICAgPSAkc2VsZi0+e19oaWRlb2JqfTsgICAgIyBPcHRpb24gdG8gaGlkZSBvYmplY3RzCisKKyAgICBteSAkaGVhZGVyICAgICAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgICAgID0gcGFjaygidiIsICAkaGlkZSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY3VsYXRlX2V4dGVybl9zaXplcygpCisjCisjIFdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBzcGFjZSByZXF1aXJlZCBieSB0aGUgU1VQQk9PSywgRVhURVJOU0hFRVQgYW5kIE5BTUUKKyMgcmVjb3JkcyBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCB0byB0aGUgQk9VTkRTSEVFVCBvZmZzZXRzLgorIworc3ViIF9jYWxjdWxhdGVfZXh0ZXJuX3NpemVzIHsKKworICAgIG15ICRzZWxmICAgPSBzaGlmdDsKKworCisgICAgbXkgJWV4dF9yZWZzICAgICAgICA9ICRzZWxmLT57X3BhcnNlcn0tPmdldF9leHRfc2hlZXRzKCk7CisgICAgbXkgJGV4dF9yZWZfY291bnQgICA9IHNjYWxhciBrZXlzICVleHRfcmVmczsKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMDsKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gMDsKKworCisgICAgaWYgKEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319KSB7CisgICAgICAgIG15ICRpbmRleCAgID0gMDsKKyAgICAgICAgbXkgJGtleSAgICAgPSAiJGluZGV4OiRpbmRleCI7CisKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9KSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIG15ICRkZWZpbmVkX25hbWUgKEB7JHNlbGYtPntfZGVmaW5lZF9uYW1lc319KSB7CisgICAgICAgICRsZW5ndGggKz0gMTkKKyAgICAgICAgICAgICAgICAgICArIGxlbmd0aCgkZGVmaW5lZF9uYW1lLT57bmFtZX0pCisgICAgICAgICAgICAgICAgICAgKyBsZW5ndGgoJGRlZmluZWRfbmFtZS0+e2Zvcm11bGF9KTsKKyAgICB9CisKKworICAgIGZvcmVhY2ggbXkgJHdvcmtzaGVldCAoQHskc2VsZi0+e193b3Jrc2hlZXRzfX0pIHsKKworICAgICAgICBteSAkcm93bWluICAgICAgPSAkd29ya3NoZWV0LT57X3RpdGxlX3Jvd21pbn07CisgICAgICAgIG15ICRjb2xtaW4gICAgICA9ICR3b3Jrc2hlZXQtPntfdGl0bGVfY29sbWlufTsKKyAgICAgICAgbXkgJGZpbHRlciAgICAgID0gJHdvcmtzaGVldC0+e19maWx0ZXJfY291bnR9OworICAgICAgICBteSAka2V5ICAgICAgICAgPSAiJGluZGV4OiRpbmRleCI7CisgICAgICAgICRpbmRleCsrOworCisKKyAgICAgICAgIyBBZGQgYXJlYSBOQU1FIHJlY29yZHMKKyAgICAgICAgIworICAgICAgICBpZiAoZGVmaW5lZCAkd29ya3NoZWV0LT57X3ByaW50X3Jvd21pbn0pIHsKKyAgICAgICAgICAgICRleHRfcmVmc3ska2V5fSA9ICRleHRfcmVmX2NvdW50KysgaWYgbm90IGV4aXN0cyAkZXh0X3JlZnN7JGtleX07CisKKyAgICAgICAgICAgICRsZW5ndGggKz0gMzEgOworICAgICAgICB9CisKKworICAgICAgICAjIEFkZCB0aXRsZSAgTkFNRSByZWNvcmRzCisgICAgICAgICMKKyAgICAgICAgaWYgKGRlZmluZWQgJHJvd21pbiBhbmQgZGVmaW5lZCAkY29sbWluKSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrIGlmIG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICAgICAkbGVuZ3RoICs9IDQ2OworICAgICAgICB9CisgICAgICAgIGVsc2lmIChkZWZpbmVkICRyb3dtaW4gb3IgZGVmaW5lZCAkY29sbWluKSB7CisgICAgICAgICAgICAkZXh0X3JlZnN7JGtleX0gPSAkZXh0X3JlZl9jb3VudCsrIGlmIG5vdCBleGlzdHMgJGV4dF9yZWZzeyRrZXl9OworCisgICAgICAgICAgICAkbGVuZ3RoICs9IDMxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBUT0RPLCBtYXkgbmVlZCB0aGlzIGxhdGVyLgorICAgICAgICB9CisKKworICAgICAgICAjIEFkZCBBdXRvZmlsdGVyICBOQU1FIHJlY29yZHMKKyAgICAgICAgIworICAgICAgICBpZiAoJGZpbHRlcikgeworICAgICAgICAgICAgJGV4dF9yZWZzeyRrZXl9ID0gJGV4dF9yZWZfY291bnQrKyBpZiBub3QgZXhpc3RzICRleHRfcmVmc3ska2V5fTsKKworICAgICAgICAgICAgJGxlbmd0aCArPSAzMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBVcGRhdGUgdGhlIHJlZiBjb3VudHMuCisgICAgJHNlbGYtPntfZXh0X3JlZl9jb3VudH0gPSAkZXh0X3JlZl9jb3VudDsKKyAgICAkc2VsZi0+e19leHRfcmVmc30gICAgICA9IHslZXh0X3JlZnN9OworCisKKyAgICAjIElmIHRoZXJlIGFyZSBubyBleHRlcm5hbCByZWZzIHRoZW4gd2UgZG9uJ3Qgd3JpdGUsIFNVUEJPT0ssIEVYVEVSTlNIRUVUCisgICAgIyBhbmQgTkFNRS4gVGhlcmVmb3JlIHRoZSBsZW5ndGggaXMgMC4KKworICAgIHJldHVybiAkbGVuZ3RoID0gMCBpZiAkZXh0X3JlZl9jb3VudCA9PSAwOworCisKKyAgICAjIFRoZSBTVVBCT09LIHJlY29yZCBpcyA4IGJ5dGVzCisgICAgJGxlbmd0aCArPSA4OworCisgICAgIyBUaGUgRVhURVJOU0hFRVQgcmVjb3JkIGlzIDYgYnl0ZXMgKyA2IGJ5dGVzIGZvciBlYWNoIGV4dGVybmFsIHJlZgorICAgICRsZW5ndGggKz0gNiAqICgxICsgJGV4dF9yZWZfY291bnQpOworCisgICAgcmV0dXJuICRsZW5ndGg7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2FsY3VsYXRlX3NoYXJlZF9zdHJpbmdfc2l6ZXMoKQorIworIyBIYW5kbGluZyBvZiB0aGUgU1NUIGNvbnRpbnVlIGJsb2NrcyBpcyBjb21wbGljYXRlZCBieSB0aGUgbmVlZCB0byBpbmNsdWRlIGFuCisjIGFkZGl0aW9uYWwgY29udGludWF0aW9uIGJ5dGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHN0cmluZyBpcyBzcGxpdCBiZXR3ZWVuCisjIGJsb2NrcyBvciB3aGV0aGVyIGl0IHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jay4gKFRoZXJlIGFyZSBhbHNvCisjIGFkZGl0aW9uYWwgY29tcGxpY2F0aW9ucyB0aGF0IHdpbGwgYXJpc2UgbGF0ZXIgd2hlbi9pZiBSaWNoIFN0cmluZ3MgYXJlCisjIHN1cHBvcnRlZCkuIEFzIHN1Y2ggd2UgY2Fubm90IHVzZSB0aGUgc2ltcGxlIENPTlRJTlVFIG1lY2hhbmlzbSBwcm92aWRlZCBieQorIyB0aGUgX2FkZF9jb250aW51ZSgpIG1ldGhvZCBpbiBCSUZGd3JpdGVyLnBtLiBUaHVzIHdlIGhhdmUgdG8gbWFrZSB0d28gcGFzc2VzCisjIHRocm91Z2ggdGhlIHN0cmluZ3MgZGF0YS4gVGhlIGZpcnN0IGlzIHRvIGNhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgYmxvY2sgc2l6ZXMKKyMgYW5kIHRoZSBzZWNvbmQsIGluIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpLCBpcyB0byB3cml0ZSB0aGUgYWN0dWFsIHN0cmluZ3MuCisjIFRoZSBmaXJzdCBwYXNzIHRocm91Z2ggdGhlIGRhdGEgaXMgYWxzbyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgU1NUCisjIGFuZCBDT05USU5VRSByZWNvcmRzIGZvciB1c2UgaW4gc2V0dGluZyB0aGUgQk9VTkRTSEVFVCByZWNvcmQgb2Zmc2V0cy4gVGhlCisjIGRvd25zaWRlIG9mIHRoaXMgaXMgdGhhdCB0aGUgc2FtZSBhbGdvcml0aG0gcmVwZWF0ZWQgaW4gX3N0b3JlX3NoYXJlZF9zdHJpbmdzLgorIworc3ViIF9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgQHN0cmluZ3M7CisgICAgJCNzdHJpbmdzID0gJHNlbGYtPntfc3RyX3VuaXF1ZX0gLTE7ICMgUHJlLWV4dGVuZCBhcnJheQorCisgICAgd2hpbGUgKG15ICRrZXkgPSBlYWNoICV7JHNlbGYtPntfc3RyX3RhYmxlfX0pIHsKKyAgICAgICAgJHN0cmluZ3NbJHNlbGYtPntfc3RyX3RhYmxlfS0+eyRrZXl9XSA9ICRrZXk7CisgICAgfQorCisgICAgIyBUaGUgU1NUIGRhdGEgY291bGQgYmUgdmVyeSBsYXJnZSwgZnJlZSBzb21lIG1lbW9yeSAobWF5YmUpLgorICAgICRzZWxmLT57X3N0cl90YWJsZX0gPSB1bmRlZjsKKyAgICAkc2VsZi0+e19zdHJfYXJyYXl9ID0gW0BzdHJpbmdzXTsKKworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZ3MgdG8gY2FsY3VsYXRlIHRoZSBDT05USU5VRSBibG9jayBzaXplcy4KKyAgICAjCisgICAgIyBUaGUgU1NUIGJsb2NrcyByZXF1aXJlcyBhIHNwZWNpYWxpc2VkIENPTlRJTlVFIGJsb2NrLCBzbyB3ZSBoYXZlIHRvCisgICAgIyBlbnN1cmUgdGhhdCB0aGUgbWF4aW11bSBkYXRhIGJsb2NrIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBsaW1pdCB1c2VkIGJ5CisgICAgIyBfYWRkX2NvbnRpbnVlKCkgaW4gQklGRndyaXRlci5wbS4gRm9yIHNpbXBsaWNpdHkgd2UgdXNlIHRoZSBzYW1lIHNpemUKKyAgICAjIGZvciB0aGUgU1NUIGFuZCBDT05USU5VRSByZWNvcmRzOgorICAgICMgICA4MjI4IDogTWF4aW11bSBFeGNlbDk3IGJsb2NrIHNpemUKKyAgICAjICAgICAtNCA6IExlbmd0aCBvZiBibG9jayBoZWFkZXIKKyAgICAjICAgICAtOCA6IExlbmd0aCBvZiBhZGRpdGlvbmFsIFNTVCBoZWFkZXIgaW5mb3JtYXRpb24KKyAgICAjICAgICAtOCA6IEFyYml0cmFyeSBudW1iZXIgdG8ga2VlcCB3aXRoaW4gX2FkZF9jb250aW51ZSgpIGxpbWl0CisgICAgIyA9IDgyMDgKKyAgICAjCisgICAgbXkgJGNvbnRpbnVlX2xpbWl0ID0gODIwODsKKyAgICBteSAkYmxvY2tfbGVuZ3RoICAgPSAwOworICAgIG15ICR3cml0dGVuICAgICAgICA9IDA7CisgICAgbXkgQGJsb2NrX3NpemVzOworICAgIG15ICRjb250aW51ZSAgICAgICA9IDA7CisKKyAgICBmb3IgbXkgJHN0cmluZyAoQHN0cmluZ3MpIHsKKworICAgICAgICBteSAkc3RyaW5nX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworICAgICAgICBteSAkZW5jb2RpbmcgICAgICA9IHVucGFjayAieHggQyIsICRzdHJpbmc7CisgICAgICAgIG15ICRzcGxpdF9zdHJpbmcgID0gMDsKKworCisgICAgICAgICMgQmxvY2sgbGVuZ3RoIGlzIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlCisgICAgICAgICMgd3JpdHRlbiBvdXQgaW4gYSBzaW5nbGUgU1NUIG9yIENPTlRJTlVFIGJsb2NrLgorICAgICAgICAjCisgICAgICAgICRibG9ja19sZW5ndGggKz0gJHN0cmluZ19sZW5ndGg7CisKKworICAgICAgICAjIFdlIGNhbiB3cml0ZSB0aGUgc3RyaW5nIGlmIGl0IGRvZXNuJ3QgY3Jvc3MgYSBDT05USU5VRSBib3VuZGFyeQorICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworICAgICAgICAgICAgJHdyaXR0ZW4gKz0gJHN0cmluZ19sZW5ndGg7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKworICAgICAgICAjIERlYWwgd2l0aCB0aGUgY2FzZXMgd2hlcmUgdGhlIG5leHQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4gd2lsbCBleGNlZWQKKyAgICAgICAgIyB0aGUgQ09OVElOVUUgYm91bmRhcnkuIElmIHRoZSBzdHJpbmcgaXMgdmVyeSBsb25nIGl0IG1heSBuZWVkIHRvIGJlCisgICAgICAgICMgd3JpdHRlbiBpbiBtb3JlIHRoYW4gb25lIENPTlRJTlVFIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICB3aGlsZSAoJGJsb2NrX2xlbmd0aCA+PSAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIGEgc3RyaW5nIGlzIGNvbnRpbnVlZCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgICMgbiBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIHN0cmluZyBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICBteSAkaGVhZGVyX2xlbmd0aCAgID0gMzsgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgIG15ICRzcGFjZV9yZW1haW5pbmcgPSAkY29udGludWVfbGltaXQgLSR3cml0dGVuIC0kY29udGludWU7CisKKworICAgICAgICAgICAgIyBVbmljb2RlIGRhdGEgc2hvdWxkIG9ubHkgYmUgc3BsaXQgb24gY2hhciAoMiBieXRlKSBib3VuZGFyaWVzLgorICAgICAgICAgICAgIyBUaGVyZWZvcmUsIGluIHNvbWUgY2FzZXMgd2UgbmVlZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICMgc3BhY2UgYnkgMSBieXRlIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCisgICAgICAgICAgICBteSAkYWxpZ24gPSAwOworCisgICAgICAgICAgICAjIE9ubHkgYXBwbGllcyB0byBVbmljb2RlIHN0cmluZ3MKKyAgICAgICAgICAgIGlmICgkZW5jb2RpbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICMgTWluIHN0cmluZyArIGhlYWRlciBzaXplIC0xCisgICAgICAgICAgICAgICAgJGhlYWRlcl9sZW5ndGggPSA0OworCisgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWlucyAzIGJ5dGUgaGVhZGVyID0+IHNwbGl0IG9uIG9kZCBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBpZiAobm90ICRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIyBTcGxpdCBzZWN0aW9uIHdpdGhvdXQgaGVhZGVyID0+IHNwbGl0IG9uIGV2ZW4gYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc3BsaXRfc3RyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICMgV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBvZiB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgJHdyaXR0ZW4gICAgICArPSAkc3BhY2VfcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgIyBSZWR1Y2UgdGhlIGN1cnJlbnQgYmxvY2sgbGVuZ3RoIGJ5IHRoZSBhbW91bnQgd3JpdHRlbgorICAgICAgICAgICAgICAgICRibG9ja19sZW5ndGggLT0gJGNvbnRpbnVlX2xpbWl0IC0kY29udGludWUgLSRhbGlnbjsKKworICAgICAgICAgICAgICAgICMgU3RvcmUgdGhlIG1heCBzaXplIGZvciB0aGlzIGJsb2NrCisgICAgICAgICAgICAgICAgcHVzaCBAYmxvY2tfc2l6ZXMsICRjb250aW51ZV9saW1pdCAtJGFsaWduOworCisgICAgICAgICAgICAgICAgIyBJZiB0aGUgY3VycmVudCBzdHJpbmcgd2FzIHNwbGl0IHRoZW4gdGhlIG5leHQgQ09OVElOVUUgYmxvY2sKKyAgICAgICAgICAgICAgICAjIHNob3VsZCBoYXZlIHRoZSBzdHJpbmcgY29udGludWUgZmxhZyAoZ3JiaXQpIHNldCB1bmxlc3MgdGhlCisgICAgICAgICAgICAgICAgIyBzcGxpdCBzdHJpbmcgZml0cyBleGFjdGx5IGludG8gdGhlIHJlbWFpbmluZyBzcGFjZS4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgaWYgKCRibG9ja19sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkY29udGludWUgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBTdG9yZSB0aGUgbWF4IHNpemUgZm9yIHRoaXMgYmxvY2sKKyAgICAgICAgICAgICAgICBwdXNoIEBibG9ja19zaXplcywgJHdyaXR0ZW4gKyRjb250aW51ZTsKKworICAgICAgICAgICAgICAgICMgTm90IGVub3VnaCBzcGFjZSB0byBzdGFydCB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgJGJsb2NrX2xlbmd0aCAtPSAkY29udGludWVfbGltaXQgLSRzcGFjZV9yZW1haW5pbmcgLSRjb250aW51ZTsKKyAgICAgICAgICAgICAgICAkY29udGludWUgPSAwOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgSWYgdGhlIHN0cmluZyAob3Igc3Vic3RyKSBpcyBzbWFsbCBlbm91Z2ggd2UgY2FuIHdyaXRlIGl0IGluIHRoZQorICAgICAgICAgICAgIyBuZXcgQ09OVElOVUUgYmxvY2suIEVsc2UsIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4gdG8gd3JpdGUgaXQgaW4KKyAgICAgICAgICAgICMgb25lIG9yIG1vcmUgQ09OVElOVUUgYmxvY2tzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gJGJsb2NrX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICMgU3RvcmUgdGhlIG1heCBzaXplIGZvciB0aGUgbGFzdCBibG9jayB1bmxlc3MgaXQgaXMgZW1wdHkKKyAgICBwdXNoIEBibG9ja19zaXplcywgJHdyaXR0ZW4gKyRjb250aW51ZSBpZiAkd3JpdHRlbiArJGNvbnRpbnVlOworCisKKyAgICAkc2VsZi0+e19zdHJfYmxvY2tfc2l6ZXN9ID0gW0BibG9ja19zaXplc107CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIFNTVCBhbmQgYXNzb2NpYXRlZCBDT05USU5VRXMgKGlmIGFueSkuCisgICAgIyBUaGUgU1NUIHJlY29yZCB3aWxsIGhhdmUgYSBsZW5ndGggZXZlbiBpZiBpdCBjb250YWlucyBubyBzdHJpbmdzLgorICAgICMgVGhpcyBsZW5ndGggaXMgcmVxdWlyZWQgdG8gc2V0IHRoZSBvZmZzZXRzIGluIHRoZSBCT1VORFNIRUVUIHJlY29yZHMgc2luY2UKKyAgICAjIHRoZXkgbXVzdCBiZSB3cml0dGVuIGJlZm9yZSB0aGUgU1NUIHJlY29yZHMKKyAgICAjCisgICAgbXkgJGxlbmd0aCAgPSAxMjsKKyAgICAkbGVuZ3RoICAgICs9ICAgICBzaGlmdCBAYmxvY2tfc2l6ZXMgaWYgICAgQGJsb2NrX3NpemVzOyAjIFNTVAorICAgICRsZW5ndGggICAgKz0gNCArIHNoaWZ0IEBibG9ja19zaXplcyB3aGlsZSBAYmxvY2tfc2l6ZXM7ICMgQ09OVElOVUVzCisKKyAgICByZXR1cm4gJGxlbmd0aDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpCisjCisjIFdyaXRlIGFsbCBvZiB0aGUgd29ya2Jvb2tzIHN0cmluZ3MgaW50byBhbiBpbmRleGVkIGFycmF5LgorIworIyBTZWUgdGhlIGNvbW1lbnRzIGluIF9jYWxjdWxhdGVfc2hhcmVkX3N0cmluZ19zaXplcygpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIworIyBXZSBhbHNvIHVzZSB0aGlzIHJvdXRpbmUgdG8gcmVjb3JkIHRoZSBvZmZzZXRzIHJlcXVpcmVkIGJ5IHRoZSBFWFRTU1QgdGFibGUuCisjIEluIG9yZGVyIHRvIGRvIHRoaXMgd2UgZmlyc3QgaWRlbnRpZnkgdGhlIGZpcnN0IHN0cmluZyBpbiBhbiBFWFRTU1QgYnVja2V0CisjIGFuZCB0aGVuIHN0b3JlIGl0cyBnbG9iYWwgYW5kIGxvY2FsIG9mZnNldCB3aXRoaW4gdGhlIFNTVCB0YWJsZS4gVGhlIG9mZnNldAorIyBvY2N1cnMgd2hlcmV2ZXIgdGhlIHN0YXJ0IG9mIHRoZSBidWNrZXQgc3RyaW5nIGlzIHdyaXR0ZW4gb3V0IHZpYSBhcHBlbmQoKS4KKyMKK3N1YiBfc3RvcmVfc2hhcmVkX3N0cmluZ3MgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15IEBzdHJpbmdzID0gQHskc2VsZi0+e19zdHJfYXJyYXl9fTsKKworCisgICAgbXkgJHJlY29yZCAgICAgICAgICAgICAgPSAweDAwRkM7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgICAgID0gMHgwMDA4OyAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICR0b3RhbCAgICAgICAgICAgICAgID0gMHgwMDAwOworCisgICAgIyBJdGVyYXRlIHRocm91Z2ggdGhlIHN0cmluZ3MgdG8gY2FsY3VsYXRlIHRoZSBDT05USU5VRSBibG9jayBzaXplcworICAgIG15ICRjb250aW51ZV9saW1pdCA9IDgyMDg7CisgICAgbXkgJGJsb2NrX2xlbmd0aCAgID0gMDsKKyAgICBteSAkd3JpdHRlbiAgICAgICAgPSAwOworICAgIG15ICRjb250aW51ZSAgICAgICA9IDA7CisKKyAgICAjIFRoZSBTU1QgYW5kIENPTlRJTlVFIGJsb2NrIHNpemVzIGhhdmUgYmVlbiBwcmUtY2FsY3VsYXRlZCBieQorICAgICMgX2NhbGN1bGF0ZV9zaGFyZWRfc3RyaW5nX3NpemVzKCkKKyAgICBteSBAYmxvY2tfc2l6ZXMgICAgPSBAeyRzZWxmLT57X3N0cl9ibG9ja19zaXplc319OworCisKKyAgICAjIFRoZSBTU1QgcmVjb3JkIGlzIHJlcXVpcmVkIGV2ZW4gaWYgaXQgY29udGFpbnMgbm8gc3RyaW5ncy4gVGh1cyB3ZSB3aWxsCisgICAgIyBhbHdheXMgaGF2ZSBhIGxlbmd0aAorICAgICMKKyAgICBpZiAoQGJsb2NrX3NpemVzKSB7CisgICAgICAgICRsZW5ndGggPSA4ICsgc2hpZnQgQGJsb2NrX3NpemVzOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBObyBzdHJpbmdzCisgICAgICAgICRsZW5ndGggPSA4OworICAgIH0KKworCisgICAgIyBJbml0aWFsaXNlIHZhcmlhYmxlcyB1c2VkIHRvIHRyYWNrIEVYVFNTVCBidWNrZXQgb2Zmc2V0cy4KKyAgICBteSAkZXh0c3N0X3N0cl9udW0gID0gLTE7CisgICAgbXkgJHNzdF9ibG9ja19zdGFydCA9ICRzZWxmLT57X2RhdGFzaXplfTsKKworCisgICAgIyBXcml0ZSB0aGUgU1NUIGJsb2NrIGhlYWRlciBpbmZvcm1hdGlvbgorICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygiVlYiLCAkc2VsZi0+e19zdHJfdG90YWx9LCAkc2VsZi0+e19zdHJfdW5pcXVlfSk7CisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAjIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc3RyaW5ncyBhbmQgd3JpdGUgdGhlbSBvdXQKKyAgICBmb3IgbXkgJHN0cmluZyAoQHN0cmluZ3MpIHsKKworICAgICAgICBteSAkc3RyaW5nX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworICAgICAgICBteSAkZW5jb2RpbmcgICAgICA9IHVucGFjayAieHggQyIsICRzdHJpbmc7CisgICAgICAgIG15ICRzcGxpdF9zdHJpbmcgID0gMDsKKyAgICAgICAgbXkgJGJ1Y2tldF9zdHJpbmcgPSAwOyAjIFVzZWQgdG8gdHJhY2sgRVhUU1NUIGJ1Y2tldCBvZmZzZXRzLgorCisKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGF0IHRoZSBzdGFydCBvZiBhIEVYVFNTVCBidWNrZXQuCisgICAgICAgIGlmICgrKyRleHRzc3Rfc3RyX251bSAlICRzZWxmLT57X2V4dHNzdF9idWNrZXRfc2l6ZX0gPT0gMCkgeworICAgICAgICAgICAgJGJ1Y2tldF9zdHJpbmcgPSAxOworICAgICAgICB9CisKKworICAgICAgICAjIEJsb2NrIGxlbmd0aCBpcyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBzdHJpbmdzIHRoYXQgd2lsbCBiZQorICAgICAgICAjIHdyaXR0ZW4gb3V0IGluIGEgc2luZ2xlIFNTVCBvciBDT05USU5VRSBibG9jay4KKyAgICAgICAgIworICAgICAgICAkYmxvY2tfbGVuZ3RoICs9ICRzdHJpbmdfbGVuZ3RoOworCisKKyAgICAgICAgIyBXZSBjYW4gd3JpdGUgdGhlIHN0cmluZyBpZiBpdCBkb2Vzbid0IGNyb3NzIGEgQ09OVElOVUUgYm91bmRhcnkKKyAgICAgICAgaWYgKCRibG9ja19sZW5ndGggPCAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgIGlmICgkYnVja2V0X3N0cmluZykgeworICAgICAgICAgICAgICAgIG15ICRnbG9iYWxfb2Zmc2V0ICAgPSAkc2VsZi0+e19kYXRhc2l6ZX07CisgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICBwdXNoIEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fSwgWyRnbG9iYWxfb2Zmc2V0LCAkbG9jYWxfb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICAkYnVja2V0X3N0cmluZyA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRzdHJpbmcpOworICAgICAgICAgICAgJHdyaXR0ZW4gKz0gJHN0cmluZ19sZW5ndGg7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9CisKKworICAgICAgICAjIERlYWwgd2l0aCB0aGUgY2FzZXMgd2hlcmUgdGhlIG5leHQgc3RyaW5nIHRvIGJlIHdyaXR0ZW4gd2lsbCBleGNlZWQKKyAgICAgICAgIyB0aGUgQ09OVElOVUUgYm91bmRhcnkuIElmIHRoZSBzdHJpbmcgaXMgdmVyeSBsb25nIGl0IG1heSBuZWVkIHRvIGJlCisgICAgICAgICMgd3JpdHRlbiBpbiBtb3JlIHRoYW4gb25lIENPTlRJTlVFIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICB3aGlsZSAoJGJsb2NrX2xlbmd0aCA+PSAkY29udGludWVfbGltaXQpIHsKKworICAgICAgICAgICAgIyBXZSBuZWVkIHRvIGF2b2lkIHRoZSBjYXNlIHdoZXJlIGEgc3RyaW5nIGlzIGNvbnRpbnVlZCBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgICMgbiBieXRlcyB0aGF0IGNvbnRhaW4gdGhlIHN0cmluZyBoZWFkZXIgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAjCisgICAgICAgICAgICBteSAkaGVhZGVyX2xlbmd0aCAgID0gMzsgIyBNaW4gc3RyaW5nICsgaGVhZGVyIHNpemUgLTEKKyAgICAgICAgICAgIG15ICRzcGFjZV9yZW1haW5pbmcgPSAkY29udGludWVfbGltaXQgLSR3cml0dGVuIC0kY29udGludWU7CisKKworICAgICAgICAgICAgIyBVbmljb2RlIGRhdGEgc2hvdWxkIG9ubHkgYmUgc3BsaXQgb24gY2hhciAoMiBieXRlKSBib3VuZGFyaWVzLgorICAgICAgICAgICAgIyBUaGVyZWZvcmUsIGluIHNvbWUgY2FzZXMgd2UgbmVlZCB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBhdmFpbGFibGUKKyAgICAgICAgICAgICMgc3BhY2UgYnkgMSBieXRlIHRvIGVuc3VyZSB0aGUgY29ycmVjdCBhbGlnbm1lbnQuCisgICAgICAgICAgICBteSAkYWxpZ24gPSAwOworCisgICAgICAgICAgICAjIE9ubHkgYXBwbGllcyB0byBVbmljb2RlIHN0cmluZ3MKKyAgICAgICAgICAgIGlmICgkZW5jb2RpbmcgPT0gMSkgeworICAgICAgICAgICAgICAgICMgTWluIHN0cmluZyArIGhlYWRlciBzaXplIC0xCisgICAgICAgICAgICAgICAgJGhlYWRlcl9sZW5ndGggPSA0OworCisgICAgICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICAjIFN0cmluZyBjb250YWlucyAzIGJ5dGUgaGVhZGVyID0+IHNwbGl0IG9uIG9kZCBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICBpZiAobm90ICRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIyBTcGxpdCBzZWN0aW9uIHdpdGhvdXQgaGVhZGVyID0+IHNwbGl0IG9uIGV2ZW4gYm91bmRhcnkKKyAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRzcGxpdF9zdHJpbmcgYW5kICRzcGFjZV9yZW1haW5pbmcgJSAyID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRzcGFjZV9yZW1haW5pbmctLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICRhbGlnbiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAkc3BsaXRfc3RyaW5nID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgaWYgKCRzcGFjZV9yZW1haW5pbmcgPiAkaGVhZGVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICMgV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSBvZiB0aGUgc3RyaW5nIGluIHRoZSBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICAgICAgbXkgJHRtcCA9IHN1YnN0ciAkc3RyaW5nLCAwLCAkc3BhY2VfcmVtYWluaW5nOworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgICAgICBpZiAoJGJ1Y2tldF9zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGdsb2JhbF9vZmZzZXQgICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2V4dHNzdF9vZmZzZXRzfX0sIFskZ2xvYmFsX29mZnNldCwgJGxvY2FsX29mZnNldF07CisgICAgICAgICAgICAgICAgICAgICRidWNrZXRfc3RyaW5nID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkdG1wKTsKKworCisgICAgICAgICAgICAgICAgIyBUaGUgcmVtYWluZGVyIHdpbGwgYmUgd3JpdHRlbiBpbiB0aGUgbmV4dCBibG9jayhzKQorICAgICAgICAgICAgICAgICRzdHJpbmcgPSBzdWJzdHIgJHN0cmluZywgJHNwYWNlX3JlbWFpbmluZzsKKworICAgICAgICAgICAgICAgICMgUmVkdWNlIHRoZSBjdXJyZW50IGJsb2NrIGxlbmd0aCBieSB0aGUgYW1vdW50IHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAkYmxvY2tfbGVuZ3RoIC09ICRjb250aW51ZV9saW1pdCAtJGNvbnRpbnVlIC0kYWxpZ247CisKKyAgICAgICAgICAgICAgICAjIElmIHRoZSBjdXJyZW50IHN0cmluZyB3YXMgc3BsaXQgdGhlbiB0aGUgbmV4dCBDT05USU5VRSBibG9jaworICAgICAgICAgICAgICAgICMgc2hvdWxkIGhhdmUgdGhlIHN0cmluZyBjb250aW51ZSBmbGFnIChncmJpdCkgc2V0IHVubGVzcyB0aGUKKyAgICAgICAgICAgICAgICAjIHNwbGl0IHN0cmluZyBmaXRzIGV4YWN0bHkgaW50byB0aGUgcmVtYWluaW5nIHNwYWNlLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgJGNvbnRpbnVlID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBOb3QgZW5vdWdoIHNwYWNlIHRvIHN0YXJ0IHRoZSBzdHJpbmcgaW4gdGhlIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgICAgICAkYmxvY2tfbGVuZ3RoIC09ICRjb250aW51ZV9saW1pdCAtJHNwYWNlX3JlbWFpbmluZyAtJGNvbnRpbnVlOworICAgICAgICAgICAgICAgICRjb250aW51ZSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIENPTlRJTlVFIGJsb2NrIGhlYWRlcgorICAgICAgICAgICAgaWYgKEBibG9ja19zaXplcykgeworICAgICAgICAgICAgICAgICRzc3RfYmxvY2tfc3RhcnQ9ICRzZWxmLT57X2RhdGFzaXplfTsgIyBSZXNldCBFWFRTU1Qgb2Zmc2V0LgorCisgICAgICAgICAgICAgICAgJHJlY29yZCAgICAgICAgID0gMHgwMDNDOworICAgICAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IHNoaWZ0IEBibG9ja19zaXplczsKKworICAgICAgICAgICAgICAgICRoZWFkZXIgICAgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAgICAgJGhlYWRlciAgICAgICAgLj0gcGFjaygiQyIsICRlbmNvZGluZykgaWYgJGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICMgSWYgdGhlIHN0cmluZyAob3Igc3Vic3RyKSBpcyBzbWFsbCBlbm91Z2ggd2UgY2FuIHdyaXRlIGl0IGluIHRoZQorICAgICAgICAgICAgIyBuZXcgQ09OVElOVUUgYmxvY2suIEVsc2UsIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4gdG8gd3JpdGUgaXQgaW4KKyAgICAgICAgICAgICMgb25lIG9yIG1vcmUgQ09OVElOVUUgYmxvY2tzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiAoJGJsb2NrX2xlbmd0aCA8ICRjb250aW51ZV9saW1pdCkgeworCisgICAgICAgICAgICAgICAgIyBTdG9yZSBsb2NhdGlvbiBvZiBFWFRTU1QgYnVja2V0IHN0cmluZy4KKyAgICAgICAgICAgICAgICBpZiAoJGJ1Y2tldF9zdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGdsb2JhbF9vZmZzZXQgICA9ICRzZWxmLT57X2RhdGFzaXplfTsKKyAgICAgICAgICAgICAgICAgICAgbXkgJGxvY2FsX29mZnNldCAgICA9ICRzZWxmLT57X2RhdGFzaXplfSAtICRzc3RfYmxvY2tfc3RhcnQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2V4dHNzdF9vZmZzZXRzfX0sIFskZ2xvYmFsX29mZnNldCwgJGxvY2FsX29mZnNldF07CisKKyAgICAgICAgICAgICAgICAgICAgJGJ1Y2tldF9zdHJpbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkc3RyaW5nKTsKKworICAgICAgICAgICAgICAgICR3cml0dGVuID0gJGJsb2NrX2xlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICR3cml0dGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jYWxjdWxhdGVfZXh0c3N0X3NpemUKKyMKKyMgVGhlIG51bWJlciBvZiBidWNrZXRzIHVzZWQgaW4gdGhlIEVYVFNTVCBpcyBiZXR3ZWVuIDAgYW5kIDEyOC4gVGhlIG51bWJlciBvZgorIyBzdHJpbmdzIHBlciBidWNrZXQgKGJ1Y2tldCBzaXplKSBoYXMgYSBtaW5pbXVtIHZhbHVlIG9mIDggYW5kIGEgdGhlb3JldGljYWwKKyMgbWF4aW11bSBvZiAyXjE2LiBGb3IgIm51bWJlciBvZiBzdHJpbmdzIiA8IDEwMjQgdGhlcmUgaXMgYSBjb25zdGFudCBidWNrZXQKKyMgc2l6ZSBvZiA4LiBUaGUgZm9sbG93aW5nIGFsZ29yaXRobSBnZW5lcmF0ZXMgdGhlIHNhbWUgc2l6ZS9idWNrZXQgcmF0aW8KKyMgYXMgRXhjZWwuCisjCitzdWIgX2NhbGN1bGF0ZV9leHRzc3Rfc2l6ZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdW5pcXVlX3N0cmluZ3MgID0gJHNlbGYtPntfc3RyX3VuaXF1ZX07CisKKyAgICBteSAkYnVja2V0X3NpemU7CisgICAgbXkgJGJ1Y2tldHM7CisKKyAgICBpZiAoJHVuaXF1ZV9zdHJpbmdzIDwgMTAyNCkgeworICAgICAgICAkYnVja2V0X3NpemUgPSA4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGJ1Y2tldF9zaXplID0gMSArIGludCgkdW5pcXVlX3N0cmluZ3MgLyAxMjgpOworICAgIH0KKworICAgICRidWNrZXRzID0gaW50KCgkdW5pcXVlX3N0cmluZ3MgKyAkYnVja2V0X3NpemUgLTEpICAvICRidWNrZXRfc2l6ZSk7CisKKworICAgICRzZWxmLT57X2V4dHNzdF9idWNrZXRzfSAgICAgICAgPSAkYnVja2V0cyA7CisgICAgJHNlbGYtPntfZXh0c3N0X2J1Y2tldF9zaXplfSAgICA9ICRidWNrZXRfc2l6ZTsKKworCisgICAgcmV0dXJuIDYgKyA4ICogJGJ1Y2tldHM7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0c3N0CisjCisjIFdyaXRlIEVYVFNTVCB0YWJsZSB1c2luZyB0aGUgb2Zmc2V0cyBjYWxjdWxhdGVkIGluIF9zdG9yZV9zaGFyZWRfc3RyaW5ncygpLgorIworc3ViIF9zdG9yZV9leHRzc3QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15IEBvZmZzZXRzICAgICA9IEB7JHNlbGYtPntfZXh0c3N0X29mZnNldHN9fTsKKyAgICBteSAkYnVja2V0X3NpemUgPSAkc2VsZi0+e19leHRzc3RfYnVja2V0X3NpemV9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMEZGOyAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMiArIDggKiBAb2Zmc2V0czsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjayAndnYnLCAgICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjayAndicsICAgICRidWNrZXRfc2l6ZSw7CisKKyAgICBmb3IgbXkgJG9mZnNldCAoQG9mZnNldHMpIHsKKyAgICAgICAkZGF0YSAuPSBwYWNrICdWdnYnLCAkb2Zmc2V0LT5bMF0sICRvZmZzZXQtPlsxXSwgMDsKKyAgICB9CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisKKworIworIyBNZXRob2RzIHJlbGF0ZWQgdG8gY29tbWVudHMgYW5kIE1TTyBvYmplY3RzLgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9hZGRfbXNvX2RyYXdpbmdfZ3JvdXAoKQorIworIyBXcml0ZSB0aGUgTVNPRFJBV0lOR0dST1VQIHJlY29yZCB0aGF0IGtlZXBzIHRyYWNrIG9mIHRoZSBFc2NoZXIgZHJhd2luZworIyBvYmplY3RzIGluIHRoZSBmaWxlIHN1Y2ggYXMgaW1hZ2VzLCBjb21tZW50cyBhbmQgZmlsdGVycy4KKyMKK3N1YiBfYWRkX21zb19kcmF3aW5nX2dyb3VwIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X21zb19zaXplfTsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMEVCOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRkYXRhICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdnX2NvbnRhaW5lcigpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGdnKEB7JHNlbGYtPntfbXNvX2NsdXN0ZXJzfX0pOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lcigpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29faW1hZ2VzKEAkXykgZm9yIEB7JHNlbGYtPntfaW1hZ2VzX2RhdGF9fTsKKyAgICAgICAkZGF0YSAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdCgpOworICAgICAgICRkYXRhICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BsaXRfbWVudV9jb2xvcnMoKTsKKworICAgICAgICRsZW5ndGggID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlKCRoZWFkZXIgLiAkZGF0YSk7CisKKyAgICByZXR1cm4gJGhlYWRlciAuICRkYXRhOyAjIEZvciB0ZXN0aW5nIG9ubHkuCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlKCkKKyMKKyMgU2VlIGZpcnN0IHRoZSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcjo6X2FkZF9jb250aW51ZSgpIG1ldGhvZC4KKyMKKyMgQWRkIHNwZWNpYWxpc2VkIENPTlRJTlVFIGhlYWRlcnMgdG8gbGFyZ2UgTVNPRFJBV0lOR0dST1VQIGRhdGEgYmxvY2suCisjIFdlIHVzZSB0aGUgRXhjZWwgOTcgbWF4IGJsb2NrIHNpemUgb2YgODIyOCAtIDQgYnl0ZXMgZm9yIHRoZSBoZWFkZXIgPSA4MjI0LgorIworIyBUaGUgc3RydWN0dXJlIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhlIGRhdGEgYmxvY2s6CisjCisjICAgICBDYXNlIDE6ICA8PSAgIDgyMjQgYnl0ZXMgICAgICAxIE1TT0RSQVdJTkdHUk9VUAorIyAgICAgQ2FzZSAyOiAgPD0gMio4MjI0IGJ5dGVzICAgICAgMSBNU09EUkFXSU5HR1JPVVAgKyAxIENPTlRJTlVFCisjICAgICBDYXNlIDM6ICA+ICAyKjgyMjQgYnl0ZXMgICAgICAyIE1TT0RSQVdJTkdHUk9VUCArIG4gQ09OVElOVUUKKyMKK3N1YiBfYWRkX21zb19kcmF3aW5nX2dyb3VwX2NvbnRpbnVlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJGRhdGEgICAgICAgID0gJF9bMF07CisgICAgbXkgJGxpbWl0ICAgICAgID0gODIyOCAtNDsKKyAgICBteSAkbXNvX2dyb3VwICAgPSAweDAwRUI7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkY29udGludWUgICAgPSAweDAwM0M7ICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkYmxvY2tfY291bnQgPSAxOworICAgIG15ICRoZWFkZXI7CisgICAgbXkgJHRtcDsKKworICAgICMgSWdub3JlIHRoZSBiYXNlIGNsYXNzIF9hZGRfY29udGludWUoKSBtZXRob2QuCisgICAgJHNlbGYtPntfaWdub3JlX2NvbnRpbnVlfSA9IDE7CisKKyAgICAjIENhc2UgMSBhYm92ZS4gSnVzdCByZXR1cm4gdGhlIGRhdGEgYXMgaXQgaXMuCisgICAgaWYgKGxlbmd0aCAkZGF0YSA8PSAkbGltaXQpIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGRhdGEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgIyBDaGFuZ2UgbGVuZ3RoIGZpZWxkIG9mIHRoZSBmaXJzdCBNU09EUkFXSU5HR1JPVVAgYmxvY2suIENhc2UgMiBhbmQgMy4KKyAgICAkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQgKzQsICIiKTsKKyAgICBzdWJzdHIoJHRtcCwgMiwgMiwgcGFjaygidiIsICRsaW1pdCkpOworICAgICRzZWxmLT5fYXBwZW5kKCR0bXApOworCisKKyAgICAjIEFkZCBNU09EUkFXSU5HR1JPVVAgYW5kIENPTlRJTlVFIGJsb2NrcyBmb3IgQ2FzZSAzIGFib3ZlLgorICAgIHdoaWxlIChsZW5ndGgoJGRhdGEpID4gJGxpbWl0KSB7CisgICAgICAgIGlmICgkYmxvY2tfY291bnQgPT0gMSkgeworICAgICAgICAgICAgIyBBZGQgZXh0cmEgTVNPRFJBV0lOR0dST1VQIGJsb2NrIGhlYWRlci4KKyAgICAgICAgICAgICRoZWFkZXIgPSBwYWNrKCJ2diIsICRtc29fZ3JvdXAsICRsaW1pdCk7CisgICAgICAgICAgICAkYmxvY2tfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgQWRkIG5vcm1hbCBDT05USU5VRSBoZWFkZXIuCisgICAgICAgICAgICAkaGVhZGVyID0gcGFjaygidnYiLCAkY29udGludWUsICRsaW1pdCk7CisgICAgICAgIH0KKworICAgICAgICAkdG1wID0gc3Vic3RyKCRkYXRhLCAwLCAkbGltaXQsICIiKTsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJHRtcCk7CisgICAgfQorCisKKyAgICAjIExhc3QgQ09OVElOVUUgYmxvY2sgZm9yIHJlbWFpbmluZyBkYXRhLiBDYXNlIDIgYW5kIDMgYWJvdmUuCisgICAgJGhlYWRlciA9IHBhY2soInZ2IiwgJGNvbnRpbnVlLCBsZW5ndGgoJGRhdGEpKTsKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICMgVHVybiB0aGUgYmFzZSBjbGFzcyBfYWRkX2NvbnRpbnVlKCkgbWV0aG9kIGJhY2sgb24uCisgICAgJHNlbGYtPntfaWdub3JlX2NvbnRpbnVlfSA9IDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnZ19jb250YWluZXIoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIERnZ0NvbnRhaW5lciByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX2RnZ19jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDA7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkc2VsZi0+e19tc29fc2l6ZX0gLTEyOyAjIC00IChiaWZmIGhlYWRlcikgLTggKGZvciB0aGlzKS4KKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnZygpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGdnIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fZGdnIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICAgICAgPSAweEYwMDY7CisgICAgbXkgJHZlcnNpb24gICAgICAgICA9IDA7CisgICAgbXkgJGluc3RhbmNlICAgICAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICAgICAgPSB1bmRlZjsgIyBDYWxjdWxhdGUgYXV0b21hdGljYWxseS4KKworICAgIG15ICRtYXhfc3BpZCAgICAgICAgPSAkX1swXTsKKyAgICBteSAkbnVtX2NsdXN0ZXJzICAgID0gJF9bMV07CisgICAgbXkgJHNoYXBlc19zYXZlZCAgICA9ICRfWzJdOworICAgIG15ICRkcmF3aW5nc19zYXZlZCAgPSAkX1szXTsKKyAgICBteSAkY2x1c3RlcnMgICAgICAgID0gJF9bNF07CisKKyAgICAkZGF0YSAgICAgICAgICAgICAgID0gcGFjayAiVlZWViIsICAkbWF4X3NwaWQsICAgICAkbnVtX2NsdXN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaGFwZXNfc2F2ZWQsICRkcmF3aW5nc19zYXZlZDsKKworICAgIGZvciBteSAkYXJlZiAoQCRjbHVzdGVycykgeworICAgICAgICBteSAkZHJhd2luZ19pZCAgICAgID0gJGFyZWYtPlswXTsKKyAgICAgICAgbXkgJHNoYXBlX2lkc191c2VkICA9ICRhcmVmLT5bMV07CisKKyAgICAgICAgJGRhdGEgICAgICAgICAgICAgIC49IHBhY2sgIlZWIiwgICRkcmF3aW5nX2lkLCAkc2hhcGVfaWRzX3VzZWQ7CisgICAgfQorCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQnN0b3JlQ29udGFpbmVyIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYnN0b3JlX2NvbnRhaW5lciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIHJldHVybiAnJyB1bmxlc3MgJHNlbGYtPntfaW1hZ2VzX3NpemV9OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDAxOworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2RhdGF9fTsgIyBOdW1iZXIgb2YgaW1hZ2VzLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9ICRzZWxmLT57X2ltYWdlc19zaXplfSArOCAqJGluc3RhbmNlOworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29faW1hZ2VzKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBCc3RvcmVDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HR1JPVVAuCisjCitzdWIgX3N0b3JlX21zb19pbWFnZXMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVmX2NvdW50ICAgPSAkX1swXTsKKyAgICBteSAkaW1hZ2VfdHlwZSAgPSAkX1sxXTsKKyAgICBteSAkaW1hZ2UgICAgICAgPSAkX1syXTsKKyAgICBteSAkc2l6ZSAgICAgICAgPSAkX1szXTsKKyAgICBteSAkY2hlY2tzdW0xICAgPSAkX1s0XTsKKyAgICBteSAkY2hlY2tzdW0yICAgPSAkX1s1XTsKKworICAgIG15ICRibGlwX3N0b3JlX2VudHJ5ID0gICRzZWxmLT5fc3RvcmVfbXNvX2JsaXBfc3RvcmVfZW50cnkoJHJlZl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbWFnZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tzdW0xKTsKKworICAgIG15ICRibGlwICAgICAgICAgICAgID0gICRzZWxmLT5fc3RvcmVfbXNvX2JsaXAoJGltYWdlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGVja3N1bTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2hlY2tzdW0yKTsKKworICAgIHJldHVybiAkYmxpcF9zdG9yZV9lbnRyeSAuICRibGlwOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2JsaXBfc3RvcmVfZW50cnkoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIEJsaXBTdG9yZUVudHJ5IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYmxpcF9zdG9yZV9lbnRyeSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWZfY291bnQgICA9ICRfWzBdOworICAgIG15ICRpbWFnZV90eXBlICA9ICRfWzFdOworICAgIG15ICRzaXplICAgICAgICA9ICRfWzJdOworICAgIG15ICRjaGVja3N1bTEgICA9ICRfWzNdOworCisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDc7CisgICAgbXkgJHZlcnNpb24gICAgID0gMjsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAkaW1hZ2VfdHlwZTsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkc2l6ZSArNjE7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygnQycsICAkaW1hZ2VfdHlwZSkgICAjIFdpbjMyCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAkaW1hZ2VfdHlwZSkgICAjIE1hYworICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0gqJywgJGNoZWNrc3VtMSkgICAgIyBVaWQgY2hlY2tzdW0KKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCd2JywgIDB4RkYpICAgICAgICAgICMgVGFnCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnVicsICAkc2l6ZSArMjUpICAgICAjIE5leHQgQmxpcCBzaXplCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnVicsICAkcmVmX2NvdW50KSAgICAjIEltYWdlIHJlZiBjb3VudAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ1YnLCAgMHgwMDAwMDAwMCkgICAgIyBGaWxlIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBVc2FnZQorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBOYW1lIGxlbmd0aAorICAgICAgICAgICAgICAgICAgICAuIHBhY2soJ0MnLCAgMHgwMCkgICAgICAgICAgIyBVbnVzZWQKKyAgICAgICAgICAgICAgICAgICAgLiBwYWNrKCdDJywgIDB4MDApICAgICAgICAgICMgVW51c2VkCisgICAgICAgICAgICAgICAgICAgIDsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19ibGlwKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBCbGlwIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lOR0dST1VQLgorIworc3ViIF9zdG9yZV9tc29fYmxpcCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRpbWFnZV90eXBlICA9ICRfWzBdOworICAgIG15ICRpbWFnZV9kYXRhICA9ICRfWzFdOworICAgIG15ICRzaXplICAgICAgICA9ICRfWzJdOworICAgIG15ICRjaGVja3N1bTEgICA9ICRfWzNdOworICAgIG15ICRjaGVja3N1bTIgICA9ICRfWzRdOworICAgIG15ICRpbnN0YW5jZTsKKworICAgICRpbnN0YW5jZSA9IDB4MDQ2QSBpZiAkaW1hZ2VfdHlwZSA9PSA1OyAjIEpQRworICAgICRpbnN0YW5jZSA9IDB4MDZFMCBpZiAkaW1hZ2VfdHlwZSA9PSA2OyAjIFBORworICAgICRpbnN0YW5jZSA9IDB4MDdBOSBpZiAkaW1hZ2VfdHlwZSA9PSA3OyAjIEJNUAorCisgICAgIyBCTVBzIGNvbnRhaW4gYW4gZXh0cmEgY2hlY2tzdW0gZm9yIHRoZSBzdHJpcHBlZCBkYXRhLgorICAgIGlmICggJGltYWdlX3R5cGUgPT0gNykgeworICAgICAgICAkY2hlY2tzdW0xID0gJGNoZWNrc3VtMiAuICRjaGVja3N1bTE7CisgICAgfQorCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDE4ICsgJGltYWdlX3R5cGU7CisgICAgbXkgJHZlcnNpb24gICAgID0gMHgwMDAwOworICAgIG15ICRsZW5ndGggICAgICA9ICRzaXplICsxNzsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCdIKicsICRjaGVja3N1bTEpICMgVWlkIGNoZWNrc3VtCisgICAgICAgICAgICAgICAgICAgIC4gcGFjaygnQycsICAweEZGKSAgICAgICAjIFRhZworICAgICAgICAgICAgICAgICAgICAuICRpbWFnZV9kYXRhICAgICAgICAgICAgIyBJbWFnZQorICAgICAgICAgICAgICAgICAgICA7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHQoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX29wdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDM7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMTg7CisKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICJIKiIsICdCRjAwMDgwMDA4MDA4MTAxMDkwMDAwMDhDMDAxNDAwMCcgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzAwMDgnOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3BsaXRfbWVudV9jb2xvcnMoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwbGl0TWVudUNvbG9ycyByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkdHUk9VUC4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwbGl0X21lbnVfY29sb3JzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMTFFOworICAgIG15ICR2ZXJzaW9uICAgICA9IDA7CisgICAgbXkgJGluc3RhbmNlICAgID0gNDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAxNjsKKworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgIkgqIiwgJzBEMDAwMDA4MEMwMDAwMDgxNzAwMDAwOEY3MDAwMDEwJzsKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKzE7CisKKworX19FTkRfXworCisKKz1oZWFkMSBOQU1FCisKK1dvcmtib29rIC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtib29rcy4KKworPWhlYWQxIFNZTk9QU0lTCisKK1NlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoaXMgbW9kdWxlIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbC4KKworPWhlYWQxIEFVVEhPUgorCitKb2huIE1jTmFtYXJhIGptY25hbWFyYUBjcGFuLm9yZworCis9aGVhZDEgQ09QWVJJR0hUCisKK6kgTU0tTU1YLCBKb2huIE1jTmFtYXJhLgorCitBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLiBJdCBtYXkgYmUgdXNlZCwgcmVkaXN0cmlidXRlZCBhbmQvb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUGVybCBpdHNlbGYuCmRpZmYgLS1naXQgYS9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtzaGVldC5wbSBiL21jdS90b29scy9wZXJsL1NwcmVhZHNoZWV0L1dyaXRlRXhjZWwvV29ya3NoZWV0LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MTQyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tY3UvdG9vbHMvcGVybC9TcHJlYWRzaGVldC9Xcml0ZUV4Y2VsL1dvcmtzaGVldC5wbQpAQCAtMCwwICsxLDc2MzQgQEAKK3BhY2thZ2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OldvcmtzaGVldDsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBXb3Jrc2hlZXQgLSBBIHdyaXRlciBjbGFzcyBmb3IgRXhjZWwgV29ya3NoZWV0cy4KKyMKKyMKKyMgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisjCisjIENvcHlyaWdodCAyMDAwLTIwMTAsIEpvaG4gTWNOYW1hcmEsIGptY25hbWFyYUBjcGFuLm9yZworIworIyBEb2N1bWVudGF0aW9uIGFmdGVyIF9fRU5EX18KKyMKKwordXNlIEV4cG9ydGVyOwordXNlIHN0cmljdDsKK3VzZSBDYXJwOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpCSUZGd3JpdGVyOwordXNlIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ7Cit1c2UgU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWw6OkZvcm11bGE7CisKKworCit1c2UgdmFycyBxdygkVkVSU0lPTiBASVNBKTsKK0BJU0EgPSBxdyhTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlcik7CisKKyRWRVJTSU9OID0gJzIuMzcnOworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG5ldygpCisjCisjIENvbnN0cnVjdG9yLiBDcmVhdGVzIGEgbmV3IFdvcmtzaGVldCBvYmplY3QgZnJvbSBhIEJJRkZ3cml0ZXIgb2JqZWN0CisjCitzdWIgbmV3IHsKKworICAgIG15ICRjbGFzcyAgICAgICAgICAgICAgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJHNlbGYgICAgICAgICAgICAgICAgICAgICAgPSBTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6QklGRndyaXRlci0+bmV3KCk7CisgICAgbXkgJHJvd21heCAgICAgICAgICAgICAgICAgICAgPSA2NTUzNjsKKyAgICBteSAkY29sbWF4ICAgICAgICAgICAgICAgICAgICA9IDI1NjsKKyAgICBteSAkc3RybWF4ICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19uYW1lfSAgICAgICAgICAgICAgICA9ICRfWzBdOworICAgICRzZWxmLT57X2luZGV4fSAgICAgICAgICAgICAgID0gJF9bMV07CisgICAgJHNlbGYtPntfZW5jb2Rpbmd9ICAgICAgICAgICAgPSAkX1syXTsKKyAgICAkc2VsZi0+e19hY3RpdmVzaGVldH0gICAgICAgICA9ICRfWzNdOworICAgICRzZWxmLT57X2ZpcnN0c2hlZXR9ICAgICAgICAgID0gJF9bNF07CisgICAgJHNlbGYtPntfdXJsX2Zvcm1hdH0gICAgICAgICAgPSAkX1s1XTsKKyAgICAkc2VsZi0+e19wYXJzZXJ9ICAgICAgICAgICAgICA9ICRfWzZdOworICAgICRzZWxmLT57X3RlbXBkaXJ9ICAgICAgICAgICAgID0gJF9bN107CisKKyAgICAkc2VsZi0+e19zdHJfdG90YWx9ICAgICAgICAgICA9ICRfWzhdOworICAgICRzZWxmLT57X3N0cl91bmlxdWV9ICAgICAgICAgID0gJF9bOV07CisgICAgJHNlbGYtPntfc3RyX3RhYmxlfSAgICAgICAgICAgPSAkX1sxMF07CisgICAgJHNlbGYtPntfMTkwNH0gICAgICAgICAgICAgICAgPSAkX1sxMV07CisgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gICAgICAgPSAkX1sxMl07CisgICAgJHNlbGYtPntfcGFsZXR0ZX0gICAgICAgICAgICAgPSAkX1sxM107CisKKyAgICAkc2VsZi0+e19zaGVldF90eXBlfSAgICAgICAgICA9IDB4MDAwMDsKKyAgICAkc2VsZi0+e19leHRfc2hlZXRzfSAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3VzaW5nX3RtcGZpbGV9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19maWxlaGFuZGxlfSAgICAgICAgICA9ICIiOworICAgICRzZWxmLT57X2ZpbGVjbG9zZWR9ICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19vZmZzZXR9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfeGxzX3Jvd21heH0gICAgICAgICAgPSAkcm93bWF4OworICAgICRzZWxmLT57X3hsc19jb2xtYXh9ICAgICAgICAgID0gJGNvbG1heDsKKyAgICAkc2VsZi0+e194bHNfc3RybWF4fSAgICAgICAgICA9ICRzdHJtYXg7CisgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gICAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19kaW1fcm93bWF4fSAgICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X2RpbV9jb2xtaW59ICAgICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfZGltX2NvbG1heH0gICAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19jb2xpbmZvfSAgICAgICAgICAgICA9IFtdOworICAgICRzZWxmLT57X3NlbGVjdGlvbn0gICAgICAgICAgID0gWzAsIDBdOworICAgICRzZWxmLT57X3BhbmVzfSAgICAgICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfYWN0aXZlX3BhbmV9ICAgICAgICAgPSAzOworICAgICRzZWxmLT57X2Zyb3plbn0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ICAgICA9IDE7CisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19hY3RpdmV9ICAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdGFiX2NvbG9yfSAgICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfZmlyc3Rfcm93fSAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2ZpcnN0X2NvbH0gICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19kaXNwbGF5X2Zvcm11bGFzfSAgICA9IDA7CisgICAgJHNlbGYtPntfZGlzcGxheV9oZWFkZXJzfSAgICAgPSAxOworICAgICRzZWxmLT57X2Rpc3BsYXlfemVyb3N9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19kaXNwbGF5X2FyYWJpY30gICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19wYXBlcl9zaXplfSAgICAgICAgICA9IDB4MDsKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gICAgICAgICA9IDB4MTsKKyAgICAkc2VsZi0+e19oZWFkZXJ9ICAgICAgICAgICAgICA9ICcnOworICAgICRzZWxmLT57X2Zvb3Rlcn0gICAgICAgICAgICAgID0gJyc7CisgICAgJHNlbGYtPntfaGVhZGVyX2VuY29kaW5nfSAgICAgPSAwOworICAgICRzZWxmLT57X2Zvb3Rlcl9lbmNvZGluZ30gICAgID0gMDsKKyAgICAkc2VsZi0+e19oY2VudGVyfSAgICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfdmNlbnRlcn0gICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X21hcmdpbl9oZWFkZXJ9ICAgICAgID0gMC41MDsKKyAgICAkc2VsZi0+e19tYXJnaW5fZm9vdGVyfSAgICAgICA9IDAuNTA7CisgICAgJHNlbGYtPntfbWFyZ2luX2xlZnR9ICAgICAgICAgPSAwLjc1OworICAgICRzZWxmLT57X21hcmdpbl9yaWdodH0gICAgICAgID0gMC43NTsKKyAgICAkc2VsZi0+e19tYXJnaW5fdG9wfSAgICAgICAgICA9IDEuMDA7CisgICAgJHNlbGYtPntfbWFyZ2luX2JvdHRvbX0gICAgICAgPSAxLjAwOworCisgICAgJHNlbGYtPntfdGl0bGVfcm93bWlufSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtYXh9ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3RpdGxlX2NvbG1pbn0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfdGl0bGVfY29sbWF4fSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19wcmludF9yb3dtaW59ICAgICAgICA9IHVuZGVmOworICAgICRzZWxmLT57X3ByaW50X3Jvd21heH0gICAgICAgID0gdW5kZWY7CisgICAgJHNlbGYtPntfcHJpbnRfY29sbWlufSAgICAgICAgPSB1bmRlZjsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtYXh9ICAgICAgICA9IHVuZGVmOworCisgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgICAgPSAxOworICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ICAgID0gMTsKKyAgICAkc2VsZi0+e19wcmludF9oZWFkZXJzfSAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19wYWdlX29yZGVyfSAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfYmxhY2tfd2hpdGV9ICAgICAgICAgPSAwOworICAgICRzZWxmLT57X2RyYWZ0X3F1YWxpdHl9ICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19wcmludF9jb21tZW50c30gICAgICA9IDA7CisgICAgJHNlbGYtPntfcGFnZV9zdGFydH0gICAgICAgICAgPSAxOworICAgICRzZWxmLT57X2N1c3RvbV9zdGFydH0gICAgICAgID0gMDsKKworICAgICRzZWxmLT57X2ZpdF9wYWdlfSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19maXRfd2lkdGh9ICAgICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZml0X2hlaWdodH0gICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfaGJyZWFrc30gICAgICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e192YnJlYWtzfSAgICAgICAgICAgICA9IFtdOworCisgICAgJHNlbGYtPntfcHJvdGVjdH0gICAgICAgICAgICAgPSAwOworICAgICRzZWxmLT57X3Bhc3N3b3JkfSAgICAgICAgICAgID0gdW5kZWY7CisKKyAgICAkc2VsZi0+e19jb2xfc2l6ZXN9ICAgICAgICAgICA9IHt9OworICAgICRzZWxmLT57X3Jvd19zaXplc30gICAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e19jb2xfZm9ybWF0c30gICAgICAgICA9IHt9OworICAgICRzZWxmLT57X3Jvd19mb3JtYXRzfSAgICAgICAgID0ge307CisKKyAgICAkc2VsZi0+e196b29tfSAgICAgICAgICAgICAgICA9IDEwMDsKKyAgICAkc2VsZi0+e19wcmludF9zY2FsZX0gICAgICAgICA9IDEwMDsKKyAgICAkc2VsZi0+e19wYWdlX3ZpZXd9ICAgICAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19sZWFkaW5nX3plcm9zfSAgICAgICA9IDA7CisKKyAgICAkc2VsZi0+e19vdXRsaW5lX3Jvd19sZXZlbH0gICA9IDA7CisgICAgJHNlbGYtPntfb3V0bGluZV9zdHlsZX0gICAgICAgPSAwOworICAgICRzZWxmLT57X291dGxpbmVfYmVsb3d9ICAgICAgID0gMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX3JpZ2h0fSAgICAgICA9IDE7CisgICAgJHNlbGYtPntfb3V0bGluZV9vbn0gICAgICAgICAgPSAxOworCisgICAgJHNlbGYtPntfd3JpdGVfbWF0Y2h9ICAgICAgICAgPSBbXTsKKworICAgICRzZWxmLT57X29iamVjdF9pZHN9ICAgICAgICAgID0gW107CisgICAgJHNlbGYtPntfaW1hZ2VzfSAgICAgICAgICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19pbWFnZXNfYXJyYXl9ICAgICAgICA9IFtdOworICAgICRzZWxmLT57X2NoYXJ0c30gICAgICAgICAgICAgID0ge307CisgICAgJHNlbGYtPntfY2hhcnRzX2FycmF5fSAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19jb21tZW50c30gICAgICAgICAgICA9IHt9OworICAgICRzZWxmLT57X2NvbW1lbnRzX2FycmF5fSAgICAgID0gW107CisgICAgJHNlbGYtPntfY29tbWVudHNfYXV0aG9yfSAgICAgPSAnJzsKKyAgICAkc2VsZi0+e19jb21tZW50c19hdXRob3JfZW5jfSA9IDA7CisgICAgJHNlbGYtPntfY29tbWVudHNfdmlzaWJsZX0gICAgPSAwOworCisgICAgJHNlbGYtPntfZmlsdGVyX2FyZWF9ICAgICAgICAgPSBbXTsKKyAgICAkc2VsZi0+e19maWx0ZXJfY291bnR9ICAgICAgICA9IDA7CisgICAgJHNlbGYtPntfZmlsdGVyX29ufSAgICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ICAgICAgICAgPSAwOworCisgICAgJHNlbGYtPntfZGJfaW5kaWNlc30gICAgICAgICAgPSBbXTsKKworICAgICRzZWxmLT57X3ZhbGlkYXRpb25zfSAgICAgICAgID0gW107CisKKyAgICBibGVzcyAkc2VsZiwgJGNsYXNzOworICAgICRzZWxmLT5faW5pdGlhbGl6ZSgpOworICAgIHJldHVybiAkc2VsZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9pbml0aWFsaXplKCkKKyMKKyMgT3BlbiBhIHRtcCBmaWxlIHRvIHN0b3JlIHRoZSBtYWpvcml0eSBvZiB0aGUgV29ya3NoZWV0IGRhdGEuIElmIHRoaXMgZmFpbHMsCisjIGZvciBleGFtcGxlIGR1ZSB0byB3cml0ZSBwZXJtaXNzaW9ucywgc3RvcmUgdGhlIGRhdGEgaW4gbWVtb3J5LiBUaGlzIGNhbiBiZQorIyBzbG93IGZvciBsYXJnZSBmaWxlcy4KKyMKK3N1YiBfaW5pdGlhbGl6ZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRmaDsKKyAgICBteSAkdG1wX2RpcjsKKworICAgICMgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGNvbXBsaWNhdGVkIGJ5IFdpbmRvd3MgbGltaXRhdGlvbnMuIFBvcnRlcnMgY2FuCisgICAgIyBjaG9vc2UgYSBtb3JlIGRpcmVjdCBtZXRob2QuCisKKworCisgICAgIyBJbiB0aGUgZGVmYXVsdCBjYXNlIHdlIHVzZSBJTzo6RmlsZS0+bmV3X3RtcGZpbGUoKS4gVGhpcyBtYXkgZmFpbCwgaW4KKyAgICAjIHBhcnRpY3VsYXIgd2l0aCBJSVMgb24gV2luZG93cywgc28gd2UgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHRlbXAKKyAgICAjIGRpcmVjdG9yeSB2aWEgRmlsZTo6VGVtcC4KKyAgICAjCisgICAgaWYgKGRlZmluZWQgJHNlbGYtPntfdGVtcGRpcn0pIHsKKworICAgICAgICAjIERlbGF5IGxvYWRpbmcgRmlsZTpUZW1wIHRvIHJlZHVjZSB0aGUgbW9kdWxlIGRlcGVuZGVuY2llcy4KKyAgICAgICAgZXZhbCB7IHJlcXVpcmUgRmlsZTo6VGVtcCB9OworICAgICAgICBkaWUgIlRoZSBGaWxlOjpUZW1wIG1vZHVsZSBtdXN0IGJlIGluc3RhbGxlZCBpbiBvcmRlciAiLgorICAgICAgICAgICAgInRvIGNhbGwgc2V0X3RlbXBkaXIoKS5cbiIgaWYgJEA7CisKKworICAgICAgICAjIFRyYXAgYnV0IGlnbm9yZSBGaWxlOjpUZW1wIGVycm9ycy4KKyAgICAgICAgZXZhbCB7ICRmaCA9IEZpbGU6OlRlbXA6OnRlbXBmaWxlKERJUiA9PiAkc2VsZi0+e190ZW1wZGlyfSkgfTsKKworICAgICAgICAjIFN0b3JlIHRoZSBmYWlsZWQgdG1wIGRpciBpbiBjYXNlIG9mIGVycm9ycy4KKyAgICAgICAgJHRtcF9kaXIgPSAkc2VsZi0+e190ZW1wZGlyfSB8fCBGaWxlOjpTcGVjLT50bXBkaXIgaWYgbm90ICRmaDsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgJGZoID0gSU86OkZpbGUtPm5ld190bXBmaWxlKCk7CisKKyAgICAgICAgIyBTdG9yZSB0aGUgZmFpbGVkIHRtcCBkaXIgaW4gY2FzZSBvZiBlcnJvcnMuCisgICAgICAgICR0bXBfZGlyID0gIlBPU0lYOjp0bXBuYW0oKSBkaXJlY3RvcnkiIGlmIG5vdCAkZmg7CisgICAgfQorCisKKyAgICAjIENoZWNrIGlmIHRoZSB0ZW1wIGZpbGUgY3JlYXRpb24gd2FzIHN1Y2Nlc3NmdWwuIEVsc2Ugc3RvcmUgZGF0YSBpbiBtZW1vcnkuCisgICAgaWYgKCRmaCkgeworCisgICAgICAgICMgYmlubW9kZSBmaWxlIHdoZXRoZXIgcGxhdGZvcm0gcmVxdWlyZXMgaXQgb3Igbm90LgorICAgICAgICBiaW5tb2RlKCRmaCk7CisKKyAgICAgICAgIyBTdG9yZSBmaWxlaGFuZGxlCisgICAgICAgICRzZWxmLT57X2ZpbGVoYW5kbGV9ID0gJGZoOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIFNldCBmbGFnIHRvIHN0b3JlIGRhdGEgaW4gbWVtb3J5IGlmIFhYOjp0ZW1wZmlsZSgpIGZhaWxlZC4KKyAgICAgICAgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0gPSAwOworCisgICAgICAgIGlmICgkc2VsZi0+e19pbmRleH0gPT0gMCAmJiAkXlcpIHsKKyAgICAgICAgICAgIG15ICRkaXIgPSAkc2VsZi0+e190ZW1wZGlyfSB8fCBGaWxlOjpTcGVjLT50bXBkaXIoKTsKKworICAgICAgICAgICAgd2FybiAiVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGVzIGluICR0bXBfZGlyLiBEYXRhIHdpbGwgYmUgIi4KKyAgICAgICAgICAgICAgICAgInN0b3JlZCBpbiBtZW1vcnkuIFJlZmVyIHRvIHNldF90ZW1wZGlyKCkgaW4gdGhlICIuCisgICAgICAgICAgICAgICAgICJTcHJlYWRzaGVldDo6V3JpdGVFeGNlbCBkb2N1bWVudGF0aW9uLlxuIiA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY2xvc2UoKQorIworIyBBZGQgZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSB3b3JrYm9vayAobm90ZSB0aGUgcmV2ZXJzZSBvcmRlcikKKyMgYW5kIHRvIHRoZSBlbmQgb2YgdGhlIHdvcmtib29rLgorIworc3ViIF9jbG9zZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyBQcmVwZW5kIGluIHJldmVyc2Ugb3JkZXIhIQorICAgICMKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgZGltZW5zaW9ucworICAgICRzZWxmLT5fc3RvcmVfZGltZW5zaW9ucygpOworCisgICAgIyBQcmVwZW5kIHRoZSBhdXRvZmlsdGVyIGZpbHRlcnMuCisgICAgJHNlbGYtPl9zdG9yZV9hdXRvZmlsdGVyczsKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgYXV0b2ZpbHRlciBpbmZvLgorICAgICRzZWxmLT5fc3RvcmVfYXV0b2ZpbHRlcmluZm8oKTsKKworICAgICMgUHJlcGVuZCB0aGUgc2hlZXQgZmlsdGVybW9kZSByZWNvcmQuCisgICAgJHNlbGYtPl9zdG9yZV9maWx0ZXJtb2RlKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIENPTElORk8gcmVjb3JkcyBpZiB0aGV5IGV4aXN0CisgICAgaWYgKEB7JHNlbGYtPntfY29saW5mb319KXsKKyAgICAgICAgbXkgQGNvbGluZm8gPSBAeyRzZWxmLT57X2NvbGluZm99fTsKKyAgICAgICAgd2hpbGUgKEBjb2xpbmZvKSB7CisgICAgICAgICAgICBteSAkYXJyYXlyZWYgPSBwb3AgQGNvbGluZm87CisgICAgICAgICAgICAkc2VsZi0+X3N0b3JlX2NvbGluZm8oQCRhcnJheXJlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjIFByZXBlbmQgdGhlIERFRkNPTFdJRFRIIHJlY29yZAorICAgICRzZWxmLT5fc3RvcmVfZGVmY29sKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHNoZWV0IHBhc3N3b3JkCisgICAgJHNlbGYtPl9zdG9yZV9wYXNzd29yZCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBzaGVldCBwcm90ZWN0aW9uCisgICAgJHNlbGYtPl9zdG9yZV9wcm90ZWN0KCk7CisgICAgJHNlbGYtPl9zdG9yZV9vYmpfcHJvdGVjdCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBwYWdlIHNldHVwCisgICAgJHNlbGYtPl9zdG9yZV9zZXR1cCgpOworCisgICAgIyBQcmVwZW5kIHRoZSBib3R0b20gbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fYm90dG9tKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHRvcCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl90b3AoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcmlnaHQgbWFyZ2luCisgICAgJHNlbGYtPl9zdG9yZV9tYXJnaW5fcmlnaHQoKTsKKworICAgICMgUHJlcGVuZCB0aGUgbGVmdCBtYXJnaW4KKyAgICAkc2VsZi0+X3N0b3JlX21hcmdpbl9sZWZ0KCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2UgdmVydGljYWwgY2VudGVyaW5nCisgICAgJHNlbGYtPl9zdG9yZV92Y2VudGVyKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHBhZ2UgaG9yaXpvbnRhbCBjZW50ZXJpbmcKKyAgICAkc2VsZi0+X3N0b3JlX2hjZW50ZXIoKTsKKworICAgICMgUHJlcGVuZCB0aGUgcGFnZSBmb290ZXIKKyAgICAkc2VsZi0+X3N0b3JlX2Zvb3RlcigpOworCisgICAgIyBQcmVwZW5kIHRoZSBwYWdlIGhlYWRlcgorICAgICRzZWxmLT5fc3RvcmVfaGVhZGVyKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIHZlcnRpY2FsIHBhZ2UgYnJlYWtzCisgICAgJHNlbGYtPl9zdG9yZV92YnJlYWsoKTsKKworICAgICMgUHJlcGVuZCB0aGUgaG9yaXpvbnRhbCBwYWdlIGJyZWFrcworICAgICRzZWxmLT5fc3RvcmVfaGJyZWFrKCk7CisKKyAgICAjIFByZXBlbmQgV1NCT09MCisgICAgJHNlbGYtPl9zdG9yZV93c2Jvb2woKTsKKworICAgICMgUHJlcGVuZCB0aGUgZGVmYXVsdCByb3cgaGVpZ2h0LgorICAgICRzZWxmLT5fc3RvcmVfZGVmcm93KCk7CisKKyAgICAjIFByZXBlbmQgR1VUUworICAgICRzZWxmLT5fc3RvcmVfZ3V0cygpOworCisgICAgIyBQcmVwZW5kIEdSSURTRVQKKyAgICAkc2VsZi0+X3N0b3JlX2dyaWRzZXQoKTsKKworICAgICMgUHJlcGVuZCBQUklOVEdSSURMSU5FUworICAgICRzZWxmLT5fc3RvcmVfcHJpbnRfZ3JpZGxpbmVzKCk7CisKKyAgICAjIFByZXBlbmQgUFJJTlRIRUFERVJTCisgICAgJHNlbGYtPl9zdG9yZV9wcmludF9oZWFkZXJzKCk7CisKKyAgICAjCisgICAgIyBFbmQgb2YgcHJlcGVuZC4gUmVhZCB1cHdhcmRzIGZyb20gaGVyZS4KKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgQXBwZW5kCisgICAgJHNlbGYtPl9zdG9yZV90YWJsZSgpOworICAgICRzZWxmLT5fc3RvcmVfaW1hZ2VzKCk7CisgICAgJHNlbGYtPl9zdG9yZV9jaGFydHMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2ZpbHRlcnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2NvbW1lbnRzKCk7CisgICAgJHNlbGYtPl9zdG9yZV93aW5kb3cyKCk7CisgICAgJHNlbGYtPl9zdG9yZV9wYWdlX3ZpZXcoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3pvb20oKTsKKyAgICAkc2VsZi0+X3N0b3JlX3BhbmVzKEB7JHNlbGYtPntfcGFuZXN9fSkgaWYgQHskc2VsZi0+e19wYW5lc319OworICAgICRzZWxmLT5fc3RvcmVfc2VsZWN0aW9uKEB7JHNlbGYtPntfc2VsZWN0aW9ufX0pOworICAgICRzZWxmLT5fc3RvcmVfdmFsaWRhdGlvbl9jb3VudCgpOworICAgICRzZWxmLT5fc3RvcmVfdmFsaWRhdGlvbnMoKTsKKyAgICAkc2VsZi0+X3N0b3JlX3RhYl9jb2xvcigpOworICAgICRzZWxmLT5fc3RvcmVfZW9mKCk7CisKKyAgICAjIFByZXBlbmQgdGhlIEJPRiBhbmQgSU5ERVggcmVjb3JkcworICAgICRzZWxmLT5fc3RvcmVfaW5kZXgoKTsKKyAgICAkc2VsZi0+X3N0b3JlX2JvZigweDAwMTApOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NvbXBhdGliaWxpdHlfbW9kZSgpCisjCisjIFNldCB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorIworIyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIFdvcmtib29rOjpjb21wYXRpYmlsaXR5X21vZGUoKS4gVGhpcyBwcml2YXRlIG1ldGhvZAorIyBpcyBtYWlubHkgdXNlZCBmb3IgdGVzdCBwdXJwb3Nlcy4KKyMKK3N1YiBfY29tcGF0aWJpbGl0eV9tb2RlIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkKCRfWzBdKSkgeworICAgICAgICAkc2VsZi0+e19jb21wYXRpYmlsaXR5fSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfY29tcGF0aWJpbGl0eX0gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGdldF9uYW1lKCkuCisjCisjIFJldHJpZXZlIHRoZSB3b3Jrc2hlZXQgbmFtZS4KKyMKKyMgTm90ZSwgdGhlcmUgaXMgbm8gc2V0X25hbWUoKSBtZXRob2QgYmVjYXVzZSBuYW1lcyBhcmUgdXNlZCBpbiBmb3JtdWxhcyBhbmQKKyMgY29udmVydGVkIHRvIGludGVybmFsIGluZGljZXMuIEFsbG93aW5nIHRoZSB1c2VyIHRvIGNoYW5nZSBzaGVldCBuYW1lcworIyBhZnRlciB0aGV5IGhhdmUgYmVlbiBzZXQgaW4gYWRkX3dvcmtzaGVldCgpIGlzIGFza2luZyBmb3IgdHJvdWJsZS4KKyMKK3N1YiBnZXRfbmFtZSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgcmV0dXJuICRzZWxmLT57X25hbWV9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgZ2V0X2RhdGEoKS4KKyMKKyMgUmV0cmlldmVzIGRhdGEgZnJvbSBtZW1vcnkgaW4gb25lIGNodW5rLCBvciBmcm9tIGRpc2sgaW4gJGJ1ZmZlcgorIyBzaXplZCBjaHVua3MuCisjCitzdWIgZ2V0X2RhdGEgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRidWZmZXIgPSA0MDk2OworICAgIG15ICR0bXA7CisKKyAgICAjIFJldHVybiBkYXRhIHN0b3JlZCBpbiBtZW1vcnkKKyAgICBpZiAoZGVmaW5lZCAkc2VsZi0+e19kYXRhfSkgeworICAgICAgICAkdG1wICAgICAgICAgICA9ICRzZWxmLT57X2RhdGF9OworICAgICAgICAkc2VsZi0+e19kYXRhfSA9IHVuZGVmOworICAgICAgICBteSAkZmggICAgICAgICA9ICRzZWxmLT57X2ZpbGVoYW5kbGV9OworICAgICAgICBzZWVrKCRmaCwgMCwgMCkgaWYgJHNlbGYtPntfdXNpbmdfdG1wZmlsZX07CisgICAgICAgIHJldHVybiAkdG1wOworICAgIH0KKworICAgICMgUmV0dXJuIGRhdGEgc3RvcmVkIG9uIGRpc2sKKyAgICBpZiAoJHNlbGYtPntfdXNpbmdfdG1wZmlsZX0pIHsKKyAgICAgICAgcmV0dXJuICR0bXAgaWYgcmVhZCgkc2VsZi0+e19maWxlaGFuZGxlfSwgJHRtcCwgJGJ1ZmZlcik7CisgICAgfQorCisgICAgIyBObyBkYXRhIHRvIHJldHVybgorICAgIHJldHVybiB1bmRlZjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNlbGVjdCgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyBhIHNlbGVjdGVkIHdvcmtzaGVldCwgaS5lLiB0aGUgd29ya3NoZWV0IGhhcyBpdHMgdGFiCisjIGhpZ2hsaWdodGVkLgorIworc3ViIHNlbGVjdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfaGlkZGVufSAgICAgICAgID0gMDsgIyBTZWxlY3RlZCB3b3Jrc2hlZXQgY2FuJ3QgYmUgaGlkZGVuLgorICAgICRzZWxmLT57X3NlbGVjdGVkfSAgICAgICA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhY3RpdmF0ZSgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyB0aGUgYWN0aXZlIHdvcmtzaGVldCwgaS5lLiB0aGUgd29ya3NoZWV0IHRoYXQgaXMKKyMgZGlzcGxheWVkIHdoZW4gdGhlIHdvcmtib29rIGlzIG9wZW5lZC4gQWxzbyBzZXQgaXQgYXMgc2VsZWN0ZWQuCisjCitzdWIgYWN0aXZhdGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICA9IDA7ICMgQWN0aXZlIHdvcmtzaGVldCBjYW4ndCBiZSBoaWRkZW4uCisgICAgJHNlbGYtPntfc2VsZWN0ZWR9ICAgICAgID0gMTsKKyAgICAkeyRzZWxmLT57X2FjdGl2ZXNoZWV0fX0gPSAkc2VsZi0+e19pbmRleH07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBoaWRlKCkKKyMKKyMgSGlkZSB0aGlzIHdvcmtzaGVldC4KKyMKK3N1YiBoaWRlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19oaWRkZW59ICAgICAgICAgPSAxOworCisgICAgIyBBIGhpZGRlbiB3b3Jrc2hlZXQgc2hvdWxkbid0IGJlIGFjdGl2ZSBvciBzZWxlY3RlZC4KKyAgICAkc2VsZi0+e19zZWxlY3RlZH0gICAgICAgPSAwOworICAgICR7JHNlbGYtPntfYWN0aXZlc2hlZXR9fSA9IDA7CisgICAgJHskc2VsZi0+e19maXJzdHNoZWV0fX0gID0gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9maXJzdF9zaGVldCgpCisjCisjIFNldCB0aGlzIHdvcmtzaGVldCBhcyB0aGUgZmlyc3QgdmlzaWJsZSBzaGVldC4gVGhpcyBpcyBuZWNlc3NhcnkKKyMgd2hlbiB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIgb2Ygd29ya3NoZWV0cyBhbmQgdGhlIGFjdGl2YXRlZAorIyB3b3Jrc2hlZXQgaXMgbm90IHZpc2libGUgb24gdGhlIHNjcmVlbi4KKyMKK3N1YiBzZXRfZmlyc3Rfc2hlZXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2hpZGRlbn0gICAgICAgICA9IDA7ICMgQWN0aXZlIHdvcmtzaGVldCBjYW4ndCBiZSBoaWRkZW4uCisgICAgJHskc2VsZi0+e19maXJzdHNoZWV0fX0gID0gJHNlbGYtPntfaW5kZXh9OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJvdGVjdCgkcGFzc3dvcmQpCisjCisjIFNldCB0aGUgd29ya3NoZWV0IHByb3RlY3Rpb24gZmxhZyB0byBwcmV2ZW50IGFjY2lkZW50YWwgbW9kaWZpY2F0aW9uIGFuZCB0bworIyBoaWRlIGZvcm11bGFzIGlmIHRoZSBsb2NrZWQgYW5kIGhpZGRlbiBmb3JtYXQgcHJvcGVydGllcyBoYXZlIGJlZW4gc2V0LgorIworc3ViIHByb3RlY3QgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3Byb3RlY3R9ICAgPSAxOworICAgICRzZWxmLT57X3Bhc3N3b3JkfSAgPSAkc2VsZi0+X2VuY29kZV9wYXNzd29yZCgkX1swXSkgaWYgZGVmaW5lZCAkX1swXTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2NvbHVtbigkZmlyc3Rjb2wsICRsYXN0Y29sLCAkd2lkdGgsICRmb3JtYXQsICRoaWRkZW4sICRsZXZlbCkKKyMKKyMgU2V0IHRoZSB3aWR0aCBvZiBhIHNpbmdsZSBjb2x1bW4gb3IgYSByYW5nZSBvZiBjb2x1bW5zLgorIyBTZWUgYWxzbzogX3N0b3JlX2NvbGluZm8KKyMKK3N1YiBzZXRfY29sdW1uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgQGRhdGEgPSBAXzsKKyAgICBteSAkY2VsbCA9ICRkYXRhWzBdOworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkY2VsbCA9fiAvXlxELykgeworICAgICAgICBAZGF0YSA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKworICAgICAgICAjIFJldHVybmVkIHZhbHVlcyAkcm93MSBhbmQgJHJvdzIgYXJlbid0IHJlcXVpcmVkIGhlcmUuIFJlbW92ZSB0aGVtLgorICAgICAgICBzaGlmdCAgQGRhdGE7ICAgICAgICMgJHJvdzEKKyAgICAgICAgc3BsaWNlIEBkYXRhLCAxLCAxOyAjICRyb3cyCisgICAgfQorCisgICAgcmV0dXJuIGlmIEBkYXRhIDwgMzsgIyBFbnN1cmUgYXQgbGVhc3QgJGZpcnN0Y29sLCAkbGFzdGNvbCBhbmQgJHdpZHRoCisgICAgcmV0dXJuIGlmIG5vdCBkZWZpbmVkICRkYXRhWzBdOyAjIENvbHVtbnMgbXVzdCBiZSBkZWZpbmVkLgorICAgIHJldHVybiBpZiBub3QgZGVmaW5lZCAkZGF0YVsxXTsKKworICAgICMgQXNzdW1lIHNlY29uZCBjb2x1bW4gaXMgdGhlIHNhbWUgYXMgZmlyc3QgaWYgMC4gQXZvaWRzIEtCOTE4NDE5IGJ1Zy4KKyAgICAkZGF0YVsxXSA9ICRkYXRhWzBdIGlmICRkYXRhWzFdID09IDA7CisKKyAgICAjIEVuc3VyZSAybmQgY29sIGlzIGxhcmdlciB0aGFuIGZpcnN0LiBBbHNvIGZvciBLQjkxODQxOSBidWcuCisgICAgKCRkYXRhWzBdLCAkZGF0YVsxXSkgPSAoJGRhdGFbMV0sICRkYXRhWzBdKSBpZiAkZGF0YVswXSA+ICRkYXRhWzFdOworCisgICAgIyBMaW1pdCBjb2x1bW5zIHRvIEV4Y2VsIG1heCBvZiAyNTUuCisgICAgJGRhdGFbMF0gPSAyNTUgaWYgJGRhdGFbMF0gPiAyNTU7CisgICAgJGRhdGFbMV0gPSAyNTUgaWYgJGRhdGFbMV0gPiAyNTU7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfY29saW5mb319LCBbIEBkYXRhIF07CisKKworICAgICMgU3RvcmUgdGhlIGNvbCBzaXplcyBmb3IgdXNlIHdoZW4gY2FsY3VsYXRpbmcgaW1hZ2UgdmVydGljZXMgdGFraW5nCisgICAgIyBoaWRkZW4gY29sdW1ucyBpbnRvIGFjY291bnQuIEFsc28gc3RvcmUgdGhlIGNvbHVtbiBmb3JtYXRzLgorICAgICMKKyAgICBteSAkd2lkdGggID0gJGRhdGFbNF0gPyAwIDogJGRhdGFbMl07ICMgU2V0IHdpZHRoIHRvIHplcm8gaWYgY29sIGlzIGhpZGRlbgorICAgICAgICR3aWR0aCAgfHw9IDA7ICAgICAgICAgICAgICAgICAgICAgIyBFbnN1cmUgd2lkdGggaXNuJ3QgdW5kZWYuCisgICAgbXkgJGZvcm1hdCA9ICRkYXRhWzNdOworCisgICAgbXkgKCRmaXJzdGNvbCwgJGxhc3Rjb2wpID0gQGRhdGE7CisKKyAgICBmb3JlYWNoIG15ICRjb2wgKCRmaXJzdGNvbCAuLiAkbGFzdGNvbCkgeworICAgICAgICAkc2VsZi0+e19jb2xfc2l6ZXN9LT57JGNvbH0gICA9ICR3aWR0aDsKKyAgICAgICAgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0gPSAkZm9ybWF0IGlmIGRlZmluZWQgJGZvcm1hdDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfc2VsZWN0aW9uKCkKKyMKKyMgU2V0IHdoaWNoIGNlbGwgb3IgY2VsbHMgYXJlIHNlbGVjdGVkIGluIGEgd29ya3NoZWV0OiBzZWUgYWxzbyB0aGUKKyMgc3ViIF9zdG9yZV9zZWxlY3Rpb24KKyMKK3N1YiBzZXRfc2VsZWN0aW9uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICRzZWxmLT57X3NlbGVjdGlvbn0gPSBbIEBfIF07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBmcmVlemVfcGFuZXMoKQorIworIyBTZXQgcGFuZXMgYW5kIG1hcmsgdGhlbSBhcyBmcm96ZW4uIFNlZSBhbHNvIF9zdG9yZV9wYW5lcygpLgorIworc3ViIGZyZWV6ZV9wYW5lcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIEV4dHJhIGZsYWcgaW5kaWNhdGVkIGEgc3BsaXQgYW5kIGZyZWV6ZS4KKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ID0gMCBpZiAkX1s0XTsKKworICAgICRzZWxmLT57X2Zyb3plbn0gPSAxOworICAgICRzZWxmLT57X3BhbmVzfSAgPSBbIEBfIF07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzcGxpdF9wYW5lcygpCisjCisjIFNldCBwYW5lcyBhbmQgbWFyayB0aGVtIGFzIHNwbGl0LiBTZWUgYWxzbyBfc3RvcmVfcGFuZXMoKS4KKyMKK3N1YiBzcGxpdF9wYW5lcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfZnJvemVufSAgICAgICAgICAgID0gMDsKKyAgICAkc2VsZi0+e19mcm96ZW5fbm9fc3BsaXR9ICAgPSAwOworICAgICRzZWxmLT57X3BhbmVzfSAgICAgICAgICAgICA9IFsgQF8gXTsKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqdGhhd19wYW5lcyA9ICpzcGxpdF9wYW5lczsKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wb3J0cmFpdCgpCisjCisjIFNldCB0aGUgcGFnZSBvcmllbnRhdGlvbiBhcyBwb3J0cmFpdC4KKyMKK3N1YiBzZXRfcG9ydHJhaXQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X29yaWVudGF0aW9ufSA9IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbGFuZHNjYXBlKCkKKyMKKyMgU2V0IHRoZSBwYWdlIG9yaWVudGF0aW9uIGFzIGxhbmRzY2FwZS4KKyMKK3N1YiBzZXRfbGFuZHNjYXBlIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19vcmllbnRhdGlvbn0gPSAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3BhZ2VfdmlldygpCisjCisjIFNldCB0aGUgcGFnZSB2aWV3IG1vZGUgZm9yIE1hYyBFeGNlbC4KKyMKK3N1YiBzZXRfcGFnZV92aWV3IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19wYWdlX3ZpZXd9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF90YWJfY29sb3IoKQorIworIyBTZXQgdGhlIGNvbG91ciBvZiB0aGUgd29ya3NoZWV0IGNvbG91ci4KKyMKK3N1YiBzZXRfdGFiX2NvbG9yIHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworCisgICAgbXkgJGNvbG9yID0gJlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ6Ol9nZXRfY29sb3IoJF9bMF0pOworICAgICAgICRjb2xvciA9IDAgaWYgJGNvbG9yID09IDB4N0ZGRjsgIyBEZWZhdWx0IGNvbG9yLgorCisgICAgJHNlbGYtPntfdGFiX2NvbG9yfSA9ICRjb2xvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9wYXBlcigpCisjCisjIFNldCB0aGUgcGFwZXIgdHlwZS4gRXguIDEgPSBVUyBMZXR0ZXIsIDkgPSBBNAorIworc3ViIHNldF9wYXBlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfcGFwZXJfc2l6ZX0gPSAkX1swXSB8fCAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2hlYWRlcigpCisjCisjIFNldCB0aGUgcGFnZSBoZWFkZXIgY2FwdGlvbiBhbmQgb3B0aW9uYWwgbWFyZ2luLgorIworc3ViIHNldF9oZWFkZXIgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHN0cmluZyAgID0gJF9bMF0gfHwgJyc7CisgICAgbXkgJG1hcmdpbiAgID0gJF9bMV0gfHwgMC41MDsKKyAgICBteSAkZW5jb2RpbmcgPSAkX1syXSB8fCAwOworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHJpbmcpKSB7CisgICAgICAgICAgICAkc3RyaW5nID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkJFIiwgJHN0cmluZyk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgbXkgJGxpbWl0ICAgID0gJGVuY29kaW5nID8gMjU1ICoyIDogMjU1OworCisgICAgaWYgKGxlbmd0aCAkc3RyaW5nID49ICRsaW1pdCkgeworICAgICAgICBjYXJwICdIZWFkZXIgc3RyaW5nIG11c3QgYmUgbGVzcyB0aGFuIDI1NSBjaGFyYWN0ZXJzJzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICRzZWxmLT57X2hlYWRlcn0gICAgICAgICAgPSAkc3RyaW5nOworICAgICRzZWxmLT57X21hcmdpbl9oZWFkZXJ9ICAgPSAkbWFyZ2luOworICAgICRzZWxmLT57X2hlYWRlcl9lbmNvZGluZ30gPSAkZW5jb2Rpbmc7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfZm9vdGVyKCkKKyMKKyMgU2V0IHRoZSBwYWdlIGZvb3RlciBjYXB0aW9uIGFuZCBvcHRpb25hbCBtYXJnaW4uCisjCitzdWIgc2V0X2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkc3RyaW5nICAgPSAkX1swXSB8fCAnJzsKKyAgICBteSAkbWFyZ2luICAgPSAkX1sxXSB8fCAwLjUwOworICAgIG15ICRlbmNvZGluZyA9ICRfWzJdIHx8IDA7CisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBteSAkbGltaXQgICAgPSAkZW5jb2RpbmcgPyAyNTUgKjIgOiAyNTU7CisKKworICAgIGlmIChsZW5ndGggJHN0cmluZyA+PSAkbGltaXQpIHsKKyAgICAgICAgY2FycCAnRm9vdGVyIHN0cmluZyBtdXN0IGJlIGxlc3MgdGhhbiAyNTUgY2hhcmFjdGVycyc7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAkc2VsZi0+e19mb290ZXJ9ICAgICAgICAgID0gJHN0cmluZzsKKyAgICAkc2VsZi0+e19tYXJnaW5fZm9vdGVyfSAgID0gJG1hcmdpbjsKKyAgICAkc2VsZi0+e19mb290ZXJfZW5jb2Rpbmd9ID0gJGVuY29kaW5nOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgY2VudGVyX2hvcml6b250YWxseSgpCisjCisjIENlbnRlciB0aGUgcGFnZSBob3Jpem9udGFsbHkuCisjCitzdWIgY2VudGVyX2hvcml6b250YWxseSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgaWYgKGRlZmluZWQgJF9bMF0pIHsKKyAgICAgICAgJHNlbGYtPntfaGNlbnRlcn0gPSAkX1swXTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT57X2hjZW50ZXJ9ID0gMTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjZW50ZXJfdmVydGljYWxseSgpCisjCisjIENlbnRlciB0aGUgcGFnZSBob3Jpem9udGFsbHkuCisjCitzdWIgY2VudGVyX3ZlcnRpY2FsbHkgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkICRfWzBdKSB7CisgICAgICAgICRzZWxmLT57X3ZjZW50ZXJ9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e192Y2VudGVyfSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbnMoKQorIworIyBTZXQgYWxsIHRoZSBwYWdlIG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUgaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9sZWZ0KCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9yaWdodCgkX1swXSk7CisgICAgJHNlbGYtPnNldF9tYXJnaW5fdG9wKCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9ib3R0b20oJF9bMF0pOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X21hcmdpbnNfTFIoKQorIworIyBTZXQgdGhlIGxlZnQgYW5kIHJpZ2h0IG1hcmdpbnMgdG8gdGhlIHNhbWUgdmFsdWUgaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5zX0xSIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9sZWZ0KCRfWzBdKTsKKyAgICAkc2VsZi0+c2V0X21hcmdpbl9yaWdodCgkX1swXSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2luc19UQigpCisjCisjIFNldCB0aGUgdG9wIGFuZCBib3R0b20gbWFyZ2lucyB0byB0aGUgc2FtZSB2YWx1ZSBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbnNfVEIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT5zZXRfbWFyZ2luX3RvcCgkX1swXSk7CisgICAgJHNlbGYtPnNldF9tYXJnaW5fYm90dG9tKCRfWzBdKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fbGVmdCgpCisjCisjIFNldCB0aGUgbGVmdCBtYXJnaW4gaW4gaW5jaGVzLgorIworc3ViIHNldF9tYXJnaW5fbGVmdCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX2xlZnR9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMC43NTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fcmlnaHQoKQorIworIyBTZXQgdGhlIHJpZ2h0IG1hcmdpbiBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbl9yaWdodCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX3JpZ2h0fSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDAuNzU7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfbWFyZ2luX3RvcCgpCisjCisjIFNldCB0aGUgdG9wIG1hcmdpbiBpbiBpbmNoZXMuCisjCitzdWIgc2V0X21hcmdpbl90b3AgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X21hcmdpbl90b3B9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMS4wMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9tYXJnaW5fYm90dG9tKCkKKyMKKyMgU2V0IHRoZSBib3R0b20gbWFyZ2luIGluIGluY2hlcy4KKyMKK3N1YiBzZXRfbWFyZ2luX2JvdHRvbSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfbWFyZ2luX2JvdHRvbX0gPSBkZWZpbmVkICRfWzBdID8gJF9bMF0gOiAxLjAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcmVwZWF0X3Jvd3MoJGZpcnN0X3JvdywgJGxhc3Rfcm93KQorIworIyBTZXQgdGhlIHJvd3MgdG8gcmVwZWF0IGF0IHRoZSB0b3Agb2YgZWFjaCBwcmludGVkIHBhZ2UuIFNlZSBhbHNvIHRoZQorIyBfc3RvcmVfbmFtZV94eHh4KCkgbWV0aG9kcyBpbiBXb3JrYm9vay5wbS4KKyMKK3N1YiByZXBlYXRfcm93cyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgJHNlbGYtPntfdGl0bGVfcm93bWlufSAgPSAkX1swXTsKKyAgICAkc2VsZi0+e190aXRsZV9yb3dtYXh9ICA9ICRfWzFdIHx8ICRfWzBdOyAjIFNlY29uZCByb3cgaXMgb3B0aW9uYWwKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJlcGVhdF9jb2x1bW5zKCRmaXJzdF9jb2wsICRsYXN0X2NvbCkKKyMKKyMgU2V0IHRoZSBjb2x1bW5zIHRvIHJlcGVhdCBhdCB0aGUgbGVmdCBoYW5kIHNpZGUgb2YgZWFjaCBwcmludGVkIHBhZ2UuCisjIFNlZSBhbHNvIHRoZSBfc3RvcmVfbmFtZXMoKSBtZXRob2RzIGluIFdvcmtib29rLnBtLgorIworc3ViIHJlcGVhdF9jb2x1bW5zIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworCisgICAgICAgICMgUmV0dXJuZWQgdmFsdWVzICRyb3cxIGFuZCAkcm93MiBhcmVuJ3QgcmVxdWlyZWQgaGVyZS4gUmVtb3ZlIHRoZW0uCisgICAgICAgIHNoaWZ0ICBAXzsgICAgICAgIyAkcm93MQorICAgICAgICBzcGxpY2UgQF8sIDEsIDE7ICMgJHJvdzIKKyAgICB9CisKKyAgICAkc2VsZi0+e190aXRsZV9jb2xtaW59ICA9ICRfWzBdOworICAgICRzZWxmLT57X3RpdGxlX2NvbG1heH0gID0gJF9bMV0gfHwgJF9bMF07ICMgU2Vjb25kIGNvbCBpcyBvcHRpb25hbAorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJpbnRfYXJlYSgkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgU2V0IHRoZSBhcmVhIG9mIGVhY2ggd29ya3NoZWV0IHRoYXQgd2lsbCBiZSBwcmludGVkLiBTZWUgYWxzbyB0aGUKKyMgX3N0b3JlX25hbWVzKCkgbWV0aG9kcyBpbiBXb3JrYm9vay5wbS4KKyMKK3N1YiBwcmludF9hcmVhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIHJldHVybiBpZiBAXyAhPSA0OyAjIFJlcXVpcmUgNCBwYXJhbWV0ZXJzCisKKyAgICAkc2VsZi0+e19wcmludF9yb3dtaW59ID0gJF9bMF07CisgICAgJHNlbGYtPntfcHJpbnRfY29sbWlufSA9ICRfWzFdOworICAgICRzZWxmLT57X3ByaW50X3Jvd21heH0gPSAkX1syXTsKKyAgICAkc2VsZi0+e19wcmludF9jb2xtYXh9ID0gJF9bM107Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhdXRvZmlsdGVyKCRmaXJzdF9yb3csICRmaXJzdF9jb2wsICRsYXN0X3JvdywgJGxhc3RfY29sKQorIworIyBTZXQgdGhlIGF1dG9maWx0ZXIgYXJlYSBpbiB0aGUgd29ya3NoZWV0LgorIworc3ViIGF1dG9maWx0ZXIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgcmV0dXJuIGlmIEBfICE9IDQ7ICMgUmVxdWlyZSA0IHBhcmFtZXRlcnMKKworICAgIG15ICgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMikgPSBAXzsKKworICAgICMgUmV2ZXJzZSBtYXggYW5kIG1pbiB2YWx1ZXMgaWYgbmVjZXNzYXJ5LgorICAgICgkcm93MSwgJHJvdzIpID0gKCRyb3cyLCAkcm93MSkgaWYgJHJvdzIgPCAkcm93MTsKKyAgICAoJGNvbDEsICRjb2wyKSA9ICgkY29sMiwgJGNvbDEpIGlmICRjb2wyIDwgJGNvbDE7CisKKyAgICAjIFN0b3JlIHRoZSBBdXRvZmlsdGVyIGluZm9ybWF0aW9uCisgICAgJHNlbGYtPntfZmlsdGVyX2FyZWF9ICA9IFskcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMl07CisgICAgJHNlbGYtPntfZmlsdGVyX2NvdW50fSA9IDErICRjb2wyIC0kY29sMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZpbHRlcl9jb2x1bW4oJGNvbHVtbiwgJGNyaXRlcmlhLCAuLi4pCisjCisjIFNldCB0aGUgY29sdW1uIGZpbHRlciBjcml0ZXJpYS4KKyMKK3N1YiBmaWx0ZXJfY29sdW1uIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzBdOworICAgIG15ICRleHByZXNzaW9uICA9ICRfWzFdOworCisKKyAgICBjcm9hayAiTXVzdCBjYWxsIGF1dG9maWx0ZXIoKSBiZWZvcmUgZmlsdGVyX2NvbHVtbigpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY291bnR9OworICAgIGNyb2FrICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBmaWx0ZXJfY29sdW1uKCkiIHVubGVzcyBAXyA9PSAyOworCisKKyAgICAjIENoZWNrIGZvciBhIGNvbHVtbiByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUuCisgICAgaWYgKCRjb2wgPX4gL15cRC8pIHsKKyAgICAgICAgIyBDb252ZXJ0IGNvbCByZWYgdG8gYSBjZWxsIHJlZiBhbmQgdGhlbiB0byBhIGNvbCBudW1iZXIuCisgICAgICAgICh1bmRlZiwgJGNvbCkgPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZigkY29sIC4gJzEnKTsKKyAgICB9CisKKyAgICBteSAodW5kZWYsIHVuZGVmLCAkY29sX2ZpcnN0LCAkY29sX2xhc3QpID0gQHskc2VsZi0+e19maWx0ZXJfYXJlYX19OworCisgICAgIyBSZWplY3QgY29sdW1uIGlmIGl0IGlzIG91dHNpZGUgZmlsdGVyIHJhbmdlLgorICAgIGlmICgkY29sIDwgJGNvbF9maXJzdCBvciAkY29sID4gJGNvbF9sYXN0KSB7CisgICAgICAgIGNyb2FrICJDb2x1bW4gJyRjb2wnIG91dHNpZGUgYXV0b2ZpbHRlcigpIGNvbHVtbiByYW5nZSAiIC4KKyAgICAgICAgICAgICAgIigkY29sX2ZpcnN0IC4uICRjb2xfbGFzdCkiOworICAgIH0KKworCisgICAgbXkgQHRva2VucyA9ICRzZWxmLT5fZXh0cmFjdF9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uKTsKKworICAgIGNyb2FrICJJbmNvcnJlY3QgbnVtYmVyIG9mIHRva2VucyBpbiBleHByZXNzaW9uICckZXhwcmVzc2lvbiciCisgICAgICAgICAgdW5sZXNzIChAdG9rZW5zID09IDMgb3IgQHRva2VucyA9PSA3KTsKKworCisgICAgQHRva2VucyA9ICRzZWxmLT5fcGFyc2VfZmlsdGVyX2V4cHJlc3Npb24oJGV4cHJlc3Npb24sIEB0b2tlbnMpOworCisgICAgJHNlbGYtPntfZmlsdGVyX2NvbHN9LT57JGNvbH0gPSBbQHRva2Vuc107CisgICAgJHNlbGYtPntfZmlsdGVyX29ufSAgICAgICAgICAgPSAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2V4dHJhY3RfZmlsdGVyX3Rva2VucygkZXhwcmVzc2lvbikKKyMKKyMgRXh0cmFjdCB0aGUgdG9rZW5zIGZyb20gdGhlIGZpbHRlciBleHByZXNzaW9uLiBUaGUgdG9rZW5zIGFyZSBtYWlubHkgbm9uLQorIyB3aGl0ZXNwYWNlIGdyb3Vwcy4gVGhlIG9ubHkgdHJpY2t5IHBhcnQgaXMgdG8gZXh0cmFjdCBzdHJpbmcgdG9rZW5zIHRoYXQKKyMgY29udGFpbiB3aGl0ZXNwYWNlIGFuZC9vciBxdW90ZWQgZG91YmxlIHF1b3RlcyAoRXhjZWwncyBlc2NhcGVkIHF1b3RlcykuCisjCisjIEV4YW1wbGVzOiAneCA8ICAyMDAwJworIyAgICAgICAgICAgJ3ggPiAgMjAwMCBhbmQgeCA8ICA1MDAwJworIyAgICAgICAgICAgJ3ggPSAiZm9vIicKKyMgICAgICAgICAgICd4ID0gImZvbyBiYXIiJworIyAgICAgICAgICAgJ3ggPSAiZm9vICIiIGJhciInCisjCitzdWIgX2V4dHJhY3RfZmlsdGVyX3Rva2VucyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkZXhwcmVzc2lvbiAgPSAkX1swXTsKKworICAgIHJldHVybiB1bmxlc3MgJGV4cHJlc3Npb247CisKKyAgICBteSBAdG9rZW5zID0gKCRleHByZXNzaW9uICA9fiAvIig/OlteIl18IiIpKiJ8XFMrL2cpOyAjIgorCisgICAgIyBSZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgcXVvdGVzIGFuZCB1bmVzY2FwZSBvdGhlciBxdW90ZXMKKyAgICBmb3IgKEB0b2tlbnMpIHsKKyAgICAgICAgcy9eIi8vOyAgICAgIyIKKyAgICAgICAgcy8iJC8vOyAgICAgIyIKKyAgICAgICAgcy8iIi8iL2c7ICAgIyIKKyAgICB9CisKKyAgICByZXR1cm4gQHRva2VuczsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9maWx0ZXJfZXhwcmVzc2lvbihAdG9rZW4pCisjCisjIENvbnZlcnRzIHRoZSB0b2tlbnMgb2YgYSBwb3NzaWJseSBjb25kaXRpb25hbCBleHByZXNzaW9uIGludG8gMSBvciAyCisjIHN1YiBleHByZXNzaW9ucyBmb3IgZnVydGhlciBwYXJzaW5nLgorIworIyBFeGFtcGxlczoKKyMgICAgICAgICAgKCd4JywgJz09JywgMjAwMCkgLT4gZXhwMQorIyAgICAgICAgICAoJ3gnLCAnPicsICAyMDAwLCAnYW5kJywgJ3gnLCAnPCcsIDUwMDApIC0+IGV4cDEgYW5kIGV4cDIKKyMKK3N1YiBfcGFyc2VfZmlsdGVyX2V4cHJlc3Npb24geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisgICAgbXkgJGV4cHJlc3Npb24gID0gc2hpZnQ7CisgICAgbXkgQHRva2VucyAgICAgID0gQF87CisKKyAgICAjIFRoZSBudW1iZXIgb2YgdG9rZW5zIHdpbGwgYmUgZWl0aGVyIDMgKGZvciAxIGV4cHJlc3Npb24pCisgICAgIyBvciA3IChmb3IgMiAgZXhwcmVzc2lvbnMpLgorICAgICMKKyAgICBpZiAoQHRva2VucyA9PSA3KSB7CisKKyAgICAgICAgbXkgJGNvbmRpdGlvbmFsID0gJHRva2Vuc1szXTsKKworICAgICAgICBpZiAgICAoJGNvbmRpdGlvbmFsID1+IC9eKGFuZHwmJikkLykgeworICAgICAgICAgICAgJGNvbmRpdGlvbmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNpZiAoJGNvbmRpdGlvbmFsID1+IC9eKG9yfFx8XHwpJC8pIHsKKyAgICAgICAgICAgICRjb25kaXRpb25hbCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjcm9hayAiVG9rZW4gJyRjb25kaXRpb25hbCcgaXMgbm90IGEgdmFsaWQgY29uZGl0aW9uYWwgIiAuCisgICAgICAgICAgICAgICAgICAiaW4gZmlsdGVyIGV4cHJlc3Npb24gJyRleHByZXNzaW9uJyI7CisgICAgICAgIH0KKworICAgICAgICBteSBAZXhwcmVzc2lvbl8xID0gJHNlbGYtPl9wYXJzZV9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0b2tlbnNbMCwgMSwgMl0pOworICAgICAgICBteSBAZXhwcmVzc2lvbl8yID0gJHNlbGYtPl9wYXJzZV9maWx0ZXJfdG9rZW5zKCRleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0b2tlbnNbNCwgNSwgNl0pOworCisgICAgICAgIHJldHVybiAoQGV4cHJlc3Npb25fMSwgJGNvbmRpdGlvbmFsLCBAZXhwcmVzc2lvbl8yKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+X3BhcnNlX2ZpbHRlcl90b2tlbnMoJGV4cHJlc3Npb24sIEB0b2tlbnMpOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYXJzZV9maWx0ZXJfdG9rZW5zKEB0b2tlbikKKyMKKyMgUGFyc2UgdGhlIDMgdG9rZW5zIG9mIGEgZmlsdGVyIGV4cHJlc3Npb24gYW5kIHJldHVybiB0aGUgb3BlcmF0b3IgYW5kIHRva2VuLgorIworc3ViIF9wYXJzZV9maWx0ZXJfdG9rZW5zIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRleHByZXNzaW9uICA9IHNoaWZ0OworICAgIG15IEB0b2tlbnMgICAgICA9IEBfOworCisgICAgbXkgJW9wZXJhdG9ycyA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICc9PScgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICc9JyAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICc9ficgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICdlcScgPT4gMiwKKworICAgICAgICAgICAgICAgICAgICAgICAgJyE9JyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJyF+JyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJ25lJyA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgJzw+JyA9PiA1LAorCisgICAgICAgICAgICAgICAgICAgICAgICAnPCcgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAnPD0nID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAnPicgID0+IDQsCisgICAgICAgICAgICAgICAgICAgICAgICAnPj0nID0+IDYsCisgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICBteSAkb3BlcmF0b3IgPSAkb3BlcmF0b3JzeyR0b2tlbnNbMV19OworICAgIG15ICR0b2tlbiAgICA9ICR0b2tlbnNbMl07CisKKworICAgICMgU3BlY2lhbCBoYW5kbGluZyBvZiAiVG9wIiBmaWx0ZXIgZXhwcmVzc2lvbnMuCisgICAgaWYgKCR0b2tlbnNbMF0gPX4gL150b3B8Ym90dG9tJC9pKSB7CisKKyAgICAgICAgbXkgJHZhbHVlID0gJHRva2Vuc1sxXTsKKworICAgICAgICBpZiAoJHZhbHVlID1+IC9cRC8gb3IKKyAgICAgICAgICAgICR2YWx1ZSA8IDEgICAgIG9yCisgICAgICAgICAgICAkdmFsdWUgPiA1MDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNyb2FrICJUaGUgdmFsdWUgJyR2YWx1ZScgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGluIHRoZSByYW5nZSAxIHRvIDUwMCI7CisgICAgICAgIH0KKworICAgICAgICAkdG9rZW4gPSBsYyAkdG9rZW47CisKKyAgICAgICAgaWYgKCR0b2tlbiBuZSAnaXRlbXMnIGFuZCAkdG9rZW4gbmUgJyUnKSB7CisgICAgICAgICAgICBjcm9hayAiVGhlIHR5cGUgJyR0b2tlbicgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGVpdGhlciAnaXRlbXMnIG9yICclJyI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoJHRva2Vuc1swXSA9fiAvXnRvcCQvaSkgeworICAgICAgICAgICAgJG9wZXJhdG9yID0gMzA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb3BlcmF0b3IgPSAzMjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkdG9rZW5zWzJdIGVxICclJykgeworICAgICAgICAgICAgJG9wZXJhdG9yKys7CisgICAgICAgIH0KKworICAgICAgICAkdG9rZW4gICAgPSAkdmFsdWU7CisgICAgfQorCisKKyAgICBpZiAobm90ICRvcGVyYXRvciBhbmQgJHRva2Vuc1swXSkgeworICAgICAgICBjcm9hayAiVG9rZW4gJyR0b2tlbnNbMV0nIGlzIG5vdCBhIHZhbGlkIG9wZXJhdG9yICIgLgorICAgICAgICAgICAgICAiaW4gZmlsdGVyIGV4cHJlc3Npb24gJyRleHByZXNzaW9uJyI7CisgICAgfQorCisKKyAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIEJsYW5rcy9Ob25CbGFua3MuCisgICAgaWYgKCR0b2tlbiA9fiAvXmJsYW5rc3xub25ibGFua3MkL2kpIHsKKworICAgICAgICAjIE9ubHkgYWxsb3cgRXF1YWxzIG9yIE5vdEVxdWFsIGluIHRoaXMgY29udGV4dC4KKyAgICAgICAgaWYgKCRvcGVyYXRvciAhPSAyIGFuZCAkb3BlcmF0b3IgIT0gNSkgeworICAgICAgICAgICAgY3JvYWsgIlRoZSBvcGVyYXRvciAnJHRva2Vuc1sxXScgaW4gZXhwcmVzc2lvbiAnJGV4cHJlc3Npb24nICIgLgorICAgICAgICAgICAgICAgICAgICJpcyBub3QgdmFsaWQgaW4gcmVsYXRpb24gdG8gQmxhbmtzL05vbkJsYW5rcyciOworICAgICAgICB9CisKKyAgICAgICAgJHRva2VuID0gbGMgJHRva2VuOworCisgICAgICAgICMgVGhlIG9wZXJhdG9yIHNob3VsZCBhbHdheXMgYmUgMiAoPSkgdG8gZmxhZyBhICJzaW1wbGUiIGVxdWFsaXR5IGluCisgICAgICAgICMgdGhlIGJpbmFyeSByZWNvcmQuIFRoZXJlZm9yZSB3ZSBjb252ZXJ0IDw+IHRvID0uCisgICAgICAgIGlmICgkdG9rZW4gZXEgJ2JsYW5rcycpIHsKKyAgICAgICAgICAgIGlmICgkb3BlcmF0b3IgPT0gNSkgeworICAgICAgICAgICAgICAgICRvcGVyYXRvciA9IDI7CisgICAgICAgICAgICAgICAgJHRva2VuICAgID0gJ25vbmJsYW5rcyc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoJG9wZXJhdG9yID09IDUpIHsKKyAgICAgICAgICAgICAgICAkb3BlcmF0b3IgPSAyOworICAgICAgICAgICAgICAgICR0b2tlbiAgICA9ICdibGFua3MnOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAjIGlmIHRoZSBzdHJpbmcgdG9rZW4gY29udGFpbnMgYW4gRXhjZWwgbWF0Y2ggY2hhcmFjdGVyIHRoZW4gY2hhbmdlIHRoZQorICAgICMgb3BlcmF0b3IgdHlwZSB0byBpbmRpY2F0ZSBhIG5vbiAic2ltcGxlIiBlcXVhbGl0eS4KKyAgICBpZiAoJG9wZXJhdG9yID09IDIgYW5kICR0b2tlbiA9fiAvWyo/XS8pIHsKKyAgICAgICAgJG9wZXJhdG9yID0gMjI7CisgICAgfQorCisKKyAgICByZXR1cm4gKCRvcGVyYXRvciwgJHRva2VuKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGhpZGVfZ3JpZGxpbmVzKCkKKyMKKyMgU2V0IHRoZSBvcHRpb24gdG8gaGlkZSBncmlkbGluZXMgb24gdGhlIHNjcmVlbiBhbmQgdGhlIHByaW50ZWQgcGFnZS4KKyMgVGhlcmUgYXJlIHR3byB3YXlzIG9mIGRvaW5nIHRoaXMgaW4gdGhlIEV4Y2VsIEJJRkYgZm9ybWF0OiBUaGUgZmlyc3QgaXMgYnkKKyMgc2V0dGluZyB0aGUgRHNwR3JpZCBmaWVsZCBvZiB0aGUgV0lORE9XMiByZWNvcmQsIHRoaXMgdHVybnMgb2ZmIHRoZSBzY3JlZW4KKyMgYW5kIHN1YnNlcXVlbnRseSB0aGUgcHJpbnQgZ3JpZGxpbmUuIFRoZSBzZWNvbmQgbWV0aG9kIGlzIHRvIHZpYSB0aGUKKyMgUFJJTlRHUklETElORVMgYW5kIEdSSURTRVQgcmVjb3JkcywgdGhpcyB0dXJucyBvZmYgdGhlIHByaW50ZWQgZ3JpZGxpbmVzCisjIG9ubHkuIFRoZSBmaXJzdCBtZXRob2QgaXMgcHJvYmFibHkgc3VmZmljaWVudCBmb3IgbW9zdCBjYXNlcy4gVGhlIHNlY29uZAorIyBtZXRob2QgaXMgc3VwcG9ydGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gUG9ydGVycyB0YWtlIG5vdGUuCisjCitzdWIgaGlkZV9ncmlkbGluZXMgeworCisgICAgbXkgJHNlbGYgICA9IHNoaWZ0OworICAgIG15ICRvcHRpb24gPSAkX1swXTsKKworICAgICRvcHRpb24gPSAxIHVubGVzcyBkZWZpbmVkICRvcHRpb247ICMgRGVmYXVsdCB0byBoaWRpbmcgcHJpbnRlZCBncmlkbGluZXMKKworICAgIGlmICgkb3B0aW9uID09IDApIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgPSAxOyAjIDEgPSBkaXNwbGF5LCAwID0gaGlkZQorICAgICAgICAkc2VsZi0+e19zY3JlZW5fZ3JpZGxpbmVzfSA9IDE7CisgICAgfQorICAgIGVsc2lmICgkb3B0aW9uID09IDEpIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfZ3JpZGxpbmVzfSAgPSAwOworICAgICAgICAkc2VsZi0+e19zY3JlZW5fZ3JpZGxpbmVzfSA9IDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9ICA9IDA7CisgICAgICAgICRzZWxmLT57X3NjcmVlbl9ncmlkbGluZXN9ID0gMDsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBwcmludF9yb3dfY29sX2hlYWRlcnMoKQorIworIyBTZXQgdGhlIG9wdGlvbiB0byBwcmludCB0aGUgcm93IGFuZCBjb2x1bW4gaGVhZGVycyBvbiB0aGUgcHJpbnRlZCBwYWdlLgorIyBTZWUgYWxzbyB0aGUgX3N0b3JlX3ByaW50X2hlYWRlcnMoKSBtZXRob2QgYmVsb3cuCisjCitzdWIgcHJpbnRfcm93X2NvbF9oZWFkZXJzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBpZiAoZGVmaW5lZCAkX1swXSkgeworICAgICAgICAkc2VsZi0+e19wcmludF9oZWFkZXJzfSA9ICRfWzBdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPntfcHJpbnRfaGVhZGVyc30gPSAxOworICAgIH0KK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGZpdF90b19wYWdlcygkd2lkdGgsICRoZWlnaHQpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBudW1iZXIgb2YgcGFnZXMgdGhhdCB3aWxsIGRlZmluZSB0aGUKKyMgbWF4aW11bSBhcmVhIHByaW50ZWQuIFNlZSBhbHNvIF9zdG9yZV9zZXR1cCgpIGFuZCBfc3RvcmVfd3Nib29sKCkgYmVsb3cuCisjCitzdWIgZml0X3RvX3BhZ2VzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19maXRfcGFnZX0gICAgICA9IDE7CisgICAgJHNlbGYtPntfZml0X3dpZHRofSAgICAgPSAkX1swXSB8fCAwOworICAgICRzZWxmLT57X2ZpdF9oZWlnaHR9ICAgID0gJF9bMV0gfHwgMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9oX3BhZ2VicmVha3MoQGJyZWFrcykKKyMKKyMgU3RvcmUgdGhlIGhvcml6b250YWwgcGFnZSBicmVha3Mgb24gYSB3b3Jrc2hlZXQuCisjCitzdWIgc2V0X2hfcGFnZWJyZWFrcyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcHVzaCBAeyRzZWxmLT57X2hicmVha3N9fSwgQF87Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfdl9wYWdlYnJlYWtzKEBicmVha3MpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBwYWdlIGJyZWFrcyBvbiBhIHdvcmtzaGVldC4KKyMKK3N1YiBzZXRfdl9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfdmJyZWFrc319LCBAXzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF96b29tKCRzY2FsZSkKKyMKKyMgU2V0IHRoZSB3b3Jrc2hlZXQgem9vbSBmYWN0b3IuCisjCitzdWIgc2V0X3pvb20geworCisgICAgbXkgJHNlbGYgID0gc2hpZnQ7CisgICAgbXkgJHNjYWxlID0gJF9bMF0gfHwgMTAwOworCisgICAgIyBDb25maW5lIHRoZSBzY2FsZSB0byBFeGNlbCdzIHJhbmdlCisgICAgaWYgKCRzY2FsZSA8IDEwIG9yICRzY2FsZSA+IDQwMCkgeworICAgICAgICBjYXJwICJab29tIGZhY3RvciAkc2NhbGUgb3V0c2lkZSByYW5nZTogMTAgPD0gem9vbSA8PSA0MDAiOworICAgICAgICAkc2NhbGUgPSAxMDA7CisgICAgfQorCisgICAgJHNlbGYtPntfem9vbX0gPSBpbnQgJHNjYWxlOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X3ByaW50X3NjYWxlKCRzY2FsZSkKKyMKKyMgU2V0IHRoZSBzY2FsZSBmYWN0b3IgZm9yIHRoZSBwcmludGVkIHBhZ2UuCisjCitzdWIgc2V0X3ByaW50X3NjYWxlIHsKKworICAgIG15ICRzZWxmICA9IHNoaWZ0OworICAgIG15ICRzY2FsZSA9ICRfWzBdIHx8IDEwMDsKKworICAgICMgQ29uZmluZSB0aGUgc2NhbGUgdG8gRXhjZWwncyByYW5nZQorICAgIGlmICgkc2NhbGUgPCAxMCBvciAkc2NhbGUgPiA0MDApIHsKKyAgICAgICAgY2FycCAiUHJpbnQgc2NhbGUgJHNjYWxlIG91dHNpZGUgcmFuZ2U6IDEwIDw9IHpvb20gPD0gNDAwIjsKKyAgICAgICAgJHNjYWxlID0gMTAwOworICAgIH0KKworICAgICMgVHVybiBvZmYgImZpdCB0byBwYWdlIiBvcHRpb24KKyAgICAkc2VsZi0+e19maXRfcGFnZX0gICAgPSAwOworCisgICAgJHNlbGYtPntfcHJpbnRfc2NhbGV9ID0gaW50ICRzY2FsZTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGtlZXBfbGVhZGluZ196ZXJvcygpCisjCisjIENhdXNlcyB0aGUgd3JpdGUoKSBtZXRob2QgdG8gdHJlYXQgaW50ZWdlcnMgd2l0aCBhIGxlYWRpbmcgemVybyBhcyBhIHN0cmluZy4KKyMgVGhpcyBlbnN1cmVzIHRoYXQgYW55IGxlYWRpbmcgemVyb3Mgc3VjaCwgYXMgaW4gemlwIGNvZGVzLCBhcmUgbWFpbnRhaW5lZC4KKyMKK3N1YiBrZWVwX2xlYWRpbmdfemVyb3MgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIGlmIChkZWZpbmVkICRfWzBdKSB7CisgICAgICAgICRzZWxmLT57X2xlYWRpbmdfemVyb3N9ID0gJF9bMF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+e19sZWFkaW5nX3plcm9zfSA9IDE7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2hvd19jb21tZW50cygpCisjCisjIE1ha2UgYW55IGNvbW1lbnRzIGluIHRoZSB3b3Jrc2hlZXQgdmlzaWJsZS4KKyMKK3N1YiBzaG93X2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfY29tbWVudHNfYXV0aG9yKCkKKyMKKyMgU2V0IHRoZSBkZWZhdWx0IGF1dGhvciBvZiB0aGUgY2VsbCBjb21tZW50cy4KKyMKK3N1YiBzZXRfY29tbWVudHNfYXV0aG9yIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19jb21tZW50c19hdXRob3J9ICAgICA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6ICcnOworICAgICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcl9lbmN9ID0gICAgICAgICAkX1sxXSA/IDEgICAgIDogMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJpZ2h0X3RvX2xlZnQoKQorIworIyBEaXNwbGF5IHRoZSB3b3Jrc2hlZXQgcmlnaHQgdG8gbGVmdCBmb3Igc29tZSBlYXN0ZXJuIHZlcnNpb25zIG9mIEV4Y2VsLgorIworc3ViIHJpZ2h0X3RvX2xlZnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X2Rpc3BsYXlfYXJhYmljfSA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBoaWRlX3plcm8oKQorIworIyBIaWRlIGNlbGwgemVybyB2YWx1ZXMuCisjCitzdWIgaGlkZV96ZXJvIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19kaXNwbGF5X3plcm9zfSA9IGRlZmluZWQgJF9bMF0gPyBub3QgJF9bMF0gOiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgcHJpbnRfYWNyb3NzKCkKKyMKKyMgU2V0IHRoZSBvcmRlciBpbiB3aGljaCBwYWdlcyBhcmUgcHJpbnRlZC4KKyMKK3N1YiBwcmludF9hY3Jvc3MgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICRzZWxmLT57X3BhZ2Vfb3JkZXJ9ID0gZGVmaW5lZCAkX1swXSA/ICRfWzBdIDogMTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHNldF9zdGFydF9wYWdlKCkKKyMKKyMgU2V0IHRoZSBzdGFydCBwYWdlIG51bWJlci4KKyMKK3N1YiBzZXRfc3RhcnRfcGFnZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIHJldHVybiB1bmxlc3MgZGVmaW5lZCAkX1swXTsKKworICAgICRzZWxmLT57X3BhZ2Vfc3RhcnR9ICAgID0gJF9bMF07CisgICAgJHNlbGYtPntfY3VzdG9tX3N0YXJ0fSAgPSAxOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgc2V0X2ZpcnN0X3Jvd19jb2x1bW4oKQorIworIyBTZXQgdGhlIHRvcG1vc3QgYW5kIGxlZnRtb3N0IHZpc2libGUgcm93IGFuZCBjb2x1bW4uCisjIFRPRE86IERvY3VtZW50IHRoaXMgd2hlbiB0ZXN0ZWQgZnVsbHkgZm9yIGludGVyYWN0aW9uIHdpdGggcGFuZXMuCisjCitzdWIgc2V0X2ZpcnN0X3Jvd19jb2x1bW4geworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyb3cgID0gJF9bMF0gfHwgMDsKKyAgICBteSAkY29sICA9ICRfWzFdIHx8IDA7CisKKyAgICAkcm93ID0gNjU1MzUgaWYgJHJvdyA+IDY1NTM1OworICAgICRjb2wgPSAyNTUgICBpZiAkY29sID4gMjU1OworCisgICAgJHNlbGYtPntfZmlyc3Rfcm93fSA9ICRyb3c7CisgICAgJHNlbGYtPntfZmlyc3RfY29sfSA9ICRjb2w7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBhZGRfd3JpdGVfaGFuZGxlcigkcmUsICRjb2RlX3JlZikKKyMKKyMgQWxsb3cgdGhlIHVzZXIgdG8gYWRkIHRoZWlyIG93biBtYXRjaGVzIGFuZCBoYW5kbGVycyB0byB0aGUgd3JpdGUoKSBtZXRob2QuCisjCitzdWIgYWRkX3dyaXRlX2hhbmRsZXIgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgQF8gPT0gMjsKKyAgICByZXR1cm4gdW5sZXNzIHJlZiAkX1sxXSBlcSAnQ09ERSc7CisKKyAgICBwdXNoIEB7JHNlbGYtPntfd3JpdGVfbWF0Y2h9fSwgWyBAXyBdOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZSgkcm93LCAkY29sLCAkdG9rZW4sICRmb3JtYXQpCisjCisjIFBhcnNlICR0b2tlbiBhbmQgY2FsbCBhcHByb3ByaWF0ZSB3cml0ZSBtZXRob2QuICRyb3cgYW5kICRjb2x1bW4gYXJlIHplcm8KKyMgaW5kZXhlZC4gJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgVGhlIHdyaXRlX3VybCgpIG1ldGhvZHMgaGF2ZSBhIGZsYWcgdG8gcHJldmVudCByZWN1cnNpb24gd2hlbiB3cml0aW5nIGEKKyMgc3RyaW5nIHRoYXQgbG9va3MgbGlrZSBhIHVybC4KKyMKKyMgUmV0dXJuczogcmV0dXJuIHZhbHVlIG9mIGNhbGxlZCBzdWJyb3V0aW5lCisjCitzdWIgd3JpdGUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHRva2VuID0gJF9bMl07CisKKyAgICAjIEhhbmRsZSB1bmRlZnMgYXMgYmxhbmtzCisgICAgJHRva2VuID0gJycgdW5sZXNzIGRlZmluZWQgJHRva2VuOworCisKKyAgICAjIEZpcnN0IHRyeSB1c2VyIGRlZmluZWQgbWF0Y2hlcy4KKyAgICBmb3IgbXkgJGFyZWYgKEB7JHNlbGYtPntfd3JpdGVfbWF0Y2h9fSkgeworICAgICAgICBteSAkcmUgID0gJGFyZWYtPlswXTsKKyAgICAgICAgbXkgJHN1YiA9ICRhcmVmLT5bMV07CisKKyAgICAgICAgaWYgKCR0b2tlbiA9fiAvJHJlLykgeworICAgICAgICAgICAgbXkgJG1hdGNoID0gJiRzdWIoJHNlbGYsIEBfKTsKKyAgICAgICAgICAgIHJldHVybiAkbWF0Y2ggaWYgZGVmaW5lZCAkbWF0Y2g7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgTWF0Y2ggYW4gYXJyYXkgcmVmLgorICAgIGlmIChyZWYgJHRva2VuIGVxICJBUlJBWSIpIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV9yb3coQF8pOworICAgIH0KKyAgICAjIE1hdGNoIGludGVnZXIgd2l0aCBsZWFkaW5nIHplcm8ocykKKyAgICBlbHNpZiAoJHNlbGYtPntfbGVhZGluZ196ZXJvc30gYW5kICR0b2tlbiA9fiAvXjBcZCskLykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorICAgICMgTWF0Y2ggbnVtYmVyCisgICAgZWxzaWYgKCR0b2tlbiA9fiAvXihbKy1dPykoPz1cZHxcLlxkKVxkKihcLlxkKik/KFtFZV0oWystXT9cZCspKT8kLykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX251bWJlcihAXyk7CisgICAgfQorICAgICMgTWF0Y2ggaHR0cCwgaHR0cHMgb3IgZnRwIFVSTAorICAgIGVsc2lmICgkdG9rZW4gPX4gbXxeW2ZoXXR0P3BzPzovL3wgICAgYW5kIG5vdCAkc2VsZi0+e193cml0aW5nX3VybH0pIHsKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV91cmwoQF8pOworICAgIH0KKyAgICAjIE1hdGNoIG1haWx0bzoKKyAgICBlbHNpZiAoJHRva2VuID1+IG0vXm1haWx0bzovICAgICAgICAgIGFuZCBub3QgJHNlbGYtPntfd3JpdGluZ191cmx9KSB7CisgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfdXJsKEBfKTsKKyAgICB9CisgICAgIyBNYXRjaCBpbnRlcm5hbCBvciBleHRlcm5hbCBzaGVldCBsaW5rCisgICAgZWxzaWYgKCR0b2tlbiA9fiBtW14oPzppbnxleCl0ZXJuYWw6XSBhbmQgbm90ICRzZWxmLT57X3dyaXRpbmdfdXJsfSkgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3VybChAXyk7CisgICAgfQorICAgICMgTWF0Y2ggZm9ybXVsYQorICAgIGVsc2lmICgkdG9rZW4gPX4gL149LykgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX2Zvcm11bGEoQF8pOworICAgIH0KKyAgICAjIE1hdGNoIGJsYW5rCisgICAgZWxzaWYgKCR0b2tlbiBlcSAnJykgeworICAgICAgICBzcGxpY2UgQF8sIDIsIDE7ICMgcmVtb3ZlIHRoZSBlbXB0eSBzdHJpbmcgZnJvbSB0aGUgcGFyYW1ldGVyIGxpc3QKKyAgICAgICAgcmV0dXJuICRzZWxmLT53cml0ZV9ibGFuayhAXyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gJHNlbGYtPndyaXRlX3N0cmluZyhAXyk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfcm93KCRyb3csICRjb2wsICRhcnJheV9yZWYsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgcm93IG9mIGRhdGEgc3RhcnRpbmcgZnJvbSAoJHJvdywgJGNvbCkuIENhbGwgd3JpdGVfY29sKCkgaWYgYW55IG9mCisjIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgcmVmIGFyZSBpbiB0dXJuIGFycmF5IHJlZnMuIFRoaXMgYWxsb3dzIHRoZSB3cml0aW5nCisjIG9mIDFEIG9yIDJEIGFycmF5cyBvZiBkYXRhIGluIG9uZSBnby4KKyMKKyMgUmV0dXJuczogdGhlIGZpcnN0IGVuY291bnRlcmVkIGVycm9yIHZhbHVlIG9yIHplcm8gZm9yIG5vIGVycm9ycworIworc3ViIHdyaXRlX3JvdyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2F0Y2ggbm9uIGFycmF5IHJlZnMgcGFzc2VkIGJ5IHVzZXIuCisgICAgaWYgKHJlZiAkX1syXSBuZSAnQVJSQVknKSB7CisgICAgICAgIGNyb2FrICJOb3QgYW4gYXJyYXkgcmVmIGluIGNhbGwgdG8gd3JpdGVfcm93KCkkISI7CisgICAgfQorCisgICAgbXkgJHJvdyAgICAgPSBzaGlmdDsKKyAgICBteSAkY29sICAgICA9IHNoaWZ0OworICAgIG15ICR0b2tlbnMgID0gc2hpZnQ7CisgICAgbXkgQG9wdGlvbnMgPSBAXzsKKyAgICBteSAkZXJyb3IgICA9IDA7CisgICAgbXkgJHJldDsKKworICAgIGZvcmVhY2ggbXkgJHRva2VuIChAJHRva2VucykgeworCisgICAgICAgICMgQ2hlY2sgZm9yIG5lc3RlZCBhcnJheXMKKyAgICAgICAgaWYgKHJlZiAkdG9rZW4gZXEgIkFSUkFZIikgeworICAgICAgICAgICAgJHJldCA9ICRzZWxmLT53cml0ZV9jb2woJHJvdywgJGNvbCwgJHRva2VuLCBAb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkcmV0ID0gJHNlbGYtPndyaXRlICAgICgkcm93LCAkY29sLCAkdG9rZW4sIEBvcHRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgICMgUmV0dXJuIG9ubHkgdGhlIGZpcnN0IGVycm9yIGVuY291bnRlcmVkLCBpZiBhbnkuCisgICAgICAgICRlcnJvciB8fD0gJHJldDsKKyAgICAgICAgJGNvbCsrOworICAgIH0KKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9jb2woJHJvdywgJGNvbCwgJGFycmF5X3JlZiwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBjb2x1bW4gb2YgZGF0YSBzdGFydGluZyBmcm9tICgkcm93LCAkY29sKS4gQ2FsbCB3cml0ZV9yb3coKSBpZiBhbnkgb2YKKyMgdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSByZWYgYXJlIGluIHR1cm4gYXJyYXkgcmVmcy4gVGhpcyBhbGxvd3MgdGhlIHdyaXRpbmcKKyMgb2YgMUQgb3IgMkQgYXJyYXlzIG9mIGRhdGEgaW4gb25lIGdvLgorIworIyBSZXR1cm5zOiB0aGUgZmlyc3QgZW5jb3VudGVyZWQgZXJyb3IgdmFsdWUgb3IgemVybyBmb3Igbm8gZXJyb3JzCisjCitzdWIgd3JpdGVfY29sIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDYXRjaCBub24gYXJyYXkgcmVmcyBwYXNzZWQgYnkgdXNlci4KKyAgICBpZiAocmVmICRfWzJdIG5lICdBUlJBWScpIHsKKyAgICAgICAgY3JvYWsgIk5vdCBhbiBhcnJheSByZWYgaW4gY2FsbCB0byB3cml0ZV9yb3coKSQhIjsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgID0gc2hpZnQ7CisgICAgbXkgJHRva2VucyAgPSBzaGlmdDsKKyAgICBteSBAb3B0aW9ucyA9IEBfOworICAgIG15ICRlcnJvciAgID0gMDsKKyAgICBteSAkcmV0OworCisgICAgZm9yZWFjaCBteSAkdG9rZW4gKEAkdG9rZW5zKSB7CisKKyAgICAgICAgIyB3cml0ZSgpIHdpbGwgZGVhbCB3aXRoIGFueSBuZXN0ZWQgYXJyYXlzCisgICAgICAgICRyZXQgPSAkc2VsZi0+d3JpdGUoJHJvdywgJGNvbCwgJHRva2VuLCBAb3B0aW9ucyk7CisKKyAgICAgICAgIyBSZXR1cm4gb25seSB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQsIGlmIGFueS4KKyAgICAgICAgJGVycm9yIHx8PSAkcmV0OworICAgICAgICAkcm93Kys7CisgICAgfQorCisgICAgcmV0dXJuICRlcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2NvbW1lbnQoJHJvdywgJGNvbCwgJGNvbW1lbnQpCisjCisjIFdyaXRlIGEgY29tbWVudCB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMKK3N1YiB3cml0ZV9jb21tZW50IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisKKyAgICBteSAkcm93ID0gJF9bMF07CisgICAgbXkgJGNvbCA9ICRfWzFdOworCisgICAgIyBDaGVjayBmb3IgcGFpcnMgb2Ygb3B0aW9uYWwgYXJndW1lbnRzLCBpLmUuIGFuIG9kZCBudW1iZXIgb2YgYXJncy4KKyAgICBjcm9hayAiVW5ldmVuIG51bWJlciBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyIgdW5sZXNzIEBfICUgMjsKKworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworCisgICAgIyBXZSBoYXZlIHRvIGF2b2lkIGR1cGxpY2F0ZSBjb21tZW50cyBpbiBjZWxscyBvciBlbHNlIEV4Y2VsIHdpbGwgY29tcGxhaW4uCisgICAgJHNlbGYtPntfY29tbWVudHN9LT57JHJvd30tPnskY29sfSA9IFsgJHNlbGYtPl9jb21tZW50X3BhcmFtcyhAXykgXTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX1hGKCkKKyMKKyMgUmV0dXJucyBhbiBpbmRleCB0byB0aGUgWEYgcmVjb3JkIGluIHRoZSB3b3JrYm9vay4KKyMKKyMgTm90ZTogdGhpcyBpcyBhIGZ1bmN0aW9uLCBub3QgYSBtZXRob2QuCisjCitzdWIgX1hGIHsKKworICAgIG15ICRzZWxmICAgPSAkX1swXTsKKyAgICBteSAkcm93ICAgID0gJF9bMV07CisgICAgbXkgJGNvbCAgICA9ICRfWzJdOworICAgIG15ICRmb3JtYXQgPSAkX1szXTsKKworICAgIG15ICRlcnJvciA9ICJFcnJvcjogcmVmZXIgdG8gbWVyZ2VfcmFuZ2UoKSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIiAuCisgICAgICAgICAgICAgICAgICJDYW4ndCB1c2UgcHJldmlvdXNseSBtZXJnZWQgZm9ybWF0IGluIG5vbi1tZXJnZWQgY2VsbCI7CisKKyAgICBpZiAocmVmKCRmb3JtYXQpKSB7CisgICAgICAgICMgVGVtcCBjb2RlIHRvIHByZXZlbnQgbWVyZ2VkIGZvcm1hdHMgaW4gbm9uLW1lcmdlZCBjZWxscy4KKyAgICAgICAgY3JvYWsgJGVycm9yIGlmICRmb3JtYXQtPntfdXNlZF9tZXJnZX0gPT0gMTsKKyAgICAgICAgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9IC0xOworCisgICAgICAgIHJldHVybiAkZm9ybWF0LT5nZXRfeGZfaW5kZXgoKTsKKyAgICB9CisgICAgZWxzaWYgKGV4aXN0cyAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fSkgeworICAgICAgICAjIFRlbXAgY29kZSB0byBwcmV2ZW50IG1lcmdlZCBmb3JtYXRzIGluIG5vbi1tZXJnZWQgY2VsbHMuCisgICAgICAgIGNyb2FrICRlcnJvciBpZiAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+e191c2VkX21lcmdlfSA9PSAxOworICAgICAgICAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+e191c2VkX21lcmdlfSA9IC0xOworCisgICAgICAgIHJldHVybiAkc2VsZi0+e19yb3dfZm9ybWF0c30tPnskcm93fS0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2lmIChleGlzdHMgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0pIHsKKyAgICAgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICAgICBjcm9hayAkZXJyb3IgaWYgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPntfdXNlZF9tZXJnZX0gPT0gMTsKKyAgICAgICAgJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPntfdXNlZF9tZXJnZX0gPSAtMTsKKworICAgICAgICByZXR1cm4gJHNlbGYtPntfY29sX2Zvcm1hdHN9LT57JGNvbH0tPmdldF94Zl9pbmRleCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDB4MEY7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgSW50ZXJuYWwgbWV0aG9kcworIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2FwcGVuZCgpLCBvdmVycmlkZGVuLgorIworIyBTdG9yZSBXb3Jrc2hlZXQgZGF0YSBpbiBtZW1vcnkgdXNpbmcgdGhlIGJhc2UgY2xhc3MgX2FwcGVuZCgpIG9yIHRvIGEKKyMgdGVtcG9yYXJ5IGZpbGUsIHRoZSBkZWZhdWx0LgorIworc3ViIF9hcHBlbmQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZGF0YSA9ICcnOworCisgICAgaWYgKCRzZWxmLT57X3VzaW5nX3RtcGZpbGV9KSB7CisgICAgICAgICRkYXRhID0gam9pbignJywgQF8pOworCisgICAgICAgICMgQWRkIENPTlRJTlVFIHJlY29yZHMgaWYgbmVjZXNzYXJ5CisgICAgICAgICRkYXRhID0gJHNlbGYtPl9hZGRfY29udGludWUoJGRhdGEpIGlmIGxlbmd0aCgkZGF0YSkgPiAkc2VsZi0+e19saW1pdH07CisKKyAgICAgICAgIyBQcm90ZWN0IHByaW50KCkgZnJvbSAtbCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICBsb2NhbCAkXCA9IHVuZGVmOworCisgICAgICAgIHByaW50IHskc2VsZi0+e19maWxlaGFuZGxlfX0gJGRhdGE7CisgICAgICAgICRzZWxmLT57X2RhdGFzaXplfSArPSBsZW5ndGgoJGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGRhdGEgPSAkc2VsZi0+U1VQRVI6Ol9hcHBlbmQoQF8pOworICAgIH0KKworICAgIHJldHVybiAkZGF0YTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdWJzdGl0dXRlX2NlbGxyZWYoKQorIworIyBTdWJzdGl0dXRlIGFuIEV4Y2VsIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGZvciAgemVybyBiYXNlZCByb3cgYW5kCisjIGNvbHVtbiB2YWx1ZXMgaW4gYW4gYXJndW1lbnQgbGlzdC4KKyMKKyMgRXg6ICgiQTQiLCAiSGVsbG8iKSBpcyBjb252ZXJ0ZWQgdG8gKDMsIDAsICJIZWxsbyIpLgorIworc3ViIF9zdWJzdGl0dXRlX2NlbGxyZWYgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkY2VsbCA9IHVjKHNoaWZ0KTsKKworICAgICMgQ29udmVydCBhIGNvbHVtbiByYW5nZTogJ0E6QScgb3IgJ0I6RycuCisgICAgIyBBIHJhbmdlIHN1Y2ggYXMgQTpBIGlzIGVxdWl2YWxlbnQgdG8gQTE6NjU1MzYsIHNvIGFkZCByb3dzIGFzIHJlcXVpcmVkCisgICAgaWYgKCRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl0pOlwkPyhbQS1JXT9bQS1aXSkvKSB7CisgICAgICAgIG15ICgkcm93MSwgJGNvbDEpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDEgLicxJyk7CisgICAgICAgIG15ICgkcm93MiwgJGNvbDIpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDIgLic2NTUzNicpOworICAgICAgICByZXR1cm4gJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsIEBfOworICAgIH0KKworICAgICMgQ29udmVydCBhIGNlbGwgcmFuZ2U6ICdBMTpCNycKKyAgICBpZiAoJGNlbGwgPX4gL1wkPyhbQS1JXT9bQS1aXVwkP1xkKyk6XCQ/KFtBLUldP1tBLVpdXCQ/XGQrKS8pIHsKKyAgICAgICAgbXkgKCRyb3cxLCAkY29sMSkgPSAgJHNlbGYtPl9jZWxsX3RvX3Jvd2NvbCgkMSk7CisgICAgICAgIG15ICgkcm93MiwgJGNvbDIpID0gICRzZWxmLT5fY2VsbF90b19yb3djb2woJDIpOworICAgICAgICByZXR1cm4gJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsIEBfOworICAgIH0KKworICAgICMgQ29udmVydCBhIGNlbGwgcmVmZXJlbmNlOiAnQTEnIG9yICdBRDIwMDAnCisgICAgaWYgKCRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl1cJD9cZCspLykgeworICAgICAgICBteSAoJHJvdzEsICRjb2wxKSA9ICAkc2VsZi0+X2NlbGxfdG9fcm93Y29sKCQxKTsKKyAgICAgICAgcmV0dXJuICRyb3cxLCAkY29sMSwgQF87CisKKyAgICB9CisKKyAgICBjcm9haygiVW5rbm93biBjZWxsIHJlZmVyZW5jZSAkY2VsbCIpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2NlbGxfdG9fcm93Y29sKCRjZWxsX3JlZikKKyMKKyMgQ29udmVydCBhbiBFeGNlbCBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiB0byBhIHplcm8gYmFzZWQgcm93IGFuZCBjb2x1bW4KKyMgcmVmZXJlbmNlOyBjb252ZXJ0cyBDMSB0byAoMCwgMikuCisjCisjIFJldHVybnM6IHJvdywgY29sdW1uCisjCitzdWIgX2NlbGxfdG9fcm93Y29sIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJGNlbGwgPSBzaGlmdDsKKworICAgICRjZWxsID1+IC9cJD8oW0EtSV0/W0EtWl0pXCQ/KFxkKykvOworCisgICAgbXkgJGNvbCAgICAgPSAkMTsKKyAgICBteSAkcm93ICAgICA9ICQyOworCisgICAgIyBDb252ZXJ0IGJhc2UyNiBjb2x1bW4gc3RyaW5nIHRvIG51bWJlcgorICAgICMgQWxsIHlvdXIgQmFzZSBhcmUgYmVsb25nIHRvIHVzLgorICAgIG15IEBjaGFycyA9IHNwbGl0IC8vLCAkY29sOworICAgIG15ICRleHBuICA9IDA7CisgICAgJGNvbCAgICAgID0gMDsKKworICAgIHdoaWxlIChAY2hhcnMpIHsKKyAgICAgICAgbXkgJGNoYXIgPSBwb3AoQGNoYXJzKTsgIyBMUyBjaGFyIGZpcnN0CisgICAgICAgICRjb2wgKz0gKG9yZCgkY2hhcikgLW9yZCgnQScpICsxKSAqICgyNioqJGV4cG4pOworICAgICAgICAkZXhwbisrOworICAgIH0KKworICAgICMgQ29udmVydCAxLWluZGV4IHRvIHplcm8taW5kZXgKKyAgICAkcm93LS07CisgICAgJGNvbC0tOworCisgICAgcmV0dXJuICRyb3csICRjb2w7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc29ydF9wYWdlYnJlYWtzKCkKKyMKKyMKKyMgVGhpcyBpcyBhbiBpbnRlcm5hbCBtZXRob2QgdGhhdCBpcyB1c2VkIHRvIGZpbHRlciBlbGVtZW50cyBvZiB0aGUgYXJyYXkgb2YKKyMgcGFnZWJyZWFrcyB1c2VkIGluIHRoZSBfc3RvcmVfaGJyZWFrKCkgYW5kIF9zdG9yZV92YnJlYWsoKSBtZXRob2RzLiBJdDoKKyMgICAxLiBSZW1vdmVzIGR1cGxpY2F0ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QuCisjICAgMi4gU29ydHMgdGhlIGxpc3QuCisjICAgMy4gUmVtb3ZlcyAwIGZyb20gdGhlIGxpc3QgaWYgcHJlc2VudC4KKyMKK3N1YiBfc29ydF9wYWdlYnJlYWtzIHsKKworICAgIG15ICRzZWxmPSBzaGlmdDsKKworICAgIG15ICVoYXNoOworICAgIG15IEBhcnJheTsKKworICAgIEBoYXNoe0BffSA9IHVuZGVmOyAgICAgICAgICAgICAgICAgICAgICAgIyBIYXNoIHNsaWNlIHRvIHJlbW92ZSBkdXBsaWNhdGVzCisgICAgQGFycmF5ICAgID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICVoYXNoOyAjIE51bWVyaWNhbCBzb3J0CisgICAgc2hpZnQgQGFycmF5IGlmICRhcnJheVswXSA9PSAwOyAgICAgICAgICAjIFJlbW92ZSB6ZXJvCisKKyAgICAjIDEwMDAgdmVydGljYWwgcGFnZWJyZWFrcyBhcHBlYXJzIHRvIGJlIGFuIGludGVybmFsIEV4Y2VsIDUgbGltaXQuCisgICAgIyBJdCBpcyBzbGlnaHRseSBoaWdoZXIgaW4gRXhjZWwgOTcvMjAwLCBhcHByb3guIDEwMjYKKyAgICBzcGxpY2UoQGFycmF5LCAxMDAwKSBpZiAoQGFycmF5ID4gMTAwMCk7CisKKyAgICByZXR1cm4gQGFycmF5Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfZW5jb2RlX3Bhc3N3b3JkKCRwYXNzd29yZCkKKyMKKyMgQmFzZWQgb24gdGhlIGFsZ29yaXRobSBwcm92aWRlZCBieSBEYW5pZWwgUmVudHogb2YgT3Blbk9mZmljZS4KKyMKKyMKK3N1YiBfZW5jb2RlX3Bhc3N3b3JkIHsKKworICAgIHVzZSBpbnRlZ2VyOworCisgICAgbXkgJHNlbGYgICAgICA9IHNoaWZ0OworICAgIG15ICRwbGFpbnRleHQgPSAkX1swXTsKKyAgICBteSAkcGFzc3dvcmQ7CisgICAgbXkgJGNvdW50OworICAgIG15IEBjaGFyczsKKyAgICBteSAkaSA9IDA7CisKKyAgICAkY291bnQgPSBAY2hhcnMgPSBzcGxpdCAvLywgJHBsYWludGV4dDsKKworICAgIGZvcmVhY2ggbXkgJGNoYXIgKEBjaGFycykgeworICAgICAgICBteSAkbG93XzE1OworICAgICAgICBteSAkaGlnaF8xNTsKKyAgICAgICAgJGNoYXIgICAgID0gb3JkKCRjaGFyKSA8PCArKyRpOworICAgICAgICAkbG93XzE1ICAgPSAkY2hhciAmIDB4N2ZmZjsKKyAgICAgICAgJGhpZ2hfMTUgID0gJGNoYXIgJiAweDdmZmYgPDwgMTU7CisgICAgICAgICRoaWdoXzE1ICA9ICRoaWdoXzE1ID4+IDE1OworICAgICAgICAkY2hhciAgICAgPSAkbG93XzE1IHwgJGhpZ2hfMTU7CisgICAgfQorCisgICAgJHBhc3N3b3JkICA9IDB4MDAwMDsKKyAgICAkcGFzc3dvcmQgXj0gJF8gZm9yIEBjaGFyczsKKyAgICAkcGFzc3dvcmQgXj0gJGNvdW50OworICAgICRwYXNzd29yZCBePSAweENFNEI7CisKKyAgICByZXR1cm4gJHBhc3N3b3JkOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgb3V0bGluZV9zZXR0aW5ncygkdmlzaWJsZSwgJHN5bWJvbHNfYmVsb3csICRzeW1ib2xzX3JpZ2h0LCAkYXV0b19zdHlsZSkKKyMKKyMgVGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvcGVydGllcyBmb3Igb3V0bGluaW5nIGFuZCBncm91cGluZy4gVGhlIGRlZmF1bHRzCisjIGNvcnJlc3BvbmQgdG8gRXhjZWwncyBkZWZhdWx0cy4KKyMKK3N1YiBvdXRsaW5lX3NldHRpbmdzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICAkc2VsZi0+e19vdXRsaW5lX29ufSAgICA9IGRlZmluZWQgJF9bMF0gPyAkX1swXSA6IDE7CisgICAgJHNlbGYtPntfb3V0bGluZV9iZWxvd30gPSBkZWZpbmVkICRfWzFdID8gJF9bMV0gOiAxOworICAgICRzZWxmLT57X291dGxpbmVfcmlnaHR9ID0gZGVmaW5lZCAkX1syXSA/ICRfWzJdIDogMTsKKyAgICAkc2VsZi0+e19vdXRsaW5lX3N0eWxlfSA9ICAgICAgICAgJF9bM10gfHwgMDsKKworICAgICMgRW5zdXJlIHRoaXMgaXMgYSBib29sZWFuIHZhbGUgZm9yIFdpbmRvdzIKKyAgICAkc2VsZi0+e19vdXRsaW5lX29ufSAgICA9IDEgaWYgJHNlbGYtPntfb3V0bGluZV9vbn07Cit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQklGRiBSRUNPUkRTCisjCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9udW1iZXIoJHJvdywgJGNvbCwgJG51bSwgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBkb3VibGUgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgQW4gaW50ZWdlciBjYW4gYmUgd3JpdHRlbiBhcyBhIGRvdWJsZS4gRXhjZWwgd2lsbCBkaXNwbGF5IGFuCisjIGludGVnZXIuICRmb3JtYXQgaXMgb3B0aW9uYWwuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIworc3ViIHdyaXRlX251bWJlciB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgPSAweDAyMDM7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDBFOyAgICAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJG51bSAgICAgPSAkX1syXTsKKyAgICBteSAkeGYgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2IiwgJHJvdywgJGNvbCwgJHhmKTsKKyAgICBteSAkeGxfZG91YmxlID0gcGFjaygiZCIsICAgJG51bSk7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJHhsX2RvdWJsZSA9IHJldmVyc2UgJHhsX2RvdWJsZSB9CisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e190YWJsZX0tPlskcm93XS0+WyRjb2xdID0gJGhlYWRlciAuICRkYXRhIC4gJHhsX2RvdWJsZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhLCAkeGxfZG91YmxlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX3N0cmluZyAoJHJvdywgJGNvbCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgTk9URTogdGhlcmUgaXMgYW4gRXhjZWwgNSBkZWZpbmVkIGxpbWl0IG9mIDI1NSBjaGFyYWN0ZXJzLgorIyAkZm9ybWF0IGlzIG9wdGlvbmFsLgorIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGxvbmcgc3RyaW5nIHRydW5jYXRlZCB0byAyNTUgY2hhcnMKKyMKK3N1YiB3cml0ZV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkQ7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkc3RybGVuICAgICAgPSBsZW5ndGgoJF9bMl0pOworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzJdOworICAgIG15ICR4ZiAgICAgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAjIFRoZSBjZWxsIGZvcm1hdAorICAgIG15ICRlbmNvZGluZyAgICA9IDB4MDsKKyAgICBteSAkc3RyX2Vycm9yICAgPSAwOworCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cikpIHsKKyAgICAgICAgICAgIG15ICR0bXAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyKTsKKyAgICAgICAgICAgIHJldHVybiAkc2VsZi0+d3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbCwgJHRtcCwgJF9bM10pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAjIENoZWNrIHRoYXQgcm93IGFuZCBjb2wgYXJlIHZhbGlkIGFuZCBzdG9yZSBtYXggYW5kIG1pbiB2YWx1ZXMKKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wpOworCisgICAgIyBMaW1pdCB0aGUgc3RyaW5nIHRvIHRoZSBtYXggbnVtYmVyIG9mIGNoYXJzLgorICAgIGlmICgkc3RybGVuID4gMzI3NjcpIHsKKyAgICAgICAgJHN0ciAgICAgICA9IHN1YnN0cigkc3RyLCAwLCAzMjc2Nyk7CisgICAgICAgICRzdHJfZXJyb3IgPSAtMzsKKyAgICB9CisKKworICAgICMgUHJlcGVuZCB0aGUgc3RyaW5nIHdpdGggdGhlIHR5cGUuCisgICAgbXkgJHN0cl9oZWFkZXIgID0gcGFjaygidkMiLCBsZW5ndGgoJHN0ciksICRlbmNvZGluZyk7CisgICAgJHN0ciAgICAgICAgICAgID0gJHN0cl9oZWFkZXIgLiAkc3RyOworCisKKyAgICBpZiAobm90IGV4aXN0cyAkeyRzZWxmLT57X3N0cl90YWJsZX19LT57JHN0cn0pIHsKKyAgICAgICAgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9ID0gJHskc2VsZi0+e19zdHJfdW5pcXVlfX0rKzsKKyAgICB9CisKKworICAgICR7JHNlbGYtPntfc3RyX3RvdGFsfX0rKzsKKworCisgICAgbXkgJGhlYWRlciA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgID0gcGFjaygidnZ2ViIsICRyb3csICRjb2wsICR4ZiwgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9KTsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfdGFibGV9LT5bJHJvd10tPlskY29sXSA9ICRoZWFkZXIgLiAkZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gJHN0cl9lcnJvcjsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHdyaXRlX2JsYW5rKCRyb3csICRjb2wsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgYmxhbmsgY2VsbCB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBBIGJsYW5rIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IGZvcm1hdHRpbmcgd2l0aG91dCBhZGRpbmcgYSBzdHJpbmcKKyMgb3IgYSBudW1iZXIuCisjCisjIEEgYmxhbmsgY2VsbCB3aXRob3V0IGEgZm9ybWF0IHNlcnZlcyBubyBwdXJwb3NlLiBUaGVyZWZvcmUsIHdlIGRvbid0IHdyaXRlCisjIGEgQkxBTksgcmVjb3JkIHVubGVzcyBhIGZvcm1hdCBpcyBzcGVjaWZpZWQuIFRoaXMgaXMgbWFpbmx5IGFuIG9wdGltaXNhdGlvbgorIyBmb3IgdGhlIHdyaXRlX3JvdygpIGFuZCB3cml0ZV9jb2woKSBtZXRob2RzLgorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uIChpbmNsdWRpbmcgbm8gZm9ybWF0KQorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgd3JpdGVfYmxhbmsgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKyAgICByZXR1cm4gLTEgaWYgQF8gPCAyOworCisgICAgIyBEb24ndCB3cml0ZSBhIGJsYW5rIGNlbGwgdW5sZXNzIGl0IGhhcyBhIGZvcm1hdAorICAgIHJldHVybiAwIGlmIG5vdCBkZWZpbmVkICRfWzJdOworCisKKyAgICBteSAkcmVjb3JkICA9IDB4MDIwMTsgICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDY7ICAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkeGYgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bMl0pOyAjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidnZ2IiwgJHJvdywgJGNvbCwgJHhmKTsKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9mb3JtdWxhKCRyb3csICRjb2wsICRmb3JtdWxhLCAkZm9ybWF0LCAkdmFsdWUpCisjCisjIFdyaXRlIGEgZm9ybXVsYSB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpLgorIyBUaGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZm9ybXVsYSBpcyBwYXNzZWQgdG8gdGhlIHBhcnNlciBpbgorIyBGb3JtdWxhLnBtIHdoaWNoIHJldHVybnMgYSBwYWNrZWQgYmluYXJ5IHN0cmluZy4KKyMKKyMgJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgJHZhbHVlIGlzIGFuIG9wdGlvbmFsIHJlc3VsdCBvZiB0aGUgZm9ybXVsYSB0aGF0IGNhbiBiZSBzdXBwbGllZCBieSB0aGUgdXNlci4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjCitzdWIgd3JpdGVfZm9ybXVsYSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBpZiAoQF8gPCAzKSB7IHJldHVybiAtMSB9ICAgIyBDaGVjayB0aGUgbnVtYmVyIG9mIGFyZ3MKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAwMDY7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aDsgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgID0gJF9bMF07ICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOyAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRmb3JtdWxhICAgPSAkX1syXTsgICAgICAjIFRoZSBmb3JtdWxhIHRleHQgc3RyaW5nCisgICAgbXkgJHZhbHVlICAgICA9ICRfWzRdOyAgICAgICMgVGhlIGZvcm11bGEgdGV4dCBzdHJpbmcKKworCisgICAgbXkgJHhmICAgICAgICA9IF9YRigkc2VsZiwgJHJvdywgJGNvbCwgJF9bM10pOyAgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkY2huICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAjIE11c3QgYmUgemVybworICAgIG15ICRpc19zdHJpbmcgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRm9ybXVsYSBldmFsdWF0ZXMgdG8gc3RyCisgICAgbXkgJG51bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZhbHVlIG9mIGZvcm11bGEKKyAgICBteSAkZ3JiaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncworCisKKyAgICAjIEV4Y2VsIG5vcm1hbGx5IHN0b3JlcyB0aGUgbGFzdCBjYWxjdWxhdGVkIHZhbHVlIG9mIHRoZSBmb3JtdWxhIGluICRudW0uCisgICAgIyBDbGVhcmx5IHdlIGFyZSBub3QgaW4gYSBwb3NpdGlvbiB0byBjYWxjdWxhdGUgdGhpcyAiYSBwcmlvcmkiLiBJbnN0ZWFkCisgICAgIyB3ZSBzZXQgJG51bSB0byB6ZXJvIGFuZCBzZXQgdGhlIG9wdGlvbiBmbGFncyBpbiAkZ3JiaXQgdG8gZW5zdXJlCisgICAgIyBhdXRvbWF0aWMgY2FsY3VsYXRpb24gb2YgdGhlIGZvcm11bGEgd2hlbiB0aGUgZmlsZSBpcyBvcGVuZWQuCisgICAgIyBBcyBhIHdvcmthcm91bmQgZm9yIHNvbWUgbm9uLUV4Y2VsIGFwcHMgd2UgYWxzbyBhbGxvdyB0aGUgdXNlciB0bworICAgICMgc3BlY2lmeSB0aGUgcmVzdWx0IG9mIHRoZSBmb3JtdWxhLgorICAgICMKKyAgICAoJG51bSwgJGdyYml0LCAkaXNfc3RyaW5nKSA9ICRzZWxmLT5fZW5jb2RlX2Zvcm11bGFfcmVzdWx0KCR2YWx1ZSk7CisKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgbXkgJHRtcCAgICAgPSAkZm9ybXVsYTsKKworICAgICMgUGFyc2UgdGhlIGZvcm11bGEgdXNpbmcgdGhlIHBhcnNlciBpbiBGb3JtdWxhLnBtCisgICAgbXkgJHBhcnNlciAgPSAkc2VsZi0+e19wYXJzZXJ9OworCisgICAgIyBJbiBvcmRlciB0byByYWlzZSBmb3JtdWxhIGVycm9ycyBmcm9tIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBjYWxsaW5nCisgICAgIyBwcm9ncmFtIHdlIHVzZSBhbiBldmFsIGJsb2NrIGFuZCByZS1yYWlzZSB0aGUgZXJyb3IgZnJvbSBoZXJlLgorICAgICMKKyAgICBldmFsIHsgJGZvcm11bGEgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKworCisgICAgbXkgJGZvcm1sZW4gPSBsZW5ndGgoJGZvcm11bGEpOyAjIExlbmd0aCBvZiB0aGUgYmluYXJ5IHN0cmluZworICAgICAgICRsZW5ndGggID0gMHgxNiArICRmb3JtbGVuOyAgIyBMZW5ndGggb2YgdGhlIHJlY29yZCBkYXRhCisKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnYiLCAgICRyb3csICRjb2wsICR4Zik7CisgICAgICAgJGRhdGEgICAuPSAkbnVtOworICAgICAgICRkYXRhICAgLj0gcGFjaygidlZ2IiwgICAkZ3JiaXQsICRjaG4sICRmb3JtbGVuKTsKKworICAgICMgVGhlIFNUUklORyByZWNvcmQgaWYgdGhlIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLgorICAgIG15ICRzdHJpbmcgID0gJyc7CisgICAgICAgJHN0cmluZyAgPSAkc2VsZi0+X2dldF9mb3JtdWxhX3N0cmluZygkdmFsdWUpIGlmICRpc19zdHJpbmc7CisKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGEgLiAkZm9ybXVsYSAuICRzdHJpbmc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGZvcm11bGEsICRzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX2VuY29kZV9mb3JtdWxhX3Jlc3VsdCgpCisjCisjIEVuY29kZSB0aGUgdXNlciBzdXBwbGllZCByZXN1bHQgZm9yIGEgZm9ybXVsYS4KKyMKK3N1YiBfZW5jb2RlX2Zvcm11bGFfcmVzdWx0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkdmFsdWUgICAgID0gJF9bMF07ICAgICAgIyBSZXN1bHQgdG8gYmUgZW5jb2RlZC4KKyAgICBteSAkaXNfc3RyaW5nID0gMDsgICAgICAgICAgIyBGb3JtdWxhIGV2YWx1YXRlcyB0byBzdHIuCisgICAgbXkgJG51bTsgICAgICAgICAgICAgICAgICAgICMgQ3VycmVudCB2YWx1ZSBvZiBmb3JtdWxhLgorICAgIG15ICRncmJpdDsgICAgICAgICAgICAgICAgICAjIE9wdGlvbiBmbGFncy4KKworICAgIGlmIChub3QgZGVmaW5lZCAkdmFsdWUpIHsKKyAgICAgICAgJGdyYml0ICA9IDB4MDM7CisgICAgICAgICRudW0gICAgPSBwYWNrICJkIiwgMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgVGhlIHVzZXIgc3BlY2lmaWVkIHRoZSByZXN1bHQgb2YgdGhlIGZvcm11bGEuIFdlIHR1cm4gb2ZmIHRoZSByZWNhbGMKKyAgICAgICAgIyBmbGFnIGFuZCBjaGVjayB0aGUgcmVzdWx0IHR5cGUuCisgICAgICAgICRncmJpdCAgPSAweDAwOworCisgICAgICAgIGlmICgkdmFsdWUgPX4gL14oWystXT8pKD89XGR8XC5cZClcZCooXC5cZCopPyhbRWVdKFsrLV0/XGQrKSk/JC8pIHsKKyAgICAgICAgICAgICMgVmFsdWUgaXMgYSBudW1iZXIuCisgICAgICAgICAgICAkbnVtID0gcGFjayAiZCIsICR2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgbXkgJWJvb2xzID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUUlVFJyAgICA9PiBbMSwgIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdGQUxTRScgICA9PiBbMSwgIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTlVMTCEnICA9PiBbMiwgIDBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjRElWLzAhJyA9PiBbMiwgIDddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjVkFMVUUhJyA9PiBbMiwgMTVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjUkVGIScgICA9PiBbMiwgMjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTkFNRT8nICA9PiBbMiwgMjldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTlVNIScgICA9PiBbMiwgMzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcjTi9BJyAgICA9PiBbMiwgNDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgaWYgKGV4aXN0cyAkYm9vbHN7JHZhbHVlfSkgeworICAgICAgICAgICAgICAgICMgVmFsdWUgaXMgYSBib29sZWFuLgorICAgICAgICAgICAgICAgICRudW0gPSBwYWNrICJ2dnZ2IiwgJGJvb2xzeyR2YWx1ZX0tPlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRib29sc3skdmFsdWV9LT5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgIyBWYWx1ZSBpcyBhIHN0cmluZy4KKyAgICAgICAgICAgICAgICAkbnVtID0gcGFjayAidnZ2diIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjsKKyAgICAgICAgICAgICAgICAkaXNfc3RyaW5nID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoJG51bSwgJGdyYml0LCAkaXNfc3RyaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9nZXRfZm9ybXVsYV9zdHJpbmcoKQorIworIyBQYWNrIHRoZSBzdHJpbmcgdmFsdWUgd2hlbiBhIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLiBUaGUgdmFsdWUgY2Fubm90CisjIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIG1vZHVsZSBhbmQgdGh1cyBtdXN0IGJlIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLgorIworc3ViIF9nZXRfZm9ybXVsYV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgPSAweDAyMDc7ICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgPSAweDAwOyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKyAgICBteSAkc3RyaW5nICAgID0gJF9bMF07ICAgICAgICAgICMgRm9ybXVsYSBzdHJpbmcuCisgICAgbXkgJHN0cmxlbiAgICA9IGxlbmd0aCAkX1swXTsgICAjIExlbmd0aCBvZiB0aGUgZm9ybXVsYSBzdHJpbmcgKGNoYXJzKS4KKyAgICBteSAkZW5jb2RpbmcgID0gMDsgICAgICAgICAgICAgICMgU3RyaW5nIGVuY29kaW5nLgorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRlbmNvZGluZyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICRsZW5ndGggICAgICAgPSAweDAzICsgbGVuZ3RoICRzdHJpbmc7ICAjIExlbmd0aCBvZiB0aGUgcmVjb3JkIGRhdGEKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2QyIsICRzdHJsZW4sICRlbmNvZGluZyk7CisKKyAgICByZXR1cm4gJGhlYWRlciAuICRkYXRhIC4gJHN0cmluZzsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHN0b3JlX2Zvcm11bGEoJGZvcm11bGEpCisjCisjIFByZS1wYXJzZSBhIGZvcm11bGEuIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHJlcGVhdF9mb3JtdWxhKCkKKyMgdG8gcmVwZXRpdGl2ZWx5IHJld3JpdGUgYSBmb3JtdWxhIHdpdGhvdXQgcmUtcGFyc2luZyBpdC4KKyMKK3N1YiBzdG9yZV9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGZvcm11bGEgPSAkX1swXTsgICAgICAjIFRoZSBmb3JtdWxhIHRleHQgc3RyaW5nCisKKyAgICAjIFN0cmlwIHRoZSA9IHNpZ24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybXVsYSBzdHJpbmcKKyAgICAkZm9ybXVsYSAgICA9fiBzKF49KSgpOworCisgICAgIyBQYXJzZSB0aGUgZm9ybXVsYSB1c2luZyB0aGUgcGFyc2VyIGluIEZvcm11bGEucG0KKyAgICBteSAkcGFyc2VyICA9ICRzZWxmLT57X3BhcnNlcn07CisKKyAgICAjIEluIG9yZGVyIHRvIHJhaXNlIGZvcm11bGEgZXJyb3JzIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgdGhlIGNhbGxpbmcKKyAgICAjIHByb2dyYW0gd2UgdXNlIGFuIGV2YWwgYmxvY2sgYW5kIHJlLXJhaXNlIHRoZSBlcnJvciBmcm9tIGhlcmUuCisgICAgIworICAgIG15IEB0b2tlbnM7CisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKworCisgICAgIyBSZXR1cm4gdGhlIHBhcnNlZCB0b2tlbnMgaW4gYW4gYW5vbnltb3VzIGFycmF5CisgICAgcmV0dXJuIFtAdG9rZW5zXTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIHJlcGVhdF9mb3JtdWxhKCRyb3csICRjb2wsICRmb3JtdWxhLCAkZm9ybWF0LCAoJHBhdHRlcm4gPT4gJHJlcGxhY2VtZW50LC4uLikpCisjCisjIFdyaXRlIGEgZm9ybXVsYSB0byB0aGUgc3BlY2lmaWVkIHJvdyBhbmQgY29sdW1uICh6ZXJvIGluZGV4ZWQpIGJ5CisjIHN1YnN0aXR1dGluZyAkcGF0dGVybiAkcmVwbGFjZW1lbnQgcGFpcnMgaW4gdGhlICRmb3JtdWxhIGNyZWF0ZWQgdmlhCisjIHN0b3JlX2Zvcm11bGEoKS4gVGhpcyBhbGxvd3MgdGhlIHVzZXIgdG8gcmVwZXRpdGl2ZWx5IHJld3JpdGUgYSBmb3JtdWxhCisjIHdpdGhvdXQgdGhlIHNpZ25pZmljYW50IG92ZXJoZWFkIG9mIHBhcnNpbmcuCisjCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIworc3ViIHJlcGVhdF9mb3JtdWxhIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDIpIHsgcmV0dXJuIC0xIH0gICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDA2OyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9IHNoaWZ0OyAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgICAgPSBzaGlmdDsgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJGZvcm11bGFfcmVmID0gc2hpZnQ7ICAgICMgQXJyYXkgcmVmIHdpdGggZm9ybXVsYSB0b2tlbnMKKyAgICBteSAkZm9ybWF0ICAgICAgPSBzaGlmdDsgICAgIyBYRiBmb3JtYXQKKyAgICBteSBAcGFpcnMgICAgICAgPSBAXzsgICAgICAgIyBQYXR0ZXJuL3JlcGxhY2VtZW50IHBhaXJzCisKKworICAgICMgRW5mb3JjZSBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMgaW4gdGhlIHBhdHRlcm4vcmVwbGFjZW1lbnQgbGlzdAorICAgIGNyb2FrICJPZGQgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHBhdHRlcm4vcmVwbGFjZW1lbnQgbGlzdCIgaWYgQHBhaXJzICUyOworCisgICAgIyBDaGVjayB0aGF0ICRmb3JtdWxhIGlzIGFuIGFycmF5IHJlZgorICAgIGNyb2FrICJOb3QgYSB2YWxpZCBmb3JtdWxhIiBpZiByZWYgJGZvcm11bGFfcmVmIG5lICdBUlJBWSc7CisKKyAgICBteSBAdG9rZW5zICA9IEAkZm9ybXVsYV9yZWY7CisKKyAgICAjIEVuc3VyZSB0aGF0IHRoZXJlIGFyZSB0b2tlbnMgdG8gc3Vic3RpdHV0ZQorICAgIGNyb2FrICJObyB0b2tlbnMgaW4gZm9ybXVsYSIgdW5sZXNzIEB0b2tlbnM7CisKKworICAgICMgQXMgYSB0ZW1wb3JhcnkgYW5kIHVuZG9jdW1lbnRlZCBtZWFzdXJlIHdlIGFsbG93IHRoZSB1c2VyIHRvIHNwZWNpZnkgdGhlCisgICAgIyByZXN1bHQgb2YgdGhlIGZvcm11bGEgYnkgYXBwZW5kaW5nIGEgcmVzdWx0ID0+ICR2YWx1ZSBwYWlyIHRvIHRoZSBlbmQKKyAgICAjIG9mIHRoZSBhcmd1bWVudHMuCisgICAgbXkgJHZhbHVlID0gdW5kZWY7CisgICAgaWYgKCRwYWlyc1stMl0gZXEgJ3Jlc3VsdCcpIHsKKyAgICAgICAgJHZhbHVlID0gcG9wIEBwYWlyczsKKyAgICAgICAgICAgICAgICAgcG9wIEBwYWlyczsKKyAgICB9CisKKworICAgIHdoaWxlIChAcGFpcnMpIHsKKyAgICAgICAgbXkgJHBhdHRlcm4gPSBzaGlmdCBAcGFpcnM7CisgICAgICAgIG15ICRyZXBsYWNlID0gc2hpZnQgQHBhaXJzOworCisgICAgICAgIGZvcmVhY2ggbXkgJHRva2VuIChAdG9rZW5zKSB7CisgICAgICAgICAgICBsYXN0IGlmICR0b2tlbiA9fiBzLyRwYXR0ZXJuLyRyZXBsYWNlLzsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDaGFuZ2UgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm11bGEgY2FjaGVkIGJ5IHRoZSBGb3JtdWxhLnBtIG9iamVjdAorICAgIG15ICRwYXJzZXIgICAgPSAkc2VsZi0+e19wYXJzZXJ9OworICAgIG15ICRmb3JtdWxhICAgPSAkcGFyc2VyLT5wYXJzZV90b2tlbnMoQHRva2Vucyk7CisKKyAgICBjcm9hayAiVW5yZWNvZ25pc2VkIHRva2VuIGluIGZvcm11bGEiIHVubGVzcyBkZWZpbmVkICRmb3JtdWxhOworCisKKyAgICBteSAkeGYgICAgICAgID0gX1hGKCRzZWxmLCAkcm93LCAkY29sLCAkZm9ybWF0KTsgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkY2huICAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIHplcm8KKyAgICBteSAkaXNfc3RyaW5nID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3JtdWxhIGV2YWx1YXRlcyB0byBzdHIKKyAgICBteSAkbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDdXJyZW50IHZhbHVlIG9mIGZvcm11bGEKKyAgICBteSAkZ3JiaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKworICAgICMgRXhjZWwgbm9ybWFsbHkgc3RvcmVzIHRoZSBsYXN0IGNhbGN1bGF0ZWQgdmFsdWUgb2YgdGhlIGZvcm11bGEgaW4gJG51bS4KKyAgICAjIENsZWFybHkgd2UgYXJlIG5vdCBpbiBhIHBvc2l0aW9uIHRvIGNhbGN1bGF0ZSB0aGlzICJhIHByaW9yaSIuIEluc3RlYWQKKyAgICAjIHdlIHNldCAkbnVtIHRvIHplcm8gYW5kIHNldCB0aGUgb3B0aW9uIGZsYWdzIGluICRncmJpdCB0byBlbnN1cmUKKyAgICAjIGF1dG9tYXRpYyBjYWxjdWxhdGlvbiBvZiB0aGUgZm9ybXVsYSB3aGVuIHRoZSBmaWxlIGlzIG9wZW5lZC4KKyAgICAjIEFzIGEgd29ya2Fyb3VuZCBmb3Igc29tZSBub24tRXhjZWwgYXBwcyB3ZSBhbHNvIGFsbG93IHRoZSB1c2VyIHRvCisgICAgIyBzcGVjaWZ5IHRoZSByZXN1bHQgb2YgdGhlIGZvcm11bGEuCisgICAgIworICAgICgkbnVtLCAkZ3JiaXQsICRpc19zdHJpbmcpID0gJHNlbGYtPl9lbmNvZGVfZm9ybXVsYV9yZXN1bHQoJHZhbHVlKTsKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKworICAgIG15ICRmb3JtbGVuICAgPSBsZW5ndGgoJGZvcm11bGEpOyAjIExlbmd0aCBvZiB0aGUgYmluYXJ5IHN0cmluZworICAgICRsZW5ndGggICAgICAgPSAweDE2ICsgJGZvcm1sZW47ICAjIExlbmd0aCBvZiB0aGUgcmVjb3JkIGRhdGEKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2dnYiLCAgICRyb3csICRjb2wsICR4Zik7CisgICAgICAgJGRhdGEgICAgIC49ICRudW07CisgICAgICAgJGRhdGEgICAgIC49IHBhY2soInZWdiIsICAgJGdyYml0LCAkY2huLCAkZm9ybWxlbik7CisKKworICAgICMgVGhlIFNUUklORyByZWNvcmQgaWYgdGhlIGZvcm11bGEgZXZhbHVhdGVzIHRvIGEgc3RyaW5nLgorICAgIG15ICRzdHJpbmcgID0gJyc7CisgICAgICAgJHN0cmluZyAgPSAkc2VsZi0+X2dldF9mb3JtdWxhX3N0cmluZygkdmFsdWUpIGlmICRpc19zdHJpbmc7CisKKworICAgICMgU3RvcmUgdGhlIGRhdGEgb3Igd3JpdGUgaW1tZWRpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUuCisgICAgaWYgKCRzZWxmLT57X2NvbXBhdGliaWxpdHl9KSB7CisgICAgICAgICRzZWxmLT57X3RhYmxlfS0+WyRyb3ddLT5bJGNvbF0gPSAkaGVhZGVyIC4gJGRhdGEgLiAkZm9ybXVsYSAuICRzdHJpbmc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGZvcm11bGEsICRzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfdXJsKCRyb3csICRjb2wsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgaHlwZXJsaW5rLiBUaGlzIGlzIGNvbXByaXNlZCBvZiB0d28gZWxlbWVudHM6IHRoZSB2aXNpYmxlIGxhYmVsIGFuZAorIyB0aGUgaW52aXNpYmxlIGxpbmsuIFRoZSB2aXNpYmxlIGxhYmVsIGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5rIHVubGVzcyBhbgorIyBhbHRlcm5hdGl2ZSBzdHJpbmcgaXMgc3BlY2lmaWVkLgorIworIyBUaGUgcGFyYW1ldGVycyAkc3RyaW5nIGFuZCAkZm9ybWF0IGFyZSBvcHRpb25hbCBhbmQgdGhlaXIgb3JkZXIgaXMKKyMgaW50ZXJjaGFuZ2VhYmxlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHJlYXNvbnMuCisjCisjIFRoZSBoeXBlcmxpbmsgY2FuIGJlIHRvIGEgaHR0cCwgZnRwLCBtYWlsLCBpbnRlcm5hbCBzaGVldCwgb3IgZXh0ZXJuYWwKKyMgZGlyZWN0b3J5IHVybC4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCisjCitzdWIgd3JpdGVfdXJsIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisgICAgcmV0dXJuIC0xIGlmIEBfIDwgMzsKKworICAgICMgQWRkIHN0YXJ0IHJvdyBhbmQgY29sIHRvIGFyZyBsaXN0CisgICAgcmV0dXJuICRzZWxmLT53cml0ZV91cmxfcmFuZ2UoJF9bMF0sICRfWzFdLCBAXyk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91cmxfcmFuZ2UoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIsICR1cmwsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFRoaXMgaXMgdGhlIG1vcmUgZ2VuZXJhbCBmb3JtIG9mIHdyaXRlX3VybCgpLiBJdCBhbGxvd3MgYSBoeXBlcmxpbmsgdG8gYmUKKyMgd3JpdHRlbiB0byBhIHJhbmdlIG9mIGNlbGxzLiBUaGlzIGZ1bmN0aW9uIGFsc28gZGVjaWRlcyB0aGUgdHlwZSBvZiBoeXBlcmxpbmsKKyMgdG8gYmUgd3JpdHRlbi4gVGhlc2UgYXJlIGVpdGhlciwgV2ViIChodHRwLCBmdHAsIG1haWx0byksIEludGVybmFsCisjIChTaGVldDEhQTEpIG9yIGV4dGVybmFsICgnYzpcdGVtcFxmb28ueGxzI1NoZWV0MSFBMScpLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIHdyaXRlX3VybF9yYW5nZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworICAgIHJldHVybiAtMSBpZiBAXyA8IDU7CisKKworICAgICMgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgJHN0cmluZyBhbmQgJGZvcm1hdCBpZiBuZWNlc3NhcnkuIFdlIHdvcmsgb24gYSBjb3B5CisgICAgIyBpbiBvcmRlciB0byBwcm90ZWN0IHRoZSBjYWxsZXJzIGFyZ3MuIFdlIGRvbid0IHVzZSAibG9jYWwgQF8iIGluIGNhc2Ugb2YKKyAgICAjIHBlcmw1MDAwNSB0aHJlYWRzLgorICAgICMKKyAgICBteSBAYXJncyA9IEBfOworCisgICAgKCRhcmdzWzVdLCAkYXJnc1s2XSkgPSAoJGFyZ3NbNl0sICRhcmdzWzVdKSBpZiByZWYgJGFyZ3NbNV07CisKKyAgICBteSAkdXJsID0gJGFyZ3NbNF07CisKKworICAgICMgQ2hlY2sgZm9yIGludGVybmFsL2V4dGVybmFsIHNoZWV0IGxpbmtzIG9yIGRlZmF1bHQgdG8gd2ViIGxpbmsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfaW50ZXJuYWwoQGFyZ3MpIGlmICR1cmwgPX4gbVteaW50ZXJuYWw6XTsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfZXh0ZXJuYWwoQGFyZ3MpIGlmICR1cmwgPX4gbVteZXh0ZXJuYWw6XTsKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfd2ViKEBhcmdzKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV91cmxfd2ViKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBVc2VkIHRvIHdyaXRlIGh0dHAsIGZ0cCBhbmQgbWFpbHRvIGh5cGVybGlua3MuCisjIFRoZSBsaW5rIHR5cGUgKCRvcHRpb25zKSBpcyAweDAzIGlzIHRoZSBzYW1lIGFzIGFic29sdXRlIGRpciByZWYgd2l0aG91dAorIyBzaGVldC4gSG93ZXZlciBpdCBpcyBkaWZmZXJlbnRpYXRlZCBieSB0aGUgJHVua25vd24yIGRhdGEgc3RyZWFtLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfd2ViIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjg7ICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cxICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJGNvbDEgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkcm93MiAgICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sMiAgICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBjb2x1bW4KKyAgICBteSAkdXJsICAgICAgICAgPSAkX1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAjIFVSTCBzdHJpbmcKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1s1XTsgICAgICAgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGxhYmVsCisgICAgbXkgJHhmICAgICAgICAgID0gJF9bNl0gfHwgJHNlbGYtPntfdXJsX2Zvcm1hdH07IyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBXcml0ZSB0aGUgdmlzaWJsZSBsYWJlbCBidXQgcHJvdGVjdCBhZ2FpbnN0IHVybCByZWN1cnNpb24gaW4gd3JpdGUoKS4KKyAgICAkc3RyICAgICAgICAgICAgICAgICAgPSAkdXJsIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBQYWNrIHRoZSB1bmRvY3VtZW50ZWQgcGFydHMgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgICAgPSBwYWNrKCJIKiIsICJEMEM5RUE3OUY5QkFDRTExOEM4MjAwQUEwMDRCQTkwQjAyMDAwMDAwIik7CisgICAgbXkgJHVua25vd24yICAgID0gcGFjaygiSCoiLCAiRTBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIiKTsKKworCisgICAgIyBQYWNrIHRoZSBvcHRpb24gZmxhZ3MKKyAgICBteSAkb3B0aW9ucyAgICAgPSBwYWNrKCJWIiwgMHgwMyk7CisKKworICAgICMgVVJMIGVuY29kaW5nLgorICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisKKyAgICAjIENvbnZlcnQgYW4gVXRmOCBVUkwgdHlwZSBhbmQgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nLgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCR1cmwpKSB7CisgICAgICAgICAgICAkdXJsICAgICAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkdXJsKTsKKyAgICAgICAgICAgICR1cmwgICAgIC49ICJcMFwwIjsgIyBVUkwgaXMgbnVsbCB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgQ29udmVydCBhbiBBc2NpaSBVUkwgdHlwZSBhbmQgdG8gYSBudWxsIHRlcm1pbmF0ZWQgd2NoYXIgc3RyaW5nLgorICAgIGlmICgkZW5jb2RpbmcgPT0gMCkgeworICAgICAgICAkdXJsICAgICAgIC49ICJcMCI7CisgICAgICAgICR1cmwgICAgICAgID0gcGFjayAndionLCB1bnBhY2sgJ2MqJywgJHVybDsKKyAgICB9CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RoIG9mIHRoZSBVUkwKKyAgICBteSAkdXJsX2xlbiAgICAgPSBwYWNrKCJWIiwgbGVuZ3RoKCR1cmwpKTsKKworCisgICAgIyBDYWxjdWxhdGUgdGhlIGRhdGEgbGVuZ3RoCisgICAgJGxlbmd0aCAgICAgICAgID0gMHgzNCArIGxlbmd0aCgkdXJsKTsKKworCisgICAgIyBQYWNrIHRoZSBoZWFkZXIgZGF0YQorICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJHJvdzEsICRyb3cyLCAkY29sMSwgJGNvbDIpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCAkaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAkZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJHVua25vd24xLAorICAgICAgICAgICAgICAgICAgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgJHVua25vd24yLAorICAgICAgICAgICAgICAgICAgICAkdXJsX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgJHVybCk7CisKKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3dyaXRlX3VybF9pbnRlcm5hbCgkcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMiwgJHVybCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgVXNlZCB0byB3cml0ZSBpbnRlcm5hbCByZWZlcmVuY2UgaHlwZXJsaW5rcyBzdWNoIGFzICJTaGVldDEhQTEiLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfaW50ZXJuYWwgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDFCODsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDAwOyAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdzEgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCByb3cKKyAgICBteSAkY29sMSAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IGNvbHVtbgorICAgIG15ICRyb3cyICAgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIHJvdworICAgIG15ICRjb2wyICAgICAgICA9ICRfWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIGNvbHVtbgorICAgIG15ICR1cmwgICAgICAgICA9ICRfWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICMgVVJMIHN0cmluZworICAgIG15ICRzdHIgICAgICAgICA9ICRfWzVdOyAgICAgICAgICAgICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgbGFiZWwKKyAgICBteSAkeGYgICAgICAgICAgPSAkX1s2XSB8fCAkc2VsZi0+e191cmxfZm9ybWF0fTsjIFRoZSBjZWxsIGZvcm1hdAorCisgICAgIyBTdHJpcCBVUkwgdHlwZQorICAgICR1cmwgICAgICAgICAgICA9fiBzW15pbnRlcm5hbDpdW107CisKKworICAgICMgV3JpdGUgdGhlIHZpc2libGUgbGFiZWwgYnV0IHByb3RlY3QgYWdhaW5zdCB1cmwgcmVjdXJzaW9uIGluIHdyaXRlKCkuCisgICAgJHN0ciAgICAgICAgICAgICAgICAgID0gJHVybCB1bmxlc3MgZGVmaW5lZCAkc3RyOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDE7CisgICAgbXkgJGVycm9yICAgICAgICAgICAgID0gJHNlbGYtPndyaXRlKCRyb3cxLCAkY29sMSwgJHN0ciwgJHhmKTsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAwOworICAgIHJldHVybiAkZXJyb3IgICAgICAgICBpZiAkZXJyb3IgPT0gLTI7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnRzIG9mIHRoZSBoeXBlcmxpbmsgc3RyZWFtCisgICAgbXkgJHVua25vd24xICAgID0gcGFjaygiSCoiLCAiRDBDOUVBNzlGOUJBQ0UxMThDODIwMEFBMDA0QkE5MEIwMjAwMDAwMCIpOworCisKKyAgICAjIFBhY2sgdGhlIG9wdGlvbiBmbGFncworICAgIG15ICRvcHRpb25zICAgICA9IHBhY2soIlYiLCAweDA4KTsKKworCisgICAgIyBVUkwgZW5jb2RpbmcuCisgICAgbXkgJGVuY29kaW5nICAgID0gMDsKKworCisgICAgIyBDb252ZXJ0IGFuIFV0ZjggVVJMIHR5cGUgYW5kIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHdjaGFyIHN0cmluZy4KKyAgICBpZiAoJF0gPj0gNS4wMDgpIHsKKyAgICAgICAgcmVxdWlyZSBFbmNvZGU7CisKKyAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkdXJsKSkgeworICAgICAgICAgICAgIyBRdW90ZSBzaGVldCBuYW1lIGlmIG5vdCBhbHJlYWR5LCBpLmUuLCBTaGVldCFBMSB0byAnU2hlZXQhQTEnLgorICAgICAgICAgICAgJHVybCAgICAgID1+IHMvXiguKykhLyckMSchLyBpZiBub3QgJHVybCA9fiAvXicvOworCisgICAgICAgICAgICAkdXJsICAgICAgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkdXJsKTsKKyAgICAgICAgICAgICR1cmwgICAgIC49ICJcMFwwIjsgIyBVUkwgaXMgbnVsbCB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgJGVuY29kaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBDb252ZXJ0IGFuIEFzY2lpIFVSTCB0eXBlIGFuZCB0byBhIG51bGwgdGVybWluYXRlZCB3Y2hhciBzdHJpbmcuCisgICAgaWYgKCRlbmNvZGluZyA9PSAwKSB7CisgICAgICAgICR1cmwgICAgICAgLj0gIlwwIjsKKyAgICAgICAgJHVybCAgICAgICAgPSBwYWNrICd2KicsIHVucGFjayAnYyonLCAkdXJsOworICAgIH0KKworCisgICAgIyBQYWNrIHRoZSBsZW5ndGggb2YgdGhlIFVSTCBhcyBjaGFycyAobm90IHdjaGFycykKKyAgICBteSAkdXJsX2xlbiAgICAgPSBwYWNrKCJWIiwgaW50KGxlbmd0aCgkdXJsKS8yKSk7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBkYXRhIGxlbmd0aAorICAgICRsZW5ndGggICAgICAgICA9IDB4MjQgKyBsZW5ndGgoJHVybCk7CisKKworICAgICMgUGFjayB0aGUgaGVhZGVyIGRhdGEKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKTsKKworCisgICAgIyBXcml0ZSB0aGUgcGFja2VkIGRhdGEKKyAgICAkc2VsZi0+X2FwcGVuZCggJGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgJGRhdGEsCisgICAgICAgICAgICAgICAgICAgICR1bmtub3duMSwKKyAgICAgICAgICAgICAgICAgICAgJG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICR1cmxfbGVuLAorICAgICAgICAgICAgICAgICAgICAkdXJsKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfd3JpdGVfdXJsX2V4dGVybmFsKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBsaW5rcyB0byBleHRlcm5hbCBkaXJlY3RvcnkgbmFtZXMgc3VjaCBhcyAnYzpcZm9vLnhscycsCisjIGM6XGZvby54bHMjU2hlZXQxIUExJywgJy4uLy4uL2Zvby54bHMnLiBhbmQgJy4uLy4uL2Zvby54bHMjU2hlZXQxIUExJy4KKyMKKyMgTm90ZTogRXhjZWwgd3JpdGVzIHNvbWUgcmVsYXRpdmUgbGlua3Mgd2l0aCB0aGUgJGRpcl9sb25nIHN0cmluZy4gV2UgaWdub3JlCisjIHRoZXNlIGNhc2VzIGZvciB0aGUgc2FrZSBvZiBzaW1wbGVyIGNvZGUuCisjCisjIFNlZSBhbHNvIHdyaXRlX3VybCgpIGFib3ZlIGZvciBhIGdlbmVyYWwgZGVzY3JpcHRpb24gYW5kIHJldHVybiB2YWx1ZXMuCisjCitzdWIgX3dyaXRlX3VybF9leHRlcm5hbCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgIyBOZXR3b3JrIGRyaXZlcyBhcmUgZGlmZmVyZW50LiBXZSB3aWxsIGhhbmRsZSB0aGVtIHNlcGFyYXRlbHkKKyAgICAjIE1TL05vdmVsbCBuZXR3b3JrIGRyaXZlcyBhbmQgc2hhcmVzIHN0YXJ0IHdpdGggXFwKKyAgICByZXR1cm4gJHNlbGYtPl93cml0ZV91cmxfZXh0ZXJuYWxfbmV0KEBfKSBpZiAkX1s0XSA9fiBtW15leHRlcm5hbDpcXFxcXTsKKworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUI4OyAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMDA7ICAgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93MSAgICAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgICAgICAgICAjIFN0YXJ0IHJvdworICAgIG15ICRjb2wxICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgY29sdW1uCisgICAgbXkgJHJvdzIgICAgICAgID0gJF9bMl07ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgcm93CisgICAgbXkgJGNvbDIgICAgICAgID0gJF9bM107ICAgICAgICAgICAgICAgICAgICAgICAgIyBFbmQgY29sdW1uCisgICAgbXkgJHVybCAgICAgICAgID0gJF9bNF07ICAgICAgICAgICAgICAgICAgICAgICAgIyBVUkwgc3RyaW5nCisgICAgbXkgJHN0ciAgICAgICAgID0gJF9bNV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBsYWJlbAorICAgIG15ICR4ZiAgICAgICAgICA9ICRfWzZdIHx8ICRzZWxmLT57X3VybF9mb3JtYXR9OyMgVGhlIGNlbGwgZm9ybWF0CisKKworICAgICMgU3RyaXAgVVJMIHR5cGUgYW5kIGNoYW5nZSBVbml4IGRpciBzZXBhcmF0b3IgdG8gRG9zIHN0eWxlIChpZiBuZWVkZWQpCisgICAgIworICAgICR1cmwgICAgICAgICAgICA9fiBzW15leHRlcm5hbDpdW107CisgICAgJHVybCAgICAgICAgICAgID1+IHNbL11bXFxdZzsKKworCisgICAgIyBXcml0ZSB0aGUgdmlzaWJsZSBsYWJlbCBidXQgcHJvdGVjdCBhZ2FpbnN0IHVybCByZWN1cnNpb24gaW4gd3JpdGUoKS4KKyAgICAoJHN0ciA9ICR1cmwpICAgICAgICAgPX4gc1tcI11bIC0gXSB1bmxlc3MgZGVmaW5lZCAkc3RyOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDE7CisgICAgbXkgJGVycm9yICAgICAgICAgICAgID0gJHNlbGYtPndyaXRlKCRyb3cxLCAkY29sMSwgJHN0ciwgJHhmKTsKKyAgICAkc2VsZi0+e193cml0aW5nX3VybH0gPSAwOworICAgIHJldHVybiAkZXJyb3IgICAgICAgICBpZiAkZXJyb3IgPT0gLTI7CisKKworICAgICMgRGV0ZXJtaW5lIGlmIHRoZSBsaW5rIGlzIHJlbGF0aXZlIG9yIGFic29sdXRlOgorICAgICMgQWJzb2x1dGUgaWYgbGluayBzdGFydHMgd2l0aCBET1MgZHJpdmUgc3BlY2lmaWVyIGxpa2UgQzoKKyAgICAjIE90aGVyd2lzZSBkZWZhdWx0IHRvIDB4MDAgZm9yIHJlbGF0aXZlIGxpbmsuCisgICAgIworICAgIG15ICRhYnNvbHV0ZSAgICA9IDB4MDA7CisgICAgICAgJGFic29sdXRlICAgID0gMHgwMiAgaWYgJHVybCA9fiBtL15bQS1aYS16XTovOworCisKKyAgICAjIERldGVybWluZSBpZiB0aGUgbGluayBjb250YWlucyBhIHNoZWV0IHJlZmVyZW5jZSBhbmQgY2hhbmdlIHNvbWUgb2YgdGhlCisgICAgIyBwYXJhbWV0ZXJzIGFjY29yZGluZ2x5LgorICAgICMgU3BsaXQgdGhlIGRpciBuYW1lIGFuZCBzaGVldCBuYW1lIChpZiBpdCBleGlzdHMpCisgICAgIworICAgIG15ICgkZGlyX2xvbmcgLCAkc2hlZXQpID0gc3BsaXQgL1wjLywgJHVybDsKKyAgICBteSAkbGlua190eXBlICAgICAgICAgICA9IDB4MDEgfCAkYWJzb2x1dGU7CisgICAgbXkgJHNoZWV0X2xlbjsKKworICAgIGlmIChkZWZpbmVkICRzaGVldCkgeworICAgICAgICAkbGlua190eXBlIHw9IDB4MDg7CisgICAgICAgICRzaGVldF9sZW4gID0gcGFjaygiViIsIGxlbmd0aCgkc2hlZXQpICsgMHgwMSk7CisgICAgICAgICRzaGVldCAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJHNoZWV0KSk7CisgICAgICAgICRzaGVldCAgICAgLj0gIlwwXDBcMCI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2hlZXRfbGVuICA9ICcnOworICAgICAgICAkc2hlZXQgICAgICA9ICcnOworICAgIH0KKworCisgICAgIyBQYWNrIHRoZSBsaW5rIHR5cGUKKyAgICAkbGlua190eXBlICAgICAgPSBwYWNrKCJWIiwgJGxpbmtfdHlwZSk7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSB1cC1sZXZlbCBkaXIgY291bnQgZS5nLiAoLi5cLi5cLi5cID09IDMpCisgICAgbXkgJHVwX2NvdW50ICAgID0gMDsKKyAgICAkdXBfY291bnQrKyAgICAgICB3aGlsZSAkZGlyX2xvbmcgPX4gc1teXC5cLlxcXVtdOworICAgICR1cF9jb3VudCAgICAgICA9IHBhY2soInYiLCAkdXBfY291bnQpOworCisKKyAgICAjIFN0b3JlIHRoZSBzaG9ydCBkb3MgZGlyIG5hbWUgKG51bGwgdGVybWluYXRlZCkKKyAgICBteSAkZGlyX3Nob3J0ICAgPSAkZGlyX2xvbmcgLiAiXDAiOworCisKKyAgICAjIFN0b3JlIHRoZSBsb25nIGRpciBuYW1lIGFzIGEgd2NoYXIgc3RyaW5nIChub24tbnVsbCB0ZXJtaW5hdGVkKQorICAgICRkaXJfbG9uZyAgICAgICA9IGpvaW4oIlwwIiwgc3BsaXQoJycsICRkaXJfbG9uZykpOworICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RocyBvZiB0aGUgZGlyIHN0cmluZ3MKKyAgICBteSAkZGlyX3Nob3J0X2xlbiA9IHBhY2soIlYiLCBsZW5ndGggJGRpcl9zaG9ydCAgICAgICk7CisgICAgbXkgJGRpcl9sb25nX2xlbiAgPSBwYWNrKCJWIiwgbGVuZ3RoICRkaXJfbG9uZyAgICAgICApOworICAgIG15ICRzdHJlYW1fbGVuICAgID0gcGFjaygiViIsIGxlbmd0aCgkZGlyX2xvbmcpICsgMHgwNik7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnRzIG9mIHRoZSBoeXBlcmxpbmsgc3RyZWFtCisgICAgbXkgJHVua25vd24xID1wYWNrKCJIKiIsJ0QwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCMDIwMDAwMDAnICAgICAgICk7CisgICAgbXkgJHVua25vd24yID1wYWNrKCJIKiIsJzAzMDMwMDAwMDAwMDAwMDBDMDAwMDAwMDAwMDAwMDQ2JyAgICAgICAgICAgICAgICk7CisgICAgbXkgJHVua25vd24zID1wYWNrKCJIKiIsJ0ZGRkZBRERFMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk7CisgICAgbXkgJHVua25vd240ID1wYWNrKCJ2IiwgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworICAgICMgUGFjayB0aGUgbWFpbiBkYXRhIHN0cmVhbQorICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2dnYiLCAkcm93MSwgJHJvdzIsICRjb2wxLCAkY29sMikgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMSAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRsaW5rX3R5cGUgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMiAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1cF9jb3VudCAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfc2hvcnRfbGVuLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfc2hvcnQgICAgLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duMyAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzdHJlYW1fbGVuICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfbG9uZ19sZW4gLgorICAgICAgICAgICAgICAgICAgICAgICR1bmtub3duNCAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRkaXJfbG9uZyAgICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzaGVldF9sZW4gICAgLgorICAgICAgICAgICAgICAgICAgICAgICRzaGVldCAgICAgICAgOworCisKKyAgICAjIFBhY2sgdGhlIGhlYWRlciBkYXRhCisgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworCisgICAgIyBXcml0ZSB0aGUgcGFja2VkIGRhdGEKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV91cmxfZXh0ZXJuYWxfbmV0KCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkdXJsLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBsaW5rcyB0byBleHRlcm5hbCBNUy9Ob3ZlbGwgbmV0d29yayBkcml2ZXMgYW5kIHNoYXJlcyBzdWNoIGFzCisjICcvL05FVFdPUksvc2hhcmUvZm9vLnhscycgYW5kICcvL05FVFdPUksvc2hhcmUvZm9vLnhscyNTaGVldDEhQTEnLgorIworIyBTZWUgYWxzbyB3cml0ZV91cmwoKSBhYm92ZSBmb3IgYSBnZW5lcmFsIGRlc2NyaXB0aW9uIGFuZCByZXR1cm4gdmFsdWVzLgorIworc3ViIF93cml0ZV91cmxfZXh0ZXJuYWxfbmV0IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjg7ICAgICAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cxICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RhcnQgcm93CisgICAgbXkgJGNvbDEgICAgICAgID0gJF9bMV07ICAgICAgICAgICAgICAgICAgICAgICAgIyBTdGFydCBjb2x1bW4KKyAgICBteSAkcm93MiAgICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCByb3cKKyAgICBteSAkY29sMiAgICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBjb2x1bW4KKyAgICBteSAkdXJsICAgICAgICAgPSAkX1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAjIFVSTCBzdHJpbmcKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1s1XTsgICAgICAgICAgICAgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGxhYmVsCisgICAgbXkgJHhmICAgICAgICAgID0gJF9bNl0gfHwgJHNlbGYtPntfdXJsX2Zvcm1hdH07IyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBTdHJpcCBVUkwgdHlwZSBhbmQgY2hhbmdlIFVuaXggZGlyIHNlcGFyYXRvciB0byBEb3Mgc3R5bGUgKGlmIG5lZWRlZCkKKyAgICAjCisgICAgJHVybCAgICAgICAgICAgID1+IHNbXmV4dGVybmFsOl1bXTsKKyAgICAkdXJsICAgICAgICAgICAgPX4gc1svXVtcXF1nOworCisKKyAgICAjIFdyaXRlIHRoZSB2aXNpYmxlIGxhYmVsIGJ1dCBwcm90ZWN0IGFnYWluc3QgdXJsIHJlY3Vyc2lvbiBpbiB3cml0ZSgpLgorICAgICgkc3RyID0gJHVybCkgICAgICAgICA9fiBzW1wjXVsgLSBdIHVubGVzcyBkZWZpbmVkICRzdHI7CisgICAgJHNlbGYtPntfd3JpdGluZ191cmx9ID0gMTsKKyAgICBteSAkZXJyb3IgICAgICAgICAgICAgPSAkc2VsZi0+d3JpdGUoJHJvdzEsICRjb2wxLCAkc3RyLCAkeGYpOworICAgICRzZWxmLT57X3dyaXRpbmdfdXJsfSA9IDA7CisgICAgcmV0dXJuICRlcnJvciAgICAgICAgIGlmICRlcnJvciA9PSAtMjsKKworCisgICAgIyBEZXRlcm1pbmUgaWYgdGhlIGxpbmsgY29udGFpbnMgYSBzaGVldCByZWZlcmVuY2UgYW5kIGNoYW5nZSBzb21lIG9mIHRoZQorICAgICMgcGFyYW1ldGVycyBhY2NvcmRpbmdseS4KKyAgICAjIFNwbGl0IHRoZSBkaXIgbmFtZSBhbmQgc2hlZXQgbmFtZSAoaWYgaXQgZXhpc3RzKQorICAgICMKKyAgICBteSAoJGRpcl9sb25nICwgJHNoZWV0KSA9IHNwbGl0IC9cIy8sICR1cmw7CisgICAgbXkgJGxpbmtfdHlwZSAgICAgICAgICAgPSAweDAxMDM7ICMgQWx3YXlzIGFic29sdXRlCisgICAgbXkgJHNoZWV0X2xlbjsKKworICAgIGlmIChkZWZpbmVkICRzaGVldCkgeworICAgICAgICAkbGlua190eXBlIHw9IDB4MDg7CisgICAgICAgICRzaGVldF9sZW4gID0gcGFjaygiViIsIGxlbmd0aCgkc2hlZXQpICsgMHgwMSk7CisgICAgICAgICRzaGVldCAgICAgID0gam9pbigiXDAiLCBzcGxpdCgnJywgJHNoZWV0KSk7CisgICAgICAgICRzaGVldCAgICAgLj0gIlwwXDBcMCI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2hlZXRfbGVuICAgPSAnJzsKKyAgICAgICAgJHNoZWV0ICAgICAgID0gJyc7CisgICAgfQorCisgICAgIyBQYWNrIHRoZSBsaW5rIHR5cGUKKyAgICAkbGlua190eXBlICAgICAgPSBwYWNrKCJWIiwgJGxpbmtfdHlwZSk7CisKKworICAgICMgTWFrZSB0aGUgc3RyaW5nIG51bGwgdGVybWluYXRlZAorICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgbGVuZ3RocyBvZiB0aGUgZGlyIHN0cmluZworICAgIG15ICRkaXJfbG9uZ19sZW4gID0gcGFjaygiViIsIGxlbmd0aCAkZGlyX2xvbmcpOworCisKKyAgICAjIFN0b3JlIHRoZSBsb25nIGRpciBuYW1lIGFzIGEgd2NoYXIgc3RyaW5nIChub24tbnVsbCB0ZXJtaW5hdGVkKQorICAgICRkaXJfbG9uZyAgICAgICA9IGpvaW4oIlwwIiwgc3BsaXQoJycsICRkaXJfbG9uZykpOworICAgICRkaXJfbG9uZyAgICAgICA9ICRkaXJfbG9uZyAuICJcMCI7CisKKworICAgICMgUGFjayB0aGUgdW5kb2N1bWVudGVkIHBhcnQgb2YgdGhlIGh5cGVybGluayBzdHJlYW0KKyAgICBteSAkdW5rbm93bjEgICAgPSBwYWNrKCJIKiIsJ0QwQzlFQTc5RjlCQUNFMTE4QzgyMDBBQTAwNEJBOTBCMDIwMDAwMDAnKTsKKworCisgICAgIyBQYWNrIHRoZSBtYWluIGRhdGEgc3RyZWFtCisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidnZ2diIsICRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKSAuCisgICAgICAgICAgICAgICAgICAgICAgJHVua25vd24xICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGxpbmtfdHlwZSAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nX2xlbiAuCisgICAgICAgICAgICAgICAgICAgICAgJGRpcl9sb25nICAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0X2xlbiAgICAuCisgICAgICAgICAgICAgICAgICAgICAgJHNoZWV0ICAgICAgICA7CisKKworICAgICMgUGFjayB0aGUgaGVhZGVyIGRhdGEKKyAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgICRyZWNvcmQsICRsZW5ndGgpOworCisKKyAgICAjIFdyaXRlIHRoZSBwYWNrZWQgZGF0YQorICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgIHJldHVybiAkZXJyb3I7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV9kYXRlX3RpbWUgKCRyb3csICRjb2wsICRzdHJpbmcsICRmb3JtYXQpCisjCisjIFdyaXRlIGEgZGF0ZXRpbWUgc3RyaW5nIGluIElTTzg2MDEgInl5eXktbW0tZGRUaGg6bW06c3Muc3MiIGZvcm1hdCBhcyBhCisjIG51bWJlciByZXByZXNlbnRpbmcgYW4gRXhjZWwgZGF0ZS4gJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMKKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBJbnZhbGlkIGRhdGVfdGltZSwgd3JpdHRlbiBhcyBzdHJpbmcKKyMKK3N1YiB3cml0ZV9kYXRlX3RpbWUgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcm93ICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgcm93CisgICAgbXkgJGNvbCAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIGNvbHVtbgorICAgIG15ICRzdHIgICAgICAgPSAkX1syXTsKKworCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAkY29sKTsKKworICAgIG15ICRlcnJvciAgICAgPSAwOworICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHN0cik7CisKKyAgICBpZiAoZGVmaW5lZCAkZGF0ZV90aW1lKSB7CisgICAgICAgICRlcnJvciA9ICRzZWxmLT53cml0ZV9udW1iZXIoJHJvdywgJGNvbCwgJGRhdGVfdGltZSwgJF9bM10pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBUaGUgZGF0ZSBpc24ndCB2YWxpZCBzbyB3cml0ZSBpdCBhcyBhIHN0cmluZy4KKyAgICAgICAgJHNlbGYtPndyaXRlX3N0cmluZygkcm93LCAkY29sLCAkc3RyLCAkX1szXSk7CisgICAgICAgICRlcnJvciA9IC0zOworICAgIH0KKyAgICByZXR1cm4gJGVycm9yOworfQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBjb252ZXJ0X2RhdGVfdGltZSgkZGF0ZV90aW1lX3N0cmluZykKKyMKKyMgVGhlIGZ1bmN0aW9uIHRha2VzIGEgZGF0ZSBhbmQgdGltZSBpbiBJU084NjAxICJ5eXl5LW1tLWRkVGhoOm1tOnNzLnNzIiBmb3JtYXQKKyMgYW5kIGNvbnZlcnRzIGl0IHRvIGEgZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nIGEgdmFsaWQgRXhjZWwgZGF0ZS4KKyMKKyMgRGF0ZXMgYW5kIHRpbWVzIGluIEV4Y2VsIGFyZSByZXByZXNlbnRlZCBieSByZWFsIG51bWJlcnMuIFRoZSBpbnRlZ2VyIHBhcnQgb2YKKyMgdGhlIG51bWJlciBzdG9yZXMgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaCBhbmQgdGhlIGZyYWN0aW9uYWwgcGFydAorIyBzdG9yZXMgdGhlIHBlcmNlbnRhZ2Ugb2YgdGhlIGRheSBpbiBzZWNvbmRzLiBUaGUgZXBvY2ggY2FuIGJlIGVpdGhlciAxOTAwIG9yCisjIDE5MDQuCisjCisjIFBhcmFtZXRlcjogRGF0ZSBhbmQgdGltZSBzdHJpbmcgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKKyMgICAgICAgICAgICAgICB5eXl5LW1tLWRkVGhoOm1tOnNzLnNzICAjIFN0YW5kYXJkCisjICAgICAgICAgICAgICAgeXl5eS1tbS1kZFQgICAgICAgICAgICAgIyBEYXRlIG9ubHkKKyMgICAgICAgICAgICAgICAgICAgICAgICAgVGhoOm1tOnNzLnNzICAjIFRpbWUgb25seQorIworIyBSZXR1cm5zOgorIyAgICAgICAgICAgIEEgZGVjaW1hbCBudW1iZXIgcmVwcmVzZW50aW5nIGEgdmFsaWQgRXhjZWwgZGF0ZSwgb3IKKyMgICAgICAgICAgICB1bmRlZiBpZiB0aGUgZGF0ZSBpcyBpbnZhbGlkLgorIworc3ViIGNvbnZlcnRfZGF0ZV90aW1lIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKyAgICBteSAkZGF0ZV90aW1lID0gJF9bMF07CisKKyAgICBteSAkZGF5cyAgICAgID0gMDsgIyBOdW1iZXIgb2YgZGF5cyBzaW5jZSBlcG9jaAorICAgIG15ICRzZWNvbmRzICAgPSAwOyAjIFRpbWUgZXhwcmVzc2VkIGFzIGZyYWN0aW9uIG9mIDI0aCBob3VycyBpbiBzZWNvbmRzCisKKyAgICBteSAoJHllYXIsICRtb250aCwgJGRheSk7CisgICAgbXkgKCRob3VyLCAkbWluLCAkc2VjKTsKKworCisgICAgIyBTdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICAgICRkYXRlX3RpbWUgPX4gcy9eXHMrLy87CisgICAgJGRhdGVfdGltZSA9fiBzL1xzKyQvLzsKKworICAgICMgQ2hlY2sgZm9yIGludmFsaWQgZGF0ZSBjaGFyLgorICAgIHJldHVybiBpZiAgICAgJGRhdGVfdGltZSA9fiAvW14wLTlUOlwtXC5aXS87CisKKyAgICAjIENoZWNrIGZvciAiVCIgYWZ0ZXIgZGF0ZSBvciBiZWZvcmUgdGltZS4KKyAgICByZXR1cm4gdW5sZXNzICRkYXRlX3RpbWUgPX4gL1xkVHxUXGQvOworCisgICAgIyBTdHJpcCB0cmFpbGluZyBaIGluIElTTzg2MDEgZGF0ZS4KKyAgICAkZGF0ZV90aW1lID1+IHMvWiQvLzsKKworCisgICAgIyBTcGxpdCBpbnRvIGRhdGUgYW5kIHRpbWUuCisgICAgbXkgKCRkYXRlLCAkdGltZSkgPSBzcGxpdCAvVC8sICRkYXRlX3RpbWU7CisKKworICAgICMgV2UgYWxsb3cgdGhlIHRpbWUgcG9ydGlvbiBvZiB0aGUgaW5wdXQgRGF0ZVRpbWUgdG8gYmUgb3B0aW9uYWwuCisgICAgaWYgKCR0aW1lIG5lICcnKSB7CisgICAgICAgICMgTWF0Y2ggaGg6bW06c3Muc3NzKyB3aGVyZSB0aGUgc2Vjb25kcyBhcmUgb3B0aW9uYWwKKyAgICAgICAgaWYgKCR0aW1lID1+IC9eKFxkXGQpOihcZFxkKSg6KFxkXGQoXC5cZCspPykpPy8pIHsKKyAgICAgICAgICAgICRob3VyICAgPSAkMTsKKyAgICAgICAgICAgICRtaW4gICAgPSAkMjsKKyAgICAgICAgICAgICRzZWMgICAgPSAkNCB8fCAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHVuZGVmOyAjIE5vdCBhIHZhbGlkIHRpbWUgZm9ybWF0LgorICAgICAgICB9CisKKyAgICAgICAgIyBTb21lIGJvdW5kYXJ5IGNoZWNrcworICAgICAgICByZXR1cm4gaWYgJGhvdXIgPj0gMjQ7CisgICAgICAgIHJldHVybiBpZiAkbWluICA+PSA2MDsKKyAgICAgICAgcmV0dXJuIGlmICRzZWMgID49IDYwOworCisgICAgICAgICMgRXhjZWwgZXhwcmVzc2VzIHNlY29uZHMgYXMgYSBmcmFjdGlvbiBvZiB0aGUgbnVtYmVyIGluIDI0IGhvdXJzLgorICAgICAgICAkc2Vjb25kcyA9ICgkaG91ciAqNjAqNjAgKyAkbWluICo2MCArICRzZWMpIC8gKDI0ICo2MCAqNjApOworICAgIH0KKworCisgICAgIyBXZSBhbGxvdyB0aGUgZGF0ZSBwb3J0aW9uIG9mIHRoZSBpbnB1dCBEYXRlVGltZSB0byBiZSBvcHRpb25hbC4KKyAgICByZXR1cm4gJHNlY29uZHMgaWYgJGRhdGUgZXEgJyc7CisKKworICAgICMgTWF0Y2ggZGF0ZSBhcyB5eXl5LW1tLWRkLgorICAgIGlmICgkZGF0ZSA9fiAvXihcZFxkXGRcZCktKFxkXGQpLShcZFxkKSQvKSB7CisgICAgICAgICR5ZWFyICAgPSAkMTsKKyAgICAgICAgJG1vbnRoICA9ICQyOworICAgICAgICAkZGF5ICAgID0gJDM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gdW5kZWY7ICMgTm90IGEgdmFsaWQgZGF0ZSBmb3JtYXQuCisgICAgfQorCisgICAgIyBTZXQgdGhlIGVwb2NoIGFzIDE5MDAgb3IgMTkwNC4gRGVmYXVsdHMgdG8gMTkwMC4KKyAgICBteSAkZGF0ZV8xOTA0ID0gJHNlbGYtPntfMTkwNH07CisKKworICAgICMgU3BlY2lhbCBjYXNlcyBmb3IgRXhjZWwuCisgICAgaWYgKG5vdCAkZGF0ZV8xOTA0KSB7CisgICAgICAgIHJldHVybiAgICAgICRzZWNvbmRzIGlmICRkYXRlIGVxICcxODk5LTEyLTMxJzsgIyBFeGNlbCAxOTAwIGVwb2NoCisgICAgICAgIHJldHVybiAgICAgICRzZWNvbmRzIGlmICRkYXRlIGVxICcxOTAwLTAxLTAwJzsgIyBFeGNlbCAxOTAwIGVwb2NoCisgICAgICAgIHJldHVybiA2MCArICRzZWNvbmRzIGlmICRkYXRlIGVxICcxOTAwLTAyLTI5JzsgIyBFeGNlbCBmYWxzZSBsZWFwZGF5CisgICAgfQorCisKKyAgICAjIFdlIGNhbGN1bGF0ZSB0aGUgZGF0ZSBieSBjYWxjdWxhdGluZyB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGVwb2NoCisgICAgIyBhbmQgYWRqdXN0IGZvciB0aGUgbnVtYmVyIG9mIGxlYXAgZGF5cy4gV2UgY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbGVhcAorICAgICMgZGF5cyBieSBub3JtYWxpc2luZyB0aGUgeWVhciBpbiByZWxhdGlvbiB0byB0aGUgZXBvY2guIFRodXMgdGhlIHllYXIgMjAwMAorICAgICMgYmVjb21lcyAxMDAgZm9yIDQgYW5kIDEwMCB5ZWFyIGxlYXBkYXlzIGFuZCA0MDAgZm9yIDQwMCB5ZWFyIGxlYXBkYXlzLgorICAgICMKKyAgICBteSAkZXBvY2ggICA9ICRkYXRlXzE5MDQgPyAxOTA0IDogMTkwMDsKKyAgICBteSAkb2Zmc2V0ICA9ICRkYXRlXzE5MDQgPyAgICA0IDogICAgMDsKKyAgICBteSAkbm9ybSAgICA9IDMwMDsKKyAgICBteSAkcmFuZ2UgICA9ICR5ZWFyIC0kZXBvY2g7CisKKworICAgICMgU2V0IG1vbnRoIGRheXMgYW5kIGNoZWNrIGZvciBsZWFwIHllYXIuCisgICAgbXkgQG1kYXlzICAgPSAoMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMSk7CisgICAgbXkgJGxlYXAgICAgPSAwOworICAgICAgICRsZWFwICAgID0gMSAgaWYgJHllYXIgJSA0ID09IDAgYW5kICR5ZWFyICUgMTAwIG9yICR5ZWFyICUgNDAwID09IDA7CisgICAgJG1kYXlzWzFdICAgPSAyOSBpZiAkbGVhcDsKKworCisgICAgIyBTb21lIGJvdW5kYXJ5IGNoZWNrcworICAgIHJldHVybiBpZiAkeWVhciAgPCAkZXBvY2ggb3IgJHllYXIgID4gOTk5OTsKKyAgICByZXR1cm4gaWYgJG1vbnRoIDwgMSAgICAgIG9yICRtb250aCA+IDEyOworICAgIHJldHVybiBpZiAkZGF5ICAgPCAxICAgICAgb3IgJGRheSAgID4gJG1kYXlzWyRtb250aCAtMV07CisKKyAgICAjIEFjY3VtdWxhdGUgdGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBlcG9jaC4KKyAgICAkZGF5cyAgPSAkZGF5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWRkIGRheXMgZm9yIGN1cnJlbnQgbW9udGgKKyAgICAkZGF5cyArPSAkbWRheXNbJF9dIGZvciAwIC4uICRtb250aCAtMjsgICAgICMgQWRkIGRheXMgZm9yIHBhc3QgbW9udGhzCisgICAgJGRheXMgKz0gJHJhbmdlICozNjU7ICAgICAgICAgICAgICAgICAgICAgICAjIEFkZCBkYXlzIGZvciBwYXN0IHllYXJzCisgICAgJGRheXMgKz0gaW50KCgkcmFuZ2UpICAgICAgICAgICAgICAgIC8gIDQpOyAjIEFkZCBsZWFwZGF5cworICAgICRkYXlzIC09IGludCgoJHJhbmdlICskb2Zmc2V0KSAgICAgICAvMTAwKTsgIyBTdWJ0cmFjdCAxMDAgeWVhciBsZWFwZGF5cworICAgICRkYXlzICs9IGludCgoJHJhbmdlICskb2Zmc2V0ICskbm9ybSkvNDAwKTsgIyBBZGQgNDAwIHllYXIgbGVhcGRheXMKKyAgICAkZGF5cyAtPSAkbGVhcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxyZWFkeSBjb3VudGVkIGFib3ZlCisKKworICAgICMgQWRqdXN0IGZvciBFeGNlbCBlcnJvbmVvdXNseSB0cmVhdGluZyAxOTAwIGFzIGEgbGVhcCB5ZWFyLgorICAgICRkYXlzKysgaWYgJGRhdGVfMTkwNCA9PSAwIGFuZCAkZGF5cyA+IDU5OworCisgICAgcmV0dXJuICRkYXlzICsgJHNlY29uZHM7Cit9CisKKworCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBzZXRfcm93KCRyb3csICRoZWlnaHQsICRYRiwgJGhpZGRlbiwgJGxldmVsKQorIworIyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHNldCB0aGUgaGVpZ2h0IGFuZCBYRiBmb3JtYXQgZm9yIGEgcm93LgorIyBXcml0ZXMgdGhlICBCSUZGIHJlY29yZCBST1cuCisjCitzdWIgc2V0X3JvdyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAyMDg7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAjIFJvdyBOdW1iZXIKKyAgICBteSAkY29sTWljICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBGaXJzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRjb2xNYWMgICAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIExhc3QgZGVmaW5lZCBjb2x1bW4KKyAgICBteSAkbWl5Unc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSb3cgaGVpZ2h0CisgICAgbXkgJGlyd01hYyAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgVXNlZCBieSBFeGNlbCB0byBvcHRpbWlzZSBsb2FkaW5nCisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkaXhmZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorICAgIG15ICRoZWlnaHQgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAjIEZvcm1hdCBvYmplY3QKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1syXTsgICAgICAgICAgICAgICAgIyBGb3JtYXQgb2JqZWN0CisgICAgbXkgJGhpZGRlbiAgICAgID0gJF9bM10gfHwgMDsgICAgICAgICAgICMgSGlkZGVuIGZsYWcKKyAgICBteSAkbGV2ZWwgICAgICAgPSAkX1s0XSB8fCAwOyAgICAgICAgICAgIyBPdXRsaW5lIGxldmVsCisgICAgbXkgJGNvbGxhcHNlZCAgID0gJF9bNV0gfHwgMDsgICAgICAgICAgICMgQ29sbGFwc2VkIHJvdworCisKKyAgICByZXR1cm4gdW5sZXNzIGRlZmluZWQgJHJvdzsgICMgRW5zdXJlIGF0IGxlYXN0ICRyb3cgaXMgc3BlY2lmaWVkLgorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzCisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93LCAwLCAwLCAxKTsKKworICAgICMgQ2hlY2sgZm9yIGEgZm9ybWF0IG9iamVjdAorICAgIGlmIChyZWYgJGZvcm1hdCkgeworICAgICAgICAkaXhmZSA9ICRmb3JtYXQtPmdldF94Zl9pbmRleCgpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJGl4ZmUgPSAweDBGOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIHJvdyBoZWlnaHQgaW4gdW5pdHMgb2YgMS8yMCBvZiBhIHBvaW50LiBOb3RlLCBzb21lIGhlaWdodHMgbWF5CisgICAgIyBub3QgYmUgb2J0YWluZWQgZXhhY3RseSBkdWUgdG8gcm91bmRpbmcgaW4gRXhjZWwuCisgICAgIworICAgIGlmIChkZWZpbmVkICRoZWlnaHQpIHsKKyAgICAgICAgJG1peVJ3ID0gJGhlaWdodCAqMjA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkbWl5UncgPSAweGZmOyAjIFRoZSBkZWZhdWx0IHJvdyBoZWlnaHQKKyAgICAgICAgJGhlaWdodCA9IDA7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgbGltaXRzIGZvciB0aGUgb3V0bGluZSBsZXZlbHMgKDAgPD0geCA8PSA3KS4KKyAgICAkbGV2ZWwgPSAwIGlmICRsZXZlbCA8IDA7CisgICAgJGxldmVsID0gNyBpZiAkbGV2ZWwgPiA3OworCisgICAgJHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9ID0gJGxldmVsIGlmICRsZXZlbCA+JHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9OworCisKKyAgICAjIFNldCB0aGUgb3B0aW9ucyBmbGFncy4KKyAgICAjIDB4MTA6IFRoZSBmQ29sbGFwc2VkIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIHJvdyBjb250YWlucyB0aGUgIisiCisgICAgIyAgICAgICB3aGVuIGFuIG91dGxpbmUgZ3JvdXAgaXMgY29sbGFwc2VkLgorICAgICMgMHgyMDogVGhlIGZEeVplcm8gaGVpZ2h0IGZsYWcgaW5kaWNhdGVzIGEgY29sbGFwc2VkIG9yIGhpZGRlbiByb3cuCisgICAgIyAweDQwOiBUaGUgZlVuc3luY2VkIGZsYWcgaXMgdXNlZCB0byBzaG93IHRoYXQgdGhlIGZvbnQgYW5kIHJvdyBoZWlnaHRzCisgICAgIyAgICAgICBhcmUgbm90IGNvbXBhdGlibGUuIFRoaXMgaXMgdXN1YWxseSB0aGUgY2FzZSBmb3IgV3JpdGVFeGNlbC4KKyAgICAjIDB4ODA6IFRoZSBmR2hvc3REaXJ0eSBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSByb3cgaGFzIGJlZW4gZm9ybWF0dGVkLgorICAgICMKKyAgICAkZ3JiaXQgfD0gJGxldmVsOworICAgICRncmJpdCB8PSAweDAwMTAgaWYgJGNvbGxhcHNlZDsKKyAgICAkZ3JiaXQgfD0gMHgwMDIwIGlmICRoaWRkZW47CisgICAgJGdyYml0IHw9IDB4MDA0MDsKKyAgICAkZ3JiaXQgfD0gMHgwMDgwIGlmICRmb3JtYXQ7CisgICAgJGdyYml0IHw9IDB4MDEwMDsKKworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2dnZ2diIsICRyb3csICRjb2xNaWMsICRjb2xNYWMsICRtaXlSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpcndNYWMsJHJlc2VydmVkLCAkZ3JiaXQsICRpeGZlKTsKKworCisgICAgIyBTdG9yZSB0aGUgZGF0YSBvciB3cml0ZSBpbW1lZGlhdGVseSBkZXBlbmRpbmcgb24gdGhlIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgICBpZiAoJHNlbGYtPntfY29tcGF0aWJpbGl0eX0pIHsKKyAgICAgICAgJHNlbGYtPntfcm93X2RhdGF9LT57JF9bMF19ID0gJGhlYWRlciAuICRkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworCisgICAgIyBTdG9yZSB0aGUgcm93IHNpemVzIGZvciB1c2Ugd2hlbiBjYWxjdWxhdGluZyBpbWFnZSB2ZXJ0aWNlcy4KKyAgICAjIEFsc28gc3RvcmUgdGhlIGNvbHVtbiBmb3JtYXRzLgorICAgICRzZWxmLT57X3Jvd19zaXplc30tPnskX1swXX0gICA9ICRoZWlnaHQ7CisgICAgJHNlbGYtPntfcm93X2Zvcm1hdHN9LT57JF9bMF19ID0gJGZvcm1hdCBpZiBkZWZpbmVkICRmb3JtYXQ7Cit9CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF93cml0ZV9yb3dfZGVmYXVsdCgpCisjCisjIFdyaXRlIGEgZGVmYXVsdCByb3cgcmVjb3JkLCBpbiBjb21wYXRpYmlsaXR5IG1vZGUsIGZvciByb3dzIHRoYXQgZG9uJ3QgaGF2ZQorIyB1c2VyIHNwZWNpZmllZCB2YWx1ZXMuLgorIworc3ViIF93cml0ZV9yb3dfZGVmYXVsdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAyMDg7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMDsgICAgICAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAjIFJvdyBOdW1iZXIKKyAgICBteSAkY29sTWljICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgIyBGaXJzdCBkZWZpbmVkIGNvbHVtbgorICAgIG15ICRjb2xNYWMgICAgICA9ICRfWzJdOyAgICAgICAgICAgICAgICAjIExhc3QgZGVmaW5lZCBjb2x1bW4KKyAgICBteSAkbWl5UncgICAgICAgPSAweEZGOyAgICAgICAgICAgICAgICAgIyBSb3cgaGVpZ2h0CisgICAgbXkgJGlyd01hYyAgICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgVXNlZCBieSBFeGNlbCB0byBvcHRpbWlzZSBsb2FkaW5nCisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOyAgICAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAxMDA7ICAgICAgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkaXhmZSAgICAgICAgPSAweDBGOyAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2dnZ2diIsICRyb3csICRjb2xNaWMsICRjb2xNYWMsICRtaXlSdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpcndNYWMsJHJlc2VydmVkLCAkZ3JiaXQsICRpeGZlKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9jaGVja19kaW1lbnNpb25zKCRyb3csICRjb2wsICRpZ25vcmVfcm93LCAkaWdub3JlX2NvbCkKKyMKKyMgQ2hlY2sgdGhhdCAkcm93IGFuZCAkY29sIGFyZSB2YWxpZCBhbmQgc3RvcmUgbWF4IGFuZCBtaW4gdmFsdWVzIGZvciB1c2UgaW4KKyMgRElNRU5TSU9OUyByZWNvcmQuIFNlZSwgX3N0b3JlX2RpbWVuc2lvbnMoKS4KKyMKKyMgVGhlICRpZ25vcmVfcm93LyRpZ25vcmVfY29sIGZsYWdzIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3aXNoIHRvCisjIHBlcmZvcm0gdGhlIGRpbWVuc2lvbiBjaGVjayB3aXRob3V0IHN0b3JpbmcgdGhlIHZhbHVlLgorIworIyBUaGUgaWdub3JlIGZsYWdzIGFyZSB1c2UgYnkgc2V0X3JvdygpIGFuZCBkYXRhX3ZhbGlkYXRlLgorIworc3ViIF9jaGVja19kaW1lbnNpb25zIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOworICAgIG15ICRpZ25vcmVfcm93ICA9ICRfWzJdOworICAgIG15ICRpZ25vcmVfY29sICA9ICRfWzNdOworCisKKyAgICByZXR1cm4gLTIgaWYgbm90IGRlZmluZWQgJHJvdzsKKyAgICByZXR1cm4gLTIgaWYgJHJvdyA+PSAkc2VsZi0+e194bHNfcm93bWF4fTsKKworICAgIHJldHVybiAtMiBpZiBub3QgZGVmaW5lZCAkY29sOworICAgIHJldHVybiAtMiBpZiAkY29sID49ICRzZWxmLT57X3hsc19jb2xtYXh9OworCisKKyAgICBpZiAobm90ICRpZ25vcmVfcm93KSB7CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtaW59IG9yICRyb3cgPCAkc2VsZi0+e19kaW1fcm93bWlufSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gPSAkcm93OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vdCBkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtYXh9IG9yICRyb3cgPiAkc2VsZi0+e19kaW1fcm93bWF4fSkgeworICAgICAgICAgICAgJHNlbGYtPntfZGltX3Jvd21heH0gPSAkcm93OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vdCAkaWdub3JlX2NvbCkgeworCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e19kaW1fY29sbWlufSBvciAkY29sIDwgJHNlbGYtPntfZGltX2NvbG1pbn0pIHsKKyAgICAgICAgICAgICRzZWxmLT57X2RpbV9jb2xtaW59ID0gJGNvbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChub3QgZGVmaW5lZCAkc2VsZi0+e19kaW1fY29sbWF4fSBvciAkY29sID4gJHNlbGYtPntfZGltX2NvbG1heH0pIHsKKyAgICAgICAgICAgICRzZWxmLT57X2RpbV9jb2xtYXh9ID0gJGNvbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RpbWVuc2lvbnMoKQorIworIyBXcml0ZXMgRXhjZWwgRElNRU5TSU9OUyB0byBkZWZpbmUgdGhlIGFyZWEgaW4gd2hpY2ggdGhlcmUgaXMgY2VsbCBkYXRhLgorIworIyBOb3RlczoKKyMgICBFeGNlbCBzdG9yZXMgdGhlIG1heCByb3cvY29sIGFzIHJvdy9jb2wgKzEuCisjICAgTWF4IGFuZCBtaW4gdmFsdWVzIG9mIDAgYXJlIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBubyBjZWxsIGRhdGEuCisjICAgV2Ugc2V0IHRoZSB1bmRlZiBtZW1iZXIgZGF0YSB0byAwIHNpbmNlIGl0IGlzIHVzZWQgYnkgX3N0b3JlX3RhYmxlKCkuCisjICAgSW5zZXJ0aW5nIGltYWdlcyBvciBjaGFydHMgZG9lc24ndCBjaGFuZ2UgdGhlIERJTUVOU0lPTiBkYXRhLgorIworc3ViIF9zdG9yZV9kaW1lbnNpb25zIHsKKworICAgIG15ICRzZWxmICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMjAwOyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgID0gMHgwMDBFOyAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRyb3dfbWluOyAgICAgICAgICAgICAgICAgICAgIyBGaXJzdCByb3cKKyAgICBteSAkcm93X21heDsgICAgICAgICAgICAgICAgICAgICMgTGFzdCByb3cgcGx1cyAxCisgICAgbXkgJGNvbF9taW47ICAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbHVtbgorICAgIG15ICRjb2xfbWF4OyAgICAgICAgICAgICAgICAgICAgIyBMYXN0IGNvbHVtbiBwbHVzIDEKKyAgICBteSAkcmVzZXJ2ZWQgID0gMHgwMDAwOyAgICAgICAgICMgUmVzZXJ2ZWQgYnkgRXhjZWwKKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtaW59KSB7JHJvd19taW4gPSAkc2VsZi0+e19kaW1fcm93bWlufSAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskcm93X21pbiA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9yb3dtYXh9KSB7JHJvd19tYXggPSAkc2VsZi0+e19kaW1fcm93bWF4fSArIDF9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskcm93X21heCA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtaW59KSB7JGNvbF9taW4gPSAkc2VsZi0+e19kaW1fY29sbWlufSAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskY29sX21pbiA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChkZWZpbmVkICRzZWxmLT57X2RpbV9jb2xtYXh9KSB7JGNvbF9tYXggPSAkc2VsZi0+e19kaW1fY29sbWF4fSArIDF9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHskY29sX21heCA9IDAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgIyBTZXQgbWVtYmVyIGRhdGEgdG8gdGhlIG5ldyBtYXgvbWluIHZhbHVlIGZvciB1c2UgYnkgX3N0b3JlX3RhYmxlKCkuCisgICAgJHNlbGYtPntfZGltX3Jvd21pbn0gPSAkcm93X21pbjsKKyAgICAkc2VsZi0+e19kaW1fcm93bWF4fSA9ICRyb3dfbWF4OworICAgICRzZWxmLT57X2RpbV9jb2xtaW59ID0gJGNvbF9taW47CisgICAgJHNlbGYtPntfZGltX2NvbG1heH0gPSAkY29sX21heDsKKworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soIlZWdnZ2IiwgJHJvd19taW4sICRyb3dfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xfbWluLCAkY29sX21heCwgJHJlc2VydmVkKTsKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3dpbmRvdzIoKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBXaW5kb3cyLgorIworc3ViIF9zdG9yZV93aW5kb3cyIHsKKworICAgIHVzZSBpbnRlZ2VyOyAgICAjIEF2b2lkIDw8IHNoaWZ0IGJ1ZyBpbiBQZXJsIDUuNi4wIG9uIEhQLVVYCisKKyAgICBteSAkc2VsZiAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgICAgICAgPSAweDAyM0U7ICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgID0gMHgwMDEyOyAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZ3JiaXQgICAgICAgICAgPSAweDAwQjY7ICAgICAjIE9wdGlvbiBmbGFncworICAgIG15ICRyd1RvcCAgICAgICAgICA9ICRzZWxmLT57X2ZpcnN0X3Jvd307ICAgIyBUb3AgdmlzaWJsZSByb3cKKyAgICBteSAkY29sTGVmdCAgICAgICAgPSAkc2VsZi0+e19maXJzdF9jb2x9OyAgICMgTGVmdG1vc3QgdmlzaWJsZSBjb2x1bW4KKyAgICBteSAkcmdiSGRyICAgICAgICAgPSAweDAwMDAwMDQwOyAgICAgICAgICAgICMgUm93L2NvbCBoZWFkaW5nLCBncmlkIGNvbG9yCisKKyAgICBteSAkd1NjYWxlU0xWICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICMgWm9vbSBpbiBwYWdlIGJyZWFrIHByZXZpZXcKKyAgICBteSAkd1NjYWxlTm9ybWFsICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgICMgWm9vbSBpbiBub3JtYWwgdmlldworICAgIG15ICRyZXNlcnZlZCAgICAgICA9IDB4MDAwMDAwMDA7CisKKworICAgICMgVGhlIG9wdGlvbnMgZmxhZ3MgdGhhdCBjb21wcmlzZSAkZ3JiaXQKKyAgICBteSAkZkRzcEZtbGEgICAgICAgPSAkc2VsZi0+e19kaXNwbGF5X2Zvcm11bGFzfTsgIyAwIC0gYml0CisgICAgbXkgJGZEc3BHcmlkICAgICAgID0gJHNlbGYtPntfc2NyZWVuX2dyaWRsaW5lc307ICMgMQorICAgIG15ICRmRHNwUndDb2wgICAgICA9ICRzZWxmLT57X2Rpc3BsYXlfaGVhZGVyc307ICAjIDIKKyAgICBteSAkZkZyb3plbiAgICAgICAgPSAkc2VsZi0+e19mcm96ZW59OyAgICAgICAgICAgIyAzCisgICAgbXkgJGZEc3BaZXJvcyAgICAgID0gJHNlbGYtPntfZGlzcGxheV96ZXJvc307ICAgICMgNAorICAgIG15ICRmRGVmYXVsdEhkciAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIDUKKyAgICBteSAkZkFyYWJpYyAgICAgICAgPSAkc2VsZi0+e19kaXNwbGF5X2FyYWJpY307ICAgIyA2CisgICAgbXkgJGZEc3BHdXRzICAgICAgID0gJHNlbGYtPntfb3V0bGluZV9vbn07ICAgICAgICMgNworICAgIG15ICRmRnJvemVuTm9TcGxpdCA9ICRzZWxmLT57X2Zyb3plbl9ub19zcGxpdH07ICAjIDAgLSBiaXQKKyAgICBteSAkZlNlbGVjdGVkICAgICAgPSAkc2VsZi0+e19zZWxlY3RlZH07ICAgICAgICAgIyAxCisgICAgbXkgJGZQYWdlZCAgICAgICAgID0gJHNlbGYtPntfYWN0aXZlfTsgICAgICAgICAgICMgMgorICAgIG15ICRmQnJlYWtQcmV2aWV3ICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMKKworICAgICRncmJpdCAgICAgICAgICAgICA9ICRmRHNwRm1sYTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcEdyaWQgICAgICAgPDwgMTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcFJ3Q29sICAgICAgPDwgMjsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkZyb3plbiAgICAgICAgPDwgMzsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcFplcm9zICAgICAgPDwgNDsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRlZmF1bHRIZHIgICAgPDwgNTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkFyYWJpYyAgICAgICAgPDwgNjsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkRzcEd1dHMgICAgICAgPDwgNzsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZkZyb3plbk5vU3BsaXQgPDwgODsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZlNlbGVjdGVkICAgICAgPDwgOTsKKyAgICAkZ3JiaXQgICAgICAgICAgICB8PSAkZlBhZ2VkICAgICAgICAgPDwgMTA7CisgICAgJGdyYml0ICAgICAgICAgICAgfD0gJGZCcmVha1ByZXZpZXcgIDw8IDExOworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZWdnZWIiwgJGdyYml0LCAkcndUb3AsICRjb2xMZWZ0LCAkcmdiSGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR3U2NhbGVTTFYsICR3U2NhbGVOb3JtYWwsICRyZXNlcnZlZCApOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3BhZ2VfdmlldygpCisjCisjIFNldCBwYWdlIHZpZXcgbW9kZS4gT25seSBhcHBsaWNhYmxlIHRvIE1hYyBFeGNlbC4KKyMKK3N1YiBfc3RvcmVfcGFnZV92aWV3IHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3BhZ2Vfdmlld307CisKKyAgICBteSAkZGF0YSAgICA9IHBhY2sgIkgqIiwgJ0M4MDgxMTAwQzgwODAwMDAwMDAwMDA0MDAwMDAwMDAwMDkwMDAwMDAwMCc7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdGFiX2NvbG9yKCkKKyMKKyMgV3JpdGUgdGhlIFRhYiBDb2xvciBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdGFiX2NvbG9yIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisgICAgbXkgJGNvbG9yICAgPSAkc2VsZi0+e190YWJfY29sb3J9OworCisgICAgcmV0dXJuIHVubGVzcyAkY29sb3I7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDg2MjsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMTQ7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkemVybyAgICA9IDB4MDAwMDsKKyAgICBteSAkdW5rbm93biA9IDB4MDAxNDsKKworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInZ2dnZ2dnZ2dnYiLCAkcmVjb3JkLCAkemVybywgJHplcm8sICR6ZXJvLCAkemVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemVybywgJHVua25vd24sICR6ZXJvLCAkY29sb3IsICR6ZXJvKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kZWZyb3coKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBERUZST1dIRUlHSFQuCisjCitzdWIgX3N0b3JlX2RlZnJvdyB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAyMjU7ICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICA9IDB4MDAwNDsgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRncmJpdCAgICA9IDB4MDAwMDsgICAgICAjIE9wdGlvbnMuCisgICAgbXkgJGhlaWdodCAgID0gMHgwMEZGOyAgICAgICMgRGVmYXVsdCByb3cgaGVpZ2h0CisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2IiwgJGdyYml0LCAgJGhlaWdodCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RlZmNvbCgpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIERFRkNPTFdJRFRILgorIworc3ViIF9zdG9yZV9kZWZjb2wgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDU1OyAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkY29sd2lkdGggPSAweDAwMDg7ICAgICAgIyBEZWZhdWx0IGNvbHVtbiB3aWR0aAorCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2IiwgICRjb2x3aWR0aCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NvbGluZm8oJGZpcnN0Y29sLCAkbGFzdGNvbCwgJHdpZHRoLCAkZm9ybWF0LCAkaGlkZGVuKQorIworIyBXcml0ZSBCSUZGIHJlY29yZCBDT0xJTkZPIHRvIGRlZmluZSBjb2x1bW4gd2lkdGhzCisjCisjIE5vdGU6IFRoZSBTREsgc2F5cyB0aGUgcmVjb3JkIGxlbmd0aCBpcyAweDBCIGJ1dCBFeGNlbCB3cml0ZXMgYSAweDBDCisjIGxlbmd0aCByZWNvcmQuCisjCitzdWIgX3N0b3JlX2NvbGluZm8geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDdEOyAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDBCOyAgICAgICAgICAjIE51bWJlciBvZiBieXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjb2xGaXJzdCA9ICRfWzBdIHx8IDA7ICAgICAgIyBGaXJzdCBmb3JtYXR0ZWQgY29sdW1uCisgICAgbXkgJGNvbExhc3QgID0gJF9bMV0gfHwgMDsgICAgICAjIExhc3QgZm9ybWF0dGVkIGNvbHVtbgorICAgIG15ICR3aWR0aCAgICA9ICRfWzJdIHx8IDguNDM7ICAgIyBDb2wgd2lkdGggaW4gdXNlciB1bml0cywgOC40MyBpcyBkZWZhdWx0CisgICAgbXkgJGNvbGR4OyAgICAgICAgICAgICAgICAgICAgICAjIENvbCB3aWR0aCBpbiBpbnRlcm5hbCB1bml0cworICAgIG15ICRwaXhlbHM7ICAgICAgICAgICAgICAgICAgICAgIyBDb2wgd2lkdGggaW4gcGl4ZWxzCisKKyAgICAjIEV4Y2VsIHJvdW5kcyB0aGUgY29sdW1uIHdpZHRoIHRvIHRoZSBuZWFyZXN0IHBpeGVsLiBUaGVyZWZvcmUgd2UgZmlyc3QKKyAgICAjIGNvbnZlcnQgdG8gcGl4ZWxzIGFuZCB0aGVuIHRvIHRoZSBpbnRlcm5hbCB1bml0cy4gVGhlIHBpeGVsIHRvIHVzZXJzLXVuaXRzCisgICAgIyByZWxhdGlvbnNoaXAgaXMgZGlmZmVyZW50IGZvciB2YWx1ZXMgbGVzcyB0aGFuIDEuCisgICAgIworICAgIGlmICgkd2lkdGggPCAxKSB7CisgICAgICAgICRwaXhlbHMgPSBpbnQoJHdpZHRoICoxMik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGl4ZWxzID0gaW50KCR3aWR0aCAqNyApICs1OworICAgIH0KKworICAgICRjb2xkeCA9IGludCgkcGl4ZWxzICoyNTYvNyk7CisKKworICAgIG15ICRpeGZlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBYRiBpbmRleAorICAgIG15ICRncmJpdCAgICAgICA9IDB4MDAwMDsgICAgICAgICAgIyBPcHRpb24gZmxhZ3MKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwOyAgICAgICAgICAgICMgUmVzZXJ2ZWQKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1szXTsgICAgICAgICAgICMgRm9ybWF0IG9iamVjdAorICAgIG15ICRoaWRkZW4gICAgICA9ICRfWzRdIHx8IDA7ICAgICAgIyBIaWRkZW4gZmxhZworICAgIG15ICRsZXZlbCAgICAgICA9ICRfWzVdIHx8IDA7ICAgICAgIyBPdXRsaW5lIGxldmVsCisgICAgbXkgJGNvbGxhcHNlZCAgID0gJF9bNl0gfHwgMDsgICAgICAjIE91dGxpbmUgbGV2ZWwKKworCisgICAgIyBDaGVjayBmb3IgYSBmb3JtYXQgb2JqZWN0CisgICAgaWYgKHJlZiAkZm9ybWF0KSB7CisgICAgICAgICRpeGZlID0gJGZvcm1hdC0+Z2V0X3hmX2luZGV4KCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkaXhmZSA9IDB4MEY7CisgICAgfQorCisKKyAgICAjIFNldCB0aGUgbGltaXRzIGZvciB0aGUgb3V0bGluZSBsZXZlbHMgKDAgPD0geCA8PSA3KS4KKyAgICAkbGV2ZWwgPSAwIGlmICRsZXZlbCA8IDA7CisgICAgJGxldmVsID0gNyBpZiAkbGV2ZWwgPiA3OworCisKKyAgICAjIFNldCB0aGUgb3B0aW9ucyBmbGFncy4gKFNlZSBzZXRfcm93KCkgZm9yIG1vcmUgZGV0YWlscykuCisgICAgJGdyYml0IHw9IDB4MDAwMSBpZiAkaGlkZGVuOworICAgICRncmJpdCB8PSAkbGV2ZWwgPDwgODsKKyAgICAkZ3JiaXQgfD0gMHgxMDAwIGlmICRjb2xsYXBzZWQ7CisKKworICAgIG15ICRoZWFkZXIgICA9IHBhY2soInZ2IiwgICAgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInZ2dnZ2QyIsICRjb2xGaXJzdCwgJGNvbExhc3QsICRjb2xkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaXhmZSwgJGdyYml0LCAkcmVzZXJ2ZWQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9maWx0ZXJtb2RlKCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgRklMVEVSTU9ERSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB3b3Jrc2hlZXQgY29udGFpbnMKKyMgQVVUT0ZJTFRFUiByZWNvcmQsIGllLiBhdXRvZmlsdGVycyB3aXRoIGEgZmlsdGVyIHNldC4KKyMKK3N1YiBfc3RvcmVfZmlsdGVybW9kZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA5QjsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAwOyAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgIyBPbmx5IHdyaXRlIHRoZSByZWNvcmQgaWYgdGhlIHdvcmtzaGVldCBjb250YWlucyBhIGZpbHRlcmVkIGF1dG9maWx0ZXIuCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfb259OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hdXRvZmlsdGVyaW5mbygpCisjCisjIFdyaXRlIEJJRkYgcmVjb3JkIEFVVE9GSUxURVJJTkZPLgorIworc3ViIF9zdG9yZV9hdXRvZmlsdGVyaW5mbyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA5RDsgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworICAgIG15ICRudW1fZmlsdGVycyA9ICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisKKyAgICAjIE9ubHkgd3JpdGUgdGhlIHJlY29yZCBpZiB0aGUgd29ya3NoZWV0IGNvbnRhaW5zIGFuIGF1dG9maWx0ZXIuCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY291bnR9OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2IiwgICRudW1fZmlsdGVycyk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3NlbGVjdGlvbigkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgU0VMRUNUSU9OLgorIworc3ViIF9zdG9yZV9zZWxlY3Rpb24geworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisgICAgbXkgJHJlY29yZCAgID0gMHgwMDFEOyAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMEY7ICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcG5uICAgICAgPSAkc2VsZi0+e19hY3RpdmVfcGFuZX07ICAgIyBQYW5lIHBvc2l0aW9uCisgICAgbXkgJHJ3QWN0ICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgQWN0aXZlIHJvdworICAgIG15ICRjb2xBY3QgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEFjdGl2ZSBjb2x1bW4KKyAgICBteSAkaXJlZkFjdCAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIyBBY3RpdmUgY2VsbCByZWYKKyAgICBteSAkY3JlZiAgICAgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgcmVmcworCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgRmlyc3Qgcm93IGluIHJlZmVyZW5jZQorICAgIG15ICRjb2xGaXJzdCA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbCBpbiByZWZlcmVuY2UKKyAgICBteSAkcndMYXN0ICAgPSAkX1syXSB8fCAkcndGaXJzdDsgICAgICAgIyBMYXN0ICByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbExhc3QgID0gJF9bM10gfHwgJGNvbEZpcnN0OyAgICAgICMgTGFzdCAgY29sIGluIHJlZmVyZW5jZQorCisgICAgIyBTd2FwIGxhc3Qgcm93L2NvbCBmb3IgZmlyc3Qgcm93L2NvbCBhcyBuZWNlc3NhcnkKKyAgICBpZiAoJHJ3Rmlyc3QgPiAkcndMYXN0KSB7CisgICAgICAgICgkcndGaXJzdCwgJHJ3TGFzdCkgPSAoJHJ3TGFzdCwgJHJ3Rmlyc3QpOworICAgIH0KKworICAgIGlmICgkY29sRmlyc3QgPiAkY29sTGFzdCkgeworICAgICAgICAoJGNvbEZpcnN0LCAkY29sTGFzdCkgPSAoJGNvbExhc3QsICRjb2xGaXJzdCk7CisgICAgfQorCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICAgICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJDdnZ2dnZ2Q0MiLCAgICAkcG5uLCAkcndBY3QsICRjb2xBY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlyZWZBY3QsICRjcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyd0ZpcnN0LCAkcndMYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xGaXJzdCwgJGNvbExhc3QpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2V4dGVybmNvdW50KCRjb3VudCkKKyMKKyMgV3JpdGUgQklGRiByZWNvcmQgRVhURVJOQ09VTlQgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBleHRlcm5hbCBzaGVldAorIyByZWZlcmVuY2VzIGluIGEgd29ya3NoZWV0LgorIworIyBFeGNlbCBvbmx5IHN0b3JlcyByZWZlcmVuY2VzIHRvIGV4dGVybmFsIHNoZWV0cyB0aGF0IGFyZSB1c2VkIGluIGZvcm11bGFzLgorIyBGb3Igc2ltcGxpY2l0eSB3ZSBzdG9yZSByZWZlcmVuY2VzIHRvIGFsbCB0aGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaworIyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgdXNlZCBvciBub3QuIFRoaXMgcmVkdWNlcyB0aGUgb3ZlcmFsbAorIyBjb21wbGV4aXR5IGFuZCBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBhIHR3byB3YXkgZGlhbG9ndWUgYmV0d2VlbiB0aGUgZm9ybXVsYQorIyBwYXJzZXIgdGhlIHdvcmtzaGVldCBvYmplY3RzLgorIworc3ViIF9zdG9yZV9leHRlcm5jb3VudCB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKyAgICBteSAkcmVjb3JkICAgPSAweDAwMTY7ICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGN4YWxzICAgID0gJF9bMF07ICAgICAgICAgICAjIE51bWJlciBvZiBleHRlcm5hbCByZWZlcmVuY2VzCisKKyAgICBteSAkaGVhZGVyICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICA9IHBhY2soInYiLCAgJGN4YWxzKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZXh0ZXJuc2hlZXQoJHNoZWV0bmFtZSkKKyMKKyMKKyMgV3JpdGVzIHRoZSBFeGNlbCBCSUZGIEVYVEVSTlNIRUVUIHJlY29yZC4gVGhlc2UgcmVmZXJlbmNlcyBhcmUgdXNlZCBieQorIyBmb3JtdWxhcy4gQSBmb3JtdWxhIHJlZmVyZW5jZXMgYSBzaGVldCBuYW1lIHZpYSBhbiBpbmRleC4gU2luY2Ugd2Ugc3RvcmUgYQorIyByZWZlcmVuY2UgdG8gYWxsIG9mIHRoZSBleHRlcm5hbCB3b3Jrc2hlZXRzIHRoZSBFWFRFUk5TSEVFVCBpbmRleCBpcyB0aGUgc2FtZQorIyBhcyB0aGUgd29ya3NoZWV0IGluZGV4LgorIworc3ViIF9zdG9yZV9leHRlcm5zaGVldCB7CisKKyAgICBteSAkc2VsZiAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgID0gMHgwMDE3OyAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHNoZWV0bmFtZSA9ICRfWzBdOyAgICAgICAgICAjIFdvcmtzaGVldCBuYW1lCisgICAgbXkgJGNjaDsgICAgICAgICAgICAgICAgICAgICAgICAjIExlbmd0aCBvZiBzaGVldCBuYW1lCisgICAgbXkgJHJnY2g7ICAgICAgICAgICAgICAgICAgICAgICAjIEZpbGVuYW1lIGVuY29kaW5nCisKKyAgICAjIFJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgc2hlZXQgYXJlIGVuY29kZWQgZGlmZmVyZW50bHkgdG8gcmVmZXJlbmNlcyB0bworICAgICMgZXh0ZXJuYWwgc2hlZXRzLgorICAgICMKKyAgICBpZiAoJHNlbGYtPntfbmFtZX0gZXEgJHNoZWV0bmFtZSkgeworICAgICAgICAkc2hlZXRuYW1lID0gJyc7CisgICAgICAgICRsZW5ndGggICAgPSAweDAyOyAgIyBUaGUgZm9sbG93aW5nIDIgYnl0ZXMKKyAgICAgICAgJGNjaCAgICAgICA9IDE7ICAgICAjIFRoZSBmb2xsb3dpbmcgYnl0ZQorICAgICAgICAkcmdjaCAgICAgID0gMHgwMjsgICMgU2VsZiByZWZlcmVuY2UKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRsZW5ndGggICAgPSAweDAyICsgbGVuZ3RoKCRfWzBdKTsKKyAgICAgICAgJGNjaCAgICAgICA9IGxlbmd0aCgkc2hlZXRuYW1lKTsKKyAgICAgICAgJHJnY2ggICAgICA9IDB4MDM7ICAjIFJlZmVyZW5jZSB0byBhIHNoZWV0IGluIHRoZSBjdXJyZW50IHdvcmtib29rCisgICAgfQorCisgICAgbXkgJGhlYWRlciAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICA9IHBhY2soIkNDIiwgJGNjaCwgJHJnY2gpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc2hlZXRuYW1lKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wYW5lcygpCisjCisjCisjIFdyaXRlcyB0aGUgRXhjZWwgQklGRiBQQU5FIHJlY29yZC4KKyMgVGhlIHBhbmVzIGNhbiBlaXRoZXIgYmUgZnJvemVuIG9yIHRoYXdlZCAodW5mcm96ZW4pLgorIyBGcm96ZW4gcGFuZXMgYXJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBhIGludGVnZXIgbnVtYmVyIG9mIHJvd3MgYW5kIGNvbHVtbnMuCisjIFRoYXdlZCBwYW5lcyBhcmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIEV4Y2VsJ3MgdW5pdHMgZm9yIHJvd3MgYW5kIGNvbHVtbnMuCisjCitzdWIgX3N0b3JlX3BhbmVzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA0MTsgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkeSAgICAgICAgICAgPSAkX1swXSB8fCAwOyAgICMgVmVydGljYWwgc3BsaXQgcG9zaXRpb24KKyAgICBteSAkeCAgICAgICAgICAgPSAkX1sxXSB8fCAwOyAgICMgSG9yaXpvbnRhbCBzcGxpdCBwb3NpdGlvbgorICAgIG15ICRyd1RvcCAgICAgICA9ICRfWzJdOyAgICAgICAgIyBUb3Agcm93IHZpc2libGUKKyAgICBteSAkY29sTGVmdCAgICAgPSAkX1szXTsgICAgICAgICMgTGVmdG1vc3QgY29sdW1uIHZpc2libGUKKyAgICBteSAkbm9fc3BsaXQgICAgPSAkX1s0XTsgICAgICAgICMgTm8gdXNlZCBoZXJlLgorICAgIG15ICRwbm5BY3QgICAgICA9ICRfWzVdOyAgICAgICAgIyBBY3RpdmUgcGFuZQorCisKKyAgICAjIENvZGUgc3BlY2lmaWMgdG8gZnJvemVuIG9yIHRoYXdlZCBwYW5lcy4KKyAgICBpZiAoJHNlbGYtPntfZnJvemVufSkgeworICAgICAgICAjIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgJHJ3VG9wIGFuZCAkY29sTGVmdAorICAgICAgICAkcndUb3AgICA9ICR5IHVubGVzcyBkZWZpbmVkICRyd1RvcDsKKyAgICAgICAgJGNvbExlZnQgPSAkeCB1bmxlc3MgZGVmaW5lZCAkY29sTGVmdDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICMgU2V0IGRlZmF1bHQgdmFsdWVzIGZvciAkcndUb3AgYW5kICRjb2xMZWZ0CisgICAgICAgICRyd1RvcCAgID0gMCAgdW5sZXNzIGRlZmluZWQgJHJ3VG9wOworICAgICAgICAkY29sTGVmdCA9IDAgIHVubGVzcyBkZWZpbmVkICRjb2xMZWZ0OworCisgICAgICAgICMgQ29udmVydCBFeGNlbCdzIHJvdyBhbmQgY29sdW1uIHVuaXRzIHRvIHRoZSBpbnRlcm5hbCB1bml0cy4KKyAgICAgICAgIyBUaGUgZGVmYXVsdCByb3cgaGVpZ2h0IGlzIDEyLjc1CisgICAgICAgICMgVGhlIGRlZmF1bHQgY29sdW1uIHdpZHRoIGlzIDguNDMKKyAgICAgICAgIyBUaGUgZm9sbG93aW5nIHNsb3BlIGFuZCBpbnRlcnNlY3Rpb24gdmFsdWVzIHdlcmUgaW50ZXJwb2xhdGVkLgorICAgICAgICAjCisgICAgICAgICR5ID0gMjAqJHkgICAgICArIDI1NTsKKyAgICAgICAgJHggPSAxMTMuODc5KiR4ICsgMzkwOworICAgIH0KKworCisgICAgIyBEZXRlcm1pbmUgd2hpY2ggcGFuZSBzaG91bGQgYmUgYWN0aXZlLiBUaGVyZSBpcyBhbHNvIHRoZSB1bmRvY3VtZW50ZWQKKyAgICAjIG9wdGlvbiB0byBvdmVycmlkZSB0aGlzIHNob3VsZCBpdCBiZSBuZWNlc3Nhcnk6IG1heSBiZSByZW1vdmVkIGxhdGVyLgorICAgICMKKyAgICBpZiAobm90IGRlZmluZWQgJHBubkFjdCkgeworICAgICAgICAkcG5uQWN0ID0gMCBpZiAoJHggIT0gMCAmJiAkeSAhPSAwKTsgIyBCb3R0b20gcmlnaHQKKyAgICAgICAgJHBubkFjdCA9IDEgaWYgKCR4ICE9IDAgJiYgJHkgPT0gMCk7ICMgVG9wIHJpZ2h0CisgICAgICAgICRwbm5BY3QgPSAyIGlmICgkeCA9PSAwICYmICR5ICE9IDApOyAjIEJvdHRvbSBsZWZ0CisgICAgICAgICRwbm5BY3QgPSAzIGlmICgkeCA9PSAwICYmICR5ID09IDApOyAjIFRvcCBsZWZ0CisgICAgfQorCisgICAgJHNlbGYtPntfYWN0aXZlX3BhbmV9ID0gJHBubkFjdDsgIyBVc2VkIGluIF9zdG9yZV9zZWxlY3Rpb24KKworICAgIG15ICRoZWFkZXIgICAgID0gcGFjaygidnYiLCAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICA9IHBhY2soInZ2dnZ2IiwgJHgsICR5LCAkcndUb3AsICRjb2xMZWZ0LCAkcG5uQWN0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9zZXR1cCgpCisjCisjIFN0b3JlIHRoZSBwYWdlIHNldHVwIFNFVFVQIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9zZXR1cCB7CisKKyAgICB1c2UgaW50ZWdlcjsgICAgIyBBdm9pZCA8PCBzaGlmdCBidWcgaW4gUGVybCA1LjYuMCBvbiBIUC1VWAorCisgICAgbXkgJHNlbGYgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyZWNvcmQgICAgICAgPSAweDAwQTE7ICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgPSAweDAwMjI7ICAgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2YgYnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRpUGFwZXJTaXplICAgPSAkc2VsZi0+e19wYXBlcl9zaXplfTsgICAgIyBQYXBlciBzaXplCisgICAgbXkgJGlTY2FsZSAgICAgICA9ICRzZWxmLT57X3ByaW50X3NjYWxlfTsgICAjIFByaW50IHNjYWxpbmcgZmFjdG9yCisgICAgbXkgJGlQYWdlU3RhcnQgICA9ICRzZWxmLT57X3BhZ2Vfc3RhcnR9OyAgICAjIFN0YXJ0aW5nIHBhZ2UgbnVtYmVyCisgICAgbXkgJGlGaXRXaWR0aCAgICA9ICRzZWxmLT57X2ZpdF93aWR0aH07ICAgICAjIEZpdCB0byBudW1iZXIgb2YgcGFnZXMgd2lkZQorICAgIG15ICRpRml0SGVpZ2h0ICAgPSAkc2VsZi0+e19maXRfaGVpZ2h0fTsgICAgIyBGaXQgdG8gbnVtYmVyIG9mIHBhZ2VzIGhpZ2gKKyAgICBteSAkZ3JiaXQgICAgICAgID0gMHgwMDsgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uIGZsYWdzCisgICAgbXkgJGlSZXMgICAgICAgICA9IDB4MDI1ODsgICAgICAgICAgICAgICAgICAjIFByaW50IHJlc29sdXRpb24KKyAgICBteSAkaVZSZXMgICAgICAgID0gMHgwMjU4OyAgICAgICAgICAgICAgICAgICMgVmVydGljYWwgcHJpbnQgcmVzb2x1dGlvbgorICAgIG15ICRudW1IZHIgICAgICAgPSAkc2VsZi0+e19tYXJnaW5faGVhZGVyfTsgIyBIZWFkZXIgTWFyZ2luCisgICAgbXkgJG51bUZ0ciAgICAgICA9ICRzZWxmLT57X21hcmdpbl9mb290ZXJ9OyAjIEZvb3RlciBNYXJnaW4KKyAgICBteSAkaUNvcGllcyAgICAgID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICMgTnVtYmVyIG9mIGNvcGllcworCisKKyAgICBteSAkZkxlZnRUb1JpZ2h0ID0gJHNlbGYtPntfcGFnZV9vcmRlcn07ICAgICMgUHJpbnQgb3ZlciB0aGVuIGRvd24KKyAgICBteSAkZkxhbmRzY2FwZSAgID0gJHNlbGYtPntfb3JpZW50YXRpb259OyAgICMgUGFnZSBvcmllbnRhdGlvbgorICAgIG15ICRmTm9QbHMgICAgICAgPSAweDA7ICAgICAgICAgICAgICAgICAgICAgIyBTZXR1cCBub3QgcmVhZCBmcm9tIHByaW50ZXIKKyAgICBteSAkZk5vQ29sb3IgICAgID0gJHNlbGYtPntfYmxhY2tfd2hpdGV9OyAgICMgUHJpbnQgYmxhY2sgYW5kIHdoaXRlCisgICAgbXkgJGZEcmFmdCAgICAgICA9ICRzZWxmLT57X2RyYWZ0X3F1YWxpdHl9OyAjIFByaW50IGRyYWZ0IHF1YWxpdHkKKyAgICBteSAkZk5vdGVzICAgICAgID0gJHNlbGYtPntfcHJpbnRfY29tbWVudHN9OyMgUHJpbnQgbm90ZXMKKyAgICBteSAkZk5vT3JpZW50ICAgID0gMHgwOyAgICAgICAgICAgICAgICAgICAgICMgT3JpZW50YXRpb24gbm90IHNldAorICAgIG15ICRmVXNlUGFnZSAgICAgPSAkc2VsZi0+e19jdXN0b21fc3RhcnR9OyAgIyBVc2UgY3VzdG9tIHN0YXJ0aW5nIHBhZ2UKKworCisgICAgJGdyYml0ICAgICAgICAgICA9ICRmTGVmdFRvUmlnaHQ7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTGFuZHNjYXBlICAgIDw8IDE7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9QbHMgICAgICAgIDw8IDI7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9Db2xvciAgICAgIDw8IDM7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmRHJhZnQgICAgICAgIDw8IDQ7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm90ZXMgICAgICAgIDw8IDU7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmTm9PcmllbnQgICAgIDw8IDY7CisgICAgJGdyYml0ICAgICAgICAgIHw9ICRmVXNlUGFnZSAgICAgIDw8IDc7CisKKworICAgICRudW1IZHIgPSBwYWNrKCJkIiwgJG51bUhkcik7CisgICAgJG51bUZ0ciA9IHBhY2soImQiLCAkbnVtRnRyKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeworICAgICAgICAkbnVtSGRyID0gcmV2ZXJzZSAkbnVtSGRyOworICAgICAgICAkbnVtRnRyID0gcmV2ZXJzZSAkbnVtRnRyOworICAgIH0KKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2diIsICAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGExICA9IHBhY2soInZ2dnZ2dnZ2IiwgICAkaVBhcGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaVBhZ2VTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpRml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaUZpdEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRncmJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGlWUmVzKTsKKyAgICBteSAkZGF0YTIgID0gJG51bUhkciAuJG51bUZ0cjsKKyAgICBteSAkZGF0YTMgID0gcGFjaygidiIsICRpQ29waWVzKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YTEsICRkYXRhMiwgJGRhdGEzKTsKKworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oZWFkZXIoKQorIworIyBTdG9yZSB0aGUgaGVhZGVyIGNhcHRpb24gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2hlYWRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxNDsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0ciAgICAgICAgID0gJHNlbGYtPntfaGVhZGVyfTsgICAgICAgICAgICAgIyBoZWFkZXIgc3RyaW5nCisgICAgbXkgJGNjaCAgICAgICAgID0gbGVuZ3RoKCRzdHIpOyAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgaGVhZGVyIHN0cmluZworICAgIG15ICRlbmNvZGluZyAgICA9ICRzZWxmLT57X2hlYWRlcl9lbmNvZGluZ307ICAgICMgQ2hhcmFjdGVyIGVuY29kaW5nCisKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggICAgICAgICAgIC89IDIgaWYgJGVuY29kaW5nOworCisgICAgIyBDaGFuZ2UgdGhlIFVURi0xNiBuYW1lIGZyb20gQkUgdG8gTEUKKyAgICAkc3RyICAgICAgICAgICAgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc3RyIGlmICRlbmNvZGluZzsKKworICAgICRsZW5ndGggICAgICAgICA9IDMgKyBsZW5ndGgoJHN0cik7CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2QyIsICAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc3RyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9mb290ZXIoKQorIworIyBTdG9yZSB0aGUgZm9vdGVyIGNhcHRpb24gQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2Zvb3RlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxNTsgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0ciAgICAgICAgID0gJHNlbGYtPntfZm9vdGVyfTsgICAgICAgICAgICAgIyBmb290ZXIgc3RyaW5nCisgICAgbXkgJGNjaCAgICAgICAgID0gbGVuZ3RoKCRzdHIpOyAgICAgICAgICAgICAgICAgIyBMZW5ndGggb2YgZm9vdGVyIHN0cmluZworICAgIG15ICRlbmNvZGluZyAgICA9ICRzZWxmLT57X2Zvb3Rlcl9lbmNvZGluZ307ICAgICMgQ2hhcmFjdGVyIGVuY29kaW5nCisKKworICAgICMgQ2hhcmFjdGVyIGxlbmd0aCBpcyBudW0gb2YgY2hhcnMgbm90IG51bSBvZiBieXRlcworICAgICRjY2ggICAgICAgICAgIC89IDIgaWYgJGVuY29kaW5nOworCisgICAgIyBDaGFuZ2UgdGhlIFVURi0xNiBuYW1lIGZyb20gQkUgdG8gTEUKKyAgICAkc3RyICAgICAgICAgICAgPSBwYWNrICduKicsIHVucGFjayAndionLCAkc3RyIGlmICRlbmNvZGluZzsKKworICAgICRsZW5ndGggICAgICAgICA9IDMgKyBsZW5ndGgoJHN0cik7CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2QyIsICAkY2NoLCAkZW5jb2RpbmcpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhLCAkc3RyKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9oY2VudGVyKCkKKyMKKyMgU3RvcmUgdGhlIGhvcml6b250YWwgY2VudGVyaW5nIEhDRU5URVIgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX2hjZW50ZXIgeworCisgICAgbXkgJHNlbGYgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgPSAweDAwODM7ICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgID0gMHgwMDAyOyAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmSENlbnRlciA9ICRzZWxmLT57X2hjZW50ZXJ9OyAgICMgSG9yaXpvbnRhbCBjZW50ZXJpbmcKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygidiIsICAgJGZIQ2VudGVyKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmNlbnRlcigpCisjCisjIFN0b3JlIHRoZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgVkNFTlRFUiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdmNlbnRlciB7CisKKyAgICBteSAkc2VsZiAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICA9IDB4MDA4NDsgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgPSAweDAwMDI7ICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZWQ2VudGVyID0gJHNlbGYtPntfdmNlbnRlcn07ICAgIyBIb3Jpem9udGFsIGNlbnRlcmluZworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJ2IiwgICAkZlZDZW50ZXIpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJnaW5fbGVmdCgpCisjCisjIFN0b3JlIHRoZSBMRUZUTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fbGVmdCB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMjY7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwODsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRtYXJnaW4gID0gJHNlbGYtPntfbWFyZ2luX2xlZnR9OyAgICAjIE1hcmdpbiBpbiBpbmNoZXMKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJGRhdGEgPSByZXZlcnNlICRkYXRhIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbWFyZ2luX3JpZ2h0KCkKKyMKKyMgU3RvcmUgdGhlIFJJR0hUTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fcmlnaHQgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMDI3OyAgICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgPSAweDAwMDg7ICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkbWFyZ2luICA9ICRzZWxmLT57X21hcmdpbl9yaWdodH07ICAgIyBNYXJnaW4gaW4gaW5jaGVzCisKKyAgICBteSAkaGVhZGVyICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICA9IHBhY2soImQiLCAgICRtYXJnaW4pOworCisgICAgaWYgKCRzZWxmLT57X2J5dGVfb3JkZXJ9KSB7ICRkYXRhID0gcmV2ZXJzZSAkZGF0YSB9CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21hcmdpbl90b3AoKQorIworIyBTdG9yZSB0aGUgVE9QTUFSR0lOIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9tYXJnaW5fdG9wIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICA9IDB4MDAyODsgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggID0gMHgwMDA4OyAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG1hcmdpbiAgPSAkc2VsZi0+e19tYXJnaW5fdG9wfTsgICAgICMgTWFyZ2luIGluIGluY2hlcworCisgICAgbXkgJGhlYWRlciAgICA9IHBhY2soInZ2IiwgICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgPSBwYWNrKCJkIiwgICAkbWFyZ2luKTsKKworICAgIGlmICgkc2VsZi0+e19ieXRlX29yZGVyfSkgeyAkZGF0YSA9IHJldmVyc2UgJGRhdGEgfQorCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tYXJnaW5fYm90dG9tKCkKKyMKKyMgU3RvcmUgdGhlIEJPVFRPTU1BUkdJTiBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfbWFyZ2luX2JvdHRvbSB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMjk7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwODsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRtYXJnaW4gID0gJHNlbGYtPntfbWFyZ2luX2JvdHRvbX07ICAjIE1hcmdpbiBpbiBpbmNoZXMKKworICAgIG15ICRoZWFkZXIgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgID0gcGFjaygiZCIsICAgJG1hcmdpbik7CisKKyAgICBpZiAoJHNlbGYtPntfYnl0ZV9vcmRlcn0pIHsgJGRhdGEgPSByZXZlcnNlICRkYXRhIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBtZXJnZV9jZWxscygkZmlyc3Rfcm93LCAkZmlyc3RfY29sLCAkbGFzdF9yb3csICRsYXN0X2NvbCkKKyMKKyMgVGhpcyBpcyBhbiBFeGNlbDk3LzIwMDAgbWV0aG9kLiBJdCBpcyByZXF1aXJlZCB0byBwZXJmb3JtIG1vcmUgY29tcGxpY2F0ZWQKKyMgbWVyZ2luZyB0aGFuIHRoZSBub3JtYWwgYWxpZ24gbWVyZ2UgaW4gRm9ybWF0LnBtCisjCitzdWIgbWVyZ2VfY2VsbHMgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHJlY29yZCAgPSAweDAwRTU7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRjcmVmICAgICA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiByZWZzCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICMgRmlyc3Qgcm93IGluIHJlZmVyZW5jZQorICAgIG15ICRjb2xGaXJzdCA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAjIEZpcnN0IGNvbCBpbiByZWZlcmVuY2UKKyAgICBteSAkcndMYXN0ICAgPSAkX1syXSB8fCAkcndGaXJzdDsgICAgICAgIyBMYXN0ICByb3cgaW4gcmVmZXJlbmNlCisgICAgbXkgJGNvbExhc3QgID0gJF9bM10gfHwgJGNvbEZpcnN0OyAgICAgICMgTGFzdCAgY29sIGluIHJlZmVyZW5jZQorCisKKyAgICAjIEV4Y2VsIGRvZXNuJ3QgYWxsb3cgYSBzaW5nbGUgY2VsbCB0byBiZSBtZXJnZWQKKyAgICByZXR1cm4gaWYgJHJ3Rmlyc3QgPT0gJHJ3TGFzdCBhbmQgJGNvbEZpcnN0ID09ICRjb2xMYXN0OworCisgICAgIyBTd2FwIGxhc3Qgcm93L2NvbCB3aXRoIGZpcnN0IHJvdy9jb2wgYXMgbmVjZXNzYXJ5CisgICAgKCRyd0ZpcnN0LCAgJHJ3TGFzdCApID0gKCRyd0xhc3QsICAkcndGaXJzdCApIGlmICRyd0ZpcnN0ICA+ICRyd0xhc3Q7CisgICAgKCRjb2xGaXJzdCwgJGNvbExhc3QpID0gKCRjb2xMYXN0LCAkY29sRmlyc3QpIGlmICRjb2xGaXJzdCA+ICRjb2xMYXN0OworCisgICAgbXkgJGhlYWRlciAgID0gcGFjaygidnYiLCAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgPSBwYWNrKCJ2dnZ2diIsICAgICRjcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJ3Rmlyc3QsICRyd0xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sRmlyc3QsICRjb2xMYXN0KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIG1lcmdlX3JhbmdlKCRyb3cxLCAkY29sMSwgJHJvdzIsICRjb2wyLCAkc3RyaW5nLCAkZm9ybWF0LCAkZW5jb2RpbmcpCisjCisjIFRoaXMgaXMgYSB3cmFwcGVyIHRvIGVuc3VyZSBjb3JyZWN0IHVzZSBvZiB0aGUgbWVyZ2VfY2VsbHMgbWV0aG9kLCBpLmUuLCB3cml0ZQorIyB0aGUgZmlyc3QgY2VsbCBvZiB0aGUgcmFuZ2UsIHdyaXRlIHRoZSBmb3JtYXR0ZWQgYmxhbmsgY2VsbHMgaW4gdGhlIHJhbmdlIGFuZAorIyB0aGVuIGNhbGwgdGhlIG1lcmdlX2NlbGxzIHJlY29yZC4gRmFpbGluZyB0byBkbyB0aGUgc3RlcHMgaW4gdGhpcyBvcmRlciB3aWxsCisjIGNhdXNlIEV4Y2VsIDk3IHRvIGNyYXNoLgorIworc3ViIG1lcmdlX3JhbmdlIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKyAgICBjcm9hayAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiIGlmIEBfICE9IDYgYW5kIEBfICE9IDc7CisgICAgY3JvYWsgIkZvcm1hdCBhcmd1bWVudCBpcyBub3QgYSBmb3JtYXQgb2JqZWN0IiB1bmxlc3MgcmVmICRfWzVdOworCisgICAgbXkgJHJ3Rmlyc3QgID0gJF9bMF07CisgICAgbXkgJGNvbEZpcnN0ID0gJF9bMV07CisgICAgbXkgJHJ3TGFzdCAgID0gJF9bMl07CisgICAgbXkgJGNvbExhc3QgID0gJF9bM107CisgICAgbXkgJHN0cmluZyAgID0gJF9bNF07CisgICAgbXkgJGZvcm1hdCAgID0gJF9bNV07CisgICAgbXkgJGVuY29kaW5nID0gJF9bNl0gPyAxIDogMDsKKworCisgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgIG15ICRlcnJvciA9ICJFcnJvcjogcmVmZXIgdG8gbWVyZ2VfcmFuZ2UoKSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIiAuCisgICAgICAgICAgICAgICAgIkNhbid0IHVzZSBwcmV2aW91c2x5IG5vbi1tZXJnZWQgZm9ybWF0IGluIG1lcmdlZCBjZWxscyI7CisKKyAgICBjcm9hayAkZXJyb3IgaWYgJGZvcm1hdC0+e191c2VkX21lcmdlfSA9PSAtMTsKKyAgICAkZm9ybWF0LT57X3VzZWRfbWVyZ2V9ID0gMDsgIyBVbnRpbCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uCisKKworICAgICMgU2V0IHRoZSBtZXJnZV9yYW5nZSBwcm9wZXJ0eSBvZiB0aGUgZm9ybWF0IG9iamVjdC4gRm9yIEJJRkY4Ky4KKyAgICAkZm9ybWF0LT5zZXRfbWVyZ2VfcmFuZ2UoKTsKKworICAgICMgRXhjZWwgZG9lc24ndCBhbGxvdyBhIHNpbmdsZSBjZWxsIHRvIGJlIG1lcmdlZAorICAgIGNyb2FrICJDYW4ndCBtZXJnZSBzaW5nbGUgY2VsbCIgaWYgJHJ3Rmlyc3QgID09ICRyd0xhc3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sRmlyc3QgPT0gJGNvbExhc3Q7CisKKyAgICAjIFN3YXAgbGFzdCByb3cvY29sIHdpdGggZmlyc3Qgcm93L2NvbCBhcyBuZWNlc3NhcnkKKyAgICAoJHJ3Rmlyc3QsICAkcndMYXN0ICkgPSAoJHJ3TGFzdCwgICRyd0ZpcnN0ICkgaWYgJHJ3Rmlyc3QgID4gJHJ3TGFzdDsKKyAgICAoJGNvbEZpcnN0LCAkY29sTGFzdCkgPSAoJGNvbExhc3QsICRjb2xGaXJzdCkgaWYgJGNvbEZpcnN0ID4gJGNvbExhc3Q7CisKKyAgICAjIFdyaXRlIHRoZSBmaXJzdCBjZWxsCisgICAgaWYgKCRlbmNvZGluZykgeworICAgICAgICAkc2VsZi0+d3JpdGVfdXRmMTZiZV9zdHJpbmcoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHN0cmluZywgJGZvcm1hdCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc2VsZi0+d3JpdGUgICAgICAgICAgICAgICAoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHN0cmluZywgJGZvcm1hdCk7CisgICAgfQorCisgICAgIyBQYWQgb3V0IHRoZSByZXN0IG9mIHRoZSBhcmVhIHdpdGggZm9ybWF0dGVkIGJsYW5rIGNlbGxzLgorICAgIGZvciBteSAkcm93ICgkcndGaXJzdCAuLiAkcndMYXN0KSB7CisgICAgICAgIGZvciBteSAkY29sICgkY29sRmlyc3QgLi4gJGNvbExhc3QpIHsKKyAgICAgICAgICAgIG5leHQgaWYgJHJvdyA9PSAkcndGaXJzdCBhbmQgJGNvbCA9PSAkY29sRmlyc3Q7CisgICAgICAgICAgICAkc2VsZi0+d3JpdGVfYmxhbmsoJHJvdywgJGNvbCwgJGZvcm1hdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAkc2VsZi0+bWVyZ2VfY2VsbHMoJHJ3Rmlyc3QsICRjb2xGaXJzdCwgJHJ3TGFzdCwgJGNvbExhc3QpOworCisgICAgIyBUZW1wIGNvZGUgdG8gcHJldmVudCBtZXJnZWQgZm9ybWF0cyBpbiBub24tbWVyZ2VkIGNlbGxzLgorICAgICRmb3JtYXQtPntfdXNlZF9tZXJnZX0gPSAxOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcHJpbnRfaGVhZGVycygpCisjCisjIFdyaXRlIHRoZSBQUklOVEhFQURFUlMgQklGRiByZWNvcmQuCisjCitzdWIgX3N0b3JlX3ByaW50X2hlYWRlcnMgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwMmE7ICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZlByaW50UndDb2wgPSAkc2VsZi0+e19wcmludF9oZWFkZXJzfTsgICMgQm9vbGVhbiBmbGFnCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZlByaW50UndDb2wpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9wcmludF9ncmlkbGluZXMoKQorIworIyBXcml0ZSB0aGUgUFJJTlRHUklETElORVMgQklGRiByZWNvcmQuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorIyBHUklEU0VUIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcHJpbnRfZ3JpZGxpbmVzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDJiOyAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZlByaW50R3JpZCAgPSAkc2VsZi0+e19wcmludF9ncmlkbGluZXN9OyAjIEJvb2xlYW4gZmxhZworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAgJGZQcmludEdyaWQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9ncmlkc2V0KCkKKyMKKyMgV3JpdGUgdGhlIEdSSURTRVQgQklGRiByZWNvcmQuIE11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQorIyBQUklOVEdSSURMSU5FUyByZWNvcmQuCisjCitzdWIgX3N0b3JlX2dyaWRzZXQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwODI7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwMjsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZHcmlkU2V0ICAgID0gbm90ICRzZWxmLT57X3ByaW50X2dyaWRsaW5lc307ICMgQm9vbGVhbiBmbGFnCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2IiwgICAkZkdyaWRTZXQpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2d1dHMoKQorIworIyBXcml0ZSB0aGUgR1VUUyBCSUZGIHJlY29yZC4gVGhpcyBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZ3V0dGVyIG1hcmdpbnMKKyMgd2hlcmUgRXhjZWwgb3V0bGluZSBzeW1ib2xzIGFyZSBkaXNwbGF5ZWQuIFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBndXR0ZXJzIGlzCisjIGNvbnRyb2xsZWQgYnkgYSBmbGFnIGluIFdTQk9PTC4gU2VlIGFsc28gX3N0b3JlX3dzYm9vbCgpLgorIworIyBXZSBhcmUgYWxsIGluIHRoZSBndXR0ZXIgYnV0IHNvbWUgb2YgdXMgYXJlIGxvb2tpbmcgYXQgdGhlIHN0YXJzLgorIworc3ViIF9zdG9yZV9ndXRzIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDgwOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDg7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRkeFJ3R3V0ICAgICA9IDB4MDAwMDsgICAjIFNpemUgb2Ygcm93IGd1dHRlcgorICAgIG15ICRkeENvbEd1dCAgICA9IDB4MDAwMDsgICAjIFNpemUgb2YgY29sIGd1dHRlcgorCisgICAgbXkgJHJvd19sZXZlbCAgID0gJHNlbGYtPntfb3V0bGluZV9yb3dfbGV2ZWx9OworICAgIG15ICRjb2xfbGV2ZWwgICA9IDA7CisKKworICAgICMgQ2FsY3VsYXRlIHRoZSBtYXhpbXVtIGNvbHVtbiBvdXRsaW5lIGxldmVsLiBUaGUgZXF1aXZhbGVudCBjYWxjdWxhdGlvbgorICAgICMgZm9yIHRoZSByb3cgb3V0bGluZSBsZXZlbCBpcyBjYXJyaWVkIG91dCBpbiBzZXRfcm93KCkuCisgICAgIworICAgIGZvcmVhY2ggbXkgJGNvbGluZm8gKEB7JHNlbGYtPntfY29saW5mb319KSB7CisgICAgICAgICMgU2tpcCBjb2xzIHdpdGhvdXQgb3V0bGluZSBsZXZlbCBpbmZvLgorICAgICAgICBuZXh0IGlmIEB7JGNvbGluZm99IDwgNjsKKyAgICAgICAgJGNvbF9sZXZlbCA9IEB7JGNvbGluZm99WzVdIGlmIEB7JGNvbGluZm99WzVdID4gJGNvbF9sZXZlbDsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBsaW1pdHMgZm9yIHRoZSBvdXRsaW5lIGxldmVscyAoMCA8PSB4IDw9IDcpLgorICAgICRjb2xfbGV2ZWwgPSAwIGlmICRjb2xfbGV2ZWwgPCAwOworICAgICRjb2xfbGV2ZWwgPSA3IGlmICRjb2xfbGV2ZWwgPiA3OworCisKKyAgICAjIFRoZSBkaXNwbGF5ZWQgbGV2ZWwgaXMgb25lIGdyZWF0ZXIgdGhhbiB0aGUgbWF4IG91dGxpbmUgbGV2ZWxzCisgICAgJHJvd19sZXZlbCsrIGlmICRyb3dfbGV2ZWwgPiAwOworICAgICRjb2xfbGV2ZWwrKyBpZiAkY29sX2xldmVsID4gMDsKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICAgICAgPSBwYWNrKCJ2dnZ2IiwgJGR4UndHdXQsICRkeENvbEd1dCwgJHJvd19sZXZlbCwgJGNvbF9sZXZlbCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfd3Nib29sKCkKKyMKKyMgV3JpdGUgdGhlIFdTQk9PTCBCSUZGIHJlY29yZCwgbWFpbmx5IGZvciBmaXQtdG8tcGFnZS4gVXNlZCBpbiBjb25qdW5jdGlvbgorIyB3aXRoIHRoZSBTRVRVUCByZWNvcmQuCisjCitzdWIgX3N0b3JlX3dzYm9vbCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA4MTsgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZ3JiaXQgICAgICAgPSAweDAwMDA7ICAgIyBPcHRpb24gZmxhZ3MKKworICAgICMgU2V0IHRoZSBvcHRpb24gZmxhZ3MKKyAgICAkZ3JiaXQgfD0gMHgwMDAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEF1dG8gcGFnZSBicmVha3MgdmlzaWJsZQorICAgICRncmJpdCB8PSAweDAwMjAgaWYgJHNlbGYtPntfb3V0bGluZV9zdHlsZX07ICMgQXV0byBvdXRsaW5lIHN0eWxlcworICAgICRncmJpdCB8PSAweDAwNDAgaWYgJHNlbGYtPntfb3V0bGluZV9iZWxvd307ICMgT3V0bGluZSBzdW1tYXJ5IGJlbG93CisgICAgJGdyYml0IHw9IDB4MDA4MCBpZiAkc2VsZi0+e19vdXRsaW5lX3JpZ2h0fTsgIyBPdXRsaW5lIHN1bW1hcnkgcmlnaHQKKyAgICAkZ3JiaXQgfD0gMHgwMTAwIGlmICRzZWxmLT57X2ZpdF9wYWdlfTsgICAgICAjIFBhZ2Ugc2V0dXAgZml0IHRvIHBhZ2UKKyAgICAkZ3JiaXQgfD0gMHgwNDAwIGlmICRzZWxmLT57X291dGxpbmVfb259OyAgICAjIE91dGxpbmUgc3ltYm9scyBkaXNwbGF5ZWQKKworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAgJGdyYml0KTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfaGJyZWFrKCkKKyMKKyMgV3JpdGUgdGhlIEhPUklaT05UQUxQQUdFQlJFQUtTIEJJRkYgcmVjb3JkLgorIworc3ViIF9zdG9yZV9oYnJlYWsgeworCisgICAgbXkgJHNlbGYgICAgPSBzaGlmdDsKKworICAgICMgUmV0dXJuIGlmIHRoZSB1c2VyIGhhc24ndCBzcGVjaWZpZWQgcGFnZWJyZWFrcworICAgIHJldHVybiB1bmxlc3MgQHskc2VsZi0+e19oYnJlYWtzfX07CisKKyAgICAjIFNvcnQgYW5kIGZpbHRlciBhcnJheSBvZiBwYWdlIGJyZWFrcworICAgIG15IEBicmVha3MgID0gJHNlbGYtPl9zb3J0X3BhZ2VicmVha3MoQHskc2VsZi0+e19oYnJlYWtzfX0pOworCisgICAgbXkgJHJlY29yZCAgPSAweDAwMWI7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRjYnJrICAgID0gc2NhbGFyIEBicmVha3M7ICAgICAgICMgTnVtYmVyIG9mIHBhZ2UgYnJlYWtzCisgICAgbXkgJGxlbmd0aCAgPSAyICsgNiokY2JyazsgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgICA9IHBhY2soInYiLCAgICRjYnJrKTsKKworICAgICMgQXBwZW5kIGVhY2ggcGFnZSBicmVhaworICAgIGZvcmVhY2ggbXkgJGJyZWFrIChAYnJlYWtzKSB7CisgICAgICAgICRkYXRhIC49IHBhY2soInZ2diIsICRicmVhaywgMHgwMDAwLCAweDAwZmYpOworICAgIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmJyZWFrKCkKKyMKKyMgV3JpdGUgdGhlIFZFUlRJQ0FMUEFHRUJSRUFLUyBCSUZGIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfdmJyZWFrIHsKKworICAgIG15ICRzZWxmICAgID0gc2hpZnQ7CisKKyAgICAjIFJldHVybiBpZiB0aGUgdXNlciBoYXNuJ3Qgc3BlY2lmaWVkIHBhZ2VicmVha3MKKyAgICByZXR1cm4gdW5sZXNzIEB7JHNlbGYtPntfdmJyZWFrc319OworCisgICAgIyBTb3J0IGFuZCBmaWx0ZXIgYXJyYXkgb2YgcGFnZSBicmVha3MKKyAgICBteSBAYnJlYWtzICA9ICRzZWxmLT5fc29ydF9wYWdlYnJlYWtzKEB7JHNlbGYtPntfdmJyZWFrc319KTsKKworICAgIG15ICRyZWNvcmQgID0gMHgwMDFhOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkY2JyayAgICA9IHNjYWxhciBAYnJlYWtzOyAgICAgICAjIE51bWJlciBvZiBwYWdlIGJyZWFrcworICAgIG15ICRsZW5ndGggID0gMiArIDYqJGNicms7ICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2IiwgICAkY2Jyayk7CisKKyAgICAjIEFwcGVuZCBlYWNoIHBhZ2UgYnJlYWsKKyAgICBmb3JlYWNoIG15ICRicmVhayAoQGJyZWFrcykgeworICAgICAgICAkZGF0YSAuPSBwYWNrKCJ2dnYiLCAkYnJlYWssIDB4MDAwMCwgMHhmZmZmKTsKKyAgICB9CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3Byb3RlY3QoKQorIworIyBTZXQgdGhlIEJpZmYgUFJPVEVDVCByZWNvcmQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgd29ya3NoZWV0IGlzIHByb3RlY3RlZC4KKyMKK3N1YiBfc3RvcmVfcHJvdGVjdCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgRXhpdCB1bmxlc3Mgc2hlZXQgcHJvdGVjdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3Byb3RlY3R9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDEyOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDI7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRmTG9jayAgICAgICA9ICRzZWxmLT57X3Byb3RlY3R9OyAgICAjIFdvcmtzaGVldCBpcyBwcm90ZWN0ZWQKKworICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjaygidiIsICAkZkxvY2spOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9vYmpfcHJvdGVjdCgpCisjCisjIFNldCB0aGUgQmlmZiBPQkpQUk9URUNUIHJlY29yZCB0byBpbmRpY2F0ZSB0aGF0IG9iamVjdHMgYXJlIHByb3RlY3RlZC4KKyMKK3N1YiBfc3RvcmVfb2JqX3Byb3RlY3QgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIEV4aXQgdW5sZXNzIHNoZWV0IHByb3RlY3Rpb24gaGFzIGJlZW4gc3BlY2lmaWVkCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19wcm90ZWN0fTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDA2MzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkZkxvY2sgICAgICAgPSAkc2VsZi0+e19wcm90ZWN0fTsgICAgIyBXb3Jrc2hlZXQgaXMgcHJvdGVjdGVkCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgJGZMb2NrKTsKKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfcGFzc3dvcmQoKQorIworIyBXcml0ZSB0aGUgd29ya3NoZWV0IFBBU1NXT1JEIHJlY29yZC4KKyMKK3N1YiBfc3RvcmVfcGFzc3dvcmQgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIEV4aXQgdW5sZXNzIHNoZWV0IHByb3RlY3Rpb24gYW5kIHBhc3N3b3JkIGhhdmUgYmVlbiBzcGVjaWZpZWQKKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X3Byb3RlY3R9IGFuZCBkZWZpbmVkICRzZWxmLT57X3Bhc3N3b3JkfTsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxMzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDAyOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkd1Bhc3N3b3JkICAgPSAkc2VsZi0+e19wYXNzd29yZH07ICAgIyBFbmNvZGVkIHBhc3N3b3JkCisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInYiLCAgJHdQYXNzd29yZCk7CisKKyAgICAkc2VsZi0+X3ByZXBlbmQoJGhlYWRlciwgJGRhdGEpOworfQorCisKKyMKKyMgTm90ZSBhYm91dCBjb21wYXRpYmlsaXR5IG1vZGUuCisjCisjIEV4Y2VsIGRvZXNuJ3QgcmVxdWlyZSBldmVyeSBwb3NzaWJsZSBCaWZmIHJlY29yZCB0byBiZSBwcmVzZW50IGluIGEgZmlsZS4KKyMgSW4gcGFydGljdWxhciBpZiB0aGUgaW5kZXhpbmcgcmVjb3JkcyBJTkRFWCwgUk9XIGFuZCBEQkNFTEwgYXJlbid0IHByZXNlbnQKKyMgaXQganVzdCBpZ25vcmVzIHRoZSBmYWN0IGFuZCByZWFkcyB0aGUgY2VsbHMgYW55d2F5LiBUaGlzIGlzIGFsc28gdHJ1ZSBvZgorIyB0aGUgRVhUU1NUIHJlY29yZC4gR251bWVyaWMgYW5kIE9PbyBhbHNvIHRha2UgdGhpcyBhcHByb2FjaC4gVGhpcyBhbGxvd3MKKyMgV3JpdGVFeGNlbCB0byBpZ25vcmUgdGhlc2UgcmVjb3JkcyBpbiBvcmRlciB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGRhdGEKKyMgc3RvcmVkIGluIG1lbW9yeS4gSG93ZXZlciwgb3RoZXIgdGhpcmQgcGFydHkgYXBwbGljYXRpb25zIHRoYXQgcmVhZCBFeGNlbAorIyBmaWxlcyBvZnRlbiBleHBlY3QgdGhlc2UgcmVjb3JkcyB0byBiZSBwcmVzZW50LiBJbiAiY29tcGF0aWJpbGl0eSBtb2RlIgorIyBXcml0ZUV4Y2VsIHdyaXRlcyB0aGVzZSByZWNvcmRzIGFuZCB0cmllcyB0byBiZSBhcyBjbG9zZSB0byBhbiBFeGNlbAorIyBnZW5lcmF0ZWQgZmlsZSBhcyBwb3NzaWJsZS4KKyMKKyMgVGhpcyByZXF1aXJlcyBhZGRpdGlvbmFsIGRhdGEgdG8gYmUgc3RvcmVkIGluIG1lbW9yeSB1bnRpbCB0aGUgZmlsZSBpcworIyBhYm91dCB0byBiZSB3cml0dGVuLiBUaGlzIGluY3VycyBhIG1lbW9yeSBhbmQgc3BlZWQgcGVuYWx0eSBhbmQgbWF5IG5vdCBiZQorIyBzdWl0YWJsZSBmb3IgdmVyeSBsYXJnZSBmaWxlcy4KKyMKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3RhYmxlKCkKKyMKKyMgV3JpdGUgY2VsbCBkYXRhIHN0b3JlZCBpbiB0aGUgd29ya3NoZWV0IHJvdy9jb2wgdGFibGUuCisjCisjIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gY29tcGF0aWJpdHlfbW9kZSgpIGlzIGluIG9wZXJhdGlvbi4KKyMKKyMgVGhpcyBtZXRob2Qgd3JpdGVzIFJPVyBkYXRhLCB0aGVuIGNlbGwgZGF0YSAoTlVNQkVSLCBMQUJFTFNTVCwgZXRjKSBhbmQgdGhlbgorIyBEQkNFTEwgcmVjb3JkcyBpbiBibG9ja3Mgb2YgMzIgcm93cy4gVGhpcyBpcyBleHBsYWluZWQgaW4gZGV0YWlsIChmb3IgYQorIyBjaGFuZ2UpIGluIHRoZSBFeGNlbCBTREsgYW5kIGluIHRoZSBPT28gRXhjZWwgZmlsZSBmb3JtYXQgZG9jLgorIworc3ViIF9zdG9yZV90YWJsZSB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyAkc2VsZi0+e19jb21wYXRpYmlsaXR5fTsKKworICAgICMgT2Zmc2V0IGZyb20gdGhlIERCQ0VMTCByZWNvcmQgYmFjayB0byB0aGUgZmlyc3QgUk9XIG9mIHRoZSAzMiByb3cgYmxvY2suCisgICAgbXkgJHJvd19vZmZzZXQgPSAwOworCisgICAgIyBUcmFjayByb3dzIHRoYXQgaGF2ZSBjZWxsIGRhdGEgb3IgbW9kaWZpZWQgYnkgc2V0X3JvdygpLgorICAgIG15IEB3cml0dGVuX3Jvd3M7CisKKworICAgICMgV3JpdGUgdGhlIFJPVyByZWNvcmRzIHdpdGggdXBkYXRlZCBtYXgvbWluIGNvbCBmaWVsZHMuCisgICAgIworICAgIGZvciBteSAkcm93ICgwIC4uICRzZWxmLT57X2RpbV9yb3dtYXh9IC0xKSB7CisgICAgICAgICMgU2tpcCB1bmxlc3MgdGhlcmUgaXMgY2VsbCBkYXRhIGluIHJvdyBvciB0aGUgcm93IGhhcyBiZWVuIG1vZGlmaWVkLgorICAgICAgICBuZXh0IHVubGVzcyAkc2VsZi0+e190YWJsZX0tPlskcm93XSBvciAkc2VsZi0+e19yb3dfZGF0YX0tPnskcm93fTsKKworICAgICAgICAjIFN0b3JlIHRoZSByb3dzIHdpdGggZGF0YS4KKyAgICAgICAgcHVzaCBAd3JpdHRlbl9yb3dzLCAkcm93OworCisgICAgICAgICMgSW5jcmVhc2UgdGhlIHJvdyBvZmZzZXQgYnkgdGhlIGxlbmd0aCBvZiBhIFJPVyByZWNvcmQ7CisgICAgICAgICRyb3dfb2Zmc2V0ICs9IDIwOworCisgICAgICAgICMgVGhlIG1heC9taW4gY29scyBpbiB0aGUgUk9XIHJlY29yZHMgYXJlIHRoZSBzYW1lIGFzIGluIERJTUVOU0lPTlMuCisgICAgICAgIG15ICRjb2xfbWluID0gJHNlbGYtPntfZGltX2NvbG1pbn07CisgICAgICAgIG15ICRjb2xfbWF4ID0gJHNlbGYtPntfZGltX2NvbG1heH07CisKKyAgICAgICAgIyBXcml0ZSBhIHVzZXIgc3BlY2lmaWVkIFJPVyByZWNvcmQgKG1vZGlmaWVkIGJ5IHNldF9yb3coKSkuCisgICAgICAgIGlmICgkc2VsZi0+e19yb3dfZGF0YX0tPnskcm93fSkgeworICAgICAgICAgICAgIyBSZXdyaXRlIHRoZSBtaW4gYW5kIG1heCBjb2xzIGZvciB1c2VyIGRlZmluZWQgcm93IHJlY29yZC4KKyAgICAgICAgICAgIG15ICRwYWNrZWRfcm93ID0gJHNlbGYtPntfcm93X2RhdGF9LT57JHJvd307CisgICAgICAgICAgICBzdWJzdHIgJHBhY2tlZF9yb3csIDYsIDQsIHBhY2soJ3Z2JywgJGNvbF9taW4sICRjb2xfbWF4KTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRwYWNrZWRfcm93KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgV3JpdGUgYSBkZWZhdWx0IFJvdyByZWNvcmQgaWYgdGhlcmUgaXNuJ3QgYSAgdXNlciBkZWZpbmVkIFJPVy4KKyAgICAgICAgICAgICRzZWxmLT5fd3JpdGVfcm93X2RlZmF1bHQoJHJvdywgJGNvbF9taW4sICRjb2xfbWF4KTsKKyAgICAgICAgfQorCisKKworICAgICAgICAjIElmIDMyIHJvd3MgaGF2ZSBiZWVuIHdyaXR0ZW4gb3Igd2UgYXJlIGF0IHRoZSBsYXN0IHJvdyBpbiB0aGUKKyAgICAgICAgIyB3b3Jrc2hlZXQgdGhlbiB3cml0ZSB0aGUgY2VsbCBkYXRhIGFuZCB0aGUgREJDRUxMIHJlY29yZC4KKyAgICAgICAgIworICAgICAgICBpZiAoQHdyaXR0ZW5fcm93cyA9PSAzMiBvciAkcm93ID09ICRzZWxmLT57X2RpbV9yb3dtYXh9IC0xKSB7CisKKyAgICAgICAgICAgICMgT2Zmc2V0cyB0byB0aGUgZmlyc3QgY2VsbCBvZiBlYWNoIHJvdy4KKyAgICAgICAgICAgIG15IEBjZWxsX29mZnNldHM7CisgICAgICAgICAgICBwdXNoIEBjZWxsX29mZnNldHMsICRyb3dfb2Zmc2V0IC0gMjA7CisKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIGNlbGwgZGF0YSBpbiBlYWNoIHJvdyBhbmQgc3VtIHRoZWlyIGxlbmd0aHMgZm9yIHRoZQorICAgICAgICAgICAgIyBjZWxsIG9mZnNldHMuCisgICAgICAgICAgICAjCisgICAgICAgICAgICBmb3IgbXkgJHJvdyAoQHdyaXR0ZW5fcm93cykgeworICAgICAgICAgICAgICAgIG15ICRjZWxsX29mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgbXkgJGNvbCAoQHskc2VsZi0+e190YWJsZX0tPlskcm93XX0pIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCB1bmxlc3MgJGNvbDsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGNvbCk7CisgICAgICAgICAgICAgICAgICAgIG15ICRsZW5ndGggPSBsZW5ndGggJGNvbDsKKyAgICAgICAgICAgICAgICAgICAgJHJvd19vZmZzZXQgICs9ICRsZW5ndGg7CisgICAgICAgICAgICAgICAgICAgICRjZWxsX29mZnNldCArPSAkbGVuZ3RoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXNoIEBjZWxsX29mZnNldHMsICRjZWxsX29mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgIyBUaGUgbGFzdCBvZmZzZXQgaXNuJ3QgcmVxdWlyZWQuCisgICAgICAgICAgICBwb3AgQGNlbGxfb2Zmc2V0czsKKworICAgICAgICAgICAgIyBTdG9yZXMgdGhlIERCQ0VMTCBvZmZzZXQgZm9yIHVzZSBpbiB0aGUgSU5ERVggcmVjb3JkLgorICAgICAgICAgICAgcHVzaCBAeyRzZWxmLT57X2RiX2luZGljZXN9fSwgJHNlbGYtPntfZGF0YXNpemV9OworCisgICAgICAgICAgICAjIFdyaXRlIHRoZSBEQkNFTEwgcmVjb3JkLgorICAgICAgICAgICAgJHNlbGYtPl9zdG9yZV9kYmNlbGwoJHJvd19vZmZzZXQsIEBjZWxsX29mZnNldHMpOworCisgICAgICAgICAgICAjIENsZWFyIHRoZSB2YXJpYWJsZSBmb3IgdGhlIG5leHQgYmxvY2sgb2Ygcm93cy4KKyAgICAgICAgICAgIEB3cml0dGVuX3Jvd3MgICA9ICgpOworICAgICAgICAgICAgQGNlbGxfb2Zmc2V0cyAgID0gKCk7CisgICAgICAgICAgICAkcm93X29mZnNldCAgICAgPSAwOworICAgICAgICB9CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2RiY2VsbCgpCisjCisjIFN0b3JlIHRoZSBEQkNFTEwgcmVjb3JkIHVzaW5nIHRoZSBvZmZzZXQgY2FsY3VsYXRlZCBpbiBfc3RvcmVfdGFibGUoKS4KKyMKKyMgVGhpcyBpcyBvbmx5IHVzZWQgd2hlbiBjb21wYXRpYml0eV9tb2RlKCkgaXMgaW4gb3BlcmF0aW9uLgorIworc3ViIF9zdG9yZV9kYmNlbGwgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRyb3dfb2Zmc2V0ICAgICAgPSBzaGlmdDsKKyAgICBteSBAY2VsbF9vZmZzZXRzICAgID0gQF87CisKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRDc7ICAgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDQgKyAyICogQGNlbGxfb2Zmc2V0czsgICMgQnl0ZXMgdG8gZm9sbG93CisKKworICAgIG15ICRoZWFkZXIgICAgICAgICAgPSBwYWNrICd2dicsICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgICAgICA9IHBhY2sgJ1YnLCAgJHJvd19vZmZzZXQ7CisgICAgICAgJGRhdGEgICAgICAgICAgIC49IHBhY2sgJ3YnLCAkXyBmb3IgQGNlbGxfb2Zmc2V0czsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9pbmRleCgpCisjCisjIFN0b3JlIHRoZSBJTkRFWCByZWNvcmQgdXNpbmcgdGhlIERCQ0VMTCBvZmZzZXRzIGNhbGN1bGF0ZWQgaW4gX3N0b3JlX3RhYmxlKCkuCisjCisjIFRoaXMgaXMgb25seSB1c2VkIHdoZW4gY29tcGF0aWJpdHlfbW9kZSgpIGlzIGluIG9wZXJhdGlvbi4KKyMKK3N1YiBfc3RvcmVfaW5kZXggeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIHJldHVybiB1bmxlc3MgJHNlbGYtPntfY29tcGF0aWJpbGl0eX07CisKKyAgICBteSBAaW5kaWNlcyAgICAgPSBAeyRzZWxmLT57X2RiX2luZGljZXN9fTsKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDAwMDAwOworICAgIG15ICRyb3dfbWluICAgICA9ICRzZWxmLT57X2RpbV9yb3dtaW59OworICAgIG15ICRyb3dfbWF4ICAgICA9ICRzZWxmLT57X2RpbV9yb3dtYXh9OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMjBCOyAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMTYgKyA0ICogQGluZGljZXM7ICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjayAndnYnLCAgICRyZWNvcmQsICRsZW5ndGg7CisgICAgbXkgJGRhdGEgICAgICAgID0gcGFjayAnVlZWVicsICRyZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvd19taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3dfbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQ7CisKKyAgICBmb3IgbXkgJGluZGV4IChAaW5kaWNlcykgeworICAgICAgICRkYXRhIC49IHBhY2sgJ1YnLCAkaW5kZXggKyAkc2VsZi0+e19vZmZzZXR9ICsgMjAgKyAkbGVuZ3RoICs0OworICAgIH0KKworICAgICRzZWxmLT5fcHJlcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGluc2VydF9jaGFydCgkcm93LCAkY29sLCAkY2hhcnQsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorIworIyBJbnNlcnQgYSBjaGFydCBpbnRvIGEgd29ya3NoZWV0LiBUaGUgJGNoYXJ0IGFyZ3VtZW50IHNob3VsZCBiZSBhIENoYXJ0CisjIG9iamVjdCBvciBlbHNlIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBmaWxlbmFtZSBvZiBhbiBleHRlcm5hbCBiaW5hcnkgZmlsZS4KKyMgVGhlIGxhdHRlciBpcyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisjCitzdWIgaW5zZXJ0X2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgIyBDaGVjayBmb3IgYSBjZWxsIHJlZmVyZW5jZSBpbiBBMSBub3RhdGlvbiBhbmQgc3Vic3RpdHV0ZSByb3cgYW5kIGNvbHVtbgorICAgIGlmICgkX1swXSA9fiAvXlxELykgeworICAgICAgICBAXyA9ICRzZWxmLT5fc3Vic3RpdHV0ZV9jZWxscmVmKEBfKTsKKyAgICB9CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKyAgICBteSAkY2hhcnQgICAgICAgPSAkX1syXTsKKyAgICBteSAkeF9vZmZzZXQgICAgPSAkX1szXSB8fCAwOworICAgIG15ICR5X29mZnNldCAgICA9ICRfWzRdIHx8IDA7CisgICAgbXkgJHNjYWxlX3ggICAgID0gJF9bNV0gfHwgMTsKKyAgICBteSAkc2NhbGVfeSAgICAgPSAkX1s2XSB8fCAxOworCisgICAgY3JvYWsgIkluc3VmZmljaWVudCBhcmd1bWVudHMgaW4gaW5zZXJ0X2NoYXJ0KCkiIHVubGVzcyBAXyA+PSAzOworCisgICAgaWYgKCByZWYgJGNoYXJ0ICkgeworICAgICAgICAjIENoZWNrIGZvciBhIENoYXJ0IG9iamVjdC4KKyAgICAgICAgY3JvYWsgIk5vdCBhIENoYXJ0IG9iamVjdCBpbiBpbnNlcnRfY2hhcnQoKSIKKyAgICAgICAgICB1bmxlc3MgJGNoYXJ0LT5pc2EoICdTcHJlYWRzaGVldDo6V3JpdGVFeGNlbDo6Q2hhcnQnICk7CisKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBjaGFydCBpcyBhbiBlbWJlZGRlZCBzdHlsZSBjaGFydC4KKyAgICAgICAgY3JvYWsgIk5vdCBhIGVtYmVkZGVkIHN0eWxlIENoYXJ0IG9iamVjdCBpbiBpbnNlcnRfY2hhcnQoKSIKKyAgICAgICAgICB1bmxlc3MgJGNoYXJ0LT57X2VtYmVkZGVkfTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAjIEFzc3VtZSBhbiBleHRlcm5hbCBiaW4gZmlsZW5hbWUuCisgICAgICAgIGNyb2FrICJDb3VsZG4ndCBsb2NhdGUgJGNoYXJ0IGluIGluc2VydF9jaGFydCgpOiAkISIgdW5sZXNzIC1lICRjaGFydDsKKyAgICB9CisKKyAgICAkc2VsZi0+e19jaGFydHN9LT57JHJvd30tPnskY29sfSA9ICBbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjaGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzY2FsZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07CisKK30KKworIyBPbGRlciBtZXRob2QgbmFtZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisqZW1iZWRfY2hhcnQgPSAqaW5zZXJ0X2NoYXJ0OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGluc2VydF9pbWFnZSgkcm93LCAkY29sLCAkZmlsZW5hbWUsICR4LCAkeSwgJHNjYWxlX3gsICRzY2FsZV95KQorIworIyBJbnNlcnQgYW4gaW1hZ2UgaW50byB0aGUgd29ya3NoZWV0LgorIworc3ViIGluc2VydF9pbWFnZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07CisgICAgbXkgJGNvbCAgICAgICAgID0gJF9bMV07CisgICAgbXkgJGltYWdlICAgICAgID0gJF9bMl07CisgICAgbXkgJHhfb2Zmc2V0ICAgID0gJF9bM10gfHwgMDsKKyAgICBteSAkeV9vZmZzZXQgICAgPSAkX1s0XSB8fCAwOworICAgIG15ICRzY2FsZV94ICAgICA9ICRfWzVdIHx8IDE7CisgICAgbXkgJHNjYWxlX3kgICAgID0gJF9bNl0gfHwgMTsKKworICAgIGNyb2FrICJJbnN1ZmZpY2llbnQgYXJndW1lbnRzIGluIGluc2VydF9pbWFnZSgpIiB1bmxlc3MgQF8gPj0gMzsKKyAgICBjcm9hayAiQ291bGRuJ3QgbG9jYXRlICRpbWFnZTogJCEiICAgICAgICAgICAgICAgdW5sZXNzIC1lICRpbWFnZTsKKworICAgICRzZWxmLT57X2ltYWdlc30tPnskcm93fS0+eyRjb2x9ID0gWworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NhbGVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2NhbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdOworCit9CisKKyMgT2xkZXIgbWV0aG9kIG5hbWUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorKmluc2VydF9iaXRtYXAgPSAqaW5zZXJ0X2ltYWdlOworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgIF9wb3NpdGlvbl9vYmplY3QoKQorIworIyBDYWxjdWxhdGUgdGhlIHZlcnRpY2VzIHRoYXQgZGVmaW5lIHRoZSBwb3NpdGlvbiBvZiBhIGdyYXBoaWNhbCBvYmplY3Qgd2l0aGluCisjIHRoZSB3b3Jrc2hlZXQuCisjCisjICAgICAgICAgKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjICAgICAgICAgfCAgICAgQSAgICAgIHwgICAgICBCICAgICB8CisjICAgKy0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjICAgfCAgICAgfCh4MSx5MSkgICAgIHwgICAgICAgICAgICB8CisjICAgfCAgMSAgfChBMSkuX19fX19fX3xfX19fX18gICAgICB8CisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgKy0tLS0tKy0tLS18ICAgIEJJVE1BUCAgICB8LS0tLS0rCisjICAgfCAgICAgfCAgICB8ICAgICAgICAgICAgICB8ICAgICB8CisjICAgfCAgMiAgfCAgICB8X19fX19fX19fX19fX18uICAgICB8CisjICAgfCAgICAgfCAgICAgICAgICAgIHwgICAgICAgIChCMil8CisjICAgfCAgICAgfCAgICAgICAgICAgIHwgICAgICh4Mix5Mil8CisjICAgKy0tLS0gKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rCisjCisjIEV4YW1wbGUgb2YgYSBiaXRtYXAgdGhhdCBjb3ZlcnMgc29tZSBvZiB0aGUgYXJlYSBmcm9tIGNlbGwgQTEgdG8gY2VsbCBCMi4KKyMKKyMgQmFzZWQgb24gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSA4IHZhcnM6CisjICAgICAkY29sX3N0YXJ0LCAkcm93X3N0YXJ0LCAkY29sX2VuZCwgJHJvd19lbmQsICR4MSwgJHkxLCAkeDIsICR5Mi4KKyMgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNlbGxzIGFyZSBhbHNvIHZhcmlhYmxlIGFuZCBoYXZlIHRvIGJlIHRha2VuIGludG8KKyMgYWNjb3VudC4KKyMgVGhlIHZhbHVlcyBvZiAkY29sX3N0YXJ0IGFuZCAkcm93X3N0YXJ0IGFyZSBwYXNzZWQgaW4gZnJvbSB0aGUgY2FsbGluZworIyBmdW5jdGlvbi4gVGhlIHZhbHVlcyBvZiAkY29sX2VuZCBhbmQgJHJvd19lbmQgYXJlIGNhbGN1bGF0ZWQgYnkgc3VidHJhY3RpbmcKKyMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGJpdG1hcCBmcm9tIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZQorIyB1bmRlcmx5aW5nIGNlbGxzLgorIyBUaGUgdmVydGljZXMgYXJlIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHVuZGVybHlpbmcgY2VsbCB3aWR0aCBhcworIyBmb2xsb3dzIChyaHMgdmFsdWVzIGFyZSBpbiBwaXhlbHMpOgorIworIyAgICAgICB4MSA9IFggLyBXICoxMDI0CisjICAgICAgIHkxID0gWSAvIEggKjI1NgorIyAgICAgICB4MiA9IChYLTEpIC8gVyAqMTAyNAorIyAgICAgICB5MiA9IChZLTEpIC8gSCAqMjU2CisjCisjICAgICAgIFdoZXJlOiAgWCBpcyBkaXN0YW5jZSBmcm9tIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHVuZGVybHlpbmcgY2VsbAorIyAgICAgICAgICAgICAgIFkgaXMgZGlzdGFuY2UgZnJvbSB0aGUgdG9wIG9mIHRoZSB1bmRlcmx5aW5nIGNlbGwKKyMgICAgICAgICAgICAgICBXIGlzIHRoZSB3aWR0aCBvZiB0aGUgY2VsbAorIyAgICAgICAgICAgICAgIEggaXMgdGhlIGhlaWdodCBvZiB0aGUgY2VsbAorIworIyBOb3RlOiB0aGUgU0RLIGluY29ycmVjdGx5IHN0YXRlcyB0aGF0IHRoZSBoZWlnaHQgc2hvdWxkIGJlIGV4cHJlc3NlZCBhcyBhCisjIHBlcmNlbnRhZ2Ugb2YgMTAyNC4KKyMKK3N1YiBfcG9zaXRpb25fb2JqZWN0IHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICBteSAkY29sX3N0YXJ0OyAgIyBDb2wgY29udGFpbmluZyB1cHBlciBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeDE7ICAgICAgICAgIyBEaXN0YW5jZSB0byBsZWZ0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X3N0YXJ0OyAgIyBSb3cgY29udGFpbmluZyB0b3AgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkxOyAgICAgICAgICMgRGlzdGFuY2UgdG8gdG9wIG9mIG9iamVjdAorCisgICAgbXkgJGNvbF9lbmQ7ICAgICMgQ29sIGNvbnRhaW5pbmcgbG93ZXIgcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MjsgICAgICAgICAjIERpc3RhbmNlIHRvIHJpZ2h0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X2VuZDsgICAgIyBSb3cgY29udGFpbmluZyBib3R0b20gcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR5MjsgICAgICAgICAjIERpc3RhbmNlIHRvIGJvdHRvbSBvZiBvYmplY3QKKworICAgIG15ICR3aWR0aDsgICAgICAjIFdpZHRoIG9mIGltYWdlIGZyYW1lCisgICAgbXkgJGhlaWdodDsgICAgICMgSGVpZ2h0IG9mIGltYWdlIGZyYW1lCisKKyAgICAoJGNvbF9zdGFydCwgJHJvd19zdGFydCwgJHgxLCAkeTEsICR3aWR0aCwgJGhlaWdodCkgPSBAXzsKKworCisgICAgIyBBZGp1c3Qgc3RhcnQgY29sdW1uIGZvciBvZmZzZXRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgY29sIHdpZHRoCisgICAgd2hpbGUgKCR4MSA+PSAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpKSB7CisgICAgICAgICR4MSAtPSAkc2VsZi0+X3NpemVfY29sKCRjb2xfc3RhcnQpOworICAgICAgICAkY29sX3N0YXJ0Kys7CisgICAgfQorCisgICAgIyBBZGp1c3Qgc3RhcnQgcm93IGZvciBvZmZzZXRzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiB0aGUgcm93IGhlaWdodAorICAgIHdoaWxlICgkeTEgPj0gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KSkgeworICAgICAgICAkeTEgLT0gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KTsKKyAgICAgICAgJHJvd19zdGFydCsrOworICAgIH0KKworCisgICAgIyBJbml0aWFsaXNlIGVuZCBjZWxsIHRvIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBjZWxsCisgICAgJGNvbF9lbmQgICAgPSAkY29sX3N0YXJ0OworICAgICRyb3dfZW5kICAgID0gJHJvd19zdGFydDsKKworICAgICR3aWR0aCAgICAgID0gJHdpZHRoICArICR4MTsKKyAgICAkaGVpZ2h0ICAgICA9ICRoZWlnaHQgKyAkeTE7CisKKworICAgICMgU3VidHJhY3QgdGhlIHVuZGVybHlpbmcgY2VsbCB3aWR0aHMgdG8gZmluZCB0aGUgZW5kIGNlbGwgb2YgdGhlIGltYWdlCisgICAgd2hpbGUgKCR3aWR0aCA+PSAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKSkgeworICAgICAgICAkd2lkdGggLT0gJHNlbGYtPl9zaXplX2NvbCgkY29sX2VuZCk7CisgICAgICAgICRjb2xfZW5kKys7CisgICAgfQorCisgICAgIyBTdWJ0cmFjdCB0aGUgdW5kZXJseWluZyBjZWxsIGhlaWdodHMgdG8gZmluZCB0aGUgZW5kIGNlbGwgb2YgdGhlIGltYWdlCisgICAgd2hpbGUgKCRoZWlnaHQgPj0gJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkpIHsKKyAgICAgICAgJGhlaWdodCAtPSAkc2VsZi0+X3NpemVfcm93KCRyb3dfZW5kKTsKKyAgICAgICAgJHJvd19lbmQrKzsKKyAgICB9CisKKyAgICAjIEJpdG1hcCBpc24ndCBhbGxvd2VkIHRvIHN0YXJ0IG9yIGZpbmlzaCBpbiBhIGhpZGRlbiBjZWxsLCBpLmUuIGEgY2VsbAorICAgICMgd2l0aCB6ZXJvIGVpZ2h0IG9yIHdpZHRoLgorICAgICMKKyAgICByZXR1cm4gaWYgJHNlbGYtPl9zaXplX2NvbCgkY29sX3N0YXJ0KSA9PSAwOworICAgIHJldHVybiBpZiAkc2VsZi0+X3NpemVfY29sKCRjb2xfZW5kKSAgID09IDA7CisgICAgcmV0dXJuIGlmICRzZWxmLT5fc2l6ZV9yb3coJHJvd19zdGFydCkgPT0gMDsKKyAgICByZXR1cm4gaWYgJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkgICA9PSAwOworCisgICAgIyBDb252ZXJ0IHRoZSBwaXhlbCB2YWx1ZXMgdG8gdGhlIHBlcmNlbnRhZ2UgdmFsdWUgZXhwZWN0ZWQgYnkgRXhjZWwKKyAgICAkeDEgPSAkeDEgICAgIC8gJHNlbGYtPl9zaXplX2NvbCgkY29sX3N0YXJ0KSAgICogMTAyNDsKKyAgICAkeTEgPSAkeTEgICAgIC8gJHNlbGYtPl9zaXplX3Jvdygkcm93X3N0YXJ0KSAgICogIDI1NjsKKyAgICAkeDIgPSAkd2lkdGggIC8gJHNlbGYtPl9zaXplX2NvbCgkY29sX2VuZCkgICAgICogMTAyNDsKKyAgICAkeTIgPSAkaGVpZ2h0IC8gJHNlbGYtPl9zaXplX3Jvdygkcm93X2VuZCkgICAgICogIDI1NjsKKworICAgICMgU2ltdWxhdGUgY2VpbCgpIHdpdGhvdXQgY2FsbGluZyBQT1NJWDo6Y2VpbCgpLgorICAgICR4MSA9IGludCgkeDEgKzAuNSk7CisgICAgJHkxID0gaW50KCR5MSArMC41KTsKKyAgICAkeDIgPSBpbnQoJHgyICswLjUpOworICAgICR5MiA9IGludCgkeTIgKzAuNSk7CisKKyAgICByZXR1cm4oICRjb2xfc3RhcnQsICR4MSwKKyAgICAgICAgICAgICRyb3dfc3RhcnQsICR5MSwKKyAgICAgICAgICAgICRjb2xfZW5kLCAgICR4MiwKKyAgICAgICAgICAgICRyb3dfZW5kLCAgICR5MgorICAgICAgICAgICk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc2l6ZV9jb2woJGNvbCkKKyMKKyMgQ29udmVydCB0aGUgd2lkdGggb2YgYSBjZWxsIGZyb20gdXNlcidzIHVuaXRzIHRvIHBpeGVscy4gRXhjZWwgcm91bmRzIHRoZQorIyBjb2x1bW4gd2lkdGggdG8gdGhlIG5lYXJlc3QgcGl4ZWwuIElmIHRoZSB3aWR0aCBoYXNuJ3QgYmVlbiBzZXQgYnkgdGhlIHVzZXIKKyMgd2UgdXNlIHRoZSBkZWZhdWx0IHZhbHVlLiBJZiB0aGUgY29sdW1uIGlzIGhpZGRlbiB3ZSB1c2UgYSB2YWx1ZSBvZiB6ZXJvLgorIworc3ViIF9zaXplX2NvbCB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRjb2wgID0gJF9bMF07CisKKyAgICAjIExvb2sgdXAgdGhlIGNlbGwgdmFsdWUgdG8gc2VlIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQKKyAgICBpZiAoZXhpc3RzICRzZWxmLT57X2NvbF9zaXplc30tPnskY29sfSkgeworICAgICAgICBteSAkd2lkdGggPSAkc2VsZi0+e19jb2xfc2l6ZXN9LT57JGNvbH07CisKKyAgICAgICAgIyBUaGUgcmVsYXRpb25zaGlwIGlzIGRpZmZlcmVudCBmb3IgdXNlciB1bml0cyBsZXNzIHRoYW4gMS4KKyAgICAgICAgaWYgKCR3aWR0aCA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQoJHdpZHRoICoxMik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaW50KCR3aWR0aCAqNyApICs1OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gNjQ7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3NpemVfcm93KCRyb3cpCisjCisjIENvbnZlcnQgdGhlIGhlaWdodCBvZiBhIGNlbGwgZnJvbSB1c2VyJ3MgdW5pdHMgdG8gcGl4ZWxzLiBCeSBpbnRlcnBvbGF0aW9uCisjIHRoZSByZWxhdGlvbnNoaXAgaXM6IHkgPSA0LzN4LiBJZiB0aGUgaGVpZ2h0IGhhc24ndCBiZWVuIHNldCBieSB0aGUgdXNlciB3ZQorIyB1c2UgdGhlIGRlZmF1bHQgdmFsdWUuIElmIHRoZSByb3cgaXMgaGlkZGVuIHdlIHVzZSBhIHZhbHVlIG9mIHplcm8uIChOb3QKKyMgcG9zc2libGUgdG8gaGlkZSByb3cgeWV0KS4KKyMKK3N1YiBfc2l6ZV9yb3cgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkcm93ICA9ICRfWzBdOworCisgICAgIyBMb29rIHVwIHRoZSBjZWxsIHZhbHVlIHRvIHNlZSBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkCisgICAgaWYgKGV4aXN0cyAkc2VsZi0+e19yb3dfc2l6ZXN9LT57JHJvd30pIHsKKyAgICAgICAgaWYgKCRzZWxmLT57X3Jvd19zaXplc30tPnskcm93fSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnQgKDQvMyAqICRzZWxmLT57X3Jvd19zaXplc30tPnskcm93fSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiAxNzsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfem9vbSgkem9vbSkKKyMKKyMKKyMgU3RvcmUgdGhlIHdpbmRvdyB6b29tIGZhY3Rvci4gVGhpcyBzaG91bGQgYmUgYSByZWR1Y2VkIGZyYWN0aW9uIGJ1dCBmb3IKKyMgc2ltcGxpY2l0eSB3ZSB3aWxsIHN0b3JlIGFsbCBmcmFjdGlvbnMgd2l0aCBhIG51bWVyYXRvciBvZiAxMDAuCisjCitzdWIgX3N0b3JlX3pvb20geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICAjIElmIHNjYWxlIGlzIDEwMCB3ZSBkb24ndCBuZWVkIHRvIHdyaXRlIGEgcmVjb3JkCisgICAgcmV0dXJuIGlmICRzZWxmLT57X3pvb219ID09IDEwMDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDBBMDsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA0OyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGggICApOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2soInZ2IiwgJHNlbGYtPntfem9vbX0sIDEwMCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyB3cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLCAkc3RyaW5nLCAkZm9ybWF0KQorIworIyBXcml0ZSBhIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBzcGVjaWZpZWQgcm93IGFuZCBjb2x1bW4gKHplcm8gaW5kZXhlZCkuCisjICRmb3JtYXQgaXMgb3B0aW9uYWwuCisjIFJldHVybnMgIDAgOiBub3JtYWwgdGVybWluYXRpb24KKyMgICAgICAgICAtMSA6IGluc3VmZmljaWVudCBudW1iZXIgb2YgYXJndW1lbnRzCisjICAgICAgICAgLTIgOiByb3cgb3IgY29sdW1uIG91dCBvZiByYW5nZQorIyAgICAgICAgIC0zIDogbG9uZyBzdHJpbmcgdHJ1bmNhdGVkIHRvIDI1NSBjaGFycworIworc3ViIHdyaXRlX3V0ZjE2YmVfc3RyaW5nIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgIGlmIChAXyA8IDMpIHsgcmV0dXJuIC0xIH0gICAgICAgICAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBudW1iZXIgb2YgYXJncworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMEZEOyAgICAgICAgICAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMEE7ICAgICAgICAgICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRyb3cgICAgICAgICA9ICRfWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCByb3cKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBaZXJvIGluZGV4ZWQgY29sdW1uCisgICAgbXkgJHN0cmxlbiAgICAgID0gbGVuZ3RoKCRfWzJdKTsKKyAgICBteSAkc3RyICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkeGYgICAgICAgICAgPSBfWEYoJHNlbGYsICRyb3csICRjb2wsICRfWzNdKTsgIyBUaGUgY2VsbCBmb3JtYXQKKyAgICBteSAkZW5jb2RpbmcgICAgPSAweDE7CisgICAgbXkgJHN0cl9lcnJvciAgID0gMDsKKworICAgICMgQ2hlY2sgdGhhdCByb3cgYW5kIGNvbCBhcmUgdmFsaWQgYW5kIHN0b3JlIG1heCBhbmQgbWluIHZhbHVlcworICAgIHJldHVybiAtMiBpZiAkc2VsZi0+X2NoZWNrX2RpbWVuc2lvbnMoJHJvdywgJGNvbCk7CisKKyAgICAjIExpbWl0IHRoZSB1dGYxNiBzdHJpbmcgdG8gdGhlIG1heCBudW1iZXIgb2YgY2hhcnMgKG5vdCBieXRlcykuCisgICAgaWYgKCRzdHJsZW4gPiAzMjc2NyogMikgeworICAgICAgICAkc3RyICAgICAgID0gc3Vic3RyKCRzdHIsIDAsIDMyNzY3KjIpOworICAgICAgICAkc3RyX2Vycm9yID0gLTM7CisgICAgfQorCisKKyAgICBteSAkbnVtX2J5dGVzID0gbGVuZ3RoICRzdHI7CisgICAgbXkgJG51bV9jaGFycyA9IGludCgkbnVtX2J5dGVzIC8gMik7CisKKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgMi1ieXRlIGNoYXIgc3RyaW5nLgorICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIFVuaWNvZGUgc3RyaW5nIiBpZiAkbnVtX2J5dGVzICUgMjsKKworCisgICAgIyBDaGFuZ2UgZnJvbSBVVEYxNiBiaWctZW5kaWFuIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAkc3RyID0gcGFjayAidioiLCB1bnBhY2sgIm4qIiwgJHN0cjsKKworCisgICAgIyBBZGQgdGhlIGVuY29kaW5nIGFuZCBsZW5ndGggaGVhZGVyIHRvIHRoZSBzdHJpbmcuCisgICAgbXkgJHN0cl9oZWFkZXIgID0gcGFjaygidkMiLCAkbnVtX2NoYXJzLCAkZW5jb2RpbmcpOworICAgICRzdHIgICAgICAgICAgICA9ICRzdHJfaGVhZGVyIC4gJHN0cjsKKworCisgICAgaWYgKG5vdCBleGlzdHMgJHskc2VsZi0+e19zdHJfdGFibGV9fS0+eyRzdHJ9KSB7CisgICAgICAgICR7JHNlbGYtPntfc3RyX3RhYmxlfX0tPnskc3RyfSA9ICR7JHNlbGYtPntfc3RyX3VuaXF1ZX19Kys7CisgICAgfQorCisKKyAgICAkeyRzZWxmLT57X3N0cl90b3RhbH19Kys7CisKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCJ2diIsICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICA9IHBhY2soInZ2dlYiLCAkcm93LCAkY29sLCAkeGYsICR7JHNlbGYtPntfc3RyX3RhYmxlfX0tPnskc3RyfSk7CisKKyAgICAjIFN0b3JlIHRoZSBkYXRhIG9yIHdyaXRlIGltbWVkaWF0ZWx5IGRlcGVuZGluZyBvbiB0aGUgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGlmICgkc2VsZi0+e19jb21wYXRpYmlsaXR5fSkgeworICAgICAgICAkc2VsZi0+e190YWJsZX0tPlskcm93XS0+WyRjb2xdID0gJGhlYWRlciAuICRkYXRhOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworICAgIH0KKworICAgIHJldHVybiAkc3RyX2Vycm9yOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgd3JpdGVfdXRmMTZsZV9zdHJpbmcoJHJvdywgJGNvbCwgJHN0cmluZywgJGZvcm1hdCkKKyMKKyMgV3JpdGUgYSBVVEYtMTZMRSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiAoemVybyBpbmRleGVkKS4KKyMgJGZvcm1hdCBpcyBvcHRpb25hbC4KKyMgUmV0dXJucyAgMCA6IG5vcm1hbCB0ZXJtaW5hdGlvbgorIyAgICAgICAgIC0xIDogaW5zdWZmaWNpZW50IG51bWJlciBvZiBhcmd1bWVudHMKKyMgICAgICAgICAtMiA6IHJvdyBvciBjb2x1bW4gb3V0IG9mIHJhbmdlCisjICAgICAgICAgLTMgOiBsb25nIHN0cmluZyB0cnVuY2F0ZWQgdG8gMjU1IGNoYXJzCisjCitzdWIgd3JpdGVfdXRmMTZsZV9zdHJpbmcgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgQ2hlY2sgZm9yIGEgY2VsbCByZWZlcmVuY2UgaW4gQTEgbm90YXRpb24gYW5kIHN1YnN0aXR1dGUgcm93IGFuZCBjb2x1bW4KKyAgICBpZiAoJF9bMF0gPX4gL15cRC8pIHsKKyAgICAgICAgQF8gPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZihAXyk7CisgICAgfQorCisgICAgaWYgKEBfIDwgMykgeyByZXR1cm4gLTEgfSAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhlIG51bWJlciBvZiBhcmdzCisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRkQ7ICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAwQTsgICAgICAgICAgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHJvdyAgICAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICAgICAgICAgICMgWmVybyBpbmRleGVkIHJvdworICAgIG15ICRjb2wgICAgICAgICA9ICRfWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAjIFplcm8gaW5kZXhlZCBjb2x1bW4KKyAgICBteSAkc3RyICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkZm9ybWF0ICAgICAgPSAkX1szXTsgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgY2VsbCBmb3JtYXQKKworCisgICAgIyBDaGFuZ2UgZnJvbSBVVEYxNiBiaWctZW5kaWFuIHRvIGxpdHRsZSBlbmRpYW4KKyAgICAkc3RyID0gcGFjayAidioiLCB1bnBhY2sgIm4qIiwgJHN0cjsKKworCisgICAgcmV0dXJuICRzZWxmLT53cml0ZV91dGYxNmJlX3N0cmluZygkcm93LCAkY29sLCAkc3RyLCAkZm9ybWF0KTsKK30KKworCisjIE9sZGVyIG1ldGhvZCBuYW1lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKyp3cml0ZV91bmljb2RlICAgID0gKndyaXRlX3V0ZjE2YmVfc3RyaW5nOworKndyaXRlX3VuaWNvZGVfbGUgPSAqd3JpdGVfdXRmMTZsZV9zdHJpbmc7CisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9hdXRvZmlsdGVycygpCisjCisjIEZ1bmN0aW9uIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29sdW1ucyB0aGF0IGZvcm0gcGFydCBvZiBhbiBhdXRvZmlsdGVyCisjIHJhbmdlIGFuZCB3cml0ZSBCaWZmIEFVVE9GSUxURVIgcmVjb3JkcyBpZiBhIGZpbHRlciBleHByZXNzaW9uIGhhcyBiZWVuIHNldC4KKyMKK3N1YiBfc3RvcmVfYXV0b2ZpbHRlcnMgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgICMgU2tpcCBhbGwgY29sdW1ucyBpZiBubyBmaWx0ZXIgaGF2ZSBiZWVuIHNldC4KKyAgICByZXR1cm4gdW5sZXNzICRzZWxmLT57X2ZpbHRlcl9vbn07CisKKyAgICBteSAodW5kZWYsIHVuZGVmLCAkY29sMSwgJGNvbDIpID0gQHskc2VsZi0+e19maWx0ZXJfYXJlYX19OworCisgICAgZm9yIG15ICRpICgkY29sMSAuLiAkY29sMikgeworICAgICAgICAjIFJldmVyc2Ugb3JkZXIgc2luY2UgcmVjb3JkcyBhcmUgYmVpbmcgcHJlLXBlbmRlZC4KKyAgICAgICAgbXkgJGNvbCA9ICRjb2wyIC0kaTsKKworICAgICAgICAjIFNraXAgaWYgY29sdW1uIGRvZXNuJ3QgaGF2ZSBhbiBhY3RpdmUgZmlsdGVyLgorICAgICAgICBuZXh0IHVubGVzcyAkc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfTsKKworICAgICAgICAjIFJldHJpZXZlIHRoZSBmaWx0ZXIgdG9rZW5zIGFuZCB3cml0ZSB0aGUgYXV0b2ZpbHRlciByZWNvcmRzLgorICAgICAgICBteSBAdG9rZW5zID0gIEB7JHNlbGYtPntfZmlsdGVyX2NvbHN9LT57JGNvbH19OworICAgICAgICAkc2VsZi0+X3N0b3JlX2F1dG9maWx0ZXIoJGNvbCwgQHRva2Vucyk7CisgICAgfQorfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2F1dG9maWx0ZXIoKQorIworIyBGdW5jdGlvbiB0byB3cml0ZSB3b3Jrc2hlZXQgQVVUT0ZJTFRFUiByZWNvcmRzLiBUaGVzZSBjb250YWluIDIgQmlmZiBEb3BlcgorIyBzdHJ1Y3R1cmVzIHRvIHJlcHJlc2VudCB0aGUgMiBwb3NzaWJsZSBmaWx0ZXIgY29uZGl0aW9ucy4KKyMKK3N1YiBfc3RvcmVfYXV0b2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMDlFOworICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7CisKKyAgICBteSAkaW5kZXggICAgICAgICAgID0gJF9bMF07CisgICAgbXkgJG9wZXJhdG9yXzEgICAgICA9ICRfWzFdOworICAgIG15ICR0b2tlbl8xICAgICAgICAgPSAkX1syXTsKKyAgICBteSAkam9pbiAgICAgICAgICAgID0gJF9bM107ICMgQW5kL09yCisgICAgbXkgJG9wZXJhdG9yXzIgICAgICA9ICRfWzRdOworICAgIG15ICR0b2tlbl8yICAgICAgICAgPSAkX1s1XTsKKworICAgIG15ICR0b3AxMF9hY3RpdmUgICAgPSAwOworICAgIG15ICR0b3AxMF9kaXJlY3Rpb24gPSAwOworICAgIG15ICR0b3AxMF9wZXJjZW50ICAgPSAwOworICAgIG15ICR0b3AxMF92YWx1ZSAgICAgPSAxMDE7CisKKyAgICBteSAkZ3JiaXQgICAgICAgPSAkam9pbjsKKyAgICBteSAkb3B0aW1pc2VkXzEgPSAwOworICAgIG15ICRvcHRpbWlzZWRfMiA9IDA7CisgICAgbXkgJGRvcGVyXzEgICAgID0gJyc7CisgICAgbXkgJGRvcGVyXzIgICAgID0gJyc7CisgICAgbXkgJHN0cmluZ18xICAgID0gJyc7CisgICAgbXkgJHN0cmluZ18yICAgID0gJyc7CisKKyAgICAjIEV4Y2VsIHVzZWQgYW4gb3B0aW1pc2F0aW9uIGluIHRoZSBjYXNlIG9mIGEgc2ltcGxlIGVxdWFsaXR5LgorICAgICRvcHRpbWlzZWRfMSA9IDEgaWYgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yXzEgPT0gMjsKKyAgICAkb3B0aW1pc2VkXzIgPSAxIGlmIGRlZmluZWQgJG9wZXJhdG9yXzIgYW5kICRvcGVyYXRvcl8yID09IDI7CisKKworICAgICMgQ29udmVydCBub24tc2ltcGxlIGVxdWFsaXRpZXMgYmFjayB0byB0eXBlIDIuIFNlZSAgX3BhcnNlX2ZpbHRlcl90b2tlbnMoKS4KKyAgICAkb3BlcmF0b3JfMSA9IDIgaWYgICAgICAgICAgICAgICAgICAgICAgICAgJG9wZXJhdG9yXzEgPT0gMjI7CisgICAgJG9wZXJhdG9yXzIgPSAyIGlmIGRlZmluZWQgJG9wZXJhdG9yXzIgYW5kICRvcGVyYXRvcl8yID09IDIyOworCisKKyAgICAjIEhhbmRsZSBhICJUb3AiIHN0eWxlIGV4cHJlc3Npb24uCisgICAgaWYgKCRvcGVyYXRvcl8xID49IDMwKSB7CisgICAgICAgICMgUmVtb3ZlIHRoZSBzZWNvbmQgZXhwcmVzc2lvbiBpZiBwcmVzZW50LgorICAgICAgICAkb3BlcmF0b3JfMiA9IHVuZGVmOworICAgICAgICAkdG9rZW5fMiAgICA9IHVuZGVmOworCisgICAgICAgICMgU2V0IHRoZSBhY3RpdmUgZmxhZy4KKyAgICAgICAgJHRvcDEwX2FjdGl2ZSAgICA9IDE7CisKKyAgICAgICAgaWYgKCRvcGVyYXRvcl8xID09IDMwIG9yICRvcGVyYXRvcl8xID09IDMxKSB7CisgICAgICAgICAgICAkdG9wMTBfZGlyZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgkb3BlcmF0b3JfMSA9PSAzMSBvciAkb3BlcmF0b3JfMSA9PSAzMykgeworICAgICAgICAgICAgJHRvcDEwX3BlcmNlbnQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCR0b3AxMF9kaXJlY3Rpb24gPT0gMSkgeworICAgICAgICAgICAgJG9wZXJhdG9yXzEgPSA2CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAkb3BlcmF0b3JfMSA9IDMKKyAgICAgICAgfQorCisgICAgICAgICR0b3AxMF92YWx1ZSAgICAgPSAkdG9rZW5fMTsKKyAgICAgICAgJHRva2VuXzEgICAgICAgICA9IDA7CisgICAgfQorCisKKyAgICAkZ3JiaXQgICAgIHw9ICRvcHRpbWlzZWRfMSAgICAgIDw8IDI7CisgICAgJGdyYml0ICAgICB8PSAkb3B0aW1pc2VkXzIgICAgICA8PCAzOworICAgICRncmJpdCAgICAgfD0gJHRvcDEwX2FjdGl2ZSAgICAgPDwgNDsKKyAgICAkZ3JiaXQgICAgIHw9ICR0b3AxMF9kaXJlY3Rpb24gIDw8IDU7CisgICAgJGdyYml0ICAgICB8PSAkdG9wMTBfcGVyY2VudCAgICA8PCA2OworICAgICRncmJpdCAgICAgfD0gJHRvcDEwX3ZhbHVlICAgICAgPDwgNzsKKworICAgICgkZG9wZXJfMSwgJHN0cmluZ18xKSA9ICRzZWxmLT5fcGFja19kb3Blcigkb3BlcmF0b3JfMSwgJHRva2VuXzEpOworICAgICgkZG9wZXJfMiwgJHN0cmluZ18yKSA9ICRzZWxmLT5fcGFja19kb3Blcigkb3BlcmF0b3JfMiwgJHRva2VuXzIpOworCisgICAgbXkgJGRhdGEgICAgPSBwYWNrICd2JywgJGluZGV4OworICAgICAgICRkYXRhICAgLj0gcGFjayAndicsICRncmJpdDsKKyAgICAgICAkZGF0YSAgIC49ICRkb3Blcl8xOworICAgICAgICRkYXRhICAgLj0gJGRvcGVyXzI7CisgICAgICAgJGRhdGEgICAuPSAkc3RyaW5nXzE7CisgICAgICAgJGRhdGEgICAuPSAkc3RyaW5nXzI7CisKKyAgICAgICAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soJ3Z2JywgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9wcmVwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX2RvcGVyKCkKKyMKKyMgQ3JlYXRlIGEgQmlmZiBEb3BlciBzdHJ1Y3R1cmUgdGhhdCByZXByZXNlbnRzIGEgZmlsdGVyIGV4cHJlc3Npb24uIERlcGVuZGluZworIyBvbiB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gd2UgcGFjayBhbiBFbXB0eSwgU3RyaW5nIG9yIE51bWJlciBkb3Blci4KKyMKK3N1YiBfcGFja19kb3BlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRvcGVyYXRvciAgICA9ICRfWzBdOworICAgIG15ICR0b2tlbiAgICAgICA9ICRfWzFdOworCisgICAgbXkgJGRvcGVyICAgICAgID0gJyc7CisgICAgbXkgJHN0cmluZyAgICAgID0gJyc7CisKKworICAgICMgUmV0dXJuIGRlZmF1bHQgZG9wZXIgZm9yIG5vbi1kZWZpbmVkIGZpbHRlcnMuCisgICAgaWYgKG5vdCBkZWZpbmVkICRvcGVyYXRvcikgeworICAgICAgICByZXR1cm4gKCRzZWxmLT5fcGFja191bnVzZWRfZG9wZXIsICRzdHJpbmcpOworICAgIH0KKworCisgICAgaWYgKCR0b2tlbiA9fiAvXmJsYW5rc3xub25ibGFua3MkL2kpIHsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19ibGFua3NfZG9wZXIoJG9wZXJhdG9yLCAkdG9rZW4pOworICAgIH0KKyAgICBlbHNpZiAoJG9wZXJhdG9yID09IDIgb3IKKyAgICAgICAgJHRva2VuICAgICF+IC9eKFsrLV0/KSg/PVxkfFwuXGQpXGQqKFwuXGQqKT8oW0VlXShbKy1dP1xkKykpPyQvKQorICAgIHsKKyAgICAgICAgIyBFeGNlbCB0cmVhdHMgYWxsIHRva2VucyBhcyBzdHJpbmdzIGlmIHRoZSBvcGVyYXRvciBpcyBlcXVhbGl0eSwgPS4KKworICAgICAgICAkc3RyaW5nID0gJHRva2VuOworCisgICAgICAgIG15ICRlbmNvZGluZyA9IDA7CisgICAgICAgIG15ICRsZW5ndGggICA9IGxlbmd0aCAkc3RyaW5nOworCisgICAgICAgICMgSGFuZGxlIHV0Zjggc3RyaW5ncyBpbiBwZXJsIDUuOC4KKyAgICAgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICAgICAgaWYgKEVuY29kZTo6aXNfdXRmOCgkc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2QkUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgJHN0cmluZyA9IHBhY2soJ0MnLCAkZW5jb2RpbmcpIC4gJHN0cmluZzsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19zdHJpbmdfZG9wZXIoJG9wZXJhdG9yLCAkbGVuZ3RoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRzdHJpbmcgPSAnJzsKKyAgICAgICAgJGRvcGVyICA9ICRzZWxmLT5fcGFja19udW1iZXJfZG9wZXIoJG9wZXJhdG9yLCAkdG9rZW4pOworICAgIH0KKworICAgIHJldHVybiAoJGRvcGVyLCAkc3RyaW5nKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9wYWNrX3VudXNlZF9kb3BlcigpCisjCisjIFBhY2sgYW4gZW1wdHkgRG9wZXIgc3RydWN0dXJlLgorIworc3ViIF9wYWNrX3VudXNlZF9kb3BlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIHJldHVybiBwYWNrICdDMTAnLCAoMHgwKSB4IDEwOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfYmxhbmtzX2RvcGVyKCkKKyMKKyMgUGFjayBhbiBCbGFua3MvTm9uQmxhbmtzIERvcGVyIHN0cnVjdHVyZS4KKyMKK3N1YiBfcGFja19ibGFua3NfZG9wZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkb3BlcmF0b3IgICAgPSAkX1swXTsKKyAgICBteSAkdG9rZW4gICAgICAgPSAkX1sxXTsKKyAgICBteSAkdHlwZTsKKworICAgIGlmICgkdG9rZW4gZXEgJ2JsYW5rcycpIHsKKyAgICAgICAgJHR5cGUgICAgID0gMHgwQzsKKyAgICAgICAgJG9wZXJhdG9yID0gMjsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHR5cGUgICAgID0gMHgwRTsKKyAgICAgICAgJG9wZXJhdG9yID0gNTsKKyAgICB9CisKKworICAgIG15ICRkb3BlciAgICAgICA9IHBhY2sgJ0NDVlYnLCAgICAkdHlwZSwgICAgICAgICAjIERhdGEgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3BlcmF0b3IsICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMCwgICAgICAgICMgUmVzZXJ2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwOyAgICAgICAgIyBSZXNlcnZlZAorICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19zdHJpbmdfZG9wZXIoKQorIworIyBQYWNrIGFuIHN0cmluZyBEb3BlciBzdHJ1Y3R1cmUuCisjCitzdWIgX3BhY2tfc3RyaW5nX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG9wZXJhdG9yICAgID0gJF9bMF07CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMV07CisgICAgbXkgJGRvcGVyICAgICAgID0gcGFjayAnQ0NWQ0NDQycsIDB4MDYsICAgICAgICAgICMgRGF0YSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRvcGVyYXRvciwgICAgICMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwLCAgICAgICAgIyBSZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbGVuZ3RoLCAgICAgICAjIFN0cmluZyBjaGFyIGxlbmd0aC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwLCAweDAsIDB4MDsgIyBSZXNlcnZlZAorICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19udW1iZXJfZG9wZXIoKQorIworIyBQYWNrIGFuIElFRUUgZG91YmxlIG51bWJlciBEb3BlciBzdHJ1Y3R1cmUuCisjCitzdWIgX3BhY2tfbnVtYmVyX2RvcGVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJG9wZXJhdG9yICAgID0gJF9bMF07CisgICAgbXkgJG51bWJlciAgICAgID0gJF9bMV07CisgICAgICAgJG51bWJlciAgICAgID0gcGFjayAnZCcsICRudW1iZXI7CisgICAgICAgJG51bWJlciAgICAgID0gcmV2ZXJzZSAkbnVtYmVyIGlmICRzZWxmLT57X2J5dGVfb3JkZXJ9OworCisgICAgbXkgJGRvcGVyICAgICAgID0gcGFjayAnQ0MnLCAweDA0LCAkb3BlcmF0b3I7CisgICAgICAgJGRvcGVyICAgICAgLj0gJG51bWJlcjsKKworICAgIHJldHVybiAkZG9wZXI7Cit9CisKKworIworIyBNZXRob2RzIHJlbGF0ZWQgdG8gY29tbWVudHMgYW5kIE1TTyBvYmplY3RzLgorIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfaW1hZ2VzKCkKKyMKKyMgVHVybiB0aGUgSG9IIHRoYXQgc3RvcmVzIHRoZSBpbWFnZXMgaW50byBhbiBhcnJheSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorIworc3ViIF9wcmVwYXJlX2ltYWdlcyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBpbWFnZXM7CisKKworICAgICMgV2Ugc29ydCB0aGUgaW1hZ2VzIGJ5IHJvdyBhbmQgY29sdW1uIGJ1dCB0aGF0IGlzbid0IHN0cmljdGx5IHJlcXVpcmVkLgorICAgICMKKyAgICBteSBAcm93cyA9IHNvcnQgeyRhIDw9PiAkYn0ga2V5cyAleyRzZWxmLT57X2ltYWdlc319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfaW1hZ2VzfS0+eyRyb3d9fTsKKworICAgICAgICBmb3IgbXkgJGNvbCAoQGNvbHMpIHsKKyAgICAgICAgICAgIHB1c2ggQGltYWdlcywgJHNlbGYtPntfaW1hZ2VzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2ltYWdlc30gICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19pbWFnZXNfYXJyYXl9ID0gXEBpbWFnZXM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfY29tbWVudHMoKQorIworIyBUdXJuIHRoZSBIb0ggdGhhdCBzdG9yZXMgdGhlIGNvbW1lbnRzIGludG8gYW4gYXJyYXkgZm9yIGVhc2llciBoYW5kbGluZy4KKyMKK3N1YiBfcHJlcGFyZV9jb21tZW50cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBjb21tZW50czsKKworCisgICAgIyBXZSBzb3J0IHRoZSBjb21tZW50cyBieSByb3cgYW5kIGNvbHVtbiBidXQgdGhhdCBpc24ndCBzdHJpY3RseSByZXF1aXJlZC4KKyAgICAjCisgICAgbXkgQHJvd3MgPSBzb3J0IHskYSA8PT4gJGJ9IGtleXMgJXskc2VsZi0+e19jb21tZW50c319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfY29tbWVudHN9LT57JHJvd319OworCisgICAgICAgIGZvciBteSAkY29sIChAY29scykgeworICAgICAgICAgICAgcHVzaCBAY29tbWVudHMsICRzZWxmLT57X2NvbW1lbnRzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2NvbW1lbnRzfSAgICAgICA9IHt9OworICAgICRzZWxmLT57X2NvbW1lbnRzX2FycmF5fSA9IFxAY29tbWVudHM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3ByZXBhcmVfY2hhcnRzKCkKKyMKKyMgVHVybiB0aGUgSG9IIHRoYXQgc3RvcmVzIHRoZSBjaGFydHMgaW50byBhbiBhcnJheSBmb3IgZWFzaWVyIGhhbmRsaW5nLgorIworc3ViIF9wcmVwYXJlX2NoYXJ0cyB7CisKKyAgICBteSAkc2VsZiAgICA9IHNoaWZ0OworCisgICAgbXkgJGNvdW50ICAgPSAwOworICAgIG15IEBjaGFydHM7CisKKworICAgICMgV2Ugc29ydCB0aGUgY2hhcnRzIGJ5IHJvdyBhbmQgY29sdW1uIGJ1dCB0aGF0IGlzbid0IHN0cmljdGx5IHJlcXVpcmVkLgorICAgICMKKyAgICBteSBAcm93cyA9IHNvcnQgeyRhIDw9PiAkYn0ga2V5cyAleyRzZWxmLT57X2NoYXJ0c319OworCisgICAgZm9yIG15ICRyb3cgKEByb3dzKSB7CisgICAgICAgIG15IEBjb2xzID0gc29ydCB7JGEgPD0+ICRifSBrZXlzICV7JHNlbGYtPntfY2hhcnRzfS0+eyRyb3d9fTsKKworICAgICAgICBmb3IgbXkgJGNvbCAoQGNvbHMpIHsKKyAgICAgICAgICAgIHB1c2ggQGNoYXJ0cywgJHNlbGYtPntfY2hhcnRzfS0+eyRyb3d9LT57JGNvbH07CisgICAgICAgICAgICAkY291bnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgICRzZWxmLT57X2NoYXJ0c30gICAgICAgPSB7fTsKKyAgICAkc2VsZi0+e19jaGFydHNfYXJyYXl9ID0gXEBjaGFydHM7CisKKyAgICByZXR1cm4gJGNvdW50OworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2ltYWdlcygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBpbWFnZXMuCisjCitzdWIgX3N0b3JlX2ltYWdlcyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMEVDOyAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgQGlkcyAgICAgICAgICAgICA9IEB7JHNlbGYtPntfb2JqZWN0X2lkcyAgfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSBAaW1hZ2VzICAgICAgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fTsKKyAgICBteSAkbnVtX2ltYWdlcyAgICAgID0gc2NhbGFyIEBpbWFnZXM7CisKKyAgICBteSAkbnVtX2ZpbHRlcnMgICAgID0gJHNlbGYtPntfZmlsdGVyX2NvdW50fTsKKyAgICBteSAkbnVtX2NvbW1lbnRzICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworICAgIG15ICRudW1fY2hhcnRzICAgICAgPSBAeyRzZWxmLT57X2NoYXJ0c19hcnJheSAgfX07CisKKyAgICAjIFNraXAgdGhpcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGltYWdlcy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1faW1hZ2VzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1faW1hZ2VzLTEpIHsKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAgICRpbWFnZXNbJGldLT5bMV07CisgICAgICAgIG15ICRuYW1lICAgICAgICA9ICAgJGltYWdlc1skaV0tPlsyXTsKKyAgICAgICAgbXkgJHhfb2Zmc2V0ICAgID0gICAkaW1hZ2VzWyRpXS0+WzNdOworICAgICAgICBteSAkeV9vZmZzZXQgICAgPSAgICRpbWFnZXNbJGldLT5bNF07CisgICAgICAgIG15ICRzY2FsZV94ICAgICA9ICAgJGltYWdlc1skaV0tPls1XTsKKyAgICAgICAgbXkgJHNjYWxlX3kgICAgID0gICAkaW1hZ2VzWyRpXS0+WzZdOworICAgICAgICBteSAkaW1hZ2VfaWQgICAgPSAgICRpbWFnZXNbJGldLT5bN107CisgICAgICAgIG15ICR0eXBlICAgICAgICA9ICAgJGltYWdlc1skaV0tPls4XTsKKyAgICAgICAgbXkgJHdpZHRoICAgICAgID0gICAkaW1hZ2VzWyRpXS0+WzldOworICAgICAgICBteSAkaGVpZ2h0ICAgICAgPSAgICRpbWFnZXNbJGldLT5bMTBdOworCisgICAgICAgICR3aWR0aCAgKj0gJHNjYWxlX3ggaWYgJHNjYWxlX3g7CisgICAgICAgICRoZWlnaHQgKj0gJHNjYWxlX3kgaWYgJHNjYWxlX3k7CisKKworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgcG9zaXRpb25zIG9mIGltYWdlIG9iamVjdC4KKyAgICAgICAgbXkgQHZlcnRpY2VzID0gJHNlbGYtPl9wb3NpdGlvbl9vYmplY3QoICRjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGhlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgaWYgKCRpID09IDApIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgID0gMTU2ICsgODQqKCRudW1faW1hZ2VzIC0xKTsKKyAgICAgICAgICAgIG15ICRzcGdyX2xlbmd0aCAgPSAxMzIgKyA4NCooJG51bV9pbWFnZXMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gMTIwICokbnVtX2NoYXJ0czsKKyAgICAgICAgICAgICAgICRzcGdyX2xlbmd0aCArPSAxMjAgKiRudW1fY2hhcnRzOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjggKiRudW1fY29tbWVudHM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gMTI4ICokbnVtX2NvbW1lbnRzOworCisKKworICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdfY29udGFpbmVyKCRkZ19sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGcoQGlkcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigkc3Bncl9sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDQwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3IoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDB4MCwgJHNwaWQrKywgMHgwMDA1KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig3Nik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCg3NSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9pbWFnZSgkaW1hZ2VfaWQpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigyLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2hpbGQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDc2KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDc1LCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2ltYWdlKCRpbWFnZV9pZCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDIsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAgICAgfQorCisgICAgICAgICRzZWxmLT5fc3RvcmVfb2JqX2ltYWdlKCRpKzEpOworICAgIH0KKworICAgICRzZWxmLT57X29iamVjdF9pZHN9LT5bMF0gPSAkc3BpZDsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0cygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBjaGFydHMuCisjCitzdWIgX3N0b3JlX2NoYXJ0cyB7CisKKyAgICBteSAkc2VsZiAgICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgICAgID0gMHgwMEVDOyAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICAgICAgPSAweDAwMDA7ICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgQGlkcyAgICAgICAgICAgICA9IEB7JHNlbGYtPntfb2JqZWN0X2lkc319OworICAgIG15ICRzcGlkICAgICAgICAgICAgPSBzaGlmdCBAaWRzOworCisgICAgbXkgQGNoYXJ0cyAgICAgICAgICA9IEB7JHNlbGYtPntfY2hhcnRzX2FycmF5fX07CisgICAgbXkgJG51bV9jaGFydHMgICAgICA9IHNjYWxhciBAY2hhcnRzOworCisgICAgbXkgJG51bV9maWx0ZXJzICAgICA9ICRzZWxmLT57X2ZpbHRlcl9jb3VudH07CisgICAgbXkgJG51bV9jb21tZW50cyAgICA9IEB7JHNlbGYtPntfY29tbWVudHNfYXJyYXl9fTsKKworICAgICMgTnVtYmVyIG9mIG9iamVjdHMgd3JpdHRlbiBzbyBmYXIuCisgICAgbXkgJG51bV9vYmplY3RzICAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2FycmF5fX07CisKKyAgICAjIFNraXAgdGhpcyBpZiB0aGVyZSBhcmVuJ3QgYW55IGNoYXJ0cy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1fY2hhcnRzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1fY2hhcnRzLTEgKSB7CisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICAgJGNoYXJ0c1skaV0tPlswXTsKKyAgICAgICAgbXkgJGNvbCAgICAgICAgID0gICAkY2hhcnRzWyRpXS0+WzFdOworICAgICAgICBteSAkY2hhcnQgICAgICAgID0gICAkY2hhcnRzWyRpXS0+WzJdOworICAgICAgICBteSAkeF9vZmZzZXQgICAgPSAgICRjaGFydHNbJGldLT5bM107CisgICAgICAgIG15ICR5X29mZnNldCAgICA9ICAgJGNoYXJ0c1skaV0tPls0XTsKKyAgICAgICAgbXkgJHNjYWxlX3ggICAgID0gICAkY2hhcnRzWyRpXS0+WzVdOworICAgICAgICBteSAkc2NhbGVfeSAgICAgPSAgICRjaGFydHNbJGldLT5bNl07CisgICAgICAgIG15ICR3aWR0aCAgICAgICA9ICAgNTI2OworICAgICAgICBteSAkaGVpZ2h0ICAgICAgPSAgIDMxOTsKKworICAgICAgICAkd2lkdGggICo9ICRzY2FsZV94IGlmICRzY2FsZV94OworICAgICAgICAkaGVpZ2h0ICo9ICRzY2FsZV95IGlmICRzY2FsZV95OworCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbnMgb2YgY2hhcnQgb2JqZWN0LgorICAgICAgICBteSBAdmVydGljZXMgPSAkc2VsZi0+X3Bvc2l0aW9uX29iamVjdCggJGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgICAgIGlmICgkaSA9PSAwIGFuZCBub3QgJG51bV9vYmplY3RzKSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBwYXJlbnQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRnX2xlbmd0aCAgICA9IDE5MiArIDEyMCooJG51bV9jaGFydHMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoICA9IDE2OCArIDEyMCooJG51bV9jaGFydHMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gIDk2ICokbnVtX2ZpbHRlcnM7CisKKyAgICAgICAgICAgICAgICRkZ19sZW5ndGggICArPSAxMjggKiRudW1fY29tbWVudHM7CisgICAgICAgICAgICAgICAkc3Bncl9sZW5ndGggKz0gMTI4ICokbnVtX2NvbW1lbnRzOworCisKKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX2RnX2NvbnRhaW5lcigkZGdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2RnKEBpZHMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3Bncl9jb250YWluZXIoJHNwZ3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig0MCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyKCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgweDAsICRzcGlkKyssIDB4MDAwNSk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoMTEyKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9jaGFydCgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigwLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgIyBXcml0ZSB0aGUgY2hpbGQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDExMik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgyMDEsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfY2hhcnQoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMCwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKworICAgICAgICB9CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9vYmpfY2hhcnQoJG51bV9vYmplY3RzKyRpKzEpOworICAgICAgICAkc2VsZi0+X3N0b3JlX2NoYXJ0X2JpbmFyeSgkY2hhcnQpOworICAgIH0KKworCisgICAgIyBTaW11bGF0ZSB0aGUgRVhURVJOU0hFRVQgbGluayBiZXR3ZWVuIHRoZSBjaGFydCBhbmQgZGF0YSB1c2luZyBhIGZvcm11bGEKKyAgICAjIHN1Y2ggYXMgJz1TaGVldDEhQTEnLgorICAgICMgVE9ETy4gV29uJ3Qgd29yayBmb3IgZXh0ZXJuYWwgZGF0YSByZWZzLiBBbHNvIHNob3VsZCB1c2UgYSBtb3JlIGRpcmVjdAorICAgICMgICAgICAgbWV0aG9kLgorICAgICMKKyAgICBteSAkZm9ybXVsYSA9ICI9JyRzZWxmLT57X25hbWV9JyFBMSI7CisgICAgJHNlbGYtPnN0b3JlX2Zvcm11bGEoJGZvcm11bGEpOworCisgICAgJHNlbGYtPntfb2JqZWN0X2lkc30tPlswXSA9ICRzcGlkOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX2NoYXJ0X2JpbmFyeQorIworIyBBZGQgdGhlIGJpbmFyeSBkYXRhIGZvciBhIGNoYXJ0LiBUaGlzIGNvdWxkIGVpdGhlciBiZSBmcm9tIGEgQ2hhcnQgb2JqZWN0CisjIG9yIGZyb20gYW4gZXh0ZXJuYWwgYmluYXJ5IGZpbGUgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkuCisjCitzdWIgX3N0b3JlX2NoYXJ0X2JpbmFyeSB7CisKKyAgICBteSAkc2VsZiAgPSBzaGlmdDsKKyAgICBteSAkY2hhcnQgPSAkX1swXTsKKyAgICBteSAkdG1wOworCisKKyAgICBpZiAoIHJlZiAkY2hhcnQgKSB7CisgICAgICAgICRjaGFydC0+X2Nsb3NlKCk7CisgICAgICAgIG15ICR0bXAgPSAkY2hhcnQtPmdldF9kYXRhKCk7CisgICAgICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wICk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIG15ICRmaWxlaGFuZGxlID0gRmlsZUhhbmRsZS0+bmV3KCAkY2hhcnQgKQorICAgICAgICAgIG9yIGRpZSAiQ291bGRuJ3Qgb3BlbiAkY2hhcnQgaW4gaW5zZXJ0X2NoYXJ0KCk6ICQhLlxuIjsKKworICAgICAgICBiaW5tb2RlKCAkZmlsZWhhbmRsZSApOworCisgICAgICAgIHdoaWxlICggcmVhZCggJGZpbGVoYW5kbGUsICR0bXAsIDQwOTYgKSApIHsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCAkdG1wICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZmlsdGVycygpCisjCisjIFN0b3JlIHRoZSBjb2xsZWN0aW9ucyBvZiByZWNvcmRzIHRoYXQgbWFrZSB1cCBmaWx0ZXJzLgorIworc3ViIF9zdG9yZV9maWx0ZXJzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSAkZmlsdGVyX2FyZWEgICAgID0gJHNlbGYtPntfZmlsdGVyX2FyZWF9OworICAgIG15ICRudW1fZmlsdGVycyAgICAgPSAkc2VsZi0+e19maWx0ZXJfY291bnR9OworCisgICAgbXkgJG51bV9jb21tZW50cyAgICA9IEB7JHNlbGYtPntfY29tbWVudHNfYXJyYXl9fTsKKworICAgICMgTnVtYmVyIG9mIG9iamVjdHMgd3JpdHRlbiBzbyBmYXIuCisgICAgbXkgJG51bV9vYmplY3RzICAgICA9IEB7JHNlbGYtPntfaW1hZ2VzX2FycmF5fX0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgQHskc2VsZi0+e19jaGFydHNfYXJyYXl9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgZmlsdGVycy4KKyAgICByZXR1cm4gdW5sZXNzICRudW1fZmlsdGVyczsKKworCisgICAgbXkgKCRyb3cxLCAkcm93MiwgJGNvbDEsICRjb2wyKSA9IEAkZmlsdGVyX2FyZWE7CisKKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9maWx0ZXJzLTEgKSB7CisKKyAgICAgICAgbXkgQHZlcnRpY2VzID0gKCAkY29sMSArJGksCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkcm93MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICRjb2wxICskaSArMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICRyb3cxICsxLAorICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIGlmICgkaSA9PSAwIGFuZCBub3QgJG51bV9vYmplY3RzKSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBwYXJlbnQgTVNPRFJBV0lJTkcgcmVjb3JkLgorICAgICAgICAgICAgbXkgJGRnX2xlbmd0aCAgICA9IDE2OCArIDk2KigkbnVtX2ZpbHRlcnMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoICA9IDE0NCArIDk2KigkbnVtX2ZpbHRlcnMgLTEpOworCisgICAgICAgICAgICAgICAkZGdfbGVuZ3RoICAgKz0gMTI4ICokbnVtX2NvbW1lbnRzOworICAgICAgICAgICAgICAgJHNwZ3JfbGVuZ3RoICs9IDEyOCAqJG51bV9jb21tZW50czsKKworCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19kZ19jb250YWluZXIoJGRnX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19kZyhAaWRzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3JfY29udGFpbmVyKCRzcGdyX2xlbmd0aCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoNDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BncigpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMHgwLCAkc3BpZCsrLCAweDAwMDUpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDg4KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMSwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9maWx0ZXIoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9hbmNob3IoMSwgQHZlcnRpY2VzKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX2NsaWVudF9kYXRhKCk7CisKKyAgICAgICAgICAgICRsZW5ndGggICAgICAgICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgICAgIG15ICRoZWFkZXIgICAgICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgICAgICAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIGNoaWxkIE1TT0RSQVdJSU5HIHJlY29yZC4KKyAgICAgICAgICAgIG15ICRkYXRhICAgICAgICA9ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcig4OCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcCgyMDEsICRzcGlkKyssIDB4MEEwMCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19vcHRfZmlsdGVyKCk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDEsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisKKyAgICAgICAgfQorCisgICAgICAgICRzZWxmLT5fc3RvcmVfb2JqX2ZpbHRlcigkbnVtX29iamVjdHMrJGkrMSwgJGNvbDEgKyRpKTsKKyAgICB9CisKKworICAgICMgU2ltdWxhdGUgdGhlIEVYVEVSTlNIRUVUIGxpbmsgYmV0d2VlbiB0aGUgZmlsdGVyIGFuZCBkYXRhIHVzaW5nIGEgZm9ybXVsYQorICAgICMgc3VjaCBhcyAnPVNoZWV0MSFBMScuCisgICAgIyBUT0RPLiBXb24ndCB3b3JrIGZvciBleHRlcm5hbCBkYXRhIHJlZnMuIEFsc28gc2hvdWxkIHVzZSBhIG1vcmUgZGlyZWN0CisgICAgIyAgICAgICBtZXRob2QuCisgICAgIworICAgIG15ICRmb3JtdWxhID0gIj0nJHNlbGYtPntfbmFtZX0nIUExIjsKKyAgICAkc2VsZi0+c3RvcmVfZm9ybXVsYSgkZm9ybXVsYSk7CisKKyAgICAkc2VsZi0+e19vYmplY3RfaWRzfS0+WzBdID0gJHNwaWQ7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfY29tbWVudHMoKQorIworIyBTdG9yZSB0aGUgY29sbGVjdGlvbnMgb2YgcmVjb3JkcyB0aGF0IG1ha2UgdXAgY2VsbCBjb21tZW50cy4KKyMKKyMgTk9URTogV2Ugd3JpdGUgdGhlIGNvbW1lbnQgb2JqZWN0cyBsYXN0IHNpbmNlIHRoYXQgbWFrZXMgaXQgYSBsaXR0bGUgZWFzaWVyCisjIHRvIHdyaXRlIHRoZSBOT1RFIHJlY29yZHMgZGlyZWN0bHkgYWZ0ZXIgdGhlIE1TT0RSQVdJSU5HIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX2NvbW1lbnRzIHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgICAgICA9IDB4MDAwMDsgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSBAaWRzICAgICAgICAgICAgID0gQHskc2VsZi0+e19vYmplY3RfaWRzfX07CisgICAgbXkgJHNwaWQgICAgICAgICAgICA9IHNoaWZ0IEBpZHM7CisKKyAgICBteSBAY29tbWVudHMgICAgICAgID0gQHskc2VsZi0+e19jb21tZW50c19hcnJheX19OworICAgIG15ICRudW1fY29tbWVudHMgICAgPSBzY2FsYXIgQGNvbW1lbnRzOworCisgICAgIyBOdW1iZXIgb2Ygb2JqZWN0cyB3cml0dGVuIHNvIGZhci4KKyAgICBteSAkbnVtX29iamVjdHMgICAgID0gQHskc2VsZi0+e19pbWFnZXNfYXJyYXl9fQorICAgICAgICAgICAgICAgICAgICAgICAgKyAgICRzZWxmLT57X2ZpbHRlcl9jb3VudH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsgQHskc2VsZi0+e19jaGFydHNfYXJyYXl9fTsKKworICAgICMgU2tpcCB0aGlzIGlmIHRoZXJlIGFyZW4ndCBhbnkgY29tbWVudHMuCisgICAgcmV0dXJuIHVubGVzcyAkbnVtX2NvbW1lbnRzOworCisgICAgZm9yIG15ICRpICgwIC4uICRudW1fY29tbWVudHMtMSkgeworCisgICAgICAgIG15ICRyb3cgICAgICAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAgICRjb21tZW50c1skaV0tPlsxXTsKKyAgICAgICAgbXkgJHN0ciAgICAgICAgID0gICAkY29tbWVudHNbJGldLT5bMl07CisgICAgICAgIG15ICRlbmNvZGluZyAgICA9ICAgJGNvbW1lbnRzWyRpXS0+WzNdOworICAgICAgICBteSAkdmlzaWJsZSAgICAgPSAgICRjb21tZW50c1skaV0tPls2XTsKKyAgICAgICAgbXkgJGNvbG9yICAgICAgID0gICAkY29tbWVudHNbJGldLT5bN107CisgICAgICAgIG15IEB2ZXJ0aWNlcyAgICA9IEB7JGNvbW1lbnRzWyRpXS0+WzhdfTsKKyAgICAgICAgbXkgJHN0cl9sZW4gICAgID0gbGVuZ3RoICRzdHI7CisgICAgICAgICAgICRzdHJfbGVuICAgIC89IDIgaWYgJGVuY29kaW5nOyAjIE51bSBvZiBjaGFycyBub3QgYnl0ZXMuCisgICAgICAgIG15ICRmb3JtYXRzICAgICA9IFtbMCwgOV0sIFskc3RyX2xlbiwgMF1dOworCisKKyAgICAgICAgaWYgKCRpID09IDAgYW5kIG5vdCAkbnVtX29iamVjdHMpIHsKKyAgICAgICAgICAgICMgV3JpdGUgdGhlIHBhcmVudCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGdfbGVuZ3RoICAgPSAyMDAgKyAxMjgqKCRudW1fY29tbWVudHMgLTEpOworICAgICAgICAgICAgbXkgJHNwZ3JfbGVuZ3RoID0gMTc2ICsgMTI4KigkbnVtX2NvbW1lbnRzIC0xKTsKKworICAgICAgICAgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fZGdfY29udGFpbmVyKCRkZ19sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fZGcoQGlkcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19zcGdyX2NvbnRhaW5lcigkc3Bncl9sZW5ndGgpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3BfY29udGFpbmVyKDQwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwZ3IoKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDB4MCwgJHNwaWQrKywgMHgwMDA1KTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigxMjApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fc3AoMjAyLCAkc3BpZCsrLCAweDBBMDApOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fb3B0X2NvbW1lbnQoMHg4MCwgJHZpc2libGUsICRjb2xvcik7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfYW5jaG9yKDMsIEB2ZXJ0aWNlcyk7CisgICAgICAgICAgICAgICAkZGF0YSAgICAgICAuPSAkc2VsZi0+X3N0b3JlX21zb19jbGllbnRfZGF0YSgpOworCisgICAgICAgICAgICAkbGVuZ3RoICAgICAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgICAgICAgICBteSAkaGVhZGVyICAgICAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworICAgICAgICAgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAjIFdyaXRlIHRoZSBjaGlsZCBNU09EUkFXSUlORyByZWNvcmQuCisgICAgICAgICAgICBteSAkZGF0YSAgICAgICAgPSAkc2VsZi0+X3N0b3JlX21zb19zcF9jb250YWluZXIoMTIwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX3NwKDIwMiwgJHNwaWQrKywgMHgwQTAwKTsKKyAgICAgICAgICAgICAgICRkYXRhICAgICAgIC49ICRzZWxmLT5fc3RvcmVfbXNvX29wdF9jb21tZW50KDB4ODAsICR2aXNpYmxlLCAkY29sb3IpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigzLCBAdmVydGljZXMpOworICAgICAgICAgICAgICAgJGRhdGEgICAgICAgLj0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X2RhdGEoKTsKKworICAgICAgICAgICAgJGxlbmd0aCAgICAgICAgID0gbGVuZ3RoICRkYXRhOworICAgICAgICAgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICAgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworCisgICAgICAgIH0KKworICAgICAgICAkc2VsZi0+X3N0b3JlX29ial9jb21tZW50KCRudW1fb2JqZWN0cyskaSsxKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9tc29fZHJhd2luZ190ZXh0X2JveCgpOworICAgICAgICAkc2VsZi0+X3N0b3JlX3R4bygkc3RyX2xlbik7CisgICAgICAgICRzZWxmLT5fc3RvcmVfdHhvX2NvbnRpbnVlXzEoJHN0ciwgJGVuY29kaW5nKTsKKyAgICAgICAgJHNlbGYtPl9zdG9yZV90eG9fY29udGludWVfMigkZm9ybWF0cyk7CisgICAgfQorCisKKyAgICAjIFdyaXRlIHRoZSBOT1RFIHJlY29yZHMgYWZ0ZXIgTVNPRFJBV0lJTkcgcmVjb3Jkcy4KKyAgICBmb3IgbXkgJGkgKDAgLi4gJG51bV9jb21tZW50cy0xKSB7CisKKyAgICAgICAgbXkgJHJvdyAgICAgICAgID0gJGNvbW1lbnRzWyRpXS0+WzBdOworICAgICAgICBteSAkY29sICAgICAgICAgPSAkY29tbWVudHNbJGldLT5bMV07CisgICAgICAgIG15ICRhdXRob3IgICAgICA9ICRjb21tZW50c1skaV0tPls0XTsKKyAgICAgICAgbXkgJGF1dGhvcl9lbmMgID0gJGNvbW1lbnRzWyRpXS0+WzVdOworICAgICAgICBteSAkdmlzaWJsZSAgICAgPSAkY29tbWVudHNbJGldLT5bNl07CisKKyAgICAgICAgJHNlbGYtPl9zdG9yZV9ub3RlKCRyb3csICRjb2wsICRudW1fb2JqZWN0cyskaSsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJGF1dGhvciwgJGF1dGhvcl9lbmMsICR2aXNpYmxlKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX2RnX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGdDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fZGdfY29udGFpbmVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDAyOworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMF07CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19kZygpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgRGcgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fZGcgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDg7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAkX1swXTsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSA4OworCisgICAgbXkgJG51bV9zaGFwZXMgID0gJF9bMV07CisgICAgbXkgJG1heF9zcGlkICAgID0gJF9bMl07CisKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICJWViIsICRudW1fc2hhcGVzLCAkbWF4X3NwaWQ7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3Bncl9jb250YWluZXIoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwZ3JDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3Bncl9jb250YWluZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDM7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTU7CisgICAgbXkgJGluc3RhbmNlICAgID0gMDsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSAkX1swXTsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX3NwX2NvbnRhaW5lcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgU3BDb250YWluZXIgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fc3BfY29udGFpbmVyIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDA0OworICAgIG15ICR2ZXJzaW9uICAgICA9IDE1OworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gJF9bMF07CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19zcGdyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBTcGdyIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwZ3IgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMDk7CisgICAgbXkgJHZlcnNpb24gICAgID0gMTsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9IHBhY2sgIlZWVlYiLCAwLCAwLCAwLCAwOworICAgIG15ICRsZW5ndGggICAgICA9IDE2OworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fc3AoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIFNwIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX3NwIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBBOworICAgIG15ICR2ZXJzaW9uICAgICA9IDI7CisgICAgbXkgJGluc3RhbmNlICAgID0gJF9bMF07CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gODsKKworICAgIG15ICRzcGlkICAgICAgICA9ICRfWzFdOworICAgIG15ICRvcHRpb25zICAgICA9ICRfWzJdOworCisgICAgJGRhdGEgICAgICAgICAgID0gcGFjayAiVlYiLCAkc3BpZCwgJG9wdGlvbnM7CisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fb3B0X2NvbW1lbnQoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIE9wdCByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIE1TT0RSQVdJTkcuCisjCitzdWIgX3N0b3JlX21zb19vcHRfY29tbWVudCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDk7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gNTQ7CisKKyAgICBteSAkc3BpZCAgICAgICAgPSAkX1swXTsKKyAgICBteSAkdmlzaWJsZSAgICAgPSAkX1sxXTsKKyAgICBteSAkY29sb3VyICAgICAgPSAkX1syXSB8fCAweDUwOworCisKKyAgICAjIFVzZSB0aGUgdmlzaWJsZSBmbGFnIGlmIHNldCBieSB0aGUgdXNlciBvciBlbHNlIHVzZSB0aGUgd29ya3NoZWV0IHZhbHVlLgorICAgICMgTm90ZSB0aGF0IHRoZSB2YWx1ZSB1c2VkIGlzIHRoZSBvcHBvc2l0ZSBvZiBfc3RvcmVfbm90ZSgpLgorICAgICMKKyAgICBpZiAoZGVmaW5lZCAkdmlzaWJsZSkgeworICAgICAgICAkdmlzaWJsZSA9ICR2aXNpYmxlICAgICAgICAgICAgICAgICAgID8gMHgwMDAwIDogMHgwMDAyOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHZpc2libGUgPSAkc2VsZi0+e19jb21tZW50c192aXNpYmxlfSA/IDB4MDAwMCA6IDB4MDAwMjsKKyAgICB9CisKKworICAgICRkYXRhICAgID0gcGFjayAiViIsICAkc3BpZDsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkgqIiwgJzAwMDBCRjAwMDgwMDA4MDA1ODAxMDAwMDAwMDA4MTAxJyA7CisgICAgJGRhdGEgICAuPSBwYWNrICJDIiwgICRjb2xvdXI7CisgICAgJGRhdGEgICAuPSBwYWNrICJIKiIsICcwMDAwMDg4MzAxNTAwMDAwMDhCRjAxMTAwMDExMDAwMScgLgorICAgICAgICAgICAgICAgICAgICAgICAgICAnMDIwMDAwMDAwMDNGMDIwMzAwMDMwMEJGMDMnOworICAgICRkYXRhICAgLj0gcGFjayAidiIsICAkdmlzaWJsZTsKKyAgICAkZGF0YSAgIC49IHBhY2sgIkgqIiwgJzBBMDAnOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fb3B0X2ltYWdlKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBPcHQgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fb3B0X2ltYWdlIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHR5cGUgICAgICAgID0gMHhGMDBCOworICAgIG15ICR2ZXJzaW9uICAgICA9IDM7CisgICAgbXkgJGluc3RhbmNlICAgID0gMzsKKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsKKyAgICBteSAkbGVuZ3RoICAgICAgPSB1bmRlZjsKKyAgICBteSAkc3BpZCAgICAgICAgPSAkX1swXTsKKworICAgICRkYXRhICAgID0gcGFjayAndicsIDB4NDEwNDsgICAgICAgICMgQmxpcCAtPiBwaWIKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAkc3BpZDsKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQkY7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZk5vRmlsbEhpdFRlc3QKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDEwMDAwOworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDNCRjsgICAgICAgICMgR3JvdXAgU2hhcGUgLT4gZlByaW50CisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfbXNvX29wdF9jaGFydCgpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgT3B0IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX29wdF9jaGFydCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDk7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gdW5kZWY7CisKKyAgICAkZGF0YSAgICA9IHBhY2sgJ3YnLCAweDAwN0Y7ICAgICAgICAjIFByb3RlY3Rpb24gLT4gZkxvY2tBZ2FpbnN0R3JvdXBpbmcKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAxMDQwMTA0OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMEJGOyAgICAgICAgIyBUZXh0IC0+IGZGaXRUZXh0VG9TaGFwZQorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDg7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxODE7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZmlsbENvbG9yCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwODAwMDA0RSA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxODM7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZmlsbEJhY2tDb2xvcgorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDgwMDAwNEQ7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxQkY7ICAgICAgICAjIEZpbGwgU3R5bGUgLT4gZk5vRmlsbEhpdFRlc3QKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMTEwMDEwOworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMUMwOyAgICAgICAgIyBMaW5lIFN0eWxlIC0+IGxpbmVDb2xvcgorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDgwMDAwNEQ7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAxRkY7ICAgICAgICAjIExpbmUgU3R5bGUgLT4gZk5vTGluZURyYXdEYXNoCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDA4MDAwODsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDIzRjsgICAgICAgICMgU2hhZG93IFN0eWxlIC0+IGZzaGFkb3dPYnNjdXJlZAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwMjAwMDA7CisKKyAgICAkZGF0YSAgIC49IHBhY2sgJ3YnLCAweDAzQkY7ICAgICAgICAjIEdyb3VwIFNoYXBlIC0+IGZQcmludAorICAgICRkYXRhICAgLj0gcGFjayAnVicsIDB4MDAwODAwMDA7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX21zb19vcHRfZmlsdGVyKCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBPcHQgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fb3B0X2ZpbHRlciB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwQjsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAzOworICAgIG15ICRpbnN0YW5jZSAgICA9IDU7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gdW5kZWY7CisKKworCisgICAgJGRhdGEgICAgPSBwYWNrICd2JywgMHgwMDdGOyAgICAgICAgIyBQcm90ZWN0aW9uIC0+IGZMb2NrQWdhaW5zdEdyb3VwaW5nCisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMTA0MDEwNDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDBCRjsgICAgICAgICMgVGV4dCAtPiBmRml0VGV4dFRvU2hhcGUKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDA4OworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwMUJGOyAgICAgICAgIyBGaWxsIFN0eWxlIC0+IGZOb0ZpbGxIaXRUZXN0CisgICAgJGRhdGEgICAuPSBwYWNrICdWJywgMHgwMDAxMDAwMDsKKworICAgICRkYXRhICAgLj0gcGFjayAndicsIDB4MDFGRjsgICAgICAgICMgTGluZSBTdHlsZSAtPiBmTm9MaW5lRHJhd0Rhc2gKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMDgwMDAwOworCisgICAgJGRhdGEgICAuPSBwYWNrICd2JywgMHgwM0JGOyAgICAgICAgIyBHcm91cCBTaGFwZSAtPiBmUHJpbnQKKyAgICAkZGF0YSAgIC49IHBhY2sgJ1YnLCAweDAwMEEwMDAwOworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X2FuY2hvcigpCisjCisjIFdyaXRlIHRoZSBFc2NoZXIgQ2xpZW50QW5jaG9yIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX2NsaWVudF9hbmNob3IgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMTA7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDE4OworCisgICAgbXkgJGZsYWcgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkY29sX3N0YXJ0ICAgPSAkX1swXTsgICAgIyBDb2wgY29udGFpbmluZyB1cHBlciBsZWZ0IGNvcm5lciBvZiBvYmplY3QKKyAgICBteSAkeDEgICAgICAgICAgPSAkX1sxXTsgICAgIyBEaXN0YW5jZSB0byBsZWZ0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X3N0YXJ0ICAgPSAkX1syXTsgICAgIyBSb3cgY29udGFpbmluZyB0b3AgbGVmdCBjb3JuZXIgb2Ygb2JqZWN0CisgICAgbXkgJHkxICAgICAgICAgID0gJF9bM107ICAgICMgRGlzdGFuY2UgdG8gdG9wIG9mIG9iamVjdAorCisgICAgbXkgJGNvbF9lbmQgICAgID0gJF9bNF07ICAgICMgQ29sIGNvbnRhaW5pbmcgbG93ZXIgcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR4MiAgICAgICAgICA9ICRfWzVdOyAgICAjIERpc3RhbmNlIHRvIHJpZ2h0IHNpZGUgb2Ygb2JqZWN0CisKKyAgICBteSAkcm93X2VuZCAgICAgPSAkX1s2XTsgICAgIyBSb3cgY29udGFpbmluZyBib3R0b20gcmlnaHQgY29ybmVyIG9mIG9iamVjdAorICAgIG15ICR5MiAgICAgICAgICA9ICRfWzddOyAgICAjIERpc3RhbmNlIHRvIGJvdHRvbSBvZiBvYmplY3QKKworICAgICRkYXRhICAgPSBwYWNrICJ2OSIsICAgICRmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb2xfc3RhcnQsICR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcm93X3N0YXJ0LCAkeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbF9lbmQsICAgJHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyb3dfZW5kLCAgICR5MjsKKworCisKKyAgICByZXR1cm4gJHNlbGYtPl9hZGRfbXNvX2dlbmVyaWMoJHR5cGUsICR2ZXJzaW9uLCAkaW5zdGFuY2UsICRkYXRhLCAkbGVuZ3RoKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X2RhdGEoKQorIworIyBXcml0ZSB0aGUgRXNjaGVyIENsaWVudERhdGEgcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBNU09EUkFXSU5HLgorIworc3ViIF9zdG9yZV9tc29fY2xpZW50X2RhdGEgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkdHlwZSAgICAgICAgPSAweEYwMTE7CisgICAgbXkgJHZlcnNpb24gICAgID0gMDsKKyAgICBteSAkaW5zdGFuY2UgICAgPSAwOworICAgIG15ICRkYXRhICAgICAgICA9ICcnOworICAgIG15ICRsZW5ndGggICAgICA9IDA7CisKKworICAgIHJldHVybiAkc2VsZi0+X2FkZF9tc29fZ2VuZXJpYygkdHlwZSwgJHZlcnNpb24sICRpbnN0YW5jZSwgJGRhdGEsICRsZW5ndGgpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9jb21tZW50KCkKKyMKKyMgV3JpdGUgdGhlIE9CSiByZWNvcmQgdGhhdCBpcyBwYXJ0IG9mIGNlbGwgY29tbWVudHMuCisjCitzdWIgX3N0b3JlX29ial9jb21tZW50IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDVEOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMzQ7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRvYmpfaWQgICAgICA9ICRfWzBdOyAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJG9ial90eXBlICAgID0gMHgwMDE5OyAgICMgT2JqZWN0IHR5cGUgKGNvbW1lbnQpLgorICAgIG15ICRkYXRhICAgICAgICA9ICcnOyAgICAgICAjIFJlY29yZCBkYXRhLgorCisgICAgbXkgJHN1Yl9yZWNvcmQgID0gMHgwMDAwOyAgICMgU3ViLXJlY29yZCBpZGVudGlmaWVyLgorICAgIG15ICRzdWJfbGVuZ3RoICA9IDB4MDAwMDsgICAjIExlbmd0aCBvZiBzdWItcmVjb3JkLgorICAgIG15ICRzdWJfZGF0YSAgICA9ICcnOyAgICAgICAjIERhdGEgb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkb3B0aW9ucyAgICAgPSAweDQwMTE7CisgICAgbXkgJHJlc2VydmVkICAgID0gMHgwMDAwOworCisgICAgIyBBZGQgZnRDbW8gKGNvbW1vbiBvYmplY3QgZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDE1OyAgICMgZnRDbW8KKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAidnZ2VlZWIiwgJG9ial90eXBlLCAkb2JqX2lkLCAgICRvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXNlcnZlZCwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQ7CisgICAgJGRhdGEgICAgICAgICAgID0gcGFjaygidnYiLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoKTsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0TnRzIChub3RlIHN0cnVjdHVyZSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDBEOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMTY7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAiVlZWVlZ2IiwgKCRyZXNlcnZlZCkgeCA2OworICAgICRkYXRhICAgICAgICAgIC49IHBhY2soInZ2IiwgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aCk7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisKKyAgICAjIEFkZCBmdEVuZCAoZW5kIG9mIG9iamVjdCkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDAwOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDA7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjaygidnYiLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoKTsKKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9pbWFnZSgpCisjCisjIFdyaXRlIHRoZSBPQkogcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBpbWFnZSByZWNvcmRzLgorIworc3ViIF9zdG9yZV9vYmpfaW1hZ2UgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAyNjsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMDg7ICAgIyBPYmplY3QgdHlwZSAoUGljdHVyZSkuCisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7ICAgICAgICMgUmVjb3JkIGRhdGEuCisKKyAgICBteSAkc3ViX3JlY29yZCAgPSAweDAwMDA7ICAgIyBTdWItcmVjb3JkIGlkZW50aWZpZXIuCisgICAgbXkgJHN1Yl9sZW5ndGggID0gMHgwMDAwOyAgICMgTGVuZ3RoIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJHN1Yl9kYXRhICAgID0gJyc7ICAgICAgICMgRGF0YSBvZiBzdWItcmVjb3JkLgorICAgIG15ICRvcHRpb25zICAgICA9IDB4NjAxMTsKKyAgICBteSAkcmVzZXJ2ZWQgICAgPSAweDAwMDA7CisKKyAgICAjIEFkZCBmdENtbyAoY29tbW9uIG9iamVjdCBkYXRhKSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMTU7ICAgIyBmdENtbworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAxMjsKKyAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICd2dnZWVlYnLCAkb2JqX3R5cGUsICRvYmpfaWQsICAgJG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJlc2VydmVkLCAkcmVzZXJ2ZWQsICRyZXNlcnZlZDsKKyAgICAkZGF0YSAgICAgICAgICAgPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisKKyAgICAjIEFkZCBmdENmIChDbGlwYm9hcmQgZm9ybWF0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDc7ICAgIyBmdENmCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDAyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3YnLCAgICAgIDB4RkZGRjsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisgICAgJGRhdGEgICAgICAgICAgLj0gJHN1Yl9kYXRhOworCisgICAgIyBBZGQgZnRQaW9HcmJpdCAoUGljdHVyZSBvcHRpb24gZmxhZ3MpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwODsgICAjIGZ0UGlvR3JiaXQKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDI7CisgICAgJHN1Yl9kYXRhICAgICAgID0gcGFjayAndicsICAgICAgMHgwMDAxOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0RW5kIChlbmQgb2Ygb2JqZWN0KSBzdWJvYmplY3QKKyAgICAkc3ViX3JlY29yZCAgICAgPSAweDAwMDA7ICAgIyBmdE50cworICAgICRzdWJfbGVuZ3RoICAgICA9IDB4MDAwMDsKKyAgICAkZGF0YSAgICAgICAgICAuPSBwYWNrICd2dicsICAgICAkc3ViX3JlY29yZCwgJHN1Yl9sZW5ndGg7CisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgID0gcGFjaygndnYnLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9vYmpfY2hhcnQoKQorIworIyBXcml0ZSB0aGUgT0JKIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgY2hhcnQgcmVjb3Jkcy4KKyMKK3N1YiBfc3RvcmVfb2JqX2NoYXJ0IHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDVEOyAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMUE7ICAgIyBCeXRlcyB0byBmb2xsb3cKKworICAgIG15ICRvYmpfaWQgICAgICA9ICRfWzBdOyAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJG9ial90eXBlICAgID0gMHgwMDA1OyAgICMgT2JqZWN0IHR5cGUgKGNoYXJ0KS4KKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsgICAgICAgIyBSZWNvcmQgZGF0YS4KKworICAgIG15ICRzdWJfcmVjb3JkICA9IDB4MDAwMDsgICAjIFN1Yi1yZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkc3ViX2xlbmd0aCAgPSAweDAwMDA7ICAgIyBMZW5ndGggb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkc3ViX2RhdGEgICAgPSAnJzsgICAgICAgIyBEYXRhIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJG9wdGlvbnMgICAgID0gMHg2MDExOworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsKKworICAgICMgQWRkIGZ0Q21vIChjb21tb24gb2JqZWN0IGRhdGEpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAxNTsgICAjIGZ0Q21vCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDEyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3Z2dlZWVicsICRvYmpfdHlwZSwgJG9ial9pZCwgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwgJHJlc2VydmVkOworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKyAgICAjIEFkZCBmdEVuZCAoZW5kIG9mIG9iamVjdCkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDAwOyAgICMgZnROdHMKKyAgICAkc3ViX2xlbmd0aCAgICAgPSAweDAwMDA7CisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyICA9IHBhY2soJ3Z2JywgICAgICAgICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgJHNlbGYtPl9hcHBlbmQoJGhlYWRlciwgJGRhdGEpOworCit9CisKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX29ial9maWx0ZXIoKQorIworIyBXcml0ZSB0aGUgT0JKIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgZmlsdGVyIHJlY29yZHMuCisjCitzdWIgX3N0b3JlX29ial9maWx0ZXIgeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwNUQ7ICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDA0NjsgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICMgT2JqZWN0IElEIG51bWJlci4KKyAgICBteSAkb2JqX3R5cGUgICAgPSAweDAwMTQ7ICAgIyBPYmplY3QgdHlwZSAoY29tYm8gYm94KS4KKyAgICBteSAkZGF0YSAgICAgICAgPSAnJzsgICAgICAgIyBSZWNvcmQgZGF0YS4KKworICAgIG15ICRzdWJfcmVjb3JkICA9IDB4MDAwMDsgICAjIFN1Yi1yZWNvcmQgaWRlbnRpZmllci4KKyAgICBteSAkc3ViX2xlbmd0aCAgPSAweDAwMDA7ICAgIyBMZW5ndGggb2Ygc3ViLXJlY29yZC4KKyAgICBteSAkc3ViX2RhdGEgICAgPSAnJzsgICAgICAgIyBEYXRhIG9mIHN1Yi1yZWNvcmQuCisgICAgbXkgJG9wdGlvbnMgICAgID0gMHgyMTAxOworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsKKworICAgICMgQWRkIGZ0Q21vIChjb21tb24gb2JqZWN0IGRhdGEpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAxNTsgICAjIGZ0Q21vCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDEyOworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ3Z2dlZWVicsICRvYmpfdHlwZSwgJG9ial9pZCwgICAkb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzZXJ2ZWQsICRyZXNlcnZlZCwgJHJlc2VydmVkOworICAgICRkYXRhICAgICAgICAgICA9IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKyAgICAjIEFkZCBmdFNicyBTY3JvbGwgYmFyIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwQzsgICAjIGZ0U2JzCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDE0OworICAgICRzdWJfZGF0YSAgICAgICA9IHBhY2sgJ0gqJywgJzAwMDAwMDAwMDAwMDAwMDA2NDAwMDEwMDBBMDAwMDAwMTAwMDAxMDAnOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgICAgICRzdWJfcmVjb3JkLCAkc3ViX2xlbmd0aDsKKyAgICAkZGF0YSAgICAgICAgICAuPSAkc3ViX2RhdGE7CisKKworICAgICMgQWRkIGZ0TGJzRGF0YSAoTGlzdCBib3ggZGF0YSkgc3Vib2JqZWN0CisgICAgJHN1Yl9yZWNvcmQgICAgID0gMHgwMDEzOyAgICMgZnRMYnNEYXRhCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgxRkVFOyAgICMgU3BlY2lhbCBjYXNlICh1bmRvY3VtZW50ZWQpLgorCisKKyAgICAjIElmIHRoZSBmaWx0ZXIgaXMgYWN0aXZlIHdlIHNldCBvbmUgb2YgdGhlIHVuZG9jdW1lbnRlZCBmbGFncy4KKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKworICAgIGlmICgkc2VsZi0+e19maWx0ZXJfY29sc30tPnskY29sfSkgeworICAgICAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAxMDAwMTAzMDAwMDBBMDAwODAwNTcwMCc7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkc3ViX2RhdGEgICAgICAgPSBwYWNrICdIKicsICcwMDAwMDAwMDAxMDAwMTAzMDAwMDAyMDAwODAwNTcwMCc7CisgICAgfQorCisgICAgJGRhdGEgICAgICAgICAgLj0gcGFjayAndnYnLCAgICAgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworICAgICRkYXRhICAgICAgICAgIC49ICRzdWJfZGF0YTsKKworCisgICAgIyBBZGQgZnRFbmQgKGVuZCBvZiBvYmplY3QpIHN1Ym9iamVjdAorICAgICRzdWJfcmVjb3JkICAgICA9IDB4MDAwMDsgICAjIGZ0TnRzCisgICAgJHN1Yl9sZW5ndGggICAgID0gMHgwMDAwOworICAgICRkYXRhICAgICAgICAgIC49IHBhY2sgJ3Z2JywgJHN1Yl9yZWNvcmQsICRzdWJfbGVuZ3RoOworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCd2dicsICAgICAgICAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fZHJhd2luZ190ZXh0X2JveCgpCisjCisjIFdyaXRlIHRoZSBNU09EUkFXSU5HIENsaWVudFRleHRib3ggcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjb21tZW50cy4KKyMKK3N1YiBfc3RvcmVfbXNvX2RyYXdpbmdfdGV4dF9ib3ggeworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAwRUM7ICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDA4OyAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKworCisgICAgbXkgJGRhdGEgICAgICAgID0gJHNlbGYtPl9zdG9yZV9tc29fY2xpZW50X3RleHRfYm94KCk7CisgICAgbXkgJGhlYWRlciAgICAgID0gcGFjaygidnYiLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9tc29fY2xpZW50X3RleHRfYm94KCkKKyMKKyMgV3JpdGUgdGhlIEVzY2hlciBDbGllbnRUZXh0Ym94IHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgTVNPRFJBV0lORy4KKyMKK3N1YiBfc3RvcmVfbXNvX2NsaWVudF90ZXh0X2JveCB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICR0eXBlICAgICAgICA9IDB4RjAwRDsKKyAgICBteSAkdmVyc2lvbiAgICAgPSAwOworICAgIG15ICRpbnN0YW5jZSAgICA9IDA7CisgICAgbXkgJGRhdGEgICAgICAgID0gJyc7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMDsKKworCisgICAgcmV0dXJuICRzZWxmLT5fYWRkX21zb19nZW5lcmljKCR0eXBlLCAkdmVyc2lvbiwgJGluc3RhbmNlLCAkZGF0YSwgJGxlbmd0aCk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdHhvKCkKKyMKKyMgV3JpdGUgdGhlIHdvcmtzaGVldCBUWE8gcmVjb3JkIHRoYXQgaXMgcGFydCBvZiBjZWxsIGNvbW1lbnRzLgorIworc3ViIF9zdG9yZV90eG8geworCisgICAgbXkgJHNlbGYgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkcmVjb3JkICAgICAgPSAweDAxQjY7ICAgICAgICAgICAgICAgIyBSZWNvcmQgaWRlbnRpZmllcgorICAgIG15ICRsZW5ndGggICAgICA9IDB4MDAxMjsgICAgICAgICAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJHN0cmluZ19sZW4gID0gJF9bMF07ICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHRoZSBub3RlIHRleHQuCisgICAgbXkgJGZvcm1hdF9sZW4gID0gJF9bMV0gfHwgMTY7ICAgICAgICAgICMgTGVuZ3RoIG9mIHRoZSBmb3JtYXQgcnVucy4KKyAgICBteSAkcm90YXRpb24gICAgPSAkX1syXSB8fCAwOyAgICAgICAgICAgIyBPcHRpb25zCisgICAgbXkgJGdyYml0ICAgICAgID0gMHgwMjEyOyAgICAgICAgICAgICAgICMgT3B0aW9ucworICAgIG15ICRyZXNlcnZlZCAgICA9IDB4MDAwMDsgICAgICAgICAgICAgICAjIE9wdGlvbnMKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRoZWFkZXIgID0gcGFjaygidnYiLCAgICAgICAgJHJlY29yZCwgJGxlbmd0aCk7CisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dlZ2dnZWIiwgICAkZ3JiaXQsICRyb3RhdGlvbiwgJHJlc2VydmVkLCAkcmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc3RyaW5nX2xlbiwgJGZvcm1hdF9sZW4sICRyZXNlcnZlZCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90eG9fY29udGludWVfMSgpCisjCisjIFdyaXRlIHRoZSBmaXJzdCBDT05USU5VRSByZWNvcmQgdG8gZm9sbG93IHRoZSBUWE8gcmVjb3JkLiBJdCBjb250YWlucyB0aGUKKyMgdGV4dCBkYXRhLgorIworc3ViIF9zdG9yZV90eG9fY29udGludWVfMSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAzQzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF07ICAgICAgICAgICAgICAgICMgQ29tbWVudCBzdHJpbmcuCisgICAgbXkgJGVuY29kaW5nICAgID0gJF9bMV0gfHwgMDsgICAgICAgICAgICMgRW5jb2Rpbmcgb2YgdGhlIHN0cmluZy4KKworCisgICAgIyBTcGxpdCBsb25nIGNvbW1lbnQgc3RyaW5ncyBpbnRvIHNtYWxsZXIgY29udGludWUgYmxvY2tzIGlmIG5lY2Vzc2FyeS4KKyAgICAjIFdlIGNhbid0IGxldCBCSUZGd3JpdGVyOjpfYWRkX2NvbnRpbnVlKCkgaGFuZGxlZCB0aGlzIHNpbmNlIGFuIGV4dHJhCisgICAgIyBlbmNvZGluZyBieXRlIGhhcyB0byBiZSBhZGRlZCBzaW1pbGFyIHRvIHRoZSBTU1QgYmxvY2suCisgICAgIworICAgICMgV2UgbWFrZSB0aGUgbGltaXQgc2l6ZSBzbWFsbGVyIHRoYW4gdGhlIF9hZGRfY29udGludWUoKSBzaXplIGFuZCBldmVuCisgICAgIyBzbyB0aGF0IFVURjE2IGNoYXJzIG9jY3VyIGluIHRoZSBzYW1lIGJsb2NrLgorICAgICMKKyAgICBteSAkbGltaXQgPSA4MjE4OworICAgIHdoaWxlIChsZW5ndGgoJHN0cmluZykgPiAkbGltaXQpIHsKKyAgICAgICAgbXkgJHRtcF9zdHIgPSBzdWJzdHIoJHN0cmluZywgMCwgJGxpbWl0LCAiIik7CisKKyAgICAgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJDIiwgJGVuY29kaW5nKSAuICR0bXBfc3RyOworICAgICAgICBteSAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICAgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisgICAgICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKKyAgICB9CisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkZGF0YSAgICA9IHBhY2soIkMiLCAkZW5jb2RpbmcpIC4gJHN0cmluZzsKKyAgICBteSAkbGVuZ3RoICA9IGxlbmd0aCAkZGF0YTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV90eG9fY29udGludWVfMigpCisjCisjIFdyaXRlIHRoZSBzZWNvbmQgQ09OVElOVUUgcmVjb3JkIHRvIGZvbGxvdyB0aGUgVFhPIHJlY29yZC4gSXQgY29udGFpbnMgdGhlCisjIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSBzdHJpbmcuCisjCitzdWIgX3N0b3JlX3R4b19jb250aW51ZV8yIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMDNDOyAgICAgICAgICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgPSAweDAwMDA7ICAgICAgICAgICAgICAgIyBCeXRlcyB0byBmb2xsb3cKKyAgICBteSAkZm9ybWF0cyAgICAgPSAkX1swXTsgICAgICAgICAgICAgICAgIyBGb3JtYXR0aW5nIGluZm9ybWF0aW9uCisKKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRkYXRhID0gJyc7CisKKyAgICBmb3IgbXkgJGFfcmVmIChAJGZvcm1hdHMpIHsKKyAgICAgICAgJGRhdGEgLj0gcGFjayAidnZWIiwgJGFfcmVmLT5bMF0sICRhX3JlZi0+WzFdLCAweDA7CisgICAgfQorCisgICAgJGxlbmd0aCAgICAgPSBsZW5ndGggJGRhdGE7CisgICAgbXkgJGhlYWRlciAgPSBwYWNrKCJ2diIsICRyZWNvcmQsICRsZW5ndGgpOworCisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7CisKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9ub3RlKCkKKyMKKyMgV3JpdGUgdGhlIHdvcmtzaGVldCBOT1RFIHJlY29yZCB0aGF0IGlzIHBhcnQgb2YgY2VsbCBjb21tZW50cy4KKyMKK3N1YiBfc3RvcmVfbm90ZSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICA9IDB4MDAxQzsgICAgICAgICAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDBDOyAgICAgICAgICAgICAgICMgQnl0ZXMgdG8gZm9sbG93CisKKyAgICBteSAkcm93ICAgICAgICAgPSAkX1swXTsKKyAgICBteSAkY29sICAgICAgICAgPSAkX1sxXTsKKyAgICBteSAkb2JqX2lkICAgICAgPSAkX1syXTsKKyAgICBteSAkYXV0aG9yICAgICAgPSAkX1szXSB8fCAkc2VsZi0+e19jb21tZW50c19hdXRob3J9OworICAgIG15ICRhdXRob3JfZW5jICA9ICRfWzRdIHx8ICRzZWxmLT57X2NvbW1lbnRzX2F1dGhvcl9lbmN9OworICAgIG15ICR2aXNpYmxlICAgICA9ICRfWzVdOworCisKKyAgICAjIFVzZSB0aGUgdmlzaWJsZSBmbGFnIGlmIHNldCBieSB0aGUgdXNlciBvciBlbHNlIHVzZSB0aGUgd29ya3NoZWV0IHZhbHVlLgorICAgICMgVGhlIGZsYWcgaXMgYWxzbyBzZXQgaW4gX3N0b3JlX21zb19vcHRfY29tbWVudCgpIGJ1dCB3aXRoIHRoZSBvcHBvc2l0ZQorICAgICMgdmFsdWUuCisgICAgaWYgKGRlZmluZWQgJHZpc2libGUpIHsKKyAgICAgICAgJHZpc2libGUgPSAkdmlzaWJsZSAgICAgICAgICAgICAgICAgICA/IDB4MDAwMiA6IDB4MDAwMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICR2aXNpYmxlID0gJHNlbGYtPntfY29tbWVudHNfdmlzaWJsZX0gPyAweDAwMDIgOiAweDAwMDA7CisgICAgfQorCisKKyAgICAjIEdldCB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBhdXRob3Igc3RyaW5nIChub3QgYnl0ZXMpLgorICAgIG15ICRudW1fY2hhcnMgID0gbGVuZ3RoICRhdXRob3I7CisgICAgICAgJG51bV9jaGFycyAvPSAyIGlmICRhdXRob3JfZW5jOworCisKKyAgICAjIE51bGwgdGVybWluYXRlIHRoZSBhdXRob3Igc3RyaW5nLgorICAgICRhdXRob3IgLj0gIlwwIjsKKworCisgICAgIyBQYWNrIHRoZSByZWNvcmQuCisgICAgbXkgJGRhdGEgICAgPSBwYWNrKCJ2dnZ2dkMiLCAkcm93LCAkY29sLCAkdmlzaWJsZSwgJG9ial9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRudW1fY2hhcnMsICRhdXRob3JfZW5jKTsKKworICAgICRsZW5ndGggICAgID0gbGVuZ3RoKCRkYXRhKSArIGxlbmd0aCgkYXV0aG9yKTsKKyAgICBteSAkaGVhZGVyICA9IHBhY2soInZ2IiwgJHJlY29yZCwgJGxlbmd0aCk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSwgJGF1dGhvcik7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfY29tbWVudF9wYXJhbXMoKQorIworIyBUaGlzIG1ldGhvZCBoYW5kbGVzIHRoZSBhZGRpdGlvbmFsIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gd3JpdGVfY29tbWVudCgpIGFzCisjIHdlbGwgYXMgY2FsY3VsYXRpbmcgdGhlIGNvbW1lbnQgb2JqZWN0IHBvc2l0aW9uIGFuZCB2ZXJ0aWNlcy4KKyMKK3N1YiBfY29tbWVudF9wYXJhbXMgeworCisgICAgbXkgJHNlbGYgICAgICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJvdyAgICAgICAgICAgICA9IHNoaWZ0OworICAgIG15ICRjb2wgICAgICAgICAgICAgPSBzaGlmdDsKKyAgICBteSAkc3RyaW5nICAgICAgICAgID0gc2hpZnQ7CisKKyAgICBteSAkZGVmYXVsdF93aWR0aCAgID0gMTI4OworICAgIG15ICRkZWZhdWx0X2hlaWdodCAgPSA3NDsKKworICAgIG15ICVwYXJhbXMgID0gKAorICAgICAgICAgICAgICAgICAgICBhdXRob3IgICAgICAgICAgPT4gJycsCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcl9lbmNvZGluZyA9PiAwLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgY29sb3IgICAgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICBzdGFydF9jZWxsICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2NvbCAgICAgICA9PiB1bmRlZiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfcm93ICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlICAgICAgICAgPT4gdW5kZWYsCisgICAgICAgICAgICAgICAgICAgIHdpZHRoICAgICAgICAgICA9PiAkZGVmYXVsdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgID0+ICRkZWZhdWx0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgeF9vZmZzZXQgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB4X3NjYWxlICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgeV9vZmZzZXQgICAgICAgID0+IHVuZGVmLAorICAgICAgICAgICAgICAgICAgICB5X3NjYWxlICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICk7CisKKworICAgICMgT3ZlcndyaXRlIHRoZSBkZWZhdWx0cyB3aXRoIGFueSB1c2VyIHN1cHBsaWVkIHZhbHVlcy4gSW5jb3JyZWN0IG9yCisgICAgIyBtaXNzcGVsbGVkIHBhcmFtZXRlcnMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgICAgJXBhcmFtcyAgICAgPSAoJXBhcmFtcywgQF8pOworCisKKyAgICAjIEVuc3VyZSB0aGF0IGEgd2lkdGggYW5kIGhlaWdodCBoYXZlIGJlZW4gc2V0LgorICAgICRwYXJhbXN7d2lkdGh9ICA9ICRkZWZhdWx0X3dpZHRoICBpZiBub3QgJHBhcmFtc3t3aWR0aH07CisgICAgJHBhcmFtc3toZWlnaHR9ID0gJGRlZmF1bHRfaGVpZ2h0IGlmIG5vdCAkcGFyYW1ze2hlaWdodH07CisKKworICAgICMgQ2hlY2sgdGhhdCB1dGYxNiBzdHJpbmdzIGhhdmUgYW4gZXZlbiBudW1iZXIgb2YgYnl0ZXMuCisgICAgaWYgKCRwYXJhbXN7ZW5jb2Rpbmd9KSB7CisgICAgICAgIGNyb2FrICJVbmV2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIGNvbW1lbnQgc3RyaW5nIgorICAgICAgICAgICAgICAgaWYgbGVuZ3RoKCRzdHJpbmcpICUgMjsKKworICAgICAgICAjIENoYW5nZSBmcm9tIFVURi0xNkJFIHRvIFVURi0xNkxFCisgICAgICAgICRzdHJpbmcgPSBwYWNrICd2KicsIHVucGFjayAnbionLCAkc3RyaW5nOworICAgIH0KKworICAgIGlmICgkcGFyYW1ze2F1dGhvcl9lbmNvZGluZ30pIHsKKyAgICAgICAgY3JvYWsgIlVuZXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gYXV0aG9yIHN0cmluZyIKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGgoJHBhcmFtc3thdXRob3J9KSAlIDI7CisKKyAgICAgICAgIyBDaGFuZ2UgZnJvbSBVVEYtMTZCRSB0byBVVEYtMTZMRQorICAgICAgICAkcGFyYW1ze2F1dGhvcn0gPSBwYWNrICd2KicsIHVucGFjayAnbionLCAkcGFyYW1ze2F1dGhvcn07CisgICAgfQorCisKKyAgICAjIEhhbmRsZSB1dGY4IHN0cmluZ3MgaW4gcGVybCA1LjguCisgICAgaWYgKCRdID49IDUuMDA4KSB7CisgICAgICAgIHJlcXVpcmUgRW5jb2RlOworCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHN0cmluZykpIHsKKyAgICAgICAgICAgICRzdHJpbmcgPSBFbmNvZGU6OmVuY29kZSgiVVRGLTE2TEUiLCAkc3RyaW5nKTsKKyAgICAgICAgICAgICRwYXJhbXN7ZW5jb2Rpbmd9ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChFbmNvZGU6OmlzX3V0ZjgoJHBhcmFtc3thdXRob3J9KSkgeworICAgICAgICAgICAgJHBhcmFtc3thdXRob3J9ID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkxFIiwgJHBhcmFtc3thdXRob3J9KTsKKyAgICAgICAgICAgICRwYXJhbXN7YXV0aG9yX2VuY29kaW5nfSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKworICAgICMgTGltaXQgdGhlIHN0cmluZyB0byB0aGUgbWF4IG51bWJlciBvZiBjaGFycyAobm90IGJ5dGVzKS4KKyAgICBteSAkbWF4X2xlbiAgPSAzMjc2NzsKKyAgICAgICAkbWF4X2xlbiAqPSAyIGlmICRwYXJhbXN7ZW5jb2Rpbmd9OworCisgICAgaWYgKGxlbmd0aCgkc3RyaW5nKSA+ICRtYXhfbGVuKSB7CisgICAgICAgICRzdHJpbmcgICAgICAgPSBzdWJzdHIoJHN0cmluZywgMCwgJG1heF9sZW4pOworICAgIH0KKworCisgICAgIyBTZXQgdGhlIGNvbW1lbnQgYmFja2dyb3VuZCBjb2xvdXIuCisgICAgbXkgJGNvbG9yICAgICAgID0gJHBhcmFtc3tjb2xvcn07CisgICAgICAgJGNvbG9yICAgICAgID0gJlNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsOjpGb3JtYXQ6Ol9nZXRfY29sb3IoJGNvbG9yKTsKKyAgICAgICAkY29sb3IgICAgICAgPSAweDUwIGlmICRjb2xvciA9PSAweDdGRkY7ICMgRGVmYXVsdCBjb2xvci4KKyAgICAkcGFyYW1ze2NvbG9yfSAgPSAkY29sb3I7CisKKworICAgICMgQ29udmVydCBhIGNlbGwgcmVmZXJlbmNlIHRvIGEgcm93IGFuZCBjb2x1bW4uCisgICAgaWYgKGRlZmluZWQgJHBhcmFtc3tzdGFydF9jZWxsfSkgeworICAgICAgICBteSAoJHJvdywgJGNvbCkgICAgPSAkc2VsZi0+X3N1YnN0aXR1dGVfY2VsbHJlZigkcGFyYW1ze3N0YXJ0X2NlbGx9KTsKKyAgICAgICAgJHBhcmFtc3tzdGFydF9yb3d9ID0gJHJvdzsKKyAgICAgICAgJHBhcmFtc3tzdGFydF9jb2x9ID0gJGNvbDsKKyAgICB9CisKKworICAgICMgU2V0IHRoZSBkZWZhdWx0IHN0YXJ0IGNlbGwgYW5kIG9mZnNldHMgZm9yIHRoZSBjb21tZW50LiBUaGVzZSBhcmUKKyAgICAjIGdlbmVyYWxseSBmaXhlZCBpbiByZWxhdGlvbiB0byB0aGUgcGFyZW50IGNlbGwuIEhvd2V2ZXIgdGhlcmUgYXJlCisgICAgIyBzb21lIGVkZ2UgY2FzZXMgZm9yIGNlbGxzIGF0IHRoZSwgZXIsIGVkZ2VzLgorICAgICMKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3tzdGFydF9yb3d9KSB7CisKKyAgICAgICAgaWYgICAgKCRyb3cgPT0gMCAgICApIHskcGFyYW1ze3N0YXJ0X3Jvd30gPSAwICAgICAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzMykgeyRwYXJhbXN7c3RhcnRfcm93fSA9IDY1NTI5ICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTM0KSB7JHBhcmFtc3tzdGFydF9yb3d9ID0gNjU1MzAgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzUpIHskcGFyYW1ze3N0YXJ0X3Jvd30gPSA2NTUzMSAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7c3RhcnRfcm93fSA9ICRyb3cgLTF9CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRwYXJhbXN7eV9vZmZzZXR9KSB7CisKKyAgICAgICAgaWYgICAgKCRyb3cgPT0gMCAgICApIHskcGFyYW1ze3lfb2Zmc2V0fSAgPSAyICAgICAgfQorICAgICAgICBlbHNpZiAoJHJvdyA9PSA2NTUzMykgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDQgICAgICB9CisgICAgICAgIGVsc2lmICgkcm93ID09IDY1NTM0KSB7JHBhcmFtc3t5X29mZnNldH0gID0gNCAgICAgIH0KKyAgICAgICAgZWxzaWYgKCRyb3cgPT0gNjU1MzUpIHskcGFyYW1ze3lfb2Zmc2V0fSAgPSAyICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7eV9vZmZzZXR9ICA9IDcgICAgICB9CisgICAgfQorCisgICAgaWYgKG5vdCBkZWZpbmVkICRwYXJhbXN7c3RhcnRfY29sfSkgeworCisgICAgICAgIGlmICAgICgkY29sID09IDI1MyAgKSB7JHBhcmFtc3tzdGFydF9jb2x9ID0gMjUwICAgIH0KKyAgICAgICAgZWxzaWYgKCRjb2wgPT0gMjU0ICApIHskcGFyYW1ze3N0YXJ0X2NvbH0gPSAyNTEgICAgfQorICAgICAgICBlbHNpZiAoJGNvbCA9PSAyNTUgICkgeyRwYXJhbXN7c3RhcnRfY29sfSA9IDI1MiAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICB7JHBhcmFtc3tzdGFydF9jb2x9ID0gJGNvbCArMX0KKyAgICB9CisKKyAgICBpZiAobm90IGRlZmluZWQgJHBhcmFtc3t4X29mZnNldH0pIHsKKworICAgICAgICBpZiAgICAoJGNvbCA9PSAyNTMgICkgeyRwYXJhbXN7eF9vZmZzZXR9ICA9IDQ5ICAgICB9CisgICAgICAgIGVsc2lmICgkY29sID09IDI1NCAgKSB7JHBhcmFtc3t4X29mZnNldH0gID0gNDkgICAgIH0KKyAgICAgICAgZWxzaWYgKCRjb2wgPT0gMjU1ICApIHskcGFyYW1ze3hfb2Zmc2V0fSAgPSA0OSAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgeyRwYXJhbXN7eF9vZmZzZXR9ICA9IDE1ICAgICB9CisgICAgfQorCisKKyAgICAjIFNjYWxlIHRoZSBzaXplIG9mIHRoZSBjb21tZW50IGJveCBpZiByZXF1aXJlZC4KKyAgICBpZiAoJHBhcmFtc3t4X3NjYWxlfSkgeworICAgICAgICAkcGFyYW1ze3dpZHRofSAgPSAkcGFyYW1ze3dpZHRofSAgKiAkcGFyYW1ze3hfc2NhbGV9OworICAgIH0KKworICAgIGlmICgkcGFyYW1ze3lfc2NhbGV9KSB7CisgICAgICAgICRwYXJhbXN7aGVpZ2h0fSA9ICRwYXJhbXN7aGVpZ2h0fSAqICRwYXJhbXN7eV9zY2FsZX07CisgICAgfQorCisKKyAgICAjIENhbGN1bGF0ZSB0aGUgcG9zaXRpb25zIG9mIGNvbW1lbnQgb2JqZWN0LgorICAgIG15IEB2ZXJ0aWNlcyA9ICRzZWxmLT5fcG9zaXRpb25fb2JqZWN0KCAkcGFyYW1ze3N0YXJ0X2NvbH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXN7c3RhcnRfcm93fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3t4X29mZnNldH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbXN7eV9vZmZzZXR9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW1ze3dpZHRofSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtc3toZWlnaHR9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgcmV0dXJuKAorICAgICAgICAgICAkcm93LAorICAgICAgICAgICAkY29sLAorICAgICAgICAgICAkc3RyaW5nLAorICAgICAgICAgICAkcGFyYW1ze2VuY29kaW5nfSwKKyAgICAgICAgICAgJHBhcmFtc3thdXRob3J9LAorICAgICAgICAgICAkcGFyYW1ze2F1dGhvcl9lbmNvZGluZ30sCisgICAgICAgICAgICRwYXJhbXN7dmlzaWJsZX0sCisgICAgICAgICAgICRwYXJhbXN7Y29sb3J9LAorICAgICAgICAgICBbQHZlcnRpY2VzXQorICAgICAgICAgICk7Cit9CisKKworCisjCisjIERBVEEgVkFMSURBVElPTgorIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIGRhdGFfdmFsaWRhdGlvbigkcm93LCAkY29sLCB7Li4ufSkKKyMKKyMgVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgaW50ZXJmYWNlIHRvIEV4Y2VsIGRhdGEgdmFsaWRhdGlvbi4KKyMgU29tZXdoYXQgaXJvbmljYWxseSB0aGUgdGhpcyByZXF1aXJlcyBhIGxvdCBvZiB2YWxpZGF0aW9uIGNvZGUgc2luY2UgdGhlCisjIGludGVyZmFjZSBpcyBmbGV4aWJsZSBhbmQgY292ZXJzIGEgc2V2ZXJhbCB0eXBlcyBvZiBkYXRhIHZhbGlkYXRpb24uCisjCisjIFdlIGFsbG93IGRhdGEgdmFsaWRhdGlvbiB0byBiZSBjYWxsZWQgb24gb25lIGNlbGwgb3IgYSByYW5nZSBvZiBjZWxscy4gVGhlCisjIGhhc2hyZWYgY29udGFpbnMgdGhlIHZhbGlkYXRpb24gcGFyYW1ldGVycyBhbmQgbXVzdCBiZSB0aGUgbGFzdCBwYXJhbToKKyMgICAgZGF0YV92YWxpZGF0aW9uKCRyb3csICRjb2wsIHsuLi59KQorIyAgICBkYXRhX3ZhbGlkYXRpb24oJGZpcnN0X3JvdywgJGZpcnN0X2NvbCwgJGxhc3Rfcm93LCAkbGFzdF9jb2wsIHsuLi59KQorIworIyBSZXR1cm5zICAwIDogbm9ybWFsIHRlcm1pbmF0aW9uCisjICAgICAgICAgLTEgOiBpbnN1ZmZpY2llbnQgbnVtYmVyIG9mIGFyZ3VtZW50cworIyAgICAgICAgIC0yIDogcm93IG9yIGNvbHVtbiBvdXQgb2YgcmFuZ2UKKyMgICAgICAgICAtMyA6IGluY29ycmVjdCBwYXJhbWV0ZXIuCisjCitzdWIgZGF0YV92YWxpZGF0aW9uIHsKKworICAgIG15ICRzZWxmID0gc2hpZnQ7CisKKyAgICAjIENoZWNrIGZvciBhIGNlbGwgcmVmZXJlbmNlIGluIEExIG5vdGF0aW9uIGFuZCBzdWJzdGl0dXRlIHJvdyBhbmQgY29sdW1uCisgICAgaWYgKCRfWzBdID1+IC9eXEQvKSB7CisgICAgICAgIEBfID0gJHNlbGYtPl9zdWJzdGl0dXRlX2NlbGxyZWYoQF8pOworICAgIH0KKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIG9mIGFyZ3MuCisgICAgaWYgKEBfICE9IDUgJiYgQF8gIT0gMykgeyByZXR1cm4gLTEgfQorCisgICAgIyBUaGUgZmluYWwgaGFzaHJlZiBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzLgorICAgIG15ICRwYXJhbSA9IHBvcDsKKworICAgICMgTWFrZSB0aGUgbGFzdCByb3cvY29sIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBpZiBub3QgZGVmaW5lZC4KKyAgICBteSAoJHJvdzEsICRjb2wxLCAkcm93MiwgJGNvbDIpID0gQF87CisgICAgaWYgKCFkZWZpbmVkICRyb3cyKSB7CisgICAgICAgICRyb3cyID0gJHJvdzE7CisgICAgICAgICRjb2wyID0gJGNvbDE7CisgICAgfQorCisgICAgIyBDaGVjayB0aGF0IHJvdyBhbmQgY29sIGFyZSB2YWxpZCB3aXRob3V0IHN0b3JpbmcgdGhlIHZhbHVlcy4KKyAgICByZXR1cm4gLTIgaWYgJHNlbGYtPl9jaGVja19kaW1lbnNpb25zKCRyb3cxLCAkY29sMSwgMSwgMSk7CisgICAgcmV0dXJuIC0yIGlmICRzZWxmLT5fY2hlY2tfZGltZW5zaW9ucygkcm93MiwgJGNvbDIsIDEsIDEpOworCisKKyAgICAjIENoZWNrIHRoYXQgdGhlIGxhc3QgcGFyYW1ldGVyIGlzIGEgaGFzaCBsaXN0LgorICAgIGlmIChyZWYgJHBhcmFtIG5lICdIQVNIJykgeworICAgICAgICBjYXJwICJMYXN0IHBhcmFtZXRlciAnJHBhcmFtJyBpbiBkYXRhX3ZhbGlkYXRpb24oKSBtdXN0IGJlIGEgaGFzaCByZWYiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisgICAgIyBMaXN0IG9mIHZhbGlkIGlucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJXZhbGlkX3BhcmFtZXRlciA9ICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bSAgICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZV9ibGFuayAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93biAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19pbnB1dCAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3RpdGxlICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9tZXNzYWdlICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19lcnJvciAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX3RpdGxlICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfdHlwZSAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2NlbGxzICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKyAgICAjIENoZWNrIGZvciB2YWxpZCBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIGZvciBteSAkcGFyYW1fa2V5IChrZXlzICUkcGFyYW0pIHsKKyAgICAgICAgaWYgKG5vdCBleGlzdHMgJHZhbGlkX3BhcmFtZXRlcnskcGFyYW1fa2V5fSkgeworICAgICAgICAgICAgY2FycCAiVW5rbm93biBwYXJhbWV0ZXIgJyRwYXJhbV9rZXknIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgfQorICAgIH0KKworICAgICMgTWFwIGFsdGVybmF0aXZlIHBhcmFtZXRlciBuYW1lcyAnc291cmNlJyBvciAnbWluaW11bScgdG8gJ3ZhbHVlJy4KKyAgICAkcGFyYW0tPnt2YWx1ZX0gPSAkcGFyYW0tPntzb3VyY2V9ICBpZiBkZWZpbmVkICRwYXJhbS0+e3NvdXJjZX07CisgICAgJHBhcmFtLT57dmFsdWV9ID0gJHBhcmFtLT57bWluaW11bX0gaWYgZGVmaW5lZCAkcGFyYW0tPnttaW5pbXVtfTsKKworICAgICMgJ3ZhbGlkYXRlJyBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KKyAgICBpZiAobm90IGV4aXN0cyAkcGFyYW0tPnt2YWxpZGF0ZX0pIHsKKyAgICAgICAgY2FycCAiUGFyYW1ldGVyICd2YWxpZGF0ZScgaXMgcmVxdWlyZWQgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorCisKKyAgICAjIExpc3Qgb2YgIHZhbGlkIHZhbGlkYXRpb24gdHlwZXMuCisgICAgbXkgJXZhbGlkX3R5cGUgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW55JyAgICAgICAgICAgICA9PiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FueSB2YWx1ZScgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aG9sZSBudW1iZXInICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hvbGUnICAgICAgICAgICA9PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludGVnZXInICAgICAgICAgPT4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWNpbWFsJyAgICAgICAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCcgICAgICAgICAgICA9PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGUnICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lJyAgICAgICAgICAgID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dCBsZW5ndGgnICAgICA9PiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbmd0aCcgICAgICAgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXN0b20nICAgICAgICAgID0+IDcsCisgICAgICAgICAgICAgICAgICAgICAgKTsKKworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgdmFsaWRhdGlvbiB0eXBlcy4KKyAgICBpZiAobm90IGV4aXN0cyAkdmFsaWRfdHlwZXtsYygkcGFyYW0tPnt2YWxpZGF0ZX0pfSkgeworICAgICAgICBjYXJwICJVbmtub3duIHZhbGlkYXRpb24gdHlwZSAnJHBhcmFtLT57dmFsaWRhdGV9JyBmb3IgcGFyYW1ldGVyICIgLgorICAgICAgICAgICAgICIndmFsaWRhdGUnIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgcmV0dXJuIC0zOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgJHBhcmFtLT57dmFsaWRhdGV9ID0gJHZhbGlkX3R5cGV7bGMoJHBhcmFtLT57dmFsaWRhdGV9KX07CisgICAgfQorCisKKyAgICAjIE5vIGFjdGlvbiBpcyByZXF1aXJlZCBmb3IgdmFsaWRhdGlvbiB0eXBlICdhbnknLgorICAgICMgVE9ETzogd2Ugc2hvdWxkIHBlcmhhcHMgc3RvcmUgJ2FueScgZm9yIG1lc3NhZ2Ugb25seSB2YWxpZGF0aW9ucy4KKyAgICByZXR1cm4gMCBpZiAkcGFyYW0tPnt2YWxpZGF0ZX0gPT0gMDsKKworCisgICAgIyBUaGUgbGlzdCBhbmQgY3VzdG9tIHZhbGlkYXRpb25zIGRvbid0IGhhdmUgYSBjcml0ZXJpYSBzbyB3ZSB1c2UgYSBkZWZhdWx0CisgICAgIyBvZiAnYmV0d2VlbicuCisgICAgaWYgKCRwYXJhbS0+e3ZhbGlkYXRlfSA9PSAzIHx8ICRwYXJhbS0+e3ZhbGlkYXRlfSA9PSA3KSB7CisgICAgICAgICRwYXJhbS0+e2NyaXRlcmlhfSAgPSAnYmV0d2Vlbic7CisgICAgICAgICRwYXJhbS0+e21heGltdW19ICAgPSB1bmRlZjsKKyAgICB9CisKKyAgICAjICdjcml0ZXJpYScgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIuCisgICAgaWYgKG5vdCBleGlzdHMgJHBhcmFtLT57Y3JpdGVyaWF9KSB7CisgICAgICAgIGNhcnAgIlBhcmFtZXRlciAnY3JpdGVyaWEnIGlzIHJlcXVpcmVkIGluIGRhdGFfdmFsaWRhdGlvbigpIjsKKyAgICAgICAgcmV0dXJuIC0zOworICAgIH0KKworCisgICAgIyBMaXN0IG9mIHZhbGlkIGNyaXRlcmlhIHR5cGVzLgorICAgIG15ICVjcml0ZXJpYV90eXBlID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JldHdlZW4nICAgICAgICAgICAgICAgICAgICAgPT4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3QgYmV0d2VlbicgICAgICAgICAgICAgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXF1YWwgdG8nICAgICAgICAgICAgICAgICAgICA9PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz0nICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90IGVxdWFsIHRvJyAgICAgICAgICAgICAgICA9PiAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyE9JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8PicgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlciB0aGFuJyAgICAgICAgICAgICAgICA9PiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJz4nICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsZXNzIHRoYW4nICAgICAgICAgICAgICAgICAgID0+IDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPCcgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycgICAgPT4gNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc+PScgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVzcyB0aGFuIG9yIGVxdWFsIHRvJyAgICAgICA9PiA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzw9JyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gNywKKyAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgY3JpdGVyaWEgdHlwZXMuCisgICAgaWYgKG5vdCBleGlzdHMgJGNyaXRlcmlhX3R5cGV7bGMoJHBhcmFtLT57Y3JpdGVyaWF9KX0pIHsKKyAgICAgICAgY2FycCAiVW5rbm93biBjcml0ZXJpYSB0eXBlICckcGFyYW0tPntjcml0ZXJpYX0nIGZvciBwYXJhbWV0ZXIgIiAuCisgICAgICAgICAgICAgIidjcml0ZXJpYScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGFyYW0tPntjcml0ZXJpYX0gPSAkY3JpdGVyaWFfdHlwZXtsYygkcGFyYW0tPntjcml0ZXJpYX0pfTsKKyAgICB9CisKKworICAgICMgJ0JldHdlZW4nIGFuZCAnTm90IGJldHdlZW4nIGNyaXRlcmlhIHJlcXVpcmUgMiB2YWx1ZXMuCisgICAgaWYgKCRwYXJhbS0+e2NyaXRlcmlhfSA9PSAwIHx8ICRwYXJhbS0+e2NyaXRlcmlhfSA9PSAxKSB7CisgICAgICAgIGlmIChub3QgZXhpc3RzICRwYXJhbS0+e21heGltdW19KSB7CisgICAgICAgICAgICBjYXJwICJQYXJhbWV0ZXIgJ21heGltdW0nIGlzIHJlcXVpcmVkIGluIGRhdGFfdmFsaWRhdGlvbigpICIgLgorICAgICAgICAgICAgICAgICAid2hlbiB1c2luZyAnYmV0d2Vlbicgb3IgJ25vdCBiZXR3ZWVuJyBjcml0ZXJpYSI7CisgICAgICAgICAgICByZXR1cm4gLTM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICRwYXJhbS0+e21heGltdW19ID0gdW5kZWY7CisgICAgfQorCisKKworICAgICMgTGlzdCBvZiB2YWxpZCBlcnJvciBkaWFsb2cgdHlwZXMuCisgICAgbXkgJWVycm9yX3R5cGUgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RvcCcgICAgICAgID0+IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycgICAgID0+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5mb3JtYXRpb24nID0+IDIsCisgICAgICAgICAgICAgICAgICAgICApOworCisgICAgIyBDaGVjayBmb3IgdmFsaWQgZXJyb3IgZGlhbG9nIHR5cGVzLgorICAgIGlmIChub3QgZXhpc3RzICRwYXJhbS0+e2Vycm9yX3R5cGV9KSB7CisgICAgICAgICRwYXJhbS0+e2Vycm9yX3R5cGV9ID0gMDsKKyAgICB9CisgICAgZWxzaWYgKG5vdCBleGlzdHMgJGVycm9yX3R5cGV7bGMoJHBhcmFtLT57ZXJyb3JfdHlwZX0pfSkgeworICAgICAgICBjYXJwICJVbmtub3duIGNyaXRlcmlhIHR5cGUgJyRwYXJhbS0+e2Vycm9yX3R5cGV9JyBmb3IgcGFyYW1ldGVyICIgLgorICAgICAgICAgICAgICInZXJyb3JfdHlwZScgaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICByZXR1cm4gLTM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAkcGFyYW0tPntlcnJvcl90eXBlfSA9ICRlcnJvcl90eXBle2xjKCRwYXJhbS0+e2Vycm9yX3R5cGV9KX07CisgICAgfQorCisKKyAgICAjIENvbnZlcnQgZGF0ZS90aW1lcyB2YWx1ZSBpZiByZXF1aXJlZC4KKyAgICBpZiAoJHBhcmFtLT57dmFsaWRhdGV9ID09IDQgfHwgJHBhcmFtLT57dmFsaWRhdGV9ID09IDUpIHsKKyAgICAgICAgaWYgKCRwYXJhbS0+e3ZhbHVlfSA9fiAvVC8pIHsKKyAgICAgICAgICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHBhcmFtLT57dmFsdWV9KTsKKworICAgICAgICAgICAgaWYgKCFkZWZpbmVkICRkYXRlX3RpbWUpIHsKKyAgICAgICAgICAgICAgICBjYXJwICJJbnZhbGlkIGRhdGUvdGltZSB2YWx1ZSAnJHBhcmFtLT57dmFsdWV9JyAiIC4KKyAgICAgICAgICAgICAgICAgICAgICJpbiBkYXRhX3ZhbGlkYXRpb24oKSI7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgJHBhcmFtLT57dmFsdWV9ID0gJGRhdGVfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVmaW5lZCAkcGFyYW0tPnttYXhpbXVtfSAmJiAkcGFyYW0tPnttYXhpbXVtfSA9fiAvVC8pIHsKKyAgICAgICAgICAgIG15ICRkYXRlX3RpbWUgPSAkc2VsZi0+Y29udmVydF9kYXRlX3RpbWUoJHBhcmFtLT57bWF4aW11bX0pOworCisgICAgICAgICAgICBpZiAoIWRlZmluZWQgJGRhdGVfdGltZSkgeworICAgICAgICAgICAgICAgIGNhcnAgIkludmFsaWQgZGF0ZS90aW1lIHZhbHVlICckcGFyYW0tPnttYXhpbXVtfScgIiAuCisgICAgICAgICAgICAgICAgICAgICAiaW4gZGF0YV92YWxpZGF0aW9uKCkiOworICAgICAgICAgICAgICAgIHJldHVybiAtMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICRwYXJhbS0+e21heGltdW19ID0gJGRhdGVfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgIyBTZXQgc29tZSBkZWZhdWx0cyBpZiB0aGV5IGhhdmVuJ3QgYmVlbiBkZWZpbmVkIGJ5IHRoZSB1c2VyLgorICAgICRwYXJhbS0+e2lnbm9yZV9ibGFua30gID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntpZ25vcmVfYmxhbmt9OworICAgICRwYXJhbS0+e2Ryb3Bkb3dufSAgICAgID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntkcm9wZG93bn07CisgICAgJHBhcmFtLT57c2hvd19pbnB1dH0gICAgPSAxIGlmICFkZWZpbmVkICRwYXJhbS0+e3Nob3dfaW5wdXR9OworICAgICRwYXJhbS0+e3Nob3dfZXJyb3J9ICAgID0gMSBpZiAhZGVmaW5lZCAkcGFyYW0tPntzaG93X2Vycm9yfTsKKworCisgICAgIyBUaGVzZSBhcmUgdGhlIGNlbGxzIHRvIHdoaWNoIHRoZSB2YWxpZGF0aW9uIGlzIGFwcGxpZWQuCisgICAgJHBhcmFtLT57Y2VsbHN9ID0gW1skcm93MSwgJGNvbDEsICRyb3cyLCAkY29sMl1dOworCisgICAgIyBBIChmb3Igbm93KSB1bmRvY3VtZW50ZWQgcGFyYW1ldGVyIHRvIHBhc3MgYWRkaXRpb25hbCBjZWxsIHJhbmdlcy4KKyAgICBpZiAoZXhpc3RzICRwYXJhbS0+e290aGVyX2NlbGxzfSkgeworCisgICAgICAgIHB1c2ggQHskcGFyYW0tPntjZWxsc319LCBAeyRwYXJhbS0+e290aGVyX2NlbGxzfX07CisgICAgfQorCisgICAgIyBTdG9yZSB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiB1bnRpbCB3ZSBjbG9zZSB0aGUgd29ya3NoZWV0LgorICAgIHB1c2ggQHskc2VsZi0+e192YWxpZGF0aW9uc319LCAkcGFyYW07Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfdmFsaWRhdGlvbl9jb3VudCgpCisjCisjIFN0b3JlIHRoZSBjb3VudCBvZiB0aGUgRFYgcmVjb3JkcyB0byBmb2xsb3cuCisjCisjIE5vdGUsIHRoaXMgY291bGQgYmUgd3JhcHBlZCBpbnRvIF9zdG9yZV9kdigpIGJ1dCB3ZSBtYXkgcmVxdWlyZSBzZXBhcmF0ZQorIyBoYW5kbGluZyBvZiB0aGUgb2JqZWN0IGlkIGF0IGEgbGF0ZXIgc3RhZ2UuCisjCitzdWIgX3N0b3JlX3ZhbGlkYXRpb25fY291bnQgeworCisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKworICAgIG15ICRkdl9jb3VudCA9IEB7JHNlbGYtPntfdmFsaWRhdGlvbnN9fTsKKyAgICBteSAkb2JqX2lkICAgPSAtMTsKKworICAgIHJldHVybiB1bmxlc3MgJGR2X2NvdW50OworCisgICAgJHNlbGYtPl9zdG9yZV9kdmFsKCRvYmpfaWQgLCAkZHZfY291bnQpOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3N0b3JlX3ZhbGlkYXRpb25zKCkKKyMKKyMgU3RvcmUgdGhlIGRhdGFfdmFsaWRhdGlvbiByZWNvcmRzLgorIworc3ViIF9zdG9yZV92YWxpZGF0aW9ucyB7CisKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworCisgICAgcmV0dXJuIHVubGVzcyBzY2FsYXIgQHskc2VsZi0+e192YWxpZGF0aW9uc319OworCisgICAgZm9yIG15ICRwYXJhbSAoQHskc2VsZi0+e192YWxpZGF0aW9uc319KSB7CisgICAgICAgICRzZWxmLT5fc3RvcmVfZHYoICAgJHBhcmFtLT57Y2VsbHN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e3ZhbGlkYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntjcml0ZXJpYX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57dmFsdWV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e21heGltdW19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICRwYXJhbS0+e2lucHV0X3RpdGxlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntpbnB1dF9tZXNzYWdlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntlcnJvcl90aXRsZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57ZXJyb3JfbWVzc2FnZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57ZXJyb3JfdHlwZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57aWdub3JlX2JsYW5rfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcGFyYW0tPntkcm9wZG93bn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57c2hvd19pbnB1dH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHBhcmFtLT57c2hvd19lcnJvcn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICB9Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfc3RvcmVfZHZhbCgpCisjCisjIFN0b3JlIHRoZSBEViByZWNvcmQgd2hpY2ggY29udGFpbnMgdGhlIG51bWJlciBvZiBhbmQgaW5mb3JtYXRpb24gY29tbW9uIHRvCisjIGFsbCBEViBzdHJ1Y3R1cmVzLgorIworc3ViIF9zdG9yZV9kdmFsIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHJlY29yZCAgICAgID0gMHgwMUIyOyAgICAgICAjIFJlY29yZCBpZGVudGlmaWVyCisgICAgbXkgJGxlbmd0aCAgICAgID0gMHgwMDEyOyAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJG9ial9pZCAgICAgID0gJF9bMF07ICAgICAgICAjIE9iamVjdCBJRCBudW1iZXIuCisgICAgbXkgJGR2X2NvdW50ICAgID0gJF9bMV07ICAgICAgICAjIENvdW50IG9mIERWIHN0cnVjdHMgdG8gZm9sbG93LgorCisgICAgbXkgJGZsYWdzICAgICAgID0gMHgwMDA0OyAgICAgICAjIE9wdGlvbiBmbGFncy4KKyAgICBteSAkeF9jb29yZCAgICAgPSAweDAwMDAwMDAwOyAgICMgWCBjb29yZCBvZiBpbnB1dCBib3guCisgICAgbXkgJHlfY29vcmQgICAgID0gMHgwMDAwMDAwMDsgICAjIFkgY29vcmQgb2YgaW5wdXQgYm94LgorCisKKyAgICAjIFBhY2sgdGhlIHJlY29yZC4KKyAgICBteSAkaGVhZGVyID0gcGFjaygndnYnLCAkcmVjb3JkLCAkbGVuZ3RoKTsKKyAgICBteSAkZGF0YSAgID0gcGFjaygndlZWVlYnLCAkZmxhZ3MsICR4X2Nvb3JkLCAkeV9jb29yZCwgJG9ial9pZCwgJGR2X2NvdW50KTsKKworICAgICRzZWxmLT5fYXBwZW5kKCRoZWFkZXIsICRkYXRhKTsKK30KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIF9zdG9yZV9kdigpCisjCisjIFN0b3JlIHRoZSBEViByZWNvcmQgdGhhdCBzcGVjaWZpZXMgdGhlIGRhdGEgdmFsaWRhdGlvbiBjcml0ZXJpYSBhbmQgb3B0aW9ucworIyBmb3IgYSByYW5nZSBvZiBjZWxscy4uCisjCitzdWIgX3N0b3JlX2R2IHsKKworICAgIG15ICRzZWxmICAgICAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRyZWNvcmQgICAgICAgICAgPSAweDAxQkU7ICAgICAgICMgUmVjb3JkIGlkZW50aWZpZXIKKyAgICBteSAkbGVuZ3RoICAgICAgICAgID0gMHgwMDAwOyAgICAgICAjIEJ5dGVzIHRvIGZvbGxvdworCisgICAgbXkgJGZsYWdzICAgICAgICAgICA9IDB4MDAwMDAwMDA7ICAgIyBEViBvcHRpb24gZmxhZ3MuCisKKyAgICBteSAkY2VsbHMgICAgICAgICAgID0gJF9bMF07ICAgICAgICAjIEFyZWYgb2YgY2VsbHMgdG8gd2hpY2ggRFYgYXBwbGllcy4KKyAgICBteSAkdmFsaWRhdGlvbl90eXBlID0gJF9bMV07ICAgICAgICAjIFR5cGUgb2YgZGF0YSB2YWxpZGF0aW9uLgorICAgIG15ICRjcml0ZXJpYV90eXBlICAgPSAkX1syXTsgICAgICAgICMgVmFsaWRhdGlvbiBjcml0ZXJpYS4KKyAgICBteSAkZm9ybXVsYV8xICAgICAgID0gJF9bM107ICAgICAgICAjIFZhbHVlL1NvdXJjZS9NaW5pbXVtIGZvcm11bGEuCisgICAgbXkgJGZvcm11bGFfMiAgICAgICA9ICRfWzRdOyAgICAgICAgIyBNYXhpbXVtIGZvcm11bGEuCisgICAgbXkgJGlucHV0X3RpdGxlICAgICA9ICRfWzVdOyAgICAgICAgIyBUaXRsZSBvZiBpbnB1dCBtZXNzYWdlLgorICAgIG15ICRpbnB1dF9tZXNzYWdlICAgPSAkX1s2XTsgICAgICAgICMgVGV4dCBvZiBpbnB1dCBtZXNzYWdlLgorICAgIG15ICRlcnJvcl90aXRsZSAgICAgPSAkX1s3XTsgICAgICAgICMgVGl0bGUgb2YgZXJyb3IgbWVzc2FnZS4KKyAgICBteSAkZXJyb3JfbWVzc2FnZSAgID0gJF9bOF07ICAgICAgICAjIFRleHQgb2YgaW5wdXQgbWVzc2FnZS4KKyAgICBteSAkZXJyb3JfdHlwZSAgICAgID0gJF9bOV07ICAgICAgICAjIEVycm9yIGRpYWxvZyB0eXBlLgorICAgIG15ICRpZ25vcmVfYmxhbmsgICAgPSAkX1sxMF07ICAgICAgICMgSWdub3JlIGJsYW5rIGNlbGxzLgorICAgIG15ICRkcm9wZG93biAgICAgICAgPSAkX1sxMV07ICAgICAgICMgRGlzcGxheSBkcm9wZG93biB3aXRoIGxpc3QuCisgICAgbXkgJGlucHV0X2JveCAgICAgICA9ICRfWzEyXTsgICAgICAgIyBEaXNwbGF5IGlucHV0IGJveC4KKyAgICBteSAkZXJyb3JfYm94ICAgICAgID0gJF9bMTNdOyAgICAgICAjIERpc3BsYXkgZXJyb3IgYm94LgorICAgIG15ICRpbWVfbW9kZSAgICAgICAgPSAwOyAgICAgICAgICAgICMgSU1FIGlucHV0IG1vZGUgZm9yIGZhciBlYXN0IGZvbnRzLgorICAgIG15ICRzdHJfbG9va3VwICAgICAgPSAwOyAgICAgICAgICAgICMgU2VlIGJlbG93LgorCisgICAgIyBTZXQgdGhlIHN0cmluZyBsb29rdXAgZmxhZyBmb3IgJ2xpc3QnIHZhbGlkYXRpb25zIHdpdGggYSBzdHJpbmcgYXJyYXkuCisgICAgaWYgKCR2YWxpZGF0aW9uX3R5cGUgPT0gMyAmJiByZWYgJGZvcm11bGFfMSBlcSAnQVJSQVknKSAgeworICAgICAgICAkc3RyX2xvb2t1cCA9IDE7CisgICAgfQorCisgICAgIyBUaGUgZHJvcGRvd24gZmxhZyBpcyBzdG9yZWQgYXMgYSBuZWdhdGVkIHZhbHVlLgorICAgIG15ICRub19kcm9wZG93biA9IG5vdCAkZHJvcGRvd247CisKKyAgICAjIFNldCB0aGUgcmVxdWlyZWQgZmxhZ3MuCisgICAgJGZsYWdzIHw9ICR2YWxpZGF0aW9uX3R5cGU7CisgICAgJGZsYWdzIHw9ICRlcnJvcl90eXBlICAgICAgIDw8IDQ7CisgICAgJGZsYWdzIHw9ICRzdHJfbG9va3VwICAgICAgIDw8IDc7CisgICAgJGZsYWdzIHw9ICRpZ25vcmVfYmxhbmsgICAgIDw8IDg7CisgICAgJGZsYWdzIHw9ICRub19kcm9wZG93biAgICAgIDw8IDk7CisgICAgJGZsYWdzIHw9ICRpbWVfbW9kZSAgICAgICAgIDw8IDEwOworICAgICRmbGFncyB8PSAkaW5wdXRfYm94ICAgICAgICA8PCAxODsKKyAgICAkZmxhZ3MgfD0gJGVycm9yX2JveCAgICAgICAgPDwgMTk7CisgICAgJGZsYWdzIHw9ICRjcml0ZXJpYV90eXBlICAgIDw8IDIwOworCisgICAgIyBQYWNrIHRoZSB2YWxpZGF0aW9uIGZvcm11bGFzLgorICAgICRmb3JtdWxhXzEgPSAkc2VsZi0+X3BhY2tfZHZfZm9ybXVsYSgkZm9ybXVsYV8xKTsKKyAgICAkZm9ybXVsYV8yID0gJHNlbGYtPl9wYWNrX2R2X2Zvcm11bGEoJGZvcm11bGFfMik7CisKKyAgICAjIFBhY2sgdGhlIGlucHV0IGFuZCBlcnJvciBkaWFsb2cgc3RyaW5ncy4KKyAgICAkaW5wdXRfdGl0bGUgICA9ICRzZWxmLT5fcGFja19kdl9zdHJpbmcoJGlucHV0X3RpdGxlLCAgIDMyICk7CisgICAgJGVycm9yX3RpdGxlICAgPSAkc2VsZi0+X3BhY2tfZHZfc3RyaW5nKCRlcnJvcl90aXRsZSwgICAzMiApOworICAgICRpbnB1dF9tZXNzYWdlID0gJHNlbGYtPl9wYWNrX2R2X3N0cmluZygkaW5wdXRfbWVzc2FnZSwgMjU1KTsKKyAgICAkZXJyb3JfbWVzc2FnZSA9ICRzZWxmLT5fcGFja19kdl9zdHJpbmcoJGVycm9yX21lc3NhZ2UsIDI1NSk7CisKKyAgICAjIFBhY2sgdGhlIERWIGNlbGwgZGF0YS4KKyAgICBteSAkZHZfY291bnQgPSBzY2FsYXIgQCRjZWxsczsKKyAgICBteSAkZHZfZGF0YSAgPSBwYWNrICd2JywgJGR2X2NvdW50OworICAgIGZvciBteSAkcmFuZ2UgKEAkY2VsbHMpIHsKKyAgICAgICAgJGR2X2RhdGEgLj0gcGFjayAndnZ2dicsICRyYW5nZS0+WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJhbmdlLT5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmFuZ2UtPlsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyYW5nZS0+WzNdOworICAgIH0KKworICAgICMgUGFjayB0aGUgcmVjb3JkLgorICAgIG15ICRkYXRhICAgPSBwYWNrICdWJywgJGZsYWdzOworICAgICAgICRkYXRhICAuPSAkaW5wdXRfdGl0bGU7CisgICAgICAgJGRhdGEgIC49ICRlcnJvcl90aXRsZTsKKyAgICAgICAkZGF0YSAgLj0gJGlucHV0X21lc3NhZ2U7CisgICAgICAgJGRhdGEgIC49ICRlcnJvcl9tZXNzYWdlOworICAgICAgICRkYXRhICAuPSAkZm9ybXVsYV8xOworICAgICAgICRkYXRhICAuPSAkZm9ybXVsYV8yOworICAgICAgICRkYXRhICAuPSAkZHZfZGF0YTsKKworICAgIG15ICRoZWFkZXIgPSBwYWNrKCd2dicsICRyZWNvcmQsIGxlbmd0aCAkZGF0YSk7CisKKyAgICAkc2VsZi0+X2FwcGVuZCgkaGVhZGVyLCAkZGF0YSk7Cit9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBfcGFja19kdl9zdHJpbmcoKQorIworIyBQYWNrIHRoZSBzdHJpbmdzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBlcnJvciBkaWFsb2cgY2FwdGlvbnMgYW5kIG1lc3NhZ2VzLgorIyBDYXB0aW9ucyBhcmUgbGltaXRlZCB0byAzMiBjaGFyYWN0ZXJzLiBNZXNzYWdlcyBhcmUgbGltaXRlZCB0byAyNTUgY2hhcnMuCisjCitzdWIgX3BhY2tfZHZfc3RyaW5nIHsKKworICAgIG15ICRzZWxmICAgICAgICA9IHNoaWZ0OworCisgICAgbXkgJHN0cmluZyAgICAgID0gJF9bMF07CisgICAgbXkgJG1heF9sZW5ndGggID0gJF9bMV07CisKKyAgICBteSAkc3RyX2xlbmd0aCAgPSAwOworICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisKKyAgICAjIFRoZSBkZWZhdWx0IGVtcHR5IHN0cmluZyBpcyAiXDAiLgorICAgIGlmICghZGVmaW5lZCAkc3RyaW5nIHx8ICRzdHJpbmcgZXEgJycpIHsKKyAgICAgICAgJHN0cmluZyA9ICJcMCI7CisgICAgfQorCisgICAgIyBFeGNlbCBsaW1pdHMgRFYgY2FwdGlvbnMgdG8gMzIgY2hhcnMgYW5kIG1lc3NhZ2VzIHRvIDI1NS4KKyAgICBpZiAobGVuZ3RoICRzdHJpbmcgPiAkbWF4X2xlbmd0aCkgeworICAgICAgICAkc3RyaW5nID0gc3Vic3RyKCRzdHJpbmcsIDAsICRtYXhfbGVuZ3RoKTsKKyAgICB9CisKKyAgICAkc3RyX2xlbmd0aCA9IGxlbmd0aCAkc3RyaW5nOworCisgICAgIyBIYW5kbGUgdXRmOCBzdHJpbmdzIGluIHBlcmwgNS44LgorICAgIGlmICgkXSA+PSA1LjAwOCkgeworICAgICAgICByZXF1aXJlIEVuY29kZTsKKworICAgICAgICBpZiAoRW5jb2RlOjppc191dGY4KCRzdHJpbmcpKSB7CisgICAgICAgICAgICAkc3RyaW5nID0gRW5jb2RlOjplbmNvZGUoIlVURi0xNkxFIiwgJHN0cmluZyk7CisgICAgICAgICAgICAkZW5jb2RpbmcgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhY2soJ3ZDJywgJHN0cl9sZW5ndGgsICRlbmNvZGluZykgLiAkc3RyaW5nOworfQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgX3BhY2tfZHZfZm9ybXVsYSgpCisjCisjIFBhY2sgdGhlIGZvcm11bGEgdXNlZCBpbiB0aGUgRFYgcmVjb3JkLiBUaGlzIGlzIHRoZSBzYW1lIGFzIGFuIGNlbGwgZm9ybXVsYQorIyB3aXRoIHNvbWUgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uIE5vdGUsIERWIGZvcm11bGFzIGluIEV4Y2VsIHVzZQorIyByZWxhdGl2ZSBhZGRyZXNzaW5nIChSMUMxIGFuZCBwdGdYeHhOKSBob3dldmVyIHdlIHVzZSB0aGUgRm9ybXVsYS5wbSdzCisjIGRlZmF1bHQgYWJzb2x1dGUgYWRkcmVzc2luZyAoQTEgYW5kIHB0Z1h4eCkuCisjCitzdWIgX3BhY2tfZHZfZm9ybXVsYSB7CisKKyAgICBteSAkc2VsZiAgICAgICAgPSBzaGlmdDsKKworICAgIG15ICRmb3JtdWxhICAgICA9ICRfWzBdOworICAgIG15ICRlbmNvZGluZyAgICA9IDA7CisgICAgbXkgJGxlbmd0aCAgICAgID0gMDsKKyAgICBteSAkdW51c2VkICAgICAgPSAweDAwMDA7CisgICAgbXkgQHRva2VuczsKKworICAgICMgUmV0dXJuIGEgZGVmYXVsdCBzdHJ1Y3R1cmUgZm9yIHVudXNlZCBmb3JtdWxhcy4KKyAgICBpZiAoIWRlZmluZWQgJGZvcm11bGEgfHwgJGZvcm11bGEgZXEgJycpIHsKKyAgICAgICAgcmV0dXJuIHBhY2soJ3Z2JywgMCwgJHVudXNlZCk7CisgICAgfQorCisgICAgIyBQYWNrIGEgbGlzdCBhcnJheSByZWYgYXMgYSBudWxsIHNlcGFyYXRlZCBzdHJpbmcuCisgICAgaWYgKHJlZiAkZm9ybXVsYSBlcSAnQVJSQVknKSB7CisgICAgICAgICRmb3JtdWxhICAgPSBqb2luICJcMCIsIEAkZm9ybXVsYTsKKyAgICAgICAgJGZvcm11bGEgICA9IHFxKCIkZm9ybXVsYSIpOworICAgIH0KKworICAgICMgU3RyaXAgdGhlID0gc2lnbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtdWxhIHN0cmluZworICAgICRmb3JtdWxhICAgID1+IHMoXj0pKCk7CisKKyAgICAjIFBhcnNlIHRoZSBmb3JtdWxhIHVzaW5nIHRoZSBwYXJzZXIgaW4gRm9ybXVsYS5wbQorICAgIG15ICRwYXJzZXIgID0gJHNlbGYtPntfcGFyc2VyfTsKKworICAgICMgSW4gb3JkZXIgdG8gcmFpc2UgZm9ybXVsYSBlcnJvcnMgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiB0aGUgY2FsbGluZworICAgICMgcHJvZ3JhbSB3ZSB1c2UgYW4gZXZhbCBibG9jayBhbmQgcmUtcmFpc2UgdGhlIGVycm9yIGZyb20gaGVyZS4KKyAgICAjCisgICAgZXZhbCB7IEB0b2tlbnMgPSAkcGFyc2VyLT5wYXJzZV9mb3JtdWxhKCRmb3JtdWxhKSB9OworCisgICAgaWYgKCRAKSB7CisgICAgICAgICRAID1+IHMvXG4kLy87ICAjIFN0cmlwIHRoZSBcbiB1c2VkIGluIHRoZSBGb3JtdWxhLnBtIGRpZSgpCisgICAgICAgIGNyb2FrICRAOyAgICAgICAjIFJlLXJhaXNlIHRoZSBlcnJvcgorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgIyBUT0RPIHRlc3QgZm9yIG5vbiB2YWxpZCBwdGdzIHN1Y2ggYXMgU2hlZXQyIUExCisgICAgfQorICAgICMgRm9yY2UgMmQgcmFuZ2VzIHRvIGJlIGEgcmVmZXJlbmNlIGNsYXNzLgorICAgIHMvX3JhbmdlMmQvX3JhbmdlMmRSLyBmb3IgQHRva2VuczsKKyAgICBzL19uYW1lL19uYW1lUi8gICAgICAgZm9yIEB0b2tlbnM7CisKKyAgICAjIFBhcnNlIHRoZSB0b2tlbnMgaW50byBhIGZvcm11bGEgc3RyaW5nLgorICAgICRmb3JtdWxhID0gJHBhcnNlci0+cGFyc2VfdG9rZW5zKEB0b2tlbnMpOworCisKKyAgICByZXR1cm4gcGFjaygndnYnLCBsZW5ndGggJGZvcm11bGEsICR1bnVzZWQpIC4gJGZvcm11bGE7Cit9CisKKworCisKKworMTsKKworCitfX0VORF9fCisKKworPWhlYWQxIE5BTUUKKworV29ya3NoZWV0IC0gQSB3cml0ZXIgY2xhc3MgZm9yIEV4Y2VsIFdvcmtzaGVldHMuCisKKz1oZWFkMSBTWU5PUFNJUworCitTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIFNwcmVhZHNoZWV0OjpXcml0ZUV4Y2VsCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGlzIG1vZHVsZSBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggU3ByZWFkc2hlZXQ6OldyaXRlRXhjZWwuCisKKz1oZWFkMSBBVVRIT1IKKworSm9obiBNY05hbWFyYSBqbWNuYW1hcmFAY3Bhbi5vcmcKKworPWhlYWQxIENPUFlSSUdIVAorCiupIE1NLU1NWCwgSm9obiBNY05hbWFyYS4KKworQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBtb2R1bGUgaXMgZnJlZSBzb2Z0d2FyZS4gSXQgbWF5IGJlIHVzZWQsIHJlZGlzdHJpYnV0ZWQgYW5kL29yIG1vZGlmaWVkIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgorCg==