49cf017733
- Added _fetch_s3_text() helper that handles non-JSON content gracefully (auto_sum_note may be HTML/plain text, not JSON — previous code errored) - plaud_get_summary now tries auto_sum_note first, falls back to outline - plaud_get_notes now routes auto_sum_note through _fetch_s3_text - plaud_get_recording_detail now correctly flags has_summary=true when auto_sum_note is present (previously only checked "outline") - Response includes summary_type field: "auto_sum_note", "outline", or "none"
1 line
23 KiB
Python
1 line
23 KiB
Python
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIKUGxhdWQgTUNQIFNlcnZlciBmb3IgTVBNCkNvbm5lY3RzIHRvIHRoZSBQbGF1ZCBBUEkgYW5kIGV4cG9zZXMgdG9vbHMgZm9yIGxpc3RpbmcsIHNlYXJjaGluZywKYW5kIHJlYWRpbmcgdHJhbnNjcmlwdHMsIHN1bW1hcmllcywgYW5kIG5vdGVzIGZyb20gUGxhdWQgcmVjb3JkaW5ncy4KCkNyZWRlbnRpYWxzIChjaGVja2VkIGluIG9yZGVyKToKICAxLiBQTEFVRF9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZQogIDIuIH4vLnBsYXVkL3Rva2Vucy1tY3AuanNvbiAgKGRlc2t0b3AgYXBwIGF1dGhUb2tlbiDigJQgdmFsaWQgfjYgbW9udGhzKQogIDMuIH4vLnBsYXVkL2NvbmZpZy5qc29uICAgICAgKG1hbnVhbGx5IGltcG9ydGVkIDI0LWhvdXIgd2ViIHRva2VuKQoKVG8gcmVuZXc6IHJlLXJ1biBwbGF1ZF9kZWNyeXB0X3Rva2Vucy5weSBmcm9tIHRoZSBDbGF1ZGUgQ29Xb3JrIGZvbGRlci4KIiIiCgppbXBvcnQgZ3ppcAppbXBvcnQganNvbgppbXBvcnQgb3MKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHVybGxpYi5wYXJzZQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZSwgdGltZXpvbmUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKZnJvbSBtY3Auc2VydmVyLmZhc3RtY3AgaW1wb3J0IEZhc3RNQ1AKCiMg4pSA4pSAIENvbmZpZ3VyYXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAClBMQVVEX1JFR0lPTiA9IG9zLmVudmlyb24uZ2V0KCJQTEFVRF9SRUdJT04iLCAidXMiKQpCQVNFX1VSTCA9ICJodHRwczovL2FwaS5wbGF1ZC5ldSIgaWYgUExBVURfUkVHSU9OID09ICJldSIgZWxzZSAiaHR0cHM6Ly9hcGkucGxhdWQuYWkiCkNPTkZJR19QQVRIICAgICAgPSBQYXRoLmhvbWUoKSAvICIucGxhdWQiIC8gImNvbmZpZy5qc29uIgpUT0tFTlNfTUNQX1BBVEggID0gUGF0aC5ob21lKCkgLyAiLnBsYXVkIiAvICJ0b2tlbnMtbWNwLmpzb24iCgoKIyDilIDilIAgVG9rZW4gcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfbG9hZF90b2tlbigpIC0+IE9wdGlvbmFsW3N0cl06CiAgICAjIDEuIEVudmlyb25tZW50IHZhcmlhYmxlIG92ZXJyaWRlCiAgICBlbnZfdG9rZW4gPSBvcy5lbnZpcm9uLmdldCgiUExBVURfVE9LRU4iLCAiIikuc3RyaXAoKQogICAgaWYgZW52X3Rva2VuOgogICAgICAgIHJldHVybiBlbnZfdG9rZW4KCiAgICAjIDIuIHRva2Vucy1tY3AuanNvbiDigJQgZGVza3RvcCBhcHAgYXV0aFRva2VuICh+Ni1tb250aCBleHBpcnkpCiAgICAjICAgIFdyaXR0ZW4gYnkgcGxhdWRfZGVjcnlwdF90b2tlbnMucHk7IHJlbmV3IGJ5IHJlLXJ1bm5pbmcgdGhhdCBzY3JpcHQuCiAgICBpZiBUT0tFTlNfTUNQX1BBVEguZXhpc3RzKCk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBkYXRhID0ganNvbi5sb2FkcyhUT0tFTlNfTUNQX1BBVEgucmVhZF90ZXh0KCkpCiAgICAgICAgICAgIHQgPSBkYXRhLmdldCgiYWNjZXNzX3Rva2VuIiwgIiIpLnN0cmlwKCkKICAgICAgICAgICAgaWYgdDoKICAgICAgICAgICAgICAgIHJldHVybiB0CiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwoKICAgICMgMy4gY29uZmlnLmpzb24g4oCUIG1hbnVhbGx5IGltcG9ydGVkIDI0LWhvdXIgd2ViIHRva2VuIChsZWdhY3kgZmFsbGJhY2spCiAgICBpZiBDT05GSUdfUEFUSC5leGlzdHMoKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKENPTkZJR19QQVRILnJlYWRfdGV4dCgpKQogICAgICAgICAgICB0b2tlbl9ibG9jayA9IGRhdGEuZ2V0KCJ0b2tlbiIpCiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rZW5fYmxvY2ssIGRpY3QpOgogICAgICAgICAgICAgICAgdCA9ICh0b2tlbl9ibG9jay5nZXQoInRva2VuIikgb3IgdG9rZW5fYmxvY2suZ2V0KCJhY2Nlc3NUb2tlbiIpIG9yICIiKS5zdHJpcCgpCiAgICAgICAgICAgICAgICBpZiB0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodG9rZW5fYmxvY2ssIHN0cikgYW5kIHRva2VuX2Jsb2NrLnN0cmlwKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fYmxvY2suc3RyaXAoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgICAgIHBhc3MKCiAgICByZXR1cm4gTm9uZQoKCmRlZiBfZ2V0X3Rva2VuKCkgLT4gc3RyOgogICAgdG9rZW4gPSBfbG9hZF90b2tlbigpCiAgICBpZiBub3QgdG9rZW46CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICAiTm8gUGxhdWQgdG9rZW4gZm91bmQuIFJ1biB0aGUgcGxhdWQtY29ubmVjdG9yIGltcG9ydC10b2tlbiBjb21tYW5kICIKICAgICAgICAgICAgIm9yIHNldCB0aGUgUExBVURfVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUuIgogICAgICAgICkKICAgIHJldHVybiB0b2tlbgoKCiMg4pSA4pSAIEhUVFAgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAKCmRlZiBfYXBpX2dldChwYXRoOiBzdHIsIHBhcmFtczogT3B0aW9uYWxbZGljdF0gPSBOb25lKSAtPiBkaWN0OgogICAgIiIiR0VUIHJlcXVlc3QgdG8gdGhlIFBsYXVkIEFQSSB1c2luZyBjdXJsIChieXBhc3NlcyBDbG91ZGZsYXJlIGJyb3dzZXIgY2hlY2spLiIiIgogICAgdG9rZW4gPSBfZ2V0X3Rva2VuKCkKICAgIHVybCA9IGYie0JBU0VfVVJMfXtwYXRofSIKICAgIGlmIHBhcmFtczoKICAgICAgICBxdWVyeSA9ICImIi5qb2luKAogICAgICAgICAgICBmIntrfT17dXJsbGliLnBhcnNlLnF1b3RlKHN0cih2KSl9IgogICAgICAgICAgICBmb3IgaywgdiBpbiBwYXJhbXMuaXRlbXMoKSBpZiB2IGlzIG5vdCBOb25lCiAgICAgICAgKQogICAgICAgIGlmIHF1ZXJ5OgogICAgICAgICAgICB1cmwgPSBmInt1cmx9P3txdWVyeX0iCgogICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCiAgICAgICAgWyJjdXJsIiwgIi1zIiwgIi1mIiwKICAgICAgICAgIi1IIiwgZiJBdXRob3JpemF0aW9uOiBCZWFyZXIge3Rva2VufSIsCiAgICAgICAgICItSCIsICJBY2NlcHQ6IGFwcGxpY2F0aW9uL2pzb24iLAogICAgICAgICB1cmxdLAogICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRleHQ9VHJ1ZSwgdGltZW91dD0zMCwKICAgICkKICAgIGlmIHJlc3VsdC5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAogICAgICAgICAgICBmIlBsYXVkIEFQSSBlcnJvciAoY3VybCBleGl0IHtyZXN1bHQucmV0dXJuY29kZX0pOiB7cmVzdWx0LnN0ZGVycls6MzAwXX0iCiAgICAgICAgKQogICAgdHJ5OgogICAgICAgIHJldHVybiBqc29uLmxvYWRzKHJlc3VsdC5zdGRvdXQpCiAgICBleGNlcHQganNvbi5KU09ORGVjb2RlRXJyb3I6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGYiSW52YWxpZCBKU09OIGZyb20gUGxhdWQgQVBJOiB7cmVzdWx0LnN0ZG91dFs6MzAwXX0iKQoKCmRlZiBfZmV0Y2hfczNfanNvbih1cmw6IHN0cikgLT4gb2JqZWN0OgogICAgIiIiRmV0Y2ggYW5kIGRlY29tcHJlc3MgYSBnemlwcGVkIEpTT04gZnJvbSBhIHNpZ25lZCBTMyBVUkwuIiIiCiAgICByZXN1bHQgPSBzdWJwcm9jZXNzLnJ1bigKICAgICAgICBbImN1cmwiLCAiLXMiLCAiLWYiLCB1cmxdLAogICAgICAgIGNhcHR1cmVfb3V0cHV0PVRydWUsIHRpbWVvdXQ9MzAsCiAgICApCiAgICBpZiByZXN1bHQucmV0dXJuY29kZSAhPSAwOgogICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihmIlMzIGZldGNoIGZhaWxlZCAoY3VybCBleGl0IHtyZXN1bHQucmV0dXJuY29kZX0pIikKICAgIHRyeToKICAgICAgICBjb250ZW50ID0gZ3ppcC5kZWNvbXByZXNzKHJlc3VsdC5zdGRvdXQpCiAgICBleGNlcHQgT1NFcnJvcjoKICAgICAgICBjb250ZW50ID0gcmVzdWx0LnN0ZG91dCAgIyBOb3QgZ3ppcHBlZAogICAgcmV0dXJuIGpzb24ubG9hZHMoY29udGVudC5kZWNvZGUoInV0Zi04IikpCgoKZGVmIF9mZXRjaF9zM190ZXh0KHVybDogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIEZldGNoIGEgc2lnbmVkIFMzIFVSTCBhbmQgcmV0dXJuIHJhdyB0ZXh0LCBoYW5kbGluZyBnemlwIGFuZCBKU09OIGdyYWNlZnVsbHkuCiAgICBVc2VkIGZvciBhdXRvX3N1bV9ub3RlIGNvbnRlbnQgd2hpY2ggbWF5IGJlIEhUTUwsIHBsYWluIHRleHQsIG9yIEpTT04uCiAgICAiIiIKICAgIHJlc3VsdCA9IHN1YnByb2Nlc3MucnVuKAogICAgICAgIFsiY3VybCIsICItcyIsICItZiIsIHVybF0sCiAgICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwgdGltZW91dD0zMCwKICAgICkKICAgIGlmIHJlc3VsdC5yZXR1cm5jb2RlICE9IDA6CiAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKGYiUzMgZmV0Y2ggZmFpbGVkIChjdXJsIGV4aXQge3Jlc3VsdC5yZXR1cm5jb2RlfSkiKQogICAgdHJ5OgogICAgICAgIHJhdyA9IGd6aXAuZGVjb21wcmVzcyhyZXN1bHQuc3Rkb3V0KQogICAgZXhjZXB0IE9TRXJyb3I6CiAgICAgICAgcmF3ID0gcmVzdWx0LnN0ZG91dAogICAgdGV4dCA9IHJhdy5kZWNvZGUoInV0Zi04IiwgZXJyb3JzPSJyZXBsYWNlIikKICAgICMgSWYgaXQncyBKU09OLCBwcmV0dHktcHJpbnQgaXQ7IG90aGVyd2lzZSByZXR1cm4gYXMtaXMKICAgIHRyeToKICAgICAgICBwYXJzZWQgPSBqc29uLmxvYWRzKHRleHQpCiAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJzZWQsIGxpc3QpOgogICAgICAgICAgICAjIExpc3Qgb2Ygc2VnbWVudHMg4oCUIGV4dHJhY3QgY29udGVudCBmaWVsZHMKICAgICAgICAgICAgcmV0dXJuICJcblxuIi5qb2luKAogICAgICAgICAgICAgICAgc3RyKHNlZy5nZXQoImNvbnRlbnQiKSBvciBzZWcuZ2V0KCJ0ZXh0Iikgb3Igc2VnKQogICAgICAgICAgICAgICAgZm9yIHNlZyBpbiBwYXJzZWQgaWYgc2VnCiAgICAgICAgICAgICkKICAgICAgICByZXR1cm4ganNvbi5kdW1wcyhwYXJzZWQsIGluZGVudD0yKQogICAgZXhjZXB0IGpzb24uSlNPTkRlY29kZUVycm9yOgogICAgICAgIHJldHVybiB0ZXh0CgoKIyDilIDilIAgRGF0YSBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAoKZGVmIF9mbXRfZHVyYXRpb24obXM6IGludCkgLT4gc3RyOgogICAgbWlucyA9IG1zIC8vIDYwMDAwCiAgICBpZiBtaW5zIDwgNjA6CiAgICAgICAgcmV0dXJuIGYie21pbnN9bSIKICAgIHJldHVybiBmInttaW5zIC8vIDYwfWgge21pbnMgJSA2MH1tIgoKCmRlZiBfZm10X2RhdGUodHNfbXM6IGludCkgLT4gc3RyOgogICAgdHJ5OgogICAgICAgIGR0ID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0c19tcyAvIDEwMDAsIHR6PXRpbWV6b25lLnV0YykKICAgICAgICByZXR1cm4gZHQuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNIFVUQyIpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiBzdHIodHNfbXMpCgoKZGVmIF9zdW1tYXJpc2VfcmVjb3JkaW5nKHI6IGRpY3QpIC0+IGRpY3Q6CiAgICAiIiJSZXR1cm4gYSBjb21wYWN0IGRpY3Qgc3VpdGFibGUgZm9yIGxpc3RpbmcuIiIiCiAgICByZXR1cm4gewogICAgICAgICJpZCI6IHIuZ2V0KCJpZCIsICIiKSwKICAgICAgICAidGl0bGUiOiByLmdldCgiZmlsZW5hbWUiKSBvciByLmdldCgiZmlsZV9uYW1lIikgb3Igci5nZXQoInRpdGxlIikgb3IgIih1bnRpdGxlZCkiLAogICAgICAgICJkYXRlIjogX2ZtdF9kYXRlKHIuZ2V0KCJzdGFydF90aW1lIiwgMCkpLAogICAgICAgICJkdXJhdGlvbiI6IF9mbXRfZHVyYXRpb24oci5nZXQoImR1cmF0aW9uIiwgMCkpLAogICAgICAgICJoYXNfdHJhbnNjcmlwdCI6IGJvb2woci5nZXQoImlzX3RyYW5zIikpLAogICAgICAgICJoYXNfc3VtbWFyeSI6IGJvb2woci5nZXQoImF1dG9fc3VtX25vdGUiKSBvciByLmdldCgiaXNfc3VtIikpLAogICAgfQoKCmRlZiBfZm9ybWF0X3RyYW5zY3JpcHQoc2VnbWVudHM6IGxpc3QpIC0+IHN0cjoKICAgICIiIkZvcm1hdCB0cmFuc2NyaXB0IHNlZ21lbnRzIGludG8gcmVhZGFibGUgdGV4dC4iIiIKICAgIGxpbmVzID0gW10KICAgIGN1cnJlbnRfc3BlYWtlciA9IE5vbmUKICAgIGZvciBzZWcgaW4gc2VnbWVudHM6CiAgICAgICAgc3BlYWtlciA9IHNlZy5nZXQoInNwZWFrZXIiKSBvciBzZWcuZ2V0KCJvcmlnaW5hbF9zcGVha2VyIikgb3IgIiIKICAgICAgICBjb250ZW50ID0gc2VnLmdldCgiY29udGVudCIsICIiKS5zdHJpcCgpCiAgICAgICAgaWYgbm90IGNvbnRlbnQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgaWYgc3BlYWtlciBhbmQgc3BlYWtlciAhPSBjdXJyZW50X3NwZWFrZXI6CiAgICAgICAgICAgIGlmIGxpbmVzOgogICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIiKQogICAgICAgICAgICBsaW5lcy5hcHBlbmQoZiJbe3NwZWFrZXJ9XSIpCiAgICAgICAgICAgIGN1cnJlbnRfc3BlYWtlciA9IHNwZWFrZXIKICAgICAgICBsaW5lcy5hcHBlbmQoY29udGVudCkKICAgIHJldHVybiAiXG4iLmpvaW4obGluZXMpCgoKZGVmIF9nZXRfY29udGVudF91cmwoY29udGVudF9saXN0OiBsaXN0LCBkYXRhX3R5cGU6IHN0cikgLT4gT3B0aW9uYWxbc3RyXToKICAgICIiIkZpbmQgYSBkYXRhX2xpbmsgVVJMIGZyb20gY29udGVudF9saXN0IGJ5IGRhdGFfdHlwZS4iIiIKICAgIGZvciBpdGVtIGluIGNvbnRlbnRfbGlzdDoKICAgICAgICBpZiBpdGVtLmdldCgiZGF0YV90eXBlIikgPT0gZGF0YV90eXBlIGFuZCBpdGVtLmdldCgiZGF0YV9saW5rIik6CiAgICAgICAgICAgIHJldHVybiBpdGVtWyJkYXRhX2xpbmsiXQogICAgcmV0dXJuIE5vbmUKCgojIOKUgOKUgCBNQ1Agc2VydmVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgAptY3AgPSBGYXN0TUNQKCJwbGF1ZC1tcG0iKQoKCkBtY3AudG9vbCgpCmRlZiBwbGF1ZF9saXN0X3JlY29yZGluZ3MoCiAgICBsaW1pdDogaW50ID0gNTAsCiAgICBvbmx5X3dpdGhfdHJhbnNjcmlwdDogYm9vbCA9IEZhbHNlLAopIC0+IHN0cjoKICAgICIiIgogICAgTGlzdCBQbGF1ZCByZWNvcmRpbmdzIG5ld2VzdC1maXJzdC4KCiAgICBBcmdzOgogICAgICAgIGxpbWl0OiBNYXggbnVtYmVyIHRvIHJldHVybiAoZGVmYXVsdCA1MCwgbWF4IDIwMCkuCiAgICAgICAgb25seV93aXRoX3RyYW5zY3JpcHQ6IElmIHRydWUsIG9ubHkgcmV0dXJuIHJlY29yZGluZ3MgdGhhdCBoYXZlIGEgdHJhbnNjcmlwdC4KICAgICIiIgogICAgcmVzcCA9IF9hcGlfZ2V0KCIvZmlsZS9zaW1wbGUvd2ViIikKICAgIGlmIGlzaW5zdGFuY2UocmVzcCwgZGljdCk6CiAgICAgICAgcmVjb3JkaW5ncyA9IHJlc3AuZ2V0KCJkYXRhX2ZpbGVfbGlzdCIpIG9yIHJlc3AuZ2V0KCJkYXRhIikgb3IgW10KICAgIGVsc2U6CiAgICAgICAgcmVjb3JkaW5ncyA9IHJlc3AgaWYgaXNpbnN0YW5jZShyZXNwLCBsaXN0KSBlbHNlIFtdCgogICAgaWYgb25seV93aXRoX3RyYW5zY3JpcHQ6CiAgICAgICAgcmVjb3JkaW5ncyA9IFtyIGZvciByIGluIHJlY29yZGluZ3MgaWYgci5nZXQoImlzX3RyYW5zIildCgogICAgcmVjb3JkaW5ncyA9IHJlY29yZGluZ3NbOm1pbihsaW1pdCwgMjAwKV0KICAgIHJldHVybiBqc29uLmR1bXBzKFtfc3VtbWFyaXNlX3JlY29yZGluZyhyKSBmb3IgciBpbiByZWNvcmRpbmdzXSwgaW5kZW50PTIpCgoKQG1jcC50b29sKCkKZGVmIHBsYXVkX3NlYXJjaF9yZWNvcmRpbmdzKAogICAgdGl0bGVfY29udGFpbnM6IE9wdGlvbmFsW3N0cl0gPSBOb25lLAogICAgc3RhcnRfZGF0ZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBlbmRfZGF0ZTogT3B0aW9uYWxbc3RyXSA9IE5vbmUsCiAgICBvbmx5X3dpdGhfdHJhbnNjcmlwdDogYm9vbCA9IEZhbHNlLAogICAgbWF4X3Jlc3VsdHM6IGludCA9IDIwLAopIC0+IHN0cjoKICAgICIiIgogICAgU2VhcmNoIHJlY29yZGluZ3MgYnkgdGl0bGUgYW5kL29yIGRhdGUgcmFuZ2UuCgogICAgQXJnczoKICAgICAgICB0aXRsZV9jb250YWluczogU3Vic3RyaW5nIHRvIG1hdGNoIGluIHRoZSByZWNvcmRpbmcgdGl0bGUgKGNhc2UtaW5zZW5zaXRpdmUpLgogICAgICAgIHN0YXJ0X2RhdGU6IElTTyBkYXRlIHN0cmluZywgZS5nLiAnMjAyNi0wNC0wMScuIE9ubHkgcmVjb3JkaW5ncyBvbiBvciBhZnRlciB0aGlzIGRhdGUuCiAgICAgICAgZW5kX2RhdGU6IElTTyBkYXRlIHN0cmluZywgZS5nLiAnMjAyNi0wNS0wMScuIE9ubHkgcmVjb3JkaW5ncyBvbiBvciBiZWZvcmUgdGhpcyBkYXRlLgogICAgICAgIG9ubHlfd2l0aF90cmFuc2NyaXB0OiBJZiB0cnVlLCBvbmx5IHJldHVybiByZWNvcmRpbmdzIHRoYXQgaGF2ZSBhIHRyYW5zY3JpcHQuCiAgICAgICAgbWF4X3Jlc3VsdHM6IE1heCBudW1iZXIgb2YgcmVzdWx0cyB0byByZXR1cm4gKGRlZmF1bHQgMjApLgogICAgIiIiCiAgICByZXNwID0gX2FwaV9nZXQoIi9maWxlL3NpbXBsZS93ZWIiKQogICAgaWYgaXNpbnN0YW5jZShyZXNwLCBkaWN0KToKICAgICAgICByZWNvcmRpbmdzID0gcmVzcC5nZXQoImRhdGFfZmlsZV9saXN0Iikgb3IgcmVzcC5nZXQoImRhdGEiKSBvciBbXQogICAgZWxzZToKICAgICAgICByZWNvcmRpbmdzID0gcmVzcCBpZiBpc2luc3RhbmNlKHJlc3AsIGxpc3QpIGVsc2UgW10KCiAgICBkZWYgbWF0Y2hlcyhyOiBkaWN0KSAtPiBib29sOgogICAgICAgIGlmIG9ubHlfd2l0aF90cmFuc2NyaXB0IGFuZCBub3Qgci5nZXQoImlzX3RyYW5zIik6CiAgICAgICAgICAgIHJldHVybiBGYWxzZQogICAgICAgIHRpdGxlID0gKHIuZ2V0KCJmaWxlbmFtZSIpIG9yIHIuZ2V0KCJmaWxlX25hbWUiKSBvciByLmdldCgidGl0bGUiKSBvciAiIikubG93ZXIoKQogICAgICAgIGlmIHRpdGxlX2NvbnRhaW5zIGFuZCB0aXRsZV9jb250YWlucy5sb3dlcigpIG5vdCBpbiB0aXRsZToKICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgaWYgc3RhcnRfZGF0ZSBvciBlbmRfZGF0ZToKICAgICAgICAgICAgdHNfbXMgPSByLmdldCgic3RhcnRfdGltZSIsIDApCiAgICAgICAgICAgIHJlY19kYXRlID0gZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0c19tcyAvIDEwMDAsIHR6PXRpbWV6b25lLnV0YykuZGF0ZSgpCiAgICAgICAgICAgIGlmIHN0YXJ0X2RhdGUgYW5kIHJlY19kYXRlIDwgZGF0ZXRpbWUuZnJvbWlzb2Zvcm1hdChzdGFydF9kYXRlKS5kYXRlKCk6CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKICAgICAgICAgICAgaWYgZW5kX2RhdGUgYW5kIHJlY19kYXRlID4gZGF0ZXRpbWUuZnJvbWlzb2Zvcm1hdChlbmRfZGF0ZSkuZGF0ZSgpOgogICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBtYXRjaGVkID0gW3IgZm9yIHIgaW4gcmVjb3JkaW5ncyBpZiBtYXRjaGVzKHIpXVs6bWF4X3Jlc3VsdHNdCiAgICByZXR1cm4ganNvbi5kdW1wcyhbX3N1bW1hcmlzZV9yZWNvcmRpbmcocikgZm9yIHIgaW4gbWF0Y2hlZF0sIGluZGVudD0yKQoKCkBtY3AudG9vbCgpCmRlZiBwbGF1ZF9nZXRfdHJhbnNjcmlwdChyZWNvcmRpbmdfaWQ6IHN0cikgLT4gc3RyOgogICAgIiIiCiAgICBHZXQgdGhlIGZ1bGwgdHJhbnNjcmlwdCBmb3IgYSBQbGF1ZCByZWNvcmRpbmcuCgogICAgQXJnczoKICAgICAgICByZWNvcmRpbmdfaWQ6IFRoZSByZWNvcmRpbmcgSUQgKGZyb20gcGxhdWRfbGlzdF9yZWNvcmRpbmdzKS4KICAgICIiIgogICAgcmVzcCA9IF9hcGlfZ2V0KGYiL2ZpbGUvZGV0YWlsL3tyZWNvcmRpbmdfaWR9IikKICAgIGRhdGEgPSByZXNwLmdldCgiZGF0YSIsIHJlc3ApIGlmIGlzaW5zdGFuY2UocmVzcCwgZGljdCkgZWxzZSByZXNwCgogICAgdGl0bGUgPSBkYXRhLmdldCgiZmlsZV9uYW1lIikgb3IgZGF0YS5nZXQoImZpbGVuYW1lIikgb3IgZGF0YS5nZXQoInRpdGxlIikgb3IgIih1bnRpdGxlZCkiCiAgICBjb250ZW50X2xpc3QgPSBkYXRhLmdldCgiY29udGVudF9saXN0Iikgb3IgW10KICAgIHRyYW5zY3JpcHQgPSAiIgoKICAgICMgVHJ5IHBvbGlzaGVkIHRyYW5zY3JpcHQgZmlyc3QsIGZhbGwgYmFjayB0byByYXcKICAgIGZvciBkdHlwZSBpbiAoInRyYW5zYWN0aW9uX3BvbGlzaCIsICJ0cmFuc2FjdGlvbiIpOgogICAgICAgIHVybCA9IF9nZXRfY29udGVudF91cmwoY29udGVudF9saXN0LCBkdHlwZSkKICAgICAgICBpZiB1cmw6CiAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgIHNlZ21lbnRzID0gX2ZldGNoX3MzX2pzb24odXJsKQogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWdtZW50cywgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgdHJhbnNjcmlwdCA9IF9mb3JtYXRfdHJhbnNjcmlwdChzZWdtZW50cykKICAgICAgICAgICAgICAgICAgICBpZiB0cmFuc2NyaXB0OgogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICB0cmFuc2NyaXB0ID0gZiJFcnJvciBmZXRjaGluZyB0cmFuc2NyaXB0OiB7ZX0iCiAgICAgICAgICAgICAgICBicmVhawoKICAgIHJldHVybiBqc29uLmR1bXBzKHsKICAgICAgICAiaWQiOiByZWNvcmRpbmdfaWQsCiAgICAgICAgInRpdGxlIjogdGl0bGUsCiAgICAgICAgImRhdGUiOiBfZm10X2RhdGUoZGF0YS5nZXQoInN0YXJ0X3RpbWUiLCAwKSksCiAgICAgICAgImR1cmF0aW9uIjogX2ZtdF9kdXJhdGlvbihkYXRhLmdldCgiZHVyYXRpb24iLCAwKSksCiAgICAgICAgInRyYW5zY3JpcHQiOiB0cmFuc2NyaXB0IG9yICJObyB0cmFuc2NyaXB0IGF2YWlsYWJsZSBmb3IgdGhpcyByZWNvcmRpbmcuIiwKICAgIH0sIGluZGVudD0yKQoKCkBtY3AudG9vbCgpCmRlZiBwbGF1ZF9nZXRfc3VtbWFyeShyZWNvcmRpbmdfaWQ6IHN0cikgLT4gc3RyOgogICAgIiIiCiAgICBHZXQgdGhlIEFJLWdlbmVyYXRlZCBzdW1tYXJ5L21lZXRpbmcgbm90ZXMgZm9yIGEgUGxhdWQgcmVjb3JkaW5nLgoKICAgIFRyaWVzIGF1dG9fc3VtX25vdGUgKHJpY2ggQUkgbWVldGluZyBub3RlcyBhcyBzaG93biBpbiBQbGF1ZCB3ZWIgVUkpIGZpcnN0LAogICAgdGhlbiBmYWxscyBiYWNrIHRvIG91dGxpbmUgKHRpbWVzdGFtcGVkIHRvcGljIGxpc3QpLgogICAgVGhlIHJlc3BvbnNlIGluY2x1ZGVzIGEgc3VtbWFyeV90eXBlIGZpZWxkIGluZGljYXRpbmcgd2hpY2ggd2FzIHJldHVybmVkLgoKICAgIEFyZ3M6CiAgICAgICAgcmVjb3JkaW5nX2lkOiBUaGUgcmVjb3JkaW5nIElEIChmcm9tIHBsYXVkX2xpc3RfcmVjb3JkaW5ncykuCiAgICAiIiIKICAgIHJlc3AgPSBfYXBpX2dldChmIi9maWxlL2RldGFpbC97cmVjb3JkaW5nX2lkfSIpCiAgICBkYXRhID0gcmVzcC5nZXQoImRhdGEiLCByZXNwKSBpZiBpc2luc3RhbmNlKHJlc3AsIGRpY3QpIGVsc2UgcmVzcAoKICAgIHRpdGxlID0gZGF0YS5nZXQoImZpbGVfbmFtZSIpIG9yIGRhdGEuZ2V0KCJmaWxlbmFtZSIpIG9yIGRhdGEuZ2V0KCJ0aXRsZSIpIG9yICIodW50aXRsZWQpIgogICAgY29udGVudF9saXN0ID0gZGF0YS5nZXQoImNvbnRlbnRfbGlzdCIpIG9yIFtdCiAgICBzdW1tYXJ5ID0gIiIKICAgIHN1bW1hcnlfdHlwZSA9ICIiCgogICAgIyAxLiBUcnkgcmljaCBBSSBtZWV0aW5nIG5vdGVzICgic3VtbWFyeSIgdGFiIGluIFBsYXVkIHdlYiBVSSkKICAgIHVybCA9IF9nZXRfY29udGVudF91cmwoY29udGVudF9saXN0LCAiYXV0b19zdW1fbm90ZSIpCiAgICBpZiB1cmw6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBzdW1tYXJ5ID0gX2ZldGNoX3MzX3RleHQodXJsKQogICAgICAgICAgICBpZiBzdW1tYXJ5LnN0cmlwKCk6CiAgICAgICAgICAgICAgICBzdW1tYXJ5X3R5cGUgPSAiYXV0b19zdW1fbm90ZSIKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHN1bW1hcnkgPSBmIkVycm9yIGZldGNoaW5nIEFJIHN1bW1hcnk6IHtlfSIKCiAgICAjIDIuIEZhbGwgYmFjayB0byB0aW1lc3RhbXBlZCB0b3BpYyBvdXRsaW5lCiAgICBpZiBub3Qgc3VtbWFyeS5zdHJpcCgpOgogICAgICAgIHVybCA9IF9nZXRfY29udGVudF91cmwoY29udGVudF9saXN0LCAib3V0bGluZSIpCiAgICAgICAgaWYgdXJsOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICBvdXRsaW5lX2RhdGEgPSBfZmV0Y2hfczNfanNvbih1cmwpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG91dGxpbmVfZGF0YSwgZGljdCk6CiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9IGpzb24uZHVtcHMob3V0bGluZV9kYXRhLCBpbmRlbnQ9MikKICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdXRsaW5lX2RhdGEsIGxpc3QpOgogICAgICAgICAgICAgICAgICAgIHBhcnRzID0gW10KICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBvdXRsaW5lX2RhdGE6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgZGljdCk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoaXRlbS5nZXQoImNvbnRlbnQiKSBvciBpdGVtLmdldCgidGV4dCIpIG9yIHN0cihpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChzdHIoaXRlbSkpCiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9ICJcblxuIi5qb2luKHAgZm9yIHAgaW4gcGFydHMgaWYgcCkKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeSA9IHN0cihvdXRsaW5lX2RhdGEpCiAgICAgICAgICAgICAgICBpZiBzdW1tYXJ5LnN0cmlwKCk6CiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeV90eXBlID0gIm91dGxpbmUiCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIHN1bW1hcnkgPSBmIkVycm9yIGZldGNoaW5nIG91dGxpbmU6IHtlfSIKCiAgICByZXR1cm4ganNvbi5kdW1wcyh7CiAgICAgICAgImlkIjogcmVjb3JkaW5nX2lkLAogICAgICAgICJ0aXRsZSI6IHRpdGxlLAogICAgICAgICJkYXRlIjogX2ZtdF9kYXRlKGRhdGEuZ2V0KCJzdGFydF90aW1lIiwgMCkpLAogICAgICAgICJzdW1tYXJ5X3R5cGUiOiBzdW1tYXJ5X3R5cGUgb3IgIm5vbmUiLAogICAgICAgICJzdW1tYXJ5Ijogc3VtbWFyeSBvciAiTm8gc3VtbWFyeSBhdmFpbGFibGUgZm9yIHRoaXMgcmVjb3JkaW5nLiIsCiAgICB9LCBpbmRlbnQ9MikKCgpAbWNwLnRvb2woKQpkZWYgcGxhdWRfZ2V0X25vdGVzKHJlY29yZGluZ19pZDogc3RyKSAtPiBzdHI6CiAgICAiIiIKICAgIEdldCBBSS1nZW5lcmF0ZWQgbm90ZXMgYW5kIGFjdGlvbiBpdGVtcyBmb3IgYSBQbGF1ZCByZWNvcmRpbmcuCiAgICBSZXR1cm5zIGFsbCBub3RlIGVudHJpZXMgZnJvbSB0aGUgY29udGVudF9saXN0IChvdXRsaW5lLCBoaWdobGlnaHRzLCBhY3Rpb24gaXRlbXMsIGV0Yy4pLgoKICAgIEFyZ3M6CiAgICAgICAgcmVjb3JkaW5nX2lkOiBUaGUgcmVjb3JkaW5nIElEIChmcm9tIHBsYXVkX2xpc3RfcmVjb3JkaW5ncykuCiAgICAiIiIKICAgIHJlc3AgPSBfYXBpX2dldChmIi9maWxlL2RldGFpbC97cmVjb3JkaW5nX2lkfSIpCiAgICBkYXRhID0gcmVzcC5nZXQoImRhdGEiLCByZXNwKSBpZiBpc2luc3RhbmNlKHJlc3AsIGRpY3QpIGVsc2UgcmVzcAoKICAgIHRpdGxlID0gZGF0YS5nZXQoImZpbGVfbmFtZSIpIG9yIGRhdGEuZ2V0KCJmaWxlbmFtZSIpIG9yIGRhdGEuZ2V0KCJ0aXRsZSIpIG9yICIodW50aXRsZWQpIgogICAgY29udGVudF9saXN0ID0gZGF0YS5nZXQoImNvbnRlbnRfbGlzdCIpIG9yIFtdCiAgICBub3RlcyA9IFtdCgogICAgZm9yIGl0ZW0gaW4gY29udGVudF9saXN0OgogICAgICAgIGR0eXBlID0gaXRlbS5nZXQoImRhdGFfdHlwZSIsICIiKQogICAgICAgIHVybCA9IGl0ZW0uZ2V0KCJkYXRhX2xpbmsiKQogICAgICAgIGlmIG5vdCB1cmwgb3IgZHR5cGUgaW4gKCJ0cmFuc2FjdGlvbiIsICJ0cmFuc2FjdGlvbl9wb2xpc2giKToKICAgICAgICAgICAgY29udGludWUgICMgU2tpcCByYXcgdHJhbnNjcmlwdCB0eXBlcwoKICAgICAgICBub3RlX3RpdGxlID0gaXRlbS5nZXQoImRhdGFfdGl0bGUiKSBvciBpdGVtLmdldCgiZGF0YV90YWJfbmFtZSIpIG9yIGR0eXBlCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIFVzZSBfdGV4dCBmZXRjaGVyIGZvciBhdXRvX3N1bV9ub3RlIChtYXkgbm90IGJlIEpTT04pCiAgICAgICAgICAgIGlmIGR0eXBlID09ICJhdXRvX3N1bV9ub3RlIjoKICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBfZmV0Y2hfczNfdGV4dCh1cmwpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBub3RlX2RhdGEgPSBfZmV0Y2hfczNfanNvbih1cmwpCiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG5vdGVfZGF0YSwgbGlzdCk6CiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9ICJcbiIuam9pbigKICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHNlZy5nZXQoImNvbnRlbnQiKSBvciBzZWcuZ2V0KCJ0ZXh0Iikgb3Igc2VnKQogICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2VnIGluIG5vdGVfZGF0YSBpZiBzZWcKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm90ZV9kYXRhLCBkaWN0KToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0ganNvbi5kdW1wcyhub3RlX2RhdGEsIGluZGVudD0yKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gc3RyKG5vdGVfZGF0YSkKCiAgICAgICAgICAgIGlmIGNvbnRlbnQuc3RyaXAoKToKICAgICAgICAgICAgICAgIG5vdGVzLmFwcGVuZCh7InR5cGUiOiBkdHlwZSwgInRpdGxlIjogbm90ZV90aXRsZSwgImNvbnRlbnQiOiBjb250ZW50fSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIG5vdGVzLmFwcGVuZCh7InR5cGUiOiBkdHlwZSwgInRpdGxlIjogbm90ZV90aXRsZSwgImNvbnRlbnQiOiBmIkVycm9yOiB7ZX0ifSkKCiAgICByZXR1cm4ganNvbi5kdW1wcyh7CiAgICAgICAgImlkIjogcmVjb3JkaW5nX2lkLAogICAgICAgICJ0aXRsZSI6IHRpdGxlLAogICAgICAgICJkYXRlIjogX2ZtdF9kYXRlKGRhdGEuZ2V0KCJzdGFydF90aW1lIiwgMCkpLAogICAgICAgICJub3RlcyI6IG5vdGVzIGlmIG5vdGVzIGVsc2UgW3sidHlwZSI6ICJub25lIiwgImNvbnRlbnQiOiAiTm8gbm90ZXMgYXZhaWxhYmxlIGZvciB0aGlzIHJlY29yZGluZy4ifV0sCiAgICB9LCBpbmRlbnQ9MikKCgpAbWNwLnRvb2woKQpkZWYgcGxhdWRfZ2V0X3JlY29yZGluZ19kZXRhaWwocmVjb3JkaW5nX2lkOiBzdHIpIC0+IHN0cjoKICAgICIiIgogICAgR2V0IGZ1bGwgbWV0YWRhdGEgZm9yIGEgUGxhdWQgcmVjb3JkaW5nIGluY2x1ZGluZyB0aXRsZSwgZGF0ZSwgZHVyYXRpb24sCiAgICB0cmFuc2NyaXB0IGF2YWlsYWJpbGl0eSwgYW5kIGF2YWlsYWJsZSBjb250ZW50IHR5cGVzLgoKICAgIEFyZ3M6CiAgICAgICAgcmVjb3JkaW5nX2lkOiBUaGUgcmVjb3JkaW5nIElEIChmcm9tIHBsYXVkX2xpc3RfcmVjb3JkaW5ncykuCiAgICAiIiIKICAgIHJlc3AgPSBfYXBpX2dldChmIi9maWxlL2RldGFpbC97cmVjb3JkaW5nX2lkfSIpCiAgICBkYXRhID0gcmVzcC5nZXQoImRhdGEiLCByZXNwKSBpZiBpc2luc3RhbmNlKHJlc3AsIGRpY3QpIGVsc2UgcmVzcAoKICAgIGNvbnRlbnRfbGlzdCA9IGRhdGEuZ2V0KCJjb250ZW50X2xpc3QiKSBvciBbXQogICAgY29udGVudF90eXBlcyA9IFtpdGVtLmdldCgiZGF0YV90eXBlIikgZm9yIGl0ZW0gaW4gY29udGVudF9saXN0IGlmIGl0ZW0uZ2V0KCJkYXRhX3R5cGUiKV0KCiAgICByZXR1cm4ganNvbi5kdW1wcyh7CiAgICAgICAgImlkIjogcmVjb3JkaW5nX2lkLAogICAgICAgICJ0aXRsZSI6IGRhdGEuZ2V0KCJmaWxlX25hbWUiKSBvciBkYXRhLmdldCgiZmlsZW5hbWUiKSBvciBkYXRhLmdldCgidGl0bGUiKSBvciAiKHVudGl0bGVkKSIsCiAgICAgICAgImRhdGUiOiBfZm10X2RhdGUoZGF0YS5nZXQoInN0YXJ0X3RpbWUiLCAwKSksCiAgICAgICAgImR1cmF0aW9uIjogX2ZtdF9kdXJhdGlvbihkYXRhLmdldCgiZHVyYXRpb24iLCAwKSksCiAgICAgICAgImhhc190cmFuc2NyaXB0IjogInRyYW5zYWN0aW9uIiBpbiBjb250ZW50X3R5cGVzIG9yICJ0cmFuc2FjdGlvbl9wb2xpc2giIGluIGNvbnRlbnRfdHlwZXMsCiAgICAgICAgImhhc19zdW1tYXJ5IjogImF1dG9fc3VtX25vdGUiIGluIGNvbnRlbnRfdHlwZXMgb3IgIm91dGxpbmUiIGluIGNvbnRlbnRfdHlwZXMsCiAgICAgICAgImNvbnRlbnRfdHlwZXMiOiBjb250ZW50X3R5cGVzLAogICAgICAgICJkZXZpY2UiOiBkYXRhLmdldCgic2VyaWFsX251bWJlciIpIG9yIGRhdGEuZ2V0KCJkZXZpY2VfbmFtZSIpIG9yICJ1bmtub3duIiwKICAgICAgICAidGFncyI6IGRhdGEuZ2V0KCJmaWxldGFnX2lkX2xpc3QiKSBvciBkYXRhLmdldCgiZmlsZXRhZyIpIG9yIFtdLAogICAgfSwgaW5kZW50PTIpCgoKQG1jcC50b29sKCkKZGVmIHBsYXVkX3VzZXJfaW5mbygpIC0+IHN0cjoKICAgICIiIkdldCB0aGUgY3VycmVudCBQbGF1ZCBhY2NvdW50IGluZm9ybWF0aW9uIGFuZCBjb25uZWN0aW9uIHN0YXR1cy4iIiIKICAgIHJldHVybiBqc29uLmR1bXBzKHsKICAgICAgICAicmVnaW9uIjogUExBVURfUkVHSU9OLAogICAgICAgICJhcGlfYmFzZSI6IEJBU0VfVVJMLAogICAgICAgICJ0b2tlbl9sb2FkZWQiOiBib29sKF9sb2FkX3Rva2VuKCkpLAogICAgfSwgaW5kZW50PTIpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIG1jcC5ydW4oKQo= |