REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 85.29 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/core/__pycache__/numeric.cpython-37.pyc
Text
Base64
Qg0NCgAAAADB2EZk+mUBAOMAAAAAAAAAAAAAAABoAAAAQAAAAHPyBQAAZABkAWwAbQFaAW0CWgJtA1oDAQBkAGQCbARaBGQAZAJsBVoFZABkAmwGWgZkAGQCbAdaB2QAZAJsCFoIZABkAmwJWgpkA2QEbAttDFoMAQBkA2QFbAxtDVoObQ9aD20QWhBtEVoRbRJaEm0TWhNtFFoUbRVaFW0WWhZtF1oXbRhaGG0ZWhltGloabRtaG20cWhxtHVodbR5aHm0fWh9tIFogbSFaIW0iWiJtI1ojbSRaJG0lWiVtJlombSdaJ20oWihtKVopbSpaKm0rWittLFosbS1aLW0uWi5tL1ovbTBaMG0xWjFtMloybTNaM200WjRtNVo1bTZaNm03WjdtOFo4bTlaOQEAZQdqOmQAGQBkBmsAkAFyKGQDZAdsDG07WjttPFo8AQBkA2QIbAttPVo9AQBkA2QJbD1tPlo+bT9aP21AWkBtQVpBbUJaQm1DWkNtRFpEbUVaRW1GWkZtR1pHbUhaSG1JWkkBAGQDZApsC21KWkoBAGQDZAtsSm1LWkttTFpMbU1aTW1OWk5tT1pPbVBaUAEAZANkDGxRbVJaUm1TWlMBAGU+WlRlVWU/gwFaVmQCWldlB2o6ZAAZAGQGawWQAXLeZABkAmxYWlhlWVpaZABkAmxbWltuEGQAZAJsXFpYZABkAmxdWltlWGpeWl5kDWQOZA9kEGQRZBJkE2QUZBVkFmQXZBhkGWQaZBtkHGQdZB5kH2QgZCFkImQjZCRkJWQmZCdkKGQpZCpkK2QsZC1kLmQvZDBkMWQyZDNkNGQ1ZDZkN2Q4ZDlkOmQ7ZDxkPWQ+ZD9kQGRBZEJkQ2REZEVkRmRHZEhkSWRKZEtkTGRNZE5kT2RQZFFkUmRTZFRkVWRWZFdkWGRZZFpkW2RcZF1kXmRfZGBkYWRiZGNkZGRlZGZkZ2RoZGlkamRrZGxkbWRuZG9kcGRxZHJkc2R0Z2haX2UHajpkABkAZAZrAJACcuZlX6BgZHVkdmcCoQEBAEcAZHdka4QAZGtlYYMDWmJkwGR6ZC+EAVpjZMFkfGRPhAFaZGTCZH1kMIQBWmVkw2R+ZGyEAVpmZMRkf2RthAFaZ2SAZIGEAFpoZMVkgmQWhAFaHmTGZINkKYQBWmlkx2SEZCqEAVpqZMhkhWQrhAFaa2TJZIZkLIQBWmxkymSHZEOEAVptZIhkLYQAWm5kiWQfhABab2SKZFuEAFpwZABkA2SLZIycA1pxZI1kjoQAWnJky2SQZDGEAVpzZMxkkWQyhAFadGTNZJJkNYQBWnVkzmSTZDuEAVp2ZM9klGQ3hAFad2TQZJVkOIQBWnhk0WSXZJiEAVp5ZJlkOYQAWnpkmmSbhABae2TSZJ1kOoQBWnxkA2SebH1tflp+bX9af22AWoABAGVNZU5lT2cDWoFlgmVMZYODApAEcixlgaCEZUyhAQEAZYJlS2WDgwKQBHJCZYGghGVLoQEBAGTTZJ9kP4QBWoVk1GSgZECEAVqGZNVkoWRBhAFah2WHZYZkAIMCAQBlh2WFZAODAgEAZQdqiGSiawJaiWWDZgFko2RHhAFaimSkZEiEAFqLZKVkTIQAWoxk1mSmZE2EAVqNZNdkp2ROhAFajmSoZEqEAFqPZKlkqoQAWpBk2GSrZFCEAVqRZNlkrmRRhAFakmTaZK9kSYQBWpNksGRFhABalGSxZEaEAFqVZUFlQmVDZURlRWVGZLKcBlqWaQBal3geZZagmKEARABdElqZZZlll2WWZZkZADwAkAVxDFcAW5lk22SzZFSEAVqaZLRkVYQAWptktWRWhABanGS2ZFeEAFqdZLdkWIQAWp5kuGRZhABan0cAZLlkuoQAZLploIMDWqFloYMAWqJHAGS7ZFqEAGRaZaCDA1qjZLxkvYQAWqRlpIMAAQBlSAQAWqUEAFqmBABap1qoZUkEAFqpWqplUGSWgwFaq2VQZHmDAVqsZANkvmw9VABkA2S+bEpUAGQDZL9sC22tWq0BAGQDZL5srVQAZWhlrYMBAQBlaGU9gwEBAGVoZUqDAQEAZAJTACnc6QAAAAApA9oIZGl2aXNpb27aD2Fic29sdXRlX2ltcG9ydNoOcHJpbnRfZnVuY3Rpb25O6QEAAAApAdoKbXVsdGlhcnJheSks2hVfZmFzdENvcHlBbmRUcmFuc3Bvc2XaDUFMTE9XX1RIUkVBRFPaB0JVRlNJWkXaBENMSVDaB01BWERJTVPaEE1BWV9TSEFSRV9CT1VORFPaD01BWV9TSEFSRV9FWEFDVNoFUkFJU0XaBFdSQVDaBmFyYW5nZdoFYXJyYXnaCWJyb2FkY2FzdNoIY2FuX2Nhc3TaEmNvbXBhcmVfY2hhcmFycmF5c9oLY29uY2F0ZW5hdGXaBmNvcHl0b9oNY291bnRfbm9uemVyb9oDZG902gVkdHlwZdoFZW1wdHnaCmVtcHR5X2xpa2XaCGZsYXRpdGVy2gpmcm9tYnVmZmVy2ghmcm9tZmlsZdoIZnJvbWl0ZXLaCmZyb21zdHJpbmfaBWlubmVy2gxpbnRfYXNidWZmZXLaB2xleHNvcnTaBm1hdG11bNoQbWF5X3NoYXJlX21lbW9yedoPbWluX3NjYWxhcl90eXBl2gduZGFycmF52gZuZGl0ZXLaDG5lc3RlZF9pdGVyc9oNcHJvbW90ZV90eXBlc9oHcHV0bWFza9oLcmVzdWx0X3R5cGXaD3NldF9udW1lcmljX29wc9oNc2hhcmVzX21lbW9yedoEdmRvdNoFd2hlcmXaBXplcm9z2hRub3JtYWxpemVfYXhpc19pbmRleOkDAAAAKQLaCW5ld2J1ZmZlctoJZ2V0YnVmZmVyKQHaBXVtYXRoKQzaBmludmVydNoDc2lu2hVVRlVOQ19CVUZTSVpFX0RFRkFVTFTaCkVSUl9JR05PUkXaCEVSUl9XQVJO2glFUlJfUkFJU0XaCEVSUl9DQUxM2glFUlJfUFJJTlTaB0VSUl9MT0faC0VSUl9ERUZBVUxU2gRQSU5G2gNOQU4pAdoMbnVtZXJpY3R5cGVzKQbaCGxvbmdsb25n2gRpbnRj2gRpbnRf2gZmbG9hdF/aCGNvbXBsZXhf2gVib29sXykC2gxUb29IYXJkRXJyb3LaCUF4aXNFcnJvctoHbmV3YXhpc3InAAAAchwAAAByKAAAAHIpAAAA2gV1ZnVuY3IQAAAAchEAAAByMQAAAHIXAAAAchoAAAByEgAAAHIZAAAAciAAAAByHgAAAHIdAAAAciIAAAByMAAAANoIYXJnd2hlcmVyFgAAAHIVAAAA2hRmYXN0Q29weUFuZFRyYW5zcG9zZXIjAAAAci0AAAByEwAAAHIqAAAAciYAAAByLAAAANoHYXNhcnJhedoKYXNhbnlhcnJhedoRYXNjb250aWd1b3VzYXJyYXnaDmFzZm9ydHJhbmFycmF52glpc2ZvcnRyYW5yGwAAANoKemVyb3NfbGlrZdoJb25lc19saWtl2gljb3JyZWxhdGXaCGNvbnZvbHZlciEAAAByGAAAANoFb3V0ZXJyLwAAANoEcm9sbNoIcm9sbGF4aXPaCG1vdmVheGlz2gVjcm9zc9oJdGVuc29yZG902gxhcnJheTJzdHJpbmfaEGdldF9wcmludG9wdGlvbnPaEHNldF9wcmludG9wdGlvbnPaCmFycmF5X3JlcHLaCWFycmF5X3N0ctoTc2V0X3N0cmluZ19mdW5jdGlvbtoNbGl0dGxlX2VuZGlhbtoHcmVxdWlyZXIfAAAA2gthcnJheV9lcXVhbNoLYXJyYXlfZXF1aXbaB2luZGljZXPaDGZyb21mdW5jdGlvbtoHaXNjbG9zZdoEbG9hZNoFbG9hZHPaCGlzc2NhbGFy2gtiaW5hcnlfcmVwctoJYmFzZV9yZXBy2gRvbmVz2ghpZGVudGl0edoIYWxsY2xvc2VyFAAAAHIrAAAA2gZzZXRlcnLaBmdldGVyctoKc2V0YnVmc2l6ZdoKZ2V0YnVmc2l6ZdoKc2V0ZXJyY2FsbNoKZ2V0ZXJyY2FsbNoIZXJyc3RhdGXaC2ZsYXRub256ZXJv2gNJbmbaA2luZtoFaW5mdHnaCEluZmluaXR52gNuYW7aA05hTtoGRmFsc2Vf2gVUcnVlX9oLYml0d2lzZV9ub3RyCgAAAHIOAAAAcg8AAAByCwAAAHIJAAAAcggAAADaDkNvbXBsZXhXYXJuaW5n2gRmdWxs2glmdWxsX2xpa2VyJAAAAHIuAAAAciUAAAByDAAAAHINAAAAckoAAABySwAAAHI1AAAAcjQAAABjAAAAAAAAAAAAAAAAAQAAAEAAAABzEAAAAGUAWgFkAFoCZAFaA2QCUwApA3KFAAAAet8KICAgIFRoZSB3YXJuaW5nIHJhaXNlZCB3aGVuIGNhc3RpbmcgYSBjb21wbGV4IGR0eXBlIHRvIGEgcmVhbCBkdHlwZS4KCiAgICBBcyBpbXBsZW1lbnRlZCwgY2FzdGluZyBhIGNvbXBsZXggbnVtYmVyIHRvIGEgcmVhbCBkaXNjYXJkcyBpdHMgaW1hZ2luYXJ5CiAgICBwYXJ0LCBidXQgdGhpcyBiZWhhdmlvciBtYXkgbm90IGJlIHdoYXQgdGhlIHVzZXIgYWN0dWFsbHkgd2FudHMuCgogICAgTikE2ghfX25hbWVfX9oKX19tb2R1bGVfX9oMX19xdWFsbmFtZV9f2gdfX2RvY19fqQByjAAAAHKMAAAA+kUvb3B0L2FsdC9weXRob24zNy9saWI2NC9weXRob24zLjcvc2l0ZS1wYWNrYWdlcy9udW1weS9jb3JlL251bWVyaWMucHlyhQAAAEwAAABzBAAAAAgHBAHaAUtUYwQAAAAAAAAABgAAAAYAAABDAAAAczIAAAB0AHwAfAF8AnwDZAGNBH0EdAFkAnwEagJkA40CfQV0A2oEfAR8BWQEZAWNAwEAfARTACkGYT4GAAAKICAgIFJldHVybiBhbiBhcnJheSBvZiB6ZXJvcyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCB0eXBlIGFzIGEgZ2l2ZW4gYXJyYXkuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBUaGUgc2hhcGUgYW5kIGRhdGEtdHlwZSBvZiBgYWAgZGVmaW5lIHRoZXNlIHNhbWUgYXR0cmlidXRlcyBvZgogICAgICAgIHRoZSByZXR1cm5lZCBhcnJheS4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIE92ZXJyaWRlcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSByZXN1bHQuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCiAgICBvcmRlciA6IHsnQycsICdGJywgJ0EnLCBvciAnSyd9LCBvcHRpb25hbAogICAgICAgIE92ZXJyaWRlcyB0aGUgbWVtb3J5IGxheW91dCBvZiB0aGUgcmVzdWx0LiAnQycgbWVhbnMgQy1vcmRlciwKICAgICAgICAnRicgbWVhbnMgRi1vcmRlciwgJ0EnIG1lYW5zICdGJyBpZiBgYWAgaXMgRm9ydHJhbiBjb250aWd1b3VzLAogICAgICAgICdDJyBvdGhlcndpc2UuICdLJyBtZWFucyBtYXRjaCB0aGUgbGF5b3V0IG9mIGBhYCBhcyBjbG9zZWx5CiAgICAgICAgYXMgcG9zc2libGUuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuNi4wCiAgICBzdWJvayA6IGJvb2wsIG9wdGlvbmFsLgogICAgICAgIElmIFRydWUsIHRoZW4gdGhlIG5ld2x5IGNyZWF0ZWQgYXJyYXkgd2lsbCB1c2UgdGhlIHN1Yi1jbGFzcwogICAgICAgIHR5cGUgb2YgJ2EnLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhIGJhc2UtY2xhc3MgYXJyYXkuIERlZmF1bHRzCiAgICAgICAgdG8gVHJ1ZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5CiAgICAgICAgQXJyYXkgb2YgemVyb3Mgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgdHlwZSBhcyBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBvbmVzX2xpa2UgOiBSZXR1cm4gYW4gYXJyYXkgb2Ygb25lcyB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgZW1wdHlfbGlrZSA6IFJldHVybiBhbiBlbXB0eSBhcnJheSB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgemVyb3MgOiBSZXR1cm4gYSBuZXcgYXJyYXkgc2V0dGluZyB2YWx1ZXMgdG8gemVyby4KICAgIG9uZXMgOiBSZXR1cm4gYSBuZXcgYXJyYXkgc2V0dGluZyB2YWx1ZXMgdG8gb25lLgogICAgZW1wdHkgOiBSZXR1cm4gYSBuZXcgdW5pbml0aWFsaXplZCBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYpCiAgICA+Pj4geCA9IHgucmVzaGFwZSgoMiwgMykpCiAgICA+Pj4geAogICAgYXJyYXkoW1swLCAxLCAyXSwKICAgICAgICAgICBbMywgNCwgNV1dKQogICAgPj4+IG5wLnplcm9zX2xpa2UoeCkKICAgIGFycmF5KFtbMCwgMCwgMF0sCiAgICAgICAgICAgWzAsIDAsIDBdXSkKCiAgICA+Pj4geSA9IG5wLmFyYW5nZSgzLCBkdHlwZT1ucC5mbG9hdCkKICAgID4+PiB5CiAgICBhcnJheShbIDAuLCAgMS4sICAyLl0pCiAgICA+Pj4gbnAuemVyb3NfbGlrZSh5KQogICAgYXJyYXkoWyAwLiwgIDAuLCAgMC5dKQoKICAgICkDchkAAADaBW9yZGVy2gVzdWJva3IF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dGlndW91cywKICAgICAgICAnQycgb3RoZXJ3aXNlLiAnSycgbWVhbnMgbWF0Y2ggdGhlIGxheW91dCBvZiBgYWAgYXMgY2xvc2VseQogICAgICAgIGFzIHBvc3NpYmxlLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjYuMAogICAgc3Vib2sgOiBib29sLCBvcHRpb25hbC4KICAgICAgICBJZiBUcnVlLCB0aGVuIHRoZSBuZXdseSBjcmVhdGVkIGFycmF5IHdpbGwgdXNlIHRoZSBzdWItY2xhc3MKICAgICAgICB0eXBlIG9mICdhJywgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgYSBiYXNlLWNsYXNzIGFycmF5LiBEZWZhdWx0cwogICAgICAgIHRvIFRydWUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIEFycmF5IG9mIG9uZXMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgdHlwZSBhcyBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICB6ZXJvc19saWtlIDogUmV0dXJuIGFuIGFycmF5IG9mIHplcm9zIHdpdGggc2hhcGUgYW5kIHR5cGUgb2YgaW5wdXQuCiAgICBlbXB0eV9saWtlIDogUmV0dXJuIGFuIGVtcHR5IGFycmF5IHdpdGggc2hhcGUgYW5kIHR5cGUgb2YgaW5wdXQuCiAgICB6ZXJvcyA6IFJldHVybiBhIG5ldyBhcnJheSBzZXR0aW5nIHZhbHVlcyB0byB6ZXJvLgogICAgb25lcyA6IFJldHVybiBhIG5ldyBhcnJheSBzZXR0aW5nIHZhbHVlcyB0byBvbmUuCiAgICBlbXB0eSA6IFJldHVybiBhIG5ldyB1bmluaXRpYWxpemVkIGFycmF5LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IHggPSBucC5hcmFuZ2UoNikKICAgID4+PiB4ID0geC5yZXNoYXBlKCgyLCAzKSkKICAgID4+PiB4CiAgICBhcnJheShbWzAsIDEsIDJdLAogICAgICAgICAgIFszLCA0LCA1XV0pCiAgICA+Pj4gbnAub25lc19saWtlKHgp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CiAgICAgICAgQXJyYXkgb2YgYGZpbGxfdmFsdWVgIHdpdGggdGhlIHNhbWUgc2hhcGUgYW5kIHR5cGUgYXMgYGFgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgemVyb3NfbGlrZSA6IFJldHVybiBhbiBhcnJheSBvZiB6ZXJvcyB3aXRoIHNoYXBlIGFuZCB0eXBlIG9mIGlucHV0LgogICAgb25lc19saWtlIDogUmV0dXJuIGFuIGFycmF5IG9mIG9uZXMgd2l0aCBzaGFwZSBhbmQgdHlwZSBvZiBpbnB1dC4KICAgIGVtcHR5X2xpa2UgOiBSZXR1cm4gYW4gZW1wdHkgYXJyYXkgd2l0aCBzaGFwZSBhbmQgdHlwZSBvZiBpbnB1dC4KICAgIHplcm9zIDogUmV0dXJuIGEgbmV3IGFycmF5IHNldHRpbmcgdmFsdWVzIHRvIHplcm8uCiAgICBvbmVzIDogUmV0dXJuIGEgbmV3IGFycmF5IHNldHRpbmcgdmFsdWVzIHRvIG9uZS4KICAgIGVtcHR5IDogUmV0dXJuIGEgbmV3IHVuaW5pdGlhbGl6ZWQgYXJyYXkuCiAgICBmdWxsIDogRmlsbCBhIG5ldyBhcnJheS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYsIGR0eXBlPW5wLmludCkKICAgID4+PiBucC5mdWxsX2xpa2UoeCwgMSkKICAgIGFycmF5KFsxLCAxLCAxLCAxLCAxLCAxXSkKICAgID4+PiBucC5mdWxsX2xpa2UoeCwgMC4xKQogICAgYXJyYXkoWzAsIDAsIDAsIDAsIDAsIDBdKQogICAgPj4+IG5wLmZ1bGxfbGlrZSh4LCAwLjEsIGR0eXBlPW5wLmRvdWJsZSkKICAgIGFycmF5KFsgMC4xLCAgMC4xLCAgMC4xLCAgMC4xLCAgMC4xLCAgMC4xXSkKICAgID4+PiBucC5mdWxsX2xpa2UoeCwgbnAubmFuLCBkdHlwZT1ucC5kb3VibGUpCiAgICBhcnJheShbIG5hbiwgIG5hbiwgIG5hbiwgIG5hbiwgIG5hbiwgIG5hbl0pCgogICAgPj4+IHkgPSBucC5hcmFuZ2UoNiwgZHR5cGU9bnAuZG91YmxlKQogICAgPj4+IG5wLmZ1bGxfbGlrZSh5LCAwLjEpCiAgICBhcnJheShbIDAuMSwgIDAuMSwgIDAuMSwgIDAuMSwgIDAuMSwgIDAuMV0pCgogICAgKQNyGQAAAHKPAAAAcpAAAABykQAAACkBcpIAAAApA3IbAAAAcgYAAAByFgAAACkGcpMAAABymAAAAHIZAAAAco8AAABykAAAAHKUAAAAcowAAAByjAAAAHKNAAAAcocAAAAzAQAAcwYAAAAANxABEAFjAQAAAAAAAAAEAAAACAAAAEMAAABzdgAAAGkAfQF4FHQARABdDH0CZAF8AXwCPABxClcAeQ50AXwAZAKDAn0DVwBuKAQAdAJrCnJQAQABAAEAZANkBIQAfABqA6AEoQBEAIMBfQNZAG4CWAB4HnwDRABdFn0CfAJ8AWsHclh0AKAFfAKhAQEAcVhXAGQAUwApBU5yBQAAANoHX19hbGxfX2MBAAAAAAAAAAIAAAAFAAAAUwAAAHMaAAAAZwB8AF0SfQF8AaAAZAChAXMEfAGRAnEEUwApAdoBXykB2gpzdGFydHN3aXRoKQLaAi4w2gFrcowAAAByjAAAAHKNAAAA+go8bGlzdGNvbXA+dgEAAHMCAAAABgB6HmV4dGVuZF9hbGwuPGxvY2Fscz4uPGxpc3Rjb21wPikGcpkAAADaB2dldGF0dHLaDkF0dHJpYnV0ZUVycm9y2ghfX2RpY3RfX9oEa2V5c9oGYXBwZW5kKQTaBm1vZHVsZdoFYWRpY3RykwAAAFoEbWFsbHKMAAAAcowAAAByjQAAANoKZXh0ZW5kX2FsbG8BAABzFAAAAAABBAEKAQwBAgEOAQ4BGgEKAQgBcqYAAABjAgAAAAAAAAAEAAAABgAAAEMAAABzDAEAAHwBZAFrCHMQfAFkAmsCchp0AKABfAChAVMAdAJ8AIMBfQB8AGoDdARrAnI8fABqBXwBdAZqB2QDjQJTAHQIfABqA3QGagmDAnJefABkBGsDagV8AXQGagdkA40CUwB0CHwAagN0BmoKgwJzenQIfABqA3QGaguDAnKafABqA6AMZAWhAX0CfAB8AmsDagV8AXQGagdkA40CUwB0DXQOfAF8AGoPgwKDAX0BdAagEHQAagF8AWQEGQB8AKEDfQN8AWoRZAZrAnLYfANqEnQGagdkB2QIjQJTAHwDagV0E3wBZAZkAYUCGQB8AWQGZAGFAhkAfAFkBBkAawQYAIMBdAZqB2QDjQJTAGQBUwApCWH/BQAACiAgICBDb3VudHMgdGhlIG51bWJlciBvZiBub24temVybyB2YWx1ZXMgaW4gdGhlIGFycmF5IGBgYWBgLgoKICAgIFRoZSB3b3JkICJub24temVybyIgaXMgaW4gcmVmZXJlbmNlIHRvIHRoZSBQeXRob24gMi54CiAgICBidWlsdC1pbiBtZXRob2QgYGBfX25vbnplcm9fXygpYGAgKHJlbmFtZWQgYGBfX2Jvb2xfXygpYGAKICAgIGluIFB5dGhvbiAzLngpIG9mIFB5dGhvbiBvYmplY3RzIHRoYXQgdGVzdHMgYW4gb2JqZWN0J3MKICAgICJ0cnV0aGZ1bG5lc3MiLiBGb3IgZXhhbXBsZSwgYW55IG51bWJlciBpcyBjb25zaWRlcmVkCiAgICB0cnV0aGZ1bCBpZiBpdCBpcyBub256ZXJvLCB3aGVyZWFzIGFueSBzdHJpbmcgaXMgY29uc2lkZXJlZAogICAgdHJ1dGhmdWwgaWYgaXQgaXMgbm90IHRoZSBlbXB0eSBzdHJpbmcuIFRodXMsIHRoaXMgZnVuY3Rpb24KICAgIChyZWN1cnNpdmVseSkgY291bnRzIGhvdyBtYW55IGVsZW1lbnRzIGluIGBgYWBgIChhbmQgaW4KICAgIHN1Yi1hcnJheXMgdGhlcmVvZikgaGF2ZSB0aGVpciBgYF9fbm9uemVyb19fKClgYCBvciBgYF9fYm9vbF9fKClgYAogICAgbWV0aG9kIGV2YWx1YXRlZCB0byBgYFRydWVgYC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBhcnJheSBmb3Igd2hpY2ggdG8gY291bnQgbm9uLXplcm9zLgogICAgYXhpcyA6IGludCBvciB0dXBsZSwgb3B0aW9uYWwKICAgICAgICBBeGlzIG9yIHR1cGxlIG9mIGF4ZXMgYWxvbmcgd2hpY2ggdG8gY291bnQgbm9uLXplcm9zLgogICAgICAgIERlZmF1bHQgaXMgTm9uZSwgbWVhbmluZyB0aGF0IG5vbi16ZXJvcyB3aWxsIGJl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dXJuZWQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBhc2FueWFycmF5IDogU2ltaWxhciBmdW5jdGlvbiB3aGljaCBwYXNzZXMgdGhyb3VnaCBzdWJjbGFzc2VzLgogICAgYXNjb250aWd1b3VzYXJyYXkgOiBDb252ZXJ0IGlucHV0IHRvIGEgY29udGlndW91cyBhcnJheS4KICAgIGFzZmFycmF5IDogQ29udmVydCBpbnB1dCB0byBhIGZsb2F0aW5nIHBvaW50IG5kYXJyYXkuCiAgICBhc2ZvcnRyYW5hcnJheSA6IENvbnZlcnQgaW5wdXQgdG8gYW4gbmRhcnJheSB3aXRoIGNvbHVtbi1tYWpvcgogICAgICAgICAgICAgICAgICAgICBtZW1vcnkgb3JkZXIuCiAgICBhc2FycmF5X2Noa2Zpbml0ZSA6IFNpbWlsYXIgZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlucHV0IGZvciBOYU5zIGFuZCBJbmZzLgogICAgZnJvbWl0ZXIgOiBDcmVhdGUgYW4gYXJyYXkgZnJvbSBhbiBpdGVyYXRvci4KICAgIGZyb21mdW5jdGlvbiA6IENvbnN0cnVjdCBhbiBhcnJheSBieSBleGVjdXRpbmcgYSBmdW5jdGlvbiBvbiBncmlkCiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBDb252ZXJ0IGEgbGlzdCBpbnRvIGFuIGFycmF5OgoKICAgID4+PiBhID0gWzEsIDJdCiAgICA+Pj4gbnAuYXNhcnJheShhKQogICAgYXJyYXkoWzEsIDJdKQoKICAgIEV4aXN0aW5nIGFycmF5cyBhcmUgbm90IGNvcGllZDoKCiAgICA+Pj4gYSA9IG5wLmFycmF5KFsxLCAyXSkKICAgID4+PiBucC5hc2FycmF5KGEpIGlzIGEKICAgIFRydWUKCiAgICBJZiBgZHR5cGVgIGlzIHNldCwgYXJyYXkgaXMgY29waWVkIG9ubHkgaWYgZHR5cGUgZG9lcyBub3QgbWF0Y2g6CgogICAgPj4+IGEgPSBucC5hcnJheShbMSwgMl0sIGR0eXBlPW5wLmZsb2F0MzIpCiAgICA+Pj4gbnAuYXNhcnJheShhLCBkdHlwZT1ucC5mbG9hdDMyKSBpcyBhCiAgICBUcnVlCiAgICA+Pj4gbnAuYXNhcnJheShhLCBkdHlwZT1ucC5mbG9hdDY0KSBpcyBhCiAgICBGYWxzZQoKICAgIENvbnRyYXJ5IHRvIGBhc2FueWFycmF5YCwgbmRhcnJheSBzdWJjbGFzc2VzIGFyZSBub3QgcGFzc2VkIHRocm91Z2g6CgogICAgPj4+IGlzc3ViY2xhc3MobnAubWF0cml4LCBucC5uZGFycmF5KQogICAgVHJ1ZQogICAgPj4+IGEgPSBucC5tYXRyaXgoW1sxLCAyXV0pCiAgICA+Pj4gbnAuYXNhcnJheShhKSBpcyBhCiAgICBGYWxzZQogICAgPj4+IG5wLmFzYW55YXJyYXkoYSkgaXMgYQogICAgVHJ1ZQoKICAgIEYpAnKpAAAAco8AAAApAXIRAAAAKQNykwAAAHIZAAAAco8AAAByjAAAAHKMAAAAco0AAAByUAAAAM8BAABzAgAAAABEYwMAAAAAAAAAAwAAAAcAAABDAAAAcxIAAAB0AHwAfAFkAXwCZAJkA40FUwApBGE8BgAAQ29udmVydCB0aGUgaW5wdXQgdG8gYW4gbmRhcnJheSwgYnV0IHBhc3MgbmRhcnJheSBzdWJjbGFzc2VzIHRocm91Z2guCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBkYXRhLCBpbiBhbnkgZm9ybSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXkuICBUaGlzCiAgICAgICAgaW5jbHVkZXMgc2NhbGFycywgbGlzdHMsIGxpc3RzIG9mIHR1cGxlcywgdHVwbGVzLCB0dXBsZXMgb2YgdHVwbGVzLAogICAgICAgIHR1cGxlcyBvZiBsaXN0cywgYW5kIG5kYXJyYXlzLgogICAgZHR5cGUgOiBkYXRhLXR5cGUsIG9wdGlvbmFsCiAgICAgICAgQnkgZGVmYXVsdCwgdGhlIGRhdGEtdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBpbnB1dCBkYXRhLgogICAgb3JkZXIgOiB7J0MnLCAnRid9LCBvcHRpb25hbAogICAgICAgIFdoZXRoZXIgdG8gdXNlIHJvdy1tYWpvciAoQy1zdHlsZSkgb3IgY29sdW1uLW1ham9yCiAgICAgICAgKEZvcnRyYW4tc3R5bGUpIG1lbW9yeSByZXByZXNlbnRhdGlvbi4gIERlZmF1bHRzIHRvICdDJy4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5IG9yIGFuIG5kYXJyYXkgc3ViY2xhc3MKICAgICAgICBBcnJheSBpbnRlcnByZXRhdGlvbiBvZiBgYWAuICBJZiBgYWAgaXMgYW4gbmRhcnJheSBvciBhIHN1YmNsYXNzCiAgICAgICAgb2YgbmRhcnJheSwgaXQgaXMgcmV0dXJuZWQgYXMtaXMgYW5kIG5vIGNvcHkgaXMgcGVyZm9ybWVkLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYXNhcnJheSA6IFNpbWlsYXIgZnVuY3Rpb24gd2hpY2ggYWx3YXlzIHJldHVybnMgbmRhcnJheXMuCiAgICBhc2NvbnRpZ3VvdXNhcnJheSA6IENvbnZlcnQgaW5wdXQgdG8gYSBjb250aWd1b3VzIGFycmF5LgogICAgYXNmYXJyYXkgOiBDb252ZXJ0IGlucHV0IHRvIGEgZmxvYXRpbmcgcG9pbnQgbmRhcnJheS4KICAgIGFzZm9ydHJhbmFycmF5IDogQ29udmVydCBpbnB1dCB0byBhbiBuZGFycmF5IHdpdGggY29sdW1uLW1ham9yCiAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBvcmRlci4KICAgIGFzYXJyYXlfY2hrZmluaXRlIDogU2ltaWxhciBmdW5jdGlvbiB3aGljaCBjaGVja3MgaW5wdXQgZm9yIE5hTnMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIEluZnMuCiAgICBmcm9taXRlciA6IENyZWF0ZSBhbiBhcnJheSBmcm9tIGFuIGl0ZXJhdG9yLgogICAgZnJvbWZ1bmN0aW9uIDogQ29uc3RydWN0IGFuIGFycmF5IGJ5IGV4ZWN1dGluZyBhIGZ1bmN0aW9uIG9uIGdyaWQKICAgICAgICAgICAgICAgICAgIHBvc2l0aW9ucy4KCiAgICBFeGFt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IHJldHVybmVkIGZvciBwYXNzaW5nIHRvIGNvbXBpbGVkIGNvZGUgKHBlcmhhcHMgdGhyb3VnaCBjdHlwZXMpLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICBUaGUgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhIHR5cGUtYW5kLXJlcXVpcmVtZW50LXNhdGlzZnlpbmcgYXJyYXkuCiAgICBkdHlwZSA6IGRhdGEtdHlwZQogICAgICAgVGhlIHJlcXVpcmVkIGRhdGEtdHlwZS4gSWYgTm9uZSBwcmVzZXJ2ZSB0aGUgY3VycmVudCBkdHlwZS4gSWYgeW91cgogICAgICAgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhlIGRhdGEgdG8gYmUgaW4gbmF0aXZlIGJ5dGVvcmRlciwgaW5jbHVkZQogICAgICAgYSBieXRlb3JkZXIgc3BlY2lmaWNhdGlvbiBhcyBhIHBhcnQgb2YgdGhlIGR0eXBlIHNwZWNpZmljYXRpb24uCiAgICByZXF1aXJlbWVudHMgOiBzdHIgb3IgbGlzdCBvZiBzdHIKICAgICAgIFRoZSByZXF1aXJlbWVudHMgbGlzdCBjYW4gYmUgYW55IG9mIHRoZSBmb2xsb3dpbmcKCiAgICAgICAqICdGX0NPTlRJR1VPVVMnICgnRicpIC0gZW5zdXJlIGEgRm9ydHJhbi1jb250aWd1b3VzIGFycmF5CiAgICAgICAqICdDX0NPTlRJR1VPVVMnICgnQycpIC0gZW5zdXJlIGEgQy1jb250aWd1b3VzIGFycmF5CiAgICAgICAqICdBTElHTkVEJyAoJ0EnKSAgICAgIC0gZW5zdXJlIGEgZGF0YS10eXBlIGFsaWduZWQgYXJyYXkKICAgICAgICogJ1dSSVRFQUJMRScgKCdXJykgICAgLSBlbnN1cmUgYSB3cml0YWJsZSBhcnJheQogICAgICAgKiAnT1dOREFUQScgKCdPJykgICAgICAtIGVuc3VyZSBhbiBhcnJheSB0aGF0IG93bnMgaXRzIG93biBkYXRhCiAgICAgICAqICdFTlNVUkVBUlJBWScsICgnRScpIC0gZW5zdXJlIGEgYmFzZSBhcnJheSwgaW5zdGVhZCBvZiBhIHN1YmNsYXNzCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBhc2FycmF5IDogQ29udmVydCBpbnB1dCB0byBhbiBuZGFycmF5LgogICAgYXNhbnlhcnJheSA6IENvbnZlcnQgdG8gYW4gbmRhcnJheSwgYnV0IHBhc3MgdGhyb3VnaCBuZGFycmF5IHN1YmNsYXNzZXMuCiAgICBhc2NvbnRpZ3VvdXNhcnJheSA6IENvbnZlcnQgaW5wdXQgdG8gYSBjb250aWd1b3VzIGFycmF5LgogICAgYXNmb3J0cmFuYXJyYXkgOiBDb252ZXJ0IGlucHV0IHRvIGFuIG5kYXJyYXkgd2l0aCBjb2x1bW4tbWFqb3IKICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IG9yZGVyLgogICAgbmRhcnJheS5mbGFncyA6IEluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgbGF5b3V0IG9mIHRoZSBhcnJheS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGJlIGd1YXJhbnRlZWQgdG8gaGF2ZSB0aGUgbGlzdGVkIHJlcXVpcmVtZW50cwogICAgYnkgbWFraW5nIGEgY29weSBpZiBuZWVkZWQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFyYW5nZSg2KS5yZXNoYXBlKDIsMykKICAgID4+PiB4LmZsYWdzCiAgICAgIENfQ09OVElHVU9VUyA6IFRydWUKICAgICAgRl9DT05USUdVT1VTIDogRmFsc2UKICAgICAgT1dOREFUQSA6IEZhbHNlCiAgICAgIFdSSVRFQUJMRSA6IFRydWUKICAgICAgQUxJR05FRCA6IFRydWUKICAgICAgVVBEQVRFSUZDT1BZIDogRmFsc2UKCiAgICA+Pj4geSA9IG5wLnJlcXVpcmUoeCwgZHR5cGU9bnAuZmxvYXQzMiwgcmVxdWlyZW1lbnRzPVsnQScsICdPJywgJ1cnLCAnRiddKQogICAgPj4+IHkuZmxhZ3MKICAgICAgQ19DT05USUdVT1VTIDogRmFsc2UKICAgICAgRl9DT05USUdVT1VTIDogVHJ1ZQogICAgICBPV05EQVRBIDogVHJ1ZQogICAgICBXUklURUFCTEUgOiBUcnVlCiAgICAgIEFMSUdORUQgOiBUcnVlCiAgICAgIFVQREFURUlGQ09QWSA6IEZhbHNlCgogICAgcpYAAABytgAAANoBQdoBV9oBT9oBRSkOcpYAAABaDENfQ09OVElHVU9VU1oKQ09OVElHVU9VU3K2AAAAWgxGX0NPTlRJR1VPVVNaB0ZPUlRSQU5ytwAAAFoHQUxJR05FRHK4AAAAWglXUklURUFCTEVyuQAAAFoHT1dOREFUQXK6AAAAWgtFTlNVUkVBUlJBWSkBchkAAABjAQAAAAAAAAACAAAABAAAADMAAABzGgAAAHwAXRJ9AYgAfAGgAKEAGQBWAAEAcQJkAFMAKQFOKQHaBXVwcGVyKQJynAAAANoBeCkB2g5wb3NzaWJsZV9mbGFnc3KMAAAAco0AAAD6CTxnZW5leHByPtkCAABzAgAAAAQAehpyZXF1aXJlLjxsb2NhbHM+LjxnZW5leHByPkZUeiVDYW5ub3Qgc3BlY2lmeSBib3RoICJDIiBhbmQgIkYiIG9yZGVyKQRyGQAAAHKPAAAAcqkAAABykAAAACkHclEAAADaA3NldNoGcmVtb3Zl2gpWYWx1ZUVycm9ychEAAADaBWZsYWdzcqkAAAApB3KTAAAAchkAAADaDHJlcXVpcmVtZW50c3KQAAAAco8AAADaA2FyctoEcHJvcHKMAAAAKQFyvQAAAHKNAAAAcmYAAACUAgAAczgAAAAAPAYBBgEEAQQBBAEKAQQBDAIWAggBCgEGAgQCBAEQAQoBCAEEAQwBCAEEAQoCEgIKAQoBCgEGAWMBAAAAAAAAAAEAAAABAAAAQwAAAHMIAAAAfABqAGoBUwApAWGoBQAACiAgICBSZXR1cm5zIFRydWUgaWYgdGhlIGFycmF5IGlzIEZvcnRyYW4gY29udGlndW91cyBidXQgKm5vdCogQyBjb250aWd1b3VzLgoKICAgIFRoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUgYW5kLCBiZWNhdXNlIG9mIGNoYW5nZXMgZHVlIHRvIHJlbGF4ZWQgc3RyaWRlCiAgICBjaGVja2luZywgaXRzIHJldHVybiB2YWx1ZSBmb3IgdGhlIHNhbWUgYXJyYXkgbWF5IGRpZmZlciBmb3IgdmVyc2lvbnMKICAgIG9mIE51bVB5ID49IDEuMTAuMCBhbmQgcHJldmlvdXMgdmVyc2lvbnMuIElmIHlvdSBvbmx5IHdhbnQgdG8gY2hlY2sgaWYgYW4KICAgIGFycmF5IGlzIEZvcnRyYW4gY29udGlndW91cyB1c2UgYGBhLmZsYWdzLmZfY29udGlndW91c2BgIGluc3RlYWQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IG5kYXJyYXkKICAgICAgICBJbnB1dCBhcnJheS4KCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCgogICAgbnAuYXJyYXkgYWxsb3dzIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgYXJyYXkgaXMgd3JpdHRlbiBpbiBDLWNvbnRpZ3VvdXMKICAgIG9yZGVyIChsYXN0IGluZGV4IHZhcmllcyB0aGUgZmFzdGVzdCksIG9yIEZPUlRSQU4tY29udGlndW91cyBvcmRlciBpbgogICAgbWVtb3J5IChmaXJzdCBpbmRleCB2YXJpZXMgdGhlIGZhc3Rlc3QpLgoKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSwgb3JkZXI9J0MnKQogICAgPj4+IGEKICAgIGFycmF5KFtbMSwgMiwgM10sCiAgICAgICAgICAgWzQsIDUsIDZdXSkKICAgID4+PiBucC5pc2ZvcnRyYW4oYSkKICAgIEZhbHNlCgogICAgPj4+IGIgPSBucC5hcnJheShbWzEsIDIsIDNdLCBbNCwgNSwgNl1dLCBvcmRlcj0nRk9SVFJBTicpCiAgICA+Pj4gYgogICAgYXJyYXkoW1sxLCAyLCAzXSwKICAgICAgICAgICBbNCwgNSwgNl1dKQogICAgPj4+IG5wLmlzZm9ydHJhbihiKQogICAgVHJ1ZQoKCiAgICBUaGUgdHJhbnNwb3NlIG9mIGEgQy1vcmRlcmVkIGFycmF5IGlzIGEgRk9SVFJBTi1vcmRlcmVkIGFycmF5LgoKICAgID4+PiBhID0gbnAuYXJyYXkoW1sxLCAyLCAzXSwgWzQsIDUsIDZdXSwgb3JkZXI9J0MnKQogICAgPj4+IGEKICAgIGFycmF5KFtbMSwgMiwgM10sCiAgICAgICAgICAgWzQsIDUsIDZdXSkKICAgID4+PiBucC5pc2ZvcnRyYW4oYSkKICAgIEZhbHNlCiAgICA+Pj4gYiA9IGEuVAogICAgPj4+IGIKICAgIGFycmF5KFtbMSwgNF0sCiAgICAgICAgICAgWzIsIDVdLAogICAgICAgICAgIFszLCA2XV0pCiAgICA+Pj4gbnAuaXNmb3J0cmFuKGIpCiAgICBUcnVlCgogICAgQy1vcmRlcmVkIGFycmF5cyBldmFsdWF0ZSBhcyBGYWxzZSBldmVuIGlmIHRoZXkgYXJlIGFsc28gRk9SVFJBTi1vcmRlcmVkLgoKICAgID4+PiBucC5pc2ZvcnRyYW4obnAuYXJyYXkoWzEsIDJdLCBvcmRlcj0nRk9SVFJBTicpKQogICAgRmFsc2UKCiAgICApAnLCAAAAWgNmbmMpAXKTAAAAcowAAAByjAAAAHKNAAAAclQAAAD0AgAAcwIAAAAAO2MBAAAAAAAAAAEAAAADAAAAQwAAAHMMAAAAdAB0AXwAgwGDAVMAKQFh+AIAAAogICAgRmluZCB0aGUgaW5kaWNlcyBvZiBhcnJheSBlbGVtZW50cyB0aGF0IGFyZSBub24temVybywgZ3JvdXBlZCBieSBlbGVtZW50LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgZGF0YS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBpbmRleF9hcnJheSA6IG5kYXJyYXkKICAgICAgICBJbmRpY2VzIG9mIGVsZW1lbnRzIHRoYXQgYXJlIG5vbi16ZXJvLiBJbmRpY2VzIGFyZSBncm91cGVkIGJ5IGVsZW1lbnQuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICB3aGVyZSwgbm9uemVybwoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgYGBucC5hcmd3aGVyZShhKWBgIGlzIHRoZSBzYW1lIGFzIGBgbnAudHJhbnNwb3NlKG5wLm5vbnplcm8oYSkpYGAuCgogICAgVGhlIG91dHB1dCBvZiBgYGFyZ3doZXJlYGAgaXMgbm90IHN1aXRhYmxlIGZvciBpbmRleGluZyBhcnJheXMuCiAgICBGb3IgdGhpcyBwdXJwb3NlIHVzZSBgYHdoZXJlKGEpYGAgaW5zdGVhZC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiB4ID0gbnAuYXJhbmdlKDYpLnJlc2hhcGUoMiwzKQogICAgPj4+IHgKICAgIGFycmF5KFtbMCwgMSwgMl0sCiAgICAgICAgICAgWzMsIDQsIDVdXSkKICAgID4+PiBucC5hcmd3aGVyZSh4PjEpCiAgICBhcnJheShbWzAsIDJdLAogICAgICAgICAgIFsxLCAwXSwKICAgICAgICAgICBbMSwgMV0sCiAgICAgICAgICAgWzEsIDJdXSkKCiAgICApAtoJdHJhbnNwb3Nl2gdub256ZXJvKQFykwAAAHKMAAAAcowAAAByjQAAAHJOAAAAMgMAAHMCAAAAACZjAQAAAAAAAAABAAAAAgAAAEMAAABzEAAAAHwAoAChAKABoQBkARkAUwApAmE8AwAACiAgICBSZXR1cm4gaW5kaWNlcyB0aGF0IGFyZSBub24temVybyBpbiB0aGUgZmxhdHRlbmVkIHZlcnNpb24gb2YgYS4KCiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYS5yYXZlbCgpLm5vbnplcm8oKVswXS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogbmRhcnJheQogICAgICAgIElucHV0IGFycmF5LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHJlcyA6IG5kYXJyYXkKICAgICAgICBPdXRwdXQgYXJyYXksIGNvbnRhaW5pbmcgdGhlIGluZGljZXMgb2YgdGhlIGVsZW1lbnRzIG9mIGBhLnJhdmVsKClgCiAgICAgICAgdGhhdCBhcmUgbm9uLXplcm8uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBub256ZXJvIDogUmV0dXJuIHRoZSBpbmRpY2VzIG9mIHRoZSBub24temVybyBlbGVtZW50cyBvZiB0aGUgaW5wdXQgYXJyYXkuCiAgICByYXZlbCA6IFJldHVybiBhIDEtRCBhcnJheSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgaW5wdXQgYXJyYXkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4geCA9IG5wLmFyYW5nZSgtMiwgMykKICAgID4+PiB4CiAgICBhcnJheShbLTIsIC0xLCAgMCwgIDEsICAyXSkKICAgID4+PiBucC5mbGF0bm9uemVybyh4KQogICAgYXJyYXkoWzAsIDEsIDMsIDRdKQoKICAgIFVzZSB0aGUgaW5kaWNlcyBvZiB0aGUgbm9uLXplcm8gZWxlbWVudHMgYXMgYW4gaW5kZXggYXJyYXkgdG8gZXh0cmFjdAogICAgdGhlc2UgZWxlbWVudHM6CgogICAgPj4+IHgucmF2ZWwoKVtucC5mbGF0bm9uemVybyh4KV0KICAgIGFycmF5KFstMiwgLTEsICAxLCAgMl0pCgogICAgcgEAAAApAtoFcmF2ZWxyxwAAACkBcpMAAAByjAAAAHKMAAAAco0AAAByewAAAFsDAABzAgAAAAAl6QIAAAApA9oBdtoBc9oBZmMBAAAAAAAAAAEAAAADAAAAQwAAAHMeAAAAdAB8AHQBgwJyGnQCfACgA6EAZAEZABkAUwB8AFMAKQJOcgEAAAApBNoKaXNpbnN0YW5jZdoKYmFzZXN0cmluZ9oUX21vZGVfZnJvbV9uYW1lX2RpY3TaBWxvd2VyKQHaBG1vZGVyjAAAAHKMAAAAco0AAADaD19tb2RlX2Zyb21fbmFtZYgDAABzBgAAAAABCgEQAXLSAAAA2gV2YWxpZGMDAAAAAAAAAAMAAAAFAAAAQwAAAHMWAAAAdAB8AoMBfQJ0AaACfAB8AXwCoQNTACkBYZ4HAAAKICAgIENyb3NzLWNvcnJlbGF0aW9uIG9mIHR3byAxLWRpbWVuc2lvbmFsIHNlcXVlbmNlcy4KCiAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBjb3JyZWxhdGlvbiBhcyBnZW5lcmFsbHkgZGVmaW5lZCBpbiBzaWduYWwKICAgIHByb2Nlc3NpbmcgdGV4dHM6OgoKICAgICAgICBjX3thdn1ba10gPSBzdW1fbiBhW24ra10gKiBjb25qKHZbbl0pCgogICAgd2l0aCBhIGFuZCB2IHNlcXVlbmNlcyBiZWluZyB6ZXJvLXBhZGRlZCB3aGVyZSBuZWNlc3NhcnkgYW5kIGNvbmogYmVpbmcKICAgIHRoZSBjb25qdWdhdGUuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSwgdiA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBzZXF1ZW5jZXMuCiAgICBtb2RlIDogeyd2YWxpZCcsICdzYW1lJywgJ2Z1bGwnfSwgb3B0aW9uYWwKICAgICAgICBSZWZlciB0byB0aGUgYGNvbnZvbHZlYCBkb2NzdHJpbmcuICBOb3RlIHRoYXQgdGhlIGRlZmF1bHQKICAgICAgICBpcyAndmFsaWQnLCB1bmxpa2UgYGNvbnZvbHZlYCwgd2hpY2ggdXNlcyAnZnVsbCcuCiAgICBvbGRfYmVoYXZpb3IgOiBib29sCiAgICAgICAgYG9sZF9iZWhhdmlvcmAgd2FzIHJlbW92ZWQgaW4gTnVtUHkgMS4xMC4gSWYgeW91IG5lZWQgdGhlIG9sZAogICAgICAgIGJlaGF2aW9yLCB1c2UgYG11bHRpYXJyYXkuY29ycmVsYXRlYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBuZGFycmF5CiAgICAgICAgRGlzY3JldGUgY3Jvc3MtY29ycmVsYXRpb24gb2YgYGFgIGFuZCBgdmAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBjb252b2x2ZSA6IERpc2NyZXRlLCBsaW5lYXIgY29udm9sdXRpb24gb2YgdHdvIG9uZS1kaW1lbnNpb25hbCBzZXF1ZW5jZXMuCiAgICBtdWx0aWFycmF5LmNvcnJlbGF0ZSA6IE9sZCwgbm8gY29uanVnYXRlLCB2ZXJzaW9uIG9mIGNvcnJlbGF0ZS4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRoZSBkZWZpbml0aW9uIG9mIGNvcnJlbGF0aW9uIGFib3ZlIGlzIG5vdCB1bmlxdWUgYW5kIHNvbWV0aW1lcyBjb3JyZWxhdGlvbgogICAgbWF5IGJlIGRlZmluZWQgZGlmZmVyZW50bHkuIEFub3RoZXIgY29tbW9uIGRlZmluaXRpb24gaXM6OgoKICAgICAgICBjJ197YXZ9W2tdID0gc3VtX24gYVtuXSBjb25qKHZbbitrXSkKCiAgICB3aGljaCBpcyByZWxhdGVkIHRvIGBgY197YXZ9W2tdYGAgYnkgYGBjJ197YXZ9W2tdID0gY197YXZ9Wy1rXWBgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmNvcnJlbGF0ZShbMSwgMiwgM10sIFswLCAxLCAwLjVdKQogICAgYXJyYXkoWyAzLjVdKQogICAgPj4+IG5wLmNvcnJlbGF0ZShbMSwgMiwgM10sIFswLCAxLCAwLjVdLCAic2FtZSIpCiAgICBhcnJheShbIDIuICwgIDMuNSwgIDMuIF0pCiAgICA+Pj4gbnAuY29ycmVsYXRlKFsxLCAyLCAzXSwgWzAsIDEsIDAuNV0sICJmdWxsIikKICAgIGFycmF5KFsgMC41LCAgMi4gLCAgMy41LCAgMy4gLCAgMC4gXSkKCiAgICBVc2luZyBjb21wbGV4IHNlcXVlbmNlczoKCiAgICA+Pj4gbnAuY29ycmVsYXRlKFsxKzFqLCAyLCAzLTFqXSwgWzAsIDEsIDAuNWpdLCAnZnVsbCcpCiAgICBhcnJheShbIDAuNS0wLjVqLCAgMS4wKzAuaiAsICAxLjUtMS41aiwgIDMuMC0xLmogLCAgMC4wKzAuaiBdKQoKICAgIE5vdGUgdGhhdCB5b3UgZ2V0IHRoZSB0aW1lIHJldmVyc2VkLCBjb21wbGV4IGNvbmp1Z2F0ZWQgcmVzdWx0CiAgICB3aGVuIHRoZSB0d28gaW5wdXQgc2VxdWVuY2VzIGNoYW5nZSBwbGFjZXMsIGkuZS4sCiAgICBgYGNfe3ZhfVtrXSA9IGNeeyp9X3thdn1bLWtdYGA6CgogICAgPj4+IG5wLmNvcnJlbGF0ZShbMCwgMSwgMC41al0sIFsxKzFqLCAyLCAzLTFqXSwgJ2Z1bGwnKQogICAgYXJyYXkoWyAwLjArMC5qICwgIDMuMCsxLmogLCAgMS41KzEuNWosICAxLjArMC5qICwgIDAuNSswLjVqXSkKCiAgICApA3LSAAAAcgYAAABaCmNvcnJlbGF0ZTIpA3KTAAAAcsoAAABy0QAAAHKMAAAAcowAAAByjQAAAHJXAAAAjgMAAHMEAAAAAEAIAWMDAAAAAAAAAAMAAAAHAAAAQwAAAHOAAAAAdAB8AGQBZAJkA40DdAB8AWQBZAJkA40DAgB9AH0BdAF8AYMBdAF8AIMBawRyOHwBfAACAH0AfQF0AXwAgwFkBGsCckx0AmQFgwGCAXQBfAGDAWQEawJyYHQCZAaDAYIBdAN8AoMBfQJ0BKAFfAB8AWQHZAdkCIUDGQB8AqEDUwApCWEEDAAACiAgICBSZXR1cm5zIHRoZSBkaXNjcmV0ZSwgbGluZWFyIGNvbnZvbHV0aW9uIG9mIHR3byBvbmUtZGltZW5zaW9uYWwgc2VxdWVuY2VzLgoKICAgIFRoZSBjb252b2x1dGlvbiBvcGVyYXRvciBpcyBvZnRlbiBzZWVuIGluIHNpZ25hbCBwcm9jZXNzaW5nLCB3aGVyZSBpdAogICAgbW9kZWxzIHRoZSBlZmZlY3Qgb2YgYSBsaW5lYXIgdGltZS1pbnZhcmlhbnQgc3lzdGVtIG9uIGEgc2lnbmFsIFsxXV8uICBJbgogICAgcHJvYmFiaWxpdHkgdGhlb3J5LCB0aGUgc3VtIG9mIHR3byBpbmRlcGVuZGVudCByYW5kb20gdmFyaWFibGVzIGlzCiAgICBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnZvbHV0aW9uIG9mIHRoZWlyIGluZGl2aWR1YWwKICAgIGRpc3RyaWJ1dGlvbnMuCgogICAgSWYgYHZgIGlzIGxvbmdlciB0aGFuIGBhYCwgdGhlIGFycmF5cyBhcmUgc3dhcHBlZCBiZWZvcmUgY29tcHV0YXRpb24uCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IChOLCkgYXJyYXlfbGlrZQogICAgICAgIEZpcnN0IG9uZS1kaW1lbnNpb25hbCBpbnB1dCBhcnJheS4KICAgIHYgOiAoTSwpIGFycmF5X2xpa2UKICAgICAgICBTZWNvbmQgb25lLWRpbWVuc2lvbmFsIGlucHV0IGFycmF5LgogICAgbW9kZSA6IHsnZnVsbCcsICd2YWxpZCcsICdzYW1lJ30sIG9wdGlvbmFsCiAgICAgICAgJ2Z1bGwnOgogICAgICAgICAgQnkgZGVmYXVsdCwgbW9kZSBpcyAnZnVsbCcuICBUaGlzIHJldHVybnMgdGhlIGNvbnZvbHV0aW9uCiAgICAgICAgICBhdCBlYWNoIHBvaW50IG9mIG92ZXJsYXAsIHdpdGggYW4gb3V0cHV0IHNoYXBlIG9mIChOK00tMSwpLiBBdAogICAgICAgICAgdGhlIGVuZC1wb2ludHMgb2YgdGhlIGNvbnZvbHV0aW9uLCB0aGUgc2lnbmFscyBkbyBub3Qgb3ZlcmxhcAogICAgICAgICAgY29tcGxldGVseSwgYW5kIGJvdW5kYXJ5IGVmZmVjdHMgbWF5IGJlIHNlZW4uCgogICAgICAgICdzYW1lJzoKICAgICAgICAgIE1vZGUgJ3NhbWUnIHJldHVybnMgb3V0cHV0IG9mIGxlbmd0aCBgYG1heChNLCBOKWBgLiAgQm91bmRhcnkKICAgICAgICAgIGVmZmVjdHMgYXJlIHN0aWxsIHZpc2libGUuCgogICAgICAgICd2YWxpZCc6CiAgICAgICAgICBNb2RlICd2YWxpZCcgcmV0dXJucyBvdXRwdXQgb2YgbGVuZ3RoCiAgICAgICAgICBgYG1heChNLCBOKSAtIG1pbihNLCBOKSArIDFgYC4gIFRoZSBjb252b2x1dGlvbiBwcm9kdWN0IGlzIG9ubHkgZ2l2ZW4KICAgICAgICAgIGZvciBwb2ludHMgd2hlcmUgdGhlIHNpZ25hbHMgb3ZlcmxhcCBjb21wbGV0ZWx5LiAgVmFsdWVzIG91dHNpZGUKICAgICAgICAgIHRoZSBzaWduYWwgYm91bmRhcnkgaGF2ZSBubyBlZmZlY3QuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIERpc2NyZXRlLCBsaW5lYXIgY29udm9sdXRpb24gb2YgYGFgIGFuZCBgdmAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBzY2lweS5zaWduYWwuZmZ0Y29udm9sdmUgOiBDb252b2x2ZSB0d28gYXJyYXlzIHVzaW5nIHRoZSBGYXN0IEZvdXJpZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybS4KICAgIHNjaXB5LmxpbmFsZy50b2VwbGl0eiA6IFVzZWQgdG8gY29uc3RydWN0IHRoZSBjb252b2x1dGlvbiBvcGVyYXRvci4KICAgIHBvbHltdWwgOiBQb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uLiBTYW1lIG91dHB1dCBhcyBjb252b2x2ZSwgYnV0IGFsc28KICAgICAgICAgICAgICBhY2NlcHRzIHBvbHkxZCBvYmplY3RzIGFzIGlucHV0LgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgVGhlIGRpc2NyZXRlIGNvbnZvbHV0aW9uIG9wZXJhdGlvbiBpcyBkZWZpbmVkIGFzCgogICAgLi4gbWF0aDo6IChhICogdilbbl0gPSBcc3VtX3ttID0gLVxpbmZ0eX1ee1xpbmZ0eX0gYVttXSB2W24gLSBtXQoKICAgIEl0IGNhbiBiZSBzaG93biB0aGF0IGEgY29udm9sdXRpb24gOm1hdGg6YHgodCkgKiB5KHQpYCBpbiB0aW1lL3NwYWNlCiAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBtdWx0aXBsaWNhdGlvbiA6bWF0aDpgWChmKSBZKGYpYCBpbiB0aGUgRm91cmllcgogICAgZG9tYWluLCBhZnRlciBhcHByb3ByaWF0ZSBwYWRkaW5nIChwYWRkaW5nIGlzIG5lY2Vzc2FyeSB0byBwcmV2ZW50CiAgICBjaXJjdWxhciBjb252b2x1dGlvbikuICBTaW5jZSBtdWx0aXBsaWNhdGlvbiBpcyBtb3JlIGVmZmljaWVudCAoZmFzdGVyKQogICAgdGhhbiBjb252b2x1dGlvbiwgdGhlIGZ1bmN0aW9uIGBzY2lweS5zaWduYWwuZmZ0Y29udm9sdmVgIGV4cGxvaXRzIHRoZQogICAgRkZUIHRvIGNhbGN1bGF0ZSB0aGUgY29udm9sdXRpb24gb2YgbGFyZ2UgZGF0YS1zZXRzLgoKICAgIFJlZmVyZW5jZXMKICAgIC0tLS0tLS0tLS0KICAgIC4uIFsxXSBXaWtpcGVkaWEsICJDb252b2x1dGlvbiIsIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29udm9sdXRpb24uCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBOb3RlIGhvdyB0aGUgY29udm9sdXRpb24gb3BlcmF0b3IgZmxpcHMgdGhlIHNlY29uZCBhcnJheQogICAgYmVmb3JlICJzbGlkaW5nIiB0aGUgdHdvIGFjcm9zcyBvbmUgYW5vdGhlcjoKCiAgICA+Pj4gbnAuY29udm9sdmUoWzEsIDIsIDNdLCBbMCwgMSwgMC41XSkKICAgIGFycmF5KFsgMC4gLCAgMS4gLCAgMi41LCAgNC4gLCAgMS41XSkKCiAgICBPbmx5IHJldHVybiB0aGUgbWlkZGxlIHZhbHVlcyBvZiB0aGUgY29udm9sdXRpb24uCiAgICBDb250YWlucyBib3VuZGFyeSBlZmZlY3RzLCB3aGVyZSB6ZXJvcyBhcmUgdGFrZW4KICAgIGludG8gYWNjb3VudDoKCiAgICA+Pj4gbnAuY29udm9sdmUoWzEsMiwzXSxbMCwxLDAuNV0sICdzYW1lJykKICAgIGFycmF5KFsgMS4gLCAgMi41LCAgNC4gXSkKCiAgICBUaGUgdHdvIGFycmF5cyBhcmUgb2YgdGhlIHNhbWUgbGVuZ3RoLCBzbyB0aGVyZQogICAgaXMgb25seSBvbmUgcG9zaXRpb24gd2hlcmUgdGhleSBjb21wbGV0ZWx5IG92ZXJsYXA6CgogICAgPj4+IG5wLmNvbnZvbHZlKFsxLDIsM10sWzAsMSwwLjVdLCAndmFsaWQnKQogICAgYXJyYXkoWyAyLjVdKQoKICAgIEZyBQAAACkCcqkAAABytQAAAHIBAAAAehFhIGNhbm5vdCBiZSBlbXB0eXoRdiBjYW5ub3QgYmUgZW1wdHlO6f////8pBnIRAAAA2gNsZW5ywQAAAHLSAAAAcgYAAAByVwAAACkDcpMAAAByygAAAHLRAAAAcowAAAByjAAAAHKNAAAAclgAAADSAwAAcxIAAAAAVx4BEAEKAQwBCAEMAQgBCAFjAwAAAAAAAAADAAAABgAAAEMAAABzPAAAAHQAfACDAX0AdAB8AYMBfQF0AXwAoAKhAGQBZAGFAnQDZgIZAHwBoAKhAHQDZAFkAYUCZgIZAHwCgwNTACkCYbwIAAAKICAgIENvbXB1dGUgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMuCgogICAgR2l2ZW4gdHdvIHZlY3RvcnMsIGBgYSA9IFthMCwgYTEsIC4uLiwgYU1dYGAgYW5kCiAgICBgYGIgPSBbYjAsIGIxLCAuLi4sIGJOXWBgLAogICAgdGhlIG91dGVyIHByb2R1Y3QgWzFdXyBpczo6CgogICAgICBbW2EwKmIwICBhMCpiMSAuLi4gYTAqYk4gXQogICAgICAgW2ExKmIwICAgIC4KICAgICAgIFsgLi4uICAgICAgICAgIC4KICAgICAgIFthTSpiMCAgICAgICAgICAgIGFNKmJOIF1dCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IChNLCkgYXJyYXlfbGlrZQogICAgICAgIEZpcnN0IGlucHV0IHZlY3Rvci4gIElucHV0IGlzIGZsYXR0ZW5lZCBpZgogICAgICAgIG5vdCBhbHJlYWR5IDEtZGltZW5zaW9uYWwuCiAgICBiIDogKE4sKSBhcnJheV9saWtlCiAgICAgICAgU2Vjb25kIGlucHV0IHZlY3Rvci4gIElucHV0IGlzIGZsYXR0ZW5lZCBpZgogICAgICAgIG5vdCBhbHJlYWR5IDEtZGltZW5zaW9uYWwuCiAgICBvdXQgOiAoTSwgTikgbmRhcnJheSwgb3B0aW9uYWwKICAgICAgICBBIGxvY2F0aW9uIHdoZXJlIHRoZSByZXN1bHQgaXMgc3RvcmVkCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuOS4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogKE0sIE4pIG5kYXJyYXkKICAgICAgICBgYG91dFtpLCBqXSA9IGFbaV0gKiBiW2pdYGAKCiAgICBTZWUgYWxzbwogICAgLS0tLS0tLS0KICAgIGlubmVyLCBlaW5zdW0KCiAgICBSZWZlcmVuY2VzCiAgICAtLS0tLS0tLS0tCiAgICAuLiBbMV0gOiBHLiBILiBHb2x1YiBhbmQgQy4gRi4gdmFuIExvYW4sICpNYXRyaXggQ29tcHV0YXRpb25zKiwgM3JkCiAgICAgICAgICAgICBlZC4sIEJhbHRpbW9yZSwgTUQsIEpvaG5zIEhvcGtpbnMgVW5pdmVyc2l0eSBQcmVzcywgMTk5NiwKICAgICAgICAgICAgIHBnLiA4LgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgTWFrZSBhICgqdmVyeSogY29hcnNlKSBncmlkIGZvciBjb21wdXRpbmcgYSBNYW5kZWxicm90IHNldDoKCiAgICA+Pj4gcmwgPSBucC5vdXRlcihucC5vbmVzKCg1LCkpLCBucC5saW5zcGFjZSgtMiwgMiwgNSkpCiAgICA+Pj4gcmwKICAgIGFycmF5KFtbLTIuLCAtMS4sICAwLiwgIDEuLCAgMi5dLAogICAgICAgICAgIFstMi4sIC0xLiwgIDAuLCAgMS4sICAyLl0sCiAgICAgICAgICAgWy0yLiwgLTEuLCAgMC4sICAxLiwgIDIuXSwKICAgICAgICAgICBbLTIuLCAtMS4sICAwLiwgIDEuLCAgMi5dLAogICAgICAgICAgIFstMi4sIC0xLiwgIDAuLCAgMS4sICAyLl1dKQogICAgPj4+IGltID0gbnAub3V0ZXIoMWoqbnAubGluc3BhY2UoMiwgLTIsIDUpLCBucC5vbmVzKCg1LCkpKQogICAgPj4+IGltCiAgICBhcnJheShbWyAwLisyLmosICAwLisyLmosICAwLisyLmosICAwLisyLmosICAwLisyLmpdLAogICAgICAgICAgIFsgMC4rMS5qLCAgMC4rMS5qLCAgMC4rMS5qLCAgMC4rMS5qLCAgMC4rMS5qXSwKICAgICAgICAgICBbIDAuKzAuaiwgIDAuKzAuaiwgIDAuKzAuaiwgIDAuKzAuaiwgIDAuKzAual0sCiAgICAgICAgICAgWyAwLi0xLmosICAwLi0xLmosICAwLi0xLmosICAwLi0xLmosICAwLi0xLmpdLAogICAgICAgICAgIFsgMC4tMi5qLCAgMC4tMi5qLCAgMC4tMi5qLCAgMC4tMi5qLCAgMC4tMi5qXV0pCiAgICA+Pj4gZ3JpZCA9IHJsICsgaW0KICAgID4+PiBncmlkCiAgICBhcnJheShbWy0yLisyLmosIC0xLisyLmosICAwLisyLmosICAxLisyLmosICAyLisyLmpdLAogICAgICAgICAgIFstMi4rMS5qLCAtMS4rMS5qLCAgMC4rMS5qLCAgMS4rMS5qLCAgMi4rMS5qXSwKICAgICAgICAgICBbLTIuKzAuaiwgLTEuKzAuaiwgIDAuKzAuaiwgIDEuKzAuaiwgIDIuKzAual0sCiAgICAgICAgICAgWy0yLi0xLmosIC0xLi0xLmosICAwLi0xLmosICAx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ZiBgYmAgaW4gb3JkZXIuIFRoZSBzaXplcyBvZiB0aGUgY29ycmVzcG9uZGluZyBheGVzIG11c3QgbWF0Y2guCiAgICAgICAgKiAoMiwpIGFycmF5X2xpa2UKICAgICAgICAgIE9yLCBhIGxpc3Qgb2YgYXhlcyB0byBiZSBzdW1tZWQgb3ZlciwgZmlyc3Qgc2VxdWVuY2UgYXBwbHlpbmcgdG8gYGFgLAogICAgICAgICAgc2Vjb25kIHRvIGBiYC4gQm90aCBlbGVtZW50cyBhcnJheV9saWtlIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgZG90LCBlaW5zdW0KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFRocmVlIGNvbW1vbiB1c2UgY2FzZXMgYXJlOgogICAgICAgICogYGBheGVzID0gMGBgIDogdGVuc29yIHByb2R1Y3QgOm1hdGg6YGFcb3RpbWVzIGJgCiAgICAgICAgKiBgYGF4ZXMgPSAxYGAgOiB0ZW5zb3IgZG90IHByb2R1Y3QgOm1hdGg6YGFcY2RvdCBiYAogICAgICAgICogYGBheGVzID0gMmBgIDogKGRlZmF1bHQpIHRlbnNvciBkb3VibGUgY29udHJhY3Rpb24gOm1hdGg6YGE6YmAKCiAgICBXaGVuIGBheGVzYCBpcyBpbnRlZ2VyX2xpa2UsIHRoZSBzZXF1ZW5jZSBmb3IgZXZhbHVhdGlvbiB3aWxsIGJlOiBmaXJzdAogICAgdGhlIC1OdGggYXhpcyBpbiBgYWAgYW5kIDB0aCBheGlzIGluIGBiYCwgYW5kIHRoZSAtMXRoIGF4aXMgaW4gYGFgIGFuZAogICAgTnRoIGF4aXMgaW4gYGJgIGxhc3QuCgogICAgV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGF4aXMgdG8gc3VtIG92ZXIgLSBhbmQgdGhleSBhcmUgbm90IHRoZSBsYXN0CiAgICAoZmlyc3QpIGF4ZXMgb2YgYGFgIChgYmApIC0gdGhlIGFyZ3VtZW50IGBheGVzYCBzaG91bGQgY29uc2lzdCBvZgogICAgdHdvIHNlcXVlbmNlcyBvZiB0aGUgc2FtZSBsZW5ndGgsIHdpdGggdGhlIGZpcnN0IGF4aXMgdG8gc3VtIG92ZXIgZ2l2ZW4KICAgIGZpcnN0IGluIGJvdGggc2VxdWVuY2VzLCB0aGUgc2Vjb25kIGF4aXMgc2Vjb25kLCBhbmQgc28gZm9ydGguCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBBICJ0cmFkaXRpb25hbCIgZXhhbXBsZToKCiAgICA+Pj4gYSA9IG5wLmFyYW5nZSg2MC4pLnJlc2hhcGUoMyw0LDUpCiAgICA+Pj4gYiA9IG5wLmFyYW5nZSgyNC4pLnJlc2hhcGUoNCwzLDIpCiAgICA+Pj4gYyA9IG5wLnRlbnNvcmRvdChhLGIsIGF4ZXM9KFsxLDBdLFswLDFdKSkKICAgID4+PiBjLnNoYXBlCiAgICAoNSwgMikKICAgID4+PiBjCiAgICBhcnJheShbWyA0NDAwLiwgIDQ3MzAuXSwKICAgICAgICAgICBbIDQ1MzIuLCAgNDg3NC5dLAogICAgICAgICAgIFsgNDY2NC4sICA1MDE4Ll0sCiAgICAgICAgICAgWyA0Nzk2LiwgIDUxNjIuXSwKICAgICAgICAgICBbIDQ5MjguLCAgNTMwNi5dXSkKICAgID4+PiAjIEEgc2xvd2VyIGJ1dCBlcXVpdmFsZW50IHdheSBvZiBjb21wdXRpbmcgdGhlIHNhbWUuLi4KICAgID4+PiBkID0gbnAuemVyb3MoKDUsMikpCiAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoNSk6CiAgICAuLi4gICBmb3IgaiBpbiByYW5nZSgyKToKICAgIC4uLiAgICAgZm9yIGsgaW4gcmFuZ2UoMyk6CiAgICAuLi4gICAgICAgZm9yIG4gaW4gcmFuZ2UoNCk6CiAgICAuLi4gICAgICAgICBkW2ksal0gKz0gYVtrLG4saV0gKiBiW24sayxqXQogICAgPj4+IGMgPT0gZAogICAgYXJyYXkoW1sgVHJ1ZSwgIFRydWVdLAogICAgICAgICAgIFsgVHJ1ZSwgIFRydWVdLAogICAgICAgICAgIFsgVHJ1ZSwgIFRydWVdLAogICAgICAgICAgIFsgVHJ1ZSwgIFRydWVdLAogICAgICAgICAgIFsgVHJ1ZSwgIFRydWVdXSwgZHR5cGU9Ym9vbCkKCiAgICBBbiBleHRlbmRlZCBleGFtcGxlIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhlIG92ZXJsb2FkaW5nIG9mICsgYW5kIFwqOgoKICAgID4+PiBhID0gbnAuYXJyYXkocmFuZ2UoMSwgOSkpCiAgICA+Pj4gYS5zaGFwZSA9ICgyLCAyLCAyKQogICAgPj4+IEEgPSBucC5hcnJheSgoJ2EnLCAnYicsICdjJywgJ2QnKSwgZHR5cGU9b2JqZWN0KQogICAgPj4+IEEuc2hhcGUgPSAoMiwgMikKICAgID4+PiBhOyBBCiAgICBhcnJheShbW1sxLCAyXSwKICAgICAgICAgICAgWzMsIDRdXSwKICAgICAgICAgICBbWzUsIDZdLAogICAgICAgICAgICBbNywgOF1dXSkKICAgIGFycmF5KFtbYSwgYl0sCiAgICAgICAgICAgW2MsIGRdXSwgZHR5cGU9b2JqZWN0KQoKICAgID4+PiBucC50ZW5zb3Jkb3QoYSwgQSkgIyB0aGlyZCBhcmd1bWVudCBkZWZhdWx0IGlzIDIgZm9yIGRvdWJsZS1jb250cmFjdGlvbgogICAgYXJyYXkoW2FiYmNjY2RkZGQsIGFhYWFhYmJiYmJiY2NjY2NjY2RkZGRkZGRkXSwgZHR5cGU9b2JqZWN0KQoKICAgID4+PiBucC50ZW5zb3Jkb3QoYSwgQSwgMSkKICAgIGFycmF5KFtbW2FjYywgYmRkXSwKICAgICAgICAgICAgW2FhYWNjY2MsIGJiYmRkZGRdXSwKICAgICAgICAgICBbW2FhYWFhY2NjY2NjLCBiYmJiYmRkZGRkZF0sCiAgICAgICAgICAgIFthYWFhYWFhY2NjY2NjY2MsIGJiYmJiYmJkZGRkZGRkZF1dXSwgZHR5cGU9b2JqZWN0KQoKICAgID4+PiBucC50ZW5zb3Jkb3QoYSwgQSwgMCkgIyB0ZW5zb3IgcHJvZHVjdCAocmVzdWx0IHRvbyBsb25nIHRvIGluY2wuKQogICAgYXJyYXkoW1tbW1thLCBiXSwKICAgICAgICAgICAgICBbYywgZF1dLAogICAgICAgICAgICAgIC4uLgoKICAgID4+PiBucC50ZW5zb3Jkb3QoYSwgQSwgKDAsIDEpKQogICAgYXJyYXkoW1tbYWJiYmJi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b25nIGEgZ2l2ZW4gYXhpcy4KCiAgICBFbGVtZW50cyB0aGF0IHJvbGwgYmV5b25kIHRoZSBsYXN0IHBvc2l0aW9uIGFyZSByZS1pbnRyb2R1Y2VkIGF0CiAgICB0aGUgZmlyc3QuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheS4KICAgIHNoaWZ0IDogaW50IG9yIHR1cGxlIG9mIGludHMKICAgICAgICBUaGUgbnVtYmVyIG9mIHBsYWNlcyBieSB3aGljaCBlbGVtZW50cyBhcmUgc2hpZnRlZC4gIElmIGEgdHVwbGUsCiAgICAgICAgdGhlbiBgYXhpc2AgbXVzdCBiZSBhIHR1cGxlIG9mIHRoZSBzYW1lIHNpemUsIGFuZCBlYWNoIG9mIHRoZQogICAgICAgIGdpdmVuIGF4ZXMgaXMgc2hpZnRlZCBieSB0aGUgY29ycmVzcG9uZGluZyBudW1iZXIuICBJZiBhbiBpbnQKICAgICAgICB3aGlsZSBgYXhpc2AgaXMgYSB0dXBsZSBvZiBpbnRzLCB0aGVuIHRoZSBzYW1lIHZhbHVlIGlzIHVzZWQgZm9yCiAgICAgICAgYWxsIGdpdmVuIGF4ZXMuCiAgICBheGlzIDogaW50IG9yIHR1cGxlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIGVsZW1lbnRzIGFyZSBzaGlmdGVkLiAgQnkgZGVmYXVsdCwgdGhlCiAgICAgICAgYXJyYXkgaXMgZmxhdHRlbmVkIGJlZm9yZSBzaGlmdGluZywgYWZ0ZXIgd2hpY2ggdGhlIG9yaWdpbmFsCiAgICAgICAgc2hhcGUgaXMgcmVzdG9yZWQuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgcmVzIDogbmRhcnJheQogICAgICAgIE91dHB1dCBhcnJheSwgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICByb2xsYXhpcyA6IFJvbGwgdGhlIHNwZWNpZmllZCBheGlzIGJhY2t3YXJkcywgdW50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AYMBdAR8AIMBawNyeogAcnJ0BmQDoAeIAKEBgwGCAW4IdAZkBIMBggF8AFMAKQVhxAQAAAogICAgTm9ybWFsaXplcyBhbiBheGlzIGFyZ3VtZW50IGludG8gYSB0dXBsZSBvZiBub24tbmVnYXRpdmUgaW50ZWdlciBheGVzLgoKICAgIFRoaXMgaGFuZGxlcyBzaG9ydGhhbmRzIHN1Y2ggYXMgYGAxYGAgYW5kIGNvbnZlcnRzIHRoZW0gdG8gYGAoMSwpYGAsCiAgICBhcyB3ZWxsIGFzIHBlcmZvcm1pbmcgdGhlIGhhbmRsaW5nIG9mIG5lZ2F0aXZlIGluZGljZXMgY292ZXJlZCBieQogICAgYG5vcm1hbGl6ZV9heGlzX2luZGV4YC4KCiAgICBCeSBkZWZhdWx0LCB0aGlzIGZvcmJpZHMgYXhlcyBmcm9tIGJlaW5nIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4KCiAgICBVc2VkIGludGVybmFsbHkgYnkgbXVsdGktYXhpcy1jaGVja2luZyBsb2dpYy4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEzLjAKCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBheGlzIDogaW50LCBpdGVyYWJsZSBvZiBpbnQKICAgICAgICBUaGUgdW4tbm9ybWFsaXplZCBpbmRleCBvciBpbmRpY2VzIG9mIHRoZSBheGlzLgogICAgbmRpbSA6IGludAogICAgICAgIFRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiB0aGUgYXJyYXkgdGhhdCBgYXhpc2Agc2hvdWxkIGJlIG5vcm1hbGl6ZWQKICAgICAgICBhZ2FpbnN0LgogICAgYXJnbmFtZSA6IHN0ciwgb3B0aW9uYWwKICAgICAgICBBIHByZWZpeCB0byBwdXQgYmVmb3JlIHRoZSBlcnJvciBtZXNzYWdlLCB0eXBpY2FsbHkgdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgYXJndW1lbnQuCiAgICBhbGxvd19kdXBsaWNhdGUgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIEZhbHNlLCB0aGUgZGVmYXVsdCwgZGlzYWxsb3cgYW4gYXhpcyBmcm9tIGJlaW5nIHNwZWNpZmllZCB0d2ljZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBub3JtYWxpemVkX2F4ZXMgOiB0dXBsZSBvZiBpbnQKICAgICAgICBUaGUgbm9ybWFsaXplZCBheGlzIGluZGV4LCBzdWNoIHRoYXQgYDAgPD0gbm9ybWFsaXplZF9heGlzIDwgbmRpbWAKCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgQXhpc0Vycm9yCiAgICAgICAgSWYgYW55IGF4aXMgcHJvdmlkZWQgaXMgb3V0IG9mIHJhbmdlCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgYW4gYXhpcyBpcyByZXBlYXRlZAoKICAgIFNlZSBhbHNvCiAgICAtLS0tLS0tLQogICAgbm9ybWFsaXplX2F4aXNfaW5kZXggOiBub3JtYWxpemluZyBhIHNpbmdsZSBzY2FsYXIgYXhpcwogICAgYwEAAAAAAAAAAgAAAAUAAAAzAAAAcxoAAAB8AF0SfQF0AHwBiAGIAIMDVgABAHECZABTACkBTikBcjIAAAApAnKcAAAAcucAAAApAtoHYXJnbmFtZXKwAAAAcowAAAByjQAAAHK+AAAAAAYAAHMCAAAABAB6J25vcm1hbGl6ZV9heGlzX3R1cGxlLjxsb2NhbHM+LjxnZW5leHByPnoecmVwZWF0ZWQgYXhpcyBpbiBge31gIGFyZ3VtZW50eg1yZXBlYXRlZCBheGlzKQjaCG9wZXJhdG9y2gVpbmRleHLgAAAAcrMAAABy1QAAAHK/AAAAcsEAAADaBmZvcm1hdCkEcqcAAABysAAAAHL2AAAAcuYAAAByjAAAACkCcvYAAABysAAAAHKNAAAAcq8AAADRBQAAcxQAAAAAKwIBEAEOAQ4BGAEYAQQBEAIIAXKvAAAAYwMAAAAAAAAACAAAAAgAAAADAAAAc64AAAB5CnwAagB9A1cAbiIEAHQBawpyLAEAAQABAHQCfACDAX0AfABqAH0DWQBuAlgAdAOIAHwAagRkAYMDiQB0A3wCfABqBGQCgwN9AnQFiACDAXQFfAKDAWsDcmJ0BmQDgwGCAYcAZgFkBGQFhAh0B3wAagSDAUQAgwF9BHgmdAh0CXwCiACDAoMBRABdFFwCfQV9BnwEoAp8BXwGoQIBAHGKVwB8A3wEgwF9B3wHUwApBmF1BAAACiAgICBNb3ZlIGF4ZXMgb2YgYW4gYXJyYXkgdG8gbmV3IHBvc2l0aW9ucy4KCiAgICBPdGhlciBheGVzIHJlbWFpbiBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4KCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OjEuMTEuMAoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBucC5uZGFycmF5CiAgICAgICAgVGhlIGFycmF5IHdob3NlIGF4ZXMgc2hvdWxkIGJlIHJlb3JkZXJlZC4KICAgIHNvdXJjZSA6IGludCBvciBzZXF1ZW5jZSBvZiBpbnQKICAgICAgICBPcmlnaW5hbCBwb3NpdGlvbnMgb2YgdGhlIGF4ZXMgdG8gbW92ZS4gVGhlc2UgbXVzdCBiZSB1bmlxdWUuCiAgICBkZXN0aW5hdGlvbiA6IGludCBvciBzZXF1ZW5jZSBvZiBpbnQKICAgICAgICBEZXN0aW5hdGlvbiBwb3NpdGlvbnMgZm9yIGVhY2ggb2YgdGhlIG9yaWdpbmFsIGF4ZXMuIFRoZXNlIG11c3QgYWxzbyBiZQogICAgICAgIHVuaXF1ZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICByZXN1bHQgOiBucC5uZGFycmF5CiAgICAgICAgQXJyYXkgd2l0aCBtb3ZlZCBheGVzLiBUaGlzIGFycmF5IGlzIGEgdmlldyBvZiB0aGUgaW5wdXQgYXJyYXkuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICB0cmFuc3Bvc2U6IFBlcm11dGUgdGhlIGRpbWVuc2lvbnMgb2YgYW4gYXJyYXkuCiAgICBzd2FwYXhlczogSW50ZXJjaGFuZ2UgdHdvIGF4ZXMgb2YgYW4gYXJyYXkuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCgogICAgPj4+IHggPSBucC56ZXJvcygoMywgNCwgNSkpCiAgICA+Pj4gbnAubW92ZWF4aXMoeCwgMCwgLTEpLnNoYXBlCiAgICAoNCwgNSwgMykKICAgID4+PiBucC5tb3ZlYXhpcyh4LCAtMSwgMCkuc2hhcGUKICAgICg1LCAzLCA0KQoKICAgIFRoZXNlIGFsbCBhY2hpZXZlIHRoZSBzYW1lIHJlc3VsdDoKCiAgICA+Pj4gbnAudHJhbnNwb3NlKHgpLnNoYXBlCiAgICAoNSwgNCwgMykKICAgID4+PiBucC5zd2FwYXhlcyh4LCAwLCAtMSkuc2hhcGUKICAgICg1LCA0LCAzKQogICAgPj4+IG5wLm1vdmVheGlzKHgsIFswLCAxXSwgWy0xLCAtMl0pLnNoYXBlCiAgICAoNSwgNCwgMykKICAgID4+PiBucC5tb3ZlYXhpcyh4LCBbMCwgMSwgMl0sIFstMSwgLTIsIC0zXSkuc2hhcGUKICAgICg1LCA0LCAzKQoKICAgINoGc291cmNl2gtkZXN0aW5hdGlvbnpKYHNvdXJjZWAgYW5kIGBkZXN0aW5hdGlvbmAgYXJndW1lbnRzIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHNjAQAAAAAAAAACAAAABAAAABMAAABzGAAAAGcAfABdEH0BfAGIAGsHcgR8AZECcQRTAHKMAAAAcowAAAApAnKcAAAAcvQAAAApAXL6AAAAcowAAAByjQAAAHKeAAAARwYAAHMCAAAABgB6HG1vdmVheGlzLjxsb2NhbHM+LjxsaXN0Y29tcD4pC3LGAAAAcqAAAAByUAAAAHKvAAAAcrAAAABy1QAAAHLBAAAAct8AAADaBnNvcnRlZHLtAAAAcvMAAAApCHKTAAAAcvoAAABy+wAAAHLGAAAAco8AAADaBGRlc3TaA3NyY3LxAAAAcowAAAApAXL6AAAAco0AAAByXAAAAAkGAABzHAAAAAAxAgIKAQ4BCAEMAg4BDgEQAQgDGAIYARACCAFjAgAAAAAAAAACAAAABAAAAEMAAABzDAAAAHQAfAB8AWQBgwNTACkCTnIBAAAAKQFyWwAAACkCcpMAAABypwAAAHKMAAAAcowAAAByjQAAANoPX21vdmVfYXhpc190b18wUQYAAHMCAAAAAAFy/wAAAHLUAAAAYwYAAAAAAAAAFAAAAAUAAABDAAAAc/oCAAB8BWQBawlyGHwFZgFkAhQAXAN9An0DfQR0AHwAgwF9AHQAfAGDAX0BdAF8AnwAagJkA2QEjQN9AnQBfAN8AWoCZAVkBI0DfQN0A3wAfAJ8AGoCgwN9AHQDfAF8A3wBagKDA30BZAZ9BnwAagRkBxkAZAhrB3OEfAFqBGQHGQBkCGsHcox0BXwGgwGCAXQGfABkCRkAfAFkCRkAgwJqBH0HfABqBGQHGQBkAmsCc7x8AWoEZAcZAGQCawJy1nwHZAo3AH0HdAF8BHQHfAeDAWQLZASNA30EdAh8AGoJfAFqCYMCfQh0CnwHfAiDAn0JfABkCRkAfQp8AGQMGQB9C3wAagRkBxkAZAJrApABchZ8AGQNGQB9DHwBZAkZAH0NfAFkDBkAfQ58AWoEZAcZAGQCawKQAXI+fAFkDRkAfQ98CWoCZA5rA5ABcnJ8CWoEZAcZAGQCawKQAXJyfAlkCRkAfRB8CWQMGQB9EXwJZA0ZAH0SfABqBGQHGQBkD2sCkAJyCHwBagRkBxkAZA9rApABcrB0C3wKfA58CWQQjQMBAHwJfAt8DRQAOAB9CXwJUwB8AWoEZAcZAGQCawKQAXPEdAyCAXQLfAt8D3wQZBCNAwEAdAt8CnwPfBFkEI0DAQB0DXwRfBFkEI0CAQB0C3wKfA58EmQQjQMBAHwSfAt8DRQAOAB9Em7mfABqBGQHGQBkAmsCkAJzHHQMggF8AWoEZAcZAGQCawKQAnKYdAt8C3wPfBBkEI0DAQB0DnwMfA4UAIMBfRN8EHwTOAB9EHQLfAx8DXwRZBCNAwEAdAt8CnwPfBNkEI0DAQB8EXwTOAB9EXQLfAp8DnwSZBCNAwEAdAt8C3wNfBNkEI0DAQB8EnwTOAB9Em5WfAFqBGQHGQBkD2sCkAJzrHQMggF0C3wMfA58EGQQjQMBAHQNfBB8EGQQjQIBAHQLfAx8DXwRZBCNAwEAdAt8CnwOfBJkEI0DAQB8EnwLfA0UADgAfRJ0A3wJZAd8BIMDUwApEWEZDAAACiAgICBSZXR1cm4gdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIChhcnJheXMgb2YpIHZlY3RvcnMuCgogICAgVGhlIGNyb3NzIHByb2R1Y3Qgb2YgYGFgIGFuZCBgYmAgaW4gOm1hdGg6YFJeM2AgaXMgYSB2ZWN0b3IgcGVycGVuZGljdWxhcgogICAgdG8gYm90aCBgYWAgYW5kIGBiYC4gIElmIGBhYCBhbmQgYGJgIGFyZSBhcnJheXMgb2YgdmVjdG9ycywgdGhlIHZlY3RvcnMKICAgIGFyZSBkZWZpbmVkIGJ5IHRoZSBsYXN0IGF4aXMgb2YgYGFgIGFuZCBgYmAgYnkgZGVmYXVsdCwgYW5kIHRoZXNlIGF4ZXMKICAgIGNhbiBoYXZlIGRpbWVuc2lvbnMgMiBvciAzLiAgV2hlcmUgdGhlIGRpbWVuc2lvbiBvZiBlaXRoZXIgYGFgIG9yIGBiYCBpcwogICAgMiwgdGhlIHRoaXJkIGNvbXBvbmVudCBvZiB0aGUgaW5wdXQgdmVjdG9yIGlzIGFzc3VtZWQgdG8gYmUgemVybyBhbmQgdGhlCiAgICBjcm9zcyBwcm9kdWN0IGNhbGN1bGF0ZWQgYWNjb3JkaW5nbHkuICBJbiBjYXNlcyB3aGVyZSBib3RoIGlucHV0IHZlY3RvcnMKICAgIGhhdmUgZGltZW5zaW9uIDIsIHRoZSB6LWNvbXBvbmVudCBvZiB0aGUgY3Jvc3MgcHJvZHVjdCBpcyByZXR1cm5lZC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIENvbXBvbmVudHMgb2YgdGhlIGZpcnN0IHZlY3RvcihzKS4KICAgIGIgOiBhcnJheV9saWtlCiAgICAgICAgQ29tcG9uZW50cyBvZiB0aGUgc2Vjb25kIHZlY3RvcihzKS4KICAgIGF4aXNhIDogaW50LCBvcHRpb25hbAogICAgICAgIEF4aXMgb2YgYGFgIHRoYXQgZGVmaW5lcyB0aGUgdmVjdG9yKHMpLiAgQnkgZGVmYXVsdCwgdGhlIGxhc3QgYXhpcy4KICAgIGF4aXNiIDogaW50LCBvcHRpb25hbAogICAgICAgIEF4aXMgb2YgYGJgIHRoYXQgZGVmaW5lcyB0aGUgdmVjdG9yKHMpLiAgQnkgZGVmYXVsdCwgdGhlIGxhc3QgYXhpcy4KICAgIGF4aXNjIDogaW50LCBvcHRpb25hbAogICAgICAgIEF4aXMgb2YgYGNgIGNvbnRhaW5pbmcgdGhlIGNyb3NzIHByb2R1Y3QgdmVjdG9yKHMpLiAgSWdub3JlZCBpZgogICAgICAgIGJvdGggaW5wdXQgdmVjdG9ycyBoYXZlIGRpbWVuc2lvbiAyLCBhcyB0aGUgcmV0dXJuIGlzIHNjYWxhci4KICAgICAgICBCeSBkZWZhdWx0LCB0aGUgbGFzdCBheGlzLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBJZiBkZWZpbmVkLCB0aGUgYXhpcyBvZiBgYWAsIGBiYCBhbmQgYGNgIHRoYXQgZGVmaW5lcyB0aGUgdmVjdG9yKHMpCiAgICAgICAgYW5kIGNyb3NzIHByb2R1Y3QocykuICBPdmVycmlkZXMgYGF4aXNhYCwgYGF4aXNiYCBhbmQgYGF4aXNjYC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBjIDogbmRhcnJheQogICAgICAgIFZlY3RvciBjcm9zcyBwcm9kdWN0KHMpLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgV2hlbiB0aGUgZGltZW5zaW9uIG9mIHRoZSB2ZWN0b3IocykgaW4gYGFgIGFuZC9vciBgYmAgZG9lcyBub3QKICAgICAgICBlcXVhbCAyIG9yIDMuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBpbm5lciA6IElubmVyIHByb2R1Y3QKICAgIG91dGVyIDogT3V0ZXIgcHJvZHVjdC4KICAgIGl4XyA6IENvbnN0cnVjdCBpbmRleCBhcnJheXMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjkuMAoKICAgIFN1cHBvcnRzIGZ1bGwgYnJvYWRjYXN0aW5nIG9mIHRoZSBpbnB1dHMuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBWZWN0b3IgY3Jvc3MtcHJvZHVjdC4KCiAgICA+Pj4geCA9IFsxLCAyLCAzXQogICAgPj4+IHkgPSBbNCwgNSwgNl0KICAgID4+PiBucC5jcm9zcyh4LCB5KQogICAgYXJyYXkoWy0zLCAgNiwgLTNdKQoKICAgIE9uZSB2ZWN0b3Igd2l0aCBkaW1lbnNpb24gMi4KCiAgICA+Pj4geCA9IFsxLCAyXQogICAgPj4+IHkgPSBbNCwgNSwgNl0KICAgID4+PiBucC5jcm9zcyh4LCB5KQogICAgYXJyYXkoWzEyLCAtNiwgLTNdKQoKICAgIEVxdWl2YWxlbnRseToKCiAgICA+Pj4geCA9IFsxLCAyLCAwXQogICAgPj4+IHkgPSBbNCwgNSwgNl0KICAgID4+PiBucC5jcm9zcyh4LCB5KQogICAgYXJyYXkoWzEyLCAtNiwgLTNdKQoKICAgIEJvdGggdmVjdG9ycyB3aXRoIGRpbWVuc2lvbiAyLgoKICAgID4+PiB4ID0gWzEsMl0KICAgID4+PiB5ID0gWzQsNV0KICAgID4+PiBucC5jcm9zcyh4LCB5KQogICAgLTMKCiAgICBNdWx0aXBsZSB2ZWN0b3IgY3Jvc3MtcHJvZHVjdHMuIE5vdGUgdGhhdCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjcm9zcwogICAgcHJvZHVjdCB2ZWN0b3IgaXMgZGVmaW5lZCBieSB0aGUgYHJpZ2h0LWhhbmQgcnVsZWAuCgogICAgPj4+IHggPSBucC5hcnJheShbWzEsMiwzXSwgWzQsNSw2XV0pCiAgICA+Pj4geSA9IG5wLmFycmF5KFtbNCw1LDZdLCBbMSwyLDNdXSkKICAgID4+PiBucC5jcm9zcyh4LCB5KQogICAgYXJyYXkoW1stMywgIDYsIC0zXSwKICAgICAgICAgICBbIDMsIC02LCAgM11dKQoKICAgIFRoZSBvcmllbnRhdGlvbiBvZiBgY2AgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIGBheGlzY2Aga2V5d29yZC4KCiAgICA+Pj4gbnAuY3Jvc3MoeCwgeSwgYXhpc2M9MCkKICAgIGFycmF5KFtbLTMsICAzXSwKICAgICAgICAgICBbIDYsIC02XSwKICAgICAgICAgICBbLTMsICAzXV0pCgogICAgQ2hhbmdlIHRoZSB2ZWN0b3IgZGVmaW5pdGlvbiBvZiBgeGAgYW5kIGB5YCB1c2luZyBgYXhpc2FgIGFuZCBgYXhpc2JgLgoKICAgID4+PiB4ID0gbnAuYXJyYXkoW1sxLDIsM10sIFs0LDUsNl0sIFs3LCA4LCA5XV0pCiAgICA+Pj4geSA9IG5wLmFycmF5KFtbNywgOCwgOV0sIFs0LDUsNl0sIFsxLDIsM11dKQogICAgPj4+IG5wLmNyb3NzKHgsIHkpCiAgICBhcnJheShbWyAtNiwgIDEyLCAgLTZdLAogICAgICAgICAgIFsgIDAsICAgMCwgICAwXSwKICAgICAgICAgICBbICA2LCAtMTIsICAgNl1dKQogICAgPj4+IG5wLmNyb3NzKHgsIHksIGF4aXNhPTAsIGF4aXNiPTApCiAgICBhcnJheShbWy0yNCwgIDQ4LCAtMjRdLAogICAgICAgICAgIFstMzAsICA2MCwgLTMwXSwKICAgICAgICAgICBbLTM2LCAgNzIsIC0zNl1dKQoKICAgIE5yMwAAANoFYXhpc2EpAVoKbXNnX3ByZWZpeNoFYXhpc2J6RGluY29tcGF0aWJsZSBkaW1lbnNpb25zIGZvciBjcm9zcyBwcm9kdWN0CihkaW1lbnNpb24gbXVzdCBiZSAyIG9yIDMpctQAAAApAnLJAAAAcjMAAAApAi5yAQAAACkBcjMAAADaBWF4aXNjKQIucgUAAAApAi5yyQAAAHIBAAAAcskAAAApAXLYAAAAKQ9yUAAAAHIyAAAAcrAAAAByWwAAAHKXAAAAcsEAAAByEgAAAHLVAAAAcioAAAByGQAAAHIaAAAActYAAADaDkFzc2VydGlvbkVycm9y2ghuZWdhdGl2ZXIRAAAAKRRykwAAAHLXAAAAcgABAAByAQEAAHICAQAAcqcAAABy9QAAAHKXAAAAchkAAADaAmNw2gJhMNoCYTHaAmEyWgJiMFoCYjFaAmIyWgNjcDBaA2NwMVoDY3Ay2gN0bXByjAAAAHKMAAAAco0AAAByXQAAAFUGAABzdAAAAABxCAEQAQgBCAIQARADDgEOAQQCHAEIAxQBHAEIAhIBDgEKAwgBCAEQAQgBCAEIARABCAEcAQgBCAEIAhABEAIOAQwBBAIUBA4BDgEMAQ4BDgIUARAEDgEMAQgBDgEOAQgBDgEOAQoCFAQOAQwBDgEOAQwDKQNyXwAAAHJgAAAAcmEAAABjBAAAAAAAAAAJAAAACAAAAEMAAABzBgEAAHQAfACDAXQBawlyGHQAfACDAWoCfQRuBGQBfQR8AGoDZAJrBHMwfABqBGQDawJySHQFfAB8AXwCfANkBHwEZAUXAIMGfQVuEGQGdAZ8AGoEgwFmARYAfQV8AGoHagB0CGsGb2x8AGoDZAJrBH0GfAZyfmQHfAR8BWYCFgBTAHwAagdqCX0HfAdypnwHZAIZAKAKoQBynnwHoAuhAHOmZAh8BxYAfQdkCX0IdAx8AGoHagB0DYMCcvJ8AGoHag5y0GQKdA98AGoHgwEWAH0Hbg5kCHQPfABqB4MBFgB9B2QLZAl0EHwEZAUXAIMBFAAXAH0IZAx8BHwFfAh8B2YEFgBTAGQNUwApDmHnBAAACiAgICBSZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBhcnJheS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhcnIgOiBuZGFycmF5CiAgICAgICAgSW5wdXQgYXJyYXkuCiAgICBtYXhfbGluZV93aWR0aCA6IGludCwgb3B0aW9uYWwKICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyB0aGUgc3RyaW5nIHNob3VsZCBzcGFuLiBOZXdsaW5lCiAgICAgICAgY2hhcmFjdGVycyBzcGxpdCB0aGUgc3RyaW5nIGFwcHJvcHJpYXRlbHkgYWZ0ZXIgYXJyYXkgZWxlbWVudHMuCiAgICBwcmVjaXNpb24gOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgRmxvYXRpbmcgcG9pbnQgcHJlY2lzaW9uLiBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IHByaW50aW5nIHByZWNpc2lvbgogICAgICAgICh1c3VhbGx5IDgpLCB3aGljaCBjYW4gYmUgYWx0ZXJlZCB1c2luZyBgc2V0X3ByaW50b3B0aW9uc2AuCiAgICBzdXBwcmVzc19zbWFsbCA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgUmVwcmVzZW50IHZlcnkgc21hbGwgbnVtYmVycyBhcyB6ZXJvLCBkZWZhdWx0IGlzIEZhbHNlLiBWZXJ5IHNtYWxsCiAgICAgICAgaXMgZGVmaW5lZCBieSBgcHJlY2lzaW9uYCwgaWYgdGhlIHByZWNpc2lvbiBpcyA4IHRoZW4KICAgICAgICBudW1iZXJzIHNtYWxsZXIgdGhhbiA1ZS05IGFyZSByZXByZXNlbnRlZCBhcyB6ZXJvLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIHN0cmluZyA6IHN0cgogICAgICBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGFycmF5LgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgYXJyYXlfc3RyLCBhcnJheTJzdHJpbmcsIHNldF9wcmludG9wdGlvbnMKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5hcnJheV9yZXByKG5wLmFycmF5KFsxLDJdKSkKICAgICdhcnJheShbMSwgMl0pJwogICAgPj4+IG5wLmFycmF5X3JlcHIobnAubWEuYXJyYXkoWzAuXSkpCiAgICAnTWFza2VkQXJyYXkoWyAwLl0pJwogICAgPj4+IG5wLmFycmF5X3JlcHIobnAuYXJyYXkoW10sIG5wLmludDMyKSkKICAgICdhcnJheShbXSwgZHR5cGU9aW50MzIpJwoKICAgID4+PiB4ID0gbnAuYXJyYXkoWzFlLTYsIDRlLTcsIDIsIDNdKQogICAgPj4+IG5wLmFycmF5X3JlcHIoeCwgcHJlY2lzaW9uPTYsIHN1cHByZXNzX3NtYWxsPVRydWUpCiAgICAnYXJyYXkoWyAwLjAwMDAwMSwgIDAuICAgICAgLCAgMi4gICAgICAsICAzLiAgICAgIF0pJwoKICAgIHIRAAAAcgEAAAApAXIBAAAAegIsIPoBKHoMW10sIHNoYXBlPSVzegYlcyglcyl6BCclcyf6ASB6AiVz2gEKehElcyglcywlc2R0eXBlPSVzKU4pEXKuAAAAcicAAAByiAAAAHKxAAAAcpcAAAByXwAAANoEcmVwcnIZAAAA2g1fdHlwZWxlc3NkYXRh2gRuYW1l2gdpc2FscGhh2gdpc2FsbnVt2gppc3N1YmNsYXNzWghmbGV4aWJsZdoFbmFtZXPaA3N0cnLVAAAAKQlyxAAAANoObWF4X2xpbmVfd2lkdGjaCXByZWNpc2lvbtoOc3VwcHJlc3Nfc21hbGzaCmNsYXNzX25hbWXaA2xzdFoJc2tpcGR0eXBl2gh0eXBlbmFtZdoCbGZyjAAAAHKMAAAAco0AAAByYgAAACgHAABzKAAAAAAqDAEMAgQCFAEKAQ4CEAIWAgQBDAIIAhgBCAIEAQ4BCAEQAg4BFAFjBAAAAAAAAAAEAAAACAAAAEMAAABzFAAAAHQAfAB8AXwCfANkAWQCdAGDB1MAKQNhPQQAAAogICAgUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhIGluIGFuIGFycmF5LgoKICAgIFRoZSBkYXRhIGluIHRoZSBhcnJheSBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSBzdHJpbmcuICBUaGlzIGZ1bmN0aW9uIGlzCiAgICBzaW1pbGFyIHRvIGBhcnJheV9yZXByYCwgdGhlIGRpZmZlcmVuY2UgYmVpbmcgdGhhdCBgYXJyYXlfcmVwcmAgYWxzbwogICAgcmV0dXJucyBpbmZvcm1hdGlvbiBvbiB0aGUga2luZCBvZiBhcnJheSBhbmQgaXRzIGRhdGEgdHlwZS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogbmRhcnJheQogICAgICAgIElucHV0IGFycmF5LgogICAgbWF4X2xpbmVfd2lkdGggOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgSW5zZXJ0cyBuZXdsaW5lcyBpZiB0ZXh0IGlzIGxvbmdlciB0aGFuIGBtYXhfbGluZV93aWR0aGAuICBUaGUKICAgICAgICBkZWZhdWx0IGlzLCBpbmRpcmVjdGx5LCA3NS4KICAgIHByZWNpc2lvbiA6IGludCwgb3B0aW9uYWwKICAgICAgICBGbG9hdGluZyBwb2ludCBwcmVjaXNpb24uICBEZWZhdWx0IGlzIHRoZSBjdXJyZW50IHByaW50aW5nIHByZWNpc2lvbgogICAgICAgICh1c3VhbGx5IDgpLCB3aGljaCBjYW4gYmUgYWx0ZXJlZCB1c2luZyBgc2V0X3ByaW50b3B0aW9uc2AuCiAgICBzdXBwcmVzc19zbWFsbCA6IGJvb2wsIG9wdGlvbmFsCiAgICAgICAgUmVwcmVzZW50IG51bWJlcnMgInZlcnkgY2xvc2UiIHRvIHplcm8gYXMgemVybzsgZGVmYXVsdCBpcyBGYWxzZS4KICAgICAgICBWZXJ5IGNsb3NlIGlzIGRlZmluZWQgYnkgcHJlY2lzaW9uOiBpZiB0aGUgcHJlY2lzaW9uIGlzIDgsIGUuZy4sCiAgICAgICAgbnVtYmVycyBzbWFsbGVyIChpbiBhYnNvbHV0ZSB2YWx1ZSkgdGhhbiA1ZS05IGFyZSByZXByZXNlbnRlZCBhcwogICAgICAgIHplcm8uCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBhcnJheTJzdHJpbmcsIGFycmF5X3JlcHIsIHNldF9wcmludG9wdGlvbnMKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5hcnJheV9zdHIobnAuYXJhbmdlKDMpKQogICAgJ1swIDEgMl0nCgogICAgcgsBAAByqAAAACkCcl8AAAByFAEAACkEcpMAAAByFQEAAHIWAQAAchcBAAByjAAAAHKMAAAAco0AAAByYwAAAHEHAABzAgAAAAAiYwIAAAAAAAAAAgAAAAQAAABDAAAAczYAAAB8AGQBawhyJnwBchh0AKABdAJkAqECUwB0AKABdANkA6ECUwBuDHQAoAF8AHwBoQJTAGQBUwApBGEKBgAACiAgICBTZXQgYSBQeXRob24gZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIHByZXR0eSBwcmludGluZyBhcnJheXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZiA6IGZ1bmN0aW9uIG9yIE5vbmUKICAgICAgICBGdW5jdGlvbiB0byBiZSB1c2VkIHRvIHByZXR0eSBwcmludCBhcnJheXMuIFRoZSBmdW5jdGlvbiBzaG91bGQgZXhwZWN0CiAgICAgICAgYSBzaW5nbGUgYXJyYXkgYXJndW1lbnQgYW5kIHJldHVybiBhIHN0cmluZyBvZiB0aGUgcmVwcmVzZW50YXRpb24gb2YKICAgICAgICB0aGUgYXJyYXkuIElmIE5vbmUsIHRoZSBmdW5jdGlvbiBpcyByZXNldCB0byB0aGUgZGVmYXVsdCBOdW1QeSBmdW5jdGlvbgogICAgICAgIHRvIHByaW50IGFycmF5cy4KICAgIHJlcHIgOiBib29sLCBvcHRpb25hbAogICAgICAgIElmIFRydWUgKGRlZmF1bHQpLCB0aGUgZnVuY3Rpb24gZm9yIHByZXR0eSBwcmludGluZyAoYGBfX3JlcHJfX2BgKQogICAgICAgIGlzIHNldCwgaWYgRmFsc2UgdGhlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZGVmYXVsdCBzdHJpbmcKICAgICAgICByZXByZXNlbnRhdGlvbiAoYGBfX3N0cl9fYGApIGlzIHNldC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNldF9wcmludG9wdGlvbnMsIGdldF9wcmludG9wdGlvbnMKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBkZWYgcHByaW50KGFycik6CiAgICAuLi4gICAgIHJldHVybiAnSEEhIC0gV2hhdCBhcmUgeW91IGdvaW5nIHRvIGRvIG5vdz8nCiAgICAuLi4KICAgID4+PiBucC5zZXRfc3RyaW5nX2Z1bmN0aW9uKHBwcmludCkKICAgID4+PiBhID0gbnAuYXJhbmdlKDEwKQogICAgPj4+IGEKICAgIEhBISAtIFdoYXQgYXJlIHlvdSBnb2luZyB0byBkbyBub3c/CiAgICA+Pj4gcHJpbnQoYSkKICAgIFswIDEgMiAzIDQgNSA2IDcgOCA5XQoKICAgIFdlIGNhbiByZXNldCB0aGUgZnVuY3Rpb24gdG8gdGhlIGRlZmF1bHQ6CgogICAgPj4+IG5wLnNldF9zdHJpbmdfZnVuY3Rpb24oTm9uZSkKICAgID4+PiBhCiAgICBhcnJheShbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0pCgogICAgYHJlcHJgIGFmZmVjdHMgZWl0aGVyIHByZXR0eSBwcmludGluZyBvciBub3JtYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgTm90ZSB0aGF0IGBgX19yZXByX19gYCBpcyBzdGlsbCBhZmZlY3RlZCBieSBzZXR0aW5nIGBgX19zdHJfX2BgCiAgICBiZWNhdXNlIHRoZSB3aWR0aCBvZiBlYWNoIGFycmF5IGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIHN0cmluZyBiZWNvbWVzCiAgICBlcXVhbCB0byB0aGUgbGVuZ3RoIG9mIHRoZSByZXN1bHQgb2YgYGBfX3N0cl9fKClgYC4KCiAgICA+Pj4geCA9IG5wLmFyYW5nZSg0KQogICAgPj4+IG5wLnNldF9zdHJpbmdfZnVuY3Rpb24obGFtYmRhIHg6J3JhbmRvbScsIHJlcHI9RmFsc2UpCiAgICA+Pj4geC5fX3N0cl9fKCkKICAgICdyYW5kb20nCiAgICA+Pj4geC5fX3JlcHJfXygpCiAgICAnYXJyYXkoWyAgICAgMCwgICAgICAxLCAgICAgIDIsICAgICAgM10pJwoKICAgIE5yBQAAAHIBAAAAKQRyBgAAAHJkAAAAcmIAAAByYwAAACkCcswAAAByDQEAAHKMAAAAcowAAAByjQAAAHJkAAAAlgcAAHMKAAAAADMIAQQBDAIOAtoGbGl0dGxlYwIAAAAAAAAABwAAAAcAAABDAAAAc3gAAAB0AHwAgwF9AHQBfACDAX0CZAF8AhQAfQN0AnwCZgF8ABcAfAFkAo0CfQR4SHQDfACDAUQAXTxcAn0FfQZ0BHwGfAFkAo0CoAV8A2QDfAWFAhkAfAZmARcAfAN8BWQEFwBkA4UCGQAXAKEBfAR8BTwAcTRXAHwEUwApBWHwBQAACiAgICBSZXR1cm4gYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzIG9mIGEgZ3JpZC4KCiAgICBDb21wdXRlIGFuIGFycmF5IHdoZXJlIHRoZSBzdWJhcnJheXMgY29udGFpbiBpbmRleCB2YWx1ZXMgMCwxLC4uLgogICAgdmFyeWluZyBvbmx5IGFsb25nIHRoZSBjb3JyZXNwb25kaW5nIGF4aXMuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgZGltZW5zaW9ucyA6IHNlcXVlbmNlIG9mIGludHMKICAgICAgICBUaGUgc2hhcGUgb2YgdGhlIGdyaWQuCiAgICBkdHlwZSA6IGR0eXBlLCBvcHRpb25hbAogICAgICAgIERhdGEgdHlwZSBvZiB0aGUgcmVzdWx0LgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGdyaWQgOiBuZGFycmF5CiAgICAgICAgVGhlIGFycmF5IG9mIGdyaWQgaW5kaWNlcywKICAgICAgICBgYGdyaWQuc2hhcGUgPSAobGVuKGRpbWVuc2lvbnMpLCkgKyB0dXBsZShkaW1lbnNpb25zKWBgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbWdyaWQsIG1lc2hncmlkCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgb3V0cHV0IHNoYXBlIGlzIG9idGFpbmVkIGJ5IHByZXBlbmRpbmcgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zCiAgICBpbiBmcm9udCBvZiB0aGUgdHVwbGUgb2YgZGltZW5zaW9ucywgaS5lLiBpZiBgZGltZW5zaW9uc2AgaXMgYSB0dXBsZQogICAgYGAocjAsIC4uLiwgck4tMSlgYCBvZiBsZW5ndGggYGBOYGAsIHRoZSBvdXRwdXQgc2hhcGUgaXMKICAgIGBgKE4scjAsLi4uLHJOLTEpYGAuCgogICAgVGhlIHN1YmFycmF5cyBgYGdyaWRba11gYCBjb250YWlucyB0aGUgTi1EIGFycmF5IG9mIGluZGljZXMgYWxvbmcgdGhlCiAgICBgYGstdGhgYCBheGlzLiBFeHBsaWNpdGx5OjoKCiAgICAgICAgZ3JpZFtrLGkwLGkxLC4uLixpTi0xXSA9IGlrCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gZ3JpZCA9IG5wLmluZGljZXMoKDIsIDMpKQogICAgPj4+IGdyaWQuc2hhcGUKICAgICgyLCAyLCAzKQogICAgPj4+IGdyaWRbMF0gICAgICAgICMgcm93IGluZGljZXMKICAgIGFycmF5KFtbMCwgMCwgMF0sCiAgICAgICAgICAgWzEsIDEsIDFdXSkKICAgID4+PiBncmlkWzFdICAgICAgICAjIGNvbHVtbiBpbmRpY2VzCiAgICBhcnJheShbWzAsIDEsIDJdLAogICAgICAgICAgIFswLCAxLCAyXV0pCgogICAgVGhlIGluZGljZXMgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byBhbiBhcnJheS4KCiAgICA+Pj4geCA9IG5wLmFyYW5nZSgyMCkucmVzaGFwZSg1LCA0KQogICAgPj4+IHJvdywgY29sID0gbnAuaW5kaWNlcygoMiwgMykpCiAgICA+Pj4geFtyb3csIGNvbF0KICAgIGFycmF5KFtbMCwgMSwgMl0sCiAgICAgICAgICAgWzQsIDUsIDZdXSkKCiAgICBOb3RlIHRoYXQgaXQgd291bGQgYmUgbW9yZSBzdHJhaWdodGZvcndhcmQgaW4gdGhlIGFib3ZlIGV4YW1wbGUgdG8KICAgIGV4dHJhY3QgdGhlIHJlcXVpcmVkIGVsZW1lbnRzIGRpcmVjdGx5IHdpdGggYGB4WzoyLCA6M11gYC4KCiAgICApAXIFAAAAKQFyGQAAAE5yBQAAACkGcrMAAABy1QAAAHIaAAAA2gllbnVtZXJhdGVyEAAAAHLhAAAAKQdaCmRpbWVuc2lvbnNyGQAAANoBTnKXAAAAcpQAAADaAWlaA2RpbXKMAAAAcowAAAByjQAAAHJpAAAA2AcAAHMQAAAAADwIAQgBCAESARIBDAEsAmMCAAAAAAAAAAUAAAAEAAAASwAAAHMiAAAAfAKgAGQBdAGhAn0DdAJ8AXwDZAKNAn0EfAB8BHwCjgFTACkDYWEGAAAKICAgIENvbnN0cnVjdCBhbiBhcnJheSBieSBleGVjdXRpbmcgYSBmdW5jdGlvbiBvdmVyIGVhY2ggY29vcmRpbmF0ZS4KCiAgICBUaGUgcmVzdWx0aW5nIGFycmF5IHRoZXJlZm9yZSBoYXMgYSB2YWx1ZSBgYGZuKHgsIHksIHopYGAgYXQKICAgIGNvb3JkaW5hdGUgYGAoeCwgeSwgeilgYC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBmdW5jdGlvbiA6IGNhbGxhYmxlCiAgICAgICAgVGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIE4gcGFyYW1ldGVycywgd2hlcmUgTiBpcyB0aGUgcmFuayBvZgogICAgICAgIGBzaGFwZWAuICBFYWNoIHBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgYXJyYXkKICAgICAgICB2YXJ5aW5nIGFsb25nIGEgc3BlY2lmaWMgYXhpcy4gIEZvciBleGFtcGxlLCBpZiBgc2hhcGVgCiAgICAgICAgd2VyZSBgYCgyLCAyKWBgLCB0aGVuIHRoZSBwYXJhbWV0ZXJzIHdvdWxkIGJlCiAgICAgICAgYGBhcnJheShbWzAsIDBdLCBbMSwgMV1dKWBgIGFuZCBgYGFycmF5KFtbMCwgMV0sIFswLCAxXV0pYGAKICAgIHNoYXBlIDogKE4sKSB0dXBsZSBvZiBpbnRzCiAgICAgICAgU2hhcGUgb2YgdGhlIG91dHB1dCBhcnJheSwgd2hpY2ggYWxzbyBkZXRlcm1pbmVzIHRoZSBzaGFwZSBvZgogICAgICAgIHRoZSBjb29yZGluYXRlIGFycmF5cyBwYXNzZWQgdG8gYGZ1bmN0aW9uYC4KICAgIGR0eXBlIDogZGF0YS10eXBlLCBvcHRpb25hbAogICAgICAgIERhdGEtdHlwZSBvZiB0aGUgY29vcmRpbmF0ZSBhcnJheXMgcGFzc2VkIHRvIGBmdW5jdGlvbmAuCiAgICAgICAgQnkgZGVmYXVsdCwgYGR0eXBlYCBpcyBmbG9hdC4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBmcm9tZnVuY3Rpb24gOiBhbnkKICAgICAgICBUaGUgcmVzdWx0IG9mIHRoZSBjYWxsIHRvIGBmdW5jdGlvbmAgaXMgcGFzc2VkIGJhY2sgZGlyZWN0bHkuCiAgICAgICAgVGhlcmVmb3JlIHRoZSBzaGFwZSBvZiBgZnJvbWZ1bmN0aW9uYCBpcyBjb21wbGV0ZWx5IGRldGVybWluZWQgYnkKICAgICAgICBgZnVuY3Rpb25gLiAgSWYgYGZ1bmN0aW9uYCByZXR1cm5zIGEgc2NhbGFyIHZhbHVlLCB0aGUgc2hhcGUgb2YKICAgICAgICBgZnJvbWZ1bmN0aW9uYCB3b3VsZCBtYXRjaCB0aGUgYHNoYXBlYCBwYXJhbWV0ZXIuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBpbmRpY2VzLCBtZXNoZ3JpZAoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgS2V5d29yZHMgb3RoZXIgdGhhbiBgZHR5cGVgIGFyZSBwYXNzZWQgdG8gYGZ1bmN0aW9uYC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5mcm9tZnVuY3Rpb24obGFtYmRhIGksIGo6IGkgPT0gaiwgKDMsIDMpLCBkdHlwZT1pbnQpCiAgICBhcnJheShbWyBUcnVlLCBGYWxzZSwgRmFsc2VdLAogICAgICAgICAgIFtGYWxzZSwgIFRydWUsIEZhbHNlXSwKICAgICAgICAgICBbRmFsc2UsIEZhbHNlLCAgVHJ1ZV1dLCBkdHlwZT1ib29sKQoKICAgID4+PiBucC5mcm9tZnVuY3Rpb24obGFtYmRhIGksIGo6IGkgKyBqLCAoMywgMyksIGR0eXBlPWludCkKICAgIGFycmF5KFtbMCwg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bXBsZW1lbnQgaWYgYG51bWAgaXMgbmVnYXRpdmUsIHByb3ZpZGVkIHRoYXQgYHdpZHRoYCBpcwogICAgICAgIGF0IGxlYXN0IGEgc3VmZmljaWVudCBudW1iZXIgb2YgYml0cyBmb3IgYG51bWAgdG8gYmUgcmVwcmVzZW50ZWQgaW4gdGhlCiAgICAgICAgZGVzaWduYXRlZCBmb3JtLgoKICAgICAgICBJZiB0aGUgYHdpZHRoYCB2YWx1ZSBpcyBpbnN1ZmZpY2llbnQsIGl0IHdpbGwgYmUgaWdub3JlZCwgYW5kIGBudW1gIHdpbGwKICAgICAgICBiZSByZXR1cm5lZCBpbiBiaW5hcnkgKGBudW1gID4gMCkgb3IgdHdvJ3MgY29tcGxlbWVudCAoYG51bWAgPCAwKSBmb3JtCiAgICAgICAgd2l0aCBpdHMgd2lkdGggZXF1YWwgdG8gdGhlIG1pbmltdW0gbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudAogICAgICAgIHRoZSBudW1iZXIgaW4gdGhlIGRlc2lnbmF0ZWQgZm9ybS4gVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsCiAgICAgICAgbGF0ZXIgcmFpc2UgYW4gZXJyb3IuCgogICAgICAgIC4uIGRlcHJlY2F0ZWQ6OiAxLjEyLjAKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBiaW4gOiBzdHIKICAgICAgICBCaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgYG51bWAgb3IgdHdvJ3MgY29tcGxlbWVudCBvZiBgbnVtYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGJhc2VfcmVwcjogUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbnVtYmVyIGluIHRoZSBnaXZlbiBiYXNlCiAgICAgICAgICAgICAgIHN5c3RlbS4KICAgIGJpbjogUHl0aG9uJ3MgYnVpbHQtaW4gYmluYXJ5IHJlcHJlc2VudGF0aW9uIGdlbmVyYXRvciBvZiBhbiBpbnRlZ2VyLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgYGJpbmFyeV9yZXByYCBpcyBlcXVpdmFs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YiA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheXMgdG8gY29tcGFyZS4KICAgIHJ0b2wgOiBmbG9hdAogICAgICAgIFRoZSByZWxhdGl2ZSB0b2xlcmFuY2UgcGFyYW1ldGVyIChzZWUgTm90ZXMpLgogICAgYXRvbCA6IGZsb2F0CiAgICAgICAgVGhlIGFic29sdXRlIHRvbGVyYW5jZSBwYXJhbWV0ZXIgKHNlZSBOb3RlcykuCiAgICBlcXVhbF9uYW4gOiBib29sCiAgICAgICAgV2hldGhlciB0byBjb21wYXJlIE5hTidzIGFzIGVxdWFsLiAgSWYgVHJ1ZSwgTmFOJ3MgaW4gYGFgIHdpbGwgYmUKICAgICAgICBjb25zaWRlcmVkIGVxdWFsIHRvIE5hTidzIGluIGBiYCBpbiB0aGUgb3V0cHV0IGFycmF5LgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBhbGxjbG9zZSA6IGJvb2wKICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIHR3byBhcnJheXMgYXJlIGVxdWFsIHdpdGhpbiB0aGUgZ2l2ZW4KICAgICAgICB0b2xlcmFuY2U7IEZhbHNlIG90aGVyd2lzZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGlzY2xvc2UsIGFsbCwgYW55CgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBJZiB0aGUgZm9sbG93aW5nIGVxdWF0aW9uIGlzIGVsZW1lbnQtd2lzZSBUcnVlLCB0aGVuIGFsbGNsb3NlIHJldHVybnMKICAgIFRydWUuCgogICAgIGFic29sdXRlKGBhYCAtIGBiYCkgPD0gKGBhdG9sYCArIGBydG9sYCAqIGFic29sdXRlKGBiYCkpCgogICAgVGhlIGFib3ZlIGVxdWF0aW9uIGlzIG5vdCBzeW1tZXRyaWMgaW4gYGFgIGFuZCBgYmAsIHNvIHRoYXQKICAgIGBhbGxjbG9zZShhLCBiKWAgbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gYGFsbGNsb3NlKGIsIGEpYCBpbgogICAgc29tZSByYXJlIGNhc2VzLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmFsbGNsb3NlKFsxZTEwLDFlLTddLCBbMS4wMDAwMWUxMCwxZS04XSkKICAgIEZhbHNlCiAgICA+Pj4gbnAuYWxsY2xvc2UoWzFlMTAsMWUtOF0sIFsxLjAwMDAxZTEwLDFlLTldKQogICAgVHJ1ZQogICAgPj4+IG5wLmFsbGNsb3NlKFsxZTEwLDFlLThdLCBbMS4wMDAxZTEwLDFlLTldKQogICAgRmFsc2UKICAgID4+PiBucC5hbGxjbG9zZShbMS4wLCBucC5uYW5dLCBbMS4wLCBucC5uYW5dKQogICAgRmFsc2UKICAgID4+PiBucC5hbGxjbG9zZShbMS4wLCBucC5uYW5dLCBbMS4wLCBucC5uYW5dLCBlcXVhbF9uYW49VHJ1ZSkKICAgIFRydWUKCiAgICApA9oEcnRvbNoEYXRvbNoJZXF1YWxfbmFuKQPaA2FsbHJrAAAAcqoAAAApBnKTAAAActcAAAByRwEAAHJIAQAAckkBAABylAAAAHKMAAAAcowAAAByjQAAAHJzAAAAXQkAAHMEAAAAAD4WAWMFAAAAAAAAAA4AAAAGAAAAAwAAAHMcAQAAhwCHAWYCZAFkAoQIfQV0AIgAZANkBGQFZAaNBH0GdACIAWQDZARkBWQGjQR9B3QBoAJ8B2QHoQJ9CHQAfAd8CGQDZARkCI0EfQd0A3wGgwF9CXQDfAeDAX0KdAR8CYMBcnh0BHwKgwFyeHwFfAZ8B3wDfAKDBFMAfAl8CkAAfQt0BXwLZARkCY0CfQx8BnQGfAyDARQAfQZ8B3QGfAyDARQAfQd8BXwGfAsZAHwHfAsZAHwDfAKDBHwMfAs8AHwGfAsPABkAfAd8Cw8AGQBrAnwMfAsPADwAfARy+HQHfAaDAXQHfAeDAUAAfQ18DXwNGQB8DHwNPAB0CIgAgwGQAXIUdAiIAYMBkAFyFHQJfAyDAVMAfAxTAGQKUwApC2H2BgAACiAgICBSZXR1cm5zIGEgYm9vbGVhbiBhcnJheSB3aGVyZSB0d28gYXJyYXlzIGFyZSBlbGVtZW50LXdpc2UgZXF1YWwgd2l0aGluIGEKICAgIHRvbGVyYW5jZS4KCiAgICBUaGUgdG9sZXJhbmNlIHZhbHVlcyBhcmUgcG9zaXRpdmUsIHR5cGljYWxseSB2ZXJ5IHNtYWxsIG51bWJlcnMuICBUaGUKICAgIHJlbGF0aXZlIGRpZmZlcmVuY2UgKGBydG9sYCAqIGFicyhgYmApKSBhbmQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UKICAgIGBhdG9sYCBhcmUgYWRkZWQgdG9nZXRoZXIgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlCiAgICBiZXR3ZWVuIGBhYCBhbmQgYGJgLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEsIGIgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXlzIHRvIGNvbXBhcmUuCiAgICBydG9sIDogZmxvYXQKICAgICAgICBUaGUgcmVsYXRpdmUgdG9sZXJhbmNlIHBhcmFtZXRlciAoc2VlIE5vdGVzKS4KICAgIGF0b2wgOiBmbG9hdAogICAgICAgIFRoZSBhYnNvbHV0ZSB0b2xlcmFuY2UgcGFyYW1ldGVyIChzZWUgTm90ZXMpLgogICAgZXF1YWxfbmFuIDogYm9vbAogICAgICAgIFdoZXRoZXIgdG8gY29tcGFyZSBOYU4ncyBhcyBlcXVhbC4gIElmIFRydWUsIE5hTidzIGluIGBhYCB3aWxsIGJlCiAgICAgICAgY29uc2lkZXJlZCBlcXVhbCB0byBOYU4ncyBpbiBgYmAgaW4gdGhlIG91dHB1dCBhcnJheS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICB5IDogYXJyYXlfbGlrZQogICAgICAgIFJldHVybnMgYSBib29sZWFuIGFycmF5IG9mIHdoZXJlIGBhYCBhbmQgYGJgIGFyZSBlcXVhbCB3aXRoaW4gdGhlCiAgICAgICAgZ2l2ZW4gdG9sZXJhbmNlLiBJZiBib3RoIGBhYCBhbmQgYGJgIGFyZSBzY2FsYXJzLCByZXR1cm5zIGEgc2luZ2xlCiAgICAgICAgYm9vbGVhbiB2YWx1ZS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIGFsbGNsb3NlCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjcuMAoK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YWxsIDogeydpZ25vcmUnLCAnd2FybicsICdyYWlzZScsICdjYWxsJywgJ3ByaW50JywgJ2xvZyd9LCBvcHRpb25hbAogICAgICAgIFNldCB0cmVhdG1lbnQgZm9yIGFsbCB0eXBlcyBvZiBmbG9hdGluZy1wb2ludCBlcnJvcnMgYXQgb25jZToKCiAgICAgICAgLSBpZ25vcmU6IFRha2Ugbm8gYWN0aW9uIHdoZW4gdGhlIGV4Y2VwdGlvbiBvY2N1cnMuCiAgICAgICAgLSB3YXJuOiBQcmludCBhIGBSdW50aW1lV2FybmluZ2AgKHZpYSB0aGUgUHl0aG9uIGB3YXJuaW5nc2AgbW9kdWxlKS4KICAgICAgICAtIHJhaXNlOiBSYWlzZSBhIGBGbG9hdGluZ1BvaW50RXJyb3JgLgogICAgICAgIC0gY2FsbDogQ2FsbCBhIGZ1bmN0aW9uIHNwZWNpZmllZCB1c2luZyB0aGUgYHNldGVycmNhbGxgIGZ1bmN0aW9uLgogICAgICAgIC0gcHJpbnQ6IFByaW50IGEgd2FybmluZyBkaXJlY3RseSB0byBgYHN0ZG91dGBgLgogICAgICAgIC0gbG9nOiBSZWNvcmQgZXJyb3IgaW4gYSBMb2cgb2JqZWN0IHNwZWNpZmllZCBieSBgc2V0ZXJyY2FsbGAuCgogICAgICAgIFRoZSBkZWZhdWx0IGlzIG5vdCB0byBjaGFuZ2UgdGhlIGN1cnJlbnQgYmVoYXZpb3IuCiAgICBkaXZpZGUgOiB7J2lnbm9yZScsICd3YXJuJywgJ3JhaXNlJywgJ2NhbGwnLCAncHJpbnQnLCAnbG9nJ30sIG9wdGlvbmFsCiAgICAgICAgVHJlYXRtZW50IGZvciBkaXZpc2lvbiBieSB6ZXJvLgogICAgb3ZlciA6IHsnaWdub3JlJywgJ3dhcm4nLCAncmFpc2UnLCAnY2FsbCcsICdwcmludCcsICdsb2cnfSwgb3B0aW9uYWwKICAgICAgICBUcmVhdG1lbnQgZm9yIGZsb2F0aW5nLXBvaW50IG92ZXJmbG93LgogICAgdW5kZXIgOiB7J2lnbm9yZScsICd3YXJuJywgJ3JhaXNlJywgJ2NhbGwnLCAncHJpbnQnLCAnbG9nJ30sIG9wdGlvbmFsCiAgICAgICAgVHJlYXRtZW50IGZvciBmbG9hdGluZy1wb2ludCB1bmRlcmZsb3cuCiAgICBpbnZhbGlkIDogeydpZ25vcmUnLCAnd2FybicsICdyYWlzZScsICdjYWxsJywgJ3ByaW50JywgJ2xvZyd9LCBvcHRpb25hbAogICAgICAgIFRyZWF0bWVudCBmb3IgaW52YWxpZCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb24uCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb2xkX3NldHRpbmdzIDogZGljdAogICAgICAgIERpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgb2xkIHNldHRpbmdzLgoKICAgIFNlZSBhbHNvCiAgICAtLS0tLS0tLQogICAgc2V0ZXJyY2FsbCA6IFNldCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgJ2NhbGwnIG1vZGUuCiAgICBnZXRlcnIsIGdldGVycmNhbGwsIGVycnN0YXRlCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgSUVFRSA3NTQgc3RhbmRhcmQgWzFdOgoKICAgIC0gRGl2aXNpb24gYnkgemVybzogaW5maW5pdGUgcmVzdWx0IG9idGFpbmVkIGZyb20gZmluaXRlIG51bWJlcnMuCiAgICAtIE92ZXJmbG93OiByZXN1bHQgdG9vIGxhcmdlIHRvIGJlIGV4cHJlc3NlZC4KICAgIC0gVW5kZXJmbG93OiByZXN1bHQgc28gY2xvc2UgdG8gemVybyB0aGF0IHNvbWUgcHJlY2lzaW9uCiAgICAgIHdhcyBsb3N0LgogICAgLSBJbnZhbGlkIG9wZXJhdGlvbjogcmVzdWx0IGlzIG5vdCBhbiBleHByZXNzaWJsZSBudW1iZXIsIHR5cGljYWxseQogICAgICBpbmRpY2F0ZXMgdGhhdCBhIE5hTiB3YXMgcHJvZHVjZWQuCgogICAgLi4gWzFdIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV83NTQKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBvbGRfc2V0dGluZ3MgPSBucC5zZXRlcnIoYWxsPSdpZ25vcmUnKSAgI3NldGVyciB0byBrbm93biB2YWx1ZQogICAgPj4+IG5wLnNldGVycihvdmVyPSdyYWlzZScpCiAgICB7J292ZXInOiAnaWdub3JlJywgJ2RpdmlkZSc6ICdpZ25vcmUnLCAnaW52YWxpZCc6ICdpZ25vcmUnLAogICAgICd1bmRlcic6ICdpZ25vcmUnfQogICAgPj4+IG5wLnNldGVycigqKm9sZF9zZXR0aW5ncykgICMgcmVzZXQgdG8gZGVmYXVsdAogICAgeydvdmVyJzogJ3JhaXNlJywgJ2RpdmlkZSc6ICdpZ25vcmUnLCAnaW52YWxpZCc6ICdpZ25vcmUnLCAndW5kZXInOiAnaWdub3JlJ30KCiAgICA+Pj4gbnAuaW50MTYoMzIwMDApICogbnAuaW50MTYoMykKICAgIDMwNDY0CiAgICA+Pj4gb2xkX3NldHRpbmdzID0gbnAuc2V0ZXJyKGFsbD0nd2FybicsIG92ZXI9J3JhaXNlJykKICAgID4+PiBucC5pbnQxNigzMjAwMCkgKiBucC5pbnQxNigzKQogICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPgogICAgRmxvYXRpbmdQb2ludEVycm9yOiBvdmVyZmxvdyBlbmNvdW50ZXJlZCBpbiBzaG9ydF9zY2FsYXJzCgogICAgPj4+IG9sZF9zZXR0aW5ncyA9IG5wLnNldGVycihhbGw9J3ByaW50JykKICAgID4+PiBucC5nZXRlcnIoKQogICAgeydvdmVyJzogJ3ByaW50JywgJ2RpdmlkZSc6ICdwcmludCcsICdpbnZhbGlkJzogJ3ByaW50JywgJ3VuZGVyJzogJ3ByaW50J30KICAgID4+PiBucC5pbnQxNigzMjAwMCkgKiBucC5pbnQxNigzKQogICAgV2FybmluZzogb3ZlcmZsb3cgZW5jb3VudGVyZWQgaW4gc2hvcnRfc2NhbGFycwogICAgMzA0NjQKCiAgICBO2gZkaXZpZGXaBG92ZXLaBXVuZGVyckwBAAByBQAAACkJcjYAAADaCWdldGVycm9ianJ1AAAA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aXMgdG8gc2V0IHRoZSBlcnJvci1oYW5kbGVyIHRvICdsb2cnLCB1c2luZyBgc2V0ZXJyYC4KICAgIEZsb2F0aW5nLXBvaW50IGVycm9ycyB0aGVuIHRyaWdnZXIgYSBjYWxsIHRvIHRoZSAnd3JpdGUnIG1ldGhvZCBvZgogICAgdGhlIHByb3ZpZGVkIG9iamVjdC4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBmdW5jIDogY2FsbGFibGUgZihlcnIsIGZsYWcpIG9yIG9iamVjdCB3aXRoIHdyaXRlIG1ldGhvZAogICAgICAgIEZ1bmN0aW9uIHRvIGNhbGwgdXBvbiBmbG9hdGluZy1wb2ludCBlcnJvcnMgKCdjYWxsJy1tb2RlKSBvcgogICAgICAgIG9iamVjdCB3aG9zZSAnd3JpdGUnIG1ldGhvZCBpcyB1c2VkIHRvIGxvZyBzdWNoIG1lc3NhZ2UgKCdsb2cnLW1vZGUpLgoKICAgICAgICBUaGUgY2FsbCBmdW5jdGlvbiB0YWtlcyB0d28gYXJndW1lbnRzLiBUaGUgZmlyc3QgaXMgYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUKICAgICAgICB0eXBlIG9mIGVycm9yIChzdWNoIGFzICJkaXZpZGUgYnkgemVybyIsICJvdmVyZmxvdyIsICJ1bmRlcmZsb3ciLCBvciAiaW52YWxpZCB2YWx1ZSIpLAogICAgICAgIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBzdGF0dXMgZmxhZy4gIFRoZSBmbGFnIGlzIGEgYnl0ZSwgd2hvc2UgZm91cgogICAgICAgIGxlYXN0LXNpZ25pZmljYW50IGJpdHMgaW5kaWNhdGUgdGhlIHR5cGUgb2YgZXJyb3IsIG9uZSBvZiAiZGl2aWRlIiwgIm92ZXIiLAogICAgICAgICJ1bmRlciIsICJpbnZhbGlkIjo6CgogICAgICAgICAgWzAgMCAwIDAgZGl2aWRlIG92ZXIgdW5kZXIgaW52YWxpZF0KCiAgICAgICAgSW4gb3RoZXIgd29yZHMsIGBgZmxhZ3MgPSBkaXZpZGUgKyAyKm92ZXIgKyA0KnVuZGVyICsgOCppbnZhbGlkYGAuCgogICAgICAgIElmIGFuIG9iamVjdCBpcyBwcm92aWRlZCwgaXRzIHdyaXRlIG1ldGhvZCBzaG91bGQgdGFrZSBvbmUgYXJndW1lbnQsCiAgICAgICAgYSBzdHJpbmcuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgaCA6IGNhbGxhYmxlLCBsb2cgaW5zdGFuY2Ugb3IgTm9uZQogICAgICAgIFRoZSBvbGQgZXJyb3IgaGFuZGxlci4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNldGVyciwgZ2V0ZXJyLCBnZXRlcnJjYWxsCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICBDYWxsYmFjayB1cG9uIGVycm9yOgoKICAgID4+PiBkZWYgZXJyX2hhbmRsZXIodHlwZSwgZmxhZyk6CiAgICAuLi4gICAgIHByaW50KCJGbG9hdGluZyBwb2ludCBlcnJvciAoJXMpLCB3aXRoIGZsYWcgJXMiICUgKHR5cGUsIGZsYWcpKQogICAgLi4uCgogICAgPj4+IHNhdmVkX2hhbmRsZXIgPSBucC5zZXRlcnJjYWxsKGVycl9oYW5kbGVyKQogICAgPj4+IHNhdmVfZXJyID0gbnAuc2V0ZXJyKGFsbD0nY2FsbCcpCgogICAgPj4+IG5wLmFycmF5KFsxLCAyLCAzXSkgLyAwLjAKICAgIEZsb2F0aW5nIHBvaW50IGVycm9yIChkaXZpZGUgYnkgemVybyksIHdpdGggZmxhZyAxCiAgICBhcnJheShbIEluZiwgIEluZiwgIEluZl0pCgogICAgPj4+IG5wLnNldGVycmNhbGwoc2F2ZWRfaGFuZGxlcikKICAgIDxmdW5jdGlvbiBlcnJfaGFuZGxlciBhdCAweC4uLj4KICAgID4+PiBucC5zZXRlcnIoKipzYXZlX2VycikKICAgIHsnb3Zlcic6ICdjYWxsJywgJ2RpdmlkZSc6ICdjYWxsJywgJ2ludmFsaWQnOiAnY2FsbCcsICd1bmRlcic6ICdjYWxsJ30KCiAgICBMb2cgZXJyb3IgbWVzc2FnZToKCiAgICA+Pj4gY2xhc3MgTG9nKG9iamVjdCk6CiAgICAuLi4gICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOgogICAgLi4uICAgICAgICAgcHJpbnQoIkxPRzogJXMiICUgbXNnKQogICAgLi4uCgogICAgPj4+IGxvZyA9IExvZygpCiAgICA+Pj4gc2F2ZWRfaGFuZGxlciA9IG5wLnNldGVycmNhbGwobG9nKQogICAgPj4+IHNhdmVfZXJyID0gbnAuc2V0ZXJyKGFsbD0nbG9nJykKCiAgICA+Pj4gbnAuYXJyYXkoWzEsIDIsIDNdKSAvIDAuMAogICAgTE9HOiBXYXJuaW5nOiBkaXZpZGUgYnkgemVybyBlbmNvdW50ZXJlZCBpbiBkaXZpZGUKICAgIDxCTEFOS0xJTkU+CiAgICBhcnJheShbIEluZiwgIEluZiwgIEluZl0pCgogICAgPj4+IG5wLnNldGVycmNhbGwoc2F2ZWRfaGFuZGxlcikKICAgIDxfX21haW5fXy5Mb2cgb2JqZWN0IGF0IDB4Li4uPgogICAgPj4+IG5wLnNldGVycigqKnNhdmVfZXJyKQogICAgeydvdmVyJzogJ2xvZycsICdkaXZpZGUnOiAnbG9nJywgJ2ludmFsaWQnOiAnbG9nJywgJ3VuZGVyJzogJ2xvZyd9CgogICAgTtoFd3JpdGV6JU9ubHkgY2FsbGFibGUgY2FuIGJlIHVzZWQgYXMgY2FsbGJhY2tyyQAAACkKcs0AAADaC2NvbGxlY3Rpb25z2ghDYWxsYWJsZdoHaGFzYXR0cnJpAQAAcsEAAAByNgAAAHJaAQAAcnkAAAByYAEAACkD2gRmdW5jcmEBAAByYgEAAHKMAAAAcowAAAByjQAAAHJ4AAAAJwsAAHMQAAAAAFIUARgBCAEIAQYBCAEKAWMAAAAAAAAAAAAAAAACAAAAQwAAAHMMAAAAdACgAaEAZAEZAFMAKQJh7AQAAAogICAgUmV0dXJuIHRoZSBjdXJyZW50IGNhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgb24gZmxvYXRpbmctcG9pbnQgZXJyb3JzLgoKICAgIFdoZW4gdGhlIGVycm9yIGhhbmRsaW5nIGZvciBhIGZsb2F0aW5nLXBvaW50IGVycm9yIChvbmUgb2YgImRpdmlkZSIsCiAgICAib3ZlciIsICJ1bmRlciIsIG9yICJpbnZhbGlkIikgaXMgc2V0IHRvICdjYWxsJyBvciAnbG9nJywgdGhlIGZ1bmN0aW9uCiAgICB0aGF0IGlzIGNhbGxlZCBvciB0aGUgbG9nIGluc3RhbmNlIHRoYXQgaXMgd3JpdHRlbiB0byBpcyByZXR1cm5lZCBieQogICAgYGdldGVycmNhbGxgLiBUaGlzIGZ1bmN0aW9uIG9yIGxvZyBpbnN0YW5jZSBoYXMgYmVlbiBzZXQgd2l0aAogICAgYHNldGVycmNhbGxgLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIGVycm9iaiA6IGNhbGxhYmxlLCBsb2cgaW5zdGFuY2Ugb3IgTm9uZQogICAgICAgIFRoZSBjdXJyZW50IGVycm9yIGhhbmRsZXIuIElmIG5vIGhhbmRsZXIgd2FzIHNldCB0aHJvdWdoIGBzZXRlcnJjYWxsYCwKICAgICAgICBgYE5vbmVgYCBpcyByZXR1cm5lZC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNldGVycmNhbGwsIHNldGVyciwgZ2V0ZXJyCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBGb3IgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgdHlwZXMgb2YgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9ucyBhbmQKICAgIHRyZWF0bWVudCBvcHRpb25zLCBzZWUgYHNldGVycmAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuZ2V0ZXJyY2FsbCgpICAjIHdlIGRpZCBub3QgeWV0IHNldCBhIGhhbmRsZXIsIHJldHVybnMgTm9uZQoKICAgID4+PiBvbGRzZXR0aW5ncyA9IG5wLnNldGVycihhbGw9J2NhbGwnKQogICAgPj4+IGRlZiBlcnJfaGFuZGxlcih0eXBlLCBmbGFnKToKICAgIC4uLiAgICAgcHJpbnQoIkZsb2F0aW5nIHBvaW50IGVycm9yICglcyksIHdpdGggZmxhZyAlcyIgJSAodHlwZSwgZmxhZykpCiAgICA+Pj4gb2xkaGFuZGxlciA9IG5wLnNldGVycmNhbGwoZXJyX2hhbmRsZXIpCiAgICA+Pj4gbnAuYXJyYXkoWzEsIDIsIDNdKSAvIDAuMAogICAgRmxvYXRpbmcgcG9pbnQgZXJyb3IgKGRpdmlkZSBieSB6ZXJvKSwgd2l0aCBmbGFnIDEKICAgIGFycmF5KFsgSW5mLCAgSW5mLCAgSW5mXSkKCiAgICA+Pj4gY3VyX2hhbmRsZXIgPSBucC5nZXRlcnJjYWxsKCkKICAgID4+PiBjdXJfaGFuZGxlciBpcyBlcnJfaGFuZGxlcgogICAgVHJ1ZQoKICAgIHLJAAAAKQJyNgAAAHJaAQAAcowAAAByjAAAAHKMAAAAco0AAAByeQAAAIMLAABzAgAAAAAqYwAAAAAAAAAAAAAAAAEAAABAAAAAcwwAAABlAFoBZABaAmQBUwApAtoMX3Vuc3BlY2lmaWVkTikDcogAAAByiQAAAHKKAAAAcowAAAByjAAAAHKMAAAAco0AAABybgEAALALAABzAgAAAAgBcm4BAABjAAAAAAAAAAAAAAAAAgAAAEAAAABzKAAAAGUAWgFkAFoCZAFaA2QCZAOEAFoEZARkBYQAWgVkBmQHhABaBmQIUwApCXJ6AAAAYbkHAAAKICAgIGVycnN0YXRlKCoqa3dhcmdzKQoKICAgIENvbnRleHQgbWFuYWdlciBmb3IgZmxvYXRpbmctcG9pbnQgZXJyb3IgaGFuZGxpbmcuCgogICAgVXNpbmcgYW4gaW5zdGFuY2Ugb2YgYGVycnN0YXRlYCBhcyBhIGNvbnRleHQgbWFuYWdlciBhbGxvd3Mgc3RhdGVtZW50cyBpbgogICAgdGhhdCBjb250ZXh0IHRvIGV4ZWN1dGUgd2l0aCBhIGtub3duIGVycm9yIGhhbmRsaW5nIGJlaGF2aW9yLiBVcG9uIGVudGVyaW5nCiAgICB0aGUgY29udGV4dCB0aGUgZXJyb3IgaGFuZGxpbmcgaXMgc2V0IHdpdGggYHNldGVycmAgYW5kIGBzZXRlcnJjYWxsYCwgYW5kCiAgICB1cG9uIGV4aXRpbmcgaXQgaXMgcmVzZXQgdG8gd2hhdCBpdCB3YXMgYmVmb3JlLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGt3YXJncyA6IHtkaXZpZGUsIG92ZXIsIHVuZGVyLCBpbnZhbGlkfQogICAgICAgIEtleXdvcmQgYXJndW1lbnRzLiBUaGUgdmFsaWQga2V5d29yZHMgYXJlIHRoZSBwb3NzaWJsZSBmbG9hdGluZy1wb2ludAogICAgICAgIGV4Y2VwdGlvbnMuIEVhY2gga2V5d29yZCBzaG91bGQgaGF2ZSBhIHN0cmluZyB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlCiAgICAgICAgdHJlYXRtZW50IGZvciB0aGUgcGFydGljdWxhciBlcnJvci4gUG9zc2libGUgdmFsdWVzIGFyZQogICAgICAgIHsnaWdub3JlJywgJ3dhcm4nLCAncmFpc2UnLCAnY2FsbCcsICdwcmludCcsICdsb2cnfS4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIHNldGVyciwgZ2V0ZXJyLCBzZXRlcnJjYWxsLCBnZXRlcnJjYWxsCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgYGB3aXRoYGAgc3RhdGVtZW50IHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjUsIGFuZCBjYW4gb25seSBiZSB1c2VkCiAgICB0aGVyZSBieSBpbXBvcnRpbmcgaXQ6IGBgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudGBgLiBJbgogICAgZWFybGllciBQeXRob24gdmVyc2lvbnMgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCBpcyBub3QgYXZhaWxhYmxlLgoKICAgIEZvciBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIG9mIHRoZSB0eXBlcyBvZiBmbG9hdGluZy1wb2ludCBleGNlcHRpb25zIGFuZAogICAgdHJlYXRtZW50IG9wdGlvbnMsIHNlZSBgc2V0ZXJyYC4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50ICAjIHVzZSAnd2l0aCcgaW4gUHl0aG9uIDIuNQogICAgPj4+IG9sZGVyciA9IG5wLnNldGVycihhbGw9J2lnbm9yZScpICAjIFNldCBlcnJvciBoYW5kbGluZyB0byBrbm93biBzdGF0ZS4KCiAgICA+Pj4gbnAuYXJhbmdlKDMpIC8gMC4KICAgIGFycmF5KFsgTmFOLCAgSW5mLCAgSW5mXSkKICAgID4+PiB3aXRoIG5wLmVycnN0YXRlKGRpdmlkZT0n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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).