LyoKICogTm90ZXBhZAogKiBQb3J0dWd1ZXNlIExhbmd1YWdlIFN1cHBvcnQKICoKICogQ29weXJpZ2h0IDE5OTkgTWFyY2VsIEJhdXIgPGFsdmVzQGNvcnJlaW9uZXQuY29tLmJyPgogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDMgTWFyY2VsbyBEdWFydGUKICogQ29weXJpZ2h0IDIwMDQgQW3pcmljbyBKb3PpIE1lbG8KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0VfQlJBWklMSUFOCgpNQUlOX01FTlUgTUVOVQp7CiBQT1BVUCAiJkFycXVpdm8iIHsKICBNRU5VSVRFTSAiJk5vdm9cdEN0cmwrTiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIkEmYnJpci4uLlx0Q3RybCtPIiwJCUNNRF9PUEVOCiAgTUVOVUlURU0gIiZTYWx2YXJcdEN0cmwrUyIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJTYWx2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIuLi5cdEN0cmwrUCIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiQyZvbmZpZ3VyYXIgcOFnaW5hLi4uIiwJQ01EX1BBR0VfU0VUVVAKICBNRU5VSVRFTSAiQ29uZmlndXJhciBpJm1wcmVzc29yYS4uLiIsIENNRF9QUklOVEVSX1NFVFVQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNhaSZyIiwJCUNNRF9FWElUCiB9ClBPUFVQICImRWRpdGFyIiB7CiAgTUVOVUlURU0gIiZEZXNmYXplclx0Q3RybCtaIiwgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlJlY29ydGFyXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZDb3BpYXJcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkMmb2xhclx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIkUmeGNsdWlyXHREZWwiLAlDTURfREVMRVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIlNlbGVjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZGb250ZS4uLiIsICAgICAgICAgIENNRF9GT05UCiB9ClBPUFVQICImUGVzcXVpc2EiIHsKICBNRU5VSVRFTSAiJkxvY2FsaXphci4uLiIsCUNNRF9TRUFSQ0gKICBNRU5VSVRFTSAiTG9jYWxpemFyICZwcvN4aW1hXHRGMyIsCUNNRF9TRUFSQ0hfTkVYVAogfQpQT1BVUCAiJkFqdWRhIiB7CiAgTUVOVUlURU0gIiZDb250ZfpkbyIsCQlDTURfSEVMUF9DT05URU5UUwogIE1FTlVJVEVNICImUHJvY3VyYXIuLi4iLAlDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAiJkFqdWRhIG5hIGFqdWRhIiwJQ01EX0hFTFBfT05fSEVMUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIFBPUFVQICImSW5mb3JtYef1ZXMiIHsKICAgTUVOVUlURU0gIiZMaWNlbudhLi4uIiwJQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIiZTRU0gR0FSQU5USUEuLi4iLAlDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZTb2JyZSBvIFdpbmUuLi4iLAlDTURfQUJPVVRfV0lORQogIH0KIH0KfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImRmljaGVpcm8iIHsKICBNRU5VSVRFTSAiJk5vdm8uLi4iLAkJQ01EX05FVwogIE1FTlVJVEVNICJBJmJyaXIiLAkJQ01EX09QRU4KICBNRU5VSVRFTSAiJkdyYXZhciIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJHcmF2YXIgJmNvbW8uLi4iLAlDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImSW1wcmltaXIiLAkJQ01EX1BSSU5UCiAgTUVOVUlURU0gIkMmb25maWd1cmFyIHDhZ2luYS4uLiIsCUNNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIkNvbmZpZ3VyYXIgaSZtcHJlc3NvcmEuLi4iLCBDTURfUFJJTlRFUl9TRVRVUAogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICJTYWkmciIsCQlDTURfRVhJVAogfQpQT1BVUCAiJkVkaXRhciIgewogIE1FTlVJVEVNICImRGVzZmF6ZXJcdEN0cmwrWiIsIENNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZDb3J0YXJcdEN0cmwrWCIsCUNNRF9DVVQKICBNRU5VSVRFTSAiJkNvcGlhclx0Q3RybCtDIiwJQ01EX0NPUFkKICBNRU5VSVRFTSAiQyZvbGFyXHRDdHJsK1YiLAlDTURfUEFTVEUKICBNRU5VSVRFTSAiRSZ4Y2x1aXJcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiU2VsZWNjaW9uYXIgJnR1ZG8iLAlDTURfU0VMRUNUX0FMTAogIE1FTlVJVEVNICImRGF0YS9Ib3JhXHRGNSIsCUNNRF9USU1FX0RBVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlF1ZWJyYXIgYXV0b23hdGljYSBkZSBsaW5oYSIsCUNNRF9XUkFQCiAgTUVOVUlURU0gIiZUaXBvIGRlIExldHJhLi4uIiwgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIiZQZXNxdWlzYSIgewogIE1FTlVJVEVNICImTG9jYWxpemFyLi4uIiwJQ01EX1NFQVJDSAogIE1FTlVJVEVNICJMb2NhbGl6YXIgJnBy83hpbWFcdEYzIiwJQ01EX1NFQVJDSF9ORVhUCiB9ClBPUFVQICImQWp1ZGEiIHsKICBNRU5VSVRFTSAiJkNvbnRl+mRvIiwJCUNNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZQcm9jdXJhci4uLiIsCUNNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICImQWp1ZGEgbmEgYWp1ZGEiLAlDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIiZJbmZvcm1h5/Vlcy4uLiIgewogICBNRU5VSVRFTSAiJkxpY2Vu52EiLAkJQ01EX0xJQ0VOU0UKICAgTUVOVUlURU0gIiZTRU0gR0FSQU5USUEiLAlDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZBY2VyY2EgZG8gV2luZSIsCUNNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgoKLyogRGlhbG9nIGBQYWdlIHNldHVwJyAqLwoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX05FVVRSQUwKCkRJQUxPR19QQUdFU0VUVVAgRElBTE9HIDAsIDAsIDIyNSwgOTUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiQ29uZmlndXJhciBw4WdpbmEiCnsKTFRFWFQgICAgIiZDYWJl52FsaG86IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQxLCAgICAgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJlJvZGFw6ToiLCAgMHgxNDIsICAgMTAsIDI0LCA0MCwgMTUKRURJVFRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMsICAgICAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiJk1hcmdlbnM6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICImRXNxdWVyZGE6IiwgICAgICAgIDB4MTQ1LCAgIDIwLCA1NSwgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLCovICAgMHgxNDcsICAgICAgIDUwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZTdXBlcmlvcjoiLCAgICAgICAgIDB4MTQ4LCAgICAyMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLCovICAgIDB4MTRBLCAgICAgICAgNTAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiJkRpcmVpdGE6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsKi8gIDB4MTRELCAgICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZJbmZlcmlvcjoiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0JPVFRPTVZBTFVFLCovIDB4MTUwLCAgICAxMzAsIDczLCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKREVGUFVTSEJVVFRPTiAiT0siLCAgICAgICAgIElET0ssICAgICAgICAgICAgICAgICAgIDE4MCwgIDMsIDQwLCAxNSwgV1NfVEFCU1RPUApQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkFqdWRhIiwgICAgICAgSURIRUxQLCAgICAgICAgICAgICAgICAxODAsIDM5LCA0MCwgMTUsIFdTX1RBQlNUT1AKfQoKCkxBTkdVQUdFIExBTkdfUE9SVFVHVUVTRSwgU1VCTEFOR19QT1JUVUdVRVNFX0JSQVpJTElBTgoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewpTVFJJTkdfUEFHRVNFVFVQX0hFQURFUlZBTFVFLAkiJm4iICAgICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiUOFnaW5hICZzIiAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLAkJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLAkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLAkJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELAkJCQkJIk5vdGVwYWQiClNUUklOR19FUlJPUiwJCQkJCSJFUlJPIgpTVFJJTkdfV0FSTklORywJCQkJCSJBVklTTyIKU1RSSU5HX0lORk8sCQkJCQkiSW5mb3JtYefjbyIKClNUUklOR19VTlRJVExFRCwJCQkJIihzZW0gbm9tZSkiCgpTVFJJTkdfQUxMX0ZJTEVTLAkJCQkiVG9kb3Mgb3MgYXJxdWl2b3MgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiQXJxdWl2b3MgdGV4dG8gKCoudHh0KSIKClNUUklOR19UT09MQVJHRSwJCQkJIkFycXVpdm8gJyVzJyDpIG11aXRvIGxvbmdvIHBhcmEgbyBub3RlcGFkLlxuIFwKUG9yIGZhdm9yIHVzZSB1bSBlZGl0b3IgZGlmZXJlbnRlLiIKU1RSSU5HX05PVEVYVCwJCQkJCSJWb2PqIG7jbyBkaWdpdG91IG5lbmh1bSB0ZXh0by4gXApcblBvciBmYXZvciBkaWdpdGUgYWxndW1hIGNvaXNhIGUgdGVudGUgbm92YW1lbnRlIgpTVFJJTkdfRE9FU05PVEVYSVNULAkJCQkiQXJxdWl2byAnJXMnXG5u428gZXhpc3RlXG5cbiBcClZvY+ogZGVzZWphIGNyaWFyIHVtIG5vdm8gYXJxdWl2bz8iClNUUklOR19OT1RTQVZFRCwJCQkJIkFycXVpdm8gJyVzJ1xuZm9pIG1vZGlmaWNhZG9cblxuIFwKR29zdGFyaWEgZGUgc2FsdmFyIGFzIGFsdGVyYefVZXM/IgpTVFJJTkdfTk9URk9VTkQsCQkJCQkiJyVzJyBu428gcG9kZSBzZXIgZW5jb250cmFkby4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJO428gaOEgbWVt83JpYSBzdWZpY2llbnRlIHBhcmEgY29tcGxldGFyIGVzc2EgXAp0YXJlZmEuIFxuRmVjaGUgdW1hIG91IG1haXMgYXBsaWNh5/VlcyBwYXJhIGF1bWVudGFyIGEgcXVhbnRpZGFkZSBkZSBtZW3zcmlhIGxpdnJlLiIKfQoKTEFOR1VBR0UgTEFOR19QT1JUVUdVRVNFLCBTVUJMQU5HX1BPUlRVR1VFU0UKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKIFNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImbiIgICAgICAgIC8qIEZJWE1FICovCiBTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLAkiUOFnaW5hICZzIiAvKiBGSVhNRSAqLwogU1RSSU5HX1BBR0VTRVRVUF9MRUZUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovCiBTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsCSIyMCBtbSIgICAgIC8qIEZJWE1FICovCiBTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLAkiMjUgbW0iICAgICAvKiBGSVhNRSAqLwogU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KCiBTVFJJTkdfTk9URVBBRCwJCSJOb3RlcGFkIgogU1RSSU5HX0VSUk9SLAkJCSJFUlJPIgogU1RSSU5HX1dBUk5JTkcsCQkiQVZJU08iCiBTVFJJTkdfSU5GTywJCQkiSW5mb3JtYefjbyIKCiBTVFJJTkdfVU5USVRMRUQsCQkiKHNlbSBub21lKSIKCiBTVFJJTkdfQUxMX0ZJTEVTLAkJIlRvZG9zIG9zIGFycXVpdm9zICgqLiopIgogU1RSSU5HX1RFWFRfRklMRVNfVFhULAkJIkZpY2hlaXJvcyBkZSB0ZXh0byAoKi50eHQpIgoKIFNUUklOR19UT09MQVJHRSwJCSJGaWNoZWlyb3MgJyVzJyDpIG11aXRvIGxvbmdvIHBhcmEgbyBub3RlcGFkLlxuIFwKIFBvciBmYXZvciB1c2UgdW0gZWRpdG9yIGRpZmVyZW50ZS4iCiBTVFJJTkdfTk9URVhULAkJCSJO428gZGlnaXRvdSBuZW5odW0gdGV4dG8uIFwKIFxuUG9yIGZhdm9yIGRpZ2l0ZSBhbGd1bWEgY29pc2EgZSB0ZW50ZSBub3ZhbWVudGUiCiBTVFJJTkdfRE9FU05PVEVYSVNULAkJIkZpY2hlaXJvICclcydcbm7jbyBleGlzdGVcblxuIFwKRGVzZWphIGNyaWFyIHVtIG5vdm8gZmljaGVpcm8/IgogU1RSSU5HX05PVFNBVkVELAkJIkZpY2hlaXJvICclcydcbmZvaSBtb2RpZmljYWRvXG5cbiBcCkdvc3RhcmlhIGRlIGdyYXZhciBhcyBhbHRlcmHn1WVzPyIKIFNUUklOR19OT1RGT1VORCwJCSInJXMnIG7jbyBwb2RlIHNlciBlbmNvbnRyYWRvLiIKIFNUUklOR19PVVRfT0ZfTUVNT1JZLAkJIk7jbyBo4SBtZW3zcmlhIHN1ZmljaWVudGUgcGFyYSBjb21wbGV0YXIgZXN0YSBcCnRhcmVmYS4gXG5GZWNoZSB1bWEgb3UgbWFpcyBhcGxpY2Hn9WVzIHBhcmEgYXVtZW50YXIgYSBxdWFudGlkYWRlIGRlIG1lbfNyaWEgbGl2cmUuIgp9Cg==