LyoKICogd2luZWNvbnNvbGUgKFNwYW5pc2ggcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMjAwNCBKb3PpIE1hbnVlbCBGZXJyZXIgT3J0aXoKICogQ29weXJpZ2h0IDIwMDggSmFpbWUgUmF2ZSBUb3JyZXMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFCkJFR0lOCklEU19FRElULAkJIiZFZGl0YXIiCklEU19ERUZBVUxULAkJIlBvciAmZGVmZWN0byIKSURTX1BST1BFUlRJRVMsCQkiJlByb3BpZWRhZGVzIgpJRFNfTUFSSywJCSImTWFyY2FyIgpJRFNfQ09QWSwJCSImQ29waWFyIgpJRFNfUEFTVEUsCQkiJlBlZ2FyIgpJRFNfU0VMRUNUQUxMLAkJIiZTZWxlY2Npb25hciB0b2RvIgpJRFNfU0NST0xMLAkJIlNjJnJvbGwiCklEU19TRUFSQ0gsCQkiJkJ1c2NhciIKSURTX0ZOVF9ESVNQTEFZLAkiQ2FkYSBjYXJhY3RlciB0aWVuZSAlbGQgcO14ZWxlcyBkZSBhbmNobyBwb3IgJWxkIHDteGVsZXMgZGUgYWx0byIKSURTX0ZOVF9QUkVWSUVXXzEsCSJFc3RvIGVzIHVuYSBwcnVlYmEiCklEU19GTlRfUFJFVklFV18yLAkiIgpJRFNfRExHX1RJVF9ERUZBVUxULCAgICAiQ29uZmlndXJhY2nzbiAtIFZhbG9yZXMgcG9yIGRlZmVjdG8iCklEU19ETEdfVElUX0NVUlJFTlQsICAgICJDb25maWd1cmFjafNuIC0gVmFsb3JlcyBhY3R1YWxlcyIKSURTX0RMR19USVRfRVJST1IsCSJFcnJvciBkZSBjb25maWd1cmFjafNuIgpJRFNfRExHX0VSUl9TQldJTlNJWkUsCSJFbCB0YW1h8W8gZGVsIGJ1ZmZlciBkZSBsYSBwYW50YWxsYSBkZWJlIHNlciBtYXlvciBvIGlndWFsIHF1ZSBlbCBkZSBsYSB2ZW50YW5hIgoKSURTX0NNRF9JTlZBTElEX0VWRU5UX0lEICAgIndpbmVjb25zb2xlOiBObyBzZSBwdWRvIHByb2Nlc2FyIGVsIGlkIGRlbCBldmVudG9cbiIKSURTX0NNRF9JTlZBTElEX0JBQ0tFTkQgICAgIndpbmVjb25zb2xlOiBGaW5hbCBpbnZhbGlkb1xuIgpJRFNfQ01EX0lOVkFMSURfT1BUSU9OICAgICAid2luZWNvbnNvbGU6IExpbmVhIGRlIGNvbWFuZG8gbm8gcmVjb25vY2lkYVxuIgpJRFNfQ01EX0FCT1VUICAgICAgICAgICAgICAiSW5pY2lhIHVuIHByb2dyYW1hIGVuIHVuYSBjb25zb2xhIGRlIFdpbmVcbiIKSURTX0NNRF9MQVVOQ0hfRkFJTEVEICAgICAgIndpbmVjb25zb2xlOiBFbCBhcnJhbnF1ZSBkZWwgcHJvZ3JhbWEgJXMgZmFsbPMuXG4iXAogICAgICAgICAgICAgICAgICAgICAgICAgICAiRWwgY29tYW5kbyBlcyBpbnbhbGlkby5cbiIKCklEU19VU0FHRV9IRUFERVIgICAgICAgICAgICJcblVzbzpcbiAgd2luZWNvbnNvbGUgW29wY2lvbmVzXSA8Y29tYW5kbz5cblxuT3BjaW9uZXM6XG4iCklEU19VU0FHRV9CQUNLRU5EICAgICAgICAgICIgIC0tYmFja2VuZD17dXNlcnxjdXJzZXN9ICBTZWxlY2Npb25hbmRvIHVzZXIgZ2VuZXJhcuEgdW5hIG51ZXZhIHZlbnRhbmEsIGN1cnNlc1xuIlwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnRhcmEgY29uZmlndXJhciBlbCB0ZXJtaW5hbCBhY3R1YWwgY29tbyB1bmEgY29uc29sYSBkZSBXaW5lXG4iCklEU19VU0FHRV9DT01NQU5EICAgICAgICAgICIgIDxjb21hbmRvPiAgICAgICAgICAgICAgICAgRUwgcHJvZ3JhbWEgZGUgV2luZSBxdWUgc2UgaW5pY2lhcuEgZW4gbGEgY29uc29sYVxuIgpJRFNfVVNBR0VfRk9PVEVSICAgICAgICAgICAiXG5FamVtcGxvOlxuICB3aW5lY29uc29sZSBjbWRcbkluaWNpYSBlbCBzaW1ib2xvIGRlbCBzaXN0ZW1hIGRlIFdpbmUgZW4gdW5hIGNvbnNvbGEgV2luZVxuXG4iCkVORAoKSUREX09QVElPTiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDE0MCwgMTA1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIiBPcGNpb25lcyAiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJR1JPVVBCT1ggIlRhbmHxbyBkZWwgY3Vyc29yIiwgLTEsIDEwLCAxMSwgNjAsIDQ0LCBCU19HUk9VUEJPWAoJQVVUT1JBRElPQlVUVE9OICImUGVxdWXxbyIsIElEQ19PUFRfQ1VSU09SX1NNQUxMLCAxNCwgMjMsIDQ0LCAxMCwgV1NfVEFCU1RPUAoJQVVUT1JBRElPQlVUVE9OICImTWVkaWFubyIsIElEQ19PUFRfQ1VSU09SX01FRElVTSwgMTQsIDMzLCA0NCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9SQURJT0JVVFRPTiAiJkdyYW5kZSIsIElEQ19PUFRfQ1VSU09SX0xBUkdFLCAxNCwgNDMsIDQ0LCAxMCwgV1NfVEFCU1RPUAoKCUdST1VQQk9YICJDb250cm9sIiwgLTEsIDc1LCAxMSwgMTI1LCA0NCwgQlNfR1JPVVBCT1gKCUxURVhUICJNZW76IGVtZXJnZW50ZSIsIC0xLCA3OSwgMjMsIDQwLCAxMAoJQVVUT0NIRUNLQk9YICImQ29udHJvbCIsIElEQ19PUFRfQ09ORl9DVFJMLCAxMjksIDIzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUFVVE9DSEVDS0JPWCAiUyZoaWZ0IiwgSURDX09QVF9DT05GX1NISUZULCAxMjksIDMzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCUxURVhUICJFZGljafNuIHLhcGlkYSIsIC0xLCA3OSwgNDMsIDUwLCAxMAoJQVVUT0NIRUNLQk9YICImaGFiaWxpdGFyIiwgSURDX09QVF9RVUlDS19FRElULCAxMjksIDQzLCA2MCwgMTAsIFdTX1RBQlNUT1AKCglHUk9VUEJPWCAiSGlzdG9yaWFsIGRlIGNvbWFuZG9zIiwgLTEsIDEwLCA1NywgMTkwLCAzNSwgQlNfR1JPVVBCT1gKCUxURVhUICImTvptZXJvIGRlIGNvbWFuZG9zIHJlY29yZGFkb3MgOiIsIC0xLCAxNCwgNjcsIDc4LCAxOAoJRURJVFRFWFQgSURDX09QVF9ISVNUX1NJWkUsIDkyLCA2OSwgMzEsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19PUFRfSElTVF9TSVpFX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCUFVVE9DSEVDS0JPWCAiJkVsaW1pbmFyIGR1cGxpY2Fkb3MiLCBJRENfT1BUX0hJU1RfTk9ET1VCTEUsIDEzMCwgNjcsIDUwLCAxOCwgV1NfVEFCU1RPUHxCU19NVUxUSUxJTkUKfQoKSUREX0ZPTlQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgRnVlbnRlICIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglMVEVYVCAiJkZ1ZW50ZSIsIC0xLCA1LCA1LCAyNCwgOAoJTElTVEJPWCBJRENfRk5UX0xJU1RfRk9OVCwgNSwgMTgsIDkwLCA0MiwgTEJTX1NPUlR8V1NfVlNDUk9MTAoJTFRFWFQgIiZDb2xvciIsIC0xLCAxMDAsIDUsIDUwLCA4CglDT05UUk9MICIiLCBJRENfRk5UX0NPTE9SX0ZHLCAiV2luZUNvbkNvbG9yUHJldmlldyIsIDBMLCAxMDAsIDE4LCA0OCwgMTYKCUNPTlRST0wgIiIsIElEQ19GTlRfQ09MT1JfQkssICJXaW5lQ29uQ29sb3JQcmV2aWV3IiwgMEwsIDEwMCwgNDAsIDQ4LCAxNgoJTFRFWFQgIiZUYW1h8W8iLCAtMSwgMTU4LCA1LCA0MCwgOAoJTElTVEJPWCBJRENfRk5UX0xJU1RfU0laRSwgMTU4LCAxOCwgNDAsIDYwLCBXU19WU0NST0xMCglDT05UUk9MICIiLCBJRENfRk5UX1BSRVZJRVcsICJXaW5lQ29uRm9udFByZXZpZXciLCAwTCwgNSwgNjAsIDEwOSwgNDAKCUxURVhUICIiLCBJRENfRk5UX0ZPTlRfSU5GTywgMTI4LCA3NiwgODAsIDE4Cn0KCklERF9DT05GSUcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAxNDAsIDEwNQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICIgQ29uZmlndXJhY2nzbiAiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJR1JPVVBCT1ggIlpvbmEgZGUgYnVmZmVyIiwgLTEsIDEwLCAxMSwgMTAwLCA0MiwgQlNfR1JPVVBCT1gKCUxURVhUICImQW5jaHVyYSA6IiwgLTEsIDE0LCAyNSwgNTQsIDkKCUVESVRURVhUIElEQ19DTkZfU0JfV0lEVEgsIDY4LCAyMywgMzYsIDEyLCBXU19UQUJTVE9QfFdTX0JPUkRFUnxFU19OVU1CRVIKCUNPTlRST0wgIiIsIElEQ19DTkZfU0JfV0lEVEhfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAoJTFRFWFQgIiZBbHR1cmEgOiIsIC0xLCAxNCwgMzksIDU0LCA5CglFRElUVEVYVCBJRENfQ05GX1NCX0hFSUdIVCwgNjgsIDM3LCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgoJQ09OVFJPTCAiIiwgSURDX0NORl9TQl9IRUlHSFRfVUQsICJtc2N0bHNfdXBkb3duMzIiLCBVRFNfU0VUQlVERFlJTlR8VURTX0FMSUdOUklHSFR8VURTX0FVVE9CVUREWXxVRFNfQVJST1dLRVlTfFVEU19OT1RIT1VTQU5EUywgMCwgMCwgMCwgMAoKCUdST1VQQk9YICJUYW1h8W8gZGUgdmVudGFuYSIsIC0xLCAxMCwgNTUsIDEwMCwgNDIKCUxURVhUICJBJm5jaHVyYSA6IiwgLTEsIDE0LCA2OSwgNTQsIDkKCUVESVRURVhUIElEQ19DTkZfV0lOX1dJRFRILCA2OCwgNjcsIDM2LCAxMiwgV1NfVEFCU1RPUHxXU19CT1JERVJ8RVNfTlVNQkVSCglDT05UUk9MICIiLCBJRENfQ05GX1dJTl9XSURUSF9VRCwgIm1zY3Rsc191cGRvd24zMiIsIFVEU19TRVRCVUREWUlOVHxVRFNfQUxJR05SSUdIVHxVRFNfQVVUT0JVRERZfFVEU19BUlJPV0tFWVN8VURTX05PVEhPVVNBTkRTLCAwLCAwLCAwLCAwCglMVEVYVCAiQSZsdHVyYSA6IiwgLTEsIDE0LCA4MywgNTQsIDkKCUVESVRURVhUIElEQ19DTkZfV0lOX0hFSUdIVCwgNjgsIDgxLCAzNiwgMTIsIFdTX1RBQlNUT1B8V1NfQk9SREVSfEVTX05VTUJFUgoJQ09OVFJPTCAiIiwgSURDX0NORl9XSU5fSEVJR0hUX1VELCAibXNjdGxzX3VwZG93bjMyIiwgVURTX1NFVEJVRERZSU5UfFVEU19BTElHTlJJR0hUfFVEU19BVVRPQlVERFl8VURTX0FSUk9XS0VZU3xVRFNfTk9USE9VU0FORFMsIDAsIDAsIDAsIDAKCglHUk9VUEJPWCAiRmluIGRlbCBwcm9ncmFtYSIsIC0xLCAxMTUsIDExLCA4MCwgNDIsIEJTX0dST1VQQk9YCglBVVRPQ0hFQ0tCT1ggIiZDZXJyYXIgY29uc29sYSIsIElEQ19DTkZfQ0xPU0VfRVhJVCwgMTE5LCAyNSwgNzUsIDIwLCBXU19UQUJTVE9QCgoJR1JPVVBCT1ggIkVkaWNp824iLCAtMSwgMTE1LCA1NSwgODAsIDQyCglDT01CT0JPWCBJRENfQ05GX0VESVRJT05fTU9ERSwgMTE5LCA2OSwgNzUsIDIwLCBDQlNfRFJPUERPV05MSVNUfFdTX1ZTQ1JPTEx8V1NfVEFCU1RPUAp9CgpJRERfU0FWRV9TRVRUSU5HUyBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAyMCwgMjAsIDE0MCwgNjAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTgpDQVBUSU9OICJQYXLhbWV0cm9zIGRlIGNvbnNvbGEiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewoJR1JPVVBCT1ggIiIsIC0xLCAxMCwgMTAsIDEyMCwgMzEsIEJTX0dST1VQQk9YCglBVVRPUkFESU9CVVRUT04gIkd1YXJkYXIgZXN0YSBjb25maWd1cmFjafNuIHBhcmEgc2VzaW9uZXMgcG9zdGVyaW9yZXMiLCBJRENfU0FWX1NBVkUsIDE0LCAxNSwgMTEwLCAxMCwgV1NfVEFCU1RPUAoJQVVUT1JBRElPQlVUVE9OICJNb2RpZmljYXIgc/NsbyBsYSBzZXNp824gYWN0dWFsIiwgSURDX1NBVl9TRVNTSU9OLCAxNCwgMjcsIDExMCwgMTAsIFdTX1RBQlNUT1AKCglQVVNIQlVUVE9OICJBY2VwdGFyIiwgSURPSywgMjAsIDQ1LCAzNSwgMTIKCVBVU0hCVVRUT04gIkNhbmNlbGFyIiwgSURDQU5DRUwsIDY1LCA0NSwgMzUsIDEyCn0K