REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 44.22 KB
Close
/opt/alt/python37/lib64/python3.7/site-packages/numpy/fft/__pycache__/fftpack.cpython-37.pyc
Text
Base64
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CiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LCBjYW4gYmUgY29tcGxleC4KICAgIG4gOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgTGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIG9mIHRoZSBvdXRwdXQuCiAgICAgICAgSWYgYG5gIGlzIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCwgdGhlIGlucHV0IGlzIGNyb3BwZWQuCiAgICAgICAgSWYgaXQgaXMgbGFyZ2VyLCB0aGUgaW5wdXQgaXMgcGFkZGVkIHdpdGggemVyb3MuICBJZiBgbmAgaXMgbm90IGdpdmVuLAogICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGFsb25nIHRoZSBheGlzIHNwZWNpZmllZCBieSBgYXhpc2AgaXMgdXNlZC4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIEZGVC4gIElmIG5vdCBnaXZlbiwgdGhlIGxhc3QgYXhpcyBpcwogICAgICAgIHVzZWQuCiAgICBub3JtIDoge05vbmUsICJvcnRobyJ9LCBvcHRpb25hbAogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTAuMAoKICAgICAgICBOb3JtYWxpemF0aW9uIG1vZGUgKHNlZSBgbnVtcHkuZmZ0YCkuIERlZmF1bHQgaXMgTm9uZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBjb21wbGV4IG5kYXJyYXkKICAgICAgICBUaGUgdHJ1bmNhdGVkIG9yIHplcm8tcGFkZGVkIGlucHV0LCB0cmFuc2Zvcm1lZCBhbG9uZyB0aGUgYXhpcwogICAgICAgIGluZGljYXRlZCBieSBgYXhpc2AsIG9yIHRoZSBsYXN0IG9uZSBpZiBgYXhpc2AgaXMgbm90IHNwZWNpZmllZC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgSW5kZXhFcnJvcgogICAgICAgIGlmIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGUgbGFzdCBheGlzIG9mIGBhYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmZmdCA6IGZvciBkZWZpbml0aW9uIG9mIHRoZSBERlQgYW5kIGNvbnZlbnRpb25zIHVzZWQuCiAgICBpZmZ0IDogVGhlIGludmVyc2Ugb2YgYGZmdGAuCiAgICBmZnQyIDogVGhlIHR3by1kaW1lbnNpb25hbCBGRlQuCiAgICBmZnRuIDogVGhlICpuKi1kaW1lbnNpb25hbCBGRlQuCiAgICByZmZ0biA6IFRoZSAqbiotZGltZW5zaW9uYWwgRkZUIG9mIHJlYWwgaW5wdXQuCiAgICBmZnRmcmVxIDogRnJlcXVlbmN5IGJpbnMgZm9yIGdpdmVuIEZGVCBwYXJhbWV0ZXJzLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgRkZUIChGYXN0IEZvdXJpZXIgVHJhbnNmb3JtKSByZWZlcnMgdG8gYSB3YXkgdGhlIGRpc2NyZXRlIEZvdXJpZXIKICAgIFRyYW5zZm9ybSAoREZUKSBjYW4gYmUgY2FsY3VsYXRlZCBlZmZpY2llbnRseSwgYnkgdXNpbmcgc3ltbWV0cmllcyBpbiB0aGUKICAgIGNhbGN1bGF0ZWQgdGVybXMuICBUaGUgc3ltbWV0cnkgaXMgaGlnaGVzdCB3aGVuIGBuYCBpcyBhIHBvd2VyIG9mIDIsIGFuZAogICAgdGhlIHRyYW5zZm9ybSBpcyB0aGVyZWZvcmUgbW9zdCBlZmZpY2llbnQgZm9yIHRoZXNlIHNpemVzLgoKICAgIFRoZSBERlQgaXMgZGVmaW5lZCwgd2l0aCB0aGUgY29udmVudGlvbnMgdXNlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLCBpbgogICAgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgbnVtcHkuZmZ0YCBtb2R1bGUuCgogICAgUmVmZXJlbmNlcwogICAgLS0tLS0tLS0tLQogICAgLi4gW0NUXSBDb29sZXksIEphbWVzIFcuLCBhbmQgSm9obiBXLiBUdWtleSwgMTk2NSwgIkFuIGFsZ29yaXRobSBmb3IgdGhlCiAgICAgICAgICAgIG1hY2hpbmUgY2FsY3VsYXRpb24gb2YgY29tcGxleCBGb3VyaWVyIHNlcmllcywiICpNYXRoLiBDb21wdXQuKgogICAgICAgICAgICAxOTogMjk3LTMwMS4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBucC5mZnQuZmZ0KG5wLmV4cCgyaiAqIG5wLnBpICogbnAuYXJhbmdlKDgpIC8gOCkpCiAgICBhcnJheShbIC0zLjQ0NTA1MjQwZS0xNiArMS4xNDM4MzMyOWUtMTdqLAogICAgICAgICAgICAgOC4wMDAwMDAwMGUrMDAgLTUuNzEwOTI2NTJlLTE1aiwKICAgICAgICAgICAgIDIuMzM0ODI5MzhlLTE2ICsxLjIyNDYwNjM1ZS0xNmosCiAgICAgICAgICAgICAxLjY0ODYzNzgyZS0xNSArMS43NzYzNTY4NGUtMTVqLAogICAgICAgICAgICAgOS45NTgzOTY5NWUtMTcgKzIuMzM0ODI5MzhlLTE2aiwKICAgICAgICAgICAgIDAuMDAwMDAwMDBlKzAwICsxLjY2ODM3MDMwZS0xNWosCiAgICAgICAgICAgICAxLjE0MzgzMzI5ZS0xNyArMS4yMjQ2MDYzNWUtMTZqLAogICAgICAgICAgICAgLTEuNjQ4NjM3ODJlLTE1ICsxLjc3NjM1Njg0ZS0xNWpdKQoKICAgIEluIHRoaXMgZXhhbXBsZSwgcmVhbCBpbnB1dCBoYXMgYW4gRkZUIHdoaWNoIGlzIEhlcm1pdGlhbiwgaS5lLiwgc3ltbWV0cmljCiAgICBpbiB0aGUgcmVhbCBwYXJ0IGFuZCBhbnRpLXN5bW1ldHJpYyBpbiB0aGUgaW1hZ2luYXJ5IHBhcnQsIGFzIGRlc2NyaWJlZCBpbgogICAgdGhlIGBudW1weS5mZnRgIGRvY3VtZW50YXRpb246CgogICAgPj4+IGltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKICAgID4+PiB0ID0gbnAuYXJhbmdlKDI1NikKICAgID4+PiBzcCA9IG5wLmZmdC5mZnQobnAuc2luKHQpKQogICAgPj4+IGZyZXEgPSBucC5mZnQuZmZ0ZnJlcSh0LnNoYXBlWy0xXSkKICAgID4+PiBwbHQucGxvdChmcmVxLCBzcC5yZWFsLCBmcmVxLCBzcC5pbWFnKQogICAgWzxtYXRwbG90bGliLmxpbmVzLkxpbmUyRCBvYmplY3QgYXQgMHguLi4+LCA8bWF0cGxvdGxpYi5saW5lcy5MaW5lMkQgb2JqZWN0IGF0IDB4Li4uPl0KICAgID4+PiBwbHQuc2hvdygpCgogICAgRikB2gRjb3B5TnIbAAAAKQtyFAAAANoGYXN0eXBl2gdjb21wbGV4chcAAAByMAAAANoHZmZ0cGFja9oFY2ZmdGnaBWNmZnRm2gpfZmZ0X2NhY2hlcjIAAAByGgAAACkFcicAAAByKAAAAHIpAAAAcjEAAADaBm91dHB1dHIuAAAAci4AAAByLwAAAHIFAAAAZgAAAHMOAAAAAFcSAQgBCgEWAQgBEAFjBAAAAAAAAAAGAAAABwAAAEMAAABzVgAAAHQAfABkAXQBZAKNA30AfAFkA2sIciB8AGoCfAIZAH0BdAN8A4MBfQR0BHwAfAF8AnQFagZ0BWoHdAiDBn0FfAVkBHwEck50CXwBgwFuAnwBGwAUAFMAKQVhmgsAAAogICAgQ29tcHV0ZSB0aGUgb25lLWRpbWVuc2lvbmFsIGludmVyc2UgZGlzY3JldGUgRm91cmllciBUcmFuc2Zvcm0uCgogICAgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgaW52ZXJzZSBvZiB0aGUgb25lLWRpbWVuc2lvbmFsICpuKi1wb2ludAogICAgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gY29tcHV0ZWQgYnkgYGZmdGAuICBJbiBvdGhlciB3b3JkcywKICAgIGBgaWZmdChmZnQoYSkpID09IGFgYCB0byB3aXRoaW4gbnVtZXJpY2FsIGFjY3VyYWN5LgogICAgRm9yIGEgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtIGFuZCBkZWZpbml0aW9ucywKICAgIHNlZSBgbnVtcHkuZmZ0YC4KCiAgICBUaGUgaW5wdXQgc2hvdWxkIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGlzIHJldHVybmVkIGJ5IGBmZnRgLAogICAgaS5lLiwKCiAgICAqIGBgYVswXWBgIHNob3VsZCBjb250YWluIHRoZSB6ZXJvIGZyZXF1ZW5jeSB0ZXJtLAogICAgKiBgYGFbMTpuLy8yXWBgIHNob3VsZCBjb250YWluIHRoZSBwb3NpdGl2ZS1mcmVxdWVuY3kgdGVybXMsCiAgICAqIGBgYVtuLy8yICsgMTpdYGAgc2hvdWxkIGNvbnRhaW4gdGhlIG5lZ2F0aXZlLWZyZXF1ZW5jeSB0ZXJtcywgaW4KICAgICAgaW5jcmVhc2luZyBvcmRlciBzdGFydGluZyBmcm9tIHRoZSBtb3N0IG5lZ2F0aXZlIGZyZXF1ZW5jeS4KCiAgICBGb3IgYW4gZXZlbiBudW1iZXIgb2YgaW5wdXQgcG9pbnRzLCBgYEFbbi8vMl1gYCByZXByZXNlbnRzIHRoZSBzdW0gb2YKICAgIHRoZSB2YWx1ZXMgYXQgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBOeXF1aXN0IGZyZXF1ZW5jaWVzLCBhcyB0aGUgdHdvCiAgICBhcmUgYWxpYXNlZCB0b2dldGhlci4gU2VlIGBudW1weS5mZnRgIGZvciBkZXRhaWxzLgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXksIGNhbiBiZSBjb21wbGV4LgogICAgbiA6IGludCwgb3B0aW9uYWwKICAgICAgICBMZW5ndGggb2YgdGhlIHRyYW5zZm9ybWVkIGF4aXMgb2YgdGhlIG91dHB1dC4KICAgICAgICBJZiBgbmAgaXMgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0LCB0aGUgaW5wdXQgaXMgY3JvcHBlZC4KICAgICAgICBJZiBpdCBpcyBsYXJnZXIsIHRoZSBpbnB1dCBpcyBwYWRkZWQgd2l0aCB6ZXJvcy4gIElmIGBuYCBpcyBub3QgZ2l2ZW4sCiAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYWxvbmcgdGhlIGF4aXMgc3BlY2lmaWVkIGJ5IGBheGlzYCBpcyB1c2VkLgogICAgICAgIFNlZSBub3RlcyBhYm91dCBwYWRkaW5nIGlzc3Vlcy4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIGludmVyc2UgREZULiAgSWYgbm90IGdpdmVuLCB0aGUgbGFzdAogICAgICAgIGF4aXMgaXMgdXNlZC4KICAgIG5vcm0gOiB7Tm9uZSwgIm9ydGhvIn0sIG9wdGlvbmFsCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgICAgIE5vcm1hbGl6YXRpb24gbW9kZSAoc2VlIGBudW1weS5mZnRgKS4gRGVmYXVsdCBpcyBOb25lLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGNvbXBsZXggbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGlzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGlzYCwgb3IgdGhlIGxhc3Qgb25lIGlmIGBheGlzYCBpcyBub3Qgc3BlY2lmaWVkLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBJbmRleEVycm9yCiAgICAgICAgSWYgYGF4ZXNgIGlzIGxhcmdlciB0aGFuIHRoZSBsYXN0IGF4aXMgb2YgYGFgLgoKICAgIFNlZSBBbHNvCiAgICAtLS0tLS0tLQogICAgbnVtcHkuZmZ0IDogQW4gaW50cm9kdWN0aW9uLCB3aXRoIGRlZmluaXRpb25zIGFuZCBnZW5lcmFsIGV4cGxhbmF0aW9ucy4KICAgIGZmdCA6IFRoZSBvbmUtZGltZW5zaW9uYWwgKGZvcndhcmQpIEZGVCwgb2Ygd2hpY2ggYGlmZnRgIGlzIHRoZSBpbnZlcnNlCiAgICBpZmZ0MiA6IFRoZSB0d28tZGltZW5zaW9uYWwgaW52ZXJzZSBGRlQuCiAgICBpZmZ0biA6IFRoZSBuLWRpbWVuc2lvbmFsIGludmVyc2UgRkZULgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgSWYgdGhlIGlucHV0IHBhcmFtZXRlciBgbmAgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGlucHV0LCB0aGUgaW5wdXQKICAgIGlzIHBhZGRlZCBieSBhcHBlbmRpbmcgemVyb3MgYXQgdGhlIGVuZC4gIEV2ZW4gdGhvdWdoIHRoaXMgaXMgdGhlIGNvbW1vbgogICAgYXBwcm9hY2gsIGl0IG1pZ2h0IGxlYWQgdG8gc3VycHJpc2luZyByZXN1bHRzLiAgSWYgYSBkaWZmZXJlbnQgcGFkZGluZyBpcwogICAgZGVzaXJlZCwgaXQgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGNhbGxpbmcgYGlmZnRgLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IG5wLmZmdC5pZmZ0KFswLCA0LCAwLCAwXSkKICAgIGFycmF5KFsgMS4rMC5qLCAgMC4rMS5qLCAtMS4rMC5qLCAgMC4tMS5qXSkKCiAgICBDcmVhdGUgYW5kIHBsb3QgYSBiYW5kLWxpbWl0ZWQgc2lnbmFsIHdpdGggcmFuZG9tIHBoYXNlczoKCiAgICA+Pj4gaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAogICAgPj4+IHQgPSBucC5hcmFuZ2UoNDAwKQogICAgPj4+IG4gPSBucC56ZXJvcygoNDAwLCksIGR0eXBlPWNvbXBsZXgpCiAgICA+Pj4gbls0MDo2MF0gPSBucC5leHAoMWoqbnAucmFuZG9tLnVuaWZvcm0oMCwgMipucC5waSwgKDIwLCkpKQogICAgPj4+IHMgPSBucC5mZnQuaWZmdChuKQogICAgPj4+IHBsdC5wbG90KHQsIHMucmVhbCwgJ2ItJywgdCwgcy5pbWFnLCAnci0tJykKICAgIC4uLgogICAgPj4+IHBsdC5sZWdlbmQoKCdyZWFsJywgJ2ltYWdpbmFyeScpKQogICAgLi4uCiAgICA+Pj4gcGx0LnNob3coKQoKICAgIFQpAnIzAAAAciUAAABOchsAAAApCnITAAAAcjUAAAByFwAAAHIyAAAAcjAAAAByNgAAAHI3AAAAWgVjZmZ0YnI5AAAAchoAAAApBnInAAAAcigAAAByKQAAAHIxAAAA2gd1bml0YXJ5cjoAAAByLgAAAHIuAAAAci8AAAByBgAAAMYAAABzDAAAAABVDgEIAQoBCAEWAWMEAAAAAAAAAAUAAAAHAAAAQwAAAHNSAAAAdAB8AGQBdAFkAo0DfQB0AnwAfAF8AnQDagR0A2oFdAaDBn0EdAd8A4MBck58AWQDawhyPnwAagh8AhkAfQF8BGQEdAl8AYMBGwA5AH0EfARTACkFYbALAAAKICAgIENvbXB1dGUgdGhlIG9uZS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybSBmb3IgcmVhbCBpbnB1dC4KCiAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBvbmUtZGltZW5zaW9uYWwgKm4qLXBvaW50IGRpc2NyZXRlIEZvdXJpZXIKICAgIFRyYW5zZm9ybSAoREZUKSBvZiBhIHJlYWwtdmFsdWVkIGFycmF5IGJ5IG1lYW5zIG9mIGFuIGVmZmljaWVudCBhbGdvcml0aG0KICAgIGNhbGxlZCB0aGUgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5CiAgICBuIDogaW50LCBvcHRpb25hbAogICAgICAgIE51bWJlciBvZiBwb2ludHMgYWxvbmcgdHJhbnNmb3JtYXRpb24gYXhpcyBpbiB0aGUgaW5wdXQgdG8gdXNlLgogICAgICAgIElmIGBuYCBpcyBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQsIHRoZSBpbnB1dCBpcyBjcm9wcGVkLgogICAgICAgIElmIGl0IGlzIGxhcmdlciwgdGhlIGlucHV0IGlzIHBhZGRlZCB3aXRoIHplcm9zLiBJZiBgbmAgaXMgbm90IGdpdmVuLAogICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGFsb25nIHRoZSBheGlzIHNwZWNpZmllZCBieSBgYXhpc2AgaXMgdXNlZC4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIEZGVC4gSWYgbm90IGdpdmVuLCB0aGUgbGFzdCBheGlzIGlzCiAgICAgICAgdXNlZC4KICAgIG5vcm0gOiB7Tm9uZSwgIm9ydGhvIn0sIG9wdGlvbmFsCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgICAgIE5vcm1hbGl6YXRpb24gbW9kZSAoc2VlIGBudW1weS5mZnRgKS4gRGVmYXVsdCBpcyBOb25lLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGNvbXBsZXggbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGlzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGlzYCwgb3IgdGhlIGxhc3Qgb25lIGlmIGBheGlzYCBpcyBub3Qgc3BlY2lmaWVkLgogICAgICAgIElmIGBuYCBpcyBldmVuLCB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIGlzIGBgKG4vMikrMWBgLgogICAgICAgIElmIGBuYCBpcyBvZGQsIHRoZSBsZW5ndGggaXMgYGAobisxKS8yYGAuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBgYXhpc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgYXhpcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5mZnQgOiBGb3IgZGVmaW5pdGlvbiBvZiB0aGUgREZUIGFuZCBjb252ZW50aW9ucyB1c2VkLgogICAgaXJmZnQgOiBUaGUgaW52ZXJzZSBvZiBgcmZmdGAuCiAgICBmZnQgOiBUaGUgb25lLWRpbWVuc2lvbmFsIEZGVCBvZiBnZW5lcmFsIChjb21wbGV4KSBpbnB1dC4KICAgIGZmdG4gOiBUaGUgKm4qLWRpbWVuc2lvbmFsIEZGVC4KICAgIHJmZnRuIDogVGhlICpuKi1kaW1lbnNpb25hbCBGRlQgb2YgcmVhbCBpbnB1dC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIFdoZW4gdGhlIERGVCBpcyBjb21wdXRlZCBmb3IgcHVyZWx5IHJlYWwgaW5wdXQsIHRoZSBvdXRwdXQgaXMKICAgIEhlcm1pdGlhbi1zeW1tZXRyaWMsIGkuZS4gdGhlIG5lZ2F0aXZlIGZyZXF1ZW5jeSB0ZXJtcyBhcmUganVzdCB0aGUgY29tcGxleAogICAgY29uanVnYXRlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBwb3NpdGl2ZS1mcmVxdWVuY3kgdGVybXMsIGFuZCB0aGUKICAgIG5lZ2F0aXZlLWZyZXF1ZW5jeSB0ZXJtcyBhcmUgdGhlcmVmb3JlIHJlZHVuZGFudC4gIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QKICAgIGNvbXB1dGUgdGhlIG5lZ2F0aXZlIGZyZXF1ZW5jeSB0ZXJtcywgYW5kIHRoZSBsZW5ndGggb2YgdGhlIHRyYW5zZm9ybWVkCiAgICBheGlzIG9mIHRoZSBvdXRwdXQgaXMgdGhlcmVmb3JlIGBgbi8vMiArIDFgYC4KCiAgICBXaGVuIGBgQSA9IHJmZnQoYSlgYCBhbmQgZnMgaXMgdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeSwgYGBBWzBdYGAgY29udGFpbnMKICAgIHRoZSB6ZXJvLWZyZXF1ZW5jeSB0ZXJtIDAqZnMsIHdoaWNoIGlzIHJlYWwgZHVlIHRvIEhlcm1pdGlhbiBzeW1tZXRyeS4KCiAgICBJZiBgbmAgaXMgZXZlbiwgYGBBWy0xXWBgIGNvbnRhaW5zIHRoZSB0ZXJtIHJlcHJlc2VudGluZyBib3RoIHBvc2l0aXZlCiAgICBhbmQgbmVnYXRpdmUgTnlxdWlzdCBmcmVxdWVuY3kgKCtmcy8yIGFuZCAtZnMvMiksIGFuZCBtdXN0IGFsc28gYmUgcHVyZWx5CiAgICByZWFsLiBJZiBgbmAgaXMgb2RkLCB0aGVyZSBpcyBubyB0ZXJtIGF0IGZzLzI7IGBgQVstMV1gYCBjb250YWlucwogICAgdGhlIGxhcmdlc3QgcG9zaXRpdmUgZnJlcXVlbmN5IChmcy8yKihuLTEpL24pLCBhbmQgaXMgY29tcGxleCBpbiB0aGUKICAgIGdlbmVyYWwgY2FzZS4KCiAgICBJZiB0aGUgaW5wdXQgYGFgIGNvbnRhaW5zIGFuIGltYWdpbmFyeSBwYXJ0LCBpdCBpcyBzaWxlbnRseSBkaXNjYXJkZWQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuZmZ0LmZmdChbMCwgMSwgMCwgMF0pCiAgICBhcnJheShbIDEuKzAuaiwgIDAuLTEuaiwgLTEuKzAuaiwgIDAuKzEual0pCiAgICA+Pj4gbnAuZmZ0LnJmZnQoWzAsIDEsIDAsIDBdKQogICAgYXJyYXkoWyAxLiswLmosICAwLi0xLmosIC0xLiswLmpdKQoKICAgIE5vdGljZSBob3cgdGhlIGZpbmFsIGVsZW1lbnQgb2YgdGhlIGBmZnRgIG91dHB1dCBpcyB0aGUgY29tcGxleCBjb25qdWdhdGUKICAgIG9mIHRoZSBzZWNvbmQgZWxlbWVudCwgZm9yIHJlYWwgaW5wdXQuIEZvciBgcmZmdGAsIHRoaXMgc3ltbWV0cnkgaXMKICAgIGV4cGxvaXRlZCB0byBjb21wdXRlIG9ubHkgdGhlIG5vbi1uZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMuCgogICAgVCkCcjMAAAByJQAAAE5yGwAAACkKchMAAADaBWZsb2F0cjAAAAByNgAAANoFcmZmdGlaBXJmZnRm2g9fcmVhbF9mZnRfY2FjaGVyMgAAAHIXAAAAchoAAAApBXInAAAAcigAAAByKQAAAHIxAAAAcjoAAAByLgAAAHIuAAAAci8AAAByBwAAACMBAABzEAAAAABPDgEQAQYBCAEIAQoBEAFjBAAAAAAAAAAGAAAABwAAAEMAAABzXgAAAHQAfABkAXQBZAKNA30AfAFkA2sIcih8AGoCfAIZAGQEGABkBRQAfQF0A3wDgwF9BHQEfAB8AXwCdAVqBnQFagd0CIMGfQV8BWQEfARyVnQJfAGDAW4CfAEbABQAUwApBmG/DAAACiAgICBDb21wdXRlIHRoZSBpbnZlcnNlIG9mIHRoZSBuLXBvaW50IERGVCBmb3IgcmVhbCBpbnB1dC4KCiAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbnZlcnNlIG9mIHRoZSBvbmUtZGltZW5zaW9uYWwgKm4qLXBvaW50CiAgICBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybSBvZiByZWFsIGlucHV0IGNvbXB1dGVkIGJ5IGByZmZ0YC4KICAgIEluIG90aGVyIHdvcmRzLCBgYGlyZmZ0KHJmZnQoYSksIGxlbihhKSkgPT0gYWBgIHRvIHdpdGhpbiBudW1lcmljYWwKICAgIGFjY3VyYWN5LiAoU2VlIE5vdGVzIGJlbG93IGZvciB3aHkgYGBsZW4oYSlgYCBpcyBuZWNlc3NhcnkgaGVyZS4pCgogICAgVGhlIGlucHV0IGlzIGV4cGVjdGVkIHRvIGJlIGluIHRoZSBmb3JtIHJldHVybmVkIGJ5IGByZmZ0YCwgaS5lLiB0aGUKICAgIHJlYWwgemVyby1mcmVxdWVuY3kgdGVybSBmb2xsb3dlZCBieSB0aGUgY29tcGxleCBwb3NpdGl2ZSBmcmVxdWVuY3kgdGVybXMKICAgIGluIG9yZGVyIG9mIGluY3JlYXNpbmcgZnJlcXVlbmN5LiAgU2luY2UgdGhlIGRpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3JtIG9mCiAgICByZWFsIGlucHV0IGlzIEhlcm1pdGlhbi1zeW1tZXRyaWMsIHRoZSBuZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMgYXJlIHRha2VuCiAgICB0byBiZSB0aGUgY29tcGxleCBjb25qdWdhdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aXZlIGZyZXF1ZW5jeSB0ZXJtcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBpbnB1dCBhcnJheS4KICAgIG4gOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgTGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIG9mIHRoZSBvdXRwdXQuCiAgICAgICAgRm9yIGBuYCBvdXRwdXQgcG9pbnRzLCBgYG4vLzIrMWBgIGlucHV0IHBvaW50cyBhcmUgbmVjZXNzYXJ5LiAgSWYgdGhlCiAgICAgICAgaW5wdXQgaXMgbG9uZ2VyIHRoYW4gdGhpcywgaXQgaXMgY3JvcHBlZC4gIElmIGl0IGlzIHNob3J0ZXIgdGhhbiB0aGlzLAogICAgICAgIGl0IGlzIHBhZGRlZCB3aXRoIHplcm9zLiAgSWYgYG5gIGlzIG5vdCBnaXZlbiwgaXQgaXMgZGV0ZXJtaW5lZCBmcm9tCiAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYWxvbmcgdGhlIGF4aXMgc3BlY2lmaWVkIGJ5IGBheGlzYC4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIGludmVyc2UgRkZULiBJZiBub3QgZ2l2ZW4sIHRoZSBsYXN0CiAgICAgICAgYXhpcyBpcyB1c2VkLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICAgICAgTm9ybWFsaXphdGlvbiBtb2RlIChzZWUgYG51bXB5LmZmdGApLiBEZWZhdWx0IGlzIE5vbmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGlzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGlzYCwgb3IgdGhlIGxhc3Qgb25lIGlmIGBheGlzYCBpcyBub3Qgc3BlY2lmaWVkLgogICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zZm9ybWVkIGF4aXMgaXMgYG5gLCBvciwgaWYgYG5gIGlzIG5vdCBnaXZlbiwKICAgICAgICBgYDIqKG0tMSlgYCB3aGVyZSBgYG1gYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIG9mIHRoZQogICAgICAgIGlucHV0LiBUbyBnZXQgYW4gb2RkIG51bWJlciBvZiBvdXRwdXQgcG9pbnRzLCBgbmAgbXVzdCBiZSBzcGVjaWZpZWQuCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBgYXhpc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgYXhpcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5mZnQgOiBGb3IgZGVmaW5pdGlvbiBvZiB0aGUgREZUIGFuZCBjb252ZW50aW9ucyB1c2VkLgogICAgcmZmdCA6IFRoZSBvbmUtZGltZW5zaW9uYWwgRkZUIG9mIHJlYWwgaW5wdXQsIG9mIHdoaWNoIGBpcmZmdGAgaXMgaW52ZXJzZS4KICAgIGZmdCA6IFRoZSBvbmUtZGltZW5zaW9uYWwgRkZULgogICAgaXJmZnQyIDogVGhlIGludmVyc2Ugb2YgdGhlIHR3by1kaW1lbnNpb25hbCBGRlQgb2YgcmVhbCBpbnB1dC4KICAgIGlyZmZ0biA6IFRoZSBpbnZlcnNlIG9mIHRoZSAqbiotZGltZW5zaW9uYWwgRkZUIG9mIHJlYWwgaW5wdXQuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBSZXR1cm5zIHRoZSByZWFsIHZhbHVlZCBgbmAtcG9pbnQgaW52ZXJzZSBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybQogICAgb2YgYGFgLCB3aGVyZSBgYWAgY29udGFpbnMgdGhlIG5vbi1uZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMgb2YgYQogICAgSGVybWl0aWFuLXN5bW1ldHJpYyBzZXF1ZW5jZS4gYG5gIGlzIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCwgbm90IHRoZQogICAgaW5wdXQuCgogICAgSWYgeW91IHNwZWNpZnkgYW4gYG5gIHN1Y2ggdGhhdCBgYWAgbXVzdCBiZSB6ZXJvLXBhZGRlZCBvciB0cnVuY2F0ZWQsIHRoZQogICAgZXh0cmEvcmVtb3ZlZCB2YWx1ZXMgd2lsbCBiZSBhZGRlZC9yZW1vdmVkIGF0IGhpZ2ggZnJlcXVlbmNpZXMuIE9uZSBjYW4KICAgIHRodXMgcmVzYW1wbGUgYSBzZXJpZXMgdG8gYG1gIHBvaW50cyB2aWEgRm91cmllciBpbnRlcnBvbGF0aW9uIGJ5OgogICAgYGBhX3Jlc2FtcCA9IGlyZmZ0KHJmZnQoYSksIG0pYGAuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gbnAuZmZ0LmlmZnQoWzEsIC0xaiwgLTEsIDFqXSkKICAgIGFycmF5KFsgMC4rMC5qLCAgMS4rMC5qLCAgMC4rMC5qLCAgMC4rMC5qXSkKICAgID4+PiBucC5mZnQuaXJmZnQoWzEsIC0xaiwgLTFdKQogICAgYXJyYXkoWyAwLiwgIDEuLCAgMC4sICAwLl0pCgogICAgTm90aWNlIGhvdyB0aGUgbGFzdCB0ZXJtIGluIHRoZSBpbnB1dCB0byB0aGUgb3JkaW5hcnkgYGlmZnRgIGlzIHRoZQogICAgY29tcGxleCBjb25qdWdhdGUgb2YgdGhlIHNlY29uZCB0ZXJtLCBhbmQgdGhlIG91dHB1dCBoYXMgemVybyBpbWFnaW5hcnkKICAgIHBhcnQgZXZlcnl3aGVyZS4gIFdoZW4gY2FsbGluZyBgaXJmZnRgLCB0aGUgbmVnYXRpdmUgZnJlcXVlbmNpZXMgYXJlIG5vdAogICAgc3BlY2lmaWVkLCBhbmQgdGhlIG91dHB1dCBhcnJheSBpcyBwdXJlbHkgcmVhbC4KCiAgICBUKQJyMwAAAHIlAAAATnIbAAAA6QIAAAApCnITAAAAcjUAAAByFwAAAHIyAAAAcjAAAAByNgAAAHI9AAAAWgVyZmZ0YnI+AAAAchoAAAApBnInAAAAcigAAAByKQAAAHIxAAAAcjsAAAByOgAAAHIuAAAAci4AAAByLwAAAHIIAAAAfAEAAHMOAAAAAFEOAQgBEgEIARABBgFjBAAAAAAAAAAFAAAABQAAAEMAAABzUAAAAHQAfABkAXQBZAKNA30AfAFkA2sIcih8AGoCfAIZAGQEGABkBRQAfQF0A3wDgwF9BHQEdAV8AIMBfAF8AoMDfARySnQGfAGDAW4CfAEUAFMAKQZhPwoAAAogICAgQ29tcHV0ZSB0aGUgRkZUIG9mIGEgc2lnbmFsIHRoYXQgaGFzIEhlcm1pdGlhbiBzeW1tZXRyeSwgaS5lLiwgYSByZWFsCiAgICBzcGVjdHJ1bS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIFRoZSBpbnB1dCBhcnJheS4KICAgIG4gOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgTGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIG9mIHRoZSBvdXRwdXQuIEZvciBgbmAgb3V0cHV0CiAgICAgICAgcG9pbnRzLCBgYG4vLzIgKyAxYGAgaW5wdXQgcG9pbnRzIGFyZSBuZWNlc3NhcnkuICBJZiB0aGUgaW5wdXQgaXMKICAgICAgICBsb25nZXIgdGhhbiB0aGlzLCBpdCBpcyBjcm9wcGVkLiAgSWYgaXQgaXMgc2hvcnRlciB0aGFuIHRoaXMsIGl0IGlzCiAgICAgICAgcGFkZGVkIHdpdGggemVyb3MuICBJZiBgbmAgaXMgbm90IGdpdmVuLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gdGhlCiAgICAgICAgbGVuZ3RoIG9mIHRoZSBpbnB1dCBhbG9uZyB0aGUgYXhpcyBzcGVjaWZpZWQgYnkgYGF4aXNgLgogICAgYXhpcyA6IGludCwgb3B0aW9uYWwKICAgICAgICBBeGlzIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB0aGUgRkZULiBJZiBub3QgZ2l2ZW4sIHRoZSBsYXN0CiAgICAgICAgYXhpcyBpcyB1c2VkLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICBOb3JtYWxpemF0aW9uIG1vZGUgKHNlZSBgbnVtcHkuZmZ0YCkuIERlZmF1bHQgaXMgTm9uZS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGlzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGlzYCwgb3IgdGhlIGxhc3Qgb25lIGlmIGBheGlzYCBpcyBub3Qgc3BlY2lmaWVkLgogICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIHRyYW5zZm9ybWVkIGF4aXMgaXMgYG5gLCBvciwgaWYgYG5gIGlzIG5vdCBnaXZlbiwKICAgICAgICBgYDIqbSAtIDJgYCB3aGVyZSBgYG1gYCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm1lZCBheGlzIG9mCiAgICAgICAgdGhlIGlucHV0LiBUbyBnZXQgYW4gb2RkIG51bWJlciBvZiBvdXRwdXQgcG9pbnRzLCBgbmAgbXVzdCBiZQogICAgICAgIHNwZWNpZmllZCwgZm9yIGluc3RhbmNlIGFzIGBgMiptIC0gMWBgIGluIHRoZSB0eXBpY2FsIGNhc2UsCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBgYXhpc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIGxhc3QgYXhpcyBvZiBgYWAuCgogICAgU2VlIGFsc28KICAgIC0tLS0tLS0tCiAgICByZmZ0IDogQ29tcHV0ZSB0aGUgb25lLWRpbWVuc2lvbmFsIEZGVCBmb3IgcmVhbCBpbnB1dC4KICAgIGloZmZ0IDogVGhlIGludmVyc2Ugb2YgYGhmZnRgLgoKICAgIE5vdGVzCiAgICAtLS0tLQogICAgYGhmZnRgL2BpaGZmdGAgYXJlIGEgcGFpciBhbmFsb2dvdXMgdG8gYHJmZnRgL2BpcmZmdGAsIGJ1dCBmb3IgdGhlCiAgICBvcHBvc2l0ZSBjYXNlOiBoZXJlIHRoZSBzaWduYWwgaGFzIEhlcm1pdGlhbiBzeW1tZXRyeSBpbiB0aGUgdGltZQogICAgZG9tYWluIGFuZCBpcyByZWFsIGluIHRoZSBmcmVxdWVuY3kgZG9tYWluLiBTbyBoZXJlIGl0J3MgYGhmZnRgIGZvcgogICAgd2hpY2ggeW91IG11c3Qgc3VwcGx5IHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdCBpZiBpdCBpcyB0byBiZSBvZGQuCgogICAgKiBldmVuOiBgYGloZmZ0KGhmZnQoYSwgMipsZW4oYSkgLSAyKSA9PSBhYGAsIHdpdGhpbiByb3VuZG9mZiBlcnJvciwKICAgICogb2RkOiBgYGloZmZ0KGhmZnQoYSwgMipsZW4oYSkgLSAxKSA9PSBhYGAsIHdpdGhpbiByb3VuZG9mZiBlcnJvci4KCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBzaWduYWwgPSBucC5hcnJheShbMSwgMiwgMywgNCwgMywgMl0pCiAgICA+Pj4gbnAuZmZ0LmZmdChzaWduYWwpCiAgICBhcnJheShbIDE1LiswLmosICAtNC4rMC5qLCAgIDAuKzAuaiwgIC0xLi0wLmosICAgMC4rMC5qLCAgLTQuKzAual0pCiAgICA+Pj4gbnAuZmZ0LmhmZnQoc2lnbmFsWzo0XSkgIyBJbnB1dCBmaXJzdCBoYWxmIG9mIHNpZ25hbAogICAgYXJyYXkoWyAxNS4sICAtNC4sICAgMC4sICAtMS4sICAgMC4sICAtNC5dKQogICAgPj4+IG5wLmZmdC5oZmZ0KHNpZ25hbCwgNikgICMgSW5wdXQgZW50aXJlIHNpZ25hbCBhbmQgdHJ1bmNhdGUKICAgIGFycmF5KFsgMTUuLCAgLTQuLCAgIDAuLCAgLTEuLCAgIDAuLCAgLTQuXSkKCgogICAgPj4+IHNpZ25hbCA9IG5wLmFycmF5KFtbMSwgMS5qXSwgWy0xLmosIDJdXSkKICAgID4+PiBucC5jb25qKHNpZ25hbC5UKSAtIHNpZ25hbCAgICMgY2hlY2sgSGVybWl0aWFuIHN5bW1ldHJ5CiAgICBhcnJheShbWyAwLi0wLmosICAwLiswLmpdLAogICAgICAgICAgIFsgMC4rMC5qLCAgMC4tMC5qXV0pCiAgICA+Pj4gZnJlcV9zcGVjdHJ1bSA9IG5wLmZmdC5oZmZ0KHNpZ25hbCkKICAgID4+PiBmcmVxX3NwZWN0cnVtCiAgICBhcnJheShbWyAxLiwgIDEuXSwKICAgICAgICAgICBbIDIuLCAtMi5dXSkKCiAgICBUKQJyMwAAAHIlAAAATnIbAAAAcj8AAAApB3ITAAAAcjUAAAByFwAAAHIyAAAAcggAAAByGAAAAHIaAAAAKQVyJwAAAHIoAAAAcikAAAByMQAAAHI7AAAAci4AAAByLgAAAHIvAAAAcgkAAADWAQAAcwoAAAAASw4BCAESAQgBYwQAAAAAAAAABgAAAAUAAABDAAAAc1AAAAB0AHwAZAF0AWQCjQN9AHwBZANrCHIgfABqAnwCGQB9AXQDfAODAX0EdAR0BXwAfAF8AoMDgwF9BXwFZAR8BHJIdAZ8AYMBbgJ8ARsAFABTACkFYe0GAAAKICAgIENvbXB1dGUgdGhlIGludmVyc2UgRkZUIG9mIGEgc2lnbmFsIHRoYXQgaGFzIEhlcm1pdGlhbiBzeW1tZXRyeS4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LgogICAgbiA6IGludCwgb3B0aW9uYWwKICAgICAgICBMZW5ndGggb2YgdGhlIGludmVyc2UgRkZULCB0aGUgbnVtYmVyIG9mIHBvaW50cyBhbG9uZwogICAgICAgIHRyYW5zZm9ybWF0aW9uIGF4aXMgaW4gdGhlIGlucHV0IHRvIHVzZS4gIElmIGBuYCBpcyBzbWFsbGVyIHRoYW4KICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCwgdGhlIGlucHV0IGlzIGNyb3BwZWQuICBJZiBpdCBpcyBsYXJnZXIsCiAgICAgICAgdGhlIGlucHV0IGlzIHBhZGRlZCB3aXRoIHplcm9zLiBJZiBgbmAgaXMgbm90IGdpdmVuLCB0aGUgbGVuZ3RoIG9mCiAgICAgICAgdGhlIGlucHV0IGFsb25nIHRoZSBheGlzIHNwZWNpZmllZCBieSBgYXhpc2AgaXMgdXNlZC4KICAgIGF4aXMgOiBpbnQsIG9wdGlvbmFsCiAgICAgICAgQXhpcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIGludmVyc2UgRkZULiBJZiBub3QgZ2l2ZW4sIHRoZSBsYXN0CiAgICAgICAgYXhpcyBpcyB1c2VkLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICBOb3JtYWxpemF0aW9uIG1vZGUgKHNlZSBgbnVtcHkuZmZ0YCkuIERlZmF1bHQgaXMgTm9uZS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogY29tcGxleCBuZGFycmF5CiAgICAgICAgVGhlIHRydW5jYXRlZCBvciB6ZXJvLXBhZGRlZCBpbnB1dCwgdHJhbnNmb3JtZWQgYWxvbmcgdGhlIGF4aXMKICAgICAgICBpbmRpY2F0ZWQgYnkgYGF4aXNgLCBvciB0aGUgbGFzdCBvbmUgaWYgYGF4aXNgIGlzIG5vdCBzcGVjaWZpZWQuCiAgICAgICAgVGhlIGxlbmd0aCBvZiB0aGUgdHJhbnNmb3JtZWQgYXhpcyBpcyBgYG4vLzIgKyAxYGAuCgogICAgU2VlIGFsc28KICAgIC0tLS0tLS0tCiAgICBoZmZ0LCBpcmZmdAoKICAgIE5v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LS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXksIGNhbiBiZSBjb21wbGV4LgogICAgcyA6IHNlcXVlbmNlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgU2hhcGUgKGxlbmd0aCBvZiBlYWNoIHRyYW5zZm9ybWVkIGF4aXMpIG9mIHRoZSBvdXRwdXQKICAgICAgICAoYGBzWzBdYGAgcmVmZXJzIHRvIGF4aXMgMCwgYGBzWzFdYGAgdG8gYXhpcyAxLCBldGMuKS4KICAgICAgICBUaGlzIGNvcnJlc3BvbmRzIHRvIGBgbmBgIGZvciBgYGZmdCh4LCBuKWBgLgogICAgICAgIEFsb25nIGFueSBheGlzLCBpZiB0aGUgZ2l2ZW4gc2hhcGUgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGlucHV0LAogICAgICAgIHRoZSBpbnB1dCBpcyBjcm9wcGVkLiAgSWYgaXQgaXMgbGFyZ2VyLCB0aGUgaW5wdXQgaXMgcGFkZGVkIHdpdGggemVyb3MuCiAgICAgICAgaWYgYHNgIGlzIG5vdCBnaXZlbiwgdGhlIHNoYXBlIG9mIHRoZSBpbnB1dCBhbG9uZyB0aGUgYXhlcyBzcGVjaWZpZWQKICAgICAgICBieSBgYXhlc2AgaXMgdXNlZC4KICAgIGF4ZXMgOiBzZXF1ZW5jZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIEF4ZXMgb3ZlciB3aGljaCB0byBjb21wdXRlIHRoZSBGRlQuICBJZiBub3QgZ2l2ZW4sIHRoZSBsYXN0IGBgbGVuKHMpYGAKICAgICAgICBheGVzIGFyZSB1c2VkLCBvciBhbGwgYXhlcyBpZiBgc2AgaXMgYWxzbyBub3Qgc3BlY2lmaWVkLgogICAgICAgIFJlcGVhdGVkIGluZGljZXMgaW4gYGF4ZXNgIG1lYW5zIHRoYXQgdGhlIHRyYW5zZm9ybSBvdmVyIHRoYXQgYXhpcyBpcwogICAgICAgIHBlcmZvcm1lZCBtdWx0aXBsZSB0aW1lcy4KICAgIG5vcm0gOiB7Tm9uZSwgIm9ydGhvIn0sIG9wdGlvbmFsCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4xMC4wCgogICAgICAgIE5vcm1hbGl6YXRpb24gbW9kZSAoc2VlIGBudW1weS5mZnRgKS4gRGVmYXVsdCBpcyBOb25lLgoKICAgIFJldHVybnMKICAgIC0tLS0tLS0KICAgIG91dCA6IGNvbXBsZXggbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGVzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGVzYCwgb3IgYnkgYSBjb21iaW5hdGlvbiBvZiBgc2AgYW5kIGBhYCwKICAgICAgICBhcyBleHBsYWluZWQgaW4gdGhlIHBhcmFtZXRlcnMgc2VjdGlvbiBhYm92ZS4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBzYCBhbmQgYGF4ZXNgIGhhdmUgZGlmZmVyZW50IGxlbmd0aC4KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBhbiBlbGVtZW50IG9mIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5mZnQgOiBPdmVyYWxsIHZpZXcgb2YgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm1zLCB3aXRoIGRlZmluaXRpb25zCiAgICAgICAgYW5kIGNvbnZlbnRpb25zIHVzZWQuCiAgICBpZmZ0biA6IFRoZSBpbnZlcnNlIG9mIGBmZnRuYCwgdGhlIGludmVyc2UgKm4qLWRpbWVuc2lvbmFsIEZGVC4KICAgIGZmdCA6IFRoZSBvbmUtZGltZW5zaW9uYWwgRkZULCB3aXRoIGRlZmluaXRpb25zIGFuZCBjb252ZW50aW9ucyB1c2VkLgogICAgcmZmdG4gOiBUaGUgKm4qLWRpbWVuc2lvbmFsIEZGVCBvZiByZWFsIGlucHV0LgogICAgZmZ0MiA6IFRoZSB0d28tZGltZW5zaW9uYWwgRkZULgogICAgZmZ0c2hpZnQgOiBTaGlmdHMgemVyby1mcmVxdWVuY3kgdGVybXMgdG8gY2VudHJlIG9mIGFycmF5CgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgb3V0cHV0LCBhbmFsb2dvdXNseSB0byBgZmZ0YCwgY29udGFpbnMgdGhlIHRlcm0gZm9yIHplcm8gZnJlcXVlbmN5IGluCiAgICB0aGUgbG93LW9yZGVyIGNvcm5lciBvZiBhbGwgYXhlcywgdGhlIHBvc2l0aXZlIGZyZXF1ZW5jeSB0ZXJtcyBpbiB0aGUKICAgIGZpcnN0IGhhbGYgb2YgYWxsIGF4ZXMsIHRoZSB0ZXJtIGZvciB0aGUgTnlxdWlzdCBmcmVxdWVuY3kgaW4gdGhlIG1pZGRsZQogICAgb2YgYWxsIGF4ZXMgYW5kIHRoZSBuZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMgaW4gdGhlIHNlY29uZCBoYWxmIG9mIGFsbAogICAgYXhlcywgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ2x5IG5lZ2F0aXZlIGZyZXF1ZW5jeS4KCiAgICBTZWUgYG51bXB5LmZmdGAgZm9yIGRldGFpbHMsIGRlZmluaXRpb25zIGFuZCBjb252ZW50aW9ucyB1c2VkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5tZ3JpZFs6MywgOjMsIDozXVswXQogICAgPj4+IG5wLmZmdC5mZnRuKGEsIGF4ZXM9KDEsIDIpKQogICAgYXJyYXkoW1tbICAwLiswLmosICAgMC4rMC5qLCAgIDAuKzAual0sCiAgICAgICAgICAgIFsgIDAuKzAuaiwgICAwLiswLmosICAgMC4rMC5qXSwKICAgICAgICAgICAgWyAgMC4rMC5qLCAgIDAuKzAuaiwgICAwLiswLmpdXSwKICAgICAgICAgICBbWyAgOS4rMC5qLCAgIDAuKzAuaiwgICAwLiswLmpdLAogICAgICAgICAgICBbICAwLiswLmosICAgMC4rMC5qLCAgIDAuKzAual0sCiAgICAgICAgICAgIFsgIDAuKzAuaiwgICAwLiswLmosICAgMC4rMC5qXV0sCiAgICAgICAgICAgW1sgMTguKzAuaiwgICAwLiswLmosICAgMC4rMC5qXSwKICAgICAgICAgICAgWyAgMC4rMC5qLCAgIDAuKzAuaiwgICAwLiswLmpdLAogICAgICAgICAgICBbICAwLiswLmosICAgMC4rMC5qLCAgIDAuKzAual1dXSkKICAgID4+PiBucC5mZnQuZmZ0bihhLCAoMiwgMiksIGF4ZXM9KDAsIDEpKQogICAgYXJyYXkoW1tbIDIuKzAuaiwgIDIuKzAuaiwgIDIuKzAual0sCiAgICAgICAgICAgIFsgMC4rMC5qLCAgMC4rMC5qLCAgMC4rMC5qXV0sCiAgICAgICAgICAgW1stMi4rMC5qLCAtMi4rMC5qLCAtMi4rMC5qXSwKICAgICAgICAgICAgWyAwLiswLmosICAwLiswLmosICAwLiswLmpdXV0pCgogICAgPj4+IGltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKICAgID4+PiBbWCwgWV0gPSBucC5tZXNoZ3JpZCgyICogbnAucGkgKiBucC5hcmFuZ2UoMjAwKSAvIDEyLAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgIDIgKiBucC5waSAqIG5wLmFyYW5nZSgyMDApIC8gMzQpCiAgICA+Pj4gUyA9IG5wLnNpbihYKSArIG5wLmNvcyhZKSArIG5wLnJhbmRvbS51bmlmb3JtKDAsIDEsIFguc2hhcGUpCiAgICA+Pj4gRlMgPSBucC5mZnQuZmZ0bihTKQogICAgPj4+IHBsdC5pbXNob3cobnAubG9nKG5wLmFicyhucC5mZnQuZmZ0c2hpZnQoRlMpKSoqMikpCiAgICA8bWF0cGxvdGxpYi5pbWFnZS5BeGVzSW1hZ2Ugb2JqZWN0IGF0IDB4Li4uPgogICAgPj4+IHBsdC5zaG93KCkKCiAgICApAnJHAAAAcgUAAAApBHInAAAAcioAAAByQQAAAHIxAAAAci4AAAByLgAAAHIvAAAAchEAAACCAgAAcwIAAAAAXmMEAAAAAAAAAAQAAAAGAAAAQwAAAHMQAAAAdAB8AHwBfAJ0AXwDgwVTACkBYa4OAAAKICAgIENvbXB1dGUgdGhlIE4tZGltZW5zaW9uYWwgaW52ZXJzZSBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybS4KCiAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbnZlcnNlIG9mIHRoZSBOLWRpbWVuc2lvbmFsIGRpc2NyZXRlCiAgICBGb3VyaWVyIFRyYW5zZm9ybSBvdmVyIGFueSBudW1iZXIgb2YgYXhlcyBpbiBhbiBNLWRpbWVuc2lvbmFsIGFycmF5IGJ5CiAgICBtZWFucyBvZiB0aGUgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKS4gIEluIG90aGVyIHdvcmRzLAogICAgYGBpZmZ0bihmZnRuKGEpKSA9PSBhYGAgdG8gd2l0aGluIG51bWVyaWNhbCBhY2N1cmFjeS4KICAgIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBkZWZpbml0aW9ucyBhbmQgY29udmVudGlvbnMgdXNlZCwgc2VlIGBudW1weS5mZnRgLgoKICAgIFRoZSBpbnB1dCwgYW5hbG9nb3VzbHkgdG8gYGlmZnRgLCBzaG91bGQgYmUgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaXMKICAgIHJldHVybmVkIGJ5IGBmZnRuYCwgaS5lLiBpdCBzaG91bGQgaGF2ZSB0aGUgdGVybSBmb3IgemVybyBmcmVxdWVuY3kKICAgIGluIGFsbCBheGVzIGluIHRoZSBsb3ctb3JkZXIgY29ybmVyLCB0aGUgcG9zaXRpdmUgZnJlcXVlbmN5IHRlcm1zIGluIHRoZQogICAgZmlyc3QgaGFsZiBvZiBhbGwgYXhlcywgdGhlIHRlcm0gZm9yIHRoZSBOeXF1aXN0IGZyZXF1ZW5jeSBpbiB0aGUgbWlkZGxlCiAgICBvZiBhbGwgYXhlcyBhbmQgdGhlIG5lZ2F0aXZlIGZyZXF1ZW5jeSB0ZXJtcyBpbiB0aGUgc2Vjb25kIGhhbGYgb2YgYWxsCiAgICBheGVzLCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nbHkgbmVnYXRpdmUgZnJlcXVlbmN5LgoKICAgIFBhcmFtZXRlcnMKICAgIC0tLS0tLS0tLS0KICAgIGEgOiBhcnJheV9saWtlCiAgICAgICAgSW5wdXQgYXJyYXksIGNhbiBiZSBjb21wbGV4LgogICAgcyA6IHNlcXVlbmNlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgU2hhcGUgKGxlbmd0aCBvZiBlYWNoIHRyYW5zZm9ybWVkIGF4aXMpIG9mIHRoZSBvdXRwdXQKICAgICAgICAoYGBzWzBdYGAgcmVmZXJzIHRvIGF4aXMgMCwgYGBzWzFdYGAgdG8gYXhpcyAxLCBldGMuKS4KICAgICAgICBUaGlzIGNvcnJlc3BvbmRzIHRvIGBgbmBgIGZvciBgYGlmZnQoeCwgbilgYC4KICAgICAgICBBbG9uZyBhbnkgYXhpcywgaWYgdGhlIGdpdmVuIHNoYXBlIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBpbnB1dCwKICAgICAgICB0aGUgaW5wdXQgaXMgY3JvcHBlZC4gIElmIGl0IGlzIGxhcmdlciwgdGhlIGlucHV0IGlzIHBhZGRlZCB3aXRoIHplcm9zLgogICAgICAgIGlmIGBzYCBpcyBub3QgZ2l2ZW4sIHRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgYWxvbmcgdGhlIGF4ZXMgc3BlY2lmaWVkCiAgICAgICAgYnkgYGF4ZXNgIGlzIHVzZWQuICBTZWUgbm90ZXMgZm9yIGlzc3VlIG9uIGBpZmZ0YCB6ZXJvIHBhZGRpbmcuCiAgICBheGVzIDogc2VxdWVuY2Ugb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGVzIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB0aGUgSUZGVC4gIElmIG5vdCBnaXZlbiwgdGhlIGxhc3QgYGBsZW4ocylgYAogICAgICAgIGF4ZXMgYXJlIHVzZWQsIG9yIGFsbCBheGVzIGlmIGBzYCBpcyBhbHNvIG5vdCBzcGVjaWZpZWQuCiAgICAgICAgUmVwZWF0ZWQgaW5kaWNlcyBpbiBgYXhlc2AgbWVhbnMgdGhhdCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gb3ZlciB0aGF0CiAgICAgICAgYXhpcyBpcyBwZXJmb3JtZWQgbXVsdGlwbGUgdGltZXMuCiAgICBub3JtIDoge05vbmUsICJvcnRobyJ9LCBvcHRpb25hbAogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTAuMAoKICAgICAgICBOb3JtYWxpemF0aW9uIG1vZGUgKHNlZSBgbnVtcHkuZmZ0YCkuIERlZmF1bHQgaXMgTm9uZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBjb21wbGV4IG5kYXJyYXkKICAgICAgICBUaGUgdHJ1bmNhdGVkIG9yIHplcm8tcGFkZGVkIGlucHV0LCB0cmFuc2Zvcm1lZCBhbG9uZyB0aGUgYXhlcwogICAgICAgIGluZGljYXRlZCBieSBgYXhlc2AsIG9yIGJ5IGEgY29tYmluYXRpb24gb2YgYHNgIG9yIGBhYCwKICAgICAgICBhcyBleHBsYWluZWQgaW4gdGhlIHBhcmFtZXRlcnMgc2VjdGlvbiBhYm92ZS4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBzYCBhbmQgYGF4ZXNgIGhhdmUgZGlmZmVyZW50IGxlbmd0aC4KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBhbiBlbGVtZW50IG9mIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5mZnQgOiBPdmVyYWxsIHZpZXcgb2YgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm1zLCB3aXRoIGRlZmluaXRpb25zCiAgICAgICAgIGFuZCBjb252ZW50aW9ucyB1c2VkLgogICAgZmZ0biA6IFRoZSBmb3J3YXJkICpuKi1kaW1lbnNpb25hbCBGRlQsIG9mIHdoaWNoIGBpZmZ0bmAgaXMgdGhlIGludmVyc2UuCiAgICBpZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBpbnZlcnNlIEZGVC4KICAgIGlmZnQyIDogVGhlIHR3by1kaW1lbnNpb25hbCBpbnZlcnNlIEZGVC4KICAgIGlmZnRzaGlmdCA6IFVuZG9lcyBgZmZ0c2hpZnRgLCBzaGlmdHMgemVyby1mcmVxdWVuY3kgdGVybXMgdG8gYmVnaW5uaW5nCiAgICAgICAgb2YgYXJyYXkuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBTZWUgYG51bXB5LmZmdGAgZm9yIGRlZmluaXRpb25zIGFuZCBjb252ZW50aW9ucyB1c2VkLgoKICAgIFplcm8tcGFkZGluZywgYW5hbG9nb3VzbHkgd2l0aCBgaWZmdGAsIGlzIHBlcmZvcm1lZCBieSBhcHBlbmRpbmcgemVyb3MgdG8KICAgIHRoZSBpbnB1dCBhbG9uZyB0aGUgc3BlY2lmaWVkIGRpbWVuc2lvbi4gIEFsdGhvdWdoIHRoaXMgaXMgdGhlIGNvbW1vbgogICAgYXBwcm9hY2gsIGl0IG1pZ2h0IGxlYWQgdG8gc3VycHJpc2luZyByZXN1bHRzLiAgSWYgYW5vdGhlciBmb3JtIG9mIHplcm8KICAgIHBhZGRpbmcgaXMgZGVzaXJlZCwgaXQgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIGBpZmZ0bmAgaXMgY2FsbGVkLgoKICAgIEV4YW1wbGVzCiAgICAtLS0tLS0tLQogICAgPj4+IGEgPSBucC5leWUoNCkKICAgID4+PiBucC5mZnQuaWZmdG4obnAuZmZ0LmZmdG4oYSwgYXhlcz0oMCwpKSwgYXhlcz0oMSwpKQogICAgYXJyYXkoW1sgMS4rMC5qLCAgMC4rMC5qLCAgMC4rMC5qLCAgMC4rMC5qXSwKICAgICAgICAgICBbIDAuKzAuaiwgIDEuKzAuaiwgIDAuKzAuaiwgIDAuKzAual0sCiAgICAgICAgICAgWyAwLiswLmosICAwLiswLmosICAxLiswLmosICAwLiswLmpdLAogICAgICAgICAgIFsgMC4rMC5qLCAgMC4rMC5qLCAgMC4rMC5qLCAgMS4rMC5qXV0pCgoKICAgIENyZWF0ZSBhbmQgcGxvdCBhbiBpbWFnZSB3aXRoIGJhbmQtbGltaXRlZCBmcmVxdWVuY3kgY29udGVudDoKCiAgICA+Pj4gaW1wb3J0IG1hdHBsb3RsaWIucHlwbG90IGFzIHBsdAogICAgPj4+IG4gPSBucC56ZXJvcygoMjAwLDIwMCksIGR0eXBlPWNvbXBsZXgpCiAgICA+Pj4gbls2MDo4MCwgMjA6NDBdID0gbnAuZXhwKDFqKm5wLnJhbmRvbS51bmlmb3JtKDAsIDIqbnAucGksICgyMCwgMjApKSkKICAgID4+PiBpbSA9IG5wLmZmdC5pZmZ0bihuKS5yZWFsCiAgICA+Pj4gcGx0Lmltc2hvdyhpbSkKICAgIDxtYXRwbG90bGliLmltYWdlLkF4ZXNJbWFnZSBvYmplY3QgYXQgMHguLi4+CiAgICA+Pj4gcGx0LnNob3coKQoKICAgICkCckcAAAByBgAAACkEcicAAAByKgAAAHJBAAAAcjEAAAByLgAAAHIuAAAAci8AAAByEgAAAOMCAABzAgAAAABeqQLp/v///3IgAAAAYwQAAAAAAAAABAAAAAYAAABDAAAAcxAAAAB0AHwAfAF8AnQBfAODBVMAKQFhpA0AAAogICAgQ29tcHV0ZSB0aGUgMi1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybQoKICAgIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlICpuKi1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybQogICAgb3ZlciBhbnkgYXhlcyBpbiBhbiAqTSotZGltZW5zaW9uYWwgYXJyYXkgYnkgbWVhbnMgb2YgdGhlCiAgICBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIChGRlQpLiAgQnkgZGVmYXVsdCwgdGhlIHRyYW5zZm9ybSBpcyBjb21wdXRlZCBvdmVyCiAgICB0aGUgbGFzdCB0d28gYXhlcyBvZiB0aGUgaW5wdXQgYXJyYXksIGkuZS4sIGEgMi1kaW1lbnNpb25hbCBGRlQuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheSwgY2FuIGJlIGNvbXBsZXgKICAgIHMgOiBzZXF1ZW5jZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIFNoYXBlIChsZW5ndGggb2YgZWFjaCB0cmFuc2Zvcm1lZCBheGlzKSBvZiB0aGUgb3V0cHV0CiAgICAgICAgKGBgc1swXWBgIHJlZmVycyB0byBheGlzIDAsIGBgc1sxXWBgIHRvIGF4aXMgMSwgZXRjLikuCiAgICAgICAgVGhpcyBjb3JyZXNwb25kcyB0byBgYG5gYCBmb3IgYGBmZnQoeCwgbilgYC4KICAgICAgICBBbG9uZyBlYWNoIGF4aXMsIGlmIHRoZSBnaXZlbiBzaGFwZSBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgaW5wdXQsCiAgICAgICAgdGhlIGlucHV0IGlzIGNyb3BwZWQuICBJZiBpdCBpcyBsYXJnZXIsIHRoZSBpbnB1dCBpcyBwYWRkZWQgd2l0aCB6ZXJvcy4KICAgICAgICBpZiBgc2AgaXMgbm90IGdpdmVuLCB0aGUgc2hhcGUgb2YgdGhlIGlucHV0IGFsb25nIHRoZSBheGVzIHNwZWNpZmllZAogICAgICAgIGJ5IGBheGVzYCBpcyB1c2VkLgogICAgYXhlcyA6IHNlcXVlbmNlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgQXhlcyBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdGhlIEZGVC4gIElmIG5vdCBnaXZlbiwgdGhlIGxhc3QgdHdvCiAgICAgICAgYXhlcyBhcmUgdXNlZC4gIEEgcmVwZWF0ZWQgaW5kZXggaW4gYGF4ZXNgIG1lYW5zIHRoZSB0cmFuc2Zvcm0gb3ZlcgogICAgICAgIHRoYXQgYXhpcyBpcyBwZXJmb3JtZWQgbXVsdGlwbGUgdGltZXMuICBBIG9uZS1lbGVtZW50IHNlcXVlbmNlIG1lYW5zCiAgICAgICAgdGhhdCBhIG9uZS1kaW1lbnNpb25hbCBGRlQgaXMgcGVyZm9ybWVkLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICAgICAgTm9ybWFsaXphdGlvbiBtb2RlIChzZWUgYG51bXB5LmZmdGApLiBEZWZhdWx0IGlzIE5vbmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogY29tcGxleCBuZGFycmF5CiAgICAgICAgVGhlIHRydW5jYXRlZCBvciB6ZXJvLXBhZGRlZCBpbnB1dCwgdHJhbnNmb3JtZWQgYWxvbmcgdGhlIGF4ZXMKICAgICAgICBpbmRpY2F0ZWQgYnkgYGF4ZXNgLCBvciB0aGUgbGFzdCB0d28gYXhlcyBpZiBgYXhlc2AgaXMgbm90IGdpdmVuLgoKICAgIFJhaXNlcwogICAgLS0tLS0tCiAgICBWYWx1ZUVycm9yCiAgICAgICAgSWYgYHNgIGFuZCBgYXhlc2AgaGF2ZSBkaWZmZXJlbnQgbGVuZ3RoLCBvciBgYXhlc2Agbm90IGdpdmVuIGFuZAogICAgICAgIGBgbGVuKHMpICE9IDJgYC4KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBhbiBlbGVtZW50IG9mIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBudW1weS5mZnQgOiBPdmVyYWxsIHZpZXcgb2YgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm1zLCB3aXRoIGRlZmluaXRpb25zCiAgICAgICAgIGFuZCBjb252ZW50aW9ucyB1c2VkLgogICAgaWZmdDIgOiBUaGUgaW52ZXJzZSB0d28tZGltZW5zaW9uYWwgRkZULgogICAgZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBGRlQuCiAgICBmZnRuIDogVGhlICpuKi1kaW1lbnNpb25hbCBGRlQuCiAgICBmZnRzaGlmdCA6IFNoaWZ0cyB6ZXJvLWZyZXF1ZW5jeSB0ZXJtcyB0byB0aGUgY2VudGVyIG9mIHRoZSBhcnJheS4KICAgICAgICBGb3IgdHdvLWRpbWVuc2lvbmFsIGlucHV0LCBzd2FwcyBmaXJzdCBhbmQgdGhpcmQgcXVhZHJhbnRzLCBhbmQgc2Vjb25kCiAgICAgICAgYW5kIGZvdXJ0aCBxdWFkcmFudHMuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBgZmZ0MmAgaXMganVzdCBgZmZ0bmAgd2l0aCBhIGRpZmZlcmVudCBkZWZhdWx0IGZvciBgYXhlc2AuCgogICAgVGhlIG91dHB1dCwgYW5hbG9nb3VzbHkgdG8gYGZmdGAsIGNvbnRhaW5zIHRoZSB0ZXJtIGZvciB6ZXJvIGZyZXF1ZW5jeSBpbgogICAgdGhlIGxvdy1vcmRlciBjb3JuZXIgb2YgdGhlIHRyYW5zZm9ybWVkIGF4ZXMsIHRoZSBwb3NpdGl2ZSBmcmVxdWVuY3kgdGVybXMKICAgIGluIHRoZSBmaXJzdCBoYWxmIG9mIHRoZXNlIGF4ZXMsIHRoZSB0ZXJtIGZvciB0aGUgTnlxdWlzdCBmcmVxdWVuY3kgaW4gdGhlCiAgICBtaWRkbGUgb2YgdGhlIGF4ZXMgYW5kIHRoZSBuZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMgaW4gdGhlIHNlY29uZCBoYWxmIG9mCiAgICB0aGUgYXhlcywgaW4gb3JkZXIgb2YgZGVjcmVhc2luZ2x5IG5lZ2F0aXZlIGZyZXF1ZW5jeS4KCiAgICBTZWUgYGZmdG5gIGZvciBkZXRhaWxzIGFuZCBhIHBsb3R0aW5nIGV4YW1wbGUsIGFuZCBgbnVtcHkuZmZ0YCBmb3IKICAgIGRlZmluaXRpb25zIGFuZCBjb252ZW50aW9ucyB1c2VkLgoKCiAgICBFeGFtcGxlcwogICAgLS0tLS0tLS0KICAgID4+PiBhID0gbnAubWdyaWRbOjUsIDo1XVswXQogICAgPj4+IG5wLmZmdC5mZnQyKGEpCiAgICBhcnJheShbWyA1MC4wICswLmogICAgICAgICwgICAwLjAgKzAuaiAgICAgICAgLCAgIDAuMCArMC5qICAgICAgICAsCiAgICAgICAgICAgICAgMC4wICswLmogICAgICAgICwgICAwLjAgKzAuaiAgICAgICAgXSwKICAgICAgICAgICBbLTEyLjUrMTcuMjA0Nzc0MDFqLCAgIDAuMCArMC5qICAgICAgICAsICAgMC4wICswLmogICAgICAgICwKICAgICAgICAgICAgICAwLjAgKzAuaiAgICAgICAgLCAgIDAuMCArMC5qICAgICAgICBdLAogICAgICAgICAgIFstMTIuNSArNC4wNjE0OTYyaiAsICAgMC4wICswLmogICAgICAgICwgICAwLjAgKzAuaiAgICAgICAgLAogICAgICAgICAgICAgIDAuMCArMC5qICAgICAgICAsICAgMC4wICswLmogICAgICAgIF0sCiAgICAgICAgICAgWy0xMi41IC00LjA2MTQ5NjJqICwgICAwLjAgKzAuaiAgICAgICAgLCAgIDAuMCArMC5qICAgICAgICAsCiAgICAgICAgICAgICAgICAwLjAgKzAuaiAgICAgICAgLCAgIDAuMCArMC5qICAgICAgICBdLAogICAgICAgICAgIFstMTIuNS0xNy4yMDQ3NzQwMWosICAgMC4wICswLmogICAgICAgICwgICAwLjAgKzAuaiAgICAgICAgLAogICAgICAgICAgICAgIDAuMCArMC5qICAgICAgICAsICAgMC4wICswLmogICAgICAgIF1dKQoKICAgICkCckcAAAByBQAAACkEcicAAAByKgAAAHJBAAAAcjEAAAByLgAAAHIuAAAAci8AAAByDwAAAEQDAABzAgAAAABXYwQAAAAAAAAABAAAAAYAAABDAAAAcxAAAAB0AHwAfAF8AnQBfAODBVMAKQFhdw0AAAogICAgQ29tcHV0ZSB0aGUgMi1kaW1lbnNpb25hbCBpbnZlcnNlIGRpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3JtLgoKICAgIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGludmVyc2Ugb2YgdGhlIDItZGltZW5zaW9uYWwgZGlzY3JldGUgRm91cmllcgogICAgVHJhbnNmb3JtIG92ZXIgYW55IG51bWJlciBvZiBheGVzIGluIGFuIE0tZGltZW5zaW9uYWwgYXJyYXkgYnkgbWVhbnMgb2YKICAgIHRoZSBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIChGRlQpLiAgSW4gb3RoZXIgd29yZHMsIGBgaWZmdDIoZmZ0MihhKSkgPT0gYWBgCiAgICB0byB3aXRoaW4gbnVtZXJpY2FsIGFjY3VyYWN5LiAgQnkgZGVmYXVsdCwgdGhlIGludmVyc2UgdHJhbnNmb3JtIGlzCiAgICBjb21wdXRlZCBvdmVyIHRoZSBsYXN0IHR3byBheGVzIG9mIHRoZSBpbnB1dCBhcnJheS4KCiAgICBUaGUgaW5wdXQsIGFuYWxvZ291c2x5IHRvIGBpZmZ0YCwgc2hvdWxkIGJlIG9yZGVyZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGlzCiAgICByZXR1cm5lZCBieSBgZmZ0MmAsIGkuZS4gaXQgc2hvdWxkIGhhdmUgdGhlIHRlcm0gZm9yIHplcm8gZnJlcXVlbmN5CiAgICBpbiB0aGUgbG93LW9yZGVyIGNvcm5lciBvZiB0aGUgdHdvIGF4ZXMsIHRoZSBwb3NpdGl2ZSBmcmVxdWVuY3kgdGVybXMgaW4KICAgIHRoZSBmaXJzdCBoYWxmIG9mIHRoZXNlIGF4ZXMsIHRoZSB0ZXJtIGZvciB0aGUgTnlxdWlzdCBmcmVxdWVuY3kgaW4gdGhlCiAgICBtaWRkbGUgb2YgdGhlIGF4ZXMgYW5kIHRoZSBuZWdhdGl2ZSBmcmVxdWVuY3kgdGVybXMgaW4gdGhlIHNlY29uZCBoYWxmIG9mCiAgICBib3RoIGF4ZXMsIGluIG9yZGVyIG9mIGRlY3JlYXNpbmdseSBuZWdhdGl2ZSBmcmVxdWVuY3kuCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheSwgY2FuIGJlIGNvbXBsZXguCiAgICBzIDogc2VxdWVuY2Ugb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBTaGFwZSAobGVuZ3RoIG9mIGVhY2ggYXhpcykgb2YgdGhlIG91dHB1dCAoYGBzWzBdYGAgcmVmZXJzIHRvIGF4aXMgMCwKICAgICAgICBgYHNbMV1gYCB0byBheGlzIDEsIGV0Yy4pLiAgVGhpcyBjb3JyZXNwb25kcyB0byBgbmAgZm9yIGBgaWZmdCh4LCBuKWBgLgogICAgICAgIEFsb25nIGVhY2ggYXhpcywgaWYgdGhlIGdpdmVuIHNoYXBlIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mIHRoZSBpbnB1dCwKICAgICAgICB0aGUgaW5wdXQgaXMgY3JvcHBlZC4gIElmIGl0IGlzIGxhcmdlciwgdGhlIGlucHV0IGlzIHBhZGRlZCB3aXRoIHplcm9zLgogICAgICAgIGlmIGBzYCBpcyBub3QgZ2l2ZW4sIHRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgYWxvbmcgdGhlIGF4ZXMgc3BlY2lmaWVkCiAgICAgICAgYnkgYGF4ZXNgIGlzIHVzZWQuICBTZWUgbm90ZXMgZm9yIGlzc3VlIG9uIGBpZmZ0YCB6ZXJvIHBhZGRpbmcuCiAgICBheGVzIDogc2VxdWVuY2Ugb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGVzIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB0aGUgRkZULiAgSWYgbm90IGdpdmVuLCB0aGUgbGFzdCB0d28KICAgICAgICBheGVzIGFyZSB1c2VkLiAgQSByZXBlYXRlZCBpbmRleCBpbiBgYXhlc2AgbWVhbnMgdGhlIHRyYW5zZm9ybSBvdmVyCiAgICAgICAgdGhhdCBheGlzIGlzIHBlcmZvcm1lZCBtdWx0aXBsZSB0aW1lcy4gIEEgb25lLWVsZW1lbnQgc2VxdWVuY2UgbWVhbnMKICAgICAgICB0aGF0IGEgb25lLWRpbWVuc2lvbmFsIEZGVCBpcyBwZXJmb3JtZWQuCiAgICBub3JtIDoge05vbmUsICJvcnRobyJ9LCBvcHRpb25hbAogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMTAuMAoKICAgICAgICBOb3JtYWxpemF0aW9uIG1vZGUgKHNlZSBgbnVtcHkuZmZ0YCkuIERlZmF1bHQgaXMgTm9uZS4KCiAgICBSZXR1cm5zCiAgICAtLS0tLS0tCiAgICBvdXQgOiBjb21wbGV4IG5kYXJyYXkKICAgICAgICBUaGUgdHJ1bmNhdGVkIG9yIHplcm8tcGFkZGVkIGlucHV0LCB0cmFuc2Zvcm1lZCBhbG9uZyB0aGUgYXhlcwogICAgICAgIGluZGljYXRlZCBieSBgYXhlc2AsIG9yIHRoZSBsYXN0IHR3byBheGVzIGlmIGBheGVzYCBpcyBub3QgZ2l2ZW4uCgogICAgUmFpc2VzCiAgICAtLS0tLS0KICAgIFZhbHVlRXJyb3IKICAgICAgICBJZiBgc2AgYW5kIGBheGVzYCBoYXZlIGRpZmZlcmVudCBsZW5ndGgsIG9yIGBheGVzYCBub3QgZ2l2ZW4gYW5kCiAgICAgICAgYGBsZW4ocykgIT0gMmBgLgogICAgSW5kZXhFcnJvcgogICAgICAgIElmIGFuIGVsZW1lbnQgb2YgYGF4ZXNgIGlzIGxhcmdlciB0aGFuIHRoYW4gdGhlIG51bWJlciBvZiBheGVzIG9mIGBhYC4KCiAgICBTZWUgQWxzbwogICAgLS0tLS0tLS0KICAgIG51bXB5LmZmdCA6IE92ZXJhbGwgdmlldyBvZiBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybXMsIHdpdGggZGVmaW5pdGlvbnMKICAgICAgICAgYW5kIGNvbnZlbnRpb25zIHVzZWQuCiAgICBmZnQyIDogVGhlIGZvcndhcmQgMi1kaW1lbnNpb25hbCBGRlQsIG9mIHdoaWNoIGBpZmZ0MmAgaXMgdGhlIGludmVyc2UuCiAgICBpZmZ0biA6IFRoZSBpbnZlcnNlIG9mIHRoZSAqbiotZGltZW5zaW9uYWwgRkZULgogICAgZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBGRlQuCiAgICBpZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBpbnZlcnNlIEZGVC4KCiAgICBOb3RlcwogICAgLS0tLS0KICAgIGBpZmZ0MmAgaXMganVzdCBgaWZmdG5gIHdpdGggYSBkaWZmZXJlbnQgZGVmYXVsdCBmb3IgYGF4ZXNgLgoKICAgIFNlZSBgaWZmdG5gIGZvciBkZXRhaWxzIGFuZCBhIHBsb3R0aW5nIGV4YW1wbGUsIGFuZCBgbnVtcHkuZmZ0YCBmb3IKICAgIGRlZmluaXRpb24gYW5kIGNvbnZlbnRpb25zIHVzZWQuCgogICAgWmVyby1wYWRkaW5nLCBhbmFsb2dvdXNseSB3aXRoIGBpZmZ0YCwgaXMgcGVyZm9ybWVkIGJ5IGFwcGVuZGluZyB6ZXJvcyB0bwogICAgdGhlIGlucHV0IGFsb25nIHRoZSBzcGVjaWZpZWQgZGltZW5zaW9uLiAgQWx0aG91Z2ggdGhpcyBpcyB0aGUgY29tbW9uCiAgICBhcHByb2FjaCwgaXQgbWlnaHQgbGVhZCB0byBzdXJwcmlzaW5nIHJlc3VsdHMuICBJZiBhbm90aGVyIGZvcm0gb2YgemVybwogICAgcGFkZGluZyBpcyBkZXNpcmVkLCBpdCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgYGlmZnQyYCBpcyBjYWxsZWQuCgogICAgRXhhbXBsZXMKICAgIC0tLS0tLS0tCiAgICA+Pj4gYSA9IDQgKiBucC5leWUoNCkKICAgID4+PiBucC5mZnQuaWZmdDIoYSkKICAgIGFycmF5KFtbIDEuKzAuaiwgIDAuKzAuaiwgIDAuKzAuaiwgIDAuKzAual0sCiAgICAgICAgICAgWyAwLiswLmosICAwLiswLmosICAwLiswLmosICAxLiswLmpdLAogICAgICAgICAgIFsgMC4rMC5qLCAgMC4rMC5qLCAgMS4rMC5qLCAgMC4rMC5qXSwKICAgICAgICAgICBbIDAuKzAuaiwgIDEuKzAuaiwgIDAuKzAuaiwgIDAuKzAual1dKQoKICAgICkCckcAAAByBgAAACkEcicAAAByKgAAAHJBAAAAcjEAAAByLgAAAHIuAAAAci8AAAByEAAAAJ4DAABzAgAAAABUYwQAAAAAAAAABQAAAAYAAABDAAAAc2gAAAB0AHwAZAF0AWQCjQN9AHQCfAB8AXwCgwNcAn0BfQJ0A3wAfAFkAxkAfAJkAxkAfAODBH0AeC50BHQFfAKDAWQEGACDAUQAXRp9BHQGfAB8AXwEGQB8AnwEGQB8A4MEfQBxRlcAfABTACkFYTcMAAAKICAgIENvbXB1dGUgdGhlIE4tZGltZW5zaW9uYWwgZGlzY3JldGUgRm91cmllciBUcmFuc2Zvcm0gZm9yIHJlYWwgaW5wdXQuCgogICAgVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgTi1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIFRyYW5zZm9ybSBvdmVyCiAgICBhbnkgbnVtYmVyIG9mIGF4ZXMgaW4gYW4gTS1kaW1lbnNpb25hbCByZWFsIGFycmF5IGJ5IG1lYW5zIG9mIHRoZSBGYXN0CiAgICBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKS4gIEJ5IGRlZmF1bHQsIGFsbCBheGVzIGFyZSB0cmFuc2Zvcm1lZCwgd2l0aCB0aGUKICAgIHJlYWwgdHJhbnNmb3JtIHBlcmZvcm1lZCBvdmVyIHRoZSBsYXN0IGF4aXMsIHdoaWxlIHRoZSByZW1haW5pbmcKICAgIHRyYW5zZm9ybXMgYXJlIGNvbXBsZXguCgogICAgUGFyYW1ldGVycwogICAgLS0tLS0tLS0tLQogICAgYSA6IGFycmF5X2xpa2UKICAgICAgICBJbnB1dCBhcnJheSwgdGFrZW4gdG8gYmUgcmVhbC4KICAgIHMgOiBzZXF1ZW5jZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIFNoYXBlIChsZW5ndGggYWxvbmcgZWFjaCB0cmFuc2Zvcm1lZCBheGlzKSB0byB1c2UgZnJvbSB0aGUgaW5wdXQuCiAgICAgICAgKGBgc1swXWBgIHJlZmVycyB0byBheGlzIDAsIGBgc1sxXWBgIHRvIGF4aXMgMSwgZXRjLikuCiAgICAgICAgVGhlIGZpbmFsIGVsZW1lbnQgb2YgYHNgIGNvcnJlc3BvbmRzIHRvIGBuYCBmb3IgYGByZmZ0KHgsIG4pYGAsIHdoaWxlCiAgICAgICAgZm9yIHRoZSByZW1haW5pbmcgYXhlcywgaXQgY29ycmVzcG9uZHMgdG8gYG5gIGZvciBgYGZmdCh4LCBuKWBgLgogICAgICAgIEFsb25nIGFueSBheGlzLCBpZiB0aGUgZ2l2ZW4gc2hhcGUgaXMgc21hbGxlciB0aGFuIHRoYXQgb2YgdGhlIGlucHV0LAogICAgICAgIHRoZSBpbnB1dCBpcyBjcm9wcGVkLiAgSWYgaXQgaXMgbGFyZ2VyLCB0aGUgaW5wdXQgaXMgcGFkZGVkIHdpdGggemVyb3MuCiAgICAgICAgaWYgYHNgIGlzIG5vdCBnaXZlbiwgdGhlIHNoYXBlIG9mIHRoZSBpbnB1dCBhbG9uZyB0aGUgYXhlcyBzcGVjaWZpZWQKICAgICAgICBieSBgYXhlc2AgaXMgdXNlZC4KICAgIGF4ZXMgOiBzZXF1ZW5jZSBvZiBpbnRzLCBvcHRpb25hbAogICAgICAgIEF4ZXMgb3ZlciB3aGljaCB0byBjb21wdXRlIHRoZSBGRlQuICBJZiBub3QgZ2l2ZW4sIHRoZSBsYXN0IGBgbGVuKHMpYGAKICAgICAgICBheGVzIGFyZSB1c2VkLCBvciBhbGwgYXhlcyBpZiBgc2AgaXMgYWxzbyBub3Qgc3BlY2lmaWVkLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICAgICAgTm9ybWFsaXphdGlvbiBtb2RlIChzZWUgYG51bXB5LmZmdGApLiBEZWZhdWx0IGlzIE5vbmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogY29tcGxleCBuZGFycmF5CiAgICAgICAgVGhlIHRydW5jYXRlZCBvciB6ZXJvLXBhZGRlZCBpbnB1dCwgdHJhbnNmb3JtZWQgYWxvbmcgdGhlIGF4ZXMKICAgICAgICBpbmRpY2F0ZWQgYnkgYGF4ZXNgLCBvciBieSBhIGNvbWJpbmF0aW9uIG9mIGBzYCBhbmQgYGFgLAogICAgICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgcGFyYW1ldGVycyBzZWN0aW9uIGFib3ZlLgogICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGxhc3QgYXhpcyB0cmFuc2Zvcm1lZCB3aWxsIGJlIGBgc1stMV0vLzIrMWBgLAogICAgICAgIHdoaWxlIHRoZSByZW1haW5pbmcgdHJhbnNmb3JtZWQgYXhlcyB3aWxsIGhhdmUgbGVuZ3RocyBhY2NvcmRpbmcgdG8KICAgICAgICBgc2AsIG9yIHVuY2hhbmdlZCBmcm9tIHRoZSBpbnB1dC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBzYCBhbmQgYGF4ZXNgIGhhdmUgZGlmZmVyZW50IGxlbmd0aC4KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBhbiBlbGVtZW50IG9mIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICBpcmZmdG4gOiBUaGUgaW52ZXJzZSBvZiBgcmZmdG5gLCBpLmUuIHRoZSBpbnZlcnNlIG9mIHRoZSBuLWRpbWVuc2lvbmFsIEZGVAogICAgICAgICBvZiByZWFsIGlucHV0LgogICAgZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBGRlQsIHdpdGggZGVmaW5pdGlvbnMgYW5kIGNvbnZlbnRpb25zIHVzZWQuCiAgICByZmZ0IDogVGhlIG9uZS1kaW1lbnNpb25hbCBGRlQgb2YgcmVhbCBpbnB1dC4KICAgIGZmdG4gOiBUaGUgbi1kaW1lbnNpb25hbCBGRlQuCiAgICByZmZ0MiA6IFRoZSB0d28tZGltZW5zaW9uYWwgRkZUIG9mIHJlYWwgaW5wdXQuCgogICAgTm90ZXMKICAgIC0tLS0tCiAgICBUaGUgdHJhbnNmb3JtIGZvciByZWFsIGlucHV0IGlzIHBlcmZvcm1lZCBvdmVyIHRoZSBsYXN0IHRyYW5zZm9ybWF0aW9uCiAgICBheGlzLCBhcyBieSBgcmZmdGAsIHRoZW4gdGhlIHRyYW5zZm9ybSBv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bnNpb25hbCBGRlQgb2YgcmVhbCBpbnB1dC4KCiAgICBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbnZlcnNlIG9mIHRoZSBOLWRpbWVuc2lvbmFsIGRpc2NyZXRlCiAgICBGb3VyaWVyIFRyYW5zZm9ybSBmb3IgcmVhbCBpbnB1dCBvdmVyIGFueSBudW1iZXIgb2YgYXhlcyBpbiBhbgogICAgTS1kaW1lbnNpb25hbCBhcnJheSBieSBtZWFucyBvZiB0aGUgRmFzdCBGb3VyaWVyIFRyYW5zZm9ybSAoRkZUKS4gIEluCiAgICBvdGhlciB3b3JkcywgYGBpcmZmdG4ocmZmdG4oYSksIGEuc2hhcGUpID09IGFgYCB0byB3aXRoaW4gbnVtZXJpY2FsCiAgICBhY2N1cmFjeS4gKFRoZSBgYGEuc2hhcGVgYCBpcyBuZWNlc3NhcnkgbGlrZSBgYGxlbihhKWBgIGlzIGZvciBgaXJmZnRgLAogICAgYW5kIGZvciB0aGUgc2FtZSByZWFzb24uKQoKICAgIFRoZSBpbnB1dCBzaG91bGQgYmUgb3JkZXJlZCBpbiB0aGUgc2FtZSB3YXkgYXMgaXMgcmV0dXJuZWQgYnkgYHJmZnRuYCwKICAgIGkuZS4gYXMgZm9yIGBpcmZmdGAgZm9yIHRoZSBmaW5hbCB0cmFuc2Zvcm1hdGlvbiBheGlzLCBhbmQgYXMgZm9yIGBpZmZ0bmAKICAgIGFsb25nIGFsbCB0aGUgb3RoZXIgYXhlcy4KCiAgICBQYXJhbWV0ZXJzCiAgICAtLS0tLS0tLS0tCiAgICBhIDogYXJyYXlfbGlrZQogICAgICAgIElucHV0IGFycmF5LgogICAgcyA6IHNlcXVlbmNlIG9mIGludHMsIG9wdGlvbmFsCiAgICAgICAgU2hhcGUgKGxlbmd0aCBvZiBlYWNoIHRyYW5zZm9ybWVkIGF4aXMpIG9mIHRoZSBvdXRwdXQKICAgICAgICAoYGBzWzBdYGAgcmVmZXJzIHRvIGF4aXMgMCwgYGBzWzFdYGAgdG8gYXhpcyAxLCBldGMuKS4gYHNgIGlzIGFsc28gdGhlCiAgICAgICAgbnVtYmVyIG9mIGlucHV0IHBvaW50cyB1c2VkIGFsb25nIHRoaXMgYXhpcywgZXhjZXB0IGZvciB0aGUgbGFzdCBheGlzLAogICAgICAgIHdoZXJlIGBgc1stMV0vLzIrMWBgIHBvaW50cyBvZiB0aGUgaW5wdXQgYXJlIHVzZWQuCiAgICAgICAgQWxvbmcgYW55IGF4aXMsIGlmIHRoZSBzaGFwZSBpbmRpY2F0ZWQgYnkgYHNgIGlzIHNtYWxsZXIgdGhhbiB0aGF0IG9mCiAgICAgICAgdGhlIGlucHV0LCB0aGUgaW5wdXQgaXMgY3JvcHBlZC4gIElmIGl0IGlzIGxhcmdlciwgdGhlIGlucHV0IGlzIHBhZGRlZAogICAgICAgIHdpdGggemVyb3MuIElmIGBzYCBpcyBub3QgZ2l2ZW4sIHRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgYWxvbmcgdGhlCiAgICAgICAgYXhlcyBzcGVjaWZpZWQgYnkgYGF4ZXNgIGlzIHVzZWQuCiAgICBheGVzIDogc2VxdWVuY2Ugb2YgaW50cywgb3B0aW9uYWwKICAgICAgICBBeGVzIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB0aGUgaW52ZXJzZSBGRlQuIElmIG5vdCBnaXZlbiwgdGhlIGxhc3QKICAgICAgICBgbGVuKHMpYCBheGVzIGFyZSB1c2VkLCBvciBhbGwgYXhlcyBpZiBgc2AgaXMgYWxzbyBub3Qgc3BlY2lmaWVkLgogICAgICAgIFJlcGVhdGVkIGluZGljZXMgaW4gYGF4ZXNgIG1lYW5zIHRoYXQgdGhlIGludmVyc2UgdHJhbnNmb3JtIG92ZXIgdGhhdAogICAgICAgIGF4aXMgaXMgcGVyZm9ybWVkIG11bHRpcGxlIHRpbWVzLgogICAgbm9ybSA6IHtOb25lLCAib3J0aG8ifSwgb3B0aW9uYWwKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEwLjAKCiAgICAgICAgTm9ybWFsaXphdGlvbiBtb2RlIChzZWUgYG51bXB5LmZmdGApLiBEZWZhdWx0IGlzIE5vbmUuCgogICAgUmV0dXJucwogICAgLS0tLS0tLQogICAgb3V0IDogbmRhcnJheQogICAgICAgIFRoZSB0cnVuY2F0ZWQgb3IgemVyby1wYWRkZWQgaW5wdXQsIHRyYW5zZm9ybWVkIGFsb25nIHRoZSBheGVzCiAgICAgICAgaW5kaWNhdGVkIGJ5IGBheGVzYCwgb3IgYnkgYSBjb21iaW5hdGlvbiBvZiBgc2Agb3IgYGFgLAogICAgICAgIGFzIGV4cGxhaW5lZCBpbiB0aGUgcGFyYW1ldGVycyBzZWN0aW9uIGFib3ZlLgogICAgICAgIFRoZSBsZW5ndGggb2YgZWFjaCB0cmFuc2Zvcm1lZCBheGlzIGlzIGFzIGdpdmVuIGJ5IHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgZWxlbWVudCBvZiBgc2AsIG9yIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGluIGV2ZXJ5IGF4aXMgZXhjZXB0IGZvciB0aGUKICAgICAgICBsYXN0IG9uZSBpZiBgc2AgaXMgbm90IGdpdmVuLiAgSW4gdGhlIGZpbmFsIHRyYW5zZm9ybWVkIGF4aXMgdGhlIGxlbmd0aAogICAgICAgIG9mIHRoZSBvdXRwdXQgd2hlbiBgc2AgaXMgbm90IGdpdmVuIGlzIGBgMioobS0xKWBgIHdoZXJlIGBgbWBgIGlzIHRoZQogICAgICAgIGxlbmd0aCBvZiB0aGUgZmluYWwgdHJhbnNmb3JtZWQgYXhpcyBvZiB0aGUgaW5wdXQuICBUbyBnZXQgYW4gb2RkCiAgICAgICAgbnVtYmVyIG9mIG91dHB1dCBwb2ludHMgaW4gdGhlIGZpbmFsIGF4aXMsIGBzYCBtdXN0IGJlIHNwZWNpZmllZC4KCiAgICBSYWlzZXMKICAgIC0tLS0tLQogICAgVmFsdWVFcnJvcgogICAgICAgIElmIGBzYCBhbmQgYGF4ZXNgIGhhdmUgZGlmZmVyZW50IGxlbmd0aC4KICAgIEluZGV4RXJyb3IKICAgICAgICBJZiBhbiBlbGVtZW50IG9mIGBheGVzYCBpcyBsYXJnZXIgdGhhbiB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcyBvZiBgYWAuCgogICAgU2VlIEFsc28KICAgIC0tLS0tLS0tCiAgICByZmZ0biA6IFRoZSBmb3J3YXJkIG4tZGltZW5zaW9uYWwgRkZUIG9mIHJlYWwgaW5wdXQsCiAgICAgICAgICAgIG9mIHdoaWNoIGBpZmZ0bmAgaXMgdGhlIGludmVy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
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 5
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
fftpack.cpython-37.pyc
44.22 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
helper.cpython-37.pyc
9.44 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
info.cpython-37.pyc
7.21 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
setup.cpython-37.pyc
684 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
428 B
lrw-r--r--
2023-04-24 19:38:36
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).