LyoKKiBDb3B5cmlnaHQgqSB7MTk5Ny0xOTk5fSwgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqCiogRmlsZSBUWFRCREFULkgKKgoqIE1vZGlmaWNhdGlvbiBIaXN0b3J5OgoqCiogICBEYXRlICAgICAgICBOYW1lICAgICAgICBEZXNjcmlwdGlvbgoqICAgMDIvMTgvOTcgICAgYWxpdSAgICAgICAgQ29udmVydGVkIGZyb20gT3BlbkNsYXNzLgoqICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFkZSBzdGF0aWMgZGF0YSBtZW1iZXJzIGNvbnN0IHdoZXJlIGFwcHJvcHJpYXRlLgoqICAgMDMvMjUvOTcgICAgYWxpdSAgICAgICAgUmVtb3ZlZCBzdWJjbGFzc2VzLCBhbmQgbWVyZ2VkIHRoZWlyIHN0YXRpYyBkYXRhIGludG8gdGhpcwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MuICBJbnN0YW50aWF0ZWQgZm91ciBzdGF0aWMgaW5zdGFuY2VzIGZvciBjaGFyYWN0ZXIsCiogICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLCBzZW50ZW5jZSwgYW5kIGxpbmUuICBNYWRlIGZvcndhcmQoKSwgYmFja3dhcmQoKSwgYW5kCiogICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoKSBtZXRob2RzIGlubGluZS4KKiAgIDA0LzE1Lzk3ICAgIGFsaXUgICAgICAgIFdvcmtlZCBhcm91bmQgYnVnIGluIEFJWCB4bEMgY29tcGlsZXIgd2hpY2ggb2NjdXJzIGlmIHN0YXRpYwoqICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzIGNvbnRhaW4gY29uc3QgZWxlbWVudHMuCiogICAwNS8wNi85NyAgICBhbGl1ICAgICAgICBNYWRlIGtTSSwga1N0b3AsIGFuZCBrU0lfU3RvcCBpbnRvICNkZWZpbmVzIHRvIGhlbHAgb3V0CiogICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcGxpYW50IGNvbXBpbGVycy4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpZm5kZWYgVFhUQkRBVF9ICiNkZWZpbmUgVFhUQkRBVF9ICgojaW5jbHVkZSAidW5pY29kZS91dHlwZXMuaCIKY2xhc3MgV29yZEJyZWFrVGFibGU7CmNsYXNzIFVuaWNvZGVDbGFzc01hcHBpbmc7CmNsYXNzIFNwZWNpYWxNYXBwaW5nOwoKLyoqCiAqIFRoaXMgY2xhc3Mgd3JhcHMgdXAgdGhlIGRhdGEgdGFibGVzIG5lZWRlZCBmb3IgU2ltcGxlVGV4dEJvdW5kYXJ5LgogKiBJdCBpcyBzdGF0aWNhbGx5IGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0eXBlIG9mIHRleHQgYm91bmRhcnkuICBUaGlzCiAqIGNsYXNzIGlzIG5vdCBkZXNpZ25lZCB0byBiZSBzdWJjbGFzc2VkLgogKi8KY2xhc3MgVGV4dEJvdW5kYXJ5RGF0YSB7CnB1YmxpYzoKICAgIH5UZXh0Qm91bmRhcnlEYXRhKCkge30gLy8gRG8gbm90IHN1YmNsYXNzCgogICAgLy8gRmFzdCBpbmxpbmUgYWNjZXNzb3JzCiAgICBjb25zdCBXb3JkQnJlYWtUYWJsZSogZm9yd2FyZCh2b2lkKSBjb25zdDsKICAgIGNvbnN0IFdvcmRCcmVha1RhYmxlKiBiYWNrd2FyZCh2b2lkKSBjb25zdDsKICAgIGNvbnN0IFVuaWNvZGVDbGFzc01hcHBpbmcqIG1hcCh2b2lkKSBjb25zdDsKCiAgICBzdGF0aWMgY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSBrQ2hhcmFjdGVyQnJlYWtEYXRhOwogICAgc3RhdGljIGNvbnN0IFRleHRCb3VuZGFyeURhdGEga1dvcmRCcmVha0RhdGE7CiAgICBzdGF0aWMgY29uc3QgVGV4dEJvdW5kYXJ5RGF0YSBrTGluZUJyZWFrRGF0YTsKICAgIHN0YXRpYyBjb25zdCBUZXh0Qm91bmRhcnlEYXRhIGtTZW50ZW5jZUJyZWFrRGF0YTsKCiAgICB0eXBlZGVmIHVpbnQ4X3QgTm9kZTsKICAgIHR5cGVkZWYgdWludDhfdCBUeXBlOwoKcHJpdmF0ZToKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9FTkRfT0ZfVEVYVDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9IT1JJWk9OVEFMX1RBQlVMQVRJT047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTElORUZFRUQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfVkVSVElDQUxfVEFCVUxBVElPTjsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9GT1JNX0ZFRUQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ0FSUklBR0VfUkVUVVJOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1NQQUNFOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX0VYQ0xBTUFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfUVVPVEFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTlVNQkVSX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfRE9MTEFSX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfUEVSQ0VOVDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9BTVBFUlNBTkQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQVBPU1RST1BIRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9DT01NQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBBU0NJSV9GVUxMX1NUT1A7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ09MT047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfU0VNSUNPTE9OOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1FVRVNUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfTk9OQlJFQUtJTkdfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfQ0VOVF9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFTQ0lJX1BPVU5EX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVNDSUlfWUVOX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTEFUSU4xX1NPRlRIWVBIRU47CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTEFUSU4xX0RFR1JFRV9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEFSQUJJQ19QRVJDRU5UX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQVJBQklDX0RFQ0lNQUxfU0VQQVJBVE9SOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9DSE9TRU9OR19MT1c7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0NIT1NFT05HX0hJR0g7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0pVTkdTRU9OR19MT1c7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSEFOR1VMX0pVTkdTRU9OR19ISUdIOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9KT05HU0VPTkdfTE9XOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhBTkdVTF9KT05HU0VPTkdfSElHSDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBGSUdVUkVfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgTk9OQlJFQUtJTkdfSFlQSEVOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX0hZUEhFTkFUSU9OX1BPSU5UOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX0xJTkVfU0VQQVJBVE9SOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBVTkNUVUFUSU9OX1BBUkFHUkFQSF9TRVBBUkFUT1I7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUEVSX01JTExFX1NJR047CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUEVSX1RFTl9USE9VU0FORF9TSUdOOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFBSSU1FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIERPVUJMRV9QUklNRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBUUklQTEVfUFJJTUU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgREVHUkVFX0NFTFNJVVM7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgREVHUkVFX0ZBSFJFTkhFSVQ7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUFVOQ1RVQVRJT05fSURFT0dSQVBISUNfQ09NTUE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgUFVOQ1RVQVRJT05fSURFT0dSQVBISUNfRlVMTF9TVE9QOyAKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBJREVPR1JBUEhJQ19JVEVSQVRJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfSTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfSTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfREk7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1NNQUxMX1RVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9UVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfTU87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1NNQUxMX1lBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9ZQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfU01BTExfWVU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1lVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9TTUFMTF9ZTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfWU87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1JPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEhJUkFHQU5BX0xFVFRFUl9TTUFMTF9XQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9MRVRURVJfV0E7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfTEVUVEVSX1ZVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIENPTUJJTklOR19LQVRBS0FOQV9ISVJBR0FOQV9WT0lDRURfU09VTkRfTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBISVJBR0FOQV9TRU1JVk9JQ0VEX1NPVU5EX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfSVRFUkFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgSElSQUdBTkFfVk9JQ0VEX0lURVJBVElPTl9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9BOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9BOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9JOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9JOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9VOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9VOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9FOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9POwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9POwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9ESTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfU01BTExfVFU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1RVOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9NTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfU01BTExfWUE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1lBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9ZVTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfWVU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX1lPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9ZTzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfUk87CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX1dBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9XQTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfVlU7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1NNQUxMX0tBOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0xFVFRFUl9TTUFMTF9LRTsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBLQVRBS0FOQV9MRVRURVJfVkE7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgS0FUQUtBTkFfTEVUVEVSX1ZPOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0hJUkFHQU5BX1BST0xPTkdFRF9TT1VORF9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX0lURVJBVElPTl9NQVJLOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIEtBVEFLQU5BX1ZPSUNFRF9JVEVSQVRJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBVTklDT0RFX0xPV19CT1VORF9IQU47CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgVU5JQ09ERV9ISUdIX0JPVU5EX0hBTjsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBIQU5HVUxfU1lMX0xPVzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBIQU5HVUxfU1lMX0hJR0g7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgQ0pLX0NPTVBBVElCSUxJVFlfRjkwMDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBDSktfQ09NUEFUSUJJTElUWV9GQTJEOwogICAgc3RhdGljIGNvbnN0IFVDaGFyIFVOSUNPREVfWkVST19XSURUSF9OT05fQlJFQUtJTkdfU1BBQ0U7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgRlVMTFdJRFRIX0VYQ0xBTUFUSU9OX01BUks7CiAgICBzdGF0aWMgY29uc3QgVUNoYXIgRlVMTFdJRFRIX0ZVTExfU1RPUDsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBGVUxMV0lEVEhfUVVFU1RJT05fTUFSSzsKICAgIHN0YXRpYyBjb25zdCBVQ2hhciBFTkRfT0ZfU1RSSU5HOwoKcHJpdmF0ZToKICAgIC8vIENoYXJhY3RlciBkYXRhCiAgICBlbnVtIENoYXJhY3Rlck1hcHBpbmcKICAgIHsKICAgICAgICAvLyBUaGVzZSBlbnVtIHZhbHVlcyBtdXN0IG9jY3VyIGluIHRoaXMgb3JkZXI7IGRvIG5vdAogICAgICAgIC8vIG1vZGlmeSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAgVGhlIGZvcndhcmQKICAgICAgICAvLyBhbmQgYmFja3dhcmQgZGF0YSB0YWJsZXMgYXJlIGluZGV4ZWQgYnkgdGhlc2UgZW51bXMuCiAgICAgICAga0FjY2VudF9kaWFjcml0aWMgICA9IDAsCiAgICAgICAga0Jhc2VGb3JtICAgICAgICAgICA9IDEsCiAgICAgICAga0Jhc2VDUiAgICAgICAgICAgICA9IDIsCiAgICAgICAga0Jhc2VMRiAgICAgICAgICAgICA9IDMsCiAgICAgICAga0Nob3Nlb25nICAgICAgICAgICA9IDQsICAgLy8gS29yZWFuIGluaXRpYWwgY29uc29uYW50CiAgICAgICAga0p1bmdzZW9uZyAgICAgICAgICA9IDUsICAvLyBLb3JlYW4gdm93ZWwKICAgICAgICBrSm9uZ3Nlb25nICAgICAgICAgID0gNiwgIC8vIEtvcmVhbiBmaW5hbCBjb25zb25hbnQKICAgICAgICBrRU9TICAgICAgICAgICAgICAgID0gNywKICAgICAgICBrQ2hhcmFjdGVyQ29sX2NvdW50ID0gOAogICAgfTsKCiAgICBzdGF0aWMgTm9kZSAgICAgICAgICAgICAgICAgICAgIGtDaGFyYWN0ZXJGb3J3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyRm9yd2FyZERhdGFfbGVuZ3RoOwogICAgc3RhdGljIFdvcmRCcmVha1RhYmxlKiAgICAgICAgICBrQ2hhcmFjdGVyRm9yd2FyZDsKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga0NoYXJhY3RlckJhY2t3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyQmFja3dhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga0NoYXJhY3RlckJhY2t3YXJkOwogICAgc3RhdGljIFR5cGUgICAgICAgICAgICAgICAgICAgICBrQ2hhcmFjdGVyUmF3TWFwcGluZ1tdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrQ2hhcmFjdGVyUmF3TWFwcGluZ19sZW5ndGg7CiAgICBzdGF0aWMgU3BlY2lhbE1hcHBpbmcgICAgICAgICAgIGtDaGFyYWN0ZXJFeGNlcHRpb25DaGFyW107CiAgICBzdGF0aWMgY29uc3QgaW50MzJfdCAgICAgICAgICAgIGtDaGFyYWN0ZXJFeGNlcHRpb25DaGFyX2xlbmd0aDsKICAgIHN0YXRpYyBjb25zdCBib29sX3QgICAgICAgICAgICAga0NoYXJhY3RlckV4Y2VwdGlvbkZsYWdzW107CiAgICBzdGF0aWMgVW5pY29kZUNsYXNzTWFwcGluZyogICAgIGtDaGFyYWN0ZXJNYXA7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtDaGFyYWN0ZXJBc2NpaVZhbHVlc1tdOwoKcHJpdmF0ZToKICAgIC8vIFdvcmQgZGF0YQogICAgZW51bSBXb3JkTWFwcGluZwogICAgewogICAgICAgIC8vIFRoZXNlIGVudW0gdmFsdWVzIG11c3Qgb2NjdXIgaW4gdGhpcyBvcmRlcjsgZG8gbm90CiAgICAgICAgLy8gbW9kaWZ5IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchICBUaGUgZm9yd2FyZAogICAgICAgIC8vIGFuZCBiYWNrd2FyZCBkYXRhIHRhYmxlcyBhcmUgaW5kZXhlZCBieSB0aGVzZSBlbnVtcy4KICAgICAgICBrQnJlYWsgICAgICAgICAgPSAwLAogICAgICAgIGtMZXR0ZXIgICAgICAgICA9IDEsCiAgICAgICAga051bWJlciAgICAgICAgID0gMiwKICAgICAgICBrTWlkTGV0dGVyICAgICAgPSAzLAogICAgICAgIGtNaWRMZXROdW0gICAgICA9IDQsCiAgICAgICAga1ByZU51bSAgICAgICAgID0gNSwKICAgICAgICBrUG9zdE51bSAgICAgICAgPSA2LAogICAgICAgIGtNaWROdW0gICAgICAgICA9IDcsCiAgICAgICAga1ByZU1pZE51bSAgICAgID0gOCwKICAgICAgICBrQmxhbmsgICAgICAgICAgPSA5LAogICAgICAgIGtMRiAgICAgICAgICAgICA9IDEwLAogICAgICAgIGtLYXRhICAgICAgICAgICA9IDExLAogICAgICAgIGtIaXJhICAgICAgICAgICA9IDEyLAogICAgICAgIGtLYW5qaSAgICAgICAgICA9IDEzLAogICAgICAgIGtEaWFjcml0ICAgICAgICA9IDE0LAogICAgICAgIGtDUiAgICAgICAgICAgICA9IDE1LAogICAgICAgIGtOc20gICAgICAgICAgICA9IDE2LAogICAgICAgIGt3RU9TICAgICAgICAgICA9IDE3LAogICAgICAgIGtXb3JkQ29sX2NvdW50ICA9IDE4CiAgICB9OwoKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga1dvcmRGb3J3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrV29yZEZvcndhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga1dvcmRGb3J3YXJkOwogICAgc3RhdGljIE5vZGUgICAgICAgICAgICAgICAgICAgICBrV29yZEJhY2t3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrV29yZEJhY2t3YXJkRGF0YV9sZW5ndGg7CiAgICBzdGF0aWMgV29yZEJyZWFrVGFibGUqICAgICAgICAgIGtXb3JkQmFja3dhcmQ7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtXb3JkUmF3TWFwcGluZ1tdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrV29yZFJhd01hcHBpbmdfbGVuZ3RoOwogICAgc3RhdGljIFNwZWNpYWxNYXBwaW5nICAgICAgICAgICBrV29yZEV4Y2VwdGlvbkNoYXJbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga1dvcmRFeGNlcHRpb25DaGFyX2xlbmd0aDsKICAgIHN0YXRpYyBVbmljb2RlQ2xhc3NNYXBwaW5nKiAgICAga1dvcmRNYXA7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtXb3JkQXNjaWlWYWx1ZXNbXTsKICAgIHN0YXRpYyBjb25zdCBib29sX3QgICAgICAgICAgICAga1dvcmRFeGNlcHRpb25GbGFnc1tdOwoKcHJpdmF0ZToKICAgIC8vIFNlbnRlbmNlIGRhdGEKICAgIGVudW0gU2VudGVuY2VNYXBwaW5nCiAgICB7CiAgICAgICAgLy8gVGhlc2UgZW51bSB2YWx1ZXMgbXVzdCBvY2N1ciBpbiB0aGlzIG9yZGVyOyBkbyBub3QKICAgICAgICAvLyBtb2RpZnkgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgIFRoZSBmb3J3YXJkCiAgICAgICAgLy8gYW5kIGJhY2t3YXJkIGRhdGEgdGFibGVzIGFyZSBpbmRleGVkIGJ5IHRoZXNlIGVudW1zLgogICAgICAgIGtPdGhlciAgICAgICAgICAgICAgPSAwLAogICAgICAgIGtTcGFjZSAgICAgICAgICAgICAgPSAxLAogICAgICAgIGtUZXJtaW5hdG9yICAgICAgICAgPSAyLAogICAgICAgIGtBbWJpZ3VvdXNUZXJtICAgICAgPSAzLAogICAgICAgIGtPcGVuQnJhY2tldCAgICAgICAgPSA0LAogICAgICAgIGtDbG9zZUJyYWNrZXQgICAgICAgPSA1LAogICAgICAgIGtDSksgICAgICAgICAgICAgICAgPSA2LAogICAgICAgIGtQYXJhZ3JhcGhCcmVhayAgICAgPSA3LAogICAgICAgIGtMb3dlckNhc2UgICAgICAgICAgPSA4LAogICAgICAgIGtVcHBlckNhc2UgICAgICAgICAgPSA5LAogICAgICAgIGtzTnVtYmVyICAgICAgICAgICAgPSAxMCwKICAgICAgICBrUXVvdGUgICAgICAgICAgICAgID0gMTEsCiAgICAgICAgLy9rc0NSLAogICAgICAgIGtzTnNtICAgICAgICAgICAgICAgPSAxMiwKICAgICAgICBrc0VPUyAgICAgICAgICAgICAgID0gMTMsCiAgICAgICAga1NlbnRlbmNlQ29sX2NvdW50ICA9IDE0CiAgICB9OwoKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga1NlbnRlbmNlRm9yd2FyZERhdGFbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga1NlbnRlbmNlRm9yd2FyZERhdGFfbGVuZ3RoOwogICAgc3RhdGljIFdvcmRCcmVha1RhYmxlKiAgICAgICAgICBrU2VudGVuY2VGb3J3YXJkOwogICAgc3RhdGljIE5vZGUgICAgICAgICAgICAgICAgICAgICBrU2VudGVuY2VCYWNrd2FyZERhdGFbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga1NlbnRlbmNlQmFja3dhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga1NlbnRlbmNlQmFja3dhcmQ7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtTZW50ZW5jZVJhd01hcHBpbmdbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga1NlbnRlbmNlUmF3TWFwcGluZ19sZW5ndGg7CiAgICBzdGF0aWMgU3BlY2lhbE1hcHBpbmcgICAgICAgICAgIGtTZW50ZW5jZUV4Y2VwdGlvbkNoYXJbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga1NlbnRlbmNlRXhjZXB0aW9uQ2hhcl9sZW5ndGg7CiAgICBzdGF0aWMgVW5pY29kZUNsYXNzTWFwcGluZyogICAgIGtTZW50ZW5jZU1hcDsKICAgIHN0YXRpYyBUeXBlICAgICAgICAgICAgICAgICAgICAga1NlbnRlbmNlQXNjaWlWYWx1ZXNbXTsKICAgIHN0YXRpYyBjb25zdCBib29sX3QgICAgICAgICAgICAga1NlbnRlbmNlRXhjZXB0aW9uRmxhZ3NbXTsKCnByaXZhdGU6CiAgICAvLyBMaW5lIGRhdGEKICAgIGVudW0gTGluZU1hcHBpbmcKICAgIHsKICAgICAgICAvLyBUaGVzZSBlbnVtIHZhbHVlcyBtdXN0IG9jY3VyIGluIHRoaXMgb3JkZXI7IGRvIG5vdAogICAgICAgIC8vIG1vZGlmeSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAgVGhlIGZvcndhcmQKICAgICAgICAvLyBhbmQgYmFja3dhcmQgZGF0YSB0YWJsZXMgYXJlIGluZGV4ZWQgYnkgdGhlc2UgZW51bXMuCiAgICAgICAga0xpbmVCcmVhaywKICAgICAgICAvL2Fsd2F5cyBicmVha3MgKG11c3QgYmUgcHJlc2VudCBhcyBmaXJzdCBpdGVtKQogICAgICAgIGtMaW5lQmxhbmssCiAgICAgICAgLy9zcGFjZXMsIHRhYnMsIG51bGxzLgogICAgICAgIGtMaW5lQ1IsCiAgICAgICAgLy9jYXJyaWFnZSByZXR1cm4KICAgICAgICBrTGluZU5vbkJsYW5rLAogICAgICAgIC8vZXZlcnl0aGluZyBub3QgaW5jbHVkZWQgZWxzZXdoZXJlCiAgICAgICAga0xpbmVPcCwKICAgICAgICAvL2h5cGhlbnMuLi4uCiAgICAgICAga0xpbmVKd3JkLAogICAgICAgIC8vaGlyYWdhbmEsIGthdGFrYW5hLCBhbmQga2FuamkKICAgICAgICBrTGluZVByZUp3cmQsCiAgICAgICAgLy9jaGFyYWN0ZXJzIHRoYXQgYmluZCB0byB0aGUgYmVnaW5uaW5nIG9mIGEgSmFwYW5lc2Ugd29yZAogICAgICAgIGtMaW5lUG9zdEp3cmQsCiAgICAgICAgLy9jaGFyYWN0ZXJzIHRoYXQgYmluZCB0byB0aGUgZW5kIG9mIGEgSmFwYW5lc2Ugd29yZAogICAgICAgIGtMaW5lRGlnaXQsCiAgICAgICAgLy9kaWdpdHMKICAgICAgICBrTGluZU51bVB1bmN0LAogICAgICAgIC8vcHVuY3R1YXRpb24gdGhhdCBjYW4gYXBwZWFyIHdpdGhpbiBhIG51bWJlcgogICAgICAgIGtMaW5lQ3VycmVuY3ksCiAgICAgICAgLy9jdXJyZW5jeSBzeW1ib2xzIHRoYXQgY2FuIHByZWNlZGUgYSBudW1iZXIKICAgICAgICBrTGluZU5zbSwKICAgICAgICAvLyBub24tc3BhY2luZyBtYXJrcwogICAgICAgIGtMaW5lTmJzcCwKICAgICAgICAvLyBub24tYnJlYWtpbmcgY2hhcmFjdGVycwogICAgICAgIGtMaW5lRU9TLAogICAgICAgIGtMaW5lQ29sX2NvdW50CiAgICB9OwoKICAgIHN0YXRpYyBOb2RlICAgICAgICAgICAgICAgICAgICAga0xpbmVGb3J3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZUZvcndhcmREYXRhX2xlbmd0aDsKICAgIHN0YXRpYyBXb3JkQnJlYWtUYWJsZSogICAgICAgICAga0xpbmVGb3J3YXJkOwogICAgc3RhdGljIE5vZGUgICAgICAgICAgICAgICAgICAgICBrTGluZUJhY2t3YXJkRGF0YVtdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZUJhY2t3YXJkRGF0YV9sZW5ndGg7CiAgICBzdGF0aWMgV29yZEJyZWFrVGFibGUqICAgICAgICAgIGtMaW5lQmFja3dhcmQ7CiAgICBzdGF0aWMgVHlwZSAgICAgICAgICAgICAgICAgICAgIGtMaW5lUmF3TWFwcGluZ1tdOwogICAgc3RhdGljIGNvbnN0IGludDMyX3QgICAgICAgICAgICBrTGluZVJhd01hcHBpbmdfbGVuZ3RoOwogICAgc3RhdGljIFNwZWNpYWxNYXBwaW5nICAgICAgICAgICBrTGluZUV4Y2VwdGlvbkNoYXJbXTsKICAgIHN0YXRpYyBjb25zdCBpbnQzMl90ICAgICAgICAgICAga0xpbmVFeGNlcHRpb25DaGFyX2xlbmd0aDsKICAgIHN0YXRpYyBjb25zdCBib29sX3QgICAgICAgICAgICAga0xpbmVFeGNlcHRpb25GbGFnc1tdOwogICAgc3RhdGljIFVuaWNvZGVDbGFzc01hcHBpbmcqICAgICBrTGluZU1hcDsKICAgIHN0YXRpYyBUeXBlICAgICAgICAgICAgICAgICAgICAga0xpbmVBc2NpaVZhbHVlc1tdOwoKcHJvdGVjdGVkOgogICAgLyoqCiAgICAgKiBDb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIHByb3ZpZGVkIHRvIG1ha2UKICAgICAqIGNvbXBpbGVyIGhhcHB5IG9ubHkuIERPIE5PVCBDQUxMLgogICAgICovCiAgICBUZXh0Qm91bmRhcnlEYXRhKGNvbnN0IFRleHRCb3VuZGFyeURhdGEmKSB7fQogICAgVGV4dEJvdW5kYXJ5RGF0YSYgb3BlcmF0b3I9KGNvbnN0IFRleHRCb3VuZGFyeURhdGEmKSB7IHJldHVybiAqdGhpczsgfQogICAgVGV4dEJvdW5kYXJ5RGF0YSgpIHt9IC8vIERvIG5vdCBzdWJjbGFzcwogICAgVGV4dEJvdW5kYXJ5RGF0YShjb25zdCBXb3JkQnJlYWtUYWJsZSogZm9yd2FyZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV29yZEJyZWFrVGFibGUqIGJhY2t3YXJkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBVbmljb2RlQ2xhc3NNYXBwaW5nKiBtYXApCiAgICAgICAgICAgICAgICAgICAgIDogZkZvcndhcmQoZm9yd2FyZCksIGZCYWNrd2FyZChiYWNrd2FyZCksIGZNYXAobWFwKSB7fQogICAgICAgIApwcml2YXRlOgogICAgY29uc3QgV29yZEJyZWFrVGFibGUqICAgICAgIGZGb3J3YXJkOwogICAgY29uc3QgV29yZEJyZWFrVGFibGUqICAgICAgIGZCYWNrd2FyZDsKICAgIGNvbnN0IFVuaWNvZGVDbGFzc01hcHBpbmcqICBmTWFwOwp9OwoKaW5saW5lIGNvbnN0IFdvcmRCcmVha1RhYmxlKiBUZXh0Qm91bmRhcnlEYXRhOjpmb3J3YXJkKCkgY29uc3QKewogICAgcmV0dXJuIGZGb3J3YXJkOwp9CgppbmxpbmUgY29uc3QgV29yZEJyZWFrVGFibGUqIFRleHRCb3VuZGFyeURhdGE6OmJhY2t3YXJkKCkgY29uc3QKewogICAgcmV0dXJuIGZCYWNrd2FyZDsKfQoKaW5saW5lIGNvbnN0IFVuaWNvZGVDbGFzc01hcHBpbmcqIFRleHRCb3VuZGFyeURhdGE6Om1hcCgpIGNvbnN0CnsKICAgIHJldHVybiBmTWFwOwp9CgovLyBUaGVzZSB1c2VkIHRvIGJlIHN0YXRpYyBjb25zdHMgaW4gdGhlIGNsYXNzLCBidXQgc29tZSBjb21waWxlcnMgZGlkbid0IGxpa2UgdGhhdC4KI2RlZmluZSBrU3RvcCAgICAgICAoMCkKI2RlZmluZSBrU0kgICAgICAgICAoMHg4MCkKI2RlZmluZSBrU0lfU3RvcCAgICAoa1NJK2tTdG9wKQoKI2RlZmluZSBrU0lfMSAgICAgICAoa1NJKzEpCiNkZWZpbmUga1NJXzIgICAgICAgKGtTSSsyKQojZGVmaW5lIGtTSV8zICAgICAgIChrU0krMykKI2RlZmluZSBrU0lfNCAgICAgICAoa1NJKzQpCiNkZWZpbmUga1NJXzUgICAgICAgKGtTSSs1KQojZGVmaW5lIGtTSV82ICAgICAgIChrU0krNikKI2RlZmluZSBrU0lfNyAgICAgICAoa1NJKzcpCiNkZWZpbmUga1NJXzggICAgICAgKGtTSSs4KQojZGVmaW5lIGtTSV85ICAgICAgIChrU0krOSkKI2RlZmluZSBrU0lfMTAgICAgICAoa1NJKzEwKQojZGVmaW5lIGtTSV8xMSAgICAgIChrU0krMTEpCiNkZWZpbmUga1NJXzEyICAgICAgKGtTSSsxMikKI2RlZmluZSBrU0lfMTMgICAgICAoa1NJKzEzKQojZGVmaW5lIGtTSV8xNCAgICAgIChrU0krMTQpCgojZW5kaWYgLy8gX1RYVEJEQVQKLy9lb2YK