REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 95.70 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/core/__pycache__/fromnumeric.cpython-37.pyc
Text
Base64
Qg0NCgAAAADB2EZkpIIBAOMAAAAAAAAAAAAAAAAtAAAAQAAAAHNOAwAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZAFkA2wFWgVkAWQDbAZaBmQBZANsB1oIZARkBWwJbQpaCgEAZAZkB2wJbQtaDAEAZAZkCGwJbQ1aDgEAZAZkCWwJbQ9aEAEAZAZkCmwRbRJaEm0TWhNtFFoUbRVaFQEAZAZkC2wJbRZaFgEAZRBqF1oYZAxkDWQOZA9kEGQRZBJkE2QUZBVkFmQXZBhkGWQaZBtkHGQdZB5kH2QgZCFkImQjZCRkJWQmZCdkKGQpZCpkK2QsZC1kLmQvZDBkMWQyZDNkNGQ1ZDZkN2Q4Zy1aGXkKZQVqGlobVwBuHgQAZRxrCpABchABAAEAAQBlHWQDgwFaG1kAbgJYAGUeWh9kOWQ6hABaIGQ7ZDyEAFohZHBkPmQ1hAFaImRxZEBkKYQBWiNkcmRBZBeEAVokZHNkQmQohAFaJWR0ZENkJYQBWiZkRGQ0hABaJ2R1ZEVkN4QBWihkdmRIZCGEAVopZHdkSWQUhAFaKmR4ZEtkMIQBWitkeWRMZBWEAVosZHpkTWQShAFaLWR7ZE5kE4QBWi5kfGRQZCyEAVovZFFkKoQAWjBkfWRSZDGEAVoxZH5kU2QdhAFaMmR/ZFRkNoQBWjNkgGRVZCeEAVo0ZFZkIIQAWjVkV2QthABaNmSBZFhkGYQBWjdkgmRZZBiEAVo4ZANkA2QDZQhqOWYEZFpkM4QBWh5kA2QDZANlCGo5ZgRkW2QjhAFaOmQDZANlCGo5ZgNkXGQvhAFaO2QDZANlCGo5ZgNkXWQOhAFaPGQDZANlCGo5ZgNkXmQRhAFaPWQDZANlCGo5ZgNkX2QNhAFaPmSDZGBkHIQBWj9khGRhZBuEAVpAZIVkYmQkhAFaQWQDZANlCGo5ZgNkY2QPhAFaQmQDZANlCGo5ZgNkZGQQhAFaQ2RlZAyEAFpEZANkA2QDZQhqOWYEZGZkIoQBWkVkhmRnZBqEAVpGZGhkH4QAWkdkaWQmhABaSGSHZGpkLoQBWklkiGRrZBaEAVpKZIlkbGQrhAFaS2QDZANkA2UIajlmBGRtZB6EAVpMZANkA2QDZAFlCGo5ZgVkbmQyhAFaTWQDZANkA2QBZQhqOWYFZG9kOIQBWk5kA1MAKYp6Q01vZHVsZSBjb250YWluaW5nIG5vbi1kZXByZWNhdGVkIGZ1bmN0aW9ucyBib3Jyb3dlZCBmcm9tIE51bWVyaWMuCgrpAAAAACkD2ghkaXZpc2lvbtoPYWJzb2x1dGVfaW1wb3J02g5wcmludF9mdW5jdGlvbk7pAgAAACkB2hlWaXNpYmxlRGVwcmVjYXRpb25XYXJuaW5n6QEAAAApAdoKbXVsdGlhcnJheSkB2gV1bWF0aCkB2gxudW1lcmljdHlwZXMpBNoHYXNhcnJhedoFYXJyYXnaCmFzYW55YXJyYXnaC2NvbmNhdGVuYXRlKQHaCF9tZXRob2Rz2gRhbGVu2gNhbGzaB2FsbHRydWXaBGFtYXjaBGFtaW7aA2FuedoGYXJnbWF42gZhcmdtaW7aDGFyZ3BhcnRpdGlvbtoHYXJnc29ydNoGYXJvdW5k2gZjaG9vc2XaBGNsaXDaCGNvbXByZXNz2gdjdW1wcm9k2gpjdW1wcm9kdWN02gZjdW1zdW3aCGRpYWdvbmFs2gRtZWFu2gRuZGlt2gdub256ZXJv2glwYXJ0aXRpb27aBHByb2TaB3Byb2R1Y3TaA3B0cNoDcHV02gRyYW5r2gVyYXZlbNoGcmVwZWF02gdyZXNoYXBl2gZyZXNpemXaBnJvdW5kX9oMc2VhcmNoc29ydGVk2gVzaGFwZdoEc2l6ZdoIc29tZXRydWXaBHNvcnTaB3NxdWVlemXaA3N0ZNoDc3Vt2ghzd2FwYXhlc9oEdGFrZdoFdHJhY2XaCXRyYW5zcG9zZdoDdmFyYwIAAAAAAAAABgAAAAgAAABPAAAAc1wAAAB5CnwAagB9BFcAbhgEAHQBawpyIgEAAQABAGQAfQRZAG4CWAB0AnQDfACDAXwBgwJ8AnwDjgF9BXwEclh0BHwFdAVqBoMCc1B0A3wFgwF9BXwEfAWDAX0FfAVTACkBTikHWg5fX2FycmF5X3dyYXBfX9oOQXR0cmlidXRlRXJyb3LaB2dldGF0dHJyCwAAANoKaXNpbnN0YW5jZdoCbXXaB25kYXJyYXkpBtoDb2Jq2gZtZXRob2TaBGFyZ3PaBGt3ZHPaBHdyYXDaBnJlc3VsdKkAckgAAAD6SS9vcHQvYWx0L3B5dGhvbjM3L2xpYjY0L3B5dGhvbjMuNy9zaXRlLXBhY2thZ2VzL251bXB5L2NvcmUvZnJvbW51bWVyaWMucHnaB193cmFwaXQqAAAAcxQAAAAAAQIBCgEOAQoBFAEEAQwBCAEIAXJKAAAAYwIAAAAAAAAABAAAAAkAAABPAAAAczwAAAB5EHQAfAB8AYMCfAJ8A44BUwAEAHQBdAJmAmsKcjYBAAEAAQB0A3wAfAFmAnwCngJ8A44BUwBYAGQAUwApAU4pBHI+AAAAcj0AAADaCVR5cGVFcnJvcnJKAAAAKQRyQgAAAHJDAAAAckQAAAByRQAAAHJIAAAAckgAAABySQAAANoJX3dyYXBmdW5jNwAAAHMIAAAAAAECARAJEgFyTAAAANoFcmFpc2VjBQAAAAAAAAAFAAAACAAAAEMAAABzFAAAAHQAfABkAXwBfAJ8A3wEZAKNBlMAKQNhAwcAAAogICAgVGFrZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGFsb25nIGFuIGF4aXMuCgogICAgVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzICJmYW5jeSIgaW5kZXhpbmcgKGluZGV4aW5nIGFycmF5cwogICAgdXNpbmcgYXJyYXlzKTsgaG93ZXZlciwgaXQgY2FuIGJlIGVhc2llciB0byB1c2UgaWYgeW91IG5lZWQgZWxlbWVudHMKICAgIGFsb25nIGEgZ2l2ZW4gYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBzb3VyY2UgYXJyYXkuCiAgICBpbmRpY2VzIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBpbmRpY2VzIG9mIHRoZSB2YWx1ZXMgdG8gZXh0cmFjdC4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICAgICAgQWxzbyBhbGxvdyBzY2FsYXJzIGZvciBpbmRpY2VzLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBUaGUgYXhpcyBvdmVyIHdoaWNoIHRvIHNlbGVjdCB2YWx1ZXMuIEJ5IGRlZmF1bHQsIHRoZSBmbGF0dGVuZWQKICAgICAgICBpbnB1dCBhcnJheSBpcyB1c2VkLgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBJZiBwcm92aWRlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIHBsYWNlZCBpbiB0aGlzIGFycmF5LiBJdCBzaG91bGQKICAgICAgICBiZSBvZiB0aGUgYXBwcm9wcmlhdGUgc2hhcGUgYW5kIGR0eXBlLgogICAgbW9kZSA6IHsncmFpc2UnLCAnd3JhcCcsICdjbGlwJ30sIG9wdGlvbmFsCiAgICAgICAgU3BlY2lmaWVzIGhvdyBvdXQtb2YtYm91bmRzIGluZGljZXMgd2lsbCBiZWhhdmUuCgogICAgICAgICogJ3JhaXNlJyAtLSByYWlzZSBhbiBlcnJvciAoZGVmYXVsdCkKICAgICAgICAqICd3cmFwJyAtLSB3cmFwIGFyb3VuZAogICAgICAgICogJ2NsaXAnIC0tIGNsaXAgdG8gdGhlIHJhbmdlCgogICAgICAgICdjbGlwJyBtb2RlIG1lYW5zIHRoYXQgYWxsIGluZGljZXMgdGhhdCBhcmUgdG9vIGxhcmdlIGFyZSByZXBsYWNlZAogICAgICAgIGJ5IHRoZSBpbmRleCB0aGF0IGFkZHJlc3NlcyB0aGUgbGFzdCBlbGVtZW50IGFsb25nIHRoYXQgYXhpcy4gTm90ZQogICAgICAgIHRoYXQgdGhpcyBkaXNhYmxlcyBpbmRleGluZyB3aXRoIG5lZ2F0aXZlIG51bWJlcnMuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgc3ViYXJyYXkgOiBuZGFycmF5CiAgICAgICAgVGhlIHJldHVybmVkIGFycmF5IGhhcyB0aGUgc2FtZSB0eXBlIGFzIGBhYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGNvbXByZXNzIDogVGFrZSBlbGVtZW50cyB1c2luZyBhIGJvb2xlYW4gbWFzawogICAgbmRhcnJheS50YWtlIDogZXF1aXZhbGVudCBtZXRob2QKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gWzQsIDMsIDUsIDcsIDYsIDhdCiAgICA+Pj4gaW5kaWNlcyA9IFswLCAxLCA0XQogICAgPj4+IG5wLnRha2UoYSwgaW5kaWNlcykKICAgIGFycmF5KFs0LCAzLCA2XSkKCiAgICBJbiB0aGlzIGV4YW1wbGUgaWYgYGFgIGlzIGFuIG5kYXJyYXksICJmYW5jeSIgaW5kZXhpbmcgY2FuIGJlIHVzZWQuCgogICAgPj4+IGEgPSBucC5hcnJheShhKQogICAgPj4+IGFbaW5kaWNlc10KICAgIGFycmF5KFs0LCAzLCA2XSkKCiAgICBJZiBgaW5kaWNlc2AgaXMgbm90IG9uZSBkaW1lbnNpb25hbCwgdGhlIG91dHB1dCBhbHNvIGhhcyB0aGVzZSBkaW1lbnNpb25zLgoKICAgID4+PiBucC50YWtlKGEsIFtbMCwgMV0sIFsyLCAzXV0pCiAgICBhcnJheShbWzQsIDNdLAogICAgICAgICAgIFs1LCA3XV0pCiAgICByOQAAACkD2gRheGlz2gNvdXTaBG1vZGUpAXJMAAAAKQXaAWHaB2luZGljZXNyTgAAAHJPAAAAclAAAABySAAAAHJIAAAAckkAAAByOQAAAEYAAABzAgAAAABA2gFDYwMAAAAAAAAAAwAAAAYAAABDAAAAcxAAAAB0AHwAZAF8AXwCZAKNBFMAKQNhog0AAAogICAgR2l2ZXMgYSBuZXcgc2hhcGUgdG8gYW4gYXJyYXkgd2l0aG91dCBjaGFuZ2luZyBpdHMgZGF0YS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5IHRvIGJlIHJlc2hhcGVkLgogICAgbmV3c2hhcGUgOiBpbnQgb3IgdHVwbGUgb2YgaW50cwogICAgICAgIFRoZSBuZXcgc2hhcGUgc2hvdWxkIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgb3JpZ2luYWwgc2hhcGUuIElmCiAgICAgICAgYW4gaW50ZWdlciwgdGhlbiB0aGUgcmVzdWx0IHdpbGwgYmUgYSAxLUQgYXJyYXkgb2YgdGhhdCBsZW5ndGguCiAgICAgICAgT25lIHNoYXBlIGRpbWVuc2lvbiBjYW4gYmUgLTEuIEluIHRoaXMgY2FzZSwgdGhlIHZhbHVlIGlzCiAgICAgICAgaW5mZXJyZWQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBhbmQgcmVtYWluaW5nIGRpbWVuc2lvbnMuCiAgICBvcmRlciA6IHsnQycsICdGJywgJ0EnfSwgb3B0aW9uYWwKICAgICAgICBSZWFkIHRoZSBlbGVtZW50cyBvZiBgYWAgdXNpbmcgdGhpcyBpbmRleCBvcmRlciwgYW5kIHBsYWNlIHRoZQogICAgICAgIGVsZW1lbnRzIGludG8gdGhlIHJlc2hhcGVkIGFycmF5IHVzaW5nIHRoaXMgaW5kZXggb3JkZXIuICAnQycKICAgICAgICBtZWFucyB0byByZWFkIC8gd3JpdGUgdGhlIGVsZW1lbnRzIHVzaW5nIEMtbGlrZSBpbmRleCBvcmRlciwKICAgICAgICB3aXRoIHRoZSBsYXN0IGF4aXMgaW5kZXggY2hhbmdpbmcgZmFzdGVzdCwgYmFjayB0byB0aGUgZmlyc3QKICAgICAgICBheGlzIGluZGV4IGNoYW5naW5nIHNsb3dlc3QuICdGJyBtZWFucyB0byByZWFkIC8gd3JpdGUgdGhlCiAgICAgICAgZWxlbWVudHMgdXNpbmcgRm9ydHJhbi1saWtlIGluZGV4IG9yZGVyLCB3aXRoIHRoZSBmaXJzdCBpbmRleAogICAgICAgIGNoYW5naW5nIGZhc3Rlc3QsIGFuZCB0aGUgbGFzdCBpbmRleCBjaGFuZ2luZyBzbG93ZXN0LiBOb3RlIHRoYXQKICAgICAgICB0aGUgJ0MnIGFuZCAnRicgb3B0aW9ucyB0YWtlIG5vIGFjY291bnQgb2YgdGhlIG1lbW9yeSBsYXlvdXQgb2YKICAgICAgICB0aGUgdW5kZXJseWluZyBhcnJheSwgYW5kIG9ubHkgcmVmZXIgdG8gdGhlIG9yZGVyIG9mIGluZGV4aW5nLgogICAgICAgICdBJyBtZWFucyB0byByZWFkIC8gd3JpdGUgdGhlIGVsZW1lbnRzIGluIEZvcnRyYW4tbGlrZSBpbmRleAogICAgICAgIG9yZGVyIGlmIGBhYCBpcyBGb3J0cmFuICpjb250aWd1b3VzKiBpbiBtZW1vcnksIEMtbGlrZSBvcmRlcgogICAgICAgIG90aGVyd2lzZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXNoYXBlZF9hcnJheSA6IG5kYXJyYXkKICAgICAgICBUaGlzIHdpbGwgYmUgYSBuZXcgdmlldyBvYmplY3QgaWYgcG9zc2libGU7IG90aGVyd2lzZSwgaXQgd2lsbAogICAgICAgIGJlIGEgY29weS4gIE5vdGUgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIHRoZSAqbWVtb3J5IGxheW91dCogKEMtIG9yCiAgICAgICAgRm9ydHJhbi0gY29udGlndW91cykgb2YgdGhlIHJldHVybmVkIGFycmF5LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5yZXNoYXBlIDogRXF1aXZhbGVudCBtZXRob2QuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBJdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUgc2hhcGUgb2YgYW4gYXJyYXkgd2l0aG91dAogICAgY29weWluZyB0aGUgZGF0YS4gSWYgeW91IHdhbnQgYW4gZXJyb3IgdG8gYmUgcmFpc2UgaWYgdGhlIGRhdGEgaXMgY29waWVkLAogICAgeW91IHNob3VsZCBhc3NpZ24gdGhlIG5ldyBzaGFwZSB0byB0aGUgc2hhcGUgYXR0cmlidXRlIG9mIHRoZSBhcnJheTo6CgogICAgID4+PiBhID0gbnAuemVyb3MoKDEwLCAyKSkKICAgICAjIEEgdHJhbnNwb3NlIG1ha2UgdGhlIGFycmF5IG5vbi1jb250aWd1b3VzCiAgICAgPj4+IGIgPSBhLlQKICAgICAjIFRha2luZyBhIHZpZXcgbWFrZXMgaXQgcG9zc2libGUgdG8gbW9kaWZ5IHRoZSBzaGFwZSB3aXRob3V0IG1vZGlmeWluZwogICAgICMgdGhlIGluaXRpYWwgb2JqZWN0LgogICAgID4+PiBjID0gYi52aWV3KCkKICAgICA+Pj4gYy5zaGFwZSA9ICgyMCkKICAgICBBdHRyaWJ1dGVFcnJvcjogaW5jb21wYXRpYmxlIHNoYXBlIGZvciBhIG5vbi1jb250aWd1b3VzIGFycmF5CgogICAgVGhlIGBvcmRlcmAga2V5d29yZCBnaXZlcyB0aGUgaW5kZXggb3JkZXJpbmcgYm90aCBmb3IgKmZldGNoaW5nKiB0aGUgdmFsdWVzCiAgICBmcm9tIGBhYCwgYW5kIHRoZW4gKnBsYWNpbmcqIHRoZSB2YWx1ZXMgaW50byB0aGUgb3V0cHV0IGFycmF5LgogICAgRm9yIGV4YW1wbGUsIGxldCdzIHNheSB5b3UgaGF2ZSBhbiBhcnJheToKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg2KS5yZXNoYXBlKCgzLCAyKSkKICAgID4+PiBhCiAgICBhcnJheShbWzAsIDFdLAogICAgICAgICAgIFsyLCAzXSwKICAgICAgICAgICBbNCwgNV1dKQoKICAgIFlvdSBjYW4gdGhpbmsgb2YgcmVzaGFwaW5nIGFzIGZpcnN0IHJhdmVsaW5nIHRoZSBhcnJheSAodXNpbmcgdGhlIGdpdmVuCiAgICBpbmRleCBvcmRlciksIHRoZW4gaW5zZXJ0aW5nIHRoZSBlbGVtZW50cyBmcm9tIHRoZSByYXZlbGVkIGFycmF5IGludG8gdGhlCiAgICBuZXcgYXJyYXkgdXNpbmcgdGhlIHNhbWUga2luZCBvZiBpbmRleCBvcmRlcmluZyBhcyB3YXMgdXNlZCBmb3IgdGhlCiAgICByYXZlbGluZy4KCiAgICA+Pj4gbnAucmVzaGFwZShhLCAoMiwgMykpICMgQy1saWtlIGluZGV4IG9yZGVyaW5nCiAgICBhcnJheShbWzAsIDEsIDJdLAogICAgICAgICAgIFszLCA0LCA1XV0pCiAgICA+Pj4gbnAucmVzaGFwZShucC5yYXZlbChhKSwgKDIsIDMpKSAjIGVxdWl2YWxlbnQgdG8gQyByYXZlbCB0aGVuIEMgcmVzaGFwZQogICAgYXJyYXkoW1swLCAxLCAyXSwKICAgICAgICAgICBbMywgNCwgNV1dKQogICAgPj4+IG5wLnJlc2hhcGUoYSwgKDIsIDMpLCBvcmRlcj0nRicpICMgRm9ydHJhbi1saWtlIGluZGV4IG9yZGVyaW5nCiAgICBhcnJheShbWzAsIDQsIDNdLAogICAgICAgICAgIFsyLCAxLCA1XV0pCiAgICA+Pj4gbnAucmVzaGFwZShucC5yYXZlbChhLCBvcmRlcj0nRicpLCAoMiwgMyksIG9yZGVyPSdGJykKICAgIGFycmF5KFtbMCwgNCwgM10sCiAgICAgICAgICAgWzIsIDEsIDVdXSkKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLDIsM10sIFs0LDUsNl1dKQogICAgPj4+IG5wLnJlc2hhcGUoYSwgNikKICAgIGFycmF5KFsxLCAyLCAzLCA0LCA1LCA2XSkKICAgID4+PiBucC5yZXNoYXBlKGEsIDYsIG9yZGVyPSdGJykKICAgIGFycmF5KFsxLCA0LCAyLCA1LCAzLCA2XSkKCiAgICA+Pj4gbnAucmVzaGFwZShhLCAoMywtMSkpICAgICAgICMgdGhlIHVuc3BlY2lmaWVkIHZhbHVlIGlzIGluZmVycmVkIHRvIGJlIDIKICAgIGFycmF5KFtbMSwgMl0sCiAgICAgICAgICAgWzMsIDRdLAogICAgICAgICAgIFs1LCA2XV0pCiAgICByLQAAACkB2gVvcmRlcikBckwAAAApA3JRAAAAWghuZXdzaGFwZXJUAAAAckgAAABySAAAAHJJAAAAci0AAACKAAAAcwIAAAAAXmMEAAAAAAAAAAQAAAAHAAAAQwAAAHMSAAAAdAB8AGQBfAF8AnwDZAKNBVMAKQNhcRIAAAogICAgQ29uc3RydWN0IGFuIGFycmF5IGZyb20gYW4gaW5kZXggYXJyYXkgYW5kIGEgc2V0IG9mIGFycmF5cyB0byBjaG9vc2UgZnJvbS4KCiAgICBGaXJzdCBvZiBhbGwsIGlmIGNvbmZ1c2VkIG9yIHVuY2VydGFpbiwgZGVmaW5pdGVseSBsb29rIGF0IHRoZSBFeGFtcGxlcyAtCiAgICBpbiBpdHMgZnVsbCBnZW5lcmFsaXR5LCB0aGlzIGZ1bmN0aW9uIGlzIGxlc3Mgc2ltcGxlIHRoYW4gaXQgbWlnaHQKICAgIHNlZW0gZnJvbSB0aGUgZm9sbG93aW5nIGNvZGUgZGVzY3JpcHRpb24gKGJlbG93IG5kaSA9CiAgICBgbnVtcHkubGliLmluZGV4X3RyaWNrc2ApOgoKICAgIGBgbnAuY2hvb3NlKGEsYykgPT0gbnAuYXJyYXkoW2NbYVtJXV1bSV0gZm9yIEkgaW4gbmRpLm5kaW5kZXgoYS5zaGFwZSldKWBgLgoKICAgIEJ1dCB0aGlzIG9taXRzIHNvbWUgc3VidGxldGllcy4gIEhlcmUgaXMgYSBmdWxseSBnZW5lcmFsIHN1bW1hcnk6CgogICAgR2l2ZW4gYW4gImluZGV4IiBhcnJheSAoYGFgKSBvZiBpbnRlZ2VycyBhbmQgYSBzZXF1ZW5jZSBvZiBgbmAgYXJyYXlzCiAgICAoYGNob2ljZXNgKSwgYGFgIGFuZCBlYWNoIGNob2ljZSBhcnJheSBhcmUgZmlyc3QgYnJvYWRjYXN0LCBhcyBuZWNlc3NhcnksCiAgICB0byBhcnJheXMgb2YgYSBjb21tb24gc2hhcGU7IGNhbGxpbmcgdGhlc2UgKkJhKiBhbmQgKkJjaG9pY2VzW2ldLCBpID0KICAgIDAsLi4uLG4tMSogd2UgaGF2ZSB0aGF0LCBuZWNlc3NhcmlseSwgYGBCYS5zaGFwZSA9PSBCY2hvaWNlc1tpXS5zaGFwZWBgCiAgICBmb3IgZWFjaCBgaWAuICBUaGVuLCBhIG5ldyBhcnJheSB3aXRoIHNoYXBlIGBgQmEuc2hhcGVgYCBpcyBjcmVhdGVkIGFzCiAgICBmb2xsb3dzOgoKICAgICogaWYgYGBtb2RlPXJhaXNlYGAgKHRoZSBkZWZhdWx0KSwgdGhlbiwgZmlyc3Qgb2YgYWxsLCBlYWNoIGVsZW1lbnQgb2YKICAgICAgYGFgIChhbmQgdGh1cyBgQmFgKSBtdXN0IGJlIGluIHRoZSByYW5nZSBgWzAsIG4tMV1gOyBub3csIHN1cHBvc2UgdGhhdAogICAgICBgaWAgKGluIHRoYXQgcmFuZ2UpIGlzIHRoZSB2YWx1ZSBhdCB0aGUgYChqMCwgajEsIC4uLiwgam0pYCBwb3NpdGlvbgogICAgICBpbiBgQmFgIC0gdGhlbiB0aGUgdmFsdWUgYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gdGhlIG5ldyBhcnJheSBpcyB0aGUKICAgICAgdmFsdWUgaW4gYEJjaG9pY2VzW2ldYCBhdCB0aGF0IHNhbWUgcG9zaXRpb247CgogICAgKiBpZiBgYG1vZGU9d3JhcGBgLCB2YWx1ZXMgaW4gYGFgIChhbmQgdGh1cyBgQmFgKSBtYXkgYmUgYW55IChzaWduZWQpCiAgICAgIGludGVnZXI7IG1vZHVsYXIgYXJpdGhtZXRpYyBpcyB1c2VkIHRvIG1hcCBpbnRlZ2VycyBvdXRzaWRlIHRoZSByYW5nZQogICAgICBgWzAsIG4tMV1gIGJhY2sgaW50byB0aGF0IHJhbmdlOyBhbmQgdGhlbiB0aGUgbmV3IGFycmF5IGlzIGNvbnN0cnVjdGVkCiAgICAgIGFzIGFib3ZlOwoKICAgICogaWYgYGBtb2RlPWNsaXBgYCwgdmFsdWVzIGluIGBhYCAoYW5kIHRodXMgYEJhYCkgbWF5IGJlIGFueSAoc2lnbmVkKQogICAgICBpbnRlZ2VyOyBuZWdhdGl2ZSBpbnRlZ2VycyBhcmUgbWFwcGVkIHRvIDA7IHZhbHVlcyBncmVhdGVyIHRoYW4gYG4tMWAKICAgICAgYXJlIG1hcHBlZCB0byBgbi0xYDsgYW5kIHRoZW4gdGhlIG5ldyBhcnJheSBpcyBjb25zdHJ1Y3RlZCBhcyBhYm92ZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogaW50IGFycmF5CiAgICAgICAgVGhpcyBhcnJheSBtdXN0IGNvbnRhaW4gaW50ZWdlcnMgaW4gYFswLCBuLTFdYCwgd2hlcmUgYG5gIGlzIHRoZSBudW1iZXIKICAgICAgICBvZiBjaG9pY2VzLCB1bmxlc3MgYGBtb2RlPXdyYXBgYCBvciBgYG1vZGU9Y2xpcGBgLCBpbiB3aGljaCBjYXNlcyBhbnkKICAgICAgICBpbnRlZ2VycyBhcmUgcGVybWlzc2libGUuCiAgICBjaG9pY2VzIDogc2VxdWVuY2Ugb2YgYXJyYXlzCiAgICAgICAgQ2hvaWNlIGFycmF5cy4gYGFgIGFuZCBhbGwgb2YgdGhlIGNob2ljZXMgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIHRoZQogICAgICAgIHNhbWUgc2hhcGUuICBJZiBgY2hvaWNlc2AgaXMgaXRzZWxmIGFuIGFycmF5IChub3QgcmVjb21tZW5kZWQpLCB0aGVuCiAgICAgICAgaXRzIG91dGVybW9zdCBkaW1lbnNpb24gKGkuZS4sIHRoZSBvbmUgY29ycmVzcG9uZGluZyB0bwogICAgICAgIGBgY2hvaWNlcy5zaGFwZVswXWBgKSBpcyB0YWtlbiBhcyBkZWZpbmluZyB0aGUgInNlcXVlbmNlIi4KICAgIG91dCA6IGFycmF5LCBvcHRpb25hbAogICAgICAgIElmIHByb3ZpZGVkLCB0aGUgcmVzdWx0IHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGlzIGFycmF5LiBJdCBzaG91bGQKICAgICAgICBiZSBvZiB0aGUgYXBwcm9wcmlhdGUgc2hhcGUgYW5kIGR0eXBlLgogICAgbW9kZSA6IHsncmFpc2UnIChkZWZhdWx0KSwgJ3dyYXAnLCAnY2xpcCd9LCBvcHRpb25hbAogICAgICAgIFNwZWNpZmllcyBob3cgaW5kaWNlcyBvdXRzaWRlIGBbMCwgbi0xXWAgd2lsbCBiZSB0cmVhdGVkOgoKICAgICAgICAgICogJ3JhaXNlJyA6IGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQKICAgICAgICAgICogJ3dyYXAnIDogdmFsdWUgYmVjb21lcyB2YWx1ZSBtb2QgYG5gCiAgICAgICAgICAqICdjbGlwJyA6IHZhbHVlcyA8IDAgYXJlIG1hcHBlZCB0byAwLCB2YWx1ZXMgPiBuLTEgYXJlIG1hcHBlZCB0byBuLTEKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBtZXJnZWRfYXJyYXkgOiBhcnJheQogICAgICAgIFRoZSBtZXJnZWQgcmVzdWx0LgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yOiBzaGFwZSBtaXNtYXRjaAogICAgICAgIElmIGBhYCBhbmQgZWFjaCBjaG9pY2UgYXJyYXkgYXJlIG5vdCBhbGwgYnJvYWRjYXN0YWJsZSB0byB0aGUgc2FtZQogICAgICAgIHNoYXBlLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5jaG9vc2UgOiBlcXVpdmFsZW50IG1ldGhvZAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2YgbWlzaW50ZXJwcmV0YXRpb24sIGV2ZW4gdGhvdWdoIHRoZSBmb2xsb3dpbmcKICAgICJhYnVzZSIgaXMgbm9taW5hbGx5IHN1cHBvcnRlZCwgYGNob2ljZXNgIHNob3VsZCBuZWl0aGVyIGJlLCBub3IgYmUKICAgIHRob3VnaHQgb2YgYXMsIGEgc2luZ2xlIGFycmF5LCBpLmUuLCB0aGUgb3V0ZXJtb3N0IHNlcXVlbmNlLWxpa2UgY29udGFpbmVyCiAgICBzaG91bGQgYmUgZWl0aGVyIGEgbGlzdCBvciBhIHR1cGxlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQoKICAgID4+PiBjaG9pY2VzID0gW1swLCAxLCAyLCAzXSwgWzEwLCAxMSwgMTIsIDEzXSwKICAgIC4uLiAgIFsyMCwgMjEsIDIyLCAyM10sIFszMCwgMzEsIDMyLCAzM11dCiAgICA+Pj4gbnAuY2hvb3NlKFsyLCAzLCAxLCAwXSwgY2hvaWNlcwogICAgLi4uICMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHJlc3VsdCB3aWxsIGJlIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZQogICAgLi4uICMgdGhpcmQgKDIrMSkgImFycmF5IiBpbiBjaG9pY2VzLCBuYW1lbHksIDIwOyB0aGUgc2Vjb25kIGVsZW1lbnQKICAgIC4uLiAjIHdpbGwgYmUgdGhlIHNlY29uZCBlbGVtZW50IG9mIHRoZSBmb3VydGggKDMrMSkgY2hvaWNlIGFycmF5LCBpLmUuLAogICAgLi4uICMgMzEsIGV0Yy4KICAgIC4uLiApCiAgICBhcnJheShbMjAsIDMxLCAxMiwgIDNdKQogICAgPj4+IG5wLmNob29zZShbMiwgNCwgMSwgMF0sIGNob2ljZXMsIG1vZGU9J2NsaXAnKSAjIDQgZ29lcyB0byAzICg0LTEpCiAgICBhcnJheShbMjAsIDMxLCAxMiwgIDNdKQogICAgPj4+ICMgYmVjYXVzZSB0aGVyZSBhcmUgNCBjaG9pY2UgYXJyYXlzCiAgICA+Pj4gbnAuY2hvb3NlKFsyLCA0LCAxLCAwXSwgY2hvaWNlcywgbW9kZT0nd3JhcCcpICMgNCBnb2VzIHRvICg0IG1vZCA0KQogICAgYXJyYXkoWzIwLCAgMSwgMTIsICAzXSkKICAgID4+PiAjIGkuZS4sIDAKCiAgICBBIGNvdXBsZSBleGFtcGxlcyBpbGx1c3RyYXRpbmcgaG93IGNob29zZSBicm9hZGNhc3RzOgoKICAgID4+PiBhID0gW1sxLCAwLCAxXSwgWzAsIDEsIDBdLCBbMSwgMCwgMV1dCiAgICA+Pj4gY2hvaWNlcyA9IFstMTAsIDEwXQogICAgPj4+IG5wLmNob29zZShhLCBjaG9pY2VzKQogICAgYXJyYXkoW1sgMTAsIC0xMCwgIDEwXSwKICAgICAgICAgICBbLTEwLCAgMTAsIC0xMF0sCiAgICAgICAgICAgWyAxMCwgLTEwLCAgMTBdXSkKCiAgICA+Pj4gIyBXaXRoIHRoYW5rcyB0byBBbm5lIEFyY2hpYmFsZAogICAgPj4+IGEgPSBucC5hcnJheShbMCwgMV0pLnJlc2hhcGUoKDIsMSwxKSkKICAgID4+PiBjMSA9IG5wLmFycmF5KFsxLCAyLCAzXSkucmVzaGFwZSgoMSwzLDEpKQogICAgPj4+IGMyID0gbnAuYXJyYXkoWy0xLCAtMiwgLTMsIC00LCAtNV0pLnJlc2hhcGUoKDEsMSw1KSkKICAgID4+PiBucC5jaG9vc2UoYSwgKGMxLCBjMikpICMgcmVzdWx0IGlzIDJ4M3g1LCByZXNbMCw6LDpdPWMxLCByZXNbMSw6LDpdPWMyCiAgICBhcnJheShbW1sgMSwgIDEsICAxLCAgMSwgIDFdLAogICAgICAgICAgICBbIDIsICAyLCAgMiwgIDIsICAyXSwKICAgICAgICAgICAgWyAzLCAgMywgIDMsICAzLCAgM11dLAogICAgICAgICAgIFtbLTEsIC0yLCAtMywgLTQsIC01XSwKICAgICAgICAgICAgWy0xLCAtMiwgLTMsIC00LCAtNV0sCiAgICAgICAgICAgIFstMSwgLTIsIC0zLCAtNCwgLTVdXV0pCgogICAgchsAAAApAnJPAAAAclAAAAApAXJMAAAAKQRyUQAAANoHY2hvaWNlc3JPAAAAclAAAABySAAAAHJIAAAAckkAAAByGwAAAOsAAABzAgAAAAB3YwMAAAAAAAAAAwAAAAYAAABDAAAAcxAAAAB0AHwAZAF8AXwCZAKNBFMAKQNh1gMAAAogICAgUmVwZWF0IGVsZW1lbnRzIG9mIGFuIGFycmF5LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXkuCiAgICByZXBlYXRzIDogaW50IG9yIGFycmF5IG9mIGludHMKICAgICAgICBUaGUgbnVtYmVyIG9mIHJlcGV0aXRpb25zIGZvciBlYWNoIGVsZW1lbnQuICBgcmVwZWF0c2AgaXMgYnJvYWRjYXN0ZWQKICAgICAgICB0byBmaXQgdGhlIHNoYXBlIG9mIHRoZSBnaXZlbiBheGlzLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBUaGUgYXhpcyBhbG9uZyB3aGljaCB0byByZXBlYXQgdmFsdWVzLiAgQnkgZGVmYXVsdCwgdXNlIHRoZQogICAgICAgIGZsYXR0ZW5lZCBpbnB1dCBhcnJheSwgYW5kIHJldHVybiBhIGZsYXQgb3V0cHV0IGFycmF5LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHJlcGVhdGVkX2FycmF5IDogbmRhcnJheQogICAgICAgIE91dHB1dCBhcnJheSB3aGljaCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGFgLCBleGNlcHQgYWxvbmcKICAgICAgICB0aGUgZ2l2ZW4gYXhpcy4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHRpbGUgOiBUaWxlIGFuIGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLnJlcGVhdCgzLCA0KQogICAgYXJyYXkoWzMsIDMsIDMsIDNdKQogICAgPj4+IHggPSBucC5hcnJheShbWzEsMl0sWzMsNF1dKQogICAgPj4+IG5wLnJlcGVhdCh4LCAyKQogICAgYXJyYXkoWzEsIDEsIDIsIDIsIDMsIDMsIDQsIDRdKQogICAgPj4+IG5wLnJlcGVhdCh4LCAzLCBheGlzPTEpCiAgICBhcnJheShbWzEsIDEsIDEsIDIsIDIsIDJdLAogICAgICAgICAgIFszLCAzLCAzLCA0LCA0LCA0XV0pCiAgICA+Pj4gbnAucmVwZWF0KHgsIFsxLCAyXSwgYXhpcz0wKQogICAgYXJyYXkoW1sxLCAyXSwKICAgICAgICAgICBbMywgNF0sCiAgICAgICAgICAgWzMsIDRdXSkKCiAgICByLAAAACkBck4AAAAp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QAAAAHwCZAFrCHIadAB8AIMBoAGhAH0AZAJ9Am4QdAB8AIMBagJkA2QEjQF9AHwAagN8AXwCfAN8BGQFjQQBAHwAUwApBmF9DAAACiAgICBSZXR1cm4gYSBwYXJ0aXRpb25lZCBjb3B5IG9mIGFuIGFycmF5LgoKICAgIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBhcnJheSB3aXRoIGl0cyBlbGVtZW50cyByZWFycmFuZ2VkIGluIHN1Y2ggYQogICAgd2F5IHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IGluIGstdGggcG9zaXRpb24gaXMgaW4gdGhlCiAgICBwb3NpdGlvbiBpdCB3b3VsZCBiZSBpbiBhIHNvcnRlZCBhcnJheS4gQWxsIGVsZW1lbnRzIHNtYWxsZXIgdGhhbgogICAgdGhlIGstdGggZWxlbWVudCBhcmUgbW92ZWQgYmVmb3JlIHRoaXMgZWxlbWVudCBhbmQgYWxsIGVxdWFsIG9yCiAgICBncmVhdGVyIGFyZSBtb3ZlZCBiZWhpbmQgaXQuIFRoZSBvcmRlcmluZyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHR3bwogICAgcGFydGl0aW9ucyBpcyB1bmRlZmluZWQuCgogICAgLi4gdmVyc2lvbmFkZGVkOjogMS44LjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5IHRvIGJlIHNvcnRlZC4KICAgIGt0aCA6IGludCBvciBzZXF1ZW5jZSBvZiBpbnRzCiAgICAgICAgRWxlbWVudCBpbmRleCB0byBwYXJ0aXRpb24gYnkuIFRoZSBrLXRoIHZhbHVlIG9mIHRoZSBlbGVtZW50CiAgICAgICAgd2lsbCBiZSBpbiBpdHMgZmluYWwgc29ydGVkIHBvc2l0aW9uIGFuZCBhbGwgc21hbGxlciBlbGVtZW50cwogICAgICAgIHdpbGwgYmUgbW92ZWQgYmVmb3JlIGl0IGFuZCBhbGwgZXF1YWwgb3IgZ3JlYXRlciBlbGVtZW50cyBiZWhpbmQKICAgICAgICBpdC4gVGhlIG9yZGVyIGFsbCBlbGVtZW50cyBpbiB0aGUgcGFydGl0aW9ucyBpcyB1bmRlZmluZWQuIElmCiAgICAgICAgcHJvdmlkZWQgd2l0aCBhIHNlcXVlbmNlIG9mIGstdGggaXQgd2lsbCBwYXJ0aXRpb24gYWxsIGVsZW1lbnRzCiAgICAgICAgaW5kZXhlZCBieSBrLXRoICBvZiB0aGVtIGludG8gdGhlaXIgc29ydGVkIHBvc2l0aW9uIGF0IG9uY2UuCiAgICBheGlzIDogaW50IG9yIE5vbmUsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byBzb3J0LiBJZiBOb25lLCB0aGUgYXJyYXkgaXMgZmxhdHRlbmVkIGJlZm9yZQogICAgICAgIHNvcnRpbmcuIFRoZSBkZWZhdWx0IGlzIC0xLCB3aGljaCBzb3J0cyBhbG9uZyB0aGUgbGFzdCBheGlzLgogICAga2luZCA6IHsnaW50cm9zZWxlY3QnfSwgb3B0aW9uYWwKICAgICAgICBTZWxlY3Rpb24gYWxnb3JpdGhtLiBEZWZhdWx0IGlzICdpbnRyb3NlbGVjdCcuCiAgICBvcmRlciA6IHN0ciBvciBsaXN0IG9mIHN0ciwgb3B0aW9uYWwKICAgICAgICBXaGVuIGBhYCBpcyBhbiBhcnJheSB3aXRoIGZpZWxkcyBkZWZpbmVkLCB0aGlzIGFyZ3VtZW50CiAgICAgICAgc3BlY2lmaWVzIHdoaWNoIGZpZWxkcyB0byBjb21wYXJlIGZpcnN0LCBzZWNvbmQsIGV0Yy4gIEEgc2luZ2xlCiAgICAgICAgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZy4gIE5vdCBhbGwgZmllbGRzIG5lZWQgYmUKICAgICAgICBzcGVjaWZpZWQsIGJ1dCB1bnNwZWNpZmllZCBmaWVsZHMgd2lsbCBzdGlsbCBiZSB1c2VkLCBpbiB0aGUKICAgICAgICBvcmRlciBpbiB3aGljaCB0aGV5IGNvbWUgdXAgaW4gdGhlIGR0eXBlLCB0byBicmVhayB0aWVzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHBhcnRpdGlvbmVkX2FycmF5IDogbmRhcnJheQogICAgICAgIEFycmF5IG9mIHRoZSBzYW1lIHR5cGUgYW5kIHNoYXBlIGFzIGBhYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkucGFydGl0aW9uIDogTWV0aG9kIHRvIHNvcnQgYW4gYXJyYXkgaW4tcGxhY2UuCiAgICBhcmdwYXJ0aXRpb24gOiBJbmRpcmVjdCBwYXJ0aXRpb24uCiAgICBzb3J0IDogRnVsbCBzb3J0aW5nCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgdmFyaW91cyBzZWxlY3Rpb24gYWxnb3JpdGhtcyBhcmUgY2hhcmFjdGVyaXplZCBieSB0aGVpciBhdmVyYWdlCiAgICBzcGVlZCwgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSwgd29yayBzcGFjZSBzaXplLCBhbmQgd2hldGhlciB0aGV5IGFyZQogICAgc3RhYmxlLiBBIHN0YWJsZSBzb3J0IGtlZXBzIGl0ZW1zIHdpdGggdGhlIHNhbWUga2V5IGluIHRoZSBzYW1lCiAgICByZWxhdGl2ZSBvcmRlci4gVGhlIGF2YWlsYWJsZSBhbGdvcml0aG1zIGhhdmUgdGhlIGZvbGxvd2luZwogICAgcHJvcGVydGllczoKCiAgICA9PT09PT09PT09PT09PT09PSA9PT09PT09ID09PT09PT09PT09PT0gPT09PT09PT09PT09ID09PT09PT0KICAgICAgIGtpbmQgICAgICAgICAgICBzcGVlZCAgIHdvcnN0IGNhc2UgICAgd29yayBzcGFjZSAgc3RhYmxlCiAgICA9PT09PT09PT09PT09PT09PSA9PT09PT09ID09PT09PT09PT09PT0gPT09PT09PT09PT09ID09PT09PT0KICAgICdpbnRyb3NlbGVjdCcgICAgICAgIDEgICAgICAgIE8obikgICAgICAgICAgIDAgICAgICAgICBubwogICAgPT09PT09PT09PT09PT09PT0gPT09PT09PSA9PT09PT09PT09PT09ID09PT09PT09PT09PSA9PT09PT09CgogICAgQWxsIHRoZSBwYXJ0aXRpb24gYWxnb3JpdGhtcyBtYWtlIHRlbXBvcmFyeSBjb3BpZXMgb2YgdGhlIGRhdGEgd2hlbgogICAgcGFydGl0aW9uaW5nIGFsb25nIGFueSBidXQgdGhlIGxhc3QgYXhpcy4gIENvbnNlcXVlbnRseSwKICAgIHBhcnRpdGlvbmluZyBhbG9uZyB0aGUgbGFzdCBheGlzIGlzIGZhc3RlciBhbmQgdXNlcyBsZXNzIHNwYWNlIHRoYW4KICAgIHBhcnRpdGlvbmluZyBhbG9uZyBhbnkgb3RoZXIgYXhpcy4KCiAgICBUaGUgc29ydCBvcmRlciBmb3IgY29tcGxleCBudW1iZXJzIGlzIGxleGljb2dyYXBoaWMuIElmIGJvdGggdGhlCiAgICByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlIG5vbi1uYW4gdGhlbiB0aGUgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieQogICAgdGhlIHJlYWwgcGFydHMgZXhjZXB0IHdoZW4gdGhleSBhcmUgZXF1YWwsIGluIHdoaWNoIGNhc2UgdGhlIG9yZGVyCiAgICBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBpbWFnaW5hcnkgcGFydHMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFszLCA0LCAyLCAxXSkKICAgID4+PiBucC5wYXJ0aXRpb24oYSwgMykKICAgIGFycmF5KFsyLCAxLCAzLCA0XSkKCiAgICA+Pj4gbnAucGFydGl0aW9uKGEsICgxLCAzKSkKICAgIGFycmF5KFsxLCAyLCAzLCA0XSkKCiAgICBOcgEAAADaAUspAXJUAAAAKQNyTgAAANoEa2luZHJUAAAAKQRyDQAAANoHZmxhdHRlbtoEY29weXIlAAAAKQVyUQAAANoDa3Rock4AAAByYQAAAHJUAAAAckgAAABySAAAAHJJAAAAciUAAAApAgAAcwwAAAAAUQgBDAEGAhABEgFjBQAAAAAAAAAFAAAACAAAAEMAAABzFAAAAHQAfABkAXwBfAJ8A3wEZAKNBlMAKQNhQggAAAogICAgUGVyZm9ybSBhbiBpbmRpcmVjdCBwYXJ0aXRpb24gYWxvbmcgdGhlIGdpdmVuIGF4aXMgdXNpbmcgdGhlCiAgICBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IHRoZSBga2luZGAga2V5d29yZC4gSXQgcmV0dXJucyBhbiBhcnJheSBvZgogICAgaW5kaWNlcyBvZiB0aGUgc2FtZSBzaGFwZSBhcyBgYWAgdGhhdCBpbmRleCBkYXRhIGFsb25nIHRoZSBnaXZlbgogICAgYXhpcyBpbiBwYXJ0aXRpb25lZCBvcmRlci4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjguMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgdG8gc29ydC4KICAgIGt0aCA6IGludCBvciBzZXF1ZW5jZSBvZiBpbnRzCiAgICAgICAgRWxlbWVudCBpbmRleCB0byBwYXJ0aXRpb24gYnkuIFRoZSBrLXRoIGVsZW1lbnQgd2lsbCBiZSBpbiBpdHMKICAgICAgICBmaW5hbCBzb3J0ZWQgcG9zaXRpb24gYW5kIGFsbCBzbWFsbGVyIGVsZW1lbnRzIHdpbGwgYmUgbW92ZWQKICAgICAgICBiZWZvcmUgaXQgYW5kIGFsbCBsYXJnZXIgZWxlbWVudHMgYmVoaW5kIGl0LiBUaGUgb3JkZXIgYWxsCiAgICAgICAgZWxlbWVudHMgaW4gdGhlIHBhcnRpdGlvbnMgaXMgdW5kZWZpbmVkLiBJZiBwcm92aWRlZCB3aXRoIGEKICAgICAgICBzZXF1ZW5jZSBvZiBrLXRoIGl0IHdpbGwgcGFydGl0aW9uIGFsbCBvZiB0aGVtIGludG8gdGhlaXIgc29ydGVkCiAgICAgICAgcG9zaXRpb24gYXQgb25jZS4KICAgIGF4aXMgOiBpbnQgb3IgTm9uZSwgb3B0aW9uYWwKICAgICAgICBBeGlzIGFsb25nIHdoaWNoIHRvIHNvcnQuIFRoZSBkZWZhdWx0IGlzIC0xICh0aGUgbGFzdCBheGlzKS4gSWYKICAgICAgICBOb25lLCB0aGUgZmxhdHRlbmVkIGFycmF5IGlzIHVzZWQuCiAgICBraW5kIDogeydpbnRyb3NlbGVjdCd9LCBvcHRpb25hbAogICAgICAgIFNlbGVjdGlvbiBhbGdvcml0aG0uIERlZmF1bHQgaXMgJ2ludHJvc2VsZWN0JwogICAgb3JkZXIgOiBzdHIgb3IgbGlzdCBvZiBzdHIsIG9wdGlvbmFsCiAgICAgICAgV2hlbiBgYWAgaXMgYW4gYXJyYXkgd2l0aCBmaWVsZHMgZGVmaW5lZCwgdGhpcyBhcmd1bWVudAogICAgICAgIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgdG8gY29tcGFyZSBmaXJzdCwgc2Vjb25kLCBldGMuIEEgc2luZ2xlCiAgICAgICAgZmllbGQgY2FuIGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZywgYW5kIG5vdCBhbGwgZmllbGRzIG5lZWQgYmUKICAgICAgICBzcGVjaWZpZWQsIGJ1dCB1bnNwZWNpZmllZCBmaWVsZHMgd2lsbCBzdGlsbCBiZSB1c2VkLCBpbiB0aGUKICAgICAgICBvcmRlciBpbiB3aGljaCB0aGV5IGNvbWUgdXAgaW4gdGhlIGR0eXBlLCB0byBicmVhayB0aWVzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGluZGV4X2FycmF5IDogbmRhcnJheSwgaW50CiAgICAgICAgQXJyYXkgb2YgaW5kaWNlcyB0aGF0IHBhcnRpdGlvbiBgYWAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLgogICAgICAgIEluIG90aGVyIHdvcmRzLCBgYGFbaW5kZXhfYXJyYXldYGAgeWllbGRzIGEgcGFydGl0aW9uZWQgYGFgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgcGFydGl0aW9uIDogRGVzY3JpYmVzIHBhcnRpdGlvbiBhbGdvcml0aG1zIHVzZWQuCiAgICBuZGFycmF5LnBhcnRpdGlvbiA6IElucGxhY2UgcGFydGl0aW9uLgogICAgYXJnc29ydCA6IEZ1bGwgaW5kaXJlY3Qgc29ydAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgU2VlIGBwYXJ0aXRpb25gIGZvciBub3RlcyBvbiB0aGUgZGlmZmVyZW50IHNlbGVjdGlvbiBhbGdvcml0aG1zLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgT25lIGRpbWVuc2lvbmFsIGFycmF5OgoKICAgID4+PiB4ID0gbnAuYXJyYXkoWzMsIDQsIDIsIDFdKQogICAgPj4+IHhbbnAuYXJncGFydGl0aW9uKHgsIDMpXQogICAgYXJyYXkoWzIsIDEsIDMsIDRdKQogICAgPj4+IHhbbnAuYXJncGFydGl0aW9uKHgsICgxLCAzKSldCiAgICBhcnJheShbMSwgMiwgMywgNF0pCgogICAgPj4+IHggPSBbMywgNCwgMiwgMV0KICAgID4+PiBucC5hcnJheSh4KVtucC5hcmdwYXJ0aXRpb24oeCwgMyldCiAgICBhcnJheShbMiwgMSwgMywgNF0pCgogICAgchgAAAApA3JOAAAAcmEAAAByVAAAACkBckwAAAApBXJRAAAAcmQAAAByTgAAAHJhAAAAclQAAABySAAAAHJIAAAAckkAAAByGAAAAIMCAABzAgAAAAA/2glxdWlja3NvcnRjBAAAAAAAAAAEAAAABQAAAEMAAABzPgAAAHwBZAFrCHIadAB8AIMBoAGhAH0AZAJ9AW4QdAB8AIMBagJkA2QEjQF9AHwAagN8AXwCfANkBY0DAQB8AFMAKQZhkhAAAAogICAgUmV0dXJuIGEgc29ydGVkIGNvcHkgb2YgYW4gYXJyYXkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSB0byBiZSBzb3J0ZWQuCiAgICBheGlzIDogaW50IG9yIE5vbmUsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byBzb3J0LiBJZiBOb25lLCB0aGUgYXJyYXkgaXMgZmxhdHRlbmVkIGJlZm9yZQogICAgICAgIHNvcnRpbmcuIFRoZSBkZWZhdWx0IGlzIC0xLCB3aGljaCBzb3J0cyBhbG9uZyB0aGUgbGFzdCBheGlzLgogICAga2luZCA6IHsncXVpY2tzb3J0JywgJ21lcmdlc29ydCcsICdoZWFwc29ydCd9LCBvcHRpb25hbAogICAgICAgIFNvcnRpbmcgYWxnb3JpdGhtLiBEZWZhdWx0IGlzICdxdWlja3NvcnQnLgogICAgb3JkZXIgOiBzdHIgb3IgbGlzdCBvZiBzdHIsIG9wdGlvbmFsCiAgICAgICAgV2hlbiBgYWAgaXMgYW4gYXJyYXkgd2l0aCBmaWVsZHMgZGVmaW5lZCwgdGhpcyBhcmd1bWVudCBzcGVjaWZpZXMKICAgICAgICB3aGljaCBmaWVsZHMgdG8gY29tcGFyZSBmaXJzdCwgc2Vjb25kLCBldGMuICBBIHNpbmdsZSBmaWVsZCBjYW4KICAgICAgICBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcsIGFuZCBub3QgYWxsIGZpZWxkcyBuZWVkIGJlIHNwZWNpZmllZCwKICAgICAgICBidXQgdW5zcGVjaWZpZWQgZmllbGRzIHdpbGwgc3RpbGwgYmUgdXNlZCwgaW4gdGhlIG9yZGVyIGluIHdoaWNoCiAgICAgICAgdGhleSBjb21lIHVwIGluIHRoZSBkdHlwZSwgdG8gYnJlYWsgdGllcy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBzb3J0ZWRfYXJyYXkgOiBuZGFycmF5CiAgICAgICAgQXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBhbmQgc2hhcGUgYXMgYGFgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5zb3J0IDogTWV0aG9kIHRvIHNvcnQgYW4gYXJyYXkgaW4tcGxhY2UuCiAgICBhcmdzb3J0IDogSW5kaXJlY3Qgc29ydC4KICAgIGxleHNvcnQgOiBJbmRpcmVjdCBzdGFibGUgc29ydCBvbiBtdWx0aXBsZSBrZXlzLgogICAgc2VhcmNoc29ydGVkIDogRmluZCBlbGVtZW50cyBpbiBhIHNvcnRlZCBhcnJheS4KICAgIHBhcnRpdGlvbiA6IFBhcnRpYWwgc29ydC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSB2YXJpb3VzIHNvcnRpbmcgYWxnb3JpdGhtcyBhcmUgY2hhcmFjdGVyaXplZCBieSB0aGVpciBhdmVyYWdlIHNwZWVkLAogICAgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSwgd29yayBzcGFjZSBzaXplLCBhbmQgd2hldGhlciB0aGV5IGFyZSBzdGFibGUuIEEKICAgIHN0YWJsZSBzb3J0IGtlZXBzIGl0ZW1zIHdpdGggdGhlIHNhbWUga2V5IGluIHRoZSBzYW1lIHJlbGF0aXZlCiAgICBvcmRlci4gVGhlIHRocmVlIGF2YWlsYWJsZSBhbGdvcml0aG1zIGhhdmUgdGhlIGZvbGxvd2luZwogICAgcHJvcGVydGllczoKCiAgICA9PT09PT09PT09PSA9PT09PT09ID09PT09PT09PT09PT0gPT09PT09PT09PT09ID09PT09PT0KICAgICAgIGtpbmQgICAgICBzcGVlZCAgIHdvcnN0IGNhc2UgICAgd29yayBzcGFjZSAgc3RhYmxlCiAgICA9PT09PT09PT09PSA9PT09PT09ID09PT09PT09PT09PT0gPT09PT09PT09PT09ID09PT09PT0KICAgICdxdWlja3NvcnQnICAgIDEgICAgIE8obl4yKSAgICAgICAgICAgIDAgICAgICAgICAgbm8KICAgICdtZXJnZXNvcnQnICAgIDIgICAgIE8obipsb2cobikpICAgICAgfm4vMiAgICAgICAgeWVzCiAgICAnaGVhcHNvcnQnICAgICAzICAgICBPKG4qbG9nKG4pKSAgICAgICAwICAgICAgICAgIG5vCiAgICA9PT09PT09PT09PSA9PT09PT09ID09PT09PT09PT09PT0gPT09PT09PT09PT09ID09PT09PT0KCiAgICBBbGwgdGhlIHNvcnQgYWxnb3JpdGhtcyBtYWtlIHRlbXBvcmFyeSBjb3BpZXMgb2YgdGhlIGRhdGEgd2hlbgogICAgc29ydGluZyBhbG9uZyBhbnkgYnV0IHRoZSBsYXN0IGF4aXMuICBDb25zZXF1ZW50bHksIHNvcnRpbmcgYWxvbmcKICAgIHRoZSBsYXN0IGF4aXMgaXMgZmFzdGVyIGFuZCB1c2VzIGxlc3Mgc3BhY2UgdGhhbiBzb3J0aW5nIGFsb25nCiAgICBhbnkgb3RoZXIgYXhpcy4KCiAgICBUaGUgc29ydCBvcmRlciBmb3IgY29tcGxleCBudW1iZXJzIGlzIGxleGljb2dyYXBoaWMuIElmIGJvdGggdGhlIHJlYWwKICAgIGFuZCBpbWFnaW5hcnkgcGFydHMgYXJlIG5vbi1uYW4gdGhlbiB0aGUgb3JkZXIgaXMgZGV0ZXJtaW5lZCBieSB0aGUKICAgIHJlYWwgcGFydHMgZXhjZXB0IHdoZW4gdGhleSBhcmUgZXF1YWwsIGluIHdoaWNoIGNhc2UgdGhlIG9yZGVyIGlzCiAgICBkZXRlcm1pbmVkIGJ5IHRoZSBpbWFnaW5hcnkgcGFydHMuCgogICAgUHJldmlvdXMgdG8gbnVtcHkgMS40LjAgc29ydGluZyByZWFsIGFuZCBjb21wbGV4IGFycmF5cyBjb250YWluaW5nIG5hbgogICAgdmFsdWVzIGxlZCB0byB1bmRlZmluZWQgYmVoYXZpb3VyLiBJbiBudW1weSB2ZXJzaW9ucyA+PSAxLjQuMCBuYW4KICAgIHZhbHVlcyBhcmUgc29ydGVkIHRvIHRoZSBlbmQuIFRoZSBleHRlbmRlZCBzb3J0IG9yZGVyIGlzOgoKICAgICAgKiBSZWFsOiBbUiwgbmFuXQogICAgICAqIENvbXBsZXg6IFtSICsgUmosIFIgKyBuYW5qLCBuYW4gKyBSaiwgbmFuICsgbmFual0KCiAgICB3aGVyZSBSIGlzIGEgbm9uLW5hbiByZWFsIHZhbHVlLiBDb21wbGV4IHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbgogICAgcGxhY2VtZW50cyBhcmUgc29ydGVkIGFjY29yZGluZyB0byB0aGUgbm9uLW5hbiBwYXJ0IGlmIGl0IGV4aXN0cy4KICAgIE5vbi1uYW4gdmFsdWVzIGFyZSBzb3J0ZWQgYXMgYmVmb3JlLgoKICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTIuMAoKICAgIHF1aWNrc29ydCBoYXMgYmVlbiBjaGFuZ2VkIHRvIGFuIGludHJvc29ydCB3aGljaCB3aWxsIHN3aXRjaAogICAgaGVhcHNvcnQgd2hlbiBpdCBkb2VzIG5vdCBtYWtlIGVub3VnaCBwcm9ncmVzcy4gVGhpcyBtYWtlcyBpdHMKICAgIHdvcnN0IGNhc2UgTyhuKmxvZyhuKSkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMSw0XSxbMywxXV0pCiAgICA+Pj4gbnAuc29ydChhKSAgICAgICAgICAgICAgICAjIHNvcnQgYWxvbmcgdGhlIGxhc3QgYXhpcwogICAgYXJyYXkoW1sxLCA0XSwKICAgICAgICAgICBbMSwgM11dKQogICAgPj4+IG5wLnNvcnQoYSwgYXhpcz1Ob25lKSAgICAgIyBzb3J0IHRoZSBmbGF0dGVuZWQgYXJyYXkKICAgIGFycmF5KFsxLCAxLCAzLCA0XSkKICAgID4+PiBucC5zb3J0KGEsIGF4aXM9MCkgICAgICAgICMgc29ydCBhbG9uZyB0aGUgZmlyc3QgYXhpcwogICAgYXJyYXkoW1sxLCAxXSwKICAgICAgICAgICBbMywgNF1dKQoKICAgIFVzZSB0aGUgYG9yZGVyYCBrZXl3b3JkIHRvIHNwZWNpZnkgYSBmaWVsZCB0byB1c2Ugd2hlbiBzb3J0aW5nIGEKICAgIHN0cnVjdHVyZWQgYXJyYXk6CgogICAgPj4+IGR0eXBlID0gWygnbmFtZScsICdTMTAnKSwgKCdoZWlnaHQnLCBmbG9hdCksICgnYWdlJywgaW50KV0KICAgID4+PiB2YWx1ZXMgPSBbKCdBcnRodXInLCAxLjgsIDQxKSwgKCdMYW5jZWxvdCcsIDEuOSwgMzgpLAogICAgLi4uICAgICAgICAgICAoJ0dhbGFoYWQnLCAxLjcsIDM4KV0KICAgID4+PiBhID0gbnAuYXJyYXkodmFsdWVzLCBkdHlwZT1kdHlwZSkgICAgICAgIyBjcmVhdGUgYSBzdHJ1Y3R1cmVkIGFycmF5CiAgICA+Pj4gbnAuc29ydChhLCBvcmRlcj0naGVpZ2h0JykgICAgICAgICAgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICBhcnJheShbKCdHYWxhaGFkJywgMS43LCAzOCksICgnQXJ0aHVyJywgMS44LCA0MSksCiAgICAgICAgICAgKCdMYW5jZWxvdCcsIDEuODk5OTk5OTk5OTk5OTk5OSwgMzgpXSwKICAgICAgICAgIGR0eXBlPVsoJ25hbWUnLCAnfFMxMCcpLCAoJ2hlaWdodCcsICc8ZjgnKSwgKCdhZ2UnLCAnPGk0JyldKQoKICAgIFNvcnQgYnkgYWdlLCB0aGVuIGhlaWdodCBpZiBhZ2VzIGFyZSBlcXVhbDoKCiAgICA+Pj4gbnAuc29ydChhLCBvcmRlcj1bJ2FnZScsICdoZWlnaHQnXSkgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICBhcnJheShbKCdHYWxhaGFkJywgMS43LCAzOCksICgnTGFuY2Vsb3QnLCAxLjg5OTk5OTk5OTk5OTk5OTksIDM4KSwKICAgICAgICAgICAoJ0FydGh1cicsIDEuOCwgNDEpXSwKICAgICAgICAgIGR0eXBlPVsoJ25hbWUnLCAnfFMxMCcpLCAoJ2hlaWdodCcsICc8ZjgnKSwgKCdhZ2UnLCAnPGk0JyldKQoKICAgIE5yAQAAAHJgAAAAKQFyVAAAACkDck4AAAByYQAAAHJUAAAAKQRyDQAAAHJiAAAAcmMAAAByNAAAACkEclEAAAByTgAAAHJhAAAAclQAAABySAAAAHJIAAAAckkAAAByNAAAAMUCAABzDAAAAABsCAEMAQYCEAEQAWMEAAAAAAAAAAQAAAAHAAAAQwAAAHMSAAAAdAB8AGQBfAF8AnwDZAKNBVMAKQNh5ggAAAogICAgUmV0dXJucyB0aGUgaW5kaWNlcyB0aGF0IHdvdWxkIHNvcnQgYW4gYXJyYXkuCgogICAgUGVyZm9ybSBhbiBpbmRpcmVjdCBzb3J0IGFsb25nIHRoZSBnaXZlbiBheGlzIHVzaW5nIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkCiAgICBieSB0aGUgYGtpbmRgIGtleXdvcmQuIEl0IHJldHVybnMgYW4gYXJyYXkgb2YgaW5kaWNlcyBvZiB0aGUgc2FtZSBzaGFwZSBhcwogICAgYGFgIHRoYXQgaW5kZXggZGF0YSBhbG9uZyB0aGUgZ2l2ZW4gYXhpcyBpbiBzb3J0ZWQgb3JkZXIuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSB0byBzb3J0LgogICAgYXhpcyA6IGludCBvciBOb25lLCBvcHRpb25hbAogICAgICAgIEF4aXMgYWxvbmcgd2hpY2ggdG8gc29ydC4gIFRoZSBkZWZhdWx0IGlzIC0xICh0aGUgbGFzdCBheGlzKS4gSWYgTm9uZSwKICAgICAgICB0aGUgZmxhdHRlbmVkIGFycmF5IGlzIHVzZWQuCiAgICBraW5kIDogeydxdWlja3NvcnQnLCAnbWVyZ2Vzb3J0JywgJ2hlYXBzb3J0J30sIG9wdGlvbmFsCiAgICAgICAgU29ydGluZyBhbGdvcml0aG0uCiAgICBvcmRlciA6IHN0ciBvciBsaXN0IG9mIHN0ciwgb3B0aW9uYWwKICAgICAgICBXaGVuIGBhYCBpcyBhbiBhcnJheSB3aXRoIGZpZWxkcyBkZWZpbmVkLCB0aGlzIGFyZ3VtZW50IHNwZWNpZmllcwogICAgICAgIHdoaWNoIGZpZWxkcyB0byBjb21wYXJlIGZpcnN0LCBzZWNvbmQsIGV0Yy4gIEEgc2luZ2xlIGZpZWxkIGNhbgogICAgICAgIGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZywgYW5kIG5vdCBhbGwgZmllbGRzIG5lZWQgYmUgc3BlY2lmaWVkLAogICAgICAgIGJ1dCB1bnNwZWNpZmllZCBmaWVsZHMgd2lsbCBzdGlsbCBiZSB1c2VkLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKICAgICAgICB0aGV5IGNvbWUgdXAgaW4gdGhlIGR0eXBlLCB0byBicmVhayB0aWVzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGluZGV4X2FycmF5IDogbmRhcnJheSwgaW50CiAgICAgICAgQXJyYXkgb2YgaW5kaWNlcyB0aGF0IHNvcnQgYGFgIGFsb25nIHRoZSBzcGVjaWZpZWQgYXhpcy4KICAgICAgICBJZiBgYWAgaXMgb25lLWRpbWVuc2lvbmFsLCBgYGFbaW5kZXhfYXJyYXldYGAgeWllbGRzIGEgc29ydGVkIGBhYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNvcnQgOiBEZXNjcmliZXMgc29ydGluZyBhbGdvcml0aG1zIHVzZWQuCiAgICBsZXhzb3J0IDogSW5kaXJlY3Qgc3RhYmxlIHNvcnQgd2l0aCBtdWx0aXBsZSBrZXlzLgogICAgbmRhcnJheS5zb3J0IDogSW5wbGFjZSBzb3J0LgogICAgYXJncGFydGl0aW9uIDogSW5kaXJlY3QgcGFydGlhbCBzb3J0LgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgU2VlIGBzb3J0YCBmb3Igbm90ZXMgb24gdGhlIGRpZmZlcmVudCBzb3J0aW5nIGFsZ29yaXRobXMuCgogICAgQXMgb2YgTnVtUHkgMS40LjAgYGFyZ3NvcnRgIHdvcmtzIHdpdGggcmVhbC9jb21wbGV4IGFycmF5cyBjb250YWluaW5nCiAgICBuYW4gdmFsdWVzLiBUaGUgZW5oYW5jZWQgc29ydCBvcmRlciBpcyBkb2N1bWVudGVkIGluIGBzb3J0YC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgIE9uZSBkaW1lbnNpb25hbCBhcnJheToKCiAgICA+Pj4geCA9IG5wLmFycmF5KFszLCAxLCAyXSkKICAgID4+PiBucC5hcmdzb3J0KHgpCiAgICBhcnJheShbMSwgMiwgMF0pCgogICAgVHdvLWRpbWVuc2lvbmFsIGFycmF5OgoKICAgID4+PiB4ID0gbnAuYXJyYXkoW1swLCAzXSwgWzIsIDJdXSkKICAgID4+PiB4CiAgICBhcnJheShbWzAsIDNdLAogICAgICAgICAgIFsyLCAyXV0pCgogICAgPj4+IG5wLmFyZ3NvcnQoeCwgYXhpcz0wKQogICAgYXJyYXkoW1swLCAxXSwKICAgICAgICAgICBbMSwgMF1dKQoKICAgID4+PiBucC5hcmdzb3J0KHgsIGF4aXM9MSkKICAgIGFycmF5KFtbMCwgMV0sCiAgICAgICAgICAgWzAsIDFdXSkKCiAgICBTb3J0aW5nIHdpdGgga2V5czoKCiAgICA+Pj4geCA9IG5wLmFycmF5KFsoMSwgMCksICgwLCAxKV0sIGR0eXBlPVsoJ3gnLCAnPGk0JyksICgneScsICc8aTQnKV0pCiAgICA+Pj4geAogICAgYXJyYXkoWygxLCAwKSwgKDAsIDEpXSwKICAgICAgICAgIGR0eXBlPVsoJ3gnLCAnPGk0JyksICgneScsICc8aTQnKV0pCgogICAgPj4+IG5wLmFyZ3NvcnQoeCwgb3JkZXI9KCd4JywneScpKQogICAgYXJyYXkoWzEsIDBdKQoKICAgID4+PiBucC5hcmdzb3J0KHgsIG9yZGVyPSgneScsJ3gnKSkKICAgIGFycmF5KFswLCAxXSkKCiAgICByGQAAACkDck4AAAByYQAAAHJUAAAAKQFyTAAAACkEclEAAAByTgAAAHJhAAAAclQAAABySAAAAHJIAAAAckkAAAByGQAAADoDAABzAgAAAABRYwMAAAAAAAAAAwAAAAYAAABDAAAAcxAAAAB0AHwAZAF8AXwCZAKNBFMAKQNhGwUAAAogICAgUmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgbWF4aW11bSB2YWx1ZXMgYWxvbmcgYW4gYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBCeSBkZWZhdWx0LCB0aGUgaW5kZXggaXMgaW50byB0aGUgZmxhdHRlbmVkIGFycmF5LCBvdGhlcndpc2UKICAgICAgICBhbG9uZyB0aGUgc3BlY2lmaWVkIGF4aXMuCiAgICBvdXQgOiBhcnJheSwgb3B0aW9uYWwKICAgICAgICBJZiBwcm92aWRlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhpcyBhcnJheS4gSXQgc2hvdWxkCiAgICAgICAgYmUgb2YgdGhlIGFwcHJvcHJpYXRlIHNoYXBlIGFuZCBkdHlwZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBpbmRleF9hcnJheSA6IG5kYXJyYXkgb2YgaW50cwogICAgICAgIEFycmF5IG9mIGluZGljZXMgaW50byB0aGUgYXJyYXkuIEl0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgYS5zaGFwZWAKICAgICAgICB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgIHJlbW92ZWQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBuZGFycmF5LmFyZ21heCwgYXJnbWluCiAgICBhbWF4IDogVGhlIG1heGltdW0gdmFsdWUgYWxvbmcgYSBnaXZlbiBheGlzLgogICAgdW5yYXZlbF9pbmRleCA6IENvbnZlcnQgYSBmbGF0IGluZGV4IGludG8gYW4gaW5kZXggdHVwbGUuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBJbiBjYXNlIG9mIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBtYXhpbXVtIHZhbHVlcywgdGhlIGluZGljZXMKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2UgYXJlIHJldHVybmVkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcmFuZ2UoNikucmVzaGFwZSgyLDMpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swLCAxLCAyXSwKICAgICAgICAgICBbMywgNCwgNV1dKQogICAgPj4+IG5wLmFyZ21heChhKQogICAgNQogICAgPj4+IG5wLmFyZ21heChhLCBheGlzPTApCiAgICBhcnJheShbMSwgMSwgMV0pCiAgICA+Pj4gbnAuYXJnbWF4KGEsIGF4aXM9MSkKICAgIGFycmF5KFsyLCAyXSkKCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSg2KQogICAgPj4+IGJbMV0gPSA1CiAgICA+Pj4gYgogICAgYXJyYXkoWzAsIDUsIDIsIDMsIDQsIDVdKQogICAgPj4+IG5wLmFyZ21heChiKSAjIE9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2UgaXMgcmV0dXJuZWQuCiAgICAxCgogICAgchYAAAApAnJOAAAAck8AAAApAXJMAAAAKQNyUQAAAHJOAAAAck8AAABySAAAAHJIAAAAckkAAAByFgAAAI4DAABzAgAAAAA1YwMAAAAAAAAAAwAAAAYAAABDAAAAcxAAAAB0AHwAZAF8AXwCZAKNBFMAKQNhGwUAAAogICAgUmV0dXJucyB0aGUgaW5kaWNlcyBvZiB0aGUgbWluaW11bSB2YWx1ZXMgYWxvbmcgYW4gYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBCeSBkZWZhdWx0LCB0aGUgaW5kZXggaXMgaW50byB0aGUgZmxhdHRlbmVkIGFycmF5LCBvdGhlcndpc2UKICAgICAgICBhbG9uZyB0aGUgc3BlY2lmaWVkIGF4aXMuCiAgICBvdXQgOiBhcnJheSwgb3B0aW9uYWwKICAgICAgICBJZiBwcm92aWRlZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGluc2VydGVkIGludG8gdGhpcyBhcnJheS4gSXQgc2hvdWxkCiAgICAgICAgYmUgb2YgdGhlIGFwcHJvcHJpYXRlIHNoYXBlIGFuZCBkdHlwZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBpbmRleF9hcnJheSA6IG5kYXJyYXkgb2YgaW50cwogICAgICAgIEFycmF5IG9mIGluZGljZXMgaW50byB0aGUgYXJyYXkuIEl0IGhhcyB0aGUgc2FtZSBzaGFwZSBhcyBgYS5zaGFwZWAKICAgICAgICB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgIHJlbW92ZWQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBuZGFycmF5LmFyZ21pbiwgYXJnbWF4CiAgICBhbWluIDogVGhlIG1pbmltdW0gdmFsdWUgYWxvbmcgYSBnaXZlbiBheGlzLgogICAgdW5yYXZlbF9pbmRleCA6IENvbnZlcnQgYSBmbGF0IGluZGV4IGludG8gYW4gaW5kZXggdHVwbGUuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBJbiBjYXNlIG9mIG11bHRpcGxlIG9jY3VycmVuY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcywgdGhlIGluZGljZXMKICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IG9jY3VycmVuY2UgYXJlIHJldHVybmVkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcmFuZ2UoNikucmVzaGFwZSgyLDMpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swLCAxLCAyXSwKICAgICAgICAgICBbMywgNCwgNV1dKQogICAgPj4+IG5wLmFyZ21pbihhKQogICAgMAogICAgPj4+IG5wLmFyZ21pbihhLCBheGlzPTApCiAgICBhcnJheShbMCwgMCwgMF0pCiAgICA+Pj4gbnAuYXJnbWluKGEsIGF4aXM9MSkKICAgIGFycmF5KFswLCAwXSkKCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSg2KQogICAgPj4+IGJbNF0gPSAwCiAgICA+Pj4gYgogICAgYXJyYXkoWzAsIDEsIDIsIDMsIDAsIDVdKQogICAgPj4+IG5wLmFyZ21pbihiKSAjIE9ubHkgdGhlIGZpcnN0IG9jY3VycmVuY2UgaXMgcmV0dXJuZWQuCiAgICAwCgogICAgchcAAAApAnJOAAAAck8AAAApAXJMAAAAKQNyUQAAAHJOAAAAck8AAABySAAAAHJIAAAAckkAAAByFwAAAMYDAABzAgAAAAA12gRsZWZ0YwQAAAAAAAAABAAAAAcAAABDAAAAcxIAAAB0AHwAZAF8AXwCfANkAo0FUwApA2F6BgAACiAgICBGaW5kIGluZGljZXMgd2hlcmUgZWxlbWVudHMgc2hvdWxkIGJlIGluc2VydGVkIHRvIG1haW50YWluIG9yZGVyLgoKICAgIEZpbmQgdGhlIGluZGljZXMgaW50byBhIHNvcnRlZCBhcnJheSBgYWAgc3VjaCB0aGF0LCBpZiB0aGUKICAgIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgaW4gYHZgIHdlcmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBpbmRpY2VzLCB0aGUKICAgIG9yZGVyIG9mIGBhYCB3b3VsZCBiZSBwcmVzZXJ2ZWQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IDEtRCBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXkuIElmIGBzb3J0ZXJgIGlzIE5vbmUsIHRoZW4gaXQgbXVzdCBiZSBzb3J0ZWQgaW4KICAgICAgICBhc2NlbmRpbmcgb3JkZXIsIG90aGVyd2lzZSBgc29ydGVyYCBtdXN0IGJlIGFuIGFycmF5IG9mIGluZGljZXMKICAgICAgICB0aGF0IHNvcnQgaXQuCiAgICB2IDogYXJyYXlfbGlrZQogICAgICAgIFZhbHVlcyB0byBpbnNlcnQgaW50byBgYWAuCiAgICBzaWRlIDogeydsZWZ0JywgJ3JpZ2h0J30sIG9wdGlvbmFsCiAgICAgICAgSWYgJ2xlZnQnLCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN1aXRhYmxlIGxvY2F0aW9uIGZvdW5kIGlzIGdpdmVuLgogICAgICAgIElmICdyaWdodCcsIHJldHVybiB0aGUgbGFzdCBzdWNoIGluZGV4LiAgSWYgdGhlcmUgaXMgbm8gc3VpdGFibGUKICAgICAgICBpbmRleCwgcmV0dXJuIGVpdGhlciAwIG9yIE4gKHdoZXJlIE4gaXMgdGhlIGxlbmd0aCBvZiBgYWApLgogICAgc29ydGVyIDogMS1EIGFycmF5X2xpa2UsIG9wdGlvbmFsCiAgICAgICAgT3B0aW9uYWwgYXJyYXkgb2YgaW50ZWdlciBpbmRpY2VzIHRoYXQgc29ydCBhcnJheSBhIGludG8gYXNjZW5kaW5nCiAgICAgICAgb3JkZXIuIFRoZXkgYXJlIHR5cGljYWxseSB0aGUgcmVzdWx0IG9mIGFyZ3NvcnQuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgaW5kaWNlcyA6IGFycmF5IG9mIGludHMKICAgICAgICBBcnJheSBvZiBpbnNlcnRpb24gcG9pbnRzIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgYHZgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgc29ydCA6IFJldHVybiBhIHNvcnRlZCBjb3B5IG9mIGFuIGFycmF5LgogICAgaGlzdG9ncmFtIDogUHJvZHVjZSBoaXN0b2dyYW0gZnJvbSAxLUQgZGF0YS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIEJpbmFyeSBzZWFyY2ggaXMgdXNlZCB0byBmaW5kIHRoZSByZXF1aXJlZCBpbnNlcnRpb24gcG9pbnRzLgoKICAgIEFzIG9mIE51bVB5IDEuNC4wIGBzZWFyY2hzb3J0ZWRgIHdvcmtzIHdpdGggcmVhbC9jb21wbGV4IGFycmF5cyBjb250YWluaW5nCiAgICBgbmFuYCB2YWx1ZXMuIFRoZSBlbmhhbmNlZCBzb3J0IG9yZGVyIGlzIGRvY3VtZW50ZWQgaW4gYHNvcnRgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLnNlYXJjaHNvcnRlZChbMSwyLDMsNCw1XSwgMykKICAgIDIKICAgID4+PiBucC5zZWFyY2hzb3J0ZWQoWzEsMiwzLDQsNV0sIDMsIHNpZGU9J3JpZ2h0JykKICAgIDMKICAgID4+PiBucC5zZWFyY2hzb3J0ZWQoWzEsMiwzLDQsNV0sIFstMTAsIDEwLCAyLCAzXSkKICAgIGFycmF5KFswLCA1LCAxLCAyXSkK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ICBJbnB1dCBkYXRhLgogICAgYXhpcyA6IE5vbmUgb3IgaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICAgICAgU2VsZWN0cyBhIHN1YnNldCBvZiB0aGUgc2luZ2xlLWRpbWVuc2lvbmFsIGVudHJpZXMgaW4gdGhlCiAgICAgICAgc2hhcGUuIElmIGFuIGF4aXMgaXMgc2VsZWN0ZWQgd2l0aCBzaGFwZSBlbnRyeSBncmVhdGVyIHRoYW4KICAgICAgICBvbmUsIGFuIGVycm9yIGlzIHJhaXNlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBzcXVlZXplZCA6IG5kYXJyYXkKICAgICAgICBUaGUgaW5wdXQgYXJyYXksIGJ1dCB3aXRoIGFsbCBvciBhIHN1YnNldCBvZiB0aGUKICAgICAgICBkaW1lbnNpb25zIG9mIGxlbmd0aCAxIHJlbW92ZWQuIFRoaXMgaXMgYWx3YXlzIGBhYCBpdHNlbGYKICAgICAgICBvciBhIHZpZXcgaW50byBgYWAuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIFZhbHVlRXJyb3IKICAgICAgICBJZiBgYXhpc2AgaXMgbm90IGBOb25lYCwgYW5kIGFuIGF4aXMgYmVpbmcgc3F1ZWV6ZWQgaXMgbm90IG9mIGxlbmd0aCAxCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBleHBhbmRfZGltcyA6IFRoZSBpbnZlcnNlIG9wZXJhdGlvbiwgYWRkaW5nIHNpbmdsZXRvbiBkaW1lbnNpb25zCiAgICByZXNoYXBlIDogSW5zZXJ0LCByZW1vdmUsIGFuZCBjb21iaW5lIGRpbWVuc2lvbnMsIGFuZCByZXNpemUgZXhpc3Rpbmcgb25lcwoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbW1swXSwgWzFdLCBbMl1dXSkKICAgID4+PiB4LnNoYXBlCiAgICAoMSwgMywgMSkKICAgID4+PiBucC5zcXVlZXplKHgpLnNoYXBlCiAgICAoMywpCiAgICA+Pj4gbnAuc3F1ZWV6ZSh4LCBheGlzPTApLnNoYXBlCiAgICAoMywgMSkKICAgID4+PiBucC5zcXVlZXplKHgsIGF4aXM9MSkuc2hhcGUKICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgIC4uLgogICAgVmFsdWVFcnJvcjogY2Fubm90IHNlbGVjdCBhbiBheGlzIHRvIHNxdWVlemUgb3V0IHdoaWNoIGhhcyBzaXplIG5vdCBlcXVhbCB0byBvbmUKICAgID4+PiBucC5zcXVlZXplKHgsIGF4aXM9Mikuc2hhcGUKICAgICgxLCAzKQoKICAgIHI1AAAAKQFyTgAAAE4pBHI1AAAAcj0AAABySgAAAHJLAAAAKQNyUQAAAHJOAAAAcjUAAABySAAAAHJIAAAAckkAAAByNQAAAHcEAABzEAAAAAAxAgEKAQ4BDAECAgoBDgJjBAAAAAAAAAAEAAAABQAAAEMAAABzOAAAAHQAfAB0AWoCgwJyIHQDfACDAWoEfAF8AnwDZAGNA1MAdAV8AIMBagR8AXwCfANkAY0DUwBkAlMAKQNhFQ8AAAogICAgUmV0dXJuIHNwZWNpZmllZCBkaWFnb25hbHMuCgogICAgSWYgYGFgIGlzIDItRCwgcmV0dXJucyB0aGUgZGlhZ29uYWwgb2YgYGFgIHdpdGggdGhlIGdpdmVuIG9mZnNldCwKICAgIGkuZS4sIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIG9mIHRoZSBmb3JtIGBgYVtpLCBpK29mZnNldF1gYC4gIElmCiAgICBgYWAgaGFzIG1vcmUgdGhhbiB0d28gZGltZW5zaW9ucywgdGhlbiB0aGUgYXhlcyBzcGVjaWZpZWQgYnkgYGF4aXMxYAogICAgYW5kIGBheGlzMmAgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSAyLUQgc3ViLWFycmF5IHdob3NlIGRpYWdvbmFsIGlzCiAgICByZXR1cm5lZC4gIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0aW5nIGFycmF5IGNhbiBiZSBkZXRlcm1pbmVkIGJ5CiAgICByZW1vdmluZyBgYXhpczFgIGFuZCBgYXhpczJgIGFuZCBhcHBlbmRpbmcgYW4gaW5kZXggdG8gdGhlIHJpZ2h0IGVxdWFsCiAgICB0byB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGRpYWdvbmFscy4KCiAgICBJbiB2ZXJzaW9ucyBvZiBOdW1QeSBwcmlvciB0byAxLjcsIHRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybmVkIGEgbmV3LAogICAgaW5kZXBlbmRlbnQgYXJyYXkgY29udGFpbmluZyBhIGNvcHkgb2YgdGhlIHZhbHVlcyBpbiB0aGUgZGlhZ29uYWwuCgogICAgSW4gTnVtUHkgMS43IGFuZCAxLjgsIGl0IGNvbnRpbnVlcyB0byByZXR1cm4gYSBjb3B5IG9mIHRoZSBkaWFnb25hbCwKICAgIGJ1dCBkZXBlbmRpbmcgb24gdGhpcyBmYWN0IGlzIGRlcHJlY2F0ZWQuIFdyaXRpbmcgdG8gdGhlIHJlc3VsdGluZwogICAgYXJyYXkgY29udGludWVzIHRvIHdvcmsgYXMgaXQgdXNlZCB0bywgYnV0IGEgRnV0dXJlV2FybmluZyBpcyBpc3N1ZWQuCgogICAgU3RhcnRpbmcgaW4gTnVtUHkgMS45IGl0IHJldHVybnMgYSByZWFkLW9ubHkgdmlldyBvbiB0aGUgb3JpZ2luYWwgYXJyYXkuCiAgICBBdHRlbXB0aW5nIHRvIHdyaXRlIHRvIHRoZSByZXN1bHRpbmcgYXJyYXkgd2lsbCBwcm9kdWNlIGFuIGVycm9yLgoKICAgIEluIHNvbWUgZnV0dXJlIHJlbGVhc2UsIGl0IHdpbGwgcmV0dXJuIGEgcmVhZC93cml0ZSB2aWV3IGFuZCB3cml0aW5nIHRvCiAgICB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBhbHRlciB5b3VyIG9yaWdpbmFsIGFycmF5LiAgVGhlIHJldHVybmVkIGFycmF5CiAgICB3aWxsIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgaW5wdXQgYXJyYXkuCgogICAgSWYgeW91IGRvbid0IHdyaXRlIHRvIHRoZSBhcnJheSByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uLCB0aGVuIHlvdSBjYW4KICAgIGp1c3QgaWdub3JlIGFsbCBvZiB0aGUgYWJvdmUuCgogICAgSWYgeW91IGRlcGVuZCBvbiB0aGUgY3VycmVudCBiZWhhdmlvciwgdGhlbiB3ZSBzdWdnZXN0IGNvcHlpbmcgdGhlCiAgICByZXR1cm5lZCBhcnJheSBleHBsaWNpdGx5LCBpLmUuLCB1c2UgYGBucC5kaWFnb25hbChhKS5jb3B5KClgYCBpbnN0ZWFkCiAgICBvZiBqdXN0IGBgbnAuZGlhZ29uYWwoYSlgYC4gVGhpcyB3aWxsIHdvcmsgd2l0aCBib3RoIHBhc3QgYW5kIGZ1dHVyZQogICAgdmVyc2lvbnMgb2YgTnVtUHkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBmcm9tIHdoaWNoIHRoZSBkaWFnb25hbHMgYXJlIHRha2VuLgogICAgb2Zmc2V0IDogaW50LCBvcHRpb25hbAogICAgICAgIE9mZnNldCBvZiB0aGUgZGlhZ29uYWwgZnJvbSB0aGUgbWFpbiBkaWFnb25hbC4gIENhbiBiZSBwb3NpdGl2ZSBvcgogICAgICAgIG5lZ2F0aXZlLiAgRGVmYXVsdHMgdG8gbWFpbiBkaWFnb25hbCAoMCkuCiAgICBheGlzMSA6IGludCwgb3B0aW9uYWwKICAgICAgICBBeGlzIHRvIGJlIHVzZWQgYXMgdGhlIGZpcnN0IGF4aXMgb2YgdGhlIDItRCBzdWItYXJyYXlzIGZyb20gd2hpY2gKICAgICAgICB0aGUgZGlhZ29uYWxzIHNob3VsZCBiZSB0YWtlbi4gIERlZmF1bHRzIHRvIGZpcnN0IGF4aXMgKDApLgogICAgYXhpczIgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyB0byBiZSB1c2VkIGFzIHRoZSBzZWNvbmQgYXhpcyBvZiB0aGUgMi1EIHN1Yi1hcnJheXMgZnJvbQogICAgICAgIHdoaWNoIHRoZSBkaWFnb25hbHMgc2hvdWxkIGJlIHRha2VuLiBEZWZhdWx0cyB0byBzZWNvbmQgYXhpcyAoMSkuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYXJyYXlfb2ZfZGlhZ29uYWxzIDogbmRhcnJheQogICAgICAgIElmIGBhYCBpcyAyLUQgYW5kIG5vdCBhIG1hdHJpeCwgYSAxLUQgYXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBhcyBgYWAKICAgICAgICBjb250YWluaW5nIHRoZSBkaWFnb25hbCBpcyByZXR1cm5lZC4gSWYgYGFgIGlzIGEgbWF0cml4LCBhIDEtRAogICAgICAgIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRpYWdvbmFsIGlzIHJldHVybmVkIGluIG9yZGVyIHRvIG1haW50YWluCiAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gIElmIHRoZSBkaW1lbnNpb24gb2YgYGFgIGlzIGdyZWF0ZXIgdGhhbgogICAgICAgIHR3bywgdGhlbiBhbiBhcnJheSBvZiBkaWFnb25hbHMgaXMgcmV0dXJuZWQsICJwYWNrZWQiIGZyb20KICAgICAgICBsZWZ0LW1vc3QgZGltZW5zaW9uIHRvIHJpZ2h0LW1vc3QgKGUuZy4sIGlmIGBhYCBpcyAzLUQsIHRoZW4gdGhlCiAgICAgICAgZGlhZ29uYWxzIGFyZSAicGFja2VkIiBhbG9uZyByb3dzKS4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIHRoZSBkaW1lbnNpb24gb2YgYGFgIGlzIGxlc3MgdGhhbiAyLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgZGlhZyA6IE1BVExBQiB3b3JrLWEtbGlrZSBmb3IgMS1EIGFuZCAyLUQgYXJyYXlzLgogICAgZGlhZ2ZsYXQgOiBDcmVhdGUgZGlhZ29uYWwgYXJyYXlzLgogICAgdHJhY2UgOiBTdW0gYWxvbmcgZGlhZ29uYWxzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcmFuZ2UoNCkucmVzaGFwZSgyLDIpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swLCAxXSwKICAgICAgICAgICBbMiwgM11dKQogICAgPj4+IGEuZGlhZ29uYWwoKQogICAgYXJyYXkoWzAsIDNdKQogICAgPj4+IGEuZGlhZ29uYWwoMSkKICAgIGFycmF5KFsxXSkKCiAgICBBIDMtRCBleGFtcGxlOgoKICAgID4+PiBhID0gbnAuYXJhbmdlKDgpLnJlc2hhcGUoMiwyLDIpOyBhCiAgICBhcnJheShbW1swLCAxXSwKICAgICAgICAgICAgWzIsIDNdXSwKICAgICAgICAgICBbWzQsIDVdLAogICAgICAgICAgICBbNiwgN11dXSkKICAgID4+PiBhLmRpYWdvbmFsKDAsICMgTWFpbiBkaWFnb25hbHMgb2YgdHdvIGFycmF5cyBjcmVhdGVkIGJ5IHNraXBwaW5nCiAgICAuLi4gICAgICAgICAgICAwLCAjIGFjcm9zcyB0aGUgb3V0ZXIobGVmdCktbW9zdCBheGlzIGxhc3QgYW5kCiAgICAuLi4gICAgICAgICAgICAxKSAjIHRoZSAibWlkZGxlIiAocm93KSBheGlzIGZpcnN0LgogICAgYXJyYXkoW1swLCA2XSwKICAgICAgICAgICBbMSwgN11dKQoKICAgIFRoZSBzdWItYXJyYXlzIHdob3NlIG1haW4gZGlhZ29uYWxzIHdlIGp1c3Qgb2J0YWluZWQ7IG5vdGUgdGhhdCBlYWNoCiAgICBjb3JyZXNwb25kcyB0byBmaXhpbmcgdGhlIHJpZ2h0LW1vc3QgKGNvbHVtbikgYXhpcywgYW5kIHRoYXQgdGhlCiAgICBkaWFnb25hbHMgYXJlICJwYWNrZWQiIGluIHJvd3MuCgogICAgPj4+IGFbOiw6LDBdICMgbWFpbiBkaWFnb25hbCBpcyBbMCA2XQogICAgYXJyYXkoW1swLCAyXSwKICAgICAgICAgICBbNCwgNl1dKQogICAgPj4+IGFbOiw6LDFdICMgbWFpbiBkaWFnb25hbCBpcyBbMSA3XQogICAgYXJyYXkoW1sxLCAzXSwKICAgICAgICAgICBbNSwgN11dKQoKICAgICkD2gZvZmZzZXRyXAAAAHJdAAAATikGcj8AAADaAm5w2gZtYXRyaXhyCwAAAHIhAAAAcg0AAAApBHJRAAAAcnMAAAByXAAAAHJdAAAAckgAAABySAAAAHJJAAAAciEAAAC0BAAAcwYAAAAAagwCFAJjBgAAAAAAAAAGAAAABwAAAEMAAABzQAAAAHQAfAB0AWoCgwJyJHQDfACDAWoEfAF8AnwDfAR8BWQBjQVTAHQFfACDAWoEfAF8AnwDfAR8BWQBjQVTAGQCUwApA2GQBwAACiAgICBSZXR1cm4gdGhlIHN1bSBhbG9uZyBkaWFnb25hbHMgb2YgdGhlIGFycmF5LgoKICAgIElmIGBhYCBpcyAyLUQsIHRoZSBzdW0gYWxvbmcgaXRzIGRpYWdvbmFsIHdpdGggdGhlIGdpdmVuIG9mZnNldAogICAgaXMgcmV0dXJuZWQsIGkuZS4sIHRoZSBzdW0gb2YgZWxlbWVudHMgYGBhW2ksaStvZmZzZXRdYGAgZm9yIGFsbCBpLgoKICAgIElmIGBhYCBoYXMgbW9yZSB0aGFuIHR3byBkaW1lbnNpb25zLCB0aGVuIHRoZSBheGVzIHNwZWNpZmllZCBieSBheGlzMSBhbmQKICAgIGF4aXMyIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgMi1EIHN1Yi1hcnJheXMgd2hvc2UgdHJhY2VzIGFyZSByZXR1cm5lZC4KICAgIFRoZSBzaGFwZSBvZiB0aGUgcmVzdWx0aW5nIGFycmF5IGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgYGFgIHdpdGggYGF4aXMxYAogICAgYW5kIGBheGlzMmAgcmVtb3ZlZC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LCBmcm9tIHdoaWNoIHRoZSBkaWFnb25hbHMgYXJlIHRha2VuLgogICAgb2Zmc2V0IDogaW50LCBvcHRpb25hbAogICAgICAgIE9mZnNldCBvZiB0aGUgZGlhZ29uYWwgZnJvbSB0aGUgbWFpbiBkaWFnb25hbC4gQ2FuIGJlIGJvdGggcG9zaXRpdmUKICAgICAgICBhbmQgbmVnYXRpdmUuIERlZmF1bHRzIHRvIDAuCiAgICBheGlzMSwgYXhpczIgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhlcyB0byBiZSB1c2VkIGFzIHRoZSBmaXJzdCBhbmQgc2Vjb25kIGF4aXMgb2YgdGhlIDItRCBzdWItYXJyYXlzCiAgICAgICAgZnJvbSB3aGljaCB0aGUgZGlhZ29uYWxzIHNob3VsZCBiZSB0YWtlbi4gRGVmYXVsdHMgYXJlIHRoZSBmaXJzdCB0d28KICAgICAgICBheGVzIG9mIGBhYC4KICAgIGR0eXBlIDogZHR5cGUsIG9wdGlvbmFsCiAgICAgICAgRGV0ZXJtaW5lcyB0aGUgZGF0YS10eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBhbmQgb2YgdGhlIGFjY3VtdWxhdG9yCiAgICAgICAgd2hlcmUgdGhlIGVsZW1lbnRzIGFyZSBzdW1tZWQuIElmIGR0eXBlIGhhcyB0aGUgdmFsdWUgTm9uZSBhbmQgYGFgIGlzCiAgICAgICAgb2YgaW50ZWdlciB0eXBlIG9mIHByZWNpc2lvbiBsZXNzIHRoYW4gdGhlIGRlZmF1bHQgaW50ZWdlcgogICAgICAgIHByZWNpc2lvbiwgdGhlbiB0aGUgZGVmYXVsdCBpbnRlZ2VyIHByZWNpc2lvbiBpcyB1c2VkLiBPdGhlcndpc2UsCiAgICAgICAgdGhlIHByZWNpc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGF0IG9mIGBhYC4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQXJyYXkgaW50byB3aGljaCB0aGUgb3V0cHV0IGlzIHBsYWNlZC4gSXRzIHR5cGUgaXMgcHJlc2VydmVkIGFuZAogICAgICAgIGl0IG11c3QgYmUgb2YgdGhlIHJpZ2h0IHNoYXBlIHRvIGhvbGQgdGhlIG91dHB1dC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBzdW1fYWxvbmdfZGlhZ29uYWxzIDogbmRhcnJheQogICAgICAgIElmIGBhYCBpcyAyLUQsIHRoZSBzdW0gYWxvbmcgdGhlIGRpYWdvbmFsIGlzIHJldHVybmVkLiAgSWYgYGFgIGhhcwogICAgICAgIGxhcmdlciBkaW1lbnNpb25zLCB0aGVuIGFuIGFycmF5IG9mIHN1bXMgYWxvbmcgZGlhZ29uYWxzIGlzIHJldHVybmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgZGlhZywgZGlhZ29uYWwsIGRpYWdmbGF0CgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAudHJhY2UobnAuZXllKDMpKQogICAgMy4wCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg4KS5yZXNoYXBlKCgyLDIsMikpCiAgICA+Pj4gbnAudHJhY2UoYSkKICAgIGFycmF5KFs2LCA4XSkKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgyNCkucmVzaGFwZSgoMiwyLDIsMykpCiAgICA+Pj4gbnAudHJhY2UoYSkuc2hhcGUKICAgICgyLCAzKQoKICAgICkFcnMAAAByXAAAAHJdAAAAcm4AAAByTwAAAE4pBnI/AAAAcnQAAABydQAAAHILAAAAcjoAAAByDQAAACkGclEAAABycwAAAHJcAAAAcl0AAABybgAAAHJPAAAAckgAAABySAAAAHJJAAAAcjoAAAAlBQAAcwYAAAAAOAwCGAJjAgAAAAAAAAACAAAAAwAAAEMAAABzMAAAAHQAfAB0AWoCgwJyHHQDfACDAWoEfAFkAY0BUwB0BXwAgwFqBHwBZAGNAVMAZAJTACkDYb8NAABSZXR1cm4gYSBjb250aWd1b3VzIGZsYXR0ZW5lZCBhcnJheS4KCiAgICBBIDEtRCBhcnJheSwgY29udGFpbmluZyB0aGUgZWxlbWVudHMgb2YgdGhlIGlucHV0LCBpcyByZXR1cm5lZC4gIEEgY29weSBpcwogICAgbWFkZSBvbmx5IGlmIG5lZWRlZC4KCiAgICBBcyBvZiBOdW1QeSAxLjEwLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIGlucHV0CiAgICBhcnJheS4gKGZvciBleGFtcGxlLCBhIG1hc2tlZCBhcnJheSB3aWxsIGJlIHJldHVybmVkIGZvciBhIG1hc2tlZCBhcnJheQogICAgaW5wdXQpCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheS4gIFRoZSBlbGVtZW50cyBpbiBgYWAgYXJlIHJlYWQgaW4gdGhlIG9yZGVyIHNwZWNpZmllZCBieQogICAgICAgIGBvcmRlcmAsIGFuZCBwYWNrZWQgYXMgYSAxLUQgYXJyYXkuCiAgICBvcmRlciA6IHsnQycsJ0YnLCAnQScsICdLJ30sIG9wdGlvbmFsCgogICAgICAgIFRoZSBlbGVtZW50cyBvZiBgYWAgYXJlIHJlYWQgdXNpbmcgdGhpcyBpbmRleCBvcmRlci4gJ0MnIG1lYW5zCiAgICAgICAgdG8gaW5kZXggdGhlIGVsZW1lbnRzIGluIHJvdy1tYWpvciwgQy1zdHlsZSBvcmRlciwKICAgICAgICB3aXRoIHRoZSBsYXN0IGF4aXMgaW5kZXggY2hhbmdpbmcgZmFzdGVzdCwgYmFjayB0byB0aGUgZmlyc3QKICAgICAgICBheGlzIGluZGV4IGNoYW5naW5nIHNsb3dlc3QuICAnRicgbWVhbnMgdG8gaW5kZXggdGhlIGVsZW1lbnRzCiAgICAgICAgaW4gY29sdW1uLW1ham9yLCBGb3J0cmFuLXN0eWxlIG9yZGVyLCB3aXRoIHRoZQogICAgICAgIGZpcnN0IGluZGV4IGNoYW5naW5nIGZhc3Rlc3QsIGFuZCB0aGUgbGFzdCBpbmRleCBjaGFuZ2luZwogICAgICAgIHNsb3dlc3QuIE5vdGUgdGhhdCB0aGUgJ0MnIGFuZCAnRicgb3B0aW9ucyB0YWtlIG5vIGFjY291bnQgb2YKICAgICAgICB0aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgdW5kZXJseWluZyBhcnJheSwgYW5kIG9ubHkgcmVmZXIgdG8KICAgICAgICB0aGUgb3JkZXIgb2YgYXhpcyBpbmRleGluZy4gICdBJyBtZWFucyB0byByZWFkIHRoZSBlbGVtZW50cyBpbgogICAgICAgIEZvcnRyYW4tbGlrZSBpbmRleCBvcmRlciBpZiBgYWAgaXMgRm9ydHJhbiAqY29udGlndW91cyogaW4KICAgICAgICBtZW1vcnksIEMtbGlrZSBvcmRlciBvdGhlcndpc2UuICAnSycgbWVhbnMgdG8gcmVhZCB0aGUKICAgICAgICBlbGVtZW50cyBpbiB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiBtZW1vcnksIGV4Y2VwdCBmb3IKICAgICAgICByZXZlcnNpbmcgdGhlIGRhdGEgd2hlbiBzdHJpZGVzIGFyZSBuZWdhdGl2ZS4gIEJ5IGRlZmF1bHQsICdDJwogICAgICAgIGluZGV4IG9yZGVyIGlzIHVzZWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgeSA6IGFycmF5X2xpa2UKICAgICAgICBJZiBgYWAgaXMgYSBtYXRyaXgsIHkgaXMgYSAxLUQgbmRhcnJheSwgb3RoZXJ3aXNlIHkgaXMgYW4gYXJyYXkgb2YKICAgICAgICB0aGUgc2FtZSBzdWJ0eXBlIGFzIGBhYC4gVGhlIHNoYXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBpcwogICAgICAgIGBgKGEuc2l6ZSwpYGAuIE1hdHJpY2VzIGFyZSBzcGVjaWFsIGNhc2VkIGZvciBiYWNrd2FyZAogICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBuZGFycmF5LmZsYXQgOiAxLUQgaXRlcmF0b3Igb3ZlciBhbiBhcnJheS4KICAgIG5kYXJyYXkuZmxhdHRlbiA6IDEtRCBhcnJheSBjb3B5IG9mIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheQogICAgICAgICAgICAgICAgICAgICAgaW4gcm93LW1ham9yIG9yZGVyLgogICAgbmRhcnJheS5yZXNoYXBlIDogQ2hhbmdlIHRoZSBzaGFwZSBvZiBhbiBhcnJheSB3aXRob3V0IGNoYW5naW5nIGl0cyBkYXRhLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSW4gcm93LW1ham9yLCBDLXN0eWxlIG9yZGVyLCBpbiB0d28gZGltZW5zaW9ucywgdGhlIHJvdyBpbmRleAogICAgdmFyaWVzIHRoZSBzbG93ZXN0LCBhbmQgdGhlIGNvbHVtbiBpbmRleCB0aGUgcXVpY2tlc3QuICBUaGlzIGNhbgogICAgYmUgZ2VuZXJhbGl6ZWQgdG8gbXVsdGlwbGUgZGltZW5zaW9ucywgd2hlcmUgcm93LW1ham9yIG9yZGVyCiAgICBpbXBsaWVzIHRoYXQgdGhlIGluZGV4IGFsb25nIHRoZSBmaXJzdCBheGlzIHZhcmllcyBzbG93ZXN0LCBhbmQKICAgIHRoZSBpbmRleCBhbG9uZyB0aGUgbGFzdCBxdWlja2VzdC4gIFRoZSBvcHBvc2l0ZSBob2xkcyBmb3IKICAgIGNvbHVtbi1tYWpvciwgRm9ydHJhbi1zdHlsZSBpbmRleCBvcmRlcmluZy4KCiAgICBXaGVuIGEgdmlldyBpcyBkZXNpcmVkIGluIGFzIG1hbnkgY2FzZXMgYXMgcG9zc2libGUsIGBgYXJyLnJlc2hhcGUoLTEpYGAKICAgIG1heSBiZSBwcmVmZXJhYmxlLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgSXQgaXMgZXF1aXZhbGVudCB0byBgYHJlc2hhcGUoLTEsIG9yZGVyPW9yZGVyKWBgLgoKICAgID4+PiB4ID0gbnAuYXJyYXkoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSkKICAgID4+PiBwcmludChucC5yYXZlbCh4KSkKICAgIFsxIDIgMyA0IDUgNl0KCiAgICA+Pj4gcHJpbnQoeC5yZXNoYXBlKC0xKSkKICAgIFsxIDIgMyA0IDUgNl0KCiAgICA+Pj4gcHJpbnQobnAucmF2ZWwoeCwgb3JkZXI9J0YnKSkKICAgIFsxIDQgMiA1IDMgNl0KCiAgICBXaGVuIGBgb3JkZXJgYCBpcyAnQScsIGl0IHdpbGwgcHJlc2VydmUgdGhlIGFycmF5J3MgJ0MnIG9yICdGJyBvcmRlcmluZzoKCiAgICA+Pj4gcHJpbnQobnAucmF2ZWwoeC5UKSkKICAgIFsxIDQgMiA1IDMgNl0KICAgID4+PiBwcmludChucC5yYXZlbCh4LlQsIG9yZGVyPSdBJykpCiAgICBbMSAyIDMgNCA1IDZdCgogICAgV2hlbiBgYG9yZGVyYGAgaXMgJ0snLCBpdCB3aWxsIHByZXNlcnZlIG9yZGVyaW5ncyB0aGF0IGFyZSBuZWl0aGVyICdDJwogICAgbm9yICdGJywgYnV0IHdvbid0IHJldmVyc2UgYXhlczoKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgzKVs6Oi0xXTsgYQogICAgYXJyYXkoWzIsIDEsIDBdKQogICAgPj4+IGEucmF2ZWwob3JkZXI9J0MnKQogICAgYXJyYXkoWzIsIDEsIDBdKQogICAgPj4+IGEucmF2ZWwob3JkZXI9J0snKQogICAgYXJyYXkoWzIsIDEsIDBdKQoKICAgID4+PiBhID0gbnAuYXJhbmdlKDEyKS5yZXNoYXBlKDIsMywyKS5zd2FwYXhlcygxLDIpOyBhCiAgICBhcnJheShbW1sgMCwgIDIsICA0XSwKICAgICAgICAgICAgWyAxLCAgMywgIDVdXSwKICAgICAgICAgICBbWyA2LCAgOCwgMTBdLAogICAgICAgICAgICBbIDcsICA5LCAxMV1dXSkKICAgID4+PiBhLnJhdmVsKG9yZGVyPSdDJykKICAgIGFycmF5KFsgMCwgIDIsICA0LCAgMSwgIDMsICA1LCAgNiwgIDgsIDEwLCAgNywgIDksIDExXSkKICAgID4+PiBhLnJhdmVsKG9yZGVyPSdLJykKICAgIGFycmF5KFsgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExXSkKCiAgICApAXJUAAAATikGcj8AAABydAAAAHJ1AAAAcgsAAAByKwAAAHINAAAAKQJyUQAAAHJUAAAAckgAAABySAAAAHJJAAAAcisAAABkBQAAcwYAAAAAZQwBEAJjAQAAAAAAAAABAAAAAwAAAEMAAABzCgAAAHQAfABkAYMCUwApAmE8CAAACiAgICBSZXR1cm4gdGhlIGluZGljZXMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgYXJlIG5vbi16ZXJvLgoKICAgIFJldHVybnMgYSB0dXBsZSBvZiBhcnJheXMsIG9uZSBmb3IgZWFjaCBkaW1lbnNpb24gb2YgYGFgLAogICAgY29udGFpbmluZyB0aGUgaW5kaWNlcyBvZiB0aGUgbm9uLXplcm8gZWxlbWVudHMgaW4gdGhhdAogICAgZGltZW5zaW9uLiBUaGUgdmFsdWVzIGluIGBhYCBhcmUgYWx3YXlzIHRlc3RlZCBhbmQgcmV0dXJuZWQgaW4KICAgIHJvdy1tYWpvciwgQy1zdHlsZSBvcmRlci4gVGhlIGNvcnJlc3BvbmRpbmcgbm9uLXplcm8KICAgIHZhbHVlcyBjYW4gYmUgb2J0YWluZWQgd2l0aDo6CgogICAgICAgIGFbbm9uemVybyhhKV0KCiAgICBUbyBncm91cCB0aGUgaW5kaWNlcyBieSBlbGVtZW50LCByYXRoZXIgdGhhbiBkaW1lbnNpb24sIHVzZTo6CgogICAgICAgIHRyYW5zcG9zZShub256ZXJvKGEpKQoKICAgIFRoZSByZXN1bHQgb2YgdGhpcyBpcyBhbHdheXMgYSAyLUQgYXJyYXksIHdpdGggYSByb3cgZm9yCiAgICBlYWNoIG5vbi16ZXJvIGVsZW1lbnQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB0dXBsZV9vZl9hcnJheXMgOiB0dXBsZQogICAgICAgIEluZGljZXMgb2YgZWxlbWVudHMgdGhhdCBhcmUgbm9uLXplcm8uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBmbGF0bm9uemVybyA6CiAgICAgICAgUmV0dXJuIGluZGljZXMgdGhhdCBhcmUgbm9uLXplcm8gaW4gdGhlIGZsYXR0ZW5lZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dAogICAgICAgIGFycmF5LgogICAgbmRhcnJheS5ub256ZXJvIDoKICAgICAgICBFcXVpdmFsZW50IG5kYXJyYXkgbWV0aG9kLgogICAgY291bnRfbm9uemVybyA6CiAgICAgICAgQ291bnRzIHRoZSBudW1iZXIgb2Ygbm9uLXplcm8gZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcnJheShbWzEsMCwwXSwgWzAsMiwwXSwgWzEsMSwwXV0pCiAgICA+Pj4geAogICAgYXJyYXkoW1sxLCAwLCAwXSwKICAgICAgICAgICBbMCwgMiwgMF0sCiAgICAgICAgICAgWzEsIDEsIDBdXSkKICAgID4+PiBucC5ub256ZXJvKHgpCiAgICAoYXJyYXkoWzAsIDEsIDIsIDJdLCBkdHlwZT1pbnQ2NCksIGFycmF5KFswLCAxLCAwLCAxXSwgZHR5cGU9aW50NjQpKQoKICAgID4+PiB4W25wLm5vbnplcm8oeCldCiAgICBhcnJheShbIDEuLCAgMS4sICAxLl0pCiAgICA+Pj4gbnAudHJhbnNwb3NlKG5wLm5vbnplcm8oeCkpCiAgICBhcnJheShbWzAsIDBdLAogICAgICAgICAgIFsxLCAxXSwKICAgICAgICAgICBbMiwg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ZW4KICAgIHdvcmtpbmcgb24gYSAxLUQgYXJyYXksIGBjb21wcmVzc2AgaXMgZXF1aXZhbGVudCB0byBgZXh0cmFjdGAuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgY29uZGl0aW9uIDogMS1EIGFycmF5IG9mIGJvb2xzCiAgICAgICAgQXJyYXkgdGhhdCBzZWxlY3RzIHdoaWNoIGVudHJpZXMgdG8gcmV0dXJuLiBJZiBsZW4oY29uZGl0aW9uKQogICAgICAgIGlzIGxlc3MgdGhhbiB0aGUgc2l6ZSBvZiBgYWAgYWxvbmcgdGhlIGdpdmVuIGF4aXMsIHRoZW4gb3V0cHV0IGlzCiAgICAgICAgdHJ1bmNhdGVkIHRvIHRoZSBsZW5ndGggb2YgdGhlIGNvbmRpdGlvbiBhcnJheS4KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgZnJvbSB3aGljaCB0byBleHRyYWN0IGEgcGFydC4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0byB0YWtlIHNsaWNlcy4gSWYgTm9uZSAoZGVmYXVsdCksIHdvcmsgb24gdGhlCiAgICAgICAgZmxhdHRlbmVkIGFycmF5LgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBPdXRwdXQgYXJyYXkuICBJdHMgdHlwZSBpcyBwcmVzZXJ2ZWQgYW5kIGl0IG11c3QgYmUgb2YgdGhlIHJpZ2h0CiAgICAgICAgc2hhcGUgdG8gaG9sZCB0aGUgb3V0cHV0LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGNvbXByZXNzZWRfYXJyYXkgOiBuZGFycmF5CiAgICAgICAgQSBjb3B5IG9mIGBhYCB3aXRob3V0IHRoZSBzbGljZXMgYWxvbmcgYXhpcyBmb3Igd2hpY2ggYGNvbmRpdGlvbmAKICAgICAgICBpcyBmYWxzZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHRha2UsIGNob29zZSwgZGlhZywgZGlhZ29uYWwsIHNlbGVjdAogICAgbmRhcnJheS5jb21wcmVzcyA6IEVxdWl2YWxlbnQgbWV0aG9kIGluIG5kYXJyYXkKICAgIG5wLmV4dHJhY3Q6IEVxdWl2YWxlbnQgbWV0aG9kIHdoZW4gd29ya2luZyBvbiAxLUQgYXJyYXlzCiAgICBudW1weS5kb2MudWZ1bmNzIDogU2VjdGlvbiAiT3V0cHV0IGFyZ3VtZW50cyIKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKQogICAgPj4+IGEKICAgIGFycmF5KFtbMSwgMl0sCiAgICAgICAgICAgWzMsIDRdLAogICAgICAgICAgIFs1LCA2XV0pCiAgICA+Pj4gbnAuY29tcHJlc3MoWzAsIDFdLCBhLCBheGlzPTApCiAgICBhcnJheShbWzMsIDRdXSkKICAgID4+PiBucC5jb21wcmVzcyhbRmFsc2UsIFRydWUsIFRydWVdLCBhLCBheGlzPTApCiAgICBhcnJheShbWzMsIDRdLAogICAgICAgICAgIFs1LCA2XV0pCiAgICA+Pj4gbnAuY29tcHJlc3MoW0ZhbHNlLCBUcnVlXSwgYSwgYXhpcz0xKQogICAgYXJyYXkoW1syXSwKICAgICAgICAgICBbNF0sCiAgICAgICAgICAgWzZdXSkKCiAgICBXb3JraW5nIG9uIHRoZSBmbGF0dGVuZWQgYXJyYXkgZG9lcyBub3QgcmV0dXJuIHNsaWNlcyBhbG9uZyBhbiBheGlzIGJ1dAogICAgc2VsZWN0cyBlbGVtZW50cy4KCiAgICA+Pj4gbnAuY29tcHJlc3MoW0ZhbHNlLCBUcnVlXSwgYSkKICAgIGFycmF5KFsyXSkKCiAgICByHQAAACkCck4AAAByTwAAACkBckwAAAApBNoJY29uZGl0aW9uclEAAAByTgAAAHJPAAAAckgAAABySAAAAHJJAAAAch0AAABKBgAAcwIAAAAAPGMEAAAAAAAAAAQAAAAHAAAAQwAAAHMSAAAAdAB8AGQBfAF8AnwDZAKNBVMAKQNh/gYAAAogICAgQ2xpcCAobGltaXQpIHRoZSB2YWx1ZXMgaW4gYW4gYXJyYXkuCgogICAgR2l2ZW4gYW4gaW50ZXJ2YWwsIHZhbHVlcyBvdXRzaWRlIHRoZSBpbnRlcnZhbCBhcmUgY2xpcHBlZCB0bwogICAgdGhlIGludGVydmFsIGVkZ2VzLiAgRm9yIGV4YW1wbGUsIGlmIGFuIGludGVydmFsIG9mIGBgWzAsIDFdYGAKICAgIGlzIHNwZWNpZmllZCwgdmFsdWVzIHNtYWxsZXIgdGhhbiAwIGJlY29tZSAwLCBhbmQgdmFsdWVzIGxhcmdlcgogICAgdGhhbiAxIGJlY29tZSAxLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgQXJyYXkgY29udGFpbmluZyBlbGVtZW50cyB0byBjbGlwLgogICAgYV9taW4gOiBzY2FsYXIgb3IgYXJyYXlfbGlrZSBvciBgTm9uZWAKICAgICAgICBNaW5pbXVtIHZhbHVlLiBJZiBgTm9uZWAsIGNsaXBwaW5nIGlzIG5vdCBwZXJmb3JtZWQgb24gbG93ZXIKICAgICAgICBpbnRlcnZhbCBlZGdlLiBOb3QgbW9yZSB0aGFuIG9uZSBvZiBgYV9taW5gIGFuZCBgYV9tYXhgIG1heSBiZQogICAgICAgIGBOb25lYC4KICAgIGFfbWF4IDogc2NhbGFyIG9yIGFycmF5X2xpa2Ugb3IgYE5vbmVgCiAgICAgICAgTWF4aW11bSB2YWx1ZS4gSWYgYE5vbmVgLCBjbGlwcGluZyBpcyBub3QgcGVyZm9ybWVkIG9uIHVwcGVyCiAgICAgICAgaW50ZXJ2YWwgZWRnZS4gTm90IG1vcmUgdGhhbiBvbmUgb2YgYGFfbWluYCBhbmQgYGFfbWF4YCBtYXkgYmUKICAgICAgICBgTm9uZWAuIElmIGBhX21pbmAgb3IgYGFfbWF4YCBhcmUgYXJyYXlfbGlrZSwgdGhlbiB0aGUgdGhyZWUKICAgICAgICBhcnJheXMgd2lsbCBiZSBicm9hZGNhc3RlZCB0byBtYXRjaCB0aGVpciBzaGFwZXMuCiAgICBvdXQgOiBuZGFycmF5LCBvcHRpb25hbAogICAgICAgIFRoZSByZXN1bHRzIHdpbGwgYmUgcGxhY2VkIGluIHRoaXMgYXJyYXkuIEl0IG1heSBiZSB0aGUgaW5wdXQKICAgICAgICBhcnJheSBmb3IgaW4tcGxhY2UgY2xpcHBpbmcuICBgb3V0YCBtdXN0IGJlIG9mIHRoZSByaWdodCBzaGFwZQogICAgICAgIHRvIGhvbGQgdGhlIG91dHB1dC4gIEl0cyB0eXBlIGlzIHByZXNlcnZlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBjbGlwcGVkX2FycmF5IDogbmRhcnJheQogICAgICAgIEFuIGFycmF5IHdpdGggdGhlIGVsZW1lbnRzIG9mIGBhYCwgYnV0IHdoZXJlIHZhbHVlcwogICAgICAgIDwgYGFfbWluYCBhcmUgcmVwbGFjZWQgd2l0aCBgYV9taW5gLCBhbmQgdGhvc2UgPiBgYV9tYXhgCiAgICAgICAgd2l0aCBgYV9tYXhgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuZG9jLnVmdW5jcyA6IFNlY3Rpb24gIk91dHB1dCBhcmd1bWVudHMiCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgxMCkKICAgID4+PiBucC5jbGlwKGEsIDEsIDgpCiAgICBhcnJheShbMSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOF0pCiAgICA+Pj4gYQogICAgYXJyYXkoWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKQogICAgPj4+IG5wLmNsaXAoYSwgMywgNiwgb3V0PWEpCiAgICBhcnJheShbMywgMywgMywgMywgNCwgNSwgNiwgNiwgNiwgNl0pCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSgxMCkKICAgID4+PiBhCiAgICBhcnJheShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0pCiAgICA+Pj4gbnAuY2xpcChhLCBbMywgNCwgMSwgMSwgMSwgNCwgNCwgNCwgNCwgNF0sIDgpCiAgICBhcnJheShbMywgNCwgMiwgMywgNCwgNSwgNiwgNywgOCwgOF0pCgogICAgchwAAAApAXJPAAAAKQFyTAAAACkEclEAAABaBWFfbWluWgVhX21heHJPAAAAckgAAABySAAAAHJJAAAAchwAAACJBgAAcwIAAAAANmMFAAAAAAAAAAgAAAAIAAAAQwAAAHOeAAAAaQB9BXwEdABqAWsJchZ8BHwFZAE8AHQCfAB0A4MCckB0BHwAgwF9BnwDZAJrCXI8fAZ8A2QDPAB8A1MAfAZTAHQFfACDAXQGagdrCXKEeQp8AGoIfQdXAG4UBAB0CWsKcmwBAAEAAQBZAG4YWAB8B2YAfAF8AnwDZAScA3wFlwKOAVMAdApqC3wAZgF8AXwCfANkBJwDfAWXAo4BUwApBWFMCwAACiAgICBTdW0gb2YgYXJyYXkgZWxlbWVudHMgb3ZlciBhIGdpdmVuIGF4aXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBFbGVtZW50cyB0byBzdW0uCiAgICBheGlzIDogTm9uZSBvciBpbnQgb3IgdHVwbGUgb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGlzIG9yIGF4ZXMgYWxvbmcgd2hpY2ggYSBzdW0gaXMgcGVyZm9ybWVkLiAgVGhlIGRlZmF1bHQsCiAgICAgICAgYXhpcz1Ob25lLCB3aWxsIHN1bSBhbGwgb2YgdGhlIGVsZW1lbnRzIG9mIHRoZSBpbnB1dCBhcnJheS4gIElmCiAgICAgICAgYXhpcyBpcyBuZWdhdGl2ZSBpdCBjb3VudHMgZnJvbSB0aGUgbGFzdCB0byB0aGUgZmlyc3QgYXhpcy4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICAgICAgSWYgYXhpcyBpcyBhIHR1cGxlIG9mIGludHMsIGEgc3VtIGlzIHBlcmZvcm1lZCBvbiBhbGwgb2YgdGhlIGF4ZXMKICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHR1cGxlIGluc3RlYWQgb2YgYSBzaW5nbGUgYXhpcyBvciBhbGwgdGhlIGF4ZXMgYXMKICAgICAgICBiZWZvcmUuCiAgICBkdHlwZSA6IGR0eXBlLCBvcHRpb25hbAogICAgICAgIFRoZSB0eXBlIG9mIHRoZSByZXR1cm5lZCBhcnJheSBhbmQgb2YgdGhlIGFjY3VtdWxhdG9yIGluIHdoaWNoIHRoZQogICAgICAgIGVsZW1lbnRzIGFyZSBzdW1tZWQuICBUaGUgZHR5cGUgb2YgYGFgIGlzIHVzZWQgYnkgZGVmYXVsdCB1bmxlc3MgYGFgCiAgICAgICAgaGFzIGFuIGludGVnZXIgZHR5cGUgb2YgbGVzcyBwcmVjaXNpb24gdGhhbiB0aGUgZGVmYXVsdCBwbGF0Zm9ybQogICAgICAgIGludGVnZXIuICBJbiB0aGF0IGNhc2UsIGlmIGBhYCBpcyBzaWduZWQgdGhlbiB0aGUgcGxhdGZvcm0gaW50ZWdlcgogICAgICAgIGlzIHVzZWQgd2hpbGUgaWYgYGFgIGlzIHVuc2lnbmVkIHRoZW4gYW4gdW5zaWduZWQgaW50ZWdlciBvZiB0aGUKICAgICAgICBzYW1lIHByZWNpc2lvbiBhcyB0aGUgcGxhdGZvcm0gaW50ZWdlciBpcyB1c2VkLgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBBbHRlcm5hdGl2ZSBvdXRwdXQgYXJyYXkgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIHJlc3VsdC4gSXQgbXVzdCBoYXZlCiAgICAgICAgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGV4cGVjdGVkIG91dHB1dCwgYnV0IHRoZSB0eXBlIG9mIHRoZSBvdXRwdXQKICAgICAgICB2YWx1ZXMgd2lsbCBiZSBjYXN0IGlmIG5lY2Vzc2FyeS4KICAgIGtlZXBkaW1zIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBJZiB0aGlzIGlzIHNldCB0byBUcnVlLCB0aGUgYXhlcyB3aGljaCBhcmUgcmVkdWNlZCBhcmUgbGVmdAogICAgICAgIGluIHRoZSByZXN1bHQgYXMgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiBXaXRoIHRoaXMgb3B0aW9uLAogICAgICAgIHRoZSByZXN1bHQgd2lsbCBicm9hZGNhc3QgY29ycmVjdGx5IGFnYWluc3QgdGhlIGlucHV0IGFycmF5LgoKICAgICAgICBJZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQsIHRoZW4gYGtlZXBkaW1zYCB3aWxsIG5vdCBiZQogICAgICAgIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgc3VtYCBtZXRob2Qgb2Ygc3ViLWNsYXNzZXMgb2YKICAgICAgICBgbmRhcnJheWAsIGhvd2V2ZXIgYW55IG5vbi1kZWZhdWx0IHZhbHVlIHdpbGwgYmUuICBJZiB0aGUKICAgICAgICBzdWItY2xhc3NlcyBgc3VtYCBtZXRob2QgZG9lcyBub3QgaW1wbGVtZW50IGBrZWVwZGltc2AgYW55CiAgICAgICAgZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBzdW1fYWxvbmdfYXhpcyA6IG5kYXJyYXkKICAgICAgICBBbiBhcnJheSB3aXRoIHRoZSBzYW1lIHNoYXBlIGFzIGBhYCwgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICAgYXhpcyByZW1vdmVkLiAgIElmIGBhYCBpcyBhIDAtZCBhcnJheSwgb3IgaWYgYGF4aXNgIGlzIE5vbmUsIGEgc2NhbGFyCiAgICAgICAgaXMgcmV0dXJuZWQuICBJZiBhbiBvdXRwdXQgYXJyYXkgaXMgc3BlY2lmaWVkLCBhIHJlZmVyZW5jZSB0bwogICAgICAgIGBvdXRgIGlzIHJldHVybmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5zdW0gOiBFcXVpdmFsZW50IG1ldGhvZC4KCiAgICBjdW1zdW0gOiBDdW11bGF0aXZlIHN1bSBvZiBhcnJheSBlbGVtZW50cy4KCiAgICB0cmFweiA6IEludGVncmF0aW9uIG9mIGFycmF5IHZhbHVlcyB1c2luZyB0aGUgY29tcG9zaXRlIHRyYXBlem9pZGFsIHJ1bGUuCgogICAgbWVhbiwgYXZlcmFnZQoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgQXJpdGhtZXRpYyBpcyBtb2R1bGFyIHdoZW4gdXNpbmcgaW50ZWdlciB0eXBlcywgYW5kIG5vIGVycm9yIGlzCiAgICByYWlzZWQgb24gb3ZlcmZsb3cuCgogICAgVGhlIHN1bSBvZiBhbiBlbXB0eSBhcnJheSBpcyB0aGUgbmV1dHJhbCBlbGVtZW50IDA6CgogICAgPj4+IG5wLnN1bShbXSkKICAgIDAuMAoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLnN1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CgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheSBvciBvYmplY3QgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGFuIGFycmF5LgogICAgYXhpcyA6IE5vbmUgb3IgaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIGEgbG9naWNhbCBPUiByZWR1Y3Rpb24gaXMgcGVyZm9ybWVkLgogICAgICAgIFRoZSBkZWZhdWx0IChgYXhpc2AgPSBgTm9uZWApIGlzIHRvIHBlcmZvcm0gYSBsb2dpY2FsIE9SIG92ZXIgYWxsCiAgICAgICAgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlucHV0IGFycmF5LiBgYXhpc2AgbWF5IGJlIG5lZ2F0aXZlLCBpbgogICAgICAgIHdoaWNoIGNhc2UgaXQgY291bnRzIGZyb20gdGhlIGxhc3QgdG8gdGhlIGZpcnN0IGF4aXMuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgICAgIElmIHRoaXMgaXMgYSB0dXBsZSBvZiBpbnRzLCBhIHJlZHVjdGlvbiBpcyBwZXJmb3JtZWQgb24gbXVsdGlwbGUKICAgICAgICBheGVzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGF4aXMgb3IgYWxsIHRoZSBheGVzIGFzIGJlZm9yZS4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQWx0ZXJuYXRlIG91dHB1dCBhcnJheSBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0LiAgSXQgbXVzdCBoYXZlCiAgICAgICAgdGhlIHNhbWUgc2hhcGUgYXMgdGhlIGV4cGVjdGVkIG91dHB1dCBhbmQgaXRzIHR5cGUgaXMgcHJlc2VydmVkCiAgICAgICAgKGUuZy4sIGlmIGl0IGlzIG9mIHR5cGUgZmxvYXQsIHRoZW4gaXQgd2lsbCByZW1haW4gc28sIHJldHVybmluZwogICAgICAgIDEuMCBmb3IgVHJ1ZSBhbmQgMC4wIGZvciBGYWxzZSwgcmVnYXJkbGVzcyBvZiB0aGUgdHlwZSBvZiBgYWApLgogICAgICAgIFNlZSBgZG9jLnVmdW5jc2AgKFNlY3Rpb24gIk91dHB1dCBhcmd1bWVudHMiKSBmb3IgZGV0YWlscy4KCiAgICBrZWVwZGltcyA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gVHJ1ZSwgdGhlIGF4ZXMgd2hpY2ggYXJlIHJlZHVjZWQgYXJlIGxlZnQKICAgICAgICBpbiB0aGUgcmVzdWx0IGFzIGRpbWVuc2lvbnMgd2l0aCBzaXplIG9uZS4gV2l0aCB0aGlzIG9wdGlvbiwKICAgICAgICB0aGUgcmVzdWx0IHdpbGwgYnJvYWRjYXN0IGNvcnJlY3RseSBhZ2FpbnN0IHRoZSBpbnB1dCBhcnJheS4KCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkLCB0aGVuIGBrZWVwZGltc2Agd2lsbCBub3QgYmUKICAgICAgICBwYXNzZWQgdGhyb3VnaCB0byB0aGUgYGFueWAgbWV0aG9kIG9mIHN1Yi1jbGFzc2VzIG9mCiAgICAgICAgYG5kYXJyYXlgLCBob3dldmVyIGFueSBub24tZGVmYXVsdCB2YWx1ZSB3aWxsIGJlLiAgSWYgdGhlCiAgICAgICAgc3ViLWNsYXNzZXMgYHN1bWAgbWV0aG9kIGRvZXMgbm90IGltcGxlbWVudCBga2VlcGRpbXNgIGFueQogICAgICAgIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYW55IDogYm9vbCBvciBuZGFycmF5CiAgICAgICAgQSBuZXcgYm9vbGVhbiBvciBgbmRhcnJheWAgaXMgcmV0dXJuZWQgdW5sZXNzIGBvdXRgIGlzIHNwZWNpZmllZCwKICAgICAgICBpbiB3aGljaCBjYXNlIGEgcmVmZXJlbmNlIHRvIGBvdXRgIGlzIHJldHVybmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbmRhcnJheS5hbnkgOiBlcXVpdmFsZW50IG1ldGhvZAoKICAgIGFsbCA6IFRlc3Qgd2hldGhlciBhbGwgZWxlbWVudHMgYWxvbmcgYSBnaXZlbiBheGlzIGV2YWx1YXRlIHRvIFRydWUuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBOb3QgYSBOdW1iZXIgKE5hTiksIHBvc2l0aXZlIGluZmluaXR5IGFuZCBuZWdhdGl2ZSBpbmZpbml0eSBldmFsdWF0ZQogICAgdG8gYFRydWVgIGJlY2F1c2UgdGhlc2UgYXJlIG5vdCBlcXVhbCB0byB6ZXJvLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFueShbW1RydWUsIEZhbHNlXSwgW1RydWUsIFRydWVdXSkKICAgIFRydWUKCiAgICA+Pj4gbnAuYW55KFtbVHJ1ZSwgRmFsc2VdLCBbRmFsc2UsIEZhbHNlXV0sIGF4aXM9MCkKICAgIGFycmF5KFsgVHJ1ZSwgRmFsc2VdLCBkdHlwZT1ib29sKQoKICAgID4+PiBucC5hbnkoWy0xLCAwLCA1XSkKICAgIFRydWUKCiAgICA+Pj4gbnAuYW55KG5wLm5hbikKICAgIFRydWUKCiAgICA+Pj4gbz1ucC5hcnJheShbRmFsc2VdKQogICAgPj4+IHo9bnAuYW55KFstMSwgNCwgNV0sIG91dD1vKQogICAgPj4+IHosIG8KICAgIChhcnJheShbIFRydWVdLCBkdHlwZT1ib29sKSwgYXJyYXkoWyBUcnVlXSwgZHR5cGU9Ym9vbCkpCiAgICA+Pj4gIyBDaGVjayBub3cgdGhhdCB6IGlzIGEgcmVmZXJlbmNlIHRvIG8KICAgID4+PiB6IGlzIG8KICAgIFRydWUKICAgID4+PiBpZCh6KSwgaWQobykgIyBpZGVudGl0eSBvZiB6IGFuZCBvICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCiAgICAoMTkxNjE0MjQwLCAxOTE2MTQyNDApCgogICAgcncAAAApAnJOAAAAck8AAAApBHINAAAAcnQAAAByeAAAAHIVAAAAKQZyUQAAAHJOAAAAck8AAABydwAAAHJ9AAAAcnsAAABySAAAAHJIAAAAckkAAAByFQAAAF4HAABzCgAAAABQCAEEAQoBCAFjBAAAAAAAAAAGAAAABQAAAEMAAABzNAAAAHQAfACDAX0EaQB9BXwDdAFqAmsJch58A3wFZAE8AHwEagNmAHwBfAJkApwCfAWXAo4BUwApA2GgCQAACiAgICBUZXN0IHdoZXRoZXIgYWxsIGFycmF5IGVsZW1lbnRzIGFsb25nIGEgZ2l2ZW4gYXhpcyBldmFsdWF0ZSB0byBUcnVlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXkgb3Igb2JqZWN0IHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheS4KICAgIGF4aXMgOiBOb25lIG9yIGludCBvciB0dXBsZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIEF4aXMgb3IgYXhlcyBhbG9uZyB3aGljaCBhIGxvZ2ljYWwgQU5EIHJlZHVjdGlvbiBpcyBwZXJmb3JtZWQuCiAgICAgICAgVGhlIGRlZmF1bHQgKGBheGlzYCA9IGBOb25lYCkgaXMgdG8gcGVyZm9ybSBhIGxvZ2ljYWwgQU5EIG92ZXIgYWxsCiAgICAgICAgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGlucHV0IGFycmF5LiBgYXhpc2AgbWF5IGJlIG5lZ2F0aXZlLCBpbgogICAgICAgIHdoaWNoIGNhc2UgaXQgY291bnRzIGZyb20gdGhlIGxhc3QgdG8gdGhlIGZpcnN0IGF4aXMuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgICAgIElmIHRoaXMgaXMgYSB0dXBsZSBvZiBpbnRzLCBhIHJlZHVjdGlvbiBpcyBwZXJmb3JtZWQgb24gbXVsdGlwbGUKICAgICAgICBheGVzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGF4aXMgb3IgYWxsIHRoZSBheGVzIGFzIGJlZm9yZS4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQWx0ZXJuYXRlIG91dHB1dCBhcnJheSBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0LgogICAgICAgIEl0IG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0IGFuZCBpdHMKICAgICAgICB0eXBlIGlzIHByZXNlcnZlZCAoZS5nLiwgaWYgYGBkdHlwZShvdXQpYGAgaXMgZmxvYXQsIHRoZSByZXN1bHQKICAgICAgICB3aWxsIGNvbnNpc3Qgb2YgMC4wJ3MgYW5kIDEuMCdzKS4gIFNlZSBgZG9jLnVmdW5jc2AgKFNlY3Rpb24KICAgICAgICAiT3V0cHV0IGFyZ3VtZW50cyIpIGZvciBtb3JlIGRldGFpbHMuCgogICAga2VlcGRpbXMgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHRoaXMgaXMgc2V0IHRvIFRydWUsIHRoZSBheGVzIHdoaWNoIGFyZSByZWR1Y2VkIGFyZSBsZWZ0CiAgICAgICAgaW4gdGhlIHJlc3VsdCBhcyBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIFdpdGggdGhpcyBvcHRpb24sCiAgICAgICAgdGhlIHJlc3VsdCB3aWxsIGJyb2FkY2FzdCBjb3JyZWN0bHkgYWdhaW5zdCB0aGUgaW5wdXQgYXJyYXkuCgogICAgICAgIElmIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCwgdGhlbiBga2VlcGRpbXNgIHdpbGwgbm90IGJlCiAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGBhbGxgIG1ldGhvZCBvZiBzdWItY2xhc3NlcyBvZgogICAgICAgIGBuZGFycmF5YCwgaG93ZXZlciBhbnkgbm9uLWRlZmF1bHQgdmFsdWUgd2lsbCBiZS4gIElmIHRoZQogICAgICAgIHN1Yi1jbGFzc2VzIGBzdW1gIG1ldGhvZCBkb2VzIG5vdCBpbXBsZW1lbnQgYGtlZXBkaW1zYCBhbnkKICAgICAgICBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGFsbCA6IG5kYXJyYXksIGJvb2wKICAgICAgICBBIG5ldyBib29sZWFuIG9yIGFycmF5IGlzIHJldHVybmVkIHVubGVzcyBgb3V0YCBpcyBzcGVjaWZpZWQsCiAgICAgICAgaW4gd2hpY2ggY2FzZSBhIHJlZmVyZW5jZSB0byBgb3V0YCBpcyByZXR1cm5lZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkuYWxsIDogZXF1aXZhbGVudCBtZXRob2QKCiAgICBhbnkgOiBUZXN0IHdoZXRoZXIgYW55IGVsZW1lbnQgYWxvbmcgYSBnaXZlbiBheGlzIGV2YWx1YXRlcyB0byBUcnVlLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgTm90IGEgTnVtYmVyIChOYU4pLCBwb3NpdGl2ZSBpbmZpbml0eSBhbmQgbmVnYXRpdmUgaW5maW5pdHkKICAgIGV2YWx1YXRlIHRvIGBUcnVlYCBiZWNhdXNlIHRoZXNlIGFyZSBub3QgZXF1YWwgdG8gemVyby4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5hbGwoW1tUcnVlLEZhbHNlXSxbVHJ1ZSxUcnVlXV0pCiAgICBGYWxzZQoKICAgID4+PiBucC5hbGwoW1tUcnVlLEZhbHNlXSxbVHJ1ZSxUcnVlXV0sIGF4aXM9MCkKICAgIGFycmF5KFsgVHJ1ZSwgRmFsc2VdLCBkdHlwZT1ib29sKQoKICAgID4+PiBucC5hbGwoWy0xLCA0LCA1XSkKICAgIFRydWUKCiAgICA+Pj4gbnAuYWxsKFsxLjAsIG5wLm5hbl0pCiAgICBUcnVlCgogICAgPj4+IG89bnAuYXJyYXkoW0ZhbHNlXSkKICAgID4+PiB6PW5wLmFsbChbLTEsIDQsIDVdLCBvdXQ9bykKICAgID4+PiBpZCh6KSwgaWQobyksIHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9jdGVzdDogK1NLSVAKICAgICgyODI5MzYzMiwgMjgyOTM2MzIsIGFycmF5KFsgVHJ1ZV0sIGR0eXBlPWJvb2wpKQoKICAgIHJ3AAAAKQJyTgAAAHJPAAAAKQRyDQAAAHJ0AAAAcngAAAByEQAAACkGclEAAAByTgAAAHJPAAAAcncAAAByfQAAAHJ7AAAAckgAAABySAAAAHJJAAAAchEAAAC1BwAAcwoAAAAASQgBBAEKAQgBYwQAAAAAAAAABAAAAAcAAABDAAAAcxIAAAB0AHwAZAF8AXwCfANkAo0FUwApA2FdCAAACiAgICBSZXR1cm4gdGhlIGN1bXVsYXRpdmUgc3VtIG9mIHRoZSBlbGVtZW50cyBhbG9uZyBhIGdpdmVuIGF4aXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheS4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBhbG9uZyB3aGljaCB0aGUgY3VtdWxhdGl2ZSBzdW0gaXMgY29tcHV0ZWQuIFRoZSBkZWZhdWx0CiAgICAgICAgKE5vbmUpIGlzIHRvIGNvbXB1dGUgdGhlIGN1bXN1bSBvdmVyIHRoZSBmbGF0dGVuZWQgYXJyYXkuCiAgICBkdHlwZSA6IGR0eXBlLCBvcHRpb25hbAogICAgICAgIFR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5IGFuZCBvZiB0aGUgYWNjdW11bGF0b3IgaW4gd2hpY2ggdGhlCiAgICAgICAgZWxlbWVudHMgYXJlIHN1bW1lZC4gIElmIGBkdHlwZWAgaXMgbm90IHNwZWNpZmllZCwgaXQgZGVmYXVsdHMKICAgICAgICB0byB0aGUgZHR5cGUgb2YgYGFgLCB1bmxlc3MgYGFgIGhhcyBhbiBpbnRlZ2VyIGR0eXBlIHdpdGggYQogICAgICAgIHByZWNpc2lvbiBsZXNzIHRoYW4gdGhhdCBvZiB0aGUgZGVmYXVsdCBwbGF0Zm9ybSBpbnRlZ2VyLiAgSW4KICAgICAgICB0aGF0IGNhc2UsIHRoZSBkZWZhdWx0IHBsYXRmb3JtIGludGVnZXIgaXMgdXNlZC4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQWx0ZXJuYXRpdmUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuIEl0IG11c3QKICAgICAgICBoYXZlIHRoZSBzYW1lIHNoYXBlIGFuZCBidWZmZXIgbGVuZ3RoIGFzIHRoZSBleHBlY3RlZCBvdXRwdXQKICAgICAgICBidXQgdGhlIHR5cGUgd2lsbCBiZSBjYXN0IGlmIG5lY2Vzc2FyeS4gU2VlIGBkb2MudWZ1bmNzYAogICAgICAgIChTZWN0aW9uICJPdXRwdXQgYXJndW1lbnRzIikgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBjdW1zdW1fYWxvbmdfYXhpcyA6IG5kYXJyYXkuCiAgICAgICAgQSBuZXcgYXJyYXkgaG9sZGluZyB0aGUgcmVzdWx0IGlzIHJldHVybmVkIHVubGVzcyBgb3V0YCBpcwogICAgICAgIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSBhIHJlZmVyZW5jZSB0byBgb3V0YCBpcyByZXR1cm5lZC4gVGhlCiAgICAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBzaXplIGFzIGBhYCwgYW5kIHRoZSBzYW1lIHNoYXBlIGFzIGBhYCBpZgogICAgICAgIGBheGlzYCBpcyBub3QgTm9uZSBvciBgYWAgaXMgYSAxLWQgYXJyYXkuCgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgc3VtIDogU3VtIGFycmF5IGVsZW1lbnRzLgoKICAgIHRyYXB6IDogSW50ZWdyYXRpb24gb2YgYXJyYXkgdmFsdWVzIHVzaW5nIHRoZSBjb21wb3NpdGUgdHJhcGV6b2lkYWwgcnVsZS4KCiAgICBkaWZmIDogIENhbGN1bGF0ZSB0aGUgbi10aCBkaXNjcmV0ZSBkaWZmZXJlbmNlIGFsb25nIGdpdmVuIGF4aXMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBBcml0aG1ldGljIGlzIG1vZHVsYXIgd2hlbiB1c2luZyBpbnRlZ2VyIHR5cGVzLCBhbmQgbm8gZXJyb3IgaXMKICAgIHJhaXNlZCBvbiBvdmVyZmxvdy4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLDIsM10sIFs0LDUsNl1dKQogICAgPj4+IGEKICAgIGFycmF5KFtbMSwgMiwgM10sCiAgICAgICAgICAgWzQsIDUsIDZdXSkKICAgID4+PiBucC5jdW1zdW0oYSkKICAgIGFycmF5KFsgMSwgIDMsICA2LCAxMCwgMTUsIDIxXSkKICAgID4+PiBucC5jdW1zdW0oYSwgZHR5cGU9ZmxvYXQpICAgICAjIHNwZWNpZmllcyB0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AQABAFkAbhZYAHwFZgB8AXwCZAKcAnwElwKOAVMAdAdqCHwAZgF8AXwCZAKcAnwElwKOAVMAKQNhnAoAAAogICAgUmV0dXJuIHRoZSBtYXhpbXVtIG9mIGFuIGFycmF5IG9yIG1heGltdW0gYWxvbmcgYW4gYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGRhdGEuCiAgICBheGlzIDogTm9uZSBvciBpbnQgb3IgdHVwbGUgb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGlzIG9yIGF4ZXMgYWxvbmcgd2hpY2ggdG8gb3BlcmF0ZS4gIEJ5IGRlZmF1bHQsIGZsYXR0ZW5lZCBpbnB1dCBpcwogICAgICAgIHVzZWQuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgICAgIElmIHRoaXMgaXMgYSB0dXBsZSBvZiBpbnRzLCB0aGUgbWF4aW11bSBpcyBzZWxlY3RlZCBvdmVyIG11bHRpcGxlIGF4ZXMsCiAgICAgICAgaW5zdGVhZCBvZiBhIHNpbmdsZSBheGlzIG9yIGFsbCB0aGUgYXhlcyBhcyBiZWZvcmUuCiAgICBvdXQgOiBuZGFycmF5LCBvcHRpb25hbAogICAgICAgIEFsdGVybmF0aXZlIG91dHB1dCBhcnJheSBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0LiAgTXVzdAogICAgICAgIGJlIG9mIHRoZSBzYW1lIHNoYXBlIGFuZCBidWZmZXIgbGVuZ3RoIGFzIHRoZSBleHBlY3RlZCBvdXRwdXQuCiAgICAgICAgU2VlIGBkb2MudWZ1bmNzYCAoU2VjdGlvbiAiT3V0cHV0IGFyZ3VtZW50cyIpIGZvciBtb3JlIGRldGFpbHMuCgogICAga2VlcGRpbXMgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHRoaXMgaXMgc2V0IHRvIFRydWUsIHRoZSBheGVzIHdoaWNoIGFyZSByZWR1Y2VkIGFyZSBsZWZ0CiAgICAgICAgaW4gdGhlIHJlc3VsdCBhcyBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIFdpdGggdGhpcyBvcHRpb24sCiAgICAgICAgdGhlIHJlc3VsdCB3aWxsIGJyb2FkY2FzdCBjb3JyZWN0bHkgYWdhaW5zdCB0aGUgaW5wdXQgYXJyYXkuCgogICAgICAgIElmIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCwgdGhlbiBga2VlcGRpbXNgIHdpbGwgbm90IGJlCiAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGBhbWF4YCBtZXRob2Qgb2Ygc3ViLWNsYXNzZXMgb2YKICAgICAgICBgbmRhcnJheWAsIGhvd2V2ZXIgYW55IG5vbi1kZWZhdWx0IHZhbHVlIHdpbGwgYmUuICBJZiB0aGUKICAgICAgICBzdWItY2xhc3NlcyBgc3VtYCBtZXRob2QgZG9lcyBub3QgaW1wbGVtZW50IGBrZWVwZGltc2AgYW55CiAgICAgICAgZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBhbWF4IDogbmRhcnJheSBvciBzY2FsYXIKICAgICAgICBNYXhpbXVtIG9mIGBhYC4gSWYgYGF4aXNgIGlzIE5vbmUsIHRoZSByZXN1bHQgaXMgYSBzY2FsYXIgdmFsdWUuCiAgICAgICAgSWYgYGF4aXNgIGlzIGdpdmVuLCB0aGUgcmVzdWx0IGlzIGFuIGFycmF5IG9mIGRpbWVuc2lvbgogICAgICAgIGBgYS5uZGltIC0gMWBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYW1pbiA6CiAgICAgICAgVGhlIG1pbmltdW0gdmFsdWUgb2YgYW4gYXJyYXkgYWxvbmcgYSBnaXZlbiBheGlzLCBwcm9wYWdhdGluZyBhbnkgTmFOcy4KICAgIG5hbm1heCA6CiAgICAgICAgVGhlIG1heGltdW0gdmFsdWUgb2YgYW4gYXJyYXkgYWxvbmcgYSBnaXZlbiBheGlzLCBpZ25vcmluZyBhbnkgTmFOcy4KICAgIG1heGltdW0gOgogICAgICAgIEVsZW1lbnQtd2lzZSBtYXhpbXVtIG9mIHR3byBhcnJheXMsIHByb3BhZ2F0aW5nIGFueSBOYU5zLgogICAgZm1heCA6CiAgICAgICAgRWxlbWVudC13aXNlIG1heGltdW0gb2YgdHdvIGFycmF5cywgaWdub3JpbmcgYW55IE5hTnMuCiAgICBhcmdtYXggOgogICAgICAgIFJldHVybiB0aGUgaW5kaWNlcyBvZiB0aGUgbWF4aW11bSB2YWx1ZXMuCgogICAgbmFubWluLCBtaW5pbXVtLCBmbWluCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBOYU4gdmFsdWVzIGFyZSBwcm9wYWdhdGVkLCB0aGF0IGlzIGlmIGF0IGxlYXN0IG9uZSBpdGVtIGlzIE5hTiwgdGhlCiAgICBjb3JyZXNwb25kaW5nIG1heCB2YWx1ZSB3aWxsIGJlIE5hTiBhcyB3ZWxsLiBUbyBpZ25vcmUgTmFOIHZhbHVlcwogICAgKE1BVExBQiBiZWhhdmlvciksIHBsZWFzZSB1c2UgbmFubWF4LgoKICAgIERvbid0IHVzZSBgYW1heGAgZm9yIGVsZW1lbnQtd2lzZSBjb21wYXJpc29uIG9mIDIgYXJyYXlzOyB3aGVuCiAgICBgYGEuc2hhcGVbMF1gYCBpcyAyLCBgYG1heGltdW0oYVswXSwgYVsxXSlgYCBpcyBmYXN0ZXIgdGhhbgogICAgYGBhbWF4KGEsIGF4aXM9MClgYC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAuYXJhbmdlKDQpLnJlc2hhcGUoKDIsMikpCiAgICA+Pj4gYQogICAgYXJyYXkoW1swLCAxXSwKICAgICAgICAgICBbMiwgM11dKQogICAgPj4+IG5wLmFtYXgoYSkgICAgICAgICAgICMgTWF4aW11bSBvZiB0aGUgZmxhdHRlbmVkIGFycmF5CiAgICAzCiAgICA+Pj4gbnAuYW1heChhLCBheGlzPTApICAgIyBNYXhpbWEgYWxvbmcgdGhlIGZpcnN0IGF4aXMKICAgIGFycmF5KFsyLCAzXSkKICAgID4+PiBucC5hbWF4KGEsIGF4aXM9MSkgICAjIE1heGltYSBhbG9uZyB0aGUgc2Vjb25kIGF4aXMKICAgIGFycmF5KFsxLCAzXSkKCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSg1LCBkdHlwZT1ucC5mbG9hdCkKICAgID4+PiBiWzJdID0gbnAuTmFOCiAgICA+Pj4gbnAuYW1heChiKQogICAgbmFuCiAgICA+Pj4gbnAubmFubWF4KGIpCiAgICA0LjAKCiAgICBydwAAACkCck4AAAByTwAAACkJcnQAAAByeAAAAHJYAAAAckAAAAByQQAAANoDbWF4cj0AAAByDwAAAFoFX2FtYXgpBnJRAAAAck4AAAByTwAAAHJ3AAAAcnsAAAByEwAAAHJIAAAAckgAAABySQAAAHITAAAAfggAAHMWAAAAAFUEAQoBCAIOAQIBCgEOAQYCFAIKAWMEAAAAAAAAAAYAAAAIAAAAQwAAAHNwAAAAaQB9BHwDdABqAWsJchZ8A3wEZAE8AHQCfACDAXQDagRrCXJYeQp8AGoFfQVXAG4UBAB0BmsKckIBAAEAAQBZAG4WWAB8BWYAfAF8AmQCnAJ8BJcCjgFTAHQHagh8AGYBfAF8AmQCnAJ8BJcCjgFTACkDYZwKAAAKICAgIFJldHVybiB0aGUgbWluaW11bSBvZiBhbiBhcnJheSBvciBtaW5pbXVtIGFsb25nIGFuIGF4aXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBkYXRhLgogICAgYXhpcyA6IE5vbmUgb3IgaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIHRvIG9wZXJhdGUuICBCeSBkZWZhdWx0LCBmbGF0dGVuZWQgaW5wdXQgaXMKICAgICAgICB1c2VkLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoKICAgICAgICBJZiB0aGlzIGlzIGEgdHVwbGUgb2YgaW50cywgdGhlIG1pbmltdW0gaXMgc2VsZWN0ZWQgb3ZlciBtdWx0aXBsZSBheGVzLAogICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYXhpcyBvciBhbGwgdGhlIGF4ZXMgYXMgYmVmb3JlLgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBBbHRlcm5hdGl2ZSBvdXRwdXQgYXJyYXkgaW4gd2hpY2ggdG8gcGxhY2UgdGhlIHJlc3VsdC4gIE11c3QKICAgICAgICBiZSBvZiB0aGUgc2FtZSBzaGFwZSBhbmQgYnVmZmVyIGxlbmd0aCBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LgogICAgICAgIFNlZSBgZG9jLnVmdW5jc2AgKFNlY3Rpb24gIk91dHB1dCBhcmd1bWVudHMiKSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgIGtlZXBkaW1zIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBJZiB0aGlzIGlzIHNldCB0byBUcnVlLCB0aGUgYXhlcyB3aGljaCBhcmUgcmVkdWNlZCBhcmUgbGVmdAogICAgICAgIGluIHRoZSByZXN1bHQgYXMgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiBXaXRoIHRoaXMgb3B0aW9uLAogICAgICAgIHRoZSByZXN1bHQgd2lsbCBicm9hZGNhc3QgY29ycmVjdGx5IGFnYWluc3QgdGhlIGlucHV0IGFycmF5LgoKICAgICAgICBJZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQsIHRoZW4gYGtlZXBkaW1zYCB3aWxsIG5vdCBiZQogICAgICAgIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgYW1pbmAgbWV0aG9kIG9mIHN1Yi1jbGFzc2VzIG9mCiAgICAgICAgYG5kYXJyYXlgLCBob3dldmVyIGFueSBub24tZGVmYXVsdCB2YWx1ZSB3aWxsIGJlLiAgSWYgdGhlCiAgICAgICAgc3ViLWNsYXNzZXMgYHN1bWAgbWV0aG9kIGRvZXMgbm90IGltcGxlbWVudCBga2VlcGRpbXNgIGFueQogICAgICAgIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgYW1pbiA6IG5kYXJyYXkgb3Igc2NhbGFyCiAgICAgICAgTWluaW11bSBvZiBgYWAuIElmIGBheGlzYCBpcyBOb25lLCB0aGUgcmVzdWx0IGlzIGEgc2NhbGFyIHZhbHVlLgogICAgICAgIElmIGBheGlzYCBpcyBnaXZlbiwgdGhlIHJlc3VsdCBpcyBhbiBhcnJheSBvZiBkaW1lbnNpb24KICAgICAgICBgYGEubmRpbSAtIDFgYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGFtYXggOgogICAgICAgIFRoZSBtYXhpbXVtIHZhbHVlIG9mIGFuIGFycmF5IGFsb25nIGEgZ2l2ZW4gYXhpcywgcHJvcGFnYXRpbmcgYW55IE5hTnMuCiAgICBuYW5taW4gOgogICAgICAgIFRoZSBtaW5pbXVtIHZhbHVlIG9mIGFuIGFycmF5IGFsb25nIGEgZ2l2ZW4gYXhpcywgaWdub3JpbmcgYW55IE5hTnMuCiAgICBtaW5pbXVtIDoKICAgICAgICBFbGVtZW50LXdpc2UgbWluaW11bSBvZiB0d28gYXJyYXlzLCBwcm9wYWdhdGluZyBhbnkgTmFOcy4KICAgIGZtaW4gOgogICAgICAgIEVsZW1lbnQtd2lzZSBtaW5pbXVtIG9mIHR3byBhcnJheXMsIGlnbm9yaW5nIGFueSBOYU5zLgogICAgYXJnbWluIDoKICAgICAgICBSZXR1cm4gdGhlIGluZGljZXMgb2YgdGhlIG1pbmltdW0gdmFsdWVzLgoKICAgIG5hbm1heCwgbWF4aW11bSwgZm1heAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgTmFOIHZhbHVlcyBhcmUgcHJvcGFnYXRlZCwgdGhhdCBpcyBpZiBhdCBsZWFzdCBvbmUgaXRlbSBpcyBOYU4sIHRoZQogICAgY29ycmVzcG9uZGluZyBtaW4gdmFsdWUgd2lsbCBiZSBOYU4gYXMgd2VsbC4gVG8gaWdub3JlIE5hTiB2YWx1ZXMKICAgIChNQVRMQUIgYmVoYXZpb3IpLCBwbGVhc2UgdXNlIG5hbm1pbi4KCiAgICBEb24ndCB1c2UgYGFtaW5gIGZvciBlbGVtZW50LXdpc2UgY29tcGFyaXNvbiBvZiAyIGFycmF5czsgd2hlbgogICAgYGBhLnNoYXBlWzBdYGAgaXMgMiwgYGBtaW5pbXVtKGFbMF0sIGFbMV0pYGAgaXMgZmFzdGVyIHRoYW4KICAgIGBgYW1pbihhLCBheGlzPTApYGAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg0KS5yZXNoYXBlKCgyLDIpKQogICAgPj4+IGEK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IG9yIGFsbCB0aGUKICAgICAgICBheGVzIGFzIGJlZm9yZS4KICAgIGR0eXBlIDogZHR5cGUsIG9wdGlvbmFsCiAgICAgICAgVGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGFycmF5LCBhcyB3ZWxsIGFzIG9mIHRoZSBhY2N1bXVsYXRvciBpbgogICAgICAgIHdoaWNoIHRoZSBlbGVtZW50cyBhcmUgbXVsdGlwbGllZC4gIFRoZSBkdHlwZSBvZiBgYWAgaXMgdXNlZCBieQogICAgICAgIGRlZmF1bHQgdW5sZXNzIGBhYCBoYXMgYW4gaW50ZWdlciBkdHlwZSBvZiBsZXNzIHByZWNpc2lvbiB0aGFuIHRoZQogICAgICAgIGRlZmF1bHQgcGxhdGZvcm0gaW50ZWdlci4gIEluIHRoYXQgY2FzZSwgaWYgYGFgIGlzIHNpZ25lZCB0aGVuIHRoZQogICAgICAgIHBsYXRmb3JtIGludGVnZXIgaXMgdXNlZCB3aGlsZSBpZiBgYWAgaXMgdW5zaWduZWQgdGhlbiBhbiB1bnNpZ25lZAogICAgICAgIGludGVnZXIgb2YgdGhlIHNhbWUgcHJlY2lzaW9uIGFzIHRoZSBwbGF0Zm9ybSBpbnRlZ2VyIGlzIHVzZWQuCiAgICBvdXQgOiBuZGFycmF5LCBvcHRpb25hbAogICAgICAgIEFsdGVybmF0aXZlIG91dHB1dCBhcnJheSBpbiB3aGljaCB0byBwbGFjZSB0aGUgcmVzdWx0LiBJdCBtdXN0IGhhdmUKICAgICAgICB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LCBidXQgdGhlIHR5cGUgb2YgdGhlIG91dHB1dAogICAgICAgIHZhbHVlcyB3aWxsIGJlIGNhc3QgaWYgbmVjZXNzYXJ5LgogICAga2VlcGRpbXMgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHRoaXMgaXMgc2V0IHRvIFRydWUsIHRoZSBheGVzIHdoaWNoIGFyZSByZWR1Y2VkIGFyZSBsZWZ0IGluIHRoZQogICAgICAgIHJlc3VsdCBhcyBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIFdpdGggdGhpcyBvcHRpb24sIHRoZSByZXN1bHQKICAgICAgICB3aWxsIGJyb2FkY2FzdCBjb3JyZWN0bHkgYWdhaW5zdCB0aGUgaW5wdXQgYXJyYXkuCgogICAgICAgIElmIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCwgdGhlbiBga2VlcGRpbXNgIHdpbGwgbm90IGJlCiAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGBwcm9kYCBtZXRob2Qgb2Ygc3ViLWNsYXNzZXMgb2YKICAgICAgICBgbmRhcnJheWAsIGhvd2V2ZXIgYW55IG5vbi1kZWZhdWx0IHZhbHVlIHdpbGwgYmUuICBJZiB0aGUKICAgICAgICBzdWItY2xhc3NlcyBgc3VtYCBtZXRob2QgZG9lcyBub3QgaW1wbGVtZW50IGBrZWVwZGltc2AgYW55CiAgICAgICAgZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBwcm9kdWN0X2Fsb25nX2F4aXMgOiBuZGFycmF5LCBzZWUgYGR0eXBlYCBwYXJhbWV0ZXIgYWJvdmUuCiAgICAgICAgQW4gYXJyYXkgc2hhcGVkIGFzIGBhYCBidXQgd2l0aCB0aGUgc3BlY2lmaWVkIGF4aXMgcmVtb3ZlZC4KICAgICAgICBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGBvdXRgIGlmIHNwZWNpZmllZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkucHJvZCA6IGVxdWl2YWxlbnQgbWV0aG9kCiAgICBudW1weS5kb2MudWZ1bmNzIDogU2VjdGlvbiAiT3V0cHV0IGFyZ3VtZW50cyIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIEFyaXRobWV0aWMgaXMgbW9kdWxhciB3aGVuIHVzaW5nIGludGVnZXIgdHlwZXMsIGFuZCBubyBlcnJvciBpcwogICAgcmFpc2VkIG9uIG92ZXJmbG93LiAgVGhhdCBtZWFucyB0aGF0LCBvbiBhIDMyLWJpdCBwbGF0Zm9ybToKCiAgICA+Pj4geCA9IG5wLmFycmF5KFs1MzY4NzA5MTAsIDUzNjg3MDkxMCwgNTM2ODcwOTEwLCA1MzY4NzA5MTBd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cmVzdWx0LiBJdCBtdXN0CiAgICAgICAgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhbmQgYnVmZmVyIGxlbmd0aCBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0CiAgICAgICAgYnV0IHRoZSB0eXBlIG9mIHRoZSByZXN1bHRpbmcgdmFsdWVzIHdpbGwgYmUgY2FzdCBpZiBuZWNlc3NhcnkuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgY3VtcHJvZCA6IG5kYXJyYXkKICAgICAgICBBIG5ldyBhcnJheSBob2xkaW5nIHRoZSByZXN1bHQgaXMgcmV0dXJuZWQgdW5sZXNzIGBvdXRgIGlzCiAgICAgICAgc3BlY2lmaWVkLCBpbiB3aGljaCBjYXNlIGEgcmVmZXJlbmNlIHRvIG91dCBpcyByZXR1cm5lZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmRvYy51ZnVuY3MgOiBTZWN0aW9uICJPdXRwdXQgYXJndW1lbnRzIgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgQXJpdGhtZXRpYyBpcyBtb2R1bGFyIHdoZW4gdXNpbmcgaW50ZWdlciB0eXBlcywgYW5kIG5vIGVycm9yIGlzCiAgICByYWlzZWQgb24gb3ZlcmZsb3cuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxLDIsM10pCiAgICA+Pj4gbnAuY3VtcHJvZChhKSAjIGludGVybWVkaWF0ZSByZXN1bHRzIDEsIDEqMgogICAgLi4uICAgICAgICAgICAgICAgIyB0b3RhbCBwcm9kdWN0IDEqMiozID0gNgogICAgYXJyYXkoWzEsIDIsIDZdKQogICAgPj4+IGEgPSBucC5hcnJheShbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKQogICAgPj4+IG5wLmN1bXByb2QoYSwgZHR5cGU9ZmxvYXQpICMgc3BlY2lmeSB0eXBlIG9mIG91dHB1dAogICAgYXJyYXkoWyAgIDEuLCAgICAyLiwgICAgNi4sICAgMjQuLCAgMTIwLiwgIDcyMC5dKQoKICAgIFRoZSBjdW11bGF0aXZlIHByb2R1Y3QgZm9yIGVhY2gg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dDogMCkuICBJZgogICAgICAgIGRlY2ltYWxzIGlzIG5lZ2F0aXZlLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbnMgdG8KICAgICAgICB0aGUgbGVmdCBvZiB0aGUgZGVjaW1hbCBwb2ludC4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQWx0ZXJuYXRpdmUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuIEl0IG11c3QgaGF2ZQogICAgICAgIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBleHBlY3RlZCBvdXRwdXQsIGJ1dCB0aGUgdHlwZSBvZiB0aGUgb3V0cHV0CiAgICAgICAgdmFsdWVzIHdpbGwgYmUgY2FzdCBpZiBuZWNlc3NhcnkuIFNlZSBgZG9jLnVmdW5jc2AgKFNlY3Rpb24KICAgICAgICAiT3V0cHV0IGFyZ3VtZW50cyIpIGZvciBkZXRhaWxzLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHJvdW5kZWRfYXJyYXkgOiBuZGFycmF5CiAgICAgICAgQW4gYXJyYXkgb2YgdGhlIHNhbWUgdHlwZSBhcyBgYWAsIGNvbnRhaW5pbmcgdGhlIHJvdW5kZWQgdmFsdWVzLgogICAgICAgIFVubGVzcyBgb3V0YCB3YXMgc3BlY2lmaWVkLCBhIG5ldyBhcnJheSBpcyBjcmVhdGVkLiAgQSByZWZlcmVuY2UgdG8KICAgICAgICB0aGUgcmVzdWx0IGlzIHJldHVybmVkLgoKICAgICAgICBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGNvbXBsZXggbnVtYmVycyBhcmUgcm91bmRlZAogICAgICAgIHNlcGFyYXRlbHkuICBUaGUgcmVzdWx0IG9mIHJvdW5kaW5nIGEgZmxvYXQgaXMgYSBmbG9hdC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG5kYXJyYXkucm91bmQgOiBlcXVpdmFsZW50IG1ldGhvZAoKICAgIGNlaWwsIGZpeCwgZmxvb3IsIHJpbnQsIHRydW5jCgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgRm9yIHZhbHVlcyBleGFjdGx5IGhhbGZ3YXkgYmV0d2VlbiByb3VuZGVkIGRlY2ltYWwgdmFsdWVzLCBOdW1QeQogICAgcm91bmRzIHRvIHRoZSBuZWFyZXN0IGV2ZW4gdmFsdWUuIFRodXMgMS41IGFuZCAyLjUgcm91bmQgdG8gMi4wLAogICAgLTAuNSBhbmQgMC41IHJvdW5kIHRvIDAuMCwgZXRjLiBSZXN1bHRzIG1heSBhbHNvIGJlIHN1cnByaXNpbmcgZHVlCiAgICB0byB0aGUgaW5leGFjdCByZXByZXNlbnRhdGlvbiBvZiBkZWNpbWFsIGZyYWN0aW9ucyBpbiB0aGUgSUVFRQogICAgZmxvYXRpbmcgcG9pbnQgc3RhbmRhcmQgWzFdXyBhbmQgZXJyb3JzIGludHJvZHVjZWQgd2hlbiBzY2FsaW5nCiAgICBieSBwb3dlcnMgb2YgdGVuLgoKICAgIFJlZmVyZW5jZXMKICAgIC0tLS0tLS0tLS0KICAgIC4uIFsxXSAiTGVjdHVyZSBOb3RlcyBvbiB0aGUgU3RhdHVzIG9mICBJRUVFIDc1NCIsIFdpbGxpYW0gS2FoYW4sCiAgICAgICAgICAgaHR0cDovL3d3dy5jcy5iZXJrZWxleS5lZHUvfndrYWhhbi9pZWVlNzU0c3RhdHVzL0lFRUU3NTQuUERGCiAgICAuLiBbMl0gIkhvdyBGdXRpbGUgYXJlIE1pbmRsZXNzIEFzc2Vzc21lbnRzIG9mCiAgICAgICAgICAgUm91bmRvZmYgaW4gRmxvYXRpbmctUG9pbnQgQ29tcHV0YXRpb24/IiwgV2lsbGlhbSBLYWhhbiwKICAgICAgICAgICBodHRwOi8vd3d3LmNzLmJlcmtlbGV5LmVkdS9+d2thaGFuL01pbmRsZXNzLnBkZgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFyb3VuZChbMC4zNywgMS42NF0pCiAgICBhcnJheShbIDAuLCAgMi5dKQogICAgPj4+IG5wLmFyb3VuZChbMC4zNywgMS42NF0sIGRlY2ltYWxzPTEpCiAgICBhcnJheShbIDAuNCwgIDEuNl0pCiAgICA+Pj4gbnAuYXJvdW5kKFsuNSwgMS41LCAyLjUsIDMuNSwgNC41XSkgIyByb3VuZHMgdG8gbmVhcmVzdCBldmVuIHZhbHVlCiAgICBhcnJheShbIDAuLCAgMi4sICAyLiwgIDQuLCAgNC5dKQogICAgPj4+IG5wLmFyb3VuZChbMSwyLDMsMTFdLCBkZWNpbWFscz0xKSAjIG5kYXJyYXkgb2YgaW50cyBpcyByZXR1cm5lZAogICAgYXJyYXkoWyAxLCAgMiwgIDMsIDExXSkKICAgID4+PiBucC5hcm91bmQoWzEsMiwzLDExXSwgZGVjaW1hbHM9LTEpCiAgICBhcnJheShbIDAsICAwLCAgMCwgMTBdKQoKICAgINoFcm91bmQpAtoIZGVjaW1hbHNyTwAAACkBckwAAAApA3JRAAAAcoQAAAByTwAAAHJIAAAAckgAAABySQAAAHIaAAAAowoAAHMCAAAAAEJjAwAAAAAAAAADAAAABQAAAEMAAABzDgAAAHQAfAB8AXwCZAGNA1MAKQJ6pQogICAgUm91bmQgYW4gYXJyYXkgdG8gdGhlIGdpdmVuIG51bWJlciBvZiBkZWNpbWFscy4KCiAgICBSZWZlciB0byBgYXJvdW5kYCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYXJvdW5kIDogZXF1aXZhbGVudCBmdW5jdGlvbgoKICAgICkCcoQAAAByTwAAACkBchoAAAApA3JRAAAAcoQAAAByTwAAAHJIAAAAckgAAABySQAAAHIvAAAA6AoAAHMCAAAAAAtjBQAAAAAAAAAHAAAACAAAAEMAAABzdAAAAGkAfQV8BHQAagFrCXIWfAR8BWQBPAB0AnwAgwF0A2oEawlyWnkKfABqBX0GVwBuFAQAdAZrCnJCAQABAAEAWQBuGFgAfAZmAHwBfAJ8A2QCnAN8BZcCjgFTAHQHagh8AGYBfAF8AnwDZAKcA3wFlwKOAVMAKQNhVAwAAAogICAgQ29tcHV0ZSB0aGUgYXJpdGhtZXRpYyBtZWFuIGFsb25nIHRoZSBzcGVjaWZpZWQgYXhpcy4KCiAgICBSZXR1cm5zIHRoZSBhdmVyYWdlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4gIFRoZSBhdmVyYWdlIGlzIHRha2VuIG92ZXIKICAgIHRoZSBmbGF0dGVuZWQgYXJyYXkgYnkgZGVmYXVsdCwgb3RoZXJ3aXNlIG92ZXIgdGhlIHNwZWNpZmllZCBheGlzLgogICAgYGZsb2F0NjRgIGludGVybWVkaWF0ZSBhbmQgcmV0dXJuIHZhbHVlcyBhcmUgdXNlZCBmb3IgaW50ZWdlciBpbnB1dHMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBBcnJheSBjb250YWluaW5nIG51bWJlcnMgd2hvc2UgbWVhbiBpcyBkZXNpcmVkLiBJZiBgYWAgaXMgbm90IGFuCiAgICAgICAgYXJyYXksIGEgY29udmVyc2lvbiBpcyBhdHRlbXB0ZWQuCiAgICBheGlzIDogTm9uZSBvciBpbnQgb3IgdHVwbGUgb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGlzIG9yIGF4ZXMgYWxvbmcgd2hpY2ggdGhlIG1lYW5zIGFyZSBjb21wdXRlZC4gVGhlIGRlZmF1bHQgaXMgdG8KICAgICAgICBjb21wdXRlIHRoZSBtZWFuIG9mIHRoZSBmbGF0dGVuZWQgYXJyYXkuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNy4wCgogICAgICAgIElmIHRoaXMgaXMgYSB0dXBsZSBvZiBpbnRzLCBhIG1lYW4gaXMgcGVyZm9ybWVkIG92ZXIgbXVsdGlwbGUgYXhlcywKICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGF4aXMgb3IgYWxsIHRoZSBheGVzIGFzIGJlZm9yZS4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIFR5cGUgdG8gdXNlIGluIGNvbXB1dGluZyB0aGUgbWVhbi4gIEZvciBpbnRlZ2VyIGlucHV0cywgdGhlIGRlZmF1bHQKICAgICAgICBpcyBgZmxvYXQ2NGA7IGZvciBmbG9hdGluZyBwb2ludCBpbnB1dHMsIGl0IGlzIHRoZSBzYW1lIGFzIHRoZQogICAgICAgIGlucHV0IGR0eXBlLgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBBbHRlcm5hdGUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuICBUaGUgZGVmYXVsdAogICAgICAgIGlzIGBgTm9uZWBgOyBpZiBwcm92aWRlZCwgaXQgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIHRoZQogICAgICAgIGV4cGVjdGVkIG91dHB1dCwgYnV0IHRoZSB0eXBlIHdpbGwgYmUgY2FzdCBpZiBuZWNlc3NhcnkuCiAgICAgICAgU2VlIGBkb2MudWZ1bmNzYCBmb3IgZGV0YWlscy4KCiAgICBrZWVwZGltcyA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgSWYgdGhpcyBpcyBzZXQgdG8gVHJ1ZSwgdGhlIGF4ZXMgd2hpY2ggYXJlIHJlZHVjZWQgYXJlIGxlZnQKICAgICAgICBpbiB0aGUgcmVzdWx0IGFzIGRpbWVuc2lvbnMgd2l0aCBzaXplIG9uZS4gV2l0aCB0aGlzIG9wdGlvbiwKICAgICAgICB0aGUgcmVzdWx0IHdpbGwgYnJvYWRjYXN0IGNvcnJlY3RseSBhZ2FpbnN0IHRoZSBpbnB1dCBhcnJheS4KCiAgICAgICAgSWYgdGhlIGRlZmF1bHQgdmFsdWUgaXMgcGFzc2VkLCB0aGVuIGBrZWVwZGltc2Agd2lsbCBub3QgYmUKICAgICAgICBwYXNzZWQgdGhyb3VnaCB0byB0aGUgYG1lYW5gIG1ldGhvZCBvZiBzdWItY2xhc3NlcyBvZgogICAgICAgIGBuZGFycmF5YCwgaG93ZXZlciBhbnkgbm9uLWRlZmF1bHQgdmFsdWUgd2lsbCBiZS4gIElmIHRoZQogICAgICAgIHN1Yi1jbGFzc2VzIGBzdW1gIG1ldGhvZCBkb2VzIG5vdCBpbXBsZW1lbnQgYGtlZXBkaW1zYCBhbnkKICAgICAgICBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG0gOiBuZGFycmF5LCBzZWUgZHR5cGUgcGFyYW1ldGVyIGFib3ZlCiAgICAgICAgSWYgYG91dD1Ob25lYCwgcmV0dXJucyBhIG5ldyBhcnJheSBjb250YWluaW5nIHRoZSBtZWFuIHZhbHVlcywKICAgICAgICBvdGhlcndpc2UgYSByZWZlcmVuY2UgdG8gdGhlIG91dHB1dCBhcnJheSBpcyByZXR1cm5lZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGF2ZXJhZ2UgOiBXZWlnaHRlZCBhdmVyYWdlCiAgICBzdGQsIHZhciwgbmFubWVhbiwgbmFuc3RkLCBuYW52YXIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSBhcml0aG1ldGljIG1lYW4gaXMgdGhlIHN1bSBvZiB0aGUgZWxlbWVudHMgYWxvbmcgdGhlIGF4aXMgZGl2aWRlZAogICAgYnkgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KCiAgICBOb3RlIHRoYXQgZm9yIGZsb2F0aW5nLXBvaW50IGlucHV0LCB0aGUgbWVhbiBpcyBjb21wdXRlZCB1c2luZyB0aGUKICAgIHNhbWUgcHJlY2lzaW9uIHRoZSBpbnB1dCBoYXMuICBEZXBlbmRpbmcgb24gdGhlIGlucHV0IGRhdGEsIHRoaXMgY2FuCiAgICBjYXVzZSB0aGUgcmVzdWx0cyB0byBiZSBpbmFjY3VyYXRlLCBlc3BlY2lhbGx5IGZvciBgZmxvYXQzMmAgKHNlZQogICAgZXhhbXBsZSBiZWxvdykuICBTcGVjaWZ5aW5nIGEgaGlnaGVyLXByZWNpc2lvbiBhY2N1bXVsYXRvciB1c2luZyB0aGUKICAgIGBkdHlwZWAga2V5d29yZCBjYW4gYWxsZXZpYXRlIHRoaXMgaXNzdWUuCgogICAgQnkgZGVmYXVsdCwgYGZsb2F0MTZgIHJlc3VsdHMgYXJlIGNvbXB1dGVkIHVzaW5nIGBmbG9hdDMyYCBpbnRlcm1lZGlhdGVzCiAgICBmb3IgZXh0cmEgcHJlY2lzaW9uLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5hcnJheShbWzEsIDJdLCBbMywgNF1dKQogICAgPj4+IG5wLm1lYW4oYSkKICAgIDIuNQogICAgPj4+IG5wLm1lYW4oYSwgYXhpcz0wKQogICAgYXJyYXkoWyAyLiwgIDMuXSkKICAgID4+PiBucC5tZWFuKGEsIGF4aXM9MSkKICAgIGFycmF5KFsgMS41LCAgMy41XSkKCiAgICBJbiBzaW5nbGUgcHJlY2lzaW9uLCBgbWVhbmAgY2FuIGJlIGluYWNjdXJhdGU6CgogICAgPj4+IGEgPSBucC56ZXJvcygoMiwgNTEyKjUxMiksIGR0eXBlPW5wLmZsb2F0MzIpCiAgICA+Pj4gYVswLCA6XSA9IDEuMAogICAgPj4+IGFbMSwgOl0gPSAwLjEKICAgID4+PiBucC5tZWFuKGEpCiAgICAwLjU0OTk5OTI0CgogICAgQ29tcHV0aW5nIHRoZSBtZWFuIGluIGZsb2F0NjQgaXMgbW9yZSBhY2N1cmF0ZToKCiAgICA+Pj4gbnAubWVhbihhLCBkdHlwZT1ucC5mbG9hdDY0KQogICAgMC41NTAwMDAwMDA3NDUwNTgwNgoKICAgIHJ3AAAAKQNyTgAAAHJuAAAAck8AAAApCXJ0AAAAcngAAAByWAAAAHJAAAAAckEAAAByIgAAAHI9AAAAcg8AAABaBV9tZWFuKQdyUQAAAHJOAAAAcm4AAAByTwAAAHJ3AAAAcnsAAAByIgAAAHJIAAAAckgAAABySQAAAHIiAAAA9goAAHMWAAAAAFsEAQoBCAEOAQIBCgEOAQYCFgIMAWMGAAAAAAAAAAgAAAAIAAAAQwAAAHN4AAAAaQB9BnwFdABqAWsJchZ8BXwGZAE8AHQCfACDAXQDagRrCXJceQp8AGoFfQdXAG4UBAB0BmsKckIBAAEAAQBZAG4aWAB8B2YAfAF8AnwDfARkApwEfAaXAo4BUwB0B2oIfABmAXwBfAJ8A3wEZAKcBHwGlwKOAVMAKQNh4g8AAAogICAgQ29tcHV0ZSB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGFsb25nIHRoZSBzcGVjaWZpZWQgYXhpcy4KCiAgICBSZXR1cm5zIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24sIGEgbWVhc3VyZSBvZiB0aGUgc3ByZWFkIG9mIGEgZGlzdHJpYnV0aW9uLAogICAgb2YgdGhlIGFycmF5IGVsZW1lbnRzLiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIGNvbXB1dGVkIGZvciB0aGUKICAgIGZsYXR0ZW5lZCBhcnJheSBieSBkZWZhdWx0LCBvdGhlcndpc2Ugb3ZlciB0aGUgc3BlY2lmaWVkIGF4aXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBDYWxjdWxhdGUgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGVzZSB2YWx1ZXMuCiAgICBheGlzIDogTm9uZSBvciBpbnQgb3IgdHVwbGUgb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGlzIG9yIGF4ZXMgYWxvbmcgd2hpY2ggdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBpcyBjb21wdXRlZC4gVGhlCiAgICAgICAgZGVmYXVsdCBpcyB0byBjb21wdXRlIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIGZsYXR0ZW5lZCBhcnJheS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICAgICAgSWYgdGhpcyBpcyBhIHR1cGxlIG9mIGludHMsIGEgc3RhbmRhcmQgZGV2aWF0aW9uIGlzIHBlcmZvcm1lZCBvdmVyCiAgICAgICAgbXVsdGlwbGUgYXhlcywgaW5zdGVhZCBvZiBhIHNpbmdsZSBheGlzIG9yIGFsbCB0aGUgYXhlcyBhcyBiZWZvcmUuCiAgICBkdHlwZSA6IGR0eXBlLCBvcHRpb25hbAogICAgICAgIFR5cGUgdG8gdXNlIGluIGNvbXB1dGluZyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLiBGb3IgYXJyYXlzIG9mCiAgICAgICAgaW50ZWdlciB0eXBlIHRoZSBkZWZhdWx0IGlzIGZsb2F0NjQsIGZvciBhcnJheXMgb2YgZmxvYXQgdHlwZXMgaXQgaXMKICAgICAgICB0aGUgc2FtZSBhcyB0aGUgYXJyYXkgdHlwZS4KICAgIG91dCA6IG5kYXJyYXksIG9wdGlvbmFsCiAgICAgICAgQWx0ZXJuYXRpdmUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuIEl0IG11c3QgaGF2ZQogICAgICAgIHRoZSBzYW1lIHNoYXBlIGFzIHRoZSBleHBlY3RlZCBvdXRwdXQgYnV0IHRoZSB0eXBlIChvZiB0aGUgY2FsY3VsYXRlZAogICAgICAgIHZhbHVlcykgd2lsbCBiZSBjYXN0IGlmIG5lY2Vzc2FyeS4KICAgIGRkb2YgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgTWVhbnMgRGVsdGEgRGVncmVlcyBvZiBGcmVlZG9tLiAgVGhlIGRpdmlzb3IgdXNlZCBpbiBjYWxjdWxhdGlvbnMKICAgICAgICBpcyBgYE4gLSBkZG9mYGAsIHdoZXJlIGBgTmBgIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBlbGVtZW50cy4KICAgICAgICBCeSBkZWZhdWx0IGBkZG9mYCBpcyB6ZXJvLgogICAga2VlcGRpbXMgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIHRoaXMgaXMgc2V0IHRvIFRydWUsIHRoZSBheGVzIHdoaWNoIGFyZSByZWR1Y2VkIGFyZSBsZWZ0CiAgICAgICAgaW4gdGhlIHJlc3VsdCBhcyBkaW1lbnNpb25zIHdpdGggc2l6ZSBvbmUuIFdpdGggdGhpcyBvcHRpb24sCiAgICAgICAgdGhlIHJlc3VsdCB3aWxsIGJyb2FkY2FzdCBjb3JyZWN0bHkgYWdhaW5zdCB0aGUgaW5wdXQgYXJyYXkuCgogICAgICAgIElmIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHBhc3NlZCwgdGhlbiBga2VlcGRpbXNgIHdpbGwgbm90IGJlCiAgICAgICAgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGBzdGRgIG1ldGhvZCBvZiBzdWItY2xhc3NlcyBvZgogICAgICAgIGBuZGFycmF5YCwgaG93ZXZlciBhbnkgbm9uLWRlZmF1bHQgdmFsdWUgd2lsbCBiZS4gIElmIHRoZQogICAgICAgIHN1Yi1jbGFzc2VzIGBzdW1gIG1ldGhvZCBkb2VzIG5vdCBpbXBsZW1lbnQgYGtlZXBkaW1zYCBhbnkKICAgICAgICBleGNlcHRpb25zIHdpbGwgYmUgcmFpc2VkLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHN0YW5kYXJkX2RldmlhdGlvbiA6IG5kYXJyYXksIHNlZSBkdHlwZSBwYXJhbWV0ZXIgYWJvdmUuCiAgICAgICAgSWYgYG91dGAgaXMgTm9uZSwgcmV0dXJuIGEgbmV3IGFycmF5IGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiwKICAgICAgICBvdGhlcndpc2UgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBvdXRwdXQgYXJyYXkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICB2YXIsIG1lYW4sIG5hbm1lYW4sIG5hbnN0ZCwgbmFudmFyCiAgICBudW1weS5kb2MudWZ1bmNzIDogU2VjdGlvbiAiT3V0cHV0IGFyZ3VtZW50cyIKCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgdGhlIHNxdWFyZSByb290IG9mIHRoZSBhdmVyYWdlIG9mIHRoZSBzcXVhcmVkCiAgICBkZXZpYXRpb25zIGZyb20gdGhlIG1lYW4sIGkuZS4sIGBgc3RkID0gc3FydChtZWFuKGFicyh4IC0geC5tZWFuKCkpKioyKSlgYC4KCiAgICBUaGUgYXZlcmFnZSBzcXVhcmVkIGRldmlhdGlvbiBpcyBub3JtYWxseSBjYWxjdWxhdGVkIGFzCiAgICBgYHguc3VtKCkgLyBOYGAsIHdoZXJlIGBgTiA9IGxlbih4KWBgLiAgSWYsIGhvd2V2ZXIsIGBkZG9mYCBpcyBzcGVjaWZpZWQsCiAgICB0aGUgZGl2aXNvciBgYE4gLSBkZG9mYGAgaXMgdXNlZCBpbnN0ZWFkLiBJbiBzdGFuZGFyZCBzdGF0aXN0aWNhbAogICAgcHJhY3RpY2UsIGBgZGRvZj0xYGAgcHJvdmlkZXMgYW4gdW5iaWFzZWQgZXN0aW1hdG9yIG9mIHRoZSB2YXJpYW5jZQogICAgb2YgdGhlIGluZmluaXRlIHBvcHVsYXRpb24uIGBgZGRvZj0wYGAgcHJvdmlkZXMgYSBtYXhpbXVtIGxpa2VsaWhvb2QKICAgIGVzdGltYXRlIG9mIHRoZSB2YXJpYW5jZSBmb3Igbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdmFyaWFibGVzLiBUaGUKICAgIHN0YW5kYXJkIGRldmlhdGlvbiBjb21wdXRlZCBpbiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBzcXVhcmUgcm9vdCBvZgogICAgdGhlIGVzdGltYXRlZCB2YXJpYW5jZSwgc28gZXZlbiB3aXRoIGBgZGRvZj0xYGAsIGl0IHdpbGwgbm90IGJlIGFuCiAgICB1bmJpYXNlZCBlc3RpbWF0ZSBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIHBlciBzZS4KCiAgICBOb3RlIHRoYXQsIGZvciBjb21wbGV4IG51bWJlcnMsIGBzdGRgIHRha2VzIHRoZSBhYnNvbHV0ZQogICAgdmFsdWUgYmVmb3JlIHNxdWFyaW5nLCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgYWx3YXlzIHJlYWwgYW5kIG5vbm5lZ2F0aXZlLgoKICAgIEZvciBmbG9hdGluZy1wb2ludCBpbnB1dCwgdGhlICpzdGQqIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBzYW1lCiAgICBwcmVjaXNpb24gdGhlIGlucHV0IGhhcy4gRGVwZW5kaW5nIG9uIHRoZSBpbnB1dCBkYXRhLCB0aGlzIGNhbiBjYXVzZQogICAgdGhlIHJlc3VsdHMgdG8gYmUgaW5hY2N1cmF0ZSwgZXNwZWNpYWxseSBmb3IgZmxvYXQzMiAoc2VlIGV4YW1wbGUgYmVsb3cpLgogICAgU3BlY2lmeWluZyBhIGhpZ2hlci1hY2N1cmFjeSBhY2N1bXVsYXRvciB1c2luZyB0aGUgYGR0eXBlYCBrZXl3b3JkIGNhbgogICAgYWxsZXZpYXRlIHRoaXMgaXNzdWUuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IG5wLmFycmF5KFtbMSwgMl0sIFszLCA0XV0pCiAgICA+Pj4gbnAuc3RkKGEpCiAgICAxLjExODAzMzk4ODc0OTg5NDkKICAgID4+PiBucC5zdGQoYSwgYXhpcz0wKQogICAgYXJyYXkoWyAxLiwgIDEuXSkKICAgID4+PiBucC5zdGQoYSwgYXhpcz0xKQogICAgYXJyYXkoWyAwLjUsICAwLjVdKQoKICAgIEluIHNpbmdsZSBwcmVjaXNpb24sIHN0ZCgpIGNhbiBiZSBpbmFjY3VyYXRlOgoKICAgID4+PiBhID0gbnAuemVyb3MoKDIsIDUxMio1MTIpLCBkdHlwZT1ucC5mbG9hdDMyKQogICAgPj4+IGFbMCwgOl0gPSAxLjAKICAgID4+PiBhWzEsIDpdID0gMC4xCiAgICA+Pj4gbnAuc3RkKGEpCiAgICAwLjQ1MDAwMDA1CgogICAgQ29tcHV0aW5nIHRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaW4gZmxvYXQ2NCBpcyBtb3JlIGFjY3VyYXRlOgoKICAgID4+PiBucC5zdGQoYSwgZHR5cGU9bnAuZmxvYXQ2NCkKICAgIDAuNDQ5OTk5OTk5MjU0OTQxNzcKCiAgICBydwAAACkEck4AAABybgAAAHJPAAAA2gRkZG9mKQlydAAAAHJ4AAAAclgAAAByQAAAAHJBAAAAcjYAAAByPQAAAHIPAAAAWgRfc3RkKQhyUQAAAHJOAAAAcm4AAAByTwAAAHKFAAAAcncAAAByewAAAHI2AAAAckgAAABySAAAAHJJAAAAcjYAAABgCwAAcxYAAAAAZgQBCgEIAg4BAgEKAQ4BBgIYAhQBYwYAAAAAAAAACAAAAAgAAABDAAAAc3gAAABpAH0GfAV0AGoBawlyFnwFfAZkATwAdAJ8AIMBdANqBGsJclx5CnwAagV9B1cAbhQEAHQGawpyQgEAAQABAFkAbhpYAHwHZgB8AXwCfAN8BGQCnAR8BpcCjgFTAHQHagh8AGYBfAF8AnwDfARkApwEfAaXAo4BUwApA2HeDgAACiAgICBDb21wdXRlIHRoZSB2YXJpYW5jZSBhbG9uZyB0aGUgc3BlY2lmaWVkIGF4aXMuCgogICAgUmV0dXJucyB0aGUgdmFyaWFuY2Ugb2YgdGhlIGFycmF5IGVsZW1lbnRzLCBhIG1lYXN1cmUgb2YgdGhlIHNwcmVhZCBvZiBhCiAgICBkaXN0cmlidXRpb24uICBUaGUgdmFyaWFuY2UgaXMgY29tcHV0ZWQgZm9yIHRoZSBmbGF0dGVuZWQgYXJyYXkgYnkKICAgIGRlZmF1bHQsIG90aGVyd2lzZSBvdmVyIHRoZSBzcGVjaWZpZWQgYXhpcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIEFycmF5IGNvbnRhaW5pbmcgbnVtYmVycyB3aG9zZSB2YXJpYW5jZSBpcyBkZXNpcmVkLiAgSWYgYGFgIGlzIG5vdCBhbgogICAgICAgIGFycmF5LCBhIGNvbnZlcnNpb24gaXMgYXR0ZW1wdGVkLgogICAgYXhpcyA6IE5vbmUgb3IgaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIHRoZSB2YXJpYW5jZSBpcyBjb21wdXRlZC4gIFRoZSBkZWZhdWx0IGlzIHRvCiAgICAgICAgY29tcHV0ZSB0aGUgdmFyaWFuY2Ugb2YgdGhlIGZsYXR0ZW5lZCBhcnJheS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS43LjAKCiAgICAgICAgSWYgdGhpcyBpcyBhIHR1cGxlIG9mIGludHMsIGEgdmFyaWFuY2UgaXMgcGVyZm9ybWVkIG92ZXIgbXVsdGlwbGUgYXhlcywKICAgICAgICBpbnN0ZWFkIG9mIGEgc2luZ2xlIGF4aXMgb3IgYWxsIHRoZSBheGVzIGFzIGJlZm9yZS4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIFR5cGUgdG8gdXNlIGluIGNvbXB1dGluZyB0aGUgdmFyaWFuY2UuICBGb3IgYXJyYXlzIG9mIGludGVnZXIgdHlwZQogICAgICAgIHRoZSBkZWZhdWx0IGlzIGBmbG9hdDMyYDsgZm9yIGFycmF5cyBvZiBmbG9hdCB0eXBlcyBpdCBpcyB0aGUgc2FtZSBhcwogICAgICAgIHRoZSBhcnJheSB0eXBlLgogICAgb3V0IDogbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBBbHRlcm5hdGUgb3V0cHV0IGFycmF5IGluIHdoaWNoIHRvIHBsYWNlIHRoZSByZXN1bHQuICBJdCBtdXN0IGhhdmUKICAgICAgICB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LCBidXQgdGhlIHR5cGUgaXMgY2FzdCBpZgogICAgICAgIG5lY2Vzc2FyeS4KICAgIGRkb2YgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgIkRlbHRhIERlZ3JlZXMgb2YgRnJlZWRvbSI6IHRoZSBkaXZpc29yIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uIGlzCiAgICAgICAgYGBOIC0gZGRvZmBgLCB3aGVyZSBgYE5gYCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuIEJ5CiAgICAgICAgZGVmYXVsdCBgZGRvZmAgaXMgemVyby4KICAgIGtlZXBkaW1zIDogYm9vbCwgb3B0aW9uYWwKICAgICAgICBJZiB0aGlzIGlzIHNldCB0byBUcnVlLCB0aGUgYXhlcyB3aGljaCBhcmUgcmVkdWNlZCBhcmUgbGVmdAogICAgICAgIGluIHRoZSByZXN1bHQgYXMgZGltZW5zaW9ucyB3aXRoIHNpemUgb25lLiBXaXRoIHRoaXMgb3B0aW9uLAogICAgICAgIHRoZSByZXN1bHQgd2lsbCBicm9hZGNhc3QgY29ycmVjdGx5IGFnYWluc3QgdGhlIGlucHV0IGFycmF5LgoKICAgICAgICBJZiB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBwYXNzZWQsIHRoZW4gYGtlZXBkaW1zYCB3aWxsIG5vdCBiZQogICAgICAgIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBgdmFyYCBtZXRob2Qgb2Ygc3ViLWNsYXNzZXMgb2YKICAgICAgICBgbmRhcnJheWAsIGhvd2V2ZXIgYW55IG5vbi1kZWZhdWx0IHZhbHVlIHdpbGwgYmUuICBJZiB0aGUKICAgICAgICBzdWItY2xhc3NlcyBgc3VtYCBtZXRob2QgZG9lcyBub3QgaW1wbGVtZW50IGBrZWVwZGltc2AgYW55CiAgICAgICAgZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB2YXJpYW5jZSA6IG5kYXJyYXksIHNlZSBkdHlwZSBwYXJhbWV0ZXIgYWJvdmUKICAgICAgICBJZiBgYG91dD1Ob25lYGAsIHJldHVybnMgYSBuZXcgYXJyYXkgY29udGFpbmluZyB0aGUgdmFyaWFuY2U7CiAgICAgICAgb3RoZXJ3aXNlLCBhIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGFycmF5IGlzIHJldHVybmVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgc3RkICwgbWVhbiwgbmFubWVhbiwgbmFuc3RkLCBuYW52YXIKICAgIG51bXB5LmRvYy51ZnVuY3MgOiBTZWN0aW9uICJPdXRwdXQgYXJndW1lbnRzIgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIHZhcmlhbmNlIGlzIHRoZSBhdmVyYWdlIG9mIHRoZSBzcXVhcmVkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiwKICAgIGkuZS4sICBgYHZhciA9IG1lYW4oYWJzKHggLSB4Lm1lYW4oKSkqKjIpYGAuCgogICAgVGhlIG1lYW4gaXMgbm9ybWFsbHkgY2FsY3VsYXRlZCBhcyBgYHguc3VtKCkgLyBOYGAsIHdoZXJlIGBgTiA9IGxlbih4KWBgLgogICAgSWYsIGhvd2V2ZXIsIGBkZG9mYCBpcyBzcGVjaWZpZWQsIHRoZSBkaXZpc29yIGBgTiAtIGRkb2ZgYCBpcyB1c2VkCiAgICBpbnN0ZWFkLiAgSW4gc3RhbmRhcmQgc3RhdGlzdGljYWwgcHJhY3RpY2UsIGBgZGRvZj0xYGAgcHJvdmlkZXMgYW4KICAgIHVuYmlhc2VkIGVzdGltYXRvciBvZiB0aGUgdmFyaWFuY2Ugb2YgYSBoeXBvdGhldGljYWwgaW5maW5pdGUgcG9wdWxhdGlvbi4KICAgIGBgZGRvZj0wYGAgcHJvdmlkZXMgYSBtYXhpbXVtIGxpa2VsaWhvb2QgZXN0aW1hdGUgb2YgdGhlIHZhcmlhbmNlIGZvcgogICAgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgdmFyaWFibGVzLgoKICAgIE5vdGUgdGhhdCBmb3IgY29tcGxleCBudW1iZXJzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaXMgdGFrZW4gYmVmb3JlCiAgICBzcXVhcmluZywgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyByZWFsIGFuZCBub25uZWdhdGl2ZS4KCiAgICBGb3IgZmxvYXRpbmctcG9pbnQgaW5wdXQsIHRoZSB2YXJpYW5jZSBpcyBjb21wdXRlZCB1c2luZyB0aGUgc2FtZQogICAgcHJlY2lzaW9uIHRoZSBpbnB1dCBoYXMuICBEZXBlbmRpbmcgb24gdGhlIGlucHV0IGRhdGEsIHRoaXMgY2FuIGNhdXNlCiAgICB0aGUgcmVzdWx0cyB0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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 20
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
arrayprint.cpython-37.pyc
24.12 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
cversions.cpython-37.pyc
627 B
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
defchararray.cpython-37.pyc
65.72 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
einsumfunc.cpython-37.pyc
26.91 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
fromnumeric.cpython-37.pyc
95.70 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
function_base.cpython-37.pyc
10.68 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
generate_numpy_api.cpython-37.pyc
6.17 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
getlimits.cpython-37.pyc
13.52 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
info.cpython-37.pyc
4.78 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
machar.cpython-37.pyc
7.52 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
memmap.cpython-37.pyc
9.92 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
numeric.cpython-37.pyc
85.29 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
numerictypes.cpython-37.pyc
23.35 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
records.cpython-37.pyc
21.76 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
21.43 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup_common.cpython-37.pyc
9.63 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
shape_base.cpython-37.pyc
18.88 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_internal.cpython-37.pyc
17.55 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
_methods.cpython-37.pyc
3.55 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
2.34 KB
lrw-r--r--
2023-04-24 19:38:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).