LyoKICogQ29weXJpZ2h0IDIwMDAgQXJpYyBTdGV3YXJ0CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfQ0hJTkVTRSwgU1VCTEFOR19DSElORVNFX1NJTVBMSUZJRUQKClNZU01FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCnsKIE1FTlVJVEVNICK71ri0KCZSKSIsIDYxNzI4IAogTUVOVUlURU0gItLGtq8oJk0pIiwgNjE0NTYgCiBNRU5VSVRFTSAitPPQoSgmUykiLCA2MTQ0MCAKIE1FTlVJVEVNICLX7tChu68oJk4pIiwgNjE0NzIgCiBNRU5VSVRFTSAi1+6087uvKCZYKSIsIDYxNDg4IAogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAiudix1SgmTilcdEFsdC1GNCIsIDYxNTM2IAogTUVOVUlURU0gU0VQQVJBVE9SCiBNRU5VSVRFTSAix9C7u7W9KCZTKS4uLlx0Q3RybC1Fc2MiLCA2MTc0NCAKfQoKRURJVE1FTlUgTUVOVSBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFCnsKCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICKzt8/7KCZVKSIsIEVNX1VORE8gCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIrz0x9AoJlQpIiwgV01fQ1VUCgkJTUVOVUlURU0gIri01sYoJkMpIiwgV01fQ09QWQoJCU1FTlVJVEVNICLVs8z5KCZQKSIsIFdNX1BBU1RFIAoJCU1FTlVJVEVNICLJvrP9KCZEKSIsIFdNX0NMRUFSIAoJCU1FTlVJVEVNIFNFUEFSQVRPUgoJCU1FTlVJVEVNICLIq9GhKCZBKSIsIEVNX1NFVFNFTCAKCUVORAp9CgpNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4ClNUWUxFIERTX1NZU01PREFMIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkJFR0lOCiAgICAgICAgSUNPTiAiIiwgMTA4OCwgOCwgMjAsIDE2LCAxNiwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFCiAgICAgICAgTFRFWFQgIiIsIDEwMCwgMzIsIDQsIDE3NiwgNDgsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX0dST1VQCiAgICAgICAgUFVTSEJVVFRPTiAiyLe2qCgmTykiLCAxLCAxNiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCAKICAgICAgICBQVVNIQlVUVE9OICLIoc/7KCZDKSIsIDIsIDY0LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gItbQ1rkoJkEpIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gItbYytQoJlIpIiwgNCwgMTYwLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gIrr2wtQoJkkpIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gIsrHKCZZKSIsIDYsIDI1NiwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCAKICAgICAgICBQVVNIQlVUVE9OICK38SgmTikiLCA3LCAzMDQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AgCkVORAoKTURJX01PUkVXSU5ET1dTIERJQUxPRyBGSVhFRCBJTVBVUkUgMjAsIDIwLCAyMzIsIDEyMgpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICLRodTxtLC/2iIgCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICAgIExJU1RCT1ggICAgICAgICBNRElfSURDX0xJU1RCT1gsIDUsIDcsIDIyMiwgOTAsIFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIC8qIGRlZmluZWQgaW4gbWRpLmggKi8KICAgIERFRlBVU0hCVVRUT04gICAiyLe2qCIsIElET0ssIDc1LCAxMDAsIDM1LCAxNCAKICAgIFBVU0hCVVRUT04gICAgICAiyKHP+yIsIElEQ0FOQ0VMLCAxMjAsIDEwMCwgMzUsIDE0ICAKRU5ECgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBNRElfSURTX01PUkVXSU5ET1dTICAiuPy24LSwv9ooJk0pLi4uIiAvKiBkZWZpbmVkIGluIG1kaS5oICovIAp9CgpMQU5HVUFHRSBMQU5HX0NISU5FU0UsIFNVQkxBTkdfQ0hJTkVTRV9UUkFESVRJT05BTAoKU1lTTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKewogTUVOVUlURU0gIrvYj80oJlIpIiwgNjE3MjggCiBNRU5VSVRFTSAi0saE0ygmTSkiLCA2MTQ1NiAKIE1FTlVJVEVNICK089ChKCZTKSIsIDYxNDQwIAogTUVOVUlURU0gItfu0KG7rygmTikiLCA2MTQ3MiAKIE1FTlVJVEVNICLX7rTzu68oJlgpIiwgNjE0ODggCiBNRU5VSVRFTSBTRVBBUkFUT1IKIE1FTlVJVEVNICLqUOldKCZOKVx0QWx0LUY0IiwgNjE1MzYgCiBNRU5VSVRFTSBTRVBBUkFUT1IKIE1FTlVJVEVNICLH0JNRtb0oJlMpLi4uXHRDdHJsLUVzYyIsIDYxNzQ0IAp9CgpFRElUTUVOVSBNRU5VIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUKewoJUE9QVVAgIiIKCUJFR0lOCgkJTUVOVUlURU0gIrvYj80oJlUpIiwgRU1fVU5ETyAKCQlNRU5VSVRFTSBTRVBBUkFUT1IKCQlNRU5VSVRFTSAivPTPwigmVCkiLCBXTV9DVVQKCQlNRU5VSVRFTSAij83RdSgmQykiLCBXTV9DT1BZCgkJTUVOVUlURU0gItlOyc8oJlApIiwgV01fUEFTVEUgCgkJTUVOVUlURU0gIoRos/0oJkQpIiwgV01fQ0xFQVIgCgkJTUVOVUlURU0gU0VQQVJBVE9SCgkJTUVOVUlURU0gIsir33goJkEpIiwgRU1fU0VUU0VMIAoJRU5ECn0KCk1TR0JPWCBESUFMT0cgMTAwLCA4MCwgMjE2LCAxNjgKU1RZTEUgRFNfU1lTTU9EQUwgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQkVHSU4KICAgICAgICBJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKICAgICAgICBMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKICAgICAgICBQVVNIQlVUVE9OICK0X7aoKCZPKSIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gIsihz/soJkMpIiwgMiwgNjQsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AgCiAgICAgICAgUFVTSEJVVFRPTiAi1tDWuSgmQSkiLCAzLCAxMTIsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AgCiAgICAgICAgUFVTSEJVVFRPTiAi1tjUhygmUikiLCA0LCAxNjAsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AgCiAgICAgICAgUFVTSEJVVFRPTiAiuvbC1CgmSSkiLCA1LCAyMDgsIDU2LCA0MCwgMTQsIFdTX0NISUxEIHwgV1NfVklTSUJMRSB8IFdTX1RBQlNUT1AgCiAgICAgICAgUFVTSEJVVFRPTiAiyscoJlkpIiwgNiwgMjU2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QIAogICAgICAgIFBVU0hCVVRUT04gIrfxKCZOKSIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUCAKRU5ECgpNRElfTU9SRVdJTkRPV1MgRElBTE9HIEZJWEVEIElNUFVSRSAyMCwgMjAsIDIzMiwgMTIyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIt94k/HSlbSwIiAKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgTElTVEJPWCAgICAgICAgIE1ESV9JRENfTElTVEJPWCwgNSwgNywgMjIyLCA5MCwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgLyogZGVmaW5lZCBpbiBtZGkuaCAqLwogICAgREVGUFVTSEJVVFRPTiAgICK0X7aoIiwgSURPSywgNzUsIDEwMCwgMzUsIDE0IAogICAgUFVTSEJVVFRPTiAgICAgICLIoc/7IiwgSURDQU5DRUwsIDEyMCwgMTAwLCAzNSwgMTQgIApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIE1ESV9JRFNfTU9SRVdJTkRPV1MgICK4/Lbg0pW0sCgmTSkuLi4iIC8qIGRlZmluZWQgaW4gbWRpLmggKi8gCn0K