Ci8qISBcZmlsZQogKiAgICAgY29udHJpYnV0b3JzLmgKICogIFxicmllZgogKiAgICAgTGlzdCBvZiBjb250cmlidXRvcnMgYW5kIGNvcHlyaWdodCBpbmZvcm1hdGlvbi4KICoKICogIFxwYXIgQ29weXJpZ2h0IHN0YXRlbWVudHMKICAgIFx2ZXJiYXRpbQogICBILjI2NCBKTSBjb2Rlci9kZWNvZGVyCgogICBDb3B5cmlnaHQgKEMpIDIwMDAgYnkKICAgICAgVGVsZW5vciBCcm9hZGJhbmQgU2VydmljZXMsIE5vcndheQogICAgICBFcmljc3NvbiBSYWRpbyBTeXN0ZW1zLCBTd2VkZW4KICAgICAgVEVMRVMgQUcsIEdlcm1hbnkKICAgICAgTm9raWEgSW5jLiwgVVNBCiAgICAgIE5va2lhIENvcnBvcmF0aW9uLCBGaW5sYW5kCiAgICAgIFNpZW1lbnMgQUcsIEdlcm1hbnkKICAgICAgSGVpbnJpY2gtSGVydHotSW5zdGl0dXRlIGZvciBDb21tdW5pY2F0aW9uIFRlY2hub2xvZ3kgR21iSCwgR2VybWFueQogICAgICBVbml2ZXJzaXR5IG9mIEhhbm5vdmVyLCBJbnN0aXR1dCBvZiBDb21tdW5pY2F0aW9uIFRoZW9yeSBhbmQgU2lnbmFsIFByb2Nlc3NpbmcsR2VybWFueQogICAgICBWaWRlb2xvY3VzLCBDYW5hZGEKICAgICAgTFNJIExvZ2ljLCBDYW5hZGEKICAgICAgTW90b3JvbGEgSW5jLiwgVVNBCiAgICAgIE1pY3Jvc29mdCBDb3JwLiwgVVNBCiAgICAgIEFwcGxlIENvbXB1dGVyLCBJbmMuCiAgICAgIFJlYWxOZXR3b3JrcywgSW5jLiwgVVNBCiAgICAgIFRob21zb24sIEluYy4sIFVTQQogICAgICBEb2xieSBMYWJvcmF0b3JpZXMsIEluYy4sIFVTQQogICBcZW5kdmVyYmF0aW0KICAgXHBhciBGdWxsIENvbnRhY3QgSW5mb3JtYXRpb24KICAgXHZlcmJhdGltCgogICAgICBMb3dlbGwgV2luZ2VyICAgICAgICAgICAgICAgICAgIDxsd2luZ2VyQHZpZGVvbG9jdXMuY29tPjxsd2luZ2VyQHV3YXRlcmxvby5jYT48bHdpbmdlckBsc2lsLmNvbT4KICAgICAgR3V5IEP0dOkgICAgICAgICAgICAgICAgICAgICAgICA8Z2NvdGVAdmlkZW9sb2N1cy5jb20+CiAgICAgIE1pY2hhZWwgR2FsbGFudCAgICAgICAgICAgICAgICAgPG1nYWxsYW50QHZpZGVvbG9jdXMuY29tPgogICAgICBWaWRlb0xvY3VzIEluYy4KICAgICAgOTcgUmFuZGFsbCBEci4KICAgICAgV2F0ZXJsb28sIE9OLCBDYW5hZGEgIE4yVjFDNQoKICAgICAgSW5nZSBMaWxsZS1MYW5n+HkgICAgICAgICAgICAgICA8aW5nZS5saWxsZS1sYW5nb3lAdGVsZW5vci5jb20+CiAgICAgIFRlbGVub3IgQnJvYWRiYW5kIFNlcnZpY2VzCiAgICAgIFAuTy5Cb3ggNjkxNCBTdC5PbGF2cyBwbGFzcwogICAgICBOLTAxMzAgT3NsbywgTm9yd2F5CgogICAgICBSaWNrYXJkIFNqb2JlcmcgICAgICAgICAgICAgICAgIDxyaWNrYXJkLnNqb2JlcmdAZXJhLmVyaWNzc29uLnNlPgogICAgICBFcmljc3NvbiBSYWRpbyBTeXN0ZW1zCiAgICAgIEtJL0VSQS9UL1ZWCiAgICAgIDE2NCA4MCBTdG9ja2hvbG0sIFN3ZWRlbgoKICAgICAgU3RlcGhhbiBXZW5nZXIgICAgICAgICAgICAgICAgICA8c3Rld2VAY3MudHUtYmVybGluLmRlPgogICAgICBUVSBCZXJsaW4gLyBURUxFUyBBRwogICAgICBTZWtyLiBGUiA2LTMKICAgICAgRnJhbmtsaW5zdHIuIDI4LTI5CiAgICAgIEQtMTA1ODcgQmVybGluLCBHZXJtYW55CgogICAgICBKYW5pIExhaW5lbWEgICAgICAgICAgICAgICAgICAgIDxqYW5pLmxhaW5lbWFAbm9raWEuY29tPgogICAgICBSYWdpcCBLdXJjZXJlbiAgICAgICAgICAgICAgICAgIDxyYWdpcC5rdXJjZXJlbkBub2tpYS5jb20+CiAgICAgIE5va2lhIEluYy4gLyBOb2tpYSBSZXNlYXJjaCBDZW50ZXIKICAgICAgNjAwMCBDb25uZWN0aW9uIERyaXZlCiAgICAgIElydmluZywgVFggNzUwMzksIFVTQQoKICAgICAgTWlza2EgTS4gSGFubnVrc2VsYSAgICAgICAgICAgICA8bWlza2EuaGFubnVrc2VsYUBub2tpYS5jb20+CiAgICAgIE5va2lhIENvcnBvcmF0aW9uIC8gTm9raWEgTW9iaWxlIFBob25lcwogICAgICBQLk8uIEJveCA4OAogICAgICAzMzcyMSBUYW1wZXJlLCBGaW5sYW5kCgogICAgICBTZWJhc3RpYW4gUHVycmVpdGVyICAgICAgICAgICAgIDxzZWJhc3RpYW4ucHVycmVpdGVyQG1jaC5zaWVtZW5zLmRlPgogICAgICBTaWVtZW5zIEFHCiAgICAgIElDTSBNRCBNUCBSRCBNQ0ggODMKICAgICAgUC5PLkJveCA4MCAxNyAwNwogICAgICBELTgxNjE3IE11bmljaCwgR2VybWFueQoKICAgICAgVGhvbWFzIFdlZGkgICAgICAgICAgICAgICAgICAgICA8d2VkaUB0bnQudW5pLWhhbm5vdmVyLmRlPgogICAgICBVbml2ZXJzaXR5IG9mIEhhbm5vdmVyCiAgICAgIEluc3RpdHV0IG9mIENvbW11bmljYXRpb24gVGhlb3J5IGFuZCBTaWduYWwgUHJvY2Vzc2luZwogICAgICBBcHBlbHN0ci4gOWEKICAgICAgMzAxNjcgSGFubm92ZXIKCiAgICAgIFRob21hcyBTdG9ja2hhbW1lciAgICAgICAgICAgICAgPHN0b2NraGFtbWVyQGVpLnR1bS5kZT4KICAgICAgVG9iaWFzIE9lbGJhdW0gKFRPKSAgICAgICAgICAgICA8ZHJlaHZpYWxAZ214Lm5ldD4KICAgICAgSW5zdGl0dXRlIGZvciBDb21tdW5pY2F0aW9ucyBFbmdpbmVlcmluZwogICAgICBNdW5pY2ggVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5CiAgICAgIDgwMjkwIE11bmljaAogICAgICBHZXJtYW55CgogICAgICBZYW5uIExlIE1hZ3VldCAgICAgICAgICAgICAgICAgIDx5YW5uLmxlbWFndWV0QHBoaWxpcHMuY29tPgogICAgICBQaGlsaXBzIFJlc2VhcmNoIEZyYW5jZQoKICAgICAgRG9uZyBUaWFuICAgICAgICAgICAgICAgICAgICAgICA8dGlhbkBjcy50dXQuZmk+CiAgICAgIFllLUt1aSBXYW5nICAgICAgICAgICAgICAgICAgICAgPHd5a0BpZWVlLm9yZz4KICAgICAgVGFtcGVyZSBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kKICAgICAgVGFtcGVyZSBJbnRlcm5hdGlvbmFsIENlbnRlciBmb3IgU2lnbmFsIFByb2Nlc3NpbmcKICAgICAgMzM3MjAgVGFtcGVyZSwgRmlubGFuZAoKICAgICAgS2Fyc3RlbiBTdWVocmluZyAgICAgICAgICAgICAgICA8c3VlaHJpbmdAaGhpLmRlPgogICAgICBIZWlrbyBTY2h3YXJ6ICAgICAgICAgICAgICAgICAgIDxoc2Nod2FyekBoaGkuZGU+CiAgICAgIERldGxldiBNYXJwZSAgICAgICAgICAgICAgICAgICAgPG1hcnBlQGhoaS5kZT4KICAgICAgR3VpZG8gSGVpc2luZyAgICAgICAgICAgICAgICAgICA8aGVpc2luZ0BoaGkuZGU+CiAgICAgIEhlaW5yaWNoLUhlcnR6LUluc3RpdHV0ZQogICAgICBFaW5zdGVpbnVmZXIgMzcKICAgICAgMTA1ODcgQmVybGluCiAgICAgIEdlcm1hbnkKCiAgICAgIExpbWluIFdhbmcgICAgICAgICAgICAgICAgICAgICAgPGxpd2FuZ0BnaS5jb20+CiAgICAgIEtyaXQgUGFudXNvcG9uZSAgICAgICAgICAgICAgICAgPGtwYW51c29wb25lQGdpLmNvbT4KICAgICAgUmFqZWV2IEdhbmRoaSAgICAgICAgICAgICAgICAgICA8cmdhbmRoaUBnaS5jb20+CiAgICAgIFl1ZSBZdSAgICAgICAgICAgICAgICAgICAgICAgICAgPHl5dUBnaS5jb20+CiAgICAgIE1vdG9yb2xhIEluYy4KICAgICAgNjQ1MCBTZXF1ZW5jZSBEcml2ZQogICAgICBTYW4gRGllZ28sIENBIDkyMTIxIFVTQQoKICAgICAgRmVuZyBXdSAgICAgICAgICAgICAgICAgICAgICAgICA8ZmVuZ3d1QG1pY3Jvc29mdC5jb20+CiAgICAgIFhpYW95YW4gU3VuICAgICAgICAgICAgICAgICAgICAgPHN1bnhpYW95YW5AbXNyY2hpbmEucmVzZWFyY2gubWljcm9zb2Z0LmNvbT4KICAgICAgTWljcm9zb2Z0IFJlc2VhcmNoIEFzaWEKICAgICAgMy9GLCBCZWlqaW5nIFNpZ21hIENlbnRlcgogICAgICBOby40OSwgWmhpY2h1biBSb2FkLCBIYWkgRGlhbiBEaXN0cmljdCwKICAgICAgQmVpamluZyBDaGluYSAxMDAwODAKCiAgICAgIE1hdGhpYXMgV2llbiAgICAgICAgICAgICAgICAgICAgPHdpZW5AaWVudC5yd3RoLWFhY2hlbi5kZT4KICAgICAgQWNoaW0gRGFobGhvZmYgICAgICAgICAgICAgICAgICA8ZGFobGhvZmZAaWVudC5yd3RoLWFhY2hlbi5kZT4KICAgICAgSW5zdGl0dXQgdW5kIExlaHJzdHVobCBm/HIgTmFjaHJpY2h0ZW50ZWNobmlrCiAgICAgIFJXVEggQWFjaGVuIFVuaXZlcnNpdHkKICAgICAgNTIwNzIgQWFjaGVuCiAgICAgIEdlcm1hbnkKCiAgICAgIFlvc2hpaGlybyBLaWt1Y2hpICAgICAgICAgICAgICAgPHlvc2hpaGlyby5raWt1Y2hpQHRvc2hpYmEuY28uanA+CiAgICAgIFRha2VzaGkgQ2h1am9oICAgICAgICAgICAgICAgICAgPHRha2VzaGkuY2h1am9oQHRvc2hpYmEuY28uanA+CiAgICAgIFRvc2hpYmEgQ29ycG9yYXRpb24KICAgICAgUmVzZWFyY2ggYW5kIERldmVsb3BtZW50IENlbnRlcgogICAgICBLYXdhc2FraSAyMTItODU4MiwgSmFwYW4KCiAgICAgIFNoaW55YSBLYWRvbm8gICAgICAgICAgICAgICAgICAgPGthZG9ub0BkcmwubWVpLmNvLmpwPgogICAgICBNYXRzdXNoaXRhIEVsZWN0cmljIEluZHVzdHJpYWwgQ28uLCBMdGQuCiAgICAgIDEwMDYgS2Fkb21hLCBLYWRvbWEKICAgICAgT3Nha2EgNjYzLTgxMTMsIEphcGFuCgogICAgICBEenVuZyBIb2FuZyAgICAgICAgICAgICAgICAgICAgIDxkdGhvYW5nQHlhaG9vLmNvbT4KICAgICAgMTA1MzMgUm95IEJ1dGxlciBEci4KICAgICAgQXVzdGluLCBUWCA3ODcxNwoKICAgICAgRXJpYyBWaXNjaXRvICAgICAgICAgICAgICAgICAgICA8ZXJpY0Bldi1jb25zdWx0aW5nLmNvbT4KICAgICAgZVYgQ29uc3VsdGluZwogICAgICA1MiBUcmFjeSBMbgogICAgICBTaGVsYnVybmUsIFZUIDA1NDgyIFVTQQoKICAgICAgRHp1bmcgSG9hbmcgICAgICAgICAgICAgICAgICAgICA8ZHp1bmcuaG9hbmdAeGlsaWVudC5jb20+CiAgICAgIFhpbGllbnQgSW5jLgogICAgICAxMDE4MSBCdWJiIFJkLgogICAgICBDdXBlcnRpbm8sIENBIDk1MDE0CgogICAgICBCYXJyeSBIYXNrZWxsCiAgICAgIEFwcGxlIENvbXB1dGVyLCBJbmMuICAgICAgICAgICAgPGJoYXNrZWxsQGFwcGxlLmNvbT4KICAgICAgMiBJbmZpbml0ZSBMb29wCiAgICAgIEN1cGVydGlubywgQ2FsaWZvcm5pYSA5NTAxNAoKICAgICAgR3JlZyBDb25rbGluCiAgICAgIFJlYWxOZXR3b3JrcywgSW5jLiAgICAgICAgICAgICAgPGdyZWdjQHJlYWwuY29tPgogICAgICAyNjAxIEVsbGlvdHQgQXZlCiAgICAgIFNlYXR0bGUsIFdBIDk4MTAxCgogICAgICBKaWxsIEJveWNlICAgICAgICAgICAgICAgICAgICAgIDxqaWxsLmJveWNlQHRob21zb24ubmV0PgogICAgICBDcmlzdGluYSBHb21pbGEgICAgICAgICAgICAgICAgIDxjcmlzdGluYS5nb21pbGFAdGhvbXNvbi5uZXQ+CiAgICAgIFRob21zb24KICAgICAgMiBJbmRlcGVuZGVuY2UgV2F5CiAgICAgIFByaW5jZXRvbiwgTkogMDg1NDAKCiAgICAgIFNpd2VpIE1hICAgICAgICAgICAgICAgICAgICAgICAgPHN3bWFAamRsLmFjLmNuPgogICAgICBJbnN0aXR1dGUgb2YgQ29tcHV0aW5nIFRlY2hub2xvZ3kKICAgICAgQ2hpbmVzZSBBY2FkZW15IG9mIFNjaWVuY2VzCiAgICAgIEtleHVleXVhbiBTb3V0aCBSb2FkIDYKICAgICAgSGFpZGlhbiBEaXN0cmljdAogICAgICBCZWlqaW5nLCBDaGluYQoKICAgICAgWmhpYm8gQ2hlbiAgICAgICAgICAgICAgICAgICAgICA8Y2hlbnpoaWJvQHRzaW5naHVhLm9yZy5jbj4KICAgICAgSmlhbkZlbmcgWHUgICAgICAgICAgICAgICAgICAgICA8ZmVuYXhAdmlkZW8ubWRjLnRzaW5naHVhLmVkdS5jbj4KICAgICAgV2VuZmFuZyBGdSAgICAgICAgICAgICAgICAgICAgICA8ZndmQHZpZGVvLm1kYy50c2luZ2h1YS5lZHUuY24+CiAgICAgIERlcHQub2YgRSZFLCBUc2luZ2h1YSBVbml2CiAgICAgIEhhaWRpYW4gRGlzdHJpY3QKICAgICAgQmVpamluZyBDaGluYSwgMTAwMDg0CgogICAgICBBbGV4aXMgTWljaGFlbCBUb3VyYXBpcyAgICAgICAgIDxhbGV4aXNtdEBpZWVlLm9yZz48YXRvdXJAZG9sYnkuY29tPgogICAgICBBdGhhbmFzaW9zIExlb250YXJpcyAgICAgICAgICAgIDxhbGVvbkBkb2xieS5jb20+CiAgICAgIERvbGJ5IExhYm9yYXRvcmllcyBJbmMuCiAgICAgIDM2MDEgV2VzdCBBbGFtZWRhIEF2ZS4KICAgICAgQnVyYmFuaywgQ0EgOTE1MDUKCiAgICAgIFhpYW9xdWFuIFlpICAgICAgICAgICAgICAgICAgICAgPHh5aUBlbmdyLnNjdS5lZHU+CiAgICAgIEp1biBaaGFuZyAgICAgICAgICAgICAgICAgICAgICAgPGp6aGFuZzJAZW5nci5zY3UuZWR1PgogICAgICBEZXB0LiBvZiBDLkUuIFNhbnRhIENsYXJhIFVuaXYuCiAgICAgIDUwMCBFbCBDYW1pbm8gUmVhbAogICAgICBTYW50YSBDbGFyYSwgQ0EgOTUwNTMKCiAgIFxlbmR2ZXJiYXRpbQogKi8KCg==