LyoKICogIE5vdGVwYWQgKER1dGNoIHJlc291cmNlcykKICoKICogIENvcHlyaWdodCAyMDAzIEhhbnMgTGVpZGVra2VyCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfRFVUQ0gsIFNVQkxBTkdfTkVVVFJBTAoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZCZXN0YW5kIiB7CiAgTUVOVUlURU0gIiZOaWV1dyIsCQkgICAgIENNRF9ORVcKICBNRU5VSVRFTSAiJk9wZW5lbi4uLlx0Q3RybCtPIiwJICAgICBDTURfT1BFTgogIE1FTlVJVEVNICJPJnBzbGFhblx0Q3RybCtTIiwJICAgICBDTURfU0FWRQogIE1FTlVJVEVNICJPcHMmbGFhbiBhbHMuLi4iLAkgICAgIENNRF9TQVZFX0FTCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZBZmRydWtrZW4uLi5cdEN0cmwrUCIsCSAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gIlBhZ2luYS1pbiZzdGVsbGluZy4uLiIsICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICJQcmludGVyaW5zdGVsbGluZ2VuLi4uIiwgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFmc2x1aXRlbiIsICAgICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICJCZSZ3ZXJrZW4iIHsKICBNRU5VSVRFTSAiJk9uZ2VkYWFuIG1ha2VuXHRDdHJsK1oiLCAgICBDTURfVU5ETwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJLJm5pcHBlblx0Q3RybCtYIiwgICAgICAgICAgIENNRF9DVVQKICBNRU5VSVRFTSAiJktvcGnrcmVuXHRDdHJsK0MiLCAgICAgICAgICBDTURfQ09QWQogIE1FTlVJVEVNICImUGxha2tlblx0Q3RybCtWIiwgICAgICAgICAgIENNRF9QQVNURQogIE1FTlVJVEVNICImVmVyd2lqZGVyZW5cdERlbCIsICAgICAgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJkFsbGVzIHNlbGVjdGVyZW5cdEN0cmwrQSIsICBDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICJUaWpkLyZkYXR1bVx0RjUiLCAgICAgICAgICAgIENNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQSZ1dG9tYXRpc2NoZSB0ZXJ1Z2xvb3AiLCAgICBDTURfV1JBUAogIE1FTlVJVEVNICImTGV0dGVydHlwZSBpbnN0ZWxsZW4uLi4iLCAgIENNRF9GT05UCiB9ClBPUFVQICImWm9la2VuIiB7CiAgTUVOVUlURU0gIiZab2VrZW4uLi5cdEN0cmwrWiIsICAgICAgIENNRF9TRUFSQ0gKICBNRU5VSVRFTSAiJlZvbGdlbmRlIHpvZWtlblx0RjMiLCAgQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImSGVscCIgewogIE1FTlVJVEVNICImSGVscC1vbmRlcndlcnBlbiIsICBDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImWm9la2VuLi4uIiwgICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkh1bHAgYmlqIEhlbHAiLCAgICAgQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImQWJvdXQgTm90ZXBhZCIsIENNRF9IRUxQX0FCT1VUX05PVEVQQUQKIH0KfQoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKRElBTE9HX1BBR0VTRVRVUCBESUFMT0cgMCwgMCwgMjI1LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJQYWdpbmEtaW5zdGVsbGluZyIKewpMVEVYVCAgICAiJktvcHRla3N0OiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImVm9ldHRla3N0OiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlcyAobWlsbGltZXRlcik6IiwgIDB4MTQ0LCAgMTAsIDQzLDE2MCwgNDUKTFRFWFQgICAgIkxpJm5rczoiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkJvdmVuOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZSZWNodHM6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImT25kZXI6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfQk9UVE9NVkFMVUUsICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgSURPSywgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiQW5udWxlcmVuIiwgSURDQU5DRUwsICAgICAgICAgICAgICAgMTgwLCAyMSwgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIiZIZWxwIiwgICAgIElESEVMUCwgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgICImZiIKU1RSSU5HX1BBR0VTRVRVUF9GT09URVJWQUxVRSwgICAiUGFnaW5hICZwIgoKU1RSSU5HX05PVEVQQUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktsYWRibG9rIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRk9VVCIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldBQVJTQ0hVV0lORyIKU1RSSU5HX0lORk8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluZm9ybWF0aWUiCgpTVFJJTkdfVU5USVRMRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5hYW1sb29zKSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBbGxlIGJlc3RhbmRlbiAoKi4qKSIKU1RSSU5HX1RFWFRfRklMRVNfVFhULCAgICAgICAgICAgICAgICAgICAgICAgICAgIlRla3N0YmVzdGFuZGVuICgqLnR4dCkiCgpTVFJJTkdfVE9PTEFSR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV0IGJlc3RhbmQgJyVzJyBpcyB0ZSBncm9vdCB2b29yIEtsYWRibG9rLlxuIFwKR2VicnVpayBlZW4gYW5kZXJlIGVkaXRvci4iClNUUklOR19OT1RFWFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVIGhlZWZ0IGdlZW4gdGVrc3QgaW5nZXZvZXJkLiBcClxuVHlwZSB1dyB0ZWtzdCBlbiBwcm9iZWVyIGhldCBub2dtYWFscyIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhldCBiZXN0YW5kICclcydcbmJlc3RhYXQgbmlldFxuXG4gXApXaWx0IHUgZWVuIG5pZXV3IGJlc3RhbmQgbWFrZW4/IgpTVFJJTkdfTk9UU0FWRUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGV0IGJlc3RhbmQgJyVzJ1xuaXMgZ2V3aWp6aWdkXG5cbiBcCldpbHQgdSBkZSB3aWp6aWdpbmdlbiBvcHNsYWFuPyIKU1RSSU5HX05PVEZPVU5ELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycga2FuIG5pZXQgd29yZGVuIGdldm9uZGVuLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9udm9sZG9lbmRlIGdlaGV1Z2VuLiBcClxuU2x1aXQgZWVuIG9mIG1lZXIgYXBwbGljYXRpZXMgb20gZGUgaG9ldmVlbGhlaWRcbmJlc2NoaWtiYWFyIGdlaGV1Z2VuIHRlIHZlcmdyb3Rlbi4iCn0K