LyoqCiAqIENvcHlyaWdodCAoYykgMjAxOSwgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCiAqIG1ldDoKICogICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiAqICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKICogICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKICogICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBUaGUgTGludXggRm91bmRhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogKiAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECiAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUwogKiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCiAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUgogKiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKICogV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKICogT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTgogKiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICovCgojaWZuZGVmIEFFRVNURF9ICiNkZWZpbmUgQUVFU1REX0gKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKREVTQ1JJUFRJT046ICBTdGFuZGFyZCBsaWJyYXJ5OyBnZW5lcmFsLXB1cnBvc2UgdXRpbGl0eSBmdW5jdGlvbnMuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiNpbmNsdWRlICJBRUVWYUxpc3QuaCIKI2luY2x1ZGUgIkFFRVN0ZERlZi5oIgojaW5jbHVkZSAic3RyaW5nLmgiCgojZGVmaW5lIFNURF9DT05TVFJBSU4oIHZhbCwgbWluLCBtYXggKSAoKCh2YWwpIDwgKG1pbikpID8gKG1pbikgOiAoKHZhbCkgPiAobWF4KSkgPyAobWF4KSA6ICh2YWwpKQojZGVmaW5lIFNURF9CRVRXRUVOKCB2YWwsIG1pbkdFLCBtYXhMVCApIFwKICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBsb25nKSh2YWwpIC0gKHVuc2lnbmVkIGxvbmcpKG1pbkdFKSkgPCBcCiAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoKHVuc2lnbmVkIGxvbmcpKG1heExUKSAtICh1bnNpZ25lZCBsb25nKShtaW5HRSkpICkKI2RlZmluZSBTVERfQVJSQVlfU0laRShhKSAgICAgICAgICAgICAoKGludCkoKHNpemVvZigoYSkpL3NpemVvZigoYSlbMF0pKSkpCiNkZWZpbmUgU1REX0FSUkFZX01FTUJFUihwLGEpICgoKHApID49IChhKSkgJiYgKChwKSA8ICgoYSkgKyBTVERfQVJSQVlfU0laRShhKSkpKQoKI2RlZmluZSBTVERfU0laRU9GKHgpICAgICAgICAgICAgICAgICAoKGludClzaXplb2YoeCkpCiNkZWZpbmUgU1REX09GRlNFVE9GKHR5cGUsbWVtYmVyKSAgICAgKCgoY2hhciopKCYoKHR5cGUqKTEpLT5tZW1iZXIpKS0oKGNoYXIqKTEpKQoKI2RlZmluZSBTVERfUkVDT1ZFUl9SRUModHlwZSxtZW1iZXIscCkgKCh2b2lkKSgocCktJigoKHR5cGUqKTEpLT5tZW1iZXIpKSxcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSopKHZvaWQqKSgoKGNoYXIqKSh2b2lkKikocCkpLVNURF9PRkZTRVRPRih0eXBlLG1lbWJlcikpKQojZGVmaW5lIFNURF9NSU4oYSxiKSAgICgoYSk8KGIpPyhhKTooYikpCiNkZWZpbmUgU1REX01BWChhLGIpICAgKChhKT4oYik/KGEpOihiKSkKLy9saW50IC1lbWFjcm8oNTQ1LFNURF9aRVJPQVQpCiNkZWZpbmUgU1REX1pFUk9BVChwKSAgc3RkX21lbXNldCgocCksIDAsIHNpemVvZigqcCkpCgojZGVmaW5lIF9TVERfQklUU19QRVIoYml0cykgICAgICg4KnNpemVvZigoYml0cylbMF0pKQoKI2RlZmluZSBTVERfQklUX1NFVChiaXRzLCBpeCkgICAgICgoYml0cylbKGl4KS9fU1REX0JJVFNfUEVSKChiaXRzKSldIHw9IDB4MTw8KChpeCkgJiAoX1NURF9CSVRTX1BFUigoYml0cykpLTEpKSkKI2RlZmluZSBTVERfQklUX0NMRUFSKGJpdHMsIGl4KSAgICgoYml0cylbKGl4KS9fU1REX0JJVFNfUEVSKChiaXRzKSldICY9IH4oMHgxPDwoKGl4KSAmIChfU1REX0JJVFNfUEVSKChiaXRzKSktMSkpKSkKI2RlZmluZSBTVERfQklUX1RFU1QoYml0cywgaXgpICAgICgoYml0cylbKGl4KS9fU1REX0JJVFNfUEVSKChiaXRzKSldICYgKDB4MTw8KChpeCkgJiAoX1NURF9CSVRTX1BFUigoYml0cykpLTEpKSkpCgovLwovLyBFcnJvciBjb2RlcwovLwojZGVmaW5lIFNURF9OT0RJR0lUUyAgIDEKI2RlZmluZSBTVERfTkVHQVRJVkUgICAyCiNkZWZpbmUgU1REX09WRVJGTE9XICAgMwojZGVmaW5lIFNURF9CQURQQVJBTSAgIDQKI2RlZmluZSBTVERfVU5ERVJGTE9XICA1CgovL0NvbXB1dGUgc3RyaW5nIGxlbmd0aCB1c2luZyBzdHJsZW4KI2RlZmluZSBzdGRfc3RybGVuIHN0cmxlbgoKI2lmZGVmIF9fY3BsdXNwbHVzCmV4dGVybiAiQyIgewojZW5kaWYgLyogI2lmZGVmIF9fY3BsdXNwbHVzICovCgovL1ZlcnNpb24gZnVuY3Rpb24KZXh0ZXJuIGludCAgICAgICAgICAgc3RkX2dldHZlcnNpb24oY2hhciAqcGNEc3QsIGludCBuRGVzdFNpemUpOwoKLy9TdHJpbmcgZnVuY3Rpb25zCmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zdHJjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX3N0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBpbnQgbik7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zdHJpY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zdHJuaWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBuKTsKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX3N0cmxjcHkoY2hhciAqcGNEc3QsIGNvbnN0IGNoYXIgKnBzelNyYywgaW50IG5EZXN0U2l6ZSk7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zdHJsY2F0KGNoYXIgKnBjRHN0LCBjb25zdCBjaGFyICpwc3pTcmMsIGludCBuRGVzdFNpemUpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3Ryc3RyKGNvbnN0IGNoYXIgKnBzelN0cmluZywgY29uc3QgY2hhciAqcHN6U2VhcmNoKTsKCi8vQ2hhcmFjdGVyIGZ1bmN0aW9ucwpleHRlcm4gY2hhciAgICAgICAgICBzdGRfdG9sb3dlcihjaGFyIGMpOwpleHRlcm4gY2hhciAgICAgICAgICBzdGRfdG91cHBlcihjaGFyIGMpOwoKLy8gTWVtIGZ1bmN0aW9ucwpleHRlcm4gdm9pZCAqICAgICAgICBzdGRfbWVtc2V0KHZvaWQgKnAsIGludCBjLCBpbnQgbkxlbik7CmV4dGVybiB2b2lkICogICAgICAgIHN0ZF9tZW1tb3ZlKHZvaWQgKnBUbywgY29uc3Qgdm9pZCAqY3BGcm9tLCBpbnQgbkxlbik7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9tZW1zY3B5KHZvaWQgKmRzdCwgaW50IGRzdF9zaXplLCBjb25zdCB2b2lkICpzcmMsIGludCBzcmNfc2l6ZSk7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9tZW1zbW92ZSh2b2lkICpkc3QsIGludCBkc3Rfc2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc3JjX3NpemUpOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfbWVtY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIGludCBsZW5ndGgpOwpleHRlcm4gdm9pZCAqICAgICAgICBzdGRfbWVtY2hyKGNvbnN0IHZvaWQqIHMsIGludCBjLCBpbnQgbik7CmV4dGVybiB2b2lkICogICAgICAgIHN0ZF9tZW1zdHIoY29uc3QgY2hhciogY3BIYXlzdGFjaywgY29uc3QgY2hhciogY3Bzek5lZWRsZSwgaW50IG5IYXlzdGFja0xlbik7CmV4dGVybiB2b2lkICogICAgICAgIHN0ZF9tZW1yY2hyKGNvbnN0IHZvaWQqIHMsIGludCBjLCBpbnQgbik7CmV4dGVybiB2b2lkICogICAgICAgIHN0ZF9tZW1yY2hyYmVnaW4oY29uc3Qgdm9pZCogcCwgaW50IGMsIGludCBuTGVuKTsKZXh0ZXJuIHZvaWQgKiAgICAgICAgc3RkX21lbWNocmVuZChjb25zdCB2b2lkKiBjcGNTcmNoLCBpbnQgYywgaW50IG5MZW4pOwpleHRlcm4gdm9pZCAqICAgICAgICBzdGRfbWVtY2hyc2VuZChjb25zdCB2b2lkICpjcFNyY2gsIGNvbnN0IGNoYXIqIGNwc3pDaGFycywgaW50IG5MZW4pOwoKLy9PdGhlciBTdHJpbmcgZnVuY3Rpb25zCmV4dGVybiBjaGFyICogICAgICAgIHN0ZF9zdHJjaHIoY29uc3QgY2hhciogcywgaW50IGMpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3RyY2hycyhjb25zdCBjaGFyKiBzU3JjaCwgY29uc3QgY2hhciAqc0NoYXJzKTsKZXh0ZXJuIGNoYXIgKiAgICAgICAgc3RkX3N0cnJjaHIoY29uc3QgY2hhciogcywgaW50IGMpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3RyY2hyZW5kKGNvbnN0IGNoYXIgKmNwc3pTcmNoLCBjaGFyIGMpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3RyY2hyc2VuZChjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBjcHN6U3JjaCk7CmV4dGVybiBjaGFyICogICAgICAgIHN0ZF9zdHJlbmRzKGNvbnN0IGNoYXIqIGNwc3osIGNvbnN0IGNoYXIqIGNwc3pTdWZmaXgpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3RyaWVuZHMoY29uc3QgY2hhciogY3BzeiwgY29uc3QgY2hhciogY3BzelN1ZmZpeCk7CmV4dGVybiBjaGFyICogICAgICAgIHN0ZF9zdHJiZWdpbnMoY29uc3QgY2hhciogY3BzeiwgY29uc3QgY2hhciogY3BzelByZWZpeCk7CmV4dGVybiBjaGFyICogICAgICAgIHN0ZF9zdHJpYmVnaW5zKGNvbnN0IGNoYXIqIGNwc3osIGNvbnN0IGNoYXIqIGNwc3pQcmVmaXgpOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfc3RyY3Nwbihjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBjcHN6U3JjaCk7CmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zdHJzcG4oY29uc3QgY2hhciogcywgY29uc3QgY2hhciogY3BzelNyY2gpOwoKLy9XaWRlIGNoYXIgc3RyaW5nIGZ1bmN0aW9ucwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfd3N0cmxlbihjb25zdCBBRUNIQVIgKnMpOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfd3N0cmxjcHkoQUVDSEFSICpwY0RzdCwgY29uc3QgQUVDSEFSICpwc3pTcmMsIGludCBuRGVzdFNpemUpOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfd3N0cmxjYXQoQUVDSEFSICpwY0RzdCwgY29uc3QgQUVDSEFSICpwc3pTcmMsIGludCBuRGVzdFNpemUpOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfd3N0cm5jbXAoY29uc3QgQUVDSEFSKiBzMSwgY29uc3QgQUVDSEFSKiBzMiwgaW50IG5MZW4pOwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfd3N0cmNtcChjb25zdCBBRUNIQVIqIHMxLCBjb25zdCBBRUNIQVIqIHMyKTsKZXh0ZXJuIEFFQ0hBUiogICAgICAgc3RkX3dzdHJjaHIoY29uc3QgQUVDSEFSKiBjcHdzelRleHQsIEFFQ0hBUiBjaCk7CmV4dGVybiBBRUNIQVIqICAgICAgIHN0ZF93c3RycmNocihjb25zdCBBRUNIQVIqIGNwd3N6VGV4dCwgQUVDSEFSIGNoKTsKCi8vUGF0aCBmdW5jdGlvbnMKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX21ha2VwYXRoKGNvbnN0IGNoYXIgKmNwc3pEaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjcHN6RmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBzekRlc3QsIGludCBuRGVzdFNpemUpOwpleHRlcm4gY2hhciAqICAgICAgICBzdGRfc3BsaXRwYXRoKGNvbnN0IGNoYXIgKmNwc3pQYXRoLCBjb25zdCBjaGFyICpjcHN6RGlyKTsKZXh0ZXJuIGNoYXIgKiAgICAgICAgc3RkX2NsZWFucGF0aChjaGFyICpwc3pQYXRoKTsKZXh0ZXJuIGNoYXIgKiAgICAgICAgc3RkX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKnBzelBhdGgpOwoKLy9JbmV0IGZ1bmN0aW9ucywgbnVtYmVyIGZ1bmN0aW9ucwpleHRlcm4gdW5zaWduZWQgaW50ICAgICAgICBzdGRfc2NhbnVsKGNvbnN0IGNoYXIgKnBjaEJ1ZiwgaW50IG5SYWRpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcHBjaEVuZCwgaW50ICpwbkVycm9yKTsKZXh0ZXJuIHVpbnQ2NCAgICAgICAgc3RkX3NjYW51bGwoY29uc3QgY2hhciAqcGNoQnVmLCBpbnQgblJhZGl4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcHBjaEVuZCwgaW50ICpwbkVycm9yKTsKZXh0ZXJuIGRvdWJsZSAgICAgICAgc3RkX3NjYW5kKGNvbnN0IGNoYXIgKnBjaEJ1ZiwgY29uc3QgY2hhciAqKnBwY2hFbmQpOwoKLy8gUmFuZCBmdW5jdGlvbnMKZXh0ZXJuIHVuc2lnbmVkICAgICAgc3RkX3JhbmRfbmV4dCh1bnNpZ25lZCB1UmFuZCk7CmV4dGVybiB1aW50MzIgICAgICAgIHN0ZF9yYW5kKHVpbnQzMiB1U2VlZCwgYnl0ZSogcERlc3QsIGludCBuU2l6ZSk7CgoKLy8gcHJpbnRmIGZ1bmN0aW9ucwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfdnN0cmxwcmludGYoY2hhciAqcHN6RGVzdCwgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzekZtdCwgQUVFVmFMaXN0IGFyZ3MpOwoKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX3N0cmxwcmludGYoY2hhciAqcHN6RGVzdCwgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHN6Rm10LCAuLi4pOwoKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX3ZzbnByaW50ZihjaGFyICpwc3pEZXN0LCBpbnQgbkRlc3RTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNwc3pGbXQsIEFFRVZhTGlzdCBhcmdzKTsKCmV4dGVybiBpbnQgICAgICAgICAgIHN0ZF9zbnByaW50ZihjaGFyICpwc3pEZXN0LCBpbnQgbkRlc3RTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHN6Rm10LCAuLi4pOwoKLy8gZW5kaWFuIHN3YXBwaW5nIGZ1bmN0aW9ucwpleHRlcm4gaW50ICAgICAgICAgICBzdGRfQ29weUxFKHZvaWQgKnB2RGVzdCwgICAgICAgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlNyYywgIGludCBuU3JjU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwc3pGaWVsZHMpOwoKZXh0ZXJuIGludCAgICAgICAgICAgc3RkX0NvcHlCRSh2b2lkICpwdkRlc3QsICAgICAgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlNyYywgaW50IG5TcmNTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzekZpZWxkcyk7CgovLyBzb3J0aW5nIHV0aWxpdGllcwpleHRlcm4gdm9pZCAgc3RkX3Fzb3J0KHZvaWQqIHBFbGVtcywgaW50IG5OdW1FbGVtcywgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqcGZuQ29tcGFyZSkodm9pZCosIGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKiksCiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENvbXBhcmVDeCk7CgpleHRlcm4gaW50ICAgc3RkX2Jpc2VjdChjb25zdCB2b2lkKiBwRWxlbXMsIGludCBuTnVtRWxlbXMsIGludCBuRWxlbVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwRWxlbSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqcGZuQ29tcGFyZSkodm9pZCosIGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKiksCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDb21wYXJlQ3gpOwoKZXh0ZXJuIHZvaWQgIHN0ZF9tZXJnZSh2b2lkKiB2cERzdCwgaW50IG5Ec3QsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdnBBLCBpbnQgbkEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdnBCLCBpbnQgbkIsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqcGZuQ29tcGFyZSkodm9pZCosIGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKiksCiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcENvbXBhcmVDeCk7CgpleHRlcm4gaW50ICAgc3RkX3VuaXEodm9pZCogdnBFbGVtcywgaW50IG5OdW1FbGVtcywgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpwZm5Db21wYXJlKSh2b2lkKiwgY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBDb21wYXJlQ3gpOwoKI2lmZGVmIF9fY3BsdXNwbHVzCn0KI2VuZGlmIC8qICNpZmRlZiBfX2NwbHVzcGx1cyAqLwoKCiNkZWZpbmUgU1REX1NXQVBTKHVzKSBcCiAgICgoKCh1cykgJiAweGZmKSA8PCA4KSArICgoKHVzKSAmIDB4ZmYwMCkgPj4gOCkpCgoKc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IHN0ZF9zd2Fwcyh1bnNpZ25lZCBzaG9ydCB1cykKewogICByZXR1cm4gU1REX1NXQVBTKHVzKTsKfQoKLyogbm90ZSwgU1REX1NXQVBMKCkgcmVxdWlyZXMgdGhhdCB1bCBiZSBhbiBsLXZhbHVlLCBhbmQgZGVzdHJveWFibGUuCiAgIHRoaXMgbWFjcm8gaXMgbm90IGludGVuZGVkIGZvciB1c2Ugb3V0c2lkZSBBRUVzdGQuaCAqLwojZGVmaW5lIFNURF9TV0FQTCh1bCkgXAogICAgKCgodWwpID0gKCgodWwpICYgMHgwMGZmMDBmZikgPDwgOCkgfCAoKCh1bCk+PjgpICYgMHgwMGZmMDBmZikpLCgoKHVsKSA+PiAxNikgfCAoKHVsKSA8PCAxNikpKQoKc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgc3RkX3N3YXBsKHVuc2lnbmVkIGxvbmcgdWwpCnsKICAgcmV0dXJuIFNURF9TV0FQTCh1bCk7Cn0KCiNpZmRlZiBBRUVfQklHRU5ESUFOCiMgIGRlZmluZSBTVERfSFRPTkwodSkgICAgICh1KQojICBkZWZpbmUgU1REX0hUT05TKHUpICAgICAodSkKIyAgZGVmaW5lIFNURF9IVE9MRUwodSkgICAgKFNURF9TV0FQTCh1KSkKIyAgZGVmaW5lIFNURF9IVE9MRVModSkgICAgKFNURF9TV0FQUyh1KSkKI2Vsc2UKIyAgZGVmaW5lIFNURF9IVE9OTCh1KSAgICAgKFNURF9TV0FQTCh1KSkKIyAgZGVmaW5lIFNURF9IVE9OUyh1KSAgICAgKFNURF9TV0FQUyh1KSkKIyAgZGVmaW5lIFNURF9IVE9MRUwodSkgICAgKHUpCiMgIGRlZmluZSBTVERfSFRPTEVTKHUpICAgICh1KQojZW5kaWYKCnN0YXRpYyBfX2lubGluZSB1bnNpZ25lZCBzaG9ydCBzdGRfbGV0b2hzKHVuc2lnbmVkIHNob3J0IHVzKQp7CiAgIHJldHVybiBTVERfSFRPTEVTKHVzKTsKfQoKc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIHNob3J0IHN0ZF9odG9sZXModW5zaWduZWQgc2hvcnQgdXMpCnsKICAgcmV0dXJuIFNURF9IVE9MRVModXMpOwp9CgpzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgbG9uZyBzdGRfbGV0b2hsKHVuc2lnbmVkIGxvbmcgdWwpCnsKICAgcmV0dXJuIFNURF9IVE9MRUwodWwpOwp9CgpzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgbG9uZyBzdGRfaHRvbGVsKHVuc2lnbmVkIGxvbmcgdWwpCnsKICAgcmV0dXJuIFNURF9IVE9MRUwodWwpOwp9CgpzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgc3RkX250b2hzKHVuc2lnbmVkIHNob3J0IHVzKQp7CiAgIHJldHVybiBTVERfSFRPTlModXMpOwp9CgpzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgc2hvcnQgc3RkX2h0b25zKHVuc2lnbmVkIHNob3J0IHVzKQp7CiAgIHJldHVybiBTVERfSFRPTlModXMpOwp9CgpzdGF0aWMgX19pbmxpbmUgdW5zaWduZWQgbG9uZyBzdGRfbnRvaGwodW5zaWduZWQgbG9uZyB1bCkKewogICByZXR1cm4gU1REX0hUT05MKHVsKTsKfQoKc3RhdGljIF9faW5saW5lIHVuc2lnbmVkIGxvbmcgc3RkX2h0b25sKHVuc2lnbmVkIGxvbmcgdWwpCnsKICAgcmV0dXJuIFNURF9IVE9OTCh1bCk7Cn0KCgojdW5kZWYgU1REX0hUT05MICAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQojdW5kZWYgU1REX0hUT05TICAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQojdW5kZWYgU1REX0hUT0xFTCAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQojdW5kZWYgU1REX0hUT0xFUyAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQojdW5kZWYgU1REX1NXQVBTICAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQojdW5kZWYgU1REX1NXQVBMICAgLy8gcHJpdmF0ZSBtYWNybzsgbm90IGV4cG9ydGVkIGFzIGEgc3VwcG9ydGVkIEFQSQoKCi8qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ck1BQ1JPUyBET0NVTUVOVEFUSU9OCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfQ09OVFNUUkFJTigpCgpEZXNjcmlwdGlvbjoKICBTVERfQ09OVFNUUkFJTigpIGNvbnN0cmFpbnMgYSBudW1iZXIgdG8gYmUgYmV0d2VlbiB0d28gb3RoZXIgbnVtYmVycy4KCkRlZmluaXRpb246CiAgIFNURF9DT05TVFJBSU4oIHZhbCwgbWluLCBtYXggKSBcCiAgICAgICAgICAoKCh2YWwpIDwgKG1pbikpID8gKG1pbikgOiAoKHZhbCkgPiAobWF4KSkgPyAobWF4KSA6ICh2YWwpKQoKUGFyYW1ldGVyczoKICB2YWw6IG51bWJlciB0byBjb25zdHJhaW4KICBtaW46IG51bWJlciB0byBzdGF5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bwogIG1heDogbnVtYmVyIHRvIHN0YXkgbGVzcyB0aGFuIG9yIGVxdWFsIHRvCgpFdmFsdWF0aW9uIFZhbHVlOgogICB0aGUgY29uc3RyYWluZWQgbnVtYmVyCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1REX0JFVFdFRU4oKQoKRGVzY3JpcHRpb246CiAgICBTVERfQkVUV0VFTigpIHRlc3RzIHdoZXRoZXIgYSBudW1iZXIgaXMgYmV0d2VlbiB0d28gb3RoZXIgbnVtYmVycy4KCkRlZmluaXRpb246CiAgICBTVERfQkVUV0VFTiggdmFsLCBtaW5HRSwgbWF4TFQgKSBcCiAgICAgICAgICAgICAgICgodW5zaWduZWQpKCh1bnNpZ25lZCkodmFsKSAtICh1bnNpZ25lZCkobWluR0UpKSA8IFwKICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoKHVuc2lnbmVkKShtYXhMVCkgLSAodW5zaWduZWQpKG1pbkdFKSkpCgpQYXJhbWV0ZXJzOgogICAgIHZhbDogdmFsdWUgdG8gdGVzdAogICAgIG1pbkdFOiBsb3dlciBib3VuZAogICAgIG1heExUOiB1cHBlciBib3VuZAoKRXZhbHVhdGlvbiBWYWx1ZToKICAgICAxIGlmIHZhbCA+PSBtaW5HRSBhbmQgdmFsIDwgbWF4TFQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfQVJSQVlfU0laRSgpCgpEZXNjcmlwdGlvbjoKICAgU1REX0FSUkFZX1NJWkUoKSBnaXZlcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgYXJyYXkuCgpEZWZpbml0aW9uOgogICAgU1REX0FSUkFZX1NJWkUoYSkgKHNpemVvZigoYSkpL3NpemVvZigoYSlbMF0pKQoKUGFyYW1ldGVyczoKICAgIGE6IGFycmF5IHRvIHRlc3QKCkV2YWx1YXRpb24gVmFsdWU6CiAgICBudW1iZXIgb2YgZWxlbWVudHMgaW4gYQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClNURF9BUlJBWV9NRU1CRVIoKQoKRGVzY3JpcHRpb246CiAgIFNURF9BUlJBWV9NRU1CRVIoKSB0ZXN0cyB3aGV0aGVyIGFuIGl0ZW0gaXMgYSBtZW1iZXIgb2YgYSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBhcnJheS4KCkRlZmluaXRpb246CiAgIFNURF9BUlJBWV9NRU1CRVIocCxhKSAoKChwKSA+PSAoYSkpICYmICgocCkgPCAoKGEpICsgU1REX0FSUkFZX1NJWkUoYSkpKSkKClBhcmFtZXRlcnM6CiAgICBwOiBpdGVtIHRvIHRlc3QKICAgIGE6IGFycmF5IHRvIGNoZWNrCgpFdmFsdWF0aW9uIFZhbHVlOgogICAgMSBpZiBwIGlzIGluIGEKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfT0ZGU0VUT0YoKQoKRGVzY3JpcHRpb246CiAgU1REX09GRlNFVE9GKCkgZ2l2ZXMgdGhlIG9mZnNldCBvZiBtZW1iZXIgb2YgYSBzdHJ1Y3QuCgpEZWZpbml0aW9uOgogICBTVERfT0ZGU0VUT0YodHlwZSxtZW1iZXIpICgoKGNoYXIgKikoJigodHlwZSAqKTApLT5tZW1iZXIpKS0oKGNoYXIgKikwKSkKClBhcmFtZXRlcnM6CiAgICB0eXBlOiBzdHJ1Y3R1cmVkIHR5cGUKICAgIG1lbWJlcjogbmFtZSBvZiBtZW1iZXIgaW4gdGhlIHN0cnVjdAoKRXZhbHVhdGlvbiBWYWx1ZToKICAgIG9mZnNldCBvZiBtZW1iZXIgKGluIGJ5dGVzKSBpbiB0eXBlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1REX1JFQ09WRVJfUkVDKCkKCkRlc2NyaXB0aW9uOgogIFNURF9SRUNPVkVSX1JFQygpIHByb3ZpZGVzIGEgc2FmZSBjYXN0IGZyb20gYSBwb2ludGVyIHRvIGEgbWVtYmVyCiAgICBvZiBhIHN0cnVjdCB0byBhIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0CgpEZWZpbml0aW9uOgogIFNURF9SRUNPVkVSX1JFQyh0eXBlLG1lbWJlcixwKSAoKHR5cGUqKSgoKGNoYXIqKShwKSktU1REX09GRlNFVE9GKHR5cGUsbWVtYmVyKSkpCgpQYXJhbWV0ZXJzOgogICAgdHlwZTogc3RydWN0dXJlZCB0eXBlCiAgICBtZW1iZXI6IG5hbWUgb2YgbWVtYmVyIGluIHRoZSBzdHJ1Y3QKICAgIHA6IHBvaW50ZXIgdG8gdGhlIG1lbWJlciBvZiB0aGUgc3RydWN0CgpFdmFsdWF0aW9uIFZhbHVlOgogICAgYSBwb2ludGVyIG9mIHR5cGUgdHlwZSB0byB0aGUgY29udGFpbmluZyBzdHJ1Y3QKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfTUlOKCkKCkRlc2NyaXB0aW9uOgogICBTVERfTUlOKCkgZmluZHMgdGhlIHNtYWxsZXIgb2YgdHdvIHZhbHVlcy4KCkRlZmluaXRpb246CiAgIFNURF9NSU4oYSxiKSAgICgoYSk8KGIpPyhhKTooYikpCgpQYXJhbWV0ZXJzOgogICAgYSwgYjogdmFsdWVzIHRvIGNvbXBhcmUKCkV2YWx1YXRpb24gVmFsdWU6CiAgICBzbWFsbGVyIG9mIGEgYW5kIGIKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfTUFYKCkKCkRlc2NyaXB0aW9uOgogIFNURF9NQVgoKSBmaW5kcyB0aGUgbGFyZ2VyIG9mIHR3byB2YWx1ZXMuCgpEZWZpbml0aW9uOgogICBTVERfTUFYKGEsYikgICAoKGEpPihiKT8oYSk6KGIpKQoKUGFyYW1ldGVyczoKICAgIGEsIGI6IHZhbHVlcyB0byBjb21wYXJlCgpFdmFsdWF0aW9uIFZhbHVlOgogICAgbGFyZ2VyIG9mIGEgYW5kIGIKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfWkVST0FUKCkKCkRlc2NyaXB0aW9uOgogICBTVERfWkVST0FUKCkgemVyby1pbml0aWFsaXplcyB0aGUgY29udGVudHMgb2YgYSB0eXBlZCBjaHVuayBvZiBtZW1vcnkuCgpEZWZpbml0aW9uOgogICBTVERfWkVST0FUKHApICBzdGRfbWVtc2V0KChwKSwgMCwgc2l6ZW9mKCpwKSkKClBhcmFtZXRlcnM6CiAgICBwOiB0aGUgY2h1bmsgdG8gaW5pdGlhbGl6ZQoKRXZhbHVhdGlvbiBWYWx1ZToKICAgIHAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpTVERfQklUX1NFVCgpCgpEZXNjcmlwdGlvbjoKICAgU1REX0JJVF9TRVQoYml0cywgaXgpIHNldHMgdGhlIGJpdCBpbiB0aGUgbWVtb3J5IHN0b3JlZCBpbiBiaXRzIGF0CiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBpeAoKUGFyYW1ldGVyczoKICAgIGJpdHM6IHRoZSBtZW1vcnkgYWRkcmVzcyBob2xkaW5nIHRoZSAgYml0cwogICAgaXg6ICAgdGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gc2V0OwoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClNURF9CSVRfQ0xFQVIoKQoKRGVzY3JpcHRpb246CiAgIFNURF9CSVRfQ0xFQVIoYml0cywgaXgpIGNsZWFycyB0aGUgYml0IGluIHRoZSBtZW1vcnkgc3RvcmVkIGluIGJpdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgaW5kZXggaXgKClBhcmFtZXRlcnM6CiAgICBiaXRzOiB0aGUgbWVtb3J5IGFkZHJlc3MgaG9sZGluZyB0aGUgIGJpdHMKICAgIGl4OiAgIHRoZSBpbmRleCBvZiB0aGUgYml0IHRvIGNsZWFyCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKU1REX0JJVF9URVNUKCkKCkRlc2NyaXB0aW9uOgogICBTVERfQklUX1RFU1QoYml0cywgaXgpIHJldHVybnMgdGhlIGJpdCBpbiB0aGUgbWVtb3J5IHN0b3JlZCBpbiBiaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgaW5kZXggaXgKClBhcmFtZXRlcnM6CiAgICBiaXRzOiB0aGUgbWVtb3J5IGFkZHJlc3MgaG9sZGluZyB0aGUgYml0cwogICAgaXg6ICAgdGhlIGluZGV4IG9mIHRoZSBiaXQgdG8gdGVzdAoKRXZhbHVhdGlvbiBWYWx1ZToKICAgIDB4MSBpZiBzZXQgMHgwIGlmIG5vdCBzZXQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJTlRFUkZBQ0VTIERPQ1VNRU5UQVRJT04KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZCBJbnRlcmZhY2UKCkRlc2NyaXB0aW9uOgogICBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgYSBzZXQgb2YgZ2VuZXJhbC1wdXJwb3NlIHV0aWxpdHkgZnVuY3Rpb25zLgogICBGdW5jdGlvbmFsaXR5IG1heSBvdmVybGFwIHRoYXQgb2YgYSBzdWJzZXQgb2YgdGhlIEMgc3RhbmRhcmQgbGlicmFyeSwgYnV0CiAgIHRoaXMgbGlicmFyeSBkaWZmZXJzIGluIGEgZmV3IHJlc3BlY3RzOgoKICAgLSBGdW5jdGlvbnMgYXJlIGZ1bGx5IHJlZW50cmFudCBhbmQgYXZvaWQgdXNlIG9mIHN0YXRpYyB2YXJpYWJsZXMuCgogICAtIFRoZSBsaWJyYXJ5IGNhbiBiZSBzdXBwb3J0ZWQgY29uc2lzdGVudGx5IGFjcm9zcyBhbGwgZW52aXJvbm1lbnRzLgogICBDb21waWxlci1zdXBwbGllZCBsaWJyYXJpZXMgc29tZXRpbWVzIGJlaGF2ZSBpbmNvbnNpc3RlbnRseSBhbmQgYXJlCiAgIHVuYXZhaWxhYmxlIGluIHNvbWUgZW52aXJvbm1lbnRzLgoKICAgLSBPbWl0cyAidW5zYWZlIiBmdW5jdGlvbnMuICBDIHN0YW5kYXJkIGxpYnJhcnkgaW5jbHVkZXMgbWFueSBmdW5jdGlvbnMKICAgdGhhdCBhcmUgYmVzdCBhdm9pZGVkIGVudGlyZWx5OiBzdHJjcHksIHN0cmNhdCwgc3RydG9rLCBldGMuCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9nZXR2ZXJzaW9uKCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9nZXR2ZXJzaW9uKCkgY29waWVzIHRoZSBzdGRsaWIgdmVyc2lvbiB0byBwY0RzdC4gIFRoaXMgZnVuY3Rpb24KICAgdGFrZXMgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhcyBhbiBhcmd1bWVudCBhbmQgZ3VhcmFudGVlcwogICB0byB6ZXJvLXRlcm1pbmF0ZSB0aGUgcmVzdWx0IGFuZCBub3QgdG8gb3ZlcmZsb3cgdGhlIG5EZXN0U2l6ZSBzaXplLgoKICAgVGhpcyBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gc2l6ZS0xIGNoYXJhY3RlcnMgZnJvbSB0aGUgc3RkbGliIHZlcnNpb24KICAgc3RyaW5nIHRvIHBjRGVzdCBhbmQgTlVMLXRlcm1pbmF0ZXMgdGhlIHBjRGVzdCBzdHJpbmcuCgpQcm90b3R5cGU6CiAgIGludCAgc3RkX2dldHZlcnNpb24oY2hhciAqcGNEc3QsIGludCBuRGVzdFNpemUpCgoKUGFyYW1ldGVyczoKICAgcGNEc3QgOiAgICAgRGVzdGluYXRpb24gc3RyaW5nCiAgIG5EZXN0U2l6ZTogIFNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpbiBieXRlcwoKUmV0dXJuIFZhbHVlOgoKICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSB2ZXJzaW9uIHN0cmluZyAoaW4gY2hhcmFjdGVycykuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3N0cmxlbigpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zdHJsZW4oKSBjb21wdXRlcyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBzdHJpbmcuCgpQcm90b3R5cGU6CiAgIGludCBzdGRfc3RybGVuKGNvbnN0IGNoYXIgKmNwc3pTdHIpCgpQYXJhbWV0ZXJzOgogICBjcHN6U3RyIDogU3RyaW5nIHdob3NlIGxlbmd0aCB3aWxsIGJlIGNvbXB1dGVkCgpSZXR1cm4gVmFsdWU6CiAgIExlbmd0aCBvZiB0aGUgc3RyaW5nIGluIGNoYXJhY3RlcnMgdGhhdCBwcmVjZWRlIHRoZSB0ZXJtaW5hdGluZyBOVUxMIGNoYXJhY3Rlci4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyY21wKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmNtcCgpIGNvbXBhcmVzIHR3byBOVUwtdGVybWluYXRlZCBjaGFyYWN0ZXIgc3RyaW5ncy4KICAgQ29tcGFyaXNvbiBpcyBzdHJpY3RseSBieSBieXRlIHZhbHVlcyB3aXRoIG5vIGNoYXJhY3RlciBzZXQKICAgaW50ZXJwcmV0YXRpb24uCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3N0cmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOwoKUGFyYW1ldGVyczoKICAgczEsIHMyOiBzdHJpbmdzIHRvIGNvbXBhcmUKClJldHVybiBWYWx1ZToKICAgMCBpZiBzdHJpbmdzIGFyZSB0aGUgc2FtZSB+CiAgIDwgMCBpZiBzMSBpcyBsZXNzIHRoYW4gczIgfgogICA+IDAgaWYgczEgaXMgZ3JlYXRlciB0aGFuIHMyCgpTZWUgQWxzbzoKICAgc3RkX3dzdHJjbXAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RybmNtcCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zdHJuY21wKCkgY29tcGFyZXMgYXQgbW9zdCBuIGJ5dGVzIG9mIHR3byBOVUwtdGVybWluYXRlZCBjaGFyYWN0ZXIgc3RyaW5ncy4KClByb3RvdHlwZToKCiAgIGludCBzdGRfc3RybmNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIGludCBuKTsKClBhcmFtZXRlcnM6CiAgIHMxLCBzMjogc3RyaW5ncyB0byBjb21wYXJlCiAgIG46IG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUuICBpZiBlaXRoZXIgczEgb3IgczIgaXMKICAgICAgIHNob3J0ZXIgdGhhbiBuLCB0aGUgZnVuY3Rpb24gdGVybWluYXRlcyB0aGVyZQoKUmV0dXJuIFZhbHVlOgogICAwIGlmIHN0cmluZ3MgYXJlIHRoZSBzYW1lIH4KICAgPCAwIGlmIHMxIGlzIGxlc3MgdGhhbiBzMiB+CiAgID4gMCBpZiBzMSBpcyBncmVhdGVyIHRoYW4gczIKClNlZSBBbHNvOgogICBzdGRfd3N0cm5jbXAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyaWNtcCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zdHJpY21wKCkgY29tcGFyZXMgdHdvIE5VTC10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmdzLCBjYXNlLWZvbGRpbmcgYW55CiAgIEFTQ0lJIGNoYXJhY3RlcnMuCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3N0cmljbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKClBhcmFtZXRlcnM6CiAgIHMxLCBzMjogc3RyaW5ncyB0byBjb21wYXJlCgpSZXR1cm4gVmFsdWU6CiAgIDAgaWYgc3RyaW5ncyBhcmUgdGhlIHNhbWUgfgogICA8IDAgaWYgczEgaXMgbGVzcyB0aGFuIHMyIH4KICAgPiAwIGlmIHMxIGlzIGdyZWF0ZXIgdGhhbiBzMgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJuaWNtcCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zdHJuaWNtcCgpIGNvbXBhcmVzIGF0IG1vc3QgbiBieXRlcyBvZiAyIE5VTC10ZXJtaW5hdGVkIGNoYXJhY3RlciBzdHJpbmdzLAogICBjYXNlLWZvbGRpbmcgYW55IEFTQ0lJIGNoYXJhY3RlcnMuCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3N0cm5pY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IG4pOwoKUGFyYW1ldGVyczoKICAgczEsIHMyOiBzdHJpbmdzIHRvIGNvbXBhcmUKICAgbjogbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZS4gIGlmIGVpdGhlciBzMSBvciBzMiBpcwogICAgICAgc2hvcnRlciB0aGFuIG4sIHRoZSBmdW5jdGlvbiB0ZXJtaW5hdGVzIHRoZXJlCgpSZXR1cm4gVmFsdWU6CiAgIDAgaWYgc3RyaW5ncyBhcmUgdGhlIHNhbWUgfgogICA8IDAgaWYgczEgaXMgbGVzcyB0aGFuIHMyIH4KICAgPiAwIGlmIHMxIGlzIGdyZWF0ZXIgdGhhbiBzMgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJsY3B5KCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9zdHJsY3B5KCkgY29waWVzIHBzelNyYyBzdHJpbmcgdG8gdGhlIHBjRHN0LiAgSXQgaXMgYSBzYWZlcgogICBhbHRlcm5hdGl2ZSB0byBzdHJjcHkoKSBvciBzdHJuY3B5KCkuICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBzaXplIG9mIHRoZQogICBkZXN0aW5hdGlvbiBidWZmZXIgYXMgYW4gYXJndW1lbnQgYW5kIGd1YXJhbnRlZXMgdG8gTlVMLXRlcm1pbmF0ZSB0aGUKICAgcmVzdWx0IGFuZCBub3QgdG8gb3ZlcmZsb3cgdGhlIG5EZXN0U2l6ZSBzaXplLgoKICAgVGhpcyBmdW5jdGlvbiBjb3BpZXMgdXAgdG8gbkRlc3RTaXplLTEgY2hhcmFjdGVycyBmcm9tIHRoZSBwc3pTcmMgc3RyaW5nCiAgIHRvIHBjRGVzdCBhbmQgTlVMLXRlcm1pbmF0ZXMgdGhlIHBjRGVzdCBzdHJpbmcuCgpQcm90b3R5cGU6CiAgIGludCBzdGRfc3RybGNweShjaGFyICpwY0RzdCwgY29uc3QgY2hhciAqcHN6U3JjLCBpbnQgbkRlc3RTaXplKQoKUGFyYW1ldGVyczoKICAgcGNEc3QgOiAgICAgRGVzdGluYXRpb24gc3RyaW5nCiAgIHBjU3JjIDogICAgIFNvdXJjZSBzdHJpbmcKICAgbkRlc3RTaXplOiAgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGluIGJ5dGVzCgpSZXR1cm4gVmFsdWU6CgogICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaW4gY2hhcmFjdGVycykgaXQgdHJpZWQgdG8gY3JlYXRlLAogICB3aGljaCBpcyBzYW1lIGFzIGxlbmd0aCBvZiBwc3pTcmMuCgogICBFeGFtcGxlOgoKICAgewogICAgICBjaGFyIGJ1Zls2NF07CiAgICAgIGlmIChzdGRfc3RybGNweShidWYsIGZpbGVfbmFtZSwgU1REX0FSUkFZX1NJWkUoYnVmKSA+PQogICAgICAgICAgU1REX0FSUkFZX1NJWkUoYnVmKSkgewogICAgICAgICAvL1RydW5jYXRlZCAtLSBIYW5kbGUgb3ZlcmZsb3cuLi4uCiAgICAgIH0KICAgfQoKQ29tbWVudDoKCiAgIFVubGlrZSBzdHJsY3B5LCBzdGRfc3RybGNweSBhY2NlcHRzIGFuIGludGVnZXIgc2l6ZSBhbmQgZG9lcyBub3RoaW5nIHdoZW4gYQogICBuZWdhdGl2ZSB2YWx1ZSBpcyBwYXNzZWQuICBXaGVuIHBhc3NpbmcgdmFsaWQgc2l6ZXMgZm9yIG9iamVjdHMgb24gb3VyCiAgIHN1cHBvcnRlZCBwbGF0Zm9ybXMsIHRoaXMgc2hvdWxkIG5vdCByZXN1bHQgaW4gYW55IG9ic2VydmVkIGRpZmZlcmVuY2UuCiAgIEhvd2V2ZXIsIGNhbGxpbmcgc3RybGNweSgpIHdpdGggVUlOVF9NQVggd2lsbCByZXN1bHQgaW4gdGhlIGVudGlyZSBzb3VyY2UKICAgc3RyaW5nIGJlaW5nIGNvcGllZCwgd2hlcmVhcyBzdGRfc3RybGNweSgpIHdpbGwgZG8gbm90aGluZy4gIFBhc3NpbmcgSU5UX01BWAogICB0byBzdHJfc3RybGNweSgpIHdpbGwgYWNoaWV2ZSB0aGUgc2FtZSByZXN1bHQgKGFsdGhvdWdoIGJvdGggdGhlc2UgY2FzZXMgYXJlCiAgIGJhZCBwcmFjdGljZSBzaW5jZSB0aGV5IGRlZmVhdCBib3VuZHMgY2hlY2tpbmcpLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RybGNhdCgpCgpEZXNjcmlwdGlvbjoKCiAgIFRoZSBzdGRfc3RybGNhdCgpIGZ1bmN0aW9uIGNvbmNhdGVuYXRlcyBhIHN0cmluZyB0byBhIHN0cmluZyBhbHJlYWR5CiAgIHJlc2lkaW5nIGluIGEgYnVmZmVyLiAgSXQgaXMgYSBzYWZlciBhbHRlcm5hdGl2ZSB0byBzdHJjYXQoKSBvciBzdHJuY2F0KCkuCiAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhcyBhbiBhcmd1bWVudCBhbmQKICAgZ3VhcmFudGVlcyBub3QgdG8gY3JlYXRlIGFuIGltcHJvcGVybHkgdGVybWluYXRlZCBzdHJpbmcgYW5kIG5vdCB0bwogICBvdmVyZmxvdyB0aGUgbkRlc3RTaXplIHNpemUuCgogICBUaGlzIGZ1bmN0aW9uIGFwcGVuZHMgcHN6U3JjIHRvIHBjRHN0LCBjb3B5aW5nIGF0IG1vc3QgbkRlc3RTaXplIG1pbnVzCiAgIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpbiBwY0Rlc3QgbWludXMgMSBieXRlcywgYWx3YXlzIE5VTC10ZXJtaW5hdGluZwogICB0aGUgcmVzdWx0LgoKICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCAic3RybGNhdCgpIiwgc3RkX3N0cmxjYXQoKSBkb2VzICpub3QqIHplcm8tdGVybWluYXRlCiAgIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaW4gY2FzZXMgd2hlcmUgdGhlIGJ1ZmZlciBsYWNrcyB0ZXJtaW5hdGlvbiBvbiBlbnRyeQogICB0byB0aGUgZnVuY3Rpb24uICBEbyBub3QgcmVseSBvbiBzdGRfc3RybGNhdCgpIHRvIHplcm8tdGVybWluYXRlIGEgYnVmZmVyCiAgIHRoYXQgaXMgbm90IGFscmVhZHkgemVyby10ZXJtaW5hdGVkOyBpbnN0ZWFkIGVuc3VyZSB0aGF0IHRoZSBidWZmZXIgaXMKICAgcHJvcGVybHkgaW5pdGlhbGl6ZWQgdXNpbmcgc3RkX3N0cmxjcHkoKSBvciBzb21lIG90aGVyIG1lYW5zLgoKUHJvdG90eXBlOgoKICAgaW50IHN0ZF9zdHJsY2F0KGNoYXIgKnBjRHN0LCBjb25zdCBjaGFyICpwc3pTcmMsIGludCBuRGVzdFNpemUpCgpQYXJhbWV0ZXJzOgoKICAgcGNEc3QgOiAgICAgRGVzdGluYXRpb24gc3RyaW5nCiAgIHBjU3JjIDogICAgIFNvdXJjZSBzdHJpbmcKICAgbkRlc3RTaXplOiAgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGluIGJ5dGVzCgpSZXR1cm4gVmFsdWU6CgogICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaW4gY2hhcmFjdGVycykgaXQgdHJpZWQgdG8gY3JlYXRlLAogICB3aGljaCBpcyBzYW1lIGFzIGxlbmd0aCBvZiBwc3pTcmMgcGx1cyB0aGUgbGVuZ3RoIG9mIHBzekRlc3QuCgogICBFeGFtcGxlOgoKICAgewogICAgICBjaGFyIGJ1Zls2NF07CiAgICAgIGlmIChzdGRfc3RybGNhdChidWYsIGZpbGVfbmFtZSwgU1REX0FSUkFZX1NJWkUoYnVmKSA+PQogICAgICAgICAgU1REX0FSUkFZX1NJWkUoYnVmKSkgewogICAgICAgICAvL1RydW5jYXRlZCAtLSBIYW5kbGUgb3ZlcmZsb3cuLi4uCiAgICAgIH0KICAgfQoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3Ryc3RyKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cnN0cigpIGZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgc3Vic3RyaW5nIGluIGEgc3RyaW5nLgoKUHJvdG90eXBlOgoKICAgY2hhciAqIHN0ZF9zdHJzdHIoY29uc3QgY2hhciAqcHN6U3RyaW5nLCBjb25zdCBjaGFyICpwc3pTZWFyY2gpOwoKUGFyYW1ldGVyczoKICAgcHN6U3RyaW5nOiBzdHJpbmcgdG8gc2VhcmNoCiAgIHBzelNlYXJjaDogc3ViIHN0cmluZyB0byBzZWFyY2ggZm9yCgpSZXR1cm4gVmFsdWU6CiAgIEEgcG9pbnRlciB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIHRoZSBzdWJzdHJpbmcgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3RvbG93ZXIoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfdG9sb3dlcigpIGNvbnZlcnRzIGFuIHVwcGVyY2FzZSBsZXR0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKICAgbG93ZXJjYXNlIGxldHRlci4KClByb3RvdHlwZToKICAgY2hhciBzdGRfdG9sb3dlcihjaGFyIGMpOwoKUGFyYW1ldGVyczoKICAgYzogQSBjaGFyYWN0ZXIuCgpSZXR1cm4gVmFsdWU6CiAgIHRoZSBjb3JyZXNwb25kaW5nIGxvd2VyY2FzZSBsZXR0ZXIgaWYgYyBpcyBhbiBBU0NJSSBjaGFyYWN0ZXIgd2hvc2UKICAgdmFsdWUgaXMgcmVwcmVzZW50YWJsZSBhcyBhbiB1cHBlcmNhc2UgbGV0dGVyLCBlbHNlIHRoZSBzYW1lIGNoYXJhY3RlcgogICBjIGlzIHJldHVybmVkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF90b3VwcGVyKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3RvdXBwZXIoKSBjb252ZXJ0cyBhbiBsb3dlcmNhc2UgbGV0dGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgIHVwcGVyY2FzZSBsZXR0ZXIuCgpQcm90b3R5cGU6CiAgIGNoYXIgc3RkX3RvdXBwZXIoY2hhciBjKTsKClBhcmFtZXRlcnM6CiAgIGM6IGlzIGEgY2hhcmFjdGVyLgoKUmV0dXJuIFZhbHVlOgogICBUaGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgbGV0dGVyIGlmIGMgaXMgYW4gQVNDSUkgY2hhcmFjdGVyIHdob3NlCiAgIHZhbHVlIGlzIHJlcHJlc2VudGFibGUgYXMgYW4gbG93ZXJjYXNlIGxldHRlcjsgZWxzZSB0aGUgc2FtZSBjaGFyYWN0ZXIKICAgYyBpcyByZXR1cm5lZC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbWVtc2V0KCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX21lbXNldCgpIHNldHMgZWFjaCBieXRlIGluIGEgYmxvY2sgb2YgbWVtb3J5IHRvIGEgdmFsdWUuCgpQcm90b3R5cGU6CgogICB2b2lkICpzdGRfbWVtc2V0KHZvaWQgKnAsIGludCBjLCBpbnQgbkxlbik7CgpQYXJhbWV0ZXJzOgogICBwOiBtZW1vcnkgYmxvY2sgdG8gc2V0CiAgIGM6IHZhbHVlIHRvIHNldCBlYWNoIGJ5dGUgdG8KICAgbkxlbjogc2l6ZSBvZiBwIGluIGJ5dGVzCgpSZXR1cm4gVmFsdWU6CiAgIHAKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbWVtbW92ZSgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9tZW1tb3ZlKCkgY29waWVzIGEgYmxvY2sgb2YgbWVtb3J5IGZyb20gb25lIGJ1ZmZlciB0byBhbm90aGVyLgoKUHJvdG90eXBlOgoKICAgdm9pZCAqc3RkX21lbW1vdmUodm9pZCAqcFRvLCBjb25zdCB2b2lkICpjcEZyb20sIGludCBuTGVuKTsKClBhcmFtZXRlcnM6CiAgIHBUbzogZGVzdGluYXRpb24gYnVmZmVyCiAgIGNwRnJvbTogc291cmNlIGJ1ZmZlcgogICBuTGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQoKUmV0dXJuIFZhbHVlOgogICBwVG8KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbWVtc21vdmUoKQoKRGVzY3JpcHRpb246CgogIFNpemUgYm91bmRlZCBtZW1vcnkgbW92ZS4KCiAgTW92ZXMgYnl0ZXMgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgoKICBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGVyZSB3aWxsIG5vdCBiZSBhIGNvcHkgYmV5b25kCiAgdGhlIHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KCiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBpbiBwcmVmZXJlbmNlIHRvIG1lbXNjcHkoKSBpZiB0aGVyZQogIGlzIHRoZSBwb3NzaWJsaXR5IG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYnVmZmVycyBvdmVybGFwcGluZy4KICBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gaXMgZGVmaW5lZCB0byBiZSBhcyBpZiB0aGUgY29weSB3ZXJlIGZyb20KICB0aGUgc291cmNlIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciB0aGF0IG92ZXJsYXBzIG5laXRoZXIgc291cmNlIG5vcgogIGRlc3RpbmF0aW9uLCBmb2xsb3dlZCBieSBhIGNvcHkgZnJvbSB0aGF0IHRlbXBvcmFyeSBidWZmZXIgdG8gdGhlCiAgZGVzdGluYXRpb24uCgpQcm90b3R5cGU6CgogIGludCBzdGRfbWVtc21vdmUodm9pZCAqZHN0LCBpbnQgZHN0X3NpemUsIGNvbnN0IHZvaWQgKnNyYywgaW50IHNyY19zaXplKTsKClBhcmFtZXRlcnM6CiAgQHBhcmFtW291dF0gZHN0ICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlci4KICBAcGFyYW1baW5dICBkc3Rfc2l6ZSAgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGluIGJ5dGVzLgogIEBwYXJhbVtpbl0gIHNyYyAgICAgICBTb3VyY2UgYnVmZmVyLgogIEBwYXJhbVtpbl0gIHNyY19zaXplICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHNvdXJjZSBidWZmZXIuCgpSZXR1cm4gdmFsdWU6CiAgVGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIEl0IGlzIHRoZQogIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNoZWNrIGZvciB0cnVuY3Rpb24gaWYgaXQgY2FyZXMgYWJvdXQgaXQgLQogIHRydW5jYXRpb24gaGFzIG9jY3VycmVkIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbGVzcyB0aGFuIHNyY19zaXplLgogIEEgbmVnYXRpdmUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyBhbiBlcnJvcgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9tZW1jbXAoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfbWVtY21wKCkgY29tcGFyZXMgdHdvIG1lbW9yeSBidWZmZXJzLCBieXRlLXdpc2UuCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX21lbWNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCBpbnQgbGVuZ3RoKTsKClBhcmFtZXRlcnM6CiAgIGEsIGI6IGJ1ZmZlcnMgdG8gY29tcGFyZQogICBsZW5ndGg6IG51bWJlciBvZiBieXRlcyB0byBjb21wYXJlCgpSZXR1cm4gVmFsdWU6CiAgIDAgaWYgYnVmZmVycyBhcmUgdGhlIHNhbWUgZm9yIG5MZW5ndGggfgogICA8IDAgaWYgYSBpcyBsZXNzIHRoYW4gYiB+CiAgID4gMCBpZiBhIGlzIGdyZWF0ZXIgdGhhbiBiCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX21lbXNjcHkgLSBTaXplIGJvdW5kZWQgbWVtb3J5IGNvcHkuCgpEZXNjcmlwdGlvbjoKCiAgQ29waWVzIGJ5dGVzIGZyb20gdGhlIHNvdXJjZSBidWZmZXIgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KCiAgVGhpcyBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBub3QgYmUgYSBjb3B5IGJleW9uZAogIHRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCgogIFRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGlzIG9uIG92ZXJsYXBwaW5nIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KICBidWZmZXJzIGlzIHVuZGVmaW5lZC4KClByb3RvdHlwZToKCiAgIGludCBzdGRfbWVtc2NweSh2b2lkICpkc3QsIGludCBkc3Rfc2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgc3JjX3NpemUpOwoKUGFyYW1ldGVyczoKCiAgQHBhcmFtW291dF0gZHN0ICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlci4KICBAcGFyYW1baW5dICBkc3Rfc2l6ZSAgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGluIGJ5dGVzLgogIEBwYXJhbVtpbl0gIHNyYyAgICAgICBTb3VyY2UgYnVmZmVyLgogIEBwYXJhbVtpbl0gIHNyY19zaXplICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHNvdXJjZSBidWZmZXIuCgpSZXR1cm4gdmFsdWU6CgogIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBJdCBpcyB0aGUKICBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjaGVjayBmb3IgdHJ1bmN0aW9uIGlmIGl0IGNhcmVzIGFib3V0IGl0IC0KICB0cnVuY2F0aW9uIGhhcyBvY2N1cnJlZCBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGxlc3MgdGhhbiBzcmNfc2l6ZS4KICBSZXR1cnMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbWVtY2hyKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX21lbWNocigpIGZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIGluIGEgbWVtb3J5CiAgIGJ1ZmZlci4KClByb3RvdHlwZToKCiAgIHZvaWQgKnN0ZF9tZW1jaHIoY29uc3Qgdm9pZCogcywgaW50IGMsIGludCBuKTsKClBhcmFtZXRlcnM6CiAgIHM6IGJ1ZmZlciB0byBzZWFyY2gKICAgYzogdmFsdWUgb2YgYnl0ZSB0byBsb29rIGZvcgogICBuOiBzaXplIG9mIHMgaW4gYnl0ZXMKClJldHVybiBWYWx1ZToKICAgQSBwb2ludGVyIHRvIHRoZSBvY2N1cnJlbmNlIG9mIGMuIE5VTEwgaWYgbm90IGZvdW5kLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9tZW1zdHIoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfbWVtc3RyKCkgZmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzdWJzdHJpbmcgaW4gYSBtZW1vcnkKICAgYnVmZmVyLgoKUHJvdG90eXBlOgoKICAgdm9pZCAqc3RkX21lbXN0cihjb25zdCBjaGFyKiBjcEhheXN0YWNrLCBjb25zdCBjaGFyKiBjcHN6TmVlZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBuSGF5c3RhY2tMZW4pOwoKUGFyYW1ldGVyczoKICAgY3BIYXlzdGFjazogYnVmZmVyIHRvIHNlYXJjaAogICBjcHN6TmVlZGxlOiBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2VhcmNoIGZvcgogICBuSGF5c3RhY2tMZW46IHNpemUgb2YgY3BIYXlzdGFjayBpbiBieXRlcwoKUmV0dXJuIFZhbHVlOgogICBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgY3Bzek5lZWRsZSBpZiBmb3VuZCwKICAgICAgIE5VTEwgb3RoZXJ3aXNlCgpDb21tZW50czoKICAgTm9uZQoKU2lkZSBFZmZlY3RzOgogICBOb25lCgpTZWUgQWxzbzoKICAgTm9uZQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9tZW1yY2hyKCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9tZW1yY2hyKCkgZmluZHMgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiBhIG1lbW9yeQogICBidWZmZXIuCgpQcm90b3R5cGU6CgogICB2b2lkICpzdGRfbWVtcmNocihjb25zdCB2b2lkKiBzLCBpbnQgYywgaW50IG4pOwoKUGFyYW1ldGVyczoKICAgczogYnVmZmVyIHRvIHNlYXJjaAogICBjOiB2YWx1ZSBvZiBieXRlIHRvIGxvb2sgZm9yCiAgIG46IHNpemUgb2YgcyBpbiBieXRlcwoKUmV0dXJuIFZhbHVlOgogICBhIHBvaW50ZXIgdG8gdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBjLCBOVUxMIGlmIG5vdCBmb3VuZAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9tZW1yY2hyYmVnaW4oKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfbWVtcmNocmJlZ2luKCkgZmluZHMgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiBhCiAgIG1lbW9yeSBidWZmZXIuCgpQcm90b3R5cGU6CgogICB2b2lkICpzdGRfbWVtcmNocmJlZ2luKGNvbnN0IHZvaWQqIHMsIGludCBjLCBpbnQgbik7CgpQYXJhbWV0ZXJzOgogICBzOiBidWZmZXIgdG8gc2VhcmNoCiAgIGM6IHZhbHVlIG9mIGJ5dGUgdG8gbG9vayBmb3IKICAgbjogc2l6ZSBvZiBzIGluIGJ5dGVzCgpSZXR1cm4gVmFsdWU6CiAgIGEgcG9pbnRlciB0byB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGMsIG9yIHMgaWYgbm90IGZvdW5kCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX21lbWNocmVuZCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9tZW1jaHJlbmQoKSBmaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIGNoYXJhY3RlciBpbiBhCiAgIG1lbW9yeSBidWZmZXIuCgpQcm90b3R5cGU6CgogICB2b2lkICpzdGRfbWVtY2hyZW5kKGNvbnN0IHZvaWQqIHMsIGludCBjLCBpbnQgbik7CgpQYXJhbWV0ZXJzOgogICBzOiBidWZmZXIgdG8gc2VhcmNoCiAgIGM6IHZhbHVlIG9mIGJ5dGUgdG8gbG9vayBmb3IKICAgbjogc2l6ZSBvZiBzIGluIGJ5dGVzCgpSZXR1cm4gVmFsdWU6CiAgIGEgcG9pbnRlciB0byB0aGUgb2NjdXJyZW5jZSBvZiBjLCBzICsgbiBpZiBub3QgZm91bmQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CnN0ZF9tZW1jaHJzZW5kKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX21lbWNocnNlbmQoKSBmaW5kcyB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyIGluIGEKICAgTlVMLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFyYWN0ZXJzIGluIGEgbWVtb3J5IGJ1ZmZlci4KClByb3RvdHlwZToKCiAgIHZvaWQgKnN0ZF9tZW1jaHJlbmQoY29uc3Qgdm9pZCogcywgY29uc3QgY2hhciogY3BzekNoYXJzLCBpbnQgbik7CgpQYXJhbWV0ZXJzOgogICBzOiBidWZmZXIgdG8gc2VhcmNoCiAgIGNwc3pDaGFyczogY2hhcmFjdGVycyB0byBsb29rIGZvcgogICBuOiBzaXplIG9mIHMgaW4gYnl0ZXMKClJldHVybiBWYWx1ZToKICAgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIG9uZSBvZiBjcHN6Q2hhcnMsIHMgKyBuIGlmIG5vdCBmb3VuZAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJjaHIoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfc3RyY2hyKCkgZmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYQogICBOVUwtdGVybWluYXRlZCBzdHJpbmcuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfc3RyY2hyKGNvbnN0IGNoYXIqIHMsIGludCBjKTsKClBhcmFtZXRlcnM6CiAgIHM6IHN0cmluZyB0byBzZWFyY2gKICAgYzogY2hhciB0byBzZWFyY2ggZm9yCgpSZXR1cm4gVmFsdWU6CiAgIHBvaW50ZXIgdG8gZmlyc3Qgb2NjdXJyZW5jZSwgTlVMTCBpZiBub3QgZm91bmQKClNlZSBBbHNvOgogICBzdGRfd3N0cmNocgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJjaHJzKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmNocnMoKSBzZWFyY2hlcyBzLCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgZm9yIHRoZSBmaXJzdAogICBvY2N1cnJlbmNlIG9mIGFueSBjaGFyYWN0ZXJzIGluIGNwc3pTcmNoLCBhIE5VTC10ZXJtaW5hdGVkIGxpc3Qgb2YKICAgY2hhcmFjdGVycy4KClByb3RvdHlwZToKCiAgIGNoYXIgKnN0ZF9zdHJjaHJzKGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIgKmNwc3pTcmNoKTsKClBhcmFtZXRlcnM6CiAgIHM6IHN0cmluZyB0byBzZWFyY2gKICAgY3BzelNyY2g6IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKClJldHVybiBWYWx1ZToKICAgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgb2YgY3BzelNyY2gsIE5VTEwgaWYgbm90IGZvdW5kCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3N0cnJjaHIoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfc3RycmNocigpIGZpbmRzIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYQogICBOVUwtdGVybWluYXRlZCBzdHJpbmcuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfc3RycmNocihjb25zdCBjaGFyKiBzLCBpbnQgYyk7CgpQYXJhbWV0ZXJzOgogICBzOiBzdHJpbmcgdG8gc2VhcmNoCiAgIGM6IGNoYXIgdG8gc2VhcmNoIGZvcgoKUmV0dXJuIFZhbHVlOgogICBwb2ludGVyIHRvIGxhc3Qgb2NjdXJyZW5jZSwgTlVMTCBpZiBub3QgZm91bmQKClNlZSBBbHNvOgogICBzdGRfd3N0cnJjaHIKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyY2hyZW5kKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmNocmVuZCgpIGZpbmRzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIGluIGEKICAgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLgoKUHJvdG90eXBlOgoKICAgY2hhciAqc3RkX3N0cmNocmVuZChjb25zdCBjaGFyKiBzLCBpbnQgYyk7CgpQYXJhbWV0ZXJzOgogICBzOiBzdHJpbmcgdG8gc2VhcmNoCiAgIGM6IGNoYXIgdG8gc2VhcmNoIGZvcgoKUmV0dXJuIFZhbHVlOgogICBwb2ludGVyIHRvIGZpcnN0IG9jY3VycmVuY2UsIHMgKyBzdGRfc3RybGVuKHMpIGlmIG5vdCBmb3VuZAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJjaHJzZW5kKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmNocnNlbmQoKSBzZWFyY2hlcyBzLCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgZm9yIHRoZSBmaXJzdAogICBvY2N1cnJlbmNlIG9mIGFueSBjaGFyYWN0ZXJzIGluIGNwc3pTcmNoLCBhIE5VTC10ZXJtaW5hdGVkIGxpc3Qgb2YKICAgY2hhcmFjdGVycy4KClByb3RvdHlwZToKCiAgIGNoYXIgKnN0ZF9zdHJjaHJzZW5kKGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIGNwc3pTcmNoKTsKClBhcmFtZXRlcnM6CiAgIHM6IHN0cmluZyB0byBzZWFyY2gKICAgY3BzelNyY2g6IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKClJldHVybiBWYWx1ZToKICAgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgb2YgY3BzelNyY2ggb3IgcytzdHJsZW4ocykgaWYgbm90IGZvdW5kCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3N0cmVuZHMoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfc3RyZW5kcygpIHRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgZW5kcyBpbiBhIHBhcnRpY3VsYXIgc3VmZml4LgoKUHJvdG90eXBlOgoKICAgY2hhciAqc3RkX3N0cmVuZHMoY29uc3QgY2hhciogY3BzeiwgY29uc3QgY2hhciogY3BzelN1ZmZpeCk7CgpQYXJhbWV0ZXJzOgogICBjcHN6OiBzdHJpbmcgdG8gdGVzdAogICBjcHN6U3VmZml4OiBzdWZmaXggdG8gdGVzdCBmb3IKClJldHVybiBWYWx1ZToKICAgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBjcHN6K3N0ZF9zdHJsZW4oY3Bzeiktc3RkX3N0cmxlbihjcHN6U3VmZml4KQogICAgIGlmIGNwc3ogZW5kcyB3aXRoIGNwc3pTdWZmaXguICBOVUxMIG90aGVyd2lzZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyaWVuZHMoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfc3RyaWVuZHMoKSB0ZXN0cyB3aGV0aGVyIGEgc3RyaW5nIGVuZHMgaW4gYSBwYXJ0aWN1bGFyIHN1ZmZpeCwKICAgY2FzZS1mb2xkaW5nIEFTQ0lJIGNoYXJhY3RlcnMuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfc3RyaWVuZHMoY29uc3QgY2hhciogY3BzeiwgY29uc3QgY2hhciogY3BzelN1ZmZpeCk7CgpQYXJhbWV0ZXJzOgogICBjcHN6OiBzdHJpbmcgdG8gdGVzdAogICBjcHN6U3VmZml4OiBzdWZmaXggdG8gdGVzdCBmb3IKClJldHVybiBWYWx1ZToKICAgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBjcHN6K3N0ZF9zdHJsZW4oY3Bzeiktc3RkX3N0cmxlbihjcHN6U3VmZml4KQogICAgIGlmIGNwc3ogZW5kcyB3aXRoIGNwc3pTdWZmaXguICBOVUxMIG90aGVyd2lzZS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyYmVnaW5zKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmJlZ2lucygpIHRlc3RzIHdoZXRoZXIgYSBzdHJpbmcgYmVnaW5zIHdpdGggYSBwYXJ0aWN1bGFyCiAgIHByZWZpeCBzdHJpbmcuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfc3RyYmVnaW5zKGNvbnN0IGNoYXIqIGNwc3osIGNvbnN0IGNoYXIqIGNwc3pQcmVmaXgpOwoKUGFyYW1ldGVyczoKICAgY3Bzejogc3RyaW5nIHRvIHRlc3QKICAgY3BzelByZWZpeDogcHJlZml4IHRvIHRlc3QgZm9yCgpSZXR1cm4gVmFsdWU6CiAgIGNwc3ogKyBzdGRfc3RybGVuKGNwc3pQcmVmaXgpIGlmIGNwc3ogZG9lcyBiZWdpbiB3aXRoIGNwc3pQcmVmaXgsCiAgICAgTlVMTCBvdGhlcndpc2UKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RyaWJlZ2lucygpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zdHJpYmVnaW5zKCkgdGVzdHMgd2hldGhlciBhIHN0cmluZyBiZWdpbnMgd2l0aCBhIHBhcnRpY3VsYXIKICAgcHJlZml4IHN0cmluZywgY2FzZS1mb2xkaW5nIEFTQ0lJIGNoYXJhY3RlcnMuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfc3RyaWJlZ2lucyhjb25zdCBjaGFyKiBjcHN6LCBjb25zdCBjaGFyKiBjcHN6UHJlZml4KTsKClBhcmFtZXRlcnM6CiAgIGNwc3o6IHN0cmluZyB0byB0ZXN0CiAgIGNwc3pQcmVmaXg6IHByZWZpeCB0byB0ZXN0IGZvcgoKUmV0dXJuIFZhbHVlOgogICBjcHN6ICsgc3RkX3N0cmxlbihjcHN6UHJlZml4KSBpZiBjcHN6IGRvZXMgYmVnaW4gd2l0aCBjcHN6UHJlZml4LAogICAgIE5VTEwgb3RoZXJ3aXNlCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zdHJjc3BuKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cmNzcG4oKSBmdW5jdGlvbiBzZWFyY2hlcyBzLCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgZm9yCiAgIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFueSBjaGFyYWN0ZXJzIGluIGNwc3pTcmNoLCBhIE5VTC10ZXJtaW5hdGVkCiAgIGxpc3Qgb2YgY2hhcmFjdGVycy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QKICAgaW5pdGlhbCBzdWJzdHJpbmcgb2YgcyB3aGljaCBjb25zaXN0cyBvZiBjaGFyYWN0ZXJzIG5vdCBwcmVzZW50IGluCiAgIGNwc3pTcmNoLgoKUHJvdG90eXBlOgoKICAgaW50IHN0ZF9zdHJjc3BuKGNvbnN0IGNoYXIqIHMsIGNvbnN0IGNoYXIqIGNwc3pTcmNoKTsKClBhcmFtZXRlcnM6CiAgIHM6IHN0cmluZyB0byBzZWFyY2gKICAgY3BzelNyY2g6IGEgbGlzdCBvZiBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKClJldHVybiBWYWx1ZToKICAgVGhlIGluZGV4IGludG8gdGhlIHN0cmluZyBzIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFueSBvZiB0aGUKICAgY2hhcmFjdGVycyBpbiBjcHN6U3JjaC4gSWYgbm8gbWF0Y2ggaXMgZm91bmQsIHRoZW4gaW5kZXggb2YgdGhlCiAgIHRlcm1pbmF0aW5nIE5VTCBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQuCgpTZWUgQWxzbzoKICAgc3RkX3N0cnNwbiwgc3RkX3N0cmNociwgc3RkX3N0cmNocnMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3Ryc3BuKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N0cnNwbigpIGZ1bmN0aW9ucyBzZWFyY2hlcyBzLCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZywgZm9yCiAgIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIHRoYXQgbWF0Y2hlcyBub25lIG9mIHRoZQogICBjaGFyYWN0ZXJzIGluIGNwc3pTcmNoLCBhIE5VTC10ZXJtaW5hdGVkIGxpc3Qgb2YgY2hhcmFjdGVycy4gVGhpcwogICBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3QgaW5pdGlhbCBzdWJzdHJpbmcgb2YgcwogICB3aGljaCBjb25zaXN0cyBvZiBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gY3BzelNyY2guCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3N0cnNwbihjb25zdCBjaGFyKiBzLCBjb25zdCBjaGFyKiBjcHN6U3JjaCk7CgpQYXJhbWV0ZXJzOgogICBzOiBzdHJpbmcgdG8gc2VhcmNoCiAgIGNwc3pTcmNoOiBhIGxpc3Qgb2YgY2hhcmFjdGVycyB0byBzZWFyY2ggZm9yCgpSZXR1cm4gVmFsdWU6CiAgIFRoZSBpbmRleCBpbnRvIHRoZSBzdHJpbmcgcyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbnkgY2hhcmFjdGVyCiAgIHRoYXQgbWF0Y2hlcyBub25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGNwc3pTcmNoLiBJZiBhbGwgY2hhcmFjdGVycwogICBpbiBzIGFyZSBwcmVzZW50IGluIGNwc3pTcmNoLCB0aGUgaW5kZXggb2YgdGhlIHRlcm1pbmF0aW5nIE5VTAogICBjaGFyYWN0ZXIgaXMgcmV0dXJuZWQuCgpTZWUgQWxzbzoKICAgc3RkX3N0cmNzcG4sIHN0ZF9zdHJjaHIsIHN0ZF9zdHJjaHJzCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3dzdHJsY3B5KCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF93c3RybGNweSgpIGZ1bmN0aW9uIGNvcGllcyBhIHN0cmluZy4gIEl0IGlzIGVxdWl2YWxlbnQgdG8KICAgc3RyX3N0cmxjcHkoKSBleGNlcHQgdGhhdCBpdCBvcGVyYXRlcyBvbiB3aWRlICgxNi1iaXQpIGNoYXJhY3RlciBzdHJpbmdzLgogICBTZWUgc3RkX3N0cmxjcHkoKSBmb3IgZGV0YWlscy4KCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3dzdHJsY3B5KEFFQ0hBUiAqcGNEZXN0LCBjb25zdCBBRUNIQVIgKnBzelNyYywgaW50IG5EZXN0U2l6ZSk7CgpQYXJhbWV0ZXJzOgogICBwY0RzdDogZGVzdGluYXRpb24gc3RyaW5nCiAgIHBzelNyYzogc291cmNlIHN0cmluZwogICBpbnQgbkRlc3RTaXplOiBzaXplIG9mIHBjRGVzdCBfX2luIEFFQ0hBUnNfXwoKUmV0dXJuIFZhbHVlOgogICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAoaW4gQUVDSEFScykgaXQgdHJpZWQgdG8gY3JlYXRlLAogICB3aGljaCBpcyBzYW1lIGFzIGxlbmd0aCBvZiBwc3pTcmMuCgogICBFeGFtcGxlOgoKICAgewogICAgICBBRUNIQVIgYnVmWzY0XTsKICAgICAgaWYgKHN0ZF93c3RybGNweShidWYsIGZpbGVfbmFtZSwgU1REX0FSUkFZX1NJWkUoYnVmKSkgPj0KICAgICAgICAgIFNURF9BUlJBWV9TSVpFKGJ1ZikpIHsKICAgICAgICAgLy9UcnVuY2F0ZWQgLS0gSGFuZGxlIG92ZXJmbG93Li4uLgogICAgICB9CiAgIH0KClNlZSBBbHNvOgogICBzdGRfd3N0cmxjYXQKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfd3N0cmxjYXQoKQoKRGVzY3JpcHRpb246CgogICBUaGUgc3RkX3dzdHJsY2F0KCkgZnVuY3Rpb24gY29uY2F0ZW5hdGVzIHR3byBzdHJpbmdzLiAgSXQgaXMgZXF1aXZhbGVudCB0bwogICBzdGRfc3RybGNhdCgpIGV4Y2VwdCB0aGF0IGl0IG9wZXJhdGVzIG9uIHdpZGUgKDE2LWJpdCkgY2hhcmFjdGVyIHN0cmluZ3MuCiAgIFNlZSBzdGRfc3RybGNhdCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKUHJvdG90eXBlOgogICBpbnQgc3RkX3dzdHJsY2F0KEFFQ0hBUiAqcGNEc3QsIGNvbnN0IEFFQ0hBUiAqcHN6U3JjLCBpbnQgbkRlc3RTaXplKQoKUGFyYW1ldGVyczoKICAgcGNEc3Rbb3V0XTogRGVzdGluYXRpb24gc3RyaW5nCiAgIHBjU3JjIDogICAgIFNvdXJjZSBzdHJpbmcKICAgbkRlc3RTaXplOiAgU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGluIEFFQ0hBUnMKClJldHVybiBWYWx1ZToKICAgUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKGluIEFFQ0hBUnMpIGl0IHRyaWVkIHRvIGNyZWF0ZSwKICAgd2hpY2ggaXMgc2FtZSBhcyBsZW5ndGggb2YgcHN6U3JjICsgdGhlIGxlbmd0aCBvZiBwc3pEZXN0LgoKICAgRXhhbXBsZToKCiAgIHsKICAgICAgY2hhciBidWZbNjRdOwogICAgICBpZiAoc3RkX3dzdHJsY2F0KGJ1ZiwgZmlsZV9uYW1lLCBTVERfQVJSQVlfU0laRShidWYpKSA+PQogICAgICAgICAgU1REX0FSUkFZX1NJWkUoYnVmKSkgewogICAgICAgICAvL1RydW5jYXRlZCAtLSBIYW5kbGUgb3ZlcmZsb3cuLi4uCiAgICAgIH0KICAgfQoKU2VlIEFsc286CiAgIHN0ZF93c3RybGNweQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF93c3RybmNtcCgpCgpEZXNjcmlwdGlvbjoKCiAgIFRoZSBzdGRfd3N0cm5jbXAoKSBmdW5jdGlvbiBjb21wYXJlcyB1cCB0byBhIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMKICAgaW4gdHdvIE5VTC10ZXJtaW5hdGVkIHN0cmluZ3MuIEl0IGlzIGVxdWl2YWxlbnQgdG8gc3RkX3N0cm5jbXAoKSBleGNlcHQKICAgdGhhdCBpdCBvcGVyYXRlcyBvbiB3aWRlICgxNi1iaXQpIGNoYXJhY3RlciBzdHJpbmdzLgoKUHJvdG90eXBlOgogICBpbnQgc3RkX3dzdHJuY21wKGNvbnN0IEFFQ0hBUiogczEsIGNvbnN0IEFFQ0hBUiogczIsIGludCBuTGVuKTsKClBhcmFtZXRlcnM6CiAgIHMxLCBzMjogc3RyaW5ncyB0byBjb21wYXJlCiAgIG46IG1heGltdW0gbnVtYmVyIG9mIEFFQ0hBUnMgdG8gY29tcGFyZS4gIGlmIGVpdGhlciBzMSBvciBzMiBpcwogICAgICBzaG9ydGVyIHRoYW4gbiwgdGhlIGZ1bmN0aW9uIHRlcm1pbmF0ZXMgdGhlcmUuCgpSZXR1cm4gVmFsdWU6CiAgIDAgaWYgc3RyaW5ncyBhcmUgdGhlIHNhbWUgfgogICA8IDAgaWYgczEgaXMgbGVzcyB0aGFuIHMyIH4KICAgPiAwIGlmIHMxIGlzIGdyZWF0ZXIgdGhhbiBzMgoKU2VlIEFsc286CiAgIHN0ZF9zdHJuY21wCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3dzdHJjbXAoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfd3N0cmNtcCgpIGNvbXBhcmVzIHR3byBOVUwtdGVybWluYXRlZCBzdHJpbmdzLiBJdCBpcyBlcXVpdmFsZW50CiAgIHRvIHN0ZF9zdHJuY21wKCkgZXhjZXB0IHRoYXQgaXQgb3BlcmF0ZXMgb24gd2lkZSAoMTYtYml0KSBjaGFyYWN0ZXIKICAgc3RyaW5ncy4gQ29tcGFyaXNvbiBpcyBzdHJpY3RseSBieSBieXRlIHZhbHVlcyB3aXRoIG5vIGNoYXJhY3RlciBzZXQKICAgaW50ZXJwcmV0YXRpb24uCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3dzdHJjbXAoY29uc3QgQUVDSEFSKiBzMSwgY29uc3QgQUVDSEFSKiBzMik7CgpQYXJhbWV0ZXJzOgogICBzMSwgczI6IHN0cmluZ3MgdG8gY29tcGFyZQoKUmV0dXJuIFZhbHVlOgogICAwIGlmIHN0cmluZ3MgYXJlIHRoZSBzYW1lIH4KICAgPCAwIGlmIHMxIGlzIGxlc3MgdGhhbiBzMiB+CiAgID4gMCBpZiBzMSBpcyBncmVhdGVyIHRoYW4gczIKClNlZSBBbHNvOgogICBzdGRfc3RyY21wCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3dzdHJjaHIoKQoKRGVzY3JpcHRpb246CiAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHdpZGUgc3RyaW5nIGNvdW50ZXJwYXJ0IG9mIHN0ZF9zdHJjaHIoKS4KICAgVGhlIHN0ZF93c3RyY2hyKCkgZmluZHMgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYQogICBOVUwtdGVybWluYXRlZCB3aWRlICgxNi1iaXQpIGNoYXJhY3RlciBzdHJpbmcuCgpQcm90b3R5cGU6CgogICBBRUNIQVIqIHN0ZF93c3RyY2hyKGNvbnN0IEFFQ0hBUiogcywgQUVDSEFSIGNoKTsKClBhcmFtZXRlcnM6CiAgIHM6IHN0cmluZyB0byBzZWFyY2gKICAgY2g6IGNoYXIgdG8gc2VhcmNoIGZvcgoKUmV0dXJuIFZhbHVlOgogICBwb2ludGVyIHRvIGZpcnN0IG9jY3VycmVuY2UsIE5VTEwgaWYgbm90IGZvdW5kCgpTZWUgQWxzbzoKICAgc3RkX3N0cmNocgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF93c3RycmNocigpCgpEZXNjcmlwdGlvbjoKICAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgd2lkZSBzdHJpbmcgY291bnRlcnBhcnQgb2Ygc3RkX3N0cnJjaHIoKS4KICAgVGhlIHN0ZF93c3RycmNocigpIGZpbmRzIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYQogICBOVUwtdGVybWluYXRlZCB3aWRlICgxNi1iaXQpIGNoYXJhY3RlciBzdHJpbmcuCgpQcm90b3R5cGU6CgogICBBRUNIQVIqIHN0ZF93c3RycmNocihjb25zdCBBRUNIQVIqIHMsIEFFQ0hBUiBjaCk7CgpQYXJhbWV0ZXJzOgogICBzOiBzdHJpbmcgdG8gc2VhcmNoCiAgIGNoOiBjaGFyIHRvIHNlYXJjaCBmb3IKClJldHVybiBWYWx1ZToKICAgcG9pbnRlciB0byBsYXN0IG9jY3VycmVuY2UsIE5VTEwgaWYgbm90IGZvdW5kCgpTZWUgQWxzbzoKICAgc3RkX3N0cnJjaHIKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbWFrZXBhdGgoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfbWFrZXBhdGgoKSBjb25zdHJ1Y3RzIGEgcGF0aCBmcm9tIGEgZGlyZWN0b3J5IHBvcnRpb24gYW5kIGEgZmlsZQogICBwb3J0aW9uLCB1c2luZyBmb3J3YXJkIHNsYXNoZXMsIGFkZGluZyBuZWNlc3Nhcnkgc2xhc2hlcyBhbmQgZGVsZXRpbmcgZXh0cmEKICAgIHNsYXNoZXMuICBUaGlzIGZ1bmN0aW9uIGd1YXJhbnRlZXMgTlVMLXRlcm1pbmF0aW9uIG9mIHBzekRlc3QKClByb3RvdHlwZToKCiAgIGludCBzdGRfbWFrZXBhdGgoY29uc3QgY2hhciAqY3BzekRpciwgY29uc3QgY2hhciAqY3BzekZpbGUsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqcHN6RGVzdCwgaW50IG5EZXN0U2l6ZSkKClBhcmFtZXRlcnM6CiAgIGNwc3pEaXI6IGRpcmVjdG9yeSBwYXJ0CiAgIGNwc3pGaWxlOiBmaWxlIHBhcnQKICAgcHN6RGVzdDogb3V0cHV0IGJ1ZmZlcgogICBuRGVzdFNpemU6IHNpemUgb2Ygb3V0cHV0IGJ1ZmZlciBpbiBieXRlcwoKUmV0dXJuIFZhbHVlOgogICB0aGUgcmVxdWlyZWQgbGVuZ3RoIHRvIGNvbnN0cnVjdCB0aGUgcGF0aCwgbm90IGluY2x1ZGluZwogICBOVUwtdGVybWluYXRpb24KCkNvbW1lbnRzOgogICBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgZXhhbXBsZXMgc2hvd3MgdGhlIHN0cmluZ3MgcmV0dXJuZWQgYnkKICAgc3RkX21ha2VwYXRoKCkgZm9yIGRpZmZlcmVudCBwYXRocy4KCkV4YW1wbGU6CgogICBjcHN6RGlyICBjcHN6RmlsZSAgc3RkX21ha2VwYXRoKCkKICAgIiIgICAgICAgICIiICAgICAgICAgICAiIgogICAiIiAgICAgICAgIi8iICAgICAgICAgICIiCiAgICIvIiAgICAgICAiIiAgICAgICAgICAgIi8iCiAgICIvIiAgICAgICAiLyIgICAgICAgICAgIi8iCiAgICIvIiAgICAgICAiZiIgICAgICAgICAgIi9mIgogICAiLyIgICAgICAgIi9mIiAgICAgICAgICIvZiIKICAgImQiICAgICAgICJmIiAgICAgICAgICAiZC9mIgogICAiZC8iICAgICAgImYiICAgICAgICAgICJkL2YiCiAgICJkIiAgICAgICAiL2YiICAgICAgICAgImQvZiIKICAgImQvIiAgICAgICIvZiIgICAgICAgICAiZC9mIgoKU2VlIEFsc286CiAgIHN0ZF9zcGxpdHBhdGgKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3BsaXRwYXRoKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3NwbGl0cGF0aCgpIGZpbmRzIHRoZSBmaWxlbmFtZSBwYXJ0IG9mIGEgcGF0aCBnaXZlbiBhbiBpbmNsdXNpdmUKICAgZGlyZWN0b3J5LCB0ZXN0cyBmb3IgY3BzelBhdGggYmVpbmcgaW4gY3BzekRpci4gVGhlIGZvcndhcmQgc2xhc2hlcyBhcmUKICAgdXNlZCBhcyBkaXJlY3RvcnkgZGVsaW1pdGVycy4KClByb3RvdHlwZToKCiAgIGNoYXIgKnN0ZF9zcGxpdHBhdGgoY29uc3QgY2hhciAqY3BzelBhdGgsIGNvbnN0IGNoYXIgKmNwc3pEaXIpOwoKUGFyYW1ldGVyczoKICAgY3BzelBhdGg6IHBhdGggdG8gdGVzdCBmb3IgaW5jbHVzaW9uCiAgIGNwc3pEaXI6IGRpcmVjdG9yeSB0aGF0IGNwc3pQYXRoIG1pZ2h0IGJlIGluCgpSZXR1cm4gVmFsdWU6CiAgIHRoZSBwYXJ0IG9mIGNwc3pQYXRoIHRoYXQgYWN0dWFsbHkgZmFsbHMgYmVuZWF0aCBjcHN6RGlyLCBOVUxMIGlmCiAgIGNwc3pQYXRoIGlzIG5vdCB1bmRlciBjcHN6RGlyCgpDb21tZW50czoKICAgVGhlIHN0ZF9zcGxpdHBhdGgoKSBpcyBzaW1pbGFyIHRvIHN0ZF9zdHJiZWdpbnMoKSwgYnV0IGl0IGlnbm9yZXMgdHJhaWxpbmcKICAgc2xhc2hlcyBvbiBjcHN6RGlyLCBhbmQgaXQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZgogICB0aGUgc3VicGF0aC4KCiAgIFRoZSByZXR1cm4gdmFsdWUgb2Ygc3RkX3NwbGl0cGF0aCgpIHdpbGwgbmV2ZXIgYmVnaW4gd2l0aCBhICcvJy4KCiAgIFRoZSBmb2xsb3dpbmcgbGlzdCBvZiBleGFtcGxlcyBzaG93cyB0aGUgc3RyaW5ncyByZXR1cm5lZCBieQogICBzdGRfc3BsaXRwYXRoKCkgZm9yIGRpZmZlcmVudCBwYXRocy4KCkV4YW1wbGU6CiAgIGNwc3pQYXRoIGNwc3pEaXIgIHN0ZF9zcGxpdHBhdGgoKQogICAiIiAgICAgICAgIiIgICAgICAgICAgICIiCiAgICIiICAgICAgICAiLyIgICAgICAgICAgIiIKICAgIi8iICAgICAgICIiICAgICAgICAgICAiIgogICAiLyIgICAgICAgIi8iICAgICAgICAgICIiCiAgICIvZCIgICAgICAiZCIgICAgICAgICAgbnVsbAogICAiL2QiICAgICAgIi8iICAgICAgICAgICJkIgogICAiL2QvIiAgICAgIi9kIiAgICAgICAgICIiCiAgICIvZC9mIiAgICAiLyIgICAgICAgICAgImQvZiIKICAgIi9kL2YiICAgICIvZCIgICAgICAgICAiZiIKICAgIi9kL2YiICAgICIvZC8iICAgICAgICAiZiIKClNlZSBBbHNvOgogICBzdGRfbWFrZXBhdGgKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfY2xlYW5wYXRoKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX2NsZWFucGF0aCgpIHJlbW92ZXMgZG91YmxlIHNsYXNoZXMsICIuIiwgYW5kICIuLiIgZnJvbQogICBzbGFzaC1kZWxpbWl0ZWQgcGF0aHMsLiBJdCBvcGVyYXRlcyBpbi1wbGFjZS4KClByb3RvdHlwZToKCiAgIGNoYXIgKnN0ZF9jbGVhbnBhdGgoY2hhciAqcHN6UGF0aCk7CgpQYXJhbWV0ZXJzOgogICBwc3pQYXRoW2luL291dF06IHBhdGggdG8gImNsZWFuIgoKUmV0dXJuIFZhbHVlOgogICBwc3pQYXRoCgpDb21tZW50czoKICAgUGFzc2luZyBhbiAiZnM6LyIgcGF0aCB0byB0aGlzIGZ1bmN0aW9uIG1heSBwcm9kdWNlIHVuZGVzaXJhYmxlCiAgIHJlc3VsdHMuICBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgJy8nIGlzIHRoZSByb290LgoKRXhhbXBsZXM6CiAgICAgICBwc3pQYXRoICBzdGRfY2xlYW5wYXRoKCkKICAgICAgICAgIiIsICAgICAgICAgICAiIiwKICAgICAgICAgIi8iLCAgICAgICAgICAiLyIsCgogICAgICAgICAvLyBoZXJlInMsIG1vc3RseSBhbG9uZQogICAgICAgICAiLi8iLCAgICAgICAgICIvIiwKICAgICAgICAgIi8uIiwgICAgICAgICAiLyIsCiAgICAgICAgICIvLi8iLCAgICAgICAgIi8iLAoKICAgICAgICAgLy8gInVwInMsIG1vc3RseSBhbG9uZQogICAgICAgICAiLi4iLCAgICAgICAgICIiLAogICAgICAgICAiLy4uIiwgICAgICAgICIvIiwKICAgICAgICAgIi4uLyIsICAgICAgICAiLyIsCiAgICAgICAgICIvLi4vIiwgICAgICAgIi8iLAoKICAgICAgICAgLy8gZnVuIHdpdGggeAogICAgICAgICAieC8uIiwgICAgICAgICJ4IiwKICAgICAgICAgIngvLi8iLCAgICAgICAieC8iLAogICAgICAgICAieC8uLiIsICAgICAgICIiLAogICAgICAgICAiL3gvLi4iLCAgICAgICIvIiwKICAgICAgICAgIngvLi4vIiwgICAgICAiLyIsCiAgICAgICAgICIveC8uLi8iLCAgICAgIi8iLAogICAgICAgICAiL3gvLi4vLi4iLCAgICIvIiwKICAgICAgICAgIngvLi4vLi4iLCAgICAiIiwKICAgICAgICAgIngvLi4vLi4vIiwgICAiLyIsCiAgICAgICAgICJ4Ly4vLi4vIiwgICAgIi8iLAogICAgICAgICAieC8uLy4vIiwgICAgICJ4LyIsCiAgICAgICAgICJ4Ly4uLy4vIiwgICAgIi8iLAogICAgICAgICAieC8uLi8uIiwgICAgICIiLAogICAgICAgICAieC8uLy4uIiwgICAgICIiLAogICAgICAgICAiLi4veCIsICAgICAgICIveCIsCiAgICAgICAgICIuLi8uLi94IiwgICAgIi94IiwKICAgICAgICAgIi8uLi94IiwgICAgICAiL3giLAogICAgICAgICAiLi8uLi94IiwgICAgICIveCIsCgogICAgICAgICAvLyBkb3VibGUgc2xhc2hlcwogICAgICAgICAiLy8iLCAgICAgICAgICIvIiwKICAgICAgICAgIi8vLyIsICAgICAgICAiLyIsCiAgICAgICAgICIvLy8vIiwgICAgICAgIi8iLAogICAgICAgICAieC8veCIsICAgICAgICJ4L3giLAoKClNpZGUgRWZmZWN0czoKICAgTm9uZQoKU2VlIEFsc286CiAgIE5vbmUKCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX2Jhc2VuYW1lKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX2Jhc2VuYW1lKCkgcmV0dXJucyB0aGUgZmlsZW5hbWUgcGFydCBvZiBhIHN0cmluZywKICAgYXNzdW1pbmcgJy8nIGRlbGltaXRlZCBmaWxlbmFtZXMuCgpQcm90b3R5cGU6CgogICBjaGFyICpzdGRfYmFzZW5hbWUoY29uc3QgY2hhciAqY3BzelBhdGgpOwoKUGFyYW1ldGVyczoKICAgY3BzelBhdGg6IHBhdGggb2YgaW50ZXJlc3QKClJldHVybiBWYWx1ZToKICAgcG9pbnRlciBpbnRvIGNwc3pQYXRoIHRoYXQgZGVub3RlcyBwYXJ0IG9mIHRoZSBzdHJpbmcgaW1tZWRpYXRlbHkKICAgZm9sbG93aW5nIHRoZSBsYXN0ICcvJwoKRXhhbXBsZXM6CiAgICAgY3BzelBhdGggICAgICAgc3RkX2Jhc2VuYW1lKCkKICAgICAgICAgIiIgICAgICAgICAgICAiIgogICAgICAgICAiLyIgICAgICAgICAgICIiCiAgICAgICAgICJ4IiAgICAgICAgICAgIngiCiAgICAgICAgICIveCIgICAgICAgICAgIngiCiAgICAgICAgICJ5L3giICAgICAgICAgIngiCiAgICAgICAgICIveS94IiAgICAgICAgIngiCgogU2VlIEFsc286CiAgICBOb25lCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3JhbmRfbmV4dCgpCgpEZXNjcmlwdGlvbjoKICBUaGUgc3RkX3JhbmRfbmV4dCgpIGdlbmVyYXRlcyBwc2V1ZG8tcmFuZG9tIGJ5dGVzLgoKUHJvdG90eXBlOgoKICAgdW5zaWduZWQgc3RkX3JhbmRfbmV4dCh1bnNpZ25lZCB1UmFuZCk7CgpQYXJhbWV0ZXJzOgogICB1UmFuZDogYSBzZWVkIGZvciB0aGUgcHNldWRvLXJhbmRvbSBnZW5lcmF0b3IKClJldHVybiBWYWx1ZToKICAgdGhlIG5leHQgdmFsdWUgaW4gdGhlIGdlbmVyYXRvciBmcm9tIHVSYW5kCgpDb21tZW50czoKICAgZm9yIGJlc3QgcmVzdWx0cywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggaXRzIGxhc3QKICAgZ2VuZXJhdGVkIG91dHB1dC4KCiAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBjb2RlIHRvIGdlbmVyYXRlIDI1NiBieXRlcyBvZiBwc2V1ZG8tcmFuZG9tIGRhdGEuCgogICBUaGlzIGlzIG5vdCBjcnlwdG8gcXVhbGl0eSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZvciBrZXkgZ2VuZXJhdGlvbgogICBhbmQgdGhlIGxpa2UuCgpFeGFtcGxlOgogICB7CiAgICAgICB1bnNpZ25lZCByYW5kX2J1ZlsyNTYvc2l6ZW9mKHVuc2lnbmVkKV07CiAgICAgICBpbnQgICAgICBpOwogICAgICAgdW5zaWduZWQgdUxhc3QgPSBzdGRfcmFuZF9uZXh0KHVDdXJyZW50VGltZSk7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgU1REX0FSUkFZX1NJWkUocmFuZF9idWYpOyBpKyspIHsKICAgICAgICAgIHJhbmRfYnVmW2ldID0gKHVMYXN0ID0gc3RkX3JhbmRfbmV4dCh1TGFzdCkpOwogICAgICAgfQogICB9CgpTZWUgQWxzbzoKICAgc3RkX3JhbmQoKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9yYW5kKCkKCkRlc2NyaXB0aW9uOgogIFRoZSBzdGRfcmFuZCgpIGZ1bmN0aW9ucyBnZW5lcmF0ZXMgcHNldWRvLXJhbmRvbSBieXRlcyBhbmQgcGxhY2VzIGl0CiAgaW4gYW4gb3V0cHV0IGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZS4KClByb3RvdHlwZToKCiAgIHVpbnQzMiBzdGRfcmFuZCh1aW50MzIgdVNlZWQsIGJ5dGUqIHBEZXN0LCBpbnQgblNpemUpOwoKUGFyYW1ldGVyczoKICAgdVNlZWQ6IEEgc2VlZCBmb3IgdGhlIHBzZXVkby1yYW5kb20gZ2VuZXJhdG9yCiAgIHBEZXN0OiBUaGUgb3V0cHV0IGJ1ZmZlciB3aGVyZSB0aGUgcmFuZG9tIGJ5dGVzIGFyZSBwbGFjZWQuCiAgIG5TaXplOiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBwRGVzdC4KClJldHVybiBWYWx1ZToKICAgVGhlIG5ldyBzZWVkIHZhbHVlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBzdWJzZXF1ZW50IGNhbGwgdG8KICAgc3RkX3JhbmQoKS4KCkNvbW1lbnRzOgoKICAgc3RkX3JhbmQoKSBpcyBhIGxpbmVhciBjb25ncnVlbnQgcHN1ZWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHRoYXQKICAgaXMgc2VlZGVkIHVzaW5nIHRoZSBpbnB1dCBzZWVkLiBUaGlzIG1ha2VzIHRoZSBvdXB1dCBwcmVkaWN0YWJsZSBpZgogICB5b3UgY2FuIGRldGVybWluZSAob3IgaW5mbHVlbmNlKSB0aGUgc2VlZCB2YWx1ZSB1c2VkLiBGdXJ0aGVybW9yZSwKICAgdGhlIHJhbmRvbSBzZXF1ZW5jZSBvZiBieXRlcyBnZW5lcmF0ZWQgYnkgdHdvIGRpZmZlcmVudCBjYWxscyB0byB0aGlzCiAgIGZ1bmN0aW9uIHdpbGwgYmUgaWRlbnRpY2FsIGlmIGJvdGggdGhlIGNhbGxzIHVzZSB0aGUgc2FtZSBzZWVkIHZhbHVlLgoKICAgVGhpcyBpcyBub3QgY3J5cHRvIHF1YWxpdHkgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBmb3Iga2V5IGdlbmVyYXRpb24KICAgYW5kIG90aGVyIGNyeXB0b2dyYXBoaWMgdXNlcy4KClNlZSBBbHNvOgogICBzdGRfcmFuZF9uZXh0KCkKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfQ29weUxFKCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9Db3B5TEUoKSBmdW5jdGlvbiBjb3BpZXMgZGF0YSB3aGlsZSB0cmFuc2xhdGluZyBudW1lcmljIHZhbHVlcwogICBiZXR3ZWVuIGhvc3QgYnl0ZSBvcmRlcmluZyBhbmQgImxpdHRsZSBlbmRpYW4iIGJ5dGUgb3JkZXJpbmcuCgogICBwdkRlc3QgYW5kIHB2U3JjIGFyZSBOT1QgcmVxdWlyZWQgdG8gYmUgMTYgb3IgMzItYml0IHdvcmQgYWxpZ25lZC4KCiAgIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCB3aGVuIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlIGFycmF5cyBvdmVybGFwLAogICBleGNlcHQgaW4gdGhlIHNwZWNpYWwgY2FzZSB3aGVyZSBwdkRlc3QgYW5kIHB2U3JjIGFyZSBlcXVhbC4gIEluIHRoYXQgY2FzZSwKICAgc3RkX0NvcHlMRSgpIG1vZGlmaWVzIHRoZSBidWZmZXIgaW4tcGxhY2UuCgogICBXaGVuIHRoZSB0YXJnZXQgYnl0ZSBvcmRlcmluZyAobGl0dGxlIGVuZGlhbikgbWF0Y2hlcyB0aGUgaG9zdCBieXRlCiAgIG9yZGVyaW5nLCBpbi1wbGFjZSB0cmFuc2xhdGlvbnMgcmVkdWNlIHRvIGEgbm8tb3AsIGFuZCBjb3BpZXMgYXJlCiAgIGRlbGVnYXRlZCBkaXJlY3RseSB0byBzdGRfbWVtbW92ZSgpLgoKClByb3RvdHlwZToKICAgaW50IHN0ZF9Db3B5TEUodm9pZCAqcHZEZXN0LCBpbnQgbkRlc3RTaXplLAogICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpwdlNyYywgIGludCBuU3JjU2l6ZSwKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHN6RmllbGRzKTsKClBhcmFtZXRlcnM6CiAgIHB2RGVzdDogICAgUG9pbnRlciB0byBkZXN0aW5hdGlvbiBidWZmZXIuCiAgIG5EZXN0U2l6ZTogU2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgogICBwdlNyYzogICAgIFBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgc291cmNlIGRhdGEuCiAgIG5TcmNTaXplOiAgU2l6ZSBvZiBzb3VyY2UgZGF0YS4KICAgcHN6RmllbGRzOiBEZXNjcmlwdGlvbiBvZiB0aGUgZmllbGRzIHRoYXQgY29tcHJpc2UgdGhlIHNvdXJjZSBkYXRhLgoKICAgICAgICAgICAgICBFYWNoIGZpZWxkIHNpemUgaXMgZ2l2ZW4gYnkgYSBwb3NpdGl2ZSBkZWNpbWFsIGludGVnZXIgb3Igb25lIG9mCiAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOiAiUyIsICJMIiwgIlEiLCBvciAiKiIuICBUaGUgbGV0dGVycwogICAgICAgICAgICAgIGRlbm90ZSBmaWVsZHMgdGhhdCBzaG91bGQgYmUgY29udmVydGVkIHRvIHRoZSBkZXNpcmVkIGJ5dGUKICAgICAgICAgICAgICBvcmRlcmluZzoKCj09PXByZT4KICAgICAgICAgICAgICAgIFMgOiBhIDIgYnl0ZSAoMTYgYml0KSB2YWx1ZS4KICAgICAgICAgICAgICAgIEwgOiBhIDQgYnl0ZSAoMzIgYml0KSB2YWx1ZS4KICAgICAgICAgICAgICAgIFEgOiBhIDggYnl0ZSAoNjQgYml0KSB2YWx1ZS4KPT09L3ByZT4KCiAgICAgICAgICAgICAgQW4gaW50ZWdlciBnaXZlcyBhIG51bWJlciBvZiBieXRlcyBhbmQgIioiIHJlcHJlc2VudHMgdGhlCiAgICAgICAgICAgICAgcmVtYWluZGVyIG9mIHRoZSBwdlNyY1tdIGJ1ZmZlci4gIE5vIHJlb3JkZXJpbmcgaXMgcGVyZm9ybWVkIG9uCiAgICAgICAgICAgICAgZGF0YSBpbiB0aGVzZSBmaWVsZHMuCgogICAgICAgICAgICAgIENvbXBhcmlzb25zIGFyZSBjYXNlLXNlbnNpdGl2ZS4gIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCB3aGVuCiAgICAgICAgICAgICAgb3RoZXIgY2hhcmFjdGVycyBhcmUgc3VwcGxpZWQgaW4gcHN6RmllbGRzLgoKICAgICAgICAgICAgICBGb3IgZXhhbXBsZTogIkwxMlMqIiB3b3VsZCBiZSBhcHByb3ByaWF0ZSB0byBjb3B5IGEgc3RydWN0dXJlCiAgICAgICAgICAgICAgY29udGFpbmluZyBhIHVpbnQzMiBmb2xsb3dlZCBieSBhIDEyIGJ5dGUgY2hhcmFjdGVyIGFycmF5LAogICAgICAgICAgICAgIGZvbGxvd2VkIGJ5IGEgdWludDE2LCBmb2xsb3dlZCBieSBhbiBhcmJpdHJhcnkgYW1vdW50IG9mCiAgICAgICAgICAgICAgY2hhcmFjdGVyIGRhdGEuCgogICAgICAgICAgICAgIElmIG5TcmNTaXplIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3RydWN0dXJlIHNpemUgKHRvdGFsIG9mIGFsbCB0aGUKICAgICAgICAgICAgICBzaXplcyBpbiBwc3pGaWVsZHNbXSkgdGhlbiBwdlNyY1tdIGlzIHRyZWF0ZWQgYXMgYW4gYXJyYXkgb2YKICAgICAgICAgICAgICBzdHJ1Y3R1cmVzLCBlYWNoIG9mIHdoaWNoIGlzIGRlc2NyaWJlZCBieSBwc3pGaWVsZHMuCgpSZXR1cm4gVmFsdWU6CgogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNvcGllZCBvciB0cmFuc2xhdGVkIGluLXBsYWNlLiAgVGhpcyB3aWxsIGJlCiAgIHRoZSBzbWFsbGVyIG9mIG5EZXN0U2l6ZSBhbmQgblNyY1NpemUsIG9yIHplcm8gaWYgb25lIG9mIHRoZW0gYXJlIG5lZ2F0aXZlLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfQ29weUJFKCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9Db3B5QkUoKSBmdW5jdGlvbiBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHN0ZF9Db3B5TEUoKSBleGNlcHQgaXQKICAgY29waWVzIGJldHdlZW4gaG9zdCBieXRlIG9yZGVyaW5nIGFuZCBiaWctZW5kaWFuICgibmV0d29yayIpIGJ5dGUgb3JkZXIuCgogICBTZWUgc3RkX0NvcHlMRSgpIGZvciBtb3JlIGRldGFpbHMuCgoKUHJvdG90eXBlOgogICB2b2lkICpzdGRfQ29weUJFKHZvaWQgKnB2RGVzdCwgY29uc3Qgdm9pZCAqcHZTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYkRlc3QsIGludCBuSXRlbXMsIGNvbnN0IGNoYXIgKnBzekZpZWxkcyk7CgpQYXJhbWV0ZXJzOgogICBwdkRlc3Q6ICAgIFBvaW50ZXIgdG8gZGVzdGluYXRpb24gYnVmZmVyLgogICBuRGVzdFNpemU6IFNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KICAgcHZTcmM6ICAgICBQb2ludGVyIHRvIGJ1ZmZlciBjb250YWluaW5nIHNvdXJjZSBkYXRhLgogICBuU3JjU2l6ZTogIFNpemUgb2Ygc291cmNlIGRhdGEuCiAgIHBzekZpZWxkczogRGVzY3JpcHRpb24gb2YgdGhlIGZpZWxkcyB0aGF0IGNvbXByaXNlIHRoZSBzb3VyY2UgZGF0YSwKICAgICAgICAgICAgICBhcyBkZWZpbmVkIGluIHN0ZF9Db3B5TEUuCgpSZXR1cm4gVmFsdWU6CgogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IGNvcGllZCBvciB0cmFuc2xhdGVkIGluLXBsYWNlLiAgVGhpcyB3aWxsIGJlCiAgIHRoZSBzbWFsbGVyIG9mIG5EZXN0U2l6ZSBhbmQgblNyY1NpemUsIG9yIHplcm8gaWYgb25lIG9mIHRoZW0gYXJlIG5lZ2F0aXZlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zd2FwbCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9zd2FwbCgpIGNoYW5nZXMgZW5kaWFubmVzcyBvZiBhbiB1bnNpZ25lZCBsb25nLgoKUHJvdG90eXBlOgoKICAgdW5zaWduZWQgbG9uZyBzdGRfc3dhcGwodW5zaWduZWQgbG9uZyB1bCkKClBhcmFtZXRlcnM6CiAgIHVsOiBpbnB1dCB1bnNpZ25lZCBsb25nCgpSZXR1cm4gVmFsdWU6CiAgIHVsLCByZXZlcnNlZCBpbiBieXRlLW9yZGVyaW5nCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3N3YXBzKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX3N3YXBzKCkgY2hhbmdlcyBlbmRpYW5uZXNzIG9mIGFuIHVuc2lnbmVkIHNob3J0LgoKUHJvdG90eXBlOgoKICAgdW5zaWduZWQgc2hvcnQgc3RkX3N3YXBzKHVuc2lnbmVkIHNob3J0IHVzKQoKUGFyYW1ldGVyczoKICAgdXM6IGlucHV0IHVuc2lnbmVkIHNob3J0CgpSZXR1cm4gVmFsdWU6CiAgIHVzLCByZXZlcnNlZCBpbiBieXRlLW9yZGVyaW5nCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX2xldG9ocygpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9sZXRvaHMoKSBjaGFuZ2VzIGEgc2hvcnQgZnJvbSBsaXR0bGUtZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4KClByb3RvdHlwZToKCiAgIHVuc2lnbmVkIHNob3J0IHN0ZF9sZXRvaHModW5zaWduZWQgc2hvcnQgdXMpCgpQYXJhbWV0ZXJzOgogICB1czogc2hvcnQgdG8gY29udmVydAoKUmV0dXJuIFZhbHVlOgogICB1cyBjb252ZXJ0ZWQgZnJvbSBsaXR0bGUtZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4gIElmIHRoZQogICAgIGhvc3QgaXMgbGl0dGxlIGVuZGlhbiwganVzdCByZXR1cm5zIHVzCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX2h0b2xlcygpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9odG9sZXMoKSBjb252ZXJ0cyBhIHNob3J0IGZyb20gaG9zdCBieXRlLW9yZGVyIHRvIGxpdHRsZS1lbmRpYW4uCgpQcm90b3R5cGU6CgogICB1bnNpZ25lZCBzaG9ydCBzdGRfaHRvbGVzKHVuc2lnbmVkIHNob3J0IHVzKQoKUGFyYW1ldGVyczoKICAgdXM6IHNob3J0IHRvIGNvbnZlcnQKClJldHVybiBWYWx1ZToKICAgdXMgY29udmVydGVkIGZyb20gaG9zdCBieXRlIG9yZGVyIHRvIGxpdHRsZS1lbmRpYW4uICBJZiB0aGUKICAgaG9zdCBpcyBsaXR0bGUgZW5kaWFuLCBqdXN0IHJldHVybnMgdXMKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbGV0b2hsKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX2xldG9obCgpIGNoYW5nZXMgYSBsb25nIGZyb20gbGl0dGxlLWVuZGlhbiB0byBob3N0IGJ5dGUgb3JkZXIuCgpQcm90b3R5cGU6CgogICB1bnNpZ25lZCBsb25nIHN0ZF9sZXRvaGwodW5zaWduZWQgbG9uZyB1bCkKClBhcmFtZXRlcnM6CiAgIHVsOiBsb25nIHRvIGNvbnZlcnQKClJldHVybiBWYWx1ZToKICAgdWwgY29udmVydGVkIGZyb20gbGl0dGxlLWVuZGlhbiB0byBob3N0IGJ5dGUgb3JkZXIuICBJZiB0aGUKICAgaG9zdCBpcyBsaXR0bGUgZW5kaWFuLCBqdXN0IHJldHVybnMgdWwKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfaHRvbGVsKCkKCkRlc2NyaXB0aW9uOgogICBUaGUgc3RkX2h0b2xlbCgpIGNvbnZlcnRzIGEgbG9uZyBmcm9tIGhvc3QgYnl0ZS1vcmRlciB0byBsaXR0bGUtZW5kaWFuLgoKUHJvdG90eXBlOgoKICAgdW5zaWduZWQgbG9uZyBzdGRfaHRvbGVsKHVuc2lnbmVkIGxvbmcgdWwpCgpQYXJhbWV0ZXJzOgogICB1bDogbG9uZyB0byBjb252ZXJ0CgpSZXR1cm4gVmFsdWU6CiAgIHVsIGNvbnZlcnRlZCBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBsaXR0bGUtZW5kaWFuLiAgSWYgdGhlCiAgIGhvc3QgaXMgbGl0dGxlIGVuZGlhbiwganVzdCByZXR1cm5zIHVsLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfbnRvaHMoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfbnRvaHMoKSBjaGFuZ2VzIGEgc2hvcnQgZnJvbSBiaWctZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4KClByb3RvdHlwZToKCiAgIHVuc2lnbmVkIHNob3J0IHN0ZF9udG9ocyh1bnNpZ25lZCBzaG9ydCB1cykKClBhcmFtZXRlcnM6CiAgIHVzOiBzaG9ydCB0byBjb252ZXJ0CgpSZXR1cm4gVmFsdWU6CiAgIHVzIGNvbnZlcnRlZCBmcm9tIGJpZy1lbmRpYW4gdG8gaG9zdCBieXRlIG9yZGVyLiAgSWYgdGhlCiAgIGhvc3QgaXMgYmlnIGVuZGlhbiwganVzdCByZXR1cm5zIHVzLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9odG9ucygpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9odG9ucygpIGNvbnZlcnRzIGEgc2hvcnQgZnJvbSBob3N0IGJ5dGUtb3JkZXIgdG8gYmlnLWVuZGlhbi4KClByb3RvdHlwZToKCiAgIHVuc2lnbmVkIHNob3J0IHN0ZF9odG9ucyh1bnNpZ25lZCBzaG9ydCB1cykKClBhcmFtZXRlcnM6CiAgIHVzOiBzaG9ydCB0byBjb252ZXJ0CgpSZXR1cm4gVmFsdWU6CiAgIHVzIGNvbnZlcnRlZCBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBiaWctZW5kaWFuLiAgSWYgdGhlCiAgIGhvc3QgaXMgYmlnIGVuZGlhbiwganVzdCByZXR1cm5zIHVzLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9udG9obCgpCgpEZXNjcmlwdGlvbjoKICAgVGhlIHN0ZF9udG9obCgpIGNoYW5nZXMgYSBsb25nIGZyb20gYmlnLWVuZGlhbiB0byBob3N0IGJ5dGUgb3JkZXIuCgpQcm90b3R5cGU6CgogICB1bnNpZ25lZCBsb25nIHN0ZF9udG9obCh1bnNpZ25lZCBsb25nIHVsKQoKUGFyYW1ldGVyczoKICAgdWw6IGxvbmcgdG8gY29udmVydAoKUmV0dXJuIFZhbHVlOgogICB1bCBjb252ZXJ0ZWQgZnJvbSBiaWctZW5kaWFuIHRvIGhvc3QgYnl0ZSBvcmRlci4gIElmIHRoZQogICBob3N0IGlzIGJpZyBlbmRpYW4sIGp1c3QgcmV0dXJucyB1bC4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfaHRvbmwoKQoKRGVzY3JpcHRpb246CiAgIFRoZSBzdGRfaHRvbmwoKSBjb252ZXJ0cyBhIGxvbmcgZnJvbSBob3N0IGJ5dGUtb3JkZXIgdG8gYmlnLWVuZGlhbi4KClByb3RvdHlwZToKCiAgIHVuc2lnbmVkIGxvbmcgc3RkX2h0b25sKHVuc2lnbmVkIGxvbmcgdWwpCgpQYXJhbWV0ZXJzOgogICB1bDogbG9uZyB0byBjb252ZXJ0CgpSZXR1cm4gVmFsdWU6CiAgIHVsIGNvbnZlcnRlZCBmcm9tIGhvc3QgYnl0ZSBvcmRlciB0byBiaWctZW5kaWFuLiAgSWYgdGhlCiAgIGhvc3QgaXMgYmlnIGVuZGlhbiwganVzdCByZXR1cm5zIHVsLgoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc3RybHByaW50ZigpCgpEZXNjcmlwdGlvbjoKCiAgIFRoZSBmdW5jdGlvbnMgc3RkX3N0cmxwcmludGYoKSBhbmQgc3RkX3ZzdHJscHJpbnRmKCkgd3JpdGUgZm9ybWF0dGVkCiAgIG91dHB1dCB0byBhIHN0cmluZy4gIFRoZXNlIGZ1bmN0aW9ucyBndWFyYW50ZWUgTlVMLXRlcm1pbmF0aW9uIG9mCiAgIHRoZSBvdXRwdXQgYnVmZmVyIHdoZW4gaXRzIHNpemUgaXMgZ3JlYXRlciB0aGFuIHplcm8uCgogICBBIGZvcm1hdCBzdHJpbmcgaXMgY29waWVkIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBleGNlcHQgZm9yIGNvbnZlcnNpb24KICAgc3BlY2lmaWVycyBjb250YWluZWQgd2l0aGluIHRoZSBmb3JtYXQgc3RyaW5nLiAgQ29udmVyc2lvbiBzcGVjaWZpZXJzCiAgIGJlZ2luIHdpdGggYSAiJSIgYW5kIHNwZWNpZnkgc29tZSBhY3Rpb24gdGhhdCBjb25zdW1lcyBhbiBhcmd1bWVudCBmcm9tCiAgIHRoZSBhcmd1bWVudCBsaXN0LgoKICAgQ29udmVyc2lvbiBzcGVjaWZpZXJzIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtOgo9PT1wcmU+CiAgICAgICAlW0ZMQUdTXSBbV0lEVEhdIFsuUFJFQ0lTSU9OXSBbVFlQRV0gQ09OVgo9PT0vcHJlPgoKICAgQ09OViBpcyB0aGUgb25seSByZXF1aXJlZCBmaWVsZC4gIEl0IGlzIGFsd2F5cyBhIHNpbmdsZSBjaGFyYWN0ZXIsCiAgIGFuZCBkZXRlcm1pbmVzIHRoZSBhY3Rpb24gdG8gYmUgdGFrZW4uICBTdXBwb3J0ZWQgdmFsdWVzIGFyZToKCj09PXByZT4KICAgIENPTlYgfCBEZXNjcmlwdGlvbgogICA9PT09PT18PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgIGMgICB8IE91dHB1dCBhIHNpbmdsZSBjaGFyYWN0ZXIuCiAgICAgICAgIHwKICAgICBzICAgfCBPdXRwdXQgYSBOVUwtdGVybWluYXRlZCBzaW5nbGUtYnl0ZSBjaGFyYWN0ZXIgc3RyaW5nLgogICAgICAgICB8CiAgICBkLCBpIHwgT3VwdHV0IGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KICAgICAgICAgfAogICAgIHUgICB8IE91dHB1dCBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIuCiAgICAgICAgIHwKICAgICBvICAgfCBPdXRwdXQgYW4gdW5zaWduZWQgb2N0YWwgaW50ZWdlci4KICAgICAgICAgfAogICAgIHggICB8IE91dHB1dCBhbiB1bnNpZ25lZCBoZXhhZGVjaW1hbCBpbnRlZ2VyLCB1c2luZwogICAgICAgICB8IGxvd2VyIGNhc2UgZGlnaXRzLgogICAgICAgICB8CiAgICAgWCAgIHwgT3V0cHV0IGFuIHVuc2lnbmVkIGhleGFkZWNpbWFsIGludGVnZXIsIHVzaW5nCiAgICAgICAgIHwgdXBwZXIgY2FzZSBkaWdpdHMuCiAgICAgICAgIHwKICAgICBwICAgfCBPdXRwdXQgYSBwb2ludGVyIHZhbHVlIGFzIGVpZ2h0IGhleGFkZWNpbWFsIGRpZ2l0cywKICAgICAgICAgfCB1c2luZyB1cHBlciBjYXNlIGRpZ2l0cy4KPT09L3ByZT4KCiAgIFRoZSBuZXh0IGFyZ3VtZW50IGZyb20gdGhlIGFyZ3VtZW50IGxpc3Qgc3VwcGxpZXMgdGhlIHZhbHVlIHRvIGJlCiAgIGZvcm1hdHRlZCBhbmQgb3V0cHV0LgoKICAgRkxBR1MsIFdJRFRILCBhbmQgUFJFQ0lTSU9OIGNhbiBtb2RpZnkgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHZhbHVlLgoKICAgRkxBR1MgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzOgoKPT09cHJlPgogICBGbGFnIHwgTWVhbmluZwogICA9PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICsgIHwgUHJlZml4IHBvc2l0aXZlIG51bWJlcnMgd2l0aCAiKyIgKCVkIGFuZCAlaSBvbmx5KS4KICAgLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAtICB8IFdoZW4gcGFkZGluZyB0byBtZWV0IFdJRFRILCBwYWQgb24gdGhlIHJpZ2h0LgogICAtLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDAgIHwgUGFkIHdpdGggJzAnIGNoYXJhY3RlcnMgd2hlbiBwYWRkaW5nIG9uIHRoZSBsZWZ0IHRvIG1lZXQgV0lEVEguCiAgIC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGJsYW5rfCBQcmVmaXggcG9zaXRpdmUgbnVtYmVycyB3aXRoICIgIiAoJWQgYW5kICVpIG9ubHkpLgogICBzcGFjZXwKICAgLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAjICB8IFdpdGggJXggb3IgJVg6IHByZWZpeGVzIG5vbi16ZXJvIHZhbHVlcyB3aXRoICIweCIvIjBYIi4KICAgICAgICB8IFdpdGggJW8sIGVuc3VyZSB0aGUgdmFsdWUgYmVnaW5zIHdpdGggIjAiIChpbmNyZWFzaW5nIFBSRUNJU0lPTgogICAgICAgIHwgICAgaWYgbmVjZXNzYXJ5KS4KICAgICAgICB8IElnbm9yZWQgZm9yIGFsbCBvdGhlciBDT05WIHNwZWNpZmllcnMuCiAgIC0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj09PS9wcmU+CgogICBXSURUSCBpcyBhbiB1bnNpZ25lZCBkZWNpbWFsIGludGVnZXIgb3IgdGhlIGNoYXJhY3RlciAiKiIuCgogICBXSURUSCBnaXZlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSB3cml0dGVuLiAgVGhlCiAgIGZvcm1hdHRlZCB2YWx1ZSB3aWxsIGJlIHBhZGRlZCB3aXRoIHNwYWNlcyB1bnRpbCB0aGUgbWluaW11bSBzaXplIGlzCiAgIG1ldDsgaXQgbmV2ZXIgY2F1c2VzIGEgdmFsdWUgdG8gYmUgdHJ1bmNhdGVkIFRoZSBzaWduIG9mIHRoZSBXSURUSAogICBpbnRlZ2VyIHNlbGVjdHMgYmV0d2VlbiBsZWZ0IGFuZCByaWdodCBwYWRkaW5nLiAgUGFkZGluZyB3aWxsIGJlIG9uCiAgIHRoZSBsZWZ0IHVubGVzcyB0aGUgIi0iIGZsYWcgaXMgc3BlY2lmaWVkLgoKICAgV2hlbiAiKiIgaXMgdXNlZCwgYW4gJ2ludCcgYXJndW1lbnQgaXMgY29uc3VtZWQgZnJvbSB0aGUgYXJndW1lbnQKICAgbGlzdCBhbmQgdXNlZCBhcyB0aGUgV0lEVEguICBBIG5lZ2F0aXZlIGFyZ3VtZW50IHNwZWNpZmllcyBwYWRkaW5nIG9uCiAgIHRoZSByaWdodCwgYW5kIGl0cyBhYnNvbHV0ZSB2YWx1ZSBnaXZlcyB0aGUgYW1vdW50IG9mIHBhZGRpbmcuCgogICBJZiB0aGUgIjAiIGZsYWdzIGlzIHNwZWNpZmllZCwgYW55IHBhZGRpbmcgb24gdGhlIGxlZnQgd2lsbCBjb25zaXN0CiAgIG9mICIwIiBjaGFyYWN0ZXJzLiAgQW4gZXhjZXB0aW9uIHRvIHRoaXMgcnVsZSBpcyB0aGF0IHRoZSAiMCIgZmxhZyBpcwogICBpZ25vcmVkIHdoZW4gcHJlY2lzaW9uIGlzIHNwZWNpZmllZCBmb3IgYSBudW1lcmljIHZhbHVlLgoKICAgUFJFQ0lTSU9OIGlzIGEgbm9uLW5lZ2F0aXZlIGRlY2ltYWwgaW50ZWdlciBvciAiKiIgcHJlY2VkZWQgYnkgIi4iLgoKICAgV2hlbiBQUkVDSVNJT04gYWNjb21wYW5pZXMgYW55IG9mIHRoZSBudW1lcmljIGNvbnZlcnNpb25zLCBpdAogICBzcGVjaWZpZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGRpZ2l0cyB0byBvdXRwdXQuICBWYWx1ZXMgYXJlIHBhZGRlZAogICBvbiB0aGUgbGVmdCB3aXRoICcwJyB0byBtZWV0IHRoZSBzcGVjaWZpZWQgc2l6ZS4gIFBSRUNJU0lPTiBkZWZhdWx0cwogICB0byAxIGZvciBudW1iZXJzLgoKICAgV2hlbiBQUkVDSVNJT04gYWNjb21wYW5pZXMgb3RoZXIgY29udmVyc2lvbnMsIGl0IHNwZWNpZmllcyB0aGUKICAgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSB2YWx1ZSB0byBvdXRwdXQuICBUaGUgdmFsdWUKICAgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gZW5zdXJlIHRoYXQgYXQgbW9zdCBQUkVDSVNJT04gY2hhcmFjdGVycyBhcmUKICAgb3V0cHV0LgoKICAgVFlQRSBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZSBvZiBhcmd1bWVudHMuICBUaGlzIGlzIHVzZWQKICAgdG8gZGV0ZXJtaW5lIHRoZSBzaXplIG9mIGludGVnZXIgYXJndW1lbnRzLiBWYWx1ZXMgbGFyZ2VyIHRoYW4gJ2ludCcKICAgY2FuIGJlIHByb3Blcmx5IG9idGFpbmVkIGZyb20gdGhlIGFyZ3VtZW50IGxpc3QuICBUaGVpciBiZWhhdmlvcgogICBzaG91bGQgYmUgY29uc2lkZXJlZCB1bmRlZmluZWQgZm9yIENPTlYgb3BlcmF0aW9ucyBvdGhlciB0aGFuIGludGVnZXIKICAgZm9ybWF0dGluZy4KCj09PXByZT4KICAgIFRZUEUgIHwgTWVhbmluZwogICA9PT09PT09fD09PT09PT09PT09PT09PT09PT09PQogICAgIGhoICAgfCBzaXplb2YoY2hhcikKICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgaCAgIHwgc2l6ZW9mKHNob3J0KQogICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICBsICAgfCBzaXplb2YobG9uZykKICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEwsIGxsIHwgc2l6ZW9mKGxvbmcgbG9uZykKICAgLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgaiAgIHwgc2l6ZW9mKGludDY0KQogICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB6ICAgfCBzaXplb2Yoc2l6ZV90KQogICAtLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLQo9PT0vcHJlPgoKICAgRm9yIDY0LWJpdCBpbnRlZ2VycywgImxsIiBtYXkgYmUgdGhlIG1vc3Qgd2lkZWx5LXN1cHBvcnRlZCB0eXBlCiAgIHNwZWNpZmllciBpbiBvdGhlciBwcmludGYgaW1wbGVtZW50YXRpb24sIGJ1dCAiaiIgaGFzIGJlZW4gaW50cm9kdWNlZAogICBpbiBJU08gQzk5LiBUaGlzIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGJvdGguCgogICBOb3RlIHRoYXQgYXJndW1lbnRzIHRvIHZhcmlhZGljIGZ1bmN0aW9ucyBhcmUgcHJvbW90ZWQgdG8gJ2ludCcgd2hlbgogICBzbWFsbGVyIHRoYW4gJ2ludCcsIHNvICdoJyBhbmQgJ2hoJyBoYXZlIG5vIG9ic2VydmFibGUgZWZmZWN0LgogICBTdGF0aWMgYW5hbHlzaXMgdG9vbHMgdGhhdCB1bmRlcnN0YW5kIHN0YW5kYXJkIGZvcm1hdCBzdHJpbmcgc3ludGF4CiAgIG1heSB1c2UgdGhpcyBpbmZvcm1hdGlvbiBmb3Igb3RoZXIgcHVycG9zZXMuCgpQcm90b3R5cGU6CgogICBpbnQgc3RkX3N0cmxwcmludGYoY2hhciAqcHN6RGVzdCwgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzekZtdCwgLi4uKTsKUGFyYW1ldGVyczoKICAgcHN6RGVzdCBbb3V0XTogb3V0cHV0IGJ1ZmZlciwgd2hlcmUgb3V0cHV0IHdpbGwgYmUgcGxhY2VkCiAgIG5EZXN0U2l6ZTogICAgIHNpemUgb2YgcHN6RGVzdCBpbiBieXRlcwogICBwc3pGbXQ6ICAgICAgICBmb3JtYXQgc3RyaW5nCgpSZXR1cm4gVmFsdWU6CgogICBUaGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBlbnRpcmUgdW50cnVuY2F0ZWQgb3V0cHV0LCBOT1QKICAgaW5jbHVkaW5nIE5VTC10ZXJtaW5hdGlvbi4KCkNvbW1lbnRzOgoKICAgTm90YWJsZSBvbWlzc2lvbnMgZnJvbSBzdGRfc3RybHByaW50ZigpIGFyZSBsYWNrIG9mIHN1cHBvcnQgZm9yCiAgIGZsb2F0aW5nIHBvaW50IGFuZCBsYWNrIG9mIHN1cHBvcnQgZm9yICIlbiIuCgpTaWRlIEVmZmVjdHM6CiAgIE5vbmUKClNlZSBBbHNvOgogICBOb25lCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3ZzdHJscHJpbnRmKCkKCkRlc2NyaXB0aW9uOgoKICBUaGUgc3RkX3ZzdHJscHJpbnRmKCkgaXMgZG9jdW1lbnRlZCB3aXRoIHN0ZF9zdHJscHJpbnRmKCksIGl0J3MgdGhlCiAgdmVjdG9yIGZvcm0gb2Ygc3RkX3N0cmxwcmludGYoKS4gIFNlZSBzdGRfc3RybHByaW50ZigpIGZvciBhCiAgbW9yZSBjb21wbGV0ZSBkZXNjcmlwdGlvbi4KClByb3RvdHlwZToKICAgaW50IHN0ZF92c3RybHByaW50ZihjaGFyICpwc3pEZXN0LCBpbnQgbkRlc3RTaXplLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzekZtdCwgQUVFVmFMaXN0IGFyZ3MpOwoKUGFyYW1ldGVyczoKICAgcHN6RGVzdCBbb3V0XTogb3V0cHV0IGJ1ZmZlciwgd2hlcmUgb3V0cHV0IHdpbGwgYmUgcGxhY2VkCiAgIG5EZXN0U2l6ZTogICAgIHNpemUgb2YgcHN6RGVzdCBpbiBieXRlcwogICBwc3pGbXQ6ICAgICAgICBmb3JtYXQgc3RyaW5nCiAgIGFyZ3M6ICAgICAgICAgIGFyZ3VtZW50cwoKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfc25wcmludGYoKQoKRGVzY3JpcHRpb246CgogICBUaGUgZnVuY3Rpb25zIHN0ZF9zbnByaW50ZigpIGFuZCBzdGRfdnNucHJpbnRmKCkgYXJlIHNpbWlsYXIgdG8KICAgc3RkX3N0cmxwcmludGYgYW5kIHN0ZF92c3RybHByaW50ZiB0aGF0IHdyaXRlIGZvcm1hdHRlZCBvdXRwdXQgdG8gYQogICBzdHJpbmcuIFVubGlrZSBzdGRfc3RybHByaW50Ziwgc3RkX3NucHJpbnRmIGFsc28gc3VwcG9ydCB0aGUgZmxvYXRpbmcKICAgcG9pbnQgY29udmVyc2lvbiBzcGVjaWZpZXJzLiBUaGVzZSBmdW5jdGlvbnMgZ3VhcmFudGVlIE5VTC10ZXJtaW5hdGlvbgogICBvZiB0aGUgb3V0cHV0IGJ1ZmZlciB3aGVuIGl0cyBzaXplIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgoKICAgQSBmb3JtYXQgc3RyaW5nIGlzIGNvcGllZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgZXhjZXB0IGZvciBjb252ZXJzaW9uCiAgIHNwZWNpZmllcnMgY29udGFpbmVkIHdpdGhpbiB0aGUgZm9ybWF0IHN0cmluZy4gIENvbnZlcnNpb24gc3BlY2lmaWVycwogICBiZWdpbiB3aXRoIGEgIiUiIGFuZCBzcGVjaWZ5IHNvbWUgYWN0aW9uIHRoYXQgY29uc3VtZXMgYW4gYXJndW1lbnQgZnJvbQogICB0aGUgYXJndW1lbnQgbGlzdC4KCiAgIENvbnZlcnNpb24gc3BlY2lmaWVycyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybToKPT09cHJlPgogICAgICAgJVtGTEFHU10gW1dJRFRIXSBbLlBSRUNJU0lPTl0gW1RZUEVdIENPTlYKPT09L3ByZT4KCiAgIENPTlYgaXMgdGhlIG9ubHkgcmVxdWlyZWQgZmllbGQuICBJdCBpcyBhbHdheXMgYSBzaW5nbGUgY2hhcmFjdGVyLAogICBhbmQgZGV0ZXJtaW5lcyB0aGUgYWN0aW9uIHRvIGJlIHRha2VuLiAgRm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YKICAgY29udmVyc2lvbiBzZXBjaWZpZXJzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YKICAgc3RkX3N0cmxwcmludGYoKS4gSGVyZS4gd2Ugb25seSBwcm92aWRlIGRlc2NyaXB0aW9uIG9mIHRoZXNlIGZpZWxkcwogICBhcyBpdCBhcHBsaWVzIHRvIHRoZSBhZGRpdGlvbmFsIENPTlYgdmFsdWVzIHN1cHBvcnRlZCBieQogICBzdGRfc25wcmludGYoKS4KCiAgIEluIGFkZGl0aW9uIHRvIHRoZSB2YWx1ZXMgZm9yIENPTlYgc3VwcG9ydGVkIGJ5IHN0ZF9zdHJscHJpbnRmLCB0aGlzCiAgIGZ1bmN0aW9uIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgoKPT09cHJlPgogICAgQ09OViB8IERlc2NyaXB0aW9uCiAgID09PT09PXw9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBlLCBFIHwgT3V0cHV0cyBhIGRvdWJsZSB2YWx1ZSByZXByZXNlbnRpbmcgYSBmbG9hdGluZyBwb2ludAogICAgICAgICB8IG51bWJlciBpbiB0aGUgc3R5bGUgWy1dZC5kZGQgZbFkZCwgd2hlcmUgdGhlcmUgaXMgb25lCiAgICAgICAgIHwgZGlnaXQgKHdoaWNoIGlzIG5vbnplcm8gaWYgdGhlIGFyZ3VtZW50IGlzIG5vbnplcm8pCiAgICAgICAgIHwgYmVmb3JlIHRoZSBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhbmQgdGhlIG51bWJlciBvZgogICAgICAgICB8IGRpZ2l0cyBhZnRlciBpdCBpcyBlcXVhbCB0byB0aGUgcHJlY2lzaW9uLiBJZiB0aGUKICAgICAgICAgfCBwcmVjaXNpb24gaXMgbWlzc2luZywgaXQgaXMgdGFrZW4gYXMgNi4gSWYgdGhlIHByZWNpc2lvbgogICAgICAgICB8IGlzIHplcm8gYW5kIHRoZSAjIGZsYWcgaXMgbm90IHNwZWNpZmllZCwgbm8gZGVjaW1hbC1wb2ludAogICAgICAgICB8IGNoYXJhY3RlciBhcHBlYXJzLiBUaGUgdmFsdWUgaXMgcm91bmRlZCB0byB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgfCBudW1iZXIgb2YgZGlnaXRzLiBUaGUgRSBjb252ZXJzaW9uIHNwZWNpZmllciBwcm9kdWNlcyBhCiAgICAgICAgIHwgbnVtYmVyIHdpdGggRSBpbnN0ZWFkIG9mIGUgaW50cm9kdWNpbmcgdGhlIGV4cG9uZW50LiBUaGUKICAgICAgICAgfCBleHBvbmVudCBhbHdheXMgY29udGFpbnMgYXQgbGVhc3QgdHdvIGRpZ2l0cywgYW5kIG9ubHkgYXMKICAgICAgICAgfCBtYW55IG1vcmUgZGlnaXRzIGFzIG5lY2Vzc2FyeSB0byByZXByZXNlbnQgdGhlIGV4cG9uZW50LgogICAgICAgICB8IElmIHRoZSB2YWx1ZSBpcyB6ZXJvLCB0aGUgZXhwb25lbnQgaXMgemVyby4KICAgICAgICAgfAogICAgZiwgRiB8IE91dHB1dHMgYSBkb3VibGUgdmFsdWUgcmVwcmVzZW50aW5nIGEgZmxvYXRpbmcgcG9pbnQKICAgICAgICAgfCBudW1iZXIgaW4gdGhlIHN0eWxlIFstXWRkZC5kZGQsIHdoZXJlIHRoZSBudW1iZXIgb2YKICAgICAgICAgfCBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGlzIGVxdWFsIHRvIHRoZQogICAgICAgICB8IHByZWNpc2lvbiBzcGVjaWZpY2F0aW9uLiBJZiB0aGUgcHJlY2lzaW9uIGlzIG1pc3NpbmcsIGl0CiAgICAgICAgIHwgaXMgdGFrZW4gYXMgNi4gSWYgdGhlIHByZWNpc2lvbiBpcyB6ZXJvIGFuZCB0aGUgIyBmbGFnIGlzCiAgICAgICAgIHwgbm90IHNwZWNpZmllZCwgbm8gZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIgYXBwZWFycy4gSWYgYQogICAgICAgICB8IGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMsIGF0IGxlYXN0IG9uZSBkaWdpdAogICAgICAgICB8IGFwcGVhcnMgYmVmb3JlIGl0LiBUaGUgdmFsdWUgaXMgcm91bmRlZCB0byB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgfCBudW1iZXIgb2YgZGlnaXRzLgogICAgICAgICB8CiAgICBnLCBHIHwgT3V0cHV0cyBhIGRvdWJsZSB2YWx1ZSByZXByZXNlbnRpbmcgYSBmbG9hdGluZyBwb2ludAogICAgICAgICB8IG51bWJlciBpbiB0aGUgc3R5bGUgZiBvciBlIChvciBpbiBzdHlsZSBGIG9yIEUgaW4gdGhlIGNhc2UKICAgICAgICAgfCBvZiBhIEcgY29udmVyc2lvbiBzcGVjaWZpZXIpLCB3aXRoIHRoZSBwcmVjaXNpb24gc3BlY2lmeWluZwogICAgICAgICB8IHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzLiBJZiB0aGUgcHJlY2lzaW9uIGlzIHplcm8sCiAgICAgICAgIHwgaXQgaXMgdGFrZW4gYXMgMS4gVGhlIHN0eWxlIHVzZWQgZGVwZW5kcyBvbiB0aGUgdmFsdWUKICAgICAgICAgfCBjb252ZXJ0ZWQuIFN0eWxlIGUgKG9yIEUpIGlzIHVzZWQgb25seSBpZiB0aGUgZXhwb25lbnQKICAgICAgICAgfCByZXN1bHRpbmcgZnJvbSBzdWNoIGEgY29udmVyc2lvbiBpcyBsZXNzIHRoYW4gLTQgb3IgZ3JlYXRlcgogICAgICAgICB8IHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByZWNpc2lvbi4gVHJhaWxpbmcgemVyb3MgYXJlIHJlbW92ZWQKICAgICAgICAgfCBmcm9tIHRoZSBmcmFjdGlvbmFsIHBvcnRpb24gb2YgdGhlIHJlc3VsdCB1bmxlc3MgdGhlICMgZmxhZwogICAgICAgICB8IGlzIHNwZWNpZmllZDsgYSBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciBhcHBlYXJzIG9ubHkgaWYgaXQKICAgICAgICAgfCBpcyBmb2xsb3dlZCBieSBhIGRpZ2l0LgogICAgICAgICB8CiAgICBhLCBBIHwgT3V0cHV0cyBhIGRvdWJsZSB2YWx1ZSByZXByZXNlbnRpbmcgYSBmbG9hdGluZyBwb2ludAogICAgICAgICB8IG51bWJlciBpbiB0aGUgc3R5bGUgWy1dMHhoLmhoaGggcLFkLCB3aGVyZSB0aGVyZSBpcyBvbmUKICAgICAgICAgfCBub24temVybyBoZXhhZGVjaW1hbCBkaWdpdCBiZWZvcmUgdGhlIGRlY2ltYWwtcG9pbnQKICAgICAgICAgfCBjaGFyYWN0ZXIgYW5kIHRoZSBudW1iZXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIGFmdGVyIGl0IGlzCiAgICAgICAgIHwgZXF1YWwgdG8gdGhlIHByZWNpc2lvbi4gSWYgdGhlIHByZWNpc2lvbiBpcyBtaXNzaW5nIHRoZW4KICAgICAgICAgfCB0aGUgcHJlY2lzaW9uIGlzIGFzc3VtZWQgdG8gYmUgc3VmZmljaWVudCBmb3IgYW4gZXhhY3QKICAgICAgICAgfCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUsIGV4Y2VwdCB0aGF0IHRyYWlsaW5nIHplcm9zCiAgICAgICAgIHwgbWF5IGJlIG9taXR0ZWQuIElmIHRoZSBwcmVjaXNpb24gaXMgemVybyBhbmQgdGhlICMgZmxhZyBpcwogICAgICAgICB8IG5vdCBzcGVjaWZpZWQsIG5vIGRlY2ltYWwgcG9pbnQgY2hhcmFjdGVyIGFwcGVhcnMuIFRoZQogICAgICAgICB8IGxldHRlcnMgJ2FiY2RlZicgYXJlIHVzZWQgZm9yICclYScgY29udmVyc2lvbiBhbmQgdGhlCiAgICAgICAgIHwgbGV0dGVycyBBQkNERUYgZm9yICclQScgY29udmVyc2lvbi4gVGhlICclQScgY29udmVyc2lvbgogICAgICAgICB8IHNwZWNpZmllciBwcm9kdWNlcyBhIG51bWJlciB3aXRoICdYJyBhbmQgJ1AnIGluc3RlYWQgb2YgJ3gnCiAgICAgICAgIHwgYW5kICdwJy4gVGhlIGV4cG9uZW50IGFsd2F5cyBjb250YWlucyBhdCBsZWFzdCBvbmUgZGlnaXQsCiAgICAgICAgIHwgYW5kIG9ubHkgYXMgbWFueSBtb3JlIGRpZ2l0cyBhcyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHRoZQogICAgICAgICB8IGRlY2ltYWwgZXhwb25lbnQgb2YgMi4gSWYgdGhlIHZhbHVlIGlzIHplcm8sIHRoZSBleHBvbmVudAogICAgICAgICB8IGlzIHplcm8uCiAgICAgICAgIHwKPT09L3ByZT4KCiAgIEZvciAnZScsICdmJywgJ2cnIGFuZCAnYScgY29udmVydnNpb24gc3BlY2lmaWVycywgYSBkb3VibGUgYXJndW1lbnQKICAgcmVwcmVzZW50aW5nIGFuIGluZmluaXR5IGlzIGNvbnZlcnRlZCBpbiB0byB0aGUgc3R5bGUgJ1stXWluZicgYW5kCiAgIGEgZG91YmxlIGFyZ3VtZW50IHJlcHJlc2VudGluZyBhIE5hTiBpcyBjb252ZXJ0ZWQgaW4gdG8gdGhlIHN0bHllCiAgICduYW4nLiBUaGUgJ0UnLCAnRicsICdHJyBhbmQgJ0EnIGNvbnZlcnNpb24gc3BlY2lmaWVycyByZXN1bHQgaW4KICAgJ0lORicgb3IgJ05BTicgaW5zdGVhZCBvZiAnaW5mJyBvciAnbmFuJywgcmVzcGVjdGl2ZWx5LgoKUHJvdG90eXBlOgoKICAgaW50IHN0ZF9zbnByaW50ZihjaGFyICpwc3pEZXN0LCBpbnQgbkRlc3RTaXplLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBzekZtdCwgLi4uKTsKUGFyYW1ldGVyczoKICAgcHN6RGVzdCBbb3V0XTogb3V0cHV0IGJ1ZmZlciwgd2hlcmUgb3V0cHV0IHdpbGwgYmUgcGxhY2VkCiAgIG5EZXN0U2l6ZTogICAgIHNpemUgb2YgcHN6RGVzdCBpbiBieXRlcwogICBwc3pGbXQ6ICAgICAgICBmb3JtYXQgc3RyaW5nCgpSZXR1cm4gVmFsdWU6CgogICBUaGUgc2l6ZSByZXF1aXJlZCB0byBob2xkIHRoZSBlbnRpcmUgdW50cnVuY2F0ZWQgb3V0cHV0LCBOT1QKICAgaW5jbHVkaW5nIE5VTC10ZXJtaW5hdGlvbi4KCkNvbW1lbnRzOgoKICAgTm90YWJsZSBvbWlzc2lvbnMgZnJvbSBzdGRfc3RybHByaW50ZigpIGxhY2sgb2Ygc3VwcG9ydCBmb3IgIiVuIi4KClNpZGUgRWZmZWN0czoKICAgTm9uZQoKU2VlIEFsc286CiAgIHN0ZF9zdHJscHJpbnRmKCkKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfdnNucHJpbnRmKCkKCkRlc2NyaXB0aW9uOgoKICBUaGUgc3RkX3ZzbnByaW50ZigpIGlzIGRvY3VtZW50ZWQgd2l0aCBzdGRfc25wcmludGYoKSwgaXQncyB0aGUKICB2ZWN0b3IgZm9ybSBvZiBzdGRfc25wcmludGYoKS4gU2VlIHN0ZF9zbnByaW50ZigpIGZvciBhIG1vcmUgY29tcGxldGUKICBkZXNjcmlwdGlvbi4KClByb3RvdHlwZToKICAgaW50IHN0ZF92c25wcmludGYoY2hhciAqcHN6RGVzdCwgaW50IG5EZXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHN6Rm10LCBBRUVWYUxpc3QgYXJncyk7CgpQYXJhbWV0ZXJzOgogICBwc3pEZXN0IFtvdXRdOiBvdXRwdXQgYnVmZmVyLCB3aGVyZSBvdXRwdXQgd2lsbCBiZSBwbGFjZWQKICAgbkRlc3RTaXplOiAgICAgc2l6ZSBvZiBwc3pEZXN0IGluIGJ5dGVzCiAgIHBzekZtdDogICAgICAgIGZvcm1hdCBzdHJpbmcKICAgYXJnczogICAgICAgICAgYXJndW1lbnRzCgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zY2FudWwoKQoKRGVzY3JpcHRpb246CgogICAgVGhlIHN0ZF9zY2FudWwoKSBjb252ZXJ0cyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBhIG51bWJlciB0byBhbiB1bnNpZ25lZAogICAgbG9uZy4gIEl0IGV4cGVjdHMgc3RyaW5ncyB0aGF0IG1hdGNoIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKPT09cHJlPgogICAgICAgICBzcGFjZXMgWyt8LV0gZGlnaXRzCj09PS9wcmU+CgogICAgJ1NwYWNlcycgaXMgemVybyBvciBtb3JlIEFTQ0lJIHNwYWNlIG9yIHRhYiBjaGFyYWN0ZXJzLgoKICAgICdEaWdpdHMnIGlzIGFueSBudW1iZXIgb2YgZGlnaXRzIHZhbGlkIGluIHRoZSByYWRpeC4gIExldHRlcnMgJ0EnIHRocm91Z2gKICAgICdaJyBhcmUgdHJlYXRlZCBhcyBkaWdpdHMgd2l0aCB2YWx1ZXMgMTAgdGhyb3VnaCAzNS4gICdEaWdpdHMnIG1heSBiZWdpbgogICAgd2l0aCAiMHgiIHdoZW4gYSByYWRpeCBvZiAwIG9yIDE2IGlzIHNwZWNpZmllZC4KCiAgICBVcHBlciBhbmQgbG93ZXIgY2FzZSBsZXR0ZXJzIGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseS4KCgpQcm90b3R5cGU6CgogICAgdWludDMyIHN0ZF9zY2FudWwoIGNvbnN0IGNoYXIgKnBjaEJ1ZiwgaW50IG5SYWRpeCwgY29uc3QgY2hhciAqKnBwY2hFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwbkVycm9yKQoKUGFyYW1ldGVyczoKCiAgICBwY2hCdWYgW2luXSA6IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nIHRvIHNjYW4uCgogICAgblJhZGl4IFtpbl0gOiB0aGUgbnVtZXJpYyByYWRpeCAob3IgYmFzZSkgb2YgdGhlIG51bWJlci4gIFZhbGlkIHZhbHVlcyBhcmUKICAgICAgICAgICAgICAgICAgMiB0aHJvdWdoIDM2IG9yIHplcm8sIHdoaWNoIGltcGxpZXMgYXV0by1kZXRlY3Rpb24uCiAgICAgICAgICAgICAgICAgIEF1dG8tZGV0ZWN0aW9uIGV4YW1pbmVzIHRoZSBkaWdpdHMgZmllbGQuICBJZiBpdCBiZWdpbnMgd2l0aAogICAgICAgICAgICAgICAgICAiMHgiLCByYWRpeCAxNiBpcyBzZWxlY3RlZC4gIE90aGVyd2lzZSwgaWYgaXQgYmVnaW5zIHdpdGgKICAgICAgICAgICAgICAgICAgIjAiIHJhZGl4IDggaXMgc2VsZWN0ZWQuICBPdGhlcndpc2UsIHJhZGl4IDEwIGlzIHNlbGVjdGVkLgoKICAgIHBwY2hFbmQgW291dF0gOiBpZiBwcGNoRW5kIGlzIG5vdCBOVUxMLCAqcHBjaEVuZCBwb2ludHMgdG8gdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIHRoYXQgZGlkIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgcGF0dGVybiBzaG93bgogICAgICAgICAgICAgICAgICAgIGFib3ZlLCBleGNlcHQgb24gU1REX0JBRFBBUkFNIGFuZCBTVERfT1ZFUkZMT1cgd2hlbiBpdCBpcwogICAgICAgICAgICAgICAgICAgIHNldCB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4KCiAgICBwbkVycm9yIFtvdXRdIDogSWYgcG5FcnJvciBpcyBub3QgTlVMTCwgKnBuRXJyb3IgaG9sZHMgdGhlIGVycm9yIGNvZGUsCiAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6Cn4KICAgICAgICAwIDogTnVtZXJpYyB2YWx1ZSBpcyBmcm9tIDAgdG8gTUFYX1VJTlQzMi4KCiAgICAgICAgU1REX05FR0FUSVZFIDogVGhlIHNjYW5uZWQgdmFsdWUgd2FzIG5lZ2F0aXZlIGFuZCBpdHMgYWJzb2x1dGUgdmFsdWUgd2FzCiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAxIHRvIE1BWF9VSU5UMzIuICBUaGUgcmVzdWx0IGlzIHRoZSBuZWdhdGVkIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgKGNhc3QgdG8gYSB1aW50MzIpLgoKICAgICAgICBTVERfTk9ESUdJVFMgOiBObyBkaWdpdHMgd2VyZSBmb3VuZC4gIFRoZSByZXN1bHQgaXMgemVyby4KCiAgICAgICAgU1REX09WRVJGTE9XIDogVGhlIGFic29sdXRlIHZhbHVlIGV4Y2VlZGVkIE1BWF9VSU5UMzIuICBUaGUgcmVzdWx0CiAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0IHRvIE1BWF9VSU5UMzIgYW5kICpwcGNoRW5kIGlzIHNldCB0byBwY2hCdWYuCgogICAgICAgIFNURF9CQURQQVJBTSA6IEFuIGltcHJvcGVyIHZhbHVlIGZvciBuUmFkaXggd2FzIHJlY2VpdmVkLiAgVGhlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgIGlzIHNldCB0byB6ZXJvLCBhbmQgKnBwY2hFbmQgaXMgc2V0IHRvIHBjaEJ1Zi4KKgoKUmV0dXJuIFZhbHVlOgoKICAgIFRoZSBjb252ZXJ0ZWQgbnVtZXJpYyByZXN1bHQuCgpDb21tZW50czoKCiAgIFRoZSBzdGRfc2NhbnVsKCkgaXMgc2ltaWxhciB0byBBTlNJIEMncyBzdHJ0b3VsKCkgYnV0IGRpZmZlcnMgaW4gdGhlIGZvbGxvd2luZwogICByZXNwZWN0czoKCiAgICAgMS4gSXQgcmV0dXJucyBhbiBlcnJvci9zdWNjZXNzIGNvZGUuICBzdHJ0b3VsKCkgcmVzdWx0cyBhcmUgYW1iaWd1b3VzCiAgICAgICAgdW5sZXNzIHRoZSBjYWxsZXIgc2V0cyBlcnJubyB0byB6ZXJvIGJlZm9yZSBjYWxsaW5nIGl0LgoKICAgICAyLiBzdGRfc2NhbnVsKCkgaXMgZnJlZSBvZiByZWZlcmVuY2VzIHRvIGN1cnJlbnQgbG9jYWxlIGFuZCBlcnJuby4gIFNvbWUKICAgICAgICBzdHJ0b3VsKCkgaW1wbGVtZW50YXRpb25zIHVzZSBsb2NhbGU7IHNvbWUgZG9uJ3QuCgogICAgIDMuIEl0IHByb3ZpZGVzIG1vcmUgY29tcGxldGUgcmVwb3J0aW5nIG9mIHJhbmdlIHVuZGVyZmxvdy4gIHN0cnRvdWwoKQogICAgICAgIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gIi0xIiBhbmQgIjB4RkZGRkZGRkYiLCBhbmQgdW5kZXJmbG93IGlzCiAgICAgICAgcG9vcmx5IGRlZmluZWQuCgogICAgIDQuIHN0ZF9zY2FudWwoKSByZXBvcnRzIGEgIm5vIGRpZ2l0cyIgZXJyb3IgY29kZSB0byBkaXN0aW5ndWlzaCAiMCIgZnJvbQogICAgICAgIHdoaXRlc3BhY2UsICIrIiwgZXRjLi4KClNlZSBBbHNvOgoKICAgc3RkX3NjYW51bGwoKQoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9zY2FudWxsKCkKCkRlc2NyaXB0aW9uOgoKICAgIFRoZSBzdGRfc2NhbnVsbCgpIGNvbnZlcnRzIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIGEgbnVtYmVyIHRvIGFuCiAgICB1bnNpZ25lZCBsb25nIGxvbmcuICBJdCBleHBlY3RzIHN0cmluZ3MgdGhhdCBtYXRjaCB0aGUgZm9sbG93aW5nIHBhdHRlcm46Cj09PXByZT4KICAgICAgICAgc3BhY2VzIFsrfC1dIGRpZ2l0cwo9PT0vcHJlPgoKICAgICdTcGFjZXMnIGlzIHplcm8gb3IgbW9yZSBBU0NJSSBzcGFjZSBvciB0YWIgY2hhcmFjdGVycy4KCiAgICAnRGlnaXRzJyBpcyBhbnkgbnVtYmVyIG9mIGRpZ2l0cyB2YWxpZCBpbiB0aGUgcmFkaXguICBMZXR0ZXJzICdBJyB0aHJvdWdoCiAgICAnWicgYXJlIHRyZWF0ZWQgYXMgZGlnaXRzIHdpdGggdmFsdWVzIDEwIHRocm91Z2ggMzUuICAnRGlnaXRzJyBtYXkgYmVnaW4KICAgIHdpdGggIjB4IiB3aGVuIGEgcmFkaXggb2YgMCBvciAxNiBpcyBzcGVjaWZpZWQuCgogICAgVXBwZXIgYW5kIGxvd2VyIGNhc2UgbGV0dGVycyBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuCgoKUHJvdG90eXBlOgoKICAgIHVpbnQ2NCBzdGRfc2NhbnVsbChjb25zdCBjaGFyICpwY2hCdWYsIGludCBuUmFkaXgsIGNvbnN0IGNoYXIgKipwcGNoRW5kLAogICAgICAgICAgICAgICAgICAgICAgIGludCAqcG5FcnJvcikKClBhcmFtZXRlcnM6CgogICAgcGNoQnVmIFtpbl0gOiB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzY2FuLgoKICAgIG5SYWRpeCBbaW5dIDogdGhlIG51bWVyaWMgcmFkaXggKG9yIGJhc2UpIG9mIHRoZSBudW1iZXIuICBWYWxpZCB2YWx1ZXMgYXJlCiAgICAgICAgICAgICAgICAgIDIgdGhyb3VnaCAzNiBvciB6ZXJvLCB3aGljaCBpbXBsaWVzIGF1dG8tZGV0ZWN0aW9uLgogICAgICAgICAgICAgICAgICBBdXRvLWRldGVjdGlvbiBleGFtaW5lcyB0aGUgZGlnaXRzIGZpZWxkLiAgSWYgaXQgYmVnaW5zIHdpdGgKICAgICAgICAgICAgICAgICAgIjB4IiwgcmFkaXggMTYgaXMgc2VsZWN0ZWQuICBPdGhlcndpc2UsIGlmIGl0IGJlZ2lucyB3aXRoCiAgICAgICAgICAgICAgICAgICIwIiByYWRpeCA4IGlzIHNlbGVjdGVkLiAgT3RoZXJ3aXNlLCByYWRpeCAxMCBpcyBzZWxlY3RlZC4KCiAgICBwcGNoRW5kIFtvdXRdIDogaWYgcHBjaEVuZCBpcyBub3QgTlVMTCwgKnBwY2hFbmQgcG9pbnRzIHRvIHRoZSBmaXJzdAogICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciB0aGF0IGRpZCBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHBhdHRlcm4gc2hvd24KICAgICAgICAgICAgICAgICAgICBhYm92ZSwgZXhjZXB0IG9uIFNURF9CQURQQVJBTSBhbmQgU1REX09WRVJGTE9XIHdoZW4gaXQgaXMKICAgICAgICAgICAgICAgICAgICBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuCgogICAgcG5FcnJvciBbb3V0XSA6IElmIHBuRXJyb3IgaXMgbm90IE5VTEwsICpwbkVycm9yIGhvbGRzIHRoZSBlcnJvciBjb2RlLAogICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOgp+CiAgICAgICAgMCA6IE51bWVyaWMgdmFsdWUgaXMgZnJvbSAwIHRvIE1BWF9VSU5UNjQuCgogICAgICAgIFNURF9ORUdBVElWRSA6IFRoZSBzY2FubmVkIHZhbHVlIHdhcyBuZWdhdGl2ZSBhbmQgaXRzIGFic29sdXRlIHZhbHVlIHdhcwogICAgICAgICAgICAgICAgICAgICAgIGZyb20gMSB0byBNQVhfVUlOVDY0LiAgVGhlIHJlc3VsdCBpcyB0aGUgbmVnYXRlZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgIChjYXN0IHRvIGEgdWludDY0KS4KCiAgICAgICAgU1REX05PRElHSVRTIDogTm8gZGlnaXRzIHdlcmUgZm91bmQuICBUaGUgcmVzdWx0IGlzIHplcm8uCgogICAgICAgIFNURF9PVkVSRkxPVyA6IFRoZSBhYnNvbHV0ZSB2YWx1ZSBleGNlZWRlZCBNQVhfVUlOVDY0LiAgVGhlIHJlc3VsdAogICAgICAgICAgICAgICAgICAgICAgIGlzIHNldCB0byBNQVhfVUlOVDY0IGFuZCAqcHBjaEVuZCBpcyBzZXQgdG8gcGNoQnVmLgoKICAgICAgICBTVERfQkFEUEFSQU0gOiBBbiBpbXByb3BlciB2YWx1ZSBmb3IgblJhZGl4IHdhcyByZWNlaXZlZC4gIFRoZSByZXN1bHQKICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQgdG8gemVybywgYW5kICpwcGNoRW5kIGlzIHNldCB0byBwY2hCdWYuCioKClJldHVybiBWYWx1ZToKCiAgICBUaGUgY29udmVydGVkIG51bWVyaWMgcmVzdWx0LgoKQ29tbWVudHM6CgogICBUaGUgc3RkX3NjYW51bGwoKSBpcyBzaW1pbGFyIHRvIEFOU0kgQydzIHN0cnRvdWxsKCkgYnV0IGRpZmZlcnMgaW4gdGhlIGZvbGxvd2luZwogICByZXNwZWN0czoKCiAgICAgMS4gSXQgcmV0dXJucyBhbiBlcnJvci9zdWNjZXNzIGNvZGUuICBzdHJ0b3VsbCgpIHJlc3VsdHMgYXJlIGFtYmlndW91cwogICAgICAgIHVubGVzcyB0aGUgY2FsbGVyIHNldHMgZXJybm8gdG8gemVybyBiZWZvcmUgY2FsbGluZyBpdC4KCiAgICAgMi4gc3RkX3NjYW51bGwoKSBpcyBmcmVlIG9mIHJlZmVyZW5jZXMgdG8gY3VycmVudCBsb2NhbGUgYW5kIGVycm5vLiAgU29tZQogICAgICAgIHN0cnRvdWxsKCkgaW1wbGVtZW50YXRpb25zIHVzZSBsb2NhbGU7IHNvbWUgZG9uJ3QuCgogICAgIDMuIEl0IHByb3ZpZGVzIG1vcmUgY29tcGxldGUgcmVwb3J0aW5nIG9mIHJhbmdlIHVuZGVyZmxvdy4gIHN0cnRvdWwoKQogICAgICAgIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gIi0xIiBhbmQgIjB4RkZGRkZGRkZGRkZGRkZGRiIsIGFuZCB1bmRlcmZsb3cKICAgICAgICBpcyBwb29ybHkgZGVmaW5lZC4KCiAgICAgNC4gc3RkX3NjYW51bGwoKSByZXBvcnRzIGEgIm5vIGRpZ2l0cyIgZXJyb3IgY29kZSB0byBkaXN0aW5ndWlzaCAiMCIgZnJvbQogICAgICAgIHdoaXRlc3BhY2UsICIrIiwgZXRjLi4KClNlZSBBbHNvOgoKICAgc3RkX3NjYW51bCgpCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3Fzb3J0KCkKCkRlc2NyaXB0aW9uOgoKICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcXVpY2tzb3J0IGFsZ29yaXRobSwgYSBtYXNzaXZlbHkgcmVjdXJzaXZlLAogIGluLXBsYWNlIHNvcnRpbmcgYWxnb3JpdGhtIGZvciBhbiBhcnJheS4KCiAgVGhlIGNvbnRlbnRzIG9mIHRoZSBhcnJheSBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciBhY2NvcmRpbmcgdG8KICB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBwb2ludGVkIHRvIGJ5IHBmbkNvbXBhcmUuCgogIHBmbkNvbXBhcmUgbXVzdCByZXR1cm4gYSB2YWx1ZSBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvcgogIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHRvIGJlCiAgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQsIHJlc3BlY3RpdmVseS4KCiAgc3RkX3Fzb3J0KCkgaXMgbm90IGEgc3RhYmxlIHNvcnQuCgpQcm90b3R5cGU6CiAgIHZvaWQgc3RkX3Fzb3J0KHZvaWQqIHBFbGVtcywgaW50IG5OdW1FbGVtcywgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICAgIGludCAoKnBmbkNvbXBhcmUpKHZvaWQqLCBjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopLAogICAgICAgICAgICAgICAgICB2b2lkKiBwQ29tcGFyZUN4KTsKCgpQYXJhbWV0ZXJzOgogICBwRWxlbXM6IGFycmF5IG9mIGVsZW1lbnRzIHRvIGJlIHNvcnRlZCBpbiBwbGFjZS4gIEl0J3Mgc2l6ZQogICAgICAgICAgIG11c3QgYmUgbk51bUVsZW1zICogbkVsZW1XaWR0aCBpbiBieXRlcy4KICAgbk51bUVsZW1zOiBudW1iZXIgb2YgZWxlbWVudHMgaW4gcEVsZW1zCiAgIG5FbGVtV2lkdGg6IHRoZSB3aWR0aCwgaW4gYnl0ZXMgb2YgZWFjaCBlbGVtZW50IG9mIHBFbGVtcwogICBwZm5Db21wYXJlOiBjYWxsYmFjayBjb21wYXJpc29uIGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIDAsIGxlc3MgdGhhbgogICAgICAgICAgICAgICB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHRoZSBsZWZ0IGNvbXBhcmFuZCBpcyBlcXVhbCB0bywgbGVzcwogICAgICAgICAgICAgICB0aGFuLCBvciBncmVhdGVyIHRoYW4sIHRoZSByaWdodCBjb21wYXJhbmQsIHJlc3BlY3RpdmVseS4KICAgcENvbXBhcmVDeDogdGhlIGNvbnRleHQgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYnkgcGZuQ29tcGFyZQoKUmV0dXJuIFZhbHVlOgogICBOb25lCgpDb21tZW50czoKICAgSWYgbkVsZW1XaWR0aCBpcyAyLCA0LCBvciA4LCBwRWxlbXMgaXMgYWNjZXNzZWQgaW50ZXJuYWxseSBhcwogICBpbnRlZ2VyIHZhbHVlcyBmb3IgdGhlIHB1cnBvc2VzIG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgZWxlbWVudHMuCiAgIFRoZXJlZm9yZSwgcEVsZW1zIG11c3QgYmUgYWxpZ25lZCBvbiBhIG1lbW9yeSBib3VuZGFyeSBjb21wYXRpYmxlCiAgIHdpdGggaW50ZWdlciBhY2Nlc3Mgb2YgdGhlIGFycmF5IGVsZW1lbnRzLiAgSS5lLiBpZiB5b3UgcGFzcyA0IGFzCiAgIG5FbGVtV2lkdGgsICooaW50KilwRWxlbXMgbXVzdCBzdWNjZWVkLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0ZF9iaXNlY3QoKQoKRGVzY3JpcHRpb246CgogICBGaW5kIGFuIGVsZW1lbnQgaW4gYSBzb3J0ZWQgYXJyYXkgb2YgZWxlbWVudHMuICBVc2VzIGEgYmluYXJ5CiAgIHNlYXJjaC4KClByb3RvdHlwZToKICAgaW50IHN0ZF9iaXNlY3QoY29uc3Qgdm9pZCogcEVsZW1zLCBpbnQgbk51bUVsZW1zLCBpbnQgbkVsZW1XaWR0aCwKICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcEVsZW1GaW5kLAogICAgICAgICAgICAgICAgICBpbnQgKCpwZm5Db21wYXJlKSh2b2lkKiwgY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSwKICAgICAgICAgICAgICAgICAgdm9pZCogcENvbXBhcmVDeCk7CgpQYXJhbWV0ZXJzOgogICBwRWxlbXM6IGFycmF5IG9mIGVsZW1lbnRzIHRvIGJlIHNlYXJjaGVkLiAgSXQncyBzaXplCiAgICAgICAgICAgbXVzdCBiZSBuTnVtRWxlbXMgKiBuRWxlbVdpZHRoIGluIGJ5dGVzLgogICBuTnVtRWxlbXM6IG51bWJlciBvZiBlbGVtZW50cyBpbiBwRWxlbXMKICAgbkVsZW1XaWR0aDogdGhlIHdpZHRoLCBpbiBieXRlcyBvZiBlYWNoIGVsZW1lbnQgb2YgcEVsZW1zCiAgIHBFbGVtRmluZDogdGhlIGVsZW1lbnQgdmFsdWUgdG8gZmluZCBpbiB0aGUgYXJyYXkKICAgcGZuQ29tcGFyZTogY2FsbGJhY2sgY29tcGFyaXNvbiBmdW5jdGlvbiwgc2hvdWxkIHJldHVybiAwLCBsZXNzIHRoYW4KICAgICAgICAgICAgICAgemVybyBvciBncmVhdGVyIHRoYW4gemVybyBpZiB0aGUgbGVmdCBjb21wYXJhbmQgaXMgZXF1YWwgdG8sIGxlc3MKICAgICAgICAgICAgICAgdGhhbiwgb3IgZ3JlYXRlciB0aGFuLCB0aGUgcmlnaHQgY29tcGFyYW5kLCByZXNwZWN0aXZlbHkuCiAgIHBDb21wYXJlQ3g6IHRoZSBjb250ZXh0IHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGJ5IHBmbkNvbXBhcmUKClJldHVybiBWYWx1ZToKICAgaW5kZXggb2YgdGhlIGVsZW1lbnQgc3VjaCB0aGF0IHBFbGVtc1tpbmRleF0gPD0gZWxlbSA8IHBFbGVtc1tpbmRleCArIDFdCiAgIG5OdW1FbGVtcyBpZiBlbGVtIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0CiAgIDAgaWYgdGhlIGVsZW0gaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBsaXN0Cgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX21lcmdlKCkKCkRlc2NyaXB0aW9uOgoKICAgTWVyZ2UgdHdvIHNvcnRlZCBhcnJheXMgaW50byBhbm90aGVyIGFycmF5LgoKUHJvdG90eXBlOgogICB2b2lkIHN0ZF9tZXJnZSh2b2lkKiB2cERzdCwgaW50IG5Ec3QsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHZwQSwgaW50IG5BLAogICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiB2cEIsIGludCBuQiwKICAgICAgICAgICAgICAgICAgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICAgIGludCAoKnBmbkNvbXBhcmUpKHZvaWQqLCBjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopLAogICAgICAgICAgICAgICAgICB2b2lkKiBwQ29tcGFyZUN4KTsKClBhcmFtZXRlcnM6CiAgIHZwRHN0OiBkZXN0aW5hdGlvbiBhcnJheS4gIEl0J3Mgc2l6ZSBtdXN0IGJlIG5Ec3QgKiBuRWxlbVdpZHRoIGluIGJ5dGVzLgogICBuRHN0OiBudW1iZXIgb2YgZWxlbWVudHMgdGhhdCB2cERzdCBjYW4gYWNjb21vZGF0ZQogICB2cEE6IGFycmF5IG9mIGVsZW1lbnRzIHRvIGJlIG1lcmdlZCwgIGl0J3Mgc2l6ZSBtdXN0IGJlIG5BICogbkVsZW1XaWR0aAogICAgICAgICBpbiBieXRlcy4KICAgbkE6IG51bWJlciBvZiBlbGVtZW50cyBpbiB2cEEKICAgdnBCOiBhcnJheSBvZiBlbGVtZW50cyB0byBiZSBtZXJnZWQsICBpdCdzIHNpemUgbXVzdCBiZSBuQiAqIG5FbGVtV2lkdGgKICAgICAgICAgaW4gYnl0ZXMuCiAgIG5COiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdnBCCiAgIG5FbGVtV2lkdGg6IHRoZSB3aWR0aCwgaW4gYnl0ZXMgb2YgZWFjaCBlbGVtZW50IG9mIHBFbGVtcwogICBwZm5Db21wYXJlOiBjYWxsYmFjayBjb21wYXJpc29uIGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIDAsIGxlc3MgdGhhbgogICAgICAgICAgICAgICB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHRoZSBsZWZ0IGNvbXBhcmFuZCBpcyBlcXVhbCB0bywgbGVzcwogICAgICAgICAgICAgICB0aGFuLCBvciBncmVhdGVyIHRoYW4sIHRoZSByaWdodCBjb21wYXJhbmQsIHJlc3BlY3RpdmVseS4KICAgcENvbXBhcmVDeDogdGhlIGNvbnRleHQgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYnkgcGZuQ29tcGFyZQoKUmV0dXJuIFZhbHVlOgogIG5vbmUKCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGRfdW5pcSgpCgpEZXNjcmlwdGlvbjoKICAgUmVtb3ZlcyBkdXBsaWNhdGUgZW50cmllcyBmcm9tIGEgc29ydGVkIGFycmF5LgoKUHJvdG90eXBlOgogICBpbnQgc3RkX3VuaXEodm9pZCogdnBFbGVtcywgaW50IG5OdW1FbGVtcywgaW50IG5FbGVtV2lkdGgsCiAgICAgICAgICAgICAgICBpbnQgKCpwZm5Db21wYXJlKSh2b2lkKiwgY29uc3Qgdm9pZCosIGNvbnN0IHZvaWQqKSwKICAgICAgICAgICAgICAgIHZvaWQqIHBDb21wYXJlQ3gpOwoKUGFyYW1ldGVyczoKICAgcEVsZW1zOiBhcnJheSBvZiBlbGVtZW50cyB0byBiZSBzZWFyY2hlZC4gIEl0J3Mgc2l6ZQogICAgICAgICAgIG11c3QgYmUgbk51bUVsZW1zICogbkVsZW1XaWR0aCBpbiBieXRlcy4KICAgbk51bUVsZW1zOiBudW1iZXIgb2YgZWxlbWVudHMgaW4gcEVsZW1zCiAgIG5FbGVtV2lkdGg6IHRoZSB3aWR0aCwgaW4gYnl0ZXMgb2YgZWFjaCBlbGVtZW50IG9mIHBFbGVtcwogICBwZm5Db21wYXJlOiBjYWxsYmFjayBjb21wYXJpc29uIGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIDAsIGxlc3MgdGhhbgogICAgICAgICAgICAgICB6ZXJvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIHRoZSBsZWZ0IGNvbXBhcmFuZCBpcyBlcXVhbCB0bywgbGVzcwogICAgICAgICAgICAgICB0aGFuLCBvciBncmVhdGVyIHRoYW4sIHRoZSByaWdodCBjb21wYXJhbmQsIHJlc3BlY3RpdmVseS4KICAgcENvbXBhcmVDeDogdGhlIGNvbnRleHQgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgYnkgcGZuQ29tcGFyZQoKUmV0dXJuIFZhbHVlOgogICB0aGUgbnVtYmVyIG9mIHVuaXEgZWxlbWVudHMgbGVmdCBpbiB2cEVsZW1zCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RkX3NjYW5kKCkKCkRlc2NyaXB0aW9uOgoKICAgVGhlIHN0ZF9zY2FuZCgpIGNvbnZlcnRzIHRoZSBpbml0aWFsIHBvcnRpb24gb2YgYW4gaW5wdXQgQVNDSUkgc3RyaW5nCiAgIHRvIGl0J3MgY29ycmVzcG9uZGluZyBmbG9hdGluZyBwb2ludCB2YWx1ZS4gSXQgZXhwZWN0cyB0aGUgaW5wdXQKICAgc3RyaW5nIHRvIG1hdGNoIHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKPT09cHJlPgogICAgICAgICA8U3BhY2VzPjxTdWJqZWN0IFN0cmluZz48UmVzdCBPZiBUaGUgU3RyaW5nPgo9PT0vcHJlPgoKICAgJ1NwYWNlcycgLSBpcyB6ZXJvIG9yIG1vcmUgQVNDSUkgc3BhY2Ugb3IgdGFiIGNoYXJhY3RlcnMuCiAgICdTdWJqZWN0IFN0cmluZycgLSBpcyB0aGUgcGFydCBvZiB0aGUgaW5wdXQgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhCiAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBmbG9hdGluZyBwb2ludCBjb25zdGFudC4KICAgJ1Jlc3QgT2YgVGhlIFN0cmluZycgLSBpcyB0aGUgcmVtYWluaW5nIHNlcXVlbmNlIG9mIG9uZSBvciBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmluZy4KCiAgIEEgdmFsaWQgc3ViamVjdCBzdHJpbmcgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogICAgICAtLSA8TkFOPiwgaWdub3JpbmcgY2FzZS4gVGhpcyBpcyBpbnRlcnByZXRlZCBhcyBhIHF1aWV0IE5BTi4KICAgICAgLS0gWyt8LV08SU5GfElORklOSVRZPiwgaWdub3JpbmcgY2FzZS4gVGhpcyBpcyBpbnRlcnByZXRlZCBhcyBhbgogICAgICAgICBpbmZpbml0eS4KICAgICAgLS0gWyt8LV08VmFsaWQgRmxvYXRpbmcgUG9pbnQgTnVtYmVyPgoKICAgSW4gZ2VuZXJhbCwgYSB2YWxpZCBmbG9hdGluZyBwb2luZyBudW1iZXIgY2FuIGVpdGhlciBiZSBhIGRlY2ltYWwKICAgbnVtYmVyIG9yIGFuIGhleGFkZWNpbWFsIG51bWJlciwgYW5kIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CiAgICAgIDxJbnRlZ3JhbCBQYXJ0PlsuWzxGcmFjdGlvbmFsIFBhcnQ+XV1bPEV4cG9uZW50Pl0KICAgd2hlcmUgdGhlIGludGVyZ3JhbCwgZnJhY3Rpb25hbCBhbmQgdGhlIGV4cG9uZW50IHBhcnQgbWF5IGNvbnNpc3Qgb2YKICAgc2VxdWVuY2Ugb2YgdmFsaWQgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCBkaWdpdHMuIE1vcmUgc3BlY2lmaWNhbGx5OgoKICAgRm9yIGEgZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXI6CiAgICAgICdJbnRlZ3JhbCBQYXJ0JyAtIDxEZWNpbWFsIERpZ2l0cz4KICAgICAgJ0ZyYWN0aW9uYWwgUGFydCcgLSA8RGVjaW1hbCBEaWdpdHM+CiAgICAgICdFeHBvbmVudCcgLSA8ZXxFPjxEZWNpbWFsIERpZ2l0cz4KICAgRm9yIGEgaGV4YWRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyOgogICAgICAnSW50ZWdyYWwgUGFydCcgLSA8SGV4YWRlY2ltYWwgRGlnaXRzPgogICAgICAnRnJhY3Rpb25hbCBQYXJ0JyAtIDxIZXhhZGVjaW1hbCBEaWdpdHM+CiAgICAgICdFeHBvbmVudCcgLSA8cHxQPjxEZWNpbWFsIERpZ2l0cz4KCiAgIHdoZXJlOgogICAgICAnRGVjaW1hbCBEaWdpdHMnIC0gaXMgYW55IG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIHJhbmdlIFswLDEwXS4KICAgICAgJ0hleGFkZWNpbWFsIERpZ2l0cycgLSBpcyBhbnkgbnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgcmFuZ2UgWzAsMTBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIGFscGhhYmV0cyBBIHRocm91Z2ggRi4KICAgICAgJ2UnLCdFJywncCcsJ1AnIC0gcmVwcmVzZW50IHRoZSBleHBvbmVudCBjaGFyYWN0ZXJzCgpQcm90b3R5cGU6CgogICAgZG91YmxlIHN0ZF9zY2FuZChjb25zdCBjaGFyICpwY2hCdWYsIGNvbnN0IGNoYXIgKipwcGNoRW5kKTsKClBhcmFtZXRlcnM6CgogICAgcGNoQnVmIFtpbl0gOiB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyB0byBzY2FuLgoKICAgIHBwY2hFbmQgW291dF0gOiBpZiBwcGNoRW5kIGlzIG5vdCBOVUxMLCAqcHBjaEVuZCBwb2ludHMgdG8gdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGFmdGVyIHRoZSBwYXJzZWQgbnVtYmVyLgoKUmV0dXJuIFZhbHVlOgoKICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29udmVydGVkIG51bWVyaWMgcmVzdWx0LiBJZiB0aGUgc3RyaW5nCiAgICBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRoZW4gdGhlIGZ1bmN0aW9uCiAgICByZXR1cm5zIHplcm8uIElmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YKICAgIHJlcHJlc2VudGFibGUgdmFsdWVzIChvdmVyZmxvdyksIFstXUlORklOSVRZIGlzCiAgICByZXR1cm5lZC4gSW4gY2FzZSBvZiBhbiB1bmRlcmZsb3csIHRoZSBmdW5jdGlvbiByZXR1cm5zIHplcm8uCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgojZW5kaWYgLy8gQUVFU1REX0gKCgo=