hehehwang / code2fingerprint-BE

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

code2fingerprint-BE

python app.py

  • 코드 분석

    • Request:
      • /api/sourceCodeAnalysis, POST
      • body: {"source_code": source code encoded by base64}
    • Response:
      • {'original_source_code': sourceCode, 'content': Fingerprint, 'status': 'success'}
    • Example:
      • Request: { "source_code": "ZGVmIGdldEZhY3RvcmlhbChuKToKICAgIGlmIG4gPT0gMDoKICAgICAgICByZXR1cm4gMQogICAgZWxzZToKICAgICAgICByZXR1cm4gbiAqIGdldEZhY3RvcmlhbChuLTEp" }
      • Response: {"original_source_code": "def getFactorial(n):\n if n == 0:\n return 1\n else:\n return n * getFactorial(n-1)", "content": [{"method_name": "getFactorial", "source_code": "def getFactorial(n):\n if n == 0:\n return 1\n else:\n return n * getFactorial(n - 1)", "parsed_line": "get|factorial <STR>,arg|arguments|FunctionDef|If|Compare|Name,<VAR> <STR>,arg|arguments|FunctionDef|If|Return|Constant,<NUM> <STR>,arg|arguments|FunctionDef|If|Return|BinOp|Name,<VAR> <STR>,...","fingerprint": [0.019621573388576508, -0.2939915060997009, ...], "predicted": "factorial"}], "status": "success"}
  • 코드 비교

    • Request:
      • /api/similarity, POST
      • body: { "original_source_code": source code encoded base64 "target_source_code": source code encoded base64 "similarity_threshold": threshold to judge its method similar }
    • Response:
    • {"status": "success", "content": , "length": }
    • Example:
      • Request: { "original_source_code": "ZnJvbSB0ZW5zb3JmbG93LmtlcmFzLnV0aWxzIGltcG9ydCBnZXRfZmlsZQpmcm9tIHRlbnNvcmZsb3cua2VyYXMucHJlcHJvY2Vzc2luZy5zZXF1ZW5jZSBpbXBvcnQgcGFkX3NlcXVlbmNlcwpmcm9tIHRlbnNvcmZsb3cua2VyYXMudXRpbHMgaW1wb3J0IHRvX2NhdGVnb3JpY2FsCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgdGFyZmlsZQpmcm9tIG5sdGsgaW1wb3J0IEZyZXFEaXN0CmZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CgpwYXRoID0gZ2V0X2ZpbGUoJ2JhYmktdGFza3MtdjEtMi50YXIuZ3onLCBvcmlnaW49J2h0dHBzOi8vczMuYW1hem9uYXdzLmNvbS90ZXh0LWRhdGFzZXRzLycKICAgICAgICAgICAgICAgICdiYWJpX3Rhc2tzXzEtMjBfdjEtMi50YXIuZ3onKQoKd2l0aCB0YXJmaWxlLm9wZW4ocGF0aCkgYXMgdGFyOgogdGFyLmV4dHJhY3RhbGwoKQogdGFyLmNsb3NlKCkKCkRBVEFfRElSID0gJ3Rhc2tzXzEtMjBfdjEtMi9lbi0xMGsnClRSQUlOX0ZJTEUgPSBvcy5wYXRoLmpvaW4oREFUQV9ESVIsICJxYTFfc2luZ2xlLXN1cHBvcnRpbmctZmFjdF90cmFpbi50eHQiKQpURVNUX0ZJTEUgPSBvcy5wYXRoLmpvaW4oREFUQV9ESVIsICJxYTFfc2luZ2xlLXN1cHBvcnRpbmctZmFjdF90ZXN0LnR4dCIpCgppID0gMApsaW5lcyA9IG9wZW4oVFJBSU5fRklMRSAsICJyYiIpCmZvciBsaW5lIGluIGxpbmVzOgogICAgbGluZSA9IGxpbmUuZGVjb2RlKCJ1dGYtOCIpLnN0cmlwKCkKICAgICMgbG5vLCB0ZXh0ID0gbGluZS5zcGxpdCgiICIsIDEpICMgSUTsmYAgVEVYVCDrtoTrpqwKICAgIGkgPSBpICsgMQogICAgcHJpbnQobGluZSkKICAgIGlmIGkgPT0gMjA6CiAgICAgIGJyZWFrCgpkZWYgcmVhZF9kYXRhKGRpcik6CiAgICBzdG9yaWVzLCBxdWVzdGlvbnMsIGFuc3dlcnMgPSBbXSwgW10sIFtdICMg6rCB6rCBIOyKpO2GoOumrCwg7KeI66y4LCDri7Xrs4DsnYQg7KCA7J6l7ZWgIOyYiOyglQogICAgc3RvcnlfdGVtcCA9IFtdICMg7ZiE7J6sIOyLnOygkOydmCDsiqTthqDrpqwg7J6E7IucIOyggOyepQogICAgbGluZXMgPSBvcGVuKGRpciwgInJiIikKCiAgICBmb3IgbGluZSBpbiBsaW5lczoKICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoInV0Zi04IikgIyBiJyDsoJzqsbAKICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpICMgJ1xuJyDsoJzqsbAKICAgICAgICBpZHgsIHRleHQgPSBsaW5lLnNwbGl0KCIgIiwgMSkgIyDrp6gg7JWe7JeQIOyeiOuKlCBpZCBudW1iZXIg67aE66asCiAgICAgICAgIyDsl6zquLDquYzsp4DripQg66qo65OgIOykhOyXkCDsoIHsmqnrkJjripQg7KCE7LKY66asCgogICAgICAgIGlmIGludChpZHgpID09IDE6CiAgICAgICAgICAgIHN0b3J5X3RlbXAgPSBbXQoKICAgICAgICBpZiAiXHQiIGluIHRleHQ6ICMg7ZiE7J6sIOydveuKlCDspITsnbQg7KeI66y4ICh0YWIpIOuLteuzgCAodGFiKeyduCDqsr3smrAKICAgICAgICAgICAgcXVlc3Rpb24sIGFuc3dlciwgXyA9IHRleHQuc3BsaXQoIlx0IikgIyDsp4jrrLjqs7wg64u167OA7J2EIOqwgeqwgSDsoIDsnqUKICAgICAgICAgICAgc3Rvcmllcy5hcHBlbmQoW3ggZm9yIHggaW4gc3RvcnlfdGVtcCBpZiB4XSkgIyDsp4DquIjquYzsp4DsnZgg64iE7KCBIOyKpO2GoOumrOulvCDsiqTthqDrpqzsl5Ag7KCA7J6lCiAgICAgICAgICAgIHF1ZXN0aW9ucy5hcHBlbmQocXVlc3Rpb24pCiAgICAgICAgICAgIGFuc3dlcnMuYXBwZW5kKGFuc3dlcikKCiAgICAgICAgZWxzZTogIyDtmITsnqwg7J2964qUIOykhOydtCDsiqTthqDrpqzsnbgg6rK97JqwCiAgICAgICAgICAgIHN0b3J5X3RlbXAuYXBwZW5kKHRleHQpICMg7J6E7IucIOyggOyepQoKICAgIGxpbmVzLmNsb3NlKCkKICAgIHJldHVybiBzdG9yaWVzLCBxdWVzdGlvbnMsIGFuc3dlcnMKCnRyYWluX2RhdGEgPSByZWFkX2RhdGEoVFJBSU5fRklMRSkKdGVzdF9kYXRhID0gcmVhZF9kYXRhKFRFU1RfRklMRSkKCnRyYWluX3N0b3JpZXMsIHRyYWluX3F1ZXN0aW9ucywgdHJhaW5fYW5zd2VycyA9IHJlYWRfZGF0YShUUkFJTl9GSUxFKQp0ZXN0X3N0b3JpZXMsIHRlc3RfcXVlc3Rpb25zLCB0ZXN0X2Fuc3dlcnMgPSByZWFkX2RhdGEoVEVTVF9GSUxFKQoKcHJpbnQoJ+2biOugqOyaqSDsiqTthqDrpqzsnZgg6rCc7IiYIDonLCBsZW4odHJhaW5fc3RvcmllcykpCnByaW50KCftm4jroKjsmqkg7KeI66y47J2YIOqwnOyImCA6JyxsZW4odHJhaW5fcXVlc3Rpb25zKSkKcHJpbnQoJ+2biOugqOyaqSDri7Xrs4DsnZgg6rCc7IiYIDonLGxlbih0cmFpbl9hbnN3ZXJzKSkKcHJpbnQoJ+2FjOyKpO2KuOyaqSDsiqTthqDrpqzsnZgg6rCc7IiYIDonLGxlbih0ZXN0X3N0b3JpZXMpKQpwcmludCgn7YWM7Iqk7Yq47JqpIOyniOusuOydmCDqsJzsiJggOicsbGVuKHRlc3RfcXVlc3Rpb25zKSkKcHJpbnQoJ+2FjOyKpO2KuOyaqSDri7Xrs4DsnZgg6rCc7IiYIDonLGxlbih0ZXN0X2Fuc3dlcnMpKQoKdHJhaW5fc3Rvcmllc1szNTc2XQoKWydKb2huIHdlbnQgYmFjayB0byB0aGUgZ2FyZGVuLicsCiAnTWFyeSB3ZW50IHRvIHRoZSBraXRjaGVuLicsCiAnU2FuZHJhIHdlbnQgYmFjayB0byB0aGUgYmVkcm9vbS4nLAogJ0pvaG4gdHJhdmVsbGVkIHRvIHRoZSBiZWRyb29tLiddCgp0cmFpbl9xdWVzdGlvbnNbMzU3Nl0KCidXaGVyZSBpcyBKb2huPyAnCgp0cmFpbl9hbnN3ZXJzWzM1NzZdCgonYmVkcm9vbScKCmRlZiB0b2tlbml6ZShzZW50KToKICAgIHJldHVybiBbIHguc3RyaXAoKSBmb3IgeCBpbiByZS5zcGxpdCgnKFxXKyk/Jywgc2VudCkgaWYgeC5zdHJpcCgpXQoKZGVmIHByZXByb2Nlc3NfZGF0YSh0cmFpbl9kYXRhLCB0ZXN0X2RhdGEpOgogICAgY291bnRlciA9IEZyZXFEaXN0KCkKCiAgICAjIOuRkCDrrLjsnqXsnZggc3Rvcnnrpbwg7ZWY64KY7J2YIOusuOyepeycvOuhnCDthrXtlantlZjripQg7ZWo7IiYCiAgICBmbGF0dGVuID0gbGFtYmRhIGRhdGE6IHJlZHVjZShsYW1iZGEgeCwgeTogeCArIHksIGRhdGEpCgogICAgIyDqsIEg7IOY7ZSM7J2YIOq4uOydtOulvCDsoIDsnqXtlZjripQg66as7Iqk7Yq4CiAgICBzdG9yeV9sZW4gPSBbXQogICAgcXVlc3Rpb25fbGVuID0gW10KCiAgICBmb3Igc3RvcmllcywgcXVlc3Rpb25zLCBhbnN3ZXJzIGluIFt0cmFpbl9kYXRhLCB0ZXN0X2RhdGFdOgogICAgICAgIGZvciBzdG9yeSBpbiBzdG9yaWVzOgogICAgICAgICAgICBzdG9yaWVzID0gdG9rZW5pemUoZmxhdHRlbihzdG9yeSkpICMg7Iqk7Yag66as7J2YIOusuOyepeuTpOydhCDtjrzsuZwg7ZuEIO2GoO2BsO2ZlAogICAgICAgICAgICBzdG9yeV9sZW4uYXBwZW5kKGxlbihzdG9yaWVzKSkgIyDqsIEgc3RvcnnsnZgg6ri47J20IOyggOyepQogICAgICAgICAgICBmb3Igd29yZCBpbiBzdG9yaWVzOiAjIOuLqOyWtCDsp5Htlansl5Ag64uo7Ja0IOy2lOqwgAogICAgICAgICAgICAgICAgY291bnRlclt3b3JkXSArPSAxCiAgICAgICAgZm9yIHF1ZXN0aW9uIGluIHF1ZXN0aW9uczoKICAgICAgICAgICAgcXVlc3Rpb24gPSB0b2tlbml6ZShxdWVzdGlvbikKICAgICAgICAgICAgcXVlc3Rpb25fbGVuLmFwcGVuZChsZW4ocXVlc3Rpb24pKQogICAgICAgICAgICBmb3Igd29yZCBpbiBxdWVzdGlvbjoKICAgICAgICAgICAgICAgIGNvdW50ZXJbd29yZF0gKz0gMQogICAgICAgIGZvciBhbnN3ZXIgaW4gYW5zd2VyczoKICAgICAgICAgICAgYW5zd2VyID0gdG9rZW5pemUoYW5zd2VyKQogICAgICAgICAgICBmb3Igd29yZCBpbiBhbnN3ZXI6CiAgICAgICAgICAgICAgICBjb3VudGVyW3dvcmRdICs9IDEKCiAgICAjIOuLqOyWtCDsp5Htlakg7IOd7ISxCiAgICB3b3JkMmlkeCA9IHt3b3JkIDogKGlkeCArIDEpIGZvciBpZHgsICh3b3JkLCBfKSBpbiBlbnVtZXJhdGUoY291bnRlci5tb3N0X2NvbW1vbigpKX0KICAgIGlkeDJ3b3JkID0ge2lkeCA6IHdvcmQgZm9yIHdvcmQsIGlkeCBpbiB3b3JkMmlkeC5pdGVtcygpfQoKICAgICMg6rCA7J6lIOq4tCDsg5jtlIzsnZgg6ri47J20CiAgICBzdG9yeV9tYXhfbGVuID0gbnAubWF4KHN0b3J5X2xlbikKICAgIHF1ZXN0aW9uX21heF9sZW4gPSBucC5tYXgocXVlc3Rpb25fbGVuKQoKICAgIHJldHVybiB3b3JkMmlkeCwgaWR4MndvcmQsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4KCndvcmQyaWR4LCBpZHgyd29yZCwgc3RvcnlfbWF4X2xlbiwgcXVlc3Rpb25fbWF4X2xlbiA9IHByZXByb2Nlc3NfZGF0YSh0cmFpbl9kYXRhLCB0ZXN0X2RhdGEpCgpwcmludCh3b3JkMmlkeCkKCnZvY2FiX3NpemUgPSBsZW4od29yZDJpZHgpICsgMQoKcHJpbnQoJ+yKpO2GoOumrOydmCDstZzrjIAg6ri47J20IDonLHN0b3J5X21heF9sZW4pCnByaW50KCfsp4jrrLjsnZgg7LWc64yAIOq4uOydtCA6JyxxdWVzdGlvbl9tYXhfbGVuKQoKZGVmIHZlY3Rvcml6ZShkYXRhLCB3b3JkMmlkeCwgc3RvcnlfbWF4bGVuLCBxdWVzdGlvbl9tYXhsZW4pOgogICAgWHMsIFhxLCBZID0gW10sIFtdLCBbXQogICAgZmxhdHRlbiA9IGxhbWJkYSBkYXRhOiByZWR1Y2UobGFtYmRhIHgsIHk6IHggKyB5LCBkYXRhKQoKICAgIHN0b3JpZXMsIHF1ZXN0aW9ucywgYW5zd2VycyA9IGRhdGEKICAgIGZvciBzdG9yeSwgcXVlc3Rpb24sIGFuc3dlciBpbiB6aXAoc3RvcmllcywgcXVlc3Rpb25zLCBhbnN3ZXJzKToKICAgICAgICB4cyA9IFt3b3JkMmlkeFt3XSBmb3IgdyBpbiB0b2tlbml6ZShmbGF0dGVuKHN0b3J5KSldCiAgICAgICAgeHEgPSBbd29yZDJpZHhbd10gZm9yIHcgaW4gdG9rZW5pemUocXVlc3Rpb24pXQogICAgICAgIFhzLmFwcGVuZCh4cykKICAgICAgICBYcS5hcHBlbmQoeHEpCiAgICAgICAgWS5hcHBlbmQod29yZDJpZHhbYW5zd2VyXSkKCiAgICAgICAgIyDsiqTthqDrpqzsmYAg7KeI66y47J2AIOqwgeqwgeydmCDstZzrjIAg6ri47J2066GcIO2MqOuUqQogICAgICAgICMg7KCV64u17J2AIOybkC3tlasg7J247L2U65SpCiAgICByZXR1cm4gcGFkX3NlcXVlbmNlcyhYcywgbWF4bGVuPXN0b3J5X21heGxlbiksXAogICAgICAgICAgIHBhZF9zZXF1ZW5jZXMoWHEsIG1heGxlbj1xdWVzdGlvbl9tYXhsZW4pLFwKICAgICAgICAgICB0b19jYXRlZ29yaWNhbChZLCBudW1fY2xhc3Nlcz1sZW4od29yZDJpZHgpICsgMSkKClhzdHJhaW4sIFhxdHJhaW4sIFl0cmFpbiA9IHZlY3Rvcml6ZSh0cmFpbl9kYXRhLCB3b3JkMmlkeCwgc3RvcnlfbWF4X2xlbiwgcXVlc3Rpb25fbWF4X2xlbikKWHN0ZXN0LCBYcXRlc3QsIFl0ZXN0ID0gdmVjdG9yaXplKHRlc3RfZGF0YSwgd29yZDJpZHgsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4pCgpwcmludChYc3RyYWluLnNoYXBlLCBYcXRyYWluLnNoYXBlLCBZdHJhaW4uc2hhcGUsIFhzdGVzdC5zaGFwZSwgWHF0ZXN0LnNoYXBlLCBZdGVzdC5zaGFwZSkKCmZyb20gdGVuc29yZmxvdy5rZXJhcy5tb2RlbHMgaW1wb3J0IFNlcXVlbnRpYWwsIE1vZGVsCmZyb20gdGVuc29yZmxvdy5rZXJhcy5sYXllcnMgaW1wb3J0IEVtYmVkZGluZwpmcm9tIHRlbnNvcmZsb3cua2VyYXMubGF5ZXJzIGltcG9ydCBQZXJtdXRlLCBkb3QsIGFkZCwgY29uY2F0ZW5hdGUKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLmxheWVycyBpbXBvcnQgTFNUTSwgRGVuc2UsIERyb3BvdXQsIElucHV0LCBBY3RpdmF0aW9uCgojIOyXkO2PrO2BrCDtmp/siJgKdHJhaW5fZXBvY2hzID0gMTIwCiMg67Cw7LmYIO2BrOq4sApiYXRjaF9zaXplID0gMzIKIyDsnoTrsqDrlKkg7YGs6riwCmVtYmVkX3NpemUgPSA1MAojIExTVE3snZgg7YGs6riwCmxzdG1fc2l6ZSA9IDY0CiMg6rO87KCB7ZWpIOuwqeyngCDquLDrspXsnbgg65Oc66Gt7JWE7JuDIOyggeyaqSDruYTsnKgKZHJvcG91dF9yYXRlID0gMC4zMAoKIyDtlIzroIjsnbTsiqQg7ZmA642ULiDsnoXroKXsnYQg64u064qUIOuzgOyImAppbnB1dF9zZXF1ZW5jZSA9IElucHV0KChzdG9yeV9tYXhfbGVuLCkpCnF1ZXN0aW9uID0gSW5wdXQoKHF1ZXN0aW9uX21heF9sZW4sKSkKCnByaW50KCdTdG9yaWVzIDonLCBpbnB1dF9zZXF1ZW5jZSkKcHJpbnQoJ1F1ZXN0aW9uOicsIHF1ZXN0aW9uKQoKIyDsiqTthqDrpqzrpbwg7JyE7ZWcIOyyq+uyiOynuCDsnoTrsqDrlKkuIOq3uOumvOyXkOyEnOydmCBFbWJlZGRpbmcgQQppbnB1dF9lbmNvZGVyX20gPSBTZXF1ZW50aWFsKCkKaW5wdXRfZW5jb2Rlcl9tLmFkZChFbWJlZGRpbmcoaW5wdXRfZGltPXZvY2FiX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaW09ZW1iZWRfc2l6ZSkpCmlucHV0X2VuY29kZXJfbS5hZGQoRHJvcG91dChkcm9wb3V0X3JhdGUpKQojIOqysOqzvCA6IChzYW1wbGVzLCBzdG9yeV9tYXhfbGVuLCBlbWJlZGRpbmdfZGltKSAvIOyDmO2UjOydmCDsiJgsIOusuOyepeydmCDstZzrjIAg6ri47J20LCDsnoTrsqDrlKkg67Kh7YSw7J2YIOywqOybkAoKIyDsiqTthqDrpqzrpbwg7JyE7ZWcIOuRkOuyiOynuCDsnoTrsqDrlKkuIOq3uOumvOyXkOyEnOydmCBFbWJlZGRpbmcgQwojIOyehOuyoOuUqSDrsqHthLDsnZgg7LCo7JuQ7J2EIHF1ZXN0aW9uX21heF9sZW4o7KeI66y47J2YIOy1nOuMgCDquLjsnbQp66GcIO2VnOuLpC4KaW5wdXRfZW5jb2Rlcl9jID0gU2VxdWVudGlhbCgpCmlucHV0X2VuY29kZXJfYy5hZGQoRW1iZWRkaW5nKGlucHV0X2RpbT12b2NhYl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGltPXF1ZXN0aW9uX21heF9sZW4pKQppbnB1dF9lbmNvZGVyX2MuYWRkKERyb3BvdXQoZHJvcG91dF9yYXRlKSkKIyDqsrDqs7wgOiAoc2FtcGxlcywgc3RvcnlfbWF4X2xlbiwgcXVlc3Rpb25fbWF4X2xlbikgLyDsg5jtlIzsnZgg7IiYLCDrrLjsnqXsnZgg7LWc64yAIOq4uOydtCwg7KeI66y47J2YIOy1nOuMgCDquLjsnbQo7J6E67Kg65SpIOuyoe2EsOydmCDssKjsm5ApCgojIOyniOusuOydhCDsnITtlZwg7J6E67Kg65SpLiDqt7jrprzsl5DshJzsnZggRW1iZWRkaW5nIEIKcXVlc3Rpb25fZW5jb2RlciA9IFNlcXVlbnRpYWwoKQpxdWVzdGlvbl9lbmNvZGVyLmFkZChFbWJlZGRpbmcoaW5wdXRfZGltPXZvY2FiX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGltPWVtYmVkX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9sZW5ndGg9cXVlc3Rpb25fbWF4X2xlbikpCnF1ZXN0aW9uX2VuY29kZXIuYWRkKERyb3BvdXQoZHJvcG91dF9yYXRlKSkKIyDqsrDqs7wgOiAoc2FtcGxlcywgcXVlc3Rpb25fbWF4X2xlbiwgZW1iZWRkaW5nX2RpbSkgLyDsg5jtlIzsnZgg7IiYLCDsp4jrrLjsnZgg7LWc64yAIOq4uOydtCwg7J6E67Kg65SpIOuyoe2EsOydmCDssKjsm5AKCiMg7Iuk7KeI7KCB7J24IOyehOuyoOuUqSDqs7zsoJUKaW5wdXRfZW5jb2RlZF9tID0gaW5wdXRfZW5jb2Rlcl9tKGlucHV0X3NlcXVlbmNlKQppbnB1dF9lbmNvZGVkX2MgPSBpbnB1dF9lbmNvZGVyX2MoaW5wdXRfc2VxdWVuY2UpCnF1ZXN0aW9uX2VuY29kZWQgPSBxdWVzdGlvbl9lbmNvZGVyKHF1ZXN0aW9uKQoKcHJpbnQoJ0lucHV0IGVuY29kZWQgbScsIGlucHV0X2VuY29kZWRfbSkKcHJpbnQoJ0lucHV0IGVuY29kZWQgYycsIGlucHV0X2VuY29kZWRfYykKcHJpbnQoJ1F1ZXN0aW9uIGVuY29kZWQnLCBxdWVzdGlvbl9lbmNvZGVkKQoKIyBidWlsZCB0aGUgZmluYWwgbW9kZWwKbW9kZWwgPSBNb2RlbChbaW5wdXRfc2VxdWVuY2UsIHF1ZXN0aW9uXSwgYW5zd2VyKQptb2RlbC5jb21waWxlKG9wdGltaXplcj0ncm1zcHJvcCcsIGxvc3M9J2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weScsCiAgICAgICAgICAgICAgbWV0cmljcz1bJ2FjYyddKQoKcHJpbnQobW9kZWwuc3VtbWFyeSgpKQoKIyBzdGFydCB0cmFpbmluZyB0aGUgbW9kZWwKaGlzdG9yeSA9IG1vZGVsLmZpdChbWHN0cmFpbiwgWHF0cmFpbl0sCiAgICAgICAgIFl0cmFpbiwgYmF0Y2hfc2l6ZSwgdHJhaW5fZXBvY2hzLAogICAgICAgICB2YWxpZGF0aW9uX2RhdGE9KFtYc3Rlc3QsIFhxdGVzdF0sIFl0ZXN0KSkKCiMgc2F2ZSBtb2RlbAptb2RlbC5zYXZlKCdtb2RlbC5oNScpCgojIHBsb3QgYWNjdXJhY3kgYW5kIGxvc3MgcGxvdApwbHQuc3VicGxvdCgyMTEpCnBsdC50aXRsZSgiQWNjdXJhY3kiKQpwbHQucGxvdChoaXN0b3J5Lmhpc3RvcnlbImFjYyJdLCBjb2xvcj0iZyIsIGxhYmVsPSJ0cmFpbiIpCnBsdC5wbG90KGhpc3RvcnkuaGlzdG9yeVsidmFsX2FjYyJdLCBjb2xvcj0iYiIsIGxhYmVsPSJ2YWxpZGF0aW9uIikKcGx0LmxlZ2VuZChsb2M9ImJlc3QiKQoKcGx0LnN1YnBsb3QoMjEyKQpwbHQudGl0bGUoIkxvc3MiKQpwbHQucGxvdChoaXN0b3J5Lmhpc3RvcnlbImxvc3MiXSwgY29sb3I9ImciLCBsYWJlbD0idHJhaW4iKQpwbHQucGxvdChoaXN0b3J5Lmhpc3RvcnlbInZhbF9sb3NzIl0sIGNvbG9yPSJiIiwgbGFiZWw9InZhbGlkYXRpb24iKQpwbHQubGVnZW5kKGxvYz0iYmVzdCIpCgpwbHQudGlnaHRfbGF5b3V0KCkKcGx0LnNob3coKQoKIyBsYWJlbHMKeXRlc3QgPSBucC5hcmdtYXgoWXRlc3QsIGF4aXM9MSkKCiMgZ2V0IHByZWRpY3Rpb25zCll0ZXN0XyA9IG1vZGVsLnByZWRpY3QoW1hzdGVzdCwgWHF0ZXN0XSkKeXRlc3RfID0gbnAuYXJnbWF4KFl0ZXN0XywgYXhpcz0xKQoKCmZyb20gY2tvbmxweS50YWcgaW1wb3J0IFR3aXR0ZXIKdHdpdHRlciA9IFR3aXR0ZXIoKQp0d2l0dGVyLm1vcnBocygn7J2A6rK97J2064qUIOyCrOustOyLpOuhnCDqsJTsirXri4jri6QuJykKClsn7J2AJywgJ+qyveydtCcsICfripQnLCAn7IKs66y07IukJywgJ+uhnCcsICfqsJTsirXri4jri6QnLCAnLiddCgp0d2l0dGVyLmFkZF9kaWN0aW9uYXJ5KCfsnYDqsr3snbQnLCAnTm91bicpCgp0d2l0dGVyLm1vcnBocygn7J2A6rK97J2064qUIOyCrOustOyLpOuhnCDqsJTsirXri4jri6QuJykKClsn7J2A6rK97J20JywgJ+uKlCcsICfsgqzrrLTsi6QnLCAn66GcJywgJ+qwlOyKteuLiOuLpCcsICcuJ10KCmZyb20gY2tvbmxweS50YWcgaW1wb3J0IFR3aXR0ZXIKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLnV0aWxzIGltcG9ydCBnZXRfZmlsZQpmcm9tIHRlbnNvcmZsb3cua2VyYXMucHJlcHJvY2Vzc2luZy5zZXF1ZW5jZSBpbXBvcnQgcGFkX3NlcXVlbmNlcwpmcm9tIHRlbnNvcmZsb3cua2VyYXMudXRpbHMgaW1wb3J0IHRvX2NhdGVnb3JpY2FsCmltcG9ydCBudW1weSBhcyBucApmcm9tIG5sdGsgaW1wb3J0IEZyZXFEaXN0CmZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKaW1wb3J0IG9zCmltcG9ydCByZQppbXBvcnQgbWF0cGxvdGxpYi5weXBsb3QgYXMgcGx0CgpUUkFJTl9GSUxFID0gb3MucGF0aC5qb2luKCJxYTFfc2luZ2xlLXN1cHBvcnRpbmctZmFjdF90cmFpbl9rb3IudHh0IikKVEVTVF9GSUxFID0gb3MucGF0aC5qb2luKCJxYTFfc2luZ2xlLXN1cHBvcnRpbmctZmFjdF90ZXN0X2tvci50eHQiKQoKaSA9IDAKbGluZXMgPSBvcGVuKFRSQUlOX0ZJTEUgLCAicmIiKQpmb3IgbGluZSBpbiBsaW5lczoKICAgIGxpbmUgPSBsaW5lLmRlY29kZSgidXRmLTgiKS5zdHJpcCgpCiAgICBpID0gaSArIDEKICAgIHByaW50KGxpbmUpCiAgICBpZiBpID09IDIwOgogICAgICBicmVhawoKdHJhaW5fZGF0YSA9IHJlYWRfZGF0YShUUkFJTl9GSUxFKQp0ZXN0X2RhdGEgPSByZWFkX2RhdGEoVEVTVF9GSUxFKQoKdHJhaW5fc3RvcmllcywgdHJhaW5fcXVlc3Rpb25zLCB0cmFpbl9hbnN3ZXJzID0gcmVhZF9kYXRhKFRSQUlOX0ZJTEUpCnRlc3Rfc3RvcmllcywgdGVzdF9xdWVzdGlvbnMsIHRlc3RfYW5zd2VycyA9IHJlYWRfZGF0YShURVNUX0ZJTEUpCgpwcmludCgn7ZuI66Co7JqpIOyKpO2GoOumrOydmCDqsJzsiJggOicsIGxlbih0cmFpbl9zdG9yaWVzKSkKcHJpbnQoJ+2biOugqOyaqSDsp4jrrLjsnZgg6rCc7IiYIDonLGxlbih0cmFpbl9xdWVzdGlvbnMpKQpwcmludCgn7ZuI66Co7JqpIOuLteuzgOydmCDqsJzsiJggOicsbGVuKHRyYWluX2Fuc3dlcnMpKQpwcmludCgn7YWM7Iqk7Yq47JqpIOyKpO2GoOumrOydmCDqsJzsiJggOicsbGVuKHRlc3Rfc3RvcmllcykpCnByaW50KCfthYzsiqTtirjsmqkg7KeI66y47J2YIOqwnOyImCA6JyxsZW4odGVzdF9xdWVzdGlvbnMpKQpwcmludCgn7YWM7Iqk7Yq47JqpIOuLteuzgOydmCDqsJzsiJggOicsbGVuKHRlc3RfYW5zd2VycykpCgp0cmFpbl9zdG9yaWVzWzM1NzJdCgpbJ+ydgOqyveydtOuKlCDrtoDsl4zsnLzroZwg6rCA67KE66C47Iq164uI64ukLicsCiAn7ZWE7JuF7J2064qUIOyCrOustOyLpOuhnCDqsIDrsoTroLjsirXri4jri6QuJywKICfsiJjsooXsnbTripQg67O164+E66GcIOubsOyWtOqwlOyKteuLiOuLpC4nLAogJ+ydgOqyveydtOuKlCDsgqzrrLTsi6TroZwg67O16reA7ZaI7Iq164uI64ukLicsCiAn6rK97J6E7J2064qUIOyCrOustOyLpOuhnCDsnbTrj5ntlojsirXri4jri6QuJywKICfqsr3snoTsnbTripQg7Lmo7Iuk66GcIOqwlOyKteuLiOuLpC4nXQoKdHJhaW5fcXVlc3Rpb25zWzM1NzJdCgp0cmFpbl9hbnN3ZXJzWzM1NzJdCgrsgqzrrLTsi6QKCmRlZiB0b2tlbml6ZShzZW50KToKICAgIHJldHVybiBbIHguc3RyaXAoKSBmb3IgeCBpbiByZS5zcGxpdCgnKFxXKyk/Jywgc2VudCkgaWYgeC5zdHJpcCgpXQoKd29yZDJpZHgsIGlkeDJ3b3JkLCBzdG9yeV9tYXhfbGVuLCBxdWVzdGlvbl9tYXhfbGVuID0gcHJlcHJvY2Vzc19kYXRhKHRyYWluX2RhdGEsIHRlc3RfZGF0YSkKCnByaW50KHdvcmQyaWR4KQoKdHdpdHRlciA9IFR3aXR0ZXIoKQoKcHJpbnQodHdpdHRlci5tb3JwaHMoJ+ydgOqyveydtOuKlCDtmZTsnqXsi6TroZwg7J2064+Z7ZaI7Iq164uI64ukLicpKQpwcmludCh0d2l0dGVyLm1vcnBocygn6rK97J6E7J2064qUIOygleybkOycvOuhnCDqsIDrsoTroLjsirXri4jri6QuJykpCnByaW50KHR3aXR0ZXIubW9ycGhzKCfsiJjsooXsnbTripQg67O164+E66GcIOubsOyWtOqwlOyKteuLiOuLpC4nKSkKcHJpbnQodHdpdHRlci5tb3JwaHMoJ+2VhOybheydtOuKlCDrtoDsl4zsnLzroZwg67O16reA7ZaI7Iq164uI64ukLicpKQpwcmludCh0d2l0dGVyLm1vcnBocygn7IiY7KKF7J2064qUIOyCrOustOyLpOuhnCDqsJTsirXri4jri6QuJykpCnByaW50KHR3aXR0ZXIubW9ycGhzKCfsnYDqsr3snbTripQg7Lmo7Iuk66GcIOqwlOyKteuLiOuLpC4nKSkKCnR3aXR0ZXIuYWRkX2RpY3Rpb25hcnkoJ+ydgOqyveydtCcsICdOb3VuJykKdHdpdHRlci5hZGRfZGljdGlvbmFyeSgn6rK97J6E7J20JywgJ05vdW4nKQp0d2l0dGVyLmFkZF9kaWN0aW9uYXJ5KCfsiJjsooXsnbQnLCAnTm91bicpCgpwcmludCh0d2l0dGVyLm1vcnBocygn7J2A6rK97J2064qUIO2ZlOyepeyLpOuhnCDsnbTrj5ntlojsirXri4jri6QuJykpCnByaW50KHR3aXR0ZXIubW9ycGhzKCfqsr3snoTsnbTripQg7KCV7JuQ7Jy866GcIOqwgOuyhOuguOyKteuLiOuLpC4nKSkKcHJpbnQodHdpdHRlci5tb3JwaHMoJ+yImOyiheydtOuKlCDrs7Xrj4TroZwg65uw7Ja06rCU7Iq164uI64ukLicpKQpwcmludCh0d2l0dGVyLm1vcnBocygn7ZWE7JuF7J2064qUIOu2gOyXjOycvOuhnCDrs7Xqt4DtlojsirXri4jri6QuJykpCnByaW50KHR3aXR0ZXIubW9ycGhzKCfsiJjsooXsnbTripQg7IKs66y07Iuk66GcIOqwlOyKteuLiOuLpC4nKSkKcHJpbnQodHdpdHRlci5tb3JwaHMoJ+ydgOqyveydtOuKlCDsuajsi6TroZwg6rCU7Iq164uI64ukLicpKQoKZGVmIHRva2VuaXplKHNlbnQpOgogICAgcmV0dXJuIHR3aXR0ZXIubW9ycGhzKHNlbnQpCgp3b3JkMmlkeCwgaWR4MndvcmQsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4gPSBwcmVwcm9jZXNzX2RhdGEodHJhaW5fZGF0YSwgdGVzdF9kYXRhKQoKcHJpbnQod29yZDJpZHgpCgp2b2NhYl9zaXplID0gbGVuKHdvcmQyaWR4KSArIDEKcHJpbnQodm9jYWJfc2l6ZSkKCnByaW50KCfsiqTthqDrpqzsnZgg7LWc64yAIOq4uOydtCA6JyxzdG9yeV9tYXhfbGVuKQpwcmludCgn7KeI66y47J2YIOy1nOuMgCDquLjsnbQgOicscXVlc3Rpb25fbWF4X2xlbikKClhzdHJhaW4sIFhxdHJhaW4sIFl0cmFpbiA9IHZlY3Rvcml6ZSh0cmFpbl9kYXRhLCB3b3JkMmlkeCwgc3RvcnlfbWF4X2xlbiwgcXVlc3Rpb25fbWF4X2xlbikKWHN0ZXN0LCBYcXRlc3QsIFl0ZXN0ID0gdmVjdG9yaXplKHRlc3RfZGF0YSwgd29yZDJpZHgsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4pCgpwcmludChYc3RyYWluLnNoYXBlLCBYcXRyYWluLnNoYXBlLCBZdHJhaW4uc2hhcGUsIFhzdGVzdC5zaGFwZSwgWHF0ZXN0LnNoYXBlLCBZdGVzdC5zaGFwZSkKCmZyb20gdGVuc29yZmxvdy5rZXJhcy5tb2RlbHMgaW1wb3J0IFNlcXVlbnRpYWwsIE1vZGVsCmZyb20gdGVuc29yZmxvdy5rZXJhcy5sYXllcnMgaW1wb3J0IEVtYmVkZGluZwpmcm9tIHRlbnNvcmZsb3cua2VyYXMubGF5ZXJzIGltcG9ydCBQZXJtdXRlLCBkb3QsIGFkZCwgY29uY2F0ZW5hdGUKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLmxheWVycyBpbXBvcnQgTFNUTSwgRGVuc2UsIERyb3BvdXQsIElucHV0LCBBY3RpdmF0aW9uCgojIOyXkO2PrO2BrCDtmp/siJgKdHJhaW5fZXBvY2hzID0gMTIwCiMg67Cw7LmYIO2BrOq4sApiYXRjaF9zaXplID0gMzIKIyDsnoTrsqDrlKkg7YGs6riwCmVtYmVkX3NpemUgPSA1MAojIExTVE3snZgg7YGs6riwCmxzdG1fc2l6ZSA9IDY0CiMg6rO87KCB7ZWpIOuwqeyngCDquLDrspXsnbgg65Oc66Gt7JWE7JuDIOyggeyaqSDruYTsnKgKZHJvcG91dF9yYXRlID0gMC4zMAoKIyDtlIzroIjsnbTsiqQg7ZmA642ULiDsnoXroKXsnYQg64u064qUIOuzgOyImAppbnB1dF9zZXF1ZW5jZSA9IElucHV0KChzdG9yeV9tYXhfbGVuLCkpCnF1ZXN0aW9uID0gSW5wdXQoKHF1ZXN0aW9uX21heF9sZW4sKSkKCnByaW50KCdTdG9yaWVzIDonLCBpbnB1dF9zZXF1ZW5jZSkKcHJpbnQoJ1F1ZXN0aW9uOicsIHF1ZXN0aW9uKQoKIyDsiqTthqDrpqzrpbwg7JyE7ZWcIOyyq+uyiOynuCDsnoTrsqDrlKkuIOq3uOumvOyXkOyEnOydmCBFbWJlZGRpbmcgQQppbnB1dF9lbmNvZGVyX20gPSBTZXF1ZW50aWFsKCkKaW5wdXRfZW5jb2Rlcl9tLmFkZChFbWJlZGRpbmcoaW5wdXRfZGltPXZvY2FiX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaW09ZW1iZWRfc2l6ZSkpCmlucHV0X2VuY29kZXJfbS5hZGQoRHJvcG91dChkcm9wb3V0X3JhdGUpKQojIOqysOqzvCA6IChzYW1wbGVzLCBzdG9yeV9tYXhfbGVuLCBlbWJlZGRpbmdfZGltKSAvIOyDmO2UjOydmCDsiJgsIOusuOyepeydmCDstZzrjIAg6ri47J20LCDsnoTrsqDrlKkg67Kh7YSw7J2YIOywqOybkAoKIyDsiqTthqDrpqzrpbwg7JyE7ZWcIOuRkOuyiOynuCDsnoTrsqDrlKkuIOq3uOumvOyXkOyEnOydmCBFbWJlZGRpbmcgQwojIOyehOuyoOuUqSDrsqHthLDsnZgg7LCo7JuQ7J2EIHF1ZXN0aW9uX21heF9sZW4o7KeI66y47J2YIOy1nOuMgCDquLjsnbQp66GcIO2VnOuLpC4KaW5wdXRfZW5jb2Rlcl9jID0gU2VxdWVudGlhbCgpCmlucHV0X2VuY29kZXJfYy5hZGQoRW1iZWRkaW5nKGlucHV0X2RpbT12b2NhYl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGltPXF1ZXN0aW9uX21heF9sZW4pKQppbnB1dF9lbmNvZGVyX2MuYWRkKERyb3BvdXQoZHJvcG91dF9yYXRlKSkKIyDqsrDqs7wgOiAoc2FtcGxlcywgc3RvcnlfbWF4X2xlbiwgcXVlc3Rpb25fbWF4X2xlbikgLyDsg5jtlIzsnZgg7IiYLCDrrLjsnqXsnZgg7LWc64yAIOq4uOydtCwg7KeI66y47J2YIOy1nOuMgCDquLjsnbQo7J6E67Kg65SpIOuyoe2EsOydmCDssKjsm5ApCgojIOyniOusuOydhCDsnITtlZwg7J6E67Kg65SpLiDqt7jrprzsl5DshJzsnZggRW1iZWRkaW5nIEIKcXVlc3Rpb25fZW5jb2RlciA9IFNlcXVlbnRpYWwoKQpxdWVzdGlvbl9lbmNvZGVyLmFkZChFbWJlZGRpbmcoaW5wdXRfZGltPXZvY2FiX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGltPWVtYmVkX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9sZW5ndGg9cXVlc3Rpb25fbWF4X2xlbikpCnF1ZXN0aW9uX2VuY29kZXIuYWRkKERyb3BvdXQoZHJvcG91dF9yYXRlKSkKIyDqsrDqs7wgOiAoc2FtcGxlcywgcXVlc3Rpb25fbWF4X2xlbiwgZW1iZWRkaW5nX2RpbSkgLyDsg5jtlIzsnZgg7IiYLCDsp4jrrLjsnZgg7LWc64yAIOq4uOydtCwg7J6E67Kg65SpIOuyoe2EsOydmCDssKjsm5AKCiMg7Iuk7KeI7KCB7J24IOyehOuyoOuUqSDqs7zsoJUKaW5wdXRfZW5jb2RlZF9tID0gaW5wdXRfZW5jb2Rlcl9tKGlucHV0X3NlcXVlbmNlKQppbnB1dF9lbmNvZGVkX2MgPSBpbnB1dF9lbmNvZGVyX2MoaW5wdXRfc2VxdWVuY2UpCnF1ZXN0aW9uX2VuY29kZWQgPSBxdWVzdGlvbl9lbmNvZGVyKHF1ZXN0aW9uKQoKcHJpbnQoJ0lucHV0IGVuY29kZWQgbScsIGlucHV0X2VuY29kZWRfbSkKcHJpbnQoJ0lucHV0IGVuY29kZWQgYycsIGlucHV0X2VuY29kZWRfYykKcHJpbnQoJ1F1ZXN0aW9uIGVuY29kZWQnLCBxdWVzdGlvbl9lbmNvZGVkKQoKIyDsiqTthqDrpqwg64uo7Ja065Ok6rO8IOyniOusuCDri6jslrTrk6Qg6rCE7J2YIOycoOyCrOuPhOulvCDqtaztlZjripQg6rO87KCVCiMg7Jyg7IKs64+E64qUIOuCtOyggeydhCDsgqzsmqntlZzri6QuCm1hdGNoID0gZG90KFtpbnB1dF9lbmNvZGVkX20sIHF1ZXN0aW9uX2VuY29kZWRdLCBheGVzPS0xLCBub3JtYWxpemU9RmFsc2UpCm1hdGNoID0gQWN0aXZhdGlvbignc29mdG1heCcpKG1hdGNoKQpwcmludCgnTWF0Y2ggc2hhcGUnLCBtYXRjaCkKIyDqsrDqs7wgOiAoc2FtcGxlcywgc3RvcnlfbWF4bGVuLCBxdWVzdGlvbl9tYXhfbGVuKSAvIOyDmO2UjOydmCDsiJgsIOusuOyepeydmCDstZzrjIAg6ri47J20LCDsp4jrrLjsnZgg7LWc64yAIOq4uOydtAoKIyBhZGQgdGhlIG1hdGNoIG1hdHJpeCB3aXRoIHRoZSBzZWNvbmQgaW5wdXQgdmVjdG9yIHNlcXVlbmNlCnJlc3BvbnNlID0gYWRkKFttYXRjaCwgaW5wdXRfZW5jb2RlZF9jXSkgICMgKHNhbXBsZXMsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4pCnJlc3BvbnNlID0gUGVybXV0ZSgoMiwgMSkpKHJlc3BvbnNlKSAgIyAoc2FtcGxlcywgcXVlc3Rpb25fbWF4X2xlbiwgc3RvcnlfbWF4X2xlbikKcHJpbnQoJ1Jlc3BvbnNlIHNoYXBlJywgcmVzcG9uc2UpCgojIGNvbmNhdGVuYXRlIHRoZSByZXNwb25zZSB2ZWN0b3Igd2l0aCB0aGUgcXVlc3Rpb24gdmVjdG9yIHNlcXVlbmNlCmFuc3dlciA9IGNvbmNhdGVuYXRlKFtyZXNwb25zZSwgcXVlc3Rpb25fZW5jb2RlZF0pCnByaW50KCdBbnN3ZXIgc2hhcGUnLCBhbnN3ZXIpCgphbnN3ZXIgPSBMU1RNKGxzdG1fc2l6ZSkoYW5zd2VyKSAgIyBHZW5lcmF0ZSB0ZW5zb3JzIG9mIHNoYXBlIDMyCmFuc3dlciA9IERyb3BvdXQoZHJvcG91dF9yYXRlKShhbnN3ZXIpCmFuc3dlciA9IERlbnNlKHZvY2FiX3NpemUpKGFuc3dlcikgICMgKHNhbXBsZXMsIHZvY2FiX3NpemUpCiMgd2Ugb3V0cHV0IGEgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uIG92ZXIgdGhlIHZvY2FidWxhcnkKYW5zd2VyID0gQWN0aXZhdGlvbignc29mdG1heCcpKGFuc3dlcikKCiMgYnVpbGQgdGhlIGZpbmFsIG1vZGVsCm1vZGVsID0gTW9kZWwoW2lucHV0X3NlcXVlbmNlLCBxdWVzdGlvbl0sIGFuc3dlcikKbW9kZWwuY29tcGlsZShvcHRpbWl6ZXI9J3Jtc3Byb3AnLCBsb3NzPSdjYXRlZ29yaWNhbF9jcm9zc2VudHJvcHknLAogICAgICAgICAgICAgIG1ldHJpY3M9WydhY2MnXSkKCnByaW50KG1vZGVsLnN1bW1hcnkoKSkKCiMgc3RhcnQgdHJhaW5pbmcgdGhlIG1vZGVsCmhpc3RvcnkgPSBtb2RlbC5maXQoW1hzdHJhaW4sIFhxdHJhaW5dLAogICAgICAgICBZdHJhaW4sIGJhdGNoX3NpemUsIHRyYWluX2Vwb2NocywKICAgICAgICAgdmFsaWRhdGlvbl9kYXRhPShbWHN0ZXN0LCBYcXRlc3RdLCBZdGVzdCkpCgojIHNhdmUgbW9kZWwKbW9kZWwuc2F2ZSgnbW9kZWwuaDUnKQoKIyBwbG90IGFjY3VyYWN5IGFuZCBsb3NzIHBsb3QKcGx0LnN1YnBsb3QoMjExKQpwbHQudGl0bGUoIkFjY3VyYWN5IikKcGx0LnBsb3QoaGlzdG9yeS5oaXN0b3J5WyJhY2MiXSwgY29sb3I9ImciLCBsYWJlbD0idHJhaW4iKQpwbHQucGxvdChoaXN0b3J5Lmhpc3RvcnlbInZhbF9hY2MiXSwgY29sb3I9ImIiLCBsYWJlbD0idmFsaWRhdGlvbiIpCnBsdC5sZWdlbmQobG9jPSJiZXN0IikKCnBsdC5zdWJwbG90KDIxMikKcGx0LnRpdGxlKCJMb3NzIikKcGx0LnBsb3QoaGlzdG9yeS5oaXN0b3J5WyJsb3NzIl0sIGNvbG9yPSJnIiwgbGFiZWw9InRyYWluIikKcGx0LnBsb3QoaGlzdG9yeS5oaXN0b3J5WyJ2YWxfbG9zcyJdLCBjb2xvcj0iYiIsIGxhYmVsPSJ2YWxpZGF0aW9uIikKcGx0LmxlZ2VuZChsb2M9ImJlc3QiKQoKcGx0LnRpZ2h0X2xheW91dCgpCnBsdC5zaG93KCkKCiMgbGFiZWxzCnl0ZXN0ID0gbnAuYXJnbWF4KFl0ZXN0LCBheGlzPTEpCgojIGdldCBwcmVkaWN0aW9ucwpZdGVzdF8gPSBtb2RlbC5wcmVkaWN0KFtYc3Rlc3QsIFhxdGVzdF0pCnl0ZXN0XyA9IG5wLmFyZ21heChZdGVzdF8sIGF4aXM9MSkKCk5VTV9ESVNQTEFZID0gMzAKCnByaW50KCJ7OjE4fXx7OjV9fHt9Ii5mb3JtYXQoIuyniOusuCIsICLsi6TsoJzqsJIiLCAi7JiI7Lih6rCSIikpCnByaW50KDM5ICogIi0iKQoKZm9yIGkgaW4gcmFuZ2UoTlVNX0RJU1BMQVkpOgogICAgcXVlc3Rpb24gPSAiICIuam9pbihbaWR4MndvcmRbeF0gZm9yIHggaW4gWHF0ZXN0W2ldLnRvbGlzdCgpXSkKICAgIGxhYmVsID0gaWR4MndvcmRbeXRlc3RbaV1dCiAgICBwcmVkaWN0aW9uID0gaWR4MndvcmRbeXRlc3RfW2ldXQogICAgcHJpbnQoIns6MjB9OiB7Ojd9IHt9Ii5mb3JtYXQocXVlc3Rpb24sIGxhYmVsLCBwcmVkaWN0aW9uKSkKCg==", "target_source_code": "IyDCqSAyMDIwIOyngOyEsS4gYWxsIHJpZ2h0cyByZXNlcnZlZC4KIyA8bGxsbGxsbGxsbEBrYWthby5jb20+CiMgTUlUIExpY2Vuc2UKCmZyb20gZnVuY3Rvb2xzIGltcG9ydCByZWR1Y2UKaW1wb3J0IG9zCmltcG9ydCBhcmdwYXJzZQoKZnJvbSBubHRrIGltcG9ydCBGcmVxRGlzdAppbXBvcnQgbnVtcHkgYXMgbnAKZnJvbSBja29ubHB5LnRhZyBpbXBvcnQgVHdpdHRlcgpmcm9tIHRlbnNvcmZsb3cua2VyYXMucHJlcHJvY2Vzc2luZy5zZXF1ZW5jZSBpbXBvcnQgcGFkX3NlcXVlbmNlcwpmcm9tIHRlbnNvcmZsb3cua2VyYXMudXRpbHMgaW1wb3J0IHRvX2NhdGVnb3JpY2FsCmZyb20gdGVuc29yZmxvdy5rZXJhcy5tb2RlbHMgaW1wb3J0IFNlcXVlbnRpYWwsIE1vZGVsCmZyb20gdGVuc29yZmxvdy5rZXJhcy5sYXllcnMgaW1wb3J0IEVtYmVkZGluZwpmcm9tIHRlbnNvcmZsb3cua2VyYXMubGF5ZXJzIGltcG9ydCBQZXJtdXRlLCBkb3QsIGFkZCwgY29uY2F0ZW5hdGUKZnJvbSB0ZW5zb3JmbG93LmtlcmFzLmxheWVycyBpbXBvcnQgTFNUTSwgRGVuc2UsIERyb3BvdXQsIElucHV0LCBBY3RpdmF0aW9uCgpkZWYgcmVhZF9kYXRhKGRpcik6CiAgICBzdG9yaWVzLCBxdWVzdGlvbnMsIGFuc3dlcnMgPSBbXSwgW10sIFtdCiAgICBzdG9yeV90ZW1wID0gW10KICAgIGxpbmVzID0gb3BlbihkaXIsICdyYicpCgogICAgZm9yIGxpbmUgaW4gbGluZXM6CiAgICAgICAgbGluZSA9IGxpbmUuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQogICAgICAgIGlkeCwgdGV4dCA9IGxpbmUuc3BsaXQoJyAnLCAxKQoKICAgICAgICBpZiBpbnQoaWR4KSA9PSAxOgogICAgICAgICAgICBzdG9yeV90ZW1wID0gW10KCiAgICAgICAgaWYgJ1x0JyBpbiB0ZXh0OgogICAgICAgICAgICBxdWVzdGlvbiwgYW5zd2VyLCBfID0gdGV4dC5zcGxpdCgnXHQnKQogICAgICAgICAgICBzdG9yaWVzLmFwcGVuZChbaSBmb3IgaSBpbiBzdG9yeV90ZW1wIGlmIGldKQogICAgICAgICAgICBxdWVzdGlvbnMuYXBwZW5kKHF1ZXN0aW9uKQogICAgICAgICAgICBhbnN3ZXJzLmFwcGVuZChhbnN3ZXIpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgc3RvcnlfdGVtcC5hcHBlbmQodGV4dCkKCiAgICBsaW5lcy5jbG9zZSgpCiAgICByZXR1cm4gc3RvcmllcywgcXVlc3Rpb25zLCBhbnN3ZXJzCgpkZWYgdG9rZW5pemUodHdpdHRlciwgc2VudCk6CiAgICByZXR1cm4gdHdpdHRlci5tb3JwaHMoc2VudCkKCmRlZiBwcmVwcm9jZXNzX2RhdGEodHdpdHRlciwgdHJhaW5fZGF0YSwgdGVzdF9kYXRhKToKICAgIGNvdW50ZXIgPSBGcmVxRGlzdCgpCiAgICBmbGF0dGVuID0gbGFtYmRhIGRhdGE6IHJlZHVjZShsYW1iZGEgeCwgeTogeCArIHksIGRhdGEpCgogICAgc3RvcnlfbGVuID0gW10KICAgIHF1ZXN0aW9uX2xlbiA9IFtdCgogICAgZm9yIHN0b3JpZXMsIHF1ZXN0aW9ucywgYW5zd2VycyBpbiBbdHJhaW5fZGF0YSwgdGVzdF9kYXRhXToKICAgICAgICBmb3Igc3RvcnkgaW4gc3RvcmllczoKICAgICAgICAgICAgc3RvcmllcyA9IHRva2VuaXplKHR3aXR0ZXIsIGZsYXR0ZW4oc3RvcnkpKQogICAgICAgICAgICBzdG9yeV9sZW4uYXBwZW5kKGxlbihzdG9yaWVzKSkKICAgICAgICAgICAgZm9yIHdvcmQgaW4gc3RvcmllczoKICAgICAgICAgICAgICAgIGNvdW50ZXJbd29yZF0gKz0gMQogICAgICAgIGZvciBxdWVzdGlvbiBpbiBxdWVzdGlvbnM6CiAgICAgICAgICAgIHF1ZXN0aW9uID0gdG9rZW5pemUodHdpdHRlciwgcXVlc3Rpb24pCiAgICAgICAgICAgIHF1ZXN0aW9uX2xlbi5hcHBlbmQobGVuKHF1ZXN0aW9uKSkKICAgICAgICAgICAgZm9yIHdvcmQgaW4gcXVlc3Rpb246CiAgICAgICAgICAgICAgICBjb3VudGVyW3dvcmRdICs9IDEKICAgICAgICBmb3IgYW5zd2VyIGluIGFuc3dlcnM6CiAgICAgICAgICAgIGFuc3dlciA9IHRva2VuaXplKHR3aXR0ZXIsIGFuc3dlcikKICAgICAgICAgICAgZm9yIHdvcmQgaW4gYW5zd2VyOgogICAgICAgICAgICAgICAgY291bnRlclt3b3JkXSArPSAxCgogICAgd29yZDJpZHggPSB7d29yZCA6IChpZHggKyAxKSBmb3IgaWR4LCAod29yZCwgXykgaW4gZW51bWVyYXRlKGNvdW50ZXIubW9zdF9jb21tb24oKSl9CiAgICBpZHgyd29yZCA9IHtpZHggOiB3b3JkIGZvciB3b3JkLCBpZHggaW4gd29yZDJpZHguaXRlbXMoKX0KCiAgICBzdG9yeV9tYXhfbGVuID0gbnAubWF4KHN0b3J5X2xlbikKICAgIHF1ZXN0aW9uX21heF9sZW4gPSBucC5tYXgocXVlc3Rpb25fbGVuKQoKICAgIHJldHVybiB3b3JkMmlkeCwgaWR4MndvcmQsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4KCmRlZiB2ZWN0b3JpemUodHdpdHRlciwgZGF0YSwgd29yZDJpZHgsIHN0b3J5X21heGxlbiwgcXVlc3Rpb25fbWF4bGVuKToKICAgIFhzLCBYcSwgWSA9IFtdLCBbXSwgW10KICAgIGZsYXR0ZW4gPSBsYW1iZGEgZGF0YTogcmVkdWNlKGxhbWJkYSB4LCB5OiB4ICsgeSwgZGF0YSkKCiAgICBzdG9yaWVzLCBxdWVzdGlvbnMsIGFuc3dlcnMgPSBkYXRhCiAgICBmb3Igc3RvcnksIHF1ZXN0aW9uLCBhbnN3ZXIgaW4gemlwKHN0b3JpZXMsIHF1ZXN0aW9ucywgYW5zd2Vycyk6CiAgICAgICAgeHMgPSBbd29yZDJpZHhbaV0gZm9yIGkgaW4gdG9rZW5pemUodHdpdHRlciwgZmxhdHRlbihzdG9yeSkpXQogICAgICAgIHhxID0gW3dvcmQyaWR4W2ldIGZvciBpIGluIHRva2VuaXplKHR3aXR0ZXIsIHF1ZXN0aW9uKV0KICAgICAgICBYcy5hcHBlbmQoeHMpCiAgICAgICAgWHEuYXBwZW5kKHhxKQogICAgICAgIFkuYXBwZW5kKHdvcmQyaWR4W2Fuc3dlcl0pCgogICAgcmV0dXJuIHBhZF9zZXF1ZW5jZXMoWHMsIG1heGxlbj1zdG9yeV9tYXhsZW4pLCBcCiAgICAgICAgICAgcGFkX3NlcXVlbmNlcyhYcSwgbWF4bGVuPXF1ZXN0aW9uX21heGxlbiksIFwKICAgICAgICAgICB0b19jYXRlZ29yaWNhbChZLCBudW1fY2xhc3Nlcz1sZW4od29yZDJpZHgpICsgMSkKCmRlZiBtYWluKCk6CiAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRyYWluLWZpbGUnLCByZXF1aXJlZD1UcnVlKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10ZXN0LWZpbGUnLCByZXF1aXJlZD1UcnVlKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1lcG9jaHMnLCB0eXBlPWludCwgZGVmYXVsdD0xMjApCiAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWJhdGNoLXNpemUnLCB0eXBlPWludCwgZGVmYXVsdD0zMikKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZW1iZWQtc2l6ZScsIHR5cGU9aW50LCBkZWZhdWx0PTUwKQogICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1sc3RtLXNpemUnLCB0eXBlPWludCwgZGVmYXVsdD02NCkKICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZHJvcG91dC1yYXRlJywgdHlwZT1pbnQsIGRlZmF1bHQ9MC4zKQoKICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICB0cmFpbl9maWxlID0gb3MucGF0aC5qb2luKGFyZ3MudHJhaW5fZmlsZSkKICAgIHRlc3RfZmlsZSA9IG9zLnBhdGguam9pbihhcmdzLnRlc3RfZmlsZSkKICAgIGVwb2NocyA9IGFyZ3MuZXBvY2hzCiAgICBiYXRjaF9zaXplID0gYXJncy5iYXRjaF9zaXplCiAgICBlbWJlZF9zaXplID0gYXJncy5lbWJlZF9zaXplCiAgICBsc3RtX3NpemUgPSBhcmdzLmxzdG1fc2l6ZQogICAgZHJvcG91dF9yYXRlID0gYXJncy5kcm9wb3V0X3JhdGUKCiAgICB0cmFpbl9kYXRhID0gcmVhZF9kYXRhKHRyYWluX2ZpbGUpCiAgICB0ZXN0X2RhdGEgPSByZWFkX2RhdGEodGVzdF9maWxlKQoKICAgIHR3aXR0ZXIgPSBUd2l0dGVyKCkKICAgIHR3aXR0ZXIuYWRkX2RpY3Rpb25hcnkoJ+ydgOqyveydtCcsICdOb3VuJykKICAgIHR3aXR0ZXIuYWRkX2RpY3Rpb25hcnkoJ+qyveyehOydtCcsICdOb3VuJykKICAgIHR3aXR0ZXIuYWRkX2RpY3Rpb25hcnkoJ+yImOyiheydtCcsICdOb3VuJykKCiAgICB3b3JkMmlkeCwgaWR4MndvcmQsIHN0b3J5X21heF9sZW4sIHF1ZXN0aW9uX21heF9sZW4gPSBcCiAgICAgICAgcHJlcHJvY2Vzc19kYXRhKHR3aXR0ZXIsIHRyYWluX2RhdGEsIHRlc3RfZGF0YSkKCiAgICB2b2NhYl9zaXplID0gbGVuKHdvcmQyaWR4KSArIDEKCiAgICBYc3RyYWluLCBYcXRyYWluLCBZdHJhaW4gPSB2ZWN0b3JpemUoCiAgICAgICAgdHdpdHRlciwKICAgICAgICB0cmFpbl9kYXRhLAogICAgICAgIHdvcmQyaWR4LAogICAgICAgIHN0b3J5X21heF9sZW4sCiAgICAgICAgcXVlc3Rpb25fbWF4X2xlbgogICAgKQogICAgWHN0ZXN0LCBYcXRlc3QsIFl0ZXN0ID0gdmVjdG9yaXplKAogICAgICAgIHR3aXR0ZXIsCiAgICAgICAgdGVzdF9kYXRhLAogICAgICAgIHdvcmQyaWR4LAogICAgICAgIHN0b3J5X21heF9sZW4sCiAgICAgICAgcXVlc3Rpb25fbWF4X2xlbgogICAgKQoKICAgIGlucHV0X3NlcXVlbmNlID0gSW5wdXQoKHN0b3J5X21heF9sZW4sKSkKICAgIHF1ZXN0aW9uID0gSW5wdXQoKHF1ZXN0aW9uX21heF9sZW4sKSkKCiAgICBpbnB1dF9lbmNvZGVyX20gPSBTZXF1ZW50aWFsKCkKICAgIGlucHV0X2VuY29kZXJfbS5hZGQoRW1iZWRkaW5nKAogICAgICAgIGlucHV0X2RpbT12b2NhYl9zaXplLAogICAgICAgIG91dHB1dF9kaW09ZW1iZWRfc2l6ZSkKICAgICkKICAgIGlucHV0X2VuY29kZXJfbS5hZGQoRHJvcG91dChkcm9wb3V0X3JhdGUpKQoKICAgIGlucHV0X2VuY29kZXJfYyA9IFNlcXVlbnRpYWwoKQogICAgaW5wdXRfZW5jb2Rlcl9jLmFkZChFbWJlZGRpbmcoCiAgICAgICAgaW5wdXRfZGltPXZvY2FiX3NpemUsCiAgICAgICAgb3V0cHV0X2RpbT1xdWVzdGlvbl9tYXhfbGVuKQogICAgKQogICAgaW5wdXRfZW5jb2Rlcl9jLmFkZChEcm9wb3V0KGRyb3BvdXRfcmF0ZSkpCgogICAgcXVlc3Rpb25fZW5jb2RlciA9IFNlcXVlbnRpYWwoKQogICAgcXVlc3Rpb25fZW5jb2Rlci5hZGQoRW1iZWRkaW5nKAogICAgICAgIGlucHV0X2RpbT12b2NhYl9zaXplLAogICAgICAgIG91dHB1dF9kaW09ZW1iZWRfc2l6ZSwKICAgICAgICBpbnB1dF9sZW5ndGg9cXVlc3Rpb25fbWF4X2xlbikKICAgICkKICAgIHF1ZXN0aW9uX2VuY29kZXIuYWRkKERyb3BvdXQoZHJvcG91dF9yYXRlKSkKCiAgICBpbnB1dF9lbmNvZGVkX20gPSBpbnB1dF9lbmNvZGVyX20oaW5wdXRfc2VxdWVuY2UpCiAgICBpbnB1dF9lbmNvZGVkX2MgPSBpbnB1dF9lbmNvZGVyX2MoaW5wdXRfc2VxdWVuY2UpCiAgICBxdWVzdGlvbl9lbmNvZGVkID0gcXVlc3Rpb25fZW5jb2RlcihxdWVzdGlvbikKCiAgICBtYXRjaCA9IGRvdChbaW5wdXRfZW5jb2RlZF9tLCBxdWVzdGlvbl9lbmNvZGVkXSwgYXhlcz0tMSwgbm9ybWFsaXplPUZhbHNlKQogICAgbWF0Y2ggPSBBY3RpdmF0aW9uKCdzb2Z0bWF4JykobWF0Y2gpCgogICAgcmVzcG9uc2UgPSBhZGQoW21hdGNoLCBpbnB1dF9lbmNvZGVkX2NdKQogICAgcmVzcG9uc2UgPSBQZXJtdXRlKCgyLCAxKSkocmVzcG9uc2UpCgogICAgYW5zd2VyID0gY29uY2F0ZW5hdGUoW3Jlc3BvbnNlLCBxdWVzdGlvbl9lbmNvZGVkXSkKICAgIGFuc3dlciA9IExTVE0obHN0bV9zaXplKShhbnN3ZXIpCiAgICBhbnN3ZXIgPSBEcm9wb3V0KGRyb3BvdXRfcmF0ZSkoYW5zd2VyKQogICAgYW5zd2VyID0gRGVuc2Uodm9jYWJfc2l6ZSkoYW5zd2VyKQogICAgYW5zd2VyID0gQWN0aXZhdGlvbignc29mdG1heCcpKGFuc3dlcikKCiAgICBtb2RlbCA9IE1vZGVsKFtpbnB1dF9zZXF1ZW5jZSwgcXVlc3Rpb25dLCBhbnN3ZXIpCiAgICBtb2RlbC5jb21waWxlKAogICAgICAgIG9wdGltaXplcj0ncm1zcHJvcCcsCiAgICAgICAgbG9zcz0nY2F0ZWdvcmljYWxfY3Jvc3NlbnRyb3B5JywKICAgICAgICBtZXRyaWNzPVsnYWNjJ10KICAgICkKCiAgICBtb2RlbC5maXQoCiAgICAgICAgW1hzdHJhaW4sIFhxdHJhaW5dLAogICAgICAgIFl0cmFpbiwKICAgICAgICBiYXRjaF9zaXplLAogICAgICAgIGVwb2NocywKICAgICAgICB2YWxpZGF0aW9uX2RhdGE9KFtYc3Rlc3QsIFhxdGVzdF0sIFl0ZXN0KQogICAgKQoKICAgIG1vZGVsLnNhdmUoJ21vZGVsLmg1JykKCiAgICB5dGVzdCA9IG5wLmFyZ21heChZdGVzdCwgYXhpcz0xKQogICAgWXRlc3RfID0gbW9kZWwucHJlZGljdChbWHN0ZXN0LCBYcXRlc3RdKQogICAgeXRlc3RfID0gbnAuYXJnbWF4KFl0ZXN0XywgYXhpcz0xKQoKICAgIE5VTV9ESVNQTEFZID0gMzAKCiAgICBwcmludCgn7KeI66y4ICAgICAgICAgICAgICAgICAgICAgICB87Iuk7KCc6rCSICAgICB87JiI7Lih6rCSJykKICAgIHByaW50KCctJyAqIDQ2KQoKICAgIGZvciBpIGluIHJhbmdlKE5VTV9ESVNQTEFZKToKICAgICAgICBxdWVzdGlvbiA9ICcgJy5qb2luKFtpZHgyd29yZFtqXSBmb3IgaiBpbiBYcXRlc3RbaV0udG9saXN0KCldKQogICAgICAgIGxhYmVsID0gaWR4MndvcmRbeXRlc3RbaV1dCiAgICAgICAgcHJlZGljdGlvbiA9IGlkeDJ3b3JkW3l0ZXN0X1tpXV0KICAgICAgICBpZiBsZW4obGFiZWwpID09IDI6CiAgICAgICAgICAgIHByaW50KGYne3F1ZXN0aW9uOjIwfToge2xhYmVsOjh9IHtwcmVkaWN0aW9ufScpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcHJpbnQoZid7cXVlc3Rpb246MjB9OiB7bGFiZWw6N30ge3ByZWRpY3Rpb259JykKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCk=", "similarity_threshold": "50" }
      • Response: {"status": "success", "content": [{"original": "read_data", "target": "read_data", "difference": 12.93}, {"original": "tokenize", "target": "tokenize", "difference": 48.39}, {"original": "preprocess_data", "target": "preprocess_data", "difference": 18.94}, {"original": "vectorize", "target": "vectorize", "difference": 15.15}], "length": 4}

About


Languages

Language:Python 100.0%