{
  "payload": {
    "version": "1.1.0",
    "protocol": "zhuge-im-v1",
    "api_major": 1,
    "storage_version": 1,
    "files": {
      "bootstrap.js": "7635493d28fcbfb0188db95596cb7177be9eda49d19ea944198eb308bd964713",
      "build.mjs": "45feb781439cc3de4b2ff7d497ad1972cefc4a76dfa403b81ca6810656b75c1f",
      "config.js": "36946cf75ff79b62e6606147425b58d10dc11df2cff31d39b9508135b2a30411",
      "extension-host.js": "3d6c9480a79f8f2d489e8158d977404131c9808aba5fc6d417366a0ad5fcd9df",
      "extension-schema.js": "5ce6a6d9c2f857ff57712974f7832872d0093f4b3944a022cba8dedbc3a6a214",
      "extension-worker.js": "3159ffbc7b7ca6099308b8161acfeef0839113321bb13ad0cb34953525d4fc02",
      "extensions-page.js": "2da43a47c8e7df6ecf05b239f2f214fbb7b1a63d6b4103183301c3ef51221f9a",
      "guard.mjs": "edd71cb2b6f6a729bc123649dba2201531145ba8fadb32c80c20ddceeb2413fe",
      "integrity.js": "19a593743549d4963b15d1b28cd85162687b46ed84b778becb2adf71682ad8d1",
      "recovery.html": "a56c1f38279f9e4614403332d9fafef47a779778d166da9e6991313f04f82818",
      "recovery.js": "759f3c2549a71684707cb8c1bcd2cdb12f8355aa43cf6a774e258816eb7ccca9",
      "release-key.json": "fac5a606b5a942538f373ca29639d998405f0b794a323c8577c8a55456906962",
      "sdk.js": "be567531a67b8204931ba3ec83d547149b4bddacaa87fcba06b17e37b18586cd",
      "server.mjs": "da3121afb2ed37bf5569351e9834ce9962c570611dde0dd9cf800c8fb5871b13",
      "src/client.ts": "e72c907dfc37cb6c336957eda5d9cb1d11d0a88eb0489f1c26298d156e4b9e3e",
      "src/client.js": "63e8c1a60be59d216410dd9235823de1b6d1ede0d6dd754c587cbd12d69b36d1",
      "src/storage.ts": "f862ad2af24bc9443cf56943c18490fee49e760e50e0305f8bece6d2a2713a0b",
      "src/storage.js": "42ec41b51d55927a7304cad179470bf0a2996c260ed3dfffc20692ca4b976290"
    },
    "baseline": {
      "bootstrap.js": "Ly8gVmVyaWZ5IGJlZm9yZSBpbXBvcnRpbmcgdGhlIGNvbW11bmljYXRpb24gbW9kdWxlLCBpbmNsdWRpbmcgb24gc3RhdGljIEhUVFBTIGhvc3RpbmcuCmNvbnN0IG5vdGljZT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWNlJyksY29ubmVjdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29ubmVjdCcpOwpjb25uZWN0LmRpc2FibGVkPXRydWU7bm90aWNlLnRleHRDb250ZW50PSfmraPlnKjmo4Dmn6XpgJrkv6HnqIvluo/igKYnOwp0cnl7Y29uc3Qge2NoZWNrQ29yZX09YXdhaXQgaW1wb3J0KCcuL2ludGVncml0eS5qcycpO2F3YWl0IGNoZWNrQ29yZSgpO2F3YWl0IGltcG9ydCgnLi9hcHAuanMnKTtjb25uZWN0LmRpc2FibGVkPWZhbHNlO30KY2F0Y2goZXJyb3Ipe25vdGljZS50ZXh0Q29udGVudD1g56iL5bqP5qOA5p+l5pyq5a6M5oiQ77yaJHtlcnJvci5tZXNzYWdlfeOAguivt+aJk+W8gOKAnOajgOafpeS4juaBouWkjeKAne+8jOaIlumHjeaWsOS4i+i9veWujOaVtOWPr+WumuWItueJiOOAgmA7Y29ubmVjdC5kaXNhYmxlZD10cnVlO30K",
      "build.mjs": "aW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnOwppbXBvcnQge3JlYWRGaWxlLHdyaXRlRmlsZX0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7CmlmKCFwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tZXhwZXJpbWVudGFsJykpdGhyb3cgbmV3IEVycm9yKCfnm7TmjqXnvJbor5HkvJrmlLnlj5jlj5fkv53miqTnmoTpgJrkv6HmoLjlv4PjgILor7flhYjov5DooYwgbm9kZSBndWFyZC5tanMgZXhwZXJpbWVudO+8jOWcqOWunumqjOWJr+acrOS4reS9v+eUqCAtLWV4cGVyaW1lbnRhbO+8m+WunumqjOeJiOS4jeiDveWGkuWFheWumOaWueeJiOacrOOAgicpOwpmb3IoY29uc3QgbmFtZSBvZiBbJ2NsaWVudCcsJ3N0b3JhZ2UnXSl7CiAgY29uc3Qgc291cmNlPWF3YWl0IHJlYWRGaWxlKG5ldyBVUkwoYHNyYy8ke25hbWV9LnRzYCxpbXBvcnQubWV0YS51cmwpLCd1dGY4Jyk7CiAgY29uc3QgcmVzdWx0PXRzLnRyYW5zcGlsZU1vZHVsZShzb3VyY2Use2NvbXBpbGVyT3B0aW9uczp7dGFyZ2V0OnRzLlNjcmlwdFRhcmdldC5FUzIwMjIsbW9kdWxlOnRzLk1vZHVsZUtpbmQuRVMyMDIyfX0pOwogIGF3YWl0IHdyaXRlRmlsZShuZXcgVVJMKGBzcmMvJHtuYW1lfS5qc2AsaW1wb3J0Lm1ldGEudXJsKSxyZXN1bHQub3V0cHV0VGV4dC5yZXBsYWNlKC9mcm9tICJcLlwvc3RvcmFnZSIvZywnZnJvbSAiLi9zdG9yYWdlLmpzIicpKTsKfQo=",
      "config.js": "Ly8gUHVibGljIHBsYXRmb3JtIGFkZHJlc3Mgb25seS4gTmV2ZXIgcHV0IGFuIGFjY2VzcyB0b2tlbiBpbiB0aGlzIGZpbGUuCmV4cG9ydCBjb25zdCBwbGF0Zm9ybU9yaWdpbiA9ICdodHRwczovL3podWdlanVuc2hpLmNvbSc7Cg==",
      "extension-host.js": "aW1wb3J0IHt2YWxpZGF0ZUV4dGVuc2lvbixleHRlbnNpb25EaWdlc3R9IGZyb20gJy4vZXh0ZW5zaW9uLXNjaGVtYS5qcyc7CmltcG9ydCB7cGxhdGZvcm1PcmlnaW59IGZyb20gJy4vY29uZmlnLmpzJzsKZXhwb3J0IGNvbnN0IEVYVEVOU0lPTl9LRVk9J3podWdlLWRpcmVjdC1pbS1leHRlbnNpb25zLXYxJzsKZXhwb3J0IGZ1bmN0aW9uIGluc3RhbGxlZEV4dGVuc2lvbnMoKXt0cnl7Y29uc3Qgdj1KU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKEVYVEVOU0lPTl9LRVkpfHwnW10nKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh2KT92LnNsaWNlKDAsMjApOltdO31jYXRjaHtyZXR1cm4gW107fX0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRFeHRlbnNpb24ocmVjb3JkKXsKICBpZih0eXBlb2YgcmVjb3JkPy50ZXh0IT09J3N0cmluZyd8fHJlY29yZC50ZXh0Lmxlbmd0aD42NTUzNil0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleaWh+S7tuaXoOaViOOAgicpOwogIGNvbnN0IGV4dGVuc2lvbj12YWxpZGF0ZUV4dGVuc2lvbihKU09OLnBhcnNlKHJlY29yZC50ZXh0KSk7CiAgY29uc3QgZGlnZXN0PWF3YWl0IGV4dGVuc2lvbkRpZ2VzdChyZWNvcmQudGV4dCk7CiAgaWYocmVjb3JkLmRpZ2VzdCE9PWRpZ2VzdCl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleWGheWuueW3sue7j+WPmOWMlu+8jOivt+mHjeaWsOWvvOWFpeW5tuaOiOadg+OAgicpOwogIHJldHVybiB7ZXh0ZW5zaW9uLGRpZ2VzdH07Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrTWFya2V0UmVjb3JkKHJlY29yZCl7CiAgaWYoIXJlY29yZC5yZWxlYXNlX2lkKXJldHVybjsKICBpZighL15bYS1mMC05XXszMn0kLy50ZXN0KHJlY29yZC5yZWxlYXNlX2lkKSl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleadpea6kOaXoOaViOOAgicpOwogIGNvbnN0IHJlc3BvbnNlPWF3YWl0IGZldGNoKGAke3BsYXRmb3JtT3JpZ2lufS9hcGkvaW0tZGlyZWN0L2V4dGVuc2lvbnMvY2F0YWxvZy8ke3JlY29yZC5yZWxlYXNlX2lkfWAse2NyZWRlbnRpYWxzOidvbWl0JyxjYWNoZTonbm8tc3RvcmUnLHNpZ25hbDpBYm9ydFNpZ25hbC50aW1lb3V0KDgwMDApfSk7CiAgaWYoIXJlc3BvbnNlLm9rKXRocm93IG5ldyBFcnJvcign6K+l54mI5pys5pqC5LiN5Y+v55So77yM6K+35Yiw5omp5bGV5biC5Zy65p+l55yL44CCJyk7CiAgY29uc3QgcmVsZWFzZT1hd2FpdCByZXNwb25zZS5qc29uKCk7aWYocmVsZWFzZS5zaGEyNTYhPT1yZWNvcmQuZGlnZXN0fHxyZWxlYXNlLnN0YXR1cyE9PSdhcHByb3ZlZCcpdGhyb3cgbmV3IEVycm9yKCfor6XniYjmnKzlt7Llj5jmm7TmiJblgZzmraLliIblj5HjgIInKTsKfQpleHBvcnQgZnVuY3Rpb24gbW91bnRFeHRlbnNpb25zKHJvb3Qse2dldERyYWZ0LHNldERyYWZ0LGdldENvbnRleHQsbm90aWNlfSl7CiAgbGV0IGdlbmVyYXRpb249MCx3b3JrZXJzPW5ldyBTZXQoKTsKICBjb25zdCBlbGVtZW50PSh0YWcsdGV4dCk9Pntjb25zdCBlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7aWYodGV4dCE9PXVuZGVmaW5lZCllbC50ZXh0Q29udGVudD10ZXh0O3JldHVybiBlbDt9OwogIGNvbnN0IHJlc2V0PSgpPT57Z2VuZXJhdGlvbisrO2Zvcihjb25zdCB3IG9mIHdvcmtlcnMpdy50ZXJtaW5hdGUoKTt3b3JrZXJzLmNsZWFyKCk7cm9vdC5yZXBsYWNlQ2hpbGRyZW4oKTt9OwogIGFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpewogICAgcmVzZXQoKTtjb25zdCBlcG9jaD1nZW5lcmF0aW9uO2NvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCgpOwogICAgaWYoIWNvbnRleHQpe3Jvb3QudGV4dENvbnRlbnQ9J+i/nuaOpei0puWPt+WQjuWPr+WQr+eUqOW3suWuieijheeahOaJqeWxleOAgic7cmV0dXJuO30KICAgIGNvbnN0IGl0ZW1zPWluc3RhbGxlZEV4dGVuc2lvbnMoKTtpZighaXRlbXMubGVuZ3RoKXtyb290LnRleHRDb250ZW50PSflsJrmnKrlronoo4XmianlsZXvvIzlj6/ku47igJznrqHnkIbmiJHnmoTmianlsZXigJ3mt7vliqDjgIInO3JldHVybjt9CiAgICBmb3IoY29uc3QgcmVjb3JkIG9mIGl0ZW1zKXsKICAgICAgdHJ5ewogICAgICAgIGNvbnN0IHtleHRlbnNpb246ZX09YXdhaXQgcmVhZEV4dGVuc2lvbihyZWNvcmQpO2lmKGVwb2NoIT09Z2VuZXJhdGlvbilyZXR1cm47CiAgICAgICAgY29uc3Qgcm93PWVsZW1lbnQoJ2RpdicpO3Jvdy5jbGFzc05hbWU9J2V4dGVuc2lvbi1yb3cnOwogICAgICAgIHJvdy5hcHBlbmQoZWxlbWVudCgncCcsYCR7ZS5uYW1lfSDCtyAke2UudmVyc2lvbn0gwrcgJHtyZWNvcmQucmVsZWFzZV9pZD8n5biC5Zy654mI5pysJzon5pys5Zyw5L+u5pS554mIJ31gKSk7CiAgICAgICAgY29uc3QgY29uc2VudD1lbGVtZW50KCdpbnB1dCcpO2NvbnNlbnQudHlwZT0nY2hlY2tib3gnOwogICAgICAgIGNvbnN0IGxhYmVsPWVsZW1lbnQoJ2xhYmVsJyk7bGFiZWwuYXBwZW5kKGNvbnNlbnQsZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoYCDmnKzmrKHov57mjqXlhYHorrjvvJoke2UucGVybWlzc2lvbnMubWFwKHA9PnA9PT0nZHJhZnQucmVhZCc/J+ivu+WPluW9k+WJjeiNieeovyc6J+e7j+aIkeaTjeS9nOWGmeWFpeiNieeovycpLmpvaW4oJ+OAgScpfHwn5LuF55Sf5oiQ6aKE6KeIJ33jgIJgKSk7cm93LmFwcGVuZChsYWJlbCk7CiAgICAgICAgY29uc3QgYnV0dG9ucz1lbGVtZW50KCdkaXYnKTtidXR0b25zLmNsYXNzTmFtZT0ndG9vbHMnOwogICAgICAgIGNvbnN0IG91dHB1dD1lbGVtZW50KCd0ZXh0YXJlYScpO291dHB1dC5yZWFkT25seT10cnVlO291dHB1dC5yb3dzPTM7b3V0cHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsYCR7ZS5uYW1lfeWkhOeQhue7k+aenGApOwogICAgICAgIGNvbnN0IGFwcGx5PWVsZW1lbnQoJ2J1dHRvbicsJ+aUvuWFpeiNieeovycpO2FwcGx5LmRpc2FibGVkPXRydWU7CiAgICAgICAgbGV0IHJlc3VsdENvbnRleHQ9JycscnVuPTA7CiAgICAgICAgY29uc3QgaXNDdXJyZW50PSgpPT5lcG9jaD09PWdlbmVyYXRpb24mJmdldENvbnRleHQoKT09PWNvbnRleHQmJmluc3RhbGxlZEV4dGVuc2lvbnMoKS5zb21lKHI9PnIuZGlnZXN0PT09cmVjb3JkLmRpZ2VzdCYmci50ZXh0PT09cmVjb3JkLnRleHQpOwogICAgICAgIGNvbnNlbnQub25jaGFuZ2U9KCk9PntydW4rKztvdXRwdXQudmFsdWU9Jyc7YXBwbHkuZGlzYWJsZWQ9dHJ1ZTt9OwogICAgICAgIGZvcihjb25zdCBhY3Rpb24gb2YgZS5hY3Rpb25zKXsKICAgICAgICAgIGNvbnN0IGJ1dHRvbj1lbGVtZW50KCdidXR0b24nLGFjdGlvbi5sYWJlbCk7YnV0dG9ucy5hcHBlbmQoYnV0dG9uKTsKICAgICAgICAgIGxldCBxdWFudGl0eSxwcmljZSxzaGlwcGluZzsKICAgICAgICAgIGlmKGFjdGlvbi5vcGVyYXRpb249PT0ncXVvdGUnKXsKICAgICAgICAgICAgY29uc3QgZmllbGRzPWVsZW1lbnQoJ2RpdicpO2ZpZWxkcy5jbGFzc05hbWU9J3Rvb2xzJzsKICAgICAgICAgICAgZm9yKGNvbnN0IFtuYW1lLHRpdGxlLGluaXRpYWxdIG9mIFtbJ3F1YW50aXR5Jywn5pWw6YePJywnMSddLFsncHJpY2UnLCfljZXku7cnLCcwJ10sWydzaGlwcGluZycsJ+i/kOi0uScsJzAnXV0pewogICAgICAgICAgICAgIGNvbnN0IGlucHV0PWVsZW1lbnQoJ2lucHV0Jyk7aW5wdXQudHlwZT0nbnVtYmVyJztpbnB1dC5taW49bmFtZT09PSdxdWFudGl0eSc/JzEnOicwJztpbnB1dC5zdGVwPW5hbWU9PT0ncXVhbnRpdHknPycxJzonLjAxJztpbnB1dC52YWx1ZT1pbml0aWFsO2lucHV0LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsdGl0bGUpO2lucHV0LnN0eWxlLndpZHRoPScxMzBweCc7Y29uc3QgbD1lbGVtZW50KCdsYWJlbCcsdGl0bGUrJyAnKTtsLmFwcGVuZChpbnB1dCk7ZmllbGRzLmFwcGVuZChsKTsKICAgICAgICAgICAgICBpZihuYW1lPT09J3F1YW50aXR5JylxdWFudGl0eT1pbnB1dDtlbHNlIGlmKG5hbWU9PT0ncHJpY2UnKXByaWNlPWlucHV0O2Vsc2Ugc2hpcHBpbmc9aW5wdXQ7CiAgICAgICAgICAgIH1yb3cuYXBwZW5kKGZpZWxkcyk7CiAgICAgICAgICB9CiAgICAgICAgICBidXR0b24ub25jbGljaz1hc3luYygpPT57CiAgICAgICAgICAgIGNvbnN0IGF0dGVtcHQ9KytydW47YXBwbHkuZGlzYWJsZWQ9dHJ1ZTtvdXRwdXQudmFsdWU9Jyc7CiAgICAgICAgICAgIGlmKCFjb25zZW50LmNoZWNrZWR8fCFpc0N1cnJlbnQoKSl7bm90aWNlKCfor7flhYjlkK/nlKjmnKzmrKHov57mjqXmiYDpnIDnmoTmianlsZXmnYPpmZDjgIInKTtyZXR1cm47fQogICAgICAgICAgICBidXR0b24uZGlzYWJsZWQ9dHJ1ZTtsZXQgd29ya2VyLHRpbWVyOwogICAgICAgICAgICB0cnl7CiAgICAgICAgICAgICAgYXdhaXQgcmVhZEV4dGVuc2lvbihyZWNvcmQpO2F3YWl0IGNoZWNrTWFya2V0UmVjb3JkKHJlY29yZCk7CiAgICAgICAgICAgICAgaWYoYXR0ZW1wdCE9PXJ1bnx8IWNvbnNlbnQuY2hlY2tlZHx8IWlzQ3VycmVudCgpKXRocm93IG5ldyBFcnJvcign5omp5bGV5bey5YGc5q2i77yM5pyq6K+75Y+W6I2J56i/44CCJyk7CiAgICAgICAgICAgICAgY29uc3QgaW5wdXQ9e307aWYoZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQucmVhZCcpKWlucHV0LmRyYWZ0PWdldERyYWZ0KCk7CiAgICAgICAgICAgICAgaWYocXVhbnRpdHkpT2JqZWN0LmFzc2lnbihpbnB1dCx7cXVhbnRpdHk6TnVtYmVyKHF1YW50aXR5LnZhbHVlKSxwcmljZTpOdW1iZXIocHJpY2UudmFsdWUpLHNoaXBwaW5nOk51bWJlcihzaGlwcGluZy52YWx1ZSl9KTsKICAgICAgICAgICAgICB3b3JrZXI9bmV3IFdvcmtlcihuZXcgVVJMKCcuL2V4dGVuc2lvbi13b3JrZXIuanMnLGltcG9ydC5tZXRhLnVybCkse3R5cGU6J21vZHVsZSd9KTt3b3JrZXJzLmFkZCh3b3JrZXIpOwogICAgICAgICAgICAgIGNvbnN0IHJlc3VsdD1hd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT57dGltZXI9c2V0VGltZW91dCgoKT0+cmVqZWN0KG5ldyBFcnJvcign5omp5bGV5aSE55CG6LaF5pe244CCJykpLDIwMDApO3dvcmtlci5vbmVycm9yPSgpPT5yZWplY3QobmV3IEVycm9yKCfmianlsZXlpITnkIblpLHotKXjgIInKSk7d29ya2VyLm9ubWVzc2FnZT1ldmVudD0+e2lmKGV2ZW50LmRhdGEuaWQhPT1hdHRlbXB0KXJldHVybjtldmVudC5kYXRhLmVycm9yP3JlamVjdChuZXcgRXJyb3IoZXZlbnQuZGF0YS5lcnJvcikpOnJlc29sdmUoZXZlbnQuZGF0YS5yZXN1bHQpO307d29ya2VyLnBvc3RNZXNzYWdlKHtpZDphdHRlbXB0LGV4dGVuc2lvbjplLGFjdGlvbjphY3Rpb24uaWQsaW5wdXR9KTt9KTsKICAgICAgICAgICAgICBpZihhdHRlbXB0IT09cnVufHwhY29uc2VudC5jaGVja2VkfHwhaXNDdXJyZW50KCkpdGhyb3cgbmV3IEVycm9yKCfkvJror53miJbmjojmnYPlt7LmlLnlj5jvvIzmnKrlhpnlhaXojYnnqL/jgIInKTsKICAgICAgICAgICAgICBpZih0eXBlb2YgcmVzdWx0IT09J3N0cmluZyd8fHJlc3VsdC5sZW5ndGg+NDAwMCl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxlei/lOWbnuWGheWuueaXoOaViOOAgicpOwogICAgICAgICAgICAgIG91dHB1dC52YWx1ZT1yZXN1bHQ7cmVzdWx0Q29udGV4dD1jb250ZXh0O2FwcGx5LmRpc2FibGVkPSFlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdkcmFmdC53cml0ZScpOwogICAgICAgICAgICB9Y2F0Y2goZXJyb3Ipe25vdGljZShlcnJvci5tZXNzYWdlKTt9ZmluYWxseXtjbGVhclRpbWVvdXQodGltZXIpO2lmKHdvcmtlcil7d29ya2VyLnRlcm1pbmF0ZSgpO3dvcmtlcnMuZGVsZXRlKHdvcmtlcik7fWJ1dHRvbi5kaXNhYmxlZD1mYWxzZTt9CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBhcHBseS5vbmNsaWNrPSgpPT57aWYoIWNvbnNlbnQuY2hlY2tlZHx8IWlzQ3VycmVudCgpfHxyZXN1bHRDb250ZXh0IT09Z2V0Q29udGV4dCgpfHwhZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQud3JpdGUnKSl7bm90aWNlKCfmjojmnYPmiJbkvJror53lt7LmlLnlj5jvvIzor7fph43mlrDlpITnkIbjgIInKTthcHBseS5kaXNhYmxlZD10cnVlO3JldHVybjt9c2V0RHJhZnQob3V0cHV0LnZhbHVlKTtub3RpY2UoJ+W3suaUvuWFpeiNieeov++8jOivt+ajgOafpeWQjuiHquihjOWPkemAgeOAgicpO2FwcGx5LmRpc2FibGVkPXRydWU7fTsKICAgICAgICByb3cuYXBwZW5kKGJ1dHRvbnMsb3V0cHV0LGFwcGx5KTtyb290LmFwcGVuZChyb3cpOwogICAgICB9Y2F0Y2goZXJyb3Ipe3Jvb3QuYXBwZW5kKGVsZW1lbnQoJ3AnLGVycm9yLm1lc3NhZ2UpKTt9CiAgICB9CiAgfQogIHJldHVybiB7cmVuZGVyLHJlc2V0fTsKfQo=",
      "extension-schema.js": "Ly8gVGhpcyBzY2hlbWEgaXMgZGVsaWJlcmF0ZWx5IGEgZGF0YS1vbmx5IGxhbmd1YWdlLiBVbmtub3duIHByb3BlcnRpZXMgYXJlIHJlamVjdGVkLgpleHBvcnQgY29uc3QgUEVSTUlTU0lPTlM9T2JqZWN0LmZyZWV6ZShbJ2RyYWZ0LnJlYWQnLCdkcmFmdC53cml0ZSddKTsKY29uc3Qgb2JqZWN0PXY9PnYhPT1udWxsJiZ0eXBlb2Ygdj09PSdvYmplY3QnJiYhQXJyYXkuaXNBcnJheSh2KTsKZnVuY3Rpb24ga2V5cyh2YWx1ZSxhbGxvd2VkKXtpZighb2JqZWN0KHZhbHVlKXx8T2JqZWN0LmtleXModmFsdWUpLnNvbWUoaz0+IWFsbG93ZWQuaW5jbHVkZXMoaykpKXRocm93IG5ldyBFcnJvcign5omp5bGV5YyF5ZCr5LiN5pSv5oyB55qE5a2X5q6144CCJyk7fQpmdW5jdGlvbiBzdHJpbmcodixtaW4sbWF4KXtyZXR1cm4gdHlwZW9mIHY9PT0nc3RyaW5nJyYmdi5sZW5ndGg+PW1pbiYmdi5sZW5ndGg8PW1heDt9CmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUV4dGVuc2lvbih2YWx1ZSl7CiAga2V5cyh2YWx1ZSxbJ2lkJywnbmFtZScsJ2Rlc2NyaXB0aW9uJywndmVyc2lvbicsJ2FwaV9tYWpvcicsJ3Byb3RvY29sJywncGVybWlzc2lvbnMnLCdhY3Rpb25zJ10pOwogIGlmKHR5cGVvZiB2YWx1ZS5pZCE9PSdzdHJpbmcnfHwhL15bYS16XVthLXowLTktXXsyLDU5fSQvLnRlc3QodmFsdWUuaWQpfHwhc3RyaW5nKHZhbHVlLm5hbWUsMiw2MCl8fCFzdHJpbmcodmFsdWUuZGVzY3JpcHRpb24sMiw1MDApfHx0eXBlb2YgdmFsdWUudmVyc2lvbiE9PSdzdHJpbmcnfHwhL15cZHsxLDR9XC5cZHsxLDR9XC5cZHsxLDR9JC8udGVzdCh2YWx1ZS52ZXJzaW9uKXx8dmFsdWUuYXBpX21ham9yIT09MXx8dmFsdWUucHJvdG9jb2whPT0nemh1Z2UtaW0tZXh0ZW5zaW9uLXYxJyl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleWQjeensOaIlueJiOacrOagvOW8j+aXoOaViOOAgicpOwogIGlmKCFBcnJheS5pc0FycmF5KHZhbHVlLnBlcm1pc3Npb25zKXx8dmFsdWUucGVybWlzc2lvbnMubGVuZ3RoPjJ8fG5ldyBTZXQodmFsdWUucGVybWlzc2lvbnMpLnNpemUhPT12YWx1ZS5wZXJtaXNzaW9ucy5sZW5ndGh8fHZhbHVlLnBlcm1pc3Npb25zLnNvbWUocD0+IVBFUk1JU1NJT05TLmluY2x1ZGVzKHApKSl0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxleeUs+ivt+S6huS4jeaUr+aMgeeahOadg+mZkOOAgicpOwogIGlmKCFBcnJheS5pc0FycmF5KHZhbHVlLmFjdGlvbnMpfHx2YWx1ZS5hY3Rpb25zLmxlbmd0aDwxfHx2YWx1ZS5hY3Rpb25zLmxlbmd0aD4xMil0aHJvdyBuZXcgRXJyb3IoJ+aJqeWxlemcgOimgSAxIOiHsyAxMiDkuKrliqjkvZzjgIInKTsKICBjb25zdCBzZWVuPW5ldyBTZXQoKTsKICBmb3IoY29uc3QgYSBvZiB2YWx1ZS5hY3Rpb25zKXsKICAgIGtleXMoYSxbJ2lkJywnbGFiZWwnLCdvcGVyYXRpb24nLCd0ZW1wbGF0ZScsJ2ZpbmQnLCdyZXBsYWNlbWVudCddKTsKICAgIGlmKHR5cGVvZiBhLmlkIT09J3N0cmluZyd8fCEvXlthLXpdW2EtejAtOS1dezEsMzl9JC8udGVzdChhLmlkKXx8c2Vlbi5oYXMoYS5pZCl8fCFzdHJpbmcoYS5sYWJlbCwyLDQwKXx8IVsndHJpbScsJ3VwcGVyY2FzZScsJ2xvd2VyY2FzZScsJ3RlbXBsYXRlJywncmVwbGFjZScsJ3F1b3RlJ10uaW5jbHVkZXMoYS5vcGVyYXRpb24pKXRocm93IG5ldyBFcnJvcign5omp5bGV5Yqo5L2c5peg5pWI44CCJyk7CiAgICBzZWVuLmFkZChhLmlkKTsKICAgIGlmKGEub3BlcmF0aW9uPT09J3RlbXBsYXRlJyl7CiAgICAgIGlmKCFzdHJpbmcoYS50ZW1wbGF0ZSwxLDQwMDApfHxhLmZpbmQhPT11bmRlZmluZWR8fGEucmVwbGFjZW1lbnQhPT11bmRlZmluZWQpdGhyb3cgbmV3IEVycm9yKCflm57lpI3mqKHmnb/ml6DmlYjjgIInKTsKICAgICAgaWYoYS50ZW1wbGF0ZS5pbmNsdWRlcygne3tkcmFmdH19JykmJiF2YWx1ZS5wZXJtaXNzaW9ucy5pbmNsdWRlcygnZHJhZnQucmVhZCcpKXRocm93IG5ldyBFcnJvcign6K+75Y+W6I2J56i/6ZyA6KaB5aOw5piO5p2D6ZmQ44CCJyk7CiAgICB9ZWxzZSBpZihhLm9wZXJhdGlvbj09PSdyZXBsYWNlJyl7CiAgICAgIGlmKCFzdHJpbmcoYS5maW5kLDEsMTAwKXx8IXN0cmluZyhhLnJlcGxhY2VtZW50LDAsNTAwKXx8YS50ZW1wbGF0ZSE9PXVuZGVmaW5lZCl0aHJvdyBuZXcgRXJyb3IoJ+abv+aNouWGheWuueaXoOaViOOAgicpOwogICAgfWVsc2UgaWYoYS50ZW1wbGF0ZSE9PXVuZGVmaW5lZHx8YS5maW5kIT09dW5kZWZpbmVkfHxhLnJlcGxhY2VtZW50IT09dW5kZWZpbmVkKXRocm93IG5ldyBFcnJvcign5Yqo5L2c5YyF5ZCr5aSa5L2Z6K6+572u44CCJyk7CiAgICBpZihbJ3RyaW0nLCd1cHBlcmNhc2UnLCdsb3dlcmNhc2UnLCdyZXBsYWNlJ10uaW5jbHVkZXMoYS5vcGVyYXRpb24pJiYhdmFsdWUucGVybWlzc2lvbnMuaW5jbHVkZXMoJ2RyYWZ0LnJlYWQnKSl0aHJvdyBuZXcgRXJyb3IoJ+aWh+acrOaVtOeQhumcgOimgeivu+WPluiNieeov+adg+mZkOOAgicpOwogIH0KICBpZihuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkodmFsdWUpKS5sZW5ndGg+NjU1MzYpdGhyb3cgbmV3IEVycm9yKCfmianlsZXmlofku7bkuI3og73otoXov4cgNjQgS0LjgIInKTsKICByZXR1cm4gc3RydWN0dXJlZENsb25lKHZhbHVlKTsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gZXh0ZW5zaW9uRGlnZXN0KHRleHQpe3JldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JyxuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUodGV4dCkpKSxiPT5iLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCcwJykpLmpvaW4oJycpO30KZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVBY3Rpb24oZXh0ZW5zaW9uLGlkLGlucHV0PXt9KXsKICBjb25zdCBlPXZhbGlkYXRlRXh0ZW5zaW9uKGV4dGVuc2lvbiksYWN0aW9uPWUuYWN0aW9ucy5maW5kKGE9PmEuaWQ9PT1pZCk7aWYoIWFjdGlvbil0aHJvdyBuZXcgRXJyb3IoJ+WKqOS9nOS4jeWtmOWcqOOAgicpOwogIGtleXMoaW5wdXQsWydkcmFmdCcsJ3F1YW50aXR5JywncHJpY2UnLCdzaGlwcGluZyddKTsKICBjb25zdCBkcmFmdD1pbnB1dC5kcmFmdD8/Jyc7aWYoIXN0cmluZyhkcmFmdCwwLDQwMDApKXRocm93IG5ldyBFcnJvcign6I2J56i/6L+H6ZW/44CCJyk7CiAgaWYoZHJhZnQmJiFlLnBlcm1pc3Npb25zLmluY2x1ZGVzKCdkcmFmdC5yZWFkJykpdGhyb3cgbmV3IEVycm9yKCfmsqHmnInor7vlj5bojYnnqL/mnYPpmZDjgIInKTsKICBsZXQgcmVzdWx0PScnOwogIHN3aXRjaChhY3Rpb24ub3BlcmF0aW9uKXsKICAgIGNhc2UgJ3RyaW0nOnJlc3VsdD1kcmFmdC50cmltKCk7YnJlYWs7CiAgICBjYXNlICd1cHBlcmNhc2UnOnJlc3VsdD1kcmFmdC50b1VwcGVyQ2FzZSgpO2JyZWFrOwogICAgY2FzZSAnbG93ZXJjYXNlJzpyZXN1bHQ9ZHJhZnQudG9Mb3dlckNhc2UoKTticmVhazsKICAgIGNhc2UgJ3RlbXBsYXRlJzpyZXN1bHQ9YWN0aW9uLnRlbXBsYXRlLnNwbGl0KCd7e2RyYWZ0fX0nKS5qb2luKGRyYWZ0KTticmVhazsKICAgIGNhc2UgJ3JlcGxhY2UnOnJlc3VsdD1kcmFmdC5zcGxpdChhY3Rpb24uZmluZCkuam9pbihhY3Rpb24ucmVwbGFjZW1lbnQpO2JyZWFrOwogICAgY2FzZSAncXVvdGUnOnsKICAgICAgY29uc3Qge3F1YW50aXR5LHByaWNlLHNoaXBwaW5nfT1pbnB1dDsKICAgICAgaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHF1YW50aXR5KXx8cXVhbnRpdHk8MXx8cXVhbnRpdHk+MTAwMDAwMHx8IVtwcmljZSxzaGlwcGluZ10uZXZlcnkobj0+dHlwZW9mIG49PT0nbnVtYmVyJyYmTnVtYmVyLmlzRmluaXRlKG4pJiZuPj0wJiZuPD0xMDAwMDAwJiZNYXRoLmFicyhuKjEwMC1NYXRoLnJvdW5kKG4qMTAwKSk8MC4wMDAwMSkpdGhyb3cgbmV3IEVycm9yKCfor7floavlhpnmnInmlYjmlbDph4/lkozmnIDlpJrkuKTkvY3lsI/mlbDnmoTph5Hpop3jgIInKTsKICAgICAgY29uc3QgY2VudHM9cXVhbnRpdHkqTWF0aC5yb3VuZChwcmljZSoxMDApK01hdGgucm91bmQoc2hpcHBpbmcqMTAwKTsKICAgICAgcmVzdWx0PWDmlbDph4/vvJoke3F1YW50aXR5fVxu5Y2V5Lu377yaJHtwcmljZS50b0ZpeGVkKDIpfSDlhYNcbui/kOi0ue+8miR7c2hpcHBpbmcudG9GaXhlZCgyKX0g5YWDXG7lkIjorqHvvJokeyhjZW50cy8xMDApLnRvRml4ZWQoMil9IOWFg2A7YnJlYWs7CiAgICB9CiAgfQogIGlmKHJlc3VsdC5sZW5ndGg+NDAwMCl0aHJvdyBuZXcgRXJyb3IoJ+WkhOeQhue7k+aenOi2hei/hyA0MDAwIOWtl++8jOacquWGmeWFpeiNieeov+OAgicpOwogIHJldHVybiByZXN1bHQ7Cn0K",
      "extension-worker.js": "aW1wb3J0IHtleGVjdXRlQWN0aW9ufSBmcm9tICcuL2V4dGVuc2lvbi1zY2hlbWEuanMnOwovLyBPbmx5IHRoaXMgdHJ1c3RlZCBpbnRlcnByZXRlciBydW5zLiBFeHRlbnNpb24gZG9jdW1lbnRzIGFyZSBuZXZlciBldmFsdWF0ZWQgYXMgY29kZS4Kc2VsZi5vbm1lc3NhZ2U9ZXZlbnQ9PnsKICB0cnl7c2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZXZlbnQuZGF0YS5pZCxyZXN1bHQ6ZXhlY3V0ZUFjdGlvbihldmVudC5kYXRhLmV4dGVuc2lvbixldmVudC5kYXRhLmFjdGlvbixldmVudC5kYXRhLmlucHV0KX0pO30KICBjYXRjaChlcnJvcil7c2VsZi5wb3N0TWVzc2FnZSh7aWQ6ZXZlbnQuZGF0YT8uaWQsZXJyb3I6ZXJyb3IubWVzc2FnZX0pO30KfTsK",
      "extensions-page.js": "aW1wb3J0IHtpbnN0YWxsZWRFeHRlbnNpb25zLEVYVEVOU0lPTl9LRVkscmVhZEV4dGVuc2lvbixjaGVja01hcmtldFJlY29yZH0gZnJvbSAnLi9leHRlbnNpb24taG9zdC5qcyc7CmltcG9ydCB7ZXh0ZW5zaW9uRGlnZXN0fSBmcm9tICcuL2V4dGVuc2lvbi1zY2hlbWEuanMnOwppbXBvcnQge3BsYXRmb3JtT3JpZ2lufSBmcm9tICcuL2NvbmZpZy5qcyc7CmNvbnN0IG5vdGljZT10ZXh0PT5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbm90aWNlJykudGV4dENvbnRlbnQ9dGV4dDsKYXN5bmMgZnVuY3Rpb24gaW5zdGFsbCh0ZXh0LHJlbGVhc2VfaWQpewogIC8vIEEgbWFya2V0IGRvd25sb2FkIGVudmVsb3BlIGJpbmRzIHRoZSBleGFjdCByZXZpZXdlZCBmaWxlOyByYXcgbG9jYWwgZmlsZXMgc3RheSB1bnJldmlld2VkLgogIGNvbnN0IHBhcnNlZD1KU09OLnBhcnNlKHRleHQpOwogIGlmKHBhcnNlZC5raW5kPT09J3podWdlLmltLmV4dGVuc2lvbi5kb3dubG9hZCcpe2lmKHR5cGVvZiBwYXJzZWQudGV4dCE9PSdzdHJpbmcnKXRocm93IG5ldyBFcnJvcign5LiL6L295paH5Lu25peg5pWI44CCJyk7dGV4dD1wYXJzZWQudGV4dDtyZWxlYXNlX2lkPXBhcnNlZC5yZWxlYXNlX2lkO30KICBjb25zdCByZWNvcmQ9e3RleHQsZGlnZXN0OmF3YWl0IGV4dGVuc2lvbkRpZ2VzdCh0ZXh0KSwuLi4ocmVsZWFzZV9pZD97cmVsZWFzZV9pZH06e30pfTsKICBjb25zdCB7ZXh0ZW5zaW9ufT1hd2FpdCByZWFkRXh0ZW5zaW9uKHJlY29yZCk7YXdhaXQgY2hlY2tNYXJrZXRSZWNvcmQocmVjb3JkKTsKICBjb25zdCBlbnRyaWVzPWluc3RhbGxlZEV4dGVuc2lvbnMoKS5maWx0ZXIocj0+e3RyeXtyZXR1cm4gSlNPTi5wYXJzZShyLnRleHQpLmlkIT09ZXh0ZW5zaW9uLmlkO31jYXRjaHtyZXR1cm4gZmFsc2U7fX0pOwogIGlmKGVudHJpZXMubGVuZ3RoPj0yMCl0aHJvdyBuZXcgRXJyb3IoJ+acgOWkmuWuieijhSAyMCDkuKrmianlsZXjgIInKTsKICBlbnRyaWVzLnB1c2gocmVjb3JkKTtsb2NhbFN0b3JhZ2Uuc2V0SXRlbShFWFRFTlNJT05fS0VZLEpTT04uc3RyaW5naWZ5KGVudHJpZXMpKTthd2FpdCByZW5kZXIoKTtub3RpY2UoJ+W3suWuieijheOAguWbnuWIsOiBiuWkqeWQju+8jOivt+mHjeaWsOWQr+eUqOatpOeJiOacrOeahOadg+mZkOOAgicpOwp9CmFzeW5jIGZ1bmN0aW9uIHJlbmRlcigpe2NvbnN0IGxpc3Q9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2luc3RhbGxlZCcpO2xpc3QucmVwbGFjZUNoaWxkcmVuKCk7Zm9yKGNvbnN0IHJlY29yZCBvZiBpbnN0YWxsZWRFeHRlbnNpb25zKCkpewogIGNvbnN0IHJvdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtyb3cuY2xhc3NOYW1lPSdlbnRyeSc7Y29uc3QgbGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpOwogIHRyeXtjb25zdCB7ZXh0ZW5zaW9uOmV9PWF3YWl0IHJlYWRFeHRlbnNpb24ocmVjb3JkKTtsYWJlbC50ZXh0Q29udGVudD1gJHtlLm5hbWV9IMK3ICR7ZS52ZXJzaW9ufSDCtyAke3JlY29yZC5yZWxlYXNlX2lkPyfluILlnLrniYjmnKzvvIzov5DooYzliY3lpI3moLjnirbmgIEnOifmnKzlnLDkv67mlLnniYgnfVxuJHtlLnBlcm1pc3Npb25zLm1hcChwPT5wPT09J2RyYWZ0LnJlYWQnPyfor7vlj5blvZPliY3ojYnnqL8nOifnu4/nlKjmiLfmk43kvZzlhpnlhaXojYnnqL8nKS5qb2luKCfjgIEnKXx8J+S7hemihOiniCd9YDt9Y2F0Y2goZXJyb3Ipe2xhYmVsLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7fQogIGNvbnN0IGJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtidXR0b24udGV4dENvbnRlbnQ9J+enu+mZpCc7YnV0dG9uLm9uY2xpY2s9KCk9Pntsb2NhbFN0b3JhZ2Uuc2V0SXRlbShFWFRFTlNJT05fS0VZLEpTT04uc3RyaW5naWZ5KGluc3RhbGxlZEV4dGVuc2lvbnMoKS5maWx0ZXIocj0+ci5kaWdlc3QhPT1yZWNvcmQuZGlnZXN0KSkpO3ZvaWQgcmVuZGVyKCk7fTtyb3cuYXBwZW5kKGxhYmVsLGJ1dHRvbik7bGlzdC5hcHBlbmQocm93KTsKfWlmKCFsaXN0LmNoaWxkcmVuLmxlbmd0aClsaXN0LnRleHRDb250ZW50PSflsJrmnKrlronoo4XmianlsZXjgIInO30KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcmtldCcpLmhyZWY9cGxhdGZvcm1PcmlnaW4rJy9jYXBhYmlsaXR5LW1hcmtldC9kaXJlY3QtaW0vZXh0ZW5zaW9ucyc7CmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLWV4YW1wbGVdJykuZm9yRWFjaChidXR0b249PmJ1dHRvbi5vbmNsaWNrPWFzeW5jKCk9PntidXR0b24uZGlzYWJsZWQ9dHJ1ZTt0cnl7Y29uc3QgcmVzcG9uc2U9YXdhaXQgZmV0Y2goYC4vZXh0ZW5zaW9ucy8ke2J1dHRvbi5kYXRhc2V0LmV4YW1wbGV9Lmpzb25gKTtpZighcmVzcG9uc2Uub2spdGhyb3cgbmV3IEVycm9yKCfnpLrkvovor7vlj5blpLHotKXjgIInKTthd2FpdCBpbnN0YWxsKGF3YWl0IHJlc3BvbnNlLnRleHQoKSk7fWNhdGNoKGVycm9yKXtub3RpY2UoZXJyb3IubWVzc2FnZSk7fWZpbmFsbHl7YnV0dG9uLmRpc2FibGVkPWZhbHNlO319KTsKZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2ltcG9ydCcpLm9uY2hhbmdlPWFzeW5jIGV2ZW50PT57Y29uc3QgZmlsZT1ldmVudC50YXJnZXQuZmlsZXNbMF07aWYoIWZpbGUpcmV0dXJuO3RyeXtpZihmaWxlLnNpemU+MTAwMDAwKXRocm93IG5ldyBFcnJvcign5paH5Lu26L+H5aSn44CCJyk7YXdhaXQgaW5zdGFsbChhd2FpdCBmaWxlLnRleHQoKSk7fWNhdGNoKGVycm9yKXtub3RpY2UoZXJyb3IubWVzc2FnZSk7fWZpbmFsbHl7ZXZlbnQudGFyZ2V0LnZhbHVlPScnO319Owp2b2lkIHJlbmRlcigpOwo=",
      "guard.mjs": "aW1wb3J0IHtyZWFkRmlsZSx3cml0ZUZpbGUsbWtkaXIscmVuYW1lLGxzdGF0LGNvcHlGaWxlLHJlYWRkaXJ9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnOwppbXBvcnQge2NyZWF0ZUhhc2gsY3JlYXRlUHVibGljS2V5LHZlcmlmeSxyYW5kb21VVUlEfSBmcm9tICdub2RlOmNyeXB0byc7CmltcG9ydCBwYXRoIGZyb20gJ25vZGU6cGF0aCc7CmltcG9ydCB7ZmlsZVVSTFRvUGF0aH0gZnJvbSAnbm9kZTp1cmwnOwpjb25zdCBzaGE9ZGF0YT0+Y3JlYXRlSGFzaCgnc2hhMjU2JykudXBkYXRlKGRhdGEpLmRpZ2VzdCgnaGV4Jyk7CmV4cG9ydCBjb25zdCByb290PWZpbGVVUkxUb1BhdGgobmV3IFVSTCgnLicsaW1wb3J0Lm1ldGEudXJsKSk7CmNvbnN0IHJlcXVpcmVkPVsnYm9vdHN0cmFwLmpzJywnc2RrLmpzJywnaW50ZWdyaXR5LmpzJywnY29uZmlnLmpzJywnc2VydmVyLm1qcycsJ2d1YXJkLm1qcycsJ2V4dGVuc2lvbi1ob3N0LmpzJywnZXh0ZW5zaW9uLXNjaGVtYS5qcycsJ2V4dGVuc2lvbi13b3JrZXIuanMnLCdzcmMvY2xpZW50LmpzJywnc3JjL3N0b3JhZ2UuanMnXTsKY29uc3QgdmFsaWRQYXRoPW5hbWU9Pi9eKD86c3JjXC9bYS16LV0rXC4oPzpqc3x0cyl8W2Etei1dK1wuKD86anN8bWpzfGpzb258aHRtbCkpJC8udGVzdChuYW1lKTsKYXN5bmMgZnVuY3Rpb24gc2FmZVRhcmdldChiYXNlLG5hbWUpewogIGlmKCF2YWxpZFBhdGgobmFtZSkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pmlofku7bot6/lvoTml6DmlYjjgIInKTsKICBjb25zdCB0YXJnZXQ9cGF0aC5yZXNvbHZlKGJhc2UsbmFtZSk7aWYoIXRhcmdldC5zdGFydHNXaXRoKHBhdGgucmVzb2x2ZShiYXNlKStwYXRoLnNlcCkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pot6/lvoTotornlYzjgIInKTsKICBsZXQgY3VycmVudD1iYXNlO2Zvcihjb25zdCBwYXJ0IG9mIG5hbWUuc3BsaXQoJy8nKSl7Y3VycmVudD1wYXRoLmpvaW4oY3VycmVudCxwYXJ0KTtjb25zdCBzdGF0PWF3YWl0IGxzdGF0KGN1cnJlbnQpLmNhdGNoKGU9PntpZihlLmNvZGU9PT0nRU5PRU5UJylyZXR1cm4gbnVsbDt0aHJvdyBlO30pO2lmKHN0YXQ/LmlzU3ltYm9saWNMaW5rKCkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Pot6/lvoTkuI3og73kvb/nlKjnrKblj7fpk77mjqXjgIInKTt9CiAgcmV0dXJuIHRhcmdldDsKfQpleHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5UmVsZWFzZShyZWxlYXNlLGJhc2U9cm9vdCl7CiAgY29uc3QgdHJ1c3RlZEtleT1hd2FpdCByZWFkRmlsZShwYXRoLmpvaW4oYmFzZSwncmVsZWFzZS1rZXkuanNvbicpKTsKICBjb25zdCBqd2s9SlNPTi5wYXJzZSh0cnVzdGVkS2V5LnRvU3RyaW5nKCkpOwogIGlmKCFyZWxlYXNlPy5wYXlsb2FkfHx0eXBlb2YgcmVsZWFzZS5zaWduYXR1cmUhPT0nc3RyaW5nJ3x8IXZlcmlmeSgnUlNBLVNIQTI1NicsQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocmVsZWFzZS5wYXlsb2FkKSksY3JlYXRlUHVibGljS2V5KHtrZXk6andrLGZvcm1hdDonandrJ30pLEJ1ZmZlci5mcm9tKHJlbGVhc2Uuc2lnbmF0dXJlLCdiYXNlNjQnKSkpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4Plj5HluIPnrb7lkI3ml6DmlYjjgIInKTsKICBjb25zdCBwPXJlbGVhc2UucGF5bG9hZDsKICBpZihwLmZpbGVzPy5bJ3JlbGVhc2Uta2V5Lmpzb24nXSE9PXNoYSh0cnVzdGVkS2V5KSl0aHJvdyBuZXcgRXJyb3IoJ+WNh+e6p+aWh+S7tuS4jeiDvemdmem7mOabv+aNouWumOaWueetvuWQjeagueOAgicpOwogIGlmKHAucHJvdG9jb2whPT0nemh1Z2UtaW0tdjEnfHxwLmFwaV9tYWpvciE9PTF8fHAuc3RvcmFnZV92ZXJzaW9uIT09MXx8IS9eXGQrXC5cZCtcLlxkKyQvLnRlc3QocC52ZXJzaW9uKSl0aHJvdyBuZXcgRXJyb3IoJ+WNj+iuruaIluacrOWcsOiusOW9leagvOW8j+S4jeWFvOWuue+8jOS4jeiDveebtOaOpeWIh+aNouatpOeJiOacrOOAgicpOwogIGlmKCFwLmZpbGVzfHwhcC5iYXNlbGluZXx8T2JqZWN0LmtleXMocC5maWxlcykubGVuZ3RoPjQwfHxyZXF1aXJlZC5zb21lKG49PiFwLmZpbGVzW25dKSl0aHJvdyBuZXcgRXJyb3IoJ+aguOW/g+WPkeW4g+a4heWNleS4jeWujOaVtOOAgicpOwogIGZvcihjb25zdCBbbmFtZSxkaWdlc3RdIG9mIE9iamVjdC5lbnRyaWVzKHAuZmlsZXMpKXsKICAgIGlmKCF2YWxpZFBhdGgobmFtZSl8fHR5cGVvZiBwLmJhc2VsaW5lW25hbWVdIT09J3N0cmluZyd8fHAuYmFzZWxpbmVbbmFtZV0ubGVuZ3RoPjIwMDAwMDB8fHNoYShCdWZmZXIuZnJvbShwLmJhc2VsaW5lW25hbWVdLCdiYXNlNjQnKSkhPT1kaWdlc3QpdGhyb3cgbmV3IEVycm9yKCfmoLjlv4PmgaLlpI3lhoXlrrnmoKHpqozlpLHotKXjgIInKTsKICB9CiAgcmV0dXJuIHA7Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoZWNrKGJhc2U9cm9vdCl7CiAgY29uc3QgcmVsZWFzZT1KU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKHBhdGguam9pbihiYXNlLCdyZWxlYXNlLmpzb24nKSwndXRmOCcpKTtjb25zdCBwPWF3YWl0IHZlcmlmeVJlbGVhc2UocmVsZWFzZSxiYXNlKTtjb25zdCBjaGFuZ2VkPVtdOwogIGZvcihjb25zdCBbbmFtZSxkaWdlc3RdIG9mIE9iamVjdC5lbnRyaWVzKHAuZmlsZXMpKXsKICAgIHRyeXtpZihzaGEoYXdhaXQgcmVhZEZpbGUoYXdhaXQgc2FmZVRhcmdldChiYXNlLG5hbWUpKSkhPT1kaWdlc3QpY2hhbmdlZC5wdXNoKG5hbWUpO31jYXRjaHtjaGFuZ2VkLnB1c2gobmFtZSk7fQogIH0KICByZXR1cm4ge29rOmNoYW5nZWQubGVuZ3RoPT09MCx2ZXJzaW9uOnAudmVyc2lvbixwcm90b2NvbDpwLnByb3RvY29sLGNoYW5nZWR9Owp9CmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN0b3JlKHJlbGVhc2UsYmFzZT1yb290KXsKICBjb25zdCBwPWF3YWl0IHZlcmlmeVJlbGVhc2UocmVsZWFzZSxiYXNlKTsKICBjb25zdCB0YXJnZXRzPVtdO2Zvcihjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHAuZmlsZXMpKXRhcmdldHMucHVzaChbbmFtZSxhd2FpdCBzYWZlVGFyZ2V0KGJhc2UsbmFtZSksQnVmZmVyLmZyb20ocC5iYXNlbGluZVtuYW1lXSwnYmFzZTY0JyldKTsKICB0YXJnZXRzLnB1c2goWydyZWxlYXNlLmpzb24nLGF3YWl0IHNhZmVUYXJnZXQoYmFzZSwncmVsZWFzZS5qc29uJyksQnVmZmVyLmZyb20oSlNPTi5zdHJpbmdpZnkocmVsZWFzZSxudWxsLDIpKV0pOwogIGNvbnN0IGJhY2t1cFJvb3Q9cGF0aC5qb2luKGJhc2UsJ3VzZXItYmFja3VwcycpO2NvbnN0IHN0PWF3YWl0IGxzdGF0KGJhY2t1cFJvb3QpLmNhdGNoKCgpPT5udWxsKTtpZihzdD8uaXNTeW1ib2xpY0xpbmsoKSl0aHJvdyBuZXcgRXJyb3IoJ+Wkh+S7veebruW9leS4jeiDveS9v+eUqOespuWPt+mTvuaOpeOAgicpOwogIGNvbnN0IGJhY2t1cD1wYXRoLmpvaW4oYmFja3VwUm9vdCxgY29yZS0ke0RhdGUubm93KCl9LSR7cmFuZG9tVVVJRCgpfWApO2F3YWl0IG1rZGlyKGJhY2t1cCx7cmVjdXJzaXZlOnRydWV9KTsKICAvLyBCYWNrIHVwIGV2ZXJ5IGV4aXN0aW5nIGNvcmUgZmlsZSBiZWZvcmUgdGhlIGZpcnN0IG11dGF0aW9uOyBuZXZlciB0b3VjaCBicm93c2VyIHN0b3JhZ2UuCiAgZm9yKGNvbnN0IFtuYW1lLHRhcmdldF0gb2YgdGFyZ2V0cyl7Y29uc3QgY29udGVudD1hd2FpdCByZWFkRmlsZSh0YXJnZXQpLmNhdGNoKGU9PntpZihlLmNvZGU9PT0nRU5PRU5UJylyZXR1cm4gbnVsbDt0aHJvdyBlO30pO2lmKGNvbnRlbnQpe2NvbnN0IGRlc3Q9cGF0aC5qb2luKGJhY2t1cCxuYW1lKTthd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdCkse3JlY3Vyc2l2ZTp0cnVlfSk7YXdhaXQgd3JpdGVGaWxlKGRlc3QsY29udGVudCx7ZmxhZzond3gnfSk7fX0KICBmb3IoY29uc3QgWyx0YXJnZXQsYnl0ZXNdIG9mIHRhcmdldHMpe2F3YWl0IG1rZGlyKHBhdGguZGlybmFtZSh0YXJnZXQpLHtyZWN1cnNpdmU6dHJ1ZX0pO2NvbnN0IHN0YWdlZD10YXJnZXQrJy4nK3JhbmRvbVVVSUQoKSsnLnRtcCc7YXdhaXQgd3JpdGVGaWxlKHN0YWdlZCxieXRlcyx7ZmxhZzond3gnfSk7YXdhaXQgcmVuYW1lKHN0YWdlZCx0YXJnZXQpO30KICByZXR1cm4ge3ZlcnNpb246cC52ZXJzaW9uLGJhY2t1cCxjaGVjazphd2FpdCBjaGVjayhiYXNlKX07Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZShyZWxlYXNlLGJhc2U9cm9vdCl7CiAgY29uc3QgY3VycmVudD1hd2FpdCBjaGVjayhiYXNlKTtpZighY3VycmVudC5vayl0aHJvdyBuZXcgRXJyb3IoJ+ivt+WFiOaBouWkjeW9k+WJjeaguOW/g++8jOWGjeajgOafpeWNh+e6p+OAgicpOwogIGNvbnN0IHA9YXdhaXQgdmVyaWZ5UmVsZWFzZShyZWxlYXNlLGJhc2UpO2NvbnN0IG5leHQ9cC52ZXJzaW9uLnNwbGl0KCcuJykubWFwKE51bWJlciksb2xkPWN1cnJlbnQudmVyc2lvbi5zcGxpdCgnLicpLm1hcChOdW1iZXIpOwogIGNvbnN0IGRpZmZlcmluZz1uZXh0LmZpbmRJbmRleCgobixpKT0+biE9PW9sZFtpXSk7aWYoZGlmZmVyaW5nPj0wJiZuZXh0W2RpZmZlcmluZ108b2xkW2RpZmZlcmluZ10pdGhyb3cgbmV3IEVycm9yKCfkuI3og73nm7TmjqXpmY3nuqfmoLjlv4PvvJvor7fkv53nlZnlvZPliY3mlbDmja7lubbkvb/nlKjljp/niYjmnKzlpIfku73jgIInKTsKICByZXR1cm4gcmVzdG9yZShyZWxlYXNlLGJhc2UpOwp9CmFzeW5jIGZ1bmN0aW9uIGV4cGVyaW1lbnQoYmFzZT1yb290KXsKICBjb25zdCBwYXJlbnQ9cGF0aC5qb2luKGJhc2UsJ2V4cGVyaW1lbnRzJyk7aWYoKGF3YWl0IGxzdGF0KHBhcmVudCkuY2F0Y2goKCk9Pm51bGwpKT8uaXNTeW1ib2xpY0xpbmsoKSl0aHJvdyBuZXcgRXJyb3IoJ+WunumqjOebruW9leS4jeiDveS9v+eUqOespuWPt+mTvuaOpeOAgicpOwogIGNvbnN0IGRlc3Q9cGF0aC5qb2luKHBhcmVudCxgY29yZS0ke0RhdGUubm93KCl9LSR7cmFuZG9tVVVJRCgpfWApO2F3YWl0IG1rZGlyKGRlc3Qse3JlY3Vyc2l2ZTp0cnVlfSk7CiAgYXN5bmMgZnVuY3Rpb24gY29weShmcm9tLHRvKXtmb3IoY29uc3QgaXRlbSBvZiBhd2FpdCByZWFkZGlyKGZyb20se3dpdGhGaWxlVHlwZXM6dHJ1ZX0pKXtpZihpdGVtLm5hbWUuc3RhcnRzV2l0aCgnLicpfHxbJ2V4cGVyaW1lbnRzJywndXNlci1iYWNrdXBzJywnbm9kZV9tb2R1bGVzJ10uaW5jbHVkZXMoaXRlbS5uYW1lKXx8aXRlbS5pc1N5bWJvbGljTGluaygpKWNvbnRpbnVlO2NvbnN0IHM9cGF0aC5qb2luKGZyb20saXRlbS5uYW1lKSx0PXBhdGguam9pbih0byxpdGVtLm5hbWUpO2lmKGl0ZW0uaXNEaXJlY3RvcnkoKSl7YXdhaXQgbWtkaXIodCx7cmVjdXJzaXZlOnRydWV9KTthd2FpdCBjb3B5KHMsdCk7fWVsc2UgaWYoaXRlbS5pc0ZpbGUoKSlhd2FpdCBjb3B5RmlsZShzLHQpO319CiAgYXdhaXQgY29weShiYXNlLGRlc3QpO3JldHVybiB7cGF0aDpkZXN0LG1lc3NhZ2U6J+WunumqjOWJr+acrOW3suWIm+W7uuOAguivt+S9v+eUqOS4jeWQjOerr+WPo+OAgeeLrOeri+a1j+iniOWZqOmFjee9ruWSjOa1i+ivlei0puWPt++8m+a1j+iniOWZqOiusOW9leayoeacieWkjeWItuOAgid9Owp9CmlmKHByb2Nlc3MuYXJndlsxXSYmcGF0aC5yZXNvbHZlKHByb2Nlc3MuYXJndlsxXSk9PT1maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpewogIHRyeXtjb25zdCBjb21tYW5kPXByb2Nlc3MuYXJndlsyXXx8J2NoZWNrJztsZXQgcmVzdWx0OwogICAgaWYoY29tbWFuZD09PSdjaGVjaycpcmVzdWx0PWF3YWl0IGNoZWNrKCk7CiAgICBlbHNlIGlmKGNvbW1hbmQ9PT0ncmVzdG9yZScpcmVzdWx0PWF3YWl0IHJlc3RvcmUoSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLmpvaW4ocm9vdCwncmVsZWFzZS5qc29uJyksJ3V0ZjgnKSkpOwogICAgZWxzZSBpZihjb21tYW5kPT09J3VwZGF0ZScmJnByb2Nlc3MuYXJndlszXSlyZXN1bHQ9YXdhaXQgdXBkYXRlKEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocHJvY2Vzcy5hcmd2WzNdLCd1dGY4JykpKTsKICAgIGVsc2UgaWYoY29tbWFuZD09PSdleHBlcmltZW50JylyZXN1bHQ9YXdhaXQgZXhwZXJpbWVudCgpOwogICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ+S9v+eUqCBub2RlIGd1YXJkLm1qcyBjaGVjayAvIHJlc3RvcmUgLyB1cGRhdGUg5Y+R5biD5paH5Lu2IC8gZXhwZXJpbWVudOOAgicpOwogICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LG51bGwsMikpO2lmKHJlc3VsdC5vaz09PWZhbHNlKXByb2Nlc3MuZXhpdENvZGU9MTsKICB9Y2F0Y2goZXJyb3Ipe2NvbnNvbGUuZXJyb3IoJ+ajgOafpeacquWujOaIkO+8micrZXJyb3IubWVzc2FnZSk7cHJvY2Vzcy5leGl0Q29kZT0xO30KfQo=",
      "integrity.js": "Ly8gUHJvdGVjdGVkOiBzb3VyY2UgdmVyaWZpY2F0aW9uIGlzIGEgbG9jYWwgYWNjaWRlbnQgZ3VhcmQsIG5vdCByZW1vdGUgYXR0ZXN0YXRpb24uCmNvbnN0IGhleCA9IGJ5dGVzID0+IEFycmF5LmZyb20obmV3IFVpbnQ4QXJyYXkoYnl0ZXMpLCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICcwJykpLmpvaW4oJycpOwpjb25zdCBieXRlcyA9IHZhbHVlID0+IFVpbnQ4QXJyYXkuZnJvbShhdG9iKHZhbHVlKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOwpleHBvcnQgYXN5bmMgZnVuY3Rpb24gY2hlY2tDb3JlKCkgewogIGNvbnN0IGdldCA9IGFzeW5jIG5hbWUgPT4gewogICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChuZXcgVVJMKG5hbWUsIGltcG9ydC5tZXRhLnVybCksIHtjYWNoZTonbm8tc3RvcmUnfSk7CiAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoJ+aXoOazleivu+WPlumAmuS/oeaguOW/g++8jOivt+aJk+W8gOajgOafpeS4juaBouWkjemhtemdouOAgicpOwogICAgcmV0dXJuIHJlc3BvbnNlOwogIH07CiAgY29uc3QgW3JlbGVhc2UsIGp3a10gPSBhd2FpdCBQcm9taXNlLmFsbChbKGF3YWl0IGdldCgncmVsZWFzZS5qc29uJykpLmpzb24oKSwgKGF3YWl0IGdldCgncmVsZWFzZS1rZXkuanNvbicpKS5qc29uKCldKTsKICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgnandrJywgandrLCB7bmFtZTonUlNBU1NBLVBLQ1MxLXYxXzUnLGhhc2g6J1NIQS0yNTYnfSwgZmFsc2UsIFsndmVyaWZ5J10pOwogIGlmICghYXdhaXQgY3J5cHRvLnN1YnRsZS52ZXJpZnkoJ1JTQVNTQS1QS0NTMS12MV81Jywga2V5LCBieXRlcyhyZWxlYXNlLnNpZ25hdHVyZSksIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShyZWxlYXNlLnBheWxvYWQpKSkpIHRocm93IG5ldyBFcnJvcign6YCa5L+h5qC45b+D54mI5pys562+5ZCN5LiN5Yy56YWN77yM6K+35oGi5aSN5Y+v5L+h54mI5pys44CCJyk7CiAgY29uc3QgcCA9IHJlbGVhc2UucGF5bG9hZDsKICBpZiAocC5wcm90b2NvbCAhPT0gJ3podWdlLWltLXYxJyB8fCBwLmFwaV9tYWpvciAhPT0gMSB8fCBwLnN0b3JhZ2VfdmVyc2lvbiAhPT0gMSkgdGhyb3cgbmV3IEVycm9yKCfpgJrkv6HmoLjlv4PniYjmnKzkuI3lhbzlrrnvvIzor7fmn6XnnIvljYfnuqfor7TmmI7jgIInKTsKICBmb3IgKGNvbnN0IFtuYW1lLCBleHBlY3RlZF0gb2YgT2JqZWN0LmVudHJpZXMocC5maWxlcykpIHsKICAgIGlmICghL14oPzpzcmNcL1thLXotXStcLig/OmpzfHRzKXxbYS16LV0rXC4oPzpqc3xtanN8anNvbnxodG1sKSkkLy50ZXN0KG5hbWUpKSB0aHJvdyBuZXcgRXJyb3IoJ+mAmuS/oeaguOW/g+a4heWNleaXoOaViOOAgicpOwogICAgaWYgKGhleChhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIGF3YWl0IChhd2FpdCBnZXQobmFtZSkpLmFycmF5QnVmZmVyKCkpKSAhPT0gZXhwZWN0ZWQpIHRocm93IG5ldyBFcnJvcihg6YCa5L+h5qC45b+D5Y+R55Sf5Y+Y5pu077yaJHtuYW1lfeOAguivt+aJk+W8gOajgOafpeS4juaBouWkjemhtemdouOAgmApOwogIH0KICByZXR1cm4ge3ZlcnNpb246cC52ZXJzaW9uLHByb3RvY29sOnAucHJvdG9jb2wsYXBpX21ham9yOnAuYXBpX21ham9yfTsKfQo=",
      "recovery.html": "PCFkb2N0eXBlIGh0bWw+PGh0bWwgbGFuZz0iemgtQ04iPjxoZWFkPjxtZXRhIGNoYXJzZXQ9InV0Zi04Ij48bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLGluaXRpYWwtc2NhbGU9MSI+PHRpdGxlPuajgOafpeS4juaBouWkjTwvdGl0bGU+PHN0eWxlPmJvZHl7bWF4LXdpZHRoOjg1MHB4O21hcmdpbjozMHB4IGF1dG87cGFkZGluZzowIDE4cHg7Y29sb3I6IzIwMjEyNDtmb250OjE0cHgvMS43ICJNaWNyb3NvZnQgWWFIZWkiLEFyaWFsLHNhbnMtc2VyaWZ9aDF7Zm9udC1zaXplOjIycHh9YnV0dG9uLGEsaW5wdXR7Zm9udDppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtjb2xvcjojMjU2M2VifWJ1dHRvbntwYWRkaW5nOjEwcHggMTRweDttYXJnaW46NnB4O2JhY2tncm91bmQ6d2hpdGU7Ym9yZGVyOjFweCBzb2xpZCAjZTRlNmViO2N1cnNvcjpwb2ludGVyfWJ1dHRvbjpkaXNhYmxlZHtvcGFjaXR5Oi41fXByZXt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtvdmVyZmxvdy13cmFwOmFueXdoZXJlfWE6Zm9jdXMtdmlzaWJsZSxidXR0b246Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCAjMjU2M2VifTwvc3R5bGU+PC9oZWFkPjxib2R5PjxhIGhyZWY9Ii8iPui/lOWbnuiBiuWkqTwvYT48aDE+5qOA5p+l5LiO5oGi5aSNPC9oMT48cD7mgaLlpI3liY3kv53lrZjkuIDku73njrDmnInmoLjlv4Pmlofku7bjgILmgqjnmoTnlYzpnaLjgIHmianlsZXlkozmtY/op4jlmajogYrlpKnorrDlvZXkvJrkv53nlZnjgILmk43kvZzlrozmiJDlkI7or7fph43mlrDlkK/liqjnqIvluo/jgII8L3A+PHAgaWQ9InN0YXR1cyIgcm9sZT0ic3RhdHVzIj7mraPlnKjmo4Dmn6XigKY8L3A+PHByZSBpZD0iZGV0YWlscyI+PC9wcmU+PGJ1dHRvbiBpZD0icmVzdG9yZSI+5oGi5aSN5pys54mI5pys5qC45b+DPC9idXR0b24+PGxhYmVsPumAieaLqeWumOaWueWNh+e6p+aWh+S7tiA8aW5wdXQgaWQ9InVwZGF0ZSIgdHlwZT0iZmlsZSIgYWNjZXB0PSIuanNvbiI+PC9sYWJlbD48cD7or7fku47pgJrkv6Hog73lipvnmoTniYjmnKzpobXpnaLkuIvovb3ljYfnuqfmlofku7bjgILljYfnuqfkvJrmo4Dmn6Xnrb7lkI3jgIHljY/orq7lj4rmnKzlnLDorrDlvZXmoLzlvI/jgII8L3A+PGEgaHJlZj0iaHR0cHM6Ly96aHVnZWp1bnNoaS5jb20vY2FwYWJpbGl0eS1tYXJrZXQvZGlyZWN0LWltL3ZlcnNpb25zIiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+5p+l55yL5a6Y5pa554mI5pysPC9hPjxzY3JpcHQgdHlwZT0ibW9kdWxlIiBzcmM9Ii4vcmVjb3ZlcnkuanMiPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+Cg==",
      "recovery.js": "bGV0IGtleT0nJztjb25zdCBzdGF0dXM9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXR1cycpOwphc3luYyBmdW5jdGlvbiBpbnNwZWN0KCl7dHJ5e2NvbnN0IHI9YXdhaXQgZmV0Y2goJy9fX2NvcmUvc3RhdHVzJyk7Y29uc3QgZD1hd2FpdCByLmpzb24oKTtrZXk9ZC5sb2NhbF9rZXk7c3RhdHVzLnRleHRDb250ZW50PWQub2s/J+aguOW/g+WujOaVtO+8jOWPr+i/lOWbnuiBiuWkqeOAgic6J+aguOW/g+mcgOimgeajgOafpe+8jOivt+afpeeci+S4i+aWueivpuaDheOAgic7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGFpbHMnKS50ZXh0Q29udGVudD1kLmNoZWNrLmVycm9yfHxg5b2T5YmN54mI5pys77yaJHtkLmNoZWNrLnZlcnNpb259XG4ke2Qub2s/J+aguOW/g+aWh+S7tuS4juWPkeW4g+eJiOacrOS4gOiHtOOAgic6J+WPkeeUn+WPmOWMlueahOaWh+S7tu+8mlxuJytkLmNoZWNrLmNoYW5nZWQuam9pbignXG4nKX1gO31jYXRjaHtzdGF0dXMudGV4dENvbnRlbnQ9J+ajgOafpeaaguaXtuayoeacieWujOaIkOOAguacrOmhteaBouWkjeWKn+iDvemcgOS9v+eUqOWMheWGheacrOacuuWQr+WKqOeoi+W6j+OAgic7fX0KYXN5bmMgZnVuY3Rpb24gYWN0aW9uKG5hbWUsYm9keSl7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Jlc3RvcmUnKS5kaXNhYmxlZD10cnVlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5kaXNhYmxlZD10cnVlO3RyeXtjb25zdCByPWF3YWl0IGZldGNoKCcvX19jb3JlLycrbmFtZSx7bWV0aG9kOidQT1NUJyxoZWFkZXJzOnsnQ29udGVudC1UeXBlJzonYXBwbGljYXRpb24vanNvbicsJ1gtWmh1Z2UtTG9jYWwtS2V5JzprZXl9LGJvZHk6SlNPTi5zdHJpbmdpZnkoYm9keSl9KTtjb25zdCBkPWF3YWl0IHIuanNvbigpO2lmKCFyLm9rKXRocm93IG5ldyBFcnJvcihkLmVycm9yKTtzdGF0dXMudGV4dENvbnRlbnQ9J+W3suWujOaIkO+8jOivt+mHjeaWsOWQr+WKqOeoi+W6j+OAgic7ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGFpbHMnKS50ZXh0Q29udGVudD1g5oGi5aSN54mI5pys77yaJHtkLnZlcnNpb259XG7ljp/mlofku7blpIfku73kvY3nva7vvJoke2QuYmFja3VwfVxu5oKo55qE55WM6Z2i44CB5omp5bGV5ZKM5rWP6KeI5Zmo6K6w5b2V5bey5L+d55WZ44CCYDt9Y2F0Y2goZSl7c3RhdHVzLnRleHRDb250ZW50PWUubWVzc2FnZTt9ZmluYWxseXtkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdG9yZScpLmRpc2FibGVkPWZhbHNlO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5kaXNhYmxlZD1mYWxzZTt9fQpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVzdG9yZScpLm9uY2xpY2s9KCk9PnZvaWQgYWN0aW9uKCdyZXN0b3JlJyx7fSk7CmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUnKS5vbmNoYW5nZT1hc3luYyBlPT57Y29uc3QgZj1lLnRhcmdldC5maWxlc1swXTtpZihmKXt0cnl7aWYoZi5zaXplPjQwMDAwMDApdGhyb3cgbmV3IEVycm9yKCfljYfnuqfmlofku7bov4flpKfjgIInKTthd2FpdCBhY3Rpb24oJ3VwZGF0ZScsSlNPTi5wYXJzZShhd2FpdCBmLnRleHQoKSkpO31jYXRjaChlcnJvcil7c3RhdHVzLnRleHRDb250ZW50PWVycm9yLm1lc3NhZ2U7fX19Owp2b2lkIGluc3BlY3QoKTsK",
      "release-key.json": "ewogICJrdHkiOiAiUlNBIiwKICAibiI6ICJ4cUQ1RXItOXoxVm5TeV8zNW9ZMjIwVlZVSWFMVGR5bFZYTDZaSl9lOTJ4cDBTakJCTEhLdUlmVkxOaFZnQk92NTM5VXVrekdMa3hMZktiZmFXdm0wSVh6ZkluWW5oeVd2LXFrTjNQbjQ5ZXk0Ml9oaUhpRG5MR1h1WERfRmpiNnNNNmZSV3ZQbmVaNUhnZ1gtZ2RhNEhMcmJGakpzOVBLaE5hZjVjNk1RM3RTeTQ4bEZSZFJHOXk0a3U0a2VHVDhQM1VLMURDcUFxdWhiSWQtQlZqWmF2MndraDV4WnRFOXhKaElxaGV6cExZa0otb2JXRDdqNFhkdk5QMTVfblJ1anhsY3RNNk5rM3ZHdkhlS3Vla0JLRjA5ZXZMVktrOWVULXNMaUotUlI1NFRKZDFpdllIaFNWbGN6bldFTUtSRThzVWw5TFlveEhETWdwMm1JWVc3OGx6OFVodmpFbW1ibUN3dFZGLU5yYmpOYjJ4RDlCWHhQcVlMY3ptOVhMWElGRzFHNGUxNVFwUzVndy1WWnA5dDhyQ2Nnbi1mV0k4ZXRqSEhaaFQ4UzM0S3FDREc5c2NZUlYtdXhER21ja2hrbG1pa0MwLVdBYzE3djU0OGJHZm5GbHVYN0pDRkhfZG52R2JrOHNoT3lMZ2EwdWdXNUdJRXBpYWpFdk9HbndsTCIsCiAgImUiOiAiQVFBQiIKfQ==",
      "sdk.js": "aW1wb3J0IHtEaXJlY3RDaGF0Q2xpZW50fSBmcm9tICcuL3NyYy9jbGllbnQuanMnOwppbXBvcnQge3BsYXRmb3JtT3JpZ2lufSBmcm9tICcuL2NvbmZpZy5qcyc7CmltcG9ydCB7Y2hlY2tDb3JlfSBmcm9tICcuL2ludGVncml0eS5qcyc7CgovLyBEbyBub3QgZXhwb3NlIHRoZSByYXcgY2xpZW50LCBjcmVkZW50aWFscywgc3RvcmFnZSBoYW5kbGUgb3IgdHJhbnNwb3J0IHRvIGV4dGVuc2lvbnMuCmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVDaGF0QXBwKHtvbkNoYW5nZT0oKT0+e30sb25Ob3RpY2U9KCk9Pnt9fT17fSkgewogIGxldCBjbGllbnQsIHRva2VuPScnLCBwZW5kaW5nLCBwb3B1cCwgc3RhdGU9JycsIGNoZWNrVGltZXIsIGNoZWNraW5nPWZhbHNlLCBnZW5lcmF0aW9uPTA7CiAgY29uc3QgcmVxdWlyZUNsaWVudD0oKT0+e2lmKCFjbGllbnQ/LnNuYXBzaG90KXRocm93IG5ldyBFcnJvcign6K+35YWI6L+e5o6l6LSm5Y+344CCJyk7cmV0dXJuIGNsaWVudDt9OwogIGNvbnN0IGRpc2Nvbm5lY3Q9KCk9PntnZW5lcmF0aW9uKys7Y2xlYXJJbnRlcnZhbChjaGVja1RpbWVyKTtjbGllbnQ/LnN0b3AoKTtjbGllbnQ9dW5kZWZpbmVkO3Rva2VuPScnO3N0YXRlPScnO2lmKHBlbmRpbmcpe2NsZWFyVGltZW91dChwZW5kaW5nLnRpbWVyKTtwZW5kaW5nLnJlamVjdChuZXcgRXJyb3IoJ+i/nuaOpeW3suWPlua2iOOAgicpKTtwZW5kaW5nPXVuZGVmaW5lZDt9b25DaGFuZ2UoKTt9OwogIGNvbnN0IHdhdGNoPWFzeW5jKCk9PntpZihjaGVja2luZylyZXR1cm47Y2hlY2tpbmc9dHJ1ZTt0cnl7YXdhaXQgY2hlY2tDb3JlKCk7fWNhdGNoKGUpe2Rpc2Nvbm5lY3QoKTtvbk5vdGljZShlLm1lc3NhZ2UpO31maW5hbGx5e2NoZWNraW5nPWZhbHNlO319OwogIGNvbnN0IGxpc3RlbmVyPWFzeW5jIGV2ZW50PT57CiAgICBpZighcGVuZGluZ3x8IXN0YXRlfHxldmVudC5vcmlnaW4hPT1uZXcgVVJMKHBsYXRmb3JtT3JpZ2luKS5vcmlnaW58fGV2ZW50LnNvdXJjZSE9PXBvcHVwfHxldmVudC5kYXRhPy50eXBlIT09J3podWdlLWRpcmVjdC1pbS1zZXNzaW9uJ3x8ZXZlbnQuZGF0YT8uc3RhdGUhPT1zdGF0ZSlyZXR1cm47CiAgICBjb25zdCBhY3RpdmU9cGVuZGluZztwZW5kaW5nPXVuZGVmaW5lZDtjbGVhclRpbWVvdXQoYWN0aXZlLnRpbWVyKTtzdGF0ZT0nJztjb25zdCBlcG9jaD1nZW5lcmF0aW9uOwogICAgdHJ5ewogICAgICBhd2FpdCBjaGVja0NvcmUoKTtpZihlcG9jaCE9PWdlbmVyYXRpb24pdGhyb3cgbmV3IEVycm9yKCfov57mjqXlt7Llj5bmtojjgIInKTsKICAgICAgdG9rZW49U3RyaW5nKGV2ZW50LmRhdGEuYWNjZXNzX3Rva2VufHwnJyk7aWYoIXRva2VuLnN0YXJ0c1dpdGgoJ2ltZGNfJykpdGhyb3cgbmV3IEVycm9yKCfor7fkvb/nlKjpgJrkv6HkuJPnlKjov57mjqXmjojmnYPjgIInKTsKICAgICAgY2xpZW50PW5ldyBEaXJlY3RDaGF0Q2xpZW50KHtiYXNlVXJsOmAke3BsYXRmb3JtT3JpZ2lufS9hcGkvaW0tZGlyZWN0YCx0b2tlbjooKT0+dG9rZW4sb25DaGFuZ2Usb25Ob3RpY2V9KTsKICAgICAgYXdhaXQgY2xpZW50LnN0YXJ0KCk7aWYoZXBvY2ghPT1nZW5lcmF0aW9uKXRocm93IG5ldyBFcnJvcign6L+e5o6l5bey5Y+W5raI44CCJyk7CiAgICAgIGNoZWNrVGltZXI9c2V0SW50ZXJ2YWwoKCk9PnZvaWQgd2F0Y2goKSwxMDAwMCk7YWN0aXZlLnJlc29sdmUoKTsKICAgIH1jYXRjaChlKXtkaXNjb25uZWN0KCk7YWN0aXZlLnJlamVjdChlKTt9CiAgfTsKICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsbGlzdGVuZXIpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdwYWdlaGlkZScsZGlzY29ubmVjdCk7CiAgcmV0dXJuIE9iamVjdC5mcmVlemUoewogICAgYXBpVmVyc2lvbjoxLAogICAgZ2V0IGNvbm5lY3Rpb25SZXZpc2lvbigpe3JldHVybiBnZW5lcmF0aW9uO30sCiAgICBnZXQgc25hcHNob3QoKXtyZXR1cm4gY2xpZW50Py5zbmFwc2hvdD9zdHJ1Y3R1cmVkQ2xvbmUoe3VzZXI6Y2xpZW50LnNuYXBzaG90LnVzZXIsY29udmVyc2F0aW9uczpjbGllbnQuc25hcHNob3QuY29udmVyc2F0aW9uc30pOnVuZGVmaW5lZDt9LAogICAgY2hlY2s6Y2hlY2tDb3JlLAogICAgY29ubmVjdCgpewogICAgICBkaXNjb25uZWN0KCk7c3RhdGU9Y3J5cHRvLnJhbmRvbVVVSUQoKTtjb25zdCB1cmw9bmV3IFVSTCgnL2ltL2Nvbm5lY3QnLHBsYXRmb3JtT3JpZ2luKTt1cmwuc2VhcmNoUGFyYW1zLnNldCgnb3JpZ2luJyxsb2NhdGlvbi5vcmlnaW4pO3VybC5zZWFyY2hQYXJhbXMuc2V0KCdzdGF0ZScsc3RhdGUpOwogICAgICBwb3B1cD13aW5kb3cub3Blbih1cmwsJ3podWdlLWRpcmVjdC1pbS1jb25uZWN0Jywnd2lkdGg9NjQwLGhlaWdodD03MjAnKTsKICAgICAgaWYoIXBvcHVwKXtzdGF0ZT0nJztyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCfor7flhYHorrjmiZPlvIDotKblj7fov57mjqXnqpflj6PjgIInKSk7fQogICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e3BlbmRpbmc9e3Jlc29sdmUscmVqZWN0LHRpbWVyOnNldFRpbWVvdXQoKCk9PntzdGF0ZT0nJztwZW5kaW5nPXVuZGVmaW5lZDtyZWplY3QobmV3IEVycm9yKCfov57mjqXnrYnlvoXotoXml7bvvIzor7fph43mlrDov57mjqXjgIInKSk7fSw5MDAwMCl9O30pOwogICAgfSwKICAgIGRpc2Nvbm5lY3QsCiAgICBkaXNwb3NlKCl7ZGlzY29ubmVjdCgpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJyxsaXN0ZW5lcik7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3BhZ2VoaWRlJyxkaXNjb25uZWN0KTt9LAogICAgc3RhdHVzOmlkPT5jbGllbnQ/LnN0YXR1cyhpZCl8fCflsJrmnKrov57mjqUnLAogICAgbWVzc2FnZXM6aWQ9PnJlcXVpcmVDbGllbnQoKS5tZXNzYWdlcyhpZCksCiAgICBhc3luYyBzZW5kVGV4dChpZCx0ZXh0KXthd2FpdCBjaGVja0NvcmUoKTtyZXR1cm4gcmVxdWlyZUNsaWVudCgpLnNlbmQoaWQsdGV4dCk7fSwKICAgIGFzeW5jIHNlbmRGaWxlKGlkLGZpbGUpe2F3YWl0IGNoZWNrQ29yZSgpO3JldHVybiByZXF1aXJlQ2xpZW50KCkuc2VuZChpZCxg5paH5Lu277yaJHtmaWxlLm5hbWV9YCwnZmlsZScse30sZmlsZSk7fSwKICAgIG1hcmtSZWFkOmlkPT5yZXF1aXJlQ2xpZW50KCkuc3RvcmUubWFya1JlYWQoaWQpLAogICAgZnJpZW5kczooKT0+cmVxdWlyZUNsaWVudCgpLmFwaSgnL21ldGFkYXRhJyx7cGF0aDonL2ltL2ZyaWVuZHMnLG1ldGhvZDonR0VUJ30pLAogICAgYXN5bmMgb3BlbkNvbnZlcnNhdGlvbihwZWVyKXtjb25zdCBjPXJlcXVpcmVDbGllbnQoKTtjb25zdCByZXN1bHQ9YXdhaXQgYy5hcGkoJy9tZXRhZGF0YScse3BhdGg6Jy9pbS9jb252ZXJzYXRpb25zL2RpcmVjdCcsbWV0aG9kOidQT1NUJyxib2R5OntjdXJyZW50X3VzZXJfaWQ6Yy5zbmFwc2hvdC51c2VyLmlkLHBlZXJfdXNlcl9pZDpwZWVyfX0pO2F3YWl0IGMucG9sbCgpO3JldHVybiByZXN1bHQ7fSwKICAgIGJhY2t1cDpwYXNzd29yZD0+cmVxdWlyZUNsaWVudCgpLnN0b3JlLmJhY2t1cChwYXNzd29yZCksCiAgICByZXN0b3JlOihmaWxlLHBhc3N3b3JkKT0+cmVxdWlyZUNsaWVudCgpLnN0b3JlLnJlc3RvcmUoZmlsZSxwYXNzd29yZCksCiAgfSk7Cn0K",
      "server.mjs": "aW1wb3J0IHtjcmVhdGVTZXJ2ZXJ9IGZyb20gJ25vZGU6aHR0cCc7CmltcG9ydCB7cmVhZEZpbGUsbHN0YXR9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnOwppbXBvcnQge2ZpbGVVUkxUb1BhdGh9IGZyb20gJ25vZGU6dXJsJzsKaW1wb3J0IHtyYW5kb21CeXRlc30gZnJvbSAnbm9kZTpjcnlwdG8nOwppbXBvcnQgcGF0aCBmcm9tICdub2RlOnBhdGgnOwppbXBvcnQge2NoZWNrLHJlc3RvcmUsdXBkYXRlfSBmcm9tICcuL2d1YXJkLm1qcyc7CmNvbnN0IHJvb3Q9ZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuJyxpbXBvcnQubWV0YS51cmwpKTsKY29uc3QgbG9jYWxLZXk9cmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKCdoZXgnKTtsZXQgbXV0YXRpbmc9ZmFsc2U7CmNvbnN0IHR5cGVzPXsnLmh0bWwnOid0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLCcuanMnOid0ZXh0L2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgnLCcubWpzJzondGV4dC9qYXZhc2NyaXB0OyBjaGFyc2V0PXV0Zi04JywnLmNzcyc6J3RleHQvY3NzOyBjaGFyc2V0PXV0Zi04JywnLmpzb24nOidhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J307CmFzeW5jIGZ1bmN0aW9uIGhlYWx0aCgpe3RyeXtyZXR1cm4gYXdhaXQgY2hlY2soKTt9Y2F0Y2goZXJyb3Ipe3JldHVybiB7b2s6ZmFsc2UsZXJyb3I6ZXJyb3IubWVzc2FnZX07fX0KY29uc3Qgc2VydmVyPWNyZWF0ZVNlcnZlcihhc3luYyhyZXEscmVzKT0+ewogIGNvbnN0IHBvcnQ9c2VydmVyLmFkZHJlc3MoKS5wb3J0LGhvc3RzPW5ldyBTZXQoW2AxMjcuMC4wLjE6JHtwb3J0fWAsYGxvY2FsaG9zdDoke3BvcnR9YF0pOwogIGNvbnN0IGpzb249KGNvZGUsZGF0YSk9PnJlcy53cml0ZUhlYWQoY29kZSx7J0NvbnRlbnQtVHlwZSc6J2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLCdDYWNoZS1Db250cm9sJzonbm8tc3RvcmUnLCdYLUNvbnRlbnQtVHlwZS1PcHRpb25zJzonbm9zbmlmZid9KS5lbmQoSlNPTi5zdHJpbmdpZnkoZGF0YSkpOwogIHRyeXsKICAgIGlmKCFob3N0cy5oYXMocmVxLmhlYWRlcnMuaG9zdCkpcmV0dXJuIGpzb24oNDAzLHtlcnJvcjon5Y+q5YWB6K645pys5py65Zyw5Z2A44CCJ30pOwogICAgY29uc3Qgb3JpZ2luPWBodHRwOi8vJHtyZXEuaGVhZGVycy5ob3N0fWA7Y29uc3QgcmVxdWVzdFBhdGg9ZGVjb2RlVVJJQ29tcG9uZW50KG5ldyBVUkwocmVxLnVybCxvcmlnaW4pLnBhdGhuYW1lKTsKICAgIGlmKHJlcXVlc3RQYXRoPT09Jy9fX2NvcmUvc3RhdHVzJyYmcmVxLm1ldGhvZD09PSdHRVQnKXtjb25zdCByZXN1bHQ9YXdhaXQgaGVhbHRoKCk7cmV0dXJuIGpzb24oMjAwLHtvazpyZXN1bHQub2ssY2hlY2s6cmVzdWx0LGxvY2FsX2tleTpsb2NhbEtleX0pO30KICAgIGlmKFsnL19fY29yZS9yZXN0b3JlJywnL19fY29yZS91cGRhdGUnXS5pbmNsdWRlcyhyZXF1ZXN0UGF0aCkmJnJlcS5tZXRob2Q9PT0nUE9TVCcpewogICAgICBpZihyZXEuaGVhZGVycy5vcmlnaW4hPT1vcmlnaW58fHJlcS5oZWFkZXJzWyd4LXpodWdlLWxvY2FsLWtleSddIT09bG9jYWxLZXkpcmV0dXJuIGpzb24oNDAzLHtlcnJvcjon6K+35Zyo5pys5py65qOA5p+l6aG16Z2i5pON5L2c44CCJ30pOwogICAgICBpZihtdXRhdGluZylyZXR1cm4ganNvbig0MDkse2Vycm9yOiflj6bkuIDkuKrmgaLlpI3mk43kvZzmraPlnKjov5vooYzjgIInfSk7bXV0YXRpbmc9dHJ1ZTsKICAgICAgdHJ5e2xldCBzaXplPTA7Y29uc3QgcGFydHM9W107Zm9yIGF3YWl0KGNvbnN0IHBhcnQgb2YgcmVxKXtzaXplKz1wYXJ0Lmxlbmd0aDtpZihzaXplPjQwMDAwMDApdGhyb3cgbmV3IEVycm9yKCfmlofku7bov4flpKfjgIInKTtwYXJ0cy5wdXNoKHBhcnQpO31jb25zdCBib2R5PUpTT04ucGFyc2UoQnVmZmVyLmNvbmNhdChwYXJ0cykudG9TdHJpbmcoKXx8J3t9Jyk7cmV0dXJuIGpzb24oMjAwLHJlcXVlc3RQYXRoLmVuZHNXaXRoKCcvdXBkYXRlJyk/YXdhaXQgdXBkYXRlKGJvZHkpOmF3YWl0IHJlc3RvcmUoSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShwYXRoLmpvaW4ocm9vdCwncmVsZWFzZS5qc29uJyksJ3V0ZjgnKSkpKTt9CiAgICAgIGZpbmFsbHl7bXV0YXRpbmc9ZmFsc2U7fQogICAgfQogICAgaWYocmVxLm1ldGhvZCE9PSdHRVQnJiZyZXEubWV0aG9kIT09J0hFQUQnKXJldHVybiBqc29uKDQwNSx7ZXJyb3I6J+S4jeaUr+aMgeatpOaTjeS9nOOAgid9KTsKICAgIGlmKHJlcXVlc3RQYXRoLmluY2x1ZGVzKCdcXCcpfHxyZXF1ZXN0UGF0aC5zcGxpdCgnLycpLnNvbWUocD0+cC5zdGFydHNXaXRoKCcuJykpfHwvXlwvKHVzZXItYmFja3Vwc3xleHBlcmltZW50c3xub2RlX21vZHVsZXMpKFwvfCQpLy50ZXN0KHJlcXVlc3RQYXRoKSlyZXR1cm4ganNvbig0MDQse2Vycm9yOifmnKrmib7liLDmlofku7bjgIInfSk7CiAgICBpZihyZXF1ZXN0UGF0aD09PScvJ3x8cmVxdWVzdFBhdGg9PT0nL2luZGV4Lmh0bWwnKXsKICAgICAgaWYoIShhd2FpdCBoZWFsdGgoKSkub2spe3Jlcy53cml0ZUhlYWQoMzAyLHsnTG9jYXRpb24nOicvcmVjb3ZlcnkuaHRtbCcsJ0NhY2hlLUNvbnRyb2wnOiduby1zdG9yZSd9KS5lbmQoKTtyZXR1cm47fQogICAgfQogICAgY29uc3QgbmFtZT1yZXF1ZXN0UGF0aD09PScvJz8naW5kZXguaHRtbCc6cmVxdWVzdFBhdGguc2xpY2UoMSk7Y29uc3QgdGFyZ2V0PXBhdGgucmVzb2x2ZShyb290LG5hbWUpOwogICAgaWYoIXRhcmdldC5zdGFydHNXaXRoKHBhdGgucmVzb2x2ZShyb290KStwYXRoLnNlcCkpcmV0dXJuIGpzb24oNDA0LHtlcnJvcjon5pyq5om+5Yiw5paH5Lu244CCJ30pOwogICAgbGV0IHBhcnRpYWw9cm9vdDtmb3IoY29uc3QgcGFydCBvZiBuYW1lLnNwbGl0KCcvJykpe3BhcnRpYWw9cGF0aC5qb2luKHBhcnRpYWwscGFydCk7aWYoKGF3YWl0IGxzdGF0KHBhcnRpYWwpKS5pc1N5bWJvbGljTGluaygpKXJldHVybiBqc29uKDQwNCx7ZXJyb3I6J+acquaJvuWIsOaWh+S7tuOAgid9KTt9CiAgICBjb25zdCBkYXRhPWF3YWl0IHJlYWRGaWxlKHRhcmdldCk7CiAgICByZXMud3JpdGVIZWFkKDIwMCx7J0NvbnRlbnQtVHlwZSc6dHlwZXNbcGF0aC5leHRuYW1lKHRhcmdldCldfHwnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywnQ2FjaGUtQ29udHJvbCc6J25vLXN0b3JlJywnWC1Db250ZW50LVR5cGUtT3B0aW9ucyc6J25vc25pZmYnLCdDb250ZW50LVNlY3VyaXR5LVBvbGljeSc6cmVxdWVzdFBhdGg9PT0nL2V4dGVuc2lvbi13b3JrZXIuanMnPyJkZWZhdWx0LXNyYyAnbm9uZSc7IHNjcmlwdC1zcmMgJ3NlbGYnOyBjb25uZWN0LXNyYyAnbm9uZSc7IHdvcmtlci1zcmMgJ25vbmUnIjoiZnJhbWUtYW5jZXN0b3JzICdub25lJzsgb2JqZWN0LXNyYyAnbm9uZSc7IGJhc2UtdXJpICdub25lJyJ9KS5lbmQocmVxLm1ldGhvZD09PSdIRUFEJz91bmRlZmluZWQ6ZGF0YSk7CiAgfWNhdGNoKGVycm9yKXtqc29uKGVycm9yLmNvZGU9PT0nRU5PRU5UJz80MDQ6NDAwLHtlcnJvcjplcnJvci5jb2RlPT09J0VOT0VOVCc/J+acquaJvuWIsOaWh+S7tuOAgic6ZXJyb3IubWVzc2FnZX0pO30KfSk7CnNlcnZlci5saXN0ZW4oTnVtYmVyKHByb2Nlc3MuZW52LlBPUlR8fDQxODYpLCcxMjcuMC4wLjEnLGFzeW5jKCk9PmNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHt1cmw6YGh0dHA6Ly8xMjcuMC4wLjE6JHtzZXJ2ZXIuYWRkcmVzcygpLnBvcnR9YCxjb3JlOmF3YWl0IGhlYWx0aCgpfSkpKTsK",
      "src/client.ts": "aW1wb3J0IHsgTG9jYWxDaGF0U3RvcmUsIENoYXRSZWNvcmQsIHRvQmFzZTY0LCBmcm9tQmFzZTY0IH0gZnJvbSAiLi9zdG9yYWdlIjsNCg0KZXhwb3J0IHR5cGUgQ29udmVyc2F0aW9uID0geyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyBjb252ZXJzYXRpb25fdHlwZT86IHN0cmluZzsgcGFydGljaXBhbnRzOiB7IHVzZXJfaWQ6IG51bWJlcjsgZGlzcGxheV9uYW1lOiBzdHJpbmcgfVtdOyBba2V5OiBzdHJpbmddOiB1bmtub3duIH07DQp0eXBlIExpbmsgPSB7IHBlZXJfdXNlcl9pZDogbnVtYmVyOyBwZWVyX3BhZ2VfaWQ6IHN0cmluZyB8IG51bGw7IG9ubGluZTogYm9vbGVhbiB9Ow0KdHlwZSBTaWduYWwgPSB7IGlkOiBudW1iZXI7IHBlZXJfdXNlcl9pZDogbnVtYmVyOyBjaGFubmVsX2lkOiBzdHJpbmc7IHNpZ25hbF90eXBlOiAib2ZmZXIifCJhbnN3ZXIifCJpY2UiOyBzaWduYWw6IFJUQ1Nlc3Npb25EZXNjcmlwdGlvbkluaXQgJiBSVENJY2VDYW5kaWRhdGVJbml0IH07DQpleHBvcnQgdHlwZSBTbmFwc2hvdCA9IHsgdXNlcjoge2lkOiBudW1iZXI7IGVudGVycHJpc2VfaWQ6IG51bWJlcjsgZGlzcGxheV9uYW1lOiBzdHJpbmd9OyBjb252ZXJzYXRpb25zOiBDb252ZXJzYXRpb25bXTsgcGVlcnM6IExpbmtbXTsgc2lnbmFsczogU2lnbmFsW107IGljZV9zZXJ2ZXJzOiBSVENJY2VTZXJ2ZXJbXTsgdHJhbnNwb3J0OiBzdHJpbmcgfTsNCnR5cGUgV2lyZSA9IHsgdHlwZTogIm1lc3NhZ2UiOyB2ZXJzaW9uOiAxOyBpZDogc3RyaW5nOyBjb252ZXJzYXRpb25faWQ6IG51bWJlcjsgc2VuZGVyX3VzZXJfaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nOyBtZXNzYWdlX3R5cGU6IHN0cmluZzsgY3JlYXRlZF9hdDogc3RyaW5nOyBtZXRhZGF0YV9qc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9Ow0KdHlwZSBQZWVyID0geyBsaW5rOiBMaW5rOyBwYzogUlRDUGVlckNvbm5lY3Rpb247IGNoYW5uZWw/OiBSVENEYXRhQ2hhbm5lbDsgY2hhbm5lbElkOiBzdHJpbmc7IHBlbmRpbmc6IFJUQ0ljZUNhbmRpZGF0ZUluaXRbXTsgcmVhZHk6IGJvb2xlYW47IHF1ZXVlOiBQcm9taXNlPHZvaWQ+OyBwdW1waW5nOiBib29sZWFuOyBzZWVuOiBTZXQ8bnVtYmVyPjsgc3RhcnRlZDogbnVtYmVyOyBzaWduYWxRdWV1ZTogUHJvbWlzZTx2b2lkPiB9Ow0KdHlwZSBUcmFuc2ZlciA9IHsgbWVzc2FnZTogV2lyZTsgcGFydHM6IFVpbnQ4QXJyYXk8QXJyYXlCdWZmZXI+W107IHJlY2VpdmVkOiBudW1iZXI7IGNodW5rczogbnVtYmVyOyB0b3VjaGVkOiBudW1iZXIgfTsNCmNvbnN0IE1BWF9GSUxFID0gMjUqMTAyNCoxMDI0Ow0KY29uc3QgQ0hVTksgPSAxMioxMDI0Ow0KY29uc3QgVVVJRCA9IC9eW2EtZjAtOS1dezM2fSQvaTsNCmV4cG9ydCB0eXBlIERpcmVjdE9wdGlvbnMgPSB7IGJhc2VVcmw6IHN0cmluZzsgdG9rZW46ICgpID0+IHN0cmluZzsgb25DaGFuZ2U/OiAoKSA9PiB2b2lkOyBvbk5vdGljZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQgfTsNCg0KZXhwb3J0IGNsYXNzIERpcmVjdENoYXRDbGllbnQgew0KICByZWFkb25seSBwYWdlSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpOw0KICBzdG9yZT86IExvY2FsQ2hhdFN0b3JlOw0KICBzbmFwc2hvdD86IFNuYXBzaG90Ow0KICBwcml2YXRlIHBlZXJzID0gbmV3IE1hcDxudW1iZXIsIFBlZXI+KCk7DQogIHByaXZhdGUgaW5ib3VuZCA9IG5ldyBNYXA8c3RyaW5nLCBUcmFuc2Zlcj4oKTsNCiAgcHJpdmF0ZSB0aW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+Ow0KICBwcml2YXRlIGFsaXZlID0gZmFsc2U7CiAgcHJpdmF0ZSBwb2xsaW5nID0gZmFsc2U7CiAgcHJpdmF0ZSBhdXRoZW50aWNhdGVkQXQgPSAwOw0KICBwcml2YXRlIG5leHRTZW5kID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTsNCiAgcHJpdmF0ZSByZWxlYXNlZD86ICgpID0+IHZvaWQ7DQogIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG9wdGlvbnM6IERpcmVjdE9wdGlvbnMpIHt9DQogIGFzeW5jIGFwaTxUPihwYXRoOiBzdHJpbmcsIGJvZHk/OiB1bmtub3duLCBtZXRob2QgPSAiUE9TVCIpOiBQcm9taXNlPFQ+IHsKICAgIGlmICghdGhpcy5hbGl2ZSkgdGhyb3cgbmV3IEVycm9yKCLov57mjqXlt7Lnu5PmnZ/vvIzor7fph43mlrDmiZPlvIDogYrlpKnjgIIiKTsKICAgIGNvbnN0IHRva2VuID0gdGhpcy5vcHRpb25zLnRva2VuKCk7DQogICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKCLor7flhYjov57mjqXoh6rlt7HnmoTotKblj7fjgIIiKTsNCiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3RoaXMub3B0aW9ucy5iYXNlVXJsLnJlcGxhY2UoL1wvJC8sICIiKX0ke3BhdGh9YCwgew0KICAgICAgbWV0aG9kLCBjcmVkZW50aWFsczogIm9taXQiLCBjYWNoZTogIm5vLXN0b3JlIiwgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KDEyMDAwKSwNCiAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAgfSwNCiAgICAgIGJvZHk6IGJvZHkgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IEpTT04uc3RyaW5naWZ5KGJvZHkpLA0KICAgIH0pOw0KICAgIGlmICghcmVzcG9uc2Uub2spIHsNCiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDQwMSB8fCByZXNwb25zZS5zdGF0dXMgPT09IDQwMykgdGhpcy5kaXNjb25uZWN0UGVlcnMoKTsNCiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7CiAgICAgIGlmIChkYXRhLmRldGFpbD8uY29kZSA9PT0gImRldmljZV9yZXBsYWNlZCIpIHsgdGhpcy5zdG9wKCk7IHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbC5tZXNzYWdlKTsgfQogICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIGRhdGEuZGV0YWlsID09PSAic3RyaW5nIiA/IGRhdGEuZGV0YWlsIDogYOi/nuaOpeaaguaXtuacquWujOaIkO+8iCR7cmVzcG9uc2Uuc3RhdHVzfe+8ieOAgmApOw0KICAgIH0NCiAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOw0KICB9DQogIGFzeW5jIHN0YXJ0KCkgew0KICAgIGlmICh0aGlzLmFsaXZlKSByZXR1cm47DQogICAgdGhpcy5hbGl2ZSA9IHRydWU7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGlkZW50aXR5ID0gYXdhaXQgdGhpcy5hcGk8e2lkOm51bWJlcn0+KCIvaWRlbnRpdHkiLCB1bmRlZmluZWQsICJHRVQiKTsKICAgICAgaWYgKCF0aGlzLmFsaXZlKSByZXR1cm47DQogICAgICAvLyBPbmUgdGFiIHBlciBhY2NvdW50L29yaWdpbiBvd25zIGEgZGV2aWNlIG5vZGU7IG90aGVyIHRhYnMgbmV2ZXIgZmlnaHQgb3ZlciBzaWduYWxpbmcuDQogICAgICBpZiAobmF2aWdhdG9yLmxvY2tzKSBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSxyZWplY3QpID0+IHsNCiAgICAgICAgdm9pZCBuYXZpZ2F0b3IubG9ja3MucmVxdWVzdChgemh1Z2UtZGlyZWN0LWltLSR7aWRlbnRpdHkuaWR9YCwgeyBpZkF2YWlsYWJsZTogdHJ1ZSB9LCBhc3luYyBsb2NrID0+IHsKICAgICAgICAgIGlmICghbG9jaykgeyByZWplY3QobmV3IEVycm9yKCLmraTotKblj7flt7LlnKjlj6bkuIDkuKrnqpflj6PmiZPlvIDogYrlpKnvvIzor7flhYjlhbPpl63pgqPkuKrnqpflj6PjgIIiKSk7IHJldHVybjsgfQ0KICAgICAgICAgIHJlc29sdmUoKTsgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVsZWFzZSA9PiB7IHRoaXMucmVsZWFzZWQgPSByZWxlYXNlOyB9KTsNCiAgICAgICAgfSk7DQogICAgICB9KTsNCiAgICAgIHRoaXMuc3RvcmUgPSBuZXcgTG9jYWxDaGF0U3RvcmUoaWRlbnRpdHkuaWQpOyBhd2FpdCB0aGlzLnN0b3JlLm9wZW4oKTsKICAgICAgaWYgKCF0aGlzLmFsaXZlKSB7IHRoaXMuc3RvcmUuY2xvc2UoKTsgdGhpcy5yZWxlYXNlZD8uKCk7IHJldHVybjsgfQogICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHRoaXMuYXBpPFNuYXBzaG90PigiL3BvbGwiLCB7IHBhZ2VfaWQ6IHRoaXMucGFnZUlkLCBhY3RpdmF0ZTogdHJ1ZSB9KTsKICAgICAgdGhpcy5zbmFwc2hvdCA9IGZpcnN0OyB0aGlzLmF1dGhlbnRpY2F0ZWRBdCA9IERhdGUubm93KCk7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7DQogICAgICB2b2lkIG5hdmlnYXRvci5zdG9yYWdlPy5wZXJzaXN0Py4oKS5jYXRjaCgoKSA9PiBmYWxzZSk7DQogICAgICBhd2FpdCB0aGlzLmFwcGx5U25hcHNob3QoZmlyc3QpOw0KICAgICAgdGhpcy5zY2hlZHVsZSgpOw0KICAgIH0gY2F0Y2ggKGVycm9yKSB7IHRoaXMuc3RvcCgpOyB0aHJvdyBlcnJvcjsgfQ0KICB9DQogIHByaXZhdGUgc2NoZWR1bGUoKSB7IGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsgaWYgKHRoaXMuYWxpdmUpIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHZvaWQgdGhpcy5wb2xsKCksIDI1MDApOyB9CiAgYXN5bmMgcG9sbCgpIHsNCiAgICBpZiAoIXRoaXMuYWxpdmUgfHwgdGhpcy5wb2xsaW5nKSByZXR1cm47CiAgICB0aGlzLnBvbGxpbmcgPSB0cnVlOwogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmFwaTxTbmFwc2hvdD4oIi9wb2xsIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCB9KTsNCiAgICAgIGlmICghdGhpcy5hbGl2ZSkgcmV0dXJuOw0KICAgICAgaWYgKHRoaXMuc3RvcmU/LmFjY291bnQgIT09IGRhdGEudXNlci5pZCkgeyB0aGlzLnN0b3AoKTsgdGhyb3cgbmV3IEVycm9yKCLotKblj7flt7LmlLnlj5jvvIzor7fph43mlrDmiZPlvIDogYrlpKnjgIIiKTsgfQ0KICAgICAgdGhpcy5hdXRoZW50aWNhdGVkQXQgPSBEYXRlLm5vdygpOyB0aGlzLnNuYXBzaG90ID0gZGF0YTsNCiAgICAgIGF3YWl0IHRoaXMuYXBwbHlTbmFwc2hvdChkYXRhKTsgdGhpcy5vcHRpb25zLm9uQ2hhbmdlPy4oKTsNCiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIEFycmF5LmZyb20odGhpcy5pbmJvdW5kKSkgaWYgKERhdGUubm93KCktdmFsdWUudG91Y2hlZCA+IDYwMDAwKSB0aGlzLmluYm91bmQuZGVsZXRlKGtleSk7DQogICAgfSBjYXRjaCAoZXJyb3IpIHsgdGhpcy5ub3RpY2UoZXJyb3IpOyB9IGZpbmFsbHkgeyB0aGlzLnBvbGxpbmcgPSBmYWxzZTsgdGhpcy5zY2hlZHVsZSgpOyB9CiAgfQ0KICBwcml2YXRlIG5vdGljZShlcnJvcjogdW5rbm93bikgeyB0aGlzLm9wdGlvbnMub25Ob3RpY2U/LihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICLov57mjqXmmoLml7bkuI3lj6/nlKjjgIIiKTsgfQ0KICBwcml2YXRlIGFsbG93ZWQocGVlcjogbnVtYmVyLCBjb252ZXJzYXRpb246IG51bWJlcikgew0KICAgIGNvbnN0IGMgPSB0aGlzLnNuYXBzaG90Py5jb252ZXJzYXRpb25zLmZpbmQoYyA9PiBjLmlkID09PSBjb252ZXJzYXRpb24pOw0KICAgIHJldHVybiBEYXRlLm5vdygpLXRoaXMuYXV0aGVudGljYXRlZEF0IDwgMTIwMDAwICYmICEhYz8ucGFydGljaXBhbnRzLnNvbWUocCA9PiBwLnVzZXJfaWQgPT09IHBlZXIpICYmICEhYy5wYXJ0aWNpcGFudHMuc29tZShwID0+IHAudXNlcl9pZCA9PT0gdGhpcy5zdG9yZT8uYWNjb3VudCk7DQogIH0NCiAgcHJpdmF0ZSBhc3luYyBhcHBseVNuYXBzaG90KGRhdGE6IFNuYXBzaG90KSB7DQogICAgaWYgKGRhdGEudHJhbnNwb3J0ICE9PSAiZGlyZWN0X29ubHkiKSB0aHJvdyBuZXcgRXJyb3IoIuW9k+WJjei/nuaOpeaWueW8j+S4jeespuWQiOiuvuWkh+ebtOi/nuimgeaxguOAgiIpOw0KICAgIGNvbnN0IHJlYWNoYWJsZSA9IG5ldyBTZXQoZGF0YS5wZWVycy5tYXAobCA9PiBsLnBlZXJfdXNlcl9pZCkpOw0KICAgIGZvciAoY29uc3QgW3VpZCwgcGVlcl0gb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzKSkgaWYgKCFyZWFjaGFibGUuaGFzKHVpZCkpIHRoaXMuY2xvc2VQZWVyKHVpZCwgcGVlcik7DQogICAgZm9yIChjb25zdCBsaW5rIG9mIGRhdGEucGVlcnMpIHsNCiAgICAgIGxldCBwZWVyID0gdGhpcy5wZWVycy5nZXQobGluay5wZWVyX3VzZXJfaWQpOw0KICAgICAgaWYgKHBlZXIgJiYgbGluay5vbmxpbmUgJiYgcGVlci5saW5rLnBlZXJfcGFnZV9pZCAhPT0gbGluay5wZWVyX3BhZ2VfaWQpIHsgdGhpcy5jbG9zZVBlZXIobGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOyBwZWVyID0gdW5kZWZpbmVkOyB9DQogICAgICBpZiAocGVlciAmJiAhcGVlci5yZWFkeSAmJiBEYXRlLm5vdygpLXBlZXIuc3RhcnRlZCA+IDI1MDAwKSB7IHRoaXMuY2xvc2VQZWVyKGxpbmsucGVlcl91c2VyX2lkLCBwZWVyKTsgcGVlciA9IHVuZGVmaW5lZDsgfQ0KICAgICAgLy8gQSBmYWlsZWQgcHJlc2VuY2UgcmVxdWVzdCBtdXN0IG5vdCB0ZWFyIGRvd24gYW4gZXN0YWJsaXNoZWQgZGlyZWN0IGNvbm5lY3Rpb24uDQogICAgICBpZiAoIXBlZXIgJiYgbGluay5vbmxpbmUpIHsNCiAgICAgICAgcGVlciA9IHRoaXMuY3JlYXRlUGVlcihsaW5rKTsNCiAgICAgICAgaWYgKGRhdGEudXNlci5pZCA8IGxpbmsucGVlcl91c2VyX2lkKSB7DQogICAgICAgICAgdGhpcy5jb25maWd1cmVDaGFubmVsKHBlZXIsIHBlZXIucGMuY3JlYXRlRGF0YUNoYW5uZWwoInpodWdlLWltLXYxIiwgeyBvcmRlcmVkOiB0cnVlIH0pKTsNCiAgICAgICAgICBjb25zdCBvZmZlciA9IGF3YWl0IHBlZXIucGMuY3JlYXRlT2ZmZXIoKTsgYXdhaXQgcGVlci5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKG9mZmVyKTsNCiAgICAgICAgICBhd2FpdCB0aGlzLnNlbmRTaWduYWwocGVlciwgIm9mZmVyIiwgeyB0eXBlOiAib2ZmZXIiLCBzZHA6IG9mZmVyLnNkcCB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBjb25zdCBhY2s6IG51bWJlcltdID0gW107DQogICAgZm9yIChjb25zdCBzaWduYWwgb2YgZGF0YS5zaWduYWxzKSB7DQogICAgICBjb25zdCBwZWVyID0gdGhpcy5wZWVycy5nZXQoc2lnbmFsLnBlZXJfdXNlcl9pZCk7DQogICAgICBpZiAoIXBlZXIpIGNvbnRpbnVlOw0KICAgICAgaWYgKCFwZWVyLnNlZW4uaGFzKHNpZ25hbC5pZCkpIHsNCiAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy5hY2NlcHRTaWduYWwocGVlciwgc2lnbmFsKTsgcGVlci5zZWVuLmFkZChzaWduYWwuaWQpOyB9DQogICAgICAgIGNhdGNoIHsgY29udGludWU7IH0NCiAgICAgIH0NCiAgICAgIGFjay5wdXNoKHNpZ25hbC5pZCk7DQogICAgfQ0KICAgIGlmIChhY2subGVuZ3RoKSBhd2FpdCB0aGlzLmFwaSgiL3NpZ25hbHMvYWNrIiwge3BhZ2VfaWQ6IHRoaXMucGFnZUlkLCBpZHM6IGFja30pOw0KICAgIGZvciAoY29uc3QgcGVlciBvZiBBcnJheS5mcm9tKHRoaXMucGVlcnMudmFsdWVzKCkpKSBpZiAocGVlci5yZWFkeSkgdm9pZCB0aGlzLnB1bXAocGVlcik7DQogIH0NCiAgcHJpdmF0ZSBjcmVhdGVQZWVyKGxpbms6IExpbmspOiBQZWVyIHsNCiAgICBjb25zdCBpY2UgPSAodGhpcy5zbmFwc2hvdD8uaWNlX3NlcnZlcnMgfHwgW10pLm1hcChzID0+ICh7IHVybHM6IChBcnJheS5pc0FycmF5KHMudXJscykgPyBzLnVybHMgOiBbcy51cmxzXSkuZmlsdGVyKHUgPT4gdS5zdGFydHNXaXRoKCJzdHVuOiIpKSB9KSkuZmlsdGVyKHMgPT4gcy51cmxzLmxlbmd0aCk7DQogICAgY29uc3QgcGMgPSBuZXcgUlRDUGVlckNvbm5lY3Rpb24oeyBpY2VTZXJ2ZXJzOiBpY2UgfSk7DQogICAgY29uc3QgcGVlcjogUGVlciA9IHsgbGluaywgcGMsIGNoYW5uZWxJZDogY3J5cHRvLnJhbmRvbVVVSUQoKSwgcGVuZGluZzogW10sIHJlYWR5OiBmYWxzZSwgcXVldWU6IFByb21pc2UucmVzb2x2ZSgpLCBwdW1waW5nOiBmYWxzZSwgc2VlbjogbmV3IFNldCgpLCBzdGFydGVkOiBEYXRlLm5vdygpLCBzaWduYWxRdWV1ZTogUHJvbWlzZS5yZXNvbHZlKCkgfTsNCiAgICB0aGlzLnBlZXJzLnNldChsaW5rLnBlZXJfdXNlcl9pZCwgcGVlcik7DQogICAgcGMub25pY2VjYW5kaWRhdGUgPSBlID0+IHsgaWYgKGUuY2FuZGlkYXRlKSB7IGNvbnN0IGMgPSBlLmNhbmRpZGF0ZS50b0pTT04oKTsgdm9pZCB0aGlzLnNlbmRTaWduYWwocGVlciwgImljZSIsIHsgY2FuZGlkYXRlOiBjLmNhbmRpZGF0ZSwgc2RwTWlkOiBjLnNkcE1pZCwgc2RwTUxpbmVJbmRleDogYy5zZHBNTGluZUluZGV4IH0pLmNhdGNoKGVycm9yID0+IHRoaXMubm90aWNlKGVycm9yKSk7IH0gfTsNCiAgICBwYy5vbmRhdGFjaGFubmVsID0gZSA9PiB0aGlzLmNvbmZpZ3VyZUNoYW5uZWwocGVlciwgZS5jaGFubmVsKTsNCiAgICBwYy5vbmNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9ICgpID0+IHsgaWYgKFsiZmFpbGVkIiwgImNsb3NlZCJdLmluY2x1ZGVzKHBjLmNvbm5lY3Rpb25TdGF0ZSkpIHsgcGVlci5yZWFkeSA9IGZhbHNlOyB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyB9IH07DQogICAgcmV0dXJuIHBlZXI7DQogIH0NCiAgcHJpdmF0ZSBhc3luYyBzZW5kU2lnbmFsKHBlZXI6IFBlZXIsIHR5cGU6IHN0cmluZywgc2lnbmFsOiB1bmtub3duKSB7DQogICAgaWYgKCF0aGlzLmFsaXZlKSByZXR1cm47DQogICAgY29uc3Qgc2VuZCA9ICgpID0+IHRoaXMuYXBpKCIvc2lnbmFscyIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQsIHBlZXJfdXNlcl9pZDogcGVlci5saW5rLnBlZXJfdXNlcl9pZCwNCiAgICAgIHBlZXJfcGFnZV9pZDogcGVlci5saW5rLnBlZXJfcGFnZV9pZCwgY2hhbm5lbF9pZDogcGVlci5jaGFubmVsSWQsIHNpZ25hbF90eXBlOiB0eXBlLCBzaWduYWwgfSkudGhlbigoKSA9PiB1bmRlZmluZWQpOw0KICAgIHBlZXIuc2lnbmFsUXVldWUgPSBwZWVyLnNpZ25hbFF1ZXVlLnRoZW4oc2VuZCk7IHJldHVybiBwZWVyLnNpZ25hbFF1ZXVlOw0KICB9DQogIHByaXZhdGUgYXN5bmMgYWNjZXB0U2lnbmFsKHBlZXI6IFBlZXIsIHNpZ25hbDogU2lnbmFsKSB7DQogICAgaWYgKHNpZ25hbC5zaWduYWxfdHlwZSA9PT0gIm9mZmVyIikgew0KICAgICAgaWYgKHRoaXMuc3RvcmUhLmFjY291bnQgPCBwZWVyLmxpbmsucGVlcl91c2VyX2lkKSByZXR1cm47DQogICAgICBpZiAocGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gInN0YWJsZSIgfHwgcGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikgcmV0dXJuOw0KICAgICAgcGVlci5jaGFubmVsSWQgPSBzaWduYWwuY2hhbm5lbF9pZDsNCiAgICAgIGF3YWl0IHBlZXIucGMuc2V0UmVtb3RlRGVzY3JpcHRpb24oc2lnbmFsLnNpZ25hbCk7DQogICAgICBmb3IgKGNvbnN0IGMgb2YgcGVlci5wZW5kaW5nLnNwbGljZSgwKSkgYXdhaXQgcGVlci5wYy5hZGRJY2VDYW5kaWRhdGUoYyk7DQogICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBwZWVyLnBjLmNyZWF0ZUFuc3dlcigpOyBhd2FpdCBwZWVyLnBjLnNldExvY2FsRGVzY3JpcHRpb24oYW5zd2VyKTsNCiAgICAgIGF3YWl0IHRoaXMuc2VuZFNpZ25hbChwZWVyLCAiYW5zd2VyIiwge3R5cGU6ICJhbnN3ZXIiLCBzZHA6IGFuc3dlci5zZHB9KTsNCiAgICB9IGVsc2UgaWYgKHNpZ25hbC5zaWduYWxfdHlwZSA9PT0gImFuc3dlciIpIHsNCiAgICAgIGlmIChzaWduYWwuY2hhbm5lbF9pZCAhPT0gcGVlci5jaGFubmVsSWQgfHwgcGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gImhhdmUtbG9jYWwtb2ZmZXIiKSByZXR1cm47DQogICAgICBhd2FpdCBwZWVyLnBjLnNldFJlbW90ZURlc2NyaXB0aW9uKHNpZ25hbC5zaWduYWwpOw0KICAgICAgZm9yIChjb25zdCBjIG9mIHBlZXIucGVuZGluZy5zcGxpY2UoMCkpIGF3YWl0IHBlZXIucGMuYWRkSWNlQ2FuZGlkYXRlKGMpOw0KICAgIH0gZWxzZSB7DQogICAgICBpZiAodGhpcy5zdG9yZSEuYWNjb3VudCA8IHBlZXIubGluay5wZWVyX3VzZXJfaWQgJiYgc2lnbmFsLmNoYW5uZWxfaWQgIT09IHBlZXIuY2hhbm5lbElkKSByZXR1cm47DQogICAgICBpZiAocGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikgYXdhaXQgcGVlci5wYy5hZGRJY2VDYW5kaWRhdGUoc2lnbmFsLnNpZ25hbCk7DQogICAgICBlbHNlIHBlZXIucGVuZGluZy5wdXNoKHNpZ25hbC5zaWduYWwpOw0KICAgIH0NCiAgfQ0KICBwcml2YXRlIGNvbmZpZ3VyZUNoYW5uZWwocGVlcjogUGVlciwgY2hhbm5lbDogUlRDRGF0YUNoYW5uZWwpIHsNCiAgICBpZiAoY2hhbm5lbC5sYWJlbCAhPT0gInpodWdlLWltLXYxIiB8fCBwZWVyLmNoYW5uZWwpIHsgY2hhbm5lbC5jbG9zZSgpOyByZXR1cm47IH0NCiAgICBwZWVyLmNoYW5uZWwgPSBjaGFubmVsOw0KICAgIGNoYW5uZWwub25vcGVuID0gYXN5bmMgKCkgPT4gew0KICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBwZWVyLnBjLmdldFN0YXRzKCk7IGxldCByZWxheSA9IGZhbHNlOw0KICAgICAgc3RhdHMuZm9yRWFjaChzID0+IHsgaWYgKChzLnR5cGUgPT09ICJsb2NhbC1jYW5kaWRhdGUiIHx8IHMudHlwZSA9PT0gInJlbW90ZS1jYW5kaWRhdGUiKSAmJiBzLmNhbmRpZGF0ZVR5cGUgPT09ICJyZWxheSIpIHJlbGF5ID0gdHJ1ZTsgfSk7DQogICAgICBpZiAocmVsYXkpIHsgdGhpcy5jbG9zZVBlZXIocGVlci5saW5rLnBlZXJfdXNlcl9pZCwgcGVlcik7IHRoaXMubm90aWNlKG5ldyBFcnJvcigi5bey5YGc5q2i5Lit57un6L+e5o6l77yM6K+35L2/55So5Y+v55u06L+e572R57uc44CCIikpOyByZXR1cm47IH0NCiAgICAgIHBlZXIucmVhZHkgPSB0cnVlOyB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyB2b2lkIHRoaXMucHVtcChwZWVyKTsNCiAgICB9Ow0KICAgIGNoYW5uZWwub25jbG9zZSA9IGNoYW5uZWwub25lcnJvciA9ICgpID0+IHsgcGVlci5yZWFkeSA9IGZhbHNlOyB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyB9Ow0KICAgIGNoYW5uZWwub25tZXNzYWdlID0gZXZlbnQgPT4gew0KICAgICAgaWYgKHR5cGVvZiBldmVudC5kYXRhICE9PSAic3RyaW5nIiB8fCBldmVudC5kYXRhLmxlbmd0aCA+IDI0MDAwKSByZXR1cm47DQogICAgICAvLyBQcmVzZXJ2ZSB3aXJlIG9yZGVyIGFjcm9zcyBhc3luY2hyb25vdXMgSW5kZXhlZERCL2hhc2ggb3BlcmF0aW9ucy4NCiAgICAgIHBlZXIucXVldWUgPSBwZWVyLnF1ZXVlLnRoZW4oKCkgPT4gdGhpcy5yZWNlaXZlKHBlZXIsIEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpKS5jYXRjaChlcnJvciA9PiB0aGlzLm5vdGljZShlcnJvcikpOw0KICAgIH07DQogIH0NCiAgcHJpdmF0ZSBhc3luYyB3cml0ZShwZWVyOiBQZWVyLCB2YWx1ZTogdW5rbm93bikgew0KICAgIGNvbnN0IGNoYW5uZWwgPSBwZWVyLmNoYW5uZWw7DQogICAgaWYgKCF0aGlzLmFsaXZlIHx8ICFjaGFubmVsIHx8IGNoYW5uZWwucmVhZHlTdGF0ZSAhPT0gIm9wZW4iKSB0aHJvdyBuZXcgRXJyb3IoIuWvueaWueaaguaXtuemu+e6v++8jOa2iOaBr+S8mueVmeWcqOacrOacuuetieW+hemHjei/nuOAgiIpOw0KICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpOw0KICAgIHdoaWxlIChjaGFubmVsLmJ1ZmZlcmVkQW1vdW50ID4gMjU2KjEwMjQpIHsNCiAgICAgIGlmIChEYXRlLm5vdygpLXN0YXJ0ZWQgPiAxNTAwMCB8fCBjaGFubmVsLnJlYWR5U3RhdGUgIT09ICJvcGVuIiB8fCAhdGhpcy5hbGl2ZSkgdGhyb3cgbmV3IEVycm9yKCLmlofku7bkvKDovpPkuK3mlq3vvIzmraPlnKjnrYnlvoXph43ov57jgIIiKTsNCiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNSkpOw0KICAgIH0NCiAgICBjaGFubmVsLnNlbmQoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsNCiAgfQ0KICBwcml2YXRlIGFzeW5jIHB1bXAocGVlcjogUGVlcikgew0KICAgIGlmIChwZWVyLnB1bXBpbmcgfHwgIXRoaXMuc3RvcmUpIHJldHVybjsNCiAgICBwZWVyLnB1bXBpbmcgPSB0cnVlOw0KICAgIHRyeSB7DQogICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5zdG9yZS5saXN0KCk7DQogICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3Jkcykgew0KICAgICAgICBjb25zdCBrZXkgPSBgJHtyLmRpcmVjdF9pZH06JHtwZWVyLmxpbmsucGVlcl91c2VyX2lkfWA7DQogICAgICAgIGlmICghci5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgIXRoaXMuYWxsb3dlZChwZWVyLmxpbmsucGVlcl91c2VyX2lkLHIuY29udmVyc2F0aW9uX2lkKSB8fCAodGhpcy5uZXh0U2VuZC5nZXQoa2V5KXx8MCk+RGF0ZS5ub3coKSkgY29udGludWU7DQogICAgICAgIHRoaXMubmV4dFNlbmQuc2V0KGtleSwgRGF0ZS5ub3coKSszMDAwMCk7DQogICAgICAgIGNvbnN0IHdpcmU6IFdpcmUgPSB7dHlwZToibWVzc2FnZSIsIHZlcnNpb246MSwgaWQ6ci5kaXJlY3RfaWQsIGNvbnZlcnNhdGlvbl9pZDpyLmNvbnZlcnNhdGlvbl9pZCwNCiAgICAgICAgICBzZW5kZXJfdXNlcl9pZDpyLnNlbmRlcl91c2VyX2lkLCBjb250ZW50OnIuY29udGVudCwgbWVzc2FnZV90eXBlOnIubWVzc2FnZV90eXBlLCBjcmVhdGVkX2F0OnIuY3JlYXRlZF9hdCwgbWV0YWRhdGFfanNvbjpyLm1ldGFkYXRhX2pzb259Ow0KICAgICAgICBhd2FpdCB0aGlzLndyaXRlKHBlZXIsIHdpcmUpOw0KICAgICAgICBpZiAoci5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIikgew0KICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbGUoci5kaXJlY3RfaWQpOw0KICAgICAgICAgIGlmICghZmlsZSkgdGhyb3cgbmV3IEVycm9yKCLlvoXlj5Hmlofku7blt7LkuI3lnKjmnKzmnLrvvIzor7fph43mlrDpgInmi6nmlofku7bjgIIiKTsNCiAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlsZSk7DQogICAgICAgICAgZm9yIChsZXQgc3RhcnQ9MDtzdGFydDxkYXRhLmxlbmd0aDtzdGFydCs9Q0hVTkspIGF3YWl0IHRoaXMud3JpdGUocGVlciwge3R5cGU6ImNodW5rIiwgaWQ6ci5kaXJlY3RfaWQsIGluZGV4OnN0YXJ0L0NIVU5LLCBkYXRhOnRvQmFzZTY0KGRhdGEuc3ViYXJyYXkoc3RhcnQsc3RhcnQrQ0hVTkspKX0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSBjYXRjaCAoZXJyb3IpIHsgdGhpcy5ub3RpY2UoZXJyb3IpOyB9IGZpbmFsbHkgeyBwZWVyLnB1bXBpbmcgPSBmYWxzZTsgfQ0KICB9DQogIHByaXZhdGUgdmFsaWRNZXNzYWdlKHZhbHVlOiBXaXJlLCBwZWVyOiBQZWVyKTogYm9vbGVhbiB7DQogICAgaWYgKHZhbHVlLnZlcnNpb24hPT0xIHx8ICFVVUlELnRlc3QodmFsdWUuaWQpIHx8IHZhbHVlLnNlbmRlcl91c2VyX2lkIT09cGVlci5saW5rLnBlZXJfdXNlcl9pZCB8fCAhdGhpcy5hbGxvd2VkKHBlZXIubGluay5wZWVyX3VzZXJfaWQsdmFsdWUuY29udmVyc2F0aW9uX2lkKSkgcmV0dXJuIGZhbHNlOw0KICAgIGlmICh0eXBlb2YgdmFsdWUuY29udGVudCE9PSJzdHJpbmciIHx8IHZhbHVlLmNvbnRlbnQubGVuZ3RoPjQwMDAgfHwgdHlwZW9mIHZhbHVlLmNyZWF0ZWRfYXQhPT0ic3RyaW5nIiB8fCB2YWx1ZS5jcmVhdGVkX2F0Lmxlbmd0aD40MCB8fCAhWyJ0ZXh0IiwiZmlsZSIsImxvY2F0aW9uIiwiY2FsbCJdLmluY2x1ZGVzKHZhbHVlLm1lc3NhZ2VfdHlwZSkpIHJldHVybiBmYWxzZTsNCiAgICBpZiAoIXZhbHVlLm1ldGFkYXRhX2pzb24gfHwgdHlwZW9mIHZhbHVlLm1ldGFkYXRhX2pzb24hPT0ib2JqZWN0IiB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZS5tZXRhZGF0YV9qc29uKS5sZW5ndGg+MjAwMCkgcmV0dXJuIGZhbHNlOw0KICAgIHJldHVybiB0cnVlOw0KICB9DQogIHByaXZhdGUgYXN5bmMgcmVjZWl2ZShwZWVyOiBQZWVyLCB2YWx1ZTogV2lyZSAmIHtkYXRhPzogc3RyaW5nOyBpbmRleD86IG51bWJlcn0pIHsNCiAgICBpZiAoIXRoaXMuc3RvcmUgfHwgIXRoaXMuYWxpdmUpIHJldHVybjsNCiAgICBjb25zdCBraW5kOiBzdHJpbmcgPSB2YWx1ZS50eXBlOw0KICAgIGlmIChraW5kID09PSAiYWNrIikgew0KICAgICAgYXdhaXQgdGhpcy5zdG9yZS5leGNsdXNpdmUoYXN5bmMgKCkgPT4gew0KICAgICAgICBjb25zdCByID0gYXdhaXQgdGhpcy5zdG9yZSEuZmluZCh2YWx1ZS5pZCk7DQogICAgICAgIGlmICghcj8uaXNfbWluZSB8fCAhci5yZWNpcGllbnRfaWRzLmluY2x1ZGVzKHBlZXIubGluay5wZWVyX3VzZXJfaWQpIHx8IHIuZGVsaXZlcmVkX3RvLmluY2x1ZGVzKHBlZXIubGluay5wZWVyX3VzZXJfaWQpKSByZXR1cm47DQogICAgICAgIHIuZGVsaXZlcmVkX3RvLnB1c2gocGVlci5saW5rLnBlZXJfdXNlcl9pZCk7IHIubG9jYWxfc3RhdHVzID0gci5yZWNpcGllbnRfaWRzLmV2ZXJ5KGlkPT5yLmRlbGl2ZXJlZF90by5pbmNsdWRlcyhpZCkpID8gInNlbnQiOiJzZW5kaW5nIjsNCiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZSEuc2F2ZShyKTsNCiAgICAgIH0pOyB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyByZXR1cm47DQogICAgfQ0KICAgIGlmIChraW5kID09PSAibWVzc2FnZSIpIHsNCiAgICAgIGlmICghdGhpcy52YWxpZE1lc3NhZ2UodmFsdWUscGVlcikpIHJldHVybjsNCiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zdG9yZS5maW5kKHZhbHVlLmlkKTsNCiAgICAgIGlmIChleGlzdGluZykgeyBpZiAoZXhpc3Rpbmcuc2VuZGVyX3VzZXJfaWQgPT09IHZhbHVlLnNlbmRlcl91c2VyX2lkICYmIGV4aXN0aW5nLmNvbnZlcnNhdGlvbl9pZCA9PT0gdmFsdWUuY29udmVyc2F0aW9uX2lkICYmIGV4aXN0aW5nLmNvbnRlbnQgPT09IHZhbHVlLmNvbnRlbnQpIGF3YWl0IHRoaXMud3JpdGUocGVlcix7dHlwZToiYWNrIixpZDp2YWx1ZS5pZH0pOyByZXR1cm47IH0NCiAgICAgIGlmICh2YWx1ZS5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIikgew0KICAgICAgICBjb25zdCBhID0gdmFsdWUubWV0YWRhdGFfanNvbi5hdHRhY2htZW50IGFzIHtzaXplOm51bWJlcjtvcmlnaW5hbF9uYW1lOnN0cmluZztzaGEyNTY6c3RyaW5nO2NvbnRlbnRfdHlwZTpzdHJpbmd9Ow0KICAgICAgICBpZiAoIWEgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKGEuc2l6ZSkgfHwgYS5zaXplPDEgfHwgYS5zaXplPk1BWF9GSUxFIHx8IHR5cGVvZiBhLm9yaWdpbmFsX25hbWUhPT0ic3RyaW5nIiB8fCBhLm9yaWdpbmFsX25hbWUubGVuZ3RoPjI0MCB8fCAhL15bYS1mMC05XXs2NH0kLy50ZXN0KGEuc2hhMjU2KSkgcmV0dXJuOw0KICAgICAgICBpZiAodGhpcy5pbmJvdW5kLnNpemU+PTQgJiYgIXRoaXMuaW5ib3VuZC5oYXModmFsdWUuaWQpKSByZXR1cm47DQogICAgICAgIHRoaXMuaW5ib3VuZC5zZXQodmFsdWUuaWQse21lc3NhZ2U6dmFsdWUscGFydHM6W10scmVjZWl2ZWQ6MCxjaHVua3M6MCx0b3VjaGVkOkRhdGUubm93KCl9KTsgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgYXdhaXQgdGhpcy5hY2NlcHRNZXNzYWdlKHBlZXIsdmFsdWUpOyByZXR1cm47DQogICAgfQ0KICAgIGlmIChraW5kID09PSAiY2h1bmsiKSB7DQogICAgICBjb25zdCB0cmFuc2ZlciA9IHRoaXMuaW5ib3VuZC5nZXQodmFsdWUuaWQpOw0KICAgICAgaWYgKCF0cmFuc2ZlciB8fCB0cmFuc2Zlci5tZXNzYWdlLnNlbmRlcl91c2VyX2lkIT09cGVlci5saW5rLnBlZXJfdXNlcl9pZCB8fCAhdGhpcy5hbGxvd2VkKHBlZXIubGluay5wZWVyX3VzZXJfaWQsdHJhbnNmZXIubWVzc2FnZS5jb252ZXJzYXRpb25faWQpIHx8IHZhbHVlLmluZGV4IT09dHJhbnNmZXIuY2h1bmtzIHx8IHR5cGVvZiB2YWx1ZS5kYXRhIT09InN0cmluZyIgfHwgdmFsdWUuZGF0YS5sZW5ndGg+Q0hVTksqNC8zKSByZXR1cm47DQogICAgICBjb25zdCBjaHVuayA9IGZyb21CYXNlNjQodmFsdWUuZGF0YSk7IGNvbnN0IGEgPSB0cmFuc2Zlci5tZXNzYWdlLm1ldGFkYXRhX2pzb24uYXR0YWNobWVudCBhcyB7c2l6ZTpudW1iZXI7c2hhMjU2OnN0cmluZ307DQogICAgICBpZiAoIWNodW5rLmxlbmd0aCB8fCB0cmFuc2Zlci5yZWNlaXZlZCtjaHVuay5sZW5ndGg+YS5zaXplKSB7IHRoaXMuaW5ib3VuZC5kZWxldGUodmFsdWUuaWQpOyByZXR1cm47IH0NCiAgICAgIHRyYW5zZmVyLnBhcnRzLnB1c2goY2h1bmspOyB0cmFuc2Zlci5yZWNlaXZlZCs9Y2h1bmsubGVuZ3RoOyB0cmFuc2Zlci5jaHVua3MrKzsgdHJhbnNmZXIudG91Y2hlZD1EYXRlLm5vdygpOw0KICAgICAgaWYgKHRyYW5zZmVyLnJlY2VpdmVkPT09YS5zaXplKSB7DQogICAgICAgIGNvbnN0IGZpbGUgPSBuZXcgQmxvYih0cmFuc2Zlci5wYXJ0cyk7DQogICAgICAgIGlmIChhd2FpdCBoYXNoKGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSkhPT1hLnNoYTI1Nikge3RoaXMuaW5ib3VuZC5kZWxldGUodmFsdWUuaWQpOyB0aHJvdyBuZXcgRXJyb3IoIuaWh+S7tuagoemqjOWksei0pe+8jOacquS/neWtmOaWh+S7tuOAgiIpO30NCiAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlRmlsZSh2YWx1ZS5pZCxmaWxlKTsNCiAgICAgICAgYXdhaXQgdGhpcy5hY2NlcHRNZXNzYWdlKHBlZXIsdHJhbnNmZXIubWVzc2FnZSk7IHRoaXMuaW5ib3VuZC5kZWxldGUodmFsdWUuaWQpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KICBwcml2YXRlIGFzeW5jIGFjY2VwdE1lc3NhZ2UocGVlcjogUGVlciwgd2lyZTogV2lyZSkgew0KICAgIGF3YWl0IHRoaXMuc3RvcmUhLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7DQogICAgICBpZiAoYXdhaXQgdGhpcy5zdG9yZSEuZmluZCh3aXJlLmlkKSkgcmV0dXJuOw0KICAgICAgY29uc3QgbWVtYmVycyA9IHRoaXMuc25hcHNob3QhLmNvbnZlcnNhdGlvbnMuZmluZChjPT5jLmlkPT09d2lyZS5jb252ZXJzYXRpb25faWQpIS5wYXJ0aWNpcGFudHM7DQogICAgICAvLyBOZXZlciB0cnVzdCBhIHJlbW90ZSBhdHRhY2htZW50IFVSTCBvciBsYWJlbCBmb3IgdGhlIHNlbmRlciBpZGVudGl0eS4NCiAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9Ow0KICAgICAgaWYgKHdpcmUubWVzc2FnZV90eXBlPT09ImZpbGUiKSB7IGNvbnN0IGEgPSB3aXJlLm1ldGFkYXRhX2pzb24uYXR0YWNobWVudCBhcyBSZWNvcmQ8c3RyaW5nLHVua25vd24+OyBtZXRhZGF0YS5hdHRhY2htZW50ID0ge29yaWdpbmFsX25hbWU6U3RyaW5nKGEub3JpZ2luYWxfbmFtZSksc2l6ZTpOdW1iZXIoYS5zaXplKSxjb250ZW50X3R5cGU6ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsc2hhMjU2OlN0cmluZyhhLnNoYTI1Nil9OyB9DQogICAgICBpZiAod2lyZS5tZXNzYWdlX3R5cGU9PT0ibG9jYXRpb24iKSB7IGNvbnN0IHA9d2lyZS5tZXRhZGF0YV9qc29uLmxvY2F0aW9uIGFzIFJlY29yZDxzdHJpbmcsdW5rbm93bj47IGlmIChwICYmIHR5cGVvZiBwLmxhdGl0dWRlPT09Im51bWJlciIgJiYgTWF0aC5hYnMocC5sYXRpdHVkZSk8PTkwICYmIHR5cGVvZiBwLmxvbmdpdHVkZT09PSJudW1iZXIiICYmIE1hdGguYWJzKHAubG9uZ2l0dWRlKTw9MTgwKSBtZXRhZGF0YS5sb2NhdGlvbj17bGF0aXR1ZGU6cC5sYXRpdHVkZSxsb25naXR1ZGU6cC5sb25naXR1ZGV9OyB9DQogICAgICBhd2FpdCB0aGlzLnN0b3JlIS5zYXZlKHtpZDphd2FpdCB0aGlzLnN0b3JlIS5uZXh0SWQoKSxkaXJlY3RfaWQ6d2lyZS5pZCxjb252ZXJzYXRpb25faWQ6d2lyZS5jb252ZXJzYXRpb25faWQsc2VuZGVyX3VzZXJfaWQ6d2lyZS5zZW5kZXJfdXNlcl9pZCwNCiAgICAgICAgc2VuZGVyX25hbWU6bWVtYmVycy5maW5kKHA9PnAudXNlcl9pZD09PXdpcmUuc2VuZGVyX3VzZXJfaWQpPy5kaXNwbGF5X25hbWUgfHwgIuiBlOezu+S6uiIsY29udGVudDp3aXJlLmNvbnRlbnQsbWVzc2FnZV90eXBlOndpcmUubWVzc2FnZV90eXBlLGNyZWF0ZWRfYXQ6d2lyZS5jcmVhdGVkX2F0LA0KICAgICAgICBtZXRhZGF0YV9qc29uOm1ldGFkYXRhLHJlY2lwaWVudF9pZHM6W10sZGVsaXZlcmVkX3RvOltdLGlzX21pbmU6ZmFsc2UsbG9jYWxfc3RhdHVzOiJzZW50In0pOw0KICAgIH0pOw0KICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IGF3YWl0IHRoaXMud3JpdGUocGVlcix7dHlwZToiYWNrIixpZDp3aXJlLmlkfSk7DQogIH0NCiAgYXN5bmMgc2VuZChjb252ZXJzYXRpb246IG51bWJlciwgY29udGVudDogc3RyaW5nLCBtZXNzYWdlVHlwZT0idGV4dCIsIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLHVua25vd24+PXt9LCBmaWxlPzogRmlsZSk6IFByb21pc2U8Q2hhdFJlY29yZD4gew0KICAgIGlmICghdGhpcy5hbGl2ZSB8fCAhdGhpcy5zdG9yZSB8fCAhdGhpcy5zbmFwc2hvdCkgdGhyb3cgbmV3IEVycm9yKCLov57mjqXlt7Lnu5PmnZ/vvIzor7fph43mlrDmiZPlvIDogYrlpKnjgIIiKTsKICAgIGNvbnN0IGMgPSB0aGlzLnNuYXBzaG90LmNvbnZlcnNhdGlvbnMuZmluZChjPT5jLmlkPT09Y29udmVyc2F0aW9uKTsNCiAgICBpZiAoIWMgfHwgY29udGVudC5sZW5ndGg+NDAwMCB8fCAhY29udGVudC50cmltKCkpIHRocm93IG5ldyBFcnJvcigi6K+36YCJ5oup5Lya6K+d77yM5raI5oGv5LiN6IO96LaF6L+HIDQwMDAg5Liq5a2X44CCIik7DQogICAgY29uc3QgcmVjaXBpZW50cyA9IGMucGFydGljaXBhbnRzLm1hcChwPT5wLnVzZXJfaWQpLmZpbHRlcihpZD0+aWQhPT10aGlzLnN0b3JlIS5hY2NvdW50KTsNCiAgICBpZiAoIXJlY2lwaWVudHMubGVuZ3RoIHx8IERhdGUubm93KCktdGhpcy5hdXRoZW50aWNhdGVkQXQ+MTIwMDAwKSB0aHJvdyBuZXcgRXJyb3IoIuivt+mHjeaWsOi/nuaOpei0puWPt+WQjuWPkemAgeOAgiIpOw0KICAgIGNvbnN0IGlkPWNyeXB0by5yYW5kb21VVUlEKCk7DQogICAgaWYgKGZpbGUpIHsNCiAgICAgIGlmICghZmlsZS5zaXplIHx8IGZpbGUuc2l6ZT5NQVhfRklMRSkgdGhyb3cgbmV3IEVycm9yKCLmlofku7blpKflsI/pnIDlnKggMSDlrZfoioLoh7MgMjUgTUIg5LmL6Ze044CCIik7DQogICAgICBtZXRhZGF0YT17YXR0YWNobWVudDp7b3JpZ2luYWxfbmFtZTpmaWxlLm5hbWUuc2xpY2UoMCwyNDApLHNpemU6ZmlsZS5zaXplLGNvbnRlbnRfdHlwZTpmaWxlLnR5cGV8fCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLHNoYTI1Njphd2FpdCBoYXNoKGF3YWl0IGZpbGUuYXJyYXlCdWZmZXIoKSl9fTsNCiAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2F2ZUZpbGUoaWQsZmlsZSk7DQogICAgfQ0KICAgIGNvbnN0IHJlY29yZD1hd2FpdCB0aGlzLnN0b3JlLmV4Y2x1c2l2ZShhc3luYyAoKSA9PiB7DQogICAgICBjb25zdCByOkNoYXRSZWNvcmQ9e2lkOmF3YWl0IHRoaXMuc3RvcmUhLm5leHRJZCgpLGRpcmVjdF9pZDppZCxjb252ZXJzYXRpb25faWQ6Y29udmVyc2F0aW9uLHNlbmRlcl91c2VyX2lkOnRoaXMuc3RvcmUhLmFjY291bnQsDQogICAgICAgIHNlbmRlcl9uYW1lOnRoaXMuc25hcHNob3QhLnVzZXIuZGlzcGxheV9uYW1lLGNvbnRlbnQsbWVzc2FnZV90eXBlOm1lc3NhZ2VUeXBlLGNyZWF0ZWRfYXQ6bmV3IERhdGUoKS50b0lTT1N0cmluZygpLG1ldGFkYXRhX2pzb246bWV0YWRhdGEsDQogICAgICAgIHJlY2lwaWVudF9pZHM6cmVjaXBpZW50cyxkZWxpdmVyZWRfdG86W10saXNfbWluZTp0cnVlLGxvY2FsX3N0YXR1czoic2VuZGluZyJ9Ow0KICAgICAgYXdhaXQgdGhpcy5zdG9yZSEuc2F2ZShyKTtyZXR1cm4gcjsNCiAgICB9KTsNCiAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOyBmb3IgKGNvbnN0IHBlZXIgb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzLnZhbHVlcygpKSkgaWYgKHBlZXIucmVhZHkpIHZvaWQgdGhpcy5wdW1wKHBlZXIpOyByZXR1cm4gcmVjb3JkOw0KICB9DQogIGFzeW5jIG1lc3NhZ2VzKGNvbnZlcnNhdGlvbjogbnVtYmVyKTogUHJvbWlzZTxDaGF0UmVjb3JkW10+IHsNCiAgICBpZiAoIXRoaXMuc3RvcmUpIHJldHVybiBbXTsNCiAgICBjb25zdCByb3dzPWF3YWl0IHRoaXMuc3RvcmUubGlzdChjb252ZXJzYXRpb24pOw0KICAgIHJldHVybiBQcm9taXNlLmFsbChyb3dzLm1hcChhc3luYyByPT57DQogICAgICBpZiAoci5tZXNzYWdlX3R5cGUhPT0iZmlsZSIpIHJldHVybiByOw0KICAgICAgY29uc3QgYT1yLm1ldGFkYXRhX2pzb24uYXR0YWNobWVudCBhcyBSZWNvcmQ8c3RyaW5nLHVua25vd24+Ow0KICAgICAgY29uc3QgdXJsPWF3YWl0IHRoaXMuc3RvcmUhLmZpbGVVcmwoci5kaXJlY3RfaWQsU3RyaW5nKGEuY29udGVudF90eXBlfHwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpOw0KICAgICAgcmV0dXJuIHsuLi5yLG1ldGFkYXRhX2pzb246ey4uLnIubWV0YWRhdGFfanNvbixhdHRhY2htZW50OnsuLi5hLHVybH19fTsNCiAgICB9KSk7DQogIH0NCiAgYXN5bmMgY29udmVyc2F0aW9uVmlld3M8VCBleHRlbmRzIENvbnZlcnNhdGlvbj4oaXRlbXM6IFRbXSk6IFByb21pc2U8VFtdPiB7DQogICAgaWYgKCF0aGlzLnN0b3JlKSByZXR1cm4gaXRlbXM7DQogICAgY29uc3QgbWVzc2FnZXM9YXdhaXQgdGhpcy5zdG9yZS5saXN0KCk7DQogICAgcmV0dXJuIFByb21pc2UuYWxsKGl0ZW1zLm1hcChhc3luYyBjPT57IGNvbnN0IHJvd3M9bWVzc2FnZXMuZmlsdGVyKHI9PnIuY29udmVyc2F0aW9uX2lkPT09Yy5pZCk7Y29uc3QgcmVhZD1hd2FpdCB0aGlzLnN0b3JlIS5yZWFkQXQoYy5pZCk7Y29uc3QgbGFzdD1yb3dzLmF0KC0xKTsNCiAgICAgIHJldHVybiB7Li4uYyxsYXN0X21lc3NhZ2U6bGFzdHx8bnVsbCxsYXN0X21lc3NhZ2VfYXQ6bGFzdD8uY3JlYXRlZF9hdHx8bnVsbCx1bnJlYWRfY291bnQ6cm93cy5maWx0ZXIocj0+IXIuaXNfbWluZSAmJiByLmlkPnJlYWQpLmxlbmd0aH07IH0pKTsNCiAgfQ0KICBzdGF0dXMoY29udmVyc2F0aW9uOiBudW1iZXIpIHsNCiAgICBjb25zdCBpZHM9dGhpcy5zbmFwc2hvdD8uY29udmVyc2F0aW9ucy5maW5kKGM9PmMuaWQ9PT1jb252ZXJzYXRpb24pPy5wYXJ0aWNpcGFudHMuZmlsdGVyKHA9PnAudXNlcl9pZCE9PXRoaXMuc3RvcmU/LmFjY291bnQpLm1hcChwPT5wLnVzZXJfaWQpfHxbXTsNCiAgICBjb25zdCBvbmxpbmU9aWRzLmZpbHRlcihpZD0+dGhpcy5wZWVycy5nZXQoaWQpPy5yZWFkeSkubGVuZ3RoOw0KICAgIHJldHVybiBvbmxpbmU9PT1pZHMubGVuZ3RoICYmIG9ubGluZT4wID8gIuiuvuWkh+W3suebtOi/niIgOiBvbmxpbmU+MCA/IGAke29ubGluZX0vJHtpZHMubGVuZ3RofSDkvY3miJDlkZjlt7Lnm7Tov55gIDogIuetieW+heWvueaWueS4iue6v+aIlue9kee7nOebtOi/niI7DQogIH0NCiAgcHJpdmF0ZSBjbG9zZVBlZXIodWlkOm51bWJlcixwZWVyOlBlZXIpIHsgcGVlci5jaGFubmVsPy5jbG9zZSgpO3BlZXIucGMuY2xvc2UoKTt0aGlzLnBlZXJzLmRlbGV0ZSh1aWQpOyB9DQogIHByaXZhdGUgZGlzY29ubmVjdFBlZXJzKCkgeyBmb3IgKGNvbnN0IFt1aWQscGVlcl0gb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzKSkgdGhpcy5jbG9zZVBlZXIodWlkLHBlZXIpOyB9DQogIHN0b3AoKSB7IHRoaXMuYWxpdmU9ZmFsc2U7Y2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO3RoaXMuZGlzY29ubmVjdFBlZXJzKCk7dGhpcy5pbmJvdW5kLmNsZWFyKCk7dGhpcy5yZWxlYXNlZD8uKCk7dGhpcy5zdG9yZT8uY2xvc2UoKTsgfQ0KfQ0KYXN5bmMgZnVuY3Rpb24gaGFzaChkYXRhOkFycmF5QnVmZmVyKSB7IHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixkYXRhKSksYj0+Yi50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpKS5qb2luKCIiKTsgfQ0K",
      "src/client.js": "aW1wb3J0IHsgTG9jYWxDaGF0U3RvcmUsIHRvQmFzZTY0LCBmcm9tQmFzZTY0IH0gZnJvbSAiLi9zdG9yYWdlLmpzIjsKY29uc3QgTUFYX0ZJTEUgPSAyNSAqIDEwMjQgKiAxMDI0Owpjb25zdCBDSFVOSyA9IDEyICogMTAyNDsKY29uc3QgVVVJRCA9IC9eW2EtZjAtOS1dezM2fSQvaTsKZXhwb3J0IGNsYXNzIERpcmVjdENoYXRDbGllbnQgewogICAgb3B0aW9uczsKICAgIHBhZ2VJZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICBzdG9yZTsKICAgIHNuYXBzaG90OwogICAgcGVlcnMgPSBuZXcgTWFwKCk7CiAgICBpbmJvdW5kID0gbmV3IE1hcCgpOwogICAgdGltZXI7CiAgICBhbGl2ZSA9IGZhbHNlOwogICAgcG9sbGluZyA9IGZhbHNlOwogICAgYXV0aGVudGljYXRlZEF0ID0gMDsKICAgIG5leHRTZW5kID0gbmV3IE1hcCgpOwogICAgcmVsZWFzZWQ7CiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIH0KICAgIGFzeW5jIGFwaShwYXRoLCBib2R5LCBtZXRob2QgPSAiUE9TVCIpIHsKICAgICAgICBpZiAoIXRoaXMuYWxpdmUpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi6L+e5o6l5bey57uT5p2f77yM6K+36YeN5paw5omT5byA6IGK5aSp44CCIik7CiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLm9wdGlvbnMudG9rZW4oKTsKICAgICAgICBpZiAoIXRva2VuKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuivt+WFiOi/nuaOpeiHquW3seeahOi0puWPt+OAgiIpOwogICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7dGhpcy5vcHRpb25zLmJhc2VVcmwucmVwbGFjZSgvXC8kLywgIiIpfSR7cGF0aH1gLCB7CiAgICAgICAgICAgIG1ldGhvZCwgY3JlZGVudGlhbHM6ICJvbWl0IiwgY2FjaGU6ICJuby1zdG9yZSIsIHNpZ25hbDogQWJvcnRTaWduYWwudGltZW91dCgxMjAwMCksCiAgICAgICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiwgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke3Rva2VufWAgfSwKICAgICAgICAgICAgYm9keTogYm9keSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogSlNPTi5zdHJpbmdpZnkoYm9keSksCiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDMpCiAgICAgICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RQZWVycygpOwogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOwogICAgICAgICAgICBpZiAoZGF0YS5kZXRhaWw/LmNvZGUgPT09ICJkZXZpY2VfcmVwbGFjZWQiKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkYXRhLmRldGFpbC5tZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodHlwZW9mIGRhdGEuZGV0YWlsID09PSAic3RyaW5nIiA/IGRhdGEuZGV0YWlsIDogYOi/nuaOpeaaguaXtuacquWujOaIkO+8iCR7cmVzcG9uc2Uuc3RhdHVzfe+8ieOAgmApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOwogICAgfQogICAgYXN5bmMgc3RhcnQoKSB7CiAgICAgICAgaWYgKHRoaXMuYWxpdmUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB0aGlzLmFsaXZlID0gdHJ1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IGF3YWl0IHRoaXMuYXBpKCIvaWRlbnRpdHkiLCB1bmRlZmluZWQsICJHRVQiKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmFsaXZlKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAvLyBPbmUgdGFiIHBlciBhY2NvdW50L29yaWdpbiBvd25zIGEgZGV2aWNlIG5vZGU7IG90aGVyIHRhYnMgbmV2ZXIgZmlnaHQgb3ZlciBzaWduYWxpbmcuCiAgICAgICAgICAgIGlmIChuYXZpZ2F0b3IubG9ja3MpCiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBuYXZpZ2F0b3IubG9ja3MucmVxdWVzdChgemh1Z2UtZGlyZWN0LWltLSR7aWRlbnRpdHkuaWR9YCwgeyBpZkF2YWlsYWJsZTogdHJ1ZSB9LCBhc3luYyAobG9jaykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoIuatpOi0puWPt+W3suWcqOWPpuS4gOS4queql+WPo+aJk+W8gOiBiuWkqe+8jOivt+WFiOWFs+mXremCo+S4queql+WPo+OAgiIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlbGVhc2UgPT4geyB0aGlzLnJlbGVhc2VkID0gcmVsZWFzZTsgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBMb2NhbENoYXRTdG9yZShpZGVudGl0eS5pZCk7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUub3BlbigpOwogICAgICAgICAgICBpZiAoIXRoaXMuYWxpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuY2xvc2UoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVsZWFzZWQ/LigpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gYXdhaXQgdGhpcy5hcGkoIi9wb2xsIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCwgYWN0aXZhdGU6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuc25hcHNob3QgPSBmaXJzdDsKICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgICAgICB2b2lkIG5hdmlnYXRvci5zdG9yYWdlPy5wZXJzaXN0Py4oKS5jYXRjaCgoKSA9PiBmYWxzZSk7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuYXBwbHlTbmFwc2hvdChmaXJzdCk7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcCgpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICB9CiAgICBzY2hlZHVsZSgpIHsgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpOyBpZiAodGhpcy5hbGl2ZSkKICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB2b2lkIHRoaXMucG9sbCgpLCAyNTAwKTsgfQogICAgYXN5bmMgcG9sbCgpIHsKICAgICAgICBpZiAoIXRoaXMuYWxpdmUgfHwgdGhpcy5wb2xsaW5nKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5wb2xsaW5nID0gdHJ1ZTsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5hcGkoIi9wb2xsIiwgeyBwYWdlX2lkOiB0aGlzLnBhZ2VJZCB9KTsKICAgICAgICAgICAgaWYgKCF0aGlzLmFsaXZlKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAodGhpcy5zdG9yZT8uYWNjb3VudCAhPT0gZGF0YS51c2VyLmlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3AoKTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi6LSm5Y+35bey5pS55Y+Y77yM6K+36YeN5paw5omT5byA6IGK5aSp44CCIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5hdXRoZW50aWNhdGVkQXQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICB0aGlzLnNuYXBzaG90ID0gZGF0YTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5hcHBseVNuYXBzaG90KGRhdGEpOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBBcnJheS5mcm9tKHRoaXMuaW5ib3VuZCkpCiAgICAgICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHZhbHVlLnRvdWNoZWQgPiA2MDAwMCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKGtleSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB0aGlzLm5vdGljZShlcnJvcik7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLnBvbGxpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZSgpOwogICAgICAgIH0KICAgIH0KICAgIG5vdGljZShlcnJvcikgeyB0aGlzLm9wdGlvbnMub25Ob3RpY2U/LihlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICLov57mjqXmmoLml7bkuI3lj6/nlKjjgIIiKTsgfQogICAgYWxsb3dlZChwZWVyLCBjb252ZXJzYXRpb24pIHsKICAgICAgICBjb25zdCBjID0gdGhpcy5zbmFwc2hvdD8uY29udmVyc2F0aW9ucy5maW5kKGMgPT4gYy5pZCA9PT0gY29udmVyc2F0aW9uKTsKICAgICAgICByZXR1cm4gRGF0ZS5ub3coKSAtIHRoaXMuYXV0aGVudGljYXRlZEF0IDwgMTIwMDAwICYmICEhYz8ucGFydGljaXBhbnRzLnNvbWUocCA9PiBwLnVzZXJfaWQgPT09IHBlZXIpICYmICEhYy5wYXJ0aWNpcGFudHMuc29tZShwID0+IHAudXNlcl9pZCA9PT0gdGhpcy5zdG9yZT8uYWNjb3VudCk7CiAgICB9CiAgICBhc3luYyBhcHBseVNuYXBzaG90KGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS50cmFuc3BvcnQgIT09ICJkaXJlY3Rfb25seSIpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5b2T5YmN6L+e5o6l5pa55byP5LiN56ym5ZCI6K6+5aSH55u06L+e6KaB5rGC44CCIik7CiAgICAgICAgY29uc3QgcmVhY2hhYmxlID0gbmV3IFNldChkYXRhLnBlZXJzLm1hcChsID0+IGwucGVlcl91c2VyX2lkKSk7CiAgICAgICAgZm9yIChjb25zdCBbdWlkLCBwZWVyXSBvZiBBcnJheS5mcm9tKHRoaXMucGVlcnMpKQogICAgICAgICAgICBpZiAoIXJlYWNoYWJsZS5oYXModWlkKSkKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQZWVyKHVpZCwgcGVlcik7CiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGRhdGEucGVlcnMpIHsKICAgICAgICAgICAgbGV0IHBlZXIgPSB0aGlzLnBlZXJzLmdldChsaW5rLnBlZXJfdXNlcl9pZCk7CiAgICAgICAgICAgIGlmIChwZWVyICYmIGxpbmsub25saW5lICYmIHBlZXIubGluay5wZWVyX3BhZ2VfaWQgIT09IGxpbmsucGVlcl9wYWdlX2lkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGVlcihsaW5rLnBlZXJfdXNlcl9pZCwgcGVlcik7CiAgICAgICAgICAgICAgICBwZWVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwZWVyICYmICFwZWVyLnJlYWR5ICYmIERhdGUubm93KCkgLSBwZWVyLnN0YXJ0ZWQgPiAyNTAwMCkgewogICAgICAgICAgICAgICAgdGhpcy5jbG9zZVBlZXIobGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOwogICAgICAgICAgICAgICAgcGVlciA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBIGZhaWxlZCBwcmVzZW5jZSByZXF1ZXN0IG11c3Qgbm90IHRlYXIgZG93biBhbiBlc3RhYmxpc2hlZCBkaXJlY3QgY29ubmVjdGlvbi4KICAgICAgICAgICAgaWYgKCFwZWVyICYmIGxpbmsub25saW5lKSB7CiAgICAgICAgICAgICAgICBwZWVyID0gdGhpcy5jcmVhdGVQZWVyKGxpbmspOwogICAgICAgICAgICAgICAgaWYgKGRhdGEudXNlci5pZCA8IGxpbmsucGVlcl91c2VyX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVDaGFubmVsKHBlZXIsIHBlZXIucGMuY3JlYXRlRGF0YUNoYW5uZWwoInpodWdlLWltLXYxIiwgeyBvcmRlcmVkOiB0cnVlIH0pKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZlciA9IGF3YWl0IHBlZXIucGMuY3JlYXRlT2ZmZXIoKTsKICAgICAgICAgICAgICAgICAgICBhd2FpdCBwZWVyLnBjLnNldExvY2FsRGVzY3JpcHRpb24ob2ZmZXIpOwogICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFNpZ25hbChwZWVyLCAib2ZmZXIiLCB7IHR5cGU6ICJvZmZlciIsIHNkcDogb2ZmZXIuc2RwIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbnN0IGFjayA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc2lnbmFsIG9mIGRhdGEuc2lnbmFscykgewogICAgICAgICAgICBjb25zdCBwZWVyID0gdGhpcy5wZWVycy5nZXQoc2lnbmFsLnBlZXJfdXNlcl9pZCk7CiAgICAgICAgICAgIGlmICghcGVlcikKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoIXBlZXIuc2Vlbi5oYXMoc2lnbmFsLmlkKSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdFNpZ25hbChwZWVyLCBzaWduYWwpOwogICAgICAgICAgICAgICAgICAgIHBlZXIuc2Vlbi5hZGQoc2lnbmFsLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBhY2sucHVzaChzaWduYWwuaWQpOwogICAgICAgIH0KICAgICAgICBpZiAoYWNrLmxlbmd0aCkKICAgICAgICAgICAgYXdhaXQgdGhpcy5hcGkoIi9zaWduYWxzL2FjayIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQsIGlkczogYWNrIH0pOwogICAgICAgIGZvciAoY29uc3QgcGVlciBvZiBBcnJheS5mcm9tKHRoaXMucGVlcnMudmFsdWVzKCkpKQogICAgICAgICAgICBpZiAocGVlci5yZWFkeSkKICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5wdW1wKHBlZXIpOwogICAgfQogICAgY3JlYXRlUGVlcihsaW5rKSB7CiAgICAgICAgY29uc3QgaWNlID0gKHRoaXMuc25hcHNob3Q/LmljZV9zZXJ2ZXJzIHx8IFtdKS5tYXAocyA9PiAoeyB1cmxzOiAoQXJyYXkuaXNBcnJheShzLnVybHMpID8gcy51cmxzIDogW3MudXJsc10pLmZpbHRlcih1ID0+IHUuc3RhcnRzV2l0aCgic3R1bjoiKSkgfSkpLmZpbHRlcihzID0+IHMudXJscy5sZW5ndGgpOwogICAgICAgIGNvbnN0IHBjID0gbmV3IFJUQ1BlZXJDb25uZWN0aW9uKHsgaWNlU2VydmVyczogaWNlIH0pOwogICAgICAgIGNvbnN0IHBlZXIgPSB7IGxpbmssIHBjLCBjaGFubmVsSWQ6IGNyeXB0by5yYW5kb21VVUlEKCksIHBlbmRpbmc6IFtdLCByZWFkeTogZmFsc2UsIHF1ZXVlOiBQcm9taXNlLnJlc29sdmUoKSwgcHVtcGluZzogZmFsc2UsIHNlZW46IG5ldyBTZXQoKSwgc3RhcnRlZDogRGF0ZS5ub3coKSwgc2lnbmFsUXVldWU6IFByb21pc2UucmVzb2x2ZSgpIH07CiAgICAgICAgdGhpcy5wZWVycy5zZXQobGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOwogICAgICAgIHBjLm9uaWNlY2FuZGlkYXRlID0gZSA9PiB7IGlmIChlLmNhbmRpZGF0ZSkgewogICAgICAgICAgICBjb25zdCBjID0gZS5jYW5kaWRhdGUudG9KU09OKCk7CiAgICAgICAgICAgIHZvaWQgdGhpcy5zZW5kU2lnbmFsKHBlZXIsICJpY2UiLCB7IGNhbmRpZGF0ZTogYy5jYW5kaWRhdGUsIHNkcE1pZDogYy5zZHBNaWQsIHNkcE1MaW5lSW5kZXg6IGMuc2RwTUxpbmVJbmRleCB9KS5jYXRjaChlcnJvciA9PiB0aGlzLm5vdGljZShlcnJvcikpOwogICAgICAgIH0gfTsKICAgICAgICBwYy5vbmRhdGFjaGFubmVsID0gZSA9PiB0aGlzLmNvbmZpZ3VyZUNoYW5uZWwocGVlciwgZS5jaGFubmVsKTsKICAgICAgICBwYy5vbmNvbm5lY3Rpb25zdGF0ZWNoYW5nZSA9ICgpID0+IHsgaWYgKFsiZmFpbGVkIiwgImNsb3NlZCJdLmluY2x1ZGVzKHBjLmNvbm5lY3Rpb25TdGF0ZSkpIHsKICAgICAgICAgICAgcGVlci5yZWFkeSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgIH0gfTsKICAgICAgICByZXR1cm4gcGVlcjsKICAgIH0KICAgIGFzeW5jIHNlbmRTaWduYWwocGVlciwgdHlwZSwgc2lnbmFsKSB7CiAgICAgICAgaWYgKCF0aGlzLmFsaXZlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3Qgc2VuZCA9ICgpID0+IHRoaXMuYXBpKCIvc2lnbmFscyIsIHsgcGFnZV9pZDogdGhpcy5wYWdlSWQsIHBlZXJfdXNlcl9pZDogcGVlci5saW5rLnBlZXJfdXNlcl9pZCwKICAgICAgICAgICAgcGVlcl9wYWdlX2lkOiBwZWVyLmxpbmsucGVlcl9wYWdlX2lkLCBjaGFubmVsX2lkOiBwZWVyLmNoYW5uZWxJZCwgc2lnbmFsX3R5cGU6IHR5cGUsIHNpZ25hbCB9KS50aGVuKCgpID0+IHVuZGVmaW5lZCk7CiAgICAgICAgcGVlci5zaWduYWxRdWV1ZSA9IHBlZXIuc2lnbmFsUXVldWUudGhlbihzZW5kKTsKICAgICAgICByZXR1cm4gcGVlci5zaWduYWxRdWV1ZTsKICAgIH0KICAgIGFzeW5jIGFjY2VwdFNpZ25hbChwZWVyLCBzaWduYWwpIHsKICAgICAgICBpZiAoc2lnbmFsLnNpZ25hbF90eXBlID09PSAib2ZmZXIiKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnN0b3JlLmFjY291bnQgPCBwZWVyLmxpbmsucGVlcl91c2VyX2lkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAocGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gInN0YWJsZSIgfHwgcGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgcGVlci5jaGFubmVsSWQgPSBzaWduYWwuY2hhbm5lbF9pZDsKICAgICAgICAgICAgYXdhaXQgcGVlci5wYy5zZXRSZW1vdGVEZXNjcmlwdGlvbihzaWduYWwuc2lnbmFsKTsKICAgICAgICAgICAgZm9yIChjb25zdCBjIG9mIHBlZXIucGVuZGluZy5zcGxpY2UoMCkpCiAgICAgICAgICAgICAgICBhd2FpdCBwZWVyLnBjLmFkZEljZUNhbmRpZGF0ZShjKTsKICAgICAgICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcGVlci5wYy5jcmVhdGVBbnN3ZXIoKTsKICAgICAgICAgICAgYXdhaXQgcGVlci5wYy5zZXRMb2NhbERlc2NyaXB0aW9uKGFuc3dlcik7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VuZFNpZ25hbChwZWVyLCAiYW5zd2VyIiwgeyB0eXBlOiAiYW5zd2VyIiwgc2RwOiBhbnN3ZXIuc2RwIH0pOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzaWduYWwuc2lnbmFsX3R5cGUgPT09ICJhbnN3ZXIiKSB7CiAgICAgICAgICAgIGlmIChzaWduYWwuY2hhbm5lbF9pZCAhPT0gcGVlci5jaGFubmVsSWQgfHwgcGVlci5wYy5zaWduYWxpbmdTdGF0ZSAhPT0gImhhdmUtbG9jYWwtb2ZmZXIiKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBhd2FpdCBwZWVyLnBjLnNldFJlbW90ZURlc2NyaXB0aW9uKHNpZ25hbC5zaWduYWwpOwogICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgcGVlci5wZW5kaW5nLnNwbGljZSgwKSkKICAgICAgICAgICAgICAgIGF3YWl0IHBlZXIucGMuYWRkSWNlQ2FuZGlkYXRlKGMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3RvcmUuYWNjb3VudCA8IHBlZXIubGluay5wZWVyX3VzZXJfaWQgJiYgc2lnbmFsLmNoYW5uZWxfaWQgIT09IHBlZXIuY2hhbm5lbElkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAocGVlci5wYy5yZW1vdGVEZXNjcmlwdGlvbikKICAgICAgICAgICAgICAgIGF3YWl0IHBlZXIucGMuYWRkSWNlQ2FuZGlkYXRlKHNpZ25hbC5zaWduYWwpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwZWVyLnBlbmRpbmcucHVzaChzaWduYWwuc2lnbmFsKTsKICAgICAgICB9CiAgICB9CiAgICBjb25maWd1cmVDaGFubmVsKHBlZXIsIGNoYW5uZWwpIHsKICAgICAgICBpZiAoY2hhbm5lbC5sYWJlbCAhPT0gInpodWdlLWltLXYxIiB8fCBwZWVyLmNoYW5uZWwpIHsKICAgICAgICAgICAgY2hhbm5lbC5jbG9zZSgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBlZXIuY2hhbm5lbCA9IGNoYW5uZWw7CiAgICAgICAgY2hhbm5lbC5vbm9wZW4gPSBhc3luYyAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgcGVlci5wYy5nZXRTdGF0cygpOwogICAgICAgICAgICBsZXQgcmVsYXkgPSBmYWxzZTsKICAgICAgICAgICAgc3RhdHMuZm9yRWFjaChzID0+IHsgaWYgKChzLnR5cGUgPT09ICJsb2NhbC1jYW5kaWRhdGUiIHx8IHMudHlwZSA9PT0gInJlbW90ZS1jYW5kaWRhdGUiKSAmJiBzLmNhbmRpZGF0ZVR5cGUgPT09ICJyZWxheSIpCiAgICAgICAgICAgICAgICByZWxheSA9IHRydWU7IH0pOwogICAgICAgICAgICBpZiAocmVsYXkpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VQZWVyKHBlZXIubGluay5wZWVyX3VzZXJfaWQsIHBlZXIpOwogICAgICAgICAgICAgICAgdGhpcy5ub3RpY2UobmV3IEVycm9yKCLlt7LlgZzmraLkuK3nu6fov57mjqXvvIzor7fkvb/nlKjlj6/nm7Tov57nvZHnu5zjgIIiKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGVlci5yZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7CiAgICAgICAgICAgIHZvaWQgdGhpcy5wdW1wKHBlZXIpOwogICAgICAgIH07CiAgICAgICAgY2hhbm5lbC5vbmNsb3NlID0gY2hhbm5lbC5vbmVycm9yID0gKCkgPT4geyBwZWVyLnJlYWR5ID0gZmFsc2U7IHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7IH07CiAgICAgICAgY2hhbm5lbC5vbm1lc3NhZ2UgPSBldmVudCA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQuZGF0YSAhPT0gInN0cmluZyIgfHwgZXZlbnQuZGF0YS5sZW5ndGggPiAyNDAwMCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gUHJlc2VydmUgd2lyZSBvcmRlciBhY3Jvc3MgYXN5bmNocm9ub3VzIEluZGV4ZWREQi9oYXNoIG9wZXJhdGlvbnMuCiAgICAgICAgICAgIHBlZXIucXVldWUgPSBwZWVyLnF1ZXVlLnRoZW4oKCkgPT4gdGhpcy5yZWNlaXZlKHBlZXIsIEpTT04ucGFyc2UoZXZlbnQuZGF0YSkpKS5jYXRjaChlcnJvciA9PiB0aGlzLm5vdGljZShlcnJvcikpOwogICAgICAgIH07CiAgICB9CiAgICBhc3luYyB3cml0ZShwZWVyLCB2YWx1ZSkgewogICAgICAgIGNvbnN0IGNoYW5uZWwgPSBwZWVyLmNoYW5uZWw7CiAgICAgICAgaWYgKCF0aGlzLmFsaXZlIHx8ICFjaGFubmVsIHx8IGNoYW5uZWwucmVhZHlTdGF0ZSAhPT0gIm9wZW4iKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuWvueaWueaaguaXtuemu+e6v++8jOa2iOaBr+S8mueVmeWcqOacrOacuuetieW+hemHjei/nuOAgiIpOwogICAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICAgIHdoaWxlIChjaGFubmVsLmJ1ZmZlcmVkQW1vdW50ID4gMjU2ICogMTAyNCkgewogICAgICAgICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0ZWQgPiAxNTAwMCB8fCBjaGFubmVsLnJlYWR5U3RhdGUgIT09ICJvcGVuIiB8fCAhdGhpcy5hbGl2ZSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5paH5Lu25Lyg6L6T5Lit5pat77yM5q2j5Zyo562J5b6F6YeN6L+e44CCIik7CiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCAyNSkpOwogICAgICAgIH0KICAgICAgICBjaGFubmVsLnNlbmQoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTsKICAgIH0KICAgIGFzeW5jIHB1bXAocGVlcikgewogICAgICAgIGlmIChwZWVyLnB1bXBpbmcgfHwgIXRoaXMuc3RvcmUpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBwZWVyLnB1bXBpbmcgPSB0cnVlOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLnN0b3JlLmxpc3QoKTsKICAgICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZHMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGAke3IuZGlyZWN0X2lkfToke3BlZXIubGluay5wZWVyX3VzZXJfaWR9YDsKICAgICAgICAgICAgICAgIGlmICghci5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgIXRoaXMuYWxsb3dlZChwZWVyLmxpbmsucGVlcl91c2VyX2lkLCByLmNvbnZlcnNhdGlvbl9pZCkgfHwgKHRoaXMubmV4dFNlbmQuZ2V0KGtleSkgfHwgMCkgPiBEYXRlLm5vdygpKQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgdGhpcy5uZXh0U2VuZC5zZXQoa2V5LCBEYXRlLm5vdygpICsgMzAwMDApOwogICAgICAgICAgICAgICAgY29uc3Qgd2lyZSA9IHsgdHlwZTogIm1lc3NhZ2UiLCB2ZXJzaW9uOiAxLCBpZDogci5kaXJlY3RfaWQsIGNvbnZlcnNhdGlvbl9pZDogci5jb252ZXJzYXRpb25faWQsCiAgICAgICAgICAgICAgICAgICAgc2VuZGVyX3VzZXJfaWQ6IHIuc2VuZGVyX3VzZXJfaWQsIGNvbnRlbnQ6IHIuY29udGVudCwgbWVzc2FnZV90eXBlOiByLm1lc3NhZ2VfdHlwZSwgY3JlYXRlZF9hdDogci5jcmVhdGVkX2F0LCBtZXRhZGF0YV9qc29uOiByLm1ldGFkYXRhX2pzb24gfTsKICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGUocGVlciwgd2lyZSk7CiAgICAgICAgICAgICAgICBpZiAoci5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbGUgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbGUoci5kaXJlY3RfaWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLlvoXlj5Hmlofku7blt7LkuI3lnKjmnKzmnLrvvIzor7fph43mlrDpgInmi6nmlofku7bjgIIiKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3RhcnQgPSAwOyBzdGFydCA8IGRhdGEubGVuZ3RoOyBzdGFydCArPSBDSFVOSykKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJjaHVuayIsIGlkOiByLmRpcmVjdF9pZCwgaW5kZXg6IHN0YXJ0IC8gQ0hVTkssIGRhdGE6IHRvQmFzZTY0KGRhdGEuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgQ0hVTkspKSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgdGhpcy5ub3RpY2UoZXJyb3IpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgcGVlci5wdW1waW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgdmFsaWRNZXNzYWdlKHZhbHVlLCBwZWVyKSB7CiAgICAgICAgaWYgKHZhbHVlLnZlcnNpb24gIT09IDEgfHwgIVVVSUQudGVzdCh2YWx1ZS5pZCkgfHwgdmFsdWUuc2VuZGVyX3VzZXJfaWQgIT09IHBlZXIubGluay5wZWVyX3VzZXJfaWQgfHwgIXRoaXMuYWxsb3dlZChwZWVyLmxpbmsucGVlcl91c2VyX2lkLCB2YWx1ZS5jb252ZXJzYXRpb25faWQpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZS5jb250ZW50ICE9PSAic3RyaW5nIiB8fCB2YWx1ZS5jb250ZW50Lmxlbmd0aCA+IDQwMDAgfHwgdHlwZW9mIHZhbHVlLmNyZWF0ZWRfYXQgIT09ICJzdHJpbmciIHx8IHZhbHVlLmNyZWF0ZWRfYXQubGVuZ3RoID4gNDAgfHwgIVsidGV4dCIsICJmaWxlIiwgImxvY2F0aW9uIiwgImNhbGwiXS5pbmNsdWRlcyh2YWx1ZS5tZXNzYWdlX3R5cGUpKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgaWYgKCF2YWx1ZS5tZXRhZGF0YV9qc29uIHx8IHR5cGVvZiB2YWx1ZS5tZXRhZGF0YV9qc29uICE9PSAib2JqZWN0IiB8fCBKU09OLnN0cmluZ2lmeSh2YWx1ZS5tZXRhZGF0YV9qc29uKS5sZW5ndGggPiAyMDAwKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBhc3luYyByZWNlaXZlKHBlZXIsIHZhbHVlKSB7CiAgICAgICAgaWYgKCF0aGlzLnN0b3JlIHx8ICF0aGlzLmFsaXZlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3Qga2luZCA9IHZhbHVlLnR5cGU7CiAgICAgICAgaWYgKGtpbmQgPT09ICJhY2siKSB7CiAgICAgICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbmQodmFsdWUuaWQpOwogICAgICAgICAgICAgICAgaWYgKCFyPy5pc19taW5lIHx8ICFyLnJlY2lwaWVudF9pZHMuaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkgfHwgci5kZWxpdmVyZWRfdG8uaW5jbHVkZXMocGVlci5saW5rLnBlZXJfdXNlcl9pZCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgci5kZWxpdmVyZWRfdG8ucHVzaChwZWVyLmxpbmsucGVlcl91c2VyX2lkKTsKICAgICAgICAgICAgICAgIHIubG9jYWxfc3RhdHVzID0gci5yZWNpcGllbnRfaWRzLmV2ZXJ5KGlkID0+IHIuZGVsaXZlcmVkX3RvLmluY2x1ZGVzKGlkKSkgPyAic2VudCIgOiAic2VuZGluZyI7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUocik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm9wdGlvbnMub25DaGFuZ2U/LigpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChraW5kID09PSAibWVzc2FnZSIpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnZhbGlkTWVzc2FnZSh2YWx1ZSwgcGVlcikpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5zdG9yZS5maW5kKHZhbHVlLmlkKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3Rpbmcuc2VuZGVyX3VzZXJfaWQgPT09IHZhbHVlLnNlbmRlcl91c2VyX2lkICYmIGV4aXN0aW5nLmNvbnZlcnNhdGlvbl9pZCA9PT0gdmFsdWUuY29udmVyc2F0aW9uX2lkICYmIGV4aXN0aW5nLmNvbnRlbnQgPT09IHZhbHVlLmNvbnRlbnQpCiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJhY2siLCBpZDogdmFsdWUuaWQgfSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gdmFsdWUubWV0YWRhdGFfanNvbi5hdHRhY2htZW50OwogICAgICAgICAgICAgICAgaWYgKCFhIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihhLnNpemUpIHx8IGEuc2l6ZSA8IDEgfHwgYS5zaXplID4gTUFYX0ZJTEUgfHwgdHlwZW9mIGEub3JpZ2luYWxfbmFtZSAhPT0gInN0cmluZyIgfHwgYS5vcmlnaW5hbF9uYW1lLmxlbmd0aCA+IDI0MCB8fCAhL15bYS1mMC05XXs2NH0kLy50ZXN0KGEuc2hhMjU2KSkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbmJvdW5kLnNpemUgPj0gNCAmJiAhdGhpcy5pbmJvdW5kLmhhcyh2YWx1ZS5pZCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5pbmJvdW5kLnNldCh2YWx1ZS5pZCwgeyBtZXNzYWdlOiB2YWx1ZSwgcGFydHM6IFtdLCByZWNlaXZlZDogMCwgY2h1bmtzOiAwLCB0b3VjaGVkOiBEYXRlLm5vdygpIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWNjZXB0TWVzc2FnZShwZWVyLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGtpbmQgPT09ICJjaHVuayIpIHsKICAgICAgICAgICAgY29uc3QgdHJhbnNmZXIgPSB0aGlzLmluYm91bmQuZ2V0KHZhbHVlLmlkKTsKICAgICAgICAgICAgaWYgKCF0cmFuc2ZlciB8fCB0cmFuc2Zlci5tZXNzYWdlLnNlbmRlcl91c2VyX2lkICE9PSBwZWVyLmxpbmsucGVlcl91c2VyX2lkIHx8ICF0aGlzLmFsbG93ZWQocGVlci5saW5rLnBlZXJfdXNlcl9pZCwgdHJhbnNmZXIubWVzc2FnZS5jb252ZXJzYXRpb25faWQpIHx8IHZhbHVlLmluZGV4ICE9PSB0cmFuc2Zlci5jaHVua3MgfHwgdHlwZW9mIHZhbHVlLmRhdGEgIT09ICJzdHJpbmciIHx8IHZhbHVlLmRhdGEubGVuZ3RoID4gQ0hVTksgKiA0IC8gMykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgY2h1bmsgPSBmcm9tQmFzZTY0KHZhbHVlLmRhdGEpOwogICAgICAgICAgICBjb25zdCBhID0gdHJhbnNmZXIubWVzc2FnZS5tZXRhZGF0YV9qc29uLmF0dGFjaG1lbnQ7CiAgICAgICAgICAgIGlmICghY2h1bmsubGVuZ3RoIHx8IHRyYW5zZmVyLnJlY2VpdmVkICsgY2h1bmsubGVuZ3RoID4gYS5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cmFuc2Zlci5wYXJ0cy5wdXNoKGNodW5rKTsKICAgICAgICAgICAgdHJhbnNmZXIucmVjZWl2ZWQgKz0gY2h1bmsubGVuZ3RoOwogICAgICAgICAgICB0cmFuc2Zlci5jaHVua3MrKzsKICAgICAgICAgICAgdHJhbnNmZXIudG91Y2hlZCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGlmICh0cmFuc2Zlci5yZWNlaXZlZCA9PT0gYS5zaXplKSB7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gbmV3IEJsb2IodHJhbnNmZXIucGFydHMpOwogICAgICAgICAgICAgICAgaWYgKGF3YWl0IGhhc2goYXdhaXQgZmlsZS5hcnJheUJ1ZmZlcigpKSAhPT0gYS5zaGEyNTYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuaWh+S7tuagoemqjOWksei0pe+8jOacquS/neWtmOaWh+S7tuOAgiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlRmlsZSh2YWx1ZS5pZCwgZmlsZSk7CiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmFjY2VwdE1lc3NhZ2UocGVlciwgdHJhbnNmZXIubWVzc2FnZSk7CiAgICAgICAgICAgICAgICB0aGlzLmluYm91bmQuZGVsZXRlKHZhbHVlLmlkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGFzeW5jIGFjY2VwdE1lc3NhZ2UocGVlciwgd2lyZSkgewogICAgICAgIGF3YWl0IHRoaXMuc3RvcmUuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuc3RvcmUuZmluZCh3aXJlLmlkKSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgY29uc3QgbWVtYmVycyA9IHRoaXMuc25hcHNob3QuY29udmVyc2F0aW9ucy5maW5kKGMgPT4gYy5pZCA9PT0gd2lyZS5jb252ZXJzYXRpb25faWQpLnBhcnRpY2lwYW50czsKICAgICAgICAgICAgLy8gTmV2ZXIgdHJ1c3QgYSByZW1vdGUgYXR0YWNobWVudCBVUkwgb3IgbGFiZWwgZm9yIHRoZSBzZW5kZXIgaWRlbnRpdHkuCiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0ge307CiAgICAgICAgICAgIGlmICh3aXJlLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhID0gd2lyZS5tZXRhZGF0YV9qc29uLmF0dGFjaG1lbnQ7CiAgICAgICAgICAgICAgICBtZXRhZGF0YS5hdHRhY2htZW50ID0geyBvcmlnaW5hbF9uYW1lOiBTdHJpbmcoYS5vcmlnaW5hbF9uYW1lKSwgc2l6ZTogTnVtYmVyKGEuc2l6ZSksIGNvbnRlbnRfdHlwZTogImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsIHNoYTI1NjogU3RyaW5nKGEuc2hhMjU2KSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3aXJlLm1lc3NhZ2VfdHlwZSA9PT0gImxvY2F0aW9uIikgewogICAgICAgICAgICAgICAgY29uc3QgcCA9IHdpcmUubWV0YWRhdGFfanNvbi5sb2NhdGlvbjsKICAgICAgICAgICAgICAgIGlmIChwICYmIHR5cGVvZiBwLmxhdGl0dWRlID09PSAibnVtYmVyIiAmJiBNYXRoLmFicyhwLmxhdGl0dWRlKSA8PSA5MCAmJiB0eXBlb2YgcC5sb25naXR1ZGUgPT09ICJudW1iZXIiICYmIE1hdGguYWJzKHAubG9uZ2l0dWRlKSA8PSAxODApCiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEubG9jYXRpb24gPSB7IGxhdGl0dWRlOiBwLmxhdGl0dWRlLCBsb25naXR1ZGU6IHAubG9uZ2l0dWRlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlKHsgaWQ6IGF3YWl0IHRoaXMuc3RvcmUubmV4dElkKCksIGRpcmVjdF9pZDogd2lyZS5pZCwgY29udmVyc2F0aW9uX2lkOiB3aXJlLmNvbnZlcnNhdGlvbl9pZCwgc2VuZGVyX3VzZXJfaWQ6IHdpcmUuc2VuZGVyX3VzZXJfaWQsCiAgICAgICAgICAgICAgICBzZW5kZXJfbmFtZTogbWVtYmVycy5maW5kKHAgPT4gcC51c2VyX2lkID09PSB3aXJlLnNlbmRlcl91c2VyX2lkKT8uZGlzcGxheV9uYW1lIHx8ICLogZTns7vkuroiLCBjb250ZW50OiB3aXJlLmNvbnRlbnQsIG1lc3NhZ2VfdHlwZTogd2lyZS5tZXNzYWdlX3R5cGUsIGNyZWF0ZWRfYXQ6IHdpcmUuY3JlYXRlZF9hdCwKICAgICAgICAgICAgICAgIG1ldGFkYXRhX2pzb246IG1ldGFkYXRhLCByZWNpcGllbnRfaWRzOiBbXSwgZGVsaXZlcmVkX3RvOiBbXSwgaXNfbWluZTogZmFsc2UsIGxvY2FsX3N0YXR1czogInNlbnQiIH0pOwogICAgICAgIH0pOwogICAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7CiAgICAgICAgYXdhaXQgdGhpcy53cml0ZShwZWVyLCB7IHR5cGU6ICJhY2siLCBpZDogd2lyZS5pZCB9KTsKICAgIH0KICAgIGFzeW5jIHNlbmQoY29udmVyc2F0aW9uLCBjb250ZW50LCBtZXNzYWdlVHlwZSA9ICJ0ZXh0IiwgbWV0YWRhdGEgPSB7fSwgZmlsZSkgewogICAgICAgIGlmICghdGhpcy5hbGl2ZSB8fCAhdGhpcy5zdG9yZSB8fCAhdGhpcy5zbmFwc2hvdCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLov57mjqXlt7Lnu5PmnZ/vvIzor7fph43mlrDmiZPlvIDogYrlpKnjgIIiKTsKICAgICAgICBjb25zdCBjID0gdGhpcy5zbmFwc2hvdC5jb252ZXJzYXRpb25zLmZpbmQoYyA9PiBjLmlkID09PSBjb252ZXJzYXRpb24pOwogICAgICAgIGlmICghYyB8fCBjb250ZW50Lmxlbmd0aCA+IDQwMDAgfHwgIWNvbnRlbnQudHJpbSgpKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuivt+mAieaLqeS8muivne+8jOa2iOaBr+S4jeiDvei2hei/hyA0MDAwIOS4quWtl+OAgiIpOwogICAgICAgIGNvbnN0IHJlY2lwaWVudHMgPSBjLnBhcnRpY2lwYW50cy5tYXAocCA9PiBwLnVzZXJfaWQpLmZpbHRlcihpZCA9PiBpZCAhPT0gdGhpcy5zdG9yZS5hY2NvdW50KTsKICAgICAgICBpZiAoIXJlY2lwaWVudHMubGVuZ3RoIHx8IERhdGUubm93KCkgLSB0aGlzLmF1dGhlbnRpY2F0ZWRBdCA+IDEyMDAwMCkKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLor7fph43mlrDov57mjqXotKblj7flkI7lj5HpgIHjgIIiKTsKICAgICAgICBjb25zdCBpZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7CiAgICAgICAgaWYgKGZpbGUpIHsKICAgICAgICAgICAgaWYgKCFmaWxlLnNpemUgfHwgZmlsZS5zaXplID4gTUFYX0ZJTEUpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuaWh+S7tuWkp+Wwj+mcgOWcqCAxIOWtl+iKguiHsyAyNSBNQiDkuYvpl7TjgIIiKTsKICAgICAgICAgICAgbWV0YWRhdGEgPSB7IGF0dGFjaG1lbnQ6IHsgb3JpZ2luYWxfbmFtZTogZmlsZS5uYW1lLnNsaWNlKDAsIDI0MCksIHNpemU6IGZpbGUuc2l6ZSwgY29udGVudF90eXBlOiBmaWxlLnR5cGUgfHwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsIHNoYTI1NjogYXdhaXQgaGFzaChhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpIH0gfTsKICAgICAgICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zYXZlRmlsZShpZCwgZmlsZSk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IHRoaXMuc3RvcmUuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICAgICAgY29uc3QgciA9IHsgaWQ6IGF3YWl0IHRoaXMuc3RvcmUubmV4dElkKCksIGRpcmVjdF9pZDogaWQsIGNvbnZlcnNhdGlvbl9pZDogY29udmVyc2F0aW9uLCBzZW5kZXJfdXNlcl9pZDogdGhpcy5zdG9yZS5hY2NvdW50LAogICAgICAgICAgICAgICAgc2VuZGVyX25hbWU6IHRoaXMuc25hcHNob3QudXNlci5kaXNwbGF5X25hbWUsIGNvbnRlbnQsIG1lc3NhZ2VfdHlwZTogbWVzc2FnZVR5cGUsIGNyZWF0ZWRfYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgbWV0YWRhdGFfanNvbjogbWV0YWRhdGEsCiAgICAgICAgICAgICAgICByZWNpcGllbnRfaWRzOiByZWNpcGllbnRzLCBkZWxpdmVyZWRfdG86IFtdLCBpc19taW5lOiB0cnVlLCBsb2NhbF9zdGF0dXM6ICJzZW5kaW5nIiB9OwogICAgICAgICAgICBhd2FpdCB0aGlzLnN0b3JlLnNhdmUocik7CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgIH0pOwogICAgICAgIHRoaXMub3B0aW9ucy5vbkNoYW5nZT8uKCk7CiAgICAgICAgZm9yIChjb25zdCBwZWVyIG9mIEFycmF5LmZyb20odGhpcy5wZWVycy52YWx1ZXMoKSkpCiAgICAgICAgICAgIGlmIChwZWVyLnJlYWR5KQogICAgICAgICAgICAgICAgdm9pZCB0aGlzLnB1bXAocGVlcik7CiAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgIH0KICAgIGFzeW5jIG1lc3NhZ2VzKGNvbnZlcnNhdGlvbikgewogICAgICAgIGlmICghdGhpcy5zdG9yZSkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLnN0b3JlLmxpc3QoY29udmVyc2F0aW9uKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocm93cy5tYXAoYXN5bmMgKHIpID0+IHsKICAgICAgICAgICAgaWYgKHIubWVzc2FnZV90eXBlICE9PSAiZmlsZSIpCiAgICAgICAgICAgICAgICByZXR1cm4gcjsKICAgICAgICAgICAgY29uc3QgYSA9IHIubWV0YWRhdGFfanNvbi5hdHRhY2htZW50OwogICAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCB0aGlzLnN0b3JlLmZpbGVVcmwoci5kaXJlY3RfaWQsIFN0cmluZyhhLmNvbnRlbnRfdHlwZSB8fCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIikpOwogICAgICAgICAgICByZXR1cm4geyAuLi5yLCBtZXRhZGF0YV9qc29uOiB7IC4uLnIubWV0YWRhdGFfanNvbiwgYXR0YWNobWVudDogeyAuLi5hLCB1cmwgfSB9IH07CiAgICAgICAgfSkpOwogICAgfQogICAgYXN5bmMgY29udmVyc2F0aW9uVmlld3MoaXRlbXMpIHsKICAgICAgICBpZiAoIXRoaXMuc3RvcmUpCiAgICAgICAgICAgIHJldHVybiBpdGVtczsKICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGF3YWl0IHRoaXMuc3RvcmUubGlzdCgpOwogICAgICAgIHJldHVybiBQcm9taXNlLmFsbChpdGVtcy5tYXAoYXN5bmMgKGMpID0+IHsKICAgICAgICAgICAgY29uc3Qgcm93cyA9IG1lc3NhZ2VzLmZpbHRlcihyID0+IHIuY29udmVyc2F0aW9uX2lkID09PSBjLmlkKTsKICAgICAgICAgICAgY29uc3QgcmVhZCA9IGF3YWl0IHRoaXMuc3RvcmUucmVhZEF0KGMuaWQpOwogICAgICAgICAgICBjb25zdCBsYXN0ID0gcm93cy5hdCgtMSk7CiAgICAgICAgICAgIHJldHVybiB7IC4uLmMsIGxhc3RfbWVzc2FnZTogbGFzdCB8fCBudWxsLCBsYXN0X21lc3NhZ2VfYXQ6IGxhc3Q/LmNyZWF0ZWRfYXQgfHwgbnVsbCwgdW5yZWFkX2NvdW50OiByb3dzLmZpbHRlcihyID0+ICFyLmlzX21pbmUgJiYgci5pZCA+IHJlYWQpLmxlbmd0aCB9OwogICAgICAgIH0pKTsKICAgIH0KICAgIHN0YXR1cyhjb252ZXJzYXRpb24pIHsKICAgICAgICBjb25zdCBpZHMgPSB0aGlzLnNuYXBzaG90Py5jb252ZXJzYXRpb25zLmZpbmQoYyA9PiBjLmlkID09PSBjb252ZXJzYXRpb24pPy5wYXJ0aWNpcGFudHMuZmlsdGVyKHAgPT4gcC51c2VyX2lkICE9PSB0aGlzLnN0b3JlPy5hY2NvdW50KS5tYXAocCA9PiBwLnVzZXJfaWQpIHx8IFtdOwogICAgICAgIGNvbnN0IG9ubGluZSA9IGlkcy5maWx0ZXIoaWQgPT4gdGhpcy5wZWVycy5nZXQoaWQpPy5yZWFkeSkubGVuZ3RoOwogICAgICAgIHJldHVybiBvbmxpbmUgPT09IGlkcy5sZW5ndGggJiYgb25saW5lID4gMCA/ICLorr7lpIflt7Lnm7Tov54iIDogb25saW5lID4gMCA/IGAke29ubGluZX0vJHtpZHMubGVuZ3RofSDkvY3miJDlkZjlt7Lnm7Tov55gIDogIuetieW+heWvueaWueS4iue6v+aIlue9kee7nOebtOi/niI7CiAgICB9CiAgICBjbG9zZVBlZXIodWlkLCBwZWVyKSB7IHBlZXIuY2hhbm5lbD8uY2xvc2UoKTsgcGVlci5wYy5jbG9zZSgpOyB0aGlzLnBlZXJzLmRlbGV0ZSh1aWQpOyB9CiAgICBkaXNjb25uZWN0UGVlcnMoKSB7IGZvciAoY29uc3QgW3VpZCwgcGVlcl0gb2YgQXJyYXkuZnJvbSh0aGlzLnBlZXJzKSkKICAgICAgICB0aGlzLmNsb3NlUGVlcih1aWQsIHBlZXIpOyB9CiAgICBzdG9wKCkgeyB0aGlzLmFsaXZlID0gZmFsc2U7IGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTsgdGhpcy5kaXNjb25uZWN0UGVlcnMoKTsgdGhpcy5pbmJvdW5kLmNsZWFyKCk7IHRoaXMucmVsZWFzZWQ/LigpOyB0aGlzLnN0b3JlPy5jbG9zZSgpOyB9Cn0KYXN5bmMgZnVuY3Rpb24gaGFzaChkYXRhKSB7IHJldHVybiBBcnJheS5mcm9tKG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IiwgZGF0YSkpLCBiID0+IGIudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDIsICIwIikpLmpvaW4oIiIpOyB9Cg==",
      "src/storage.ts": "ZXhwb3J0IHR5cGUgQ2hhdFJlY29yZCA9IHsNCiAgaWQ6IG51bWJlcjsgZGlyZWN0X2lkOiBzdHJpbmc7IGNvbnZlcnNhdGlvbl9pZDogbnVtYmVyOyBzZW5kZXJfdXNlcl9pZDogbnVtYmVyOw0KICBzZW5kZXJfbmFtZT86IHN0cmluZzsgY29udGVudDogc3RyaW5nOyBtZXNzYWdlX3R5cGU6IHN0cmluZzsgY3JlYXRlZF9hdDogc3RyaW5nOw0KICBtZXRhZGF0YV9qc29uOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgcmVjaXBpZW50X2lkczogbnVtYmVyW107IGRlbGl2ZXJlZF90bzogbnVtYmVyW107DQogIGlzX21pbmU6IGJvb2xlYW47IGxvY2FsX3N0YXR1czogInNlbmRpbmciIHwgInNlbnQiOw0KfTsNCnR5cGUgQ2lwaGVyID0geyBpdjogQXJyYXlCdWZmZXI7IGRhdGE6IEFycmF5QnVmZmVyIH07DQpjb25zdCBieXRlcyA9IG5ldyBUZXh0RW5jb2RlcigpOw0KY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpOw0KZnVuY3Rpb24gZG9uZTxUPihyZXF1ZXN0OiBJREJSZXF1ZXN0PFQ+KTogUHJvbWlzZTxUPiB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTsgfSk7DQp9DQpmdW5jdGlvbiBjb21taXR0ZWQodHg6IElEQlRyYW5zYWN0aW9uKTogUHJvbWlzZTx2b2lkPiB7DQogIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHR4Lm9uY29tcGxldGUgPSAoKSA9PiByZXNvbHZlKCk7IHR4Lm9uYWJvcnQgPSB0eC5vbmVycm9yID0gKCkgPT4gcmVqZWN0KHR4LmVycm9yIHx8IG5ldyBFcnJvcigi5pys5py65L+d5a2Y5aSx6LSlIikpOyB9KTsNCn0NCmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlbmNyeXB0KGtleTogQ3J5cHRvS2V5LCBpbnB1dDogQXJyYXlCdWZmZXIpOiBQcm9taXNlPENpcGhlcj4gew0KICBjb25zdCBpdiA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTIpKTsNCiAgcmV0dXJuIHsgaXY6IGl2LmJ1ZmZlciwgZGF0YTogYXdhaXQgY3J5cHRvLnN1YnRsZS5lbmNyeXB0KHsgbmFtZTogIkFFUy1HQ00iLCBpdiB9LCBrZXksIGlucHV0KSB9Ow0KfQ0KYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChrZXk6IENyeXB0b0tleSwgaW5wdXQ6IENpcGhlcik6IFByb21pc2U8QXJyYXlCdWZmZXI+IHsNCiAgcmV0dXJuIGNyeXB0by5zdWJ0bGUuZGVjcnlwdCh7IG5hbWU6ICJBRVMtR0NNIiwgaXY6IGlucHV0Lml2IH0sIGtleSwgaW5wdXQuZGF0YSk7DQp9DQpleHBvcnQgY2xhc3MgTG9jYWxDaGF0U3RvcmUgew0KICBwcml2YXRlIGRiITogSURCRGF0YWJhc2U7DQogIHByaXZhdGUga2V5ITogQ3J5cHRvS2V5Ow0KICBwcml2YXRlIHNlcmlhbDogUHJvbWlzZTx1bmtub3duPiA9IFByb21pc2UucmVzb2x2ZSgpOw0KICBwcml2YXRlIHVybHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpOw0KICBjb25zdHJ1Y3RvcihyZWFkb25seSBhY2NvdW50OiBudW1iZXIpIHt9DQogIGFzeW5jIG9wZW4oKSB7DQogICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih0aGlzLmFjY291bnQpIHx8IHRoaXMuYWNjb3VudCA8PSAwIHx8ICFjcnlwdG8uc3VidGxlIHx8ICFpbmRleGVkREIpIHRocm93IG5ldyBFcnJvcigi6K+355m75b2V5bm25L2/55So5pSv5oyB5pys5Zyw5a2Y5YKo55qE5a6J5YWo5rWP6KeI5Zmo44CCIik7DQogICAgY29uc3QgcmVxdWVzdCA9IGluZGV4ZWREQi5vcGVuKGB6aHVnZS1kaXJlY3QtaW0tdjEtJHt0aGlzLmFjY291bnR9YCwgMSk7DQogICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiB7IGZvciAoY29uc3QgbmFtZSBvZiBbImtleXMiLCAibWVzc2FnZXMiLCAiZmlsZXMiLCAic3RhdGUiXSkgcmVxdWVzdC5yZXN1bHQuY3JlYXRlT2JqZWN0U3RvcmUobmFtZSk7IH07DQogICAgdGhpcy5kYiA9IGF3YWl0IGRvbmUocmVxdWVzdCk7DQogICAgdGhpcy5kYi5vbnZlcnNpb25jaGFuZ2UgPSAoKSA9PiB0aGlzLmNsb3NlKCk7DQogICAgY29uc3QgY2FuZGlkYXRlID0gYXdhaXQgY3J5cHRvLnN1YnRsZS5nZW5lcmF0ZUtleSh7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZW5jcnlwdCIsICJkZWNyeXB0Il0pOw0KICAgIGNvbnN0IHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbigia2V5cyIsICJyZWFkd3JpdGUiKTsNCiAgICBjb25zdCByZWFkeSA9IGNvbW1pdHRlZCh0eCk7DQogICAgY29uc3Qgc3RvcmUgPSB0eC5vYmplY3RTdG9yZSgia2V5cyIpOw0KICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgZG9uZShzdG9yZS5nZXQoImxvY2FsIikpOw0KICAgIHRoaXMua2V5ID0gZXhpc3RpbmcgfHwgY2FuZGlkYXRlOw0KICAgIGlmICghZXhpc3RpbmcpIHN0b3JlLnB1dChjYW5kaWRhdGUsICJsb2NhbCIpOw0KICAgIGF3YWl0IHJlYWR5Ow0KICB9DQogIHByaXZhdGUgYXN5bmMgZ2V0PFQ+KHN0b3JlOiBzdHJpbmcsIGlkOiBJREJWYWxpZEtleSk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4gew0KICAgIHJldHVybiBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oc3RvcmUpLm9iamVjdFN0b3JlKHN0b3JlKS5nZXQoaWQpKTsNCiAgfQ0KICBwcml2YXRlIGFzeW5jIHB1dChzdG9yZTogc3RyaW5nLCBpZDogSURCVmFsaWRLZXksIHZhbHVlOiB1bmtub3duKSB7DQogICAgY29uc3QgdHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKHN0b3JlLCAicmVhZHdyaXRlIik7IGNvbnN0IHJlc3VsdCA9IGNvbW1pdHRlZCh0eCk7DQogICAgdHgub2JqZWN0U3RvcmUoc3RvcmUpLnB1dCh2YWx1ZSwgaWQpOyBhd2FpdCByZXN1bHQ7DQogIH0NCiAgZXhjbHVzaXZlPFQ+KGpvYjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4gew0KICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VyaWFsLnRoZW4oam9iKTsgdGhpcy5zZXJpYWwgPSByZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTsgcmV0dXJuIHJlc3VsdDsNCiAgfQ0KICBhc3luYyBmaW5kKGlkOiBzdHJpbmcpOiBQcm9taXNlPENoYXRSZWNvcmQgfCB1bmRlZmluZWQ+IHsNCiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMuZ2V0PENpcGhlcj4oIm1lc3NhZ2VzIiwgaWQpOw0KICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgOiB1bmRlZmluZWQ7DQogIH0NCiAgYXN5bmMgc2F2ZShyZWNvcmQ6IENoYXRSZWNvcmQpIHsNCiAgICBhd2FpdCB0aGlzLnB1dCgibWVzc2FnZXMiLCByZWNvcmQuZGlyZWN0X2lkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBieXRlcy5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocmVjb3JkKSkuYnVmZmVyKSk7DQogIH0NCiAgYXN5bmMgbmV4dElkKCkgew0KICAgIGNvbnN0IG9sZCA9IGF3YWl0IHRoaXMuZ2V0PG51bWJlcj4oInN0YXRlIiwgImNvdW50ZXIiKSB8fCAwOw0KICAgIGNvbnN0IGlkID0gTWF0aC5tYXgoRGF0ZS5ub3coKSAqIDEwMDAsIG9sZCArIDEpOw0KICAgIGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsICJjb3VudGVyIiwgaWQpOyByZXR1cm4gaWQ7DQogIH0NCiAgYXN5bmMgbGlzdChjb252ZXJzYXRpb24/OiBudW1iZXIpOiBQcm9taXNlPENoYXRSZWNvcmRbXT4gew0KICAgIGNvbnN0IGFsbDogQ2lwaGVyW10gPSBhd2FpdCBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oIm1lc3NhZ2VzIikub2JqZWN0U3RvcmUoIm1lc3NhZ2VzIikuZ2V0QWxsKCkpOw0KICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChhbGwubWFwKGFzeW5jIHZhbHVlID0+IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgYXMgQ2hhdFJlY29yZCkpOw0KICAgIHJldHVybiByZWNvcmRzLmZpbHRlcihyID0+IGNvbnZlcnNhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHIuY29udmVyc2F0aW9uX2lkID09PSBjb252ZXJzYXRpb24pLnNvcnQoKGEsYikgPT4gYS5pZC1iLmlkKTsNCiAgfQ0KICBhc3luYyBzYXZlRmlsZShpZDogc3RyaW5nLCBmaWxlOiBCbG9iKSB7IGF3YWl0IHRoaXMucHV0KCJmaWxlcyIsIGlkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpKTsgfQ0KICBhc3luYyBmaWxlKGlkOiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgdW5kZWZpbmVkPiB7IGNvbnN0IGYgPSBhd2FpdCB0aGlzLmdldDxDaXBoZXI+KCJmaWxlcyIsIGlkKTsgcmV0dXJuIGYgPyBkZWNyeXB0KHRoaXMua2V5LCBmKSA6IHVuZGVmaW5lZDsgfQ0KICBhc3luYyBmaWxlVXJsKGlkOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7DQogICAgaWYgKHRoaXMudXJscy5oYXMoaWQpKSByZXR1cm4gdGhpcy51cmxzLmdldChpZCk7DQogICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmlsZShpZCk7IGlmICghZGF0YSkgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlIH0pKTsgdGhpcy51cmxzLnNldChpZCwgdXJsKTsgcmV0dXJuIHVybDsNCiAgfQ0KICBhc3luYyBtYXJrUmVhZChjb252ZXJzYXRpb246IG51bWJlcikgeyBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5saXN0KGNvbnZlcnNhdGlvbik7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIGByZWFkLSR7Y29udmVyc2F0aW9ufWAsIHJlY29yZHMuYXQoLTEpPy5pZCB8fCAwKTsgfQ0KICBhc3luYyByZWFkQXQoY29udmVyc2F0aW9uOiBudW1iZXIpIHsgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0PG51bWJlcj4oInN0YXRlIiwgYHJlYWQtJHtjb252ZXJzYXRpb259YCkgfHwgMDsgfQ0KICBhc3luYyBwZXJzaXN0UHJlZmVyZW5jZShuYW1lOiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIG5hbWUsIHZhbHVlKTsgfQ0KICBhc3luYyBwcmVmZXJlbmNlPFQ+KG5hbWU6IHN0cmluZykgeyByZXR1cm4gdGhpcy5nZXQ8VD4oInN0YXRlIiwgbmFtZSk7IH0NCiAgYXN5bmMgYmFja3VwKHBhc3NwaHJhc2U6IHN0cmluZyk6IFByb21pc2U8QmxvYj4gew0KICAgIGlmIChwYXNzcGhyYXNlLmxlbmd0aCA8IDEwKSB0aHJvdyBuZXcgRXJyb3IoIuWkh+S7veWvhueggeiHs+WwkemcgOimgSAxMCDkuKrlrZfnrKbjgIIiKTsNCiAgICBjb25zdCBzYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpOw0KICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOw0KICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KHsgbmFtZTogIlBCS0RGMiIsIHNhbHQsIGl0ZXJhdGlvbnM6IDI1MDAwMCwgaGFzaDogIlNIQS0yNTYiIH0sIGJhc2UsIHsgbmFtZTogIkFFUy1HQ00iLCBsZW5ndGg6IDI1NiB9LCBmYWxzZSwgWyJlbmNyeXB0Il0pOw0KICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmxpc3QoKTsNCiAgICBjb25zdCBmaWxlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9Ow0KICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRzLmZpbHRlcihyID0+IHIubWVzc2FnZV90eXBlID09PSAiZmlsZSIpKSB7IGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZpbGUoci5kaXJlY3RfaWQpOyBpZiAoZGF0YSkgZmlsZXNbci5kaXJlY3RfaWRdID0gdG9CYXNlNjQobmV3IFVpbnQ4QXJyYXkoZGF0YSkpOyB9DQogICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5jcnlwdChrZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDEsIGFjY291bnQ6IHRoaXMuYWNjb3VudCwgcmVjb3JkcywgZmlsZXMgfSkpLmJ1ZmZlcik7DQogICAgcmV0dXJuIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiLCBzYWx0OiB0b0Jhc2U2NChzYWx0KSwgaXY6IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KHJlc3VsdC5pdikpLCBkYXRhOiB0b0Jhc2U2NChuZXcgVWludDhBcnJheShyZXN1bHQuZGF0YSkpIH0pXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vanNvbiIgfSk7DQogIH0NCiAgYXN5bmMgcmVzdG9yZShmaWxlOiBGaWxlLCBwYXNzcGhyYXNlOiBzdHJpbmcpIHsNCiAgICBpZiAoZmlsZS5zaXplID4gMjU2ICogMTAyNCAqIDEwMjQpIHRocm93IG5ldyBFcnJvcigi5q2k5aSH5Lu96L+H5aSn77yM6K+35YiG5om55oGi5aSN44CCIik7DQogICAgdHJ5IHsNCiAgICAgIGNvbnN0IGVudmVsb3BlID0gSlNPTi5wYXJzZShhd2FpdCBmaWxlLnRleHQoKSk7DQogICAgICBpZiAoZW52ZWxvcGUuZm9ybWF0ICE9PSAiemh1Z2UtZGlyZWN0LWltLWJhY2t1cC12MSIpIHRocm93IG5ldyBFcnJvcigpOw0KICAgICAgY29uc3QgYmFzZSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJyYXciLCBieXRlcy5lbmNvZGUocGFzc3BocmFzZSksICJQQktERjIiLCBmYWxzZSwgWyJkZXJpdmVLZXkiXSk7DQogICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleSh7IG5hbWU6ICJQQktERjIiLCBzYWx0OiBmcm9tQmFzZTY0KGVudmVsb3BlLnNhbHQpLCBpdGVyYXRpb25zOiAyNTAwMDAsIGhhc2g6ICJTSEEtMjU2IiB9LCBiYXNlLCB7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZGVjcnlwdCJdKTsNCiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHRleHQuZGVjb2RlKGF3YWl0IGRlY3J5cHQoa2V5LCB7IGl2OiBmcm9tQmFzZTY0KGVudmVsb3BlLml2KS5idWZmZXIsIGRhdGE6IGZyb21CYXNlNjQoZW52ZWxvcGUuZGF0YSkuYnVmZmVyIH0pKSk7DQogICAgICBpZiAoZGF0YS52ZXJzaW9uICE9PSAxIHx8IGRhdGEuYWNjb3VudCAhPT0gdGhpcy5hY2NvdW50IHx8ICFBcnJheS5pc0FycmF5KGRhdGEucmVjb3JkcykgfHwgIWRhdGEuZmlsZXMgfHwgdHlwZW9mIGRhdGEuZmlsZXMgIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgY29uc3QgaWRlbnRpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTsKICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzIGFzIENoYXRSZWNvcmRbXSkgewogICAgICAgIGlmICghcmVjb3JkIHx8ICEvXlthLWYwLTktXXszNn0kL2kudGVzdChyZWNvcmQuZGlyZWN0X2lkKSB8fCBpZGVudGlmaWVycy5oYXMocmVjb3JkLmRpcmVjdF9pZCkKICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuY29udmVyc2F0aW9uX2lkKSB8fCByZWNvcmQuY29udmVyc2F0aW9uX2lkIDw9IDAKICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuc2VuZGVyX3VzZXJfaWQpIHx8IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA8PSAwCiAgICAgICAgICB8fCB0eXBlb2YgcmVjb3JkLmNvbnRlbnQgIT09ICJzdHJpbmciIHx8IHJlY29yZC5jb250ZW50Lmxlbmd0aCA+IDQwMDAKICAgICAgICAgIHx8ICFbInRleHQiLCJmaWxlIiwibG9jYXRpb24iLCJjYWxsIl0uaW5jbHVkZXMocmVjb3JkLm1lc3NhZ2VfdHlwZSkKICAgICAgICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShyZWNvcmQuY3JlYXRlZF9hdCkpIHx8ICFyZWNvcmQubWV0YWRhdGFfanNvbiB8fCB0eXBlb2YgcmVjb3JkLm1ldGFkYXRhX2pzb24gIT09ICJvYmplY3QiKSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICBpZGVudGlmaWVycy5hZGQocmVjb3JkLmRpcmVjdF9pZCk7CiAgICAgICAgaWYgKHJlY29yZC5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIiAmJiB0eXBlb2YgZGF0YS5maWxlc1tyZWNvcmQuZGlyZWN0X2lkXSAhPT0gInN0cmluZyIpIHRocm93IG5ldyBFcnJvcigpOwogICAgICB9CiAgICAgIC8vIFJlc3RvcmVkIG91dGdvaW5nIHJlY29yZHMgYXJlIGhpc3RvcnksIG5vdCBhIGNvbW1hbmQgdG8gc2VuZCB0byBmb3JtZXIgY29udGFjdHMgYWdhaW4uCiAgICAgIGF3YWl0IHRoaXMuZXhjbHVzaXZlKGFzeW5jICgpID0+IHsKICAgICAgICBjb25zdCBzdGFnZWQ6IHsgaWQ6IHN0cmluZzsgcmVjb3JkOiBDaXBoZXI7IGZpbGU/OiBDaXBoZXIgfVtdID0gW107CiAgICAgICAgbGV0IGNvdW50ZXIgPSBNYXRoLm1heChEYXRlLm5vdygpKjEwMDAsIChhd2FpdCB0aGlzLmdldDxudW1iZXI+KCJzdGF0ZSIsICJjb3VudGVyIikgfHwgMCkrMSk7CiAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzIGFzIENoYXRSZWNvcmRbXSkgewogICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmluZChyZWNvcmQuZGlyZWN0X2lkKSkgY29udGludWU7CiAgICAgICAgICBjb25zdCBmaWxlQnl0ZXMgPSByZWNvcmQubWVzc2FnZV90eXBlID09PSAiZmlsZSIgPyBmcm9tQmFzZTY0KGRhdGEuZmlsZXNbcmVjb3JkLmRpcmVjdF9pZF0pIDogdW5kZWZpbmVkOwogICAgICAgICAgaWYgKGZpbGVCeXRlcyAmJiBmaWxlQnl0ZXMubGVuZ3RoID4gMjUqMTAyNCoxMDI0KSB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgIGNvbnN0IHJlc3RvcmVkID0geyAuLi5yZWNvcmQsIGlkOiBjb3VudGVyKyssIGlzX21pbmU6IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA9PT0gdGhpcy5hY2NvdW50LCByZWNpcGllbnRfaWRzOiBbXSwgZGVsaXZlcmVkX3RvOiBbXSwgbG9jYWxfc3RhdHVzOiAic2VudCIgfTsKICAgICAgICAgIHN0YWdlZC5wdXNoKHtpZDpyZWNvcmQuZGlyZWN0X2lkLCByZWNvcmQ6YXdhaXQgZW5jcnlwdCh0aGlzLmtleSwgYnl0ZXMuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHJlc3RvcmVkKSkuYnVmZmVyKSwgZmlsZTpmaWxlQnl0ZXMgPyBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LGZpbGVCeXRlcy5idWZmZXIpIDogdW5kZWZpbmVkfSk7CiAgICAgICAgfQogICAgICAgIC8vIEVuY3J5cHQgYW5kIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgYmVmb3JlIG9wZW5pbmcgdGhlIHNpbmdsZSBhdG9taWMgd3JpdGUgdHJhbnNhY3Rpb24uCiAgICAgICAgY29uc3QgdHggPSB0aGlzLmRiLnRyYW5zYWN0aW9uKFsibWVzc2FnZXMiLCAiZmlsZXMiLCAic3RhdGUiXSwgInJlYWR3cml0ZSIpOwogICAgICAgIGNvbnN0IHJlYWR5ID0gY29tbWl0dGVkKHR4KTsKICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHR4Lm9iamVjdFN0b3JlKCJtZXNzYWdlcyIpOwogICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdGFnZWQpIHsKICAgICAgICAgIGlmIChhd2FpdCBkb25lKG1lc3NhZ2VzLmdldChpdGVtLmlkKSkpIGNvbnRpbnVlOwogICAgICAgICAgbWVzc2FnZXMucHV0KGl0ZW0ucmVjb3JkLGl0ZW0uaWQpOwogICAgICAgICAgaWYgKGl0ZW0uZmlsZSkgdHgub2JqZWN0U3RvcmUoImZpbGVzIikucHV0KGl0ZW0uZmlsZSxpdGVtLmlkKTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3RhdGUgPSB0eC5vYmplY3RTdG9yZSgic3RhdGUiKTsKICAgICAgICBzdGF0ZS5wdXQoTWF0aC5tYXgoY291bnRlciwgKGF3YWl0IGRvbmUoc3RhdGUuZ2V0KCJjb3VudGVyIikpKSB8fCAwKSwgImNvdW50ZXIiKTsKICAgICAgICBhd2FpdCByZWFkeTsKICAgICAgfSk7CiAgICB9IGNhdGNoIHsgdGhyb3cgbmV3IEVycm9yKCLlpIfku73lr4bnoIHjgIHmlofku7bmiJbmiYDlsZ7otKblj7fkuI3mraPnoa7vvIzmnKrmgaLlpI3or6XlpIfku73jgIIiKTsgfQ0KICB9DQogIGNsb3NlKCkgeyBmb3IgKGNvbnN0IHVybCBvZiBBcnJheS5mcm9tKHRoaXMudXJscy52YWx1ZXMoKSkpIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgdGhpcy51cmxzLmNsZWFyKCk7IHRoaXMuZGI/LmNsb3NlKCk7IH0NCn0NCmV4cG9ydCBmdW5jdGlvbiB0b0Jhc2U2NChkYXRhOiBVaW50OEFycmF5KTogc3RyaW5nIHsNCiAgbGV0IHJlc3VsdCA9ICIiOyBmb3IgKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz04MTkyKSByZXN1bHQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSguLi5BcnJheS5mcm9tKGRhdGEuc3ViYXJyYXkoaSxpKzgxOTIpKSk7IHJldHVybiBidG9hKHJlc3VsdCk7DQp9DQpleHBvcnQgZnVuY3Rpb24gZnJvbUJhc2U2NCh2YWx1ZTogc3RyaW5nKTogVWludDhBcnJheTxBcnJheUJ1ZmZlcj4geyByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IodmFsdWUpLCBjID0+IGMuY2hhckNvZGVBdCgwKSk7IH0NCg==",
      "src/storage.js": "Y29uc3QgYnl0ZXMgPSBuZXcgVGV4dEVuY29kZXIoKTsKY29uc3QgdGV4dCA9IG5ldyBUZXh0RGVjb2RlcigpOwpmdW5jdGlvbiBkb25lKHJlcXVlc3QpIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7IHJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4gcmVzb2x2ZShyZXF1ZXN0LnJlc3VsdCk7IHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHJlamVjdChyZXF1ZXN0LmVycm9yKTsgfSk7Cn0KZnVuY3Rpb24gY29tbWl0dGVkKHR4KSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4geyB0eC5vbmNvbXBsZXRlID0gKCkgPT4gcmVzb2x2ZSgpOyB0eC5vbmFib3J0ID0gdHgub25lcnJvciA9ICgpID0+IHJlamVjdCh0eC5lcnJvciB8fCBuZXcgRXJyb3IoIuacrOacuuS/neWtmOWksei0pSIpKTsgfSk7Cn0KZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHQoa2V5LCBpbnB1dCkgewogICAgY29uc3QgaXYgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEyKSk7CiAgICByZXR1cm4geyBpdjogaXYuYnVmZmVyLCBkYXRhOiBhd2FpdCBjcnlwdG8uc3VidGxlLmVuY3J5cHQoeyBuYW1lOiAiQUVTLUdDTSIsIGl2IH0sIGtleSwgaW5wdXQpIH07Cn0KYXN5bmMgZnVuY3Rpb24gZGVjcnlwdChrZXksIGlucHV0KSB7CiAgICByZXR1cm4gY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHsgbmFtZTogIkFFUy1HQ00iLCBpdjogaW5wdXQuaXYgfSwga2V5LCBpbnB1dC5kYXRhKTsKfQpleHBvcnQgY2xhc3MgTG9jYWxDaGF0U3RvcmUgewogICAgYWNjb3VudDsKICAgIGRiOwogICAga2V5OwogICAgc2VyaWFsID0gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB1cmxzID0gbmV3IE1hcCgpOwogICAgY29uc3RydWN0b3IoYWNjb3VudCkgewogICAgICAgIHRoaXMuYWNjb3VudCA9IGFjY291bnQ7CiAgICB9CiAgICBhc3luYyBvcGVuKCkgewogICAgICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIodGhpcy5hY2NvdW50KSB8fCB0aGlzLmFjY291bnQgPD0gMCB8fCAhY3J5cHRvLnN1YnRsZSB8fCAhaW5kZXhlZERCKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuivt+eZu+W9leW5tuS9v+eUqOaUr+aMgeacrOWcsOWtmOWCqOeahOWuieWFqOa1j+iniOWZqOOAgiIpOwogICAgICAgIGNvbnN0IHJlcXVlc3QgPSBpbmRleGVkREIub3Blbihgemh1Z2UtZGlyZWN0LWltLXYxLSR7dGhpcy5hY2NvdW50fWAsIDEpOwogICAgICAgIHJlcXVlc3Qub251cGdyYWRlbmVlZGVkID0gKCkgPT4geyBmb3IgKGNvbnN0IG5hbWUgb2YgWyJrZXlzIiwgIm1lc3NhZ2VzIiwgImZpbGVzIiwgInN0YXRlIl0pCiAgICAgICAgICAgIHJlcXVlc3QucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKG5hbWUpOyB9OwogICAgICAgIHRoaXMuZGIgPSBhd2FpdCBkb25lKHJlcXVlc3QpOwogICAgICAgIHRoaXMuZGIub252ZXJzaW9uY2hhbmdlID0gKCkgPT4gdGhpcy5jbG9zZSgpOwogICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoeyBuYW1lOiAiQUVTLUdDTSIsIGxlbmd0aDogMjU2IH0sIGZhbHNlLCBbImVuY3J5cHQiLCAiZGVjcnlwdCJdKTsKICAgICAgICBjb25zdCB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24oImtleXMiLCAicmVhZHdyaXRlIik7CiAgICAgICAgY29uc3QgcmVhZHkgPSBjb21taXR0ZWQodHgpOwogICAgICAgIGNvbnN0IHN0b3JlID0gdHgub2JqZWN0U3RvcmUoImtleXMiKTsKICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IGRvbmUoc3RvcmUuZ2V0KCJsb2NhbCIpKTsKICAgICAgICB0aGlzLmtleSA9IGV4aXN0aW5nIHx8IGNhbmRpZGF0ZTsKICAgICAgICBpZiAoIWV4aXN0aW5nKQogICAgICAgICAgICBzdG9yZS5wdXQoY2FuZGlkYXRlLCAibG9jYWwiKTsKICAgICAgICBhd2FpdCByZWFkeTsKICAgIH0KICAgIGFzeW5jIGdldChzdG9yZSwgaWQpIHsKICAgICAgICByZXR1cm4gZG9uZSh0aGlzLmRiLnRyYW5zYWN0aW9uKHN0b3JlKS5vYmplY3RTdG9yZShzdG9yZSkuZ2V0KGlkKSk7CiAgICB9CiAgICBhc3luYyBwdXQoc3RvcmUsIGlkLCB2YWx1ZSkgewogICAgICAgIGNvbnN0IHR4ID0gdGhpcy5kYi50cmFuc2FjdGlvbihzdG9yZSwgInJlYWR3cml0ZSIpOwogICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbW1pdHRlZCh0eCk7CiAgICAgICAgdHgub2JqZWN0U3RvcmUoc3RvcmUpLnB1dCh2YWx1ZSwgaWQpOwogICAgICAgIGF3YWl0IHJlc3VsdDsKICAgIH0KICAgIGV4Y2x1c2l2ZShqb2IpIHsKICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlcmlhbC50aGVuKGpvYik7CiAgICAgICAgdGhpcy5zZXJpYWwgPSByZXN1bHQuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgYXN5bmMgZmluZChpZCkgewogICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdGhpcy5nZXQoIm1lc3NhZ2VzIiwgaWQpOwogICAgICAgIHJldHVybiB2YWx1ZSA/IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdCh0aGlzLmtleSwgdmFsdWUpKSkgOiB1bmRlZmluZWQ7CiAgICB9CiAgICBhc3luYyBzYXZlKHJlY29yZCkgewogICAgICAgIGF3YWl0IHRoaXMucHV0KCJtZXNzYWdlcyIsIHJlY29yZC5kaXJlY3RfaWQsIGF3YWl0IGVuY3J5cHQodGhpcy5rZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeShyZWNvcmQpKS5idWZmZXIpKTsKICAgIH0KICAgIGFzeW5jIG5leHRJZCgpIHsKICAgICAgICBjb25zdCBvbGQgPSBhd2FpdCB0aGlzLmdldCgic3RhdGUiLCAiY291bnRlciIpIHx8IDA7CiAgICAgICAgY29uc3QgaWQgPSBNYXRoLm1heChEYXRlLm5vdygpICogMTAwMCwgb2xkICsgMSk7CiAgICAgICAgYXdhaXQgdGhpcy5wdXQoInN0YXRlIiwgImNvdW50ZXIiLCBpZCk7CiAgICAgICAgcmV0dXJuIGlkOwogICAgfQogICAgYXN5bmMgbGlzdChjb252ZXJzYXRpb24pIHsKICAgICAgICBjb25zdCBhbGwgPSBhd2FpdCBkb25lKHRoaXMuZGIudHJhbnNhY3Rpb24oIm1lc3NhZ2VzIikub2JqZWN0U3RvcmUoIm1lc3NhZ2VzIikuZ2V0QWxsKCkpOwogICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBQcm9taXNlLmFsbChhbGwubWFwKGFzeW5jICh2YWx1ZSkgPT4gSlNPTi5wYXJzZSh0ZXh0LmRlY29kZShhd2FpdCBkZWNyeXB0KHRoaXMua2V5LCB2YWx1ZSkpKSkpOwogICAgICAgIHJldHVybiByZWNvcmRzLmZpbHRlcihyID0+IGNvbnZlcnNhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHIuY29udmVyc2F0aW9uX2lkID09PSBjb252ZXJzYXRpb24pLnNvcnQoKGEsIGIpID0+IGEuaWQgLSBiLmlkKTsKICAgIH0KICAgIGFzeW5jIHNhdmVGaWxlKGlkLCBmaWxlKSB7IGF3YWl0IHRoaXMucHV0KCJmaWxlcyIsIGlkLCBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBhd2FpdCBmaWxlLmFycmF5QnVmZmVyKCkpKTsgfQogICAgYXN5bmMgZmlsZShpZCkgeyBjb25zdCBmID0gYXdhaXQgdGhpcy5nZXQoImZpbGVzIiwgaWQpOyByZXR1cm4gZiA/IGRlY3J5cHQodGhpcy5rZXksIGYpIDogdW5kZWZpbmVkOyB9CiAgICBhc3luYyBmaWxlVXJsKGlkLCB0eXBlKSB7CiAgICAgICAgaWYgKHRoaXMudXJscy5oYXMoaWQpKQogICAgICAgICAgICByZXR1cm4gdGhpcy51cmxzLmdldChpZCk7CiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmlsZShpZCk7CiAgICAgICAgaWYgKCFkYXRhKQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIGNvbnN0IHVybCA9IFVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2RhdGFdLCB7IHR5cGUgfSkpOwogICAgICAgIHRoaXMudXJscy5zZXQoaWQsIHVybCk7CiAgICAgICAgcmV0dXJuIHVybDsKICAgIH0KICAgIGFzeW5jIG1hcmtSZWFkKGNvbnZlcnNhdGlvbikgeyBjb25zdCByZWNvcmRzID0gYXdhaXQgdGhpcy5saXN0KGNvbnZlcnNhdGlvbik7IGF3YWl0IHRoaXMucHV0KCJzdGF0ZSIsIGByZWFkLSR7Y29udmVyc2F0aW9ufWAsIHJlY29yZHMuYXQoLTEpPy5pZCB8fCAwKTsgfQogICAgYXN5bmMgcmVhZEF0KGNvbnZlcnNhdGlvbikgeyByZXR1cm4gYXdhaXQgdGhpcy5nZXQoInN0YXRlIiwgYHJlYWQtJHtjb252ZXJzYXRpb259YCkgfHwgMDsgfQogICAgYXN5bmMgcGVyc2lzdFByZWZlcmVuY2UobmFtZSwgdmFsdWUpIHsgYXdhaXQgdGhpcy5wdXQoInN0YXRlIiwgbmFtZSwgdmFsdWUpOyB9CiAgICBhc3luYyBwcmVmZXJlbmNlKG5hbWUpIHsgcmV0dXJuIHRoaXMuZ2V0KCJzdGF0ZSIsIG5hbWUpOyB9CiAgICBhc3luYyBiYWNrdXAocGFzc3BocmFzZSkgewogICAgICAgIGlmIChwYXNzcGhyYXNlLmxlbmd0aCA8IDEwKQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIuWkh+S7veWvhueggeiHs+WwkemcgOimgSAxMCDkuKrlrZfnrKbjgIIiKTsKICAgICAgICBjb25zdCBzYWx0ID0gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheSgxNikpOwogICAgICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOwogICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGVyaXZlS2V5KHsgbmFtZTogIlBCS0RGMiIsIHNhbHQsIGl0ZXJhdGlvbnM6IDI1MDAwMCwgaGFzaDogIlNIQS0yNTYiIH0sIGJhc2UsIHsgbmFtZTogIkFFUy1HQ00iLCBsZW5ndGg6IDI1NiB9LCBmYWxzZSwgWyJlbmNyeXB0Il0pOwogICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCB0aGlzLmxpc3QoKTsKICAgICAgICBjb25zdCBmaWxlcyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRzLmZpbHRlcihyID0+IHIubWVzc2FnZV90eXBlID09PSAiZmlsZSIpKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZpbGUoci5kaXJlY3RfaWQpOwogICAgICAgICAgICBpZiAoZGF0YSkKICAgICAgICAgICAgICAgIGZpbGVzW3IuZGlyZWN0X2lkXSA9IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KGRhdGEpKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZW5jcnlwdChrZXksIGJ5dGVzLmVuY29kZShKU09OLnN0cmluZ2lmeSh7IHZlcnNpb246IDEsIGFjY291bnQ6IHRoaXMuYWNjb3VudCwgcmVjb3JkcywgZmlsZXMgfSkpLmJ1ZmZlcik7CiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh7IGZvcm1hdDogInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiLCBzYWx0OiB0b0Jhc2U2NChzYWx0KSwgaXY6IHRvQmFzZTY0KG5ldyBVaW50OEFycmF5KHJlc3VsdC5pdikpLCBkYXRhOiB0b0Jhc2U2NChuZXcgVWludDhBcnJheShyZXN1bHQuZGF0YSkpIH0pXSwgeyB0eXBlOiAiYXBwbGljYXRpb24vanNvbiIgfSk7CiAgICB9CiAgICBhc3luYyByZXN0b3JlKGZpbGUsIHBhc3NwaHJhc2UpIHsKICAgICAgICBpZiAoZmlsZS5zaXplID4gMjU2ICogMTAyNCAqIDEwMjQpCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi5q2k5aSH5Lu96L+H5aSn77yM6K+35YiG5om55oGi5aSN44CCIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgZW52ZWxvcGUgPSBKU09OLnBhcnNlKGF3YWl0IGZpbGUudGV4dCgpKTsKICAgICAgICAgICAgaWYgKGVudmVsb3BlLmZvcm1hdCAhPT0gInpodWdlLWRpcmVjdC1pbS1iYWNrdXAtdjEiKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmltcG9ydEtleSgicmF3IiwgYnl0ZXMuZW5jb2RlKHBhc3NwaHJhc2UpLCAiUEJLREYyIiwgZmFsc2UsIFsiZGVyaXZlS2V5Il0pOwogICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRlcml2ZUtleSh7IG5hbWU6ICJQQktERjIiLCBzYWx0OiBmcm9tQmFzZTY0KGVudmVsb3BlLnNhbHQpLCBpdGVyYXRpb25zOiAyNTAwMDAsIGhhc2g6ICJTSEEtMjU2IiB9LCBiYXNlLCB7IG5hbWU6ICJBRVMtR0NNIiwgbGVuZ3RoOiAyNTYgfSwgZmFsc2UsIFsiZGVjcnlwdCJdKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UodGV4dC5kZWNvZGUoYXdhaXQgZGVjcnlwdChrZXksIHsgaXY6IGZyb21CYXNlNjQoZW52ZWxvcGUuaXYpLmJ1ZmZlciwgZGF0YTogZnJvbUJhc2U2NChlbnZlbG9wZS5kYXRhKS5idWZmZXIgfSkpKTsKICAgICAgICAgICAgaWYgKGRhdGEudmVyc2lvbiAhPT0gMSB8fCBkYXRhLmFjY291bnQgIT09IHRoaXMuYWNjb3VudCB8fCAhQXJyYXkuaXNBcnJheShkYXRhLnJlY29yZHMpIHx8ICFkYXRhLmZpbGVzIHx8IHR5cGVvZiBkYXRhLmZpbGVzICE9PSAib2JqZWN0IikKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICBjb25zdCBpZGVudGlmaWVycyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIXJlY29yZCB8fCAhL15bYS1mMC05LV17MzZ9JC9pLnRlc3QocmVjb3JkLmRpcmVjdF9pZCkgfHwgaWRlbnRpZmllcnMuaGFzKHJlY29yZC5kaXJlY3RfaWQpCiAgICAgICAgICAgICAgICAgICAgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKHJlY29yZC5jb252ZXJzYXRpb25faWQpIHx8IHJlY29yZC5jb252ZXJzYXRpb25faWQgPD0gMAogICAgICAgICAgICAgICAgICAgIHx8ICFOdW1iZXIuaXNTYWZlSW50ZWdlcihyZWNvcmQuc2VuZGVyX3VzZXJfaWQpIHx8IHJlY29yZC5zZW5kZXJfdXNlcl9pZCA8PSAwCiAgICAgICAgICAgICAgICAgICAgfHwgdHlwZW9mIHJlY29yZC5jb250ZW50ICE9PSAic3RyaW5nIiB8fCByZWNvcmQuY29udGVudC5sZW5ndGggPiA0MDAwCiAgICAgICAgICAgICAgICAgICAgfHwgIVsidGV4dCIsICJmaWxlIiwgImxvY2F0aW9uIiwgImNhbGwiXS5pbmNsdWRlcyhyZWNvcmQubWVzc2FnZV90eXBlKQogICAgICAgICAgICAgICAgICAgIHx8ICFOdW1iZXIuaXNGaW5pdGUoRGF0ZS5wYXJzZShyZWNvcmQuY3JlYXRlZF9hdCkpIHx8ICFyZWNvcmQubWV0YWRhdGFfanNvbiB8fCB0eXBlb2YgcmVjb3JkLm1ldGFkYXRhX2pzb24gIT09ICJvYmplY3QiKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpOwogICAgICAgICAgICAgICAgaWRlbnRpZmllcnMuYWRkKHJlY29yZC5kaXJlY3RfaWQpOwogICAgICAgICAgICAgICAgaWYgKHJlY29yZC5tZXNzYWdlX3R5cGUgPT09ICJmaWxlIiAmJiB0eXBlb2YgZGF0YS5maWxlc1tyZWNvcmQuZGlyZWN0X2lkXSAhPT0gInN0cmluZyIpCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzdG9yZWQgb3V0Z29pbmcgcmVjb3JkcyBhcmUgaGlzdG9yeSwgbm90IGEgY29tbWFuZCB0byBzZW5kIHRvIGZvcm1lciBjb250YWN0cyBhZ2Fpbi4KICAgICAgICAgICAgYXdhaXQgdGhpcy5leGNsdXNpdmUoYXN5bmMgKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgc3RhZ2VkID0gW107CiAgICAgICAgICAgICAgICBsZXQgY291bnRlciA9IE1hdGgubWF4KERhdGUubm93KCkgKiAxMDAwLCAoYXdhaXQgdGhpcy5nZXQoInN0YXRlIiwgImNvdW50ZXIiKSB8fCAwKSArIDEpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YS5yZWNvcmRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF3YWl0IHRoaXMuZmluZChyZWNvcmQuZGlyZWN0X2lkKSkKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZUJ5dGVzID0gcmVjb3JkLm1lc3NhZ2VfdHlwZSA9PT0gImZpbGUiID8gZnJvbUJhc2U2NChkYXRhLmZpbGVzW3JlY29yZC5kaXJlY3RfaWRdKSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZUJ5dGVzICYmIGZpbGVCeXRlcy5sZW5ndGggPiAyNSAqIDEwMjQgKiAxMDI0KQogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN0b3JlZCA9IHsgLi4ucmVjb3JkLCBpZDogY291bnRlcisrLCBpc19taW5lOiByZWNvcmQuc2VuZGVyX3VzZXJfaWQgPT09IHRoaXMuYWNjb3VudCwgcmVjaXBpZW50X2lkczogW10sIGRlbGl2ZXJlZF90bzogW10sIGxvY2FsX3N0YXR1czogInNlbnQiIH07CiAgICAgICAgICAgICAgICAgICAgc3RhZ2VkLnB1c2goeyBpZDogcmVjb3JkLmRpcmVjdF9pZCwgcmVjb3JkOiBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBieXRlcy5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocmVzdG9yZWQpKS5idWZmZXIpLCBmaWxlOiBmaWxlQnl0ZXMgPyBhd2FpdCBlbmNyeXB0KHRoaXMua2V5LCBmaWxlQnl0ZXMuYnVmZmVyKSA6IHVuZGVmaW5lZCB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEVuY3J5cHQgYW5kIHZhbGlkYXRlIGV2ZXJ5dGhpbmcgYmVmb3JlIG9wZW5pbmcgdGhlIHNpbmdsZSBhdG9taWMgd3JpdGUgdHJhbnNhY3Rpb24uCiAgICAgICAgICAgICAgICBjb25zdCB0eCA9IHRoaXMuZGIudHJhbnNhY3Rpb24oWyJtZXNzYWdlcyIsICJmaWxlcyIsICJzdGF0ZSJdLCAicmVhZHdyaXRlIik7CiAgICAgICAgICAgICAgICBjb25zdCByZWFkeSA9IGNvbW1pdHRlZCh0eCk7CiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHR4Lm9iamVjdFN0b3JlKCJtZXNzYWdlcyIpOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHN0YWdlZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChhd2FpdCBkb25lKG1lc3NhZ2VzLmdldChpdGVtLmlkKSkpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1dChpdGVtLnJlY29yZCwgaXRlbS5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZmlsZSkKICAgICAgICAgICAgICAgICAgICAgICAgdHgub2JqZWN0U3RvcmUoImZpbGVzIikucHV0KGl0ZW0uZmlsZSwgaXRlbS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHR4Lm9iamVjdFN0b3JlKCJzdGF0ZSIpOwogICAgICAgICAgICAgICAgc3RhdGUucHV0KE1hdGgubWF4KGNvdW50ZXIsIChhd2FpdCBkb25lKHN0YXRlLmdldCgiY291bnRlciIpKSkgfHwgMCksICJjb3VudGVyIik7CiAgICAgICAgICAgICAgICBhd2FpdCByZWFkeTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCLlpIfku73lr4bnoIHjgIHmlofku7bmiJbmiYDlsZ7otKblj7fkuI3mraPnoa7vvIzmnKrmgaLlpI3or6XlpIfku73jgIIiKTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSgpIHsgZm9yIChjb25zdCB1cmwgb2YgQXJyYXkuZnJvbSh0aGlzLnVybHMudmFsdWVzKCkpKQogICAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTsgdGhpcy51cmxzLmNsZWFyKCk7IHRoaXMuZGI/LmNsb3NlKCk7IH0KfQpleHBvcnQgZnVuY3Rpb24gdG9CYXNlNjQoZGF0YSkgewogICAgbGV0IHJlc3VsdCA9ICIiOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArPSA4MTkyKQogICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLkFycmF5LmZyb20oZGF0YS5zdWJhcnJheShpLCBpICsgODE5MikpKTsKICAgIHJldHVybiBidG9hKHJlc3VsdCk7Cn0KZXhwb3J0IGZ1bmN0aW9uIGZyb21CYXNlNjQodmFsdWUpIHsgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhdG9iKHZhbHVlKSwgYyA9PiBjLmNoYXJDb2RlQXQoMCkpOyB9Cg=="
    }
  },
  "signature": "eiqKthmMNmaZXELnOTj3ZCZ/iFu5fgdLbeF0gxzaN3YDF/GMll9YgCCDY/qJluKj6AslPD8vkbhmDmcVOS2k8DdNm9aX/Wr7ZnrscNdflkMnPKn8iDDa2y0cSXT3iAdbKi6pzCsDrILc6W64wG4vbGOpf0jcj0uM8ir8oaN5OfKsm/h+DCgF9iv2PIexBrEZ3B2AcUB9Cdu0VMw4r5Y0rLnK7luHsNJc8AUFjhyXfk7pqeb7uYauXrJqKYyrQNJGvMdhDwYdXvnlmT/9qQC+jNvdOMkICONJWdUeX46mNJZqXoACsO+0M975/lod13j4aO6Sg6j+j94JaRjJLQomw6cVDWpqM1VJ40WPwjNDDLesSk0YcFv0Sr7UGSkBi0TvSXl4lcbki5PbzCcNYzhs8eIMlcoG5659pq4miuh598qw9HD/lyW4WpYF8DDnsy3F99ZMICODvdP0UIEOI4UyUnRzMc/f+cmpN1pZZBhJ07jRZR16muLrvFZj/O+Jp/0r"
}