PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFB5dGhvbiBVbmljb2RlIEludGVncmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3Bvc2FsIFZlcnNpb246IDEuNwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkludHJvZHVjdGlvbjoKLS0tLS0tLS0tLS0tLQoKVGhlIGlkZWEgb2YgdGhpcyBwcm9wb3NhbCBpcyB0byBhZGQgbmF0aXZlIFVuaWNvZGUgMy4wIHN1cHBvcnQgdG8KUHl0aG9uIGluIGEgd2F5IHRoYXQgbWFrZXMgdXNlIG9mIFVuaWNvZGUgc3RyaW5ncyBhcyBzaW1wbGUgYXMKcG9zc2libGUgd2l0aG91dCBpbnRyb2R1Y2luZyB0b28gbWFueSBwaXRmYWxscyBhbG9uZyB0aGUgd2F5LgoKU2luY2UgdGhpcyBnb2FsIGlzIG5vdCBlYXN5IHRvIGFjaGlldmUgLS0gc3RyaW5ncyBiZWluZyBvbmUgb2YgdGhlCm1vc3QgZnVuZGFtZW50YWwgb2JqZWN0cyBpbiBQeXRob24gLS0sIHdlIGV4cGVjdCB0aGlzIHByb3Bvc2FsIHRvCnVuZGVyZ28gc29tZSBzaWduaWZpY2FudCByZWZpbmVtZW50cy4KCk5vdGUgdGhhdCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgcHJvcG9zYWwgaXMgc3RpbGwgYSBiaXQgdW5zb3J0ZWQKZHVlIHRvIHRoZSBtYW55IGRpZmZlcmVudCBhc3BlY3RzIG9mIHRoZSBVbmljb2RlLVB5dGhvbiBpbnRlZ3JhdGlvbi4KClRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIGRvY3VtZW50IGlzIGFsd2F5cyBhdmFpbGFibGUgYXQ6CgogICAgICAgIGh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L35sZW1idXJnL3VuaWNvZGUtcHJvcG9zYWwudHh0CgpPbGRlciB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGFzOgoKICAgICAgICBodHRwOi8vc3RhcnNoaXAucHl0aG9uLm5ldC9+bGVtYnVyZy91bmljb2RlLXByb3Bvc2FsLVguWC50eHQKCgpDb252ZW50aW9uczoKLS0tLS0tLS0tLS0tCgq3IEluIGV4YW1wbGVzIHdlIHVzZSB1ID0gVW5pY29kZSBvYmplY3QgYW5kIHMgPSBQeXRob24gc3RyaW5nCgq3ICdYWFgnIG1hcmtpbmdzIGluZGljYXRlIHBvaW50cyBvZiBkaXNjdXNzaW9uIChQT0RzKQoKCkdlbmVyYWwgUmVtYXJrczoKLS0tLS0tLS0tLS0tLS0tLQoKtyBVbmljb2RlIGVuY29kaW5nIG5hbWVzIHNob3VsZCBiZSBsb3dlciBjYXNlIG9uIG91dHB1dCBhbmQKICBjYXNlLWluc2Vuc2l0aXZlIG9uIGlucHV0ICh0aGV5IHdpbGwgYmUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKICBieSBhbGwgQVBJcyB0YWtpbmcgYW4gZW5jb2RpbmcgbmFtZSBhcyBpbnB1dCkuCgq3IEVuY29kaW5nIG5hbWVzIHNob3VsZCBmb2xsb3cgdGhlIG5hbWUgY29udmVudGlvbnMgYXMgdXNlZCBieSB0aGUKICBVbmljb2RlIENvbnNvcnRpdW06IHNwYWNlcyBhcmUgY29udmVydGVkIHRvIGh5cGhlbnMsIGUuZy4gJ3V0ZiAxNicgaXMKICB3cml0dGVuIGFzICd1dGYtMTYnLgoKtyBDb2RlYyBtb2R1bGVzIHNob3VsZCB1c2UgdGhlIHNhbWUgbmFtZXMsIGJ1dCB3aXRoIGh5cGhlbnMgY29udmVydGVkCiAgdG8gdW5kZXJzY29yZXMsIGUuZy4gdXRmXzgsIHV0Zl8xNiwgaXNvXzg4NTlfMS4KCgpVbmljb2RlIERlZmF1bHQgRW5jb2Rpbmc6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uIGhhcyB0byBtYWtlIHNvbWUgYXNzdW1wdGlvbiBhYm91dCB0aGUKZW5jb2Rpbmcgb2YgOC1iaXQgc3RyaW5ncyBwYXNzZWQgdG8gaXQgZm9yIGNvZXJjaW9uIGFuZCBhYm91dCB0aGUKZW5jb2RpbmcgdG8gYXMgZGVmYXVsdCBmb3IgY29udmVyc2lvbiBvZiBVbmljb2RlIHRvIHN0cmluZ3Mgd2hlbiBubwpzcGVjaWZpYyBlbmNvZGluZyBpcyBnaXZlbi4gVGhpcyBlbmNvZGluZyBpcyBjYWxsZWQgPGRlZmF1bHQgZW5jb2Rpbmc+CnRocm91Z2hvdXQgdGhpcyB0ZXh0LgoKRm9yIHRoaXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgYSBnbG9iYWwgd2hpY2ggY2FuIGJlIHNldCBpbgp0aGUgc2l0ZS5weSBQeXRob24gc3RhcnR1cCBzY3JpcHQuIFN1YnNlcXVlbnQgY2hhbmdlcyBhcmUgbm90CnBvc3NpYmxlLiBUaGUgPGRlZmF1bHQgZW5jb2Rpbmc+IGNhbiBiZSBzZXQgYW5kIHF1ZXJpZWQgdXNpbmcgdGhlCnR3byBzeXMgbW9kdWxlIEFQSXM6CgogIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoZW5jb2RpbmcpCiAgICAgLS0+IFNldHMgdGhlIDxkZWZhdWx0IGVuY29kaW5nPiB1c2VkIGJ5IHRoZSBVbmljb2RlIGltcGxlbWVudGF0aW9uLgoJIGVuY29kaW5nIGhhcyB0byBiZSBhbiBlbmNvZGluZyB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgdGhlIFB5dGhvbgoJIGluc3RhbGxhdGlvbiwgb3RoZXJ3aXNlLCBhIExvb2t1cEVycm9yIGlzIHJhaXNlZC4KCgkgTm90ZTogVGhpcyBBUEkgaXMgb25seSBhdmFpbGFibGUgaW4gc2l0ZS5weSAhIEl0IGlzIHJlbW92ZWQKCSBmcm9tIHRoZSBzeXMgbW9kdWxlIGJ5IHNpdGUucHkgYWZ0ZXIgdXNhZ2UuCgogIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKQogICAgIC0tPiBSZXR1cm5zIHRoZSBjdXJyZW50IDxkZWZhdWx0IGVuY29kaW5nPi4KCklmIG5vdCBvdGhlcndpc2UgZGVmaW5lZCBvciBzZXQsIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4gZGVmYXVsdHMgdG8KJ2FzY2lpJy4gVGhpcyBlbmNvZGluZyBpcyBhbHNvIHRoZSBzdGFydHVwIGRlZmF1bHQgb2YgUHl0aG9uIChhbmQgaW4KZWZmZWN0IGJlZm9yZSBzaXRlLnB5IGlzIGV4ZWN1dGVkKS4KCk5vdGUgdGhhdCB0aGUgZGVmYXVsdCBzaXRlLnB5IHN0YXJ0dXAgbW9kdWxlIGNvbnRhaW5zIGRpc2FibGVkCm9wdGlvbmFsIGNvZGUgd2hpY2ggY2FuIHNldCB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+IGFjY29yZGluZyB0byB0aGUKZW5jb2RpbmcgZGVmaW5lZCBieSB0aGUgY3VycmVudCBsb2NhbGUuIFRoZSBsb2NhbGUgbW9kdWxlIGlzIHVzZWQgdG8KZXh0cmFjdCB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgbG9jYWxlIGRlZmF1bHQgc2V0dGluZ3MgZGVmaW5lZCBieSB0aGUKT1MgZW52aXJvbm1lbnQgKHNlZSBsb2NhbGUucHkpLiBJZiB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGRldGVybWluZWQsCmlzIHVua293biBvciB1bnN1cHBvcnRlZCwgdGhlIGNvZGUgZGVmYXVsdHMgdG8gc2V0dGluZyB0aGUgPGRlZmF1bHQKZW5jb2Rpbmc+IHRvICdhc2NpaScuIFRvIGVuYWJsZSB0aGlzIGNvZGUsIGVkaXQgdGhlIHNpdGUucHkgZmlsZSBvcgpwbGFjZSB0aGUgYXBwcm9wcmlhdGUgY29kZSBpbnRvIHRoZSBzaXRlY3VzdG9taXplLnB5IG1vZHVsZSBvZiB5b3VyClB5dGhvbiBpbnN0YWxsYXRpb24uCgoKVW5pY29kZSBDb25zdHJ1Y3RvcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHl0aG9uIHNob3VsZCBwcm92aWRlIGEgYnVpbHQtaW4gY29uc3RydWN0b3IgZm9yIFVuaWNvZGUgc3RyaW5ncyB3aGljaAppcyBhdmFpbGFibGUgdGhyb3VnaCBfX2J1aWx0aW5zX186CgogIHUgPSB1bmljb2RlKGVuY29kZWRfc3RyaW5nWyxlbmNvZGluZz08ZGVmYXVsdCBlbmNvZGluZz5dWyxlcnJvcnM9InN0cmljdCJdKQoKICB1ID0gdSc8dW5pY29kZS1lc2NhcGUgZW5jb2RlZCBQeXRob24gc3RyaW5nPicKCiAgdSA9IHVyJzxyYXctdW5pY29kZS1lc2NhcGUgZW5jb2RlZCBQeXRob24gc3RyaW5nPicKCldpdGggdGhlICd1bmljb2RlLWVzY2FwZScgZW5jb2RpbmcgYmVpbmcgZGVmaW5lZCBhczoKCrcgYWxsIG5vbi1lc2NhcGUgY2hhcmFjdGVycyByZXByZXNlbnQgdGhlbXNlbHZlcyBhcyBVbmljb2RlIG9yZGluYWwKICAoZS5nLiAnYScgLT4gVSswMDYxKS4KCrcgYWxsIGV4aXN0aW5nIGRlZmluZWQgUHl0aG9uIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIGludGVycHJldGVkIGFzCiAgVW5pY29kZSBvcmRpbmFsczsgbm90ZSB0aGF0IFx4WFhYWCBjYW4gcmVwcmVzZW50IGFsbCBVbmljb2RlCiAgb3JkaW5hbHMsIGFuZCBcT09PIChvY3RhbCkgY2FuIHJlcHJlc2VudCBVbmljb2RlIG9yZGluYWxzIHVwIHRvIFUrMDFGRi4KCrcgYSBuZXcgZXNjYXBlIHNlcXVlbmNlLCBcdVhYWFgsIHJlcHJlc2VudHMgVStYWFhYOyBpdCBpcyBhIHN5bnRheAogIGVycm9yIHRvIGhhdmUgZmV3ZXIgdGhhbiA0IGRpZ2l0cyBhZnRlciBcdS4KCkZvciBhbiBleHBsYW5hdGlvbiBvZiBwb3NzaWJsZSB2YWx1ZXMgZm9yIGVycm9ycyBzZWUgdGhlIENvZGVjIHNlY3Rpb24KYmVsb3cuCgpFeGFtcGxlczoKCnUnYWJjJyAgICAgICAgICAtPiBVKzAwNjEgVSswMDYyIFUrMDA2Mwp1J1x1MTIzNCcgICAgICAgLT4gVSsxMjM0CnUnYWJjXHUxMjM0XG4nICAtPiBVKzAwNjEgVSswMDYyIFUrMDA2MyBVKzEyMzQgVSswMDVjCgpUaGUgJ3Jhdy11bmljb2RlLWVzY2FwZScgZW5jb2RpbmcgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgoKtyBcdVhYWFggc2VxdWVuY2UgcmVwcmVzZW50IHRoZSBVK1hYWFggVW5pY29kZSBjaGFyYWN0ZXIgaWYgYW5kCiAgb25seSBpZiB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYmFja3NsYXNoZXMgaXMgb2RkCgq3IGFsbCBvdGhlciBjaGFyYWN0ZXJzIHJlcHJlc2VudCB0aGVtc2VsdmVzIGFzIFVuaWNvZGUgb3JkaW5hbAogIChlLmcuICdiJyAtPiBVKzAwNjIpCgoKTm90ZSB0aGF0IHlvdSBzaG91bGQgcHJvdmlkZSBzb21lIGhpbnQgdG8gdGhlIGVuY29kaW5nIHlvdSB1c2VkIHRvCndyaXRlIHlvdXIgcHJvZ3JhbXMgYXMgcHJhZ21hIGxpbmUgaW4gb25lIHRoZSBmaXJzdCBmZXcgY29tbWVudCBsaW5lcwpvZiB0aGUgc291cmNlIGZpbGUgKGUuZy4gJyMgc291cmNlIGZpbGUgZW5jb2Rpbmc6IGxhdGluLTEnKS4gSWYgeW91Cm9ubHkgdXNlIDctYml0IEFTQ0lJIHRoZW4gZXZlcnl0aGluZyBpcyBmaW5lIGFuZCBubyBzdWNoIG5vdGljZSBpcwpuZWVkZWQsIGJ1dCBpZiB5b3UgaW5jbHVkZSBMYXRpbi0xIGNoYXJhY3RlcnMgbm90IGRlZmluZWQgaW4gQVNDSUksIGl0Cm1heSB3ZWxsIGJlIHdvcnRod2hpbGUgaW5jbHVkaW5nIGEgaGludCBzaW5jZSBwZW9wbGUgaW4gb3RoZXIKY291bnRyaWVzIHdpbGwgd2FudCB0byBiZSBhYmxlIHRvIHJlYWQgeW91ciBzb3VyY2Ugc3RyaW5ncyB0b28uCgoKVW5pY29kZSBUeXBlIE9iamVjdDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0KClVuaWNvZGUgb2JqZWN0cyBzaG91bGQgaGF2ZSB0aGUgdHlwZSBVbmljb2RlVHlwZSB3aXRoIHR5cGUgbmFtZQondW5pY29kZScsIG1hZGUgYXZhaWxhYmxlIHRocm91Z2ggdGhlIHN0YW5kYXJkIHR5cGVzIG1vZHVsZS4KCgpVbmljb2RlIE91dHB1dDoKLS0tLS0tLS0tLS0tLS0tCgpVbmljb2RlIG9iamVjdHMgaGF2ZSBhIG1ldGhvZCAuZW5jb2RlKFtlbmNvZGluZz08ZGVmYXVsdCBlbmNvZGluZz5dKQp3aGljaCByZXR1cm5zIGEgUHl0aG9uIHN0cmluZyBlbmNvZGluZyB0aGUgVW5pY29kZSBzdHJpbmcgdXNpbmcgdGhlCmdpdmVuIHNjaGVtZSAoc2VlIENvZGVjcykuCgogIHByaW50IHUgOj0gcHJpbnQgdS5lbmNvZGUoKSAgICMgdXNpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPgogCiAgc3RyKHUpICA6PSB1LmVuY29kZSgpICAgICAgICAgIyB1c2luZyB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+CgogIHJlcHIodSkgOj0gInUlcyIgJSByZXByKHUuZW5jb2RlKCd1bmljb2RlLWVzY2FwZScpKQoKQWxzbyBzZWUgSW50ZXJuYWwgQXJndW1lbnQgUGFyc2luZyBhbmQgQnVmZmVyIEludGVyZmFjZSBmb3IgZGV0YWlscyBvbgpob3cgb3RoZXIgQVBJcyB3cml0dGVuIGluIEMgd2lsbCB0cmVhdCBVbmljb2RlIG9iamVjdHMuCgoKVW5pY29kZSBPcmRpbmFsczoKLS0tLS0tLS0tLS0tLS0tLS0KClNpbmNlIFVuaWNvZGUgMy4wIGhhcyBhIDMyLWJpdCBvcmRpbmFsIGNoYXJhY3RlciBzZXQsIHRoZSBpbXBsZW1lbnRhdGlvbgpzaG91bGQgcHJvdmlkZSAzMi1iaXQgYXdhcmUgb3JkaW5hbCBjb252ZXJzaW9uIEFQSXM6CgogIG9yZCh1WzoxXSkgKHRoaXMgaXMgdGhlIHN0YW5kYXJkIG9yZCgpIGV4dGVuZGVkIHRvIHdvcmsgd2l0aCBVbmljb2RlCiAgICAgICAgICAgICAgb2JqZWN0cykKICAgICAgICAtLT4gVW5pY29kZSBvcmRpbmFsIG51bWJlciAoMzItYml0KQoKICB1bmljaHIoaSkgCiAgICAgICAgLS0+IFVuaWNvZGUgb2JqZWN0IGZvciBjaGFyYWN0ZXIgaSAocHJvdmlkZWQgaXQgaXMgMzItYml0KTsKICAgICAgICAgICAgVmFsdWVFcnJvciBvdGhlcndpc2UKCkJvdGggQVBJcyBzaG91bGQgZ28gaW50byBfX2J1aWx0aW5zX18ganVzdCBsaWtlIHRoZWlyIHN0cmluZwpjb3VudGVycGFydHMgb3JkKCkgYW5kIGNocigpLgoKTm90ZSB0aGF0IFVuaWNvZGUgcHJvdmlkZXMgc3BhY2UgZm9yIHByaXZhdGUgZW5jb2RpbmdzLiBVc2FnZSBvZiB0aGVzZQpjYW4gY2F1c2UgZGlmZmVyZW50IG91dHB1dCByZXByZXNlbnRhdGlvbnMgb24gZGlmZmVyZW50IG1hY2hpbmVzLiBUaGlzCnByb2JsZW0gaXMgbm90IGEgUHl0aG9uIG9yIFVuaWNvZGUgcHJvYmxlbSwgYnV0IGEgbWFjaGluZSBzZXR1cCBhbmQKbWFpbnRlbmFuY2Ugb25lLgoKCkNvbXBhcmlzb24gJiBIYXNoIFZhbHVlOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClVuaWNvZGUgb2JqZWN0cyBzaG91bGQgY29tcGFyZSBlcXVhbCB0byBvdGhlciBvYmplY3RzIGFmdGVyIHRoZXNlCm90aGVyIG9iamVjdHMgaGF2ZSBiZWVuIGNvZXJjZWQgdG8gVW5pY29kZS4gRm9yIHN0cmluZ3MgdGhpcyBtZWFucwp0aGF0IHRoZXkgYXJlIGludGVycHJldGVkIGFzIFVuaWNvZGUgc3RyaW5nIHVzaW5nIHRoZSA8ZGVmYXVsdAplbmNvZGluZz4uCgpVbmljb2RlIG9iamVjdHMgc2hvdWxkIHJldHVybiB0aGUgc2FtZSBoYXNoIHZhbHVlIGFzIHRoZWlyIEFTQ0lJCmVxdWl2YWxlbnQgc3RyaW5ncy4gVW5pY29kZSBzdHJpbmdzIGhvbGRpbmcgbm9uLUFTQ0lJIHZhbHVlcyBhcmUgbm90Cmd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lIGhhc2ggdmFsdWVzIGFzIHRoZSBkZWZhdWx0IGVuY29kZWQKZXF1aXZhbGVudCBzdHJpbmcgcmVwcmVzZW50YXRpb24uCgpXaGVuIGNvbXBhcmVkIHVzaW5nIGNtcCgpIChvciBQeU9iamVjdF9Db21wYXJlKCkpIHRoZSBpbXBsZW1lbnRhdGlvbgpzaG91bGQgbWFzayBUeXBlRXJyb3JzIHJhaXNlZCBkdXJpbmcgdGhlIGNvbnZlcnNpb24gdG8gcmVtYWluIGluIHN5bmNoCndpdGggdGhlIHN0cmluZyBiZWhhdmlvci4gQWxsIG90aGVyIGVycm9ycyBzdWNoIGFzIFZhbHVlRXJyb3JzIHJhaXNlZApkdXJpbmcgY29lcmNpb24gb2Ygc3RyaW5ncyB0byBVbmljb2RlIHNob3VsZCBub3QgYmUgbWFza2VkIGFuZCBwYXNzZWQKdGhyb3VnaCB0byB0aGUgdXNlci4KCkluIGNvbnRhaW5tZW50IHRlc3RzICgnYScgaW4gdSdhYmMnIGFuZCB1J2EnIGluICdhYmMnKSBib3RoIHNpZGVzCnNob3VsZCBiZSBjb2VyY2VkIHRvIFVuaWNvZGUgYmVmb3JlIGFwcGx5aW5nIHRoZSB0ZXN0LiBFcnJvcnMgb2NjdXJyaW5nCmR1cmluZyBjb2VyY2lvbiAoZS5nLiBOb25lIGluIHUnYWJjJykgc2hvdWxkIG5vdCBiZSBtYXNrZWQuCgoKQ29lcmNpb246Ci0tLS0tLS0tLQoKVXNpbmcgUHl0aG9uIHN0cmluZ3MgYW5kIFVuaWNvZGUgb2JqZWN0cyB0byBmb3JtIG5ldyBvYmplY3RzIHNob3VsZAphbHdheXMgY29lcmNlIHRvIHRoZSBtb3JlIHByZWNpc2UgZm9ybWF0LCBpLmUuIFVuaWNvZGUgb2JqZWN0cy4KCiAgdSArIHMgOj0gdSArIHVuaWNvZGUocykKCiAgcyArIHUgOj0gdW5pY29kZShzKSArIHUKCkFsbCBzdHJpbmcgbWV0aG9kcyBzaG91bGQgZGVsZWdhdGUgdGhlIGNhbGwgdG8gYW4gZXF1aXZhbGVudCBVbmljb2RlCm9iamVjdCBtZXRob2QgY2FsbCBieSBjb252ZXJ0aW5nIGFsbCBpbnZvbHZlZCBzdHJpbmdzIHRvIFVuaWNvZGUgYW5kCnRoZW4gYXBwbHlpbmcgdGhlIGFyZ3VtZW50cyB0byB0aGUgVW5pY29kZSBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSwKZS5nLgoKICBzdHJpbmcuam9pbigocyx1KSxzZXApIDo9IChzICsgc2VwKSArIHUKCiAgc2VwLmpvaW4oKHMsdSkpIDo9IChzICsgc2VwKSArIHUKCkZvciBhIGRpc2N1c3Npb24gb2YgJS1mb3JtYXR0aW5nIHcvciB0byBVbmljb2RlIG9iamVjdHMsIHNlZQpGb3JtYXR0aW5nIE1hcmtlcnMuCgoKRXhjZXB0aW9uczoKLS0tLS0tLS0tLS0KClVuaWNvZGVFcnJvciBpcyBkZWZpbmVkIGluIHRoZSBleGNlcHRpb25zIG1vZHVsZSBhcyBhIHN1YmNsYXNzIG9mClZhbHVlRXJyb3IuIEl0IGlzIGF2YWlsYWJsZSBhdCB0aGUgQyBsZXZlbCB2aWEgUHlFeGNfVW5pY29kZUVycm9yLgpBbGwgZXhjZXB0aW9ucyByZWxhdGVkIHRvIFVuaWNvZGUgZW5jb2RpbmcvZGVjb2Rpbmcgc2hvdWxkIGJlCnN1YmNsYXNzZXMgb2YgVW5pY29kZUVycm9yLgoKCkNvZGVjcyAoQ29kZXIvRGVjb2RlcnMpIExvb2t1cDoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBDb2RlYyAoc2VlIENvZGVjIEludGVyZmFjZSBEZWZpbml0aW9uKSBzZWFyY2ggcmVnaXN0cnkgc2hvdWxkIGJlCmltcGxlbWVudGVkIGJ5IGEgbW9kdWxlICJjb2RlY3MiOgoKICBjb2RlY3MucmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQoKU2VhcmNoIGZ1bmN0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gdGFrZSBvbmUgYXJndW1lbnQsIHRoZSBlbmNvZGluZyBuYW1lCmluIGFsbCBsb3dlciBjYXNlIGxldHRlcnMgYW5kIHdpdGggaHlwaGVucyBhbmQgc3BhY2VzIGNvbnZlcnRlZCB0bwp1bmRlcnNjb3JlcywgYW5kIHJldHVybiBhIHR1cGxlIG9mIGZ1bmN0aW9ucyAoZW5jb2RlciwgZGVjb2RlciwKc3RyZWFtX3JlYWRlciwgc3RyZWFtX3dyaXRlcikgdGFraW5nIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOgoKICBlbmNvZGVyIGFuZCBkZWNvZGVyOgoJVGhlc2UgbXVzdCBiZSBmdW5jdGlvbnMgb3IgbWV0aG9kcyB3aGljaCBoYXZlIHRoZSBzYW1lCglpbnRlcmZhY2UgYXMgdGhlIC5lbmNvZGUvLmRlY29kZSBtZXRob2RzIG9mIENvZGVjIGluc3RhbmNlcwoJKHNlZSBDb2RlYyBJbnRlcmZhY2UpLiBUaGUgZnVuY3Rpb25zL21ldGhvZHMgYXJlIGV4cGVjdGVkIHRvCgl3b3JrIGluIGEgc3RhdGVsZXNzIG1vZGUuCgogIHN0cmVhbV9yZWFkZXIgYW5kIHN0cmVhbV93cml0ZXI6CglUaGVzZSBuZWVkIHRvIGJlIGZhY3RvcnkgZnVuY3Rpb25zIHdpdGggdGhlIGZvbGxvd2luZwoJaW50ZXJmYWNlOgoKCSAgICAgICAgZmFjdG9yeShzdHJlYW0sZXJyb3JzPSdzdHJpY3QnKQoKICAgICAgICBUaGUgZmFjdG9yeSBmdW5jdGlvbnMgbXVzdCByZXR1cm4gb2JqZWN0cyBwcm92aWRpbmcKICAgICAgICB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGJ5IFN0cmVhbVdyaXRlci9TdHJlYW1SZWFkZXIgcmVzcC4KICAgICAgICAoc2VlIENvZGVjIEludGVyZmFjZSkuIFN0cmVhbSBjb2RlY3MgY2FuIG1haW50YWluIHN0YXRlLgoKCVBvc3NpYmxlIHZhbHVlcyBmb3IgZXJyb3JzIGFyZSBkZWZpbmVkIGluIHRoZSBDb2RlYwoJc2VjdGlvbiBiZWxvdy4KCkluIGNhc2UgYSBzZWFyY2ggZnVuY3Rpb24gY2Fubm90IGZpbmQgYSBnaXZlbiBlbmNvZGluZywgaXQgc2hvdWxkCnJldHVybiBOb25lLgoKQWxpYXNpbmcgc3VwcG9ydCBmb3IgZW5jb2RpbmdzIGlzIGxlZnQgdG8gdGhlIHNlYXJjaCBmdW5jdGlvbnMKdG8gaW1wbGVtZW50LgoKVGhlIGNvZGVjcyBtb2R1bGUgd2lsbCBtYWludGFpbiBhbiBlbmNvZGluZyBjYWNoZSBmb3IgcGVyZm9ybWFuY2UKcmVhc29ucy4gRW5jb2RpbmdzIGFyZSBmaXJzdCBsb29rZWQgdXAgaW4gdGhlIGNhY2hlLiBJZiBub3QgZm91bmQsIHRoZQpsaXN0IG9mIHJlZ2lzdGVyZWQgc2VhcmNoIGZ1bmN0aW9ucyBpcyBzY2FubmVkLiBJZiBubyBjb2RlY3MgdHVwbGUgaXMKZm91bmQsIGEgTG9va3VwRXJyb3IgaXMgcmFpc2VkLiBPdGhlcndpc2UsIHRoZSBjb2RlY3MgdHVwbGUgaXMgc3RvcmVkCmluIHRoZSBjYWNoZSBhbmQgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KClRvIHF1ZXJ5IHRoZSBDb2RlYyBpbnN0YW5jZSB0aGUgZm9sbG93aW5nIEFQSSBzaG91bGQgYmUgdXNlZDoKCiAgY29kZWNzLmxvb2t1cChlbmNvZGluZykKClRoaXMgd2lsbCBlaXRoZXIgcmV0dXJuIHRoZSBmb3VuZCBjb2RlY3MgdHVwbGUgb3IgcmFpc2UgYSBMb29rdXBFcnJvci4KCgpTdGFuZGFyZCBDb2RlY3M6Ci0tLS0tLS0tLS0tLS0tLS0KClN0YW5kYXJkIGNvZGVjcyBzaG91bGQgbGl2ZSBpbnNpZGUgYW4gZW5jb2RpbmdzLyBwYWNrYWdlIGRpcmVjdG9yeSBpbiB0aGUKU3RhbmRhcmQgUHl0aG9uIENvZGUgTGlicmFyeS4gVGhlIF9faW5pdF9fLnB5IGZpbGUgb2YgdGhhdCBkaXJlY3Rvcnkgc2hvdWxkCmluY2x1ZGUgYSBDb2RlYyBMb29rdXAgY29tcGF0aWJsZSBzZWFyY2ggZnVuY3Rpb24gaW1wbGVtZW50aW5nIGEgbGF6eSBtb2R1bGUKYmFzZWQgY29kZWMgbG9va3VwLgoKUHl0aG9uIHNob3VsZCBwcm92aWRlIGEgZmV3IHN0YW5kYXJkIGNvZGVjcyBmb3IgdGhlIG1vc3QgcmVsZXZhbnQKZW5jb2RpbmdzLCBlLmcuIAoKICAndXRmLTgnOiAgICAgICAgICAgICAgOC1iaXQgdmFyaWFibGUgbGVuZ3RoIGVuY29kaW5nCiAgJ3V0Zi0xNic6ICAgICAgICAgICAgIDE2LWJpdCB2YXJpYWJsZSBsZW5ndGggZW5jb2RpbmcgKGxpdHRsZS9iaWcgZW5kaWFuKQogICd1dGYtMTYtbGUnOiAgICAgICAgICB1dGYtMTYgYnV0IGV4cGxpY2l0bHkgbGl0dGxlIGVuZGlhbgogICd1dGYtMTYtYmUnOiAgICAgICAgICB1dGYtMTYgYnV0IGV4cGxpY2l0bHkgYmlnIGVuZGlhbgogICdhc2NpaSc6ICAgICAgICAgICAgICA3LWJpdCBBU0NJSSBjb2RlcGFnZQogICdpc28tODg1OS0xJzogICAgICAgICBJU08gODg1OS0xIChMYXRpbiAxKSBjb2RlcGFnZQogICd1bmljb2RlLWVzY2FwZSc6ICAgICBTZWUgVW5pY29kZSBDb25zdHJ1Y3RvcnMgZm9yIGEgZGVmaW5pdGlvbgogICdyYXctdW5pY29kZS1lc2NhcGUnOiBTZWUgVW5pY29kZSBDb25zdHJ1Y3RvcnMgZm9yIGEgZGVmaW5pdGlvbgogICduYXRpdmUnOiAgICAgICAgICAgICBEdW1wIG9mIHRoZSBJbnRlcm5hbCBGb3JtYXQgdXNlZCBieSBQeXRob24KCkNvbW1vbiBhbGlhc2VzIHNob3VsZCBhbHNvIGJlIHByb3ZpZGVkIHBlciBkZWZhdWx0LCBlLmcuICAnbGF0aW4tMScKZm9yICdpc28tODg1OS0xJy4KCk5vdGU6ICd1dGYtMTYnIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB1c2luZyBhbmQgcmVxdWlyaW5nIGJ5dGUgb3JkZXIKbWFya3MgKEJPTSkgZm9yIGZpbGUgaW5wdXQvb3V0cHV0LgoKQWxsIG90aGVyIGVuY29kaW5ncyBzdWNoIGFzIHRoZSBDSksgb25lcyB0byBzdXBwb3J0IEFzaWFuIHNjcmlwdHMKc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIHNlcGFyYXRlIHBhY2thZ2VzIHdoaWNoIGRvIG5vdCBnZXQgaW5jbHVkZWQKaW4gdGhlIGNvcmUgUHl0aG9uIGRpc3RyaWJ1dGlvbiBhbmQgYXJlIG5vdCBhIHBhcnQgb2YgdGhpcyBwcm9wb3NhbC4KCgpDb2RlY3MgSW50ZXJmYWNlIERlZmluaXRpb246Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoZSBmb2xsb3dpbmcgYmFzZSBjbGFzcyBzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgbW9kdWxlCiJjb2RlY3MiLiBUaGV5IHByb3ZpZGUgbm90IG9ubHkgdGVtcGxhdGVzIGZvciB1c2UgYnkgZW5jb2RpbmcgbW9kdWxlCmltcGxlbWVudG9ycywgYnV0IGFsc28gZGVmaW5lIHRoZSBpbnRlcmZhY2Ugd2hpY2ggaXMgZXhwZWN0ZWQgYnkgdGhlClVuaWNvZGUgaW1wbGVtZW50YXRpb24uCgpOb3RlIHRoYXQgdGhlIENvZGVjIEludGVyZmFjZSBkZWZpbmVkIGhlcmUgaXMgd2VsbCBzdWl0YWJsZSBmb3IgYQpsYXJnZXIgcmFuZ2Ugb2YgYXBwbGljYXRpb25zLiBUaGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBleHBlY3RzClVuaWNvZGUgb2JqZWN0cyBvbiBpbnB1dCBmb3IgLmVuY29kZSgpIGFuZCAud3JpdGUoKSBhbmQgY2hhcmFjdGVyCmJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgb24gaW5wdXQgZm9yIC5kZWNvZGUoKS4gT3V0cHV0IG9mIC5lbmNvZGUoKQphbmQgLnJlYWQoKSBzaG91bGQgYmUgYSBQeXRob24gc3RyaW5nIGFuZCAuZGVjb2RlKCkgbXVzdCByZXR1cm4gYW4KVW5pY29kZSBvYmplY3QuCgpGaXJzdCwgd2UgaGF2ZSB0aGUgc3RhdGVsZXNzIGVuY29kZXJzL2RlY29kZXJzLiBUaGVzZSBkbyBub3Qgd29yayBpbgpjaHVua3MgYXMgdGhlIHN0cmVhbSBjb2RlY3MgKHNlZSBiZWxvdykgZG8sIGJlY2F1c2UgYWxsIGNvbXBvbmVudHMgYXJlCmV4cGVjdGVkIHRvIGJlIGF2YWlsYWJsZSBpbiBtZW1vcnkuCgpjbGFzcyBDb2RlYzoKCiAgICAiIiIgRGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBzdGF0ZWxlc3MgZW5jb2RlcnMvZGVjb2RlcnMuCgogICAgICAgIFRoZSAuZW5jb2RlKCkvLmRlY29kZSgpIG1ldGhvZHMgbWF5IGltcGxlbWVudCBkaWZmZXJlbnQgZXJyb3IKICAgICAgICBoYW5kbGluZyBzY2hlbWVzIGJ5IHByb3ZpZGluZyB0aGUgZXJyb3JzIGFyZ3VtZW50LiBUaGVzZQogICAgICAgIHN0cmluZyB2YWx1ZXMgYXJlIGRlZmluZWQ6CgogICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGFuIGVycm9yIChvciBhIHN1YmNsYXNzKQogICAgICAgICAnaWdub3JlJyAtIGlnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0CiAgICAgICAgICdyZXBsYWNlJyAtIHJlcGxhY2Ugd2l0aCBhIHN1aXRhYmxlIHJlcGxhY2VtZW50IGNoYXJhY3RlcjsKICAgICAgICAgICAgICAgICAgICBQeXRob24gd2lsbCB1c2UgdGhlIG9mZmljaWFsIFUrRkZGRCBSRVBMQUNFTUVOVAogICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUiBmb3IgdGhlIGJ1aWx0aW4gVW5pY29kZSBjb2RlY3MuCgogICAgIiIiCiAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKICAgICAgICAKICAgICAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAogICAgICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCgogICAgICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCiAgICAgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nLgoKICAgICAgICAgICAgVGhlIG1ldGhvZCBtYXkgbm90IHN0b3JlIHN0YXRlIGluIHRoZSBDb2RlYyBpbnN0YW5jZS4gVXNlCiAgICAgICAgICAgIFN0cmVhbUNvZGVjIGZvciBjb2RlY3Mgd2hpY2ggaGF2ZSB0byBrZWVwIHN0YXRlIGluIG9yZGVyIHRvCiAgICAgICAgICAgIG1ha2UgZW5jb2RpbmcvZGVjb2RpbmcgZWZmaWNpZW50LgoKICAgICAgICAiIiIKCS4uLgoKICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAogICAgICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCgogICAgICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgogICAgICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKICAgICAgICAgICAgbWFwcGVkIGZpbGVzIGFyZSBleGFtcGxlcyBvZiBvYmplY3RzIHByb3ZpZGluZyB0aGlzIHNsb3QuCiAgICAgICAgCiAgICAgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KICAgICAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcuCgogICAgICAgICAgICBUaGUgbWV0aG9kIG1heSBub3Qgc3RvcmUgc3RhdGUgaW4gdGhlIENvZGVjIGluc3RhbmNlLiBVc2UKICAgICAgICAgICAgU3RyZWFtQ29kZWMgZm9yIGNvZGVjcyB3aGljaCBoYXZlIHRvIGtlZXAgc3RhdGUgaW4gb3JkZXIgdG8KICAgICAgICAgICAgbWFrZSBlbmNvZGluZy9kZWNvZGluZyBlZmZpY2llbnQuCgogICAgICAgICIiIiAKICAgICAgICAuLi4KClN0cmVhbVdyaXRlciBhbmQgU3RyZWFtUmVhZGVyIGRlZmluZSB0aGUgaW50ZXJmYWNlIGZvciBzdGF0ZWZ1bAplbmNvZGVycy9kZWNvZGVycyB3aGljaCB3b3JrIG9uIHN0cmVhbXMuIFRoZXNlIGFsbG93IHByb2Nlc3Npbmcgb2YgdGhlCmRhdGEgaW4gY2h1bmtzIHRvIGVmZmljaWVudGx5IHVzZSBtZW1vcnkuIElmIHlvdSBoYXZlIGxhcmdlIHN0cmluZ3MgaW4KbWVtb3J5LCB5b3UgbWF5IHdhbnQgdG8gd3JhcCB0aGVtIHdpdGggY1N0cmluZ0lPIG9iamVjdHMgYW5kIHRoZW4gdXNlCnRoZXNlIGNvZGVjcyBvbiB0aGVtIHRvIGJlIGFibGUgdG8gZG8gY2h1bmsgcHJvY2Vzc2luZyBhcyB3ZWxsLAplLmcuIHRvIHByb3ZpZGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24gdG8gdGhlIHVzZXIuCgpjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVdyaXRlciBpbnN0YW5jZS4KCiAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciB3cml0aW5nCiAgICAgICAgICAgIChiaW5hcnkpIGRhdGEuCgogICAgICAgICAgICBUaGUgU3RyZWFtV3JpdGVyIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKCiAgICAgICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGEgVmFsdWVFcnJvciAob3IgYSBzdWJjbGFzcykKICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCgogICAgICAgICIiIgogICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCiAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKCiAgICBkZWYgd3JpdGUoc2VsZixvYmplY3QpOgoKICAgICAgICAiIiIgV3JpdGVzIHRoZSBvYmplY3QncyBjb250ZW50cyBlbmNvZGVkIHRvIHNlbGYuc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIGRhdGEsIGNvbnN1bWVkID0gc2VsZi5lbmNvZGUob2JqZWN0LHNlbGYuZXJyb3JzKQogICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCiAgICAgICAgCiAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKCiAgICAgICAgIiIiIFdyaXRlcyB0aGUgY29uY2F0ZW5hdGVkIGxpc3Qgb2Ygc3RyaW5ncyB0byB0aGUgc3RyZWFtCiAgICAgICAgICAgIHVzaW5nIC53cml0ZSgpLgogICAgICAgICIiIgogICAgICAgIHNlbGYud3JpdGUoJycuam9pbihsaXN0KSkKICAgICAgICAKICAgIGRlZiByZXNldChzZWxmKToKCiAgICAgICAgIiIiIEZsdXNoZXMgYW5kIHJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgoKICAgICAgICAgICAgQ2FsbGluZyB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGRhdGEgb24gdGhlCiAgICAgICAgICAgIG91dHB1dCBpcyBwdXQgaW50byBhIGNsZWFuIHN0YXRlLCB0aGF0IGFsbG93cyBhcHBlbmRpbmcKICAgICAgICAgICAgb2YgbmV3IGZyZXNoIGRhdGEgd2l0aG91dCBoYXZpbmcgdG8gcmVzY2FuIHRoZSB3aG9sZQogICAgICAgICAgICBzdHJlYW0gdG8gcmVjb3ZlciBzdGF0ZS4KCiAgICAgICAgIiIiCiAgICAgICAgcGFzcwoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLG5hbWUsCgogICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CgogICAgICAgICIiIiBJbmhlcml0IGFsbCBvdGhlciBtZXRob2RzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgogICAgICAgICIiIgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLG5hbWUpCgpjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMpOgoKICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcpOgoKICAgICAgICAiIiIgQ3JlYXRlcyBhIFN0cmVhbVJlYWRlciBpbnN0YW5jZS4KCiAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nCiAgICAgICAgICAgIChiaW5hcnkpIGRhdGEuCgogICAgICAgICAgICBUaGUgU3RyZWFtUmVhZGVyIG1heSBpbXBsZW1lbnQgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHNjaGVtZXMgYnkgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gVGhlc2UKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgZGVmaW5lZDoKCiAgICAgICAgICAgICAnc3RyaWN0JyAtIHJhaXNlIGEgVmFsdWVFcnJvciAob3IgYSBzdWJjbGFzcykKICAgICAgICAgICAgICdpZ25vcmUnIC0gaWdub3JlIHRoZSBjaGFyYWN0ZXIgYW5kIGNvbnRpbnVlIHdpdGggdGhlIG5leHQKICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOwoKICAgICAgICAiIiIKICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQogICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCgogICAgZGVmIHJlYWQoc2VsZixzaXplPS0xKToKCiAgICAgICAgIiIiIERlY29kZXMgZGF0YSBmcm9tIHRoZSBzdHJlYW0gc2VsZi5zdHJlYW0gYW5kIHJldHVybnMgdGhlCiAgICAgICAgICAgIHJlc3VsdGluZyBvYmplY3QuCgogICAgICAgICAgICBzaXplIGluZGljYXRlcyB0aGUgYXBwcm94aW1hdGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8KICAgICAgICAgICAgcmVhZCBmcm9tIHRoZSBzdHJlYW0gZm9yIGRlY29kaW5nIHB1cnBvc2VzLiBUaGUgZGVjb2RlcgogICAgICAgICAgICBjYW4gbW9kaWZ5IHRoaXMgc2V0dGluZyBhcyBhcHByb3ByaWF0ZS4gVGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgLTEgaW5kaWNhdGVzIHRvIHJlYWQgYW5kIGRlY29kZSBhcyBtdWNoIGFzIHBvc3NpYmxlLiAgc2l6ZQogICAgICAgICAgICBpcyBpbnRlbmRlZCB0byBwcmV2ZW50IGhhdmluZyB0byBkZWNvZGUgaHVnZSBmaWxlcyBpbiBvbmUKICAgICAgICAgICAgc3RlcC4KCiAgICAgICAgICAgIFRoZSBtZXRob2Qgc2hvdWxkIHVzZSBhIGdyZWVkeSByZWFkIHN0cmF0ZWd5IG1lYW5pbmcgdGhhdAogICAgICAgICAgICBpdCBzaG91bGQgcmVhZCBhcyBtdWNoIGRhdGEgYXMgaXMgYWxsb3dlZCB3aXRoaW4gdGhlCiAgICAgICAgICAgIGRlZmluaXRpb24gb2YgdGhlIGVuY29kaW5nIGFuZCB0aGUgZ2l2ZW4gc2l6ZSwgZS5nLiAgaWYKICAgICAgICAgICAgb3B0aW9uYWwgZW5jb2RpbmcgZW5kaW5ncyBvciBzdGF0ZSBtYXJrZXJzIGFyZSBhdmFpbGFibGUKICAgICAgICAgICAgb24gdGhlIHN0cmVhbSwgdGhlc2Ugc2hvdWxkIGJlIHJlYWQgdG9vLgoKICAgICAgICAiIiIKICAgICAgICAjIFVuc2xpY2VkIHJlYWRpbmc6CiAgICAgICAgaWYgc2l6ZSA8IDA6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmRlY29kZShzZWxmLnN0cmVhbS5yZWFkKCkpWzBdCiAgICAgICAgCiAgICAgICAgIyBTbGljZWQgcmVhZGluZzoKICAgICAgICByZWFkID0gc2VsZi5zdHJlYW0ucmVhZAogICAgICAgIGRlY29kZSA9IHNlbGYuZGVjb2RlCiAgICAgICAgZGF0YSA9IHJlYWQoc2l6ZSkKICAgICAgICBpID0gMAogICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIG9iamVjdCwgZGVjb2RlZGJ5dGVzID0gZGVjb2RlKGRhdGEpCiAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLHdoeToKICAgICAgICAgICAgICAgICMgVGhpcyBtZXRob2QgaXMgc2xvdyBidXQgc2hvdWxkIHdvcmsgdW5kZXIgcHJldHR5IG11Y2gKICAgICAgICAgICAgICAgICMgYWxsIGNvbmRpdGlvbnM7IGF0IG1vc3QgMTAgdHJpZXMgYXJlIG1hZGUKICAgICAgICAgICAgICAgIGkgPSBpICsgMQogICAgICAgICAgICAgICAgbmV3ZGF0YSA9IHJlYWQoMSkKICAgICAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhIG9yIGkgPiAxMDoKICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBuZXdkYXRhCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0CgogICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6CgogICAgICAgICIiIiBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZQogICAgICAgICAgICBkZWNvZGVkIGRhdGEuCgogICAgICAgICAgICBOb3RlOiBVbmxpa2UgdGhlIC5yZWFkbGluZXMoKSBtZXRob2QsIHRoaXMgbWV0aG9kIGluaGVyaXRzCiAgICAgICAgICAgIHRoZSBsaW5lIGJyZWFraW5nIGtub3dsZWRnZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSdzCiAgICAgICAgICAgIC5yZWFkbGluZSgpIG1ldGhvZCAtLSB0aGVyZSBpcyBjdXJyZW50bHkgbm8gc3VwcG9ydCBmb3IKICAgICAgICAgICAgbGluZSBicmVha2luZyB1c2luZyB0aGUgY29kZWMgZGVjb2RlciBkdWUgdG8gbGFjayBvZiBsaW5lCiAgICAgICAgICAgIGJ1ZmZlcmluZy4gU3ViY2xhc3NlcyBzaG91bGQgaG93ZXZlciwgaWYgcG9zc2libGUsIHRyeSB0bwogICAgICAgICAgICBpbXBsZW1lbnQgdGhpcyBtZXRob2QgdXNpbmcgdGhlaXIgb3duIGtub3dsZWRnZSBvZiBsaW5lCiAgICAgICAgICAgIGJyZWFraW5nLgoKICAgICAgICAgICAgc2l6ZSwgaWYgZ2l2ZW4sIGlzIHBhc3NlZCBhcyBzaXplIGFyZ3VtZW50IHRvIHRoZSBzdHJlYW0ncwogICAgICAgICAgICAucmVhZGxpbmUoKSBtZXRob2QuCiAgICAgICAgICAgIAogICAgICAgICIiIgogICAgICAgIGlmIHNpemUgaXMgTm9uZToKICAgICAgICAgICAgbGluZSA9IHNlbGYuc3RyZWFtLnJlYWRsaW5lKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBsaW5lID0gc2VsZi5zdHJlYW0ucmVhZGxpbmUoc2l6ZSkKICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUobGluZSlbMF0KCiAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PTApOgoKICAgICAgICAiIiIgUmVhZCBhbGwgbGluZXMgYXZhaWxhYmxlIG9uIHRoZSBpbnB1dCBzdHJlYW0KICAgICAgICAgICAgYW5kIHJldHVybiB0aGVtIGFzIGxpc3Qgb2YgbGluZXMuCgogICAgICAgICAgICBMaW5lIGJyZWFrcyBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIGNvZGVjJ3MgZGVjb2RlcgogICAgICAgICAgICBtZXRob2QgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBlbnRyaWVzLgogICAgICAgICAgICAKICAgICAgICAgICAgc2l6ZWhpbnQsIGlmIGdpdmVuLCBpcyBwYXNzZWQgYXMgc2l6ZSBhcmd1bWVudCB0byB0aGUKICAgICAgICAgICAgc3RyZWFtJ3MgLnJlYWQoKSBtZXRob2QuCgogICAgICAgICIiIgogICAgICAgIGlmIHNpemVoaW50IGlzIE5vbmU6CiAgICAgICAgICAgIGRhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKCkKICAgICAgICBlbHNlOgogICAgICAgICAgICBkYXRhID0gc2VsZi5zdHJlYW0ucmVhZChzaXplaGludCkKICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGUoZGF0YSlbMF0uc3BsaXRsaW5lcygxKQoKICAgIGRlZiByZXNldChzZWxmKToKCiAgICAgICAgIiIiIFJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgoKICAgICAgICAgICAgTm90ZSB0aGF0IG5vIHN0cmVhbSByZXBvc2l0aW9uaW5nIHNob3VsZCB0YWtlIHBsYWNlLgogICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyCiAgICAgICAgICAgIGZyb20gZGVjb2RpbmcgZXJyb3JzLgoKICAgICAgICAiIiIKICAgICAgICBwYXNzCgogICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsbmFtZSwKCiAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cj1nZXRhdHRyKToKCiAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCiAgICAgICAgIiIiCiAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5zdHJlYW0sbmFtZSkKCgpTdHJlYW0gY29kZWMgaW1wbGVtZW50b3JzIGFyZSBmcmVlIHRvIGNvbWJpbmUgdGhlIFN0cmVhbVdyaXRlciBhbmQKU3RyZWFtUmVhZGVyIGludGVyZmFjZXMgaW50byBvbmUgY2xhc3MuIEV2ZW4gY29tYmluaW5nIGFsbCB0aGVzZSB3aXRoCnRoZSBDb2RlYyBjbGFzcyBzaG91bGQgYmUgcG9zc2libGUuCgpJbXBsZW1lbnRvcnMgYXJlIGZyZWUgdG8gYWRkIGFkZGl0aW9uYWwgbWV0aG9kcyB0byBlbmhhbmNlIHRoZSBjb2RlYwpmdW5jdGlvbmFsaXR5IG9yIHByb3ZpZGUgZXh0cmEgc3RhdGUgaW5mb3JtYXRpb24gbmVlZGVkIGZvciB0aGVtIHRvCndvcmsuIFRoZSBpbnRlcm5hbCBjb2RlYyBpbXBsZW1lbnRhdGlvbiB3aWxsIG9ubHkgdXNlIHRoZSBhYm92ZQppbnRlcmZhY2VzLCB0aG91Z2guCgpJdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZXNlIGJhc2UKY2xhc3Nlcywgb25seSB0aGUgaW50ZXJmYWNlcyBtdXN0IG1hdGNoOyB0aGlzIGFsbG93cyB3cml0aW5nIENvZGVjcyBhcwpleHRlbnNpb24gdHlwZXMuCgpBcyBndWlkZWxpbmUsIGxhcmdlIG1hcHBpbmcgdGFibGVzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB1c2luZyBzdGF0aWMKQyBkYXRhIGluIHNlcGFyYXRlIChzaGFyZWQpIGV4dGVuc2lvbiBtb2R1bGVzLiBUaGF0IHdheSBtdWx0aXBsZQpwcm9jZXNzZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGRhdGEuCgpBIHRvb2wgdG8gYXV0by1jb252ZXJ0IFVuaWNvZGUgbWFwcGluZyBmaWxlcyB0byBtYXBwaW5nIG1vZHVsZXMgc2hvdWxkIGJlCnByb3ZpZGVkIHRvIHNpbXBsaWZ5IHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgbWFwcGluZ3MgKHNlZSBSZWZlcmVuY2VzKS4KCgpXaGl0ZXNwYWNlOgotLS0tLS0tLS0tLQoKVGhlIC5zcGxpdCgpIG1ldGhvZCB3aWxsIGhhdmUgdG8ga25vdyBhYm91dCB3aGF0IGlzIGNvbnNpZGVyZWQKd2hpdGVzcGFjZSBpbiBVbmljb2RlLgoKCkNhc2UgQ29udmVyc2lvbjoKLS0tLS0tLS0tLS0tLS0tLQoKQ2FzZSBjb252ZXJzaW9uIGlzIHJhdGhlciBjb21wbGljYXRlZCB3aXRoIFVuaWNvZGUgZGF0YSwgc2luY2UgdGhlcmUKYXJlIG1hbnkgZGlmZmVyZW50IGNvbmRpdGlvbnMgdG8gcmVzcGVjdC4gU2VlCgogIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTMvIAoKZm9yIHNvbWUgZ3VpZGVsaW5lcyBvbiBpbXBsZW1lbnRpbmcgY2FzZSBjb252ZXJzaW9uLgoKRm9yIFB5dGhvbiwgd2Ugc2hvdWxkIG9ubHkgaW1wbGVtZW50IHRoZSAxLTEgY29udmVyc2lvbnMgaW5jbHVkZWQgaW4KVW5pY29kZS4gTG9jYWxlIGRlcGVuZGVudCBhbmQgb3RoZXIgc3BlY2lhbCBjYXNlIGNvbnZlcnNpb25zIChzZWUgdGhlClVuaWNvZGUgc3RhbmRhcmQgZmlsZSBTcGVjaWFsQ2FzaW5nLnR4dCkgc2hvdWxkIGJlIGxlZnQgdG8gdXNlciBsYW5kCnJvdXRpbmVzIGFuZCBub3QgZ28gaW50byB0aGUgY29yZSBpbnRlcnByZXRlci4KClRoZSBtZXRob2RzIC5jYXBpdGFsaXplKCkgYW5kIC5pc2NhcGl0YWxpemVkKCkgc2hvdWxkIGZvbGxvdyB0aGUgY2FzZQptYXBwaW5nIGFsZ29yaXRobSBkZWZpbmVkIGluIHRoZSBhYm92ZSB0ZWNobmljYWwgcmVwb3J0IGFzIGNsb3NlbHkgYXMKcG9zc2libGUuCgoKTGluZSBCcmVha3M6Ci0tLS0tLS0tLS0tLQoKTGluZSBicmVha2luZyBzaG91bGQgYmUgZG9uZSBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyBoYXZpbmcgdGhlIEIKcHJvcGVydHkgYXMgd2VsbCBhcyB0aGUgY29tYmluYXRpb25zIENSTEYsIENSLCBMRiAoaW50ZXJwcmV0ZWQgaW4gdGhhdApvcmRlcikgYW5kIG90aGVyIHNwZWNpYWwgbGluZSBzZXBhcmF0b3JzIGRlZmluZWQgYnkgdGhlIHN0YW5kYXJkLgoKVGhlIFVuaWNvZGUgdHlwZSBzaG91bGQgcHJvdmlkZSBhIC5zcGxpdGxpbmVzKCkgbWV0aG9kIHdoaWNoIHJldHVybnMgYQpsaXN0IG9mIGxpbmVzIGFjY29yZGluZyB0byB0aGUgYWJvdmUgc3BlY2lmaWNhdGlvbi4gU2VlIFVuaWNvZGUKTWV0aG9kcy4KCgpVbmljb2RlIENoYXJhY3RlciBQcm9wZXJ0aWVzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBzZXBhcmF0ZSBtb2R1bGUgInVuaWNvZGVkYXRhIiBzaG91bGQgcHJvdmlkZSBhIGNvbXBhY3QgaW50ZXJmYWNlIHRvCmFsbCBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkJ3MKVW5pY29kZURhdGEudHh0IGZpbGUuCgpBbW9uZyBvdGhlciB0aGluZ3MsIHRoZXNlIHByb3BlcnRpZXMgcHJvdmlkZSB3YXlzIHRvIHJlY29nbml6ZQpudW1iZXJzLCBkaWdpdHMsIHNwYWNlcywgd2hpdGVzcGFjZSwgZXRjLgoKU2luY2UgdGhpcyBtb2R1bGUgd2lsbCBoYXZlIHRvIHByb3ZpZGUgYWNjZXNzIHRvIGFsbCBVbmljb2RlCmNoYXJhY3RlcnMsIGl0IHdpbGwgZXZlbnR1YWxseSBoYXZlIHRvIGNvbnRhaW4gdGhlIGRhdGEgZnJvbQpVbmljb2RlRGF0YS50eHQgd2hpY2ggdGFrZXMgdXAgYXJvdW5kIDYwMGtCLiBGb3IgdGhpcyByZWFzb24sIHRoZSBkYXRhCnNob3VsZCBiZSBzdG9yZWQgaW4gc3RhdGljIEMgZGF0YS4gVGhpcyBlbmFibGVzIGNvbXBpbGF0aW9uIGFzIHNoYXJlZAptb2R1bGUgd2hpY2ggdGhlIHVuZGVybHlpbmcgT1MgY2FuIHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyAodW5saWtlCm5vcm1hbCBQeXRob24gY29kZSBtb2R1bGVzKS4KClRoZXJlIHNob3VsZCBiZSBhIHN0YW5kYXJkIFB5dGhvbiBpbnRlcmZhY2UgZm9yIGFjY2Vzc2luZyB0aGlzIGluZm9ybWF0aW9uCnNvIHRoYXQgb3RoZXIgaW1wbGVtZW50b3JzIGNhbiBwbHVnIGluIHRoZWlyIG93biBwb3NzaWJseSBlbmhhbmNlZCB2ZXJzaW9ucywKZS5nLiBvbmVzIHRoYXQgZG8gZGVjb21wcmVzc2luZyBvZiB0aGUgZGF0YSBvbi10aGUtZmx5LgoKClByaXZhdGUgQ29kZSBQb2ludCBBcmVhczoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKU3VwcG9ydCBmb3IgdGhlc2UgaXMgbGVmdCB0byB1c2VyIGxhbmQgQ29kZWNzIGFuZCBub3QgZXhwbGljaXRseQppbnRlZ3JhdGVkIGludG8gdGhlIGNvcmUuIE5vdGUgdGhhdCBkdWUgdG8gdGhlIEludGVybmFsIEZvcm1hdCBiZWluZwppbXBsZW1lbnRlZCwgb25seSB0aGUgYXJlYSBiZXR3ZWVuIFx1RTAwMCBhbmQgXHVGOEZGIGlzIHVzYWJsZSBmb3IKcHJpdmF0ZSBlbmNvZGluZ3MuCgoKSW50ZXJuYWwgRm9ybWF0OgotLS0tLS0tLS0tLS0tLS0tCgpUaGUgaW50ZXJuYWwgZm9ybWF0IGZvciBVbmljb2RlIG9iamVjdHMgc2hvdWxkIHVzZSBhIFB5dGhvbiBzcGVjaWZpYwpmaXhlZCBmb3JtYXQgPFB5dGhvblVuaWNvZGU+IGltcGxlbWVudGVkIGFzICd1bnNpZ25lZCBzaG9ydCcgKG9yCmFub3RoZXIgdW5zaWduZWQgbnVtZXJpYyB0eXBlIGhhdmluZyAxNiBiaXRzKS4gQnl0ZSBvcmRlciBpcyBwbGF0Zm9ybQpkZXBlbmRlbnQuCgpUaGlzIGZvcm1hdCB3aWxsIGhvbGQgVVRGLTE2IGVuY29kaW5ncyBvZiB0aGUgY29ycmVzcG9uZGluZyBVbmljb2RlCm9yZGluYWxzLiBUaGUgUHl0aG9uIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gd2lsbCBhZGRyZXNzIHRoZXNlIHZhbHVlcwphcyBpZiB0aGV5IHdlcmUgVUNTLTIgdmFsdWVzLiBVQ1MtMiBhbmQgVVRGLTE2IGFyZSB0aGUgc2FtZSBmb3IgYWxsCmN1cnJlbnRseSBkZWZpbmVkIFVuaWNvZGUgY2hhcmFjdGVyIHBvaW50cy4gVVRGLTE2IHdpdGhvdXQgc3Vycm9nYXRlcwpwcm92aWRlcyBhY2Nlc3MgdG8gYWJvdXQgNjRrIGNoYXJhY3RlcnMgYW5kIGNvdmVycyBhbGwgY2hhcmFjdGVycyBpbgp0aGUgQmFzaWMgTXVsdGlsaW5ndWFsIFBsYW5lIChCTVApIG9mIFVuaWNvZGUuCgpJdCBpcyB0aGUgQ29kZWMncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSB0aGV5IHBhc3MgdG8KdGhlIFVuaWNvZGUgb2JqZWN0IGNvbnN0cnVjdG9yIHJlc3BlY3RzIHRoaXMgYXNzdW1wdGlvbi4gVGhlCmNvbnN0cnVjdG9yIGRvZXMgbm90IGNoZWNrIHRoZSBkYXRhIGZvciBVbmljb2RlIGNvbXBsaWFuY2Ugb3IgdXNlIG9mCnN1cnJvZ2F0ZXMuCgpGdXR1cmUgaW1wbGVtZW50YXRpb25zIGNhbiBleHRlbmQgdGhlIDMyIGJpdCByZXN0cmljdGlvbiB0byB0aGUgZnVsbApzZXQgb2YgYWxsIFVURi0xNiBhZGRyZXNzYWJsZSBjaGFyYWN0ZXJzIChhcm91bmQgMU0gY2hhcmFjdGVycykuCgpUaGUgVW5pY29kZSBBUEkgc2hvdWxkIHByb3ZpZGUgaW50ZXJmYWNlIHJvdXRpbmVzIGZyb20gPFB5dGhvblVuaWNvZGU+CnRvIHRoZSBjb21waWxlcidzIHdjaGFyX3Qgd2hpY2ggY2FuIGJlIDE2IG9yIDMyIGJpdCBkZXBlbmRpbmcgb24gdGhlCmNvbXBpbGVyL2xpYmMvcGxhdGZvcm0gYmVpbmcgdXNlZC4KClVuaWNvZGUgb2JqZWN0cyBzaG91bGQgaGF2ZSBhIHBvaW50ZXIgdG8gYSBjYWNoZWQgUHl0aG9uIHN0cmluZyBvYmplY3QKPGRlZmVuYz4gaG9sZGluZyB0aGUgb2JqZWN0J3MgdmFsdWUgdXNpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPi4KVGhpcyBpcyBuZWVkZWQgZm9yIHBlcmZvcm1hbmNlIGFuZCBpbnRlcm5hbCBwYXJzaW5nIChzZWUgSW50ZXJuYWwKQXJndW1lbnQgUGFyc2luZykgcmVhc29ucy4gVGhlIGJ1ZmZlciBpcyBmaWxsZWQgd2hlbiB0aGUgZmlyc3QKY29udmVyc2lvbiByZXF1ZXN0IHRvIHRoZSA8ZGVmYXVsdCBlbmNvZGluZz4gaXMgaXNzdWVkIG9uIHRoZSBvYmplY3QuCgpJbnRlcm5pbmcgaXMgbm90IG5lZWRlZCAoZm9yIG5vdyksIHNpbmNlIFB5dGhvbiBpZGVudGlmaWVycyBhcmUKZGVmaW5lZCBhcyBiZWluZyBBU0NJSSBvbmx5LgoKY29kZWNzLkJPTSBzaG91bGQgcmV0dXJuIHRoZSBieXRlIG9yZGVyIG1hcmsgKEJPTSkgZm9yIHRoZSBmb3JtYXQKdXNlZCBpbnRlcm5hbGx5LiBUaGUgY29kZWNzIG1vZHVsZSBzaG91bGQgcHJvdmlkZSB0aGUgZm9sbG93aW5nCmFkZGl0aW9uYWwgY29uc3RhbnRzIGZvciBjb252ZW5pZW5jZSBhbmQgcmVmZXJlbmNlIChjb2RlY3MuQk9NIHdpbGwKZWl0aGVyIGJlIEJPTV9CRSBvciBCT01fTEUgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSk6CgogIEJPTV9CRTogJ1wzNzZcMzc3JyAKICAgIChjb3JyZXNwb25kcyB0byBVbmljb2RlIFUrMDAwMEZFRkYgaW4gVVRGLTE2IG9uIGJpZyBlbmRpYW4KICAgICBwbGF0Zm9ybXMgPT0gWkVSTyBXSURUSCBOTy1CUkVBSyBTUEFDRSkKCiAgQk9NX0xFOiAnXDM3N1wzNzYnIAogICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkZGRSBpbiBVVEYtMTYgb24gbGl0dGxlIGVuZGlhbgogICAgIHBsYXRmb3JtcyA9PSBkZWZpbmVkIGFzIGJlaW5nIGFuIGlsbGVnYWwgVW5pY29kZSBjaGFyYWN0ZXIpCgogIEJPTTRfQkU6ICdcMDAwXDAwMFwzNzZcMzc3JwogICAgKGNvcnJlc3BvbmRzIHRvIFVuaWNvZGUgVSswMDAwRkVGRiBpbiBVQ1MtNCkKCiAgQk9NNF9MRTogJ1wzNzdcMzc2XDAwMFwwMDAnCiAgICAoY29ycmVzcG9uZHMgdG8gVW5pY29kZSBVKzAwMDBGRkZFIGluIFVDUy00KQoKTm90ZSB0aGF0IFVuaWNvZGUgc2VlcyBiaWcgZW5kaWFuIGJ5dGUgb3JkZXIgYXMgYmVpbmcgImNvcnJlY3QiLiBUaGUKc3dhcHBlZCBvcmRlciBpcyB0YWtlbiB0byBiZSBhbiBpbmRpY2F0b3IgZm9yIGEgIndyb25nIiBmb3JtYXQsIGhlbmNlCnRoZSBpbGxlZ2FsIGNoYXJhY3RlciBkZWZpbml0aW9uLgoKVGhlIGNvbmZpZ3VyZSBzY3JpcHQgc2hvdWxkIHByb3ZpZGUgYWlkIGluIGRlY2lkaW5nIHdoZXRoZXIgUHl0aG9uIGNhbgp1c2UgdGhlIG5hdGl2ZSB3Y2hhcl90IHR5cGUgb3Igbm90IChpdCBoYXMgdG8gYmUgYSAxNi1iaXQgdW5zaWduZWQKdHlwZSkuCgoKQnVmZmVyIEludGVyZmFjZToKLS0tLS0tLS0tLS0tLS0tLS0KCkltcGxlbWVudCB0aGUgYnVmZmVyIGludGVyZmFjZSB1c2luZyB0aGUgPGRlZmVuYz4gUHl0aG9uIHN0cmluZyBvYmplY3QKYXMgYmFzaXMgZm9yIGJmX2dldGNoYXJidWYgYW5kIHRoZSBpbnRlcm5hbCBidWZmZXIgZm9yCmJmX2dldHJlYWRidWYuIElmIGJmX2dldGNoYXJidWYgaXMgcmVxdWVzdGVkIGFuZCB0aGUgPGRlZmVuYz4gb2JqZWN0CmRvZXMgbm90IHlldCBleGlzdCwgaXQgaXMgY3JlYXRlZCBmaXJzdC4KCk5vdGUgdGhhdCBhcyBzcGVjaWFsIGNhc2UsIHRoZSBwYXJzZXIgbWFya2VyICJzIyIgd2lsbCBub3QgcmV0dXJuIHJhdwpVbmljb2RlIFVURi0xNiBkYXRhICh3aGljaCB0aGUgYmZfZ2V0cmVhZGJ1ZiByZXR1cm5zKSwgYnV0IGluc3RlYWQKdHJpZXMgdG8gZW5jb2RlIHRoZSBVbmljb2RlIG9iamVjdCB1c2luZyB0aGUgZGVmYXVsdCBlbmNvZGluZyBhbmQgdGhlbgpyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIHN0cmluZyBvYmplY3QgKG9yIHJhaXNlcyBhbgpleGNlcHRpb24gaW4gY2FzZSB0aGUgY29udmVyc2lvbiBmYWlscykuIFRoaXMgd2FzIGRvbmUgaW4gb3JkZXIgdG8KcHJldmVudCBhY2NpZGVudGVseSB3cml0aW5nIGJpbmFyeSBkYXRhIHRvIGFuIG91dHB1dCBzdHJlYW0gd2hpY2ggdGhlCm90aGVyIGVuZCBtaWdodCBub3QgcmVjb2duaXplLgoKVGhpcyBoYXMgdGhlIGFkdmFudGFnZSBvZiBiZWluZyBhYmxlIHRvIHdyaXRlIHRvIG91dHB1dCBzdHJlYW1zICh3aGljaAp0eXBpY2FsbHkgdXNlIHRoaXMgaW50ZXJmYWNlKSB3aXRob3V0IGFkZGl0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUKZW5jb2RpbmcgdG8gdXNlLgoKSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSByZWFkIGJ1ZmZlciBpbnRlcmZhY2Ugb2YgVW5pY29kZSBvYmplY3RzLAp1c2UgdGhlIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcigpIGludGVyZmFjZS4KClRoZSBpbnRlcm5hbCBmb3JtYXQgY2FuIGFsc28gYmUgYWNjZXNzZWQgdXNpbmcgdGhlICd1bmljb2RlLWludGVybmFsJwpjb2RlYywgZS5nLiB2aWEgdS5lbmNvZGUoJ3VuaWNvZGUtaW50ZXJuYWwnKS4KCgpQaWNrbGUvTWFyc2hhbGxpbmc6Ci0tLS0tLS0tLS0tLS0tLS0tLS0KClNob3VsZCBoYXZlIG5hdGl2ZSBVbmljb2RlIG9iamVjdCBzdXBwb3J0LiBUaGUgb2JqZWN0cyBzaG91bGQgYmUKZW5jb2RlZCB1c2luZyBwbGF0Zm9ybSBpbmRlcGVuZGVudCBlbmNvZGluZ3MuCgpNYXJzaGFsIHNob3VsZCB1c2UgVVRGLTggYW5kIFBpY2tsZSBzaG91bGQgZWl0aGVyIGNob29zZQpSYXctVW5pY29kZS1Fc2NhcGUgKGluIHRleHQgbW9kZSkgb3IgVVRGLTggKGluIGJpbmFyeSBtb2RlKSBhcwplbmNvZGluZy4gVXNpbmcgVVRGLTggaW5zdGVhZCBvZiBVVEYtMTYgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YKZWxpbWluYXRpbmcgdGhlIG5lZWQgdG8gc3RvcmUgYSBCT00gbWFyay4KCgpSZWd1bGFyIEV4cHJlc3Npb25zOgotLS0tLS0tLS0tLS0tLS0tLS0tLQoKU2VjcmV0IExhYnMgQUIgaXMgd29ya2luZyBvbiBhIFVuaWNvZGUtYXdhcmUgcmVndWxhciBleHByZXNzaW9uCm1hY2hpbmVyeS4gIEl0IHdvcmtzIG9uIHBsYWluIDgtYml0LCBVQ1MtMiwgYW5kIChvcHRpb25hbGx5KSBVQ1MtNAppbnRlcm5hbCBjaGFyYWN0ZXIgYnVmZmVycy4KCkFsc28gc2VlCgogICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTgvCgpmb3Igc29tZSByZW1hcmtzIG9uIGhvdyB0byB0cmVhdCBVbmljb2RlIFJFcy4KCgpGb3JtYXR0aW5nIE1hcmtlcnM6Ci0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvcm1hdCBtYXJrZXJzIGFyZSB1c2VkIGluIFB5dGhvbiBmb3JtYXQgc3RyaW5ncy4gSWYgUHl0aG9uIHN0cmluZ3MKYXJlIHVzZWQgYXMgZm9ybWF0IHN0cmluZ3MsIHRoZSBmb2xsb3dpbmcgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBiZSBpbgplZmZlY3Q6CgogICclcyc6ICAgICAgICAgICAgICAgICBGb3IgVW5pY29kZSBvYmplY3RzIHRoaXMgd2lsbCBjYXVzZSBjb2VyY2lvbiBvZiB0aGUKCQkJd2hvbGUgZm9ybWF0IHN0cmluZyB0byBVbmljb2RlLiBOb3RlIHRoYXQKCQkJeW91IHNob3VsZCB1c2UgYSBVbmljb2RlIGZvcm1hdCBzdHJpbmcgdG8gc3RhcnQKCQkJd2l0aCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KCkluIGNhc2UgdGhlIGZvcm1hdCBzdHJpbmcgaXMgYW4gVW5pY29kZSBvYmplY3QsIGFsbCBwYXJhbWV0ZXJzIGFyZSBjb2VyY2VkCnRvIFVuaWNvZGUgZmlyc3QgYW5kIHRoZW4gcHV0IHRvZ2V0aGVyIGFuZCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQKc3RyaW5nLiBOdW1iZXJzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gc3RyaW5ncyBhbmQgdGhlbiB0byBVbmljb2RlLgoKICAnJXMnOgkJCVB5dGhvbiBzdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhcyBVbmljb2RlCgkJCXN0cmluZyB1c2luZyB0aGUgPGRlZmF1bHQgZW5jb2Rpbmc+LiBVbmljb2RlCgkJCW9iamVjdHMgYXJlIHRha2VuIGFzIGlzLgoKQWxsIG90aGVyIHN0cmluZyBmb3JtYXR0ZXJzIHNob3VsZCB3b3JrIGFjY29yZGluZ2x5LgoKRXhhbXBsZToKCnUiJXMgJXMiICUgKHUiYWJjIiwgImFiYyIpICA9PSAgdSJhYmMgYWJjIgoKCkludGVybmFsIEFyZ3VtZW50IFBhcnNpbmc6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSBtYXJrZXJzIGFyZSB1c2VkIGJ5IHRoZSBQeUFyZ19QYXJzZVR1cGxlKCkgQVBJczoKCiAgIlUiOiAgQ2hlY2sgZm9yIFVuaWNvZGUgb2JqZWN0IGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIGl0CgogICJzIjogIEZvciBVbmljb2RlIG9iamVjdHM6IHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCdzCgk8ZGVmZW5jPiBidWZmZXIgKHdoaWNoIHVzZXMgdGhlIDxkZWZhdWx0IGVuY29kaW5nPikuCgogICJzIyI6IEFjY2VzcyB0byB0aGUgZGVmYXVsdCBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIFVuaWNvZGUgb2JqZWN0CiAgICAgICAgKHNlZSBCdWZmZXIgSW50ZXJmYWNlKTsgbm90ZSB0aGF0IHRoZSBsZW5ndGggcmVsYXRlcyB0byB0aGUgbGVuZ3RoCglvZiB0aGUgZGVmYXVsdCBlbmNvZGVkIHN0cmluZyByYXRoZXIgdGhhbiB0aGUgVW5pY29kZSBvYmplY3QgbGVuZ3RoLgoKICAidCMiOiBTYW1lIGFzICJzIyIuCgogICJlcyI6IAoJVGFrZXMgdHdvIHBhcmFtZXRlcnM6IGVuY29kaW5nIChjb25zdCBjaGFyICopIGFuZAoJYnVmZmVyIChjaGFyICoqKS4gCgoJVGhlIGlucHV0IG9iamVjdCBpcyBmaXJzdCBjb2VyY2VkIHRvIFVuaWNvZGUgaW4gdGhlIHVzdWFsIHdheQoJYW5kIHRoZW4gZW5jb2RlZCBpbnRvIGEgc3RyaW5nIHVzaW5nIHRoZSBnaXZlbiBlbmNvZGluZy4KCglPbiBvdXRwdXQsIGEgYnVmZmVyIG9mIHRoZSBuZWVkZWQgc2l6ZSBpcyBhbGxvY2F0ZWQgYW5kCglyZXR1cm5lZCB0aHJvdWdoICpidWZmZXIgYXMgTlVMTC10ZXJtaW5hdGVkIHN0cmluZy4KCVRoZSBlbmNvZGVkIG1heSBub3QgY29udGFpbiBlbWJlZGRlZCBOVUxMIGNoYXJhY3RlcnMuCglUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIFB5TWVtX0ZyZWUoKQoJdG8gZnJlZSB0aGUgYWxsb2NhdGVkICpidWZmZXIgYWZ0ZXIgdXNhZ2UuCgogICJlcyMiOgoJVGFrZXMgdGhyZWUgcGFyYW1ldGVyczogZW5jb2RpbmcgKGNvbnN0IGNoYXIgKiksCglidWZmZXIgKGNoYXIgKiopIGFuZCBidWZmZXJfbGVuIChpbnQgKikuCgkKCVRoZSBpbnB1dCBvYmplY3QgaXMgZmlyc3QgY29lcmNlZCB0byBVbmljb2RlIGluIHRoZSB1c3VhbCB3YXkKCWFuZCB0aGVuIGVuY29kZWQgaW50byBhIHN0cmluZyB1c2luZyB0aGUgZ2l2ZW4gZW5jb2RpbmcuCgoJSWYgKmJ1ZmZlciBpcyBub24tTlVMTCwgKmJ1ZmZlcl9sZW4gbXVzdCBiZSBzZXQgdG8gc2l6ZW9mKGJ1ZmZlcikKCW9uIGlucHV0LiBPdXRwdXQgaXMgdGhlbiBjb3BpZWQgdG8gKmJ1ZmZlci4KCglJZiAqYnVmZmVyIGlzIE5VTEwsIGEgYnVmZmVyIG9mIHRoZSBuZWVkZWQgc2l6ZSBpcwoJYWxsb2NhdGVkIGFuZCBvdXRwdXQgY29waWVkIGludG8gaXQuICpidWZmZXIgaXMgdGhlbgoJdXBkYXRlZCB0byBwb2ludCB0byB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhcmVhLgoJVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyBQeU1lbV9GcmVlKCkKCXRvIGZyZWUgdGhlIGFsbG9jYXRlZCAqYnVmZmVyIGFmdGVyIHVzYWdlLgoKCUluIGJvdGggY2FzZXMgKmJ1ZmZlcl9sZW4gaXMgdXBkYXRlZCB0byB0aGUgbnVtYmVyIG9mCgljaGFyYWN0ZXJzIHdyaXR0ZW4gKGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgTlVMTC1ieXRlKS4KCVRoZSBvdXRwdXQgYnVmZmVyIGlzIGFzc3VyZWQgdG8gYmUgTlVMTC10ZXJtaW5hdGVkLgoKRXhhbXBsZXM6CgpVc2luZyAiZXMjIiB3aXRoIGF1dG8tYWxsb2NhdGlvbjoKCiAgICBzdGF0aWMgUHlPYmplY3QgKgogICAgdGVzdF9wYXJzZXIoUHlPYmplY3QgKnNlbGYsCgkJUHlPYmplY3QgKmFyZ3MpCiAgICB7CglQeU9iamVjdCAqc3RyOwoJY29uc3QgY2hhciAqZW5jb2RpbmcgPSAibGF0aW4tMSI7CgljaGFyICpidWZmZXIgPSBOVUxMOwoJaW50IGJ1ZmZlcl9sZW4gPSAwOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXMjOnRlc3RfcGFyc2VyIiwKCQkJICAgICAgZW5jb2RpbmcsICZidWZmZXIsICZidWZmZXJfbGVuKSkKCSAgICByZXR1cm4gTlVMTDsKCWlmICghYnVmZmVyKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAoJCQkgICAgImJ1ZmZlciBpcyBOVUxMIik7CgkgICAgcmV0dXJuIE5VTEw7Cgl9CglzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGJ1ZmZlcl9sZW4pOwoJUHlNZW1fRnJlZShidWZmZXIpOwoJcmV0dXJuIHN0cjsKICAgIH0KClVzaW5nICJlcyIgd2l0aCBhdXRvLWFsbG9jYXRpb24gcmV0dXJuaW5nIGEgTlVMTC10ZXJtaW5hdGVkIHN0cmluZzogICAgCiAgICAKICAgIHN0YXRpYyBQeU9iamVjdCAqCiAgICB0ZXN0X3BhcnNlcihQeU9iamVjdCAqc2VsZiwKCQlQeU9iamVjdCAqYXJncykKICAgIHsKCVB5T2JqZWN0ICpzdHI7Cgljb25zdCBjaGFyICplbmNvZGluZyA9ICJsYXRpbi0xIjsKCWNoYXIgKmJ1ZmZlciA9IE5VTEw7CgoJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJlczp0ZXN0X3BhcnNlciIsCgkJCSAgICAgIGVuY29kaW5nLCAmYnVmZmVyKSkKCSAgICByZXR1cm4gTlVMTDsKCWlmICghYnVmZmVyKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAoJCQkgICAgImJ1ZmZlciBpcyBOVUxMIik7CgkgICAgcmV0dXJuIE5VTEw7Cgl9CglzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1ZmZlcik7CglQeU1lbV9GcmVlKGJ1ZmZlcik7CglyZXR1cm4gc3RyOwogICAgfQoKVXNpbmcgImVzIyIgd2l0aCBhIHByZS1hbGxvY2F0ZWQgYnVmZmVyOgogICAgCiAgICBzdGF0aWMgUHlPYmplY3QgKgogICAgdGVzdF9wYXJzZXIoUHlPYmplY3QgKnNlbGYsCgkJUHlPYmplY3QgKmFyZ3MpCiAgICB7CglQeU9iamVjdCAqc3RyOwoJY29uc3QgY2hhciAqZW5jb2RpbmcgPSAibGF0aW4tMSI7CgljaGFyIF9idWZmZXJbMTBdOwoJY2hhciAqYnVmZmVyID0gX2J1ZmZlcjsKCWludCBidWZmZXJfbGVuID0gc2l6ZW9mKF9idWZmZXIpOwoKCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiZXMjOnRlc3RfcGFyc2VyIiwKCQkJICAgICAgZW5jb2RpbmcsICZidWZmZXIsICZidWZmZXJfbGVuKSkKCSAgICByZXR1cm4gTlVMTDsKCWlmICghYnVmZmVyKSB7CgkgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1N5c3RlbUVycm9yLAoJCQkgICAgImJ1ZmZlciBpcyBOVUxMIik7CgkgICAgcmV0dXJuIE5VTEw7Cgl9CglzdHIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShidWZmZXIsIGJ1ZmZlcl9sZW4pOwoJcmV0dXJuIHN0cjsKICAgIH0KCgpGaWxlL1N0cmVhbSBPdXRwdXQ6Ci0tLS0tLS0tLS0tLS0tLS0tLS0KClNpbmNlIGZpbGUud3JpdGUob2JqZWN0KSBhbmQgbW9zdCBvdGhlciBzdHJlYW0gd3JpdGVycyB1c2UgdGhlICJzIyIgb3IKInQjIiBhcmd1bWVudCBwYXJzaW5nIG1hcmtlciBmb3IgcXVlcnlpbmcgdGhlIGRhdGEgdG8gd3JpdGUsIHRoZQpkZWZhdWx0IGVuY29kZWQgc3RyaW5nIHZlcnNpb24gb2YgdGhlIFVuaWNvZGUgb2JqZWN0IHdpbGwgYmUgd3JpdHRlbgp0byB0aGUgc3RyZWFtcyAoc2VlIEJ1ZmZlciBJbnRlcmZhY2UpLgoKRm9yIGV4cGxpY2l0IGhhbmRsaW5nIG9mIGZpbGVzIHVzaW5nIFVuaWNvZGUsIHRoZSBzdGFuZGFyZCBzdHJlYW0KY29kZWNzIGFzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBjb2RlY3MgbW9kdWxlIHNob3VsZCBiZSB1c2VkLgoKVGhlIGNvZGVjcyBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgYSBzaG9ydC1jdXQgb3BlbihmaWxlbmFtZSxtb2RlLGVuY29kaW5nKQphdmFpbGFibGUgd2hpY2ggYWxzbyBhc3N1cmVzIHRoYXQgbW9kZSBjb250YWlucyB0aGUgJ2InIGNoYXJhY3RlciB3aGVuCm5lZWRlZC4KCgpGaWxlL1N0cmVhbSBJbnB1dDoKLS0tLS0tLS0tLS0tLS0tLS0tCgpPbmx5IHRoZSB1c2VyIGtub3dzIHdoYXQgZW5jb2RpbmcgdGhlIGlucHV0IGRhdGEgdXNlcywgc28gbm8gc3BlY2lhbAptYWdpYyBpcyBhcHBsaWVkLiBUaGUgdXNlciB3aWxsIGhhdmUgdG8gZXhwbGljaXRseSBjb252ZXJ0IHRoZSBzdHJpbmcKZGF0YSB0byBVbmljb2RlIG9iamVjdHMgYXMgbmVlZGVkIG9yIHVzZSB0aGUgZmlsZSB3cmFwcGVycyBkZWZpbmVkIGluCnRoZSBjb2RlY3MgbW9kdWxlIChzZWUgRmlsZS9TdHJlYW0gT3V0cHV0KS4KCgpVbmljb2RlIE1ldGhvZHMgJiBBdHRyaWJ1dGVzOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQWxsIFB5dGhvbiBzdHJpbmcgbWV0aG9kcywgcGx1czoKCiAgLmVuY29kZShbZW5jb2Rpbmc9PGRlZmF1bHQgZW5jb2Rpbmc+XVssZXJyb3JzPSJzdHJpY3QiXSkgCiAgICAgLS0+IHNlZSBVbmljb2RlIE91dHB1dAoKICAuc3BsaXRsaW5lcyhbaW5jbHVkZV9icmVha3M9MF0pCiAgICAgLS0+IGJyZWFrcyB0aGUgVW5pY29kZSBzdHJpbmcgaW50byBhIGxpc3Qgb2YgKFVuaWNvZGUpIGxpbmVzOwogICAgICAgICByZXR1cm5zIHRoZSBsaW5lcyB3aXRoIGxpbmUgYnJlYWtzIGluY2x1ZGVkLCBpZiBpbmNsdWRlX2JyZWFrcwogICAgICAgICBpcyB0cnVlLiBTZWUgTGluZSBCcmVha3MgZm9yIGEgc3BlY2lmaWNhdGlvbiBvZiBob3cgbGluZSBicmVha2luZwogICAgICAgICBpcyBkb25lLgoKCkNvZGUgQmFzZToKLS0tLS0tLS0tLQoKV2Ugc2hvdWxkIHVzZSBGcmVkcmlrIEx1bmRoJ3MgVW5pY29kZSBvYmplY3QgaW1wbGVtZW50YXRpb24gYXMgYmFzaXMuCkl0IGFscmVhZHkgaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBzdHJpbmcgbWV0aG9kcyBuZWVkZWQgYW5kIHByb3ZpZGVzIGEKd2VsbCB3cml0dGVuIGNvZGUgYmFzZSB3aGljaCB3ZSBjYW4gYnVpbGQgdXBvbi4KClRoZSBvYmplY3Qgc2hhcmluZyBpbXBsZW1lbnRlZCBpbiBGcmVkcmlrJ3MgaW1wbGVtZW50YXRpb24gc2hvdWxkCmJlIGRyb3BwZWQuCgoKVGVzdCBDYXNlczoKLS0tLS0tLS0tLS0KClRlc3QgY2FzZXMgc2hvdWxkIGZvbGxvdyB0aG9zZSBpbiBMaWIvdGVzdC90ZXN0X3N0cmluZy5weSBhbmQgaW5jbHVkZQphZGRpdGlvbmFsIGNoZWNrcyBmb3IgdGhlIENvZGVjIFJlZ2lzdHJ5IGFuZCB0aGUgU3RhbmRhcmQgQ29kZWNzLgoKClJlZmVyZW5jZXM6Ci0tLS0tLS0tLS0tCgpVbmljb2RlIENvbnNvcnRpdW06CiAgICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy8KClVuaWNvZGUgRkFROgogICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9mYXEvCgpVbmljb2RlIDMuMDoKICAgICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3VuaWNvZGUvc3RhbmRhcmQvdmVyc2lvbnMvVW5pY29kZTMuMC5odG1sCgpVbmljb2RlLVRlY2hSZXBvcnRzOgogICAgICAgIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RlY2hyZXBvcnRzLmh0bWwKClVuaWNvZGUtTWFwcGluZ3M6CiAgICAgICAgZnRwOi8vZnRwLnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy8KCkludHJvZHVjdGlvbiB0byBVbmljb2RlIChhIGxpdHRsZSBvdXRkYXRlZCBieSBzdGlsbCBuaWNlIHRvIHJlYWQpOgogICAgICAgIGh0dHA6Ly93d3cubmFkYS5rdGguc2UvaTE4bi91Y3MvdW5pY29kZS1pc28xMDY0Ni1vdmlldy5odG1sCgpGb3IgY29tcGFyaXNvbjoKCUludHJvZHVjaW5nIFVuaWNvZGUgdG8gRUNNQVNjcmlwdCAoYWthIEphdmFTY3JpcHQpIC0tCglodHRwOi8vd3d3LTQuaWJtLmNvbS9zb2Z0d2FyZS9kZXZlbG9wZXIvbGlicmFyeS9pbnRlcm5hdGlvbmFsaXphdGlvbi1zdXBwb3J0Lmh0bWwKCklBTkEgQ2hhcmFjdGVyIFNldCBOYW1lczoKCWZ0cDovL2Z0cC5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMKCkRpc2N1c3Npb24gb2YgVVRGLTggYW5kIFVuaWNvZGUgc3VwcG9ydCBmb3IgUE9TSVggYW5kIExpbnV4OgoJaHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1L3VuaWNvZGUuaHRtbAoKRW5jb2RpbmdzOgoKICAgIE92ZXJ2aWV3OgogICAgICAgICAgICBodHRwOi8vY3p5Ym9ycmEuY29tL3V0Zi8KCiAgICBVVEMtMjoKICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy91bmljb2RlL3VjczIuaHRtbAoKICAgIFVURi03OgogICAgICAgICAgICBEZWZpbmVkIGluIFJGQzIxNTIsIGUuZy4KICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy9tbC1kb2NzL3JmYzIxNTIudHh0CgogICAgVVRGLTg6CiAgICAgICAgICAgIERlZmluZWQgaW4gUkZDMjI3OSwgZS5nLgogICAgICAgICAgICBodHRwOi8vaW5mby5pbnRlcm5ldC5pc2kuZWR1L2luLW5vdGVzL3JmYy9maWxlcy9yZmMyMjc5LnR4dAoKICAgIFVURi0xNjoKICAgICAgICAgICAgaHR0cDovL3d3dy51YXpvbmUuY29tL211bHRpbGluZy91bmljb2RlL3dnMm4xMDM1Lmh0bWwKCgpIaXN0b3J5IG9mIHRoaXMgUHJvcG9zYWw6Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KMS43OiBBZGRlZCBub3RlIGFib3V0IHRoZSBjaGFuZ2VkIGJlaGF2aW91ciBvZiAicyMiLgoxLjY6IENoYW5nZWQgPGRlZmVuY3N0cj4gdG8gPGRlZmVuYz4gc2luY2UgdGhpcyBpcyB0aGUgbmFtZSB1c2VkIGluIHRoZQogICAgIGltcGxlbWVudGF0aW9uLiBBZGRlZCBub3RlcyBhYm91dCB0aGUgdXNhZ2Ugb2YgPGRlZmVuYz4gaW4gdGhlCiAgICAgYnVmZmVyIHByb3RvY29sIGltcGxlbWVudGF0aW9uLgoxLjU6IEFkZGVkIG5vdGVzIGFib3V0IHNldHRpbmcgdGhlIDxkZWZhdWx0IGVuY29kaW5nPi4gRml4ZWQgc29tZQogICAgIHR5cG9zICh0aGFua3MgdG8gQW5kcmV3IEt1Y2hsaW5nKS4gQ2hhbmdlZCA8ZGVmZW5jc3RyPiB0byA8dXRmOHN0cj4uCjEuNDogQWRkZWQgbm90ZSBhYm91dCBtaXhlZCB0eXBlIGNvbXBhcmlzb25zIGFuZCBjb250YWlucyB0ZXN0cy4KICAgICBDaGFuZ2VkIHRyZWF0aW5nIG9mIFVuaWNvZGUgb2JqZWN0cyBpbiBmb3JtYXQgc3RyaW5ncyAoaWYgdXNlZAogICAgIHdpdGggJyVzJyAlIHUgdGhleSB3aWxsIG5vdyBjYXVzZSB0aGUgZm9ybWF0IHN0cmluZyB0byBiZQogICAgIGNvZXJjZWQgdG8gVW5pY29kZSwgdGh1cyBwcm9kdWNpbmcgYSBVbmljb2RlIG9iamVjdCBvbiByZXR1cm4pLgogICAgIEFkZGVkIGxpbmsgdG8gSUFOQSBjaGFyc2V0IG5hbWVzICh0aGFua3MgdG8gTGFycyBNYXJpdXMgR2Fyc2hvbCkuCiAgICAgQWRkZWQgbmV3IGNvZGVjIG1ldGhvZHMgLnJlYWRsaW5lKCksIC5yZWFkbGluZXMoKSBhbmQgLndyaXRlbGluZXMoKS4KMS4zOiBBZGRlZCBuZXcgImVzIiBhbmQgImVzIyIgcGFyc2VyIG1hcmtlcnMKMS4yOiBSZW1vdmVkIFBPRCBhYm91dCBjb2RlY3Mub3BlbigpCjEuMTogQWRkZWQgbm90ZSBhYm91dCBjb21wYXJpc29ucyBhbmQgaGFzaCB2YWx1ZXMuIEFkZGVkIG5vdGUgYWJvdXQKICAgICBjYXNlIG1hcHBpbmcgYWxnb3JpdGhtcy4gQ2hhbmdlZCBzdHJlYW0gY29kZWNzIC5yZWFkKCkgYW5kCiAgICAgLndyaXRlKCkgbWV0aG9kIHRvIG1hdGNoIHRoZSBzdGFuZGFyZCBmaWxlLWxpa2Ugb2JqZWN0IG1ldGhvZHMKICAgICAoYnl0ZXMgY29uc3VtZWQgaW5mb3JtYXRpb24gaXMgbm8gbG9uZ2VyIHJldHVybmVkIGJ5IHRoZSBtZXRob2RzKQoxLjA6IGNoYW5nZWQgZW5jb2RlIENvZGVjIG1ldGhvZCB0byBiZSBzeW1tZXRyaWMgdG8gdGhlIGRlY29kZSBtZXRob2QKICAgICAodGhleSBib3RoIHJldHVybiAob2JqZWN0LCBkYXRhIGNvbnN1bWVkKSBub3cgYW5kIHRodXMgYmVjb21lCiAgICAgaW50ZXJjaGFuZ2VhYmxlKTsgcmVtb3ZlZCBfX2luaXRfXyBtZXRob2Qgb2YgQ29kZWMgY2xhc3MgKHRoZQogICAgIG1ldGhvZHMgYXJlIHN0YXRlbGVzcykgYW5kIG1vdmVkIHRoZSBlcnJvcnMgYXJndW1lbnQgZG93biB0byB0aGUKICAgICBtZXRob2RzOyBtYWRlIHRoZSBDb2RlYyBkZXNpZ24gbW9yZSBnZW5lcmljIHcvciB0byB0eXBlIG9mIGlucHV0CiAgICAgYW5kIG91dHB1dCBvYmplY3RzOyBjaGFuZ2VkIFN0cmVhbVdyaXRlci5mbHVzaCB0byBTdHJlYW1Xcml0ZXIucmVzZXQKICAgICBpbiBvcmRlciB0byBhdm9pZCBvdmVycmlkaW5nIHRoZSBzdHJlYW0ncyAuZmx1c2goKSBtZXRob2Q7CiAgICAgcmVuYW1lZCAuYnJlYWtsaW5lcygpIHRvIC5zcGxpdGxpbmVzKCk7IHJlbmFtZWQgdGhlIG1vZHVsZSB1bmljb2RlYwogICAgIHRvIGNvZGVjczsgbW9kaWZpZWQgdGhlIEZpbGUgSS9PIHNlY3Rpb24gdG8gcmVmZXIgdG8gdGhlIHN0cmVhbSBjb2RlY3MuCjAuOTogY2hhbmdlZCBlcnJvcnMga2V5d29yZCBhcmd1bWVudCBkZWZpbml0aW9uOyBhZGRlZCAncmVwbGFjZScgZXJyb3IKICAgICBoYW5kbGluZzsgY2hhbmdlZCB0aGUgY29kZWMgQVBJcyB0byBhY2NlcHQgYnVmZmVyIGxpa2Ugb2JqZWN0cyBvbgogICAgIGlucHV0OyBzb21lIG1pbm9yIHR5cG8gZml4ZXM7IGFkZGVkIFdoaXRlc3BhY2Ugc2VjdGlvbiBhbmQKICAgICBpbmNsdWRlZCByZWZlcmVuY2VzIGZvciBVbmljb2RlIGNoYXJhY3RlcnMgdGhhdCBoYXZlIHRoZSB3aGl0ZXNwYWNlCiAgICAgYW5kIHRoZSBsaW5lIGJyZWFrIGNoYXJhY3RlcmlzdGljOyBhZGRlZCBub3RlIHRoYXQgc2VhcmNoIGZ1bmN0aW9ucwogICAgIGNhbiBleHBlY3QgbG93ZXItY2FzZSBlbmNvZGluZyBuYW1lczsgZHJvcHBlZCBzbGljaW5nIGFuZCBvZmZzZXRzCiAgICAgaW4gdGhlIGNvZGVjIEFQSXMKMC44OiBhZGRlZCBlbmNvZGluZ3MgcGFja2FnZSBhbmQgcmF3IHVuaWNvZGUgZXNjYXBlIGVuY29kaW5nOyB1bnRhYmlmaWVkCiAgICAgdGhlIHByb3Bvc2FsOyBhZGRlZCBub3RlcyBvbiBVbmljb2RlIGZvcm1hdCBzdHJpbmdzOyBhZGRlZAogICAgIC5icmVha2xpbmVzKCkgbWV0aG9kCjAuNzogYWRkZWQgYSB3aG9sZSBuZXcgc2V0IG9mIGNvZGVjIEFQSXM7IGFkZGVkIGEgZGlmZmVyZW50IGVuY29kZXIKICAgICBsb29rdXAgc2NoZW1lOyBmaXhlZCBzb21lIG5hbWVzCjAuNjogY2hhbmdlZCAicyMiIHRvICJ0IyI7IGNoYW5nZWQgPGRlZmVuY2J1Zj4gdG8gPGRlZmVuY3N0cj4gaG9sZGluZwogICAgIGEgcmVhbCBQeXRob24gc3RyaW5nIG9iamVjdDsgY2hhbmdlZCBCdWZmZXIgSW50ZXJmYWNlIHRvIGRlbGVnYXRlCiAgICAgcmVxdWVzdHMgdG8gPGRlZmVuY3N0cj4ncyBidWZmZXIgaW50ZXJmYWNlOyByZW1vdmVkIHRoZSBleHBsaWNpdAogICAgIHJlZmVyZW5jZSB0byB0aGUgdW5pY29kZWMuY29kZWNzIGRpY3Rpb25hcnkgKHRoZSBtb2R1bGUgY2FuIGltcGxlbWVudAogICAgIHRoaXMgaW4gd2F5IGZpdCBmb3IgdGhlIHB1cnBvc2UpOyByZW1vdmVkIHRoZSBzZXR0YWJsZSBkZWZhdWx0CiAgICAgZW5jb2Rpbmc7IG1vdmUgVW5pY29kZUVycm9yIGZyb20gdW5pY29kZWMgdG8gZXhjZXB0aW9uczsgInMjIgogICAgIG5vdCByZXR1cm5zIHRoZSBpbnRlcm5hbCBkYXRhOyBwYXNzZWQgdGhlIFVDUy0yL1VURi0xNiBjaGVja2luZwogICAgIGZyb20gdGhlIFVuaWNvZGUgY29uc3RydWN0b3IgdG8gdGhlIENvZGVjcwowLjU6IG1vdmVkIHN5cy5ib20gdG8gdW5pY29kZWMuQk9NOyBhZGRlZCBzZWN0aW9ucyBvbiBjYXNlIG1hcHBpbmcsCiAgICAgcHJpdmF0ZSB1c2UgZW5jb2RpbmdzIGFuZCBVbmljb2RlIGNoYXJhY3RlciBwcm9wZXJ0aWVzCjAuNDogYWRkZWQgQ29kZWMgaW50ZXJmYWNlLCBub3RlcyBvbiAlLWZvcm1hdHRpbmcsIGNoYW5nZWQgc29tZSBlbmNvZGluZwogICAgIGRldGFpbHMsIGFkZGVkIGNvbW1lbnRzIG9uIHN0cmVhbSB3cmFwcGVycywgZml4ZWQgc29tZSBkaXNjdXNzaW9uCiAgICAgcG9pbnRzIChtb3N0IGltcG9ydGFudDogSW50ZXJuYWwgRm9ybWF0KSwgY2xhcmlmaWVkIHRoZSAKICAgICAndW5pY29kZS1lc2NhcGUnIGVuY29kaW5nLCBhZGRlZCBlbmNvZGluZyByZWZlcmVuY2VzCjAuMzogYWRkZWQgcmVmZXJlbmNlcywgY29tbWVudHMgb24gY29kZWMgbW9kdWxlcywgdGhlIGludGVybmFsIGZvcm1hdCwKICAgICBiZl9nZXRjaGFyYnVmZmVyIGFuZCB0aGUgUkUgZW5naW5lOyBhZGRlZCAndW5pY29kZS1lc2NhcGUnIGVuY29kaW5nCiAgICAgcHJvcG9zZWQgYnkgVGltIFBldGVycyBhbmQgZml4ZWQgcmVwcih1KSBhY2NvcmRpbmdseQowLjI6IGludGVncmF0ZWQgR3VpZG8ncyBzdWdnZXN0aW9ucywgYWRkZWQgc3RyZWFtIGNvZGVjcyBhbmQgZmlsZQogICAgIHdyYXBwaW5nCjAuMTogZmlyc3QgdmVyc2lvbgoKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCldyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnLCAxOTk5LTIwMDAsIG1hbEBsZW1idXJnLmNvbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=