LyoKICogQ29weXJpZ2h0IDE5OTggSnVlcmdlbiBTY2htaWVkCiAqIENvcHlyaWdodCAyMDAzLTIwMDQgUHVvdGkKICogQ29weXJpZ2h0IDIwMDYgQW50b25pbyBDb2RhenppCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfSVRBTElBTiwgU1VCTEFOR19ORVVUUkFMCgpNRU5VXzAwMSBNRU5VIERJU0NBUkRBQkxFCkJFR0lOCglNRU5VSVRFTSAiSWNvbmUgJkdyYW5kaSIsCUZDSURNX1NIVklFV19CSUdJQ09OCglNRU5VSVRFTSAiSWNvbmUgJlBpY2NvbGUiLAlGQ0lETV9TSFZJRVdfU01BTExJQ09OCglNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJTUVOVUlURU0gIiZEZXR0YWdsaSIsCQlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwpFTkQKCi8qCiBzaGVsbHZpZXcgYmFja2dyb3VuZCBtZW51CiovCk1FTlVfMDAyIE1FTlUgRElTQ0FSREFCTEUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJICBQT1BVUCAiJlZpc3VhbGl6emEiCgkgIEJFR0lOCgkgICAgTUVOVUlURU0gIkljb25lICZHcmFuZGkiLAlGQ0lETV9TSFZJRVdfQklHSUNPTgoJICAgIE1FTlVJVEVNICJJY29uZSAmUGljY29sZSIsCUZDSURNX1NIVklFV19TTUFMTElDT04KCSAgICBNRU5VSVRFTSAiJkxpc3RhIiwJCUZDSURNX1NIVklFV19MSVNUVklFVwoJICAgIE1FTlVJVEVNICImRGV0dGFnbGkiLAlGQ0lETV9TSFZJRVdfUkVQT1JUVklFVwoJICBFTkQKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICJEaXNwb25pICZJY29uZSIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiUGVyICZOb21lIiwJMHgzMAkvKiBjb2x1bW4gMCAqLwoJICAgIE1FTlVJVEVNICJQZXIgJlRpcG8iLAkweDMyCS8qIGNvbHVtbiAyICovCgkgICAgTUVOVUlURU0gIlBlciBEaSZtZW5zaW9uZSIsCTB4MzEJLyogLi4uICovCgkgICAgTUVOVUlURU0gIlBlciAmRGF0YSIsCTB4MzMKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgICBNRU5VSVRFTSAiJkRpc3BvbmkgQXV0b21hdGljYW1lbnRlIiwJRkNJRE1fU0hWSUVXX0FVVE9BUlJBTkdFCgkgIEVORAoJICBNRU5VSVRFTSAiQWxsaW5lYSBJY29uZSIsCUZDSURNX1NIVklFV19TTkFQVE9HUklECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQWdnaW9ybmEiLAkJRkNJRE1fU0hWSUVXX1JFRlJFU0gKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIE1FTlVJVEVNICJJbmNvbGxhIiwJCUZDSURNX1NIVklFV19JTlNFUlQKCSAgTUVOVUlURU0gIkNyZWEgQ29sbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX0lOU0VSVExJTksKCSAgTUVOVUlURU0gU0VQQVJBVE9SCgkgIFBPUFVQICJOdW92byIKCSAgQkVHSU4KCSAgICBNRU5VSVRFTSAiTnVvdmEgJkNhcnRlbGxhIiwJRkNJRE1fU0hWSUVXX05FV0ZPTERFUgoJICAgIE1FTlVJVEVNICJOdW92byBDbyZsbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX05FV0xJTksKCSAgICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgRU5ECgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiUHJvcHJpZXTgIiwJRkNJRE1fU0hWSUVXX1BST1BFUlRJRVMKCUVORApFTkQKCi8qCiBzaGVsbHZpZXcgaXRlbSBtZW51CiovCk1FTlVfU0hWX0ZJTEUgTUVOVSBESVNDQVJEQUJMRQpCRUdJTgoJUE9QVVAgIiIKCUJFR0lOCgkgIE1FTlVJVEVNICImU2VsZWN0IgkJRkNJRE1fU0hWSUVXX09QRU4KCSAgTUVOVUlURU0gIkUmc3Bsb3JhIiwJCUZDSURNX1NIVklFV19FWFBMT1JFCgkgIE1FTlVJVEVNICImQXByaSIsCQlGQ0lETV9TSFZJRVdfT1BFTgoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIiZUYWdsaWEiLAkJRkNJRE1fU0hWSUVXX0NVVAoJICBNRU5VSVRFTSAiJkNvcGlhIiwJCUZDSURNX1NIVklFV19DT1BZCgkgIE1FTlVJVEVNIFNFUEFSQVRPUgoJICBNRU5VSVRFTSAiQ3JlYSBDbyZsbGVnYW1lbnRvIiwJRkNJRE1fU0hWSUVXX0NSRUFURUxJTksKCSAgTUVOVUlURU0gIiZDYW5jZWxsYSIsCQlGQ0lETV9TSFZJRVdfREVMRVRFCgkgIE1FTlVJVEVNICImUmlub21pbmEiLAkJRkNJRE1fU0hWSUVXX1JFTkFNRQoJICBNRU5VSVRFTSBTRVBBUkFUT1IKCSAgTUVOVUlURU0gIiZQcm9wcmlldOAiLAlGQ0lETV9TSFZJRVdfUFJPUEVSVElFUwoJRU5ECkVORAoKU0hCUlNGT1JGT0xERVJfTVNHQk9YIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDE1LCA0MCwgMTg4LCAxOTIKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgRFNfTU9EQUxGUkFNRSB8IERTX1NFVEZPTlQgfCBEU18zRExPT0sKQ0FQVElPTiAiU2ZvZ2xpYSBDYXJ0ZWxsYSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CiBERUZQVVNIQlVUVE9OICJPSyIsIDEsIDgwLCAxNzYsIDUwLCAxMiwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiQW5udWxsYSIsIDIsIDEzNCwgMTc2LCA1MCwgMTIsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogTFRFWFQgIiIsIElERF9USVRMRSwgNCwgNCwgMTgwLCAxMgogTFRFWFQgIiIsIElERF9TVEFUVVMsIDQsIDI1LCAxODAsIDEyCiBDT05UUk9MICIiLCBJRERfVFJFRVZJRVcsICJTeXNUcmVlVmlldzMyIiwKIAlUVlNfSEFTQlVUVE9OUyB8IFRWU19IQVNMSU5FUyB8IFRWU19MSU5FU0FUUk9PVCB8CglXU19CT1JERVIgfCBXU19UQUJTVE9QLAoJNCwgNDAsIDE4MCwgMTIwCn0KClNIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAxNSwgNDAsIDIxMCwgMTUyClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJJbmZvcm1hemlvbmkgc3UgJXMiCkZPTlQgMTAsICJNUyBTaGVsbCBEbGciCnsKIERFRlBVU0hCVVRUT04gIk9LIiwgSURPSywgMTUzLCAxMzMsIDUwLCAxMiwgV1NfVEFCU1RPUAogTElTVEJPWCA5OSwgOCwgNjUsIDEzNywgODIsIExCU19OT1RJRlkgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCiBJQ09OICIiLCAxMDg4LCAxMCwgMTAsIDE0LCAxNgogTFRFWFQgIiIsIDEwMCwgMzAsIDEwLCAxMzcsIDEwCiBMVEVYVCAiIiwgMTAxLCAzMCwgMjIsIDEzNywgMTAKIExURVhUICJXaW5lIOggZGlzcG9uaWJpbGUgZ3JhemllIGE6IiwgOTgsIDgsIDU1LCAxMzcsIDEwCn0KClNIRUxMX1JVTl9ETEcgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMCwgMCwgMjI3LCA5NQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAiIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCnsKIElDT04gIiIsIDEyMjk3LCA3LCAxMSwgMTgsIDIwLCBXU19WSVNJQkxFCiBMVEVYVCAiRGlnaXRhcmUgaWwgbm9tZSBkZWwgcHJvZ3JhbW1hLCBkZWxsYSBjYXJ0ZWxsYSwgZGVsIGRvY3VtZW50byBvIGRlbGxhIHJpc29yc2EgaW50ZXJuZXQsIGUgV2luZSBsYSBhcHJpcuAuIiwgMTIyODksIDM2LCAxMSwgMTgyLCAxOAogTFRFWFQgIiZBcHJpOiIsIDEyMzA1LCA3LCAzOSwgMjQsIDEwCiBDT05UUk9MICIiLCAxMjI5OCwgIkNPTUJPQk9YIiwgV1NfVEFCU1RPUCB8IFdTX0dST1VQIHwgV1NfVlNDUk9MTCB8IFdTX1ZJU0lCTEUgfCBDQlNfRElTQUJMRU5PU0NST0xMIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX0RST1BET1dOLCAzNiwgMzcsIDE4MywgMTAwCiBERUZQVVNIQlVUVE9OICJPSyIsIElET0ssIDYyLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCiBQVVNIQlVUVE9OICJBbm51bGxhIiwgSURDQU5DRUwsIDExNiwgNjMsIDUwLCAxNCwgV1NfVEFCU1RPUAogUFVTSEJVVFRPTiAiRSZzcGxvcmEuLi4iLCAxMjI4OCwgMTcwLCA2MywgNTAsIDE0LCBXU19UQUJTVE9QCn0KClNUUklOR1RBQkxFCnsKCS8qCWNvbHVtbnMgaW4gdGhlIHNoZWxsdmlldwkqLwoJSURTX1NIVl9DT0xVTU4xCQkiRmlsZSIKCUlEU19TSFZfQ09MVU1OMgkJIkRpbWVuc2lvbmUiCglJRFNfU0hWX0NPTFVNTjMJCSJUaXBvIgoJSURTX1NIVl9DT0xVTU40CQkiTW9kaWZpY2F0byIKCUlEU19TSFZfQ09MVU1ONQkJIkF0dHJpYnV0aSIKCUlEU19TSFZfQ09MVU1ONgkJIlNwYXppbyIKCUlEU19TSFZfQ09MVU1ONwkJIlNwYXppbyBkaXNwb25pYmlsZSIKCUlEU19TSFZfQ09MVU1OOAkJIk5vbWUiCglJRFNfU0hWX0NPTFVNTjkJCSJDb21tZW50aSIKCgkvKiBzcGVjaWFsIGZvbGRlciAqLwoJSURTX0RFU0tUT1AJCSJEZXNrdG9wIgoJSURTX01ZQ09NUFVURVIJCSJSaXNvcnNlIGRlbCBDb21wdXRlciIKCgkvKiAgY29udGV4dCBtZW51cyAgKi8KCUlEU19WSUVXX0xBUkdFCQkiSWNvbmUgJkdyYW5kaSIKCUlEU19WSUVXX1NNQUxMCQkiSWNvbmUgJlBpY2NvbGUiCglJRFNfVklFV19MSVNUCQkiJkxpc3RhIgoJSURTX1ZJRVdfREVUQUlMUwkiJkRldHRhZ2xpIgoJSURTX1NFTEVDVAkJIlNlbGV6aW9uZSIKCUlEU19PUEVOCQkiQXByaSIKCglJRFNfQ1JFQVRFRk9MREVSX0RFTklFRCAiSW1wb3NzaWJpbGUgY3JlYXJlIGxhIGNhcnRlbGxhOiBBY2Nlc3NvIG5lZ2F0by4iCglJRFNfQ1JFQVRFRk9MREVSX0NBUFRJT04gIkVycm9yZSBkdXJhbnRlIGxhIGNyZWF6aW9uZSBkZWxsYSBjYXJ0ZWxsYSIKCUlEU19ERUxFVEVJVEVNX0NBUFRJT04gIkNvbmZlcm1hcmUgbGEgY2FuY2VsbGF6aW9uZSBkZWwgZmlsZSIKCUlEU19ERUxFVEVGT0xERVJfQ0FQVElPTiAiQ29uZmVybWFyZSBsYSBjYW5jZWxsYXppb25lIGRlbGxhIGNhcnRlbGxhIgoJSURTX0RFTEVURUlURU1fVEVYVCAiU2VpIHNpY3VybyBkaSB2b2xlciBjYW5jZWxsYXJlICclMSc/IgoJSURTX0RFTEVURU1VTFRJUExFX1RFWFQgIlNlaSBzaWN1cm8gZGkgdm9sZXIgY2FuY2VsbGFyZSBxdWVzdGkgJTEgZWxlbWVudGk/IgoJSURTX09WRVJXUklURUZJTEVfVEVYVCAiVGhpcyBmb2xkZXIgYWxyZWFkeSBjb250YWlucyBhIGZpbGUgY2FsbGVkICclMScuXG5cbkRvIHlvdSB3YW50IHRvIHJlcGxhY2UgaXQ/IgoJSURTX09WRVJXUklURUZJTEVfQ0FQVElPTiAiQ29uZmVybWFyZSBsYSBzb3ZyYXNjcml6aW9uZSBkZWwgRmlsZSIKCUlEU19PVkVSV1JJVEVGT0xERVJfVEVYVCAiVGhpcyBmb2xkZXIgYWxyZWFkeSBjb250YWlucyBhIGZvbGRlciBuYW1lZCAnJTEnLlxuXG4iXAoJICAgICJJZiB0aGUgZmlsZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGZvbGRlciBoYXZlIHRoZSBzYW1lIG5hbWVzIGFzIGZpbGVzIGluIHRoZVxuIlwKCSAgICAic2VsZWN0ZWQgZm9sZGVyIHRoZXkgd2lsbCBiZSByZXBsYWNlZC4gRG8geW91IHN0aWxsIHdhbnQgdG8gbW92ZSBvciBjb3B5XG4iXAoJICAgICJ0aGUgZm9sZGVyPyIKCgkvKiBtZXNzYWdlIGJveCBzdHJpbmdzICovCiAgICAgICBJRFNfUkVTVEFSVF9USVRMRSAgICAgICAiUmlhdnZpYSIKICAgICAgIElEU19SRVNUQVJUX1BST01QVCAgICAgICJWdW9pIHNpbXVsYXJlIHVuIHJpYXZ2aW8gZGkgV2luZG93cz8iCiAgICAgICBJRFNfU0hVVERPV05fVElUTEUgICAgICAiVGVybWluYSBzZXNzaW9uZSIKICAgICAgIElEU19TSFVURE9XTl9QUk9NUFQgICAgICJWdW9pIHRlcm1pbmFyZSBsYSBzZXNzaW9uZSBkaSBXaW5lPyIKCgkvKiBzaGVsbCBmb2xkZXIgcGF0aCBkZWZhdWx0IHZhbHVlcyAqLwoJSURTX1NUQVJUTUVOVSAgICAgICAgICAgICAgICJTdGFydCBNZW51IgoJSURTX1BST0dSQU1TICAgICAgICAgICAgICAgICJTdGFydCBNZW51XFxQcm9ncmFtbWkiCglJRFNfU1RBUlRVUCAgICAgICAgICAgICAgICAgIlN0YXJ0IE1lbnVcXFByb2dyYW1taVxcU3RhcnRVcCIKCUlEU19BRE1JTlRPT0xTICAgICAgICAgICAgICAiU3RhcnQgTWVudVxcUHJvZ3JhbW1pXFxBZG1pbmlzdHJhdGl2ZSBUb29scyIKCUlEU19JTlRFUk5FVF9DQUNIRSAgICAgICAgICAiU2V0dGFnZ2kgTG9jYWxpXFxUZW1wb3JhcnkgSW50ZXJuZXQgRmlsZXMiCglJRFNfSElTVE9SWSAgICAgICAgICAgICAgICAgIlNldHRhZ2dpIExvY2FsaVxcQ3Jvbm9sb2dpYSIKCUlEU19MT0NBTF9BUFBEQVRBICAgICAgICAgICAiU2V0dGFnZ2kgTG9jYWxpXFxBcHBsaWNhemlvbmkiCglJRFNfQ0RCVVJOX0FSRUEgICAgICAgICAgICAgIlNldHRhZ2dpIExvY2FsaVxcQXBwbGljYXppb25pXFxNaWNyb3NvZnRcXENEIEJ1cm5pbmciCglJRFNfUFJPR1JBTV9GSUxFUyAgICAgICAgICAgIlByb2dyYW1taSIKCUlEU19QUk9HUkFNX0ZJTEVTX0NPTU1PTiAgICAiUHJvZ3JhbW1pXFxDb21tb24gRmlsZXMiCglJRFNfQ09NTU9OX0RPQ1VNRU5UUyAgICAgICAgIkRvY3VtZW50aSIKCUlEU19DT01NT05fTVVTSUMgICAgICAgICAgICAiRG9jdW1lbnRpXFxNdXNpY2EiCglJRFNfQ09NTU9OX1BJQ1RVUkVTICAgICAgICAgIkRvY3VtZW50aVxcSW1tYWdpbmkiCglJRFNfQ09NTU9OX1ZJREVPICAgICAgICAgICAgIkRvY3VtZW50aVxcVmlkZW8iCglJRFNfUEVSU09OQUwgICAgICAgICAgICAgICAgIk1pZWkgRG9jdW1lbnRpIgoJSURTX01ZTVVTSUMgICAgICAgICAgICAgICAgICJNdXNpY2EiCglJRFNfTVlWSURFTyAgICAgICAgICAgICAgICAgIlZpZGVvIgoJSURTX01ZUElDVFVSRVMgICAgICAgICAgICAgICJJbW1hZ2luaSIKCUlEU19GQVZPUklURVMgICAgICAgICAgICAgICAiRmF2b3JpdGkiCglJRFNfUkVDRU5UICAgICAgICAgICAgICAgICAgIlJlY2VudGkiCglJRFNfU0VORFRPICAgICAgICAgICAgICAgICAgIlNlbmRUbyIKCUlEU19ERVNLVE9QRElSRUNUT1JZICAgICAgICAiRGVza3RvcCIKCUlEU19ORVRIT09EICAgICAgICAgICAgICAgICAiTmV0SG9vZCIKCUlEU19URU1QTEFURVMgICAgICAgICAgICAgICAiTW9kZWxsaSIKCUlEU19BUFBEQVRBICAgICAgICAgICAgICAgICAiQXBwbGljYXppb25pIgoJSURTX1BSSU5USE9PRCAgICAgICAgICAgICAgICJQcmludEhvb2QiCglJRFNfQ09PS0lFUyAgICAgICAgICAgICAgICAgIkNvb2tpZXMiCgoJSURTX05FV0ZPTERFUgkJIk5ldyBGb2xkZXIiCn0K